ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDQyZmEwZDUuLmY0YzBiMDkgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjIsNyArMjIsNiBAQAogKi5sc3QKICouc3ltdHlwZXMKICoub3JkZXIKLW1vZHVsZXMuYnVpbHRpbgogKi5lbGYKICouYmluCiAqLmd6CkBAIC0zMyw2ICszMiw4IEBACiAqLmx6bwogKi5wYXRjaAogKi5nY25vCittb2R1bGVzLmJ1aWx0aW4KK01vZHVsZS5zeW12ZXJzCiAKICMKICMgVG9wLWxldmVsIGdlbmVyaWMgZmlsZXMKQEAgLTQ0LDcgKzQ1LDYgQEAKIC92bWxpbnV6CiAvU3lzdGVtLm1hcAogL01vZHVsZS5tYXJrZXJzCi0vTW9kdWxlLnN5bXZlcnMKIAogIwogIyBEZWJpYW4gZGlyZWN0b3J5IChtYWtlIGRlYi1wa2cpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbmV0CmluZGV4IGQ5MjIwNjBlLi40MTZjNWQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldApAQCAtMTY5LDYgKzE2OSwxNCBAQAogCQkidW5rbm93biIsICJub3RwcmVzZW50IiwgImRvd24iLCAibG93ZXJsYXllcmRvd24iLCAidGVzdGluZyIsCiAJCSJkb3JtYW50IiwgInVwIi4KIAorV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vcGh5c19wb3J0X2lkCitEYXRlOgkJSnVseSAyMDEzCitLZXJuZWxWZXJzaW9uOgkzLjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBpbnRlcmZhY2UgdW5pcXVlIHBoeXNpY2FsIHBvcnQgaWRlbnRpZmllciB3aXRoaW4KKwkJdGhlIE5JQywgYXMgYSBzdHJpbmcuCisKIFdoYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L3NwZWVkCiBEYXRlOgkJT2N0b2JlciAyMDA5CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbmV0LWNkY19uY20gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldC1jZGNfbmNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWRmNzJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtY2RjX25jbQpAQCAtMCwwICsxLDE0OSBAQAorV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vY2RjX25jbS9taW5fdHhfcGt0CitEYXRlOgkJTWF5IDIwMTQKK0tlcm5lbFZlcnNpb246CTMuMTYKK0NvbnRhY3Q6CUJqw7hybiBNb3JrIDxiam9ybkBtb3JrLm5vPgorRGVzY3JpcHRpb246CisJCVRoZSBkcml2ZXIgd2lsbCBwYWQgTkNNIFRyYW5zZmVyIEJsb2NrcyAoTlRCcykgbG9uZ2VyCisJCXRoYW4gdGhpcyB0byB0eF9tYXgsIGFsbG93aW5nIHRoZSBkZXZpY2UgdG8gcmVjZWl2ZQorCQl0eF9tYXggc2l6ZWQgZnJhbWVzIHdpdGggbm8gdGVybWluYXRpbmcgc2hvcnQKKwkJcGFja2V0LiBOVEJzIHNob3J0ZXIgdGhhbiB0aGlzIGxpbWl0IGFyZSB0cmFuc21pdHRlZAorCQlhcy1pcywgd2l0aG91dCBhbnkgcGFkZGluZywgYW5kIGFyZSB0ZXJtaW5hdGVkIHdpdGggYQorCQlzaG9ydCBVU0IgcGFja2V0LgorCisJCVBhZGRpbmcgdG8gdHhfbWF4IGFsbG93cyB0aGUgZHJpdmVyIHRvIHRyYW5zbWl0IE5UQnMKKwkJYmFjay10by1iYWNrIHdpdGhvdXQgYW55IGludGVybGVhdmluZyBzaG9ydCBVU0IKKwkJcGFja2V0cy4gIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHNob3J0IHBhY2tldAorCQlpbnRlcnJ1cHRzIGluIHRoZSBkZXZpY2UsIGFuZCByZXByZXNlbnRzIGEgdHJhZGVvZmYKKwkJYmV0d2VlbiBVU0IgYnVzIGJhbmR3aWR0aCBhbmQgZGV2aWNlIERNQSBvcHRpbWl6YXRpb24uCisKKwkJU2V0IHRvIDAgdG8gcGFkIGFsbCBmcmFtZXMuIFNldCBncmVhdGVyIHRoYW4gdHhfbWF4IHRvCisJCWRpc2FibGUgYWxsIHBhZGRpbmcuCisKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L2NkY19uY20vcnhfbWF4CitEYXRlOgkJTWF5IDIwMTQKK0tlcm5lbFZlcnNpb246CTMuMTYKK0NvbnRhY3Q6CUJqw7hybiBNb3JrIDxiam9ybkBtb3JrLm5vPgorRGVzY3JpcHRpb246CisJCVRoZSBtYXhpbXVtIE5UQiBzaXplIGZvciBSWC4gIENhbm5vdCBleGNlZWQgdGhlCisJCW1heGltdW0gdmFsdWUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIE11c3QgYWxsb3cgYXQKKwkJbGVhc3Qgb25lIG1heCBzaXplZCBkYXRhZ3JhbSBwbHVzIGhlYWRlcnMuCisKKwkJVGhlIGFjdHVhbCBsaW1pdHMgYXJlIGRldmljZSBkZXBlbmRlbnQuICBTZWUKKwkJZHdOdGJJbk1heFNpemUuCisKKwkJTm90ZTogU29tZSBkZXZpY2VzIHdpbGwgc2lsZW50bHkgaWdub3JlIGNoYW5nZXMgdG8KKwkJdGhpcyB2YWx1ZSwgcmVzdWx0aW5nIGluIG92ZXJzaXplZCBOVEJzIGFuZAorCQljb3JyZXNwb25kaW5nIGZyYW1pbmcgZXJyb3JzLgorCitXaGF0OgkJL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9jZGNfbmNtL3R4X21heAorRGF0ZToJCU1heSAyMDE0CitLZXJuZWxWZXJzaW9uOgkzLjE2CitDb250YWN0OglCasO4cm4gTW9yayA8Ympvcm5AbW9yay5ubz4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgbWF4aW11bSBOVEIgc2l6ZSBmb3IgVFguICBDYW5ub3QgZXhjZWVkIHRoZQorCQltYXhpbXVtIHZhbHVlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLiAgTXVzdCBhbGxvdyBhdAorCQlsZWFzdCBvbmUgbWF4IHNpemVkIGRhdGFncmFtIHBsdXMgaGVhZGVycy4KKworCQlUaGUgYWN0dWFsIGxpbWl0cyBhcmUgZGV2aWNlIGRlcGVuZGVudC4gIFNlZQorCQlkd050Yk91dE1heFNpemUuCisKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L2NkY19uY20vdHhfdGltZXJfdXNlY3MKK0RhdGU6CQlNYXkgMjAxNAorS2VybmVsVmVyc2lvbjoJMy4xNgorQ29udGFjdDoJQmrDuHJuIE1vcmsgPGJqb3JuQG1vcmsubm8+CitEZXNjcmlwdGlvbjoKKwkJRGF0YWdyYW0gYWdncmVnYXRpb24gdGltZW91dCBpbiDCtXMuIFRoZSBkcml2ZXIgd2lsbAorCQl3YWl0IHVwIHRvIDMgdGltZXMgdGhpcyB0aW1lb3V0IGZvciBtb3JlIGRhdGFncmFtcyB0bworCQlhZ2dyZWdhdGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbiBOVEIgZnJhbWUuCisKKwkJVmFsaWQgcmFuZ2U6IDUgdG8gNDAwMDAwMAorCisJCVNldCB0byAwIHRvIGRpc2FibGUgYWdncmVnYXRpb24uCisKK1RoZSBmb2xsb3dpbmcgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgYWxsIHJlcHJlc2VudCBmaWVsZHMgb2YgdGhlCitzdHJ1Y3R1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4xICJHZXROdGJQYXJhbWV0ZXJzIiBvZiAiVW5pdmVyc2FsCitTZXJpYWwgQnVzIENvbW11bmljYXRpb25zIENsYXNzIFN1YmNsYXNzIFNwZWNpZmljYXRpb25zIGZvciBOZXR3b3JrCitDb250cm9sIE1vZGVsIERldmljZXMiIChDREMgTkNNKSwgUmV2aXNpb24gMS4wIChFcnJhdGEgMSksIE5vdmVtYmVyCisyNCwgMjAxMCBmcm9tIFVTQiBJbXBsZW1lbnRlcnMgRm9ydW0sIEluYy4gIFRoZSBkZXNjcmlwdGlvbnMgYXJlCitxdW90ZWQgZnJvbSB0YWJsZSA2LTMgb2YgQ0RDIE5DTTogIk5UQiBQYXJhbWV0ZXIgU3RydWN0dXJlIi4KKworV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vY2RjX25jbS9ibU50YkZvcm1hdHNTdXBwb3J0ZWQKK0RhdGU6CQlNYXkgMjAxNAorS2VybmVsVmVyc2lvbjoJMy4xNgorQ29udGFjdDoJQmrDuHJuIE1vcmsgPGJqb3JuQG1vcmsubm8+CitEZXNjcmlwdGlvbjoKKwkJQml0IDA6IDE2LWJpdCBOVEIgc3VwcG9ydGVkIChzZXQgdG8gMSkKKwkJQml0IDE6IDMyLWJpdCBOVEIgc3VwcG9ydGVkCisJCUJpdHMgMiDigJMgMTU6IHJlc2VydmVkIChyZXNldCB0byB6ZXJvOyBtdXN0IGJlIGlnbm9yZWQgYnkgaG9zdCkKKworV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vY2RjX25jbS9kd050YkluTWF4U2l6ZQorRGF0ZToJCU1heSAyMDE0CitLZXJuZWxWZXJzaW9uOgkzLjE2CitDb250YWN0OglCasO4cm4gTW9yayA8Ympvcm5AbW9yay5ubz4KK0Rlc2NyaXB0aW9uOgorCQlJTiBOVEIgTWF4aW11bSBTaXplIGluIGJ5dGVzCisKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L2NkY19uY20vd05kcEluRGl2aXNvcgorRGF0ZToJCU1heSAyMDE0CitLZXJuZWxWZXJzaW9uOgkzLjE2CitDb250YWN0OglCasO4cm4gTW9yayA8Ympvcm5AbW9yay5ubz4KK0Rlc2NyaXB0aW9uOgorCQlEaXZpc29yIHVzZWQgZm9yIElOIE5UQiBEYXRhZ3JhbSBwYXlsb2FkIGFsaWdubWVudAorCitXaGF0OgkJL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9jZGNfbmNtL3dOZHBJblBheWxvYWRSZW1haW5kZXIKK0RhdGU6CQlNYXkgMjAxNAorS2VybmVsVmVyc2lvbjoJMy4xNgorQ29udGFjdDoJQmrDuHJuIE1vcmsgPGJqb3JuQG1vcmsubm8+CitEZXNjcmlwdGlvbjoKKwkJUmVtYWluZGVyIHVzZWQgdG8gYWxpZ24gaW5wdXQgZGF0YWdyYW0gcGF5bG9hZCB3aXRoaW4KKwkJdGhlIE5UQjogKFBheWxvYWQgT2Zmc2V0KSBtb2QgKHdOZHBJbkRpdmlzb3IpID0KKwkJd05kcEluUGF5bG9hZFJlbWFpbmRlcgorCitXaGF0OgkJL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9jZGNfbmNtL3dOZHBJbkFsaWdubWVudAorRGF0ZToJCU1heSAyMDE0CitLZXJuZWxWZXJzaW9uOgkzLjE2CitDb250YWN0OglCasO4cm4gTW9yayA8Ympvcm5AbW9yay5ubz4KK0Rlc2NyaXB0aW9uOgorCQlORFAgYWxpZ25tZW50IG1vZHVsdXMgZm9yIE5UQnMgb24gdGhlIElOIHBpcGUuIFNoYWxsCisJCWJlIGEgcG93ZXIgb2YgMiwgYW5kIHNoYWxsIGJlIGF0IGxlYXN0IDQuCisKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L2NkY19uY20vZHdOdGJPdXRNYXhTaXplCitEYXRlOgkJTWF5IDIwMTQKK0tlcm5lbFZlcnNpb246CTMuMTYKK0NvbnRhY3Q6CUJqw7hybiBNb3JrIDxiam9ybkBtb3JrLm5vPgorRGVzY3JpcHRpb246CisJCU9VVCBOVEIgTWF4aW11bSBTaXplCisKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L2NkY19uY20vd05kcE91dERpdmlzb3IKK0RhdGU6CQlNYXkgMjAxNAorS2VybmVsVmVyc2lvbjoJMy4xNgorQ29udGFjdDoJQmrDuHJuIE1vcmsgPGJqb3JuQG1vcmsubm8+CitEZXNjcmlwdGlvbjoKKwkJT1VUIE5UQiBEYXRhZ3JhbSBhbGlnbm1lbnQgbW9kdWx1cworCitXaGF0OgkJL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9jZGNfbmNtL3dOZHBPdXRQYXlsb2FkUmVtYWluZGVyCitEYXRlOgkJTWF5IDIwMTQKK0tlcm5lbFZlcnNpb246CTMuMTYKK0NvbnRhY3Q6CUJqw7hybiBNb3JrIDxiam9ybkBtb3JrLm5vPgorRGVzY3JpcHRpb246CisJCVJlbWFpbmRlciB1c2VkIHRvIGFsaWduIG91dHB1dCBkYXRhZ3JhbSBwYXlsb2FkCisJCW9mZnNldHMgd2l0aGluIHRoZSBOVEI6IFBhZGRpbmcsIHNoYWxsIGJlIHRyYW5zbWl0dGVkCisJCWFzIHplcm8gYnkgZnVuY3Rpb24sIGFuZCBpZ25vcmVkIGJ5IGhvc3QuICAoUGF5bG9hZAorCQlPZmZzZXQpIG1vZCAod05kcE91dERpdmlzb3IpID0gd05kcE91dFBheWxvYWRSZW1haW5kZXIKKworV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vY2RjX25jbS93TmRwT3V0QWxpZ25tZW50CitEYXRlOgkJTWF5IDIwMTQKK0tlcm5lbFZlcnNpb246CTMuMTYKK0NvbnRhY3Q6CUJqw7hybiBNb3JrIDxiam9ybkBtb3JrLm5vPgorRGVzY3JpcHRpb246CisJCU5EUCBhbGlnbm1lbnQgbW9kdWx1cyBmb3IgdXNlIGluIE5UQnMgb24gdGhlIE9VVAorCQlwaXBlLiBTaGFsbCBiZSBhIHBvd2VyIG9mIDIsIGFuZCBzaGFsbCBiZSBhdCBsZWFzdCA0LgorCitXaGF0OgkJL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9jZGNfbmNtL3dOdGJPdXRNYXhEYXRhZ3JhbXMKK0RhdGU6CQlNYXkgMjAxNAorS2VybmVsVmVyc2lvbjoJMy4xNgorQ29udGFjdDoJQmrDuHJuIE1vcmsgPGJqb3JuQG1vcmsubm8+CitEZXNjcmlwdGlvbjoKKwkJTWF4aW11bSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgdGhlIGhvc3QgbWF5IHBhY2sKKwkJaW50byBhIHNpbmdsZSBPVVQgTlRCLiBaZXJvIG1lYW5zIHRoYXQgdGhlIGRldmljZQorCQlpbXBvc2VzIG5vIGxpbWl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtcXVldWVzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtcXVldWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOWFlYjkxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtcXVldWVzCkBAIC0wLDAgKzEsNzkgQEAKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vcXVldWVzL3J4LTxxdWV1ZT4vcnBzX2NwdXMKK0RhdGU6CQlNYXJjaCAyMDEwCitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlNYXNrIG9mIHRoZSBDUFUocykgY3VycmVudGx5IGVuYWJsZWQgdG8gcGFydGljaXBhdGUgaW50byB0aGUKKwkJUmVjZWl2ZSBQYWNrZXQgU3RlZXJpbmcgcGFja2V0IHByb2Nlc3NpbmcgZmxvdyBmb3IgdGhpcworCQluZXR3b3JrIGRldmljZSBxdWV1ZS4gUG9zc2libGUgdmFsdWVzIGRlcGVuZCBvbiB0aGUgbnVtYmVyCisJCW9mIGF2YWlsYWJsZSBDUFUocykgaW4gdGhlIHN5c3RlbS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvcngtPHF1ZXVlPi9ycHNfZmxvd19jbnQKK0RhdGU6CQlBcHJpbCAyMDEwCitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlOdW1iZXIgb2YgUmVjZWl2ZSBQYWNrZXQgU3RlZXJpbmcgZmxvd3MgYmVpbmcgY3VycmVudGx5CisJCXByb2Nlc3NlZCBieSB0aGlzIHBhcnRpY3VsYXIgbmV0d29yayBkZXZpY2UgcmVjZWl2ZSBxdWV1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvdHgtPHF1ZXVlPi90eF90aW1lb3V0CitEYXRlOgkJTm92ZW1iZXIgMjAxMQorS2VybmVsVmVyc2lvbjoJMy4zCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXQgdGltZW91dCBldmVudHMgc2VlbiBieSB0aGlzCisJCW5ldHdvcmsgaW50ZXJmYWNlIHRyYW5zbWl0IHF1ZXVlLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3F1ZXVlcy90eC08cXVldWU+L3hwc19jcHVzCitEYXRlOgkJTm92ZW1iZXIgMjAxMAorS2VybmVsVmVyc2lvbjoJMi42LjM4CitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJTWFzayBvZiB0aGUgQ1BVKHMpIGN1cnJlbnRseSBlbmFibGVkIHRvIHBhcnRpY2lwYXRlIGludG8gdGhlCisJCVRyYW5zbWl0IFBhY2tldCBTdGVlcmluZyBwYWNrZXQgcHJvY2Vzc2luZyBmbG93IGZvciB0aGlzCisJCW5ldHdvcmsgZGV2aWNlIHRyYW5zbWl0IHF1ZXVlLiBQb3NzaWJsZSB2YXVsZXMgZGVwZW5kIG9uIHRoZQorCQludW1iZXIgb2YgYXZhaWxhYmxlIENQVShzKSBpbiB0aGUgc3lzdGVtLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3F1ZXVlcy90eC08cXVldWU+L2J5dGVfcXVldWVfbGltaXRzL2hvbGRfdGltZQorRGF0ZToJCU5vdmVtYmVyIDIwMTEKK0tlcm5lbFZlcnNpb246CTMuMworQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgaG9sZCB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBtZWFzdXJlIHRoZSBzbGFjaworCQlvZiB0aGlzIHBhcnRpY3VsYXIgbmV0d29yayBkZXZpY2UgdHJhbnNtaXQgcXVldWUuCisJCURlZmF1bHQgdmFsdWUgaXMgMTAwMC4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvdHgtPHF1ZXVlPi9ieXRlX3F1ZXVlX2xpbWl0cy9pbmZsaWdodAorRGF0ZToJCU5vdmVtYmVyIDIwMTEKK0tlcm5lbFZlcnNpb246CTMuMworQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIChvYmplY3RzKSBpbiBmbGlnaHQgb24gdGhpcworCQluZXR3b3JrIGRldmljZSB0cmFuc21pdCBxdWV1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvdHgtPHF1ZXVlPi9ieXRlX3F1ZXVlX2xpbWl0cy9saW1pdAorRGF0ZToJCU5vdmVtYmVyIDIwMTEKK0tlcm5lbFZlcnNpb246CTMuMworQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgY3VycmVudCBsaW1pdCBvZiBieXRlcyBhbGxvd2VkIHRvIGJlIHF1ZXVlZAorCQlvbiB0aGlzIG5ldHdvcmsgZGV2aWNlIHRyYW5zbWl0IHF1ZXVlLiBUaGlzIHZhbHVlIGlzIGNsYW1wZWQKKwkJdG8gYmUgd2l0aGluIHRoZSBib3VuZHMgZGVmaW5lZCBieSBsaW1pdF9tYXggYW5kIGxpbWl0X21pbi4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvdHgtPHF1ZXVlPi9ieXRlX3F1ZXVlX2xpbWl0cy9saW1pdF9tYXgKK0RhdGU6CQlOb3ZlbWJlciAyMDExCitLZXJuZWxWZXJzaW9uOgkzLjMKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGFic29sdXRlIG1heGltdW0gbGltaXQgb2YgYnl0ZXMgYWxsb3dlZCB0byBiZQorCQlxdWV1ZWQgb24gdGhpcyBuZXR3b3JrIGRldmljZSB0cmFuc21pdCBxdWV1ZS4gU2VlCisJCWluY2x1ZGUvbGludXgvZHluYW1pY19xdWV1ZV9saW1pdHMuaCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUuCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vcXVldWVzL3R4LTxxdWV1ZT4vYnl0ZV9xdWV1ZV9saW1pdHMvbGltaXRfbWluCitEYXRlOgkJTm92ZW1iZXIgMjAxMQorS2VybmVsVmVyc2lvbjoJMy4zCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIGxpbWl0IG9mIGJ5dGVzIGFsbG93ZWQgdG8gYmUKKwkJcXVldWVkIG9uIHRoaXMgbmV0d29yayBkZXZpY2UgdHJhbnNtaXQgcXVldWUuIERlZmF1bHQgdmFsdWUgaXMKKwkJMC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbmV0LXN0YXRpc3RpY3MgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldC1zdGF0aXN0aWNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzExOGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldC1zdGF0aXN0aWNzCkBAIC0wLDAgKzEsMjAxIEBACitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvY29sbGlzaW9ucworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbGxpc2lvbnMgc2VlbiBieSB0aGlzIG5ldHdvcmsgZGV2aWNlLgorCQlUaGlzIHZhbHVlIG1pZ2h0IG5vdCBiZSByZWxldmFudCB3aXRoIGFsbCBNQUMgbGF5ZXJzLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvbXVsdGljYXN0CitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhpcworCQluZXR3b3JrIGRldmljZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3J4X2J5dGVzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYnkgdGhpcyBuZXR3b3JrIGRldmljZS4KKwkJU2VlIHRoZSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIGV4YWN0IG1lYW5pbmcgb2Ygd2hlbiB0aGlzCisJCXZhbHVlIGlzIGluY3JlbWVudGVkLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvcnhfY29tcHJlc3NlZAorRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbXByZXNzZWQgcGFja2V0cyByZWNlaXZlZCBieSB0aGlzCisJCW5ldHdvcmsgZGV2aWNlLiBUaGlzIHZhbHVlIG1pZ2h0IG9ubHkgYmUgcmVsZXZhbnQgZm9yIGludGVyZmFjZXMKKwkJdGhhdCBzdXBwb3J0IHBhY2tldCBjb21wcmVzc2lvbiAoZS5nOiBQUFApLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvcnhfY3JjX2Vycm9ycworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgd2l0aCBhIENSQyAoRkNTKSBlcnJvcgorCQlieSB0aGlzIG5ldHdvcmsgZGV2aWNlLiBOb3RlIHRoYXQgdGhlIHNwZWNpZmljIG1lYW5pbmcgbWlnaHQKKwkJZGVwZW5kIG9uIHRoZSBNQUMgbGF5ZXIgdXNlZCBieSB0aGUgaW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvcnhfZHJvcHBlZAorRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIG5ldHdvcmsgZGV2aWNlCisJCWJ1dCBkcm9wcGVkLCB0aGF0IGFyZSBub3QgZm9yd2FyZGVkIHRvIHRoZSB1cHBlciBsYXllcnMgZm9yCisJCXBhY2tldCBwcm9jZXNzaW5nLiBTZWUgdGhlIG5ldHdvcmsgZHJpdmVyIGZvciB0aGUgZXhhY3QKKwkJbWVhbmluZyBvZiB0aGlzIHZhbHVlLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvcnhfZmlmb19lcnJvcnMKK0RhdGU6CQlBcHJpbCAyMDA1CitLZXJuZWxWZXJzaW9uOgkyLjYuMTIKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByZWNlaXZlIEZJRk8gZXJyb3JzIHNlZW4gYnkgdGhpcworCQluZXR3b3JrIGRldmljZS4gU2VlIHRoZSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIGV4YWN0CisJCW1lYW5pbmcgb2YgdGhpcyB2YWx1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3J4X2ZyYW1lX2Vycm9ycworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyB3aXRoIGVycm9yLCBzdWNoIGFzCisJCWFsaWdubWVudCBlcnJvcnMuIE5vdGUgdGhhdCB0aGUgc3BlY2lmaWMgbWVhbmluZyBkZXBlbmRzIG9uCisJCW9uIHRoZSBNQUMgbGF5ZXIgcHJvdG9jb2wgdXNlZC4gU2VlIHRoZSBuZXR3b3JrIGRyaXZlciBmb3IKKwkJdGhlIGV4YWN0IG1lYW5pbmcgb2YgdGhpcyB2YWx1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3J4X2xlbmd0aF9lcnJvcnMKK0RhdGU6CQlBcHJpbCAyMDA1CitLZXJuZWxWZXJzaW9uOgkyLjYuMTIKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBlcnJvciBwYWNrZXQgd2l0aCBhIGxlbmd0aAorCQllcnJvciwgb3ZlcnNpemVkIG9yIHVuZGVyc2l6ZWQuIFNlZSB0aGUgbmV0d29yayBkcml2ZXIgZm9yIHRoZQorCQlleGFjdCBtZWFuaW5nIG9mIHRoaXMgdmFsdWUuCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vc3RhdGlzdGljcy9yeF9taXNzZWRfZXJyb3JzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB0aGF0IGhhdmUgYmVlbiBtaXNzZWQKKwkJZHVlIHRvIGxhY2sgb2YgY2FwYWNpdHkgaW4gdGhlIHJlY2VpdmUgc2lkZS4gU2VlIHRoZSBuZXR3b3JrCisJCWRyaXZlciBmb3IgdGhlIGV4YWN0IG1lYW5pbmcgb2YgdGhpcyB2YWx1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3J4X292ZXJfZXJyb3JzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB0aGF0IGFyZSBvdmVyc2l6ZWQKKwkJY29tcGFyZWQgdG8gd2hhdCB0aGUgbmV0d29yayBkZXZpY2UgaXMgY29uZmlndXJlZCB0byBhY2NlcHQKKwkJKGUuZzogbGFyZ2VyIHRoYW4gTVRVKS4gU2VlIHRoZSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIGV4YWN0CisJCW1lYW5pbmcgb2YgdGhpcyB2YWx1ZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3J4X3BhY2tldHMKK0RhdGU6CQlBcHJpbCAyMDA1CitLZXJuZWxWZXJzaW9uOgkyLjYuMTIKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBnb29kIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhpcworCQluZXR3b3JrIGRldmljZS4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3R4X2Fib3J0ZWRfZXJyb3JzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IGhhdmUgYmVlbiBhYm9ydGVkCisJCWR1cmluZyB0cmFuc21pc3Npb24gYnkgYSBuZXR3b3JrIGRldmljZSAoZS5nOiBiZWNhdXNlIG9mCisJCWEgbWVkaXVtIGNvbGxpc2lvbikuIFNlZSB0aGUgbmV0d29yayBkcml2ZXIgZm9yIHRoZSBleGFjdAorCQltZWFuaW5nIG9mIHRoaXMgdmFsdWUuCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vc3RhdGlzdGljcy90eF9ieXRlcworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIGJ5IGEgbmV0d29yaworCQlkZXZpY2UuIFNlZSB0aGUgbmV0d29yayBkcml2ZXIgZm9yIHRoZSBleGFjdCBtZWFuaW5nIG9mIHRoaXMKKwkJdmFsdWUsIGluIHBhcnRpY3VsYXIgd2hldGhlciB0aGlzIGFjY291bnRzIGZvciBhbGwgc3VjY2Vzc2Z1bGx5CisJCXRyYW5zbWl0dGVkIHBhY2tldHMgb3IgYWxsIHBhY2tldHMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIGZvcgorCQl0cmFuc21pc3Npb24uCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vc3RhdGlzdGljcy90eF9jYXJyaWVyX2Vycm9ycworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBjb3VsZCBub3QgYmUgdHJhbnNtaXR0ZWQKKwkJYmVjYXVzZSBvZiBjYXJyaWVyIGVycm9ycyAoZS5nOiBwaHlzaWNhbCBsaW5rIGRvd24pLiBTZWUgdGhlCisJCW5ldHdvcmsgZHJpdmVyIGZvciB0aGUgZXhhY3QgbWVhbmluZyBvZiB0aGlzIHZhbHVlLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvdHhfY29tcHJlc3NlZAorRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbXByZXNzZWQgcGFja2V0cy4gTm90ZQorCQl0aGlzIG1pZ2h0IG9ubHkgYmUgcmVsZXZhbnQgZm9yIGRldmljZXMgdGhhdCBzdXBwb3J0CisJCWNvbXByZXNzaW9uIChlLmc6IFBQUCkuCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vc3RhdGlzdGljcy90eF9kcm9wcGVkCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkIGR1cmluZyB0cmFuc21pc3Npb24uCisJCVNlZSB0aGUgZHJpdmVyIGZvciB0aGUgZXhhY3QgcmVhc29ucyBhcyB0byB3aHkgdGhlIHBhY2tldHMgd2VyZQorCQlkcm9wcGVkLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvdHhfZXJyb3JzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGFja2V0cyBpbiBlcnJvciBkdXJpbmcgdHJhbnNtaXNzaW9uIGJ5CisJCWEgbmV0d29yayBkZXZpY2UuIFNlZSB0aGUgZHJpdmVyIGZvciB0aGUgZXhhY3QgcmVhc29ucyBhcyB0bworCQl3aHkgdGhlIHBhY2tldHMgd2VyZSBkcm9wcGVkLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvdHhfZmlmb19lcnJvcnMKK0RhdGU6CQlBcHJpbCAyMDA1CitLZXJuZWxWZXJzaW9uOgkyLjYuMTIKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIGhhdmluZyBjYXVzZWQgYSB0cmFuc21pdAorCQlGSUZPIGVycm9yLiBTZWUgdGhlIGRyaXZlciBmb3IgdGhlIGV4YWN0IHJlYXNvbnMgYXMgdG8gd2h5IHRoZQorCQlwYWNrZXRzIHdlcmUgZHJvcHBlZC4KKworV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9zdGF0aXN0aWNzL3R4X2hlYXJ0YmVhdF9lcnJvcnMKK0RhdGU6CQlBcHJpbCAyMDA1CitLZXJuZWxWZXJzaW9uOgkyLjYuMTIKK0NvbnRhY3Q6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkIHRoYXQgaGF2ZSBiZWVuCisJCXJlcG9ydGVkIGFzIGhlYXJ0YmVhdCBlcnJvcnMuIFNlZSB0aGUgZHJpdmVyIGZvciB0aGUgZXhhY3QKKwkJcmVhc29ucyBhcyB0byB3aHkgdGhlIHBhY2tldHMgd2VyZSBkcm9wcGVkLgorCitXaGF0OgkJL3N5cy9jbGFzcy88aWZhY2U+L3N0YXRpc3RpY3MvdHhfcGFja2V0cworRGF0ZToJCUFwcmlsIDIwMDUKK0tlcm5lbFZlcnNpb246CTIuNi4xMgorQ29udGFjdDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgYnkgYSBuZXR3b3JrCisJCWRldmljZS4gU2VlIHRoZSBkcml2ZXIgZm9yIHdoZXRoZXIgdGhpcyByZXBvcnRzIHRoZSBudW1iZXIgb2YgYWxsCisJCWF0dGVtcHRlZCBvciBzdWNjZXNzZnVsIHRyYW5zbWlzc2lvbnMuCisKK1doYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vc3RhdGlzdGljcy90eF93aW5kb3dfZXJyb3JzCitEYXRlOgkJQXByaWwgMjAwNQorS2VybmVsVmVyc2lvbjoJMi42LjEyCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGFja2V0cyBub3Qgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkCisJCWR1ZSB0byBhIHdpbmRvdyBjb2xsaXNpb24uIFRoZSBzcGVjaWZpYyBtZWFuaW5nIGRlcGVuZHMgb24gdGhlCisJCU1BQyBsYXllciB1c2VkLiAgT24gRXRoZXJuZXQgdGhpcyBpcyB1c3VhbGx5IHVzZWQgdG8gcmVwb3J0CisJCWxhdGUgY29sbGlzaW9ucyBlcnJvcnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svODAyMTEudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay84MDIxMS50bXBsCmluZGV4IDA0NGI3NjQuLmQ5Yjk0MTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay84MDIxMS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay84MDIxMS50bXBsCkBAIC0xMDAsNiArMTAwLDcgQEAKICFGaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCB3ZGV2X3ByaXYKICFGaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBpZWVlODAyMTFfaWZhY2VfbGltaXQKICFGaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KKyFGaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBjZmc4MDIxMV9jaGVja19jb21iaW5hdGlvbnMKICAgICAgIDwvY2hhcHRlcj4KICAgICAgIDxjaGFwdGVyPgogICAgICAgPHRpdGxlPkFjdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb248L3RpdGxlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsCmluZGV4IGJhNjBkOTMuLjdkZjMxMzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kcm0udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwKQEAgLTE0Miw2ICsxNDIsMTIgQEAKICAgICAgIHRvIHJlZ2lzdGVyIGl0IHdpdGggdGhlIERSTSBzdWJzeXN0ZW0uCiAgICAgPC9wYXJhPgogICAgIDxwYXJhPgorICAgICAgTmV3ZXIgZHJpdmVycyB0aGF0IG5vIGxvbmdlciByZXF1aXJlIGEgPHN0cnVjdG5hbWU+ZHJtX2J1czwvc3RydWN0bmFtZT4KKyAgICAgIHN0cnVjdHVyZSBjYW4gYWx0ZXJuYXRpdmVseSB1c2UgdGhlIGxvdy1sZXZlbCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kCisgICAgICByZWdpc3RyYXRpb24gZnVuY3Rpb25zIHN1Y2ggYXMgPGZ1bmN0aW9uPmRybV9kZXZfYWxsb2MoKTwvZnVuY3Rpb24+IGFuZAorICAgICAgPGZ1bmN0aW9uPmRybV9kZXZfcmVnaXN0ZXIoKTwvZnVuY3Rpb24+IGRpcmVjdGx5LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KICAgICAgIFRoZSA8c3RydWN0bmFtZT5kcm1fZHJpdmVyPC9zdHJ1Y3RuYW1lPiBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhdGljCiAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgZHJpdmVyIGFuZCBmZWF0dXJlcyBpdCBzdXBwb3J0cywgYW5kCiAgICAgICBwb2ludGVycyB0byBtZXRob2RzIHRoYXQgdGhlIERSTSBjb3JlIHdpbGwgY2FsbCB0byBpbXBsZW1lbnQgdGhlIERSTSBBUEkuCkBAIC0yODIsNiArMjg4LDM2IEBACiAgICAgICA8L3NlY3QzPgogICAgIDwvc2VjdDI+CiAgICAgPHNlY3QyPgorICAgICAgPHRpdGxlPkRldmljZSBSZWdpc3RyYXRpb248L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gaGVscCB3aXRoIGRldmljZSByZWdpc3RyYXRpb24uCisgICAgICAgIFRoZSBmdW5jdGlvbnMgZGVhbCB3aXRoIFBDSSwgVVNCIGFuZCBwbGF0Zm9ybSBkZXZpY2VzLCByZXNwZWN0aXZlbHkuCisgICAgICA8L3BhcmE+CishRWRyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKKyFFZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYworIUVkcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKKyAgICAgIDxwYXJhPgorICAgICAgICBOZXcgZHJpdmVycyB0aGF0IG5vIGxvbmdlciByZWx5IG9uIHRoZSBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGUKKyAgICAgICAgPHN0cnVjdG5hbWU+ZHJtX2J1czwvc3RydWN0bmFtZT4gc3RydWN0dXJlIGNhbiBjYWxsIHRoZSBsb3ctbGV2ZWwKKyAgICAgICAgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgZGlyZWN0bHkuIFRoZQorICAgICAgICA8ZnVuY3Rpb24+ZHJtX2Rldl9hbGxvYygpPC9mdW5jdGlvbj4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWxsb2NhdGUKKyAgICAgICAgYW5kIGluaXRpYWxpemUgYSBuZXcgPHN0cnVjdG5hbWU+ZHJtX2RldmljZTwvc3RydWN0bmFtZT4gc3RydWN0dXJlLgorICAgICAgICBEcml2ZXJzIHdpbGwgdHlwaWNhbGx5IHdhbnQgdG8gcGVyZm9ybSBzb21lIGFkZGl0aW9uYWwgc2V0dXAgb24gdGhpcworICAgICAgICBzdHJ1Y3R1cmUsIHN1Y2ggYXMgYWxsb2NhdGluZyBkcml2ZXItc3BlY2lmaWMgZGF0YSBhbmQgc3RvcmluZyBhCisgICAgICAgIHBvaW50ZXIgdG8gaXQgaW4gdGhlIERSTSBkZXZpY2UncyA8c3RydWN0ZmllbGQ+ZGV2X3ByaXZhdGU8L3N0cnVjdGZpZWxkPgorICAgICAgICBmaWVsZC4gRHJpdmVycyBzaG91bGQgYWxzbyBzZXQgdGhlIGRldmljZSdzIHVuaXF1ZSBuYW1lIHVzaW5nIHRoZQorICAgICAgICA8ZnVuY3Rpb24+ZHJtX2Rldl9zZXRfdW5pcXVlKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbi4gQWZ0ZXIgaXQgaGFzIGJlZW4KKyAgICAgICAgc2V0IHVwIGEgZGV2aWNlIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIERSTSBzdWJzeXN0ZW0gYnkgY2FsbGluZworICAgICAgICA8ZnVuY3Rpb24+ZHJtX2Rldl9yZWdpc3RlcigpPC9mdW5jdGlvbj4uIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvCisgICAgICAgIGJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGFuZCB3aWxsIGNhbGwgdGhlIGRyaXZlcidzCisgICAgICAgIDxzdHJ1Y3RmaWVsZD4ubG9hZCgpPC9zdHJ1Y3RmaWVsZD4gaW1wbGVtZW50YXRpb24uIFdoZW4gYSBkZXZpY2UgaXMKKyAgICAgICAgcmVtb3ZlZCwgdGhlIERSTSBkZXZpY2UgY2FuIHNhZmVseSBiZSB1bnJlZ2lzdGVyZWQgYW5kIGZyZWVkIGJ5IGNhbGxpbmcKKyAgICAgICAgPGZ1bmN0aW9uPmRybV9kZXZfdW5yZWdpc3RlcigpPC9mdW5jdGlvbj4gZm9sbG93ZWQgYnkgYSBjYWxsIHRvCisgICAgICAgIDxmdW5jdGlvbj5kcm1fZGV2X3VucmVmKCk8L2Z1bmN0aW9uPi4KKyAgICAgIDwvcGFyYT4KKyFFZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKKyAgICA8L3NlY3QyPgorICAgIDxzZWN0Mj4KICAgICAgIDx0aXRsZT5Ecml2ZXIgTG9hZDwvdGl0bGU+CiAgICAgICA8cGFyYT4KICAgICAgICAgVGhlIDxtZXRob2RuYW1lPmxvYWQ8L21ldGhvZG5hbWU+IG1ldGhvZCBpcyB0aGUgZHJpdmVyIGFuZCBkZXZpY2UKQEAgLTM0MiwyMSArMzc4LDEzIEBACiAgICAgICAgIDxzZWN0ND4KICAgICAgICAgICA8dGl0bGU+TWFuYWdlZCBJUlEgUmVnaXN0cmF0aW9uPC90aXRsZT4KICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIEJvdGggdGhlIDxmdW5jdGlvbj5kcm1faXJxX2luc3RhbGw8L2Z1bmN0aW9uPiBhbmQKLQkgICAgPGZ1bmN0aW9uPmRybV9pcnFfdW5pbnN0YWxsPC9mdW5jdGlvbj4gZnVuY3Rpb25zIGdldCB0aGUgZGV2aWNlIElSUSBieQotCSAgICBjYWxsaW5nIDxmdW5jdGlvbj5kcm1fZGV2X3RvX2lycTwvZnVuY3Rpb24+LiBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsCi0JICAgIGNhbGwgYSBidXMtc3BlY2lmaWMgb3BlcmF0aW9uIHRvIHJldHJpZXZlIHRoZSBJUlEgbnVtYmVyLiBGb3IgcGxhdGZvcm0KLQkgICAgZGV2aWNlcywgPGZ1bmN0aW9uPnBsYXRmb3JtX2dldF9pcnE8L2Z1bmN0aW9uPiguLi4sIDApIGlzIHVzZWQgdG8KLQkgICAgcmV0cmlldmUgdGhlIElSUSBudW1iZXIuCi0gICAgICAgICAgPC9wYXJhPgotICAgICAgICAgIDxwYXJhPgogICAgICAgICAgICAgPGZ1bmN0aW9uPmRybV9pcnFfaW5zdGFsbDwvZnVuY3Rpb24+IHN0YXJ0cyBieSBjYWxsaW5nIHRoZQogICAgICAgICAgICAgPG1ldGhvZG5hbWU+aXJxX3ByZWluc3RhbGw8L21ldGhvZG5hbWU+IGRyaXZlciBvcGVyYXRpb24uIFRoZSBvcGVyYXRpb24KICAgICAgICAgICAgIGlzIG9wdGlvbmFsIGFuZCBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBpbnRlcnJ1cHQgd2lsbCBub3QgZ2V0IGZpcmVkIGJ5CiAgICAgICAgICAgICBjbGVhcmluZyBhbGwgcGVuZGluZyBpbnRlcnJ1cHQgZmxhZ3Mgb3IgZGlzYWJsaW5nIHRoZSBpbnRlcnJ1cHQuCiAgICAgICAgICAgPC9wYXJhPgogICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgVGhlIElSUSB3aWxsIHRoZW4gYmUgcmVxdWVzdGVkIGJ5IGEgY2FsbCB0bworICAgICAgICAgICAgVGhlIHBhc3NlZC1pbiBJUlEgd2lsbCB0aGVuIGJlIHJlcXVlc3RlZCBieSBhIGNhbGwgdG8KICAgICAgICAgICAgIDxmdW5jdGlvbj5yZXF1ZXN0X2lycTwvZnVuY3Rpb24+LiBJZiB0aGUgRFJJVkVSX0lSUV9TSEFSRUQgZHJpdmVyCiAgICAgICAgICAgICBmZWF0dXJlIGZsYWcgaXMgc2V0LCBhIHNoYXJlZCAoSVJRRl9TSEFSRUQpIElSUSBoYW5kbGVyIHdpbGwgYmUKICAgICAgICAgICAgIHJlcXVlc3RlZC4KQEAgLTE3OTksNiArMTgyNywxMiBAQAogICAgICAgPHRpdGxlPktNUyBBUEkgRnVuY3Rpb25zPC90aXRsZT4KICFFZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKICAgICA8L3NlY3QyPgorICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5LTVMgTG9ja2luZzwvdGl0bGU+CishUGRyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXNldF9sb2NrLmMga21zIGxvY2tpbmcKKyFJaW5jbHVkZS9kcm0vZHJtX21vZGVzZXRfbG9jay5oCishRWRyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXNldF9sb2NrLmMKKyAgICA8L3NlY3QyPgogICA8L3NlY3QxPgogCiAgIDwhLS0gSW50ZXJuYWxzOiBrbXMgaGVscGVyIGZ1bmN0aW9ucyAtLT4KQEAgLTE5MDMsOCArMTkzNyw4IEBACiAgICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gZmlsdGVycyBvdXQgbW9kZXMgbGFyZ2VyIHRoYW4KICAgICAgICAgICAgIDxwYXJhbWV0ZXI+bWF4X3dpZHRoPC9wYXJhbWV0ZXI+IGFuZCA8cGFyYW1ldGVyPm1heF9oZWlnaHQ8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIGlmIHNwZWNpZmllZC4gSXQgdGhlbiBjYWxscyB0aGUgY29ubmVjdG9yCi0gICAgICAgICAgICA8bWV0aG9kbmFtZT5tb2RlX3ZhbGlkPC9tZXRob2RuYW1lPiBoZWxwZXIgb3BlcmF0aW9uIGZvciAgZWFjaCBtb2RlIGluCisgICAgICAgICAgICBpZiBzcGVjaWZpZWQuIEl0IHRoZW4gY2FsbHMgdGhlIG9wdGlvbmFsIGNvbm5lY3RvcgorICAgICAgICAgICAgPG1ldGhvZG5hbWU+bW9kZV92YWxpZDwvbWV0aG9kbmFtZT4gaGVscGVyIG9wZXJhdGlvbiBmb3IgZWFjaCBtb2RlIGluCiAgICAgICAgICAgICB0aGUgcHJvYmVkIGxpc3QgdG8gY2hlY2sgd2hldGhlciB0aGUgbW9kZSBpcyB2YWxpZCBmb3IgdGhlIGNvbm5lY3Rvci4KICAgICAgICAgICA8L3BhcmE+CiAgICAgICAgIDwvbGlzdGl0ZW0+CkBAIC0yMjY1LDcgKzIyOTksNyBAQAogICAgICAgICAgIDxwYXJhPgogICAgICAgICAgICAgVmVyaWZ5IHdoZXRoZXIgYSBtb2RlIGlzIHZhbGlkIGZvciB0aGUgY29ubmVjdG9yLiBSZXR1cm4gTU9ERV9PSyBmb3IKICAgICAgICAgICAgIHN1cHBvcnRlZCBtb2RlcyBhbmQgb25lIG9mIHRoZSBlbnVtIGRybV9tb2RlX3N0YXR1cyB2YWx1ZXMgKE1PREVfKikKLSAgICAgICAgICAgIGZvciB1bnN1cHBvcnRlZCBtb2Rlcy4gVGhpcyBvcGVyYXRpb24gaXMgbWFuZGF0b3J5LgorICAgICAgICAgICAgZm9yIHVuc3VwcG9ydGVkIG1vZGVzLiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4KICAgICAgICAgICA8L3BhcmE+CiAgICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgICBBcyB0aGUgbW9kZSByZWplY3Rpb24gcmVhc29uIGlzIGN1cnJlbnRseSBub3QgdXNlZCBiZXNpZGUgZm9yCkBAIC0yNDUwLDYgKzI0ODQsODYzIEBACiAgICAgICBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb2JqZWN0LCBhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBwcm9wZXJ0eQogICAgICAgYW5kIGFuIGluaXRpYWwgaW5zdGFuY2UgdmFsdWUuCiAgICAgPC9wYXJhPgorICAgIDxzZWN0Mj4KKwk8dGl0bGU+RXhpc3RpbmcgS01TIFByb3BlcnRpZXM8L3RpdGxlPgorCTxwYXJhPgorCVRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgZGVzY3JpcHRpb24gb2YgZHJtIHByb3BlcnRpZXMgZXhwb3NlZCBieSB2YXJpb3VzCisJbW9kdWxlcy9kcml2ZXJzLgorCTwvcGFyYT4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorCTx0Ym9keT4KKwk8dHIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+CisJPHRkIHZhbGlnbj0idG9wIiA+T3duZXIgTW9kdWxlL0RyaXZlcnM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkdyb3VwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Qcm9wZXJ0eSBOYW1lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UeXBlPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Qcm9wZXJ0eSBWYWx1ZXM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk9iamVjdCBhdHRhY2hlZDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RGVzY3JpcHRpb24vUmVzdHJpY3Rpb25zPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iMjAiIHZhbGlnbj0idG9wIiA+RFJNPC90ZD4KKwk8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxFRElE4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5CTE9CIHwgSU1NVVRBQkxFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID4wPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbnRhaW5zIGlkIG9mIGVkaWQgYmxvYiBwdHIgb2JqZWN0LjwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcRFBNU+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyDigJxPbuKAnSwg4oCcU3RhbmRieeKAnSwg4oCcU3VzcGVuZOKAnSwg4oCcT2Zm4oCdIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29udGFpbnMgRFBNUyBvcGVyYXRpb24gbW9kZSB2YWx1ZS48L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIxIiB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJx0eXBl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNIHwgSU1NVVRBQkxFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJPdmVybGF5IiwgIlByaW1hcnkiLCAiQ3Vyc29yIiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmUgdHlwZTwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiA+RFZJLUk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHN1YmNvbm5lY3RvcuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyDigJxVbmtub3du4oCdLCDigJxEVkktROKAnSwg4oCcRFZJLUHigJ0gfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHNlbGVjdCBzdWJjb25uZWN0b3LigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsg4oCcQXV0b21hdGlj4oCdLCDigJxEVkktROKAnSwg4oCcRFZJLUHigJ0gfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIxMyIgdmFsaWduPSJ0b3AiID5UVjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcc3ViY29ubmVjdG9y4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJVbmtub3duIiwgIkNvbXBvc2l0ZSIsICJTVklERU8iLCAiQ29tcG9uZW50IiwgIlNDQVJUIiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcc2VsZWN0IHN1YmNvbm5lY3RvcuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAiQXV0b21hdGljIiwgIkNvbXBvc2l0ZSIsICJTVklERU8iLCAiQ29tcG9uZW50IiwgIlNDQVJUIiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcbW9kZeKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAiTlRTQ19NIiwgIk5UU0NfSiIsICJOVFNDXzQ0MyIsICJQQUxfQiIgfSBldGMuPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcbGVmdCBtYXJnaW7igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTEwMDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHJpZ2h0IG1hcmdpbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdG9wIG1hcmdpbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYm90dG9tIG1hcmdpbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYnJpZ2h0bmVzc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcY29udHJhc3TigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTEwMDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGZsaWNrZXIgcmVkdWN0aW9u4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMDA8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxvdmVyc2NhbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcc2F0dXJhdGlvbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcaHVl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMDA8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiID5PcHRpb25hbDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcc2NhbGluZyBtb2Rl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJOb25lIiwgIkZ1bGwiLCAiQ2VudGVyIiwgIkZ1bGwgYXNwZWN0IiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcZGlydHnigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU0gfCBJTU1VVEFCTEU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgIk9mZiIsICJPbiIsICJBbm5vdGF0ZSIgfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIyMSIgdmFsaWduPSJ0b3AiID5pOTE1PC90ZD4KKwk8dGQgcm93c3Bhbj0iMyIgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID4iQnJvYWRjYXN0IFJHQiI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgIkF1dG9tYXRpYyIsICJGdWxsIiwgIkxpbWl0ZWQgMTY6MjM1IiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYXVkaW/igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgImZvcmNlLWR2aSIsICJvZmYiLCAiYXV0byIsICJvbiIgfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIG5hbWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCB0eXBlIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgdmFsdWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCBPYmplY3QgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIxNyIgdmFsaWduPSJ0b3AiID5TRFZPLVRWPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxtb2Rl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJOVFNDX00iLCAiTlRTQ19KIiwgIk5UU0NfNDQzIiwgIlBBTF9CIiB9IGV0Yy48L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4ibGVmdF9tYXJnaW4iPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4icmlnaHRfbWFyZ2luIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+InRvcF9tYXJnaW4iPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4iYm90dG9tX21hcmdpbiI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGhwb3PigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHZwb3PigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGNvbnRyYXN04oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxzYXR1cmF0aW9u4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxodWXigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHNoYXJwbmVzc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcZmxpY2tlcl9maWx0ZXLigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGZsaWNrZXJfZmlsdGVyX2FkYXB0aXZl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxmbGlja2VyX2ZpbHRlcl8yZOKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdHZfY2hyb21hX2ZpbHRlcuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdHZfbHVtYV9maWx0ZXLigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGRvdF9jcmF3bOKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPlNEVk8tVFYvTFZEUzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYnJpZ2h0bmVzc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjMiIHZhbGlnbj0idG9wIiA+Q0RWIGdtYS01MDA8L3RkPgorCTx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgPkdlbmVyaWM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPiJCcm9hZGNhc3QgUkdCIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyDigJxGdWxs4oCdLCDigJxMaW1pdGVkIDE2OjIzNeKAnSB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+IkJyb2FkY2FzdCBSR0IiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57IOKAnG9mZuKAnSwg4oCcYXV0b+KAnSwg4oCcb27igJ0gfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIG5hbWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCB0eXBlIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgdmFsdWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCBPYmplY3QgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIyMCIgdmFsaWduPSJ0b3AiID5Qb3Vsc2JvPC90ZD4KKwk8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxiYWNrbGlnaHTigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTEwMDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIG5hbWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCB0eXBlIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgdmFsdWUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCBPYmplY3QgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIxNyIgdmFsaWduPSJ0b3AiID5TRFZPLVRWPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxtb2Rl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJOVFNDX00iLCAiTlRTQ19KIiwgIk5UU0NfNDQzIiwgIlBBTF9CIiB9IGV0Yy48L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4ibGVmdF9tYXJnaW4iPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4icmlnaHRfbWFyZ2luIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+InRvcF9tYXJnaW4iPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4iYm90dG9tX21hcmdpbiI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGhwb3PigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHZwb3PigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGNvbnRyYXN04oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxzYXR1cmF0aW9u4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxodWXigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHNoYXJwbmVzc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcZmxpY2tlcl9maWx0ZXLigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGZsaWNrZXJfZmlsdGVyX2FkYXB0aXZl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0gU0RWTyBkZXBlbmRlbnQ8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxmbGlja2VyX2ZpbHRlcl8yZOKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdHZfY2hyb21hX2ZpbHRlcuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdHZfbHVtYV9maWx0ZXLigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PSBTRFZPIGRlcGVuZGVudDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGRvdF9jcmF3bOKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPlNEVk8tVFYvTFZEUzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYnJpZ2h0bmVzc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9IFNEVk8gZGVwZW5kZW50PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjExIiB2YWxpZ249InRvcCIgPmFybWFkYTwvdGQ+CisJPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiA+Q1JUQzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+IkNTQ19ZVVYiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJBdXRvIiAsICJDQ0lSNjAxIiwgIkNDSVI3MDkiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNSVEM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+IkNTQ19SR0IiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJBdXRvIiwgIkNvbXB1dGVyIHN5c3RlbSIsICJTdHVkaW8iIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNSVEM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjkiIHZhbGlnbj0idG9wIiA+T3ZlcmxheTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+ImNvbG9ya2V5IjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MHhmZmZmZmY8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPiJjb2xvcmtleV9taW4iPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0weGZmZmZmZjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+ImNvbG9ya2V5X21heCI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTB4ZmZmZmZmPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4iY29sb3JrZXlfdmFsIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MHhmZmZmZmY8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPiJjb2xvcmtleV9hbHBoYSI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTB4ZmZmZmZmPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4iY29sb3JrZXlfbW9kZSI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgImRpc2FibGVkIiwgIlkgY29tcG9uZW50IiwgIlUgY29tcG9uZW50IgorCSwgIlYgY29tcG9uZW50IiwgIlJHQiIsIOKAnFIgY29tcG9uZW50IiwgIkcgY29tcG9uZW50IiwgIkIgY29tcG9uZW50IiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4iYnJpZ2h0bmVzcyI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTI1NiArIDI1NTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+ImNvbnRyYXN0IjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MHg3ZmZmPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4ic2F0dXJhdGlvbiI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTB4N2ZmZjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiA+ZXh5bm9zPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5DUlRDPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxtb2Rl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJub3JtYWwiLCAiYmxhbmsiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNSVEM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+T3ZlcmxheTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcenBvc+KAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9TUFYX1BMQU5FLTE8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgPmkyYy9jaDcwMDZfZHJ2PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxzY2FsZeKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgPlRWPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCBuYW1lcyBhcyBpbiBEUk08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIHR5cGVzIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgVmFsdWVzIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgb2JqZWN0IGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxtb2Rl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJQQUwiLCAiUEFMLU0iLCJQQUwtTiJ9LCDigJ1QQUwtTmMiCisJLCAiUEFMLTYwIiwgIk5UU0MtTSIsICJOVFNDLUoiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iMTYiIHZhbGlnbj0idG9wIiA+bm91dmVhdTwvdGQ+CisJPHRkIHJvd3NwYW49IjYiIHZhbGlnbj0idG9wIiA+TlYxMCBPdmVybGF5PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID4iY29sb3JrZXkiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0weDAxZmZmZmZmPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxjb250cmFzdOKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9ODE5Mi0xPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxicmlnaHRuZXNz4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMDI0PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxodWXigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTM1OTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcc2F0dXJhdGlvbuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9ODE5Mi0xPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxpdHVyYnRfNzA54oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiID5OdjA0IE92ZXJsYXk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGNvbG9ya2V54oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0weDAxZmZmZmZmPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxicmlnaHRuZXNz4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMDI0PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5QbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iNyIgdmFsaWduPSJ0b3AiID5EaXNwbGF5PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxkaXRoZXJpbmcgbW9kZeKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAiYXV0byIsICJvZmYiLCAib24iIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxkaXRoZXJpbmcgZGVwdGjigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgImF1dG8iLCAib2ZmIiwgIm9uIiwgInN0YXRpYyAyeDIiLCAiZHluYW1pYyAyeDIiLCAidGVtcG9yYWwiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJx1bmRlcnNjYW7igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgImF1dG8iLCAiNiBicGMiLCAiOCBicGMiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJx1bmRlcnNjYW4gaGJvcmRlcuKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MTI4PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcdW5kZXJzY2FuIHZib3JkZXLigJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTEyODwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q29ubmVjdG9yPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnHZpYnJhbnQgaHVl4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xODA8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID7igJxjb2xvciB2aWJyYW5jZeKAnTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0wLCBNYXg9MjAwPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+R2VuZXJpYzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgbmFtZSBhcyBpbiBEUk08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIHR5cGUgYXMgaW4gRFJNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCB2YWx1ZSBhcyBpbiBEUk08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIE9iamVjdCBhcyBpbiBEUk08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiA+b21hcDwvdGQ+CisJPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiA+R2VuZXJpYzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCccm90YXRpb27igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkJJVE1BU0s8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgMCwgInJvdGF0ZS0wIiB9LAorCXsgMSwgInJvdGF0ZS05MCIgfSwKKwl7IDIsICJyb3RhdGUtMTgwIiB9LAorCXsgMywgInJvdGF0ZS0yNzAiIH0sCisJeyA0LCAicmVmbGVjdC14IiB9LAorCXsgNSwgInJlZmxlY3QteSIgfTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+Q1JUQywgUGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcem9yZGVy4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0zPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5DUlRDLCBQbGFuZTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID5xeGw8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkdlbmVyaWM8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGhvdHBsdWdfbW9kZV91cGRhdGUiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjEwIiB2YWxpZ249InRvcCIgPnJhZGVvbjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RFZJLUk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPuKAnGNvaGVyZW504oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+REFDIGVuYWJsZSBsb2FkIGRldGVjdDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcbG9hZCBkZXRlY3Rpb27igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTE8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID5UViBTdGFuZGFyZDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+InR2IHN0YW5kYXJkIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAibnRzYyIsICJwYWwiLCAicGFsLW0iLCAicGFsLTYwIiwgIm50c2MtaiIKKwksICJzY2FydC1wYWwiLCAicGFsLWNuIiwgInNlY2FtIiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+bGVnYWN5IFRNRFMgUExMIGRldGVjdDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+InRtZHNfcGxsIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAiZHJpdmVyIiwgImJpb3MiIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPi08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHJvd3NwYW49IjMiIHZhbGlnbj0idG9wIiA+VW5kZXJzY2FuPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID4idW5kZXJzY2FuIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+RU5VTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+eyAib2ZmIiwgIm9uIiwgImF1dG8iIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4idW5kZXJzY2FuIGhib3JkZXIiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMjg8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID4idW5kZXJzY2FuIHZib3JkZXIiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0xMjg8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID5BdWRpbzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcYXVkaW/igJ08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPnsgIm9mZiIsICJvbiIsICJhdXRvIiB9PC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8dHI+CisJPHRkIHZhbGlnbj0idG9wIiA+Rk1UIERpdGhlcmluZzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+4oCcZGl0aGVy4oCdPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5FTlVNPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID57ICJvZmYiLCAib24iIH08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPkNvbm5lY3RvcjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5TdGFuZGFyZCBuYW1lIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgdHlwZSBhcyBpbiBEUk08L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlN0YW5kYXJkIHZhbHVlIGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+U3RhbmRhcmQgT2JqZWN0IGFzIGluIERSTTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+VEJEPC90ZD4KKwk8L3RyPgorCTx0cj4KKwk8dGQgcm93c3Bhbj0iMyIgdmFsaWduPSJ0b3AiID5yY2FyLWR1PC90ZD4KKwk8dGQgcm93c3Bhbj0iMyIgdmFsaWduPSJ0b3AiID5HZW5lcmljPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID4iYWxwaGEiPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5SQU5HRTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+TWluPTAsIE1heD0yNTU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPiJjb2xvcmtleSI8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlJBTkdFPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5NaW49MCwgTWF4PTB4MDFmZmZmZmY8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlBsYW5lPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiID5UQkQ8L3RkPgorCTwvdHI+CisJPHRyPgorCTx0ZCB2YWxpZ249InRvcCIgPiJ6cG9zIjwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UkFOR0U8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPk1pbj0xLCBNYXg9NzwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+UGxhbmU8L3RkPgorCTx0ZCB2YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPC90cj4KKwk8L3Rib2R5PgorCTwvdGFibGU+CisgICAgPC9zZWN0Mj4KICAgPC9zZWN0MT4KIAogICA8IS0tIEludGVybmFsczogdmVydGljYWwgYmxhbmtpbmcgLS0+CkBAIC0yNTI3LDYgKzM0MTgsMTAgQEAKICAgICAgIHdpdGggYSBjYWxsIHRvIDxmdW5jdGlvbj5kcm1fdmJsYW5rX2NsZWFudXA8L2Z1bmN0aW9uPiBpbiB0aGUgZHJpdmVyCiAgICAgICA8bWV0aG9kbmFtZT51bmxvYWQ8L21ldGhvZG5hbWU+IG9wZXJhdGlvbiBoYW5kbGVyLgogICAgIDwvcGFyYT4KKyAgICA8c2VjdDI+CisgICAgICA8dGl0bGU+VmVydGljYWwgQmxhbmtpbmcgYW5kIEludGVycnVwdCBIYW5kbGluZyBGdW5jdGlvbnMgUmVmZXJlbmNlPC90aXRsZT4KKyFFZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworICAgIDwvc2VjdDI+CiAgIDwvc2VjdDE+CiAKICAgPCEtLSBJbnRlcm5hbHM6IG9wZW4vY2xvc2UsIGZpbGUgb3BlcmF0aW9ucyBhbmQgaW9jdGxzIC0tPgpAQCAtMjg2OSwxNyArMzc2NCwxNiBAQAogICAgICAgICAgICAgPHRlcm0+RFJNX0lPQ1RMX01PREVTRVRfQ1RMPC90ZXJtPgogICAgICAgICAgICAgPGxpc3RpdGVtPgogICAgICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYXBwbGljYXRpb24gbGV2ZWwgZHJpdmVycyBiZWZvcmUgYW5kCi0gICAgICAgICAgICAgICAgYWZ0ZXIgbW9kZSBzZXR0aW5nLCBzaW5jZSBvbiBtYW55IGRldmljZXMgdGhlIHZlcnRpY2FsIGJsYW5rCi0gICAgICAgICAgICAgICAgY291bnRlciBpcyByZXNldCBhdCB0aGF0IHRpbWUuICBJbnRlcm5hbGx5LCB0aGUgRFJNIHNuYXBzaG90cwotICAgICAgICAgICAgICAgIHRoZSBsYXN0IHZibGFuayBjb3VudCB3aGVuIHRoZSBpb2N0bCBpcyBjYWxsZWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICBfRFJNX1BSRV9NT0RFU0VUIGNvbW1hbmQsIHNvIHRoYXQgdGhlIGNvdW50ZXIgd29uJ3QgZ28gYmFja3dhcmRzCi0gICAgICAgICAgICAgICAgKHdoaWNoIGlzIGRlYWx0IHdpdGggd2hlbiBfRFJNX1BPU1RfTU9ERVNFVCBpcyB1c2VkKS4KKwkJVGhpcyB3YXMgb25seSB1c2VkIGZvciB1c2VyLW1vZGUtc2V0dGluZCBkcml2ZXJzIGFyb3VuZAorCQltb2Rlc2V0dGluZyBjaGFuZ2VzIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8gdXBkYXRlIHRoZSB2YmxhbmsKKwkJaW50ZXJydXB0IGFmdGVyIG1vZGUgc2V0dGluZywgc2luY2Ugb24gbWFueSBkZXZpY2VzIHRoZSB2ZXJ0aWNhbAorCQlibGFuayBjb3VudGVyIGlzIHJlc2V0IHRvIDAgYXQgc29tZSBwb2ludCBkdXJpbmcgbW9kZXNldC4gTW9kZXJuCisJCWRyaXZlcnMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgYW55IG1vcmUgc2luY2Ugd2l0aCBrZXJuZWwgbW9kZQorCQlzZXR0aW5nIGl0IGlzIGEgbm8tb3AuCiAgICAgICAgICAgICAgIDwvcGFyYT4KICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgICAgIDwvdmFyaWFibGVsaXN0PgotPCEtLSFFZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMtLT4KICAgICAgIDwvcGFyYT4KICAgICA8L3NlY3QxPgogCkBAIC0yOTQyLDYgKzM4MzYsOTYgQEAKIAkgIHByb2JpbmcsIHNvIHRob3NlIHNlY3Rpb25zIGZ1bGx5IGFwcGx5LgogICAgICAgICA8L3BhcmE+CiAgICAgICA8L3NlY3QyPgorICAgICAgPHNlY3QyPgorICAgICAgICA8dGl0bGU+RFBJTzwvdGl0bGU+CishUGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggRFBJTworCTx0YWJsZSBpZD0iZHBpb3gyIj4KKwkgIDx0aXRsZT5EdWFsIGNoYW5uZWwgUEhZIChWTFYvQ0hWKTwvdGl0bGU+CisJICA8dGdyb3VwIGNvbHM9IjgiPgorCSAgICA8Y29sc3BlYyBjb2xuYW1lPSJjMCIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzEiIC8+CisJICAgIDxjb2xzcGVjIGNvbG5hbWU9ImMyIiAvPgorCSAgICA8Y29sc3BlYyBjb2xuYW1lPSJjMyIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzQiIC8+CisJICAgIDxjb2xzcGVjIGNvbG5hbWU9ImM1IiAvPgorCSAgICA8Y29sc3BlYyBjb2xuYW1lPSJjNiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzciIC8+CisJICAgIDxzcGFuc3BlYyBzcGFubmFtZT0iY2gwIiBuYW1lc3Q9ImMwIiBuYW1lZW5kPSJjMyIgLz4KKwkgICAgPHNwYW5zcGVjIHNwYW5uYW1lPSJjaDEiIG5hbWVzdD0iYzQiIG5hbWVlbmQ9ImM3IiAvPgorCSAgICA8c3BhbnNwZWMgc3Bhbm5hbWU9ImNoMHBjczAxIiBuYW1lc3Q9ImMwIiBuYW1lZW5kPSJjMSIgLz4KKwkgICAgPHNwYW5zcGVjIHNwYW5uYW1lPSJjaDBwY3MyMyIgbmFtZXN0PSJjMiIgbmFtZWVuZD0iYzMiIC8+CisJICAgIDxzcGFuc3BlYyBzcGFubmFtZT0iY2gxcGNzMDEiIG5hbWVzdD0iYzQiIG5hbWVlbmQ9ImM1IiAvPgorCSAgICA8c3BhbnNwZWMgc3Bhbm5hbWU9ImNoMXBjczIzIiBuYW1lc3Q9ImM2IiBuYW1lZW5kPSJjNyIgLz4KKwkgICAgPHRoZWFkPgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iY2gwIj5DSDA8L2VudHJ5PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMSI+Q0gxPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgPC90aGVhZD4KKwkgICAgPHRib2R5IHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMCI+Q01OL1BMTC9SRUY8L2VudHJ5PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMSI+Q01OL1BMTC9SRUY8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iY2gwcGNzMDEiPlBDUzAxPC9lbnRyeT4KKwkJPGVudHJ5IHNwYW5uYW1lPSJjaDBwY3MyMyI+UENTMjM8L2VudHJ5PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMXBjczAxIj5QQ1MwMTwvZW50cnk+CisJCTxlbnRyeSBzcGFubmFtZT0iY2gxcGNzMjMiPlBDUzIzPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+VFgwPC9lbnRyeT4KKwkJPGVudHJ5PlRYMTwvZW50cnk+CisJCTxlbnRyeT5UWDI8L2VudHJ5PgorCQk8ZW50cnk+VFgzPC9lbnRyeT4KKwkJPGVudHJ5PlRYMDwvZW50cnk+CisJCTxlbnRyeT5UWDE8L2VudHJ5PgorCQk8ZW50cnk+VFgyPC9lbnRyeT4KKwkJPGVudHJ5PlRYMzwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJjaDAiPkRESTA8L2VudHJ5PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMSI+RERJMTwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgIDwvdGJvZHk+CisJICA8L3Rncm91cD4KKwk8L3RhYmxlPgorCTx0YWJsZSBpZD0iZHBpb3gxIj4KKwkgIDx0aXRsZT5TaW5nbGUgY2hhbm5lbCBQSFkgKENIVik8L3RpdGxlPgorCSAgPHRncm91cCBjb2xzPSI0Ij4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzAiIC8+CisJICAgIDxjb2xzcGVjIGNvbG5hbWU9ImMxIiAvPgorCSAgICA8Y29sc3BlYyBjb2xuYW1lPSJjMiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzMiIC8+CisJICAgIDxzcGFuc3BlYyBzcGFubmFtZT0iY2gwIiBuYW1lc3Q9ImMwIiBuYW1lZW5kPSJjMyIgLz4KKwkgICAgPHNwYW5zcGVjIHNwYW5uYW1lPSJjaDBwY3MwMSIgbmFtZXN0PSJjMCIgbmFtZWVuZD0iYzEiIC8+CisJICAgIDxzcGFuc3BlYyBzcGFubmFtZT0iY2gwcGNzMjMiIG5hbWVzdD0iYzIiIG5hbWVlbmQ9ImMzIiAvPgorCSAgICA8dGhlYWQ+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJjaDAiPkNIMDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgIDwvdGhlYWQ+CisJICAgIDx0Ym9keSB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJjaDAiPkNNTi9QTEwvUkVGPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMHBjczAxIj5QQ1MwMTwvZW50cnk+CisJCTxlbnRyeSBzcGFubmFtZT0iY2gwcGNzMjMiPlBDUzIzPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+VFgwPC9lbnRyeT4KKwkJPGVudHJ5PlRYMTwvZW50cnk+CisJCTxlbnRyeT5UWDI8L2VudHJ5PgorCQk8ZW50cnk+VFgzPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImNoMCI+RERJMjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgIDwvdGJvZHk+CisJICA8L3Rncm91cD4KKwk8L3RhYmxlPgorICAgICAgPC9zZWN0Mj4KICAgICA8L3NlY3QxPgogCiAgICAgPHNlY3QxPgpAQCAtMjk1MCw2ICszOTM0LDExIEBACiAJVGhpcyBzZWN0aW9ucyBjb3ZlcnMgYWxsIHRoaW5ncyByZWxhdGVkIHRvIHRoZSBHRU0gaW1wbGVtZW50YXRpb24gaW4gdGhlCiAJaTkxNSBkcml2ZXIuCiAgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDI+CisgICAgICAgIDx0aXRsZT5CYXRjaGJ1ZmZlciBQYXJzaW5nPC90aXRsZT4KKyFQZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9jbWRfcGFyc2VyLmMgYmF0Y2ggYnVmZmVyIGNvbW1hbmQgcGFyc2VyCishSWRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jCisgICAgICA8L3NlY3QyPgogICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KIDwvcGFydD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRURJRC8xMDI0eDc2OC5TIGIvRG9jdW1lbnRhdGlvbi9FRElELzEwMjR4NzY4LlMKaW5kZXggNGI0ODZmZS4uNmYzZTRiNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9FRElELzEwMjR4NzY4LlMKKysrIGIvRG9jdW1lbnRhdGlvbi9FRElELzEwMjR4NzY4LlMKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgRFBJIDcyCiAjZGVmaW5lIFZGUkVRIDYwIC8qIEh6ICovCiAjZGVmaW5lIFRJTUlOR19OQU1FICJMaW51eCBYR0EiCi0jZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlOR1NfQklUUyAweDA4IC8qIEJpdCAzIC0+IDEwMjR4NzY4IEA2MCBIeiAqLworI2RlZmluZSBFU1RBQkxJU0hFRF9USU1JTkcyX0JJVFMgMHgwOCAvKiBCaXQgMyAtPiAxMDI0eDc2OCBANjAgSHogKi8KICNkZWZpbmUgSFNZTkNfUE9MIDAKICNkZWZpbmUgVlNZTkNfUE9MIDAKICNkZWZpbmUgQ1JDIDB4NTUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRURJRC8xMjgweDEwMjQuUyBiL0RvY3VtZW50YXRpb24vRURJRC8xMjgweDEwMjQuUwppbmRleCBhMjc5OWZlMy4uYmQ5YmVmMmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRURJRC8xMjgweDEwMjQuUworKysgYi9Eb2N1bWVudGF0aW9uL0VESUQvMTI4MHgxMDI0LlMKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgRFBJIDcyCiAjZGVmaW5lIFZGUkVRIDYwIC8qIEh6ICovCiAjZGVmaW5lIFRJTUlOR19OQU1FICJMaW51eCBTWEdBIgotI2RlZmluZSBFU1RBQkxJU0hFRF9USU1JTkdTX0JJVFMgMHgwMCAvKiBub25lICovCisvKiBObyBFU1RBQkxJU0hFRF9USU1JTkd4X0JJVFMgKi8KICNkZWZpbmUgSFNZTkNfUE9MIDEKICNkZWZpbmUgVlNZTkNfUE9MIDEKICNkZWZpbmUgQ1JDIDB4YTAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRURJRC8xNjAweDEyMDAuUyBiL0RvY3VtZW50YXRpb24vRURJRC8xNjAweDEyMDAuUwppbmRleCAwZGVkNjRjLi5hNDUxMDFjNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9FRElELzE2MDB4MTIwMC5TCisrKyBiL0RvY3VtZW50YXRpb24vRURJRC8xNjAweDEyMDAuUwpAQCAtMzYsNyArMzYsNyBAQAogI2RlZmluZSBEUEkgNzIKICNkZWZpbmUgVkZSRVEgNjAgLyogSHogKi8KICNkZWZpbmUgVElNSU5HX05BTUUgIkxpbnV4IFVYR0EiCi0jZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlOR1NfQklUUyAweDAwIC8qIG5vbmUgKi8KKy8qIE5vIEVTVEFCTElTSEVEX1RJTUlOR3hfQklUUyAqLwogI2RlZmluZSBIU1lOQ19QT0wgMQogI2RlZmluZSBWU1lOQ19QT0wgMQogI2RlZmluZSBDUkMgMHg5ZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9FRElELzE2ODB4MTA1MC5TIGIvRG9jdW1lbnRhdGlvbi9FRElELzE2ODB4MTA1MC5TCmluZGV4IDk2ZjY3Y2EuLmIwZDdjNjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRURJRC8xNjgweDEwNTAuUworKysgYi9Eb2N1bWVudGF0aW9uL0VESUQvMTY4MHgxMDUwLlMKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgRFBJIDk2CiAjZGVmaW5lIFZGUkVRIDYwIC8qIEh6ICovCiAjZGVmaW5lIFRJTUlOR19OQU1FICJMaW51eCBXU1hHQSIKLSNkZWZpbmUgRVNUQUJMSVNIRURfVElNSU5HU19CSVRTIDB4MDAgLyogbm9uZSAqLworLyogTm8gRVNUQUJMSVNIRURfVElNSU5HeF9CSVRTICovCiAjZGVmaW5lIEhTWU5DX1BPTCAxCiAjZGVmaW5lIFZTWU5DX1BPTCAxCiAjZGVmaW5lIENSQyAweDI2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0VESUQvMTkyMHgxMDgwLlMgYi9Eb2N1bWVudGF0aW9uL0VESUQvMTkyMHgxMDgwLlMKaW5kZXggMzZlZDVkNS4uMzA4NDM1NWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRURJRC8xOTIweDEwODAuUworKysgYi9Eb2N1bWVudGF0aW9uL0VESUQvMTkyMHgxMDgwLlMKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgRFBJIDk2CiAjZGVmaW5lIFZGUkVRIDYwIC8qIEh6ICovCiAjZGVmaW5lIFRJTUlOR19OQU1FICJMaW51eCBGSEQiCi0jZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlOR1NfQklUUyAweDAwIC8qIG5vbmUgKi8KKy8qIE5vIEVTVEFCTElTSEVEX1RJTUlOR3hfQklUUyAqLwogI2RlZmluZSBIU1lOQ19QT0wgMQogI2RlZmluZSBWU1lOQ19QT0wgMQogI2RlZmluZSBDUkMgMHgwNQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9FRElELzgwMHg2MDAuUyBiL0RvY3VtZW50YXRpb24vRURJRC84MDB4NjAwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0NGUyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRURJRC84MDB4NjAwLlMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAgIDgwMHg2MDAuUzogRURJRCBkYXRhIHNldCBmb3Igc3RhbmRhcmQgODAweDYwMCA2MCBIeiBtb25pdG9yCisKKyAgIENvcHlyaWdodCAoQykgMjAxMSBDYXJzdGVuIEVtZGUgPEMuRW1kZUBvc2FkbC5vcmc+CisgICBDb3B5cmlnaHQgKEMpIDIwMTQgTGluYXJvIExpbWl0ZWQKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKy8qIEVESUQgKi8KKyNkZWZpbmUgVkVSU0lPTiAxCisjZGVmaW5lIFJFVklTSU9OIDMKKworLyogRGlzcGxheSAqLworI2RlZmluZSBDTE9DSyA0MDAwMCAvKiBrSHogKi8KKyNkZWZpbmUgWFBJWCA4MDAKKyNkZWZpbmUgWVBJWCA2MDAKKyNkZWZpbmUgWFlfUkFUSU8gWFlfUkFUSU9fNF8zCisjZGVmaW5lIFhCTEFOSyAyNTYKKyNkZWZpbmUgWUJMQU5LIDI4CisjZGVmaW5lIFhPRkZTRVQgNDAKKyNkZWZpbmUgWFBVTFNFIDEyOAorI2RlZmluZSBZT0ZGU0VUICg2MysxKQorI2RlZmluZSBZUFVMU0UgKDYzKzQpCisjZGVmaW5lIERQSSA3MgorI2RlZmluZSBWRlJFUSA2MCAvKiBIeiAqLworI2RlZmluZSBUSU1JTkdfTkFNRSAiTGludXggU1ZHQSIKKyNkZWZpbmUgRVNUQUJMSVNIRURfVElNSU5HMV9CSVRTIDB4MDEgLyogQml0IDA6IDgwMHg2MDAgQCA2MEh6ICovCisjZGVmaW5lIEhTWU5DX1BPTCAxCisjZGVmaW5lIFZTWU5DX1BPTCAxCisjZGVmaW5lIENSQyAweGMyCisKKyNpbmNsdWRlICJlZGlkLlMiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0VESUQvSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9FRElEL0hPV1RPLnR4dAppbmRleCA3MTQ2ZGIxLi44MzVkYjMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0VESUQvSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vRURJRC9IT1dUTy50eHQKQEAgLTE4LDcgKzE4LDcgQEAKIGluZGl2aWR1YWxseSBwcmVwYXJlZCBvciBjb3JyZWN0ZWQgRURJRCBkYXRhIHNldCBpbiB0aGUgL2xpYi9maXJtd2FyZQogZGlyZWN0b3J5IGZyb20gd2hlcmUgaXQgaXMgbG9hZGVkIHZpYSB0aGUgZmlybXdhcmUgaW50ZXJmYWNlLiBUaGUgY29kZQogKHNlZSBkcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jKSBjb250YWlucyBidWlsdC1pbiBkYXRhIHNldHMgZm9yCi1jb21tb25seSB1c2VkIHNjcmVlbiByZXNvbHV0aW9ucyAoMTAyNHg3NjgsIDEyODB4MTAyNCwgMTYwMHgxMjAwLAorY29tbW9ubHkgdXNlZCBzY3JlZW4gcmVzb2x1dGlvbnMgKDgwMHg2MDAsIDEwMjR4NzY4LCAxMjgweDEwMjQsIDE2MDB4MTIwMCwKIDE2ODB4MTA1MCwgMTkyMHgxMDgwKSBhcyBiaW5hcnkgYmxvYnMsIGJ1dCB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGRvZXMKIG5vdCBjb250YWluIGNvZGUgdG8gY3JlYXRlIHRoZXNlIGRhdGEuIEluIG9yZGVyIHRvIGVsdWNpZGF0ZSB0aGUgb3JpZ2luCiBvZiB0aGUgYnVpbHQtaW4gYmluYXJ5IEVESUQgYmxvYnMgYW5kIHRvIGZhY2lsaXRhdGUgdGhlIGNyZWF0aW9uIG9mCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0VESUQvZWRpZC5TIGIvRG9jdW1lbnRhdGlvbi9FRElEL2VkaWQuUwppbmRleCBlYTk3YWUyLi43YWMwMzI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0VESUQvZWRpZC5TCisrKyBiL0RvY3VtZW50YXRpb24vRURJRC9lZGlkLlMKQEAgLTMzLDYgKzMzLDE3IEBACiAjZGVmaW5lIFhZX1JBVElPXzVfNAkwYjEwCiAjZGVmaW5lIFhZX1JBVElPXzE2XzkJMGIxMQogCisvKiBQcm92aWRlIGRlZmF1bHRzIGZvciB0aGUgdGltaW5nIGJpdHMgKi8KKyNpZm5kZWYgRVNUQUJMSVNIRURfVElNSU5HMV9CSVRTCisjZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlORzFfQklUUyAweDAwCisjZW5kaWYKKyNpZm5kZWYgRVNUQUJMSVNIRURfVElNSU5HMl9CSVRTCisjZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlORzJfQklUUyAweDAwCisjZW5kaWYKKyNpZm5kZWYgRVNUQUJMSVNIRURfVElNSU5HM19CSVRTCisjZGVmaW5lIEVTVEFCTElTSEVEX1RJTUlORzNfQklUUyAweDAwCisjZW5kaWYKKwogI2RlZmluZSBtZmduYW1lMmlkKHYxLHYyLHYzKSBcCiAJKCgoKHYxLSdAJykmMHgxZik8PDEwKSsoKCh2Mi0nQCcpJjB4MWYpPDw1KSsoKHYzLSdAJykmMHgxZikpCiAjZGVmaW5lIHN3YXAxNih2MSkgKCh2MT4+OCkrKCh2MSYweGZmKTw8OCkpCkBAIC0xMzksNyArMTUwLDcgQEAKICAgIEJpdCAyCTY0MHg0ODAgQCA3NSBIegogICAgQml0IDEJODAweDYwMCBAIDU2IEh6CiAgICBCaXQgMAk4MDB4NjAwIEAgNjAgSHogKi8KLWVzdGJsX3RpbWluZzE6CS5ieXRlCTB4MDAKK2VzdGJsX3RpbWluZzE6CS5ieXRlCUVTVEFCTElTSEVEX1RJTUlORzFfQklUUwogCiAvKiBCaXQgNwk4MDB4NjAwIEAgNzIgSHoKICAgIEJpdCA2CTgwMHg2MDAgQCA3NSBIegpAQCAtMTQ5LDExICsxNjAsMTEgQEAKICAgIEJpdCAyCTEwMjR4NzY4IEAgNzIgSHoKICAgIEJpdCAxCTEwMjR4NzY4IEAgNzUgSHoKICAgIEJpdCAwCTEyODB4MTAyNCBAIDc1IEh6ICovCi1lc3RibF90aW1pbmcyOgkuYnl0ZQlFU1RBQkxJU0hFRF9USU1JTkdTX0JJVFMKK2VzdGJsX3RpbWluZzI6CS5ieXRlCUVTVEFCTElTSEVEX1RJTUlORzJfQklUUwogCiAvKiBCaXQgNwkxMTUyeDg3MCBAIDc1IEh6IChBcHBsZSBNYWNpbnRvc2ggSUkpCiAgICBCaXRzIDYtMCAJT3RoZXIgbWFudWZhY3R1cmVyLXNwZWNpZmljIGRpc3BsYXkgbW9kICovCi1lc3RibF90aW1pbmczOgkuYnl0ZQkweDAwCitlc3RibF90aW1pbmczOgkuYnl0ZQlFU1RBQkxJU0hFRF9USU1JTkczX0JJVFMKIAogLyogU3RhbmRhcmQgdGltaW5nICovCiAvKiBYIHJlc29sdXRpb24sIGxlc3MgMzEsIGRpdmlkZWQgYnkgOCAoMjU2LTIyODggcGl4ZWxzKSAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHUtZHJpdmVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAppbmRleCBiMDQ1ZmU1Li4xNGY0ZTYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dApAQCAtMjYsNiArMjYsNyBAQAogMS40ICB0YXJnZXQvdGFyZ2V0X2luZGV4IG9yIHNldHBvbGljeT8KIDEuNSAgdGFyZ2V0L3RhcmdldF9pbmRleAogMS42ICBzZXRwb2xpY3kKKzEuNyAgZ2V0X2ludGVybWVkaWF0ZSBhbmQgdGFyZ2V0X2ludGVybWVkaWF0ZQogMi4gICBGcmVxdWVuY3kgVGFibGUgSGVscGVycwogCiAKQEAgLTc5LDYgKzgwLDEwIEBACiAJCQkJInN0cnVjdCBmcmVxX2F0dHIiIHdoaWNoIGFsbG93IHRvCiAJCQkJZXhwb3J0IHZhbHVlcyB0byBzeXNmcy4KIAorY3B1ZnJlcV9kcml2ZXIuZ2V0X2ludGVybWVkaWF0ZQorYW5kIHRhcmdldF9pbnRlcm1lZGlhdGUJCVVzZWQgdG8gc3dpdGNoIHRvIHN0YWJsZSBmcmVxdWVuY3kgd2hpbGUKKwkJCQljaGFuZ2luZyBDUFUgZnJlcXVlbmN5LgorCiAKIDEuMiBQZXItQ1BVIEluaXRpYWxpemF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTUxLDcgKzE1Niw3IEBACiBsaW1pdHMgb24gdGhlaXIgb3duLiBUaGVzZSBzaGFsbCB1c2UgdGhlIC0+c2V0cG9saWN5IGNhbGwKIAogCi0xLjQuIHRhcmdldC90YXJnZXRfaW5kZXgKKzEuNS4gdGFyZ2V0L3RhcmdldF9pbmRleAogLS0tLS0tLS0tLS0tLQogCiBUaGUgdGFyZ2V0X2luZGV4IGNhbGwgaGFzIHR3byBhcmd1bWVudHM6IHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LApAQCAtMTYwLDYgKzE2NSw5IEBACiBUaGUgQ1BVZnJlcSBkcml2ZXIgbXVzdCBzZXQgdGhlIG5ldyBmcmVxdWVuY3kgd2hlbiBjYWxsZWQgaGVyZS4gVGhlCiBhY3R1YWwgZnJlcXVlbmN5IG11c3QgYmUgZGV0ZXJtaW5lZCBieSBmcmVxX3RhYmxlW2luZGV4XS5mcmVxdWVuY3kuCiAKK0l0IHNob3VsZCBhbHdheXMgcmVzdG9yZSB0byBlYXJsaWVyIGZyZXF1ZW5jeSAoaS5lLiBwb2xpY3ktPnJlc3RvcmVfZnJlcSkgaW4KK2Nhc2Ugb2YgZXJyb3JzLCBldmVuIGlmIHdlIHN3aXRjaGVkIHRvIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgZWFybGllci4KKwogRGVwcmVjYXRlZDoKIC0tLS0tLS0tLS0KIFRoZSB0YXJnZXQgY2FsbCBoYXMgdGhyZWUgYXJndW1lbnRzOiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKQEAgLTE3OSw3ICsxODcsNyBAQAogZm9yIGRldGFpbHMuCiAKIAotMS41IHNldHBvbGljeQorMS42IHNldHBvbGljeQogLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBzZXRwb2xpY3kgY2FsbCBvbmx5IHRha2VzIGEgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgYXMKQEAgLTE5MCw2ICsxOTgsMjMgQEAKIHBvd2Vyc2F2aW5nLW9yaWVudGVkIHNldHRpbmcgd2hlbiBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkUuIEFsc28gY2hlY2sKIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaW4gZHJpdmVycy9jcHVmcmVxL2xvbmdydW4uYwogCisxLjcgZ2V0X2ludGVybWVkaWF0ZSBhbmQgdGFyZ2V0X2ludGVybWVkaWF0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT25seSBmb3IgZHJpdmVycyB3aXRoIHRhcmdldF9pbmRleCgpIGFuZCBDUFVGUkVRX0FTWU5DX05PVElGSUNBVElPTiB1bnNldC4KKworZ2V0X2ludGVybWVkaWF0ZSBzaG91bGQgcmV0dXJuIGEgc3RhYmxlIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgcGxhdGZvcm0gd2FudHMgdG8KK3N3aXRjaCB0bywgYW5kIHRhcmdldF9pbnRlcm1lZGlhdGUoKSBzaG91bGQgc2V0IENQVSB0byB0byB0aGF0IGZyZXF1ZW5jeSwgYmVmb3JlCitqdW1waW5nIHRvIHRoZSBmcmVxdWVuY3kgY29ycmVzcG9uZGluZyB0byAnaW5kZXgnLiBDb3JlIHdpbGwgdGFrZSBjYXJlIG9mCitzZW5kaW5nIG5vdGlmaWNhdGlvbnMgYW5kIGRyaXZlciBkb2Vzbid0IGhhdmUgdG8gaGFuZGxlIHRoZW0gaW4KK3RhcmdldF9pbnRlcm1lZGlhdGUoKSBvciB0YXJnZXRfaW5kZXgoKS4KKworRHJpdmVycyBjYW4gcmV0dXJuICcwJyBmcm9tIGdldF9pbnRlcm1lZGlhdGUoKSBpbiBjYXNlIHRoZXkgZG9uJ3Qgd2lzaCB0byBzd2l0Y2gKK3RvIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgZm9yIHNvbWUgdGFyZ2V0IGZyZXF1ZW5jeS4gSW4gdGhhdCBjYXNlIGNvcmUgd2lsbAorZGlyZWN0bHkgY2FsbCAtPnRhcmdldF9pbmRleCgpLgorCitOT1RFOiAtPnRhcmdldF9pbmRleCgpIHNob3VsZCByZXN0b3JlIHRvIHBvbGljeS0+cmVzdG9yZV9mcmVxIGluIGNhc2Ugb2YKK2ZhaWx1cmVzIGFzIGNvcmUgd291bGQgc2VuZCBub3RpZmljYXRpb25zIGZvciB0aGF0LgogCiAKIDIuIEZyZXF1ZW5jeSBUYWJsZSBIZWxwZXJzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3B1L252aWRpYSx0ZWdyYTIwLWhvc3QxeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3B1L252aWRpYSx0ZWdyYTIwLWhvc3QxeC50eHQKaW5kZXggZWZhOGI4NC4uYjQ4ZjRlZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwdS9udmlkaWEsdGVncmEyMC1ob3N0MXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncHUvbnZpZGlhLHRlZ3JhMjAtaG9zdDF4LnR4dApAQCAtMTM2LDYgKzEzNiw3IEBACiAgIC0gY29tcGF0aWJsZTogIm52aWRpYSx0ZWdyYTxjaGlwPi1oZG1pIgogICAtIHJlZzogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGNvbnRyb2xsZXIncyByZWdpc3RlcnMuCiAgIC0gaW50ZXJydXB0czogVGhlIGludGVycnVwdCBvdXRwdXRzIGZyb20gdGhlIGNvbnRyb2xsZXIuCisgIC0gaGRtaS1zdXBwbHk6IHN1cHBseSBmb3IgdGhlICs1ViBIRE1JIGNvbm5lY3RvciBwaW4KICAgLSB2ZGQtc3VwcGx5OiByZWd1bGF0b3IgZm9yIHN1cHBseSB2b2x0YWdlCiAgIC0gcGxsLXN1cHBseTogcmVndWxhdG9yIGZvciBQTEwKICAgLSBjbG9ja3M6IE11c3QgY29udGFpbiBhbiBlbnRyeSBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcy4KQEAgLTE4MCw2ICsxODEsNyBAQAogICAgIFNlZSAuLi9yZXNldC9yZXNldC50eHQgZm9yIGRldGFpbHMuCiAgIC0gcmVzZXQtbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CiAgICAgLSBkc2kKKyAgLSBhdmRkLWRzaS1zdXBwbHk6IHBoYW5kbGUgb2YgYSBzdXBwbHkgdGhhdCBwb3dlcnMgdGhlIERTSSBjb250cm9sbGVyCiAgIC0gbnZpZGlhLG1pcGktY2FsaWJyYXRlOiBTaG91bGQgY29udGFpbiBhIHBoYW5kbGUgYW5kIGEgc3BlY2lmaWVyIHNwZWNpZnlpbmcKICAgICB3aGljaCBwYWRzIGFyZSB1c2VkIGJ5IHRoaXMgRFNJIG91dHB1dCBhbmQgbmVlZCB0byBiZSBjYWxpYnJhdGVkLiBTZWUgYWxzbwogICAgIC4uL21pcGkvbnZpZGlhLHRlZ3JhMTE0LW1pcGkudHh0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1scDU1eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1scDU1eHgudHh0CmluZGV4IGM1NWI4YzAuLjFiNjZhNDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtbHA1NXh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWxwNTV4eC50eHQKQEAgLTEsNyArMSwxMyBAQAogQmluZGluZyBmb3IgVEkvTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMUDU1eHggTGVkIERyaXZlcnMKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogIm5hdGlvbmFsLGxwNTUyMSIgb3IgIm5hdGlvbmFsLGxwNTUyMyIgb3IgInRpLGxwNTU2MiIgb3IgInRpLGxwODUwMSIKKy0gY29tcGF0aWJsZTogb25lIG9mCisJbmF0aW9uYWwsbHA1NTIxCisJbmF0aW9uYWwsbHA1NTIzCisJdGksbHA1NTIzMQorCXRpLGxwNTU2MgorCXRpLGxwODUwMQorCiAtIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MKIC0gY2xvY2stbW9kZTogSW5wdXQgY2xvY2sgbW9kZSwgKDA6IGF1dG9tb2RlLCAxOiBpbnRlcm5hbCwgMjogZXh0ZXJuYWwpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcHdtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcHdtLnR4dAppbmRleCA3Mjk3MTA3Li42YzY1ODNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXB3bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1wd20udHh0CkBAIC0xMyw2ICsxMyw4IEBACiAgIEZvciB0aGUgcHdtcyBhbmQgcHdtLW5hbWVzIHByb3BlcnR5IHBsZWFzZSByZWZlciB0bzoKICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3B3bS9wd20udHh0CiAtIG1heC1icmlnaHRuZXNzIDogTWF4aW11bSBicmlnaHRuZXNzIHBvc3NpYmxlIGZvciB0aGUgTEVECistIGFjdGl2ZS1sb3cgOiAob3B0aW9uYWwpIEZvciBQV01zIHdoZXJlIHRoZSBMRUQgaXMgd2lyZWQgdG8gc3VwcGx5CisgIHJhdGhlciB0aGFuIGdyb3VuZC4KIC0gbGFiZWwgOiAgKG9wdGlvbmFsKQogICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiAgKG9wdGlvbmFsKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90d2w0MDMwLXBvd2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvdHdsNDAzMC1wb3dlci50eHQKaW5kZXggOGUxNWVjMy4uYjllZTdiOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90d2w0MDMwLXBvd2VyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3R3bDQwMzAtcG93ZXIudHh0CkBAIC01LDcgKzUsMjIgQEAKIGJpbmRpbmcgb25seSBzdXBwb3J0cyB0aGUgY29tcGxldGUgc2h1dGRvd24gb2YgdGhlIHN5c3RlbSBhZnRlciBwb3dlcm9mZi4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IG11c3QgYmUgInRpLHR3bDQwMzAtcG93ZXIiCistIGNvbXBhdGlibGUgOiBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisJInRpLHR3bDQwMzAtcG93ZXIiCisJInRpLHR3bDQwMzAtcG93ZXItcmVzZXQiCisJInRpLHR3bDQwMzAtcG93ZXItaWRsZSIKKwkidGksdHdsNDAzMC1wb3dlci1pZGxlLW9zYy1vZmYiCisKK1RoZSB1c2Ugb2YgdGksdHdsNDAzMC1wb3dlci1yZXNldCBpcyByZWNvbW1lbmRlZCBhdCBsZWFzdCBvbgorMzUzMCB0aGF0IG5lZWRzIGEgc3BlY2lhbCBjb25maWd1cmF0aW9uIGZvciB3YXJtIHJlc2V0IHRvIHdvcmsuCisKK1doZW4gdXNpbmcgdGksdHdsNDAzMC1wb3dlci1pZGxlLCB0aGUgVEkgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbgorZm9yIGlkbGUgbW9kZXMgaXMgbG9hZGVkIHRvIHRoZSB0bHc0MDMwIFBNSUMuCisKK1doZW4gdXNpbmcgdGksdHdsNDAzMC1wb3dlci1pZGxlLW9zYy1vZmYsIHRoZSBUSSByZWNvbW1lbmRlZAorY29uZmlndXJhdGlvbiBpcyB1c2VkIHdpdGggdGhlIGV4dGVybmFsIG9zY2lsbGF0b3IgYmVpbmcgc2h1dAorZG93biBkdXJpbmcgb2ZmLWlkbGUuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHdvcmsgb24gYWxsIGJvYXJkcworZGVwZW5kaW5nIG9uIGhvdyB0aGUgZXh0ZXJuYWwgb3NjaWxsYXRvciBpcyB3aXJlZC4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gdGksdXNlX3Bvd2Vyb2ZmOiBXaXRoIHRoaXMgZmxhZywgdGhlIGNoaXAgd2lsbCBpbml0aWF0ZXMgYW4gQUNUSVZFLXRvLU9GRiBvcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbWQteGdiZS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbWQteGdiZS1waHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWVkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FtZC14Z2JlLXBoeS50eHQKQEAgLTAsMCArMSwxNyBAQAorKiBBTUQgMTBHYkUgUEhZIGRyaXZlciAoYW1kLXhnYmUtcGh5KQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgImFtZCx4Z2JlLXBoeS1zZWF0dGxlLXYxYSIgYW5kCisgICJldGhlcm5ldC1waHktaWVlZTgwMi4zLWM0NSIKKy0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UKKyAgIC0gU2VyRGVzIFJ4L1R4IHJlZ2lzdGVycworICAgLSBTZXJEZXMgaW50ZWdyYXRpb24gcmVnaXN0ZXJzICgxLzIpCisgICAtIFNlckRlcyBpbnRlZ3JhdGlvbiByZWdpc3RlcnMgKDIvMikKKworRXhhbXBsZToKKwl4Z2JlX3BoeUBlMTI0MDgwMCB7CisJCWNvbXBhdGlibGUgPSAiYW1kLHhnYmUtcGh5LXNlYXR0bGUtdjFhIiwgImV0aGVybmV0LXBoeS1pZWVlODAyLjMtYzQ1IjsKKwkJcmVnID0gPDAgMHhlMTI0MDgwMCAwIDB4MDA0MDA+LAorCQkgICAgICA8MCAweGUxMjUwMDAwIDAgMHgwMDA2MD4sCisJCSAgICAgIDwwIDB4ZTEyNTAwODAgMCAweDAwMDA0PjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbWQteGdiZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FtZC14Z2JlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBjNzkwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hbWQteGdiZS50eHQKQEAgLTAsMCArMSwzNCBAQAorKiBBTUQgMTBHYkUgZHJpdmVyIChhbWQteGdiZSkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJhbWQseGdiZS1zZWF0dGxlLXYxYSIKKy0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UKKyAgIC0gTUFDIHJlZ2lzdGVycworICAgLSBQQ1MgcmVnaXN0ZXJzCistIGludGVycnVwdC1wYXJlbnQ6IFNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisgIHRoYXQgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UKKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gdGhlIGFtZC14Z2JlIGludGVycnVwdAorLSBjbG9ja3M6IFNob3VsZCBiZSB0aGUgRE1BIGNsb2NrIGZvciB0aGUgYW1kLXhnYmUgZGV2aWNlICh1c2VkIGZvcgorICBjYWxjdWxhdGluZyB0aGUgY29ycmVjdCBSeCBpbnRlcnJ1cHQgd2F0Y2hkb2cgdGltZXIgdmFsdWUgb24gYSBETUEKKyAgY2hhbm5lbCBmb3IgY29hbGVzY2luZykKKy0gY2xvY2stbmFtZXM6IFNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgRE1BIGNsb2NrLCAiZG1hX2NsayIKKy0gcGh5LWhhbmRsZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorLSBwaHktbW9kZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBtYWMtYWRkcmVzczogbWFjIGFkZHJlc3MgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGRldmljZS4gQ2FuIGJlIG92ZXJyaWRkZW4KKyAgYnkgVUVGSS4KKworRXhhbXBsZToKKwl4Z2JlQGUwNzAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhbWQseGdiZS1zZWF0dGxlLXYxYSI7CisJCXJlZyA9IDwwIDB4ZTA3MDAwMDAgMCAweDgwMDAwPiwKKwkJICAgICAgPDAgMHhlMDc4MDAwMCAwIDB4ODAwMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCQlpbnRlcnJ1cHRzID0gPDAgMzI1IDQ+OworCQljbG9ja3MgPSA8JnhnYmVfY2xrPjsKKwkJY2xvY2stbmFtZXMgPSAiZG1hX2NsayI7CisJCXBoeS1oYW5kbGUgPSA8JnBoeT47CisJCXBoeS1tb2RlID0gInhnbWlpIjsKKwkJbWFjLWFkZHJlc3MgPSBbIDAyIGExIGEyIGEzIGE0IGE1IF07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJvYWRjb20tYmNtZ2VuZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icm9hZGNvbS1iY21nZW5ldC50eHQKaW5kZXggZjJmZWJiOS4uNDUxZmVmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icm9hZGNvbS1iY21nZW5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icm9hZGNvbS1iY21nZW5ldC50eHQKQEAgLTI0LDcgKzI0LDcgQEAKIC0gZml4ZWQtbGluazogV2hlbiB0aGUgR0VORVQgaW50ZXJmYWNlIGlzIGNvbm5lY3RlZCB0byBhIE1vQ0EgaGFyZHdhcmUgYmxvY2sgb3IKICAgd2hlbiBvcGVyYXRpbmcgaW4gYSBSR01JSSB0byBSR01JSSB0eXBlIG9mIGNvbm5lY3Rpb24sIG9yIHdoZW4gdGhlIE1ESU8gYnVzIGlzCiAgIHZvbHVudGFyaWx5IGRpc2FibGVkLCB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSAiZml4ZWQgbGluayIuCi0gIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZzbC10c2VjLXBoeS50eHQgZm9yIGluZm9ybWF0aW9uIG9uCisgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZpeGVkLWxpbmsudHh0IGZvciBpbmZvcm1hdGlvbiBvbgogICB0aGUgcHJvcGVydHkgc3BlY2lmaWNzCiAKIFJlcXVpcmVkIGNoaWxkIG5vZGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icm9hZGNvbS1zeXN0ZW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJvYWRjb20tc3lzdGVtcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4M2VhOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJvYWRjb20tc3lzdGVtcG9ydC50eHQKQEAgLTAsMCArMSwyOSBAQAorKiBCcm9hZGNvbSBCQ003eHh4IEV0aGVybmV0IFN5c3RlbXBvcnQgQ29udHJvbGxlciAoU1lTVEVNUE9SVCkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlIG9uZSBvZiAiYnJjbSxzeXN0ZW1wb3J0LXYxLjAwIiBvciAiYnJjbSxzeXN0ZW1wb3J0IgorLSByZWc6IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorLSBpbnRlcnJ1cHRzOiBpbnRlcnJ1cHRzIGZvciB0aGUgZGV2aWNlLCBmaXJzdCBjZWxsIG11c3QgYmUgZm9yIHRoZSB0aGUgcngKKyAgaW50ZXJydXB0cywgYW5kIHRoZSBzZWNvbmQgY2VsbCBzaG91bGQgYmUgZm9yIHRoZSB0cmFuc21pdCBxdWV1ZXMKKy0gbG9jYWwtbWFjLWFkZHJlc3M6IEV0aGVybmV0IE1BQyBhZGRyZXNzICg0OCBiaXRzKSBvZiB0aGlzIGFkYXB0ZXIKKy0gcGh5LW1vZGU6IFNob3VsZCBiZSBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBQSFkgaW50ZXJmYWNlIHRvIHRoZQorICBFdGhlcm5ldCBzd2l0Y2gvUEhZLCBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKKy0gZml4ZWQtbGluazogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZml4ZWQtbGluay50eHQgZm9yCisgIHRoZSBwcm9wZXJ0eSBzcGVjaWZpYyBkZXRhaWxzCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHN5c3RlbXBvcnQsbnVtLXRpZXIyLWFyYjogbnVtYmVyIG9mIHRpZXIgMiBhcmJpdGVycywgYW4gaW50ZWdlcgorLSBzeXN0ZW1wb3J0LG51bS10aWVyMS1hcmI6IG51bWJlciBvZiB0aWVyIDEgYXJiaXRlcnMsIGFuIGludGVnZXIKKy0gc3lzdGVtcG9ydCxudW0tdHhxOiBudW1iZXIgb2YgSFcgdHJhbnNtaXQgcXVldWVzLCBhbiBpbnRlZ2VyCistIHN5c3RlbXBvcnQsbnVtLXJ4cTogbnVtYmVyIG9mIEhXIHJlY2VpdmUgcXVldWVzLCBhbiBpbnRlZ2VyCisKK0V4YW1wbGU6CitldGhlcm5ldEBmMDRhMDAwMCB7CisJY29tcGF0aWJsZSA9ICJicmNtLHN5c3RlbXBvcnQtdjEuMDAiOworCXJlZyA9IDwweGYwNGEwMDAwIDB4NDY1MD47CisJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJZml4ZWQtbGluayA9IDwwIDEgMTAwMCAwIDA+OworCXBoeS1tb2RlID0gImdtaWkiOworCWludGVycnVwdHMgPSA8MHgwIDB4MTYgMHgwPiwKKwkJPDB4MCAweDE3IDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jYW4veGlsaW54X2Nhbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi94aWxpbnhfY2FuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM4ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jYW4veGlsaW54X2Nhbi50eHQKQEAgLTAsMCArMSw0NCBAQAorWGlsaW54IEF4aSBDQU4vWnlucSBDQU5QUyBjb250cm9sbGVyIERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgInhsbngsenlucS1jYW4tMS4wIiBmb3IgWnlucSBDQU4KKwkJCSAgY29udHJvbGxlcnMgYW5kICJ4bG54LGF4aS1jYW4tMS4wMC5hIiBmb3IgQXhpIENBTgorCQkJICBjb250cm9sbGVycy4KKy0gcmVnCQkJOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIEF4aSBDQU4vWnlucQorCQkJICBDQU5QUyByZWdpc3RlcnMgbWFwLgorLSBpbnRlcnJ1cHRzCQk6IFByb3BlcnR5IHdpdGggYSB2YWx1ZSBkZXNjcmliaW5nIHRoZSBpbnRlcnJ1cHQKKwkJCSAgbnVtYmVyLgorLSBpbnRlcnJ1cHQtcGFyZW50CTogTXVzdCBiZSBjb3JlIGludGVycnVwdCBjb250cm9sbGVyCistIGNsb2NrLW5hbWVzCQk6IExpc3Qgb2YgaW5wdXQgY2xvY2sgbmFtZXMgLSAiY2FuX2NsayIsICJwY2xrIgorCQkJICAoRm9yIENBTlBTKSwgImNhbl9jbGsiICwgInNfYXhpX2FjbGsiKEZvciBBWEkgQ0FOKQorCQkJICAoU2VlIGNsb2NrIGJpbmRpbmdzIGZvciBkZXRhaWxzKS4KKy0gY2xvY2tzCQk6IENsb2NrIHBoYW5kbGVzIChzZWUgY2xvY2sgYmluZGluZ3MgZm9yIGRldGFpbHMpLgorLSB0eC1maWZvLWRlcHRoCQk6IENhbiBUeCBmaWZvIGRlcHRoLgorLSByeC1maWZvLWRlcHRoCQk6IENhbiBSeCBmaWZvIGRlcHRoLgorCisKK0V4YW1wbGU6CisKK0ZvciBaeW5xIENBTlBTIER0cyBmaWxlOgorCXp5bnFfY2FuXzA6IGNhbkBlMDAwODAwMCB7CisJCQljb21wYXRpYmxlID0gInhsbngsenlucS1jYW4tMS4wIjsKKwkJCWNsb2NrcyA9IDwmY2xrYyAxOT4sIDwmY2xrYyAzNj47CisJCQljbG9jay1uYW1lcyA9ICJjYW5fY2xrIiwgInBjbGsiOworCQkJcmVnID0gPDB4ZTAwMDgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAyOCA0PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCQkJdHgtZmlmby1kZXB0aCA9IDwweDQwPjsKKwkJCXJ4LWZpZm8tZGVwdGggPSA8MHg0MD47CisJCX07CitGb3IgQXhpIENBTiBEdHMgZmlsZToKKwlheGlfY2FuXzA6IGF4aS1jYW5ANDAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ4bG54LGF4aS1jYW4tMS4wMC5hIjsKKwkJCWNsb2NrcyA9IDwmY2xrYyAwPiwgPCZjbGtjIDE+OworCQkJY2xvY2stbmFtZXMgPSAiY2FuX2NsayIsInNfYXhpX2FjbGsiIDsKKwkJCXJlZyA9IDwweDQwMDAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJCQlpbnRlcnJ1cHRzID0gPDAgNTkgMT47CisJCQl0eC1maWZvLWRlcHRoID0gPDB4NDA+OworCQkJcngtZmlmby1kZXB0aCA9IDwweDQwPjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY3Bzdy1waHktc2VsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY3Bzdy1waHktc2VsLnR4dAppbmRleCA3ZmY1N2ExLi43NjRjMGM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nwc3ctcGh5LXNlbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jcHN3LXBoeS1zZWwudHh0CkBAIC0yLDcgKzIsOSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgInRpLGFtMzM1Mi1jcHN3LXBoeS1zZWwiCistIGNvbXBhdGlibGUJCTogU2hvdWxkIGJlICJ0aSxhbTMzNTItY3Bzdy1waHktc2VsIiBmb3IgYW0zMzV4IHBsYXRmb3JtIGFuZAorCQkJICAidGksZHJhN3h4LWNwc3ctcGh5LXNlbCIgZm9yIGRyYTd4eCBwbGF0Zm9ybQorCQkJICAidGksYW00M3h4LWNwc3ctcGh5LXNlbCIgZm9yIGFtNDN4eCBwbGF0Zm9ybQogLSByZWcJCQk6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgY3BzdwogCQkJICByZWdpc3RlcnMgbWFwCiAtIHJlZy1uYW1lcwkJOiBuYW1lcyBvZiB0aGUgcmVnaXN0ZXIgbWFwIGdpdmVuIGluICJyZWciIG5vZGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZml4ZWQtbGluay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZpeGVkLWxpbmsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmY3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZpeGVkLWxpbmsudHh0CkBAIC0wLDAgKzEsNDIgQEAKK0ZpeGVkIGxpbmsgRGV2aWNlIFRyZWUgYmluZGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgRXRoZXJuZXQgTUFDcyBoYXZlIGEgImZpeGVkIGxpbmsiLCBhbmQgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYQorbm9ybWFsIE1ESU8tbWFuYWdlZCBQSFkgZGV2aWNlLiBGb3IgdGhvc2Ugc2l0dWF0aW9ucywgYSBEZXZpY2UgVHJlZQorYmluZGluZyBhbGxvd3MgdG8gZGVzY3JpYmUgYSAiZml4ZWQgbGluayIuCisKK1N1Y2ggYSBmaXhlZCBsaW5rIHNpdHVhdGlvbiBpcyBkZXNjcmliZWQgYnkgY3JlYXRpbmcgYSAnZml4ZWQtbGluaycKK3N1Yi1ub2RlIG9mIHRoZSBFdGhlcm5ldCBNQUMgZGV2aWNlIG5vZGUsIHdpdGggdGhlIGZvbGxvd2luZworcHJvcGVydGllczoKKworKiAnc3BlZWQnIChpbnRlZ2VyLCBtYW5kYXRvcnkpLCB0byBpbmRpY2F0ZSB0aGUgbGluayBzcGVlZC4gQWNjZXB0ZWQKKyAgdmFsdWVzIGFyZSAxMCwgMTAwIGFuZCAxMDAwCisqICdmdWxsLWR1cGxleCcgKGJvb2xlYW4sIG9wdGlvbmFsKSwgdG8gaW5kaWNhdGUgdGhhdCBmdWxsIGR1cGxleCBpcworICB1c2VkLiBXaGVuIGFic2VudCwgaGFsZiBkdXBsZXggaXMgYXNzdW1lZC4KKyogJ3BhdXNlJyAoYm9vbGVhbiwgb3B0aW9uYWwpLCB0byBpbmRpY2F0ZSB0aGF0IHBhdXNlIHNob3VsZCBiZQorICBlbmFibGVkLgorKiAnYXN5bS1wYXVzZScgKGJvb2xlYW4sIG9wdGlvbmFsKSwgdG8gaW5kaWNhdGUgdGhhdCBhc3ltX3BhdXNlIHNob3VsZAorICBiZSBlbmFibGVkLgorCitPbGQsIGRlcHJlY2F0ZWQgJ2ZpeGVkLWxpbmsnIGJpbmRpbmc6CisKKyogQSAnZml4ZWQtbGluaycgcHJvcGVydHkgaW4gdGhlIEV0aGVybmV0IE1BQyBub2RlLCB3aXRoIDUgY2VsbHMsIG9mIHRoZQorICBmb3JtIDxhIGIgYyBkIGU+IHdpdGggdGhlIGZvbGxvd2luZyBhY2NlcHRlZCB2YWx1ZXM6CisgIC0gYTogZW11bGF0ZWQgUEhZIElELCBjaG9vc2UgYW55IGJ1dCBidXQgdW5pcXVlIHRvIHRoZSBhbGwgc3BlY2lmaWVkCisgICAgZml4ZWQtbGlua3MsIGZyb20gMCB0byAzMQorICAtIGI6IGR1cGxleCBjb25maWd1cmF0aW9uOiAwIGZvciBoYWxmIGR1cGxleCwgMSBmb3IgZnVsbCBkdXBsZXgKKyAgLSBjOiBsaW5rIHNwZWVkIGluIE1iaXRzL3NlYywgYWNjZXB0ZWQgdmFsdWVzIGFyZTogMTAsIDEwMCBhbmQgMTAwMAorICAtIGQ6IHBhdXNlIGNvbmZpZ3VyYXRpb246IDAgZm9yIG5vIHBhdXNlLCAxIGZvciBwYXVzZQorICAtIGU6IGFzeW1tZXRyaWMgcGF1c2UgY29uZmlndXJhdGlvbjogMCBmb3Igbm8gYXN5bW1ldHJpYyBwYXVzZSwgMSBmb3IKKyAgICBhc3ltbWV0cmljIHBhdXNlCisKK0V4YW1wbGU6CisKK2V0aGVybmV0QDAgeworCS4uLgorCWZpeGVkLWxpbmsgeworCSAgICAgIHNwZWVkID0gPDEwMDA+OworCSAgICAgIGZ1bGwtZHVwbGV4OworCX07CisJLi4uCit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9mc2wtdHNlYy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9mc2wtdHNlYy1waHkudHh0CmluZGV4IDczN2NkZWYuLmJlNmVhODkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZnNsLXRzZWMtcGh5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZzbC10c2VjLXBoeS50eHQKQEAgLTQyLDEwICs0Miw3IEBACiAgICAgaW50ZXJydXB0LiAgRm9yIFRTRUMgYW5kIGVUU0VDIGRldmljZXMsIHRoZSBmaXJzdCBpbnRlcnJ1cHQgaXMKICAgICB0cmFuc21pdCwgdGhlIHNlY29uZCBpcyByZWNlaXZlLCBhbmQgdGhlIHRoaXJkIGlzIGVycm9yLgogICAtIHBoeS1oYW5kbGUgOiBTZWUgZXRoZXJuZXQudHh0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgotICAtIGZpeGVkLWxpbmsgOiA8YSBiIGMgZCBlPiB3aGVyZSBhIGlzIGVtdWxhdGVkIHBoeSBpZCAtIGNob29zZSBhbnksCi0gICAgYnV0IHVuaXF1ZSB0byB0aGUgYWxsIHNwZWNpZmllZCBmaXhlZC1saW5rcywgYiBpcyBkdXBsZXggLSAwIGhhbGYsCi0gICAgMSBmdWxsLCBjIGlzIGxpbmsgc3BlZWQgLSBkIzEwL2QjMTAwL2QjMTAwMCwgZCBpcyBwYXVzZSAtIDAgbm8KLSAgICBwYXVzZSwgMSBwYXVzZSwgZSBpcyBhc3ltX3BhdXNlIC0gMCBubyBhc3ltX3BhdXNlLCAxIGFzeW1fcGF1c2UuCisgIC0gZml4ZWQtbGluayA6IFNlZSBmaXhlZC1saW5rLnR4dCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCiAgIC0gcGh5LWNvbm5lY3Rpb24tdHlwZSA6IFNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCiAgICAgVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgaWYgdGhlIGNvbm5lY3Rpb24gaXMgb2YgdHlwZQogICAgICJyZ21paS1pZCIsIGFzIGFsbCBvdGhlciBjb25uZWN0aW9uIHR5cGVzIGFyZSBkZXRlY3RlZCBieSBoYXJkd2FyZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvaGlzaWxpY29uLWhpeDVoZDItZ21hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2hpc2lsaWNvbi1oaXg1aGQyLWdtYWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDM5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2hpc2lsaWNvbi1oaXg1aGQyLWdtYWMudHh0CkBAIC0wLDAgKzEsMzYgQEAKK0hpc2lsaWNvbiBoaXg1aGQyIGdtYWMgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImhpc2lsaWNvbixoaXg1aGQyLWdtYWMiLgorLSByZWc6IHNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MocykgYW5kIHNpemUgb2YgdGhlIGRldmljZSByZWdpc3RlcnMuCisgIFRoZSBmaXJzdCByZWdpb24gaXMgdGhlIE1BQyByZWdpc3RlciBiYXNlIGFuZCBzaXplLgorICBUaGUgc2Vjb25kIHJlZ2lvbiBpcyBleHRlcm5hbCBpbnRlcmZhY2UgY29udHJvbCByZWdpc3Rlci4KKy0gaW50ZXJydXB0czogc2hvdWxkIGNvbnRhaW4gdGhlIE1BQyBpbnRlcnJ1cHQuCistICNhZGRyZXNzLWNlbGxzOiBtdXN0IGJlIDwxPi4KKy0gI3NpemUtY2VsbHM6IG11c3QgYmUgPDA+LgorLSBwaHktbW9kZTogc2VlIGV0aGVybmV0LnR4dCBbMV0uCistIHBoeS1oYW5kbGU6IHNlZSBldGhlcm5ldC50eHQgWzFdLgorLSBtYWMtYWRkcmVzczogc2VlIGV0aGVybmV0LnR4dCBbMV0uCistIGNsb2NrczogY2xvY2sgcGhhbmRsZSBhbmQgc3BlY2lmaWVyIHBhaXIuCisKKy0gUEhZIHN1Ym5vZGU6IGluaGVyaXRzIGZyb20gcGh5IGJpbmRpbmcgWzJdCisKK1sxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2V0aGVybmV0LnR4dAorWzJdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcGh5LnR4dAorCitFeGFtcGxlOgorCWdtYWMwOiBldGhlcm5ldEBmOTg0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiaGlzaWxpY29uLGhpeDVoZDItZ21hYyI7CisJCXJlZyA9IDwweGY5ODQwMDAwIDB4MTAwMD4sPDB4Zjk4NDMwMGMgMHg0PjsKKwkJaW50ZXJydXB0cyA9IDwwIDcxIDQ+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXBoeS1tb2RlID0gIm1paSI7CisJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OworCQltYWMtYWRkcmVzcyA9IFswMCAwMCAwMCAwMCAwMCAwMF07CisJCWNsb2NrcyA9IDwmY2xvY2sgSElYNUhEMl9NQUMwX0NMSz47CisKKwkJcGh5MjogZXRoZXJuZXQtcGh5QDIgeworCQkJcmVnID0gPDI+OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2llZWU4MDIxNTQvYXQ4NnJmMjMwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvaWVlZTgwMjE1NC9hdDg2cmYyMzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmJkZGVkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC50eHQKQEAgLTAsMCArMSwyMyBAQAorKiBBVDg2UkYyMzAgSUVFRSA4MDIuMTUuNCAqCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgIC0gY29tcGF0aWJsZToJCXNob3VsZCBiZSAiYXRtZWwsYXQ4NnJmMjMwIiwgImF0bWVsLGF0ODZyZjIzMSIsCisJCQkiYXRtZWwsYXQ4NnJmMjMzIiBvciAiYXRtZWwsYXQ4NnJmMjEyIgorICAtIHNwaS1tYXgtZnJlcXVlbmN5OgltYXhpbWFsIGJ1cyBzcGVlZCwgc2hvdWxkIGJlIHNldCB0byA3NTAwMDAwIGRlcGVuZHMKKwkJCXN5bmMgb3IgYXN5bmMgb3BlcmF0aW9uIG1vZGUKKyAgLSByZWc6CQl0aGUgY2hpcHNlbGVjdCBpbmRleAorICAtIGludGVycnVwdHM6CQl0aGUgaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgIC0gcmVzZXQtZ3BpbzoJCUdQSU8gc3BlYyBmb3IgdGhlIHJzdG4gcGluCisgIC0gc2xlZXAtZ3BpbzoJCUdQSU8gc3BlYyBmb3IgdGhlIHNscF90ciBwaW4KKworRXhhbXBsZToKKworCWF0ODZyZjIzMUAwIHsKKwkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDg2cmYyMzEiOworCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw3NTAwMDAwPjsKKwkJcmVnID0gPDA+OworCQlpbnRlcnJ1cHRzID0gPDE5IDE+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvMz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzODg1MS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rczg4NTEudHh0CmluZGV4IGQ1NGQwY2MuLmJiZGY5YTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzODg1MS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9taWNyZWwta3M4ODUxLnR4dApAQCAtMSw5ICsxLDE4IEBACi1NaWNyZWwgS1M4ODUxIEV0aGVybmV0IG1hYworTWljcmVsIEtTODg1MSBFdGhlcm5ldCBtYWMgKE1MTCkKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA9ICJtaWNyZWwsa3M4ODUxLW1sIiBvZiBwYXJhbGxlbCBpbnRlcmZhY2UKKy0gY29tcGF0aWJsZSA9ICJtaWNyZWwsa3M4ODUxLW1sbCIgb2YgcGFyYWxsZWwgaW50ZXJmYWNlCiAtIHJlZyA6IDIgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiByZWdpc3RlcnMgZm9yIGRhdGEgYW5kIGNvbW1hbmQKIC0gaW50ZXJydXB0cyA6IGludGVycnVwdCBjb25uZWN0aW9uCiAKK01pY3JlbCBLUzg4NTEgRXRoZXJuZXQgbWFjIChTUEkpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgPSAibWljcmVsLGtzODg1MSIgb3IgdGhlIGRlcHJlY2F0ZWQgImtzODg1MSIKKy0gcmVnIDogY2hpcCBzZWxlY3QgbnVtYmVyCistIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgY29ubmVjdGlvbgorCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSB2ZGQtc3VwcGx5OglzdXBwbHkgZm9yIEV0aGVybmV0IG1hYworLSB2ZGQtc3VwcGx5OiBhbmFsb2cgMy4zViBzdXBwbHkgZm9yIEV0aGVybmV0IG1hYworLSB2ZGQtaW8tc3VwcGx5OiBkaWdpdGFsIDEuOFYgSU8gc3VwcGx5IGZvciBFdGhlcm5ldCBtYWMKKy0gcmVzZXQtZ3Bpb3M6IHJlc2V0X24gaW5wdXQgcGluCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rc3o5MDIxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzejkwMjEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdhNjNmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzejkwMjEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotTWljcmVsIEtTWjkwMjEgR2lnYWJpdCBFdGhlcm5ldCBQSFkKLQotU29tZSBib2FyZHMgcmVxdWlyZSBzcGVjaWFsIHR1bmluZyB2YWx1ZXMsIHBhcnRpY3VsYXJseSB3aGVuIGl0IGNvbWVzIHRvCi1jbG9jayBkZWxheXMuICBZb3UgY2FuIHNwZWNpZnkgY2xvY2sgZGVsYXkgdmFsdWVzIGJ5IGFkZGluZwotbWljcmVsLXNwZWNpZmljIHByb3BlcnRpZXMgdG8gYW4gRXRoZXJuZXQgT0YgZGV2aWNlIG5vZGUuCi0KLUFsbCBza2V3IGNvbnRyb2wgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIHBpY29zZWNvbmRzLiAgVGhlIG1pbmltdW0KLXZhbHVlIGlzIDAsIGFuZCB0aGUgbWF4aW11bSB2YWx1ZSBpcyAzMDAwLgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotIC0gcnhjLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgUlhDIHBhZAotIC0gcnhkdi1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFJYIENUTCBwYWQKLSAtIHR4Yy1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFRYQyBwYWQKLSAtIHR4ZW4tc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWF9DVEwgcGFkCi0gLSByeGQwLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgUlggZGF0YSAwIHBhZAotIC0gcnhkMS1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFJYIGRhdGEgMSBwYWQKLSAtIHJ4ZDItc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDIgcGFkCi0gLSByeGQzLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgUlggZGF0YSAzIHBhZAotIC0gdHhkMC1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFRYIGRhdGEgMCBwYWQKLSAtIHR4ZDEtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDEgcGFkCi0gLSB0eGQyLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgVFggZGF0YSAyIHBhZAotIC0gdHhkMy1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFRYIGRhdGEgMyBwYWQKLQotRXhhbXBsZXM6Ci0KLQkvKiBBdHRhY2ggdG8gYW4gRXRoZXJuZXQgZGV2aWNlIHdpdGggYXV0b2RldGVjdGVkIFBIWSAqLwotCSZlbmV0IHsKLQkJcnhjLXNrZXctcHMgPSA8MzAwMD47Ci0JCXJ4ZHYtc2tldy1wcyA9IDwwPjsKLQkJdHhjLXNrZXctcHMgPSA8MzAwMD47Ci0JCXR4ZW4tc2tldy1wcyA9IDwwPjsKLQkJc3RhdHVzID0gIm9rYXkiOwotCX07Ci0KLQkvKiBBdHRhY2ggdG8gYW4gZXhwbGljaXRseS1zcGVjaWZpZWQgUEhZICovCi0JbWRpbyB7Ci0JCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKLQkJCXJ4Yy1za2V3LXBzID0gPDMwMDA+OwotCQkJcnhkdi1za2V3LXBzID0gPDA+OwotCQkJdHhjLXNrZXctcHMgPSA8MzAwMD47Ci0JCQl0eGVuLXNrZXctcHMgPSA8MD47Ci0JCQlyZWcgPSA8MD47Ci0JCX07Ci0JfTsKLQlldGhlcm5ldEA3MDAwMCB7Ci0JCXN0YXR1cyA9ICJva2F5IjsKLQkJcGh5ID0gPCZwaHkwPjsKLQkJcGh5LW1vZGUgPSAicmdtaWktaWQiOwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rc3o5MHgxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzejkweDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjA3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rc3o5MHgxLnR4dApAQCAtMCwwICsxLDgzIEBACitNaWNyZWwgS1NaOTAyMS9LU1o5MDMxIEdpZ2FiaXQgRXRoZXJuZXQgUEhZCisKK1NvbWUgYm9hcmRzIHJlcXVpcmUgc3BlY2lhbCB0dW5pbmcgdmFsdWVzLCBwYXJ0aWN1bGFybHkgd2hlbiBpdCBjb21lcyB0bworY2xvY2sgZGVsYXlzLiBZb3UgY2FuIHNwZWNpZnkgY2xvY2sgZGVsYXkgdmFsdWVzIGJ5IGFkZGluZworbWljcmVsLXNwZWNpZmljIHByb3BlcnRpZXMgdG8gYW4gRXRoZXJuZXQgT0YgZGV2aWNlIG5vZGUuCisKK05vdGUgdGhhdCB0aGVzZSBzZXR0aW5ncyBhcmUgYXBwbGllZCBhZnRlciBhbnkgcGh5LXNwZWNpZmljIGZpeHVwIGZyb20KK3BoeV9maXh1cF9saXN0IChzZWUgcGh5X2luaXRfaHcoKSBmcm9tIGRyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMpLAorYW5kIHRoZXJlZm9yZSBtYXkgb3ZlcndyaXRlIHRoZW0uCisKK0tTWjkwMjE6CisKKyAgQWxsIHNrZXcgY29udHJvbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gcGljb3NlY29uZHMuIFRoZSBtaW5pbXVtCisgIHZhbHVlIGlzIDAsIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDMwMDAsIGFuZCBpdCBpcyBpbmNyZW1lbnRlZCBieSAyMDBwcworICBzdGVwcy4KKworICBPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgICAgLSByeGMtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWEMgcGFkCisgICAgLSByeGR2LXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgUlggQ1RMIHBhZAorICAgIC0gdHhjLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgVFhDIHBhZAorICAgIC0gdHhlbi1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFRYIENUTCBwYWQKKyAgICAtIHJ4ZDAtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDAgcGFkCisgICAgLSByeGQxLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgUlggZGF0YSAxIHBhZAorICAgIC0gcnhkMi1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFJYIGRhdGEgMiBwYWQKKyAgICAtIHJ4ZDMtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDMgcGFkCisgICAgLSB0eGQwLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgVFggZGF0YSAwIHBhZAorICAgIC0gdHhkMS1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFRYIGRhdGEgMSBwYWQKKyAgICAtIHR4ZDItc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDIgcGFkCisgICAgLSB0eGQzLXNrZXctcHMgOiBTa2V3IGNvbnRyb2wgb2YgVFggZGF0YSAzIHBhZAorCitLU1o5MDMxOgorCisgIEFsbCBza2V3IGNvbnRyb2wgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIHBpY29zZWNvbmRzLiBUaGUgbWluaW11bQorICB2YWx1ZSBpcyAwLCBhbmQgdGhlIG1heGltdW0gaXMgcHJvcGVydHktZGVwZW5kZW50LiBUaGUgaW5jcmVtZW50CisgIHN0ZXAgaXMgNjBwcy4KKworICBPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgICAgTWF4aW11bSB2YWx1ZSBvZiAxODYwOgorCisgICAgICAtIHJ4Yy1za2V3LXBzIDogU2tldyBjb250cm9sIG9mIFJYIGNsb2NrIHBhZAorICAgICAgLSB0eGMtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBjbG9jayBwYWQKKworICAgIE1heGltdW0gdmFsdWUgb2YgOTAwOgorCisgICAgICAtIHJ4ZHYtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBDVEwgcGFkCisgICAgICAtIHR4ZW4tc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBDVEwgcGFkCisgICAgICAtIHJ4ZDAtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDAgcGFkCisgICAgICAtIHJ4ZDEtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDEgcGFkCisgICAgICAtIHJ4ZDItc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDIgcGFkCisgICAgICAtIHJ4ZDMtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBSWCBkYXRhIDMgcGFkCisgICAgICAtIHR4ZDAtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDAgcGFkCisgICAgICAtIHR4ZDEtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDEgcGFkCisgICAgICAtIHR4ZDItc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDIgcGFkCisgICAgICAtIHR4ZDMtc2tldy1wcyA6IFNrZXcgY29udHJvbCBvZiBUWCBkYXRhIDMgcGFkCisKK0V4YW1wbGVzOgorCisJLyogQXR0YWNoIHRvIGFuIEV0aGVybmV0IGRldmljZSB3aXRoIGF1dG9kZXRlY3RlZCBQSFkgKi8KKwkmZW5ldCB7CisJCXJ4Yy1za2V3LXBzID0gPDMwMDA+OworCQlyeGR2LXNrZXctcHMgPSA8MD47CisJCXR4Yy1za2V3LXBzID0gPDMwMDA+OworCQl0eGVuLXNrZXctcHMgPSA8MD47CisJCXN0YXR1cyA9ICJva2F5IjsKKwl9OworCisJLyogQXR0YWNoIHRvIGFuIGV4cGxpY2l0bHktc3BlY2lmaWVkIFBIWSAqLworCW1kaW8geworCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQlyeGMtc2tldy1wcyA9IDwzMDAwPjsKKwkJCXJ4ZHYtc2tldy1wcyA9IDwwPjsKKwkJCXR4Yy1za2V3LXBzID0gPDMwMDA+OworCQkJdHhlbi1za2V3LXBzID0gPDA+OworCQkJcmVnID0gPDA+OworCQl9OworCX07CisJZXRoZXJuZXRANzAwMDAgeworCQlzdGF0dXMgPSAib2theSI7CisJCXBoeSA9IDwmcGh5MD47CisJCXBoeS1tb2RlID0gInJnbWlpLWlkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9uZmMvcG41NDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9uZmMvcG41NDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjY5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L25mYy9wbjU0NC50eHQKQEAgLTAsMCArMSwzNSBAQAorKiBOWFAgU2VtaWNvbmR1Y3RvcnMgUE41NDQgTkZDIENvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJueHAscG41NDQtaTJjIi4KKy0gY2xvY2stZnJlcXVlbmN5OiBJskMgd29yayBmcmVxdWVuY3kuCistIHJlZzogYWRkcmVzcyBvbiB0aGUgYnVzCistIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgZ3BpbyBjb250cm9sbGVyCistIGludGVycnVwdHM6IEdQSU8gaW50ZXJydXB0IHRvIHdoaWNoIHRoZSBjaGlwIGlzIGNvbm5lY3RlZAorLSBlbmFibGUtZ3Bpb3M6IE91dHB1dCBHUElPIHBpbiB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIFBONTQ0CistIGZpcm13YXJlLWdwaW9zOiBPdXRwdXQgR1BJTyBwaW4gdXNlZCB0byBlbnRlciBmaXJtd2FyZSBkb3dubG9hZCBtb2RlCisKK09wdGlvbmFsIFNvQyBTcGVjaWZpYyBQcm9wZXJ0aWVzOgorLSBwaW5jdHJsLW5hbWVzOiBDb250YWlucyBvbmx5IG9uZSB2YWx1ZSAtICJkZWZhdWx0Ii4KKy0gcGludGN0cmwtMDogU3BlY2lmaWVzIHRoZSBwaW4gY29udHJvbCBncm91cHMgdXNlZCBmb3IgdGhpcyBjb250cm9sbGVyLgorCitFeGFtcGxlIChmb3IgQVJNLWJhc2VkIEJlYWdsZUJvbmUgd2l0aCBQTjU0NCBvbiBJMkMyKToKKworJmkyYzIgeworCisJc3RhdHVzID0gIm9rYXkiOworCisJcG41NDQ6IHBuNTQ0QDI4IHsKKworCQljb21wYXRpYmxlID0gIm54cCxwbjU0NC1pMmMiOworCisJCXJlZyA9IDwweDI4PjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OworCQlpbnRlcnJ1cHRzID0gPDE3IEdQSU9fQUNUSVZFX0hJR0g+OworCisJCWVuYWJsZS1ncGlvcyA9IDwmZ3BpbzMgMjEgR1BJT19BQ1RJVkVfSElHSD47CisJCWZpcm13YXJlLWdwaW9zID0gPCZncGlvMyAxOSBHUElPX0FDVElWRV9ISUdIPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbmZjL3N0MjFuZmNhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbmZjL3N0MjFuZmNhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZhYTJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9uZmMvc3QyMW5mY2EudHh0CkBAIC0wLDAgKzEsMzMgQEAKKyogU1RNaWNyb2VsZWN0cm9uaWNzIFNBUy4gU1QyMU5GQ0EgTkZDIENvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzdCxzdDIxbmZjYV9pMmMiLgorLSBjbG9jay1mcmVxdWVuY3k6IEnCskMgd29yayBmcmVxdWVuY3kuCistIHJlZzogYWRkcmVzcyBvbiB0aGUgYnVzCistIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgZ3BpbyBjb250cm9sbGVyCistIGludGVycnVwdHM6IEdQSU8gaW50ZXJydXB0IHRvIHdoaWNoIHRoZSBjaGlwIGlzIGNvbm5lY3RlZAorLSBlbmFibGUtZ3Bpb3M6IE91dHB1dCBHUElPIHBpbiB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIFNUMjFORkNBCisKK09wdGlvbmFsIFNvQyBTcGVjaWZpYyBQcm9wZXJ0aWVzOgorLSBwaW5jdHJsLW5hbWVzOiBDb250YWlucyBvbmx5IG9uZSB2YWx1ZSAtICJkZWZhdWx0Ii4KKy0gcGludGN0cmwtMDogU3BlY2lmaWVzIHRoZSBwaW4gY29udHJvbCBncm91cHMgdXNlZCBmb3IgdGhpcyBjb250cm9sbGVyLgorCitFeGFtcGxlIChmb3IgQVJNLWJhc2VkIEJlYWdsZUJvYXJkIHhNIHdpdGggU1QyMU5GQ0Egb24gSTJDMik6CisKKyZpMmMyIHsKKworCXN0YXR1cyA9ICJva2F5IjsKKworCXN0MjFuZmNhOiBzdDIxbmZjYUAxIHsKKworCQljb21wYXRpYmxlID0gInN0LHN0MjFuZmNhX2kyYyI7CisKKwkJcmVnID0gPDB4MDE+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvNT47CisJCWludGVycnVwdHMgPSA8MiBJUlFfVFlQRV9MRVZFTF9MT1c+OworCisJCWVuYWJsZS1ncGlvcyA9IDwmZ3BpbzUgMjkgR1BJT19BQ1RJVkVfSElHSD47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L25mYy90cmY3OTcwYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L25mYy90cmY3OTcwYS50eHQKaW5kZXggOGRkM2VmNy4uMWU0MzYxMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9uZmMvdHJmNzk3MGEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbmZjL3RyZjc5NzBhLnR4dApAQCAtMTIsNiArMTIsNyBAQAogT3B0aW9uYWwgU29DIFNwZWNpZmljIFByb3BlcnRpZXM6CiAtIHBpbmN0cmwtbmFtZXM6IENvbnRhaW5zIG9ubHkgb25lIHZhbHVlIC0gImRlZmF1bHQiLgogLSBwaW50Y3RybC0wOiBTcGVjaWZpZXMgdGhlIHBpbiBjb250cm9sIGdyb3VwcyB1c2VkIGZvciB0aGlzIGNvbnRyb2xsZXIuCistIGF1dG9zdXNwZW5kLWRlbGF5OiBTcGVjaWZ5IGF1dG9zdXNwZW5kIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KIAogRXhhbXBsZSAoZm9yIEFSTS1iYXNlZCBCZWFnbGVCb25lIHdpdGggVFJGNzk3MEEgb24gU1BJMSk6CiAKQEAgLTI5LDYgKzMwLDcgQEAKIAkJdGksZW5hYmxlLWdwaW9zID0gPCZncGlvMiAyIEdQSU9fQUNUSVZFX0xPVz4sCiAJCQkJICA8JmdwaW8yIDUgR1BJT19BQ1RJVkVfTE9XPjsKIAkJdmluLXN1cHBseSA9IDwmbGRvM19yZWc+OworCQlhdXRvc3VzcGVuZC1kZWxheSA9IDwzMDAwMD47CiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvdmlhLXJoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvdmlhLXJoaW5lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRlY2EyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC92aWEtcmhpbmUudHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogVklBIFJoaW5lIDEwLzEwMCBOZXR3b3JrIENvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAidmlhLHZ0ODUwMC1yaGluZSIgZm9yIGludGVncmF0ZWQKKwlSaGluZSBjb250cm9sbGVycyBmb3VuZCBpbiBWSUEgVlQ4NTAwLCBXb25kZXJNZWRpYSBXTTg5NTAKKwlhbmQgc2ltaWxhci4gVGhlc2UgYXJlIGxpc3RlZCBhcyAxMTA2OjMxMDYgcmV2LiAweDg0IG9uIHRoZQorCXZpcnR1YWwgUENJIGJ1cyB1bmRlciB2ZW5kb3ItcHJvdmlkZWQga2VybmVscworLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGlvIHNwYWNlCistIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiB0aGUgY29udHJvbGxlciBpbnRlcnJ1cHQgbGluZQorCitFeGFtcGxlczoKKworZXRoZXJuZXRAZDgwMDQwMDAgeworCWNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1yaGluZSI7CisJcmVnID0gPDB4ZDgwMDQwMDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8MTA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9hdW8sYjEzM3h0bjAxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9hdW8sYjEzM3h0bjAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQzYjdjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2F1byxiMTMzeHRuMDEudHh0CkBAIC0wLDAgKzEsNyBAQAorQVUgT3B0cm9uaWNzIENvcnBvcmF0aW9uIDEzLjMiIFdYR0EgKDEzNjZ4NzY4KSBURlQgTENEIHBhbmVsCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiYXVvLGIxMzN4dG4wMSIKKworVGhpcyBiaW5kaW5nIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2ltcGxlLXBhbmVsIGJpbmRpbmcsIHdoaWNoIGlzIHNwZWNpZmllZAoraW4gc2ltcGxlLXBhbmVsLnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9lZHQsZXQwNTcwOTBkaHUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2VkdCxldDA1NzA5MGRodS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwM2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9lZHQsZXQwNTcwOTBkaHUudHh0CkBAIC0wLDAgKzEsNyBAQAorRW1lcmdpbmcgRGlzcGxheSBUZWNobm9sb2d5IENvcnAuIDUuNyIgVkdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJlZHQsZXQwNTcwOTBkaHUiCisKK1RoaXMgYmluZGluZyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNpbXBsZS1wYW5lbCBiaW5kaW5nLCB3aGljaCBpcyBzcGVjaWZpZWQKK2luIHNpbXBsZS1wYW5lbC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvZWR0LGV0MDcwMDgwZGg2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wYW5lbC9lZHQsZXQwNzAwODBkaDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwY2IzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvZWR0LGV0MDcwMDgwZGg2LnR4dApAQCAtMCwwICsxLDEwIEBACitFbWVyZ2luZyBEaXNwbGF5IFRlY2hub2xvZ3kgQ29ycC4gRVQwNzAwODBESDYgNy4wIiBXVkdBIFRGVCBMQ0QgcGFuZWwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJlZHQsZXQwNzAwODBkaDYiCisKK1RoaXMgcGFuZWwgaXMgdGhlIHNhbWUgYXMgRVRNMDcwMEcwREg2IGV4Y2VwdCBmb3IgdGhlIHRvdWNoc2NyZWVuLgorRVQwNzAwODBESDYgaXMgdGhlIG1vZGVsIHdpdGggcmVzaXN0aXZlIHRvdWNoLgorCitUaGlzIGJpbmRpbmcgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW1wbGUtcGFuZWwgYmluZGluZywgd2hpY2ggaXMgc3BlY2lmaWVkCitpbiBzaW1wbGUtcGFuZWwudHh0IGluIHRoaXMgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2VkdCxldG0wNzAwZzBkaDYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BhbmVsL2VkdCxldG0wNzAwZzBkaDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNGIxODAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGFuZWwvZWR0LGV0bTA3MDBnMGRoNi50eHQKQEAgLTAsMCArMSwxMCBAQAorRW1lcmdpbmcgRGlzcGxheSBUZWNobm9sb2d5IENvcnAuIEVUTTA3MDBHMERINiA3LjAiIFdWR0EgVEZUIExDRCBwYW5lbAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImVkdCxldG0wNzAwZzBkaDYiCisKK1RoaXMgcGFuZWwgaXMgdGhlIHNhbWUgYXMgRVQwNzAwODBESDYgZXhjZXB0IGZvciB0aGUgdG91Y2hzY3JlZW4uCitFVE0wNzAwRzBESDYgaXMgdGhlIG1vZGVsIHdpdGggY2FwYWNpdGl2ZSBtdWx0aXRvdWNoLgorCitUaGlzIGJpbmRpbmcgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzaW1wbGUtcGFuZWwgYmluZGluZywgd2hpY2ggaXMgc3BlY2lmaWVkCitpbiBzaW1wbGUtcGFuZWwudHh0IGluIHRoaXMgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9kZXNpZ253YXJlLXBjaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9kZXNpZ253YXJlLXBjaWUudHh0CmluZGV4IGQ2ZmFlMTNmLi5kMGQxNWVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2Rlc2lnbndhcmUtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9kZXNpZ253YXJlLXBjaWUudHh0CkBAIC0xLDE1ICsxLDcgQEAKICogU3lub3BzeXMgRGVzaWdud2FyZSBQQ0llIGludGVyZmFjZQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBzaG91bGQgY29udGFpbiAic25wcyxkdy1wY2llIiB0byBpZGVudGlmeSB0aGUKLQljb3JlLCBwbHVzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSwgc3VjaAotCWFzICJzYW1zdW5nLGV4eW5vczU0NDAtcGNpZSIgb3IgImZzbCxpbXg2cS1wY2llIi4KLS0gcmVnOiBiYXNlIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiB0aGUgcGNpZSBjb250cm9sbGVyLAotCXRoZSBwaHkgY29udHJvbGxlciwgYWRkaXRpb25hbCByZWdpc3RlciBmb3IgdGhlIHBoeSBjb250cm9sbGVyLgotLSBpbnRlcnJ1cHRzOiBpbnRlcnJ1cHQgdmFsdWVzIGZvciBsZXZlbCBpbnRlcnJ1cHQsCi0JcHVsc2UgaW50ZXJydXB0LCBzcGVjaWFsIGludGVycnVwdC4KLS0gY2xvY2tzOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOiBoYW5kbGUgdG8gcGNpIGNsb2NrLgotLSBjbG9jay1uYW1lczogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzogc2hvdWxkIGJlICJwY2llIiBhbmQgInBjaWVfYnVzIi4KKy0gY29tcGF0aWJsZTogc2hvdWxkIGNvbnRhaW4gInNucHMsZHctcGNpZSIgdG8gaWRlbnRpZnkgdGhlIGNvcmUuCiAtICNhZGRyZXNzLWNlbGxzOiBzZXQgdG8gPDM+CiAtICNzaXplLWNlbGxzOiBzZXQgdG8gPDI+CiAtIGRldmljZV90eXBlOiBzZXQgdG8gInBjaSIKQEAgLTE5LDY1ICsxMSwxMSBAQAogCXRvIGRlZmluZSB0aGUgbWFwcGluZyBvZiB0aGUgUENJZSBpbnRlcmZhY2UgdG8gaW50ZXJydXB0CiAJbnVtYmVycy4KIC0gbnVtLWxhbmVzOiBudW1iZXIgb2YgbGFuZXMgdG8gdXNlCistIGNsb2NrczogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorCVNlZSAuLi9jbG9ja3MvY2xvY2stYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorLSBjbG9jay1uYW1lczogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZW50cmllczoKKwktICJwY2llIgorCS0gInBjaWVfYnVzIgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSByZXNldC1ncGlvOiBncGlvIHBpbiBudW1iZXIgb2YgcG93ZXIgZ29vZCBzaWduYWwKLQotT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgZnNsLGlteDZxLXBjaWUKLS0gcG93ZXItb24tZ3BpbzogZ3BpbyBwaW4gbnVtYmVyIG9mIHBvd2VyLWVuYWJsZSBzaWduYWwKLS0gd2FrZS11cC1ncGlvOiBncGlvIHBpbiBudW1iZXIgb2YgaW5jb21pbmcgd2FrZXVwIHNpZ25hbAotLSBkaXNhYmxlLWdwaW86IGdwaW8gcGluIG51bWJlciBvZiBvdXRnb2luZyByZmtpbGwvZW5kcG9pbnQgZGlzYWJsZSBzaWduYWwKLQotRXhhbXBsZToKLQotU29DIHNwZWNpZmljIERUIEVudHJ5OgotCi0JcGNpZUAyOTAwMDAgewotCQljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQ0MC1wY2llIiwgInNucHMsZHctcGNpZSI7Ci0JCXJlZyA9IDwweDI5MDAwMCAweDEwMDAKLQkJCTB4MjcwMDAwIDB4MTAwMAotCQkJMHgyNzEwMDAgMHg0MD47Ci0JCWludGVycnVwdHMgPSA8MCAyMCAwPiwgPDAgMjEgMD4sIDwwIDIyIDA+OwotCQljbG9ja3MgPSA8JmNsb2NrIDI4PiwgPCZjbG9jayAyNz47Ci0JCWNsb2NrLW5hbWVzID0gInBjaWUiLCAicGNpZV9idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCXJhbmdlcyA9IDwweDAwMDAwODAwIDAgMHg0MDAwMDAwMCAweDQwMDAwMDAwIDAgMHgwMDAwMTAwMCAgIC8qIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KLQkJCSAgMHg4MTAwMDAwMCAwIDAJICAweDQwMDAxMDAwIDAgMHgwMDAxMDAwMCAgIC8qIGRvd25zdHJlYW0gSS9PICovCi0JCQkgIDB4ODIwMDAwMDAgMCAweDQwMDExMDAwIDB4NDAwMTEwMDAgMCAweDFmZmVmMDAwPjsgLyogbm9uLXByZWZldGNoYWJsZSBtZW1vcnkgKi8KLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDAgMCAwIDA+OwotCQlpbnRlcnJ1cHQtbWFwID0gPDB4MCAwICZnaWMgNTM+OwotCQludW0tbGFuZXMgPSA8ND47Ci0JfTsKLQotCXBjaWVAMmEwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0NDAtcGNpZSIsICJzbnBzLGR3LXBjaWUiOwotCQlyZWcgPSA8MHgyYTAwMDAgMHgxMDAwCi0JCQkweDI3MjAwMCAweDEwMDAKLQkJCTB4MjcxMDQwIDB4NDA+OwotCQlpbnRlcnJ1cHRzID0gPDAgMjMgMD4sIDwwIDI0IDA+LCA8MCAyNSAwPjsKLQkJY2xvY2tzID0gPCZjbG9jayAyOT4sIDwmY2xvY2sgMjc+OwotCQljbG9jay1uYW1lcyA9ICJwY2llIiwgInBjaWVfYnVzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDgwMCAwIDB4NjAwMDAwMDAgMHg2MDAwMDAwMCAwIDB4MDAwMDEwMDAgICAvKiBjb25maWd1cmF0aW9uIHNwYWNlICovCi0JCQkgIDB4ODEwMDAwMDAgMCAwCSAgMHg2MDAwMTAwMCAwIDB4MDAwMTAwMDAgICAvKiBkb3duc3RyZWFtIEkvTyAqLwotCQkJICAweDgyMDAwMDAwIDAgMHg2MDAxMTAwMCAweDYwMDExMDAwIDAgMHgxZmZlZjAwMD47IC8qIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5ICovCi0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwwIDAgMCAwPjsKLQkJaW50ZXJydXB0LW1hcCA9IDwweDAgMCAmZ2ljIDU2PjsKLQkJbnVtLWxhbmVzID0gPDQ+OwotCX07Ci0KLUJvYXJkIHNwZWNpZmljIERUIEVudHJ5OgotCi0JcGNpZUAyOTAwMDAgewotCQlyZXNldC1ncGlvID0gPCZwaW5fY3RybCA1IDA+OwotCX07Ci0KLQlwY2llQDJhMDAwMCB7Ci0JCXJlc2V0LWdwaW8gPSA8JnBpbl9jdHJsIDIyIDA+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2ZzbCxpbXg2cS1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvZnNsLGlteDZxLXBjaWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTVmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2ZzbCxpbXg2cS1wY2llLnR4dApAQCAtMCwwICsxLDM4IEBACisqIEZyZWVzY2FsZSBpLk1YNiBQQ0llIGludGVyZmFjZQorCitUaGlzIFBDSWUgaG9zdCBjb250cm9sbGVyIGlzIGJhc2VkIG9uIHRoZSBTeW5vcHNpcyBEZXNpZ253YXJlIFBDSWUgSVAKK2FuZCB0aHVzIGluaGVyaXRzIGFsbCB0aGUgY29tbW9uIHByb3BlcnRpZXMgZGVmaW5lZCBpbiBkZXNpZ253YXJlLXBjaWUudHh0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAiZnNsLGlteDZxLXBjaWUiCistIHJlZzogYmFzZSBhZGRyZXNzZSBhbmQgbGVuZ3RoIG9mIHRoZSBwY2llIGNvbnRyb2xsZXIKKy0gaW50ZXJydXB0czogQSBsaXN0IG9mIGludGVycnVwdCBvdXRwdXRzIG9mIHRoZSBjb250cm9sbGVyLiBNdXN0IGNvbnRhaW4gYW4KKyAgZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gdGhlIGludGVycnVwdC1uYW1lcyBwcm9wZXJ0eS4KKy0gaW50ZXJydXB0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCS0gIm1zaSI6IFRoZSBpbnRlcnJ1cHQgdGhhdCBpcyBhc3NlcnRlZCB3aGVuIGFuIE1TSSBpcyByZWNlaXZlZAorLSBjbG9jay1uYW1lczogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBlbnRyaWVzOgorCS0gInBjaWVfcGh5IgorCitFeGFtcGxlOgorCisJcGNpZUAweDAxMDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtcGNpZSIsICJzbnBzLGR3LXBjaWUiOworCQlyZWcgPSA8MHgwMWZmYzAwMCAweDQwMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCXJhbmdlcyA9IDwweDAwMDAwODAwIDAgMHgwMWYwMDAwMCAweDAxZjAwMDAwIDAgMHgwMDA4MDAwMAorCQkJICAweDgxMDAwMDAwIDAgMCAgICAgICAgICAweDAxZjgwMDAwIDAgMHgwMDAxMDAwMAorCQkJICAweDgyMDAwMDAwIDAgMHgwMTAwMDAwMCAweDAxMDAwMDAwIDAgMHgwMGYwMDAwMD47CisJCW51bS1sYW5lcyA9IDwxPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEyMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gIm1zaSI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwwIDAgMCAweDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPDAgMCAwIDEgJmludGMgR0lDX1NQSSAxMjMgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgICAgICAgICAgICA8MCAwIDAgMiAmaW50YyBHSUNfU1BJIDEyMiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICAgICAgICAgICAgIDwwIDAgMCAzICZpbnRjIEdJQ19TUEkgMTIxIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkgICAgICAgICAgICAgICAgPDAgMCAwIDQgJmludGMgR0lDX1NQSSAxMjAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmY2xrcyAxNDQ+LCA8JmNsa3MgMjA2PiwgPCZjbGtzIDE4OT47CisJCWNsb2NrLW5hbWVzID0gInBjaWUiLCAicGNpZV9idXMiLCAicGNpZV9waHkiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3NhbXN1bmcsZXh5bm9zNTQ0MC1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvc2Ftc3VuZyxleHlub3M1NDQwLXBjaWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3NhbXN1bmcsZXh5bm9zNTQ0MC1wY2llLnR4dApAQCAtMCwwICsxLDY1IEBACisqIFNhbXN1bmcgRXh5bm9zIDU0NDAgUENJZSBpbnRlcmZhY2UKKworVGhpcyBQQ0llIGhvc3QgY29udHJvbGxlciBpcyBiYXNlZCBvbiB0aGUgU3lub3BzaXMgRGVzaWdud2FyZSBQQ0llIElQCithbmQgdGh1cyBpbmhlcml0cyBhbGwgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gZGVzaWdud2FyZS1wY2llLnR4dC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogInNhbXN1bmcsZXh5bm9zNTQ0MC1wY2llIgorLSByZWc6IGJhc2UgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIHRoZSBwY2llIGNvbnRyb2xsZXIsCisJdGhlIHBoeSBjb250cm9sbGVyLCBhZGRpdGlvbmFsIHJlZ2lzdGVyIGZvciB0aGUgcGh5IGNvbnRyb2xsZXIuCistIGludGVycnVwdHM6IEEgbGlzdCBvZiBpbnRlcnJ1cHQgb3V0cHV0cyBmb3IgbGV2ZWwgaW50ZXJydXB0LAorCXB1bHNlIGludGVycnVwdCwgc3BlY2lhbCBpbnRlcnJ1cHQuCisKK0V4YW1wbGU6CisKK1NvQyBzcGVjaWZpYyBEVCBFbnRyeToKKworCXBjaWVAMjkwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0NDAtcGNpZSIsICJzbnBzLGR3LXBjaWUiOworCQlyZWcgPSA8MHgyOTAwMDAgMHgxMDAwCisJCQkweDI3MDAwMCAweDEwMDAKKwkJCTB4MjcxMDAwIDB4NDA+OworCQlpbnRlcnJ1cHRzID0gPDAgMjAgMD4sIDwwIDIxIDA+LCA8MCAyMiAwPjsKKwkJY2xvY2tzID0gPCZjbG9jayAyOD4sIDwmY2xvY2sgMjc+OworCQljbG9jay1uYW1lcyA9ICJwY2llIiwgInBjaWVfYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlyYW5nZXMgPSA8MHgwMDAwMDgwMCAwIDB4NDAwMDAwMDAgMHg0MDAwMDAwMCAwIDB4MDAwMDEwMDAgICAvKiBjb25maWd1cmF0aW9uIHNwYWNlICovCisJCQkgIDB4ODEwMDAwMDAgMCAwCSAgMHg0MDAwMTAwMCAwIDB4MDAwMTAwMDAgICAvKiBkb3duc3RyZWFtIEkvTyAqLworCQkJICAweDgyMDAwMDAwIDAgMHg0MDAxMTAwMCAweDQwMDExMDAwIDAgMHgxZmZlZjAwMD47IC8qIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5ICovCisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwwIDAgMCAwPjsKKwkJaW50ZXJydXB0LW1hcCA9IDwwIDAgMCAwICZnaWMgR0lDX1NQSSAyMSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJbnVtLWxhbmVzID0gPDQ+OworCX07CisKKwlwY2llQDJhMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDQwLXBjaWUiLCAic25wcyxkdy1wY2llIjsKKwkJcmVnID0gPDB4MmEwMDAwIDB4MTAwMAorCQkJMHgyNzIwMDAgMHgxMDAwCisJCQkweDI3MTA0MCAweDQwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDIzIDA+LCA8MCAyNCAwPiwgPDAgMjUgMD47CisJCWNsb2NrcyA9IDwmY2xvY2sgMjk+LCA8JmNsb2NrIDI3PjsKKwkJY2xvY2stbmFtZXMgPSAicGNpZSIsICJwY2llX2J1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJcmFuZ2VzID0gPDB4MDAwMDA4MDAgMCAweDYwMDAwMDAwIDB4NjAwMDAwMDAgMCAweDAwMDAxMDAwICAgLyogY29uZmlndXJhdGlvbiBzcGFjZSAqLworCQkJICAweDgxMDAwMDAwIDAgMAkgIDB4NjAwMDEwMDAgMCAweDAwMDEwMDAwICAgLyogZG93bnN0cmVhbSBJL08gKi8KKwkJCSAgMHg4MjAwMDAwMCAwIDB4NjAwMTEwMDAgMHg2MDAxMTAwMCAwIDB4MWZmZWYwMDA+OyAvKiBub24tcHJlZmV0Y2hhYmxlIG1lbW9yeSAqLworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MCAwIDAgMD47CisJCWludGVycnVwdC1tYXAgPSA8MCAwIDAgMCAmZ2ljIEdJQ19TUEkgMjQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCW51bS1sYW5lcyA9IDw0PjsKKwl9OworCitCb2FyZCBzcGVjaWZpYyBEVCBFbnRyeToKKworCXBjaWVAMjkwMDAwIHsKKwkJcmVzZXQtZ3BpbyA9IDwmcGluX2N0cmwgNSAwPjsKKwl9OworCisJcGNpZUAyYTAwMDAgeworCQlyZXNldC1ncGlvID0gPCZwaW5fY3RybCAyMiAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZpZGVvL2V4eW5vc19kcC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlkZW8vZXh5bm9zX2RwLnR4dAppbmRleCA1N2NjZGRlLi41M2RiY2NmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlkZW8vZXh5bm9zX2RwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlkZW8vZXh5bm9zX2RwLnR4dApAQCAtNjIsNiArNjIsMTAgQEAKIAktaHN5bmMtYWN0aXZlLWhpZ2g6CiAJCUhTWU5DIHBvbGFyaXR5IGNvbmZpZ3VyYXRpb24uCiAJCQlIaWdoIGlmIGRlZmluZWQsIExvdyBpZiBub3QgZGVmaW5lZAorCS1zYW1zdW5nLGhwZC1ncGlvOgorCQlIb3RwbHVnIGRldGVjdCBHUElPLgorCQkJSW5kaWNhdGVzIHdoaWNoIEdQSU8gc2hvdWxkIGJlIHVzZWQgZm9yIGhvdHBsdWcKKwkJCWRldGVjdGlvbgogCiBFeGFtcGxlOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlkZW8vZXh5bm9zX2hkbWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZpZGVvL2V4eW5vc19oZG1pLnR4dAppbmRleCBmOTE4N2EyLi4xZmQ4Y2Y5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlkZW8vZXh5bm9zX2hkbWkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92aWRlby9leHlub3NfaGRtaS50eHQKQEAgLTUsNiArNSw3IEBACiAJMSkgInNhbXN1bmcsZXh5bm9zNS1oZG1pIiA8REVQUkVDQVRFRD4KIAkyKSAic2Ftc3VuZyxleHlub3M0MjEwLWhkbWkiCiAJMykgInNhbXN1bmcsZXh5bm9zNDIxMi1oZG1pIgorCTQpICJzYW1zdW5nLGV4eW5vczU0MjAtaGRtaSIKIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGhkbWkgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCiAJcmVnaW9uLgogLSBpbnRlcnJ1cHRzOiBpbnRlcnJ1cHQgbnVtYmVyIHRvIHRoZSBjcHUuCkBAIC0yNyw2ICsyOCw3IEBACiAJImhkbWkiLCAic2Nsa19oZG1pIiwgInNjbGtfcGl4ZWwiLCAic2Nsa19oZG1pcGh5IiBhbmQgIm1vdXRfaGRtaSIuCiAtIGRkYzogcGhhbmRsZSB0byB0aGUgaGRtaSBkZGMgbm9kZQogLSBwaHk6IHBoYW5kbGUgdG8gdGhlIGhkbWkgcGh5IG5vZGUKKy0gc2Ftc3VuZyxzeXNjb24tcGhhbmRsZTogcGhhbmRsZSBmb3Igc3lzdGVtIGNvbnRyb2xsZXIgbm9kZSBmb3IgUE1VLgogCiBFeGFtcGxlOgogCkBAIC0zNyw0ICszOSw1IEBACiAJCWhwZC1ncGlvID0gPCZncHgzIDcgMT47CiAJCWRkYyA9IDwmaGRtaV9kZGNfbm9kZT47CiAJCXBoeSA9IDwmaGRtaV9waHlfbm9kZT47CisJCXNhbXN1bmcsc3lzY29uLXBoYW5kbGUgPSA8JnBtdV9zeXN0ZW1fY29udHJvbGxlcj47CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CmluZGV4IDg5NDcyNTU4Li4xNTI1ZTMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQKQEAgLTMxOCwzICszMTgsOCBAQAogICBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgpCiAgIGRldm1fZ3Bpb2RfZ2V0X2luZGV4X29wdGlvbmFsKCkKICAgZGV2bV9ncGlvZF9wdXQoKQorCitNRElPCisgIGRldm1fbWRpb2J1c19hbGxvYygpCisgIGRldm1fbWRpb2J1c19hbGxvY19zaXplKCkKKyAgZGV2bV9tZGlvYnVzX2ZyZWUoKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IGViYTc5MDEuLmIxOGRkMTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTE5Niw4ICsxOTYsNyBAQAogCXZvaWQgKCppbnZhbGlkYXRlcGFnZSkgKHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCpyZWxlYXNlcGFnZSkgKHN0cnVjdCBwYWdlICosIGludCk7CiAJdm9pZCAoKmZyZWVwYWdlKShzdHJ1Y3QgcGFnZSAqKTsKLQlpbnQgKCpkaXJlY3RfSU8pKGludCwgc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKTsKKwlpbnQgKCpkaXJlY3RfSU8pKGludCwgc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IG9mZnNldCk7CiAJaW50ICgqZ2V0X3hpcF9tZW0pKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHBnb2ZmX3QsIGludCwgdm9pZCAqKiwKIAkJCQl1bnNpZ25lZCBsb25nICopOwogCWludCAoKm1pZ3JhdGVwYWdlKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKQEAgLTQzMSw2ICs0MzAsOCBAQAogCXNzaXplX3QgKCp3cml0ZSkgKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogCXNzaXplX3QgKCphaW9fcmVhZCkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKIAlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOworCXNzaXplX3QgKCpyZWFkX2l0ZXIpIChzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOworCXNzaXplX3QgKCp3cml0ZV9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAlpbnQgKCppdGVyYXRlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopOwogCXVuc2lnbmVkIGludCAoKnBvbGwpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiAJbG9uZyAoKnVubG9ja2VkX2lvY3RsKSAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCA2MTdmNmQ3Li5hMWQwZDdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC01ODksOCArNTg5LDcgQEAKIAl2b2lkICgqaW52YWxpZGF0ZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiAJaW50ICgqcmVsZWFzZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCBpbnQpOwogCXZvaWQgKCpmcmVlcGFnZSkoc3RydWN0IHBhZ2UgKik7Ci0Jc3NpemVfdCAoKmRpcmVjdF9JTykoaW50LCBzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworCXNzaXplX3QgKCpkaXJlY3RfSU8pKGludCwgc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IG9mZnNldCk7CiAJc3RydWN0IHBhZ2UqICgqZ2V0X3hpcF9wYWdlKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCwKIAkJCWludCk7CiAJLyogbWlncmF0ZSB0aGUgY29udGVudHMgb2YgYSBwYWdlIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0ICovCkBAIC04MDcsNiArODA2LDggQEAKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqYWlvX3JlYWQpIChzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCk7CiAJc3NpemVfdCAoKmFpb193cml0ZSkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKKwlzc2l6ZV90ICgqcmVhZF9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKKwlzc2l6ZV90ICgqd3JpdGVfaXRlcikgKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiAJaW50ICgqaXRlcmF0ZSkgKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkaXJfY29udGV4dCAqKTsKIAl1bnNpZ25lZCBpbnQgKCpwb2xsKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICopOwogCWxvbmcgKCp1bmxvY2tlZF9pb2N0bCkgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CkBAIC04MzcsMTEgKzgzOCwxNSBAQAogCiAgIHJlYWQ6IGNhbGxlZCBieSByZWFkKDIpIGFuZCByZWxhdGVkIHN5c3RlbSBjYWxscwogCi0gIGFpb19yZWFkOiBjYWxsZWQgYnkgaW9fc3VibWl0KDIpIGFuZCBvdGhlciBhc3luY2hyb25vdXMgSS9PIG9wZXJhdGlvbnMKKyAgYWlvX3JlYWQ6IHZlY3RvcmVkLCBwb3NzaWJseSBhc3luY2hyb25vdXMgcmVhZAorCisgIHJlYWRfaXRlcjogcG9zc2libHkgYXN5bmNocm9ub3VzIHJlYWQgd2l0aCBpb3ZfaXRlciBhcyBkZXN0aW5hdGlvbgogCiAgIHdyaXRlOiBjYWxsZWQgYnkgd3JpdGUoMikgYW5kIHJlbGF0ZWQgc3lzdGVtIGNhbGxzCiAKLSAgYWlvX3dyaXRlOiBjYWxsZWQgYnkgaW9fc3VibWl0KDIpIGFuZCBvdGhlciBhc3luY2hyb25vdXMgSS9PIG9wZXJhdGlvbnMKKyAgYWlvX3dyaXRlOiB2ZWN0b3JlZCwgcG9zc2libHkgYXN5bmNocm9ub3VzIHdyaXRlCisKKyAgd3JpdGVfaXRlcjogcG9zc2libHkgYXN5bmNocm9ub3VzIHdyaXRlIHdpdGggaW92X2l0ZXIgYXMgc291cmNlCiAKICAgaXRlcmF0ZTogY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byByZWFkIHRoZSBkaXJlY3RvcnkgY29udGVudHMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dAppbmRleCA2OTM3MmZiLi4zZmIzOWUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dApAQCAtNDcwLDcgKzQ3MCw3IEBACiAKIAlTb21ldGltZXMsIGFuIGV4dGVybmFsIG1vZHVsZSB1c2VzIGV4cG9ydGVkIHN5bWJvbHMgZnJvbQogCWFub3RoZXIgZXh0ZXJuYWwgbW9kdWxlLiBrYnVpbGQgbmVlZHMgdG8gaGF2ZSBmdWxsIGtub3dsZWRnZSBvZgotCWFsbCBzeW1ib2xzIHRvIGF2b2lkIHNwbGlpdHRpbmcgb3V0IHdhcm5pbmdzIGFib3V0IHVuZGVmaW5lZAorCWFsbCBzeW1ib2xzIHRvIGF2b2lkIHNwaXR0aW5nIG91dCB3YXJuaW5ncyBhYm91dCB1bmRlZmluZWQKIAlzeW1ib2xzLiBUaHJlZSBzb2x1dGlvbnMgZXhpc3QgZm9yIHRoaXMgc2l0dWF0aW9uLgogCiAJTk9URTogVGhlIG1ldGhvZCB3aXRoIGEgdG9wLWxldmVsIGtidWlsZCBmaWxlIGlzIHJlY29tbWVuZGVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAppbmRleCAwY2ZiMDBmLi40YmJlY2E4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKQEAgLTIyLDggKzIyLDkgQEAKIAogS3Byb2JlcyBlbmFibGVzIHlvdSB0byBkeW5hbWljYWxseSBicmVhayBpbnRvIGFueSBrZXJuZWwgcm91dGluZSBhbmQKIGNvbGxlY3QgZGVidWdnaW5nIGFuZCBwZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBub24tZGlzcnVwdGl2ZWx5LiBZb3UKLWNhbiB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGNvZGUgYWRkcmVzcywgc3BlY2lmeWluZyBhIGhhbmRsZXIKK2NhbiB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGNvZGUgYWRkcmVzcygqKSwgc3BlY2lmeWluZyBhIGhhbmRsZXIKIHJvdXRpbmUgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBicmVha3BvaW50IGlzIGhpdC4KKygqOiBzb21lIHBhcnRzIG9mIHRoZSBrZXJuZWwgY29kZSBjYW4gbm90IGJlIHRyYXBwZWQsIHNlZSAxLjUgQmxhY2tsaXN0KQogCiBUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHR5cGVzIG9mIHByb2Jlczoga3Byb2JlcywganByb2JlcywgYW5kCiBrcmV0cHJvYmVzIChhbHNvIGNhbGxlZCByZXR1cm4gcHJvYmVzKS4gIEEga3Byb2JlIGNhbiBiZSBpbnNlcnRlZApAQCAtMjczLDYgKzI3NCwxOSBAQAogIG9yCiAtIEV4ZWN1dGUgJ3N5c2N0bCAtdyBkZWJ1Zy5rcHJvYmVzX29wdGltaXphdGlvbj1uJwogCisxLjUgQmxhY2tsaXN0CisKK0twcm9iZXMgY2FuIHByb2JlIG1vc3Qgb2YgdGhlIGtlcm5lbCBleGNlcHQgaXRzZWxmLiBUaGlzIG1lYW5zCit0aGF0IHRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB3aGVyZSBrcHJvYmVzIGNhbm5vdCBwcm9iZS4gUHJvYmluZworKHRyYXBwaW5nKSBzdWNoIGZ1bmN0aW9ucyBjYW4gY2F1c2UgYSByZWN1cnNpdmUgdHJhcCAoZS5nLiBkb3VibGUKK2ZhdWx0KSBvciB0aGUgbmVzdGVkIHByb2JlIGhhbmRsZXIgbWF5IG5ldmVyIGJlIGNhbGxlZC4KK0twcm9iZXMgbWFuYWdlcyBzdWNoIGZ1bmN0aW9ucyBhcyBhIGJsYWNrbGlzdC4KK0lmIHlvdSB3YW50IHRvIGFkZCBhIGZ1bmN0aW9uIGludG8gdGhlIGJsYWNrbGlzdCwgeW91IGp1c3QgbmVlZAordG8gKDEpIGluY2x1ZGUgbGludXgva3Byb2Jlcy5oIGFuZCAoMikgdXNlIE5PS1BST0JFX1NZTUJPTCgpIG1hY3JvCit0byBzcGVjaWZ5IGEgYmxhY2tsaXN0ZWQgZnVuY3Rpb24uCitLcHJvYmVzIGNoZWNrcyB0aGUgZ2l2ZW4gcHJvYmUgYWRkcmVzcyBhZ2FpbnN0IHRoZSBibGFja2xpc3QgYW5kCityZWplY3RzIHJlZ2lzdGVyaW5nIGl0LCBpZiB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBpbiB0aGUgYmxhY2tsaXN0LgorCiAyLiBBcmNoaXRlY3R1cmVzIFN1cHBvcnRlZAogCiBLcHJvYmVzLCBqcHJvYmVzLCBhbmQgcmV0dXJuIHByb2JlcyBhcmUgaW1wbGVtZW50ZWQgb24gdGhlIGZvbGxvd2luZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tdXRleC1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9tdXRleC1kZXNpZ24udHh0CmluZGV4IDFkZmU2MmMuLmVlMjMxZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbXV0ZXgtZGVzaWduLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL211dGV4LWRlc2lnbi50eHQKQEAgLTEsMTM5ICsxLDE1NyBAQAogR2VuZXJpYyBNdXRleCBTdWJzeXN0ZW0KIAogc3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KK3VwZGF0ZWQgYnkgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgogCi0gICJXaHkgb24gZWFydGggZG8gd2UgbmVlZCBhIG5ldyBtdXRleCBzdWJzeXN0ZW0sIGFuZCB3aGF0J3Mgd3JvbmcKLSAgIHdpdGggc2VtYXBob3Jlcz8iCitXaGF0IGFyZSBtdXRleGVzPworLS0tLS0tLS0tLS0tLS0tLS0KIAotZmlyc3RseSwgdGhlcmUncyBub3RoaW5nIHdyb25nIHdpdGggc2VtYXBob3Jlcy4gQnV0IGlmIHRoZSBzaW1wbGVyCi1tdXRleCBzZW1hbnRpY3MgYXJlIHN1ZmZpY2llbnQgZm9yIHlvdXIgY29kZSwgdGhlbiB0aGVyZSBhcmUgYSBjb3VwbGUKLW9mIGFkdmFudGFnZXMgb2YgbXV0ZXhlczoKK0luIHRoZSBMaW51eCBrZXJuZWwsIG11dGV4ZXMgcmVmZXIgdG8gYSBwYXJ0aWN1bGFyIGxvY2tpbmcgcHJpbWl0aXZlCit0aGF0IGVuZm9yY2VzIHNlcmlhbGl6YXRpb24gb24gc2hhcmVkIG1lbW9yeSBzeXN0ZW1zLCBhbmQgbm90IG9ubHkgdG8KK3RoZSBnZW5lcmljIHRlcm0gcmVmZXJyaW5nIHRvICdtdXR1YWwgZXhjbHVzaW9uJyBmb3VuZCBpbiBhY2FkZW1pYQorb3Igc2ltaWxhciB0aGVvcmV0aWNhbCB0ZXh0IGJvb2tzLiBNdXRleGVzIGFyZSBzbGVlcGluZyBsb2NrcyB3aGljaAorYmVoYXZlIHNpbWlsYXJseSB0byBiaW5hcnkgc2VtYXBob3JlcywgYW5kIHdlcmUgaW50cm9kdWNlZCBpbiAyMDA2WzFdCithcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGVzZS4gVGhpcyBuZXcgZGF0YSBzdHJ1Y3R1cmUgcHJvdmlkZWQgYSBudW1iZXIKK29mIGFkdmFudGFnZXMsIGluY2x1ZGluZyBzaW1wbGVyIGludGVyZmFjZXMsIGFuZCBhdCB0aGF0IHRpbWUgc21hbGxlcgorY29kZSAoc2VlIERpc2FkdmFudGFnZXMpLgogCi0gLSAnc3RydWN0IG11dGV4JyBpcyBzbWFsbGVyIG9uIG1vc3QgYXJjaGl0ZWN0dXJlczogRS5nLiBvbiB4ODYsCi0gICAnc3RydWN0IHNlbWFwaG9yZScgaXMgMjAgYnl0ZXMsICdzdHJ1Y3QgbXV0ZXgnIGlzIDE2IGJ5dGVzLgotICAgQSBzbWFsbGVyIHN0cnVjdHVyZSBzaXplIG1lYW5zIGxlc3MgUkFNIGZvb3RwcmludCwgYW5kIGJldHRlcgotICAgQ1BVLWNhY2hlIHV0aWxpemF0aW9uLgorWzFdIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzE2NDgwMi8KIAotIC0gdGlnaHRlciBjb2RlLiBPbiB4ODYgaSBnZXQgdGhlIGZvbGxvd2luZyAudGV4dCBzaXplcyB3aGVuCi0gICBzd2l0Y2hpbmcgYWxsIG11dGV4LWFsaWtlIHNlbWFwaG9yZXMgaW4gdGhlIGtlcm5lbCB0byB0aGUgbXV0ZXgKLSAgIHN1YnN5c3RlbToKK0ltcGxlbWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQogCi0gICAgICAgIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQotICAgICAzMjgwMzgwICA4NjgxODggIDM5Njg2MCA0NTQ1NDI4ICA0NTViOTQgdm1saW51eC1zZW1hcGhvcmUKLSAgICAgMzI1NTMyOSAgODY1Mjk2ICAzOTY3MzIgNDUxNzM1NyAgNDRlZGVkIHZtbGludXgtbXV0ZXgKK011dGV4ZXMgYXJlIHJlcHJlc2VudGVkIGJ5ICdzdHJ1Y3QgbXV0ZXgnLCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvbXV0ZXguaAorYW5kIGltcGxlbWVudGVkIGluIGtlcm5lbC9sb2NraW5nL211dGV4LmMuIFRoZXNlIGxvY2tzIHVzZSBhIHRocmVlCitzdGF0ZSBhdG9taWMgY291bnRlciAoLT5jb3VudCkgdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbnQgcG9zc2libGUKK3RyYW5zaXRpb25zIHRoYXQgY2FuIG9jY3VyIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSBsb2NrOgogCi0gICB0aGF0J3MgMjUwNTEgYnl0ZXMgb2YgY29kZSBzYXZlZCwgb3IgYSAwLjc2JSB3aW4gLSBvZmYgdGhlIGhvdHRlc3QKLSAgIGNvZGVwYXRocyBvZiB0aGUga2VybmVsLiAoVGhlIC5kYXRhIHNhdmluZ3MgYXJlIDI4OTIgYnl0ZXMsIG9yIDAuMzMlKQotICAgU21hbGxlciBjb2RlIG1lYW5zIGJldHRlciBpY2FjaGUgZm9vdHByaW50LCB3aGljaCBpcyBvbmUgb2YgdGhlCi0gICBtYWpvciBvcHRpbWl6YXRpb24gZ29hbHMgaW4gdGhlIExpbnV4IGtlcm5lbCBjdXJyZW50bHkuCisJICAxOiB1bmxvY2tlZAorCSAgMDogbG9ja2VkLCBubyB3YWl0ZXJzCisgICBuZWdhdGl2ZTogbG9ja2VkLCB3aXRoIHBvdGVudGlhbCB3YWl0ZXJzCiAKLSAtIHRoZSBtdXRleCBzdWJzeXN0ZW0gaXMgc2xpZ2h0bHkgZmFzdGVyIGFuZCBoYXMgYmV0dGVyIHNjYWxhYmlsaXR5IGZvcgotICAgY29udGVuZGVkIHdvcmtsb2Fkcy4gT24gYW4gOC13YXkgeDg2IHN5c3RlbSwgcnVubmluZyBhIG11dGV4LWJhc2VkCi0gICBrZXJuZWwgYW5kIHRlc3RpbmcgY3JlYXQrdW5saW5rK2Nsb3NlIChvZiBzZXBhcmF0ZSwgcGVyLXRhc2sgZmlsZXMpCi0gICBpbiAvdG1wIHdpdGggMTYgcGFyYWxsZWwgdGFza3MsIHRoZSBhdmVyYWdlIG51bWJlciBvZiBvcHMvc2VjIGlzOgorSW4gaXRzIG1vc3QgYmFzaWMgZm9ybSBpdCBhbHNvIGluY2x1ZGVzIGEgd2FpdC1xdWV1ZSBhbmQgYSBzcGlubG9jawordGhhdCBzZXJpYWxpemVzIGFjY2VzcyB0byBpdC4gQ09ORklHX1NNUCBzeXN0ZW1zIGNhbiBhbHNvIGluY2x1ZGUKK2EgcG9pbnRlciB0byB0aGUgbG9jayB0YXNrIG93bmVyICgtPm93bmVyKSBhcyB3ZWxsIGFzIGEgc3Bpbm5lciBNQ1MKK2xvY2sgKC0+b3NxKSwgYm90aCBkZXNjcmliZWQgYmVsb3cgaW4gKGlpKS4KIAotICAgIFNlbWFwaG9yZXM6ICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhlczoKK1doZW4gYWNxdWlyaW5nIGEgbXV0ZXgsIHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBwYXRocyB0aGF0IGNhbiBiZQordGFrZW4sIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGxvY2s6CiAKLSAgICAkIC4vdGVzdC1tdXRleCBWIDE2IDEwICAgICAgICAgICAgICQgLi90ZXN0LW11dGV4IFYgMTYgMTAKLSAgICA4IENQVXMsIHJ1bm5pbmcgMTYgdGFza3MuICAgICAgICAgIDggQ1BVcywgcnVubmluZyAxNiB0YXNrcy4KLSAgICBjaGVja2luZyBWRlMgcGVyZm9ybWFuY2UuICAgICAgICAgIGNoZWNraW5nIFZGUyBwZXJmb3JtYW5jZS4KLSAgICBhdmcgbG9vcHMvc2VjOiAgICAgIDM0NzEzICAgICAgICAgIGF2ZyBsb29wcy9zZWM6ICAgICAgODQxNTMKLSAgICBDUFUgdXRpbGl6YXRpb246ICAgIDYzJSAgICAgICAgICAgIENQVSB1dGlsaXphdGlvbjogICAgMjIlCisoaSkgZmFzdHBhdGg6IHRyaWVzIHRvIGF0b21pY2FsbHkgYWNxdWlyZSB0aGUgbG9jayBieSBkZWNyZW1lbnRpbmcgdGhlCisgICAgY291bnRlci4gSWYgaXQgd2FzIGFscmVhZHkgdGFrZW4gYnkgYW5vdGhlciB0YXNrIGl0IGdvZXMgdG8gdGhlIG5leHQKKyAgICBwb3NzaWJsZSBwYXRoLiBUaGlzIGxvZ2ljIGlzIGFyY2hpdGVjdHVyZSBzcGVjaWZpYy4gT24geDg2LTY0LCB0aGUKKyAgICBsb2NraW5nIGZhc3RwYXRoIGlzIDIgaW5zdHJ1Y3Rpb25zOgogCi0gICBpLmUuIGluIHRoaXMgd29ya2xvYWQsIHRoZSBtdXRleCBiYXNlZCBrZXJuZWwgd2FzIDIuNCB0aW1lcyBmYXN0ZXIKLSAgIHRoYW4gdGhlIHNlbWFwaG9yZSBiYXNlZCBrZXJuZWwsIF9hbmRfIGl0IGFsc28gaGFkIDIuOCB0aW1lcyBsZXNzIENQVQotICAgdXRpbGl6YXRpb24uIChJbiB0ZXJtcyBvZiAnb3BzIHBlciBDUFUgY3ljbGUnLCB0aGUgc2VtYXBob3JlIGtlcm5lbAotICAgcGVyZm9ybWVkIDU1MSBvcHMvc2VjIHBlciAxJSBvZiBDUFUgdGltZSB1c2VkLCB3aGlsZSB0aGUgbXV0ZXgga2VybmVsCi0gICBwZXJmb3JtZWQgMzgyNSBvcHMvc2VjIHBlciAxJSBvZiBDUFUgdGltZSB1c2VkIC0gaXQgd2FzIDYuOSB0aW1lcwotICAgbW9yZSBlZmZpY2llbnQuKQotCi0gICB0aGUgc2NhbGFiaWxpdHkgZGlmZmVyZW5jZSBpcyB2aXNpYmxlIGV2ZW4gb24gYSAyLXdheSBQNCBIVCBib3g6Ci0KLSAgICBTZW1hcGhvcmVzOiAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4ZXM6Ci0KLSAgICAkIC4vdGVzdC1tdXRleCBWIDE2IDEwICAgICAgICAgICAgICQgLi90ZXN0LW11dGV4IFYgMTYgMTAKLSAgICA0IENQVXMsIHJ1bm5pbmcgMTYgdGFza3MuICAgICAgICAgIDggQ1BVcywgcnVubmluZyAxNiB0YXNrcy4KLSAgICBjaGVja2luZyBWRlMgcGVyZm9ybWFuY2UuICAgICAgICAgIGNoZWNraW5nIFZGUyBwZXJmb3JtYW5jZS4KLSAgICBhdmcgbG9vcHMvc2VjOiAgICAgIDEyNzY1OSAgICAgICAgIGF2ZyBsb29wcy9zZWM6ICAgICAgMTgxMDgyCi0gICAgQ1BVIHV0aWxpemF0aW9uOiAgICAxMDAlICAgICAgICAgICBDUFUgdXRpbGl6YXRpb246ICAgIDM0JQotCi0gICAodGhlIHN0cmFpZ2h0IHBlcmZvcm1hbmNlIGFkdmFudGFnZSBvZiBtdXRleGVzIGlzIDQxJSwgdGhlIHBlci1jeWNsZQotICAgIGVmZmljaWVuY3kgb2YgbXV0ZXhlcyBpcyA0LjEgdGltZXMgYmV0dGVyLikKLQotIC0gdGhlcmUgYXJlIG5vIGZhc3RwYXRoIHRyYWRlb2ZmcywgdGhlIG11dGV4IGZhc3RwYXRoIGlzIGp1c3QgYXMgdGlnaHQKLSAgIGFzIHRoZSBzZW1hcGhvcmUgZmFzdHBhdGguIE9uIHg4NiwgdGhlIGxvY2tpbmcgZmFzdHBhdGggaXMgMgotICAgaW5zdHJ1Y3Rpb25zOgotCi0gICAgYzAzNzdjY2IgPG11dGV4X2xvY2s+OgotICAgIGMwMzc3Y2NiOiAgICAgICBmMCBmZiAwOCAgICAgICAgICAgICAgICBsb2NrIGRlY2wgKCVlYXgpCi0gICAgYzAzNzdjY2U6ICAgICAgIDc4IDBlICAgICAgICAgICAgICAgICAgIGpzICAgICBjMDM3N2NkZSA8LnRleHQuLmxvY2subXV0ZXg+Ci0gICAgYzAzNzdjZDA6ICAgICAgIGMzICAgICAgICAgICAgICAgICAgICAgIHJldAorICAgIDAwMDAwMDAwMDAwMDBlMTAgPG11dGV4X2xvY2s+OgorICAgIGUyMTogICBmMCBmZiAwYiAgICAgICAgICAgICAgICBsb2NrIGRlY2wgKCVyYngpCisgICAgZTI0OiAgIDc5IDA4ICAgICAgICAgICAgICAgICAgIGpucyAgICBlMmUgPG11dGV4X2xvY2srMHgxZT4KIAogICAgdGhlIHVubG9ja2luZyBmYXN0cGF0aCBpcyBlcXVhbGx5IHRpZ2h0OgogCi0gICAgYzAzNzdjZDEgPG11dGV4X3VubG9jaz46Ci0gICAgYzAzNzdjZDE6ICAgICAgIGYwIGZmIDAwICAgICAgICAgICAgICAgIGxvY2sgaW5jbCAoJWVheCkKLSAgICBjMDM3N2NkNDogICAgICAgN2UgMGYgICAgICAgICAgICAgICAgICAgamxlICAgIGMwMzc3Y2U1IDwudGV4dC4ubG9jay5tdXRleCsweDc+Ci0gICAgYzAzNzdjZDY6ICAgICAgIGMzICAgICAgICAgICAgICAgICAgICAgIHJldAorICAgIDAwMDAwMDAwMDAwMDBiYzAgPG11dGV4X3VubG9jaz46CisgICAgYmM4OiAgIGYwIGZmIDA3ICAgICAgICAgICAgICAgIGxvY2sgaW5jbCAoJXJkaSkKKyAgICBiY2I6ICAgN2YgMGEgICAgICAgICAgICAgICAgICAgamcgICAgIGJkNyA8bXV0ZXhfdW5sb2NrKzB4MTc+CiAKLSAtICdzdHJ1Y3QgbXV0ZXgnIHNlbWFudGljcyBhcmUgd2VsbC1kZWZpbmVkIGFuZCBhcmUgZW5mb3JjZWQgaWYKLSAgIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIHR1cm5lZCBvbi4gU2VtYXBob3JlcyBvbiB0aGUgb3RoZXIgaGFuZCBoYXZlCi0gICB2aXJ0dWFsbHkgbm8gZGVidWdnaW5nIGNvZGUgb3IgaW5zdHJ1bWVudGF0aW9uLiBUaGUgbXV0ZXggc3Vic3lzdGVtCi0gICBjaGVja3MgYW5kIGVuZm9yY2VzIHRoZSBmb2xsb3dpbmcgcnVsZXM6CiAKLSAgICogLSBvbmx5IG9uZSB0YXNrIGNhbiBob2xkIHRoZSBtdXRleCBhdCBhIHRpbWUKLSAgICogLSBvbmx5IHRoZSBvd25lciBjYW4gdW5sb2NrIHRoZSBtdXRleAotICAgKiAtIG11bHRpcGxlIHVubG9ja3MgYXJlIG5vdCBwZXJtaXR0ZWQKLSAgICogLSByZWN1cnNpdmUgbG9ja2luZyBpcyBub3QgcGVybWl0dGVkCi0gICAqIC0gYSBtdXRleCBvYmplY3QgbXVzdCBiZSBpbml0aWFsaXplZCB2aWEgdGhlIEFQSQotICAgKiAtIGEgbXV0ZXggb2JqZWN0IG11c3Qgbm90IGJlIGluaXRpYWxpemVkIHZpYSBtZW1zZXQgb3IgY29weWluZwotICAgKiAtIHRhc2sgbWF5IG5vdCBleGl0IHdpdGggbXV0ZXggaGVsZAotICAgKiAtIG1lbW9yeSBhcmVhcyB3aGVyZSBoZWxkIGxvY2tzIHJlc2lkZSBtdXN0IG5vdCBiZSBmcmVlZAotICAgKiAtIGhlbGQgbXV0ZXhlcyBtdXN0IG5vdCBiZSByZWluaXRpYWxpemVkCi0gICAqIC0gbXV0ZXhlcyBtYXkgbm90IGJlIHVzZWQgaW4gaGFyZHdhcmUgb3Igc29mdHdhcmUgaW50ZXJydXB0Ci0gICAqICAgY29udGV4dHMgc3VjaCBhcyB0YXNrbGV0cyBhbmQgdGltZXJzCisoaWkpIG1pZHBhdGg6IGFrYSBvcHRpbWlzdGljIHNwaW5uaW5nLCB0cmllcyB0byBzcGluIGZvciBhY3F1aXNpdGlvbgorICAgICB3aGlsZSB0aGUgbG9jayBvd25lciBpcyBydW5uaW5nIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgdGFza3MgcmVhZHkKKyAgICAgdG8gcnVuIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgKG5lZWRfcmVzY2hlZCkuIFRoZSByYXRpb25hbGUgaXMKKyAgICAgdGhhdCBpZiB0aGUgbG9jayBvd25lciBpcyBydW5uaW5nLCBpdCBpcyBsaWtlbHkgdG8gcmVsZWFzZSB0aGUgbG9jaworICAgICBzb29uLiBUaGUgbXV0ZXggc3Bpbm5lcnMgYXJlIHF1ZXVlZCB1cCB1c2luZyBNQ1MgbG9jayBzbyB0aGF0IG9ubHkKKyAgICAgb25lIHNwaW5uZXIgY2FuIGNvbXBldGUgZm9yIHRoZSBtdXRleC4KIAotICAgZnVydGhlcm1vcmUsIHRoZXJlIGFyZSBhbHNvIGNvbnZlbmllbmNlIGZlYXR1cmVzIGluIHRoZSBkZWJ1Z2dpbmcKLSAgIGNvZGU6CisgICAgIFRoZSBNQ1MgbG9jayAocHJvcG9zZWQgYnkgTWVsbG9yLUNydW1tZXkgYW5kIFNjb3R0KSBpcyBhIHNpbXBsZSBzcGlubG9jaworICAgICB3aXRoIHRoZSBkZXNpcmFibGUgcHJvcGVydGllcyBvZiBiZWluZyBmYWlyIGFuZCB3aXRoIGVhY2ggY3B1IHRyeWluZworICAgICB0byBhY3F1aXJlIHRoZSBsb2NrIHNwaW5uaW5nIG9uIGEgbG9jYWwgdmFyaWFibGUuIEl0IGF2b2lkcyBleHBlbnNpdmUKKyAgICAgY2FjaGVsaW5lIGJvdW5jaW5nIHRoYXQgY29tbW9uIHRlc3QtYW5kLXNldCBzcGlubG9jayBpbXBsZW1lbnRhdGlvbnMKKyAgICAgaW5jdXIuIEFuIE1DUy1saWtlIGxvY2sgaXMgc3BlY2lhbGx5IHRhaWxvcmVkIGZvciBvcHRpbWlzdGljIHNwaW5uaW5nCisgICAgIGZvciBzbGVlcGluZyBsb2NrIGltcGxlbWVudGF0aW9uLiBBbiBpbXBvcnRhbnQgZmVhdHVyZSBvZiB0aGUgY3VzdG9taXplZAorICAgICBNQ1MgbG9jayBpcyB0aGF0IGl0IGhhcyB0aGUgZXh0cmEgcHJvcGVydHkgdGhhdCBzcGlubmVycyBhcmUgYWJsZSB0byBleGl0CisgICAgIHRoZSBNQ1Mgc3BpbmxvY2sgcXVldWUgd2hlbiB0aGV5IG5lZWQgdG8gcmVzY2hlZHVsZS4gVGhpcyBmdXJ0aGVyIGhlbHBzCisgICAgIGF2b2lkIHNpdHVhdGlvbnMgd2hlcmUgTUNTIHNwaW5uZXJzIHRoYXQgbmVlZCB0byByZXNjaGVkdWxlIHdvdWxkIGNvbnRpbnVlCisgICAgIHdhaXRpbmcgdG8gc3BpbiBvbiBtdXRleCBvd25lciwgb25seSB0byBnbyBkaXJlY3RseSB0byBzbG93cGF0aCB1cG9uCisgICAgIG9idGFpbmluZyB0aGUgTUNTIGxvY2suCiAKLSAgICogLSB1c2VzIHN5bWJvbGljIG5hbWVzIG9mIG11dGV4ZXMsIHdoZW5ldmVyIHRoZXkgYXJlIHByaW50ZWQgaW4gZGVidWcgb3V0cHV0Ci0gICAqIC0gcG9pbnQtb2YtYWNxdWlyZSB0cmFja2luZywgc3ltYm9saWMgbG9va3VwIG9mIGZ1bmN0aW9uIG5hbWVzCi0gICAqIC0gbGlzdCBvZiBhbGwgbG9ja3MgaGVsZCBpbiB0aGUgc3lzdGVtLCBwcmludG91dCBvZiB0aGVtCi0gICAqIC0gb3duZXIgdHJhY2tpbmcKLSAgICogLSBkZXRlY3RzIHNlbGYtcmVjdXJzaW5nIGxvY2tzIGFuZCBwcmludHMgb3V0IGFsbCByZWxldmFudCBpbmZvCi0gICAqIC0gZGV0ZWN0cyBtdWx0aS10YXNrIGNpcmN1bGFyIGRlYWRsb2NrcyBhbmQgcHJpbnRzIG91dCBhbGwgYWZmZWN0ZWQKLSAgICogICBsb2NrcyBhbmQgdGFza3MgKGFuZCBvbmx5IHRob3NlIHRhc2tzKQorCisoaWlpKSBzbG93cGF0aDogbGFzdCByZXNvcnQsIGlmIHRoZSBsb2NrIGlzIHN0aWxsIHVuYWJsZSB0byBiZSBhY3F1aXJlZCwKKyAgICAgIHRoZSB0YXNrIGlzIGFkZGVkIHRvIHRoZSB3YWl0LXF1ZXVlIGFuZCBzbGVlcHMgdW50aWwgd29rZW4gdXAgYnkgdGhlCisgICAgICB1bmxvY2sgcGF0aC4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgaXQgYmxvY2tzIGFzIFRBU0tfVU5JTlRFUlJVUFRJQkxFLgorCitXaGlsZSBmb3JtYWxseSBrZXJuZWwgbXV0ZXhlcyBhcmUgc2xlZXBhYmxlIGxvY2tzLCBpdCBpcyBwYXRoIChpaSkgdGhhdAorbWFrZXMgdGhlbSBtb3JlIHByYWN0aWNhbGx5IGEgaHlicmlkIHR5cGUuIEJ5IHNpbXBseSBub3QgaW50ZXJydXB0aW5nIGEKK3Rhc2sgYW5kIGJ1c3ktd2FpdGluZyBmb3IgYSBmZXcgY3ljbGVzIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgc2xlZXBpbmcsCit0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBsb2NrIGhhcyBiZWVuIHNlZW4gdG8gc2lnbmlmaWNhbnRseSBpbXByb3ZlIGEKK251bWJlciBvZiB3b3JrbG9hZHMuIE5vdGUgdGhhdCB0aGlzIHRlY2huaXF1ZSBpcyBhbHNvIHVzZWQgZm9yIHJ3LXNlbWFwaG9yZXMuCisKK1NlbWFudGljcworLS0tLS0tLS0tCisKK1RoZSBtdXRleCBzdWJzeXN0ZW0gY2hlY2tzIGFuZCBlbmZvcmNlcyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCisgICAgLSBPbmx5IG9uZSB0YXNrIGNhbiBob2xkIHRoZSBtdXRleCBhdCBhIHRpbWUuCisgICAgLSBPbmx5IHRoZSBvd25lciBjYW4gdW5sb2NrIHRoZSBtdXRleC4KKyAgICAtIE11bHRpcGxlIHVubG9ja3MgYXJlIG5vdCBwZXJtaXR0ZWQuCisgICAgLSBSZWN1cnNpdmUgbG9ja2luZy91bmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZC4KKyAgICAtIEEgbXV0ZXggbXVzdCBvbmx5IGJlIGluaXRpYWxpemVkIHZpYSB0aGUgQVBJIChzZWUgYmVsb3cpLgorICAgIC0gQSB0YXNrIG1heSBub3QgZXhpdCB3aXRoIGEgbXV0ZXggaGVsZC4KKyAgICAtIE1lbW9yeSBhcmVhcyB3aGVyZSBoZWxkIGxvY2tzIHJlc2lkZSBtdXN0IG5vdCBiZSBmcmVlZC4KKyAgICAtIEhlbGQgbXV0ZXhlcyBtdXN0IG5vdCBiZSByZWluaXRpYWxpemVkLgorICAgIC0gTXV0ZXhlcyBtYXkgbm90IGJlIHVzZWQgaW4gaGFyZHdhcmUgb3Igc29mdHdhcmUgaW50ZXJydXB0CisgICAgICBjb250ZXh0cyBzdWNoIGFzIHRhc2tsZXRzIGFuZCB0aW1lcnMuCisKK1RoZXNlIHNlbWFudGljcyBhcmUgZnVsbHkgZW5mb3JjZWQgd2hlbiBDT05GSUcgREVCVUdfTVVURVhFUyBpcyBlbmFibGVkLgorSW4gYWRkaXRpb24sIHRoZSBtdXRleCBkZWJ1Z2dpbmcgY29kZSBhbHNvIGltcGxlbWVudHMgYSBudW1iZXIgb2Ygb3RoZXIKK2ZlYXR1cmVzIHRoYXQgbWFrZSBsb2NrIGRlYnVnZ2luZyBlYXNpZXIgYW5kIGZhc3RlcjoKKworICAgIC0gVXNlcyBzeW1ib2xpYyBuYW1lcyBvZiBtdXRleGVzLCB3aGVuZXZlciB0aGV5IGFyZSBwcmludGVkCisgICAgICBpbiBkZWJ1ZyBvdXRwdXQuCisgICAgLSBQb2ludC1vZi1hY3F1aXJlIHRyYWNraW5nLCBzeW1ib2xpYyBsb29rdXAgb2YgZnVuY3Rpb24gbmFtZXMsCisgICAgICBsaXN0IG9mIGFsbCBsb2NrcyBoZWxkIGluIHRoZSBzeXN0ZW0sIHByaW50b3V0IG9mIHRoZW0uCisgICAgLSBPd25lciB0cmFja2luZy4KKyAgICAtIERldGVjdHMgc2VsZi1yZWN1cnNpbmcgbG9ja3MgYW5kIHByaW50cyBvdXQgYWxsIHJlbGV2YW50IGluZm8uCisgICAgLSBEZXRlY3RzIG11bHRpLXRhc2sgY2lyY3VsYXIgZGVhZGxvY2tzIGFuZCBwcmludHMgb3V0IGFsbCBhZmZlY3RlZAorICAgICAgbG9ja3MgYW5kIHRhc2tzIChhbmQgb25seSB0aG9zZSB0YXNrcykuCisKKworSW50ZXJmYWNlcworLS0tLS0tLS0tLQorU3RhdGljYWxseSBkZWZpbmUgdGhlIG11dGV4OgorICAgREVGSU5FX01VVEVYKG5hbWUpOworCitEeW5hbWljYWxseSBpbml0aWFsaXplIHRoZSBtdXRleDoKKyAgIG11dGV4X2luaXQobXV0ZXgpOworCitBY3F1aXJlIHRoZSBtdXRleCwgdW5pbnRlcnJ1cHRpYmxlOgorICAgdm9pZCBtdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CisgICB2b2lkIG11dGV4X2xvY2tfbmVzdGVkKHN0cnVjdCBtdXRleCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzKTsKKyAgIGludCAgbXV0ZXhfdHJ5bG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOworCitBY3F1aXJlIHRoZSBtdXRleCwgaW50ZXJydXB0aWJsZToKKyAgIGludCBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfbmVzdGVkKHN0cnVjdCBtdXRleCAqbG9jaywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1YmNsYXNzKTsKKyAgIGludCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IG11dGV4ICpsb2NrKTsKKworQWNxdWlyZSB0aGUgbXV0ZXgsIGludGVycnVwdGlibGUsIGlmIGRlYyB0byAwOgorICAgaW50IGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soYXRvbWljX3QgKmNudCwgc3RydWN0IG11dGV4ICpsb2NrKTsKKworVW5sb2NrIHRoZSBtdXRleDoKKyAgIHZvaWQgbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CisKK1Rlc3QgaWYgdGhlIG11dGV4IGlzIHRha2VuOgorICAgaW50IG11dGV4X2lzX2xvY2tlZChzdHJ1Y3QgbXV0ZXggKmxvY2spOwogCiBEaXNhZHZhbnRhZ2VzCiAtLS0tLS0tLS0tLS0tCiAKLVRoZSBzdHJpY3RlciBtdXRleCBBUEkgbWVhbnMgeW91IGNhbm5vdCB1c2UgbXV0ZXhlcyB0aGUgc2FtZSB3YXkgeW91Ci1jYW4gdXNlIHNlbWFwaG9yZXM6IGUuZy4gdGhleSBjYW5ub3QgYmUgdXNlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LAotbm9yIGNhbiB0aGV5IGJlIHVubG9ja2VkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCB0aGF0IHdoaWNoIGFjcXVpcmVkCi1pdC4gWyBJJ20gbm90IGF3YXJlIG9mIGFueSBvdGhlciAoZS5nLiBwZXJmb3JtYW5jZSkgZGlzYWR2YW50YWdlcyBmcm9tCi11c2luZyBtdXRleGVzIGF0IHRoZSBtb21lbnQsIHBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgZmluZCBhbnkuIF0KK1VubGlrZSBpdHMgb3JpZ2luYWwgZGVzaWduIGFuZCBwdXJwb3NlLCAnc3RydWN0IG11dGV4JyBpcyBsYXJnZXIgdGhhbgorbW9zdCBsb2NrcyBpbiB0aGUga2VybmVsLiBFLmc6IG9uIHg4Ni02NCBpdCBpcyA0MCBieXRlcywgYWxtb3N0IHR3aWNlCithcyBsYXJnZSBhcyAnc3RydWN0IHNlbWFwaG9yZScgKDI0IGJ5dGVzKSBhbmQgOCBieXRlcyBzaHkgb2YgdGhlCisnc3RydWN0IHJ3X3NlbWFwaG9yZScgdmFyaWFudC4gTGFyZ2VyIHN0cnVjdHVyZSBzaXplcyBtZWFuIG1vcmUgQ1BVCitjYWNoZSBhbmQgbWVtb3J5IGZvb3RwcmludC4KIAotSW1wbGVtZW50YXRpb24gb2YgbXV0ZXhlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiB0byB1c2UgbXV0ZXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0nc3RydWN0IG11dGV4JyBpcyB0aGUgbmV3IG11dGV4IHR5cGUsIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9tdXRleC5oIGFuZAotaW1wbGVtZW50ZWQgaW4ga2VybmVsL2xvY2tpbmcvbXV0ZXguYy4gSXQgaXMgYSBjb3VudGVyLWJhc2VkIG11dGV4IHdpdGggYQotc3BpbmxvY2sgYW5kIGEgd2FpdC1saXN0LiBUaGUgY291bnRlciBoYXMgMyBzdGF0ZXM6IDEgZm9yICJ1bmxvY2tlZCIsIDAgZm9yCi0ibG9ja2VkIiBhbmQgbmVnYXRpdmUgbnVtYmVycyAodXN1YWxseSAtMSkgZm9yICJsb2NrZWQsIHBvdGVudGlhbCB3YWl0ZXJzCi1xdWV1ZWQiLgotCi10aGUgQVBJcyBvZiAnc3RydWN0IG11dGV4JyBoYXZlIGJlZW4gc3RyZWFtbGluZWQ6Ci0KLSBERUZJTkVfTVVURVgobmFtZSk7Ci0KLSBtdXRleF9pbml0KG11dGV4KTsKLQotIHZvaWQgbXV0ZXhfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOwotIGludCAgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBtdXRleCAqbG9jayk7Ci0gaW50ICBtdXRleF90cnlsb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7Ci0gdm9pZCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKLSBpbnQgIG11dGV4X2lzX2xvY2tlZChzdHJ1Y3QgbXV0ZXggKmxvY2spOwotIHZvaWQgbXV0ZXhfbG9ja19uZXN0ZWQoc3RydWN0IG11dGV4ICpsb2NrLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MpOwotIGludCAgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZChzdHJ1Y3QgbXV0ZXggKmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdWJjbGFzcyk7Ci0gaW50IGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soYXRvbWljX3QgKmNudCwgc3RydWN0IG11dGV4ICpsb2NrKTsKK1VubGVzcyB0aGUgc3RyaWN0IHNlbWFudGljcyBvZiBtdXRleGVzIGFyZSB1bnN1aXRhYmxlIGFuZC9vciB0aGUgY3JpdGljYWwKK3JlZ2lvbiBwcmV2ZW50cyB0aGUgbG9jayBmcm9tIGJlaW5nIHNoYXJlZCwgYWx3YXlzIHByZWZlciB0aGVtIHRvIGFueSBvdGhlcgorbG9ja2luZyBwcmltaXRpdmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKaW5kZXggYTM4M2MwMC4uOWM3MjNlYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dApAQCAtNTg1LDEzICs1ODUsMTkgQEAKIAliYWxhbmNlLXRsYiBvciA1CiAKIAkJQWRhcHRpdmUgdHJhbnNtaXQgbG9hZCBiYWxhbmNpbmc6IGNoYW5uZWwgYm9uZGluZyB0aGF0Ci0JCWRvZXMgbm90IHJlcXVpcmUgYW55IHNwZWNpYWwgc3dpdGNoIHN1cHBvcnQuICBUaGUKLQkJb3V0Z29pbmcgdHJhZmZpYyBpcyBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlCi0JCWN1cnJlbnQgbG9hZCAoY29tcHV0ZWQgcmVsYXRpdmUgdG8gdGhlIHNwZWVkKSBvbiBlYWNoCi0JCXNsYXZlLiAgSW5jb21pbmcgdHJhZmZpYyBpcyByZWNlaXZlZCBieSB0aGUgY3VycmVudAotCQlzbGF2ZS4gIElmIHRoZSByZWNlaXZpbmcgc2xhdmUgZmFpbHMsIGFub3RoZXIgc2xhdmUKLQkJdGFrZXMgb3ZlciB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGZhaWxlZCByZWNlaXZpbmcKLQkJc2xhdmUuCisJCWRvZXMgbm90IHJlcXVpcmUgYW55IHNwZWNpYWwgc3dpdGNoIHN1cHBvcnQuCisKKwkJSW4gdGxiX2R5bmFtaWNfbGI9MSBtb2RlOyB0aGUgb3V0Z29pbmcgdHJhZmZpYyBpcworCQlkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9hZCAoY29tcHV0ZWQKKwkJcmVsYXRpdmUgdG8gdGhlIHNwZWVkKSBvbiBlYWNoIHNsYXZlLgorCisJCUluIHRsYl9keW5hbWljX2xiPTAgbW9kZTsgdGhlIGxvYWQgYmFsYW5jaW5nIGJhc2VkIG9uCisJCWN1cnJlbnQgbG9hZCBpcyBkaXNhYmxlZCBhbmQgdGhlIGxvYWQgaXMgZGlzdHJpYnV0ZWQKKwkJb25seSB1c2luZyB0aGUgaGFzaCBkaXN0cmlidXRpb24uCisKKwkJSW5jb21pbmcgdHJhZmZpYyBpcyByZWNlaXZlZCBieSB0aGUgY3VycmVudCBzbGF2ZS4KKwkJSWYgdGhlIHJlY2VpdmluZyBzbGF2ZSBmYWlscywgYW5vdGhlciBzbGF2ZSB0YWtlcyBvdmVyCisJCXRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZmFpbGVkIHJlY2VpdmluZyBzbGF2ZS4KIAogCQlQcmVyZXF1aXNpdGU6CiAKQEAgLTczNiw2ICs3NDIsMjggQEAKIAogCVRoaXMgb3B0aW9uIHdhcyBhZGRlZCBmb3IgYm9uZGluZyB2ZXJzaW9uIDMuNi4wLgogCit0bGJfZHluYW1pY19sYgorCisJU3BlY2lmaWVzIGlmIGR5bmFtaWMgc2h1ZmZsaW5nIG9mIGZsb3dzIGlzIGVuYWJsZWQgaW4gdGxiCisJbW9kZS4gVGhlIHZhbHVlIGhhcyBubyBlZmZlY3Qgb24gYW55IG90aGVyIG1vZGVzLgorCisJVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGxiIG1vZGUgaXMgdG8gc2h1ZmZsZSBhY3RpdmUgZmxvd3MgYWNyb3NzCisJc2xhdmVzIGJhc2VkIG9uIHRoZSBsb2FkIGluIHRoYXQgaW50ZXJ2YWwuIFRoaXMgZ2l2ZXMgbmljZSBsYgorCWNoYXJhY3RlcmlzdGljcyBidXQgY2FuIGNhdXNlIHBhY2tldCByZW9yZGVyaW5nLiBJZiByZS1vcmRlcmluZyBpcworCWEgY29uY2VybiB1c2UgdGhpcyB2YXJpYWJsZSB0byBkaXNhYmxlIGZsb3cgc2h1ZmZsaW5nIGFuZCByZWx5IG9uCisJbG9hZCBiYWxhbmNpbmcgcHJvdmlkZWQgc29sZWx5IGJ5IHRoZSBoYXNoIGRpc3RyaWJ1dGlvbi4KKwl4bWl0LWhhc2gtcG9saWN5IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgaGFzaGluZyBmb3IKKwl0aGUgc2V0dXAuCisKKwlUaGUgc3lzZnMgZW50cnkgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBzZXR0aW5nIHBlciBib25kIGRldmljZQorCWFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gdGhlIG1vZHVsZSBwYXJhbWV0ZXIuIFRoZQorCXN5c2ZzIGVudHJ5IGlzIGFsbG93ZWQgdG8gYmUgY2hhbmdlZCBvbmx5IGlmIHRoZSBib25kIGRldmljZSBpcworCWRvd24uCisKKwlUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIgdGhhdCBlbmFibGVzIGZsb3cgc2h1ZmZsaW5nIHdoaWxlIHZhbHVlICIwIgorCWRpc2FibGVzIGl0LiBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgaW4gYm9uZGluZyBkcml2ZXIgMy43LjEKKworCiB1cGRlbGF5CiAKIAlTcGVjaWZpZXMgdGhlIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2FpdCBiZWZvcmUgZW5hYmxpbmcgYQpAQCAtNzY5LDcgKzc5Nyw3IEBACiB4bWl0X2hhc2hfcG9saWN5CiAKIAlTZWxlY3RzIHRoZSB0cmFuc21pdCBoYXNoIHBvbGljeSB0byB1c2UgZm9yIHNsYXZlIHNlbGVjdGlvbiBpbgotCWJhbGFuY2UteG9yIGFuZCA4MDIuM2FkIG1vZGVzLiAgUG9zc2libGUgdmFsdWVzIGFyZToKKwliYWxhbmNlLXhvciwgODAyLjNhZCwgYW5kIHRsYiBtb2Rlcy4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6CiAKIAlsYXllcjIKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2Nhbi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dAppbmRleCA0ZjdhZTUyLi4yMjM2ZDZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dApAQCAtNDY5LDYgKzQ2OSw0MSBAQAogICBoYXZpbmcgdGhpcyAnc2VuZCBvbmx5JyB1c2UtY2FzZSB3ZSBtYXkgcmVtb3ZlIHRoZSByZWNlaXZlIGxpc3QgaW4gdGhlCiAgIEtlcm5lbCB0byBzYXZlIGEgbGl0dGxlIChyZWFsbHkgYSB2ZXJ5IGxpdHRsZSEpIENQVSB1c2FnZS4KIAorICA0LjEuMS4xIENBTiBmaWx0ZXIgdXNhZ2Ugb3B0aW1pc2F0aW9uCisKKyAgVGhlIENBTiBmaWx0ZXJzIGFyZSBwcm9jZXNzZWQgaW4gcGVyLWRldmljZSBmaWx0ZXIgbGlzdHMgYXQgQ0FOIGZyYW1lCisgIHJlY2VwdGlvbiB0aW1lLiBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBjaGVja3MgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZAorICB3aGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGZpbHRlciBsaXN0cyB0aGUgQ0FOIGNvcmUgcHJvdmlkZXMgYW4gb3B0aW1pemVkCisgIGZpbHRlciBoYW5kbGluZyB3aGVuIHRoZSBmaWx0ZXIgc3Vic2NyaXB0aW9uIGZvY3Vzc2VzIG9uIGEgc2luZ2xlIENBTiBJRC4KKworICBGb3IgdGhlIHBvc3NpYmxlIDIwNDggU0ZGIENBTiBpZGVudGlmaWVycyB0aGUgaWRlbnRpZmllciBpcyB1c2VkIGFzIGFuIGluZGV4CisgIHRvIGFjY2VzcyB0aGUgY29ycmVzcG9uZGluZyBzdWJzY3JpcHRpb24gbGlzdCB3aXRob3V0IGFueSBmdXJ0aGVyIGNoZWNrcy4KKyAgRm9yIHRoZSAyXjI5IHBvc3NpYmxlIEVGRiBDQU4gaWRlbnRpZmllcnMgYSAxMCBiaXQgWE9SIGZvbGRpbmcgaXMgdXNlZCBhcworICBoYXNoIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBFRkYgdGFibGUgaW5kZXguCisKKyAgVG8gYmVuZWZpdCBmcm9tIHRoZSBvcHRpbWl6ZWQgZmlsdGVycyBmb3Igc2luZ2xlIENBTiBpZGVudGlmaWVycyB0aGUKKyAgQ0FOX1NGRl9NQVNLIG9yIENBTl9FRkZfTUFTSyBoYXZlIHRvIGJlIHNldCBpbnRvIGNhbl9maWx0ZXIubWFzayB0b2dldGhlcgorICB3aXRoIHNldCBDQU5fRUZGX0ZMQUcgYW5kIENBTl9SVFJfRkxBRyBiaXRzLiBBIHNldCBDQU5fRUZGX0ZMQUcgYml0IGluIHRoZQorICBjYW5fZmlsdGVyLm1hc2sgbWFrZXMgY2xlYXIgdGhhdCBpdCBtYXR0ZXJzIHdoZXRoZXIgYSBTRkYgb3IgRUZGIENBTiBJRCBpcworICBzdWJzY3JpYmVkLiBFLmcuIGluIHRoZSBleGFtcGxlIGZyb20gYWJvdmUKKworICAgIHJmaWx0ZXJbMF0uY2FuX2lkICAgPSAweDEyMzsKKyAgICByZmlsdGVyWzBdLmNhbl9tYXNrID0gQ0FOX1NGRl9NQVNLOworCisgIGJvdGggU0ZGIGZyYW1lcyB3aXRoIENBTiBJRCAweDEyMyBhbmQgRUZGIGZyYW1lcyB3aXRoIDB4WFhYWFgxMjMgY2FuIHBhc3MuCisKKyAgVG8gZmlsdGVyIGZvciBvbmx5IDB4MTIzIChTRkYpIGFuZCAweDEyMzQ1Njc4IChFRkYpIENBTiBpZGVudGlmaWVycyB0aGUKKyAgZmlsdGVyIGhhcyB0byBiZSBkZWZpbmVkIGluIHRoaXMgd2F5IHRvIGJlbmVmaXQgZnJvbSB0aGUgb3B0aW1pemVkIGZpbHRlcnM6CisKKyAgICBzdHJ1Y3QgY2FuX2ZpbHRlciByZmlsdGVyWzJdOworCisgICAgcmZpbHRlclswXS5jYW5faWQgICA9IDB4MTIzOworICAgIHJmaWx0ZXJbMF0uY2FuX21hc2sgPSAoQ0FOX0VGRl9GTEFHIHwgQ0FOX1JUUl9GTEFHIHwgQ0FOX1NGRl9NQVNLKTsKKyAgICByZmlsdGVyWzFdLmNhbl9pZCAgID0gMHgxMjM0NTY3OCB8IENBTl9FRkZfRkxBRzsKKyAgICByZmlsdGVyWzFdLmNhbl9tYXNrID0gKENBTl9FRkZfRkxBRyB8IENBTl9SVFJfRkxBRyB8IENBTl9FRkZfTUFTSyk7CisKKyAgICBzZXRzb2Nrb3B0KHMsIFNPTF9DQU5fUkFXLCBDQU5fUkFXX0ZJTFRFUiwgJnJmaWx0ZXIsIHNpemVvZihyZmlsdGVyKSk7CisKICAgNC4xLjIgUkFXIHNvY2tldCBvcHRpb24gQ0FOX1JBV19FUlJfRklMVEVSCiAKICAgQXMgZGVzY3JpYmVkIGluIGNoYXB0ZXIgMy40IHRoZSBDQU4gaW50ZXJmYWNlIGRyaXZlciBjYW4gZ2VuZXJhdGUgc28KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jZGNfbWJpbS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2RjX21iaW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWVhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2RjX21iaW0udHh0CkBAIC0wLDAgKzEsMzM5IEBACisgICAgIGNkY19tYmltIC0gRHJpdmVyIGZvciBDREMgTUJJTSBNb2JpbGUgQnJvYWRiYW5kIG1vZGVtcworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBjZGNfbWJpbSBkcml2ZXIgc3VwcG9ydHMgVVNCIGRldmljZXMgY29uZm9ybWluZyB0byB0aGUgIlVuaXZlcnNhbAorU2VyaWFsIEJ1cyBDb21tdW5pY2F0aW9ucyBDbGFzcyBTdWJjbGFzcyBTcGVjaWZpY2F0aW9uIGZvciBNb2JpbGUKK0Jyb2FkYmFuZCBJbnRlcmZhY2UgTW9kZWwiIFsxXSwgd2hpY2ggaXMgYSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mCisiVW5pdmVyc2FsIFNlcmlhbCBCdXMgQ29tbXVuaWNhdGlvbnMgQ2xhc3MgU3ViY2xhc3MgU3BlY2lmaWNhdGlvbnMgZm9yCitOZXR3b3JrIENvbnRyb2wgTW9kZWwgRGV2aWNlcyIgWzJdIG9wdGltaXplZCBmb3IgTW9iaWxlIEJyb2FkYmFuZAorZGV2aWNlcywgYWthICIzRy9MVEUgbW9kZW1zIi4KKworCitDb21tYW5kIExpbmUgUGFyYW1ldGVycworPT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGNkY19tYmltIGRyaXZlciBoYXMgbm8gcGFyYW1ldGVycyBvZiBpdHMgb3duLiAgQnV0IHRoZSBwcm9iaW5nCitiZWhhdmlvdXIgZm9yIE5DTSAxLjAgYmFja3dhcmRzIGNvbXBhdGlibGUgTUJJTSBmdW5jdGlvbnMgKGFuCisiTkNNL01CSU0gZnVuY3Rpb24iIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAzLjIgb2YgWzFdKSBpcyBhZmZlY3RlZAorYnkgYSBjZGNfbmNtIGRyaXZlciBwYXJhbWV0ZXI6CisKK3ByZWZlcl9tYmltCistLS0tLS0tLS0tLQorVHlwZTogICAgICAgICAgQm9vbGVhbgorVmFsaWQgUmFuZ2U6ICAgTi9ZICgwLTEpCitEZWZhdWx0IFZhbHVlOiBZIChNQklNIGlzIHByZWZlcnJlZCkKKworVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgc3lzdGVtIHBvbGljeSBmb3IgTkNNL01CSU0gZnVuY3Rpb25zLiAgU3VjaAorZnVuY3Rpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBlaXRoZXIgdGhlIGNkY19uY20gZHJpdmVyIG9yIHRoZSBjZGNfbWJpbQorZHJpdmVyIGRlcGVuZGluZyBvbiB0aGUgcHJlZmVyX21iaW0gc2V0dGluZy4gIFNldHRpbmcgcHJlZmVyX21iaW09TgorbWFrZXMgdGhlIGNkY19tYmltIGRyaXZlciBpZ25vcmUgdGhlc2UgZnVuY3Rpb25zIGFuZCBsZXRzIHRoZSBjZGNfbmNtCitkcml2ZXIgaGFuZGxlIHRoZW0gaW5zdGVhZC4KKworVGhlIHBhcmFtZXRlciBpcyB3cml0YWJsZSwgYW5kIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lLiBBIG1hbnVhbAordW5iaW5kL2JpbmQgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgY2hhbmdlIGVmZmVjdGl2ZSBmb3IgTkNNL01CSU0KK2Z1bmN0aW9ucyBib3VuZCB0byB0aGUgIndyb25nIiBkcml2ZXIKKworCitCYXNpYyB1c2FnZQorPT09PT09PT09PT0KKworTUJJTSBmdW5jdGlvbnMgYXJlIGluYWN0aXZlIHdoZW4gdW5tYW5hZ2VkLiBUaGUgY2RjX21iaW0gZHJpdmVyIG9ubHkKK3Byb3ZpZGVzIGFuIHVzZXJzcGFjZSBpbnRlcmZhY2UgdG8gdGhlIE1CSU0gY29udHJvbCBjaGFubmVsLCBhbmQgd2lsbAorbm90IHBhcnRpY2lwYXRlIGluIHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBmdW5jdGlvbi4gVGhpcyBpbXBsaWVzIHRoYXQgYQordXNlcnNwYWNlIE1CSU0gbWFuYWdlbWVudCBhcHBsaWNhdGlvbiBhbHdheXMgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGEKK01CSU0gZnVuY3Rpb24uCisKK1N1Y2ggdXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBpbmNsdWRlcywgYnV0IGFyZSBub3QgbGltaXRlZCB0bzoKKyAtIG1iaW1jbGkgKGluY2x1ZGVkIHdpdGggdGhlIGxpYm1iaW0gWzNdIGxpYnJhcnkpLCBhbmQKKyAtIE1vZGVtTWFuYWdlciBbNF0KKworRXN0YWJsaXNoaW5nIGEgTUJJTSBJUCBzZXNzaW9uIHJlZXF1aXJlcyBhdCBsZWFzdCB0aGVzZSBhY3Rpb25zIGJ5IHRoZQorbWFuYWdlbWVudCBhcHBsaWNhdGlvbjoKKyAtIG9wZW4gdGhlIGNvbnRyb2wgY2hhbm5lbAorIC0gY29uZmlndXJlIG5ldHdvcmsgY29ubmVjdGlvbiBzZXR0aW5ncworIC0gY29ubmVjdCB0byBuZXR3b3JrCisgLSBjb25maWd1cmUgSVAgaW50ZXJmYWNlCisKK01hbmFnZW1lbnQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBkcml2ZXIgPC0+IHVzZXJzcGFjZSBpbnRlcmZhY2VzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGUgTUJJTQorY29udHJvbCBjaGFubmVsIHByb3RvY29sIGlzIGRlc2NyaWJlZCBpbiBbMV0uCisKKworTUJJTSBjb250cm9sIGNoYW5uZWwgdXNlcnNwYWNlIEFCSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvZGV2L2NkYy13ZG1YIGNoYXJhY3RlciBkZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGRyaXZlciBjcmVhdGVzIGEgdHdvLXdheSBwaXBlIHRvIHRoZSBNQklNIGZ1bmN0aW9uIGNvbnRyb2wgY2hhbm5lbAordXNpbmcgdGhlIGNkYy13ZG0gZHJpdmVyIGFzIGEgc3ViZHJpdmVyLiAgVGhlIHVzZXJzcGFjZSBlbmQgb2YgdGhlCitjb250cm9sIGNoYW5uZWwgcGlwZSBpcyBhIC9kZXYvY2RjLXdkbVggY2hhcmFjdGVyIGRldmljZS4KKworVGhlIGNkY19tYmltIGRyaXZlciBkb2VzIG5vdCBwcm9jZXNzIG9yIHBvbGljZSBtZXNzYWdlcyBvbiB0aGUgY29udHJvbAorY2hhbm5lbC4gIFRoZSBjaGFubmVsIGlzIGZ1bGx5IGRlbGVnYXRlZCB0byB0aGUgdXNlcnNwYWNlIG1hbmFnZW1lbnQKK2FwcGxpY2F0aW9uLiAgSXQgaXMgdGhlcmVmb3JlIHVwIHRvIHRoaXMgYXBwbGljYXRpb24gdG8gZW5zdXJlIHRoYXQgaXQKK2NvbXBsaWVzIHdpdGggYWxsIHRoZSBjb250cm9sIGNoYW5uZWwgcmVxdWlyZW1lbnRzIGluIFsxXS4KKworVGhlIGNkYy13ZG1YIGRldmljZSBpcyBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIE1CSU0gY29udHJvbAoraW50ZXJmYWNlIFVTQiBkZXZpY2UuICBUaGUgY2hhcmFjdGVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYworTUJJTSBmdW5jdGlvbiBjYW4gYmUgbG9va2VkIHVwIHVzaW5nIHN5c2ZzLiAgRm9yIGV4YW1wbGU6CisKKyBiam9ybkBuZW1pOn4kIGxzIC9zeXMvYnVzL3VzYi9kcml2ZXJzL2NkY19tYmltLzItNDoyLjEyL3VzYm1pc2MKKyBjZGMtd2RtMAorCisgYmpvcm5AbmVtaTp+JCBncmVwIC4gL3N5cy9idXMvdXNiL2RyaXZlcnMvY2RjX21iaW0vMi00OjIuMTIvdXNibWlzYy9jZGMtd2RtMC9kZXYKKyAxODA6MAorCisKK1VTQiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHdNYXhDb250cm9sTWVzc2FnZSBmaWVsZCBvZiB0aGUgQ0RDIE1CSU0gZnVuY3Rpb25hbCBkZXNjcmlwdG9yCitsaW1pdHMgdGhlIG1heGltdW0gY29udHJvbCBtZXNzYWdlIHNpemUuIFRoZSBtYW5hZ2FtZW50IGFwcGxpY2F0aW9uIGlzCityZXNwb25zaWJsZSBmb3IgbmVnb3RpYXRpbmcgYSBjb250cm9sIG1lc3NhZ2Ugc2l6ZSBjb21wbHlpbmcgd2l0aCB0aGUKK3JlcXVpcmVtZW50cyBpbiBzZWN0aW9uIDkuMy4xIG9mIFsxXSwgdGFraW5nIHRoaXMgZGVzY3JpcHRvciBmaWVsZAoraW50byBjb25zaWRlcmF0aW9uLgorCitUaGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGNhbiBhY2Nlc3MgdGhlIENEQyBNQklNIGZ1bmN0aW9uYWwKK2Rlc2NyaXB0b3Igb2YgYSBNQklNIGZ1bmN0aW9uIHVzaW5nIGVpdGhlciBvZiB0aGUgdHdvIFVTQgorY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGtlcm5lbCBpbnRlcmZhY2VzIGRlc2NyaWJlZCBpbiBbNl0gb3IgWzddLgorCitTZWUgYWxzbyB0aGUgaW9jdGwgZG9jdW1lbnRhdGlvbiBiZWxvdy4KKworCitGcmFnbWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitUaGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgY29udHJvbCBtZXNzYWdlCitmcmFnbWVudGF0aW9uIGFuZCBkZWZyYWdtZW50YWlvbiwgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gOS41IG9mIFsxXS4KKworCisvZGV2L2NkYy13ZG1YIHdyaXRlKCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIE1CSU0gY29udHJvbCBtZXNzYWdlcyBmcm9tIHRoZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uICptdXN0IG5vdCoKK2V4Y2VlZCB0aGUgbmVnb3RpYXRlZCBjb250cm9sIG1lc3NhZ2Ugc2l6ZS4KKworCisvZGV2L2NkYy13ZG1YIHJlYWQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uICptdXN0KiBhY2NlcHQgY29udHJvbCBtZXNzYWdlcyBvZiB1cCB0aGUKK25lZ290aWF0ZWQgY29udHJvbCBtZXNzYWdlIHNpemUuCisKKworL2Rldi9jZGMtd2RtWCBpb2N0bCgpCistLS0tLS0tLS0tLS0tLS0tLS0tLQorSU9DVExfV0RNX01BWF9DT01NQU5EOiBHZXQgTWF4aW11bSBDb21tYW5kIFNpemUKK1RoaXMgaW9jdGwgcmV0dXJucyB0aGUgd01heENvbnRyb2xNZXNzYWdlIGZpZWxkIG9mIHRoZSBDREMgTUJJTQorZnVuY3Rpb25hbCBkZXNjcmlwdG9yIGZvciBNQklNIGRldmljZXMuICBUaGlzIGlzIGludGVuZGVkIGFzIGEKK2NvbnZlbmllbmNlLCBlbGltaW5hdGluZyB0aGUgbmVlZCB0byBwYXJzZSB0aGUgVVNCIGRlc2NyaXB0b3JzIGZyb20KK3VzZXJzcGFjZS4KKworCSNpbmNsdWRlIDxzdGRpby5oPgorCSNpbmNsdWRlIDxmY250bC5oPgorCSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKwkjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwkjaW5jbHVkZSA8bGludXgvdXNiL2NkYy13ZG0uaD4KKwlpbnQgbWFpbigpCisJeworCQlfX3UxNiBtYXg7CisJCWludCBmZCA9IG9wZW4oIi9kZXYvY2RjLXdkbTAiLCBPX1JEV1IpOworCQlpZiAoIWlvY3RsKGZkLCBJT0NUTF9XRE1fTUFYX0NPTU1BTkQsICZtYXgpKQorCQkJcHJpbnRmKCJ3TWF4Q29udHJvbE1lc3NhZ2UgaXMgJWRcbiIsIG1heCk7CisJfQorCisKK0N1c3RvbSBkZXZpY2Ugc2VydmljZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBNQklNIHNwZWNpZmljYXRpb24gYWxsb3dzIHZlbmRvcnMgdG8gZnJlZWx5IGRlZmluZSBhZGRpdGlvbmFsCitzZXJ2aWNlcy4gIFRoaXMgaXMgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSBjZGNfbWJpbSBkcml2ZXIuCisKK1N1cHBvcnQgZm9yIG5ldyBNQklNIHNlcnZpY2VzLCBpbmNsdWRpbmcgdmVuZG9yIHNwZWNpZmllZCBzZXJ2aWNlcywgaXMKK2ltcGxlbWVudGVkIGVudGlyZWx5IGluIHVzZXJzcGFjZSwgbGlrZSB0aGUgcmVzdCBvZiB0aGUgTUJJTSBjb250cm9sCitwcm90b2NvbAorCitOZXcgc2VydmljZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIE1CSU0gUmVnaXN0cnkgWzVdLgorCisKKworTUJJTSBkYXRhIGNoYW5uZWwgdXNlcnNwYWNlIEFCSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit3d2FuWSBuZXR3b3JrIGRldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBjZGNfbWJpbSBkcml2ZXIgcmVwcmVzZW50cyB0aGUgTUJJTSBkYXRhIGNoYW5uZWwgYXMgYSBzaW5nbGUKK25ldHdvcmsgZGV2aWNlIG9mIHRoZSAid3dhbiIgdHlwZS4gVGhpcyBuZXR3b3JrIGRldmljZSBpcyBpbml0aWFsbHkKK21hcHBlZCB0byBNQklNIElQIHNlc3Npb24gMC4KKworCitNdWx0aXBsZXhlZCBJUCBzZXNzaW9ucyAoSVBTKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01CSU0gYWxsb3dzIG11bHRpcGxleGluZyB1cCB0byAyNTYgSVAgc2Vzc2lvbnMgb3ZlciBhIHNpbmdsZSBVU0IgZGF0YQorY2hhbm5lbC4gIFRoZSBjZGNfbWJpbSBkcml2ZXIgbW9kZWxzIHN1Y2ggSVAgc2Vzc2lvbnMgYXMgODAyLjFxIFZMQU4KK3N1YmRldmljZXMgb2YgdGhlIG1hc3RlciB3d2FuWSBkZXZpY2UsIG1hcHBpbmcgTUJJTSBJUCBzZXNzaW9uIFogdG8KK1ZMQU4gSUQgWiBmb3IgYWxsIHZhbHVlcyBvZiBaIGdyZWF0ZXIgdGhhbiAwLgorCitUaGUgZGV2aWNlIG1heGltdW0gWiBpcyBnaXZlbiBpbiB0aGUgTUJJTV9ERVZJQ0VfQ0FQU19JTkZPIHN0cnVjdHVyZQorZGVzY3JpYmVkIGluIHNlY3Rpb24gMTAuNS4xIG9mIFsxXS4KKworVGhlIHVzZXJzcGFjZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgbmV3CitWTEFOIGxpbmtzIHByaW9yIHRvIGVzdGFibGlzaGluZyBNQklNIElQIHNlc3Npb25zIHdoZXJlIHRoZSBTZXNzaW9uSWQKK2lzIGdyZWF0ZXIgdGhhbiAwLiBUaGVzZSBsaW5rcyBjYW4gYmUgYWRkZWQgYnkgdXNpbmcgdGhlIG5vcm1hbCBWTEFOCitrZXJuZWwgaW50ZXJmYWNlcywgZWl0aGVyIGlvY3RsIG9yIG5ldGxpbmsuCisKK0ZvciBleGFtcGxlLCBhZGRpbmcgYSBsaW5rIGZvciBhIE1CSU0gSVAgc2Vzc2lvbiB3aXRoIFNlc3Npb25JZCAzOgorCisgIGlwIGxpbmsgYWRkIGxpbmsgd3dhbjAgbmFtZSB3d2FuMC4zIHR5cGUgdmxhbiBpZCAzCisKK1RoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IG1hcCB0aGUgInd3YW4wLjMiIG5ldHdvcmsgZGV2aWNlIHRvIE1CSU0KK0lQIHNlc3Npb24gMy4KKworCitEZXZpY2UgU2VydmljZSBTdHJlYW1zIChEU1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNQklNIGFsc28gYWxsb3dzIHVwIHRvIDI1NiBub24tSVAgZGF0YSBzdHJlYW1zIHRvIGJlIG11bHRpcGxleGVkIG92ZXIKK3RoZSBzYW1lIHNoYXJlZCBVU0IgZGF0YSBjaGFubmVsLiAgVGhlIGNkY19tYmltIGRyaXZlciBtb2RlbHMgdGhlc2UKK3Nlc3Npb25zIGFzIGFub3RoZXIgc2V0IG9mIDgwMi4xcSBWTEFOIHN1YmRldmljZXMgb2YgdGhlIG1hc3RlciB3d2FuWQorZGV2aWNlLCBtYXBwaW5nIE1CSU0gRFNTIHNlc3Npb24gQSB0byBWTEFOIElEICgyNTYgKyBBKSBmb3IgYWxsIHZhbHVlcworb2YgQS4KKworVGhlIGRldmljZSBtYXhpbXVtIEEgaXMgZ2l2ZW4gaW4gdGhlIE1CSU1fREVWSUNFX1NFUlZJQ0VTX0lORk8KK3N0cnVjdHVyZSBkZXNjcmliZWQgaW4gc2VjdGlvbiAxMC41LjI5IG9mIFsxXS4KKworVGhlIERTUyBWTEFOIHN1YmRldmljZXMgYXJlIHVzZWQgYXMgYSBwcmFjdGljYWwgaW50ZXJmYWNlIGJldHdlZW4gdGhlCitzaGFyZWQgTUJJTSBkYXRhIGNoYW5uZWwgYW5kIGEgTUJJTSBEU1MgYXdhcmUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uLgorSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHByZXNlbnRlZCBhcy1pcyB0byBhbiBlbmQgdXNlci4gVGhlCithc3N1bXB0aW9uIGlzIHRoYXQgYW4gdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGluaXRpYXRpbmcgYSBEU1Mgc2Vzc2lvbgorYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSBuZWNlc3NhcnkgZnJhbWluZyBvZiB0aGUgRFNTIGRhdGEsIHByZXNlbnRpbmcKK3RoZSBzdHJlYW0gdG8gdGhlIGVuZCB1c2VyIGluIGFuIGFwcHJvcHJpYXRlIHdheSBmb3IgdGhlIHN0cmVhbSB0eXBlLgorCitUaGUgbmV0d29yayBkZXZpY2UgQUJJIHJlcXVpcmVzIGEgZHVtbXkgZXRoZXJuZXQgaGVhZGVyIGZvciBldmVyeSBEU1MKK2RhdGEgZnJhbWUgYmVpbmcgdHJhbnNwb3J0ZWQuICBUaGUgY29udGVudHMgb2YgdGhpcyBoZWFkZXIgaXMKK2FyYml0cmFyeSwgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisgLSBUWCBmcmFtZXMgdXNpbmcgYW4gSVAgcHJvdG9jb2wgKDB4MDgwMCBvciAweDg2ZGQpIHdpbGwgYmUgZHJvcHBlZAorIC0gUlggZnJhbWVzIHdpbGwgaGF2ZSB0aGUgcHJvdG9jb2wgZmllbGQgc2V0IHRvIEVUSF9QXzgwMl8zIChidXQgd2lsbAorICAgbm90IGJlIHByb3Blcmx5IGZvcm1hdHRlZCA4MDIuMyBmcmFtZXMpCisgLSBSWCBmcmFtZXMgd2lsbCBoYXZlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNldCB0byB0aGUgaGFyZHdhcmUKKyAgIGFkZHJlc3Mgb2YgdGhlIG1hc3RlciBkZXZpY2UKKworVGhlIERTUyBzdXBwb3J0aW5nIHVzZXJzcGFjZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgorYWRkaW5nIHRoZSBkdW1teSBldGhlcm5ldCBoZWFkZXIgb24gVFggYW5kIHN0cmlwcGluZyBpdCBvbiBSWC4KKworVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIHVzaW5nIHRvb2xzIGNvbW1vbmx5IGF2YWlsYWJsZSwgZXhwb3J0aW5nCitEc3NTZXNzaW9uSWQgNSBhcyBhIHB0eSBjaGFyYWN0ZXIgZGV2aWNlIHBvaW50ZWQgdG8gYnkgYSAvZGV2L25tZWEKK3N5bWxpbms6CisKKyAgaXAgbGluayBhZGQgbGluayB3d2FuMCBuYW1lIHd3YW4wLmRzczUgdHlwZSB2bGFuIGlkIDI2MQorICBpcCBsaW5rIHNldCBkZXYgd3dhbjAuZHNzNSB1cAorICBzb2NhdCBJTlRFUkZBQ0U6d3dhbjAuZHNzNSx0eXBlPTIgUFRZOixlY2hvPTAsbGluaz0vZGV2L25tZWEKKworVGhpcyBpcyBvbmx5IGFuIGV4YW1wbGUsIG1vc3Qgc3VpdGFibGUgZm9yIHRlc3Rpbmcgb3V0IGEgRFNTCitzZXJ2aWNlLiBVc2Vyc3BhY2UgYXBwbGljYXRpb25zIHN1cHBvcnRpbmcgc3BlY2lmaWMgTUJJTSBEU1Mgc2VydmljZXMKK2FyZSBleHBlY3RlZCB0byB1c2UgdGhlIHRvb2xzIGFuZCBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIHJlcXVpcmVkIGJ5Cit0aGF0IHNlcnZpY2UuCisKK05vdGUgdGhhdCBhZGRpbmcgVkxBTiBsaW5rcyBmb3IgRFNTIHNlc3Npb25zIGlzIGVudGlyZWx5IG9wdGlvbmFsLiAgQQorbWFuYWdlbWVudCBhcHBsaWNhdGlvbiBtYXkgaW5zdGVhZCBjaG9vc2UgdG8gYmluZCBhIHBhY2tldCBzb2NrZXQKK2RpcmVjdGx5IHRvIHRoZSBtYXN0ZXIgbmV0d29yayBkZXZpY2UsIHVzaW5nIHRoZSByZWNlaXZlZCBWTEFOIHRhZ3MgdG8KK21hcCBmcmFtZXMgdG8gdGhlIGNvcnJlY3QgRFNTIHNlc3Npb24gYW5kIGFkZGluZyAxOCBieXRlIFZMQU4gZXRoZXJuZXQKK2hlYWRlcnMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdGFnIG9uIFRYLiAgSW4gdGhpcyBjYXNlIHVzaW5nIGEgc29ja2V0CitmaWx0ZXIgaXMgcmVjb21tZW5kZWQsIG1hdGNoaW5nIG9ubHkgdGhlIERTUyBWTEFOIHN1YnNldC4gVGhpcyBhdm9pZAordW5uZWNlc3NhcnkgY29weWluZyBvZiB1bnJlbGF0ZWQgSVAgc2Vzc2lvbiBkYXRhIHRvIHVzZXJzcGFjZS4gIEZvcgorZXhhbXBsZToKKworICBzdGF0aWMgc3RydWN0IHNvY2tfZmlsdGVyIGRzc2ZpbHRlcltdID0geworCS8qIHVzZSBzcGVjaWFsIG5lZ2F0aXZlIG9mZnNldHMgdG8gZ2V0IFZMQU4gdGFnICovCisJQlBGX1NUTVQoQlBGX0xEfEJQRl9CfEJQRl9BQlMsIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCksCisJQlBGX0pVTVAoQlBGX0pNUHxCUEZfSkVRfEJQRl9LLCAxLCAwLCA2KSwgLyogdHJ1ZSAqLworCisJLyogdmVyaWZ5IERTUyBWTEFOIHJhbmdlICovCisJQlBGX1NUTVQoQlBGX0xEfEJQRl9IfEJQRl9BQlMsIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUcpLAorCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pHRXxCUEZfSywgMjU2LCAwLCA0KSwJLyogMjU2IGlzIGZpcnN0IERTUyBWTEFOICovCisJQlBGX0pVTVAoQlBGX0pNUHxCUEZfSkdFfEJQRl9LLCA1MTIsIDMsIDApLAkvKiA1MTEgaXMgbGFzdCBEU1MgVkxBTiAqLworCisJLyogdmVyaWZ5IGV0aGVydHlwZSAqLworICAgICAgICBCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0FCUywgMiAqIEVUSF9BTEVOKSwKKyAgICAgICAgQlBGX0pVTVAoQlBGX0pNUHxCUEZfSkVRfEJQRl9LLCBFVEhfUF84MDJfMywgMCwgMSksCisKKyAgICAgICAgQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgKHVfaW50KS0xKSwJLyogYWNjZXB0ICovCisgICAgICAgIEJQRl9TVE1UKEJQRl9SRVR8QlBGX0ssIDApLAkJLyogaWdub3JlICovCisgIH07CisKKworCitUYWdnZWQgSVAgc2Vzc2lvbiAwIFZMQU4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXMgZGVzY3JpYmVkIGFib3ZlLCBNQklNIElQIHNlc3Npb24gMCBpcyB0cmVhdGVkIGFzIHNwZWNpYWwgYnkgdGhlCitkcml2ZXIuICBJdCBpcyBpbml0aWFsbHkgbWFwcGVkIHRvIHVudGFnZ2VkIGZyYW1lcyBvbiB0aGUgd3dhblkKK25ldHdvcmsgZGV2aWNlLgorCitUaGlzIG1hcHBpbmcgaW1wbGllcyBhIGZldyByZXN0cmljdGlvbnMgb24gbXVsdGlwbGV4ZWQgSVBTIGFuZCBEU1MKK3Nlc3Npb25zLCB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSBwcmFjdGljYWw6CisgLSBubyBJUFMgb3IgRFNTIHNlc3Npb24gY2FuIHVzZSBhIGZyYW1lIHNpemUgZ3JlYXRlciB0aGFuIHRoZSBNVFUgb24KKyAgIElQIHNlc3Npb24gMAorIC0gbm8gSVBTIG9yIERTUyBzZXNzaW9uIGNhbiBiZSBpbiB0aGUgdXAgc3RhdGUgdW5sZXNzIHRoZSBuZXR3b3JrCisgICBkZXZpY2UgcmVwcmVzZW50aW5nIElQIHNlc3Npb24gMCBhbHNvIGlzIHVwCisKK1RoZXNlIHByb2JsZW1zIGNhbiBiZSBhdm9pZGVkIGJ5IG9wdGlvbmFsbHkgbWFraW5nIHRoZSBkcml2ZXIgbWFwIElQCitzZXNzaW9uIDAgdG8gYSBWTEFOIHN1YmRldmljZSwgc2ltaWxhciB0byBhbGwgb3RoZXIgSVAgc2Vzc2lvbnMuICBUaGlzCitiZWhhdmlvdXIgaXMgdHJpZ2dlcmVkIGJ5IGFkZGluZyBhIFZMQU4gbGluayBmb3IgdGhlIG1hZ2ljIFZMQU4gSUQKKzQwOTQuICBUaGUgZHJpdmVyIHdpbGwgdGhlbiBpbW1lZGlhdGVseSBzdGFydCBtYXBwaW5nIE1CSU0gSVAgc2Vzc2lvbgorMCB0byB0aGlzIFZMQU4sIGFuZCB3aWxsIGRyb3AgdW50YWdnZWQgZnJhbWVzIG9uIHRoZSBtYXN0ZXIgd3dhblkKK2RldmljZS4KKworVGlwOiBJdCBtaWdodCBiZSBsZXNzIGNvbmZ1c2luZyB0byB0aGUgZW5kIHVzZXIgdG8gbmFtZSB0aGlzIFZMQU4KK3N1YmRldmljZSBhZnRlciB0aGUgTUJJTSBTZXNzaW9uSUQgaW5zdGVhZCBvZiB0aGUgVkxBTiBJRC4gIEZvcgorZXhhbXBsZToKKworICBpcCBsaW5rIGFkZCBsaW5rIHd3YW4wIG5hbWUgd3dhbjAuMCB0eXBlIHZsYW4gaWQgNDA5NAorCisKK1ZMQU4gbWFwcGluZworLS0tLS0tLS0tLS0tCisKK1N1bW1hcml6aW5nIHRoZSBjZGNfbWJpbSBkcml2ZXIgbWFwcGluZyBkZXNjcmliZWQgYWJvdmUsIHdlIGhhdmUgdGhpcworcmVsYXRpb25zaGlwIGJldHdlZW4gVkxBTiB0YWdzIG9uIHRoZSB3d2FuWSBuZXR3b3JrIGRldmljZSBhbmQgTUJJTQorc2Vzc2lvbnMgb24gdGhlIHNoYXJlZCBVU0IgZGF0YSBjaGFubmVsOgorCisgIFZMQU4gSUQgICAgICAgTUJJTSB0eXBlICAgTUJJTSBTZXNzaW9uSUQgICAgICAgICAgIE5vdGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB1bnRhZ2dlZCAgICAgIElQUyAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICBhKQorICAxIC0gMjU1ICAgICAgIElQUyAgICAgICAgIDEgLSAyNTUgPFZMQU5JRD4KKyAgMjU2IC0gNTExICAgICBEU1MgICAgICAgICAwIC0gMjU1IDxWTEFOSUQgLSAyNTY+CisgIDUxMiAtIDQwOTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpCisgIDQwOTQgICAgICAgICAgSVBTICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgIGMpCisKKyAgICBhKSBpZiBubyBWTEFOIElEIDQwOTQgbGluayBleGlzdHMsIGVsc2UgZHJvcHBlZAorICAgIGIpIHVuc3VwcG9ydGVkIFZMQU4gcmFuZ2UsIHVuY29uZGl0aW9uYWxseSBkcm9wcGVkCisgICAgYykgaWYgYSBWTEFOIElEIDQwOTQgbGluayBleGlzdHMsIGVsc2UgZHJvcHBlZAorCisKKworCitSZWZlcmVuY2VzCis9PT09PT09PT09CisKK1sxXSBVU0IgSW1wbGVtZW50ZXJzIEZvcnVtLCBJbmMuIC0gIlVuaXZlcnNhbCBTZXJpYWwgQnVzCisgICAgICBDb21tdW5pY2F0aW9ucyBDbGFzcyBTdWJjbGFzcyBTcGVjaWZpY2F0aW9uIGZvciBNb2JpbGUgQnJvYWRiYW5kCisgICAgICBJbnRlcmZhY2UgTW9kZWwiLCBSZXZpc2lvbiAxLjAgKEVycmF0YSAxKSwgTWF5IDEsIDIwMTMKKyAgICAgIC0gaHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvZG9jcy9kZXZjbGFzc19kb2NzLworCitbMl0gVVNCIEltcGxlbWVudGVycyBGb3J1bSwgSW5jLiAtICJVbml2ZXJzYWwgU2VyaWFsIEJ1cworICAgICAgQ29tbXVuaWNhdGlvbnMgQ2xhc3MgU3ViY2xhc3MgU3BlY2lmaWNhdGlvbnMgZm9yIE5ldHdvcmsgQ29udHJvbAorICAgICAgTW9kZWwgRGV2aWNlcyIsIFJldmlzaW9uIDEuMCAoRXJyYXRhIDEpLCBOb3ZlbWJlciAyNCwgMjAxMAorICAgICAgLSBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kb2NzL2RldmNsYXNzX2RvY3MvCisKK1szXSBsaWJtYmltIC0gImEgZ2xpYi1iYXNlZCBsaWJyYXJ5IGZvciB0YWxraW5nIHRvIFdXQU4gbW9kZW1zIGFuZAorICAgICAgZGV2aWNlcyB3aGljaCBzcGVhayB0aGUgTW9iaWxlIEludGVyZmFjZSBCcm9hZGJhbmQgTW9kZWwgKE1CSU0pCisgICAgICBwcm90b2NvbCIKKyAgICAgIC0gaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9saWJtYmltLworCitbNF0gTW9kZW1NYW5hZ2VyIC0gImEgREJ1cy1hY3RpdmF0ZWQgZGFlbW9uIHdoaWNoIGNvbnRyb2xzIG1vYmlsZQorICAgICAgYnJvYWRiYW5kICgyRy8zRy80RykgZGV2aWNlcyBhbmQgY29ubmVjdGlvbnMiCisgICAgICAtIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvU29mdHdhcmUvTW9kZW1NYW5hZ2VyLworCitbNV0gIk1CSU0gKE1vYmlsZSBCcm9hZGJhbmQgSW50ZXJmYWNlIE1vZGVsKSBSZWdpc3RyeSIKKyAgICAgICAtIGh0dHA6Ly9jb21wbGlhbmNlLnVzYi5vcmcvbWJpbS8KKworWzZdICIvcHJvYy9idXMvdXNiIGZpbGVzeXN0ZW0gb3V0cHV0IgorICAgICAgIC0gRG9jdW1lbnRhdGlvbi91c2IvcHJvY191c2JfaW5mby50eHQKKworWzddICIvc3lzL2J1cy91c2IvZGV2aWNlcy8uLi4vZGVzY3JpcHRvcnMiCisgICAgICAgLSBEb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtYnVzLXVzYgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpbHRlci50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dAppbmRleCBlM2JhNzUzLi5lZTc4ZWJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dApAQCAtMjgxLDYgKzI4MSw3IEBACiAgIGNwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKQogICB2bGFuX3RjaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fdHhfdGFnX2dldChza2IpCiAgIHZsYW5fcHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl90eF90YWdfcHJlc2VudChza2IpCisgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJhbmRvbV91MzIoKQogCiBUaGVzZSBleHRlbnNpb25zIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggJyMnLgogRXhhbXBsZXMgZm9yIGxvdy1sZXZlbCBCUEY6CkBAIC0zMDgsNiArMzA5LDE4IEBACiAgIHJldCAjLTEKICAgZHJvcDogcmV0ICMwCiAKKyoqIGljbXAgcmFuZG9tIHBhY2tldCBzYW1wbGluZywgMSBpbiA0CisgIGxkaCBbMTJdCisgIGpuZSAjMHg4MDAsIGRyb3AKKyAgbGRiIFsyM10KKyAgam5lcSAjMSwgZHJvcAorICAjIGdldCBhIHJhbmRvbSB1aW50MzIgbnVtYmVyCisgIGxkIHJhbmQKKyAgbW9kICM0CisgIGpuZXEgIzEsIGRyb3AKKyAgcmV0ICMtMQorICBkcm9wOiByZXQgIzAKKwogKiogU0VDQ09NUCBmaWx0ZXIgZXhhbXBsZToKIAogICBsZCBbNF0gICAgICAgICAgICAgICAgICAvKiBvZmZzZXRvZihzdHJ1Y3Qgc2VjY29tcF9kYXRhLCBhcmNoKSAqLwpAQCAtNTQ4LDQyICs1NjEsNDMgQEAKIAogQlBGIGtlcm5lbCBpbnRlcm5hbHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbnRlcm5hbGx5LCBmb3IgdGhlIGtlcm5lbCBpbnRlcnByZXRlciwgYSBkaWZmZXJlbnQgQlBGIGluc3RydWN0aW9uIHNldAorSW50ZXJuYWxseSwgZm9yIHRoZSBrZXJuZWwgaW50ZXJwcmV0ZXIsIGEgZGlmZmVyZW50IGluc3RydWN0aW9uIHNldAogZm9ybWF0IHdpdGggc2ltaWxhciB1bmRlcmx5aW5nIHByaW5jaXBsZXMgZnJvbSBCUEYgZGVzY3JpYmVkIGluIHByZXZpb3VzCiBwYXJhZ3JhcGhzIGlzIGJlaW5nIHVzZWQuIEhvd2V2ZXIsIHRoZSBpbnN0cnVjdGlvbiBzZXQgZm9ybWF0IGlzIG1vZGVsbGVkCiBjbG9zZXIgdG8gdGhlIHVuZGVybHlpbmcgYXJjaGl0ZWN0dXJlIHRvIG1pbWljIG5hdGl2ZSBpbnN0cnVjdGlvbiBzZXRzLCBzbwotdGhhdCBhIGJldHRlciBwZXJmb3JtYW5jZSBjYW4gYmUgYWNoaWV2ZWQgKG1vcmUgZGV0YWlscyBsYXRlcikuCit0aGF0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIGNhbiBiZSBhY2hpZXZlZCAobW9yZSBkZXRhaWxzIGxhdGVyKS4gVGhpcyBuZXcKK0lTQSBpcyBjYWxsZWQgJ2VCUEYnIG9yICdpbnRlcm5hbCBCUEYnIGludGVyY2hhbmdlYWJseS4gKE5vdGU6IGVCUEYgd2hpY2gKK29yaWdpbmF0ZXMgZnJvbSBbZV14dGVuZGVkIEJQRiBpcyBub3QgdGhlIHNhbWUgYXMgQlBGIGV4dGVuc2lvbnMhIFdoaWxlCitlQlBGIGlzIGFuIElTQSwgQlBGIGV4dGVuc2lvbnMgZGF0ZSBiYWNrIHRvIGNsYXNzaWMgQlBGJ3MgJ292ZXJsb2FkaW5nJworb2YgQlBGX0xEIHwgQlBGX3tCLEgsV30gfCBCUEZfQUJTIGluc3RydWN0aW9uLikKIAogSXQgaXMgZGVzaWduZWQgdG8gYmUgSklUZWQgd2l0aCBvbmUgdG8gb25lIG1hcHBpbmcsIHdoaWNoIGNhbiBhbHNvIG9wZW4gdXAKLXRoZSBwb3NzaWJpbGl0eSBmb3IgR0NDL0xMVk0gY29tcGlsZXJzIHRvIGdlbmVyYXRlIG9wdGltaXplZCBCUEYgY29kZSB0aHJvdWdoCi1hIEJQRiBiYWNrZW5kIHRoYXQgcGVyZm9ybXMgYWxtb3N0IGFzIGZhc3QgYXMgbmF0aXZlbHkgY29tcGlsZWQgY29kZS4KK3RoZSBwb3NzaWJpbGl0eSBmb3IgR0NDL0xMVk0gY29tcGlsZXJzIHRvIGdlbmVyYXRlIG9wdGltaXplZCBlQlBGIGNvZGUgdGhyb3VnaAorYW4gZUJQRiBiYWNrZW5kIHRoYXQgcGVyZm9ybXMgYWxtb3N0IGFzIGZhc3QgYXMgbmF0aXZlbHkgY29tcGlsZWQgY29kZS4KIAogVGhlIG5ldyBpbnN0cnVjdGlvbiBzZXQgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgd2l0aCB0aGUgcG9zc2libGUgZ29hbCBpbgotbWluZCB0byB3cml0ZSBwcm9ncmFtcyBpbiAicmVzdHJpY3RlZCBDIiBhbmQgY29tcGlsZSBpbnRvIEJQRiB3aXRoIGEgb3B0aW9uYWwKK21pbmQgdG8gd3JpdGUgcHJvZ3JhbXMgaW4gInJlc3RyaWN0ZWQgQyIgYW5kIGNvbXBpbGUgaW50byBlQlBGIHdpdGggYSBvcHRpb25hbAogR0NDL0xMVk0gYmFja2VuZCwgc28gdGhhdCBpdCBjYW4ganVzdC1pbi10aW1lIG1hcCB0byBtb2Rlcm4gNjQtYml0IENQVXMgd2l0aAotbWluaW1hbCBwZXJmb3JtYW5jZSBvdmVyaGVhZCBvdmVyIHR3byBzdGVwcywgdGhhdCBpcywgQyAtPiBCUEYgLT4gbmF0aXZlIGNvZGUuCittaW5pbWFsIHBlcmZvcm1hbmNlIG92ZXJoZWFkIG92ZXIgdHdvIHN0ZXBzLCB0aGF0IGlzLCBDIC0+IGVCUEYgLT4gbmF0aXZlIGNvZGUuCiAKIEN1cnJlbnRseSwgdGhlIG5ldyBmb3JtYXQgaXMgYmVpbmcgdXNlZCBmb3IgcnVubmluZyB1c2VyIEJQRiBwcm9ncmFtcywgd2hpY2gKIGluY2x1ZGVzIHNlY2NvbXAgQlBGLCBjbGFzc2ljIHNvY2tldCBmaWx0ZXJzLCBjbHNfYnBmIHRyYWZmaWMgY2xhc3NpZmllciwKIHRlYW0gZHJpdmVyJ3MgY2xhc3NpZmllciBmb3IgaXRzIGxvYWQtYmFsYW5jaW5nIG1vZGUsIG5ldGZpbHRlcidzIHh0X2JwZgogZXh0ZW5zaW9uLCBQVFAgZGlzc2VjdG9yL2NsYXNzaWZpZXIsIGFuZCBtdWNoIG1vcmUuIFRoZXkgYXJlIGFsbCBpbnRlcm5hbGx5CiBjb252ZXJ0ZWQgYnkgdGhlIGtlcm5lbCBpbnRvIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gc2V0IHJlcHJlc2VudGF0aW9uIGFuZCBydW4KLWluIHRoZSBleHRlbmRlZCBpbnRlcnByZXRlci4gRm9yIGluLWtlcm5lbCBoYW5kbGVycywgdGhpcyBhbGwgd29ya3MKLXRyYW5zcGFyZW50bHkgYnkgdXNpbmcgc2tfdW5hdHRhY2hlZF9maWx0ZXJfY3JlYXRlKCkgZm9yIHNldHRpbmcgdXAgdGhlCi1maWx0ZXIsIHJlc3AuIHNrX3VuYXR0YWNoZWRfZmlsdGVyX2Rlc3Ryb3koKSBmb3IgZGVzdHJveWluZyBpdC4gVGhlIG1hY3JvCi1TS19SVU5fRklMVEVSKGZpbHRlciwgY3R4KSB0cmFuc3BhcmVudGx5IGludm9rZXMgdGhlIHJpZ2h0IEJQRiBmdW5jdGlvbiB0bwotcnVuIHRoZSBmaWx0ZXIuICdmaWx0ZXInIGlzIGEgcG9pbnRlciB0byBzdHJ1Y3Qgc2tfZmlsdGVyIHRoYXQgd2UgZ290IGZyb20KLXNrX3VuYXR0YWNoZWRfZmlsdGVyX2NyZWF0ZSgpLCBhbmQgJ2N0eCcgdGhlIGdpdmVuIGNvbnRleHQgKGUuZy4gc2tiIHBvaW50ZXIpLgotQWxsIGNvbnN0cmFpbnRzIGFuZCByZXN0cmljdGlvbnMgZnJvbSBza19jaGtfZmlsdGVyKCkgYXBwbHkgYmVmb3JlIGEKLWNvbnZlcnNpb24gdG8gdGhlIG5ldyBsYXlvdXQgaXMgYmVpbmcgZG9uZSBiZWhpbmQgdGhlIHNjZW5lcyEKK2luIHRoZSBlQlBGIGludGVycHJldGVyLiBGb3IgaW4ta2VybmVsIGhhbmRsZXJzLCB0aGlzIGFsbCB3b3JrcyB0cmFuc3BhcmVudGx5CitieSB1c2luZyBza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoKSBmb3Igc2V0dGluZyB1cCB0aGUgZmlsdGVyLCByZXNwLgorc2tfdW5hdHRhY2hlZF9maWx0ZXJfZGVzdHJveSgpIGZvciBkZXN0cm95aW5nIGl0LiBUaGUgbWFjcm8KK1NLX1JVTl9GSUxURVIoZmlsdGVyLCBjdHgpIHRyYW5zcGFyZW50bHkgaW52b2tlcyBlQlBGIGludGVycHJldGVyIG9yIEpJVGVkCitjb2RlIHRvIHJ1biB0aGUgZmlsdGVyLiAnZmlsdGVyJyBpcyBhIHBvaW50ZXIgdG8gc3RydWN0IHNrX2ZpbHRlciB0aGF0IHdlCitnb3QgZnJvbSBza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoKSwgYW5kICdjdHgnIHRoZSBnaXZlbiBjb250ZXh0IChlLmcuCitza2IgcG9pbnRlcikuIEFsbCBjb25zdHJhaW50cyBhbmQgcmVzdHJpY3Rpb25zIGZyb20gc2tfY2hrX2ZpbHRlcigpIGFwcGx5CitiZWZvcmUgYSBjb252ZXJzaW9uIHRvIHRoZSBuZXcgbGF5b3V0IGlzIGJlaW5nIGRvbmUgYmVoaW5kIHRoZSBzY2VuZXMhCiAKLUN1cnJlbnRseSwgZm9yIEpJVGluZywgdGhlIHVzZXIgQlBGIGZvcm1hdCBpcyBiZWluZyB1c2VkIGFuZCBjdXJyZW50IEJQRiBKSVQKLWNvbXBpbGVycyByZXVzZWQgd2hlbmV2ZXIgcG9zc2libGUuIEluIG90aGVyIHdvcmRzLCB3ZSBkbyBub3QgKHlldCEpIHBlcmZvcm0KLWEgSklUIGNvbXBpbGF0aW9uIGluIHRoZSBuZXcgbGF5b3V0LCBob3dldmVyLCBmdXR1cmUgd29yayB3aWxsIHN1Y2Nlc3NpdmVseQotbWlncmF0ZSB0cmFkaXRpb25hbCBKSVQgY29tcGlsZXJzIGludG8gdGhlIG5ldyBpbnN0cnVjdGlvbiBmb3JtYXQgYXMgd2VsbCwgc28KLXRoYXQgdGhleSB3aWxsIHByb2ZpdCBmcm9tIHRoZSB2ZXJ5IHNhbWUgYmVuZWZpdHMuIFRodXMsIHdoZW4gc3BlYWtpbmcgYWJvdXQKLUpJVCBpbiB0aGUgZm9sbG93aW5nLCBhIEpJVCBjb21waWxlciAoVEJEKSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbiBmb3JtYXQgaXMKLW1lYW50IGluIHRoaXMgY29udGV4dC4KK0N1cnJlbnRseSwgdGhlIGNsYXNzaWMgQlBGIGZvcm1hdCBpcyBiZWluZyB1c2VkIGZvciBKSVRpbmcgb24gbW9zdCBvZiB0aGUKK2FyY2hpdGVjdHVyZXMuIE9ubHkgeDg2LTY0IHBlcmZvcm1zIEpJVCBjb21waWxhdGlvbiBmcm9tIGVCUEYgaW5zdHJ1Y3Rpb24gc2V0LAoraG93ZXZlciwgZnV0dXJlIHdvcmsgd2lsbCBtaWdyYXRlIG90aGVyIEpJVCBjb21waWxlcnMgYXMgd2VsbCwgc28gdGhhdCB0aGV5Cit3aWxsIHByb2ZpdCBmcm9tIHRoZSB2ZXJ5IHNhbWUgYmVuZWZpdHMuCiAKIFNvbWUgY29yZSBjaGFuZ2VzIG9mIHRoZSBuZXcgaW50ZXJuYWwgZm9ybWF0OgogCkBAIC01OTIsMzUgKzYwNiwzNSBAQAogICBUaGUgb2xkIGZvcm1hdCBoYWQgdHdvIHJlZ2lzdGVycyBBIGFuZCBYLCBhbmQgYSBoaWRkZW4gZnJhbWUgcG9pbnRlci4gVGhlCiAgIG5ldyBsYXlvdXQgZXh0ZW5kcyB0aGlzIHRvIGJlIDEwIGludGVybmFsIHJlZ2lzdGVycyBhbmQgYSByZWFkLW9ubHkgZnJhbWUKICAgcG9pbnRlci4gU2luY2UgNjQtYml0IENQVXMgYXJlIHBhc3NpbmcgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucyB2aWEgcmVnaXN0ZXJzCi0gIHRoZSBudW1iZXIgb2YgYXJncyBmcm9tIEJQRiBwcm9ncmFtIHRvIGluLWtlcm5lbCBmdW5jdGlvbiBpcyByZXN0cmljdGVkCisgIHRoZSBudW1iZXIgb2YgYXJncyBmcm9tIGVCUEYgcHJvZ3JhbSB0byBpbi1rZXJuZWwgZnVuY3Rpb24gaXMgcmVzdHJpY3RlZAogICB0byA1IGFuZCBvbmUgcmVnaXN0ZXIgaXMgdXNlZCB0byBhY2NlcHQgcmV0dXJuIHZhbHVlIGZyb20gYW4gaW4ta2VybmVsCiAgIGZ1bmN0aW9uLiBOYXRpdmVseSwgeDg2XzY0IHBhc3NlcyBmaXJzdCA2IGFyZ3VtZW50cyBpbiByZWdpc3RlcnMsIGFhcmNoNjQvCiAgIHNwYXJjdjkvbWlwczY0IGhhdmUgNyAtIDggcmVnaXN0ZXJzIGZvciBhcmd1bWVudHM7IHg4Nl82NCBoYXMgNiBjYWxsZWUgc2F2ZWQKICAgcmVnaXN0ZXJzLCBhbmQgYWFyY2g2NC9zcGFyY3Y5L21pcHM2NCBoYXZlIDExIG9yIG1vcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KIAotICBUaGVyZWZvcmUsIEJQRiBjYWxsaW5nIGNvbnZlbnRpb24gaXMgZGVmaW5lZCBhczoKKyAgVGhlcmVmb3JlLCBlQlBGIGNhbGxpbmcgY29udmVudGlvbiBpcyBkZWZpbmVkIGFzOgogCi0gICAgKiBSMAktIHJldHVybiB2YWx1ZSBmcm9tIGluLWtlcm5lbCBmdW5jdGlvbgotICAgICogUjEgLSBSNQktIGFyZ3VtZW50cyBmcm9tIEJQRiBwcm9ncmFtIHRvIGluLWtlcm5lbCBmdW5jdGlvbgorICAgICogUjAJLSByZXR1cm4gdmFsdWUgZnJvbSBpbi1rZXJuZWwgZnVuY3Rpb24sIGFuZCBleGl0IHZhbHVlIGZvciBlQlBGIHByb2dyYW0KKyAgICAqIFIxIC0gUjUJLSBhcmd1bWVudHMgZnJvbSBlQlBGIHByb2dyYW0gdG8gaW4ta2VybmVsIGZ1bmN0aW9uCiAgICAgKiBSNiAtIFI5CS0gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB0aGF0IGluLWtlcm5lbCBmdW5jdGlvbiB3aWxsIHByZXNlcnZlCiAgICAgKiBSMTAJLSByZWFkLW9ubHkgZnJhbWUgcG9pbnRlciB0byBhY2Nlc3Mgc3RhY2sKIAotICBUaHVzLCBhbGwgQlBGIHJlZ2lzdGVycyBtYXAgb25lIHRvIG9uZSB0byBIVyByZWdpc3RlcnMgb24geDg2XzY0LCBhYXJjaDY0LAotICBldGMsIGFuZCBCUEYgY2FsbGluZyBjb252ZW50aW9uIG1hcHMgZGlyZWN0bHkgdG8gQUJJcyB1c2VkIGJ5IHRoZSBrZXJuZWwgb24KKyAgVGh1cywgYWxsIGVCUEYgcmVnaXN0ZXJzIG1hcCBvbmUgdG8gb25lIHRvIEhXIHJlZ2lzdGVycyBvbiB4ODZfNjQsIGFhcmNoNjQsCisgIGV0YywgYW5kIGVCUEYgY2FsbGluZyBjb252ZW50aW9uIG1hcHMgZGlyZWN0bHkgdG8gQUJJcyB1c2VkIGJ5IHRoZSBrZXJuZWwgb24KICAgNjQtYml0IGFyY2hpdGVjdHVyZXMuCiAKICAgT24gMzItYml0IGFyY2hpdGVjdHVyZXMgSklUIG1heSBtYXAgcHJvZ3JhbXMgdGhhdCB1c2Ugb25seSAzMi1iaXQgYXJpdGhtZXRpYwogICBhbmQgbWF5IGxldCBtb3JlIGNvbXBsZXggcHJvZ3JhbXMgdG8gYmUgaW50ZXJwcmV0ZWQuCiAKLSAgUjAgLSBSNSBhcmUgc2NyYXRjaCByZWdpc3RlcnMgYW5kIEJQRiBwcm9ncmFtIG5lZWRzIHNwaWxsL2ZpbGwgdGhlbSBpZgotICBuZWNlc3NhcnkgYWNyb3NzIGNhbGxzLiBOb3RlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgQlBGIHByb2dyYW0gKD09IG9uZSBCUEYKLSAgbWFpbiByb3V0aW5lKSBhbmQgaXQgY2Fubm90IGNhbGwgb3RoZXIgQlBGIGZ1bmN0aW9ucywgaXQgY2FuIG9ubHkgY2FsbAotICBwcmVkZWZpbmVkIGluLWtlcm5lbCBmdW5jdGlvbnMsIHRob3VnaC4KKyAgUjAgLSBSNSBhcmUgc2NyYXRjaCByZWdpc3RlcnMgYW5kIGVCUEYgcHJvZ3JhbSBuZWVkcyBzcGlsbC9maWxsIHRoZW0gaWYKKyAgbmVjZXNzYXJ5IGFjcm9zcyBjYWxscy4gTm90ZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGVCUEYgcHJvZ3JhbSAoPT0gb25lCisgIGVCUEYgbWFpbiByb3V0aW5lKSBhbmQgaXQgY2Fubm90IGNhbGwgb3RoZXIgZUJQRiBmdW5jdGlvbnMsIGl0IGNhbiBvbmx5CisgIGNhbGwgcHJlZGVmaW5lZCBpbi1rZXJuZWwgZnVuY3Rpb25zLCB0aG91Z2guCiAKIC0gUmVnaXN0ZXIgd2lkdGggaW5jcmVhc2VzIGZyb20gMzItYml0IHRvIDY0LWJpdDoKIAogICBTdGlsbCwgdGhlIHNlbWFudGljcyBvZiB0aGUgb3JpZ2luYWwgMzItYml0IEFMVSBvcGVyYXRpb25zIGFyZSBwcmVzZXJ2ZWQKLSAgdmlhIDMyLWJpdCBzdWJyZWdpc3RlcnMuIEFsbCBCUEYgcmVnaXN0ZXJzIGFyZSA2NC1iaXQgd2l0aCAzMi1iaXQgbG93ZXIKKyAgdmlhIDMyLWJpdCBzdWJyZWdpc3RlcnMuIEFsbCBlQlBGIHJlZ2lzdGVycyBhcmUgNjQtYml0IHdpdGggMzItYml0IGxvd2VyCiAgIHN1YnJlZ2lzdGVycyB0aGF0IHplcm8tZXh0ZW5kIGludG8gNjQtYml0IGlmIHRoZXkgYXJlIGJlaW5nIHdyaXR0ZW4gdG8uCiAgIFRoYXQgYmVoYXZpb3IgbWFwcyBkaXJlY3RseSB0byB4ODZfNjQgYW5kIGFybTY0IHN1YnJlZ2lzdGVyIGRlZmluaXRpb24sIGJ1dAogICBtYWtlcyBvdGhlciBKSVRzIG1vcmUgZGlmZmljdWx0LgpAQCAtNjMxLDggKzY0NSw4IEBACiAKICAgT3BlcmF0aW9uIGlzIDY0LWJpdCwgYmVjYXVzZSBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgcG9pbnRlcnMgYXJlIGFsc28KICAgNjQtYml0IHdpZGUsIGFuZCB3ZSB3YW50IHRvIHBhc3MgNjQtYml0IHZhbHVlcyBpbi9vdXQgb2Yga2VybmVsIGZ1bmN0aW9ucywKLSAgc28gMzItYml0IEJQRiByZWdpc3RlcnMgd291bGQgb3RoZXJ3aXNlIHJlcXVpcmUgdG8gZGVmaW5lIHJlZ2lzdGVyLXBhaXIKLSAgQUJJLCB0aHVzLCB0aGVyZSB3b24ndCBiZSBhYmxlIHRvIHVzZSBhIGRpcmVjdCBCUEYgcmVnaXN0ZXIgdG8gSFcgcmVnaXN0ZXIKKyAgc28gMzItYml0IGVCUEYgcmVnaXN0ZXJzIHdvdWxkIG90aGVyd2lzZSByZXF1aXJlIHRvIGRlZmluZSByZWdpc3Rlci1wYWlyCisgIEFCSSwgdGh1cywgdGhlcmUgd29uJ3QgYmUgYWJsZSB0byB1c2UgYSBkaXJlY3QgZUJQRiByZWdpc3RlciB0byBIVyByZWdpc3RlcgogICBtYXBwaW5nIGFuZCBKSVQgd291bGQgbmVlZCB0byBkbyBjb21iaW5lL3NwbGl0L21vdmUgb3BlcmF0aW9ucyBmb3IgZXZlcnkKICAgcmVnaXN0ZXIgaW4gYW5kIG91dCBvZiB0aGUgZnVuY3Rpb24sIHdoaWNoIGlzIGNvbXBsZXgsIGJ1ZyBwcm9uZSBhbmQgc2xvdy4KICAgQW5vdGhlciByZWFzb24gaXMgdGhlIHVzZSBvZiBhdG9taWMgNjQtYml0IGNvdW50ZXJzLgpAQCAtNjQ2LDE0ICs2NjAsMTQ1IEBACiAtIEludHJvZHVjZXMgYnBmX2NhbGwgaW5zbiBhbmQgcmVnaXN0ZXIgcGFzc2luZyBjb252ZW50aW9uIGZvciB6ZXJvIG92ZXJoZWFkCiAgIGNhbGxzIGZyb20vdG8gb3RoZXIga2VybmVsIGZ1bmN0aW9uczoKIAotICBBZnRlciBhIGtlcm5lbCBmdW5jdGlvbiBjYWxsLCBSMSAtIFI1IGFyZSByZXNldCB0byB1bnJlYWRhYmxlIGFuZCBSMCBoYXMgYQotICByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24uIFNpbmNlIFI2IC0gUjkgYXJlIGNhbGxlZSBzYXZlZCwgdGhlaXIgc3RhdGUgaXMKLSAgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbC4KKyAgQmVmb3JlIGFuIGluLWtlcm5lbCBmdW5jdGlvbiBjYWxsLCB0aGUgaW50ZXJuYWwgQlBGIHByb2dyYW0gbmVlZHMgdG8KKyAgcGxhY2UgZnVuY3Rpb24gYXJndW1lbnRzIGludG8gUjEgdG8gUjUgcmVnaXN0ZXJzIHRvIHNhdGlzZnkgY2FsbGluZworICBjb252ZW50aW9uLCB0aGVuIHRoZSBpbnRlcnByZXRlciB3aWxsIHRha2UgdGhlbSBmcm9tIHJlZ2lzdGVycyBhbmQgcGFzcworICB0byBpbi1rZXJuZWwgZnVuY3Rpb24uIElmIFIxIC0gUjUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgdG8gQ1BVIHJlZ2lzdGVycworICB0aGF0IGFyZSB1c2VkIGZvciBhcmd1bWVudCBwYXNzaW5nIG9uIGdpdmVuIGFyY2hpdGVjdHVyZSwgdGhlIEpJVCBjb21waWxlcgorICBkb2Vzbid0IG5lZWQgdG8gZW1pdCBleHRyYSBtb3Zlcy4gRnVuY3Rpb24gYXJndW1lbnRzIHdpbGwgYmUgaW4gdGhlIGNvcnJlY3QKKyAgcmVnaXN0ZXJzIGFuZCBCUEZfQ0FMTCBpbnN0cnVjdGlvbiB3aWxsIGJlIEpJVGVkIGFzIHNpbmdsZSAnY2FsbCcgSFcKKyAgaW5zdHJ1Y3Rpb24uIFRoaXMgY2FsbGluZyBjb252ZW50aW9uIHdhcyBwaWNrZWQgdG8gY292ZXIgY29tbW9uIGNhbGwKKyAgc2l0dWF0aW9ucyB3aXRob3V0IHBlcmZvcm1hbmNlIHBlbmFsdHkuCiAKLUFsc28gaW4gdGhlIG5ldyBkZXNpZ24sIEJQRiBpcyBsaW1pdGVkIHRvIDQwOTYgaW5zbnMsIHdoaWNoIG1lYW5zIHRoYXQgYW55CisgIEFmdGVyIGFuIGluLWtlcm5lbCBmdW5jdGlvbiBjYWxsLCBSMSAtIFI1IGFyZSByZXNldCB0byB1bnJlYWRhYmxlIGFuZCBSMCBoYXMKKyAgYSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uLiBTaW5jZSBSNiAtIFI5IGFyZSBjYWxsZWUgc2F2ZWQsIHRoZWlyIHN0YXRlCisgIGlzIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwuCisKKyAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRocmVlIEMgZnVuY3Rpb25zOgorCisgIHU2NCBmMSgpIHsgcmV0dXJuICgqX2YyKSgxKTsgfQorICB1NjQgZjIodTY0IGEpIHsgcmV0dXJuIGYzKGEgKyAxLCBhKTsgfQorICB1NjQgZjModTY0IGEsIHU2NCBiKSB7IHJldHVybiBhIC0gYjsgfQorCisgIEdDQyBjYW4gY29tcGlsZSBmMSwgZjMgaW50byB4ODZfNjQ6CisKKyAgZjE6CisgICAgbW92bCAkMSwgJWVkaQorICAgIG1vdnEgX2YyKCVyaXApLCAlcmF4CisgICAgam1wICAqJXJheAorICBmMzoKKyAgICBtb3ZxICVyZGksICVyYXgKKyAgICBzdWJxICVyc2ksICVyYXgKKyAgICByZXQKKworICBGdW5jdGlvbiBmMiBpbiBlQlBGIG1heSBsb29rIGxpa2U6CisKKyAgZjI6CisgICAgYnBmX21vdiBSMiwgUjEKKyAgICBicGZfYWRkIFIxLCAxCisgICAgYnBmX2NhbGwgZjMKKyAgICBicGZfZXhpdAorCisgIElmIGYyIGlzIEpJVGVkIGFuZCB0aGUgcG9pbnRlciBzdG9yZWQgdG8gJ19mMicuIFRoZSBjYWxscyBmMSAtPiBmMiAtPiBmMyBhbmQKKyAgcmV0dXJucyB3aWxsIGJlIHNlYW1sZXNzLiBXaXRob3V0IEpJVCwgX19za19ydW5fZmlsdGVyKCkgaW50ZXJwcmV0ZXIgbmVlZHMgdG8KKyAgYmUgdXNlZCB0byBjYWxsIGludG8gZjIuCisKKyAgRm9yIHByYWN0aWNhbCByZWFzb25zIGFsbCBlQlBGIHByb2dyYW1zIGhhdmUgb25seSBvbmUgYXJndW1lbnQgJ2N0eCcgd2hpY2ggaXMKKyAgYWxyZWFkeSBwbGFjZWQgaW50byBSMSAoZS5nLiBvbiBfX3NrX3J1bl9maWx0ZXIoKSBzdGFydHVwKSBhbmQgdGhlIHByb2dyYW1zCisgIGNhbiBjYWxsIGtlcm5lbCBmdW5jdGlvbnMgd2l0aCB1cCB0byA1IGFyZ3VtZW50cy4gQ2FsbHMgd2l0aCA2IG9yIG1vcmUgYXJndW1lbnRzCisgIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCwgYnV0IHRoZXNlIHJlc3RyaWN0aW9ucyBjYW4gYmUgbGlmdGVkIGlmIG5lY2Vzc2FyeQorICBpbiB0aGUgZnV0dXJlLgorCisgIE9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzIGFsbCByZWdpc3RlciBtYXAgdG8gSFcgcmVnaXN0ZXJzIG9uZSB0byBvbmUuIEZvcgorICBleGFtcGxlLCB4ODZfNjQgSklUIGNvbXBpbGVyIGNhbiBtYXAgdGhlbSBhcyAuLi4KKworICAgIFIwIC0gcmF4CisgICAgUjEgLSByZGkKKyAgICBSMiAtIHJzaQorICAgIFIzIC0gcmR4CisgICAgUjQgLSByY3gKKyAgICBSNSAtIHI4CisgICAgUjYgLSByYngKKyAgICBSNyAtIHIxMworICAgIFI4IC0gcjE0CisgICAgUjkgLSByMTUKKyAgICBSMTAgLSByYnAKKworICAuLi4gc2luY2UgeDg2XzY0IEFCSSBtYW5kYXRlcyByZGksIHJzaSwgcmR4LCByY3gsIHI4LCByOSBmb3IgYXJndW1lbnQgcGFzc2luZworICBhbmQgcmJ4LCByMTIgLSByMTUgYXJlIGNhbGxlZSBzYXZlZC4KKworICBUaGVuIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWwgQlBGIHBzZXVkby1wcm9ncmFtOgorCisgICAgYnBmX21vdiBSNiwgUjEgLyogc2F2ZSBjdHggKi8KKyAgICBicGZfbW92IFIyLCAyCisgICAgYnBmX21vdiBSMywgMworICAgIGJwZl9tb3YgUjQsIDQKKyAgICBicGZfbW92IFI1LCA1CisgICAgYnBmX2NhbGwgZm9vCisgICAgYnBmX21vdiBSNywgUjAgLyogc2F2ZSBmb28oKSByZXR1cm4gdmFsdWUgKi8KKyAgICBicGZfbW92IFIxLCBSNiAvKiByZXN0b3JlIGN0eCBmb3IgbmV4dCBjYWxsICovCisgICAgYnBmX21vdiBSMiwgNgorICAgIGJwZl9tb3YgUjMsIDcKKyAgICBicGZfbW92IFI0LCA4CisgICAgYnBmX21vdiBSNSwgOQorICAgIGJwZl9jYWxsIGJhcgorICAgIGJwZl9hZGQgUjAsIFI3CisgICAgYnBmX2V4aXQKKworICBBZnRlciBKSVQgdG8geDg2XzY0IG1heSBsb29rIGxpa2U6CisKKyAgICBwdXNoICVyYnAKKyAgICBtb3YgJXJzcCwlcmJwCisgICAgc3ViICQweDIyOCwlcnNwCisgICAgbW92ICVyYngsLTB4MjI4KCVyYnApCisgICAgbW92ICVyMTMsLTB4MjIwKCVyYnApCisgICAgbW92ICVyZGksJXJieAorICAgIG1vdiAkMHgyLCVlc2kKKyAgICBtb3YgJDB4MywlZWR4CisgICAgbW92ICQweDQsJWVjeAorICAgIG1vdiAkMHg1LCVyOGQKKyAgICBjYWxscSBmb28KKyAgICBtb3YgJXJheCwlcjEzCisgICAgbW92ICVyYngsJXJkaQorICAgIG1vdiAkMHgyLCVlc2kKKyAgICBtb3YgJDB4MywlZWR4CisgICAgbW92ICQweDQsJWVjeAorICAgIG1vdiAkMHg1LCVyOGQKKyAgICBjYWxscSBiYXIKKyAgICBhZGQgJXIxMywlcmF4CisgICAgbW92IC0weDIyOCglcmJwKSwlcmJ4CisgICAgbW92IC0weDIyMCglcmJwKSwlcjEzCisgICAgbGVhdmVxCisgICAgcmV0cQorCisgIFdoaWNoIGlzIGluIHRoaXMgZXhhbXBsZSBlcXVpdmFsZW50IGluIEMgdG86CisKKyAgICB1NjQgYnBmX2ZpbHRlcih1NjQgY3R4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvbyhjdHgsIDIsIDMsIDQsIDUpICsgYmFyKGN0eCwgNiwgNywgOCwgOSk7CisgICAgfQorCisgIEluLWtlcm5lbCBmdW5jdGlvbnMgZm9vKCkgYW5kIGJhcigpIHdpdGggcHJvdG90eXBlOiB1NjQgKCopKHU2NCBhcmcxLCB1NjQKKyAgYXJnMiwgdTY0IGFyZzMsIHU2NCBhcmc0LCB1NjQgYXJnNSk7IHdpbGwgcmVjZWl2ZSBhcmd1bWVudHMgaW4gcHJvcGVyCisgIHJlZ2lzdGVycyBhbmQgcGxhY2UgdGhlaXIgcmV0dXJuIHZhbHVlIGludG8gJyVyYXgnIHdoaWNoIGlzIFIwIGluIGVCUEYuCisgIFByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBhcmUgZW1pdHRlZCBieSBKSVQgYW5kIGFyZSBpbXBsaWNpdCBpbiB0aGUKKyAgaW50ZXJwcmV0ZXIuIFIwLVI1IGFyZSBzY3JhdGNoIHJlZ2lzdGVycywgc28gZUJQRiBwcm9ncmFtIG5lZWRzIHRvIHByZXNlcnZlCisgIHRoZW0gYWNyb3NzIHRoZSBjYWxscyBhcyBkZWZpbmVkIGJ5IGNhbGxpbmcgY29udmVudGlvbi4KKworICBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHByb2dyYW0gaXMgaW52YWxpZDoKKworICAgIGJwZl9tb3YgUjEsIDEKKyAgICBicGZfY2FsbCBmb28KKyAgICBicGZfbW92IFIwLCBSMQorICAgIGJwZl9leGl0CisKKyAgQWZ0ZXIgdGhlIGNhbGwgdGhlIHJlZ2lzdGVycyBSMS1SNSBjb250YWluIGp1bmsgdmFsdWVzIGFuZCBjYW5ub3QgYmUgcmVhZC4KKyAgSW4gdGhlIGZ1dHVyZSBhbiBlQlBGIHZlcmlmaWVyIGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGludGVybmFsIEJQRiBwcm9ncmFtcy4KKworQWxzbyBpbiB0aGUgbmV3IGRlc2lnbiwgZUJQRiBpcyBsaW1pdGVkIHRvIDQwOTYgaW5zbnMsIHdoaWNoIG1lYW5zIHRoYXQgYW55CiBwcm9ncmFtIHdpbGwgdGVybWluYXRlIHF1aWNrbHkgYW5kIHdpbGwgb25seSBjYWxsIGEgZml4ZWQgbnVtYmVyIG9mIGtlcm5lbAogZnVuY3Rpb25zLiBPcmlnaW5hbCBCUEYgYW5kIHRoZSBuZXcgZm9ybWF0IGFyZSB0d28gb3BlcmFuZCBpbnN0cnVjdGlvbnMsCi13aGljaCBoZWxwcyB0byBkbyBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbiBCUEYgaW5zbiBhbmQgeDg2IGluc24gZHVyaW5nIEpJVC4KK3doaWNoIGhlbHBzIHRvIGRvIG9uZS10by1vbmUgbWFwcGluZyBiZXR3ZWVuIGVCUEYgaW5zbiBhbmQgeDg2IGluc24gZHVyaW5nIEpJVC4KIAogVGhlIGlucHV0IGNvbnRleHQgcG9pbnRlciBmb3IgaW52b2tpbmcgdGhlIGludGVycHJldGVyIGZ1bmN0aW9uIGlzIGdlbmVyaWMsCiBpdHMgY29udGVudCBpcyBkZWZpbmVkIGJ5IGEgc3BlY2lmaWMgdXNlIGNhc2UuIEZvciBzZWNjb21wIHJlZ2lzdGVyIFIxIHBvaW50cwpAQCAtNjYxLDcgKzgwNiwyNiBAQAogCiBBIHByb2dyYW0sIHRoYXQgaXMgdHJhbnNsYXRlZCBpbnRlcm5hbGx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CiAKLSAgb3A6MTYsIGp0OjgsIGpmOjgsIGs6MzIgICAgPT0+ICAgIG9wOjgsIGFfcmVnOjQsIHhfcmVnOjQsIG9mZjoxNiwgaW1tOjMyCisgIG9wOjE2LCBqdDo4LCBqZjo4LCBrOjMyICAgID09PiAgICBvcDo4LCBkc3RfcmVnOjQsIHNyY19yZWc6NCwgb2ZmOjE2LCBpbW06MzIKKworU28gZmFyIDg3IGludGVybmFsIEJQRiBpbnN0cnVjdGlvbnMgd2VyZSBpbXBsZW1lbnRlZC4gOC1iaXQgJ29wJyBvcGNvZGUgZmllbGQKK2hhcyByb29tIGZvciBuZXcgaW5zdHJ1Y3Rpb25zLiBTb21lIG9mIHRoZW0gbWF5IHVzZSAxNi8yNC8zMiBieXRlIGVuY29kaW5nLiBOZXcKK2luc3RydWN0aW9ucyBtdXN0IGJlIG11bHRpcGxlIG9mIDggYnl0ZXMgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworSW50ZXJuYWwgQlBGIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIFJJU0MgaW5zdHJ1Y3Rpb24gc2V0LiBOb3QgZXZlcnkgcmVnaXN0ZXIgYW5kCitldmVyeSBpbnN0cnVjdGlvbiBhcmUgdXNlZCBkdXJpbmcgdHJhbnNsYXRpb24gZnJvbSBvcmlnaW5hbCBCUEYgdG8gbmV3IGZvcm1hdC4KK0ZvciBleGFtcGxlLCBzb2NrZXQgZmlsdGVycyBhcmUgbm90IHVzaW5nICdleGNsdXNpdmUgYWRkJyBpbnN0cnVjdGlvbiwgYnV0Cit0cmFjaW5nIGZpbHRlcnMgbWF5IGRvIHRvIG1haW50YWluIGNvdW50ZXJzIG9mIGV2ZW50cywgZm9yIGV4YW1wbGUuIFJlZ2lzdGVyIFI5CitpcyBub3QgdXNlZCBieSBzb2NrZXQgZmlsdGVycyBlaXRoZXIsIGJ1dCBtb3JlIGNvbXBsZXggZmlsdGVycyBtYXkgYmUgcnVubmluZworb3V0IG9mIHJlZ2lzdGVycyBhbmQgd291bGQgaGF2ZSB0byByZXNvcnQgdG8gc3BpbGwvZmlsbCB0byBzdGFjay4KKworSW50ZXJuYWwgQlBGIGNhbiB1c2VkIGFzIGdlbmVyaWMgYXNzZW1ibGVyIGZvciBsYXN0IHN0ZXAgcGVyZm9ybWFuY2UKK29wdGltaXphdGlvbnMsIHNvY2tldCBmaWx0ZXJzIGFuZCBzZWNjb21wIGFyZSB1c2luZyBpdCBhcyBhc3NlbWJsZXIuIFRyYWNpbmcKK2ZpbHRlcnMgbWF5IHVzZSBpdCBhcyBhc3NlbWJsZXIgdG8gZ2VuZXJhdGUgY29kZSBmcm9tIGtlcm5lbC4gSW4ga2VybmVsIHVzYWdlCittYXkgbm90IGJlIGJvdW5kZWQgYnkgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMsIHNpbmNlIGdlbmVyYXRlZCBpbnRlcm5hbCBCUEYgY29kZQorbWF5IGJlIG9wdGltaXppbmcgaW50ZXJuYWwgY29kZSBwYXRoIGFuZCBub3QgYmVpbmcgZXhwb3NlZCB0byB0aGUgdXNlciBzcGFjZS4KK1NhZmV0eSBvZiBpbnRlcm5hbCBCUEYgY2FuIGNvbWUgZnJvbSBhIHZlcmlmaWVyIChUQkQpLiBJbiBzdWNoIHVzZSBjYXNlcyBhcworZGVzY3JpYmVkLCBpdCBtYXkgYmUgdXNlZCBhcyBzYWZlIGluc3RydWN0aW9uIHNldC4KIAogSnVzdCBsaWtlIHRoZSBvcmlnaW5hbCBCUEYsIHRoZSBuZXcgZm9ybWF0IHJ1bnMgd2l0aGluIGEgY29udHJvbGxlZCBlbnZpcm9ubWVudCwKIGlzIGRldGVybWluaXN0aWMgYW5kIHRoZSBrZXJuZWwgY2FuIGVhc2lseSBwcm92ZSB0aGF0LiBUaGUgc2FmZXR5IG9mIHRoZSBwcm9ncmFtCkBAIC02NzAsNiArODM0LDE4MSBAQAogZGVzY2VuZHMgYWxsIHBvc3NpYmxlIHBhdGhzLiBJdCBzaW11bGF0ZXMgZXhlY3V0aW9uIG9mIGV2ZXJ5IGluc24gYW5kIG9ic2VydmVzCiB0aGUgc3RhdGUgY2hhbmdlIG9mIHJlZ2lzdGVycyBhbmQgc3RhY2suCiAKK2VCUEYgb3Bjb2RlIGVuY29kaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlQlBGIGlzIHJldXNpbmcgbW9zdCBvZiB0aGUgb3Bjb2RlIGVuY29kaW5nIGZyb20gY2xhc3NpYyB0byBzaW1wbGlmeSBjb252ZXJzaW9uCitvZiBjbGFzc2ljIEJQRiB0byBlQlBGLiBGb3IgYXJpdGhtZXRpYyBhbmQganVtcCBpbnN0cnVjdGlvbnMgdGhlIDgtYml0ICdjb2RlJworZmllbGQgaXMgZGl2aWRlZCBpbnRvIHRocmVlIHBhcnRzOgorCisgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8ICAgNCBiaXRzICAgICAgIHwgIDEgYml0IHwgICAzIGJpdHMgICAgICAgICAgIHwKKyAgfCBvcGVyYXRpb24gY29kZSB8IHNvdXJjZSB8IGluc3RydWN0aW9uIGNsYXNzICB8CisgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAoTVNCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExTQikKKworVGhyZWUgTFNCIGJpdHMgc3RvcmUgaW5zdHJ1Y3Rpb24gY2xhc3Mgd2hpY2ggaXMgb25lIG9mOgorCisgIENsYXNzaWMgQlBGIGNsYXNzZXM6ICAgIGVCUEYgY2xhc3NlczoKKworICBCUEZfTEQgICAgMHgwMCAgICAgICAgICBCUEZfTEQgICAgMHgwMAorICBCUEZfTERYICAgMHgwMSAgICAgICAgICBCUEZfTERYICAgMHgwMQorICBCUEZfU1QgICAgMHgwMiAgICAgICAgICBCUEZfU1QgICAgMHgwMgorICBCUEZfU1RYICAgMHgwMyAgICAgICAgICBCUEZfU1RYICAgMHgwMworICBCUEZfQUxVICAgMHgwNCAgICAgICAgICBCUEZfQUxVICAgMHgwNAorICBCUEZfSk1QICAgMHgwNSAgICAgICAgICBCUEZfSk1QICAgMHgwNQorICBCUEZfUkVUICAgMHgwNiAgICAgICAgICBbIGNsYXNzIDYgdW51c2VkLCBmb3IgZnV0dXJlIGlmIG5lZWRlZCBdCisgIEJQRl9NSVNDICAweDA3ICAgICAgICAgIEJQRl9BTFU2NCAweDA3CisKK1doZW4gQlBGX0NMQVNTKGNvZGUpID09IEJQRl9BTFUgb3IgQlBGX0pNUCwgNHRoIGJpdCBlbmNvZGVzIHNvdXJjZSBvcGVyYW5kIC4uLgorCisgIEJQRl9LICAgICAweDAwCisgIEJQRl9YICAgICAweDA4CisKKyAqIGluIGNsYXNzaWMgQlBGLCB0aGlzIG1lYW5zOgorCisgIEJQRl9TUkMoY29kZSkgPT0gQlBGX1ggLSB1c2UgcmVnaXN0ZXIgWCBhcyBzb3VyY2Ugb3BlcmFuZAorICBCUEZfU1JDKGNvZGUpID09IEJQRl9LIC0gdXNlIDMyLWJpdCBpbW1lZGlhdGUgYXMgc291cmNlIG9wZXJhbmQKKworICogaW4gZUJQRiwgdGhpcyBtZWFuczoKKworICBCUEZfU1JDKGNvZGUpID09IEJQRl9YIC0gdXNlICdzcmNfcmVnJyByZWdpc3RlciBhcyBzb3VyY2Ugb3BlcmFuZAorICBCUEZfU1JDKGNvZGUpID09IEJQRl9LIC0gdXNlIDMyLWJpdCBpbW1lZGlhdGUgYXMgc291cmNlIG9wZXJhbmQKKworLi4uIGFuZCBmb3VyIE1TQiBiaXRzIHN0b3JlIG9wZXJhdGlvbiBjb2RlLgorCitJZiBCUEZfQ0xBU1MoY29kZSkgPT0gQlBGX0FMVSBvciBCUEZfQUxVNjQgWyBpbiBlQlBGIF0sIEJQRl9PUChjb2RlKSBpcyBvbmUgb2Y6CisKKyAgQlBGX0FERCAgIDB4MDAKKyAgQlBGX1NVQiAgIDB4MTAKKyAgQlBGX01VTCAgIDB4MjAKKyAgQlBGX0RJViAgIDB4MzAKKyAgQlBGX09SICAgIDB4NDAKKyAgQlBGX0FORCAgIDB4NTAKKyAgQlBGX0xTSCAgIDB4NjAKKyAgQlBGX1JTSCAgIDB4NzAKKyAgQlBGX05FRyAgIDB4ODAKKyAgQlBGX01PRCAgIDB4OTAKKyAgQlBGX1hPUiAgIDB4YTAKKyAgQlBGX01PViAgIDB4YjAgIC8qIGVCUEYgb25seTogbW92IHJlZyB0byByZWcgKi8KKyAgQlBGX0FSU0ggIDB4YzAgIC8qIGVCUEYgb25seTogc2lnbiBleHRlbmRpbmcgc2hpZnQgcmlnaHQgKi8KKyAgQlBGX0VORCAgIDB4ZDAgIC8qIGVCUEYgb25seTogZW5kaWFubmVzcyBjb252ZXJzaW9uICovCisKK0lmIEJQRl9DTEFTUyhjb2RlKSA9PSBCUEZfSk1QLCBCUEZfT1AoY29kZSkgaXMgb25lIG9mOgorCisgIEJQRl9KQSAgICAweDAwCisgIEJQRl9KRVEgICAweDEwCisgIEJQRl9KR1QgICAweDIwCisgIEJQRl9KR0UgICAweDMwCisgIEJQRl9KU0VUICAweDQwCisgIEJQRl9KTkUgICAweDUwICAvKiBlQlBGIG9ubHk6IGp1bXAgIT0gKi8KKyAgQlBGX0pTR1QgIDB4NjAgIC8qIGVCUEYgb25seTogc2lnbmVkICc+JyAqLworICBCUEZfSlNHRSAgMHg3MCAgLyogZUJQRiBvbmx5OiBzaWduZWQgJz49JyAqLworICBCUEZfQ0FMTCAgMHg4MCAgLyogZUJQRiBvbmx5OiBmdW5jdGlvbiBjYWxsICovCisgIEJQRl9FWElUICAweDkwICAvKiBlQlBGIG9ubHk6IGZ1bmN0aW9uIHJldHVybiAqLworCitTbyBCUEZfQUREIHwgQlBGX1ggfCBCUEZfQUxVIG1lYW5zIDMyLWJpdCBhZGRpdGlvbiBpbiBib3RoIGNsYXNzaWMgQlBGCithbmQgZUJQRi4gVGhlcmUgYXJlIG9ubHkgdHdvIHJlZ2lzdGVycyBpbiBjbGFzc2ljIEJQRiwgc28gaXQgbWVhbnMgQSArPSBYLgorSW4gZUJQRiBpdCBtZWFucyBkc3RfcmVnID0gKHUzMikgZHN0X3JlZyArICh1MzIpIHNyY19yZWc7IHNpbWlsYXJseSwKK0JQRl9YT1IgfCBCUEZfSyB8IEJQRl9BTFUgbWVhbnMgQSBePSBpbW0zMiBpbiBjbGFzc2ljIEJQRiBhbmQgYW5hbG9nb3VzCitzcmNfcmVnID0gKHUzMikgc3JjX3JlZyBeICh1MzIpIGltbTMyIGluIGVCUEYuCisKK0NsYXNzaWMgQlBGIGlzIHVzaW5nIEJQRl9NSVNDIGNsYXNzIHRvIHJlcHJlc2VudCBBID0gWCBhbmQgWCA9IEEgbW92ZXMuCitlQlBGIGlzIHVzaW5nIEJQRl9NT1YgfCBCUEZfWCB8IEJQRl9BTFUgY29kZSBpbnN0ZWFkLiBTaW5jZSB0aGVyZSBhcmUgbm8KK0JQRl9NSVNDIG9wZXJhdGlvbnMgaW4gZUJQRiwgdGhlIGNsYXNzIDcgaXMgdXNlZCBhcyBCUEZfQUxVNjQgdG8gbWVhbgorZXhhY3RseSB0aGUgc2FtZSBvcGVyYXRpb25zIGFzIEJQRl9BTFUsIGJ1dCB3aXRoIDY0LWJpdCB3aWRlIG9wZXJhbmRzCitpbnN0ZWFkLiBTbyBCUEZfQUREIHwgQlBGX1ggfCBCUEZfQUxVNjQgbWVhbnMgNjQtYml0IGFkZGl0aW9uLCBpLmUuOgorZHN0X3JlZyA9IGRzdF9yZWcgKyBzcmNfcmVnCisKK0NsYXNzaWMgQlBGIHdhc3RlcyB0aGUgd2hvbGUgQlBGX1JFVCBjbGFzcyB0byByZXByZXNlbnQgYSBzaW5nbGUgJ3JldCcKK29wZXJhdGlvbi4gQ2xhc3NpYyBCUEZfUkVUIHwgQlBGX0sgbWVhbnMgY29weSBpbW0zMiBpbnRvIHJldHVybiByZWdpc3RlcgorYW5kIHBlcmZvcm0gZnVuY3Rpb24gZXhpdC4gZUJQRiBpcyBtb2RlbGVkIHRvIG1hdGNoIENQVSwgc28gQlBGX0pNUCB8IEJQRl9FWElUCitpbiBlQlBGIG1lYW5zIGZ1bmN0aW9uIGV4aXQgb25seS4gVGhlIGVCUEYgcHJvZ3JhbSBuZWVkcyB0byBzdG9yZSByZXR1cm4KK3ZhbHVlIGludG8gcmVnaXN0ZXIgUjAgYmVmb3JlIGRvaW5nIGEgQlBGX0VYSVQuIENsYXNzIDYgaW4gZUJQRiBpcyBjdXJyZW50bHkKK3VudXNlZCBhbmQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisKK0ZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhlIDgtYml0ICdjb2RlJyBmaWVsZCBpcyBkaXZpZGVkIGFzOgorCisgICstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IDMgYml0cyB8IDIgYml0cyB8ICAgMyBiaXRzICAgICAgICAgIHwKKyAgfCAgbW9kZSAgfCAgc2l6ZSAgfCBpbnN0cnVjdGlvbiBjbGFzcyB8CisgICstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAoTVNCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExTQikKKworU2l6ZSBtb2RpZmllciBpcyBvbmUgb2YgLi4uCisKKyAgQlBGX1cgICAweDAwICAgIC8qIHdvcmQgKi8KKyAgQlBGX0ggICAweDA4ICAgIC8qIGhhbGYgd29yZCAqLworICBCUEZfQiAgIDB4MTAgICAgLyogYnl0ZSAqLworICBCUEZfRFcgIDB4MTggICAgLyogZUJQRiBvbmx5LCBkb3VibGUgd29yZCAqLworCisuLi4gd2hpY2ggZW5jb2RlcyBzaXplIG9mIGxvYWQvc3RvcmUgb3BlcmF0aW9uOgorCisgQiAgLSAxIGJ5dGUKKyBIICAtIDIgYnl0ZQorIFcgIC0gNCBieXRlCisgRFcgLSA4IGJ5dGUgKGVCUEYgb25seSkKKworTW9kZSBtb2RpZmllciBpcyBvbmUgb2Y6CisKKyAgQlBGX0lNTSAgMHgwMCAgLyogY2xhc3NpYyBCUEYgb25seSwgcmVzZXJ2ZWQgaW4gZUJQRiAqLworICBCUEZfQUJTICAweDIwCisgIEJQRl9JTkQgIDB4NDAKKyAgQlBGX01FTSAgMHg2MAorICBCUEZfTEVOICAweDgwICAvKiBjbGFzc2ljIEJQRiBvbmx5LCByZXNlcnZlZCBpbiBlQlBGICovCisgIEJQRl9NU0ggIDB4YTAgIC8qIGNsYXNzaWMgQlBGIG9ubHksIHJlc2VydmVkIGluIGVCUEYgKi8KKyAgQlBGX1hBREQgMHhjMCAgLyogZUJQRiBvbmx5LCBleGNsdXNpdmUgYWRkICovCisKK2VCUEYgaGFzIHR3byBub24tZ2VuZXJpYyBpbnN0cnVjdGlvbnM6IChCUEZfQUJTIHwgPHNpemU+IHwgQlBGX0xEKSBhbmQKKyhCUEZfSU5EIHwgPHNpemU+IHwgQlBGX0xEKSB3aGljaCBhcmUgdXNlZCB0byBhY2Nlc3MgcGFja2V0IGRhdGEuCisKK1RoZXkgaGFkIHRvIGJlIGNhcnJpZWQgb3ZlciBmcm9tIGNsYXNzaWMgdG8gaGF2ZSBzdHJvbmcgcGVyZm9ybWFuY2Ugb2YKK3NvY2tldCBmaWx0ZXJzIHJ1bm5pbmcgaW4gZUJQRiBpbnRlcnByZXRlci4gVGhlc2UgaW5zdHJ1Y3Rpb25zIGNhbiBvbmx5CitiZSB1c2VkIHdoZW4gaW50ZXJwcmV0ZXIgY29udGV4dCBpcyBhIHBvaW50ZXIgdG8gJ3N0cnVjdCBza19idWZmJyBhbmQKK2hhdmUgc2V2ZW4gaW1wbGljaXQgb3BlcmFuZHMuIFJlZ2lzdGVyIFI2IGlzIGFuIGltcGxpY2l0IGlucHV0IHRoYXQgbXVzdAorY29udGFpbiBwb2ludGVyIHRvIHNrX2J1ZmYuIFJlZ2lzdGVyIFIwIGlzIGFuIGltcGxpY2l0IG91dHB1dCB3aGljaCBjb250YWlucwordGhlIGRhdGEgZmV0Y2hlZCBmcm9tIHRoZSBwYWNrZXQuIFJlZ2lzdGVycyBSMS1SNSBhcmUgc2NyYXRjaCByZWdpc3RlcnMKK2FuZCBtdXN0IG5vdCBiZSB1c2VkIHRvIHN0b3JlIHRoZSBkYXRhIGFjcm9zcyBCUEZfQUJTIHwgQlBGX0xEIG9yCitCUEZfSU5EIHwgQlBGX0xEIGluc3RydWN0aW9ucy4KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGhhdmUgaW1wbGljaXQgcHJvZ3JhbSBleGl0IGNvbmRpdGlvbiBhcyB3ZWxsLiBXaGVuCitlQlBGIHByb2dyYW0gaXMgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZGF0YSBiZXlvbmQgdGhlIHBhY2tldCBib3VuZGFyeSwKK3RoZSBpbnRlcnByZXRlciB3aWxsIGFib3J0IHRoZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0uIEpJVCBjb21waWxlcnMKK3RoZXJlZm9yZSBtdXN0IHByZXNlcnZlIHRoaXMgcHJvcGVydHkuIHNyY19yZWcgYW5kIGltbTMyIGZpZWxkcyBhcmUKK2V4cGxpY2l0IGlucHV0cyB0byB0aGVzZSBpbnN0cnVjdGlvbnMuCisKK0ZvciBleGFtcGxlOgorCisgIEJQRl9JTkQgfCBCUEZfVyB8IEJQRl9MRCBtZWFuczoKKworICAgIFIwID0gbnRvaGwoKih1MzIgKikgKCgoc3RydWN0IHNrX2J1ZmYgKikgUjYpLT5kYXRhICsgc3JjX3JlZyArIGltbTMyKSkKKyAgICBhbmQgUjEgLSBSNSB3ZXJlIHNjcmF0Y2hlZC4KKworVW5saWtlIGNsYXNzaWMgQlBGIGluc3RydWN0aW9uIHNldCwgZUJQRiBoYXMgZ2VuZXJpYyBsb2FkL3N0b3JlIG9wZXJhdGlvbnM6CisKK0JQRl9NRU0gfCA8c2l6ZT4gfCBCUEZfU1RYOiAgKihzaXplICopIChkc3RfcmVnICsgb2ZmKSA9IHNyY19yZWcKK0JQRl9NRU0gfCA8c2l6ZT4gfCBCUEZfU1Q6ICAgKihzaXplICopIChkc3RfcmVnICsgb2ZmKSA9IGltbTMyCitCUEZfTUVNIHwgPHNpemU+IHwgQlBGX0xEWDogIGRzdF9yZWcgPSAqKHNpemUgKikgKHNyY19yZWcgKyBvZmYpCitCUEZfWEFERCB8IEJQRl9XICB8IEJQRl9TVFg6IGxvY2sgeGFkZCAqKHUzMiAqKShkc3RfcmVnICsgb2ZmMTYpICs9IHNyY19yZWcKK0JQRl9YQUREIHwgQlBGX0RXIHwgQlBGX1NUWDogbG9jayB4YWRkICoodTY0ICopKGRzdF9yZWcgKyBvZmYxNikgKz0gc3JjX3JlZworCitXaGVyZSBzaXplIGlzIG9uZSBvZjogQlBGX0Igb3IgQlBGX0ggb3IgQlBGX1cgb3IgQlBGX0RXLiBOb3RlIHRoYXQgMSBhbmQKKzIgYnl0ZSBhdG9taWMgaW5jcmVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4KKworVGVzdGluZworLS0tLS0tLQorCitOZXh0IHRvIHRoZSBCUEYgdG9vbGNoYWluLCB0aGUga2VybmVsIGFsc28gc2hpcHMgYSB0ZXN0IG1vZHVsZSB0aGF0IGNvbnRhaW5zCit2YXJpb3VzIHRlc3QgY2FzZXMgZm9yIGNsYXNzaWMgYW5kIGludGVybmFsIEJQRiB0aGF0IGNhbiBiZSBleGVjdXRlZCBhZ2FpbnN0Cit0aGUgQlBGIGludGVycHJldGVyIGFuZCBKSVQgY29tcGlsZXIuIEl0IGNhbiBiZSBmb3VuZCBpbiBsaWIvdGVzdF9icGYuYyBhbmQKK2VuYWJsZWQgdmlhIEtjb25maWc6CisKKyAgQ09ORklHX1RFU1RfQlBGPW0KKworQWZ0ZXIgdGhlIG1vZHVsZSBoYXMgYmVlbiBidWlsdCBhbmQgaW5zdGFsbGVkLCB0aGUgdGVzdCBzdWl0ZSBjYW4gYmUgZXhlY3V0ZWQKK3ZpYSBpbnNtb2Qgb3IgbW9kcHJvYmUgYWdhaW5zdCAndGVzdF9icGYnIG1vZHVsZS4gUmVzdWx0cyBvZiB0aGUgdGVzdCBjYXNlcworaW5jbHVkaW5nIHRpbWluZ3MgaW4gbnNlYyBjYW4gYmUgZm91bmQgaW4gdGhlIGtlcm5lbCBsb2cgKGRtZXNnKS4KKwogTWlzYwogLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N1c3BlbmQtYW5kLWNwdWhvdHBsdWcudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zdXNwZW5kLWFuZC1jcHVob3RwbHVnLnR4dAppbmRleCBlMTNkYWZjLi4yODUwZGYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N1c3BlbmQtYW5kLWNwdWhvdHBsdWcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3VzcGVuZC1hbmQtY3B1aG90cGx1Zy50eHQKQEAgLTEsNiArMSw2IEBACiBJbnRlcmFjdGlvbiBvZiBTdXNwZW5kIGNvZGUgKFMzKSB3aXRoIHRoZSBDUFUgaG90cGx1ZyBpbmZyYXN0cnVjdHVyZQogCi0gICAgIChDKSAyMDExIFNyaXZhdHNhIFMuIEJoYXQgPHNyaXZhdHNhLmJoYXRAbGludXgudm5ldC5pYm0uY29tPgorICAgICAoQykgMjAxMSAtIDIwMTQgU3JpdmF0c2EgUy4gQmhhdCA8c3JpdmF0c2EuYmhhdEBsaW51eC52bmV0LmlibS5jb20+CiAKIAogSS4gSG93IGRvZXMgdGhlIHJlZ3VsYXIgQ1BVIGhvdHBsdWcgY29kZSBkaWZmZXIgZnJvbSBob3cgdGhlIFN1c3BlbmQtdG8tUkFNCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGI0YTY2YjkuLjA1NWY5NTIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC02MDQsNiArNjA0LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCiAKK0FNRCBYR0JFIERSSVZFUgorTToJVG9tIExlbmRhY2t5IDx0aG9tYXMubGVuZGFja3lAYW1kLmNvbT4KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUvCitGOglkcml2ZXJzL25ldC9waHkvYW1kLXhnYmUtcGh5LmMKKwogQU1TIChBcHBsZSBNb3Rpb24gU2Vuc29yKSBEUklWRVIKIE06CU1pY2hhZWwgSGFuc2VsbWFubiA8bGludXgta2VybmVsQGhhbnNtaS5jaD4KIFM6CVN1cHBvcnRlZApAQCAtMTg5NCw3ICsxOTAxLDcgQEAKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJfKgogCiBCUk9BRENPTSBCTlgyWCAxMCBHSUdBQklUIEVUSEVSTkVUIERSSVZFUgotTToJQXJpZWwgRWxpb3IgPGFyaWVsZUBicm9hZGNvbS5jb20+CitNOglBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvCkBAIC0xOTc0LDYgKzE5ODEsMTIgQEAKIEY6CWRyaXZlcnMvYmNtYS8KIEY6CWluY2x1ZGUvbGludXgvYmNtYS8KIAorQlJPQURDT00gU1lTVEVNUE9SVCBFVEhFUk5FVCBEUklWRVIKK006CUZsb3JpYW4gRmFpbmVsbGkgPGYuZmFpbmVsbGlAZ21haWwuY29tPgorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LioKKwogQlJPQ0FERSBCRkEgRkMgU0NTSSBEUklWRVIKIE06CUFuaWwgR3VydW11cnRoeSA8YW5pbC5ndXJ1bXVydGh5QHFsb2dpYy5jb20+CiBNOglTdWRhcnNhbmEgS2FsbHVydSA8c3VkYXJzYW5hLmthbGx1cnVAcWxvZ2ljLmNvbT4KQEAgLTIyMzAsOSArMjI0Myw4IEBACiBDSVNDTyBWSUMgRVRIRVJORVQgTklDIERSSVZFUgogTToJQ2hyaXN0aWFuIEJlbnZlbnV0aSA8YmVudmVAY2lzY28uY29tPgogTToJU3VqaXRoIFNhbmthciA8c3N1aml0aEBjaXNjby5jb20+Ci1NOglHb3ZpbmRhcmFqdWx1IFZhcmFkYXJhamFuIDxnb3ZpbmRhcmFqdWx1OTBAZ21haWwuY29tPgorTToJR292aW5kYXJhanVsdSBWYXJhZGFyYWphbiA8X2dvdmluZEBnbXguY29tPgogTToJTmVlbCBQYXRlbCA8bmVlcGF0ZWxAY2lzY28uY29tPgotTToJTmlzaGFuayBUcml2ZWRpIDxuaXN0cml2ZUBjaXNjby5jb20+CiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvCiAKQEAgLTI5NTIsNiArMjk2NCw3IEBACiBUOglnaXQgZ2l0Oi8vcGVvcGxlLmZyZWVkZXNrdG9wLm9yZy9+YWlybGllZC9saW51eAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9ncHUvZHJtLworRjoJZHJpdmVycy9ncHUvdmdhLwogRjoJaW5jbHVkZS9kcm0vCiBGOglpbmNsdWRlL3VhcGkvZHJtLwogCkBAIC02MTY3LDYgKzYxODAsNyBAQAogRjoJdG9vbHMvbmV0LwogRjoJdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0LwogRjoJbGliL3JhbmRvbTMyLmMKK0Y6CWxpYi90ZXN0X2JwZi5jCiAKIE5FVFdPUktJTkcgW0lQdjQvSVB2Nl0KIE06CSJEYXZpZCBTLiBNaWxsZXIiIDxkYXZlbUBkYXZlbWxvZnQubmV0PgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBjNzYxZmIxLi43NjgwZDdjIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMTA1LDEwICsxMDUsNiBAQAogICBLQlVJTERfT1VUUFVUIDo9ICQoTykKIGVuZGlmCiAKLWlmZXEgKCIkKG9yaWdpbiBXKSIsICJjb21tYW5kIGxpbmUiKQotICBleHBvcnQgS0JVSUxEX0VOQUJMRV9FWFRSQV9HQ0NfQ0hFQ0tTIDo9ICQoVykKLWVuZGlmCi0KICMgVGhhdCdzIG91ciBkZWZhdWx0IHRhcmdldCB3aGVuIG5vbmUgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZQogUEhPTlkgOj0gX2FsbAogX2FsbDoKQEAgLTE1Myw4ICsxNDksMTggQEAKIF9hbGw6IG1vZHVsZXMKIGVuZGlmCiAKLXNyY3RyZWUJCTo9ICQoaWYgJChLQlVJTERfU1JDKSwkKEtCVUlMRF9TUkMpLCQoQ1VSRElSKSkKLW9ianRyZWUJCTo9ICQoQ1VSRElSKQoraWZlcSAoJChLQlVJTERfU1JDKSwpCisgICAgICAgICMgYnVpbGRpbmcgaW4gdGhlIHNvdXJjZSB0cmVlCisgICAgICAgIHNyY3RyZWUgOj0gLgorZWxzZQorICAgICAgICBpZmVxICgkKEtCVUlMRF9TUkMpLywkKGRpciAkKENVUkRJUikpKQorICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgaW4gYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHNvdXJjZSB0cmVlCisgICAgICAgICAgICAgICAgc3JjdHJlZSA6PSAuLgorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3JjdHJlZSA6PSAkKEtCVUlMRF9TUkMpCisgICAgICAgIGVuZGlmCitlbmRpZgorb2JqdHJlZQkJOj0gLgogc3JjCQk6PSAkKHNyY3RyZWUpCiBvYmoJCTo9ICQob2JqdHJlZSkKIApAQCAtMTY2LDcgKzE3Miw3IEBACiAjIFNVQkFSQ0ggdGVsbHMgdGhlIHVzZXJtb2RlIGJ1aWxkIHdoYXQgdGhlIHVuZGVybHlpbmcgYXJjaCBpcy4gIFRoYXQgaXMgc2V0CiAjIGZpcnN0LCBhbmQgaWYgYSB1c2VybW9kZSBidWlsZCBpcyBoYXBwZW5pbmcsIHRoZSAiQVJDSD11bSIgb24gdGhlIGNvbW1hbmQKICMgbGluZSBvdmVycmlkZXMgdGhlIHNldHRpbmcgb2YgQVJDSCBiZWxvdy4gIElmIGEgbmF0aXZlIGJ1aWxkIGlzIGhhcHBlbmluZywKLSMgdGhlbiBBUkNIIGlzIGFzc2lnbmVkLCBnZXR0aW5nIHdoYXRldmVyIHZhbHVlIGl0IGdldHMgbm9ybWFsbHksIGFuZCAKKyMgdGhlbiBBUkNIIGlzIGFzc2lnbmVkLCBnZXR0aW5nIHdoYXRldmVyIHZhbHVlIGl0IGdldHMgbm9ybWFsbHksIGFuZAogIyBTVUJBUkNIIGlzIHN1YnNlcXVlbnRseSBpZ25vcmVkLgogCiBTVUJBUkNIIDo9ICQoc2hlbGwgdW5hbWUgLW0gfCBzZWQgLWUgcy9pLjg2L3g4Ni8gLWUgcy94ODZfNjQveDg2LyBcCkBAIC0yNTksMTggKzI2NSwxOCBAQAogS0JVSUxEX01PRFVMRVMgOj0KIEtCVUlMRF9CVUlMVElOIDo9IDEKIAotIwlJZiB3ZSBoYXZlIG9ubHkgIm1ha2UgbW9kdWxlcyIsIGRvbid0IGNvbXBpbGUgYnVpbHQtaW4gb2JqZWN0cy4KLSMJV2hlbiB3ZSdyZSBidWlsZGluZyBtb2R1bGVzIHdpdGggbW9kdmVyc2lvbnMsIHdlIG5lZWQgdG8gY29uc2lkZXIKLSMJdGhlIGJ1aWx0LWluIG9iamVjdHMgZHVyaW5nIHRoZSBkZXNjZW5kIGFzIHdlbGwsIGluIG9yZGVyIHRvCi0jCW1ha2Ugc3VyZSB0aGUgY2hlY2tzdW1zIGFyZSB1cCB0byBkYXRlIGJlZm9yZSB3ZSByZWNvcmQgdGhlbS4KKyMgSWYgd2UgaGF2ZSBvbmx5ICJtYWtlIG1vZHVsZXMiLCBkb24ndCBjb21waWxlIGJ1aWx0LWluIG9iamVjdHMuCisjIFdoZW4gd2UncmUgYnVpbGRpbmcgbW9kdWxlcyB3aXRoIG1vZHZlcnNpb25zLCB3ZSBuZWVkIHRvIGNvbnNpZGVyCisjIHRoZSBidWlsdC1pbiBvYmplY3RzIGR1cmluZyB0aGUgZGVzY2VuZCBhcyB3ZWxsLCBpbiBvcmRlciB0bworIyBtYWtlIHN1cmUgdGhlIGNoZWNrc3VtcyBhcmUgdXAgdG8gZGF0ZSBiZWZvcmUgd2UgcmVjb3JkIHRoZW0uCiAKIGlmZXEgKCQoTUFLRUNNREdPQUxTKSxtb2R1bGVzKQogICBLQlVJTERfQlVJTFRJTiA6PSAkKGlmICQoQ09ORklHX01PRFZFUlNJT05TKSwxKQogZW5kaWYKIAotIwlJZiB3ZSBoYXZlICJtYWtlIDx3aGF0ZXZlcj4gbW9kdWxlcyIsIGNvbXBpbGUgbW9kdWxlcwotIwlpbiBhZGRpdGlvbiB0byB3aGF0ZXZlciB3ZSBkbyBhbnl3YXkuCi0jCUp1c3QgIm1ha2UiIG9yICJtYWtlIGFsbCIgc2hhbGwgYnVpbGQgbW9kdWxlcyBhcyB3ZWxsCisjIElmIHdlIGhhdmUgIm1ha2UgPHdoYXRldmVyPiBtb2R1bGVzIiwgY29tcGlsZSBtb2R1bGVzCisjIGluIGFkZGl0aW9uIHRvIHdoYXRldmVyIHdlIGRvIGFueXdheS4KKyMgSnVzdCAibWFrZSIgb3IgIm1ha2UgYWxsIiBzaGFsbCBidWlsZCBtb2R1bGVzIGFzIHdlbGwKIAogaWZuZXEgKCQoZmlsdGVyIGFsbCBfYWxsIG1vZHVsZXMsJChNQUtFQ01ER09BTFMpKSwpCiAgIEtCVUlMRF9NT0RVTEVTIDo9IDEKQEAgLTI5NCw3ICszMDAsNyBAQAogIyAgICAgICAgIGNtZF9jY19vX2MgICAgICAgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICRAICQ8CiAjCiAjIElmICQocXVpZXQpIGlzIGVtcHR5LCB0aGUgd2hvbGUgY29tbWFuZCB3aWxsIGJlIHByaW50ZWQuCi0jIElmIGl0IGlzIHNldCB0byAicXVpZXRfIiwgb25seSB0aGUgc2hvcnQgdmVyc2lvbiB3aWxsIGJlIHByaW50ZWQuIAorIyBJZiBpdCBpcyBzZXQgdG8gInF1aWV0XyIsIG9ubHkgdGhlIHNob3J0IHZlcnNpb24gd2lsbCBiZSBwcmludGVkLgogIyBJZiBpdCBpcyBzZXQgdG8gInNpbGVudF8iLCBub3RoaW5nIHdpbGwgYmUgcHJpbnRlZCBhdCBhbGwsIHNpbmNlCiAjIHRoZSB2YXJpYWJsZSAkKHNpbGVudF9jbWRfY2Nfb19jKSBkb2Vzbid0IGV4aXN0LgogIwpAQCAtMzQ2LDcgKzM1Miw2IEBACiBpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQogCiAjIE1ha2UgdmFyaWFibGVzIChDQywgZXRjLi4uKQotCiBBUwkJPSAkKENST1NTX0NPTVBJTEUpYXMKIExECQk9ICQoQ1JPU1NfQ09NUElMRSlsZAogQ0MJCT0gJChDUk9TU19DT01QSUxFKWdjYwpAQCAtMzk1LDggKzQwMCw4IEBACiBLQlVJTERfQ0ZMQUdTICAgOj0gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIFwKIAkJICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gXAogCQkgICAtV2Vycm9yLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIFwKLQkJICAgLVduby1mb3JtYXQtc2VjdXJpdHkgXAotCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MsKQorCQkgICAtV25vLWZvcm1hdC1zZWN1cml0eQorCiBLQlVJTERfQUZMQUdTX0tFUk5FTCA6PQogS0JVSUxEX0NGTEFHU19LRVJORUwgOj0KIEtCVUlMRF9BRkxBR1MgICA6PSAtRF9fQVNTRU1CTFlfXwpAQCAtNTA0LDggKzUwOSwxNiBAQAogIyBXZSdyZSBjYWxsZWQgd2l0aCBtaXhlZCB0YXJnZXRzICgqY29uZmlnIGFuZCBidWlsZCB0YXJnZXRzKS4KICMgSGFuZGxlIHRoZW0gb25lIGJ5IG9uZS4KIAotJTo6IEZPUkNFCi0JJChRKSQoTUFLRSkgLUMgJChzcmN0cmVlKSBLQlVJTERfU1JDPSAkQAorUEhPTlkgKz0gJChNQUtFQ01ER09BTFMpIF9fYnVpbGRfb25lX2J5X29uZQorCiskKGZpbHRlci1vdXQgX19idWlsZF9vbmVfYnlfb25lLCAkKE1BS0VDTURHT0FMUykpOiBfX2J1aWxkX29uZV9ieV9vbmUKKwlAOgorCitfX2J1aWxkX29uZV9ieV9vbmU6CisJJChRKXNldCAtZTsgXAorCWZvciBpIGluICQoTUFLRUNNREdPQUxTKTsgZG8gXAorCQkkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgJCRpOyBcCisJZG9uZQogCiBlbHNlCiBpZmVxICgkKGNvbmZpZy10YXJnZXRzKSwxKQpAQCAtNTIwLDExICs1MzMsOSBAQAogZXhwb3J0IEtCVUlMRF9ERUZDT05GSUcgS0JVSUxEX0tDT05GSUcKIAogY29uZmlnOiBzY3JpcHRzX2Jhc2ljIG91dHB1dG1ha2VmaWxlIEZPUkNFCi0JJChRKW1rZGlyIC1wIGluY2x1ZGUvbGludXggaW5jbHVkZS9jb25maWcKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKIAogJWNvbmZpZzogc2NyaXB0c19iYXNpYyBvdXRwdXRtYWtlZmlsZSBGT1JDRQotCSQoUSlta2RpciAtcCBpbmNsdWRlL2xpbnV4IGluY2x1ZGUvY29uZmlnCiAJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnICRACiAKIGVsc2UKQEAgLTU5NCwxNCArNjA1LDE2IEBACiAjIERlZmF1bHRzIHRvIHZtbGludXgsIGJ1dCB0aGUgYXJjaCBtYWtlZmlsZSB1c3VhbGx5IGFkZHMgZnVydGhlciB0YXJnZXRzCiBhbGw6IHZtbGludXgKIAoraW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9NYWtlZmlsZQorCitLQlVJTERfQ0ZMQUdTCSs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcywpCisKIGlmZGVmIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRQogS0JVSUxEX0NGTEFHUwkrPSAtT3MgJChjYWxsIGNjLWRpc2FibGUtd2FybmluZyxtYXliZS11bmluaXRpYWxpemVkLCkKIGVsc2UKIEtCVUlMRF9DRkxBR1MJKz0gLU8yCiBlbmRpZgogCi1pbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL01ha2VmaWxlCi0KIGlmZGVmIENPTkZJR19SRUFEQUJMRV9BU00KICMgRGlzYWJsZSBvcHRpbWl6YXRpb25zIHRoYXQgbWFrZSBhc3NlbWJsZXIgbGlzdGluZ3MgaGFyZCB0byByZWFkLgogIyByZW9yZGVyIGJsb2NrcyByZW9yZGVycyB0aGUgY29udHJvbCBpbiB0aGUgZnVuY3Rpb24KQEAgLTczMSw2ICs3NDQsOCBAQAogCUtCVUlMRF9DRkxBR1MgKz0gLURDQ19IQVZFX0FTTV9HT1RPCiBlbmRpZgogCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5leHRyYXdhcm4KKwogIyBBZGQgdXNlciBzdXBwbGllZCBDUFBGTEFHUywgQUZMQUdTIGFuZCBDRkxBR1MgYXMgdGhlIGxhc3QgYXNzaWdubWVudHMKIEtCVUlMRF9DUFBGTEFHUyArPSAkKEtDUFBGTEFHUykKIEtCVUlMRF9BRkxBR1MgKz0gJChLQUZMQUdTKQpAQCAtNzc1LDEwICs3OTAsMTAgQEAKIGV4cG9ydCBNT0RMSUIKIAogIwotIyAgSU5TVEFMTF9NT0RfU1RSSVAsIGlmIGRlZmluZWQsIHdpbGwgY2F1c2UgbW9kdWxlcyB0byBiZQotIyAgc3RyaXBwZWQgYWZ0ZXIgdGhleSBhcmUgaW5zdGFsbGVkLiAgSWYgSU5TVEFMTF9NT0RfU1RSSVAgaXMgJzEnLCB0aGVuCi0jICB0aGUgZGVmYXVsdCBvcHRpb24gLS1zdHJpcC1kZWJ1ZyB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsCi0jICBJTlNUQUxMX01PRF9TVFJJUCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIG9wdGlvbnMgdG8gdGhlIHN0cmlwIGNvbW1hbmQuCisjIElOU1RBTExfTU9EX1NUUklQLCBpZiBkZWZpbmVkLCB3aWxsIGNhdXNlIG1vZHVsZXMgdG8gYmUKKyMgc3RyaXBwZWQgYWZ0ZXIgdGhleSBhcmUgaW5zdGFsbGVkLiAgSWYgSU5TVEFMTF9NT0RfU1RSSVAgaXMgJzEnLCB0aGVuCisjIHRoZSBkZWZhdWx0IG9wdGlvbiAtLXN0cmlwLWRlYnVnIHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwKKyMgSU5TVEFMTF9NT0RfU1RSSVAgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBvcHRpb25zIHRvIHRoZSBzdHJpcCBjb21tYW5kLgogCiBpZmRlZiBJTlNUQUxMX01PRF9TVFJJUAogaWZlcSAoJChJTlNUQUxMX01PRF9TVFJJUCksMSkKQEAgLTg2Myw3ICs4NzgsNyBAQAogZW5kaWYKIAkrJChjYWxsIGlmX2NoYW5nZWQsbGluay12bWxpbnV4KQogCi0jIFRoZSBhY3R1YWwgb2JqZWN0cyBhcmUgZ2VuZXJhdGVkIHdoZW4gZGVzY2VuZGluZywgCisjIFRoZSBhY3R1YWwgb2JqZWN0cyBhcmUgZ2VuZXJhdGVkIHdoZW4gZGVzY2VuZGluZywKICMgbWFrZSBzdXJlIG5vIGltcGxpY2l0IHJ1bGUga2lja3MgaW4KICQoc29ydCAkKHZtbGludXgtZGVwcykpOiAkKHZtbGludXgtZGlycykgOwogCkBAIC0xMDIxLDExICsxMDM2LDExIEBACiAKIGFsbDogbW9kdWxlcwogCi0jCUJ1aWxkIG1vZHVsZXMKKyMgQnVpbGQgbW9kdWxlcwogIwotIwlBIG1vZHVsZSBjYW4gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIG9iai1tIHJlc3VsdGluZyBpbgotIwlkdXBsaWNhdGUgbGluZXMgaW4gbW9kdWxlcy5vcmRlciBmaWxlcy4gIFRob3NlIGFyZSByZW1vdmVkCi0jCXVzaW5nIGF3ayB3aGlsZSBjb25jYXRlbmF0aW5nIHRvIHRoZSBmaW5hbCBmaWxlLgorIyBBIG1vZHVsZSBjYW4gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIG9iai1tIHJlc3VsdGluZyBpbgorIyBkdXBsaWNhdGUgbGluZXMgaW4gbW9kdWxlcy5vcmRlciBmaWxlcy4gIFRob3NlIGFyZSByZW1vdmVkCisjIHVzaW5nIGF3ayB3aGlsZSBjb25jYXRlbmF0aW5nIHRvIHRoZSBmaW5hbCBmaWxlLgogCiBQSE9OWSArPSBtb2R1bGVzCiBtb2R1bGVzOiAkKHZtbGludXgtZGlycykgJChpZiAkKEtCVUlMRF9CVUlMVElOKSx2bWxpbnV4KSBtb2R1bGVzLmJ1aWx0aW4KQEAgLTEwNTQsMTAgKzEwNjksMTAgQEAKIAlAcm0gLXJmICQoTU9ETElCKS9rZXJuZWwKIAlAcm0gLWYgJChNT0RMSUIpL3NvdXJjZQogCUBta2RpciAtcCAkKE1PRExJQikva2VybmVsCi0JQGxuIC1zICQoc3JjdHJlZSkgJChNT0RMSUIpL3NvdXJjZQorCUBsbiAtcyBgY2QgJChzcmN0cmVlKSAmJiAvYmluL3B3ZGAgJChNT0RMSUIpL3NvdXJjZQogCUBpZiBbICEgJChvYmp0cmVlKSAtZWYgICQoTU9ETElCKS9idWlsZCBdOyB0aGVuIFwKIAkJcm0gLWYgJChNT0RMSUIpL2J1aWxkIDsgXAotCQlsbiAtcyAkKG9ianRyZWUpICQoTU9ETElCKS9idWlsZCA7IFwKKwkJbG4gLXMgJChDVVJESVIpICQoTU9ETElCKS9idWlsZCA7IFwKIAlmaQogCUBjcCAtZiAkKG9ianRyZWUpL21vZHVsZXMub3JkZXIgJChNT0RMSUIpLwogCUBjcCAtZiAkKG9ianRyZWUpL21vZHVsZXMuYnVpbHRpbiAkKE1PRExJQikvCkBAIC0xMTA0LDcgKzExMTksNyBAQAogCiAjIERpcmVjdG9yaWVzICYgZmlsZXMgcmVtb3ZlZCB3aXRoICdtYWtlIG1ycHJvcGVyJwogTVJQUk9QRVJfRElSUyAgKz0gaW5jbHVkZS9jb25maWcgdXNyL2luY2x1ZGUgaW5jbHVkZS9nZW5lcmF0ZWQgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgYXJjaC8qL2luY2x1ZGUvZ2VuZXJhdGVkIC50bXBfb2JqZGlmZgorCQkgIGFyY2gvKi9pbmNsdWRlL2dlbmVyYXRlZCAudG1wX29iamRpZmYKIE1SUFJPUEVSX0ZJTEVTICs9IC5jb25maWcgLmNvbmZpZy5vbGQgLnZlcnNpb24gLm9sZF92ZXJzaW9uICQodmVyc2lvbl9oKSBcCiAJCSAgTW9kdWxlLnN5bXZlcnMgdGFncyBUQUdTIGNzY29wZSogR1BBVEggR1RBR1MgR1JUQUdTIEdTWU1TIFwKIAkJICBzaWduaW5nX2tleS5wcml2IHNpZ25pbmdfa2V5Lng1MDkgeDUwOS5nZW5rZXkJCVwKQEAgLTE0NzgsNyArMTQ5Myw3IEBACiAJJChidWlsZCk9JChidWlsZC1kaXIpICQoQDoua289Lm8pCiAJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKIAotIyBGSVhNRSBTaG91bGQgZ28gaW50byBhIG1ha2UubGliIG9yIHNvbWV0aGluZyAKKyMgRklYTUUgU2hvdWxkIGdvIGludG8gYSBtYWtlLmxpYiBvciBzb21ldGhpbmcKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHF1aWV0X2NtZF9ybWRpcnMgPSAkKGlmICQod2lsZGNhcmQgJChybS1kaXJzKSksQ0xFQU4gICAkKHdpbGRjYXJkICQocm0tZGlycykpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zM3h4LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hbTMzeHguZHRzaQppbmRleCA5ZjUzZTgyLi40YTRlMDJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hbTMzeHguZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTMzeHguZHRzaQpAQCAtNjYyLDYgKzY2Miw4IEBACiAJCW1hYzogZXRoZXJuZXRANGExMDAwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxjcHN3IjsKIAkJCXRpLGh3bW9kcyA9ICJjcGdtYWMwIjsKKwkJCWNsb2NrcyA9IDwmY3Bzd18xMjVtaHpfZ2Nsaz4sIDwmY3Bzd19jcHRzX3JmdF9jbGs+OworCQkJY2xvY2stbmFtZXMgPSAiZmNrIiwgImNwdHMiOwogCQkJY3BkbWFfY2hhbm5lbHMgPSA8OD47CiAJCQlhbGVfZW50cmllcyA9IDwxMDI0PjsKIAkJCWJkX3JhbV9zaXplID0gPDB4MjAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hbTQzNzIuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNDM3Mi5kdHNpCmluZGV4IGRiNDY0ZDcuLjQ5ZmE1OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNDM3Mi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNDM3Mi5kdHNpCkBAIC00OTAsNiArNDkwLDggQEAKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQl0aSxod21vZHMgPSAiY3BnbWFjMCI7CisJCQljbG9ja3MgPSA8JmNwc3dfMTI1bWh6X2djbGs+LCA8JmNwc3dfY3B0c19yZnRfY2xrPjsKKwkJCWNsb2NrLW5hbWVzID0gImZjayIsICJjcHRzIjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCQljcGRtYV9jaGFubmVscyA9IDw4PjsKIAkJCWFsZV9lbnRyaWVzID0gPDEwMjQ+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXJtYWRhLXhwLW1hdHJpeC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEteHAtbWF0cml4LmR0cwppbmRleCAyNTY3NGZlLi43ZTI5MWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEteHAtbWF0cml4LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEteHAtbWF0cml4LmR0cwpAQCAtNTcsNiArNTcsMTAgQEAKIAkJCWV0aGVybmV0QDMwMDAwIHsKIAkJCQlzdGF0dXMgPSAib2theSI7CiAJCQkJcGh5LW1vZGUgPSAic2dtaWkiOworCQkJCWZpeGVkLWxpbmsgeworCQkJCQlzcGVlZCA9IDwxMDAwPjsKKwkJCQkJZnVsbC1kdXBsZXg7CisJCQkJfTsKIAkJCX07CiAKIAkJCXBjaWUtY29udHJvbGxlciB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy92dDg1MDAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Z0ODUwMC5kdHNpCmluZGV4IDUxZDBlOTEuLjE5MjlhZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3Z0ODUwMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Z0ODUwMC5kdHNpCkBAIC0xNjUsNSArMTY1LDExIEBACiAJCQlyZWcgPSA8MHhkODEwMDAwMCAweDEwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8NDg+OwogCQl9OworCisJCWV0aGVybmV0QGQ4MDA0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAidmlhLHZ0ODUwMC1yaGluZSI7CisJCQlyZWcgPSA8MHhkODAwNDAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3dtODY1MC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvd204NjUwLmR0c2kKaW5kZXggNzUyNTk4Mi4uYjFjNTlhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvd204NjUwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvd204NjUwLmR0c2kKQEAgLTIxOCw1ICsyMTgsMTEgQEAKIAkJCXJlZyA9IDwweGQ4MTAwMDAwIDB4MTAwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw0OD47CiAJCX07CisKKwkJZXRoZXJuZXRAZDgwMDQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ2aWEsdnQ4NTAwLXJoaW5lIjsKKwkJCXJlZyA9IDwweGQ4MDA0MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvd204ODUwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy93bTg4NTAuZHRzaQppbmRleCBkOTgzODZkLi44ZmJjY2ZiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvd204ODUwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvd204ODUwLmR0c2kKQEAgLTI5OCw1ICsyOTgsMTEgQEAKIAkJCWJ1cy13aWR0aCA9IDw0PjsKIAkJCXNkb24taW52ZXJ0ZWQ7CiAJCX07CisKKwkJZXRoZXJuZXRAZDgwMDQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ2aWEsdnQ4NTAwLXJoaW5lIjsKKwkJCXJlZyA9IDwweGQ4MDA0MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworICAgICAgICAgICAgICAgIH07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCBhNmJjNDMxLi40MjM4YmNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCSAqLwogCWh3Yy0+Y29uZmlnX2Jhc2UJICAgIHw9ICh1bnNpZ25lZCBsb25nKW1hcHBpbmc7CiAKLQlpZiAoIWh3Yy0+c2FtcGxlX3BlcmlvZCkgeworCWlmICghaXNfc2FtcGxpbmdfZXZlbnQoZXZlbnQpKSB7CiAJCS8qCiAJCSAqIEZvciBub24tc2FtcGxpbmcgcnVucywgbGltaXQgdGhlIHNhbXBsZV9wZXJpb2QgdG8gaGFsZgogCQkgKiBvZiB0aGUgY291bnRlciB3aWR0aC4gVGhhdCB3YXksIHRoZSBuZXcgY291bnRlciB2YWx1ZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfY3B1LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYwppbmRleCBhNzFhZTE1Li5hZjllMzVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYwpAQCAtMTI2LDggKzEyNiw4IEBACiAKIAlpcnFzID0gbWluKHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXMsIG51bV9wb3NzaWJsZV9jcHVzKCkpOwogCWlmIChpcnFzIDwgMSkgewotCQlwcl9lcnIoIm5vIGlycXMgZm9yIFBNVXMgZGVmaW5lZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlwcmludGtfb25jZSgicGVyZi9BUk06IE5vIGlycXMgZm9yIFBNVSBkZWZpbmVkLCBzYW1wbGluZyBldmVudHMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOwogCX0KIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgMCk7CkBAIC0xOTEsNiArMTkxLDEwIEBACiAJLyogRW5zdXJlIHRoZSBQTVUgaGFzIHNhbmUgdmFsdWVzIG91dCBvZiByZXNldC4gKi8KIAlpZiAoY3B1X3BtdS0+cmVzZXQpCiAJCW9uX2VhY2hfY3B1KGNwdV9wbXUtPnJlc2V0LCBjcHVfcG11LCAxKTsKKworCS8qIElmIG5vIGludGVycnVwdHMgYXZhaWxhYmxlLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2FwYWJpbGl0eSBmbGFnICovCisJaWYgKCFwbGF0Zm9ybV9nZXRfaXJxKGNwdV9wbXUtPnBsYXRfZGV2aWNlLCAwKSkKKwkJY3B1X3BtdS0+cG11LmNhcGFiaWxpdGllcyB8PSBQRVJGX1BNVV9DQVBfTk9fSU5URVJSVVBUOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2FybS9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCAzOTk3YzQxLi45ZDg1MzE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjYsMzAgKzI2LDMwIEBACiAjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CiAKIC8qCi0gKiBjcHUgcG93ZXIgc2NhbGUgbWFuYWdlbWVudAorICogY3B1IGNhcGFjaXR5IHNjYWxlIG1hbmFnZW1lbnQKICAqLwogCiAvKgotICogY3B1IHBvd2VyIHRhYmxlCisgKiBjcHUgY2FwYWNpdHkgdGFibGUKICAqIFRoaXMgcGVyIGNwdSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHJlbGF0aXZlIGNhcGFjaXR5IG9mIGVhY2ggY29yZS4KICAqIE9uIGEgaGV0ZXJlZ2Vub3VzIHN5c3RlbSwgY29yZXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBjb21wdXRhdGlvbiBjYXBhY2l0eQotICogYW5kIHdlIHJlZmxlY3QgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBjcHVfcG93ZXIgZmllbGQgc28gdGhlIHNjaGVkdWxlciBjYW4KLSAqIHRha2UgdGhpcyBkaWZmZXJlbmNlIGludG8gYWNjb3VudCBkdXJpbmcgbG9hZCBiYWxhbmNlLiBBIHBlciBjcHUgc3RydWN0dXJlCi0gKiBpcyBwcmVmZXJyZWQgYmVjYXVzZSBlYWNoIENQVSB1cGRhdGVzIGl0cyBvd24gY3B1X3Bvd2VyIGZpZWxkIGR1cmluZyB0aGUKLSAqIGxvYWQgYmFsYW5jZSBleGNlcHQgZm9yIGlkbGUgY29yZXMuIE9uZSBpZGxlIGNvcmUgaXMgc2VsZWN0ZWQgdG8gcnVuIHRoZQotICogcmViYWxhbmNlX2RvbWFpbnMgZm9yIGFsbCBpZGxlIGNvcmVzIGFuZCB0aGUgY3B1X3Bvd2VyIGNhbiBiZSB1cGRhdGVkCi0gKiBkdXJpbmcgdGhpcyBzZXF1ZW5jZS4KKyAqIGFuZCB3ZSByZWZsZWN0IHRoYXQgZGlmZmVyZW5jZSBpbiB0aGUgY3B1X2NhcGFjaXR5IGZpZWxkIHNvIHRoZSBzY2hlZHVsZXIKKyAqIGNhbiB0YWtlIHRoaXMgZGlmZmVyZW5jZSBpbnRvIGFjY291bnQgZHVyaW5nIGxvYWQgYmFsYW5jZS4gQSBwZXIgY3B1CisgKiBzdHJ1Y3R1cmUgaXMgcHJlZmVycmVkIGJlY2F1c2UgZWFjaCBDUFUgdXBkYXRlcyBpdHMgb3duIGNwdV9jYXBhY2l0eSBmaWVsZAorICogZHVyaW5nIHRoZSBsb2FkIGJhbGFuY2UgZXhjZXB0IGZvciBpZGxlIGNvcmVzLiBPbmUgaWRsZSBjb3JlIGlzIHNlbGVjdGVkCisgKiB0byBydW4gdGhlIHJlYmFsYW5jZV9kb21haW5zIGZvciBhbGwgaWRsZSBjb3JlcyBhbmQgdGhlIGNwdV9jYXBhY2l0eSBjYW4gYmUKKyAqIHVwZGF0ZWQgZHVyaW5nIHRoaXMgc2VxdWVuY2UuCiAgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjcHVfc2NhbGUpOwogCi11bnNpZ25lZCBsb25nIGFyY2hfc2NhbGVfZnJlcV9wb3dlcihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3Vuc2lnbmVkIGxvbmcgYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5KHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQogewogCXJldHVybiBwZXJfY3B1KGNwdV9zY2FsZSwgY3B1KTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3Bvd2VyX3NjYWxlKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgcG93ZXIpCitzdGF0aWMgdm9pZCBzZXRfY2FwYWNpdHlfc2NhbGUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyBjYXBhY2l0eSkKIHsKLQlwZXJfY3B1KGNwdV9zY2FsZSwgY3B1KSA9IHBvd2VyOworCXBlcl9jcHUoY3B1X3NjYWxlLCBjcHUpID0gY2FwYWNpdHk7CiB9CiAKICNpZmRlZiBDT05GSUdfT0YKQEAgLTYyLDExICs2MiwxMSBAQAogICogVGFibGUgb2YgcmVsYXRpdmUgZWZmaWNpZW5jeSBvZiBlYWNoIHByb2Nlc3NvcnMKICAqIFRoZSBlZmZpY2llbmN5IHZhbHVlIG11c3QgZml0IGluIDIwYml0IGFuZCB0aGUgZmluYWwKICAqIGNwdV9zY2FsZSB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZQotICogICAwIDwgY3B1X3NjYWxlIDwgMypTQ0hFRF9QT1dFUl9TQ0FMRS8yCisgKiAgIDAgPCBjcHVfc2NhbGUgPCAzKlNDSEVEX0NBUEFDSVRZX1NDQUxFLzIKICAqIGluIG9yZGVyIHRvIHJldHVybiBhdCBtb3N0IDEgd2hlbiBESVZfUk9VTkRfQ0xPU0VTVAogICogaXMgdXNlZCB0byBjb21wdXRlIHRoZSBjYXBhY2l0eSBvZiBhIENQVS4KICAqIFByb2Nlc3NvcnMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gdGhlIHRhYmxlLAotICogdXNlIHRoZSBkZWZhdWx0IFNDSEVEX1BPV0VSX1NDQUxFIHZhbHVlIGZvciBjcHVfc2NhbGUuCisgKiB1c2UgdGhlIGRlZmF1bHQgU0NIRURfQ0FQQUNJVFlfU0NBTEUgdmFsdWUgZm9yIGNwdV9zY2FsZS4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfZWZmaWNpZW5jeSB0YWJsZV9lZmZpY2llbmN5W10gPSB7CiAJeyJhcm0sY29ydGV4LWExNSIsIDM4OTF9LApAQCAtODMsOSArODMsOSBAQAogICogSXRlcmF0ZSBhbGwgQ1BVcycgZGVzY3JpcHRvciBpbiBEVCBhbmQgY29tcHV0ZSB0aGUgZWZmaWNpZW5jeQogICogKGFzIHBlciB0YWJsZV9lZmZpY2llbmN5KS4gQWxzbyBjYWxjdWxhdGUgYSBtaWRkbGUgZWZmaWNpZW5jeQogICogYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gIChtYXh7ZWZmX2l9IC0gbWlue2VmZl9pfSkgLyAyCi0gKiBUaGlzIGlzIGxhdGVyIHVzZWQgdG8gc2NhbGUgdGhlIGNwdV9wb3dlciBmaWVsZCBzdWNoIHRoYXQgYW4KLSAqICdhdmVyYWdlJyBDUFUgaXMgb2YgbWlkZGxlIHBvd2VyLiBBbHNvIHNlZSB0aGUgY29tbWVudHMgbmVhcgotICogdGFibGVfZWZmaWNpZW5jeVtdIGFuZCB1cGRhdGVfY3B1X3Bvd2VyKCkuCisgKiBUaGlzIGlzIGxhdGVyIHVzZWQgdG8gc2NhbGUgdGhlIGNwdV9jYXBhY2l0eSBmaWVsZCBzdWNoIHRoYXQgYW4KKyAqICdhdmVyYWdlJyBDUFUgaXMgb2YgbWlkZGxlIGNhcGFjaXR5LiBBbHNvIHNlZSB0aGUgY29tbWVudHMgbmVhcgorICogdGFibGVfZWZmaWNpZW5jeVtdIGFuZCB1cGRhdGVfY3B1X2NhcGFjaXR5KCkuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9kdF90b3BvbG9neSh2b2lkKQogewpAQCAtMTQxLDE1ICsxNDEsMTUgQEAKIAkgKiBjcHVfc2NhbGUgYmVjYXVzZSBhbGwgQ1BVcyBoYXZlIHRoZSBzYW1lIGNhcGFjaXR5LiBPdGhlcndpc2UsIHdlCiAJICogY29tcHV0ZSBhIG1pZGRsZV9jYXBhY2l0eSBmYWN0b3IgdGhhdCB3aWxsIGVuc3VyZSB0aGF0IHRoZSBjYXBhY2l0eQogCSAqIG9mIGFuICdhdmVyYWdlJyBDUFUgb2YgdGhlIHN5c3RlbSB3aWxsIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvCi0JICogU0NIRURfUE9XRVJfU0NBTEUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVlLCBidXQgd2l0aCB0aGUKKwkgKiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCB3aXRoIHRoZQogCSAqIGNvbnN0cmFpbnQgZXhwbGFpbmVkIG5lYXIgdGFibGVfZWZmaWNpZW5jeVtdLgogCSAqLwogCWlmICg0Km1heF9jYXBhY2l0eSA8ICgzKihtYXhfY2FwYWNpdHkgKyBtaW5fY2FwYWNpdHkpKSkKIAkJbWlkZGxlX2NhcGFjaXR5ID0gKG1pbl9jYXBhY2l0eSArIG1heF9jYXBhY2l0eSkKLQkJCQk+PiAoU0NIRURfUE9XRVJfU0hJRlQrMSk7CisJCQkJPj4gKFNDSEVEX0NBUEFDSVRZX1NISUZUKzEpOwogCWVsc2UKIAkJbWlkZGxlX2NhcGFjaXR5ID0gKChtYXhfY2FwYWNpdHkgLyAzKQotCQkJCT4+IChTQ0hFRF9QT1dFUl9TSElGVC0xKSkgKyAxOworCQkJCT4+IChTQ0hFRF9DQVBBQ0lUWV9TSElGVC0xKSkgKyAxOwogCiB9CiAKQEAgLTE1OCwyMCArMTU4LDIwIEBACiAgKiBib290LiBUaGUgdXBkYXRlIG9mIGFsbCBDUFVzIGlzIGluIE8obl4yKSBmb3IgaGV0ZXJlZ2VuZW91cyBzeXN0ZW0gYnV0IHRoZQogICogZnVuY3Rpb24gcmV0dXJucyBkaXJlY3RseSBmb3IgU01QIHN5c3RlbS4KICAqLwotc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9wb3dlcih1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9jYXBhY2l0eSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmICghY3B1X2NhcGFjaXR5KGNwdSkpCiAJCXJldHVybjsKIAotCXNldF9wb3dlcl9zY2FsZShjcHUsIGNwdV9jYXBhY2l0eShjcHUpIC8gbWlkZGxlX2NhcGFjaXR5KTsKKwlzZXRfY2FwYWNpdHlfc2NhbGUoY3B1LCBjcHVfY2FwYWNpdHkoY3B1KSAvIG1pZGRsZV9jYXBhY2l0eSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDUFUldTogdXBkYXRlIGNwdV9wb3dlciAlbHVcbiIsCi0JCWNwdSwgYXJjaF9zY2FsZV9mcmVxX3Bvd2VyKE5VTEwsIGNwdSkpOworCXByaW50ayhLRVJOX0lORk8gIkNQVSV1OiB1cGRhdGUgY3B1X2NhcGFjaXR5ICVsdVxuIiwKKwkJY3B1LCBhcmNoX3NjYWxlX2ZyZXFfY2FwYWNpdHkoTlVMTCwgY3B1KSk7CiB9CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFyc2VfZHRfdG9wb2xvZ3kodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfY3B1X3Bvd2VyKHVuc2lnbmVkIGludCBjcHVpZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfY3B1X2NhcGFjaXR5KHVuc2lnbmVkIGludCBjcHVpZCkge30KICNlbmRpZgogCiAgLyoKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAJdXBkYXRlX3NpYmxpbmdzX21hc2tzKGNwdWlkKTsKIAotCXVwZGF0ZV9jcHVfcG93ZXIoY3B1aWQpOworCXVwZGF0ZV9jcHVfY2FwYWNpdHkoY3B1aWQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVJXU6IHRocmVhZCAlZCwgY3B1ICVkLCBzb2NrZXQgJWQsIG1waWRyICV4XG4iLAogCQljcHVpZCwgY3B1X3RvcG9sb2d5W2NwdWlkXS50aHJlYWRfaWQsCkBAIC0yOTcsNyArMjk3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCi0JLyogaW5pdCBjb3JlIG1hc2sgYW5kIHBvd2VyKi8KKwkvKiBpbml0IGNvcmUgbWFzayBhbmQgY2FwYWNpdHkgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBjcHV0b3BvX2FybSAqY3B1X3RvcG8gPSAmKGNwdV90b3BvbG9neVtjcHVdKTsKIApAQCAtMzA3LDcgKzMwNyw3IEBACiAJCWNwdW1hc2tfY2xlYXIoJmNwdV90b3BvLT5jb3JlX3NpYmxpbmcpOwogCQljcHVtYXNrX2NsZWFyKCZjcHVfdG9wby0+dGhyZWFkX3NpYmxpbmcpOwogCi0JCXNldF9wb3dlcl9zY2FsZShjcHUsIFNDSEVEX1BPV0VSX1NDQUxFKTsKKwkJc2V0X2NhcGFjaXR5X3NjYWxlKGNwdSwgU0NIRURfQ0FQQUNJVFlfU0NBTEUpOwogCX0KIAlzbXBfd21iKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuYwppbmRleCBlNGRlYzlmLi45YzYwMjliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5jCkBAIC0yMyw5ICsyMyw3IEBACiAjaW5jbHVkZSAiYm9hcmQuaCIKIAogc3RhdGljIHN0cnVjdCByZmtpbGxfZ3Bpb19wbGF0Zm9ybV9kYXRhIHdpZmlfcmZraWxsX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLm5hbWUJCT0gIndpZmlfcmZraWxsIiwKLQkucmVzZXRfZ3Bpbwk9IDI1LCAvKiBQRDEgKi8KLQkuc2h1dGRvd25fZ3Bpbwk9IDg1LCAvKiBQSzUgKi8KKwkubmFtZQk9ICJ3aWZpX3Jma2lsbCIsCiAJLnR5cGUJPSBSRktJTExfVFlQRV9XTEFOLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbmV0L2JwZl9qaXRfMzIuYyBiL2FyY2gvYXJtL25ldC9icGZfaml0XzMyLmMKaW5kZXggNmY4NzljMy4uZmI1NTAzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbmV0L2JwZl9qaXRfMzIuYworKysgYi9hcmNoL2FybS9uZXQvYnBmX2ppdF8zMi5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAl1MTYgcmV0ID0gMDsKIAogCWlmICgoY3R4LT5za2YtPmxlbiA+IDEpIHx8Ci0JICAgIChjdHgtPnNrZi0+aW5zbnNbMF0uY29kZSA9PSBCUEZfU19SRVRfQSkpCisJICAgIChjdHgtPnNrZi0+aW5zbnNbMF0uY29kZSA9PSAoQlBGX1JFVCB8IEJQRl9BKSkpCiAJCXJldCB8PSAxIDw8IHJfQTsKIAogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCkBAIC0xNjQsMTggKzE2NCwxMCBAQAogc3RhdGljIGlubGluZSBib29sIGlzX2xvYWRfdG9fYSh1MTYgaW5zdCkKIHsKIAlzd2l0Y2ggKGluc3QpIHsKLQljYXNlIEJQRl9TX0xEX1dfTEVOOgotCWNhc2UgQlBGX1NfTERfV19BQlM6Ci0JY2FzZSBCUEZfU19MRF9IX0FCUzoKLQljYXNlIEJQRl9TX0xEX0JfQUJTOgotCWNhc2UgQlBGX1NfQU5DX0NQVToKLQljYXNlIEJQRl9TX0FOQ19JRklOREVYOgotCWNhc2UgQlBGX1NfQU5DX01BUks6Ci0JY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6Ci0JY2FzZSBCUEZfU19BTkNfUlhIQVNIOgotCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHOgotCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHX1BSRVNFTlQ6Ci0JY2FzZSBCUEZfU19BTkNfUVVFVUU6CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU46CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CiAJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZTsKQEAgLTIxNSw3ICsyMDcsNyBAQAogCQllbWl0KEFSTV9NT1ZfSShyX1gsIDApLCBjdHgpOwogCiAJLyogZG8gbm90IGxlYWsga2VybmVsIGRhdGEgdG8gdXNlcnNwYWNlICovCi0JaWYgKChmaXJzdF9pbnN0ICE9IEJQRl9TX1JFVF9LKSAmJiAhKGlzX2xvYWRfdG9fYShmaXJzdF9pbnN0KSkpCisJaWYgKChmaXJzdF9pbnN0ICE9IChCUEZfUkVUIHwgQlBGX0spKSAmJiAhKGlzX2xvYWRfdG9fYShmaXJzdF9pbnN0KSkpCiAJCWVtaXQoQVJNX01PVl9JKHJfQSwgMCksIGN0eCk7CiAKIAkvKiBzdGFjayBzcGFjZSBmb3IgdGhlIEJQRl9NRU0gd29yZHMgKi8KQEAgLTQ4MCwzNiArNDcyLDM5IEBACiAJdTMyIGs7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+bGVuOyBpKyspIHsKKwkJdTE2IGNvZGU7CisKIAkJaW5zdCA9ICYocHJvZy0+aW5zbnNbaV0pOwogCQkvKiBLIGFzIGFuIGltbWVkaWF0ZSB2YWx1ZSBvcGVyYW5kICovCiAJCWsgPSBpbnN0LT5rOworCQljb2RlID0gYnBmX2FuY19oZWxwZXIoaW5zdCk7CiAKIAkJLyogY29tcHV0ZSBvZmZzZXRzIG9ubHkgaW4gdGhlIGZha2UgcGFzcyAqLwogCQlpZiAoY3R4LT50YXJnZXQgPT0gTlVMTCkKIAkJCWN0eC0+b2Zmc2V0c1tpXSA9IGN0eC0+aWR4ICogNDsKIAotCQlzd2l0Y2ggKGluc3QtPmNvZGUpIHsKLQkJY2FzZSBCUEZfU19MRF9JTU06CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIEJQRl9MRCB8IEJQRl9JTU06CiAJCQllbWl0X21vdl9pKHJfQSwgaywgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEX1dfTEVOOgorCQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0xFTjoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGxlbikgIT0gNCk7CiAJCQllbWl0KEFSTV9MRFJfSShyX0EsIHJfc2tiLAogCQkJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRF9NRU06CisJCWNhc2UgQlBGX0xEIHwgQlBGX01FTToKIAkJCS8qIEEgPSBzY3JhdGNoW2tdICovCiAJCQljdHgtPnNlZW4gfD0gU0VFTl9NRU1fV09SRChrKTsKIAkJCWVtaXQoQVJNX0xEUl9JKHJfQSwgQVJNX1NQLCBTQ1JBVENIX09GRihrKSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRF9XX0FCUzoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CiAJCQlsb2FkX29yZGVyID0gMjsKIAkJCWdvdG8gbG9hZDsKLQkJY2FzZSBCUEZfU19MRF9IX0FCUzoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CiAJCQlsb2FkX29yZGVyID0gMTsKIAkJCWdvdG8gbG9hZDsKLQkJY2FzZSBCUEZfU19MRF9CX0FCUzoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CiAJCQlsb2FkX29yZGVyID0gMDsKIGxvYWQ6CiAJCQkvKiB0aGUgaW50ZXJwcmV0ZXIgd2lsbCBkZWFsIHdpdGggdGhlIG5lZ2F0aXZlIEsgKi8KQEAgLTU1MiwzMSArNTQ3LDMxIEBACiAJCQllbWl0X2Vycl9yZXQoQVJNX0NPTkRfTkUsIGN0eCk7CiAJCQllbWl0KEFSTV9NT1ZfUihyX0EsIEFSTV9SMCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRF9XX0lORDoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9JTkQ6CiAJCQlsb2FkX29yZGVyID0gMjsKIAkJCWdvdG8gbG9hZF9pbmQ7Ci0JCWNhc2UgQlBGX1NfTERfSF9JTkQ6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5EOgogCQkJbG9hZF9vcmRlciA9IDE7CiAJCQlnb3RvIGxvYWRfaW5kOwotCQljYXNlIEJQRl9TX0xEX0JfSU5EOgorCQljYXNlIEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORDoKIAkJCWxvYWRfb3JkZXIgPSAwOwogbG9hZF9pbmQ6CiAJCQlPUF9JTU0zKEFSTV9BREQsIHJfb2ZmLCByX1gsIGssIGN0eCk7CiAJCQlnb3RvIGxvYWRfY29tbW9uOwotCQljYXNlIEJQRl9TX0xEWF9JTU06CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9JTU06CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YOwogCQkJZW1pdF9tb3ZfaShyX1gsIGssIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRFhfV19MRU46CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9XIHwgQlBGX0xFTjoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1ggfCBTRUVOX1NLQjsKIAkJCWVtaXQoQVJNX0xEUl9JKHJfWCwgcl9za2IsCiAJCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEWF9NRU06CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU06CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YIHwgU0VFTl9NRU1fV09SRChrKTsKIAkJCWVtaXQoQVJNX0xEUl9JKHJfWCwgQVJNX1NQLCBTQ1JBVENIX09GRihrKSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRFhfQl9NU0g6CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9CIHwgQlBGX01TSDoKIAkJCS8qIHggPSAoKCooZnJhbWUgKyBrKSkgJiAweGYpIDw8IDI7ICovCiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YIHwgU0VFTl9EQVRBIHwgU0VFTl9DQUxMOwogCQkJLyogdGhlIGludGVycHJldGVyIHNob3VsZCBkZWFsIHdpdGggdGhlIG5lZ2F0aXZlIEsgKi8KQEAgLTYwNiwxMTMgKzYwMSwxMTMgQEAKIAkJCWVtaXQoQVJNX0FORF9JKHJfWCwgQVJNX1IwLCAweDAwZiksIGN0eCk7CiAJCQllbWl0KEFSTV9MU0xfSShyX1gsIHJfWCwgMiksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19TVDoKKwkJY2FzZSBCUEZfU1Q6CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9NRU1fV09SRChrKTsKIAkJCWVtaXQoQVJNX1NUUl9JKHJfQSwgQVJNX1NQLCBTQ1JBVENIX09GRihrKSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19TVFg6CisJCWNhc2UgQlBGX1NUWDoKIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJY3R4LT5zZWVuIHw9IFNFRU5fTUVNX1dPUkQoayk7CiAJCQllbWl0KEFSTV9TVFJfSShyX1gsIEFSTV9TUCwgU0NSQVRDSF9PRkYoaykpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0FERF9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0s6CiAJCQkvKiBBICs9IEsgKi8KIAkJCU9QX0lNTTMoQVJNX0FERCwgcl9BLCByX0EsIGssIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfQUREX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWDoKIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJZW1pdChBUk1fQUREX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfU1VCX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfSzoKIAkJCS8qIEEgLT0gSyAqLwogCQkJT1BfSU1NMyhBUk1fU1VCLCByX0EsIHJfQSwgaywgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9TVUJfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgogCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7CiAJCQllbWl0KEFSTV9TVUJfUihyX0EsIHJfQSwgcl9YKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9NVUxfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOgogCQkJLyogQSAqPSBLICovCiAJCQllbWl0X21vdl9pKHJfc2NyYXRjaCwgaywgY3R4KTsKIAkJCWVtaXQoQVJNX01VTChyX0EsIHJfQSwgcl9zY3JhdGNoKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9NVUxfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9YOgogCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7CiAJCQllbWl0KEFSTV9NVUwocl9BLCByX0EsIHJfWCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfRElWX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfSzoKIAkJCWlmIChrID09IDEpCiAJCQkJYnJlYWs7CiAJCQllbWl0X21vdl9pKHJfc2NyYXRjaCwgaywgY3R4KTsKIAkJCWVtaXRfdWRpdihyX0EsIHJfQSwgcl9zY3JhdGNoLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0RJVl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1g6CiAJCQl1cGRhdGVfb25feHJlYWQoY3R4KTsKIAkJCWVtaXQoQVJNX0NNUF9JKHJfWCwgMCksIGN0eCk7CiAJCQllbWl0X2Vycl9yZXQoQVJNX0NPTkRfRVEsIGN0eCk7CiAJCQllbWl0X3VkaXYocl9BLCByX0EsIHJfWCwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9PUl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfSzoKIAkJCS8qIEEgfD0gSyAqLwogCQkJT1BfSU1NMyhBUk1fT1JSLCByX0EsIHJfQSwgaywgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9PUl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfWDoKIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJZW1pdChBUk1fT1JSX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfWE9SX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfSzoKIAkJCS8qIEEgXj0gSzsgKi8KIAkJCU9QX0lNTTMoQVJNX0VPUiwgcl9BLCByX0EsIGssIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfQUxVX1hPUl9YOgotCQljYXNlIEJQRl9TX0FMVV9YT1JfWDoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0FMVV9YT1JfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YOgogCQkJLyogQSBePSBYICovCiAJCQl1cGRhdGVfb25feHJlYWQoY3R4KTsKIAkJCWVtaXQoQVJNX0VPUl9SKHJfQSwgcl9BLCByX1gpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0FORF9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0s6CiAJCQkvKiBBICY9IEsgKi8KIAkJCU9QX0lNTTMoQVJNX0FORCwgcl9BLCByX0EsIGssIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfQU5EX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfWDoKIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJZW1pdChBUk1fQU5EX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfTFNIX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfSzoKIAkJCWlmICh1bmxpa2VseShrID4gMzEpKQogCQkJCXJldHVybiAtMTsKIAkJCWVtaXQoQVJNX0xTTF9JKHJfQSwgcl9BLCBrKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9MU0hfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9YOgogCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7CiAJCQllbWl0KEFSTV9MU0xfUihyX0EsIHJfQSwgcl9YKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9SU0hfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LOgogCQkJaWYgKHVubGlrZWx5KGsgPiAzMSkpCiAJCQkJcmV0dXJuIC0xOwogCQkJZW1pdChBUk1fTFNSX0kocl9BLCByX0EsIGspLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX1JTSF9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1g6CiAJCQl1cGRhdGVfb25feHJlYWQoY3R4KTsKIAkJCWVtaXQoQVJNX0xTUl9SKHJfQSwgcl9BLCByX1gpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX05FRzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX05FRzoKIAkJCS8qIEEgPSAtQSAqLwogCQkJZW1pdChBUk1fUlNCX0kocl9BLCByX0EsIDApLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfSk1QX0pBOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkE6CiAJCQkvKiBwYyArPSBLICovCiAJCQllbWl0KEFSTV9CKGJfaW1tKGkgKyBrICsgMSwgY3R4KSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19KTVBfSkVRX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSzoKIAkJCS8qIHBjICs9IChBID09IEspID8gcGMtPmp0IDogcGMtPmpmICovCiAJCQljb25kdCAgPSBBUk1fQ09ORF9FUTsKIAkJCWdvdG8gY21wX2ltbTsKLQkJY2FzZSBCUEZfU19KTVBfSkdUX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKIAkJCS8qIHBjICs9IChBID4gSykgPyBwYy0+anQgOiBwYy0+amYgKi8KIAkJCWNvbmR0ICA9IEFSTV9DT05EX0hJOwogCQkJZ290byBjbXBfaW1tOwotCQljYXNlIEJQRl9TX0pNUF9KR0VfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LOgogCQkJLyogcGMgKz0gKEEgPj0gSykgPyBwYy0+anQgOiBwYy0+amYgKi8KIAkJCWNvbmR0ICA9IEFSTV9DT05EX0hTOwogY21wX2ltbToKQEAgLTczMSwyMiArNzI2LDIyIEBACiAJCQkJX2VtaXQoY29uZHQgXiAxLCBBUk1fQihiX2ltbShpICsgaW5zdC0+amYgKyAxLAogCQkJCQkJCSAgICAgY3R4KSksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19KTVBfSkVRX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWDoKIAkJCS8qIHBjICs9IChBID09IFgpID8gcGMtPmp0IDogcGMtPmpmICovCiAJCQljb25kdCAgID0gQVJNX0NPTkRfRVE7CiAJCQlnb3RvIGNtcF94OwotCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgogCQkJLyogcGMgKz0gKEEgPiBYKSA/IHBjLT5qdCA6IHBjLT5qZiAqLwogCQkJY29uZHQgICA9IEFSTV9DT05EX0hJOwogCQkJZ290byBjbXBfeDsKLQkJY2FzZSBCUEZfU19KTVBfSkdFX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfWDoKIAkJCS8qIHBjICs9IChBID49IFgpID8gcGMtPmp0IDogcGMtPmpmICovCiAJCQljb25kdCAgID0gQVJNX0NPTkRfQ1M7CiBjbXBfeDoKIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJZW1pdChBUk1fQ01QX1Iocl9BLCByX1gpLCBjdHgpOwogCQkJZ290byBjb25kX2p1bXA7Ci0JCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSzoKIAkJCS8qIHBjICs9IChBICYgSykgPyBwYy0+anQgOiBwYy0+amYgKi8KIAkJCWNvbmR0ICA9IEFSTV9DT05EX05FOwogCQkJLyogbm90IHNldCBpZmYgYWxsIHplcm9lcyBpZmYgWj09MSBpZmYgRVEgKi8KQEAgLTc1OSwxNiArNzU0LDE2IEBACiAJCQkJZW1pdChBUk1fVFNUX0kocl9BLCBpbW0xMiksIGN0eCk7CiAJCQl9CiAJCQlnb3RvIGNvbmRfanVtcDsKLQkJY2FzZSBCUEZfU19KTVBfSlNFVF9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9YOgogCQkJLyogcGMgKz0gKEEgJiBYKSA/IHBjLT5qdCA6IHBjLT5qZiAqLwogCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7CiAJCQljb25kdCAgPSBBUk1fQ09ORF9ORTsKIAkJCWVtaXQoQVJNX1RTVF9SKHJfQSwgcl9YKSwgY3R4KTsKIAkJCWdvdG8gY29uZF9qdW1wOwotCQljYXNlIEJQRl9TX1JFVF9BOgorCQljYXNlIEJQRl9SRVQgfCBCUEZfQToKIAkJCWVtaXQoQVJNX01PVl9SKEFSTV9SMCwgcl9BKSwgY3R4KTsKIAkJCWdvdG8gYl9lcGlsb2d1ZTsKLQkJY2FzZSBCUEZfU19SRVRfSzoKKwkJY2FzZSBCUEZfUkVUIHwgQlBGX0s6CiAJCQlpZiAoKGsgPT0gMCkgJiYgKGN0eC0+cmV0MF9mcF9pZHggPCAwKSkKIAkJCQljdHgtPnJldDBfZnBfaWR4ID0gaTsKIAkJCWVtaXRfbW92X2koQVJNX1IwLCBrLCBjdHgpOwpAQCAtNzc2LDE3ICs3NzEsMTcgQEAKIAkJCWlmIChpICE9IGN0eC0+c2tmLT5sZW4gLSAxKQogCQkJCWVtaXQoQVJNX0IoYl9pbW0ocHJvZy0+bGVuLCBjdHgpKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX01JU0NfVEFYOgorCQljYXNlIEJQRl9NSVNDIHwgQlBGX1RBWDoKIAkJCS8qIFggPSBBICovCiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YOwogCQkJZW1pdChBUk1fTU9WX1Iocl9YLCByX0EpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfTUlTQ19UWEE6CisJCWNhc2UgQlBGX01JU0MgfCBCUEZfVFhBOgogCQkJLyogQSA9IFggKi8KIAkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwogCQkJZW1pdChBUk1fTU9WX1Iocl9BLCByX1gpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQU5DX1BST1RPQ09MOgorCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUFJPVE9DT0w6CiAJCQkvKiBBID0gbnRvaHMoc2tiLT5wcm90b2NvbCkgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsCkBAIC03OTUsNyArNzkwLDcgQEAKIAkJCWVtaXQoQVJNX0xEUkhfSShyX3NjcmF0Y2gsIHJfc2tiLCBvZmYpLCBjdHgpOwogCQkJZW1pdF9zd2FwMTYocl9BLCByX3NjcmF0Y2gsIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfQ1BVOgorCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfQ1BVOgogCQkJLyogcl9zY3JhdGNoID0gY3VycmVudF90aHJlYWRfaW5mbygpICovCiAJCQlPUF9JTU0zKEFSTV9CSUMsIHJfc2NyYXRjaCwgQVJNX1NQLCBUSFJFQURfU0laRSAtIDEsIGN0eCk7CiAJCQkvKiBBID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUgKi8KQEAgLTgwMyw3ICs3OTgsNyBAQAogCQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpOwogCQkJZW1pdChBUk1fTERSX0kocl9BLCByX3NjcmF0Y2gsIG9mZiksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfSUZJTkRFWDoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0lGSU5ERVg6CiAJCQkvKiBBID0gc2tiLT5kZXYtPmlmaW5kZXggKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkZXYpOwpAQCAtODE3LDMwICs4MTIsMzAgQEAKIAkJCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KTsKIAkJCWVtaXQoQVJNX0xEUl9JKHJfQSwgcl9zY3JhdGNoLCBvZmYpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQU5DX01BUks6CisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9NQVJLOgogCQkJY3R4LT5zZWVuIHw9IFNFRU5fU0tCOwogCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykgIT0gNCk7CiAJCQlvZmYgPSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyayk7CiAJCQllbWl0KEFSTV9MRFJfSShyX0EsIHJfc2tiLCBvZmYpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQU5DX1JYSEFTSDoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1JYSEFTSDoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpICE9IDQpOwogCQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpOwogCQkJZW1pdChBUk1fTERSX0kocl9BLCByX3NrYiwgb2ZmKSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBRzoKLQkJY2FzZSBCUEZfU19BTkNfVkxBTl9UQUdfUFJFU0VOVDoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHOgorCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVDoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSAhPSAyKTsKIAkJCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSk7CiAJCQllbWl0KEFSTV9MRFJIX0kocl9BLCByX3NrYiwgb2ZmKSwgY3R4KTsKLQkJCWlmIChpbnN0LT5jb2RlID09IEJQRl9TX0FOQ19WTEFOX1RBRykKKwkJCWlmIChjb2RlID09IChCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHKSkKIAkJCQlPUF9JTU0zKEFSTV9BTkQsIHJfQSwgcl9BLCBWTEFOX1ZJRF9NQVNLLCBjdHgpOwogCQkJZWxzZQogCQkJCU9QX0lNTTMoQVJNX0FORCwgcl9BLCByX0EsIFZMQU5fVEFHX1BSRVNFTlQsIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfUVVFVUU6CisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9RVUVVRToKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKIAkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkgIHF1ZXVlX21hcHBpbmcpICE9IDIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNi1FWkJSRF9kZWZjb25maWcKaW5kZXggMTc1OWZhZC4uZTY2YmEzMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCkBAIC01Myw3ICs1Myw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQogQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQpAQCAtNjMsNiArNjIsNyBAQAogQ09ORklHX01URF9QSFlTTUFQPXkKIENPTkZJR19NVERfTTI1UDgwPXkKIENPTkZJR19NVERfTkFORD1tCitDT05GSUdfTVREX1NQSV9OT1I9eQogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19TQ1NJPXkKICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVQtVjJfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lULVYyX2RlZmNvbmZpZwppbmRleCAzNTc3Mjk2Li4wMjA3YzU4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVQtVjJfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVC1WMl9kZWZjb25maWcKQEAgLTU4LDcgKzU4LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9bQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0pFREVDUFJPQkU9bQogQ09ORklHX01URF9SQU09eQpAQCAtNjYsNiArNjUsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKIENPTkZJR19NVERfTTI1UDgwPXkKIENPTkZJR19NVERfTkFORD1tCitDT05GSUdfTVREX1NQSV9OT1I9eQogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19TQ1NJPXkKICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZwppbmRleCAyZTczYTVkLi45OWMxMzFiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKQEAgLTU3LDcgKzU3LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9bQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0pFREVDUFJPQkU9bQogQ09ORklHX01URF9SQU09eQpAQCAtNjUsNiArNjQsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKIENPTkZJR19NVERfTTI1UDgwPXkKIENPTkZJR19NVERfTkFORD1tCitDT05GSUdfTVREX1NQSV9OT1I9eQogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19TQ1NJPXkKICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZwppbmRleCBmMGEyZGRmNS4uMzhjYjE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnCkBAIC02NCw3ICs2NCw2IEBACiBDT05GSUdfRldfTE9BREVSPW0KIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKQEAgLTc1LDYgKzc0LDcgQEAKIENPTkZJR19NVERfTkFORD15CiBDT05GSUdfTVREX05BTkRfQkY1WFg9eQogIyBDT05GSUdfTVREX05BTkRfQkY1WFhfSFdFQ0MgaXMgbm90IHNldAorQ09ORklHX01URF9TUElfTk9SPXkKIENPTkZJR19CTEtfREVWX1JBTT15CiAjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfU0Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNjA5LUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjYwOS1FWktJVF9kZWZjb25maWcKaW5kZXggNGNhMzlhYi4uYTdlOWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNjA5LUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY2MDktRVpLSVRfZGVmY29uZmlnCkBAIC01Nyw3ICs1Nyw2IEBACiBDT05GSUdfRldfTE9BREVSPW0KIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKQEAgLTY1LDYgKzY0LDcgQEAKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CiBDT05GSUdfTVREX1BIWVNNQVA9eQogQ09ORklHX01URF9NMjVQODA9eQorQ09ORklHX01URF9TUElfTk9SPXkKIENPTkZJR19NVERfVUJJPW0KIENPTkZJR19TQ1NJPXkKIENPTkZJR19CTEtfREVWX1NEPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZwppbmRleCAzODUzYzQ3Li5mNGE5MjAwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnCkBAIC00NSw3ICs0NSw2IEBACiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotQ09ORklHX01URF9DSEFSPW0KIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9bQogQ09ORklHX01URF9DRklfQU1EU1REPW0KQEAgLTUzLDcgKzUyLDcgQEAKIENPTkZJR19NVERfUk9NPW0KIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CiBDT05GSUdfTVREX00yNVA4MD15Ci0jIENPTkZJR19NMjVQWFhfVVNFX0ZBU1RfUkVBRCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1NQSV9OT1I9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9OQkQ9eQogQ09ORklHX0JMS19ERVZfUkFNPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCmluZGV4IGY3NTRlNDkuLjBmZjk3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwpAQCAtMzYsMTMgKzM2LDEyIEBACiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX1JBTT15CiBDT05GSUdfTVREX1JPTT15CiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogQ09ORklHX01URF9NMjVQODA9eQotIyBDT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQgaXMgbm90IHNldAorQ09ORklHX01URF9TUElfTk9SPXkKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19FRVBST01fQVQyNT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaAppbmRleCA4ZDFlNGMyLi40MGU5YzJiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKQEAgLTMxNiw2ICszMTYsOCBAQAogfQogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7CiAJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBETUFFTjsKIH0KIGludCBzZXRfZG1hX2NhbGxiYWNrKHVuc2lnbmVkIGludCBjaGFubmVsLCBpcnFfaGFuZGxlcl90IGNhbGxiYWNrLCB2b2lkICpkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCBkMDk4OTI5Li42ZjRiYWM5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX0lTUDEzNjJfSENEKQogI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxMzYyLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvc3Byb20uYyBiL2FyY2gvbWlwcy9iY200N3h4L3Nwcm9tLmMKaW5kZXggYThiNTQwOC4uZGE0Y2RiMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvc3Byb20uYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9zcHJvbS5jCkBAIC0xNjgsNiArMTY4LDcgQEAKIHN0YXRpYyB2b2lkIGJjbTQ3eHhfZmlsbF9zcHJvbV9yMTIzNDU4OShzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSwKIAkJCQkJY29uc3QgY2hhciAqcHJlZml4LCBib29sIGZhbGxiYWNrKQogeworCW52cmFtX3JlYWRfdTE2KHByZWZpeCwgTlVMTCwgImRldmlkIiwgJnNwcm9tLT5kZXZfaWQsIDAsIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImxlZGJoMCIsICZzcHJvbS0+Z3BpbzAsIDB4ZmYsIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImxlZGJoMSIsICZzcHJvbS0+Z3BpbzEsIDB4ZmYsIGZhbGxiYWNrKTsKIAludnJhbV9yZWFkX3U4KHByZWZpeCwgTlVMTCwgImxlZGJoMiIsICZzcHJvbS0+Z3BpbzIsIDB4ZmYsIGZhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKaW5kZXggMjFjOWYzMC4uNzkwMzUyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKQEAgLTIzNSwxMSArMjM1LDYgQEAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIE5pbnRlbmRvIEdhbWVDdWJlL1dpaQogCSAgY29uc29sZXMgdmlhIGFuIGV4dGVybmFsIFVTQiBHZWNrbyBhZGFwdGVyLgogCi1jb25maWcgUFBDX0VBUkxZX0RFQlVHX1dTUAotCWJvb2wgIkVhcmx5IGRlYnVnZ2luZyB2aWEgV1NQJ3MgaW50ZXJuYWwgVUFSVCIKLQlkZXBlbmRzIG9uIFBQQ19XU1AKLQlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKLQogY29uZmlnIFBQQ19FQVJMWV9ERUJVR19QUzNHRUxJQwogCWJvb2wgIkVhcmx5IGRlYnVnZ2luZyB0aHJvdWdoIHRoZSBQUzMgRXRoZXJuZXQgcG9ydCIKIAlkZXBlbmRzIG9uIFBQQ19QUzMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggNDI2ZGNlNy4uY2NjMjVlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTMzMyw4ICszMzMsOCBAQAogJChvYmopL3pJbWFnZS5pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKIAotJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKikKKyQoYWRkcHJlZml4ICQob2JqKS8sICQoc29ydCAkKGZpbHRlciB6SW1hZ2UuJSwgJChpbWFnZS15KSkpKTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJChzdWJzdCAkKG9iaikvekltYWdlLiwsJEApKQogCiAjIGR0YkltYWdlJSAtIGEgZHRiSW1hZ2UgaXMgYSB6SW1hZ2Ugd2l0aCBhbiBlbWJlZGRlZCBkZXZpY2UgdHJlZSBibG9iCiAkKG9iaikvZHRiSW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChvYmopLyUuZHRiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jaHJvbWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2hyb21hX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNWZjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jaHJvbWFfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLUNPTkZJR19QUEM2ND15Ci1DT05GSUdfUFBDX0JPT0szRV82ND15Ci0jIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HX05BVElWRSBpcyBub3Qgc2V0Ci1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTI1NgotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19UQVNLU1RBVFM9eQotQ09ORklHX1RBU0tfREVMQVlfQUNDVD15Ci1DT05GSUdfVEFTS19YQUNDVD15Ci1DT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKLUNPTkZJR19BVURJVD15Ci1DT05GSUdfQVVESVRTWVNDQUxMPXkKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xOQotQ09ORklHX0NHUk9VUFM9eQotQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQotQ09ORklHX0NQVVNFVFM9eQotQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKLUNPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15Ci1DT05GSUdfQ0dST1VQX01FTUNHPXkKLUNPTkZJR19DR1JPVVBfTUVNQ0dfU1dBUD15Ci1DT05GSUdfTkFNRVNQQUNFUz15Ci1DT05GSUdfUkVMQVk9eQotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfUkRfQlpJUDI9eQotQ09ORklHX1JEX0xaTUE9eQotQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9HWklQPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19QRVJGX0VWRU5UUz15Ci1DT05GSUdfUFJPRklMSU5HPXkKLUNPTkZJR19PUFJPRklMRT15Ci1DT05GSUdfS1BST0JFUz15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQotQ09ORklHX1NDT01fREVCVUdGUz15Ci1DT05GSUdfUFBDX0EyX0REMj15Ci1DT05GSUdfS1ZNX0dVRVNUPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19IWl8xMDA9eQotIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAotQ09ORklHX0JJTkZNVF9NSVNDPXkKLUNPTkZJR19OVU1BPXkKLSMgQ09ORklHX01JR1JBVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDXzY0S19QQUdFUz15Ci1DT05GSUdfU0NIRURfU01UPXkKLUNPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9IiIKLSMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAotQ09ORklHX1BDSUVQT1JUQlVTPXkKLSMgQ09ORklHX1BDSUVBU1BNIGlzIG5vdCBzZXQKLUNPTkZJR19QQ0lfTVNJPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk1fVVNFUj1tCi1DT05GSUdfWEZSTV9TVUJfUE9MSUNZPXkKLUNPTkZJR19YRlJNX1NUQVRJU1RJQ1M9eQotQ09ORklHX05FVF9LRVk9bQotQ09ORklHX05FVF9LRVlfTUlHUkFURT15Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLUNPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQotQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci1DT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19ORVRfSVBJUD15Ci1DT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLUNPTkZJR19JTkVUX0FIPW0KLUNPTkZJR19JTkVUX0VTUD1tCi1DT05GSUdfSU5FVF9JUENPTVA9bQotQ09ORklHX0lQVjY9eQotQ09ORklHX0lQVjZfUFJJVkFDWT15Ci1DT05GSUdfSVBWNl9ST1VURVJfUFJFRj15Ci1DT05GSUdfSVBWNl9ST1VURV9JTkZPPXkKLUNPTkZJR19JUFY2X09QVElNSVNUSUNfREFEPXkKLUNPTkZJR19JTkVUNl9BSD15Ci1DT05GSUdfSU5FVDZfRVNQPXkKLUNPTkZJR19JTkVUNl9JUENPTVA9eQotQ09ORklHX0lQVjZfTUlQNj15Ci1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OPXkKLUNPTkZJR19JUFY2X1RVTk5FTD15Ci1DT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQVjZfU1VCVFJFRVM9eQotQ09ORklHX0lQVjZfTVJPVVRFPXkKLUNPTkZJR19JUFY2X1BJTVNNX1YyPXkKLUNPTkZJR19ORVRGSUxURVI9eQotQ09ORklHX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQotQ09ORklHX05GX0NUX05FVExJTks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX1FVRVVFPW0KLUNPTkZJR19JUF9ORl9JUFRBQkxFUz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQotQ09ORklHX0lQX05GX01BVENIX0VDTj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KLUNPTkZJR19JUF9ORl9GSUxURVI9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQotQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQotQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KLUNPTkZJR19ORl9OQVQ9bQotQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9bQotQ09ORklHX05FVF9UQ1BQUk9CRT15Ci0jIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUXzlQPXkKLUNPTkZJR19ORVRfOVBfREVCVUc9eQotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19ERVZUTVBGUz15Ci1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKLUNPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUD15Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfU1RBQT15Ci1DT05GSUdfTVREX1BIWVNNQVBfT0Y9eQotQ09ORklHX1BST0NfREVWSUNFVFJFRT15Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9eQotQ09ORklHX0JMS19ERVZfTkJEPW0KLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT02NTUzNgotQ09ORklHX0NEUk9NX1BLVENEVkQ9eQotQ09ORklHX01JU0NfREVWSUNFUz15Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQkxLX0RFVl9TUj15Ci1DT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQotQ09ORklHX0NIUl9ERVZfU0c9eQotQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKLUNPTkZJR19TQ1NJX0NPTlNUQU5UUz15Ci1DT05GSUdfU0NTSV9TUElfQVRUUlM9eQotQ09ORklHX1NDU0lfRkNfQVRUUlM9eQotQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQotQ09ORklHX1NDU0lfU0FTX0FUVFJTPW0KLUNPTkZJR19TQ1NJX1NSUF9BVFRSUz15Ci1DT05GSUdfQVRBPXkKLUNPTkZJR19TQVRBX0FIQ0k9eQotQ09ORklHX1NBVEFfU0lMMjQ9eQotQ09ORklHX1NBVEFfTVY9eQotQ09ORklHX1NBVEFfU0lMPXkKLUNPTkZJR19QQVRBX0NNRDY0WD15Ci1DT05GSUdfUEFUQV9NQVJWRUxMPXkKLUNPTkZJR19QQVRBX1NJTDY4MD15Ci1DT05GSUdfTUQ9eQotQ09ORklHX0JMS19ERVZfTUQ9eQotQ09ORklHX01EX0xJTkVBUj15Ci1DT05GSUdfQkxLX0RFVl9ETT15Ci1DT05GSUdfRE1fQ1JZUFQ9eQotQ09ORklHX0RNX1NOQVBTSE9UPXkKLUNPTkZJR19ETV9NSVJST1I9eQotQ09ORklHX0RNX1pFUk89eQotQ09ORklHX0RNX1VFVkVOVD15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfVFVOPXkKLUNPTkZJR19FMTAwMEU9eQotQ09ORklHX1RJR09OMz15Ci0jIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTPXkKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfSFdfUkFORE9NPXkKLUNPTkZJR19SQVdfRFJJVkVSPXkKLUNPTkZJR19NQVhfUkFXX0RFVlM9MTAyNAotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfVkdBX0FSQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfRURBQz15Ci1DT05GSUdfRURBQ19NTV9FREFDPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19EUlZfRFMxNTExPXkKLUNPTkZJR19SVENfRFJWX0RTMTU1Mz15Ci1DT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfRVhUMl9GU19YQVRUUj15Ci1DT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQotQ09ORklHX0VYVDJfRlNfWElQPXkKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotQ09ORklHX0VYVDRfRlM9eQotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0Ci1DT05GSUdfRlVTRV9GUz15Ci1DT05GSUdfSVNPOTY2MF9GUz15Ci1DT05GSUdfSk9MSUVUPXkKLUNPTkZJR19aSVNPRlM9eQotQ09ORklHX1VERl9GUz1tCi1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPW0KLUNPTkZJR19DUkFNRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjNfQUNMPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU19WNF8xPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfQ0lGUz15Ci1DT05GSUdfQ0lGU19XRUFLX1BXX0hBU0g9eQotQ09ORklHX0NJRlNfWEFUVFI9eQotQ09ORklHX0NJRlNfUE9TSVg9eQotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotQ09ORklHX05MU19BU0NJST15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci1DT05GSUdfQ1JDX0NDSVRUPW0KLUNPTkZJR19DUkNfVDEwRElGPXkKLUNPTkZJR19MSUJDUkMzMkM9bQotQ09ORklHX1BSSU5US19USU1FPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfU1RSSVBfQVNNX1NZTVM9eQotQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQotIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0lORk89eQotQ09ORklHX0ZUUkFDRV9TWVNDQUxMUz15Ci1DT05GSUdfUFBDX0VNVUxBVEVEX1NUQVRTPXkKLUNPTkZJR19YTU9OPXkKLUNPTkZJR19YTU9OX0RFRkFVTFQ9eQotQ09ORklHX0lSUV9ET01BSU5fREVCVUc9eQotQ09ORklHX1BQQ19FQVJMWV9ERUJVRz15Ci1DT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQotQ09ORklHX0NSWVBUT19OVUxMPW0KLUNPTkZJR19DUllQVE9fVEVTVD1tCi1DT05GSUdfQ1JZUFRPX0NDTT1tCi1DT05GSUdfQ1JZUFRPX0dDTT1tCi1DT05GSUdfQ1JZUFRPX1BDQkM9bQotQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCi1DT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCi1DT05GSUdfQ1JZUFRPX1NIQTUxMj1tCi1DT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCi1DT05GSUdfQ1JZUFRPX1dQNTEyPW0KLUNPTkZJR19DUllQVE9fQUVTPW0KLUNPTkZJR19DUllQVE9fQU5VQklTPW0KLUNPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQotQ09ORklHX0NSWVBUT19DQVNUNT1tCi1DT05GSUdfQ1JZUFRPX0NBU1Q2PW0KLUNPTkZJR19DUllQVE9fS0hBWkFEPW0KLUNPTkZJR19DUllQVE9fU0FMU0EyMD1tCi1DT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQotQ09ORklHX0NSWVBUT19URUE9bQotQ09ORklHX0NSWVBUT19UV09GSVNIPW0KLUNPTkZJR19DUllQVE9fTFpPPW0KLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKLUNPTkZJR19WSVJUVUFMSVpBVElPTj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwbTIuaAppbmRleCBmNDJlOWJhLi43Yzg2MDhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcG0yLmgKQEAgLTQ4OSw3ICs0ODksNiBAQAogI2RlZmluZSBGQ0NfR0ZNUl9UQ0kJCSgodWludCkweDIwMDAwMDAwKQogI2RlZmluZSBGQ0NfR0ZNUl9UUlgJCSgodWludCkweDEwMDAwMDAwKQogI2RlZmluZSBGQ0NfR0ZNUl9UVFgJCSgodWludCkweDA4MDAwMDAwKQotI2RlZmluZSBGQ0NfR0ZNUl9UVFgJCSgodWludCkweDA4MDAwMDAwKQogI2RlZmluZSBGQ0NfR0ZNUl9DRFAJCSgodWludCkweDA0MDAwMDAwKQogI2RlZmluZSBGQ0NfR0ZNUl9DVFNQCQkoKHVpbnQpMHgwMjAwMDAwMCkKICNkZWZpbmUgRkNDX0dGTVJfQ0RTCQkoKHVpbnQpMHgwMTAwMDAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lZWguaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lZWguaAppbmRleCBiNzZmNThjLi5mYWI3NzQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWVoLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VlaC5oCkBAIC0yNTQsNiArMjU0LDcgQEAKIHZvaWQgKmVlaF9wZV9kZXZfdHJhdmVyc2Uoc3RydWN0IGVlaF9wZSAqcm9vdCwKIAkJZWVoX3RyYXZlcnNlX2Z1bmMgZm4sIHZvaWQgKmZsYWcpOwogdm9pZCBlZWhfcGVfcmVzdG9yZV9iYXJzKHN0cnVjdCBlZWhfcGUgKnBlKTsKK2NvbnN0IGNoYXIgKmVlaF9wZV9sb2NfZ2V0KHN0cnVjdCBlZWhfcGUgKnBlKTsKIHN0cnVjdCBwY2lfYnVzICplZWhfcGVfYnVzX2dldChzdHJ1Y3QgZWVoX3BlICpwZSk7CiAKIHZvaWQgKmVlaF9kZXZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCB2b2lkICpkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lZWhfZXZlbnQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lZWhfZXZlbnQuaAppbmRleCA4OWQ1NjcwLi4xZTU1MWEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWVoX2V2ZW50LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VlaF9ldmVudC5oCkBAIC0zMyw3ICszMyw3IEBACiAKIGludCBlZWhfZXZlbnRfaW5pdCh2b2lkKTsKIGludCBlZWhfc2VuZF9mYWlsdXJlX2V2ZW50KHN0cnVjdCBlZWhfcGUgKnBlKTsKLXZvaWQgZWVoX3JlbW92ZV9ldmVudChzdHJ1Y3QgZWVoX3BlICpwZSk7Cit2b2lkIGVlaF9yZW1vdmVfZXZlbnQoc3RydWN0IGVlaF9wZSAqcGUsIGJvb2wgZm9yY2UpOwogdm9pZCBlZWhfaGFuZGxlX2V2ZW50KHN0cnVjdCBlZWhfcGUgKnBlKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCmluZGV4IDkwMWRhYzYuLmQwOTE4ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaApAQCAtMjIzLDEwICsyMjMsNiBAQAogCXVuc2lnbmVkIGludAlpZDsKIAl1bnNpZ25lZCBpbnQJYWN0aXZlOwogCXVuc2lnbmVkIGxvbmcJdmRzb19iYXNlOwotI2lmZGVmIENPTkZJR19QUENfSUNTV1gKLQlzdHJ1Y3Qgc3BpbmxvY2sgKmNvcF9sb2NrcDsJLyogZ3VhcmQgY29wIHJlbGF0ZWQgc3R1ZmYgKi8KLQl1bnNpZ25lZCBsb25nIGFjb3A7CQkvKiBtYXNrIG9mIGVuYWJsZWQgY29wcm9jZXNzb3IgdHlwZXMgKi8KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lDU1dYICovCiAjaWZkZWYgQ09ORklHX1BQQ19NTV9TTElDRVMKIAl1NjQgbG93X3NsaWNlc19wc2l6ZTsgICAvKiBTTEIgcGFnZSBzaXplIGVuY29kaW5ncyAqLwogCXU2NCBoaWdoX3NsaWNlc19wc2l6ZTsgIC8qIDQgYml0cyBwZXIgc2xpY2UgZm9yIG5vdyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKaW5kZXggY2IxNWNiYi4uNDYwMDE4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCkBAIC01OTksOSArNTk5LDkgQEAKIH07CiAKIHN0cnVjdCBPcGFsSW9QaGJFcnJvckNvbW1vbiB7Ci0JdWludDMyX3QgdmVyc2lvbjsKLQl1aW50MzJfdCBpb1R5cGU7Ci0JdWludDMyX3QgbGVuOworCV9fYmUzMiB2ZXJzaW9uOworCV9fYmUzMiBpb1R5cGU7CisJX19iZTMyIGxlbjsKIH07CiAKIHN0cnVjdCBPcGFsSW9QN0lPQ1BoYkVycm9yRGF0YSB7CkBAIC02NjYsNjQgKzY2Niw2NCBAQAogc3RydWN0IE9wYWxJb1BoYjNFcnJvckRhdGEgewogCXN0cnVjdCBPcGFsSW9QaGJFcnJvckNvbW1vbiBjb21tb247CiAKLQl1aW50MzJfdCBicmRnQ3RsOworCV9fYmUzMiBicmRnQ3RsOwogCiAJLyogUEhCMyBVVEwgcmVncyAqLwotCXVpbnQzMl90IHBvcnRTdGF0dXNSZWc7Ci0JdWludDMyX3Qgcm9vdENtcGx4U3RhdHVzOwotCXVpbnQzMl90IGJ1c0FnZW50U3RhdHVzOworCV9fYmUzMiBwb3J0U3RhdHVzUmVnOworCV9fYmUzMiByb290Q21wbHhTdGF0dXM7CisJX19iZTMyIGJ1c0FnZW50U3RhdHVzOwogCiAJLyogUEhCMyBjZmcgcmVncyAqLwotCXVpbnQzMl90IGRldmljZVN0YXR1czsKLQl1aW50MzJfdCBzbG90U3RhdHVzOwotCXVpbnQzMl90IGxpbmtTdGF0dXM7Ci0JdWludDMyX3QgZGV2Q21kU3RhdHVzOwotCXVpbnQzMl90IGRldlNlY1N0YXR1czsKKwlfX2JlMzIgZGV2aWNlU3RhdHVzOworCV9fYmUzMiBzbG90U3RhdHVzOworCV9fYmUzMiBsaW5rU3RhdHVzOworCV9fYmUzMiBkZXZDbWRTdGF0dXM7CisJX19iZTMyIGRldlNlY1N0YXR1czsKIAogCS8qIGNmZyBBRVIgcmVncyAqLwotCXVpbnQzMl90IHJvb3RFcnJvclN0YXR1czsKLQl1aW50MzJfdCB1bmNvcnJFcnJvclN0YXR1czsKLQl1aW50MzJfdCBjb3JyRXJyb3JTdGF0dXM7Ci0JdWludDMyX3QgdGxwSGRyMTsKLQl1aW50MzJfdCB0bHBIZHIyOwotCXVpbnQzMl90IHRscEhkcjM7Ci0JdWludDMyX3QgdGxwSGRyNDsKLQl1aW50MzJfdCBzb3VyY2VJZDsKKwlfX2JlMzIgcm9vdEVycm9yU3RhdHVzOworCV9fYmUzMiB1bmNvcnJFcnJvclN0YXR1czsKKwlfX2JlMzIgY29yckVycm9yU3RhdHVzOworCV9fYmUzMiB0bHBIZHIxOworCV9fYmUzMiB0bHBIZHIyOworCV9fYmUzMiB0bHBIZHIzOworCV9fYmUzMiB0bHBIZHI0OworCV9fYmUzMiBzb3VyY2VJZDsKIAotCXVpbnQzMl90IHJzdjM7CisJX19iZTMyIHJzdjM7CiAKIAkvKiBSZWNvcmQgZGF0YSBhYm91dCB0aGUgY2FsbCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciAqLwotCXVpbnQ2NF90IGVycm9yQ2xhc3M7Ci0JdWludDY0X3QgY29ycmVsYXRvcjsKKwlfX2JlNjQgZXJyb3JDbGFzczsKKwlfX2JlNjQgY29ycmVsYXRvcjsKIAotCXVpbnQ2NF90IG5GaXI7CQkJLyogMDAwICovCi0JdWludDY0X3QgbkZpck1hc2s7CQkvKiAwMDMgKi8KLQl1aW50NjRfdCBuRmlyV09GOwkJLyogMDA4ICovCisJX19iZTY0IG5GaXI7CQkJLyogMDAwICovCisJX19iZTY0IG5GaXJNYXNrOwkJLyogMDAzICovCisJX19iZTY0IG5GaXJXT0Y7CQkvKiAwMDggKi8KIAogCS8qIFBIQjMgTU1JTyBFcnJvciBSZWdzICovCi0JdWludDY0X3QgcGhiUGxzc3I7CQkvKiAxMjAgKi8KLQl1aW50NjRfdCBwaGJDc3I7CQkvKiAxMTAgKi8KLQl1aW50NjRfdCBsZW1GaXI7CQkvKiBDMDAgKi8KLQl1aW50NjRfdCBsZW1FcnJvck1hc2s7CQkvKiBDMTggKi8KLQl1aW50NjRfdCBsZW1XT0Y7CQkvKiBDNDAgKi8KLQl1aW50NjRfdCBwaGJFcnJvclN0YXR1czsJLyogQzgwICovCi0JdWludDY0X3QgcGhiRmlyc3RFcnJvclN0YXR1czsJLyogQzg4ICovCi0JdWludDY0X3QgcGhiRXJyb3JMb2cwOwkJLyogQ0MwICovCi0JdWludDY0X3QgcGhiRXJyb3JMb2cxOwkJLyogQ0M4ICovCi0JdWludDY0X3QgbW1pb0Vycm9yU3RhdHVzOwkvKiBEMDAgKi8KLQl1aW50NjRfdCBtbWlvRmlyc3RFcnJvclN0YXR1czsJLyogRDA4ICovCi0JdWludDY0X3QgbW1pb0Vycm9yTG9nMDsJCS8qIEQ0MCAqLwotCXVpbnQ2NF90IG1taW9FcnJvckxvZzE7CQkvKiBENDggKi8KLQl1aW50NjRfdCBkbWEwRXJyb3JTdGF0dXM7CS8qIEQ4MCAqLwotCXVpbnQ2NF90IGRtYTBGaXJzdEVycm9yU3RhdHVzOwkvKiBEODggKi8KLQl1aW50NjRfdCBkbWEwRXJyb3JMb2cwOwkJLyogREMwICovCi0JdWludDY0X3QgZG1hMEVycm9yTG9nMTsJCS8qIERDOCAqLwotCXVpbnQ2NF90IGRtYTFFcnJvclN0YXR1czsJLyogRTAwICovCi0JdWludDY0X3QgZG1hMUZpcnN0RXJyb3JTdGF0dXM7CS8qIEUwOCAqLwotCXVpbnQ2NF90IGRtYTFFcnJvckxvZzA7CQkvKiBFNDAgKi8KLQl1aW50NjRfdCBkbWExRXJyb3JMb2cxOwkJLyogRTQ4ICovCi0JdWludDY0X3QgcGVzdEFbT1BBTF9QSEIzX05VTV9QRVNUX1JFR1NdOwotCXVpbnQ2NF90IHBlc3RCW09QQUxfUEhCM19OVU1fUEVTVF9SRUdTXTsKKwlfX2JlNjQgcGhiUGxzc3I7CQkvKiAxMjAgKi8KKwlfX2JlNjQgcGhiQ3NyOwkJLyogMTEwICovCisJX19iZTY0IGxlbUZpcjsJCS8qIEMwMCAqLworCV9fYmU2NCBsZW1FcnJvck1hc2s7CQkvKiBDMTggKi8KKwlfX2JlNjQgbGVtV09GOwkJLyogQzQwICovCisJX19iZTY0IHBoYkVycm9yU3RhdHVzOwkvKiBDODAgKi8KKwlfX2JlNjQgcGhiRmlyc3RFcnJvclN0YXR1czsJLyogQzg4ICovCisJX19iZTY0IHBoYkVycm9yTG9nMDsJCS8qIENDMCAqLworCV9fYmU2NCBwaGJFcnJvckxvZzE7CQkvKiBDQzggKi8KKwlfX2JlNjQgbW1pb0Vycm9yU3RhdHVzOwkvKiBEMDAgKi8KKwlfX2JlNjQgbW1pb0ZpcnN0RXJyb3JTdGF0dXM7CS8qIEQwOCAqLworCV9fYmU2NCBtbWlvRXJyb3JMb2cwOwkJLyogRDQwICovCisJX19iZTY0IG1taW9FcnJvckxvZzE7CQkvKiBENDggKi8KKwlfX2JlNjQgZG1hMEVycm9yU3RhdHVzOwkvKiBEODAgKi8KKwlfX2JlNjQgZG1hMEZpcnN0RXJyb3JTdGF0dXM7CS8qIEQ4OCAqLworCV9fYmU2NCBkbWEwRXJyb3JMb2cwOwkJLyogREMwICovCisJX19iZTY0IGRtYTBFcnJvckxvZzE7CQkvKiBEQzggKi8KKwlfX2JlNjQgZG1hMUVycm9yU3RhdHVzOwkvKiBFMDAgKi8KKwlfX2JlNjQgZG1hMUZpcnN0RXJyb3JTdGF0dXM7CS8qIEUwOCAqLworCV9fYmU2NCBkbWExRXJyb3JMb2cwOwkJLyogRTQwICovCisJX19iZTY0IGRtYTFFcnJvckxvZzE7CQkvKiBFNDggKi8KKwlfX2JlNjQgcGVzdEFbT1BBTF9QSEIzX05VTV9QRVNUX1JFR1NdOworCV9fYmU2NCBwZXN0QltPUEFMX1BIQjNfTlVNX1BFU1RfUkVHU107CiB9OwogCiBlbnVtIHsKQEAgLTg1MSw4ICs4NTEsOCBAQAogaW50NjRfdCBvcGFsX3NldF9zbG90X2xlZF9zdGF0dXModWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBzbG90X2lkLCB1aW50OF90IGxlZF90eXBlLCB1aW50OF90IGxlZF9hY3Rpb24pOwogaW50NjRfdCBvcGFsX2dldF9lcG93X3N0YXR1cyhfX2JlNjQgKnN0YXR1cyk7CiBpbnQ2NF90IG9wYWxfc2V0X3N5c3RlbV9hdHRlbnRpb25fbGVkKHVpbnQ4X3QgbGVkX2FjdGlvbik7Ci1pbnQ2NF90IG9wYWxfcGNpX25leHRfZXJyb3IodWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCAqZmlyc3RfZnJvemVuX3BlLAotCQkJICAgIHVpbnQxNl90ICpwY2lfZXJyb3JfdHlwZSwgdWludDE2X3QgKnNldmVyaXR5KTsKK2ludDY0X3Qgb3BhbF9wY2lfbmV4dF9lcnJvcih1aW50NjRfdCBwaGJfaWQsIF9fYmU2NCAqZmlyc3RfZnJvemVuX3BlLAorCQkJICAgIF9fYmUxNiAqcGNpX2Vycm9yX3R5cGUsIF9fYmUxNiAqc2V2ZXJpdHkpOwogaW50NjRfdCBvcGFsX3BjaV9wb2xsKHVpbnQ2NF90IHBoYl9pZCk7CiBpbnQ2NF90IG9wYWxfcmV0dXJuX2NwdSh2b2lkKTsKIGludDY0X3Qgb3BhbF9yZWluaXRfY3B1cyh1aW50NjRfdCBmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2EyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2EyLmgKaW5kZXggM2Q1MmExMS4uM2JhOWM2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19hMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYTIuaApAQCAtMTEwLDE1ICsxMTAsNiBAQAogI2RlZmluZSBUTEIxX1VSCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMikKICNkZWZpbmUgVExCMV9TUgkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCiAKLSNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1dTUAotI2RlZmluZSBXU1BfVUFSVF9QSFlTCTB4ZmZjMDAwYzAwMAotLyogVGhpcyBuZWVkcyB0byBiZSBjYXJlZnVsIGNob3NlbiB0byBoaXQgYSAhMCBjb25ncnVlbmNlIGNsYXNzCi0gKiBpbiB0aGUgVExCIHNpbmNlIHdlIGJvbHQgaXQgaW4gd2F5IDMsIHdoaWNoIGlzIGFscmVhZHkgb2NjdXBpZWQKLSAqIGJ5IG91ciBsaW5lYXIgbWFwcGluZyBwcmltYXJ5IGJvbHRlZCBlbnRyeSBpbiBDQyAwLgotICovCi0jZGVmaW5lIFdTUF9VQVJUX1ZJUlQJMHhmMDAwMDAwMDAwMDAxMDAwCi0jZW5kaWYKLQogLyogQTIgZXJhdGl2YXggYXR0cmlidXRlcyBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBFUkFUSVZBWF9SU19JU19BTEwJCTB4MDAwCiAjZGVmaW5lIEVSQVRJVkFYX1JTX0lTX1RJRAkJMHgwNDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAppbmRleCAwZTgzZTdkLi41OGFiZWRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCkBAIC0xNiwxMyArMTYsMTUgQEAKIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9zd2l0Y2goc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYsCiAJCQkJICAgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQpOwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV90YXIoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9lYXJseV9zcHJzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2KQogewogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwN1MpKQogCQlwcmV2LT50YXIgPSBtZnNwcihTUFJOX1RBUik7CisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0RTQ1IpKQorCQlwcmV2LT5kc2NyID0gbWZzcHIoU1BSTl9EU0NSKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV90YXIoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9lYXJseV9zcHJzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2KSB7fQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGVuYWJsZV9rZXJuZWxfZnAodm9pZCk7CkBAIC04NCw2ICs4Niw4IEBACiB7CiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKICAgICAvKiBFQkIgcGVyZiBldmVudHMgYXJlIG5vdCBpbmhlcml0ZWQsIHNvIGNsZWFyIGFsbCBFQkIgc3RhdGUuICovCisgICAgdC0+dGhyZWFkLmViYnJyID0gMDsKKyAgICB0LT50aHJlYWQuZWJiaHIgPSAwOwogICAgIHQtPnRocmVhZC5iZXNjciA9IDA7CiAgICAgdC0+dGhyZWFkLm1tY3IyID0gMDsKICAgICB0LT50aHJlYWQubW1jcjAgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3dzcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3dzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RjODMwLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS93c3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMTEgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpZm5kZWYgX19BU01fUE9XRVJQQ19XU1BfSAotI2RlZmluZSBfX0FTTV9QT1dFUlBDX1dTUF9ICi0KLWV4dGVybiBpbnQgd3NwX2dldF9jaGlwX2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwotCi0jZW5kaWYgLyogX19BU01fUE9XRVJQQ19XU1BfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vY3B1dGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL2NwdXRhYmxlLmgKaW5kZXggNWI3NjU3OS4uZGUyYzBlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vY3B1dGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS9jcHV0YWJsZS5oCkBAIC00MSw1ICs0MSw2IEBACiAjZGVmaW5lIFBQQ19GRUFUVVJFMl9FQkIJCTB4MTAwMDAwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkUyX0lTRUwJCTB4MDgwMDAwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkUyX1RBUgkJMHgwNDAwMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRTJfVkVDX0NSWVBUTwkJMHgwMjAwMDAwMAogCiAjZW5kaWYgLyogX1VBUElfX0FTTV9QT1dFUlBDX0NQVVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IGZhYjE5ZWMuLjY3MGMzMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtNDMsNyArNDMsNiBAQAogb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IG1jZS5vIG1jZV9wb3dlci5vCiBvYmo2NC0kKENPTkZJR19SRUxPQ0FUQUJMRSkJKz0gcmVsb2NfNjQubwogb2JqLSQoQ09ORklHX1BQQ19CT09LM0VfNjQpCSs9IGV4Y2VwdGlvbnMtNjRlLm8gaWRsZV9ib29rM2Uubwotb2JqLSQoQ09ORklHX1BQQ19BMikJCSs9IGNwdV9zZXR1cF9hMi5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSB2ZHNvNjQvCiBvYmotJChDT05GSUdfQUxUSVZFQykJCSs9IHZlY2VtdS5vCiBvYmotJChDT05GSUdfUFBDXzk3MF9OQVApCSs9IGlkbGVfcG93ZXI0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX2EyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9hMi5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWYwNzllLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX2EyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqICBBMiBzcGVjaWZpYyBhc3NlbWJseSBzdXBwb3J0IGNvZGUKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDkgQmVuIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9wcGMtb3Bjb2RlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9yZWdfYTIuaD4KLSNpbmNsdWRlIDxhc20vcmVnLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0KLS8qCi0gKiBEaXNhYmxlIHRoZGlkIGFuZCBjbGFzcyBmaWVsZHMgaW4gRVJBVHMgdG8gYnVtcCBQSUQgdG8gZnVsbCAxNCBiaXRzIGNhcGFjaXR5LgotICogVGhpcyBhbHNvIHByZXZlbnRzIGV4dGVybmFsIExQSUQgYWNjZXNzZXMgYnV0IHRoYXQgaXNuJ3QgYSBwcm9ibGVtIHdoZW4gbm90IGEKLSAqIGd1ZXN0LiBVbmRlciBQViwgdGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBhbmQgTU1VQ1Igd2lsbCByZXR1cm4gdGhlIHJpZ2h0Ci0gKiBudW1iZXIgb2YgUElEIGJpdHMgd2UgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBNTVVDUjFfRVhURU5EX1BJRCBcCi0JKE1NVUNSMV9JQ1RJRCB8IE1NVUNSMV9JVFRJRCB8IE1NVUNSMV9EQ1RJRCB8IFwKLQkgTU1VQ1IxX0RUVElEIHwgTU1VQ1IxX0RDQ0QpCi0KLS8qCi0gKiBVc2UgZXh0ZW5kZWQgUElEcyBpZiBlbmFibGVkLgotICogRG9uJ3QgY2xlYXIgdGhlIEVSQVRzIG9uIGNvbnRleHQgc3luYyBldmVudHMgYW5kIGVuYWJsZSBJICYgRCBMUlUuCi0gKiBFbmFibGUgRVJBVCBiYWNrIGludmFsaWRhdGUgd2hlbiB0bGJ3ZSBvdmVyd3JpdGVzIGFuIGVudHJ5LgotICovCi0jZGVmaW5lIElOSVRJQUxfTU1VQ1IxIFwKLQkoTU1VQ1IxX0VYVEVORF9QSUQgfCBNTVVDUjFfQ1NJTlZfTkVWRVIgfCBNTVVDUjFfSVJSRSB8IFwKLQkgTU1VQ1IxX0RSUkUgfCBNTVVDUjFfVExCV0VfQklOVikKLQotX0dMT0JBTChfX3NldHVwX2NwdV9hMikKLQkvKiBTb21lIG9mIHRoZXNlIGFyZSBhY3R1YWxseSB0aHJlYWQgbG9jYWwgYW5kIHNvbWUgYXJlCi0JICogY29yZSBsb2NhbCBidXQgZG9pbmcgaXQgYWx3YXlzIHdvbid0IGh1cnQKLQkgKi8KLQotI2lmZGVmIENPTkZJR19QUENfSUNTV1gKLQkvKiBNYWtlIHN1cmUgQUNPUCBzdGFydHMgb3V0IGFzIHplcm8gKi8KLQlsaQlyMywwCi0JbXRzcHIgICBTUFJOX0FDT1AscjMKLQotCS8qIFNraXAgdGhlIGZvbGxvd2luZyBpZiB3ZSBhcmUgaW4gR3Vlc3QgbW9kZSAqLwotCW1mbXNyCXIzCi0JYW5kaXMuCXIwLHIzLE1TUl9HU0BoCi0JYm5lCV9pY3N3eF9za2lwX2d1ZXN0Ci0KLQkvKiBFbmFibGUgaWNzd3ggaW5zdHJ1Y3Rpb24gKi8KLQltZnNwciAgIHIzLFNQUk5fQTJfQ0NSMgotCW9yaSAgICAgcjMscjMsQTJfQ0NSMl9FTkFCTEVfSUNTV1gKLQltdHNwciAgIFNQUk5fQTJfQ0NSMixyMwotCi0JLyogVW5tYXNrIGFsbCBDVHMgaW4gSEFDT1AgKi8KLQlsaSAgICAgIHIzLC0xCi0JbXRzcHIgICBTUFJOX0hBQ09QLHIzCi1faWNzd3hfc2tpcF9ndWVzdDoKLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lDU1dYICovCi0KLQkvKiBFbmFibGUgZG9vcmJlbGwgKi8KLQltZnNwciAgIHIzLFNQUk5fQTJfQ0NSMgotCW9yaXMgICAgIHIzLHIzLEEyX0NDUjJfRU5BQkxFX1BDQGgKLQltdHNwciAgIFNQUk5fQTJfQ0NSMixyMwotCWlzeW5jCi0KLQkvKiBTZXR1cCBDQ1IwIHRvIGRpc2FibGUgcG93ZXIgc2F2aW5nIGZvciBub3cgYXMgaXQncyBidXN0ZWQKLQkgKiBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMuIFNldHVwIENDUjEgdG8gd2FrZSBvbgotCSAqIGludGVycnVwdHMgbm9ybWFsbHkgKHdlIHdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGJ1dCB3aG8KLQkgKiBrbm93cyB3aGF0IEZXIG1heSBoYXZlIGNsb2JiZXJlZC4uLikKLQkgKi8KLQlsaQlyMywwCi0JbXRzcHIJU1BSTl9BMl9DQ1IwLCByMwotCUxPQURfUkVHX0lNTUVESUFURShyMywweDBmMGYwZjBmKQotCW10c3ByCVNQUk5fQTJfQ0NSMSwgcjMKLQotCS8qIEluaXRpYWxpc2UgTU1VQ1IxICovCi0JbGlzCXIzLElOSVRJQUxfTU1VQ1IxQGgKLQlvcmkJcjMscjMsSU5JVElBTF9NTVVDUjFAbAotCW10c3ByCVNQUk5fTU1VQ1IxLHIzCi0KLQkvKiBTZXQgTU1VQ1IyIHRvIGVuYWJsZSA0SywgNjRLLCAxTSwgMTZNIGFuZCAxRyBwYWdlcyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyMywgMHgwMDBhNzUzMSkKLQltdHNwcglTUFJOX01NVUNSMixyMwotCi0JLyogU2V0IE1NVUNSMyB0byB3cml0ZSBhbGwgdGhpZHMgYml0IHRvIHRoZSBUTEIgKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjMsIDB4MDAwMDAwMGYpCi0JbXRzcHIJU1BSTl9NTVVDUjMscjMKLQotCS8qIERvbid0IGRvIEVSQVQgc3R1ZmYgaWYgcnVubmluZyBndWVzdCBtb2RlICovCi0JbWZtc3IJcjMKLQlhbmRpcy4JcjAscjMsTVNSX0dTQGgKLQlibmUJMWYKLQotCS8qIE5vdyBzZXQgdGhlIEktRVJBVCB3YXRlcm1hcmsgdG8gMTUgKi8KLQlsaXMJcjQsKE1NVUNSMF9UTEJTRUxfSXxNTVVDUjBfRUNMKUBoCi0JbXRzcHIJU1BSTl9NTVVDUjAsIHI0Ci0JbGkJcjQsQTJfSUVSQVRfU0laRS0xCi0JUFBDX0VSQVRXRShSNCxSNCwzKQotCi0JLyogTm93IHNldCB0aGUgRC1FUkFUIHdhdGVybWFyayB0byAzMSAqLwotCWxpcwlyNCwoTU1VQ1IwX1RMQlNFTF9EfE1NVUNSMF9FQ0wpQGgKLQltdHNwcglTUFJOX01NVUNSMCwgcjQKLQlsaQlyNCxBMl9ERVJBVF9TSVpFLTEKLQlQUENfRVJBVFdFKFI0LFI0LDMpCi0KLQkvKiBBbmQgaW52YWxpZGF0ZSB0aGUgYmVhc3QganVzdCBpbiBjYXNlLiBUaGF0IHdvbid0IGdldCByaWQgb2YKLQkgKiBhIGJvbHRlZCBlbnRyeSB0aG91Z2ggaXQgd2lsbCBiZSBpbiBMUlUgYW5kIHNvIHdpbGwgZ28gYXdheSBldmVudHVhbGx5Ci0JICogYnV0IGxldCdzIG5vdCBib3RoZXIgZm9yIG5vdwotCSAqLwotCVBQQ19FUkFUSUxYKDAsMCxSMCkKLTE6Ci0JYmxyCi0KLV9HTE9CQUwoX19yZXN0b3JlX2NwdV9hMikKLQliCV9fc2V0dXBfY3B1X2EyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlci5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXIuUwppbmRleCAxNTU3ZTdjLi40NjczMzUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyLlMKQEAgLTU2LDYgKzU2LDcgQEAKIAlsaQlyMCwwCiAJbXRzcHIJU1BSTl9MUElELHIwCiAJbWZzcHIJcjMsU1BSTl9MUENSCisJb3JpCXIzLCByMywgTFBDUl9QRUNFREgKIAlibAlfX2luaXRfTFBDUgogCWJsCV9faW5pdF9IRlNDUgogCWJsCV9faW5pdF90bGJfcG93ZXI4CkBAIC03NCw2ICs3NSw3IEBACiAJbGkJcjAsMAogCW10c3ByCVNQUk5fTFBJRCxyMAogCW1mc3ByICAgcjMsU1BSTl9MUENSCisJb3JpCXIzLCByMywgTFBDUl9QRUNFREgKIAlibAlfX2luaXRfTFBDUgogCWJsCV9faW5pdF9IRlNDUgogCWJsCV9faW5pdF90bGJfcG93ZXI4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggYzFmYWFkZS4uOTY1MjkxYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMTA5LDcgKzEwOSw4IEBACiAJCQkJIFBQQ19GRUFUVVJFX1BTRVJJRVNfUEVSRk1PTl9DT01QQVQpCiAjZGVmaW5lIENPTU1PTl9VU0VSMl9QT1dFUjgJKFBQQ19GRUFUVVJFMl9BUkNIXzJfMDcgfCBcCiAJCQkJIFBQQ19GRUFUVVJFMl9IVE1fQ09NUCB8IFBQQ19GRUFUVVJFMl9EU0NSIHwgXAotCQkJCSBQUENfRkVBVFVSRTJfSVNFTCB8IFBQQ19GRUFUVVJFMl9UQVIpCisJCQkJIFBQQ19GRUFUVVJFMl9JU0VMIHwgUFBDX0ZFQVRVUkUyX1RBUiB8IFwKKwkJCQkgUFBDX0ZFQVRVUkUyX1ZFQ19DUllQVE8pCiAjZGVmaW5lIENPTU1PTl9VU0VSX1BBNlQJKENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfUEE2VCB8XAogCQkJCSBQUENfRkVBVFVSRV9UUlVFX0xFIHwgXAogCQkJCSBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QKQpAQCAtMjE0OCw0NCArMjE0OSw2IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogI2VuZGlmIC8qIENPTkZJR19FNTAwICovCi0KLSNpZmRlZiBDT05GSUdfUFBDX0EyCi0JewkvKiBTdGFuZGFyZCBBMiAoPj0gREQyKSArIEZQVSBjb3JlICovCi0JCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAotCQkucHZyX3ZhbHVlCQk9IDB4MDA0ODAwMDAsCi0JCS5jcHVfbmFtZQkJPSAiQTIgKD49IEREMikiLAotCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0EyLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKLQkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSU19BMiwKLQkJLmljYWNoZV9ic2l6ZQkJPSA2NCwKLQkJLmRjYWNoZV9ic2l6ZQkJPSA2NCwKLQkJLm51bV9wbWNzCQk9IDAsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfYTIsCi0JCS5jcHVfcmVzdG9yZQkJPSBfX3Jlc3RvcmVfY3B1X2EyLAotCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCi0JCS5wbGF0Zm9ybQkJPSAicHBjYTIiLAotCX0sCi0JewkvKiBUaGlzIGlzIGEgZGVmYXVsdCBlbnRyeSB0byBnZXQgZ29pbmcsIHRvIGJlIHJlcGxhY2VkIGJ5Ci0JCSAqIGEgcmVhbCBvbmUgYXQgc29tZSBzdGFnZQotCQkgKi8KLSNkZWZpbmUgQ1BVX0ZUUlNfQkFTRV9CT09LM0UJKENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1NNVCB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04gfCBDUFVfRlRSX05PRVhFQ1VURSkKLQkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCi0JCS5wdnJfdmFsdWUJCT0gMHgwMDAwMDAwMCwKLQkJLmNwdV9uYW1lCQk9ICJCb29rM0UiLAotCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0JBU0VfQk9PSzNFLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKLQkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX1RZUEVfM0UgfCBNTVVfRlRSX1VTRV9UTEJJTFggfAotCQkJCQkgIE1NVV9GVFJfVVNFX1RMQklWQVhfQkNBU1QgfAotCQkJCQkgIE1NVV9GVFJfTE9DS19CQ0FTVF9JTlZBTCwKLQkJLmljYWNoZV9ic2l6ZQkJPSA2NCwKLQkJLmRjYWNoZV9ic2l6ZQkJPSA2NCwKLQkJLm51bV9wbWNzCQk9IDAsCi0JCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKLQkJLnBsYXRmb3JtCQk9ICJwb3dlcjYiLAotCX0sCi0jZW5kaWYgLyogQ09ORklHX1BQQ19BMiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVfc3BlYyB0aGVfY3B1X3NwZWM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWguYwppbmRleCA3MDUxZWEzLi44NmUyNTcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoLmMKQEAgLTMzMCw4ICszMzAsOCBAQAogCWVlaF9wZV9zdGF0ZV9tYXJrKHBoYl9wZSwgRUVIX1BFX0lTT0xBVEVEKTsKIAllZWhfc2VyaWFsaXplX3VubG9jayhmbGFncyk7CiAKLQlwcl9lcnIoIkVFSDogUEhCIyV4IGZhaWx1cmUgZGV0ZWN0ZWRcbiIsCi0JCXBoYl9wZS0+cGhiLT5nbG9iYWxfbnVtYmVyKTsKKwlwcl9lcnIoIkVFSDogUEhCIyV4IGZhaWx1cmUgZGV0ZWN0ZWQsIGxvY2F0aW9uOiAlc1xuIiwKKwkJcGhiX3BlLT5waGItPmdsb2JhbF9udW1iZXIsIGVlaF9wZV9sb2NfZ2V0KHBoYl9wZSkpOwogCWR1bXBfc3RhY2soKTsKIAllZWhfc2VuZF9mYWlsdXJlX2V2ZW50KHBoYl9wZSk7CiAKQEAgLTM1OCwxMCArMzU4LDExIEBACiBpbnQgZWVoX2Rldl9jaGVja19mYWlsdXJlKHN0cnVjdCBlZWhfZGV2ICplZGV2KQogewogCWludCByZXQ7CisJaW50IGFjdGl2ZV9mbGFncyA9IChFRUhfU1RBVEVfTU1JT19BQ1RJVkUgfCBFRUhfU1RBVEVfRE1BX0FDVElWRSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IGVlaF9wZSAqcGU7CisJc3RydWN0IGVlaF9wZSAqcGUsICpwYXJlbnRfcGUsICpwaGJfcGU7CiAJaW50IHJjID0gMDsKIAljb25zdCBjaGFyICpsb2NhdGlvbjsKIApAQCAtNDM5LDE0ICs0NDAsMzQgQEAKIAkgKi8KIAlpZiAoKHJldCA8IDApIHx8CiAJICAgIChyZXQgPT0gRUVIX1NUQVRFX05PVF9TVVBQT1JUKSB8fAotCSAgICAocmV0ICYgKEVFSF9TVEFURV9NTUlPX0FDVElWRSB8IEVFSF9TVEFURV9ETUFfQUNUSVZFKSkgPT0KLQkgICAgKEVFSF9TVEFURV9NTUlPX0FDVElWRSB8IEVFSF9TVEFURV9ETUFfQUNUSVZFKSkgeworCSAgICAoKHJldCAmIGFjdGl2ZV9mbGFncykgPT0gYWN0aXZlX2ZsYWdzKSkgewogCQllZWhfc3RhdHMuZmFsc2VfcG9zaXRpdmVzKys7CiAJCXBlLT5mYWxzZV9wb3NpdGl2ZXMrKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CiAKKwkvKgorCSAqIEl0IHNob3VsZCBiZSBjb3JuZXIgY2FzZSB0aGF0IHRoZSBwYXJlbnQgUEUgaGFzIGJlZW4KKwkgKiBwdXQgaW50byBmcm96ZW4gc3RhdGUgYXMgd2VsbC4gV2Ugc2hvdWxkIHRha2UgY2FyZQorCSAqIHRoYXQgYXQgZmlyc3QuCisJICovCisJcGFyZW50X3BlID0gcGUtPnBhcmVudDsKKwl3aGlsZSAocGFyZW50X3BlKSB7CisJCS8qIEhpdCB0aGUgY2VpbGluZyA/ICovCisJCWlmIChwYXJlbnRfcGUtPnR5cGUgJiBFRUhfUEVfUEhCKQorCQkJYnJlYWs7CisKKwkJLyogRnJvemVuIHBhcmVudCBQRSA/ICovCisJCXJldCA9IGVlaF9vcHMtPmdldF9zdGF0ZShwYXJlbnRfcGUsIE5VTEwpOworCQlpZiAocmV0ID4gMCAmJgorCQkgICAgKHJldCAmIGFjdGl2ZV9mbGFncykgIT0gYWN0aXZlX2ZsYWdzKQorCQkJcGUgPSBwYXJlbnRfcGU7CisKKwkJLyogTmV4dCBwYXJlbnQgbGV2ZWwgKi8KKwkJcGFyZW50X3BlID0gcGFyZW50X3BlLT5wYXJlbnQ7CisJfQorCiAJZWVoX3N0YXRzLnNsb3RfcmVzZXRzKys7CiAKIAkvKiBBdm9pZCByZXBlYXRlZCByZXBvcnRzIG9mIHRoaXMgZmFpbHVyZSwgaW5jbHVkaW5nIHByb2JsZW1zCkBAIC00NjAsOCArNDgxLDExIEBACiAJICogYSBzdGFjayB0cmFjZSB3aWxsIGhlbHAgdGhlIGRldmljZS1kcml2ZXIgYXV0aG9ycyBmaWd1cmUKIAkgKiBvdXQgd2hhdCBoYXBwZW5lZC4gIFNvIHByaW50IHRoYXQgb3V0LgogCSAqLwotCXByX2VycigiRUVIOiBGcm96ZW4gUEUjJXggZGV0ZWN0ZWQgb24gUEhCIyV4XG4iLAotCQlwZS0+YWRkciwgcGUtPnBoYi0+Z2xvYmFsX251bWJlcik7CisJcGhiX3BlID0gZWVoX3BoYl9wZV9nZXQocGUtPnBoYik7CisJcHJfZXJyKCJFRUg6IEZyb3plbiBQSEIjJXgtUEUjJXggZGV0ZWN0ZWRcbiIsCisJICAgICAgIHBlLT5waGItPmdsb2JhbF9udW1iZXIsIHBlLT5hZGRyKTsKKwlwcl9lcnIoIkVFSDogUEUgbG9jYXRpb246ICVzLCBQSEIgbG9jYXRpb246ICVzXG4iLAorCSAgICAgICBlZWhfcGVfbG9jX2dldChwZSksIGVlaF9wZV9sb2NfZ2V0KHBoYl9wZSkpOwogCWR1bXBfc3RhY2soKTsKIAogCWVlaF9zZW5kX2ZhaWx1cmVfZXZlbnQocGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwppbmRleCA3MTAwYTViLi40MjBkYTYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwpAQCAtNDQ3LDggKzQ0Nyw5IEBACiAgKiBQRSByZXNldCAoZm9yIDMgdGltZXMpLCB3ZSB0cnkgdG8gY2xlYXIgdGhlIGZyb3plbiBzdGF0ZQogICogZm9yIDMgdGltZXMgYXMgd2VsbC4KICAqLwotc3RhdGljIGludCBlZWhfY2xlYXJfcGVfZnJvemVuX3N0YXRlKHN0cnVjdCBlZWhfcGUgKnBlKQorc3RhdGljIHZvaWQgKl9fZWVoX2NsZWFyX3BlX2Zyb3plbl9zdGF0ZSh2b2lkICpkYXRhLCB2b2lkICpmbGFnKQogeworCXN0cnVjdCBlZWhfcGUgKnBlID0gKHN0cnVjdCBlZWhfcGUgKilkYXRhOwogCWludCBpLCByYzsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTQ2MSwxMyArNDYyLDI0IEBACiAJfQogCiAJLyogVGhlIFBFIGhhcyBiZWVuIGlzb2xhdGVkLCBjbGVhciBpdCAqLwotCWlmIChyYykKKwlpZiAocmMpIHsKIAkJcHJfd2FybigiJXM6IENhbid0IGNsZWFyIGZyb3plbiBQSEIjJXgtUEUjJXggKCVkKVxuIiwKIAkJCV9fZnVuY19fLCBwZS0+cGhiLT5nbG9iYWxfbnVtYmVyLCBwZS0+YWRkciwgcmMpOwotCWVsc2UKKwkJcmV0dXJuICh2b2lkICopcGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZWVoX2NsZWFyX3BlX2Zyb3plbl9zdGF0ZShzdHJ1Y3QgZWVoX3BlICpwZSkKK3sKKwl2b2lkICpyYzsKKworCXJjID0gZWVoX3BlX3RyYXZlcnNlKHBlLCBfX2VlaF9jbGVhcl9wZV9mcm96ZW5fc3RhdGUsIE5VTEwpOworCWlmICghcmMpCiAJCWVlaF9wZV9zdGF0ZV9jbGVhcihwZSwgRUVIX1BFX0lTT0xBVEVEKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gcmMgPyAtRUlPIDogMDsKIH0KIAogLyoqCkBAIC03NTgsNyArNzcwLDcgQEAKIAkJCWVlaF9zZXJpYWxpemVfbG9jaygmZmxhZ3MpOwogCiAJCQkvKiBQdXJnZSBhbGwgZXZlbnRzICovCi0JCQllZWhfcmVtb3ZlX2V2ZW50KE5VTEwpOworCQkJZWVoX3JlbW92ZV9ldmVudChOVUxMLCB0cnVlKTsKIAogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShob3NlLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKIAkJCQlwaGJfcGUgPSBlZWhfcGhiX3BlX2dldChob3NlKTsKQEAgLTc3Nyw3ICs3ODksNyBAQAogCQkJZWVoX3NlcmlhbGl6ZV9sb2NrKCZmbGFncyk7CiAKIAkJCS8qIFB1cmdlIGFsbCBldmVudHMgb2YgdGhlIFBIQiAqLwotCQkJZWVoX3JlbW92ZV9ldmVudChwZSk7CisJCQllZWhfcmVtb3ZlX2V2ZW50KHBlLCB0cnVlKTsKIAogCQkJaWYgKHJjID09IEVFSF9ORVhUX0VSUl9ERUFEX1BIQikKIAkJCQllZWhfcGVfc3RhdGVfbWFyayhwZSwgRUVIX1BFX0lTT0xBVEVEKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2V2ZW50LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9ldmVudC5jCmluZGV4IDcyZDc0OGIuLjRlZWZiNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZXZlbnQuYwpAQCAtMTUyLDI0ICsxNTIsMzMgQEAKIC8qKgogICogZWVoX3JlbW92ZV9ldmVudCAtIFJlbW92ZSBFRUggZXZlbnQgZnJvbSB0aGUgcXVldWUKICAqIEBwZTogRXZlbnQgYmluZGluZyB0byB0aGUgUEUKKyAqIEBmb3JjZTogRXZlbnQgd2lsbCBiZSByZW1vdmVkIHVuY29uZGl0aW9uYWxseQogICoKICAqIE9uIFBvd2VyTlYgcGxhdGZvcm0sIHdlIG1pZ2h0IGhhdmUgc3Vic2VxdWVudCBjb21pbmcgZXZlbnRzCiAgKiBpcyBwYXJ0IG9mIHRoZSBmb3JtZXIgb25lLiBGb3IgdGhhdCBjYXNlLCB0aG9zZSBzdWJzZXF1ZW50CiAgKiBjb21pbmcgZXZlbnRzIGFyZSB0b3RhbGx5IGR1cGxpY2F0ZWQgYW5kIHVubmVjZXNzYXJ5LCB0aHVzCiAgKiB0aGV5IHNob3VsZCBiZSByZW1vdmVkLgogICovCi12b2lkIGVlaF9yZW1vdmVfZXZlbnQoc3RydWN0IGVlaF9wZSAqcGUpCit2b2lkIGVlaF9yZW1vdmVfZXZlbnQoc3RydWN0IGVlaF9wZSAqcGUsIGJvb2wgZm9yY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZWVoX2V2ZW50ICpldmVudCwgKnRtcDsKIAorCS8qCisJICogSWYgd2UgaGF2ZSBOVUxMIFBFIHBhc3NlZCBpbiwgd2UgaGF2ZSBkZWFkIElPQworCSAqIG9yIHdlJ3JlIHN1cmUgd2UgY2FuIHJlcG9ydCBhbGwgZXhpc3RpbmcgZXJyb3JzCisJICogYnkgdGhlIGNhbGxlci4KKwkgKgorCSAqIFdpdGggImZvcmNlIiwgdGhlIGV2ZW50IHdpdGggYXNzb2NpYXRlZCBQRSB0aGF0CisJICogaGF2ZSBiZWVuIGlzb2xhdGVkLCB0aGUgZXZlbnQgd29uJ3QgYmUgcmVtb3ZlZAorCSAqIHRvIGF2b2lkIGV2ZW50IGxvc3QuCisJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVlaF9ldmVudGxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldmVudCwgdG1wLCAmZWVoX2V2ZW50bGlzdCwgbGlzdCkgewotCQkvKgotCQkgKiBJZiB3ZSBkb24ndCBoYXZlIHZhbGlkIFBFIHBhc3NlZCBpbiwgdGhhdCBtZWFucwotCQkgKiB3ZSBhbHJlYWR5IGhhdmUgZXZlbnQgY29ycmVzcG9uZGluZyB0byBkZWFkIElPQwotCQkgKiBhbmQgYWxsIGV2ZW50cyBzaG91bGQgYmUgcHVyZ2VkLgotCQkgKi8KKwkJaWYgKCFmb3JjZSAmJiBldmVudC0+cGUgJiYKKwkJICAgIChldmVudC0+cGUtPnN0YXRlICYgRUVIX1BFX0lTT0xBVEVEKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmICghcGUpIHsKIAkJCWxpc3RfZGVsKCZldmVudC0+bGlzdCk7CiAJCQlrZnJlZShldmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9wZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfcGUuYwppbmRleCA5OTVjMmEyLi5mYmQwMWViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9wZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX3BlLmMKQEAgLTc5Miw2ICs3OTIsNjYgQEAKIH0KIAogLyoqCisgKiBlZWhfcGVfbG9jX2dldCAtIFJldHJpZXZlIGxvY2F0aW9uIGNvZGUgYmluZGluZyB0byB0aGUgZ2l2ZW4gUEUKKyAqIEBwZTogRUVIIFBFCisgKgorICogUmV0cmlldmUgdGhlIGxvY2F0aW9uIGNvZGUgb2YgdGhlIGdpdmVuIFBFLiBJZiB0aGUgcHJpbWFyeSBQRSBidXMKKyAqIGlzIHJvb3QgYnVzLCB3ZSB3aWxsIGdyYWIgbG9jYXRpb24gY29kZSBmcm9tIFBIQiBkZXZpY2UgdHJlZSBub2RlCisgKiBvciByb290IHBvcnQuIE90aGVyd2lzZSwgdGhlIHVwc3RyZWFtIGJyaWRnZSdzIGRldmljZSB0cmVlIG5vZGUKKyAqIG9mIHRoZSBwcmltYXJ5IFBFIGJ1cyB3aWxsIGJlIGNoZWNrZWQgZm9yIHRoZSBsb2NhdGlvbiBjb2RlLgorICovCitjb25zdCBjaGFyICplZWhfcGVfbG9jX2dldChzdHJ1Y3QgZWVoX3BlICpwZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IGVlaF9wZV9idXNfZ2V0KHBlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCWNvbnN0IGNoYXIgKmxvYzsKKworCWlmICghYnVzKQorCQlyZXR1cm4gIk4vQSI7CisKKwkvKiBQSEIgUEUgb3Igcm9vdCBQRSA/ICovCisJaWYgKHBjaV9pc19yb290X2J1cyhidXMpKSB7CisJCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwkJbG9jID0gb2ZfZ2V0X3Byb3BlcnR5KGhvc2UtPmRuLAorCQkJCSJpYm0sbG9jLWNvZGUiLCBOVUxMKTsKKwkJaWYgKGxvYykKKwkJCXJldHVybiBsb2M7CisJCWxvYyA9IG9mX2dldF9wcm9wZXJ0eShob3NlLT5kbiwKKwkJCQkiaWJtLGlvLWJhc2UtbG9jLWNvZGUiLCBOVUxMKTsKKwkJaWYgKGxvYykKKwkJCXJldHVybiBsb2M7CisKKwkJcGRldiA9IHBjaV9nZXRfc2xvdChidXMsIDB4MCk7CisJfSBlbHNlIHsKKwkJcGRldiA9IGJ1cy0+c2VsZjsKKwl9CisKKwlpZiAoIXBkZXYpIHsKKwkJbG9jID0gIk4vQSI7CisJCWdvdG8gb3V0OworCX0KKworCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCWlmICghZG4pIHsKKwkJbG9jID0gIk4vQSI7CisJCWdvdG8gb3V0OworCX0KKworCWxvYyA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxsb2MtY29kZSIsIE5VTEwpOworCWlmICghbG9jKQorCQlsb2MgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sc2xvdC1sb2NhdGlvbi1jb2RlIiwgTlVMTCk7CisJaWYgKCFsb2MpCisJCWxvYyA9ICJOL0EiOworCitvdXQ6CisJaWYgKHBjaV9pc19yb290X2J1cyhidXMpICYmIHBkZXYpCisJCXBjaV9kZXZfcHV0KHBkZXYpOworCXJldHVybiBsb2M7Cit9CisKKy8qKgogICogZWVoX3BlX2J1c19nZXQgLSBSZXRyaWV2ZSBQQ0kgYnVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gUEUKICAqIEBwZTogRUVIIFBFCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDkxMWQ0NTMuLjY1MjhjNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKQEAgLTQyOCwxMiArNDI4LDYgQEAKIAlzdGQJcjI0LFRIUkVBRF9WUlNBVkUocjMpCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci1CRUdJTl9GVFJfU0VDVElPTgotCW1mc3ByCXIyNSxTUFJOX0RTQ1IKLQlzdGQJcjI1LFRIUkVBRF9EU0NSKHIzKQotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfRFNDUikKLSNlbmRpZgogCWFuZC4JcjAscjAscjIyCiAJYmVxKwkxZgogCWFuZGMJcjIyLHIyMixyMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCmluZGV4IDc3MWI0ZTkuLmJiOWNhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKQEAgLTE0NjcsMjIgKzE0NjcsNiBAQAogCS5nbG9ibCAgYTJfdGxiaW5pdF9hZnRlcl9pcHJvdF9mbHVzaAogYTJfdGxiaW5pdF9hZnRlcl9pcHJvdF9mbHVzaDoKIAotI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUdfV1NQCi0JLyogTm93IGVzdGFibGlzaCBlYXJseSBkZWJ1ZyBtYXBwaW5ncyBpZiBhcHBsaWNhYmxlICovCi0JLyogUmVzdG9yZSB0aGUgTUFTMCB3ZSB1c2VkIGZvciBsaW5lYXIgbWFwcGluZyBsb2FkICovCi0JbXRzcHIJU1BSTl9NQVMwLHIxMQotCi0JbGlzCXIzLChNQVMxX1ZBTElEIHwgTUFTMV9JUFJPVClAaAotCW9yaQlyMyxyMywoQk9PSzNFX1BBR0VTWl80SyA8PCBNQVMxX1RTSVpFX1NISUZUKQotCW10c3ByCVNQUk5fTUFTMSxyMwotCUxPQURfUkVHX0lNTUVESUFURShyMywgV1NQX1VBUlRfVklSVCB8IE1BUzJfSSB8IE1BUzJfRykKLQltdHNwcglTUFJOX01BUzIscjMKLQlMT0FEX1JFR19JTU1FRElBVEUocjMsIFdTUF9VQVJUX1BIWVMgfCBNQVMzX1NSIHwgTUFTM19TVykKLQltdHNwcglTUFJOX01BUzdfTUFTMyxyMwotCS8qIHJlLXVzZSB0aGUgTUFTOCB2YWx1ZSBmcm9tIHRoZSBsaW5lYXIgbWFwcGluZyAqLwotCXRsYndlCi0jZW5kaWYgLyogQ09ORklHX1BQQ19FQVJMWV9ERUJVR19XU1AgKi8KLQogCVBQQ19UTEJJTFgoMCwwLFIwKQogCXN5bmMKIAlpc3luYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IDIwZjExZWIuLmE3ZDM2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTQzOSw5ICs0MzksOSBAQAogCSAqIFI5CQk9IENSCiAJICogT3JpZ2luYWwgUjkgdG8gUjEzIGlzIHNhdmVkIG9uIFBBQ0FfRVhNQwogCSAqCi0JICogU3dpdGNoIHRvIG1jX2VtZXJnZW5jeSBzdGFjayBhbmQgaGFuZGxlIHJlLWVudHJhbmN5ICh0aG91Z2ggd2UKLQkgKiBjdXJyZW50bHkgZG9uJ3QgdGVzdCBmb3Igb3ZlcmZsb3cpLiBTYXZlIE1DRSByZWdpc3RlcnMgc3JyMSwKLQkgKiBzcnIwLCBkYXIgYW5kIGRzaXNyIGFuZCB0aGVuIHNldCBNRT0xCisJICogU3dpdGNoIHRvIG1jX2VtZXJnZW5jeSBzdGFjayBhbmQgaGFuZGxlIHJlLWVudHJhbmN5ICh3ZSBsaW1pdAorCSAqIHRoZSBuZXN0ZWQgTUNFIHVwdG8gbGV2ZWwgNCB0byBhdm9pZCBzdGFjayBvdmVyZmxvdykuCisJICogU2F2ZSBNQ0UgcmVnaXN0ZXJzIHNycjEsIHNycjAsIGRhciBhbmQgZHNpc3IgYW5kIHRoZW4gc2V0IE1FPTEKIAkgKgogCSAqIFdlIHVzZSBwYWNhLT5pbl9tY2UgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBvcgogCSAqIG5lc3RlZCBtYWNoaW5lIGNoZWNrLiBXZSBpbmNyZW1lbnQgcGFjYS0+aW5fbWNlIHRvIHRyYWNrIG5lc3RlZApAQCAtNDY0LDYgKzQ2NCw5IEBACiAwOglzdWJpCXIxLHIxLElOVF9GUkFNRV9TSVpFCS8qIGFsbG9jIHN0YWNrIGZyYW1lICovCiAJYWRkaQlyMTAscjEwLDEJCS8qIGluY3JlbWVudCBwYWNhLT5pbl9tY2UgKi8KIAlzdGgJcjEwLFBBQ0FfSU5fTUNFKHIxMykKKwkvKiBMaW1pdCBuZXN0ZWQgTUNFIHRvIGxldmVsIDQgdG8gYXZvaWQgc3RhY2sgb3ZlcmZsb3cgKi8KKwljbXB3aQlyMTAsNAorCWJndAkyZgkJCS8qIENoZWNrIGlmIHdlIGhpdCBsaW1pdCBvZiA0ICovCiAJc3RkCXIxMSxHUFIxKHIxKQkJLyogU2F2ZSByMSBvbiB0aGUgc3RhY2suICovCiAJc3RkCXIxMSwwKHIxKQkJLyogbWFrZSBzdGFjayBjaGFpbiBwb2ludGVyICovCiAJbWZzcHIJcjExLFNQUk5fU1JSMAkJLyogU2F2ZSBTUlIwICovCkBAIC00ODIsMTAgKzQ4NSwyMyBAQAogCW9yaQlyMTEscjExLE1TUl9SSQkJLyogdHVybiBvbiBSSSBiaXQgKi8KIAlsZAlyMTIsUEFDQUtCQVNFKHIxMykJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8KIAlMT0FEX0hBTkRMRVIocjEyLCBtYWNoaW5lX2NoZWNrX2hhbmRsZV9lYXJseSkKLQltdHNwcglTUFJOX1NSUjAscjEyCisxOgltdHNwcglTUFJOX1NSUjAscjEyCiAJbXRzcHIJU1BSTl9TUlIxLHIxMQogCXJmaWQKIAliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KKzI6CisJLyogU3RhY2sgb3ZlcmZsb3cuIFN0YXkgb24gZW1lcmdlbmN5IHN0YWNrIGFuZCBwYW5pYy4KKwkgKiBLZWVwIHRoZSBNRSBiaXQgb2ZmIHdoaWxlIHBhbmljLWluZywgc28gdGhhdCBpZiB3ZSBoaXQKKwkgKiBhbm90aGVyIG1hY2hpbmUgY2hlY2sgd2UgY2hlY2tzdG9wLgorCSAqLworCWFkZGkJcjEscjEsSU5UX0ZSQU1FX1NJWkUJLyogZ28gYmFjayB0byBwcmV2aW91cyBzdGFjayBmcmFtZSAqLworCWxkCXIxMSxQQUNBS01TUihyMTMpCisJbGQJcjEyLFBBQ0FLQkFTRShyMTMpCisJTE9BRF9IQU5ETEVSKHIxMiwgdW5yZWNvdmVyX21jZSkKKwlsaQlyMTAsTVNSX01FCisJYW5kYwlyMTEscjExLHIxMAkJLyogVHVybiBvZmYgTVNSX01FICovCisJYgkxYgorCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSFZNT0RFKQogCiBtYWNoaW5lX2NoZWNrX3BTZXJpZXM6CkBAIC0xMzg5LDYgKzE0MDUsNyBAQAogCWJsCXNhdmVfbnZncHJzCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCW1hY2hpbmVfY2hlY2tfZWFybHkKKwlzdGQJcjMsUkVTVUxUKHIxKQkvKiBTYXZlIHJlc3VsdCAqLwogCWxkCXIxMixfTVNSKHIxKQogI2lmZGVmCUNPTkZJR19QUENfUDdfTkFQCiAJLyoKQEAgLTE0NDMsMTEgKzE0NjAsMzMgQEAKIAkgKi8KIAlhbmRpLglyMTEscjEyLE1TUl9SSQogCWJuZQkyZgotMToJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCXVucmVjb3ZlcmFibGVfZXhjZXB0aW9uCi0JYgkxYgorMToJbWZzcHIJcjExLFNQUk5fU1JSMAorCWxkCXIxMCxQQUNBS0JBU0UocjEzKQorCUxPQURfSEFORExFUihyMTAsdW5yZWNvdmVyX21jZSkKKwltdHNwcglTUFJOX1NSUjAscjEwCisJbGQJcjEwLFBBQ0FLTVNSKHIxMykKKwkvKgorCSAqIFdlIGFyZSBnb2luZyBkb3duLiBCdXQgdGhlcmUgYXJlIGNoYW5jZXMgdGhhdCB3ZSBtaWdodCBnZXQgaGl0IGJ5CisJICogYW5vdGhlciBNQ0UgZHVyaW5nIHBhbmljIHBhdGggYW5kIHdlIG1heSBydW4gaW50byB1bnN0YWJsZSBzdGF0ZQorCSAqIHdpdGggbm8gd2F5IG91dC4gSGVuY2UsIHR1cm4gTUUgYml0IG9mZiB3aGlsZSBnb2luZyBkb3duLCBzbyB0aGF0CisJICogd2hlbiBhbm90aGVyIE1DRSBpcyBoaXQgZHVyaW5nIHBhbmljIHBhdGgsIHN5c3RlbSB3aWxsIGNoZWNrc3RvcAorCSAqIGFuZCBoeXBlcnZpc29yIHdpbGwgZ2V0IHJlc3RhcnRlZCBjbGVhbmx5IGJ5IFNQLgorCSAqLworCWxpCXIzLE1TUl9NRQorCWFuZGMJcjEwLHIxMCxyMwkJLyogVHVybiBvZmYgTVNSX01FICovCisJbXRzcHIJU1BSTl9TUlIxLHIxMAorCXJmaWQKKwliCS4KIDI6CiAJLyoKKwkgKiBDaGVjayBpZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBoYW5kbGVkL3JlY292ZXJlZCBmcm9tIGVycm9yLCBpZiBub3QKKwkgKiB0aGVuIHN0YXkgb24gZW1lcmdlbmN5IHN0YWNrIGFuZCBwYW5pYy4KKwkgKi8KKwlsZAlyMyxSRVNVTFQocjEpCS8qIExvYWQgcmVzdWx0ICovCisJY21wZGkJcjMsMAkJLyogc2VlIGlmIHdlIGhhbmRsZWQgTUNFIHN1Y2Nlc3NmdWxseSAqLworCisJYmVxCTFiCQkvKiBpZiAhaGFuZGxlZCB0aGVuIHBhbmljICovCisJLyoKIAkgKiBSZXR1cm4gZnJvbSBNQyBpbnRlcnJ1cHQuCiAJICogUXVldWUgdXAgdGhlIE1DRSBldmVudCBzbyB0aGF0IHdlIGNhbiBsb2cgaXQgbGF0ZXIsIHdoaWxlCiAJICogcmV0dXJuaW5nIGZyb20ga2VybmVsIG9yIG9wYWwgY2FsbC4KQEAgLTE0NjAsNiArMTQ5OSwxNyBAQAogCU1BQ0hJTkVfQ0hFQ0tfSEFORExFUl9XSU5EVVAKIAliCW1hY2hpbmVfY2hlY2tfcFNlcmllcwogCit1bnJlY292ZXJfbWNlOgorCS8qIEludm9rZSBtYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiB0byBwcmludCBNQ0UgZXZlbnQgYW5kIHBhbmljLiAqLworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAltYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbgorCS8qCisJICogV2Ugd2lsbCBub3QgcmVhY2ggaGVyZS4gRXZlbiBpZiB3ZSBkaWQsIHRoZXJlIGlzIG5vIHdheSBvdXQuIENhbGwKKwkgKiB1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbiBhbmQgZGllLgorCSAqLworMToJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCXVucmVjb3ZlcmFibGVfZXhjZXB0aW9uCisJYgkxYgogLyoKICAqIHIxMyBwb2ludHMgdG8gdGhlIFBBQ0EsIHI5IGNvbnRhaW5zIHRoZSBzYXZlZCBDUiwKICAqIHIxMiBjb250YWluIHRoZSBzYXZlZCBTUlIxLCBTUlIwIGlzIHN0aWxsIHJlYWR5IGZvciByZXR1cm4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUwppbmRleCA2N2VlMGQ2Li43ZDdkODYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQweC5TCkBAIC05MzAsMjUgKzkzMCw2IEBACiAJdGxid2UJcjQscjAsVExCX0RBVEEJCS8qIExvYWQgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgZW50cnkgKi8KIAl0bGJ3ZQlyMyxyMCxUTEJfVEFHCQkvKiBMb2FkIHRoZSB0YWcgcG9ydGlvbiBvZiB0aGUgZW50cnkgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9URVhUX0RFQlVHKSAmJiBkZWZpbmVkKFNFUklBTF9ERUJVR19JT19CQVNFKQotCi0JLyogTG9hZCBhIFRMQiBlbnRyeSBmb3IgdGhlIFVBUlQsIHNvIHRoYXQgcHBjNHh4X3Byb2dyZXNzKCkgY2FuIHVzZQotCSAqIHRoZSBVQVJUcyBuaWNlIGFuZCBlYXJseS4gIFdlIHVzZSBhIDRrIHJlYWw9PXZpcnR1YWwgbWFwcGluZy4gKi8KLQotCWxpcwlyMyxTRVJJQUxfREVCVUdfSU9fQkFTRUBoCi0Jb3JpCXIzLHIzLFNFUklBTF9ERUJVR19JT19CQVNFQGwKLQltcglyNCxyMwotCWNscnJ3aQlyNCxyNCwxMgotCW9yaQlyNCxyNCwoVExCX1dSfFRMQl9JfFRMQl9NfFRMQl9HKQotCi0JY2xycndpCXIzLHIzLDEyCi0Jb3JpCXIzLHIzLChUTEJfVkFMSUQgfCBUTEJfUEFHRVNaKFBBR0VTWl80SykpCi0KLQlsaQlyMCwwCQkJLyogVExCIHNsb3QgMCAqLwotCXRsYndlCXI0LHIwLFRMQl9EQVRBCi0JdGxid2UJcjMscjAsVExCX1RBRwotI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfREVCVUdfVEVYVCAmJiBTRVJJQUxfREVCVUdfSU9fQkFTRSAqLwotCiAJaXN5bmMKIAogCS8qIEVzdGFibGlzaCB0aGUgZXhjZXB0aW9uIHZlY3RvciBiYXNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDhhMWVkYmUuLmJlOTk3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC03NTUsMTUgKzc1NSwxNSBAQAogCiAJV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKIAotCS8qIEJhY2sgdXAgdGhlIFRBUiBhY3Jvc3MgY29udGV4dCBzd2l0Y2hlcy4KKwkvKiBCYWNrIHVwIHRoZSBUQVIgYW5kIERTQ1IgYWNyb3NzIGNvbnRleHQgc3dpdGNoZXMuCiAJICogTm90ZSB0aGF0IHRoZSBUQVIgaXMgbm90IGF2YWlsYWJsZSBmb3IgdXNlIGluIHRoZSBrZXJuZWwuICAoVG8KIAkgKiBwcm92aWRlIHRoaXMsIHRoZSBUQVIgc2hvdWxkIGJlIGJhY2tlZCB1cC9yZXN0b3JlZCBvbiBleGNlcHRpb24KIAkgKiBlbnRyeS9leGl0IGluc3RlYWQsIGFuZCBiZSBpbiBwdF9yZWdzLiAgRklYTUUsIHRoaXMgc2hvdWxkIGJlIGluCiAJICogcHRfcmVncyBhbnl3YXkgKGZvciBkZWJ1ZykuKQotCSAqIFNhdmUgdGhlIFRBUiBoZXJlIGJlZm9yZSB3ZSBkbyB0cmVjbGFpbS90cmVjaGVja3BvaW50IGFzIHRoZXNlCi0JICogd2lsbCBjaGFuZ2UgdGhlIFRBUi4KKwkgKiBTYXZlIHRoZSBUQVIgYW5kIERTQ1IgaGVyZSBiZWZvcmUgd2UgZG8gdHJlY2xhaW0vdHJlY2hlY2twb2ludCBhcworCSAqIHRoZXNlIHdpbGwgY2hhbmdlIHRoZW0uCiAJICovCi0Jc2F2ZV90YXIoJnByZXYtPnRocmVhZCk7CisJc2F2ZV9lYXJseV9zcHJzKCZwcmV2LT50aHJlYWQpOwogCiAJX19zd2l0Y2hfdG9fdG0ocHJldik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IGQ0ZDQxODMuLmUyMzlkZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBudGhyZWFkcyAmJiBjcHUgPCBucl9jcHVfaWRzOyBqKyspIHsKIAkJCURCRygiICAgIHRocmVhZCAlZCAtPiBjcHUgJWQgKGhhcmQgaWQgJWQpXG4iLAogCQkJICAgIGosIGNwdSwgYmUzMl90b19jcHUoaW50c2VydltqXSkpOwotCQkJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1ZSk7CisJCQlzZXRfY3B1X3ByZXNlbnQoY3B1LCBvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGRuKSk7CiAJCQlzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSwgYmUzMl90b19jcHUoaW50c2VydltqXSkpOwogCQkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIHRydWUpOwogCQkJY3B1Kys7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCA3NzUzYWYyLi41MWEzZmY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTc0OSw3ICs3NDksNyBAQAogLyogY3B1bWFzayBvZiBDUFVzIHdpdGggYXN5bWV0cmljIFNNVCBkZXBlbmRhbmN5ICovCiBzdGF0aWMgY29uc3QgaW50IHBvd2VycGNfc210X2ZsYWdzKHZvaWQpCiB7Ci0JaW50IGZsYWdzID0gU0RfU0hBUkVfQ1BVUE9XRVIgfCBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTOworCWludCBmbGFncyA9IFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwgU0RfU0hBUkVfUEtHX1JFU09VUkNFUzsKIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BU1lNX1NNVCkpIHsKIAkJcHJpbnRrX29uY2UoS0VSTl9JTkZPICJFbmFibGluZyBBc3ltbWV0cmljIFNNVCBzY2hlZHVsaW5nXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggN2U3MTFiZC4uOWZmZjljZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTU1MSw3ICs1NTEsNyBAQAogCW1heV9oYXJkX2lycV9lbmFibGUoKTsKIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmIGRlZmluZWQoQ09ORklHX1BNQUMpCisjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKQogCWlmIChhdG9taWNfcmVhZCgmcHBjX25fbG9zdF9pbnRlcnJ1cHRzKSAhPSAwKQogCQlkb19JUlEocmVncyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCAxYmQ3Y2EyLi4yMzlmMWNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0yOTUsNiArMjk1LDggQEAKIHsKIAlsb25nIGhhbmRsZWQgPSAwOwogCisJX19nZXRfY3B1X3ZhcihpcnFfc3RhdCkubWNlX2V4Y2VwdGlvbnMrKzsKKwogCWlmIChjdXJfY3B1X3NwZWMgJiYgY3VyX2NwdV9zcGVjLT5tYWNoaW5lX2NoZWNrX2Vhcmx5KQogCQloYW5kbGVkID0gY3VyX2NwdV9zcGVjLT5tYWNoaW5lX2NoZWNrX2Vhcmx5KHJlZ3MpOwogCXJldHVybiBoYW5kbGVkOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYwppbmRleCBhMTU4Mzc1Li5iN2FhMDcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYwpAQCAtNjIsOCArNjIsNiBAQAogCXVkYmdfaW5pdF9jcG0oKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19VU0JHRUNLTykKIAl1ZGJnX2luaXRfdXNiZ2Vja28oKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19XU1ApCi0JdWRiZ19pbml0X3dzcCgpOwogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX01FTUNPTlMpCiAJLyogSW4gbWVtb3J5IGNvbnNvbGUgKi8KIAl1ZGJnX2luaXRfbWVtY29ucygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnXzE2NTUwLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYwppbmRleCA3NTcwMmUyLi42ZTdjNDkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYwpAQCAtMjk2LDE0ICsyOTYsMyBAQAogfQogCiAjZW5kaWYgLyogQ09ORklHX1BQQ19FQVJMWV9ERUJVR180MHggKi8KLQotCi0jaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19XU1AKLQotdm9pZCBfX2luaXQgdWRiZ19pbml0X3dzcCh2b2lkKQotewotCXVkYmdfdWFydF9pbml0X21taW8oKHZvaWQgKilXU1BfVUFSVF9WSVJULCAxKTsKLQl1ZGJnX3VhcnRfc2V0dXAoNTc2MDAsIDUwMDAwMDAwKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QUENfRUFSTFlfREVCVUdfV1NQICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9yYXMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3Jhcy5jCmluZGV4IDc2OGE5ZjkuLjNhNWM1NjhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9yYXMuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9yYXMuYwpAQCAtMTEzLDEwICsxMTMsOCBAQAogCSAqIFdlIGFzc3VtZSB0aGF0IGlmIHRoZSBjb25kaXRpb24gaXMgcmVjb3ZlcmVkIHRoZW4gbGludXggaG9zdAogCSAqIHdpbGwgaGF2ZSBnZW5lcmF0ZWQgYW4gZXJyb3IgbG9nIGV2ZW50IHRoYXQgd2Ugd2lsbCBwaWNrCiAJICogdXAgYW5kIGxvZyBsYXRlci4KLQkgKiBEb24ndCByZWxlYXNlIG1jZSBldmVudCBub3cuIEluIGNhc2UgaWYgY29uZGl0aW9uIGlzIG5vdAotCSAqIHJlY292ZXJlZCB3ZSBkbyBndWVzdCBleGl0IGFuZCBnbyBiYWNrIHRvIGxpbnV4IGhvc3QgbWFjaGluZQotCSAqIGNoZWNrIGhhbmRsZXIuIEhlbmNlIHdlIG5lZWQgbWFrZSBzdXJlIHRoYXQgY3VycmVudCBtY2UgZXZlbnQKLQkgKiBpcyBhdmFpbGFibGUgZm9yIGxpbnV4IGhvc3QgdG8gY29uc3VtZS4KKwkgKiBEb24ndCByZWxlYXNlIG1jZSBldmVudCBub3cuIFdlIHdpbGwgcXVldWUgdXAgdGhlIGV2ZW50IHNvIHRoYXQKKwkgKiB3ZSBjYW4gbG9nIHRoZSBNQ0UgZXZlbnQgaW5mbyBvbiBob3N0IGNvbnNvbGUuCiAJICovCiAJaWYgKCFnZXRfbWNlX2V2ZW50KCZtY2VfZXZ0LCBNQ0VfRVZFTlRfRE9OVFJFTEVBU0UpKQogCQlnb3RvIG91dDsKQEAgLTEyOCwxMSArMTI2LDEyIEBACiAKIG91dDoKIAkvKgotCSAqIElmIHdlIGhhdmUgaGFuZGxlZCB0aGUgZXJyb3IsIHRoZW4gcmVsZWFzZSB0aGUgbWNlIGV2ZW50IGJlY2F1c2UKLQkgKiB3ZSB3aWxsIGJlIGRlbGl2ZXJpbmcgbWFjaGluZSBjaGVjayB0byBndWVzdC4KKwkgKiBXZSBhcmUgbm93IGdvaW5nIGVudGVyIGd1ZXN0IGVpdGhlciB0aHJvdWdoIG1hY2hpbmUgY2hlY2sKKwkgKiBpbnRlcnJ1cHQgKGZvciB1bmhhbmRsZWQgZXJyb3JzKSBvciB3aWxsIGNvbnRpbnVlIGZyb20KKwkgKiBjdXJyZW50IEhTUlIwIChmb3IgaGFuZGxlZCBlcnJvcnMpIGluIGd1ZXN0LiBIZW5jZQorCSAqIHF1ZXVlIHVwIHRoZSBldmVudCBzbyB0aGF0IHdlIGNhbiBsb2cgaXQgZnJvbSBob3N0IGNvbnNvbGUgbGF0ZXIuCiAJICovCi0JaWYgKGhhbmRsZWQpCi0JCXJlbGVhc2VfbWNlX2V2ZW50KCk7CisJbWFjaGluZV9jaGVja19xdWV1ZV9ldmVudCgpOwogCiAJcmV0dXJuIGhhbmRsZWQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKaW5kZXggNzczNTZmZC4uODY4MzQ3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwpAQCAtMjI1NywxNSArMjI1NywyOCBAQAogCW1yCXIzLCByOQkJLyogZ2V0IHZjcHUgcG9pbnRlciAqLwogCWJsCWt2bXBwY19yZWFsbW9kZV9tYWNoaW5lX2NoZWNrCiAJbm9wCi0JY21wZGkJcjMsIDAJCS8qIGNvbnRpbnVlIGV4aXRpbmcgZnJvbSBndWVzdD8gKi8KKwljbXBkaQlyMywgMAkJLyogRGlkIHdlIGhhbmRsZSBNQ0UgPyAqLwogCWxkCXI5LCBIU1RBVEVfS1ZNX1ZDUFUocjEzKQogCWxpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9NQUNISU5FX0NIRUNLCi0JYmVxCW1jX2NvbnQKKwkvKgorCSAqIERlbGl2ZXIgdW5oYW5kbGVkL2ZhdGFsIChlLmcuIFVFKSBNQ0UgZXJyb3JzIHRvIGd1ZXN0IHRocm91Z2gKKwkgKiBtYWNoaW5lIGNoZWNrIGludGVycnVwdCAoc2V0IEhTUlIwIHRvIDB4MjAwKS4gQW5kIGZvciBoYW5kbGVkCisJICogZXJyb3JzIChuby1mYXRhbCksIGp1c3QgZ28gYmFjayB0byBndWVzdCBleGVjdXRpb24gd2l0aCBjdXJyZW50CisJICogSFNSUjAgaW5zdGVhZCBvZiBleGl0aW5nIGd1ZXN0LiBUaGlzIG5ldyBhcHByb2FjaCB3aWxsIGluamVjdAorCSAqIG1hY2hpbmUgY2hlY2sgdG8gZ3Vlc3QgZm9yIGZhdGFsIGVycm9yIGNhdXNpbmcgZ3Vlc3QgdG8gY3Jhc2guCisJICoKKwkgKiBUaGUgb2xkIGNvZGUgdXNlZCB0byByZXR1cm4gdG8gaG9zdCBmb3IgdW5oYW5kbGVkIGVycm9ycyB3aGljaAorCSAqIHdhcyBjYXVzaW5nIGd1ZXN0IHRvIGhhbmcgd2l0aCBzb2Z0IGxvY2t1cHMgaW5zaWRlIGd1ZXN0IGFuZAorCSAqIG1ha2VzIGl0IGRpZmZpY3VsdCB0byByZWNvdmVyIGd1ZXN0IGluc3RhbmNlLgorCSAqLworCWxkCXIxMCwgVkNQVV9QQyhyOSkKKwlsZAlyMTEsIFZDUFVfTVNSKHI5KQorCWJuZQkyZgkvKiBDb250aW51ZSBndWVzdCBleGVjdXRpb24uICovCiAJLyogSWYgbm90LCBkZWxpdmVyIGEgbWFjaGluZSBjaGVjay4gIFNSUjAvMSBhcmUgYWxyZWFkeSBzZXQgKi8KIAlsaQlyMTAsIEJPT0szU19JTlRFUlJVUFRfTUFDSElORV9DSEVDSwogCWxkCXIxMSwgVkNQVV9NU1IocjkpCiAJYmwJa3ZtcHBjX21zcl9pbnRlcnJ1cHQKLQliCWZhc3RfaW50ZXJydXB0X2NfcmV0dXJuCisyOgliCWZhc3RfaW50ZXJydXB0X2NfcmV0dXJuCiAKIC8qCiAgKiBDaGVjayB0aGUgcmVhc29uIHdlIHdva2UgZnJvbSBuYXAsIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbi4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYyBiL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYwppbmRleCBjMDUxMWMyLi40MTJkZDQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jCkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogCQkJCXJlZ3MtPmdwcltyZF0gPSBieXRlcmV2XzQodmFsKTsKIAkJCWdvdG8gbGRzdF9kb25lOwogCi0jaWZkZWYgQ09ORklHX1BQQ19DUFUKKyNpZmRlZiBDT05GSUdfUFBDX0ZQVQogCQljYXNlIDUzNToJLyogbGZzeCAqLwogCQljYXNlIDU2NzoJLyogbGZzdXggKi8KIAkJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9GUCkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfNjQuUyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF82NC5TCmluZGV4IGU3NmViYTcuLjhmODdkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF82NC5TCkBAIC03OCw3ICs3OCw3IEBACiAJYmxyCiAKIC8qCi0gKiBCUEZfU19MRFhfQl9NU0g6IGxkeGIgIDQqKFtvZmZzZXRdJjB4ZikKKyAqIEJQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0g6IGxkeGIgIDQqKFtvZmZzZXRdJjB4ZikKICAqIHJfYWRkciBpcyB0aGUgb2Zmc2V0IHZhbHVlCiAgKi8KIAkuZ2xvYmwgc2tfbG9hZF9ieXRlX21zaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmMKaW5kZXggODA4Y2UxYy4uNmRjZGFkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYworKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jCkBAIC03OSwxOSArNzksMTEgQEAKIAl9CiAKIAlzd2l0Y2ggKGZpbHRlclswXS5jb2RlKSB7Ci0JY2FzZSBCUEZfU19SRVRfSzoKLQljYXNlIEJQRl9TX0xEX1dfTEVOOgotCWNhc2UgQlBGX1NfQU5DX1BST1RPQ09MOgotCWNhc2UgQlBGX1NfQU5DX0lGSU5ERVg6Ci0JY2FzZSBCUEZfU19BTkNfTUFSSzoKLQljYXNlIEJQRl9TX0FOQ19SWEhBU0g6Ci0JY2FzZSBCUEZfU19BTkNfVkxBTl9UQUc6Ci0JY2FzZSBCUEZfU19BTkNfVkxBTl9UQUdfUFJFU0VOVDoKLQljYXNlIEJQRl9TX0FOQ19DUFU6Ci0JY2FzZSBCUEZfU19BTkNfUVVFVUU6Ci0JY2FzZSBCUEZfU19MRF9XX0FCUzoKLQljYXNlIEJQRl9TX0xEX0hfQUJTOgotCWNhc2UgQlBGX1NfTERfQl9BQlM6CisJY2FzZSBCUEZfUkVUIHwgQlBGX0s6CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU46CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CiAJCS8qIGZpcnN0IGluc3RydWN0aW9uIHNldHMgQSByZWdpc3RlciAob3IgaXMgUkVUICdjb25zdGFudCcpICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNDQsNiArMTM2LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBmbGVuOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IEsgPSBmaWx0ZXJbaV0uazsKKwkJdTE2IGNvZGUgPSBicGZfYW5jX2hlbHBlcigmZmlsdGVyW2ldKTsKIAogCQkvKgogCQkgKiBhZGRyc1tdIG1hcHMgYSBCUEYgYnl0ZWNvZGUgYWRkcmVzcyBpbnRvIGEgcmVhbCBvZmZzZXQgZnJvbQpAQCAtMTUxLDM1ICsxNDQsMzUgQEAKIAkJICovCiAJCWFkZHJzW2ldID0gY3R4LT5pZHggKiA0OwogCi0JCXN3aXRjaCAoZmlsdGVyW2ldLmNvZGUpIHsKKwkJc3dpdGNoIChjb2RlKSB7CiAJCQkvKioqIEFMVSBvcHMgKioqLwotCQljYXNlIEJQRl9TX0FMVV9BRERfWDogLyogQSArPSBYOyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1g6IC8qIEEgKz0gWDsgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfQUREKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0FERF9LOiAvKiBBICs9IEs7ICovCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSzogLyogQSArPSBLOyAqLwogCQkJaWYgKCFLKQogCQkJCWJyZWFrOwogCQkJUFBDX0FEREkocl9BLCByX0EsIElNTV9MKEspKTsKIAkJCWlmIChLID49IDMyNzY4KQogCQkJCVBQQ19BRERJUyhyX0EsIHJfQSwgSU1NX0hBKEspKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9TVUJfWDogLyogQSAtPSBYOyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1g6IC8qIEEgLT0gWDsgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfU1VCKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX1NVQl9LOiAvKiBBIC09IEsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOiAvKiBBIC09IEsgKi8KIAkJCWlmICghSykKIAkJCQlicmVhazsKIAkJCVBQQ19BRERJKHJfQSwgcl9BLCBJTU1fTCgtSykpOwogCQkJaWYgKEsgPj0gMzI3NjgpCiAJCQkJUFBDX0FERElTKHJfQSwgcl9BLCBJTU1fSEEoLUspKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9NVUxfWDogLyogQSAqPSBYOyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX1g6IC8qIEEgKj0gWDsgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfTVVMKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX01VTF9LOiAvKiBBICo9IEsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOiAvKiBBICo9IEsgKi8KIAkJCWlmIChLIDwgMzI3NjgpCiAJCQkJUFBDX01VTEkocl9BLCByX0EsIEspOwogCQkJZWxzZSB7CkBAIC0xODcsNyArMTgwLDcgQEAKIAkJCQlQUENfTVVMKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9NT0RfWDogLyogQSAlPSBYOyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX1g6IC8qIEEgJT0gWDsgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfQ01QV0kocl9YLCAwKTsKIAkJCWlmIChjdHgtPnBjX3JldDAgIT0gLTEpIHsKQEAgLTIwMSwxMyArMTk0LDEzIEBACiAJCQlQUENfTVVMKHJfc2NyYXRjaDEsIHJfWCwgcl9zY3JhdGNoMSk7CiAJCQlQUENfU1VCKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9NT0RfSzogLyogQSAlPSBLOyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6IC8qIEEgJT0gSzsgKi8KIAkJCVBQQ19MSTMyKHJfc2NyYXRjaDIsIEspOwogCQkJUFBDX0RJVldVKHJfc2NyYXRjaDEsIHJfQSwgcl9zY3JhdGNoMik7CiAJCQlQUENfTVVMKHJfc2NyYXRjaDEsIHJfc2NyYXRjaDIsIHJfc2NyYXRjaDEpOwogCQkJUFBDX1NVQihyX0EsIHJfQSwgcl9zY3JhdGNoMSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfRElWX1g6IC8qIEEgLz0gWDsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YOiAvKiBBIC89IFg7ICovCiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YUkVHOwogCQkJUFBDX0NNUFdJKHJfWCwgMCk7CiAJCQlpZiAoY3R4LT5wY19yZXQwICE9IC0xKSB7CkBAIC0yMjMsMTcgKzIxNiwxNyBAQAogCQkJfQogCQkJUFBDX0RJVldVKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0RJVl9LOiAvKiBBIC89IEsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOiAvKiBBIC89IEsgKi8KIAkJCWlmIChLID09IDEpCiAJCQkJYnJlYWs7CiAJCQlQUENfTEkzMihyX3NjcmF0Y2gxLCBLKTsKIAkJCVBQQ19ESVZXVShyX0EsIHJfQSwgcl9zY3JhdGNoMSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfQU5EX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfWDoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfQU5EKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0FORF9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0s6CiAJCQlpZiAoIUlNTV9IKEspKQogCQkJCVBQQ19BTkRJKHJfQSwgcl9BLCBLKTsKIAkJCWVsc2UgewpAQCAtMjQxLDUxICsyMzQsNTEgQEAKIAkJCQlQUENfQU5EKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9PUl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfWDoKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfT1Iocl9BLCByX0EsIHJfWCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfT1JfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX0s6CiAJCQlpZiAoSU1NX0woSykpCiAJCQkJUFBDX09SSShyX0EsIHJfQSwgSU1NX0woSykpOwogCQkJaWYgKEsgPj0gNjU1MzYpCiAJCQkJUFBDX09SSVMocl9BLCByX0EsIElNTV9IKEspKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FOQ19BTFVfWE9SX1g6Ci0JCWNhc2UgQlBGX1NfQUxVX1hPUl9YOiAvKiBBIF49IFggKi8KKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0FMVV9YT1JfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YOiAvKiBBIF49IFggKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfWE9SKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX1hPUl9LOiAvKiBBIF49IEsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOiAvKiBBIF49IEsgKi8KIAkJCWlmIChJTU1fTChLKSkKIAkJCQlQUENfWE9SSShyX0EsIHJfQSwgSU1NX0woSykpOwogCQkJaWYgKEsgPj0gNjU1MzYpCiAJCQkJUFBDX1hPUklTKHJfQSwgcl9BLCBJTU1fSChLKSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfTFNIX1g6IC8qIEEgPDw9IFg7ICovCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfWDogLyogQSA8PD0gWDsgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQlQUENfU0xXKHJfQSwgcl9BLCByX1gpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX0xTSF9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0s6CiAJCQlpZiAoSyA9PSAwKQogCQkJCWJyZWFrOwogCQkJZWxzZQogCQkJCVBQQ19TTFdJKHJfQSwgcl9BLCBLKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FMVV9SU0hfWDogLyogQSA+Pj0gWDsgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9YOiAvKiBBID4+PSBYOyAqLwogCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJCVBQQ19TUlcocl9BLCByX0EsIHJfWCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTFVfUlNIX0s6IC8qIEEgPj49IEs7ICovCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfSzogLyogQSA+Pj0gSzsgKi8KIAkJCWlmIChLID09IDApCiAJCQkJYnJlYWs7CiAJCQllbHNlCiAJCQkJUFBDX1NSV0kocl9BLCByX0EsIEspOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQUxVX05FRzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX05FRzoKIAkJCVBQQ19ORUcocl9BLCByX0EpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfUkVUX0s6CisJCWNhc2UgQlBGX1JFVCB8IEJQRl9LOgogCQkJUFBDX0xJMzIocl9yZXQsIEspOwogCQkJaWYgKCFLKSB7CiAJCQkJaWYgKGN0eC0+cGNfcmV0MCA9PSAtMSkKQEAgLTMxMiw3ICszMDUsNyBAQAogCQkJCQlQUENfQkxSKCk7CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19SRVRfQToKKwkJY2FzZSBCUEZfUkVUIHwgQlBGX0E6CiAJCQlQUENfTVIocl9yZXQsIHJfQSk7CiAJCQlpZiAoaSAhPSBmbGVuIC0gMSkgewogCQkJCWlmIChjdHgtPnNlZW4pCkBAIC0zMjEsNTMgKzMxNCw1MyBAQAogCQkJCQlQUENfQkxSKCk7CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19NSVNDX1RBWDogLyogWCA9IEEgKi8KKwkJY2FzZSBCUEZfTUlTQyB8IEJQRl9UQVg6IC8qIFggPSBBICovCiAJCQlQUENfTVIocl9YLCByX0EpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfTUlTQ19UWEE6IC8qIEEgPSBYICovCisJCWNhc2UgQlBGX01JU0MgfCBCUEZfVFhBOiAvKiBBID0gWCAqLwogCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJCVBQQ19NUihyX0EsIHJfWCk7CiAJCQlicmVhazsKIAogCQkJLyoqKiBDb25zdGFudCBsb2Fkcy9NW10gYWNjZXNzICoqKi8KLQkJY2FzZSBCUEZfU19MRF9JTU06IC8qIEEgPSBLICovCisJCWNhc2UgQlBGX0xEIHwgQlBGX0lNTTogLyogQSA9IEsgKi8KIAkJCVBQQ19MSTMyKHJfQSwgSyk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRFhfSU1NOiAvKiBYID0gSyAqLworCQljYXNlIEJQRl9MRFggfCBCUEZfSU1NOiAvKiBYID0gSyAqLwogCQkJUFBDX0xJMzIocl9YLCBLKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEX01FTTogLyogQSA9IG1lbVtLXSAqLworCQljYXNlIEJQRl9MRCB8IEJQRl9NRU06IC8qIEEgPSBtZW1bS10gKi8KIAkJCVBQQ19NUihyX0EsIHJfTSArIChLICYgMHhmKSk7CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9NRU0gfCAoMTw8KEsgJiAweGYpKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEWF9NRU06IC8qIFggPSBtZW1bS10gKi8KKwkJY2FzZSBCUEZfTERYIHwgQlBGX01FTTogLyogWCA9IG1lbVtLXSAqLwogCQkJUFBDX01SKHJfWCwgcl9NICsgKEsgJiAweGYpKTsKIAkJCWN0eC0+c2VlbiB8PSBTRUVOX01FTSB8ICgxPDwoSyAmIDB4ZikpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfU1Q6IC8qIG1lbVtLXSA9IEEgKi8KKwkJY2FzZSBCUEZfU1Q6IC8qIG1lbVtLXSA9IEEgKi8KIAkJCVBQQ19NUihyX00gKyAoSyAmIDB4ZiksIHJfQSk7CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9NRU0gfCAoMTw8KEsgJiAweGYpKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX1NUWDogLyogbWVtW0tdID0gWCAqLworCQljYXNlIEJQRl9TVFg6IC8qIG1lbVtLXSA9IFggKi8KIAkJCVBQQ19NUihyX00gKyAoSyAmIDB4ZiksIHJfWCk7CiAJCQljdHgtPnNlZW4gfD0gU0VFTl9YUkVHIHwgU0VFTl9NRU0gfCAoMTw8KEsgJiAweGYpKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEX1dfTEVOOiAvKglBID0gc2tiLT5sZW47ICovCisJCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfTEVOOiAvKglBID0gc2tiLT5sZW47ICovCiAJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBsZW4pICE9IDQpOwogCQkJUFBDX0xXWl9PRkZTKHJfQSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEWF9XX0xFTjogLyogWCA9IHNrYi0+bGVuOyAqLworCQljYXNlIEJQRl9MRFggfCBCUEZfVyB8IEJQRl9MRU46IC8qIFggPSBza2ItPmxlbjsgKi8KIAkJCVBQQ19MV1pfT0ZGUyhyX1gsIHJfc2tiLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSk7CiAJCQlicmVhazsKIAogCQkJLyoqKiBBbmNpbGxhcnkgaW5mbyBsb2FkcyAqKiovCi0JCWNhc2UgQlBGX1NfQU5DX1BST1RPQ09MOiAvKiBBID0gbnRvaHMoc2tiLT5wcm90b2NvbCk7ICovCisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9QUk9UT0NPTDogLyogQSA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOyAqLwogCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwKIAkJCQkJCSAgcHJvdG9jb2wpICE9IDIpOwogCQkJUFBDX05UT0hTX09GRlMocl9BLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkJICAgIHByb3RvY29sKSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfSUZJTkRFWDoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0lGSU5ERVg6CiAJCQlQUENfTERfT0ZGUyhyX3NjcmF0Y2gxLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkJCWRldikpOwogCQkJUFBDX0NNUERJKHJfc2NyYXRjaDEsIDApOwpAQCAtMzg0LDMzICszNzcsMzMgQEAKIAkJCVBQQ19MV1pfT0ZGUyhyX0EsIHJfc2NyYXRjaDEsCiAJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQU5DX01BUks6CisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9NQVJLOgogCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykgIT0gNCk7CiAJCQlQUENfTFdaX09GRlMocl9BLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkJICBtYXJrKSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfUlhIQVNIOgorCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUlhIQVNIOgogCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgaGFzaCkgIT0gNCk7CiAJCQlQUENfTFdaX09GRlMocl9BLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkJICBoYXNoKSk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19BTkNfVkxBTl9UQUc6Ci0JCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHX1BSRVNFTlQ6CisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9WTEFOX1RBRzoKKwkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQ6CiAJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkgIT0gMik7CiAJCQlQUENfTEhaX09GRlMocl9BLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCiAJCQkJCQkJICB2bGFuX3RjaSkpOwotCQkJaWYgKGZpbHRlcltpXS5jb2RlID09IEJQRl9TX0FOQ19WTEFOX1RBRykKKwkJCWlmIChjb2RlID09IChCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHKSkKIAkJCQlQUENfQU5ESShyX0EsIHJfQSwgVkxBTl9WSURfTUFTSyk7CiAJCQllbHNlCiAJCQkJUFBDX0FOREkocl9BLCByX0EsIFZMQU5fVEFHX1BSRVNFTlQpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfQU5DX1FVRVVFOgorCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUVVFVUU6CiAJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLAogCQkJCQkJICBxdWV1ZV9tYXBwaW5nKSAhPSAyKTsKIAkJCVBQQ19MSFpfT0ZGUyhyX0EsIHJfc2tiLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwKIAkJCQkJCQkgIHF1ZXVlX21hcHBpbmcpKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0FOQ19DUFU6CisJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9DUFU6CiAjaWZkZWYgQ09ORklHX1NNUAogCQkJLyoKIAkJCSAqIFBBQ0EgcHRyIGlzIHIxMzoKQEAgLTQyNiwxMyArNDE5LDEzIEBACiAJCQlicmVhazsKIAogCQkJLyoqKiBBYnNvbHV0ZSBsb2FkcyBmcm9tIHBhY2tldCBoZWFkZXIvZGF0YSAqKiovCi0JCWNhc2UgQlBGX1NfTERfV19BQlM6CisJCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTOgogCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF93b3JkKTsKIAkJCWdvdG8gY29tbW9uX2xvYWQ7Ci0JCWNhc2UgQlBGX1NfTERfSF9BQlM6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTOgogCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF9oYWxmKTsKIAkJCWdvdG8gY29tbW9uX2xvYWQ7Ci0JCWNhc2UgQlBGX1NfTERfQl9BQlM6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTOgogCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF9ieXRlKTsKIAkJY29tbW9uX2xvYWQ6CiAJCQkvKiBMb2FkIGZyb20gW0tdLiAqLwpAQCAtNDQ5LDEzICs0NDIsMTMgQEAKIAkJCWJyZWFrOwogCiAJCQkvKioqIEluZGlyZWN0IGxvYWRzIGZyb20gcGFja2V0IGhlYWRlci9kYXRhICoqKi8KLQkJY2FzZSBCUEZfU19MRF9XX0lORDoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9JTkQ6CiAJCQlmdW5jID0gc2tfbG9hZF93b3JkOwogCQkJZ290byBjb21tb25fbG9hZF9pbmQ7Ci0JCWNhc2UgQlBGX1NfTERfSF9JTkQ6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5EOgogCQkJZnVuYyA9IHNrX2xvYWRfaGFsZjsKIAkJCWdvdG8gY29tbW9uX2xvYWRfaW5kOwotCQljYXNlIEJQRl9TX0xEX0JfSU5EOgorCQljYXNlIEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORDoKIAkJCWZ1bmMgPSBza19sb2FkX2J5dGU7CiAJCWNvbW1vbl9sb2FkX2luZDoKIAkJCS8qCkBAIC00NzMsMzEgKzQ2NiwzMSBAQAogCQkJUFBDX0JDQyhDT05EX0xULCBleGl0X2FkZHIpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBCUEZfU19MRFhfQl9NU0g6CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9CIHwgQlBGX01TSDoKIAkJCWZ1bmMgPSBDSE9PU0VfTE9BRF9GVU5DKEssIHNrX2xvYWRfYnl0ZV9tc2gpOwogCQkJZ290byBjb21tb25fbG9hZDsKIAkJCWJyZWFrOwogCiAJCQkvKioqIEp1bXAgYW5kIGJyYW5jaGVzICoqKi8KLQkJY2FzZSBCUEZfU19KTVBfSkE6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKIAkJCWlmIChLICE9IDApCiAJCQkJUFBDX0pNUChhZGRyc1tpICsgMSArIEtdKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgotCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6CiAJCQl0cnVlX2NvbmQgPSBDT05EX0dUOwogCQkJZ290byBjb25kX2JyYW5jaDsKLQkJY2FzZSBCUEZfU19KTVBfSkdFX0s6Ci0JCWNhc2UgQlBGX1NfSk1QX0pHRV9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfWDoKIAkJCXRydWVfY29uZCA9IENPTkRfR0U7CiAJCQlnb3RvIGNvbmRfYnJhbmNoOwotCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKLQkJY2FzZSBCUEZfU19KTVBfSkVRX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YOgogCQkJdHJ1ZV9jb25kID0gQ09ORF9FUTsKIAkJCWdvdG8gY29uZF9icmFuY2g7Ci0JCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKLQkJY2FzZSBCUEZfU19KTVBfSlNFVF9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9YOgogCQkJdHJ1ZV9jb25kID0gQ09ORF9ORTsKIAkJCS8qIEZhbGwgdGhyb3VnaCAqLwogCQljb25kX2JyYW5jaDoKQEAgLTUwOCwyMCArNTAxLDIwIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXN3aXRjaCAoZmlsdGVyW2ldLmNvZGUpIHsKLQkJCWNhc2UgQlBGX1NfSk1QX0pHVF9YOgotCQkJY2FzZSBCUEZfU19KTVBfSkdFX1g6Ci0JCQljYXNlIEJQRl9TX0pNUF9KRVFfWDoKKwkJCXN3aXRjaCAoY29kZSkgeworCQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgorCQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YOgorCQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YOgogCQkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCQkJUFBDX0NNUExXKHJfQSwgcl9YKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfSk1QX0pTRVRfWDoKKwkJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6CiAJCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJCQlQUENfQU5EX0RPVChyX3NjcmF0Y2gxLCByX0EsIHJfWCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKLQkJCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgotCQkJY2FzZSBCUEZfU19KTVBfSkdFX0s6CisJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6CisJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX0s6CisJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0s6CiAJCQkJaWYgKEsgPCAzMjc2OCkKIAkJCQkJUFBDX0NNUExXSShyX0EsIEspOwogCQkJCWVsc2UgewpAQCAtNTI5LDcgKzUyMiw3IEBACiAJCQkJCVBQQ19DTVBMVyhyX0EsIHJfc2NyYXRjaDEpOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKKwkJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0s6CiAJCQkJaWYgKEsgPCAzMjc2OCkKIAkJCQkJLyogUFBDX0FOREkgaXMgL29ubHkvIGRvdC1mb3JtICovCiAJCQkJCVBQQ19BTkRJKHJfc2NyYXRjaDEsIHJfQSwgSyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKaW5kZXggYmY5YzZkNC4uMzkxYjNmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtMTksNyArMTksNiBAQAogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FtaWdhb25lL0tjb25maWciCi1zb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWciCiAKIGNvbmZpZyBLVk1fR1VFU1QKIAlib29sICJLVk0gR3Vlc3Qgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKaW5kZXggNDNiNjVhZC4uYTQxYmQwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKQEAgLTE0OCwxMCArMTQ4LDYgQEAKIAlkZXBlbmRzIG9uIFBQQzY0ICYmIFBQQ19CT09LM1MKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBQUENfQTIKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfQk9PSzNFXzY0Ci0KIGNvbmZpZyBUVU5FX0NFTEwKIAlib29sICJPcHRpbWl6ZSBmb3IgQ2VsbCBCcm9hZGJhbmQgRW5naW5lIgogCWRlcGVuZHMgb24gUFBDNjQgJiYgUFBDX0JPT0szUwpAQCAtMjgwLDcgKzI3Niw3IEBACiAKIGNvbmZpZyBQUENfSUNTV1gKIAlib29sICJTdXBwb3J0IGZvciBQb3dlclBDIGljc3d4IGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIgotCWRlcGVuZHMgb24gUE9XRVI0IHx8IFBQQ19BMgorCWRlcGVuZHMgb24gUE9XRVI0CiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQppbmRleCA4NzliNGE0Li40NjllZjE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKQEAgLTIyLDQgKzIyLDMgQEAKIG9iai0kKENPTkZJR19QUENfUFMzKQkJKz0gcHMzLwogb2JqLSQoQ09ORklHX0VNQkVEREVENnh4KQkrPSBlbWJlZGRlZDZ4eC8KIG9iai0kKENPTkZJR19BTUlHQU9ORSkJCSs9IGFtaWdhb25lLwotb2JqLSQoQ09ORklHX1BQQ19XU1ApCQkrPSB3c3AvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IDBiYTNjOTUuLmJjZmQ2ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0zNSw3ICszNSw2IEBACiAjZGVmaW5lIFNQVUZTX1BTX01BUF9TSVpFCTB4MjAwMDAKICNkZWZpbmUgU1BVRlNfTUZDX01BUF9TSVpFCTB4MTAwMAogI2RlZmluZSBTUFVGU19DTlRMX01BUF9TSVpFCTB4MTAwMAotI2RlZmluZSBTUFVGU19DTlRMX01BUF9TSVpFCTB4MTAwMAogI2RlZmluZSBTUFVGU19TSUdOQUxfTUFQX1NJWkUJUEFHRV9TSVpFCiAjZGVmaW5lIFNQVUZTX01TU19NQVBfU0laRQkweDEwMDAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZwppbmRleCBjMjUyZWU5Li40NWE4ZWQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZwpAQCAtMTcsNiArMTcsNyBAQAogCXNlbGVjdCBDUFVfRlJFUV9HT1ZfVVNFUlNQQUNFCiAJc2VsZWN0IENQVV9GUkVRX0dPVl9PTkRFTUFORAogCXNlbGVjdCBDUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFCisJc2VsZWN0IFBQQ19ET09SQkVMTAogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX1BPV0VSTlZfUlRBUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlCmluZGV4IDRhZDBkMzQuLmQ1NTg5MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKQEAgLTEsOSArMSw5IEBACiBvYmoteQkJCSs9IHNldHVwLm8gb3BhbC10YWtlb3Zlci5vIG9wYWwtd3JhcHBlcnMubyBvcGFsLm8gb3BhbC1hc3luYy5vCiBvYmoteQkJCSs9IG9wYWwtcnRjLm8gb3BhbC1udnJhbS5vIG9wYWwtbHBjLm8gb3BhbC1mbGFzaC5vCiBvYmoteQkJCSs9IHJuZy5vIG9wYWwtZWxvZy5vIG9wYWwtZHVtcC5vIG9wYWwtc3lzcGFyYW0ubyBvcGFsLXNlbnNvci5vCi1vYmoteQkJCSs9IG9wYWwtbXNnbG9nLm8gc3ViY29yZS5vIHN1YmNvcmUtYXNtLm8KK29iai15CQkJKz0gb3BhbC1tc2dsb2cubwogCi1vYmotJChDT05GSUdfU01QKQkrPSBzbXAubworb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8gc3ViY29yZS5vIHN1YmNvcmUtYXNtLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaS1wNWlvYzIubyBwY2ktaW9kYS5vCiBvYmotJChDT05GSUdfRUVIKQkrPSBlZWgtaW9kYS5vIGVlaC1wb3dlcm52Lm8KIG9iai0kKENPTkZJR19QUENfU0NPTSkJKz0gb3BhbC14c2NvbS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvZWVoLWlvZGEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtaW9kYS5jCmluZGV4IDc1M2YwOGUuLjhhZDBjNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtaW9kYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtaW9kYS5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIHsKIAlzNjQgcmV0ID0gMDsKIAl1OCBmc3RhdGU7Ci0JdTE2IHBjaWVycjsKKwlfX2JlMTYgcGNpZXJyOwogCXUzMiBwZV9ubzsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBlLT5waGI7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAkJcmVzdWx0ID0gMDsKIAkJcmVzdWx0ICY9IH5FRUhfU1RBVEVfUkVTRVRfQUNUSVZFOwogCi0JCWlmIChwY2llcnIgIT0gT1BBTF9FRUhfUEhCX0VSUk9SKSB7CisJCWlmIChiZTE2X3RvX2NwdShwY2llcnIpICE9IE9QQUxfRUVIX1BIQl9FUlJPUikgewogCQkJcmVzdWx0IHw9IEVFSF9TVEFURV9NTUlPX0FDVElWRTsKIAkJCXJlc3VsdCB8PSBFRUhfU1RBVEVfRE1BX0FDVElWRTsKIAkJCXJlc3VsdCB8PSBFRUhfU1RBVEVfTU1JT19FTkFCTEVEOwpAQCAtNzA1LDE4ICs3MDUsMTkgQEAKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAJc3RydWN0IHBudl9waGIgKnBoYjsKLQlzdHJ1Y3QgZWVoX3BlICpwaGJfcGU7Ci0JdTY0IGZyb3plbl9wZV9ubzsKLQl1MTYgZXJyX3R5cGUsIHNldmVyaXR5OworCXN0cnVjdCBlZWhfcGUgKnBoYl9wZSwgKnBhcmVudF9wZTsKKwlfX2JlNjQgZnJvemVuX3BlX25vOworCV9fYmUxNiBlcnJfdHlwZSwgc2V2ZXJpdHk7CisJaW50IGFjdGl2ZV9mbGFncyA9IChFRUhfU1RBVEVfTU1JT19BQ1RJVkUgfCBFRUhfU1RBVEVfRE1BX0FDVElWRSk7CiAJbG9uZyByYzsKLQlpbnQgcmV0ID0gRUVIX05FWFRfRVJSX05PTkU7CisJaW50IHN0YXRlLCByZXQgPSBFRUhfTkVYVF9FUlJfTk9ORTsKIAogCS8qCiAJICogV2hpbGUgcnVubmluZyBoZXJlLCBpdCdzIHNhZmUgdG8gcHVyZ2UgdGhlIGV2ZW50IHF1ZXVlLgogCSAqIEFuZCB3ZSBzaG91bGQga2VlcCB0aGUgY2FjaGVkIE9QQUwgbm90aWZpZXIgZXZlbnQgc3ljaHJvbml6ZWQKIAkgKiBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIGZpcm13YXJlLgogCSAqLwotCWVlaF9yZW1vdmVfZXZlbnQoTlVMTCk7CisJZWVoX3JlbW92ZV9ldmVudChOVUxMLCBmYWxzZSk7CiAJb3BhbF9ub3RpZmllcl91cGRhdGVfZXZ0KE9QQUxfRVZFTlRfUENJX0VSUk9SLCAweDB1bCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvc2UsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewpAQCAtNzQyLDggKzc0Myw4IEBACiAJCX0KIAogCQkvKiBJZiB0aGUgUEhCIGRvZXNuJ3QgaGF2ZSBlcnJvciwgc3RvcCBwcm9jZXNzaW5nICovCi0JCWlmIChlcnJfdHlwZSA9PSBPUEFMX0VFSF9OT19FUlJPUiB8fAotCQkgICAgc2V2ZXJpdHkgPT0gT1BBTF9FRUhfU0VWX05PX0VSUk9SKSB7CisJCWlmIChiZTE2X3RvX2NwdShlcnJfdHlwZSkgPT0gT1BBTF9FRUhfTk9fRVJST1IgfHwKKwkJICAgIGJlMTZfdG9fY3B1KHNldmVyaXR5KSA9PSBPUEFMX0VFSF9TRVZfTk9fRVJST1IpIHsKIAkJCXByX2RldmVsKCIlczogTm8gZXJyb3IgZm91bmQgb24gUEhCIyV4XG4iLAogCQkJCSBfX2Z1bmNfXywgaG9zZS0+Z2xvYmFsX251bWJlcik7CiAJCQljb250aW51ZTsKQEAgLTc1NSwxNCArNzU2LDE0IEBACiAJCSAqIHNwZWNpZmljIFBIQi4KIAkJICovCiAJCXByX2RldmVsKCIlczogRXJyb3IgKCVkLCAlZCwgJWxsdSkgb24gUEhCIyV4XG4iLAotCQkJIF9fZnVuY19fLCBlcnJfdHlwZSwgc2V2ZXJpdHksCi0JCQkgZnJvemVuX3BlX25vLCBob3NlLT5nbG9iYWxfbnVtYmVyKTsKLQkJc3dpdGNoIChlcnJfdHlwZSkgeworCQkJIF9fZnVuY19fLCBiZTE2X3RvX2NwdShlcnJfdHlwZSksIGJlMTZfdG9fY3B1KHNldmVyaXR5KSwKKwkJCSBiZTY0X3RvX2NwdShmcm96ZW5fcGVfbm8pLCBob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJc3dpdGNoIChiZTE2X3RvX2NwdShlcnJfdHlwZSkpIHsKIAkJY2FzZSBPUEFMX0VFSF9JT0NfRVJST1I6Ci0JCQlpZiAoc2V2ZXJpdHkgPT0gT1BBTF9FRUhfU0VWX0lPQ19ERUFEKSB7CisJCQlpZiAoYmUxNl90b19jcHUoc2V2ZXJpdHkpID09IE9QQUxfRUVIX1NFVl9JT0NfREVBRCkgewogCQkJCXByX2VycigiRUVIOiBkZWFkIElPQyBkZXRlY3RlZFxuIik7CiAJCQkJcmV0ID0gRUVIX05FWFRfRVJSX0RFQURfSU9DOwotCQkJfSBlbHNlIGlmIChzZXZlcml0eSA9PSBPUEFMX0VFSF9TRVZfSU5GKSB7CisJCQl9IGVsc2UgaWYgKGJlMTZfdG9fY3B1KHNldmVyaXR5KSA9PSBPUEFMX0VFSF9TRVZfSU5GKSB7CiAJCQkJcHJfaW5mbygiRUVIOiBJT0MgaW5mb3JtYXRpdmUgZXJyb3IgIgogCQkJCQkiZGV0ZWN0ZWRcbiIpOwogCQkJCWlvZGFfZWVoX2h1Yl9kaWFnKGhvc2UpOwpAQCAtNzcxLDIwICs3NzIsMjYgQEAKIAogCQkJYnJlYWs7CiAJCWNhc2UgT1BBTF9FRUhfUEhCX0VSUk9SOgotCQkJaWYgKHNldmVyaXR5ID09IE9QQUxfRUVIX1NFVl9QSEJfREVBRCkgeworCQkJaWYgKGJlMTZfdG9fY3B1KHNldmVyaXR5KSA9PSBPUEFMX0VFSF9TRVZfUEhCX0RFQUQpIHsKIAkJCQkqcGUgPSBwaGJfcGU7Ci0JCQkJcHJfZXJyKCJFRUg6IGRlYWQgUEhCIyV4IGRldGVjdGVkXG4iLAotCQkJCQlob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJCQlwcl9lcnIoIkVFSDogZGVhZCBQSEIjJXggZGV0ZWN0ZWQsICIKKwkJCQkgICAgICAgImxvY2F0aW9uOiAlc1xuIiwKKwkJCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKKwkJCQkgICAgICAgZWVoX3BlX2xvY19nZXQocGhiX3BlKSk7CiAJCQkJcmV0ID0gRUVIX05FWFRfRVJSX0RFQURfUEhCOwotCQkJfSBlbHNlIGlmIChzZXZlcml0eSA9PSBPUEFMX0VFSF9TRVZfUEhCX0ZFTkNFRCkgeworCQkJfSBlbHNlIGlmIChiZTE2X3RvX2NwdShzZXZlcml0eSkgPT0KKwkJCQkJCU9QQUxfRUVIX1NFVl9QSEJfRkVOQ0VEKSB7CiAJCQkJKnBlID0gcGhiX3BlOwotCQkJCXByX2VycigiRUVIOiBmZW5jZWQgUEhCIyV4IGRldGVjdGVkXG4iLAotCQkJCQlob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJCQlwcl9lcnIoIkVFSDogRmVuY2VkIFBIQiMleCBkZXRlY3RlZCwgIgorCQkJCSAgICAgICAibG9jYXRpb246ICVzXG4iLAorCQkJCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAorCQkJCSAgICAgICBlZWhfcGVfbG9jX2dldChwaGJfcGUpKTsKIAkJCQlyZXQgPSBFRUhfTkVYVF9FUlJfRkVOQ0VEX1BIQjsKLQkJCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gT1BBTF9FRUhfU0VWX0lORikgeworCQkJfSBlbHNlIGlmIChiZTE2X3RvX2NwdShzZXZlcml0eSkgPT0gT1BBTF9FRUhfU0VWX0lORikgewogCQkJCXByX2luZm8oIkVFSDogUEhCIyV4IGluZm9ybWF0aXZlIGVycm9yICIKLQkJCQkJImRldGVjdGVkXG4iLAotCQkJCQlob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJCQkJImRldGVjdGVkLCBsb2NhdGlvbjogJXNcbiIsCisJCQkJCWhvc2UtPmdsb2JhbF9udW1iZXIsCisJCQkJCWVlaF9wZV9sb2NfZ2V0KHBoYl9wZSkpOwogCQkJCWlvZGFfZWVoX3BoYl9kaWFnKGhvc2UpOwogCQkJCXJldCA9IEVFSF9ORVhUX0VSUl9OT05FOwogCQkJfQpAQCAtNzkyLDM0ICs3OTksMzMgQEAKIAkJCWJyZWFrOwogCQljYXNlIE9QQUxfRUVIX1BFX0VSUk9SOgogCQkJLyoKLQkJCSAqIElmIHdlIGNhbid0IGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgUEUsIHRoZQotCQkJICogUEVFViAvIFBFU1Qgd291bGQgYmUgbWVzc3kuIFNvIHdlIGZvcmNlIGFuCi0JCQkgKiBmZW5jZWQgUEhCIHNvIHRoYXQgaXQgY2FuIGJlIHJlY292ZXJlZC4KLQkJCSAqCi0JCQkgKiBJZiB0aGUgUEUgaGFzIGJlZW4gbWFya2VkIGFzIGlzb2xhdGVkLCB0aGF0Ci0JCQkgKiBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgcGVybWFuZW50bHkgb3IgaW4KLQkJCSAqIHByb2dyZXNzIHdpdGggcmVjb3ZlcnkuIFdlIG5lZWRuJ3QgcmVwb3J0Ci0JCQkgKiBpdCBhZ2Fpbi4KKwkJCSAqIElmIHdlIGNhbid0IGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgUEUsIHdlCisJCQkgKiBqdXN0IHRyeSB0byB1bmZyZWV6ZS4KIAkJCSAqLwotCQkJaWYgKGlvZGFfZWVoX2dldF9wZShob3NlLCBmcm96ZW5fcGVfbm8sIHBlKSkgewotCQkJCSpwZSA9IHBoYl9wZTsKLQkJCQlwcl9lcnIoIkVFSDogRXNjYWxhdGVkIGZlbmNlZCBQSEIjJXggIgotCQkJCSAgICAgICAiZGV0ZWN0ZWQgZm9yIFBFIyVsbHhcbiIsCi0JCQkJCWhvc2UtPmdsb2JhbF9udW1iZXIsCi0JCQkJCWZyb3plbl9wZV9ubyk7Ci0JCQkJcmV0ID0gRUVIX05FWFRfRVJSX0ZFTkNFRF9QSEI7CisJCQlpZiAoaW9kYV9lZWhfZ2V0X3BlKGhvc2UsCisJCQkJCSAgICBiZTY0X3RvX2NwdShmcm96ZW5fcGVfbm8pLCBwZSkpIHsKKwkJCQkvKiBUcnkgYmVzdCB0byBjbGVhciBpdCAqLworCQkJCXByX2luZm8oIkVFSDogQ2xlYXIgbm9uLWV4aXN0aW5nIFBIQiMleC1QRSMlbGx4XG4iLAorCQkJCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBmcm96ZW5fcGVfbm8pOworCQkJCXByX2luZm8oIkVFSDogUEhCIGxvY2F0aW9uOiAlc1xuIiwKKwkJCQkJZWVoX3BlX2xvY19nZXQocGhiX3BlKSk7CisJCQkJb3BhbF9wY2lfZWVoX2ZyZWV6ZV9jbGVhcihwaGItPm9wYWxfaWQsIGZyb3plbl9wZV9ubywKKwkJCQkJT1BBTF9FRUhfQUNUSU9OX0NMRUFSX0ZSRUVaRV9BTEwpOworCQkJCXJldCA9IEVFSF9ORVhUX0VSUl9OT05FOwogCQkJfSBlbHNlIGlmICgoKnBlKS0+c3RhdGUgJiBFRUhfUEVfSVNPTEFURUQpIHsKIAkJCQlyZXQgPSBFRUhfTkVYVF9FUlJfTk9ORTsKIAkJCX0gZWxzZSB7CiAJCQkJcHJfZXJyKCJFRUg6IEZyb3plbiBQRSMleCBvbiBQSEIjJXggZGV0ZWN0ZWRcbiIsCiAJCQkJCSgqcGUpLT5hZGRyLCAoKnBlKS0+cGhiLT5nbG9iYWxfbnVtYmVyKTsKKwkJCQlwcl9lcnIoIkVFSDogUEUgbG9jYXRpb246ICVzLCBQSEIgbG9jYXRpb246ICVzXG4iLAorCQkJCQllZWhfcGVfbG9jX2dldCgqcGUpLCBlZWhfcGVfbG9jX2dldChwaGJfcGUpKTsKIAkJCQlyZXQgPSBFRUhfTkVYVF9FUlJfRlJPWkVOX1BFOwogCQkJfQogCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX3dhcm4oIiVzOiBVbmV4cGVjdGVkIGVycm9yIHR5cGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIGVycl90eXBlKTsKKwkJCQlfX2Z1bmNfXywgYmUxNl90b19jcHUoZXJyX3R5cGUpKTsKIAkJfQogCiAJCS8qCkBAIC04MzcsNiArODQzLDMxIEBACiAJCX0KIAogCQkvKgorCQkgKiBXZSBwcm9iYWJseSBoYXZlIHRoZSBmcm96ZW4gcGFyZW50IFBFIG91dCB0aGVyZSBhbmQKKwkJICogd2UgbmVlZCBoYXZlIHRvIGhhbmRsZSBmcm96ZW4gcGFyZW50IFBFIGZpcnN0bHkuCisJCSAqLworCQlpZiAocmV0ID09IEVFSF9ORVhUX0VSUl9GUk9aRU5fUEUpIHsKKwkJCXBhcmVudF9wZSA9ICgqcGUpLT5wYXJlbnQ7CisJCQl3aGlsZSAocGFyZW50X3BlKSB7CisJCQkJLyogSGl0IHRoZSBjZWlsaW5nID8gKi8KKwkJCQlpZiAocGFyZW50X3BlLT50eXBlICYgRUVIX1BFX1BIQikKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBGcm96ZW4gcGFyZW50IFBFID8gKi8KKwkJCQlzdGF0ZSA9IGlvZGFfZWVoX2dldF9zdGF0ZShwYXJlbnRfcGUpOworCQkJCWlmIChzdGF0ZSA+IDAgJiYKKwkJCQkgICAgKHN0YXRlICYgYWN0aXZlX2ZsYWdzKSAhPSBhY3RpdmVfZmxhZ3MpCisJCQkJCSpwZSA9IHBhcmVudF9wZTsKKworCQkJCS8qIE5leHQgcGFyZW50IGxldmVsICovCisJCQkJcGFyZW50X3BlID0gcGFyZW50X3BlLT5wYXJlbnQ7CisJCQl9CisKKwkJCS8qIFdlIHBvc3NpYmx5IG1pZ3JhdGUgdG8gYW5vdGhlciBQRSAqLworCQkJZWVoX3BlX3N0YXRlX21hcmsoKnBlLCBFRUhfUEVfSVNPTEFURUQpOworCQl9CisKKwkJLyoKIAkJICogSWYgd2UgaGF2ZSBubyBlcnJvcnMgb24gdGhlIHNwZWNpZmljIFBIQiBvciBvbmx5CiAJCSAqIGluZm9ybWF0aXZlIGVycm9yIHRoZXJlLCB3ZSBjb250aW51ZSBwb2tpbmcgaXQuCiAJCSAqIE90aGVyd2lzZSwgd2UgbmVlZCBhY3Rpb25zIHRvIGJlIHRha2VuIGJ5IHVwcGVyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1tc2dsb2cuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLW1zZ2xvZy5jCmluZGV4IDFiYjI1YjkuLjQ0ZWQ3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLW1zZ2xvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLW1zZ2xvZy5jCkBAIC0zNyw3ICszNyw4IEBACiB7CiAJc3RydWN0IG1lbWNvbnMgKm1jID0gYmluX2F0dHItPnByaXZhdGU7CiAJY29uc3QgY2hhciAqY29uYnVmOwotCXNpemVfdCByZXQsIGZpcnN0X3JlYWQgPSAwOworCXNzaXplX3QgcmV0OworCXNpemVfdCBmaXJzdF9yZWFkID0gMDsKIAl1aW50MzJfdCBvdXRfcG9zLCBhdmFpbDsKIAogCWlmICghbWMpCkBAIC02OSw2ICs3MCw5IEBACiAJCXRvICs9IGZpcnN0X3JlYWQ7CiAJCWNvdW50IC09IGZpcnN0X3JlYWQ7CiAJCXBvcyAtPSBhdmFpbDsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWdvdG8gb3V0OwogCX0KIAogCS8qIFNhbml0eSBjaGVjay4gVGhlIGZpcm13YXJlIHNob3VsZCBub3QgZG8gdGhpcyB0byB1cy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXN5c3BhcmFtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1zeXNwYXJhbS5jCmluZGV4IGQyMDJmOWIuLjlkMWFjZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXN5c3BhcmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtc3lzcGFyYW0uYwpAQCAtMjYwLDEwICsyNjAsMTAgQEAKIAkJCWF0dHJbaV0ua29ial9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJCQlicmVhazsKIAkJY2FzZSBPUEFMX1NZU1BBUkFNX1dSSVRFOgotCQkJYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5tb2RlID0gU19JV1VHTzsKKwkJCWF0dHJbaV0ua29ial9hdHRyLmF0dHIubW9kZSA9IFNfSVdVU1I7CiAJCQlicmVhazsKIAkJY2FzZSBPUEFMX1NZU1BBUkFNX1JXOgotCQkJYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTyB8IFNfSVdVR087CisJCQlhdHRyW2ldLmtvYmpfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMKaW5kZXggZWVmYmZjYy4uZjkxYTRlNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuYwpAQCAtMjA2LDcyICsyMDYsOTEgQEAKIAogCWRhdGEgPSAoc3RydWN0IE9wYWxJb1BoYjNFcnJvckRhdGEqKWNvbW1vbjsKIAlwcl9pbmZvKCJQSEIzIFBIQiMlZCBEaWFnLWRhdGEgKFZlcnNpb246ICVkKVxuIiwKLQkJaG9zZS0+Z2xvYmFsX251bWJlciwgY29tbW9uLT52ZXJzaW9uKTsKKwkJaG9zZS0+Z2xvYmFsX251bWJlciwgYmUzMl90b19jcHUoY29tbW9uLT52ZXJzaW9uKSk7CiAJaWYgKGRhdGEtPmJyZGdDdGwpCiAJCXByX2luZm8oImJyZGdDdGw6ICAgICAlMDh4XG4iLAotCQkJZGF0YS0+YnJkZ0N0bCk7CisJCQliZTMyX3RvX2NwdShkYXRhLT5icmRnQ3RsKSk7CiAJaWYgKGRhdGEtPnBvcnRTdGF0dXNSZWcgfHwgZGF0YS0+cm9vdENtcGx4U3RhdHVzIHx8CiAJICAgIGRhdGEtPmJ1c0FnZW50U3RhdHVzKQogCQlwcl9pbmZvKCJVdGxTdHM6ICAgICAgJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQlkYXRhLT5wb3J0U3RhdHVzUmVnLCBkYXRhLT5yb290Q21wbHhTdGF0dXMsCi0JCQlkYXRhLT5idXNBZ2VudFN0YXR1cyk7CisJCQliZTMyX3RvX2NwdShkYXRhLT5wb3J0U3RhdHVzUmVnKSwKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPnJvb3RDbXBseFN0YXR1cyksCisJCQliZTMyX3RvX2NwdShkYXRhLT5idXNBZ2VudFN0YXR1cykpOwogCWlmIChkYXRhLT5kZXZpY2VTdGF0dXMgfHwgZGF0YS0+c2xvdFN0YXR1cyAgIHx8CiAJICAgIGRhdGEtPmxpbmtTdGF0dXMgICB8fCBkYXRhLT5kZXZDbWRTdGF0dXMgfHwKIAkgICAgZGF0YS0+ZGV2U2VjU3RhdHVzKQogCQlwcl9pbmZvKCJSb290U3RzOiAgICAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCQkJZGF0YS0+ZGV2aWNlU3RhdHVzLCBkYXRhLT5zbG90U3RhdHVzLAotCQkJZGF0YS0+bGlua1N0YXR1cywgZGF0YS0+ZGV2Q21kU3RhdHVzLAotCQkJZGF0YS0+ZGV2U2VjU3RhdHVzKTsKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPmRldmljZVN0YXR1cyksCisJCQliZTMyX3RvX2NwdShkYXRhLT5zbG90U3RhdHVzKSwKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPmxpbmtTdGF0dXMpLAorCQkJYmUzMl90b19jcHUoZGF0YS0+ZGV2Q21kU3RhdHVzKSwKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPmRldlNlY1N0YXR1cykpOwogCWlmIChkYXRhLT5yb290RXJyb3JTdGF0dXMgfHwgZGF0YS0+dW5jb3JyRXJyb3JTdGF0dXMgfHwKIAkgICAgZGF0YS0+Y29yckVycm9yU3RhdHVzKQogCQlwcl9pbmZvKCJSb290RXJyU3RzOiAgJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQlkYXRhLT5yb290RXJyb3JTdGF0dXMsIGRhdGEtPnVuY29yckVycm9yU3RhdHVzLAotCQkJZGF0YS0+Y29yckVycm9yU3RhdHVzKTsKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPnJvb3RFcnJvclN0YXR1cyksCisJCQliZTMyX3RvX2NwdShkYXRhLT51bmNvcnJFcnJvclN0YXR1cyksCisJCQliZTMyX3RvX2NwdShkYXRhLT5jb3JyRXJyb3JTdGF0dXMpKTsKIAlpZiAoZGF0YS0+dGxwSGRyMSB8fCBkYXRhLT50bHBIZHIyIHx8CiAJICAgIGRhdGEtPnRscEhkcjMgfHwgZGF0YS0+dGxwSGRyNCkKIAkJcHJfaW5mbygiUm9vdEVyckxvZzogICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQlkYXRhLT50bHBIZHIxLCBkYXRhLT50bHBIZHIyLAotCQkJZGF0YS0+dGxwSGRyMywgZGF0YS0+dGxwSGRyNCk7CisJCQliZTMyX3RvX2NwdShkYXRhLT50bHBIZHIxKSwKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPnRscEhkcjIpLAorCQkJYmUzMl90b19jcHUoZGF0YS0+dGxwSGRyMyksCisJCQliZTMyX3RvX2NwdShkYXRhLT50bHBIZHI0KSk7CiAJaWYgKGRhdGEtPnNvdXJjZUlkIHx8IGRhdGEtPmVycm9yQ2xhc3MgfHwKIAkgICAgZGF0YS0+Y29ycmVsYXRvcikKIAkJcHJfaW5mbygiUm9vdEVyckxvZzE6ICUwOHggJTAxNmxseCAlMDE2bGx4XG4iLAotCQkJZGF0YS0+c291cmNlSWQsIGRhdGEtPmVycm9yQ2xhc3MsCi0JCQlkYXRhLT5jb3JyZWxhdG9yKTsKKwkJCWJlMzJfdG9fY3B1KGRhdGEtPnNvdXJjZUlkKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmVycm9yQ2xhc3MpLAorCQkJYmU2NF90b19jcHUoZGF0YS0+Y29ycmVsYXRvcikpOwogCWlmIChkYXRhLT5uRmlyKQogCQlwcl9pbmZvKCJuRmlyOiAgICAgICAgJTAxNmxseCAlMDE2bGx4ICUwMTZsbHhcbiIsCi0JCQlkYXRhLT5uRmlyLCBkYXRhLT5uRmlyTWFzaywKLQkJCWRhdGEtPm5GaXJXT0YpOworCQkJYmU2NF90b19jcHUoZGF0YS0+bkZpciksCisJCQliZTY0X3RvX2NwdShkYXRhLT5uRmlyTWFzayksCisJCQliZTY0X3RvX2NwdShkYXRhLT5uRmlyV09GKSk7CiAJaWYgKGRhdGEtPnBoYlBsc3NyIHx8IGRhdGEtPnBoYkNzcikKIAkJcHJfaW5mbygiUGhiU3RzOiAgICAgICUwMTZsbHggJTAxNmxseFxuIiwKLQkJCWRhdGEtPnBoYlBsc3NyLCBkYXRhLT5waGJDc3IpOworCQkJYmU2NF90b19jcHUoZGF0YS0+cGhiUGxzc3IpLAorCQkJYmU2NF90b19jcHUoZGF0YS0+cGhiQ3NyKSk7CiAJaWYgKGRhdGEtPmxlbUZpcikKIAkJcHJfaW5mbygiTGVtOiAgICAgICAgICUwMTZsbHggJTAxNmxseCAlMDE2bGx4XG4iLAotCQkJZGF0YS0+bGVtRmlyLCBkYXRhLT5sZW1FcnJvck1hc2ssCi0JCQlkYXRhLT5sZW1XT0YpOworCQkJYmU2NF90b19jcHUoZGF0YS0+bGVtRmlyKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmxlbUVycm9yTWFzayksCisJCQliZTY0X3RvX2NwdShkYXRhLT5sZW1XT0YpKTsKIAlpZiAoZGF0YS0+cGhiRXJyb3JTdGF0dXMpCiAJCXByX2luZm8oIlBoYkVycjogICAgICAlMDE2bGx4ICUwMTZsbHggJTAxNmxseCAlMDE2bGx4XG4iLAotCQkJZGF0YS0+cGhiRXJyb3JTdGF0dXMsIGRhdGEtPnBoYkZpcnN0RXJyb3JTdGF0dXMsCi0JCQlkYXRhLT5waGJFcnJvckxvZzAsIGRhdGEtPnBoYkVycm9yTG9nMSk7CisJCQliZTY0X3RvX2NwdShkYXRhLT5waGJFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5waGJGaXJzdEVycm9yU3RhdHVzKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPnBoYkVycm9yTG9nMCksCisJCQliZTY0X3RvX2NwdShkYXRhLT5waGJFcnJvckxvZzEpKTsKIAlpZiAoZGF0YS0+bW1pb0Vycm9yU3RhdHVzKQogCQlwcl9pbmZvKCJPdXRFcnI6ICAgICAgJTAxNmxseCAlMDE2bGx4ICUwMTZsbHggJTAxNmxseFxuIiwKLQkJCWRhdGEtPm1taW9FcnJvclN0YXR1cywgZGF0YS0+bW1pb0ZpcnN0RXJyb3JTdGF0dXMsCi0JCQlkYXRhLT5tbWlvRXJyb3JMb2cwLCBkYXRhLT5tbWlvRXJyb3JMb2cxKTsKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPm1taW9FcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5tbWlvRmlyc3RFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5tbWlvRXJyb3JMb2cwKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPm1taW9FcnJvckxvZzEpKTsKIAlpZiAoZGF0YS0+ZG1hMEVycm9yU3RhdHVzKQogCQlwcl9pbmZvKCJJbkFFcnI6ICAgICAgJTAxNmxseCAlMDE2bGx4ICUwMTZsbHggJTAxNmxseFxuIiwKLQkJCWRhdGEtPmRtYTBFcnJvclN0YXR1cywgZGF0YS0+ZG1hMEZpcnN0RXJyb3JTdGF0dXMsCi0JCQlkYXRhLT5kbWEwRXJyb3JMb2cwLCBkYXRhLT5kbWEwRXJyb3JMb2cxKTsKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmRtYTBFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5kbWEwRmlyc3RFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5kbWEwRXJyb3JMb2cwKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmRtYTBFcnJvckxvZzEpKTsKIAlpZiAoZGF0YS0+ZG1hMUVycm9yU3RhdHVzKQogCQlwcl9pbmZvKCJJbkJFcnI6ICAgICAgJTAxNmxseCAlMDE2bGx4ICUwMTZsbHggJTAxNmxseFxuIiwKLQkJCWRhdGEtPmRtYTFFcnJvclN0YXR1cywgZGF0YS0+ZG1hMUZpcnN0RXJyb3JTdGF0dXMsCi0JCQlkYXRhLT5kbWExRXJyb3JMb2cwLCBkYXRhLT5kbWExRXJyb3JMb2cxKTsKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmRtYTFFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5kbWExRmlyc3RFcnJvclN0YXR1cyksCisJCQliZTY0X3RvX2NwdShkYXRhLT5kbWExRXJyb3JMb2cwKSwKKwkJCWJlNjRfdG9fY3B1KGRhdGEtPmRtYTFFcnJvckxvZzEpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBPUEFMX1BIQjNfTlVNX1BFU1RfUkVHUzsgaSsrKSB7Ci0JCWlmICgoZGF0YS0+cGVzdEFbaV0gPj4gNjMpID09IDAgJiYKLQkJICAgIChkYXRhLT5wZXN0QltpXSA+PiA2MykgPT0gMCkKKwkJaWYgKChiZTY0X3RvX2NwdShkYXRhLT5wZXN0QVtpXSkgPj4gNjMpID09IDAgJiYKKwkJICAgIChiZTY0X3RvX2NwdShkYXRhLT5wZXN0QltpXSkgPj4gNjMpID09IDApCiAJCQljb250aW51ZTsKIAogCQlwcl9pbmZvKCJQRVslM2RdIEEvQjogJTAxNmxseCAlMDE2bGx4XG4iLAotCQkJaSwgZGF0YS0+cGVzdEFbaV0sIGRhdGEtPnBlc3RCW2ldKTsKKwkJCQlpLCBiZTY0X3RvX2NwdShkYXRhLT5wZXN0QVtpXSksCisJCQkJYmU2NF90b19jcHUoZGF0YS0+cGVzdEJbaV0pKTsKIAl9CiB9CiAKQEAgLTI4NCw3ICszMDMsNyBAQAogCQlyZXR1cm47CiAKIAljb21tb24gPSAoc3RydWN0IE9wYWxJb1BoYkVycm9yQ29tbW9uICopbG9nX2J1ZmY7Ci0Jc3dpdGNoIChjb21tb24tPmlvVHlwZSkgeworCXN3aXRjaCAoYmUzMl90b19jcHUoY29tbW9uLT5pb1R5cGUpKSB7CiAJY2FzZSBPUEFMX1BIQl9FUlJPUl9EQVRBX1RZUEVfUDdJT0M6CiAJCXBudl9wY2lfZHVtcF9wN2lvY19kaWFnX2RhdGEoaG9zZSwgY29tbW9uKTsKIAkJYnJlYWs7CkBAIC0yOTMsNyArMzEyLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfd2FybigiJXM6IFVucmVjb2duaXplZCBpb1R5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY29tbW9uLT5pb1R5cGUpOworCQkJX19mdW5jX18sIGJlMzJfdG9fY3B1KGNvbW1vbi0+aW9UeXBlKSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jCmluZGV4IDhjMTZhNWYuLmQ5Yjg4ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jCkBAIC0zNSwxMSArMzUsMTQgQEAKICNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS9vcGFsLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAjaW5jbHVkZSAicG93ZXJudi5oIgogCiBzdGF0aWMgdm9pZCBfX2luaXQgcG52X3NldHVwX2FyY2godm9pZCkKIHsKKwlzZXRfYXJjaF9wYW5pY190aW1lb3V0KDEwLCBBUkNIX1BBTklDX1RJTUVPVVQpOworCiAJLyogSW5pdGlhbGl6ZSBTTVAgKi8KIAlwbnZfc21wX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jCmluZGV4IDAwNjJhNDMuLjVmY2ZjZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vb3BhbC5oPgogI2luY2x1ZGUgPGFzbS9ydW5sYXRjaC5oPgogI2luY2x1ZGUgPGFzbS9jb2RlLXBhdGNoaW5nLmg+CisjaW5jbHVkZSA8YXNtL2RiZWxsLmg+CiAKICNpbmNsdWRlICJwb3dlcm52LmgiCiAKQEAgLTQ2LDYgKzQ3LDExIEBACiB7CiAJaWYgKGNwdSAhPSBib290X2NwdWlkKQogCQl4aWNzX3NldHVwX2NwdSgpOworCisjaWZkZWYgQ09ORklHX1BQQ19ET09SQkVMTAorCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EQkVMTCkpCisJCWRvb3JiZWxsX3NldHVwX3RoaXNfY3B1KCk7CisjZW5kaWYKIH0KIAogaW50IHBudl9zbXBfa2lja19jcHUoaW50IG5yKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwppbmRleCAyY2I4Yjc3Li43NTZiNDgyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwpAQCAtMjEsNiArMjEsNyBAQAogCXNlbGVjdCBIQVZFX0NPTlRFWFRfVFJBQ0tJTkcKIAlzZWxlY3QgSE9UUExVR19DUFUgaWYgU01QCiAJc2VsZWN0IEFSQ0hfUkFORE9NCisJc2VsZWN0IFBQQ19ET09SQkVMTAogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX1NQTFBBUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmExNzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWNvbmZpZyBQUENfV1NQCi0JYm9vbAotCXNlbGVjdCBQUENfQTIKLQlzZWxlY3QgR0VORVJJQ19UQlNZTkMKLQlzZWxlY3QgUFBDX0lDU1dYCi0Jc2VsZWN0IFBQQ19TQ09NCi0Jc2VsZWN0IFBQQ19YSUNTCi0Jc2VsZWN0IFBQQ19JQ1BfTkFUSVZFCi0Jc2VsZWN0IFBDSQotCXNlbGVjdCBQUENfSU9fV09SS0FST1VORFMgaWYgUENJCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QSU8gaWYgUENJCi0JZGVmYXVsdCBuCi0KLW1lbnUgIldTUCBwbGF0Zm9ybSBzZWxlY3Rpb24iCi0JZGVwZW5kcyBvbiBQUENfQk9PSzNFXzY0Ci0KLWNvbmZpZyBQUENfUFNSMgotCWJvb2wgIlBvd2VyRU4gU3lzdGVtIFJlZmVyZW5jZSBQbGF0Zm9ybSAyIgotCXNlbGVjdCBFUEFQUl9CT09UCi0Jc2VsZWN0IFBQQ19XU1AKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19DSFJPTUEKLQlib29sICJQb3dlckVOIFBDSWUgQ2hyb21hIENhcmQiCi0Jc2VsZWN0IEVQQVBSX0JPT1QKLQlzZWxlY3QgUFBDX1dTUAotCXNlbGVjdCBPRl9EWU5BTUlDCi0JZGVmYXVsdCB5Ci0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmZjNjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1jY2ZsYWdzLXkJCQkrPSAkKE5PX01JTklNQUxfVE9DKQotCi1vYmoteQkJCQkrPSBzZXR1cC5vIGljcy5vIHdzcC5vCi1vYmotJChDT05GSUdfUFBDX1BTUjIpCQkrPSBwc3IyLm8KLW9iai0kKENPTkZJR19QUENfQ0hST01BKQkrPSBjaHJvbWEubyBoOC5vCi1vYmotJChDT05GSUdfUFBDX1dTUCkJCSs9IG9wYl9waWMubwotb2JqLSQoQ09ORklHX1BQQ19XU1ApCQkrPSBzY29tX3dzcC5vCi1vYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc2NvbV9zbXAubwotb2JqLSQoQ09ORklHX1BDSSkJCSs9IHdzcF9wY2kubwotb2JqLSQoQ09ORklHX1BDSV9NU0kpCQkrPSBtc2kubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvY2hyb21hLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9jaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhNDZiMy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9jaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDExLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotCi0jaW5jbHVkZSAiaWNzLmgiCi0jaW5jbHVkZSAid3NwLmgiCi0KLXZvaWQgX19pbml0IGNocm9tYV9zZXR1cF9hcmNoKHZvaWQpCi17Ci0Jd3NwX3NldHVwX2FyY2goKTsKLQl3c3Bfc2V0dXBfaDgoKTsKLQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjaHJvbWFfcHJvYmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiaWJtLHdzcC1jaHJvbWEiKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotZGVmaW5lX21hY2hpbmUoY2hyb21hX21kKSB7Ci0JLm5hbWUJCQk9ICJDaHJvbWEgUENJZSIsCi0JLnByb2JlCQkJPSBjaHJvbWFfcHJvYmUsCi0JLnNldHVwX2FyY2gJCT0gY2hyb21hX3NldHVwX2FyY2gsCi0JLnJlc3RhcnQJCT0gd3NwX2g4X3Jlc3RhcnQsCi0JLnBvd2VyX29mZgkJPSB3c3BfaDhfcG93ZXJfb2ZmLAotCS5oYWx0CQkJPSB3c3BfaGFsdCwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLQkuaW5pdF9JUlEJCT0gd3NwX3NldHVwX2lycSwKLQkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKLQkucG93ZXJfc2F2ZQkJPSBib29rM2VfaWRsZSwKLX07Ci0KLW1hY2hpbmVfYXJjaF9pbml0Y2FsbChjaHJvbWFfbWQsIHdzcF9wcm9iZV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2g4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9oOC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M4N2YzLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2g4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMTEsIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Ci0KLSNpbmNsdWRlICJ3c3AuaCIKLQotLyoKLSAqIFRoZSBVQVJUIGNvbm5lY3Rpb24gdG8gdGhlIEg4IGlzIG92ZXIgdHR5UzEgd2hpY2ggaXMganVzdCBhIDE2NTUwLgotICogV2UgYXNzdW1lIHRoYXQgRlcgaGFzIGl0IHNldHVwIHJpZ2h0IGFuZCBubyBvbmUgbWVzc2VzIHdpdGggaXQuCi0gKi8KLQotCi1zdGF0aWMgdTggX19pb21lbSAqaDg7Ci0KLSNkZWZpbmUgUkJSIDAJCS8qIFJlY2VpdmVyIEJ1ZmZlciBSZWdpc3RlciAqLwotI2RlZmluZSBUSFIgMAkJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLwotI2RlZmluZSBMU1IgNQkJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTFNSX0RSIDB4MDEJLyogTFNSIHZhbHVlIGZvciBEYXRhLVJlYWR5ICovCi0jZGVmaW5lIExTUl9USFJFIDB4MjAJLyogTFNSIHZhbHVlIGZvciBUcmFuc21pdHRlci1Ib2xkaW5nLVJlZ2lzdGVyLUVtcHR5ICovCi1zdGF0aWMgdm9pZCB3c3BfaDhfcHV0YyhpbnQgYykKLXsKLQl1OCBsc3I7Ci0KLQlkbyB7Ci0JCWxzciA9IHJlYWRiKGg4ICsgTFNSKTsKLQl9IHdoaWxlICgobHNyICYgTFNSX1RIUkUpICE9IExTUl9USFJFKTsKLQl3cml0ZWIoYywgaDggKyBUSFIpOwotfQotCi1zdGF0aWMgaW50IHdzcF9oOF9nZXRjKHZvaWQpCi17Ci0JdTggbHNyOwotCi0JZG8gewotCQlsc3IgPSByZWFkYihoOCArIExTUik7Ci0JfSB3aGlsZSAoKGxzciAmIExTUl9EUikgIT0gTFNSX0RSKTsKLQotCXJldHVybiByZWFkYihoOCArIFJCUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdzcF9oOF9wdXRzKGNvbnN0IGNoYXIgKnMsIGludCBzeikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzejsgaSsrKSB7Ci0JCXdzcF9oOF9wdXRjKHNbaV0pOwotCi0JCS8qIG5vIGZsb3cgY29udHJvbCBzbyB3YWl0IGZvciBlY2hvICovCi0JCXdzcF9oOF9nZXRjKCk7Ci0JfQotCXdzcF9oOF9wdXRjKCdccicpOwotCXdzcF9oOF9wdXRjKCdcbicpOwotfQotCi1zdGF0aWMgdm9pZCB3c3BfaDhfdGVybWluYWxfY21kKGNvbnN0IGNoYXIgKmNtZCwgaW50IHN6KQotewotCWhhcmRfaXJxX2Rpc2FibGUoKTsKLQl3c3BfaDhfcHV0cyhjbWQsIHN6KTsKLQkvKiBzaG91bGQgbmV2ZXIgcmV0dXJuLCBidXQganVzdCBpbiBjYXNlICovCi0JZm9yICg7OykKLQkJY29udGludWU7Ci19Ci0KLQotdm9pZCB3c3BfaDhfcmVzdGFydChjaGFyICpjbWQpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgcmVzdGFydFtdID0gIndhcm0tcmVzZXQiOwotCi0JKHZvaWQpY21kOwotCXdzcF9oOF90ZXJtaW5hbF9jbWQocmVzdGFydCwgc2l6ZW9mKHJlc3RhcnQpIC0gMSk7Ci19Ci0KLXZvaWQgd3NwX2g4X3Bvd2VyX29mZih2b2lkKQotewotCXN0YXRpYyBjb25zdCBjaGFyIG9mZltdID0gInBvd2VyLW9mZiI7Ci0KLQl3c3BfaDhfdGVybWluYWxfY21kKG9mZiwgc2l6ZW9mKG9mZikgLSAxKTsKLX0KLQotc3RhdGljIHZvaWQgX19pb21lbSAqd3NwX2g4X2dldGFkZHIodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsaWFzZXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICp1YXJ0OwotCXN0cnVjdCBwcm9wZXJ0eSAqcGF0aDsKLQl2b2lkIF9faW9tZW0gKnZhID0gTlVMTDsKLQotCS8qCi0JICogdGhlcmUgaXMgbm90aGluZyBpbiB0aGUgZGV2dHJlZSB0byB0ZWxsIHVzIHdoaWNoIGlzIG1hcHBlZAotCSAqIHRvIHRoZSBIOCwgYnV0IHNlIGtub3cgaXQgaXMgdGhlIHNlY29uZCBzZXJpYWwgcG9ydC4KLQkgKi8KLQotCWFsaWFzZXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2FsaWFzZXMiKTsKLQlpZiAoYWxpYXNlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXBhdGggPSBvZl9maW5kX3Byb3BlcnR5KGFsaWFzZXMsICJzZXJpYWwxIiwgTlVMTCk7Ci0JaWYgKHBhdGggPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQl1YXJ0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocGF0aC0+dmFsdWUpOwotCWlmICh1YXJ0ID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JdmEgPSBvZl9pb21hcCh1YXJ0LCAwKTsKLQotCS8qIHJlbW92ZSBpdCBzbyBubyBvbmUgbWVzc2VzIHdpdGggaXQgKi8KLQlvZl9kZXRhY2hfbm9kZSh1YXJ0KTsKLQlvZl9ub2RlX3B1dCh1YXJ0KTsKLQotb3V0OgotCW9mX25vZGVfcHV0KGFsaWFzZXMpOwotCi0JcmV0dXJuIHZhOwotfQotCi12b2lkIF9faW5pdCB3c3Bfc2V0dXBfaDgodm9pZCkKLXsKLQloOCA9IHdzcF9oOF9nZXRhZGRyKCk7Ci0KLQkvKiBEZXZ0cmVlIGNoYW5nZT8gbGV0cyBoYXJkIG1hcCBpdCBhbnl3YXkgKi8KLQlpZiAoaDggPT0gTlVMTCkgewotCQlwcl93YXJuKCJVQVJUIHRvIEg4IGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotCQloOCA9IGlvcmVtYXAoMHhmZmMwMDA4MDAwVUxMLCAweDEwMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkOTJlNi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAxMSBJQk0gQ29ycG9yYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tc2kuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS94aWNzLmg+Ci0KLSNpbmNsdWRlICJ3c3AuaCIKLSNpbmNsdWRlICJpY3MuaCIKLQotCi0vKiBXU1AgSUNTICovCi0KLXN0cnVjdCB3c3BfaWNzIHsKLQlzdHJ1Y3QgaWNzIGljczsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCXZvaWQgX19pb21lbSAqcmVnczsKLQlzcGlubG9ja190IGxvY2s7Ci0JdW5zaWduZWQgbG9uZyAqYml0bWFwOwotCXUzMiBjaGlwX2lkOwotCXUzMiBsc2lfYmFzZTsKLQl1MzIgbHNpX2NvdW50OwotCXU2NCBod2lycV9zdGFydDsKLQl1NjQgY291bnQ7Ci0jaWZkZWYgQ09ORklHX1NNUAotCWludCAqaHdpcnFfY3B1X21hcDsKLSNlbmRpZgotfTsKLQotI2RlZmluZSB0b193c3BfaWNzKGljcykJY29udGFpbmVyX29mKGljcywgc3RydWN0IHdzcF9pY3MsIGljcykKLQotI2RlZmluZSBJTlRfU1JDX0xBWUVSX0JVSURfUkVHKGJhc2UpCSgoYmFzZSkgKyAweDAwKQotI2RlZmluZSBJT0RBX1RCTF9BRERSX1JFRyhiYXNlKQkJKChiYXNlKSArIDB4MTgpCi0jZGVmaW5lIElPREFfVEJMX0RBVEFfUkVHKGJhc2UpCQkoKGJhc2UpICsgMHgyMCkKLSNkZWZpbmUgWElWRV9VUERBVEVfUkVHKGJhc2UpCQkoKGJhc2UpICsgMHgyOCkKLSNkZWZpbmUgSUNTX0lOVF9DQVBTX1JFRyhiYXNlKQkJKChiYXNlKSArIDB4MzApCi0KLSNkZWZpbmUgVEJMX0FVVE9fSU5DUkVNRU5UCSgoMVVMIDw8IDYzKSB8ICgxVUwgPDwgMTUpKQotI2RlZmluZSBUQkxfU0VMRUNUX1hJU1QJCSgxVUwgPDwgNDgpCi0jZGVmaW5lIFRCTF9TRUxFQ1RfWElWVAkJKDFVTCA8PCA0OSkKLQotI2RlZmluZSBJT0RBX0lSUShpcnEpCQkoKGlycSkgJiAoMHg3RkZVTEwpKQkvKiBIUk0gNS4xLjMuNCAqLwotCi0jZGVmaW5lIFhJU1RfUkVRVUlSRUQJCTB4OAotI2RlZmluZSBYSVNUX1JFSkVDVEVECQkweDQKLSNkZWZpbmUgWElTVF9QUkVTRU5URUQJCTB4MgotI2RlZmluZSBYSVNUX1BFTkRJTkcJCTB4MQotCi0jZGVmaW5lIFhJVkVfU0VSVkVSX1NISUZUCTQyCi0jZGVmaW5lIFhJVkVfU0VSVkVSX01BU0sJMHhGRkZGVUxMCi0jZGVmaW5lIFhJVkVfUFJJT1JJVFlfTUFTSwkweEZGVUxMCi0jZGVmaW5lIFhJVkVfUFJJT1JJVFlfU0hJRlQJMzIKLSNkZWZpbmUgWElWRV9XUklURV9FTkFCTEUJKDFVTEwgPDwgNjMpCi0KLS8qCi0gKiBUaGUgZG9jcyByZWZlciB0byBhIDYgYml0IGZpZWxkIGNhbGxlZCBDaGlwSUQsIHdoaWNoIGNvbnNpc3RzIG9mIGEKLSAqIDMgYml0IE5vZGVJRCBhbmQgYSAzIGJpdCBDaGlwSUQuIE9uIFdTUCB0aGUgQ2hpcElEIGlzIGFsd2F5cyB6ZXJvCi0gKiBzbyB3ZSBpZ25vcmUgaXQsIGFuZCBldmVyeSB3aGVyZSB3ZSB1c2UgImNoaXAgaWQiIGluIHRoaXMgY29kZSB3ZQotICogbWVhbiB0aGUgTm9kZUlELgotICovCi0jZGVmaW5lIFdTUF9JQ1NfQ0hJUF9TSElGVAkJMTcKLQotCi1zdGF0aWMgc3RydWN0IHdzcF9pY3MgKmljc19saXN0Owotc3RhdGljIGludCBudW1faWNzOwotCi0vKiBJQ1MgU291cmNlIGNvbnRyb2xsZXIgYWNjZXNzb3JzICovCi0KLXN0YXRpYyB1NjQgd3NwX2ljc19nZXRfeGl2ZShzdHJ1Y3Qgd3NwX2ljcyAqaWNzLCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTY0IHhpdmU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWNzLT5sb2NrLCBmbGFncyk7Ci0Jb3V0X2JlNjQoSU9EQV9UQkxfQUREUl9SRUcoaWNzLT5yZWdzKSwgVEJMX1NFTEVDVF9YSVZUIHwgSU9EQV9JUlEoaXJxKSk7Ci0JeGl2ZSA9IGluX2JlNjQoSU9EQV9UQkxfREFUQV9SRUcoaWNzLT5yZWdzKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWNzLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4geGl2ZTsKLX0KLQotc3RhdGljIHZvaWQgd3NwX2ljc19zZXRfeGl2ZShzdHJ1Y3Qgd3NwX2ljcyAqaWNzLCB1bnNpZ25lZCBpbnQgaXJxLCB1NjQgeGl2ZSkKLXsKLQl4aXZlICY9IH5YSVZFX0FERFJfTUFTSzsKLQl4aXZlIHw9IChpcnEgJiBYSVZFX0FERFJfTUFTSyk7Ci0JeGl2ZSB8PSBYSVZFX1dSSVRFX0VOQUJMRTsKLQotCW91dF9iZTY0KFhJVkVfVVBEQVRFX1JFRyhpY3MtPnJlZ3MpLCB4aXZlKTsKLX0KLQotc3RhdGljIHU2NCB4aXZlX3NldF9zZXJ2ZXIodTY0IHhpdmUsIHVuc2lnbmVkIGludCBzZXJ2ZXIpCi17Ci0JdTY0IG1hc2sgPSB+KFhJVkVfU0VSVkVSX01BU0sgPDwgWElWRV9TRVJWRVJfU0hJRlQpOwotCi0JeGl2ZSAmPSBtYXNrOwotCXhpdmUgfD0gKHNlcnZlciAmIFhJVkVfU0VSVkVSX01BU0spIDw8IFhJVkVfU0VSVkVSX1NISUZUOwotCi0JcmV0dXJuIHhpdmU7Ci19Ci0KLXN0YXRpYyB1NjQgeGl2ZV9zZXRfcHJpb3JpdHkodTY0IHhpdmUsIHVuc2lnbmVkIGludCBwcmlvcml0eSkKLXsKLQl1NjQgbWFzayA9IH4oWElWRV9QUklPUklUWV9NQVNLIDw8IFhJVkVfUFJJT1JJVFlfU0hJRlQpOwotCi0JeGl2ZSAmPSBtYXNrOwotCXhpdmUgfD0gKHByaW9yaXR5ICYgWElWRV9QUklPUklUWV9NQVNLKSA8PCBYSVZFX1BSSU9SSVRZX1NISUZUOwotCi0JcmV0dXJuIHhpdmU7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19TTVAKLS8qIEZpbmQgbG9naWNhbCBDUFVzIHdpdGhpbiBtYXNrIG9uIGEgZ2l2ZW4gY2hpcCBhbmQgc3RvcmUgcmVzdWx0IGluIHJldCAqLwotdm9pZCBjcHVzX29uX2NoaXAoaW50IGNoaXBfaWQsIGNwdW1hc2tfdCAqbWFzaywgY3B1bWFza190ICpyZXQpCi17Ci0JaW50IGNwdSwgY2hpcDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9kbiwgKmRuOwotCWNvbnN0IHUzMiAqcHJvcDsKLQotCWNwdW1hc2tfY2xlYXIocmV0KTsKLQlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7Ci0JCWNwdV9kbiA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpOwotCQlpZiAoIWNwdV9kbikKLQkJCWNvbnRpbnVlOwotCi0JCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoY3B1X2RuLCAiYXQtbm9kZSIsIE5VTEwpOwotCQlpZiAoIXByb3ApIHsKLQkJCW9mX25vZGVfcHV0KGNwdV9kbik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWRuID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnByb3ApOwotCQlvZl9ub2RlX3B1dChjcHVfZG4pOwotCi0JCWNoaXAgPSB3c3BfZ2V0X2NoaXBfaWQoZG4pOwotCQlpZiAoY2hpcCA9PSBjaGlwX2lkKQotCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgcmV0KTsKLQotCQlvZl9ub2RlX3B1dChkbik7Ci0JfQotfQotCi0vKiBTdG9yZSBhIHN1aXRhYmxlIENQVSB0byBoYW5kbGUgYSBod2lycSBpbiB0aGUgaWNzLT5od2lycV9jcHVfbWFwIGNhY2hlICovCi1zdGF0aWMgaW50IGNhY2hlX2h3aXJxX21hcChzdHJ1Y3Qgd3NwX2ljcyAqaWNzLCB1bnNpZ25lZCBpbnQgaHdpcnEsCi0JCQkgICBjb25zdCBjcHVtYXNrX3QgKmFmZmluaXR5KQotewotCWNwdW1hc2tfdmFyX3QgYXZhaWwsIG5ld21hc2s7Ci0JaW50IHJldCA9IC1FTk9NRU0sIGNwdSwgY3B1X3JvdmVyID0gMCwgdGFyZ2V0OwotCWludCBpbmRleCA9IGh3aXJxIC0gaWNzLT5od2lycV9zdGFydDsKLQl1bnNpZ25lZCBpbnQgbm9kZWlkOwotCi0JQlVHX09OKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpY3MtPmNvdW50KTsKLQotCWlmICghaWNzLT5od2lycV9jcHVfbWFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghZGlzdHJpYnV0ZV9pcnFzKSB7Ci0JCWljcy0+aHdpcnFfY3B1X21hcFtod2lycSAtIGljcy0+aHdpcnFfc3RhcnRdID0geGljc19kZWZhdWx0X3NlcnZlcjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogQWxsb2NhdGUgbmVlZGVkIENQVSBtYXNrcyAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmF2YWlsLCBHRlBfS0VSTkVMKSkKLQkJZ290byByZXQ7Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbmV3bWFzaywgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZnJlZWF2YWlsOwotCi0JLyogRmluZCBQQnVzIGF0dGFjaGVkIHRvIHRoZSBzb3VyY2Ugb2YgdGhpcyBJUlEgKi8KLQlub2RlaWQgPSAoaHdpcnEgPj4gV1NQX0lDU19DSElQX1NISUZUKSAmIDB4MzsgLyogMTI6MTQgKi8KLQotCS8qIEZpbmQgQ1BVcyB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIElSUSAqLwotCWlmIChhZmZpbml0eSkKLQkJY3B1bWFza19hbmQoYXZhaWwsIGNwdV9vbmxpbmVfbWFzaywgYWZmaW5pdHkpOwotCWVsc2UKLQkJY3B1bWFza19jb3B5KGF2YWlsLCBjcHVfb25saW5lX21hc2spOwotCi0JLyogTmFycm93IHNlbGVjdGlvbiBkb3duIHRvIGxvZ2ljYWwgQ1BVcyBvbiB0aGUgc2FtZSBjaGlwICovCi0JY3B1c19vbl9jaGlwKG5vZGVpZCwgYXZhaWwsIG5ld21hc2spOwotCi0JLyogRW5zdXJlIHdlIGhhdmVuJ3QgbmFycm93ZWQgaXQgZG93biB0byAwICovCi0JaWYgKHVubGlrZWx5KGNwdW1hc2tfZW1wdHkobmV3bWFzaykpKSB7Ci0JCWlmICh1bmxpa2VseShjcHVtYXNrX2VtcHR5KGF2YWlsKSkpIHsKLQkJCXJldCA9IC0xOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJY3B1bWFza19jb3B5KG5ld21hc2ssIGF2YWlsKTsKLQl9Ci0KLQkvKiBDaG9vc2UgYSBDUFUgb3V0IG9mIHRob3NlIHdlIG5hcnJvd2VkIGl0IGRvd24gdG8gaW4gcm91bmQgcm9iaW4gKi8KLQl0YXJnZXQgPSBod2lycSAlIGNwdW1hc2tfd2VpZ2h0KG5ld21hc2spOwotCWZvcl9lYWNoX2NwdShjcHUsIG5ld21hc2spIHsKLQkJaWYgKGNwdV9yb3ZlcisrID49IHRhcmdldCkgewotCQkJaWNzLT5od2lycV9jcHVfbWFwW2luZGV4XSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKLQkJCXJldCA9IDA7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLQlXQVJOX09OKDEpOwotCi1vdXQ6Ci0JZnJlZV9jcHVtYXNrX3ZhcihuZXdtYXNrKTsKLWZyZWVhdmFpbDoKLQlmcmVlX2NwdW1hc2tfdmFyKGF2YWlsKTsKLXJldDoKLQlpZiAocmV0IDwgMCkgewotCQlpY3MtPmh3aXJxX2NwdV9tYXBbaW5kZXhdID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwotCQlwcl93YXJuaW5nKCJFcnJvciwgZmFsbGluZyBod2lycSAweCV4IHJvdXRpbmcgYmFjayB0byBDUFUgJWlcbiIsCi0JCQkgICBod2lycSwgaWNzLT5od2lycV9jcHVfbWFwW2luZGV4XSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsbG9jX2lycV9tYXAoc3RydWN0IHdzcF9pY3MgKmljcykKLXsKLQlpbnQgaTsKLQotCWljcy0+aHdpcnFfY3B1X21hcCA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBpY3MtPmNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWljcy0+aHdpcnFfY3B1X21hcCkgewotCQlwcl93YXJuaW5nKCJBbGxvY2F0ZSBod2lycV9jcHVfbWFwIGZhaWxlZCwgIgotCQkJICAgIklSUSBiYWxhbmNpbmcgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpPTA7IGkgPCBpY3MtPmNvdW50OyBpKyspCi0JCWljcy0+aHdpcnFfY3B1X21hcFtpXSA9IHhpY3NfZGVmYXVsdF9zZXJ2ZXI7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIoc3RydWN0IHdzcF9pY3MgKmljcywgdW5zaWduZWQgaW50IGh3aXJxKQotewotCWludCBpbmRleCA9IGh3aXJxIC0gaWNzLT5od2lycV9zdGFydDsKLQotCUJVR19PTihpbmRleCA8IDAgfHwgaW5kZXggPj0gaWNzLT5jb3VudCk7Ci0KLQlpZiAoIWljcy0+aHdpcnFfY3B1X21hcCkKLQkJcmV0dXJuIHhpY3NfZGVmYXVsdF9zZXJ2ZXI7Ci0KLQlyZXR1cm4gaWNzLT5od2lycV9jcHVfbWFwW2luZGV4XTsKLX0KLSNlbHNlIC8qICFDT05GSUdfU01QICovCi1zdGF0aWMgaW50IGNhY2hlX2h3aXJxX21hcChzdHJ1Y3Qgd3NwX2ljcyAqaWNzLCB1bnNpZ25lZCBpbnQgaHdpcnEsCi0JCQkgICBjb25zdCBjcHVtYXNrX3QgKmFmZmluaXR5KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHN0cnVjdCB3c3BfaWNzICppY3MsIHVuc2lnbmVkIGludCBod2lycSkKLXsKLQlyZXR1cm4geGljc19kZWZhdWx0X3NlcnZlcjsKLX0KLQotc3RhdGljIHZvaWQgYWxsb2NfaXJxX21hcChzdHJ1Y3Qgd3NwX2ljcyAqaWNzKSB7IH0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB3c3BfY2hpcF91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOwotCXN0cnVjdCB3c3BfaWNzICppY3M7Ci0JaW50IHNlcnZlcjsKLQl1NjQgeGl2ZTsKLQotCWlmIChod19pcnEgPT0gWElDU19JUEkgfHwgaHdfaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQotCQlyZXR1cm47Ci0KLQlpY3MgPSBkLT5jaGlwX2RhdGE7Ci0JaWYgKFdBUk5fT04oIWljcykpCi0JCXJldHVybjsKLQotCXNlcnZlciA9IGdldF9pcnFfc2VydmVyKGljcywgaHdfaXJxKTsKLQotCXhpdmUgPSB3c3BfaWNzX2dldF94aXZlKGljcywgaHdfaXJxKTsKLQl4aXZlID0geGl2ZV9zZXRfc2VydmVyKHhpdmUsIHNlcnZlcik7Ci0JeGl2ZSA9IHhpdmVfc2V0X3ByaW9yaXR5KHhpdmUsIERFRkFVTFRfUFJJT1JJVFkpOwotCXdzcF9pY3Nfc2V0X3hpdmUoaWNzLCBod19pcnEsIHhpdmUpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHdzcF9jaGlwX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQotewotCS8qIHVubWFzayBpdCAqLwotCXdzcF9jaGlwX3VubWFza19pcnEoZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdzcF9tYXNrX3JlYWxfaXJxKHVuc2lnbmVkIGludCBod19pcnEsIHN0cnVjdCB3c3BfaWNzICppY3MpCi17Ci0JdTY0IHhpdmU7Ci0KLQlpZiAoaHdfaXJxID09IFhJQ1NfSVBJKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTighaWNzKSkKLQkJcmV0dXJuOwotCXhpdmUgPSB3c3BfaWNzX2dldF94aXZlKGljcywgaHdfaXJxKTsKLQl4aXZlID0geGl2ZV9zZXRfc2VydmVyKHhpdmUsIHhpY3NfZGVmYXVsdF9zZXJ2ZXIpOwotCXhpdmUgPSB4aXZlX3NldF9wcmlvcml0eSh4aXZlLCBMT1dFU1RfUFJJT1JJVFkpOwotCXdzcF9pY3Nfc2V0X3hpdmUoaWNzLCBod19pcnEsIHhpdmUpOwotfQotCi1zdGF0aWMgdm9pZCB3c3BfY2hpcF9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpaXJxZF90b19od2lycShkKTsKLQlzdHJ1Y3Qgd3NwX2ljcyAqaWNzID0gZC0+Y2hpcF9kYXRhOwotCi0JaWYgKGh3X2lycSA9PSBYSUNTX0lQSSB8fCBod19pcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCi0JCXJldHVybjsKLQotCXdzcF9tYXNrX3JlYWxfaXJxKGh3X2lycSwgaWNzKTsKLX0KLQotc3RhdGljIGludCB3c3BfY2hpcF9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLAotCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgYm9vbCBmb3JjZSkKLXsKLQl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOwotCXN0cnVjdCB3c3BfaWNzICppY3M7Ci0JaW50IHJldDsKLQl1NjQgeGl2ZTsKLQotCWlmIChod19pcnEgPT0gWElDU19JUEkgfHwgaHdfaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQotCQlyZXR1cm4gLTE7Ci0KLQlpY3MgPSBkLT5jaGlwX2RhdGE7Ci0JaWYgKFdBUk5fT04oIWljcykpCi0JCXJldHVybiAtMTsKLQl4aXZlID0gd3NwX2ljc19nZXRfeGl2ZShpY3MsIGh3X2lycSk7Ci0KLQkvKgotCSAqIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUuCi0JICogR2V0IGN1cnJlbnQgaXJxX3NlcnZlciBmb3IgdGhlIGdpdmVuIGlycQotCSAqLwotCXJldCA9IGNhY2hlX2h3aXJxX21hcChpY3MsIGh3X2lycSwgY3B1bWFzayk7Ci0JaWYgKHJldCA9PSAtMSkgewotCQljaGFyIGNwdWxpc3RbMTI4XTsKLQkJY3B1bWFza19zY25wcmludGYoY3B1bGlzdCwgc2l6ZW9mKGNwdWxpc3QpLCBjcHVtYXNrKTsKLQkJcHJfd2FybmluZygiJXM6IE5vIG9ubGluZSBjcHVzIGluIHRoZSBtYXNrICVzIGZvciBpcnEgJWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgY3B1bGlzdCwgZC0+aXJxKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAocmV0ID09IC1FTk9NRU0pIHsKLQkJcHJfd2FybmluZygiJXM6IE91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXhpdmUgPSB4aXZlX3NldF9zZXJ2ZXIoeGl2ZSwgZ2V0X2lycV9zZXJ2ZXIoaWNzLCBod19pcnEpKTsKLQl3c3BfaWNzX3NldF94aXZlKGljcywgaHdfaXJxLCB4aXZlKTsKLQotCXJldHVybiBJUlFfU0VUX01BU0tfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgd3NwX2lycV9jaGlwID0gewotCS5uYW1lID0gIldTUCBJQ1MiLAotCS5pcnFfc3RhcnR1cAkJPSB3c3BfY2hpcF9zdGFydHVwLAotCS5pcnFfbWFzawkJPSB3c3BfY2hpcF9tYXNrX2lycSwKLQkuaXJxX3VubWFzawkJPSB3c3BfY2hpcF91bm1hc2tfaXJxLAotCS5pcnFfc2V0X2FmZmluaXR5CT0gd3NwX2NoaXBfc2V0X2FmZmluaXR5Ci19OwotCi1zdGF0aWMgaW50IHdzcF9pY3NfaG9zdF9tYXRjaChzdHJ1Y3QgaWNzICppY3MsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCi17Ci0JLyogQWxsIElDU3MgaW4gdGhlIHN5c3RlbSBpbXBsZW1lbnQgYSBnbG9iYWwgaXJxIG51bWJlciBzcGFjZSwKLQkgKiBzbyBtYXRjaCBhZ2FpbnN0IHRoZW0gYWxsLiAqLwotCXJldHVybiBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkbiwgImlibSxwcGMteGljcyIpOwotfQotCi1zdGF0aWMgaW50IHdzcF9pY3NfbWF0Y2hfaHdpcnEoc3RydWN0IHdzcF9pY3MgKndzcF9pY3MsIHVuc2lnbmVkIGludCBod2lycSkKLXsKLQlpZiAoaHdpcnEgPj0gd3NwX2ljcy0+aHdpcnFfc3RhcnQgJiYKLQkgICAgaHdpcnEgPCAgd3NwX2ljcy0+aHdpcnFfc3RhcnQgKyB3c3BfaWNzLT5jb3VudCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c3BfaWNzX21hcChzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCB3c3BfaWNzICp3c3BfaWNzID0gdG9fd3NwX2ljcyhpY3MpOwotCXVuc2lnbmVkIGludCBod19pcnEgPSB2aXJxX3RvX2h3KHZpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXdzcF9pY3NfbWF0Y2hfaHdpcnEod3NwX2ljcywgaHdfaXJxKSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJndzcF9pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKLQotCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIHdzcF9pY3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndzcF9pY3MtPmxvY2ssIGZsYWdzKTsKLQliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKHdzcF9pY3MtPmJpdG1hcCwgaHdfaXJxIC0gd3NwX2ljcy0+aHdpcnFfc3RhcnQsIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndzcF9pY3MtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3c3BfaWNzX21hc2tfdW5rbm93bihzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGxvbmcgaHdfaXJxKQotewotCXN0cnVjdCB3c3BfaWNzICp3c3BfaWNzID0gdG9fd3NwX2ljcyhpY3MpOwotCi0JaWYgKCF3c3BfaWNzX21hdGNoX2h3aXJxKHdzcF9pY3MsIGh3X2lycSkpCi0JCXJldHVybjsKLQotCXByX2VycigiJXM6IElSUSAlbHUgKHJlYWwpIGlzIGludmFsaWQsIGRpc2FibGluZyBpdC5cbiIsIF9fZnVuY19fLCBod19pcnEpOwotCXdzcF9tYXNrX3JlYWxfaXJxKGh3X2lycSwgd3NwX2ljcyk7Ci19Ci0KLXN0YXRpYyBsb25nIHdzcF9pY3NfZ2V0X3NlcnZlcihzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGxvbmcgaHdfaXJxKQotewotCXN0cnVjdCB3c3BfaWNzICp3c3BfaWNzID0gdG9fd3NwX2ljcyhpY3MpOwotCi0JaWYgKCF3c3BfaWNzX21hdGNoX2h3aXJxKHdzcF9pY3MsIGh3X2lycSkpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIGdldF9pcnFfc2VydmVyKHdzcF9pY3MsIGh3X2lycSk7Ci19Ci0KLS8qIEhXIE51bWJlciBhbGxvY2F0aW9uIEFQSSAqLwotCi1zdGF0aWMgc3RydWN0IHdzcF9pY3MgKndzcF9pY3NfZmluZF9kbl9pY3Moc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmlwYXJlbnQ7Ci0JaW50IGk7Ci0KLQlpcGFyZW50ID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGRuKTsKLQlpZiAoIWlwYXJlbnQpIHsKLQkJcHJfZXJyKCJ3c3BfaWNzOiBGYWlsZWQgdG8gZmluZCBpbnRlcnJ1cHQgcGFyZW50IVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWZvcihpID0gMDsgaSA8IG51bV9pY3M7IGkrKykgewotCQlpZihpY3NfbGlzdFtpXS5kbiA9PSBpcGFyZW50KQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gbnVtX2ljcykgewotCQlwcl9lcnIoIndzcF9pY3M6IFVuYWJsZSB0byBmaW5kIHBhcmVudCBiaXRtYXAhXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuICZpY3NfbGlzdFtpXTsKLX0KLQotaW50IHdzcF9pY3NfYWxsb2NfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCBudW0pCi17Ci0Jc3RydWN0IHdzcF9pY3MgKmljczsKLQlpbnQgb3JkZXIsIG9mZnNldDsKLQotCWljcyA9IHdzcF9pY3NfZmluZF9kbl9pY3MoZG4pOwotCWlmICghaWNzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIEZhc3QsIGJ1dCBvdmVybHkgc3RyaWN0IGlmIG51bSBpc24ndCBhIHBvd2VyIG9mIHR3byAqLwotCW9yZGVyID0gZ2V0X2NvdW50X29yZGVyKG51bSk7Ci0KLQlzcGluX2xvY2tfaXJxKCZpY3MtPmxvY2spOwotCW9mZnNldCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKGljcy0+Yml0bWFwLCBpY3MtPmNvdW50LCBvcmRlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpY3MtPmxvY2spOwotCi0JaWYgKG9mZnNldCA8IDApCi0JCXJldHVybiBvZmZzZXQ7Ci0KLQlyZXR1cm4gb2Zmc2V0ICsgaWNzLT5od2lycV9zdGFydDsKLX0KLQotdm9pZCB3c3BfaWNzX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IHdzcF9pY3MgKmljczsKLQotCWljcyA9IHdzcF9pY3NfZmluZF9kbl9pY3MoZG4pOwotCWlmIChXQVJOX09OKCFpY3MpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxKCZpY3MtPmxvY2spOwotCWJpdG1hcF9yZWxlYXNlX3JlZ2lvbihpY3MtPmJpdG1hcCwgaXJxLCAwKTsKLQlzcGluX3VubG9ja19pcnEoJmljcy0+bG9jayk7Ci19Ci0KLS8qIEluaXRpYWxpc2F0aW9uICovCi0KLXN0YXRpYyBpbnQgX19pbml0IHdzcF9pY3NfYml0bWFwX3NldHVwKHN0cnVjdCB3c3BfaWNzICppY3MsCi0JCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQlpbnQgbGVuLCBpLCBqLCBzaXplOwotCXUzMiBzdGFydCwgY291bnQ7Ci0JY29uc3QgdTMyICpwOwotCi0Jc2l6ZSA9IEJJVFNfVE9fTE9OR1MoaWNzLT5jb3VudCkgKiBzaXplb2YobG9uZyk7Ci0JaWNzLT5iaXRtYXAgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghaWNzLT5iaXRtYXApIHsKLQkJcHJfZXJyKCJ3c3BfaWNzOiBFTk9NRU0gYWxsb2NhdGluZyBJUlEgYml0bWFwIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZpY3MtPmxvY2spOwotCi0JcCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImF2YWlsYWJsZS1yYW5nZXMiLCAmbGVuKTsKLQlpZiAoIXAgfHwgIWxlbikgewotCQkvKiBGSVhNRSB0aGlzIHNob3VsZCBiZSBhIFdBUk4oKSBvbmNlIG1hbWJvIGlzIHVwZGF0ZWQgKi8KLQkJcHJfZXJyKCJ3c3BfaWNzOiBObyBhdmFpbGFibGUtcmFuZ2VzIGRlZmluZWQgZm9yICVzXG4iLAotCQkJZG4tPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChsZW4gJSAoMiAqIHNpemVvZih1MzIpKSAhPSAwKSB7Ci0JCS8qIEZJWE1FIHRoaXMgc2hvdWxkIGJlIGEgV0FSTigpIG9uY2UgbWFtYm8gaXMgdXBkYXRlZCAqLwotCQlwcl9lcnIoIndzcF9pY3M6IEludmFsaWQgYXZhaWxhYmxlLXJhbmdlcyBmb3IgJXNcbiIsCi0JCQlkbi0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYml0bWFwX2ZpbGwoaWNzLT5iaXRtYXAsIGljcy0+Y291bnQpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbiAvIHNpemVvZih1MzIpOyBpICs9IDIpIHsKLQkJc3RhcnQgPSBvZl9yZWFkX251bWJlcihwICsgaSwgMSk7Ci0JCWNvdW50ID0gb2ZfcmVhZF9udW1iZXIocCArIGkgKyAxLCAxKTsKLQotCQlwcl9kZXZlbCgiJXM6IHN0YXJ0OiAlZCBjb3VudDogJWRcbiIsIF9fZnVuY19fLCBzdGFydCwgY291bnQpOwotCi0JCWlmICgoc3RhcnQgKyBjb3VudCkgPiAoaWNzLT5od2lycV9zdGFydCArIGljcy0+Y291bnQpIHx8Ci0JCSAgICAgc3RhcnQgPCBpY3MtPmh3aXJxX3N0YXJ0KSB7Ci0JCQlwcl9lcnIoIndzcF9pY3M6IEludmFsaWQgcmFuZ2UhIC0+ICVkIHRvICVkXG4iLAotCQkJCQlzdGFydCwgc3RhcnQgKyBjb3VudCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKQotCQkJYml0bWFwX3JlbGVhc2VfcmVnaW9uKGljcy0+Yml0bWFwLAotCQkJCShzdGFydCArIGopIC0gaWNzLT5od2lycV9zdGFydCwgMCk7Ci0JfQotCi0JLyogRW5zdXJlIExTSXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gKi8KLQliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKGljcy0+Yml0bWFwLCBpY3MtPmxzaV9iYXNlLAotCQkJICAgICAgIGdldF9jb3VudF9vcmRlcihpY3MtPmxzaV9jb3VudCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdzcF9pY3Nfc2V0dXAoc3RydWN0IHdzcF9pY3MgKmljcywgc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQl1MzIgbHNpX2J1aWQsIG1zaV9idWlkLCBtc2lfYmFzZSwgbXNpX2NvdW50OwotCXZvaWQgX19pb21lbSAqcmVnczsKLQljb25zdCB1MzIgKnA7Ci0JaW50IHJjLCBsZW4sIGk7Ci0JdTY0IGNhcHMsIGJ1aWQ7Ci0KLQlwID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaW50ZXJydXB0LXJhbmdlcyIsICZsZW4pOwotCWlmICghcCB8fCBsZW4gPCAoMiAqIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIndzcF9pY3M6IE5vL2JhZCBpbnRlcnJ1cHQtcmFuZ2VzIGZvdW5kIG9uICVzXG4iLAotCQkJZG4tPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCWlmIChsZW4gPiAoMiAqIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIndzcF9pY3M6IE11bHRpcGxlIGljcyByYW5nZXMgbm90IHN1cHBvcnRlZC5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZWdzID0gb2ZfaW9tYXAoZG4sIDApOwotCWlmICghcmVncykgewotCQlwcl9lcnIoIndzcF9pY3M6IG9mX2lvbWFwKCVzKSBmYWlsZWRcbiIsIGRuLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWljcy0+aHdpcnFfc3RhcnQgPSBvZl9yZWFkX251bWJlcihwLCAxKTsKLQlpY3MtPmNvdW50ID0gb2ZfcmVhZF9udW1iZXIocCArIDEsIDEpOwotCWljcy0+cmVncyA9IHJlZ3M7Ci0KLQlpY3MtPmNoaXBfaWQgPSB3c3BfZ2V0X2NoaXBfaWQoZG4pOwotCWlmIChXQVJOX09OKGljcy0+Y2hpcF9pZCA8IDApKQotCQlpY3MtPmNoaXBfaWQgPSAwOwotCi0JLyogR2V0IHNvbWUgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBjcml0dGVyICovCi0JY2FwcyA9IGluX2JlNjQoSUNTX0lOVF9DQVBTX1JFRyhpY3MtPnJlZ3MpKTsKLQlidWlkID0gaW5fYmU2NChJTlRfU1JDX0xBWUVSX0JVSURfUkVHKGljcy0+cmVncykpOwotCWljcy0+bHNpX2NvdW50ID0gY2FwcyA+PiA1NjsKLQltc2lfY291bnQgPSAoY2FwcyA+PiA0NCkgJiAweDdmZjsKLQotCS8qIE5vdGU6IExTSSBCVUlEIGlzIDkgYml0cywgYnV0IHJlYWxseSBvbmx5IDMgYXJlIEJVSUQgYW5kIHRoZQotCSAqIHJlc3QgaXMgbWl4ZWQgaW4gdGhlIGludGVycnVwdCBudW1iZXIuIFdlIHN0b3JlIHRoZSB3aG9sZQotCSAqIHRoaW5nIHRob3VnaAotCSAqLwotCWxzaV9idWlkID0gKGJ1aWQgPj4gNDgpICYgMHgxZmY7Ci0JaWNzLT5sc2lfYmFzZSA9IChpY3MtPmNoaXBfaWQgPDwgV1NQX0lDU19DSElQX1NISUZUKSB8IGxzaV9idWlkIDw8IDU7Ci0JbXNpX2J1aWQgPSAoYnVpZCA+PiAzNykgJiAweDc7Ci0JbXNpX2Jhc2UgPSAoaWNzLT5jaGlwX2lkIDw8IFdTUF9JQ1NfQ0hJUF9TSElGVCkgfCBtc2lfYnVpZCA8PCAxMTsKLQotCXByX2luZm8oIndzcF9pY3M6IEZvdW5kICVzXG4iLCBkbi0+ZnVsbF9uYW1lKTsKLQlwcl9pbmZvKCJ3c3BfaWNzOiAgICBpcnEgcmFuZ2UgOiAweCUwNmxseC4uMHglMDZsbHhcbiIsCi0JCWljcy0+aHdpcnFfc3RhcnQsIGljcy0+aHdpcnFfc3RhcnQgKyBpY3MtPmNvdW50IC0gMSk7Ci0JcHJfaW5mbygid3NwX2ljczogICAgJTRkIExTSXMgOiAweCUwNnguLjB4JTA2eFxuIiwKLQkJaWNzLT5sc2lfY291bnQsIGljcy0+bHNpX2Jhc2UsCi0JCWljcy0+bHNpX2Jhc2UgKyBpY3MtPmxzaV9jb3VudCAtIDEpOwotCXByX2luZm8oIndzcF9pY3M6ICAgICU0ZCBNU0lzIDogMHglMDZ4Li4weCUwNnhcbiIsCi0JCW1zaV9jb3VudCwgbXNpX2Jhc2UsCi0JCW1zaV9iYXNlICsgbXNpX2NvdW50IC0gMSk7Ci0KLQkvKiBMZXQncyBjaGVjayB0aGUgSFcgY29uZmlnIGlzIHNhbmUgKi8KLQlpZiAoaWNzLT5sc2lfYmFzZSA8IGljcy0+aHdpcnFfc3RhcnQgfHwKLQkgICAgKGljcy0+bHNpX2Jhc2UgKyBpY3MtPmxzaV9jb3VudCkgPiAoaWNzLT5od2lycV9zdGFydCArIGljcy0+Y291bnQpKQotCQlwcl93YXJuaW5nKCJ3c3BfaWNzOiBXQVJOSU5HICEgTFNJcyBvdXQgb2YgaW50ZXJydXB0LXJhbmdlcyAhXG4iKTsKLQlpZiAobXNpX2Jhc2UgPCBpY3MtPmh3aXJxX3N0YXJ0IHx8Ci0JICAgIChtc2lfYmFzZSArIG1zaV9jb3VudCkgPiAoaWNzLT5od2lycV9zdGFydCArIGljcy0+Y291bnQpKQotCQlwcl93YXJuaW5nKCJ3c3BfaWNzOiBXQVJOSU5HICEgTVNJcyBvdXQgb2YgaW50ZXJydXB0LXJhbmdlcyAhXG4iKTsKLQotCS8qIFdlIGRvbid0IGNoZWNrIGZvciBvdmVybGFwIGJldHdlZW4gTFNJIGFuZCBNU0ksIHdoaWNoIHdpbGwgaGFwcGVuCi0JICogaWYgd2UgdXNlIHRoZSBzYW1lIEJVSUQsIEknbSBub3Qgc3VyZSB5ZXQgaG93IGxlZ2l0IHRoYXQgaXMuCi0JICovCi0KLQlyYyA9IHdzcF9pY3NfYml0bWFwX3NldHVwKGljcywgZG4pOwotCWlmIChyYykgewotCQlpb3VubWFwKHJlZ3MpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWNzLT5kbiA9IG9mX25vZGVfZ2V0KGRuKTsKLQlhbGxvY19pcnFfbWFwKGljcyk7Ci0KLQlmb3IoaSA9IDA7IGkgPCBpY3MtPmNvdW50OyBpKyspCi0JCXdzcF9tYXNrX3JlYWxfaXJxKGljcy0+aHdpcnFfc3RhcnQgKyBpLCBpY3MpOwotCi0JaWNzLT5pY3MubWFwID0gd3NwX2ljc19tYXA7Ci0JaWNzLT5pY3MubWFza191bmtub3duID0gd3NwX2ljc19tYXNrX3Vua25vd247Ci0JaWNzLT5pY3MuZ2V0X3NlcnZlciA9IHdzcF9pY3NfZ2V0X3NlcnZlcjsKLQlpY3MtPmljcy5ob3N0X21hdGNoID0gd3NwX2ljc19ob3N0X21hdGNoOwotCi0JeGljc19yZWdpc3Rlcl9pY3MoJmljcy0+aWNzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgd3NwX2ljc19zZXRfZGVmYXVsdF9zZXJ2ZXIodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXUzMiBod2lkOwotCi0JLyogRmluZCB0aGUgc2VydmVyIG51bWJlciBmb3IgdGhlIGJvb3QgY3B1LiAqLwotCW5wID0gb2ZfZ2V0X2NwdV9ub2RlKGJvb3RfY3B1aWQsIE5VTEwpOwotCUJVR19PTighbnApOwotCi0JaHdpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCk7Ci0KLQlwcl9pbmZvKCJ3c3BfaWNzOiBkZWZhdWx0IHNlcnZlciBpcyAlI3gsIENQVSAlc1xuIiwgaHdpZCwgbnAtPmZ1bGxfbmFtZSk7Ci0JeGljc19kZWZhdWx0X3NlcnZlciA9IGh3aWQ7Ci0KLQlvZl9ub2RlX3B1dChucCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdzcF9pY3NfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IHdzcF9pY3MgKmljczsKLQlpbnQgcmMsIGZvdW5kOwotCi0Jd3NwX2ljc19zZXRfZGVmYXVsdF9zZXJ2ZXIoKTsKLQotCWZvdW5kID0gMDsKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUoZG4sIE5VTEwsICJpYm0scHBjLXhpY3MiKQotCQlmb3VuZCsrOwotCi0JaWYgKGZvdW5kID09IDApIHsKLQkJcHJfZXJyKCJ3c3BfaWNzOiBObyBJQ1MncyBmb3VuZCFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpY3NfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKCppY3MpICogZm91bmQsIEdGUF9LRVJORUwpOwotCWlmICghaWNzX2xpc3QpIHsKLQkJcHJfZXJyKCJ3c3BfaWNzOiBObyBtZW1vcnkgZm9yIHN0cnVjdHMuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbnVtX2ljcyA9IDA7Ci0JaWNzID0gaWNzX2xpc3Q7Ci0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKGRuLCBOVUxMLCAiaWJtLHdzcC14aWNzIikgewotCQlyYyA9IHdzcF9pY3Nfc2V0dXAoaWNzLCBkbik7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlpY3MrKzsKLQkJCW51bV9pY3MrKzsKLQkJfQotCX0KLQotCWlmIChmb3VuZCAhPSBudW1faWNzKSB7Ci0JCXByX2Vycigid3NwX2ljczogRmFpbGVkIHNldHRpbmcgdXAgJWQgSUNTJ3NcbiIsCi0JCQlmb3VuZCAtIG51bV9pY3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IHdzcF9pbml0X2lycSh2b2lkKQotewotCXdzcF9pY3NfaW5pdCgpOwotCXhpY3NfaW5pdCgpOwotCi0JLyogV2UgbmVlZCB0byBwYXRjaCBvdXIgaXJxIGNoaXAncyBFT0kgdG8gcG9pbnQgdG8gdGhlIHJpZ2h0IElDUCAqLwotCXdzcF9pcnFfY2hpcC5pcnFfZW9pID0gaWNwX29wcy0+ZW9pOwotfQotCi0jaWZkZWYgQ09ORklHX1BDSV9NU0kKLXN0YXRpYyB2b2lkIHdzcF9pY3NfbXNpX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXdzcF9jaGlwX3VubWFza19pcnEoZCk7Ci0JdW5tYXNrX21zaV9pcnEoZCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgd3NwX2ljc19tc2lfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jd3NwX2ljc19tc2lfdW5tYXNrX2lycShkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd3NwX2ljc19tc2lfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCW1hc2tfbXNpX2lycShkKTsKLQl3c3BfY2hpcF9tYXNrX2lycShkKTsKLX0KLQotLyoKLSAqIHdlIGRvIGl0IHRoaXMgd2F5IGJlY2F1c2Ugd2UgcmVhc3NpbmdlIGRlZmF1bHQgRU9JIGhhbmRsaW5nIGluCi0gKiBpcnFfaW5pdCgpIGFib3ZlCi0gKi8KLXN0YXRpYyB2b2lkIHdzcF9pY3NfZW9pKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQl3c3BfaXJxX2NoaXAuaXJxX2VvaShkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3c3BfaWNzX21zaSA9IHsKLQkubmFtZSA9ICJXU1AgSUNTIE1TSSIsCi0JLmlycV9zdGFydHVwID0gd3NwX2ljc19tc2lfc3RhcnR1cCwKLQkuaXJxX21hc2sgPSB3c3BfaWNzX21zaV9tYXNrX2lycSwKLQkuaXJxX3VubWFzayA9IHdzcF9pY3NfbXNpX3VubWFza19pcnEsCi0JLmlycV9lb2kgPSB3c3BfaWNzX2VvaSwKLQkuaXJxX3NldF9hZmZpbml0eSA9IHdzcF9jaGlwX3NldF9hZmZpbml0eQotfTsKLQotdm9pZCB3c3BfaWNzX3NldF9tc2lfY2hpcCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlycV9zZXRfY2hpcChpcnEsICZ3c3BfaWNzX21zaSk7Ci19Ci0KLXZvaWQgd3NwX2ljc19zZXRfc3RkX2NoaXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnFfc2V0X2NoaXAoaXJxLCAmd3NwX2lycV9jaGlwKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiNjQ0ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBJQk0gQ29ycG9yYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX0lDU19ICi0jZGVmaW5lIF9fSUNTX0gKLQotI2RlZmluZSBYSVZFX0FERFJfTUFTSwkJMHg3RkZVTEwKLQotZXh0ZXJuIHZvaWQgd3NwX2luaXRfaXJxKHZvaWQpOwotCi1leHRlcm4gaW50IHdzcF9pY3NfYWxsb2NfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCBudW0pOwotZXh0ZXJuIHZvaWQgd3NwX2ljc19mcmVlX2lycShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCB1bnNpZ25lZCBpbnQgaXJxKTsKLQotI2lmZGVmIENPTkZJR19QQ0lfTVNJCi1leHRlcm4gdm9pZCB3c3BfaWNzX3NldF9tc2lfY2hpcCh1bnNpZ25lZCBpbnQgaXJxKTsKLWV4dGVybiB2b2lkIHdzcF9pY3Nfc2V0X3N0ZF9jaGlwKHVuc2lnbmVkIGludCBpcnEpOwotI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCi0KLSNlbmRpZiAvKiBfX0lDU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA4ODJmLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tc2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgIm1zaS5oIgotI2luY2x1ZGUgImljcy5oIgotI2luY2x1ZGUgIndzcF9wY2kuaCIKLQotLyogTWFnaWMgYWRkcmVzc2VzIGZvciAzMiAmIDY0LWJpdCBNU0lzIHdpdGggaGFyZGNvZGVkIE1WRSAwICovCi0jZGVmaW5lIE1TSV9BRERSXzMyCQkweEZGRkYwMDAwdWwKLSNkZWZpbmUgTVNJX0FERFJfNjQJCTB4MTAwMDAwMDAwMDAwMDAwMHVsCi0KLWludCB3c3Bfc2V0dXBfbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMsIGludCB0eXBlKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOwotCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7Ci0Jc3RydWN0IG1zaV9tc2cgbXNnOwotCXVuc2lnbmVkIGludCB2aXJxOwotCWludCBod2lycTsKLQotCXBoYiA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JaWYgKCFwaGIpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXYtPm1zaV9saXN0LCBzdHJ1Y3QgbXNpX2Rlc2MsIGxpc3QpOwotCWlmIChlbnRyeS0+bXNpX2F0dHJpYi5pc182NCkgewotCQltc2cuYWRkcmVzc19sbyA9IDA7Ci0JCW1zZy5hZGRyZXNzX2hpID0gTVNJX0FERFJfNjQgPj4gMzI7Ci0JfSBlbHNlIHsKLQkJbXNnLmFkZHJlc3NfbG8gPSBNU0lfQUREUl8zMjsKLQkJbXNnLmFkZHJlc3NfaGkgPSAwOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7Ci0JCWh3aXJxID0gd3NwX2ljc19hbGxvY19pcnEocGhiLT5kbiwgMSk7Ci0JCWlmIChod2lycSA8IDApIHsKLQkJCWRldl93YXJuKCZkZXYtPmRldiwgIndzcF9tc2k6IGh3aXJxIGFsbG9jIGZhaWxlZCFcbiIpOwotCQkJcmV0dXJuIGh3aXJxOwotCQl9Ci0KLQkJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBod2lycSk7Ci0JCWlmICh2aXJxID09IE5PX0lSUSkgewotCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAid3NwX21zaTogdmlycSBhbGxvYyBmYWlsZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWRldl9kYmcoJmRldi0+ZGV2LCAid3NwX21zaTogYWxsb2NhdGVkIGlycSAlI3gvJSN4XG4iLAotCQkJaHdpcnEsIHZpcnEpOwotCi0JCXdzcF9pY3Nfc2V0X21zaV9jaGlwKHZpcnEpOwotCQlpcnFfc2V0X21zaV9kZXNjKHZpcnEsIGVudHJ5KTsKLQkJbXNnLmRhdGEgPSBod2lycSAmIFhJVkVfQUREUl9NQVNLOwotCQl3cml0ZV9tc2lfbXNnKHZpcnEsICZtc2cpOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIHdzcF90ZWFyZG93bl9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOwotCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7Ci0JaW50IGh3aXJxOwotCi0JcGhiID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKLQotCWRldl9kYmcoJmRldi0+ZGV2LCAid3NwX21zaTogdGVhcmluZyBkb3duIG1zaSBpcnFzXG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7Ci0JCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKLQkJCWNvbnRpbnVlOwotCi0JCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7Ci0JCXdzcF9pY3Nfc2V0X3N0ZF9jaGlwKGVudHJ5LT5pcnEpOwotCi0JCWh3aXJxID0gdmlycV90b19odyhlbnRyeS0+aXJxKTsKLQkJLyogSW4gdGhpcyBvcmRlciB0byBhdm9pZCByYWNpbmcgd2l0aCBpcnFfY3JlYXRlX21hcHBpbmcoKSAqLwotCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGVudHJ5LT5pcnEpOwotCQl3c3BfaWNzX2ZyZWVfaXJxKHBoYi0+ZG4sIGh3aXJxKTsKLQl9Ci19Ci0KLXZvaWQgd3NwX3NldHVwX3BoYl9tc2koc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCi17Ci0JLyogQ3JlYXRlIGEgc2luZ2xlIE1WRSBhdCBvZmZzZXQgMCB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZyAqLwotCW91dF9iZTY0KHBoYi0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0FERFIsIFBDSUVfUkVHX0lPREFfQURfVEJMX01WVCk7Ci0Jb3V0X2JlNjQocGhiLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfREFUQTAsIDF1bGwgPDwgNjMpOwotCi0JcHBjX21kLnNldHVwX21zaV9pcnFzID0gd3NwX3NldHVwX21zaV9pcnFzOwotCXBwY19tZC50ZWFyZG93bl9tc2lfaXJxcyA9IHdzcF90ZWFyZG93bl9tc2lfaXJxczsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvbXNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYjI3YjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvbXNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX1dTUF9NU0lfSAotI2RlZmluZSBfX1dTUF9NU0lfSAotCi0jaWZkZWYgQ09ORklHX1BDSV9NU0kKLWV4dGVybiB2b2lkIHdzcF9zZXR1cF9waGJfbXNpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgd3NwX3NldHVwX3BoYl9tc2koc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpIHsgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1dTUF9NU0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avb3BiX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avb3BiX3BpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY3Mjk4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL29wYl9waWMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKgotICogSUJNIE9uYm9hcmQgUGVyaXBoZXJhbCBCdXMgSW50ZXJydXB0IENvbnRyb2xsZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBKYWNrIE1pbGxlciwgSUJNIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9yZWdfYTIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNkZWZpbmUgT1BCX05SX0lSUVMgMzIKLQotI2RlZmluZSBPUEJfTUxTQVNJRVIJMHgwNCAgICAvKiBNTFMgQWNjdW11bGF0ZWQgU3RhdHVzIElFUiAqLwotI2RlZmluZSBPUEJfTUxTSVIJMHg1MAkvKiBNTFMgSW50ZXJydXB0IFJlZ2lzdGVyICovCi0jZGVmaW5lIE9QQl9NTFNJRVIJMHg1NAkvKiBNTFMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBPUEJfTUxTSVBSCTB4NTgJLyogTUxTIEludGVycnVwdCBQb2xhcml0eSBSZWdpc3RlciAqLwotI2RlZmluZSBPUEJfTUxTSUlSCTB4NWMJLyogTUxTIEludGVycnVwdCBJbnB1dHMgUmVnaXN0ZXIgKi8KLQotc3RhdGljIGludCBvcGJfaW5kZXggPSAwOwotCi1zdHJ1Y3Qgb3BiX3BpYyB7Ci0Jc3RydWN0IGlycV9kb21haW4gKmhvc3Q7Ci0Jdm9pZCAqcmVnczsKLQlpbnQgaW5kZXg7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotfTsKLQotc3RhdGljIHUzMiBvcGJfaW4oc3RydWN0IG9wYl9waWMgKm9wYiwgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gaW5fYmUzMihvcGItPnJlZ3MgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBvcGJfb3V0KHN0cnVjdCBvcGJfcGljICpvcGIsIGludCBvZmZzZXQsIHUzMiB2YWwpCi17Ci0Jb3V0X2JlMzIob3BiLT5yZWdzICsgb2Zmc2V0LCB2YWwpOwotfQotCi1zdGF0aWMgdm9pZCBvcGJfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IG9wYl9waWMgKm9wYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBpZXIsIGJpdHNldDsKLQotCW9wYiA9IGQtPmNoaXBfZGF0YTsKLQliaXRzZXQgPSAoMSA8PCAoMzEgLSBpcnFkX3RvX2h3aXJxKGQpKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb3BiLT5sb2NrLCBmbGFncyk7Ci0KLQlpZXIgPSBvcGJfaW4ob3BiLCBPUEJfTUxTSUVSKTsKLQlvcGJfb3V0KG9wYiwgT1BCX01MU0lFUiwgaWVyIHwgYml0c2V0KTsKLQlpZXIgPSBvcGJfaW4ob3BiLCBPUEJfTUxTSUVSKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBvcGJfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBvcGJfcGljICpvcGI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgaWVyLCBtYXNrOwotCi0Jb3BiID0gZC0+Y2hpcF9kYXRhOwotCW1hc2sgPSB+KDEgPDwgKDMxIC0gaXJxZF90b19od2lycShkKSkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9wYi0+bG9jaywgZmxhZ3MpOwotCi0JaWVyID0gb3BiX2luKG9wYiwgT1BCX01MU0lFUik7Ci0Jb3BiX291dChvcGIsIE9QQl9NTFNJRVIsIGllciAmIG1hc2spOwotCWllciA9IG9wYl9pbihvcGIsIE9QQl9NTFNJRVIpOyAvLyBGbHVzaCBwb3N0ZWQgd3JpdGVzCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGItPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgb3BiX2Fja19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBvcGJfcGljICpvcGI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgYml0c2V0OwotCi0Jb3BiID0gZC0+Y2hpcF9kYXRhOwotCWJpdHNldCA9ICgxIDw8ICgzMSAtIGlycWRfdG9faHdpcnEoZCkpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZvcGItPmxvY2ssIGZsYWdzKTsKLQotCW9wYl9vdXQob3BiLCBPUEJfTUxTSVIsIGJpdHNldCk7Ci0Jb3BiX2luKG9wYiwgT1BCX01MU0lSKTsgLy8gRmx1c2ggcG9zdGVkIHdyaXRlcwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BiLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wYl9tYXNrX2Fja19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBvcGJfcGljICpvcGI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgYml0c2V0OwotCXUzMiBpZXIsIGlyOwotCi0Jb3BiID0gZC0+Y2hpcF9kYXRhOwotCWJpdHNldCA9ICgxIDw8ICgzMSAtIGlycWRfdG9faHdpcnEoZCkpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZvcGItPmxvY2ssIGZsYWdzKTsKLQotCWllciA9IG9wYl9pbihvcGIsIE9QQl9NTFNJRVIpOwotCW9wYl9vdXQob3BiLCBPUEJfTUxTSUVSLCBpZXIgJiB+Yml0c2V0KTsKLQlpZXIgPSBvcGJfaW4ob3BiLCBPUEJfTUxTSUVSKTsgLy8gRmx1c2ggcG9zdGVkIHdyaXRlcwotCi0Jb3BiX291dChvcGIsIE9QQl9NTFNJUiwgYml0c2V0KTsKLQlpciA9IG9wYl9pbihvcGIsIE9QQl9NTFNJUik7IC8vIEZsdXNoIHBvc3RlZCB3cml0ZXMKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG9wYl9zZXRfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvdykKLXsKLQlzdHJ1Y3Qgb3BiX3BpYyAqb3BiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGludmVydCwgaXByLCBtYXNrLCBiaXQ7Ci0KLQlvcGIgPSBkLT5jaGlwX2RhdGE7Ci0KLQkvKiBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSdyZSBpbnRlcmVzdGVkIGluIGluIHRoZSB0eXBlIGlzIHdoZXRoZXIgaXQncwotCSAqIGEgaGlnaCBvciBsb3cgdHJpZ2dlci4gRm9yIGhpZ2ggdHJpZ2dlcmVkIGludGVycnVwdHMsIHRoZSBwb2xhcml0eQotCSAqIHNldCBmb3IgaXQgaW4gdGhlIE1MUyBJbnRlcnJ1cHQgUG9sYXJpdHkgUmVnaXN0ZXIgaXMgMCwgZm9yIGxvdwotCSAqIGludGVycnVwdHMgaXQncyAxIHNvIHRoYXQgdGhlIHByb3BlciBpbnB1dCBpbiB0aGUgTUxTIEludGVycnVwdCBJbnB1dAotCSAqIFJlZ2lzdGVyIGlzIGludGVycnVwdGVkIGFzIGFzc2VydGluZyB0aGUgaW50ZXJydXB0LiAqLwotCi0Jc3dpdGNoIChmbG93KSB7Ci0JCWNhc2UgSVJRX1RZUEVfTk9ORToKLQkJCW9wYl9tYXNrX2lycShkKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJCWludmVydCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJCWludmVydCA9IDE7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYml0ID0gKDEgPDwgKDMxIC0gaXJxZF90b19od2lycShkKSkpOwotCW1hc2sgPSB+Yml0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9wYi0+bG9jaywgZmxhZ3MpOwotCi0JaXByID0gb3BiX2luKG9wYiwgT1BCX01MU0lQUik7Ci0JaXByID0gKGlwciAmIG1hc2spIHwgKGludmVydCA/IGJpdCA6IDApOwotCW9wYl9vdXQob3BiLCBPUEJfTUxTSVBSLCBpcHIpOwotCWlwciA9IG9wYl9pbihvcGIsIE9QQl9NTFNJUFIpOyAgLy8gRmx1c2ggcG9zdGVkIHdyaXRlcwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BiLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBSZWNvcmQgdGhlIHR5cGUgaW4gdGhlIGludGVycnVwdCBkZXNjcmlwdG9yICovCi0JaXJxZF9zZXRfdHJpZ2dlcl90eXBlKGQsIGZsb3cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb3BiX2lycV9jaGlwID0gewotCS5uYW1lCQk9ICJPUEIiLAotCS5pcnFfbWFzawk9IG9wYl9tYXNrX2lycSwKLQkuaXJxX3VubWFzawk9IG9wYl91bm1hc2tfaXJxLAotCS5pcnFfbWFza19hY2sJPSBvcGJfbWFza19hY2tfaXJxLAotCS5pcnFfYWNrCT0gb3BiX2Fja19pcnEsCi0JLmlycV9zZXRfdHlwZQk9IG9wYl9zZXRfaXJxX3R5cGUKLX07Ci0KLXN0YXRpYyBpbnQgb3BiX2hvc3RfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpob3N0LCB1bnNpZ25lZCBpbnQgdmlycSwKLQkJaXJxX2h3X251bWJlcl90IGh3aXJxKQotewotCXN0cnVjdCBvcGJfcGljICpvcGI7Ci0KLQlvcGIgPSBob3N0LT5ob3N0X2RhdGE7Ci0KLQkvKiBNb3N0IG9mIHRoZSBpbXBvcnRhbnQgc3R1ZmYgaXMgaGFuZGxlZCBieSB0aGUgZ2VuZXJpYyBob3N0IGNvZGUsIGxpa2UKLQkgKiB0aGUgbG9va3VwLCBzbyBqdXN0IGF0dGFjaCBzb21lIGluZm8gdG8gdGhlIHZpcnR1YWwgaXJxICovCi0KLQlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBvcGIpOwotCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmb3BiX2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQlpcnFfc2V0X2lycV90eXBlKHZpcnEsIElSUV9UWVBFX05PTkUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgb3BiX2hvc3Rfb3BzID0gewotCS5tYXAgPSBvcGJfaG9zdF9tYXAsCi0JLnhsYXRlID0gaXJxX2RvbWFpbl94bGF0ZV90d29jZWxsLAotfTsKLQotaXJxcmV0dXJuX3Qgb3BiX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IG9wYl9waWMgKm9wYjsKLQl1MzIgaXIsIHNyYywgc3VidmlycTsKLQotCW9wYiA9IChzdHJ1Y3Qgb3BiX3BpYyAqKSBwcml2YXRlOwotCi0JLyogUmVhZCB0aGUgT1BCIE1MUyBJbnRlcnJ1cHQgUmVnaXN0ZXIgZm9yCi0JICogYXNzZXJ0ZWQgaW50ZXJydXB0cyAqLwotCWlyID0gb3BiX2luKG9wYiwgT1BCX01MU0lSKTsKLQlpZiAoIWlyKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlkbyB7Ci0JCS8qIEdldCAxIC0gMzIgc291cmNlLCAqTk9UKiBiaXQgKi8KLQkJc3JjID0gMzIgLSBmZnMoaXIpOwotCi0JCS8qIFRyYW5zbGF0ZSBmcm9tIHRoZSBPUEIncyBjb25jZXB0aW9uIG9mIGludGVycnVwdCBudW1iZXIgdG8KLQkJICogTGludXgncyB2aXJ0dWFsIElSUSAqLwotCi0JCXN1YnZpcnEgPSBpcnFfbGluZWFyX3Jldm1hcChvcGItPmhvc3QsIHNyYyk7Ci0KLQkJZ2VuZXJpY19oYW5kbGVfaXJxKHN1YnZpcnEpOwotCX0gd2hpbGUgKChpciA9IG9wYl9pbihvcGIsIE9QQl9NTFNJUikpKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RydWN0IG9wYl9waWMgKm9wYl9waWNfaW5pdF9vbmUoc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQlzdHJ1Y3Qgb3BiX3BpYyAqb3BiOwotCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkbiwgMCwgJnJlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvcGI6IENvdWxkbid0IHRyYW5zbGF0ZSByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAgTlVMTDsKLQl9Ci0KLQlvcGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3BiX3BpYyksIEdGUF9LRVJORUwpOwotCWlmICghb3BiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib3BiOiBGYWlsZWQgdG8gYWxsb2NhdGUgb3BiIHN0cnVjdCFcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBHZXQgYWNjZXNzIHRvIHRoZSBPUEIgTU1JTyByZWdpc3RlcnMgKi8KLQlvcGItPnJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCArIDB4MTAwMDAsIDB4MTAwMCk7Ci0JaWYgKCFvcGItPnJlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvcGI6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBzcGFjZSFcbiIpOwotCQlnb3RvIGZyZWVfb3BiOwotCX0KLQotCS8qIEFsbG9jYXRlIGFuIGlycSBkb21haW4gc28gdGhhdCBMaW51eCBrbm93cyB0aGF0IGRlc3BpdGUgb25seQotCSAqIGhhdmluZyBvbmUgaW50ZXJydXB0IHRvIGlzc3VlLCB3ZSdyZSB0aGUgY29udHJvbGxlciBmb3IgbXVsdGlwbGUKLQkgKiBoYXJkd2FyZSBJUlFzLCBzbyBsYXRlciB3ZSBjYW4gbG9va3VwIHRoZWlyIHZpcnR1YWwgSVJRcy4gKi8KLQotCW9wYi0+aG9zdCA9IGlycV9kb21haW5fYWRkX2xpbmVhcihkbiwgT1BCX05SX0lSUVMsICZvcGJfaG9zdF9vcHMsIG9wYik7Ci0JaWYgKCFvcGItPmhvc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvcGI6IEZhaWxlZCB0byBhbGxvY2F0ZSBJUlEgaG9zdCFcbiIpOwotCQlnb3RvIGZyZWVfcmVnczsKLQl9Ci0KLQlvcGItPmluZGV4ID0gb3BiX2luZGV4Kys7Ci0Jc3Bpbl9sb2NrX2luaXQoJm9wYi0+bG9jayk7Ci0KLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGJ5IGRlZmF1bHQgKi8KLQlvcGJfb3V0KG9wYiwgT1BCX01MU0FTSUVSLCAwKTsKLQlvcGJfb3V0KG9wYiwgT1BCX01MU0lFUiwgMCk7Ci0KLQkvKiBBQ0sgYW55IGludGVycnVwdHMgbGVmdCBieSBGVyAqLwotCW9wYl9vdXQob3BiLCBPUEJfTUxTSVIsIDB4RkZGRkZGRkYpOwotCi0JcmV0dXJuIG9wYjsKLQotZnJlZV9yZWdzOgotCWlvdW5tYXAob3BiLT5yZWdzKTsKLWZyZWVfb3BiOgotCWtmcmVlKG9wYik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgX19pbml0IG9wYl9waWNfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IG9wYl9waWMgKm9wYjsKLQlpbnQgdmlycTsKLQlpbnQgcmM7Ci0KLQkvKiBDYWxsIGluaXRfb25lIGZvciBlYWNoIE9QQiBkZXZpY2UgKi8KLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUoZG4sIE5VTEwsICJpYm0sb3BiIikgewotCi0JCS8qIEZpbGwgaW4gYW4gT1BCIHN0cnVjdCAqLwotCQlvcGIgPSBvcGJfcGljX2luaXRfb25lKGRuKTsKLQkJaWYgKCFvcGIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9wYjogRmFpbGVkIHRvIGluaXQgbm9kZSwgc2tpcHBlZCFcbiIpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBNYXAgLyBnZXQgb3BiJ3MgaGFyZHdhcmUgdmlydHVhbCBpcnEgKi8KLQkJdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAwKTsKLQkJaWYgKHZpcnEgPD0gMCkgewotCQkJcHJpbnRrKCJvcGI6IGlycV9vcF9wYXJzZV9hbmRfbWFwIGZhaWxlZCFcbiIpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBBdHRhY2ggb3BiIGludGVycnVwdCBoYW5kbGVyIHRvIG5ldyB2aXJ0dWFsIElSUSAqLwotCQlyYyA9IHJlcXVlc3RfaXJxKHZpcnEsIG9wYl9pcnFfaGFuZGxlciwgSVJRRl9OT19USFJFQUQsCi0JCQkJICJPUEIgTFMgQ2FzY2FkZSIsIG9wYik7Ci0JCWlmIChyYykgewotCQkJcHJpbnRrKCJvcGI6IHJlcXVlc3RfaXJxIGZhaWxlZDogJWRcbiIsIHJjKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcHJpbnRrKCJPUEIlZCBpbml0IHdpdGggJWQgSVJRcyBhdCAlcFxuIiwgb3BiLT5pbmRleCwKLQkJCQlPUEJfTlJfSVJRUywgb3BiLT5yZWdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4N2I0MTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvcHNyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMTEsIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0KLSNpbmNsdWRlICJpY3MuaCIKLSNpbmNsdWRlICJ3c3AuaCIKLQotCi1zdGF0aWMgdm9pZCBwc3IyX3NwaW4odm9pZCkKLXsKLQloYXJkX2lycV9kaXNhYmxlKCk7Ci0JZm9yICg7OykKLQkJY29udGludWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzcjJfcmVzdGFydChjaGFyICpjbWQpCi17Ci0JcHNyMl9zcGluKCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBzcjJfcHJvYmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpYm0sd3NwLWNocm9tYSIpKSB7Ci0JCS8qIGNocm9tYSBzeXN0ZW1zIGFsc28gY2xhaW0gdGhleSBhcmUgcHNyMnMgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImlibSxwc3IyIikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWRlZmluZV9tYWNoaW5lKHBzcjJfbWQpIHsKLQkubmFtZQkJCT0gIlBTUjIgQTIiLAotCS5wcm9iZQkJCT0gcHNyMl9wcm9iZSwKLQkuc2V0dXBfYXJjaAkJPSB3c3Bfc2V0dXBfYXJjaCwKLQkucmVzdGFydAkJPSBwc3IyX3Jlc3RhcnQsCi0JLnBvd2VyX29mZgkJPSBwc3IyX3NwaW4sCi0JLmhhbHQJCQk9IHBzcjJfc3BpbiwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLQkuaW5pdF9JUlEJCT0gd3NwX3NldHVwX2lycSwKLQkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKLQkucG93ZXJfc2F2ZQkJPSBib29rM2VfaWRsZSwKLX07Ci0KLW1hY2hpbmVfYXJjaF9pbml0Y2FsbChwc3IyX21kLCB3c3BfcHJvYmVfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zY29tX3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avc2NvbV9zbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3OWNlMC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zY29tX3NtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qCi0gKiBTQ09NIHN1cHBvcnQgZm9yIEEyIHBsYXRmb3JtcwotICoKLSAqIENvcHlyaWdodCAyMDA3LTIwMTEgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgRGF2aWQgR2lic29uLAotICoJCSAgICAgICBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9jcHV0aHJlYWRzLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZ19hMi5oPgotI2luY2x1ZGUgPGFzbS9zY29tLmg+Ci0jaW5jbHVkZSA8YXNtL3VkYmcuaD4KLSNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgotCi0jaW5jbHVkZSAid3NwLmgiCi0KLSNkZWZpbmUgU0NPTV9SQU1DCQkweDJhCQkvKiBSYW0gQ29tbWFuZCAqLwotI2RlZmluZSBTQ09NX1JBTUNfVEdUMV9FWFQJMHg4MDAwMDAwMAotI2RlZmluZSBTQ09NX1JBTUNfU1JDMV9FWFQJMHg0MDAwMDAwMAotI2RlZmluZSBTQ09NX1JBTUNfU1JDMl9FWFQJMHgyMDAwMDAwMAotI2RlZmluZSBTQ09NX1JBTUNfU1JDM19FWFQJMHgxMDAwMDAwMAotI2RlZmluZSBTQ09NX1JBTUNfRU5BQkxFCTB4MDAwODAwMDAKLSNkZWZpbmUgU0NPTV9SQU1DX1RIUkVBRFNFTAkweDAwMDYwMDAwCi0jZGVmaW5lIFNDT01fUkFNQ19FWEVDVVRFCTB4MDAwMTAwMDAKLSNkZWZpbmUgU0NPTV9SQU1DX01TUl9PVkVSUklERQkweDAwMDA4MDAwCi0jZGVmaW5lIFNDT01fUkFNQ19NU1JfUFIJMHgwMDAwNDAwMAotI2RlZmluZSBTQ09NX1JBTUNfTVNSX0dTCTB4MDAwMDIwMDAKLSNkZWZpbmUgU0NPTV9SQU1DX0ZPUkNFCQkweDAwMDAxMDAwCi0jZGVmaW5lIFNDT01fUkFNQ19GTFVTSAkJMHgwMDAwMDgwMAotI2RlZmluZSBTQ09NX1JBTUNfSU5URVJSVVBUCTB4MDAwMDAwMDQKLSNkZWZpbmUgU0NPTV9SQU1DX0VSUk9SCQkweDAwMDAwMDAyCi0jZGVmaW5lIFNDT01fUkFNQ19ET05FCQkweDAwMDAwMDAxCi0jZGVmaW5lIFNDT01fUkFNSQkJMHgyOQkJLyogUmFtIEluc3RydWN0aW9uICovCi0jZGVmaW5lIFNDT01fUkFNSUMJCTB4MjgJCS8qIFJhbSBJbnN0cnVjdGlvbiBhbmQgQ29tbWFuZCAqLwotI2RlZmluZSBTQ09NX1JBTUlDX0lOU04JCTB4ZmZmZmZmZmYwMDAwMDAwMAotI2RlZmluZSBTQ09NX1JBTUQJCTB4MmQJCS8qIFJhbSBEYXRhICovCi0jZGVmaW5lIFNDT01fUkFNREgJCTB4MmUJCS8qIFJhbSBEYXRhIEhpZ2ggKi8KLSNkZWZpbmUgU0NPTV9SQU1ETAkJMHgyZgkJLyogUmFtIERhdGEgTG93ICovCi0jZGVmaW5lIFNDT01fUENDUjAJCTB4MzMJCS8qIFBDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLwotI2RlZmluZSBTQ09NX1BDQ1IwX0VOQUJMRV9ERUJVRwkweDgwMDAwMDAwCi0jZGVmaW5lIFNDT01fUENDUjBfRU5BQkxFX1JBTQkweDQwMDAwMDAwCi0jZGVmaW5lIFNDT01fVEhSQ1RMCQkweDMwCQkvKiBUaHJlYWQgQ29udHJvbCBhbmQgU3RhdHVzICovCi0jZGVmaW5lIFNDT01fVEhSQ1RMX1QwX1NUT1AJMHg4MDAwMDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMV9TVE9QCTB4NDAwMDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDJfU1RPUAkweDIwMDAwMDAwCi0jZGVmaW5lIFNDT01fVEhSQ1RMX1QzX1NUT1AJMHgxMDAwMDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMF9TVEVQCTB4MDgwMDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDFfU1RFUAkweDA0MDAwMDAwCi0jZGVmaW5lIFNDT01fVEhSQ1RMX1QyX1NURVAJMHgwMjAwMDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UM19TVEVQCTB4MDEwMDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDBfUlVOCTB4MDA4MDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDFfUlVOCTB4MDA0MDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDJfUlVOCTB4MDAyMDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDNfUlVOCTB4MDAxMDAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDBfUE0JMHgwMDA4MDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMV9QTQkweDAwMDQwMDAwCi0jZGVmaW5lIFNDT01fVEhSQ1RMX1QyX1BNCTB4MDAwMjAwMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfVDNfUE0JMHgwMDAxMDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMF9VREUJMHgwMDAwODAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMV9VREUJMHgwMDAwNDAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UMl9VREUJMHgwMDAwMjAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UM19VREUJMHgwMDAwMTAwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9BU1lOQ19ESVMJMHgwMDAwMDgwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9UQl9ESVMJMHgwMDAwMDQwMAotI2RlZmluZSBTQ09NX1RIUkNUTF9ERUNfRElTCTB4MDAwMDAyMDAKLSNkZWZpbmUgU0NPTV9USFJDVExfQU5ECQkweDMxCQkvKiBUaHJlYWQgQ29udHJvbCBhbmQgU3RhdHVzICovCi0jZGVmaW5lIFNDT01fVEhSQ1RMX09SCQkweDMyCQkvKiBUaHJlYWQgQ29udHJvbCBhbmQgU3RhdHVzICovCi0KLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHNjb21fbWFwX3QsIHNjb21fcHRycyk7Ci0KLXN0YXRpYyBzY29tX21hcF90IGdldF9zY29tKGludCBjcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCAqZmlyc3RfdGhyZWFkKQotewotCXNjb21fbWFwX3Qgc2NvbSA9IHBlcl9jcHUoc2NvbV9wdHJzLCBjcHUpOwotCWludCB0Y3B1OwotCi0JaWYgKHNjb21fbWFwX29rKHNjb20pKSB7Ci0JCSpmaXJzdF90aHJlYWQgPSAwOwotCQlyZXR1cm4gc2NvbTsKLQl9Ci0KLQkqZmlyc3RfdGhyZWFkID0gMTsKLQotCXNjb20gPSBzY29tX21hcF9kZXZpY2UobnAsIDApOwotCi0JZm9yICh0Y3B1ID0gY3B1X2ZpcnN0X3RocmVhZF9zaWJsaW5nKGNwdSk7Ci0JICAgICB0Y3B1IDw9IGNwdV9sYXN0X3RocmVhZF9zaWJsaW5nKGNwdSk7IHRjcHUrKykKLQkJcGVyX2NwdShzY29tX3B0cnMsIHRjcHUpID0gc2NvbTsKLQotCS8qIEhhY2s6IGZvciB0aGUgYm9vdCBjb3JlLCB0aGlzIHdpbGwgYWN0dWFsbHkgZ2V0IGNhbGxlZCBvbgotCSAqIHRoZSBzZWNvbmQgdGhyZWFkIHVwLCBub3QgdGhlIGZpcnN0IHNvIG91ciB0ZXN0IGFib3ZlIHdpbGwKLQkgKiBzZXQgZmlyc3RfdGhyZWFkIGluY29ycmVjdGx5LiAqLwotCWlmIChjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KSA9PSAwKQotCQkqZmlyc3RfdGhyZWFkID0gMDsKLQotCXJldHVybiBzY29tOwotfQotCi1zdGF0aWMgaW50IGEyX3Njb21fcmFtKHNjb21fbWFwX3Qgc2NvbSwgaW50IHRocmVhZCwgdTMyIGluc24sIGludCBleHRtYXNrKQotewotCXU2NCBjbWQsIG1hc2ssIHZhbDsKLQlpbnQgbiA9IDA7Ci0KLQljbWQgPSAoKHU2NClpbnNuIDw8IDMyKSB8ICgoKHU2NClleHRtYXNrICYgMHhmKSA8PCAyOCkKLQkJfCAoKHU2NCl0aHJlYWQgPDwgMTcpIHwgU0NPTV9SQU1DX0VOQUJMRSB8IFNDT01fUkFNQ19FWEVDVVRFOwotCW1hc2sgPSBTQ09NX1JBTUNfRE9ORSB8IFNDT01fUkFNQ19JTlRFUlJVUFQgfCBTQ09NX1JBTUNfRVJST1I7Ci0KLQlzY29tX3dyaXRlKHNjb20sIFNDT01fUkFNSUMsIGNtZCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChzY29tX3JlYWQoc2NvbSwgU0NPTV9SQU1DLCAmdmFsKSAhPSAwKSB7Ci0JCQlwcl9lcnIoIlNDT00gZXJyb3Igb24gaW5zdHJ1Y3Rpb24gMHglMDh4LCB0aHJlYWQgJWRcbiIsCi0JCQkgICAgICAgaW5zbiwgdGhyZWFkKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodmFsICYgbWFzaykKLQkJCWJyZWFrOwotCQlwcl9kZXZlbCgiV2FpdGluZyBvbiBSQU1DID0gMHglbGx4XG4iLCB2YWwpOwotCQlpZiAoKytuID09IDMpIHsKLQkJCXByX2VycigiUkFNQyB0aW1lb3V0IG9uIGluc3RydWN0aW9uIDB4JTA4eCwgdGhyZWFkICVkXG4iLAotCQkJICAgICAgIGluc24sIHRocmVhZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlpZiAodmFsICYgU0NPTV9SQU1DX0lOVEVSUlVQVCkgewotCQlwcl9lcnIoIlJBTUMgaW50ZXJydXB0IG9uIGluc3RydWN0aW9uIDB4JTA4eCwgdGhyZWFkICVkXG4iLAotCQkgICAgICAgaW5zbiwgdGhyZWFkKTsKLQkJcmV0dXJuIC1TQ09NX1JBTUNfSU5URVJSVVBUOwotCX0KLQotCWlmICh2YWwgJiBTQ09NX1JBTUNfRVJST1IpIHsKLQkJcHJfZXJyKCJSQU1DIGVycm9yIG9uIGluc3RydWN0aW9uIDB4JTA4eCwgdGhyZWFkICVkXG4iLAotCQkgICAgICAgaW5zbiwgdGhyZWFkKTsKLQkJcmV0dXJuIC1TQ09NX1JBTUNfRVJST1I7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYTJfc2NvbV9nZXRncHIoc2NvbV9tYXBfdCBzY29tLCBpbnQgdGhyZWFkLCBpbnQgZ3ByLCBpbnQgYWx0LAotCQkJICB1NjQgKm91dF9ncHIpCi17Ci0JaW50IHJjOwotCi0JLyogb3Igck4sIHJOLCByTiAqLwotCXUzMiBpbnNuID0gMHg3YzAwMDM3OCB8IChncHIgPDwgMjEpIHwgKGdwciA8PCAxNikgfCAoZ3ByIDw8IDExKTsKLQlyYyA9IGEyX3Njb21fcmFtKHNjb20sIHRocmVhZCwgaW5zbiwgYWx0ID8gMHhmIDogMHgwKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXJldHVybiBzY29tX3JlYWQoc2NvbSwgU0NPTV9SQU1ELCBvdXRfZ3ByKTsKLX0KLQotc3RhdGljIGludCBhMl9zY29tX2dldHNwcihzY29tX21hcF90IHNjb20sIGludCB0aHJlYWQsIGludCBzcHIsIHU2NCAqb3V0X3NwcikKLXsKLQlpbnQgcmMsIHNwcmhpLCBzcHJsbzsKLQl1MzIgaW5zbjsKLQotCXNwcmhpID0gc3ByID4+IDU7Ci0Jc3BybG8gPSBzcHIgJiAweDFmOwotCWluc24gPSAweDdjMjAwMmE2IHwgKHNwcmxvIDw8IDE2KSB8IChzcHJoaSA8PCAxMSk7IC8qIG1mc3ByIHIxLHNwciAqLwotCi0JaWYgKHNwciA9PSAweDBmZjApCi0JCWluc24gPSAweDdjMjAwMGE2OyAvKiBtZm1zciByMSAqLwotCi0JcmMgPSBhMl9zY29tX3JhbShzY29tLCB0aHJlYWQsIGluc24sIDB4Zik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0JcmV0dXJuIGEyX3Njb21fZ2V0Z3ByKHNjb20sIHRocmVhZCwgMSwgMSwgb3V0X3Nwcik7Ci19Ci0KLXN0YXRpYyBpbnQgYTJfc2NvbV9zZXRncHIoc2NvbV9tYXBfdCBzY29tLCBpbnQgdGhyZWFkLCBpbnQgZ3ByLAotCQkJICBpbnQgYWx0LCB1NjQgdmFsKQotewotCXUzMiBsaXMgPSAweDNjMDAwMDAwIHwgKGdwciA8PCAyMSk7Ci0JdTMyIGxpID0gMHgzODAwMDAwMCB8IChncHIgPDwgMjEpOwotCXUzMiBvcmlzID0gMHg2NDAwMDAwMCB8IChncHIgPDwgMjEpIHwgKGdwciA8PCAxNik7Ci0JdTMyIG9yaSA9IDB4NjAwMDAwMDAgfCAoZ3ByIDw8IDIxKSB8IChncHIgPDwgMTYpOwotCXUzMiBybGRpY3IzMiA9IDB4NzgwMDA3YzYgfCAoZ3ByIDw8IDIxKSB8IChncHIgPDwgMTYpOwotCXUzMiBoaWdoZXN0ID0gdmFsID4+IDQ4OwotCXUzMiBoaWdoZXIgPSAodmFsID4+IDMyKSAmIDB4ZmZmZjsKLQl1MzIgaGlnaCA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCXUzMiBsb3cgPSB2YWwgJiAweGZmZmY7Ci0JaW50IGxleHQgPSBhbHQgPyAweDggOiAweDA7Ci0JaW50IG9leHQgPSBhbHQgPyAweGYgOiAweDA7Ci0JaW50IHJjID0gMDsKLQotCWlmIChoaWdoZXN0KQotCQlyYyB8PSBhMl9zY29tX3JhbShzY29tLCB0aHJlYWQsIGxpcyB8IGhpZ2hlc3QsIGxleHQpOwotCi0JaWYgKGhpZ2hlcikgewotCQlpZiAoaGlnaGVzdCkKLQkJCXJjIHw9IGEyX3Njb21fcmFtKHNjb20sIHRocmVhZCwgb3JpcyB8IGhpZ2hlciwgb2V4dCk7Ci0JCWVsc2UKLQkJCXJjIHw9IGEyX3Njb21fcmFtKHNjb20sIHRocmVhZCwgbGkgfCBoaWdoZXIsIGxleHQpOwotCX0KLQotCWlmIChoaWdoZXN0IHx8IGhpZ2hlcikKLQkJcmMgfD0gYTJfc2NvbV9yYW0oc2NvbSwgdGhyZWFkLCBybGRpY3IzMiwgb2V4dCk7Ci0KLQlpZiAoaGlnaCkgewotCQlpZiAoaGlnaGVzdCB8fCBoaWdoZXIpCi0JCQlyYyB8PSBhMl9zY29tX3JhbShzY29tLCB0aHJlYWQsIG9yaXMgfCBoaWdoLCBvZXh0KTsKLQkJZWxzZQotCQkJcmMgfD0gYTJfc2NvbV9yYW0oc2NvbSwgdGhyZWFkLCBsaXMgfCBoaWdoLCBsZXh0KTsKLQl9Ci0KLQlpZiAoaGlnaGVzdCB8fCBoaWdoZXIgfHwgaGlnaCkKLQkJcmMgfD0gYTJfc2NvbV9yYW0oc2NvbSwgdGhyZWFkLCBvcmkgfCBsb3csIG9leHQpOwotCWVsc2UKLQkJcmMgfD0gYTJfc2NvbV9yYW0oc2NvbSwgdGhyZWFkLCBsaSB8IGxvdywgbGV4dCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYTJfc2NvbV9zZXRzcHIoc2NvbV9tYXBfdCBzY29tLCBpbnQgdGhyZWFkLCBpbnQgc3ByLCB1NjQgdmFsKQotewotCWludCBzcHJoaSA9IHNwciA+PiA1OwotCWludCBzcHJsbyA9IHNwciAmIDB4MWY7Ci0JLyogbXRzcHIgc3ByLCByMSAqLwotCXUzMiBpbnNuID0gMHg3YzIwMDNhNiB8IChzcHJsbyA8PCAxNikgfCAoc3ByaGkgPDwgMTEpOwotCi0JaWYgKHNwciA9PSAweDBmZjApCi0JCWluc24gPSAweDdjMjAwMTI0OyAvKiBtdG1zciByMSAqLwotCi0JaWYgKGEyX3Njb21fc2V0Z3ByKHNjb20sIHRocmVhZCwgMSwgMSwgdmFsKSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIGEyX3Njb21fcmFtKHNjb20sIHRocmVhZCwgaW5zbiwgMHhmKTsKLX0KLQotc3RhdGljIGludCBhMl9zY29tX2luaXRpYWxfdGxiKHNjb21fbWFwX3Qgc2NvbSwgaW50IHRocmVhZCkKLXsKLQlleHRlcm4gdTMyIGEyX3RsYmluaXRfY29kZV9zdGFydFtdLCBhMl90bGJpbml0X2NvZGVfZW5kW107Ci0JZXh0ZXJuIHUzMiBhMl90bGJpbml0X2FmdGVyX2lwcm90X2ZsdXNoW107Ci0JZXh0ZXJuIHUzMiBhMl90bGJpbml0X2FmdGVyX2xpbmVhcl9tYXBbXTsKLQl1MzIgYXNzb2MsIGVudHJpZXMsIGk7Ci0JdTY0IGVwbiwgdGxiY2ZnOwotCXUzMiAqcDsKLQlpbnQgcmM7Ci0KLQkvKiBJbnZhbGlkYXRlIGFsbCBlbnRyaWVzIChpbmNsdWRpbmcgaXByb3QpICovCi0KLQlyYyA9IGEyX3Njb21fZ2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9UTEIwQ0ZHLCAmdGxiY2ZnKTsKLQlpZiAocmMpCi0JCWdvdG8gc2NvbV9mYWlsOwotCWVudHJpZXMgPSB0bGJjZmcgJiBUTEJuQ0ZHX05fRU5UUlk7Ci0JYXNzb2MgPSAodGxiY2ZnICYgVExCbkNGR19BU1NPQykgPj4gMjQ7Ci0JZXBuID0gMDsKLQotCS8qIFNldCBNTVVDUjIgdG8gZW5hYmxlIDRLLCA2NEssIDFNLCAxNk0gYW5kIDFHIHBhZ2VzICovCi0JYTJfc2NvbV9zZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX01NVUNSMiwgMHgwMDBhNzUzMSk7Ci0JLyogU2V0IE1NVUNSMyB0byB3cml0ZSBhbGwgdGhpZHMgYml0IHRvIHRoZSBUTEIgKi8KLQlhMl9zY29tX3NldHNwcihzY29tLCB0aHJlYWQsIFNQUk5fTU1VQ1IzLCAweDAwMDAwMDBmKTsKLQotCS8qIFNldCBNQVMxIGZvciAxRyBwYWdlIHNpemUsIGFuZCBNQVMyIHRvIG91ciBpbml0aWFsIEVQTiAqLwotCWEyX3Njb21fc2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9NQVMxLCBNQVMxX1RTSVpFKEJPT0szRV9QQUdFU1pfMUdCKSk7Ci0JYTJfc2NvbV9zZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX01BUzIsIGVwbik7Ci0JZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgewotCi0JCWEyX3Njb21fc2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9NQVMwLCBNQVMwX0VTRUwoaSAlIGFzc29jKSk7Ci0KLQkJLyogdGxid2UgKi8KLQkJcmMgPSBhMl9zY29tX3JhbShzY29tLCB0aHJlYWQsIDB4N2MwMDA3YTQsIDApOwotCQlpZiAocmMpCi0JCQlnb3RvIHNjb21fZmFpbDsKLQotCQkvKiBOZXh0IGVudHJ5IGlzIG5ldyBhZGRyZXNzPyAqLwotCQlpZigoaSArIDEpICUgYXNzb2MgPT0gMCkgewotCQkJZXBuICs9ICgxIDw8IDMwKTsKLQkJCWEyX3Njb21fc2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9NQVMyLCBlcG4pOwotCQl9Ci0JfQotCi0JLyogU2V0dXAgYXJncyBmb3IgbGluZWFyIG1hcHBpbmcgKi8KLQlyYyA9IGEyX3Njb21fc2V0Z3ByKHNjb20sIHRocmVhZCwgMywgMCwgTUFTMF9UTEJTRUwoMCkpOwotCWlmIChyYykKLQkJZ290byBzY29tX2ZhaWw7Ci0KLQkvKiBMaW5lYXIgbWFwcGluZyAqLwotCWZvciAocCA9IGEyX3RsYmluaXRfY29kZV9zdGFydDsgcCA8IGEyX3RsYmluaXRfYWZ0ZXJfbGluZWFyX21hcDsgcCsrKSB7Ci0JCXJjID0gYTJfc2NvbV9yYW0oc2NvbSwgdGhyZWFkLCAqcCwgMCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gc2NvbV9mYWlsOwotCX0KLQotCS8qCi0JICogRm9yIHRoZSBib290IHRocmVhZCwgYmV0d2VlbiB0aGUgbGluZWFyIG1hcHBpbmcgYW5kIHRoZSBkZWJ1ZwotCSAqIG1hcHBpbmdzIHRoZXJlIGlzIGEgbG9vcCB0byBmbHVzaCBpcHJvdCBtYXBwaW5ncy4gUmFtbWluZyBkb2Vzbid0IGRvCi0JICogYnJhbmNoZXMsIGJ1dCB0aGUgc2Vjb25kYXJ5IHRocmVhZHMgZG9uJ3QgbmVlZCB0byBiZSBuZWFybHkgYXMgc21hcnQKLQkgKiAoaS5lLiB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGludmFsaWRhdGluZyB0aGUgbWFwcGluZyB3ZSdyZQotCSAqIHN0YW5kaW5nIG9uKS4KLQkgKi8KLQotCS8qIERlYnVnIG1hcHBpbmdzLiBFeHBlY3RzIHIxMSA9IE1BUzAgZnJvbSBsaW5lYXIgbWFwIChzZXQgYWJvdmUpICovCi0JZm9yIChwID0gYTJfdGxiaW5pdF9hZnRlcl9pcHJvdF9mbHVzaDsgcCA8IGEyX3RsYmluaXRfY29kZV9lbmQ7IHArKykgewotCQlyYyA9IGEyX3Njb21fcmFtKHNjb20sIHRocmVhZCwgKnAsIDApOwotCQlpZiAocmMpCi0JCQlnb3RvIHNjb21fZmFpbDsKLQl9Ci0KLXNjb21fZmFpbDoKLQlpZiAocmMpCi0JCXByX2VycigiU2V0dGluZyB1cCBpbml0aWFsIFRMQiBmYWlsZWQsIGVyciAlZFxuIiwgcmMpOwotCi0JaWYgKHJjID09IC1TQ09NX1JBTUNfSU5URVJSVVBUKSB7Ci0JCS8qIEludGVycnVwdCwgZHVtcCBzb21lIHN0YXR1cyAqLwotCQlpbnQgcmNbMTBdOwotCQl1NjQgaWFyLCBzcnIwLCBzcnIxLCBlc3IsIG1hczAsIG1hczEsIG1hczIsIG1hczdfMywgbWFzOCwgY2NyMjsKLQkJcmNbMF0gPSBhMl9zY29tX2dldHNwcihzY29tLCB0aHJlYWQsIFNQUk5fSUFSLCAmaWFyKTsKLQkJcmNbMV0gPSBhMl9zY29tX2dldHNwcihzY29tLCB0aHJlYWQsIFNQUk5fU1JSMCwgJnNycjApOwotCQlyY1syXSA9IGEyX3Njb21fZ2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9TUlIxLCAmc3JyMSk7Ci0JCXJjWzNdID0gYTJfc2NvbV9nZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX0VTUiwgJmVzcik7Ci0JCXJjWzRdID0gYTJfc2NvbV9nZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX01BUzAsICZtYXMwKTsKLQkJcmNbNV0gPSBhMl9zY29tX2dldHNwcihzY29tLCB0aHJlYWQsIFNQUk5fTUFTMSwgJm1hczEpOwotCQlyY1s2XSA9IGEyX3Njb21fZ2V0c3ByKHNjb20sIHRocmVhZCwgU1BSTl9NQVMyLCAmbWFzMik7Ci0JCXJjWzddID0gYTJfc2NvbV9nZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX01BUzdfTUFTMywgJm1hczdfMyk7Ci0JCXJjWzhdID0gYTJfc2NvbV9nZXRzcHIoc2NvbSwgdGhyZWFkLCBTUFJOX01BUzgsICZtYXM4KTsKLQkJcmNbOV0gPSBhMl9zY29tX2dldHNwcihzY29tLCB0aHJlYWQsIFNQUk5fQTJfQ0NSMiwgJmNjcjIpOwotCQlwcl9lcnIoIiAtPiByZXRyZWl2ZWQgSUFSID0weCVsbHggKGVyciAlZClcbiIsIGlhciwgcmNbMF0pOwotCQlwcl9lcnIoIiAgICByZXRyZWl2ZWQgU1JSMD0weCVsbHggKGVyciAlZClcbiIsIHNycjAsIHJjWzFdKTsKLQkJcHJfZXJyKCIgICAgcmV0cmVpdmVkIFNSUjE9MHglbGx4IChlcnIgJWQpXG4iLCBzcnIxLCByY1syXSk7Ci0JCXByX2VycigiICAgIHJldHJlaXZlZCBFU1IgPTB4JWxseCAoZXJyICVkKVxuIiwgZXNyLCByY1szXSk7Ci0JCXByX2VycigiICAgIHJldHJlaXZlZCBNQVMwPTB4JWxseCAoZXJyICVkKVxuIiwgbWFzMCwgcmNbNF0pOwotCQlwcl9lcnIoIiAgICByZXRyZWl2ZWQgTUFTMT0weCVsbHggKGVyciAlZClcbiIsIG1hczEsIHJjWzVdKTsKLQkJcHJfZXJyKCIgICAgcmV0cmVpdmVkIE1BUzI9MHglbGx4IChlcnIgJWQpXG4iLCBtYXMyLCByY1s2XSk7Ci0JCXByX2VycigiICAgIHJldHJlaXZlZCBNUzczPTB4JWxseCAoZXJyICVkKVxuIiwgbWFzN18zLCByY1s3XSk7Ci0JCXByX2VycigiICAgIHJldHJlaXZlZCBNQVM4PTB4JWxseCAoZXJyICVkKVxuIiwgbWFzOCwgcmNbOF0pOwotCQlwcl9lcnIoIiAgICByZXRyZWl2ZWQgQ0NSMj0weCVsbHggKGVyciAlZClcbiIsIGNjcjIsIHJjWzldKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhMl9zY29tX3N0YXJ0dXBfY3B1KHVuc2lnbmVkIGludCBsY3B1LCBpbnQgdGhyX2lkeCwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1NjQgaW5pdF9pYXIsIGluaXRfbXNyLCBpbml0X2NjcjI7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9oZXJlOwotCWludCByYywgY29yZV9zZXR1cDsKLQlzY29tX21hcF90IHNjb207Ci0JdTY0IHBjY3IwOwotCi0Jc2NvbSA9IGdldF9zY29tKGxjcHUsIG5wLCAmY29yZV9zZXR1cCk7Ci0JaWYgKCFzY29tKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgbWFwIFNDT00gZm9yIENQVSVkXG4iLCBsY3B1KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByX2RldmVsKCJCcmluZ2luZyB1cCBDUFUlZCB1c2luZyBTQ09NLi4uXG4iLCBsY3B1KTsKLQotCWlmIChzY29tX3JlYWQoc2NvbSwgU0NPTV9QQ0NSMCwgJnBjY3IwKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWFNDT00gZmFpbHVyZSByZWFkbmcgUENDUjAgb24gQ1BVJWRcbiIsIGxjcHUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNjb21fd3JpdGUoc2NvbSwgU0NPTV9QQ0NSMCwgcGNjcjAgfCBTQ09NX1BDQ1IwX0VOQUJMRV9ERUJVRyB8Ci0JCQkJICAgICBTQ09NX1BDQ1IwX0VOQUJMRV9SQU0pOwotCi0JLyogU3RvcCB0aGUgdGhlYWQgd2l0aCBUSFJDVEwuIElmIHdlIGFyZSBzZXR0aW5nIHVwIHRoZSBUTEIgd2Ugc3RvcCBhbGwKLQkgKiB0aHJlYWRzLiBXZSBhbHNvIGRpc2FibGUgYXN5bmNocm9ub3VzIGludGVycnVwdHMgd2hpbGUgUkFNaW5nLgotCSAqLwotCWlmIChjb3JlX3NldHVwKQotCQlzY29tX3dyaXRlKHNjb20sIFNDT01fVEhSQ1RMX09SLAotCQkJICAgICAgU0NPTV9USFJDVExfVDBfU1RPUCB8Ci0JCQkgICAgICBTQ09NX1RIUkNUTF9UMV9TVE9QIHwKLQkJCSAgICAgIFNDT01fVEhSQ1RMX1QyX1NUT1AgfAotCQkJICAgICAgU0NPTV9USFJDVExfVDNfU1RPUCB8Ci0JCQkgICAgICBTQ09NX1RIUkNUTF9BU1lOQ19ESVMpOwotCWVsc2UKLQkJc2NvbV93cml0ZShzY29tLCBTQ09NX1RIUkNUTF9PUiwgU0NPTV9USFJDVExfVDBfU1RPUCA+PiB0aHJfaWR4KTsKLQotCS8qIEZsdXNoIGl0cyBwaXBlbGluZSBqdXN0IGluIGNhc2UgKi8KLQlzY29tX3dyaXRlKHNjb20sIFNDT01fUkFNQywgKCh1NjQpdGhyX2lkeCA8PCAxNykgfAotCQkgICAgICBTQ09NX1JBTUNfRkxVU0ggfCBTQ09NX1JBTUNfRU5BQkxFKTsKLQotCWEyX3Njb21fZ2V0c3ByKHNjb20sIHRocl9pZHgsIFNQUk5fSUFSLCAmaW5pdF9pYXIpOwotCWEyX3Njb21fZ2V0c3ByKHNjb20sIHRocl9pZHgsIDB4MGZmMCwgJmluaXRfbXNyKTsKLQlhMl9zY29tX2dldHNwcihzY29tLCB0aHJfaWR4LCBTUFJOX0EyX0NDUjIsICZpbml0X2NjcjIpOwotCi0JLyogU2V0IE1TUiB0byBNU1JfQ00gKDB4MGZmMCBpcyBtYWdpYyB2YWx1ZSBmb3IgTVNSX0NNKSAqLwotCXJjID0gYTJfc2NvbV9zZXRzcHIoc2NvbSwgdGhyX2lkeCwgMHgwZmYwLCBNU1JfQ00pOwotCWlmIChyYykgewotCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgTVNSICEgZXJyICVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBSQU0gaW4gYW4gc3luYy9pc3luYyBmb3IgdGhlIHNha2Ugb2YgaXQgKi8KLQlhMl9zY29tX3JhbShzY29tLCB0aHJfaWR4LCAweDdjMDAwNGFjLCAwKTsKLQlhMl9zY29tX3JhbShzY29tLCB0aHJfaWR4LCAweDRjMDAwMTJjLCAwKTsKLQotCWlmIChjb3JlX3NldHVwKSB7Ci0JCXByX2RldmVsKCJDUFUlZCBpcyBmaXJzdCB0aHJlYWQgaW4gY29yZSwgaW5pdGlhbGl6aW5nIFRMQi4uLlxuIiwKLQkJCSBsY3B1KTsKLQkJcmMgPSBhMl9zY29tX2luaXRpYWxfdGxiKHNjb20sIHRocl9pZHgpOwotCQlpZiAocmMpCi0JCQlnb3RvIGZhaWw7Ci0JfQotCi0Jc3RhcnRfaGVyZSA9IHBwY19mdW5jdGlvbl9lbnRyeShjb3JlX3NldHVwID8gZ2VuZXJpY19zZWNvbmRhcnlfc21wX2luaXQKLQkJCQkJOiBnZW5lcmljX3NlY29uZGFyeV90aHJlYWRfaW5pdCk7Ci0JcHJfZGV2ZWwoIkNQVSVkIGVudHJ5IHBvaW50IGF0IDB4JWx4Li4uXG4iLCBsY3B1LCBzdGFydF9oZXJlKTsKLQotCXJjIHw9IGEyX3Njb21fc2V0c3ByKHNjb20sIHRocl9pZHgsIFNQUk5fSUFSLCBzdGFydF9oZXJlKTsKLQlyYyB8PSBhMl9zY29tX3NldGdwcihzY29tLCB0aHJfaWR4LCAzLCAwLAotCQkJICAgICBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGxjcHUpKTsKLQkvKgotCSAqIFRlbGwgYm9vazNlX3NlY29uZGFyeV9jb3JlX2luaXQgbm90IHRvIHNldCB1cCB0aGUgVExCLCB3ZSd2ZQotCSAqIGFscmVhZHkgZG9uZSB0aGF0LgotCSAqLwotCXJjIHw9IGEyX3Njb21fc2V0Z3ByKHNjb20sIHRocl9pZHgsIDQsIDAsIDEpOwotCi0JcmMgfD0gYTJfc2NvbV9zZXRzcHIoc2NvbSwgdGhyX2lkeCwgU1BSTl9URU5TLCAweDEgPDwgdGhyX2lkeCk7Ci0KLQlzY29tX3dyaXRlKHNjb20sIFNDT01fUkFNQywgMCk7Ci0Jc2NvbV93cml0ZShzY29tLCBTQ09NX1RIUkNUTF9BTkQsIH4oU0NPTV9USFJDVExfVDBfU1RPUCA+PiB0aHJfaWR4KSk7Ci0Jc2NvbV93cml0ZShzY29tLCBTQ09NX1BDQ1IwLCBwY2NyMCk7Ci1mYWlsOgotCXByX2RldmVsKCIgIFNDT00gaW5pdGlhbGl6YXRpb24gJXNcbiIsIHJjID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiT2xkIElBUj0weCUwOGxseCBNU1I9MHglMDhsbHggQ0NSMj0weCUwOGxseFxuIiwKLQkJICAgICAgIGluaXRfaWFyLCBpbml0X21zciwgaW5pdF9jY3IyKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zY29tX3dzcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avc2NvbV93c3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzOGI0ZC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zY29tX3dzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqICBTQ09NIGJhY2tlbmQgZm9yIFdTUAotICoKLSAqICBDb3B5cmlnaHQgMjAxMCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotCi0jaW5jbHVkZSA8YXNtL2NwdXRocmVhZHMuaD4KLSNpbmNsdWRlIDxhc20vcmVnX2EyLmg+Ci0jaW5jbHVkZSA8YXNtL3Njb20uaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotCi0jaW5jbHVkZSAid3NwLmgiCi0KLQotc3RhdGljIHNjb21fbWFwX3Qgd3NwX3Njb21fbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCB1NjQgcmVnLCB1NjQgY291bnQpCi17Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0JdTY0IHhzY29tX2FkZHI7Ci0KLQlpZiAoIW9mX2dldF9wcm9wZXJ0eShkZXYsICJzY29tLWNvbnRyb2xsZXIiLCBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBkZXZpY2UgJXMgaXMgbm90IGEgU0NPTSBjb250cm9sbGVyXG4iLAotCQkJX19mdW5jX18sIGRldi0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIFNDT01fTUFQX0lOVkFMSUQ7Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcikpIHsKLQkJcHJfZGVidWcoIkZhaWxlZCB0byBmaW5kIFNDT00gY29udHJvbGxlciBhZGRyZXNzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJhbnNmb3JtIHRoZSBTQ09NIGFkZHJlc3MgaW50byBhbiBYU0NPTSBvZmZzZXQgKi8KLQl4c2NvbV9hZGRyID0gKChyZWcgJiAweDdmMDAwMDAwKSA+PiAxKSB8ICgocmVnICYgMHhmZmZmZikgPDwgMyk7Ci0KLQlyZXR1cm4gKHNjb21fbWFwX3QpaW9yZW1hcChyLnN0YXJ0ICsgeHNjb21fYWRkciwgY291bnQgPDwgMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdzcF9zY29tX3VubWFwKHNjb21fbWFwX3QgbWFwKQotewotCWlvdW5tYXAoKHZvaWQgKiltYXApOwotfQotCi1zdGF0aWMgaW50IHdzcF9zY29tX3JlYWQoc2NvbV9tYXBfdCBtYXAsIHU2NCByZWcsIHU2NCAqdmFsdWUpCi17Ci0JdTY0IF9faW9tZW0gKmFkZHIgPSAodTY0IF9faW9tZW0gKiltYXA7Ci0KLQkqdmFsdWUgPSBpbl9iZTY0KGFkZHIgKyByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NwX3Njb21fd3JpdGUoc2NvbV9tYXBfdCBtYXAsIHU2NCByZWcsIHU2NCB2YWx1ZSkKLXsKLQl1NjQgX19pb21lbSAqYWRkciA9ICh1NjQgX19pb21lbSAqKW1hcDsKLQotCW91dF9iZTY0KGFkZHIgKyByZWcsIHZhbHVlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNjb21fY29udHJvbGxlciB3c3Bfc2NvbV9jb250cm9sbGVyID0gewotCS5tYXAJPSB3c3Bfc2NvbV9tYXAsCi0JLnVubWFwCT0gd3NwX3Njb21fdW5tYXAsCi0JLnJlYWQJPSB3c3Bfc2NvbV9yZWFkLAotCS53cml0ZQk9IHdzcF9zY29tX3dyaXRlCi19OwotCi12b2lkIHNjb21faW5pdF93c3Aodm9pZCkKLXsKLQlzY29tX2luaXQoJndzcF9zY29tX2NvbnRyb2xsZXIpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWMyZjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSAid3NwLmgiCi0KLS8qCi0gKiBGaW5kIGNoaXAtaWQgYnkgd2Fsa2luZyB1cCBkZXZpY2UgdHJlZSBsb29raW5nIGZvciBpYm0sd3NwLWNoaXAtaWQgcHJvcGVydHkuCi0gKiBXb24ndCB3b3JrIGZvciBub2RlcyB0aGF0IGFyZSBub3QgYSBkZXNjZW5kYW50IG9mIGEgd3NwIG5vZGUuCi0gKi8KLWludCB3c3BfZ2V0X2NoaXBfaWQoc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQljb25zdCB1MzIgKnA7Ci0JaW50IHJjOwotCi0JLyogU3RhcnQgbG9va2luZyBhdCB0aGUgc3BlY2lmaWVkIG5vZGUsIG5vdCBpdHMgcGFyZW50ICovCi0JZG4gPSBvZl9ub2RlX2dldChkbik7Ci0Jd2hpbGUgKGRuICYmICEocCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSx3c3AtY2hpcC1pZCIsIE5VTEwpKSkKLQkJZG4gPSBvZl9nZXRfbmV4dF9wYXJlbnQoZG4pOwotCi0JaWYgKCFkbikKLQkJcmV0dXJuIC0xOwotCi0JcmMgPSAqcDsKLQlvZl9ub2RlX3B1dChkbik7Ci0KLQlyZXR1cm4gcmM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJhMThiLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqICBTTVAgU3VwcG9ydCBmb3IgQTIgcGxhdGZvcm1zCi0gKgotICogIENvcHlyaWdodCAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotCi0jaW5jbHVkZSA8YXNtL2RiZWxsLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20veGljcy5oPgotCi0jaW5jbHVkZSAiaWNzLmgiCi0jaW5jbHVkZSAid3NwLmgiCi0KLXN0YXRpYyB2b2lkIHNtcF9hMl9zZXR1cF9jcHUoaW50IGNwdSkKLXsKLQlkb29yYmVsbF9zZXR1cF90aGlzX2NwdSgpOwotCi0JaWYgKGNwdSAhPSBib290X2NwdWlkKQotCQl4aWNzX3NldHVwX2NwdSgpOwotfQotCi1pbnQgc21wX2EyX2tpY2tfY3B1KGludCBucikKLXsKLQljb25zdCBjaGFyICplbmFibGVfbWV0aG9kOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JaW50IHRocl9pZHg7Ci0KLQlpZiAobnIgPCAwIHx8IG5yID49IE5SX0NQVVMpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JbnAgPSBvZl9nZXRfY3B1X25vZGUobnIsICZ0aHJfaWR4KTsKLQlpZiAoIW5wKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWVuYWJsZV9tZXRob2QgPSBvZl9nZXRfcHJvcGVydHkobnAsICJlbmFibGUtbWV0aG9kIiwgTlVMTCk7Ci0JcHJfZGV2ZWwoIkNQVSVkIGhhcyBlbmFibGUtbWV0aG9kOiBcIiVzXCJcbiIsIG5yLCBlbmFibGVfbWV0aG9kKTsKLQotCWlmICghZW5hYmxlX21ldGhvZCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ1BVJWQgaGFzIG5vIGVuYWJsZS1tZXRob2RcbiIsIG5yKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfSBlbHNlIGlmIChzdHJjbXAoZW5hYmxlX21ldGhvZCwgImlibSxhMi1zY29tIikgPT0gMCkgewotCQlpZiAoYTJfc2NvbV9zdGFydHVwX2NwdShuciwgdGhyX2lkeCwgbnApKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1BVJWQ6IERvbid0IHVuZGVyc3RhbmQgZW5hYmxlLW1ldGhvZCBcIiVzXCJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIG5yLCBlbmFibGVfbWV0aG9kKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBUaGUgcHJvY2Vzc29yIGlzIGN1cnJlbnRseSBzcGlubmluZywgd2FpdGluZyBmb3IgdGhlCi0JICogY3B1X3N0YXJ0IGZpZWxkIHRvIGJlY29tZSBub24temVybyBBZnRlciB3ZSBzZXQgY3B1X3N0YXJ0LAotCSAqIHRoZSBwcm9jZXNzb3Igd2lsbCBjb250aW51ZSBvbiB0byBzZWNvbmRhcnlfc3RhcnQKLQkgKi8KLQlwYWNhW25yXS5jcHVfc3RhcnQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNtcF9hMl9wcm9iZSh2b2lkKQotewotCXJldHVybiBudW1fcG9zc2libGVfY3B1cygpOwotfQotCi1zdGF0aWMgc3RydWN0IHNtcF9vcHNfdCBhMl9zbXBfb3BzID0gewotCS5tZXNzYWdlX3Bhc3MJPSBOVUxMLAkvKiBVc2Ugc21wX211eGVkX2lwaV9tZXNzYWdlX3Bhc3MgKi8KLQkuY2F1c2VfaXBpCT0gZG9vcmJlbGxfY2F1c2VfaXBpLAotCS5wcm9iZQkJPSBzbXBfYTJfcHJvYmUsCi0JLmtpY2tfY3B1CT0gc21wX2EyX2tpY2tfY3B1LAotCS5zZXR1cF9jcHUJPSBzbXBfYTJfc2V0dXBfY3B1LAotfTsKLQotdm9pZCBfX2luaXQgYTJfc2V0dXBfc21wKHZvaWQpCi17Ci0Jc21wX29wcyA9ICZhMl9zbXBfb3BzOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjZDFmMC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAxMSwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2NvbS5oPgotCi0jaW5jbHVkZSAid3NwLmgiCi0jaW5jbHVkZSAiaWNzLmgiCi0KLSNkZWZpbmUgV1NQX1NPQ19DT01QQVRJQkxFCSJpYm0sd3NwLXNvYyIKLSNkZWZpbmUgUEJJQ19DT01QQVRJQkxFCQkiaWJtLHdzcC1wYmljIgotI2RlZmluZSBDT1BST19DT01QQVRJQkxFCSJpYm0sd3NwLWNvcHJvY2Vzc29yIgotCi1zdGF0aWMgaW50IF9faW5pdCB3c3BfcHJvYmVfYnVzZXModm9pZCkKLXsKLQlzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJ1c19pZHNbXSA9IHsKLQkJLyoKLQkJICogZXZlcnkgbm9kZSBpbiBiZXR3ZWVuIG5lZWRzIHRvIGJlIGhlcmUgb3IgeW91IHdvbid0Ci0JCSAqIGZpbmQgaXQKLQkJICovCi0JCXsgLmNvbXBhdGlibGUgPSBXU1BfU09DX0NPTVBBVElCTEUsIH0sCi0JCXsgLmNvbXBhdGlibGUgPSBQQklDX0NPTVBBVElCTEUsIH0sCi0JCXsgLmNvbXBhdGlibGUgPSBDT1BST19DT01QQVRJQkxFLCB9LAotCQl7fSwKLQl9OwotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBidXNfaWRzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCB3c3Bfc2V0dXBfYXJjaCh2b2lkKQotewotCS8qIGluaXQgdG8gc29tZSB+c2FuZSB2YWx1ZSB1bnRpbCBjYWxpYnJhdGVfZGVsYXkoKSBydW5zICovCi0JbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDA7Ci0KLQlzY29tX2luaXRfd3NwKCk7Ci0KLQkvKiBTZXR1cCBTTVAgY2FsbGJhY2sgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0JYTJfc2V0dXBfc21wKCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUENJCi0Jd3NwX3NldHVwX3BjaSgpOwotI2VuZGlmCi19Ci0KLXZvaWQgX19pbml0IHdzcF9zZXR1cF9pcnEodm9pZCkKLXsKLQl3c3BfaW5pdF9pcnEoKTsKLQlvcGJfcGljX2luaXQoKTsKLX0KLQotCi1pbnQgX19pbml0IHdzcF9wcm9iZV9kZXZpY2VzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCS8qIE91ciBSVEMgaXMgYSBkczE1MDAuIEl0IHNlZW1zIHRvIGJlIHByb2dyYW1hdGljYWxseSBjb21wYXRpYmxlCi0JICogd2l0aCB0aGUgZHMxNTExIGZvciB3aGljaCB3ZSBoYXZlIGEgZHJpdmVyIHNvIGxldCdzIHVzZSB0aGF0Ci0JICovCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZGFsbGFzLGRzMTUwMCIpOwotCWlmIChucCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0JCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSA9PSAwKQotCQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZHMxNTExIiwgMCwgJnJlcywgMSk7Ci0JfQotCi0Jd3NwX3Byb2JlX2J1c2VzKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB3c3BfaGFsdCh2b2lkKQotewotCXU2NCB2YWw7Ci0Jc2NvbV9tYXBfdCBtOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IGRldmljZV9ub2RlICptaW5lOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWU7Ci0JaW50IHJjOwotCi0JbWUgPSBvZl9nZXRfY3B1X25vZGUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBOVUxMKTsKLQltaW5lID0gc2NvbV9maW5kX3BhcmVudChtZSk7Ci0KLQkvKiBUaGlzIHdpbGwgaGFsdCBhbGwgdGhlIEEycyBidXQgbm90IHBvd2VyIG9mZiB0aGUgY2hpcCAqLwotCWZvcl9lYWNoX25vZGVfd2l0aF9wcm9wZXJ0eShkbiwgInNjb20tY29udHJvbGxlciIpIHsKLQkJaWYgKGRuID09IG1pbmUpCi0JCQljb250aW51ZTsKLQkJbSA9IHNjb21fbWFwKGRuLCAwLCAxKTsKLQotCQkvKiByZWFkLW1vZGlmeS13cml0ZSBpdCBzbyB0aGUgSFcgcHJvYmUgZG9lcyBub3QgZ2V0Ci0JCSAqIGNvbmZ1c2VkICovCi0JCXJjID0gc2NvbV9yZWFkKG0sIDAsICZ2YWwpOwotCQlpZiAocmMgPT0gMCkKLQkJCXNjb21fd3JpdGUobSwgMCwgdmFsIHwgMSk7Ci0JCXNjb21fdW5tYXAobSk7Ci0JfQotCW0gPSBzY29tX21hcChtaW5lLCAwLCAxKTsKLQlyYyA9IHNjb21fcmVhZChtLCAwLCAmdmFsKTsKLQlpZiAocmMgPT0gMCkKLQkJc2NvbV93cml0ZShtLCAwLCB2YWwgfCAxKTsKLQkvKiBzaG91bGQgbmV2ZXIgcmV0dXJuICovCi0Jc2NvbV91bm1hcChtKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjNhOGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jaWZuZGVmIF9fV1NQX0gKLSNkZWZpbmUgX19XU1BfSAotCi0jaW5jbHVkZSA8YXNtL3dzcC5oPgotCi0vKiBEZXZ0cmVlIGNvbXBhdGlibGUgc3RyaW5ncyBmb3IgbWFqb3IgZGV2aWNlcyAqLwotI2RlZmluZSBQQ0lFX0NPTVBBVElCTEUgICAgICJpYm0sd3NwLXBjaWV4IgotCi1leHRlcm4gdm9pZCB3c3Bfc2V0dXBfYXJjaCh2b2lkKTsKLWV4dGVybiB2b2lkIHdzcF9zZXR1cF9pcnEodm9pZCk7Ci1leHRlcm4gaW50IHdzcF9wcm9iZV9kZXZpY2VzKHZvaWQpOwotZXh0ZXJuIHZvaWQgd3NwX2hhbHQodm9pZCk7Ci0KLWV4dGVybiB2b2lkIHdzcF9zZXR1cF9wY2kodm9pZCk7Ci1leHRlcm4gdm9pZCBzY29tX2luaXRfd3NwKHZvaWQpOwotCi1leHRlcm4gdm9pZCBhMl9zZXR1cF9zbXAodm9pZCk7Ci1leHRlcm4gaW50IGEyX3Njb21fc3RhcnR1cF9jcHUodW5zaWduZWQgaW50IGxjcHUsIGludCB0aHJfaWR4LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotZXh0ZXJuIGludCBzbXBfYTJfa2lja19jcHUoaW50IG5yKTsKLQotZXh0ZXJuIHZvaWQgb3BiX3BpY19pbml0KHZvaWQpOwotCi0vKiBjaHJvbWEgc3BlY2lmaWMgbWFuYWdtZW50ICovCi1leHRlcm4gdm9pZCB3c3BfaDhfcmVzdGFydChjaGFyICpjbWQpOwotZXh0ZXJuIHZvaWQgd3NwX2g4X3Bvd2VyX29mZih2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCB3c3Bfc2V0dXBfaDgodm9pZCk7Ci0KLSNlbmRpZiAvKiAgX19XU1BfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE1ZTViLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcF9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDExMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEwIEJlbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNkZWZpbmUgREVCVUcKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9pby13b3JrYXJvdW5kcy5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgotCi0jaW5jbHVkZSAid3NwLmgiCi0jaW5jbHVkZSAid3NwX3BjaS5oIgotI2luY2x1ZGUgIm1zaS5oIgotCi0KLS8qIE1heCBudW1iZXIgb2YgVFZUcyBmb3Igb25lIHRhYmxlLiBPbmx5IDMyLWJpdCB0YWJsZXMgY2FuIHVzZQotICogbXVsdGlwbGUgVFZUcyBhbmQgc28gdGhlIG1heCBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIHRodXMgOAotICogc2luY2Ugb25seSAyRyBvZiBETUEgc3BhY2UgaXMgc3VwcG9ydGVkCi0gKi8KLSNkZWZpbmUgTUFYX1RBQkxFX1RWVF9DT1VOVAkJOAotCi1zdHJ1Y3Qgd3NwX2RtYV90YWJsZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwotCXN0cnVjdCBpb21tdV90YWJsZQl0YWJsZTsKLQlzdHJ1Y3Qgd3NwX3BoYgkqcGhiOwotCXN0cnVjdCBwYWdlCQkqdGNlc1tNQVhfVEFCTEVfVFZUX0NPVU5UXTsKLX07Ci0KLS8qIFdlIHN1cHBvcnQgRE1BIHJlZ2lvbnMgZnJvbSAwLi4uMkcgaW4gMzJiaXQgc3BhY2UgKG5vIHN1cHBvcnQgZm9yCi0gKiA2NC1iaXQgRE1BIGp1c3QgeWV0KS4gRWFjaCBkZXZpY2UgZ2V0cyBhIHNlcGFyYXRlIFRDRSB0YWJsZSAoVFZUCi0gKiBlbnRyeSkgd2l0aCB2YWxpZGF0aW9uIGVuYWJsZWQgKHRob3VnaCBub3Qgc3VwcG9ydGVkIGJ5IFNpbWlDUwotICoganVzdCB5ZXQpLgotICoKLSAqIFRvIHNpbXBsaWZ5IHRoaW5ncywgd2UgZGl2aWRlIHRoaXMgMkcgc3BhY2UgaW50byBOIHJlZ2lvbnMgYmFzZWQKLSAqIG9uIHRoZSBjb25zdGFudCBiZWxvdyB3aGljaCBjb3VsZCBiZSB0dXJuZWQgaW50byBhIHR1bmFibGUgZXZlbnR1YWxseQotICoKLSAqIFdlIHRoZW4gYXNzaWduIGR5bmFtaWNhbGx5IHRob3NlIHJlZ2lvbnMgdG8gZGV2aWNlcyBhcyB0aGV5IHNob3cgdXAuCi0gKgotICogV2UgdXNlIGEgYml0bWFwIGFzIGFuIGFsbG9jYXRvciBmb3IgdGhlc2UuCi0gKgotICogVGFibGVzIGFyZSBhbGxvY2F0ZWQvY3JlYXRlZCBkeW5hbWljYWxseSBhcyBkZXZpY2VzIGFyZSBkaXNjb3ZlcmVkLAotICogbXVsdGlwbGUgVFZUIGVudHJpZXMgYXJlIHVzZWQgaWYgbmVlZGVkCi0gKgotICogV2hlbiA2NC1iaXQgRE1BIHN1cHBvcnQgaXMgYWRkZWQgd2Ugc2hvdWxkIHNpbXBseSB1c2UgYSBzZXBhcmF0ZSBzZXQKLSAqIG9mIGxhcmdlciByZWdpb25zICh0aGUgSFcgc3VwcG9ydHMgNjQgVFZUIGVudHJpZXMpLiBXZSBjYW4KLSAqIGFkZGl0aW9uYWxseSBjcmVhdGUgYSBieXBhc3MgcmVnaW9uIGluIDY0LWJpdCBzcGFjZSBmb3IgcGVyZm9ybWFuY2VzCi0gKiB0aG91Z2ggdGhhdCB3b3VsZCBoYXZlIGEgY29zdCBpbiB0ZXJtIG9mIHNlY3VyaXR5LgotICoKLSAqIElmIHlvdSBzZXQgTlVNX0RNQTMyX1JFR0lPTlMgdG8gMSwgdGhlbiBhIHNpbmdsZSB0YWJsZSBpcyBzaGFyZWQKLSAqIGZvciBhbGwgZGV2aWNlcyBhbmQgYnVzL2Rldi9mbiB2YWxpZGF0aW9uIGlzIGRpc2FibGVkCi0gKgotICogTm90ZSB0aGF0IGEgRE1BMzIgcmVnaW9uIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMjU2TSBzbyB0aGUgbWF4Ci0gKiBzdXBwb3J0ZWQgaGVyZSBmb3Igbm93IGlzIDguIFdlIGRvbid0IHlldCBzdXBwb3J0IHNoYXJpbmcgcmVnaW9ucwotICogYmV0d2VlbiBtdWx0aXBsZSBkZXZpY2VzIHNvIHRoZSBtYXggbnVtYmVyIG9mIGRldmljZXMgc3VwcG9ydGVkCi0gKiBpcyBNQVhfVEFCTEVfVFZUX0NPVU5ULgotICovCi0jZGVmaW5lIE5VTV9ETUEzMl9SRUdJT05TCTEKLQotc3RydWN0IHdzcF9waGIgewotCXN0cnVjdCBwY2lfY29udHJvbGxlcgkqaG9zZTsKLQotCS8qIExvY2sgY29udHJvbGxpbmcgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIGRtYSB0YWJsZXMuCi0JICogSXQgZG9lcyAtbm90LSBwcm90ZWN0IGFnYWluc3QgZG1hXyogb3BlcmF0aW9ucyBvbgotCSAqIHRob3NlIHRhYmxlcywgdGhvc2Ugc2hvdWxkIGJlIHN0b3BwZWQgYmVmb3JlIGFuIGVudHJ5Ci0JICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqCi0JICogVGhlIGxvY2sgaXMgYWxzbyB1c2VkIGZvciBlcnJvciBoYW5kbGluZyBvcGVyYXRpb25zCi0JICovCi0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWRtYV90YWJsZXM7Ci0JdW5zaWduZWQgbG9uZwkJZG1hMzJfbWFwOwotCXVuc2lnbmVkIGxvbmcJCWRtYTMyX2Jhc2U7Ci0JdW5zaWduZWQgaW50CQlkbWEzMl9udW1fcmVnaW9uczsKLQl1bnNpZ25lZCBsb25nCQlkbWEzMl9yZWdpb25fc2l6ZTsKLQotCS8qIERlYnVnZnMgc3R1ZmYgKi8KLQlzdHJ1Y3QgZGVudHJ5CQkqZGRpcjsKLQotCXN0cnVjdCBsaXN0X2hlYWQJYWxsOwotfTsKLXN0YXRpYyBMSVNUX0hFQUQod3NwX3BoYnMpOwotCi0vLyNkZWZpbmUgY2ZnX2RlYnVnKGZtdC4uLikJcHJfZGVidWcoZm10KQotI2RlZmluZSBjZmdfZGVidWcoZm10Li4uKQotCi0KLXN0YXRpYyBpbnQgd3NwX3BjaWVfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJCSAgaW50IG9mZnNldCwgaW50IGxlbiwgdTMyICp2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCWludCBzdWJvZmY7Ci0JdTY0IGFkZHI7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0JaWYgKGhvc2UgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAob2Zmc2V0ID49IDB4MTAwMCkKLQkJcmV0dXJuICBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7Ci0JYWRkciA9IFBDSUVfUkVHX0NBX0VOQUJMRSB8Ci0JCSgodTY0KWJ1cy0+bnVtYmVyKSA8PCBQQ0lFX1JFR19DQV9CVVNfU0hJRlQgfAotCQkoKHU2NClkZXZmbikgPDwgUENJRV9SRUdfQ0FfRlVOQ19TSElGVCB8Ci0JCSgodTY0KW9mZnNldCAmIH4zKSA8PCBQQ0lFX1JFR19DQV9SRUdfU0hJRlQ7Ci0Jc3Vib2ZmID0gb2Zmc2V0ICYgMzsKLQotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCi0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCWFkZHIgfD0gKDB4OHVsID4+IHN1Ym9mZikgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOwotCQkqdmFsID0gKGluX2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSkKLQkJCT4+IChzdWJvZmYgPDwgMykpICYgMHhmZjsKLQkJY2ZnX2RlYnVnKCJyZWFkIDEgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDJ4XG4iLAotCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAotCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgKnZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYWRkciB8PSAoMHhjdWwgPj4gc3Vib2ZmKSA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKLQkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7Ci0JCSp2YWwgPSAoaW5fbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBKQotCQkJPj4gKHN1Ym9mZiA8PCAzKSkgJiAweGZmZmY7Ci0JCWNmZ19kZWJ1ZygicmVhZCAyICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTA0eFxuIiwKLQkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKLQkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsICp2YWwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhZGRyIHw9IDB4ZnVsIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKLQkJKnZhbCA9IGluX2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSk7Ci0JCWNmZ19kZWJ1ZygicmVhZCA0ICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTA4eFxuIiwKLQkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKLQkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsICp2YWwpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotc3RhdGljIGludCB3c3BfcGNpZV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJCSAgIGludCBvZmZzZXQsIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCWludCBzdWJvZmY7Ci0JdTY0IGFkZHI7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0JaWYgKGhvc2UgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAob2Zmc2V0ID49IDB4MTAwMCkKLQkJcmV0dXJuICBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7Ci0JYWRkciA9IFBDSUVfUkVHX0NBX0VOQUJMRSB8Ci0JCSgodTY0KWJ1cy0+bnVtYmVyKSA8PCBQQ0lFX1JFR19DQV9CVVNfU0hJRlQgfAotCQkoKHU2NClkZXZmbikgPDwgUENJRV9SRUdfQ0FfRlVOQ19TSElGVCB8Ci0JCSgodTY0KW9mZnNldCAmIH4zKSA8PCBQQ0lFX1JFR19DQV9SRUdfU0hJRlQ7Ci0Jc3Vib2ZmID0gb2Zmc2V0ICYgMzsKLQotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlhZGRyIHw9ICgweDh1bCA+PiBzdWJvZmYpIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOwotCQl2YWwgPDw9IHN1Ym9mZiA8PCAzOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKLQkJb3V0X2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSwgdmFsKTsKLQkJY2ZnX2RlYnVnKCJ3cml0ZSAxICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTAyeFxuIiwKLQkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKLQkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYWRkciB8PSAoMHhjdWwgPj4gc3Vib2ZmKSA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKLQkJdmFsIDw8PSBzdWJvZmYgPDwgMzsKLQkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7Ci0JCW91dF9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEsIHZhbCk7Ci0JCWNmZ19kZWJ1Zygid3JpdGUgMiAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwNHhcbiIsCi0JCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCi0JCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCB2YWwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhZGRyIHw9IDB4ZnVsIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKLQkJb3V0X2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSwgdmFsKTsKLQkJY2ZnX2RlYnVnKCJ3cml0ZSA0ICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTA4eFxuIiwKLQkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKLQkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgd3NwX3BjaWVfcGNpX29wcyA9Ci17Ci0JLnJlYWQgPSB3c3BfcGNpZV9yZWFkX2NvbmZpZywKLQkud3JpdGUgPSB3c3BfcGNpZV93cml0ZV9jb25maWcsCi19OwotCi0jZGVmaW5lIFRDRV9TSElGVAkJMTIKLSNkZWZpbmUgVENFX1BBR0VfU0laRQkJKDEgPDwgVENFX1NISUZUKQotI2RlZmluZSBUQ0VfUENJX1dSSVRFCQkweDIJCSAvKiB3cml0ZSBmcm9tIFBDSSBhbGxvd2VkICovCi0jZGVmaW5lIFRDRV9QQ0lfUkVBRAkJMHgxCSAJIC8qIHJlYWQgZnJvbSBQQ0kgYWxsb3dlZCAqLwotI2RlZmluZSBUQ0VfUlBOX01BU0sJCTB4M2ZmZmZmZmZmZmZ1bCAgLyogNDItYml0IFJQTiAoNEsgcGFnZXMpICovCi0jZGVmaW5lIFRDRV9SUE5fU0hJRlQJCTEyCi0KLS8vI2RlZmluZSBkbWFfZGVidWcoZm10Li4uKQlwcl9kZWJ1ZyhmbXQpCi0jZGVmaW5lIGRtYV9kZWJ1ZyhmbXQuLi4pCi0KLXN0YXRpYyBpbnQgdGNlX2J1aWxkX3dzcChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMsCi0JCQkgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCQkgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKLXsKLQlzdHJ1Y3Qgd3NwX2RtYV90YWJsZSAqcHRibCA9IGNvbnRhaW5lcl9vZih0YmwsCi0JCQkJCQkgICAgc3RydWN0IHdzcF9kbWFfdGFibGUsCi0JCQkJCQkgICAgdGFibGUpOwotCXU2NCBwcm90b190Y2U7Ci0JdTY0ICp0Y2VwOwotCXU2NCBycG47Ci0KLQlwcm90b190Y2UgPSBUQ0VfUENJX1JFQUQ7Ci0jaWZkZWYgQ09ORklHX1dTUF9ERDFfV09SS0FST1VORF9ERDFfVENFX0JVR1MKLQlwcm90b190Y2UgfD0gVENFX1BDSV9XUklURTsKLSNlbHNlCi0JaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQotCQlwcm90b190Y2UgfD0gVENFX1BDSV9XUklURTsKLSNlbmRpZgotCi0JLyogWFhYIE1ha2UgdGhpcyBmYXN0ZXIgYnkgZmFjdG9yaW5nIG91dCB0aGUgcGFnZSBhZGRyZXNzIGZvcgotCSAqIHdpdGhpbiBhIFRDRSB0YWJsZQotCSAqLwotCXdoaWxlIChucGFnZXMtLSkgewotCQkvKiBXZSBkb24ndCB1c2UgaXQtPmJhc2UgYXMgdGhlIHRhYmxlIGNhbiBiZSBzY2F0dGVyZWQgKi8KLQkJdGNlcCA9ICh1NjQgKilwYWdlX2FkZHJlc3MocHRibC0+dGNlc1tpbmRleCA+PiAxNl0pOwotCQl0Y2VwICs9IChpbmRleCAmIDB4ZmZmZik7Ci0KLQkJLyogY2FuJ3QgbW92ZSB0aGlzIG91dCBzaW5jZSB3ZSBtaWdodCBjcm9zcyBMTUIgYm91bmRhcnkgKi8KLQkJcnBuID0gX19wYSh1YWRkcikgPj4gVENFX1NISUZUOwotCQkqdGNlcCA9IHByb3RvX3RjZSB8IChycG4gJiBUQ0VfUlBOX01BU0spIDw8IFRDRV9SUE5fU0hJRlQ7Ci0KLQkJZG1hX2RlYnVnKCJbRE1BXSBUQ0UgJXAgc2V0IHRvIDB4JTAxNmxseCAoZG1hIGFkZHI6IDB4JWx4KVxuIiwKLQkJCSAgdGNlcCwgKnRjZXAsICh0YmwtPml0X29mZnNldCArIGluZGV4KSA8PCBJT01NVV9QQUdFX1NISUZUXzRLKTsKLQotCQl1YWRkciArPSBUQ0VfUEFHRV9TSVpFOwotCQlpbmRleCsrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGNlX2ZyZWVfd3NwKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKLXsKLQlzdHJ1Y3Qgd3NwX2RtYV90YWJsZSAqcHRibCA9IGNvbnRhaW5lcl9vZih0YmwsCi0JCQkJCQkgICAgc3RydWN0IHdzcF9kbWFfdGFibGUsCi0JCQkJCQkgICAgdGFibGUpOwotI2lmbmRlZiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0REMV9UQ0VfQlVHUwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHB0YmwtPnBoYi0+aG9zZTsKLSNlbmRpZgotCXU2NCAqdGNlcDsKLQotCS8qIFhYWCBNYWtlIHRoaXMgZmFzdGVyIGJ5IGZhY3RvcmluZyBvdXQgdGhlIHBhZ2UgYWRkcmVzcyBmb3IKLQkgKiB3aXRoaW4gYSBUQ0UgdGFibGUuIEFsc28gdXNlIGxpbmUta2lsbCBvcHRpb24gdG8ga2lsbCBtdWx0aXBsZQotCSAqIFRDRXMgYXQgb25jZQotCSAqLwotCXdoaWxlIChucGFnZXMtLSkgewotCQkvKiBXZSBkb24ndCB1c2UgaXQtPmJhc2UgYXMgdGhlIHRhYmxlIGNhbiBiZSBzY2F0dGVyZWQgKi8KLQkJdGNlcCA9ICh1NjQgKilwYWdlX2FkZHJlc3MocHRibC0+dGNlc1tpbmRleCA+PiAxNl0pOwotCQl0Y2VwICs9IChpbmRleCAmIDB4ZmZmZik7Ci0JCWRtYV9kZWJ1ZygiW0RNQV0gVENFICVwIGNsZWFyZWRcbiIsIHRjZXApOwotCQkqdGNlcCA9IDA7Ci0jaWZuZGVmIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfREQxX1RDRV9CVUdTCi0JCS8qIERvbid0IHdyaXRlIHRoZXJlIHNpbmNlIGl0IHdvdWxkIHBvbGx1dGUgb3RoZXIgTU1JTyBhY2Nlc3NlcyAqLwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1RDRV9LSUxMLAotCQkJIFBDSUVfUkVHX1RDRUtJTExfU0lOR0xFIHwgUENJRV9SRUdfVENFS0lMTF9QU180SyB8Ci0JCQkgKF9fcGEodGNlcCkgJiBQQ0lFX1JFR19UQ0VLSUxMX0FERFJfTUFTSykpOwotI2VuZGlmCi0JCWluZGV4Kys7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHdzcF9kbWFfdGFibGUgKndzcF9wY2lfY3JlYXRlX2RtYTMyX3RhYmxlKHN0cnVjdCB3c3BfcGhiICpwaGIsCi0JCQkJCQkJICAgIHVuc2lnbmVkIGludCByZWdpb24sCi0JCQkJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICp2YWxpZGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwaGItPmhvc2U7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gcGhiLT5kbWEzMl9yZWdpb25fc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBwaGItPmRtYTMyX3JlZ2lvbl9zaXplICogcmVnaW9uICsgcGhiLT5kbWEzMl9iYXNlOwotCXN0cnVjdCB3c3BfZG1hX3RhYmxlICp0Ymw7Ci0JaW50IHR2dHNfcGVyX3RhYmxlLCBpLCB0dnQsIG5pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbmlkID0gb2Zfbm9kZV90b19uaWQocGhiLT5ob3NlLT5kbik7Ci0KLQkvKiBDYWxjdWxhdGUgaG93IG1hbnkgVFZUcyBhcmUgbmVlZGVkICovCi0JdHZ0c19wZXJfdGFibGUgPSBzaXplIC8gMHgxMDAwMDAwMDsKLQlpZiAodHZ0c19wZXJfdGFibGUgPT0gMCkKLQkJdHZ0c19wZXJfdGFibGUgPSAxOwotCi0JLyogQ2FsY3VsYXRlIHRoZSBiYXNlIFRWVCBpbmRleC4gV2Uga25vdyBhbGwgdGFibGVzIGhhdmUgdGhlIHNhbWUKLQkgKiBzaXplIHNvIHdlIGp1c3QgZG8gYSBzaW1wbGUgbXVsdGlwbHkgaGVyZQotCSAqLwotCXR2dCA9IHJlZ2lvbiAqIHR2dHNfcGVyX3RhYmxlOwotCi0JcHJfZGVidWcoIiAgICAgICAgIFJlZ2lvbiA6ICVkXG4iLCByZWdpb24pOwotCXByX2RlYnVnKCIgICAgICBETUEgcmFuZ2UgOiAweCUwOGx4Li4weCUwOGx4XG4iLCBhZGRyLCBhZGRyICsgc2l6ZSAtIDEpOwotCXByX2RlYnVnKCIgTnVtYmVyIG9mIFRWVHMgOiAlZFxuIiwgdHZ0c19wZXJfdGFibGUpOwotCXByX2RlYnVnKCIgICAgICAgQmFzZSBUVlQgOiAlZFxuIiwgdHZ0KTsKLQlwcl9kZWJ1ZygiICAgICAgICAgTm9kZSAgIDogJWRcbiIsIG5pZCk7Ci0KLQl0YmwgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCB3c3BfZG1hX3RhYmxlKSwgR0ZQX0tFUk5FTCwgbmlkKTsKLQlpZiAoIXRibCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JdGJsLT5waGIgPSBwaGI7Ci0KLQkvKiBDcmVhdGUgYXMgbWFueSBUVlRzIGFzIG5lZWRlZCwgZWFjaCByZXByZXNlbnRzIDI1Nk0gYXQgbW9zdCAqLwotCWZvciAoaSA9IDA7IGkgPCB0dnRzX3Blcl90YWJsZTsgaSsrKSB7Ci0JCXU2NCB0dnRfZGF0YTEsIHR2dF9kYXRhMDsKLQotCQkvKiBBbGxvY2F0ZSB0YWJsZS4gV2UgdXNlIGEgNEsgVENFIHNpemUgZm9yIG5vdyBhbHdheXMgc28KLQkJICogb25lIHRhYmxlIGlzIGFsd2F5cyA4ICogKDI1OE0gLyA0SykgPT0gNTEySwotCQkgKi8KLQkJdGJsLT50Y2VzW2ldID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIEdGUF9LRVJORUwsIGdldF9vcmRlcigweDgwMDAwKSk7Ci0JCWlmICh0YmwtPnRjZXNbaV0gPT0gTlVMTCkKLQkJCWdvdG8gZmFpbDsKLQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyh0YmwtPnRjZXNbaV0pLCAwLCAweDgwMDAwKTsKLQotCQlwcl9kZWJ1ZygiIFRDRSB0YWJsZSAlZCBhdCA6ICVwXG4iLCBpLCBwYWdlX2FkZHJlc3ModGJsLT50Y2VzW2ldKSk7Ci0KLQkJLyogVGFibGUgc2l6ZS4gV2UgY3VycmVudGx5IHNldCBpdCB0byBiZSB0aGUgd2hvbGUgMjU2TSByZWdpb24gKi8KLQkJdHZ0X2RhdGEwID0gMnVsbCA8PCBJT0RBX1RWVDBfVENFX1RBQkxFX1NJWkVfU0hJRlQ7Ci0JCS8qIElPIHBhZ2Ugc2l6ZSBzZXQgdG8gNEsgKi8KLQkJdHZ0X2RhdGExID0gMXVsbCA8PCBJT0RBX1RWVDFfSU9fUEFHRV9TSVpFX1NISUZUOwotCQkvKiBTaGlmdCBpbiB0aGUgYWRkcmVzcyAqLwotCQl0dnRfZGF0YTAgfD0gX19wYShwYWdlX2FkZHJlc3ModGJsLT50Y2VzW2ldKSkgPDwgSU9EQV9UVlQwX1RUQV9TSElGVDsKLQotCQkvKiBWYWxpZGF0aW9uIHN0dWZmLiBXZSBvbmx5IHZhbGlkYXRlIGZ1bGx5IGJ1cy9kZXYvZm4gZm9yIG5vdwotCQkgKiBvbmUgZGF5IG1heWJlIHdlIGNhbiBncm91cCBkZXZpY2VzIGJ1dCB0aGF0IGlzbid0IHRoZSBjYXNlCi0JCSAqIGF0IHRoZSBtb21lbnQKLQkJICovCi0JCWlmICh2YWxpZGF0ZSkgewotCQkJdHZ0X2RhdGEwIHw9IElPREFfVFZUMF9CVVNOVU1fVkFMSURfTUFTSzsKLQkJCXR2dF9kYXRhMCB8PSB2YWxpZGF0ZS0+YnVzLT5udW1iZXI7Ci0JCQl0dnRfZGF0YTEgfD0gSU9EQV9UVlQxX0RFVk5VTV9WQUxJRDsKLQkJCXR2dF9kYXRhMSB8PSAoKHU2NClQQ0lfU0xPVCh2YWxpZGF0ZS0+ZGV2Zm4pKQotCQkJCTw8IElPREFfVFZUMV9ERVZOVU1fVkFMVUVfU0hJRlQ7Ci0JCQl0dnRfZGF0YTEgfD0gSU9EQV9UVlQxX0ZVTkNOVU1fVkFMSUQ7Ci0JCQl0dnRfZGF0YTEgfD0gKCh1NjQpUENJX0ZVTkModmFsaWRhdGUtPmRldmZuKSkKLQkJCQk8PCBJT0RBX1RWVDFfRlVOQ05VTV9WQUxVRV9TSElGVDsKLQkJfQotCi0JCS8qIFhYIFBFIG51bWJlciBpcyBhbHdheXMgMCBmb3Igbm93ICovCi0KLQkJLyogUHJvZ3JhbSB0aGUgdmFsdWVzIHVzaW5nIHRoZSBQSEIgbG9jayAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiLT5sb2NrLCBmbGFncyk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9BRERSLAotCQkJICh0dnQgKyBpKSB8IFBDSUVfUkVHX0lPREFfQURfVEJMX1RWVCk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9EQVRBMSwgdHZ0X2RhdGExKTsKLQkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0RBVEEwLCB0dnRfZGF0YTApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKiBJbml0IGJpdHMgYW5kIHBpZWNlcyAqLwotCXRibC0+dGFibGUuaXRfYmxvY2tzaXplID0gMTY7Ci0JdGJsLT50YWJsZS5pdF9wYWdlX3NoaWZ0ID0gSU9NTVVfUEFHRV9TSElGVF80SzsKLQl0YmwtPnRhYmxlLml0X29mZnNldCA9IGFkZHIgPj4gdGJsLT50YWJsZS5pdF9wYWdlX3NoaWZ0OwotCXRibC0+dGFibGUuaXRfc2l6ZSA9IHNpemUgPj4gdGJsLT50YWJsZS5pdF9wYWdlX3NoaWZ0OwotCi0JLyoKLQkgKiBJdCdzIGFscmVhZHkgYmxhbmsgYnV0IHdlIGNsZWFyIGl0IGFueXdheS4KLQkgKiBDb25zaWRlciBhbiBhZGl0aW9uYSBpbnRlcmZhY2UgdGhhdCBtYWtlcyBjbGVhaW5nIG9wdGlvbmFsCi0JICovCi0JaW9tbXVfaW5pdF90YWJsZSgmdGJsLT50YWJsZSwgbmlkKTsKLQotCWxpc3RfYWRkKCZ0YmwtPmxpbmssICZwaGItPmRtYV90YWJsZXMpOwotCXJldHVybiB0Ymw7Ci0KLSBmYWlsOgotCXByX2RlYnVnKCIgIEZhaWxlZCB0byBhbGxvY2F0ZSBhIDI1Nk0gVENFIHRhYmxlICFcbiIpOwotCWZvciAoaSA9IDA7IGkgPCB0dnRzX3Blcl90YWJsZTsgaSsrKQotCQlpZiAodGJsLT50Y2VzW2ldKQotCQkJX19mcmVlX3BhZ2VzKHRibC0+dGNlc1tpXSwgZ2V0X29yZGVyKDB4ODAwMDApKTsKLQlrZnJlZSh0YmwpOwotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotfQotCi1zdGF0aWMgdm9pZCB3c3BfcGNpX2RtYV9kZXZfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGRldl9hcmNoZGF0YSAqYXJjaGRhdGEgPSAmcGRldi0+ZGV2LmFyY2hkYXRhOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOwotCXN0cnVjdCB3c3BfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdzcF9kbWFfdGFibGUgKnRhYmxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JLyogRG9uJ3QgYXNzaWduIGFuIGlvbW11IHRhYmxlIHRvIGEgYnJpZGdlICovCi0JaWYgKHBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCi0JCXJldHVybjsKLQotCXByX2RlYnVnKCIlczogU2V0dGluZyB1cCBETUEuLi5cbiIsIHBjaV9uYW1lKHBkZXYpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsKLQotCS8qIElmIG9ubHkgb25lIHJlZ2lvbiwgY2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdCAqLwotCWlmIChwaGItPmRtYTMyX251bV9yZWdpb25zID09IDEpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChsaXN0X2VtcHR5KCZwaGItPmRtYV90YWJsZXMpKQotCQkJdGFibGUgPSB3c3BfcGNpX2NyZWF0ZV9kbWEzMl90YWJsZShwaGIsIDAsIE5VTEwpOwotCQllbHNlCi0JCQl0YWJsZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBoYi0+ZG1hX3RhYmxlcywKLQkJCQkJCSBzdHJ1Y3Qgd3NwX2RtYV90YWJsZSwKLQkJCQkJCSBsaW5rKTsKLQl9IGVsc2UgewotCQkvKiBlbHNlIGZpbmQgYSBmcmVlIHJlZ2lvbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcGhiLT5kbWEzMl9udW1fcmVnaW9ucyAmJiAhdGFibGU7IGkrKykgewotCQkJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChpLCAmcGhiLT5kbWEzMl9tYXApKQotCQkJCWNvbnRpbnVlOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7Ci0JCQl0YWJsZSA9IHdzcF9wY2lfY3JlYXRlX2RtYTMyX3RhYmxlKHBoYiwgaSwgcGRldik7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBpZiB3ZSBnb3QgYW4gZXJyb3IgKi8KLQlpZiAoSVNfRVJSKHRhYmxlKSkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERNQSB0YWJsZSwgZXJyICVsZCAhXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldiksIFBUUl9FUlIodGFibGUpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE9yIGEgdmFsaWQgdGFibGUgKi8KLQlpZiAodGFibGUpIHsKLQkJcHJfaW5mbygiJXM6IFNldHVwIGlvbW11OiAzMi1iaXQgRE1BIHJlZ2lvbiAweCUwOGx4Li4weCUwOGx4XG4iLAotCQkJcGNpX25hbWUocGRldiksCi0JCQl0YWJsZS0+dGFibGUuaXRfb2Zmc2V0IDw8IElPTU1VX1BBR0VfU0hJRlRfNEssCi0JCQkodGFibGUtPnRhYmxlLml0X29mZnNldCA8PCBJT01NVV9QQUdFX1NISUZUXzRLKQotCQkJKyBwaGItPmRtYTMyX3JlZ2lvbl9zaXplIC0gMSk7Ci0JCWFyY2hkYXRhLT5kbWFfZGF0YS5pb21tdV90YWJsZV9iYXNlID0gJnRhYmxlLT50YWJsZTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE9yIG5vIHJvb20gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsKLQlwcl9lcnIoIiVzOiBPdXQgb2YgRE1BIHNwYWNlICFcbiIsIHBjaV9uYW1lKHBkZXYpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHdzcF9wY2llX2NvbmZpZ3VyZV9odyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCi17Ci0JdTY0IHZhbDsKLQlpbnQgaTsKLQotI2RlZmluZSBEVU1QX1JFRyh4KSBcCi0JcHJfZGVidWcoIiUtMzBzIDogMHglMDE2bGx4XG4iLCAjeCwgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIHgpKQotCi0JLyoKLQkgKiBTb21lIFdTUCB2YXJpYW50cyAgaGFzIGEgYm9ndXMgY2xhc3MgY29kZSBieSBkZWZhdWx0IGluIHRoZSBQQ0ktRQotCSAqIHJvb3QgY29tcGxleCdzIGJ1aWx0LWluIFAyUCBicmlkZ2UKLQkgKi8KLQl2YWwgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfU1lTX0NGRzEpOwotCXByX2RlYnVnKCJQQ0ktRSBTWVNfQ0ZHMSA6IDB4JWxseFxuIiwgdmFsKTsKLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1NZU19DRkcxLAotCQkgKHZhbCAmIH5QQ0lFX1JFR19TWVNfQ0ZHMV9DTEFTU19DT0RFKSB8IChQQ0lfQ0xBU1NfQlJJREdFX1BDSSA8PCA4KSk7Ci0JcHJfZGVidWcoIlBDSS1FIFNZU19DRkcxIDogMHglbGx4XG4iLCBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfU1lTX0NGRzEpKTsKLQotI2lmZGVmIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfREQxX1RDRV9CVUdTCi0JLyogWFhYIERpc2FibGUgVENFIGNhY2hpbmcsIGl0IGRvZXNuJ3Qgd29yayBvbiBERDEgKi8KLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTUwLAotCQkgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTUwKSB8ICgzdWxsIDw8IDYyKSk7Ci0JcHJpbnRrKCJQQ0ktRSBERUJVRyBDT05UUk9MIDUgPSAweCVsbHhcbiIsIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGU1MCkpOwotI2VuZGlmCi0KLQkvKiBDb25maWd1cmUgTTMyQSBhbmQgSU8uIElPIGlzIGhhcmQgd2lyZWQgdG8gYmUgMU0gZm9yIG5vdyAqLwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fQkFTRV9BRERSLCBob3NlLT5pb19iYXNlX3BoeXMpOwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fQkFTRV9NQVNLLAotCQkgKH4oaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQpKSAmCi0JCSAweDNmZmZmZmZmMDAwdWwpOwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fU1RBUlRfQUREUiwgMCB8IDEpOwotCi0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX0JBU0VfQUREUiwKLQkJIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpOwotCXByaW50aygiV2FudCB0byB3cml0ZSB0byBNMzJBX0JBU0VfTUFTSyA6IDB4JWxseFxuIiwKLQkJICh+KGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uZW5kIC0KLQkJICAgIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpKSAmIDB4M2ZmZmZmZjAwMDB1bCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX0JBU0VfTUFTSywKLQkJICh+KGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uZW5kIC0KLQkJICAgIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpKSAmIDB4M2ZmZmZmZjAwMDB1bCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX1NUQVJUX0FERFIsCi0JCSAoaG9zZS0+bWVtX3Jlc291cmNlc1swXS5zdGFydCAtIGhvc2UtPm1lbV9vZmZzZXRbMF0pIHwgMSk7Ci0KLQkvKiBDbGVhciBhbGwgVFZUIGVudHJpZXMKLQkgKgotCSAqIFhYIE1pZ2h0IGdldCBUVlQgY291bnQgZnJvbSBkZXZpY2UtdHJlZQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBJT0RBX1RWVF9DT1VOVDsgaSsrKSB7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9BRERSLAotCQkJIFBDSUVfUkVHX0lPREFfQURfVEJMX1RWVCB8IGkpOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfREFUQTEsIDApOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfREFUQTAsIDApOwotCX0KLQotCS8qIEtpbGwgdGhlIFRDRSBjYWNoZSAqLwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0NPTkZJRywKLQkJIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfQ09ORklHKSB8Ci0JCSBQQ0lFX1JFR19QSEJDXzY0Ql9UQ0VfRU4pOwotCi0JLyogRW5hYmxlIDMyICYgNjQtYml0IE1TSXMsIElPIHNwYWNlIGFuZCBNMzJBICovCi0JdmFsID0gUENJRV9SRUdfUEhCQ18zMkJJVF9NU0lfRU4gfAotCSAgICAgIFBDSUVfUkVHX1BIQkNfSU9fRU4gfAotCSAgICAgIFBDSUVfUkVHX1BIQkNfNjRCSVRfTVNJX0VOIHwKLQkgICAgICBQQ0lFX1JFR19QSEJDX00zMkFfRU47Ci0JaWYgKGlvbW11X2lzX29mZikKLQkJdmFsIHw9IFBDSUVfUkVHX1BIQkNfRE1BX1hMQVRFX0JZUEFTUzsKLQlwcl9kZWJ1ZygiV2lsbCB3cml0ZSBjb25maWc6IDB4JWxseFxuIiwgdmFsKTsKLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9DT05GSUcsIHZhbCk7Ci0KLQkvKiBFbmFibGUgZXJyb3IgcmVwb3J0aW5nICovCi0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGUwMCwKLQkJIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGUwMCkgfCAweDAwMDgwMDAwMDAwMDAwMDB1bGwpOwotCi0JLyogTWFzayBhbiBlcnJvciB0aGF0J3MgZ2VuZXJhdGVkIHdoZW4gZG9pbmcgY29uZmlnIHNwYWNlIHByb2JlCi0JICoKLQkgKiBYWFggTWF5YmUgd2Ugc2hvdWxkIG9ubHkgbWFzayBpdCBhcm91bmQgY29uZmlnIHNwYWNlIGN5Y2xlcy4uLiB0aGF0IG9yCi0JICogaWdub3JlIGl0IHdoZW4gd2Uga25vdyB3ZSBoYWQgYSBjb25maWcgc3BhY2UgY3ljbGUgcmVjZW50bHkgPwotCSAqLwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9TVEFUVVNfTUFTSywgMHg4MDAwMDAwMDAwMDAwMDAwdWxsKTsKLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlIxX1NUQVRVU19NQVNLLCAweDgwMDAwMDAwMDAwMDAwMDB1bGwpOwotCi0JLyogRW5hYmxlIFVUTCBlcnJvcnMsIGZvciBub3csIGFsbCBvZiB0aGVtIGdvdCB0byBVVEwgaXJxIDEKLQkgKgotCSAqIFdlIHNpbWlsYXJpbHkgbWFzayBvbmUgVVRMIGVycm9yIGNhdXNlZCBhcHBhcmVudGx5IGR1cmluZyBub3JtYWwKLQkgKiBwcm9iaW5nLiBXZSBhbHNvIG1hc2sgdGhlIGxpbmsgdXAgZXJyb3IKLQkgKi8KLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfRVJSX1NFViwgMCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9SQ19FUlJfU0VWRVJJVFksIDApOwotCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfUENJRV9QT1JUX0VSUk9SX1NFViwgMCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX0lSUV9FTiwgMHhmZmZmZmZmZjAwMDAwMDAwdWxsKTsKLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1BDSUVfUE9SVF9JUlFfRU4sIDB4ZmY1ZmZmZmYwMDAwMDAwMHVsbCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9FUF9FUlJfSVJRX0VOLCAweGZmZmZmZmZmMDAwMDAwMDB1bGwpOwotCi0JRFVNUF9SRUcoUENJRV9SRUdfSU9fQkFTRV9BRERSKTsKLQlEVU1QX1JFRyhQQ0lFX1JFR19JT19CQVNFX01BU0spOwotCURVTVBfUkVHKFBDSUVfUkVHX0lPX1NUQVJUX0FERFIpOwotCURVTVBfUkVHKFBDSUVfUkVHX00zMkFfQkFTRV9BRERSKTsKLQlEVU1QX1JFRyhQQ0lFX1JFR19NMzJBX0JBU0VfTUFTSyk7Ci0JRFVNUF9SRUcoUENJRV9SRUdfTTMyQV9TVEFSVF9BRERSKTsKLQlEVU1QX1JFRyhQQ0lFX1JFR19NMzJCX0JBU0VfQUREUik7Ci0JRFVNUF9SRUcoUENJRV9SRUdfTTMyQl9CQVNFX01BU0spOwotCURVTVBfUkVHKFBDSUVfUkVHX00zMkJfU1RBUlRfQUREUik7Ci0JRFVNUF9SRUcoUENJRV9SRUdfTTY0X0JBU0VfQUREUik7Ci0JRFVNUF9SRUcoUENJRV9SRUdfTTY0X0JBU0VfTUFTSyk7Ci0JRFVNUF9SRUcoUENJRV9SRUdfTTY0X1NUQVJUX0FERFIpOwotCURVTVBfUkVHKFBDSUVfUkVHX1BIQl9DT05GSUcpOwotfQotCi1zdGF0aWMgdm9pZCB3c3BfcGNpX3dhaXRfaW9faWRsZShzdHJ1Y3Qgd3NwX3BoYiAqcGhiLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JdTY0IHZhbDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCXZhbCA9IGluX2JlNjQocGhiLT5ob3NlLT5jZmdfZGF0YSArIDB4ZTA4KTsKLQkJaWYgKCh2YWwgJiAweDE5MDAwMDAwMDAwMDAwMDB1bGwpID09IDB4MDEwMDAwMDAwMDAwMDAwMHVsbCkKLQkJCXJldHVybjsKLQkJdWRlbGF5KDEpOwotCX0KLQlwcl93YXJuaW5nKCJQQ0kgSU8gdGltZW91dCBvbiBkb21haW4gJWQgcG9ydCAweCVseFxuIiwKLQkJICAgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyLCBwb3J0KTsKLX0KLQotI2RlZmluZSBERUZfUENJX0FDX1JFVF9waW8obmFtZSwgcmV0LCBhdCwgYWwsIGFhKQkJXAotc3RhdGljIHJldCB3c3BfcGNpXyMjbmFtZSBhdAkJCQkJXAotewkJCQkJCQkJXAotCXN0cnVjdCBpb3dhX2J1cyAqYnVzOwkJCQkJXAotCXN0cnVjdCB3c3BfcGhiICpwaGI7CQkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKLQlyZXQgcnZhbDsJCQkJCQlcCi0JYnVzID0gaW93YV9waW9fZmluZF9idXMoYWEpOwkJCQlcCi0JV0FSTl9PTighYnVzKTsJCQkJCQlcCi0JcGhiID0gYnVzLT5wcml2YXRlOwkJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsJCQlcCi0Jd3NwX3BjaV93YWl0X2lvX2lkbGUocGhiLCBhYSk7CQkJCVwKLQlydmFsID0gX19kb18jI25hbWUgYWw7CQkJCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7CQlcCi0JcmV0dXJuIHJ2YWw7CQkJCQkJXAotfQotCi0jZGVmaW5lIERFRl9QQ0lfQUNfTk9SRVRfcGlvKG5hbWUsIGF0LCBhbCwgYWEpCQkJXAotc3RhdGljIHZvaWQgd3NwX3BjaV8jI25hbWUgYXQJCQkJCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3QgaW93YV9idXMgKmJ1czsJCQkJCVwKLQlzdHJ1Y3Qgd3NwX3BoYiAqcGhiOwkJCQkJXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQlcCi0JYnVzID0gaW93YV9waW9fZmluZF9idXMoYWEpOwkJCQlcCi0JV0FSTl9PTighYnVzKTsJCQkJCQlcCi0JcGhiID0gYnVzLT5wcml2YXRlOwkJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsJCQlcCi0Jd3NwX3BjaV93YWl0X2lvX2lkbGUocGhiLCBhYSk7CQkJCVwKLQlfX2RvXyMjbmFtZSBhbDsJCQkJCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7CQlcCi19Ci0KLSNkZWZpbmUgREVGX1BDSV9BQ19SRVRfbWVtKG5hbWUsIHJldCwgYXQsIGFsLCBhYSkKLSNkZWZpbmUgREVGX1BDSV9BQ19OT1JFVF9tZW0obmFtZSwgYXQsIGFsLCBhYSkKLQotI2RlZmluZSBERUZfUENJX0FDX1JFVChuYW1lLCByZXQsIGF0LCBhbCwgc3BhY2UsIGFhKQkJXAotCURFRl9QQ0lfQUNfUkVUXyMjc3BhY2UobmFtZSwgcmV0LCBhdCwgYWwsIGFhKQotCi0jZGVmaW5lIERFRl9QQ0lfQUNfTk9SRVQobmFtZSwgYXQsIGFsLCBzcGFjZSwgYWEpCQlcCi0JREVGX1BDSV9BQ19OT1JFVF8jI3NwYWNlKG5hbWUsIGF0LCBhbCwgYWEpCQlcCi0KLQotI2luY2x1ZGUgPGFzbS9pby1kZWZzLmg+Ci0KLSN1bmRlZiBERUZfUENJX0FDX1JFVAotI3VuZGVmIERFRl9QQ0lfQUNfTk9SRVQKLQotc3RhdGljIHN0cnVjdCBwcGNfcGNpX2lvIHdzcF9wY2lfaW9wcyA9IHsKLQkuaW5iID0gd3NwX3BjaV9pbmIsCi0JLmludyA9IHdzcF9wY2lfaW53LAotCS5pbmwgPSB3c3BfcGNpX2lubCwKLQkub3V0YiA9IHdzcF9wY2lfb3V0YiwKLQkub3V0dyA9IHdzcF9wY2lfb3V0dywKLQkub3V0bCA9IHdzcF9wY2lfb3V0bCwKLQkuaW5zYiA9IHdzcF9wY2lfaW5zYiwKLQkuaW5zdyA9IHdzcF9wY2lfaW5zdywKLQkuaW5zbCA9IHdzcF9wY2lfaW5zbCwKLQkub3V0c2IgPSB3c3BfcGNpX291dHNiLAotCS5vdXRzdyA9IHdzcF9wY2lfb3V0c3csCi0JLm91dHNsID0gd3NwX3BjaV9vdXRzbCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdzcF9zZXR1cF9vbmVfcGhiKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCXN0cnVjdCB3c3BfcGhiICpwaGI7Ci0KLQlwcl9pbmZvKCJQQ0k6IFNldHRpbmcgdXAgUENJZSBob3N0IGJyaWRnZSAweCVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKLQotCXBoYiA9IHphbGxvY19tYXliZV9ib290bWVtKHNpemVvZihzdHJ1Y3Qgd3NwX3BoYiksIEdGUF9LRVJORUwpOwotCWlmICghcGhiKQotCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5wKTsKLQlpZiAoIWhvc2UpIHsKLQkJLyogQ2FuJ3QgcmVhbGx5IGZyZWUgdGhlIHBoYiAqLwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaG9zZS0+cHJpdmF0ZV9kYXRhID0gcGhiOwotCXBoYi0+aG9zZSA9IGhvc2U7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcGhiLT5kbWFfdGFibGVzKTsKLQlzcGluX2xvY2tfaW5pdCgmcGhiLT5sb2NrKTsKLQotCS8qIFhYWCBVc2UgYnVzLXJhbmdlIHByb3BlcnR5ID8gKi8KLQlob3NlLT5maXJzdF9idXNubyA9IDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0KLQkvKiBXZSB1c2UgY2ZnX2RhdGEgYXMgdGhlIGFkZHJlc3MgZm9yIHRoZSB3aG9sZSBicmlkZ2UgTU1JTyBzcGFjZQotCSAqLwotCWhvc2UtPmNmZ19kYXRhID0gb2ZfaW9tYXAoaG9zZS0+ZG4sIDApOwotCi0JcHJfZGVidWcoIlBDSWUgcmVnaXN0ZXJzIG1hcHBlZCBhdCAweCVwXG4iLCBob3NlLT5jZmdfZGF0YSk7Ci0KLQkvKiBHZXQgdGhlIHJhbmdlcyBvZiB0aGUgZGV2aWNlLXRyZWUgKi8KLQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIG5wLCAwKTsKLQotCS8qIFhYWCBGb3JjZSByZS1hc3NpZ25pbmcgb2YgZXZlcnl0aGluZyBmb3Igbm93ICovCi0JcGNpX2FkZF9mbGFncyhQQ0lfUkVBU1NJR05fQUxMX0JVUyB8IFBDSV9SRUFTU0lHTl9BTExfUlNSQyB8Ci0JCSAgICAgIFBDSV9FTkFCTEVfUFJPQ19ET01BSU5TKTsKLQotCS8qIENhbGN1bGF0ZSBob3cgdGhlIFRDRSBzcGFjZSBpcyBkaXZpZGVkICovCi0JcGhiLT5kbWEzMl9iYXNlCQk9IDA7Ci0JcGhiLT5kbWEzMl9udW1fcmVnaW9ucwk9IE5VTV9ETUEzMl9SRUdJT05TOwotCWlmIChwaGItPmRtYTMyX251bV9yZWdpb25zID4gTUFYX1RBQkxFX1RWVF9DT1VOVCkgewotCQlwcl93YXJuaW5nKCJJT01NVTogQ2xhbXBlZCB0byAlZCBETUEzMiByZWdpb25zXG4iLAotCQkJICAgTUFYX1RBQkxFX1RWVF9DT1VOVCk7Ci0JCXBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnMgPSBNQVhfVEFCTEVfVFZUX0NPVU5UOwotCX0KLQlwaGItPmRtYTMyX3JlZ2lvbl9zaXplCT0gMHg4MDAwMDAwMCAvIHBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnM7Ci0KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIocGhiLT5kbWEzMl9yZWdpb25fc2l6ZSkpOwotCi0JLyogU2V0dXAgY29uZmlnIG9wcyAqLwotCWhvc2UtPm9wcyA9ICZ3c3BfcGNpZV9wY2lfb3BzOwotCi0JLyogQ29uZmlndXJlIHRoZSBIVyAqLwotCXdzcF9wY2llX2NvbmZpZ3VyZV9odyhob3NlKTsKLQotCS8qIEluc3RhbmNpYXRlIElPIHdvcmthcm91bmRzICovCi0JaW93YV9yZWdpc3Rlcl9idXMoaG9zZSwgJndzcF9wY2lfaW9wcywgTlVMTCwgcGhiKTsKLSNpZmRlZiBDT05GSUdfUENJX01TSQotCXdzcF9zZXR1cF9waGJfbXNpKGhvc2UpOwotI2VuZGlmCi0KLQkvKiBBZGQgdG8gZ2xvYmFsIGxpc3QgKi8KLQlsaXN0X2FkZCgmcGhiLT5hbGwsICZ3c3BfcGhicyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2luaXQgd3NwX3NldHVwX3BjaSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JaW50IHJjOwotCi0JLyogRmluZCBob3N0IGJyaWRnZXMgKi8KLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2lleCIsIFBDSUVfQ09NUEFUSUJMRSkgewotCQlyYyA9IHdzcF9zZXR1cF9vbmVfcGhiKG5wKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0dXAgUENJZSBicmlkZ2UgJXMsIHJjPSVkXG4iLAotCQkJICAgICAgIG5wLT5mdWxsX25hbWUsIHJjKTsKLQl9Ci0KLQkvKiBFc3RhYmxpc2ggZGV2aWNlLXRyZWUgbGlua2FnZSAqLwotCXBjaV9kZXZzX3BoYl9pbml0KCk7Ci0KLQkvKiBTZXQgRE1BIG9wcyB0byB1c2UgVENFcyAqLwotCWlmIChpb21tdV9pc19vZmYpIHsKLQkJcHJfaW5mbygiUENJLUU6IERpc2FibGVkIFRDRXMsIHVzaW5nIGRpcmVjdCBETUFcbiIpOwotCQlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKLQl9IGVsc2UgewotCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSB3c3BfcGNpX2RtYV9kZXZfc2V0dXA7Ci0JCXBwY19tZC50Y2VfYnVpbGQgPSB0Y2VfYnVpbGRfd3NwOwotCQlwcGNfbWQudGNlX2ZyZWUgPSB0Y2VfZnJlZV93c3A7Ci0JCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7Ci0JfQotfQotCi0jZGVmaW5lIGVycl9kZWJ1ZyhmbXQuLi4pCXByX2RlYnVnKGZtdCkKLS8vI2RlZmluZSBlcnJfZGVidWcoZm10Li4uKQotCi1zdGF0aWMgaW50IF9faW5pdCB3c3BfcGNpX2dldF9lcnJfaXJxX25vX2R0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JY29uc3QgdTMyICpwcm9wOwotCWludCBod19pcnE7Ci0KLQkvKiBPaywgbm8gaW50ZXJydXB0cyBwcm9wZXJ0eSwgbGV0J3MgdHJ5IHRvIGZpbmQgb3VyIGNoaWxkIFAyUCAqLwotCW5wID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIE5VTEwpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCS8qIEdyYWIgaXQncyBpbnRlcnJ1cHQgbWFwICovCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImludGVycnVwdC1tYXAiLCBOVUxMKTsKLQlpZiAocHJvcCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCS8qIEdyYWIgb25lIG9mIHRoZSBpbnRlcnJ1cHRzIGluIHRoZXJlLCBrZWVwIHRoZSBsb3cgNCBiaXRzICovCi0JaHdfaXJxID0gcHJvcFs1XSAmIDB4ZjsKLQotCS8qIDAuLjQgZm9yIFBIQiAwIGFuZCA1Li45IGZvciBQSEIgMSAqLwotCWlmIChod19pcnEgPCA1KQotCQlod19pcnEgPSA0OwotCWVsc2UKLQkJaHdfaXJxID0gOTsKLQlod19pcnEgfD0gcHJvcFs1XSAmIH4weGY7Ci0KLQllcnJfZGVidWcoIlBDSTogVXNpbmcgMHgleCBhcyBlcnJvciBJUlEgZm9yICVzXG4iLAotCQkgIGh3X2lycSwgbnAtPnBhcmVudC0+ZnVsbF9uYW1lKTsKLQlyZXR1cm4gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3X2lycSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXUzMiBvZmZzZXQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX0gd3NwX3BjaV9yZWdzW10gPSB7Ci0jZGVmaW5lIERSRUcoeCkgeyBQQ0lFX1JFR18jI3gsICN4IH0KLSNkZWZpbmUgRFVUTCh4KSB7IFBDSUVfVVRMXyMjeCwgIlVUTF8iICN4IH0KLQkvKiBBcmNoaXRlY3RlZCByZWdpc3RlcnMgZXhjZXB0IENPTkZJR18gYW5kIElPREEKLSAgICAgICAgICogdG8gYXZvaWQgc2lkZSBlZmZlY3RzCi0JICovCi0JRFJFRyhETUFfQ0hBTl9TVEFUVVMpLAotCURSRUcoQ1BVX0xPQURTVE9SRV9TVEFUVVMpLAotCURSRUcoTE9DSzApLAotCURSRUcoTE9DSzEpLAotCURSRUcoUEhCX0NPTkZJRyksCi0JRFJFRyhJT19CQVNFX0FERFIpLAotCURSRUcoSU9fQkFTRV9NQVNLKSwKLQlEUkVHKElPX1NUQVJUX0FERFIpLAotCURSRUcoTTMyQV9CQVNFX0FERFIpLAotCURSRUcoTTMyQV9CQVNFX01BU0spLAotCURSRUcoTTMyQV9TVEFSVF9BRERSKSwKLQlEUkVHKE0zMkJfQkFTRV9BRERSKSwKLQlEUkVHKE0zMkJfQkFTRV9NQVNLKSwKLQlEUkVHKE0zMkJfU1RBUlRfQUREUiksCi0JRFJFRyhNNjRfQkFTRV9BRERSKSwKLQlEUkVHKE02NF9CQVNFX01BU0spLAotCURSRUcoTTY0X1NUQVJUX0FERFIpLAotCURSRUcoVENFX0tJTEwpLAotCURSRUcoTE9DSzIpLAotCURSRUcoUEhCX0dFTl9DQVApLAotCURSRUcoUEhCX1RDRV9DQVApLAotCURSRUcoUEhCX0lSUV9DQVApLAotCURSRUcoUEhCX0VFSF9DQVApLAotCURSRUcoUEFQUl9FUlJfSU5KX0NPTlRST0wpLAotCURSRUcoUEFQUl9FUlJfSU5KX0FERFIpLAotCURSRUcoUEFQUl9FUlJfSU5KX01BU0spLAotCi0JLyogVVRMIGNvcmUgcmVncyAqLwotCURVVEwoU1lTX0JVU19DT05UUk9MKSwKLQlEVVRMKFNUQVRVUyksCi0JRFVUTChTWVNfQlVTX0FHRU5UX1NUQVRVUyksCi0JRFVUTChTWVNfQlVTX0FHRU5UX0VSUl9TRVYpLAotCURVVEwoU1lTX0JVU19BR0VOVF9JUlFfRU4pLAotCURVVEwoU1lTX0JVU19CVVJTVF9TWl9DT05GKSwKLQlEVVRMKFJFVklTSU9OX0lEKSwKLQlEVVRMKE9VVF9QT1NUX0hEUl9CVUZfQUxMT0MpLAotCURVVEwoT1VUX1BPU1RfREFUX0JVRl9BTExPQyksCi0JRFVUTChJTl9QT1NUX0hEUl9CVUZfQUxMT0MpLAotCURVVEwoSU5fUE9TVF9EQVRfQlVGX0FMTE9DKSwKLQlEVVRMKE9VVF9OUF9CVUZfQUxMT0MpLAotCURVVEwoSU5fTlBfQlVGX0FMTE9DKSwKLQlEVVRMKFBDSUVfVEFHU19BTExPQyksCi0JRFVUTChHQklGX1JFQURfVEFHU19BTExPQyksCi0KLQlEVVRMKFBDSUVfUE9SVF9DT05UUk9MKSwKLQlEVVRMKFBDSUVfUE9SVF9TVEFUVVMpLAotCURVVEwoUENJRV9QT1JUX0VSUk9SX1NFViksCi0JRFVUTChQQ0lFX1BPUlRfSVJRX0VOKSwKLQlEVVRMKFJDX1NUQVRVUyksCi0JRFVUTChSQ19FUlJfU0VWRVJJVFkpLAotCURVVEwoUkNfSVJRX0VOKSwKLQlEVVRMKEVQX1NUQVRVUyksCi0JRFVUTChFUF9FUlJfU0VWRVJJVFkpLAotCURVVEwoRVBfRVJSX0lSUV9FTiksCi0JRFVUTChQQ0lfUE1fQ1RSTDEpLAotCURVVEwoUENJX1BNX0NUUkwyKSwKLQotCS8qIFBDSWUgc3RhY2sgcmVncyAqLwotCURSRUcoU1lTVEVNX0NPTkZJRzEpLAotCURSRUcoU1lTVEVNX0NPTkZJRzIpLAotCURSRUcoRVBfU1lTVEVNX0NPTkZJRyksCi0JRFJFRyhFUF9GTFIpLAotCURSRUcoRVBfQkFSX0NPTkZJRyksCi0JRFJFRyhMSU5LX0NPTkZJRyksCi0JRFJFRyhQTV9DT05GSUcpLAotCURSRUcoRExQX0NPTlRST0wpLAotCURSRUcoRExQX1NUQVRVUyksCi0JRFJFRyhFUlJfUkVQT1JUX0NPTlRST0wpLAotCURSRUcoU0xPVF9DT05UUk9MMSksCi0JRFJFRyhTTE9UX0NPTlRST0wyKSwKLQlEUkVHKFVUTF9DT05GSUcpLAotCURSRUcoQlVGRkVSU19DT05GSUcpLAotCURSRUcoRVJST1JfSU5KRUNUKSwKLQlEUkVHKFNSSU9WX0NPTkZJRyksCi0JRFJFRyhQRjBfU1JJT1ZfU1RBVFVTKSwKLQlEUkVHKFBGMV9TUklPVl9TVEFUVVMpLAotCURSRUcoUE9SVF9OVU1CRVIpLAotCURSRUcoUE9SX1NZU1RFTV9DT05GSUcpLAotCi0JLyogSW50ZXJuYWwgbG9naWMgcmVncyAqLwotCURSRUcoUEhCX1ZFUlNJT04pLAotCURSRUcoUkVTRVQpLAotCURSRUcoUEhCX0NPTlRST0wpLAotCURSRUcoUEhCX1RJTUVPVVRfQ09OVFJPTDEpLAotCURSRUcoUEhCX1FVSUVTQ0VfRE1BKSwKLQlEUkVHKFBIQl9ETUFfUkVBRF9UQUdfQUNUViksCi0JRFJFRyhQSEJfVENFX1JFQURfVEFHX0FDVFYpLAotCi0JLyogRklSIHJlZ2lzdGVycyAqLwotCURSRUcoTEVNX0ZJUl9BQ0NVTSksCi0JRFJFRyhMRU1fRklSX0FORF9NQVNLKSwKLQlEUkVHKExFTV9GSVJfT1JfTUFTSyksCi0JRFJFRyhMRU1fQUNUSU9OMCksCi0JRFJFRyhMRU1fQUNUSU9OMSksCi0JRFJFRyhMRU1fRVJST1JfTUFTSyksCi0JRFJFRyhMRU1fRVJST1JfQU5EX01BU0spLAotCURSRUcoTEVNX0VSUk9SX09SX01BU0spLAotCi0JLyogRXJyb3IgdHJhcHMgcmVnaXN0ZXJzICovCi0JRFJFRyhQSEJfRVJSX1NUQVRVUyksCi0JRFJFRyhQSEJfRVJSX1NUQVRVUyksCi0JRFJFRyhQSEJfRVJSMV9TVEFUVVMpLAotCURSRUcoUEhCX0VSUl9JTkpFQ1QpLAotCURSRUcoUEhCX0VSUl9MRU1fRU5BQkxFKSwKLQlEUkVHKFBIQl9FUlJfSVJRX0VOQUJMRSksCi0JRFJFRyhQSEJfRVJSX0ZSRUVaRV9FTkFCTEUpLAotCURSRUcoUEhCX0VSUl9TSURFX0VOQUJMRSksCi0JRFJFRyhQSEJfRVJSX0xPR18wKSwKLQlEUkVHKFBIQl9FUlJfTE9HXzEpLAotCURSRUcoUEhCX0VSUl9TVEFUVVNfTUFTSyksCi0JRFJFRyhQSEJfRVJSMV9TVEFUVVNfTUFTSyksCi0JRFJFRyhNTUlPX0VSUl9TVEFUVVMpLAotCURSRUcoTU1JT19FUlIxX1NUQVRVUyksCi0JRFJFRyhNTUlPX0VSUl9JTkpFQ1QpLAotCURSRUcoTU1JT19FUlJfTEVNX0VOQUJMRSksCi0JRFJFRyhNTUlPX0VSUl9JUlFfRU5BQkxFKSwKLQlEUkVHKE1NSU9fRVJSX0ZSRUVaRV9FTkFCTEUpLAotCURSRUcoTU1JT19FUlJfU0lERV9FTkFCTEUpLAotCURSRUcoTU1JT19FUlJfTE9HXzApLAotCURSRUcoTU1JT19FUlJfTE9HXzEpLAotCURSRUcoTU1JT19FUlJfU1RBVFVTX01BU0spLAotCURSRUcoTU1JT19FUlIxX1NUQVRVU19NQVNLKSwKLQlEUkVHKERNQV9FUlJfU1RBVFVTKSwKLQlEUkVHKERNQV9FUlIxX1NUQVRVUyksCi0JRFJFRyhETUFfRVJSX0lOSkVDVCksCi0JRFJFRyhETUFfRVJSX0xFTV9FTkFCTEUpLAotCURSRUcoRE1BX0VSUl9JUlFfRU5BQkxFKSwKLQlEUkVHKERNQV9FUlJfRlJFRVpFX0VOQUJMRSksCi0JRFJFRyhETUFfRVJSX1NJREVfRU5BQkxFKSwKLQlEUkVHKERNQV9FUlJfTE9HXzApLAotCURSRUcoRE1BX0VSUl9MT0dfMSksCi0JRFJFRyhETUFfRVJSX1NUQVRVU19NQVNLKSwKLQlEUkVHKERNQV9FUlIxX1NUQVRVU19NQVNLKSwKLQotCS8qIERlYnVnIGFuZCBUcmFjZSByZWdpc3RlcnMgKi8KLQlEUkVHKFBIQl9ERUJVR19DT05UUk9MMCksCi0JRFJFRyhQSEJfREVCVUdfU1RBVFVTMCksCi0JRFJFRyhQSEJfREVCVUdfQ09OVFJPTDEpLAotCURSRUcoUEhCX0RFQlVHX1NUQVRVUzEpLAotCURSRUcoUEhCX0RFQlVHX0NPTlRST0wyKSwKLQlEUkVHKFBIQl9ERUJVR19TVEFUVVMyKSwKLQlEUkVHKFBIQl9ERUJVR19DT05UUk9MMyksCi0JRFJFRyhQSEJfREVCVUdfU1RBVFVTMyksCi0JRFJFRyhQSEJfREVCVUdfQ09OVFJPTDQpLAotCURSRUcoUEhCX0RFQlVHX1NUQVRVUzQpLAotCURSRUcoUEhCX0RFQlVHX0NPTlRST0w1KSwKLQlEUkVHKFBIQl9ERUJVR19TVEFUVVM1KSwKLQotCS8qIERvbid0IHNlZW0gdG8gZXhpc3QgLi4uCi0JRFJFRyhQSEJfREVCVUdfQ09OVFJPTDYpLAotCURSRUcoUEhCX0RFQlVHX1NUQVRVUzYpLAotCSovCi19OwotCi1zdGF0aWMgaW50IHdzcF9wY2lfcmVnc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3Qgd3NwX3BoYiAqcGhiID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwaGItPmhvc2U7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c3BfcGNpX3JlZ3MpOyBpKyspIHsKLQkJLyogU2tpcCB3cml0ZS1vbmx5IHJlZ3MgKi8KLQkJaWYgKHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMDggfHwKLQkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMTAgfHwKLQkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMzggfHwKLQkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjNDApCi0JCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihtLCAiMHglMDN4OiAweCUwMTZsbHggJXNcbiIsCi0JCQkgICB3c3BfcGNpX3JlZ3NbaV0ub2Zmc2V0LAotCQkJICAgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQpLAotCQkJICAgd3NwX3BjaV9yZWdzW2ldLm5hbWUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c3BfcGNpX3JlZ3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgd3NwX3BjaV9yZWdzX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3c3BfcGNpX3JlZ3NfZm9wcyA9IHsKLQkub3BlbiA9IHdzcF9wY2lfcmVnc19vcGVuLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCB3c3BfcGNpX3JlZ19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlvdXRfYmU2NCgodm9pZCBfX2lvbWVtICopZGF0YSwgdmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c3BfcGNpX3JlZ19nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0JKnZhbCA9IGluX2JlNjQoKHZvaWQgX19pb21lbSAqKWRhdGEpOwotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURSh3c3BfcGNpX3JlZ19mb3BzLCB3c3BfcGNpX3JlZ19nZXQsIHdzcF9wY2lfcmVnX3NldCwgIjB4JWxseFxuIik7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3c3BfcGNpX2Vycl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCB3c3BfcGhiICpwaGIgPSBkZXZfaWQ7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGhiLT5ob3NlOwotCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKLQlzdHJ1Y3Qgd3NwX3BjaWVfZXJyX2xvZ19kYXRhIGVkOwotCi0JcHJfZXJyKCJQQ0k6IEVycm9yIGludGVycnVwdCBvbiAlcyAoUEhCICVkKVxuIiwKLQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSwgaG9zZS0+Z2xvYmFsX251bWJlcik7Ci0gYWdhaW46Ci0JbWVtc2V0KCZlZCwgMCwgc2l6ZW9mKGVkKSk7Ci0KLQkvKiBSZWFkIGFuZCBjbGVhciBVVEwgZXJyb3JzICovCi0JZWQudXRsX3N5c19lcnIgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfU1lTX0JVU19BR0VOVF9TVEFUVVMpOwotCWlmIChlZC51dGxfc3lzX2VycikKLQkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX1NUQVRVUywgZWQudXRsX3N5c19lcnIpOwotCWVkLnV0bF9wb3J0X2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9QQ0lFX1BPUlRfU1RBVFVTKTsKLQlpZiAoZWQudXRsX3BvcnRfZXJyKQotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1BDSUVfUE9SVF9TVEFUVVMsIGVkLnV0bF9wb3J0X2Vycik7Ci0JZWQudXRsX3JjX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9SQ19TVEFUVVMpOwotCWlmIChlZC51dGxfcmNfZXJyKQotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1JDX1NUQVRVUywgZWQudXRsX3JjX2Vycik7Ci0KLQkvKiBSZWFkIGFuZCBjbGVhciBtYWluIHRyYXAgZXJyb3JzICovCi0JZWQucGhiX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfRVJSX1NUQVRVUyk7Ci0JaWYgKGVkLnBoYl9lcnIpIHsKLQkJZWQucGhiX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUjFfU1RBVFVTKTsKLQkJZWQucGhiX2xvZzAgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9MT0dfMCk7Ci0JCWVkLnBoYl9sb2cxID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlJfTE9HXzEpOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlIxX1NUQVRVUywgMCk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9TVEFUVVMsIDApOwotCX0KLQllZC5tbWlvX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9TVEFUVVMpOwotCWlmIChlZC5tbWlvX2VycikgewotCQllZC5tbWlvX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVUyk7Ci0JCWVkLm1taW9fbG9nMCA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMCk7Ci0JCWVkLm1taW9fbG9nMSA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMSk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVUywgMCk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlJfU1RBVFVTLCAwKTsKLQl9Ci0JZWQuZG1hX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVUyk7Ci0JaWYgKGVkLmRtYV9lcnIpIHsKLQkJZWQuZG1hX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTKTsKLQkJZWQuZG1hX2xvZzAgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9MT0dfMCk7Ci0JCWVkLmRtYV9sb2cxID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlJfTE9HXzEpOwotCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlIxX1NUQVRVUywgMCk7Ci0JCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9TVEFUVVMsIDApOwotCX0KLQotCS8qIE5vdyBwcmludCB0aGluZ3Mgb3V0ICovCi0JaWYgKGVkLnBoYl9lcnIpIHsKLQkJcHJfZXJyKCIgICBQSEIgRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLnBoYl9lcnIpOwotCQlwcl9lcnIoIiAgIFBIQiBGaXJzdCBFcnJvciBTdGF0dXM6IDB4JTAxNmxseFxuIiwgZWQucGhiX2VycjEpOwotCQlwcl9lcnIoIiAgIFBIQiBFcnJvciBMb2cgMCAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQucGhiX2xvZzApOwotCQlwcl9lcnIoIiAgIFBIQiBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQucGhiX2xvZzEpOwotCX0KLQlpZiAoZWQubW1pb19lcnIpIHsKLQkJcHJfZXJyKCIgIE1NSU8gRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLm1taW9fZXJyKTsKLQkJcHJfZXJyKCIgIE1NSU8gRmlyc3QgRXJyb3IgU3RhdHVzOiAweCUwMTZsbHhcbiIsIGVkLm1taW9fZXJyMSk7Ci0JCXByX2VycigiICBNTUlPIEVycm9yIExvZyAwICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5tbWlvX2xvZzApOwotCQlwcl9lcnIoIiAgTU1JTyBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQubW1pb19sb2cxKTsKLQl9Ci0JaWYgKGVkLmRtYV9lcnIpIHsKLQkJcHJfZXJyKCIgICBETUEgRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLmRtYV9lcnIpOwotCQlwcl9lcnIoIiAgIERNQSBGaXJzdCBFcnJvciBTdGF0dXM6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2VycjEpOwotCQlwcl9lcnIoIiAgIERNQSBFcnJvciBMb2cgMCAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2xvZzApOwotCQlwcl9lcnIoIiAgIERNQSBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2xvZzEpOwotCX0KLQlpZiAoZWQudXRsX3N5c19lcnIpCi0JCXByX2VycigiICAgVVRMIFN5cyBFcnJvciBTdGF0dXMgIDogMHglMDE2bGx4XG4iLCBlZC51dGxfc3lzX2Vycik7Ci0JaWYgKGVkLnV0bF9wb3J0X2VycikKLQkJcHJfZXJyKCIgICBVVEwgUG9ydCBFcnJvciBTdGF0dXMgOiAweCUwMTZsbHhcbiIsIGVkLnV0bF9wb3J0X2Vycik7Ci0JaWYgKGVkLnV0bF9yY19lcnIpCi0JCXByX2VycigiICAgVVRMIFJDIEVycm9yIFN0YXR1cyAgIDogMHglMDE2bGx4XG4iLCBlZC51dGxfcmNfZXJyKTsKLQotCS8qIEludGVycnVwdHMgYXJlIGNhdXNlZCBieSB0aGUgZXJyb3IgdHJhcHMuIElmIHdlIGhhZCBhbnkgZXJyb3IgdGhlcmUKLQkgKiB3ZSBsb29wIGFnYWluIGluIGNhc2UgdGhlIFVUTCBidWZmZXJlZCBzb21lIG5ldyBzdHVmZiBiZXR3ZWVuCi0JICogZ29pbmcgdGhlcmUgYW5kIGdvaW5nIHRvIHRoZSB0cmFwcwotCSAqLwotCWlmIChlZC5kbWFfZXJyIHx8IGVkLm1taW9fZXJyIHx8IGVkLnBoYl9lcnIpIHsKLQkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOwotCQlnb3RvIGFnYWluOwotCX0KLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHdzcF9zZXR1cF9wY2lfZXJyX3JlcG9ydGluZyhzdHJ1Y3Qgd3NwX3BoYiAqcGhiKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBoYi0+aG9zZTsKLQlpbnQgZXJyX2lycSwgaSwgcmM7Ci0JY2hhciBmbmFtZVsxNl07Ci0KLQkvKiBDcmVhdGUgYSBkZWJ1Z2ZzIGZpbGUgZm9yIHRoYXQgUEhCICovCi0Jc3ByaW50ZihmbmFtZSwgInBoYiVkIiwgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyKTsKLQlwaGItPmRkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZm5hbWUsIHBvd2VycGNfZGVidWdmc19yb290KTsKLQotCS8qIFNvbWUgdXNlZnVsIGRlYnVnIG91dHB1dCAqLwotCWlmIChwaGItPmRkaXIpIHsKLQkJc3RydWN0IGRlbnRyeSAqZCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmVncyIsIHBoYi0+ZGRpcik7Ci0JCWNoYXIgdG1wWzY0XTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c3BfcGNpX3JlZ3MpOyBpKyspIHsKLQkJCXNwcmludGYodG1wLCAiJTAzeF8lcyIsIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQsCi0JCQkJd3NwX3BjaV9yZWdzW2ldLm5hbWUpOwotCQkJZGVidWdmc19jcmVhdGVfZmlsZSh0bXAsIDA2MDAsIGQsCi0JCQkJCSAgICBob3NlLT5jZmdfZGF0YSArIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQsCi0JCQkJCSAgICAmd3NwX3BjaV9yZWdfZm9wcyk7Ci0JCX0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgiYWxsX3JlZ3MiLCAwNjAwLCBwaGItPmRkaXIsIHBoYiwgJndzcF9wY2lfcmVnc19mb3BzKTsKLQl9Ci0KLQkvKiBGaW5kIHRoZSBJUlEgbnVtYmVyIGZvciB0aGF0IFBIQiAqLwotCWVycl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChob3NlLT5kbiwgMCk7Ci0JaWYgKGVycl9pcnEgPT0gMCkKLQkJLyogWFhYIEVycm9yIElSUSBsYWNraW5nIGZyb20gZGV2aWNlLXRyZWUgKi8KLQkJZXJyX2lycSA9IHdzcF9wY2lfZ2V0X2Vycl9pcnFfbm9fZHQoaG9zZS0+ZG4pOwotCWlmIChlcnJfaXJxID09IDApIHsKLQkJcHJfZXJyKCJQQ0k6IEZhaWxlZCB0byBmZXRjaCBlcnJvciBpbnRlcnJ1cHQgZm9yICVzXG4iLAotCQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0JLyogUmVxdWVzdCBpdCAqLwotCXJjID0gcmVxdWVzdF9pcnEoZXJyX2lycSwgd3NwX3BjaV9lcnJfaXJxLCAwLCAid3NwX3BjaSBlcnJvciIsIHBoYik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiUENJOiBGYWlsZWQgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgZm9yICVzXG4iLAotCQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSk7Ci0JfQotCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBhbGwgZXJyb3JzIGZvciBub3cgKi8KLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlJfSVJRX0VOQUJMRSwgMHhmZmZmZmZmZmZmZmZmZmZmdWxsKTsKLQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX01NSU9fRVJSX0lSUV9FTkFCTEUsIDB4ZmZmZmZmZmZmZmZmZmZmZnVsbCk7Ci0Jb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX0lSUV9FTkFCTEUsIDB4ZmZmZmZmZmZmZmZmZmZmZnVsbCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCBsYXRlciB0byBob29rdXAgd2l0aCB0aGUgZXJyb3IgaW50ZXJydXB0Ci0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHdzcF9zZXR1cF9wY2lfbGF0ZSh2b2lkKQotewotCXN0cnVjdCB3c3BfcGhiICpwaGI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBoYiwgJndzcF9waGJzLCBhbGwpCi0JCXdzcF9zZXR1cF9wY2lfZXJyX3JlcG9ydGluZyhwaGIpOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKHdzcF9zZXR1cF9wY2lfbGF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTliZDkuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMCBCZW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fV1NQX1BDSV9ICi0jZGVmaW5lIF9fV1NQX1BDSV9ICi0KLS8qIEFyY2hpdGVjdGVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQQ0lFX1JFR19ETUFfQ0hBTl9TVEFUVVMJMHgxMTAKLSNkZWZpbmUgUENJRV9SRUdfQ1BVX0xPQURTVE9SRV9TVEFUVVMJMHgxMjAKLQotI2RlZmluZSBQQ0lFX1JFR19DT05GSUdfREFUQQkJMHgxMzAKLSNkZWZpbmUgUENJRV9SRUdfTE9DSzAJCQkweDEzOAotI2RlZmluZSBQQ0lFX1JFR19DT05GSUdfQUREUkVTUwkJMHgxNDAKLSNkZWZpbmUgICBQQ0lFX1JFR19DQV9FTkFCTEUJCQkweDgwMDAwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUJICBQQ0lFX1JFR19DQV9CVVNfTUFTSwkJCTB4MGZmMDAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX0NBX0JVU19TSElGVAkJCSgyMCszMikKLSNkZWZpbmUgICBQQ0lFX1JFR19DQV9ERVZfTUFTSwkJCTB4MDAwZjgwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX0NBX0RFVl9TSElGVAkJCSgxNSszMikKLSNkZWZpbmUgICBQQ0lFX1JFR19DQV9GVU5DX01BU0sJCQkweDAwMDA3MDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19DQV9GVU5DX1NISUZUCQkoMTIrMzIpCi0jZGVmaW5lICAgUENJRV9SRUdfQ0FfUkVHX01BU0sJCQkweDAwMDAwZmZmMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19DQV9SRUdfU0hJRlQJCQkoIDArMzIpCi0jZGVmaW5lICAgUENJRV9SRUdfQ0FfQkVfTUFTSwkJCTB4MDAwMDAwMDBmMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX0NBX0JFX1NISUZUCQkJKCAgIDI4KQotI2RlZmluZSBQQ0lFX1JFR19MT0NLMQkJCTB4MTQ4Ci0KLSNkZWZpbmUgUENJRV9SRUdfUEhCX0NPTkZJRwkJMHgxNjAKLSNkZWZpbmUgICBQQ0lFX1JFR19QSEJDXzY0Ql9UQ0VfRU4JCTB4MjAwMDAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfTU1JT19ETUFfRlJFRVpFX0VOCTB4MTAwMDAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfMzJCSVRfTVNJX0VOCQkweDAwODAwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX002NF9FTgkJCTB4MDA0MDAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfSU9fRU4JCQkweDAwMDgwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19QSEJDXzY0QklUX01TSV9FTgkJMHgwMDAyMDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfUEhCQ19NMzJBX0VOCQkJMHgwMDAwODAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfUEhCQ19NMzJCX0VOCQkJMHgwMDAwNDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfUEhCQ19NU0lfUEVfVkFMSURBVEUJCTB4MDAwMDIwMDAwMDAwMDAwMHVsbAotI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfRE1BX1hMQVRFX0JZUEFTUwkweDAwMDAxMDAwMDAwMDAwMDB1bGwKLQotI2RlZmluZSBQQ0lFX1JFR19JT19CQVNFX0FERFIJCTB4MTcwCi0jZGVmaW5lIFBDSUVfUkVHX0lPX0JBU0VfTUFTSwkJMHgxNzgKLSNkZWZpbmUgUENJRV9SRUdfSU9fU1RBUlRfQUREUgkJMHgxODAKLQotI2RlZmluZSBQQ0lFX1JFR19NMzJBX0JBU0VfQUREUgkJMHgxOTAKLSNkZWZpbmUgUENJRV9SRUdfTTMyQV9CQVNFX01BU0sJCTB4MTk4Ci0jZGVmaW5lIFBDSUVfUkVHX00zMkFfU1RBUlRfQUREUgkweDFhMAotCi0jZGVmaW5lIFBDSUVfUkVHX00zMkJfQkFTRV9BRERSCQkweDFiMAotI2RlZmluZSBQQ0lFX1JFR19NMzJCX0JBU0VfTUFTSwkJMHgxYjgKLSNkZWZpbmUgUENJRV9SRUdfTTMyQl9TVEFSVF9BRERSCTB4MWMwCi0KLSNkZWZpbmUgUENJRV9SRUdfTTY0X0JBU0VfQUREUgkJMHgxZTAKLSNkZWZpbmUgUENJRV9SRUdfTTY0X0JBU0VfTUFTSwkJMHgxZTgKLSNkZWZpbmUgUENJRV9SRUdfTTY0X1NUQVJUX0FERFIJCTB4MWYwCi0KLSNkZWZpbmUgUENJRV9SRUdfVENFX0tJTEwJCTB4MjEwCi0jZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9TSU5HTEUJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9BRERSX01BU0sJMHgwMDAwMDNmZmZmZmZmZmY4dWxsCi0jZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9QU180SwkwCi0jZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9QU182NEsJMQotI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfUFNfMTZNCTIKLSNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX1BTXzE2RwkzCi0KLSNkZWZpbmUgUENJRV9SRUdfSU9EQV9BRERSCQkweDIyMAotI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfQVVUT0lOQwkweDgwMDAwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9NVlQJMHgwMDA1MDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfUEVMVAkweDAwMDYwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9QRVNUQQkweDAwMDcwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9QRVNUQgkweDAwMDgwMDAwMDAwMDAwMDB1bGwKLSNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9UVlQJMHgwMDA5MDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfVENFCTB4MDAwYTAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSBQQ0lFX1JFR19JT0RBX0RBVEEwCQkweDIyOAotI2RlZmluZSBQQ0lFX1JFR19JT0RBX0RBVEExCQkweDIzMAotCi0jZGVmaW5lIFBDSUVfUkVHX0xPQ0syCQkJMHgyNDAKLQotI2RlZmluZSBQQ0lFX1JFR19QSEJfR0VOX0NBUAkJMHgyNTAKLSNkZWZpbmUgUENJRV9SRUdfUEhCX1RDRV9DQVAJCTB4MjU4Ci0jZGVmaW5lIFBDSUVfUkVHX1BIQl9JUlFfQ0FQCQkweDI2MAotI2RlZmluZSBQQ0lFX1JFR19QSEJfRUVIX0NBUAkJMHgyNjgKLQotI2RlZmluZSBQQ0lFX1JFR19QQVBSX0VSUl9JTkpfQ09OVFJPTAkweDJiMAotI2RlZmluZSBQQ0lFX1JFR19QQVBSX0VSUl9JTkpfQUREUgkweDJiOAotI2RlZmluZSBQQ0lFX1JFR19QQVBSX0VSUl9JTkpfTUFTSwkweDJjMAotCi0KLSNkZWZpbmUgUENJRV9SRUdfU1lTX0NGRzEJCTB4NjAwCi0jZGVmaW5lICAgUENJRV9SRUdfU1lTX0NGRzFfQ0xBU1NfQ09ERQkweDAwMDAwMDAwMDBmZmZmZmZ1bGwKLQotI2RlZmluZSBJT0RBX1RWVDBfVFRBX01BU0sJCTB4MDAwZmZmZmZmZmZmMDAwMHVsbAotI2RlZmluZSBJT0RBX1RWVDBfVFRBX1NISUZUCQk0Ci0jZGVmaW5lIElPREFfVFZUMF9CVVNOVU1fVkFMSURfTUFTSwkweDAwMDAwMDAwMDAwMGUwMDB1bGwKLSNkZWZpbmUgSU9EQV9UVlQwX1RDRV9UQUJMRV9TSVpFX01BU0sJMHgwMDAwMDAwMDAwMDAxZjAwdWxsCi0jZGVmaW5lIElPREFfVFZUMF9UQ0VfVEFCTEVfU0laRV9TSElGVAk4Ci0jZGVmaW5lIElPREFfVFZUMF9CVVNOVU1fVkFMVUVfTUFTSwkweDAwMDAwMDAwMDAwMDAwZmZ1bGwKLSNkZWZpbmUgSU9EQV9UVlQwX0JVU05VTV9WQUxJRF9TSElGVAkwCi0jZGVmaW5lIElPREFfVFZUMV9ERVZOVU1fVkFMSUQJCTB4MjAwMDAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSBJT0RBX1RWVDFfREVWTlVNX1ZBTFVFX01BU0sJMHgxZjAwMDAwMDAwMDAwMDAwdWxsCi0jZGVmaW5lIElPREFfVFZUMV9ERVZOVU1fVkFMVUVfU0hJRlQJNTYKLSNkZWZpbmUgSU9EQV9UVlQxX0ZVTkNOVU1fVkFMSUQJCTB4MDAwODAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSBJT0RBX1RWVDFfRlVOQ05VTV9WQUxVRV9NQVNLCTB4MDAwNzAwMDAwMDAwMDAwMHVsbAotI2RlZmluZSBJT0RBX1RWVDFfRlVOQ05VTV9WQUxVRV9TSElGVAk0OAotI2RlZmluZSBJT0RBX1RWVDFfSU9fUEFHRV9TSVpFX01BU0sJMHgwMDAwMWYwMDAwMDAwMDAwdWxsCi0jZGVmaW5lIElPREFfVFZUMV9JT19QQUdFX1NJWkVfU0hJRlQJNDAKLSNkZWZpbmUgSU9EQV9UVlQxX1BFX05VTUJFUl9NQVNLCTB4MDAwMDAwMDAwMDAwMDAzZnVsbAotI2RlZmluZSBJT0RBX1RWVDFfUEVfTlVNQkVSX1NISUZUCTAKLQotI2RlZmluZSBJT0RBX1RWVF9DT1VOVAkJCTY0Ci0KLS8qIFVUTCBDb3JlIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQQ0lFX1VUTF9TWVNfQlVTX0NPTlRST0wJMHg0MDAKLSNkZWZpbmUgUENJRV9VVExfU1RBVFVTCQkJMHg0MDgKLSNkZWZpbmUgUENJRV9VVExfU1lTX0JVU19BR0VOVF9TVEFUVVMJMHg0MTAKLSNkZWZpbmUgUENJRV9VVExfU1lTX0JVU19BR0VOVF9FUlJfU0VWCTB4NDE4Ci0jZGVmaW5lIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfSVJRX0VOCTB4NDIwCi0jZGVmaW5lIFBDSUVfVVRMX1NZU19CVVNfQlVSU1RfU1pfQ09ORgkweDQ0MAotI2RlZmluZSBQQ0lFX1VUTF9SRVZJU0lPTl9JRAkJMHg0NDgKLQotI2RlZmluZSBQQ0lFX1VUTF9PVVRfUE9TVF9IRFJfQlVGX0FMTE9DCTB4NGMwCi0jZGVmaW5lIFBDSUVfVVRMX09VVF9QT1NUX0RBVF9CVUZfQUxMT0MJMHg0ZDAKLSNkZWZpbmUgUENJRV9VVExfSU5fUE9TVF9IRFJfQlVGX0FMTE9DCTB4NGUwCi0jZGVmaW5lIFBDSUVfVVRMX0lOX1BPU1RfREFUX0JVRl9BTExPQwkweDRmMAotI2RlZmluZSBQQ0lFX1VUTF9PVVRfTlBfQlVGX0FMTE9DCTB4NTAwCi0jZGVmaW5lIFBDSUVfVVRMX0lOX05QX0JVRl9BTExPQwkweDUxMAotI2RlZmluZSBQQ0lFX1VUTF9QQ0lFX1RBR1NfQUxMT0MJMHg1MjAKLSNkZWZpbmUgUENJRV9VVExfR0JJRl9SRUFEX1RBR1NfQUxMT0MJMHg1MzAKLQotI2RlZmluZSBQQ0lFX1VUTF9QQ0lFX1BPUlRfQ09OVFJPTAkweDU0MAotI2RlZmluZSBQQ0lFX1VUTF9QQ0lFX1BPUlRfU1RBVFVTCTB4NTQ4Ci0jZGVmaW5lIFBDSUVfVVRMX1BDSUVfUE9SVF9FUlJPUl9TRVYJMHg1NTAKLSNkZWZpbmUgUENJRV9VVExfUENJRV9QT1JUX0lSUV9FTgkweDU1OAotI2RlZmluZSBQQ0lFX1VUTF9SQ19TVEFUVVMJCTB4NTYwCi0jZGVmaW5lIFBDSUVfVVRMX1JDX0VSUl9TRVZFUklUWQkweDU2OAotI2RlZmluZSBQQ0lFX1VUTF9SQ19JUlFfRU4JCTB4NTcwCi0jZGVmaW5lIFBDSUVfVVRMX0VQX1NUQVRVUwkJMHg1NzgKLSNkZWZpbmUgUENJRV9VVExfRVBfRVJSX1NFVkVSSVRZCTB4NTgwCi0jZGVmaW5lIFBDSUVfVVRMX0VQX0VSUl9JUlFfRU4JCTB4NTg4Ci0KLSNkZWZpbmUgUENJRV9VVExfUENJX1BNX0NUUkwxCQkweDU5MAotI2RlZmluZSBQQ0lFX1VUTF9QQ0lfUE1fQ1RSTDIJCTB4NTk4Ci0KLS8qIFBDSWUgc3RhY2sgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSUVfUkVHX1NZU1RFTV9DT05GSUcxCQkweDYwMAotI2RlZmluZSBQQ0lFX1JFR19TWVNURU1fQ09ORklHMgkJMHg2MDgKLSNkZWZpbmUgUENJRV9SRUdfRVBfU1lTVEVNX0NPTkZJRwkweDYxOAotI2RlZmluZSBQQ0lFX1JFR19FUF9GTFIJCQkweDYyMAotI2RlZmluZSBQQ0lFX1JFR19FUF9CQVJfQ09ORklHCQkweDYyOAotI2RlZmluZSBQQ0lFX1JFR19MSU5LX0NPTkZJRwkJMHg2MzAKLSNkZWZpbmUgUENJRV9SRUdfUE1fQ09ORklHCQkweDY0MAotI2RlZmluZSBQQ0lFX1JFR19ETFBfQ09OVFJPTAkJMHg2NTAKLSNkZWZpbmUgUENJRV9SRUdfRExQX1NUQVRVUwkJMHg2NTgKLSNkZWZpbmUgUENJRV9SRUdfRVJSX1JFUE9SVF9DT05UUk9MCTB4NjYwCi0jZGVmaW5lIFBDSUVfUkVHX1NMT1RfQ09OVFJPTDEJCTB4NjcwCi0jZGVmaW5lIFBDSUVfUkVHX1NMT1RfQ09OVFJPTDIJCTB4Njc4Ci0jZGVmaW5lIFBDSUVfUkVHX1VUTF9DT05GSUcJCTB4NjgwCi0jZGVmaW5lIFBDSUVfUkVHX0JVRkZFUlNfQ09ORklHCQkweDY5MAotI2RlZmluZSBQQ0lFX1JFR19FUlJPUl9JTkpFQ1QJCTB4Njk4Ci0jZGVmaW5lIFBDSUVfUkVHX1NSSU9WX0NPTkZJRwkJMHg2YTAKLSNkZWZpbmUgUENJRV9SRUdfUEYwX1NSSU9WX1NUQVRVUwkweDZhOAotI2RlZmluZSBQQ0lFX1JFR19QRjFfU1JJT1ZfU1RBVFVTCTB4NmIwCi0jZGVmaW5lIFBDSUVfUkVHX1BPUlRfTlVNQkVSCQkweDcwMAotI2RlZmluZSBQQ0lFX1JFR19QT1JfU1lTVEVNX0NPTkZJRwkweDcwOAotCi0vKiBQSEIgaW50ZXJuYWwgbG9naWMgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9WRVJTSU9OCQkweDgwMAotI2RlZmluZSBQQ0lFX1JFR19SRVNFVAkJCTB4ODA4Ci0jZGVmaW5lIFBDSUVfUkVHX1BIQl9DT05UUk9MCQkweDgxMAotI2RlZmluZSBQQ0lFX1JFR19QSEJfVElNRU9VVF9DT05UUk9MMQkweDg3OAotI2RlZmluZSBQQ0lFX1JFR19QSEJfUVVJRVNDRV9ETUEJMHg4ODgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0RNQV9SRUFEX1RBR19BQ1RWCTB4OTAwCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9UQ0VfUkVBRF9UQUdfQUNUVgkweDkwOAotCi0vKiBGSVIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSUVfUkVHX0xFTV9GSVJfQUNDVU0JCTB4YzAwCi0jZGVmaW5lIFBDSUVfUkVHX0xFTV9GSVJfQU5EX01BU0sJMHhjMDgKLSNkZWZpbmUgUENJRV9SRUdfTEVNX0ZJUl9PUl9NQVNLCTB4YzEwCi0jZGVmaW5lIFBDSUVfUkVHX0xFTV9BQ1RJT04wCQkweGMxOAotI2RlZmluZSBQQ0lFX1JFR19MRU1fQUNUSU9OMQkJMHhjMjAKLSNkZWZpbmUgUENJRV9SRUdfTEVNX0VSUk9SX01BU0sJCTB4YzMwCi0jZGVmaW5lIFBDSUVfUkVHX0xFTV9FUlJPUl9BTkRfTUFTSwkweGMzOAotI2RlZmluZSBQQ0lFX1JFR19MRU1fRVJST1JfT1JfTUFTSwkweGM0MAotCi0vKiBQSEIgRXJyb3IgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfU1RBVFVTCQkweGM4MAotI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSMV9TVEFUVVMJMHhjODgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9JTkpFQ1QJCTB4YzkwCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfTEVNX0VOQUJMRQkweGM5OAotI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0lSUV9FTkFCTEUJMHhjYTAKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9GUkVFWkVfRU5BQkxFCTB4Y2E4Ci0jZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfU0lERV9FTkFCTEUJMHhjYjgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9MT0dfMAkJMHhjYzAKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9MT0dfMQkJMHhjYzgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9TVEFUVVNfTUFTSwkweGNkMAotI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSMV9TVEFUVVNfTUFTSwkweGNkOAotCi0jZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX1NUQVRVUwkweGQwMAotI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUjFfU1RBVFVTCTB4ZDA4Ci0jZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0lOSkVDVAkweGQxMAotI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9MRU1fRU5BQkxFCTB4ZDE4Ci0jZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0lSUV9FTkFCTEUJMHhkMjAKLSNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfRlJFRVpFX0VOQUJMRQkweGQyOAotI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9TSURFX0VOQUJMRQkweGQzOAotI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMAkJMHhkNDAKLSNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfTE9HXzEJCTB4ZDQ4Ci0jZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX1NUQVRVU19NQVNLCTB4ZDUwCi0jZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSMV9TVEFUVVNfTUFTSwkweGQ1OAotCi0jZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfU1RBVFVTCQkweGQ4MAotI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSMV9TVEFUVVMJMHhkODgKLSNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9JTkpFQ1QJCTB4ZDkwCi0jZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfTEVNX0VOQUJMRQkweGQ5OAotI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0lSUV9FTkFCTEUJMHhkYTAKLSNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9GUkVFWkVfRU5BQkxFCTB4ZGE4Ci0jZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfU0lERV9FTkFCTEUJMHhkYjgKLSNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9MT0dfMAkJMHhkYzAKLSNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9MT0dfMQkJMHhkYzgKLSNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9TVEFUVVNfTUFTSwkweGRkMAotI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSMV9TVEFUVVNfTUFTSwkweGRkOAotCi0vKiBTaG9ydGN1dHMgZm9yIGFjY2VzcyB0byB0aGUgYWJvdmUgdXNpbmcgdGhlIFBIQiBkZWZpbml0aW9ucwotICogd2l0aCBhbiBvZmZzZXQKLSAqLwotI2RlZmluZSBQQ0lFX1JFR19FUlJfUEhCX09GRlNFVAkJMHgwCi0jZGVmaW5lIFBDSUVfUkVHX0VSUl9NTUlPX09GRlNFVAkweDgwCi0jZGVmaW5lIFBDSUVfUkVHX0VSUl9ETUFfT0ZGU0VUCQkweDEwMAotCi0vKiBEZWJ1ZyBhbmQgVHJhY2UgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MMAkweGUwMAotI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTMAkweGUwOAotI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDEJMHhlMTAKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzEJMHhlMTgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0wyCTB4ZTIwCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVMyCTB4ZTI4Ci0jZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MMwkweGUzMAotI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTMwkweGUzOAotI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDQJMHhlNDAKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzQJMHhlNDgKLSNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0w1CTB4ZTUwCi0jZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVM1CTB4ZTU4Ci0jZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MNgkweGU2MAotI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTNgkweGU2OAotCi0vKiBEZWZpbml0aW9uIGZvciBQQ0llIGVycm9ycyAqLwotc3RydWN0IHdzcF9wY2llX2Vycl9sb2dfZGF0YSB7Ci0JX191NjQJcGhiX2VycjsKLQlfX3U2NAlwaGJfZXJyMTsKLQlfX3U2NAlwaGJfbG9nMDsKLQlfX3U2NAlwaGJfbG9nMTsKLQlfX3U2NAltbWlvX2VycjsKLQlfX3U2NAltbWlvX2VycjE7Ci0JX191NjQJbW1pb19sb2cwOwotCV9fdTY0CW1taW9fbG9nMTsKLQlfX3U2NAlkbWFfZXJyOwotCV9fdTY0CWRtYV9lcnIxOwotCV9fdTY0CWRtYV9sb2cwOwotCV9fdTY0CWRtYV9sb2cxOwotCV9fdTY0CXV0bF9zeXNfZXJyOwotCV9fdTY0CXV0bF9wb3J0X2VycjsKLQlfX3U2NAl1dGxfcmNfZXJyOwotCV9fdTY0CXVudXNlZDsKLX07Ci0KLSNlbmRpZiAvKiBfX1dTUF9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCAyMjhjZjkxLi5mZmQxMTY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KLSNpbmNsdWRlIDxsaW51eC9waHlfZml4ZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CkBAIC0xNzgsMzcgKzE3Nyw2IEBACiBFWFBPUlRfU1lNQk9MKGdldF9iYXVkcmF0ZSk7CiAjZW5kaWYgLyogQ09ORklHX0NQTTIgKi8KIAotI2lmZGVmIENPTkZJR19GSVhFRF9QSFkKLXN0YXRpYyBpbnQgX19pbml0IG9mX2FkZF9maXhlZF9waHlzKHZvaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXUzMiAqZml4ZWRfbGluazsKLQlzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyBzdGF0dXMgPSB7fTsKLQotCWZvcl9lYWNoX25vZGVfYnlfbmFtZShucCwgImV0aGVybmV0IikgewotCQlmaXhlZF9saW5rICA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkobnAsICJmaXhlZC1saW5rIiwgTlVMTCk7Ci0JCWlmICghZml4ZWRfbGluaykKLQkJCWNvbnRpbnVlOwotCi0JCXN0YXR1cy5saW5rID0gMTsKLQkJc3RhdHVzLmR1cGxleCA9IGZpeGVkX2xpbmtbMV07Ci0JCXN0YXR1cy5zcGVlZCA9IGZpeGVkX2xpbmtbMl07Ci0JCXN0YXR1cy5wYXVzZSA9IGZpeGVkX2xpbmtbM107Ci0JCXN0YXR1cy5hc3ltX3BhdXNlID0gZml4ZWRfbGlua1s0XTsKLQotCQlyZXQgPSBmaXhlZF9waHlfYWRkKFBIWV9QT0xMLCBmaXhlZF9saW5rWzBdLCAmc3RhdHVzKTsKLQkJaWYgKHJldCkgewotCQkJb2Zfbm9kZV9wdXQobnApOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChvZl9hZGRfZml4ZWRfcGh5cyk7Ci0jZW5kaWYgLyogQ09ORklHX0ZJWEVEX1BIWSAqLwotCiAjaWYgZGVmaW5lZChDT05GSUdfRlNMX1NPQ19CT09LRSkgfHwgZGVmaW5lZChDT05GSUdfUFBDXzg2eHgpCiBzdGF0aWMgX19iZTMyIF9faW9tZW0gKnJzdGNyOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYwppbmRleCA5ZGVlNDcwLi5kZThkOTQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20veGljcy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisjaW5jbHVkZSA8YXNtL2RiZWxsLmg+CiAKIHN0cnVjdCBpY3BfaXBsIHsKIAl1bmlvbiB7CkBAIC0xNDUsNyArMTQ2LDEzIEBACiBzdGF0aWMgdm9pZCBpY3BfbmF0aXZlX2NhdXNlX2lwaShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJa3ZtcHBjX3NldF9ob3N0X2lwaShjcHUsIDEpOwotCWljcF9uYXRpdmVfc2V0X3FpcnIoY3B1LCBJUElfUFJJT1JJVFkpOworI2lmZGVmIENPTkZJR19QUENfRE9PUkJFTEwKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfREJFTEwpICYmCisJICAgIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B1X3NpYmxpbmdfbWFzayhzbXBfcHJvY2Vzc29yX2lkKCkpKSkpCisJCWRvb3JiZWxsX2NhdXNlX2lwaShjcHUsIGRhdGEpOworCWVsc2UKKyNlbmRpZgorCQlpY3BfbmF0aXZlX3NldF9xaXJyKGNwdSwgSVBJX1BSSU9SSVRZKTsKIH0KIAogdm9pZCB4aWNzX3dha2VfY3B1KGludCBjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9ub25zdGRpby5jIGIvYXJjaC9wb3dlcnBjL3htb24vbm9uc3RkaW8uYwppbmRleCBiY2UzZGNmLi5jOTg3NDg2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi9ub25zdGRpby5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL25vbnN0ZGlvLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJaWYgKG4gJiYgcmMgPT0gMCkgewogCQkvKiBObyB1ZGJnIGhvb2tzLCBmYWxsYmFjayB0byBwcmludGsoKSAtIGRhbmdlcm91cyAqLwotCQlwcmludGsoeG1vbl9vdXRidWYpOworCQlwcmludGsoIiVzIiwgeG1vbl9vdXRidWYpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL25ldC9icGZfaml0X2NvbXAuYyBiL2FyY2gvczM5MC9uZXQvYnBmX2ppdF9jb21wLmMKaW5kZXggZTlmOGZhOS4uYTJjYmQ4NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL25ldC9icGZfaml0X2NvbXAuYworKysgYi9hcmNoL3MzOTAvbmV0L2JwZl9qaXRfY29tcC5jCkBAIC0yNjksMjcgKzI2OSwxNyBAQAogCQlFTUlUNCgweGE3YzgwMDAwKTsKIAkvKiBDbGVhciBBIGlmIHRoZSBmaXJzdCByZWdpc3RlciBkb2VzIG5vdCBzZXQgaXQuICovCiAJc3dpdGNoIChmaWx0ZXJbMF0uY29kZSkgewotCWNhc2UgQlBGX1NfTERfV19BQlM6Ci0JY2FzZSBCUEZfU19MRF9IX0FCUzoKLQljYXNlIEJQRl9TX0xEX0JfQUJTOgotCWNhc2UgQlBGX1NfTERfV19MRU46Ci0JY2FzZSBCUEZfU19MRF9XX0lORDoKLQljYXNlIEJQRl9TX0xEX0hfSU5EOgotCWNhc2UgQlBGX1NfTERfQl9JTkQ6Ci0JY2FzZSBCUEZfU19MRF9JTU06Ci0JY2FzZSBCUEZfU19MRF9NRU06Ci0JY2FzZSBCUEZfU19NSVNDX1RYQToKLQljYXNlIEJQRl9TX0FOQ19QUk9UT0NPTDoKLQljYXNlIEJQRl9TX0FOQ19QS1RUWVBFOgotCWNhc2UgQlBGX1NfQU5DX0lGSU5ERVg6Ci0JY2FzZSBCUEZfU19BTkNfTUFSSzoKLQljYXNlIEJQRl9TX0FOQ19RVUVVRToKLQljYXNlIEJQRl9TX0FOQ19IQVRZUEU6Ci0JY2FzZSBCUEZfU19BTkNfUlhIQVNIOgotCWNhc2UgQlBGX1NfQU5DX0NQVToKLQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBRzoKLQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBR19QUkVTRU5UOgotCWNhc2UgQlBGX1NfUkVUX0s6CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU46CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9JTkQ6CisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9JTkQ6CisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9JTkQ6CisJY2FzZSBCUEZfTEQgfCBCUEZfSU1NOgorCWNhc2UgQlBGX0xEIHwgQlBGX01FTToKKwljYXNlIEJQRl9NSVNDIHwgQlBGX1RYQToKKwljYXNlIEJQRl9SRVQgfCBCUEZfSzoKIAkJLyogZmlyc3QgaW5zdHJ1Y3Rpb24gc2V0cyBBIHJlZ2lzdGVyICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6IC8qIEEgPSAwICovCkBAIC0zMDQsMTUgKzI5NCwxOCBAQAogCXVuc2lnbmVkIGludCBLOwogCWludCBvZmZzZXQ7CiAJdW5zaWduZWQgaW50IG1hc2s7CisJdTE2IGNvZGU7CiAKIAlLID0gZmlsdGVyLT5rOwotCXN3aXRjaCAoZmlsdGVyLT5jb2RlKSB7Ci0JY2FzZSBCUEZfU19BTFVfQUREX1g6IC8qIEEgKz0gWCAqLworCWNvZGUgPSBicGZfYW5jX2hlbHBlcihmaWx0ZXIpOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YOiAvKiBBICs9IFggKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJLyogYXIgJXI1LCVyMTIgKi8KIAkJRU1JVDIoMHgxYTVjKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfQUREX0s6IC8qIEEgKz0gSyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSzogLyogQSArPSBLICovCiAJCWlmICghSykKIAkJCWJyZWFrOwogCQlpZiAoSyA8PSAxNjM4MykKQEAgLTMyNSwxMiArMzE4LDEyIEBACiAJCQkvKiBhICVyNSw8ZChLKT4oJXIxMykgKi8KIAkJCUVNSVQ0X0RJU1AoMHg1YTUwZDAwMCwgRU1JVF9DT05TVChLKSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX1NVQl9YOiAvKiBBIC09IFggKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1g6IC8qIEEgLT0gWCAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9YUkVHOwogCQkvKiBzciAlcjUsJXIxMiAqLwogCQlFTUlUMigweDFiNWMpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FMVV9TVUJfSzogLyogQSAtPSBLICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOiAvKiBBIC09IEsgKi8KIAkJaWYgKCFLKQogCQkJYnJlYWs7CiAJCWlmIChLIDw9IDE2Mzg0KQpAQCAtMzQzLDEyICszMzYsMTIgQEAKIAkJCS8qIHMgJXI1LDxkKEspPiglcjEzKSAqLwogCQkJRU1JVDRfRElTUCgweDViNTBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfTVVMX1g6IC8qIEEgKj0gWCAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfWDogLyogQSAqPSBYICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCS8qIG1zciAlcjUsJXIxMiAqLwogCQlFTUlUNCgweGIyNTIwMDVjKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfTVVMX0s6IC8qIEEgKj0gSyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSzogLyogQSAqPSBLICovCiAJCWlmIChLIDw9IDE2MzgzKQogCQkJLyogbWhpICVyNSxLICovCiAJCQlFTUlUNF9JTU0oMHhhNzVjMDAwMCwgSyk7CkBAIC0zNTksNyArMzUyLDcgQEAKIAkJCS8qIG1zICVyNSw8ZChLKT4oJXIxMykgKi8KIAkJCUVNSVQ0X0RJU1AoMHg3MTUwZDAwMCwgRU1JVF9DT05TVChLKSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX0RJVl9YOiAvKiBBIC89IFggKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1g6IC8qIEEgLz0gWCAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9YUkVHIHwgU0VFTl9SRVQwOwogCQkvKiBsdHIgJXIxMiwlcjEyICovCiAJCUVNSVQyKDB4MTJjYyk7CkBAIC0zNzAsNyArMzYzLDcgQEAKIAkJLyogZGxyICVyNCwlcjEyICovCiAJCUVNSVQ0KDB4Yjk5NzAwNGMpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FMVV9ESVZfSzogLyogQSAvPSBLICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOiAvKiBBIC89IEsgKi8KIAkJaWYgKEsgPT0gMSkKIAkJCWJyZWFrOwogCQkvKiBsaGkgJXI0LDAgKi8KQEAgLTM3OCw3ICszNzEsNyBAQAogCQkvKiBkbCAlcjQsPGQoSyk+KCVyMTMpICovCiAJCUVNSVQ2X0RJU1AoMHhlMzQwZDAwMCwgMHgwMDk3LCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfTU9EX1g6IC8qIEEgJT0gWCAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfWDogLyogQSAlPSBYICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUcgfCBTRUVOX1JFVDA7CiAJCS8qIGx0ciAlcjEyLCVyMTIgKi8KIAkJRU1JVDIoMHgxMmNjKTsKQEAgLTM5MSw3ICszODQsNyBAQAogCQkvKiBsciAlcjUsJXI0ICovCiAJCUVNSVQyKDB4MTg1NCk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX01PRF9LOiAvKiBBICU9IEsgKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6IC8qIEEgJT0gSyAqLwogCQlpZiAoSyA9PSAxKSB7CiAJCQkvKiBsaGkgJXI1LDAgKi8KIAkJCUVNSVQ0KDB4YTc1ODAwMDApOwpAQCAtNDA0LDEyICszOTcsMTIgQEAKIAkJLyogbHIgJXI1LCVyNCAqLwogCQlFTUlUMigweDE4NTQpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FMVV9BTkRfWDogLyogQSAmPSBYICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9YOiAvKiBBICY9IFggKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJLyogbnIgJXI1LCVyMTIgKi8KIAkJRU1JVDIoMHgxNDVjKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfQU5EX0s6IC8qIEEgJj0gSyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSzogLyogQSAmPSBLICovCiAJCWlmICh0ZXN0X2ZhY2lsaXR5KDIxKSkKIAkJCS8qIG5pbGYgJXI1LDxLPiAqLwogCQkJRU1JVDZfSU1NKDB4YzA1YjAwMDAsIEspOwpAQCAtNDE3LDEyICs0MTAsMTIgQEAKIAkJCS8qIG4gJXI1LDxkKEspPiglcjEzKSAqLwogCQkJRU1JVDRfRElTUCgweDU0NTBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfT1JfWDogLyogQSB8PSBYICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1g6IC8qIEEgfD0gWCAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9YUkVHOwogCQkvKiBvciAlcjUsJXIxMiAqLwogCQlFTUlUMigweDE2NWMpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FMVV9PUl9LOiAvKiBBIHw9IEsgKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfSzogLyogQSB8PSBLICovCiAJCWlmICh0ZXN0X2ZhY2lsaXR5KDIxKSkKIAkJCS8qIG9pbGYgJXI1LDxLPiAqLwogCQkJRU1JVDZfSU1NKDB4YzA1ZDAwMDAsIEspOwpAQCAtNDMwLDU1ICs0MjMsNTUgQEAKIAkJCS8qIG8gJXI1LDxkKEspPiglcjEzKSAqLwogCQkJRU1JVDRfRElTUCgweDU2NTBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTkNfQUxVX1hPUl9YOiAvKiBBIF49IFg7ICovCi0JY2FzZSBCUEZfU19BTFVfWE9SX1g6CisJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0FMVV9YT1JfWDogLyogQSBePSBYOyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfWDoKIAkJaml0LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJLyogeHIgJXI1LCVyMTIgKi8KIAkJRU1JVDIoMHgxNzVjKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfWE9SX0s6IC8qIEEgXj0gSyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfSzogLyogQSBePSBLICovCiAJCWlmICghSykKIAkJCWJyZWFrOwogCQkvKiB4ICVyNSw8ZChLKT4oJXIxMykgKi8KIAkJRU1JVDRfRElTUCgweDU3NTBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTFVfTFNIX1g6IC8qIEEgPDw9IFg7ICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9YOiAvKiBBIDw8PSBYOyAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9YUkVHOwogCQkvKiBzbGwgJXI1LDAoJXIxMikgKi8KIAkJRU1JVDQoMHg4OTUwYzAwMCk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX0xTSF9LOiAvKiBBIDw8PSBLICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LOiAvKiBBIDw8PSBLICovCiAJCWlmIChLID09IDApCiAJCQlicmVhazsKIAkJLyogc2xsICVyNSxLICovCiAJCUVNSVQ0X0RJU1AoMHg4OTUwMDAwMCwgSyk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX1JTSF9YOiAvKiBBID4+PSBYOyAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfWDogLyogQSA+Pj0gWDsgKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fWFJFRzsKIAkJLyogc3JsICVyNSwwKCVyMTIpICovCiAJCUVNSVQ0KDB4ODg1MGMwMDApOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FMVV9SU0hfSzogLyogQSA+Pj0gSzsgKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX0s6IC8qIEEgPj49IEs7ICovCiAJCWlmIChLID09IDApCiAJCQlicmVhazsKIAkJLyogc3JsICVyNSxLICovCiAJCUVNSVQ0X0RJU1AoMHg4ODUwMDAwMCwgSyk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQUxVX05FRzogLyogQSA9IC1BICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX05FRzogLyogQSA9IC1BICovCiAJCS8qIGxuciAlcjUsJXI1ICovCiAJCUVNSVQyKDB4MTE1NSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfSk1QX0pBOiAvKiBpcCArPSBLICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pBOiAvKiBpcCArPSBLICovCiAJCW9mZnNldCA9IGFkZHJzW2kgKyBLXSArIGppdC0+c3RhcnQgLSBqaXQtPnByZzsKIAkJRU1JVDRfUENSRUwoMHhhN2Y0MDAwMCwgb2Zmc2V0KTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19KTVBfSkdUX0s6IC8qIGlwICs9IChBID4gSykgPyBqdCA6IGpmICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9LOiAvKiBpcCArPSAoQSA+IEspID8ganQgOiBqZiAqLwogCQltYXNrID0gMHgyMDAwMDA7IC8qIGpoICovCiAJCWdvdG8ga2JyYW5jaDsKLQljYXNlIEJQRl9TX0pNUF9KR0VfSzogLyogaXAgKz0gKEEgPj0gSykgPyBqdCA6IGpmICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LOiAvKiBpcCArPSAoQSA+PSBLKSA/IGp0IDogamYgKi8KIAkJbWFzayA9IDB4YTAwMDAwOyAvKiBqaGUgKi8KIAkJZ290byBrYnJhbmNoOwotCWNhc2UgQlBGX1NfSk1QX0pFUV9LOiAvKiBpcCArPSAoQSA9PSBLKSA/IGp0IDogamYgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6IC8qIGlwICs9IChBID09IEspID8ganQgOiBqZiAqLwogCQltYXNrID0gMHg4MDAwMDA7IC8qIGplICovCiBrYnJhbmNoOgkvKiBFbWl0IGNvbXBhcmUgaWYgdGhlIGJyYW5jaCB0YXJnZXRzIGFyZSBkaWZmZXJlbnQgKi8KIAkJaWYgKGZpbHRlci0+anQgIT0gZmlsdGVyLT5qZikgewpAQCAtNTExLDcgKzUwNCw3IEBACiAJCQlFTUlUNF9QQ1JFTCgweGE3MDQwMDAwIHwgKG1hc2sgXiAweGYwMDAwMCksIG9mZnNldCk7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19KTVBfSlNFVF9LOiAvKiBpcCArPSAoQSAmIEspID8ganQgOiBqZiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0s6IC8qIGlwICs9IChBICYgSykgPyBqdCA6IGpmICovCiAJCW1hc2sgPSAweDcwMDAwMDsgLyogam56ICovCiAJCS8qIEVtaXQgdGVzdCBpZiB0aGUgYnJhbmNoIHRhcmdldHMgYXJlIGRpZmZlcmVudCAqLwogCQlpZiAoZmlsdGVyLT5qdCAhPSBmaWx0ZXItPmpmKSB7CkBAIC01MjUsMTMgKzUxOCwxMyBAQAogCQkJCUVNSVQ0X0lNTSgweGE3NTEwMDAwLCBLKTsKIAkJfQogCQlnb3RvIGJyYW5jaDsKLQljYXNlIEJQRl9TX0pNUF9KR1RfWDogLyogaXAgKz0gKEEgPiBYKSA/IGp0IDogamYgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6IC8qIGlwICs9IChBID4gWCkgPyBqdCA6IGpmICovCiAJCW1hc2sgPSAweDIwMDAwMDsgLyogamggKi8KIAkJZ290byB4YnJhbmNoOwotCWNhc2UgQlBGX1NfSk1QX0pHRV9YOiAvKiBpcCArPSAoQSA+PSBYKSA/IGp0IDogamYgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1g6IC8qIGlwICs9IChBID49IFgpID8ganQgOiBqZiAqLwogCQltYXNrID0gMHhhMDAwMDA7IC8qIGpoZSAqLwogCQlnb3RvIHhicmFuY2g7Ci0JY2FzZSBCUEZfU19KTVBfSkVRX1g6IC8qIGlwICs9IChBID09IFgpID8ganQgOiBqZiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWDogLyogaXAgKz0gKEEgPT0gWCkgPyBqdCA6IGpmICovCiAJCW1hc2sgPSAweDgwMDAwMDsgLyogamUgKi8KIHhicmFuY2g6CS8qIEVtaXQgY29tcGFyZSBpZiB0aGUgYnJhbmNoIHRhcmdldHMgYXJlIGRpZmZlcmVudCAqLwogCQlpZiAoZmlsdGVyLT5qdCAhPSBmaWx0ZXItPmpmKSB7CkBAIC01NDAsNyArNTMzLDcgQEAKIAkJCUVNSVQyKDB4MTk1Yyk7CiAJCX0KIAkJZ290byBicmFuY2g7Ci0JY2FzZSBCUEZfU19KTVBfSlNFVF9YOiAvKiBpcCArPSAoQSAmIFgpID8ganQgOiBqZiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6IC8qIGlwICs9IChBICYgWCkgPyBqdCA6IGpmICovCiAJCW1hc2sgPSAweDcwMDAwMDsgLyogam56ICovCiAJCS8qIEVtaXQgdGVzdCBpZiB0aGUgYnJhbmNoIHRhcmdldHMgYXJlIGRpZmZlcmVudCAqLwogCQlpZiAoZmlsdGVyLT5qdCAhPSBmaWx0ZXItPmpmKSB7CkBAIC01NTEsMTUgKzU0NCwxNSBAQAogCQkJRU1JVDIoMHgxNDRjKTsKIAkJfQogCQlnb3RvIGJyYW5jaDsKLQljYXNlIEJQRl9TX0xEX1dfQUJTOiAvKiBBID0gKih1MzIgKikgKHNrYi0+ZGF0YStLKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTOiAvKiBBID0gKih1MzIgKikgKHNrYi0+ZGF0YStLKSAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9EQVRBUkVGIHwgU0VFTl9SRVQwIHwgU0VFTl9MT0FEX1dPUkQ7CiAJCW9mZnNldCA9IGppdC0+b2ZmX2xvYWRfd29yZDsKIAkJZ290byBsb2FkX2FiczsKLQljYXNlIEJQRl9TX0xEX0hfQUJTOiAvKiBBID0gKih1MTYgKikgKHNrYi0+ZGF0YStLKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTOiAvKiBBID0gKih1MTYgKikgKHNrYi0+ZGF0YStLKSAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9EQVRBUkVGIHwgU0VFTl9SRVQwIHwgU0VFTl9MT0FEX0hBTEY7CiAJCW9mZnNldCA9IGppdC0+b2ZmX2xvYWRfaGFsZjsKIAkJZ290byBsb2FkX2FiczsKLQljYXNlIEJQRl9TX0xEX0JfQUJTOiAvKiBBID0gKih1OCAqKSAoc2tiLT5kYXRhK0spICovCisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6IC8qIEEgPSAqKHU4ICopIChza2ItPmRhdGErSykgKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fREFUQVJFRiB8IFNFRU5fUkVUMCB8IFNFRU5fTE9BRF9CWVRFOwogCQlvZmZzZXQgPSBqaXQtPm9mZl9sb2FkX2J5dGU7CiBsb2FkX2FiczoJaWYgKChpbnQpIEsgPCAwKQpAQCAtNTczLDE5ICs1NjYsMTkgQEAKIAkJLyogam56IDxyZXQwPiAqLwogCQlFTUlUNF9QQ1JFTCgweGE3NzQwMDAwLCAoaml0LT5yZXQwX2lwIC0gaml0LT5wcmcpKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19MRF9XX0lORDogLyogQSA9ICoodTMyICopIChza2ItPmRhdGErSytYKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfSU5EOiAvKiBBID0gKih1MzIgKikgKHNrYi0+ZGF0YStLK1gpICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX0RBVEFSRUYgfCBTRUVOX1JFVDAgfCBTRUVOX0xPQURfSVdPUkQ7CiAJCW9mZnNldCA9IGppdC0+b2ZmX2xvYWRfaXdvcmQ7CiAJCWdvdG8gY2FsbF9mbjsKLQljYXNlIEJQRl9TX0xEX0hfSU5EOiAvKiBBID0gKih1MTYgKikgKHNrYi0+ZGF0YStLK1gpICovCisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9JTkQ6IC8qIEEgPSAqKHUxNiAqKSAoc2tiLT5kYXRhK0srWCkgKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fREFUQVJFRiB8IFNFRU5fUkVUMCB8IFNFRU5fTE9BRF9JSEFMRjsKIAkJb2Zmc2V0ID0gaml0LT5vZmZfbG9hZF9paGFsZjsKIAkJZ290byBjYWxsX2ZuOwotCWNhc2UgQlBGX1NfTERfQl9JTkQ6IC8qIEEgPSAqKHU4ICopIChza2ItPmRhdGErSytYKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX0IgfCBCUEZfSU5EOiAvKiBBID0gKih1OCAqKSAoc2tiLT5kYXRhK0srWCkgKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fREFUQVJFRiB8IFNFRU5fUkVUMCB8IFNFRU5fTE9BRF9JQllURTsKIAkJb2Zmc2V0ID0gaml0LT5vZmZfbG9hZF9pYnl0ZTsKIAkJZ290byBjYWxsX2ZuOwotCWNhc2UgQlBGX1NfTERYX0JfTVNIOgorCWNhc2UgQlBGX0xEWCB8IEJQRl9CIHwgQlBGX01TSDoKIAkJLyogWCA9ICgqKHU4ICopKHNrYi0+ZGF0YStLKSAmIDB4ZikgPDwgMiAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9SRVQwOwogCQlpZiAoKGludCkgSyA8IDApIHsKQEAgLTU5NiwxNyArNTg5LDE3IEBACiAJCWppdC0+c2VlbiB8PSBTRUVOX0RBVEFSRUYgfCBTRUVOX0xPQURfQk1TSDsKIAkJb2Zmc2V0ID0gaml0LT5vZmZfbG9hZF9ibXNoOwogCQlnb3RvIGNhbGxfZm47Ci0JY2FzZSBCUEZfU19MRF9XX0xFTjogLyoJQSA9IHNrYi0+bGVuOyAqLworCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfTEVOOiAvKglBID0gc2tiLT5sZW47ICovCiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGxlbikgIT0gNCk7CiAJCS8qIGwgJXI1LDxkKGxlbik+KCVyMikgKi8KIAkJRU1JVDRfRElTUCgweDU4NTAyMDAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfTERYX1dfTEVOOiAvKiBYID0gc2tiLT5sZW47ICovCisJY2FzZSBCUEZfTERYIHwgQlBGX1cgfCBCUEZfTEVOOiAvKiBYID0gc2tiLT5sZW47ICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCS8qIGwgJXIxMiw8ZChsZW4pPiglcjIpICovCiAJCUVNSVQ0X0RJU1AoMHg1OGMwMjAwMCwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0xEX0lNTTogLyogQSA9IEsgKi8KKwljYXNlIEJQRl9MRCB8IEJQRl9JTU06IC8qIEEgPSBLICovCiAJCWlmIChLIDw9IDE2MzgzKQogCQkJLyogbGhpICVyNSxLICovCiAJCQlFTUlUNF9JTU0oMHhhNzU4MDAwMCwgSyk7CkBAIC02MTcsNyArNjEwLDcgQEAKIAkJCS8qIGwgJXI1LDxkKEspPiglcjEzKSAqLwogCQkJRU1JVDRfRElTUCgweDU4NTBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19MRFhfSU1NOiAvKiBYID0gSyAqLworCWNhc2UgQlBGX0xEWCB8IEJQRl9JTU06IC8qIFggPSBLICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCWlmIChLIDw9IDE2MzgzKQogCQkJLyogbGhpICVyMTIsPEs+ICovCkBAIC02MjksMjkgKzYyMiwyOSBAQAogCQkJLyogbCAlcjEyLDxkKEspPiglcjEzKSAqLwogCQkJRU1JVDRfRElTUCgweDU4YzBkMDAwLCBFTUlUX0NPTlNUKEspKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19MRF9NRU06IC8qIEEgPSBtZW1bS10gKi8KKwljYXNlIEJQRl9MRCB8IEJQRl9NRU06IC8qIEEgPSBtZW1bS10gKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fTUVNOwogCQkvKiBsICVyNSw8Sz4oJXIxNSkgKi8KIAkJRU1JVDRfRElTUCgweDU4NTBmMDAwLAogCQkJICAgKGppdC0+c2VlbiAmIFNFRU5fREFUQVJFRikgPyAxNjAgKyBLKjQgOiBLKjQpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0xEWF9NRU06IC8qIFggPSBtZW1bS10gKi8KKwljYXNlIEJQRl9MRFggfCBCUEZfTUVNOiAvKiBYID0gbWVtW0tdICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUcgfCBTRUVOX01FTTsKIAkJLyogbCAlcjEyLDxLPiglcjE1KSAqLwogCQlFTUlUNF9ESVNQKDB4NThjMGYwMDAsCiAJCQkgICAoaml0LT5zZWVuICYgU0VFTl9EQVRBUkVGKSA/IDE2MCArIEsqNCA6IEsqNCk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfTUlTQ19UQVg6IC8qIFggPSBBICovCisJY2FzZSBCUEZfTUlTQyB8IEJQRl9UQVg6IC8qIFggPSBBICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCS8qIGxyICVyMTIsJXI1ICovCiAJCUVNSVQyKDB4MThjNSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfTUlTQ19UWEE6IC8qIEEgPSBYICovCisJY2FzZSBCUEZfTUlTQyB8IEJQRl9UWEE6IC8qIEEgPSBYICovCiAJCWppdC0+c2VlbiB8PSBTRUVOX1hSRUc7CiAJCS8qIGxyICVyNSwlcjEyICovCiAJCUVNSVQyKDB4MTg1Yyk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfUkVUX0s6CisJY2FzZSBCUEZfUkVUIHwgQlBGX0s6CiAJCWlmIChLID09IDApIHsKIAkJCWppdC0+c2VlbiB8PSBTRUVOX1JFVDA7CiAJCQlpZiAobGFzdCkKQEAgLTY3MSwzMyArNjY0LDMzIEBACiAJCQlFTUlUNF9QQ1JFTCgweGE3ZjQwMDAwLCBqaXQtPmV4aXRfaXAgLSBqaXQtPnByZyk7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19SRVRfQToKKwljYXNlIEJQRl9SRVQgfCBCUEZfQToKIAkJLyogbGxnZnIgJXIyLCVyNSAqLwogCQlFTUlUNCgweGI5MTYwMDI1KTsKIAkJLyogaiA8ZXhpdD4gKi8KIAkJRU1JVDRfUENSRUwoMHhhN2Y0MDAwMCwgaml0LT5leGl0X2lwIC0gaml0LT5wcmcpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX1NUOiAvKiBtZW1bS10gPSBBICovCisJY2FzZSBCUEZfU1Q6IC8qIG1lbVtLXSA9IEEgKi8KIAkJaml0LT5zZWVuIHw9IFNFRU5fTUVNOwogCQkvKiBzdCAlcjUsPEs+KCVyMTUpICovCiAJCUVNSVQ0X0RJU1AoMHg1MDUwZjAwMCwKIAkJCSAgIChqaXQtPnNlZW4gJiBTRUVOX0RBVEFSRUYpID8gMTYwICsgSyo0IDogSyo0KTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19TVFg6IC8qIG1lbVtLXSA9IFggOiBtb3YgJWVieCxvZmY4KCVyYnApICovCisJY2FzZSBCUEZfU1RYOiAvKiBtZW1bS10gPSBYIDogbW92ICVlYngsb2ZmOCglcmJwKSAqLwogCQlqaXQtPnNlZW4gfD0gU0VFTl9YUkVHIHwgU0VFTl9NRU07CiAJCS8qIHN0ICVyMTIsPEs+KCVyMTUpICovCiAJCUVNSVQ0X0RJU1AoMHg1MGMwZjAwMCwKIAkJCSAgIChqaXQtPnNlZW4gJiBTRUVOX0RBVEFSRUYpID8gMTYwICsgSyo0IDogSyo0KTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6IC8qIEEgPSBudG9ocyhza2ItPnByb3RvY29sKTsgKi8KKwljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUFJPVE9DT0w6IC8qIEEgPSBudG9ocyhza2ItPnByb3RvY29sKTsgKi8KIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpICE9IDIpOwogCQkvKiBsaGkgJXI1LDAgKi8KIAkJRU1JVDQoMHhhNzU4MDAwMCk7CiAJCS8qIGljbQklcjUsMyw8ZChwcm90b2NvbCk+KCVyMikgKi8KIAkJRU1JVDRfRElTUCgweGJmNTMyMDAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpKTsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTkNfSUZJTkRFWDoJLyogaWYgKCFza2ItPmRldikgcmV0dXJuIDA7Ci0JCQkJICogQSA9IHNrYi0+ZGV2LT5pZmluZGV4ICovCisJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0lGSU5ERVg6CS8qIGlmICghc2tiLT5kZXYpIHJldHVybiAwOworCQkJCQkgKiBBID0gc2tiLT5kZXYtPmlmaW5kZXggKi8KIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7CiAJCWppdC0+c2VlbiB8PSBTRUVOX1JFVDA7CiAJCS8qIGxnICVyMSw8ZChkZXYpPiglcjIpICovCkBAIC03MDksMjAgKzcwMiwyMCBAQAogCQkvKiBsICVyNSw8ZChpZmluZGV4KT4oJXIxKSAqLwogCQlFTUlUNF9ESVNQKDB4NTg1MDEwMDAsIG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQU5DX01BUks6IC8qIEEgPSBza2ItPm1hcmsgKi8KKwljYXNlIEJQRl9BTkMgfCBTS0ZfQURfTUFSSzogLyogQSA9IHNrYi0+bWFyayAqLwogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBtYXJrKSAhPSA0KTsKIAkJLyogbCAlcjUsPGQobWFyayk+KCVyMikgKi8KIAkJRU1JVDRfRElTUCgweDU4NTAyMDAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FOQ19RVUVVRTogLyogQSA9IHNrYi0+cXVldWVfbWFwcGluZyAqLworCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9RVUVVRTogLyogQSA9IHNrYi0+cXVldWVfbWFwcGluZyAqLwogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5nKSAhPSAyKTsKIAkJLyogbGhpICVyNSwwICovCiAJCUVNSVQ0KDB4YTc1ODAwMDApOwogCQkvKiBpY20JJXI1LDMsPGQocXVldWVfbWFwcGluZyk+KCVyMikgKi8KIAkJRU1JVDRfRElTUCgweGJmNTMyMDAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcXVldWVfbWFwcGluZykpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FOQ19IQVRZUEU6CS8qIGlmICghc2tiLT5kZXYpIHJldHVybiAwOwotCQkJCSAqIEEgPSBza2ItPmRldi0+dHlwZSAqLworCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9IQVRZUEU6CS8qIGlmICghc2tiLT5kZXYpIHJldHVybiAwOworCQkJCQkgKiBBID0gc2tiLT5kZXYtPnR5cGUgKi8KIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgdHlwZSkgIT0gMik7CiAJCWppdC0+c2VlbiB8PSBTRUVOX1JFVDA7CiAJCS8qIGxnICVyMSw8ZChkZXYpPiglcjIpICovCkBAIC03MzYsMjAgKzcyOSwyMCBAQAogCQkvKiBpY20JJXI1LDMsPGQodHlwZSk+KCVyMSkgKi8KIAkJRU1JVDRfRElTUCgweGJmNTMxMDAwLCBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgdHlwZSkpOwogCQlicmVhazsKLQljYXNlIEJQRl9TX0FOQ19SWEhBU0g6IC8qIEEgPSBza2ItPmhhc2ggKi8KKwljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUlhIQVNIOiAvKiBBID0gc2tiLT5oYXNoICovCiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpICE9IDQpOwogCQkvKiBsICVyNSw8ZChoYXNoKT4oJXIyKSAqLwogCQlFTUlUNF9ESVNQKDB4NTg1MDIwMDAsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBoYXNoKSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHOgotCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHX1BSRVNFTlQ6CisJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHOgorCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UOgogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkgIT0gMik7CiAJCUJVSUxEX0JVR19PTihWTEFOX1RBR19QUkVTRU5UICE9IDB4MTAwMCk7CiAJCS8qIGxoaSAlcjUsMCAqLwogCQlFTUlUNCgweGE3NTgwMDAwKTsKIAkJLyogaWNtCSVyNSwzLDxkKHZsYW5fdGNpKT4oJXIyKSAqLwogCQlFTUlUNF9ESVNQKDB4YmY1MzIwMDAsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkpOwotCQlpZiAoZmlsdGVyLT5jb2RlID09IEJQRl9TX0FOQ19WTEFOX1RBRykgeworCQlpZiAoY29kZSA9PSAoQlBGX0FOQyB8IFNLRl9BRF9WTEFOX1RBRykpIHsKIAkJCS8qIG5pbGwgJXI1LDB4ZWZmZiAqLwogCQkJRU1JVDRfSU1NKDB4YTU1NzAwMDAsIH5WTEFOX1RBR19QUkVTRU5UKTsKIAkJfSBlbHNlIHsKQEAgLTc1OSw3ICs3NTIsNyBAQAogCQkJRU1JVDRfRElTUCgweDg4NTAwMDAwLCAxMik7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBCUEZfU19BTkNfUEtUVFlQRToKKwljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUEtUVFlQRToKIAkJaWYgKHBrdF90eXBlX29mZnNldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJLyogbGhpICVyNSwwICovCkBAIC03NjksNyArNzYyLDcgQEAKIAkJLyogc3JsICVyNSw1ICovCiAJCUVNSVQ0X0RJU1AoMHg4ODUwMDAwMCwgNSk7CiAJCWJyZWFrOwotCWNhc2UgQlBGX1NfQU5DX0NQVTogLyogQSA9IHNtcF9wcm9jZXNzb3JfaWQoKSAqLworCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9DUFU6IC8qIEEgPSBzbXBfcHJvY2Vzc29yX2lkKCkgKi8KICNpZmRlZiBDT05GSUdfU01QCiAJCS8qIGwgJXI1LDxkKGNwdV9ucik+ICovCiAJCUVNSVQ0X0RJU1AoMHg1ODUwMDAwMCwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBjcHVfbnIpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY2hlY2tzdW1fMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY2hlY2tzdW1fMzIuaAppbmRleCBiZGJkYTE0Li4wNDQ3MWRjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2NoZWNrc3VtXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9jaGVja3N1bV8zMi5oCkBAIC0yMzgsNCArMjM4LDE2IEBACiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKKyNkZWZpbmUgSEFWRV9BUkNIX0NTVU1fQURECitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX2FkZChfX3dzdW0gY3N1bSwgX193c3VtIGFkZGVuZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJImFkZGNjICAgJTAsICUxLCAlMFxuIgorCQkiYWRkeCAgICAlMCwgJSVnMCwgJTAiCisJCTogIj1yIiAoY3N1bSkKKwkJOiAiciIgKGFkZGVuZCksICIwIiAoY3N1bSkpOworCisJcmV0dXJuIGNzdW07Cit9CisKICNlbmRpZiAvKiAhKF9fU1BBUkNfQ0hFQ0tTVU1fSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY2hlY2tzdW1fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY2hlY2tzdW1fNjQuaAppbmRleCAwMTliOTYxLi4yZmY4MWFlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2NoZWNrc3VtXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9jaGVja3N1bV82NC5oCkBAIC0xNjQsNCArMTY0LDE2IEBACiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKKyNkZWZpbmUgSEFWRV9BUkNIX0NTVU1fQURECitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX2FkZChfX3dzdW0gY3N1bSwgX193c3VtIGFkZGVuZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJImFkZGNjICAgJTAsICUxLCAlMFxuIgorCQkiYWRkeCAgICAlMCwgJSVnMCwgJTAiCisJCTogIj1yIiAoY3N1bSkKKwkJOiAiciIgKGFkZGVuZCksICIwIiAoY3N1bSkpOworCisJcmV0dXJuIGNzdW07Cit9CisKICNlbmRpZiAvKiAhKF9fU1BBUkM2NF9DSEVDS1NVTV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9uZXQvYnBmX2ppdF9jb21wLmMgYi9hcmNoL3NwYXJjL25ldC9icGZfaml0X2NvbXAuYwppbmRleCBhODJjNmIyLi44OTJhMTAyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL25ldC9icGZfaml0X2NvbXAuYworKysgYi9hcmNoL3NwYXJjL25ldC9icGZfaml0X2NvbXAuYwpAQCAtODMsOSArODMsOSBAQAogI2RlZmluZSBCTkUJCShGMigwLCAyKSB8IENPTkRORSkKIAogI2lmZGVmIENPTkZJR19TUEFSQzY0Ci0jZGVmaW5lIEJORV9QVFIJCShGMigwLCAxKSB8IENPTkRORSB8ICgyIDw8IDIwKSkKKyNkZWZpbmUgQkVfUFRSCQkoRjIoMCwgMSkgfCBDT05ERSB8ICgyIDw8IDIwKSkKICNlbHNlCi0jZGVmaW5lIEJORV9QVFIJCUJORQorI2RlZmluZSBCRV9QVFIJCUJFCiAjZW5kaWYKIAogI2RlZmluZSBTRVRISShLLCBSRUcpCVwKQEAgLTQxNSwyMCArNDE1LDExIEBACiAJCWVtaXRfcmVnX21vdmUoTzcsIHJfc2F2ZWRfTzcpOwogCiAJCXN3aXRjaCAoZmlsdGVyWzBdLmNvZGUpIHsKLQkJY2FzZSBCUEZfU19SRVRfSzoKLQkJY2FzZSBCUEZfU19MRF9XX0xFTjoKLQkJY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6Ci0JCWNhc2UgQlBGX1NfQU5DX1BLVFRZUEU6Ci0JCWNhc2UgQlBGX1NfQU5DX0lGSU5ERVg6Ci0JCWNhc2UgQlBGX1NfQU5DX01BUks6Ci0JCWNhc2UgQlBGX1NfQU5DX1JYSEFTSDoKLQkJY2FzZSBCUEZfU19BTkNfVkxBTl9UQUc6Ci0JCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHX1BSRVNFTlQ6Ci0JCWNhc2UgQlBGX1NfQU5DX0NQVToKLQkJY2FzZSBCUEZfU19BTkNfUVVFVUU6Ci0JCWNhc2UgQlBGX1NfTERfV19BQlM6Ci0JCWNhc2UgQlBGX1NfTERfSF9BQlM6Ci0JCWNhc2UgQlBGX1NfTERfQl9BQlM6CisJCWNhc2UgQlBGX1JFVCB8IEJQRl9LOgorCQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0xFTjoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTOgorCQljYXNlIEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUzoKIAkJCS8qIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBzZXRzIHRoZSBBIHJlZ2lzdGVyIChvciBpcwogCQkJICogYSAiUkVUICdjb25zdGFudCciKQogCQkJICovCkBAIC00NDUsNTkgKzQzNiw2MCBAQAogCQkJdW5zaWduZWQgaW50IHRfb2Zmc2V0OwogCQkJdW5zaWduZWQgaW50IGZfb2Zmc2V0OwogCQkJdTMyIHRfb3AsIGZfb3A7CisJCQl1MTYgY29kZSA9IGJwZl9hbmNfaGVscGVyKCZmaWx0ZXJbaV0pOwogCQkJaW50IGlsZW47CiAKLQkJCXN3aXRjaCAoZmlsdGVyW2ldLmNvZGUpIHsKLQkJCWNhc2UgQlBGX1NfQUxVX0FERF9YOgkvKiBBICs9IFg7ICovCisJCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWDoJLyogQSArPSBYOyAqLwogCQkJCWVtaXRfYWx1X1goQUREKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX0FERF9LOgkvKiBBICs9IEs7ICovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0s6CS8qIEEgKz0gSzsgKi8KIAkJCQllbWl0X2FsdV9LKEFERCwgSyk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9TVUJfWDoJLyogQSAtPSBYOyAqLworCQkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgkvKiBBIC09IFg7ICovCiAJCQkJZW1pdF9hbHVfWChTVUIpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfU1VCX0s6CS8qIEEgLT0gSyAqLworCQkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOgkvKiBBIC09IEsgKi8KIAkJCQllbWl0X2FsdV9LKFNVQiwgSyk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9BTkRfWDoJLyogQSAmPSBYICovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX1g6CS8qIEEgJj0gWCAqLwogCQkJCWVtaXRfYWx1X1goQU5EKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX0FORF9LOgkvKiBBICY9IEsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSzoJLyogQSAmPSBLICovCiAJCQkJZW1pdF9hbHVfSyhBTkQsIEspOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfT1JfWDoJLyogQSB8PSBYICovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfWDoJLyogQSB8PSBYICovCiAJCQkJZW1pdF9hbHVfWChPUik7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9PUl9LOgkvKiBBIHw9IEsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgkvKiBBIHw9IEsgKi8KIAkJCQllbWl0X2FsdV9LKE9SLCBLKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQU5DX0FMVV9YT1JfWDogLyogQSBePSBYOyAqLwotCQkJY2FzZSBCUEZfU19BTFVfWE9SX1g6CisJCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfQUxVX1hPUl9YOiAvKiBBIF49IFg7ICovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1g6CiAJCQkJZW1pdF9hbHVfWChYT1IpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfWE9SX0s6CS8qIEEgXj0gSyAqLworCQkJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOgkvKiBBIF49IEsgKi8KIAkJCQllbWl0X2FsdV9LKFhPUiwgSyk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9MU0hfWDoJLyogQSA8PD0gWCAqLworCQkJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9YOgkvKiBBIDw8PSBYICovCiAJCQkJZW1pdF9hbHVfWChTTEwpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfTFNIX0s6CS8qIEEgPDw9IEsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfSzoJLyogQSA8PD0gSyAqLwogCQkJCWVtaXRfYWx1X0soU0xMLCBLKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX1JTSF9YOgkvKiBBID4+PSBYICovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1g6CS8qIEEgPj49IFggKi8KIAkJCQllbWl0X2FsdV9YKFNSTCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9SU0hfSzoJLyogQSA+Pj0gSyAqLworCQkJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LOgkvKiBBID4+PSBLICovCiAJCQkJZW1pdF9hbHVfSyhTUkwsIEspOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfTVVMX1g6CS8qIEEgKj0gWDsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfWDoJLyogQSAqPSBYOyAqLwogCQkJCWVtaXRfYWx1X1goTVVMKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX01VTF9LOgkvKiBBICo9IEsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSzoJLyogQSAqPSBLICovCiAJCQkJZW1pdF9hbHVfSyhNVUwsIEspOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfRElWX0s6CS8qIEEgLz0gSyB3aXRoIEsgIT0gMCovCisJCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX0s6CS8qIEEgLz0gSyB3aXRoIEsgIT0gMCovCiAJCQkJaWYgKEsgPT0gMSkKIAkJCQkJYnJlYWs7CiAJCQkJZW1pdF93cml0ZV95KEcwKTsKQEAgLTUxMiw3ICs1MDQsNyBAQAogI2VuZGlmCiAJCQkJZW1pdF9hbHVfSyhESVYsIEspOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfRElWX1g6CS8qIEEgLz0gWDsgKi8KKwkJCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfWDoJLyogQSAvPSBYOyAqLwogCQkJCWVtaXRfY21waShyX1gsIDApOwogCQkJCWlmIChwY19yZXQwID4gMCkgewogCQkJCQl0X29mZnNldCA9IGFkZHJzW3BjX3JldDAgLSAxXTsKQEAgLTU0NCwxMCArNTM2LDEwIEBACiAjZW5kaWYKIAkJCQllbWl0X2FsdV9YKERJVik7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9ORUc6CisJCQljYXNlIEJQRl9BTFUgfCBCUEZfTkVHOgogCQkJCWVtaXRfbmVnKCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX1JFVF9LOgorCQkJY2FzZSBCUEZfUkVUIHwgQlBGX0s6CiAJCQkJaWYgKCFLKSB7CiAJCQkJCWlmIChwY19yZXQwID09IC0xKQogCQkJCQkJcGNfcmV0MCA9IGk7CkBAIC01NTYsNyArNTQ4LDcgQEAKIAkJCQkJZW1pdF9sb2FkaW1tKEssIHJfQSk7CiAJCQkJfQogCQkJCS8qIEZhbGx0aHJvdWdoICovCi0JCQljYXNlIEJQRl9TX1JFVF9BOgorCQkJY2FzZSBCUEZfUkVUIHwgQlBGX0E6CiAJCQkJaWYgKHNlZW5fb3JfcGFzczApIHsKIAkJCQkJaWYgKGkgIT0gZmxlbiAtIDEpIHsKIAkJCQkJCWVtaXRfanVtcChjbGVhbnVwX2FkZHIpOwpAQCAtNTczLDE4ICs1NjUsMTggQEAKIAkJCQllbWl0X2ptcGwocl9zYXZlZF9PNywgOCwgRzApOwogCQkJCWVtaXRfcmVnX21vdmUocl9BLCBPMCk7IC8qIGRlbGF5IHNsb3QgKi8KIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTUlTQ19UQVg6CisJCQljYXNlIEJQRl9NSVNDIHwgQlBGX1RBWDoKIAkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKIAkJCQllbWl0X3JlZ19tb3ZlKHJfQSwgcl9YKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTUlTQ19UWEE6CisJCQljYXNlIEJQRl9NSVNDIHwgQlBGX1RYQToKIAkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKIAkJCQllbWl0X3JlZ19tb3ZlKHJfWCwgcl9BKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQU5DX0NQVToKKwkJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9DUFU6CiAJCQkJZW1pdF9sb2FkX2NwdShyX0EpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6CisJCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUFJPVE9DT0w6CiAJCQkJZW1pdF9za2JfbG9hZDE2KHByb3RvY29sLCByX0EpOwogCQkJCWJyZWFrOwogI2lmIDAKQEAgLTU5MiwzOCArNTg0LDM4IEBACiAJCQkJICogYSBiaXQgZmllbGQgZXZlbiB0aG91Z2ggd2UgdmVyeSBtdWNoCiAJCQkJICoga25vdyB3aGF0IHdlIGFyZSBkb2luZyBoZXJlLgogCQkJCSAqLwotCQkJY2FzZSBCUEZfU19BTkNfUEtUVFlQRToKKwkJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9QS1RUWVBFOgogCQkJCV9fZW1pdF9za2JfbG9hZDgocGt0X3R5cGUsIHJfQSk7CiAJCQkJZW1pdF9hbHVfSyhTUkwsIDUpOwogCQkJCWJyZWFrOwogI2VuZGlmCi0JCQljYXNlIEJQRl9TX0FOQ19JRklOREVYOgorCQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0lGSU5ERVg6CiAJCQkJZW1pdF9za2JfbG9hZHB0cihkZXYsIHJfQSk7CiAJCQkJZW1pdF9jbXBpKHJfQSwgMCk7Ci0JCQkJZW1pdF9icmFuY2goQk5FX1BUUiwgY2xlYW51cF9hZGRyICsgNCk7CisJCQkJZW1pdF9icmFuY2goQkVfUFRSLCBjbGVhbnVwX2FkZHIgKyA0KTsKIAkJCQllbWl0X25vcCgpOwogCQkJCWVtaXRfbG9hZDMyKHJfQSwgc3RydWN0IG5ldF9kZXZpY2UsIGlmaW5kZXgsIHJfQSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FOQ19NQVJLOgorCQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX01BUks6CiAJCQkJZW1pdF9za2JfbG9hZDMyKG1hcmssIHJfQSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FOQ19RVUVVRToKKwkJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9RVUVVRToKIAkJCQllbWl0X3NrYl9sb2FkMTYocXVldWVfbWFwcGluZywgcl9BKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQU5DX0hBVFlQRToKKwkJCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9IQVRZUEU6CiAJCQkJZW1pdF9za2JfbG9hZHB0cihkZXYsIHJfQSk7CiAJCQkJZW1pdF9jbXBpKHJfQSwgMCk7Ci0JCQkJZW1pdF9icmFuY2goQk5FX1BUUiwgY2xlYW51cF9hZGRyICsgNCk7CisJCQkJZW1pdF9icmFuY2goQkVfUFRSLCBjbGVhbnVwX2FkZHIgKyA0KTsKIAkJCQllbWl0X25vcCgpOwogCQkJCWVtaXRfbG9hZDE2KHJfQSwgc3RydWN0IG5ldF9kZXZpY2UsIHR5cGUsIHJfQSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FOQ19SWEhBU0g6CisJCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUlhIQVNIOgogCQkJCWVtaXRfc2tiX2xvYWQzMihoYXNoLCByX0EpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfVkxBTl9UQUc6Ci0JCQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBR19QUkVTRU5UOgorCQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHOgorCQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQ6CiAJCQkJZW1pdF9za2JfbG9hZDE2KHZsYW5fdGNpLCByX0EpOwotCQkJCWlmIChmaWx0ZXJbaV0uY29kZSA9PSBCUEZfU19BTkNfVkxBTl9UQUcpIHsKKwkJCQlpZiAoY29kZSA9PSAoQlBGX0FOQyB8IFNLRl9BRF9WTEFOX1RBRykpIHsKIAkJCQkJZW1pdF9hbmRpKHJfQSwgVkxBTl9WSURfTUFTSywgcl9BKTsKIAkJCQl9IGVsc2UgewogCQkJCQllbWl0X2xvYWRpbW0oVkxBTl9UQUdfUFJFU0VOVCwgcl9UTVApOwpAQCAtNjMxLDQ0ICs2MjMsNDQgQEAKIAkJCQl9CiAJCQkJYnJlYWs7CiAKLQkJCWNhc2UgQlBGX1NfTERfSU1NOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfSU1NOgogCQkJCWVtaXRfbG9hZGltbShLLCByX0EpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19MRFhfSU1NOgorCQkJY2FzZSBCUEZfTERYIHwgQlBGX0lNTToKIAkJCQllbWl0X2xvYWRpbW0oSywgcl9YKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTERfTUVNOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfTUVNOgogCQkJCWVtaXRfbGRtZW0oSyAqIDQsIHJfQSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEWF9NRU06CisJCQljYXNlIEJQRl9MRFggfCBCUEZfTUVNOgogCQkJCWVtaXRfbGRtZW0oSyAqIDQsIHJfWCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX1NUOgorCQkJY2FzZSBCUEZfU1Q6CiAJCQkJZW1pdF9zdG1lbShLICogNCwgcl9BKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfU1RYOgorCQkJY2FzZSBCUEZfU1RYOgogCQkJCWVtaXRfc3RtZW0oSyAqIDQsIHJfWCk7CiAJCQkJYnJlYWs7CiAKICNkZWZpbmUgQ0hPT1NFX0xPQURfRlVOQyhLLCBmdW5jKSBcCiAJKChpbnQpSyA8IDAgPyAoKGludClLID49IFNLRl9MTF9PRkYgPyBmdW5jIyNfbmVnYXRpdmVfb2Zmc2V0IDogZnVuYykgOiBmdW5jIyNfcG9zaXRpdmVfb2Zmc2V0KQogCi0JCQljYXNlIEJQRl9TX0xEX1dfQUJTOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CiAJCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgYnBmX2ppdF9sb2FkX3dvcmQpOwogY29tbW9uX2xvYWQ6CQkJc2VlbiB8PSBTRUVOX0RBVEFSRUY7CiAJCQkJZW1pdF9sb2FkaW1tKEssIHJfT0ZGKTsKIAkJCQllbWl0X2NhbGwoZnVuYyk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX0hfQUJTOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CiAJCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgYnBmX2ppdF9sb2FkX2hhbGYpOwogCQkJCWdvdG8gY29tbW9uX2xvYWQ7Ci0JCQljYXNlIEJQRl9TX0xEX0JfQUJTOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CiAJCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgYnBmX2ppdF9sb2FkX2J5dGUpOwogCQkJCWdvdG8gY29tbW9uX2xvYWQ7Ci0JCQljYXNlIEJQRl9TX0xEWF9CX01TSDoKKwkJCWNhc2UgQlBGX0xEWCB8IEJQRl9CIHwgQlBGX01TSDoKIAkJCQlmdW5jID0gQ0hPT1NFX0xPQURfRlVOQyhLLCBicGZfaml0X2xvYWRfYnl0ZV9tc2gpOwogCQkJCWdvdG8gY29tbW9uX2xvYWQ7Ci0JCQljYXNlIEJQRl9TX0xEX1dfSU5EOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9JTkQ6CiAJCQkJZnVuYyA9IGJwZl9qaXRfbG9hZF93b3JkOwogY29tbW9uX2xvYWRfaW5kOgkJc2VlbiB8PSBTRUVOX0RBVEFSRUYgfCBTRUVOX1hSRUc7CiAJCQkJaWYgKEspIHsKQEAgLTY4MywxMyArNjc1LDEzIEBACiAJCQkJfQogCQkJCWVtaXRfY2FsbChmdW5jKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTERfSF9JTkQ6CisJCQljYXNlIEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORDoKIAkJCQlmdW5jID0gYnBmX2ppdF9sb2FkX2hhbGY7CiAJCQkJZ290byBjb21tb25fbG9hZF9pbmQ7Ci0JCQljYXNlIEJQRl9TX0xEX0JfSU5EOgorCQkJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9JTkQ6CiAJCQkJZnVuYyA9IGJwZl9qaXRfbG9hZF9ieXRlOwogCQkJCWdvdG8gY29tbW9uX2xvYWRfaW5kOwotCQkJY2FzZSBCUEZfU19KTVBfSkE6CisJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkE6CiAJCQkJZW1pdF9qdW1wKGFkZHJzW2kgKyBLXSk7CiAJCQkJZW1pdF9ub3AoKTsKIAkJCQlicmVhazsKQEAgLTcwMCwxNCArNjkyLDE0IEBACiAJCWZfb3AgPSBGT1A7CQlcCiAJCWdvdG8gY29uZF9icmFuY2gKIAotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pHVF9LLCBCR1UsIEJMRVUpOwotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pHRV9LLCBCR0VVLCBCTFUpOwotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pFUV9LLCBCRSwgQk5FKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KU0VUX0ssIEJORSwgQkUpOwotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pHVF9YLCBCR1UsIEJMRVUpOwotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pHRV9YLCBCR0VVLCBCTFUpOwotCQkJQ09ORF9TRUwoQlBGX1NfSk1QX0pFUV9YLCBCRSwgQk5FKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KU0VUX1gsIEJORSwgQkUpOworCQkJQ09ORF9TRUwoQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSywgQkdVLCBCTEVVKTsKKwkJCUNPTkRfU0VMKEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0ssIEJHRVUsIEJMVSk7CisJCQlDT05EX1NFTChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCBCRSwgQk5FKTsKKwkJCUNPTkRfU0VMKEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LLCBCTkUsIEJFKTsKKwkJCUNPTkRfU0VMKEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1gsIEJHVSwgQkxFVSk7CisJCQlDT05EX1NFTChCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YLCBCR0VVLCBCTFUpOworCQkJQ09ORF9TRUwoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWCwgQkUsIEJORSk7CisJCQlDT05EX1NFTChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWCwgQk5FLCBCRSk7CiAKIGNvbmRfYnJhbmNoOgkJCWZfb2Zmc2V0ID0gYWRkcnNbaSArIGZpbHRlcltpXS5qZl07CiAJCQkJdF9vZmZzZXQgPSBhZGRyc1tpICsgZmlsdGVyW2ldLmp0XTsKQEAgLTcxOSwyMCArNzExLDIwIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJCXN3aXRjaCAoZmlsdGVyW2ldLmNvZGUpIHsKLQkJCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKLQkJCQljYXNlIEJQRl9TX0pNUF9KR0VfWDoKLQkJCQljYXNlIEJQRl9TX0pNUF9KRVFfWDoKKwkJCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6CisJCQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YOgorCQkJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWDoKIAkJCQkJc2VlbiB8PSBTRUVOX1hSRUc7CiAJCQkJCWVtaXRfY21wKHJfQSwgcl9YKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCUEZfU19KTVBfSlNFVF9YOgorCQkJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6CiAJCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwogCQkJCQllbWl0X2J0c3Qocl9BLCByX1gpOwogCQkJCQlicmVhazsKLQkJCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKLQkJCQljYXNlIEJQRl9TX0pNUF9KR1RfSzoKLQkJCQljYXNlIEJQRl9TX0pNUF9KR0VfSzoKKwkJCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6CisJCQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9LOgorCQkJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSzoKIAkJCQkJaWYgKGlzX3NpbW0xMyhLKSkgewogCQkJCQkJZW1pdF9jbXBpKHJfQSwgSyk7CiAJCQkJCX0gZWxzZSB7CkBAIC03NDAsNyArNzMyLDcgQEAKIAkJCQkJCWVtaXRfY21wKHJfQSwgcl9UTVApOwogCQkJCQl9CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKKwkJCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgogCQkJCQlpZiAoaXNfc2ltbTEzKEspKSB7CiAJCQkJCQllbWl0X2J0c3RpKHJfQSwgSyk7CiAJCQkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCAzNmU2NThhLi5lNGIxYTk2IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTExMSw4ICsxMTEsNyBAQAogS0JVSUxEX0tDT05GSUcgOj0gJChIT1NUX0RJUikvdW0vS2NvbmZpZwogCiBhcmNoaGVhZGVyczoKLQkkKFEpJChNQUtFKSAtQyAnJChzcmN0cmVlKScgS0JVSUxEX1NSQz0gXAotCQlBUkNIPSQoSEVBREVSX0FSQ0gpIE89JyQob2JqdHJlZSknIGFyY2hoZWFkZXJzCisJJChRKSQoTUFLRSkgS0JVSUxEX1NSQz0gQVJDSD0kKEhFQURFUl9BUkNIKSBhcmNoaGVhZGVycwogCiBhcmNocHJlcGFyZTogaW5jbHVkZS9nZW5lcmF0ZWQvdXNlcl9jb25zdGFudHMuaAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBiNjYwMDg4Li5mY2VmZGRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEyMSw2ICsxMjEsNyBAQAogCXNlbGVjdCBNT0RVTEVTX1VTRV9FTEZfUkVMQSBpZiBYODZfNjQKIAlzZWxlY3QgQ0xPTkVfQkFDS1dBUkRTIGlmIFg4Nl8zMgogCXNlbGVjdCBBUkNIX1VTRV9CVUlMVElOX0JTV0FQCisJc2VsZWN0IEFSQ0hfVVNFX1FVRVVFX1JXTE9DSwogCXNlbGVjdCBPTERfU0lHU1VTUEVORDMgaWYgWDg2XzMyIHx8IElBMzJfRU1VTEFUSU9OCiAJc2VsZWN0IE9MRF9TSUdBQ1RJT04gaWYgWDg2XzMyCiAJc2VsZWN0IENPTVBBVF9PTERfU0lHQUNUSU9OIGlmIElBMzJfRU1VTEFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hc20uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FzbS5oCmluZGV4IDQ1ODJlOGUuLjc3MzBjMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FzbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FzbS5oCkBAIC01Nyw2ICs1NywxMiBAQAogCS5sb25nIChmcm9tKSAtIC4gOwkJCQkJXAogCS5sb25nICh0bykgLSAuICsgMHg3ZmZmZmZmMCA7CQkJCVwKIAkucG9wc2VjdGlvbgorCisjIGRlZmluZSBfQVNNX05PS1BST0JFKGVudHJ5KQkJCQkJXAorCS5wdXNoc2VjdGlvbiAiX2twcm9iZV9ibGFja2xpc3QiLCJhdyIgOwkJCVwKKwlfQVNNX0FMSUdOIDsJCQkJCQlcCisJX0FTTV9QVFIgKGVudHJ5KTsJCQkJCVwKKwkucG9wc2VjdGlvbgogI2Vsc2UKICMgZGVmaW5lIF9BU01fRVhUQUJMRShmcm9tLHRvKQkJCQkJXAogCSIgLnB1c2hzZWN0aW9uIFwiX19leF90YWJsZVwiLFwiYVwiXG4iCQkJXApAQCAtNzEsNiArNzcsNyBAQAogCSIgLmxvbmcgKCIgI2Zyb20gIikgLSAuXG4iCQkJCVwKIAkiIC5sb25nICgiICN0byAiKSAtIC4gKyAweDdmZmZmZmYwXG4iCQkJXAogCSIgLnBvcHNlY3Rpb25cbiIKKy8qIEZvciBDIGZpbGUsIHdlIGFscmVhZHkgaGF2ZSBOT0tQUk9CRV9TWU1CT0wgbWFjcm8gKi8KICNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9YODZfQVNNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NoZWNrc3VtXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jaGVja3N1bV82NC5oCmluZGV4IGU2ZmQ4YTAuLmNkMDBlMTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NoZWNrc3VtXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2hlY2tzdW1fNjQuaApAQCAtMTg0LDggKzE4NCwxNSBAQAogCWFzbSgiYWRkbCAlMiwlMFxuXHQiCiAJICAgICJhZGNsICQwLCUwIgogCSAgICA6ICI9ciIgKGEpCi0JICAgIDogIjAiIChhKSwgInIiIChiKSk7CisJICAgIDogIjAiIChhKSwgInJtIiAoYikpOwogCXJldHVybiBhOwogfQogCisjZGVmaW5lIEhBVkVfQVJDSF9DU1VNX0FERAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV9hZGQoX193c3VtIGNzdW0sIF9fd3N1bSBhZGRlbmQpCit7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlhZGQzMl93aXRoX2NhcnJ5KChfX2ZvcmNlIHVuc2lnbmVkKWNzdW0sCisJCQkJCQkoX19mb3JjZSB1bnNpZ25lZClhZGRlbmQpOworfQorCiAjZW5kaWYgLyogX0FTTV9YODZfQ0hFQ0tTVU1fNjRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3Byb2Jlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3Byb2Jlcy5oCmluZGV4IDk0NTRjMTYuLjUzY2RmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2twcm9iZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rcHJvYmVzLmgKQEAgLTExNiw0ICsxMTYsNiBAQAogZXh0ZXJuIGludCBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucik7CiBleHRlcm4gaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKK2V4dGVybiBpbnQga3Byb2JlX2ludDNfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gaW50IGtwcm9iZV9kZWJ1Z19oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKICNlbmRpZiAvKiBfQVNNX1g4Nl9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Fyd2xvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Fyd2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGY0NmYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcXJ3bG9jay5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0FTTV9YODZfUVJXTE9DS19ICisjZGVmaW5lIF9BU01fWDg2X1FSV0xPQ0tfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcXJ3bG9ja190eXBlcy5oPgorCisjaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9PT1NUT1JFKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2X1BQUk9fRkVOQ0UpCisjZGVmaW5lIHF1ZXVlX3dyaXRlX3VubG9jayBxdWV1ZV93cml0ZV91bmxvY2sKK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV93cml0ZV91bmxvY2soc3RydWN0IHFyd2xvY2sgKmxvY2spCit7CisgICAgICAgIGJhcnJpZXIoKTsKKyAgICAgICAgQUNDRVNTX09OQ0UoKih1OCAqKSZsb2NrLT5jbnRzKSA9IDA7Cit9CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Fyd2xvY2suaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1FSV0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggMGY2MmY1NC4uNTRmMWM4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0xODcsNiArMTg3LDcgQEAKIAkJY3B1X3JlbGF4KCk7CiB9CiAKKyNpZm5kZWYgQ09ORklHX1FVRVVFX1JXTE9DSwogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCiAgKiBidXQgb25seSBvbmUgd3JpdGVyLgpAQCAtMjY5LDYgKzI3MCw5IEBACiAJYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYIFdSSVRFX0xPQ0tfQUREKCUxKSAiJTAiCiAJCSAgICAgOiAiK20iIChydy0+d3JpdGUpIDogImkiIChSV19MT0NLX0JJQVMpIDogIm1lbW9yeSIpOwogfQorI2Vsc2UKKyNpbmNsdWRlIDxhc20vcXJ3bG9jay5oPgorI2VuZGlmIC8qIENPTkZJR19RVUVVRV9SV0xPQ0sgKi8KIAogI2RlZmluZSBhcmNoX3JlYWRfbG9ja19mbGFncyhsb2NrLCBmbGFncykgYXJjaF9yZWFkX2xvY2sobG9jaykKICNkZWZpbmUgYXJjaF93cml0ZV9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBhcmNoX3dyaXRlX2xvY2sobG9jaykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IDRmMWJlYTEuLjczYzRjMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMzQsNiArMzQsMTAgQEAKIAogI2RlZmluZSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VECXsgeyAwIH0gfQogCisjaWZkZWYgQ09ORklHX1FVRVVFX1JXTE9DSworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Fyd2xvY2tfdHlwZXMuaD4KKyNlbHNlCiAjaW5jbHVkZSA8YXNtL3J3bG9jay5oPgorI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9TUElOTE9DS19UWVBFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaAppbmRleCA4YmExODg0Li5iYzgzNTJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTY4LDcgKzY4LDcgQEAKIGRvdHJhcGxpbmthZ2Ugdm9pZCBkb19zdGFja19zZWdtZW50KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwogI2lmZGVmIENPTkZJR19YODZfNjQKIGRvdHJhcGxpbmthZ2Ugdm9pZCBkb19kb3VibGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci1hc21saW5rYWdlIF9fa3Byb2JlcyBzdHJ1Y3QgcHRfcmVncyAqc3luY19yZWdzKHN0cnVjdCBwdF9yZWdzICopOworYXNtbGlua2FnZSBzdHJ1Y3QgcHRfcmVncyAqc3luY19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiBkb3RyYXBsaW5rYWdlIHZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwogZG90cmFwbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZyk7CkBAIC0xMDMsNyArMTAzLDYgQEAKIAogZXh0ZXJuIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CiAKLXZvaWQgbWF0aF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCk7CiB2b2lkIG1hdGhfZW11bGF0ZShzdHJ1Y3QgbWF0aF9lbXVfaW5mbyAqKTsKICNpZm5kZWYgQ09ORklHX1g4Nl8zMgogYXNtbGlua2FnZSB2b2lkIHNtcF90aGVybWFsX2ludGVycnVwdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vwcm9iZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vwcm9iZXMuaAppbmRleCA5M2JlZTdiLi43NGY0YzJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91cHJvYmVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXByb2Jlcy5oCkBAIC00MSwxOCArNDEsMTggQEAKIAkJdTgJCQlpeG9sW01BWF9VSU5TTl9CWVRFU107CiAJfTsKIAotCXUxNgkJCQlmaXh1cHM7CiAJY29uc3Qgc3RydWN0IHVwcm9iZV94b2xfb3BzCSpvcHM7CiAKIAl1bmlvbiB7Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCQl1bnNpZ25lZCBsb25nCQkJcmlwX3JlbGFfdGFyZ2V0X2FkZHJlc3M7Ci0jZW5kaWYKIAkJc3RydWN0IHsKIAkJCXMzMglvZmZzOwogCQkJdTgJaWxlbjsKIAkJCXU4CW9wYzE7Ci0JCX0JCQkJYnJhbmNoOworCQl9CQkJYnJhbmNoOworCQlzdHJ1Y3QgeworCQkJdTgJZml4dXBzOworCQkJdTgJaWxlbjsKKwkJfSAJCQlkZWZwYXJhbTsKIAl9OwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCBkZjk0NTk4Li43MDMxMzBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLSNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CkBAIC01NTEsNyArNTUwLDcgQEAKICAqCiAgKiBOb3RlOiBNdXN0IGJlIGNhbGxlZCB1bmRlciB0ZXh0X211dGV4LgogICovCi12b2lkICpfX2twcm9iZXMgdGV4dF9wb2tlKHZvaWQgKmFkZHIsIGNvbnN0IHZvaWQgKm9wY29kZSwgc2l6ZV90IGxlbikKK3ZvaWQgKnRleHRfcG9rZSh2b2lkICphZGRyLCBjb25zdCB2b2lkICpvcGNvZGUsIHNpemVfdCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICp2YWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKaW5kZXggZWFiNjcwNC4uYzNmY2I1ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2Jlcworc3RhdGljIGludAogYXJjaF90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlX2hhbmRsZXIodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGNwdTsKQEAgLTgwLDYgKzgwLDcgQEAKIAogCXJldHVybiBOTUlfRE9ORTsKIH0KK05PS1BST0JFX1NZTUJPTChhcmNoX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2VfaGFuZGxlcik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2Uodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwppbmRleCA5ZDBhOTc5Li44MWUwOGVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCkBAIC0yMjk3LDcgKzIyOTcsNyBAQAogCWludCBlcnI7CiAKIAlpZiAoIWNvbmZpZ19lbmFibGVkKENPTkZJR19TTVApKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVfb25saW5lX21hc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzMjgsNyArMjMyOCw3IEBACiAJaW50IHJldDsKIAogCWlmICghY29uZmlnX2VuYWJsZWQoQ09ORklHX1NNUCkpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FUEVSTTsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlyZXQgPSBfX2lvYXBpY19zZXRfYWZmaW5pdHkoZGF0YSwgbWFzaywgJmRlc3QpOwpAQCAtMzAwMSw5ICszMDAxLDExIEBACiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRhdGEtPmNoaXBfZGF0YTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdW5zaWduZWQgaW50IGRlc3Q7CisJaW50IHJldDsKIAotCWlmIChfX2lvYXBpY19zZXRfYWZmaW5pdHkoZGF0YSwgbWFzaywgJmRlc3QpKQotCQlyZXR1cm4gLTE7CisJcmV0ID0gX19pb2FwaWNfc2V0X2FmZmluaXR5KGRhdGEsIG1hc2ssICZkZXN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJX19nZXRfY2FjaGVkX21zaV9tc2coZGF0YS0+bXNpX2Rlc2MsICZtc2cpOwogCkBAIC0zMTAwLDkgKzMxMDIsMTEgQEAKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gZGF0YS0+Y2hpcF9kYXRhOwogCXVuc2lnbmVkIGludCBkZXN0LCBpcnEgPSBkYXRhLT5pcnE7CiAJc3RydWN0IG1zaV9tc2cgbXNnOworCWludCByZXQ7CiAKLQlpZiAoX19pb2FwaWNfc2V0X2FmZmluaXR5KGRhdGEsIG1hc2ssICZkZXN0KSkKLQkJcmV0dXJuIC0xOworCXJldCA9IF9faW9hcGljX3NldF9hZmZpbml0eShkYXRhLCBtYXNrLCAmZGVzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRtYXJfbXNpX3JlYWQoaXJxLCAmbXNnKTsKIApAQCAtMzE0OSw5ICszMTUzLDExIEBACiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRhdGEtPmNoaXBfZGF0YTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdW5zaWduZWQgaW50IGRlc3Q7CisJaW50IHJldDsKIAotCWlmIChfX2lvYXBpY19zZXRfYWZmaW5pdHkoZGF0YSwgbWFzaywgJmRlc3QpKQotCQlyZXR1cm4gLTE7CisJcmV0ID0gX19pb2FwaWNfc2V0X2FmZmluaXR5KGRhdGEsIG1hc2ssICZkZXN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaHBldF9tc2lfcmVhZChkYXRhLT5oYW5kbGVyX2RhdGEsICZtc2cpOwogCkBAIC0zMjE4LDkgKzMyMjQsMTEgQEAKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gZGF0YS0+Y2hpcF9kYXRhOwogCXVuc2lnbmVkIGludCBkZXN0OworCWludCByZXQ7CiAKLQlpZiAoX19pb2FwaWNfc2V0X2FmZmluaXR5KGRhdGEsIG1hc2ssICZkZXN0KSkKLQkJcmV0dXJuIC0xOworCXJldCA9IF9faW9hcGljX3NldF9hZmZpbml0eShkYXRhLCBtYXNrLCAmZGVzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXRhcmdldF9odF9pcnEoZGF0YS0+aXJxLCBkZXN0LCBjZmctPnZlY3Rvcik7CiAJcmV0dXJuIElSUV9TRVRfTUFTS19PS19OT0NPUFk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCAyY2JiZjg4Li5lZjFiOTNmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xMTkzLDYgKzExOTQsNyBAQAogCQkoYWRkciA8PSBfX2dldF9jcHVfdmFyKGRlYnVnX3N0YWNrX2FkZHIpICYmCiAJCSBhZGRyID4gKF9fZ2V0X2NwdV92YXIoZGVidWdfc3RhY2tfYWRkcikgLSBERUJVR19TVEtTWikpOwogfQorTk9LUFJPQkVfU1lNQk9MKGlzX2RlYnVnX3N0YWNrKTsKIAogREVGSU5FX1BFUl9DUFUodTMyLCBkZWJ1Z19pZHRfY3RyKTsKIApAQCAtMTIwMSw2ICsxMjAzLDcgQEAKIAl0aGlzX2NwdV9pbmMoZGVidWdfaWR0X2N0cik7CiAJbG9hZF9jdXJyZW50X2lkdCgpOwogfQorTk9LUFJPQkVfU1lNQk9MKGRlYnVnX3N0YWNrX3NldF96ZXJvKTsKIAogdm9pZCBkZWJ1Z19zdGFja19yZXNldCh2b2lkKQogewpAQCAtMTIwOSw2ICsxMjEyLDcgQEAKIAlpZiAodGhpc19jcHVfZGVjX3JldHVybihkZWJ1Z19pZHRfY3RyKSA9PSAwKQogCQlsb2FkX2N1cnJlbnRfaWR0KCk7CiB9CitOT0tQUk9CRV9TWU1CT0woZGVidWdfc3RhY2tfcmVzZXQpOwogCiAjZWxzZQkvKiBDT05GSUdfWDg2XzY0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwppbmRleCA3NmY5OGZlLi5hNDUwMzczIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCkBAIC0xMzIsMTUgKzEzMiw2IEBACiAJCWxhcGljX3RpbWVyX2ZyZXF1ZW5jeSA9IGh2X2xhcGljX2ZyZXF1ZW5jeTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSHlwZXJWOiBMQVBJQyBUaW1lciBGcmVxdWVuY3k6ICUjeFxuIiwKIAkJCQlsYXBpY190aW1lcl9mcmVxdWVuY3kpOwotCi0JCS8qCi0JCSAqIE9uIEh5cGVyLVYsIHdoZW4gd2UgYXJlIGJvb3Rpbmcgb2ZmIGFuIEVGSSBmaXJtd2FyZSBzdGFjaywKLQkJICogd2UgZG8gbm90IGhhdmUgbWFueSBsZWdhY3kgZGV2aWNlcyBpbmNsdWRpbmcgUElDLCBQSVQgZXRjLgotCQkgKi8KLQkJaWYgKGVmaV9lbmFibGVkKEVGSV9CT09UKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSHlwZXJWOiBVc2luZyBudWxsX2xlZ2FjeV9waWNcbiIpOwotCQkJbGVnYWN5X3BpYyA9ICZudWxsX2xlZ2FjeV9waWM7Ci0JCX0KIAl9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwppbmRleCA4OWYzYjdjLi4yYmRmYmZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwpAQCAtMzAzLDE1ICszMDMsNiBAQAogCQlod2MtPnNhbXBsZV9wZXJpb2QgPSB4ODZfcG11Lm1heF9wZXJpb2Q7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7CiAJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHdlIGhhdmUgYSBQTVUgaW5pdGlhbGl6ZWQgYnV0IG5vIEFQSUMKLQkJICogaW50ZXJydXB0cywgd2UgY2Fubm90IHNhbXBsZSBoYXJkd2FyZQotCQkgKiBldmVudHMgKHVzZXItc3BhY2UgaGFzIHRvIGZhbGwgYmFjayBhbmQKLQkJICogc2FtcGxlIHZpYSBhIGhydGltZXIgYmFzZWQgc29mdHdhcmUgZXZlbnQpOgotCQkgKi8KLQkJaWYgKCF4ODZfcG11LmFwaWMpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJaWYgKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX1JBVykKQEAgLTEyOTMsNyArMTI4NCw3IEBACiAJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzCitzdGF0aWMgaW50CiBwZXJmX2V2ZW50X25taV9oYW5kbGVyKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXU2NCBzdGFydF9jbG9jazsKQEAgLTEzMTEsNiArMTMwMiw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQorTk9LUFJPQkVfU1lNQk9MKHBlcmZfZXZlbnRfbm1pX2hhbmRsZXIpOwogCiBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBlbXB0eWNvbnN0cmFpbnQ7CiBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCB1bmNvbnN0cmFpbmVkOwpAQCAtMTM2Niw2ICsxMzU4LDE1IEBACiAJeDg2X3BtdS5hcGljID0gMDsKIAlwcl9pbmZvKCJubyBBUElDLCBib290IHdpdGggdGhlIFwibGFwaWNcIiBib290IHBhcmFtZXRlciB0byBmb3JjZS1lbmFibGUgaXQuXG4iKTsKIAlwcl9pbmZvKCJubyBoYXJkd2FyZSBzYW1wbGluZyBpbnRlcnJ1cHQgYXZhaWxhYmxlLlxuIik7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBQTVUgaW5pdGlhbGl6ZWQgYnV0IG5vIEFQSUMKKwkgKiBpbnRlcnJ1cHRzLCB3ZSBjYW5ub3Qgc2FtcGxlIGhhcmR3YXJlCisJICogZXZlbnRzICh1c2VyLXNwYWNlIGhhcyB0byBmYWxsIGJhY2sgYW5kCisJICogc2FtcGxlIHZpYSBhIGhydGltZXIgYmFzZWQgc29mdHdhcmUgZXZlbnQpOgorCSAqLworCXBtdS5jYXBhYmlsaXRpZXMgfD0gUEVSRl9QTVVfQ0FQX05PX0lOVEVSUlVQVDsKKwogfQogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB4ODZfcG11X2Zvcm1hdF9ncm91cCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kX2licy5jCmluZGV4IDRjMzZiYmUuLmNiYjFiZTNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kX2licy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMKQEAgLTU5Myw3ICs1OTMsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2Jlcworc3RhdGljIGludAogcGVyZl9pYnNfbm1pX2hhbmRsZXIodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtNjA2LDYgKzYwNiw3IEBACiAKIAlyZXR1cm4gaGFuZGxlZDsKIH0KK05PS1BST0JFX1NZTUJPTChwZXJmX2lic19ubWlfaGFuZGxlcik7CiAKIHN0YXRpYyBfX2luaXQgaW50IHBlcmZfaWJzX3BtdV9pbml0KHN0cnVjdCBwZXJmX2licyAqcGVyZl9pYnMsIGNoYXIgKm5hbWUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfbGJyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfbGJyLmMKaW5kZXggZDgyZDE1NS4uOWRkMjQ1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2xici5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9sYnIuYwpAQCAtMzg0LDYgKzM4NCw5IEBACiAJaWYgKGJyX3R5cGUgJiBQRVJGX1NBTVBMRV9CUkFOQ0hfTk9fVFgpCiAJCW1hc2sgfD0gWDg2X0JSX05PX1RYOwogCisJaWYgKGJyX3R5cGUgJiBQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORCkKKwkJbWFzayB8PSBYODZfQlJfSkNDOworCiAJLyoKIAkgKiBzdGFzaCBhY3R1YWwgdXNlciByZXF1ZXN0IGludG8gcmVnLCBpdCBtYXkKIAkgKiBiZSB1c2VkIGJ5IGZpeHVwIGNvZGUgZm9yIHNvbWUgQ1BVCkBAIC02NzgsNiArNjgxLDcgQEAKIAkgKiBOSE0vV1NNIGVycmF0dW06IG11c3QgaW5jbHVkZSBJTkRfSk1QIHRvIGNhcHR1cmUgSU5EX0NBTEwKIAkgKi8KIAlbUEVSRl9TQU1QTEVfQlJBTkNIX0lORF9DQUxMXSA9IExCUl9JTkRfQ0FMTCB8IExCUl9JTkRfSk1QLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF0gICAgID0gTEJSX0pDQywKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgc25iX2xicl9zZWxfbWFwW1BFUkZfU0FNUExFX0JSQU5DSF9NQVhdID0gewpAQCAtNjg5LDYgKzY5Myw3IEBACiAJW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTF0JPSBMQlJfUkVMX0NBTEwgfCBMQlJfSU5EX0NBTEwKIAkJCQkJfCBMQlJfRkFSLAogCVtQRVJGX1NBTVBMRV9CUkFOQ0hfSU5EX0NBTExdCT0gTEJSX0lORF9DQUxMLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF0gICAgICAgPSBMQlJfSkNDLAogfTsKIAogLyogY29yZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCmluZGV4IGQ5YzEyZDMuLmI3NGViYzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogc3RhdGljIGludCBkaWVfb3duZXIgPSAtMTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGllX25lc3RfY291bnQ7CiAKLXVuc2lnbmVkIF9fa3Byb2JlcyBsb25nIG9vcHNfYmVnaW4odm9pZCkKK3Vuc2lnbmVkIGxvbmcgb29wc19iZWdpbih2b2lkKQogewogCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIyMyw4ICsyMjMsOSBAQAogCXJldHVybiBmbGFnczsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9vcHNfYmVnaW4pOworTk9LUFJPQkVfU1lNQk9MKG9vcHNfYmVnaW4pOwogCi12b2lkIF9fa3Byb2JlcyBvb3BzX2VuZCh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQordm9pZCBvb3BzX2VuZCh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQogewogCWlmIChyZWdzICYmIGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKIAkJY3Jhc2hfa2V4ZWMocmVncyk7CkBAIC0yNDcsOCArMjQ4LDkgQEAKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOwogCWRvX2V4aXQoc2lnbnIpOwogfQorTk9LUFJPQkVfU1lNQk9MKG9vcHNfZW5kKTsKIAotaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK2ludCBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKIHsKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJdW5zaWduZWQgc2hvcnQgc3M7CkBAIC0yOTEsNiArMjkzLDcgQEAKICNlbmRpZgogCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKF9fZGllKTsKIAogLyoKICAqIFRoaXMgaXMgZ29uZSB0aHJvdWdoIHdoZW4gc29tZXRoaW5nIGluIHRoZSBrZXJuZWwgaGFzIGRvbmUgc29tZXRoaW5nIGJhZApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCmluZGV4IDZjZGEwYmEuLjJlMWE2ODUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKQEAgLTQxOSw3ICs0MTksNyBAQAogCXJldHVybiBnbWNoX2N0cmwgPDwgMjU7IC8qIDMyIE1CIHVuaXRzICovCiB9CiAKLXN0YXRpYyBzaXplX3QgZ2VuOF9zdG9sZW5fc2l6ZShpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCitzdGF0aWMgc2l6ZV90IF9faW5pdCBnZW44X3N0b2xlbl9zaXplKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYykKIHsKIAl1MTYgZ21jaF9jdHJsOwogCkBAIC00MjksNDggKzQyOSw3MyBAQAogCXJldHVybiBnbWNoX2N0cmwgPDwgMjU7IC8qIDMyIE1CIHVuaXRzICovCiB9CiAKK3N0YXRpYyBzaXplX3QgX19pbml0IGNodl9zdG9sZW5fc2l6ZShpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCit7CisJdTE2IGdtY2hfY3RybDsKKworCWdtY2hfY3RybCA9IHJlYWRfcGNpX2NvbmZpZ18xNihudW0sIHNsb3QsIGZ1bmMsIFNOQl9HTUNIX0NUUkwpOworCWdtY2hfY3RybCA+Pj0gU05CX0dNQ0hfR01TX1NISUZUOworCWdtY2hfY3RybCAmPSBTTkJfR01DSF9HTVNfTUFTSzsKKworCS8qCisJICogMHgwICB0byAweDEwOiAzMk1CIGluY3JlbWVudHMgc3RhcnRpbmcgYXQgME1CCisJICogMHgxMSB0byAweDE2OiA0TUIgaW5jcmVtZW50cyBzdGFydGluZyBhdCA4TUIKKwkgKiAweDE3IHRvIDB4MWQ6IDRNQiBpbmNyZW1lbnRzIHN0YXJ0IGF0IDM2TUIKKwkgKi8KKwlpZiAoZ21jaF9jdHJsIDwgMHgxMSkKKwkJcmV0dXJuIGdtY2hfY3RybCA8PCAyNTsKKwllbHNlIGlmIChnbWNoX2N0cmwgPCAweDE3KQorCQlyZXR1cm4gKGdtY2hfY3RybCAtIDB4MTEgKyAyKSA8PCAyMjsKKwllbHNlCisJCXJldHVybiAoZ21jaF9jdHJsIC0gMHgxNyArIDkpIDw8IDIyOworfQogCiBzdHJ1Y3QgaW50ZWxfc3RvbGVuX2Z1bmNzIHsKIAlzaXplX3QgKCpzaXplKShpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpOwogCXUzMiAoKmJhc2UpKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYywgc2l6ZV90IHNpemUpOwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgaTgzMF9zdG9sZW5fZnVuY3MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBpODMwX3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKIAkuYmFzZSA9IGk4MzBfc3RvbGVuX2Jhc2UsCiAJLnNpemUgPSBpODMwX3N0b2xlbl9zaXplLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgaTg0NV9zdG9sZW5fZnVuY3MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBpODQ1X3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKIAkuYmFzZSA9IGk4NDVfc3RvbGVuX2Jhc2UsCiAJLnNpemUgPSBpODMwX3N0b2xlbl9zaXplLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgaTg1eF9zdG9sZW5fZnVuY3MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBpODV4X3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKIAkuYmFzZSA9IGk4NXhfc3RvbGVuX2Jhc2UsCiAJLnNpemUgPSBnZW4zX3N0b2xlbl9zaXplLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgaTg2NV9zdG9sZW5fZnVuY3MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBpODY1X3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKIAkuYmFzZSA9IGk4NjVfc3RvbGVuX2Jhc2UsCiAJLnNpemUgPSBnZW4zX3N0b2xlbl9zaXplLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgZ2VuM19zdG9sZW5fZnVuY3MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBnZW4zX3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKIAkuYmFzZSA9IGludGVsX3N0b2xlbl9iYXNlLAogCS5zaXplID0gZ2VuM19zdG9sZW5fc2l6ZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfc3RvbGVuX2Z1bmNzIGdlbjZfc3RvbGVuX2Z1bmNzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgZ2VuNl9zdG9sZW5fZnVuY3MgX19pbml0Y29uc3QgPSB7CiAJLmJhc2UgPSBpbnRlbF9zdG9sZW5fYmFzZSwKIAkuc2l6ZSA9IGdlbjZfc3RvbGVuX3NpemUsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3N0b2xlbl9mdW5jcyBnZW44X3N0b2xlbl9mdW5jcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfc3RvbGVuX2Z1bmNzIGdlbjhfc3RvbGVuX2Z1bmNzIF9faW5pdGNvbnN0ID0gewogCS5iYXNlID0gaW50ZWxfc3RvbGVuX2Jhc2UsCiAJLnNpemUgPSBnZW44X3N0b2xlbl9zaXplLAogfTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGludGVsX3N0b2xlbl9pZHNbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9zdG9sZW5fZnVuY3MgY2h2X3N0b2xlbl9mdW5jcyBfX2luaXRjb25zdCA9IHsKKwkuYmFzZSA9IGludGVsX3N0b2xlbl9iYXNlLAorCS5zaXplID0gY2h2X3N0b2xlbl9zaXplLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGludGVsX3N0b2xlbl9pZHNbXSBfX2luaXRjb25zdCA9IHsKIAlJTlRFTF9JODMwX0lEUygmaTgzMF9zdG9sZW5fZnVuY3MpLAogCUlOVEVMX0k4NDVHX0lEUygmaTg0NV9zdG9sZW5fZnVuY3MpLAogCUlOVEVMX0k4NVhfSURTKCZpODV4X3N0b2xlbl9mdW5jcyksCkBAIC00OTYsNyArNTIxLDggQEAKIAlJTlRFTF9IU1dfRF9JRFMoJmdlbjZfc3RvbGVuX2Z1bmNzKSwKIAlJTlRFTF9IU1dfTV9JRFMoJmdlbjZfc3RvbGVuX2Z1bmNzKSwKIAlJTlRFTF9CRFdfTV9JRFMoJmdlbjhfc3RvbGVuX2Z1bmNzKSwKLQlJTlRFTF9CRFdfRF9JRFMoJmdlbjhfc3RvbGVuX2Z1bmNzKQorCUlOVEVMX0JEV19EX0lEUygmZ2VuOF9zdG9sZW5fZnVuY3MpLAorCUlOVEVMX0NIVl9JRFMoJmNodl9zdG9sZW5fZnVuY3MpLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGludGVsX2dyYXBoaWNzX3N0b2xlbihpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDk4MzEzZmYuLmYwZGE4MmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0zMTUsMTAgKzMxNSw2IEBACiBFTkRQUk9DKHJldF9mcm9tX2tlcm5lbF90aHJlYWQpCiAKIC8qCi0gKiBJbnRlcnJ1cHQgZXhpdCBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3RlY3RlZCBhZ2FpbnN0IGtwcm9iZXMKLSAqLwotCS5wdXNoc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCi0vKgogICogUmV0dXJuIHRvIHVzZXIgbW9kZSBpcyBub3QgYXMgY29tcGxleCBhcyBhbGwgdGhpcyBsb29rcywKICAqIGJ1dCB3ZSB3YW50IHRoZSBkZWZhdWx0IHBhdGggZm9yIGEgc3lzdGVtIGNhbGwgcmV0dXJuIHRvCiAgKiBnbyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHdoaWNoIGlzIHdoeSBzb21lIG9mIHRoaXMgaXMKQEAgLTM3MiwxMCArMzY4LDYgQEAKIEVORChyZXN1bWVfa2VybmVsKQogI2VuZGlmCiAJQ0ZJX0VORFBST0MKLS8qCi0gKiBFbmQgb2Yga3Byb2JlcyBzZWN0aW9uCi0gKi8KLQkucG9wc2VjdGlvbgogCiAvKiBTWVNFTlRFUl9SRVRVUk4gcG9pbnRzIHRvIGFmdGVyIHRoZSAic3lzZW50ZXIiIGluc3RydWN0aW9uIGluCiAgICB0aGUgdnN5c2NhbGwgcGFnZS4gIFNlZSB2c3lzY2FsbC1zeXNlbnRyeS5TLCB3aGljaCBkZWZpbmVzIHRoZSBzeW1ib2wuICAqLwpAQCAtNDk1LDEwICs0ODcsNiBAQAogCVBUR1NfVE9fR1NfRVgKIEVORFBST0MoaWEzMl9zeXNlbnRlcl90YXJnZXQpCiAKLS8qCi0gKiBzeXNjYWxsIHN0dWIgaW5jbHVkaW5nIGlycSBleGl0IHNob3VsZCBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBrcHJvYmVzCi0gKi8KLQkucHVzaHNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgogCSMgc3lzdGVtIGNhbGwgaGFuZGxlciBzdHViCiBFTlRSWShzeXN0ZW1fY2FsbCkKIAlSSU5HMF9JTlRfRlJBTUUJCQkjIGNhbid0IHVud2luZCBpbnRvIHVzZXIgc3BhY2UgYW55d2F5CkBAIC02OTAsMTAgKzY3OCw2IEBACiAJam1wIHJlc3VtZV91c2Vyc3BhY2UKIEVORChzeXNjYWxsX2JhZHN5cykKIAlDRklfRU5EUFJPQwotLyoKLSAqIEVuZCBvZiBrcHJvYmVzIHNlY3Rpb24KLSAqLwotCS5wb3BzZWN0aW9uCiAKIC5tYWNybyBGSVhVUF9FU1BGSVhfU1RBQ0sKIC8qCkBAIC03ODQsMTAgKzc2OCw2IEBACiBFTkRQUk9DKGNvbW1vbl9pbnRlcnJ1cHQpCiAJQ0ZJX0VORFBST0MKIAotLyoKLSAqICBJcnEgZW50cmllcyBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3Qga3Byb2JlcwotICovCi0JLnB1c2hzZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKICNkZWZpbmUgQlVJTERfSU5URVJSVVBUMyhuYW1lLCBuciwgZm4pCVwKIEVOVFJZKG5hbWUpCQkJCVwKIAlSSU5HMF9JTlRfRlJBTUU7CQlcCkBAIC05NjQsMTAgKzk0NCw2IEBACiAJam1wIGVycm9yX2NvZGUKIAlDRklfRU5EUFJPQwogRU5EKHNwdXJpb3VzX2ludGVycnVwdF9idWcpCi0vKgotICogRW5kIG9mIGtwcm9iZXMgc2VjdGlvbgotICovCi0JLnBvcHNlY3Rpb24KIAogI2lmZGVmIENPTkZJR19YRU4KIC8qIFhlbiBkb2Vzbid0IHNldCAlZXNwIHRvIGJlIHByZWNpc2VseSB3aGF0IHRoZSBub3JtYWwgc3lzZW50ZXIKQEAgLTEyNDIsMTEgKzEyMTgsNiBAQAogCWptcCAqJWVjeAogI2VuZGlmCiAKLS8qCi0gKiBTb21lIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3Qga3Byb2JlcwotICovCi0JLnB1c2hzZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKLQogI2lmZGVmIENPTkZJR19UUkFDSU5HCiBFTlRSWSh0cmFjZV9wYWdlX2ZhdWx0KQogCVJJTkcwX0VDX0ZSQU1FCkBAIC0xNDYwLDcgKzE0MzEsMyBAQAogRU5EKGFzeW5jX3BhZ2VfZmF1bHQpCiAjZW5kaWYKIAotLyoKLSAqIEVuZCBvZiBrcHJvYmVzIHNlY3Rpb24KLSAqLwotCS5wb3BzZWN0aW9uCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDQ4YTI2NDQuLmIyNWNhOTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCkBAIC0yODQsOCArMjg0LDYgQEAKIAlUUkFDRV9JUlFTX09GRgogCS5lbmRtCiAKLS8qIHNhdmUgY29tcGxldGUgc3RhY2sgZnJhbWUgKi8KLQkucHVzaHNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgogRU5UUlkoc2F2ZV9wYXJhbm9pZCkKIAlYQ1BUX0ZSQU1FIDEgUkRJKzgKIAljbGQKQEAgLTMxNCw3ICszMTIsNiBAQAogMToJcmV0CiAJQ0ZJX0VORFBST0MKIEVORChzYXZlX3BhcmFub2lkKQotCS5wb3BzZWN0aW9uCiAKIC8qCiAgKiBBIG5ld2x5IGZvcmtlZCBwcm9jZXNzIGRpcmVjdGx5IGNvbnRleHQgc3dpdGNoZXMgaW50byB0aGlzIGFkZHJlc3MuCkBAIC03NzIsMTAgKzc2OSw2IEBACiAJY2FsbCBcZnVuYwogCS5lbmRtCiAKLS8qCi0gKiBJbnRlcnJ1cHQgZW50cnkvZXhpdCBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3Qga3Byb2JlcwotICovCi0JLnB1c2hzZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIAkvKgogCSAqIFRoZSBpbnRlcnJ1cHQgc3R1YnMgcHVzaCAofnZlY3RvcisweDgwKSBvbnRvIHRoZSBzdGFjayBhbmQKIAkgKiB0aGVuIGp1bXAgdG8gY29tbW9uX2ludGVycnVwdC4KQEAgLTk4MywxMSArOTc2LDYgQEAKICNlbmRpZgogCiAvKgotICogRW5kIG9mIGtwcm9iZXMgc2VjdGlvbgotICovCi0gICAgICAgLnBvcHNlY3Rpb24KLQotLyoKICAqIEFQSUMgaW50ZXJydXB0cy4KICAqLwogLm1hY3JvIGFwaWNpbnRlcnJ1cHQzIG51bSBzeW0gZG9fc3ltCkBAIC0xMzIxLDExICsxMzA5LDYgQEAKIAloeXBlcnZfY2FsbGJhY2tfdmVjdG9yIGh5cGVydl92ZWN0b3JfaGFuZGxlcgogI2VuZGlmIC8qIENPTkZJR19IWVBFUlYgKi8KIAotLyoKLSAqIFNvbWUgZnVuY3Rpb25zIHNob3VsZCBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBrcHJvYmVzCi0gKi8KLQkucHVzaHNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgotCiBpZHRlbnRyeSBkZWJ1ZyBkb19kZWJ1ZyBoYXNfZXJyb3JfY29kZT0wIHBhcmFub2lkPTEgc2hpZnRfaXN0PURFQlVHX1NUQUNLCiBpZHRlbnRyeSBpbnQzIGRvX2ludDMgaGFzX2Vycm9yX2NvZGU9MCBwYXJhbm9pZD0xIHNoaWZ0X2lzdD1ERUJVR19TVEFDSwogaWR0ZW50cnkgc3RhY2tfc2VnbWVudCBkb19zdGFja19zZWdtZW50IGhhc19lcnJvcl9jb2RlPTEgcGFyYW5vaWQ9MQpAQCAtMTc0Miw3ICsxNzI1LDMgQEAKIAlDRklfRU5EUFJPQwogRU5EKGlnbm9yZV9zeXNyZXQpCiAKLS8qCi0gKiBFbmQgb2Yga3Byb2JlcyBzZWN0aW9uCi0gKi8KLQkucG9wc2VjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggYTY3YjQ3Yy4uNWY5Y2YyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDI0LDcgKzQyMyw3IEBACiAgKiBOT1RJRllfU1RPUCByZXR1cm5lZCBmb3IgYWxsIG90aGVyIGNhc2VzCiAgKgogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBod19icmVha3BvaW50X2hhbmRsZXIoc3RydWN0IGRpZV9hcmdzICphcmdzKQorc3RhdGljIGludCBod19icmVha3BvaW50X2hhbmRsZXIoc3RydWN0IGRpZV9hcmdzICphcmdzKQogewogCWludCBpLCBjcHUsIHJjID0gTk9USUZZX1NUT1A7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmJwOwpAQCAtNTExLDcgKzUxMCw3IEBACiAvKgogICogSGFuZGxlIGRlYnVnIGV4Y2VwdGlvbiBub3RpZmljYXRpb25zLgogICovCi1pbnQgX19rcHJvYmVzIGh3X2JyZWFrcG9pbnRfZXhjZXB0aW9uc19ub3RpZnkoCitpbnQgaHdfYnJlYWtwb2ludF9leGNlcHRpb25zX25vdGlmeSgKIAkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQogewogCWlmICh2YWwgIT0gRElFX0RFQlVHKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCAyZTk3N2I1Li44YWY4MTcxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2k4MjU5LmMKQEAgLTI5OSwxMyArMjk5LDMxIEBACiBzdGF0aWMgdm9pZCBpbml0XzgyNTlBKGludCBhdXRvX2VvaSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgcHJvYmVfdmFsID0gfigxIDw8IFBJQ19DQVNDQURFX0lSKTsKKwl1bnNpZ25lZCBjaGFyIG5ld192YWw7CiAKIAlpODI1OUFfYXV0b19lb2kgPSBhdXRvX2VvaTsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIAotCW91dGIoMHhmZiwgUElDX01BU1RFUl9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIFBJQy4KKwkgKiBNYXNrIGFsbCBleGNlcHQgdGhlIGNhc2NhZGUgYW5kIHJlYWQKKwkgKiBiYWNrIHRoZSB2YWx1ZSB3ZSBqdXN0IHdyb3RlLiBJZiB3ZSBkb24ndAorCSAqIGhhdmUgYSBQSUMsIHdlIHdpbGwgcmVhZCAweGZmIGFzIG9wcG9zZWQgdG8gdGhlCisJICogdmFsdWUgd2Ugd3JvdGUuCisJICovCiAJb3V0YigweGZmLCBQSUNfU0xBVkVfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMiAqLworCW91dGIocHJvYmVfdmFsLCBQSUNfTUFTVEVSX0lNUik7CisJbmV3X3ZhbCA9IGluYihQSUNfTUFTVEVSX0lNUik7CisJaWYgKG5ld192YWwgIT0gcHJvYmVfdmFsKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIE5VTEwgbGVnYWN5IFBJQ1xuIik7CisJCWxlZ2FjeV9waWMgPSAmbnVsbF9sZWdhY3lfcGljOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCW91dGIoMHhmZiwgUElDX01BU1RFUl9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAKIAkvKgogCSAqIG91dGJfcGljIC0gdGhpcyBoYXMgdG8gd29yayBvbiBhIHdpZGUgcmFuZ2Ugb2YgUEMgaGFyZHdhcmUuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggMTFjY2ZiMC4uOTIyZDI4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtMzY1LDYgKzM2NSw3IEBACiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXA7CisJaW50IHJldDsKIAogCWZvcl9lYWNoX2lycV9kZXNjKGlycSwgZGVzYykgewogCQlpbnQgYnJlYWtfYWZmaW5pdHkgPSAwOwpAQCAtNDAzLDEwICs0MDQsMTQgQEAKIAkJaWYgKCFpcnFkX2Nhbl9tb3ZlX2luX3Byb2Nlc3NfY29udGV4dChkYXRhKSAmJiBjaGlwLT5pcnFfbWFzaykKIAkJCWNoaXAtPmlycV9tYXNrKGRhdGEpOwogCi0JCWlmIChjaGlwLT5pcnFfc2V0X2FmZmluaXR5KQotCQkJY2hpcC0+aXJxX3NldF9hZmZpbml0eShkYXRhLCBhZmZpbml0eSwgdHJ1ZSk7Ci0JCWVsc2UgaWYgKCEod2FybmVkKyspKQotCQkJc2V0X2FmZmluaXR5ID0gMDsKKwkJaWYgKGNoaXAtPmlycV9zZXRfYWZmaW5pdHkpIHsKKwkJCXJldCA9IGNoaXAtPmlycV9zZXRfYWZmaW5pdHkoZGF0YSwgYWZmaW5pdHksIHRydWUpOworCQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkJCXByX2NyaXQoIklSUSAlZCBzZXQgYWZmaW5pdHkgZmFpbGVkIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSB2ZWN0b3JzLiAgVGhlIGRldmljZSBhc3NpZ25lZCB0byB0aGlzIElSUSBpcyB1bnN0YWJsZS5cbiIsIGlycSk7CisJCX0gZWxzZSB7CisJCQlpZiAoISh3YXJuZWQrKykpCisJCQkJc2V0X2FmZmluaXR5ID0gMDsKKwkJfQogCiAJCS8qCiAJCSAqIFdlIHVubWFzayBpZiB0aGUgaXJxIHdhcyBub3QgbWFya2VkIG1hc2tlZCBieSB0aGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYwppbmRleCA2MWIxN2RjLi43NTk2ZGY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jCkBAIC0xMTIsNyArMTEyLDggQEAKIAogY29uc3QgaW50IGtyZXRwcm9iZV9ibGFja2xpc3Rfc2l6ZSA9IEFSUkFZX1NJWkUoa3JldHByb2JlX2JsYWNrbGlzdCk7CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBfX3N5bnRoZXNpemVfcmVsYXRpdmVfaW5zbih2b2lkICpmcm9tLCB2b2lkICp0bywgdTggb3ApCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIHZvaWQKK19fc3ludGhlc2l6ZV9yZWxhdGl2ZV9pbnNuKHZvaWQgKmZyb20sIHZvaWQgKnRvLCB1OCBvcCkKIHsKIAlzdHJ1Y3QgX19hcmNoX3JlbGF0aXZlX2luc24gewogCQl1OCBvcDsKQEAgLTEyNSwyMSArMTI2LDIzIEBACiB9CiAKIC8qIEluc2VydCBhIGp1bXAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAnZnJvbScsIHdoaWNoIGp1bXBzIHRvIGFkZHJlc3MgJ3RvJy4qLwotdm9pZCBfX2twcm9iZXMgc3ludGhlc2l6ZV9yZWxqdW1wKHZvaWQgKmZyb20sIHZvaWQgKnRvKQordm9pZCBzeW50aGVzaXplX3JlbGp1bXAodm9pZCAqZnJvbSwgdm9pZCAqdG8pCiB7CiAJX19zeW50aGVzaXplX3JlbGF0aXZlX2luc24oZnJvbSwgdG8sIFJFTEFUSVZFSlVNUF9PUENPREUpOwogfQorTk9LUFJPQkVfU1lNQk9MKHN5bnRoZXNpemVfcmVsanVtcCk7CiAKIC8qIEluc2VydCBhIGNhbGwgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAnZnJvbScsIHdoaWNoIGNhbGxzIGFkZHJlc3MgJ3RvJy4qLwotdm9pZCBfX2twcm9iZXMgc3ludGhlc2l6ZV9yZWxjYWxsKHZvaWQgKmZyb20sIHZvaWQgKnRvKQordm9pZCBzeW50aGVzaXplX3JlbGNhbGwodm9pZCAqZnJvbSwgdm9pZCAqdG8pCiB7CiAJX19zeW50aGVzaXplX3JlbGF0aXZlX2luc24oZnJvbSwgdG8sIFJFTEFUSVZFQ0FMTF9PUENPREUpOwogfQorTk9LUFJPQkVfU1lNQk9MKHN5bnRoZXNpemVfcmVsY2FsbCk7CiAKIC8qCiAgKiBTa2lwIHRoZSBwcmVmaXhlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCiAgKi8KLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKl9fa3Byb2JlcyBza2lwX3ByZWZpeGVzKGtwcm9iZV9vcGNvZGVfdCAqaW5zbikKK3N0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKnNraXBfcHJlZml4ZXMoa3Byb2JlX29wY29kZV90ICppbnNuKQogewogCWluc25fYXR0cl90IGF0dHI7CiAKQEAgLTE1NCwxMiArMTU3LDEzIEBACiAjZW5kaWYKIAlyZXR1cm4gaW5zbjsKIH0KK05PS1BST0JFX1NZTUJPTChza2lwX3ByZWZpeGVzKTsKIAogLyoKICAqIFJldHVybnMgbm9uLXplcm8gaWYgb3Bjb2RlIGlzIGJvb3N0YWJsZS4KICAqIFJJUCByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJlIGFkanVzdGVkIGF0IGNvcHlpbmcgdGltZSBpbiA2NCBiaXRzIG1vZGUKICAqLwotaW50IF9fa3Byb2JlcyBjYW5fYm9vc3Qoa3Byb2JlX29wY29kZV90ICpvcGNvZGVzKQoraW50IGNhbl9ib29zdChrcHJvYmVfb3Bjb2RlX3QgKm9wY29kZXMpCiB7CiAJa3Byb2JlX29wY29kZV90IG9wY29kZTsKIAlrcHJvYmVfb3Bjb2RlX3QgKm9yaWdfb3Bjb2RlcyA9IG9wY29kZXM7CkBAIC0yNjAsNyArMjY0LDcgQEAKIH0KIAogLyogQ2hlY2sgaWYgcGFkZHIgaXMgYXQgYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnkgKi8KLXN0YXRpYyBpbnQgX19rcHJvYmVzIGNhbl9wcm9iZSh1bnNpZ25lZCBsb25nIHBhZGRyKQorc3RhdGljIGludCBjYW5fcHJvYmUodW5zaWduZWQgbG9uZyBwYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIsIF9fYWRkciwgb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgaW5zbiBpbnNuOwpAQCAtMjk5LDcgKzMwMyw3IEBACiAvKgogICogUmV0dXJucyBub24temVybyBpZiBvcGNvZGUgbW9kaWZpZXMgdGhlIGludGVycnVwdCBmbGFnLgogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBpc19JRl9tb2RpZmllcihrcHJvYmVfb3Bjb2RlX3QgKmluc24pCitzdGF0aWMgaW50IGlzX0lGX21vZGlmaWVyKGtwcm9iZV9vcGNvZGVfdCAqaW5zbikKIHsKIAkvKiBTa2lwIHByZWZpeGVzICovCiAJaW5zbiA9IHNraXBfcHJlZml4ZXMoaW5zbik7CkBAIC0zMjIsNyArMzI2LDcgQEAKICAqIElmIG5vdCwgcmV0dXJuIG51bGwuCiAgKiBPbmx5IGFwcGxpY2FibGUgdG8gNjQtYml0IHg4Ni4KICAqLwotaW50IF9fa3Byb2JlcyBfX2NvcHlfaW5zdHJ1Y3Rpb24odTggKmRlc3QsIHU4ICpzcmMpCitpbnQgX19jb3B5X2luc3RydWN0aW9uKHU4ICpkZXN0LCB1OCAqc3JjKQogewogCXN0cnVjdCBpbnNuIGluc247CiAJa3Byb2JlX29wY29kZV90IGJ1ZltNQVhfSU5TTl9TSVpFXTsKQEAgLTM2NSw3ICszNjksNyBAQAogCXJldHVybiBpbnNuLmxlbmd0aDsKIH0KIAotc3RhdGljIGludCBfX2twcm9iZXMgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIGludCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldDsKIApAQCAtMzkyLDcgKzM5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAoYWx0ZXJuYXRpdmVzX3RleHRfcmVzZXJ2ZWQocC0+YWRkciwgcC0+YWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDA3LDE3ICs0MTEsMTcgQEAKIAlyZXR1cm4gYXJjaF9jb3B5X2twcm9iZShwKTsKIH0KIAotdm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXRleHRfcG9rZShwLT5hZGRyLCAoKHVuc2lnbmVkIGNoYXIgW10pe0JSRUFLUE9JTlRfSU5TVFJVQ1RJT059KSwgMSk7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl0ZXh0X3Bva2UocC0+YWRkciwgJnAtPm9wY29kZSwgMSk7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAocC0+YWluc24uaW5zbikgewogCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAocC0+YWluc24uYm9vc3RhYmxlID09IDEpKTsKQEAgLTQyNSw3ICs0MjksOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19rcHJvYmVzIHNhdmVfcHJldmlvdXNfa3Byb2JlKHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIHZvaWQKK3NhdmVfcHJldmlvdXNfa3Byb2JlKHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCiB7CiAJa2NiLT5wcmV2X2twcm9iZS5rcCA9IGtwcm9iZV9ydW5uaW5nKCk7CiAJa2NiLT5wcmV2X2twcm9iZS5zdGF0dXMgPSBrY2ItPmtwcm9iZV9zdGF0dXM7CkBAIC00MzMsNyArNDM4LDggQEAKIAlrY2ItPnByZXZfa3Byb2JlLnNhdmVkX2ZsYWdzID0ga2NiLT5rcHJvYmVfc2F2ZWRfZmxhZ3M7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXN0b3JlX3ByZXZpb3VzX2twcm9iZShzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQorc3RhdGljIG5va3Byb2JlX2lubGluZSB2b2lkCityZXN0b3JlX3ByZXZpb3VzX2twcm9iZShzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewogCV9fdGhpc19jcHVfd3JpdGUoY3VycmVudF9rcHJvYmUsIGtjYi0+cHJldl9rcHJvYmUua3ApOwogCWtjYi0+a3Byb2JlX3N0YXR1cyA9IGtjYi0+cHJldl9rcHJvYmUuc3RhdHVzOwpAQCAtNDQxLDggKzQ0Nyw5IEBACiAJa2NiLT5rcHJvYmVfc2F2ZWRfZmxhZ3MgPSBrY2ItPnByZXZfa3Byb2JlLnNhdmVkX2ZsYWdzOwogfQogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgc2V0X2N1cnJlbnRfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIHZvaWQKK3NldF9jdXJyZW50X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJICAgc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKIHsKIAlfX3RoaXNfY3B1X3dyaXRlKGN1cnJlbnRfa3Byb2JlLCBwKTsKIAlrY2ItPmtwcm9iZV9zYXZlZF9mbGFncyA9IGtjYi0+a3Byb2JlX29sZF9mbGFncwpAQCAtNDUxLDcgKzQ1OCw3IEBACiAJCWtjYi0+a3Byb2JlX3NhdmVkX2ZsYWdzICY9IH5YODZfRUZMQUdTX0lGOwogfQogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgY2xlYXJfYnRmKHZvaWQpCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIHZvaWQgY2xlYXJfYnRmKHZvaWQpCiB7CiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0JMT0NLU1RFUCkpIHsKIAkJdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bCA9IGdldF9kZWJ1Z2N0bG1zcigpOwpAQCAtNDYxLDcgKzQ2OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdG9yZV9idGYodm9pZCkKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgdm9pZCByZXN0b3JlX2J0Zih2b2lkKQogewogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9CTE9DS1NURVApKSB7CiAJCXVuc2lnbmVkIGxvbmcgZGVidWdjdGwgPSBnZXRfZGVidWdjdGxtc3IoKTsKQEAgLTQ3MSw4ICs0NzgsNyBAQAogCX0KIH0KIAotdm9pZCBfX2twcm9iZXMKLWFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nICpzYXJhID0gc3RhY2tfYWRkcihyZWdzKTsKIApAQCAtNDgxLDkgKzQ4NywxMCBAQAogCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyIHdpdGggdHJhbXBvbGluZSBhZGRyICovCiAJKnNhcmEgPSAodW5zaWduZWQgbG9uZykgJmtyZXRwcm9iZV90cmFtcG9saW5lOwogfQorTk9LUFJPQkVfU1lNQk9MKGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUpOwogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLXNldHVwX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IsIGludCByZWVudGVyKQorc3RhdGljIHZvaWQgc2V0dXBfc2luZ2xlc3RlcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiwgaW50IHJlZW50ZXIpCiB7CiAJaWYgKHNldHVwX2RldG91cl9leGVjdXRpb24ocCwgcmVncywgcmVlbnRlcikpCiAJCXJldHVybjsKQEAgLTUxOSwyMiArNTI2LDI0IEBACiAJZWxzZQogCQlyZWdzLT5pcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CiB9CitOT0tQUk9CRV9TWU1CT0woc2V0dXBfc2luZ2xlc3RlcCk7CiAKIC8qCiAgKiBXZSBoYXZlIHJlZW50ZXJlZCB0aGUga3Byb2JlX2hhbmRsZXIoKSwgc2luY2UgYW5vdGhlciBwcm9iZSB3YXMgaGl0IHdoaWxlCiAgKiB3aXRoaW4gdGhlIGhhbmRsZXIuIFdlIHNhdmUgdGhlIG9yaWdpbmFsIGtwcm9iZXMgdmFyaWFibGVzIGFuZCBqdXN0IHNpbmdsZQogICogc3RlcCBvbiB0aGUgaW5zdHJ1Y3Rpb24gb2YgdGhlIG5ldyBwcm9iZSB3aXRob3V0IGNhbGxpbmcgYW55IHVzZXIgaGFuZGxlcnMuCiAgKi8KLXN0YXRpYyBpbnQgX19rcHJvYmVzCi1yZWVudGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKK3N0YXRpYyBpbnQgcmVlbnRlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgIHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCiB7CiAJc3dpdGNoIChrY2ItPmtwcm9iZV9zdGF0dXMpIHsKIAljYXNlIEtQUk9CRV9ISVRfU1NET05FOgogCWNhc2UgS1BST0JFX0hJVF9BQ1RJVkU6CisJY2FzZSBLUFJPQkVfSElUX1NTOgogCQlrcHJvYmVzX2luY19ubWlzc2VkX2NvdW50KHApOwogCQlzZXR1cF9zaW5nbGVzdGVwKHAsIHJlZ3MsIGtjYiwgMSk7CiAJCWJyZWFrOwotCWNhc2UgS1BST0JFX0hJVF9TUzoKKwljYXNlIEtQUk9CRV9SRUVOVEVSOgogCQkvKiBBIHByb2JlIGhhcyBiZWVuIGhpdCBpbiB0aGUgY29kZXBhdGggbGVhZGluZyB1cCB0bywgb3IganVzdAogCQkgKiBhZnRlciwgc2luZ2xlLXN0ZXBwaW5nIG9mIGEgcHJvYmVkIGluc3RydWN0aW9uLiBUaGlzIGVudGlyZQogCQkgKiBjb2RlcGF0aCBzaG91bGQgc3RyaWN0bHkgcmVzaWRlIGluIC5rcHJvYmVzLnRleHQgc2VjdGlvbi4KQEAgLTU1MywxMiArNTYyLDEzIEBACiAKIAlyZXR1cm4gMTsKIH0KK05PS1BST0JFX1NZTUJPTChyZWVudGVyX2twcm9iZSk7CiAKIC8qCiAgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBhbmQgdGhleQogICogcmVtYWluIGRpc2FibGVkIHRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGludCBfX2twcm9iZXMga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQga3Byb2JlX2ludDNfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlrcHJvYmVfb3Bjb2RlX3QgKmFkZHI7CiAJc3RydWN0IGtwcm9iZSAqcDsKQEAgLTYyMSwxMiArNjMxLDEzIEBACiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV9pbnQzX2hhbmRsZXIpOwogCiAvKgogICogV2hlbiBhIHJldHByb2JlZCBmdW5jdGlvbiByZXR1cm5zLCB0aGlzIGNvZGUgc2F2ZXMgcmVnaXN0ZXJzIGFuZAogICogY2FsbHMgdHJhbXBvbGluZV9oYW5kbGVyKCkgcnVucywgd2hpY2ggY2FsbHMgdGhlIGtyZXRwcm9iZSdzIGhhbmRsZXIuCiAgKi8KLXN0YXRpYyB2b2lkIF9fdXNlZCBfX2twcm9iZXMga3JldHByb2JlX3RyYW1wb2xpbmVfaG9sZGVyKHZvaWQpCitzdGF0aWMgdm9pZCBfX3VzZWQga3JldHByb2JlX3RyYW1wb2xpbmVfaG9sZGVyKHZvaWQpCiB7CiAJYXNtIHZvbGF0aWxlICgKIAkJCSIuZ2xvYmFsIGtyZXRwcm9iZV90cmFtcG9saW5lXG4iCkBAIC02NTcsMTEgKzY2OCwxMyBAQAogI2VuZGlmCiAJCQkiCXJldFxuIik7CiB9CitOT0tQUk9CRV9TWU1CT0woa3JldHByb2JlX3RyYW1wb2xpbmVfaG9sZGVyKTsKK05PS1BST0JFX1NZTUJPTChrcmV0cHJvYmVfdHJhbXBvbGluZSk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSBrcmV0cHJvYmVfdHJhbXBvbGluZQogICovCi1fX3Zpc2libGUgX191c2VkIF9fa3Byb2JlcyB2b2lkICp0cmFtcG9saW5lX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitfX3Zpc2libGUgX191c2VkIHZvaWQgKnRyYW1wb2xpbmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGVtcHR5X3JwOwpAQCAtNzQ3LDYgKzc2MCw3IEBACiAJfQogCXJldHVybiAodm9pZCAqKW9yaWdfcmV0X2FkZHJlc3M7CiB9CitOT0tQUk9CRV9TWU1CT0wodHJhbXBvbGluZV9oYW5kbGVyKTsKIAogLyoKICAqIENhbGxlZCBhZnRlciBzaW5nbGUtc3RlcHBpbmcuICBwLT5hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQpAQCAtNzc1LDggKzc4OSw4IEBACiAgKiBqdW1wIGluc3RydWN0aW9uIGFmdGVyIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24sIHRoYXQganVtcHMgdG8gdGhlIG5leHQKICAqIGluc3RydWN0aW9uIGFmdGVyIHRoZSBwcm9iZXBvaW50LgogICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLXJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCitzdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewogCXVuc2lnbmVkIGxvbmcgKnRvcyA9IHN0YWNrX2FkZHIocmVncyk7CiAJdW5zaWduZWQgbG9uZyBjb3B5X2lwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWluc24uaW5zbjsKQEAgLTg1MSwxMiArODY1LDEzIEBACiBub19jaGFuZ2U6CiAJcmVzdG9yZV9idGYoKTsKIH0KK05PS1BST0JFX1NZTUJPTChyZXN1bWVfZXhlY3V0aW9uKTsKIAogLyoKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBwb3N0X2twcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IGtwcm9iZV9kZWJ1Z19oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmN1ciA9IGtwcm9iZV9ydW5uaW5nKCk7CiAJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CkBAIC04OTEsOCArOTA2LDkgQEAKIAogCXJldHVybiAxOwogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV9kZWJ1Z19oYW5kbGVyKTsKIAotaW50IF9fa3Byb2JlcyBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK2ludCBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKIHsKIAlzdHJ1Y3Qga3Byb2JlICpjdXIgPSBrcHJvYmVfcnVubmluZygpOwogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOwpAQCAtOTQ5LDEyICs5NjUsMTMgQEAKIAogCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV9mYXVsdF9oYW5kbGVyKTsKIAogLyoKICAqIFdyYXBwZXIgcm91dGluZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KICAqLwotaW50IF9fa3Byb2Jlcwota3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCitpbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkgICAgIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gZGF0YTsKIAlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CkBAIC05NjIsMjIgKzk3OSw3IEBACiAJaWYgKGFyZ3MtPnJlZ3MgJiYgdXNlcl9tb2RlX3ZtKGFyZ3MtPnJlZ3MpKQogCQlyZXR1cm4gcmV0OwogCi0Jc3dpdGNoICh2YWwpIHsKLQljYXNlIERJRV9JTlQzOgotCQlpZiAoa3Byb2JlX2hhbmRsZXIoYXJncy0+cmVncykpCi0JCQlyZXQgPSBOT1RJRllfU1RPUDsKLQkJYnJlYWs7Ci0JY2FzZSBESUVfREVCVUc6Ci0JCWlmIChwb3N0X2twcm9iZV9oYW5kbGVyKGFyZ3MtPnJlZ3MpKSB7Ci0JCQkvKgotCQkJICogUmVzZXQgdGhlIEJTIGJpdCBpbiBkcjYgKHBvaW50ZWQgYnkgYXJncy0+ZXJyKSB0bwotCQkJICogZGVub3RlIGNvbXBsZXRpb24gb2YgcHJvY2Vzc2luZwotCQkJICovCi0JCQkoKih1bnNpZ25lZCBsb25nICopRVJSX1BUUihhcmdzLT5lcnIpKSAmPSB+RFJfU1RFUDsKLQkJCXJldCA9IE5PVElGWV9TVE9QOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRElFX0dQRjoKKwlpZiAodmFsID09IERJRV9HUEYpIHsKIAkJLyoKIAkJICogVG8gYmUgcG90ZW50aWFsbHkgcHJvY2Vzc2luZyBhIGtwcm9iZSBmYXVsdCBhbmQgdG8KIAkJICogdHJ1c3QgdGhlIHJlc3VsdCBmcm9tIGtwcm9iZV9ydW5uaW5nKCksIHdlIGhhdmUKQEAgLTk4NiwxNCArOTg4LDEyIEBACiAJCWlmICghcHJlZW1wdGlibGUoKSAmJiBrcHJvYmVfcnVubmluZygpICYmCiAJCSAgICBrcHJvYmVfZmF1bHRfaGFuZGxlcihhcmdzLT5yZWdzLCBhcmdzLT50cmFwbnIpKQogCQkJcmV0ID0gTk9USUZZX1NUT1A7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV9leGNlcHRpb25zX25vdGlmeSk7CiAKLWludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtMTAxNyw4ICsxMDE3LDkgQEAKIAlyZWdzLT5pcCA9ICh1bnNpZ25lZCBsb25nKShqcC0+ZW50cnkpOwogCXJldHVybiAxOwogfQorTk9LUFJPQkVfU1lNQk9MKHNldGptcF9wcmVfaGFuZGxlcik7CiAKLXZvaWQgX19rcHJvYmVzIGpwcm9iZV9yZXR1cm4odm9pZCkKK3ZvaWQganByb2JlX3JldHVybih2b2lkKQogewogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOwogCkBAIC0xMDM0LDggKzEwMzUsMTAgQEAKIAkJCSIgICAgICAgbm9wCQkJXG4iOjoiYiIKIAkJCShrY2ItPmpwcm9iZV9zYXZlZF9zcCk6Im1lbW9yeSIpOwogfQorTk9LUFJPQkVfU1lNQk9MKGpwcm9iZV9yZXR1cm4pOworTk9LUFJPQkVfU1lNQk9MKGpwcm9iZV9yZXR1cm5fZW5kKTsKIAotaW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOwogCXU4ICphZGRyID0gKHU4ICopIChyZWdzLT5pcCAtIDEpOwpAQCAtMTA2MywxMyArMTA2NiwyMiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK05PS1BST0JFX1NZTUJPTChsb25nam1wX2JyZWFrX2hhbmRsZXIpOworCitib29sIGFyY2hfd2l0aGluX2twcm9iZV9ibGFja2xpc3QodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAgKGFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpX19rcHJvYmVzX3RleHRfc3RhcnQgJiYKKwkJIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9lbmQpIHx8CisJCShhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fZW50cnlfdGV4dF9zdGFydCAmJgorCQkgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9fZW50cnlfdGV4dF9lbmQpOworfQogCiBpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2twcm9iZXMgYXJjaF90cmFtcG9saW5lX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IGFyY2hfdHJhbXBvbGluZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2Z0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvZnRyYWNlLmMKaW5kZXggMjNlZjVjNS4uNzE3YjAyYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvZnRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvZnRyYWNlLmMKQEAgLTI1LDggKzI1LDkgQEAKIAogI2luY2x1ZGUgImNvbW1vbi5oIgogCi1zdGF0aWMgaW50IF9fc2tpcF9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJICAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQorc3RhdGljIG5va3Byb2JlX2lubGluZQoraW50IF9fc2tpcF9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkgICAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewogCS8qCiAJICogRW11bGF0ZSBzaW5nbGVzdGVwIChhbmQgYWxzbyByZWNvdmVyIHJlZ3MtPmlwKQpAQCAtNDEsMTggKzQyLDE5IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBfX2twcm9iZXMgc2tpcF9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJICAgICAgc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKK2ludCBza2lwX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCSAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewogCWlmIChrcHJvYmVfZnRyYWNlKHApKQogCQlyZXR1cm4gX19za2lwX3NpbmdsZXN0ZXAocCwgcmVncywga2NiKTsKIAllbHNlCiAJCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKHNraXBfc2luZ2xlc3RlcCk7CiAKIC8qIEZ0cmFjZSBjYWxsYmFjayBoYW5kbGVyIGZvciBrcHJvYmVzICovCi12b2lkIF9fa3Byb2JlcyBrcHJvYmVfZnRyYWNlX2hhbmRsZXIodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXAsCi0JCQkJICAgICBzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQga3Byb2JlX2Z0cmFjZV9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwLAorCQkJICAgc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqcDsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiOwpAQCAtODQsOCArODYsOSBAQAogZW5kOgogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KK05PS1BST0JFX1NZTUJPTChrcHJvYmVfZnRyYWNlX2hhbmRsZXIpOwogCi1pbnQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcHJvYmVfZnRyYWNlKHN0cnVjdCBrcHJvYmUgKnApCitpbnQgYXJjaF9wcmVwYXJlX2twcm9iZV9mdHJhY2Uoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlwLT5haW5zbi5pbnNuID0gTlVMTDsKIAlwLT5haW5zbi5ib29zdGFibGUgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL29wdC5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKaW5kZXggODk4MTYwYi4uZjMwNDc3MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKQEAgLTc3LDcgKzc3LDcgQEAKIH0KIAogLyogSW5zZXJ0IGEgbW92ZSBpbnN0cnVjdGlvbiB3aGljaCBzZXRzIGEgcG9pbnRlciB0byBlYXgvcmRpICgxc3QgYXJnKS4gKi8KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzeW50aGVzaXplX3NldF9hcmcxKGtwcm9iZV9vcGNvZGVfdCAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgdm9pZCBzeW50aGVzaXplX3NldF9hcmcxKGtwcm9iZV9vcGNvZGVfdCAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCSphZGRyKysgPSAweDQ4OwpAQCAtMTM4LDcgKzEzOCw4IEBACiAjZGVmaW5lIElOVDNfU0laRSBzaXplb2Yoa3Byb2JlX29wY29kZV90KQogCiAvKiBPcHRpbWl6ZWQga3Byb2JlIGNhbGwgYmFjayBmdW5jdGlvbjogY2FsbGVkIGZyb20gb3B0aW5zbiAqLwotc3RhdGljIHZvaWQgX19rcHJvYmVzIG9wdGltaXplZF9jYWxsYmFjayhzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQKK29wdGltaXplZF9jYWxsYmFjayhzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNjgsOCArMTY5LDkgQEAKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQorTk9LUFJPQkVfU1lNQk9MKG9wdGltaXplZF9jYWxsYmFjayk7CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIGNvcHlfb3B0aW1pemVkX2luc3RydWN0aW9ucyh1OCAqZGVzdCwgdTggKnNyYykKK3N0YXRpYyBpbnQgY29weV9vcHRpbWl6ZWRfaW5zdHJ1Y3Rpb25zKHU4ICpkZXN0LCB1OCAqc3JjKQogewogCWludCBsZW4gPSAwLCByZXQ7CiAKQEAgLTE4OSw3ICsxOTEsNyBAQAogfQogCiAvKiBDaGVjayB3aGV0aGVyIGluc24gaXMgaW5kaXJlY3QganVtcCAqLwotc3RhdGljIGludCBfX2twcm9iZXMgaW5zbl9pc19pbmRpcmVjdF9qdW1wKHN0cnVjdCBpbnNuICppbnNuKQorc3RhdGljIGludCBpbnNuX2lzX2luZGlyZWN0X2p1bXAoc3RydWN0IGluc24gKmluc24pCiB7CiAJcmV0dXJuICgoaW5zbi0+b3Bjb2RlLmJ5dGVzWzBdID09IDB4ZmYgJiYKIAkJKFg4Nl9NT0RSTV9SRUcoaW5zbi0+bW9kcm0udmFsdWUpICYgNikgPT0gNCkgfHwgLyogSnVtcCAqLwpAQCAtMjI0LDcgKzIyNiw3IEBACiB9CiAKIC8qIERlY29kZSB3aG9sZSBmdW5jdGlvbiB0byBlbnN1cmUgYW55IGluc3RydWN0aW9ucyBkb24ndCBqdW1wIGludG8gdGFyZ2V0ICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBjYW5fb3B0aW1pemUodW5zaWduZWQgbG9uZyBwYWRkcikKK3N0YXRpYyBpbnQgY2FuX29wdGltaXplKHVuc2lnbmVkIGxvbmcgcGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplID0gMCwgb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgaW5zbiBpbnNuOwpAQCAtMjc1LDcgKzI3Nyw3IEBACiB9CiAKIC8qIENoZWNrIG9wdGltaXplZF9rcHJvYmUgY2FuIGFjdHVhbGx5IGJlIG9wdGltaXplZC4gKi8KLWludCBfX2twcm9iZXMgYXJjaF9jaGVja19vcHRpbWl6ZWRfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCkKK2ludCBhcmNoX2NoZWNrX29wdGltaXplZF9rcHJvYmUoc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wKQogewogCWludCBpOwogCXN0cnVjdCBrcHJvYmUgKnA7CkBAIC0yOTAsMTUgKzI5MiwxNSBAQAogfQogCiAvKiBDaGVjayB0aGUgYWRkciBpcyB3aXRoaW4gdGhlIG9wdGltaXplZCBpbnN0cnVjdGlvbnMuICovCi1pbnQgX19rcHJvYmVzCi1hcmNoX3dpdGhpbl9vcHRpbWl6ZWRfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCwgdW5zaWduZWQgbG9uZyBhZGRyKQoraW50IGFyY2hfd2l0aGluX29wdGltaXplZF9rcHJvYmUoc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wLAorCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJcmV0dXJuICgodW5zaWduZWQgbG9uZylvcC0+a3AuYWRkciA8PSBhZGRyICYmCiAJCSh1bnNpZ25lZCBsb25nKW9wLT5rcC5hZGRyICsgb3AtPm9wdGluc24uc2l6ZSA+IGFkZHIpOwogfQogCiAvKiBGcmVlIG9wdGltaXplZCBpbnN0cnVjdGlvbiBzbG90ICovCi1zdGF0aWMgX19rcHJvYmVzCitzdGF0aWMKIHZvaWQgX19hcmNoX3JlbW92ZV9vcHRpbWl6ZWRfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCwgaW50IGRpcnR5KQogewogCWlmIChvcC0+b3B0aW5zbi5pbnNuKSB7CkBAIC0zMDgsNyArMzEwLDcgQEAKIAl9CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX29wdGltaXplZF9rcHJvYmUoc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wKQordm9pZCBhcmNoX3JlbW92ZV9vcHRpbWl6ZWRfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCkKIHsKIAlfX2FyY2hfcmVtb3ZlX29wdGltaXplZF9rcHJvYmUob3AsIDEpOwogfQpAQCAtMzE4LDcgKzMyMCw3IEBACiAgKiBUYXJnZXQgaW5zdHJ1Y3Rpb25zIE1VU1QgYmUgcmVsb2NhdGFibGUgKGNoZWNrZWQgaW5zaWRlKQogICogVGhpcyBpcyBjYWxsZWQgd2hlbiBuZXcgYWdncihvcHQpcHJvYmUgaXMgYWxsb2NhdGVkIG9yIHJldXNlZC4KICAqLwotaW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfb3B0aW1pemVkX2twcm9iZShzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3ApCitpbnQgYXJjaF9wcmVwYXJlX29wdGltaXplZF9rcHJvYmUoc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wKQogewogCXU4ICpidWY7CiAJaW50IHJldDsKQEAgLTM3Miw3ICszNzQsNyBAQAogICogUmVwbGFjZSBicmVha3BvaW50cyAoaW50Mykgd2l0aCByZWxhdGl2ZSBqdW1wcy4KICAqIENhbGxlciBtdXN0IGNhbGwgd2l0aCBsb2NraW5nIGtwcm9iZV9tdXRleCBhbmQgdGV4dF9tdXRleC4KICAqLwotdm9pZCBfX2twcm9iZXMgYXJjaF9vcHRpbWl6ZV9rcHJvYmVzKHN0cnVjdCBsaXN0X2hlYWQgKm9wbGlzdCkKK3ZvaWQgYXJjaF9vcHRpbWl6ZV9rcHJvYmVzKHN0cnVjdCBsaXN0X2hlYWQgKm9wbGlzdCkKIHsKIAlzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3AsICp0bXA7CiAJdTggaW5zbl9idWZbUkVMQVRJVkVKVU1QX1NJWkVdOwpAQCAtMzk4LDcgKzQwMCw3IEBACiB9CiAKIC8qIFJlcGxhY2UgYSByZWxhdGl2ZSBqdW1wIHdpdGggYSBicmVha3BvaW50IChpbnQzKS4gICovCi12b2lkIF9fa3Byb2JlcyBhcmNoX3Vub3B0aW1pemVfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCkKK3ZvaWQgYXJjaF91bm9wdGltaXplX2twcm9iZShzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3ApCiB7CiAJdTggaW5zbl9idWZbUkVMQVRJVkVKVU1QX1NJWkVdOwogCkBAIC00MjQsOCArNDI2LDcgQEAKIAl9CiB9CiAKLWludCAgX19rcHJvYmVzCi1zZXR1cF9kZXRvdXJfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcmVlbnRlcikKK2ludCBzZXR1cF9kZXRvdXJfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcmVlbnRlcikKIHsKIAlzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3A7CiAKQEAgLTQ0MSwzICs0NDIsNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK05PS1BST0JFX1NZTUJPTChzZXR1cF9kZXRvdXJfZXhlY3V0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwppbmRleCA3ZTk3MzcxLi4zZGQ4ZTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCkBAIC0yNTEsOCArMjUxLDkgQEAKIAlyZXR1cm4gcmVhc29uOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYWRfYW5kX3Jlc2V0X3BmX3JlYXNvbik7CitOT0tQUk9CRV9TWU1CT0woa3ZtX3JlYWRfYW5kX3Jlc2V0X3BmX3JlYXNvbik7CiAKLWRvdHJhcGxpbmthZ2Ugdm9pZCBfX2twcm9iZXMKK2RvdHJhcGxpbmthZ2Ugdm9pZAogZG9fYXN5bmNfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CkBAIC0yNzYsNiArMjc3LDcgQEAKIAkJYnJlYWs7CiAJfQogfQorTk9LUFJPQkVfU1lNQk9MKGRvX2FzeW5jX3BhZ2VfZmF1bHQpOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFyYXZpcnRfb3BzX3NldHVwKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKaW5kZXggYjQ4NzJiOS4uYzNlOTg1ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ubWkuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJCWEtPmhhbmRsZXIsIHdob2xlX21zZWNzLCBkZWNpbWFsX21zZWNzKTsKIH0KIAotc3RhdGljIGludCBfX2twcm9iZXMgbm1pX2hhbmRsZSh1bnNpZ25lZCBpbnQgdHlwZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGJvb2wgYjJiKQorc3RhdGljIGludCBubWlfaGFuZGxlKHVuc2lnbmVkIGludCB0eXBlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgYm9vbCBiMmIpCiB7CiAJc3RydWN0IG5taV9kZXNjICpkZXNjID0gbm1pX3RvX2Rlc2ModHlwZSk7CiAJc3RydWN0IG5taWFjdGlvbiAqYTsKQEAgLTE0Niw2ICsxNDYsNyBAQAogCS8qIHJldHVybiB0b3RhbCBudW1iZXIgb2YgTk1JIGV2ZW50cyBoYW5kbGVkICovCiAJcmV0dXJuIGhhbmRsZWQ7CiB9CitOT0tQUk9CRV9TWU1CT0wobm1pX2hhbmRsZSk7CiAKIGludCBfX3JlZ2lzdGVyX25taV9oYW5kbGVyKHVuc2lnbmVkIGludCB0eXBlLCBzdHJ1Y3Qgbm1pYWN0aW9uICphY3Rpb24pCiB7CkBAIC0yMDgsNyArMjA5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfbm1pX2hhbmRsZXIpOwogCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQKK3N0YXRpYyB2b2lkCiBwY2lfc2Vycl9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyogY2hlY2sgdG8gc2VlIGlmIGFueW9uZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlc2UgdHlwZXMgb2YgZXJyb3JzICovCkBAIC0yMzgsOCArMjM5LDkgQEAKIAlyZWFzb24gPSAocmVhc29uICYgTk1JX1JFQVNPTl9DTEVBUl9NQVNLKSB8IE5NSV9SRUFTT05fQ0xFQVJfU0VSUjsKIAlvdXRiKHJlYXNvbiwgTk1JX1JFQVNPTl9QT1JUKTsKIH0KK05PS1BST0JFX1NZTUJPTChwY2lfc2Vycl9lcnJvcik7CiAKLXN0YXRpYyBfX2twcm9iZXMgdm9pZAorc3RhdGljIHZvaWQKIGlvX2NoZWNrX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CkBAIC0yNjksOCArMjcxLDkgQEAKIAlyZWFzb24gJj0gfk5NSV9SRUFTT05fQ0xFQVJfSU9DSEs7CiAJb3V0YihyZWFzb24sIE5NSV9SRUFTT05fUE9SVCk7CiB9CitOT0tQUk9CRV9TWU1CT0woaW9fY2hlY2tfZXJyb3IpOwogCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQKK3N0YXRpYyB2b2lkCiB1bmtub3duX25taV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGhhbmRsZWQ7CkBAIC0yOTgsMTEgKzMwMSwxMiBAQAogCiAJcHJfZW1lcmcoIkRhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7CiB9CitOT0tQUk9CRV9TWU1CT0wodW5rbm93bl9ubWlfZXJyb3IpOwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwgc3dhbGxvd19ubWkpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGxhc3Rfbm1pX3JpcCk7CiAKLXN0YXRpYyBfX2twcm9iZXMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIGRlZmF1bHRfZG9fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gMDsKIAlpbnQgaGFuZGxlZDsKQEAgLTQwMSw2ICs0MDUsNyBAQAogCWVsc2UKIAkJdW5rbm93bl9ubWlfZXJyb3IocmVhc29uLCByZWdzKTsKIH0KK05PS1BST0JFX1NZTUJPTChkZWZhdWx0X2RvX25taSk7CiAKIC8qCiAgKiBOTUlzIGNhbiBoaXQgYnJlYWtwb2ludHMgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBsb3NlIGl0cwpAQCAtNTIwLDcgKzUyNSw3IEBACiB9CiAjZW5kaWYKIAotZG90cmFwbGlua2FnZSBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCitkb3RyYXBsaW5rYWdlIG5vdHJhY2Ugdm9pZAogZG9fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCiB7CiAJbm1pX25lc3RpbmdfcHJlcHJvY2VzcyhyZWdzKTsKQEAgLTUzNyw2ICs1NDIsNyBAQAogCS8qIE9uIGkzODYsIG1heSBsb29wIGJhY2sgdG8gcHJlcHJvY2VzcyAqLwogCW5taV9uZXN0aW5nX3Bvc3Rwcm9jZXNzKCk7CiB9CitOT0tQUk9CRV9TWU1CT0woZG9fbm1pKTsKIAogdm9pZCBzdG9wX25taSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwppbmRleCAxYjEwYWY4Li41NDhkMjVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CkBAIC0zODksNiArMzkwLDExIEBACiAJLmVuZF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X25vcCwKIH07CiAKKy8qIEF0IHRoaXMgcG9pbnQsIG5hdGl2ZV9nZXQvc2V0X2RlYnVncmVnIGhhcyByZWFsIGZ1bmN0aW9uIGVudHJpZXMgKi8KK05PS1BST0JFX1NZTUJPTChuYXRpdmVfZ2V0X2RlYnVncmVnKTsKK05PS1BST0JFX1NZTUJPTChuYXRpdmVfc2V0X2RlYnVncmVnKTsKK05PS1BST0JFX1NZTUJPTChuYXRpdmVfbG9hZF9pZHQpOworCiBzdHJ1Y3QgcHZfYXBpY19vcHMgcHZfYXBpY19vcHMgPSB7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJLnN0YXJ0dXBfaXBpX2hvb2sgPSBwYXJhdmlydF9ub3AsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCA4OThkMDc3Li5jYTViMDJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTQxMywxMiArNDEzLDExIEBACiAJc2V0X3RocmVhZF9mbGFnKFRJRl9BRERSMzIpOwogCiAJLyogTWFyayB0aGUgYXNzb2NpYXRlZCBtbSBhcyBjb250YWluaW5nIDMyLWJpdCB0YXNrcy4gKi8KLQlpZiAoY3VycmVudC0+bW0pCi0JCWN1cnJlbnQtPm1tLT5jb250ZXh0LmlhMzJfY29tcGF0ID0gMTsKLQogCWlmICh4MzIpIHsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lBMzIpOwogCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1gzMik7CisJCWlmIChjdXJyZW50LT5tbSkKKwkJCWN1cnJlbnQtPm1tLT5jb250ZXh0LmlhMzJfY29tcGF0ID0gVElGX1gzMjsKIAkJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gflJFQURfSU1QTElFU19FWEVDOwogCQkvKiBpc19jb21wYXRfdGFzaygpIHVzZXMgdGhlIHByZXNlbmNlIG9mIHRoZSB4MzIKIAkJICAgc3lzY2FsbCBiaXQgZmxhZyB0byBkZXRlcm1pbmUgY29tcGF0IHN0YXR1cyAqLwpAQCAtNDI2LDYgKzQyNSw4IEBACiAJfSBlbHNlIHsKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1gzMik7CisJCWlmIChjdXJyZW50LT5tbSkKKwkJCWN1cnJlbnQtPm1tLT5jb250ZXh0LmlhMzJfY29tcGF0ID0gVElGX0lBMzI7CiAJCWN1cnJlbnQtPnBlcnNvbmFsaXR5IHw9IGZvcmNlX3BlcnNvbmFsaXR5MzI7CiAJCS8qIFByZXBhcmUgdGhlIGZpcnN0ICJyZXR1cm4iIHRvIHVzZXIgc3BhY2UgKi8KIAkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfQ09NUEFUOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCBmNzNiNWQ0Li5jNmViNDE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vwcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0xMDYsNyArMTA3LDcgQEAKIAlwcmVlbXB0X2NvdW50X2RlYygpOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2Jlcworc3RhdGljIG5va3Byb2JlX2lubGluZSBpbnQKIGRvX3RyYXBfbm9fc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgdHJhcG5yLCBjaGFyICpzdHIsCiAJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCWxvbmcgZXJyb3JfY29kZSkKIHsKQEAgLTEzNiw3ICsxMzcsMzggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2Jlcworc3RhdGljIHNpZ2luZm9fdCAqZmlsbF90cmFwX2luZm8oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzaWduciwgaW50IHRyYXBuciwKKwkJCQlzaWdpbmZvX3QgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBzaWFkZHI7CisJaW50IHNpY29kZTsKKworCXN3aXRjaCAodHJhcG5yKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFNFTkRfU0lHX1BSSVY7CisKKwljYXNlIFg4Nl9UUkFQX0RFOgorCQlzaWNvZGUgPSBGUEVfSU5URElWOworCQlzaWFkZHIgPSB1cHJvYmVfZ2V0X3RyYXBfYWRkcihyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBYODZfVFJBUF9VRDoKKwkJc2ljb2RlID0gSUxMX0lMTE9QTjsKKwkJc2lhZGRyID0gdXByb2JlX2dldF90cmFwX2FkZHIocmVncyk7CisJCWJyZWFrOworCWNhc2UgWDg2X1RSQVBfQUM6CisJCXNpY29kZSA9IEJVU19BRFJBTE47CisJCXNpYWRkciA9IDA7CisJCWJyZWFrOworCX0KKworCWluZm8tPnNpX3NpZ25vID0gc2lnbnI7CisJaW5mby0+c2lfZXJybm8gPSAwOworCWluZm8tPnNpX2NvZGUgPSBzaWNvZGU7CisJaW5mby0+c2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXNpYWRkcjsKKwlyZXR1cm4gaW5mbzsKK30KKworc3RhdGljIHZvaWQKIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCWxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQogewpAQCAtMTY4LDYwICsyMDAsNDMgQEAKIAl9CiAjZW5kaWYKIAotCWlmIChpbmZvKQotCQlmb3JjZV9zaWdfaW5mbyhzaWduciwgaW5mbywgdHNrKTsKLQllbHNlCi0JCWZvcmNlX3NpZyhzaWduciwgdHNrKTsKKwlmb3JjZV9zaWdfaW5mbyhzaWduciwgaW5mbyA/OiBTRU5EX1NJR19QUklWLCB0c2spOworfQorTk9LUFJPQkVfU1lNQk9MKGRvX3RyYXApOworCitzdGF0aWMgdm9pZCBkb19lcnJvcl90cmFwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUsIGNoYXIgKnN0ciwKKwkJCSAgdW5zaWduZWQgbG9uZyB0cmFwbnIsIGludCBzaWducikKK3sKKwllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSAhPQorCQkJTk9USUZZX1NUT1ApIHsKKwkJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOworCQlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgcmVncywgZXJyb3JfY29kZSwKKwkJCWZpbGxfdHJhcF9pbmZvKHJlZ3MsIHNpZ25yLCB0cmFwbnIsICZpbmZvKSk7CisJfQorCisJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiB9CiAKICNkZWZpbmUgRE9fRVJST1IodHJhcG5yLCBzaWduciwgc3RyLCBuYW1lKQkJCQlcCiBkb3RyYXBsaW5rYWdlIHZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCVwKIHsJCQkJCQkJCQlcCi0JZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsJCQkJCVwKLQkJCQkJCQkJCVwKLQlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CQkJCQlcCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwJCQlcCi0JCQl0cmFwbnIsIHNpZ25yKSA9PSBOT1RJRllfU1RPUCkgewkJXAotCQlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsJCQkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwkJCQkJCVwKLQlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CQlcCi0JZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CQkJCQlcCisJZG9fZXJyb3JfdHJhcChyZWdzLCBlcnJvcl9jb2RlLCBzdHIsIHRyYXBuciwgc2lnbnIpOwkJXAogfQogCi0jZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikJCVwKLWRvdHJhcGxpbmthZ2Ugdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkJXAotewkJCQkJCQkJCVwKLQlzaWdpbmZvX3QgaW5mbzsJCQkJCQkJXAotCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CQkJCQlcCi0JCQkJCQkJCQlcCi0JaW5mby5zaV9zaWdubyA9IHNpZ25yOwkJCQkJCVwKLQlpbmZvLnNpX2Vycm5vID0gMDsJCQkJCQlcCi0JaW5mby5zaV9jb2RlID0gc2ljb2RlOwkJCQkJCVwKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7CQkJCVwKLQlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CQkJCQlcCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwJCQlcCi0JCQl0cmFwbnIsIHNpZ25yKSA9PSBOT1RJRllfU1RPUCkgewkJXAotCQlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsJCQkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwkJCQkJCVwKLQlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOwkJXAotCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwkJCQkJXAotfQotCi1ET19FUlJPUl9JTkZPKFg4Nl9UUkFQX0RFLCAgICAgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsCQkJZGl2aWRlX2Vycm9yLAkJICAgICBGUEVfSU5URElWLCByZWdzLT5pcCApCi1ET19FUlJPUiAgICAgKFg4Nl9UUkFQX09GLCAgICAgU0lHU0VHViwgIm92ZXJmbG93IiwJCQlvdmVyZmxvdwkJCQkJICApCi1ET19FUlJPUiAgICAgKFg4Nl9UUkFQX0JSLCAgICAgU0lHU0VHViwgImJvdW5kcyIsCQkJYm91bmRzCQkJCQkJICApCi1ET19FUlJPUl9JTkZPKFg4Nl9UUkFQX1VELCAgICAgU0lHSUxMLCAgImludmFsaWQgb3Bjb2RlIiwJCWludmFsaWRfb3AsCQkgICAgIElMTF9JTExPUE4sIHJlZ3MtPmlwICkKLURPX0VSUk9SICAgICAoWDg2X1RSQVBfT0xEX01GLCBTSUdGUEUsICAiY29wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuIiwJY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuCQkJICApCi1ET19FUlJPUiAgICAgKFg4Nl9UUkFQX1RTLCAgICAgU0lHU0VHViwgImludmFsaWQgVFNTIiwJCQlpbnZhbGlkX1RTUwkJCQkJICApCi1ET19FUlJPUiAgICAgKFg4Nl9UUkFQX05QLCAgICAgU0lHQlVTLCAgInNlZ21lbnQgbm90IHByZXNlbnQiLAkJc2VnbWVudF9ub3RfcHJlc2VudAkJCQkgICkKK0RPX0VSUk9SKFg4Nl9UUkFQX0RFLCAgICAgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsCQlkaXZpZGVfZXJyb3IpCitET19FUlJPUihYODZfVFJBUF9PRiwgICAgIFNJR1NFR1YsICJvdmVyZmxvdyIsCQkJb3ZlcmZsb3cpCitET19FUlJPUihYODZfVFJBUF9CUiwgICAgIFNJR1NFR1YsICJib3VuZHMiLAkJCWJvdW5kcykKK0RPX0VSUk9SKFg4Nl9UUkFQX1VELCAgICAgU0lHSUxMLCAgImludmFsaWQgb3Bjb2RlIiwJCWludmFsaWRfb3ApCitET19FUlJPUihYODZfVFJBUF9PTERfTUYsIFNJR0ZQRSwgICJjb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bikKK0RPX0VSUk9SKFg4Nl9UUkFQX1RTLCAgICAgU0lHU0VHViwgImludmFsaWQgVFNTIiwJCWludmFsaWRfVFNTKQorRE9fRVJST1IoWDg2X1RSQVBfTlAsICAgICBTSUdCVVMsICAic2VnbWVudCBub3QgcHJlc2VudCIsCXNlZ21lbnRfbm90X3ByZXNlbnQpCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotRE9fRVJST1IgICAgIChYODZfVFJBUF9TUywgICAgIFNJR0JVUywgICJzdGFjayBzZWdtZW50IiwJCXN0YWNrX3NlZ21lbnQJCQkJCSAgKQorRE9fRVJST1IoWDg2X1RSQVBfU1MsICAgICBTSUdCVVMsICAic3RhY2sgc2VnbWVudCIsCQlzdGFja19zZWdtZW50KQogI2VuZGlmCi1ET19FUlJPUl9JTkZPKFg4Nl9UUkFQX0FDLCAgICAgU0lHQlVTLCAgImFsaWdubWVudCBjaGVjayIsCQlhbGlnbm1lbnRfY2hlY2ssCSAgICAgQlVTX0FEUkFMTiwgMAkgICkKK0RPX0VSUk9SKFg4Nl9UUkFQX0FDLCAgICAgU0lHQlVTLCAgImFsaWdubWVudCBjaGVjayIsCQlhbGlnbm1lbnRfY2hlY2spCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAvKiBSdW5zIG9uIElTVCBzdGFjayAqLwpAQCAtMjYzLDcgKzI3OCw3IEBACiB9CiAjZW5kaWYKIAotZG90cmFwbGlua2FnZSB2b2lkIF9fa3Byb2JlcworZG90cmFwbGlua2FnZSB2b2lkCiBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKQEAgLTMwNSwxMyArMzIwLDE0IEBACiAJCXByX2NvbnQoIlxuIik7CiAJfQogCi0JZm9yY2Vfc2lnKFNJR1NFR1YsIHRzayk7CisJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgU0VORF9TSUdfUFJJViwgdHNrKTsKIGV4aXQ6CiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiB9CitOT0tQUk9CRV9TWU1CT0woZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKTsKIAogLyogTWF5IHJ1biBvbiBJU1Qgc3RhY2suICovCi1kb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzIG5vdHJhY2UgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQorZG90cmFwbGlua2FnZSB2b2lkIG5vdHJhY2UgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CiAKQEAgLTMyNywxMyArMzQzLDE4IEBACiAJaWYgKHBva2VfaW50M19oYW5kbGVyKHJlZ3MpKQogCQlyZXR1cm47CiAKLQlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CiAjaWZkZWYgQ09ORklHX0tHREJfTE9XX0xFVkVMX1RSQVAKIAlpZiAoa2dkYl9sbF90cmFwKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIFg4Nl9UUkFQX0JQLAogCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQogCQlnb3RvIGV4aXQ7CiAjZW5kaWYgLyogQ09ORklHX0tHREJfTE9XX0xFVkVMX1RSQVAgKi8KIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCisJaWYgKGtwcm9iZV9pbnQzX2hhbmRsZXIocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKKwogCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIFg4Nl9UUkFQX0JQLAogCQkJU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCiAJCWdvdG8gZXhpdDsKQEAgLTM1MCw2ICszNzEsNyBAQAogZXhpdDoKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIH0KK05PS1BST0JFX1NZTUJPTChkb19pbnQzKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIC8qCkBAIC0zNTcsNyArMzc5LDcgQEAKICAqIGZvciBzY2hlZHVsaW5nIG9yIHNpZ25hbCBoYW5kbGluZy4gVGhlIGFjdHVhbCBzdGFjayBzd2l0Y2ggaXMgZG9uZSBpbgogICogZW50cnkuUwogICovCi1hc21saW5rYWdlIF9fdmlzaWJsZSBfX2twcm9iZXMgc3RydWN0IHB0X3JlZ3MgKnN5bmNfcmVncyhzdHJ1Y3QgcHRfcmVncyAqZXJlZ3MpCithc21saW5rYWdlIF9fdmlzaWJsZSBzdHJ1Y3QgcHRfcmVncyAqc3luY19yZWdzKHN0cnVjdCBwdF9yZWdzICplcmVncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGVyZWdzOwogCS8qIERpZCBhbHJlYWR5IHN5bmMgKi8KQEAgLTM3Niw2ICszOTgsNyBAQAogCQkqcmVncyA9ICplcmVnczsKIAlyZXR1cm4gcmVnczsKIH0KK05PS1BST0JFX1NZTUJPTChzeW5jX3JlZ3MpOwogI2VuZGlmCiAKIC8qCkBAIC00MDIsNyArNDI1LDcgQEAKICAqCiAgKiBNYXkgcnVuIG9uIElTVCBzdGFjay4KICAqLwotZG90cmFwbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQorZG90cmFwbGlua2FnZSB2b2lkIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGU7CkBAIC00MTAsOCArNDMzLDYgQEAKIAl1bnNpZ25lZCBsb25nIGRyNjsKIAlpbnQgc2lfY29kZTsKIAotCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKLQogCWdldF9kZWJ1Z3JlZyhkcjYsIDYpOwogCiAJLyogRmlsdGVyIG91dCBhbGwgdGhlIHJlc2VydmVkIGJpdHMgd2hpY2ggYXJlIHByZXNldCB0byAxICovCkBAIC00NDAsNiArNDYxLDEyIEBACiAJLyogU3RvcmUgdGhlIHZpcnR1YWxpemVkIERSNiB2YWx1ZSAqLwogCXRzay0+dGhyZWFkLmRlYnVncmVnNiA9IGRyNjsKIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCisJaWYgKGtwcm9iZV9kZWJ1Z19oYW5kbGVyKHJlZ3MpKQorCQlnb3RvIGV4aXQ7CisjZW5kaWYKKwlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CisKIAlpZiAobm90aWZ5X2RpZShESUVfREVCVUcsICJkZWJ1ZyIsIHJlZ3MsIChsb25nKSZkcjYsIGVycm9yX2NvZGUsCiAJCQkJCQkJU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCiAJCWdvdG8gZXhpdDsKQEAgLTQ4MiwxMyArNTA5LDE0IEBACiBleGl0OgogCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogfQorTk9LUFJPQkVfU1lNQk9MKGRvX2RlYnVnKTsKIAogLyoKICAqIE5vdGUgdGhhdCB3ZSBwbGF5IGFyb3VuZCB3aXRoIHRoZSAnVFMnIGJpdCBpbiBhbiBhdHRlbXB0IHRvIGdldAogICogdGhlIGNvcnJlY3QgYmVoYXZpb3VyIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHRoZSBhc3luY2hyb25vdXMKICAqIElSUTEzIGJlaGF2aW91cgogICovCi12b2lkIG1hdGhfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlcnJvcl9jb2RlLCBpbnQgdHJhcG5yKQorc3RhdGljIHZvaWQgbWF0aF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVycm9yX2NvZGUsIGludCB0cmFwbnIpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKIAlzaWdpbmZvX3QgaW5mbzsKQEAgLTUxOCw3ICs1NDYsNyBAQAogCXRhc2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKIAlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOwogCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXJlZ3MtPmlwOworCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXVwcm9iZV9nZXRfdHJhcF9hZGRyKHJlZ3MpOwogCWlmICh0cmFwbnIgPT0gWDg2X1RSQVBfTUYpIHsKIAkJdW5zaWduZWQgc2hvcnQgY3dkLCBzd2Q7CiAJCS8qCkBAIC02NDUsNyArNjczLDcgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkocmVzdG9yZV9mcHVfY2hlY2tpbmcodHNrKSkpIHsKIAkJZHJvcF9pbml0X2ZwdSh0c2spOwotCQlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgU0VORF9TSUdfUFJJViwgdHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjUzLDcgKzY4MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtYXRoX3N0YXRlX3Jlc3RvcmUpOwogCi1kb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzCitkb3RyYXBsaW5rYWdlIHZvaWQKIGRvX2RldmljZV9ub3RfYXZhaWxhYmxlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCiB7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKQEAgLTY3OSw2ICs3MDcsNyBAQAogI2VuZGlmCiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiB9CitOT0tQUk9CRV9TWU1CT0woZG9fZGV2aWNlX25vdF9hdmFpbGFibGUpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogZG90cmFwbGlua2FnZSB2b2lkIGRvX2lyZXRfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jCmluZGV4IGFjZTIyOTEuLjVkMWNiZmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC91cHJvYmVzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYwpAQCAtMzIsMjAgKzMyLDIwIEBACiAKIC8qIFBvc3QtZXhlY3V0aW9uIGZpeHVwcy4gKi8KIAotLyogTm8gZml4dXAgbmVlZGVkICovCi0jZGVmaW5lIFVQUk9CRV9GSVhfTk9ORQkJMHgwCi0KIC8qIEFkanVzdCBJUCBiYWNrIHRvIHZpY2luaXR5IG9mIGFjdHVhbCBpbnNuICovCi0jZGVmaW5lIFVQUk9CRV9GSVhfSVAJCTB4MQorI2RlZmluZSBVUFJPQkVfRklYX0lQCQkweDAxCiAKIC8qIEFkanVzdCB0aGUgcmV0dXJuIGFkZHJlc3Mgb2YgYSBjYWxsIGluc24gKi8KLSNkZWZpbmUgVVBST0JFX0ZJWF9DQUxMCTB4MgorI2RlZmluZSBVUFJPQkVfRklYX0NBTEwJCTB4MDIKIAogLyogSW5zdHJ1Y3Rpb24gd2lsbCBtb2RpZnkgVEYsIGRvbid0IGNoYW5nZSBpdCAqLwotI2RlZmluZSBVUFJPQkVfRklYX1NFVEYJMHg0CisjZGVmaW5lIFVQUk9CRV9GSVhfU0VURgkJMHgwNAogCi0jZGVmaW5lIFVQUk9CRV9GSVhfUklQX0FYCTB4ODAwMAotI2RlZmluZSBVUFJPQkVfRklYX1JJUF9DWAkweDQwMDAKKyNkZWZpbmUgVVBST0JFX0ZJWF9SSVBfU0kJMHgwOAorI2RlZmluZSBVUFJPQkVfRklYX1JJUF9ESQkweDEwCisjZGVmaW5lIFVQUk9CRV9GSVhfUklQX0JYCTB4MjAKKyNkZWZpbmUgVVBST0JFX0ZJWF9SSVBfTUFTSwlcCisJKFVQUk9CRV9GSVhfUklQX1NJIHwgVVBST0JFX0ZJWF9SSVBfREkgfCBVUFJPQkVfRklYX1JJUF9CWCkKIAogI2RlZmluZQlVUFJPQkVfVFJBUF9OUgkJVUlOVF9NQVgKIApAQCAtNjcsNiArNjcsNyBAQAogICogdG8ga2VlcCBnY2MgZnJvbSBzdGF0aWNhbGx5IG9wdGltaXppbmcgaXQgb3V0LCBhcyB2YXJpYWJsZV90ZXN0X2JpdCBtYWtlcwogICogc29tZSB2ZXJzaW9ucyBvZiBnY2MgdG8gdGhpbmsgb25seSAqKHVuc2lnbmVkIGxvbmcqKSBpcyB1c2VkLgogICovCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBkZWZpbmVkKENPTkZJR19JQTMyX0VNVUxBVElPTikKIHN0YXRpYyB2b2xhdGlsZSB1MzIgZ29vZF9pbnNuc18zMlsyNTYgLyAzMl0gPSB7CiAJLyogICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICBhICBiICBjICBkICBlICBmICAgICAgICAgKi8KIAkvKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAqLwpAQCAtODksNiArOTAsMzcgQEAKIAkvKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAqLwogCS8qICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZiAgICAgICAgICovCiB9OworI2Vsc2UKKyNkZWZpbmUgZ29vZF9pbnNuc18zMglOVUxMCisjZW5kaWYKKworLyogR29vZC1pbnN0cnVjdGlvbiB0YWJsZXMgZm9yIDY0LWJpdCBhcHBzICovCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorc3RhdGljIHZvbGF0aWxlIHUzMiBnb29kX2luc25zXzY0WzI1NiAvIDMyXSA9IHsKKwkvKiAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgIGEgIGIgIGMgIGQgIGUgIGYgICAgICAgICAqLworCS8qICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICovCisJVygweDAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwKSB8IC8qIDAwICovCisJVygweDEwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwKSAsIC8qIDEwICovCisJVygweDIwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwKSB8IC8qIDIwICovCisJVygweDMwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwKSAsIC8qIDMwICovCisJVygweDQwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSB8IC8qIDQwICovCisJVygweDUwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSAsIC8qIDUwICovCisJVygweDYwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwKSB8IC8qIDYwICovCisJVygweDcwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSAsIC8qIDcwICovCisJVygweDgwLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB8IC8qIDgwICovCisJVygweDkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSAsIC8qIDkwICovCisJVygweGEwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB8IC8qIGEwICovCisJVygweGIwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSAsIC8qIGIwICovCisJVygweGMwLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwKSB8IC8qIGMwICovCisJVygweGQwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSAsIC8qIGQwICovCisJVygweGUwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwKSB8IC8qIGUwICovCisJVygweGYwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxKSAgIC8qIGYwICovCisJLyogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgKi8KKwkvKiAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgIGEgIGIgIGMgIGQgIGUgIGYgICAgICAgICAqLworfTsKKyNlbHNlCisjZGVmaW5lIGdvb2RfaW5zbnNfNjQJTlVMTAorI2VuZGlmCiAKIC8qIFVzaW5nIHRoaXMgZm9yIGJvdGggNjQtYml0IGFuZCAzMi1iaXQgYXBwcyAqLwogc3RhdGljIHZvbGF0aWxlIHUzMiBnb29kXzJieXRlX2luc25zWzI1NiAvIDMyXSA9IHsKQEAgLTExMywzMiArMTQ1LDYgQEAKIAkvKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAqLwogCS8qICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZiAgICAgICAgICovCiB9OwotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotLyogR29vZC1pbnN0cnVjdGlvbiB0YWJsZXMgZm9yIDY0LWJpdCBhcHBzICovCi1zdGF0aWMgdm9sYXRpbGUgdTMyIGdvb2RfaW5zbnNfNjRbMjU2IC8gMzJdID0gewotCS8qICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZiAgICAgICAgICovCi0JLyogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgKi8KLQlXKDB4MDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDApIHwgLyogMDAgKi8KLQlXKDB4MTAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDApICwgLyogMTAgKi8KLQlXKDB4MjAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDApIHwgLyogMjAgKi8KLQlXKDB4MzAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDApICwgLyogMzAgKi8KLQlXKDB4NDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApIHwgLyogNDAgKi8KLQlXKDB4NTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpICwgLyogNTAgKi8KLQlXKDB4NjAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDApIHwgLyogNjAgKi8KLQlXKDB4NzAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpICwgLyogNzAgKi8KLQlXKDB4ODAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHwgLyogODAgKi8KLQlXKDB4OTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpICwgLyogOTAgKi8KLQlXKDB4YTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHwgLyogYTAgKi8KLQlXKDB4YjAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpICwgLyogYjAgKi8KLQlXKDB4YzAsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDApIHwgLyogYzAgKi8KLQlXKDB4ZDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpICwgLyogZDAgKi8KLQlXKDB4ZTAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDApIHwgLyogZTAgKi8KLQlXKDB4ZjAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEpICAgLyogZjAgKi8KLQkvKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAqLwotCS8qICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZiAgICAgICAgICovCi19OwotI2VuZGlmCiAjdW5kZWYgVwogCiAvKgpAQCAtMjA5LDE2ICsyMTUsMjUgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbnQgdmFsaWRhdGVfaW5zbl8zMmJpdHMoc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgaW5zbiAqaW5zbikKK3N0YXRpYyBpbnQgdXByb2JlX2luaXRfaW5zbihzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBpbnNuICppbnNuLCBib29sIHg4Nl82NCkKIHsKLQlpbnNuX2luaXQoaW5zbiwgYXVwcm9iZS0+aW5zbiwgZmFsc2UpOworCXUzMiB2b2xhdGlsZSAqZ29vZF9pbnNuczsKIAotCS8qIFNraXAgZ29vZCBpbnN0cnVjdGlvbiBwcmVmaXhlczsgcmVqZWN0ICJiYWQiIG9uZXMuICovCi0JaW5zbl9nZXRfb3Bjb2RlKGluc24pOworCWluc25faW5pdChpbnNuLCBhdXByb2JlLT5pbnNuLCB4ODZfNjQpOworCS8qIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcHJvY2Vzc2luZyB0aGUgZW50aXJlIGluc3RydWN0aW9uICovCisJaW5zbl9nZXRfbGVuZ3RoKGluc24pOworCWlmIChXQVJOX09OX09OQ0UoIWluc25fY29tcGxldGUoaW5zbikpKQorCQlyZXR1cm4gLUVOT0VYRUM7CisKIAlpZiAoaXNfcHJlZml4X2JhZChpbnNuKSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAotCWlmICh0ZXN0X2JpdChPUENPREUxKGluc24pLCAodW5zaWduZWQgbG9uZyAqKWdvb2RfaW5zbnNfMzIpKQorCWlmICh4ODZfNjQpCisJCWdvb2RfaW5zbnMgPSBnb29kX2luc25zXzY0OworCWVsc2UKKwkJZ29vZF9pbnNucyA9IGdvb2RfaW5zbnNfMzI7CisKKwlpZiAodGVzdF9iaXQoT1BDT0RFMShpbnNuKSwgKHVuc2lnbmVkIGxvbmcgKilnb29kX2luc25zKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaW5zbi0+b3Bjb2RlLm5ieXRlcyA9PSAyKSB7CkBAIC0yMzAsMTQgKzI0NSwxOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAorc3RhdGljIGlubGluZSBib29sIGlzXzY0Yml0X21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXJldHVybgkhY29uZmlnX2VuYWJsZWQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSB8fAorCQkhKG1tLT5jb250ZXh0LmlhMzJfY29tcGF0ID09IFRJRl9JQTMyKTsKK30KIC8qCiAgKiBJZiBhcmNoX3Vwcm9iZS0+aW5zbiBkb2Vzbid0IHVzZSByaXAtcmVsYXRpdmUgYWRkcmVzc2luZywgcmV0dXJuCiAgKiBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgcmV3cml0ZSB0aGUgaW5zdHJ1Y3Rpb24gc28gdGhhdCBpdCBhY2Nlc3NlcwogICogaXRzIG1lbW9yeSBvcGVyYW5kIGluZGlyZWN0bHkgdGhyb3VnaCBhIHNjcmF0Y2ggcmVnaXN0ZXIuICBTZXQKLSAqIGFyY2hfdXByb2JlLT5maXh1cHMgYW5kIGFyY2hfdXByb2JlLT5yaXBfcmVsYV90YXJnZXRfYWRkcmVzcwotICogYWNjb3JkaW5nbHkuICAoVGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIHdpbGwgYmUgc2F2ZWQKLSAqIGJlZm9yZSB3ZSBzaW5nbGUtc3RlcCB0aGUgbW9kaWZpZWQgaW5zdHJ1Y3Rpb24sIGFuZCByZXN0b3JlZAotICogYWZ0ZXJ3YXJkLikKKyAqIGRlZnBhcmFtLT5maXh1cHMgYWNjb3JkaW5nbHkuIChUaGUgY29udGVudHMgb2YgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIKKyAqIHdpbGwgYmUgc2F2ZWQgYmVmb3JlIHdlIHNpbmdsZS1zdGVwIHRoZSBtb2RpZmllZCBpbnN0cnVjdGlvbiwKKyAqIGFuZCByZXN0b3JlZCBhZnRlcndhcmQpLgogICoKICAqIFdlIGRvIHRoaXMgYmVjYXVzZSBhIHJpcC1yZWxhdGl2ZSBpbnN0cnVjdGlvbiBjYW4gYWNjZXNzIG9ubHkgYQogICogcmVsYXRpdmVseSBzbWFsbCBhcmVhICgrLy0gMiBHQiBmcm9tIHRoZSBpbnN0cnVjdGlvbiksIGFuZCB0aGUgWE9MCkBAIC0yNDgsMTY0ICsyNjcsMTkyIEBACiAgKgogICogU29tZSB1c2VmdWwgZmFjdHMgYWJvdXQgcmlwLXJlbGF0aXZlIGluc3RydWN0aW9uczoKICAqCi0gKiAgLSBUaGVyZSdzIGFsd2F5cyBhIG1vZHJtIGJ5dGUuCisgKiAgLSBUaGVyZSdzIGFsd2F5cyBhIG1vZHJtIGJ5dGUgd2l0aCBiaXQgbGF5b3V0ICIwMCByZWcgMTAxIi4KICAqICAtIFRoZXJlJ3MgbmV2ZXIgYSBTSUIgYnl0ZS4KICAqICAtIFRoZSBkaXNwbGFjZW1lbnQgaXMgYWx3YXlzIDQgYnl0ZXMuCisgKiAgLSBSRVguQj0xIGJpdCBpbiBSRVggcHJlZml4LCB3aGljaCBub3JtYWxseSBleHRlbmRzIHIvbSBmaWVsZCwKKyAqICAgIGhhcyBubyBlZmZlY3Qgb24gcmlwLXJlbGF0aXZlIG1vZGUuIEl0IGRvZXNuJ3QgbWFrZSBtb2RybSBieXRlCisgKiAgICB3aXRoIHIvbT0xMDEgcmVmZXIgdG8gcmVnaXN0ZXIgMTEwMSA9IFIxMy4KICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9yaXByZWxfaW5zbihzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBpbnNuICppbnNuKQorc3RhdGljIHZvaWQgcmlwcmVsX2FuYWx5emUoc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgaW5zbiAqaW5zbikKIHsKIAl1OCAqY3Vyc29yOwogCXU4IHJlZzsKKwl1OCByZWcyOwogCiAJaWYgKCFpbnNuX3JpcF9yZWxhdGl2ZShpbnNuKSkKIAkJcmV0dXJuOwogCiAJLyoKLQkgKiBpbnNuX3JpcF9yZWxhdGl2ZSgpIHdvdWxkIGhhdmUgZGVjb2RlZCByZXhfcHJlZml4LCBtb2RybS4KKwkgKiBpbnNuX3JpcF9yZWxhdGl2ZSgpIHdvdWxkIGhhdmUgZGVjb2RlZCByZXhfcHJlZml4LCB2ZXhfcHJlZml4LCBtb2RybS4KIAkgKiBDbGVhciBSRVguYiBiaXQgKGV4dGVuc2lvbiBvZiBNT0RSTS5ybSBmaWVsZCk6Ci0JICogd2Ugd2FudCB0byBlbmNvZGUgcmF4L3JjeCwgbm90IHI4L3I5LgorCSAqIHdlIHdhbnQgdG8gZW5jb2RlIGxvdyBudW1iZXJlZCByZWcsIG5vdCByOCsuCiAJICovCiAJaWYgKGluc24tPnJleF9wcmVmaXgubmJ5dGVzKSB7CiAJCWN1cnNvciA9IGF1cHJvYmUtPmluc24gKyBpbnNuX29mZnNldF9yZXhfcHJlZml4KGluc24pOwotCQkqY3Vyc29yICY9IDB4ZmU7CS8qIENsZWFyaW5nIFJFWC5CIGJpdCAqLworCQkvKiBSRVggYnl0ZSBoYXMgMDEwMHdyeGIgbGF5b3V0LCBjbGVhcmluZyBSRVguYiBiaXQgKi8KKwkJKmN1cnNvciAmPSAweGZlOworCX0KKwkvKgorCSAqIFNpbWlsYXIgdHJlYXRtZW50IGZvciBWRVgzIHByZWZpeC4KKwkgKiBUT0RPOiBhZGQgWE9QL0VWRVggdHJlYXRtZW50IHdoZW4gaW5zbiBkZWNvZGVyIHN1cHBvcnRzIHRoZW0KKwkgKi8KKwlpZiAoaW5zbi0+dmV4X3ByZWZpeC5uYnl0ZXMgPT0gMykgeworCQkvKgorCQkgKiB2ZXgyOiAgICAgYzUgICAgcnZ2dnZMcHAgICAoaGFzIG5vIGIgYml0KQorCQkgKiB2ZXgzL3hvcDogYzQvOGYgcnhibW1tbW0gd3Z2dnZMcHAKKwkJICogZXZleDogICAgIDYyICAgIHJ4YlIwMG1tIHd2dnZ2MXBwIHpsbEJWYWFhCisJCSAqICAgKGV2ZXggd2lsbCBuZWVkIHNldHRpbmcgb2YgYm90aCBiIGFuZCB4IHNpbmNlCisJCSAqICAgaW4gbm9uLXNpYiBlbmNvZGluZyBldmV4LnggaXMgNHRoIGJpdCBvZiBNT0RSTS5ybSkKKwkJICogU2V0dGluZyBWRVgzLmIgKHNldHRpbmcgYmVjYXVzZSBpdCBoYXMgaW52ZXJ0ZWQgbWVhbmluZyk6CisJCSAqLworCQljdXJzb3IgPSBhdXByb2JlLT5pbnNuICsgaW5zbl9vZmZzZXRfdmV4X3ByZWZpeChpbnNuKSArIDE7CisJCSpjdXJzb3IgfD0gMHgyMDsKIAl9CiAKIAkvKgorCSAqIENvbnZlcnQgZnJvbSByaXAtcmVsYXRpdmUgYWRkcmVzc2luZyB0byByZWdpc3Rlci1yZWxhdGl2ZSBhZGRyZXNzaW5nCisJICogdmlhIGEgc2NyYXRjaCByZWdpc3Rlci4KKwkgKgorCSAqIFRoaXMgaXMgdHJpY2t5IHNpbmNlIHRoZXJlIGFyZSBpbnNucyB3aXRoIG1vZHJtIGJ5dGUKKwkgKiB3aGljaCBhbHNvIHVzZSByZWdpc3RlcnMgbm90IGVuY29kZWQgaW4gbW9kcm0gYnl0ZToKKwkgKiBbaV1kaXYvW2ldbXVsOiBpbXBsaWNpdGx5IHVzZSBkeDpheAorCSAqIHNoaWZ0IG9wczogaW1wbGljaXRseSB1c2UgY3gKKwkgKiBjbXB4Y2hnOiBpbXBsaWNpdGx5IHVzZXMgYXgKKwkgKiBjbXB4Y2hnOC8xNmI6IGltcGxpY2l0bHkgdXNlcyBkeDpheCBhbmQgYng6Y3gKKwkgKiAgIEVuY29kaW5nOiAwZiBjNy8xIG1vZHJtCisJICogICBUaGUgY29kZSBiZWxvdyB0aGlua3MgdGhhdCByZWc9MSAoY3gpLCBjaG9vc2VzIHNpIGFzIHNjcmF0Y2guCisJICogbXVseDogaW1wbGljaXRseSB1c2VzIGR4OiBtdWx4IHIvbSxyMSxyMiBkb2VzIHIxOnIyID0gZHggKiByL20uCisJICogICBGaXJzdCBhcHBlYXJlZCBpbiBIYXN3ZWxsIChCTUkyIGluc24pLiBJdCBpcyB2ZXgtZW5jb2RlZC4KKwkgKiAgIEV4YW1wbGUgd2hlcmUgbm9uZSBvZiBieCxjeCxkeCBjYW4gYmUgdXNlZCBhcyBzY3JhdGNoIHJlZzoKKwkgKiAgIGM0IGUyIDYzIGY2IDBkIGRpc3AzMiAgIG11bHggZGlzcDMyKCVyaXApLCVlYngsJWVjeAorCSAqIFt2XXBjbXBpc3RyaTogaW1wbGljaXRseSB1c2VzIGN4LCB4bW0wCisJICogW3ZdcGNtcGlzdHJtOiBpbXBsaWNpdGx5IHVzZXMgeG1tMAorCSAqIFt2XXBjbXBlc3RyaTogaW1wbGljaXRseSB1c2VzIGF4LCBkeCwgY3gsIHhtbTAKKwkgKiBbdl1wY21wZXN0cm06IGltcGxpY2l0bHkgdXNlcyBheCwgZHgsIHhtbTAKKwkgKiAgIEV2aWwgU1NFNC4yIHN0cmluZyBjb21wYXJpc29uIG9wcyBmcm9tIGhlbGwuCisJICogbWFza21vdnEvW3ZdbWFza21vdmRxdTogaW1wbGljaXRseSB1c2VzIChkczpyZGkpIGFzIGRlc3RpbmF0aW9uLgorCSAqICAgRW5jb2Rpbmc6IDBmIGY3IG1vZHJtLCA2NiAwZiBmNyBtb2RybSwgdmV4LWVuY29kZWQ6IGM1IGY5IGY3IG1vZHJtLgorCSAqICAgU3RvcmUgb3AxLCBieXRlLW1hc2tlZCBieSBvcDIgbXNiJ3MgaW4gZWFjaCBieXRlLCB0byAoZHM6cmRpKS4KKwkgKiAgIEFNRCBzYXlzIGl0IGhhcyBubyAzLW9wZXJhbmQgZm9ybSAodmV4LnZ2dnYgbXVzdCBiZSAxMTExKQorCSAqICAgYW5kIHRoYXQgaXQgY2FuIGhhdmUgb25seSByZWdpc3RlciBvcGVyYW5kcywgbm90IG1lbQorCSAqICAgKGl0cyBtb2RybSBieXRlIG11c3QgaGF2ZSBtb2RlPTExKS4KKwkgKiAgIElmIHRoZXNlIHJlc3RyaWN0aW9ucyB3aWxsIGV2ZXIgYmUgbGlmdGVkLAorCSAqICAgd2UnbGwgbmVlZCBjb2RlIHRvIHByZXZlbnQgc2VsZWN0aW9uIG9mIGRpIGFzIHNjcmF0Y2ggcmVnIQorCSAqCisJICogU3VtbWFyeTogSSBkb24ndCBrbm93IGFueSBpbnNucyB3aXRoIG1vZHJtIGJ5dGUgd2hpY2gKKwkgKiB1c2UgU0kgcmVnaXN0ZXIgaW1wbGljaXRseS4gREkgcmVnaXN0ZXIgaXMgdXNlZCBvbmx5CisJICogYnkgb25lIGluc24gKG1hc2ttb3ZxKSBhbmQgQlggcmVnaXN0ZXIgaXMgdXNlZAorCSAqIG9ubHkgYnkgb25lIHRvbyAoY21weGNoZzhiKS4KKwkgKiBCUCBpcyBzdGFjay1zZWdtZW50IGJhc2VkIChtYXkgYmUgYSBwcm9ibGVtPykuCisJICogQVgsIERYLCBDWCBhcmUgb2ZmLWxpbWl0cyAobWFueSBpbXBsaWNpdCB1c2VycykuCisJICogU1AgaXMgdW51c2FibGUgKGl0J3Mgc3RhY2sgcG9pbnRlciAtIHRoaW5rIGFib3V0ICJwb3AgbWVtIjsKKwkgKiBhbHNvLCByc3ArZGlzcDMyIG5lZWRzIHNpYiBlbmNvZGluZyAtPiBpbnNuIGxlbmd0aCBjaGFuZ2UpLgorCSAqLworCisJcmVnID0gTU9EUk1fUkVHKGluc24pOwkvKiBGZXRjaCBtb2RybS5yZWcgKi8KKwlyZWcyID0gMHhmZjsJCS8qIEZldGNoIHZleC52dnZ2ICovCisJaWYgKGluc24tPnZleF9wcmVmaXgubmJ5dGVzID09IDIpCisJCXJlZzIgPSBpbnNuLT52ZXhfcHJlZml4LmJ5dGVzWzFdOworCWVsc2UgaWYgKGluc24tPnZleF9wcmVmaXgubmJ5dGVzID09IDMpCisJCXJlZzIgPSBpbnNuLT52ZXhfcHJlZml4LmJ5dGVzWzJdOworCS8qCisJICogVE9ETzogYWRkIFhPUCwgRVhFViB2dnZ2IHJlYWRpbmcuCisJICoKKwkgKiB2ZXgudnZ2diBmaWVsZCBpcyBpbiBiaXRzIDYtMywgYml0cyBhcmUgaW52ZXJ0ZWQuCisJICogQnV0IGluIDMyLWJpdCBtb2RlLCBoaWdoLW9yZGVyIGJpdCBtYXkgYmUgaWdub3JlZC4KKwkgKiBUaGVyZWZvcmUsIGxldCdzIGNvbnNpZGVyIG9ubHkgMyBsb3ctb3JkZXIgYml0cy4KKwkgKi8KKwlyZWcyID0gKChyZWcyID4+IDMpICYgMHg3KSBeIDB4NzsKKwkvKgorCSAqIFJlZ2lzdGVyIG51bWJlcmluZyBpcyBheCxjeCxkeCxieCwgc3AsYnAsc2ksZGksIHI4Li5yMTUuCisJICoKKwkgKiBDaG9vc2Ugc2NyYXRjaCByZWcuIE9yZGVyIGlzIGltcG9ydGFudDogbXVzdCBub3Qgc2VsZWN0IGJ4CisJICogaWYgd2UgY2FuIHVzZSBzaSAoY21weGNoZzhiIGNhc2UhKQorCSAqLworCWlmIChyZWcgIT0gNiAmJiByZWcyICE9IDYpIHsKKwkJcmVnMiA9IDY7CisJCWF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyB8PSBVUFJPQkVfRklYX1JJUF9TSTsKKwl9IGVsc2UgaWYgKHJlZyAhPSA3ICYmIHJlZzIgIT0gNykgeworCQlyZWcyID0gNzsKKwkJYXVwcm9iZS0+ZGVmcGFyYW0uZml4dXBzIHw9IFVQUk9CRV9GSVhfUklQX0RJOworCQkvKiBUT0RPIChwYXJhbm9pYSk6IGZvcmNlIG1hc2ttb3ZxIHRvIG5vdCB1c2UgZGkgKi8KKwl9IGVsc2UgeworCQlyZWcyID0gMzsKKwkJYXVwcm9iZS0+ZGVmcGFyYW0uZml4dXBzIHw9IFVQUk9CRV9GSVhfUklQX0JYOworCX0KKwkvKgogCSAqIFBvaW50IGN1cnNvciBhdCB0aGUgbW9kcm0gYnl0ZS4gIFRoZSBuZXh0IDQgYnl0ZXMgYXJlIHRoZQogCSAqIGRpc3BsYWNlbWVudC4gIEJleW9uZCB0aGUgZGlzcGxhY2VtZW50LCBmb3Igc29tZSBpbnN0cnVjdGlvbnMsCiAJICogaXMgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgogCSAqLwogCWN1cnNvciA9IGF1cHJvYmUtPmluc24gKyBpbnNuX29mZnNldF9tb2RybShpbnNuKTsKLQlpbnNuX2dldF9sZW5ndGgoaW5zbik7Ci0KIAkvKgotCSAqIENvbnZlcnQgZnJvbSByaXAtcmVsYXRpdmUgYWRkcmVzc2luZyB0byBpbmRpcmVjdCBhZGRyZXNzaW5nCi0JICogdmlhIGEgc2NyYXRjaCByZWdpc3Rlci4gIENoYW5nZSB0aGUgci9tIGZpZWxkIGZyb20gMHg1ICglcmlwKQotCSAqIHRvIDB4MCAoJXJheCkgb3IgMHgxICglcmN4KSwgYW5kIHNxdWVlemUgb3V0IHRoZSBvZmZzZXQgZmllbGQuCisJICogQ2hhbmdlIG1vZHJtIGZyb20gIjAwIHJlZyAxMDEiIHRvICIxMCByZWcgcmVnMiIuIEV4YW1wbGU6CisJICogODkgMDUgZGlzcDMyICBtb3YgJWVheCxkaXNwMzIoJXJpcCkgYmVjb21lcworCSAqIDg5IDg2IGRpc3AzMiAgbW92ICVlYXgsZGlzcDMyKCVyc2kpCiAJICovCi0JcmVnID0gTU9EUk1fUkVHKGluc24pOwotCWlmIChyZWcgPT0gMCkgewotCQkvKgotCQkgKiBUaGUgcmVnaXN0ZXIgb3BlcmFuZCAoaWYgYW55KSBpcyBlaXRoZXIgdGhlIEEgcmVnaXN0ZXIKLQkJICogKCVyYXgsICVlYXgsIGV0Yy4pIG9yIChpZiB0aGUgMHg0IGJpdCBpcyBzZXQgaW4gdGhlCi0JCSAqIFJFWCBwcmVmaXgpICVyOC4gIEluIGFueSBjYXNlLCB3ZSBrbm93IHRoZSBDIHJlZ2lzdGVyCi0JCSAqIGlzIE5PVCB0aGUgcmVnaXN0ZXIgb3BlcmFuZCwgc28gd2UgdXNlICVyY3ggKHJlZ2lzdGVyCi0JCSAqICMxKSBmb3IgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIuCi0JCSAqLwotCQlhdXByb2JlLT5maXh1cHMgPSBVUFJPQkVfRklYX1JJUF9DWDsKLQkJLyogQ2hhbmdlIG1vZHJtIGZyb20gMDAgMDAwIDEwMSB0byAwMCAwMDAgMDAxLiAqLwotCQkqY3Vyc29yID0gMHgxOwotCX0gZWxzZSB7Ci0JCS8qIFVzZSAlcmF4IChyZWdpc3RlciAjMCkgZm9yIHRoZSBzY3JhdGNoIHJlZ2lzdGVyLiAqLwotCQlhdXByb2JlLT5maXh1cHMgPSBVUFJPQkVfRklYX1JJUF9BWDsKLQkJLyogQ2hhbmdlIG1vZHJtIGZyb20gMDAgeHh4IDEwMSB0byAwMCB4eHggMDAwICovCi0JCSpjdXJzb3IgPSAocmVnIDw8IDMpOwotCX0KKwkqY3Vyc29yID0gMHg4MCB8IChyZWcgPDwgMykgfCByZWcyOworfQogCi0JLyogVGFyZ2V0IGFkZHJlc3MgPSBhZGRyZXNzIG9mIG5leHQgaW5zdHJ1Y3Rpb24gKyAoc2lnbmVkKSBvZmZzZXQgKi8KLQlhdXByb2JlLT5yaXBfcmVsYV90YXJnZXRfYWRkcmVzcyA9IChsb25nKWluc24tPmxlbmd0aCArIGluc24tPmRpc3BsYWNlbWVudC52YWx1ZTsKLQotCS8qIERpc3BsYWNlbWVudCBmaWVsZCBpcyBnb25lOyBzbGlkZSBpbW1lZGlhdGUgZmllbGQgKGlmIGFueSkgb3Zlci4gKi8KLQlpZiAoaW5zbi0+aW1tZWRpYXRlLm5ieXRlcykgewotCQljdXJzb3IrKzsKLQkJbWVtbW92ZShjdXJzb3IsIGN1cnNvciArIGluc24tPmRpc3BsYWNlbWVudC5uYnl0ZXMsIGluc24tPmltbWVkaWF0ZS5uYnl0ZXMpOwotCX0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqCitzY3JhdGNoX3JlZyhzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChhdXByb2JlLT5kZWZwYXJhbS5maXh1cHMgJiBVUFJPQkVfRklYX1JJUF9TSSkKKwkJcmV0dXJuICZyZWdzLT5zaTsKKwlpZiAoYXVwcm9iZS0+ZGVmcGFyYW0uZml4dXBzICYgVVBST0JFX0ZJWF9SSVBfREkpCisJCXJldHVybiAmcmVncy0+ZGk7CisJcmV0dXJuICZyZWdzLT5ieDsKIH0KIAogLyoKICAqIElmIHdlJ3JlIGVtdWxhdGluZyBhIHJpcC1yZWxhdGl2ZSBpbnN0cnVjdGlvbiwgc2F2ZSB0aGUgY29udGVudHMKICAqIG9mIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIGFuZCBzdG9yZSB0aGUgdGFyZ2V0IGFkZHJlc3MgaW4gdGhhdCByZWdpc3Rlci4KICAqLwotc3RhdGljIHZvaWQKLXByZV94b2xfcmlwX2luc24oc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQlzdHJ1Y3QgYXJjaF91cHJvYmVfdGFzayAqYXV0YXNrKQorc3RhdGljIHZvaWQgcmlwcmVsX3ByZV94b2woc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpZiAoYXVwcm9iZS0+Zml4dXBzICYgVVBST0JFX0ZJWF9SSVBfQVgpIHsKLQkJYXV0YXNrLT5zYXZlZF9zY3JhdGNoX3JlZ2lzdGVyID0gcmVncy0+YXg7Ci0JCXJlZ3MtPmF4ID0gY3VycmVudC0+dXRhc2stPnZhZGRyOwotCQlyZWdzLT5heCArPSBhdXByb2JlLT5yaXBfcmVsYV90YXJnZXRfYWRkcmVzczsKLQl9IGVsc2UgaWYgKGF1cHJvYmUtPmZpeHVwcyAmIFVQUk9CRV9GSVhfUklQX0NYKSB7Ci0JCWF1dGFzay0+c2F2ZWRfc2NyYXRjaF9yZWdpc3RlciA9IHJlZ3MtPmN4OwotCQlyZWdzLT5jeCA9IGN1cnJlbnQtPnV0YXNrLT52YWRkcjsKLQkJcmVncy0+Y3ggKz0gYXVwcm9iZS0+cmlwX3JlbGFfdGFyZ2V0X2FkZHJlc3M7CisJaWYgKGF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyAmIFVQUk9CRV9GSVhfUklQX01BU0spIHsKKwkJc3RydWN0IHVwcm9iZV90YXNrICp1dGFzayA9IGN1cnJlbnQtPnV0YXNrOworCQl1bnNpZ25lZCBsb25nICpzciA9IHNjcmF0Y2hfcmVnKGF1cHJvYmUsIHJlZ3MpOworCisJCXV0YXNrLT5hdXRhc2suc2F2ZWRfc2NyYXRjaF9yZWdpc3RlciA9ICpzcjsKKwkJKnNyID0gdXRhc2stPnZhZGRyICsgYXVwcm9iZS0+ZGVmcGFyYW0uaWxlbjsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1oYW5kbGVfcmlwcmVsX3Bvc3RfeG9sKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgKmNvcnJlY3Rpb24pCitzdGF0aWMgdm9pZCByaXByZWxfcG9zdF94b2woc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpZiAoYXVwcm9iZS0+Zml4dXBzICYgKFVQUk9CRV9GSVhfUklQX0FYIHwgVVBST0JFX0ZJWF9SSVBfQ1gpKSB7Ci0JCXN0cnVjdCBhcmNoX3Vwcm9iZV90YXNrICphdXRhc2s7CisJaWYgKGF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyAmIFVQUk9CRV9GSVhfUklQX01BU0spIHsKKwkJc3RydWN0IHVwcm9iZV90YXNrICp1dGFzayA9IGN1cnJlbnQtPnV0YXNrOworCQl1bnNpZ25lZCBsb25nICpzciA9IHNjcmF0Y2hfcmVnKGF1cHJvYmUsIHJlZ3MpOwogCi0JCWF1dGFzayA9ICZjdXJyZW50LT51dGFzay0+YXV0YXNrOwotCQlpZiAoYXVwcm9iZS0+Zml4dXBzICYgVVBST0JFX0ZJWF9SSVBfQVgpCi0JCQlyZWdzLT5heCA9IGF1dGFzay0+c2F2ZWRfc2NyYXRjaF9yZWdpc3RlcjsKLQkJZWxzZQotCQkJcmVncy0+Y3ggPSBhdXRhc2stPnNhdmVkX3NjcmF0Y2hfcmVnaXN0ZXI7Ci0KLQkJLyoKLQkJICogVGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIGluY2x1ZGVzIGEgZGlzcGxhY2VtZW50LCBhbmQgc28KLQkJICogaXMgNCBieXRlcyBsb25nZXIgdGhhbiB3aGF0IHdlJ3ZlIGp1c3Qgc2luZ2xlLXN0ZXBwZWQuCi0JCSAqIENhbGxlciBtYXkgbmVlZCB0byBhcHBseSBvdGhlciBmaXh1cHMgdG8gaGFuZGxlIHN0dWZmCi0JCSAqIGxpa2UgImptcHEgKi4uLiglcmlwKSIgYW5kICJjYWxscSAqLi4uKCVyaXApIi4KLQkJICovCi0JCWlmIChjb3JyZWN0aW9uKQotCQkJKmNvcnJlY3Rpb24gKz0gNDsKKwkJKnNyID0gdXRhc2stPmF1dGFzay5zYXZlZF9zY3JhdGNoX3JlZ2lzdGVyOwogCX0KIH0KLQotc3RhdGljIGludCB2YWxpZGF0ZV9pbnNuXzY0Yml0cyhzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBpbnNuICppbnNuKQotewotCWluc25faW5pdChpbnNuLCBhdXByb2JlLT5pbnNuLCB0cnVlKTsKLQotCS8qIFNraXAgZ29vZCBpbnN0cnVjdGlvbiBwcmVmaXhlczsgcmVqZWN0ICJiYWQiIG9uZXMuICovCi0JaW5zbl9nZXRfb3Bjb2RlKGluc24pOwotCWlmIChpc19wcmVmaXhfYmFkKGluc24pKQotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JaWYgKHRlc3RfYml0KE9QQ09ERTEoaW5zbiksICh1bnNpZ25lZCBsb25nICopZ29vZF9pbnNuc182NCkpCi0JCXJldHVybiAwOwotCi0JaWYgKGluc24tPm9wY29kZS5uYnl0ZXMgPT0gMikgewotCQlpZiAodGVzdF9iaXQoT1BDT0RFMihpbnNuKSwgKHVuc2lnbmVkIGxvbmcgKilnb29kXzJieXRlX2luc25zKSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVOT1RTVVBQOwotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX2luc25fYml0cyhzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgaW5zbiAqaW5zbikKLXsKLQlpZiAobW0tPmNvbnRleHQuaWEzMl9jb21wYXQpCi0JCXJldHVybiB2YWxpZGF0ZV9pbnNuXzMyYml0cyhhdXByb2JlLCBpbnNuKTsKLQlyZXR1cm4gdmFsaWRhdGVfaW5zbl82NGJpdHMoYXVwcm9iZSwgaW5zbik7Ci19CiAjZWxzZSAvKiAzMi1iaXQ6ICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfNjRiaXRfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcmV0dXJuIGZhbHNlOworfQogLyoKICAqIE5vIFJJUC1yZWxhdGl2ZSBhZGRyZXNzaW5nIG9uIDMyLWJpdAogICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfcmlwcmVsX2luc24oc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgaW5zbiAqaW5zbikKK3N0YXRpYyB2b2lkIHJpcHJlbF9hbmFseXplKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IGluc24gKmluc24pCiB7CiB9Ci1zdGF0aWMgdm9pZCBwcmVfeG9sX3JpcF9pbnNuKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJc3RydWN0IGFyY2hfdXByb2JlX3Rhc2sgKmF1dGFzaykKK3N0YXRpYyB2b2lkIHJpcHJlbF9wcmVfeG9sKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiB9Ci1zdGF0aWMgdm9pZCBoYW5kbGVfcmlwcmVsX3Bvc3RfeG9sKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCWxvbmcgKmNvcnJlY3Rpb24pCitzdGF0aWMgdm9pZCByaXByZWxfcG9zdF94b2woc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIH0KLQotc3RhdGljIGludCB2YWxpZGF0ZV9pbnNuX2JpdHMoc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgIHN0cnVjdCBpbnNuICppbnNuKQotewotCXJldHVybiB2YWxpZGF0ZV9pbnNuXzMyYml0cyhhdXByb2JlLCBpbnNuKTsKLX0KICNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCiAKIHN0cnVjdCB1cHJvYmVfeG9sX29wcyB7CiAJYm9vbAkoKmVtdWxhdGUpKHN0cnVjdCBhcmNoX3Vwcm9iZSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAlpbnQJKCpwcmVfeG9sKShzdHJ1Y3QgYXJjaF91cHJvYmUgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiAJaW50CSgqcG9zdF94b2wpKHN0cnVjdCBhcmNoX3Vwcm9iZSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwl2b2lkCSgqYWJvcnQpKHN0cnVjdCBhcmNoX3Vwcm9iZSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl9sb25nKHZvaWQpCkBAIC00MTUsNTAgKzQ2Miw2NyBAQAogCiBzdGF0aWMgaW50IGRlZmF1bHRfcHJlX3hvbF9vcChzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXByZV94b2xfcmlwX2luc24oYXVwcm9iZSwgcmVncywgJmN1cnJlbnQtPnV0YXNrLT5hdXRhc2spOworCXJpcHJlbF9wcmVfeG9sKGF1cHJvYmUsIHJlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1c2hfcmV0X2FkZHJlc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgaXApCit7CisJdW5zaWduZWQgbG9uZyBuZXdfc3AgPSByZWdzLT5zcCAtIHNpemVvZl9sb25nKCk7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKW5ld19zcCwgJmlwLCBzaXplb2ZfbG9uZygpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZWdzLT5zcCA9IG5ld19zcDsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIEFkanVzdCB0aGUgcmV0dXJuIGFkZHJlc3MgcHVzaGVkIGJ5IGEgY2FsbCBpbnNuIGV4ZWN1dGVkIG91dCBvZiBsaW5lLgorICogV2UgaGF2ZSB0byBmaXggdGhpbmdzIHVwIGFzIGZvbGxvd3M6CisgKgorICogVHlwaWNhbGx5LCB0aGUgbmV3IGlwIGlzIHJlbGF0aXZlIHRvIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkCisgKiB0byBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiAoRklYX0lQKS4gIEV4Y2VwdGlvbnMKKyAqIGFyZSByZXR1cm4gaW5zdHJ1Y3Rpb25zIGFuZCBhYnNvbHV0ZSBvciBpbmRpcmVjdCBqdW1wIG9yIGNhbGwgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIElmIHRoZSBzaW5nbGUtc3RlcHBlZCBpbnN0cnVjdGlvbiB3YXMgYSBjYWxsLCB0aGUgcmV0dXJuIGFkZHJlc3MgdGhhdAorICogaXMgYXRvcCB0aGUgc3RhY2sgaXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uICBXZQorICogbmVlZCB0byBtYWtlIGl0IHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKEZJWF9DQUxMKS4KKyAqCisgKiBJZiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gd2FzIGEgcmlwLXJlbGF0aXZlIGluc3RydWN0aW9uIHN1Y2ggYXMKKyAqICJtb3ZsICVlZHgsMHhubm5uKCVyaXApIiwgd2UgaGF2ZSBpbnN0ZWFkIGV4ZWN1dGVkIGFuIGVxdWl2YWxlbnQKKyAqIGluc3RydWN0aW9uIHVzaW5nIGEgc2NyYXRjaCByZWdpc3RlciAtLSBlLmcuLCAibW92bCAlZWR4LDB4bm5ubiglcnNpKSIuCisgKiBXZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JhdGNoIHJlZ2lzdGVyCisgKiAoRklYX1JJUF9yZWcpLgogICovCi1zdGF0aWMgaW50IGFkanVzdF9yZXRfYWRkcih1bnNpZ25lZCBsb25nIHNwLCBsb25nIGNvcnJlY3Rpb24pCitzdGF0aWMgaW50IGRlZmF1bHRfcG9zdF94b2xfb3Aoc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgcmFzaXplID0gc2l6ZW9mX2xvbmcoKTsKLQlsb25nIHJhOworCXN0cnVjdCB1cHJvYmVfdGFzayAqdXRhc2sgPSBjdXJyZW50LT51dGFzazsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmcmEsICh2b2lkIF9fdXNlciAqKXNwLCByYXNpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJhICs9IGNvcnJlY3Rpb247Ci0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilzcCwgJnJhLCByYXNpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlyaXByZWxfcG9zdF94b2woYXVwcm9iZSwgcmVncyk7CisJaWYgKGF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyAmIFVQUk9CRV9GSVhfSVApIHsKKwkJbG9uZyBjb3JyZWN0aW9uID0gdXRhc2stPnZhZGRyIC0gdXRhc2stPnhvbF92YWRkcjsKKwkJcmVncy0+aXAgKz0gY29ycmVjdGlvbjsKKwl9IGVsc2UgaWYgKGF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyAmIFVQUk9CRV9GSVhfQ0FMTCkgeworCQlyZWdzLT5zcCArPSBzaXplb2ZfbG9uZygpOyAvKiBQb3AgaW5jb3JyZWN0IHJldHVybiBhZGRyZXNzICovCisJCWlmIChwdXNoX3JldF9hZGRyZXNzKHJlZ3MsIHV0YXNrLT52YWRkciArIGF1cHJvYmUtPmRlZnBhcmFtLmlsZW4pKQorCQkJcmV0dXJuIC1FUkVTVEFSVDsKKwl9CisJLyogcG9wZjsgdGVsbCB0aGUgY2FsbGVyIHRvIG5vdCB0b3VjaCBURiAqLworCWlmIChhdXByb2JlLT5kZWZwYXJhbS5maXh1cHMgJiBVUFJPQkVfRklYX1NFVEYpCisJCXV0YXNrLT5hdXRhc2suc2F2ZWRfdGYgPSB0cnVlOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVmYXVsdF9wb3N0X3hvbF9vcChzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgZGVmYXVsdF9hYm9ydF9vcChzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB1cHJvYmVfdGFzayAqdXRhc2sgPSBjdXJyZW50LT51dGFzazsKLQlsb25nIGNvcnJlY3Rpb24gPSAobG9uZykodXRhc2stPnZhZGRyIC0gdXRhc2stPnhvbF92YWRkcik7Ci0KLQloYW5kbGVfcmlwcmVsX3Bvc3RfeG9sKGF1cHJvYmUsIHJlZ3MsICZjb3JyZWN0aW9uKTsKLQlpZiAoYXVwcm9iZS0+Zml4dXBzICYgVVBST0JFX0ZJWF9JUCkKLQkJcmVncy0+aXAgKz0gY29ycmVjdGlvbjsKLQotCWlmIChhdXByb2JlLT5maXh1cHMgJiBVUFJPQkVfRklYX0NBTEwpIHsKLQkJaWYgKGFkanVzdF9yZXRfYWRkcihyZWdzLT5zcCwgY29ycmVjdGlvbikpIHsKLQkJCXJlZ3MtPnNwICs9IHNpemVvZl9sb25nKCk7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7CisJcmlwcmVsX3Bvc3RfeG9sKGF1cHJvYmUsIHJlZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IHVwcm9iZV94b2xfb3BzIGRlZmF1bHRfeG9sX29wcyA9IHsKIAkucHJlX3hvbCAgPSBkZWZhdWx0X3ByZV94b2xfb3AsCiAJLnBvc3RfeG9sID0gZGVmYXVsdF9wb3N0X3hvbF9vcCwKKwkuYWJvcnQJICA9IGRlZmF1bHRfYWJvcnRfb3AsCiB9OwogCiBzdGF0aWMgYm9vbCBicmFuY2hfaXNfY2FsbChzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUpCkBAIC01MjAsNyArNTg0LDYgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnMgPSAobG9uZylhdXByb2JlLT5icmFuY2gub2ZmczsKIAogCWlmIChicmFuY2hfaXNfY2FsbChhdXByb2JlKSkgewotCQl1bnNpZ25lZCBsb25nIG5ld19zcCA9IHJlZ3MtPnNwIC0gc2l6ZW9mX2xvbmcoKTsKIAkJLyoKIAkJICogSWYgaXQgZmFpbHMgd2UgZXhlY3V0ZSB0aGlzIChtYW5nbGVkLCBzZWUgdGhlIGNvbW1lbnQgaW4KIAkJICogYnJhbmNoX2NsZWFyX29mZnNldCkgaW5zbiBvdXQtb2YtbGluZS4gSW4gdGhlIGxpa2VseSBjYXNlCkBAIC01MzAsOSArNTkzLDggQEAKIAkJICoKIAkJICogQnV0IHRoZXJlIGlzIGNvcm5lciBjYXNlLCBzZWUgdGhlIGNvbW1lbnQgaW4gLT5wb3N0X3hvbCgpLgogCQkgKi8KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKiluZXdfc3AsICZuZXdfaXAsIHNpemVvZl9sb25nKCkpKQorCQlpZiAocHVzaF9yZXRfYWRkcmVzcyhyZWdzLCBuZXdfaXApKQogCQkJcmV0dXJuIGZhbHNlOwotCQlyZWdzLT5zcCA9IG5ld19zcDsKIAl9IGVsc2UgaWYgKCFjaGVja19qbXBfY29uZChhdXByb2JlLCByZWdzKSkgewogCQlvZmZzID0gMDsKIAl9CkBAIC01ODMsMTEgKzY0NSw3IEBACiBzdGF0aWMgaW50IGJyYW5jaF9zZXR1cF94b2xfb3BzKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IGluc24gKmluc24pCiB7CiAJdTggb3BjMSA9IE9QQ09ERTEoaW5zbik7Ci0KLQkvKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIHByb2Nlc3NpbmcgdGhlIGVudGlyZSBpbnN0cnVjdGlvbiAqLwotCWluc25fZ2V0X2xlbmd0aChpbnNuKTsKLQlpZiAoV0FSTl9PTl9PTkNFKCFpbnNuX2NvbXBsZXRlKGluc24pKSkKLQkJcmV0dXJuIC1FTk9FWEVDOworCWludCBpOwogCiAJc3dpdGNoIChvcGMxKSB7CiAJY2FzZSAweGViOgkvKiBqbXAgOCAqLwpAQCAtNjEyLDYgKzY3MCwxNiBAQAogCQkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCisJLyoKKwkgKiAxNi1iaXQgb3ZlcnJpZGVzIHN1Y2ggYXMgQ0FMTFcgKDY2IGU4IG5uIG5uKSBhcmUgbm90IHN1cHBvcnRlZC4KKwkgKiBJbnRlbCBhbmQgQU1EIGJlaGF2aW9yIGRpZmZlciBpbiA2NC1iaXQgbW9kZTogSW50ZWwgaWdub3JlcyA2NiBwcmVmaXguCisJICogTm8gb25lIHVzZXMgdGhlc2UgaW5zbnMsIHJlamVjdCBhbnkgYnJhbmNoIGluc25zIHdpdGggc3VjaCBwcmVmaXguCisJICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPnByZWZpeGVzLm5ieXRlczsgaSsrKSB7CisJCWlmIChpbnNuLT5wcmVmaXhlcy5ieXRlc1tpXSA9PSAweDY2KQorCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKIAlhdXByb2JlLT5icmFuY2gub3BjMSA9IG9wYzE7CiAJYXVwcm9iZS0+YnJhbmNoLmlsZW4gPSBpbnNuLT5sZW5ndGg7CiAJYXVwcm9iZS0+YnJhbmNoLm9mZnMgPSBpbnNuLT5pbW1lZGlhdGUudmFsdWU7CkBAIC02MzAsMTAgKzY5OCwxMCBAQAogaW50IGFyY2hfdXByb2JlX2FuYWx5emVfaW5zbihzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IGluc24gaW5zbjsKLQlib29sIGZpeF9pcCA9IHRydWUsIGZpeF9jYWxsID0gZmFsc2U7CisJdTggZml4X2lwX29yX2NhbGwgPSBVUFJPQkVfRklYX0lQOwogCWludCByZXQ7CiAKLQlyZXQgPSB2YWxpZGF0ZV9pbnNuX2JpdHMoYXVwcm9iZSwgbW0sICZpbnNuKTsKKwlyZXQgPSB1cHJvYmVfaW5pdF9pbnNuKGF1cHJvYmUsICZpbnNuLCBpc182NGJpdF9tbShtbSkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTY0Miw0NCArNzEwLDM5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKgotCSAqIEZpZ3VyZSBvdXQgd2hpY2ggZml4dXBzIGFyY2hfdXByb2JlX3Bvc3RfeG9sKCkgd2lsbCBuZWVkIHRvIHBlcmZvcm0sCi0JICogYW5kIGFubm90YXRlIGFyY2hfdXByb2JlLT5maXh1cHMgYWNjb3JkaW5nbHkuIFRvIHN0YXJ0IHdpdGgsIC0+Zml4dXBzCi0JICogaXMgZWl0aGVyIHplcm8gb3IgaXQgcmVmbGVjdHMgcmlwLXJlbGF0ZWQgZml4dXBzLgorCSAqIEZpZ3VyZSBvdXQgd2hpY2ggZml4dXBzIGRlZmF1bHRfcG9zdF94b2xfb3AoKSB3aWxsIG5lZWQgdG8gcGVyZm9ybSwKKwkgKiBhbmQgYW5ub3RhdGUgZGVmcGFyYW0tPmZpeHVwcyBhY2NvcmRpbmdseS4KIAkgKi8KIAlzd2l0Y2ggKE9QQ09ERTEoJmluc24pKSB7CiAJY2FzZSAweDlkOgkJLyogcG9wZiAqLwotCQlhdXByb2JlLT5maXh1cHMgfD0gVVBST0JFX0ZJWF9TRVRGOworCQlhdXByb2JlLT5kZWZwYXJhbS5maXh1cHMgfD0gVVBST0JFX0ZJWF9TRVRGOwogCQlicmVhazsKIAljYXNlIDB4YzM6CQkvKiByZXQgb3IgbHJldCAtLSBpcCBpcyBjb3JyZWN0ICovCiAJY2FzZSAweGNiOgogCWNhc2UgMHhjMjoKIAljYXNlIDB4Y2E6Ci0JCWZpeF9pcCA9IGZhbHNlOworCWNhc2UgMHhlYToJCS8qIGptcCBhYnNvbHV0ZSAtLSBpcCBpcyBjb3JyZWN0ICovCisJCWZpeF9pcF9vcl9jYWxsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAweDlhOgkJLyogY2FsbCBhYnNvbHV0ZSAtIEZpeCByZXR1cm4gYWRkciwgbm90IGlwICovCi0JCWZpeF9jYWxsID0gdHJ1ZTsKLQkJZml4X2lwID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgMHhlYToJCS8qIGptcCBhYnNvbHV0ZSAtLSBpcCBpcyBjb3JyZWN0ICovCi0JCWZpeF9pcCA9IGZhbHNlOworCQlmaXhfaXBfb3JfY2FsbCA9IFVQUk9CRV9GSVhfQ0FMTDsKIAkJYnJlYWs7CiAJY2FzZSAweGZmOgotCQlpbnNuX2dldF9tb2RybSgmaW5zbik7CiAJCXN3aXRjaCAoTU9EUk1fUkVHKCZpbnNuKSkgewogCQljYXNlIDI6IGNhc2UgMzoJCQkvKiBjYWxsIG9yIGxjYWxsLCBpbmRpcmVjdCAqLwotCQkJZml4X2NhbGwgPSB0cnVlOworCQkJZml4X2lwX29yX2NhbGwgPSBVUFJPQkVfRklYX0NBTEw7CisJCQlicmVhazsKIAkJY2FzZSA0OiBjYXNlIDU6CQkJLyogam1wIG9yIGxqbXAsIGluZGlyZWN0ICovCi0JCQlmaXhfaXAgPSBmYWxzZTsKKwkJCWZpeF9pcF9vcl9jYWxsID0gMDsKKwkJCWJyZWFrOwogCQl9CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6Ci0JCWhhbmRsZV9yaXByZWxfaW5zbihhdXByb2JlLCAmaW5zbik7CisJCXJpcHJlbF9hbmFseXplKGF1cHJvYmUsICZpbnNuKTsKIAl9CiAKLQlpZiAoZml4X2lwKQotCQlhdXByb2JlLT5maXh1cHMgfD0gVVBST0JFX0ZJWF9JUDsKLQlpZiAoZml4X2NhbGwpCi0JCWF1cHJvYmUtPmZpeHVwcyB8PSBVUFJPQkVfRklYX0NBTEw7CisJYXVwcm9iZS0+ZGVmcGFyYW0uaWxlbiA9IGluc24ubGVuZ3RoOworCWF1cHJvYmUtPmRlZnBhcmFtLmZpeHVwcyB8PSBmaXhfaXBfb3JfY2FsbDsKIAogCWF1cHJvYmUtPm9wcyA9ICZkZWZhdWx0X3hvbF9vcHM7CiAJcmV0dXJuIDA7CkBAIC02OTQsNiArNzU3LDEyIEBACiB7CiAJc3RydWN0IHVwcm9iZV90YXNrICp1dGFzayA9IGN1cnJlbnQtPnV0YXNrOwogCisJaWYgKGF1cHJvYmUtPm9wcy0+cHJlX3hvbCkgeworCQlpbnQgZXJyID0gYXVwcm9iZS0+b3BzLT5wcmVfeG9sKGF1cHJvYmUsIHJlZ3MpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKIAlyZWdzLT5pcCA9IHV0YXNrLT54b2xfdmFkZHI7CiAJdXRhc2stPmF1dGFzay5zYXZlZF90cmFwX25yID0gY3VycmVudC0+dGhyZWFkLnRyYXBfbnI7CiAJY3VycmVudC0+dGhyZWFkLnRyYXBfbnIgPSBVUFJPQkVfVFJBUF9OUjsKQEAgLTcwMyw4ICs3NzIsNiBAQAogCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfQkxPQ0tTVEVQKSkKIAkJc2V0X3Rhc2tfYmxvY2tzdGVwKGN1cnJlbnQsIGZhbHNlKTsKIAotCWlmIChhdXByb2JlLT5vcHMtPnByZV94b2wpCi0JCXJldHVybiBhdXByb2JlLT5vcHMtPnByZV94b2woYXVwcm9iZSwgcmVncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTczMiw1NiArNzk5LDQyIEBACiAgKiBzaW5nbGUtc3RlcCwgd2Ugc2luZ2xlLXN0ZXBwZWQgYSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbi4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRvIHJlc3VtZSBleGVjdXRpb24gYWZ0ZXIgdGhlIHNpbmdsZS1zdGVwLgotICogV2UgaGF2ZSB0byBmaXggdGhpbmdzIHVwIGFzIGZvbGxvd3M6Ci0gKgotICogVHlwaWNhbGx5LCB0aGUgbmV3IGlwIGlzIHJlbGF0aXZlIHRvIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkCi0gKiB0byBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiAoRklYX0lQKS4gIEV4Y2VwdGlvbnMKLSAqIGFyZSByZXR1cm4gaW5zdHJ1Y3Rpb25zIGFuZCBhYnNvbHV0ZSBvciBpbmRpcmVjdCBqdW1wIG9yIGNhbGwgaW5zdHJ1Y3Rpb25zLgotICoKLSAqIElmIHRoZSBzaW5nbGUtc3RlcHBlZCBpbnN0cnVjdGlvbiB3YXMgYSBjYWxsLCB0aGUgcmV0dXJuIGFkZHJlc3MgdGhhdAotICogaXMgYXRvcCB0aGUgc3RhY2sgaXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uICBXZQotICogbmVlZCB0byBtYWtlIGl0IHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKEZJWF9DQUxMKS4KLSAqCi0gKiBJZiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gd2FzIGEgcmlwLXJlbGF0aXZlIGluc3RydWN0aW9uIHN1Y2ggYXMKLSAqICJtb3ZsICVlZHgsMHhubm5uKCVyaXApIiwgd2UgaGF2ZSBpbnN0ZWFkIGV4ZWN1dGVkIGFuIGVxdWl2YWxlbnQKLSAqIGluc3RydWN0aW9uIHVzaW5nIGEgc2NyYXRjaCByZWdpc3RlciAtLSBlLmcuLCAibW92bCAlZWR4LCglcmF4KSIuCi0gKiBXZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIGFuZCBhZGp1c3QKLSAqIHRoZSBpcCwga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGluc3RydWN0aW9uIHdlIGV4ZWN1dGVkIGlzIDQgYnl0ZXMKLSAqIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKHNpbmNlIHdlIHNxdWVlemVkIG91dCB0aGUgb2Zmc2V0Ci0gKiBmaWVsZCkuICAoRklYX1JJUF9BWCBvciBGSVhfUklQX0NYKQogICovCiBpbnQgYXJjaF91cHJvYmVfcG9zdF94b2woc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdXByb2JlX3Rhc2sgKnV0YXNrID0gY3VycmVudC0+dXRhc2s7CisJYm9vbCBzZW5kX3NpZ3RyYXAgPSB1dGFzay0+YXV0YXNrLnNhdmVkX3RmOworCWludCBlcnIgPSAwOwogCiAJV0FSTl9PTl9PTkNFKGN1cnJlbnQtPnRocmVhZC50cmFwX25yICE9IFVQUk9CRV9UUkFQX05SKTsKKwljdXJyZW50LT50aHJlYWQudHJhcF9uciA9IHV0YXNrLT5hdXRhc2suc2F2ZWRfdHJhcF9ucjsKIAogCWlmIChhdXByb2JlLT5vcHMtPnBvc3RfeG9sKSB7Ci0JCWludCBlcnIgPSBhdXByb2JlLT5vcHMtPnBvc3RfeG9sKGF1cHJvYmUsIHJlZ3MpOworCQllcnIgPSBhdXByb2JlLT5vcHMtPnBvc3RfeG9sKGF1cHJvYmUsIHJlZ3MpOwogCQlpZiAoZXJyKSB7Ci0JCQlhcmNoX3Vwcm9iZV9hYm9ydF94b2woYXVwcm9iZSwgcmVncyk7CiAJCQkvKgotCQkJICogUmVzdGFydCB0aGUgcHJvYmVkIGluc24uIC0+cG9zdF94b2woKSBtdXN0IGVuc3VyZQotCQkJICogdGhpcyBpcyByZWFsbHkgcG9zc2libGUgaWYgaXQgcmV0dXJucyAtRVJFU1RBUlQuCisJCQkgKiBSZXN0b3JlIC0+aXAgZm9yIHJlc3RhcnQgb3IgcG9zdCBtb3J0ZW0gYW5hbHlzaXMuCisJCQkgKiAtPnBvc3RfeG9sKCkgbXVzdCBub3QgcmV0dXJuIC1FUkVTVEFSVCB1bmxlc3MgdGhpcworCQkJICogaXMgcmVhbGx5IHBvc3NpYmxlLgogCQkJICovCisJCQlyZWdzLT5pcCA9IHV0YXNrLT52YWRkcjsKIAkJCWlmIChlcnIgPT0gLUVSRVNUQVJUKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIGVycjsKKwkJCQllcnIgPSAwOworCQkJc2VuZF9zaWd0cmFwID0gZmFsc2U7CiAJCX0KIAl9Ci0KLQljdXJyZW50LT50aHJlYWQudHJhcF9uciA9IHV0YXNrLT5hdXRhc2suc2F2ZWRfdHJhcF9ucjsKIAkvKgogCSAqIGFyY2hfdXByb2JlX3ByZV94b2woKSBkb2Vzbid0IHNhdmUgdGhlIHN0YXRlIG9mIFRJRl9CTE9DS1NURVAKIAkgKiBzbyB3ZSBjYW4gZ2V0IGFuIGV4dHJhIFNJR1RSQVAgaWYgd2UgZG8gbm90IGNsZWFyIFRGLiBXZSBuZWVkCiAJICogdG8gZXhhbWluZSB0aGUgb3Bjb2RlIHRvIG1ha2UgaXQgcmlnaHQuCiAJICovCi0JaWYgKHV0YXNrLT5hdXRhc2suc2F2ZWRfdGYpCisJaWYgKHNlbmRfc2lndHJhcCkKIAkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7Ci0JZWxzZSBpZiAoIShhdXByb2JlLT5maXh1cHMgJiBVUFJPQkVfRklYX1NFVEYpKQorCisJaWYgKCF1dGFzay0+YXV0YXNrLnNhdmVkX3RmKQogCQlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIC8qIGNhbGxiYWNrIHJvdXRpbmUgZm9yIGhhbmRsaW5nIGV4Y2VwdGlvbnMuICovCkBAIC04MTUsMTggKzg2OCwxOCBAQAogCiAvKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIFhPTCBpbnN0cnVjdGlvbiBlaXRoZXIgZ2V0cyB0cmFwcGVkIG9yCi0gKiB0aGUgdGhyZWFkIGhhcyBhIGZhdGFsIHNpZ25hbCwgb3IgaWYgYXJjaF91cHJvYmVfcG9zdF94b2woKSBmYWlsZWQuCi0gKiBSZXNldCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byBpdHMgcHJvYmVkIGFkZHJlc3MgZm9yIHRoZSBwb3RlbnRpYWwKLSAqIHJlc3RhcnQgb3IgZm9yIHBvc3QgbW9ydGVtIGFuYWx5c2lzLgorICogdGhlIHRocmVhZCBoYXMgYSBmYXRhbCBzaWduYWwuIFJlc2V0IHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIGl0cworICogcHJvYmVkIGFkZHJlc3MgZm9yIHRoZSBwb3RlbnRpYWwgcmVzdGFydCBvciBmb3IgcG9zdCBtb3J0ZW0gYW5hbHlzaXMuCiAgKi8KIHZvaWQgYXJjaF91cHJvYmVfYWJvcnRfeG9sKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHVwcm9iZV90YXNrICp1dGFzayA9IGN1cnJlbnQtPnV0YXNrOwogCi0JY3VycmVudC0+dGhyZWFkLnRyYXBfbnIgPSB1dGFzay0+YXV0YXNrLnNhdmVkX3RyYXBfbnI7Ci0JaGFuZGxlX3JpcHJlbF9wb3N0X3hvbChhdXByb2JlLCByZWdzLCBOVUxMKTsKLQlpbnN0cnVjdGlvbl9wb2ludGVyX3NldChyZWdzLCB1dGFzay0+dmFkZHIpOworCWlmIChhdXByb2JlLT5vcHMtPmFib3J0KQorCQlhdXByb2JlLT5vcHMtPmFib3J0KGF1cHJvYmUsIHJlZ3MpOwogCisJY3VycmVudC0+dGhyZWFkLnRyYXBfbnIgPSB1dGFzay0+YXV0YXNrLnNhdmVkX3RyYXBfbnI7CisJcmVncy0+aXAgPSB1dGFzay0+dmFkZHI7CiAJLyogY2xlYXIgVEYgaWYgaXQgd2FzIHNldCBieSB1cyBpbiBhcmNoX3Vwcm9iZV9wcmVfeG9sKCkgKi8KIAlpZiAoIXV0YXNrLT5hdXRhc2suc2F2ZWRfdGYpCiAJCXJlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX1RGOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3RodW5rXzMyLlMgYi9hcmNoL3g4Ni9saWIvdGh1bmtfMzIuUwppbmRleCAyOTMwYWUwLi4yOGY4NWM5MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3RodW5rXzMyLlMKKysrIGIvYXJjaC94ODYvbGliL3RodW5rXzMyLlMKQEAgLTQsOCArNCw4IEBACiAgKiAgKGluc3BpcmVkIGJ5IEFuZGkgS2xlZW4ncyB0aHVua182NC5TKQogICogU3ViamVjdCB0byB0aGUgR05VIHB1YmxpYyBsaWNlbnNlLCB2LjIuIE5vIHdhcnJhbnR5IG9mIGFueSBraW5kLgogICovCi0KIAkjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCSNpbmNsdWRlIDxhc20vYXNtLmg+CiAKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKIAkvKiBwdXQgcmV0dXJuIGFkZHJlc3MgaW4gZWF4IChhcmcxKSAqLwpAQCAtMjIsNiArMjIsNyBAQAogCXBvcGwgJWVjeAogCXBvcGwgJWVheAogCXJldAorCV9BU01fTk9LUFJPQkUoXG5hbWUpCiAJLmVuZG0KIAogCXRodW5rX3JhIHRyYWNlX2hhcmRpcnFzX29uX3RodW5rLHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3RodW5rXzY0LlMgYi9hcmNoL3g4Ni9saWIvdGh1bmtfNjQuUwppbmRleCBhNjNlZmQ2Li45MmQ5ZmVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvdGh1bmtfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvdGh1bmtfNjQuUwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgogI2luY2x1ZGUgPGFzbS9jYWxsaW5nLmg+CisjaW5jbHVkZSA8YXNtL2FzbS5oPgogCiAJLyogcmRpOglhcmcxIC4uLiBub3JtYWwgQyBjb252ZW50aW9ucy4gcmF4IGlzIHNhdmVkL3Jlc3RvcmVkLiAqLwogCS5tYWNybyBUSFVOSyBuYW1lLCBmdW5jLCBwdXRfcmV0X2FkZHJfaW5fcmRpPTAKQEAgLTI1LDYgKzI2LDcgQEAKIAljYWxsIFxmdW5jCiAJam1wICByZXN0b3JlCiAJQ0ZJX0VORFBST0MKKwlfQVNNX05PS1BST0JFKFxuYW1lKQogCS5lbmRtCiAKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKQEAgLTQzLDMgKzQ1LDQgQEAKIAlSRVNUT1JFX0FSR1MKIAlyZXQKIAlDRklfRU5EUFJPQworCV9BU01fTk9LUFJPQkUocmVzdG9yZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IDg1OGI0N2IuLjM2NjQyNzkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTgsNyArOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CQkvKiBvb3BzX2JlZ2luL2VuZCwgLi4uCQkqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkJLyogc2VhcmNoX2V4Y2VwdGlvbl90YWJsZQkqLwogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4JCS8qIG1heF9sb3dfcGZuCQkJKi8KLSNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CQkvKiBfX2twcm9iZXMsIC4uLgkJKi8KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CQkvKiBOT0tQUk9CRV9TWU1CT0wsIC4uLgkJKi8KICNpbmNsdWRlIDxsaW51eC9tbWlvdHJhY2UuaD4JCS8qIGttbWlvX2hhbmRsZXIsIC4uLgkJKi8KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CQkvKiBwZXJmX3N3X2V2ZW50CQkqLwogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4JCS8qIGhzdGF0ZV9pbmRleF90b19zaGlmdAkqLwpAQCAtNDYsNyArNDYsNyBAQAogICogUmV0dXJucyAwIGlmIG1taW90cmFjZSBpcyBkaXNhYmxlZCwgb3IgaWYgdGhlIGZhdWx0IGlzIG5vdAogICogaGFuZGxlZCBieSBtbWlvdHJhY2U6CiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fa3Byb2Jlcworc3RhdGljIG5va3Byb2JlX2lubGluZSBpbnQKIGttbWlvX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaWYgKHVubGlrZWx5KGlzX2ttbWlvX2FjdGl2ZSgpKSkKQEAgLTU1LDcgKzU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19rcHJvYmVzIGtwcm9iZXNfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIGludCBrcHJvYmVzX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCByZXQgPSAwOwogCkBAIC0yNjIsNyArMjYyLDcgQEAKICAqCiAgKiAgIEhhbmRsZSBhIGZhdWx0IG9uIHRoZSB2bWFsbG9jIG9yIG1vZHVsZSBtYXBwaW5nIGFyZWEKICAqLwotc3RhdGljIG5vaW5saW5lIF9fa3Byb2JlcyBpbnQgdm1hbGxvY19mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgbm9pbmxpbmUgaW50IHZtYWxsb2NfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgcGdkX3BhZGRyOwogCXBtZF90ICpwbWRfazsKQEAgLTI5Miw2ICsyOTIsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitOT0tQUk9CRV9TWU1CT0wodm1hbGxvY19mYXVsdCk7CiAKIC8qCiAgKiBEaWQgaXQgaGl0IHRoZSBET1Mgc2NyZWVuIG1lbW9yeSBWQSBmcm9tIHZtODYgbW9kZT8KQEAgLTM1OSw3ICszNjAsNyBAQAogICoKICAqIFRoaXMgYXNzdW1lcyBubyBsYXJnZSBwYWdlcyBpbiB0aGVyZS4KICAqLwotc3RhdGljIG5vaW5saW5lIF9fa3Byb2JlcyBpbnQgdm1hbGxvY19mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgbm9pbmxpbmUgaW50IHZtYWxsb2NfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXBnZF90ICpwZ2QsICpwZ2RfcmVmOwogCXB1ZF90ICpwdWQsICpwdWRfcmVmOwpAQCAtNDI2LDYgKzQyNyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK05PS1BST0JFX1NZTUJPTCh2bWFsbG9jX2ZhdWx0KTsKIAogI2lmZGVmIENPTkZJR19DUFVfU1VQX0FNRAogc3RhdGljIGNvbnN0IGNoYXIgZXJyYXRhOTNfd2FybmluZ1tdID0KQEAgLTkyOCw3ICs5MzAsNyBAQAogICogVGhlcmUgYXJlIG5vIHNlY3VyaXR5IGltcGxpY2F0aW9ucyB0byBsZWF2aW5nIGEgc3RhbGUgVExCIHdoZW4KICAqIGluY3JlYXNpbmcgdGhlIHBlcm1pc3Npb25zIG9uIGEgcGFnZS4KICAqLwotc3RhdGljIG5vaW5saW5lIF9fa3Byb2JlcyBpbnQKK3N0YXRpYyBub2lubGluZSBpbnQKIHNwdXJpb3VzX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXBnZF90ICpwZ2Q7CkBAIC05NzYsNiArOTc4LDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitOT0tQUk9CRV9TWU1CT0woc3B1cmlvdXNfZmF1bHQpOwogCiBpbnQgc2hvd191bmhhbmRsZWRfc2lnbmFscyA9IDE7CiAKQEAgLTEwMzEsNyArMTAzNCw3IEBACiAgKiB7LHRyYWNlX31kb19wYWdlX2ZhdWx0KCkgaGF2ZSBub3RyYWNlIG9uLiBIYXZpbmcgdGhpcyBhbiBhY3R1YWwgZnVuY3Rpb24KICAqIGd1YXJhbnRlZXMgdGhlcmUncyBhIGZ1bmN0aW9uIHRyYWNlIGVudHJ5LgogICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgbm9pbmxpbmUKK3N0YXRpYyBub2lubGluZSB2b2lkCiBfX2RvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSwKIAkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewpAQCAtMTI1NCw4ICsxMjU3LDkgQEAKIAogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiB9CitOT0tQUk9CRV9TWU1CT0woX19kb19wYWdlX2ZhdWx0KTsKIAotZG90cmFwbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBub3RyYWNlCitkb3RyYXBsaW5rYWdlIHZvaWQgbm90cmFjZQogZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHJlYWRfY3IyKCk7IC8qIEdldCB0aGUgZmF1bHRpbmcgYWRkcmVzcyAqLwpAQCAtMTI3MywxMCArMTI3NywxMiBAQAogCV9fZG9fcGFnZV9mYXVsdChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIH0KK05PS1BST0JFX1NZTUJPTChkb19wYWdlX2ZhdWx0KTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi1zdGF0aWMgdm9pZCB0cmFjZV9wYWdlX2ZhdWx0X2VudHJpZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgdm9pZAordHJhY2VfcGFnZV9mYXVsdF9lbnRyaWVzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCWlmICh1c2VyX21vZGUocmVncykpCiAJCXRyYWNlX3BhZ2VfZmF1bHRfdXNlcihhZGRyZXNzLCByZWdzLCBlcnJvcl9jb2RlKTsKQEAgLTEyODQsNyArMTI5MCw3IEBACiAJCXRyYWNlX3BhZ2VfZmF1bHRfa2VybmVsKGFkZHJlc3MsIHJlZ3MsIGVycm9yX2NvZGUpOwogfQogCi1kb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzIG5vdHJhY2UKK2RvdHJhcGxpbmthZ2Ugdm9pZCBub3RyYWNlCiB0cmFjZV9kb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7CiAJLyoKQEAgLTEzMDEsNCArMTMwNyw1IEBACiAJX19kb19wYWdlX2ZhdWx0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOwogCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogfQorTk9LUFJPQkVfU1lNQk9MKHRyYWNlX2RvX3BhZ2VfZmF1bHQpOwogI2VuZGlmIC8qIENPTkZJR19UUkFDSU5HICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9uZXQvYnBmX2ppdC5TIGIvYXJjaC94ODYvbmV0L2JwZl9qaXQuUwppbmRleCAwMTQ5NTc1Li42NDQwMjIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9uZXQvYnBmX2ppdC5TCisrKyBiL2FyY2gveDg2L25ldC9icGZfaml0LlMKQEAgLTEyLDEzICsxMiwxNiBAQAogCiAvKgogICogQ2FsbGluZyBjb252ZW50aW9uIDoKLSAqIHJkaSA6IHNrYiBwb2ludGVyCisgKiByYnggOiBza2IgcG9pbnRlciAoY2FsbGVlIHNhdmVkKQogICogZXNpIDogb2Zmc2V0IG9mIGJ5dGUocykgdG8gZmV0Y2ggaW4gc2tiIChjYW4gYmUgc2NyYXRjaGVkKQotICogcjggIDogY29weSBvZiBza2ItPmRhdGEKKyAqIHIxMCA6IGNvcHkgb2Ygc2tiLT5kYXRhCiAgKiByOWQgOiBobGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuCiAgKi8KLSNkZWZpbmUgU0tCREFUQQklcjgKKyNkZWZpbmUgU0tCREFUQQklcjEwCiAjZGVmaW5lIFNLRl9NQVhfTkVHX09GRiAgICAkKC0weDIwMDAwMCkgLyogU0tGX0xMX09GRiBmcm9tIGZpbHRlci5oICovCisjZGVmaW5lIE1BWF9CUEZfU1RBQ0sgKDUxMiAvKiBmcm9tIGZpbHRlci5oICovICsgXAorCTMyIC8qIHNwYWNlIGZvciByYngscjEzLHIxNCxyMTUgKi8gKyBcCisJOCAvKiBzcGFjZSBmb3Igc2tiX2NvcHlfYml0cyAqLykKIAogc2tfbG9hZF93b3JkOgogCS5nbG9ibAlza19sb2FkX3dvcmQKQEAgLTY4LDUzICs3MSwzMSBAQAogCW1vdnpibAkoU0tCREFUQSwlcnNpKSwlZWF4CiAJcmV0CiAKLS8qKgotICogc2tfbG9hZF9ieXRlX21zaCAtIEJQRl9TX0xEWF9CX01TSCBoZWxwZXIKLSAqCi0gKiBJbXBsZW1lbnRzIEJQRl9TX0xEWF9CX01TSCA6IGxkeGIgIDQqKFtvZmZzZXRdJjB4ZikKLSAqIE11c3QgcHJlc2VydmUgQSBhY2N1bXVsYXRvciAoJWVheCkKLSAqIElucHV0cyA6ICVlc2kgaXMgdGhlIG9mZnNldCB2YWx1ZQotICovCi1za19sb2FkX2J5dGVfbXNoOgotCS5nbG9ibAlza19sb2FkX2J5dGVfbXNoCi0JdGVzdAklZXNpLCVlc2kKLQlqcwlicGZfc2xvd19wYXRoX2J5dGVfbXNoX25lZwotCi1za19sb2FkX2J5dGVfbXNoX3Bvc2l0aXZlX29mZnNldDoKLQkuZ2xvYmwJc2tfbG9hZF9ieXRlX21zaF9wb3NpdGl2ZV9vZmZzZXQKLQljbXAJJWVzaSwlcjlkICAgICAgLyogaWYgKG9mZnNldCA+PSBobGVuKSBnb3RvIGJwZl9zbG93X3BhdGhfYnl0ZV9tc2ggKi8KLQlqbGUJYnBmX3Nsb3dfcGF0aF9ieXRlX21zaAotCW1vdnpibAkoU0tCREFUQSwlcnNpKSwlZWJ4Ci0JYW5kCSQxNSwlYmwKLQlzaGwJJDIsJWJsCi0JcmV0Ci0KIC8qIHJzaSBjb250YWlucyBvZmZzZXQgYW5kIGNhbiBiZSBzY3JhdGNoZWQgKi8KICNkZWZpbmUgYnBmX3Nsb3dfcGF0aF9jb21tb24oTEVOKQkJXAotCXB1c2gJJXJkaTsgICAgLyogc2F2ZSBza2IgKi8JCVwKKwltb3YJJXJieCwgJXJkaTsgLyogYXJnMSA9PSBza2IgKi8JXAogCXB1c2gJJXI5OwkJCQlcCiAJcHVzaAlTS0JEQVRBOwkJCVwKIC8qIHJzaSBhbHJlYWR5IGhhcyBvZmZzZXQgKi8JCQlcCiAJbW92CSRMRU4sJWVjeDsJLyogbGVuICovCVwKLQlsZWEJLTEyKCVyYnApLCVyZHg7CQkJXAorCWxlYQktIE1BWF9CUEZfU1RBQ0sgKyAzMiglcmJwKSwlcmR4OwkJCVwKIAljYWxsCXNrYl9jb3B5X2JpdHM7CQkJXAogCXRlc3QgICAgJWVheCwlZWF4OwkJCVwKIAlwb3AJU0tCREFUQTsJCQlcCi0JcG9wCSVyOTsJCQkJXAotCXBvcAklcmRpCisJcG9wCSVyOTsKIAogCiBicGZfc2xvd19wYXRoX3dvcmQ6CiAJYnBmX3Nsb3dfcGF0aF9jb21tb24oNCkKIAlqcwlicGZfZXJyb3IKLQltb3YJLTEyKCVyYnApLCVlYXgKKwltb3YJLSBNQVhfQlBGX1NUQUNLICsgMzIoJXJicCksJWVheAogCWJzd2FwCSVlYXgKIAlyZXQKIAogYnBmX3Nsb3dfcGF0aF9oYWxmOgogCWJwZl9zbG93X3BhdGhfY29tbW9uKDIpCiAJanMJYnBmX2Vycm9yCi0JbW92CS0xMiglcmJwKSwlYXgKKwltb3YJLSBNQVhfQlBGX1NUQUNLICsgMzIoJXJicCksJWF4CiAJcm9sCSQ4LCVheAogCW1vdnp3bAklYXgsJWVheAogCXJldApAQCAtMTIyLDIxICsxMDMsMTEgQEAKIGJwZl9zbG93X3BhdGhfYnl0ZToKIAlicGZfc2xvd19wYXRoX2NvbW1vbigxKQogCWpzCWJwZl9lcnJvcgotCW1vdnpibAktMTIoJXJicCksJWVheAotCXJldAotCi1icGZfc2xvd19wYXRoX2J5dGVfbXNoOgotCXhjaGcJJWVheCwlZWJ4IC8qIGRvbnQgbG9zZSBBICwgWCBpcyBhYm91dCB0byBiZSBzY3JhdGNoZWQgKi8KLQlicGZfc2xvd19wYXRoX2NvbW1vbigxKQotCWpzCWJwZl9lcnJvcgotCW1vdnpibAktMTIoJXJicCksJWVheAotCWFuZAkkMTUsJWFsCi0Jc2hsCSQyLCVhbAotCXhjaGcJJWVheCwlZWJ4CisJbW92emJsCS0gTUFYX0JQRl9TVEFDSyArIDMyKCVyYnApLCVlYXgKIAlyZXQKIAogI2RlZmluZSBza19uZWdhdGl2ZV9jb21tb24oU0laRSkJCQkJXAotCXB1c2gJJXJkaTsJLyogc2F2ZSBza2IgKi8JCQkJXAorCW1vdgklcmJ4LCAlcmRpOyAvKiBhcmcxID09IHNrYiAqLwkJCVwKIAlwdXNoCSVyOTsJCQkJCQlcCiAJcHVzaAlTS0JEQVRBOwkJCQkJXAogLyogcnNpIGFscmVhZHkgaGFzIG9mZnNldCAqLwkJCQkJXApAQCAtMTQ1LDEwICsxMTYsOCBAQAogCXRlc3QJJXJheCwlcmF4OwkJCQkJXAogCXBvcAlTS0JEQVRBOwkJCQkJXAogCXBvcAklcjk7CQkJCQkJXAotCXBvcAklcmRpOwkJCQkJCVwKIAlqeglicGZfZXJyb3IKIAotCiBicGZfc2xvd19wYXRoX3dvcmRfbmVnOgogCWNtcAlTS0ZfTUFYX05FR19PRkYsICVlc2kJLyogdGVzdCByYW5nZSAqLwogCWpsCWJwZl9lcnJvcgkvKiBvZmZzZXQgbG93ZXIgLT4gZXJyb3IgICovCkBAIC0xNzksMjIgKzE0OCwxMiBAQAogCW1vdnpibAkoJXJheCksICVlYXgKIAlyZXQKIAotYnBmX3Nsb3dfcGF0aF9ieXRlX21zaF9uZWc6Ci0JY21wCVNLRl9NQVhfTkVHX09GRiwgJWVzaQotCWpsCWJwZl9lcnJvcgotc2tfbG9hZF9ieXRlX21zaF9uZWdhdGl2ZV9vZmZzZXQ6Ci0JLmdsb2JsCXNrX2xvYWRfYnl0ZV9tc2hfbmVnYXRpdmVfb2Zmc2V0Ci0JeGNoZwklZWF4LCVlYnggLyogZG9udCBsb3NlIEEgLCBYIGlzIGFib3V0IHRvIGJlIHNjcmF0Y2hlZCAqLwotCXNrX25lZ2F0aXZlX2NvbW1vbigxKQotCW1vdnpibAkoJXJheCksJWVheAotCWFuZAkkMTUsJWFsCi0Jc2hsCSQyLCVhbAotCXhjaGcJJWVheCwlZWJ4Ci0JcmV0Ci0KIGJwZl9lcnJvcjoKICMgZm9yY2UgYSByZXR1cm4gMCBmcm9tIGppdCBoYW5kbGVyCi0JeG9yCQklZWF4LCVlYXgKLQltb3YJCS04KCVyYnApLCVyYngKKwl4b3IJJWVheCwlZWF4CisJbW92CS0gTUFYX0JQRl9TVEFDSyglcmJwKSwlcmJ4CisJbW92CS0gTUFYX0JQRl9TVEFDSyArIDgoJXJicCksJXIxMworCW1vdgktIE1BWF9CUEZfU1RBQ0sgKyAxNiglcmJwKSwlcjE0CisJbW92CS0gTUFYX0JQRl9TVEFDSyArIDI0KCVyYnApLCVyMTUKIAlsZWF2ZXEKIAlyZXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYyBiL2FyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYwppbmRleCA2ZDU2NjNhLi45OWJlZjg2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMKKysrIGIvYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jCkBAIC0xLDYgKzEsNyBAQAogLyogYnBmX2ppdF9jb21wLmMgOiBCUEYgSklUIGNvbXBpbGVyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRXJpYyBEdW1hemV0IChlcmljLmR1bWF6ZXRAZ21haWwuY29tKQorICogSW50ZXJuYWwgQlBGIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFBMVU1ncmlkLCBodHRwOi8vcGx1bWdyaWQuY29tCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTE0LDI4ICsxNSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAotLyoKLSAqIENvbnZlbnRpb25zIDoKLSAqICBFQVggOiBCUEYgQSBhY2N1bXVsYXRvcgotICogIEVCWCA6IEJQRiBYIGFjY3VtdWxhdG9yCi0gKiAgUkRJIDogcG9pbnRlciB0byBza2IgICAoZmlyc3QgYXJndW1lbnQgZ2l2ZW4gdG8gSklUIGZ1bmN0aW9uKQotICogIFJCUCA6IGZyYW1lIHBvaW50ZXIgKGV2ZW4gaWYgQ09ORklHX0ZSQU1FX1BPSU5URVI9bikKLSAqICBFQ1gsRURYLEVTSSA6IHNjcmF0Y2ggcmVnaXN0ZXJzCi0gKiAgcjlkIDogc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuIChoZWFkbGVuKQotICogIHI4ICA6IHNrYi0+ZGF0YQotICogLTgoUkJQKSA6IHNhdmVkIFJCWCB2YWx1ZQotICogLTE2KFJCUCkuLi04MChSQlApIDogQlBGX01FTVdPUkRTIHZhbHVlcwotICovCiBpbnQgYnBmX2ppdF9lbmFibGUgX19yZWFkX21vc3RseTsKIAogLyoKICAqIGFzc2VtYmx5IGNvZGUgaW4gYXJjaC94ODYvbmV0L2JwZl9qaXQuUwogICovCi1leHRlcm4gdTggc2tfbG9hZF93b3JkW10sIHNrX2xvYWRfaGFsZltdLCBza19sb2FkX2J5dGVbXSwgc2tfbG9hZF9ieXRlX21zaFtdOworZXh0ZXJuIHU4IHNrX2xvYWRfd29yZFtdLCBza19sb2FkX2hhbGZbXSwgc2tfbG9hZF9ieXRlW107CiBleHRlcm4gdTggc2tfbG9hZF93b3JkX3Bvc2l0aXZlX29mZnNldFtdLCBza19sb2FkX2hhbGZfcG9zaXRpdmVfb2Zmc2V0W107Ci1leHRlcm4gdTggc2tfbG9hZF9ieXRlX3Bvc2l0aXZlX29mZnNldFtdLCBza19sb2FkX2J5dGVfbXNoX3Bvc2l0aXZlX29mZnNldFtdOworZXh0ZXJuIHU4IHNrX2xvYWRfYnl0ZV9wb3NpdGl2ZV9vZmZzZXRbXTsKIGV4dGVybiB1OCBza19sb2FkX3dvcmRfbmVnYXRpdmVfb2Zmc2V0W10sIHNrX2xvYWRfaGFsZl9uZWdhdGl2ZV9vZmZzZXRbXTsKLWV4dGVybiB1OCBza19sb2FkX2J5dGVfbmVnYXRpdmVfb2Zmc2V0W10sIHNrX2xvYWRfYnl0ZV9tc2hfbmVnYXRpdmVfb2Zmc2V0W107CitleHRlcm4gdTggc2tfbG9hZF9ieXRlX25lZ2F0aXZlX29mZnNldFtdOwogCiBzdGF0aWMgaW5saW5lIHU4ICplbWl0X2NvZGUodTggKnB0ciwgdTMyIGJ5dGVzLCB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtNTYsMzAgKzQ1LDQ0IEBACiAjZGVmaW5lIEVNSVQyKGIxLCBiMikJCUVNSVQoKGIxKSArICgoYjIpIDw8IDgpLCAyKQogI2RlZmluZSBFTUlUMyhiMSwgYjIsIGIzKQlFTUlUKChiMSkgKyAoKGIyKSA8PCA4KSArICgoYjMpIDw8IDE2KSwgMykKICNkZWZpbmUgRU1JVDQoYjEsIGIyLCBiMywgYjQpICAgRU1JVCgoYjEpICsgKChiMikgPDwgOCkgKyAoKGIzKSA8PCAxNikgKyAoKGI0KSA8PCAyNCksIDQpCi0jZGVmaW5lIEVNSVQxX29mZjMyKGIxLCBvZmYpCWRvIHsgRU1JVDEoYjEpOyBFTUlUKG9mZiwgNCk7fSB3aGlsZSAoMCkKLQotI2RlZmluZSBDTEVBUl9BKCkgRU1JVDIoMHgzMSwgMHhjMCkgLyogeG9yICVlYXgsJWVheCAqLwotI2RlZmluZSBDTEVBUl9YKCkgRU1JVDIoMHgzMSwgMHhkYikgLyogeG9yICVlYngsJWVieCAqLworI2RlZmluZSBFTUlUMV9vZmYzMihiMSwgb2ZmKSBcCisJZG8ge0VNSVQxKGIxKTsgRU1JVChvZmYsIDQpOyB9IHdoaWxlICgwKQorI2RlZmluZSBFTUlUMl9vZmYzMihiMSwgYjIsIG9mZikgXAorCWRvIHtFTUlUMihiMSwgYjIpOyBFTUlUKG9mZiwgNCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIEVNSVQzX29mZjMyKGIxLCBiMiwgYjMsIG9mZikgXAorCWRvIHtFTUlUMyhiMSwgYjIsIGIzKTsgRU1JVChvZmYsIDQpOyB9IHdoaWxlICgwKQorI2RlZmluZSBFTUlUNF9vZmYzMihiMSwgYjIsIGIzLCBiNCwgb2ZmKSBcCisJZG8ge0VNSVQ0KGIxLCBiMiwgYjMsIGI0KTsgRU1JVChvZmYsIDQpOyB9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfaW1tOChpbnQgdmFsdWUpCiB7CiAJcmV0dXJuIHZhbHVlIDw9IDEyNyAmJiB2YWx1ZSA+PSAtMTI4OwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNfbmVhcihpbnQgb2Zmc2V0KQorc3RhdGljIGlubGluZSBib29sIGlzX3NpbW0zMihzNjQgdmFsdWUpCiB7Ci0JcmV0dXJuIG9mZnNldCA8PSAxMjcgJiYgb2Zmc2V0ID49IC0xMjg7CisJcmV0dXJuIHZhbHVlID09IChzNjQpIChzMzIpIHZhbHVlOwogfQogCi0jZGVmaW5lIEVNSVRfSk1QKG9mZnNldCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChvZmZzZXQpIHsJCQkJCQkJXAotCQlpZiAoaXNfbmVhcihvZmZzZXQpKQkJCQkJXAotCQkJRU1JVDIoMHhlYiwgb2Zmc2V0KTsgLyogam1wIC4rb2ZmOCAqLwkJXAotCQllbHNlCQkJCQkJCVwKLQkJCUVNSVQxX29mZjMyKDB4ZTksIG9mZnNldCk7IC8qIGptcCAuK29mZjMyICovCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQorLyogbW92IGRzdCwgc3JjICovCisjZGVmaW5lIEVNSVRfbW92KERTVCwgU1JDKSBcCisJZG8ge2lmIChEU1QgIT0gU1JDKSBcCisJCUVNSVQzKGFkZF8ybW9kKDB4NDgsIERTVCwgU1JDKSwgMHg4OSwgYWRkXzJyZWcoMHhDMCwgRFNULCBTUkMpKTsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYnBmX3NpemVfdG9feDg2X2J5dGVzKGludCBicGZfc2l6ZSkKK3sKKwlpZiAoYnBmX3NpemUgPT0gQlBGX1cpCisJCXJldHVybiA0OworCWVsc2UgaWYgKGJwZl9zaXplID09IEJQRl9IKQorCQlyZXR1cm4gMjsKKwllbHNlIGlmIChicGZfc2l6ZSA9PSBCUEZfQikKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYnBmX3NpemUgPT0gQlBGX0RXKQorCQlyZXR1cm4gNDsgLyogaW1tMzIgKi8KKwllbHNlCisJCXJldHVybiAwOworfQogCiAvKiBsaXN0IG9mIHg4NiBjb25kIGp1bXBzIG9wY29kZXMgKC4gKyBzOCkKICAqIEFkZCAweDEwIChhbmQgYW4gZXh0cmEgMHgwZikgdG8gZ2VuZXJhdGUgZmFyIGp1bXBzICguICsgczMyKQpAQCAtOTAsMjcgKzkzLDggQEAKICNkZWZpbmUgWDg2X0pORSAweDc1CiAjZGVmaW5lIFg4Nl9KQkUgMHg3NgogI2RlZmluZSBYODZfSkEgIDB4NzcKLQotI2RlZmluZSBFTUlUX0NPTkRfSk1QKG9wLCBvZmZzZXQpCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlpZiAoaXNfbmVhcihvZmZzZXQpKQkJCQkJXAotCQlFTUlUMihvcCwgb2Zmc2V0KTsgLyoganh4IC4rb2ZmOCAqLwkJXAotCWVsc2UgewkJCQkJCQlcCi0JCUVNSVQyKDB4MGYsIG9wICsgMHgxMCk7CQkJCVwKLQkJRU1JVChvZmZzZXQsIDQpOyAvKiBqeHggLitvZmYzMiAqLwkJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDT05EX1NFTChDT0RFLCBUT1AsIEZPUCkJXAotCWNhc2UgQ09ERToJCQlcCi0JCXRfb3AgPSBUT1A7CQlcCi0JCWZfb3AgPSBGT1A7CQlcCi0JCWdvdG8gY29uZF9icmFuY2gKLQotCi0jZGVmaW5lIFNFRU5fREFUQVJFRiAxIC8qIG1pZ2h0IGNhbGwgZXh0ZXJuYWwgaGVscGVycyAqLwotI2RlZmluZSBTRUVOX1hSRUcgICAgMiAvKiBlYnggaXMgdXNlZCAqLwotI2RlZmluZSBTRUVOX01FTSAgICAgNCAvKiB1c2UgbWVtW10gZm9yIHRlbXBvcmFyeSBzdG9yYWdlICovCisjZGVmaW5lIFg4Nl9KR0UgMHg3RAorI2RlZmluZSBYODZfSkcgIDB4N0YKIAogc3RhdGljIGlubGluZSB2b2lkIGJwZl9mbHVzaF9pY2FjaGUodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKIHsKQEAgLTEyNSwyNiArMTA5LDYgQEAKICNkZWZpbmUgQ0hPT1NFX0xPQURfRlVOQyhLLCBmdW5jKSBcCiAJKChpbnQpSyA8IDAgPyAoKGludClLID49IFNLRl9MTF9PRkYgPyBmdW5jIyNfbmVnYXRpdmVfb2Zmc2V0IDogZnVuYykgOiBmdW5jIyNfcG9zaXRpdmVfb2Zmc2V0KQogCi0vKiBIZWxwZXIgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIHBrdF90eXBlIGluIHNrX2J1ZmYKLSAqIFdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0cyBzdGlsbCBhIDNiaXQgZmllbGQgc3RhcnRpbmcgYXQgYSBieXRlIGJvdW5kYXJ5LgotICovCi0jZGVmaW5lIFBLVF9UWVBFX01BWCA3Ci1zdGF0aWMgaW50IHBrdF90eXBlX29mZnNldCh2b2lkKQotewotCXN0cnVjdCBza19idWZmIHNrYl9wcm9iZSA9IHsKLQkJLnBrdF90eXBlID0gfjAsCi0JfTsKLQljaGFyICpjdCA9IChjaGFyICopJnNrYl9wcm9iZTsKLQl1bnNpZ25lZCBpbnQgb2ZmOwotCi0JZm9yIChvZmYgPSAwOyBvZmYgPCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOyBvZmYrKykgewotCQlpZiAoY3Rbb2ZmXSA9PSBQS1RfVFlQRV9NQVgpCi0JCQlyZXR1cm4gb2ZmOwotCX0KLQlwcl9lcnJfb25jZSgiUGxlYXNlIGZpeCBwa3RfdHlwZV9vZmZzZXQoKSwgYXMgcGt0X3R5cGUgY291bGRuJ3QgYmUgZm91bmRcbiIpOwotCXJldHVybiAtMTsKLX0KLQogc3RydWN0IGJwZl9iaW5hcnlfaGVhZGVyIHsKIAl1bnNpZ25lZCBpbnQJcGFnZXM7CiAJLyogTm90ZSA6IGZvciBzZWN1cml0eSByZWFzb25zLCBicGYgY29kZSB3aWxsIGZvbGxvdyBhIHJhbmRvbWx5CkBAIC0xNzgsNTgzICsxNDIsNzcxIEBACiAJcmV0dXJuIGhlYWRlcjsKIH0KIAotdm9pZCBicGZfaml0X2NvbXBpbGUoc3RydWN0IHNrX2ZpbHRlciAqZnApCisvKiBwaWNrIGEgcmVnaXN0ZXIgb3V0c2lkZSBvZiBCUEYgcmFuZ2UgZm9yIEpJVCBpbnRlcm5hbCB3b3JrICovCisjZGVmaW5lIEFVWF9SRUcgKE1BWF9CUEZfUkVHICsgMSkKKworLyogdGhlIGZvbGxvd2luZyB0YWJsZSBtYXBzIEJQRiByZWdpc3RlcnMgdG8geDY0IHJlZ2lzdGVycy4KKyAqIHg2NCByZWdpc3RlciByMTIgaXMgdW51c2VkLCBzaW5jZSBpZiB1c2VkIGFzIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorICogaW4gbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMsIGl0IGFsd2F5cyBuZWVkcyBhbiBleHRyYSBieXRlIG9mIGVuY29kaW5nCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgcmVnMmhleFtdID0geworCVtCUEZfUkVHXzBdID0gMCwgIC8qIHJheCAqLworCVtCUEZfUkVHXzFdID0gNywgIC8qIHJkaSAqLworCVtCUEZfUkVHXzJdID0gNiwgIC8qIHJzaSAqLworCVtCUEZfUkVHXzNdID0gMiwgIC8qIHJkeCAqLworCVtCUEZfUkVHXzRdID0gMSwgIC8qIHJjeCAqLworCVtCUEZfUkVHXzVdID0gMCwgIC8qIHI4ICovCisJW0JQRl9SRUdfNl0gPSAzLCAgLyogcmJ4IGNhbGxlZSBzYXZlZCAqLworCVtCUEZfUkVHXzddID0gNSwgIC8qIHIxMyBjYWxsZWUgc2F2ZWQgKi8KKwlbQlBGX1JFR184XSA9IDYsICAvKiByMTQgY2FsbGVlIHNhdmVkICovCisJW0JQRl9SRUdfOV0gPSA3LCAgLyogcjE1IGNhbGxlZSBzYXZlZCAqLworCVtCUEZfUkVHX0ZQXSA9IDUsIC8qIHJicCByZWFkb25seSAqLworCVtBVVhfUkVHXSA9IDMsICAgIC8qIHIxMSB0ZW1wIHJlZ2lzdGVyICovCit9OworCisvKiBpc19lcmVnKCkgPT0gdHJ1ZSBpZiBCUEYgcmVnaXN0ZXIgJ3JlZycgbWFwcyB0byB4NjQgcjguLnIxNQorICogd2hpY2ggbmVlZCBleHRyYSBieXRlIG9mIGVuY29kaW5nLgorICogcmF4LHJjeCwuLi4scmJwIGhhdmUgc2ltcGxlciBlbmNvZGluZworICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZXJlZyh1MzIgcmVnKQogewotCXU4IHRlbXBbNjRdOwotCXU4ICpwcm9nOwotCXVuc2lnbmVkIGludCBwcm9nbGVuLCBvbGRwcm9nbGVuID0gMDsKLQlpbnQgaWxlbiwgaTsKLQlpbnQgdF9vZmZzZXQsIGZfb2Zmc2V0OwotCXU4IHRfb3AsIGZfb3AsIHNlZW4gPSAwLCBwYXNzOwotCXU4ICppbWFnZSA9IE5VTEw7Ci0Jc3RydWN0IGJwZl9iaW5hcnlfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwotCXU4ICpmdW5jOwotCWludCBwY19yZXQwID0gLTE7IC8qIGJwZiBpbmRleCBvZiBmaXJzdCBSRVQgIzAgaW5zdHJ1Y3Rpb24gKGlmIGFueSkgKi8KKwlpZiAocmVnID09IEJQRl9SRUdfNSB8fCByZWcgPT0gQVVYX1JFRyB8fAorCSAgICAocmVnID49IEJQRl9SRUdfNyAmJiByZWcgPD0gQlBGX1JFR185KSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIGFkZCBtb2RpZmllcnMgaWYgJ3JlZycgbWFwcyB0byB4NjQgcmVnaXN0ZXJzIHI4Li5yMTUgKi8KK3N0YXRpYyBpbmxpbmUgdTggYWRkXzFtb2QodTggYnl0ZSwgdTMyIHJlZykKK3sKKwlpZiAoaXNfZXJlZyhyZWcpKQorCQlieXRlIHw9IDE7CisJcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYWRkXzJtb2QodTggYnl0ZSwgdTMyIHIxLCB1MzIgcjIpCit7CisJaWYgKGlzX2VyZWcocjEpKQorCQlieXRlIHw9IDE7CisJaWYgKGlzX2VyZWcocjIpKQorCQlieXRlIHw9IDQ7CisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qIGVuY29kZSAnZHN0X3JlZycgcmVnaXN0ZXIgaW50byB4NjQgb3Bjb2RlICdieXRlJyAqLworc3RhdGljIGlubGluZSB1OCBhZGRfMXJlZyh1OCBieXRlLCB1MzIgZHN0X3JlZykKK3sKKwlyZXR1cm4gYnl0ZSArIHJlZzJoZXhbZHN0X3JlZ107Cit9CisKKy8qIGVuY29kZSAnZHN0X3JlZycgYW5kICdzcmNfcmVnJyByZWdpc3RlcnMgaW50byB4NjQgb3Bjb2RlICdieXRlJyAqLworc3RhdGljIGlubGluZSB1OCBhZGRfMnJlZyh1OCBieXRlLCB1MzIgZHN0X3JlZywgdTMyIHNyY19yZWcpCit7CisJcmV0dXJuIGJ5dGUgKyByZWcyaGV4W2RzdF9yZWddICsgKHJlZzJoZXhbc3JjX3JlZ10gPDwgMyk7Cit9CisKK3N0cnVjdCBqaXRfY29udGV4dCB7CiAJdW5zaWduZWQgaW50IGNsZWFudXBfYWRkcjsgLyogZXBpbG9ndWUgY29kZSBvZmZzZXQgKi8KLQl1bnNpZ25lZCBpbnQgKmFkZHJzOwotCWNvbnN0IHN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdGVyID0gZnAtPmluc25zOwotCWludCBmbGVuID0gZnAtPmxlbjsKKwlib29sIHNlZW5fbGRfYWJzOworfTsKKworc3RhdGljIGludCBkb19qaXQoc3RydWN0IHNrX2ZpbHRlciAqYnBmX3Byb2csIGludCAqYWRkcnMsIHU4ICppbWFnZSwKKwkJICBpbnQgb2xkcHJvZ2xlbiwgc3RydWN0IGppdF9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHNvY2tfZmlsdGVyX2ludCAqaW5zbiA9IGJwZl9wcm9nLT5pbnNuc2k7CisJaW50IGluc25fY250ID0gYnBmX3Byb2ctPmxlbjsKKwl1OCB0ZW1wWzY0XTsKKwlpbnQgaTsKKwlpbnQgcHJvZ2xlbiA9IDA7CisJdTggKnByb2cgPSB0ZW1wOworCWludCBzdGFja3NpemUgPSBNQVhfQlBGX1NUQUNLICsKKwkJMzIgLyogc3BhY2UgZm9yIHJieCwgcjEzLCByMTQsIHIxNSAqLyArCisJCTggLyogc3BhY2UgZm9yIHNrYl9jb3B5X2JpdHMoKSBidWZmZXIgKi87CisKKwlFTUlUMSgweDU1KTsgLyogcHVzaCByYnAgKi8KKwlFTUlUMygweDQ4LCAweDg5LCAweEU1KTsgLyogbW92IHJicCxyc3AgKi8KKworCS8qIHN1YiByc3AsIHN0YWNrc2l6ZSAqLworCUVNSVQzX29mZjMyKDB4NDgsIDB4ODEsIDB4RUMsIHN0YWNrc2l6ZSk7CisKKwkvKiBhbGwgY2xhc3NpYyBCUEYgZmlsdGVycyB1c2UgUjYocmJ4KSBzYXZlIGl0ICovCisKKwkvKiBtb3YgcXdvcmQgcHRyIFtyYnAtWF0scmJ4ICovCisJRU1JVDNfb2ZmMzIoMHg0OCwgMHg4OSwgMHg5RCwgLXN0YWNrc2l6ZSk7CisKKwkvKiBza19jb252ZXJ0X2ZpbHRlcigpIG1hcHMgY2xhc3NpYyBCUEYgcmVnaXN0ZXIgWCB0byBSNyBhbmQgdXNlcyBSOAorCSAqIGFzIHRlbXBvcmFyeSwgc28gYWxsIHRjcGR1bXAgZmlsdGVycyBuZWVkIHRvIHNwaWxsL2ZpbGwgUjcocjEzKSBhbmQKKwkgKiBSOChyMTQpLiBSOShyMTUpIHNwaWxsIGNvdWxkIGJlIG1hZGUgY29uZGl0aW9uYWwsIGJ1dCB0aGVyZSBpcyBvbmx5CisJICogb25lICdicGZfZXJyb3InIHJldHVybiBwYXRoIG91dCBvZiBoZWxwZXIgZnVuY3Rpb25zIGluc2lkZSBicGZfaml0LlMKKwkgKiBUaGUgb3ZlcmhlYWQgb2YgZXh0cmEgc3BpbGwgaXMgbmVnbGlnaWJsZSBmb3IgYW55IGZpbHRlciBvdGhlcgorCSAqIHRoYW4gc3ludGhldGljIG9uZXMuIFRoZXJlZm9yZSBub3Qgd29ydGggYWRkaW5nIGNvbXBsZXhpdHkuCisJICovCisKKwkvKiBtb3YgcXdvcmQgcHRyIFtyYnAtWF0scjEzICovCisJRU1JVDNfb2ZmMzIoMHg0QywgMHg4OSwgMHhBRCwgLXN0YWNrc2l6ZSArIDgpOworCS8qIG1vdiBxd29yZCBwdHIgW3JicC1YXSxyMTQgKi8KKwlFTUlUM19vZmYzMigweDRDLCAweDg5LCAweEI1LCAtc3RhY2tzaXplICsgMTYpOworCS8qIG1vdiBxd29yZCBwdHIgW3JicC1YXSxyMTUgKi8KKwlFTUlUM19vZmYzMigweDRDLCAweDg5LCAweEJELCAtc3RhY2tzaXplICsgMjQpOworCisJLyogY2xlYXIgQSBhbmQgWCByZWdpc3RlcnMgKi8KKwlFTUlUMigweDMxLCAweGMwKTsgLyogeG9yIGVheCwgZWF4ICovCisJRU1JVDMoMHg0RCwgMHgzMSwgMHhFRCk7IC8qIHhvciByMTMsIHIxMyAqLworCisJaWYgKGN0eC0+c2Vlbl9sZF9hYnMpIHsKKwkJLyogcjlkIDogc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuIChoZWFkbGVuKQorCQkgKiByMTAgOiBza2ItPmRhdGEKKwkJICovCisJCWlmIChpc19pbW04KG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKSkKKwkJCS8qIG1vdiAlcjlkLCBvZmY4KCVyZGkpICovCisJCQlFTUlUNCgweDQ0LCAweDhiLCAweDRmLAorCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpOworCQllbHNlCisJCQkvKiBtb3YgJXI5ZCwgb2ZmMzIoJXJkaSkgKi8KKwkJCUVNSVQzX29mZjMyKDB4NDQsIDB4OGIsIDB4OGYsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKKworCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YV9sZW4pKSkKKwkJCS8qIHN1YiAlcjlkLCBvZmY4KCVyZGkpICovCisJCQlFTUlUNCgweDQ0LCAweDJiLCAweDRmLAorCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGFfbGVuKSk7CisJCWVsc2UKKwkJCUVNSVQzX29mZjMyKDB4NDQsIDB4MmIsIDB4OGYsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkYXRhX2xlbikpOworCisJCWlmIChpc19pbW04KG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkYXRhKSkpCisJCQkvKiBtb3YgJXIxMCwgb2ZmOCglcmRpKSAqLworCQkJRU1JVDQoMHg0YywgMHg4YiwgMHg1NywKKwkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkYXRhKSk7CisJCWVsc2UKKwkJCS8qIG1vdiAlcjEwLCBvZmYzMiglcmRpKSAqLworCQkJRU1JVDNfb2ZmMzIoMHg0YywgMHg4YiwgMHg5NywKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CisJCWNvbnN0IHMzMiBpbW0zMiA9IGluc24tPmltbTsKKwkJdTMyIGRzdF9yZWcgPSBpbnNuLT5kc3RfcmVnOworCQl1MzIgc3JjX3JlZyA9IGluc24tPnNyY19yZWc7CisJCXU4IGIxID0gMCwgYjIgPSAwLCBiMyA9IDA7CisJCXM2NCBqbXBfb2Zmc2V0OworCQl1OCBqbXBfY29uZDsKKwkJaW50IGlsZW47CisJCXU4ICpmdW5jOworCisJCXN3aXRjaCAoaW5zbi0+Y29kZSkgeworCQkJLyogQUxVICovCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9TVUIgfCBCUEZfWDoKKwkJY2FzZSBCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX09SIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YOgorCQkJc3dpdGNoIChCUEZfT1AoaW5zbi0+Y29kZSkpIHsKKwkJCWNhc2UgQlBGX0FERDogYjIgPSAweDAxOyBicmVhazsKKwkJCWNhc2UgQlBGX1NVQjogYjIgPSAweDI5OyBicmVhazsKKwkJCWNhc2UgQlBGX0FORDogYjIgPSAweDIxOyBicmVhazsKKwkJCWNhc2UgQlBGX09SOiBiMiA9IDB4MDk7IGJyZWFrOworCQkJY2FzZSBCUEZfWE9SOiBiMiA9IDB4MzE7IGJyZWFrOworCQkJfQorCQkJaWYgKEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQpCisJCQkJRU1JVDEoYWRkXzJtb2QoMHg0OCwgZHN0X3JlZywgc3JjX3JlZykpOworCQkJZWxzZSBpZiAoaXNfZXJlZyhkc3RfcmVnKSB8fCBpc19lcmVnKHNyY19yZWcpKQorCQkJCUVNSVQxKGFkZF8ybW9kKDB4NDAsIGRzdF9yZWcsIHNyY19yZWcpKTsKKwkJCUVNSVQyKGIyLCBhZGRfMnJlZygweEMwLCBkc3RfcmVnLCBzcmNfcmVnKSk7CisJCQlicmVhazsKKworCQkJLyogbW92IGRzdCwgc3JjICovCisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YOgorCQkJRU1JVF9tb3YoZHN0X3JlZywgc3JjX3JlZyk7CisJCQlicmVhazsKKworCQkJLyogbW92MzIgZHN0LCBzcmMgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9YOgorCQkJaWYgKGlzX2VyZWcoZHN0X3JlZykgfHwgaXNfZXJlZyhzcmNfcmVnKSkKKwkJCQlFTUlUMShhZGRfMm1vZCgweDQwLCBkc3RfcmVnLCBzcmNfcmVnKSk7CisJCQlFTUlUMigweDg5LCBhZGRfMnJlZygweEMwLCBkc3RfcmVnLCBzcmNfcmVnKSk7CisJCQlicmVhazsKKworCQkJLyogbmVnIGRzdCAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfTkVHOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9ORUc6CisJCQlpZiAoQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NCkKKwkJCQlFTUlUMShhZGRfMW1vZCgweDQ4LCBkc3RfcmVnKSk7CisJCQllbHNlIGlmIChpc19lcmVnKGRzdF9yZWcpKQorCQkJCUVNSVQxKGFkZF8xbW9kKDB4NDAsIGRzdF9yZWcpKTsKKwkJCUVNSVQyKDB4RjcsIGFkZF8xcmVnKDB4RDgsIGRzdF9yZWcpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9TVUIgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX09SIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9LOgorCQkJaWYgKEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQpCisJCQkJRU1JVDEoYWRkXzFtb2QoMHg0OCwgZHN0X3JlZykpOworCQkJZWxzZSBpZiAoaXNfZXJlZyhkc3RfcmVnKSkKKwkJCQlFTUlUMShhZGRfMW1vZCgweDQwLCBkc3RfcmVnKSk7CisKKwkJCXN3aXRjaCAoQlBGX09QKGluc24tPmNvZGUpKSB7CisJCQljYXNlIEJQRl9BREQ6IGIzID0gMHhDMDsgYnJlYWs7CisJCQljYXNlIEJQRl9TVUI6IGIzID0gMHhFODsgYnJlYWs7CisJCQljYXNlIEJQRl9BTkQ6IGIzID0gMHhFMDsgYnJlYWs7CisJCQljYXNlIEJQRl9PUjogYjMgPSAweEM4OyBicmVhazsKKwkJCWNhc2UgQlBGX1hPUjogYjMgPSAweEYwOyBicmVhazsKKwkJCX0KKworCQkJaWYgKGlzX2ltbTgoaW1tMzIpKQorCQkJCUVNSVQzKDB4ODMsIGFkZF8xcmVnKGIzLCBkc3RfcmVnKSwgaW1tMzIpOworCQkJZWxzZQorCQkJCUVNSVQyX29mZjMyKDB4ODEsIGFkZF8xcmVnKGIzLCBkc3RfcmVnKSwgaW1tMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX0s6CisJCQkvKiBvcHRpbWl6YXRpb246IGlmIGltbTMyIGlzIHBvc2l0aXZlLAorCQkJICogdXNlICdtb3YgZWF4LCBpbW0zMicgKHdoaWNoIHplcm8tZXh0ZW5kcyBpbW0zMikKKwkJCSAqIHRvIHNhdmUgMiBieXRlcworCQkJICovCisJCQlpZiAoaW1tMzIgPCAwKSB7CisJCQkJLyogJ21vdiByYXgsIGltbTMyJyBzaWduIGV4dGVuZHMgaW1tMzIgKi8KKwkJCQliMSA9IGFkZF8xbW9kKDB4NDgsIGRzdF9yZWcpOworCQkJCWIyID0gMHhDNzsKKwkJCQliMyA9IDB4QzA7CisJCQkJRU1JVDNfb2ZmMzIoYjEsIGIyLCBhZGRfMXJlZyhiMywgZHN0X3JlZyksIGltbTMyKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0s6CisJCQkvKiBtb3YgJWVheCwgaW1tMzIgKi8KKwkJCWlmIChpc19lcmVnKGRzdF9yZWcpKQorCQkJCUVNSVQxKGFkZF8xbW9kKDB4NDAsIGRzdF9yZWcpKTsKKwkJCUVNSVQxX29mZjMyKGFkZF8xcmVnKDB4QjgsIGRzdF9yZWcpLCBpbW0zMik7CisJCQlicmVhazsKKworCQkJLyogZHN0ICU9IHNyYywgZHN0IC89IHNyYywgZHN0ICU9IGltbTMyLCBkc3QgLz0gaW1tMzIgKi8KKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01PRCB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT0QgfCBCUEZfWDoKKwkJY2FzZSBCUEZfQUxVNjQgfCBCUEZfRElWIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PRCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9ESVYgfCBCUEZfSzoKKwkJCUVNSVQxKDB4NTApOyAvKiBwdXNoIHJheCAqLworCQkJRU1JVDEoMHg1Mik7IC8qIHB1c2ggcmR4ICovCisKKwkJCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKQorCQkJCS8qIG1vdiByMTEsIHNyY19yZWcgKi8KKwkJCQlFTUlUX21vdihBVVhfUkVHLCBzcmNfcmVnKTsKKwkJCWVsc2UKKwkJCQkvKiBtb3YgcjExLCBpbW0zMiAqLworCQkJCUVNSVQzX29mZjMyKDB4NDksIDB4QzcsIDB4QzMsIGltbTMyKTsKKworCQkJLyogbW92IHJheCwgZHN0X3JlZyAqLworCQkJRU1JVF9tb3YoQlBGX1JFR18wLCBkc3RfcmVnKTsKKworCQkJLyogeG9yIGVkeCwgZWR4CisJCQkgKiBlcXVpdmFsZW50IHRvICd4b3IgcmR4LCByZHgnLCBidXQgb25lIGJ5dGUgbGVzcworCQkJICovCisJCQlFTUlUMigweDMxLCAweGQyKTsKKworCQkJaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1gpIHsKKwkJCQkvKiBpZiAoc3JjX3JlZyA9PSAwKSByZXR1cm4gMCAqLworCisJCQkJLyogY21wIHIxMSwgMCAqLworCQkJCUVNSVQ0KDB4NDksIDB4ODMsIDB4RkIsIDB4MDApOworCisJCQkJLyogam5lIC4rOSAoc2tpcCBvdmVyIHBvcCwgcG9wLCB4b3IgYW5kIGptcCkgKi8KKwkJCQlFTUlUMihYODZfSk5FLCAxICsgMSArIDIgKyA1KTsKKwkJCQlFTUlUMSgweDVBKTsgLyogcG9wIHJkeCAqLworCQkJCUVNSVQxKDB4NTgpOyAvKiBwb3AgcmF4ICovCisJCQkJRU1JVDIoMHgzMSwgMHhjMCk7IC8qIHhvciBlYXgsIGVheCAqLworCisJCQkJLyogam1wIGNsZWFudXBfYWRkcgorCQkJCSAqIGFkZHJzW2ldIC0gMTEsIGJlY2F1c2UgdGhlcmUgYXJlIDExIGJ5dGVzCisJCQkJICogYWZ0ZXIgdGhpcyBpbnNuOiBkaXYsIG1vdiwgcG9wLCBwb3AsIG1vdgorCQkJCSAqLworCQkJCWptcF9vZmZzZXQgPSBjdHgtPmNsZWFudXBfYWRkciAtIChhZGRyc1tpXSAtIDExKTsKKwkJCQlFTUlUMV9vZmYzMigweEU5LCBqbXBfb2Zmc2V0KTsKKwkJCX0KKworCQkJaWYgKEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQpCisJCQkJLyogZGl2IHIxMSAqLworCQkJCUVNSVQzKDB4NDksIDB4RjcsIDB4RjMpOworCQkJZWxzZQorCQkJCS8qIGRpdiByMTFkICovCisJCQkJRU1JVDMoMHg0MSwgMHhGNywgMHhGMyk7CisKKwkJCWlmIChCUEZfT1AoaW5zbi0+Y29kZSkgPT0gQlBGX01PRCkKKwkJCQkvKiBtb3YgcjExLCByZHggKi8KKwkJCQlFTUlUMygweDQ5LCAweDg5LCAweEQzKTsKKwkJCWVsc2UKKwkJCQkvKiBtb3YgcjExLCByYXggKi8KKwkJCQlFTUlUMygweDQ5LCAweDg5LCAweEMzKTsKKworCQkJRU1JVDEoMHg1QSk7IC8qIHBvcCByZHggKi8KKwkJCUVNSVQxKDB4NTgpOyAvKiBwb3AgcmF4ICovCisKKwkJCS8qIG1vdiBkc3RfcmVnLCByMTEgKi8KKwkJCUVNSVRfbW92KGRzdF9yZWcsIEFVWF9SRUcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01VTCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NVUwgfCBCUEZfWDoKKwkJCUVNSVQxKDB4NTApOyAvKiBwdXNoIHJheCAqLworCQkJRU1JVDEoMHg1Mik7IC8qIHB1c2ggcmR4ICovCisKKwkJCS8qIG1vdiByMTEsIGRzdF9yZWcgKi8KKwkJCUVNSVRfbW92KEFVWF9SRUcsIGRzdF9yZWcpOworCisJCQlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCkKKwkJCQkvKiBtb3YgcmF4LCBzcmNfcmVnICovCisJCQkJRU1JVF9tb3YoQlBGX1JFR18wLCBzcmNfcmVnKTsKKwkJCWVsc2UKKwkJCQkvKiBtb3YgcmF4LCBpbW0zMiAqLworCQkJCUVNSVQzX29mZjMyKDB4NDgsIDB4QzcsIDB4QzAsIGltbTMyKTsKKworCQkJaWYgKEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQpCisJCQkJRU1JVDEoYWRkXzFtb2QoMHg0OCwgQVVYX1JFRykpOworCQkJZWxzZSBpZiAoaXNfZXJlZyhBVVhfUkVHKSkKKwkJCQlFTUlUMShhZGRfMW1vZCgweDQwLCBBVVhfUkVHKSk7CisJCQkvKiBtdWwocSkgcjExICovCisJCQlFTUlUMigweEY3LCBhZGRfMXJlZygweEUwLCBBVVhfUkVHKSk7CisKKwkJCS8qIG1vdiByMTEsIHJheCAqLworCQkJRU1JVF9tb3YoQVVYX1JFRywgQlBGX1JFR18wKTsKKworCQkJRU1JVDEoMHg1QSk7IC8qIHBvcCByZHggKi8KKwkJCUVNSVQxKDB4NTgpOyAvKiBwb3AgcmF4ICovCisKKwkJCS8qIG1vdiBkc3RfcmVnLCByMTEgKi8KKwkJCUVNSVRfbW92KGRzdF9yZWcsIEFVWF9SRUcpOworCQkJYnJlYWs7CisKKwkJCS8qIHNoaWZ0cyAqLworCQljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0FSU0ggfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTFNIIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1JTSCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFU2NCB8IEJQRl9BUlNIIHwgQlBGX0s6CisJCQlpZiAoQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NCkKKwkJCQlFTUlUMShhZGRfMW1vZCgweDQ4LCBkc3RfcmVnKSk7CisJCQllbHNlIGlmIChpc19lcmVnKGRzdF9yZWcpKQorCQkJCUVNSVQxKGFkZF8xbW9kKDB4NDAsIGRzdF9yZWcpKTsKKworCQkJc3dpdGNoIChCUEZfT1AoaW5zbi0+Y29kZSkpIHsKKwkJCWNhc2UgQlBGX0xTSDogYjMgPSAweEUwOyBicmVhazsKKwkJCWNhc2UgQlBGX1JTSDogYjMgPSAweEU4OyBicmVhazsKKwkJCWNhc2UgQlBGX0FSU0g6IGIzID0gMHhGODsgYnJlYWs7CisJCQl9CisJCQlFTUlUMygweEMxLCBhZGRfMXJlZyhiMywgZHN0X3JlZyksIGltbTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQlBGX0FMVSB8IEJQRl9FTkQgfCBCUEZfRlJPTV9CRToKKwkJCXN3aXRjaCAoaW1tMzIpIHsKKwkJCWNhc2UgMTY6CisJCQkJLyogZW1pdCAncm9yICVheCwgOCcgdG8gc3dhcCBsb3dlciAyIGJ5dGVzICovCisJCQkJRU1JVDEoMHg2Nik7CisJCQkJaWYgKGlzX2VyZWcoZHN0X3JlZykpCisJCQkJCUVNSVQxKDB4NDEpOworCQkJCUVNSVQzKDB4QzEsIGFkZF8xcmVnKDB4QzgsIGRzdF9yZWcpLCA4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJLyogZW1pdCAnYnN3YXAgZWF4JyB0byBzd2FwIGxvd2VyIDQgYnl0ZXMgKi8KKwkJCQlpZiAoaXNfZXJlZyhkc3RfcmVnKSkKKwkJCQkJRU1JVDIoMHg0MSwgMHgwRik7CisJCQkJZWxzZQorCQkJCQlFTUlUMSgweDBGKTsKKwkJCQlFTUlUMShhZGRfMXJlZygweEM4LCBkc3RfcmVnKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDY0OgorCQkJCS8qIGVtaXQgJ2Jzd2FwIHJheCcgdG8gc3dhcCA4IGJ5dGVzICovCisJCQkJRU1JVDMoYWRkXzFtb2QoMHg0OCwgZHN0X3JlZyksIDB4MEYsCisJCQkJICAgICAgYWRkXzFyZWcoMHhDOCwgZHN0X3JlZykpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9GUk9NX0xFOgorCQkJYnJlYWs7CisKKwkJCS8qIFNUOiAqKHU4KikoZHN0X3JlZyArIG9mZikgPSBpbW0gKi8KKwkJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0I6CisJCQlpZiAoaXNfZXJlZyhkc3RfcmVnKSkKKwkJCQlFTUlUMigweDQxLCAweEM2KTsKKwkJCWVsc2UKKwkJCQlFTUlUMSgweEM2KTsKKwkJCWdvdG8gc3Q7CisJCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9IOgorCQkJaWYgKGlzX2VyZWcoZHN0X3JlZykpCisJCQkJRU1JVDMoMHg2NiwgMHg0MSwgMHhDNyk7CisJCQllbHNlCisJCQkJRU1JVDIoMHg2NiwgMHhDNyk7CisJCQlnb3RvIHN0OworCQljYXNlIEJQRl9TVCB8IEJQRl9NRU0gfCBCUEZfVzoKKwkJCWlmIChpc19lcmVnKGRzdF9yZWcpKQorCQkJCUVNSVQyKDB4NDEsIDB4QzcpOworCQkJZWxzZQorCQkJCUVNSVQxKDB4QzcpOworCQkJZ290byBzdDsKKwkJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0RXOgorCQkJRU1JVDIoYWRkXzFtb2QoMHg0OCwgZHN0X3JlZyksIDB4QzcpOworCitzdDoJCQlpZiAoaXNfaW1tOChpbnNuLT5vZmYpKQorCQkJCUVNSVQyKGFkZF8xcmVnKDB4NDAsIGRzdF9yZWcpLCBpbnNuLT5vZmYpOworCQkJZWxzZQorCQkJCUVNSVQxX29mZjMyKGFkZF8xcmVnKDB4ODAsIGRzdF9yZWcpLCBpbnNuLT5vZmYpOworCisJCQlFTUlUKGltbTMyLCBicGZfc2l6ZV90b194ODZfYnl0ZXMoQlBGX1NJWkUoaW5zbi0+Y29kZSkpKTsKKwkJCWJyZWFrOworCisJCQkvKiBTVFg6ICoodTgqKShkc3RfcmVnICsgb2ZmKSA9IHNyY19yZWcgKi8KKwkJY2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9COgorCQkJLyogZW1pdCAnbW92IGJ5dGUgcHRyIFtyYXggKyBvZmZdLCBhbCcgKi8KKwkJCWlmIChpc19lcmVnKGRzdF9yZWcpIHx8IGlzX2VyZWcoc3JjX3JlZykgfHwKKwkJCSAgICAvKiBoYXZlIHRvIGFkZCBleHRyYSBieXRlIGZvciB4ODYgU0lMLCBESUwgcmVncyAqLworCQkJICAgIHNyY19yZWcgPT0gQlBGX1JFR18xIHx8IHNyY19yZWcgPT0gQlBGX1JFR18yKQorCQkJCUVNSVQyKGFkZF8ybW9kKDB4NDAsIGRzdF9yZWcsIHNyY19yZWcpLCAweDg4KTsKKwkJCWVsc2UKKwkJCQlFTUlUMSgweDg4KTsKKwkJCWdvdG8gc3R4OworCQljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0g6CisJCQlpZiAoaXNfZXJlZyhkc3RfcmVnKSB8fCBpc19lcmVnKHNyY19yZWcpKQorCQkJCUVNSVQzKDB4NjYsIGFkZF8ybW9kKDB4NDAsIGRzdF9yZWcsIHNyY19yZWcpLCAweDg5KTsKKwkJCWVsc2UKKwkJCQlFTUlUMigweDY2LCAweDg5KTsKKwkJCWdvdG8gc3R4OworCQljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX1c6CisJCQlpZiAoaXNfZXJlZyhkc3RfcmVnKSB8fCBpc19lcmVnKHNyY19yZWcpKQorCQkJCUVNSVQyKGFkZF8ybW9kKDB4NDAsIGRzdF9yZWcsIHNyY19yZWcpLCAweDg5KTsKKwkJCWVsc2UKKwkJCQlFTUlUMSgweDg5KTsKKwkJCWdvdG8gc3R4OworCQljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0RXOgorCQkJRU1JVDIoYWRkXzJtb2QoMHg0OCwgZHN0X3JlZywgc3JjX3JlZyksIDB4ODkpOworc3R4OgkJCWlmIChpc19pbW04KGluc24tPm9mZikpCisJCQkJRU1JVDIoYWRkXzJyZWcoMHg0MCwgZHN0X3JlZywgc3JjX3JlZyksIGluc24tPm9mZik7CisJCQllbHNlCisJCQkJRU1JVDFfb2ZmMzIoYWRkXzJyZWcoMHg4MCwgZHN0X3JlZywgc3JjX3JlZyksCisJCQkJCSAgICBpbnNuLT5vZmYpOworCQkJYnJlYWs7CisKKwkJCS8qIExEWDogZHN0X3JlZyA9ICoodTgqKShzcmNfcmVnICsgb2ZmKSAqLworCQljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0I6CisJCQkvKiBlbWl0ICdtb3Z6eCByYXgsIGJ5dGUgcHRyIFtyYXggKyBvZmZdJyAqLworCQkJRU1JVDMoYWRkXzJtb2QoMHg0OCwgc3JjX3JlZywgZHN0X3JlZyksIDB4MEYsIDB4QjYpOworCQkJZ290byBsZHg7CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfSDoKKwkJCS8qIGVtaXQgJ21vdnp4IHJheCwgd29yZCBwdHIgW3JheCArIG9mZl0nICovCisJCQlFTUlUMyhhZGRfMm1vZCgweDQ4LCBzcmNfcmVnLCBkc3RfcmVnKSwgMHgwRiwgMHhCNyk7CisJCQlnb3RvIGxkeDsKKwkJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XOgorCQkJLyogZW1pdCAnbW92IGVheCwgZHdvcmQgcHRyIFtyYXgrMHgxNF0nICovCisJCQlpZiAoaXNfZXJlZyhkc3RfcmVnKSB8fCBpc19lcmVnKHNyY19yZWcpKQorCQkJCUVNSVQyKGFkZF8ybW9kKDB4NDAsIHNyY19yZWcsIGRzdF9yZWcpLCAweDhCKTsKKwkJCWVsc2UKKwkJCQlFTUlUMSgweDhCKTsKKwkJCWdvdG8gbGR4OworCQljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXOgorCQkJLyogZW1pdCAnbW92IHJheCwgcXdvcmQgcHRyIFtyYXgrMHgxNF0nICovCisJCQlFTUlUMihhZGRfMm1vZCgweDQ4LCBzcmNfcmVnLCBkc3RfcmVnKSwgMHg4Qik7CitsZHg6CQkJLyogaWYgaW5zbi0+b2ZmID09IDAgd2UgY2FuIHNhdmUgb25lIGV4dHJhIGJ5dGUsIGJ1dAorCQkJICogc3BlY2lhbCBjYXNlIG9mIHg4NiByMTMgd2hpY2ggYWx3YXlzIG5lZWRzIGFuIG9mZnNldAorCQkJICogaXMgbm90IHdvcnRoIHRoZSBoYXNzbGUKKwkJCSAqLworCQkJaWYgKGlzX2ltbTgoaW5zbi0+b2ZmKSkKKwkJCQlFTUlUMihhZGRfMnJlZygweDQwLCBzcmNfcmVnLCBkc3RfcmVnKSwgaW5zbi0+b2ZmKTsKKwkJCWVsc2UKKwkJCQlFTUlUMV9vZmYzMihhZGRfMnJlZygweDgwLCBzcmNfcmVnLCBkc3RfcmVnKSwKKwkJCQkJICAgIGluc24tPm9mZik7CisJCQlicmVhazsKKworCQkJLyogU1RYIFhBREQ6IGxvY2sgKih1MzIqKShkc3RfcmVnICsgb2ZmKSArPSBzcmNfcmVnICovCisJCWNhc2UgQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX1c6CisJCQkvKiBlbWl0ICdsb2NrIGFkZCBkd29yZCBwdHIgW3JheCArIG9mZl0sIGVheCcgKi8KKwkJCWlmIChpc19lcmVnKGRzdF9yZWcpIHx8IGlzX2VyZWcoc3JjX3JlZykpCisJCQkJRU1JVDMoMHhGMCwgYWRkXzJtb2QoMHg0MCwgZHN0X3JlZywgc3JjX3JlZyksIDB4MDEpOworCQkJZWxzZQorCQkJCUVNSVQyKDB4RjAsIDB4MDEpOworCQkJZ290byB4YWRkOworCQljYXNlIEJQRl9TVFggfCBCUEZfWEFERCB8IEJQRl9EVzoKKwkJCUVNSVQzKDB4RjAsIGFkZF8ybW9kKDB4NDgsIGRzdF9yZWcsIHNyY19yZWcpLCAweDAxKTsKK3hhZGQ6CQkJaWYgKGlzX2ltbTgoaW5zbi0+b2ZmKSkKKwkJCQlFTUlUMihhZGRfMnJlZygweDQwLCBkc3RfcmVnLCBzcmNfcmVnKSwgaW5zbi0+b2ZmKTsKKwkJCWVsc2UKKwkJCQlFTUlUMV9vZmYzMihhZGRfMnJlZygweDgwLCBkc3RfcmVnLCBzcmNfcmVnKSwKKwkJCQkJICAgIGluc24tPm9mZik7CisJCQlicmVhazsKKworCQkJLyogY2FsbCAqLworCQljYXNlIEJQRl9KTVAgfCBCUEZfQ0FMTDoKKwkJCWZ1bmMgPSAodTggKikgX19icGZfY2FsbF9iYXNlICsgaW1tMzI7CisJCQlqbXBfb2Zmc2V0ID0gZnVuYyAtIChpbWFnZSArIGFkZHJzW2ldKTsKKwkJCWlmIChjdHgtPnNlZW5fbGRfYWJzKSB7CisJCQkJRU1JVDIoMHg0MSwgMHg1Mik7IC8qIHB1c2ggJXIxMCAqLworCQkJCUVNSVQyKDB4NDEsIDB4NTEpOyAvKiBwdXNoICVyOSAqLworCQkJCS8qIG5lZWQgdG8gYWRqdXN0IGptcCBvZmZzZXQsIHNpbmNlCisJCQkJICogcG9wICVyOSwgcG9wICVyMTAgdGFrZSA0IGJ5dGVzIGFmdGVyIGNhbGwgaW5zbgorCQkJCSAqLworCQkJCWptcF9vZmZzZXQgKz0gNDsKKwkJCX0KKwkJCWlmICghaW1tMzIgfHwgIWlzX3NpbW0zMihqbXBfb2Zmc2V0KSkgeworCQkJCXByX2VycigidW5zdXBwb3J0ZWQgYnBmIGZ1bmMgJWQgYWRkciAlcCBpbWFnZSAlcFxuIiwKKwkJCQkgICAgICAgaW1tMzIsIGZ1bmMsIGltYWdlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCUVNSVQxX29mZjMyKDB4RTgsIGptcF9vZmZzZXQpOworCQkJaWYgKGN0eC0+c2Vlbl9sZF9hYnMpIHsKKwkJCQlFTUlUMigweDQxLCAweDU5KTsgLyogcG9wICVyOSAqLworCQkJCUVNSVQyKDB4NDEsIDB4NUEpOyAvKiBwb3AgJXIxMCAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIGNvbmQganVtcCAqLworCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0dFIHwgQlBGX1g6CisJCQkvKiBjbXAgZHN0X3JlZywgc3JjX3JlZyAqLworCQkJRU1JVDMoYWRkXzJtb2QoMHg0OCwgZHN0X3JlZywgc3JjX3JlZyksIDB4MzksCisJCQkgICAgICBhZGRfMnJlZygweEMwLCBkc3RfcmVnLCBzcmNfcmVnKSk7CisJCQlnb3RvIGVtaXRfY29uZF9qbXA7CisKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWDoKKwkJCS8qIHRlc3QgZHN0X3JlZywgc3JjX3JlZyAqLworCQkJRU1JVDMoYWRkXzJtb2QoMHg0OCwgZHN0X3JlZywgc3JjX3JlZyksIDB4ODUsCisJCQkgICAgICBhZGRfMnJlZygweEMwLCBkc3RfcmVnLCBzcmNfcmVnKSk7CisJCQlnb3RvIGVtaXRfY29uZF9qbXA7CisKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSzoKKwkJCS8qIHRlc3QgZHN0X3JlZywgaW1tMzIgKi8KKwkJCUVNSVQxKGFkZF8xbW9kKDB4NDgsIGRzdF9yZWcpKTsKKwkJCUVNSVQyX29mZjMyKDB4RjcsIGFkZF8xcmVnKDB4QzAsIGRzdF9yZWcpLCBpbW0zMik7CisJCQlnb3RvIGVtaXRfY29uZF9qbXA7CisKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNHVCB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNHRSB8IEJQRl9LOgorCQkJLyogY21wIGRzdF9yZWcsIGltbTgvMzIgKi8KKwkJCUVNSVQxKGFkZF8xbW9kKDB4NDgsIGRzdF9yZWcpKTsKKworCQkJaWYgKGlzX2ltbTgoaW1tMzIpKQorCQkJCUVNSVQzKDB4ODMsIGFkZF8xcmVnKDB4RjgsIGRzdF9yZWcpLCBpbW0zMik7CisJCQllbHNlCisJCQkJRU1JVDJfb2ZmMzIoMHg4MSwgYWRkXzFyZWcoMHhGOCwgZHN0X3JlZyksIGltbTMyKTsKKworZW1pdF9jb25kX2ptcDoJCS8qIGNvbnZlcnQgQlBGIG9wY29kZSB0byB4ODYgKi8KKwkJCXN3aXRjaCAoQlBGX09QKGluc24tPmNvZGUpKSB7CisJCQljYXNlIEJQRl9KRVE6CisJCQkJam1wX2NvbmQgPSBYODZfSkU7CisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9KU0VUOgorCQkJY2FzZSBCUEZfSk5FOgorCQkJCWptcF9jb25kID0gWDg2X0pORTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0pHVDoKKwkJCQkvKiBHVCBpcyB1bnNpZ25lZCAnPicsIEpBIGluIHg4NiAqLworCQkJCWptcF9jb25kID0gWDg2X0pBOworCQkJCWJyZWFrOworCQkJY2FzZSBCUEZfSkdFOgorCQkJCS8qIEdFIGlzIHVuc2lnbmVkICc+PScsIEpBRSBpbiB4ODYgKi8KKwkJCQlqbXBfY29uZCA9IFg4Nl9KQUU7CisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9KU0dUOgorCQkJCS8qIHNpZ25lZCAnPicsIEdUIGluIHg4NiAqLworCQkJCWptcF9jb25kID0gWDg2X0pHOworCQkJCWJyZWFrOworCQkJY2FzZSBCUEZfSlNHRToKKwkJCQkvKiBzaWduZWQgJz49JywgR0UgaW4geDg2ICovCisJCQkJam1wX2NvbmQgPSBYODZfSkdFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLyogdG8gc2lsZW5jZSBnY2Mgd2FybmluZyAqLworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJam1wX29mZnNldCA9IGFkZHJzW2kgKyBpbnNuLT5vZmZdIC0gYWRkcnNbaV07CisJCQlpZiAoaXNfaW1tOChqbXBfb2Zmc2V0KSkgeworCQkJCUVNSVQyKGptcF9jb25kLCBqbXBfb2Zmc2V0KTsKKwkJCX0gZWxzZSBpZiAoaXNfc2ltbTMyKGptcF9vZmZzZXQpKSB7CisJCQkJRU1JVDJfb2ZmMzIoMHgwRiwgam1wX2NvbmQgKyAweDEwLCBqbXBfb2Zmc2V0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCJjb25kX2ptcCBnZW4gYnVnICVsbHhcbiIsIGptcF9vZmZzZXQpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIEJQRl9KTVAgfCBCUEZfSkE6CisJCQlqbXBfb2Zmc2V0ID0gYWRkcnNbaSArIGluc24tPm9mZl0gLSBhZGRyc1tpXTsKKwkJCWlmICgham1wX29mZnNldCkKKwkJCQkvKiBvcHRpbWl6ZSBvdXQgbm9wIGp1bXBzICovCisJCQkJYnJlYWs7CitlbWl0X2ptcDoKKwkJCWlmIChpc19pbW04KGptcF9vZmZzZXQpKSB7CisJCQkJRU1JVDIoMHhFQiwgam1wX29mZnNldCk7CisJCQl9IGVsc2UgaWYgKGlzX3NpbW0zMihqbXBfb2Zmc2V0KSkgeworCQkJCUVNSVQxX29mZjMyKDB4RTksIGptcF9vZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoImptcCBnZW4gYnVnICVsbHhcbiIsIGptcF9vZmZzZXQpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX1c6CisJCQlmdW5jID0gc2tfbG9hZF93b3JkOworCQkJZ290byBjb21tb25fbG9hZDsKKwkJY2FzZSBCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX1c6CisJCQlmdW5jID0gQ0hPT1NFX0xPQURfRlVOQyhpbW0zMiwgc2tfbG9hZF93b3JkKTsKK2NvbW1vbl9sb2FkOgkJY3R4LT5zZWVuX2xkX2FicyA9IHRydWU7CisJCQlqbXBfb2Zmc2V0ID0gZnVuYyAtIChpbWFnZSArIGFkZHJzW2ldKTsKKwkJCWlmICghZnVuYyB8fCAhaXNfc2ltbTMyKGptcF9vZmZzZXQpKSB7CisJCQkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBicGYgZnVuYyAlZCBhZGRyICVwIGltYWdlICVwXG4iLAorCQkJCSAgICAgICBpbW0zMiwgZnVuYywgaW1hZ2UpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKEJQRl9NT0RFKGluc24tPmNvZGUpID09IEJQRl9BQlMpIHsKKwkJCQkvKiBtb3YgJWVzaSwgaW1tMzIgKi8KKwkJCQlFTUlUMV9vZmYzMigweEJFLCBpbW0zMik7CisJCQl9IGVsc2UgeworCQkJCS8qIG1vdiAlcnNpLCBzcmNfcmVnICovCisJCQkJRU1JVF9tb3YoQlBGX1JFR18yLCBzcmNfcmVnKTsKKwkJCQlpZiAoaW1tMzIpIHsKKwkJCQkJaWYgKGlzX2ltbTgoaW1tMzIpKQorCQkJCQkJLyogYWRkICVlc2ksIGltbTggKi8KKwkJCQkJCUVNSVQzKDB4ODMsIDB4QzYsIGltbTMyKTsKKwkJCQkJZWxzZQorCQkJCQkJLyogYWRkICVlc2ksIGltbTMyICovCisJCQkJCQlFTUlUMl9vZmYzMigweDgxLCAweEM2LCBpbW0zMik7CisJCQkJfQorCQkJfQorCQkJLyogc2tiIHBvaW50ZXIgaXMgaW4gUjYgKCVyYngpLCBpdCB3aWxsIGJlIGNvcGllZCBpbnRvCisJCQkgKiAlcmRpIGlmIHNrYl9jb3B5X2JpdHMoKSBjYWxsIGlzIG5lY2Vzc2FyeS4KKwkJCSAqIHNrX2xvYWRfKiBoZWxwZXJzIGFsc28gdXNlICVyMTAgYW5kICVyOWQuCisJCQkgKiBTZWUgYnBmX2ppdC5TCisJCQkgKi8KKwkJCUVNSVQxX29mZjMyKDB4RTgsIGptcF9vZmZzZXQpOyAvKiBjYWxsICovCisJCQlicmVhazsKKworCQljYXNlIEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfSDoKKwkJCWZ1bmMgPSBza19sb2FkX2hhbGY7CisJCQlnb3RvIGNvbW1vbl9sb2FkOworCQljYXNlIEJQRl9MRCB8IEJQRl9BQlMgfCBCUEZfSDoKKwkJCWZ1bmMgPSBDSE9PU0VfTE9BRF9GVU5DKGltbTMyLCBza19sb2FkX2hhbGYpOworCQkJZ290byBjb21tb25fbG9hZDsKKwkJY2FzZSBCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0I6CisJCQlmdW5jID0gc2tfbG9hZF9ieXRlOworCQkJZ290byBjb21tb25fbG9hZDsKKwkJY2FzZSBCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0I6CisJCQlmdW5jID0gQ0hPT1NFX0xPQURfRlVOQyhpbW0zMiwgc2tfbG9hZF9ieXRlKTsKKwkJCWdvdG8gY29tbW9uX2xvYWQ7CisKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0VYSVQ6CisJCQlpZiAoaSAhPSBpbnNuX2NudCAtIDEpIHsKKwkJCQlqbXBfb2Zmc2V0ID0gY3R4LT5jbGVhbnVwX2FkZHIgLSBhZGRyc1tpXTsKKwkJCQlnb3RvIGVtaXRfam1wOworCQkJfQorCQkJLyogdXBkYXRlIGNsZWFudXBfYWRkciAqLworCQkJY3R4LT5jbGVhbnVwX2FkZHIgPSBwcm9nbGVuOworCQkJLyogbW92IHJieCwgcXdvcmQgcHRyIFtyYnAtWF0gKi8KKwkJCUVNSVQzX29mZjMyKDB4NDgsIDB4OEIsIDB4OUQsIC1zdGFja3NpemUpOworCQkJLyogbW92IHIxMywgcXdvcmQgcHRyIFtyYnAtWF0gKi8KKwkJCUVNSVQzX29mZjMyKDB4NEMsIDB4OEIsIDB4QUQsIC1zdGFja3NpemUgKyA4KTsKKwkJCS8qIG1vdiByMTQsIHF3b3JkIHB0ciBbcmJwLVhdICovCisJCQlFTUlUM19vZmYzMigweDRDLCAweDhCLCAweEI1LCAtc3RhY2tzaXplICsgMTYpOworCQkJLyogbW92IHIxNSwgcXdvcmQgcHRyIFtyYnAtWF0gKi8KKwkJCUVNSVQzX29mZjMyKDB4NEMsIDB4OEIsIDB4QkQsIC1zdGFja3NpemUgKyAyNCk7CisKKwkJCUVNSVQxKDB4QzkpOyAvKiBsZWF2ZSAqLworCQkJRU1JVDEoMHhDMyk7IC8qIHJldCAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEJ5IGRlc2lnbiB4NjQgSklUIHNob3VsZCBzdXBwb3J0IGFsbCBCUEYgaW5zdHJ1Y3Rpb25zCisJCQkgKiBUaGlzIGVycm9yIHdpbGwgYmUgc2VlbiBpZiBuZXcgaW5zdHJ1Y3Rpb24gd2FzIGFkZGVkCisJCQkgKiB0byBpbnRlcnByZXRlciwgYnV0IG5vdCB0byBKSVQKKwkJCSAqIG9yIGlmIHRoZXJlIGlzIGp1bmsgaW4gc2tfZmlsdGVyCisJCQkgKi8KKwkJCXByX2VycigiYnBmX2ppdDogdW5rbm93biBvcGNvZGUgJTAyeFxuIiwgaW5zbi0+Y29kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlsZW4gPSBwcm9nIC0gdGVtcDsKKwkJaWYgKGltYWdlKSB7CisJCQlpZiAodW5saWtlbHkocHJvZ2xlbiArIGlsZW4gPiBvbGRwcm9nbGVuKSkgeworCQkJCXByX2VycigiYnBmX2ppdF9jb21waWxlIGZhdGFsIGVycm9yXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCW1lbWNweShpbWFnZSArIHByb2dsZW4sIHRlbXAsIGlsZW4pOworCQl9CisJCXByb2dsZW4gKz0gaWxlbjsKKwkJYWRkcnNbaV0gPSBwcm9nbGVuOworCQlwcm9nID0gdGVtcDsKKwl9CisJcmV0dXJuIHByb2dsZW47Cit9CisKK3ZvaWQgYnBmX2ppdF9jb21waWxlKHN0cnVjdCBza19maWx0ZXIgKnByb2cpCit7Cit9CisKK3ZvaWQgYnBmX2ludF9qaXRfY29tcGlsZShzdHJ1Y3Qgc2tfZmlsdGVyICpwcm9nKQoreworCXN0cnVjdCBicGZfYmluYXJ5X2hlYWRlciAqaGVhZGVyID0gTlVMTDsKKwlpbnQgcHJvZ2xlbiwgb2xkcHJvZ2xlbiA9IDA7CisJc3RydWN0IGppdF9jb250ZXh0IGN0eCA9IHt9OworCXU4ICppbWFnZSA9IE5VTEw7CisJaW50ICphZGRyczsKKwlpbnQgcGFzczsKKwlpbnQgaTsKIAogCWlmICghYnBmX2ppdF9lbmFibGUpCiAJCXJldHVybjsKIAotCWFkZHJzID0ga21hbGxvYyhmbGVuICogc2l6ZW9mKCphZGRycyksIEdGUF9LRVJORUwpOwotCWlmIChhZGRycyA9PSBOVUxMKQorCWlmICghcHJvZyB8fCAhcHJvZy0+bGVuKQorCQlyZXR1cm47CisKKwlhZGRycyA9IGttYWxsb2MocHJvZy0+bGVuICogc2l6ZW9mKCphZGRycyksIEdGUF9LRVJORUwpOworCWlmICghYWRkcnMpCiAJCXJldHVybjsKIAogCS8qIEJlZm9yZSBmaXJzdCBwYXNzLCBtYWtlIGEgcm91Z2ggZXN0aW1hdGlvbiBvZiBhZGRyc1tdCiAJICogZWFjaCBicGYgaW5zdHJ1Y3Rpb24gaXMgdHJhbnNsYXRlZCB0byBsZXNzIHRoYW4gNjQgYnl0ZXMKIAkgKi8KLQlmb3IgKHByb2dsZW4gPSAwLCBpID0gMDsgaSA8IGZsZW47IGkrKykgeworCWZvciAocHJvZ2xlbiA9IDAsIGkgPSAwOyBpIDwgcHJvZy0+bGVuOyBpKyspIHsKIAkJcHJvZ2xlbiArPSA2NDsKIAkJYWRkcnNbaV0gPSBwcm9nbGVuOwogCX0KLQljbGVhbnVwX2FkZHIgPSBwcm9nbGVuOyAvKiBlcGlsb2d1ZSBhZGRyZXNzICovCisJY3R4LmNsZWFudXBfYWRkciA9IHByb2dsZW47CiAKIAlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMTA7IHBhc3MrKykgewotCQl1OCBzZWVuX29yX3Bhc3MwID0gKHBhc3MgPT0gMCkgPyAoU0VFTl9YUkVHIHwgU0VFTl9EQVRBUkVGIHwgU0VFTl9NRU0pIDogc2VlbjsKLQkJLyogbm8gcHJvbG9ndWUvZXBpbG9ndWUgZm9yIHRyaXZpYWwgZmlsdGVycyAoUkVUIHNvbWV0aGluZykgKi8KLQkJcHJvZ2xlbiA9IDA7Ci0JCXByb2cgPSB0ZW1wOwotCi0JCWlmIChzZWVuX29yX3Bhc3MwKSB7Ci0JCQlFTUlUNCgweDU1LCAweDQ4LCAweDg5LCAweGU1KTsgLyogcHVzaCAlcmJwOyBtb3YgJXJzcCwlcmJwICovCi0JCQlFTUlUNCgweDQ4LCAweDgzLCAweGVjLCA5Nik7CS8qIHN1YnEgICQ5NiwlcnNwCSovCi0JCQkvKiBub3RlIDogbXVzdCBzYXZlICVyYnggaW4gY2FzZSBicGZfZXJyb3IgaXMgaGl0ICovCi0JCQlpZiAoc2Vlbl9vcl9wYXNzMCAmIChTRUVOX1hSRUcgfCBTRUVOX0RBVEFSRUYpKQotCQkJCUVNSVQ0KDB4NDgsIDB4ODksIDB4NWQsIDB4ZjgpOyAvKiBtb3YgJXJieCwgLTgoJXJicCkgKi8KLQkJCWlmIChzZWVuX29yX3Bhc3MwICYgU0VFTl9YUkVHKQotCQkJCUNMRUFSX1goKTsgLyogbWFrZSBzdXJlIHdlIGRvbnQgbGVlayBrZXJuZWwgbWVtb3J5ICovCi0KLQkJCS8qCi0JCQkgKiBJZiB0aGlzIGZpbHRlciBuZWVkcyB0byBhY2Nlc3Mgc2tiIGRhdGEsCi0JCQkgKiBsb2FkcyByOSBhbmQgcjggd2l0aCA6Ci0JCQkgKiAgcjkgPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4KLQkJCSAqICByOCA9IHNrYi0+ZGF0YQotCQkJICovCi0JCQlpZiAoc2Vlbl9vcl9wYXNzMCAmIFNFRU5fREFUQVJFRikgewotCQkJCWlmIChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSA8PSAxMjcpCi0JCQkJCS8qIG1vdiAgICBvZmY4KCVyZGkpLCVyOWQgKi8KLQkJCQkJRU1JVDQoMHg0NCwgMHg4YiwgMHg0Ziwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpOwotCQkJCWVsc2UgewotCQkJCQkvKiBtb3YgICAgb2ZmMzIoJXJkaSksJXI5ZCAqLwotCQkJCQlFTUlUMygweDQ0LCAweDhiLCAweDhmKTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSwgNCk7Ci0JCQkJfQotCQkJCWlmIChpc19pbW04KG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkYXRhX2xlbikpKQotCQkJCQkvKiBzdWIgICAgb2ZmOCglcmRpKSwlcjlkICovCi0JCQkJCUVNSVQ0KDB4NDQsIDB4MmIsIDB4NGYsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkYXRhX2xlbikpOwotCQkJCWVsc2UgewotCQkJCQlFTUlUMygweDQ0LCAweDJiLCAweDhmKTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YV9sZW4pLCA0KTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSkpKQotCQkJCQkvKiBtb3Ygb2ZmOCglcmRpKSwlcjggKi8KLQkJCQkJRU1JVDQoMHg0YywgMHg4YiwgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKLQkJCQllbHNlIHsKLQkJCQkJLyogbW92IG9mZjMyKCVyZGkpLCVyOCAqLwotCQkJCQlFTUlUMygweDRjLCAweDhiLCAweDg3KTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSksIDQpOwotCQkJCX0KLQkJCX0KKwkJcHJvZ2xlbiA9IGRvX2ppdChwcm9nLCBhZGRycywgaW1hZ2UsIG9sZHByb2dsZW4sICZjdHgpOworCQlpZiAocHJvZ2xlbiA8PSAwKSB7CisJCQlpbWFnZSA9IE5VTEw7CisJCQlpZiAoaGVhZGVyKQorCQkJCW1vZHVsZV9mcmVlKE5VTEwsIGhlYWRlcik7CisJCQlnb3RvIG91dDsKIAkJfQotCi0JCXN3aXRjaCAoZmlsdGVyWzBdLmNvZGUpIHsKLQkJY2FzZSBCUEZfU19SRVRfSzoKLQkJY2FzZSBCUEZfU19MRF9XX0xFTjoKLQkJY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6Ci0JCWNhc2UgQlBGX1NfQU5DX0lGSU5ERVg6Ci0JCWNhc2UgQlBGX1NfQU5DX01BUks6Ci0JCWNhc2UgQlBGX1NfQU5DX1JYSEFTSDoKLQkJY2FzZSBCUEZfU19BTkNfQ1BVOgotCQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBRzoKLQkJY2FzZSBCUEZfU19BTkNfVkxBTl9UQUdfUFJFU0VOVDoKLQkJY2FzZSBCUEZfU19BTkNfUVVFVUU6Ci0JCWNhc2UgQlBGX1NfQU5DX1BLVFRZUEU6Ci0JCWNhc2UgQlBGX1NfTERfV19BQlM6Ci0JCWNhc2UgQlBGX1NfTERfSF9BQlM6Ci0JCWNhc2UgQlBGX1NfTERfQl9BQlM6Ci0JCQkvKiBmaXJzdCBpbnN0cnVjdGlvbiBzZXRzIEEgcmVnaXN0ZXIgKG9yIGlzIFJFVCAnY29uc3RhbnQnKSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBtYWtlIHN1cmUgd2UgZG9udCBsZWFrIGtlcm5lbCBpbmZvcm1hdGlvbiB0byB1c2VyICovCi0JCQlDTEVBUl9BKCk7IC8qIEEgPSAwICovCi0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgZmxlbjsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgSyA9IGZpbHRlcltpXS5rOwotCi0JCQlzd2l0Y2ggKGZpbHRlcltpXS5jb2RlKSB7Ci0JCQljYXNlIEJQRl9TX0FMVV9BRERfWDogLyogQSArPSBYOyAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4MDEsIDB4ZDgpOwkJLyogYWRkICVlYngsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfQUREX0s6IC8qIEEgKz0gSzsgKi8KLQkJCQlpZiAoIUspCi0JCQkJCWJyZWFrOwotCQkJCWlmIChpc19pbW04KEspKQotCQkJCQlFTUlUMygweDgzLCAweGMwLCBLKTsJLyogYWRkIGltbTgsJWVheCAqLwotCQkJCWVsc2UKLQkJCQkJRU1JVDFfb2ZmMzIoMHgwNSwgSyk7CS8qIGFkZCBpbW0zMiwlZWF4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9TVUJfWDogLyogQSAtPSBYOyAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4MjksIDB4ZDgpOwkJLyogc3ViICAgICVlYngsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfU1VCX0s6IC8qIEEgLT0gSyAqLwotCQkJCWlmICghSykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGlzX2ltbTgoSykpCi0JCQkJCUVNSVQzKDB4ODMsIDB4ZTgsIEspOyAvKiBzdWIgaW1tOCwlZWF4ICovCi0JCQkJZWxzZQotCQkJCQlFTUlUMV9vZmYzMigweDJkLCBLKTsgLyogc3ViIGltbTMyLCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX01VTF9YOiAvKiBBICo9IFg7ICovCi0JCQkJc2VlbiB8PSBTRUVOX1hSRUc7Ci0JCQkJRU1JVDMoMHgwZiwgMHhhZiwgMHhjMyk7CS8qIGltdWwgJWVieCwlZWF4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9NVUxfSzogLyogQSAqPSBLICovCi0JCQkJaWYgKGlzX2ltbTgoSykpCi0JCQkJCUVNSVQzKDB4NmIsIDB4YzAsIEspOyAvKiBpbXVsIGltbTgsJWVheCwlZWF4ICovCi0JCQkJZWxzZSB7Ci0JCQkJCUVNSVQyKDB4NjksIDB4YzApOwkJLyogaW11bCBpbW0zMiwlZWF4ICovCi0JCQkJCUVNSVQoSywgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfRElWX1g6IC8qIEEgLz0gWDsgKi8KLQkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKLQkJCQlFTUlUMigweDg1LCAweGRiKTsJLyogdGVzdCAlZWJ4LCVlYnggKi8KLQkJCQlpZiAocGNfcmV0MCA+IDApIHsKLQkJCQkJLyogYWRkcnNbcGNfcmV0MCAtIDFdIGlzIHN0YXJ0IGFkZHJlc3Mgb2YgdGFyZ2V0Ci0JCQkJCSAqIChhZGRyc1tpXSAtIDQpIGlzIHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGlzIGptcAotCQkJCQkgKiAoInhvciAlZWR4LCVlZHg7IGRpdiAlZWJ4IiBiZWluZyA0IGJ5dGVzIGxvbmcpCi0JCQkJCSAqLwotCQkJCQlFTUlUX0NPTkRfSk1QKFg4Nl9KRSwgYWRkcnNbcGNfcmV0MCAtIDFdIC0KLQkJCQkJCQkJKGFkZHJzW2ldIC0gNCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVNSVRfQ09ORF9KTVAoWDg2X0pORSwgMiArIDUpOwotCQkJCQlDTEVBUl9BKCk7Ci0JCQkJCUVNSVQxX29mZjMyKDB4ZTksIGNsZWFudXBfYWRkciAtIChhZGRyc1tpXSAtIDQpKTsgLyogam1wIC4rb2ZmMzIgKi8KLQkJCQl9Ci0JCQkJRU1JVDQoMHgzMSwgMHhkMiwgMHhmNywgMHhmMyk7IC8qIHhvciAlZWR4LCVlZHg7IGRpdiAlZWJ4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9NT0RfWDogLyogQSAlPSBYOyAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4ODUsIDB4ZGIpOwkvKiB0ZXN0ICVlYngsJWVieCAqLwotCQkJCWlmIChwY19yZXQwID4gMCkgewotCQkJCQkvKiBhZGRyc1twY19yZXQwIC0gMV0gaXMgc3RhcnQgYWRkcmVzcyBvZiB0YXJnZXQKLQkJCQkJICogKGFkZHJzW2ldIC0gNikgaXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoaXMgam1wCi0JCQkJCSAqICgieG9yICVlZHgsJWVkeDsgZGl2ICVlYng7bW92ICVlZHgsJWVheCIgYmVpbmcgNiBieXRlcyBsb25nKQotCQkJCQkgKi8KLQkJCQkJRU1JVF9DT05EX0pNUChYODZfSkUsIGFkZHJzW3BjX3JldDAgLSAxXSAtCi0JCQkJCQkJCShhZGRyc1tpXSAtIDYpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlFTUlUX0NPTkRfSk1QKFg4Nl9KTkUsIDIgKyA1KTsKLQkJCQkJQ0xFQVJfQSgpOwotCQkJCQlFTUlUMV9vZmYzMigweGU5LCBjbGVhbnVwX2FkZHIgLSAoYWRkcnNbaV0gLSA2KSk7IC8qIGptcCAuK29mZjMyICovCi0JCQkJfQotCQkJCUVNSVQyKDB4MzEsIDB4ZDIpOwkvKiB4b3IgJWVkeCwlZWR4ICovCi0JCQkJRU1JVDIoMHhmNywgMHhmMyk7CS8qIGRpdiAlZWJ4ICovCi0JCQkJRU1JVDIoMHg4OSwgMHhkMCk7CS8qIG1vdiAlZWR4LCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX01PRF9LOiAvKiBBICU9IEs7ICovCi0JCQkJaWYgKEsgPT0gMSkgewotCQkJCQlDTEVBUl9BKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlFTUlUMigweDMxLCAweGQyKTsJLyogeG9yICVlZHgsJWVkeCAqLwotCQkJCUVNSVQxKDB4YjkpO0VNSVQoSywgNCk7CS8qIG1vdiBpbW0zMiwlZWN4ICovCi0JCQkJRU1JVDIoMHhmNywgMHhmMSk7CS8qIGRpdiAlZWN4ICovCi0JCQkJRU1JVDIoMHg4OSwgMHhkMCk7CS8qIG1vdiAlZWR4LCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX0RJVl9LOiAvKiBBIC89IEsgKi8KLQkJCQlpZiAoSyA9PSAxKQotCQkJCQlicmVhazsKLQkJCQlFTUlUMigweDMxLCAweGQyKTsJLyogeG9yICVlZHgsJWVkeCAqLwotCQkJCUVNSVQxKDB4YjkpO0VNSVQoSywgNCk7CS8qIG1vdiBpbW0zMiwlZWN4ICovCi0JCQkJRU1JVDIoMHhmNywgMHhmMSk7CS8qIGRpdiAlZWN4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FMVV9BTkRfWDoKLQkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKLQkJCQlFTUlUMigweDIxLCAweGQ4KTsJCS8qIGFuZCAlZWJ4LCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX0FORF9LOgotCQkJCWlmIChLID49IDB4RkZGRkZGMDApIHsKLQkJCQkJRU1JVDIoMHgyNCwgSyAmIDB4RkYpOyAvKiBhbmQgaW1tOCwlYWwgKi8KLQkJCQl9IGVsc2UgaWYgKEsgPj0gMHhGRkZGMDAwMCkgewotCQkJCQlFTUlUMigweDY2LCAweDI1KTsJLyogYW5kIGltbTE2LCVheCAqLwotCQkJCQlFTUlUKEssIDIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVNSVQxX29mZjMyKDB4MjUsIEspOwkvKiBhbmQgaW1tMzIsJWVheCAqLwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX09SX1g6Ci0JCQkJc2VlbiB8PSBTRUVOX1hSRUc7Ci0JCQkJRU1JVDIoMHgwOSwgMHhkOCk7CQkvKiBvciAlZWJ4LCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQUxVX09SX0s6Ci0JCQkJaWYgKGlzX2ltbTgoSykpCi0JCQkJCUVNSVQzKDB4ODMsIDB4YzgsIEspOyAvKiBvciBpbW04LCVlYXggKi8KLQkJCQllbHNlCi0JCQkJCUVNSVQxX29mZjMyKDB4MGQsIEspOwkvKiBvciBpbW0zMiwlZWF4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FOQ19BTFVfWE9SX1g6IC8qIEEgXj0gWDsgKi8KLQkJCWNhc2UgQlBGX1NfQUxVX1hPUl9YOgotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4MzEsIDB4ZDgpOwkJLyogeG9yICVlYngsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfWE9SX0s6IC8qIEEgXj0gSzsgKi8KLQkJCQlpZiAoSyA9PSAwKQotCQkJCQlicmVhazsKLQkJCQlpZiAoaXNfaW1tOChLKSkKLQkJCQkJRU1JVDMoMHg4MywgMHhmMCwgSyk7CS8qIHhvciBpbW04LCVlYXggKi8KLQkJCQllbHNlCi0JCQkJCUVNSVQxX29mZjMyKDB4MzUsIEspOwkvKiB4b3IgaW1tMzIsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfTFNIX1g6IC8qIEEgPDw9IFg7ICovCi0JCQkJc2VlbiB8PSBTRUVOX1hSRUc7Ci0JCQkJRU1JVDQoMHg4OSwgMHhkOSwgMHhkMywgMHhlMCk7CS8qIG1vdiAlZWJ4LCVlY3g7IHNobCAlY2wsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfTFNIX0s6Ci0JCQkJaWYgKEsgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAoSyA9PSAxKQotCQkJCQlFTUlUMigweGQxLCAweGUwKTsgLyogc2hsICVlYXggKi8KLQkJCQllbHNlCi0JCQkJCUVNSVQzKDB4YzEsIDB4ZTAsIEspOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfUlNIX1g6IC8qIEEgPj49IFg7ICovCi0JCQkJc2VlbiB8PSBTRUVOX1hSRUc7Ci0JCQkJRU1JVDQoMHg4OSwgMHhkOSwgMHhkMywgMHhlOCk7CS8qIG1vdiAlZWJ4LCVlY3g7IHNociAlY2wsJWVheCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfUlNIX0s6IC8qIEEgPj49IEs7ICovCi0JCQkJaWYgKEsgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAoSyA9PSAxKQotCQkJCQlFTUlUMigweGQxLCAweGU4KTsgLyogc2hyICVlYXggKi8KLQkJCQllbHNlCi0JCQkJCUVNSVQzKDB4YzEsIDB4ZTgsIEspOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTFVfTkVHOgotCQkJCUVNSVQyKDB4ZjcsIDB4ZDgpOwkJLyogbmVnICVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfUkVUX0s6Ci0JCQkJaWYgKCFLKSB7Ci0JCQkJCWlmIChwY19yZXQwID09IC0xKQotCQkJCQkJcGNfcmV0MCA9IGk7Ci0JCQkJCUNMRUFSX0EoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlFTUlUMV9vZmYzMigweGI4LCBLKTsJLyogbW92ICRpbW0zMiwlZWF4ICovCi0JCQkJfQotCQkJCS8qIGZhbGxpbnRvICovCi0JCQljYXNlIEJQRl9TX1JFVF9BOgotCQkJCWlmIChzZWVuX29yX3Bhc3MwKSB7Ci0JCQkJCWlmIChpICE9IGZsZW4gLSAxKSB7Ci0JCQkJCQlFTUlUX0pNUChjbGVhbnVwX2FkZHIgLSBhZGRyc1tpXSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoc2Vlbl9vcl9wYXNzMCAmIFNFRU5fWFJFRykKLQkJCQkJCUVNSVQ0KDB4NDgsIDB4OGIsIDB4NWQsIDB4ZjgpOyAgLyogbW92ICAtOCglcmJwKSwlcmJ4ICovCi0JCQkJCUVNSVQxKDB4YzkpOwkJLyogbGVhdmVxICovCi0JCQkJfQotCQkJCUVNSVQxKDB4YzMpOwkJLyogcmV0ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX01JU0NfVEFYOiAvKiBYID0gQSAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4ODksIDB4YzMpOwkvKiBtb3YgICAgJWVheCwlZWJ4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX01JU0NfVFhBOiAvKiBBID0gWCAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCUVNSVQyKDB4ODksIDB4ZDgpOwkvKiBtb3YgICAgJWVieCwlZWF4ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX0lNTTogLyogQSA9IEsgKi8KLQkJCQlpZiAoIUspCi0JCQkJCUNMRUFSX0EoKTsKLQkJCQllbHNlCi0JCQkJCUVNSVQxX29mZjMyKDB4YjgsIEspOyAvKiBtb3YgJGltbTMyLCVlYXggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTERYX0lNTTogLyogWCA9IEsgKi8KLQkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKLQkJCQlpZiAoIUspCi0JCQkJCUNMRUFSX1goKTsKLQkJCQllbHNlCi0JCQkJCUVNSVQxX29mZjMyKDB4YmIsIEspOyAvKiBtb3YgJGltbTMyLCVlYnggKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfTERfTUVNOiAvKiBBID0gbWVtW0tdIDogbW92IG9mZjgoJXJicCksJWVheCAqLwotCQkJCXNlZW4gfD0gU0VFTl9NRU07Ci0JCQkJRU1JVDMoMHg4YiwgMHg0NSwgMHhmMCAtIEsqNCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEWF9NRU06IC8qIFggPSBtZW1bS10gOiBtb3Ygb2ZmOCglcmJwKSwlZWJ4ICovCi0JCQkJc2VlbiB8PSBTRUVOX1hSRUcgfCBTRUVOX01FTTsKLQkJCQlFTUlUMygweDhiLCAweDVkLCAweGYwIC0gSyo0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfU1Q6IC8qIG1lbVtLXSA9IEEgOiBtb3YgJWVheCxvZmY4KCVyYnApICovCi0JCQkJc2VlbiB8PSBTRUVOX01FTTsKLQkJCQlFTUlUMygweDg5LCAweDQ1LCAweGYwIC0gSyo0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfU1RYOiAvKiBtZW1bS10gPSBYIDogbW92ICVlYngsb2ZmOCglcmJwKSAqLwotCQkJCXNlZW4gfD0gU0VFTl9YUkVHIHwgU0VFTl9NRU07Ci0JCQkJRU1JVDMoMHg4OSwgMHg1ZCwgMHhmMCAtIEsqNCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX1dfTEVOOiAvKglBID0gc2tiLT5sZW47ICovCi0JCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSAhPSA0KTsKLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSkpCi0JCQkJCS8qIG1vdiAgICBvZmY4KCVyZGkpLCVlYXggKi8KLQkJCQkJRU1JVDMoMHg4YiwgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpOwotCQkJCWVsc2UgewotCQkJCQlFTUlUMigweDhiLCAweDg3KTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSwgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19MRFhfV19MRU46IC8qIFggPSBza2ItPmxlbjsgKi8KLQkJCQlzZWVuIHw9IFNFRU5fWFJFRzsKLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSkpCi0JCQkJCS8qIG1vdiBvZmY4KCVyZGkpLCVlYnggKi8KLQkJCQkJRU1JVDMoMHg4YiwgMHg1Ziwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpOwotCQkJCWVsc2UgewotCQkJCQlFTUlUMigweDhiLCAweDlmKTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSwgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfUFJPVE9DT0w6IC8qIEEgPSBudG9ocyhza2ItPnByb3RvY29sKTsgKi8KLQkJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBwcm90b2NvbCkgIT0gMik7Ci0JCQkJaWYgKGlzX2ltbTgob2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHByb3RvY29sKSkpIHsKLQkJCQkJLyogbW92endsIG9mZjgoJXJkaSksJWVheCAqLwotCQkJCQlFTUlUNCgweDBmLCAweGI3LCAweDQ3LCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlFTUlUMygweDBmLCAweGI3LCAweDg3KTsgLyogbW92endsIG9mZjMyKCVyZGkpLCVlYXggKi8KLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpLCA0KTsKLQkJCQl9Ci0JCQkJRU1JVDIoMHg4NiwgMHhjNCk7IC8qIG50b2hzKCkgOiB4Y2hnICAgJWFsLCVhaCAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfSUZJTkRFWDoKLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSkpIHsKLQkJCQkJLyogbW92cSBvZmY4KCVyZGkpLCVyYXggKi8KLQkJCQkJRU1JVDQoMHg0OCwgMHg4YiwgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRldikpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVNSVQzKDB4NDgsIDB4OGIsIDB4ODcpOyAvKiBtb3ZxIG9mZjMyKCVyZGkpLCVyYXggKi8KLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSwgNCk7Ci0JCQkJfQotCQkJCUVNSVQzKDB4NDgsIDB4ODUsIDB4YzApOwkvKiB0ZXN0ICVyYXgsJXJheCAqLwotCQkJCUVNSVRfQ09ORF9KTVAoWDg2X0pFLCBjbGVhbnVwX2FkZHIgLSAoYWRkcnNbaV0gLSA2KSk7Ci0JCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7Ci0JCQkJRU1JVDIoMHg4YiwgMHg4MCk7CS8qIG1vdiBvZmYzMiglcmF4KSwlZWF4ICovCi0JCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCksIDQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfTUFSSzoKLQkJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBtYXJrKSAhPSA0KTsKLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykpKSB7Ci0JCQkJCS8qIG1vdiBvZmY4KCVyZGkpLCVlYXggKi8KLQkJCQkJRU1JVDMoMHg4YiwgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspKTsKLQkJCQl9IGVsc2UgewotCQkJCQlFTUlUMigweDhiLCAweDg3KTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyayksIDQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQU5DX1JYSEFTSDoKLQkJCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBoYXNoKSAhPSA0KTsKLQkJCQlpZiAoaXNfaW1tOChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgaGFzaCkpKSB7Ci0JCQkJCS8qIG1vdiBvZmY4KCVyZGkpLCVlYXggKi8KLQkJCQkJRU1JVDMoMHg4YiwgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlFTUlUMigweDhiLCAweDg3KTsKLQkJCQkJRU1JVChvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgaGFzaCksIDQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQlBGX1NfQU5DX1FVRVVFOgotCQkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHF1ZXVlX21hcHBpbmcpICE9IDIpOwotCQkJCWlmIChpc19pbW04KG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5nKSkpIHsKLQkJCQkJLyogbW92endsIG9mZjgoJXJkaSksJWVheCAqLwotCQkJCQlFTUlUNCgweDBmLCAweGI3LCAweDQ3LCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcXVldWVfbWFwcGluZykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVNSVQzKDB4MGYsIDB4YjcsIDB4ODcpOyAvKiBtb3Z6d2wgb2ZmMzIoJXJkaSksJWVheCAqLwotCQkJCQlFTUlUKG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5nKSwgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfQ1BVOgotI2lmZGVmIENPTkZJR19TTVAKLQkJCQlFTUlUNCgweDY1LCAweDhiLCAweDA0LCAweDI1KTsgLyogbW92ICVnczpvZmYzMiwlZWF4ICovCi0JCQkJRU1JVCgodTMyKSh1bnNpZ25lZCBsb25nKSZjcHVfbnVtYmVyLCA0KTsgLyogQSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsgKi8KLSNlbHNlCi0JCQkJQ0xFQVJfQSgpOwotI2VuZGlmCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0FOQ19WTEFOX1RBRzoKLQkJCWNhc2UgQlBGX1NfQU5DX1ZMQU5fVEFHX1BSRVNFTlQ6Ci0JCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgdmxhbl90Y2kpICE9IDIpOwotCQkJCWlmIChpc19pbW04KG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkpKSB7Ci0JCQkJCS8qIG1vdnp3bCBvZmY4KCVyZGkpLCVlYXggKi8KLQkJCQkJRU1JVDQoMHgwZiwgMHhiNywgMHg0Nywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU1JVDMoMHgwZiwgMHhiNywgMHg4Nyk7IC8qIG1vdnp3bCBvZmYzMiglcmRpKSwlZWF4ICovCi0JCQkJCUVNSVQob2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSwgNCk7Ci0JCQkJfQotCQkJCUJVSUxEX0JVR19PTihWTEFOX1RBR19QUkVTRU5UICE9IDB4MTAwMCk7Ci0JCQkJaWYgKGZpbHRlcltpXS5jb2RlID09IEJQRl9TX0FOQ19WTEFOX1RBRykgewotCQkJCQlFTUlUMygweDgwLCAweGU0LCAweGVmKTsgLyogYW5kICAgICQweGVmLCVhaCAqLwotCQkJCX0gZWxzZSB7Ci0JCQkJCUVNSVQzKDB4YzEsIDB4ZTgsIDB4MGMpOyAvKiBzaHIgICAgJDB4YywlZWF4ICovCi0JCQkJCUVNSVQzKDB4ODMsIDB4ZTAsIDB4MDEpOyAvKiBhbmQgICAgJDB4MSwlZWF4ICovCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCUEZfU19BTkNfUEtUVFlQRToKLQkJCXsKLQkJCQlpbnQgb2ZmID0gcGt0X3R5cGVfb2Zmc2V0KCk7Ci0KLQkJCQlpZiAob2ZmIDwgMCkKLQkJCQkJZ290byBvdXQ7Ci0JCQkJaWYgKGlzX2ltbTgob2ZmKSkgewotCQkJCQkvKiBtb3Z6Ymwgb2ZmOCglcmRpKSwlZWF4ICovCi0JCQkJCUVNSVQ0KDB4MGYsIDB4YjYsIDB4NDcsIG9mZik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogbW92Ymwgb2ZmMzIoJXJkaSksJWVheCAqLwotCQkJCQlFTUlUMygweDBmLCAweGI2LCAweDg3KTsKLQkJCQkJRU1JVChvZmYsIDQpOwotCQkJCX0KLQkJCQlFTUlUMygweDgzLCAweGUwLCBQS1RfVFlQRV9NQVgpOyAvKiBhbmQgICAgJDB4NywlZWF4ICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEJQRl9TX0xEX1dfQUJTOgotCQkJCWZ1bmMgPSBDSE9PU0VfTE9BRF9GVU5DKEssIHNrX2xvYWRfd29yZCk7Ci1jb21tb25fbG9hZDoJCQlzZWVuIHw9IFNFRU5fREFUQVJFRjsKLQkJCQl0X29mZnNldCA9IGZ1bmMgLSAoaW1hZ2UgKyBhZGRyc1tpXSk7Ci0JCQkJRU1JVDFfb2ZmMzIoMHhiZSwgSyk7IC8qIG1vdiBpbW0zMiwlZXNpICovCi0JCQkJRU1JVDFfb2ZmMzIoMHhlOCwgdF9vZmZzZXQpOyAvKiBjYWxsICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX0hfQUJTOgotCQkJCWZ1bmMgPSBDSE9PU0VfTE9BRF9GVU5DKEssIHNrX2xvYWRfaGFsZik7Ci0JCQkJZ290byBjb21tb25fbG9hZDsKLQkJCWNhc2UgQlBGX1NfTERfQl9BQlM6Ci0JCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF9ieXRlKTsKLQkJCQlnb3RvIGNvbW1vbl9sb2FkOwotCQkJY2FzZSBCUEZfU19MRFhfQl9NU0g6Ci0JCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF9ieXRlX21zaCk7Ci0JCQkJc2VlbiB8PSBTRUVOX0RBVEFSRUYgfCBTRUVOX1hSRUc7Ci0JCQkJdF9vZmZzZXQgPSBmdW5jIC0gKGltYWdlICsgYWRkcnNbaV0pOwotCQkJCUVNSVQxX29mZjMyKDB4YmUsIEspOwkvKiBtb3YgaW1tMzIsJWVzaSAqLwotCQkJCUVNSVQxX29mZjMyKDB4ZTgsIHRfb2Zmc2V0KTsgLyogY2FsbCBza19sb2FkX2J5dGVfbXNoICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX1dfSU5EOgotCQkJCWZ1bmMgPSBza19sb2FkX3dvcmQ7Ci1jb21tb25fbG9hZF9pbmQ6CQlzZWVuIHw9IFNFRU5fREFUQVJFRiB8IFNFRU5fWFJFRzsKLQkJCQl0X29mZnNldCA9IGZ1bmMgLSAoaW1hZ2UgKyBhZGRyc1tpXSk7Ci0JCQkJaWYgKEspIHsKLQkJCQkJaWYgKGlzX2ltbTgoSykpIHsKLQkJCQkJCUVNSVQzKDB4OGQsIDB4NzMsIEspOyAvKiBsZWEgaW1tOCglcmJ4KSwgJWVzaSAqLwotCQkJCQl9IGVsc2UgewotCQkJCQkJRU1JVDIoMHg4ZCwgMHhiMyk7IC8qIGxlYSBpbW0zMiglcmJ4KSwlZXNpICovCi0JCQkJCQlFTUlUKEssIDQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU1JVDIoMHg4OSwweGRlKTsgLyogbW92ICVlYngsJWVzaSAqLwotCQkJCX0KLQkJCQlFTUlUMV9vZmYzMigweGU4LCB0X29mZnNldCk7CS8qIGNhbGwgc2tfbG9hZF94eHhfaW5kICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJQRl9TX0xEX0hfSU5EOgotCQkJCWZ1bmMgPSBza19sb2FkX2hhbGY7Ci0JCQkJZ290byBjb21tb25fbG9hZF9pbmQ7Ci0JCQljYXNlIEJQRl9TX0xEX0JfSU5EOgotCQkJCWZ1bmMgPSBza19sb2FkX2J5dGU7Ci0JCQkJZ290byBjb21tb25fbG9hZF9pbmQ7Ci0JCQljYXNlIEJQRl9TX0pNUF9KQToKLQkJCQl0X29mZnNldCA9IGFkZHJzW2kgKyBLXSAtIGFkZHJzW2ldOwotCQkJCUVNSVRfSk1QKHRfb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KR1RfSywgWDg2X0pBLCBYODZfSkJFKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KR0VfSywgWDg2X0pBRSwgWDg2X0pCKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KRVFfSywgWDg2X0pFLCBYODZfSk5FKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KU0VUX0ssWDg2X0pORSwgWDg2X0pFKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KR1RfWCwgWDg2X0pBLCBYODZfSkJFKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KR0VfWCwgWDg2X0pBRSwgWDg2X0pCKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KRVFfWCwgWDg2X0pFLCBYODZfSk5FKTsKLQkJCUNPTkRfU0VMKEJQRl9TX0pNUF9KU0VUX1gsWDg2X0pORSwgWDg2X0pFKTsKLQotY29uZF9icmFuY2g6CQkJZl9vZmZzZXQgPSBhZGRyc1tpICsgZmlsdGVyW2ldLmpmXSAtIGFkZHJzW2ldOwotCQkJCXRfb2Zmc2V0ID0gYWRkcnNbaSArIGZpbHRlcltpXS5qdF0gLSBhZGRyc1tpXTsKLQotCQkJCS8qIHNhbWUgdGFyZ2V0cywgY2FuIGF2b2lkIGRvaW5nIHRoZSB0ZXN0IDopICovCi0JCQkJaWYgKGZpbHRlcltpXS5qdCA9PSBmaWx0ZXJbaV0uamYpIHsKLQkJCQkJRU1JVF9KTVAodF9vZmZzZXQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2ggKGZpbHRlcltpXS5jb2RlKSB7Ci0JCQkJY2FzZSBCUEZfU19KTVBfSkdUX1g6Ci0JCQkJY2FzZSBCUEZfU19KTVBfSkdFX1g6Ci0JCQkJY2FzZSBCUEZfU19KTVBfSkVRX1g6Ci0JCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCQlFTUlUMigweDM5LCAweGQ4KTsgLyogY21wICVlYngsJWVheCAqLwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJQRl9TX0pNUF9KU0VUX1g6Ci0JCQkJCXNlZW4gfD0gU0VFTl9YUkVHOwotCQkJCQlFTUlUMigweDg1LCAweGQ4KTsgLyogdGVzdCAlZWJ4LCVlYXggKi8KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCUEZfU19KTVBfSkVRX0s6Ci0JCQkJCWlmIChLID09IDApIHsKLQkJCQkJCUVNSVQyKDB4ODUsIDB4YzApOyAvKiB0ZXN0ICAgJWVheCwlZWF4ICovCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgotCQkJCWNhc2UgQlBGX1NfSk1QX0pHRV9LOgotCQkJCQlpZiAoSyA8PSAxMjcpCi0JCQkJCQlFTUlUMygweDgzLCAweGY4LCBLKTsgLyogY21wIGltbTgsJWVheCAqLwotCQkJCQllbHNlCi0JCQkJCQlFTUlUMV9vZmYzMigweDNkLCBLKTsgLyogY21wIGltbTMyLCVlYXggKi8KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCUEZfU19KTVBfSlNFVF9LOgotCQkJCQlpZiAoSyA8PSAweEZGKQotCQkJCQkJRU1JVDIoMHhhOCwgSyk7IC8qIHRlc3QgaW1tOCwlYWwgKi8KLQkJCQkJZWxzZSBpZiAoIShLICYgMHhGRkZGMDBGRikpCi0JCQkJCQlFTUlUMygweGY2LCAweGM0LCBLID4+IDgpOyAvKiB0ZXN0IGltbTgsJWFoICovCi0JCQkJCWVsc2UgaWYgKEsgPD0gMHhGRkZGKSB7Ci0JCQkJCQlFTUlUMigweDY2LCAweGE5KTsgLyogdGVzdCBpbW0xNiwlYXggKi8KLQkJCQkJCUVNSVQoSywgMik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlFTUlUMV9vZmYzMigweGE5LCBLKTsgLyogdGVzdCBpbW0zMiwlZWF4ICovCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChmaWx0ZXJbaV0uanQgIT0gMCkgewotCQkJCQlpZiAoZmlsdGVyW2ldLmpmICYmIGZfb2Zmc2V0KQotCQkJCQkJdF9vZmZzZXQgKz0gaXNfbmVhcihmX29mZnNldCkgPyAyIDogNTsKLQkJCQkJRU1JVF9DT05EX0pNUCh0X29wLCB0X29mZnNldCk7Ci0JCQkJCWlmIChmaWx0ZXJbaV0uamYpCi0JCQkJCQlFTUlUX0pNUChmX29mZnNldCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlFTUlUX0NPTkRfSk1QKGZfb3AsIGZfb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogaG1tLCB0b28gY29tcGxleCBmaWx0ZXIsIGdpdmUgdXAgd2l0aCBqaXQgY29tcGlsZXIgKi8KLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWlsZW4gPSBwcm9nIC0gdGVtcDsKLQkJCWlmIChpbWFnZSkgewotCQkJCWlmICh1bmxpa2VseShwcm9nbGVuICsgaWxlbiA+IG9sZHByb2dsZW4pKSB7Ci0JCQkJCXByX2VycigiYnBiX2ppdF9jb21waWxlIGZhdGFsIGVycm9yXG4iKTsKLQkJCQkJa2ZyZWUoYWRkcnMpOwotCQkJCQltb2R1bGVfZnJlZShOVUxMLCBoZWFkZXIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW1lbWNweShpbWFnZSArIHByb2dsZW4sIHRlbXAsIGlsZW4pOwotCQkJfQotCQkJcHJvZ2xlbiArPSBpbGVuOwotCQkJYWRkcnNbaV0gPSBwcm9nbGVuOwotCQkJcHJvZyA9IHRlbXA7Ci0JCX0KLQkJLyogbGFzdCBicGYgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIGEgUkVUIDoKLQkJICogdXNlIGl0IHRvIGdpdmUgdGhlIGNsZWFudXAgaW5zdHJ1Y3Rpb24ocykgYWRkcgotCQkgKi8KLQkJY2xlYW51cF9hZGRyID0gcHJvZ2xlbiAtIDE7IC8qIHJldCAqLwotCQlpZiAoc2Vlbl9vcl9wYXNzMCkKLQkJCWNsZWFudXBfYWRkciAtPSAxOyAvKiBsZWF2ZXEgKi8KLQkJaWYgKHNlZW5fb3JfcGFzczAgJiBTRUVOX1hSRUcpCi0JCQljbGVhbnVwX2FkZHIgLT0gNDsgLyogbW92ICAtOCglcmJwKSwlcmJ4ICovCi0KIAkJaWYgKGltYWdlKSB7CiAJCQlpZiAocHJvZ2xlbiAhPSBvbGRwcm9nbGVuKQotCQkJCXByX2VycigiYnBiX2ppdF9jb21waWxlIHByb2dsZW49JXUgIT0gb2xkcHJvZ2xlbj0ldVxuIiwgcHJvZ2xlbiwgb2xkcHJvZ2xlbik7CisJCQkJcHJfZXJyKCJicGZfaml0OiBwcm9nbGVuPSVkICE9IG9sZHByb2dsZW49JWRcbiIsCisJCQkJICAgICAgIHByb2dsZW4sIG9sZHByb2dsZW4pOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHByb2dsZW4gPT0gb2xkcHJvZ2xlbikgewpAQCAtNzY2LDE3ICs5MTgsMTYgQEAKIAl9CiAKIAlpZiAoYnBmX2ppdF9lbmFibGUgPiAxKQotCQlicGZfaml0X2R1bXAoZmxlbiwgcHJvZ2xlbiwgcGFzcywgaW1hZ2UpOworCQlicGZfaml0X2R1bXAocHJvZy0+bGVuLCBwcm9nbGVuLCAwLCBpbWFnZSk7CiAKIAlpZiAoaW1hZ2UpIHsKIAkJYnBmX2ZsdXNoX2ljYWNoZShoZWFkZXIsIGltYWdlICsgcHJvZ2xlbik7CiAJCXNldF9tZW1vcnlfcm8oKHVuc2lnbmVkIGxvbmcpaGVhZGVyLCBoZWFkZXItPnBhZ2VzKTsKLQkJZnAtPmJwZl9mdW5jID0gKHZvaWQgKilpbWFnZTsKLQkJZnAtPmppdGVkID0gMTsKKwkJcHJvZy0+YnBmX2Z1bmMgPSAodm9pZCAqKWltYWdlOworCQlwcm9nLT5qaXRlZCA9IDE7CiAJfQogb3V0OgogCWtmcmVlKGFkZHJzKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGJwZl9qaXRfZnJlZV9kZWZlcnJlZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggMTQ3YmMxYi4uM2YyYmRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtMTgxMCw2ICsxODEwLDE2IEBACiAJYWNwaV9vc19tYXBfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrKTsKIAlhY3BpX29zX21hcF9nZW5lcmljX2FkZHJlc3MoJmFjcGlfZ2JsX0ZBRFQueGdwZTBfYmxvY2spOwogCWFjcGlfb3NfbWFwX2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfRkFEVC54Z3BlMV9ibG9jayk7CisJaWYgKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfUkVTRVRfUkVHSVNURVIpIHsKKwkJLyoKKwkJICogVXNlIGFjcGlfb3NfbWFwX2dlbmVyaWNfYWRkcmVzcyB0byBwcmUtbWFwIHRoZSByZXNldAorCQkgKiByZWdpc3RlciBpZiBpdCdzIGluIHN5c3RlbSBtZW1vcnkuCisJCSAqLworCQlpbnQgcnY7CisKKwkJcnYgPSBhY3BpX29zX21hcF9nZW5lcmljX2FkZHJlc3MoJmFjcGlfZ2JsX0ZBRFQucmVzZXRfcmVnaXN0ZXIpOworCQlwcl9kZWJ1ZyhQUkVGSVggIiVzOiBtYXAgcmVzZXRfcmVnIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHJ2KTsKKwl9CiAKIAlyZXR1cm4gQUVfT0s7CiB9CkBAIC0xODM4LDYgKzE4NDgsOCBAQAogCWFjcGlfb3NfdW5tYXBfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF9GQURULnhncGUwX2Jsb2NrKTsKIAlhY3BpX29zX3VubWFwX2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jayk7CiAJYWNwaV9vc191bm1hcF9nZW5lcmljX2FkZHJlc3MoJmFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2spOworCWlmIChhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX1JFU0VUX1JFR0lTVEVSKQorCQlhY3BpX29zX3VubWFwX2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfRkFEVC5yZXNldF9yZWdpc3Rlcik7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShrYWNwaWRfd3EpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGthY3BpX25vdGlmeV93cSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCmluZGV4IGMxMWUzNzkuLmIzZTNjYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAic2xlZXAuaCIKQEAgLTUwMSw2ICs1MDIsNyBAQAogCiAJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKIAorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiYWNwaV9zdXNwZW5kIiksIGFjcGlfc3RhdGUsIHRydWUpOwogCXN3aXRjaCAoYWNwaV9zdGF0ZSkgewogCWNhc2UgQUNQSV9TVEFURV9TMToKIAkJYmFycmllcigpOwpAQCAtNTE2LDYgKzUxOCw3IEBACiAJCXByX2luZm8oUFJFRklYICJMb3ctbGV2ZWwgcmVzdW1lIGNvbXBsZXRlXG4iKTsKIAkJYnJlYWs7CiAJfQorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiYWNwaV9zdXNwZW5kIiksIGFjcGlfc3RhdGUsIGZhbHNlKTsKIAogCS8qIFRoaXMgdmlvbGF0ZXMgdGhlIHNwZWMgYnV0IGlzIHJlcXVpcmVkIGZvciBidWcgY29tcGF0aWJpbGl0eS4gKi8KIAlhY3BpX3dyaXRlX2JpdF9yZWdpc3RlcihBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggMTAxZmIwOS4uZmI5ZmZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTgyLDcgKzgyLDcgQEAKICAqIEZvciBXaW5kb3dzIDggc3lzdGVtczogdXNlZCB0byBkZWNpZGUgaWYgdmlkZW8gbW9kdWxlCiAgKiBzaG91bGQgc2tpcCByZWdpc3RlcmluZyBiYWNrbGlnaHQgaW50ZXJmYWNlIG9mIGl0cyBvd24uCiAgKi8KLXN0YXRpYyBpbnQgdXNlX25hdGl2ZV9iYWNrbGlnaHRfcGFyYW0gPSAtMTsKK3N0YXRpYyBpbnQgdXNlX25hdGl2ZV9iYWNrbGlnaHRfcGFyYW0gPSAxOwogbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9uYXRpdmVfYmFja2xpZ2h0LCB1c2VfbmF0aXZlX2JhY2tsaWdodF9wYXJhbSwgaW50LCAwNDQ0KTsKIHN0YXRpYyBib29sIHVzZV9uYXRpdmVfYmFja2xpZ2h0X2RtaSA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuYwppbmRleCAyMDQ4MTRlLi5kNDcyNWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCisrKyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKQEAgLTI3ODAsNyArMjc4MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZvcmUyMDBlX21vZHVsZV9pbml0KHZvaWQpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCXByaW50ayhGT1JFMjAwRSAiRk9SRSBTeXN0ZW1zIDIwMEUtc2VyaWVzIEFUTSBkcml2ZXIgLSB2ZXJzaW9uICIgRk9SRTIwMEVfVkVSU0lPTiAiXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKaW5kZXggMWJkZjEwNC4uYjYyMWY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuYworKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCkBAIC0yNTUxLDEyICsyNTUxLDEyIEBACiAJCXRpbWVvdXQgPSA1ICogMTAwMDsKIAkJd2hpbGUgKGF0b21pY19yZWFkKCZ2Yy0+c2NxLT51c2VkKSA+IDApIHsKIAkJCXRpbWVvdXQgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKLQkJCWlmICghdGltZW91dCkKKwkJCWlmICghdGltZW91dCkgeworCQkJCXByX3dhcm4oIiVzOiBTQ1EgZHJhaW4gdGltZW91dDogJXUgdXNlZFxuIiwKKwkJCQkJY2FyZC0+bmFtZSwgYXRvbWljX3JlYWQoJnZjLT5zY3EtPnVzZWQpKTsKIAkJCQlicmVhazsKKwkJCX0KIAkJfQotCQlpZiAoIXRpbWVvdXQpCi0JCQlwcmludGsoIiVzOiBTQ1EgZHJhaW4gdGltZW91dDogJXUgdXNlZFxuIiwKLQkJCSAgICAgICBjYXJkLT5uYW1lLCBhdG9taWNfcmVhZCgmdmMtPnNjcS0+dXNlZCkpOwogCiAJCXdyaXRlbChUQ01EUV9IQUxUIHwgdmMtPmluZGV4LCBTQVJfUkVHX1RDTURRKTsKIAkJY2xlYXJfc2NkKGNhcmQsIHZjLT5zY3EsIHZjLT5jbGFzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCAzNDNmZmFkLi5iZjQxMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTIxNCw5ICsyMTQsNiBAQAogCQlwcl9pbmZvKCJjYWxsICVzKyByZXR1cm5lZCAlZCBhZnRlciAlTGQgdXNlY3NcbiIsIGRldl9uYW1lKGRldiksCiAJCQllcnJvciwgKHVuc2lnbmVkIGxvbmcgbG9uZyluc2VjcyA+PiAxMCk7CiAJfQotCi0JdHJhY2VfZGV2aWNlX3BtX3JlcG9ydF90aW1lKGRldiwgaW5mbywgbnNlY3MsIHBtX3ZlcmIoc3RhdGUuZXZlbnQpLAotCQkJCSAgICBlcnJvcik7CiB9CiAKIC8qKgpAQCAtMzg3LDcgKzM4NCw5IEBACiAJY2FsbHRpbWUgPSBpbml0Y2FsbF9kZWJ1Z19zdGFydChkZXYpOwogCiAJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCBpbmZvKTsKKwl0cmFjZV9kZXZpY2VfcG1fY2FsbGJhY2tfc3RhcnQoZGV2LCBpbmZvLCBzdGF0ZS5ldmVudCk7CiAJZXJyb3IgPSBjYihkZXYpOworCXRyYWNlX2RldmljZV9wbV9jYWxsYmFja19lbmQoZGV2LCBlcnJvcik7CiAJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGNiLCBlcnJvcik7CiAKIAlpbml0Y2FsbF9kZWJ1Z19yZXBvcnQoZGV2LCBjYWxsdGltZSwgZXJyb3IsIHN0YXRlLCBpbmZvKTsKQEAgLTU0NSw2ICs1NDQsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fcmVzdW1lX25vaXJxIiksIHN0YXRlLmV2ZW50LCB0cnVlKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKIApAQCAtNTg3LDYgKzU4Nyw3IEBACiAJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCAibm9pcnEiKTsKIAlyZXN1bWVfZGV2aWNlX2lycXMoKTsKIAljcHVpZGxlX3Jlc3VtZSgpOworCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX3Jlc3VtZV9ub2lycSIpLCBzdGF0ZS5ldmVudCwgZmFsc2UpOwogfQogCiAvKioKQEAgLTY2NCw2ICs2NjUsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fcmVzdW1lX2Vhcmx5IiksIHN0YXRlLmV2ZW50LCB0cnVlKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKIApAQCAtNzAzLDYgKzcwNSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJlYXJseSIpOworCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX3Jlc3VtZV9lYXJseSIpLCBzdGF0ZS5ldmVudCwgZmFsc2UpOwogfQogCiAvKioKQEAgLTgzNCw2ICs4MzcsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fcmVzdW1lIiksIHN0YXRlLmV2ZW50LCB0cnVlKTsKIAltaWdodF9zbGVlcCgpOwogCiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKQEAgLTg3NSw2ICs4NzksNyBAQAogCWRwbV9zaG93X3RpbWUoc3RhcnR0aW1lLCBzdGF0ZSwgTlVMTCk7CiAKIAljcHVmcmVxX3Jlc3VtZSgpOworCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX3Jlc3VtZSIpLCBzdGF0ZS5ldmVudCwgZmFsc2UpOwogfQogCiAvKioKQEAgLTkxMyw3ICs5MTgsOSBAQAogCiAJaWYgKGNhbGxiYWNrKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgaW5mbyk7CisJCXRyYWNlX2RldmljZV9wbV9jYWxsYmFja19zdGFydChkZXYsIGluZm8sIHN0YXRlLmV2ZW50KTsKIAkJY2FsbGJhY2soZGV2KTsKKwkJdHJhY2VfZGV2aWNlX3BtX2NhbGxiYWNrX2VuZChkZXYsIDApOwogCX0KIAogCWRldmljZV91bmxvY2soZGV2KTsKQEAgLTkzMiw2ICs5MzksNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX2NvbXBsZXRlIiksIHN0YXRlLmV2ZW50LCB0cnVlKTsKIAltaWdodF9zbGVlcCgpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwpAQCAtOTUxLDYgKzk1OSw3IEBACiAJfQogCWxpc3Rfc3BsaWNlKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoImRwbV9jb21wbGV0ZSIpLCBzdGF0ZS5ldmVudCwgZmFsc2UpOwogfQogCiAvKioKQEAgLTEwODYsNiArMTA5NSw3IEBACiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAlpbnQgZXJyb3IgPSAwOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fc3VzcGVuZF9ub2lycSIpLCBzdGF0ZS5ldmVudCwgdHJ1ZSk7CiAJY3B1aWRsZV9wYXVzZSgpOwogCXN1c3BlbmRfZGV2aWNlX2lycXMoKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwpAQCAtMTEyNiw2ICsxMTM2LDcgQEAKIAl9IGVsc2UgewogCQlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJub2lycSIpOwogCX0KKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoImRwbV9zdXNwZW5kX25vaXJxIiksIHN0YXRlLmV2ZW50LCBmYWxzZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMjIyLDYgKzEyMzMsNyBAQAogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAJaW50IGVycm9yID0gMDsKIAorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX3N1c3BlbmRfbGF0ZSIpLCBzdGF0ZS5ldmVudCwgdHJ1ZSk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAJYXN5bmNfZXJyb3IgPSAwOwpAQCAtMTI1Nyw2ICsxMjY5LDcgQEAKIAl9IGVsc2UgewogCQlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJsYXRlIik7CiAJfQorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiZHBtX3N1c3BlbmRfbGF0ZSIpLCBzdGF0ZS5ldmVudCwgZmFsc2UpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTI5NSw3ICsxMzA4LDkgQEAKIAogCWNhbGx0aW1lID0gaW5pdGNhbGxfZGVidWdfc3RhcnQoZGV2KTsKIAorCXRyYWNlX2RldmljZV9wbV9jYWxsYmFja19zdGFydChkZXYsIGluZm8sIHN0YXRlLmV2ZW50KTsKIAllcnJvciA9IGNiKGRldiwgc3RhdGUpOworCXRyYWNlX2RldmljZV9wbV9jYWxsYmFja19lbmQoZGV2LCBlcnJvcik7CiAJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGNiLCBlcnJvcik7CiAKIAlpbml0Y2FsbF9kZWJ1Z19yZXBvcnQoZGV2LCBjYWxsdGltZSwgZXJyb3IsIHN0YXRlLCBpbmZvKTsKQEAgLTE0NjEsNiArMTQ3Niw3IEBACiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAlpbnQgZXJyb3IgPSAwOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fc3VzcGVuZCIpLCBzdGF0ZS5ldmVudCwgdHJ1ZSk7CiAJbWlnaHRfc2xlZXAoKTsKIAogCWNwdWZyZXFfc3VzcGVuZCgpOwpAQCAtMTQ5OCw2ICsxNTE0LDcgQEAKIAkJZHBtX3NhdmVfZmFpbGVkX3N0ZXAoU1VTUEVORF9TVVNQRU5EKTsKIAl9IGVsc2UKIAkJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCBOVUxMKTsKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoImRwbV9zdXNwZW5kIiksIHN0YXRlLmV2ZW50LCBmYWxzZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNTQ5LDggKzE1NjYsMTEgQEAKIAkJY2FsbGJhY2sgPSBkZXYtPmRyaXZlci0+cG0tPnByZXBhcmU7CiAJfQogCi0JaWYgKGNhbGxiYWNrKQorCWlmIChjYWxsYmFjaykgeworCQl0cmFjZV9kZXZpY2VfcG1fY2FsbGJhY2tfc3RhcnQoZGV2LCBpbmZvLCBzdGF0ZS5ldmVudCk7CiAJCXJldCA9IGNhbGxiYWNrKGRldik7CisJCXRyYWNlX2RldmljZV9wbV9jYWxsYmFja19lbmQoZGV2LCByZXQpOworCX0KIAogCWRldmljZV91bmxvY2soZGV2KTsKIApAQCAtMTU4Miw2ICsxNjAyLDcgQEAKIHsKIAlpbnQgZXJyb3IgPSAwOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJkcG1fcHJlcGFyZSIpLCBzdGF0ZS5ldmVudCwgdHJ1ZSk7CiAJbWlnaHRfc2xlZXAoKTsKIAogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CkBAIC0xNjEyLDYgKzE2MzMsNyBAQAogCQlwdXRfZGV2aWNlKGRldik7CiAJfQogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoImRwbV9wcmVwYXJlIiksIHN0YXRlLmV2ZW50LCBmYWxzZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jIGIvZHJpdmVycy9iYXNlL3N5c2NvcmUuYwppbmRleCBlOGQxMWI2Li5kYmI4MzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9zeXNjb3JlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCiBzdGF0aWMgTElTVF9IRUFEKHN5c2NvcmVfb3BzX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChzeXNjb3JlX29wc19sb2NrKTsKQEAgLTQ5LDYgKzUwLDcgQEAKIAlzdHJ1Y3Qgc3lzY29yZV9vcHMgKm9wczsKIAlpbnQgcmV0ID0gMDsKIAorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygic3lzY29yZV9zdXNwZW5kIiksIDAsIHRydWUpOwogCXByX2RlYnVnKCJDaGVja2luZyB3YWtldXAgaW50ZXJydXB0c1xuIik7CiAKIAkvKiBSZXR1cm4gZXJyb3IgY29kZSBpZiB0aGVyZSBhcmUgYW55IHdha2V1cCBpbnRlcnJ1cHRzIHBlbmRpbmcuICovCkBAIC03MCw2ICs3Miw3IEBACiAJCQkJIkludGVycnVwdHMgZW5hYmxlZCBhZnRlciAlcEZcbiIsIG9wcy0+c3VzcGVuZCk7CiAJCX0KIAorCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygic3lzY29yZV9zdXNwZW5kIiksIDAsIGZhbHNlKTsKIAlyZXR1cm4gMDsKIAogIGVycl9vdXQ6CkBAIC05Miw2ICs5NSw3IEBACiB7CiAJc3RydWN0IHN5c2NvcmVfb3BzICpvcHM7CiAKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoInN5c2NvcmVfcmVzdW1lIiksIDAsIHRydWUpOwogCVdBUk5fT05DRSghaXJxc19kaXNhYmxlZCgpLAogCQkiSW50ZXJydXB0cyBlbmFibGVkIGJlZm9yZSBzeXN0ZW0gY29yZSByZXN1bWUuXG4iKTsKIApAQCAtMTAzLDYgKzEwNyw3IEBACiAJCQlXQVJOX09OQ0UoIWlycXNfZGlzYWJsZWQoKSwKIAkJCQkiSW50ZXJydXB0cyBlbmFibGVkIGFmdGVyICVwRlxuIiwgb3BzLT5yZXN1bWUpOwogCQl9CisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJzeXNjb3JlX3Jlc3VtZSIpLCAwLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzeXNjb3JlX3Jlc3VtZSk7CiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JiZC5jIGIvZHJpdmVycy9ibG9jay9yYmQuYwppbmRleCA0Yzk1YjUwLi5iYmViNDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JiZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcmJkLmMKQEAgLTU0MSw3ICs1NDEsNiBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCSh2b2lkKSBnZXRfZGV2aWNlKCZyYmRfZGV2LT5kZXYpOwotCXNldF9kZXZpY2Vfcm8oYmRldiwgcmJkX2Rldi0+bWFwcGluZy5yZWFkX29ubHkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTksMTAgKzU1OCw3NiBAQAogCXB1dF9kZXZpY2UoJnJiZF9kZXYtPmRldik7CiB9CiAKK3N0YXRpYyBpbnQgcmJkX2lvY3RsX3NldF9ybyhzdHJ1Y3QgcmJkX2RldmljZSAqcmJkX2RldiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IDA7CisJaW50IHZhbDsKKwlib29sIHJvOworCWJvb2wgcm9fY2hhbmdlZCA9IGZhbHNlOworCisJLyogZ2V0X3VzZXIoKSBtYXkgc2xlZXAsIHNvIGNhbGwgaXQgYmVmb3JlIHRha2luZyByYmRfZGV2LT5sb2NrICovCisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikoYXJnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcm8gPSB2YWwgPyB0cnVlIDogZmFsc2U7CisJLyogU25hcHNob3QgZG9lc24ndCBhbGxvdyB0byB3cml0ZSovCisJaWYgKHJiZF9kZXYtPnNwZWMtPnNuYXBfaWQgIT0gQ0VQSF9OT1NOQVAgJiYgIXJvKQorCQlyZXR1cm4gLUVST0ZTOworCisJc3Bpbl9sb2NrX2lycSgmcmJkX2Rldi0+bG9jayk7CisJLyogcHJldmVudCBvdGhlcnMgb3BlbiB0aGlzIGRldmljZSAqLworCWlmIChyYmRfZGV2LT5vcGVuX2NvdW50ID4gMSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyYmRfZGV2LT5tYXBwaW5nLnJlYWRfb25seSAhPSBybykgeworCQlyYmRfZGV2LT5tYXBwaW5nLnJlYWRfb25seSA9IHJvOworCQlyb19jaGFuZ2VkID0gdHJ1ZTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnEoJnJiZF9kZXYtPmxvY2spOworCS8qIHNldF9kaXNrX3JvKCkgbWF5IHNsZWVwLCBzbyBjYWxsIGl0IGFmdGVyIHJlbGVhc2luZyByYmRfZGV2LT5sb2NrICovCisJaWYgKHJldCA9PSAwICYmIHJvX2NoYW5nZWQpCisJCXNldF9kaXNrX3JvKHJiZF9kZXYtPmRpc2ssIHJvID8gMSA6IDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByYmRfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJiZF9kZXZpY2UgKnJiZF9kZXYgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQkxLUk9TRVQ6CisJCXJldCA9IHJiZF9pb2N0bF9zZXRfcm8ocmJkX2RldiwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RUWTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCByYmRfY29tcGF0X2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcmJkX2lvY3RsKGJkZXYsIG1vZGUsIGNtZCwgYXJnKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgcmJkX2JkX29wcyA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQkJPSByYmRfb3BlbiwKIAkucmVsZWFzZQkJPSByYmRfcmVsZWFzZSwKKwkuaW9jdGwJCQk9IHJiZF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAkJPSByYmRfY29tcGF0X2lvY3RsLAorI2VuZGlmCiB9OwogCiAvKgpAQCAtMTM4Miw2ICsxNDQ3LDEzIEBACiAJa3JlZl9wdXQoJm9ial9yZXF1ZXN0LT5rcmVmLCByYmRfb2JqX3JlcXVlc3RfZGVzdHJveSk7CiB9CiAKK3N0YXRpYyB2b2lkIHJiZF9pbWdfcmVxdWVzdF9nZXQoc3RydWN0IHJiZF9pbWdfcmVxdWVzdCAqaW1nX3JlcXVlc3QpCit7CisJZG91dCgiJXM6IGltZyAlcCAod2FzICVkKVxuIiwgX19mdW5jX18sIGltZ19yZXF1ZXN0LAorCSAgICAgYXRvbWljX3JlYWQoJmltZ19yZXF1ZXN0LT5rcmVmLnJlZmNvdW50KSk7CisJa3JlZl9nZXQoJmltZ19yZXF1ZXN0LT5rcmVmKTsKK30KKwogc3RhdGljIGJvb2wgaW1nX3JlcXVlc3RfY2hpbGRfdGVzdChzdHJ1Y3QgcmJkX2ltZ19yZXF1ZXN0ICppbWdfcmVxdWVzdCk7CiBzdGF0aWMgdm9pZCByYmRfcGFyZW50X3JlcXVlc3RfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZik7CiBzdGF0aWMgdm9pZCByYmRfaW1nX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZik7CkBAIC0yMTQyLDYgKzIyMTQsNyBAQAogCWltZ19yZXF1ZXN0LT5uZXh0X2NvbXBsZXRpb24gPSB3aGljaDsKIG91dDoKIAlzcGluX3VubG9ja19pcnEoJmltZ19yZXF1ZXN0LT5jb21wbGV0aW9uX2xvY2spOworCXJiZF9pbWdfcmVxdWVzdF9wdXQoaW1nX3JlcXVlc3QpOwogCiAJaWYgKCFtb3JlKQogCQlyYmRfaW1nX3JlcXVlc3RfY29tcGxldGUoaW1nX3JlcXVlc3QpOwpAQCAtMjI0Miw2ICsyMzE1LDcgQEAKIAkJCWdvdG8gb3V0X3Vud2luZDsKIAkJb2JqX3JlcXVlc3QtPm9zZF9yZXEgPSBvc2RfcmVxOwogCQlvYmpfcmVxdWVzdC0+Y2FsbGJhY2sgPSByYmRfaW1nX29ial9jYWxsYmFjazsKKwkJcmJkX2ltZ19yZXF1ZXN0X2dldChpbWdfcmVxdWVzdCk7CiAKIAkJaWYgKHdyaXRlX3JlcXVlc3QpIHsKIAkJCW9zZF9yZXFfb3BfYWxsb2NfaGludF9pbml0KG9zZF9yZXEsIHdoaWNoLApAQCAtMjg3Miw1NiArMjk0Niw1NSBAQAogfQogCiAvKgotICogUmVxdWVzdCBzeW5jIG9zZCB3YXRjaC91bndhdGNoLiAgVGhlIHZhbHVlIG9mICJzdGFydCIgZGV0ZXJtaW5lcwotICogd2hldGhlciBhIHdhdGNoIHJlcXVlc3QgaXMgYmVpbmcgaW5pdGlhdGVkIG9yIHRvcm4gZG93bi4KKyAqIEluaXRpYXRlIGEgd2F0Y2ggcmVxdWVzdCwgc3luY2hyb25vdXNseS4KICAqLwotc3RhdGljIGludCBfX3JiZF9kZXZfaGVhZGVyX3dhdGNoX3N5bmMoc3RydWN0IHJiZF9kZXZpY2UgKnJiZF9kZXYsIGJvb2wgc3RhcnQpCitzdGF0aWMgaW50IHJiZF9kZXZfaGVhZGVyX3dhdGNoX3N5bmMoc3RydWN0IHJiZF9kZXZpY2UgKnJiZF9kZXYpCiB7CiAJc3RydWN0IGNlcGhfb3NkX2NsaWVudCAqb3NkYyA9ICZyYmRfZGV2LT5yYmRfY2xpZW50LT5jbGllbnQtPm9zZGM7CiAJc3RydWN0IHJiZF9vYmpfcmVxdWVzdCAqb2JqX3JlcXVlc3Q7CiAJaW50IHJldDsKIAotCXJiZF9hc3NlcnQoc3RhcnQgXiAhIXJiZF9kZXYtPndhdGNoX2V2ZW50KTsKLQlyYmRfYXNzZXJ0KHN0YXJ0IF4gISFyYmRfZGV2LT53YXRjaF9yZXF1ZXN0KTsKKwlyYmRfYXNzZXJ0KCFyYmRfZGV2LT53YXRjaF9ldmVudCk7CisJcmJkX2Fzc2VydCghcmJkX2Rldi0+d2F0Y2hfcmVxdWVzdCk7CiAKLQlpZiAoc3RhcnQpIHsKLQkJcmV0ID0gY2VwaF9vc2RjX2NyZWF0ZV9ldmVudChvc2RjLCByYmRfd2F0Y2hfY2IsIHJiZF9kZXYsCi0JCQkJCQkmcmJkX2Rldi0+d2F0Y2hfZXZlbnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCXJiZF9hc3NlcnQocmJkX2Rldi0+d2F0Y2hfZXZlbnQgIT0gTlVMTCk7Ci0JfQorCXJldCA9IGNlcGhfb3NkY19jcmVhdGVfZXZlbnQob3NkYywgcmJkX3dhdGNoX2NiLCByYmRfZGV2LAorCQkJCSAgICAgJnJiZF9kZXYtPndhdGNoX2V2ZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldCA9IC1FTk9NRU07CisJcmJkX2Fzc2VydChyYmRfZGV2LT53YXRjaF9ldmVudCk7CisKIAlvYmpfcmVxdWVzdCA9IHJiZF9vYmpfcmVxdWVzdF9jcmVhdGUocmJkX2Rldi0+aGVhZGVyX25hbWUsIDAsIDAsCi0JCQkJCQkJT0JKX1JFUVVFU1RfTk9EQVRBKTsKLQlpZiAoIW9ial9yZXF1ZXN0KQorCQkJCQkgICAgIE9CSl9SRVFVRVNUX05PREFUQSk7CisJaWYgKCFvYmpfcmVxdWVzdCkgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9jYW5jZWw7CisJfQogCiAJb2JqX3JlcXVlc3QtPm9zZF9yZXEgPSByYmRfb3NkX3JlcV9jcmVhdGUocmJkX2RldiwgdHJ1ZSwgMSwKIAkJCQkJCSAgb2JqX3JlcXVlc3QpOwotCWlmICghb2JqX3JlcXVlc3QtPm9zZF9yZXEpCi0JCWdvdG8gb3V0X2NhbmNlbDsKKwlpZiAoIW9ial9yZXF1ZXN0LT5vc2RfcmVxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3B1dDsKKwl9CiAKLQlpZiAoc3RhcnQpCi0JCWNlcGhfb3NkY19zZXRfcmVxdWVzdF9saW5nZXIob3NkYywgb2JqX3JlcXVlc3QtPm9zZF9yZXEpOwotCWVsc2UKLQkJY2VwaF9vc2RjX3VucmVnaXN0ZXJfbGluZ2VyX3JlcXVlc3Qob3NkYywKLQkJCQkJcmJkX2Rldi0+d2F0Y2hfcmVxdWVzdC0+b3NkX3JlcSk7CisJY2VwaF9vc2RjX3NldF9yZXF1ZXN0X2xpbmdlcihvc2RjLCBvYmpfcmVxdWVzdC0+b3NkX3JlcSk7CiAKIAlvc2RfcmVxX29wX3dhdGNoX2luaXQob2JqX3JlcXVlc3QtPm9zZF9yZXEsIDAsIENFUEhfT1NEX09QX1dBVENILAotCQkJCXJiZF9kZXYtPndhdGNoX2V2ZW50LT5jb29raWUsIDAsIHN0YXJ0ID8gMSA6IDApOworCQkJICAgICAgcmJkX2Rldi0+d2F0Y2hfZXZlbnQtPmNvb2tpZSwgMCwgMSk7CiAJcmJkX29zZF9yZXFfZm9ybWF0X3dyaXRlKG9ial9yZXF1ZXN0KTsKIAogCXJldCA9IHJiZF9vYmpfcmVxdWVzdF9zdWJtaXQob3NkYywgb2JqX3JlcXVlc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X2NhbmNlbDsKKwkJZ290byBvdXRfbGluZ2VyOworCiAJcmV0ID0gcmJkX29ial9yZXF1ZXN0X3dhaXQob2JqX3JlcXVlc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X2NhbmNlbDsKKwkJZ290byBvdXRfbGluZ2VyOworCiAJcmV0ID0gb2JqX3JlcXVlc3QtPnJlc3VsdDsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9jYW5jZWw7CisJCWdvdG8gb3V0X2xpbmdlcjsKIAogCS8qCiAJICogQSB3YXRjaCByZXF1ZXN0IGlzIHNldCB0byBsaW5nZXIsIHNvIHRoZSB1bmRlcmx5aW5nIG9zZApAQCAtMjkzMSwzNiArMzAwNCw4NCBAQAogCSAqIGl0LiAgV2UnbGwgZHJvcCB0aGF0IHJlZmVyZW5jZSAoYmVsb3cpIGFmdGVyIHdlJ3ZlCiAJICogdW5yZWdpc3RlcmVkIGl0LgogCSAqLwotCWlmIChzdGFydCkgewotCQlyYmRfZGV2LT53YXRjaF9yZXF1ZXN0ID0gb2JqX3JlcXVlc3Q7CisJcmJkX2Rldi0+d2F0Y2hfcmVxdWVzdCA9IG9ial9yZXF1ZXN0OwogCi0JCXJldHVybiAwOwotCX0KKwlyZXR1cm4gMDsKIAotCS8qIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHRvcm4gZG93biB0aGUgd2F0Y2ggcmVxdWVzdCAqLwotCi0JcmJkX29ial9yZXF1ZXN0X3B1dChyYmRfZGV2LT53YXRjaF9yZXF1ZXN0KTsKLQlyYmRfZGV2LT53YXRjaF9yZXF1ZXN0ID0gTlVMTDsKK291dF9saW5nZXI6CisJY2VwaF9vc2RjX3VucmVnaXN0ZXJfbGluZ2VyX3JlcXVlc3Qob3NkYywgb2JqX3JlcXVlc3QtPm9zZF9yZXEpOworb3V0X3B1dDoKKwlyYmRfb2JqX3JlcXVlc3RfcHV0KG9ial9yZXF1ZXN0KTsKIG91dF9jYW5jZWw6Ci0JLyogQ2FuY2VsIHRoZSBldmVudCBpZiB3ZSdyZSB0ZWFyaW5nIGRvd24sIG9yIG9uIGVycm9yICovCiAJY2VwaF9vc2RjX2NhbmNlbF9ldmVudChyYmRfZGV2LT53YXRjaF9ldmVudCk7CiAJcmJkX2Rldi0+d2F0Y2hfZXZlbnQgPSBOVUxMOwotCWlmIChvYmpfcmVxdWVzdCkKLQkJcmJkX29ial9yZXF1ZXN0X3B1dChvYmpfcmVxdWVzdCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJiZF9kZXZfaGVhZGVyX3dhdGNoX3N5bmMoc3RydWN0IHJiZF9kZXZpY2UgKnJiZF9kZXYpCisvKgorICogVGVhciBkb3duIGEgd2F0Y2ggcmVxdWVzdCwgc3luY2hyb25vdXNseS4KKyAqLworc3RhdGljIGludCBfX3JiZF9kZXZfaGVhZGVyX3Vud2F0Y2hfc3luYyhzdHJ1Y3QgcmJkX2RldmljZSAqcmJkX2RldikKIHsKLQlyZXR1cm4gX19yYmRfZGV2X2hlYWRlcl93YXRjaF9zeW5jKHJiZF9kZXYsIHRydWUpOworCXN0cnVjdCBjZXBoX29zZF9jbGllbnQgKm9zZGMgPSAmcmJkX2Rldi0+cmJkX2NsaWVudC0+Y2xpZW50LT5vc2RjOworCXN0cnVjdCByYmRfb2JqX3JlcXVlc3QgKm9ial9yZXF1ZXN0OworCWludCByZXQ7CisKKwlyYmRfYXNzZXJ0KHJiZF9kZXYtPndhdGNoX2V2ZW50KTsKKwlyYmRfYXNzZXJ0KHJiZF9kZXYtPndhdGNoX3JlcXVlc3QpOworCisJb2JqX3JlcXVlc3QgPSByYmRfb2JqX3JlcXVlc3RfY3JlYXRlKHJiZF9kZXYtPmhlYWRlcl9uYW1lLCAwLCAwLAorCQkJCQkgICAgIE9CSl9SRVFVRVNUX05PREFUQSk7CisJaWYgKCFvYmpfcmVxdWVzdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jYW5jZWw7CisJfQorCisJb2JqX3JlcXVlc3QtPm9zZF9yZXEgPSByYmRfb3NkX3JlcV9jcmVhdGUocmJkX2RldiwgdHJ1ZSwgMSwKKwkJCQkJCSAgb2JqX3JlcXVlc3QpOworCWlmICghb2JqX3JlcXVlc3QtPm9zZF9yZXEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCW9zZF9yZXFfb3Bfd2F0Y2hfaW5pdChvYmpfcmVxdWVzdC0+b3NkX3JlcSwgMCwgQ0VQSF9PU0RfT1BfV0FUQ0gsCisJCQkgICAgICByYmRfZGV2LT53YXRjaF9ldmVudC0+Y29va2llLCAwLCAwKTsKKwlyYmRfb3NkX3JlcV9mb3JtYXRfd3JpdGUob2JqX3JlcXVlc3QpOworCisJcmV0ID0gcmJkX29ial9yZXF1ZXN0X3N1Ym1pdChvc2RjLCBvYmpfcmVxdWVzdCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcHV0OworCisJcmV0ID0gcmJkX29ial9yZXF1ZXN0X3dhaXQob2JqX3JlcXVlc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3B1dDsKKworCXJldCA9IG9ial9yZXF1ZXN0LT5yZXN1bHQ7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcHV0OworCisJLyogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgdG9ybiBkb3duIHRoZSB3YXRjaCByZXF1ZXN0ICovCisKKwljZXBoX29zZGNfdW5yZWdpc3Rlcl9saW5nZXJfcmVxdWVzdChvc2RjLAorCQkJCQkgICAgcmJkX2Rldi0+d2F0Y2hfcmVxdWVzdC0+b3NkX3JlcSk7CisJcmJkX29ial9yZXF1ZXN0X3B1dChyYmRfZGV2LT53YXRjaF9yZXF1ZXN0KTsKKwlyYmRfZGV2LT53YXRjaF9yZXF1ZXN0ID0gTlVMTDsKKworb3V0X3B1dDoKKwlyYmRfb2JqX3JlcXVlc3RfcHV0KG9ial9yZXF1ZXN0KTsKK291dF9jYW5jZWw6CisJY2VwaF9vc2RjX2NhbmNlbF9ldmVudChyYmRfZGV2LT53YXRjaF9ldmVudCk7CisJcmJkX2Rldi0+d2F0Y2hfZXZlbnQgPSBOVUxMOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgcmJkX2Rldl9oZWFkZXJfdW53YXRjaF9zeW5jKHN0cnVjdCByYmRfZGV2aWNlICpyYmRfZGV2KQogewogCWludCByZXQ7CiAKLQlyZXQgPSBfX3JiZF9kZXZfaGVhZGVyX3dhdGNoX3N5bmMocmJkX2RldiwgZmFsc2UpOworCXJldCA9IF9fcmJkX2Rldl9oZWFkZXJfdW53YXRjaF9zeW5jKHJiZF9kZXYpOwogCWlmIChyZXQpIHsKIAkJcmJkX3dhcm4ocmJkX2RldiwgInVuYWJsZSB0byB0ZWFyIGRvd24gd2F0Y2ggcmVxdWVzdDogJWRcbiIsCiAJCQkgcmV0KTsKQEAgLTMwNTgsNyArMzE3OSw2IEBACiAJCV9fcmVsZWFzZXMocS0+cXVldWVfbG9jaykgX19hY3F1aXJlcyhxLT5xdWV1ZV9sb2NrKQogewogCXN0cnVjdCByYmRfZGV2aWNlICpyYmRfZGV2ID0gcS0+cXVldWVkYXRhOwotCWJvb2wgcmVhZF9vbmx5ID0gcmJkX2Rldi0+bWFwcGluZy5yZWFkX29ubHk7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCByZXN1bHQ7CiAKQEAgLTMwOTQsNyArMzIxNCw3IEBACiAKIAkJaWYgKHdyaXRlX3JlcXVlc3QpIHsKIAkJCXJlc3VsdCA9IC1FUk9GUzsKLQkJCWlmIChyZWFkX29ubHkpCisJCQlpZiAocmJkX2Rldi0+bWFwcGluZy5yZWFkX29ubHkpCiAJCQkJZ290byBlbmRfcmVxdWVzdDsKIAkJCXJiZF9hc3NlcnQocmJkX2Rldi0+c3BlYy0+c25hcF9pZCA9PSBDRVBIX05PU05BUCk7CiAJCX0KQEAgLTQ2ODMsNiArNDgwMywzOCBAQAogfQogCiAvKgorICogUmV0dXJuIHBvb2wgaWQgKD49IDApIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCByYmRfYWRkX2dldF9wb29sX2lkKHN0cnVjdCByYmRfY2xpZW50ICpyYmRjLCBjb25zdCBjaGFyICpwb29sX25hbWUpCit7CisJdTY0IG5ld2VzdF9lcG9jaDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSByYmRjLT5jbGllbnQtPm9wdGlvbnMtPm1vdW50X3RpbWVvdXQgKiBIWjsKKwlpbnQgdHJpZXMgPSAwOworCWludCByZXQ7CisKK2FnYWluOgorCXJldCA9IGNlcGhfcGdfcG9vbGlkX2J5X25hbWUocmJkYy0+Y2xpZW50LT5vc2RjLm9zZG1hcCwgcG9vbF9uYW1lKTsKKwlpZiAocmV0ID09IC1FTk9FTlQgJiYgdHJpZXMrKyA8IDEpIHsKKwkJcmV0ID0gY2VwaF9tb25jX2RvX2dldF92ZXJzaW9uKCZyYmRjLT5jbGllbnQtPm1vbmMsICJvc2RtYXAiLAorCQkJCQkgICAgICAgJm5ld2VzdF9lcG9jaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAocmJkYy0+Y2xpZW50LT5vc2RjLm9zZG1hcC0+ZXBvY2ggPCBuZXdlc3RfZXBvY2gpIHsKKwkJCWNlcGhfbW9uY19yZXF1ZXN0X25leHRfb3NkbWFwKCZyYmRjLT5jbGllbnQtPm1vbmMpOworCQkJKHZvaWQpIGNlcGhfbW9uY193YWl0X29zZG1hcCgmcmJkYy0+Y2xpZW50LT5tb25jLAorCQkJCQkJICAgICBuZXdlc3RfZXBvY2gsIHRpbWVvdXQpOworCQkJZ290byBhZ2FpbjsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBvc2RtYXAgd2UgaGF2ZSBpcyBuZXcgZW5vdWdoICovCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBBbiByYmQgZm9ybWF0IDIgaW1hZ2UgaGFzIGEgdW5pcXVlIGlkZW50aWZpZXIsIGRpc3RpbmN0IGZyb20gdGhlCiAgKiBuYW1lIGdpdmVuIHRvIGl0IGJ5IHRoZSB1c2VyLiAgSW50ZXJuYWxseSwgdGhhdCBpZGVudGlmaWVyIGlzCiAgKiB3aGF0J3MgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lcyBvZiBvYmplY3RzIHJlbGF0ZWQgdG8gdGhlIGltYWdlLgpAQCAtNDc1Miw3ICs0OTA0LDcgQEAKIAogCQlpbWFnZV9pZCA9IGNlcGhfZXh0cmFjdF9lbmNvZGVkX3N0cmluZygmcCwgcCArIHJldCwKIAkJCQkJCU5VTEwsIEdGUF9OT0lPKTsKLQkJcmV0ID0gSVNfRVJSKGltYWdlX2lkKSA/IFBUUl9FUlIoaW1hZ2VfaWQpIDogMDsKKwkJcmV0ID0gUFRSX0VSUl9PUl9aRVJPKGltYWdlX2lkKTsKIAkJaWYgKCFyZXQpCiAJCQlyYmRfZGV2LT5pbWFnZV9mb3JtYXQgPSAyOwogCX0gZWxzZSB7CkBAIC00OTA3LDYgKzUwNTksNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX291dF9kaXNrOwogCXNldF9jYXBhY2l0eShyYmRfZGV2LT5kaXNrLCByYmRfZGV2LT5tYXBwaW5nLnNpemUgLyBTRUNUT1JfU0laRSk7CisJc2V0X2Rpc2tfcm8ocmJkX2Rldi0+ZGlzaywgcmJkX2Rldi0+bWFwcGluZy5yZWFkX29ubHkpOwogCiAJcmV0ID0gcmJkX2J1c19hZGRfZGV2KHJiZF9kZXYpOwogCWlmIChyZXQpCkBAIC01MDUzLDcgKzUyMDYsNiBAQAogCXN0cnVjdCByYmRfb3B0aW9ucyAqcmJkX29wdHMgPSBOVUxMOwogCXN0cnVjdCByYmRfc3BlYyAqc3BlYyA9IE5VTEw7CiAJc3RydWN0IHJiZF9jbGllbnQgKnJiZGM7Ci0Jc3RydWN0IGNlcGhfb3NkX2NsaWVudCAqb3NkYzsKIAlib29sIHJlYWRfb25seTsKIAlpbnQgcmMgPSAtRU5PTUVNOwogCkBAIC01MDc1LDggKzUyMjcsNyBAQAogCX0KIAogCS8qIHBpY2sgdGhlIHBvb2wgKi8KLQlvc2RjID0gJnJiZGMtPmNsaWVudC0+b3NkYzsKLQlyYyA9IGNlcGhfcGdfcG9vbGlkX2J5X25hbWUob3NkYy0+b3NkbWFwLCBzcGVjLT5wb29sX25hbWUpOworCXJjID0gcmJkX2FkZF9nZXRfcG9vbF9pZChyYmRjLCBzcGVjLT5wb29sX25hbWUpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZXJyX291dF9jbGllbnQ7CiAJc3BlYy0+cG9vbF9pZCA9ICh1NjQpcmM7CkBAIC01Mzg3LDYgKzU1MzgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcmJkX2V4aXQodm9pZCkKIHsKKwlpZGFfZGVzdHJveSgmcmJkX2Rldl9pZF9pZGEpOwogCXJiZF9zeXNmc19jbGVhbnVwKCk7CiAJaWYgKHNpbmdsZV9tYWpvcikKIAkJdW5yZWdpc3Rlcl9ibGtkZXYocmJkX21ham9yLCBSQkRfRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMKaW5kZXggYTgzYjU3ZS4uZjk4MzgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jCkBAIC0xOTMsOSArMTkzLDEwIEBACiAJc2VudCArPSAyMDsKIAljb3VudCAtPSAyMDsKIAorCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUodWRldiwgMHgwMik7CisKIAl3aGlsZSAoY291bnQpIHsKIAkJc2l6ZSA9IG1pbl90KHVpbnQsIGNvdW50LCBCVUxLX1NJWkUpOwotCQlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIDB4MDIpOwogCQltZW1jcHkoc2VuZF9idWYsIGZpcm13YXJlLT5kYXRhICsgc2VudCwgc2l6ZSk7CiAKIAkJZXJyID0gdXNiX2J1bGtfbXNnKHVkZXYsIHBpcGUsIHNlbmRfYnVmLCBzaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oCmluZGV4IDczOTkzMDNkLi5kYzc5Zjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZHJ2LmgKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oCkBAIC01OSw2ICs1OSw4IEBACiB9OwogCiBzdHJ1Y3QgYnRtcnZsX2FkYXB0ZXIgeworCXZvaWQgKmh3X3JlZ3NfYnVmOworCXU4ICpod19yZWdzOwogCXUzMiBpbnRfY291bnQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsKIAl1OCBwc21vZGU7CkBAIC0xNDAsNyArMTQyLDcgQEAKIGJvb2wgYnRtcnZsX2NoZWNrX2V2dHBrdChzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGJ0bXJ2bF9wcm9jZXNzX2V2ZW50KHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLWludCBidG1ydmxfc2VuZF9tb2R1bGVfY2ZnX2NtZChzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKnByaXYsIGludCBzdWJjbWQpOworaW50IGJ0bXJ2bF9zZW5kX21vZHVsZV9jZmdfY21kKHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdiwgdTggc3ViY21kKTsKIGludCBidG1ydmxfc2VuZF9oc2NmZ19jbWQoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2KTsKIGludCBidG1ydmxfZW5hYmxlX3BzKHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdik7CiBpbnQgYnRtcnZsX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMKaW5kZXggMmM0OTk3Yy4uZTlkYmRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogCiAjaW5jbHVkZSAiYnRtcnZsX2Rydi5oIgorI2luY2x1ZGUgImJ0bXJ2bF9zZGlvLmgiCiAKICNkZWZpbmUgVkVSU0lPTiAiMS4wIgogCkBAIC0yMDEsNyArMjAyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGJ0bXJ2bF9zZW5kX21vZHVsZV9jZmdfY21kKHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdiwgaW50IHN1YmNtZCkKK2ludCBidG1ydmxfc2VuZF9tb2R1bGVfY2ZnX2NtZChzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKnByaXYsIHU4IHN1YmNtZCkKIHsKIAlpbnQgcmV0OwogCkBAIC0zMzcsMTAgKzMzOCwyNSBAQAogCiBzdGF0aWMgdm9pZCBidG1ydmxfaW5pdF9hZGFwdGVyKHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdikKIHsKKwlpbnQgYnVmX3NpemU7CisKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5hZGFwdGVyLT50eF9xdWV1ZSk7CiAKIAlwcml2LT5hZGFwdGVyLT5wc19zdGF0ZSA9IFBTX0FXQUtFOwogCisJYnVmX3NpemUgPSBBTElHTl9TWihTRElPX0JMT0NLX1NJWkUsIEJUU0RJT19ETUFfQUxJR04pOworCXByaXYtPmFkYXB0ZXItPmh3X3JlZ3NfYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5hZGFwdGVyLT5od19yZWdzX2J1ZikgeworCQlwcml2LT5hZGFwdGVyLT5od19yZWdzID0gTlVMTDsKKwkJQlRfRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBod19yZWdzLiIpOworCX0gZWxzZSB7CisJCXByaXYtPmFkYXB0ZXItPmh3X3JlZ3MgPQorCQkJKHU4ICopQUxJR05fQUREUihwcml2LT5hZGFwdGVyLT5od19yZWdzX2J1ZiwKKwkJCQkJIEJUU0RJT19ETUFfQUxJR04pOworCQlCVF9EQkcoImh3X3JlZ3NfYnVmPSVwIGh3X3JlZ3M9JXAiLAorCQkgICAgICAgcHJpdi0+YWRhcHRlci0+aHdfcmVnc19idWYsIHByaXYtPmFkYXB0ZXItPmh3X3JlZ3MpOworCX0KKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmFkYXB0ZXItPmNtZF93YWl0X3EpOwogfQogCkBAIC0zNDgsNiArMzY0LDcgQEAKIHsKIAlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmFkYXB0ZXItPnR4X3F1ZXVlKTsKIAorCWtmcmVlKHByaXYtPmFkYXB0ZXItPmh3X3JlZ3NfYnVmKTsKIAlrZnJlZShwcml2LT5hZGFwdGVyKTsKIAogCXByaXYtPmFkYXB0ZXIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKaW5kZXggMWI1MmM5Zi4uOWRlZGNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCkBAIC02NCw2ICs2NCw3IEBACiAJLmlvX3BvcnRfMCA9IDB4MDAsCiAJLmlvX3BvcnRfMSA9IDB4MDEsCiAJLmlvX3BvcnRfMiA9IDB4MDIsCisJLmludF9yZWFkX3RvX2NsZWFyID0gZmFsc2UsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBidG1ydmxfc2Rpb19jYXJkX3JlZyBidG1ydmxfcmVnXzg3eHggPSB7CiAJLmNmZyA9IDB4MDAsCkBAIC04MCw2ICs4MSw3IEBACiAJLmlvX3BvcnRfMCA9IDB4NzgsCiAJLmlvX3BvcnRfMSA9IDB4NzksCiAJLmlvX3BvcnRfMiA9IDB4N2EsCisJLmludF9yZWFkX3RvX2NsZWFyID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmRfcmVnIGJ0bXJ2bF9yZWdfODh4eCA9IHsKQEAgLTk3LDYgKzk5LDkgQEAKIAkuaW9fcG9ydF8wID0gMHhkOCwKIAkuaW9fcG9ydF8xID0gMHhkOSwKIAkuaW9fcG9ydF8yID0gMHhkYSwKKwkuaW50X3JlYWRfdG9fY2xlYXIgPSB0cnVlLAorCS5ob3N0X2ludF9yc3IgPSAweDAxLAorCS5jYXJkX21pc2NfY2ZnID0gMHhjYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRtcnZsX3NkaW9fZGV2aWNlIGJ0bXJ2bF9zZGlvX3NkODY4OCA9IHsKQEAgLTY2Nyw2ICs2NzIsNTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBidG1ydmxfc2Rpb19yZWFkX3RvX2NsZWFyKHN0cnVjdCBidG1ydmxfc2Rpb19jYXJkICpjYXJkLCB1OCAqaXJlZykKK3sKKwlzdHJ1Y3QgYnRtcnZsX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjYXJkLT5wcml2LT5hZGFwdGVyOworCWludCByZXQ7CisKKwlyZXQgPSBzZGlvX3JlYWRzYihjYXJkLT5mdW5jLCBhZGFwdGVyLT5od19yZWdzLCAwLCBTRElPX0JMT0NLX1NJWkUpOworCWlmIChyZXQpIHsKKwkJQlRfRVJSKCJzZGlvX3JlYWRzYjogcmVhZCBpbnQgaHdfcmVncyBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqaXJlZyA9IGFkYXB0ZXItPmh3X3JlZ3NbY2FyZC0+cmVnLT5ob3N0X2ludHN0YXR1c107CisJQlRfREJHKCJod19yZWdzWyUjeF09JSN4IiwgY2FyZC0+cmVnLT5ob3N0X2ludHN0YXR1cywgKmlyZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRtcnZsX3NkaW9fd3JpdGVfdG9fY2xlYXIoc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmQgKmNhcmQsIHU4ICppcmVnKQoreworCWludCByZXQ7CisKKwkqaXJlZyA9IHNkaW9fcmVhZGIoY2FyZC0+ZnVuYywgY2FyZC0+cmVnLT5ob3N0X2ludHN0YXR1cywgJnJldCk7CisJaWYgKHJldCkgeworCQlCVF9FUlIoInNkaW9fcmVhZGI6IHJlYWQgaW50IHN0YXR1cyBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKmlyZWcpIHsKKwkJLyoKKwkJICogRE5fTERfSE9TVF9JTlRfU1RBVFVTIGFuZC9vciBVUF9MRF9IT1NUX0lOVF9TVEFUVVMKKwkJICogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJlLWVuYWJsZSB0aGUKKwkJICogaW50ZXJydXB0LgorCQkgKi8KKwkJQlRfREJHKCJpbnRfc3RhdHVzID0gMHgleCIsICppcmVnKTsKKworCQlzZGlvX3dyaXRlYihjYXJkLT5mdW5jLCB+KCppcmVnKSAmIChETl9MRF9IT1NUX0lOVF9TVEFUVVMgfAorCQkJCQkJICAgIFVQX0xEX0hPU1RfSU5UX1NUQVRVUyksCisJCQkgICAgY2FyZC0+cmVnLT5ob3N0X2ludHN0YXR1cywgJnJldCk7CisJCWlmIChyZXQpIHsKKwkJCUJUX0VSUigic2Rpb193cml0ZWI6IGNsZWFyIGludCBzdGF0dXMgZmFpbGVkOiAlZCIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGJ0bXJ2bF9zZGlvX2ludGVycnVwdChzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogewogCXN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdjsKQEAgLTY4NCwyOCArNzM2LDEzIEBACiAKIAlwcml2ID0gY2FyZC0+cHJpdjsKIAotCWlyZWcgPSBzZGlvX3JlYWRiKGNhcmQtPmZ1bmMsIGNhcmQtPnJlZy0+aG9zdF9pbnRzdGF0dXMsICZyZXQpOwotCWlmIChyZXQpIHsKLQkJQlRfRVJSKCJzZGlvX3JlYWRiOiByZWFkIGludCBzdGF0dXMgcmVnaXN0ZXIgZmFpbGVkIik7CisJaWYgKGNhcmQtPnJlZy0+aW50X3JlYWRfdG9fY2xlYXIpCisJCXJldCA9IGJ0bXJ2bF9zZGlvX3JlYWRfdG9fY2xlYXIoY2FyZCwgJmlyZWcpOworCWVsc2UKKwkJcmV0ID0gYnRtcnZsX3NkaW9fd3JpdGVfdG9fY2xlYXIoY2FyZCwgJmlyZWcpOworCisJaWYgKHJldCkKIAkJcmV0dXJuOwotCX0KLQotCWlmIChpcmVnICE9IDApIHsKLQkJLyoKLQkJICogRE5fTERfSE9TVF9JTlRfU1RBVFVTIGFuZC9vciBVUF9MRF9IT1NUX0lOVF9TVEFUVVMKLQkJICogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJlLWVuYWJsZSB0aGUKLQkJICogaW50ZXJydXB0LgotCQkgKi8KLQkJQlRfREJHKCJpcmVnID0gMHgleCIsIGlyZWcpOwotCi0JCXNkaW9fd3JpdGViKGNhcmQtPmZ1bmMsIH4oaXJlZykgJiAoRE5fTERfSE9TVF9JTlRfU1RBVFVTIHwKLQkJCQkJVVBfTERfSE9TVF9JTlRfU1RBVFVTKSwKLQkJCQljYXJkLT5yZWctPmhvc3RfaW50c3RhdHVzLCAmcmV0KTsKLQkJaWYgKHJldCkgewotCQkJQlRfRVJSKCJzZGlvX3dyaXRlYjogY2xlYXIgaW50IHN0YXR1cyByZWdpc3RlciBmYWlsZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCXNkaW9faXJlZyB8PSBpcmVnOwpAQCAtNzc3LDYgKzgxNCwzMCBAQAogCiAJQlRfREJHKCJTRElPIEZVTkMlZCBJTyBwb3J0OiAweCV4IiwgZnVuYy0+bnVtLCBjYXJkLT5pb3BvcnQpOwogCisJaWYgKGNhcmQtPnJlZy0+aW50X3JlYWRfdG9fY2xlYXIpIHsKKwkJcmVnID0gc2Rpb19yZWFkYihmdW5jLCBjYXJkLT5yZWctPmhvc3RfaW50X3JzciwgJnJldCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byByZWxlYXNlX2lycTsKKwkJfQorCQlzZGlvX3dyaXRlYihmdW5jLCByZWcgfCAweDNmLCBjYXJkLT5yZWctPmhvc3RfaW50X3JzciwgJnJldCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byByZWxlYXNlX2lycTsKKwkJfQorCisJCXJlZyA9IHNkaW9fcmVhZGIoZnVuYywgY2FyZC0+cmVnLT5jYXJkX21pc2NfY2ZnLCAmcmV0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIHJlbGVhc2VfaXJxOworCQl9CisJCXNkaW9fd3JpdGViKGZ1bmMsIHJlZyB8IDB4MTAsIGNhcmQtPnJlZy0+Y2FyZF9taXNjX2NmZywgJnJldCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byByZWxlYXNlX2lycTsKKwkJfQorCX0KKwogCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgY2FyZCk7CiAKIAlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmggYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5oCmluZGV4IDQzZDM1YTYuLmQ0ZGQzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmgKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uaApAQCAtNzgsNiArNzgsOSBAQAogCXU4IGlvX3BvcnRfMDsKIAl1OCBpb19wb3J0XzE7CiAJdTggaW9fcG9ydF8yOworCWJvb2wgaW50X3JlYWRfdG9fY2xlYXI7CisJdTggaG9zdF9pbnRfcnNyOworCXU4IGNhcmRfbWlzY19jZmc7CiB9OwogCiBzdHJ1Y3QgYnRtcnZsX3NkaW9fY2FyZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwppbmRleCBhN2RmYmY5Li5hMWM4MGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNkZWZpbmUgQlRVU0JfV1JPTkdfU0NPX01UVQkweDQwCiAjZGVmaW5lIEJUVVNCX0FUSDMwMTIJCTB4ODAKICNkZWZpbmUgQlRVU0JfSU5URUwJCTB4MTAwCisjZGVmaW5lIEJUVVNCX0JDTV9QQVRDSFJBTQkweDIwMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgYnR1c2JfdGFibGVbXSA9IHsKIAkvKiBHZW5lcmljIEJsdWV0b290aCBVU0IgZGV2aWNlICovCkBAIC0xMTEsNyArMTEyLDggQEAKIAl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDQ4OSwgMHhmZiwgMHgwMSwgMHgwMSkgfSwKIAogCS8qIEJyb2FkY29tIGRldmljZXMgd2l0aCB2ZW5kb3Igc3BlY2lmaWMgaWQgKi8KLQl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MGE1YywgMHhmZiwgMHgwMSwgMHgwMSkgfSwKKwl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MGE1YywgMHhmZiwgMHgwMSwgMHgwMSksCisJICAuZHJpdmVyX2luZm8gPSBCVFVTQl9CQ01fUEFUQ0hSQU0gfSwKIAogCS8qIEJlbGtpbiBGODA2NWJmIC0gQnJvYWRjb20gYmFzZWQgKi8KIAl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDUwZCwgMHhmZiwgMHgwMSwgMHgwMSkgfSwKQEAgLTEzODEsNiArMTM4MywxNTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBidHVzYl9zZXR1cF9iY21fcGF0Y2hyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkYXRhLT51ZGV2OworCWNoYXIgZndfbmFtZVs2NF07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCB1OCAqZndfcHRyOworCXNpemVfdCBmd19zaXplOworCWNvbnN0IHN0cnVjdCBoY2lfY29tbWFuZF9oZHIgKmNtZDsKKwljb25zdCB1OCAqY21kX3BhcmFtOworCXUxNiBvcGNvZGU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiAqdmVyOworCWxvbmcgcmV0OworCisJc25wcmludGYoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAiYnJjbS8lcy0lMDR4LSUwNHguaGNkIiwKKwkJIHVkZXYtPnByb2R1Y3QgPyB1ZGV2LT5wcm9kdWN0IDogIkJDTSIsCisJCSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgJmhkZXYtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJQlRfSU5GTygiJXM6IEJDTTogcGF0Y2ggJXMgbm90IGZvdW5kIiwgaGRldi0+bmFtZSwKKwkJCWZ3X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZXNldCAqLworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRVNFVCwgMCwgTlVMTCwgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCXJldCA9IFBUUl9FUlIoc2tiKTsKKwkJQlRfRVJSKCIlczogSENJX09QX1JFU0VUIGZhaWxlZCAoJWxkKSIsIGhkZXYtPm5hbWUsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBSZWFkIExvY2FsIFZlcnNpb24gSW5mbyAqLworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04sIDAsIE5VTEwsCisJCQkgICAgIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNrYik7CisJCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04gZmFpbGVkICglbGQpIiwKKwkJCWhkZXYtPm5hbWUsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc2tiLT5sZW4gIT0gc2l6ZW9mKCp2ZXIpKSB7CisJCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04gZXZlbnQgbGVuZ3RoIG1pc21hdGNoIiwKKwkJCWhkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCXZlciA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiAqKSBza2ItPmRhdGE7CisJQlRfSU5GTygiJXM6IEJDTTogcGF0Y2hpbmcgaGNpX3Zlcj0lMDJ4IGhjaV9yZXY9JTA0eCBsbXBfdmVyPSUwMnggIgorCQkibG1wX3N1YnZlcj0lMDR4IiwgaGRldi0+bmFtZSwgdmVyLT5oY2lfdmVyLCB2ZXItPmhjaV9yZXYsCisJCXZlci0+bG1wX3ZlciwgdmVyLT5sbXBfc3VidmVyKTsKKwlrZnJlZV9za2Ioc2tiKTsKKworCS8qIFN0YXJ0IERvd25sb2FkICovCisJc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgMHhmYzJlLCAwLCBOVUxMLCBIQ0lfSU5JVF9USU1FT1VUKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcmV0ID0gUFRSX0VSUihza2IpOworCQlCVF9FUlIoIiVzOiBCQ006IERvd25sb2FkIE1pbmlkcnYgY29tbWFuZCBmYWlsZWQgKCVsZCkiLAorCQkJaGRldi0+bmFtZSwgcmV0KTsKKwkJZ290byByZXNldF9mdzsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwkvKiA1MCBtc2VjIGRlbGF5IGFmdGVyIERvd25sb2FkIE1pbmlkcnYgY29tcGxldGVzICovCisJbXNsZWVwKDUwKTsKKworCWZ3X3B0ciA9IGZ3LT5kYXRhOworCWZ3X3NpemUgPSBmdy0+c2l6ZTsKKworCXdoaWxlIChmd19zaXplID49IHNpemVvZigqY21kKSkgeworCQljbWQgPSAoc3RydWN0IGhjaV9jb21tYW5kX2hkciAqKSBmd19wdHI7CisJCWZ3X3B0ciArPSBzaXplb2YoKmNtZCk7CisJCWZ3X3NpemUgLT0gc2l6ZW9mKCpjbWQpOworCisJCWlmIChmd19zaXplIDwgY21kLT5wbGVuKSB7CisJCQlCVF9FUlIoIiVzOiBCQ006IHBhdGNoICVzIGlzIGNvcnJ1cHRlZCIsCisJCQkJaGRldi0+bmFtZSwgZndfbmFtZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byByZXNldF9mdzsKKwkJfQorCisJCWNtZF9wYXJhbSA9IGZ3X3B0cjsKKwkJZndfcHRyICs9IGNtZC0+cGxlbjsKKwkJZndfc2l6ZSAtPSBjbWQtPnBsZW47CisKKwkJb3Bjb2RlID0gbGUxNl90b19jcHUoY21kLT5vcGNvZGUpOworCisJCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIG9wY29kZSwgY21kLT5wbGVuLCBjbWRfcGFyYW0sCisJCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKKwkJaWYgKElTX0VSUihza2IpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHNrYik7CisJCQlCVF9FUlIoIiVzOiBCQ006IHBhdGNoIGNvbW1hbmQgJTA0eCBmYWlsZWQgKCVsZCkiLAorCQkJCWhkZXYtPm5hbWUsIG9wY29kZSwgcmV0KTsKKwkJCWdvdG8gcmVzZXRfZnc7CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJLyogMjUwIG1zZWMgZGVsYXkgYWZ0ZXIgTGF1bmNoIFJhbSBjb21wbGV0ZXMgKi8KKwltc2xlZXAoMjUwKTsKKworcmVzZXRfZnc6CisJLyogUmVzZXQgKi8KKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVTRVQsIDAsIE5VTEwsIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNrYik7CisJCUJUX0VSUigiJXM6IEhDSV9PUF9SRVNFVCBmYWlsZWQgKCVsZCkiLCBoZGV2LT5uYW1lLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCWtmcmVlX3NrYihza2IpOworCisJLyogUmVhZCBMb2NhbCBWZXJzaW9uIEluZm8gKi8KKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OLCAwLCBOVUxMLAorCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcmV0ID0gUFRSX0VSUihza2IpOworCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OIGZhaWxlZCAoJWxkKSIsCisJCQloZGV2LT5uYW1lLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHNrYi0+bGVuICE9IHNpemVvZigqdmVyKSkgeworCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OIGV2ZW50IGxlbmd0aCBtaXNtYXRjaCIsCisJCQloZGV2LT5uYW1lKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwl2ZXIgPSAoc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX3ZlcnNpb24gKikgc2tiLT5kYXRhOworCUJUX0lORk8oIiVzOiBCQ006IGZpcm13YXJlIGhjaV92ZXI9JTAyeCBoY2lfcmV2PSUwNHggbG1wX3Zlcj0lMDJ4ICIKKwkJImxtcF9zdWJ2ZXI9JTA0eCIsIGhkZXYtPm5hbWUsIHZlci0+aGNpX3ZlciwgdmVyLT5oY2lfcmV2LAorCQl2ZXItPmxtcF92ZXIsIHZlci0+bG1wX3N1YnZlcik7CisJa2ZyZWVfc2tiKHNrYik7CisKK2RvbmU6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGJ0dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKQEAgLTE0ODYsNiArMTYzNiw5IEBACiAJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0JDTTkyMDM1KQogCQloZGV2LT5zZXR1cCA9IGJ0dXNiX3NldHVwX2JjbTkyMDM1OwogCisJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0JDTV9QQVRDSFJBTSkKKwkJaGRldi0+c2V0dXAgPSBidHVzYl9zZXR1cF9iY21fcGF0Y2hyYW07CisKIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfSU5URUwpCiAJCWhkZXYtPnNldHVwID0gYnR1c2Jfc2V0dXBfaW50ZWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKaW5kZXggNzA0OGE1OC4uNjZkYjlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKQEAgLTU1LDEzICs1NSw2IEBACiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CiB9OwogCi0vKiBINCByZWNlaXZlciBTdGF0ZXMgKi8KLSNkZWZpbmUgSDRfVzRfUEFDS0VUX1RZUEUJMAotI2RlZmluZSBINF9XNF9FVkVOVF9IRFIJCTEKLSNkZWZpbmUgSDRfVzRfQUNMX0hEUgkJMgotI2RlZmluZSBINF9XNF9TQ09fSERSCQkzCi0jZGVmaW5lIEg0X1c0X0RBVEEJCTQKLQogLyogSW5pdGlhbGl6ZSBwcm90b2NvbCAqLwogc3RhdGljIGludCBoNF9vcGVuKHN0cnVjdCBoY2lfdWFydCAqaHUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmF3LmMgYi9kcml2ZXJzL2NoYXIvcmF3LmMKaW5kZXggNmU4ZDY1ZS4uMDEwMmRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jhdy5jCisrKyBiL2RyaXZlcnMvY2hhci9yYXcuYwpAQCAtMjg0LDEwICsyODQsMTAgQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXdfZm9wcyA9IHsKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBibGtkZXZfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gYmxrZGV2X3dyaXRlX2l0ZXIsCiAJLmZzeW5jCQk9IGJsa2Rldl9mc3luYywKIAkub3BlbgkJPSByYXdfb3BlbiwKIAkucmVsZWFzZQk9IHJhd19yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdGkvY2xrLTQzeHguYyBiL2RyaXZlcnMvY2xrL3RpL2Nsay00M3h4LmMKaW5kZXggNTI3YTQzZC4uMzc5NWZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvdGkvY2xrLTQzeHguYworKysgYi9kcml2ZXJzL2Nsay90aS9jbGstNDN4eC5jCkBAIC0xMTYsOSArMTE2LDI1IEBACiAKIGludCBfX2luaXQgYW00M3h4X2R0X2Nsa19pbml0KHZvaWQpCiB7CisJc3RydWN0IGNsayAqY2xrMSwgKmNsazI7CisKIAl0aV9kdF9jbG9ja3NfcmVnaXN0ZXIoYW00M3h4X2Nsa3MpOwogCiAJb21hcDJfY2xrX2Rpc2FibGVfYXV0b2lkbGVfYWxsKCk7CiAKKwkvKgorCSAqIGNwc3dfY3B0c19yZnRfY2xrICBoYXMgZ290IHRoZSBjaG9pY2Ugb2YgMyBjbG9ja3NvdXJjZXMKKwkgKiBkcGxsX2NvcmVfbTRfY2ssIGRwbGxfY29yZV9tNV9jayBhbmQgZHBsbF9kaXNwX20yX2NrLgorCSAqIEJ5IGRlZmF1bHQgZHBsbF9jb3JlX200X2NrIGlzIHNlbGVjdGVkLCB3aXRuIHRoaXMgYXMgY2xvY2sKKwkgKiBzb3VyY2UgdGhlIENQVFMgZG9lc25vdCB3b3JrIHByb3Blcmx5LiBJdCBnaXZlcyBjbG9ja2NoZWNrIGVycm9ycworCSAqIHdoaWxlIHJ1bm5pbmcgUFRQLgorCSAqIGNsb2NrY2hlY2s6IGNsb2NrIGp1bXBlZCBiYWNrd2FyZCBvciBydW5uaW5nIHNsb3dlciB0aGFuIGV4cGVjdGVkIQorCSAqIEJ5IHNlbGVjdGluZyBkcGxsX2NvcmVfbTVfY2sgYXMgdGhlIGNsb2Nrc291cmNlIGZpeGVzIHRoaXMgaXNzdWUuCisJICogSW4gQU0zMzV4IGRwbGxfY29yZV9tNV9jayBpcyB0aGUgZGVmYXVsdCBjbG9ja3NvdXJjZS4KKwkgKi8KKwljbGsxID0gY2xrX2dldF9zeXMoTlVMTCwgImNwc3dfY3B0c19yZnRfY2xrIik7CisJY2xrMiA9IGNsa19nZXRfc3lzKE5VTEwsICJkcGxsX2NvcmVfbTVfY2siKTsKKwljbGtfc2V0X3BhcmVudChjbGsxLCBjbGsyKTsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwppbmRleCAxZmJlMTFmLi5lNDczZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwpAQCAtMTg1LDcgKzE4NSw3IEBACiAKIGNvbmZpZyBHRU5FUklDX0NQVUZSRVFfQ1BVMAogCXRyaXN0YXRlICJHZW5lcmljIENQVTAgY3B1ZnJlcSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBIQVZFX0NMSyAmJiBSRUdVTEFUT1IgJiYgT0YgJiYgVEhFUk1BTCAmJiBDUFVfVEhFUk1BTAorCWRlcGVuZHMgb24gSEFWRV9DTEsgJiYgT0YKIAlzZWxlY3QgUE1fT1BQCiAJaGVscAogCSAgVGhpcyBhZGRzIGEgZ2VuZXJpYyBjcHVmcmVxIGRyaXZlciBmb3IgQ1BVMCBmcmVxdWVuY3kgbWFuYWdlbWVudC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybSBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybQppbmRleCAzNmQyMGQwLi5lYmFjNjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5hcm0KKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtCkBAIC01LDggKzUsNyBAQAogIyBiaWcgTElUVExFIGNvcmUgbGF5ZXIgYW5kIGdsdWUgZHJpdmVycwogY29uZmlnIEFSTV9CSUdfTElUVExFX0NQVUZSRVEKIAl0cmlzdGF0ZSAiR2VuZXJpYyBBUk0gYmlnIExJVFRMRSBDUFVmcmVxIGRyaXZlciIKLQlkZXBlbmRzIG9uIChCSUdfTElUVExFICYmIEFSTV9DUFVfVE9QT0xPR1kpIHx8IChBUk02NCAmJiBTTVApCi0JZGVwZW5kcyBvbiBIQVZFX0NMSworCWRlcGVuZHMgb24gQVJNICYmIEJJR19MSVRUTEUgJiYgQVJNX0NQVV9UT1BPTE9HWSAmJiBIQVZFX0NMSwogCXNlbGVjdCBQTV9PUFAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIEdlbmVyaWMgQ1BVZnJlcSBkcml2ZXIgZm9yIEFSTSBiaWcuTElUVExFIHBsYXRmb3Jtcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWNwdTAuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWNwdTAuYwppbmRleCAwOWI5MTI5Li5lZTFhZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1jcHUwLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtY3B1MC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjcHUwX2NwdWZyZXFfZHJpdmVyID0gewotCS5mbGFncyA9IENQVUZSRVFfU1RJQ0tZLAorCS5mbGFncyA9IENQVUZSRVFfU1RJQ0tZIHwgQ1BVRlJFUV9ORUVEX0lOSVRJQUxfRlJFUV9DSEVDSywKIAkudmVyaWZ5ID0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCiAJLnRhcmdldF9pbmRleCA9IGNwdTBfc2V0X3RhcmdldCwKIAkuZ2V0ID0gY3B1ZnJlcV9nZW5lcmljX2dldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGFlMTFkZDUuLmFlZDJiMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtMTgxNiwyMCArMTgxNiw1NSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT1ZFUk5PUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyogTXVzdCBzZXQgZnJlcXMtPm5ldyB0byBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5ICovCitzdGF0aWMgaW50IF9fdGFyZ2V0X2ludGVybWVkaWF0ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgc3RydWN0IGNwdWZyZXFfZnJlcXMgKmZyZXFzLCBpbnQgaW5kZXgpCit7CisJaW50IHJldDsKKworCWZyZXFzLT5uZXcgPSBjcHVmcmVxX2RyaXZlci0+Z2V0X2ludGVybWVkaWF0ZShwb2xpY3ksIGluZGV4KTsKKworCS8qIFdlIGRvbid0IG5lZWQgdG8gc3dpdGNoIHRvIGludGVybWVkaWF0ZSBmcmVxICovCisJaWYgKCFmcmVxcy0+bmV3KQorCQlyZXR1cm4gMDsKKworCXByX2RlYnVnKCIlczogY3B1OiAlZCwgc3dpdGNoaW5nIHRvIGludGVybWVkaWF0ZSBmcmVxOiBvbGRmcmVxOiAldSwgaW50ZXJtZWRpYXRlIGZyZXE6ICV1XG4iLAorCQkgX19mdW5jX18sIHBvbGljeS0+Y3B1LCBmcmVxcy0+b2xkLCBmcmVxcy0+bmV3KTsKKworCWNwdWZyZXFfZnJlcV90cmFuc2l0aW9uX2JlZ2luKHBvbGljeSwgZnJlcXMpOworCXJldCA9IGNwdWZyZXFfZHJpdmVyLT50YXJnZXRfaW50ZXJtZWRpYXRlKHBvbGljeSwgaW5kZXgpOworCWNwdWZyZXFfZnJlcV90cmFuc2l0aW9uX2VuZChwb2xpY3ksIGZyZXFzLCByZXQpOworCisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNoYW5nZSB0byBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5OiAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBfX3RhcmdldF9pbmRleChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLCBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXMgPSB7Lm9sZCA9IHBvbGljeS0+Y3VyLCAuZmxhZ3MgPSAwfTsKKwl1bnNpZ25lZCBpbnQgaW50ZXJtZWRpYXRlX2ZyZXEgPSAwOwogCWludCByZXR2YWwgPSAtRUlOVkFMOwogCWJvb2wgbm90aWZ5OwogCiAJbm90aWZ5ID0gIShjcHVmcmVxX2RyaXZlci0+ZmxhZ3MgJiBDUFVGUkVRX0FTWU5DX05PVElGSUNBVElPTik7Ci0KIAlpZiAobm90aWZ5KSB7Ci0JCWZyZXFzLm9sZCA9IHBvbGljeS0+Y3VyOwotCQlmcmVxcy5uZXcgPSBmcmVxX3RhYmxlW2luZGV4XS5mcmVxdWVuY3k7Ci0JCWZyZXFzLmZsYWdzID0gMDsKKwkJLyogSGFuZGxlIHN3aXRjaGluZyB0byBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5ICovCisJCWlmIChjcHVmcmVxX2RyaXZlci0+Z2V0X2ludGVybWVkaWF0ZSkgeworCQkJcmV0dmFsID0gX190YXJnZXRfaW50ZXJtZWRpYXRlKHBvbGljeSwgJmZyZXFzLCBpbmRleCk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CiAKKwkJCWludGVybWVkaWF0ZV9mcmVxID0gZnJlcXMubmV3OworCQkJLyogU2V0IG9sZCBmcmVxIHRvIGludGVybWVkaWF0ZSAqLworCQkJaWYgKGludGVybWVkaWF0ZV9mcmVxKQorCQkJCWZyZXFzLm9sZCA9IGZyZXFzLm5ldzsKKwkJfQorCisJCWZyZXFzLm5ldyA9IGZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKIAkJcHJfZGVidWcoIiVzOiBjcHU6ICVkLCBvbGRmcmVxOiAldSwgbmV3IGZyZXE6ICV1XG4iLAogCQkJIF9fZnVuY19fLCBwb2xpY3ktPmNwdSwgZnJlcXMub2xkLCBmcmVxcy5uZXcpOwogCkBAIC0xODQxLDkgKzE4NzYsMjMgQEAKIAkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNoYW5nZSBjcHUgZnJlcXVlbmN5OiAlZFxuIiwgX19mdW5jX18sCiAJCSAgICAgICByZXR2YWwpOwogCi0JaWYgKG5vdGlmeSkKKwlpZiAobm90aWZ5KSB7CiAJCWNwdWZyZXFfZnJlcV90cmFuc2l0aW9uX2VuZChwb2xpY3ksICZmcmVxcywgcmV0dmFsKTsKIAorCQkvKgorCQkgKiBGYWlsZWQgYWZ0ZXIgc2V0dGluZyB0byBpbnRlcm1lZGlhdGUgZnJlcT8gRHJpdmVyIHNob3VsZCBoYXZlCisJCSAqIHJldmVydGVkIGJhY2sgdG8gaW5pdGlhbCBmcmVxdWVuY3kgYW5kIHNvIHNob3VsZCB3ZS4gQ2hlY2sKKwkJICogaGVyZSBmb3IgaW50ZXJtZWRpYXRlX2ZyZXEgaW5zdGVhZCBvZiBnZXRfaW50ZXJtZWRpYXRlLCBpbgorCQkgKiBjYXNlIHdlIGhhdmUndCBzd2l0Y2hlZCB0byBpbnRlcm1lZGlhdGUgZnJlcSBhdCBhbGwuCisJCSAqLworCQlpZiAodW5saWtlbHkocmV0dmFsICYmIGludGVybWVkaWF0ZV9mcmVxKSkgeworCQkJZnJlcXMub2xkID0gaW50ZXJtZWRpYXRlX2ZyZXE7CisJCQlmcmVxcy5uZXcgPSBwb2xpY3ktPnJlc3RvcmVfZnJlcTsKKwkJCWNwdWZyZXFfZnJlcV90cmFuc2l0aW9uX2JlZ2luKHBvbGljeSwgJmZyZXFzKTsKKwkJCWNwdWZyZXFfZnJlcV90cmFuc2l0aW9uX2VuZChwb2xpY3ksICZmcmVxcywgMCk7CisJCX0KKwl9CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xODc1LDYgKzE5MjQsOSBAQAogCWlmICh0YXJnZXRfZnJlcSA9PSBwb2xpY3ktPmN1cikKIAkJcmV0dXJuIDA7CiAKKwkvKiBTYXZlIGxhc3QgdmFsdWUgdG8gcmVzdG9yZSBsYXRlciBvbiBlcnJvcnMgKi8KKwlwb2xpY3ktPnJlc3RvcmVfZnJlcSA9IHBvbGljeS0+Y3VyOworCiAJaWYgKGNwdWZyZXFfZHJpdmVyLT50YXJnZXQpCiAJCXJldHZhbCA9IGNwdWZyZXFfZHJpdmVyLT50YXJnZXQocG9saWN5LCB0YXJnZXRfZnJlcSwgcmVsYXRpb24pOwogCWVsc2UgaWYgKGNwdWZyZXFfZHJpdmVyLT50YXJnZXRfaW5kZXgpIHsKQEAgLTIzNjEsNyArMjQxMyw4IEBACiAJICAgICEoZHJpdmVyX2RhdGEtPnNldHBvbGljeSB8fCBkcml2ZXJfZGF0YS0+dGFyZ2V0X2luZGV4IHx8CiAJCSAgICBkcml2ZXJfZGF0YS0+dGFyZ2V0KSB8fAogCSAgICAgKGRyaXZlcl9kYXRhLT5zZXRwb2xpY3kgJiYgKGRyaXZlcl9kYXRhLT50YXJnZXRfaW5kZXggfHwKLQkJICAgIGRyaXZlcl9kYXRhLT50YXJnZXQpKSkKKwkJICAgIGRyaXZlcl9kYXRhLT50YXJnZXQpKSB8fAorCSAgICAgKCEhZHJpdmVyX2RhdGEtPmdldF9pbnRlcm1lZGlhdGUgIT0gISFkcml2ZXJfZGF0YS0+dGFyZ2V0X2ludGVybWVkaWF0ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoInRyeWluZyB0byByZWdpc3RlciBkcml2ZXIgJXNcbiIsIGRyaXZlcl9kYXRhLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9nb3Zlcm5vci5jCmluZGV4IGUxYzY0MzMuLjFiNDQ0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfZ292ZXJub3IuYwpAQCAtMzYsMTQgKzM2LDI5IEBACiAJc3RydWN0IG9kX2Ric190dW5lcnMgKm9kX3R1bmVycyA9IGRic19kYXRhLT50dW5lcnM7CiAJc3RydWN0IGNzX2Ric190dW5lcnMgKmNzX3R1bmVycyA9IGRic19kYXRhLT50dW5lcnM7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CisJdW5zaWduZWQgaW50IHNhbXBsaW5nX3JhdGU7CiAJdW5zaWduZWQgaW50IG1heF9sb2FkID0gMDsKIAl1bnNpZ25lZCBpbnQgaWdub3JlX25pY2U7CiAJdW5zaWduZWQgaW50IGo7CiAKLQlpZiAoZGJzX2RhdGEtPmNkYXRhLT5nb3Zlcm5vciA9PSBHT1ZfT05ERU1BTkQpCisJaWYgKGRic19kYXRhLT5jZGF0YS0+Z292ZXJub3IgPT0gR09WX09OREVNQU5EKSB7CisJCXN0cnVjdCBvZF9jcHVfZGJzX2luZm9fcyAqb2RfZGJzX2luZm8gPQorCQkJCWRic19kYXRhLT5jZGF0YS0+Z2V0X2NwdV9kYnNfaW5mb19zKGNwdSk7CisKKwkJLyoKKwkJICogU29tZXRpbWVzLCB0aGUgb25kZW1hbmQgZ292ZXJub3IgdXNlcyBhbiBhZGRpdGlvbmFsCisJCSAqIG11bHRpcGxpZXIgdG8gZ2l2ZSBsb25nIGRlbGF5cy4gU28gYXBwbHkgdGhpcyBtdWx0aXBsaWVyIHRvCisJCSAqIHRoZSAnc2FtcGxpbmdfcmF0ZScsIHNvIGFzIHRvIGtlZXAgdGhlIHdha2UtdXAtZnJvbS1pZGxlCisJCSAqIGRldGVjdGlvbiBsb2dpYyBhIGJpdCBjb25zZXJ2YXRpdmUuCisJCSAqLworCQlzYW1wbGluZ19yYXRlID0gb2RfdHVuZXJzLT5zYW1wbGluZ19yYXRlOworCQlzYW1wbGluZ19yYXRlICo9IG9kX2Ric19pbmZvLT5yYXRlX211bHQ7CisKIAkJaWdub3JlX25pY2UgPSBvZF90dW5lcnMtPmlnbm9yZV9uaWNlX2xvYWQ7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXNhbXBsaW5nX3JhdGUgPSBjc190dW5lcnMtPnNhbXBsaW5nX3JhdGU7CiAJCWlnbm9yZV9uaWNlID0gY3NfdHVuZXJzLT5pZ25vcmVfbmljZV9sb2FkOworCX0KIAogCXBvbGljeSA9IGNkYnMtPmN1cl9wb2xpY3k7CiAKQEAgLTk2LDcgKzExMSw0NiBAQAogCQlpZiAodW5saWtlbHkoIXdhbGxfdGltZSB8fCB3YWxsX3RpbWUgPCBpZGxlX3RpbWUpKQogCQkJY29udGludWU7CiAKLQkJbG9hZCA9IDEwMCAqICh3YWxsX3RpbWUgLSBpZGxlX3RpbWUpIC8gd2FsbF90aW1lOworCQkvKgorCQkgKiBJZiB0aGUgQ1BVIGhhZCBnb25lIGNvbXBsZXRlbHkgaWRsZSwgYW5kIGEgdGFzayBqdXN0IHdva2UgdXAKKwkJICogb24gdGhpcyBDUFUgbm93LCBpdCB3b3VsZCBiZSB1bmZhaXIgdG8gY2FsY3VsYXRlICdsb2FkJyB0aGUKKwkJICogdXN1YWwgd2F5IGZvciB0aGlzIGVsYXBzZWQgdGltZS13aW5kb3csIGJlY2F1c2UgaXQgd2lsbCBzaG93CisJCSAqIG5lYXItemVybyBsb2FkLCBpcnJlc3BlY3RpdmUgb2YgaG93IENQVSBpbnRlbnNpdmUgdGhhdCB0YXNrCisJCSAqIGFjdHVhbGx5IGlzLiBUaGlzIGlzIHVuZGVzaXJhYmxlIGZvciBsYXRlbmN5LXNlbnNpdGl2ZSBidXJzdHkKKwkJICogd29ya2xvYWRzLgorCQkgKgorCQkgKiBUbyBhdm9pZCB0aGlzLCB3ZSByZXVzZSB0aGUgJ2xvYWQnIGZyb20gdGhlIHByZXZpb3VzCisJCSAqIHRpbWUtd2luZG93IGFuZCBnaXZlIHRoaXMgdGFzayBhIGNoYW5jZSB0byBzdGFydCB3aXRoIGEKKwkJICogcmVhc29uYWJseSBoaWdoIENQVSBmcmVxdWVuY3kuIChIb3dldmVyLCB3ZSBzaG91bGRuJ3Qgb3Zlci1kbworCQkgKiB0aGlzIGNvcHksIGxlc3Qgd2UgZ2V0IHN0dWNrIGF0IGEgaGlnaCBsb2FkIChoaWdoIGZyZXF1ZW5jeSkKKwkJICogZm9yIHRvbyBsb25nLCBldmVuIHdoZW4gdGhlIGN1cnJlbnQgc3lzdGVtIGxvYWQgaGFzIGFjdHVhbGx5CisJCSAqIGRyb3BwZWQgZG93bi4gU28gd2UgcGVyZm9ybSB0aGUgY29weSBvbmx5IG9uY2UsIHVwb24gdGhlCisJCSAqIGZpcnN0IHdha2UtdXAgZnJvbSBpZGxlLikKKwkJICoKKwkJICogRGV0ZWN0aW5nIHRoaXMgc2l0dWF0aW9uIGlzIGVhc3k6IHRoZSBnb3Zlcm5vcidzIGRlZmVycmFibGUKKwkJICogdGltZXIgd291bGQgbm90IGhhdmUgZmlyZWQgZHVyaW5nIENQVS1pZGxlIHBlcmlvZHMuIEhlbmNlCisJCSAqIGFuIHVudXN1YWxseSBsYXJnZSAnd2FsbF90aW1lJyAoYXMgY29tcGFyZWQgdG8gdGhlIHNhbXBsaW5nCisJCSAqIHJhdGUpIGluZGljYXRlcyB0aGlzIHNjZW5hcmlvLgorCQkgKgorCQkgKiBwcmV2X2xvYWQgY2FuIGJlIHplcm8gaW4gdHdvIGNhc2VzIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIGl0CisJCSAqIGZvciBib3RoIGNhc2VzOgorCQkgKiAtIGR1cmluZyBsb25nIGlkbGUgaW50ZXJ2YWxzCisJCSAqIC0gZXhwbGljaXRseSBzZXQgdG8gemVybworCQkgKi8KKwkJaWYgKHVubGlrZWx5KHdhbGxfdGltZSA+ICgyICogc2FtcGxpbmdfcmF0ZSkgJiYKKwkJCSAgICAgal9jZGJzLT5wcmV2X2xvYWQpKSB7CisJCQlsb2FkID0gal9jZGJzLT5wcmV2X2xvYWQ7CisKKwkJCS8qCisJCQkgKiBQZXJmb3JtIGEgZGVzdHJ1Y3RpdmUgY29weSwgdG8gZW5zdXJlIHRoYXQgd2UgY29weQorCQkJICogdGhlIHByZXZpb3VzIGxvYWQgb25seSBvbmNlLCB1cG9uIHRoZSBmaXJzdCB3YWtlLXVwCisJCQkgKiBmcm9tIGlkbGUuCisJCQkgKi8KKwkJCWpfY2Ricy0+cHJldl9sb2FkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWxvYWQgPSAxMDAgKiAod2FsbF90aW1lIC0gaWRsZV90aW1lKSAvIHdhbGxfdGltZTsKKwkJCWpfY2Ricy0+cHJldl9sb2FkID0gbG9hZDsKKwkJfQogCiAJCWlmIChsb2FkID4gbWF4X2xvYWQpCiAJCQltYXhfbG9hZCA9IGxvYWQ7CkBAIC0zMTgsMTEgKzM3MiwxOCBAQAogCQlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CiAJCQlzdHJ1Y3QgY3B1X2Ric19jb21tb25faW5mbyAqal9jZGJzID0KIAkJCQlkYnNfZGF0YS0+Y2RhdGEtPmdldF9jcHVfY2RicyhqKTsKKwkJCXVuc2lnbmVkIGludCBwcmV2X2xvYWQ7CiAKIAkJCWpfY2Ricy0+Y3B1ID0gajsKIAkJCWpfY2Ricy0+Y3VyX3BvbGljeSA9IHBvbGljeTsKIAkJCWpfY2Ricy0+cHJldl9jcHVfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGosCiAJCQkJCSAgICAgICAmal9jZGJzLT5wcmV2X2NwdV93YWxsLCBpb19idXN5KTsKKworCQkJcHJldl9sb2FkID0gKHVuc2lnbmVkIGludCkKKwkJCQkoal9jZGJzLT5wcmV2X2NwdV93YWxsIC0gal9jZGJzLT5wcmV2X2NwdV9pZGxlKTsKKwkJCWpfY2Ricy0+cHJldl9sb2FkID0gMTAwICogcHJldl9sb2FkIC8KKwkJCQkJKHVuc2lnbmVkIGludCkgal9jZGJzLT5wcmV2X2NwdV93YWxsOworCiAJCQlpZiAoaWdub3JlX25pY2UpCiAJCQkJal9jZGJzLT5wcmV2X2NwdV9uaWNlID0KIAkJCQkJa2NwdXN0YXRfY3B1KGopLmNwdXN0YXRbQ1BVVElNRV9OSUNFXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmggYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9nb3Zlcm5vci5oCmluZGV4IGJmYjlhZTEuLmNjNDAxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmgKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfZ292ZXJub3IuaApAQCAtMTM0LDYgKzEzNCwxMyBAQAogCXU2NCBwcmV2X2NwdV9pZGxlOwogCXU2NCBwcmV2X2NwdV93YWxsOwogCXU2NCBwcmV2X2NwdV9uaWNlOworCS8qCisJICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIGxvYWQgaW4gdGhlIHByZXZpb3VzIGludGVydmFsLiBIb3dldmVyLCB3aGVuCisJICogZXhwbGljaXRseSBzZXQgdG8gemVybywgaXQgaXMgdXNlZCBhcyBhIGZsYWcgdG8gZW5zdXJlIHRoYXQgd2UgY29weQorCSAqIHRoZSBwcmV2aW91cyBsb2FkIHRvIHRoZSBjdXJyZW50IGludGVydmFsIG9ubHkgb25jZSwgdXBvbiB0aGUgZmlyc3QKKwkgKiB3YWtlLXVwIGZyb20gaWRsZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcHJldl9sb2FkOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3VyX3BvbGljeTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwppbmRleCBhZWJkNDU3Li40ZTdmNDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCkBAIC02OTEsMTQgKzY5MSw4IEBACiAKIHN0YXRpYyBpbnQgaW50ZWxfcHN0YXRlX2luaXRfY3B1KHVuc2lnbmVkIGludCBjcHVudW0pCiB7Ci0KLQljb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCAqaWQ7CiAJc3RydWN0IGNwdWRhdGEgKmNwdTsKIAotCWlkID0geDg2X21hdGNoX2NwdShpbnRlbF9wc3RhdGVfY3B1X2lkcyk7Ci0JaWYgKCFpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlhbGxfY3B1X2RhdGFbY3B1bnVtXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhbGxfY3B1X2RhdGFbY3B1bnVtXSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcHBjLWNvcmVuZXQtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3BwYy1jb3JlbmV0LWNwdWZyZXEuYwppbmRleCAwYWY2MThhLi4zNjA3MDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcHBjLWNvcmVuZXQtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9wcGMtY29yZW5ldC1jcHVmcmVxLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGU7CiAJc3RydWN0IGNwdV9kYXRhICpkYXRhOwogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKLQl1NjQgdHJhbnNpdGlvbl9sYXRlbmN5X2h6OworCXU2NCB1NjR0ZW1wOwogCiAJbnAgPSBvZl9nZXRfY3B1X25vZGUoY3B1LCBOVUxMKTsKIAlpZiAoIW5wKQpAQCAtMjA2LDkgKzIwNiwxMCBAQAogCWZvcl9lYWNoX2NwdShpLCBwZXJfY3B1KGNwdV9tYXNrLCBjcHUpKQogCQlwZXJfY3B1KGNwdV9kYXRhLCBpKSA9IGRhdGE7CiAKLQl0cmFuc2l0aW9uX2xhdGVuY3lfaHogPSAxMlVMTCAqIE5TRUNfUEVSX1NFQzsKLQlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0KLQkJZG9fZGl2KHRyYW5zaXRpb25fbGF0ZW5jeV9oeiwgZnNsX2dldF9zeXNfZnJlcSgpKTsKKwkvKiBNaW5pbXVtIHRyYW5zaXRpb24gbGF0ZW5jeSBpcyAxMiBwbGF0Zm9ybSBjbG9ja3MgKi8KKwl1NjR0ZW1wID0gMTJVTEwgKiBOU0VDX1BFUl9TRUM7CisJZG9fZGl2KHU2NHRlbXAsIGZzbF9nZXRfc3lzX2ZyZXEoKSk7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IHU2NHRlbXAgKyAxOwogCiAJb2Zfbm9kZV9wdXQobnApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvdGVncmEtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3RlZ3JhLWNwdWZyZXEuYwppbmRleCA2ZTc3NGM2Li44MDg0YzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvdGVncmEtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS90ZWdyYS1jcHVmcmVxLmMKQEAgLTQ1LDQ2ICs0NSw1NCBAQAogc3RhdGljIHN0cnVjdCBjbGsgKnBsbF94X2NsazsKIHN0YXRpYyBzdHJ1Y3QgY2xrICpwbGxfcF9jbGs7CiBzdGF0aWMgc3RydWN0IGNsayAqZW1jX2NsazsKK3N0YXRpYyBib29sIHBsbF94X3ByZXBhcmVkOwogCi1zdGF0aWMgaW50IHRlZ3JhX2NwdV9jbGtfc2V0X3JhdGUodW5zaWduZWQgbG9uZyByYXRlKQorc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV9nZXRfaW50ZXJtZWRpYXRlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGlmcmVxID0gY2xrX2dldF9yYXRlKHBsbF9wX2NsaykgLyAxMDAwOworCisJLyoKKwkgKiBEb24ndCBzd2l0Y2ggdG8gaW50ZXJtZWRpYXRlIGZyZXEgaWY6CisJICogLSB3ZSBhcmUgYWxyZWFkeSBhdCBpdCwgaS5lLiBwb2xpY3ktPmN1ciA9PSBpZnJlcQorCSAqIC0gaW5kZXggY29ycmVzcG9uZHMgdG8gaWZyZXEKKwkgKi8KKwlpZiAoKGZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeSA9PSBpZnJlcSkgfHwgKHBvbGljeS0+Y3VyID09IGlmcmVxKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaWZyZXE7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfdGFyZ2V0X2ludGVybWVkaWF0ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbmRleCkKIHsKIAlpbnQgcmV0OwogCiAJLyoKIAkgKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSB0byB0aGUgbWFpbiBwbGwgc28gaXQgZG9lc24ndCB0dXJuCi0JICogb2ZmIHdoZW4gd2UgbW92ZSB0aGUgY3B1IG9mZiBvZiBpdAorCSAqIG9mZiB3aGVuIHdlIG1vdmUgdGhlIGNwdSBvZmYgb2YgaXQgYXMgZW5hYmxpbmcgaXQgYWdhaW4gd2hpbGUgd2UKKwkgKiBzd2l0Y2ggdG8gaXQgZnJvbSB0ZWdyYV90YXJnZXQoKSB3b3VsZCB0YWtlIGFkZGl0aW9uYWwgdGltZS4KKwkgKgorCSAqIFdoZW4gdGFyZ2V0LWZyZXEgaXMgZXF1YWwgdG8gaW50ZXJtZWRpYXRlIGZyZXEgd2UgZG9uJ3QgbmVlZCB0bworCSAqIHN3aXRjaCB0byBhbiBpbnRlcm1lZGlhdGUgZnJlcSBhbmQgc28gdGhpcyByb3V0aW5lIGlzbid0IGNhbGxlZC4KKwkgKiBBbHNvLCB3ZSB3b3VsZG4ndCBiZSB1c2luZyBwbGxfeCBhbnltb3JlIGFuZCBtdXN0IG5vdCB0YWtlIGV4dHJhCisJICogcmVmZXJlbmNlIHRvIGl0LCBhcyBpdCBjYW4gYmUgZGlzYWJsZWQgbm93IHRvIHNhdmUgc29tZSBwb3dlci4KIAkgKi8KIAljbGtfcHJlcGFyZV9lbmFibGUocGxsX3hfY2xrKTsKIAogCXJldCA9IGNsa19zZXRfcGFyZW50KGNwdV9jbGssIHBsbF9wX2Nsayk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBzd2l0Y2ggY3B1IHRvIGNsb2NrIHBsbF9wXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChyZXQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbGxfeF9jbGspOworCWVsc2UKKwkJcGxsX3hfcHJlcGFyZWQgPSB0cnVlOwogCi0JaWYgKHJhdGUgPT0gY2xrX2dldF9yYXRlKHBsbF9wX2NsaykpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gY2xrX3NldF9yYXRlKHBsbF94X2NsaywgcmF0ZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBjaGFuZ2UgcGxsX3ggdG8gJWx1XG4iLCByYXRlKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gY2xrX3NldF9wYXJlbnQoY3B1X2NsaywgcGxsX3hfY2xrKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIHN3aXRjaCBjcHUgdG8gY2xvY2sgcGxsX3hcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUocGxsX3hfY2xrKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRlZ3JhX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IGluZGV4KQogewogCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IGZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKKwl1bnNpZ25lZCBpbnQgaWZyZXEgPSBjbGtfZ2V0X3JhdGUocGxsX3BfY2xrKSAvIDEwMDA7CiAJaW50IHJldCA9IDA7CiAKIAkvKgpAQCAtOTgsMTAgKzEwNiwzMCBAQAogCWVsc2UKIAkJY2xrX3NldF9yYXRlKGVtY19jbGssIDEwMDAwMDAwMCk7ICAvKiBlbWMgNTBNaHogKi8KIAotCXJldCA9IHRlZ3JhX2NwdV9jbGtfc2V0X3JhdGUocmF0ZSAqIDEwMDApOworCS8qCisJICogdGFyZ2V0IGZyZXEgPT0gcGxsX3AsIGRvbid0IG5lZWQgdG8gdGFrZSBleHRyYSByZWZlcmVuY2UgdG8gcGxsX3hfY2xrCisJICogYXMgaXQgaXNuJ3QgdXNlZCBhbnltb3JlLgorCSAqLworCWlmIChyYXRlID09IGlmcmVxKQorCQlyZXR1cm4gY2xrX3NldF9wYXJlbnQoY3B1X2NsaywgcGxsX3BfY2xrKTsKKworCXJldCA9IGNsa19zZXRfcmF0ZShwbGxfeF9jbGssIHJhdGUgKiAxMDAwKTsKKwkvKiBSZXN0b3JlIHRvIGVhcmxpZXIgZnJlcXVlbmN5IG9uIGVycm9yLCBpLmUuIHBsbF94ICovCiAJaWYgKHJldCkKLQkJcHJfZXJyKCJjcHUtdGVncmE6IEZhaWxlZCB0byBzZXQgY3B1IGZyZXF1ZW5jeSB0byAlbHUga0h6XG4iLAotCQkJcmF0ZSk7CisJCXByX2VycigiRmFpbGVkIHRvIGNoYW5nZSBwbGxfeCB0byAlbHVcbiIsIHJhdGUpOworCisJcmV0ID0gY2xrX3NldF9wYXJlbnQoY3B1X2NsaywgcGxsX3hfY2xrKTsKKwkvKiBUaGlzIHNob3VsZG4ndCBmYWlsIHdoaWxlIGNoYW5naW5nIG9yIHJlc3RvcmluZyAqLworCVdBUk5fT04ocmV0KTsKKworCS8qCisJICogRHJvcCBjb3VudCB0byBwbGxfeCBjbG9jayBvbmx5IGlmIHdlIHN3aXRjaGVkIHRvIGludGVybWVkaWF0ZSBmcmVxCisJICogZWFybGllciB3aGlsZSB0cmFuc2l0aW9uaW5nIHRvIGEgdGFyZ2V0IGZyZXF1ZW5jeS4KKwkgKi8KKwlpZiAocGxsX3hfcHJlcGFyZWQpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsbF94X2Nsayk7CisJCXBsbF94X3ByZXBhcmVkID0gZmFsc2U7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNywxNiArMTY1LDE4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgdGVncmFfY3B1ZnJlcV9kcml2ZXIgPSB7Ci0JLmZsYWdzCQk9IENQVUZSRVFfTkVFRF9JTklUSUFMX0ZSRVFfQ0hFQ0ssCi0JLnZlcmlmeQkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKLQkudGFyZ2V0X2luZGV4CT0gdGVncmFfdGFyZ2V0LAotCS5nZXQJCT0gY3B1ZnJlcV9nZW5lcmljX2dldCwKLQkuaW5pdAkJPSB0ZWdyYV9jcHVfaW5pdCwKLQkuZXhpdAkJPSB0ZWdyYV9jcHVfZXhpdCwKLQkubmFtZQkJPSAidGVncmEiLAotCS5hdHRyCQk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAorCS5mbGFncwkJCT0gQ1BVRlJFUV9ORUVEX0lOSVRJQUxfRlJFUV9DSEVDSywKKwkudmVyaWZ5CQkJPSBjcHVmcmVxX2dlbmVyaWNfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeSwKKwkuZ2V0X2ludGVybWVkaWF0ZQk9IHRlZ3JhX2dldF9pbnRlcm1lZGlhdGUsCisJLnRhcmdldF9pbnRlcm1lZGlhdGUJPSB0ZWdyYV90YXJnZXRfaW50ZXJtZWRpYXRlLAorCS50YXJnZXRfaW5kZXgJCT0gdGVncmFfdGFyZ2V0LAorCS5nZXQJCQk9IGNwdWZyZXFfZ2VuZXJpY19nZXQsCisJLmluaXQJCQk9IHRlZ3JhX2NwdV9pbml0LAorCS5leGl0CQkJPSB0ZWdyYV9jcHVfZXhpdCwKKwkubmFtZQkJCT0gInRlZ3JhIiwKKwkuYXR0cgkJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBjcHVmcmVxX2dlbmVyaWNfc3VzcGVuZCwKKwkuc3VzcGVuZAkJPSBjcHVmcmVxX2dlbmVyaWNfc3VzcGVuZCwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCmluZGV4IDcxOWY2ZmIuLjc0ZjU3ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKQEAgLTczLDEyICs3MywxMCBAQAogCQlyZXR1cm4gaW5kZXg7CiAKIAluZXdfbHBjciA9IG9sZF9scGNyOwotCW5ld19scGNyICY9IH4oTFBDUl9NRVIgfCBMUENSX1BFQ0UpOyAvKiBscGNyW21lcl0gbXVzdCBiZSAwICovCi0KLQkvKiBleGl0IHBvd2Vyc2F2ZSB1cG9uIGV4dGVybmFsIGludGVycnVwdCwgYnV0IG5vdCBkZWNyZW1lbnRlcgotCSAqIGludGVycnVwdC4KKwkvKiBEbyBub3QgZXhpdCBwb3dlcnNhdmUgdXBvbiBkZWNyZW1lbnRlciBhcyB3ZSd2ZSBzZXR1cCB0aGUgdGltZXIKKwkgKiBvZmZsb2FkLgogCSAqLwotCW5ld19scGNyIHw9IExQQ1JfUEVDRTA7CisJbmV3X2xwY3IgJj0gfkxQQ1JfUEVDRTE7CiAKIAltdHNwcihTUFJOX0xQQ1IsIG5ld19scGNyKTsKIAlwb3dlcjdfc2xlZXAoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwppbmRleCAxMzZkNmEyLi45NjM0ZjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCkBAIC0xODcsOCArMTg3LDExIEBACiAKIAl0MSA9IGt0aW1lX2dldCgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKLQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQljcHVfcmVsYXgoKTsKKwlpZiAoIWN1cnJlbnRfc2V0X3BvbGxpbmdfYW5kX3Rlc3QoKSkgeworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQkJY3B1X3JlbGF4KCk7CisJfQorCWN1cnJlbnRfY2xyX3BvbGxpbmcoKTsKIAogCXQyID0ga3RpbWVfZ2V0KCk7CiAJZGlmZiA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0MiwgdDEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCmluZGV4IGYwNjZmYTIuLjAyZjE3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKKysrIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwpAQCAtMzEzLDcgKzMxMyw3IEBACiAKIGNvbmZpZyBDUllQVE9fREVWX05YCiAJYm9vbCAiU3VwcG9ydCBmb3IgSUJNIFBvd2VyNysgaW4tTmVzdCBjcnlwdG9ncmFwaGljIGFjY2VsZXJhdGlvbiIKLQlkZXBlbmRzIG9uIFBQQzY0ICYmIElCTVZJTworCWRlcGVuZHMgb24gUFBDNjQgJiYgSUJNVklPICYmICFDUFVfTElUVExFX0VORElBTgogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFBvd2VyNysgaW4tTmVzdCBjcnlwdG9ncmFwaGljIGFjY2VsZXJhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvTWFrZWZpbGUKaW5kZXggZDhhMjJjMi4uNzBkYTllYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmoteQkJCSs9IGRybS8gdmdhLwogb2JqLSQoQ09ORklHX1RFR1JBX0hPU1QxWCkJKz0gaG9zdDF4Lworb2JqLSQoQ09ORklHX0lNWF9JUFVWM19DT1JFKQkrPSBpcHUtdjMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCmluZGV4IGQxY2MyZjYuLmY1MTIwMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC04Myw2ICs4Myw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyIKKwogY29uZmlnIERSTV9UREZYCiAJdHJpc3RhdGUgIjNkZnggQmFuc2hlZS9Wb29kb28zKyIKIAlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKQEAgLTE5OSw1ICsyMDEsMyBAQAogc291cmNlICJkcml2ZXJzL2dwdS9kcm0vdGVncmEvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2dwdS9kcm0vcGFuZWwvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggNDhlMzhiYS4uZGQyYmE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtMTQsNyArMTQsNyBAQAogCQlkcm1faW5mby5vIGRybV9kZWJ1Z2ZzLm8gZHJtX2VuY29kZXJfc2xhdmUubyBcCiAJCWRybV90cmFjZV9wb2ludHMubyBkcm1fZ2xvYmFsLm8gZHJtX3ByaW1lLm8gXAogCQlkcm1fcmVjdC5vIGRybV92bWFfbWFuYWdlci5vIGRybV9mbGlwX3dvcmsubyBcCi0JCWRybV9wbGFuZV9oZWxwZXIubworCQlkcm1fbW9kZXNldF9sb2NrLm8KIAogZHJtLSQoQ09ORklHX0NPTVBBVCkgKz0gZHJtX2lvYzMyLm8KIGRybS0kKENPTkZJR19EUk1fR0VNX0NNQV9IRUxQRVIpICs9IGRybV9nZW1fY21hX2hlbHBlci5vCkBAIC0yMyw3ICsyMyw4IEBACiAKIGRybS11c2IteSAgIDo9IGRybV91c2IubwogCi1kcm1fa21zX2hlbHBlci15IDo9IGRybV9jcnRjX2hlbHBlci5vIGRybV9kcF9oZWxwZXIubyBkcm1fcHJvYmVfaGVscGVyLm8KK2RybV9rbXNfaGVscGVyLXkgOj0gZHJtX2NydGNfaGVscGVyLm8gZHJtX2RwX2hlbHBlci5vIGRybV9wcm9iZV9oZWxwZXIubyBcCisJCWRybV9wbGFuZV9oZWxwZXIubwogZHJtX2ttc19oZWxwZXItJChDT05GSUdfRFJNX0xPQURfRURJRF9GSVJNV0FSRSkgKz0gZHJtX2VkaWRfbG9hZC5vCiBkcm1fa21zX2hlbHBlci0kKENPTkZJR19EUk1fS01TX0ZCX0hFTFBFUikgKz0gZHJtX2ZiX2hlbHBlci5vCiBkcm1fa21zX2hlbHBlci0kKENPTkZJR19EUk1fS01TX0NNQV9IRUxQRVIpICs9IGRybV9mYl9jbWFfaGVscGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZHJ2LmMKaW5kZXggMzI5ODJkYS4uOGFiM2NkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZHJ2LmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2ttczsKIAotCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOworCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYsIHBsYXRmb3JtX2dldF9pcnEoZGV2LT5wbGF0Zm9ybWRldiwgMCkpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2ttczsKIApAQCAtNDAyLDcgKzQwMiw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFybWFkYV9kcm1faW5pdCh2b2lkKQogewotCWFybWFkYV9kcm1fZHJpdmVyLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShhcm1hZGFfaW9jdGxzKTsKKwlhcm1hZGFfZHJtX2RyaXZlci5udW1faW9jdGxzID0gQVJSQVlfU0laRShhcm1hZGFfaW9jdGxzKTsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhcm1hZGFfZHJtX3BsYXRmb3JtX2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChhcm1hZGFfZHJtX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZmJkZXYuYyBiL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2ZiZGV2LmMKaW5kZXggOTQ4Y2IxNC4uZmQxNjZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZmJkZXYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9mYmRldi5jCkBAIC0xODEsMTAgKzE4MSw4IEBACiB7CiAJc3RydWN0IGFybWFkYV9wcml2YXRlICpwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CiAJaWYgKHByaXYtPmZiZGV2KQotCQlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZShwcml2LT5mYmRldik7Ci0JZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOworCQlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZChwcml2LT5mYmRldik7CiB9CiAKIHZvaWQgYXJtYWRhX2ZiZGV2X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hcm1hZGEvYXJtYWRhX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZ2VtLmMKaW5kZXggODg3ODE2Zi4uYmI5YjY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfZ2VtLmMKQEAgLTQzMyw3ICs0MzMsNiBAQAogCiAJaWYgKGRvYmotPm9iai5maWxwKSB7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwotCQlnZnBfdCBnZnA7CiAJCWludCBjb3VudDsKIAogCQljb3VudCA9IGRvYmotPm9iai5zaXplIC8gUEFHRV9TSVpFOwpAQCAtNDQxLDEyICs0NDAsMTEgQEAKIAkJCWdvdG8gZnJlZV9zZ3Q7CiAKIAkJbWFwcGluZyA9IGZpbGVfaW5vZGUoZG9iai0+b2JqLmZpbHApLT5pX21hcHBpbmc7Ci0JCWdmcCA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZyk7CiAKIAkJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBjb3VudCwgaSkgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAobWFwcGluZywgaSwgZ2ZwKTsKKwkJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBpKTsKIAkJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCQludW0gPSBpOwogCQkJCWdvdG8gcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L01ha2VmaWxlCmluZGV4IDhkZjRmMjguLjE3MWFhMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9NYWtlZmlsZQpAQCAtNCw2ICs0LDYgQEAKIAogY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KIAotYXN0LXkgOj0gYXN0X2Rydi5vIGFzdF9tYWluLm8gYXN0X21vZGUubyBhc3RfZmIubyBhc3RfdHRtLm8gYXN0X3Bvc3QubworYXN0LXkgOj0gYXN0X2Rydi5vIGFzdF9tYWluLm8gYXN0X21vZGUubyBhc3RfZmIubyBhc3RfdHRtLm8gYXN0X3Bvc3QubyBhc3RfZHA1MDEubwogCi1vYmotJChDT05GSUdfRFJNX0FTVCkgOj0gYXN0Lm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitvYmotJChDT05GSUdfRFJNX0FTVCkgOj0gYXN0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2RwNTAxLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9kcDUwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTRiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9kcDUwMS5jCkBAIC0wLDAgKzEsNDEwIEBACisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSAiYXN0X2Rydi5oIgorTU9EVUxFX0ZJUk1XQVJFKCJhc3RfZHA1MDFfZncuYmluIik7CisKK2ludCBhc3RfbG9hZF9kcDUwMV9taWNyb2NvZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RhdGljIGNoYXIgKmZ3X25hbWUgPSAiYXN0X2RwNTAxX2Z3LmJpbiI7CisJaW50IGVycjsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZhc3QtPmRwNTAxX2Z3LCBmd19uYW1lLCBkZXYtPmRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2FjayhzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCkKK3sKKwl1OCBzZW5kYWNrOworCXNlbmRhY2sgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5YiwgMHhmZik7CisJc2VuZGFjayB8PSAweDgwOworCWFzdF9zZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDliLCAweDAwLCBzZW5kYWNrKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9uYWNrKHN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0KQoreworCXU4IHNlbmRhY2s7CisJc2VuZGFjayA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDliLCAweGZmKTsKKwlzZW5kYWNrICY9IH4weDgwOworCWFzdF9zZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDliLCAweDAwLCBzZW5kYWNrKTsKK30KKworc3RhdGljIGJvb2wgd2FpdF9hY2soc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJdTggd2FpdGFjazsKKwl1MzIgcmV0cnkgPSAwOworCWRvIHsKKwkJd2FpdGFjayA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweGQyLCAweGZmKTsKKwkJd2FpdGFjayAmPSAweDgwOworCQl1ZGVsYXkoMTAwKTsKKwl9IHdoaWxlICgoIXdhaXRhY2spICYmIChyZXRyeSsrIDwgMTAwMCkpOworCisJaWYgKHJldHJ5IDwgMTAwMCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHdhaXRfbmFjayhzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCkKK3sKKwl1OCB3YWl0YWNrOworCXUzMiByZXRyeSA9IDA7CisJZG8geworCQl3YWl0YWNrID0gYXN0X2dldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4ZDIsIDB4ZmYpOworCQl3YWl0YWNrICY9IDB4ODA7CisJCXVkZWxheSgxMDApOworCX0gd2hpbGUgKCh3YWl0YWNrKSAmJiAocmV0cnkrKyA8IDEwMDApKTsKKworCWlmIChyZXRyeSA8IDEwMDApCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBzZXRfY21kX3RyaWdnZXIoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJYXN0X3NldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OWIsIH4weDQwLCAweDQwKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfY21kX3RyaWdnZXIoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJYXN0X3NldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OWIsIH4weDQwLCAweDAwKTsKK30KKworI2lmIDAKK3N0YXRpYyBib29sIHdhaXRfZndfcmVhZHkoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJdTggd2FpdHJlYWR5OworCXUzMiByZXRyeSA9IDA7CisJZG8geworCQl3YWl0cmVhZHkgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMiwgMHhmZik7CisJCXdhaXRyZWFkeSAmPSAweDQwOworCQl1ZGVsYXkoMTAwKTsKKwl9IHdoaWxlICgoIXdhaXRyZWFkeSkgJiYgKHJldHJ5KysgPCAxMDAwKSk7CisKKwlpZiAocmV0cnkgPCAxMDAwKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCitzdGF0aWMgYm9vbCBhc3Rfd3JpdGVfY21kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IGRhdGEpCit7CisJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXRyeSA9IDA7CisJaWYgKHdhaXRfbmFjayhhc3QpKSB7CisJCXNlbmRfbmFjayhhc3QpOworCQlhc3Rfc2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5YSwgMHgwMCwgZGF0YSk7CisJCXNlbmRfYWNrKGFzdCk7CisJCXNldF9jbWRfdHJpZ2dlcihhc3QpOworCQlkbyB7CisJCQlpZiAod2FpdF9hY2soYXN0KSkgeworCQkJCWNsZWFyX2NtZF90cmlnZ2VyKGFzdCk7CisJCQkJc2VuZF9uYWNrKGFzdCk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0gd2hpbGUgKHJldHJ5KysgPCAxMDApOworCX0KKwljbGVhcl9jbWRfdHJpZ2dlcihhc3QpOworCXNlbmRfbmFjayhhc3QpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgYXN0X3dyaXRlX2RhdGEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAod2FpdF9uYWNrKGFzdCkpIHsKKwkJc2VuZF9uYWNrKGFzdCk7CisJCWFzdF9zZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDlhLCAweDAwLCBkYXRhKTsKKwkJc2VuZF9hY2soYXN0KTsKKwkJaWYgKHdhaXRfYWNrKGFzdCkpIHsKKwkJCXNlbmRfbmFjayhhc3QpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJc2VuZF9uYWNrKGFzdCk7CisJcmV0dXJuIGZhbHNlOworfQorCisjaWYgMAorc3RhdGljIGJvb2wgYXN0X3JlYWRfZGF0YShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTggdG1wOworCisJKmRhdGEgPSAwOworCisJaWYgKHdhaXRfYWNrKGFzdCkgPT0gZmFsc2UpCisJCXJldHVybiBmYWxzZTsKKwl0bXAgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMywgMHhmZik7CisJKmRhdGEgPSB0bXA7CisJaWYgKHdhaXRfbmFjayhhc3QpID09IGZhbHNlKSB7CisJCXNlbmRfbmFjayhhc3QpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXNlbmRfbmFjayhhc3QpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9jbWQoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJc2VuZF9uYWNrKGFzdCk7CisJYXN0X3NldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OWEsIDB4MDAsIDB4MDApOworfQorI2VuZGlmCisKK3ZvaWQgYXN0X3NldF9kcDUwMV92aWRlb19vdXRwdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggbW9kZSkKK3sKKwlhc3Rfd3JpdGVfY21kKGRldiwgMHg0MCk7CisJYXN0X3dyaXRlX2RhdGEoZGV2LCBtb2RlKTsKKworCW1zbGVlcCgxMCk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2Z3X2Jhc2Uoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCit7CisJcmV0dXJuIGFzdF9taW5kd20oYXN0LCAweDFlNmUyMTA0KSAmIDB4N2ZmZmZmZmY7Cit9CisKK2Jvb2wgYXN0X2JhY2t1cF9mdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCAqYWRkciwgdTMyIHNpemUpCit7CisJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBpLCBkYXRhOworCXUzMiBib290X2FkZHJlc3M7CisKKwlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTIxMDApICYgMHgwMTsKKwlpZiAoZGF0YSkgeworCQlib290X2FkZHJlc3MgPSBnZXRfZndfYmFzZShhc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KQorCQkJKih1MzIgKikoYWRkciArIGkpID0gYXN0X21pbmR3bShhc3QsIGJvb3RfYWRkcmVzcyArIGkpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitib29sIGFzdF9sYXVuY2hfbTY4ayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgaSwgZGF0YSwgbGVuID0gMDsKKwl1MzIgYm9vdF9hZGRyZXNzOworCXU4ICpmd19hZGRyID0gTlVMTDsKKwl1OCBqcmVnOworCisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFlNmUyMTAwKSAmIDB4MDE7CisJaWYgKCFkYXRhKSB7CisKKwkJaWYgKGFzdC0+ZHA1MDFfZndfYWRkcikgeworCQkJZndfYWRkciA9IGFzdC0+ZHA1MDFfZndfYWRkcjsKKwkJCWxlbiA9IDMyKjEwMjQ7CisJCX0gZWxzZSBpZiAoYXN0LT5kcDUwMV9mdykgeworCQkJZndfYWRkciA9ICh1OCAqKWFzdC0+ZHA1MDFfZnctPmRhdGE7CisJCQlsZW4gPSBhc3QtPmRwNTAxX2Z3LT5zaXplOworCQl9CisJCS8qIEdldCBCb290QWRkcmVzcyAqLworCQlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTIwMDAsIDB4MTY4OGE4YTgpOworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTAwMDQpOworCQlzd2l0Y2ggKGRhdGEgJiAweDAzKSB7CisJCWNhc2UgMDoKKwkJCWJvb3RfYWRkcmVzcyA9IDB4NDQwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSAxOgorCQkJYm9vdF9hZGRyZXNzID0gMHg0ODAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlib290X2FkZHJlc3MgPSAweDUwMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWJvb3RfYWRkcmVzcyA9IDB4NjAwMDAwMDA7CisJCQlicmVhazsKKwkJfQorCQlib290X2FkZHJlc3MgLT0gMHgyMDAwMDA7IC8qIC0yTUIgKi8KKworCQkvKiBjb3B5IGltYWdlIHRvIGJ1ZmZlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKKwkJCWRhdGEgPSAqKHUzMiAqKShmd19hZGRyICsgaSk7CisJCQlhc3RfbW91dGR3bShhc3QsIGJvb3RfYWRkcmVzcyArIGksIGRhdGEpOworCQl9CisKKwkJLyogSW5pdCBTQ1UgKi8KKwkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUyMDAwLCAweDE2ODhhOGE4KTsKKworCQkvKiBMYXVuY2ggRlcgKi8KKwkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUyMTA0LCAweDgwMDAwMDAwICsgYm9vdF9hZGRyZXNzKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUyMTAwLCAxKTsKKworCQkvKiBVcGRhdGUgU2NyYXRjaCAqLworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTIwNDApICYgMHhmZmZmZjFmZjsJCS8qIERbMTE6OV0gPSAxMDBiOiBVRUZJIGhhbmRsaW5nICovCisJCWRhdGEgfD0gMHg4MDA7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMjA0MCwgZGF0YSk7CisKKwkJanJlZyA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDk5LCAweGZjKTsgLyogRFsxOjBdOiBSZXNlcnZlZCBWaWRlbyBCdWZmZXIgKi8KKwkJanJlZyB8PSAweDAyOworCQlhc3Rfc2V0X2luZGV4X3JlZyhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OTksIGpyZWcpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwordTggYXN0X2dldF9kcDUwMV9tYXhfY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBib290X2FkZHJlc3MsIG9mZnNldCwgZGF0YTsKKwl1OCBsaW5rY2FwWzRdLCBsaW5rcmF0ZSwgbGlua2xhbmVzLCBtYXhjbGsgPSAweGZmOworCisJYm9vdF9hZGRyZXNzID0gZ2V0X2Z3X2Jhc2UoYXN0KTsKKworCS8qIHZhbGlkYXRlIEZXIHZlcnNpb24gKi8KKwlvZmZzZXQgPSAweGYwMDA7CisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCBib290X2FkZHJlc3MgKyBvZmZzZXQpOworCWlmICgoZGF0YSAmIDB4ZjApICE9IDB4MTApIC8qIHZlcnNpb246IDF4ICovCisJCXJldHVybiBtYXhjbGs7CisKKwkvKiBSZWFkIExpbmsgQ2FwYWJpbGl0eSAqLworCW9mZnNldCAgPSAweGYwMTQ7CisJKih1MzIgKilsaW5rY2FwID0gYXN0X21pbmR3bShhc3QsIGJvb3RfYWRkcmVzcyArIG9mZnNldCk7CisJaWYgKGxpbmtjYXBbMl0gPT0gMCkgeworCQlsaW5rcmF0ZSA9IGxpbmtjYXBbMF07CisJCWxpbmtsYW5lcyA9IGxpbmtjYXBbMV07CisJCWRhdGEgPSAobGlua3JhdGUgPT0gMHgwYSkgPyAoOTAgKiBsaW5rbGFuZXMpIDogKDU0ICogbGlua2xhbmVzKTsKKwkJaWYgKGRhdGEgPiAweGZmKQorCQkJZGF0YSA9IDB4ZmY7CisJCW1heGNsayA9ICh1OClkYXRhOworCX0KKwlyZXR1cm4gbWF4Y2xrOworfQorCitib29sIGFzdF9kcDUwMV9yZWFkX2VkaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggKmVkaWRkYXRhKQoreworCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgaSwgYm9vdF9hZGRyZXNzLCBvZmZzZXQsIGRhdGE7CisKKwlib290X2FkZHJlc3MgPSBnZXRfZndfYmFzZShhc3QpOworCisJLyogdmFsaWRhdGUgRlcgdmVyc2lvbiAqLworCW9mZnNldCA9IDB4ZjAwMDsKKwlkYXRhID0gYXN0X21pbmR3bShhc3QsIGJvb3RfYWRkcmVzcyArIG9mZnNldCk7CisJaWYgKChkYXRhICYgMHhmMCkgIT0gMHgxMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogdmFsaWRhdGUgUG5QIE1vbml0b3IgKi8KKwlvZmZzZXQgPSAweGYwMTA7CisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCBib290X2FkZHJlc3MgKyBvZmZzZXQpOworCWlmICghKGRhdGEgJiAweDAxKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUmVhZCBFRElEICovCisJb2Zmc2V0ID0gMHhmMDIwOworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gNCkgeworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIGJvb3RfYWRkcmVzcyArIG9mZnNldCArIGkpOworCQkqKHUzMiAqKShlZGlkZGF0YSArIGkpID0gZGF0YTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYXN0X2luaXRfZHZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBkZXYtPmRldl9wcml2YXRlOworCXU4IGpyZWc7CisJdTMyIGRhdGE7CisJYXN0X3dyaXRlMzIoYXN0LCAweGYwMDQsIDB4MWU2ZTAwMDApOworCWFzdF93cml0ZTMyKGFzdCwgMHhmMDAwLCAweDEpOworCWFzdF93cml0ZTMyKGFzdCwgMHgxMjAwMCwgMHgxNjg4YThhOCk7CisKKwlqcmVnID0gYXN0X2dldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4ZDAsIDB4ZmYpOworCWlmICghKGpyZWcgJiAweDgwKSkgeworCQkvKiBJbml0IFNDVSBEVk8gU2V0dGluZ3MgKi8KKwkJZGF0YSA9IGFzdF9yZWFkMzIoYXN0LCAweDEyMDA4KTsKKwkJLyogZGVsYXkgcGhhc2UgKi8KKwkJZGF0YSAmPSAweGZmZmZmOGZmOworCQlkYXRhIHw9IDB4MDAwMDA1MDA7CisJCWFzdF93cml0ZTMyKGFzdCwgMHgxMjAwOCwgZGF0YSk7CisKKwkJaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKSB7CisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwODQpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4ZmZmZTAwMDA7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwODQsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwODgpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4MDAwZmZmZmY7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwODgsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwOTApOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhICY9IDB4ZmZmZmZmY2Y7CisJCQlkYXRhIHw9IDB4MDAwMDAwMjA7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwOTAsIGRhdGEpOworCQl9IGVsc2UgeyAvKiBBU1QyNDAwICovCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwODgpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4MzAwMDAwMDA7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwODgsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwOGMpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4MDAwMDAwY2Y7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwOGMsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwYTQpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4ZmZmZjAwMDA7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwYTQsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwYTgpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4MDAwMDAwMGY7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwYTgsIGRhdGEpOworCisJCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4MTIwOTQpOworCQkJLyogbXVsdGktcGlucyBmb3IgRFZPIHNpbmdsZS1lZGdlICovCisJCQlkYXRhIHw9IDB4MDAwMDAwMDI7CisJCQlhc3Rfd3JpdGUzMihhc3QsIDB4MTIwOTQsIGRhdGEpOworCQl9CisJfQorCisJLyogRm9yY2UgdG8gRFZPICovCisJZGF0YSA9IGFzdF9yZWFkMzIoYXN0LCAweDEyMDJjKTsKKwlkYXRhICY9IDB4ZmZmYmZmZmY7CisJYXN0X3dyaXRlMzIoYXN0LCAweDEyMDJjLCBkYXRhKTsKKworCS8qIEluaXQgVkdBIERWTyBTZXR0aW5ncyAqLworCWFzdF9zZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweGEzLCAweGNmLCAweDgwKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBhc3RfaW5pdF8zcmR0eChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1OCBqcmVnOworCXUzMiBkYXRhOworCWlmIChhc3QtPmNoaXAgPT0gQVNUMjMwMCB8fCBhc3QtPmNoaXAgPT0gQVNUMjQwMCkgeworCQlqcmVnID0gYXN0X2dldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4ZDEsIDB4ZmYpOworCQlzd2l0Y2ggKGpyZWcgJiAweDBlKSB7CisJCWNhc2UgMHgwNDoKKwkJCWFzdF9pbml0X2R2byhkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwODoKKwkJCWFzdF9sYXVuY2hfbTY4ayhkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwYzoKKwkJCWFzdF9pbml0X2R2byhkZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoYXN0LT50eF9jaGlwX3R5cGUgPT0gQVNUX1RYX1NJTDE2NCkKKwkJCQlhc3RfaW5pdF9kdm8oZGV2KTsKKwkJCWVsc2UgeworCQkJCWFzdF93cml0ZTMyKGFzdCwgMHgxMjAwMCwgMHgxNjg4YThhOCk7CisJCQkJZGF0YSA9IGFzdF9yZWFkMzIoYXN0LCAweDEyMDJjKTsKKwkJCQlkYXRhICY9IDB4ZmZmY2ZmZmY7CisJCQkJYXN0X3dyaXRlMzIoYXN0LCAwLCBkYXRhKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfZHJ2LmMKaW5kZXggNTEzN2YxNS4uNDQwNzRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfZHJ2LmMKQEAgLTk0LDkgKzk0LDcgQEAKIAlhc3RfcG9zdF9ncHUoZGV2KTsKIAogCWRybV9tb2RlX2NvbmZpZ19yZXNldChkZXYpOwotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CiAJZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShkZXYpOwotCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKIAogCWNvbnNvbGVfbG9jaygpOwogCWFzdF9mYmRldl9zZXRfc3VzcGVuZChkZXYsIDApOwpAQCAtMTk4LDcgKzE5Niw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9NT0RFU0VUIHwgRFJJVkVSX0dFTSwKLQkuZGV2X3ByaXZfc2l6ZSA9IDAsCiAKIAkubG9hZCA9IGFzdF9kcml2ZXJfbG9hZCwKIAkudW5sb2FkID0gYXN0X2RyaXZlcl91bmxvYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2Rydi5oCmluZGV4IDk4MzNhMWIuLjVkNmE4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X2Rydi5oCkBAIC02MSw5ICs2MSwxNyBAQAogCUFTVDIyMDAsCiAJQVNUMjE1MCwKIAlBU1QyMzAwLAorCUFTVDI0MDAsCiAJQVNUMTE4MCwKIH07CiAKK2VudW0gYXN0X3R4X2NoaXAgeworCUFTVF9UWF9OT05FLAorCUFTVF9UWF9TSUwxNjQsCisJQVNUX1RYX0lURTY2MTIxLAorCUFTVF9UWF9EUDUwMSwKK307CisKICNkZWZpbmUgQVNUX0RSQU1fNTEyTXgxNiAwCiAjZGVmaW5lIEFTVF9EUkFNXzFHeDE2ICAgMQogI2RlZmluZSBBU1RfRFJBTV81MTJNeDMyIDIKQEAgLTEwMiw2ICsxMTAsMTIgQEAKIAkgKiB3ZSBoYXZlLiAqLwogCXN0cnVjdCB0dG1fYm9fa21hcF9vYmogY2FjaGVfa21hcDsKIAlpbnQgbmV4dF9jdXJzb3I7CisJYm9vbCBzdXBwb3J0X3dpZGVfc2NyZWVuOworCisJZW51bSBhc3RfdHhfY2hpcCB0eF9jaGlwX3R5cGU7CisJdTggZHA1MDFfbWF4Y2xrOworCXU4ICpkcDUwMV9md19hZGRyOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZHA1MDFfZnc7CS8qIGRwNTAxIGZ3ICovCiB9OwogCiBpbnQgYXN0X2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwpAQCAtMzY4LDQgKzM4MiwxNCBAQAogCiAvKiBhc3QgcG9zdCAqLwogdm9pZCBhc3RfcG9zdF9ncHUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit1MzIgYXN0X21pbmR3bShzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIHIpOwordm9pZCBhc3RfbW91dGR3bShzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIHIsIHUzMiB2KTsKKy8qIGFzdCBkcDUwMSAqLworaW50IGFzdF9sb2FkX2RwNTAxX21pY3JvY29kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgYXN0X3NldF9kcDUwMV92aWRlb19vdXRwdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggbW9kZSk7Citib29sIGFzdF9sYXVuY2hfbTY4ayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2Jvb2wgYXN0X2JhY2t1cF9mdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCAqYWRkciwgdTMyIHNpemUpOworYm9vbCBhc3RfZHA1MDFfcmVhZF9lZGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4ICplZGlkZGF0YSk7Cit1OCBhc3RfZ2V0X2RwNTAxX21heF9jbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGFzdF9pbml0XzNyZHR4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9tYWluLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9tYWluLmMKaW5kZXggNTA1MzVmZC4uYTJjYzZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbWFpbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X21haW4uYwpAQCAtNjYsMTIgKzY2LDE2IEBACiBzdGF0aWMgaW50IGFzdF9kZXRlY3RfY2hpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBkYXRhLCBqcmVnOwogCiAJaWYgKGRldi0+cGRldi0+ZGV2aWNlID09IFBDSV9DSElQX0FTVDExODApIHsKIAkJYXN0LT5jaGlwID0gQVNUMTEwMDsKIAkJRFJNX0lORk8oIkFTVCAxMTgwIGRldGVjdGVkXG4iKTsKIAl9IGVsc2UgewotCQlpZiAoZGV2LT5wZGV2LT5yZXZpc2lvbiA+PSAweDIwKSB7CisJCWlmIChkZXYtPnBkZXYtPnJldmlzaW9uID49IDB4MzApIHsKKwkJCWFzdC0+Y2hpcCA9IEFTVDI0MDA7CisJCQlEUk1fSU5GTygiQVNUIDI0MDAgZGV0ZWN0ZWRcbiIpOworCQl9IGVsc2UgaWYgKGRldi0+cGRldi0+cmV2aXNpb24gPj0gMHgyMCkgewogCQkJYXN0LT5jaGlwID0gQVNUMjMwMDsKIAkJCURSTV9JTkZPKCJBU1QgMjMwMCBkZXRlY3RlZFxuIik7CiAJCX0gZWxzZSBpZiAoZGV2LT5wZGV2LT5yZXZpc2lvbiA+PSAweDEwKSB7CkBAIC0xMDQsNiArMTA4LDU5IEBACiAJCQlEUk1fSU5GTygiQVNUIDIwMDAgZGV0ZWN0ZWRcbiIpOwogCQl9CiAJfQorCisJc3dpdGNoIChhc3QtPmNoaXApIHsKKwljYXNlIEFTVDExODA6CisJCWFzdC0+c3VwcG9ydF93aWRlX3NjcmVlbiA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgQVNUMjAwMDoKKwkJYXN0LT5zdXBwb3J0X3dpZGVfc2NyZWVuID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWpyZWcgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMCwgMHhmZik7CisJCWlmICghKGpyZWcgJiAweDgwKSkKKwkJCWFzdC0+c3VwcG9ydF93aWRlX3NjcmVlbiA9IHRydWU7CisJCWVsc2UgaWYgKGpyZWcgJiAweDAxKQorCQkJYXN0LT5zdXBwb3J0X3dpZGVfc2NyZWVuID0gdHJ1ZTsKKwkJZWxzZSB7CisJCQlhc3QtPnN1cHBvcnRfd2lkZV9zY3JlZW4gPSBmYWxzZTsKKwkJCWFzdF93cml0ZTMyKGFzdCwgMHhmMDA0LCAweDFlNmUwMDAwKTsKKwkJCWFzdF93cml0ZTMyKGFzdCwgMHhmMDAwLCAweDEpOworCQkJZGF0YSA9IGFzdF9yZWFkMzIoYXN0LCAweDEyMDdjKTsKKwkJCWRhdGEgJj0gMHgzMDA7CisJCQlpZiAoYXN0LT5jaGlwID09IEFTVDIzMDAgJiYgZGF0YSA9PSAweDApIC8qIGFzdDEzMDAgKi8KKwkJCQlhc3QtPnN1cHBvcnRfd2lkZV9zY3JlZW4gPSB0cnVlOworCQkJaWYgKGFzdC0+Y2hpcCA9PSBBU1QyNDAwICYmIGRhdGEgPT0gMHgxMDApIC8qIGFzdDE0MDAgKi8KKwkJCQlhc3QtPnN1cHBvcnRfd2lkZV9zY3JlZW4gPSB0cnVlOworCQl9CisJCWJyZWFrOworCX0KKworCWFzdC0+dHhfY2hpcF90eXBlID0gQVNUX1RYX05PTkU7CisJanJlZyA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweGEzLCAweGZmKTsKKwlpZiAoanJlZyAmIDB4ODApCisJCWFzdC0+dHhfY2hpcF90eXBlID0gQVNUX1RYX1NJTDE2NDsKKwlpZiAoKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKSB8fCAoYXN0LT5jaGlwID09IEFTVDI0MDApKSB7CisJCWpyZWcgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMSwgMHhmZik7CisJCXN3aXRjaCAoanJlZykgeworCQljYXNlIDB4MDQ6CisJCQlhc3QtPnR4X2NoaXBfdHlwZSA9IEFTVF9UWF9TSUwxNjQ7CisJCQlicmVhazsKKwkJY2FzZSAweDA4OgorCQkJYXN0LT5kcDUwMV9md19hZGRyID0ga3phbGxvYygzMioxMDI0LCBHRlBfS0VSTkVMKTsKKwkJCWlmIChhc3QtPmRwNTAxX2Z3X2FkZHIpIHsKKwkJCQkvKiBiYWNrdXAgZmlybXdhcmUgKi8KKwkJCQlpZiAoYXN0X2JhY2t1cF9mdyhkZXYsIGFzdC0+ZHA1MDFfZndfYWRkciwgMzIqMTAyNCkpIHsKKwkJCQkJa2ZyZWUoYXN0LT5kcDUwMV9md19hZGRyKTsKKwkJCQkJYXN0LT5kcDUwMV9md19hZGRyID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIDB4MGM6CisJCQlhc3QtPnR4X2NoaXBfdHlwZSA9IEFTVF9UWF9EUDUwMTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMjksNyArMTg2LDcgQEAKIAllbHNlCiAJCWFzdC0+ZHJhbV9idXNfd2lkdGggPSAzMjsKIAotCWlmIChhc3QtPmNoaXAgPT0gQVNUMjMwMCkgeworCWlmIChhc3QtPmNoaXAgPT0gQVNUMjMwMCB8fCBhc3QtPmNoaXAgPT0gQVNUMjQwMCkgewogCQlzd2l0Y2ggKGRhdGEgJiAweDAzKSB7CiAJCWNhc2UgMDoKIAkJCWFzdC0+ZHJhbV90eXBlID0gQVNUX0RSQU1fNTEyTXgxNjsKQEAgLTI1NywxNyArMzE0LDMyIEBACiB7CiAJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBkZXYtPmRldl9wcml2YXRlOwogCXU4IGpyZWc7Ci0KKwl1MzIgdnJhbV9zaXplOwogCWFzdF9vcGVuX2tleShhc3QpOwogCisJdnJhbV9zaXplID0gQVNUX1ZJRE1FTV9ERUZBVUxUX1NJWkU7CiAJanJlZyA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweGFhLCAweGZmKTsKIAlzd2l0Y2ggKGpyZWcgJiAzKSB7Ci0JY2FzZSAwOiByZXR1cm4gQVNUX1ZJRE1FTV9TSVpFXzhNOwotCWNhc2UgMTogcmV0dXJuIEFTVF9WSURNRU1fU0laRV8xNk07Ci0JY2FzZSAyOiByZXR1cm4gQVNUX1ZJRE1FTV9TSVpFXzMyTTsKLQljYXNlIDM6IHJldHVybiBBU1RfVklETUVNX1NJWkVfNjRNOworCWNhc2UgMDogdnJhbV9zaXplID0gQVNUX1ZJRE1FTV9TSVpFXzhNOyBicmVhazsKKwljYXNlIDE6IHZyYW1fc2l6ZSA9IEFTVF9WSURNRU1fU0laRV8xNk07IGJyZWFrOworCWNhc2UgMjogdnJhbV9zaXplID0gQVNUX1ZJRE1FTV9TSVpFXzMyTTsgYnJlYWs7CisJY2FzZSAzOiB2cmFtX3NpemUgPSBBU1RfVklETUVNX1NJWkVfNjRNOyBicmVhazsKIAl9Ci0JcmV0dXJuIEFTVF9WSURNRU1fREVGQVVMVF9TSVpFOworCisJanJlZyA9IGFzdF9nZXRfaW5kZXhfcmVnX21hc2soYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDk5LCAweGZmKTsKKwlzd2l0Y2ggKGpyZWcgJiAweDAzKSB7CisJY2FzZSAxOgorCQl2cmFtX3NpemUgLT0gMHgxMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdnJhbV9zaXplIC09IDB4MjAwMDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCXZyYW1fc2l6ZSAtPSAweDQwMDAwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZyYW1fc2l6ZTsKIH0KIAogaW50IGFzdF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQpAQCAtMzE2LDYgKzM4OCw3IEBACiAJaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMTAwIHx8CiAJICAgIGFzdC0+Y2hpcCA9PSBBU1QyMjAwIHx8CiAJICAgIGFzdC0+Y2hpcCA9PSBBU1QyMzAwIHx8CisJICAgIGFzdC0+Y2hpcCA9PSBBU1QyNDAwIHx8CiAJICAgIGFzdC0+Y2hpcCA9PSBBU1QxMTgwKSB7CiAJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMTkyMDsKIAkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMjA0ODsKQEAgLTM0Myw2ICs0MTYsNyBAQAogewogCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAorCWtmcmVlKGFzdC0+ZHA1MDFfZndfYWRkcik7CiAJYXN0X21vZGVfZmluaShkZXYpOwogCWFzdF9mYmRldl9maW5pKGRldik7CiAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKQEAgLTQxMSwxNiArNDg1LDEzIEBACiAKIAl0Ym8gPSAmKCgqYm8pLT5ibyk7CiAJdHRtX2JvX3VucmVmKCZ0Ym8pOwotCWlmICh0Ym8gPT0gTlVMTCkKLQkJKmJvID0gTlVMTDsKLQorCSpibyA9IE5VTEw7CiB9CisKIHZvaWQgYXN0X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgYXN0X2JvICphc3RfYm8gPSBnZW1fdG9fYXN0X2JvKG9iaik7CiAKLQlpZiAoIWFzdF9ibykKLQkJcmV0dXJuOwogCWFzdF9ib191bnJlZigmYXN0X2JvKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbW9kZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfbW9kZS5jCmluZGV4IGE0YWZkYzguLjExNGFlZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X21vZGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9tb2RlLmMKQEAgLTExNSwxMSArMTE1LDE3IEBACiAJCWVsc2UKIAkJCXZiaW9zX21vZGUtPmVuaF90YWJsZSA9ICZyZXNfMTI4MHgxMDI0W3JlZnJlc2hfcmF0ZV9pbmRleF07CiAJCWJyZWFrOworCWNhc2UgMTM2MDoKKwkJdmJpb3NfbW9kZS0+ZW5oX3RhYmxlID0gJnJlc18xMzYweDc2OFtyZWZyZXNoX3JhdGVfaW5kZXhdOworCQlicmVhazsKIAljYXNlIDE0NDA6CiAJCXZiaW9zX21vZGUtPmVuaF90YWJsZSA9ICZyZXNfMTQ0MHg5MDBbcmVmcmVzaF9yYXRlX2luZGV4XTsKIAkJYnJlYWs7CiAJY2FzZSAxNjAwOgotCQl2Ymlvc19tb2RlLT5lbmhfdGFibGUgPSAmcmVzXzE2MDB4MTIwMFtyZWZyZXNoX3JhdGVfaW5kZXhdOworCQlpZiAoY3J0Yy0+bW9kZS5jcnRjX3ZkaXNwbGF5ID09IDkwMCkKKwkJCXZiaW9zX21vZGUtPmVuaF90YWJsZSA9ICZyZXNfMTYwMHg5MDBbcmVmcmVzaF9yYXRlX2luZGV4XTsKKwkJZWxzZQorCQkJdmJpb3NfbW9kZS0+ZW5oX3RhYmxlID0gJnJlc18xNjAweDEyMDBbcmVmcmVzaF9yYXRlX2luZGV4XTsKIAkJYnJlYWs7CiAJY2FzZSAxNjgwOgogCQl2Ymlvc19tb2RlLT5lbmhfdGFibGUgPSAmcmVzXzE2ODB4MTA1MFtyZWZyZXNoX3JhdGVfaW5kZXhdOwpAQCAtMTc1LDE0ICsxODEsMTcgQEAKIAkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDhkLCByZWZyZXNoX3JhdGVfaW5kZXggJiAweGZmKTsKIAkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDhlLCBtb2RlX2lkICYgMHhmZik7CiAKLQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDkxLCAweGE4KTsKLQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDkyLCBjcnRjLT5wcmltYXJ5LT5mYi0+Yml0c19wZXJfcGl4ZWwpOwotCQlhc3Rfc2V0X2luZGV4X3JlZyhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OTMsIGFkanVzdGVkX21vZGUtPmNsb2NrIC8gMTAwMCk7Ci0JCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5NCwgYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oZGlzcGxheSk7Ci0JCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5NSwgYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oZGlzcGxheSA+PiA4KTsKKwkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDkxLCAweDAwKTsKKwkJaWYgKHZiaW9zX21vZGUtPmVuaF90YWJsZS0+ZmxhZ3MgJiBOZXdNb2RlSW5mbykgeworCQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDkxLCAweGE4KTsKKwkJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5MiwgY3J0Yy0+cHJpbWFyeS0+ZmItPmJpdHNfcGVyX3BpeGVsKTsKKwkJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5MywgYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgLyAxMDAwKTsKKwkJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5NCwgYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oZGlzcGxheSk7CisJCQlhc3Rfc2V0X2luZGV4X3JlZyhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4OTUsIGFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXkgPj4gOCk7CiAKLQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDk2LCBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5KTsKLQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDk3LCBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5ID4+IDgpOworCQkJYXN0X3NldF9pbmRleF9yZWcoYXN0LCBBU1RfSU9fQ1JUQ19QT1JULCAweDk2LCBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5KTsKKwkJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHg5NywgYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxheSA+PiA4KTsKKwkJfQogCX0KIAogCXJldHVybiB0cnVlOwpAQCAtMzg5LDcgKzM5OCw3IEBACiAJYXN0X3NldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4YTgsIDB4ZmQsIGpyZWdBOCk7CiAKIAkvKiBTZXQgVGhyZXNob2xkICovCi0JaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKSB7CisJaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwIHx8IGFzdC0+Y2hpcCA9PSBBU1QyNDAwKSB7CiAJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhhNywgMHg3OCk7CiAJCWFzdF9zZXRfaW5kZXhfcmVnKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhhNiwgMHg2MCk7CiAJfSBlbHNlIGlmIChhc3QtPmNoaXAgPT0gQVNUMjEwMCB8fApAQCAtNDUxLDkgKzQ2MCwxMyBAQAogCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgogCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgogCQlhc3Rfc2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX1NFUV9QT1JULCAweDEsIDB4ZGYsIDApOworCQlpZiAoYXN0LT50eF9jaGlwX3R5cGUgPT0gQVNUX1RYX0RQNTAxKQorCQkJYXN0X3NldF9kcDUwMV92aWRlb19vdXRwdXQoY3J0Yy0+ZGV2LCAxKTsKIAkJYXN0X2NydGNfbG9hZF9sdXQoY3J0Yyk7CiAJCWJyZWFrOwogCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCWlmIChhc3QtPnR4X2NoaXBfdHlwZSA9PSBBU1RfVFhfRFA1MDEpCisJCQlhc3Rfc2V0X2RwNTAxX3ZpZGVvX291dHB1dChjcnRjLT5kZXYsIDApOwogCQlhc3Rfc2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX1NFUV9QT1JULCAweDEsIDB4ZGYsIDB4MjApOwogCQlicmVhazsKIAl9CkBAIC03MjksMTAgKzc0MiwyNCBAQAogc3RhdGljIGludCBhc3RfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGFzdF9jb25uZWN0b3IgKmFzdF9jb25uZWN0b3IgPSB0b19hc3RfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGFzdF9wcml2YXRlICphc3QgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGVkaWQgKmVkaWQ7CiAJaW50IHJldDsKKwlib29sIGZsYWdzID0gZmFsc2U7CisJaWYgKGFzdC0+dHhfY2hpcF90eXBlID09IEFTVF9UWF9EUDUwMSkgeworCQlhc3QtPmRwNTAxX21heGNsayA9IDB4ZmY7CisJCWVkaWQgPSBrbWFsbG9jKDEyOCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZWRpZCkKKwkJCXJldHVybiAtRU5PTUVNOwogCi0JZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZhc3RfY29ubmVjdG9yLT5pMmMtPmFkYXB0ZXIpOworCQlmbGFncyA9IGFzdF9kcDUwMV9yZWFkX2VkaWQoY29ubmVjdG9yLT5kZXYsICh1OCAqKWVkaWQpOworCQlpZiAoZmxhZ3MpCisJCQlhc3QtPmRwNTAxX21heGNsayA9IGFzdF9nZXRfZHA1MDFfbWF4X2Nsayhjb25uZWN0b3ItPmRldik7CisJCWVsc2UKKwkJCWtmcmVlKGVkaWQpOworCX0KKwlpZiAoIWZsYWdzKQorCQllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmFzdF9jb25uZWN0b3ItPmkyYy0+YWRhcHRlcik7CiAJaWYgKGVkaWQpIHsKIAkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KCZhc3RfY29ubmVjdG9yLT5iYXNlLCBlZGlkKTsKIAkJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7CkBAIC03NDYsNyArNzczLDU2IEBACiBzdGF0aWMgaW50IGFzdF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewotCXJldHVybiBNT0RFX09LOworCXN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCWludCBmbGFncyA9IE1PREVfTk9NT0RFOworCXVpbnQzMl90IGp0ZW1wOworCisJaWYgKGFzdC0+c3VwcG9ydF93aWRlX3NjcmVlbikgeworCQlpZiAoKG1vZGUtPmhkaXNwbGF5ID09IDE2ODApICYmIChtb2RlLT52ZGlzcGxheSA9PSAxMDUwKSkKKwkJCXJldHVybiBNT0RFX09LOworCQlpZiAoKG1vZGUtPmhkaXNwbGF5ID09IDEyODApICYmIChtb2RlLT52ZGlzcGxheSA9PSA4MDApKQorCQkJcmV0dXJuIE1PREVfT0s7CisJCWlmICgobW9kZS0+aGRpc3BsYXkgPT0gMTQ0MCkgJiYgKG1vZGUtPnZkaXNwbGF5ID09IDkwMCkpCisJCQlyZXR1cm4gTU9ERV9PSzsKKwkJaWYgKChtb2RlLT5oZGlzcGxheSA9PSAxMzYwKSAmJiAobW9kZS0+dmRpc3BsYXkgPT0gNzY4KSkKKwkJCXJldHVybiBNT0RFX09LOworCQlpZiAoKG1vZGUtPmhkaXNwbGF5ID09IDE2MDApICYmIChtb2RlLT52ZGlzcGxheSA9PSA5MDApKQorCQkJcmV0dXJuIE1PREVfT0s7CisKKwkJaWYgKChhc3QtPmNoaXAgPT0gQVNUMjEwMCkgfHwgKGFzdC0+Y2hpcCA9PSBBU1QyMjAwKSB8fCAoYXN0LT5jaGlwID09IEFTVDIzMDApIHx8IChhc3QtPmNoaXAgPT0gQVNUMjQwMCkgfHwgKGFzdC0+Y2hpcCA9PSBBU1QxMTgwKSkgeworCQkJaWYgKChtb2RlLT5oZGlzcGxheSA9PSAxOTIwKSAmJiAobW9kZS0+dmRpc3BsYXkgPT0gMTA4MCkpCisJCQkJcmV0dXJuIE1PREVfT0s7CisKKwkJCWlmICgobW9kZS0+aGRpc3BsYXkgPT0gMTkyMCkgJiYgKG1vZGUtPnZkaXNwbGF5ID09IDEyMDApKSB7CisJCQkJanRlbXAgPSBhc3RfZ2V0X2luZGV4X3JlZ19tYXNrKGFzdCwgQVNUX0lPX0NSVENfUE9SVCwgMHhkMSwgMHhmZik7CisJCQkJaWYgKGp0ZW1wICYgMHgwMSkKKwkJCQkJcmV0dXJuIE1PREVfTk9NT0RFOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIE1PREVfT0s7CisJCQl9CisJCX0KKwl9CisJc3dpdGNoIChtb2RlLT5oZGlzcGxheSkgeworCWNhc2UgNjQwOgorCQlpZiAobW9kZS0+dmRpc3BsYXkgPT0gNDgwKSBmbGFncyA9IE1PREVfT0s7CisJCWJyZWFrOworCWNhc2UgODAwOgorCQlpZiAobW9kZS0+dmRpc3BsYXkgPT0gNjAwKSBmbGFncyA9IE1PREVfT0s7CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJaWYgKG1vZGUtPnZkaXNwbGF5ID09IDc2OCkgZmxhZ3MgPSBNT0RFX09LOworCQlicmVhazsKKwljYXNlIDEyODA6CisJCWlmIChtb2RlLT52ZGlzcGxheSA9PSAxMDI0KSBmbGFncyA9IE1PREVfT0s7CisJCWJyZWFrOworCWNhc2UgMTYwMDoKKwkJaWYgKG1vZGUtPnZkaXNwbGF5ID09IDEyMDApIGZsYWdzID0gTU9ERV9PSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZsYWdzOworCX0KKworCXJldHVybiBmbGFnczsKIH0KIAogc3RhdGljIHZvaWQgYXN0X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9wb3N0LmMgYi9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF9wb3N0LmMKaW5kZXggNjM1ZjZmZi4uMzhkNDM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FzdC9hc3RfcG9zdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X3Bvc3QuYwpAQCAtNzgsNyArNzgsNyBAQAogCWZvciAoaSA9IDB4ODE7IGkgPD0gMHg4ZjsgaSsrKQogCQlhc3Rfc2V0X2luZGV4X3JlZyhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIGksIDB4MDApOwogCi0JaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKSB7CisJaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwIHx8IGFzdC0+Y2hpcCA9PSBBU1QyNDAwKSB7CiAJCWlmIChkZXYtPnBkZXYtPnJldmlzaW9uID49IDB4MjApCiAJCQlleHRfcmVnX2luZm8gPSBleHRyZWdpbmZvX2FzdDIzMDA7CiAJCWVsc2UKQEAgLTEwMiwyMyArMTAyLDMyIEBACiAKIAkvKiBFbmFibGUgUkFNREFDIGZvciBBMSAqLwogCXJlZyA9IDB4MDQ7Ci0JaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKQorCWlmIChhc3QtPmNoaXAgPT0gQVNUMjMwMCB8fCBhc3QtPmNoaXAgPT0gQVNUMjQwMCkKIAkJcmVnIHw9IDB4MjA7CiAJYXN0X3NldF9pbmRleF9yZWdfbWFzayhhc3QsIEFTVF9JT19DUlRDX1BPUlQsIDB4YjYsIDB4ZmYsIHJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIG1pbmR3bShzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIHIpCit1MzIgYXN0X21pbmR3bShzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIHIpCiB7CisJdWludDMyX3QgZGF0YTsKKwogCWFzdF93cml0ZTMyKGFzdCwgMHhmMDA0LCByICYgMHhmZmZmMDAwMCk7CiAJYXN0X3dyaXRlMzIoYXN0LCAweGYwMDAsIDB4MSk7CiAKKwlkbyB7CisJCWRhdGEgPSBhc3RfcmVhZDMyKGFzdCwgMHhmMDA0KSAmIDB4ZmZmZjAwMDA7CisJfSB3aGlsZSAoZGF0YSAhPSAociAmIDB4ZmZmZjAwMDApKTsKIAlyZXR1cm4gYXN0X3JlYWQzMihhc3QsIDB4MTAwMDAgKyAociAmIDB4MDAwMGZmZmYpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1vdXRkd20oc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHUzMiByLCB1MzIgdikKK3ZvaWQgYXN0X21vdXRkd20oc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHUzMiByLCB1MzIgdikKIHsKKwl1aW50MzJfdCBkYXRhOwogCWFzdF93cml0ZTMyKGFzdCwgMHhmMDA0LCByICYgMHhmZmZmMDAwMCk7CiAJYXN0X3dyaXRlMzIoYXN0LCAweGYwMDAsIDB4MSk7CisJZG8geworCQlkYXRhID0gYXN0X3JlYWQzMihhc3QsIDB4ZjAwNCkgJiAweGZmZmYwMDAwOworCX0gd2hpbGUgKGRhdGEgIT0gKHIgJiAweGZmZmYwMDAwKSk7CiAJYXN0X3dyaXRlMzIoYXN0LCAweDEwMDAwICsgKHIgJiAweDAwMDBmZmZmKSwgdik7CiB9CiAKQEAgLTE1NCwyOCArMTYzLDI4IEBACiB7CiAJdTMyIGRhdGEsIHRpbWVvdXQ7CiAKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDEgfCAoZGF0YWdlbiA8PCAzKSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDEgfCAoZGF0YWdlbiA8PCAzKSk7CiAJdGltZW91dCA9IDA7CiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDQwOworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHg0MDsKIAkJaWYgKCsrdGltZW91dCA+IFRJTUVPVVRfQVNUMjE1MCkgewotCQkJbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOworCQkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKIAkJCXJldHVybiAweGZmZmZmZmZmOwogCQl9CiAJfSB3aGlsZSAoIWRhdGEpOwotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMyB8IChkYXRhZ2VuIDw8IDMpKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMyB8IChkYXRhZ2VuIDw8IDMpKTsKIAl0aW1lb3V0ID0gMDsKIAlkbyB7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFlNmUwMDcwKSAmIDB4NDA7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDQwOwogCQlpZiAoKyt0aW1lb3V0ID4gVElNRU9VVF9BU1QyMTUwKSB7Ci0JCQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CisJCQlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOwogCQkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAJCX0KIAl9IHdoaWxlICghZGF0YSk7Ci0JZGF0YSA9IChtaW5kd20oYXN0LCAweDFlNmUwMDcwKSAmIDB4ODApID4+IDc7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOworCWRhdGEgPSAoYXN0X21pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHg4MCkgPj4gNzsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOwogCXJldHVybiBkYXRhOwogfQogCkBAIC0xODQsMTggKzE5MywxOCBAQAogewogCXUzMiBkYXRhLCB0aW1lb3V0OwogCi0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDA1IHwgKGRhdGFnZW4gPDwgMykpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDA1IHwgKGRhdGFnZW4gPDwgMykpOwogCXRpbWVvdXQgPSAwOwogCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHg0MDsKKwkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFlNmUwMDcwKSAmIDB4NDA7CiAJCWlmICgrK3RpbWVvdXQgPiBUSU1FT1VUX0FTVDIxNTApIHsKLQkJCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKKwkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CiAJCQlyZXR1cm4gMHhmZmZmZmZmZjsKIAkJfQogCX0gd2hpbGUgKCFkYXRhKTsKLQlkYXRhID0gKG1pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHg4MCkgPj4gNzsKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CisJZGF0YSA9IChhc3RfbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDgwKSA+PiA3OworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CiAJcmV0dXJuIGRhdGE7CiB9CiAjZW5kaWYKQEAgLTIxNSw3ICsyMjQsNyBAQAogCXUzMiBwYXRjbnQsIGxvb3A7CiAKIAlmb3IgKHBhdGNudCA9IDA7IHBhdGNudCA8IENCUl9QQVROVU1fQVNUMjE1MDsgcGF0Y250KyspIHsKLQkJbW91dGR3bShhc3QsIDB4MWU2ZTAwN2MsIHBhdHRlcm5fQVNUMjE1MFtwYXRjbnRdKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDdjLCBwYXR0ZXJuX0FTVDIxNTBbcGF0Y250XSk7CiAJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBDQlJfUEFTU05VTV9BU1QyMTUwOyBsb29wKyspIHsKIAkJCWlmIChjYnJ0ZXN0X2FzdDIxNTAoYXN0KSkKIAkJCQlicmVhazsKQEAgLTIzNyw3ICsyNDYsNyBAQAogCXBhc3NjbnQgPSAwOwogCiAJZm9yIChkbGxpID0gMDsgZGxsaSA8IDEwMDsgZGxsaSsrKSB7Ci0JCW1vdXRkd20oYXN0LCAweDFlNmUwMDY4LCBkbGxpIHwgKGRsbGkgPDwgOCkgfCAoZGxsaSA8PCAxNikgfCAoZGxsaSA8PCAyNCkpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNjgsIGRsbGkgfCAoZGxsaSA8PCA4KSB8IChkbGxpIDw8IDE2KSB8IChkbGxpIDw8IDI0KSk7CiAJCWRhdGEgPSBjYnJzY2FuX2FzdDIxNTAoYXN0LCBidXN3KTsKIAkJaWYgKGRhdGEgIT0gMCkgewogCQkJaWYgKGRhdGEgJiAweDEpIHsKQEAgLTI1NCw3ICsyNjMsNyBAQAogCQlnb3RvIGNicl9zdGFydDsKIAogCWRsbGkgPSBkbGxfbWluWzBdICsgKCgoZGxsX21heFswXSAtIGRsbF9taW5bMF0pICogNykgPj4gNCk7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNjgsIGRsbGkgfCAoZGxsaSA8PCA4KSB8IChkbGxpIDw8IDE2KSB8IChkbGxpIDw8IDI0KSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDY4LCBkbGxpIHwgKGRsbGkgPDwgOCkgfCAoZGxsaSA8PCAxNikgfCAoZGxsaSA8PCAyNCkpOwogfQogCiAKQEAgLTM2NSwxMCArMzc0LDEyIEBACiAJYXN0X29wZW5fa2V5KGFzdCk7CiAJYXN0X3NldF9kZWZfZXh0X3JlZyhkZXYpOwogCi0JaWYgKGFzdC0+Y2hpcCA9PSBBU1QyMzAwKQorCWlmIChhc3QtPmNoaXAgPT0gQVNUMjMwMCB8fCBhc3QtPmNoaXAgPT0gQVNUMjQwMCkKIAkJYXN0X2luaXRfZHJhbV8yMzAwKGRldik7CiAJZWxzZQogCQlhc3RfaW5pdF9kcmFtX3JlZyhkZXYpOworCisJYXN0X2luaXRfM3JkdHgoZGV2KTsKIH0KIAogLyogQVNUIDIzMDAgRFJBTSBzZXR0aW5ncyAqLwpAQCAtNDAzLDYgKzQxNCw3IEBACiAvKgogICogRFFTSSBETEwgQ0JSIFNldHRpbmcKICAqLworI2RlZmluZSBDQlJfU0laRTAgICAgICAgICAgICAoKDEgIDw8IDEwKSAtIDEpCiAjZGVmaW5lIENCUl9TSVpFMSAgICAgICAgICAgICgoNCAgPDwgMTApIC0gMSkKICNkZWZpbmUgQ0JSX1NJWkUyICAgICAgICAgICAgKCg2NCA8PCAxMCkgLSAxKQogI2RlZmluZSBDQlJfUEFTU05VTSAgICAgICAgICA1CkBAIC00MjMsODggKzQzNSw4NCBAQAogCTB4N0M2MUQyNTMKIH07CiAKLSNpZiAwIC8qIHVudXNlZCBpbiBERFgsIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgKi8KIHN0YXRpYyBpbnQgbW1jX3Rlc3RfYnVyc3Qoc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHUzMiBkYXRhZ2VuKQogewogCXUzMiBkYXRhLCB0aW1lb3V0OwogCi0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMGMxIHwgKGRhdGFnZW4gPDwgMykpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMGMxIHwgKGRhdGFnZW4gPDwgMykpOwogCXRpbWVvdXQgPSAwOwogCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHgzMDAwOworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTAwNzApICYgMHgzMDAwOwogCQlpZiAoZGF0YSAmIDB4MjAwMCkgewogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKCsrdGltZW91dCA+IFRJTUVPVVQpIHsKLQkJCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKKwkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0gd2hpbGUgKCFkYXRhKTsKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IG1tY190ZXN0X2J1cnN0MihzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIGRhdGFnZW4pCiB7CiAJdTMyIGRhdGEsIHRpbWVvdXQ7CiAKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwNDEgfCAoZGF0YWdlbiA8PCAzKSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwNDEgfCAoZGF0YWdlbiA8PCAzKSk7CiAJdGltZW91dCA9IDA7CiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDEwMDA7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDEwMDA7CiAJCWlmICgrK3RpbWVvdXQgPiBUSU1FT1VUKSB7Ci0JCQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKKwkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gd2hpbGUgKCFkYXRhKTsKLQlkYXRhID0gbWluZHdtKGFzdCwgMHgxZTZlMDA3OCk7CisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFlNmUwMDc4KTsKIAlkYXRhID0gKGRhdGEgfCAoZGF0YSA+PiAxNikpICYgMHhmZmZmOwotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKIAlyZXR1cm4gZGF0YTsKIH0KIAotI2lmIDAgLyogVW51c2VkIGluIEREWCBoZXJlIGZvciBjb21wbGV0ZW5lc3MgKi8KIHN0YXRpYyBpbnQgbW1jX3Rlc3Rfc2luZ2xlKHN0cnVjdCBhc3RfcHJpdmF0ZSAqYXN0LCB1MzIgZGF0YWdlbikKIHsKIAl1MzIgZGF0YSwgdGltZW91dDsKIAotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDBjNSB8IChkYXRhZ2VuIDw8IDMpKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDBjNSB8IChkYXRhZ2VuIDw8IDMpKTsKIAl0aW1lb3V0ID0gMDsKIAlkbyB7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFlNmUwMDcwKSAmIDB4MzAwMDsKKwkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFlNmUwMDcwKSAmIDB4MzAwMDsKIAkJaWYgKGRhdGEgJiAweDIwMDApCiAJCQlyZXR1cm4gMDsKIAkJaWYgKCsrdGltZW91dCA+IFRJTUVPVVQpIHsKLQkJCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDApOworCQkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9IHdoaWxlICghZGF0YSk7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDApOwogCXJldHVybiAxOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgbW1jX3Rlc3Rfc2luZ2xlMihzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgdTMyIGRhdGFnZW4pCiB7CiAJdTMyIGRhdGEsIHRpbWVvdXQ7CiAKLQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDUgfCAoZGF0YWdlbiA8PCAzKSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwNzAsIDB4MDAwMDAwMDUgfCAoZGF0YWdlbiA8PCAzKSk7CiAJdGltZW91dCA9IDA7CiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDEwMDA7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxZTZlMDA3MCkgJiAweDEwMDA7CiAJCWlmICgrK3RpbWVvdXQgPiBUSU1FT1VUKSB7Ci0JCQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKKwkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gd2hpbGUgKCFkYXRhKTsKLQlkYXRhID0gbWluZHdtKGFzdCwgMHgxZTZlMDA3OCk7CisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFlNmUwMDc4KTsKIAlkYXRhID0gKGRhdGEgfCAoZGF0YSA+PiAxNikpICYgMHhmZmZmOwotCW1vdXRkd20oYXN0LCAweDFlNmUwMDcwLCAweDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3MCwgMHgwKTsKIAlyZXR1cm4gZGF0YTsKIH0KIApAQCAtNTMzLDcgKzU0MSw3IEBACiAKIAlkYXRhMiA9IDM7CiAJZm9yIChwYXRjbnQgPSAwOyBwYXRjbnQgPCBDQlJfUEFUTlVNOyBwYXRjbnQrKykgewotCQltb3V0ZHdtKGFzdCwgMHgxZTZlMDA3YywgcGF0dGVybltwYXRjbnRdKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFlNmUwMDdjLCBwYXR0ZXJuW3BhdGNudF0pOwogCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQ0JSX1BBU1NOVU0yOyBsb29wKyspIHsKIAkJCWlmICgoZGF0YSA9IGNicl90ZXN0KGFzdCkpICE9IDApIHsKIAkJCQlkYXRhMiAmPSBkYXRhOwpAQCAtNTY4LDcgKzU3Niw3IEBACiAKIAlkYXRhMiA9IDB4ZmZmZjsKIAlmb3IgKHBhdGNudCA9IDA7IHBhdGNudCA8IENCUl9QQVROVU07IHBhdGNudCsrKSB7Ci0JCW1vdXRkd20oYXN0LCAweDFlNmUwMDdjLCBwYXR0ZXJuW3BhdGNudF0pOworCQlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTAwN2MsIHBhdHRlcm5bcGF0Y250XSk7CiAJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBDQlJfUEFTU05VTTI7IGxvb3ArKykgewogCQkJaWYgKChkYXRhID0gY2JyX3Rlc3QyKGFzdCkpICE9IDApIHsKIAkJCQlkYXRhMiAmPSBkYXRhOwpAQCAtNTgzLDEwNiArNTkxLDM1IEBACiAJcmV0dXJuIGRhdGEyOwogfQogCi0jaWYgMCAvKiB1bnVzZWQgaW4gRERYIC0gYWRkZWQgZm9yIGNvbXBsZXRlbmVzcyAqLwotc3RhdGljIHZvaWQgZmluZXR1bmVEUUkoc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHN0cnVjdCBhc3QyMzAwX2RyYW1fcGFyYW0gKnBhcmFtKQorc3RhdGljIHUzMiBjYnJfdGVzdDMoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCiB7Ci0JdTMyIGdvbGRfc2FkalsyXSwgZGxsbWluWzE2XSwgZGxsbWF4WzE2XSwgZGxsaSwgZGF0YSwgY250LCBtYXNrLCBwYXNzY250OworCWlmICghbW1jX3Rlc3RfYnVyc3QoYXN0LCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFtbWNfdGVzdF9zaW5nbGUoYXN0LCAwKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CiAKLQlnb2xkX3NhZGpbMF0gPSAobWluZHdtKGFzdCwgMHgxRTZFMDAyNCkgPj4gMTYpICYgMHhmZmZmOwotCWdvbGRfc2FkalsxXSA9IGdvbGRfc2FkalswXSA+PiA4OwotCWdvbGRfc2FkalswXSA9IGdvbGRfc2FkalswXSAmIDB4ZmY7Ci0JZ29sZF9zYWRqWzBdID0gKGdvbGRfc2FkalswXSArIGdvbGRfc2FkalsxXSkgPj4gMTsKLQlnb2xkX3NhZGpbMV0gPSBnb2xkX3NhZGpbMF07Ci0KLQlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykgewotCQlkbGxtaW5bY250XSA9IDB4ZmY7Ci0JCWRsbG1heFtjbnRdID0gMHgwOwotCX0KLQlwYXNzY250ID0gMDsKLQlmb3IgKGRsbGkgPSAwOyBkbGxpIDwgNzY7IGRsbGkrKykgewotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2OCwgMHgwMDAwMTQwMCB8IChkbGxpIDw8IDE2KSB8IChkbGxpIDw8IDI0KSk7Ci0JCS8qIFdhaXQgRFFTSSBsYXRjaCBwaGFzZSBjYWxpYnJhdGlvbiAqLwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3NCwgMHgwMDAwMDAxMCk7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAzKTsKLQkJZG8gewotCQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwNzApOwotCQl9IHdoaWxlICghKGRhdGEgJiAweDAwMDAxMDAwKSk7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAwKTsKLQotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3NCwgQ0JSX1NJWkUxKTsKLQkJZGF0YSA9IGNicl9zY2FuMihhc3QpOwotCQlpZiAoZGF0YSAhPSAwKSB7Ci0JCQltYXNrID0gMHgwMDAxMDAwMTsKLQkJCWZvciAoY250ID0gMDsgY250IDwgMTY7IGNudCsrKSB7Ci0JCQkJaWYgKGRhdGEgJiBtYXNrKSB7Ci0JCQkJCWlmIChkbGxtaW5bY250XSA+IGRsbGkpIHsKLQkJCQkJCWRsbG1pbltjbnRdID0gZGxsaTsKLQkJCQkJfQotCQkJCQlpZiAoZGxsbWF4W2NudF0gPCBkbGxpKSB7Ci0JCQkJCQlkbGxtYXhbY250XSA9IGRsbGk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWFzayA8PD0gMTsKLQkJCX0KLQkJCXBhc3NjbnQrKzsKLQkJfSBlbHNlIGlmIChwYXNzY250ID49IENCUl9USFJFU0hPTEQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWRhdGEgPSAwOwotCWZvciAoY250ID0gMDsgY250IDwgODsgY250KyspIHsKLQkJZGF0YSA+Pj0gMzsKLQkJaWYgKChkbGxtYXhbY250XSA+IGRsbG1pbltjbnRdKSAmJiAoKGRsbG1heFtjbnRdIC0gZGxsbWluW2NudF0pID49IENCUl9USFJFU0hPTEQpKSB7Ci0JCQlkbGxpID0gKGRsbG1pbltjbnRdICsgZGxsbWF4W2NudF0pID4+IDE7Ci0JCQlpZiAoZ29sZF9zYWRqWzBdID49IGRsbGkpIHsKLQkJCQlkbGxpID0gKGdvbGRfc2FkalswXSAtIGRsbGkpID4+IDE7Ci0JCQkJaWYgKGRsbGkgPiAzKSB7Ci0JCQkJCWRsbGkgPSAzOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZGxsaSA9IChkbGxpIC0gZ29sZF9zYWRqWzBdKSA+PiAxOwotCQkJCWlmIChkbGxpID4gNCkgewotCQkJCQlkbGxpID0gNDsKLQkJCQl9Ci0JCQkJZGxsaSA9ICg4IC0gZGxsaSkgJiAweDc7Ci0JCQl9Ci0JCQlkYXRhIHw9IGRsbGkgPDwgMjE7Ci0JCX0KLQl9Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwODAsIGRhdGEpOwotCi0JZGF0YSA9IDA7Ci0JZm9yIChjbnQgPSA4OyBjbnQgPCAxNjsgY250KyspIHsKLQkJZGF0YSA+Pj0gMzsKLQkJaWYgKChkbGxtYXhbY250XSA+IGRsbG1pbltjbnRdKSAmJiAoKGRsbG1heFtjbnRdIC0gZGxsbWluW2NudF0pID49IENCUl9USFJFU0hPTEQpKSB7Ci0JCQlkbGxpID0gKGRsbG1pbltjbnRdICsgZGxsbWF4W2NudF0pID4+IDE7Ci0JCQlpZiAoZ29sZF9zYWRqWzFdID49IGRsbGkpIHsKLQkJCQlkbGxpID0gKGdvbGRfc2FkalsxXSAtIGRsbGkpID4+IDE7Ci0JCQkJaWYgKGRsbGkgPiAzKSB7Ci0JCQkJCWRsbGkgPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRsbGkgPSAoZGxsaSAtIDEpICYgMHg3OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZGxsaSA9IChkbGxpIC0gZ29sZF9zYWRqWzFdKSA+PiAxOwotCQkJCWRsbGkgKz0gMTsKLQkJCQlpZiAoZGxsaSA+IDQpIHsKLQkJCQkJZGxsaSA9IDQ7Ci0JCQkJfQotCQkJCWRsbGkgPSAoOCAtIGRsbGkpICYgMHg3OwotCQkJfQotCQkJZGF0YSB8PSBkbGxpIDw8IDIxOwotCQl9Ci0JfQotCW1vdXRkd20oYXN0LCAweDFFNkUwMDg0LCBkYXRhKTsKLQotfSAvKiBmaW5ldHVuZURRSSAqLwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGZpbmV0dW5lRFFJX0woc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHN0cnVjdCBhc3QyMzAwX2RyYW1fcGFyYW0gKnBhcmFtKQorc3RhdGljIHUzMiBjYnJfc2NhbjMoc3RydWN0IGFzdF9wcml2YXRlICphc3QpCiB7Ci0JdTMyIGdvbGRfc2FkalsyXSwgZGxsbWluWzE2XSwgZGxsbWF4WzE2XSwgZGxsaSwgZGF0YSwgY250LCBtYXNrLCBwYXNzY250OworCXUzMiBwYXRjbnQsIGxvb3A7CiAKKwlmb3IgKHBhdGNudCA9IDA7IHBhdGNudCA8IENCUl9QQVROVU07IHBhdGNudCsrKSB7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxZTZlMDA3YywgcGF0dGVybltwYXRjbnRdKTsKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDI7IGxvb3ArKykgeworCQkJaWYgKGNicl90ZXN0Myhhc3QpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChsb29wID09IDIpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBib29sIGZpbmV0dW5lRFFJX0woc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHN0cnVjdCBhc3QyMzAwX2RyYW1fcGFyYW0gKnBhcmFtKQoreworCXUzMiBnb2xkX3NhZGpbMl0sIGRsbG1pblsxNl0sIGRsbG1heFsxNl0sIGRsbGksIGRhdGEsIGNudCwgbWFzaywgcGFzc2NudCwgcmV0cnkgPSAwOworCWJvb2wgc3RhdHVzID0gZmFsc2U7CiBGSU5FVFVORV9TVEFSVDoKIAlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykgewogCQlkbGxtaW5bY250XSA9IDB4ZmY7CkBAIC02OTAsMTYgKzYyNyw4IEBACiAJfQogCXBhc3NjbnQgPSAwOwogCWZvciAoZGxsaSA9IDA7IGRsbGkgPCA3NjsgZGxsaSsrKSB7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDY4LCAweDAwMDAxNDAwIHwgKGRsbGkgPDwgMTYpIHwgKGRsbGkgPDwgMjQpKTsKLQkJLyogV2FpdCBEUVNJIGxhdGNoIHBoYXNlIGNhbGlicmF0aW9uICovCi0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDc0LCAweDAwMDAwMDEwKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDMpOwotCQlkbyB7Ci0JCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7Ci0JCX0gd2hpbGUgKCEoZGF0YSAmIDB4MDAwMDEwMDApKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDApOwotCi0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDc0LCBDQlJfU0laRTEpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIDB4MDAwMDE0MDAgfCAoZGxsaSA8PCAxNikgfCAoZGxsaSA8PCAyNCkpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIENCUl9TSVpFMSk7CiAJCWRhdGEgPSBjYnJfc2NhbjIoYXN0KTsKIAkJaWYgKGRhdGEgIT0gMCkgewogCQkJbWFzayA9IDB4MDAwMTAwMDE7CkBAIC03MjcsOSArNjU2LDEzIEBACiAJCQlwYXNzY250Kys7CiAJCX0KIAl9CisJaWYgKHJldHJ5KysgPiAxMCkKKwkJZ290byBGSU5FVFVORV9ET05FOwogCWlmIChwYXNzY250ICE9IDE2KSB7CiAJCWdvdG8gRklORVRVTkVfU1RBUlQ7CiAJfQorCXN0YXR1cyA9IHRydWU7CitGSU5FVFVORV9ET05FOgogCWdvbGRfc2FkalswXSA9IGdvbGRfc2FkalswXSA+PiA0OwogCWdvbGRfc2FkalsxXSA9IGdvbGRfc2FkalswXTsKIApAQCAtNzUzLDcgKzY4Niw3IEBACiAJCQlkYXRhIHw9IGRsbGkgPDwgMjE7CiAJCX0KIAl9Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwODAsIGRhdGEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA4MCwgZGF0YSk7CiAKIAlkYXRhID0gMDsKIAlmb3IgKGNudCA9IDg7IGNudCA8IDE2OyBjbnQrKykgewpAQCAtNzc4LDE2MiArNzExLDExNiBAQAogCQkJZGF0YSB8PSBkbGxpIDw8IDIxOwogCQl9CiAJfQotCW1vdXRkd20oYXN0LCAweDFFNkUwMDg0LCBkYXRhKTsKLQorCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA4NCwgZGF0YSk7CisJcmV0dXJuIHN0YXR1czsKIH0gLyogZmluZXR1bmVEUUlfTCAqLwogCi1zdGF0aWMgdm9pZCBmaW5ldHVuZURRSV9MMihzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgc3RydWN0IGFzdDIzMDBfZHJhbV9wYXJhbSAqcGFyYW0pCitzdGF0aWMgdm9pZCBmaW5ldHVuZURRU0koc3RydWN0IGFzdF9wcml2YXRlICphc3QpCiB7Ci0JdTMyIGdvbGRfc2FkalsyXSwgZGxsbWluWzE2XSwgZGxsbWF4WzE2XSwgZGxsaSwgZGF0YSwgY250LCBtYXNrLCBwYXNzY250LCBkYXRhMjsKKwl1MzIgZGxsaSwgZHFzaXAsIGRxaWRseTsKKwl1MzIgcmVnX21jcjE4LCByZWdfbWNyMGMsIHBhc3NjbnRbMl0sIGRpZmY7CisJdTMyIGdfZHFpZGx5LCBnX2Rxc2lwLCBnX21hcmdpbiwgZ19zaWRlOworCXUxNiBwYXNzWzMyXVsyXVsyXTsKKwljaGFyIHRhZ1syXVs3Nl07CiAKLQlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykgewotCQlkbGxtaW5bY250XSA9IDB4ZmY7Ci0JCWRsbG1heFtjbnRdID0gMHgwOwotCX0KLQlwYXNzY250ID0gMDsKKwkvKiBEaXNhYmxlIERRSSBDQlIgKi8KKwlyZWdfbWNyMGMgID0gYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwMEMpOworCXJlZ19tY3IxOCAgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAxOCk7CisJcmVnX21jcjE4ICY9IDB4MDAwMGZmZmY7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCByZWdfbWNyMTgpOworCiAJZm9yIChkbGxpID0gMDsgZGxsaSA8IDc2OyBkbGxpKyspIHsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIDB4MDAwMDE0MDAgfCAoZGxsaSA8PCAxNikgfCAoZGxsaSA8PCAyNCkpOwotCQkvKiBXYWl0IERRU0kgbGF0Y2ggcGhhc2UgY2FsaWJyYXRpb24gKi8KLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIDB4MDAwMDAwMTApOwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMyk7Ci0JCWRvIHsKLQkJCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDcwKTsKLQkJfSB3aGlsZSAoIShkYXRhICYgMHgwMDAwMTAwMCkpOwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7Ci0KLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIENCUl9TSVpFMik7Ci0JCWRhdGEgPSBjYnJfc2NhbjIoYXN0KTsKLQkJaWYgKGRhdGEgIT0gMCkgewotCQkJbWFzayA9IDB4MDAwMTAwMDE7Ci0JCQlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykgewotCQkJCWlmIChkYXRhICYgbWFzaykgewotCQkJCQlpZiAoZGxsbWluW2NudF0gPiBkbGxpKSB7Ci0JCQkJCQlkbGxtaW5bY250XSA9IGRsbGk7Ci0JCQkJCX0KLQkJCQkJaWYgKGRsbG1heFtjbnRdIDwgZGxsaSkgewotCQkJCQkJZGxsbWF4W2NudF0gPSBkbGxpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1hc2sgPDw9IDE7Ci0JCQl9Ci0JCQlwYXNzY250Kys7Ci0JCX0gZWxzZSBpZiAocGFzc2NudCA+PSBDQlJfVEhSRVNIT0xEMikgewotCQkJYnJlYWs7Ci0JCX0KKwkJdGFnWzBdW2RsbGldID0gMHgwOworCQl0YWdbMV1bZGxsaV0gPSAweDA7CiAJfQotCWdvbGRfc2FkalswXSA9IDB4MDsKLQlnb2xkX3NhZGpbMV0gPSAweEZGOwotCWZvciAoY250ID0gMDsgY250IDwgODsgY250KyspIHsKLQkJaWYgKChkbGxtYXhbY250XSA+IGRsbG1pbltjbnRdKSAmJiAoKGRsbG1heFtjbnRdIC0gZGxsbWluW2NudF0pID49IENCUl9USFJFU0hPTEQyKSkgewotCQkJaWYgKGdvbGRfc2FkalswXSA8IGRsbG1pbltjbnRdKSB7Ci0JCQkJZ29sZF9zYWRqWzBdID0gZGxsbWluW2NudF07Ci0JCQl9Ci0JCQlpZiAoZ29sZF9zYWRqWzFdID4gZGxsbWF4W2NudF0pIHsKLQkJCQlnb2xkX3NhZGpbMV0gPSBkbGxtYXhbY250XTsKLQkJCX0KLQkJfQorCWZvciAoZHFpZGx5ID0gMDsgZHFpZGx5IDwgMzI7IGRxaWRseSsrKSB7CisJCXBhc3NbZHFpZGx5XVswXVswXSA9IDB4ZmY7CisJCXBhc3NbZHFpZGx5XVswXVsxXSA9IDB4MDsKKwkJcGFzc1tkcWlkbHldWzFdWzBdID0gMHhmZjsKKwkJcGFzc1tkcWlkbHldWzFdWzFdID0gMHgwOwogCX0KLQlnb2xkX3NhZGpbMF0gPSAoZ29sZF9zYWRqWzFdICsgZ29sZF9zYWRqWzBdKSA+PiAxOwotCWdvbGRfc2FkalsxXSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwODApOwotCi0JZGF0YSA9IDA7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCA4OyBjbnQrKykgewotCQlkYXRhID4+PSAzOwotCQlkYXRhMiA9IGdvbGRfc2FkalsxXSAmIDB4NzsKLQkJZ29sZF9zYWRqWzFdID4+PSAzOwotCQlpZiAoKGRsbG1heFtjbnRdID4gZGxsbWluW2NudF0pICYmICgoZGxsbWF4W2NudF0gLSBkbGxtaW5bY250XSkgPj0gQ0JSX1RIUkVTSE9MRDIpKSB7Ci0JCQlkbGxpID0gKGRsbG1pbltjbnRdICsgZGxsbWF4W2NudF0pID4+IDE7Ci0JCQlpZiAoZ29sZF9zYWRqWzBdID49IGRsbGkpIHsKLQkJCQlkbGxpID0gKGdvbGRfc2FkalswXSAtIGRsbGkpID4+IDE7Ci0JCQkJaWYgKGRsbGkgPiAwKSB7Ci0JCQkJCWRsbGkgPSAxOwotCQkJCX0KLQkJCQlpZiAoZGF0YTIgIT0gMykgewotCQkJCQlkYXRhMiA9IChkYXRhMiArIGRsbGkpICYgMHg3OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZGxsaSA9IChkbGxpIC0gZ29sZF9zYWRqWzBdKSA+PiAxOwotCQkJCWlmIChkbGxpID4gMCkgewotCQkJCQlkbGxpID0gMTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEyICE9IDQpIHsKLQkJCQkJZGF0YTIgPSAoZGF0YTIgLSBkbGxpKSAmIDB4NzsKKwlmb3IgKGRxaWRseSA9IDA7IGRxaWRseSA8IDMyOyBkcWlkbHkrKykgeworCQlwYXNzY250WzBdID0gcGFzc2NudFsxXSA9IDA7CisJCWZvciAoZHFzaXAgPSAwOyBkcXNpcCA8IDI7IGRxc2lwKyspIHsKKwkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMCk7CisJCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIHJlZ19tY3IxOCB8IChkcWlkbHkgPDwgMTYpIHwgKGRxc2lwIDw8IDIzKSk7CisJCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMEMsIHJlZ19tY3IwYyk7CisJCQlmb3IgKGRsbGkgPSAwOyBkbGxpIDwgNzY7IGRsbGkrKykgeworCQkJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA2OCwgMHgwMDAwMTMwMCB8IChkbGxpIDw8IDE2KSB8IChkbGxpIDw8IDI0KSk7CisJCQkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAwKTsKKwkJCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIENCUl9TSVpFMCk7CisJCQkJaWYgKGNicl9zY2FuMyhhc3QpKSB7CisJCQkJCWlmIChkbGxpID09IDApCisJCQkJCQlicmVhazsKKwkJCQkJcGFzc2NudFtkcXNpcF0rKzsKKwkJCQkJdGFnW2Rxc2lwXVtkbGxpXSA9ICdQJzsKKwkJCQkJaWYgKGRsbGkgPCBwYXNzW2RxaWRseV1bZHFzaXBdWzBdKQorCQkJCQkJcGFzc1tkcWlkbHldW2Rxc2lwXVswXSA9ICh1MTYpIGRsbGk7CisJCQkJCWlmIChkbGxpID4gcGFzc1tkcWlkbHldW2Rxc2lwXVsxXSkKKwkJCQkJCXBhc3NbZHFpZGx5XVtkcXNpcF1bMV0gPSAodTE2KSBkbGxpOworCQkJCX0gZWxzZSBpZiAocGFzc2NudFtkcXNpcF0gPj0gNSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZSB7CisJCQkJCXBhc3NbZHFpZGx5XVtkcXNpcF1bMF0gPSAweGZmOworCQkJCQlwYXNzW2RxaWRseV1bZHFzaXBdWzFdID0gMHgwOwogCQkJCX0KIAkJCX0KIAkJfQotCQlkYXRhIHw9IGRhdGEyIDw8IDIxOworCQlpZiAocGFzc2NudFswXSA9PSAwICYmIHBhc3NjbnRbMV0gPT0gMCkKKwkJCWRxaWRseSsrOwogCX0KLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA4MCwgZGF0YSk7CisJLyogU2VhcmNoIG1hcmdpbiAqLworCWdfZHFpZGx5ID0gZ19kcXNpcCA9IGdfbWFyZ2luID0gZ19zaWRlID0gMDsKIAotCWdvbGRfc2FkalswXSA9IDB4MDsKLQlnb2xkX3NhZGpbMV0gPSAweEZGOwotCWZvciAoY250ID0gODsgY250IDwgMTY7IGNudCsrKSB7Ci0JCWlmICgoZGxsbWF4W2NudF0gPiBkbGxtaW5bY250XSkgJiYgKChkbGxtYXhbY250XSAtIGRsbG1pbltjbnRdKSA+PSBDQlJfVEhSRVNIT0xEMikpIHsKLQkJCWlmIChnb2xkX3NhZGpbMF0gPCBkbGxtaW5bY250XSkgewotCQkJCWdvbGRfc2FkalswXSA9IGRsbG1pbltjbnRdOwotCQkJfQotCQkJaWYgKGdvbGRfc2FkalsxXSA+IGRsbG1heFtjbnRdKSB7Ci0JCQkJZ29sZF9zYWRqWzFdID0gZGxsbWF4W2NudF07CisJZm9yIChkcWlkbHkgPSAwOyBkcWlkbHkgPCAzMjsgZHFpZGx5KyspIHsKKwkJZm9yIChkcXNpcCA9IDA7IGRxc2lwIDwgMjsgZHFzaXArKykgeworCQkJaWYgKHBhc3NbZHFpZGx5XVtkcXNpcF1bMF0gPiBwYXNzW2RxaWRseV1bZHFzaXBdWzFdKQorCQkJCWNvbnRpbnVlOworCQkJZGlmZiA9IHBhc3NbZHFpZGx5XVtkcXNpcF1bMV0gLSBwYXNzW2RxaWRseV1bZHFzaXBdWzBdOworCQkJaWYgKChkaWZmKzIpIDwgZ19tYXJnaW4pCisJCQkJY29udGludWU7CisJCQlwYXNzY250WzBdID0gcGFzc2NudFsxXSA9IDA7CisJCQlmb3IgKGRsbGkgPSBwYXNzW2RxaWRseV1bZHFzaXBdWzBdOyBkbGxpID4gMCAgJiYgdGFnW2Rxc2lwXVtkbGxpXSAhPSAwOyBkbGxpLS0sIHBhc3NjbnRbMF0rKyk7CisJCQlmb3IgKGRsbGkgPSBwYXNzW2RxaWRseV1bZHFzaXBdWzFdOyBkbGxpIDwgNzYgJiYgdGFnW2Rxc2lwXVtkbGxpXSAhPSAwOyBkbGxpKyssIHBhc3NjbnRbMV0rKyk7CisJCQlpZiAocGFzc2NudFswXSA+IHBhc3NjbnRbMV0pCisJCQkJcGFzc2NudFswXSA9IHBhc3NjbnRbMV07CisJCQlwYXNzY250WzFdID0gMDsKKwkJCWlmIChwYXNzY250WzBdID4gZ19zaWRlKQorCQkJCXBhc3NjbnRbMV0gPSBwYXNzY250WzBdIC0gZ19zaWRlOworCQkJaWYgKGRpZmYgPiAoZ19tYXJnaW4rMSkgJiYgKHBhc3NjbnRbMV0gPiAwIHx8IHBhc3NjbnRbMF0gPiA4KSkgeworCQkJCWdfbWFyZ2luID0gZGlmZjsKKwkJCQlnX2RxaWRseSA9IGRxaWRseTsKKwkJCQlnX2Rxc2lwICA9IGRxc2lwOworCQkJCWdfc2lkZSAgID0gcGFzc2NudFswXTsKKwkJCX0gZWxzZSBpZiAocGFzc2NudFsxXSA+IDEgJiYgZ19zaWRlIDwgOCkgeworCQkJCWlmIChkaWZmID4gZ19tYXJnaW4pCisJCQkJCWdfbWFyZ2luID0gZGlmZjsKKwkJCQlnX2RxaWRseSA9IGRxaWRseTsKKwkJCQlnX2Rxc2lwICA9IGRxc2lwOworCQkJCWdfc2lkZSAgID0gcGFzc2NudFswXTsKIAkJCX0KIAkJfQogCX0KLQlnb2xkX3NhZGpbMF0gPSAoZ29sZF9zYWRqWzFdICsgZ29sZF9zYWRqWzBdKSA+PiAxOwotCWdvbGRfc2FkalsxXSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwODQpOworCXJlZ19tY3IxOCA9IHJlZ19tY3IxOCB8IChnX2RxaWRseSA8PCAxNikgfCAoZ19kcXNpcCA8PCAyMyk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCByZWdfbWNyMTgpOwogCi0JZGF0YSA9IDA7Ci0JZm9yIChjbnQgPSA4OyBjbnQgPCAxNjsgY250KyspIHsKLQkJZGF0YSA+Pj0gMzsKLQkJZGF0YTIgPSBnb2xkX3NhZGpbMV0gJiAweDc7Ci0JCWdvbGRfc2FkalsxXSA+Pj0gMzsKLQkJaWYgKChkbGxtYXhbY250XSA+IGRsbG1pbltjbnRdKSAmJiAoKGRsbG1heFtjbnRdIC0gZGxsbWluW2NudF0pID49IENCUl9USFJFU0hPTEQyKSkgewotCQkJZGxsaSA9IChkbGxtaW5bY250XSArIGRsbG1heFtjbnRdKSA+PiAxOwotCQkJaWYgKGdvbGRfc2FkalswXSA+PSBkbGxpKSB7Ci0JCQkJZGxsaSA9IChnb2xkX3NhZGpbMF0gLSBkbGxpKSA+PiAxOwotCQkJCWlmIChkbGxpID4gMCkgewotCQkJCQlkbGxpID0gMTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEyICE9IDMpIHsKLQkJCQkJZGF0YTIgPSAoZGF0YTIgKyBkbGxpKSAmIDB4NzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRsbGkgPSAoZGxsaSAtIGdvbGRfc2FkalswXSkgPj4gMTsKLQkJCQlpZiAoZGxsaSA+IDApIHsKLQkJCQkJZGxsaSA9IDE7Ci0JCQkJfQotCQkJCWlmIChkYXRhMiAhPSA0KSB7Ci0JCQkJCWRhdGEyID0gKGRhdGEyIC0gZGxsaSkgJiAweDc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWRhdGEgfD0gZGF0YTIgPDwgMjE7Ci0JfQotCW1vdXRkd20oYXN0LCAweDFFNkUwMDg0LCBkYXRhKTsKLQotfSAvKiBmaW5ldHVuZURRSV9MMiAqLwotCi1zdGF0aWMgdm9pZCBjYnJfZGxsMihzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgc3RydWN0IGFzdDIzMDBfZHJhbV9wYXJhbSAqcGFyYW0pCit9CitzdGF0aWMgYm9vbCBjYnJfZGxsMihzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgc3RydWN0IGFzdDIzMDBfZHJhbV9wYXJhbSAqcGFyYW0pCiB7Ci0JdTMyIGRsbG1pblsyXSwgZGxsbWF4WzJdLCBkbGxpLCBkYXRhLCBkYXRhMiwgcGFzc2NudDsKKwl1MzIgZGxsbWluWzJdLCBkbGxtYXhbMl0sIGRsbGksIGRhdGEsIHBhc3NjbnQsIHJldHJ5ID0gMDsKKwlib29sIHN0YXR1cyA9IGZhbHNlOwogCi0KLQlmaW5ldHVuZURRSV9MKGFzdCwgcGFyYW0pOwotCWZpbmV0dW5lRFFJX0wyKGFzdCwgcGFyYW0pOworCWZpbmV0dW5lRFFTSShhc3QpOworCWlmIChmaW5ldHVuZURRSV9MKGFzdCwgcGFyYW0pID09IGZhbHNlKQorCQlyZXR1cm4gc3RhdHVzOwogCiBDQlJfU1RBUlQyOgogCWRsbG1pblswXSA9IGRsbG1pblsxXSA9IDB4ZmY7CiAJZGxsbWF4WzBdID0gZGxsbWF4WzFdID0gMHgwOwogCXBhc3NjbnQgPSAwOwogCWZvciAoZGxsaSA9IDA7IGRsbGkgPCA3NjsgZGxsaSsrKSB7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDY4LCAweDAwMDAxMzAwIHwgKGRsbGkgPDwgMTYpIHwgKGRsbGkgPDwgMjQpKTsKLQkJLyogV2FpdCBEUVNJIGxhdGNoIHBoYXNlIGNhbGlicmF0aW9uICovCi0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDc0LCAweDAwMDAwMDEwKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDMpOwotCQlkbyB7Ci0JCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7Ci0JCX0gd2hpbGUgKCEoZGF0YSAmIDB4MDAwMDEwMDApKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDApOwotCi0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDc0LCBDQlJfU0laRTIpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIDB4MDAwMDEzMDAgfCAoZGxsaSA8PCAxNikgfCAoZGxsaSA8PCAyNCkpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIENCUl9TSVpFMik7CiAJCWRhdGEgPSBjYnJfc2Nhbihhc3QpOwogCQlpZiAoZGF0YSAhPSAwKSB7CiAJCQlpZiAoZGF0YSAmIDB4MSkgewpAQCAtOTU3LDQ0ICs4NDQsMzEgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCWlmIChyZXRyeSsrID4gMTApCisJCWdvdG8gQ0JSX0RPTkUyOwogCWlmIChkbGxtYXhbMF0gPT0gMCB8fCAoZGxsbWF4WzBdLWRsbG1pblswXSkgPCBDQlJfVEhSRVNIT0xEKSB7CiAJCWdvdG8gQ0JSX1NUQVJUMjsKIAl9CiAJaWYgKGRsbG1heFsxXSA9PSAwIHx8IChkbGxtYXhbMV0tZGxsbWluWzFdKSA8IENCUl9USFJFU0hPTEQpIHsKIAkJZ290byBDQlJfU1RBUlQyOwogCX0KKwlzdGF0dXMgPSB0cnVlOworQ0JSX0RPTkUyOgogCWRsbGkgID0gKGRsbG1pblsxXSArIGRsbG1heFsxXSkgPj4gMTsKIAlkbGxpIDw8PSA4OwogCWRsbGkgKz0gKGRsbG1pblswXSArIGRsbG1heFswXSkgPj4gMTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2OCwgKG1pbmR3bShhc3QsIDB4MUU2RTAwNjgpICYgMHhGRkZGKSB8IChkbGxpIDw8IDE2KSk7Ci0KLQlkYXRhICA9IChtaW5kd20oYXN0LCAweDFFNkUwMDgwKSA+PiAyNCkgJiAweDFGOwotCWRhdGEyID0gKG1pbmR3bShhc3QsIDB4MUU2RTAwMTgpICYgMHhmZjgwZmZmZikgfCAoZGF0YSA8PCAxNik7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIGRhdGEyKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyNCwgMHg4MDAxIHwgKGRhdGEgPDwgMSkgfCAocGFyYW0tPmRsbDJfZmluZXR1bmVfc3RlcCA8PCA4KSk7Ci0KLQkvKiBXYWl0IERRU0kgbGF0Y2ggcGhhc2UgY2FsaWJyYXRpb24gKi8KLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3NCwgMHgwMDAwMDAxMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDMpOwotCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwNzApOwotCX0gd2hpbGUgKCEoZGF0YSAmIDB4MDAwMDEwMDApKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDMpOwotCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwNzApOwotCX0gd2hpbGUgKCEoZGF0YSAmIDB4MDAwMDEwMDApKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDY4LCBhc3RfbWluZHdtKGFzdCwgMHgxRTcyMDA1OCkgfCAoZGxsaSA8PCAxNikpOworCXJldHVybiBzdGF0dXM7CiB9IC8qIENCUkRMTDIgKi8KIAogc3RhdGljIHZvaWQgZ2V0X2RkcjNfaW5mbyhzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgc3RydWN0IGFzdDIzMDBfZHJhbV9wYXJhbSAqcGFyYW0pCiB7CiAJdTMyIHRyYXAsIHRyYXBfQUMyLCB0cmFwX01SUzsKIAotCW1vdXRkd20oYXN0LCAweDFFNkUyMDAwLCAweDE2ODhBOEE4KTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTIwMDAsIDB4MTY4OEE4QTgpOwogCiAJLyogR2VyIHRyYXAgaW5mbyAqLwotCXRyYXAgPSAobWluZHdtKGFzdCwgMHgxRTZFMjA3MCkgPj4gMjUpICYgMHgzOworCXRyYXAgPSAoYXN0X21pbmR3bShhc3QsIDB4MUU2RTIwNzApID4+IDI1KSAmIDB4MzsKIAl0cmFwX0FDMiAgPSAweDAwMDIwMDAwICsgKHRyYXAgPDwgMTYpOwogCXRyYXBfQUMyIHw9IDB4MDAzMDAwMDAgKyAoKHRyYXAgJiAweDIpIDw8IDE5KTsKIAl0cmFwX01SUyAgPSAweDAwMDAwMDEwICsgKHRyYXAgPDwgNCk7CkBAIC0xMDA4LDIyICs4ODIsMzUgQEAKIAogCXN3aXRjaCAocGFyYW0tPmRyYW1fZnJlcSkgewogCWNhc2UgMzM2OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTkwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAxOTApOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDA7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgyMjIwMjcyNTsKIAkJcGFyYW0tPnJlZ19BQzIgICAgICAgPSAweEFBMDA3NjEzIHwgdHJhcF9BQzI7CiAJCXBhcmFtLT5yZWdfRFFTSUMgICAgID0gMHgwMDAwMDBCQTsKIAkJcGFyYW0tPnJlZ19NUlMgICAgICAgPSAweDA0MDAxNDAwIHwgdHJhcF9NUlM7CiAJCXBhcmFtLT5yZWdfRU1SUyAgICAgID0gMHgwMDAwMDAwMDsKLQkJcGFyYW0tPnJlZ19JT1ogICAgICAgPSAweDAwMDAwMDM0OworCQlwYXJhbS0+cmVnX0lPWiAgICAgICA9IDB4MDAwMDAwMjM7CiAJCXBhcmFtLT5yZWdfRFFJRExZICAgID0gMHgwMDAwMDA3NDsKIAkJcGFyYW0tPnJlZ19GUkVRICAgICAgPSAweDAwMDA0REMwOwogCQlwYXJhbS0+bWFkal9tYXggICAgICA9IDk2OwogCQlwYXJhbS0+ZGxsMl9maW5ldHVuZV9zdGVwID0gMzsKKwkJc3dpdGNoIChwYXJhbS0+ZHJhbV9jaGlwaWQpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBBU1RfRFJBTV81MTJNeDE2OgorCQljYXNlIEFTVF9EUkFNXzFHeDE2OgorCQkJcGFyYW0tPnJlZ19BQzIgICA9IDB4QUEwMDc2MTMgfCB0cmFwX0FDMjsKKwkJCWJyZWFrOworCQljYXNlIEFTVF9EUkFNXzJHeDE2OgorCQkJcGFyYW0tPnJlZ19BQzIgICA9IDB4QUEwMDc2MUMgfCB0cmFwX0FDMjsKKwkJCWJyZWFrOworCQljYXNlIEFTVF9EUkFNXzRHeDE2OgorCQkJcGFyYW0tPnJlZ19BQzIgICA9IDB4QUEwMDc2MzYgfCB0cmFwX0FDMjsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJY2FzZSAzOTY6Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAzRjEpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDNGMSk7CiAJCXBhcmFtLT53b2R0ICAgICAgICAgID0gMTsKIAkJcGFyYW0tPnJlZ19BQzEgICAgICAgPSAweDMzMzAyODI1OwogCQlwYXJhbS0+cmVnX0FDMiAgICAgICA9IDB4Q0MwMDk2MTcgfCB0cmFwX0FDMjsKQEAgLTEwMzMsNyArOTIwLDcgQEAKIAkJcGFyYW0tPnJlZ19JT1ogICAgICAgPSAweDAwMDAwMDM0OwogCQlwYXJhbS0+cmVnX0RSViAgICAgICA9IDB4MDAwMDAwRkE7CiAJCXBhcmFtLT5yZWdfRFFJRExZICAgID0gMHgwMDAwMDA4OTsKLQkJcGFyYW0tPnJlZ19GUkVRICAgICAgPSAweDAwMDA1MEMwOworCQlwYXJhbS0+cmVnX0ZSRVEgICAgICA9IDB4MDAwMDUwNDA7CiAJCXBhcmFtLT5tYWRqX21heCAgICAgID0gOTY7CiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSA0OwogCkBAIC0xMDUzLDE0ICs5NDAsMTQgQEAKIAkJYnJlYWs7CiAKIAljYXNlIDQwODoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDFGMCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMUYwKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cmVnX0FDMSAgICAgICA9IDB4MzMzMDI4MjU7CiAJCXBhcmFtLT5yZWdfQUMyICAgICAgID0gMHhDQzAwOTYxNyB8IHRyYXBfQUMyOwogCQlwYXJhbS0+cmVnX0RRU0lDICAgICA9IDB4MDAwMDAwRTI7CiAJCXBhcmFtLT5yZWdfTVJTICAgICAgID0gMHgwNDAwMTYwMCB8IHRyYXBfTVJTOwogCQlwYXJhbS0+cmVnX0VNUlMgICAgICA9IDB4MDAwMDAwMDA7Ci0JCXBhcmFtLT5yZWdfSU9aICAgICAgID0gMHgwMDAwMDAzNDsKKwkJcGFyYW0tPnJlZ19JT1ogICAgICAgPSAweDAwMDAwMDIzOwogCQlwYXJhbS0+cmVnX0RSViAgICAgICA9IDB4MDAwMDAwRkE7CiAJCXBhcmFtLT5yZWdfRFFJRExZICAgID0gMHgwMDAwMDA4OTsKIAkJcGFyYW0tPnJlZ19GUkVRICAgICAgPSAweDAwMDA1MEMwOwpAQCAtMTA4Myw3ICs5NzAsNyBAQAogCiAJCWJyZWFrOwogCWNhc2UgNDU2OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMjMwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAyMzApOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDA7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgzMzMwMjkyNjsKIAkJcGFyYW0tPnJlZ19BQzIgICAgICAgPSAweENENDQ5NjFBOwpAQCAtMTA5Nyw3ICs5ODQsNyBAQAogCQlwYXJhbS0+ZGxsMl9maW5ldHVuZV9zdGVwID0gNDsKIAkJYnJlYWs7CiAJY2FzZSA1MDQ6Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAyNzApOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDI3MCk7CiAJCXBhcmFtLT53b2R0ICAgICAgICAgID0gMTsKIAkJcGFyYW0tPnJlZ19BQzEgICAgICAgPSAweDMzMzAyOTI2OwogCQlwYXJhbS0+cmVnX0FDMiAgICAgICA9IDB4REU0NEE2MUQ7CkBAIC0xMTExLDcgKzk5OCw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSA0OwogCQlicmVhazsKIAljYXNlIDUyODoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDI5MCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMjkwKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cm9kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgzMzMwMjkyNjsKQEAgLTExMjcsNyArMTAxNCw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDU3NjoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDE0MCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTQwKTsKIAkJcGFyYW0tPnJlZ19NQURKICAgICAgPSAweDAwMTM2ODY4OwogCQlwYXJhbS0+cmVnX1NBREogICAgICA9IDB4MDAwMDQ1MzQ7CiAJCXBhcmFtLT53b2R0ICAgICAgICAgID0gMTsKQEAgLTExNDUsNyArMTAzMiw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDYwMDoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDJFMSk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMkUxKTsKIAkJcGFyYW0tPnJlZ19NQURKICAgICAgPSAweDAwMTM2ODY4OwogCQlwYXJhbS0+cmVnX1NBREogICAgICA9IDB4MDAwMDQ1MzQ7CiAJCXBhcmFtLT53b2R0ICAgICAgICAgID0gMTsKQEAgLTExNjMsNyArMTA1MCw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDYyNDoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDE2MCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTYwKTsKIAkJcGFyYW0tPnJlZ19NQURKICAgICAgPSAweDAwMTM2ODY4OwogCQlwYXJhbS0+cmVnX1NBREogICAgICA9IDB4MDAwMDQ1MzQ7CiAJCXBhcmFtLT53b2R0ICAgICAgICAgID0gMTsKQEAgLTExOTYsNyArMTA4Myw3IEBACiAJY2FzZSBBU1RfRFJBTV80R3gxNjoKIAkJcGFyYW0tPmRyYW1fY29uZmlnID0gMHgxMzM7CiAJCWJyZWFrOwotCX07IC8qIHN3aXRjaCBzaXplICovCisJfSAvKiBzd2l0Y2ggc2l6ZSAqLwogCiAJc3dpdGNoIChwYXJhbS0+dnJhbV9zaXplKSB7CiAJZGVmYXVsdDoKQEAgLTEyMTgsMTA2ICsxMTA1LDk4IEBACiAKIHN0YXRpYyB2b2lkIGRkcjNfaW5pdChzdHJ1Y3QgYXN0X3ByaXZhdGUgKmFzdCwgc3RydWN0IGFzdDIzMDBfZHJhbV9wYXJhbSAqcGFyYW0pCiB7Ci0JdTMyIGRhdGEsIGRhdGEyOworCXUzMiBkYXRhLCBkYXRhMiwgcmV0cnkgPSAwOwogCi0JbW91dGR3bShhc3QsIDB4MUU2RTAwMDAsIDB4RkM2MDAzMDkpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDAwMDAwMTAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyNCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDApOworZGRyM19pbml0X3N0YXJ0OgorCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwMCwgMHhGQzYwMDMwOSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDAwMDAwMTAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjQsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAzNCwgMHgwMDAwMDAwMCk7CiAJdWRlbGF5KDEwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgcGFyYW0tPnJlZ19NQURKKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2OCwgcGFyYW0tPnJlZ19TQURKKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjQsIHBhcmFtLT5yZWdfTUFESik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDY4LCBwYXJhbS0+cmVnX1NBREopOwogCXVkZWxheSgxMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNjQsIHBhcmFtLT5yZWdfTUFESiB8IDB4QzAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgcGFyYW0tPnJlZ19NQURKIHwgMHhDMDAwMCk7CiAJdWRlbGF5KDEwKTsKIAotCW1vdXRkd20oYXN0LCAweDFFNkUwMDA0LCBwYXJhbS0+ZHJhbV9jb25maWcpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDA4LCAweDkwMDQwZik7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMTAsIHBhcmFtLT5yZWdfQUMxKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAxNCwgcGFyYW0tPnJlZ19BQzIpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDIwLCBwYXJhbS0+cmVnX0RRU0lDKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA4MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwODQsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDg4LCBwYXJhbS0+cmVnX0RRSURMWSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIDB4NDA0MEExNzApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDIwNDAyMzcwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAzOCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNDAsIDB4RkY0NDQ0NDQpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDQ0LCAweDIyMjIyMjIyKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA0OCwgMHgyMjIyMjIyMik7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNEMsIDB4MDAwMDAwMDIpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDUwLCAweDgwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA1MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNTQsIDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDYwLCBwYXJhbS0+cmVnX0RSVik7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNkMsIHBhcmFtLT5yZWdfSU9aKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDc4LCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3QywgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDA0LCBwYXJhbS0+ZHJhbV9jb25maWcpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwOCwgMHg5MDA0MGYpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAxMCwgcGFyYW0tPnJlZ19BQzEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAxNCwgcGFyYW0tPnJlZ19BQzIpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyMCwgcGFyYW0tPnJlZ19EUVNJQyk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDgwLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwODQsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA4OCwgcGFyYW0tPnJlZ19EUUlETFkpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgMHg0MDAwQTE3MCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDAwMDAyMzcwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMzgsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA0MCwgMHhGRjQ0NDQ0NCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDQ0LCAweDIyMjIyMjIyKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNDgsIDB4MjIyMjIyMjIpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA0QywgMHgwMDAwMDAwMik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDUwLCAweDgwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA1NCwgMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDYwLCBwYXJhbS0+cmVnX0RSVik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDZDLCBwYXJhbS0+cmVnX0lPWik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNzQsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3OCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDdDLCAweDAwMDAwMDAwKTsKIAkvKiBXYWl0IE1DTEsyWCBsb2NrIHRvIE1DTEsgKi8KIAlkbyB7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDFDKTsKKwkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDFDKTsKIAl9IHdoaWxlICghKGRhdGEgJiAweDA4MDAwMDAwKSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDEpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDA1QzA0KTsKLQl1ZGVsYXkoMTApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAzNCwgMHgwMDAwMDAwMCk7Ci0JZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwMUMpOworCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CiAJZGF0YSA9IChkYXRhID4+IDgpICYgMHhmZjsKIAl3aGlsZSAoKGRhdGEgJiAweDA4KSB8fCAoKGRhdGEgJiAweDcpIDwgMikgfHwgKGRhdGEgPCA0KSkgewotCQlkYXRhMiA9IChtaW5kd20oYXN0LCAweDFFNkUwMDY0KSAmIDB4ZmZmM2ZmZmYpICsgNDsKKwkJZGF0YTIgPSAoYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwNjQpICYgMHhmZmYzZmZmZikgKyA0OwogCQlpZiAoKGRhdGEyICYgMHhmZikgPiBwYXJhbS0+bWFkal9tYXgpIHsKIAkJCWJyZWFrOwogCQl9Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDY0LCBkYXRhMik7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgZGF0YTIpOwogCQlpZiAoZGF0YTIgJiAweDAwMTAwMDAwKSB7CiAJCQlkYXRhMiA9ICgoZGF0YTIgJiAweGZmKSA+PiAzKSArIDM7CiAJCX0gZWxzZSB7CiAJCQlkYXRhMiA9ICgoZGF0YTIgJiAweGZmKSA+PiAyKSArIDU7CiAJCX0KLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwNjgpICYgMHhmZmZmMDBmZjsKKwkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDY4KSAmIDB4ZmZmZjAwZmY7CiAJCWRhdGEyICs9IGRhdGEgJiAweGZmOwogCQlkYXRhID0gZGF0YSB8IChkYXRhMiA8PCA4KTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIGRhdGEpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIGRhdGEpOwogCQl1ZGVsYXkoMTApOwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgbWluZHdtKGFzdCwgMHgxRTZFMDA2NCkgfCAweEMwMDAwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDY0LCBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDA2NCkgfCAweEMwMDAwKTsKIAkJdWRlbGF5KDEwKTsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwMTgpICYgMHhmZmZmZjFmZjsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIGRhdGEpOworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwMTgpICYgMHhmZmZmZjFmZjsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCBkYXRhKTsKIAkJZGF0YSA9IGRhdGEgfCAweDIwMDsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIGRhdGEpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIGRhdGEpOwogCQlkbyB7Ci0JCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CisJCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwMUMpOwogCQl9IHdoaWxlICghKGRhdGEgJiAweDA4MDAwMDAwKSk7CiAKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDEpOwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwNCk7Ci0JCXVkZWxheSgxMCk7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDAwMDAwKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDApOwotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CiAJCWRhdGEgPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CiAJfQotCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDE4KSB8IDB4QzAwOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDE4LCBkYXRhKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU3MjAwNTgsIGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDY4KSAmIDB4ZmZmZik7CisJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDE4KSB8IDB4QzAwOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgZGF0YSk7CiAKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAzNCwgMHgwMDAwMDAwMSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMEMsIDB4MDAwMDAwNDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAzNCwgMHgwMDAwMDAwMSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDAwMDQwKTsKIAl1ZGVsYXkoNTApOwogCS8qIE1vZGUgUmVnaXN0ZXIgU2V0dGluZyAqLwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDJDLCBwYXJhbS0+cmVnX01SUyB8IDB4MTAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAzMCwgcGFyYW0tPnJlZ19FTVJTKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwNSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDcpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDI4LCAweDAwMDAwMDAzKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMkMsIHBhcmFtLT5yZWdfTVJTKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwOCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyQywgcGFyYW0tPnJlZ19NUlMgfCAweDEwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDMwLCBwYXJhbS0+cmVnX0VNUlMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwNSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDI4LCAweDAwMDAwMDA3KTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDJDLCBwYXJhbS0+cmVnX01SUyk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDA1QzA4KTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDEpOwogCi0JbW91dGR3bShhc3QsIDB4MUU2RTAwMEMsIDB4N0ZGRjVDMDEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwMSk7CiAJZGF0YSA9IDA7CiAJaWYgKHBhcmFtLT53b2R0KSB7CiAJCWRhdGEgPSAweDMwMDsKQEAgLTEzMjUsMzAgKzEyMDQsMjMgQEAKIAlpZiAocGFyYW0tPnJvZHQpIHsKIAkJZGF0YSA9IGRhdGEgfCAweDMwMDAgfCAoKHBhcmFtLT5yZWdfQUMyICYgMHg2MDAwMCkgPj4gMyk7CiAJfQotCW1vdXRkd20oYXN0LCAweDFFNkUwMDM0LCBkYXRhIHwgMHgzKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIGRhdGEgfCAweDMpOwogCi0JLyogV2FpdCBEUUkgZGVsYXkgbG9jayAqLwotCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwODApOwotCX0gd2hpbGUgKCEoZGF0YSAmIDB4NDAwMDAwMDApKTsKLQkvKiBXYWl0IERRU0kgZGVsYXkgbG9jayAqLwotCWRvIHsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwMjApOwotCX0gd2hpbGUgKCEoZGF0YSAmIDB4MDAwMDA4MDApKTsKIAkvKiBDYWxpYnJhdGUgdGhlIERRU0kgZGVsYXkgKi8KLQljYnJfZGxsMihhc3QsIHBhcmFtKTsKKwlpZiAoKGNicl9kbGwyKGFzdCwgcGFyYW0pID09IGZhbHNlKSAmJiAocmV0cnkrKyA8IDEwKSkKKwkJZ290byBkZHIzX2luaXRfc3RhcnQ7CiAKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDEyMCwgcGFyYW0tPnJlZ19GUkVRKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAxMjAsIHBhcmFtLT5yZWdfRlJFUSk7CiAJLyogRUNDIE1lbW9yeSBJbml0aWFsaXphdGlvbiAqLwogI2lmZGVmIEVDQwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDdDLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgyMjEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3QywgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDIyMSk7CiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7CiAJfSB3aGlsZSAoIShkYXRhICYgMHgwMDAwMTAwMCkpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA1MCwgMHg4MDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDUwLCAweDgwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4MDAwMDAwMDApOwogI2VuZGlmCiAKIApAQCAtMTM1OCwxMCArMTIzMCwxMCBAQAogewogCXUzMiB0cmFwLCB0cmFwX0FDMiwgdHJhcF9NUlM7CiAKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAwMCwgMHgxNjg4QThBOCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDAwLCAweDE2ODhBOEE4KTsKIAogCS8qIEdlciB0cmFwIGluZm8gKi8KLQl0cmFwID0gKG1pbmR3bShhc3QsIDB4MUU2RTIwNzApID4+IDI1KSAmIDB4MzsKKwl0cmFwID0gKGFzdF9taW5kd20oYXN0LCAweDFFNkUyMDcwKSA+PiAyNSkgJiAweDM7CiAJdHJhcF9BQzIgID0gKHRyYXAgPDwgMjApIHwgKHRyYXAgPDwgMTYpOwogCXRyYXBfQUMyICs9IDB4MDAxMTAwMDA7CiAJdHJhcF9NUlMgID0gMHgwMDAwMDA0MCB8ICh0cmFwIDw8IDQpOwpAQCAtMTM3NSw3ICsxMjQ3LDcgQEAKIAogCXN3aXRjaCAocGFyYW0tPmRyYW1fZnJlcSkgewogCWNhc2UgMjY0OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTMwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAxMzApOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDA7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgxMTEwMTUxMzsKIAkJcGFyYW0tPnJlZ19BQzIgICAgICAgPSAweDc4MTE3MDExOwpAQCAtMTM5MCw3ICsxMjYyLDcgQEAKIAkJcGFyYW0tPmRsbDJfZmluZXR1bmVfc3RlcCA9IDM7CiAJCWJyZWFrOwogCWNhc2UgMzM2OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTkwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAxOTApOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgyMjIwMjYxMzsKIAkJcGFyYW0tPnJlZ19BQzIgICAgICAgPSAweEFBMDA5MDE2IHwgdHJhcF9BQzI7CkBAIC0xNDAzLDEwICsxMjc1LDI1IEBACiAJCXBhcmFtLT5yZWdfRlJFUSAgICAgID0gMHgwMDAwNERDMDsKIAkJcGFyYW0tPm1hZGpfbWF4ICAgICAgPSA5NjsKIAkJcGFyYW0tPmRsbDJfZmluZXR1bmVfc3RlcCA9IDM7CisJCXN3aXRjaCAocGFyYW0tPmRyYW1fY2hpcGlkKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgQVNUX0RSQU1fNTEyTXgxNjoKKwkJCXBhcmFtLT5yZWdfQUMyICAgPSAweEFBMDA5MDEyIHwgdHJhcF9BQzI7CisJCQlicmVhazsKKwkJY2FzZSBBU1RfRFJBTV8xR3gxNjoKKwkJCXBhcmFtLT5yZWdfQUMyICAgPSAweEFBMDA5MDE2IHwgdHJhcF9BQzI7CisJCQlicmVhazsKKwkJY2FzZSBBU1RfRFJBTV8yR3gxNjoKKwkJCXBhcmFtLT5yZWdfQUMyICAgPSAweEFBMDA5MDIzIHwgdHJhcF9BQzI7CisJCQlicmVhazsKKwkJY2FzZSBBU1RfRFJBTV80R3gxNjoKKwkJCXBhcmFtLT5yZWdfQUMyICAgPSAweEFBMDA5MDNCIHwgdHJhcF9BQzI7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCWNhc2UgMzk2OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwM0YxKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAzRjEpOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yb2R0ICAgICAgICAgID0gMDsKIAkJcGFyYW0tPnJlZ19BQzEgICAgICAgPSAweDMzMzAyNzE0OwpAQCAtMTQxNyw3ICsxMzA0LDcgQEAKIAkJcGFyYW0tPnJlZ19EUlYgICAgICAgPSAweDAwMDAwMEZBOwogCQlwYXJhbS0+cmVnX0lPWiAgICAgICA9IDB4MDAwMDAwMzQ7CiAJCXBhcmFtLT5yZWdfRFFJRExZICAgID0gMHgwMDAwMDA4OTsKLQkJcGFyYW0tPnJlZ19GUkVRICAgICAgPSAweDAwMDA1MEMwOworCQlwYXJhbS0+cmVnX0ZSRVEgICAgICA9IDB4MDAwMDUwNDA7CiAJCXBhcmFtLT5tYWRqX21heCAgICAgID0gOTY7CiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSA0OwogCkBAIC0xNDQwLDcgKzEzMjcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgNDA4OgotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMUYwKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUyMDIwLCAweDAxRjApOwogCQlwYXJhbS0+d29kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yb2R0ICAgICAgICAgID0gMDsKIAkJcGFyYW0tPnJlZ19BQzEgICAgICAgPSAweDMzMzAyNzE0OwpAQCAtMTQ3Myw3ICsxMzYwLDcgQEAKIAogCQlicmVhazsKIAljYXNlIDQ1NjoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDIzMCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMjMwKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAwOwogCQlwYXJhbS0+cmVnX0FDMSAgICAgICA9IDB4MzMzMDI4MTU7CiAJCXBhcmFtLT5yZWdfQUMyICAgICAgID0gMHhDRDQ0QjAxRTsKQEAgLTE0ODgsNyArMTM3NSw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDUwNDoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDI2MSk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMjYxKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cm9kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgzMzMwMjgxNTsKQEAgLTE1MDQsNyArMTM5MSw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDUyODoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDEyMCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTIwKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cm9kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHgzMzMwMjgxNTsKQEAgLTE1MjAsNyArMTQwNyw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDU1MjoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDJBMSk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMkExKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cm9kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHg0MzQwMjkxNTsKQEAgLTE1MzYsNyArMTQyMyw3IEBACiAJCXBhcmFtLT5kbGwyX2ZpbmV0dW5lX3N0ZXAgPSAzOwogCQlicmVhazsKIAljYXNlIDU3NjoKLQkJbW91dGR3bShhc3QsIDB4MUU2RTIwMjAsIDB4MDE0MCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMjAyMCwgMHgwMTQwKTsKIAkJcGFyYW0tPndvZHQgICAgICAgICAgPSAxOwogCQlwYXJhbS0+cm9kdCAgICAgICAgICA9IDE7CiAJCXBhcmFtLT5yZWdfQUMxICAgICAgID0gMHg0MzQwMjkxNTsKQEAgLTE1NjcsNyArMTQ1NCw3IEBACiAJY2FzZSBBU1RfRFJBTV80R3gxNjoKIAkJcGFyYW0tPmRyYW1fY29uZmlnID0gMHgxMjM7CiAJCWJyZWFrOwotCX07IC8qIHN3aXRjaCBzaXplICovCisJfSAvKiBzd2l0Y2ggc2l6ZSAqLwogCiAJc3dpdGNoIChwYXJhbS0+dnJhbV9zaXplKSB7CiAJZGVmYXVsdDoKQEAgLTE1ODgsMTEwICsxNDc1LDEwMiBAQAogCiBzdGF0aWMgdm9pZCBkZHIyX2luaXQoc3RydWN0IGFzdF9wcml2YXRlICphc3QsIHN0cnVjdCBhc3QyMzAwX2RyYW1fcGFyYW0gKnBhcmFtKQogewotCXUzMiBkYXRhLCBkYXRhMjsKKwl1MzIgZGF0YSwgZGF0YTIsIHJldHJ5ID0gMDsKIAotCW1vdXRkd20oYXN0LCAweDFFNkUwMDAwLCAweEZDNjAwMzA5KTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgMHgwMDAwMDEwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjQsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDY0LCBwYXJhbS0+cmVnX01BREopOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDY4LCBwYXJhbS0+cmVnX1NBREopOworZGRyMl9pbml0X3N0YXJ0OgorCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwMCwgMHhGQzYwMDMwOSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDAwMDAwMTAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjQsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgcGFyYW0tPnJlZ19NQURKKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjgsIHBhcmFtLT5yZWdfU0FESik7CiAJdWRlbGF5KDEwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgcGFyYW0tPnJlZ19NQURKIHwgMHhDMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDY0LCBwYXJhbS0+cmVnX01BREogfCAweEMwMDAwKTsKIAl1ZGVsYXkoMTApOwogCi0JbW91dGR3bShhc3QsIDB4MUU2RTAwMDQsIHBhcmFtLT5kcmFtX2NvbmZpZyk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMDgsIDB4OTAwNDBmKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAxMCwgcGFyYW0tPnJlZ19BQzEpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDE0LCBwYXJhbS0+cmVnX0FDMik7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjAsIHBhcmFtLT5yZWdfRFFTSUMpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDgwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA4NCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwODgsIHBhcmFtLT5yZWdfRFFJRExZKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgMHg0MDQwQTEzMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIDB4MjA0MDIzMzApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDM4LCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA0MCwgMHhGRjgwODAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNDQsIDB4ODg4NDg0NjYpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDQ4LCAweDQ0NDQwMDA4KTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA0QywgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4ODAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDUwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA1NCwgMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNjAsIHBhcmFtLT5yZWdfRFJWKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2QywgcGFyYW0tPnJlZ19JT1opOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3NCwgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNzgsIDB4MDAwMDAwMDApOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDdDLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMDQsIHBhcmFtLT5kcmFtX2NvbmZpZyk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDA4LCAweDkwMDQwZik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDEwLCBwYXJhbS0+cmVnX0FDMSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE0LCBwYXJhbS0+cmVnX0FDMik7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDIwLCBwYXJhbS0+cmVnX0RRU0lDKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwODAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA4NCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDg4LCBwYXJhbS0+cmVnX0RRSURMWSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCAweDQwMDBBMTMwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIDB4MDAwMDIzMzApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAzOCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDQwLCAweEZGODA4MDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNDQsIDB4ODg4NDg0NjYpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA0OCwgMHg0NDQ0MDAwOCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDRDLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4ODAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA1MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDU0LCAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjAsIHBhcmFtLT5yZWdfRFJWKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNkMsIHBhcmFtLT5yZWdfSU9aKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3NCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDc4LCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwN0MsIDB4MDAwMDAwMDApOwogCiAJLyogV2FpdCBNQ0xLMlggbG9jayB0byBNQ0xLICovCiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAxQyk7CiAJfSB3aGlsZSAoIShkYXRhICYgMHgwODAwMDAwMCkpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDM0LCAweDAwMDAwMDAxKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwNCk7Ci0JdWRlbGF5KDEwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDApOwotCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDFDKTsKKwlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwMUMpOwogCWRhdGEgPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CiAJd2hpbGUgKChkYXRhICYgMHgwOCkgfHwgKChkYXRhICYgMHg3KSA8IDIpIHx8IChkYXRhIDwgNCkpIHsKLQkJZGF0YTIgPSAobWluZHdtKGFzdCwgMHgxRTZFMDA2NCkgJiAweGZmZjNmZmZmKSArIDQ7CisJCWRhdGEyID0gKGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDY0KSAmIDB4ZmZmM2ZmZmYpICsgNDsKIAkJaWYgKChkYXRhMiAmIDB4ZmYpID4gcGFyYW0tPm1hZGpfbWF4KSB7CiAJCQlicmVhazsKIAkJfQotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgZGF0YTIpOworCQlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNjQsIGRhdGEyKTsKIAkJaWYgKGRhdGEyICYgMHgwMDEwMDAwMCkgewogCQkJZGF0YTIgPSAoKGRhdGEyICYgMHhmZikgPj4gMykgKyAzOwogCQl9IGVsc2UgewogCQkJZGF0YTIgPSAoKGRhdGEyICYgMHhmZikgPj4gMikgKyA1OwogCQl9Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDY4KSAmIDB4ZmZmZjAwZmY7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDA2OCkgJiAweGZmZmYwMGZmOwogCQlkYXRhMiArPSBkYXRhICYgMHhmZjsKIAkJZGF0YSA9IGRhdGEgfCAoZGF0YTIgPDwgOCk7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDY4LCBkYXRhKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDY4LCBkYXRhKTsKIAkJdWRlbGF5KDEwKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwNjQsIG1pbmR3bShhc3QsIDB4MUU2RTAwNjQpIHwgMHhDMDAwMCk7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA2NCwgYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwNjQpIHwgMHhDMDAwMCk7CiAJCXVkZWxheSgxMCk7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDE4KSAmIDB4ZmZmZmYxZmY7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDE4LCBkYXRhKTsKKwkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDE4KSAmIDB4ZmZmZmYxZmY7CisJCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgZGF0YSk7CiAJCWRhdGEgPSBkYXRhIHwgMHgyMDA7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDE4LCBkYXRhKTsKKwkJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDE4LCBkYXRhKTsKIAkJZG8gewotCQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwMUMpOworCQkJZGF0YSA9IGFzdF9taW5kd20oYXN0LCAweDFFNkUwMDFDKTsKIAkJfSB3aGlsZSAoIShkYXRhICYgMHgwODAwMDAwMCkpOwogCi0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDM0LCAweDAwMDAwMDAxKTsKLQkJbW91dGR3bShhc3QsIDB4MUU2RTAwMEMsIDB4MDAwMDVDMDQpOwotCQl1ZGVsYXkoMTApOwotCQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwMDAwMCk7Ci0JCW1vdXRkd20oYXN0LCAweDFFNkUwMDM0LCAweDAwMDAwMDAwKTsKLQkJZGF0YSA9IG1pbmR3bShhc3QsIDB4MUU2RTAwMUMpOworCQlkYXRhID0gYXN0X21pbmR3bShhc3QsIDB4MUU2RTAwMUMpOwogCQlkYXRhID0gKGRhdGEgPj4gOCkgJiAweGZmOwogCX0KLQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDAxOCkgfCAweEMwMDsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAxOCwgZGF0YSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNzIwMDU4LCBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAwOCkgJiAweGZmZmYpOworCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDAxOCkgfCAweEMwMDsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMTgsIGRhdGEpOwogCi0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDEpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDBDLCAweDAwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIDB4MDAwMDAwMDEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwMDAwMCk7CiAJdWRlbGF5KDUwKTsKIAkvKiBNb2RlIFJlZ2lzdGVyIFNldHRpbmcgKi8KLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyQywgcGFyYW0tPnJlZ19NUlMgfCAweDEwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzAsIHBhcmFtLT5yZWdfRU1SUyk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDUpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDI4LCAweDAwMDAwMDA3KTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMyk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyQywgcGFyYW0tPnJlZ19NUlMgfCAweDEwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDMwLCBwYXJhbS0+cmVnX0VNUlMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwNSk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDI4LCAweDAwMDAwMDA3KTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMSk7CiAKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwOCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMkMsIHBhcmFtLT5yZWdfTVJTKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMSk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzAsIHBhcmFtLT5yZWdfRU1SUyB8IDB4MzgwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDAyOCwgMHgwMDAwMDAwMyk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMzAsIHBhcmFtLT5yZWdfRU1SUyk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHgwMDAwNUMwOCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDJDLCBwYXJhbS0+cmVnX01SUyk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDI4LCAweDAwMDAwMDAxKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMzAsIHBhcmFtLT5yZWdfRU1SUyB8IDB4MzgwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAzMCwgcGFyYW0tPnJlZ19FTVJTKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMjgsIDB4MDAwMDAwMDMpOwogCi0JbW91dGR3bShhc3QsIDB4MUU2RTAwMEMsIDB4N0ZGRjVDMDEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDAwQywgMHg3RkZGNUMwMSk7CiAJZGF0YSA9IDA7CiAJaWYgKHBhcmFtLT53b2R0KSB7CiAJCWRhdGEgPSAweDUwMDsKQEAgLTE2OTksMzAgKzE1NzgsMjMgQEAKIAlpZiAocGFyYW0tPnJvZHQpIHsKIAkJZGF0YSA9IGRhdGEgfCAweDMwMDAgfCAoKHBhcmFtLT5yZWdfQUMyICYgMHg2MDAwMCkgPj4gMyk7CiAJfQotCW1vdXRkd20oYXN0LCAweDFFNkUwMDM0LCBkYXRhIHwgMHgzKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDEyMCwgcGFyYW0tPnJlZ19GUkVRKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwMzQsIGRhdGEgfCAweDMpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDEyMCwgcGFyYW0tPnJlZ19GUkVRKTsKIAotCS8qIFdhaXQgRFFJIGRlbGF5IGxvY2sgKi8KLQlkbyB7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDgwKTsKLQl9IHdoaWxlICghKGRhdGEgJiAweDQwMDAwMDAwKSk7Ci0JLyogV2FpdCBEUVNJIGRlbGF5IGxvY2sgKi8KLQlkbyB7Ci0JCWRhdGEgPSBtaW5kd20oYXN0LCAweDFFNkUwMDIwKTsKLQl9IHdoaWxlICghKGRhdGEgJiAweDAwMDAwODAwKSk7CiAJLyogQ2FsaWJyYXRlIHRoZSBEUVNJIGRlbGF5ICovCi0JY2JyX2RsbDIoYXN0LCBwYXJhbSk7CisJaWYgKChjYnJfZGxsMihhc3QsIHBhcmFtKSA9PSBmYWxzZSkgJiYgKHJldHJ5KysgPCAxMCkpCisJCWdvdG8gZGRyMl9pbml0X3N0YXJ0OwogCiAJLyogRUNDIE1lbW9yeSBJbml0aWFsaXphdGlvbiAqLwogI2lmZGVmIEVDQwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDdDLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgyMjEpOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3QywgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDIyMSk7CiAJZG8gewotCQlkYXRhID0gbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7CisJCWRhdGEgPSBhc3RfbWluZHdtKGFzdCwgMHgxRTZFMDA3MCk7CiAJfSB3aGlsZSAoIShkYXRhICYgMHgwMDAwMTAwMCkpOwotCW1vdXRkd20oYXN0LCAweDFFNkUwMDcwLCAweDAwMDAwMDAwKTsKLQltb3V0ZHdtKGFzdCwgMHgxRTZFMDA1MCwgMHg4MDAwMDAwMCk7Ci0JbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4MDAwMDAwMDApOworCWFzdF9tb3V0ZHdtKGFzdCwgMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCk7CisJYXN0X21vdXRkd20oYXN0LCAweDFFNkUwMDUwLCAweDgwMDAwMDAwKTsKKwlhc3RfbW91dGR3bShhc3QsIDB4MUU2RTAwNTAsIDB4MDAwMDAwMDApOwogI2VuZGlmCiAKIH0KQEAgLTE3NjgsOCArMTY0MCw4IEBACiAJCQlkZHIyX2luaXQoYXN0LCAmcGFyYW0pOwogCQl9CiAKLQkJdGVtcCA9IG1pbmR3bShhc3QsIDB4MWU2ZTIwNDApOwotCQltb3V0ZHdtKGFzdCwgMHgxZTZlMjA0MCwgdGVtcCB8IDB4NDApOworCQl0ZW1wID0gYXN0X21pbmR3bShhc3QsIDB4MWU2ZTIwNDApOworCQlhc3RfbW91dGR3bShhc3QsIDB4MWU2ZTIwNDAsIHRlbXAgfCAweDQwKTsKIAl9CiAKIAkvKiB3YWl0IHJlYWR5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXN0L2FzdF90YWJsZXMuaCBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X3RhYmxlcy5oCmluZGV4IDk1ZmE2YWIuLjRjNzYxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X3RhYmxlcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hc3QvYXN0X3RhYmxlcy5oCkBAIC00Miw3ICs0Miw3IEBACiAjZGVmaW5lIEhCb3JkZXIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgVkJvcmRlciAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBXaWRlU2NyZWVuTW9kZQkJMHgwMDAwMDEwMAotCisjZGVmaW5lIE5ld01vZGVJbmZvCQkweDAwMDAwMjAwCiAKIC8qIERDTEsgSW5kZXggKi8KICNkZWZpbmUgVkNMSzI1XzE3NSAgICAgCQkweDAwCkBAIC02Nyw2ICs2NywxMSBAQAogI2RlZmluZSBWQ0xLMTA2XzUgICAJCTB4MTIKICNkZWZpbmUgVkNMSzE0Nl8yNSAgCQkweDEzCiAjZGVmaW5lIFZDTEsxNDhfNSAgIAkJMHgxNAorI2RlZmluZSBWQ0xLNzEgICAgICAJCTB4MTUKKyNkZWZpbmUgVkNMSzg4Xzc1ICAgCQkweDE2CisjZGVmaW5lIFZDTEsxMTkgICAgIAkJMHgxNworI2RlZmluZSBWQ0xLODVfNSAgICAgCQkweDE4CisjZGVmaW5lIFZDTEs5N183NSAgICAgCQkweDE5CiAKIHN0YXRpYyBzdHJ1Y3QgYXN0X3ZiaW9zX2RjbGtfaW5mbyBkY2xrX3RhYmxlW10gPSB7CiAJezB4MkMsIDB4RTcsIDB4MDN9LAkJCQkJLyogMDA6IFZDTEsyNV8xNzUJKi8KQEAgLTkwLDYgKzk1LDEwIEBACiAJezB4MjgsIDB4NDksIDB4ODB9LAkJCQkJLyogMTI6IFZDTEsxMDYuNSAgICAgICAgKi8KIAl7MHgzNywgMHg0OSwgMHg4MH0sCQkJCQkvKiAxMzogVkNMSzE0Ni4yNSAgICAgICAqLwogCXsweDFmLCAweDQ1LCAweDgwfSwJCQkJCS8qIDE0OiBWQ0xLMTQ4LjUgICAgICAgICovCisJezB4NDcsIDB4NmMsIDB4ODB9LAkJCQkJLyogMTU6IFZDTEs3MSAgICAgICAqLworCXsweDI1LCAweDY1LCAweDgwfSwJCQkJCS8qIDE2OiBWQ0xLODguNzUgICAgKi8KKwl7MHg3NywgMHg1OCwgMHg4MH0sCQkJCQkvKiAxNzogVkNMSzExOSAgICAgICovCisJezB4MzIsIDB4NjcsIDB4ODB9LAkJCQkgICAgLyogMTg6IFZDTEs4NV81ICAgICAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBhc3RfdmJpb3Nfc3RkdGFibGUgdmJpb3Nfc3RkdGFibGVbXSA9IHsKQEAgLTIyNSw0MSArMjM0LDYzIEBACiAJIChTeW5jUFAgfCBDaGFyeDhEb3QpLCAweEZGLCAxLCAweDMzIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGFzdF92Ymlvc19lbmh0YWJsZSByZXNfMTkyMHgxMjAwW10gPSB7Ci0JezIwODAsIDE5MjAsIDQ4LCAzMiwgMTIzNSwgMTIwMCwgMywgNiwgVkNMSzE1NCwJLyogNjBIeiAqLwotCSAoU3luY05QIHwgQ2hhcng4RG90KSwgNjAsIDEsIDB4MzQgfSwKLQl7MjA4MCwgMTkyMCwgNDgsIDMyLCAxMjM1LCAxMjAwLCAzLCA2LCBWQ0xLMTU0LAkvKiA2MEh6ICovCi0JIChTeW5jTlAgfCBDaGFyeDhEb3QpLCAweEZGLCAxLCAweDM0IH0sCisvKiAxNjo5ICovCitzdGF0aWMgc3RydWN0IGFzdF92Ymlvc19lbmh0YWJsZSByZXNfMTM2MHg3NjhbXSA9IHsKKwl7MTc5MiwgMTM2MCwgNjQsMTEyLCA3OTUsICA3NjgsIDMsIDYsIFZDTEs4NV81LAkgICAgICAgICAvKiA2MEh6ICovCisJIChTeW5jUFAgfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlIHwgTmV3TW9kZUluZm8pLCA2MCwgMSwgMHgzOSB9LAorCXsxNzkyLCAxMzYwLCA2NCwxMTIsIDc5NSwgIDc2OCwgMywgNiwgVkNMSzg1XzUsCSAgICAgICAgIC8qIGVuZCAqLworCSAoU3luY1BQIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgMHhGRiwgMSwgMHgzOSB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBhc3RfdmJpb3NfZW5odGFibGUgcmVzXzE2MDB4OTAwW10gPSB7CisJezE3NjAsIDE2MDAsIDQ4LCAzMiwgOTI2LCAgOTAwLCAzLCA1LCBWQ0xLOTdfNzUsCS8qIDYwSHogQ1ZUIFJCICovCisJIChTeW5jTlAgfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlIHwgTmV3TW9kZUluZm8pLCA2MCwgMSwgMHgzQSB9LAorCXsxNzYwLCAxNjAwLCA0OCwgMzIsIDkyNiwgIDkwMCwgMywgNSwgVkNMSzk3Xzc1LAkvKiBlbmQgKi8KKwkgKFN5bmNOUCB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUgfCBOZXdNb2RlSW5mbyksIDB4RkYsIDEsIDB4M0EgfQorfTsKKworc3RhdGljIHN0cnVjdCBhc3RfdmJpb3NfZW5odGFibGUgcmVzXzE5MjB4MTA4MFtdID0geworCXsyMjAwLCAxOTIwLCA4OCwgNDQsIDExMjUsIDEwODAsIDQsIDUsIFZDTEsxNDhfNSwJLyogNjBIeiAqLworCSAoU3luY05QIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgNjAsIDEsIDB4MzggfSwKKwl7MjIwMCwgMTkyMCwgODgsIDQ0LCAxMTI1LCAxMDgwLCA0LCA1LCBWQ0xLMTQ4XzUsCS8qIDYwSHogKi8KKwkgKFN5bmNOUCB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUgfCBOZXdNb2RlSW5mbyksIDB4RkYsIDEsIDB4MzggfSwKK307CisKKwogLyogMTY6MTAgKi8KIHN0YXRpYyBzdHJ1Y3QgYXN0X3ZiaW9zX2VuaHRhYmxlIHJlc18xMjgweDgwMFtdID0geworCXsxNDQwLCAxMjgwLCA0OCwgMzIsICA4MjMsICA4MDAsIDMsIDYsIFZDTEs3MSwJLyogNjBIeiBSQiAqLworCSAoU3luY05QIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgNjAsIDEsIDM1IH0sCiAJezE2ODAsIDEyODAsIDcyLDEyOCwgIDgzMSwgIDgwMCwgMywgNiwgVkNMSzgzXzUsCS8qIDYwSHogKi8KLQkgKFN5bmNQTiB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUpLCA2MCwgMSwgMHgzNSB9LAorCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgNjAsIDEsIDB4MzUgfSwKIAl7MTY4MCwgMTI4MCwgNzIsMTI4LCAgODMxLCAgODAwLCAzLCA2LCBWQ0xLODNfNSwJLyogNjBIeiAqLwotCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSksIDB4RkYsIDEsIDB4MzUgfSwKKwkgKFN5bmNQTiB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUgfCBOZXdNb2RlSW5mbyksIDB4RkYsIDEsIDB4MzUgfSwKIAogfTsKIAogc3RhdGljIHN0cnVjdCBhc3RfdmJpb3NfZW5odGFibGUgcmVzXzE0NDB4OTAwW10gPSB7CisJezE2MDAsIDE0NDAsIDQ4LCAzMiwgIDkyNiwgIDkwMCwgMywgNiwgVkNMSzg4Xzc1LAkvKiA2MEh6IFJCICovCisJIChTeW5jTlAgfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlIHwgTmV3TW9kZUluZm8pLCA2MCwgMSwgMHgzNiB9LAogCXsxOTA0LCAxNDQwLCA4MCwxNTIsICA5MzQsICA5MDAsIDMsIDYsIFZDTEsxMDZfNSwJLyogNjBIeiAqLwotCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSksIDYwLCAxLCAweDM2IH0sCisJIChTeW5jUE4gfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlIHwgTmV3TW9kZUluZm8pLCA2MCwgMSwgMHgzNiB9LAogCXsxOTA0LCAxNDQwLCA4MCwxNTIsICA5MzQsICA5MDAsIDMsIDYsIFZDTEsxMDZfNSwJLyogNjBIeiAqLwotCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSksIDB4RkYsIDEsIDB4MzYgfSwKKwkgKFN5bmNQTiB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUgfCBOZXdNb2RlSW5mbyksIDB4RkYsIDEsIDB4MzYgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXN0X3ZiaW9zX2VuaHRhYmxlIHJlc18xNjgweDEwNTBbXSA9IHsKKwl7MTg0MCwgMTY4MCwgNDgsIDMyLCAxMDgwLCAxMDUwLCAzLCA2LCBWQ0xLMTE5LAkvKiA2MEh6IFJCICovCisJIChTeW5jTlAgfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlIHwgTmV3TW9kZUluZm8pLCA2MCwgMSwgMHgzNyB9LAogCXsyMjQwLCAxNjgwLDEwNCwxNzYsIDEwODksIDEwNTAsIDMsIDYsIFZDTEsxNDZfMjUsCS8qIDYwSHogKi8KLQkgKFN5bmNQTiB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUpLCA2MCwgMSwgMHgzNyB9LAorCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgNjAsIDEsIDB4MzcgfSwKIAl7MjI0MCwgMTY4MCwxMDQsMTc2LCAxMDg5LCAxMDUwLCAzLCA2LCBWQ0xLMTQ2XzI1LAkvKiA2MEh6ICovCi0JIChTeW5jUE4gfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlKSwgMHhGRiwgMSwgMHgzNyB9LAorCSAoU3luY1BOIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgMHhGRiwgMSwgMHgzNyB9LAogfTsKIAotLyogSERUViAqLwotc3RhdGljIHN0cnVjdCBhc3RfdmJpb3NfZW5odGFibGUgcmVzXzE5MjB4MTA4MFtdID0gewotCXsyMjAwLCAxOTIwLCA4OCwgNDQsIDExMjUsIDEwODAsIDQsIDUsIFZDTEsxNDhfNSwJLyogNjBIeiAqLwotCSAoU3luY05QIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSksIDYwLCAxLCAweDM4IH0sCi0JezIyMDAsIDE5MjAsIDg4LCA0NCwgMTEyNSwgMTA4MCwgNCwgNSwgVkNMSzE0OF81LAkvKiA2MEh6ICovCi0JIChTeW5jTlAgfCBDaGFyeDhEb3QgfCBMaW5lQ29tcGFyZU9mZiB8IFdpZGVTY3JlZW5Nb2RlKSwgMHhGRiwgMSwgMHgzOCB9LAorc3RhdGljIHN0cnVjdCBhc3RfdmJpb3NfZW5odGFibGUgcmVzXzE5MjB4MTIwMFtdID0geworCXsyMDgwLCAxOTIwLCA0OCwgMzIsIDEyMzUsIDEyMDAsIDMsIDYsIFZDTEsxNTQsCS8qIDYwSHogKi8KKwkgKFN5bmNOUCB8IENoYXJ4OERvdCB8IExpbmVDb21wYXJlT2ZmIHwgV2lkZVNjcmVlbk1vZGUgfCBOZXdNb2RlSW5mbyksIDYwLCAxLCAweDM0IH0sCisJezIwODAsIDE5MjAsIDQ4LCAzMiwgMTIzNSwgMTIwMCwgMywgNiwgVkNMSzE1NCwJLyogNjBIeiAqLworCSAoU3luY05QIHwgQ2hhcng4RG90IHwgTGluZUNvbXBhcmVPZmYgfCBXaWRlU2NyZWVuTW9kZSB8IE5ld01vZGVJbmZvKSwgMHhGRiwgMSwgMHgzNCB9LAogfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYm9jaHMvYm9jaHNfbW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19tbS5jCmluZGV4IGY0ODhiZTUuLmI5YTY5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ib2Nocy9ib2Noc19tbS5jCkBAIC00MzQsMTcgKzQzNCwxMyBAQAogCiAJdGJvID0gJigoKmJvKS0+Ym8pOwogCXR0bV9ib191bnJlZigmdGJvKTsKLQlpZiAodGJvID09IE5VTEwpCi0JCSpibyA9IE5VTEw7Ci0KKwkqYm8gPSBOVUxMOwogfQogCiB2b2lkIGJvY2hzX2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgYm9jaHNfYm8gKmJvY2hzX2JvID0gZ2VtX3RvX2JvY2hzX2JvKG9iaik7CiAKLQlpZiAoIWJvY2hzX2JvKQotCQlyZXR1cm47CiAJYm9jaHNfYm9fdW5yZWYoJmJvY2hzX2JvKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9wdG4zNDYwLmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3B0bjM0NjAuYwppbmRleCBiMTcxOTAxLi45OGZkMTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3B0bjM0NjAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3B0bjM0NjAuYwpAQCAtMjI1LDEyICsyMjUsNiBAQAogCXJldHVybiBudW1fbW9kZXM7CiB9CiAKLXN0YXRpYyBpbnQgcHRuMzQ2MF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXJldHVybiBNT0RFX09LOwotfQotCiBzdHJ1Y3QgZHJtX2VuY29kZXIgKnB0bjM0NjBfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IHB0bjM0NjBfYnJpZGdlICpwdG5fYnJpZGdlOwpAQCAtMjQyLDcgKzIzNiw2IEBACiAKIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBwdG4zNDYwX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHB0bjM0NjBfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gcHRuMzQ2MF9tb2RlX3ZhbGlkLAogCS5iZXN0X2VuY29kZXIgPSBwdG4zNDYwX2Jlc3RfZW5jb2RlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21haW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21haW4uYwppbmRleCA0YjAxNzBjLi45OWMxOTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19tYWluLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfbWFpbi5jCkBAIC0yNjQsMTcgKzI2NCwxMyBAQAogCiAJdGJvID0gJigoKmJvKS0+Ym8pOwogCXR0bV9ib191bnJlZigmdGJvKTsKLQlpZiAodGJvID09IE5VTEwpCi0JCSpibyA9IE5VTEw7Ci0KKwkqYm8gPSBOVUxMOwogfQogCiB2b2lkIGNpcnJ1c19nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCiB7CiAJc3RydWN0IGNpcnJ1c19ibyAqY2lycnVzX2JvID0gZ2VtX3RvX2NpcnJ1c19ibyhvYmopOwogCi0JaWYgKCFjaXJydXNfYm8pCi0JCXJldHVybjsKIAljaXJydXNfYm9fdW5yZWYoJmNpcnJ1c19ibyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9jaXJydXMvY2lycnVzX21vZGUuYwppbmRleCBmNTk0MzNiLi40OTMzMmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vY2lycnVzL2NpcnJ1c19tb2RlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2NpcnJ1cy9jaXJydXNfbW9kZS5jCkBAIC01MDUsMTMgKzUwNSw2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaW50IGNpcnJ1c192Z2FfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQkvKiBBbnkgbW9kZSB3ZSd2ZSBhZGRlZCBpcyB2YWxpZCAqLwotCXJldHVybiBNT0RFX09LOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICpjaXJydXNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvcgogCQkJCQkJICAqY29ubmVjdG9yKQogewpAQCAtNTQ2LDcgKzUzOSw2IEBACiAKIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBjaXJydXNfdmdhX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IGNpcnJ1c192Z2FfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gY2lycnVzX3ZnYV9tb2RlX3ZhbGlkLAogCS5iZXN0X2VuY29kZXIgPSBjaXJydXNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKaW5kZXggZWRlYzMxZi4uNjgxNzViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKQEAgLTM2Myw3ICszNjMsNyBAQAogCQlsaXN0LT5tYXN0ZXIgPSBkZXYtPnByaW1hcnktPm1hc3RlcjsKIAkqbWFwbGlzdCA9IGxpc3Q7CiAJcmV0dXJuIDA7Ci0JfQorfQogCiBpbnQgZHJtX2FkZG1hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCwKIAkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGVudW0gZHJtX21hcF90eXBlIHR5cGUsCkBAIC02NTYsMTMgKzY1NiwxMyBAQAogCQlEUk1fREVCVUcoInpvbmUgaW52YWxpZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPmJ1Zl9sb2NrKTsKIAlpZiAoZGV2LT5idWZfdXNlKSB7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOworCQlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWF0b21pY19pbmMoJmRldi0+YnVmX2FsbG9jKTsKLQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZW50cnkgPSAmZG1hLT5idWZzW29yZGVyXTsKQEAgLTgwNSwxMyArODA1LDEzIEBACiAJcGFnZV9vcmRlciA9IG9yZGVyIC0gUEFHRV9TSElGVCA+IDAgPyBvcmRlciAtIFBBR0VfU0hJRlQgOiAwOwogCXRvdGFsID0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CiAKLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPmJ1Zl9sb2NrKTsKIAlpZiAoZGV2LT5idWZfdXNlKSB7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOworCQlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWF0b21pY19pbmMoJmRldi0+YnVmX2FsbG9jKTsKLQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZW50cnkgPSAmZG1hLT5idWZzW29yZGVyXTsKQEAgLTEwMTUsMTMgKzEwMTUsMTMgQEAKIAlpZiAob3JkZXIgPCBEUk1fTUlOX09SREVSIHx8IG9yZGVyID4gRFJNX01BWF9PUkRFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPmJ1Zl9sb2NrKTsKIAlpZiAoZGV2LT5idWZfdXNlKSB7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOworCQlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWF0b21pY19pbmMoJmRldi0+YnVmX2FsbG9jKTsKLQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGV2LT5idWZfbG9jayk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZW50cnkgPSAmZG1hLT5idWZzW29yZGVyXTsKQEAgLTExNzUsNyArMTE3NSw3IEBACiAgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2luZm8gc3RydWN0dXJlLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBJbmNyZW1lbnRzIGRybV9kZXZpY2U6OmJ1Zl91c2Ugd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6Y291bnRfbG9jaworICogSW5jcmVtZW50cyBkcm1fZGV2aWNlOjpidWZfdXNlIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OmJ1Zl9sb2NrCiAgKiBsb2NrLCBwcmV2ZW50aW5nIG9mIGFsbG9jYXRpbmcgbW9yZSBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbC4gSW5mb3JtYXRpb24KICAqIGFib3V0IGVhY2ggcmVxdWVzdGVkIGJ1ZmZlciBpcyB0aGVuIGNvcGllZCBpbnRvIHVzZXIgc3BhY2UuCiAgKi8KQEAgLTExOTYsMTMgKzExOTYsMTMgQEAKIAlpZiAoIWRtYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPmJ1Zl9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+YnVmX2FsbG9jKSkgewotCQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+YnVmX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAkrK2Rldi0+YnVmX3VzZTsJCS8qIENhbid0IGFsbG9jYXRlIG1vcmUgYWZ0ZXIgdGhpcyBjYWxsICovCi0Jc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRldi0+YnVmX2xvY2spOwogCiAJZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgRFJNX01BWF9PUkRFUiArIDE7IGkrKykgewogCQlpZiAoZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCkKQEAgLTEzODEsMTMgKzEzODEsMTMgQEAKIAlpZiAoIWRtYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPmJ1Zl9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+YnVmX2FsbG9jKSkgewotCQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+YnVmX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlkZXYtPmJ1Zl91c2UrKzsJCS8qIENhbid0IGFsbG9jYXRlIG1vcmUgYWZ0ZXIgdGhpcyBjYWxsICovCi0Jc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRldi0+YnVmX2xvY2spOwogCiAJaWYgKHJlcXVlc3QtPmNvdW50ID49IGRtYS0+YnVmX2NvdW50KSB7CiAJCWlmICgoZGV2LT5hZ3AgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfQUdQKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYwppbmRleCA1MzRjYjg5Li5hNmI2OTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jCkBAIC0xMzEsMTQgKzEzMSwxNCBAQAogRVhQT1JUX1NZTUJPTChkcm1fY2xmbHVzaF9zZyk7CiAKIHZvaWQKLWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCitkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQogewogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKIAlpZiAoY3B1X2hhc19jbGZsdXNoKSB7Ci0JCWNoYXIgKmVuZCA9IGFkZHIgKyBsZW5ndGg7CisJCXZvaWQgKmVuZCA9IGFkZHIgKyBsZW5ndGg7CiAJCW1iKCk7CiAJCWZvciAoOyBhZGRyIDwgZW5kOyBhZGRyICs9IGJvb3RfY3B1X2RhdGEueDg2X2NsZmx1c2hfc2l6ZSkKLQkJCWNsZmx1c2goYWRkcik7CisJCQljbGZsdXNob3B0KGFkZHIpOwogCQljbGZsdXNob3B0KGVuZCAtIDEpOwogCQltYigpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IGQ4YjcwOTkuLmZlOTRjYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mb3VyY2MuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzZXRfbG9jay5oPgogCiAjaW5jbHVkZSAiZHJtX2NydGNfaW50ZXJuYWwuaCIKIApAQCAtNTAsMTIgKzUxLDQyIEBACiAgKi8KIHZvaWQgZHJtX21vZGVzZXRfbG9ja19hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHg7CisJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoV0FSTl9PTighY3R4KSkKKwkJcmV0dXJuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCi0JCW11dGV4X2xvY2tfbmVzdF9sb2NrKCZjcnRjLT5tdXRleCwgJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbmZpZy0+bXV0ZXgpOworCisJZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KGN0eCwgMCk7CisKK3JldHJ5OgorCXJldCA9IGRybV9tb2Rlc2V0X2xvY2soJmNvbmZpZy0+Y29ubmVjdGlvbl9tdXRleCwgY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3J0Y3MoZGV2LCBjdHgpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCVdBUk5fT04oY29uZmlnLT5hY3F1aXJlX2N0eCk7CisKKwkvKiBub3cgd2UgaG9sZCB0aGUgbG9ja3MsIHNvIG5vdyB0aGF0IGl0IGlzIHNhZmUsIHN0YXNoIHRoZQorCSAqIGN0eCBmb3IgZHJtX21vZGVzZXRfdW5sb2NrX2FsbCgpOgorCSAqLworCWNvbmZpZy0+YWNxdWlyZV9jdHggPSBjdHg7CisKKwlkcm1fd2Fybl9vbl9tb2Rlc2V0X25vdF9hbGxfbG9ja2VkKGRldik7CisKKwlyZXR1cm47CisKK2ZhaWw6CisJaWYgKHJldCA9PSAtRURFQURMSykgeworCQlkcm1fbW9kZXNldF9iYWNrb2ZmKGN0eCk7CisJCWdvdG8gcmV0cnk7CisJfQogfQogRVhQT1JUX1NZTUJPTChkcm1fbW9kZXNldF9sb2NrX2FsbCk7CiAKQEAgLTY3LDEwICs5OCwxNyBAQAogICovCiB2b2lkIGRybV9tb2Rlc2V0X3VubG9ja19hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHggPSBjb25maWctPmFjcXVpcmVfY3R4OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCi0JCW11dGV4X3VubG9jaygmY3J0Yy0+bXV0ZXgpOworCWlmIChXQVJOX09OKCFjdHgpKQorCQlyZXR1cm47CisKKwljb25maWctPmFjcXVpcmVfY3R4ID0gTlVMTDsKKwlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKGN0eCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKGN0eCk7CisKKwlrZnJlZShjdHgpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIH0KQEAgLTkxLDggKzEyOSw5IEBACiAJCXJldHVybjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQotCQlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmNydGMtPm11dGV4KSk7CisJCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmY3J0Yy0+bXV0ZXgpKTsKIAorCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KSk7CiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV93YXJuX29uX21vZGVzZXRfbm90X2FsbF9sb2NrZWQpOwpAQCAtMjI3LDYgKzI2Niw3IEBACiAJeyBEUk1fTU9ERV9FTkNPREVSX1RWREFDLCAiVFYiIH0sCiAJeyBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwsICJWaXJ0dWFsIiB9LAogCXsgRFJNX01PREVfRU5DT0RFUl9EU0ksICJEU0kiIH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX0RQTVNULCAiRFAgTVNUIiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX3N1YnBpeGVsX2VudW1fbGlzdFtdID0KQEAgLTI1Niw0NiArMjk2LDYgQEAKIH0KIAogLyoqCi0gKiBkcm1fZ2V0X2VuY29kZXJfbmFtZSAtIHJldHVybiBhIHN0cmluZyBmb3IgZW5jb2RlcgotICogQGVuY29kZXI6IGVuY29kZXIgdG8gY29tcHV0ZSBuYW1lIG9mCi0gKgotICogTm90ZSB0aGF0IHRoZSBidWZmZXIgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGdsb2JhbGx5IHNoYXJlZCBhbmQgb3duZWQgYnkKLSAqIHRoZSBmdW5jdGlvbiBpdHNlbGYuCi0gKgotICogRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG11bHRpdGhyZWFkaW5nIHNhZmUuCi0gKi8KLWNvbnN0IGNoYXIgKmRybV9nZXRfZW5jb2Rlcl9uYW1lKGNvbnN0IHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdGF0aWMgY2hhciBidWZbMzJdOwotCi0Jc25wcmludGYoYnVmLCAzMiwgIiVzLSVkIiwKLQkJIGRybV9lbmNvZGVyX2VudW1fbGlzdFtlbmNvZGVyLT5lbmNvZGVyX3R5cGVdLm5hbWUsCi0JCSBlbmNvZGVyLT5iYXNlLmlkKTsKLQlyZXR1cm4gYnVmOwotfQotRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2VuY29kZXJfbmFtZSk7Ci0KLS8qKgotICogZHJtX2dldF9jb25uZWN0b3JfbmFtZSAtIHJldHVybiBhIHN0cmluZyBmb3IgY29ubmVjdG9yCi0gKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gY29tcHV0ZSBuYW1lIG9mCi0gKgotICogTm90ZSB0aGF0IHRoZSBidWZmZXIgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGdsb2JhbGx5IHNoYXJlZCBhbmQgb3duZWQgYnkKLSAqIHRoZSBmdW5jdGlvbiBpdHNlbGYuCi0gKgotICogRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IG11bHRpdGhyZWFkaW5nIHNhZmUuCi0gKi8KLWNvbnN0IGNoYXIgKmRybV9nZXRfY29ubmVjdG9yX25hbWUoY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQlzdGF0aWMgY2hhciBidWZbMzJdOwotCi0Jc25wcmludGYoYnVmLCAzMiwgIiVzLSVkIiwKLQkJIGRybV9jb25uZWN0b3JfZW51bV9saXN0W2Nvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVdLm5hbWUsCi0JCSBjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlX2lkKTsKLQlyZXR1cm4gYnVmOwotfQotRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKTsKLQotLyoqCiAgKiBkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZSAtIHJldHVybiBhIHN0cmluZyBmb3IgY29ubmVjdG9yIHN0YXR1cwogICogQHN0YXR1czogY29ubmVjdG9yIHN0YXR1cyB0byBjb21wdXRlIG5hbWUgb2YKICAqCkBAIC00MDksNiArNDA5LDIxIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmlkcl9tdXRleCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpfb2JqZWN0X2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJdWludDMyX3QgaWQsIHVpbnQzMl90IHR5cGUpCit7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqID0gTlVMTDsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKKwlvYmogPSBpZHJfZmluZCgmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2lkciwgaWQpOworCWlmICghb2JqIHx8ICh0eXBlICE9IERSTV9NT0RFX09CSkVDVF9BTlkgJiYgb2JqLT50eXBlICE9IHR5cGUpIHx8CisJICAgIChvYmotPmlkICE9IGlkKSkKKwkJb2JqID0gTlVMTDsKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKKworCXJldHVybiBvYmo7Cit9CisKIC8qKgogICogZHJtX21vZGVfb2JqZWN0X2ZpbmQgLSBsb29rIHVwIGEgZHJtIG9iamVjdCB3aXRoIHN0YXRpYyBsaWZldGltZQogICogQGRldjogZHJtIGRldmljZQpAQCAtNDE2LDcgKzQzMSw5IEBACiAgKiBAdHlwZTogdHlwZSBvZiB0aGUgbW9kZSBvYmplY3QKICAqCiAgKiBOb3RlIHRoYXQgZnJhbWVidWZmZXJzIGNhbm5vdCBiZSBsb29rZWQgdXAgd2l0aCB0aGlzIGZ1bmN0aW9ucyAtIHNpbmNlIHRob3NlCi0gKiBhcmUgcmVmZXJlbmNlIGNvdW50ZWQsIHRoZXkgbmVlZCBzcGVjaWFsIHRyZWF0bWVudC4KKyAqIGFyZSByZWZlcmVuY2UgY291bnRlZCwgdGhleSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50LiAgRXZlbiB3aXRoCisgKiBEUk1fTU9ERV9PQkpFQ1RfQU5ZIChhbHRob3VnaCB0aGF0IHdpbGwgc2ltcGx5IHJldHVybiBOVUxMCisgKiByYXRoZXIgdGhhbiBXQVJOX09OKCkpLgogICovCiBzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpkcm1fbW9kZV9vYmplY3RfZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQl1aW50MzJfdCBpZCwgdWludDMyX3QgdHlwZSkKQEAgLTQyNiwxMyArNDQzLDEwIEBACiAJLyogRnJhbWVidWZmZXJzIGFyZSByZWZlcmVuY2UgY291bnRlZCBhbmQgbmVlZCB0aGVpciBvd24gbG9va3VwCiAJICogZnVuY3Rpb24uKi8KIAlXQVJOX09OKHR5cGUgPT0gRFJNX01PREVfT0JKRUNUX0ZCKTsKLQotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKLQlvYmogPSBpZHJfZmluZCgmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2lkciwgaWQpOwotCWlmICghb2JqIHx8IChvYmotPnR5cGUgIT0gdHlwZSkgfHwgKG9iai0+aWQgIT0gaWQpKQorCW9iaiA9IF9vYmplY3RfZmluZChkZXYsIGlkLCB0eXBlKTsKKwkvKiBkb24ndCBsZWFrIG91dCB1bnJlZidkIGZiJ3MgKi8KKwlpZiAob2JqICYmIChvYmotPnR5cGUgPT0gRFJNX01PREVfT0JKRUNUX0ZCKSkKIAkJb2JqID0gTlVMTDsKLQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKLQogCXJldHVybiBvYmo7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9tb2RlX29iamVjdF9maW5kKTsKQEAgLTUzOCw3ICs1NTIsNyBAQAogICovCiB2b2lkIGRybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKIHsKLQlEUk1fREVCVUcoIkZCIElEOiAlZFxuIiwgZmItPmJhc2UuaWQpOworCURSTV9ERUJVRygiJXA6IEZCIElEOiAlZCAoJWQpXG4iLCBmYiwgZmItPmJhc2UuaWQsIGF0b21pY19yZWFkKCZmYi0+cmVmY291bnQucmVmY291bnQpKTsKIAlrcmVmX3B1dCgmZmItPnJlZmNvdW50LCBkcm1fZnJhbWVidWZmZXJfZnJlZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZSk7CkBAIC01NTEsNyArNTY1LDcgQEAKICAqLwogdm9pZCBkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQogewotCURSTV9ERUJVRygiRkIgSUQ6ICVkXG4iLCBmYi0+YmFzZS5pZCk7CisJRFJNX0RFQlVHKCIlcDogRkIgSUQ6ICVkICglZClcbiIsIGZiLCBmYi0+YmFzZS5pZCwgYXRvbWljX3JlYWQoJmZiLT5yZWZjb3VudC5yZWZjb3VudCkpOwogCWtyZWZfZ2V0KCZmYi0+cmVmY291bnQpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKTsKQEAgLTU2Myw3ICs1NzcsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKIHsKLQlEUk1fREVCVUcoIkZCIElEOiAlZFxuIiwgZmItPmJhc2UuaWQpOworCURSTV9ERUJVRygiJXA6IEZCIElEOiAlZCAoJWQpXG4iLCBmYiwgZmItPmJhc2UuaWQsIGF0b21pY19yZWFkKCZmYi0+cmVmY291bnQucmVmY291bnQpKTsKIAlrcmVmX3B1dCgmZmItPnJlZmNvdW50LCBkcm1fZnJhbWVidWZmZXJfZnJlZV9idWcpOwogfQogCkBAIC02OTEsNiArNzA1LDggQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZyYW1lYnVmZmVyX3JlbW92ZSk7CiAKK0RFRklORV9XV19DTEFTUyhjcnRjX3d3X2NsYXNzKTsKKwogLyoqCiAgKiBkcm1fY3J0Y19pbml0X3dpdGhfcGxhbmVzIC0gSW5pdGlhbGlzZSBhIG5ldyBDUlRDIG9iamVjdCB3aXRoCiAgKiAgICBzcGVjaWZpZWQgcHJpbWFyeSBhbmQgY3Vyc29yIHBsYW5lcy4KQEAgLTcxMCw2ICs3MjYsNyBAQAogCQkJICAgICAgdm9pZCAqY3Vyc29yLAogCQkJICAgICAgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzICpmdW5jcykKIHsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpjb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKIAlpbnQgcmV0OwogCiAJY3J0Yy0+ZGV2ID0gZGV2OwpAQCAtNzE3LDggKzczNCw5IEBACiAJY3J0Yy0+aW52ZXJ0X2RpbWVuc2lvbnMgPSBmYWxzZTsKIAogCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0JbXV0ZXhfaW5pdCgmY3J0Yy0+bXV0ZXgpOwotCW11dGV4X2xvY2tfbmVzdF9sb2NrKCZjcnRjLT5tdXRleCwgJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2tfaW5pdCgmY3J0Yy0+bXV0ZXgpOworCS8qIGRyb3BwZWQgYnkgX3VubG9ja19hbGwoKTogKi8KKwlkcm1fbW9kZXNldF9sb2NrKCZjcnRjLT5tdXRleCwgY29uZmlnLT5hY3F1aXJlX2N0eCk7CiAKIAlyZXQgPSBkcm1fbW9kZV9vYmplY3RfZ2V0KGRldiwgJmNydGMtPmJhc2UsIERSTV9NT0RFX09CSkVDVF9DUlRDKTsKIAlpZiAocmV0KQpAQCAtNzI2LDggKzc0NCw4IEBACiAKIAljcnRjLT5iYXNlLnByb3BlcnRpZXMgPSAmY3J0Yy0+cHJvcGVydGllczsKIAotCWxpc3RfYWRkX3RhaWwoJmNydGMtPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCk7Ci0JZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YysrOworCWxpc3RfYWRkX3RhaWwoJmNydGMtPmhlYWQsICZjb25maWctPmNydGNfbGlzdCk7CisJY29uZmlnLT5udW1fY3J0YysrOwogCiAJY3J0Yy0+cHJpbWFyeSA9IHByaW1hcnk7CiAJaWYgKHByaW1hcnkpCkBAIC03NTUsNiArNzczLDggQEAKIAlrZnJlZShjcnRjLT5nYW1tYV9zdG9yZSk7CiAJY3J0Yy0+Z2FtbWFfc3RvcmUgPSBOVUxMOwogCisJZHJtX21vZGVzZXRfbG9ja19maW5pKCZjcnRjLT5tdXRleCk7CisKIAlkcm1fbW9kZV9vYmplY3RfcHV0KGRldiwgJmNydGMtPmJhc2UpOwogCWxpc3RfZGVsKCZjcnRjLT5oZWFkKTsKIAlkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjLS07CkBAIC04MjQsNyArODQ0LDcgQEAKIAogCXJldCA9IGRybV9tb2RlX29iamVjdF9nZXQoZGV2LCAmY29ubmVjdG9yLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJY29ubmVjdG9yLT5iYXNlLnByb3BlcnRpZXMgPSAmY29ubmVjdG9yLT5wcm9wZXJ0aWVzOwogCWNvbm5lY3Rvci0+ZGV2ID0gZGV2OwpAQCAtODM0LDkgKzg1NCwxNyBAQAogCQlpZGFfc2ltcGxlX2dldChjb25uZWN0b3JfaWRhLCAxLCAwLCBHRlBfS0VSTkVMKTsKIAlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV9pZCA8IDApIHsKIAkJcmV0ID0gY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV9pZDsKLQkJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZjb25uZWN0b3ItPmJhc2UpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0OwogCX0KKwljb25uZWN0b3ItPm5hbWUgPQorCQlrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLSVkIiwKKwkJCSAgZHJtX2Nvbm5lY3Rvcl9lbnVtX2xpc3RbY29ubmVjdG9yX3R5cGVdLm5hbWUsCisJCQkgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVfaWQpOworCWlmICghY29ubmVjdG9yLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKIAlJTklUX0xJU1RfSEVBRCgmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMpOwogCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0b3ItPm1vZGVzKTsKIAljb25uZWN0b3ItPmVkaWRfYmxvYl9wdHIgPSBOVUxMOwpAQCAtODUzLDcgKzg4MSwxMSBAQAogCWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5KCZjb25uZWN0b3ItPmJhc2UsCiAJCQkJICAgICAgZGV2LT5tb2RlX2NvbmZpZy5kcG1zX3Byb3BlcnR5LCAwKTsKIAotIG91dDoKK291dF9wdXQ6CisJaWYgKHJldCkKKwkJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZjb25uZWN0b3ItPmJhc2UpOworCitvdXRfdW5sb2NrOgogCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKIAogCXJldHVybiByZXQ7CkBAIC04ODEsNiArOTEzLDggQEAKIAkJICAgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV9pZCk7CiAKIAlkcm1fbW9kZV9vYmplY3RfcHV0KGRldiwgJmNvbm5lY3Rvci0+YmFzZSk7CisJa2ZyZWUoY29ubmVjdG9yLT5uYW1lKTsKKwljb25uZWN0b3ItPm5hbWUgPSBOVUxMOwogCWxpc3RfZGVsKCZjb25uZWN0b3ItPmhlYWQpOwogCWRldi0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3Rvci0tOwogfQpAQCAtOTgyLDE2ICsxMDE2LDI3IEBACiAKIAlyZXQgPSBkcm1fbW9kZV9vYmplY3RfZ2V0KGRldiwgJmVuY29kZXItPmJhc2UsIERSTV9NT0RFX09CSkVDVF9FTkNPREVSKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJZW5jb2Rlci0+ZGV2ID0gZGV2OwogCWVuY29kZXItPmVuY29kZXJfdHlwZSA9IGVuY29kZXJfdHlwZTsKIAllbmNvZGVyLT5mdW5jcyA9IGZ1bmNzOworCWVuY29kZXItPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLSVkIiwKKwkJCQkgIGRybV9lbmNvZGVyX2VudW1fbGlzdFtlbmNvZGVyX3R5cGVdLm5hbWUsCisJCQkJICBlbmNvZGVyLT5iYXNlLmlkKTsKKwlpZiAoIWVuY29kZXItPm5hbWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0OworCX0KIAogCWxpc3RfYWRkX3RhaWwoJmVuY29kZXItPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCk7CiAJZGV2LT5tb2RlX2NvbmZpZy5udW1fZW5jb2RlcisrOwogCi0gb3V0Ogorb3V0X3B1dDoKKwlpZiAocmV0KQorCQlkcm1fbW9kZV9vYmplY3RfcHV0KGRldiwgJmVuY29kZXItPmJhc2UpOworCitvdXRfdW5sb2NrOgogCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKIAogCXJldHVybiByZXQ7CkBAIC0xMDA5LDYgKzEwNTQsOCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAlkcm1fbW9kZV9vYmplY3RfcHV0KGRldiwgJmVuY29kZXItPmJhc2UpOworCWtmcmVlKGVuY29kZXItPm5hbWUpOworCWVuY29kZXItPm5hbWUgPSBOVUxMOwogCWxpc3RfZGVsKCZlbmNvZGVyLT5oZWFkKTsKIAlkZXYtPm1vZGVfY29uZmlnLm51bV9lbmNvZGVyLS07CiAJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwpAQCAtMTE0NSwxNiArMTE5MiwxOSBAQAogICovCiB2b2lkIGRybV9wbGFuZV9mb3JjZV9kaXNhYmxlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQogeworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYiA9IHBsYW5lLT5mYjsKIAlpbnQgcmV0OwogCi0JaWYgKCFwbGFuZS0+ZmIpCisJaWYgKCFvbGRfZmIpCiAJCXJldHVybjsKIAogCXJldCA9IHBsYW5lLT5mdW5jcy0+ZGlzYWJsZV9wbGFuZShwbGFuZSk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGRpc2FibGUgcGxhbmUgd2l0aCBidXN5IGZiXG4iKTsKKwkJcmV0dXJuOworCX0KIAkvKiBkaXNjb25uZWN0IHRoZSBwbGFuZSBmcm9tIHRoZSBmYiBhbmQgY3J0YzogKi8KLQlfX2RybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZShwbGFuZS0+ZmIpOworCV9fZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKG9sZF9mYik7CiAJcGxhbmUtPmZiID0gTlVMTDsKIAlwbGFuZS0+Y3J0YyA9IE5VTEw7CiB9CkBAIC0xMzc4LDYgKzE0MjgsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBkcm1fbW9kZV9ncm91cF9kZXN0cm95KHN0cnVjdCBkcm1fbW9kZV9ncm91cCAqZ3JvdXApCit7CisJa2ZyZWUoZ3JvdXAtPmlkX2xpc3QpOworCWdyb3VwLT5pZF9saXN0ID0gTlVMTDsKK30KKwogLyoKICAqIE5PVEU6IERyaXZlcidzIHNob3VsZG4ndCBldmVyIGNhbGwgZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAgLSBpdCBpcwogICogdGhlIGRybSBjb3JlJ3MgcmVzcG9uc2liaWxpdHkgdG8gc2V0IHVwIG1vZGUgY29udHJvbCBncm91cHMuCkBAIC0xNjE0LDcgKzE2NzAsNyBAQAogCQkJCQkgICAgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LAogCQkJCQkgICAgaGVhZCkgewogCQkJCURSTV9ERUJVR19LTVMoIltFTkNPREVSOiVkOiVzXVxuIiwgZW5jb2Rlci0+YmFzZS5pZCwKLQkJCQkJCWRybV9nZXRfZW5jb2Rlcl9uYW1lKGVuY29kZXIpKTsKKwkJCQkJCWVuY29kZXItPm5hbWUpOwogCQkJCWlmIChwdXRfdXNlcihlbmNvZGVyLT5iYXNlLmlkLCBlbmNvZGVyX2lkICsKIAkJCQkJICAgICBjb3BpZWQpKSB7CiAJCQkJCXJldCA9IC1FRkFVTFQ7CkBAIC0xNjQ2LDcgKzE3MDIsNyBAQAogCQkJCQkgICAgaGVhZCkgewogCQkJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdXG4iLAogCQkJCQljb25uZWN0b3ItPmJhc2UuaWQsCi0JCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJCWNvbm5lY3Rvci0+bmFtZSk7CiAJCQkJaWYgKHB1dF91c2VyKGNvbm5lY3Rvci0+YmFzZS5pZCwKIAkJCQkJICAgICBjb25uZWN0b3JfaWQgKyBjb3BpZWQpKSB7CiAJCQkJCXJldCA9IC1FRkFVTFQ7CkBAIC0xNjk1LDcgKzE3NTEsNiBAQAogewogCXN0cnVjdCBkcm1fbW9kZV9jcnRjICpjcnRjX3Jlc3AgPSBkYXRhOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKLQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCkBAIC0xNzAzLDEzICsxNzU4LDExIEBACiAKIAlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwogCi0Jb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBjcnRjX3Jlc3AtPmNydGNfaWQsCi0JCQkJICAgRFJNX01PREVfT0JKRUNUX0NSVEMpOwotCWlmICghb2JqKSB7CisJY3J0YyA9IGRybV9jcnRjX2ZpbmQoZGV2LCBjcnRjX3Jlc3AtPmNydGNfaWQpOworCWlmICghY3J0YykgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKIAl9Ci0JY3J0YyA9IG9ial90b19jcnRjKG9iaik7CiAKIAljcnRjX3Jlc3AtPnggPSBjcnRjLT54OwogCWNydGNfcmVzcC0+eSA9IGNydGMtPnk7CkBAIC0xNzYzLDcgKzE4MTYsNiBAQAogCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvciAqb3V0X3Jlc3AgPSBkYXRhOwotCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwogCWludCBtb2RlX2NvdW50ID0gMDsKQEAgLTE3ODcsMTMgKzE4MzksMTEgQEAKIAogCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwogCi0Jb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBvdXRfcmVzcC0+Y29ubmVjdG9yX2lkLAotCQkJCSAgIERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1IpOwotCWlmICghb2JqKSB7CisJY29ubmVjdG9yID0gZHJtX2Nvbm5lY3Rvcl9maW5kKGRldiwgb3V0X3Jlc3AtPmNvbm5lY3Rvcl9pZCk7CisJaWYgKCFjb25uZWN0b3IpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWNvbm5lY3RvciA9IG9ial90b19jb25uZWN0b3Iob2JqKTsKIAogCXByb3BzX2NvdW50ID0gY29ubmVjdG9yLT5wcm9wZXJ0aWVzLmNvdW50OwogCkBAIC0xODIxLDEwICsxODcxLDEyIEBACiAJb3V0X3Jlc3AtPm1tX2hlaWdodCA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmhlaWdodF9tbTsKIAlvdXRfcmVzcC0+c3VicGl4ZWwgPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlcjsKIAlvdXRfcmVzcC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rvci0+c3RhdHVzOworCWRybV9tb2Rlc2V0X2xvY2soJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCwgTlVMTCk7CiAJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlcikKIAkJb3V0X3Jlc3AtPmVuY29kZXJfaWQgPSBjb25uZWN0b3ItPmVuY29kZXItPmJhc2UuaWQ7CiAJZWxzZQogCQlvdXRfcmVzcC0+ZW5jb2Rlcl9pZCA9IDA7CisJZHJtX21vZGVzZXRfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpOwogCiAJLyoKIAkgKiBUaGlzIGlvY3RsIGlzIGNhbGxlZCB0d2ljZSwgb25jZSB0byBkZXRlcm1pbmUgaG93IG11Y2ggc3BhY2UgaXMKQEAgLTE5MDgsNyArMTk2MCw2IEBACiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgKmVuY19yZXNwID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCWludCByZXQgPSAwOwogCkBAIC0xOTE2LDEzICsxOTY3LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGVuY19yZXNwLT5lbmNvZGVyX2lkLAotCQkJCSAgIERSTV9NT0RFX09CSkVDVF9FTkNPREVSKTsKLQlpZiAoIW9iaikgeworCWVuY29kZXIgPSBkcm1fZW5jb2Rlcl9maW5kKGRldiwgZW5jX3Jlc3AtPmVuY29kZXJfaWQpOworCWlmICghZW5jb2RlcikgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKIAl9Ci0JZW5jb2RlciA9IG9ial90b19lbmNvZGVyKG9iaik7CiAKIAlpZiAoZW5jb2Rlci0+Y3J0YykKIAkJZW5jX3Jlc3AtPmNydGNfaWQgPSBlbmNvZGVyLT5jcnRjLT5iYXNlLmlkOwpAQCAtMjAyMCw3ICsyMDY5LDYgQEAKIAkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2RlX2dldF9wbGFuZSAqcGxhbmVfcmVzcCA9IGRhdGE7Ci0Jc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lOwogCXVpbnQzMl90IF9fdXNlciAqZm9ybWF0X3B0cjsKIAlpbnQgcmV0ID0gMDsKQEAgLTIwMjksMTMgKzIwNzcsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwotCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgcGxhbmVfcmVzcC0+cGxhbmVfaWQsCi0JCQkJICAgRFJNX01PREVfT0JKRUNUX1BMQU5FKTsKLQlpZiAoIW9iaikgeworCXBsYW5lID0gZHJtX3BsYW5lX2ZpbmQoZGV2LCBwbGFuZV9yZXNwLT5wbGFuZV9pZCk7CisJaWYgKCFwbGFuZSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKIAl9Ci0JcGxhbmUgPSBvYmpfdG9fcGxhbmUob2JqKTsKIAogCWlmIChwbGFuZS0+Y3J0YykKIAkJcGxhbmVfcmVzcC0+Y3J0Y19pZCA9IHBsYW5lLT5jcnRjLT5iYXNlLmlkOwpAQCAtMjA4OCw3ICsyMTM0LDYgQEAKIAkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2RlX3NldF9wbGFuZSAqcGxhbmVfcmVxID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gTlVMTCwgKm9sZF9mYiA9IE5VTEw7CkBAIC0yMTAzLDM1ICsyMTQ4LDQyIEBACiAJICogRmlyc3QsIGZpbmQgdGhlIHBsYW5lLCBjcnRjLCBhbmQgZmIgb2JqZWN0cy4gIElmIG5vdCBhdmFpbGFibGUsCiAJICogd2UgZG9uJ3QgYm90aGVyIHRvIGNhbGwgdGhlIGRyaXZlci4KIAkgKi8KLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIHBsYW5lX3JlcS0+cGxhbmVfaWQsCi0JCQkJICAgRFJNX01PREVfT0JKRUNUX1BMQU5FKTsKLQlpZiAoIW9iaikgeworCXBsYW5lID0gZHJtX3BsYW5lX2ZpbmQoZGV2LCBwbGFuZV9yZXEtPnBsYW5lX2lkKTsKKwlpZiAoIXBsYW5lKSB7CiAJCURSTV9ERUJVR19LTVMoIlVua25vd24gcGxhbmUgSUQgJWRcbiIsCiAJCQkgICAgICBwbGFuZV9yZXEtPnBsYW5lX2lkKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCXBsYW5lID0gb2JqX3RvX3BsYW5lKG9iaik7CiAKIAkvKiBObyBmYiBtZWFucyBzaHV0IGl0IGRvd24gKi8KIAlpZiAoIXBsYW5lX3JlcS0+ZmJfaWQpIHsKIAkJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAkJb2xkX2ZiID0gcGxhbmUtPmZiOwotCQlwbGFuZS0+ZnVuY3MtPmRpc2FibGVfcGxhbmUocGxhbmUpOwotCQlwbGFuZS0+Y3J0YyA9IE5VTEw7Ci0JCXBsYW5lLT5mYiA9IE5VTEw7CisJCXJldCA9IHBsYW5lLT5mdW5jcy0+ZGlzYWJsZV9wbGFuZShwbGFuZSk7CisJCWlmICghcmV0KSB7CisJCQlwbGFuZS0+Y3J0YyA9IE5VTEw7CisJCQlwbGFuZS0+ZmIgPSBOVUxMOworCQl9IGVsc2UgeworCQkJb2xkX2ZiID0gTlVMTDsKKwkJfQogCQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAJCWdvdG8gb3V0OwogCX0KIAotCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgcGxhbmVfcmVxLT5jcnRjX2lkLAotCQkJCSAgIERSTV9NT0RFX09CSkVDVF9DUlRDKTsKLQlpZiAoIW9iaikgeworCWNydGMgPSBkcm1fY3J0Y19maW5kKGRldiwgcGxhbmVfcmVxLT5jcnRjX2lkKTsKKwlpZiAoIWNydGMpIHsKIAkJRFJNX0RFQlVHX0tNUygiVW5rbm93biBjcnRjIElEICVkXG4iLAogCQkJICAgICAgcGxhbmVfcmVxLT5jcnRjX2lkKTsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOworCisJLyogQ2hlY2sgd2hldGhlciB0aGlzIHBsYW5lIGlzIHVzYWJsZSBvbiB0aGlzIENSVEMgKi8KKwlpZiAoIShwbGFuZS0+cG9zc2libGVfY3J0Y3MgJiBkcm1fY3J0Y19tYXNrKGNydGMpKSkgeworCQlEUk1fREVCVUdfS01TKCJJbnZhbGlkIGNydGMgZm9yIHBsYW5lXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQogCiAJZmIgPSBkcm1fZnJhbWVidWZmZXJfbG9va3VwKGRldiwgcGxhbmVfcmVxLT5mYl9pZCk7CiAJaWYgKCFmYikgewpAQCAtMjE4NywxNiArMjIzOSwxOCBAQAogCX0KIAogCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CisJb2xkX2ZiID0gcGxhbmUtPmZiOwogCXJldCA9IHBsYW5lLT5mdW5jcy0+dXBkYXRlX3BsYW5lKHBsYW5lLCBjcnRjLCBmYiwKIAkJCQkJIHBsYW5lX3JlcS0+Y3J0Y194LCBwbGFuZV9yZXEtPmNydGNfeSwKIAkJCQkJIHBsYW5lX3JlcS0+Y3J0Y193LCBwbGFuZV9yZXEtPmNydGNfaCwKIAkJCQkJIHBsYW5lX3JlcS0+c3JjX3gsIHBsYW5lX3JlcS0+c3JjX3ksCiAJCQkJCSBwbGFuZV9yZXEtPnNyY193LCBwbGFuZV9yZXEtPnNyY19oKTsKIAlpZiAoIXJldCkgewotCQlvbGRfZmIgPSBwbGFuZS0+ZmI7CiAJCXBsYW5lLT5jcnRjID0gY3J0YzsKIAkJcGxhbmUtPmZiID0gZmI7CiAJCWZiID0gTlVMTDsKKwl9IGVsc2UgeworCQlvbGRfZmIgPSBOVUxMOwogCX0KIAlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAKQEAgLTIyMzksOSArMjI5Myw3IEBACiAJcmV0ID0gY3J0Yy0+ZnVuY3MtPnNldF9jb25maWcoc2V0KTsKIAlpZiAocmV0ID09IDApIHsKIAkJY3J0Yy0+cHJpbWFyeS0+Y3J0YyA9IGNydGM7Ci0KLQkJLyogY3J0Yy0+ZmIgbXVzdCBiZSB1cGRhdGVkIGJ5IC0+c2V0X2NvbmZpZywgZW5mb3JjZXMgdGhpcy4gKi8KLQkJV0FSTl9PTihmYiAhPSBjcnRjLT5wcmltYXJ5LT5mYik7CisJCWNydGMtPnByaW1hcnktPmZiID0gZmI7CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjcnRjLT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewpAQCAtMjMxOCw3ICsyMzcwLDYgQEAKIHsKIAlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpjb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKIAlzdHJ1Y3QgZHJtX21vZGVfY3J0YyAqY3J0Y19yZXEgPSBkYXRhOwotCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3Jfc2V0ID0gTlVMTCwgKmNvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IE5VTEw7CkBAIC0yMzM2LDE0ICsyMzg3LDEyIEBACiAJCXJldHVybiAtRVJBTkdFOwogCiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfcmVxLT5jcnRjX2lkLAotCQkJCSAgIERSTV9NT0RFX09CSkVDVF9DUlRDKTsKLQlpZiAoIW9iaikgeworCWNydGMgPSBkcm1fY3J0Y19maW5kKGRldiwgY3J0Y19yZXEtPmNydGNfaWQpOworCWlmICghY3J0YykgewogCQlEUk1fREVCVUdfS01TKCJVbmtub3duIENSVEMgSUQgJWRcbiIsIGNydGNfcmVxLT5jcnRjX2lkKTsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCURSTV9ERUJVR19LTVMoIltDUlRDOiVkXVxuIiwgY3J0Yy0+YmFzZS5pZCk7CiAKIAlpZiAoY3J0Y19yZXEtPm1vZGVfdmFsaWQpIHsKQEAgLTI0MjYsMTggKzI0NzUsMTYgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAotCQkJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBvdXRfaWQsCi0JCQkJCQkgICBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKLQkJCWlmICghb2JqKSB7CisJCQljb25uZWN0b3IgPSBkcm1fY29ubmVjdG9yX2ZpbmQoZGV2LCBvdXRfaWQpOworCQkJaWYgKCFjb25uZWN0b3IpIHsKIAkJCQlEUk1fREVCVUdfS01TKCJDb25uZWN0b3IgaWQgJWQgdW5rbm93blxuIiwKIAkJCQkJCW91dF9pZCk7CiAJCQkJcmV0ID0gLUVOT0VOVDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWNvbm5lY3RvciA9IG9ial90b19jb25uZWN0b3Iob2JqKTsKIAkJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdXG4iLAogCQkJCQljb25uZWN0b3ItPmJhc2UuaWQsCi0JCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJCWNvbm5lY3Rvci0+bmFtZSk7CiAKIAkJCWNvbm5lY3Rvcl9zZXRbaV0gPSBjb25uZWN0b3I7CiAJCX0KQEAgLTI0NjYsNyArMjUxMyw2IEBACiAJCQkJICBzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yMiAqcmVxLAogCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0Jc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjQ3NiwxNCArMjUyMiwxMyBAQAogCWlmICghcmVxLT5mbGFncyB8fCAofkRSTV9NT0RFX0NVUlNPUl9GTEFHUyAmIHJlcS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgcmVxLT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7Ci0JaWYgKCFvYmopIHsKKwljcnRjID0gZHJtX2NydGNfZmluZChkZXYsIHJlcS0+Y3J0Y19pZCk7CisJaWYgKCFjcnRjKSB7CiAJCURSTV9ERUJVR19LTVMoIlVua25vd24gQ1JUQyBJRCAlZFxuIiwgcmVxLT5jcnRjX2lkKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCi0JbXV0ZXhfbG9jaygmY3J0Yy0+bXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2soJmNydGMtPm11dGV4LCBOVUxMKTsKIAlpZiAocmVxLT5mbGFncyAmIERSTV9NT0RFX0NVUlNPUl9CTykgewogCQlpZiAoIWNydGMtPmZ1bmNzLT5jdXJzb3Jfc2V0ICYmICFjcnRjLT5mdW5jcy0+Y3Vyc29yX3NldDIpIHsKIAkJCXJldCA9IC1FTlhJTzsKQEAgLTI1MDcsNyArMjU1Miw3IEBACiAJCX0KIAl9CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjcnRjLT5tdXRleCk7CisJZHJtX21vZGVzZXRfdW5sb2NrKCZjcnRjLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0zMDk3LDYgKzMxNDIsOCBAQAogCWlmICghcHJvcGVydHkpCiAJCXJldHVybiBOVUxMOwogCisJcHJvcGVydHktPmRldiA9IGRldjsKKwogCWlmIChudW1fdmFsdWVzKSB7CiAJCXByb3BlcnR5LT52YWx1ZXMgPSBremFsbG9jKHNpemVvZih1aW50NjRfdCkqbnVtX3ZhbHVlcywgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHJvcGVydHktPnZhbHVlcykKQEAgLTMxMTcsNiArMzE2NCw5IEBACiAJfQogCiAJbGlzdF9hZGRfdGFpbCgmcHJvcGVydHktPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLnByb3BlcnR5X2xpc3QpOworCisJV0FSTl9PTighZHJtX3Byb3BlcnR5X3R5cGVfdmFsaWQocHJvcGVydHkpKTsKKwogCXJldHVybiBwcm9wZXJ0eTsKIGZhaWw6CiAJa2ZyZWUocHJvcGVydHktPnZhbHVlcyk7CkBAIC0zMjE3LDYgKzMyNjcsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3Byb3BlcnR5X2NyZWF0ZV9iaXRtYXNrKTsKIAorc3RhdGljIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5X2NyZWF0ZV9yYW5nZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgdWludDY0X3QgbWluLCB1aW50NjRfdCBtYXgpCit7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHk7CisKKwlwcm9wZXJ0eSA9IGRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBmbGFncywgbmFtZSwgMik7CisJaWYgKCFwcm9wZXJ0eSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcm9wZXJ0eS0+dmFsdWVzWzBdID0gbWluOworCXByb3BlcnR5LT52YWx1ZXNbMV0gPSBtYXg7CisKKwlyZXR1cm4gcHJvcGVydHk7Cit9CisKIC8qKgogICogZHJtX3Byb3BlcnR5X2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyByYW5nZWQgcHJvcGVydHkgdHlwZQogICogQGRldjogZHJtIGRldmljZQpAQCAtMzIzOSwyMCArMzMwNSwzNiBAQAogCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJIHVpbnQ2NF90IG1pbiwgdWludDY0X3QgbWF4KQogeworCXJldHVybiBwcm9wZXJ0eV9jcmVhdGVfcmFuZ2UoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFIHwgZmxhZ3MsCisJCQluYW1lLCBtaW4sIG1heCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wcm9wZXJ0eV9jcmVhdGVfcmFuZ2UpOworCitzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkcm1fcHJvcGVydHlfY3JlYXRlX3NpZ25lZF9yYW5nZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgaW50NjRfdCBtaW4sIGludDY0X3QgbWF4KQoreworCXJldHVybiBwcm9wZXJ0eV9jcmVhdGVfcmFuZ2UoZGV2LCBEUk1fTU9ERV9QUk9QX1NJR05FRF9SQU5HRSB8IGZsYWdzLAorCQkJbmFtZSwgSTY0MlU2NChtaW4pLCBJNjQyVTY0KG1heCkpOworfQorRVhQT1JUX1NZTUJPTChkcm1fcHJvcGVydHlfY3JlYXRlX3NpZ25lZF9yYW5nZSk7CisKK3N0cnVjdCBkcm1fcHJvcGVydHkgKmRybV9wcm9wZXJ0eV9jcmVhdGVfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHR5cGUpCit7CiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHk7CiAKLQlmbGFncyB8PSBEUk1fTU9ERV9QUk9QX1JBTkdFOworCWZsYWdzIHw9IERSTV9NT0RFX1BST1BfT0JKRUNUOwogCi0JcHJvcGVydHkgPSBkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgZmxhZ3MsIG5hbWUsIDIpOworCXByb3BlcnR5ID0gZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIGZsYWdzLCBuYW1lLCAxKTsKIAlpZiAoIXByb3BlcnR5KQogCQlyZXR1cm4gTlVMTDsKIAotCXByb3BlcnR5LT52YWx1ZXNbMF0gPSBtaW47Ci0JcHJvcGVydHktPnZhbHVlc1sxXSA9IG1heDsKKwlwcm9wZXJ0eS0+dmFsdWVzWzBdID0gdHlwZTsKIAogCXJldHVybiBwcm9wZXJ0eTsKIH0KLUVYUE9SVF9TWU1CT0woZHJtX3Byb3BlcnR5X2NyZWF0ZV9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKGRybV9wcm9wZXJ0eV9jcmVhdGVfb2JqZWN0KTsKIAogLyoqCiAgKiBkcm1fcHJvcGVydHlfYWRkX2VudW0gLSBhZGQgYSBwb3NzaWJsZSB2YWx1ZSB0byBhbiBlbnVtZXJhdGlvbiBwcm9wZXJ0eQpAQCAtMzI3NCwxNCArMzM1NiwxNiBAQAogewogCXN0cnVjdCBkcm1fcHJvcGVydHlfZW51bSAqcHJvcF9lbnVtOwogCi0JaWYgKCEocHJvcGVydHktPmZsYWdzICYgKERSTV9NT0RFX1BST1BfRU5VTSB8IERSTV9NT0RFX1BST1BfQklUTUFTSykpKQorCWlmICghKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX0VOVU0pIHx8CisJCQlkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wZXJ0eSwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKIAkgKiBCaXRtYXNrIGVudW0gcHJvcGVydGllcyBoYXZlIHRoZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgb2YgdmFsdWVzCiAJICogZnJvbSAwIHRvIDYzCiAJICovCi0JaWYgKChwcm9wZXJ0eS0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JJVE1BU0spICYmICh2YWx1ZSA+IDYzKSkKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcGVydHksIERSTV9NT0RFX1BST1BfQklUTUFTSykgJiYKKwkJCSh2YWx1ZSA+IDYzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCkpIHsKQEAgLTM0MzgsNyArMzUyMiw2IEBACiBpbnQgZHJtX21vZGVfZ2V0cHJvcGVydHlfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSAqb3V0X3Jlc3AgPSBkYXRhOwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5OwogCWludCBlbnVtX2NvdW50ID0gMDsKQEAgLTM0NTcsMTcgKzM1NDAsMTcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwotCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgb3V0X3Jlc3AtPnByb3BfaWQsIERSTV9NT0RFX09CSkVDVF9QUk9QRVJUWSk7Ci0JaWYgKCFvYmopIHsKKwlwcm9wZXJ0eSA9IGRybV9wcm9wZXJ0eV9maW5kKGRldiwgb3V0X3Jlc3AtPnByb3BfaWQpOworCWlmICghcHJvcGVydHkpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBkb25lOwogCX0KLQlwcm9wZXJ0eSA9IG9ial90b19wcm9wZXJ0eShvYmopOwogCi0JaWYgKHByb3BlcnR5LT5mbGFncyAmIChEUk1fTU9ERV9QUk9QX0VOVU0gfCBEUk1fTU9ERV9QUk9QX0JJVE1BU0spKSB7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX0VOVU0pIHx8CisJCQlkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wZXJ0eSwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3BfZW51bSwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCwgaGVhZCkKIAkJCWVudW1fY291bnQrKzsKLQl9IGVsc2UgaWYgKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQikgeworCX0gZWxzZSBpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcGVydHksIERSTV9NT0RFX1BST1BfQkxPQikpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwcm9wX2Jsb2IsICZwcm9wZXJ0eS0+ZW51bV9ibG9iX2xpc3QsIGhlYWQpCiAJCQlibG9iX2NvdW50Kys7CiAJfQpAQCAtMzQ4OSw3ICszNTcyLDggQEAKIAl9CiAJb3V0X3Jlc3AtPmNvdW50X3ZhbHVlcyA9IHZhbHVlX2NvdW50OwogCi0JaWYgKHByb3BlcnR5LT5mbGFncyAmIChEUk1fTU9ERV9QUk9QX0VOVU0gfCBEUk1fTU9ERV9QUk9QX0JJVE1BU0spKSB7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX0VOVU0pIHx8CisJCQlkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wZXJ0eSwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkgewogCQlpZiAoKG91dF9yZXNwLT5jb3VudF9lbnVtX2Jsb2JzID49IGVudW1fY291bnQpICYmIGVudW1fY291bnQpIHsKIAkJCWNvcGllZCA9IDA7CiAJCQllbnVtX3B0ciA9IChzdHJ1Y3QgZHJtX21vZGVfcHJvcGVydHlfZW51bSBfX3VzZXIgKikodW5zaWduZWQgbG9uZylvdXRfcmVzcC0+ZW51bV9ibG9iX3B0cjsKQEAgLTM1MTEsNyArMzU5NSw3IEBACiAJCW91dF9yZXNwLT5jb3VudF9lbnVtX2Jsb2JzID0gZW51bV9jb3VudDsKIAl9CiAKLQlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9CTE9CKSB7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX0JMT0IpKSB7CiAJCWlmICgob3V0X3Jlc3AtPmNvdW50X2VudW1fYmxvYnMgPj0gYmxvYl9jb3VudCkgJiYgYmxvYl9jb3VudCkgewogCQkJY29waWVkID0gMDsKIAkJCWJsb2JfaWRfcHRyID0gKHVpbnQzMl90IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKW91dF9yZXNwLT5lbnVtX2Jsb2JfcHRyOwpAQCAtMzU5MCw3ICszNjc0LDYgQEAKIGludCBkcm1fbW9kZV9nZXRibG9iX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9tb2RlX2dldF9ibG9iICpvdXRfcmVzcCA9IGRhdGE7CiAJc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpibG9iOwogCWludCByZXQgPSAwOwpAQCAtMzYwMCwxMiArMzY4MywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0Jb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBvdXRfcmVzcC0+YmxvYl9pZCwgRFJNX01PREVfT0JKRUNUX0JMT0IpOwotCWlmICghb2JqKSB7CisJYmxvYiA9IGRybV9wcm9wZXJ0eV9ibG9iX2ZpbmQoZGV2LCBvdXRfcmVzcC0+YmxvYl9pZCk7CisJaWYgKCFibG9iKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JYmxvYiA9IG9ial90b19ibG9iKG9iaik7CiAKIAlpZiAob3V0X3Jlc3AtPmxlbmd0aCA9PSBibG9iLT5sZW5ndGgpIHsKIAkJYmxvYl9wdHIgPSAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylvdXRfcmVzcC0+ZGF0YTsKQEAgLTM2NjcsMTkgKzM3NDksNDAgQEAKIHsKIAlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9JTU1VVEFCTEUpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9SQU5HRSkgeworCisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX1JBTkdFKSkgewogCQlpZiAodmFsdWUgPCBwcm9wZXJ0eS0+dmFsdWVzWzBdIHx8IHZhbHVlID4gcHJvcGVydHktPnZhbHVlc1sxXSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmIChwcm9wZXJ0eS0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JJVE1BU0spIHsKKwl9IGVsc2UgaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX1NJR05FRF9SQU5HRSkpIHsKKwkJaW50NjRfdCBzdmFsdWUgPSBVNjQySTY0KHZhbHVlKTsKKwkJaWYgKHN2YWx1ZSA8IFU2NDJJNjQocHJvcGVydHktPnZhbHVlc1swXSkgfHwKKwkJCQlzdmFsdWUgPiBVNjQySTY0KHByb3BlcnR5LT52YWx1ZXNbMV0pKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3BlcnR5LCBEUk1fTU9ERV9QUk9QX0JJVE1BU0spKSB7CiAJCWludCBpOwogCQl1aW50NjRfdCB2YWxpZF9tYXNrID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHByb3BlcnR5LT5udW1fdmFsdWVzOyBpKyspCiAJCQl2YWxpZF9tYXNrIHw9ICgxVUxMIDw8IHByb3BlcnR5LT52YWx1ZXNbaV0pOwogCQlyZXR1cm4gISh2YWx1ZSAmIH52YWxpZF9tYXNrKTsKLQl9IGVsc2UgaWYgKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQikgeworCX0gZWxzZSBpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcGVydHksIERSTV9NT0RFX1BST1BfQkxPQikpIHsKIAkJLyogT25seSB0aGUgZHJpdmVyIGtub3dzICovCiAJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcGVydHksIERSTV9NT0RFX1BST1BfT0JKRUNUKSkgeworCQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJCS8qIGEgemVybyB2YWx1ZSBmb3IgYW4gb2JqZWN0IHByb3BlcnR5IHRyYW5zbGF0ZXMgdG8gbnVsbDogKi8KKwkJaWYgKHZhbHVlID09IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJLyoKKwkJICogTk9URTogdXNlIF9vYmplY3RfZmluZCgpIGRpcmVjdGx5IHRvIGJ5cGFzcyByZXN0cmljdGlvbiBvbgorCQkgKiBsb29raW5nIHVwIHJlZmNudCdkIG9iamVjdHMgKGllLiBmYidzKS4gIEZvciBhIHJlZmNudCdkCisJCSAqIG9iamVjdCB0aGlzIGNvdWxkIHJhY2UgYWdhaW5zdCBvYmplY3QgZmluYWxpemF0aW9uLCBzbyBpdAorCQkgKiBzaW1wbHkgdGVsbHMgdXMgdGhhdCB0aGUgb2JqZWN0ICp3YXMqIHZhbGlkLiAgV2hpY2ggaXMgZ29vZAorCQkgKiBlbm91Z2guCisJCSAqLworCQlvYmogPSBfb2JqZWN0X2ZpbmQocHJvcGVydHktPmRldiwgdmFsdWUsIHByb3BlcnR5LT52YWx1ZXNbMF0pOworCQlyZXR1cm4gb2JqICE9IE5VTEw7CiAJfSBlbHNlIHsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0eS0+bnVtX3ZhbHVlczsgaSsrKQpAQCAtMzk4Nyw3ICs0MDkwLDYgQEAKIAkJCSAgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2RlX2NydGNfbHV0ICpjcnRjX2x1dCA9IGRhdGE7Ci0Jc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAl2b2lkICpyX2Jhc2UsICpnX2Jhc2UsICpiX2Jhc2U7CiAJaW50IHNpemU7CkBAIC0zOTk3LDEyICs0MDk5LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfbHV0LT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7Ci0JaWYgKCFvYmopIHsKKwljcnRjID0gZHJtX2NydGNfZmluZChkZXYsIGNydGNfbHV0LT5jcnRjX2lkKTsKKwlpZiAoIWNydGMpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCiAJaWYgKGNydGMtPmZ1bmNzLT5nYW1tYV9zZXQgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PU1lTOwpAQCAtNDA2MSw3ICs0MTYyLDYgQEAKIAkJCSAgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2RlX2NydGNfbHV0ICpjcnRjX2x1dCA9IGRhdGE7Ci0Jc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAl2b2lkICpyX2Jhc2UsICpnX2Jhc2UsICpiX2Jhc2U7CiAJaW50IHNpemU7CkBAIC00MDcxLDEyICs0MTcxLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfbHV0LT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7Ci0JaWYgKCFvYmopIHsKKwljcnRjID0gZHJtX2NydGNfZmluZChkZXYsIGNydGNfbHV0LT5jcnRjX2lkKTsKKwlpZiAoIWNydGMpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCiAJLyogbWVtY3B5IGludG8gZ2FtbWEgc3RvcmUgKi8KIAlpZiAoY3J0Y19sdXQtPmdhbW1hX3NpemUgIT0gY3J0Yy0+Z2FtbWFfc2l6ZSkgewpAQCAtNDEyOSw3ICs0MjI4LDYgQEAKIAkJCSAgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2RlX2NydGNfcGFnZV9mbGlwICpwYWdlX2ZsaXAgPSBkYXRhOwotCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBOVUxMLCAqb2xkX2ZiID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplID0gTlVMTDsKQEAgLTQxNDMsMTIgKzQyNDEsMTEgQEAKIAlpZiAoKHBhZ2VfZmxpcC0+ZmxhZ3MgJiBEUk1fTU9ERV9QQUdFX0ZMSVBfQVNZTkMpICYmICFkZXYtPm1vZGVfY29uZmlnLmFzeW5jX3BhZ2VfZmxpcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIHBhZ2VfZmxpcC0+Y3J0Y19pZCwgRFJNX01PREVfT0JKRUNUX0NSVEMpOwotCWlmICghb2JqKQorCWNydGMgPSBkcm1fY3J0Y19maW5kKGRldiwgcGFnZV9mbGlwLT5jcnRjX2lkKTsKKwlpZiAoIWNydGMpCiAJCXJldHVybiAtRU5PRU5UOwotCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCi0JbXV0ZXhfbG9jaygmY3J0Yy0+bXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2soJmNydGMtPm11dGV4LCBOVUxMKTsKIAlpZiAoY3J0Yy0+cHJpbWFyeS0+ZmIgPT0gTlVMTCkgewogCQkvKiBUaGUgZnJhbWVidWZmZXIgaXMgY3VycmVudGx5IHVuYm91bmQsIHByZXN1bWFibHkKIAkJICogZHVlIHRvIGEgaG90cGx1ZyBldmVudCwgdGhhdCB1c2Vyc3BhY2UgaGFzIG5vdApAQCAtNDIzMiw3ICs0MzI5LDcgQEAKIAkJZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKGZiKTsKIAlpZiAob2xkX2ZiKQogCQlkcm1fZnJhbWVidWZmZXJfdW5yZWZlcmVuY2Uob2xkX2ZiKTsKLQltdXRleF91bmxvY2soJmNydGMtPm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2soJmNydGMtPm11dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NTk3LDYgKzQ2OTQsNyBAQAogdm9pZCBkcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCW11dGV4X2luaXQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2tfaW5pdCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KTsKIAltdXRleF9pbml0KCZkZXYtPm1vZGVfY29uZmlnLmlkcl9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5tb2RlX2NvbmZpZy5mYl9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5mYl9saXN0KTsKQEAgLTQ2OTYsNSArNDc5NCw2IEBACiAJfQogCiAJaWRyX2Rlc3Ryb3koJmRldi0+bW9kZV9jb25maWcuY3J0Y19pZHIpOworCWRybV9tb2Rlc2V0X2xvY2tfZmluaSgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21vZGVfY29uZmlnX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IDg3MmJhMTEuLjc4YjM3ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTkzLDggKzkzLDEwIEBACiAJICogV2UgY2FuIGV4cGVjdCB0aGlzIG11dGV4IHRvIGJlIGxvY2tlZCBpZiB3ZSBhcmUgbm90IHBhbmlja2luZy4KIAkgKiBMb2NraW5nIGlzIGN1cnJlbnRseSBmdWJhciBpbiB0aGUgcGFuaWMgaGFuZGxlci4KIAkgKi8KLQlpZiAoIW9vcHNfaW5fcHJvZ3Jlc3MpCisJaWYgKCFvb3BzX2luX3Byb2dyZXNzKSB7CiAJCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpOworCQlXQVJOX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCkpOworCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkKIAkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciA9PSBlbmNvZGVyKQpAQCAtMTUzLDIwICsxNTUsMTQgQEAKIHN0YXRpYyB2b2lkIF9fZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAKIAlkcm1fd2Fybl9vbl9tb2Rlc2V0X25vdF9hbGxfbG9ja2VkKGRldik7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJaWYgKCFjb25uZWN0b3ItPmVuY29kZXIpCi0JCQljb250aW51ZTsKLQl9Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewogCQlpZiAoIWRybV9oZWxwZXJfZW5jb2Rlcl9pbl91c2UoZW5jb2RlcikpIHsKIAkJCWRybV9lbmNvZGVyX2Rpc2FibGUoZW5jb2Rlcik7Ci0JCQkvKiBkaXNjb25uZWN0b3IgZW5jb2RlciBmcm9tIGFueSBjb25uZWN0b3IgKi8KKwkJCS8qIGRpc2Nvbm5lY3QgZW5jb2RlciBmcm9tIGFueSBjb25uZWN0b3IgKi8KIAkJCWVuY29kZXItPmNydGMgPSBOVUxMOwogCQl9CiAJfQpAQCAtMzQ5LDcgKzM0NSw3IEBACiAJCQljb250aW51ZTsKIAogCQlEUk1fREVCVUdfS01TKCJbRU5DT0RFUjolZDolc10gc2V0IFtNT0RFOiVkOiVzXVxuIiwKLQkJCWVuY29kZXItPmJhc2UuaWQsIGRybV9nZXRfZW5jb2Rlcl9uYW1lKGVuY29kZXIpLAorCQkJZW5jb2Rlci0+YmFzZS5pZCwgZW5jb2Rlci0+bmFtZSwKIAkJCW1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUpOwogCQllbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CiAJCWVuY29kZXJfZnVuY3MtPm1vZGVfc2V0KGVuY29kZXIsIG1vZGUsIGFkanVzdGVkX21vZGUpOwpAQCAtNDAwLDggKzM5Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZSk7CiAKLQotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGRybV9jcnRjX2hlbHBlcl9kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwpAQCAtNDMwLDcgKzQyNSw2IEBACiAJfQogCiAJX19kcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhkZXYpOwotCXJldHVybiAwOwogfQogCiAvKioKQEAgLTQ4MSw3ICs0NzUsOCBAQAogCQkJCShpbnQpc2V0LT5udW1fY29ubmVjdG9ycywgc2V0LT54LCBzZXQtPnkpOwogCX0gZWxzZSB7CiAJCURSTV9ERUJVR19LTVMoIltDUlRDOiVkXSBbTk9GQl1cbiIsIHNldC0+Y3J0Yy0+YmFzZS5pZCk7Ci0JCXJldHVybiBkcm1fY3J0Y19oZWxwZXJfZGlzYWJsZShzZXQtPmNydGMpOworCQlkcm1fY3J0Y19oZWxwZXJfZGlzYWJsZShzZXQtPmNydGMpOworCQlyZXR1cm4gMDsKIAl9CiAKIAlkZXYgPSBzZXQtPmNydGMtPmRldjsKQEAgLTYyMCwxMSArNjE1LDExIEBACiAJCX0KIAkJaWYgKG5ld19jcnRjKSB7CiAJCQlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSB0byBbQ1JUQzolZF1cbiIsCi0JCQkJY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCQkJY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3ItPm5hbWUsCiAJCQkJbmV3X2NydGMtPmJhc2UuaWQpOwogCQl9IGVsc2UgewogCQkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gdG8gW05PQ1JUQ11cbiIsCi0JCQkJY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJCWNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT5uYW1lKTsKIAkJfQogCX0KIApAQCAtNjUwLDcgKzY0NSw3IEBACiAJCQlEUk1fREVCVUdfS01TKCJTZXR0aW5nIGNvbm5lY3RvciBEUE1TIHN0YXRlIHRvIG9uXG4iKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBzZXQtPm51bV9jb25uZWN0b3JzOyBpKyspIHsKIAkJCQlEUk1fREVCVUdfS01TKCJcdFtDT05ORUNUT1I6JWQ6JXNdIHNldCBEUE1TIG9uXG4iLCBzZXQtPmNvbm5lY3RvcnNbaV0tPmJhc2UuaWQsCi0JCQkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoc2V0LT5jb25uZWN0b3JzW2ldKSk7CisJCQkJCSAgICAgIHNldC0+Y29ubmVjdG9yc1tpXS0+bmFtZSk7CiAJCQkJc2V0LT5jb25uZWN0b3JzW2ldLT5mdW5jcy0+ZHBtcyhzZXQtPmNvbm5lY3RvcnNbaV0sIERSTV9NT0RFX0RQTVNfT04pOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYwppbmRleCA0YjZlNmYzLi4wOGUzM2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKQEAgLTIwNiwxMyArMjA2LDE3IEBACiAgKiBpMmNfZHBfYXV4X2FkZF9idXMoKSAtIHJlZ2lzdGVyIGFuIGkyYyBhZGFwdGVyIHVzaW5nIHRoZSBhdXggY2ggaGVscGVyCiAgKiBAYWRhcHRlcjogaTJjIGFkYXB0ZXIgdG8gcmVnaXN0ZXIKICAqCi0gKiBUaGlzIHJlZ2lzdGVycyBhbiBpMmMgYWRhcGF0ZXIgdGhhdCB1c2VzIGRwIGF1eCBjaGFubmVsIGFzIGl0J3MgdW5kZXJsYXlpbmcKKyAqIFRoaXMgcmVnaXN0ZXJzIGFuIGkyYyBhZGFwdGVyIHRoYXQgdXNlcyBkcCBhdXggY2hhbm5lbCBhcyBpdCdzIHVuZGVybGF5aW5nCiAgKiB0cmFuc3BvcnQuIFRoZSBkcml2ZXIgbmVlZHMgdG8gZmlsbCBvdXQgdGhlICZpMmNfYWxnb19kcF9hdXhfZGF0YSBzdHJ1Y3R1cmUKICAqIGFuZCBzdG9yZSBpdCBpbiB0aGUgYWxnb19kYXRhIG1lbWJlciBvZiB0aGUgQGFkYXB0ZXIgYXJndW1lbnQuIFRoaXMgd2lsbCBiZQogICogdXNlZCBieSB0aGUgaTJjIG92ZXIgZHAgYXV4IGFsZ29yaXRobSB0byBkcml2ZSB0aGUgaGFyZHdhcmUuCiAgKgogICogUkVUVVJOUzoKICAqIDAgb24gc3VjY2VzcywgLUVSUk5PIG9uIGZhaWx1cmUuCisgKgorICogSU1QT1JUQU5UOgorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHN3aXRjaCB0byB0aGUgbmV3IGRwIGF1eCBoZWxwZXJzIGFuZAorICogZHJtX2RwX2F1eF9yZWdpc3RlcigpLgogICovCiBpbnQKIGkyY19kcF9hdXhfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0zNzgsNyArMzgyLDEwIEBACiAJICogdHJhbnNhY3Rpb25zLgogCSAqLwogCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDc7IHJldHJ5KyspIHsKKworCQltdXRleF9sb2NrKCZhdXgtPmh3X211dGV4KTsKIAkJZXJyID0gYXV4LT50cmFuc2ZlcihhdXgsICZtc2cpOworCQltdXRleF91bmxvY2soJmF1eC0+aHdfbXV0ZXgpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciA9PSAtRUJVU1kpCiAJCQkJY29udGludWU7CkBAIC01OTIsNyArNTk5LDkgQEAKIAkgKiBiZWZvcmUgZ2l2aW5nIHVwIHRoZSBBVVggdHJhbnNhY3Rpb24uCiAJICovCiAJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgNzsgcmV0cnkrKykgeworCQltdXRleF9sb2NrKCZhdXgtPmh3X211dGV4KTsKIAkJZXJyID0gYXV4LT50cmFuc2ZlcihhdXgsIG1zZyk7CisJCW11dGV4X3VubG9jaygmYXV4LT5od19tdXRleCk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyID09IC1FQlVTWSkKIAkJCQljb250aW51ZTsKQEAgLTcyNSwxMyArNzM0LDE1IEBACiB9OwogCiAvKioKLSAqIGRybV9kcF9hdXhfcmVnaXN0ZXJfaTJjX2J1cygpIC0gcmVnaXN0ZXIgYW4gSTJDIGFkYXB0ZXIgZm9yIEkyQy1vdmVyLUFVWAorICogZHJtX2RwX2F1eF9yZWdpc3RlcigpIC0gaW5pdGlhbGlzZSBhbmQgcmVnaXN0ZXIgYXV4IGNoYW5uZWwKICAqIEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBkcm1fZHBfYXV4X3JlZ2lzdGVyX2kyY19idXMoc3RydWN0IGRybV9kcF9hdXggKmF1eCkKK2ludCBkcm1fZHBfYXV4X3JlZ2lzdGVyKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCiB7CisJbXV0ZXhfaW5pdCgmYXV4LT5od19tdXRleCk7CisKIAlhdXgtPmRkYy5hbGdvID0gJmRybV9kcF9pMmNfYWxnbzsKIAlhdXgtPmRkYy5hbGdvX2RhdGEgPSBhdXg7CiAJYXV4LT5kZGMucmV0cmllcyA9IDM7CkBAIC03NDYsMTQgKzc1NywxNCBAQAogCiAJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmYXV4LT5kZGMpOwogfQotRVhQT1JUX1NZTUJPTChkcm1fZHBfYXV4X3JlZ2lzdGVyX2kyY19idXMpOworRVhQT1JUX1NZTUJPTChkcm1fZHBfYXV4X3JlZ2lzdGVyKTsKIAogLyoqCi0gKiBkcm1fZHBfYXV4X3VucmVnaXN0ZXJfaTJjX2J1cygpIC0gdW5yZWdpc3RlciBhbiBJMkMtb3Zlci1BVVggYWRhcHRlcgorICogZHJtX2RwX2F1eF91bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIGFuIEFVWCBhZGFwdGVyCiAgKiBAYXV4OiBEaXNwbGF5UG9ydCBBVVggY2hhbm5lbAogICovCi12b2lkIGRybV9kcF9hdXhfdW5yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit2b2lkIGRybV9kcF9hdXhfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KQogewogCWkyY19kZWxfYWRhcHRlcigmYXV4LT5kZGMpOwogfQotRVhQT1JUX1NZTUJPTChkcm1fZHBfYXV4X3VucmVnaXN0ZXJfaTJjX2J1cyk7CitFWFBPUlRfU1lNQk9MKGRybV9kcF9hdXhfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCmluZGV4IGQ0ZTNmOWQuLmRmYTk3NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCkBAIC03MCw2ICs3MCw4IEBACiAjZGVmaW5lIEVESURfUVVJUktfRk9SQ0VfUkVEVUNFRF9CTEFOS0lORwkoMSA8PCA3KQogLyogRm9yY2UgOGJwYyAqLwogI2RlZmluZSBFRElEX1FVSVJLX0ZPUkNFXzhCUEMJCQkoMSA8PCA4KQorLyogRm9yY2UgMTJicGMgKi8KKyNkZWZpbmUgRURJRF9RVUlSS19GT1JDRV8xMkJQQwkJCSgxIDw8IDkpCiAKIHN0cnVjdCBkZXRhaWxlZF9tb2RlX2Nsb3N1cmUgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CkBAIC0xMjUsNiArMTI3LDkgQEAKIAl7ICJTQU0iLCA1OTYsIEVESURfUVVJUktfUFJFRkVSX0xBUkdFXzYwIH0sCiAJeyAiU0FNIiwgNjM4LCBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MCB9LAogCisJLyogU29ueSBQVk0tMjU0MUEgZG9lcyB1cCB0byAxMiBicGMsIGJ1dCBvbmx5IHJlcG9ydHMgbWF4IDggYnBjICovCisJeyAiU05ZIiwgMHgyNTQxLCBFRElEX1FVSVJLX0ZPUkNFXzEyQlBDIH0sCisKIAkvKiBWaWV3U29uaWMgVkEyMDI2dyAqLwogCXsgIlZTQyIsIDUwMjAsIEVESURfUVVJUktfRk9SQ0VfUkVEVUNFRF9CTEFOS0lORyB9LAogCkBAIC05ODQsOSArOTg5LDEzIEBACiAJMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMAogfTsKIAotIC8qCi0gKiBTYW5pdHkgY2hlY2sgdGhlIGhlYWRlciBvZiB0aGUgYmFzZSBFRElEIGJsb2NrLiAgUmV0dXJuIDggaWYgdGhlIGhlYWRlcgotICogaXMgcGVyZmVjdCwgZG93biB0byAwIGlmIGl0J3MgdG90YWxseSB3cm9uZy4KKy8qKgorICogZHJtX2VkaWRfaGVhZGVyX2lzX3ZhbGlkIC0gc2FuaXR5IGNoZWNrIHRoZSBoZWFkZXIgb2YgdGhlIGJhc2UgRURJRCBibG9jaworICogQHJhd19lZGlkOiBwb2ludGVyIHRvIHJhdyBiYXNlIEVESUQgYmxvY2sKKyAqCisgKiBTYW5pdHkgY2hlY2sgdGhlIGhlYWRlciBvZiB0aGUgYmFzZSBFRElEIGJsb2NrLgorICoKKyAqIFJldHVybjogOCBpZiB0aGUgaGVhZGVyIGlzIHBlcmZlY3QsIGRvd24gdG8gMCBpZiBpdCdzIHRvdGFsbHkgd3JvbmcuCiAgKi8KIGludCBkcm1fZWRpZF9oZWFkZXJfaXNfdmFsaWQoY29uc3QgdTggKnJhd19lZGlkKQogewpAQCAtMTAwNSw5ICsxMDE0LDE2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGVkaWRfZml4dXAsCiAJCSAiTWluaW11bSBudW1iZXIgb2YgdmFsaWQgRURJRCBoZWFkZXIgYnl0ZXMgKDAtOCwgZGVmYXVsdCA2KSIpOwogCi0vKgotICogU2FuaXR5IGNoZWNrIHRoZSBFRElEIGJsb2NrIChiYXNlIG9yIGV4dGVuc2lvbikuICBSZXR1cm4gMCBpZiB0aGUgYmxvY2sKLSAqIGRvZXNuJ3QgY2hlY2sgb3V0LCBvciAxIGlmIGl0J3MgdmFsaWQuCisvKioKKyAqIGRybV9lZGlkX2Jsb2NrX3ZhbGlkIC0gU2FuaXR5IGNoZWNrIHRoZSBFRElEIGJsb2NrIChiYXNlIG9yIGV4dGVuc2lvbikKKyAqIEByYXdfZWRpZDogcG9pbnRlciB0byByYXcgRURJRCBibG9jaworICogQGJsb2NrOiB0eXBlIG9mIGJsb2NrIHRvIHZhbGlkYXRlICgwIGZvciBiYXNlLCBleHRlbnNpb24gb3RoZXJ3aXNlKQorICogQHByaW50X2JhZF9lZGlkOiBpZiB0cnVlLCBkdW1wIGJhZCBFRElEIGJsb2NrcyB0byB0aGUgY29uc29sZQorICoKKyAqIFZhbGlkYXRlIGEgYmFzZSBvciBleHRlbnNpb24gRURJRCBibG9jayBhbmQgb3B0aW9uYWxseSBkdW1wIGJhZCBibG9ja3MgdG8KKyAqIHRoZSBjb25zb2xlLgorICoKKyAqIFJldHVybjogVHJ1ZSBpZiB0aGUgYmxvY2sgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAqLwogYm9vbCBkcm1fZWRpZF9ibG9ja192YWxpZCh1OCAqcmF3X2VkaWQsIGludCBibG9jaywgYm9vbCBwcmludF9iYWRfZWRpZCkKIHsKQEAgLTEwNzcsNiArMTA5Myw4IEBACiAgKiBAZWRpZDogRURJRCBkYXRhCiAgKgogICogU2FuaXR5LWNoZWNrIGFuIGVudGlyZSBFRElEIHJlY29yZCAoaW5jbHVkaW5nIGV4dGVuc2lvbnMpCisgKgorICogUmV0dXJuOiBUcnVlIGlmIHRoZSBFRElEIGRhdGEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAqLwogYm9vbCBkcm1fZWRpZF9pc192YWxpZChzdHJ1Y3QgZWRpZCAqZWRpZCkKIHsKQEAgLTEwOTYsMTggKzExMTQsMTUgQEAKIAogI2RlZmluZSBERENfU0VHTUVOVF9BRERSIDB4MzAKIC8qKgotICogR2V0IEVESUQgaW5mb3JtYXRpb24gdmlhIEkyQy4KLSAqCi0gKiBAYWRhcHRlciA6IGkyYyBkZXZpY2UgYWRhcHRvcgorICogZHJtX2RvX3Byb2JlX2RkY19lZGlkKCkgLSBnZXQgRURJRCBpbmZvcm1hdGlvbiB2aWEgSTJDCisgKiBAYWRhcHRlcjogSTJDIGRldmljZSBhZGFwdG9yCiAgKiBAYnVmOiBFRElEIGRhdGEgYnVmZmVyIHRvIGJlIGZpbGxlZAogICogQGJsb2NrOiAxMjggYnl0ZSBFRElEIGJsb2NrIHRvIHN0YXJ0IGZldGNoaW5nIGZyb20KICAqIEBsZW46IEVESUQgZGF0YSBidWZmZXIgbGVuZ3RoIHRvIGZldGNoCiAgKgotICogUmV0dXJuczoKKyAqIFRyeSB0byBmZXRjaCBFRElEIGluZm9ybWF0aW9uIGJ5IGNhbGxpbmcgSTJDIGRyaXZlciBmdW5jdGlvbnMuCiAgKgotICogMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuCi0gKgotICogVHJ5IHRvIGZldGNoIEVESUQgaW5mb3JtYXRpb24gYnkgY2FsbGluZyBpMmMgZHJpdmVyIGZ1bmN0aW9uLgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAogZHJtX2RvX3Byb2JlX2RkY19lZGlkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgY2hhciAqYnVmLApAQCAtMTExOCw3ICsxMTMzLDggQEAKIAl1bnNpZ25lZCBjaGFyIHhmZXJzID0gc2VnbWVudCA/IDMgOiAyOwogCWludCByZXQsIHJldHJpZXMgPSA1OwogCi0JLyogVGhlIGNvcmUgaTJjIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0cnkgdGhlIHRyYW5zZmVyIGlmIHRoZQorCS8qCisJICogVGhlIGNvcmUgSTJDIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0cnkgdGhlIHRyYW5zZmVyIGlmIHRoZQogCSAqIGFkYXB0ZXIgcmVwb3J0cyBFQUdBSU4uIEhvd2V2ZXIsIHdlIGZpbmQgdGhhdCBiaXQtYmFuZ2luZyB0cmFuc2ZlcnMKIAkgKiBhcmUgc3VzY2VwdGlibGUgdG8gZXJyb3JzIHVuZGVyIGEgaGVhdmlseSBsb2FkZWQgbWFjaGluZSBhbmQKIAkgKiBnZW5lcmF0ZSBzcHVyaW91cyBOQUtzIGFuZCB0aW1lb3V0cy4gUmV0cnlpbmcgdGhlIHRyYW5zZmVyCkBAIC0xMTQ0LDEwICsxMTYwLDEwIEBACiAJCQl9CiAJCX07CiAKLQkvKgotCSAqIEF2b2lkIHNlbmRpbmcgdGhlIHNlZ21lbnQgYWRkciB0byBub3QgdXBzZXQgbm9uLWNvbXBsaWFudCBkZGMKLQkgKiBtb25pdG9ycy4KLQkgKi8KKwkJLyoKKwkJICogQXZvaWQgc2VuZGluZyB0aGUgc2VnbWVudCBhZGRyIHRvIG5vdCB1cHNldCBub24tY29tcGxpYW50CisJCSAqIEREQyBtb25pdG9ycy4KKwkJICovCiAJCXJldCA9IGkyY190cmFuc2ZlcihhZGFwdGVyLCAmbXNnc1szIC0geGZlcnNdLCB4ZmVycyk7CiAKIAkJaWYgKHJldCA9PSAtRU5YSU8pIHsKQEAgLTEyMTYsNyArMTIzMiw3IEBACiAJCWlmIChpID09IDQgJiYgcHJpbnRfYmFkX2VkaWQpIHsKIAkJCWRldl93YXJuKGNvbm5lY3Rvci0+ZGV2LT5kZXYsCiAJCQkgIiVzOiBJZ25vcmluZyBpbnZhbGlkIEVESUQgYmxvY2sgJWQuXG4iLAotCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwgaik7CisJCQkgY29ubmVjdG9yLT5uYW1lLCBqKTsKIAogCQkJY29ubmVjdG9yLT5iYWRfZWRpZF9jb3VudGVyKys7CiAJCX0KQEAgLTEyMzYsNyArMTI1Miw3IEBACiBjYXJwOgogCWlmIChwcmludF9iYWRfZWRpZCkgewogCQlkZXZfd2Fybihjb25uZWN0b3ItPmRldi0+ZGV2LCAiJXM6IEVESUQgYmxvY2sgJWQgaW52YWxpZC5cbiIsCi0JCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLCBqKTsKKwkJCSBjb25uZWN0b3ItPm5hbWUsIGopOwogCX0KIAljb25uZWN0b3ItPmJhZF9lZGlkX2NvdW50ZXIrKzsKIApAQCAtMTI0NiwxMiArMTI2MiwxMCBAQAogfQogCiAvKioKLSAqIFByb2JlIEREQyBwcmVzZW5jZS4KLSAqIEBhZGFwdGVyOiBpMmMgYWRhcHRlciB0byBwcm9iZQorICogZHJtX3Byb2JlX2RkYygpIC0gcHJvYmUgRERDIHByZXNlbmNlCisgKiBAYWRhcHRlcjogSTJDIGFkYXB0ZXIgdG8gcHJvYmUKICAqCi0gKiBSZXR1cm5zOgotICoKLSAqIDEgb24gc3VjY2VzcworICogUmV0dXJuOiBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCiAgKi8KIGJvb2wKIGRybV9wcm9iZV9kZGMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQpAQCAtMTI2NSwxMiArMTI3OSwxMiBAQAogLyoqCiAgKiBkcm1fZ2V0X2VkaWQgLSBnZXQgRURJRCBkYXRhLCBpZiBhdmFpbGFibGUKICAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB3ZSdyZSBwcm9iaW5nCi0gKiBAYWRhcHRlcjogaTJjIGFkYXB0ZXIgdG8gdXNlIGZvciBEREMKKyAqIEBhZGFwdGVyOiBJMkMgYWRhcHRlciB0byB1c2UgZm9yIEREQwogICoKLSAqIFBva2UgdGhlIGdpdmVuIGkyYyBjaGFubmVsIHRvIGdyYWIgRURJRCBkYXRhIGlmIHBvc3NpYmxlLiAgSWYgZm91bmQsCisgKiBQb2tlIHRoZSBnaXZlbiBJMkMgY2hhbm5lbCB0byBncmFiIEVESUQgZGF0YSBpZiBwb3NzaWJsZS4gIElmIGZvdW5kLAogICogYXR0YWNoIGl0IHRvIHRoZSBjb25uZWN0b3IuCiAgKgotICogUmV0dXJuIGVkaWQgZGF0YSBvciBOVUxMIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55LgorICogUmV0dXJuOiBQb2ludGVyIHRvIHZhbGlkIEVESUQgb3IgTlVMTCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueS4KICAqLwogc3RydWN0IGVkaWQgKmRybV9nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xMjg4LDcgKzEzMDIsNyBAQAogICogZHJtX2VkaWRfZHVwbGljYXRlIC0gZHVwbGljYXRlIGFuIEVESUQgYW5kIHRoZSBleHRlbnNpb25zCiAgKiBAZWRpZDogRURJRCB0byBkdXBsaWNhdGUKICAqCi0gKiBSZXR1cm4gZHVwbGljYXRlIGVkaWQgb3IgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuCisgKiBSZXR1cm46IFBvaW50ZXIgdG8gZHVwbGljYXRlZCBFRElEIG9yIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgogICovCiBzdHJ1Y3QgZWRpZCAqZHJtX2VkaWRfZHVwbGljYXRlKGNvbnN0IHN0cnVjdCBlZGlkICplZGlkKQogewpAQCAtMTQxMSw3ICsxNDI1LDggQEAKICAqIEByYjogTW9kZSByZWR1Y2VkLWJsYW5raW5nLW5lc3MKICAqCiAgKiBXYWxrIHRoZSBETVQgbW9kZSBsaXN0IGxvb2tpbmcgZm9yIGEgbWF0Y2ggZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotICogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGNvcHkgb2YgdGhlIG1vZGUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICoKKyAqIFJldHVybjogQSBuZXdseSBhbGxvY2F0ZWQgY29weSBvZiB0aGUgbW9kZSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAgKi8KIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9maW5kX2RtdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICBpbnQgaHNpemUsIGludCB2c2l6ZSwgaW50IGZyZXNoLApAQCAtMTU5NSwxNCArMTYxMCwxMyBAQAogICogQGNvbm5lY3RvcjogY29ubmVjdG9yIG9mIGZvciB0aGUgRURJRCBibG9jawogICogQGVkaWQ6IEVESUQgYmxvY2sgdG8gc2NhbgogICogQHQ6IHN0YW5kYXJkIHRpbWluZyBwYXJhbXMKLSAqIEByZXZpc2lvbjogc3RhbmRhcmQgdGltaW5nIGxldmVsCiAgKgogICogVGFrZSB0aGUgc3RhbmRhcmQgdGltaW5nIHBhcmFtcyAoaW4gdGhpcyBjYXNlIHdpZHRoLCBhc3BlY3QsIGFuZCByZWZyZXNoKQogICogYW5kIGNvbnZlcnQgdGhlbSBpbnRvIGEgcmVhbCBtb2RlIHVzaW5nIENWVC9HVEYvRE1ULgogICovCiBzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKgogZHJtX21vZGVfc3RkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBlZGlkICplZGlkLAotCSAgICAgc3RydWN0IHN0ZF90aW1pbmcgKnQsIGludCByZXZpc2lvbikKKwkgICAgIHN0cnVjdCBzdGRfdGltaW5nICp0KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbSwgKm1vZGUgPSBOVUxMOwpAQCAtMTYyMyw3ICsxNjM3LDcgQEAKIAl2cmVmcmVzaF9yYXRlID0gdmZyZXEgKyA2MDsKIAkvKiB0aGUgdmRpc3BsYXkgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgYXNwZWN0IHJhdGlvICovCiAJaWYgKGFzcGVjdF9yYXRpbyA9PSAwKSB7Ci0JCWlmIChyZXZpc2lvbiA8IDMpCisJCWlmIChlZGlkLT5yZXZpc2lvbiA8IDMpCiAJCQl2c2l6ZSA9IGhzaXplOwogCQllbHNlCiAJCQl2c2l6ZSA9IChoc2l6ZSAqIDEwKSAvIDE2OwpAQCAtMjE0MCw3ICsyMTU0LDcgQEAKIAogLyoqCiAgKiBhZGRfZXN0YWJsaXNoZWRfbW9kZXMgLSBnZXQgZXN0LiBtb2RlcyBmcm9tIEVESUQgYW5kIGFkZCB0aGVtCi0gKiBAY29ubmVjdG9yOiBjb25uZWN0b3Igb2YgZm9yIHRoZSBFRElEIGJsb2NrCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gYWRkIG1vZGUocykgdG8KICAqIEBlZGlkOiBFRElEIGJsb2NrIHRvIHNjYW4KICAqCiAgKiBFYWNoIEVESUQgYmxvY2sgY29udGFpbnMgYSBiaXRtYXAgb2YgdGhlIHN1cHBvcnRlZCAiZXN0YWJsaXNoZWQgbW9kZXMiIGxpc3QKQEAgLTIxOTEsOCArMjIwNSw3IEBACiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKIAogCQkJc3RkID0gJmRhdGEtPmRhdGEudGltaW5nc1tpXTsKLQkJCW5ld21vZGUgPSBkcm1fbW9kZV9zdGQoY29ubmVjdG9yLCBlZGlkLCBzdGQsCi0JCQkJCSAgICAgICBlZGlkLT5yZXZpc2lvbik7CisJCQluZXdtb2RlID0gZHJtX21vZGVfc3RkKGNvbm5lY3RvciwgZWRpZCwgc3RkKTsKIAkJCWlmIChuZXdtb2RlKSB7CiAJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOwogCQkJCWNsb3N1cmUtPm1vZGVzKys7CkBAIC0yMjAzLDcgKzIyMTYsNyBAQAogCiAvKioKICAqIGFkZF9zdGFuZGFyZF9tb2RlcyAtIGdldCBzdGQuIG1vZGVzIGZyb20gRURJRCBhbmQgYWRkIHRoZW0KLSAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBvZiBmb3IgdGhlIEVESUQgYmxvY2sKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB0byBhZGQgbW9kZShzKSB0bwogICogQGVkaWQ6IEVESUQgYmxvY2sgdG8gc2NhbgogICoKICAqIFN0YW5kYXJkIG1vZGVzIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBzdGFuZGFyZCAoRE1ULApAQCAtMjIyMSw4ICsyMjM0LDcgQEAKIAkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CiAKIAkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChjb25uZWN0b3IsIGVkaWQsCi0JCQkJICAgICAgICZlZGlkLT5zdGFuZGFyZF90aW1pbmdzW2ldLAotCQkJCSAgICAgICBlZGlkLT5yZXZpc2lvbik7CisJCQkJICAgICAgICZlZGlkLT5zdGFuZGFyZF90aW1pbmdzW2ldKTsKIAkJaWYgKG5ld21vZGUpIHsKIAkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKIAkJCW1vZGVzKys7CkBAIC0yNDI1LDcgKzI0MzcsNyBAQAogICogZHJtX21hdGNoX2NlYV9tb2RlIC0gbG9vayBmb3IgYSBDRUEgbW9kZSBtYXRjaGluZyBnaXZlbiBtb2RlCiAgKiBAdG9fbWF0Y2g6IGRpc3BsYXkgbW9kZQogICoKLSAqIFJldHVybnMgdGhlIENFQSBWaWRlbyBJRCAoVklDKSBvZiB0aGUgbW9kZSBvciAwIGlmIGl0IGlzbid0IGEgQ0VBLTg2MQorICogUmV0dXJuOiBUaGUgQ0VBIFZpZGVvIElEIChWSUMpIG9mIHRoZSBtb2RlIG9yIDAgaWYgaXQgaXNuJ3QgYSBDRUEtODYxCiAgKiBtb2RlLgogICovCiB1OCBkcm1fbWF0Y2hfY2VhX21vZGUoY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnRvX21hdGNoKQpAQCAtMjQ1Miw2ICsyNDY0LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9tYXRjaF9jZWFfbW9kZSk7CiAKKy8qKgorICogZHJtX2dldF9jZWFfYXNwZWN0X3JhdGlvIC0gZ2V0IHRoZSBwaWN0dXJlIGFzcGVjdCByYXRpbyBjb3JyZXNwb25kaW5nIHRvCisgKiB0aGUgaW5wdXQgVklDIGZyb20gdGhlIENFQSBtb2RlIGxpc3QKKyAqIEB2aWRlb19jb2RlOiBJRCBnaXZlbiB0byBlYWNoIG9mIHRoZSBDRUEgbW9kZXMKKyAqCisgKiBSZXR1cm5zIHBpY3R1cmUgYXNwZWN0IHJhdGlvCisgKi8KK2VudW0gaGRtaV9waWN0dXJlX2FzcGVjdCBkcm1fZ2V0X2NlYV9hc3BlY3RfcmF0aW8oY29uc3QgdTggdmlkZW9fY29kZSkKK3sKKwkvKiByZXR1cm4gcGljdHVyZSBhc3BlY3QgcmF0aW8gZm9yIHZpZGVvX2NvZGUgLSAxIHRvIGFjY2VzcyB0aGUKKwkgKiByaWdodCBhcnJheSBlbGVtZW50CisJKi8KKwlyZXR1cm4gZWRpZF9jZWFfbW9kZXNbdmlkZW9fY29kZS0xXS5waWN0dXJlX2FzcGVjdF9yYXRpbzsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dldF9jZWFfYXNwZWN0X3JhdGlvKTsKKwogLyoKICAqIENhbGN1bGF0ZSB0aGUgYWx0ZXJuYXRlIGNsb2NrIGZvciBIRE1JIG1vZGVzICh0aG9zZSBmcm9tIHRoZSBIRE1JIHZlbmRvcgogICogc3BlY2lmaWMgYmxvY2spLgpAQCAtMzAyMywxMSArMzA1MSw5IEBACiAgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgSERNSS9EUCBzaW5rCiAgKiBAZWRpZDogRURJRCB0byBwYXJzZQogICoKLSAqIEZpbGwgdGhlIEVMRCAoRURJRC1MaWtlIERhdGEpIGJ1ZmZlciBmb3IgcGFzc2luZyB0byB0aGUgYXVkaW8gZHJpdmVyLgotICogU29tZSBFTEQgZmllbGRzIGFyZSBsZWZ0IHRvIHRoZSBncmFwaGljcyBkcml2ZXIgY2FsbGVyOgotICogLSBDb25uX1R5cGUKLSAqIC0gSERDUAotICogLSBQb3J0X0lECisgKiBGaWxsIHRoZSBFTEQgKEVESUQtTGlrZSBEYXRhKSBidWZmZXIgZm9yIHBhc3NpbmcgdG8gdGhlIGF1ZGlvIGRyaXZlci4gVGhlCisgKiBDb25uX1R5cGUsIEhEQ1AgYW5kIFBvcnRfSUQgRUxEIGZpZWxkcyBhcmUgbGVmdCBmb3IgdGhlIGdyYXBoaWNzIGRyaXZlciB0bworICogZmlsbCBpbi4KICAqLwogdm9pZCBkcm1fZWRpZF90b19lbGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpCiB7CkBAIC0zMTExLDkgKzMxMzcsMTAgQEAKICAqIEBzYWRzOiBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGV4dHJhY3RlZCBTQURzCiAgKgogICogTG9va3MgZm9yIENFQSBFRElEIGJsb2NrIGFuZCBleHRyYWN0cyBTQURzIChTaG9ydCBBdWRpbyBEZXNjcmlwdG9ycykgZnJvbSBpdC4KLSAqIE5vdGU6IHJldHVybmVkIHBvaW50ZXIgbmVlZHMgdG8gYmUga2ZyZWVkCiAgKgotICogUmV0dXJuIG51bWJlciBvZiBmb3VuZCBTQURzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4KKyAqIE5vdGU6IFRoZSByZXR1cm5lZCBwb2ludGVyIG5lZWRzIHRvIGJlIGZyZWVkIHVzaW5nIGtmcmVlKCkuCisgKgorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9mIGZvdW5kIFNBRHMgb3IgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLgogICovCiBpbnQgZHJtX2VkaWRfdG9fc2FkKHN0cnVjdCBlZGlkICplZGlkLCBzdHJ1Y3QgY2VhX3NhZCAqKnNhZHMpCiB7CkBAIC0zMTcwLDkgKzMxOTcsMTEgQEAKICAqIEBzYWRiOiBwb2ludGVyIHRvIHRoZSBzcGVha2VyIGJsb2NrCiAgKgogICogTG9va3MgZm9yIENFQSBFRElEIGJsb2NrIGFuZCBleHRyYWN0cyB0aGUgU3BlYWtlciBBbGxvY2F0aW9uIERhdGEgQmxvY2sgZnJvbSBpdC4KLSAqIE5vdGU6IHJldHVybmVkIHBvaW50ZXIgbmVlZHMgdG8gYmUga2ZyZWVkCiAgKgotICogUmV0dXJuIG51bWJlciBvZiBmb3VuZCBTcGVha2VyIEFsbG9jYXRpb24gQmxvY2tzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4KKyAqIE5vdGU6IFRoZSByZXR1cm5lZCBwb2ludGVyIG5lZWRzIHRvIGJlIGZyZWVkIHVzaW5nIGtmcmVlKCkuCisgKgorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9mIGZvdW5kIFNwZWFrZXIgQWxsb2NhdGlvbiBCbG9ja3Mgb3IgbmVnYXRpdmUgbnVtYmVyIG9uCisgKiBlcnJvci4KICAqLwogaW50IGRybV9lZGlkX3RvX3NwZWFrZXJfYWxsb2NhdGlvbihzdHJ1Y3QgZWRpZCAqZWRpZCwgdTggKipzYWRiKQogewpAQCAtMzIwNCwxMCArMzIzMyw5IEBACiAKIAkJCS8qIFNwZWFrZXIgQWxsb2NhdGlvbiBEYXRhIEJsb2NrICovCiAJCQlpZiAoZGJsID09IDMpIHsKLQkJCQkqc2FkYiA9IGttYWxsb2MoZGJsLCBHRlBfS0VSTkVMKTsKKwkJCQkqc2FkYiA9IGttZW1kdXAoJmRiWzFdLCBkYmwsIEdGUF9LRVJORUwpOwogCQkJCWlmICghKnNhZGIpCiAJCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCW1lbWNweSgqc2FkYiwgJmRiWzFdLCBkYmwpOwogCQkJCWNvdW50ID0gZGJsOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMzIxOSw5ICszMjQ3LDEyIEBACiBFWFBPUlRfU1lNQk9MKGRybV9lZGlkX3RvX3NwZWFrZXJfYWxsb2NhdGlvbik7CiAKIC8qKgotICogZHJtX2F2X3N5bmNfZGVsYXkgLSBIRE1JL0RQIHNpbmsgYXVkaW8tdmlkZW8gc3luYyBkZWxheSBpbiBtaWxsaXNlY29uZAorICogZHJtX2F2X3N5bmNfZGVsYXkgLSBjb21wdXRlIHRoZSBIRE1JL0RQIHNpbmsgYXVkaW8tdmlkZW8gc3luYyBkZWxheQogICogQGNvbm5lY3RvcjogY29ubmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgSERNSS9EUCBzaW5rCiAgKiBAbW9kZTogdGhlIGRpc3BsYXkgbW9kZQorICoKKyAqIFJldHVybjogVGhlIEhETUkvRFAgc2luaydzIGF1ZGlvLXZpZGVvIHN5bmMgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIG9yIDAgaWYKKyAqIHRoZSBzaW5rIGRvZXNuJ3Qgc3VwcG9ydCBhdWRpbyBvciB2aWRlby4KICAqLwogaW50IGRybV9hdl9zeW5jX2RlbGF5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQpAQCAtMzI2Myw2ICszMjk0LDkgQEAKICAqCiAgKiBJdCdzIHBvc3NpYmxlIGZvciBvbmUgZW5jb2RlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgSERNSS9EUCBzaW5rcy4KICAqIFRoZSBwb2xpY3kgaXMgbm93IGhhcmQgY29kZWQgdG8gc2ltcGx5IHVzZSB0aGUgZmlyc3QgSERNSS9EUCBzaW5rJ3MgRUxELgorICoKKyAqIFJldHVybjogVGhlIGNvbm5lY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IEhETUkvRFAgc2luayB0aGF0IGhhcyBFTEQKKyAqIGF0dGFjaGVkIHRvIGl0LgogICovCiBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX3NlbGVjdF9lbGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCkBAIC0zMjcwLDYgKzMzMDQsOCBAQAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAorCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQogCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIgJiYgY29ubmVjdG9yLT5lbGRbMF0pCiAJCQlyZXR1cm4gY29ubmVjdG9yOwpAQCAtMzI3OSwxMSArMzMxNSwxMiBAQAogRVhQT1JUX1NZTUJPTChkcm1fc2VsZWN0X2VsZCk7CiAKIC8qKgotICogZHJtX2RldGVjdF9oZG1pX21vbml0b3IgLSBkZXRlY3Qgd2hldGhlciBtb25pdG9yIGlzIGhkbWkuCisgKiBkcm1fZGV0ZWN0X2hkbWlfbW9uaXRvciAtIGRldGVjdCB3aGV0aGVyIG1vbml0b3IgaXMgSERNSQogICogQGVkaWQ6IG1vbml0b3IgRURJRCBpbmZvcm1hdGlvbgogICoKICAqIFBhcnNlIHRoZSBDRUEgZXh0ZW5zaW9uIGFjY29yZGluZyB0byBDRUEtODYxLUIuCi0gKiBSZXR1cm4gdHJ1ZSBpZiBIRE1JLCBmYWxzZSBpZiBub3Qgb3IgdW5rbm93bi4KKyAqCisgKiBSZXR1cm46IFRydWUgaWYgdGhlIG1vbml0b3IgaXMgSERNSSwgZmFsc2UgaWYgbm90IG9yIHVua25vd24uCiAgKi8KIGJvb2wgZHJtX2RldGVjdF9oZG1pX21vbml0b3Ioc3RydWN0IGVkaWQgKmVkaWQpCiB7CkBAIC0zMzIxLDYgKzMzNTgsNyBAQAogICogYXVkaW8gZm9ybWF0LCBhc3N1bWUgYXQgbGVhc3QgJ2Jhc2ljIGF1ZGlvJyBzdXBwb3J0LCBldmVuIGlmICdiYXNpYwogICogYXVkaW8nIGlzIG5vdCBkZWZpbmVkIGluIEVESUQuCiAgKgorICogUmV0dXJuOiBUcnVlIGlmIHRoZSBtb25pdG9yIHN1cHBvcnRzIGF1ZGlvLCBmYWxzZSBvdGhlcndpc2UuCiAgKi8KIGJvb2wgZHJtX2RldGVjdF9tb25pdG9yX2F1ZGlvKHN0cnVjdCBlZGlkICplZGlkKQogewpAQCAtMzM2NCw2ICszNDAyLDggQEAKICAqIENoZWNrIHdoZXRoZXIgdGhlIG1vbml0b3IgcmVwb3J0cyB0aGUgUkdCIHF1YW50aXphdGlvbiByYW5nZSBzZWxlY3Rpb24KICAqIGFzIHN1cHBvcnRlZC4gVGhlIEFWSSBpbmZvZnJhbWUgY2FuIHRoZW4gYmUgdXNlZCB0byBpbmZvcm0gdGhlIG1vbml0b3IKICAqIHdoaWNoIHF1YW50aXphdGlvbiByYW5nZSAoZnVsbCBvciBsaW1pdGVkKSBpcyB1c2VkLgorICoKKyAqIFJldHVybjogVHJ1ZSBpZiB0aGUgUkdCIHF1YW50aXphdGlvbiByYW5nZSBpcyBzZWxlY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UuCiAgKi8KIGJvb2wgZHJtX3JnYl9xdWFudF9yYW5nZV9zZWxlY3RhYmxlKHN0cnVjdCBlZGlkICplZGlkKQogewpAQCAtMzM5MCwxNiArMzQzMCwxMTkgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3JnYl9xdWFudF9yYW5nZV9zZWxlY3RhYmxlKTsKIAogLyoqCisgKiBkcm1fYXNzaWduX2hkbWlfZGVlcF9jb2xvcl9pbmZvIC0gZGV0ZWN0IHdoZXRoZXIgbW9uaXRvciBzdXBwb3J0cworICogaGRtaSBkZWVwIGNvbG9yIG1vZGVzIGFuZCB1cGRhdGUgZHJtX2Rpc3BsYXlfaW5mbyBpZiBzby4KKyAqCisgKiBAZWRpZDogbW9uaXRvciBFRElEIGluZm9ybWF0aW9uCisgKiBAaW5mbzogVXBkYXRlZCB3aXRoIG1heGltdW0gc3VwcG9ydGVkIGRlZXAgY29sb3IgYnBjIGFuZCBjb2xvciBmb3JtYXQKKyAqICAgICAgICBpZiBkZWVwIGNvbG9yIHN1cHBvcnRlZC4KKyAqCisgKiBQYXJzZSB0aGUgQ0VBIGV4dGVuc2lvbiBhY2NvcmRpbmcgdG8gQ0VBLTg2MS1CLgorICogUmV0dXJuIHRydWUgaWYgSERNSSBkZWVwIGNvbG9yIHN1cHBvcnRlZCwgZmFsc2UgaWYgbm90IG9yIHVua25vd24uCisgKi8KK3N0YXRpYyBib29sIGRybV9hc3NpZ25faGRtaV9kZWVwX2NvbG9yX2luZm8oc3RydWN0IGVkaWQgKmVkaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXU4ICplZGlkX2V4dCwgKmhkbWk7CisJaW50IGk7CisJaW50IHN0YXJ0X29mZnNldCwgZW5kX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGNfYnBjID0gMDsKKworCWVkaWRfZXh0ID0gZHJtX2ZpbmRfY2VhX2V4dGVuc2lvbihlZGlkKTsKKwlpZiAoIWVkaWRfZXh0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoY2VhX2RiX29mZnNldHMoZWRpZF9leHQsICZzdGFydF9vZmZzZXQsICZlbmRfb2Zmc2V0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBCZWNhdXNlIEhETUkgaWRlbnRpZmllciBpcyBpbiBWZW5kb3IgU3BlY2lmaWMgQmxvY2ssCisJICogc2VhcmNoIGl0IGZyb20gYWxsIGRhdGEgYmxvY2tzIG9mIENFQSBleHRlbnNpb24uCisJICovCisJZm9yX2VhY2hfY2VhX2RiKGVkaWRfZXh0LCBpLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQpIHsKKwkJaWYgKGNlYV9kYl9pc19oZG1pX3ZzZGIoJmVkaWRfZXh0W2ldKSkgeworCQkJLyogSERNSSBzdXBwb3J0cyBhdCBsZWFzdCA4IGJwYyAqLworCQkJaW5mby0+YnBjID0gODsKKworCQkJaGRtaSA9ICZlZGlkX2V4dFtpXTsKKwkJCWlmIChjZWFfZGJfcGF5bG9hZF9sZW4oaGRtaSkgPCA2KQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaWYgKGhkbWlbNl0gJiBEUk1fRURJRF9IRE1JX0RDXzMwKSB7CisJCQkJZGNfYnBjID0gMTA7CisJCQkJaW5mby0+ZWRpZF9oZG1pX2RjX21vZGVzIHw9IERSTV9FRElEX0hETUlfRENfMzA7CisJCQkJRFJNX0RFQlVHKCIlczogSERNSSBzaW5rIGRvZXMgZGVlcCBjb2xvciAzMC5cbiIsCisJCQkJCQkgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQl9CisKKwkJCWlmIChoZG1pWzZdICYgRFJNX0VESURfSERNSV9EQ18zNikgeworCQkJCWRjX2JwYyA9IDEyOworCQkJCWluZm8tPmVkaWRfaGRtaV9kY19tb2RlcyB8PSBEUk1fRURJRF9IRE1JX0RDXzM2OworCQkJCURSTV9ERUJVRygiJXM6IEhETUkgc2luayBkb2VzIGRlZXAgY29sb3IgMzYuXG4iLAorCQkJCQkJICBjb25uZWN0b3ItPm5hbWUpOworCQkJfQorCisJCQlpZiAoaGRtaVs2XSAmIERSTV9FRElEX0hETUlfRENfNDgpIHsKKwkJCQlkY19icGMgPSAxNjsKKwkJCQlpbmZvLT5lZGlkX2hkbWlfZGNfbW9kZXMgfD0gRFJNX0VESURfSERNSV9EQ180ODsKKwkJCQlEUk1fREVCVUcoIiVzOiBIRE1JIHNpbmsgZG9lcyBkZWVwIGNvbG9yIDQ4LlxuIiwKKwkJCQkJCSAgY29ubmVjdG9yLT5uYW1lKTsKKwkJCX0KKworCQkJaWYgKGRjX2JwYyA+IDApIHsKKwkJCQlEUk1fREVCVUcoIiVzOiBBc3NpZ25pbmcgSERNSSBzaW5rIGNvbG9yIGRlcHRoIGFzICVkIGJwYy5cbiIsCisJCQkJCQkgIGNvbm5lY3Rvci0+bmFtZSwgZGNfYnBjKTsKKwkJCQlpbmZvLT5icGMgPSBkY19icGM7CisKKwkJCQkvKgorCQkJCSAqIERlZXAgY29sb3Igc3VwcG9ydCBtYW5kYXRlcyBSR0I0NDQgc3VwcG9ydCBmb3IgYWxsIHZpZGVvCisJCQkJICogbW9kZXMgYW5kIGZvcmJpZHMgWUNSQ0I0MjIgc3VwcG9ydCBmb3IgYWxsIHZpZGVvIG1vZGVzIHBlcgorCQkJCSAqIEhETUkgMS4zIHNwZWMuCisJCQkJICovCisJCQkJaW5mby0+Y29sb3JfZm9ybWF0cyA9IERSTV9DT0xPUl9GT1JNQVRfUkdCNDQ0OworCisJCQkJLyogWUNSQ0I0NDQgaXMgb3B0aW9uYWwgYWNjb3JkaW5nIHRvIHNwZWMuICovCisJCQkJaWYgKGhkbWlbNl0gJiBEUk1fRURJRF9IRE1JX0RDX1k0NDQpIHsKKwkJCQkJaW5mby0+Y29sb3JfZm9ybWF0cyB8PSBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDQ0OworCQkJCQlEUk1fREVCVUcoIiVzOiBIRE1JIHNpbmsgZG9lcyBZQ1JDQjQ0NCBpbiBkZWVwIGNvbG9yLlxuIiwKKwkJCQkJCQkgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBTcGVjIHNheXMgdGhhdCBpZiBhbnkgZGVlcCBjb2xvciBtb2RlIGlzIHN1cHBvcnRlZCBhdCBhbGwsCisJCQkJICogdGhlbiBkZWVwIGNvbG9yIDM2IGJpdCBtdXN0IGJlIHN1cHBvcnRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoIShoZG1pWzZdICYgRFJNX0VESURfSERNSV9EQ18zNikpIHsKKwkJCQkJRFJNX0RFQlVHKCIlczogSERNSSBzaW5rIHNob3VsZCBkbyBEQ18zNiwgYnV0IGRvZXMgbm90IVxuIiwKKwkJCQkJCQkgIGNvbm5lY3Rvci0+bmFtZSk7CisJCQkJfQorCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlEUk1fREVCVUcoIiVzOiBObyBkZWVwIGNvbG9yIHN1cHBvcnQgb24gdGhpcyBIRE1JIHNpbmsuXG4iLAorCQkJCQkJICBjb25uZWN0b3ItPm5hbWUpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIGRybV9hZGRfZGlzcGxheV9pbmZvIC0gcHVsbCBkaXNwbGF5IGluZm8gb3V0IGlmIHByZXNlbnQKICAqIEBlZGlkOiBFRElEIGRhdGEKICAqIEBpbmZvOiBkaXNwbGF5IGluZm8gKGF0dGFjaGVkIHRvIGNvbm5lY3RvcikKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB3aG9zZSBlZGlkIGlzIHVzZWQgdG8gYnVpbGQgZGlzcGxheSBpbmZvCiAgKgogICogR3JhYiBhbnkgYXZhaWxhYmxlIGRpc3BsYXkgaW5mbyBhbmQgc3R1ZmYgaXQgaW50byB0aGUgZHJtX2Rpc3BsYXlfaW5mbwogICogc3RydWN0dXJlIHRoYXQncyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IuICBVc2VmdWwgZm9yIHRyYWNraW5nIGJwcCBhbmQKICAqIGNvbG9yIHNwYWNlcy4KICAqLwogc3RhdGljIHZvaWQgZHJtX2FkZF9kaXNwbGF5X2luZm8oc3RydWN0IGVkaWQgKmVkaWQsCi0JCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9pbmZvICppbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXU4ICplZGlkX2V4dDsKIApAQCAtMzQyOSw2ICszNTcyLDkgQEAKIAkJCWluZm8tPmNvbG9yX2Zvcm1hdHMgfD0gRFJNX0NPTE9SX0ZPUk1BVF9ZQ1JDQjQyMjsKIAl9CiAKKwkvKiBIRE1JIGRlZXAgY29sb3IgbW9kZXMgc3VwcG9ydGVkPyBBc3NpZ24gdG8gaW5mbywgaWYgc28gKi8KKwlkcm1fYXNzaWduX2hkbWlfZGVlcF9jb2xvcl9pbmZvKGVkaWQsIGluZm8sIGNvbm5lY3Rvcik7CisKIAkvKiBPbmx5IGRlZmluZWQgZm9yIDEuNCB3aXRoIGRpZ2l0YWwgZGlzcGxheXMgKi8KIAlpZiAoZWRpZC0+cmV2aXNpb24gPCA0KQogCQlyZXR1cm47CkBAIC0zNDU4LDYgKzM2MDQsOSBAQAogCQlicmVhazsKIAl9CiAKKwlEUk1fREVCVUcoIiVzOiBBc3NpZ25pbmcgRURJRC0xLjQgZGlnaXRhbCBzaW5rIGNvbG9yIGRlcHRoIGFzICVkIGJwYy5cbiIsCisJCQkgIGNvbm5lY3Rvci0+bmFtZSwgaW5mby0+YnBjKTsKKwogCWluZm8tPmNvbG9yX2Zvcm1hdHMgfD0gRFJNX0NPTE9SX0ZPUk1BVF9SR0I0NDQ7CiAJaWYgKGVkaWQtPmZlYXR1cmVzICYgRFJNX0VESURfRkVBVFVSRV9SR0JfWUNSQ0I0NDQpCiAJCWluZm8tPmNvbG9yX2Zvcm1hdHMgfD0gRFJNX0NPTE9SX0ZPUk1BVF9ZQ1JDQjQ0NDsKQEAgLTM0NjgsMTEgKzM2MTcsMTEgQEAKIC8qKgogICogZHJtX2FkZF9lZGlkX21vZGVzIC0gYWRkIG1vZGVzIGZyb20gRURJRCBkYXRhLCBpZiBhdmFpbGFibGUKICAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB3ZSdyZSBwcm9iaW5nCi0gKiBAZWRpZDogZWRpZCBkYXRhCisgKiBAZWRpZDogRURJRCBkYXRhCiAgKgogICogQWRkIHRoZSBzcGVjaWZpZWQgbW9kZXMgdG8gdGhlIGNvbm5lY3RvcidzIG1vZGUgbGlzdC4KICAqCi0gKiBSZXR1cm4gbnVtYmVyIG9mIG1vZGVzIGFkZGVkIG9yIDAgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkuCisgKiBSZXR1cm46IFRoZSBudW1iZXIgb2YgbW9kZXMgYWRkZWQgb3IgMCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueS4KICAqLwogaW50IGRybV9hZGRfZWRpZF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZWRpZCAqZWRpZCkKIHsKQEAgLTM0ODQsNyArMzYzMyw3IEBACiAJfQogCWlmICghZHJtX2VkaWRfaXNfdmFsaWQoZWRpZCkpIHsKIAkJZGV2X3dhcm4oY29ubmVjdG9yLT5kZXYtPmRldiwgIiVzOiBFRElEIGludmFsaWQuXG4iLAotCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkgY29ubmVjdG9yLT5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNTE2LDExICszNjY1LDE0IEBACiAJaWYgKHF1aXJrcyAmIChFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MCB8IEVESURfUVVJUktfUFJFRkVSX0xBUkdFXzc1KSkKIAkJZWRpZF9maXh1cF9wcmVmZXJyZWQoY29ubmVjdG9yLCBxdWlya3MpOwogCi0JZHJtX2FkZF9kaXNwbGF5X2luZm8oZWRpZCwgJmNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvKTsKKwlkcm1fYWRkX2Rpc3BsYXlfaW5mbyhlZGlkLCAmY29ubmVjdG9yLT5kaXNwbGF5X2luZm8sIGNvbm5lY3Rvcik7CiAKIAlpZiAocXVpcmtzICYgRURJRF9RVUlSS19GT1JDRV84QlBDKQogCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGMgPSA4OwogCisJaWYgKHF1aXJrcyAmIEVESURfUVVJUktfRk9SQ0VfMTJCUEMpCisJCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYyA9IDEyOworCiAJcmV0dXJuIG51bV9tb2RlczsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZF9lZGlkX21vZGVzKTsKQEAgLTM1MzQsNyArMzY4Niw3IEBACiAgKiBBZGQgdGhlIHNwZWNpZmllZCBtb2RlcyB0byB0aGUgY29ubmVjdG9yJ3MgbW9kZSBsaXN0LiBPbmx5IHdoZW4gdGhlCiAgKiBoZGlzcGxheS92ZGlzcGxheSBpcyBub3QgYmV5b25kIHRoZSBnaXZlbiBsaW1pdCwgaXQgd2lsbCBiZSBhZGRlZC4KICAqCi0gKiBSZXR1cm4gbnVtYmVyIG9mIG1vZGVzIGFkZGVkIG9yIDAgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkuCisgKiBSZXR1cm46IFRoZSBudW1iZXIgb2YgbW9kZXMgYWRkZWQgb3IgMCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueS4KICAqLwogaW50IGRybV9hZGRfbW9kZXNfbm9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQlpbnQgaGRpc3BsYXksIGludCB2ZGlzcGxheSkKQEAgLTM1NzMsMTMgKzM3MjUsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZF9tb2Rlc19ub2VkaWQpOwogCisvKioKKyAqIGRybV9zZXRfcHJlZmVycmVkX21vZGUgLSBTZXRzIHRoZSBwcmVmZXJyZWQgbW9kZSBvZiBhIGNvbm5lY3RvcgorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHdob3NlIG1vZGUgbGlzdCBzaG91bGQgYmUgcHJvY2Vzc2VkCisgKiBAaHByZWY6IGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiBwcmVmZXJyZWQgbW9kZQorICogQHZwcmVmOiB2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHByZWZlcnJlZCBtb2RlCisgKgorICogTWFya3MgYSBtb2RlIGFzIHByZWZlcnJlZCBpZiBpdCBtYXRjaGVzIHRoZSByZXNvbHV0aW9uIHNwZWNpZmllZCBieSBAaHByZWYKKyAqIGFuZCBAdnByZWYuCisgKi8KIHZvaWQgZHJtX3NldF9wcmVmZXJyZWRfbW9kZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJICAgaW50IGhwcmVmLCBpbnQgdnByZWYpCiB7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywgaGVhZCkgewotCQlpZiAobW9kZS0+aGRpc3BsYXkgID09IGhwcmVmICYmCisJCWlmIChtb2RlLT5oZGlzcGxheSA9PSBocHJlZiAmJgogCQkgICAgbW9kZS0+dmRpc3BsYXkgPT0gdnByZWYpCiAJCQltb2RlLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwogCX0KQEAgLTM1OTIsNyArMzc1Myw3IEBACiAgKiBAZnJhbWU6IEhETUkgQVZJIGluZm9mcmFtZQogICogQG1vZGU6IERSTSBkaXNwbGF5IG1vZGUKICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCiBpbnQKIGRybV9oZG1pX2F2aV9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoc3RydWN0IGhkbWlfYXZpX2luZm9mcmFtZSAqZnJhbWUsCkBAIC0zNjEzLDYgKzM3NzQsMTIgQEAKIAlmcmFtZS0+dmlkZW9fY29kZSA9IGRybV9tYXRjaF9jZWFfbW9kZShtb2RlKTsKIAogCWZyYW1lLT5waWN0dXJlX2FzcGVjdCA9IEhETUlfUElDVFVSRV9BU1BFQ1RfTk9ORTsKKworCS8qIFBvcHVsYXRlIHBpY3R1cmUgYXNwZWN0IHJhdGlvIGZyb20gQ0VBIG1vZGUgbGlzdCAqLworCWlmIChmcmFtZS0+dmlkZW9fY29kZSA+IDApCisJCWZyYW1lLT5waWN0dXJlX2FzcGVjdCA9IGRybV9nZXRfY2VhX2FzcGVjdF9yYXRpbygKKwkJCQkJCWZyYW1lLT52aWRlb19jb2RlKTsKKwogCWZyYW1lLT5hY3RpdmVfYXNwZWN0ID0gSERNSV9BQ1RJVkVfQVNQRUNUX1BJQ1RVUkU7CiAJZnJhbWUtPnNjYW5fbW9kZSA9IEhETUlfU0NBTl9NT0RFX1VOREVSU0NBTjsKIApAQCAtMzY1Nyw3ICszODI0LDcgQEAKICAqIDRrIG9yIHN0ZXJlb3Njb3BpYyAzRCBtb2RlLiBTbyB3aGVuIGdpdmluZyBhbnkgb3RoZXIgbW9kZSBhcyBpbnB1dCB0aGlzCiAgKiBmdW5jdGlvbiB3aWxsIHJldHVybiAtRUlOVkFMLCBlcnJvciB0aGF0IGNhbiBiZSBzYWZlbHkgaWdub3JlZC4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCiBpbnQKIGRybV9oZG1pX3ZlbmRvcl9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoc3RydWN0IGhkbWlfdmVuZG9yX2luZm9mcmFtZSAqZnJhbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkX2xvYWQuYwppbmRleCAxYjRjN2E1Li4wYTIzNWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZF9sb2FkLmMKQEAgLTMxLDggKzMxLDkgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZWRpZF9maXJtd2FyZSwgIkRvIG5vdCBwcm9iZSBtb25pdG9yLCB1c2Ugc3BlY2lmaWVkIEVESUQgYmxvYiAiCiAJImZyb20gYnVpbHQtaW4gZGF0YSBvciAvbGliL2Zpcm13YXJlIGluc3RlYWQuICIpOwogCi0jZGVmaW5lIEdFTkVSSUNfRURJRFMgNQorI2RlZmluZSBHRU5FUklDX0VESURTIDYKIHN0YXRpYyBjb25zdCBjaGFyICpnZW5lcmljX2VkaWRfbmFtZVtHRU5FUklDX0VESURTXSA9IHsKKwkiZWRpZC84MDB4NjAwLmJpbiIsCiAJImVkaWQvMTAyNHg3NjguYmluIiwKIAkiZWRpZC8xMjgweDEwMjQuYmluIiwKIAkiZWRpZC8xNjAweDEyMDAuYmluIiwKQEAgLTQ0LDYgKzQ1LDI0IEBACiAJewogCTB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsCiAJMHgzMSwgMHhkOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDA1LCAweDE2LCAweDAxLCAweDAzLCAweDZkLCAweDFiLCAweDE0LCAweDc4LAorCTB4ZWEsIDB4NWUsIDB4YzAsIDB4YTQsIDB4NTksIDB4NGEsIDB4OTgsIDB4MjUsCisJMHgyMCwgMHg1MCwgMHg1NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0MCwKKwkweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4YTAsIDB4MGYsCisJMHgyMCwgMHgwMCwgMHgzMSwgMHg1OCwgMHgxYywgMHgyMCwgMHgyOCwgMHg4MCwKKwkweDE0LCAweDAwLCAweDE1LCAweGQwLCAweDEwLCAweDAwLCAweDAwLCAweDFlLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4NGMsIDB4NjksIDB4NmUsCisJMHg3NSwgMHg3OCwgMHgyMCwgMHgyMywgMHgzMCwgMHgwYSwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweGZkLCAweDAwLCAweDNiLAorCTB4M2QsIDB4MjQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MGEsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywKKwkweDAwLCAweDRjLCAweDY5LCAweDZlLCAweDc1LCAweDc4LCAweDIwLCAweDUzLAorCTB4NTYsIDB4NDcsIDB4NDEsIDB4MGEsIDB4MjAsIDB4MjAsIDB4MDAsIDB4YzIsCisJfSwKKwl7CisJMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwKKwkweDMxLCAweGQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogCTB4MDUsIDB4MTYsIDB4MDEsIDB4MDMsIDB4NmQsIDB4MjMsIDB4MWEsIDB4NzgsCiAJMHhlYSwgMHg1ZSwgMHhjMCwgMHhhNCwgMHg1OSwgMHg0YSwgMHg5OCwgMHgyNSwKIAkweDIwLCAweDUwLCAweDU0LCAweDAwLCAweDA4LCAweDAwLCAweDYxLCAweDQwLApAQCAtMjQyLDcgKzI2MSw3IEBACiAKIGludCBkcm1fbG9hZF9lZGlkX2Zpcm13YXJlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7Ci0JY29uc3QgY2hhciAqY29ubmVjdG9yX25hbWUgPSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3Rvcik7CisJY29uc3QgY2hhciAqY29ubmVjdG9yX25hbWUgPSBjb25uZWN0b3ItPm5hbWU7CiAJY2hhciAqZWRpZG5hbWUgPSBlZGlkX2Zpcm13YXJlLCAqbGFzdCwgKmNvbG9uOwogCWludCByZXQ7CiAJc3RydWN0IGVkaWQgKmVkaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2NtYV9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jCmluZGV4IDYxYjVhNDcuLmYyN2M4ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jCkBAIC00MjksMTMgKzQyOSw4IEBACiAgKi8KIHZvaWQgZHJtX2ZiZGV2X2NtYV9yZXN0b3JlX21vZGUoc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2NtYSkKIHsKLQlpZiAoZmJkZXZfY21hKSB7Ci0JCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmYmRldl9jbWEtPmZiX2hlbHBlci5kZXY7Ci0KLQkJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQkJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoJmZiZGV2X2NtYS0+ZmJfaGVscGVyKTsKLQkJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwotCX0KKwlpZiAoZmJkZXZfY21hKQorCQlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgmZmJkZXZfY21hLT5mYl9oZWxwZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZHJtX2ZiZGV2X2NtYV9yZXN0b3JlX21vZGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwppbmRleCAwNGQzZmQzLi5kNWQ4Y2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKQEAgLTQ1LDEzICs0NSwxMyBAQAogICogRE9DOiBmYmRldiBoZWxwZXJzCiAgKgogICogVGhlIGZiIGhlbHBlciBmdW5jdGlvbnMgYXJlIHVzZWZ1bCB0byBwcm92aWRlIGFuIGZiZGV2IG9uIHRvcCBvZiBhIGRybSBrZXJuZWwKLSAqIG1vZGUgc2V0dGluZyBkcml2ZXIuIFRoZXkgY2FuIGJlIHVzZWQgbW9zdGx5IGluZGVwZW5kYW50ZWx5IGZyb20gdGhlIGNydGMKKyAqIG1vZGUgc2V0dGluZyBkcml2ZXIuIFRoZXkgY2FuIGJlIHVzZWQgbW9zdGx5IGluZGVwZW5kZW50bHkgZnJvbSB0aGUgY3J0YwogICogaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IG1hbnkgZHJpdmVycyB0byBpbXBsZW1lbnQgdGhlIGtlcm5lbCBtb2RlIHNldHRpbmcKICAqIGludGVyZmFjZXMuCiAgKgogICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBhcyBhIHRocmVlLXN0ZXAgcHJvY2VzcyB3aXRoIGRybV9mYl9oZWxwZXJfaW5pdCgpLAogICogZHJtX2ZiX2hlbHBlcl9zaW5nbGVfYWRkX2FsbF9jb25uZWN0b3JzKCkgYW5kIGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoKS4KLSAqIERyaXZlcnMgd2l0aCBmYW5jaWVyIHJlcXVpcmVtZW50cyB0aGFuIHRoZSBkZWZhdWx0IGJlaGV2aW91ciBjYW4gb3ZlcnJpZGUgdGhlCisgKiBEcml2ZXJzIHdpdGggZmFuY2llciByZXF1aXJlbWVudHMgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgY2FuIG92ZXJyaWRlIHRoZQogICogc2Vjb25kIHN0ZXAgd2l0aCB0aGVpciBvd24gY29kZS4gIFRlYXJkb3duIGlzIGRvbmUgd2l0aCBkcm1fZmJfaGVscGVyX2ZpbmkoKS4KICAqCiAgKiBBdCBydW50aW1lIGRyaXZlcnMgc2hvdWxkIHJlc3RvcmUgdGhlIGZiZGV2IGNvbnNvbGUgYnkgY2FsbGluZwpAQCAtNTksNyArNTksNyBAQAogICogc2hvdWxkIGFsc28gbm90aWZ5IHRoZSBmYiBoZWxwZXIgY29kZSBmcm9tIHVwZGF0ZXMgdG8gdGhlIG91dHB1dAogICogY29uZmlndXJhdGlvbiBieSBjYWxsaW5nIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudCgpLiBGb3IgZWFzaWVyCiAgKiBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBvdXRwdXQgcG9sbGluZyBjb2RlIGluIGRybV9jcnRjX2hlbHBlci5jIHRoZSBtb2Rlc2V0Ci0gKiBjb2RlIHByb3ZlcyBhIC0+b3V0cHV0X3BvbGxfY2hhbmdlZCBjYWxsYmFjay4KKyAqIGNvZGUgcHJvdmlkZXMgYSAtPm91dHB1dF9wb2xsX2NoYW5nZWQgY2FsbGJhY2suCiAgKgogICogQWxsIG90aGVyIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUgZmIgaGVscGVyIGxpYnJhcnkgY2FuIGJlIHVzZWQgdG8KICAqIGltcGxlbWVudCB0aGUgZmJkZXYgZHJpdmVyIGludGVyZmFjZSBieSB0aGUgZHJpdmVyLgpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCW1vZGUgPSAmZmJfaGVscGVyX2Nvbm4tPmNtZGxpbmVfbW9kZTsKIAogCQkvKiBkbyBzb21ldGhpbmcgb24gcmV0dXJuIC0gdHVybiBvZmYgY29ubmVjdG9yIG1heWJlICovCi0JCWlmIChmYl9nZXRfb3B0aW9ucyhkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksICZvcHRpb24pKQorCQlpZiAoZmJfZ2V0X29wdGlvbnMoY29ubmVjdG9yLT5uYW1lLCAmb3B0aW9uKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChkcm1fbW9kZV9wYXJzZV9jb21tYW5kX2xpbmVfZm9yX2Nvbm5lY3RvcihvcHRpb24sCkBAIC0xNDIsMTIgKzE0MiwxMiBAQAogCQkJCX0KIAogCQkJCURSTV9JTkZPKCJmb3JjaW5nICVzIGNvbm5lY3RvciAlc1xuIiwKLQkJCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwgcyk7CisJCQkJCSBjb25uZWN0b3ItPm5hbWUsIHMpOwogCQkJCWNvbm5lY3Rvci0+Zm9yY2UgPSBtb2RlLT5mb3JjZTsKIAkJCX0KIAogCQkJRFJNX0RFQlVHX0tNUygiY21kbGluZSBtb2RlIGZvciBjb25uZWN0b3IgJXMgJWR4JWRAJWRIeiVzJXMlc1xuIiwKLQkJCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lLAogCQkJCSAgICAgIG1vZGUtPnhyZXMsIG1vZGUtPnlyZXMsCiAJCQkJICAgICAgbW9kZS0+cmVmcmVzaF9zcGVjaWZpZWQgPyBtb2RlLT5yZWZyZXNoIDogNjAsCiAJCQkJICAgICAgbW9kZS0+cmIgPyAiIHJlZHVjZWQgYmxhbmtpbmciIDogIiIsCkBAIC0yNzMsMTUgKzI3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZGVidWdfbGVhdmUpOwogCi0vKioKLSAqIGRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlIC0gcmVzdG9yZSBmYmRldiBjb25maWd1cmF0aW9uCi0gKiBAZmJfaGVscGVyOiBmYmNvbiB0byByZXN0b3JlCi0gKgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gZHJpdmVyJ3MgZHJtIC0+bGFzdGNsb3NlIGNhbGxiYWNrCi0gKiB3aGVuIGltcGxlbWVudGluZyBhbiBmYmNvbiBvbiB0b3Agb2Yga21zIHVzaW5nIHRoaXMgaGVscGVyLiBUaGlzIGVuc3VyZXMgdGhhdAotICogdGhlIHVzZXIgaXNuJ3QgZ3JlZXRlZCB3aXRoIGEgYmxhY2sgc2NyZWVuIHdoZW4gZS5nLiBYIGRpZXMuCi0gKi8KLWJvb2wgZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKK3N0YXRpYyBib29sIHJlc3RvcmVfZmJkZXZfbW9kZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmYl9oZWxwZXItPmRldjsKIAlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZTsKQEAgLTMxMSw3ICszMDMsNDAgQEAKIAl9CiAJcmV0dXJuIGVycm9yOwogfQotRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZSk7CisvKioKKyAqIGRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlIC0gcmVzdG9yZSBmYmRldiBjb25maWd1cmF0aW9uCisgKiBAZmJfaGVscGVyOiBmYmNvbiB0byByZXN0b3JlCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gZHJpdmVyJ3MgZHJtIC0+bGFzdGNsb3NlIGNhbGxiYWNrCisgKiB3aGVuIGltcGxlbWVudGluZyBhbiBmYmNvbiBvbiB0b3Agb2Yga21zIHVzaW5nIHRoaXMgaGVscGVyLiBUaGlzIGVuc3VyZXMgdGhhdAorICogdGhlIHVzZXIgaXNuJ3QgZ3JlZXRlZCB3aXRoIGEgYmxhY2sgc2NyZWVuIHdoZW4gZS5nLiBYIGRpZXMuCisgKgorICogVXNlIHRoaXMgdmFyaWFudCBpZiB5b3UgbmVlZCB0byBieXBhc3MgbG9ja2luZyAocGFuaWMpLCBvciBhbHJlYWR5CisgKiBob2xkIGFsbCBtb2Rlc2V0IGxvY2tzLiAgT3RoZXJ3aXNlIHVzZSBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgpCisgKi8KK3N0YXRpYyBib29sIGRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCit7CisJcmV0dXJuIHJlc3RvcmVfZmJkZXZfbW9kZShmYl9oZWxwZXIpOworfQorCisvKioKKyAqIGRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkIC0gcmVzdG9yZSBmYmRldiBjb25maWd1cmF0aW9uCisgKiBAZmJfaGVscGVyOiBmYmNvbiB0byByZXN0b3JlCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gZHJpdmVyJ3MgZHJtIC0+bGFzdGNsb3NlIGNhbGxiYWNrCisgKiB3aGVuIGltcGxlbWVudGluZyBhbiBmYmNvbiBvbiB0b3Agb2Yga21zIHVzaW5nIHRoaXMgaGVscGVyLiBUaGlzIGVuc3VyZXMgdGhhdAorICogdGhlIHVzZXIgaXNuJ3QgZ3JlZXRlZCB3aXRoIGEgYmxhY2sgc2NyZWVuIHdoZW4gZS5nLiBYIGRpZXMuCisgKi8KK2Jvb2wgZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZmJfaGVscGVyLT5kZXY7CisJYm9vbCByZXQ7CisJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKKwlyZXQgPSByZXN0b3JlX2ZiZGV2X21vZGUoZmJfaGVscGVyKTsKKwlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQpOwogCiAvKgogICogcmVzdG9yZSBmYmNvbiBkaXNwbGF5IGZvciBhbGwga21zIGRyaXZlcidzIHVzaW5nIHRoaXMgaGVscGVyLCB1c2VkIGZvciBzeXNycQpAQCAtMzI2LDEyICszNTEsMjUgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoZWxwZXIsICZrZXJuZWxfZmJfaGVscGVyX2xpc3QsIGtlcm5lbF9mYl9saXN0KSB7Ci0JCWlmIChoZWxwZXItPmRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfT0ZGKQorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGVscGVyLT5kZXY7CisKKwkJaWYgKGRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfT0ZGKQogCQkJY29udGludWU7CiAKKwkJLyogTk9URTogd2UgdXNlIGxvY2tsZXNzIGZsYWcgYmVsb3cgdG8gYXZvaWQgZ3JhYmJpbmcgb3RoZXIKKwkJICogbW9kZXNldCBsb2Nrcy4gIFNvIGp1c3QgdHJ5bG9jayB0aGUgdW5kZXJseWluZyBtdXRleAorCQkgKiBkaXJlY3RseToKKwkJICovCisJCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpIHsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJcmV0ID0gZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoaGVscGVyKTsKIAkJaWYgKHJldCkKIAkJCWVycm9yID0gdHJ1ZTsKKworCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC04MTEsNyArODQ5LDYgQEAKIGludCBkcm1fZmJfaGVscGVyX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlciA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZmJfaGVscGVyLT5kZXY7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCiAJaWYgKHZhci0+cGl4Y2xvY2sgIT0gMCkgewpAQCAtODE5LDkgKzg1Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0JZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoZmJfaGVscGVyKTsKLQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CisJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoZmJfaGVscGVyKTsKIAogCWlmIChmYl9oZWxwZXItPmRlbGF5ZWRfaG90cGx1ZykgewogCQlmYl9oZWxwZXItPmRlbGF5ZWRfaG90cGx1ZyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCBlMWViYTBiLi4wMjFmZTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtNDMsOCArNDMsNyBAQAogREVGSU5FX01VVEVYKGRybV9nbG9iYWxfbXV0ZXgpOwogRVhQT1JUX1NZTUJPTChkcm1fZ2xvYmFsX211dGV4KTsKIAotc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CitzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRybV9taW5vciAqbWlub3IpOwogCiBzdGF0aWMgaW50IGRybV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKQEAgLTk1LDcgKzk0LDcgQEAKIAkvKiBzaGFyZSBhZGRyZXNzX3NwYWNlIGFjcm9zcyBhbGwgY2hhci1kZXZzIG9mIGEgc2luZ2xlIGRldmljZSAqLwogCWZpbHAtPmZfbWFwcGluZyA9IGRldi0+YW5vbl9pbm9kZS0+aV9tYXBwaW5nOwogCi0JcmV0Y29kZSA9IGRybV9vcGVuX2hlbHBlcihpbm9kZSwgZmlscCwgbWlub3IpOworCXJldGNvZGUgPSBkcm1fb3Blbl9oZWxwZXIoZmlscCwgbWlub3IpOwogCWlmIChyZXRjb2RlKQogCQlnb3RvIGVycl91bmRvOwogCWlmIChuZWVkX3NldHVwKSB7CkBAIC0xNzEsNyArMTcwLDYgQEAKIC8qKgogICogQ2FsbGVkIHdoZW5ldmVyIGEgcHJvY2VzcyBvcGVucyAvZGV2L2RybS4KICAqCi0gKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgogICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgogICogXHBhcmFtIG1pbm9yIGFjcXVpcmVkIG1pbm9yLW9iamVjdC4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCkBAIC0xNzksOCArMTc3LDcgQEAKICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2ZpbGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSBwcml2YXRlIGRhdGEgaW4gXHAKICAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgogICovCi1zdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQorc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OwogCXN0cnVjdCBkcm1fZmlsZSAqcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCmluZGV4IDk5MDliZWYuLmY3ZDcxMTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKQEAgLTQ3NCwyMSArNDc0LDEwIEBACiAJCQlnb3RvIGZhaWw7CiAJCXBhZ2VzW2ldID0gcDsKIAotCQkvKiBUaGVyZSBpcyBhIGh5cG90aGV0aWNhbCBpc3N1ZSB3LyBkcml2ZXJzIHRoYXQgcmVxdWlyZQotCQkgKiBidWZmZXIgbWVtb3J5IGluIHRoZSBsb3cgNEdCLi4gaWYgdGhlIHBhZ2VzIGFyZSB1bi0KLQkJICogcGlubmVkLCBhbmQgc3dhcHBlZCBvdXQsIHRoZXkgY2FuIGVuZCB1cCBzd2FwcGVkIGJhY2sKLQkJICogaW4gYWJvdmUgNEdCLiAgSWYgcGFnZXMgYXJlIGFscmVhZHkgaW4gbWVtb3J5LCB0aGVuCi0JCSAqIHNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcCB3aWxsIGlnbm9yZSB0aGUgZ2ZwbWFzaywKLQkJICogZXZlbiBpZiB0aGUgYWxyZWFkeSBpbi1tZW1vcnkgcGFnZSBkaXNvYmV5cyB0aGUgbWFzay4KLQkJICoKLQkJICogSXQgaXMgb25seSBhIHRoZW9yZXRpY2FsIGlzc3VlIHRvZGF5LCBiZWNhdXNlIG5vbmUgb2YKLQkJICogdGhlIGRldmljZXMgd2l0aCB0aGlzIGxpbWl0YXRpb24gY2FuIGJlIHBvcHVsYXRlZCB3aXRoCi0JCSAqIGVub3VnaCBtZW1vcnkgdG8gdHJpZ2dlciB0aGUgaXNzdWUuICBCdXQgdGhpcyBCVUdfT04oKQotCQkgKiBpcyBoZXJlIGFzIGEgcmVtaW5kZXIgaW4gY2FzZSB0aGUgcHJvYmxlbSB3aXRoCi0JCSAqIHNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcCgpIGlzbid0IHNvbHZlZCBieSB0aGUgdGltZQotCQkgKiBpdCBkb2VzIGJlY29tZSBhIHJlYWwgaXNzdWUuCi0JCSAqCi0JCSAqIFNlZSB0aGlzIHRocmVhZDogaHR0cDovL2xrbWwub3JnL2xrbWwvMjAxMS83LzExLzIzOAorCQkvKiBNYWtlIHN1cmUgc2htZW0ga2VlcHMgX19HRlBfRE1BMzIgYWxsb2NhdGVkIHBhZ2VzIGluIHRoZQorCQkgKiBjb3JyZWN0IHJlZ2lvbiBkdXJpbmcgc3dhcGluLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcworCQkgKiBfX0dGUF9ETUEzMiB0byBiZSBzZXQgaW4gbWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKQorCQkgKiBzbyBzaG1lbSBjYW4gcmVsb2NhdGUgcGFnZXMgZHVyaW5nIHN3YXBpbiBpZiByZXF1aXJlZC4KIAkJICovCiAJCUJVR19PTigoZ2ZwbWFzayAmIF9fR0ZQX0RNQTMyKSAmJgogCQkJCShwYWdlX3RvX3BmbihwKSA+PSAweDAwMTAwMDAwVUwpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW5mby5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKaW5kZXggNzQ3MzAzNS4uODZmZWVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKQEAgLTQ3LDE4ICs0NywxNiBAQAogCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yID0gbm9kZS0+bWlub3I7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciA9IG1pbm9yLT5tYXN0ZXI7Ci0JY29uc3QgY2hhciAqYnVzX25hbWU7CiAJaWYgKCFtYXN0ZXIpCiAJCXJldHVybiAwOwogCi0JYnVzX25hbWUgPSBkZXYtPmRyaXZlci0+YnVzLT5nZXRfbmFtZShkZXYpOwogCWlmIChtYXN0ZXItPnVuaXF1ZSkgewogCQlzZXFfcHJpbnRmKG0sICIlcyAlcyAlc1xuIiwKLQkJCSAgIGJ1c19uYW1lLAorCQkJICAgZGV2LT5kcml2ZXItPm5hbWUsCiAJCQkgICBkZXZfbmFtZShkZXYtPmRldiksIG1hc3Rlci0+dW5pcXVlKTsKIAl9IGVsc2UgewogCQlzZXFfcHJpbnRmKG0sICIlcyAlc1xuIiwKLQkJCSAgIGJ1c19uYW1lLCBkZXZfbmFtZShkZXYtPmRldikpOworCQkJICAgZGV2LT5kcml2ZXItPm5hbWUsIGRldl9uYW1lKGRldi0+ZGV2KSk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2N0bC5jCmluZGV4IDkzYTQyMDQuLjY5YzYxZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jdGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvY3RsLmMKQEAgLTcyLDkgKzcyLDYgQEAKIGRybV91bnNldF9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKQogewotCWtmcmVlKGRldi0+ZGV2bmFtZSk7Ci0JZGV2LT5kZXZuYW1lID0gTlVMTDsKLQogCWtmcmVlKG1hc3Rlci0+dW5pcXVlKTsKIAltYXN0ZXItPnVuaXF1ZSA9IE5VTEw7CiAJbWFzdGVyLT51bmlxdWVfbGVuID0gMDsKQEAgLTkzLDcgKzkwLDggQEAKICAqIENvcGllcyB0aGUgYnVzIGlkIGZyb20gdXNlcnNwYWNlIGludG8gZHJtX2RldmljZTo6dW5pcXVlLCBhbmQgdmVyaWZpZXMgdGhhdAogICogaXQgbWF0Y2hlcyB0aGUgZGV2aWNlIHRoaXMgRFJNIGlzIGF0dGFjaGVkIHRvIChFSU5WQUwgb3RoZXJ3aXNlKS4gIERlcHJlY2F0ZWQKICAqIGluIGludGVyZmFjZSB2ZXJzaW9uIDEuMSBhbmQgd2lsbCByZXR1cm4gRUJVU1kgd2hlbiBzZXR2ZXJzaW9uIGhhcyByZXF1ZXN0ZWQKLSAqIHZlcnNpb24gMS4xIG9yIGdyZWF0ZXIuCisgKiB2ZXJzaW9uIDEuMSBvciBncmVhdGVyLiBBbHNvIG5vdGUgdGhhdCBLTVMgaXMgYWxsIHZlcnNpb24gMS4xIGFuZCBsYXRlciBhbmQKKyAqIFVNUyB3YXMgb25seSBldmVyIHN1cHBvcnRlZCBvbiBwY2kgZGV2aWNlcy4KICAqLwogaW50IGRybV9zZXR1bmlxdWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKQEAgLTEwOCwxMCArMTA2LDEzIEBACiAJaWYgKCF1LT51bmlxdWVfbGVuIHx8IHUtPnVuaXF1ZV9sZW4gPiAxMDI0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZGV2LT5kcml2ZXItPmJ1cy0+c2V0X3VuaXF1ZSkKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoV0FSTl9PTighZGV2LT5wZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBkZXYtPmRyaXZlci0+YnVzLT5zZXRfdW5pcXVlKGRldiwgbWFzdGVyLCB1KTsKKwlyZXQgPSBkcm1fcGNpX3NldF91bmlxdWUoZGV2LCBtYXN0ZXIsIHUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCkBAIC0xMzAsMTMgKzEzMSwyNSBAQAogCWlmIChtYXN0ZXItPnVuaXF1ZSAhPSBOVUxMKQogCQlkcm1fdW5zZXRfYnVzaWQoZGV2LCBtYXN0ZXIpOwogCi0JcmV0ID0gZGV2LT5kcml2ZXItPmJ1cy0+c2V0X2J1c2lkKGRldiwgbWFzdGVyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKKwlpZiAoZGV2LT5kcml2ZXItPmJ1cyAmJiBkZXYtPmRyaXZlci0+YnVzLT5zZXRfYnVzaWQpIHsKKwkJcmV0ID0gZGV2LT5kcml2ZXItPmJ1cy0+c2V0X2J1c2lkKGRldiwgbWFzdGVyKTsKKwkJaWYgKHJldCkgeworCQkJZHJtX3Vuc2V0X2J1c2lkKGRldiwgbWFzdGVyKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoV0FSTihkZXYtPnVuaXF1ZSA9PSBOVUxMLAorCQkJICJObyBkcm1fYnVzLnNldF9idXNpZCgpIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5ICIKKwkJCSAiJXBzLiBVc2UgZHJtX2Rldl9zZXRfdW5pcXVlKCkgdG8gc2V0IHRoZSB1bmlxdWUgIgorCQkJICJuYW1lIGV4cGxpY2l0bHkuIiwgZGV2LT5kcml2ZXIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWFzdGVyLT51bmlxdWUgPSBrc3RyZHVwKGRldi0+dW5pcXVlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG1hc3Rlci0+dW5pcXVlKQorCQkJbWFzdGVyLT51bmlxdWVfbGVuID0gc3RybGVuKGRldi0+dW5pcXVlKTsKKwl9CisKIAlyZXR1cm4gMDsKLWVycjoKLQlkcm1fdW5zZXRfYnVzaWQoZGV2LCBtYXN0ZXIpOwotCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKaW5kZXggZWM1YzNmNC4uMGRlMTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCkBAIC0xLDYgKzEsNSBAQAotLyoqCi0gKiBcZmlsZSBkcm1faXJxLmMKLSAqIElSUSBzdXBwb3J0CisvKgorICogZHJtX2lycS5jIElSUSBhbmQgdmJsYW5rIHN1cHBvcnQKICAqCiAgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgogICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CkBAIC01NiwzMyArNTUsNiBAQAogICovCiAjZGVmaW5lIERSTV9SRURVTkRBTlRfVkJMSVJRX1RIUkVTSF9OUyAxMDAwMDAwCiAKLS8qKgotICogR2V0IGludGVycnVwdCBmcm9tIGJ1cyBpZC4KLSAqCi0gKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgotICogXHBhcmFtIGZpbGVfcHJpdiBEUk0gZmlsZSBwcml2YXRlLgotICogXHBhcmFtIGNtZCBjb21tYW5kLgotICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9pcnFfYnVzaWQgc3RydWN0dXJlLgotICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KLSAqCi0gKiBGaW5kcyB0aGUgUENJIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIGlkIGFuZCBnZXRzIGl0cyBJUlEgbnVtYmVyLgotICogVGhpcyBJT0NUTCBpcyBkZXByZWNhdGVkLCBhbmQgd2lsbCBub3cgcmV0dXJuIEVJTlZBTCBmb3IgYW55IGJ1c2lkIG5vdCBlcXVhbAotICogdG8gdGhhdCBvZiB0aGUgZGV2aWNlIHRoYXQgdGhpcyBEUk0gaW5zdGFuY2UgYXR0YWNoZWQgdG8uCi0gKi8KLWludCBkcm1faXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCi17Ci0Jc3RydWN0IGRybV9pcnFfYnVzaWQgKnAgPSBkYXRhOwotCi0JaWYgKCFkZXYtPmRyaXZlci0+YnVzLT5pcnFfYnlfYnVzaWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZGV2LT5kcml2ZXItPmJ1cy0+aXJxX2J5X2J1c2lkKGRldiwgcCk7Ci19Ci0KIC8qCiAgKiBDbGVhciB2YmxhbmsgdGltZXN0YW1wIGJ1ZmZlciBmb3IgYSBjcnRjLgogICovCkBAIC0xNjcsMzMgKzEzOSw0MCBAQAogCiBzdGF0aWMgdm9pZCB2YmxhbmtfZGlzYWJsZV9mbih1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopYXJnOworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICh2b2lkICopYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB2YmxhbmstPmRldjsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCWludCBpOworCWludCBjcnRjID0gdmJsYW5rLT5jcnRjOwogCiAJaWYgKCFkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9jcnRjczsgaSsrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7Ci0JCWlmIChhdG9taWNfcmVhZCgmZGV2LT52YmxhbmtbaV0ucmVmY291bnQpID09IDAgJiYKLQkJICAgIGRldi0+dmJsYW5rW2ldLmVuYWJsZWQpIHsKLQkJCURSTV9ERUJVRygiZGlzYWJsaW5nIHZibGFuayBvbiBjcnRjICVkXG4iLCBpKTsKLQkJCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgaSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZ2YmxhbmstPnJlZmNvdW50KSA9PSAwICYmIHZibGFuay0+ZW5hYmxlZCkgeworCQlEUk1fREVCVUcoImRpc2FibGluZyB2Ymxhbmsgb24gY3J0YyAlZFxuIiwgY3J0Yyk7CisJCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgY3J0Yyk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIH0KIAorLyoqCisgKiBkcm1fdmJsYW5rX2NsZWFudXAgLSBjbGVhbnVwIHZibGFuayBzdXBwb3J0CisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgaW4gZHJtX3ZibGFua19pbml0LgorICovCiB2b2lkIGRybV92YmxhbmtfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCWludCBjcnRjOworCiAJLyogQmFpbCBpZiB0aGUgZHJpdmVyIGRpZG4ndCBjYWxsIGRybV92YmxhbmtfaW5pdCgpICovCiAJaWYgKGRldi0+bnVtX2NydGNzID09IDApCiAJCXJldHVybjsKIAotCWRlbF90aW1lcl9zeW5jKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyKTsKLQotCXZibGFua19kaXNhYmxlX2ZuKCh1bnNpZ25lZCBsb25nKWRldik7CisJZm9yIChjcnRjID0gMDsgY3J0YyA8IGRldi0+bnVtX2NydGNzOyBjcnRjKyspIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRldi0+dmJsYW5rW2NydGNdLmRpc2FibGVfdGltZXIpOworCQl2YmxhbmtfZGlzYWJsZV9mbigodW5zaWduZWQgbG9uZykmZGV2LT52YmxhbmtbY3J0Y10pOworCX0KIAogCWtmcmVlKGRldi0+dmJsYW5rKTsKIApAQCAtMjAxLDEyICsxODAsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19jbGVhbnVwKTsKIAorLyoqCisgKiBkcm1fdmJsYW5rX2luaXQgLSBpbml0aWFsaXplIHZibGFuayBzdXBwb3J0CisgKiBAZGV2OiBkcm1fZGV2aWNlCisgKiBAbnVtX2NydGNzOiBudW1iZXIgb2YgY3J0Y3Mgc3VwcG9ydGVkIGJ5IEBkZXYKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHZibGFuayBzdXBwb3J0IGZvciBAbnVtX2NydGNzIGRpc3BsYXkgcGlwZWxpbmVzLgorICoKKyAqIFJldHVybnM6CisgKiBaZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KIGludCBkcm1fdmJsYW5rX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG51bV9jcnRjcykKIHsKIAlpbnQgaSwgcmV0ID0gLUVOT01FTTsKIAotCXNldHVwX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLCB2YmxhbmtfZGlzYWJsZV9mbiwKLQkJICAgICh1bnNpZ25lZCBsb25nKWRldik7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+dmJsX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibGFua190aW1lX2xvY2spOwogCkBAIC0yMTYsOCArMjAzLDEzIEBACiAJaWYgKCFkZXYtPnZibGFuaykKIAkJZ290byBlcnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NydGNzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG51bV9jcnRjczsgaSsrKSB7CisJCWRldi0+dmJsYW5rW2ldLmRldiA9IGRldjsKKwkJZGV2LT52YmxhbmtbaV0uY3J0YyA9IGk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+dmJsYW5rW2ldLnF1ZXVlKTsKKwkJc2V0dXBfdGltZXIoJmRldi0+dmJsYW5rW2ldLmRpc2FibGVfdGltZXIsIHZibGFua19kaXNhYmxlX2ZuLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSZkZXYtPnZibGFua1tpXSk7CisJfQogCiAJRFJNX0lORk8oIlN1cHBvcnRzIHZibGFuayB0aW1lc3RhbXAgY2FjaGluZyBSZXYgMiAoMjEuMTAuMjAxMykuXG4iKTsKIApAQCAtMjYxLDQyICsyNTMsNDIgQEAKIH0KIAogLyoqCi0gKiBJbnN0YWxsIElSUSBoYW5kbGVyLgotICoKLSAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIGRybV9pcnFfaW5zdGFsbCAtIGluc3RhbGwgSVJRIGhhbmRsZXIKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBpcnE6IElSUSBudW1iZXIgdG8gaW5zdGFsbCB0aGUgaGFuZGxlciBmb3IKICAqCiAgKiBJbml0aWFsaXplcyB0aGUgSVJRIHJlbGF0ZWQgZGF0YS4gSW5zdGFsbHMgdGhlIGhhbmRsZXIsIGNhbGxpbmcgdGhlIGRyaXZlcgotICogXGMgaXJxX3ByZWluc3RhbGwoKSBhbmQgXGMgaXJxX3Bvc3RpbnN0YWxsKCkgZnVuY3Rpb25zCi0gKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uCisgKiBpcnFfcHJlaW5zdGFsbCgpIGFuZCBpcnFfcG9zdGluc3RhbGwoKSBmdW5jdGlvbnMgYmVmb3JlIGFuZCBhZnRlciB0aGUKKyAqIGluc3RhbGxhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBzaW1wbGlmaWVkIGhlbHBlciBpbnRlcmZhY2UgcHJvdmlkZWQgZm9yIGRyaXZlcnMgd2l0aCBubyBzcGVjaWFsCisgKiBuZWVkcy4gRHJpdmVycyB3aGljaCBuZWVkIHRvIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBtdWx0aXBsZQorICogaW50ZXJydXB0cyBtdXN0IGluc3RlYWQgc2V0IGRybV9kZXZpY2UtPmlycV9lbmFibGVkIHRvIHNpZ25hbCB0aGUgRFJNIGNvcmUKKyAqIHRoYXQgdmJsYW5rIGludGVycnVwdHMgYXJlIGF2YWlsYWJsZS4KKyAqCisgKiBSZXR1cm5zOgorICogWmVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgZHJtX2lycV9pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpbnQgZHJtX2lycV9pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpcnEpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHNoX2ZsYWdzID0gMDsKLQljaGFyICppcnFuYW1lOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZHJtX2Rldl90b19pcnEoZGV2KSA9PSAwKQorCWlmIChpcnEgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KIAkvKiBEcml2ZXIgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKCFkZXYtPmRldl9wcml2YXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlpZiAoZGV2LT5pcnFfZW5hYmxlZCkgewotCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAoZGV2LT5pcnFfZW5hYmxlZCkKIAkJcmV0dXJuIC1FQlVTWTsKLQl9CiAJZGV2LT5pcnFfZW5hYmxlZCA9IHRydWU7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKLQlEUk1fREVCVUcoImlycT0lZFxuIiwgZHJtX2Rldl90b19pcnEoZGV2KSk7CisJRFJNX0RFQlVHKCJpcnE9JWRcbiIsIGlycSk7CiAKIAkvKiBCZWZvcmUgaW5zdGFsbGluZyBoYW5kbGVyICovCiAJaWYgKGRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCkKQEAgLTMwNiwxOCArMjk4LDExIEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSVJRX1NIQVJFRCkpCiAJCXNoX2ZsYWdzID0gSVJRRl9TSEFSRUQ7CiAKLQlpZiAoZGV2LT5kZXZuYW1lKQotCQlpcnFuYW1lID0gZGV2LT5kZXZuYW1lOwotCWVsc2UKLQkJaXJxbmFtZSA9IGRldi0+ZHJpdmVyLT5uYW1lOwotCi0JcmV0ID0gcmVxdWVzdF9pcnEoZHJtX2Rldl90b19pcnEoZGV2KSwgZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyLAotCQkJICBzaF9mbGFncywgaXJxbmFtZSwgZGV2KTsKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciwKKwkJCSAgc2hfZmxhZ3MsIGRldi0+ZHJpdmVyLT5uYW1lLCBkZXYpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlkZXYtPmlycV9lbmFibGVkID0gZmFsc2U7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzI5LDEyICszMTQsMTIgQEAKIAkJcmV0ID0gZGV2LT5kcml2ZXItPmlycV9wb3N0aW5zdGFsbChkZXYpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlkZXYtPmlycV9lbmFibGVkID0gZmFsc2U7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCQl2Z2FfY2xpZW50X3JlZ2lzdGVyKGRldi0+cGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JCWZyZWVfaXJxKGRybV9kZXZfdG9faXJxKGRldiksIGRldik7CisJCWZyZWVfaXJxKGlycSwgZGV2KTsKKwl9IGVsc2UgeworCQlkZXYtPmlycSA9IGlycTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzQyLDExICszMjcsMjAgQEAKIEVYUE9SVF9TWU1CT0woZHJtX2lycV9pbnN0YWxsKTsKIAogLyoqCi0gKiBVbmluc3RhbGwgdGhlIElSUSBoYW5kbGVyLgorICogZHJtX2lycV91bmluc3RhbGwgLSB1bmluc3RhbGwgdGhlIElSUSBoYW5kbGVyCisgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKgotICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogQ2FsbHMgdGhlIGRyaXZlcidzIGlycV91bmluc3RhbGwoKSBmdW5jdGlvbiBhbmQgdW5yZWdpc3RlcnMgdGhlIElSUSBoYW5kbGVyLgorICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgZHJpdmVycyB3aGljaCB1c2VkIGRybV9pcnFfaW5zdGFsbCgpIHRvIHNldCB1cAorICogdGhlaXIgaW50ZXJydXB0IGhhbmRsZXIuIE90aGVyIGRyaXZlcnMgbXVzdCBvbmx5IHJlc2V0CisgKiBkcm1fZGV2aWNlLT5pcnFfZW5hYmxlZCB0byBmYWxzZS4KICAqCi0gKiBDYWxscyB0aGUgZHJpdmVyJ3MgXGMgaXJxX3VuaW5zdGFsbCgpIGZ1bmN0aW9uLCBhbmQgc3RvcHMgdGhlIGlycS4KKyAqIE5vdGUgdGhhdCBmb3Iga2VybmVsIG1vZGVzZXR0aW5nIGRyaXZlcnMgaXQgaXMgYSBidWcgaWYgdGhpcyBmdW5jdGlvbiBmYWlscy4KKyAqIFRoZSBzYW5pdHkgY2hlY2tzIGFyZSBvbmx5IHRvIGNhdGNoIGJ1Z2d5IHVzZXIgbW9kZXNldHRpbmcgZHJpdmVycyB3aGljaCBjYWxsCisgKiB0aGUgc2FtZSBmdW5jdGlvbiB0aHJvdWdoIGFuIGlvY3RsLgorICoKKyAqIFJldHVybnM6CisgKiBaZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KIGludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMzU3LDEwICszNTEsOCBAQAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlycV9lbmFibGVkID0gZGV2LT5pcnFfZW5hYmxlZDsKIAlkZXYtPmlycV9lbmFibGVkID0gZmFsc2U7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAkvKgogCSAqIFdha2UgdXAgYW55IHdhaXRlcnMgc28gdGhleSBkb24ndCBoYW5nLgpAQCAtMzc5LDcgKzM3MSw3IEBACiAJaWYgKCFpcnFfZW5hYmxlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlEUk1fREVCVUcoImlycT0lZFxuIiwgZHJtX2Rldl90b19pcnEoZGV2KSk7CisJRFJNX0RFQlVHKCJpcnE9JWRcbiIsIGRldi0+aXJxKTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwpAQCAtMzg3LDEzICszNzksMTMgQEAKIAlpZiAoZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwpCiAJCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsKGRldik7CiAKLQlmcmVlX2lycShkcm1fZGV2X3RvX2lycShkZXYpLCBkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9pcnFfdW5pbnN0YWxsKTsKIAotLyoqCisvKgogICogSVJRIGNvbnRyb2wgaW9jdGwuCiAgKgogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KQEAgLTQwOCw0MyArNDAwLDUyIEBACiAJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fY29udHJvbCAqY3RsID0gZGF0YTsKKwlpbnQgcmV0ID0gMCwgaXJxOwogCiAJLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtCiAJICogdGhpcyB1c2VkIHRvIGJlIGEgc2VwYXJhdGUgZnVuY3Rpb24gaW4gZHJtX2RtYS5oCiAJICovCiAKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQlyZXR1cm4gMDsKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIDA7CisJLyogVU1TIHdhcyBvbmx5IGV2ZXIgc3VwcG9ydCBvbiBwY2kgZGV2aWNlcy4gKi8KKwlpZiAoV0FSTl9PTighZGV2LT5wZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzd2l0Y2ggKGN0bC0+ZnVuYykgewogCWNhc2UgRFJNX0lOU1RfSEFORExFUjoKLQkJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKLQkJCXJldHVybiAwOwotCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJCXJldHVybiAwOworCQlpcnEgPSBkZXYtPnBkZXYtPmlycTsKKwogCQlpZiAoZGV2LT5pZl92ZXJzaW9uIDwgRFJNX0lGX1ZFUlNJT04oMSwgMikgJiYKLQkJICAgIGN0bC0+aXJxICE9IGRybV9kZXZfdG9faXJxKGRldikpCisJCSAgICBjdGwtPmlycSAhPSBpcnEpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIGRybV9pcnFfaW5zdGFsbChkZXYpOworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYsIGlycSk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJCXJldHVybiByZXQ7CiAJY2FzZSBEUk1fVU5JTlNUX0hBTkRMRVI6Ci0JCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGRybV9pcnFfdW5pbnN0YWxsKGRldik7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0ID0gZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkJcmV0dXJuIHJldDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CiAKIC8qKgotICogZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyAtIENhbGN1bGF0ZSB2YmxhbmsgdGltZXN0YW1wIGNvbnN0YW50cwotICoKLSAqIEBjcnRjIGRybV9jcnRjIHdob3NlIHRpbWVzdGFtcCBjb25zdGFudHMgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gKiBAbW9kZSBkaXNwbGF5IG1vZGUgY29udGFpbmluZyB0aGUgc2Nhbm91dCB0aW1pbmdzCisgKiBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzIC0gY2FsY3VsYXRlIHZibGFuayB0aW1lc3RhbXAgY29uc3RhbnRzCisgKiBAY3J0YzogZHJtX2NydGMgd2hvc2UgdGltZXN0YW1wIGNvbnN0YW50cyBzaG91bGQgYmUgdXBkYXRlZC4KKyAqIEBtb2RlOiBkaXNwbGF5IG1vZGUgY29udGFpbmluZyB0aGUgc2Nhbm91dCB0aW1pbmdzCiAgKgogICogQ2FsY3VsYXRlIGFuZCBzdG9yZSB2YXJpb3VzIGNvbnN0YW50cyB3aGljaCBhcmUgbGF0ZXIKICAqIG5lZWRlZCBieSB2YmxhbmsgYW5kIHN3YXAtY29tcGxldGlvbiB0aW1lc3RhbXBpbmcsIGUuZywKICAqIGJ5IGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoKS4gVGhleSBhcmUKLSAqIGRlcml2ZWQgZnJvbSBjcnRjJ3MgdHJ1ZSBzY2Fub3V0IHRpbWluZywgc28gdGhleSB0YWtlCisgKiBkZXJpdmVkIGZyb20gQ1JUQydzIHRydWUgc2Nhbm91dCB0aW1pbmcsIHNvIHRoZXkgdGFrZQogICogdGhpbmdzIGxpa2UgcGFuZWwgc2NhbGluZyBvciBvdGhlciBhZGp1c3RtZW50cyBpbnRvIGFjY291bnQuCiAgKi8KIHZvaWQgZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC00ODksMTEgKzQ5MCwyMiBAQAogRVhQT1JUX1NZTUJPTChkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKTsKIAogLyoqCi0gKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zIC0gaGVscGVyIHJvdXRpbmUgZm9yIGttcwotICogZHJpdmVycy4gSW1wbGVtZW50cyBjYWxjdWxhdGlvbiBvZiBleGFjdCB2YmxhbmsgdGltZXN0YW1wcyBmcm9tCi0gKiBnaXZlbiBkcm1fZGlzcGxheV9tb2RlIHRpbWluZ3MgYW5kIGN1cnJlbnQgdmlkZW8gc2Nhbm91dCBwb3NpdGlvbgotICogb2YgYSBjcnRjLiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gZ2V0X3ZibGFua190aW1lc3RhbXAoKQotICogaW1wbGVtZW50YXRpb24gb2YgYSBrbXMgZHJpdmVyIHRvIGltcGxlbWVudCB0aGUgYWN0dWFsIHRpbWVzdGFtcGluZy4KKyAqIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MgLSBwcmVjaXNlIHZibGFuayB0aW1lc3RhbXAgaGVscGVyCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAY3J0YzogV2hpY2ggQ1JUQydzIHZibGFuayB0aW1lc3RhbXAgdG8gcmV0cmlldmUKKyAqIEBtYXhfZXJyb3I6IERlc2lyZWQgbWF4aW11bSBhbGxvd2FibGUgZXJyb3IgaW4gdGltZXN0YW1wcyAobmFub3NlY3MpCisgKiAgICAgICAgICAgICBPbiByZXR1cm4gY29udGFpbnMgdHJ1ZSBtYXhpbXVtIGVycm9yIG9mIHRpbWVzdGFtcAorICogQHZibGFua190aW1lOiBQb2ludGVyIHRvIHN0cnVjdCB0aW1ldmFsIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSB0aW1lc3RhbXAKKyAqIEBmbGFnczogRmxhZ3MgdG8gcGFzcyB0byBkcml2ZXI6CisgKiAgICAgICAgIDAgPSBEZWZhdWx0LAorICogICAgICAgICBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRID0gSWYgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdmJsIElSUSBoYW5kbGVyCisgKiBAcmVmY3J0YzogQ1JUQyB3aGljaCBkZWZpbmVzIHNjYW5vdXQgdGltaW5nCisgKiBAbW9kZTogbW9kZSB3aGljaCBkZWZpbmVzIHRoZSBzY2Fub3V0IHRpbWluZ3MKKyAqCisgKiBJbXBsZW1lbnRzIGNhbGN1bGF0aW9uIG9mIGV4YWN0IHZibGFuayB0aW1lc3RhbXBzIGZyb20gZ2l2ZW4gZHJtX2Rpc3BsYXlfbW9kZQorICogdGltaW5ncyBhbmQgY3VycmVudCB2aWRlbyBzY2Fub3V0IHBvc2l0aW9uIG9mIGEgQ1JUQy4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20KKyAqIHdpdGhpbiBnZXRfdmJsYW5rX3RpbWVzdGFtcCgpIGltcGxlbWVudGF0aW9uIG9mIGEga21zIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlCisgKiBhY3R1YWwgdGltZXN0YW1waW5nLgogICoKICAqIFNob3VsZCByZXR1cm4gdGltZXN0YW1wcyBjb25mb3JtaW5nIHRvIHRoZSBPTUxfc3luY19jb250cm9sIE9wZW5NTAogICogZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24uIFRoZSB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGVuZCBvZgpAQCAtNTA4LDIxICs1MjAsMTEgQEAKICAqIHJldHVybnMgYXMgbm8gb3BlcmF0aW9uIGlmIGEgZG91Ymxlc2NhbiBvciBpbnRlcmxhY2VkIHZpZGVvIG1vZGUgaXMKICAqIGFjdGl2ZS4gSGlnaGVyIGxldmVsIGNvZGUgaXMgZXhwZWN0ZWQgdG8gaGFuZGxlIHRoaXMuCiAgKgotICogQGRldjogRFJNIGRldmljZS4KLSAqIEBjcnRjOiBXaGljaCBjcnRjJ3MgdmJsYW5rIHRpbWVzdGFtcCB0byByZXRyaWV2ZS4KLSAqIEBtYXhfZXJyb3I6IERlc2lyZWQgbWF4aW11bSBhbGxvd2FibGUgZXJyb3IgaW4gdGltZXN0YW1wcyAobmFub3NlY3MpLgotICogICAgICAgICAgICAgT24gcmV0dXJuIGNvbnRhaW5zIHRydWUgbWF4aW11bSBlcnJvciBvZiB0aW1lc3RhbXAuCi0gKiBAdmJsYW5rX3RpbWU6IFBvaW50ZXIgdG8gc3RydWN0IHRpbWV2YWwgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHRpbWVzdGFtcC4KLSAqIEBmbGFnczogRmxhZ3MgdG8gcGFzcyB0byBkcml2ZXI6Ci0gKiAgICAgICAgIDAgPSBEZWZhdWx0LgotICogICAgICAgICBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRID0gSWYgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdmJsIGlycSBoYW5kbGVyLgotICogQHJlZmNydGM6IGRybV9jcnRjKiBvZiBjcnRjIHdoaWNoIGRlZmluZXMgc2Nhbm91dCB0aW1pbmcuCi0gKiBAbW9kZTogbW9kZSB3aGljaCBkZWZpbmVzIHRoZSBzY2Fub3V0IHRpbWluZ3MKLSAqCi0gKiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBmYWlsdXJlIG9yIGlmIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudAorICogUmV0dXJuczoKKyAqIE5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBmYWlsdXJlIG9yIGlmIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudAogICogdmlkZW8gbW9kZToKICAqCi0gKiAtRUlOVkFMICAgLSBJbnZhbGlkIGNydGMuCisgKiAtRUlOVkFMICAgLSBJbnZhbGlkIENSVEMuCiAgKiAtRUFHQUlOICAgLSBUZW1wb3JhcnkgdW5hdmFpbGFibGUsIGUuZy4sIGNhbGxlZCBiZWZvcmUgaW5pdGlhbCBtb2Rlc2V0LgogICogLUVOT1RTVVBQIC0gRnVuY3Rpb24gbm90IHN1cHBvcnRlZCBpbiBjdXJyZW50IGRpc3BsYXkgbW9kZS4KICAqIC1FSU8gICAgICAtIEZhaWxlZCwgZS5nLiwgZHVlIHRvIGZhaWxlZCBzY2Fub3V0IHBvc2l0aW9uIHF1ZXJ5LgpAQCAtNjcxLDIzICs2NzMsMjMgQEAKIAogLyoqCiAgKiBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wIC0gcmV0cmlldmUgcmF3IHRpbWVzdGFtcCBmb3IgdGhlIG1vc3QgcmVjZW50Ci0gKiB2YmxhbmsgaW50ZXJ2YWwuCi0gKgorICogCQkJICAgICAgIHZibGFuayBpbnRlcnZhbAogICogQGRldjogRFJNIGRldmljZQotICogQGNydGM6IHdoaWNoIGNydGMncyB2YmxhbmsgdGltZXN0YW1wIHRvIHJldHJpZXZlCisgKiBAY3J0Yzogd2hpY2ggQ1JUQydzIHZibGFuayB0aW1lc3RhbXAgdG8gcmV0cmlldmUKICAqIEB0dmJsYW5rOiBQb2ludGVyIHRvIHRhcmdldCBzdHJ1Y3QgdGltZXZhbCB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgdGltZXN0YW1wCiAgKiBAZmxhZ3M6IEZsYWdzIHRvIHBhc3MgdG8gZHJpdmVyOgotICogICAgICAgICAwID0gRGVmYXVsdC4KLSAqICAgICAgICAgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSA9IElmIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZibCBpcnEgaGFuZGxlci4KKyAqICAgICAgICAgMCA9IERlZmF1bHQsCisgKiAgICAgICAgIERSTV9DQUxMRURfRlJPTV9WQkxJUlEgPSBJZiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB2YmwgSVJRIGhhbmRsZXIKICAqCiAgKiBGZXRjaGVzIHRoZSBzeXN0ZW0gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50Ci0gKiB2YmxhbmsgaW50ZXJ2YWwgb24gc3BlY2lmaWVkIGNydGMuIE1heSBjYWxsIGludG8ga21zLWRyaXZlciB0bworICogdmJsYW5rIGludGVydmFsIG9uIHNwZWNpZmllZCBDUlRDLiBNYXkgY2FsbCBpbnRvIGttcy1kcml2ZXIgdG8KICAqIGNvbXB1dGUgdGhlIHRpbWVzdGFtcCB3aXRoIGEgaGlnaC1wcmVjaXNpb24gR1BVIHNwZWNpZmljIG1ldGhvZC4KICAqCiAgKiBSZXR1cm5zIHplcm8gaWYgdGltZXN0YW1wIG9yaWdpbmF0ZXMgZnJvbSB1bmNvcnJlY3RlZCBkb19nZXR0aW1lb2ZkYXkoKQogICogY2FsbCwgaS5lLiwgaXQgaXNuJ3QgdmVyeSBwcmVjaXNlbHkgbG9ja2VkIHRvIHRoZSB0cnVlIHZibGFuay4KICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRpbWVzdGFtcCBpcyBjb25zaWRlcmVkIHRvIGJlIHZlcnkgcHJlY2lzZS4KKyAqIFJldHVybnM6CisgKiBOb24temVybyBpZiB0aW1lc3RhbXAgaXMgY29uc2lkZXJlZCB0byBiZSB2ZXJ5IHByZWNpc2UsIHplcm8gb3RoZXJ3aXNlLgogICovCiB1MzIgZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKIAkJCSAgICAgIHN0cnVjdCB0aW1ldmFsICp0dmJsYW5rLCB1bnNpZ25lZCBmbGFncykKQEAgLTcyMiw2ICs3MjQsOSBAQAogICogRmV0Y2hlcyB0aGUgImNvb2tlZCIgdmJsYW5rIGNvdW50IHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mCiAgKiB2YmxhbmsgZXZlbnRzIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIGJvb3RlZCwgaW5jbHVkaW5nIGxvc3QgZXZlbnRzIGR1ZSB0bwogICogbW9kZXNldHRpbmcgYWN0aXZpdHkuCisgKgorICogUmV0dXJuczoKKyAqIFRoZSBzb2Z0d2FyZSB2YmxhbmsgY291bnRlci4KICAqLwogdTMyIGRybV92YmxhbmtfY291bnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7CkBAIC03NDAsOCArNzQ1LDcgQEAKICAqIEZldGNoZXMgdGhlICJjb29rZWQiIHZibGFuayBjb3VudCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZgogICogdmJsYW5rIGV2ZW50cyBzaW5jZSB0aGUgc3lzdGVtIHdhcyBib290ZWQsIGluY2x1ZGluZyBsb3N0IGV2ZW50cyBkdWUgdG8KICAqIG1vZGVzZXR0aW5nIGFjdGl2aXR5LiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgc3lzdGVtIHRpbWVzdGFtcCBvZiB0aGUgdGltZQotICogb2YgdGhlIHZibGFuayBpbnRlcnZhbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIHZibGFuayBjb3VudGVyCi0gKiB2YWx1ZS4KKyAqIG9mIHRoZSB2YmxhbmsgaW50ZXJ2YWwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCB2YmxhbmsgY291bnRlciB2YWx1ZS4KICAqLwogdTMyIGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCiAJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSkKQEAgLTg3MCw2ICs4NzQsNDIgQEAKIH0KIAogLyoqCisgKiBkcm1fdmJsYW5rX2VuYWJsZSAtIGVuYWJsZSB0aGUgdmJsYW5rIGludGVycnVwdCBvbiBhIENSVEMKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiBDUlRDIGluIHF1ZXN0aW9uCisgKi8KK3N0YXRpYyBpbnQgZHJtX3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJaW50IHJldCA9IDA7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+dmJsX2xvY2spOworCisJc3Bpbl9sb2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOworCisJaWYgKCFkZXYtPnZibGFua1tjcnRjXS5lbmFibGVkKSB7CisJCS8qCisJCSAqIEVuYWJsZSB2YmxhbmsgaXJxcyB1bmRlciB2YmxhbmtfdGltZV9sb2NrIHByb3RlY3Rpb24uCisJCSAqIEFsbCB2YmxhbmsgY291bnQgJiB0aW1lc3RhbXAgdXBkYXRlcyBhcmUgaGVsZCBvZmYKKwkJICogdW50aWwgd2UgYXJlIGRvbmUgcmVpbml0aWFsaXppbmcgbWFzdGVyIGNvdW50ZXIgYW5kCisJCSAqIHRpbWVzdGFtcHMuIEZpbHRlcmNvZGUgaW4gZHJtX2hhbmRsZV92YmxhbmsoKSB3aWxsCisJCSAqIHByZXZlbnQgZG91YmxlLWFjY291bnRpbmcgb2Ygc2FtZSB2YmxhbmsgaW50ZXJ2YWwuCisJCSAqLworCQlyZXQgPSBkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayhkZXYsIGNydGMpOworCQlEUk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBvbiBjcnRjICVkLCByZXQ6ICVkXG4iLCBjcnRjLCByZXQpOworCQlpZiAocmV0KQorCQkJYXRvbWljX2RlYygmZGV2LT52YmxhbmtbY3J0Y10ucmVmY291bnQpOworCQllbHNlIHsKKwkJCWRldi0+dmJsYW5rW2NydGNdLmVuYWJsZWQgPSB0cnVlOworCQkJZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoZGV2LCBjcnRjKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCiAgKiBkcm1fdmJsYW5rX2dldCAtIGdldCBhIHJlZmVyZW5jZSBjb3VudCBvbiB2YmxhbmsgZXZlbnRzCiAgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKiBAY3J0Yzogd2hpY2ggQ1JUQyB0byBvd24KQEAgLTg3NywzNiArOTE3LDIwIEBACiAgKiBBY3F1aXJlIGEgcmVmZXJlbmNlIGNvdW50IG9uIHZibGFuayBldmVudHMgdG8gYXZvaWQgaGF2aW5nIHRoZW0gZGlzYWJsZWQKICAqIHdoaWxlIGluIHVzZS4KICAqCi0gKiBSRVRVUk5TCisgKiBUaGlzIGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y192YmxhbmtfZ2V0KCkuCisgKgorICogUmV0dXJuczoKICAqIFplcm8gb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLgogICovCiBpbnQgZHJtX3ZibGFua19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFncywgaXJxZmxhZ3MyOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCS8qIEdvaW5nIGZyb20gMC0+MSBtZWFucyB3ZSBoYXZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCiAJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZkZXYtPnZibGFua1tjcnRjXS5yZWZjb3VudCkgPT0gMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxhbmtfdGltZV9sb2NrLCBpcnFmbGFnczIpOwotCQlpZiAoIWRldi0+dmJsYW5rW2NydGNdLmVuYWJsZWQpIHsKLQkJCS8qIEVuYWJsZSB2YmxhbmsgaXJxcyB1bmRlciB2YmxhbmtfdGltZV9sb2NrIHByb3RlY3Rpb24uCi0JCQkgKiBBbGwgdmJsYW5rIGNvdW50ICYgdGltZXN0YW1wIHVwZGF0ZXMgYXJlIGhlbGQgb2ZmCi0JCQkgKiB1bnRpbCB3ZSBhcmUgZG9uZSByZWluaXRpYWxpemluZyBtYXN0ZXIgY291bnRlciBhbmQKLQkJCSAqIHRpbWVzdGFtcHMuIEZpbHRlcmNvZGUgaW4gZHJtX2hhbmRsZV92YmxhbmsoKSB3aWxsCi0JCQkgKiBwcmV2ZW50IGRvdWJsZS1hY2NvdW50aW5nIG9mIHNhbWUgdmJsYW5rIGludGVydmFsLgotCQkJICovCi0JCQlyZXQgPSBkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayhkZXYsIGNydGMpOwotCQkJRFJNX0RFQlVHKCJlbmFibGluZyB2Ymxhbmsgb24gY3J0YyAlZCwgcmV0OiAlZFxuIiwKLQkJCQkgIGNydGMsIHJldCk7Ci0JCQlpZiAocmV0KQotCQkJCWF0b21pY19kZWMoJmRldi0+dmJsYW5rW2NydGNdLnJlZmNvdW50KTsKLQkJCWVsc2UgewotCQkJCWRldi0+dmJsYW5rW2NydGNdLmVuYWJsZWQgPSB0cnVlOwotCQkJCWRybV91cGRhdGVfdmJsYW5rX2NvdW50KGRldiwgY3J0Yyk7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxhbmtfdGltZV9sb2NrLCBpcnFmbGFnczIpOworCQlyZXQgPSBkcm1fdmJsYW5rX2VuYWJsZShkZXYsIGNydGMpOwogCX0gZWxzZSB7CiAJCWlmICghZGV2LT52YmxhbmtbY3J0Y10uZW5hYmxlZCkgewogCQkJYXRvbWljX2RlYygmZGV2LT52YmxhbmtbY3J0Y10ucmVmY291bnQpOwpAQCAtOTIwLDEyICs5NDQsMzIgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19nZXQpOwogCiAvKioKKyAqIGRybV9jcnRjX3ZibGFua19nZXQgLSBnZXQgYSByZWZlcmVuY2UgY291bnQgb24gdmJsYW5rIGV2ZW50cworICogQGNydGM6IHdoaWNoIENSVEMgdG8gb3duCisgKgorICogQWNxdWlyZSBhIHJlZmVyZW5jZSBjb3VudCBvbiB2YmxhbmsgZXZlbnRzIHRvIGF2b2lkIGhhdmluZyB0aGVtIGRpc2FibGVkCisgKiB3aGlsZSBpbiB1c2UuCisgKgorICogVGhpcyBpcyB0aGUgbmF0aXZlIGttcyB2ZXJzaW9uIG9mIGRybV92Ymxhbmtfb2ZmKCkuCisgKgorICogUmV0dXJuczoKKyAqIFplcm8gb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLgorICovCitpbnQgZHJtX2NydGNfdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJcmV0dXJuIGRybV92YmxhbmtfZ2V0KGNydGMtPmRldiwgZHJtX2NydGNfaW5kZXgoY3J0YykpOworfQorRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192YmxhbmtfZ2V0KTsKKworLyoqCiAgKiBkcm1fdmJsYW5rX3B1dCAtIGdpdmUgdXAgb3duZXJzaGlwIG9mIHZibGFuayBldmVudHMKICAqIEBkZXY6IERSTSBkZXZpY2UKICAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIGdpdmUgdXAKICAqCiAgKiBSZWxlYXNlIG93bmVyc2hpcCBvZiBhIGdpdmVuIHZibGFuayBjb3VudGVyLCB0dXJuaW5nIG9mZiBpbnRlcnJ1cHRzCiAgKiBpZiBwb3NzaWJsZS4gRGlzYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGRybV92Ymxhbmtfb2ZmZGVsYXkgbWlsbGlzZWNvbmRzLgorICoKKyAqIFRoaXMgaXMgdGhlIGxlZ2FjeSB2ZXJzaW9uIG9mIGRybV9jcnRjX3ZibGFua19wdXQoKS4KICAqLwogdm9pZCBkcm1fdmJsYW5rX3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKQEAgLTkzNCwxNyArOTc4LDM5IEBACiAJLyogTGFzdCB1c2VyIHNjaGVkdWxlcyBpbnRlcnJ1cHQgZGlzYWJsZSAqLwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnZibGFua1tjcnRjXS5yZWZjb3VudCkgJiYKIAkgICAgKGRybV92Ymxhbmtfb2ZmZGVsYXkgPiAwKSkKLQkJbW9kX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLAorCQltb2RfdGltZXIoJmRldi0+dmJsYW5rW2NydGNdLmRpc2FibGVfdGltZXIsCiAJCQkgIGppZmZpZXMgKyAoKGRybV92Ymxhbmtfb2ZmZGVsYXkgKiBIWikvMTAwMCkpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX3B1dCk7CiAKIC8qKgorICogZHJtX2NydGNfdmJsYW5rX3B1dCAtIGdpdmUgdXAgb3duZXJzaGlwIG9mIHZibGFuayBldmVudHMKKyAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIGdpdmUgdXAKKyAqCisgKiBSZWxlYXNlIG93bmVyc2hpcCBvZiBhIGdpdmVuIHZibGFuayBjb3VudGVyLCB0dXJuaW5nIG9mZiBpbnRlcnJ1cHRzCisgKiBpZiBwb3NzaWJsZS4gRGlzYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGRybV92Ymxhbmtfb2ZmZGVsYXkgbWlsbGlzZWNvbmRzLgorICoKKyAqIFRoaXMgaXMgdGhlIG5hdGl2ZSBrbXMgdmVyc2lvbiBvZiBkcm1fdmJsYW5rX3B1dCgpLgorICovCit2b2lkIGRybV9jcnRjX3ZibGFua19wdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCWRybV92YmxhbmtfcHV0KGNydGMtPmRldiwgZHJtX2NydGNfaW5kZXgoY3J0YykpOworfQorRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192YmxhbmtfcHV0KTsKKworLyoqCiAgKiBkcm1fdmJsYW5rX29mZiAtIGRpc2FibGUgdmJsYW5rIGV2ZW50cyBvbiBhIENSVEMKICAqIEBkZXY6IERSTSBkZXZpY2UKICAqIEBjcnRjOiBDUlRDIGluIHF1ZXN0aW9uCiAgKgotICogQ2FsbGVyIG11c3QgaG9sZCBldmVudCBsb2NrLgorICogRHJpdmVycyBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gc2h1dCBkb3duIHRoZSB2YmxhbmsgaW50ZXJydXB0IGhhbmRsaW5nIHdoZW4KKyAqIGRpc2FibGluZyBhIGNydGMuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBsYXRlc3QgdmJsYW5rIGZyYW1lIGNvdW50IGlzCisgKiBzdG9yZWQgc28gdGhhdCBkcm1fdmJsYW5rX29uKCkgY2FuIHJlc3RvcmUgaXQgYWdhaW4uCisgKgorICogRHJpdmVycyBtdXN0IHVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGhhcmR3YXJlIHZibGFuayBjb3VudGVyIGNhbiBnZXQKKyAqIHJlc2V0LCBlLmcuIHdoZW4gc3VzcGVuZGluZy4KKyAqCisgKiBUaGlzIGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y192Ymxhbmtfb2ZmKCkuCiAgKi8KIHZvaWQgZHJtX3ZibGFua19vZmYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7CkBAIC05NzgsMTIgKzEwNDQsODcgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19vZmYpOwogCiAvKioKKyAqIGRybV9jcnRjX3ZibGFua19vZmYgLSBkaXNhYmxlIHZibGFuayBldmVudHMgb24gYSBDUlRDCisgKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlvbgorICoKKyAqIERyaXZlcnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNodXQgZG93biB0aGUgdmJsYW5rIGludGVycnVwdCBoYW5kbGluZyB3aGVuCisgKiBkaXNhYmxpbmcgYSBjcnRjLiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbGF0ZXN0IHZibGFuayBmcmFtZSBjb3VudCBpcworICogc3RvcmVkIHNvIHRoYXQgZHJtX3ZibGFua19vbiBjYW4gcmVzdG9yZSBpdCBhZ2Fpbi4KKyAqCisgKiBEcml2ZXJzIG11c3QgdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgaGFyZHdhcmUgdmJsYW5rIGNvdW50ZXIgY2FuIGdldAorICogcmVzZXQsIGUuZy4gd2hlbiBzdXNwZW5kaW5nLgorICoKKyAqIFRoaXMgaXMgdGhlIG5hdGl2ZSBrbXMgdmVyc2lvbiBvZiBkcm1fdmJsYW5rX29mZigpLgorICovCit2b2lkIGRybV9jcnRjX3ZibGFua19vZmYoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCWRybV92Ymxhbmtfb2ZmKGNydGMtPmRldiwgZHJtX2NydGNfaW5kZXgoY3J0YykpOworfQorRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192Ymxhbmtfb2ZmKTsKKworLyoqCisgKiBkcm1fdmJsYW5rX29uIC0gZW5hYmxlIHZibGFuayBldmVudHMgb24gYSBDUlRDCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHJlc3RvcmVzIHRoZSB2YmxhbmsgaW50ZXJydXB0IHN0YXRlIGNhcHR1cmVkIHdpdGgKKyAqIGRybV92Ymxhbmtfb2ZmKCkgYWdhaW4uIE5vdGUgdGhhdCBjYWxscyB0byBkcm1fdmJsYW5rX29uKCkgYW5kCisgKiBkcm1fdmJsYW5rX29mZigpIGNhbiBiZSB1bmJhbGFuY2VkIGFuZCBzbyBjYW4gYWxzbyBiZSB1bmNvbmRpdGlvbmFseSBjYWxsZWQKKyAqIGluIGRyaXZlciBsb2FkIGNvZGUgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBoYXJkd2FyZSBzdGF0ZSBvZiB0aGUgY3J0Yy4KKyAqCisgKiBUaGlzIGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y192Ymxhbmtfb24oKS4KKyAqLwordm9pZCBkcm1fdmJsYW5rX29uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIHRoZXJlJ3MgYXJlIHVzZXJzIGxlZnQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmRldi0+dmJsYW5rW2NydGNdLnJlZmNvdW50KSAhPSAwKQorCQlXQVJOX09OKGRybV92YmxhbmtfZW5hYmxlKGRldiwgY3J0YykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3ZibGFua19vbik7CisKKy8qKgorICogZHJtX2NydGNfdmJsYW5rX29uIC0gZW5hYmxlIHZibGFuayBldmVudHMgb24gYSBDUlRDCisgKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHJlc3RvcmVzIHRoZSB2YmxhbmsgaW50ZXJydXB0IHN0YXRlIGNhcHR1cmVkIHdpdGgKKyAqIGRybV92Ymxhbmtfb2ZmKCkgYWdhaW4uIE5vdGUgdGhhdCBjYWxscyB0byBkcm1fdmJsYW5rX29uKCkgYW5kCisgKiBkcm1fdmJsYW5rX29mZigpIGNhbiBiZSB1bmJhbGFuY2VkIGFuZCBzbyBjYW4gYWxzbyBiZSB1bmNvbmRpdGlvbmFseSBjYWxsZWQKKyAqIGluIGRyaXZlciBsb2FkIGNvZGUgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBoYXJkd2FyZSBzdGF0ZSBvZiB0aGUgY3J0Yy4KKyAqCisgKiBUaGlzIGlzIHRoZSBuYXRpdmUga21zIHZlcnNpb24gb2YgZHJtX3ZibGFua19vbigpLgorICovCit2b2lkIGRybV9jcnRjX3ZibGFua19vbihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJZHJtX3ZibGFua19vbihjcnRjLT5kZXYsIGRybV9jcnRjX2luZGV4KGNydGMpKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfdmJsYW5rX29uKTsKKworLyoqCiAgKiBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0IC0gYWNjb3VudCBmb3IgdmJsYW5rcyBhY3Jvc3MgbW9kZSBzZXRzCiAgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlvbgogICoKICAqIEFjY291bnQgZm9yIHZibGFuayBldmVudHMgYWNyb3NzIG1vZGUgc2V0dGluZyBldmVudHMsIHdoaWNoIHdpbGwgbGlrZWx5CiAgKiByZXNldCB0aGUgaGFyZHdhcmUgZnJhbWUgY291bnRlci4KKyAqCisgKiBUaGlzIGlzIGRvbmUgYnkgZ3JhYmJpbmcgYSB0ZW1wb3JhcnkgdmJsYW5rIHJlZmVyZW5jZSB0byBlbnN1cmUgdGhhdCB0aGUKKyAqIHZibGFuayBpbnRlcnJ1cHQga2VlcHMgcnVubmluZyBhY3Jvc3MgdGhlIG1vZGVzZXQgc2VxdWVuY2UuIFdpdGggdGhpcyB0aGUKKyAqIHNvZnR3YXJlLXNpZGUgdmJsYW5rIGZyYW1lIGNvdW50aW5nIHdpbGwgZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGp1bXBzIG9yCisgKiBkaXNjb250aW51aXRpZXMuCisgKgorICogVW5mb3J0dW5hdGVseSB0aGlzIGFwcHJvYWNoIGlzIHJhY3kgYW5kIGFsc28gZG9lc24ndCB3b3JrIHdoZW4gdGhlIHZibGFuaworICogaW50ZXJydXB0IHN0b3BzIHJ1bm5pbmcsIGUuZy4gYWNyb3NzIHN5c3RlbSBzdXNwZW5kIHJlc3VtZS4gSXQgaXMgdGhlcmVmb3JlCisgKiBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBkcml2ZXJzIHVzZSB0aGUgbmV3ZXIgZHJtX3ZibGFua19vZmYoKSBhbmQKKyAqIGRybV92Ymxhbmtfb24oKSBpbnN0ZWFkLiBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KCkgb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbgorICogdXNpbmcgImNvb2tlZCIgc29mdHdhcmUgdmJsYW5rIGZyYW1lIGNvdW50ZXJzIGFuZCBub3QgcmVseWluZyBvbiBhbnkgaGFyZHdhcmUKKyAqIGNvdW50ZXJzLgorICoKKyAqIERyaXZlcnMgbXVzdCBjYWxsIGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KCkgd2hlbiByZS1lbmFibGluZyB0aGUgc2FtZSBjcnRjCisgKiBhZ2Fpbi4KICAqLwogdm9pZCBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQogewpAQCAtMTAwNSw2ICsxMTQ2LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV92YmxhbmtfcHJlX21vZGVzZXQpOwogCisvKioKKyAqIGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0IC0gdW5kbyBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0IGNoYW5nZXMKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiBDUlRDIGluIHF1ZXN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBhZ2FpbiBkcm9wcyB0aGUgdGVtcG9yYXJ5IHZibGFuayByZWZlcmVuY2UgYWNxdWlyZWQgaW4KKyAqIGRybV92YmxhbmtfcHJlX21vZGVzZXQuCisgKi8KIHZvaWQgZHJtX3ZibGFua19wb3N0X21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTEwMjYsNyArMTE3NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KTsKIAotLyoqCisvKgogICogZHJtX21vZGVzZXRfY3RsIC0gaGFuZGxlIHZibGFuayBldmVudCBjb3VudGVyIGNoYW5nZXMgYWNyb3NzIG1vZGUgc3dpdGNoCiAgKiBARFJNX0lPQ1RMX0FSR1M6IHN0YW5kYXJkIGlvY3RsIGFyZ3VtZW50cwogICoKQEAgLTExMzksNyArMTI4OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCisvKgogICogV2FpdCBmb3IgVkJMQU5LLgogICoKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCkBAIC0xMTUwLDcgKzEyOTksNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgdmJsYW5rIGludGVycnVwdCBvbiB0aGUgcGlwZSByZXF1ZXN0ZWQsIHRoZW4KICAqIHNsZWVwcyB3YWl0aW5nIGZvciB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlIG51bWJlciB0byBvY2N1ciwgYW5kIGRyb3BzCi0gKiB0aGUgdmJsYW5rIGludGVycnVwdCByZWZjb3VudCBhZnRlcndhcmRzLiAodmJsYW5rIGlycSBkaXNhYmxlIGZvbGxvd3MgdGhhdAorICogdGhlIHZibGFuayBpbnRlcnJ1cHQgcmVmY291bnQgYWZ0ZXJ3YXJkcy4gKHZibGFuayBJUlEgZGlzYWJsZSBmb2xsb3dzIHRoYXQKICAqIGFmdGVyIGEgdGltZW91dCB3aXRoIG5vIGZ1cnRoZXIgdmJsYW5rIHdhaXRzIHNjaGVkdWxlZCkuCiAgKi8KIGludCBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTExNjAsOSArMTMwOSw4IEBACiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MsIHNlcSwgY3J0YywgaGlnaF9jcnRjOwogCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQotCQlpZiAoKCFkcm1fZGV2X3RvX2lycShkZXYpKSB8fCAoIWRldi0+aXJxX2VuYWJsZWQpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFkZXYtPmlycV9lbmFibGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJiBfRFJNX1ZCTEFOS19TSUdOQUwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTIyMiw2ICsxMzcwLDcgQEAKIAlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsYW5rW2NydGNdLnF1ZXVlLCAzICogSFosCiAJCSAgICAoKChkcm1fdmJsYW5rX2NvdW50KGRldiwgY3J0YykgLQogCQkgICAgICAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSB8fAorCQkgICAgICFkZXYtPnZibGFua1tjcnRjXS5lbmFibGVkIHx8CiAJCSAgICAgIWRldi0+aXJxX2VuYWJsZWQpKTsKIAogCWlmIChyZXQgIT0gLUVJTlRSKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21pcGlfZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21pcGlfZHNpLmMKaW5kZXggMDk4MjFmNC4uZTYzM2RmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9taXBpX2RzaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWlwaV9kc2kuYwpAQCAtMjgyLDYgKzI4MiwxNCBAQAogCXJldHVybiBkcnYtPnJlbW92ZShkc2kpOwogfQogCitzdGF0aWMgdm9pZCBtaXBpX2RzaV9kcnZfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgKmRydiA9IHRvX21pcGlfZHNpX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpID0gdG9fbWlwaV9kc2lfZGV2aWNlKGRldik7CisKKwlkcnYtPnNodXRkb3duKGRzaSk7Cit9CisKIC8qKgogICogbWlwaV9kc2lfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBkcml2ZXIgZm9yIERTSSBkZXZpY2VzCiAgKiBAZHJ2OiBEU0kgZHJpdmVyIHN0cnVjdHVyZQpAQCAtMjkzLDYgKzMwMSw4IEBACiAJCWRydi0+ZHJpdmVyLnByb2JlID0gbWlwaV9kc2lfZHJ2X3Byb2JlOwogCWlmIChkcnYtPnJlbW92ZSkKIAkJZHJ2LT5kcml2ZXIucmVtb3ZlID0gbWlwaV9kc2lfZHJ2X3JlbW92ZTsKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSBtaXBpX2RzaV9kcnZfc2h1dGRvd247CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKaW5kZXggOGI0MTA1Ny4uYmVkZjE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYwpAQCAtMTAxMyw2ICsxMDEzLDcgQEAKIC8qKgogICogZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlIC0gdXBkYXRlIHRoZSBtb2RlIGxpc3QgZm9yIHRoZSBjb25uZWN0b3IKICAqIEBjb25uZWN0b3I6IHRoZSBjb25uZWN0b3IgdG8gdXBkYXRlCisgKiBAbWVyZ2VfdHlwZV9iaXRzOiB3aGV0aGVyIHRvIG1lcmdlIG9yIG92ZXJyaWdodCB0eXBlIGJpdHMuCiAgKgogICogVGhpcyBtb3ZlcyB0aGUgbW9kZXMgZnJvbSB0aGUgQGNvbm5lY3RvciBwcm9iZWRfbW9kZXMgbGlzdAogICogdG8gdGhlIGFjdHVhbCBtb2RlIGxpc3QuIEl0IGNvbXBhcmVzIHRoZSBwcm9iZWQgbW9kZSBhZ2FpbnN0IHRoZSBjdXJyZW50CkBAIC0xMDIxLDcgKzEwMjIsOCBAQAogICogVGhpcyBpcyBqdXN0IGEgaGVscGVyIGZ1bmN0aW9ucyBkb2Vzbid0IHZhbGlkYXRlIGFueSBtb2RlcyBpdHNlbGYgYW5kIGFsc28KICAqIGRvZXNuJ3QgcHJ1bmUgYW55IGludmFsaWQgbW9kZXMuIENhbGxlcnMgbmVlZCB0byBkbyB0aGF0IHRoZW1zZWx2ZXMuCiAgKi8KLXZvaWQgZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit2b2lkIGRybV9tb2RlX2Nvbm5lY3Rvcl9saXN0X3VwZGF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgICBib29sIG1lcmdlX3R5cGVfYml0cykKIHsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcG1vZGUsICpwdDsKQEAgLTEwMzksNyArMTA0MSwxMCBAQAogCQkJCS8qIGlmIGVxdWFsIGRlbGV0ZSB0aGUgcHJvYmVkIG1vZGUgKi8KIAkJCQltb2RlLT5zdGF0dXMgPSBwbW9kZS0+c3RhdHVzOwogCQkJCS8qIE1lcmdlIHR5cGUgYml0cyB0b2dldGhlciAqLwotCQkJCW1vZGUtPnR5cGUgfD0gcG1vZGUtPnR5cGU7CisJCQkJaWYgKG1lcmdlX3R5cGVfYml0cykKKwkJCQkJbW9kZS0+dHlwZSB8PSBwbW9kZS0+dHlwZTsKKwkJCQllbHNlCisJCQkJCW1vZGUtPnR5cGUgPSBwbW9kZS0+dHlwZTsKIAkJCQlsaXN0X2RlbCgmcG1vZGUtPmhlYWQpOwogCQkJCWRybV9tb2RlX2Rlc3Ryb3koY29ubmVjdG9yLT5kZXYsIHBtb2RlKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXNldF9sb2NrLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzZXRfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjQ5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzZXRfbG9jay5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgorI2luY2x1ZGUgPGRybS9kcm1fbW9kZXNldF9sb2NrLmg+CisKKy8qKgorICogRE9DOiBrbXMgbG9ja2luZworICoKKyAqIEFzIEtNUyBtb3ZlcyB0b3dhcmQgbW9yZSBmaW5lIGdyYWluZWQgbG9ja2luZywgYW5kIGF0b21pYyBpb2N0bCB3aGVyZQorICogdXNlcnNwYWNlIGNhbiBpbmRpcmVjdGx5IGNvbnRyb2wgbG9ja2luZyBvcmRlciwgaXQgYmVjb21lcyBuZWNlc3NhcnkKKyAqIHRvIHVzZSB3d19tdXRleCBhbmQgYWNxdWlyZS1jb250ZXh0cyB0byBhdm9pZCBkZWFkbG9ja3MuICBCdXQgYmVjYXVzZQorICogdGhlIGxvY2tpbmcgaXMgbW9yZSBkaXN0cmlidXRlZCBhcm91bmQgdGhlIGRyaXZlciBjb2RlLCB3ZSB3YW50IGEgYml0CisgKiBvZiBleHRyYSB1dGlsaXR5L3RyYWNraW5nIG91dCBvZiBvdXIgYWNxdWlyZS1jdHguICBUaGlzIGlzIHByb3ZpZGVkCisgKiBieSBkcm1fbW9kZXNldF9sb2NrIC8gZHJtX21vZGVzZXRfYWNxdWlyZV9jdHguCisgKgorICogRm9yIGJhc2ljIHByaW5jaXBsZXMgb2Ygd3dfbXV0ZXgsIHNlZTogRG9jdW1lbnRhdGlvbi93dy1tdXRleC1kZXNpZ24udHh0CisgKgorICogVGhlIGJhc2ljIHVzYWdlIHBhdHRlcm4gaXMgdG86CisgKgorICogICAgIGRybV9tb2Rlc2V0X2FjcXVpcmVfaW5pdCgmY3R4KQorICogICByZXRyeToKKyAqICAgICBmb3JlYWNoIChsb2NrIGluIHJhbmRvbV9vcmRlcmVkX3NldF9vZl9sb2NrcykgeworICogICAgICAgcmV0ID0gZHJtX21vZGVzZXRfbG9jayhsb2NrLCAmY3R4KQorICogICAgICAgaWYgKHJldCA9PSAtRURFQURMSykgeworICogICAgICAgICAgZHJtX21vZGVzZXRfYmFja29mZigmY3R4KTsKKyAqICAgICAgICAgIGdvdG8gcmV0cnk7CisgKiAgICAgICB9CisgKiAgICAgfQorICoKKyAqICAgICAuLi4gZG8gc3R1ZmYgLi4uCisgKgorICogICAgIGRybV9tb2Rlc2V0X2Ryb3BfbG9ja3MoJmN0eCk7CisgKiAgICAgZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKCZjdHgpOworICovCisKKworLyoqCisgKiBkcm1fbW9kZXNldF9hY3F1aXJlX2luaXQgLSBpbml0aWFsaXplIGFjcXVpcmUgY29udGV4dAorICogQGN0eDogdGhlIGFjcXVpcmUgY29udGV4dAorICogQGZsYWdzOiBmb3IgZnV0dXJlCisgKi8KK3ZvaWQgZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4LAorCQl1aW50MzJfdCBmbGFncykKK3sKKwl3d19hY3F1aXJlX2luaXQoJmN0eC0+d3dfY3R4LCAmY3J0Y193d19jbGFzcyk7CisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+bG9ja2VkKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KTsKKworLyoqCisgKiBkcm1fbW9kZXNldF9hY3F1aXJlX2ZpbmkgLSBjbGVhbnVwIGFjcXVpcmUgY29udGV4dAorICogQGN0eDogdGhlIGFjcXVpcmUgY29udGV4dAorICovCit2b2lkIGRybV9tb2Rlc2V0X2FjcXVpcmVfZmluaShzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggKmN0eCkKK3sKKwl3d19hY3F1aXJlX2ZpbmkoJmN0eC0+d3dfY3R4KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKTsKKworLyoqCisgKiBkcm1fbW9kZXNldF9kcm9wX2xvY2tzIC0gZHJvcCBhbGwgbG9ja3MKKyAqIEBjdHg6IHRoZSBhY3F1aXJlIGNvbnRleHQKKyAqCisgKiBEcm9wIGFsbCBsb2NrcyBjdXJyZW50bHkgaGVsZCBhZ2FpbnN0IHRoaXMgYWNxdWlyZSBjb250ZXh0LgorICovCit2b2lkIGRybV9tb2Rlc2V0X2Ryb3BfbG9ja3Moc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCit7CisJV0FSTl9PTihjdHgtPmNvbnRlbmRlZCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjdHgtPmxvY2tlZCkpIHsKKwkJc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2s7CisKKwkJbG9jayA9IGxpc3RfZmlyc3RfZW50cnkoJmN0eC0+bG9ja2VkLAorCQkJCXN0cnVjdCBkcm1fbW9kZXNldF9sb2NrLCBoZWFkKTsKKworCQlkcm1fbW9kZXNldF91bmxvY2sobG9jayk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZXNldF9kcm9wX2xvY2tzKTsKKworc3RhdGljIGlubGluZSBpbnQgbW9kZXNldF9sb2NrKHN0cnVjdCBkcm1fbW9kZXNldF9sb2NrICpsb2NrLAorCQlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggKmN0eCwKKwkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIHNsb3cpCit7CisJaW50IHJldDsKKworCVdBUk5fT04oY3R4LT5jb250ZW5kZWQpOworCisJaWYgKGludGVycnVwdGlibGUgJiYgc2xvdykgeworCQlyZXQgPSB3d19tdXRleF9sb2NrX3Nsb3dfaW50ZXJydXB0aWJsZSgmbG9jay0+bXV0ZXgsICZjdHgtPnd3X2N0eCk7CisJfSBlbHNlIGlmIChpbnRlcnJ1cHRpYmxlKSB7CisJCXJldCA9IHd3X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbG9jay0+bXV0ZXgsICZjdHgtPnd3X2N0eCk7CisJfSBlbHNlIGlmIChzbG93KSB7CisJCXd3X211dGV4X2xvY2tfc2xvdygmbG9jay0+bXV0ZXgsICZjdHgtPnd3X2N0eCk7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gd3dfbXV0ZXhfbG9jaygmbG9jay0+bXV0ZXgsICZjdHgtPnd3X2N0eCk7CisJfQorCWlmICghcmV0KSB7CisJCVdBUk5fT04oIWxpc3RfZW1wdHkoJmxvY2stPmhlYWQpKTsKKwkJbGlzdF9hZGQoJmxvY2stPmhlYWQsICZjdHgtPmxvY2tlZCk7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVBTFJFQURZKSB7CisJCS8qIHdlIGFscmVhZHkgaG9sZCB0aGUgbG9jay4uIHRoaXMgaXMgZmluZS4gIEZvciBhdG9taWMKKwkJICogd2Ugd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gZHJtX21vZGVzZXRfbG9jaygpIHRoaW5ncworCQkgKiB3aXRob3V0IGhhdmluZyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaXMgYWxyZWFkeSBsb2NrZWQKKwkJICogb3Igbm90LgorCQkgKi8KKwkJcmV0ID0gMDsKKwl9IGVsc2UgaWYgKHJldCA9PSAtRURFQURMSykgeworCQljdHgtPmNvbnRlbmRlZCA9IGxvY2s7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb2Rlc2V0X2JhY2tvZmYoc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgsCisJCWJvb2wgaW50ZXJydXB0aWJsZSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVzZXRfbG9jayAqY29udGVuZGVkID0gY3R4LT5jb250ZW5kZWQ7CisKKwljdHgtPmNvbnRlbmRlZCA9IE5VTEw7CisKKwlpZiAoV0FSTl9PTighY29udGVuZGVkKSkKKwkJcmV0dXJuIDA7CisKKwlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKGN0eCk7CisKKwlyZXR1cm4gbW9kZXNldF9sb2NrKGNvbnRlbmRlZCwgY3R4LCBpbnRlcnJ1cHRpYmxlLCB0cnVlKTsKK30KKworLyoqCisgKiBkcm1fbW9kZXNldF9iYWNrb2ZmIC0gZGVhZGxvY2sgYXZvaWRhbmNlIGJhY2tvZmYKKyAqIEBjdHg6IHRoZSBhY3F1aXJlIGNvbnRleHQKKyAqCisgKiBJZiBkZWFkbG9jayBpcyBkZXRlY3RlZCAoaWUuIGRybV9tb2Rlc2V0X2xvY2soKSByZXR1cm5zIC1FREVBRExLKSwKKyAqIHlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkcm9wIGFsbCBjdXJyZW50bHkgaGVsZCBsb2NrcyBhbmQKKyAqIGJsb2NrIHVudGlsIHRoZSBjb250ZW5kZWQgbG9jayBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqLwordm9pZCBkcm1fbW9kZXNldF9iYWNrb2ZmKHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KQoreworCW1vZGVzZXRfYmFja29mZihjdHgsIGZhbHNlKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVzZXRfYmFja29mZik7CisKKy8qKgorICogZHJtX21vZGVzZXRfYmFja29mZl9pbnRlcnJ1cHRpYmxlIC0gZGVhZGxvY2sgYXZvaWRhbmNlIGJhY2tvZmYKKyAqIEBjdHg6IHRoZSBhY3F1aXJlIGNvbnRleHQKKyAqCisgKiBJbnRlcnJ1cHRpYmxlIHZlcnNpb24gb2YgZHJtX21vZGVzZXRfYmFja29mZigpCisgKi8KK2ludCBkcm1fbW9kZXNldF9iYWNrb2ZmX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCit7CisJcmV0dXJuIG1vZGVzZXRfYmFja29mZihjdHgsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZXNldF9iYWNrb2ZmX2ludGVycnVwdGlibGUpOworCisvKioKKyAqIGRybV9tb2Rlc2V0X2xvY2sgLSB0YWtlIG1vZGVzZXQgbG9jaworICogQGxvY2s6IGxvY2sgdG8gdGFrZQorICogQGN0eDogYWNxdWlyZSBjdHgKKyAqCisgKiBJZiBjdHggaXMgbm90IE5VTEwsIHRoZW4gaXRzIHd3IGFjcXVpcmUgY29udGV4dCBpcyB1c2VkIGFuZCB0aGUKKyAqIGxvY2sgd2lsbCBiZSB0cmFja2VkIGJ5IHRoZSBjb250ZXh0IGFuZCBjYW4gYmUgcmVsZWFzZWQgYnkgY2FsbGluZworICogZHJtX21vZGVzZXRfZHJvcF9sb2NrcygpLiAgSWYgLUVERUFETEsgaXMgcmV0dXJuZWQsIHRoaXMgbWVhbnMgYQorICogZGVhZGxvY2sgc2NlbmFyaW8gaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQKKyAqIHRvIHRha2UgYW55IG1vcmUgbG9ja3Mgd2l0aG91dCBmaXJzdCBjYWxsaW5nIGRybV9tb2Rlc2V0X2JhY2tvZmYoKS4KKyAqLworaW50IGRybV9tb2Rlc2V0X2xvY2soc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2ssCisJCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KQoreworCWlmIChjdHgpCisJCXJldHVybiBtb2Rlc2V0X2xvY2sobG9jaywgY3R4LCBmYWxzZSwgZmFsc2UpOworCisJd3dfbXV0ZXhfbG9jaygmbG9jay0+bXV0ZXgsIE5VTEwpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZXNldF9sb2NrKTsKKworLyoqCisgKiBkcm1fbW9kZXNldF9sb2NrX2ludGVycnVwdGlibGUgLSB0YWtlIG1vZGVzZXQgbG9jaworICogQGxvY2s6IGxvY2sgdG8gdGFrZQorICogQGN0eDogYWNxdWlyZSBjdHgKKyAqCisgKiBJbnRlcnJ1cHRpYmxlIHZlcnNpb24gb2YgZHJtX21vZGVzZXRfbG9jaygpCisgKi8KK2ludCBkcm1fbW9kZXNldF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2ssCisJCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KQoreworCWlmIChjdHgpCisJCXJldHVybiBtb2Rlc2V0X2xvY2sobG9jaywgY3R4LCB0cnVlLCBmYWxzZSk7CisKKwlyZXR1cm4gd3dfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsb2NrLT5tdXRleCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2Rlc2V0X2xvY2tfaW50ZXJydXB0aWJsZSk7CisKKy8qKgorICogZHJtX21vZGVzZXRfdW5sb2NrIC0gZHJvcCBtb2Rlc2V0IGxvY2sKKyAqIEBsb2NrOiBsb2NrIHRvIHJlbGVhc2UKKyAqLwordm9pZCBkcm1fbW9kZXNldF91bmxvY2soc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2spCit7CisJbGlzdF9kZWxfaW5pdCgmbG9jay0+aGVhZCk7CisJd3dfbXV0ZXhfdW5sb2NrKCZsb2NrLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2Rlc2V0X3VubG9jayk7CisKKy8qIFRlbXBvcmFyeS4uIHVudGlsIHdlIGhhdmUgc3VmZmljaWVudGx5IGZpbmUgZ3JhaW5lZCBsb2NraW5nLCB0aGVyZQorICogYXJlIGEgY291cGxlIHNjZW5hcmlvcyB3aGVyZSBpdCBpcyBjb252ZW5pZW50IHRvIGdyYWIgYWxsIGNydGMgbG9ja3MuCisgKiBJdCBpcyBwbGFubmVkIHRvIHJlbW92ZSB0aGlzOgorICovCitpbnQgZHJtX21vZGVzZXRfbG9ja19hbGxfY3J0Y3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCit7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCByZXQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmY29uZmlnLT5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9jaygmY3J0Yy0+bXV0ZXgsIGN0eCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZXNldF9sb2NrX2FsbF9jcnRjcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwppbmRleCA5YzY5NmE1Li4wMjBjZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKQEAgLTEsMTcgKzEsMyBAQAotLyogZHJtX3BjaS5oIC0tIFBDSSBETUEgbWVtb3J5IG1hbmFnZW1lbnQgd3JhcHBlcnMgZm9yIERSTSAtKi0gbGludXgtYyAtKi0gKi8KLS8qKgotICogXGZpbGUgZHJtX3BjaS5jCi0gKiBcYnJpZWYgRnVuY3Rpb25zIGFuZCBpb2N0bHMgdG8gbWFuYWdlIFBDSSBtZW1vcnkKLSAqCi0gKiBcd2FybmluZyBUaGVzZSBpbnRlcmZhY2VzIGFyZW4ndCBzdGFibGUgeWV0LgotICoKLSAqIFx0b2RvIEltcGxlbWVudCB0aGUgcmVtYWluaW5nIGlvY3RsJ3MgZm9yIHRoZSBQQ0kgcG9vbHMuCi0gKiBcdG9kbyBUaGUgd3JhcHBlcnMgaGVyZSBhcmUgc28gdGhpbiB0aGF0IHRoZXkgd291bGQgYmUgYmV0dGVyIG9mZiBpbmxpbmVkLi4KLSAqCi0gKiBcYXV0aG9yIEpvc8OpIEZvbnNlY2EgPGpyZm9uc2VjYUB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KLSAqIFxhdXRob3IgTGVpZiBEZWxnYXNzIDxsZGVsZ2Fzc0ByZXRpbmFsYnVybi5uZXQ+Ci0gKi8KLQogLyoKICAqIENvcHlyaWdodCAyMDAzIEpvc8OpIEZvbnNlY2EuCiAgKiBDb3B5cmlnaHQgMjAwMyBMZWlmIERlbGdhc3MuCkBAIC00MiwxMiArMjgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiBcbmFtZSBQQ0kgbWVtb3J5ICovCi0vKkB7Ki8KLQogLyoqCi0gKiBcYnJpZWYgQWxsb2NhdGUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2ssIGZvciBETUEuCisgKiBkcm1fcGNpX2FsbG9jIC0gQWxsb2NhdGUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2ssIGZvciBETUEuCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAc2l6ZTogc2l6ZSBvZiBibG9jayB0byBhbGxvY2F0ZQorICogQGFsaWduOiBhbGlnbm1lbnQgb2YgYmxvY2sKKyAqCisgKiBSZXR1cm46IEEgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbgorICogZmFpbHVyZS4KICAqLwogZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKIHsKQEAgLTg4LDggKzc2LDggQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fcGNpX2FsbG9jKTsKIAotLyoqCi0gKiBcYnJpZWYgRnJlZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jayB3aXRob3V0IGZyZWVpbmcgaXRzIGRlc2NyaXB0b3IuCisvKgorICogRnJlZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jayB3aXRob3V0IGZyZWVpbmcgaXRzIGRlc2NyaXB0b3IuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBMaW51eC1zcGVjaWZpYyBEUk0gY29yZSBjb2RlLgogICovCkBAIC0xMTEsNyArOTksOSBAQAogfQogCiAvKioKLSAqIFxicmllZiBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrCisgKiBkcm1fcGNpX2ZyZWUgLSBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAZG1haDogaGFuZGxlIHRvIG1lbW9yeSBibG9jawogICovCiB2b2lkIGRybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpCiB7CkBAIC0xMzcsMjEgKzEyNyw5IEBACiAJcmV0dXJuIHBjaV9kb21haW5fbnIoZGV2LT5wZGV2LT5idXMpOwogfQogCi1zdGF0aWMgaW50IGRybV9wY2lfZ2V0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnBkZXYtPmlycTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmRybV9wY2lfZ2V0X25hbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqcGRyaXZlciA9IGRldi0+ZHJpdmVyLT5rZHJpdmVyLnBjaTsKLQlyZXR1cm4gcGRyaXZlci0+bmFtZTsKLX0KLQogc3RhdGljIGludCBkcm1fcGNpX3NldF9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKQogewogCWludCBsZW4sIHJldDsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqcGRyaXZlciA9IGRldi0+ZHJpdmVyLT5rZHJpdmVyLnBjaTsKIAltYXN0ZXItPnVuaXF1ZV9sZW4gPSA0MDsKIAltYXN0ZXItPnVuaXF1ZV9zaXplID0gbWFzdGVyLT51bmlxdWVfbGVuOwogCW1hc3Rlci0+dW5pcXVlID0ga21hbGxvYyhtYXN0ZXItPnVuaXF1ZV9zaXplLCBHRlBfS0VSTkVMKTsKQEAgLTE3MywyOSArMTUxLDE2IEBACiAJfSBlbHNlCiAJCW1hc3Rlci0+dW5pcXVlX2xlbiA9IGxlbjsKIAotCWRldi0+ZGV2bmFtZSA9Ci0JCWttYWxsb2Moc3RybGVuKHBkcml2ZXItPm5hbWUpICsKLQkJCW1hc3Rlci0+dW5pcXVlX2xlbiArIDIsIEdGUF9LRVJORUwpOwotCi0JaWYgKGRldi0+ZGV2bmFtZSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCXNwcmludGYoZGV2LT5kZXZuYW1lLCAiJXNAJXMiLCBwZHJpdmVyLT5uYW1lLAotCQltYXN0ZXItPnVuaXF1ZSk7Ci0KIAlyZXR1cm4gMDsKIGVycjoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGRybV9wY2lfc2V0X3VuaXF1ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciwKLQkJCSAgICAgIHN0cnVjdCBkcm1fdW5pcXVlICp1KQoraW50IGRybV9wY2lfc2V0X3VuaXF1ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciwKKwkJICAgICAgIHN0cnVjdCBkcm1fdW5pcXVlICp1KQogewogCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYywgcmV0OwotCWNvbnN0IGNoYXIgKmJ1c19uYW1lOwogCiAJbWFzdGVyLT51bmlxdWVfbGVuID0gdS0+dW5pcXVlX2xlbjsKIAltYXN0ZXItPnVuaXF1ZV9zaXplID0gdS0+dW5pcXVlX2xlbiArIDE7CkBAIC0yMTIsMTcgKzE3Nyw2IEBACiAKIAltYXN0ZXItPnVuaXF1ZVttYXN0ZXItPnVuaXF1ZV9sZW5dID0gJ1wwJzsKIAotCWJ1c19uYW1lID0gZGV2LT5kcml2ZXItPmJ1cy0+Z2V0X25hbWUoZGV2KTsKLQlkZXYtPmRldm5hbWUgPSBrbWFsbG9jKHN0cmxlbihidXNfbmFtZSkgKwotCQkJICAgICAgIHN0cmxlbihtYXN0ZXItPnVuaXF1ZSkgKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+ZGV2bmFtZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzcHJpbnRmKGRldi0+ZGV2bmFtZSwgIiVzQCVzIiwgYnVzX25hbWUsCi0JCW1hc3Rlci0+dW5pcXVlKTsKLQogCS8qIFJldHVybiBlcnJvciBpZiB0aGUgYnVzaWQgc3VibWl0dGVkIGRvZXNuJ3QgbWF0Y2ggdGhlIGRldmljZSdzIGFjdHVhbAogCSAqIGJ1c2lkLgogCSAqLwpAQCAtMjQ3LDcgKzIwMSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgaW50IGRybV9wY2lfaXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKQogewogCWlmICgocC0+YnVzbnVtID4+IDgpICE9IGRybV9nZXRfcGNpX2RvbWFpbihkZXYpIHx8CkBAIC0yNjIsNiArMjE1LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZHJtX2lycV9ieV9idXNpZCAtIEdldCBpbnRlcnJ1cHQgZnJvbSBidXMgSUQKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBkYXRhOiBJT0NUTCBwYXJhbWV0ZXIgcG9pbnRpbmcgdG8gYSBkcm1faXJxX2J1c2lkIHN0cnVjdHVyZQorICogQGZpbGVfcHJpdjogRFJNIGZpbGUgcHJpdmF0ZS4KKyAqCisgKiBGaW5kcyB0aGUgUENJIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIGlkIGFuZCBnZXRzIGl0cyBJUlEgbnVtYmVyLgorICogVGhpcyBJT0NUTCBpcyBkZXByZWNhdGVkLCBhbmQgd2lsbCBub3cgcmV0dXJuIEVJTlZBTCBmb3IgYW55IGJ1c2lkIG5vdCBlcXVhbAorICogdG8gdGhhdCBvZiB0aGUgZGV2aWNlIHRoYXQgdGhpcyBEUk0gaW5zdGFuY2UgYXR0YWNoZWQgdG8uCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1faXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9pcnFfYnVzaWQgKnAgPSBkYXRhOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVU1TIHdhcyBvbmx5IGV2ZXIgc3VwcG9ydCBvbiBQQ0kgZGV2aWNlcy4gKi8KKwlpZiAoV0FSTl9PTighZGV2LT5wZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcm1fcGNpX2lycV9ieV9idXNpZChkZXYsIHApOworfQorCiBzdGF0aWMgdm9pZCBkcm1fcGNpX2FncF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfVVNFX0FHUCkpIHsKQEAgLTI4NywyNCArMjcwLDIwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2J1cyBkcm1fcGNpX2J1cyA9IHsKLQkuYnVzX3R5cGUgPSBEUklWRVJfQlVTX1BDSSwKLQkuZ2V0X2lycSA9IGRybV9wY2lfZ2V0X2lycSwKLQkuZ2V0X25hbWUgPSBkcm1fcGNpX2dldF9uYW1lLAogCS5zZXRfYnVzaWQgPSBkcm1fcGNpX3NldF9idXNpZCwKLQkuc2V0X3VuaXF1ZSA9IGRybV9wY2lfc2V0X3VuaXF1ZSwKLQkuaXJxX2J5X2J1c2lkID0gZHJtX3BjaV9pcnFfYnlfYnVzaWQsCiB9OwogCiAvKioKLSAqIFJlZ2lzdGVyLgotICoKLSAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKLSAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKLSAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKiBkcm1fZ2V0X3BjaV9kZXYgLSBSZWdpc3RlciBhIFBDSSBkZXZpY2Ugd2l0aCB0aGUgRFJNIHN1YnN5c3RlbQorICogQHBkZXY6IFBDSSBkZXZpY2UKKyAqIEBlbnQ6IGVudHJ5IGZyb20gdGhlIFBDSSBJRCB0YWJsZSB0aGF0IG1hdGNoZXMgQHBkZXYKKyAqIEBkcml2ZXI6IERSTSBkZXZpY2UgZHJpdmVyCiAgKgogICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0CiAgKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCiAgKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KIGludCBkcm1fZ2V0X3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCSAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQpAQCAtMzU3LDE1ICszMzYsMTQgQEAKIEVYUE9SVF9TWU1CT0woZHJtX2dldF9wY2lfZGV2KTsKIAogLyoqCi0gKiBQQ0kgZGV2aWNlIGluaXRpYWxpemF0aW9uLiBDYWxsZWQgZGlyZWN0IGZyb20gbW9kdWxlcyBhdCBsb2FkIHRpbWUuCisgKiBkcm1fcGNpX2luaXQgLSBSZWdpc3RlciBtYXRjaGluZyBQQ0kgZGV2aWNlcyB3aXRoIHRoZSBEUk0gc3Vic3lzdGVtCisgKiBAZHJpdmVyOiBEUk0gZGV2aWNlIGRyaXZlcgorICogQHBkcml2ZXI6IFBDSSBkZXZpY2UgZHJpdmVyCiAgKgotICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIEluaXRpYWxpemVzIGEgZHJtX2RldmljZSBzdHJ1Y3R1cmVzLCByZWdpc3RlcmluZyB0aGUgc3R1YnMgYW5kIGluaXRpYWxpemluZworICogdGhlIEFHUCBkZXZpY2UuCiAgKgotICogSW5pdGlhbGl6ZXMgYSBkcm1fZGV2aWNlIHN0cnVjdHVyZXMscmVnaXN0ZXJpbmcgdGhlCi0gKiBzdHVicyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBBR1AgZGV2aWNlLgotICoKLSAqIEV4cGFuZHMgdGhlIFxjIERSSVZFUl9QUkVJTklUIGFuZCBcYyBEUklWRVJfUE9TVF9JTklUIG1hY3JvcyBiZWZvcmUgYW5kCi0gKiBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gZm9yIGRyaXZlciBjdXN0b21pemF0aW9uLgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KIGludCBkcm1fcGNpX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHBjaV9kcml2ZXIgKnBkcml2ZXIpCiB7CkBAIC0zNzUsNyArMzUzLDYgQEAKIAogCURSTV9ERUJVRygiXG4iKTsKIAotCWRyaXZlci0+a2RyaXZlci5wY2kgPSBwZHJpdmVyOwogCWRyaXZlci0+YnVzID0gJmRybV9wY2lfYnVzOwogCiAJaWYgKGRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX01PREVTRVQpCkBAIC00NTMsMTEgKzQzMCwzMSBAQAogfQogCiB2b2lkIGRybV9wY2lfYWdwX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikge30KKworaW50IGRybV9pcnFfYnlfYnVzaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGRybV9wY2lfc2V0X3VuaXF1ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciwKKwkJICAgICAgIHN0cnVjdCBkcm1fdW5pcXVlICp1KQoreworCXJldHVybiAtRUlOVkFMOworfQogI2VuZGlmCiAKIEVYUE9SVF9TWU1CT0woZHJtX3BjaV9pbml0KTsKIAotLypAfSovCisvKioKKyAqIGRybV9wY2lfZXhpdCAtIFVucmVnaXN0ZXIgbWF0Y2hpbmcgUENJIGRldmljZXMgZnJvbSB0aGUgRFJNIHN1YnN5c3RlbQorICogQGRyaXZlcjogRFJNIGRldmljZSBkcml2ZXIKKyAqIEBwZHJpdmVyOiBQQ0kgZGV2aWNlIGRyaXZlcgorICoKKyAqIFVucmVnaXN0ZXJzIG9uZSBvciBtb3JlIGRldmljZXMgbWF0Y2hlZCBieSBhIFBDSSBkcml2ZXIgZnJvbSB0aGUgRFJNCisgKiBzdWJzeXN0ZW0uCisgKi8KIHZvaWQgZHJtX3BjaV9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBwY2lfZHJpdmVyICpwZHJpdmVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsICp0bXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYW5lX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wbGFuZV9oZWxwZXIuYwppbmRleCBkMmIxYzAzLi42ZDEzMzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYW5lX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhbmVfaGVscGVyLmMKQEAgLTI1LDcgKzI1LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm1fcGxhbmVfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9yZWN0Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wbGFuZV9oZWxwZXIuaD4KIAogI2RlZmluZSBTVUJQSVhFTF9NQVNLIDB4ZmZmZgogCkBAIC0zNiw5ICszOCw5IEBACiAgKiBjcmVhdGluZyB0aGUgcHJpbWFyeSBwbGFuZS4gIEhvd2V2ZXIgZHJpdmVycyB0aGF0IHN0aWxsIGNhbGwKICAqIGRybV9wbGFuZV9pbml0KCkgd2lsbCB1c2UgdGhpcyBtaW5pbWFsIGZvcm1hdCBsaXN0IGFzIHRoZSBkZWZhdWx0LgogICovCi1jb25zdCBzdGF0aWMgdWludDMyX3Qgc2FmZV9tb2Rlc2V0X2Zvcm1hdHNbXSA9IHsKLSAgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAotICAgICAgIERSTV9GT1JNQVRfQVJHQjg4ODgsCitzdGF0aWMgY29uc3QgdWludDMyX3Qgc2FmZV9tb2Rlc2V0X2Zvcm1hdHNbXSA9IHsKKwlEUk1fRk9STUFUX1hSR0I4ODg4LAorCURSTV9GT1JNQVRfQVJHQjg4ODgsCiB9OwogCiAvKgpAQCAtNTQsNiArNTYsMTMgQEAKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCWludCBjb3VudCA9IDA7CiAKKwkvKgorCSAqIE5vdGU6IE9uY2Ugd2UgY2hhbmdlIHRoZSBwbGFuZSBob29rcyB0byBtb3JlIGZpbmUtZ3JhaW5lZCBsb2NraW5nIHdlCisJICogbmVlZCB0byBncmFiIHRoZSBjb25uZWN0aW9uX211dGV4IGhlcmUgdG8gYmUgYWJsZSB0byBtYWtlIHRoZXNlCisJICogY2hlY2tzLgorCSAqLworCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KSk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpCiAJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgJiYgY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IGNydGMpIHsKIAkJCWlmIChjb25uZWN0b3JfbGlzdCAhPSBOVUxMICYmIGNvdW50IDwgbnVtX2Nvbm5lY3RvcnMpCkBAIC02Niw2ICs3NSw3OSBAQAogfQogCiAvKioKKyAqIGRybV9wbGFuZV9oZWxwZXJfY2hlY2tfdXBkYXRlKCkgLSBDaGVjayBwbGFuZSB1cGRhdGUgZm9yIHZhbGlkaXR5CisgKiBAcGxhbmU6IHBsYW5lIG9iamVjdCB0byB1cGRhdGUKKyAqIEBjcnRjOiBvd25pbmcgQ1JUQyBvZiBvd25pbmcgcGxhbmUKKyAqIEBmYjogZnJhbWVidWZmZXIgdG8gZmxpcCBvbnRvIHBsYW5lCisgKiBAc3JjOiBzb3VyY2UgY29vcmRpbmF0ZXMgaW4gMTYuMTYgZml4ZWQgcG9pbnQKKyAqIEBkZXN0OiBpbnRlZ2VyIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzCisgKiBAY2xpcDogaW50ZWdlciBjbGlwcGluZyBjb29yZGluYXRlcworICogQG1pbl9zY2FsZTogbWluaW11bSBAc3JjOkBkZXN0IHNjYWxpbmcgZmFjdG9yIGluIDE2LjE2IGZpeGVkIHBvaW50CisgKiBAbWF4X3NjYWxlOiBtYXhpbXVtIEBzcmM6QGRlc3Qgc2NhbGluZyBmYWN0b3IgaW4gMTYuMTYgZml4ZWQgcG9pbnQKKyAqIEBjYW5fcG9zaXRpb246IGlzIGl0IGxlZ2FsIHRvIHBvc2l0aW9uIHRoZSBwbGFuZSBzdWNoIHRoYXQgaXQKKyAqICAgICAgICAgICAgICAgIGRvZXNuJ3QgY292ZXIgdGhlIGVudGlyZSBjcnRjPyAgVGhpcyB3aWxsIGdlbmVyYWxseQorICogICAgICAgICAgICAgICAgb25seSBiZSBmYWxzZSBmb3IgcHJpbWFyeSBwbGFuZXMuCisgKiBAY2FuX3VwZGF0ZV9kaXNhYmxlZDogY2FuIHRoZSBwbGFuZSBiZSB1cGRhdGVkIHdoaWxlIHRoZSBjcnRjCisgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzYWJsZWQ/CisgKiBAdmlzaWJsZTogb3V0cHV0IHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoZXRoZXIgcGxhbmUgaXMgc3RpbGwgdmlzaWJsZSBhZnRlcgorICogICAgICAgICAgIGNsaXBwaW5nCisgKgorICogQ2hlY2tzIHRoYXQgYSBkZXNpcmVkIHBsYW5lIHVwZGF0ZSBpcyB2YWxpZC4gIERyaXZlcnMgdGhhdCBwcm92aWRlCisgKiB0aGVpciBvd24gcGxhbmUgaGFuZGxpbmcgcmF0aGVyIHRoYW4gaGVscGVyLXByb3ZpZGVkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAqIHN0aWxsIHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0aW9uIG9mIGVycm9yIGNoZWNraW5nCisgKiBjb2RlLgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIGlmIHVwZGF0ZSBhcHBlYXJzIHZhbGlkLCBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGRybV9wbGFuZV9oZWxwZXJfY2hlY2tfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAgICBzdHJ1Y3QgZHJtX3JlY3QgKnNyYywKKwkJCQkgICAgc3RydWN0IGRybV9yZWN0ICpkZXN0LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZHJtX3JlY3QgKmNsaXAsCisJCQkJICAgIGludCBtaW5fc2NhbGUsCisJCQkJICAgIGludCBtYXhfc2NhbGUsCisJCQkJICAgIGJvb2wgY2FuX3Bvc2l0aW9uLAorCQkJCSAgICBib29sIGNhbl91cGRhdGVfZGlzYWJsZWQsCisJCQkJICAgIGJvb2wgKnZpc2libGUpCit7CisJaW50IGhzY2FsZSwgdnNjYWxlOworCisJaWYgKCFjcnRjLT5lbmFibGVkICYmICFjYW5fdXBkYXRlX2Rpc2FibGVkKSB7CisJCURSTV9ERUJVR19LTVMoIkNhbm5vdCB1cGRhdGUgcGxhbmUgb2YgYSBkaXNhYmxlZCBDUlRDLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHNjYWxpbmcgKi8KKwloc2NhbGUgPSBkcm1fcmVjdF9jYWxjX2hzY2FsZShzcmMsIGRlc3QsIG1pbl9zY2FsZSwgbWF4X3NjYWxlKTsKKwl2c2NhbGUgPSBkcm1fcmVjdF9jYWxjX3ZzY2FsZShzcmMsIGRlc3QsIG1pbl9zY2FsZSwgbWF4X3NjYWxlKTsKKwlpZiAoaHNjYWxlIDwgMCB8fCB2c2NhbGUgPCAwKSB7CisJCURSTV9ERUJVR19LTVMoIkludmFsaWQgc2NhbGluZyBvZiBwbGFuZVxuIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCSp2aXNpYmxlID0gZHJtX3JlY3RfY2xpcF9zY2FsZWQoc3JjLCBkZXN0LCBjbGlwLCBoc2NhbGUsIHZzY2FsZSk7CisJaWYgKCEqdmlzaWJsZSkKKwkJLyoKKwkJICogUGxhbmUgaXNuJ3QgdmlzaWJsZTsgc29tZSBkcml2ZXJzIGNhbiBoYW5kbGUgdGhpcworCQkgKiBzbyB3ZSBqdXN0IHJldHVybiBzdWNjZXNzIGhlcmUuICBEcml2ZXJzIHRoYXQgY2FuJ3QKKwkJICogKGluY2x1ZGluZyB0aG9zZSB0aGF0IHVzZSB0aGUgcHJpbWFyeSBwbGFuZSBoZWxwZXIncworCQkgKiB1cGRhdGUgZnVuY3Rpb24pIHdpbGwgcmV0dXJuIGFuIGVycm9yIGZyb20gdGhlaXIKKwkJICogdXBkYXRlX3BsYW5lIGhhbmRsZXIuCisJCSAqLworCQlyZXR1cm4gMDsKKworCWlmICghY2FuX3Bvc2l0aW9uICYmICFkcm1fcmVjdF9lcXVhbHMoZGVzdCwgY2xpcCkpIHsKKwkJRFJNX0RFQlVHX0tNUygiUGxhbmUgbXVzdCBjb3ZlciBlbnRpcmUgQ1JUQ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fcGxhbmVfaGVscGVyX2NoZWNrX3VwZGF0ZSk7CisKKy8qKgogICogZHJtX3ByaW1hcnlfaGVscGVyX3VwZGF0ZSgpIC0gSGVscGVyIGZvciBwcmltYXJ5IHBsYW5lIHVwZGF0ZQogICogQHBsYW5lOiBwbGFuZSBvYmplY3QgdG8gdXBkYXRlCiAgKiBAY3J0Yzogb3duaW5nIENSVEMgb2Ygb3duaW5nIHBsYW5lCkBAIC0xMTMsNTYgKzE5NSw0MiBAQAogCQkueCA9IHNyY194ID4+IDE2LAogCQkueSA9IHNyY195ID4+IDE2LAogCX07CisJc3RydWN0IGRybV9yZWN0IHNyYyA9IHsKKwkJLngxID0gc3JjX3gsCisJCS55MSA9IHNyY195LAorCQkueDIgPSBzcmNfeCArIHNyY193LAorCQkueTIgPSBzcmNfeSArIHNyY19oLAorCX07CiAJc3RydWN0IGRybV9yZWN0IGRlc3QgPSB7CiAJCS54MSA9IGNydGNfeCwKIAkJLnkxID0gY3J0Y195LAogCQkueDIgPSBjcnRjX3ggKyBjcnRjX3csCiAJCS55MiA9IGNydGNfeSArIGNydGNfaCwKIAl9OwotCXN0cnVjdCBkcm1fcmVjdCBjbGlwID0geworCWNvbnN0IHN0cnVjdCBkcm1fcmVjdCBjbGlwID0gewogCQkueDIgPSBjcnRjLT5tb2RlLmhkaXNwbGF5LAogCQkueTIgPSBjcnRjLT5tb2RlLnZkaXNwbGF5LAogCX07CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKipjb25uZWN0b3JfbGlzdDsKLQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICp0bXBmYjsKIAlpbnQgbnVtX2Nvbm5lY3RvcnMsIHJldDsKKwlib29sIHZpc2libGU7CiAKLQlpZiAoIWNydGMtPmVuYWJsZWQpIHsKLQkJRFJNX0RFQlVHX0tNUygiQ2Fubm90IHVwZGF0ZSBwcmltYXJ5IHBsYW5lIG9mIGEgZGlzYWJsZWQgQ1JUQy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBEaXNhbGxvdyBzdWJwaXhlbCBwb3NpdGlvbmluZyAqLwotCWlmICgoc3JjX3ggfCBzcmNfeSB8IHNyY193IHwgc3JjX2gpICYgU1VCUElYRUxfTUFTSykgewotCQlEUk1fREVCVUdfS01TKCJQcmltYXJ5IHBsYW5lIGRvZXMgbm90IHN1cHBvcnQgc3VicGl4ZWwgcG9zaXRpb25pbmdcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBQcmltYXJ5IHBsYW5lcyBhcmUgbG9ja2VkIHRvIHRoZWlyIG93bmluZyBDUlRDICovCi0JaWYgKHBsYW5lLT5wb3NzaWJsZV9jcnRjcyAhPSBkcm1fY3J0Y19tYXNrKGNydGMpKSB7Ci0JCURSTV9ERUJVR19LTVMoIkNhbm5vdCBjaGFuZ2UgcHJpbWFyeSBwbGFuZSBDUlRDXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogRGlzYWxsb3cgc2NhbGluZyAqLwotCWlmIChjcnRjX3cgIT0gc3JjX3cgfHwgY3J0Y19oICE9IHNyY19oKSB7Ci0JCURSTV9ERUJVR19LTVMoIkNhbid0IHNjYWxlIHByaW1hcnkgcGxhbmVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgcHJpbWFyeSBwbGFuZSBjb3ZlcnMgZW50aXJlIENSVEMgKi8KLQlkcm1fcmVjdF9pbnRlcnNlY3QoJmRlc3QsICZjbGlwKTsKLQlpZiAoZGVzdC54MSAhPSAwIHx8IGRlc3QueTEgIT0gMCB8fAotCSAgICBkZXN0LngyICE9IGNydGMtPm1vZGUuaGRpc3BsYXkgfHwgZGVzdC55MiAhPSBjcnRjLT5tb2RlLnZkaXNwbGF5KSB7Ci0JCURSTV9ERUJVR19LTVMoIlByaW1hcnkgcGxhbmUgbXVzdCBjb3ZlciBlbnRpcmUgQ1JUQ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEZyYW1lYnVmZmVyIG11c3QgYmUgYmlnIGVub3VnaCB0byBjb3ZlciBlbnRpcmUgcGxhbmUgKi8KLQlyZXQgPSBkcm1fY3J0Y19jaGVja192aWV3cG9ydChjcnRjLCBjcnRjX3gsIGNydGNfeSwgJmNydGMtPm1vZGUsIGZiKTsKKwlyZXQgPSBkcm1fcGxhbmVfaGVscGVyX2NoZWNrX3VwZGF0ZShwbGFuZSwgY3J0YywgZmIsCisJCQkJCSAgICAmc3JjLCAmZGVzdCwgJmNsaXAsCisJCQkJCSAgICBEUk1fUExBTkVfSEVMUEVSX05PX1NDQUxJTkcsCisJCQkJCSAgICBEUk1fUExBTkVfSEVMUEVSX05PX1NDQUxJTkcsCisJCQkJCSAgICBmYWxzZSwgZmFsc2UsICZ2aXNpYmxlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaWYgKCF2aXNpYmxlKQorCQkvKgorCQkgKiBQcmltYXJ5IHBsYW5lIGlzbid0IHZpc2libGUuICBOb3RlIHRoYXQgdW5sZXNzIGEgZHJpdmVyCisJCSAqIHByb3ZpZGVzIHRoZWlyIG93biBkaXNhYmxlIGZ1bmN0aW9uLCB0aGlzIHdpbGwganVzdAorCQkgKiB3aW5kIHVwIHJldHVybmluZyAtRUlOVkFMIHRvIHVzZXJzcGFjZS4KKwkJICovCisJCXJldHVybiBwbGFuZS0+ZnVuY3MtPmRpc2FibGVfcGxhbmUocGxhbmUpOworCiAJLyogRmluZCBjdXJyZW50IGNvbm5lY3RvcnMgZm9yIENSVEMgKi8KIAludW1fY29ubmVjdG9ycyA9IGdldF9jb25uZWN0b3JzX2Zvcl9jcnRjKGNydGMsIE5VTEwsIDApOwogCUJVR19PTihudW1fY29ubmVjdG9ycyA9PSAwKTsKQEAgLTE3NiwyMSArMjQ0LDE0IEBACiAJc2V0Lm51bV9jb25uZWN0b3JzID0gbnVtX2Nvbm5lY3RvcnM7CiAKIAkvKgotCSAqIHNldF9jb25maWcoKSBhZGp1c3RzIGNydGMtPnByaW1hcnktPmZiOyBob3dldmVyIHRoZSBEUk0gc2V0cGxhbmUKLQkgKiBjb2RlIHRoYXQgY2FsbGVkIHVzIGV4cGVjdHMgdG8gaGFuZGxlIHRoZSBmcmFtZWJ1ZmZlciB1cGRhdGUgYW5kCi0JICogcmVmZXJlbmNlIGNvdW50aW5nOyBzYXZlIGFuZCByZXN0b3JlIHRoZSBjdXJyZW50IGZiIGJlZm9yZQotCSAqIGNhbGxpbmcgaXQuCi0JICoKLQkgKiBOLkIuLCB3ZSBjYWxsIHNldF9jb25maWcoKSBkaXJlY3RseSBoZXJlIHJhdGhlciB0aGFuIHVzaW5nCisJICogV2UgY2FsbCBzZXRfY29uZmlnKCkgZGlyZWN0bHkgaGVyZSByYXRoZXIgdGhhbiB1c2luZwogCSAqIGRybV9tb2RlX3NldF9jb25maWdfaW50ZXJuYWwuICBXZSdyZSByZXByb2dyYW1taW5nIHRoZSBzYW1lCiAJICogY29ubmVjdG9ycyB0aGF0IHdlcmUgYWxyZWFkeSBpbiB1c2UsIHNvIHdlIHNob3VsZG4ndCBuZWVkIHRoZSBleHRyYQogCSAqIGNyb3NzLUNSVEMgZmIgcmVmY291bnRpbmcgdG8gYWNjb21vZGF0ZSBzdGVhbGluZyBjb25uZWN0b3JzLgogCSAqIGRybV9tb2RlX3NldHBsYW5lKCkgYWxyZWFkeSBoYW5kbGVzIHRoZSBiYXNpYyByZWZjb3VudGluZyBmb3IgdGhlCiAJICogZnJhbWVidWZmZXJzIGludm9sdmVkIGluIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotCXRtcGZiID0gcGxhbmUtPmZiOwogCXJldCA9IGNydGMtPmZ1bmNzLT5zZXRfY29uZmlnKCZzZXQpOwotCXBsYW5lLT5mYiA9IHRtcGZiOwogCiAJa2ZyZWUoY29ubmVjdG9yX2xpc3QpOwogCXJldHVybiByZXQ7CkBAIC0yMzIsNyArMjkzLDYgQEAKICAqLwogdm9pZCBkcm1fcHJpbWFyeV9oZWxwZXJfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKIHsKLQlwbGFuZS0+ZnVuY3MtPmRpc2FibGVfcGxhbmUocGxhbmUpOwogCWRybV9wbGFuZV9jbGVhbnVwKHBsYW5lKTsKIAlrZnJlZShwbGFuZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKaW5kZXggMzE5ZmY1My4uZDViNzZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYwpAQCAtNjgsMTYgKzY4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGRybV9wbGF0Zm9ybV9nZXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2dldF9pcnEoZGV2LT5wbGF0Zm9ybWRldiwgMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpkcm1fcGxhdGZvcm1fZ2V0X25hbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2LT5wbGF0Zm9ybWRldi0+bmFtZTsKLX0KLQogc3RhdGljIGludCBkcm1fcGxhdGZvcm1fc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCiB7CiAJaW50IGxlbiwgcmV0LCBpZDsKQEAgLTEwNiw0NiArOTYsMzAgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JZGV2LT5kZXZuYW1lID0KLQkJa21hbGxvYyhzdHJsZW4oZGV2LT5wbGF0Zm9ybWRldi0+bmFtZSkgKwotCQkJbWFzdGVyLT51bmlxdWVfbGVuICsgMiwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoZGV2LT5kZXZuYW1lID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc3ByaW50ZihkZXYtPmRldm5hbWUsICIlc0AlcyIsIGRldi0+cGxhdGZvcm1kZXYtPm5hbWUsCi0JCW1hc3Rlci0+dW5pcXVlKTsKIAlyZXR1cm4gMDsKIGVycjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGRybV9idXMgZHJtX3BsYXRmb3JtX2J1cyA9IHsKLQkuYnVzX3R5cGUgPSBEUklWRVJfQlVTX1BMQVRGT1JNLAotCS5nZXRfaXJxID0gZHJtX3BsYXRmb3JtX2dldF9pcnEsCi0JLmdldF9uYW1lID0gZHJtX3BsYXRmb3JtX2dldF9uYW1lLAogCS5zZXRfYnVzaWQgPSBkcm1fcGxhdGZvcm1fc2V0X2J1c2lkLAogfTsKIAogLyoqCi0gKiBQbGF0Zm9ybSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uIENhbGxlZCBkaXJlY3QgZnJvbSBtb2R1bGVzLgorICogZHJtX3BsYXRmb3JtX2luaXQgLSBSZWdpc3RlciBhIHBsYXRmb3JtIGRldmljZSB3aXRoIHRoZSBEUk0gc3Vic3lzdGVtCisgKiBAZHJpdmVyOiBEUk0gZGV2aWNlIGRyaXZlcgorICogQHBsYXRmb3JtX2RldmljZTogcGxhdGZvcm0gZGV2aWNlIHRvIHJlZ2lzdGVyCiAgKgotICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIERSTSBkZXZpY2UgZHJpdmVyIGFuZCBwbGF0Zm9ybSBkZXZpY2Ugd2l0aCB0aGUgRFJNCisgKiBzdWJzeXN0ZW0sIGluaXRpYWxpemluZyBhIGRybV9kZXZpY2Ugc3RydWN0dXJlIGFuZCBjYWxsaW5nIHRoZSBkcml2ZXIncworICogLmxvYWQoKSBmdW5jdGlvbi4KICAqCi0gKiBJbml0aWFsaXplcyBhIGRybV9kZXZpY2Ugc3RydWN0dXJlcyxyZWdpc3RlcmluZyB0aGUKLSAqIHN0dWJzCi0gKgotICogRXhwYW5kcyB0aGUgXGMgRFJJVkVSX1BSRUlOSVQgYW5kIFxjIERSSVZFUl9QT1NUX0lOSVQgbWFjcm9zIGJlZm9yZSBhbmQKLSAqIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBmb3IgZHJpdmVyIGN1c3RvbWl6YXRpb24uCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotCiBpbnQgZHJtX3BsYXRmb3JtX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlKQogewogCURSTV9ERUJVRygiXG4iKTsKIAotCWRyaXZlci0+a2RyaXZlci5wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2U7CiAJZHJpdmVyLT5idXMgPSAmZHJtX3BsYXRmb3JtX2J1czsKIAlyZXR1cm4gZHJtX2dldF9wbGF0Zm9ybV9kZXYocGxhdGZvcm1fZGV2aWNlLCBkcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYmVfaGVscGVyLmMKaW5kZXggZTcwZjU0ZC4uZDIyNjc2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3Byb2JlX2hlbHBlci5jCkBAIC04MiwyNiArODIsOCBAQAogCXJldHVybjsKIH0KIAotLyoqCi0gKiBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMgLSBnZXQgY29tcGxldGUgc2V0IG9mIGRpc3BsYXkgbW9kZXMKLSAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB0byBwcm9iZQotICogQG1heFg6IG1heCB3aWR0aCBmb3IgbW9kZXMKLSAqIEBtYXhZOiBtYXggaGVpZ2h0IGZvciBtb2RlcwotICoKLSAqIEJhc2VkIG9uIHRoZSBoZWxwZXIgY2FsbGJhY2tzIGltcGxlbWVudGVkIGJ5IEBjb25uZWN0b3IgdHJ5IHRvIGRldGVjdCBhbGwKLSAqIHZhbGlkIG1vZGVzLiAgTW9kZXMgd2lsbCBmaXJzdCBiZSBhZGRlZCB0byB0aGUgY29ubmVjdG9yJ3MgcHJvYmVkX21vZGVzIGxpc3QsCi0gKiB0aGVuIGN1bGxlZCAoYmFzZWQgb24gdmFsaWRpdHkgYW5kIHRoZSBAbWF4WCwgQG1heFkgcGFyYW1ldGVycykgYW5kIHB1dCBpbnRvCi0gKiB0aGUgbm9ybWFsIG1vZGVzIGxpc3QuCi0gKgotICogSW50ZW5kZWQgdG8gYmUgdXNlIGFzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgLT5maWxsX21vZGVzKCkKLSAqIEBjb25uZWN0b3IgdmZ1bmMgZm9yIGRyaXZlcnMgdGhhdCB1c2UgdGhlIGNydGMgaGVscGVycyBmb3Igb3V0cHV0IG1vZGUKLSAqIGZpbHRlcmluZyBhbmQgZGV0ZWN0aW9uLgotICoKLSAqIFJldHVybnM6Ci0gKiBUaGUgbnVtYmVyIG9mIG1vZGVzIGZvdW5kIG9uIEBjb25uZWN0b3IuCi0gKi8KLWludCBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkJICAgIHVpbnQzMl90IG1heFgsIHVpbnQzMl90IG1heFkpCitzdGF0aWMgaW50IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlc19tZXJnZV9iaXRzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCQkJICAgICAgdWludDMyX3QgbWF4WCwgdWludDMyX3QgbWF4WSwgYm9vbCBtZXJnZV90eXBlX2JpdHMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwpAQCAtMTE0LDcgKzk2LDcgQEAKIAlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpKTsKIAogCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdXG4iLCBjb25uZWN0b3ItPmJhc2UuaWQsCi0JCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJY29ubmVjdG9yLT5uYW1lKTsKIAkvKiBzZXQgYWxsIG1vZGVzIHRvIHRoZSB1bnZlcmlmaWVkIHN0YXRlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKIAkJbW9kZS0+c3RhdHVzID0gTU9ERV9VTlZFUklGSUVEOwpAQCAtMTM4LDcgKzEyMCw3IEBACiAKIAlpZiAoY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpIHsKIAkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gZGlzY29ubmVjdGVkXG4iLAotCQkJY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3ItPm5hbWUpOwogCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBOVUxMKTsKIAkJdmVyYm9zZV9wcnVuZSA9IGZhbHNlOwogCQlnb3RvIHBydW5lOwpAQCAtMTU1LDcgKzEzNyw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCWdvdG8gcHJ1bmU7CiAKLQlkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoY29ubmVjdG9yKTsKKwlkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoY29ubmVjdG9yLCBtZXJnZV90eXBlX2JpdHMpOwogCiAJaWYgKG1heFggJiYgbWF4WSkKIAkJZHJtX21vZGVfdmFsaWRhdGVfc2l6ZShkZXYsICZjb25uZWN0b3ItPm1vZGVzLCBtYXhYLCBtYXhZKTsKQEAgLTE2OSw3ICsxNTEsNyBAQAogCWRybV9tb2RlX3ZhbGlkYXRlX2ZsYWcoY29ubmVjdG9yLCBtb2RlX2ZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKLQkJaWYgKG1vZGUtPnN0YXR1cyA9PSBNT0RFX09LKQorCQlpZiAobW9kZS0+c3RhdHVzID09IE1PREVfT0sgJiYgY29ubmVjdG9yX2Z1bmNzLT5tb2RlX3ZhbGlkKQogCQkJbW9kZS0+c3RhdHVzID0gY29ubmVjdG9yX2Z1bmNzLT5tb2RlX3ZhbGlkKGNvbm5lY3RvciwKIAkJCQkJCQkJICAgbW9kZSk7CiAJfQpAQCAtMTg2LDcgKzE2OCw3IEBACiAJZHJtX21vZGVfc29ydCgmY29ubmVjdG9yLT5tb2Rlcyk7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSBwcm9iZWQgbW9kZXMgOlxuIiwgY29ubmVjdG9yLT5iYXNlLmlkLAotCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCWNvbm5lY3Rvci0+bmFtZSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgewogCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7CiAJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CkBAIC0xOTQsOSArMTc2LDQ5IEBACiAKIAlyZXR1cm4gY291bnQ7CiB9CisKKy8qKgorICogZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzIC0gZ2V0IGNvbXBsZXRlIHNldCBvZiBkaXNwbGF5IG1vZGVzCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gcHJvYmUKKyAqIEBtYXhYOiBtYXggd2lkdGggZm9yIG1vZGVzCisgKiBAbWF4WTogbWF4IGhlaWdodCBmb3IgbW9kZXMKKyAqCisgKiBCYXNlZCBvbiB0aGUgaGVscGVyIGNhbGxiYWNrcyBpbXBsZW1lbnRlZCBieSBAY29ubmVjdG9yIHRyeSB0byBkZXRlY3QgYWxsCisgKiB2YWxpZCBtb2Rlcy4gIE1vZGVzIHdpbGwgZmlyc3QgYmUgYWRkZWQgdG8gdGhlIGNvbm5lY3RvcidzIHByb2JlZF9tb2RlcyBsaXN0LAorICogdGhlbiBjdWxsZWQgKGJhc2VkIG9uIHZhbGlkaXR5IGFuZCB0aGUgQG1heFgsIEBtYXhZIHBhcmFtZXRlcnMpIGFuZCBwdXQgaW50bworICogdGhlIG5vcm1hbCBtb2RlcyBsaXN0LgorICoKKyAqIEludGVuZGVkIHRvIGJlIHVzZSBhcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIC0+ZmlsbF9tb2RlcygpCisgKiBAY29ubmVjdG9yIHZmdW5jIGZvciBkcml2ZXJzIHRoYXQgdXNlIHRoZSBjcnRjIGhlbHBlcnMgZm9yIG91dHB1dCBtb2RlCisgKiBmaWx0ZXJpbmcgYW5kIGRldGVjdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogVGhlIG51bWJlciBvZiBtb2RlcyBmb3VuZCBvbiBAY29ubmVjdG9yLgorICovCitpbnQgZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgICB1aW50MzJfdCBtYXhYLCB1aW50MzJfdCBtYXhZKQoreworCXJldHVybiBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXNfbWVyZ2VfYml0cyhjb25uZWN0b3IsIG1heFgsIG1heFksIHRydWUpOworfQogRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMpOwogCiAvKioKKyAqIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlc19ub21lcmdlIC0gZ2V0IGNvbXBsZXRlIHNldCBvZiBkaXNwbGF5IG1vZGVzCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gcHJvYmUKKyAqIEBtYXhYOiBtYXggd2lkdGggZm9yIG1vZGVzCisgKiBAbWF4WTogbWF4IGhlaWdodCBmb3IgbW9kZXMKKyAqCisgKiBUaGlzIG9wZXJhdGVzIGxpa2UgZHJtX2hlaGxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcyBleGNlcHQgaXQKKyAqIHJlcGxhY2VzIHRoZSBtb2RlIGJpdHMgaW5zdGVhZCBvZiBtZXJnaW5nIHRoZW0gZm9yIHByZWZlcnJlZCBtb2Rlcy4KKyAqLworaW50IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlc19ub21lcmdlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgICB1aW50MzJfdCBtYXhYLCB1aW50MzJfdCBtYXhZKQoreworCXJldHVybiBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXNfbWVyZ2VfYml0cyhjb25uZWN0b3IsIG1heFgsIG1heFksIGZhbHNlKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzX25vbWVyZ2UpOworCisvKioKICAqIGRybV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQgLSBmaXJlIG9mZiBLTVMgaG90cGx1ZyBldmVudHMKICAqIEBkZXY6IGRybV9kZXZpY2Ugd2hvc2UgY29ubmVjdG9yIHN0YXRlIGNoYW5nZWQKICAqCkBAIC0yNjQsNyArMjg2LDcgQEAKIAkJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdICIKIAkJCQkgICAgICAic3RhdHVzIHVwZGF0ZWQgZnJvbSAlcyB0byAlc1xuIiwKIAkJCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsCi0JCQkJICAgICAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwKIAkJCQkgICAgICBvbGQsIG5ldyk7CiAKIAkJCWNoYW5nZWQgPSB0cnVlOwpAQCAtNDA5LDcgKzQzMSw3IEBACiAJCWNvbm5lY3Rvci0+c3RhdHVzID0gY29ubmVjdG9yLT5mdW5jcy0+ZGV0ZWN0KGNvbm5lY3RvciwgZmFsc2UpOwogCQlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSBzdGF0dXMgdXBkYXRlZCBmcm9tICVzIHRvICVzXG4iLAogCQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLAotCQkJICAgICAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkJICAgICAgY29ubmVjdG9yLT5uYW1lLAogCQkJICAgICAgZHJtX2dldF9jb25uZWN0b3Jfc3RhdHVzX25hbWUob2xkX3N0YXR1cyksCiAJCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShjb25uZWN0b3ItPnN0YXR1cykpOwogCQlpZiAob2xkX3N0YXR1cyAhPSBjb25uZWN0b3ItPnN0YXR1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKaW5kZXggNGMyNGMzYS4uMTRkMTY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKQEAgLTEsMTYgKzEsMTEgQEAKLS8qKgotICogXGZpbGUgZHJtX3N0dWIuaAotICogU3R1YiBzdXBwb3J0Ci0gKgotICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KLSAqLwotCiAvKgogICogQ3JlYXRlZDogRnJpIEphbiAxOSAxMDo0ODozNSAyMDAxIGJ5IGZhaXRoQGFjbS5vcmcKICAqCiAgKiBDb3B5cmlnaHQgMjAwMSBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKKyAqIEF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKICAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KQEAgLTEyOCw3ICsxMjMsMTAgQEAKIAlrcmVmX2luaXQoJm1hc3Rlci0+cmVmY291bnQpOwogCXNwaW5fbG9ja19pbml0KCZtYXN0ZXItPmxvY2suc3BpbmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1hc3Rlci0+bG9jay5sb2NrX3F1ZXVlKTsKLQlkcm1faHRfY3JlYXRlKCZtYXN0ZXItPm1hZ2ljbGlzdCwgRFJNX01BR0lDX0hBU0hfT1JERVIpOworCWlmIChkcm1faHRfY3JlYXRlKCZtYXN0ZXItPm1hZ2ljbGlzdCwgRFJNX01BR0lDX0hBU0hfT1JERVIpKSB7CisJCWtmcmVlKG1hc3Rlcik7CisJCXJldHVybiBOVUxMOworCX0KIAlJTklUX0xJU1RfSEVBRCgmbWFzdGVyLT5tYWdpY2ZyZWUpOwogCW1hc3Rlci0+bWlub3IgPSBtaW5vcjsKIApAQCAtMTY2LDkgKzE2NCw2IEBACiAJCW1hc3Rlci0+dW5pcXVlX2xlbiA9IDA7CiAJfQogCi0Ja2ZyZWUoZGV2LT5kZXZuYW1lKTsKLQlkZXYtPmRldm5hbWUgPSBOVUxMOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCBuZXh0LCAmbWFzdGVyLT5tYWdpY2ZyZWUsIGhlYWQpIHsKIAkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAkJZHJtX2h0X3JlbW92ZV9pdGVtKCZtYXN0ZXItPm1hZ2ljbGlzdCwgJnB0LT5oYXNoX2l0ZW0pOwpAQCAtMjk0LDYgKzI4OSw3IEBACiAKIAlzbG90ID0gZHJtX21pbm9yX2dldF9zbG90KGRldiwgdHlwZSk7CiAJaWYgKCpzbG90KSB7CisJCWRybV9tb2RlX2dyb3VwX2Rlc3Ryb3koJigqc2xvdCktPm1vZGVfZ3JvdXApOwogCQlrZnJlZSgqc2xvdCk7CiAJCSpzbG90ID0gTlVMTDsKIAl9CkBAIC00MjQsMTEgKzQyMCwxNSBAQAogfQogCiAvKioKLSAqIENhbGxlZCB2aWEgZHJtX2V4aXQoKSBhdCBtb2R1bGUgdW5sb2FkIHRpbWUgb3Igd2hlbiBwY2kgZGV2aWNlIGlzCi0gKiB1bnBsdWdnZWQuCisgKiBkcm1fcHV0X2RldiAtIFVucmVnaXN0ZXIgYW5kIHJlbGVhc2UgYSBEUk0gZGV2aWNlCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogQ2FsbGVkIGF0IG1vZHVsZSB1bmxvYWQgdGltZSBvciB3aGVuIGEgUENJIGRldmljZSBpcyB1bnBsdWdnZWQuCisgKgorICogVXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGlzY291cmFnZWQuIEl0IHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5IGNvbXBsZXRlbHkuCisgKiBQbGVhc2UgdXNlIGRybV9kZXZfdW5yZWdpc3RlcigpIGFuZCBkcm1fZGV2X3VucmVmKCkgZXhwbGljaXRseSBpbnN0ZWFkLgogICoKICAqIENsZWFucyB1cCBhbGwgRFJNIGRldmljZSwgY2FsbGluZyBkcm1fbGFzdGNsb3NlKCkuCi0gKgogICovCiB2b2lkIGRybV9wdXRfZGV2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC01MzUsNyArNTM1LDcgQEAKIH0KIAogLyoqCi0gKiBkcm1fZGV2X2FsbG9jIC0gQWxsb2NhdGUgbmV3IGRybSBkZXZpY2UKKyAqIGRybV9kZXZfYWxsb2MgLSBBbGxvY2F0ZSBuZXcgRFJNIGRldmljZQogICogQGRyaXZlcjogRFJNIGRyaXZlciB0byBhbGxvY2F0ZSBkZXZpY2UgZm9yCiAgKiBAcGFyZW50OiBQYXJlbnQgZGV2aWNlIG9iamVjdAogICoKQEAgLTU2OSw3ICs1NjksNyBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hcGxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibGFua19ldmVudF9saXN0KTsKIAotCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvdW50X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmJ1Zl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5ldmVudF9sb2NrKTsKIAltdXRleF9pbml0KCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5jdHhsaXN0X211dGV4KTsKQEAgLTY0OCw5ICs2NDgsOCBAQAogCWRybV9taW5vcl9mcmVlKGRldiwgRFJNX01JTk9SX1JFTkRFUik7CiAJZHJtX21pbm9yX2ZyZWUoZGV2LCBEUk1fTUlOT1JfQ09OVFJPTCk7CiAKLQlrZnJlZShkZXYtPmRldm5hbWUpOwotCiAJbXV0ZXhfZGVzdHJveSgmZGV2LT5tYXN0ZXJfbXV0ZXgpOworCWtmcmVlKGRldi0+dW5pcXVlKTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC02OTAsNiArNjg5LDcgQEAKIC8qKgogICogZHJtX2Rldl9yZWdpc3RlciAtIFJlZ2lzdGVyIERSTSBkZXZpY2UKICAqIEBkZXY6IERldmljZSB0byByZWdpc3RlcgorICogQGZsYWdzOiBGbGFncyBwYXNzZWQgdG8gdGhlIGRyaXZlcidzIC5sb2FkKCkgZnVuY3Rpb24KICAqCiAgKiBSZWdpc3RlciB0aGUgRFJNIGRldmljZSBAZGV2IHdpdGggdGhlIHN5c3RlbSwgYWR2ZXJ0aXNlIGRldmljZSB0byB1c2VyLXNwYWNlCiAgKiBhbmQgc3RhcnQgbm9ybWFsIGRldmljZSBvcGVyYXRpb24uIEBkZXYgbXVzdCBiZSBhbGxvY2F0ZWQgdmlhIGRybV9kZXZfYWxsb2MoKQpAQCAtNzc4LDMgKzc3OCwyOCBAQAogCWRybV9taW5vcl91bnJlZ2lzdGVyKGRldiwgRFJNX01JTk9SX0NPTlRST0wpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZGV2X3VucmVnaXN0ZXIpOworCisvKioKKyAqIGRybV9kZXZfc2V0X3VuaXF1ZSAtIFNldCB0aGUgdW5pcXVlIG5hbWUgb2YgYSBEUk0gZGV2aWNlCisgKiBAZGV2OiBkZXZpY2Ugb2Ygd2hpY2ggdG8gc2V0IHRoZSB1bmlxdWUgbmFtZQorICogQGZtdDogZm9ybWF0IHN0cmluZyBmb3IgdW5pcXVlIG5hbWUKKyAqCisgKiBTZXRzIHRoZSB1bmlxdWUgbmFtZSBvZiBhIERSTSBkZXZpY2UgdXNpbmcgdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nIGFuZAorICogYSB2YXJpYWJsZSBsaXN0IG9mIGFyZ3VtZW50cy4gRHJpdmVycyBjYW4gdXNlIHRoaXMgYXQgZHJpdmVyIHByb2JlIHRpbWUgaWYKKyAqIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZGV2aWNlcyB0aGV5IGRyaXZlIGlzIHN0YXRpYy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9kZXZfc2V0X3VuaXF1ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJa2ZyZWUoZGV2LT51bmlxdWUpOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZGV2LT51bmlxdWUgPSBrdmFzcHJpbnRmKEdGUF9LRVJORUwsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gZGV2LT51bmlxdWUgPyAwIDogLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Rldl9zZXRfdW5pcXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwppbmRleCBjMjJjMzA5Li4zNjliMjYyNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKQEAgLTM4MCw5ICszODAsOSBAQAogCiAJY29ubmVjdG9yLT5rZGV2ID0gZGV2aWNlX2NyZWF0ZShkcm1fY2xhc3MsIGRldi0+cHJpbWFyeS0+a2RldiwKIAkJCQkJMCwgY29ubmVjdG9yLCAiY2FyZCVkLSVzIiwKLQkJCQkJZGV2LT5wcmltYXJ5LT5pbmRleCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQkJZGV2LT5wcmltYXJ5LT5pbmRleCwgY29ubmVjdG9yLT5uYW1lKTsKIAlEUk1fREVCVUcoImFkZGluZyBcIiVzXCIgdG8gc3lzZnNcbiIsCi0JCSAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJICBjb25uZWN0b3ItPm5hbWUpOwogCiAJaWYgKElTX0VSUihjb25uZWN0b3ItPmtkZXYpKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGNvbm5lY3RvciBkZXZpY2U6ICVsZFxuIiwgUFRSX0VSUihjb25uZWN0b3ItPmtkZXYpKTsKQEAgLTQ2MCw3ICs0NjAsNyBAQAogCWlmICghY29ubmVjdG9yLT5rZGV2KQogCQlyZXR1cm47CiAJRFJNX0RFQlVHKCJyZW1vdmluZyBcIiVzXCIgZnJvbSBzeXNmc1xuIiwKLQkJICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkgIGNvbm5lY3Rvci0+bmFtZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb25uZWN0b3JfYXR0cnMpOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZShjb25uZWN0b3ItPmtkZXYsICZjb25uZWN0b3JfYXR0cnNbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdXNiLmMKaW5kZXggYzM0MDZhYS4uZjJmZTk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3VzYi5jCkBAIC0zNiwxNiArMzYsNiBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3VzYl9kZXYpOwogCi1zdGF0aWMgaW50IGRybV91c2JfZ2V0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZHJtX3VzYl9nZXRfbmFtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXJldHVybiAiVVNCIjsKLX0KLQogc3RhdGljIGludCBkcm1fdXNiX3NldF9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCiB7CkBAIC01MywxOCArNDMsMjQgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkcm1fYnVzIGRybV91c2JfYnVzID0gewotCS5idXNfdHlwZSA9IERSSVZFUl9CVVNfVVNCLAotCS5nZXRfaXJxID0gZHJtX3VzYl9nZXRfaXJxLAotCS5nZXRfbmFtZSA9IGRybV91c2JfZ2V0X25hbWUsCiAJLnNldF9idXNpZCA9IGRybV91c2Jfc2V0X2J1c2lkLAogfTsKLSAgICAKKworLyoqCisgKiBkcm1fdXNiX2luaXQgLSBSZWdpc3RlciBtYXRjaGluZyBVU0IgZGV2aWNlcyB3aXRoIHRoZSBEUk0gc3Vic3lzdGVtCisgKiBAZHJpdmVyOiBEUk0gZGV2aWNlIGRyaXZlcgorICogQHVkcml2ZXI6IFVTQiBkZXZpY2UgZHJpdmVyCisgKgorICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGRldmljZXMgbWF0Y2hlZCBieSBhIFVTQiBkcml2ZXIgd2l0aCB0aGUgRFJNCisgKiBzdWJzeXN0ZW0uCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KIGludCBkcm1fdXNiX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHVzYl9kcml2ZXIgKnVkcml2ZXIpCiB7CiAJaW50IHJlczsKIAlEUk1fREVCVUcoIlxuIik7CiAKLQlkcml2ZXItPmtkcml2ZXIudXNiID0gdWRyaXZlcjsKIAlkcml2ZXItPmJ1cyA9ICZkcm1fdXNiX2J1czsKIAogCXJlcyA9IHVzYl9yZWdpc3Rlcih1ZHJpdmVyKTsKQEAgLTcyLDYgKzY4LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV91c2JfaW5pdCk7CiAKKy8qKgorICogZHJtX3VzYl9leGl0IC0gVW5yZWdpc3RlciBtYXRjaGluZyBVU0IgZGV2aWNlcyBmcm9tIHRoZSBEUk0gc3Vic3lzdGVtCisgKiBAZHJpdmVyOiBEUk0gZGV2aWNlIGRyaXZlcgorICogQHVkcml2ZXI6IFVTQiBkZXZpY2UgZHJpdmVyCisgKgorICogVW5yZWdpc3RlcnMgb25lIG9yIG1vcmUgZGV2aWNlcyBtYXRjaGVkIGJ5IGEgVVNCIGRyaXZlciBmcm9tIHRoZSBEUk0KKyAqIHN1YnN5c3RlbS4KKyAqLwogdm9pZCBkcm1fdXNiX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwKIAkJICBzdHJ1Y3QgdXNiX2RyaXZlciAqdWRyaXZlcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZwppbmRleCA1YmY1YmNhLi4xNzhkMmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnCkBAIC0yNiwxNCArMjYsMTQgQEAKIAogY29uZmlnIERSTV9FWFlOT1NfRklNRAogCWJvb2wgIkV4eW5vcyBEUk0gRklNRCIKLQlkZXBlbmRzIG9uIERSTV9FWFlOT1MgJiYgIUZCX1MzQyAmJiAhQVJDSF9NVUxUSVBMQVRGT1JNCisJZGVwZW5kcyBvbiBEUk1fRVhZTk9TICYmICFGQl9TM0MKIAlzZWxlY3QgRkJfTU9ERV9IRUxQRVJTCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBFeHlub3MgRklNRCBmb3IgRFJNLgogCiBjb25maWcgRFJNX0VYWU5PU19EUEkKIAlib29sICJFWFlOT1MgRFJNIHBhcmFsbGVsIG91dHB1dCBzdXBwb3J0IgotCWRlcGVuZHMgb24gRFJNX0VYWU5PUworCWRlcGVuZHMgb24gRFJNX0VYWU5PU19GSU1ECiAJc2VsZWN0IERSTV9QQU5FTAogCWRlZmF1bHQgbgogCWhlbHAKQEAgLTQxLDcgKzQxLDcgQEAKIAogY29uZmlnIERSTV9FWFlOT1NfRFNJCiAJYm9vbCAiRVhZTk9TIERSTSBNSVBJLURTSSBkcml2ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIERSTV9FWFlOT1MKKwlkZXBlbmRzIG9uIERSTV9FWFlOT1NfRklNRAogCXNlbGVjdCBEUk1fTUlQSV9EU0kKIAlzZWxlY3QgRFJNX1BBTkVMCiAJZGVmYXVsdCBuCkBAIC01MCw3ICs1MCw3IEBACiAKIGNvbmZpZyBEUk1fRVhZTk9TX0RQCiAJYm9vbCAiRVhZTk9TIERSTSBEUCBkcml2ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIERSTV9FWFlOT1MgJiYgQVJDSF9FWFlOT1MKKwlkZXBlbmRzIG9uIERSTV9FWFlOT1NfRklNRCAmJiBBUkNIX0VYWU5PUyAmJiAoRFJNX1BUTjM0NjA9biB8fCBEUk1fUFROMzQ2MD15IHx8IERSTV9QVE4zNDYwPURSTV9FWFlOT1MpCiAJZGVmYXVsdCBEUk1fRVhZTk9TCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIERQIGRldmljZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RkYy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZGRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGM4NGU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RkYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yczoKLSAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Ci0gKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotCi0jaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKLSNpbmNsdWRlICJleHlub3NfaGRtaS5oIgotCi1zdGF0aWMgaW50IHM1cF9kZGNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZfaWQpCi17Ci0JaGRtaV9hdHRhY2hfZGRjX2NsaWVudChjbGllbnQpOwotCi0JZGV2X2luZm8oJmNsaWVudC0+YWRhcHRlci0+ZGV2LAotCQkiYXR0YWNoZWQgJXMgaW50byBpMmMgYWRhcHRlciBzdWNjZXNzZnVsbHlcbiIsCi0JCWNsaWVudC0+bmFtZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzNXBfZGRjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWRldl9pbmZvKCZjbGllbnQtPmFkYXB0ZXItPmRldiwKLQkJImRldGFjaGVkICVzIGZyb20gaTJjIGFkYXB0ZXIgc3VjY2Vzc2Z1bGx5XG4iLAotCQljbGllbnQtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhkbWlkZGNfbWF0Y2hfdHlwZXNbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNS1oZG1pZGRjIiwKLQl9LCB7Ci0JCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNDIxMC1oZG1pZGRjIiwKLQl9LCB7Ci0JCS8qIGVuZCBub2RlICovCi0JfQotfTsKLQotc3RydWN0IGkyY19kcml2ZXIgZGRjX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJleHlub3MtaGRtaWRkYyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBoZG1pZGRjX21hdGNoX3R5cGVzLAotCX0sCi0JLnByb2JlCQk9IHM1cF9kZGNfcHJvYmUsCi0JLnJlbW92ZQkJPSBzNXBfZGRjX3JlbW92ZSwKLQkuY29tbWFuZAkJPSBOVUxMLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RwX2NvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RwX2NvcmUuYwppbmRleCBhZWQ1MzNiLi5hOGZmYzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcF9jb3JlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHBfY29yZS5jCkBAIC0xOCw2ICsxOCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogI2luY2x1ZGUgPHZpZGVvL29mX2Rpc3BsYXlfdGltaW5nLmg+CiAjaW5jbHVkZSA8dmlkZW8vb2ZfdmlkZW9tb2RlLmg+CkBAIC0xNDEsMTUgKzE0NCwxNSBAQAogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAotCQlleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwgRFBDRF9BRERSX1RFU1RfUkVRVUVTVCwKKwkJZXh5bm9zX2RwX3JlYWRfYnl0ZV9mcm9tX2RwY2QoZHAsIERQX1RFU1RfUkVRVUVTVCwKIAkJCQkJJnRlc3RfdmVjdG9yKTsKLQkJaWYgKHRlc3RfdmVjdG9yICYgRFBDRF9URVNUX0VESURfUkVBRCkgeworCQlpZiAodGVzdF92ZWN0b3IgJiBEUF9URVNUX0xJTktfRURJRF9SRUFEKSB7CiAJCQlleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLAotCQkJCURQQ0RfQUREUl9URVNUX0VESURfQ0hFQ0tTVU0sCisJCQkJRFBfVEVTVF9FRElEX0NIRUNLU1VNLAogCQkJCWVkaWRbRURJRF9CTE9DS19MRU5HVEggKyBFRElEX0NIRUNLU1VNXSk7CiAJCQlleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLAotCQkJCURQQ0RfQUREUl9URVNUX1JFU1BPTlNFLAotCQkJCURQQ0RfVEVTVF9FRElEX0NIRUNLU1VNX1dSSVRFKTsKKwkJCQlEUF9URVNUX1JFU1BPTlNFLAorCQkJCURQX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURSk7CiAJCX0KIAl9IGVsc2UgewogCQlkZXZfaW5mbyhkcC0+ZGV2LCAiRURJRCBkYXRhIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dGVuc2lvbnMuXG4iKTsKQEAgLTE3MSwxNSArMTc0LDE1IEBACiAJCX0KIAogCQlleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwKLQkJCURQQ0RfQUREUl9URVNUX1JFUVVFU1QsCisJCQlEUF9URVNUX1JFUVVFU1QsCiAJCQkmdGVzdF92ZWN0b3IpOwotCQlpZiAodGVzdF92ZWN0b3IgJiBEUENEX1RFU1RfRURJRF9SRUFEKSB7CisJCWlmICh0ZXN0X3ZlY3RvciAmIERQX1RFU1RfTElOS19FRElEX1JFQUQpIHsKIAkJCWV4eW5vc19kcF93cml0ZV9ieXRlX3RvX2RwY2QoZHAsCi0JCQkJRFBDRF9BRERSX1RFU1RfRURJRF9DSEVDS1NVTSwKKwkJCQlEUF9URVNUX0VESURfQ0hFQ0tTVU0sCiAJCQkJZWRpZFtFRElEX0NIRUNLU1VNXSk7CiAJCQlleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLAotCQkJCURQQ0RfQUREUl9URVNUX1JFU1BPTlNFLAotCQkJCURQQ0RfVEVTVF9FRElEX0NIRUNLU1VNX1dSSVRFKTsKKwkJCQlEUF9URVNUX1JFU1BPTlNFLAorCQkJCURQX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURSk7CiAJCX0KIAl9CiAKQEAgLTE5Myw4ICsxOTYsOCBAQAogCWludCBpOwogCWludCByZXR2YWw7CiAKLQkvKiBSZWFkIERQQ0QgRFBDRF9BRERSX0RQQ0RfUkVWflJFQ0VJVkVfUE9SVDFfQ0FQXzEgKi8KLQlyZXR2YWwgPSBleHlub3NfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2QoZHAsIERQQ0RfQUREUl9EUENEX1JFViwKKwkvKiBSZWFkIERQQ0QgRFBfRFBDRF9SRVZ+UkVDRUlWRV9QT1JUMV9DQVBfMSAqLworCXJldHZhbCA9IGV4eW5vc19kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZChkcCwgRFBfRFBDRF9SRVYsCiAJCQkJMTIsIGJ1Zik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTIxNCwxNCArMjE3LDE0IEBACiB7CiAJdTggZGF0YTsKIAotCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLCBEUENEX0FERFJfTEFORV9DT1VOVF9TRVQsICZkYXRhKTsKKwlleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwgRFBfTEFORV9DT1VOVF9TRVQsICZkYXRhKTsKIAogCWlmIChlbmFibGUpCi0JCWV4eW5vc19kcF93cml0ZV9ieXRlX3RvX2RwY2QoZHAsIERQQ0RfQUREUl9MQU5FX0NPVU5UX1NFVCwKLQkJCURQQ0RfRU5IQU5DRURfRlJBTUVfRU4gfAorCQlleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLCBEUF9MQU5FX0NPVU5UX1NFVCwKKwkJCURQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU4gfAogCQkJRFBDRF9MQU5FX0NPVU5UX1NFVChkYXRhKSk7CiAJZWxzZQotCQlleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLCBEUENEX0FERFJfTEFORV9DT1VOVF9TRVQsCisJCWV4eW5vc19kcF93cml0ZV9ieXRlX3RvX2RwY2QoZHAsIERQX0xBTkVfQ09VTlRfU0VULAogCQkJRFBDRF9MQU5FX0NPVU5UX1NFVChkYXRhKSk7CiB9CiAKQEAgLTIzMCw3ICsyMzMsNyBAQAogCXU4IGRhdGE7CiAJaW50IHJldHZhbDsKIAotCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLCBEUENEX0FERFJfTUFYX0xBTkVfQ09VTlQsICZkYXRhKTsKKwlleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwgRFBfTUFYX0xBTkVfQ09VTlQsICZkYXRhKTsKIAlyZXR2YWwgPSBEUENEX0VOSEFOQ0VEX0ZSQU1FX0NBUChkYXRhKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC0yNTAsOCArMjUzLDggQEAKIAlleHlub3NfZHBfc2V0X3RyYWluaW5nX3BhdHRlcm4oZHAsIERQX05PTkUpOwogCiAJZXh5bm9zX2RwX3dyaXRlX2J5dGVfdG9fZHBjZChkcCwKLQkJRFBDRF9BRERSX1RSQUlOSU5HX1BBVFRFUk5fU0VULAotCQlEUENEX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRUQpOworCQlEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKIH0KIAogc3RhdGljIHZvaWQgZXh5bm9zX2RwX3NldF9sYW5lX2xhbmVfcHJlX2VtcGhhc2lzKHN0cnVjdCBleHlub3NfZHBfZGV2aWNlICpkcCwKQEAgLTI5NSw3ICsyOTgsNyBAQAogCS8qIFNldHVwIFJYIGNvbmZpZ3VyYXRpb24gKi8KIAlidWZbMF0gPSBkcC0+bGlua190cmFpbi5saW5rX3JhdGU7CiAJYnVmWzFdID0gZHAtPmxpbmtfdHJhaW4ubGFuZV9jb3VudDsKLQlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZXNfdG9fZHBjZChkcCwgRFBDRF9BRERSX0xJTktfQldfU0VULAorCXJldHZhbCA9IGV4eW5vc19kcF93cml0ZV9ieXRlc190b19kcGNkKGRwLCBEUF9MSU5LX0JXX1NFVCwKIAkJCQkyLCBidWYpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0zMjIsMTYgKzMyNSwxNiBAQAogCiAJLyogU2V0IFJYIHRyYWluaW5nIHBhdHRlcm4gKi8KIAlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLAotCQkJRFBDRF9BRERSX1RSQUlOSU5HX1BBVFRFUk5fU0VULAotCQkJRFBDRF9TQ1JBTUJMSU5HX0RJU0FCTEVEIHwgRFBDRF9UUkFJTklOR19QQVRURVJOXzEpOworCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQlEUF9MSU5LX1NDUkFNQkxJTkdfRElTQUJMRSB8IERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAogCWZvciAobGFuZSA9IDA7IGxhbmUgPCBsYW5lX2NvdW50OyBsYW5lKyspCi0JCWJ1ZltsYW5lXSA9IERQQ0RfUFJFX0VNUEhBU0lTX1BBVFRFUk4yX0xFVkVMMCB8Ci0JCQkgICAgRFBDRF9WT0xUQUdFX1NXSU5HX1BBVFRFUk4xX0xFVkVMMDsKKwkJYnVmW2xhbmVdID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzAgfAorCQkJICAgIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNDAwOwogCi0JcmV0dmFsID0gZXh5bm9zX2RwX3dyaXRlX2J5dGVzX3RvX2RwY2QoZHAsIERQQ0RfQUREUl9UUkFJTklOR19MQU5FMF9TRVQsCisJcmV0dmFsID0gZXh5bm9zX2RwX3dyaXRlX2J5dGVzX3RvX2RwY2QoZHAsIERQX1RSQUlOSU5HX0xBTkUwX1NFVCwKIAkJCWxhbmVfY291bnQsIGJ1Zik7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMzUyLDcgKzM1NSw3IEBACiAKIAlmb3IgKGxhbmUgPSAwOyBsYW5lIDwgbGFuZV9jb3VudDsgbGFuZSsrKSB7CiAJCWxhbmVfc3RhdHVzID0gZXh5bm9zX2RwX2dldF9sYW5lX3N0YXR1cyhsaW5rX3N0YXR1cywgbGFuZSk7Ci0JCWlmICgobGFuZV9zdGF0dXMgJiBEUENEX0xBTkVfQ1JfRE9ORSkgPT0gMCkKKwkJaWYgKChsYW5lX3N0YXR1cyAmIERQX0xBTkVfQ1JfRE9ORSkgPT0gMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTM2NCwxMyArMzY3LDEzIEBACiAJaW50IGxhbmU7CiAJdTggbGFuZV9zdGF0dXM7CiAKLQlpZiAoKGxpbmtfYWxpZ24gJiBEUENEX0lOVEVSTEFORV9BTElHTl9ET05FKSA9PSAwKQorCWlmICgobGlua19hbGlnbiAmIERQX0lOVEVSTEFORV9BTElHTl9ET05FKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAobGFuZSA9IDA7IGxhbmUgPCBsYW5lX2NvdW50OyBsYW5lKyspIHsKIAkJbGFuZV9zdGF0dXMgPSBleHlub3NfZHBfZ2V0X2xhbmVfc3RhdHVzKGxpbmtfc3RhdHVzLCBsYW5lKTsKLQkJbGFuZV9zdGF0dXMgJj0gRFBDRF9DSEFOTkVMX0VRX0JJVFM7Ci0JCWlmIChsYW5lX3N0YXR1cyAhPSBEUENEX0NIQU5ORUxfRVFfQklUUykKKwkJbGFuZV9zdGF0dXMgJj0gRFBfQ0hBTk5FTF9FUV9CSVRTOworCQlpZiAobGFuZV9zdGF0dXMgIT0gRFBfQ0hBTk5FTF9FUV9CSVRTKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NjgsOSArNDcxLDkgQEAKIAkJCQlEUENEX1BSRV9FTVBIQVNJU19TRVQocHJlX2VtcGhhc2lzKTsKIAogCQlpZiAodm9sdGFnZV9zd2luZyA9PSBWT0xUQUdFX0xFVkVMXzMpCi0JCQl0cmFpbmluZ19sYW5lIHw9IERQQ0RfTUFYX1NXSU5HX1JFQUNIRUQ7CisJCQl0cmFpbmluZ19sYW5lIHw9IERQX1RSQUlOX01BWF9TV0lOR19SRUFDSEVEOwogCQlpZiAocHJlX2VtcGhhc2lzID09IFBSRV9FTVBIQVNJU19MRVZFTF8zKQotCQkJdHJhaW5pbmdfbGFuZSB8PSBEUENEX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKwkJCXRyYWluaW5nX2xhbmUgfD0gRFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEOwogCiAJCWRwLT5saW5rX3RyYWluLnRyYWluaW5nX2xhbmVbbGFuZV0gPSB0cmFpbmluZ19sYW5lOwogCX0KQEAgLTQ4NywxMiArNDkwLDEyIEBACiAJbGFuZV9jb3VudCA9IGRwLT5saW5rX3RyYWluLmxhbmVfY291bnQ7CiAKIAlyZXR2YWwgPSAgZXh5bm9zX2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkKGRwLAotCQkJRFBDRF9BRERSX0xBTkUwXzFfU1RBVFVTLCAyLCBsaW5rX3N0YXR1cyk7CisJCQlEUF9MQU5FMF8xX1NUQVRVUywgMiwgbGlua19zdGF0dXMpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKIAlyZXR2YWwgPSAgZXh5bm9zX2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkKGRwLAotCQkJRFBDRF9BRERSX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEsIDIsIGFkanVzdF9yZXF1ZXN0KTsKKwkJCURQX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEsIDIsIGFkanVzdF9yZXF1ZXN0KTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCkBAIC01MDEsOSArNTA0LDkgQEAKIAkJZXh5bm9zX2RwX3NldF90cmFpbmluZ19wYXR0ZXJuKGRwLCBUUkFJTklOR19QVE4yKTsKIAogCQlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZV90b19kcGNkKGRwLAotCQkJCURQQ0RfQUREUl9UUkFJTklOR19QQVRURVJOX1NFVCwKLQkJCQlEUENEX1NDUkFNQkxJTkdfRElTQUJMRUQgfAotCQkJCURQQ0RfVFJBSU5JTkdfUEFUVEVSTl8yKTsKKwkJCQlEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJCQlEUF9MSU5LX1NDUkFNQkxJTkdfRElTQUJMRSB8CisJCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl8yKTsKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAKQEAgLTU0Myw3ICs1NDYsNyBAQAogCQkJZHAtPmxpbmtfdHJhaW4udHJhaW5pbmdfbGFuZVtsYW5lXSwgbGFuZSk7CiAKIAlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZXNfdG9fZHBjZChkcCwKLQkJCURQQ0RfQUREUl9UUkFJTklOR19MQU5FMF9TRVQsIGxhbmVfY291bnQsCisJCQlEUF9UUkFJTklOR19MQU5FMF9TRVQsIGxhbmVfY291bnQsCiAJCQlkcC0+bGlua190cmFpbi50cmFpbmluZ19sYW5lKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNTYyLDcgKzU2NSw3IEBACiAJbGFuZV9jb3VudCA9IGRwLT5saW5rX3RyYWluLmxhbmVfY291bnQ7CiAKIAlyZXR2YWwgPSBleHlub3NfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2QoZHAsCi0JCQlEUENEX0FERFJfTEFORTBfMV9TVEFUVVMsIDIsIGxpbmtfc3RhdHVzKTsKKwkJCURQX0xBTkUwXzFfU1RBVFVTLCAyLCBsaW5rX3N0YXR1cyk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIApAQCAtNTcyLDEyICs1NzUsMTIgQEAKIAl9CiAKIAlyZXR2YWwgPSBleHlub3NfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2QoZHAsCi0JCQlEUENEX0FERFJfQURKVVNUX1JFUVVFU1RfTEFORTBfMSwgMiwgYWRqdXN0X3JlcXVlc3QpOworCQkJRFBfQURKVVNUX1JFUVVFU1RfTEFORTBfMSwgMiwgYWRqdXN0X3JlcXVlc3QpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKIAlyZXR2YWwgPSBleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwKLQkJCURQQ0RfQUREUl9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVELCAmbGlua19hbGlnbik7CisJCQlEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVELCAmbGlua19hbGlnbik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIApAQCAtNjE5LDcgKzYyMiw3IEBACiAJCWV4eW5vc19kcF9zZXRfbGFuZV9saW5rX3RyYWluaW5nKGRwLAogCQkJZHAtPmxpbmtfdHJhaW4udHJhaW5pbmdfbGFuZVtsYW5lXSwgbGFuZSk7CiAKLQlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZXNfdG9fZHBjZChkcCwgRFBDRF9BRERSX1RSQUlOSU5HX0xBTkUwX1NFVCwKKwlyZXR2YWwgPSBleHlub3NfZHBfd3JpdGVfYnl0ZXNfdG9fZHBjZChkcCwgRFBfVFJBSU5JTkdfTEFORTBfU0VULAogCQkJbGFuZV9jb3VudCwgZHAtPmxpbmtfdHJhaW4udHJhaW5pbmdfbGFuZSk7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNjM0LDcgKzYzNyw3IEBACiAJICogRm9yIERQIHJldi4xLjEsIE1heGltdW0gbGluayByYXRlIG9mIE1haW4gTGluayBsYW5lcwogCSAqIDB4MDYgPSAxLjYyIEdicHMsIDB4MGEgPSAyLjcgR2JwcwogCSAqLwotCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLCBEUENEX0FERFJfTUFYX0xJTktfUkFURSwgJmRhdGEpOworCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLCBEUF9NQVhfTElOS19SQVRFLCAmZGF0YSk7CiAJKmJhbmR3aWR0aCA9IGRhdGE7CiB9CiAKQEAgLTY0Nyw3ICs2NTAsNyBAQAogCSAqIEZvciBEUCByZXYuMS4xLCBNYXhpbXVtIG51bWJlciBvZiBNYWluIExpbmsgbGFuZXMKIAkgKiAweDAxID0gMSBsYW5lLCAweDAyID0gMiBsYW5lcywgMHgwNCA9IDQgbGFuZXMKIAkgKi8KLQlleHlub3NfZHBfcmVhZF9ieXRlX2Zyb21fZHBjZChkcCwgRFBDRF9BRERSX01BWF9MQU5FX0NPVU5ULCAmZGF0YSk7CisJZXh5bm9zX2RwX3JlYWRfYnl0ZV9mcm9tX2RwY2QoZHAsIERQX01BWF9MQU5FX0NPVU5ULCAmZGF0YSk7CiAJKmxhbmVfY291bnQgPSBEUENEX01BWF9MQU5FX0NPVU5UKGRhdGEpOwogfQogCkBAIC04MTksMjAgKzgyMiwyMCBAQAogCQlleHlub3NfZHBfZW5hYmxlX3NjcmFtYmxpbmcoZHApOwogCiAJCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLAotCQkJRFBDRF9BRERSX1RSQUlOSU5HX1BBVFRFUk5fU0VULAorCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCiAJCQkmZGF0YSk7CiAJCWV4eW5vc19kcF93cml0ZV9ieXRlX3RvX2RwY2QoZHAsCi0JCQlEUENEX0FERFJfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCi0JCQkodTgpKGRhdGEgJiB+RFBDRF9TQ1JBTUJMSU5HX0RJU0FCTEVEKSk7CisJCQlEUF9UUkFJTklOR19QQVRURVJOX1NFVCwKKwkJCSh1OCkoZGF0YSAmIH5EUF9MSU5LX1NDUkFNQkxJTkdfRElTQUJMRSkpOwogCX0gZWxzZSB7CiAJCWV4eW5vc19kcF9kaXNhYmxlX3NjcmFtYmxpbmcoZHApOwogCiAJCWV4eW5vc19kcF9yZWFkX2J5dGVfZnJvbV9kcGNkKGRwLAotCQkJRFBDRF9BRERSX1RSQUlOSU5HX1BBVFRFUk5fU0VULAorCQkJRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCiAJCQkmZGF0YSk7CiAJCWV4eW5vc19kcF93cml0ZV9ieXRlX3RvX2RwY2QoZHAsCi0JCQlEUENEX0FERFJfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCi0JCQkodTgpKGRhdGEgfCBEUENEX1NDUkFNQkxJTkdfRElTQUJMRUQpKTsKKwkJCURQX1RSQUlOSU5HX1BBVFRFUk5fU0VULAorCQkJKHU4KShkYXRhIHwgRFBfTElOS19TQ1JBTUJMSU5HX0RJU0FCTEUpKTsKIAl9CiB9CiAKQEAgLTk0OSwxMiArOTUyLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBleHlub3NfZHBfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0JcmV0dXJuIE1PREVfT0s7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4eW5vc19kcF9iZXN0X2VuY29kZXIoCiAJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewpAQCAtOTY1LDIwICs5NjIsOSBAQAogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGV4eW5vc19kcF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBleHlub3NfZHBfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gZXh5bm9zX2RwX21vZGVfdmFsaWQsCiAJLmJlc3RfZW5jb2RlciA9IGV4eW5vc19kcF9iZXN0X2VuY29kZXIsCiB9OwogCi1zdGF0aWMgaW50IGV4eW5vc19kcF9pbml0aWFsaXplKHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXksCi0JCQkJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYpCi17Ci0Jc3RydWN0IGV4eW5vc19kcF9kZXZpY2UgKmRwID0gZGlzcGxheS0+Y3R4OwotCi0JZHAtPmRybV9kZXYgPSBkcm1fZGV2OwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBib29sIGZpbmRfYnJpZGdlKGNvbnN0IGNoYXIgKmNvbXBhdCwgc3RydWN0IGJyaWRnZV9pbml0ICpicmlkZ2UpCiB7CiAJYnJpZGdlLT5jbGllbnQgPSBOVUxMOwpAQCAtMTEwMSwxMiArMTA4NywxMSBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQl9OworCX0KIAlkcC0+ZHBtc19tb2RlID0gbW9kZTsKIH0KIAogc3RhdGljIHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXlfb3BzIGV4eW5vc19kcF9kaXNwbGF5X29wcyA9IHsKLQkuaW5pdGlhbGl6ZSA9IGV4eW5vc19kcF9pbml0aWFsaXplLAogCS5jcmVhdGVfY29ubmVjdG9yID0gZXh5bm9zX2RwX2NyZWF0ZV9jb25uZWN0b3IsCiAJLmRwbXMgPSBleHlub3NfZHBfZHBtcywKIH07CkBAIC0xMTIzLDEwICsxMTA4LDggQEAKIAogCWRwX3ZpZGVvX2NvbmZpZyA9IGRldm1fa3phbGxvYyhkZXYsCiAJCQkJc2l6ZW9mKCpkcF92aWRlb19jb25maWcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRwX3ZpZGVvX2NvbmZpZykgewotCQlkZXZfZXJyKGRldiwgIm1lbW9yeSBhbGxvY2F0aW9uIGZvciB2aWRlbyBjb25maWcgZmFpbGVkXG4iKTsKKwlpZiAoIWRwX3ZpZGVvX2NvbmZpZykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQogCiAJZHBfdmlkZW9fY29uZmlnLT5oX3N5bmNfcG9sYXJpdHkgPQogCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZHBfbm9kZSwgImhzeW5jLWFjdGl2ZS1oaWdoIik7CkBAIC0xMTg1LDEwICsxMTY4LDcgQEAKIAlkcF9waHlfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRwX3BoeV9ub2RlLCAiZHB0eC1waHkiKTsKIAlpZiAoIWRwX3BoeV9ub2RlKSB7CiAJCWRwLT5waHkgPSBkZXZtX3BoeV9nZXQoZHAtPmRldiwgImRwIik7Ci0JCWlmIChJU19FUlIoZHAtPnBoeSkpCi0JCQlyZXR1cm4gUFRSX0VSUihkcC0+cGh5KTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7CisJCXJldHVybiBQVFJfRVJSX09SX1pFUk8oZHAtPnBoeSk7CiAJfQogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRwX3BoeV9ub2RlLCAicmVnIiwgJnBoeV9iYXNlKSkgewpAQCAtMTIzMCwxOSArMTIxMCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBleHlub3NfZHBfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBleHlub3NfZHBfZGV2aWNlICpkcDsKKwl1bnNpZ25lZCBpbnQgaXJxX2ZsYWdzOwogCiAJaW50IHJldCA9IDA7CiAKIAlkcCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGV4eW5vc19kcF9kZXZpY2UpLAogCQkJCUdGUF9LRVJORUwpOwotCWlmICghZHApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtb3J5IGZvciBkZXZpY2UgZGF0YVxuIik7CisJaWYgKCFkcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZHAtPmRldiA9ICZwZGV2LT5kZXY7CiAJZHAtPmRwbXNfbW9kZSA9IERSTV9NT0RFX0RQTVNfT0ZGOwpAQCAtMTI3Myw3ICsxMjU0LDMwIEBACiAJaWYgKElTX0VSUihkcC0+cmVnX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihkcC0+cmVnX2Jhc2UpOwogCi0JZHAtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZHAtPmhwZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8oZGV2LT5vZl9ub2RlLCAic2Ftc3VuZyxocGQtZ3BpbyIsIDApOworCisJaWYgKGdwaW9faXNfdmFsaWQoZHAtPmhwZF9ncGlvKSkgeworCQkvKgorCQkgKiBTZXQgdXAgdGhlIGhvdHBsdWcgR1BJTyBmcm9tIHRoZSBkZXZpY2UgdHJlZSBhcyBhbiBpbnRlcnJ1cHQuCisJCSAqIFNpbXBseSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IGludGVycnVwdCBpbiB0aGUgZGV2aWNlIHRyZWUKKwkJICogZG9lc24ndCB3b3JrIHNpbmNlIHdlIGhhbmRsZSBob3RwbHVnIHJhdGhlciBkaWZmZXJlbnRseSB3aGVuCisJCSAqIHVzaW5nIGEgR1BJTy4gIFdlIGFsc28gbmVlZCB0aGUgYWN0dWFsIEdQSU8gc3BlY2lmaWVyIHNvCisJCSAqIHRoYXQgd2UgY2FuIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgR1BJTy4KKwkJICovCisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LCBkcC0+aHBkX2dwaW8sIEdQSU9GX0lOLAorCQkJCQkgICAgImhwZF9ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaHBkIGdwaW9cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkcC0+aXJxID0gZ3Bpb190b19pcnEoZHAtPmhwZF9ncGlvKTsKKwkJaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HOworCX0gZWxzZSB7CisJCWRwLT5ocGRfZ3BpbyA9IC1FTk9ERVY7CisJCWRwLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCQlpcnFfZmxhZ3MgPSAwOworCX0KKwogCWlmIChkcC0+aXJxID09IC1FTlhJTykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI4NSwyOCArMTI4OSw2MSBAQAogCiAJZXh5bm9zX2RwX2luaXRfZHAoZHApOwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBkcC0+aXJxLCBleHlub3NfZHBfaXJxX2hhbmRsZXIsIDAsCi0JCQkJImV4eW5vcy1kcCIsIGRwKTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGRwLT5pcnEsIGV4eW5vc19kcF9pcnFfaGFuZGxlciwKKwkJCWlycV9mbGFncywgImV4eW5vcy1kcCIsIGRwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCWRpc2FibGVfaXJxKGRwLT5pcnEpOwogCisJZHAtPmRybV9kZXYgPSBkcm1fZGV2OwogCWV4eW5vc19kcF9kaXNwbGF5LmN0eCA9IGRwOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJmV4eW5vc19kcF9kaXNwbGF5KTsKLQlleHlub3NfZHJtX2Rpc3BsYXlfcmVnaXN0ZXIoJmV4eW5vc19kcF9kaXNwbGF5KTsKIAotCXJldHVybiAwOworCXJldHVybiBleHlub3NfZHJtX2NyZWF0ZV9lbmNfY29ubihkcm1fZGV2LCAmZXh5bm9zX2RwX2Rpc3BsYXkpOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHBfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCQkJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBleHlub3NfZHBfZGV2aWNlICpkcCA9IGRpc3BsYXktPmN0eDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSBkcC0+ZW5jb2RlcjsKKworCWV4eW5vc19kcF9kcG1zKGRpc3BsYXksIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCWVuY29kZXItPmZ1bmNzLT5kZXN0cm95KGVuY29kZXIpOworCWRybV9jb25uZWN0b3JfY2xlYW51cCgmZHAtPmNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBleHlub3NfZHBfb3BzID0geworCS5iaW5kCT0gZXh5bm9zX2RwX2JpbmQsCisJLnVuYmluZAk9IGV4eW5vc19kcF91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGV4eW5vc19kcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBleHlub3NfZHJtX2NvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUiwKKwkJCQkJZXh5bm9zX2RwX2Rpc3BsYXkudHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmV4eW5vc19kcF9vcHMpOworCWlmIChyZXQpCisJCWV4eW5vc19kcm1fY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LAorCQkJCQkJRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGV4eW5vc19kcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlleHlub3NfZHBfZHBtcyhkaXNwbGF5LCBEUk1fTU9ERV9EUE1TX09GRik7Ci0JZXh5bm9zX2RybV9kaXNwbGF5X3VucmVnaXN0ZXIoJmV4eW5vc19kcF9kaXNwbGF5KTsKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZleHlub3NfZHBfb3BzKTsKKwlleHlub3NfZHJtX2NvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RwX2NvcmUuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RwX2NvcmUuaAppbmRleCBkNmE5MDBkLi4wMmNjNGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcF9jb3JlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHBfY29yZS5oCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIF9FWFlOT1NfRFBfQ09SRV9ICiAKICNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9leHlub3NfZHJtLmg+CiAKICNkZWZpbmUgRFBfVElNRU9VVF9MT09QX0NPVU5UIDEwMApAQCAtMTU5LDYgKzE2MCw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0CWhvdHBsdWdfd29yazsKIAlzdHJ1Y3QgcGh5CQkqcGh5OwogCWludAkJCWRwbXNfbW9kZTsKKwlpbnQJCQlocGRfZ3BpbzsKIAogCXN0cnVjdCBleHlub3NfZHJtX3BhbmVsX2luZm8gcGFuZWw7CiB9OwpAQCAtMjYxLDY5ICsyNjMsMTcgQEAKICNkZWZpbmUgRURJRF9FWFRFTlNJT05fRkxBRwkJCTB4N2UKICNkZWZpbmUgRURJRF9DSEVDS1NVTQkJCQkweDdmCiAKLS8qIERlZmluaXRpb24gZm9yIERQQ0QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRFBDRF9BRERSX0RQQ0RfUkVWCQkJMHgwMDAwCi0jZGVmaW5lIERQQ0RfQUREUl9NQVhfTElOS19SQVRFCQkJMHgwMDAxCi0jZGVmaW5lIERQQ0RfQUREUl9NQVhfTEFORV9DT1VOVAkJMHgwMDAyCi0jZGVmaW5lIERQQ0RfQUREUl9MSU5LX0JXX1NFVAkJCTB4MDEwMAotI2RlZmluZSBEUENEX0FERFJfTEFORV9DT1VOVF9TRVQJCTB4MDEwMQotI2RlZmluZSBEUENEX0FERFJfVFJBSU5JTkdfUEFUVEVSTl9TRVQJCTB4MDEwMgotI2RlZmluZSBEUENEX0FERFJfVFJBSU5JTkdfTEFORTBfU0VUCQkweDAxMDMKLSNkZWZpbmUgRFBDRF9BRERSX0xBTkUwXzFfU1RBVFVTCQkweDAyMDIKLSNkZWZpbmUgRFBDRF9BRERSX0xBTkVfQUxJR05fU1RBVFVTX1VQREFURUQJMHgwMjA0Ci0jZGVmaW5lIERQQ0RfQUREUl9BREpVU1RfUkVRVUVTVF9MQU5FMF8xCTB4MDIwNgotI2RlZmluZSBEUENEX0FERFJfQURKVVNUX1JFUVVFU1RfTEFORTJfMwkweDAyMDcKLSNkZWZpbmUgRFBDRF9BRERSX1RFU1RfUkVRVUVTVAkJCTB4MDIxOAotI2RlZmluZSBEUENEX0FERFJfVEVTVF9SRVNQT05TRQkJCTB4MDI2MAotI2RlZmluZSBEUENEX0FERFJfVEVTVF9FRElEX0NIRUNLU1VNCQkweDAyNjEKLSNkZWZpbmUgRFBDRF9BRERSX1NJTktfUE9XRVJfU1RBVEUJCTB4MDYwMAotCi0vKiBEUENEX0FERFJfTUFYX0xBTkVfQ09VTlQgKi8KKy8qIERQX01BWF9MQU5FX0NPVU5UICovCiAjZGVmaW5lIERQQ0RfRU5IQU5DRURfRlJBTUVfQ0FQKHgpCQkoKCh4KSA+PiA3KSAmIDB4MSkKICNkZWZpbmUgRFBDRF9NQVhfTEFORV9DT1VOVCh4KQkJCSgoeCkgJiAweDFmKQogCi0vKiBEUENEX0FERFJfTEFORV9DT1VOVF9TRVQgKi8KLSNkZWZpbmUgRFBDRF9FTkhBTkNFRF9GUkFNRV9FTgkJCSgweDEgPDwgNykKKy8qIERQX0xBTkVfQ09VTlRfU0VUICovCiAjZGVmaW5lIERQQ0RfTEFORV9DT1VOVF9TRVQoeCkJCQkoKHgpICYgMHgxZikKIAotLyogRFBDRF9BRERSX1RSQUlOSU5HX1BBVFRFUk5fU0VUICovCi0jZGVmaW5lIERQQ0RfU0NSQU1CTElOR19ESVNBQkxFRAkJKDB4MSA8PCA1KQotI2RlZmluZSBEUENEX1NDUkFNQkxJTkdfRU5BQkxFRAkJCSgweDAgPDwgNSkKLSNkZWZpbmUgRFBDRF9UUkFJTklOR19QQVRURVJOXzIJCQkoMHgyIDw8IDApCi0jZGVmaW5lIERQQ0RfVFJBSU5JTkdfUEFUVEVSTl8xCQkJKDB4MSA8PCAwKQotI2RlZmluZSBEUENEX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRUQJCSgweDAgPDwgMCkKLQotLyogRFBDRF9BRERSX1RSQUlOSU5HX0xBTkUwX1NFVCAqLwotI2RlZmluZSBEUENEX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRAkJKDB4MSA8PCA1KQorLyogRFBfVFJBSU5JTkdfTEFORTBfU0VUICovCiAjZGVmaW5lIERQQ0RfUFJFX0VNUEhBU0lTX1NFVCh4KQkJKCgoeCkgJiAweDMpIDw8IDMpCiAjZGVmaW5lIERQQ0RfUFJFX0VNUEhBU0lTX0dFVCh4KQkJKCgoeCkgPj4gMykgJiAweDMpCi0jZGVmaW5lIERQQ0RfUFJFX0VNUEhBU0lTX1BBVFRFUk4yX0xFVkVMMAkoMHgwIDw8IDMpCi0jZGVmaW5lIERQQ0RfTUFYX1NXSU5HX1JFQUNIRUQJCQkoMHgxIDw8IDIpCiAjZGVmaW5lIERQQ0RfVk9MVEFHRV9TV0lOR19TRVQoeCkJCSgoKHgpICYgMHgzKSA8PCAwKQogI2RlZmluZSBEUENEX1ZPTFRBR0VfU1dJTkdfR0VUKHgpCQkoKCh4KSA+PiAwKSAmIDB4MykKLSNkZWZpbmUgRFBDRF9WT0xUQUdFX1NXSU5HX1BBVFRFUk4xX0xFVkVMMAkoMHgwIDw8IDApCi0KLS8qIERQQ0RfQUREUl9MQU5FMF8xX1NUQVRVUyAqLwotI2RlZmluZSBEUENEX0xBTkVfU1lNQk9MX0xPQ0tFRAkJCSgweDEgPDwgMikKLSNkZWZpbmUgRFBDRF9MQU5FX0NIQU5ORUxfRVFfRE9ORQkJKDB4MSA8PCAxKQotI2RlZmluZSBEUENEX0xBTkVfQ1JfRE9ORQkJCSgweDEgPDwgMCkKLSNkZWZpbmUgRFBDRF9DSEFOTkVMX0VRX0JJVFMJCQkoRFBDRF9MQU5FX0NSX0RPTkV8CVwKLQkJCQkJCSBEUENEX0xBTkVfQ0hBTk5FTF9FUV9ET05FfFwKLQkJCQkJCSBEUENEX0xBTkVfU1lNQk9MX0xPQ0tFRCkKLQotLyogRFBDRF9BRERSX0xBTkVfQUxJR05fX1NUQVRVU19VUERBVEVEICovCi0jZGVmaW5lIERQQ0RfTElOS19TVEFUVVNfVVBEQVRFRAkJKDB4MSA8PCA3KQotI2RlZmluZSBEUENEX0RPV05TVFJFQU1fUE9SVF9TVEFUVVNfQ0hBTkdFRAkoMHgxIDw8IDYpCi0jZGVmaW5lIERQQ0RfSU5URVJMQU5FX0FMSUdOX0RPTkUJCSgweDEgPDwgMCkKLQotLyogRFBDRF9BRERSX1RFU1RfUkVRVUVTVCAqLwotI2RlZmluZSBEUENEX1RFU1RfRURJRF9SRUFECQkJKDB4MSA8PCAyKQotCi0vKiBEUENEX0FERFJfVEVTVF9SRVNQT05TRSAqLwotI2RlZmluZSBEUENEX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURQkJKDB4MSA8PCAyKQotCi0vKiBEUENEX0FERFJfU0lOS19QT1dFUl9TVEFURSAqLwotI2RlZmluZSBEUENEX1NFVF9QT1dFUl9TVEFURV9EMAkJCSgweDEgPDwgMCkKLSNkZWZpbmUgRFBDRF9TRVRfUE9XRVJfU1RBVEVfRDQJCQkoMHgyIDw8IDApCiAKICNlbmRpZiAvKiBfRVhZTk9TX0RQX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHBfcmVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcF9yZWcuYwppbmRleCBiNzBkYTUwLi5jMWY4N2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcF9yZWcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcF9yZWcuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlICJleHlub3NfZHBfY29yZS5oIgogI2luY2x1ZGUgImV4eW5vc19kcF9yZWcuaCIKQEAgLTMyNiw2ICszMjcsOSBAQAogewogCXUzMiByZWc7CiAKKwlpZiAoZ3Bpb19pc192YWxpZChkcC0+aHBkX2dwaW8pKQorCQlyZXR1cm47CisKIAlyZWcgPSBIT1RQTFVHX0NIRyB8IEhQRF9MT1NUIHwgUExVRzsKIAl3cml0ZWwocmVnLCBkcC0+cmVnX2Jhc2UgKyBFWFlOT1NfRFBfQ09NTU9OX0lOVF9TVEFfNCk7CiAKQEAgLTMzNyw2ICszNDEsOSBAQAogewogCXUzMiByZWc7CiAKKwlpZiAoZ3Bpb19pc192YWxpZChkcC0+aHBkX2dwaW8pKQorCQlyZXR1cm47CisKIAlleHlub3NfZHBfY2xlYXJfaG90cGx1Z19pbnRlcnJ1cHRzKGRwKTsKIAogCXJlZyA9IHJlYWRsKGRwLT5yZWdfYmFzZSArIEVYWU5PU19EUF9TWVNfQ1RMXzMpOwpAQCAtMzQ4LDE5ICszNTUsMjcgQEAKIHsKIAl1MzIgcmVnOwogCi0JLyogUGFyc2UgaG90cGx1ZyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0JcmVnID0gcmVhZGwoZHAtPnJlZ19iYXNlICsgRVhZTk9TX0RQX0NPTU1PTl9JTlRfU1RBXzQpOworCWlmIChncGlvX2lzX3ZhbGlkKGRwLT5ocGRfZ3BpbykpIHsKKwkJcmVnID0gZ3Bpb19nZXRfdmFsdWUoZHAtPmhwZF9ncGlvKTsKKwkJaWYgKHJlZykKKwkJCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DQUJMRV9JTjsKKwkJZWxzZQorCQkJcmV0dXJuIERQX0lSUV9UWVBFX0hQX0NBQkxFX09VVDsKKwl9IGVsc2UgeworCQkvKiBQYXJzZSBob3RwbHVnIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJcmVnID0gcmVhZGwoZHAtPnJlZ19iYXNlICsgRVhZTk9TX0RQX0NPTU1PTl9JTlRfU1RBXzQpOwogCi0JaWYgKHJlZyAmIFBMVUcpCi0JCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DQUJMRV9JTjsKKwkJaWYgKHJlZyAmIFBMVUcpCisJCQlyZXR1cm4gRFBfSVJRX1RZUEVfSFBfQ0FCTEVfSU47CiAKLQlpZiAocmVnICYgSFBEX0xPU1QpCi0JCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DQUJMRV9PVVQ7CisJCWlmIChyZWcgJiBIUERfTE9TVCkKKwkJCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DQUJMRV9PVVQ7CiAKLQlpZiAocmVnICYgSE9UUExVR19DSEcpCi0JCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DSEFOR0U7CisJCWlmIChyZWcgJiBIT1RQTFVHX0NIRykKKwkJCXJldHVybiBEUF9JUlFfVFlQRV9IUF9DSEFOR0U7CiAKLQlyZXR1cm4gRFBfSVJRX1RZUEVfVU5LTk9XTjsKKwkJcmV0dXJuIERQX0lSUV9UWVBFX1VOS05PV047CisJfQogfQogCiB2b2lkIGV4eW5vc19kcF9yZXNldF9hdXgoc3RydWN0IGV4eW5vc19kcF9kZXZpY2UgKmRwKQpAQCAtMzg2LDcgKzQwMSw3IEBACiAJLyogRGlzYWJsZSBBVVggdHJhbnNhY3Rpb24gSC9XIHJldHJ5ICovCiAJcmVnID0gQVVYX0JJVF9QRVJJT0RfRVhQRUNURURfREVMQVkoMykgfCBBVVhfSFdfUkVUUllfQ09VTlRfU0VMKDApfAogCQlBVVhfSFdfUkVUUllfSU5URVJWQUxfNjAwX01JQ1JPU0VDT05EUzsKLQl3cml0ZWwocmVnLCBkcC0+cmVnX2Jhc2UgKyBFWFlOT1NfRFBfQVVYX0hXX1JFVFJZX0NUTCkgOworCXdyaXRlbChyZWcsIGRwLT5yZWdfYmFzZSArIEVYWU5PU19EUF9BVVhfSFdfUkVUUllfQ1RMKTsKIAogCS8qIFJlY2VpdmUgQVVYIENoYW5uZWwgREVGRVIgY29tbWFuZHMgZXF1YWwgdG8gREVGRkVSX0NPVU5UKjY0ICovCiAJcmVnID0gREVGRVJfQ1RSTF9FTiB8IERFRkVSX0NPVU5UKDEpOwpAQCAtNDAyLDkgKzQxNywxNCBAQAogewogCXUzMiByZWc7CiAKLQlyZWcgPSByZWFkbChkcC0+cmVnX2Jhc2UgKyBFWFlOT1NfRFBfU1lTX0NUTF8zKTsKLQlpZiAocmVnICYgSFBEX1NUQVRVUykKLQkJcmV0dXJuIDA7CisJaWYgKGdwaW9faXNfdmFsaWQoZHAtPmhwZF9ncGlvKSkgeworCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZHAtPmhwZF9ncGlvKSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJlZyA9IHJlYWRsKGRwLT5yZWdfYmFzZSArIEVYWU5PU19EUF9TWVNfQ1RMXzMpOworCQlpZiAocmVnICYgSFBEX1NUQVRVUykKKwkJCXJldHVybiAwOworCX0KIAogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb3JlLmMKaW5kZXggMGU5ZTA2Yy4uNGM5Zjk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NvcmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29yZS5jCkBAIC0xOSwyMSArMTksMTkgQEAKICNpbmNsdWRlICJleHlub3NfZHJtX2ZiZGV2LmgiCiAKIHN0YXRpYyBMSVNUX0hFQUQoZXh5bm9zX2RybV9zdWJkcnZfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGV4eW5vc19kcm1fbWFuYWdlcl9saXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoZXh5bm9zX2RybV9kaXNwbGF5X2xpc3QpOwogCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fY3JlYXRlX2VuY19jb25uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCitpbnQgZXh5bm9zX2RybV9jcmVhdGVfZW5jX2Nvbm4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSkKIHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0Jc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlcjsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgcG9zc2libGVfY3J0Y3MgPSAwOwogCi0JLyogRmluZCBwb3NzaWJsZSBjcnRjcyBmb3IgdGhpcyBkaXNwbGF5ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtYW5hZ2VyLCAmZXh5bm9zX2RybV9tYW5hZ2VyX2xpc3QsIGxpc3QpCi0JCWlmIChtYW5hZ2VyLT50eXBlID09IGRpc3BsYXktPnR5cGUpCi0JCQlwb3NzaWJsZV9jcnRjcyB8PSAxIDw8IG1hbmFnZXItPnBpcGU7CisJcmV0ID0gZXh5bm9zX2RybV9jcnRjX2dldF9waXBlX2Zyb21fdHlwZShkZXYsIGRpc3BsYXktPnR5cGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcG9zc2libGVfY3J0Y3MgfD0gMSA8PCByZXQ7CiAKIAkvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBlbmNvZGVyIGZvciB0aGlzIHN1YiBkcml2ZXIuICovCiAJZW5jb2RlciA9IGV4eW5vc19kcm1fZW5jb2Rlcl9jcmVhdGUoZGV2LCBkaXNwbGF5LCBwb3NzaWJsZV9jcnRjcyk7CkBAIC01NywxOTYgKzU1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fc3ViZHJ2X3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2KQotewotCWlmIChzdWJkcnYtPnByb2JlKSB7Ci0JCWludCByZXQ7Ci0KLQkJc3ViZHJ2LT5kcm1fZGV2ID0gZGV2OwotCi0JCS8qCi0JCSAqIHRoaXMgcHJvYmUgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGJ5IHN1YiBkcml2ZXIKLQkJICogYWZ0ZXIgc2V0dGluZyBvZiBhbGwgcmVzb3VyY2VzIHRvIHRoaXMgc3ViIGRyaXZlciwKLQkJICogc3VjaCBhcyBjbG9jaywgaXJxIGFuZCByZWdpc3RlciBtYXAgYXJlIGRvbmUgb3IgYnkgbG9hZCgpCi0JCSAqIG9mIGV4eW5vcyBkcm0gZHJpdmVyLgotCQkgKgotCQkgKiBQLlMuIG5vdGUgdGhhdCB0aGlzIGRyaXZlciBpcyBjb25zaWRlcmVkIGZvciBtb2R1bGFyaXphdGlvbi4KLQkJICovCi0JCXJldCA9IHN1YmRydi0+cHJvYmUoZGV2LCBzdWJkcnYtPmRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3NfZHJtX3N1YmRydl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydikKLXsKLQlpZiAoc3ViZHJ2LT5yZW1vdmUpCi0JCXN1YmRydi0+cmVtb3ZlKGRldiwgc3ViZHJ2LT5kZXYpOwotfQotCi1pbnQgZXh5bm9zX2RybV9pbml0aWFsaXplX21hbmFnZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciwgKm47Ci0JaW50IHJldCwgcGlwZSA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hbmFnZXIsICZleHlub3NfZHJtX21hbmFnZXJfbGlzdCwgbGlzdCkgewotCQlpZiAobWFuYWdlci0+b3BzLT5pbml0aWFsaXplKSB7Ci0JCQlyZXQgPSBtYW5hZ2VyLT5vcHMtPmluaXRpYWxpemUobWFuYWdlciwgZGV2LCBwaXBlKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlEUk1fRVJST1IoIk1nciBpbml0IFslZF0gZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJCQltYW5hZ2VyLT50eXBlLCByZXQpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0KLQkJbWFuYWdlci0+ZHJtX2RldiA9IGRldjsKLQkJbWFuYWdlci0+cGlwZSA9IHBpcGUrKzsKLQotCQlyZXQgPSBleHlub3NfZHJtX2NydGNfY3JlYXRlKG1hbmFnZXIpOwotCQlpZiAocmV0KSB7Ci0JCQlEUk1fRVJST1IoIkNSVEMgY3JlYXRlIFslZF0gZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJCW1hbmFnZXItPnR5cGUsIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLQotZXJyOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtYW5hZ2VyLCBuLCAmZXh5bm9zX2RybV9tYW5hZ2VyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHBpcGUtLSA+IDApCi0JCQlleHlub3NfZHJtX21hbmFnZXJfdW5yZWdpc3RlcihtYW5hZ2VyKTsKLQkJZWxzZQotCQkJbGlzdF9kZWwoJm1hbmFnZXItPmxpc3QpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGV4eW5vc19kcm1fcmVtb3ZlX21hbmFnZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciwgKm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWFuYWdlciwgbiwgJmV4eW5vc19kcm1fbWFuYWdlcl9saXN0LCBsaXN0KQotCQlleHlub3NfZHJtX21hbmFnZXJfdW5yZWdpc3RlcihtYW5hZ2VyKTsKLX0KLQotaW50IGV4eW5vc19kcm1faW5pdGlhbGl6ZV9kaXNwbGF5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXksICpuOwotCWludCByZXQsIGluaXRpYWxpemVkID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGlzcGxheSwgJmV4eW5vc19kcm1fZGlzcGxheV9saXN0LCBsaXN0KSB7Ci0JCWlmIChkaXNwbGF5LT5vcHMtPmluaXRpYWxpemUpIHsKLQkJCXJldCA9IGRpc3BsYXktPm9wcy0+aW5pdGlhbGl6ZShkaXNwbGF5LCBkZXYpOwotCQkJaWYgKHJldCkgewotCQkJCURSTV9FUlJPUigiRGlzcGxheSBpbml0IFslZF0gZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJCQlkaXNwbGF5LT50eXBlLCByZXQpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0KLQkJaW5pdGlhbGl6ZWQrKzsKLQotCQlyZXQgPSBleHlub3NfZHJtX2NyZWF0ZV9lbmNfY29ubihkZXYsIGRpc3BsYXkpOwotCQlpZiAocmV0KSB7Ci0JCQlEUk1fRVJST1IoIkVuY29kZXIgY3JlYXRlIFslZF0gZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJCWRpc3BsYXktPnR5cGUsIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLQotZXJyOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkaXNwbGF5LCBuLCAmZXh5bm9zX2RybV9kaXNwbGF5X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGluaXRpYWxpemVkLS0gPiAwKQotCQkJZXh5bm9zX2RybV9kaXNwbGF5X3VucmVnaXN0ZXIoZGlzcGxheSk7Ci0JCWVsc2UKLQkJCWxpc3RfZGVsKCZkaXNwbGF5LT5saXN0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBleHlub3NfZHJtX3JlbW92ZV9kaXNwbGF5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXksICpuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRpc3BsYXksIG4sICZleHlub3NfZHJtX2Rpc3BsYXlfbGlzdCwgbGlzdCkKLQkJZXh5bm9zX2RybV9kaXNwbGF5X3VucmVnaXN0ZXIoZGlzcGxheSk7Ci19Ci0KLWludCBleHlub3NfZHJtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2LCAqbjsKLQlpbnQgZXJyOwotCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN1YmRydiwgbiwgJmV4eW5vc19kcm1fc3ViZHJ2X2xpc3QsIGxpc3QpIHsKLQkJZXJyID0gZXh5bm9zX2RybV9zdWJkcnZfcHJvYmUoZGV2LCBzdWJkcnYpOwotCQlpZiAoZXJyKSB7Ci0JCQlEUk1fREVCVUcoImV4eW5vcyBkcm0gc3ViZHJ2IHByb2JlIGZhaWxlZC5cbiIpOwotCQkJbGlzdF9kZWwoJnN1YmRydi0+bGlzdCk7Ci0JCQljb250aW51ZTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9kZXZpY2VfcmVnaXN0ZXIpOwotCi1pbnQgZXh5bm9zX2RybV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2OwotCi0JaWYgKCFkZXYpIHsKLQkJV0FSTigxLCAiVW5leHBlY3RlZCBkcm0gZGV2aWNlIHVucmVnaXN0ZXIhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJkcnYsICZleHlub3NfZHJtX3N1YmRydl9saXN0LCBsaXN0KSB7Ci0JCWV4eW5vc19kcm1fc3ViZHJ2X3JlbW92ZShkZXYsIHN1YmRydik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChleHlub3NfZHJtX2RldmljZV91bnJlZ2lzdGVyKTsKLQotaW50IGV4eW5vc19kcm1fbWFuYWdlcl9yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyKQotewotCUJVR19PTighbWFuYWdlci0+b3BzKTsKLQlsaXN0X2FkZF90YWlsKCZtYW5hZ2VyLT5saXN0LCAmZXh5bm9zX2RybV9tYW5hZ2VyX2xpc3QpOwotCXJldHVybiAwOwotfQotCi1pbnQgZXh5bm9zX2RybV9tYW5hZ2VyX3VucmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlcikKLXsKLQlpZiAobWFuYWdlci0+b3BzLT5yZW1vdmUpCi0JCW1hbmFnZXItPm9wcy0+cmVtb3ZlKG1hbmFnZXIpOwotCi0JbGlzdF9kZWwoJm1hbmFnZXItPmxpc3QpOwotCXJldHVybiAwOwotfQotCi1pbnQgZXh5bm9zX2RybV9kaXNwbGF5X3JlZ2lzdGVyKHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0JQlVHX09OKCFkaXNwbGF5LT5vcHMpOwotCWxpc3RfYWRkX3RhaWwoJmRpc3BsYXktPmxpc3QsICZleHlub3NfZHJtX2Rpc3BsYXlfbGlzdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBleHlub3NfZHJtX2Rpc3BsYXlfdW5yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5KQotewotCWlmIChkaXNwbGF5LT5vcHMtPnJlbW92ZSkKLQkJZGlzcGxheS0+b3BzLT5yZW1vdmUoZGlzcGxheSk7Ci0KLQlsaXN0X2RlbCgmZGlzcGxheS0+bGlzdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBleHlub3NfZHJtX3N1YmRydl9yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydikKIHsKIAlpZiAoIXN1YmRydikKQEAgLTI2OSw2ICs3Nyw1NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9zdWJkcnZfdW5yZWdpc3Rlcik7CiAKK2ludCBleHlub3NfZHJtX2RldmljZV9zdWJkcnZfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydiwgKm47CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWJkcnYsIG4sICZleHlub3NfZHJtX3N1YmRydl9saXN0LCBsaXN0KSB7CisJCWlmIChzdWJkcnYtPnByb2JlKSB7CisJCQlzdWJkcnYtPmRybV9kZXYgPSBkZXY7CisKKwkJCS8qCisJCQkgKiB0aGlzIHByb2JlIGNhbGxiYWNrIHdvdWxkIGJlIGNhbGxlZCBieSBzdWIgZHJpdmVyCisJCQkgKiBhZnRlciBzZXR0aW5nIG9mIGFsbCByZXNvdXJjZXMgdG8gdGhpcyBzdWIgZHJpdmVyLAorCQkJICogc3VjaCBhcyBjbG9jaywgaXJxIGFuZCByZWdpc3RlciBtYXAgYXJlIGRvbmUuCisJCQkgKi8KKwkJCWVyciA9IHN1YmRydi0+cHJvYmUoZGV2LCBzdWJkcnYtPmRldik7CisJCQlpZiAoZXJyKSB7CisJCQkJRFJNX0RFQlVHKCJleHlub3MgZHJtIHN1YmRydiBwcm9iZSBmYWlsZWQuXG4iKTsKKwkJCQlsaXN0X2RlbCgmc3ViZHJ2LT5saXN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9kZXZpY2Vfc3ViZHJ2X3Byb2JlKTsKKworaW50IGV4eW5vc19kcm1fZGV2aWNlX3N1YmRydl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydjsKKworCWlmICghZGV2KSB7CisJCVdBUk4oMSwgIlVuZXhwZWN0ZWQgZHJtIGRldmljZSB1bnJlZ2lzdGVyIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ViZHJ2LCAmZXh5bm9zX2RybV9zdWJkcnZfbGlzdCwgbGlzdCkgeworCQlpZiAoc3ViZHJ2LT5yZW1vdmUpCisJCQlzdWJkcnYtPnJlbW92ZShkZXYsIHN1YmRydi0+ZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4eW5vc19kcm1fZGV2aWNlX3N1YmRydl9yZW1vdmUpOworCiBpbnQgZXh5bm9zX2RybV9zdWJkcnZfb3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuYwppbmRleCAxZWY1YWI5Li45NWM5NDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmMKQEAgLTM2OCw2ICszNjgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwltYW5hZ2VyLT5jcnRjID0gJmV4eW5vc19jcnRjLT5kcm1fY3J0YzsKIAljcnRjID0gJmV4eW5vc19jcnRjLT5kcm1fY3J0YzsKIAogCXByaXZhdGUtPmNydGNbbWFuYWdlci0+cGlwZV0gPSBjcnRjOwpAQCAtNDkxLDMgKzQ5MiwxOSBAQAogCQkJbWFuYWdlci0+b3BzLT53YWl0X2Zvcl92YmxhbmsobWFuYWdlcik7CiAJfQogfQorCitpbnQgZXh5bm9zX2RybV9jcnRjX2dldF9waXBlX2Zyb21fdHlwZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiwKKwkJCQkJdW5zaWduZWQgaW50IG91dF90eXBlKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRybV9kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YzsKKworCQlleHlub3NfY3J0YyA9IHRvX2V4eW5vc19jcnRjKGNydGMpOworCQlpZiAoZXh5bm9zX2NydGMtPm1hbmFnZXItPnR5cGUgPT0gb3V0X3R5cGUpCisJCQlyZXR1cm4gZXh5bm9zX2NydGMtPm1hbmFnZXItPnBpcGU7CisJfQorCisJcmV0dXJuIC1FUEVSTTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY3J0Yy5oCmluZGV4IGMyN2I2NmMuLjlmNzRiMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuaApAQCAtMzIsNCArMzIsOCBAQAogdm9pZCBleHlub3NfZHJtX2NydGNfcGxhbmVfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHpwb3MpOwogdm9pZCBleHlub3NfZHJtX2NydGNfcGxhbmVfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB6cG9zKTsKIAorLyogVGhpcyBmdW5jdGlvbiBnZXRzIHBpcGUgdmFsdWUgdG8gY3J0YyBkZXZpY2UgbWF0Y2hlZCB3aXRoIG91dF90eXBlLiAqLworaW50IGV4eW5vc19kcm1fY3J0Y19nZXRfcGlwZV9mcm9tX3R5cGUoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsCisJCQkJCXVuc2lnbmVkIGludCBvdXRfdHlwZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RwaS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RwaS5jCmluZGV4IDJiMDljN2MwLi40ODIxMjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHBpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RwaS5jCkBAIC00MCwyMCArNDAsMTAgQEAKIHsKIAlzdHJ1Y3QgZXh5bm9zX2RwaSAqY3R4ID0gY29ubmVjdG9yX3RvX2RwaShjb25uZWN0b3IpOwogCi0JLyogcGFuZWxzIHN1cHBvcnRlZCBvbmx5IGJ5IGJvb3QtbG9hZGVyIGFyZSBhbHdheXMgY29ubmVjdGVkICovCi0JaWYgKCFjdHgtPnBhbmVsX25vZGUpCi0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwlpZiAoIWN0eC0+cGFuZWwtPmNvbm5lY3RvcikKKwkJZHJtX3BhbmVsX2F0dGFjaChjdHgtPnBhbmVsLCAmY3R4LT5jb25uZWN0b3IpOwogCi0JaWYgKCFjdHgtPnBhbmVsKSB7Ci0JCWN0eC0+cGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChjdHgtPnBhbmVsX25vZGUpOwotCQlpZiAoY3R4LT5wYW5lbCkKLQkJCWRybV9wYW5lbF9hdHRhY2goY3R4LT5wYW5lbCwgJmN0eC0+Y29ubmVjdG9yKTsKLQl9Ci0KLQlpZiAoY3R4LT5wYW5lbCkKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCi0JcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIH0KIAogc3RhdGljIHZvaWQgZXh5bm9zX2RwaV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQpAQCAtOTQsMTIgKzg0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHlub3NfZHBpX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0JcmV0dXJuIE1PREVfT0s7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXIgKgogZXh5bm9zX2RwaV9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKQEAgLTExMCw3ICs5NCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgZXh5bm9zX2RwaV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBleHlub3NfZHBpX2dldF9tb2RlcywKLQkubW9kZV92YWxpZCA9IGV4eW5vc19kcGlfbW9kZV92YWxpZCwKIAkuYmVzdF9lbmNvZGVyID0gZXh5bm9zX2RwaV9iZXN0X2VuY29kZXIsCiB9OwogCkBAIC0xMjMsMTAgKzEwNiw3IEBACiAKIAljdHgtPmVuY29kZXIgPSBlbmNvZGVyOwogCi0JaWYgKGN0eC0+cGFuZWxfbm9kZSkKLQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKLQllbHNlCi0JCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKKwljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CiAKIAlyZXQgPSBkcm1fY29ubmVjdG9yX2luaXQoZW5jb2Rlci0+ZGV2LCBjb25uZWN0b3IsCiAJCQkJICZleHlub3NfZHBpX2Nvbm5lY3Rvcl9mdW5jcywKQEAgLTE3Miw3ICsxNTIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQl9OworCX0KIAljdHgtPmRwbXNfbW9kZSA9IG1vZGU7CiB9CiAKQEAgLTI5NCw4ICsyNzQsMTAgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCXJldCA9IG9mX2dldF92aWRlb21vZGUoZG4sIHZtLCAwKTsKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZtX2tmcmVlKGRldiwgdm0pOwogCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJCWN0eC0+dm0gPSB2bTsKIApAQCAtMzA4LDMyICsyOTAsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGV4eW5vc19kcGlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZXh5bm9zX2RwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV4eW5vc19kcGkgKmN0eDsKIAlpbnQgcmV0OwogCisJcmV0ID0gZXh5bm9zX2RybV9jb21wb25lbnRfYWRkKGRldiwKKwkJCQkJRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUiwKKwkJCQkJZXh5bm9zX2RwaV9kaXNwbGF5LnR5cGUpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKIAljdHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOwogCWlmICghY3R4KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKIAogCWN0eC0+ZGV2ID0gZGV2OwogCWV4eW5vc19kcGlfZGlzcGxheS5jdHggPSBjdHg7CiAJY3R4LT5kcG1zX21vZGUgPSBEUk1fTU9ERV9EUE1TX09GRjsKIAogCXJldCA9IGV4eW5vc19kcGlfcGFyc2VfZHQoY3R4KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZtX2tmcmVlKGRldiwgY3R4KTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKKwl9CiAKLQlleHlub3NfZHJtX2Rpc3BsYXlfcmVnaXN0ZXIoJmV4eW5vc19kcGlfZGlzcGxheSk7CisJaWYgKGN0eC0+cGFuZWxfbm9kZSkgeworCQljdHgtPnBhbmVsID0gb2ZfZHJtX2ZpbmRfcGFuZWwoY3R4LT5wYW5lbF9ub2RlKTsKKwkJaWYgKCFjdHgtPnBhbmVsKSB7CisJCQlleHlub3NfZHJtX2NvbXBvbmVudF9kZWwoZGV2LAorCQkJCQkJRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUik7CisJCQlyZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKKwkJfQorCX0KIAotCXJldHVybiAwOworCXJldHVybiAmZXh5bm9zX2RwaV9kaXNwbGF5OworCitlcnJfZGVsX2NvbXBvbmVudDoKKwlleHlub3NfZHJtX2NvbXBvbmVudF9kZWwoZGV2LCBFWFlOT1NfREVWSUNFX1RZUEVfQ09OTkVDVE9SKTsKKworCXJldHVybiBOVUxMOwogfQogCiBpbnQgZXh5bm9zX2RwaV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGV4eW5vc19kcGlfZGlzcGxheS5lbmNvZGVyOworCXN0cnVjdCBleHlub3NfZHBpICpjdHggPSBleHlub3NfZHBpX2Rpc3BsYXkuY3R4OworCiAJZXh5bm9zX2RwaV9kcG1zKCZleHlub3NfZHBpX2Rpc3BsYXksIERSTV9NT0RFX0RQTVNfT0ZGKTsKLQlleHlub3NfZHJtX2Rpc3BsYXlfdW5yZWdpc3RlcigmZXh5bm9zX2RwaV9kaXNwbGF5KTsKKwllbmNvZGVyLT5mdW5jcy0+ZGVzdHJveShlbmNvZGVyKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoJmN0eC0+Y29ubmVjdG9yKTsKKworCWV4eW5vc19kcm1fY29tcG9uZW50X2RlbChkZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMKaW5kZXggMmQyN2JhMi4uZDkxZjI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Fub25faW5vZGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxkcm0vZXh5bm9zX2RybS5oPgogCkBAIC00MCw5ICs0MSwxOSBAQAogCiAjZGVmaW5lIFZCTEFOS19PRkZfREVMQVkJNTAwMDAKIAotLyogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIgZm9yIGV5bm9zIGRybSBkZXZpY2UuICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXh5bm9zX2RybV9wZGV2OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGRybV9jb21wb25lbnRfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGRybV9jb21wb25lbnRfbGlzdCk7CisKK3N0cnVjdCBjb21wb25lbnRfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRldmljZSAqY3J0Y19kZXY7CisJc3RydWN0IGRldmljZSAqY29ubl9kZXY7CisJZW51bSBleHlub3NfZHJtX291dHB1dF90eXBlIG91dF90eXBlOworCXVuc2lnbmVkIGludCBkZXZfdHlwZV9mbGFnOworfTsKKwogc3RhdGljIGludCBleHlub3NfZHJtX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlOwpAQCAtNzMsMzggKzg0LDIxIEBACiAKIAlleHlub3NfZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKIAotCXJldCA9IGV4eW5vc19kcm1faW5pdGlhbGl6ZV9tYW5hZ2VycyhkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX21vZGVfY29uZmlnX2NsZWFudXA7Ci0KIAlmb3IgKG5yID0gMDsgbnIgPCBNQVhfUExBTkU7IG5yKyspIHsKIAkJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CiAJCXVuc2lnbmVkIGxvbmcgcG9zc2libGVfY3J0Y3MgPSAoMSA8PCBNQVhfQ1JUQykgLSAxOwogCiAJCXBsYW5lID0gZXh5bm9zX3BsYW5lX2luaXQoZGV2LCBwb3NzaWJsZV9jcnRjcywgZmFsc2UpOwogCQlpZiAoIXBsYW5lKQotCQkJZ290byBlcnJfbWFuYWdlcl9jbGVhbnVwOworCQkJZ290byBlcnJfbW9kZV9jb25maWdfY2xlYW51cDsKIAl9CiAKLQlyZXQgPSBleHlub3NfZHJtX2luaXRpYWxpemVfZGlzcGxheXMoZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9tYW5hZ2VyX2NsZWFudXA7Ci0KIAkvKiBpbml0IGttcyBwb2xsIGZvciBoYW5kbGluZyBocGQgKi8KIAlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoZGV2KTsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIE1BWF9DUlRDKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9kaXNwbGF5X2NsZWFudXA7Ci0KLQkvKgotCSAqIHByb2JlIHN1YiBkcml2ZXJzIHN1Y2ggYXMgZGlzcGxheSBjb250cm9sbGVyIGFuZCBoZG1pIGRyaXZlciwKLQkgKiB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBhdCBwcm9iZSgpIG9mIHBsYXRmb3JtIGRyaXZlcgotCSAqIHRvIHRoZSBzdWIgZHJpdmVyIGFuZCBjcmVhdGUgZW5jb2RlciBhbmQgY29ubmVjdG9yIGZvciB0aGVtLgotCSAqLwotCXJldCA9IGV4eW5vc19kcm1fZGV2aWNlX3JlZ2lzdGVyKGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfdmJsYW5rOworCQlnb3RvIGVycl9tb2RlX2NvbmZpZ19jbGVhbnVwOwogCiAJLyogc2V0dXAgcG9zc2libGVfY2xvbmVzLiAqLwogCWV4eW5vc19kcm1fZW5jb2Rlcl9zZXR1cChkZXYpOwpAQCAtMTEzLDE3ICsxMDcsMjUgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldi0+cGxhdGZvcm1kZXYsIGRldik7CiAKKwkvKiBUcnkgdG8gYmluZCBhbGwgc3ViIGRyaXZlcnMuICovCisJcmV0ID0gY29tcG9uZW50X2JpbmRfYWxsKGRldi0+ZGV2LCBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsZWFudXBfdmJsYW5rOworCisJLyogUHJvYmUgbm9uIGttcyBzdWIgZHJpdmVycyBhbmQgdmlydHVhbCBkaXNwbGF5IGRyaXZlci4gKi8KKwlyZXQgPSBleHlub3NfZHJtX2RldmljZV9zdWJkcnZfcHJvYmUoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmJpbmRfYWxsOworCiAJLyogZm9yY2UgY29ubmVjdG9ycyBkZXRlY3Rpb24gKi8KIAlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZGV2KTsKIAogCXJldHVybiAwOwogCi1lcnJfdmJsYW5rOgorZXJyX3VuYmluZF9hbGw6CisJY29tcG9uZW50X3VuYmluZF9hbGwoZGV2LT5kZXYsIGRldik7CitlcnJfY2xlYW51cF92Ymxhbms6CiAJZHJtX3ZibGFua19jbGVhbnVwKGRldik7Ci1lcnJfZGlzcGxheV9jbGVhbnVwOgotCWV4eW5vc19kcm1fcmVtb3ZlX2Rpc3BsYXlzKGRldik7Ci1lcnJfbWFuYWdlcl9jbGVhbnVwOgotCWV4eW5vc19kcm1fcmVtb3ZlX21hbmFnZXJzKGRldik7CiBlcnJfbW9kZV9jb25maWdfY2xlYW51cDoKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOwogCWRybV9yZWxlYXNlX2lvbW11X21hcHBpbmcoZGV2KTsKQEAgLTEzNSwxNyArMTM3LDE3IEBACiAKIHN0YXRpYyBpbnQgZXh5bm9zX2RybV91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlleHlub3NfZHJtX2RldmljZV9zdWJkcnZfcmVtb3ZlKGRldik7CisKIAlleHlub3NfZHJtX2ZiZGV2X2ZpbmkoZGV2KTsKLQlleHlub3NfZHJtX2RldmljZV91bnJlZ2lzdGVyKGRldik7CiAJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CiAJZHJtX2ttc19oZWxwZXJfcG9sbF9maW5pKGRldik7Ci0JZXh5bm9zX2RybV9yZW1vdmVfZGlzcGxheXMoZGV2KTsKLQlleHlub3NfZHJtX3JlbW92ZV9tYW5hZ2VycyhkZXYpOwogCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7CiAKIAlkcm1fcmVsZWFzZV9pb21tdV9tYXBwaW5nKGRldik7CiAJa2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSk7CiAKKwljb21wb25lbnRfdW5iaW5kX2FsbChkZXYtPmRldiwgZGV2KTsKIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKIAogCXJldHVybiAwOwpAQCAtMTgzLDkgKzE4NSw5IEBACiAJCWlmIChjb25uZWN0b3ItPmZ1bmNzLT5kcG1zKQogCQkJY29ubmVjdG9yLT5mdW5jcy0+ZHBtcyhjb25uZWN0b3IsIGNvbm5lY3Rvci0+ZHBtcyk7CiAJfQorCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKIAogCWRybV9oZWxwZXJfcmVzdW1lX2ZvcmNlX21vZGUoZGV2KTsKLQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyMyw4ICszMjUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGV4eW5vc19kcm1fZHJpdmVyID0gewotCS5kcml2ZXJfZmVhdHVyZXMJPSBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfTU9ERVNFVCB8Ci0JCQkJCURSSVZFUl9HRU0gfCBEUklWRVJfUFJJTUUsCisJLmRyaXZlcl9mZWF0dXJlcwk9IERSSVZFUl9NT0RFU0VUIHwgRFJJVkVSX0dFTSB8IERSSVZFUl9QUklNRSwKIAkubG9hZAkJCT0gZXh5bm9zX2RybV9sb2FkLAogCS51bmxvYWQJCQk9IGV4eW5vc19kcm1fdW5sb2FkLAogCS5zdXNwZW5kCQk9IGV4eW5vc19kcm1fc3VzcGVuZCwKQEAgLTM1NSwyNyArMzU2LDYgQEAKIAkubWlub3IJPSBEUklWRVJfTUlOT1IsCiB9OwogCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwotCi0JcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZleHlub3NfZHJtX2RyaXZlciwgcGRldik7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlkcm1fcHV0X2RldihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBleHlub3NfZHJtX3N5c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTQwMCwyMzcgKzM4MCw0MDkgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLXN0YXRpYyBpbnQgZXh5bm9zX2RybV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JcG1fbWVzc2FnZV90IG1lc3NhZ2U7Ci0KLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQltZXNzYWdlLmV2ZW50ID0gUE1fRVZFTlRfU1VTUEVORDsKLQlyZXR1cm4gZXh5bm9zX2RybV9zdXNwZW5kKGRybV9kZXYsIG1lc3NhZ2UpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGV4eW5vc19kcm1fcmVzdW1lKGRybV9kZXYpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBleHlub3NfZHJtX3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhleHlub3NfZHJtX3N5c19zdXNwZW5kLCBleHlub3NfZHJtX3N5c19yZXN1bWUpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKGV4eW5vc19kcm1fcnVudGltZV9zdXNwZW5kLAotCQkJZXh5bm9zX2RybV9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKK2ludCBleHlub3NfZHJtX2NvbXBvbmVudF9hZGQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWVudW0gZXh5bm9zX2RybV9kZXZpY2VfdHlwZSBkZXZfdHlwZSwKKwkJCQllbnVtIGV4eW5vc19kcm1fb3V0cHV0X3R5cGUgb3V0X3R5cGUpCit7CisJc3RydWN0IGNvbXBvbmVudF9kZXYgKmNkZXY7CisKKwlpZiAoZGV2X3R5cGUgIT0gRVhZTk9TX0RFVklDRV9UWVBFX0NSVEMgJiYKKwkJCWRldl90eXBlICE9IEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGRldmljZSB0eXBlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmRybV9jb21wb25lbnRfbG9jayk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBjaGVjayBpZiB0aGVyZSBpcyBhIGNvbXBvbmVudCB3aGljaCBoYXMgdHdvIGRldmljZQorCSAqIG9iamVjdHMsIGZvciBjb25uZWN0b3IgYW5kIGZvciBlbmNvZGVyL2Nvbm5lY3Rvci4KKwkgKiBJdCBzaG91bGQgbWFrZSBzdXJlIHRoYXQgY3J0YyBhbmQgZW5jb2Rlci9jb25uZWN0b3IgZHJpdmVycyBhcmUKKwkgKiByZWFkeSBiZWZvcmUgZXh5bm9zIGRybSBjb3JlIGJpbmRzIHRoZW0uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmZHJtX2NvbXBvbmVudF9saXN0LCBsaXN0KSB7CisJCWlmIChjZGV2LT5vdXRfdHlwZSA9PSBvdXRfdHlwZSkgeworCQkJLyoKKwkJCSAqIElmIGNydGMgYW5kIGVuY29kZXIvY29ubmVjdG9yIGRldmljZSBvYmplY3RzIGFyZQorCQkJICogYWRkZWQgYWxyZWFkeSBqdXN0IHJldHVybi4KKwkJCSAqLworCQkJaWYgKGNkZXYtPmRldl90eXBlX2ZsYWcgPT0gKEVYWU5PU19ERVZJQ0VfVFlQRV9DUlRDIHwKKwkJCQkJCUVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZkcm1fY29tcG9uZW50X2xvY2spOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoZGV2X3R5cGUgPT0gRVhZTk9TX0RFVklDRV9UWVBFX0NSVEMpIHsKKwkJCQljZGV2LT5jcnRjX2RldiA9IGRldjsKKwkJCQljZGV2LT5kZXZfdHlwZV9mbGFnIHw9IGRldl90eXBlOworCQkJfQorCisJCQlpZiAoZGV2X3R5cGUgPT0gRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUikgeworCQkJCWNkZXYtPmNvbm5fZGV2ID0gZGV2OworCQkJCWNkZXYtPmRldl90eXBlX2ZsYWcgfD0gZGV2X3R5cGU7CisJCQl9CisKKwkJCW11dGV4X3VubG9jaygmZHJtX2NvbXBvbmVudF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkcm1fY29tcG9uZW50X2xvY2spOworCisJY2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChkZXZfdHlwZSA9PSBFWFlOT1NfREVWSUNFX1RZUEVfQ1JUQykKKwkJY2Rldi0+Y3J0Y19kZXYgPSBkZXY7CisJaWYgKGRldl90eXBlID09IEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpCisJCWNkZXYtPmNvbm5fZGV2ID0gZGV2OworCisJY2Rldi0+b3V0X3R5cGUgPSBvdXRfdHlwZTsKKwljZGV2LT5kZXZfdHlwZV9mbGFnID0gZGV2X3R5cGU7CisKKwltdXRleF9sb2NrKCZkcm1fY29tcG9uZW50X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNkZXYtPmxpc3QsICZkcm1fY29tcG9uZW50X2xpc3QpOworCW11dGV4X3VubG9jaygmZHJtX2NvbXBvbmVudF9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGV4eW5vc19kcm1fY29tcG9uZW50X2RlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJZW51bSBleHlub3NfZHJtX2RldmljZV90eXBlIGRldl90eXBlKQoreworCXN0cnVjdCBjb21wb25lbnRfZGV2ICpjZGV2LCAqbmV4dDsKKworCW11dGV4X2xvY2soJmRybV9jb21wb25lbnRfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2RldiwgbmV4dCwgJmRybV9jb21wb25lbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoZGV2X3R5cGUgPT0gRVhZTk9TX0RFVklDRV9UWVBFX0NSVEMpIHsKKwkJCWlmIChjZGV2LT5jcnRjX2RldiA9PSBkZXYpIHsKKwkJCQljZGV2LT5jcnRjX2RldiA9IE5VTEw7CisJCQkJY2Rldi0+ZGV2X3R5cGVfZmxhZyAmPSB+ZGV2X3R5cGU7CisJCQl9CisJCX0KKworCQlpZiAoZGV2X3R5cGUgPT0gRVhZTk9TX0RFVklDRV9UWVBFX0NPTk5FQ1RPUikgeworCQkJaWYgKGNkZXYtPmNvbm5fZGV2ID09IGRldikgeworCQkJCWNkZXYtPmNvbm5fZGV2ID0gTlVMTDsKKwkJCQljZGV2LT5kZXZfdHlwZV9mbGFnICY9IH5kZXZfdHlwZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFJlbGVhc2UgY2RldiBvYmplY3Qgb25seSBpbiBjYXNlIHRoYXQgYm90aCBvZiBjcnRjIGFuZAorCQkgKiBlbmNvZGVyL2Nvbm5lY3RvciBkZXZpY2Ugb2JqZWN0cyBhcmUgTlVMTC4KKwkJICovCisJCWlmICghY2Rldi0+Y3J0Y19kZXYgJiYgIWNkZXYtPmNvbm5fZGV2KSB7CisJCQlsaXN0X2RlbCgmY2Rldi0+bGlzdCk7CisJCQlrZnJlZShjZGV2KTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZHJtX2NvbXBvbmVudF9sb2NrKTsKK30KKworc3RhdGljIGludCBjb21wYXJlX29mKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGV2ID09IChzdHJ1Y3QgZGV2aWNlICopZGF0YTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2FkZF9jb21wb25lbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG1hc3RlciAqbSkKK3sKKwlzdHJ1Y3QgY29tcG9uZW50X2RldiAqY2RldjsKKwl1bnNpZ25lZCBpbnQgYXR0YWNoX2NudCA9IDA7CisKKwltdXRleF9sb2NrKCZkcm1fY29tcG9uZW50X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmZHJtX2NvbXBvbmVudF9saXN0LCBsaXN0KSB7CisJCWludCByZXQ7CisKKwkJLyoKKwkJICogQWRkIGNvbXBvbmVudHMgdG8gbWFzdGVyIG9ubHkgaW4gY2FzZSB0aGF0IGNydGMgYW5kCisJCSAqIGVuY29kZXIvY29ubmVjdG9yIGRldmljZSBvYmplY3RzIGV4aXN0LgorCQkgKi8KKwkJaWYgKCFjZGV2LT5jcnRjX2RldiB8fCAhY2Rldi0+Y29ubl9kZXYpCisJCQljb250aW51ZTsKKworCQlhdHRhY2hfY250Kys7CisKKwkJbXV0ZXhfdW5sb2NrKCZkcm1fY29tcG9uZW50X2xvY2spOworCisJCS8qCisJCSAqIGZpbWQgYW5kIGRwaSBtb2R1bGVzIGhhdmUgc2FtZSBkZXZpY2Ugb2JqZWN0IHNvIGFkZAorCQkgKiBvbmx5IGNydGMgZGV2aWNlIG9iamVjdCBpbiB0aGlzIGNhc2UuCisJCSAqCisJCSAqIFRPRE8uIGlmIGRwaSBtb2R1bGUgZm9sbG93cyBkcml2ZXItbW9kZWwgZHJpdmVyIHRoZW4KKwkJICogYmVsb3cgY29kZXMgY2FuIGJlIHJlbW92ZWQuCisJCSAqLworCQlpZiAoY2Rldi0+Y3J0Y19kZXYgPT0gY2Rldi0+Y29ubl9kZXYpIHsKKwkJCXJldCA9IGNvbXBvbmVudF9tYXN0ZXJfYWRkX2NoaWxkKG0sIGNvbXBhcmVfb2YsCisJCQkJCWNkZXYtPmNydGNfZGV2KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKworCQkvKgorCQkgKiBEbyBub3QgY2hhZ2UgYmVsb3cgY2FsbCBvcmRlci4KKwkJICogY3J0YyBkZXZpY2UgZmlyc3Qgc2hvdWxkIGJlIGFkZGVkIHRvIG1hc3RlciBiZWNhdXNlCisJCSAqIGNvbm5lY3Rvci9lbmNvZGVyIG5lZWQgcGlwZSBudW1iZXIgb2YgY3J0YyB3aGVuIHRoZXkKKwkJICogYXJlIGNyZWF0ZWQuCisJCSAqLworCQlyZXQgPSBjb21wb25lbnRfbWFzdGVyX2FkZF9jaGlsZChtLCBjb21wYXJlX29mLCBjZGV2LT5jcnRjX2Rldik7CisJCXJldCB8PSBjb21wb25lbnRfbWFzdGVyX2FkZF9jaGlsZChtLCBjb21wYXJlX29mLAorCQkJCQkJCWNkZXYtPmNvbm5fZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCitvdXRfbG9jazoKKwkJbXV0ZXhfbG9jaygmZHJtX2NvbXBvbmVudF9sb2NrKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRybV9jb21wb25lbnRfbG9jayk7CisKKwlyZXR1cm4gYXR0YWNoX2NudCA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZleHlub3NfZHJtX2RyaXZlciwgdG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZHJtX3B1dF9kZXYoZGV2X2dldF9kcnZkYXRhKGRldikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9tYXN0ZXJfb3BzIGV4eW5vc19kcm1fb3BzID0geworCS5hZGRfY29tcG9uZW50cyA9IGV4eW5vc19kcm1fYWRkX2NvbXBvbmVudHMsCisJLmJpbmQJCT0gZXh5bm9zX2RybV9iaW5kLAorCS51bmJpbmQJCT0gZXh5bm9zX2RybV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGV4eW5vc19kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCisJcGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwlleHlub3NfZHJtX2RyaXZlci5udW1faW9jdGxzID0gQVJSQVlfU0laRShleHlub3NfaW9jdGxzKTsKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0ZJTUQKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZpbWRfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRFAKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRwX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZmltZF9kcnY7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RTSQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHNpX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZHBfZHJ2OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19IRE1JCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtaXhlcl9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RzaV9kcnY7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoZG1pX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfbWl4ZXJfZHJ2OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19HMkQKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmcyZF9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2hkbWlfZHJ2OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19GSU1DCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmaW1jX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZzJkX2RydjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfUk9UQVRPUgorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmcm90YXRvcl9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2ZpbWNfZHJ2OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19HU0MKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdzY19kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX3JvdGF0b3JfZHJ2OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19JUFAKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlwcF9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2dzY19kcnY7CisKKwlyZXQgPSBleHlub3NfcGxhdGZvcm1fZGV2aWNlX2lwcF9yZWdpc3RlcigpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2lwcF9kcnY7CisjZW5kaWYKKworCXJldCA9IGNvbXBvbmVudF9tYXN0ZXJfYWRkKCZwZGV2LT5kZXYsICZleHlub3NfZHJtX29wcyk7CisJaWYgKHJldCA8IDApCisJCURSTV9ERUJVR19LTVMoInJlLXRyaWVkIGJ5IGxhc3Qgc3ViIGRyaXZlciBwcm9iZWQgbGF0ZXIuXG4iKTsKKworCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfSVBQCitlcnJfdW5yZWdpc3Rlcl9pcHBfZHJ2OgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpcHBfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2dzY19kcnY6CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0dTQworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnc2NfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX3JvdGF0b3JfZHJ2OgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19ST1RBVE9SCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJvdGF0b3JfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2ZpbWNfZHJ2OgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19GSU1DCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWNfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2cyZF9kcnY6CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0cyRAorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnMmRfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2hkbWlfZHJ2OgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19IRE1JCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhkbWlfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX21peGVyX2RydjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWl4ZXJfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2RzaV9kcnY6CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RTSQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkc2lfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2RwX2RydjoKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRFAKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHBfZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX2ZpbWRfZHJ2OgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19GSU1ECisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWRfZHJpdmVyKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19JUFAKKwlleHlub3NfcGxhdGZvcm1fZGV2aWNlX2lwcF91bnJlZ2lzdGVyKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlwcF9kcml2ZXIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19HU0MKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3NjX2RyaXZlcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX1JPVEFUT1IKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmcm90YXRvcl9kcml2ZXIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19GSU1DCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWNfZHJpdmVyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRzJECisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmcyZF9kcml2ZXIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19IRE1JCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1peGVyX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhkbWlfZHJpdmVyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRklNRAorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmaW1kX2RyaXZlcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RTSQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkc2lfZHJpdmVyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRFAKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHBfZHJpdmVyKTsKKyNlbmRpZgorCWNvbXBvbmVudF9tYXN0ZXJfZGVsKCZwZGV2LT5kZXYsICZleHlub3NfZHJtX29wcyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyID0gewotCS5wcm9iZQkJPSBleHlub3NfZHJtX3BsYXRmb3JtX3Byb2JlLAotCS5yZW1vdmUJCT0gZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7CisJLnByb2JlCT0gZXh5bm9zX2RybV9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlCT0gZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUsCisJLmRyaXZlcgk9IHsKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gImV4eW5vcy1kcm0iLAogCQkucG0JPSAmZXh5bm9zX2RybV9wbV9vcHMsCiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGV4eW5vc19kcm1faW5pdCh2b2lkKQorc3RhdGljIGludCBleHlub3NfZHJtX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRFAKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRwX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2RwOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19EU0kKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzaV9kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9kc2k7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0ZJTUQKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZpbWRfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZmltZDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfSERNSQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaGRtaV9kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9oZG1pOwotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWl4ZXJfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfbWl4ZXI7Ci0jZW5kaWYKKwlleHlub3NfZHJtX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJleHlub3MtZHJtIiwgLTEsCisJCQkJCQkJCU5VTEwsIDApOworCWlmIChJU19FUlIoZXh5bm9zX2RybV9wZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZXh5bm9zX2RybV9wZGV2KTsKIAogI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX1ZJREkKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZpZGlfZHJpdmVyKTsKKwlyZXQgPSBleHlub3NfZHJtX3Byb2JlX3ZpZGkoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfdmlkaTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRzJECi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnMmRfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZzJkOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19GSU1DCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmaW1jX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZpbWM7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX1JPVEFUT1IKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJvdGF0b3JfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfcm90YXRvcjsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfR1NDCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnc2NfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZ3NjOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19JUFAKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlwcF9kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9pcHA7Ci0KLQlyZXQgPSBleHlub3NfcGxhdGZvcm1fZGV2aWNlX2lwcF9yZWdpc3RlcigpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9pcHBfZGV2OworCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BkOwogI2VuZGlmCiAKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZHJtOwotCi0JZXh5bm9zX2RybV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZXh5bm9zLWRybSIsIC0xLAotCQkJCU5VTEwsIDApOwotCWlmIChJU19FUlIoZXh5bm9zX2RybV9wZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKGV4eW5vc19kcm1fcGRldik7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfdmlkaTsKIAogCXJldHVybiAwOwogCi1vdXQ6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyKTsKK2Vycl91bnJlZ2lzdGVyX3BkOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV4eW5vc19kcm1fcGRldik7CiAKLW91dF9kcm06Ci0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfSVBQCi0JZXh5bm9zX3BsYXRmb3JtX2RldmljZV9pcHBfdW5yZWdpc3RlcigpOwotb3V0X2lwcF9kZXY6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlwcF9kcml2ZXIpOwotb3V0X2lwcDoKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfR1NDCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdzY19kcml2ZXIpOwotb3V0X2dzYzoKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfUk9UQVRPUgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyb3RhdG9yX2RyaXZlcik7Ci1vdXRfcm90YXRvcjoKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRklNQwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmaW1jX2RyaXZlcik7Ci1vdXRfZmltYzoKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfRzJECi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmcyZF9kcml2ZXIpOwotb3V0X2cyZDoKLSNlbmRpZgotCitlcnJfcmVtb3ZlX3ZpZGk6CiAjaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfVklESQotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2aWRpX2RyaXZlcik7Ci1vdXRfdmlkaToKKwlleHlub3NfZHJtX3JlbW92ZV92aWRpKCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0hETUkKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWl4ZXJfZHJpdmVyKTsKLW91dF9taXhlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaGRtaV9kcml2ZXIpOwotb3V0X2hkbWk6Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0ZJTUQKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmltZF9kcml2ZXIpOwotb3V0X2ZpbWQ6Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RTSQotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkc2lfZHJpdmVyKTsKLW91dF9kc2k6Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RQCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRwX2RyaXZlcik7Ci1vdXRfZHA6Ci0jZW5kaWYKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZXh5bm9zX2RybV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihleHlub3NfZHJtX3BkZXYpOwotCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyKTsKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0lQUAotCWV4eW5vc19wbGF0Zm9ybV9kZXZpY2VfaXBwX3VucmVnaXN0ZXIoKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXBwX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0dTQwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnc2NfZHJpdmVyKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RSTV9FWFlOT1NfUk9UQVRPUgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyb3RhdG9yX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0ZJTUMKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmltY19kcml2ZXIpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19HMkQKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZzJkX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0hETUkKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWl4ZXJfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaGRtaV9kcml2ZXIpOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19WSURJCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZpZGlfZHJpdmVyKTsKKwlleHlub3NfZHJtX3JlbW92ZV92aWRpKCk7CiAjZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0ZJTUQKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmltZF9kcml2ZXIpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19EU0kKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHNpX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19EUk1fRVhZTk9TX0RQCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRwX2RyaXZlcik7Ci0jZW5kaWYKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihleHlub3NfZHJtX3BkZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZleHlub3NfZHJtX3BsYXRmb3JtX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGV4eW5vc19kcm1faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmgKaW5kZXggY2UzZTZhMy4uMzY1MzVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuaApAQCAtNDIsNiArNDIsMTMgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBkcm1fdmJsYW5rX29mZmRlbGF5OwogCisvKiBUaGlzIGVudW1lcmF0ZXMgZGV2aWNlIHR5cGUuICovCitlbnVtIGV4eW5vc19kcm1fZGV2aWNlX3R5cGUgeworCUVYWU5PU19ERVZJQ0VfVFlQRV9OT05FLAorCUVYWU5PU19ERVZJQ0VfVFlQRV9DUlRDLAorCUVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IsCit9OworCiAvKiB0aGlzIGVudW1lcmF0ZXMgZGlzcGxheSB0eXBlLiAqLwogZW51bSBleHlub3NfZHJtX291dHB1dF90eXBlIHsKIAlFWFlOT1NfRElTUExBWV9UWVBFX05PTkUsCkBAIC0xMjIsNyArMTI5LDYgQEAKICAqIEV4eW5vcyBEUk0gRGlzcGxheSBTdHJ1Y3R1cmUuCiAgKgktIHRoaXMgc3RydWN0dXJlIGlzIGNvbW1vbiB0byBhbmFsb2cgdHYsIGRpZ2l0YWwgdHYgYW5kIGxjZCBwYW5lbC4KICAqCi0gKiBAaW5pdGlhbGl6ZTogaW5pdGlhbGl6ZXMgdGhlIGRpc3BsYXkgd2l0aCBkcm1fZGV2CiAgKiBAcmVtb3ZlOiBjbGVhbnMgdXAgdGhlIGRpc3BsYXkgZm9yIHJlbW92YWwKICAqIEBtb2RlX2ZpeHVwOiBmaXggbW9kZSBkYXRhIGNvbXBhcmluZyB0byBodyBzcGVjaWZpYyBkaXNwbGF5IG1vZGUuCiAgKiBAbW9kZV9zZXQ6IGNvbnZlcnQgZHJtX2Rpc3BsYXlfbW9kZSB0byBodyBzcGVjaWZpYyBkaXNwbGF5IG1vZGUgYW5kCkBAIC0xMzMsOCArMTM5LDYgQEAKICAqLwogc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheTsKIHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXlfb3BzIHsKLQlpbnQgKCppbml0aWFsaXplKShzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5LAotCQkJCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2KTsKIAlpbnQgKCpjcmVhdGVfY29ubmVjdG9yKShzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5LAogCQkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAJdm9pZCAoKnJlbW92ZSkoc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSk7CkBAIC0xNzIsOCArMTc2LDYgQEAKIC8qCiAgKiBFeHlub3MgZHJtIG1hbmFnZXIgb3BzCiAgKgotICogQGluaXRpYWxpemU6IGluaXRpYWxpemVzIHRoZSBtYW5hZ2VyIHdpdGggZHJtX2RldgotICogQHJlbW92ZTogY2xlYW5zIHVwIHRoZSBtYW5hZ2VyIGZvciByZW1vdmFsCiAgKiBAZHBtczogY29udHJvbCBkZXZpY2UgcG93ZXIuCiAgKiBAbW9kZV9maXh1cDogZml4IG1vZGUgZGF0YSBiZWZvcmUgYXBwbHlpbmcgaXQKICAqIEBtb2RlX3NldDogc2V0IHRoZSBnaXZlbiBtb2RlIHRvIHRoZSBtYW5hZ2VyCkBAIC0xODksOSArMTkxLDYgQEAKICAqLwogc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcjsKIHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXJfb3BzIHsKLQlpbnQgKCppbml0aWFsaXplKShzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsCi0JCQkJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIGludCBwaXBlKTsKLQl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IpOwogCXZvaWQgKCpkcG1zKShzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsIGludCBtb2RlKTsKIAlib29sICgqbW9kZV9maXh1cCkoc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWdyLAogCQkJCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLApAQCAtMjE1LDYgKzIxNCw3IEBACiAgKiBAbGlzdDogdGhlIGxpc3QgZW50cnkgZm9yIHRoaXMgbWFuYWdlcgogICogQHR5cGU6IG9uZSBvZiBFWFlOT1NfRElTUExBWV9UWVBFX0xDRCBhbmQgSERNSS4KICAqIEBkcm1fZGV2OiBwb2ludGVyIHRvIHRoZSBkcm0gZGV2aWNlCisgKiBAY3J0YzogY3J0YyBvYmplY3QuCiAgKiBAcGlwZTogdGhlIHBpcGUgbnVtYmVyIGZvciB0aGlzIGNydGMvbWFuYWdlcgogICogQG9wczogcG9pbnRlciB0byBjYWxsYmFja3MgZm9yIGV4eW5vcyBkcm0gc3BlY2lmaWMgZnVuY3Rpb25hbGl0eQogICogQGN0eDogQSBwb2ludGVyIHRvIHRoZSBtYW5hZ2VyJ3MgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGV4dApAQCAtMjIzLDYgKzIyMyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWVudW0gZXh5bm9zX2RybV9vdXRwdXRfdHlwZSB0eXBlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2OworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlpbnQgcGlwZTsKIAlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyAqb3BzOwogCXZvaWQgKmN0eDsKQEAgLTI1NCw2ICsyNTUsNyBAQAogICoJb3RoZXJ3aXNlIGRlZmF1bHQgb25lLgogICogQGRhX3NwYWNlX3NpemU6IHNpemUgb2YgZGV2aWNlIGFkZHJlc3Mgc3BhY2UuCiAgKglpZiAwIHRoZW4gZGVmYXVsdCB2YWx1ZSBpcyB1c2VkIGZvciBpdC4KKyAqIEBwaXBlOiB0aGUgcGlwZSBudW1iZXIgZm9yIHRoaXMgY3J0Yy9tYW5hZ2VyLgogICovCiBzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlIHsKIAlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyOwpAQCAtMjcxLDYgKzI3Myw4IEBACiAKIAl1bnNpZ25lZCBsb25nIGRhX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgZGFfc3BhY2Vfc2l6ZTsKKworCXVuc2lnbmVkIGludCBwaXBlOwogfTsKIAogLyoKQEAgLTI4MSwxMSArMjg1LDExIEBACiAgKiBAZHJtX2RldjogcG9pbnRlciB0byBkcm1fZGV2aWNlIGFuZCB0aGlzIHBvaW50ZXIgd291bGQgYmUgc2V0CiAgKgl3aGVuIHN1YiBkcml2ZXIgY2FsbHMgZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoKS4KICAqIEBtYW5hZ2VyOiBzdWJkcnYgaGFzIGl0cyBvd24gbWFuYWdlciB0byBjb250cm9sIGEgaGFyZHdhcmUgYXBwcm9wcmlhdGVseQotICoJYW5kIHdlIGNhbiBhY2Nlc3MgYSBoYXJkd2FyZSBkcmF3aW5nIG9uIHRoaXMgbWFuYWdlci4KKyAqICAgICBhbmQgd2UgY2FuIGFjY2VzcyBhIGhhcmR3YXJlIGRyYXdpbmcgb24gdGhpcyBtYW5hZ2VyLgogICogQHByb2JlOiB0aGlzIGNhbGxiYWNrIHdvdWxkIGJlIGNhbGxlZCBieSBleHlub3MgZHJtIGRyaXZlciBhZnRlcgotICoJc3ViZHJ2IGlzIHJlZ2lzdGVyZWQgdG8gaXQuCisgKiAgICAgc3ViZHJ2IGlzIHJlZ2lzdGVyZWQgdG8gaXQuCiAgKiBAcmVtb3ZlOiB0aGlzIGNhbGxiYWNrIGlzIHVzZWQgdG8gcmVsZWFzZSByZXNvdXJjZXMgY3JlYXRlZAotICoJYnkgcHJvYmUgY2FsbGJhY2suCisgKiAgICAgYnkgcHJvYmUgY2FsbGJhY2suCiAgKiBAb3BlbjogdGhpcyB3b3VsZCBiZSBjYWxsZWQgd2l0aCBkcm0gZGV2aWNlIGZpbGUgb3Blbi4KICAqIEBjbG9zZTogdGhpcyB3b3VsZCBiZSBjYWxsZWQgd2l0aCBkcm0gZGV2aWNlIGZpbGUgY2xvc2UuCiAgKi8KQEAgLTMwMiwzOSArMzA2LDE0IEBACiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOwogfTsKIAotLyoKLSAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgYSBwcm9iZSBjYWxsYmFjayByZWdpc3RlcmVkIHRvIHN1YiBkcml2ZXIgbGlzdCBhbmQKLSAqIGNyZWF0ZSBpdHMgb3duIGVuY29kZXIgYW5kIGNvbm5lY3RvciBhbmQgdGhlbiBzZXQgZHJtX2RldmljZSBvYmplY3QKLSAqIHRvIGdsb2JhbCBvbmUuCi0gKi8KLWludCBleHlub3NfZHJtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLS8qCi0gKiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGEgcmVtb3ZlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gc3ViIGRyaXZlciBsaXN0IGFuZAotICogZGVzdHJveSBpdHMgb3duIGVuY29kZXIgYW5kIGNvbm5ldG9yLgotICovCi1pbnQgZXh5bm9zX2RybV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLQotaW50IGV4eW5vc19kcm1faW5pdGlhbGl6ZV9tYW5hZ2VycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLXZvaWQgZXh5bm9zX2RybV9yZW1vdmVfbWFuYWdlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pbnQgZXh5bm9zX2RybV9pbml0aWFsaXplX2Rpc3BsYXlzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotdm9pZCBleHlub3NfZHJtX3JlbW92ZV9kaXNwbGF5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLQotaW50IGV4eW5vc19kcm1fbWFuYWdlcl9yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyKTsKLWludCBleHlub3NfZHJtX21hbmFnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyKTsKLWludCBleHlub3NfZHJtX2Rpc3BsYXlfcmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSk7Ci1pbnQgZXh5bm9zX2RybV9kaXNwbGF5X3VucmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSk7Ci0KLS8qCi0gKiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZCBieSBzdWIgZHJpdmVycyBzdWNoIGFzIGRpc3BsYXkgY29udHJvbGxlcgotICogb3IgaGRtaSBkcml2ZXIgdG8gcmVnaXN0ZXIgdGhpcyBzdWIgZHJpdmVyIG9iamVjdCB0byBleHlub3MgZHJtIGRyaXZlcgotICogYW5kIHdoZW4gYSBzdWIgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgdG8gZXh5bm9zIGRybSBkcml2ZXIgYSBwcm9iZSBjYWxsYmFjawotICogb2YgdGhlIHN1YiBkcml2ZXIgaXMgY2FsbGVkIGFuZCBjcmVhdGVzIGl0cyBvd24gZW5jb2RlciBhbmQgY29ubmVjdG9yLgotICovCisgLyogVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQgYnkgbm9uIGttcyBkcml2ZXJzIHN1Y2ggYXMgZzJkIGFuZCBpcHAuICovCiBpbnQgZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpkcm1fc3ViZHJ2KTsKIAogLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHN1YmRydiBsaXN0IGZyb20gZXh5bm9zIGRybSBkcml2ZXIgKi8KIGludCBleHlub3NfZHJtX3N1YmRydl91bnJlZ2lzdGVyKHN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqZHJtX3N1YmRydik7CiAKK2ludCBleHlub3NfZHJtX2RldmljZV9zdWJkcnZfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgZXh5bm9zX2RybV9kZXZpY2Vfc3ViZHJ2X3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBleHlub3NfZHJtX3N1YmRydl9vcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiB2b2lkIGV4eW5vc19kcm1fc3ViZHJ2X2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiAKQEAgLTM2MCwxOCArMzM5LDQwIEBACiB2b2lkIGV4eW5vc19wbGF0Zm9ybV9kZXZpY2VfaXBwX3VucmVnaXN0ZXIodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfRFJNX0VYWU5PU19EUEkKLWludCBleHlub3NfZHBpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICogZXh5bm9zX2RwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogaW50IGV4eW5vc19kcGlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgZXh5bm9zX2RwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqCitleHlub3NfZHBpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgZXh5bm9zX2RwaV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAorLyoKKyAqIHRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGV4eW5vcyBkcm0gdmlkaSBwbGF0Zm9ybSBkZXZpY2UvZHJpdmVyLgorICovCitpbnQgZXh5bm9zX2RybV9wcm9iZV92aWRpKHZvaWQpOworCisvKgorICogdGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVyIGV4eW5vcyBkcm0gdmlkaSBwbGF0Zm9ybSBkZXZpY2UvZHJpdmVyLgorICovCit2b2lkIGV4eW5vc19kcm1fcmVtb3ZlX3ZpZGkodm9pZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGVuY29kZXIgYW5kIGEgY29ubmVjdG9yLCBhbmQgaW5pdGlhbGl6ZXMgdGhlbS4gKi8KK2ludCBleHlub3NfZHJtX2NyZWF0ZV9lbmNfY29ubihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkpOworCitpbnQgZXh5bm9zX2RybV9jb21wb25lbnRfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQllbnVtIGV4eW5vc19kcm1fZGV2aWNlX3R5cGUgZGV2X3R5cGUsCisJCQkJZW51bSBleHlub3NfZHJtX291dHB1dF90eXBlIG91dF90eXBlKTsKKwordm9pZCBleHlub3NfZHJtX2NvbXBvbmVudF9kZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWVudW0gZXh5bm9zX2RybV9kZXZpY2VfdHlwZSBkZXZfdHlwZSk7CisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZpbWRfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHBfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHNpX2RyaXZlcjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZpbWRfZHJpdmVyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGRtaV9kcml2ZXI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtaXhlcl9kcml2ZXI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoZG1pX2RyaXZlcjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19kcm1fY29tbW9uX2hkbWlfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmlkaV9kcml2ZXI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciBnMmRfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5jCmluZGV4IDRhYzQzODEuLjYzMDJhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNpLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDx2aWRlby9taXBpX2Rpc3BsYXkuaD4KICNpbmNsdWRlIDx2aWRlby92aWRlb21vZGUuaD4KQEAgLTEzNzgsMTYgKzEzNzksNjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGV4eW5vc19kc2lfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpOworCWludCByZXQ7CisKKwlyZXQgPSBleHlub3NfZHJtX2NyZWF0ZV9lbmNfY29ubihkcm1fZGV2LCAmZXh5bm9zX2RzaV9kaXNwbGF5KTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiRW5jb2RlciBjcmVhdGUgWyVkXSBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCQlleHlub3NfZHNpX2Rpc3BsYXkudHlwZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkc2kgPSBleHlub3NfZHNpX2Rpc3BsYXkuY3R4OworCisJcmV0dXJuIG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoJmRzaS0+ZHNpX2hvc3QpOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHNpX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBleHlub3NfZHNpX2Rpc3BsYXkuY3R4OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGRzaS0+ZW5jb2RlcjsKKworCWV4eW5vc19kc2lfZHBtcygmZXh5bm9zX2RzaV9kaXNwbGF5LCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwltaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoJmRzaS0+ZHNpX2hvc3QpOworCisJZW5jb2Rlci0+ZnVuY3MtPmRlc3Ryb3koZW5jb2Rlcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKCZkc2ktPmNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBleHlub3NfZHNpX2NvbXBvbmVudF9vcHMgPSB7CisJLmJpbmQJPSBleHlub3NfZHNpX2JpbmQsCisJLnVuYmluZAk9IGV4eW5vc19kc2lfdW5iaW5kLAorfTsKKwogc3RhdGljIGludCBleHlub3NfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGV4eW5vc19kc2kgKmRzaTsKIAlpbnQgcmV0OwogCisJcmV0ID0gZXh5bm9zX2RybV9jb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IsCisJCQkJCWV4eW5vc19kc2lfZGlzcGxheS50eXBlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJZHNpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkc2kpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRzaSBvYmplY3QuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CiAJfQogCiAJaW5pdF9jb21wbGV0aW9uKCZkc2ktPmNvbXBsZXRlZCk7CkBAIC0xNDAxLDcgKzE0NDYsNyBAQAogCiAJcmV0ID0gZXh5bm9zX2RzaV9wYXJzZV9kdChkc2kpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CiAKIAlkc2ktPnN1cHBsaWVzWzBdLnN1cHBseSA9ICJ2ZGRjb3JlIjsKIAlkc2ktPnN1cHBsaWVzWzFdLnN1cHBseSA9ICJ2ZGRpbyI7CkBAIC0xNDE1LDMyICsxNDYwLDM3IEBACiAJZHNpLT5wbGxfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwbGxfY2xrIik7CiAJaWYgKElTX0VSUihkc2ktPnBsbF9jbGspKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGRzaSBwbGwgaW5wdXQgY2xvY2tcbiIpOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJcmV0ID0gUFRSX0VSUihkc2ktPnBsbF9jbGspOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAogCWRzaS0+YnVzX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYnVzX2NsayIpOwogCWlmIChJU19FUlIoZHNpLT5idXNfY2xrKSkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBkc2kgYnVzIGNsb2NrXG4iKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCXJldCA9IFBUUl9FUlIoZHNpLT5idXNfY2xrKTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKIAl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWRzaS0+cmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGRzaS0+cmVnX2Jhc2UpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBpbyByZWdpb25cbiIpOwotCQlyZXR1cm4gUFRSX0VSUihkc2ktPnJlZ19iYXNlKTsKKwkJcmV0ID0gUFRSX0VSUihkc2ktPnJlZ19iYXNlKTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKIAl9CiAKIAlkc2ktPnBoeSA9IGRldm1fcGh5X2dldCgmcGRldi0+ZGV2LCAiZHNpbSIpOwogCWlmIChJU19FUlIoZHNpLT5waHkpKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGRzaW0gcGh5XG4iKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCXJldCA9IFBUUl9FUlIoZHNpLT5waHkpOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAogCWRzaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoZHNpLT5pcnEgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGRzaSBpcnEgcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gZHNpLT5pcnE7CisJCXJldCA9IGRzaS0+aXJxOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAogCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGRzaS0+aXJxLCBJUlFfTk9BVVRPRU4pOwpAQCAtMTQ0OSw1OSArMTQ5OSwzMiBAQAogCQkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgZHNpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGRzaSBpcnFcbiIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAogCWV4eW5vc19kc2lfZGlzcGxheS5jdHggPSBkc2k7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmZXh5bm9zX2RzaV9kaXNwbGF5KTsKLQlleHlub3NfZHJtX2Rpc3BsYXlfcmVnaXN0ZXIoJmV4eW5vc19kc2lfZGlzcGxheSk7CiAKLQlyZXR1cm4gbWlwaV9kc2lfaG9zdF9yZWdpc3RlcigmZHNpLT5kc2lfaG9zdCk7CisJcmV0ID0gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmZXh5bm9zX2RzaV9jb21wb25lbnRfb3BzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OworCisJcmV0dXJuIHJldDsKKworZXJyX2RlbF9jb21wb25lbnQ6CisJZXh5bm9zX2RybV9jb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZXh5bm9zX2RzaV9kaXNwbGF5LmN0eDsKLQotCWV4eW5vc19kc2lfZHBtcygmZXh5bm9zX2RzaV9kaXNwbGF5LCBEUk1fTU9ERV9EUE1TX09GRik7Ci0KLQlleHlub3NfZHJtX2Rpc3BsYXlfdW5yZWdpc3RlcigmZXh5bm9zX2RzaV9kaXNwbGF5KTsKLQltaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoJmRzaS0+ZHNpX2hvc3QpOworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmV4eW5vc19kc2lfY29tcG9uZW50X29wcyk7CisJZXh5bm9zX2RybV9jb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpOwogCiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgZXh5bm9zX2RzaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBleHlub3NfZHNpX2Rpc3BsYXkuY3R4OwotCi0JaWYgKGRzaS0+c3RhdGUgJiBEU0lNX1NUQVRFX0VOQUJMRUQpIHsKLQkJZHNpLT5zdGF0ZSAmPSB+RFNJTV9TVEFURV9FTkFCTEVEOwotCQlleHlub3NfZHNpX2VuYWJsZShkc2kpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4eW5vc19kc2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGV4eW5vc19kc2kgKmRzaSA9IGV4eW5vc19kc2lfZGlzcGxheS5jdHg7Ci0KLQlpZiAoZHNpLT5zdGF0ZSAmIERTSU1fU1RBVEVfRU5BQkxFRCkgewotCQlleHlub3NfZHNpX2Rpc2FibGUoZHNpKTsKLQkJZHNpLT5zdGF0ZSB8PSBEU0lNX1NUQVRFX0VOQUJMRUQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGV4eW5vc19kc2lfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGV4eW5vc19kc2lfc3VzcGVuZCwgZXh5bm9zX2RzaV9yZXN1bWUpCi19OwotCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBleHlub3NfZHNpX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtbWlwaS1kc2kiIH0sCiAJeyB9CkBAIC0xNTEzLDcgKzE1MzYsNiBAQAogCS5kcml2ZXIgPSB7CiAJCSAgIC5uYW1lID0gImV4eW5vcy1kc2kiLAogCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgLnBtID0gJmV4eW5vc19kc2lfcG1fb3BzLAogCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBleHlub3NfZHNpX29mX21hdGNoLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuYwppbmRleCBhZGRiZjc1Li5kNzcxYjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuYwpAQCAtMTIxLDE2ICsxMjEsOCBAQAogCW9mZnNldCA9IGZiaS0+dmFyLnhvZmZzZXQgKiAoZmItPmJpdHNfcGVyX3BpeGVsID4+IDMpOwogCW9mZnNldCArPSBmYmktPnZhci55b2Zmc2V0ICogZmItPnBpdGNoZXNbMF07CiAKLQlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSAocmVzb3VyY2Vfc2l6ZV90KWJ1ZmZlci0+ZG1hX2FkZHI7CiAJZmJpLT5zY3JlZW5fYmFzZSA9IGJ1ZmZlci0+a3ZhZGRyICsgb2Zmc2V0OwotCWlmIChpc19kcm1faW9tbXVfc3VwcG9ydGVkKGRldikpCi0JCWZiaS0+Zml4LnNtZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykKLQkJCShwYWdlX3RvX3BoeXMoc2dfcGFnZShidWZmZXItPnNndC0+c2dsKSkgKyBvZmZzZXQpOwotCWVsc2UKLQkJZmJpLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWJ1ZmZlci0+ZG1hX2FkZHI7Ci0KIAlmYmktPnNjcmVlbl9zaXplID0gc2l6ZTsKLQlmYmktPmZpeC5zbWVtX2xlbiA9IHNpemU7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNyw3ICsyMjksNyBAQAogCS5mYl9wcm9iZSA9CWV4eW5vc19kcm1fZmJkZXZfY3JlYXRlLAogfTsKIAotYm9vbCBleHlub3NfZHJtX2ZiZGV2X2lzX2FueXRoaW5nX2Nvbm5lY3RlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgZXh5bm9zX2RybV9mYmRldl9pc19hbnl0aGluZ19jb25uZWN0ZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCWJvb2wgcmV0ID0gZmFsc2U7CkBAIC0zNzUsNyArMzY3LDUgQEAKIAlpZiAoIXByaXZhdGUgfHwgIXByaXZhdGUtPmZiX2hlbHBlcikKIAkJcmV0dXJuOwogCi0JZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZShwcml2YXRlLT5mYl9oZWxwZXIpOwotCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKKwlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZChwcml2YXRlLT5mYl9oZWxwZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1jLmMKaW5kZXggMzBkNzZiMi4uODMxZGRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltYy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2V4eW5vc19kcm0uaD4KQEAgLTU3LDcgKzU4LDYgQEAKICNkZWZpbmUgRklNQ19TSEZBQ1RPUgkxMAogI2RlZmluZSBGSU1DX0JVRl9TVE9QCTEKICNkZWZpbmUgRklNQ19CVUZfU1RBUlQJMgotI2RlZmluZSBGSU1DX1JFR19TWgkJMzIKICNkZWZpbmUgRklNQ19XSURUSF9JVFVfNzA5CTEyODAKICNkZWZpbmUgRklNQ19SRUZSRVNIX01BWAk2MAogI2RlZmluZSBGSU1DX1JFRlJFU0hfTUlOCTEyCkBAIC02OSw5ICs2OSw2IEBACiAjZGVmaW5lIGdldF9maW1jX2NvbnRleHQoZGV2KQlwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSkKICNkZWZpbmUgZ2V0X2N0eF9mcm9tX2lwcGRydihpcHBkcnYpCWNvbnRhaW5lcl9vZihpcHBkcnYsXAogCQkJCQlzdHJ1Y3QgZmltY19jb250ZXh0LCBpcHBkcnYpOwotI2RlZmluZSBmaW1jX3JlYWQob2Zmc2V0KQkJcmVhZGwoY3R4LT5yZWdzICsgKG9mZnNldCkpCi0jZGVmaW5lIGZpbWNfd3JpdGUoY2ZnLCBvZmZzZXQpCXdyaXRlbChjZmcsIGN0eC0+cmVncyArIChvZmZzZXQpKQotCiBlbnVtIGZpbWNfd2IgewogCUZJTUNfV0JfTk9ORSwKIAlGSU1DX1dCX0EsCkBAIC0xNjEsNyArMTU4LDcgQEAKIAlzdHJ1Y3QgZXh5bm9zX2RybV9pcHBkcnYJaXBwZHJ2OwogCXN0cnVjdCByZXNvdXJjZQkqcmVnc19yZXM7CiAJdm9pZCBfX2lvbWVtCSpyZWdzOwotCXN0cnVjdCBtdXRleAlsb2NrOworCXNwaW5sb2NrX3QJbG9jazsKIAlzdHJ1Y3QgY2xrCSpjbG9ja3NbRklNQ19DTEtTX01BWF07CiAJdTMyCQljbGtfZnJlcXVlbmN5OwogCXN0cnVjdCByZWdtYXAJKnN5c3JlZzsKQEAgLTE3MiwzOSArMTY5LDUzIEBACiAJYm9vbAlzdXNwZW5kZWQ7CiB9OwogCitzdGF0aWMgdTMyIGZpbWNfcmVhZChzdHJ1Y3QgZmltY19jb250ZXh0ICpjdHgsIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKGN0eC0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfd3JpdGUoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCB1MzIgdmFsLCB1MzIgcmVnKQoreworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfc2V0X2JpdHMoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCB1MzIgcmVnLCB1MzIgYml0cykKK3sKKwl2b2lkIF9faW9tZW0gKnIgPSBjdHgtPnJlZ3MgKyByZWc7CisKKwl3cml0ZWwocmVhZGwocikgfCBiaXRzLCByKTsKK30KKworc3RhdGljIHZvaWQgZmltY19jbGVhcl9iaXRzKHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCwgdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdm9pZCBfX2lvbWVtICpyID0gY3R4LT5yZWdzICsgcmVnOworCisJd3JpdGVsKHJlYWRsKHIpICYgfmJpdHMsIHIpOworfQorCiBzdGF0aWMgdm9pZCBmaW1jX3N3X3Jlc2V0KHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCkKIHsKIAl1MzIgY2ZnOwogCiAJLyogc3RvcCBkbWEgb3BlcmF0aW9uICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVNUQVRVUyk7Ci0JaWYgKEVYWU5PU19DSVNUQVRVU19HRVRfRU5WSURfU1RBVFVTKGNmZykpIHsKLQkJY2ZnID0gZmltY19yZWFkKEVYWU5PU19NU0NUUkwpOwotCQljZmcgJj0gfkVYWU5PU19NU0NUUkxfRU5WSUQ7Ci0JCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfTVNDVFJMKTsKLQl9CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU1RBVFVTKTsKKwlpZiAoRVhZTk9TX0NJU1RBVFVTX0dFVF9FTlZJRF9TVEFUVVMoY2ZnKSkKKwkJZmltY19jbGVhcl9iaXRzKGN0eCwgRVhZTk9TX01TQ1RSTCwgRVhZTk9TX01TQ1RSTF9FTlZJRCk7CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJU1JDRk1UKTsKLQljZmcgfD0gRVhZTk9TX0NJU1JDRk1UX0lUVTYwMV84QklUOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lTUkNGTVQpOworCWZpbWNfc2V0X2JpdHMoY3R4LCBFWFlOT1NfQ0lTUkNGTVQsIEVYWU5PU19DSVNSQ0ZNVF9JVFU2MDFfOEJJVCk7CiAKIAkvKiBkaXNhYmxlIGltYWdlIGNhcHR1cmUgKi8KLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJSU1HQ1BUKTsKLQljZmcgJj0gfihFWFlOT1NfQ0lJTUdDUFRfSU1HQ1BURU5fU0MgfCBFWFlOT1NfQ0lJTUdDUFRfSU1HQ1BURU4pOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lJTUdDUFQpOworCWZpbWNfY2xlYXJfYml0cyhjdHgsIEVYWU5PU19DSUlNR0NQVCwKKwkJRVhZTk9TX0NJSU1HQ1BUX0lNR0NQVEVOX1NDIHwgRVhZTk9TX0NJSU1HQ1BUX0lNR0NQVEVOKTsKIAogCS8qIHMvdyByZXNldCAqLwotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lHQ1RSTCk7Ci0JY2ZnIHw9IChFWFlOT1NfQ0lHQ1RSTF9TV1JTVCk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSUdDVFJMKTsKKwlmaW1jX3NldF9iaXRzKGN0eCwgRVhZTk9TX0NJR0NUUkwsIEVYWU5PU19DSUdDVFJMX1NXUlNUKTsKIAogCS8qIHMvdyByZXNldCBjb21wbGV0ZSAqLwotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lHQ1RSTCk7Ci0JY2ZnICY9IH5FWFlOT1NfQ0lHQ1RSTF9TV1JTVDsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJR0NUUkwpOworCWZpbWNfY2xlYXJfYml0cyhjdHgsIEVYWU5PU19DSUdDVFJMLCBFWFlOT1NfQ0lHQ1RSTF9TV1JTVCk7CiAKIAkvKiByZXNldCBzZXF1ZW5jZSAqLwotCWZpbWNfd3JpdGUoMHgwLCBFWFlOT1NfQ0lGQ05UU0VRKTsKKwlmaW1jX3dyaXRlKGN0eCwgMHgwLCBFWFlOT1NfQ0lGQ05UU0VRKTsKIH0KIAogc3RhdGljIGludCBmaW1jX3NldF9jYW1ibGtfZmltZDBfd2Ioc3RydWN0IGZpbWNfY29udGV4dCAqY3R4KQpAQCAtMjIwLDcgKzIzMSw3IEBACiAKIAlEUk1fREVCVUdfS01TKCJ3YlslZF1cbiIsIHdiKTsKIAotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lHQ1RSTCk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJR0NUUkwpOwogCWNmZyAmPSB+KEVYWU5PU19DSUdDVFJMX1RFU1RQQVRURVJOX01BU0sgfAogCQlFWFlOT1NfQ0lHQ1RSTF9TRUxDQU1fSVRVX01BU0sgfAogCQlFWFlOT1NfQ0lHQ1RSTF9TRUxDQU1fTUlQSV9NQVNLIHwKQEAgLTI0Niw3ICsyNTcsNyBAQAogCQlicmVhazsKIAl9CiAKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJR0NUUkwpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSUdDVFJMKTsKIH0KIAogc3RhdGljIHZvaWQgZmltY19zZXRfcG9sYXJpdHkoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LApAQCAtMjU5LDcgKzI3MCw3IEBACiAJRFJNX0RFQlVHX0tNUygiaW52X2hyZWZbJWRdaW52X2hzeW5jWyVkXVxuIiwKIAkJcG9sLT5pbnZfaHJlZiwgcG9sLT5pbnZfaHN5bmMpOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUdDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lHQ1RSTCk7CiAJY2ZnICY9IH4oRVhZTk9TX0NJR0NUUkxfSU5WUE9MUENMSyB8IEVYWU5PU19DSUdDVFJMX0lOVlBPTFZTWU5DIHwKIAkJIEVYWU5PU19DSUdDVFJMX0lOVlBPTEhSRUYgfCBFWFlOT1NfQ0lHQ1RSTF9JTlZQT0xIU1lOQyk7CiAKQEAgLTI3Miw3ICsyODMsNyBAQAogCWlmIChwb2wtPmludl9oc3luYykKIAkJY2ZnIHw9IEVYWU5PU19DSUdDVFJMX0lOVlBPTEhTWU5DOwogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSUdDVFJMKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lHQ1RSTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpbWNfaGFuZGxlX2pwZWcoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCBib29sIGVuYWJsZSkKQEAgLTI4MSw3MCArMjkyLDU0IEBACiAKIAlEUk1fREVCVUdfS01TKCJlbmFibGVbJWRdXG4iLCBlbmFibGUpOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUdDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lHQ1RSTCk7CiAJaWYgKGVuYWJsZSkKIAkJY2ZnIHw9IEVYWU5PU19DSUdDVFJMX0NBTV9KUEVHOwogCWVsc2UKIAkJY2ZnICY9IH5FWFlOT1NfQ0lHQ1RSTF9DQU1fSlBFRzsKIAotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lHQ1RSTCk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJR0NUUkwpOwogfQogCi1zdGF0aWMgdm9pZCBmaW1jX2hhbmRsZV9pcnEoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCBib29sIGVuYWJsZSwKLQkJYm9vbCBvdmVyZmxvdywgYm9vbCBsZXZlbCkKK3N0YXRpYyB2b2lkIGZpbWNfbWFza19pcnEoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCBib29sIGVuYWJsZSkKIHsKIAl1MzIgY2ZnOwogCi0JRFJNX0RFQlVHX0tNUygiZW5hYmxlWyVkXW92ZXJmbG93WyVkXWxldmVsWyVkXVxuIiwKLQkJCWVuYWJsZSwgb3ZlcmZsb3csIGxldmVsKTsKKwlEUk1fREVCVUdfS01TKCJlbmFibGVbJWRdXG4iLCBlbmFibGUpOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUdDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lHQ1RSTCk7CiAJaWYgKGVuYWJsZSkgewotCQljZmcgJj0gfihFWFlOT1NfQ0lHQ1RSTF9JUlFfT1ZGRU4gfCBFWFlOT1NfQ0lHQ1RSTF9JUlFfTEVWRUwpOwotCQljZmcgfD0gRVhZTk9TX0NJR0NUUkxfSVJRX0VOQUJMRTsKLQkJaWYgKG92ZXJmbG93KQotCQkJY2ZnIHw9IEVYWU5PU19DSUdDVFJMX0lSUV9PVkZFTjsKLQkJaWYgKGxldmVsKQotCQkJY2ZnIHw9IEVYWU5PU19DSUdDVFJMX0lSUV9MRVZFTDsKKwkJY2ZnICY9IH5FWFlOT1NfQ0lHQ1RSTF9JUlFfT1ZGRU47CisJCWNmZyB8PSBFWFlOT1NfQ0lHQ1RSTF9JUlFfRU5BQkxFIHwgRVhZTk9TX0NJR0NUUkxfSVJRX0xFVkVMOwogCX0gZWxzZQotCQljZmcgJj0gfihFWFlOT1NfQ0lHQ1RSTF9JUlFfT1ZGRU4gfCBFWFlOT1NfQ0lHQ1RSTF9JUlFfRU5BQkxFKTsKLQotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lHQ1RSTCk7CisJCWNmZyAmPSB+RVhZTk9TX0NJR0NUUkxfSVJRX0VOQUJMRTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lHQ1RSTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpbWNfY2xlYXJfaXJxKHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCkKIHsKLQl1MzIgY2ZnOwotCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUdDVFJMKTsKLQljZmcgfD0gRVhZTk9TX0NJR0NUUkxfSVJRX0NMUjsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJR0NUUkwpOworCWZpbWNfc2V0X2JpdHMoY3R4LCBFWFlOT1NfQ0lHQ1RSTCwgRVhZTk9TX0NJR0NUUkxfSVJRX0NMUik7CiB9CiAKIHN0YXRpYyBib29sIGZpbWNfY2hlY2tfb3ZmKHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgZXh5bm9zX2RybV9pcHBkcnYgKmlwcGRydiA9ICZjdHgtPmlwcGRydjsKLQl1MzIgY2ZnLCBzdGF0dXMsIGZsYWc7CisJdTMyIHN0YXR1cywgZmxhZzsKIAotCXN0YXR1cyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lTVEFUVVMpOworCXN0YXR1cyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSVNUQVRVUyk7CiAJZmxhZyA9IEVYWU5PU19DSVNUQVRVU19PVkZJWSB8IEVYWU5PU19DSVNUQVRVU19PVkZJQ0IgfAogCQlFWFlOT1NfQ0lTVEFUVVNfT1ZGSUNSOwogCiAJRFJNX0RFQlVHX0tNUygiZmxhZ1sweCV4XVxuIiwgZmxhZyk7CiAKIAlpZiAoc3RhdHVzICYgZmxhZykgewotCQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJV0RPRlNUKTsKLQkJY2ZnIHw9IChFWFlOT1NfQ0lXRE9GU1RfQ0xST1ZGSVkgfCBFWFlOT1NfQ0lXRE9GU1RfQ0xST1ZGSUNCIHwKKwkJZmltY19zZXRfYml0cyhjdHgsIEVYWU5PU19DSVdET0ZTVCwKKwkJCUVYWU5PU19DSVdET0ZTVF9DTFJPVkZJWSB8IEVYWU5PU19DSVdET0ZTVF9DTFJPVkZJQ0IgfAogCQkJRVhZTk9TX0NJV0RPRlNUX0NMUk9WRklDUik7Ci0KLQkJZmltY193cml0ZShjZmcsIEVYWU5PU19DSVdET0ZTVCk7Ci0KLQkJY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVdET0ZTVCk7Ci0JCWNmZyAmPSB+KEVYWU5PU19DSVdET0ZTVF9DTFJPVkZJWSB8IEVYWU5PU19DSVdET0ZTVF9DTFJPVkZJQ0IgfAorCQlmaW1jX2NsZWFyX2JpdHMoY3R4LCBFWFlOT1NfQ0lXRE9GU1QsCisJCQlFWFlOT1NfQ0lXRE9GU1RfQ0xST1ZGSVkgfCBFWFlOT1NfQ0lXRE9GU1RfQ0xST1ZGSUNCIHwKIAkJCUVYWU5PU19DSVdET0ZTVF9DTFJPVkZJQ1IpOwogCi0JCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lXRE9GU1QpOwotCiAJCWRldl9lcnIoaXBwZHJ2LT5kZXYsICJvY2N1cnJlZCBvdmVyZmxvdyBhdCAlZCwgc3RhdHVzIDB4JXguXG4iLAogCQkJY3R4LT5pZCwgc3RhdHVzKTsKIAkJcmV0dXJuIHRydWU7CkBAIC0zNTcsNyArMzUyLDcgQEAKIHsKIAl1MzIgY2ZnOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVNUQVRVUyk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU1RBVFVTKTsKIAogCURSTV9ERUJVR19LTVMoImNmZ1sweCV4XVxuIiwgY2ZnKTsKIApAQCAtMzY1LDcgKzM2MCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWNmZyAmPSB+KEVYWU5PU19DSVNUQVRVU19GUkFNRUVORCk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSVNUQVRVUyk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU1RBVFVTKTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtMzc1LDcgKzM3MCw3IEBACiAJdTMyIGNmZzsKIAlpbnQgZnJhbWVfY250LCBidWZfaWQ7CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJU1RBVFVTMik7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU1RBVFVTMik7CiAJZnJhbWVfY250ID0gRVhZTk9TX0NJU1RBVFVTMl9HRVRfRlJBTUVDT1VOVF9CRUZPUkUoY2ZnKTsKIAogCWlmIChmcmFtZV9jbnQgPT0gMCkKQEAgLTQwMiwxMyArMzk3LDEzIEBACiAKIAlEUk1fREVCVUdfS01TKCJlbmFibGVbJWRdXG4iLCBlbmFibGUpOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSU9DVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lPQ1RSTCk7CiAJaWYgKGVuYWJsZSkKIAkJY2ZnIHw9IEVYWU5PU19DSU9DVFJMX0xBU1RFTkRFTjsKIAllbHNlCiAJCWNmZyAmPSB+RVhZTk9TX0NJT0NUUkxfTEFTVEVOREVOOwogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSU9DVFJMKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lPQ1RSTCk7CiB9CiAKIApAQCAtNDIwLDE4ICs0MTUsMTggQEAKIAlEUk1fREVCVUdfS01TKCJmbXRbMHgleF1cbiIsIGZtdCk7CiAKIAkvKiBSR0IgKi8KLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJU0NDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lTQ0NUUkwpOwogCWNmZyAmPSB+RVhZTk9TX0NJU0NDVFJMX0lOUkdCX0ZNVF9SR0JfTUFTSzsKIAogCXN3aXRjaCAoZm10KSB7CiAJY2FzZSBEUk1fRk9STUFUX1JHQjU2NToKIAkJY2ZnIHw9IEVYWU5PU19DSVNDQ1RSTF9JTlJHQl9GTVRfUkdCNTY1OwotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKKwkJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBEUk1fRk9STUFUX1JHQjg4ODoKIAljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6CiAJCWNmZyB8PSBFWFlOT1NfQ0lTQ0NUUkxfSU5SR0JfRk1UX1JHQjg4ODsKLQkJZmltY193cml0ZShjZmcsIEVYWU5PU19DSVNDQ1RSTCk7CisJCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSVNDQ1RSTCk7CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCS8qIGJ5cGFzcyAqLwpAQCAtNDM5LDcgKzQzNCw3IEBACiAJfQogCiAJLyogWVVWICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19NU0NUUkwpOworCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19NU0NUUkwpOwogCWNmZyAmPSB+KEVYWU5PU19NU0NUUkxfT1JERVIyUF9TSElGVF9NQVNLIHwKIAkJRVhZTk9TX01TQ1RSTF9DX0lOVF9JTl8yUExBTkUgfAogCQlFWFlOT1NfTVNDVFJMX09SREVSNDIyX1lDQllDUik7CkBAIC00NzksNyArNDc0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19NU0NUUkwpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19NU0NUUkwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTIsNyArNDg3LDcgQEAKIAogCURSTV9ERUJVR19LTVMoImZtdFsweCV4XVxuIiwgZm10KTsKIAotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfTVNDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfTVNDVFJMKTsKIAljZmcgJj0gfkVYWU5PU19NU0NUUkxfSU5GT1JNQVRfUkdCOwogCiAJc3dpdGNoIChmbXQpIHsKQEAgLTUyNyw5ICs1MjIsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX01TQ1RSTCk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX01TQ1RSTCk7CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJRE1BUEFSQU0pOworCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSURNQVBBUkFNKTsKIAljZmcgJj0gfkVYWU5PU19DSURNQVBBUkFNX1JfTU9ERV9NQVNLOwogCiAJaWYgKGZtdCA9PSBEUk1fRk9STUFUX05WMTJNVCkKQEAgLTUzNyw3ICs1MzIsNyBAQAogCWVsc2UKIAkJY2ZnIHw9IEVYWU5PU19DSURNQVBBUkFNX1JfTU9ERV9MSU5FQVI7CiAKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJRE1BUEFSQU0pOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSURNQVBBUkFNKTsKIAogCXJldHVybiBmaW1jX3NyY19zZXRfZm10X29yZGVyKGN0eCwgZm10KTsKIH0KQEAgLTU1MiwxMSArNTQ3LDExIEBACiAKIAlEUk1fREVCVUdfS01TKCJkZWdyZWVbJWRdZmxpcFsweCV4XVxuIiwgZGVncmVlLCBmbGlwKTsKIAotCWNmZzEgPSBmaW1jX3JlYWQoRVhZTk9TX01TQ1RSTCk7CisJY2ZnMSA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19NU0NUUkwpOwogCWNmZzEgJj0gfihFWFlOT1NfTVNDVFJMX0ZMSVBfWF9NSVJST1IgfAogCQlFWFlOT1NfTVNDVFJMX0ZMSVBfWV9NSVJST1IpOwogCi0JY2ZnMiA9IGZpbWNfcmVhZChFWFlOT1NfQ0lUUkdGTVQpOworCWNmZzIgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lUUkdGTVQpOwogCWNmZzIgJj0gfkVYWU5PU19DSVRSR0ZNVF9JTlJPVDkwX0NMT0NLV0lTRTsKIAogCXN3aXRjaCAoZGVncmVlKSB7CkBAIC01OTUsOCArNTkwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmltY193cml0ZShjZmcxLCBFWFlOT1NfTVNDVFJMKTsKLQlmaW1jX3dyaXRlKGNmZzIsIEVYWU5PU19DSVRSR0ZNVCk7CisJZmltY193cml0ZShjdHgsIGNmZzEsIEVYWU5PU19NU0NUUkwpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcyLCBFWFlOT1NfQ0lUUkdGTVQpOwogCSpzd2FwID0gKGNmZzIgJiBFWFlOT1NfQ0lUUkdGTVRfSU5ST1Q5MF9DTE9DS1dJU0UpID8gMSA6IDA7CiAKIAlyZXR1cm4gMDsKQEAgLTYyMSwxNyArNjE2LDE3IEBACiAJICogc2V0IHdpbmRvdyBvZmZzZXQgMSwgMiBzaXplCiAJICogY2hlY2sgZmlndXJlIDQzLTIxIGluIHVzZXIgbWFudWFsCiAJICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVdET0ZTVCk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJV0RPRlNUKTsKIAljZmcgJj0gfihFWFlOT1NfQ0lXRE9GU1RfV0lOSE9ST0ZTVF9NQVNLIHwKIAkJRVhZTk9TX0NJV0RPRlNUX1dJTlZFUk9GU1RfTUFTSyk7CiAJY2ZnIHw9IChFWFlOT1NfQ0lXRE9GU1RfV0lOSE9ST0ZTVChoMSkgfAogCQlFWFlOT1NfQ0lXRE9GU1RfV0lOVkVST0ZTVCh2MSkpOwogCWNmZyB8PSBFWFlOT1NfQ0lXRE9GU1RfV0lOT0ZTRU47Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSVdET0ZTVCk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJV0RPRlNUKTsKIAogCWNmZyA9IChFWFlOT1NfQ0lXRE9GU1QyX1dJTkhPUk9GU1QyKGgyKSB8CiAJCUVYWU5PU19DSVdET0ZTVDJfV0lOVkVST0ZTVDIodjIpKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJV0RPRlNUMik7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJV0RPRlNUMik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY1MSw3ICs2NDYsNyBAQAogCWNmZyA9IChFWFlOT1NfT1JHSVNJWkVfSE9SSVpPTlRBTChpbWdfc3ouaHNpemUpIHwKIAkJRVhZTk9TX09SR0lTSVpFX1ZFUlRJQ0FMKGltZ19zei52c2l6ZSkpOwogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19PUkdJU0laRSk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX09SR0lTSVpFKTsKIAogCURSTV9ERUJVR19LTVMoInhbJWRdeVslZF13WyVkXWhbJWRdXG4iLCBwb3MtPngsIHBvcy0+eSwgcG9zLT53LCBwb3MtPmgpOwogCkBAIC02NjMsMTIgKzY1OCwxMiBAQAogCX0KIAogCS8qIHNldCBpbnB1dCBETUEgaW1hZ2Ugc2l6ZSAqLwotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lSRUFMX0lTSVpFKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lSRUFMX0lTSVpFKTsKIAljZmcgJj0gfihFWFlOT1NfQ0lSRUFMX0lTSVpFX0hFSUdIVF9NQVNLIHwKIAkJRVhZTk9TX0NJUkVBTF9JU0laRV9XSURUSF9NQVNLKTsKIAljZmcgfD0gKEVYWU5PU19DSVJFQUxfSVNJWkVfV0lEVEgoaW1nX3Bvcy53KSB8CiAJCUVYWU5PU19DSVJFQUxfSVNJWkVfSEVJR0hUKGltZ19wb3MuaCkpOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lSRUFMX0lTSVpFKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lSRUFMX0lTSVpFKTsKIAogCS8qCiAJICogc2V0IGlucHV0IEZJRk8gaW1hZ2Ugc2l6ZQpAQCAtNjc3LDE4ICs2NzIsMTggQEAKIAljZmcgPSAoRVhZTk9TX0NJU1JDRk1UX0lUVTYwMV84QklUIHwKIAkJRVhZTk9TX0NJU1JDRk1UX1NPVVJDRUhTSVpFKGltZ19zei5oc2l6ZSkgfAogCQlFWFlOT1NfQ0lTUkNGTVRfU09VUkNFVlNJWkUoaW1nX3N6LnZzaXplKSk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSVNSQ0ZNVCk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU1JDRk1UKTsKIAogCS8qIG9mZnNldCBZKFJHQiksIENiLCBDciAqLwogCWNmZyA9IChFWFlOT1NfQ0lJWU9GRl9IT1JJWk9OVEFMKGltZ19wb3MueCkgfAogCQlFWFlOT1NfQ0lJWU9GRl9WRVJUSUNBTChpbWdfcG9zLnkpKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJSVlPRkYpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSUlZT0ZGKTsKIAljZmcgPSAoRVhZTk9TX0NJSUNCT0ZGX0hPUklaT05UQUwoaW1nX3Bvcy54KSB8CiAJCUVYWU5PU19DSUlDQk9GRl9WRVJUSUNBTChpbWdfcG9zLnkpKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJSUNCT0ZGKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lJQ0JPRkYpOwogCWNmZyA9IChFWFlOT1NfQ0lJQ1JPRkZfSE9SSVpPTlRBTChpbWdfcG9zLngpIHwKIAkJRVhZTk9TX0NJSUNST0ZGX1ZFUlRJQ0FMKGltZ19wb3MueSkpOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lJQ1JPRkYpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSUlDUk9GRik7CiAKIAlyZXR1cm4gZmltY19zZXRfd2luZG93KGN0eCwgJmltZ19wb3MsICZpbWdfc3opOwogfQpAQCAtNzIyLDI1ICs3MTcsMjUgQEAKIAlzd2l0Y2ggKGJ1Zl90eXBlKSB7CiAJY2FzZSBJUFBfQlVGX0VOUVVFVUU6CiAJCWNvbmZpZyA9ICZwcm9wZXJ0eS0+Y29uZmlnW0VYWU5PU19EUk1fT1BTX1NSQ107Ci0JCWZpbWNfd3JpdGUoYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfWV0sCisJCWZpbWNfd3JpdGUoY3R4LCBidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9ZXSwKIAkJCUVYWU5PU19DSUlZU0EoYnVmX2lkKSk7CiAKIAkJaWYgKGNvbmZpZy0+Zm10ID09IERSTV9GT1JNQVRfWVZVNDIwKSB7Ci0JCQlmaW1jX3dyaXRlKGJ1Zl9pbmZvLT5iYXNlW0VYWU5PU19EUk1fUExBTkFSX0NSXSwKKwkJCWZpbWNfd3JpdGUoY3R4LCBidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DUl0sCiAJCQkJRVhZTk9TX0NJSUNCU0EoYnVmX2lkKSk7Ci0JCQlmaW1jX3dyaXRlKGJ1Zl9pbmZvLT5iYXNlW0VYWU5PU19EUk1fUExBTkFSX0NCXSwKKwkJCWZpbWNfd3JpdGUoY3R4LCBidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DQl0sCiAJCQkJRVhZTk9TX0NJSUNSU0EoYnVmX2lkKSk7CiAJCX0gZWxzZSB7Ci0JCQlmaW1jX3dyaXRlKGJ1Zl9pbmZvLT5iYXNlW0VYWU5PU19EUk1fUExBTkFSX0NCXSwKKwkJCWZpbWNfd3JpdGUoY3R4LCBidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DQl0sCiAJCQkJRVhZTk9TX0NJSUNCU0EoYnVmX2lkKSk7Ci0JCQlmaW1jX3dyaXRlKGJ1Zl9pbmZvLT5iYXNlW0VYWU5PU19EUk1fUExBTkFSX0NSXSwKKwkJCWZpbWNfd3JpdGUoY3R4LCBidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DUl0sCiAJCQkJRVhZTk9TX0NJSUNSU0EoYnVmX2lkKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJUFBfQlVGX0RFUVVFVUU6Ci0JCWZpbWNfd3JpdGUoMHgwLCBFWFlOT1NfQ0lJWVNBKGJ1Zl9pZCkpOwotCQlmaW1jX3dyaXRlKDB4MCwgRVhZTk9TX0NJSUNCU0EoYnVmX2lkKSk7Ci0JCWZpbWNfd3JpdGUoMHgwLCBFWFlOT1NfQ0lJQ1JTQShidWZfaWQpKTsKKwkJZmltY193cml0ZShjdHgsIDB4MCwgRVhZTk9TX0NJSVlTQShidWZfaWQpKTsKKwkJZmltY193cml0ZShjdHgsIDB4MCwgRVhZTk9TX0NJSUNCU0EoYnVmX2lkKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAweDAsIEVYWU5PU19DSUlDUlNBKGJ1Zl9pZCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBieXBhc3MgKi8KQEAgLTc2NSwyMiArNzYwLDIyIEBACiAJRFJNX0RFQlVHX0tNUygiZm10WzB4JXhdXG4iLCBmbXQpOwogCiAJLyogUkdCICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVNDQ1RSTCk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU0NDVFJMKTsKIAljZmcgJj0gfkVYWU5PU19DSVNDQ1RSTF9PVVRSR0JfRk1UX1JHQl9NQVNLOwogCiAJc3dpdGNoIChmbXQpIHsKIAljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgogCQljZmcgfD0gRVhZTk9TX0NJU0NDVFJMX09VVFJHQl9GTVRfUkdCNTY1OwotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKKwkJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBEUk1fRk9STUFUX1JHQjg4ODoKIAkJY2ZnIHw9IEVYWU5PU19DSVNDQ1RSTF9PVVRSR0JfRk1UX1JHQjg4ODsKLQkJZmltY193cml0ZShjZmcsIEVYWU5PU19DSVNDQ1RSTCk7CisJCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSVNDQ1RSTCk7CiAJCXJldHVybiAwOwogCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKIAkJY2ZnIHw9IChFWFlOT1NfQ0lTQ0NUUkxfT1VUUkdCX0ZNVF9SR0I4ODggfAogCQkJRVhZTk9TX0NJU0NDVFJMX0VYVFJHQl9FWFRFTlNJT04pOwotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKKwkJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogYnlwYXNzICovCkBAIC03ODgsNyArNzgzLDcgQEAKIAl9CiAKIAkvKiBZVVYgKi8KLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJT0NUUkwpOworCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSU9DVFJMKTsKIAljZmcgJj0gfihFWFlOT1NfQ0lPQ1RSTF9PUkRFUjJQX01BU0sgfAogCQlFWFlOT1NfQ0lPQ1RSTF9PUkRFUjQyMl9NQVNLIHwKIAkJRVhZTk9TX0NJT0NUUkxfWUNCQ1JfUExBTkVfTUFTSyk7CkBAIC04MzAsNyArODI1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSU9DVFJMKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lPQ1RSTCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg0MywxNiArODM4LDE2IEBACiAKIAlEUk1fREVCVUdfS01TKCJmbXRbMHgleF1cbiIsIGZtdCk7CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJRVhURU4pOworCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSUVYVEVOKTsKIAogCWlmIChmbXQgPT0gRFJNX0ZPUk1BVF9BWVVWKSB7CiAJCWNmZyB8PSBFWFlOT1NfQ0lFWFRFTl9ZVVY0NDRfT1VUOwotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJRVhURU4pOworCQlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lFWFRFTik7CiAJfSBlbHNlIHsKIAkJY2ZnICY9IH5FWFlOT1NfQ0lFWFRFTl9ZVVY0NDRfT1VUOwotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJRVhURU4pOworCQlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lFWFRFTik7CiAKLQkJY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVRSR0ZNVCk7CisJCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSVRSR0ZNVCk7CiAJCWNmZyAmPSB+RVhZTk9TX0NJVFJHRk1UX09VVEZPUk1BVF9NQVNLOwogCiAJCXN3aXRjaCAoZm10KSB7CkBAIC04ODUsMTAgKzg4MCwxMCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJVFJHRk1UKTsKKwkJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJVFJHRk1UKTsKIAl9CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJRE1BUEFSQU0pOworCWNmZyA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSURNQVBBUkFNKTsKIAljZmcgJj0gfkVYWU5PU19DSURNQVBBUkFNX1dfTU9ERV9NQVNLOwogCiAJaWYgKGZtdCA9PSBEUk1fRk9STUFUX05WMTJNVCkKQEAgLTg5Niw3ICs4OTEsNyBAQAogCWVsc2UKIAkJY2ZnIHw9IEVYWU5PU19DSURNQVBBUkFNX1dfTU9ERV9MSU5FQVI7CiAKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJRE1BUEFSQU0pOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSURNQVBBUkFNKTsKIAogCXJldHVybiBmaW1jX2RzdF9zZXRfZm10X29yZGVyKGN0eCwgZm10KTsKIH0KQEAgLTkxMSw3ICs5MDYsNyBAQAogCiAJRFJNX0RFQlVHX0tNUygiZGVncmVlWyVkXWZsaXBbMHgleF1cbiIsIGRlZ3JlZSwgZmxpcCk7CiAKLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJVFJHRk1UKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lUUkdGTVQpOwogCWNmZyAmPSB+RVhZTk9TX0NJVFJHRk1UX0ZMSVBfTUFTSzsKIAljZmcgJj0gfkVYWU5PU19DSVRSR0ZNVF9PVVRST1Q5MF9DTE9DS1dJU0U7CiAKQEAgLTk1MSw1MyArOTQ2LDIzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lUUkdGTVQpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSVRSR0ZNVCk7CiAJKnN3YXAgPSAoY2ZnICYgRVhZTk9TX0NJVFJHRk1UX09VVFJPVDkwX0NMT0NLV0lTRSkgPyAxIDogMDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbWNfZ2V0X3JhdGlvX3NoaWZ0KHUzMiBzcmMsIHUzMiBkc3QsIHUzMiAqcmF0aW8sIHUzMiAqc2hpZnQpCi17Ci0JRFJNX0RFQlVHX0tNUygic3JjWyVkXWRzdFslZF1cbiIsIHNyYywgZHN0KTsKLQotCWlmIChzcmMgPj0gZHN0ICogNjQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbWFrZSByYXRpbyBhbmQgc2hpZnQuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChzcmMgPj0gZHN0ICogMzIpIHsKLQkJKnJhdGlvID0gMzI7Ci0JCSpzaGlmdCA9IDU7Ci0JfSBlbHNlIGlmIChzcmMgPj0gZHN0ICogMTYpIHsKLQkJKnJhdGlvID0gMTY7Ci0JCSpzaGlmdCA9IDQ7Ci0JfSBlbHNlIGlmIChzcmMgPj0gZHN0ICogOCkgewotCQkqcmF0aW8gPSA4OwotCQkqc2hpZnQgPSAzOwotCX0gZWxzZSBpZiAoc3JjID49IGRzdCAqIDQpIHsKLQkJKnJhdGlvID0gNDsKLQkJKnNoaWZ0ID0gMjsKLQl9IGVsc2UgaWYgKHNyYyA+PSBkc3QgKiAyKSB7Ci0JCSpyYXRpbyA9IDI7Ci0JCSpzaGlmdCA9IDE7Ci0JfSBlbHNlIHsKLQkJKnJhdGlvID0gMTsKLQkJKnNoaWZ0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmaW1jX3NldF9wcmVzY2FsZXIoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZmltY19zY2FsZXIgKnNjLAogCQlzdHJ1Y3QgZHJtX2V4eW5vc19wb3MgKnNyYywgc3RydWN0IGRybV9leHlub3NfcG9zICpkc3QpCiB7CiAJc3RydWN0IGV4eW5vc19kcm1faXBwZHJ2ICppcHBkcnYgPSAmY3R4LT5pcHBkcnY7CiAJdTMyIGNmZywgY2ZnX2V4dCwgc2hmYWN0b3I7CiAJdTMyIHByZV9kc3Rfd2lkdGgsIHByZV9kc3RfaGVpZ2h0OwotCXUzMiBwcmVfaHJhdGlvLCBoZmFjdG9yLCBwcmVfdnJhdGlvLCB2ZmFjdG9yOworCXUzMiBoZmFjdG9yLCB2ZmFjdG9yOwogCWludCByZXQgPSAwOwogCXUzMiBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaDsKIAotCWNmZ19leHQgPSBmaW1jX3JlYWQoRVhZTk9TX0NJVFJHRk1UKTsKKwljZmdfZXh0ID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJVFJHRk1UKTsKIAlpZiAoY2ZnX2V4dCAmIEVYWU5PU19DSVRSR0ZNVF9JTlJPVDkwX0NMT0NLV0lTRSkgewogCQlzcmNfdyA9IHNyYy0+aDsKIAkJc3JjX2ggPSBzcmMtPnc7CkBAIC0xMDE0LDI0ICs5NzksMjQgQEAKIAkJZHN0X2ggPSBkc3QtPmg7CiAJfQogCi0JcmV0ID0gZmltY19nZXRfcmF0aW9fc2hpZnQoc3JjX3csIGRzdF93LCAmcHJlX2hyYXRpbywgJmhmYWN0b3IpOwotCWlmIChyZXQpIHsKKwkvKiBmaW1jX2lwcGRydl9jaGVja19wcm9wZXJ0eSBhc3N1cmVzIHRoYXQgZGl2aWRlcnMgYXJlIG5vdCBudWxsICovCisJaGZhY3RvciA9IGZscyhzcmNfdyAvIGRzdF93IC8gMik7CisJaWYgKGhmYWN0b3IgPiBGSU1DX1NIRkFDVE9SIC8gMikgewogCQlkZXZfZXJyKGlwcGRydi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByYXRpbyBob3Jpem9udGFsLlxuIik7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IGZpbWNfZ2V0X3JhdGlvX3NoaWZ0KHNyY19oLCBkc3RfaCwgJnByZV92cmF0aW8sICZ2ZmFjdG9yKTsKLQlpZiAocmV0KSB7CisJdmZhY3RvciA9IGZscyhzcmNfaCAvIGRzdF9oIC8gMik7CisJaWYgKHZmYWN0b3IgPiBGSU1DX1NIRkFDVE9SIC8gMikgewogCQlkZXZfZXJyKGlwcGRydi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByYXRpbyB2ZXJ0aWNhbC5cbiIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcmVfZHN0X3dpZHRoID0gc3JjX3cgLyBwcmVfaHJhdGlvOwotCXByZV9kc3RfaGVpZ2h0ID0gc3JjX2ggLyBwcmVfdnJhdGlvOworCXByZV9kc3Rfd2lkdGggPSBzcmNfdyA+PiBoZmFjdG9yOworCXByZV9kc3RfaGVpZ2h0ID0gc3JjX2ggPj4gdmZhY3RvcjsKIAlEUk1fREVCVUdfS01TKCJwcmVfZHN0X3dpZHRoWyVkXXByZV9kc3RfaGVpZ2h0WyVkXVxuIiwKIAkJcHJlX2RzdF93aWR0aCwgcHJlX2RzdF9oZWlnaHQpOwotCURSTV9ERUJVR19LTVMoInByZV9ocmF0aW9bJWRdaGZhY3RvclslZF1wcmVfdnJhdGlvWyVkXXZmYWN0b3JbJWRdXG4iLAotCQlwcmVfaHJhdGlvLCBoZmFjdG9yLCBwcmVfdnJhdGlvLCB2ZmFjdG9yKTsKKwlEUk1fREVCVUdfS01TKCJoZmFjdG9yWyVkXXZmYWN0b3JbJWRdXG4iLCBoZmFjdG9yLCB2ZmFjdG9yKTsKIAogCXNjLT5ocmF0aW8gPSAoc3JjX3cgPDwgMTQpIC8gKGRzdF93IDw8IGhmYWN0b3IpOwogCXNjLT52cmF0aW8gPSAoc3JjX2ggPDwgMTQpIC8gKGRzdF9oIDw8IHZmYWN0b3IpOwpAQCAtMTA0NCwxMyArMTAwOSwxMyBAQAogCURSTV9ERUJVR19LTVMoInNoZmFjdG9yWyVkXVxuIiwgc2hmYWN0b3IpOwogCiAJY2ZnID0gKEVYWU5PU19DSVNDUFJFUkFUSU9fU0hGQUNUT1Ioc2hmYWN0b3IpIHwKLQkJRVhZTk9TX0NJU0NQUkVSQVRJT19QUkVIT1JSQVRJTyhwcmVfaHJhdGlvKSB8Ci0JCUVYWU5PU19DSVNDUFJFUkFUSU9fUFJFVkVSUkFUSU8ocHJlX3ZyYXRpbykpOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lTQ1BSRVJBVElPKTsKKwkJRVhZTk9TX0NJU0NQUkVSQVRJT19QUkVIT1JSQVRJTygxIDw8IGhmYWN0b3IpIHwKKwkJRVhZTk9TX0NJU0NQUkVSQVRJT19QUkVWRVJSQVRJTygxIDw8IHZmYWN0b3IpKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lTQ1BSRVJBVElPKTsKIAogCWNmZyA9IChFWFlOT1NfQ0lTQ1BSRURTVF9QUkVEU1RXSURUSChwcmVfZHN0X3dpZHRoKSB8CiAJCUVYWU5PU19DSVNDUFJFRFNUX1BSRURTVEhFSUdIVChwcmVfZHN0X2hlaWdodCkpOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lTQ1BSRURTVCk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJU0NQUkVEU1QpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNjQsNyArMTAyOSw3IEBACiAJRFJNX0RFQlVHX0tNUygiaHJhdGlvWyVkXXZyYXRpb1slZF1cbiIsCiAJCXNjLT5ocmF0aW8sIHNjLT52cmF0aW8pOwogCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVNDQ1RSTCk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU0NDVFJMKTsKIAljZmcgJj0gfihFWFlOT1NfQ0lTQ0NUUkxfU0NBTEVSQllQQVNTIHwKIAkJRVhZTk9TX0NJU0NDVFJMX1NDQUxFVVBfSCB8IEVYWU5PU19DSVNDQ1RSTF9TQ0FMRVVQX1YgfAogCQlFWFlOT1NfQ0lTQ0NUUkxfTUFJTl9WX1JBVElPX01BU0sgfApAQCAtMTA4NCwxNCArMTA0OSwxNCBAQAogCiAJY2ZnIHw9IChFWFlOT1NfQ0lTQ0NUUkxfTUFJTkhPUlJBVElPKChzYy0+aHJhdGlvID4+IDYpKSB8CiAJCUVYWU5PU19DSVNDQ1RSTF9NQUlOVkVSUkFUSU8oKHNjLT52cmF0aW8gPj4gNikpKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJU0NDVFJMKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lTQ0NUUkwpOwogCi0JY2ZnX2V4dCA9IGZpbWNfcmVhZChFWFlOT1NfQ0lFWFRFTik7CisJY2ZnX2V4dCA9IGZpbWNfcmVhZChjdHgsIEVYWU5PU19DSUVYVEVOKTsKIAljZmdfZXh0ICY9IH5FWFlOT1NfQ0lFWFRFTl9NQUlOSE9SUkFUSU9fRVhUX01BU0s7CiAJY2ZnX2V4dCAmPSB+RVhZTk9TX0NJRVhURU5fTUFJTlZFUlJBVElPX0VYVF9NQVNLOwogCWNmZ19leHQgfD0gKEVYWU5PU19DSUVYVEVOX01BSU5IT1JSQVRJT19FWFQoc2MtPmhyYXRpbykgfAogCQlFWFlOT1NfQ0lFWFRFTl9NQUlOVkVSUkFUSU9fRVhUKHNjLT52cmF0aW8pKTsKLQlmaW1jX3dyaXRlKGNmZ19leHQsIEVYWU5PU19DSUVYVEVOKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnX2V4dCwgRVhZTk9TX0NJRVhURU4pOwogfQogCiBzdGF0aWMgaW50IGZpbWNfZHN0X3NldF9zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHN3YXAsCkBAIC0xMTA5LDEyICsxMDc0LDEyIEBACiAJY2ZnID0gKEVYWU5PU19PUkdPU0laRV9IT1JJWk9OVEFMKGltZ19zei5oc2l6ZSkgfAogCQlFWFlOT1NfT1JHT1NJWkVfVkVSVElDQUwoaW1nX3N6LnZzaXplKSk7CiAKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX09SR09TSVpFKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfT1JHT1NJWkUpOwogCiAJRFJNX0RFQlVHX0tNUygieFslZF15WyVkXXdbJWRdaFslZF1cbiIsIHBvcy0+eCwgcG9zLT55LCBwb3MtPncsIHBvcy0+aCk7CiAKIAkvKiBDU0MgSVRVICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUdDVFJMKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lHQ1RSTCk7CiAJY2ZnICY9IH5FWFlOT1NfQ0lHQ1RSTF9DU0NfTUFTSzsKIAogCWlmIChzei0+aHNpemUgPj0gRklNQ19XSURUSF9JVFVfNzA5KQpAQCAtMTEyMiw3ICsxMDg3LDcgQEAKIAllbHNlCiAJCWNmZyB8PSBFWFlOT1NfQ0lHQ1RSTF9DU0NfSVRVNjAxOwogCi0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSUdDVFJMKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lHQ1RSTCk7CiAKIAlpZiAoc3dhcCkgewogCQlpbWdfcG9zLncgPSBwb3MtPmg7CkBAIC0xMTMyLDQxICsxMDk3LDM4IEBACiAJfQogCiAJLyogdGFyZ2V0IGltYWdlIHNpemUgKi8KLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJVFJHRk1UKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lUUkdGTVQpOwogCWNmZyAmPSB+KEVYWU5PU19DSVRSR0ZNVF9UQVJHRVRIX01BU0sgfAogCQlFWFlOT1NfQ0lUUkdGTVRfVEFSR0VUVl9NQVNLKTsKIAljZmcgfD0gKEVYWU5PU19DSVRSR0ZNVF9UQVJHRVRIU0laRShpbWdfcG9zLncpIHwKIAkJRVhZTk9TX0NJVFJHRk1UX1RBUkdFVFZTSVpFKGltZ19wb3MuaCkpOwotCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfQ0lUUkdGTVQpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcsIEVYWU5PU19DSVRSR0ZNVCk7CiAKIAkvKiB0YXJnZXQgYXJlYSAqLwogCWNmZyA9IEVYWU5PU19DSVRBUkVBX1RBUkdFVF9BUkVBKGltZ19wb3MudyAqIGltZ19wb3MuaCk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSVRBUkVBKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lUQVJFQSk7CiAKIAkvKiBvZmZzZXQgWShSR0IpLCBDYiwgQ3IgKi8KIAljZmcgPSAoRVhZTk9TX0NJT1lPRkZfSE9SSVpPTlRBTChpbWdfcG9zLngpIHwKIAkJRVhZTk9TX0NJT1lPRkZfVkVSVElDQUwoaW1nX3Bvcy55KSk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSU9ZT0ZGKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lPWU9GRik7CiAJY2ZnID0gKEVYWU5PU19DSU9DQk9GRl9IT1JJWk9OVEFMKGltZ19wb3MueCkgfAogCQlFWFlOT1NfQ0lPQ0JPRkZfVkVSVElDQUwoaW1nX3Bvcy55KSk7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSU9DQk9GRik7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJT0NCT0ZGKTsKIAljZmcgPSAoRVhZTk9TX0NJT0NST0ZGX0hPUklaT05UQUwoaW1nX3Bvcy54KSB8CiAJCUVYWU5PU19DSU9DUk9GRl9WRVJUSUNBTChpbWdfcG9zLnkpKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJT0NST0ZGKTsKKwlmaW1jX3dyaXRlKGN0eCwgY2ZnLCBFWFlOT1NfQ0lPQ1JPRkYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19kc3RfZ2V0X2J1Zl9zZXEoc3RydWN0IGZpbWNfY29udGV4dCAqY3R4KQorc3RhdGljIGludCBmaW1jX2RzdF9nZXRfYnVmX2NvdW50KHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCkKIHsKLQl1MzIgY2ZnLCBpLCBidWZfbnVtID0gMDsKLQl1MzIgbWFzayA9IDB4MDAwMDAwMDE7CisJdTMyIGNmZywgYnVmX251bTsKIAotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lGQ05UU0VRKTsKKwljZmcgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lGQ05UU0VRKTsKIAotCWZvciAoaSA9IDA7IGkgPCBGSU1DX1JFR19TWjsgaSsrKQotCQlpZiAoY2ZnICYgKG1hc2sgPDwgaSkpCi0JCQlidWZfbnVtKys7CisJYnVmX251bSA9IGh3ZWlnaHQzMihjZmcpOwogCiAJRFJNX0RFQlVHX0tNUygiYnVmX251bVslZF1cbiIsIGJ1Zl9udW0pOwogCkBAIC0xMTgxLDEzICsxMTQzLDE0IEBACiAJdTMyIGNmZzsKIAl1MzIgbWFzayA9IDB4MDAwMDAwMDEgPDwgYnVmX2lkOwogCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlEUk1fREVCVUdfS01TKCJidWZfaWRbJWRdYnVmX3R5cGVbJWRdXG4iLCBidWZfaWQsIGJ1Zl90eXBlKTsKIAotCW11dGV4X2xvY2soJmN0eC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgZmxhZ3MpOwogCiAJLyogbWFzayByZWdpc3RlciBzZXQgKi8KLQljZmcgPSBmaW1jX3JlYWQoRVhZTk9TX0NJRkNOVFNFUSk7CisJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJRkNOVFNFUSk7CiAKIAlzd2l0Y2ggKGJ1Zl90eXBlKSB7CiAJY2FzZSBJUFBfQlVGX0VOUVVFVUU6CkBAIC0xMjA1LDIwICsxMTY4LDIwIEBACiAJLyogc2VxdWVuY2UgaWQgKi8KIAljZmcgJj0gfm1hc2s7CiAJY2ZnIHw9IChlbmFibGUgPDwgYnVmX2lkKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJRkNOVFNFUSk7CisJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX0NJRkNOVFNFUSk7CiAKIAkvKiBpbnRlcnJ1cHQgZW5hYmxlICovCiAJaWYgKGJ1Zl90eXBlID09IElQUF9CVUZfRU5RVUVVRSAmJgotCSAgICBmaW1jX2RzdF9nZXRfYnVmX3NlcShjdHgpID49IEZJTUNfQlVGX1NUQVJUKQotCQlmaW1jX2hhbmRsZV9pcnEoY3R4LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisJICAgIGZpbWNfZHN0X2dldF9idWZfY291bnQoY3R4KSA+PSBGSU1DX0JVRl9TVEFSVCkKKwkJZmltY19tYXNrX2lycShjdHgsIHRydWUpOwogCiAJLyogaW50ZXJydXB0IGRpc2FibGUgKi8KIAlpZiAoYnVmX3R5cGUgPT0gSVBQX0JVRl9ERVFVRVVFICYmCi0JICAgIGZpbWNfZHN0X2dldF9idWZfc2VxKGN0eCkgPD0gRklNQ19CVUZfU1RPUCkKLQkJZmltY19oYW5kbGVfaXJxKGN0eCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkgICAgZmltY19kc3RfZ2V0X2J1Zl9jb3VudChjdHgpIDw9IEZJTUNfQlVGX1NUT1ApCisJCWZpbWNfbWFza19pcnEoY3R4LCBmYWxzZSk7CiAKIGVycl91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjdHgtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyNTIsMjUgKzEyMTUsMjUgQEAKIAljYXNlIElQUF9CVUZfRU5RVUVVRToKIAkJY29uZmlnID0gJnByb3BlcnR5LT5jb25maWdbRVhZTk9TX0RSTV9PUFNfRFNUXTsKIAotCQlmaW1jX3dyaXRlKGJ1Zl9pbmZvLT5iYXNlW0VYWU5PU19EUk1fUExBTkFSX1ldLAorCQlmaW1jX3dyaXRlKGN0eCwgYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfWV0sCiAJCQlFWFlOT1NfQ0lPWVNBKGJ1Zl9pZCkpOwogCiAJCWlmIChjb25maWctPmZtdCA9PSBEUk1fRk9STUFUX1lWVTQyMCkgewotCQkJZmltY193cml0ZShidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DUl0sCisJCQlmaW1jX3dyaXRlKGN0eCwgYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfQ1JdLAogCQkJCUVYWU5PU19DSU9DQlNBKGJ1Zl9pZCkpOwotCQkJZmltY193cml0ZShidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DQl0sCisJCQlmaW1jX3dyaXRlKGN0eCwgYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfQ0JdLAogCQkJCUVYWU5PU19DSU9DUlNBKGJ1Zl9pZCkpOwogCQl9IGVsc2UgewotCQkJZmltY193cml0ZShidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DQl0sCisJCQlmaW1jX3dyaXRlKGN0eCwgYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfQ0JdLAogCQkJCUVYWU5PU19DSU9DQlNBKGJ1Zl9pZCkpOwotCQkJZmltY193cml0ZShidWZfaW5mby0+YmFzZVtFWFlOT1NfRFJNX1BMQU5BUl9DUl0sCisJCQlmaW1jX3dyaXRlKGN0eCwgYnVmX2luZm8tPmJhc2VbRVhZTk9TX0RSTV9QTEFOQVJfQ1JdLAogCQkJCUVYWU5PU19DSU9DUlNBKGJ1Zl9pZCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVBQX0JVRl9ERVFVRVVFOgotCQlmaW1jX3dyaXRlKDB4MCwgRVhZTk9TX0NJT1lTQShidWZfaWQpKTsKLQkJZmltY193cml0ZSgweDAsIEVYWU5PU19DSU9DQlNBKGJ1Zl9pZCkpOwotCQlmaW1jX3dyaXRlKDB4MCwgRVhZTk9TX0NJT0NSU0EoYnVmX2lkKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAweDAsIEVYWU5PU19DSU9ZU0EoYnVmX2lkKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAweDAsIEVYWU5PU19DSU9DQlNBKGJ1Zl9pZCkpOworCQlmaW1jX3dyaXRlKGN0eCwgMHgwLCBFWFlOT1NfQ0lPQ1JTQShidWZfaWQpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogYnlwYXNzICovCkBAIC0xMzQyLDExICsxMzA1LDcgQEAKIAogc3RhdGljIGludCBmaW1jX2luaXRfcHJvcF9saXN0KHN0cnVjdCBleHlub3NfZHJtX2lwcGRydiAqaXBwZHJ2KQogewotCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9wcm9wX2xpc3QgKnByb3BfbGlzdDsKLQotCXByb3BfbGlzdCA9IGRldm1fa3phbGxvYyhpcHBkcnYtPmRldiwgc2l6ZW9mKCpwcm9wX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3BfbGlzdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHJvcF9saXN0ID0gJmlwcGRydi0+cHJvcF9saXN0OwogCiAJcHJvcF9saXN0LT52ZXJzaW9uID0gMTsKIAlwcm9wX2xpc3QtPndyaXRlYmFjayA9IDE7CkBAIC0xMzcxLDggKzEzMzAsNiBAQAogCXByb3BfbGlzdC0+c2NhbGVfbWluLmhzaXplID0gRklNQ19TQ0FMRV9NSU47CiAJcHJvcF9saXN0LT5zY2FsZV9taW4udnNpemUgPSBGSU1DX1NDQUxFX01JTjsKIAotCWlwcGRydi0+cHJvcF9saXN0ID0gcHJvcF9saXN0OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTUsNyArMTM1Miw3IEBACiB7CiAJc3RydWN0IGZpbWNfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWNfY29udGV4dChkZXYpOwogCXN0cnVjdCBleHlub3NfZHJtX2lwcGRydiAqaXBwZHJ2ID0gJmN0eC0+aXBwZHJ2OwotCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9wcm9wX2xpc3QgKnBwID0gaXBwZHJ2LT5wcm9wX2xpc3Q7CisJc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHAgPSAmaXBwZHJ2LT5wcm9wX2xpc3Q7CiAJc3RydWN0IGRybV9leHlub3NfaXBwX2NvbmZpZyAqY29uZmlnOwogCXN0cnVjdCBkcm1fZXh5bm9zX3BvcyAqcG9zOwogCXN0cnVjdCBkcm1fZXh5bm9zX3N6ICpzejsKQEAgLTE1MDgsMTUgKzE0NjUsMTUgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9TUkM7IGkrKykgewotCQlmaW1jX3dyaXRlKDAsIEVYWU5PU19DSUlZU0EoaSkpOwotCQlmaW1jX3dyaXRlKDAsIEVYWU5PU19DSUlDQlNBKGkpKTsKLQkJZmltY193cml0ZSgwLCBFWFlOT1NfQ0lJQ1JTQShpKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAwLCBFWFlOT1NfQ0lJWVNBKGkpKTsKKwkJZmltY193cml0ZShjdHgsIDAsIEVYWU5PU19DSUlDQlNBKGkpKTsKKwkJZmltY193cml0ZShjdHgsIDAsIEVYWU5PU19DSUlDUlNBKGkpKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfRFNUOyBpKyspIHsKLQkJZmltY193cml0ZSgwLCBFWFlOT1NfQ0lPWVNBKGkpKTsKLQkJZmltY193cml0ZSgwLCBFWFlOT1NfQ0lPQ0JTQShpKSk7Ci0JCWZpbWNfd3JpdGUoMCwgRVhZTk9TX0NJT0NSU0EoaSkpOworCQlmaW1jX3dyaXRlKGN0eCwgMCwgRVhZTk9TX0NJT1lTQShpKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAwLCBFWFlOT1NfQ0lPQ0JTQShpKSk7CisJCWZpbWNfd3JpdGUoY3R4LCAwLCBFWFlOT1NfQ0lPQ1JTQShpKSk7CiAJfQogfQogCkBAIC0xNTU2LDcgKzE1MTMsNyBAQAogCiAJcHJvcGVydHkgPSAmY19ub2RlLT5wcm9wZXJ0eTsKIAotCWZpbWNfaGFuZGxlX2lycShjdHgsIHRydWUsIGZhbHNlLCB0cnVlKTsKKwlmaW1jX21hc2tfaXJxKGN0eCwgdHJ1ZSk7CiAKIAlmb3JfZWFjaF9pcHBfb3BzKGkpIHsKIAkJY29uZmlnID0gJnByb3BlcnR5LT5jb25maWdbaV07CkBAIC0xNTgyLDEwICsxNTM5LDEwIEBACiAJCWZpbWNfaGFuZGxlX2xhc3RlbmQoY3R4LCBmYWxzZSk7CiAKIAkJLyogc2V0dXAgZG1hICovCi0JCWNmZzAgPSBmaW1jX3JlYWQoRVhZTk9TX01TQ1RSTCk7CisJCWNmZzAgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfTVNDVFJMKTsKIAkJY2ZnMCAmPSB+RVhZTk9TX01TQ1RSTF9JTlBVVF9NQVNLOwogCQljZmcwIHw9IEVYWU5PU19NU0NUUkxfSU5QVVRfTUVNT1JZOwotCQlmaW1jX3dyaXRlKGNmZzAsIEVYWU5PU19NU0NUUkwpOworCQlmaW1jX3dyaXRlKGN0eCwgY2ZnMCwgRVhZTk9TX01TQ1RSTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBQX0NNRF9XQjoKIAkJZmltY19zZXRfdHlwZV9jdHJsKGN0eCwgRklNQ19XQl9BKTsKQEAgLTE2MTAsNDEgKzE1NjcsMzMgQEAKIAl9CiAKIAkvKiBSZXNldCBzdGF0dXMgKi8KLQlmaW1jX3dyaXRlKDB4MCwgRVhZTk9TX0NJU1RBVFVTKTsKKwlmaW1jX3dyaXRlKGN0eCwgMHgwLCBFWFlOT1NfQ0lTVEFUVVMpOwogCi0JY2ZnMCA9IGZpbWNfcmVhZChFWFlOT1NfQ0lJTUdDUFQpOworCWNmZzAgPSBmaW1jX3JlYWQoY3R4LCBFWFlOT1NfQ0lJTUdDUFQpOwogCWNmZzAgJj0gfkVYWU5PU19DSUlNR0NQVF9JTUdDUFRFTl9TQzsKIAljZmcwIHw9IEVYWU5PU19DSUlNR0NQVF9JTUdDUFRFTl9TQzsKIAogCS8qIFNjYWxlciAqLwotCWNmZzEgPSBmaW1jX3JlYWQoRVhZTk9TX0NJU0NDVFJMKTsKKwljZmcxID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX0NJU0NDVFJMKTsKIAljZmcxICY9IH5FWFlOT1NfQ0lTQ0NUUkxfU0NBTl9NQVNLOwogCWNmZzEgfD0gKEVYWU5PU19DSVNDQ1RSTF9QUk9HUkVTU0lWRSB8CiAJCUVYWU5PU19DSVNDQ1RSTF9TQ0FMRVJTVEFSVCk7CiAKLQlmaW1jX3dyaXRlKGNmZzEsIEVYWU5PU19DSVNDQ1RSTCk7CisJZmltY193cml0ZShjdHgsIGNmZzEsIEVYWU5PU19DSVNDQ1RSTCk7CiAKIAkvKiBFbmFibGUgaW1hZ2UgY2FwdHVyZSovCiAJY2ZnMCB8PSBFWFlOT1NfQ0lJTUdDUFRfSU1HQ1BURU47Ci0JZmltY193cml0ZShjZmcwLCBFWFlOT1NfQ0lJTUdDUFQpOworCWZpbWNfd3JpdGUoY3R4LCBjZmcwLCBFWFlOT1NfQ0lJTUdDUFQpOwogCiAJLyogRGlzYWJsZSBmcmFtZSBlbmQgaXJxICovCi0JY2ZnMCA9IGZpbWNfcmVhZChFWFlOT1NfQ0lHQ1RSTCk7Ci0JY2ZnMCAmPSB+RVhZTk9TX0NJR0NUUkxfSVJRX0VORF9ESVNBQkxFOwotCWZpbWNfd3JpdGUoY2ZnMCwgRVhZTk9TX0NJR0NUUkwpOworCWZpbWNfY2xlYXJfYml0cyhjdHgsIEVYWU5PU19DSUdDVFJMLCBFWFlOT1NfQ0lHQ1RSTF9JUlFfRU5EX0RJU0FCTEUpOwogCi0JY2ZnMCA9IGZpbWNfcmVhZChFWFlOT1NfQ0lPQ1RSTCk7Ci0JY2ZnMCAmPSB+RVhZTk9TX0NJT0NUUkxfV0VBVkVfTUFTSzsKLQlmaW1jX3dyaXRlKGNmZzAsIEVYWU5PU19DSU9DVFJMKTsKKwlmaW1jX2NsZWFyX2JpdHMoY3R4LCBFWFlOT1NfQ0lPQ1RSTCwgRVhZTk9TX0NJT0NUUkxfV0VBVkVfTUFTSyk7CiAKIAlpZiAoY21kID09IElQUF9DTURfTTJNKSB7Ci0JCWNmZzAgPSBmaW1jX3JlYWQoRVhZTk9TX01TQ1RSTCk7Ci0JCWNmZzAgfD0gRVhZTk9TX01TQ1RSTF9FTlZJRDsKLQkJZmltY193cml0ZShjZmcwLCBFWFlOT1NfTVNDVFJMKTsKKwkJZmltY19zZXRfYml0cyhjdHgsIEVYWU5PU19NU0NUUkwsIEVYWU5PU19NU0NUUkxfRU5WSUQpOwogCi0JCWNmZzAgPSBmaW1jX3JlYWQoRVhZTk9TX01TQ1RSTCk7Ci0JCWNmZzAgfD0gRVhZTk9TX01TQ1RSTF9FTlZJRDsKLQkJZmltY193cml0ZShjZmcwLCBFWFlOT1NfTVNDVFJMKTsKKwkJZmltY19zZXRfYml0cyhjdHgsIEVYWU5PU19NU0NUUkwsIEVYWU5PU19NU0NUUkxfRU5WSUQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTY2MSwxMCArMTYxMCwxMCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJUFBfQ01EX00yTToKIAkJLyogU291cmNlIGNsZWFyICovCi0JCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfTVNDVFJMKTsKKwkJY2ZnID0gZmltY19yZWFkKGN0eCwgRVhZTk9TX01TQ1RSTCk7CiAJCWNmZyAmPSB+RVhZTk9TX01TQ1RSTF9JTlBVVF9NQVNLOwogCQljZmcgJj0gfkVYWU5PU19NU0NUUkxfRU5WSUQ7Ci0JCWZpbWNfd3JpdGUoY2ZnLCBFWFlOT1NfTVNDVFJMKTsKKwkJZmltY193cml0ZShjdHgsIGNmZywgRVhZTk9TX01TQ1RSTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBQX0NNRF9XQjoKIAkJZXh5bm9zX2RybV9pcHBuYl9zZW5kX2V2ZW50KElQUF9TRVRfV1JJVEVCQUNLLCAodm9pZCAqKSZzZXRfd2IpOwpAQCAtMTY3NSwyNSArMTYyNCwyMCBAQAogCQlicmVhazsKIAl9CiAKLQlmaW1jX2hhbmRsZV9pcnEoY3R4LCBmYWxzZSwgZmFsc2UsIHRydWUpOworCWZpbWNfbWFza19pcnEoY3R4LCBmYWxzZSk7CiAKIAkvKiByZXNldCBzZXF1ZW5jZSAqLwotCWZpbWNfd3JpdGUoMHgwLCBFWFlOT1NfQ0lGQ05UU0VRKTsKKwlmaW1jX3dyaXRlKGN0eCwgMHgwLCBFWFlOT1NfQ0lGQ05UU0VRKTsKIAogCS8qIFNjYWxlciBkaXNhYmxlICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSVNDQ1RSTCk7Ci0JY2ZnICY9IH5FWFlOT1NfQ0lTQ0NUUkxfU0NBTEVSU1RBUlQ7Ci0JZmltY193cml0ZShjZmcsIEVYWU5PU19DSVNDQ1RSTCk7CisJZmltY19jbGVhcl9iaXRzKGN0eCwgRVhZTk9TX0NJU0NDVFJMLCBFWFlOT1NfQ0lTQ0NUUkxfU0NBTEVSU1RBUlQpOwogCiAJLyogRGlzYWJsZSBpbWFnZSBjYXB0dXJlICovCi0JY2ZnID0gZmltY19yZWFkKEVYWU5PU19DSUlNR0NQVCk7Ci0JY2ZnICY9IH4oRVhZTk9TX0NJSU1HQ1BUX0lNR0NQVEVOX1NDIHwgRVhZTk9TX0NJSU1HQ1BUX0lNR0NQVEVOKTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJSU1HQ1BUKTsKKwlmaW1jX2NsZWFyX2JpdHMoY3R4LCBFWFlOT1NfQ0lJTUdDUFQsCisJCUVYWU5PU19DSUlNR0NQVF9JTUdDUFRFTl9TQyB8IEVYWU5PU19DSUlNR0NQVF9JTUdDUFRFTik7CiAKIAkvKiBFbmFibGUgZnJhbWUgZW5kIGlycSAqLwotCWNmZyA9IGZpbWNfcmVhZChFWFlOT1NfQ0lHQ1RSTCk7Ci0JY2ZnIHw9IEVYWU5PU19DSUdDVFJMX0lSUV9FTkRfRElTQUJMRTsKLQlmaW1jX3dyaXRlKGNmZywgRVhZTk9TX0NJR0NUUkwpOworCWZpbWNfc2V0X2JpdHMoY3R4LCBFWFlOT1NfQ0lHQ1RSTCwgRVhZTk9TX0NJR0NUUkxfSVJRX0VORF9ESVNBQkxFKTsKIH0KIAogc3RhdGljIHZvaWQgZmltY19wdXRfY2xvY2tzKHN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCkKQEAgLTE4NDgsNyArMTc5Miw3IEBACiAKIAlEUk1fREVCVUdfS01TKCJpZFslZF1pcHBkcnZbMHgleF1cbiIsIGN0eC0+aWQsIChpbnQpaXBwZHJ2KTsKIAotCW11dGV4X2luaXQoJmN0eC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmN0eC0+bG9jayk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKIAogCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOwpAQCAtMTg3OSw3ICsxODIzLDYgQEAKIAlzdHJ1Y3QgZXh5bm9zX2RybV9pcHBkcnYgKmlwcGRydiA9ICZjdHgtPmlwcGRydjsKIAogCWV4eW5vc19kcm1faXBwZHJ2X3VucmVnaXN0ZXIoaXBwZHJ2KTsKLQltdXRleF9kZXN0cm95KCZjdHgtPmxvY2spOwogCiAJZmltY19wdXRfY2xvY2tzKGN0eCk7CiAJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYwppbmRleCA0MGZkNmNjLi5iYjQ1YWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1kLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29mX2Rpc3BsYXlfdGltaW5nLmg+CiAjaW5jbHVkZSA8dmlkZW8vb2ZfdmlkZW9tb2RlLmg+CkBAIC0zOCw2ICszOSw3IEBACiAgKi8KIAogI2RlZmluZSBGSU1EX0RFRkFVTFRfRlJBTUVSQVRFIDYwCisjZGVmaW5lIE1JTl9GQl9XSURUSF9GT1JfMTZXT1JEX0JVUlNUIDEyOAogCiAvKiBwb3NpdGlvbiBjb250cm9sIHJlZ2lzdGVyIGZvciBoYXJkd2FyZSB3aW5kb3cgMCwgMiB+IDQuKi8KICNkZWZpbmUgVklET1NEX0Eod2luKQkJKFZJRE9TRF9CQVNFICsgMHgwMCArICh3aW4pICogMTYpCkBAIC0xMjIsNiArMTI0LDcgQEAKIAogCXN0cnVjdCBleHlub3NfZHJtX3BhbmVsX2luZm8gcGFuZWw7CiAJc3RydWN0IGZpbWRfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhOworCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXk7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmaW1kX2RyaXZlcl9kdF9tYXRjaFtdID0gewpAQCAtMTQzLDEzICsxNDYsNTcgQEAKIAlyZXR1cm4gKHN0cnVjdCBmaW1kX2RyaXZlcl9kYXRhICopb2ZfaWQtPmRhdGE7CiB9CiAKLXN0YXRpYyBpbnQgZmltZF9tZ3JfaW5pdGlhbGl6ZShzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsCi0JCQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiwgaW50IHBpcGUpCitzdGF0aWMgdm9pZCBmaW1kX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IpCiB7CiAJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gbWdyLT5jdHg7CiAKLQljdHgtPmRybV9kZXYgPSBkcm1fZGV2OwotCWN0eC0+cGlwZSA9IHBpcGU7CisJaWYgKGN0eC0+c3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwlhdG9taWNfc2V0KCZjdHgtPndhaXRfdnN5bmNfZXZlbnQsIDEpOworCisJLyoKKwkgKiB3YWl0IGZvciBGSU1EIHRvIHNpZ25hbCBWU1lOQyBpbnRlcnJ1cHQgb3IgcmV0dXJuIGFmdGVyCisJICogdGltZW91dCB3aGljaCBpcyBzZXQgdG8gNTBtcyAocmVmcmVzaCByYXRlIG9mIDIwKS4KKwkgKi8KKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChjdHgtPndhaXRfdnN5bmNfcXVldWUsCisJCQkJIWF0b21pY19yZWFkKCZjdHgtPndhaXRfdnN5bmNfZXZlbnQpLAorCQkJCUhaLzIwKSkKKwkJRFJNX0RFQlVHX0tNUygidmJsYW5rIHdhaXQgdGltZWQgb3V0LlxuIik7Cit9CisKKworc3RhdGljIHZvaWQgZmltZF9jbGVhcl9jaGFubmVsKHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1ncikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBtZ3ItPmN0eDsKKwlpbnQgd2luLCBjaF9lbmFibGVkID0gMDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBDaGVjayBpZiBhbnkgY2hhbm5lbCBpcyBlbmFibGVkLiAqLworCWZvciAod2luID0gMDsgd2luIDwgV0lORE9XU19OUjsgd2luKyspIHsKKwkJdTMyIHZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFNIQURPV0NPTik7CisJCWlmICh2YWwgJiBTSEFET1dDT05fQ0h4X0VOQUJMRSh3aW4pKSB7CisJCQl2YWwgJj0gflNIQURPV0NPTl9DSHhfRU5BQkxFKHdpbik7CisJCQl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworCQkJY2hfZW5hYmxlZCA9IDE7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciB2c3luYywgYXMgZGlzYWJsZSBjaGFubmVsIHRha2VzIGVmZmVjdCBhdCBuZXh0IHZzeW5jICovCisJaWYgKGNoX2VuYWJsZWQpCisJCWZpbWRfd2FpdF9mb3JfdmJsYW5rKG1ncik7Cit9CisKK3N0YXRpYyBpbnQgZmltZF9tZ3JfaW5pdGlhbGl6ZShzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsCisJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBtZ3ItPmN0eDsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2OworCXByaXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKKworCW1nci0+ZHJtX2RldiA9IGN0eC0+ZHJtX2RldiA9IGRybV9kZXY7CisJbWdyLT5waXBlID0gY3R4LT5waXBlID0gcHJpdi0+cGlwZSsrOwogCiAJLyoKIAkgKiBlbmFibGUgZHJtIGlycSBtb2RlLgpAQCAtMTY5LDggKzIxNiwxNCBAQAogCWRybV9kZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlOwogCiAJLyogYXR0YWNoIHRoaXMgc3ViIGRyaXZlciB0byBpb21tdSBtYXBwaW5nIGlmIHN1cHBvcnRlZC4gKi8KLQlpZiAoaXNfZHJtX2lvbW11X3N1cHBvcnRlZChjdHgtPmRybV9kZXYpKQorCWlmIChpc19kcm1faW9tbXVfc3VwcG9ydGVkKGN0eC0+ZHJtX2RldikpIHsKKwkJLyoKKwkJICogSWYgYW55IGNoYW5uZWwgaXMgYWxyZWFkeSBhY3RpdmUsIGlvbW11IHdpbGwgdGhyb3cKKwkJICogYSBQQUdFIEZBVUxUIHdoZW4gZW5hYmxlZC4gU28gY2xlYXIgYW55IGNoYW5uZWwgaWYgZW5hYmxlZC4KKwkJICovCisJCWZpbWRfY2xlYXJfY2hhbm5lbChtZ3IpOwogCQlkcm1faW9tbXVfYXR0YWNoX2RldmljZShjdHgtPmRybV9kZXYsIGN0eC0+ZGV2KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyNCwyNSArMzc3LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGZpbWRfd2FpdF9mb3JfdmJsYW5rKHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1ncikKLXsKLQlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBtZ3ItPmN0eDsKLQotCWlmIChjdHgtPnN1c3BlbmRlZCkKLQkJcmV0dXJuOwotCi0JYXRvbWljX3NldCgmY3R4LT53YWl0X3ZzeW5jX2V2ZW50LCAxKTsKLQotCS8qCi0JICogd2FpdCBmb3IgRklNRCB0byBzaWduYWwgVlNZTkMgaW50ZXJydXB0IG9yIHJldHVybiBhZnRlcgotCSAqIHRpbWVvdXQgd2hpY2ggaXMgc2V0IHRvIDUwbXMgKHJlZnJlc2ggcmF0ZSBvZiAyMCkuCi0JICovCi0JaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQoY3R4LT53YWl0X3ZzeW5jX3F1ZXVlLAotCQkJCSFhdG9taWNfcmVhZCgmY3R4LT53YWl0X3ZzeW5jX2V2ZW50KSwKLQkJCQlIWi8yMCkpCi0JCURSTV9ERUJVR19LTVMoInZibGFuayB3YWl0IHRpbWVkIG91dC5cbiIpOwotfQotCiBzdGF0aWMgdm9pZCBmaW1kX3dpbl9tb2RlX3NldChzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsCiAJCQlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5KQogewpAQCAtNDQ2LDYgKzQ4MCwxOSBAQAogCiAJRFJNX0RFQlVHX0tNUygiYnBwID0gJWRcbiIsIHdpbl9kYXRhLT5icHApOwogCisJLyoKKwkgKiBJbiBjYXNlIG9mIGV4eW5vcywgc2V0dGluZyBkbWEtYnVyc3QgdG8gMTZXb3JkIGNhdXNlcyBwZXJtYW5lbnQKKwkgKiB0ZWFyaW5nIGZvciB2ZXJ5IHNtYWxsIGJ1ZmZlcnMsIGUuZy4gY3Vyc29yIGJ1ZmZlci4gQnVyc3QgTW9kZQorCSAqIHN3aXRjaGluZyB3aGljaCBpcyBiYXNlZCBvbiBvdmVybGF5IHNpemUgaXMgbm90IHJlY29tbWVuZGVkIGFzCisJICogb3ZlcmxheSBzaXplIHZhcmllcyBhbG90IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgc2NyZWVuIGFuZCByYXBpZAorCSAqIG1vdmVtZW50IGNhdXNlcyB1bnN0YWJsZSBETUEgd2hpY2ggcmVzdWx0cyBpbnRvIGlvbW11IGNyYXNoL3RlYXIuCisJICovCisKKwlpZiAod2luX2RhdGEtPmZiX3dpZHRoIDwgTUlOX0ZCX1dJRFRIX0ZPUl8xNldPUkRfQlVSU1QpIHsKKwkJdmFsICY9IH5XSU5DT054X0JVUlNUTEVOX01BU0s7CisJCXZhbCB8PSBXSU5DT054X0JVUlNUTEVOXzRXT1JEOworCX0KKwogCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFdJTkNPTih3aW4pKTsKIH0KIApAQCAtNjU2LDE5ICs3MDMsNiBAQAogCXdpbl9kYXRhLT5lbmFibGVkID0gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbWRfY2xlYXJfd2luKHN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCwgaW50IHdpbikKLXsKLQl3cml0ZWwoMCwgY3R4LT5yZWdzICsgV0lOQ09OKHdpbikpOwotCXdyaXRlbCgwLCBjdHgtPnJlZ3MgKyBWSURPU0RfQSh3aW4pKTsKLQl3cml0ZWwoMCwgY3R4LT5yZWdzICsgVklET1NEX0Iod2luKSk7Ci0Jd3JpdGVsKDAsIGN0eC0+cmVncyArIFZJRE9TRF9DKHdpbikpOwotCi0JaWYgKHdpbiA9PSAxIHx8IHdpbiA9PSAyKQotCQl3cml0ZWwoMCwgY3R4LT5yZWdzICsgVklET1NEX0Qod2luKSk7Ci0KLQlmaW1kX3NoYWRvd19wcm90ZWN0X3dpbihjdHgsIHdpbiwgZmFsc2UpOwotfQotCiBzdGF0aWMgdm9pZCBmaW1kX3dpbmRvd19zdXNwZW5kKHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1ncikKIHsKIAlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBtZ3ItPmN0eDsKQEAgLTgwMyw4ICs4MzcsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgZmltZF9tYW5hZ2VyX29wcyA9IHsKLQkuaW5pdGlhbGl6ZSA9IGZpbWRfbWdyX2luaXRpYWxpemUsCi0JLnJlbW92ZSA9IGZpbWRfbWdyX3JlbW92ZSwKIAkuZHBtcyA9IGZpbWRfZHBtcywKIAkubW9kZV9maXh1cCA9IGZpbWRfbW9kZV9maXh1cCwKIAkubW9kZV9zZXQgPSBmaW1kX21vZGVfc2V0LApAQCAtODQ5LDIwICs4ODEsNjQgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgZmltZF9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGZpbWRfbWFuYWdlci5jdHg7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBkYXRhOworCisJZmltZF9tZ3JfaW5pdGlhbGl6ZSgmZmltZF9tYW5hZ2VyLCBkcm1fZGV2KTsKKwlleHlub3NfZHJtX2NydGNfY3JlYXRlKCZmaW1kX21hbmFnZXIpOworCWlmIChjdHgtPmRpc3BsYXkpCisJCWV4eW5vc19kcm1fY3JlYXRlX2VuY19jb25uKGRybV9kZXYsIGN0eC0+ZGlzcGxheSk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBmaW1kX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWdyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZmltZF9tYW5hZ2VyLmN0eDsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBtZ3ItPmNydGM7CisKKwlmaW1kX2RwbXMobWdyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwlpZiAoY3R4LT5kaXNwbGF5KQorCQlleHlub3NfZHBpX3JlbW92ZShkZXYpOworCisJZmltZF9tZ3JfcmVtb3ZlKG1ncik7CisKKwljcnRjLT5mdW5jcy0+ZGVzdHJveShjcnRjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGZpbWRfY29tcG9uZW50X29wcyA9IHsKKwkuYmluZAk9IGZpbWRfYmluZCwKKwkudW5iaW5kID0gZmltZF91bmJpbmQsCit9OworCiBzdGF0aWMgaW50IGZpbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgd2luOwogCWludCByZXQgPSAtRUlOVkFMOwogCi0JaWYgKCFkZXYtPm9mX25vZGUpCi0JCXJldHVybiAtRU5PREVWOworCXJldCA9IGV4eW5vc19kcm1fY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCBFWFlOT1NfREVWSUNFX1RZUEVfQ1JUQywKKwkJCQkJZmltZF9tYW5hZ2VyLnR5cGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWRldi0+b2Zfbm9kZSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OworCX0KIAogCWN0eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjdHgpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghY3R4KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CisJfQogCiAJY3R4LT5kZXYgPSBkZXY7CiAJY3R4LT5zdXNwZW5kZWQgPSB0cnVlOwpAQCAtODc1LDMyICs5NTEsMzcgQEAKIAljdHgtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiZmltZCIpOwogCWlmIChJU19FUlIoY3R4LT5idXNfY2xrKSkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgYnVzIGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoY3R4LT5idXNfY2xrKTsKKwkJcmV0ID0gUFRSX0VSUihjdHgtPmJ1c19jbGspOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAogCWN0eC0+bGNkX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJzY2xrX2ZpbWQiKTsKIAlpZiAoSVNfRVJSKGN0eC0+bGNkX2NsaykpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGxjZCBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGN0eC0+bGNkX2Nsayk7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5sY2RfY2xrKTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKIAl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCiAJY3R4LT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGN0eC0+cmVncykpCi0JCXJldHVybiBQVFJfRVJSKGN0eC0+cmVncyk7CisJaWYgKElTX0VSUihjdHgtPnJlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5yZWdzKTsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKKwl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAidnN5bmMiKTsKIAlpZiAoIXJlcykgewogCQlkZXZfZXJyKGRldiwgImlycSByZXF1ZXN0IGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVOWElPOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CiAJfQogCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIHJlcy0+c3RhcnQsIGZpbWRfaXJxX2hhbmRsZXIsCiAJCQkJCQkJMCwgImRybV9maW1kIiwgY3R4KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiaXJxIHJlcXVlc3QgZmFpbGVkLlxuIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CiAJfQogCiAJY3R4LT5kcml2ZXJfZGF0YSA9IGRybV9maW1kX2dldF9kcml2ZXJfZGF0YShwZGV2KTsKQEAgLTkxMCwzMCArOTkxLDM0IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJmZpbWRfbWFuYWdlcik7CiAKIAlmaW1kX21hbmFnZXIuY3R4ID0gY3R4OwotCWV4eW5vc19kcm1fbWFuYWdlcl9yZWdpc3RlcigmZmltZF9tYW5hZ2VyKTsKIAotCWV4eW5vc19kcGlfcHJvYmUoY3R4LT5kZXYpOworCWN0eC0+ZGlzcGxheSA9IGV4eW5vc19kcGlfcHJvYmUoZGV2KTsKKwlpZiAoSVNfRVJSKGN0eC0+ZGlzcGxheSkpCisJCXJldHVybiBQVFJfRVJSKGN0eC0+ZGlzcGxheSk7CiAKLQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCi0JZm9yICh3aW4gPSAwOyB3aW4gPCBXSU5ET1dTX05SOyB3aW4rKykKLQkJZmltZF9jbGVhcl93aW4oY3R4LCB3aW4pOworCXJldCA9IGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmZpbWRfY29tcG9uZW50X29wcyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGlzYWJsZV9wbV9ydW50aW1lOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKKworZXJyX2Rpc2FibGVfcG1fcnVudGltZToKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKK2Vycl9kZWxfY29tcG9uZW50OgorCWV4eW5vc19kcm1fY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCBFWFlOT1NfREVWSUNFX1RZUEVfQ1JUQyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmaW1kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1nciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZXh5bm9zX2RwaV9yZW1vdmUoJnBkZXYtPmRldik7Ci0KLQlleHlub3NfZHJtX21hbmFnZXJfdW5yZWdpc3RlcigmZmltZF9tYW5hZ2VyKTsKLQotCWZpbWRfZHBtcyhtZ3IsIERSTV9NT0RFX0RQTVNfT0ZGKTsKLQogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAorCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmZpbWRfY29tcG9uZW50X29wcyk7CisJZXh5bm9zX2RybV9jb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DUlRDKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmMKaW5kZXggNDJkMjkwNC4uMTYzYTA1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uYwpAQCAtNjEyLDIyICs2MTIsMjAgQEAKIAlhcmdzLT5waXRjaCA9IGFyZ3MtPndpZHRoICogKChhcmdzLT5icHAgKyA3KSAvIDgpOwogCWFyZ3MtPnNpemUgPSBhcmdzLT5waXRjaCAqIGFyZ3MtPmhlaWdodDsKIAotCWV4eW5vc19nZW1fb2JqID0gZXh5bm9zX2RybV9nZW1fY3JlYXRlKGRldiwgRVhZTk9TX0JPX0NPTlRJRyB8Ci0JCQkJCQlFWFlOT1NfQk9fV0MsIGFyZ3MtPnNpemUpOwotCS8qCi0JICogSWYgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzIGFuZCBpZiBJT01NVSBpcwotCSAqIHN1cHBvcnRlZCB0aGVuIHRyeSB0byBnZXQgYnVmZmVyIGZyb20gbm9uIHBoeXNpY2FsbHkgY29udGlndW91cwotCSAqIG1lbW9yeSBhcmVhLgotCSAqLwotCWlmIChJU19FUlIoZXh5bm9zX2dlbV9vYmopICYmIGlzX2RybV9pb21tdV9zdXBwb3J0ZWQoZGV2KSkgewotCQlkZXZfd2FybihkZXYtPmRldiwgImNvbnRpZ3VvdXMgRkIgYWxsb2NhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBub24tY29udGlndW91c1xuIik7CisJaWYgKGlzX2RybV9pb21tdV9zdXBwb3J0ZWQoZGV2KSkgewogCQlleHlub3NfZ2VtX29iaiA9IGV4eW5vc19kcm1fZ2VtX2NyZWF0ZShkZXYsCi0JCQkJCUVYWU5PU19CT19OT05DT05USUcgfCBFWFlOT1NfQk9fV0MsCi0JCQkJCWFyZ3MtPnNpemUpOworCQkJRVhZTk9TX0JPX05PTkNPTlRJRyB8IEVYWU5PU19CT19XQywKKwkJCWFyZ3MtPnNpemUpOworCX0gZWxzZSB7CisJCWV4eW5vc19nZW1fb2JqID0gZXh5bm9zX2RybV9nZW1fY3JlYXRlKGRldiwKKwkJCUVYWU5PU19CT19DT05USUcgfCBFWFlOT1NfQk9fV0MsCisJCQlhcmdzLT5zaXplKTsKIAl9CiAKLQlpZiAoSVNfRVJSKGV4eW5vc19nZW1fb2JqKSkKKwlpZiAoSVNfRVJSKGV4eW5vc19nZW1fb2JqKSkgeworCQlkZXZfd2FybihkZXYtPmRldiwgIkZCIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CiAJCXJldHVybiBQVFJfRVJSKGV4eW5vc19nZW1fb2JqKTsKKwl9CiAKIAlyZXQgPSBleHlub3NfZHJtX2dlbV9oYW5kbGVfY3JlYXRlKCZleHlub3NfZ2VtX29iai0+YmFzZSwgZmlsZV9wcml2LAogCQkJJmFyZ3MtPmhhbmRsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMKaW5kZXggZmE3NTA1OS4uOWUzZmYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nc2MuYwpAQCAtMTMzNSwxMSArMTMzNSw3IEBACiAKIHN0YXRpYyBpbnQgZ3NjX2luaXRfcHJvcF9saXN0KHN0cnVjdCBleHlub3NfZHJtX2lwcGRydiAqaXBwZHJ2KQogewotCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9wcm9wX2xpc3QgKnByb3BfbGlzdDsKLQotCXByb3BfbGlzdCA9IGRldm1fa3phbGxvYyhpcHBkcnYtPmRldiwgc2l6ZW9mKCpwcm9wX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3BfbGlzdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHJvcF9saXN0ID0gJmlwcGRydi0+cHJvcF9saXN0OwogCiAJcHJvcF9saXN0LT52ZXJzaW9uID0gMTsKIAlwcm9wX2xpc3QtPndyaXRlYmFjayA9IDE7CkBAIC0xMzYzLDggKzEzNTksNiBAQAogCXByb3BfbGlzdC0+c2NhbGVfbWluLmhzaXplID0gR1NDX1NDQUxFX01JTjsKIAlwcm9wX2xpc3QtPnNjYWxlX21pbi52c2l6ZSA9IEdTQ19TQ0FMRV9NSU47CiAKLQlpcHBkcnYtPnByb3BfbGlzdCA9IHByb3BfbGlzdDsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMzg3LDcgKzEzODEsNyBAQAogewogCXN0cnVjdCBnc2NfY29udGV4dCAqY3R4ID0gZ2V0X2dzY19jb250ZXh0KGRldik7CiAJc3RydWN0IGV4eW5vc19kcm1faXBwZHJ2ICppcHBkcnYgPSAmY3R4LT5pcHBkcnY7Ci0Jc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHAgPSBpcHBkcnYtPnByb3BfbGlzdDsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfcHJvcF9saXN0ICpwcCA9ICZpcHBkcnYtPnByb3BfbGlzdDsKIAlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfY29uZmlnICpjb25maWc7CiAJc3RydWN0IGRybV9leHlub3NfcG9zICpwb3M7CiAJc3RydWN0IGRybV9leHlub3Nfc3ogKnN6OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2lwcC5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2lwcC5jCmluZGV4IDNkNzgxNDQuLmExODg4ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9pcHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1faXBwLmMKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaXBwX3JlbW92ZV9pZChzdHJ1Y3QgaWRyICppZF9pZHIsIHN0cnVjdCBtdXRleCAqbG9jaywgdTMyIGlkKQoreworCW11dGV4X2xvY2sobG9jayk7CisJaWRyX3JlbW92ZShpZF9pZHIsIGlkKTsKKwltdXRleF91bmxvY2sobG9jayk7Cit9CisKIHN0YXRpYyB2b2lkICppcHBfZmluZF9vYmooc3RydWN0IGlkciAqaWRfaWRyLCBzdHJ1Y3QgbXV0ZXggKmxvY2ssIHUzMiBpZCkKIHsKIAl2b2lkICpvYmo7CkBAIC0yNzYsMTEgKzI4Myw2IEBACiAKIAlEUk1fREVCVUdfS01TKCJwcm9wX2lkWyVkXVxuIiwgcHJvcF9pZCk7CiAKLQlpZiAobGlzdF9lbXB0eSgmZXh5bm9zX2RybV9pcHBkcnZfbGlzdCkpIHsKLQkJRFJNX0RFQlVHX0tNUygiaXBwZHJ2X2xpc3QgaXMgZW1wdHkuXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQotCiAJLyoKIAkgKiBUaGlzIGNhc2UgaXMgc2VhcmNoIGlwcCBkcml2ZXIgYnkgcHJvcF9pZCBoYW5kbGUuCiAJICogc29tZXRpbWVzLCBpcHAgc3Vic3lzdGVtIGZpbmQgZHJpdmVyIGJ5IHByb3BfaWQuCkBAIC0yODksMTEgKzI5MSwxNCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaXBwZHJ2LCAmZXh5bm9zX2RybV9pcHBkcnZfbGlzdCwgZHJ2X2xpc3QpIHsKIAkJRFJNX0RFQlVHX0tNUygiY291bnRbJWRdaXBwZHJ2WzB4JXhdXG4iLCBjb3VudCsrLCAoaW50KWlwcGRydik7CiAKLQkJaWYgKCFsaXN0X2VtcHR5KCZpcHBkcnYtPmNtZF9saXN0KSkgewotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjX25vZGUsICZpcHBkcnYtPmNtZF9saXN0LCBsaXN0KQotCQkJCWlmIChjX25vZGUtPnByb3BlcnR5LnByb3BfaWQgPT0gcHJvcF9pZCkKLQkJCQkJcmV0dXJuIGlwcGRydjsKKwkJbXV0ZXhfbG9jaygmaXBwZHJ2LT5jbWRfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY19ub2RlLCAmaXBwZHJ2LT5jbWRfbGlzdCwgbGlzdCkgeworCQkJaWYgKGNfbm9kZS0+cHJvcGVydHkucHJvcF9pZCA9PSBwcm9wX2lkKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZpcHBkcnYtPmNtZF9sb2NrKTsKKwkJCQlyZXR1cm4gaXBwZHJ2OworCQkJfQogCQl9CisJCW11dGV4X3VubG9jaygmaXBwZHJ2LT5jbWRfbG9jayk7CiAJfQogCiAJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CkBAIC0zMjUsNiArMzMwLDcgQEAKIAlpZiAoIXByb3BfbGlzdC0+aXBwX2lkKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaXBwZHJ2LCAmZXh5bm9zX2RybV9pcHBkcnZfbGlzdCwgZHJ2X2xpc3QpCiAJCQljb3VudCsrOworCiAJCS8qCiAJCSAqIFN1cHBvcnRzIGlwcGRydiBsaXN0IGNvdW50IGZvciB1c2VyIGFwcGxpY2F0aW9uLgogCQkgKiBGaXJzdCBzdGVwIHVzZXIgYXBwbGljYXRpb24gZ2V0dGluZyBpcHBkcnYgY291bnQuCkBAIC0zNDYsNyArMzUyLDcgQEAKIAkJCXJldHVybiBQVFJfRVJSKGlwcGRydik7CiAJCX0KIAotCQlwcm9wX2xpc3QgPSBpcHBkcnYtPnByb3BfbGlzdDsKKwkJKnByb3BfbGlzdCA9IGlwcGRydi0+cHJvcF9saXN0OwogCX0KIAogCXJldHVybiAwOwpAQCAtMzg2LDkgKzM5MiwxMSBAQAogCSAqIHdoZW4gd2UgZmluZCB0aGlzIGNvbW1hbmQgbm8gdXNpbmcgcHJvcF9pZC4KIAkgKiByZXR1cm4gcHJvcGVydHkgaW5mb3JtYXRpb24gc2V0IGluIHRoaXMgY29tbWFuZCBub2RlLgogCSAqLworCW11dGV4X2xvY2soJmlwcGRydi0+Y21kX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY19ub2RlLCAmaXBwZHJ2LT5jbWRfbGlzdCwgbGlzdCkgewogCQlpZiAoKGNfbm9kZS0+cHJvcGVydHkucHJvcF9pZCA9PSBwcm9wX2lkKSAmJgogCQkgICAgKGNfbm9kZS0+c3RhdGUgPT0gSVBQX1NUQVRFX1NUT1ApKSB7CisJCQltdXRleF91bmxvY2soJmlwcGRydi0+Y21kX2xvY2spOwogCQkJRFJNX0RFQlVHX0tNUygiZm91bmQgY21kWyVkXWlwcGRydlsweCV4XVxuIiwKIAkJCQlwcm9wZXJ0eS0+Y21kLCAoaW50KWlwcGRydik7CiAKQEAgLTM5Niw2ICs0MDQsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CisJbXV0ZXhfdW5sb2NrKCZpcHBkcnYtPmNtZF9sb2NrKTsKIAogCURSTV9FUlJPUigiZmFpbGVkIHRvIHNlYXJjaCBwcm9wZXJ0eS5cbiIpOwogCkBAIC00OTksNyArNTA4LDcgQEAKIAljX25vZGUtPnN0YXJ0X3dvcmsgPSBpcHBfY3JlYXRlX2NtZF93b3JrKCk7CiAJaWYgKElTX0VSUihjX25vZGUtPnN0YXJ0X3dvcmspKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBzdGFydCB3b3JrLlxuIik7Ci0JCWdvdG8gZXJyX2NsZWFyOworCQlnb3RvIGVycl9yZW1vdmVfaWQ7CiAJfQogCiAJY19ub2RlLT5zdG9wX3dvcmsgPSBpcHBfY3JlYXRlX2NtZF93b3JrKCk7CkBAIC01MTQsNyArNTIzLDcgQEAKIAkJZ290byBlcnJfZnJlZV9zdG9wOwogCX0KIAotCW11dGV4X2luaXQoJmNfbm9kZS0+Y21kX2xvY2spOworCW11dGV4X2luaXQoJmNfbm9kZS0+bG9jayk7CiAJbXV0ZXhfaW5pdCgmY19ub2RlLT5tZW1fbG9jayk7CiAJbXV0ZXhfaW5pdCgmY19ub2RlLT5ldmVudF9sb2NrKTsKIApAQCAtNTI2LDcgKzUzNSw5IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmY19ub2RlLT5ldmVudF9saXN0KTsKIAlsaXN0X3NwbGljZV9pbml0KCZwcml2LT5ldmVudF9saXN0LCAmY19ub2RlLT5ldmVudF9saXN0KTsKKwltdXRleF9sb2NrKCZpcHBkcnYtPmNtZF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZjX25vZGUtPmxpc3QsICZpcHBkcnYtPmNtZF9saXN0KTsKKwltdXRleF91bmxvY2soJmlwcGRydi0+Y21kX2xvY2spOwogCiAJLyogbWFrZSBkZWRpY2F0ZWQgc3RhdGUgd2l0aG91dCBtMm0gKi8KIAlpZiAoIWlwcF9pc19tMm1fY21kKHByb3BlcnR5LT5jbWQpKQpAQCAtNTM4LDE4ICs1NDksMjQgQEAKIAlrZnJlZShjX25vZGUtPnN0b3Bfd29yayk7CiBlcnJfZnJlZV9zdGFydDoKIAlrZnJlZShjX25vZGUtPnN0YXJ0X3dvcmspOworZXJyX3JlbW92ZV9pZDoKKwlpcHBfcmVtb3ZlX2lkKCZjdHgtPnByb3BfaWRyLCAmY3R4LT5wcm9wX2xvY2ssIHByb3BlcnR5LT5wcm9wX2lkKTsKIGVycl9jbGVhcjoKIAlrZnJlZShjX25vZGUpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGlwcF9jbGVhbl9jbWRfbm9kZShzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfY21kX25vZGUgKmNfbm9kZSkKK3N0YXRpYyB2b2lkIGlwcF9jbGVhbl9jbWRfbm9kZShzdHJ1Y3QgaXBwX2NvbnRleHQgKmN0eCwKKwkJCQlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfY21kX25vZGUgKmNfbm9kZSkKIHsKIAkvKiBkZWxldGUgbGlzdCAqLwogCWxpc3RfZGVsKCZjX25vZGUtPmxpc3QpOwogCisJaXBwX3JlbW92ZV9pZCgmY3R4LT5wcm9wX2lkciwgJmN0eC0+cHJvcF9sb2NrLAorCQkJY19ub2RlLT5wcm9wZXJ0eS5wcm9wX2lkKTsKKwogCS8qIGRlc3Ryb3kgbXV0ZXggKi8KLQltdXRleF9kZXN0cm95KCZjX25vZGUtPmNtZF9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZjX25vZGUtPmxvY2spOwogCW11dGV4X2Rlc3Ryb3koJmNfbm9kZS0+bWVtX2xvY2spOwogCW11dGV4X2Rlc3Ryb3koJmNfbm9kZS0+ZXZlbnRfbG9jayk7CiAKQEAgLTU2NywxNyArNTg0LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgcmV0LCBpLCBjb3VudFtFWFlOT1NfRFJNX09QU19NQVhdID0geyAwLCB9OwogCi0JbXV0ZXhfbG9jaygmY19ub2RlLT5tZW1fbG9jayk7Ci0KIAlmb3JfZWFjaF9pcHBfb3BzKGkpIHsKIAkJLyogc291cmNlL2Rlc3RpbmF0aW9uIG1lbW9yeSBsaXN0ICovCiAJCWhlYWQgPSAmY19ub2RlLT5tZW1fbGlzdFtpXTsKIAotCQlpZiAobGlzdF9lbXB0eShoZWFkKSkgewotCQkJRFJNX0RFQlVHX0tNUygiJXMgbWVtb3J5IGVtcHR5LlxuIiwgaSA/ICJkc3QiIDogInNyYyIpOwotCQkJY29udGludWU7Ci0JCX0KLQogCQkvKiBmaW5kIG1lbW9yeSBub2RlIGVudHJ5ICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobV9ub2RlLCBoZWFkLCBsaXN0KSB7CiAJCQlEUk1fREVCVUdfS01TKCIlcyxjb3VudFslZF1tX25vZGVbMHgleF1cbiIsCkBAIC02MDIsOCArNjEyLDYgQEAKIAkJcmV0ID0gbWF4KGNvdW50W0VYWU5PU19EUk1fT1BTX1NSQ10sCiAJCQljb3VudFtFWFlOT1NfRFJNX09QU19EU1RdKTsKIAotCW11dGV4X3VubG9jaygmY19ub2RlLT5tZW1fbG9jayk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02NDYsMTYgKzY1NCwxMyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQltdXRleF9sb2NrKCZjX25vZGUtPm1lbV9sb2NrKTsKLQogCURSTV9ERUJVR19LTVMoIm9wc19pZFslZF1cbiIsIG1fbm9kZS0+b3BzX2lkKTsKIAogCS8qIGdldCBvcGVyYXRpb25zIGNhbGxiYWNrICovCiAJb3BzID0gaXBwZHJ2LT5vcHNbbV9ub2RlLT5vcHNfaWRdOwogCWlmICghb3BzKSB7CiAJCURSTV9FUlJPUigibm90IHN1cHBvcnQgb3BzLlxuIik7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX3VubG9jazsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJLyogc2V0IGFkZHJlc3MgYW5kIGVuYWJsZSBpcnEgKi8KQEAgLTY2NCwxMiArNjY5LDEwIEBACiAJCQltX25vZGUtPmJ1Zl9pZCwgSVBQX0JVRl9FTlFVRVVFKTsKIAkJaWYgKHJldCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGFkZHIuXG4iKTsKLQkJCWdvdG8gZXJyX3VubG9jazsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKLWVycl91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjX25vZGUtPm1lbV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02ODQsMTEgKzY4Nyw5IEBACiAJdm9pZCAqYWRkcjsKIAlpbnQgaTsKIAotCW11dGV4X2xvY2soJmNfbm9kZS0+bWVtX2xvY2spOwotCiAJbV9ub2RlID0ga3phbGxvYyhzaXplb2YoKm1fbm9kZSksIEdGUF9LRVJORUwpOwogCWlmICghbV9ub2RlKQotCQlnb3RvIGVycl91bmxvY2s7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJLyogY2xlYXIgYmFzZSBhZGRyZXNzIGZvciBlcnJvciBoYW5kbGluZyAqLwogCW1lbXNldCgmYnVmX2luZm8sIDB4MCwgc2l6ZW9mKGJ1Zl9pbmZvKSk7CkBAIC03MjIsMTUgKzcyMywxNCBAQAogCiAJbV9ub2RlLT5maWxwID0gZmlsZTsKIAltX25vZGUtPmJ1Zl9pbmZvID0gYnVmX2luZm87CisJbXV0ZXhfbG9jaygmY19ub2RlLT5tZW1fbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmbV9ub2RlLT5saXN0LCAmY19ub2RlLT5tZW1fbGlzdFtxYnVmLT5vcHNfaWRdKTsKLQogCW11dGV4X3VubG9jaygmY19ub2RlLT5tZW1fbG9jayk7CisKIAlyZXR1cm4gbV9ub2RlOwogCiBlcnJfY2xlYXI6CiAJa2ZyZWUobV9ub2RlKTsKLWVycl91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjX25vZGUtPm1lbV9sb2NrKTsKIAlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIH0KIApAQCAtNzQ3LDEzICs3NDcsNiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAobGlzdF9lbXB0eSgmbV9ub2RlLT5saXN0KSkgewotCQlEUk1fRVJST1IoImVtcHR5IG1lbW9yeSBub2RlLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2xvY2soJmNfbm9kZS0+bWVtX2xvY2spOwotCiAJRFJNX0RFQlVHX0tNUygib3BzX2lkWyVkXVxuIiwgbV9ub2RlLT5vcHNfaWQpOwogCiAJLyogcHV0IGdlbSBidWZmZXIgKi8KQEAgLTc2OCw4ICs3NjEsNiBAQAogCWxpc3RfZGVsKCZtX25vZGUtPmxpc3QpOwogCWtmcmVlKG1fbm9kZSk7CiAKLQltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwNSw3ICs3OTYsOSBAQAogCWUtPmJhc2UuZXZlbnQgPSAmZS0+ZXZlbnQuYmFzZTsKIAllLT5iYXNlLmZpbGVfcHJpdiA9IGZpbGU7CiAJZS0+YmFzZS5kZXN0cm95ID0gaXBwX2ZyZWVfZXZlbnQ7CisJbXV0ZXhfbG9jaygmY19ub2RlLT5ldmVudF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssICZjX25vZGUtPmV2ZW50X2xpc3QpOworCW11dGV4X3VubG9jaygmY19ub2RlLT5ldmVudF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtODE2LDExICs4MDksNyBAQAogCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9zZW5kX2V2ZW50ICplLCAqdGU7CiAJaW50IGNvdW50ID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZjX25vZGUtPmV2ZW50X2xpc3QpKSB7Ci0JCURSTV9ERUJVR19LTVMoImV2ZW50X2xpc3QgaXMgZW1wdHkuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQorCW11dGV4X2xvY2soJmNfbm9kZS0+ZXZlbnRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHRlLCAmY19ub2RlLT5ldmVudF9saXN0LCBiYXNlLmxpbmspIHsKIAkJRFJNX0RFQlVHX0tNUygiY291bnRbJWRdZVsweCV4XVxuIiwgY291bnQrKywgKGludCllKTsKIApAQCAtODQxLDkgKzgzMCwxMyBAQAogCQkJLyogZGVsZXRlIGxpc3QgKi8KIAkJCWxpc3RfZGVsKCZlLT5iYXNlLmxpbmspOwogCQkJa2ZyZWUoZSk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjX25vZGUtPmV2ZW50X2xvY2spOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgaXBwX2hhbmRsZV9jbWRfd29yayhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC04ODcsNyArODgwLDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJbXV0ZXhfbG9jaygmY19ub2RlLT5tZW1fbG9jayk7CiAJaWYgKCFpcHBfY2hlY2tfbWVtX2xpc3QoY19ub2RlKSkgeworCQltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOwogCQlEUk1fREVCVUdfS01TKCJlbXB0eSBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTA0LDEwICs4OTksMTIgQEAKIAl9IGVsc2UgewogCQlyZXQgPSBpcHBfc2V0X21lbV9ub2RlKGlwcGRydiwgY19ub2RlLCBtX25vZGUpOwogCQlpZiAocmV0KSB7CisJCQltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOwogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG0gbm9kZS5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MTgsMTUgKzkxNSwxNSBAQAogewogCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9tZW1fbm9kZSAqbV9ub2RlLCAqdG1fbm9kZTsKIAotCWlmICghbGlzdF9lbXB0eSgmY19ub2RlLT5tZW1fbGlzdFtxYnVmLT5vcHNfaWRdKSkgewotCQkvKiBkZWxldGUgbGlzdCAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobV9ub2RlLCB0bV9ub2RlLAotCQkJJmNfbm9kZS0+bWVtX2xpc3RbcWJ1Zi0+b3BzX2lkXSwgbGlzdCkgewotCQkJaWYgKG1fbm9kZS0+YnVmX2lkID09IHFidWYtPmJ1Zl9pZCAmJgotCQkJICAgIG1fbm9kZS0+b3BzX2lkID09IHFidWYtPm9wc19pZCkKLQkJCQlpcHBfcHV0X21lbV9ub2RlKGRybV9kZXYsIGNfbm9kZSwgbV9ub2RlKTsKLQkJfQorCS8qIGRlbGV0ZSBsaXN0ICovCisJbXV0ZXhfbG9jaygmY19ub2RlLT5tZW1fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1fbm9kZSwgdG1fbm9kZSwKKwkJJmNfbm9kZS0+bWVtX2xpc3RbcWJ1Zi0+b3BzX2lkXSwgbGlzdCkgeworCQlpZiAobV9ub2RlLT5idWZfaWQgPT0gcWJ1Zi0+YnVmX2lkICYmCisJCSAgICBtX25vZGUtPm9wc19pZCA9PSBxYnVmLT5vcHNfaWQpCisJCQlpcHBfcHV0X21lbV9ub2RlKGRybV9kZXYsIGNfbm9kZSwgbV9ub2RlKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZjX25vZGUtPm1lbV9sb2NrKTsKIH0KIAogaW50IGV4eW5vc19kcm1faXBwX3F1ZXVlX2J1ZihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2Rldiwgdm9pZCAqZGF0YSwKQEAgLTk5OCw3ICs5OTUsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVBQX0JVRl9ERVFVRVVFOgotCQltdXRleF9sb2NrKCZjX25vZGUtPmNtZF9sb2NrKTsKKwkJbXV0ZXhfbG9jaygmY19ub2RlLT5sb2NrKTsKIAogCQkvKiBwdXQgZXZlbnQgZm9yIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwogCQlpZiAocWJ1Zi0+b3BzX2lkID09IEVYWU5PU19EUk1fT1BTX0RTVCkKQEAgLTEwMDYsNyArMTAwMyw3IEBACiAKIAkJaXBwX2NsZWFuX3F1ZXVlX2J1Zihkcm1fZGV2LCBjX25vZGUsIHFidWYpOwogCi0JCW11dGV4X3VubG9jaygmY19ub2RlLT5jbWRfbG9jayk7CisJCW11dGV4X3VubG9jaygmY19ub2RlLT5sb2NrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJpbnZhbGlkIGJ1ZmZlciBjb250cm9sLlxuIik7CkBAIC0xMTA5LDEyICsxMTA2LDEyIEBACiAJY2FzZSBJUFBfQ1RSTF9QTEFZOgogCQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoaXBwZHJ2LT5kZXYpKQogCQkJcG1fcnVudGltZV9nZXRfc3luYyhpcHBkcnYtPmRldik7CisKIAkJY19ub2RlLT5zdGF0ZSA9IElQUF9TVEFURV9TVEFSVDsKIAogCQljbWRfd29yayA9IGNfbm9kZS0+c3RhcnRfd29yazsKIAkJY21kX3dvcmstPmN0cmwgPSBjbWRfY3RybC0+Y3RybDsKIAkJaXBwX2hhbmRsZV9jbWRfd29yayhkZXYsIGlwcGRydiwgY21kX3dvcmssIGNfbm9kZSk7Ci0JCWNfbm9kZS0+c3RhdGUgPSBJUFBfU1RBVEVfU1RBUlQ7CiAJCWJyZWFrOwogCWNhc2UgSVBQX0NUUkxfU1RPUDoKIAkJY21kX3dvcmsgPSBjX25vZGUtPnN0b3Bfd29yazsKQEAgLTExMjksMTAgKzExMjYsMTIgQEAKIAogCQljX25vZGUtPnN0YXRlID0gSVBQX1NUQVRFX1NUT1A7CiAJCWlwcGRydi0+ZGVkaWNhdGVkID0gZmFsc2U7Ci0JCWlwcF9jbGVhbl9jbWRfbm9kZShjX25vZGUpOworCQltdXRleF9sb2NrKCZpcHBkcnYtPmNtZF9sb2NrKTsKKwkJaXBwX2NsZWFuX2NtZF9ub2RlKGN0eCwgY19ub2RlKTsKIAogCQlpZiAobGlzdF9lbXB0eSgmaXBwZHJ2LT5jbWRfbGlzdCkpCiAJCQlwbV9ydW50aW1lX3B1dF9zeW5jKGlwcGRydi0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZpcHBkcnYtPmNtZF9sb2NrKTsKIAkJYnJlYWs7CiAJY2FzZSBJUFBfQ1RSTF9QQVVTRToKIAkJY21kX3dvcmsgPSBjX25vZGUtPnN0b3Bfd29yazsKQEAgLTEyNjAsOSArMTI1OSwxMSBAQAogCS8qIHN0b3JlIGNvbW1hbmQgaW5mbyBpbiBpcHBkcnYgKi8KIAlpcHBkcnYtPmNfbm9kZSA9IGNfbm9kZTsKIAorCW11dGV4X2xvY2soJmNfbm9kZS0+bWVtX2xvY2spOwogCWlmICghaXBwX2NoZWNrX21lbV9saXN0KGNfbm9kZSkpIHsKIAkJRFJNX0RFQlVHX0tNUygiZW1wdHkgbWVtb3J5LlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmxvY2s7CiAJfQogCiAJLyogc2V0IGN1cnJlbnQgcHJvcGVydHkgaW4gaXBwZHJ2ICovCkBAIC0xMjcwLDcgKzEyNzEsNyBAQAogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IHByb3BlcnR5LlxuIik7CiAJCWlwcGRydi0+Y19ub2RlID0gTlVMTDsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfdW5sb2NrOwogCX0KIAogCS8qIGNoZWNrIGNvbW1hbmQgKi8KQEAgLTEyODUsNyArMTI4Niw3IEBACiAJCQlpZiAoIW1fbm9kZSkgewogCQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBub2RlLlxuIik7CiAJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gZXJyX3VubG9jazsKIAkJCX0KIAogCQkJRFJNX0RFQlVHX0tNUygibV9ub2RlWzB4JXhdXG4iLCAoaW50KW1fbm9kZSk7CkBAIC0xMjkzLDcgKzEyOTQsNyBAQAogCQkJcmV0ID0gaXBwX3NldF9tZW1fbm9kZShpcHBkcnYsIGNfbm9kZSwgbV9ub2RlKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQgbSBub2RlLlxuIik7Ci0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGVycl91bmxvY2s7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0xMzA1LDcgKzEzMDYsNyBAQAogCQkJcmV0ID0gaXBwX3NldF9tZW1fbm9kZShpcHBkcnYsIGNfbm9kZSwgbV9ub2RlKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQgbSBub2RlLlxuIik7Ci0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGVycl91bmxvY2s7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0xMzE3LDE0ICsxMzE4LDE2IEBACiAJCQlyZXQgPSBpcHBfc2V0X21lbV9ub2RlKGlwcGRydiwgY19ub2RlLCBtX25vZGUpOwogCQkJaWYgKHJldCkgewogCQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCBtIG5vZGUuXG4iKTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gZXJyX3VubG9jazsKIAkJCX0KIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoImludmFsaWQgb3BlcmF0aW9ucy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfdW5sb2NrOwogCX0KKwltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOwogCiAJRFJNX0RFQlVHX0tNUygiY21kWyVkXVxuIiwgcHJvcGVydHktPmNtZCk7CiAKQEAgLTEzMzMsMTEgKzEzMzYsMTcgQEAKIAkJcmV0ID0gaXBwZHJ2LT5zdGFydChpcHBkcnYtPmRldiwgcHJvcGVydHktPmNtZCk7CiAJCWlmIChyZXQpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHN0YXJ0IG9wcy5cbiIpOworCQkJaXBwZHJ2LT5jX25vZGUgPSBOVUxMOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAogCXJldHVybiAwOworCitlcnJfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY19ub2RlLT5tZW1fbG9jayk7CisJaXBwZHJ2LT5jX25vZGUgPSBOVUxMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaXBwX3N0b3BfcHJvcGVydHkoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsCkBAIC0xMzU0LDYgKzEzNjMsOCBAQAogCS8qIHB1dCBldmVudCAqLwogCWlwcF9wdXRfZXZlbnQoY19ub2RlLCBOVUxMKTsKIAorCW11dGV4X2xvY2soJmNfbm9kZS0+bWVtX2xvY2spOworCiAJLyogY2hlY2sgY29tbWFuZCAqLwogCXN3aXRjaCAocHJvcGVydHktPmNtZCkgewogCWNhc2UgSVBQX0NNRF9NMk06CkBAIC0xMzYxLDExICsxMzcyLDYgQEAKIAkJCS8qIHNvdXJjZS9kZXN0aW5hdGlvbiBtZW1vcnkgbGlzdCAqLwogCQkJaGVhZCA9ICZjX25vZGUtPm1lbV9saXN0W2ldOwogCi0JCQlpZiAobGlzdF9lbXB0eShoZWFkKSkgewotCQkJCURSTV9ERUJVR19LTVMoIm1lbV9saXN0IGlzIGVtcHR5LlxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KIAkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtX25vZGUsIHRtX25vZGUsCiAJCQkJaGVhZCwgbGlzdCkgewogCQkJCXJldCA9IGlwcF9wdXRfbWVtX25vZGUoZHJtX2RldiwgY19ub2RlLApAQCAtMTM4MSwxMSArMTM4Nyw2IEBACiAJCS8qIGRlc3RpbmF0aW9uIG1lbW9yeSBsaXN0ICovCiAJCWhlYWQgPSAmY19ub2RlLT5tZW1fbGlzdFtFWFlOT1NfRFJNX09QU19EU1RdOwogCi0JCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCQlEUk1fREVCVUdfS01TKCJtZW1fbGlzdCBpcyBlbXB0eS5cbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobV9ub2RlLCB0bV9ub2RlLCBoZWFkLCBsaXN0KSB7CiAJCQlyZXQgPSBpcHBfcHV0X21lbV9ub2RlKGRybV9kZXYsIGNfbm9kZSwgbV9ub2RlKTsKIAkJCWlmIChyZXQpIHsKQEAgLTEzOTgsMTEgKzEzOTksNiBAQAogCQkvKiBzb3VyY2UgbWVtb3J5IGxpc3QgKi8KIAkJaGVhZCA9ICZjX25vZGUtPm1lbV9saXN0W0VYWU5PU19EUk1fT1BTX1NSQ107CiAKLQkJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJCURSTV9ERUJVR19LTVMoIm1lbV9saXN0IGlzIGVtcHR5LlxuIik7Ci0JCQlicmVhazsKLQkJfQotCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtX25vZGUsIHRtX25vZGUsIGhlYWQsIGxpc3QpIHsKIAkJCXJldCA9IGlwcF9wdXRfbWVtX25vZGUoZHJtX2RldiwgY19ub2RlLCBtX25vZGUpOwogCQkJaWYgKHJldCkgewpAQCAtMTQxOCw2ICsxNDE0LDggQEAKIAl9CiAKIGVycl9jbGVhcjoKKwltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOworCiAJLyogc3RvcCBvcGVyYXRpb25zICovCiAJaWYgKGlwcGRydi0+c3RvcCkKIAkJaXBwZHJ2LT5zdG9wKGlwcGRydi0+ZGV2LCBwcm9wZXJ0eS0+Y21kKTsKQEAgLTE0NDYsNyArMTQ0NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQltdXRleF9sb2NrKCZjX25vZGUtPmNtZF9sb2NrKTsKKwltdXRleF9sb2NrKCZjX25vZGUtPmxvY2spOwogCiAJcHJvcGVydHkgPSAmY19ub2RlLT5wcm9wZXJ0eTsKIApAQCAtMTQ5NCw3ICsxNDkyLDcgQEAKIAlEUk1fREVCVUdfS01TKCJjdHJsWyVkXSBkb25lLlxuIiwgY21kX3dvcmstPmN0cmwpOwogCiBlcnJfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY19ub2RlLT5jbWRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjX25vZGUtPmxvY2spOwogfQogCiBzdGF0aWMgaW50IGlwcF9zZW5kX2V2ZW50KHN0cnVjdCBleHlub3NfZHJtX2lwcGRydiAqaXBwZHJ2LApAQCAtMTUyNCwxNCArMTUyMiwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwltdXRleF9sb2NrKCZjX25vZGUtPmV2ZW50X2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZjX25vZGUtPmV2ZW50X2xpc3QpKSB7CiAJCURSTV9ERUJVR19LTVMoImV2ZW50IGxpc3QgaXMgZW1wdHkuXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyX2V2ZW50X3VubG9jazsKIAl9CiAKKwltdXRleF9sb2NrKCZjX25vZGUtPm1lbV9sb2NrKTsKIAlpZiAoIWlwcF9jaGVja19tZW1fbGlzdChjX25vZGUpKSB7CiAJCURSTV9ERUJVR19LTVMoImVtcHR5IG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJfbWVtX3VubG9jazsKIAl9CiAKIAkvKiBjaGVjayBjb21tYW5kICovCkBAIC0xNTQ1LDcgKzE1NDcsOCBAQAogCQkJCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9tZW1fbm9kZSwgbGlzdCk7CiAJCQlpZiAoIW1fbm9kZSkgewogCQkJCURSTV9FUlJPUigiZW1wdHkgbWVtb3J5IG5vZGUuXG4iKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX21lbV91bmxvY2s7CiAJCQl9CiAKIAkJCXRidWZfaWRbaV0gPSBtX25vZGUtPmJ1Zl9pZDsKQEAgLTE1NjcsNyArMTU3MCw4IEBACiAJCW1fbm9kZSA9IGlwcF9maW5kX21lbV9ub2RlKGNfbm9kZSwgJnFidWYpOwogCQlpZiAoIW1fbm9kZSkgewogCQkJRFJNX0VSUk9SKCJlbXB0eSBtZW1vcnkgbm9kZS5cbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfbWVtX3VubG9jazsKIAkJfQogCiAJCXRidWZfaWRbRVhZTk9TX0RSTV9PUFNfRFNUXSA9IG1fbm9kZS0+YnVmX2lkOwpAQCAtMTU4NCw3ICsxNTg4LDggQEAKIAkJCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9tZW1fbm9kZSwgbGlzdCk7CiAJCWlmICghbV9ub2RlKSB7CiAJCQlEUk1fRVJST1IoImVtcHR5IG1lbW9yeSBub2RlLlxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9tZW1fdW5sb2NrOwogCQl9CiAKIAkJdGJ1Zl9pZFtFWFlOT1NfRFJNX09QU19TUkNdID0gbV9ub2RlLT5idWZfaWQ7CkBAIC0xNTk1LDggKzE2MDAsMTAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJpbnZhbGlkIG9wZXJhdGlvbnMuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX21lbV91bmxvY2s7CiAJfQorCW11dGV4X3VubG9jaygmY19ub2RlLT5tZW1fbG9jayk7CiAKIAlpZiAodGJ1Zl9pZFtFWFlOT1NfRFJNX09QU19EU1RdICE9IGJ1Zl9pZFtFWFlOT1NfRFJNX09QU19EU1RdKQogCQlEUk1fRVJST1IoImZhaWxlZCB0byBtYXRjaCBidWZfaWRbJWQgJWRdcHJvcF9pZFslZF1cbiIsCkBAIC0xNjExLDExICsxNjE4LDYgQEAKIAllID0gbGlzdF9maXJzdF9lbnRyeSgmY19ub2RlLT5ldmVudF9saXN0LAogCQlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfc2VuZF9ldmVudCwgYmFzZS5saW5rKTsKIAotCWlmICghZSkgewotCQlEUk1fRVJST1IoImVtcHR5IGV2ZW50LlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWRvX2dldHRpbWVvZmRheSgmbm93KTsKIAlEUk1fREVCVUdfS01TKCJ0dl9zZWNbJWxkXXR2X3VzZWNbJWxkXVxuIiwgbm93LnR2X3NlYywgbm93LnR2X3VzZWMpOwogCWUtPmV2ZW50LnR2X3NlYyA9IG5vdy50dl9zZWM7CkBAIC0xNjMwLDExICsxNjMyLDE4IEBACiAJbGlzdF9tb3ZlX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF93YWl0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcm1fZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZjX25vZGUtPmV2ZW50X2xvY2spOwogCiAJRFJNX0RFQlVHX0tNUygiZG9uZSBjbWRbJWRdcHJvcF9pZFslZF1idWZfaWRbJWRdXG4iLAogCQlwcm9wZXJ0eS0+Y21kLCBwcm9wZXJ0eS0+cHJvcF9pZCwgdGJ1Zl9pZFtFWFlOT1NfRFJNX09QU19EU1RdKTsKIAogCXJldHVybiAwOworCitlcnJfbWVtX3VubG9jazoKKwltdXRleF91bmxvY2soJmNfbm9kZS0+bWVtX2xvY2spOworZXJyX2V2ZW50X3VubG9jazoKKwltdXRleF91bmxvY2soJmNfbm9kZS0+ZXZlbnRfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBpcHBfc2NoZWRfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTY3Niw4ICsxNjg1LDYgQEAKIAkJZ290byBlcnJfY29tcGxldGlvbjsKIAl9CiAKLQltdXRleF9sb2NrKCZjX25vZGUtPmV2ZW50X2xvY2spOwotCiAJcmV0ID0gaXBwX3NlbmRfZXZlbnQoaXBwZHJ2LCBjX25vZGUsIGV2ZW50X3dvcmstPmJ1Zl9pZCk7CiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZW5kIGV2ZW50LlxuIik7CkBAIC0xNjg3LDggKzE2OTQsNiBAQAogZXJyX2NvbXBsZXRpb246CiAJaWYgKGlwcF9pc19tMm1fY21kKGNfbm9kZS0+cHJvcGVydHkuY21kKSkKIAkJY29tcGxldGUoJmNfbm9kZS0+c3RhcnRfY29tcGxldGUpOwotCi0JbXV0ZXhfdW5sb2NrKCZjX25vZGUtPmV2ZW50X2xvY2spOwogfQogCiBzdGF0aWMgaW50IGlwcF9zdWJkcnZfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTE2OTksMjMgKzE3MDQsMjEgQEAKIAogCS8qIGdldCBpcHAgZHJpdmVyIGVudHJ5ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpcHBkcnYsICZleHlub3NfZHJtX2lwcGRydl9saXN0LCBkcnZfbGlzdCkgeworCQl1MzIgaXBwX2lkOworCiAJCWlwcGRydi0+ZHJtX2RldiA9IGRybV9kZXY7CiAKIAkJcmV0ID0gaXBwX2NyZWF0ZV9pZCgmY3R4LT5pcHBfaWRyLCAmY3R4LT5pcHBfbG9jaywgaXBwZHJ2LAotCQkJJmlwcGRydi0+aXBwX2lkKTsKLQkJaWYgKHJldCkgeworCQkJCSAgICAmaXBwX2lkKTsKKwkJaWYgKHJldCB8fCBpcHBfaWQgPT0gMCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGlkLlxuIik7Ci0JCQlnb3RvIGVycl9pZHI7CisJCQlnb3RvIGVycjsKIAkJfQogCiAJCURSTV9ERUJVR19LTVMoImNvdW50WyVkXWlwcGRydlsweCV4XWlwcF9pZFslZF1cbiIsCi0JCQljb3VudCsrLCAoaW50KWlwcGRydiwgaXBwZHJ2LT5pcHBfaWQpOworCQkJY291bnQrKywgKGludClpcHBkcnYsIGlwcF9pZCk7CiAKLQkJaWYgKGlwcGRydi0+aXBwX2lkID09IDApIHsKLQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBpcHBfaWRbJWRdXG4iLAotCQkJCWlwcGRydi0+aXBwX2lkKTsKLQkJCWdvdG8gZXJyX2lkcjsKLQkJfQorCQlpcHBkcnYtPnByb3BfbGlzdC5pcHBfaWQgPSBpcHBfaWQ7CiAKIAkJLyogc3RvcmUgcGFyZW50IGRldmljZSBmb3Igbm9kZSAqLwogCQlpcHBkcnYtPnBhcmVudF9kZXYgPSBkZXY7CkBAIC0xNzI0LDM5ICsxNzI3LDQ2IEBACiAJCWlwcGRydi0+ZXZlbnRfd29ya3EgPSBjdHgtPmV2ZW50X3dvcmtxOwogCQlpcHBkcnYtPnNjaGVkX2V2ZW50ID0gaXBwX3NjaGVkX2V2ZW50OwogCQlJTklUX0xJU1RfSEVBRCgmaXBwZHJ2LT5jbWRfbGlzdCk7CisJCW11dGV4X2luaXQoJmlwcGRydi0+Y21kX2xvY2spOwogCiAJCWlmIChpc19kcm1faW9tbXVfc3VwcG9ydGVkKGRybV9kZXYpKSB7CiAJCQlyZXQgPSBkcm1faW9tbXVfYXR0YWNoX2RldmljZShkcm1fZGV2LCBpcHBkcnYtPmRldik7CiAJCQlpZiAocmV0KSB7CiAJCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWN0aXZhdGUgaW9tbXVcbiIpOwotCQkJCWdvdG8gZXJyX2lvbW11OworCQkJCWdvdG8gZXJyOwogCQkJfQogCQl9CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9pb21tdToKK2VycjoKIAkvKiBnZXQgaXBwIGRyaXZlciBlbnRyeSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpcHBkcnYsICZleHlub3NfZHJtX2lwcGRydl9saXN0LCBkcnZfbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UoaXBwZHJ2LCAmZXh5bm9zX2RybV9pcHBkcnZfbGlzdCwKKwkJCQkJCWRydl9saXN0KSB7CiAJCWlmIChpc19kcm1faW9tbXVfc3VwcG9ydGVkKGRybV9kZXYpKQogCQkJZHJtX2lvbW11X2RldGFjaF9kZXZpY2UoZHJtX2RldiwgaXBwZHJ2LT5kZXYpOwogCi1lcnJfaWRyOgotCWlkcl9kZXN0cm95KCZjdHgtPmlwcF9pZHIpOwotCWlkcl9kZXN0cm95KCZjdHgtPnByb3BfaWRyKTsKKwkJaXBwX3JlbW92ZV9pZCgmY3R4LT5pcHBfaWRyLCAmY3R4LT5pcHBfbG9jaywKKwkJCQlpcHBkcnYtPnByb3BfbGlzdC5pcHBfaWQpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGlwcF9zdWJkcnZfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV4eW5vc19kcm1faXBwZHJ2ICppcHBkcnY7CisJc3RydWN0IGlwcF9jb250ZXh0ICpjdHggPSBnZXRfaXBwX2NvbnRleHQoZGV2KTsKIAogCS8qIGdldCBpcHAgZHJpdmVyIGVudHJ5ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpcHBkcnYsICZleHlub3NfZHJtX2lwcGRydl9saXN0LCBkcnZfbGlzdCkgewogCQlpZiAoaXNfZHJtX2lvbW11X3N1cHBvcnRlZChkcm1fZGV2KSkKIAkJCWRybV9pb21tdV9kZXRhY2hfZGV2aWNlKGRybV9kZXYsIGlwcGRydi0+ZGV2KTsKIAorCQlpcHBfcmVtb3ZlX2lkKCZjdHgtPmlwcF9pZHIsICZjdHgtPmlwcF9sb2NrLAorCQkJCWlwcGRydi0+cHJvcF9saXN0LmlwcF9pZCk7CisKIAkJaXBwZHJ2LT5kcm1fZGV2ID0gTlVMTDsKIAkJZXh5bm9zX2RybV9pcHBkcnZfdW5yZWdpc3RlcihpcHBkcnYpOwogCX0KQEAgLTE3ODcsMjAgKzE3OTcsMTQgQEAKIAlzdHJ1Y3QgZHJtX2V4eW5vc19maWxlX3ByaXZhdGUgKmZpbGVfcHJpdiA9IGZpbGUtPmRyaXZlcl9wcml2OwogCXN0cnVjdCBleHlub3NfZHJtX2lwcF9wcml2YXRlICpwcml2ID0gZmlsZV9wcml2LT5pcHBfcHJpdjsKIAlzdHJ1Y3QgZXh5bm9zX2RybV9pcHBkcnYgKmlwcGRydiA9IE5VTEw7CisJc3RydWN0IGlwcF9jb250ZXh0ICpjdHggPSBnZXRfaXBwX2NvbnRleHQoZGV2KTsKIAlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfY21kX25vZGUgKmNfbm9kZSwgKnRjX25vZGU7CiAJaW50IGNvdW50ID0gMDsKIAogCURSTV9ERUJVR19LTVMoImZvciBwcml2WzB4JXhdXG4iLCAoaW50KXByaXYpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmV4eW5vc19kcm1faXBwZHJ2X2xpc3QpKSB7Ci0JCURSTV9ERUJVR19LTVMoImlwcGRydl9saXN0IGlzIGVtcHR5LlxuIik7Ci0JCWdvdG8gZXJyX2NsZWFyOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoaXBwZHJ2LCAmZXh5bm9zX2RybV9pcHBkcnZfbGlzdCwgZHJ2X2xpc3QpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJmlwcGRydi0+Y21kX2xpc3QpKQotCQkJY29udGludWU7Ci0KKwkJbXV0ZXhfbG9jaygmaXBwZHJ2LT5jbWRfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjX25vZGUsIHRjX25vZGUsCiAJCQkmaXBwZHJ2LT5jbWRfbGlzdCwgbGlzdCkgewogCQkJRFJNX0RFQlVHX0tNUygiY291bnRbJWRdaXBwZHJ2WzB4JXhdXG4iLApAQCAtMTgyMCwxNCArMTgyNCwxNCBAQAogCQkJCX0KIAogCQkJCWlwcGRydi0+ZGVkaWNhdGVkID0gZmFsc2U7Ci0JCQkJaXBwX2NsZWFuX2NtZF9ub2RlKGNfbm9kZSk7CisJCQkJaXBwX2NsZWFuX2NtZF9ub2RlKGN0eCwgY19ub2RlKTsKIAkJCQlpZiAobGlzdF9lbXB0eSgmaXBwZHJ2LT5jbWRfbGlzdCkpCiAJCQkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoaXBwZHJ2LT5kZXYpOwogCQkJfQogCQl9CisJCW11dGV4X3VubG9jaygmaXBwZHJ2LT5jbWRfbG9jayk7CiAJfQogCi1lcnJfY2xlYXI6CiAJa2ZyZWUocHJpdik7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2lwcC5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2lwcC5oCmluZGV4IGFiMTYzNGIuLjdhYWVhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9pcHAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1faXBwLmgKQEAgLTUyLDcgKzUyLDcgQEAKICAqIEBsaXN0OiBsaXN0IGhlYWQgdG8gY29tbWFuZCBxdWV1ZSBpbmZvcm1hdGlvbi4KICAqIEBldmVudF9saXN0OiBsaXN0IGhlYWQgb2YgZXZlbnQuCiAgKiBAbWVtX2xpc3Q6IGxpc3QgaGVhZCB0byBzb3VyY2UsZGVzdGluYXRpb24gbWVtb3J5IHF1ZXVlIGluZm9ybWF0aW9uLgotICogQGNtZF9sb2NrOiBsb2NrIGZvciBzeW5jaHJvbml6YXRpb24gb2YgYWNjZXNzIHRvIGlvY3RsLgorICogQGxvY2s6IGxvY2sgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gaW9jdGwuCiAgKiBAbWVtX2xvY2s6IGxvY2sgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gbWVtb3J5IG5vZGVzLgogICogQGV2ZW50X2xvY2s6IGxvY2sgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gc2NoZWR1bGVkIGV2ZW50LgogICogQHN0YXJ0X2NvbXBsZXRlOiBjb21wbGV0aW9uIG9mIHN0YXJ0IG9mIGNvbW1hbmQuCkBAIC02OCw3ICs2OCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJZXZlbnRfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW1lbV9saXN0W0VYWU5PU19EUk1fT1BTX01BWF07Ci0Jc3RydWN0IG11dGV4CWNtZF9sb2NrOworCXN0cnVjdCBtdXRleAlsb2NrOwogCXN0cnVjdCBtdXRleAltZW1fbG9jazsKIAlzdHJ1Y3QgbXV0ZXgJZXZlbnRfbG9jazsKIAlzdHJ1Y3QgY29tcGxldGlvbglzdGFydF9jb21wbGV0ZTsKQEAgLTgzLDcgKzgzLDcgQEAKIC8qCiAgKiBBIHN0cnVjdHVyZSBvZiBidWZmZXIgaW5mb3JtYXRpb24uCiAgKgotICogQGdlbV9vYmpzOiBZLCBDYiwgQ3IgZWFjaCBnZW0gb2JqZWN0LgorICogQGhhbmRsZXM6IFksIENiLCBDciBlYWNoIGdlbSBvYmplY3QgaGFuZGxlLgogICogQGJhc2U6IFksIENiLCBDciBlYWNoIHBsYW5hciBhZGRyZXNzLgogICovCiBzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfYnVmX2luZm8gewpAQCAtMTQyLDEyICsxNDIsMTIgQEAKICAqIEBwYXJlbnRfZGV2OiBwYXJlbnQgZGV2aWNlIGluZm9ybWF0aW9uLgogICogQGRldjogcGxhdGZvcm0gZGV2aWNlLgogICogQGRybV9kZXY6IGRybSBkZXZpY2UuCi0gKiBAaXBwX2lkOiBpZCBvZiBpcHAgZHJpdmVyLgogICogQGRlZGljYXRlZDogZGVkaWNhdGVkIGlwcCBkZXZpY2UuCiAgKiBAb3BzOiBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhdGlvbnMuCiAgKiBAZXZlbnRfd29ya3E6IGV2ZW50IHdvcmsgcXVldWUuCiAgKiBAY19ub2RlOiBjdXJyZW50IGNvbW1hbmQgaW5mb3JtYXRpb24uCiAgKiBAY21kX2xpc3Q6IGxpc3QgaGVhZCBmb3IgY29tbWFuZCBpbmZvcm1hdGlvbi4KKyAqIEBjbWRfbG9jazogbG9jayBmb3Igc3luY2hyb25pemF0aW9uIG9mIGFjY2VzcyB0byBjbWRfbGlzdC4KICAqIEBwcm9wX2xpc3Q6IHByb3BlcnR5IGluZm9ybWF0aW9ucyBvZiBjdXJyZW50IGlwcCBkcml2ZXIuCiAgKiBAY2hlY2tfcHJvcGVydHk6IGNoZWNrIHByb3BlcnR5IGFib3V0IGZvcm1hdCwgc2l6ZSwgYnVmZmVyLgogICogQHJlc2V0OiByZXNldCBpcHAgYmxvY2suCkBAIC0xNjAsMTMgKzE2MCwxMyBAQAogCXN0cnVjdCBkZXZpY2UJKnBhcmVudF9kZXY7CiAJc3RydWN0IGRldmljZQkqZGV2OwogCXN0cnVjdCBkcm1fZGV2aWNlCSpkcm1fZGV2OwotCXUzMglpcHBfaWQ7CiAJYm9vbAlkZWRpY2F0ZWQ7CiAJc3RydWN0IGV4eW5vc19kcm1faXBwX29wcwkqb3BzW0VYWU5PU19EUk1fT1BTX01BWF07CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKmV2ZW50X3dvcmtxOwogCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9jbWRfbm9kZSAqY19ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQJY21kX2xpc3Q7Ci0Jc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHJvcF9saXN0OworCXN0cnVjdCBtdXRleAljbWRfbG9jazsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19pcHBfcHJvcF9saXN0IHByb3BfbGlzdDsKIAogCWludCAoKmNoZWNrX3Byb3BlcnR5KShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9wcm9wZXJ0eSAqcHJvcGVydHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9yb3RhdG9yLmMKaW5kZXggN2I5MDE2OC4uZjAxZmJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fcm90YXRvci5jCkBAIC0xNTgsOCArMTU4LDkgQEAKIAkJCXJvdC0+Y3VyX2J1Zl9pZFtFWFlOT1NfRFJNX09QU19EU1RdOwogCQlxdWV1ZV93b3JrKGlwcGRydi0+ZXZlbnRfd29ya3EsCiAJCQkoc3RydWN0IHdvcmtfc3RydWN0ICopZXZlbnRfd29yayk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJRFJNX0VSUk9SKCJ0aGUgU0ZSIGlzIHNldCBpbGxlZ2FsbHlcbiIpOworCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTQ2OSwxMSArNDcwLDcgQEAKIAogc3RhdGljIGludCByb3RhdG9yX2luaXRfcHJvcF9saXN0KHN0cnVjdCBleHlub3NfZHJtX2lwcGRydiAqaXBwZHJ2KQogewotCXN0cnVjdCBkcm1fZXh5bm9zX2lwcF9wcm9wX2xpc3QgKnByb3BfbGlzdDsKLQotCXByb3BfbGlzdCA9IGRldm1fa3phbGxvYyhpcHBkcnYtPmRldiwgc2l6ZW9mKCpwcm9wX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3BfbGlzdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3RydWN0IGRybV9leHlub3NfaXBwX3Byb3BfbGlzdCAqcHJvcF9saXN0ID0gJmlwcGRydi0+cHJvcF9saXN0OwogCiAJcHJvcF9saXN0LT52ZXJzaW9uID0gMTsKIAlwcm9wX2xpc3QtPmZsaXAgPSAoMSA8PCBFWFlOT1NfRFJNX0ZMSVBfVkVSVElDQUwpIHwKQEAgLTQ4Niw4ICs0ODMsNiBAQAogCXByb3BfbGlzdC0+Y3JvcCA9IDA7CiAJcHJvcF9saXN0LT5zY2FsZSA9IDA7CiAKLQlpcHBkcnYtPnByb3BfbGlzdCA9IHByb3BfbGlzdDsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fdmlkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3ZpZGkuYwppbmRleCA4NTJmMmRhLi4yZmI4NzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fdmlkaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV92aWRpLmMKQEAgLTUxLDYgKzUxLDcgQEAKIAlzdHJ1Y3QgZHJtX2NydGMJCQkqY3J0YzsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIJCSplbmNvZGVyOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yCQljb25uZWN0b3I7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2CXN1YmRydjsKIAlzdHJ1Y3QgdmlkaV93aW5fZGF0YQkJd2luX2RhdGFbV0lORE9XU19OUl07CiAJc3RydWN0IGVkaWQJCQkqcmF3X2VkaWQ7CiAJdW5zaWduZWQgaW50CQkJY2xrZGl2OwpAQCAtMjk0LDE0ICsyOTUsMTMgQEAKIH0KIAogc3RhdGljIGludCB2aWRpX21ncl9pbml0aWFsaXplKHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1nciwKLQkJCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LCBpbnQgcGlwZSkKKwkJCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2KQogewogCXN0cnVjdCB2aWRpX2NvbnRleHQgKmN0eCA9IG1nci0+Y3R4OworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKnByaXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKIAotCURSTV9FUlJPUigidmlkaSBpbml0aWFsaXplIGN0PSVwIGRldj0lcCBwaXBlPSVkXG4iLCBjdHgsIGRybV9kZXYsIHBpcGUpOwotCi0JY3R4LT5kcm1fZGV2ID0gZHJtX2RldjsKLQljdHgtPnBpcGUgPSBwaXBlOworCW1nci0+ZHJtX2RldiA9IGN0eC0+ZHJtX2RldiA9IGRybV9kZXY7CisJbWdyLT5waXBlID0gY3R4LT5waXBlID0gcHJpdi0+cGlwZSsrOwogCiAJLyoKIAkgKiBlbmFibGUgZHJtIGlycSBtb2RlLgpAQCAtMzI0LDcgKzMyNCw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyB2aWRpX21hbmFnZXJfb3BzID0gewotCS5pbml0aWFsaXplID0gdmlkaV9tZ3JfaW5pdGlhbGl6ZSwKIAkuZHBtcyA9IHZpZGlfZHBtcywKIAkuY29tbWl0ID0gdmlkaV9jb21taXQsCiAJLmVuYWJsZV92YmxhbmsgPSB2aWRpX2VuYWJsZV92YmxhbmssCkBAIC01MzMsMTIgKzUzMiw2IEBACiAJcmV0dXJuIGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOwogfQogCi1zdGF0aWMgaW50IHZpZGlfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0JcmV0dXJuIE1PREVfT0s7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXIgKnZpZGlfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IHZpZGlfY29udGV4dCAqY3R4ID0gY3R4X2Zyb21fY29ubmVjdG9yKGNvbm5lY3Rvcik7CkBAIC01NDgsNyArNTQxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyB2aWRpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHZpZGlfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gdmlkaV9tb2RlX3ZhbGlkLAogCS5iZXN0X2VuY29kZXIgPSB2aWRpX2Jlc3RfZW5jb2RlciwKIH07CiAKQEAgLTU4NiwxMyArNTc4LDM4IEBACiAJLm9wcyA9ICZ2aWRpX2Rpc3BsYXlfb3BzLAogfTsKIAorc3RhdGljIGludCB2aWRpX3N1YmRydl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1nciA9IGdldF92aWRpX21ncihkZXYpOworCXN0cnVjdCB2aWRpX2NvbnRleHQgKmN0eCA9IG1nci0+Y3R4OworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGN0eC0+Y3J0YzsKKwlpbnQgcmV0OworCisJdmlkaV9tZ3JfaW5pdGlhbGl6ZShtZ3IsIGRybV9kZXYpOworCisJcmV0ID0gZXh5bm9zX2RybV9jcnRjX2NyZWF0ZSgmdmlkaV9tYW5hZ2VyKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBjcnRjLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZXh5bm9zX2RybV9jcmVhdGVfZW5jX2Nvbm4oZHJtX2RldiwgJnZpZGlfZGlzcGxheSk7CisJaWYgKHJldCkgeworCQljcnRjLT5mdW5jcy0+ZGVzdHJveShjcnRjKTsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGVuY29kZXIgYW5kIGNvbm5lY3Rvci5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZpZGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2OwogCXN0cnVjdCB2aWRpX2NvbnRleHQgKmN0eDsKIAlpbnQgcmV0OwogCi0JY3R4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwljdHggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWN0eCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTYwNywyOCArNjI0LDQzIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmdmlkaV9tYW5hZ2VyKTsKIAotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jb25uZWN0aW9uKTsKLQlpZiAocmV0IDwgMCkKLQkJRFJNX0lORk8oImZhaWxlZCB0byBjcmVhdGUgY29ubmVjdGlvbiBzeXNmcy5cbiIpOworCXN1YmRydiA9ICZjdHgtPnN1YmRydjsKKwlzdWJkcnYtPmRldiA9ICZwZGV2LT5kZXY7CisJc3ViZHJ2LT5wcm9iZSA9IHZpZGlfc3ViZHJ2X3Byb2JlOwogCi0JZXh5bm9zX2RybV9tYW5hZ2VyX3JlZ2lzdGVyKCZ2aWRpX21hbmFnZXIpOwotCWV4eW5vc19kcm1fZGlzcGxheV9yZWdpc3RlcigmdmlkaV9kaXNwbGF5KTsKKwlyZXQgPSBleHlub3NfZHJtX3N1YmRydl9yZWdpc3RlcihzdWJkcnYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBkcm0gdmlkaSBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY29ubmVjdGlvbik7CisJaWYgKHJldCA8IDApIHsKKwkJZXh5bm9zX2RybV9zdWJkcnZfdW5yZWdpc3RlcihzdWJkcnYpOworCQlEUk1fSU5GTygiZmFpbGVkIHRvIGNyZWF0ZSBjb25uZWN0aW9uIHN5c2ZzLlxuIik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgdmlkaV9jb250ZXh0ICpjdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWV4eW5vc19kcm1fZGlzcGxheV91bnJlZ2lzdGVyKCZ2aWRpX2Rpc3BsYXkpOwotCWV4eW5vc19kcm1fbWFuYWdlcl91bnJlZ2lzdGVyKCZ2aWRpX21hbmFnZXIpOworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1nciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB2aWRpX2NvbnRleHQgKmN0eCA9IG1nci0+Y3R4OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGN0eC0+ZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBtZ3ItPmNydGM7CiAKIAlpZiAoY3R4LT5yYXdfZWRpZCAhPSAoc3RydWN0IGVkaWQgKilmYWtlX2VkaWRfaW5mbykgewogCQlrZnJlZShjdHgtPnJhd19lZGlkKTsKIAkJY3R4LT5yYXdfZWRpZCA9IE5VTEw7CisKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJY3J0Yy0+ZnVuY3MtPmRlc3Ryb3koY3J0Yyk7CisJZW5jb2Rlci0+ZnVuY3MtPmRlc3Ryb3koZW5jb2Rlcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKCZjdHgtPmNvbm5lY3Rvcik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQwLDMgKzY3MiwzMSBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKKworaW50IGV4eW5vc19kcm1fcHJvYmVfdmlkaSh2b2lkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJaW50IHJldDsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJleHlub3MtZHJtLXZpZGkiLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZpZGlfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9yZW1vdmVfdmlkaSh2b2lkKQoreworCXN0cnVjdCB2aWRpX2NvbnRleHQgKmN0eCA9IHZpZGlfbWFuYWdlci5jdHg7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnYgPSAmY3R4LT5zdWJkcnY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShzdWJkcnYtPmRldik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlkaV9kcml2ZXIpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaS5jCmluZGV4IDlhNmQ2NTJhLi5jMTA0ZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaS5jCkBAIC0zMywxMyArMzMsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9oZG1pLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAjaW5jbHVkZSA8ZHJtL2V4eW5vc19kcm0uaD4KIAogI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9jcnRjLmgiCiAjaW5jbHVkZSAiZXh5bm9zX21peGVyLmgiCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC00OCw2ICs1Miw4IEBACiAjZGVmaW5lIGdldF9oZG1pX2Rpc3BsYXkoZGV2KQlwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSkKICNkZWZpbmUgY3R4X2Zyb21fY29ubmVjdG9yKGMpCWNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgaGRtaV9jb250ZXh0LCBjb25uZWN0b3IpCiAKKyNkZWZpbmUgSE9UUExVR19ERUJPVU5DRV9NUwkJMTEwMAorCiAvKiBBVkkgaGVhZGVyIGFuZCBhc3BlY3QgcmF0aW8gKi8KICNkZWZpbmUgSERNSV9BVklfVkVSU0lPTgkJMHgwMgogI2RlZmluZSBIRE1JX0FWSV9MRU5HVEgJCTB4MEQKQEAgLTY2LDYgKzcyLDggQEAKIAogc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgewogCXVuc2lnbmVkIGludCB0eXBlOworCWNvbnN0IHN0cnVjdCBoZG1pcGh5X2NvbmZpZyAqcGh5X2NvbmZzOworCXVuc2lnbmVkIGludCBwaHlfY29uZl9jb3VudDsKIAl1bnNpZ25lZCBpbnQgaXNfYXBiX3BoeToxOwogfTsKIApAQCAtNzQsNyArODIsNiBAQAogCXN0cnVjdCBjbGsJCQkqc2Nsa19oZG1pOwogCXN0cnVjdCBjbGsJCQkqc2Nsa19waXhlbDsKIAlzdHJ1Y3QgY2xrCQkJKnNjbGtfaGRtaXBoeTsKLQlzdHJ1Y3QgY2xrCQkJKmhkbWlwaHk7CiAJc3RydWN0IGNsawkJCSptb3V0X2hkbWk7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEJKnJlZ3VsX2J1bGs7CiAJaW50CQkJCXJlZ3VsX2NvdW50OwpAQCAtMTg1LDE3ICsxOTIsMjMgQEAKIAogCXZvaWQgX19pb21lbQkJCSpyZWdzOwogCWludAkJCQlpcnE7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJaG90cGx1Z193b3JrOwogCiAJc3RydWN0IGkyY19hZGFwdGVyCQkqZGRjX2FkcHQ7CiAJc3RydWN0IGkyY19jbGllbnQJCSpoZG1pcGh5X3BvcnQ7CiAKIAkvKiBjdXJyZW50IGhkbWlwaHkgY29uZiByZWdzICovCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUJCWN1cnJlbnRfbW9kZTsKIAlzdHJ1Y3QgaGRtaV9jb25mX3JlZ3MJCW1vZGVfY29uZjsKIAogCXN0cnVjdCBoZG1pX3Jlc291cmNlcwkJcmVzOwogCiAJaW50CQkJCWhwZF9ncGlvOworCXZvaWQgX19pb21lbQkJCSpyZWdzX2hkbWlwaHk7CisJY29uc3Qgc3RydWN0IGhkbWlwaHlfY29uZmlnCQkqcGh5X2NvbmZzOworCXVuc2lnbmVkIGludAkJCXBoeV9jb25mX2NvdW50OwogCisJc3RydWN0IHJlZ21hcAkJCSpwbXVyZWc7CiAJZW51bSBoZG1pX3R5cGUJCQl0eXBlOwogfTsKIApAQCAtMjA0LDE0ICsyMTcsNiBAQAogCXU4IGNvbmZbMzJdOwogfTsKIAotc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgZXh5bm9zNDIxMl9oZG1pX2RyaXZlcl9kYXRhID0gewotCS50eXBlCT0gSERNSV9UWVBFMTQsCi19OwotCi1zdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSBleHlub3M1X2hkbWlfZHJpdmVyX2RhdGEgPSB7Ci0JLnR5cGUJPSBIRE1JX1RZUEUxNCwKLX07Ci0KIC8qIGxpc3Qgb2YgcGh5IGNvbmZpZyBzZXR0aW5ncyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBoZG1pcGh5X2NvbmZpZyBoZG1pcGh5X3YxM19jb25maWdzW10gPSB7CiAJewpAQCAtMzE5LDE4ICszMjQsMTggQEAKIAl7CiAJCS5waXhlbF9jbG9jayA9IDcxMDAwMDAwLAogCQkuY29uZiA9IHsKLQkJCTB4MDEsIDB4OTEsIDB4MWUsIDB4MTUsIDB4NDAsIDB4M2MsIDB4Y2UsIDB4MDgsCi0JCQkweDA0LCAweDIwLCAweGIyLCAweGQ4LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAotCQkJMHgwNiwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKKwkJCTB4MDEsIDB4ZDEsIDB4M2IsIDB4MzUsIDB4NDAsIDB4MGMsIDB4MDQsIDB4MDgsCisJCQkweDg1LCAweGEwLCAweDYzLCAweGQ5LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAorCQkJMHgwOCwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKIAkJCTB4NTQsIDB4YWQsIDB4MjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ODAsCiAJCX0sCiAJfSwKIAl7CiAJCS5waXhlbF9jbG9jayA9IDczMjUwMDAwLAogCQkuY29uZiA9IHsKLQkJCTB4MDEsIDB4ZDEsIDB4MWYsIDB4MTUsIDB4NDAsIDB4MTgsIDB4ZTksIDB4MDgsCi0JCQkweDAyLCAweGEwLCAweGI3LCAweGQ4LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAotCQkJMHgwNiwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKKwkJCTB4MDEsIDB4ZDEsIDB4M2QsIDB4MzUsIDB4NDAsIDB4MTgsIDB4MDIsIDB4MDgsCisJCQkweDgzLCAweGEwLCAweDZlLCAweGQ5LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAorCQkJMHgwOCwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKIAkJCTB4NTQsIDB4YTgsIDB4MjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ODAsCiAJCX0sCiAJfSwKQEAgLTM2MiwxNSArMzY3LDYgQEAKIAkJfSwKIAl9LAogCXsKLQkJLnBpeGVsX2Nsb2NrID0gODg3NTAwMDAsCi0JCS5jb25mID0gewotCQkJMHgwMSwgMHg5MSwgMHgyNSwgMHgxNywgMHg0MCwgMHgzMCwgMHhmZSwgMHgwOCwKLQkJCTB4MDYsIDB4MjAsIDB4ZGUsIDB4ZDgsIDB4NDUsIDB4YTAsIDB4YWMsIDB4ODAsCi0JCQkweDA2LCAweDgwLCAweDExLCAweDA0LCAweDAyLCAweDIyLCAweDQ0LCAweDg2LAotCQkJMHg1NCwgMHg4YSwgMHgyNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MCwKLQkJfSwKLQl9LAotCXsKIAkJLnBpeGVsX2Nsb2NrID0gMTA2NTAwMDAwLAogCQkuY29uZiA9IHsKIAkJCTB4MDEsIDB4ZDEsIDB4MmMsIDB4MTIsIDB4NDAsIDB4MGMsIDB4MDksIDB4MDgsCkBAIC0zOTEsMTggKzM4NywxOCBAQAogCXsKIAkJLnBpeGVsX2Nsb2NrID0gMTE1NTAwMDAwLAogCQkuY29uZiA9IHsKLQkJCTB4MDEsIDB4ZDEsIDB4MzAsIDB4MWEsIDB4NDAsIDB4NDAsIDB4MTAsIDB4MDQsCi0JCQkweDA0LCAweGEwLCAweDIxLCAweGQ5LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAotCQkJMHgwNiwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKKwkJCTB4MDEsIDB4ZDEsIDB4MzAsIDB4MTIsIDB4NDAsIDB4NDAsIDB4MTAsIDB4MDgsCisJCQkweDgwLCAweDgwLCAweDIxLCAweGQ5LCAweDQ1LCAweGEwLCAweGFjLCAweDgwLAorCQkJMHgwOCwgMHg4MCwgMHgxMSwgMHgwNCwgMHgwMiwgMHgyMiwgMHg0NCwgMHg4NiwKIAkJCTB4NTQsIDB4YWEsIDB4MjUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ODAsCiAJCX0sCiAJfSwKIAl7CiAJCS5waXhlbF9jbG9jayA9IDExOTAwMDAwMCwKIAkJLmNvbmYgPSB7Ci0JCQkweDAxLCAweDkxLCAweDMyLCAweDE0LCAweDQwLCAweDYwLCAweGQ4LCAweDA4LAotCQkJMHgwNiwgMHgyMCwgMHgyYSwgMHhkOSwgMHg0NSwgMHhhMCwgMHhhYywgMHg4MCwKLQkJCTB4MDYsIDB4ODAsIDB4MTEsIDB4MDQsIDB4MDIsIDB4MjIsIDB4NDQsIDB4ODYsCisJCQkweDAxLCAweGQxLCAweDMyLCAweDFhLCAweDQwLCAweDMwLCAweGQ4LCAweDA4LAorCQkJMHgwNCwgMHhhMCwgMHgyYSwgMHhkOSwgMHg0NSwgMHhhMCwgMHhhYywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MTEsIDB4MDQsIDB4MDIsIDB4MjIsIDB4NDQsIDB4ODYsCiAJCQkweDU0LCAweDlkLCAweDI1LCAweDAzLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAogCQl9LAogCX0sCkBAIC00MjYsNiArNDIyLDE4MyBAQAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlwaHlfY29uZmlnIGhkbWlwaHlfNTQyMF9jb25maWdzW10gPSB7CisJeworCQkucGl4ZWxfY2xvY2sgPSAyNTIwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweDUyLCAweDNGLCAweDU1LCAweDQwLCAweDAxLCAweDAwLCAweEM4LAorCQkJMHg4MiwgMHhDOCwgMHhCRCwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDYsIDB4ODAsIDB4MDEsIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEY0LCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSAyNzAwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDIyLCAweDUxLCAweDQwLCAweDA4LCAweEZDLCAweEUwLAorCQkJMHg5OCwgMHhFOCwgMHhDQiwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDYsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEU0LCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSAyNzAyNzAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDJELCAweDcyLCAweDQwLCAweDY0LCAweDEyLCAweEM4LAorCQkJMHg0MywgMHhFOCwgMHgwRSwgMHhEOSwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MjYsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEUzLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSAzNjAwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweDUxLCAweDJELCAweDU1LCAweDQwLCAweDQwLCAweDAwLCAweEM4LAorCQkJMHgwMiwgMHhDOCwgMHgwRSwgMHhEOSwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEFCLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA0MDAwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDIxLCAweDMxLCAweDQwLCAweDNDLCAweDI4LCAweEM4LAorCQkJMHg4NywgMHhFOCwgMHhDOCwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweDlBLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA2NTAwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDM2LCAweDM0LCAweDQwLCAweDBDLCAweDA0LCAweEM4LAorCQkJMHg4MiwgMHhFOCwgMHg0NSwgMHhEOSwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEJELCAweDI0LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA3MTAwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDNCLCAweDM1LCAweDQwLCAweDBDLCAweDA0LCAweEM4LAorCQkJMHg4NSwgMHhFOCwgMHg2MywgMHhEOSwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweDU3LCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA3MzI1MDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDFGLCAweDEwLCAweDQwLCAweDc4LCAweDhELCAweEM4LAorCQkJMHg4MSwgMHhFOCwgMHhCNywgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4NTYsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEE4LCAweDI0LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA3NDE3NjAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDFGLCAweDEwLCAweDQwLCAweDVCLCAweEVGLCAweEM4LAorCQkJMHg4MSwgMHhFOCwgMHhCOSwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4NTYsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEE2LCAweDI0LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA3NDI1MDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDFGLCAweDEwLCAweDQwLCAweDQwLCAweEY4LCAweDA4LAorCQkJMHg4MSwgMHhFOCwgMHhCQSwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MjYsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MjIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweEE1LCAweDI0LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA4MzUwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDIzLCAweDExLCAweDQwLCAweDBDLCAweEZCLCAweEM4LAorCQkJMHg4NSwgMHhFOCwgMHhEMSwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweDRBLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSA4ODc1MDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDI1LCAweDExLCAweDQwLCAweDE4LCAweEZGLCAweEM4LAorCQkJMHg4MywgMHhFOCwgMHhERSwgMHhEOCwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweDQ1LCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSAxMDY1MDAwMDAsCisJCS5jb25mID0geworCQkJMHgwMSwgMHhEMSwgMHgyQywgMHgxMiwgMHg0MCwgMHgwQywgMHgwOSwgMHhDOCwKKwkJCTB4ODQsIDB4RTgsIDB4MEEsIDB4RDksIDB4NDUsIDB4QTAsIDB4QUMsIDB4ODAsCisJCQkweDA4LCAweDgwLCAweDA5LCAweDg0LCAweDA1LCAweDAyLCAweDI0LCAweDY2LAorCQkJMHg1NCwgMHg3MywgMHgyNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MCwKKwkJfSwKKwl9LAorCXsKKwkJLnBpeGVsX2Nsb2NrID0gMTA4MDAwMDAwLAorCQkuY29uZiA9IHsKKwkJCTB4MDEsIDB4NTEsIDB4MkQsIDB4MTUsIDB4NDAsIDB4MDEsIDB4MDAsIDB4QzgsCisJCQkweDgyLCAweEM4LCAweDBFLCAweEQ5LCAweDQ1LCAweEEwLCAweEFDLCAweDgwLAorCQkJMHgwOCwgMHg4MCwgMHgwOSwgMHg4NCwgMHgwNSwgMHgwMiwgMHgyNCwgMHg2NiwKKwkJCTB4NTQsIDB4QzcsIDB4MjUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ODAsCisJCX0sCisJfSwKKwl7CisJCS5waXhlbF9jbG9jayA9IDExNTUwMDAwMCwKKwkJLmNvbmYgPSB7CisJCQkweDAxLCAweEQxLCAweDMwLCAweDE0LCAweDQwLCAweDBDLCAweDAzLCAweEM4LAorCQkJMHg4OCwgMHhFOCwgMHgyMSwgMHhEOSwgMHg0NSwgMHhBMCwgMHhBQywgMHg4MCwKKwkJCTB4MDgsIDB4ODAsIDB4MDksIDB4ODQsIDB4MDUsIDB4MDIsIDB4MjQsIDB4NjYsCisJCQkweDU0LCAweDZBLCAweDI0LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDgwLAorCQl9LAorCX0sCisJeworCQkucGl4ZWxfY2xvY2sgPSAxNDYyNTAwMDAsCisJCS5jb25mID0geworCQkJMHgwMSwgMHhEMSwgMHgzRCwgMHgxNSwgMHg0MCwgMHgxOCwgMHhGRCwgMHhDOCwKKwkJCTB4ODMsIDB4RTgsIDB4NkUsIDB4RDksIDB4NDUsIDB4QTAsIDB4QUMsIDB4ODAsCisJCQkweDA4LCAweDgwLCAweDA5LCAweDg0LCAweDA1LCAweDAyLCAweDI0LCAweDY2LAorCQkJMHg1NCwgMHg1NCwgMHgyNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MCwKKwkJfSwKKwl9LAorCXsKKwkJLnBpeGVsX2Nsb2NrID0gMTQ4NTAwMDAwLAorCQkuY29uZiA9IHsKKwkJCTB4MDEsIDB4RDEsIDB4MUYsIDB4MDAsIDB4NDAsIDB4NDAsIDB4RjgsIDB4MDgsCisJCQkweDgxLCAweEU4LCAweEJBLCAweEQ4LCAweDQ1LCAweEEwLCAweEFDLCAweDgwLAorCQkJMHgyNiwgMHg4MCwgMHgwOSwgMHg4NCwgMHgwNSwgMHgyMiwgMHgyNCwgMHg2NiwKKwkJCTB4NTQsIDB4NEIsIDB4MjUsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MDEsIDB4ODAsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSBleHlub3M1NDIwX2hkbWlfZHJpdmVyX2RhdGEgPSB7CisJLnR5cGUJCT0gSERNSV9UWVBFMTQsCisJLnBoeV9jb25mcwk9IGhkbWlwaHlfNTQyMF9jb25maWdzLAorCS5waHlfY29uZl9jb3VudAk9IEFSUkFZX1NJWkUoaGRtaXBoeV81NDIwX2NvbmZpZ3MpLAorCS5pc19hcGJfcGh5CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSBleHlub3M0MjEyX2hkbWlfZHJpdmVyX2RhdGEgPSB7CisJLnR5cGUJCT0gSERNSV9UWVBFMTQsCisJLnBoeV9jb25mcwk9IGhkbWlwaHlfdjE0X2NvbmZpZ3MsCisJLnBoeV9jb25mX2NvdW50CT0gQVJSQVlfU0laRShoZG1pcGh5X3YxNF9jb25maWdzKSwKKwkuaXNfYXBiX3BoeQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgZXh5bm9zNV9oZG1pX2RyaXZlcl9kYXRhID0geworCS50eXBlCQk9IEhETUlfVFlQRTE0LAorCS5waHlfY29uZnMJPSBoZG1pcGh5X3YxM19jb25maWdzLAorCS5waHlfY29uZl9jb3VudAk9IEFSUkFZX1NJWkUoaGRtaXBoeV92MTNfY29uZmlncyksCisJLmlzX2FwYl9waHkJPSAwLAorfTsKKwogc3RhdGljIGlubGluZSB1MzIgaGRtaV9yZWdfcmVhZChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSwgdTMyIHJlZ19pZCkKIHsKIAlyZXR1cm4gcmVhZGwoaGRhdGEtPnJlZ3MgKyByZWdfaWQpOwpAQCAtNDQ1LDYgKzYxOCw0OCBAQAogCXdyaXRlbCh2YWx1ZSwgaGRhdGEtPnJlZ3MgKyByZWdfaWQpOwogfQogCitzdGF0aWMgaW50IGhkbWlwaHlfcmVnX3dyaXRlYihzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSwKKwkJCXUzMiByZWdfb2Zmc2V0LCB1OCB2YWx1ZSkKK3sKKwlpZiAoaGRhdGEtPmhkbWlwaHlfcG9ydCkgeworCQl1OCBidWZmZXJbMl07CisJCWludCByZXQ7CisKKwkJYnVmZmVyWzBdID0gcmVnX29mZnNldDsKKwkJYnVmZmVyWzFdID0gdmFsdWU7CisKKwkJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGhkYXRhLT5oZG1pcGh5X3BvcnQsIGJ1ZmZlciwgMik7CisJCWlmIChyZXQgPT0gMikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXdyaXRlYih2YWx1ZSwgaGRhdGEtPnJlZ3NfaGRtaXBoeSArIChyZWdfb2Zmc2V0PDwyKSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBoZG1pcGh5X3JlZ193cml0ZV9idWYoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEsCisJCQl1MzIgcmVnX29mZnNldCwgY29uc3QgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlpZiAoKHJlZ19vZmZzZXQgKyBsZW4pID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkYXRhLT5oZG1pcGh5X3BvcnQpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoaGRhdGEtPmhkbWlwaHlfcG9ydCwgYnVmLCBsZW4pOworCQlpZiAocmV0ID09IGxlbikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQl3cml0ZWIoYnVmW2ldLCBoZGF0YS0+cmVnc19oZG1pcGh5ICsKKwkJCQkoKHJlZ19vZmZzZXQgKyBpKTw8MikpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhkbWlfdjEzX3JlZ3NfZHVtcChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSwgY2hhciAqcHJlZml4KQogewogI2RlZmluZSBEVU1QUkVHKHJlZ19pZCkgXApAQCAtODA5LDYgKzEwMjQsOCBAQAogewogCXN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhID0gY3R4X2Zyb21fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAKKwloZGF0YS0+aHBkID0gZ3Bpb19nZXRfdmFsdWUoaGRhdGEtPmhwZF9ncGlvKTsKKwogCXJldHVybiBoZGF0YS0+aHBkID8gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgogCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiB9CkBAIC04NDgsMjAgKzEwNjUsMTAgQEAKIAogc3RhdGljIGludCBoZG1pX2ZpbmRfcGh5X2NvbmYoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEsIHUzMiBwaXhlbF9jbG9jaykKIHsKLQljb25zdCBzdHJ1Y3QgaGRtaXBoeV9jb25maWcgKmNvbmZzOwotCWludCBjb3VudCwgaTsKKwlpbnQgaTsKIAotCWlmIChoZGF0YS0+dHlwZSA9PSBIRE1JX1RZUEUxMykgewotCQljb25mcyA9IGhkbWlwaHlfdjEzX2NvbmZpZ3M7Ci0JCWNvdW50ID0gQVJSQVlfU0laRShoZG1pcGh5X3YxM19jb25maWdzKTsKLQl9IGVsc2UgaWYgKGhkYXRhLT50eXBlID09IEhETUlfVFlQRTE0KSB7Ci0JCWNvbmZzID0gaGRtaXBoeV92MTRfY29uZmlnczsKLQkJY291bnQgPSBBUlJBWV9TSVpFKGhkbWlwaHlfdjE0X2NvbmZpZ3MpOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlpZiAoY29uZnNbaV0ucGl4ZWxfY2xvY2sgPT0gcGl4ZWxfY2xvY2spCisJZm9yIChpID0gMDsgaSA8IGhkYXRhLT5waHlfY29uZl9jb3VudDsgaSsrKQorCQlpZiAoaGRhdGEtPnBoeV9jb25mc1tpXS5waXhlbF9jbG9jayA9PSBwaXhlbF9jbG9jaykKIAkJCXJldHVybiBpOwogCiAJRFJNX0RFQlVHX0tNUygiQ291bGQgbm90IGZpbmQgcGh5IGNvbmZpZyBmb3IgJWRcbiIsIHBpeGVsX2Nsb2NrKTsKQEAgLTkyOCwxNiArMTEzNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGRtaV9pbml0aWFsaXplKHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXksCi0JCQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldikKLXsKLQlzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSA9IGRpc3BsYXktPmN0eDsKLQotCWhkYXRhLT5kcm1fZGV2ID0gZHJtX2RldjsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBoZG1pX21vZGVfZml4dXAoc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSwKIAkJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLApAQCAtMTEzNiwyMCArMTMzMywxNSBAQAogCQkJSERNSV9BU1BfRU4gOiBIRE1JX0FTUF9ESVMsIEhETUlfQVNQX01BU0spOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX2NvbmZfcmVzZXQoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCitzdGF0aWMgdm9pZCBoZG1pX3N0YXJ0KHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhLCBib29sIHN0YXJ0KQogewotCXUzMiByZWc7CisJdTMyIHZhbCA9IHN0YXJ0ID8gSERNSV9UR19FTiA6IDA7CiAKLQlpZiAoaGRhdGEtPnR5cGUgPT0gSERNSV9UWVBFMTMpCi0JCXJlZyA9IEhETUlfVjEzX0NPUkVfUlNUT1VUOwotCWVsc2UKLQkJcmVnID0gSERNSV9DT1JFX1JTVE9VVDsKKwlpZiAoaGRhdGEtPmN1cnJlbnRfbW9kZS5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQl2YWwgfD0gSERNSV9GSUVMRF9FTjsKIAotCS8qIHJlc2V0dGluZyBIRE1JIGNvcmUgKi8KLQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIHJlZywgIDAsIEhETUlfQ09SRV9TV19SU1RPVVQpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTIwMDApOwotCWhkbWlfcmVnX3dyaXRlbWFzayhoZGF0YSwgcmVnLCB+MCwgSERNSV9DT1JFX1NXX1JTVE9VVCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMjAwMCk7CisJaGRtaV9yZWdfd3JpdGVtYXNrKGhkYXRhLCBIRE1JX0NPTl8wLCB2YWwsIEhETUlfRU4pOworCWhkbWlfcmVnX3dyaXRlbWFzayhoZGF0YSwgSERNSV9UR19DTUQsIHZhbCwgSERNSV9UR19FTiB8IEhETUlfRklFTERfRU4pOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX2NvbmZfaW5pdChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKQEAgLTExNjMsNiArMTM1NSw4IEBACiAJLyogY2hvb3NlIEhETUkgbW9kZSAqLwogCWhkbWlfcmVnX3dyaXRlbWFzayhoZGF0YSwgSERNSV9NT0RFX1NFTCwKIAkJSERNSV9NT0RFX0hETUlfRU4sIEhETUlfTU9ERV9NQVNLKTsKKwkvKiBBcHBseSBWaWRlbyBwcmVhYmxlIGFuZCBHdWFyZCBiYW5kIGluIEhETUkgbW9kZSBvbmx5ICovCisJaGRtaV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JX0NPTl8yLCAwKTsKIAkvKiBkaXNhYmxlIGJsdWVzY3JlZW4gKi8KIAloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfQ09OXzAsIDAsIEhETUlfQkxVRV9TQ1JfRU4pOwogCkBAIC0xMjg2LDEyICsxNDgwLDcgQEAKIAljbGtfcHJlcGFyZV9lbmFibGUoaGRhdGEtPnJlcy5zY2xrX2hkbWkpOwogCiAJLyogZW5hYmxlIEhETUkgYW5kIHRpbWluZyBnZW5lcmF0b3IgKi8KLQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfQ09OXzAsIH4wLCBIRE1JX0VOKTsKLQlpZiAoY29yZS0+aW50X3Byb19tb2RlWzBdKQotCQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfVEdfQ01ELCB+MCwgSERNSV9UR19FTiB8Ci0JCQkJSERNSV9GSUVMRF9FTik7Ci0JZWxzZQotCQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfVEdfQ01ELCB+MCwgSERNSV9UR19FTik7CisJaGRtaV9zdGFydChoZGF0YSwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfdjE0X21vZGVfYXBwbHkoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCkBAIC0xNDUzLDEyICsxNjQyLDcgQEAKIAljbGtfcHJlcGFyZV9lbmFibGUoaGRhdGEtPnJlcy5zY2xrX2hkbWkpOwogCiAJLyogZW5hYmxlIEhETUkgYW5kIHRpbWluZyBnZW5lcmF0b3IgKi8KLQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfQ09OXzAsIH4wLCBIRE1JX0VOKTsKLQlpZiAoY29yZS0+aW50X3Byb19tb2RlWzBdKQotCQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfVEdfQ01ELCB+MCwgSERNSV9UR19FTiB8Ci0JCQkJSERNSV9GSUVMRF9FTik7Ci0JZWxzZQotCQloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfVEdfQ01ELCB+MCwgSERNSV9UR19FTik7CisJaGRtaV9zdGFydChoZGF0YSwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfbW9kZV9hcHBseShzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKQEAgLTE0OTksMzIgKzE2ODMsNTEgQEAKIAogc3RhdGljIHZvaWQgaGRtaXBoeV9wb3dlcm9uKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQogewotCWlmIChoZGF0YS0+dHlwZSA9PSBIRE1JX1RZUEUxNCkKLQkJaGRtaV9yZWdfd3JpdGVtYXNrKGhkYXRhLCBIRE1JX1BIWV9DT05fMCwgMCwKLQkJCUhETUlfUEhZX1BPV0VSX09GRl9FTik7CisJaWYgKGhkYXRhLT50eXBlICE9IEhETUlfVFlQRTE0KQorCQlyZXR1cm47CisKKwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJLyogRm9yIFBIWSBNb2RlIFNldHRpbmcgKi8KKwloZG1pcGh5X3JlZ193cml0ZWIoaGRhdGEsIEhETUlQSFlfTU9ERV9TRVRfRE9ORSwKKwkJCQlIRE1JX1BIWV9FTkFCTEVfTU9ERV9TRVQpOworCS8qIFBoeSBQb3dlciBPbiAqLworCWhkbWlwaHlfcmVnX3dyaXRlYihoZGF0YSwgSERNSVBIWV9QT1dFUiwKKwkJCQlIRE1JX1BIWV9QT1dFUl9PTik7CisJLyogRm9yIFBIWSBNb2RlIFNldHRpbmcgKi8KKwloZG1pcGh5X3JlZ193cml0ZWIoaGRhdGEsIEhETUlQSFlfTU9ERV9TRVRfRE9ORSwKKwkJCQlIRE1JX1BIWV9ESVNBQkxFX01PREVfU0VUKTsKKwkvKiBQSFkgU1cgUmVzZXQgKi8KKwloZG1pcGh5X2NvbmZfcmVzZXQoaGRhdGEpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pcGh5X3Bvd2Vyb2ZmKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQogewotCWlmIChoZGF0YS0+dHlwZSA9PSBIRE1JX1RZUEUxNCkKLQkJaGRtaV9yZWdfd3JpdGVtYXNrKGhkYXRhLCBIRE1JX1BIWV9DT05fMCwgfjAsCi0JCQlIRE1JX1BIWV9QT1dFUl9PRkZfRU4pOworCWlmIChoZGF0YS0+dHlwZSAhPSBIRE1JX1RZUEUxNCkKKwkJcmV0dXJuOworCisJRFJNX0RFQlVHX0tNUygiXG4iKTsKKworCS8qIFBIWSBTVyBSZXNldCAqLworCWhkbWlwaHlfY29uZl9yZXNldChoZGF0YSk7CisJLyogRm9yIFBIWSBNb2RlIFNldHRpbmcgKi8KKwloZG1pcGh5X3JlZ193cml0ZWIoaGRhdGEsIEhETUlQSFlfTU9ERV9TRVRfRE9ORSwKKwkJCQlIRE1JX1BIWV9FTkFCTEVfTU9ERV9TRVQpOworCisJLyogUEhZIFBvd2VyIE9mZiAqLworCWhkbWlwaHlfcmVnX3dyaXRlYihoZGF0YSwgSERNSVBIWV9QT1dFUiwKKwkJCQlIRE1JX1BIWV9QT1dFUl9PRkYpOworCisJLyogRm9yIFBIWSBNb2RlIFNldHRpbmcgKi8KKwloZG1pcGh5X3JlZ193cml0ZWIoaGRhdGEsIEhETUlQSFlfTU9ERV9TRVRfRE9ORSwKKwkJCQlIRE1JX1BIWV9ESVNBQkxFX01PREVfU0VUKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaXBoeV9jb25mX2FwcGx5KHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQogewotCWNvbnN0IHU4ICpoZG1pcGh5X2RhdGE7Ci0JdTggYnVmZmVyWzMyXTsKLQl1OCBvcGVyYXRpb25bMl07Ci0JdTggcmVhZF9idWZmZXJbMzJdID0gezAsIH07CiAJaW50IHJldDsKIAlpbnQgaTsKIAotCWlmICghaGRhdGEtPmhkbWlwaHlfcG9ydCkgewotCQlEUk1fRVJST1IoImhkbWlwaHkgaXMgbm90IGF0dGFjaGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCS8qIHBpeGVsIGNsb2NrICovCiAJaSA9IGhkbWlfZmluZF9waHlfY29uZihoZGF0YSwgaGRhdGEtPm1vZGVfY29uZi5waXhlbF9jbG9jayk7CiAJaWYgKGkgPCAwKSB7CkBAIC0xNTMyLDM5ICsxNzM1LDIxIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoaGRhdGEtPnR5cGUgPT0gSERNSV9UWVBFMTMpCi0JCWhkbWlwaHlfZGF0YSA9IGhkbWlwaHlfdjEzX2NvbmZpZ3NbaV0uY29uZjsKLQllbHNlCi0JCWhkbWlwaHlfZGF0YSA9IGhkbWlwaHlfdjE0X2NvbmZpZ3NbaV0uY29uZjsKLQotCW1lbWNweShidWZmZXIsIGhkbWlwaHlfZGF0YSwgMzIpOwotCXJldCA9IGkyY19tYXN0ZXJfc2VuZChoZGF0YS0+aGRtaXBoeV9wb3J0LCBidWZmZXIsIDMyKTsKLQlpZiAocmV0ICE9IDMyKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGNvbmZpZ3VyZSBIRE1JUEhZIHZpYSBJMkNcbiIpOworCXJldCA9IGhkbWlwaHlfcmVnX3dyaXRlX2J1ZihoZGF0YSwgMCwgaGRhdGEtPnBoeV9jb25mc1tpXS5jb25mLCAzMik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBjb25maWd1cmUgaGRtaXBoeVxuIik7CiAJCXJldHVybjsKIAl9CiAKIAl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEyMDAwKTsKIAotCS8qIG9wZXJhdGlvbiBtb2RlICovCi0Jb3BlcmF0aW9uWzBdID0gMHgxZjsKLQlvcGVyYXRpb25bMV0gPSAweDgwOwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGhkYXRhLT5oZG1pcGh5X3BvcnQsIG9wZXJhdGlvbiwgMik7Ci0JaWYgKHJldCAhPSAyKSB7CisJcmV0ID0gaGRtaXBoeV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JUEhZX01PREVfU0VUX0RPTkUsCisJCQkJSERNSV9QSFlfRElTQUJMRV9NT0RFX1NFVCk7CisJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgaGRtaXBoeVxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoaGRhdGEtPmhkbWlwaHlfcG9ydCwgcmVhZF9idWZmZXIsIDMyKTsKLQlpZiAocmV0IDwgMCkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byByZWFkIGhkbWlwaHkgY29uZmlnXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKykKLQkJRFJNX0RFQlVHX0tNUygiaGRtaXBoeVsweCUwMnhdIHdyaXRlWzB4JTAyeF0gLSAiCi0JCQkicmVjdiBbMHglMDJ4XVxuIiwgaSwgYnVmZmVyW2ldLCByZWFkX2J1ZmZlcltpXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfY29uZl9hcHBseShzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKQEAgLTE1NzMsNyArMTc1OCw3IEBACiAJaGRtaXBoeV9jb25mX2FwcGx5KGhkYXRhKTsKIAogCW11dGV4X2xvY2soJmhkYXRhLT5oZG1pX211dGV4KTsKLQloZG1pX2NvbmZfcmVzZXQoaGRhdGEpOworCWhkbWlfc3RhcnQoaGRhdGEsIGZhbHNlKTsKIAloZG1pX2NvbmZfaW5pdChoZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZoZGF0YS0+aGRtaV9tdXRleCk7CiAKQEAgLTE4MTQsNiArMTk5OSw5IEBACiAJCW0tPnZyZWZyZXNoLCAobS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgPwogCQkiSU5URVJMQUNFRCIgOiAiUFJPR0VSRVNTSVZFIik7CiAKKwkvKiBwcmVzZXJ2ZSBtb2RlIGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UuICovCisJZHJtX21vZGVfY29weSgmaGRhdGEtPmN1cnJlbnRfbW9kZSwgbW9kZSk7CisKIAlpZiAoaGRhdGEtPnR5cGUgPT0gSERNSV9UWVBFMTMpCiAJCWhkbWlfdjEzX21vZGVfc2V0KGhkYXRhLCBtb2RlKTsKIAllbHNlCkBAIC0xODU0LDcgKzIwNDIsMTAgQEAKIAlpZiAocmVndWxhdG9yX2J1bGtfZW5hYmxlKHJlcy0+cmVndWxfY291bnQsIHJlcy0+cmVndWxfYnVsaykpCiAJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGJ1bGtcbiIpOwogCi0JY2xrX3ByZXBhcmVfZW5hYmxlKHJlcy0+aGRtaXBoeSk7CisJLyogc2V0IHBtdSBoZG1pcGh5IGNvbnRyb2wgYml0IHRvIGVuYWJsZSBoZG1pcGh5ICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGhkYXRhLT5wbXVyZWcsIFBNVV9IRE1JX1BIWV9DT05UUk9MLAorCQkJUE1VX0hETUlfUEhZX0VOQUJMRV9CSVQsIDEpOworCiAJY2xrX3ByZXBhcmVfZW5hYmxlKHJlcy0+aGRtaSk7CiAJY2xrX3ByZXBhcmVfZW5hYmxlKHJlcy0+c2Nsa19oZG1pKTsKIApAQCAtMTg3MiwxNiArMjA2MywyMCBAQAogCQlnb3RvIG91dDsKIAltdXRleF91bmxvY2soJmhkYXRhLT5oZG1pX211dGV4KTsKIAotCS8qCi0JICogVGhlIFRWIHBvd2VyIGRvbWFpbiBuZWVkcyBhbnkgY29uZGl0aW9uIG9mIGhkbWlwaHkgdG8gdHVybiBvZmYgYW5kCi0JICogaXRzIHJlc2V0IHN0YXRlIHNlZW1zIHRvIG1lZXQgdGhlIGNvbmRpdGlvbi4KLQkgKi8KLQloZG1pcGh5X2NvbmZfcmVzZXQoaGRhdGEpOworCS8qIEhETUkgU3lzdGVtIERpc2FibGUgKi8KKwloZG1pX3JlZ193cml0ZW1hc2soaGRhdGEsIEhETUlfQ09OXzAsIDAsIEhETUlfRU4pOworCiAJaGRtaXBoeV9wb3dlcm9mZihoZGF0YSk7CiAKKwljYW5jZWxfZGVsYXllZF93b3JrKCZoZGF0YS0+aG90cGx1Z193b3JrKTsKKwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShyZXMtPnNjbGtfaGRtaSk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJlcy0+aGRtaSk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJlcy0+aGRtaXBoeSk7CisKKwkvKiByZXNldCBwbXUgaGRtaXBoeSBjb250cm9sIGJpdCB0byBkaXNhYmxlIGhkbWlwaHkgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMoaGRhdGEtPnBtdXJlZywgUE1VX0hETUlfUEhZX0NPTlRST0wsCisJCQlQTVVfSERNSV9QSFlfRU5BQkxFX0JJVCwgMCk7CisKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHJlcy0+cmVndWxfY291bnQsIHJlcy0+cmVndWxfYnVsayk7CiAKIAlwbV9ydW50aW1lX3B1dF9zeW5jKGhkYXRhLT5kZXYpOwpAQCAtMTkxMyw3ICsyMTA4LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXlfb3BzIGhkbWlfZGlzcGxheV9vcHMgPSB7Ci0JLmluaXRpYWxpemUJPSBoZG1pX2luaXRpYWxpemUsCiAJLmNyZWF0ZV9jb25uZWN0b3IgPSBoZG1pX2NyZWF0ZV9jb25uZWN0b3IsCiAJLm1vZGVfZml4dXAJPSBoZG1pX21vZGVfZml4dXAsCiAJLm1vZGVfc2V0CT0gaGRtaV9tb2RlX3NldCwKQEAgLTE5MjYsOSArMjEyMCwxMSBAQAogCS5vcHMgPSAmaGRtaV9kaXNwbGF5X29wcywKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBoZG1pX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgaGRtaV9ob3RwbHVnX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBhcmc7CisJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGE7CisKKwloZGF0YSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGRtaV9jb250ZXh0LCBob3RwbHVnX3dvcmsud29yayk7CiAKIAltdXRleF9sb2NrKCZoZGF0YS0+aGRtaV9tdXRleCk7CiAJaGRhdGEtPmhwZCA9IGdwaW9fZ2V0X3ZhbHVlKGhkYXRhLT5ocGRfZ3Bpbyk7CkBAIC0xOTM2LDYgKzIxMzIsMTQgQEAKIAogCWlmIChoZGF0YS0+ZHJtX2RldikKIAkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGhkYXRhLT5kcm1fZGV2KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGhkbWlfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBhcmc7CisKKwltb2RfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJmhkYXRhLT5ob3RwbHVnX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKEhPVFBMVUdfREVCT1VOQ0VfTVMpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE5NTQsMzcgKzIxNTgsMzUgQEAKIAogCURSTV9ERUJVR19LTVMoIkhETUkgcmVzb3VyY2UgaW5pdFxuIik7CiAKLQltZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOwotCiAJLyogZ2V0IGNsb2NrcywgcG93ZXIgKi8KIAlyZXMtPmhkbWkgPSBkZXZtX2Nsa19nZXQoZGV2LCAiaGRtaSIpOwogCWlmIChJU19FUlIocmVzLT5oZG1pKSkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgY2xvY2sgJ2hkbWknXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihyZXMtPmhkbWkpOwogCQlnb3RvIGZhaWw7CiAJfQogCXJlcy0+c2Nsa19oZG1pID0gZGV2bV9jbGtfZ2V0KGRldiwgInNjbGtfaGRtaSIpOwogCWlmIChJU19FUlIocmVzLT5zY2xrX2hkbWkpKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19oZG1pJ1xuIik7CisJCXJldCA9IFBUUl9FUlIocmVzLT5zY2xrX2hkbWkpOwogCQlnb3RvIGZhaWw7CiAJfQogCXJlcy0+c2Nsa19waXhlbCA9IGRldm1fY2xrX2dldChkZXYsICJzY2xrX3BpeGVsIik7CiAJaWYgKElTX0VSUihyZXMtPnNjbGtfcGl4ZWwpKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19waXhlbCdcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJlcy0+c2Nsa19waXhlbCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJcmVzLT5zY2xrX2hkbWlwaHkgPSBkZXZtX2Nsa19nZXQoZGV2LCAic2Nsa19oZG1pcGh5Iik7CiAJaWYgKElTX0VSUihyZXMtPnNjbGtfaGRtaXBoeSkpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IGNsb2NrICdzY2xrX2hkbWlwaHknXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQlyZXMtPmhkbWlwaHkgPSBkZXZtX2Nsa19nZXQoZGV2LCAiaGRtaXBoeSIpOwotCWlmIChJU19FUlIocmVzLT5oZG1pcGh5KSkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgY2xvY2sgJ2hkbWlwaHknXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihyZXMtPnNjbGtfaGRtaXBoeSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJcmVzLT5tb3V0X2hkbWkgPSBkZXZtX2Nsa19nZXQoZGV2LCAibW91dF9oZG1pIik7CiAJaWYgKElTX0VSUihyZXMtPm1vdXRfaGRtaSkpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IGNsb2NrICdtb3V0X2hkbWknXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihyZXMtPm1vdXRfaGRtaSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE5OTIsOCArMjE5NCwxMCBAQAogCiAJcmVzLT5yZWd1bF9idWxrID0gZGV2bV9remFsbG9jKGRldiwgQVJSQVlfU0laRShzdXBwbHkpICoKIAkJc2l6ZW9mKHJlcy0+cmVndWxfYnVsa1swXSksIEdGUF9LRVJORUwpOwotCWlmICghcmVzLT5yZWd1bF9idWxrKQorCWlmICghcmVzLT5yZWd1bF9idWxrKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKKwl9CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3VwcGx5KTsgKytpKSB7CiAJCXJlcy0+cmVndWxfYnVsa1tpXS5zdXBwbHkgPSBzdXBwbHlbaV07CiAJCXJlcy0+cmVndWxfYnVsa1tpXS5jb25zdW1lciA9IE5VTEw7CkBAIC0yMDAxLDE0ICsyMjA1LDE0IEBACiAJcmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoZGV2LCBBUlJBWV9TSVpFKHN1cHBseSksIHJlcy0+cmVndWxfYnVsayk7CiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgcmVndWxhdG9yc1xuIik7Ci0JCWdvdG8gZmFpbDsKKwkJcmV0dXJuIHJldDsKIAl9CiAJcmVzLT5yZWd1bF9jb3VudCA9IEFSUkFZX1NJWkUoc3VwcGx5KTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiBmYWlsOgogCURSTV9FUlJPUigiSERNSSByZXNvdXJjZSBpbml0IC0gZmFpbGVkXG4iKTsKLQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IHM1cF9oZG1pX3BsYXRmb3JtX2RhdGEgKmRybV9oZG1pX2R0X3BhcnNlX3BkYXRhCkBAIC0yMDQzLDQyICsyMjQ3LDEwNSBAQAogCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTItaGRtaSIsCiAJCS5kYXRhID0gJmV4eW5vczQyMTJfaGRtaV9kcml2ZXJfZGF0YSwKIAl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQyMC1oZG1pIiwKKwkJLmRhdGEgPSAmZXh5bm9zNTQyMF9oZG1pX2RyaXZlcl9kYXRhLAorCX0sIHsKIAkJLyogZW5kIG5vZGUgKi8KIAl9CiB9OwogCitzdGF0aWMgaW50IGhkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IGRhdGE7CisJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGE7CisKKwloZGF0YSA9IGhkbWlfZGlzcGxheS5jdHg7CisJaGRhdGEtPmRybV9kZXYgPSBkcm1fZGV2OworCisJcmV0dXJuIGV4eW5vc19kcm1fY3JlYXRlX2VuY19jb25uKGRybV9kZXYsICZoZG1pX2Rpc3BsYXkpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gZ2V0X2hkbWlfZGlzcGxheShkZXYpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGRpc3BsYXktPmVuY29kZXI7CisJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBkaXNwbGF5LT5jdHg7CisKKwllbmNvZGVyLT5mdW5jcy0+ZGVzdHJveShlbmNvZGVyKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoJmhkYXRhLT5jb25uZWN0b3IpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaGRtaV9jb21wb25lbnRfb3BzID0geworCS5iaW5kCT0gaGRtaV9iaW5kLAorCS51bmJpbmQgPSBoZG1pX3VuYmluZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmhkbWlfbGVnYWN5X2RkY19kdF9iaW5kaW5nKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBjaGFyICpjb21wYXRpYmxlX3N0ciA9ICJzYW1zdW5nLGV4eW5vczQyMTAtaGRtaWRkYyI7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgY29tcGF0aWJsZV9zdHIpOworCWlmIChucCkKKwkJcmV0dXJuIG9mX2dldF9uZXh0X3BhcmVudChucCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqaGRtaV9sZWdhY3lfcGh5X2R0X2JpbmRpbmcoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKmNvbXBhdGlibGVfc3RyID0gInNhbXN1bmcsZXh5bm9zNDIxMi1oZG1pcGh5IjsKKworCXJldHVybiBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCBjb21wYXRpYmxlX3N0cik7Cit9CisKIHN0YXRpYyBpbnQgaGRtaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGRjX25vZGUsICpwaHlfbm9kZTsKKwlzdHJ1Y3QgczVwX2hkbWlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgKmRydl9kYXRhOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGE7Ci0Jc3RydWN0IHM1cF9oZG1pX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGRjX25vZGUsICpwaHlfbm9kZTsKLQlzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSAqZHJ2X2RhdGE7CiAJaW50IHJldDsKIAotCSBpZiAoIWRldi0+b2Zfbm9kZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJcmV0ID0gZXh5bm9zX2RybV9jb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IsCisJCQkJCWhkbWlfZGlzcGxheS50eXBlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFkZXYtPm9mX25vZGUpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKKwl9CiAKIAlwZGF0YSA9IGRybV9oZG1pX2R0X3BhcnNlX3BkYXRhKGRldik7Ci0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwZGF0YSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OworCX0KIAogCWhkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBoZG1pX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWhkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CisJfQogCiAJbXV0ZXhfaW5pdCgmaGRhdGEtPmhkbWlfbXV0ZXgpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJmhkbWlfZGlzcGxheSk7CiAKIAltYXRjaCA9IG9mX21hdGNoX25vZGUoaGRtaV9tYXRjaF90eXBlcywgZGV2LT5vZl9ub2RlKTsKLQlpZiAoIW1hdGNoKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIW1hdGNoKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CisJfQogCiAJZHJ2X2RhdGEgPSAoc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgKiltYXRjaC0+ZGF0YTsKIAloZGF0YS0+dHlwZSA9IGRydl9kYXRhLT50eXBlOworCWhkYXRhLT5waHlfY29uZnMgPSBkcnZfZGF0YS0+cGh5X2NvbmZzOworCWhkYXRhLT5waHlfY29uZl9jb3VudCA9IGRydl9kYXRhLT5waHlfY29uZl9jb3VudDsKIAogCWhkYXRhLT5ocGRfZ3BpbyA9IHBkYXRhLT5ocGRfZ3BpbzsKIAloZGF0YS0+ZGV2ID0gZGV2OwpAQCAtMjA4NiwzNSArMjM1Myw0NCBAQAogCXJldCA9IGhkbWlfcmVzb3VyY2VzX2luaXQoaGRhdGEpOwogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJoZG1pX3Jlc291cmNlc19pbml0IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaGRhdGEtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwotCWlmIChJU19FUlIoaGRhdGEtPnJlZ3MpKQotCQlyZXR1cm4gUFRSX0VSUihoZGF0YS0+cmVncyk7CisJaWYgKElTX0VSUihoZGF0YS0+cmVncykpIHsKKwkJcmV0ID0gUFRSX0VSUihoZGF0YS0+cmVncyk7CisJCWdvdG8gZXJyX2RlbF9jb21wb25lbnQ7CisJfQogCiAJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBoZGF0YS0+aHBkX2dwaW8sICJIUEQiKTsKIAlpZiAocmV0KSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlcXVlc3QgSFBEIGdwaW9cbiIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KIAorCWRkY19ub2RlID0gaGRtaV9sZWdhY3lfZGRjX2R0X2JpbmRpbmcoZGV2KTsKKwlpZiAoZGRjX25vZGUpCisJCWdvdG8gb3V0X2dldF9kZGNfYWRwdDsKKwogCS8qIEREQyBpMmMgZHJpdmVyICovCiAJZGRjX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImRkYyIsIDApOwogCWlmICghZGRjX25vZGUpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZmluZCBkZGMgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kZWxfY29tcG9uZW50OwogCX0KKworb3V0X2dldF9kZGNfYWRwdDoKIAloZGF0YS0+ZGRjX2FkcHQgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoZGRjX25vZGUpOwogCWlmICghaGRhdGEtPmRkY19hZHB0KSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGdldCBkZGMgaTJjIGFkYXB0ZXIgYnkgbm9kZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAl9CiAKLQkvKiBOb3Qgc3VwcG9ydCBBUEIgUEhZIHlldC4gKi8KLQlpZiAoZHJ2X2RhdGEtPmlzX2FwYl9waHkpCi0JCXJldHVybiAtRVBFUk07CisJcGh5X25vZGUgPSBoZG1pX2xlZ2FjeV9waHlfZHRfYmluZGluZyhkZXYpOworCWlmIChwaHlfbm9kZSkKKwkJZ290byBvdXRfZ2V0X3BoeV9wb3J0OwogCiAJLyogaGRtaXBoeSBpMmMgZHJpdmVyICovCiAJcGh5X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgInBoeSIsIDApOwpAQCAtMjEyMywxMSArMjM5OSwyMiBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9kZGM7CiAJfQotCWhkYXRhLT5oZG1pcGh5X3BvcnQgPSBvZl9maW5kX2kyY19kZXZpY2VfYnlfbm9kZShwaHlfbm9kZSk7Ci0JaWYgKCFoZGF0YS0+aGRtaXBoeV9wb3J0KSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIGdldCBoZG1pIHBoeSBpMmMgY2xpZW50IGZyb20gbm9kZVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2RkYzsKKworb3V0X2dldF9waHlfcG9ydDoKKwlpZiAoZHJ2X2RhdGEtPmlzX2FwYl9waHkpIHsKKwkJaGRhdGEtPnJlZ3NfaGRtaXBoeSA9IG9mX2lvbWFwKHBoeV9ub2RlLCAwKTsKKwkJaWYgKCFoZGF0YS0+cmVnc19oZG1pcGh5KSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpb3JlbWFwIGhkbWkgcGh5XG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9kZGM7CisJCX0KKwl9IGVsc2UgeworCQloZGF0YS0+aGRtaXBoeV9wb3J0ID0gb2ZfZmluZF9pMmNfZGV2aWNlX2J5X25vZGUocGh5X25vZGUpOworCQlpZiAoIWhkYXRhLT5oZG1pcGh5X3BvcnQpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGdldCBoZG1pIHBoeSBpMmMgY2xpZW50XG4iKTsKKwkJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCQlnb3RvIGVycl9kZGM7CisJCX0KIAl9CiAKIAloZGF0YS0+aXJxID0gZ3Bpb190b19pcnEoaGRhdGEtPmhwZF9ncGlvKTsKQEAgLTIxMzksNiArMjQyNiw4IEBACiAKIAloZGF0YS0+aHBkID0gZ3Bpb19nZXRfdmFsdWUoaGRhdGEtPmhwZF9ncGlvKTsKIAorCUlOSVRfREVMQVlFRF9XT1JLKCZoZGF0YS0+aG90cGx1Z193b3JrLCBoZG1pX2hvdHBsdWdfd29ya19mdW5jKTsKKwogCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBoZGF0YS0+aXJxLCBOVUxMLAogCQkJaGRtaV9pcnFfdGhyZWFkLCBJUlFGX1RSSUdHRVJfUklTSU5HIHwKIAkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULApAQCAtMjE0OCwzMCArMjQzNyw1MSBAQAogCQlnb3RvIGVycl9oZG1pcGh5OwogCX0KIAorCWhkYXRhLT5wbXVyZWcgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKGRldi0+b2Zfbm9kZSwKKwkJCSJzYW1zdW5nLHN5c2Nvbi1waGFuZGxlIik7CisJaWYgKElTX0VSUihoZGF0YS0+cG11cmVnKSkgeworCQlEUk1fRVJST1IoInN5c2NvbiByZWdtYXAgbG9va3VwIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGVycl9oZG1pcGh5OworCX0KKwogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0KIAloZG1pX2Rpc3BsYXkuY3R4ID0gaGRhdGE7Ci0JZXh5bm9zX2RybV9kaXNwbGF5X3JlZ2lzdGVyKCZoZG1pX2Rpc3BsYXkpOwogCi0JcmV0dXJuIDA7CisJcmV0ID0gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmaGRtaV9jb21wb25lbnRfb3BzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX3BtX3J1bnRpbWU7CisKKwlyZXR1cm4gcmV0OworCitlcnJfZGlzYWJsZV9wbV9ydW50aW1lOgorCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwogCiBlcnJfaGRtaXBoeToKLQlwdXRfZGV2aWNlKCZoZGF0YS0+aGRtaXBoeV9wb3J0LT5kZXYpOworCWlmIChoZGF0YS0+aGRtaXBoeV9wb3J0KQorCQlwdXRfZGV2aWNlKCZoZGF0YS0+aGRtaXBoeV9wb3J0LT5kZXYpOwogZXJyX2RkYzoKIAlwdXRfZGV2aWNlKCZoZGF0YS0+ZGRjX2FkcHQtPmRldik7CisKK2Vycl9kZWxfY29tcG9uZW50OgorCWV4eW5vc19kcm1fY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCBFWFlOT1NfREVWSUNFX1RZUEVfQ09OTkVDVE9SKTsKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaGRtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkgPSBnZXRfaGRtaV9kaXNwbGF5KGRldik7Ci0Jc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBkaXNwbGF5LT5jdHg7CisJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBoZG1pX2Rpc3BsYXkuY3R4OworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGF0YS0+aG90cGx1Z193b3JrKTsKIAogCXB1dF9kZXZpY2UoJmhkYXRhLT5oZG1pcGh5X3BvcnQtPmRldik7CiAJcHV0X2RldmljZSgmaGRhdGEtPmRkY19hZHB0LT5kZXYpOwotCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZoZG1pX2NvbXBvbmVudF9vcHMpOworCisJZXh5bm9zX2RybV9jb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DT05ORUNUT1IpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pLmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGYzOTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcnM6Ci0gKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Ci0gKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfRVhZTk9TX0hETUlfSF8KLSNkZWZpbmUgX0VYWU5PU19IRE1JX0hfCi0KLXZvaWQgaGRtaV9hdHRhY2hfZGRjX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqZGRjKTsKLXZvaWQgaGRtaV9hdHRhY2hfaGRtaXBoeV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmhkbWlwaHkpOwotCi1leHRlcm4gc3RydWN0IGkyY19kcml2ZXIgaGRtaXBoeV9kcml2ZXI7Ci1leHRlcm4gc3RydWN0IGkyY19kcml2ZXIgZGRjX2RyaXZlcjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pcGh5LmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pcGh5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWJiMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaXBoeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yczoKLSAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Ci0gKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotCi0jaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKLSNpbmNsdWRlICJleHlub3NfaGRtaS5oIgotCi0KLXN0YXRpYyBpbnQgaGRtaXBoeV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQloZG1pX2F0dGFjaF9oZG1pcGh5X2NsaWVudChjbGllbnQpOwotCi0JZGV2X2luZm8oJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiYXR0YWNoZWQgczVwX2hkbWlwaHkgIgotCQkiaW50byBpMmMgYWRhcHRlciBzdWNjZXNzZnVsbHlcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaXBoeV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlkZXZfaW5mbygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJkZXRhY2hlZCBzNXBfaGRtaXBoeSAiCi0JCSJmcm9tIGkyYyBhZGFwdGVyIHN1Y2Nlc3NmdWxseVxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaGRtaXBoeV9tYXRjaF90eXBlc1tdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1LWhkbWlwaHkiLAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLWhkbWlwaHkiLAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEyLWhkbWlwaHkiLAotCX0sIHsKLQkJLyogZW5kIG5vZGUgKi8KLQl9Ci19OwotCi1zdHJ1Y3QgaTJjX2RyaXZlciBoZG1pcGh5X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJleHlub3MtaGRtaXBoeSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBoZG1pcGh5X21hdGNoX3R5cGVzLAotCX0sCi0JLnByb2JlCQk9IGhkbWlwaHlfcHJvYmUsCi0JLnJlbW92ZQkJPSBoZG1pcGh5X3JlbW92ZSwKLQkuY29tbWFuZAkJPSBOVUxMLAotfTsKLUVYUE9SVF9TWU1CT0woaGRtaXBoeV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfbWl4ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX21peGVyLmMKaW5kZXggY2UyODg4MS4uNGM1YWVkN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX21peGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfbWl4ZXIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxkcm0vZXh5bm9zX2RybS5oPgogCkBAIC04MzAsMTMgKzgzMSwxNSBAQAogfQogCiBzdGF0aWMgaW50IG1peGVyX2luaXRpYWxpemUoc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWdyLAotCQkJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIGludCBwaXBlKQorCQkJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbWl4ZXJfY29udGV4dCAqbWl4ZXJfY3R4ID0gbWdyLT5jdHg7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdjsKKwlwcml2ID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7CiAKLQltaXhlcl9jdHgtPmRybV9kZXYgPSBkcm1fZGV2OwotCW1peGVyX2N0eC0+cGlwZSA9IHBpcGU7CisJbWdyLT5kcm1fZGV2ID0gbWl4ZXJfY3R4LT5kcm1fZGV2ID0gZHJtX2RldjsKKwltZ3ItPnBpcGUgPSBtaXhlcl9jdHgtPnBpcGUgPSBwcml2LT5waXBlKys7CiAKIAkvKiBhY3F1aXJlIHJlc291cmNlczogcmVncywgaXJxcywgY2xvY2tzICovCiAJcmV0ID0gbWl4ZXJfcmVzb3VyY2VzX2luaXQobWl4ZXJfY3R4KTsKQEAgLTExNDIsOCArMTE0NSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyBtaXhlcl9tYW5hZ2VyX29wcyA9IHsKLQkuaW5pdGlhbGl6ZQkJPSBtaXhlcl9pbml0aWFsaXplLAotCS5yZW1vdmUJCQk9IG1peGVyX21ncl9yZW1vdmUsCiAJLmRwbXMJCQk9IG1peGVyX2RwbXMsCiAJLmVuYWJsZV92YmxhbmsJCT0gbWl4ZXJfZW5hYmxlX3ZibGFuaywKIAkuZGlzYWJsZV92YmxhbmsJCT0gbWl4ZXJfZGlzYWJsZV92YmxhbmssCkBAIC0xMjAwLDExICsxMjAxLDEzIEBACiAJfQogfTsKIAotc3RhdGljIGludCBtaXhlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBtaXhlcl9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFuYWdlciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IGRhdGE7CiAJc3RydWN0IG1peGVyX2NvbnRleHQgKmN0eDsKIAlzdHJ1Y3QgbWl4ZXJfZHJ2X2RhdGEgKmRydjsKKwlpbnQgcmV0OwogCiAJZGV2X2luZm8oZGV2LCAicHJvYmUgc3RhcnRcbiIpOwogCkBAIC0xMjMzLDE5ICsxMjM2LDYxIEBACiAJYXRvbWljX3NldCgmY3R4LT53YWl0X3ZzeW5jX2V2ZW50LCAwKTsKIAogCW1peGVyX21hbmFnZXIuY3R4ID0gY3R4OworCXJldCA9IG1peGVyX2luaXRpYWxpemUoJm1peGVyX21hbmFnZXIsIGRybV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmbWl4ZXJfbWFuYWdlcik7Ci0JZXh5bm9zX2RybV9tYW5hZ2VyX3JlZ2lzdGVyKCZtaXhlcl9tYW5hZ2VyKTsKKwlyZXQgPSBleHlub3NfZHJtX2NydGNfY3JlYXRlKCZtaXhlcl9tYW5hZ2VyKTsKKwlpZiAocmV0KSB7CisJCW1peGVyX21ncl9yZW1vdmUoJm1peGVyX21hbmFnZXIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWl4ZXJfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1nciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IG1nci0+Y3J0YzsKKworCWRldl9pbmZvKGRldiwgInJlbW92ZSBzdWNjZXNzZnVsXG4iKTsKKworCW1peGVyX21ncl9yZW1vdmUobWdyKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCisJY3J0Yy0+ZnVuY3MtPmRlc3Ryb3koY3J0Yyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBtaXhlcl9jb21wb25lbnRfb3BzID0geworCS5iaW5kCT0gbWl4ZXJfYmluZCwKKwkudW5iaW5kCT0gbWl4ZXJfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBtaXhlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBleHlub3NfZHJtX2NvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgRVhZTk9TX0RFVklDRV9UWVBFX0NSVEMsCisJCQkJCW1peGVyX21hbmFnZXIudHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJm1peGVyX2NvbXBvbmVudF9vcHMpOworCWlmIChyZXQpCisJCWV4eW5vc19kcm1fY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCBFWFlOT1NfREVWSUNFX1RZUEVfQ1JUQyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1peGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZW1vdmUgc3VjY2Vzc2Z1bFxuIik7Ci0KLQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmbWl4ZXJfY29tcG9uZW50X29wcyk7CisJZXh5bm9zX2RybV9jb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsIEVYWU5PU19ERVZJQ0VfVFlQRV9DUlRDKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9yZWdzLWhkbWkuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvcmVncy1oZG1pLmgKaW5kZXggZWYxYjNlYi4uM2YzNWFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9yZWdzLWhkbWkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL3JlZ3MtaGRtaS5oCkBAIC01NzgsNCArNTc4LDIwIEBACiAjZGVmaW5lIEhETUlfVEdfVkFDVF9TVDRfSAkJSERNSV9UR19CQVNFKDB4MDA3NCkKICNkZWZpbmUgSERNSV9UR18zRAkJCUhETUlfVEdfQkFTRSgweDAwRjApCiAKKy8qIEhETUkgUEhZIFJlZ2lzdGVycyBPZmZzZXRzKi8KKyNkZWZpbmUgSERNSVBIWV9QT1dFUgkJKDB4NzQgPj4gMikKKyNkZWZpbmUgSERNSVBIWV9NT0RFX1NFVF9ET05FCQkoMHg3YyA+PiAyKQorCisvKiBIRE1JIFBIWSBWYWx1ZXMgKi8KKyNkZWZpbmUgSERNSV9QSFlfUE9XRVJfT04gICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSERNSV9QSFlfUE9XRVJfT0ZGICAgICAgICAgICAgIDB4ZmYKKworLyogSERNSSBQSFkgVmFsdWVzICovCisjZGVmaW5lIEhETUlfUEhZX0RJU0FCTEVfTU9ERV9TRVQJMHg4MAorI2RlZmluZSBIRE1JX1BIWV9FTkFCTEVfTU9ERV9TRVQJMHgwMAorCisvKiBQTVUgUmVnaXN0ZXJzIGZvciBQSFkgKi8KKyNkZWZpbmUgUE1VX0hETUlfUEhZX0NPTlRST0wJCTB4NzAwCisjZGVmaW5lIFBNVV9IRE1JX1BIWV9FTkFCTEVfQklUCQlCSVQoMCkKKwogI2VuZGlmIC8qIFNBTVNVTkdfUkVHU19IRE1JX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvbWRmbGRfZHNpX3BrZ19zZW5kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvbWRmbGRfZHNpX3BrZ19zZW5kZXIuYwppbmRleCA0ODlmZmQyLi44Nzg4NWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21kZmxkX2RzaV9wa2dfc2VuZGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9tZGZsZF9kc2lfcGtnX3NlbmRlci5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBCSVQoMTQpOgogCQkvKndhaXQgZm9yIGFsbCBmaWZvIGVtcHR5Ki8KLQkJLyp3YWl0X2Zvcl9hbGxfZmlmb3NfZW1wdHkoc2VuZGVyKSovOworCQkvKndhaXRfZm9yX2FsbF9maWZvc19lbXB0eShzZW5kZXIpKi8KIAkJYnJlYWs7CiAJY2FzZSBCSVQoMTUpOgogCQlkZXZfZGJnKHNlbmRlci0+ZGV2LT5kZXYsICJObyBBY3Rpb24gcmVxdWlyZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9wc2JfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9kcnYuYwppbmRleCBiNjg2ZTU2Li42ZThmZTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL3BzYl9kcnYuYwpAQCAtMTEyLDExICsxMTIsOSBAQAogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcHNiX2ZiZGV2ICpmYmRldiA9IGRldl9wcml2LT5mYmRldjsKIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0JcmV0ID0gZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoJmZiZGV2LT5wc2JfZmJfaGVscGVyKTsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgmZmJkZXYtPnBzYl9mYl9oZWxwZXIpOwogCWlmIChyZXQpCiAJCURSTV9ERUJVRygiZmFpbGVkIHRvIHJlc3RvcmUgY3J0YyBtb2RlXG4iKTsKLQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAKIAlyZXR1cm47CiB9CkBAIC0zNTQsNyArMzUyLDcgQEAKIAlQU0JfV1ZEQzMyKDB4RkZGRkZGRkYsIFBTQl9JTlRfTUFTS19SKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxbWFza19sb2NrLCBpcnFmbGFncyk7CiAKLQlkcm1faXJxX2luc3RhbGwoZGV2KTsKKwlkcm1faXJxX2luc3RhbGwoZGV2LCBkZXYtPnBkZXYtPmlycSk7CiAKIAlkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlOwogCWRldi0+bWF4X3ZibGFua19jb3VudCA9IDB4ZmZmZmZmOyAvKiBvbmx5IDI0IGJpdHMgb2YgZnJhbWUgY291bnQgKi8KQEAgLTQ3OSw3ICs0NzcsNyBAQAogCS5sYXN0Y2xvc2UgPSBwc2JfZHJpdmVyX2xhc3RjbG9zZSwKIAkucHJlY2xvc2UgPSBwc2JfZHJpdmVyX3ByZWNsb3NlLAogCi0JLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShwc2JfaW9jdGxzKSwKKwkubnVtX2lvY3RscyA9IEFSUkFZX1NJWkUocHNiX2lvY3RscyksCiAJLmRldmljZV9pc19hZ3AgPSBwc2JfZHJpdmVyX2RldmljZV9pc19hZ3AsCiAJLmlycV9wcmVpbnN0YWxsID0gcHNiX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSBwc2JfaXJxX3Bvc3RpbnN0YWxsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2kyYy90ZGE5OTh4X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2kyYy90ZGE5OTh4X2Rydi5jCmluZGV4IDQ4YWY1Y2EuLjI0MGMzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvdGRhOTk4eF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL3RkYTk5OHhfZHJ2LmMKQEAgLTU2OCwxMSArNTY4LDExIEBACiAKIHN0YXRpYyB1aW50OF90IHRkYTk5OHhfY2tzdW0odWludDhfdCAqYnVmLCBzaXplX3QgYnl0ZXMpCiB7Ci0JdWludDhfdCBzdW0gPSAwOworCWludCBzdW0gPSAwOwogCiAJd2hpbGUgKGJ5dGVzLS0pCi0JCXN1bSArPSAqYnVmKys7Ci0JcmV0dXJuICgyNTUgLSBzdW0pICsgMTsKKwkJc3VtIC09ICpidWYrKzsKKwlyZXR1cm4gc3VtOwogfQogCiAjZGVmaW5lIEhCKHgpICh4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZG1hLmMKaW5kZXggYWVhY2UzNy4uZTg4YmFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2RtYS5jCkBAIC0xMjUxLDcgKzEyNTEsNyBAQAogCURSTV9JT0NUTF9ERUZfRFJWKEk4MTBfRkxJUCwgaTgxMF9mbGlwX2J1ZnMsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCiB9OwogCi1pbnQgaTgxMF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpODEwX2lvY3Rscyk7CitpbnQgaTgxMF9tYXhfaW9jdGwgPSBBUlJBWV9TSVpFKGk4MTBfaW9jdGxzKTsKIAogLyoqCiAgKiBEZXRlcm1pbmUgaWYgdGhlIGRldmljZSByZWFsbHkgaXMgQUdQIG9yIG5vdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnCmluZGV4IGJlYTJkNjcuLjQzN2UxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIAlkZXBlbmRzIG9uIChBR1AgfHwgQUdQPW4pCiAJc2VsZWN0IElOVEVMX0dUVAogCXNlbGVjdCBBR1BfSU5URUwgaWYgQUdQCisJc2VsZWN0IElOVEVSVkFMX1RSRUUKIAkjIHdlIG5lZWQgc2htZnMgZm9yIHRoZSBzd2FwcGFibGUgYmFja2luZyBzdG9yZSwgYW5kIGluIHBhcnRpY3VsYXIKIAkjIHRoZSBzaG1lbV9yZWFkcGFnZSgpIHdoaWNoIGRlcGVuZHMgdXBvbiB0bXBmcwogCXNlbGVjdCBTSE1FTQpAQCAtNzEsNyArNzIsNyBAQAogCiBjb25maWcgRFJNX0k5MTVfVU1TCiAJYm9vbCAiRW5hYmxlIHVzZXJzcGFjZSBtb2Rlc2V0dGluZyBvbiBJbnRlbCBoYXJkd2FyZSAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBEUk1fSTkxNQorCWRlcGVuZHMgb24gRFJNX0k5MTUgJiYgQlJPS0VOCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBzdGlsbCBuZWVkIHVzZXJzcGFjZSBtb2Rlc2V0dGluZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKaW5kZXggYjE0NDViNy4uY2FkMTY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKICMgR0VNIGNvZGUKIGk5MTUteSArPSBpOTE1X2NtZF9wYXJzZXIubyBcCiAJICBpOTE1X2dlbV9jb250ZXh0Lm8gXAorCSAgaTkxNV9nZW1fcmVuZGVyX3N0YXRlLm8gXAogCSAgaTkxNV9nZW1fZGVidWcubyBcCiAJICBpOTE1X2dlbV9kbWFidWYubyBcCiAJICBpOTE1X2dlbV9ldmljdC5vIFwKQEAgLTI2LDEyICsyNywxOCBAQAogCSAgaTkxNV9nZW0ubyBcCiAJICBpOTE1X2dlbV9zdG9sZW4ubyBcCiAJICBpOTE1X2dlbV90aWxpbmcubyBcCisJICBpOTE1X2dlbV91c2VycHRyLm8gXAogCSAgaTkxNV9ncHVfZXJyb3IubyBcCiAJICBpOTE1X2lycS5vIFwKIAkgIGk5MTVfdHJhY2VfcG9pbnRzLm8gXAogCSAgaW50ZWxfcmluZ2J1ZmZlci5vIFwKIAkgIGludGVsX3VuY29yZS5vCiAKKyMgYXV0b2dlbmVyYXRlZCBudWxsIHJlbmRlciBzdGF0ZQoraTkxNS15ICs9IGludGVsX3JlbmRlcnN0YXRlX2dlbjYubyBcCisJICBpbnRlbF9yZW5kZXJzdGF0ZV9nZW43Lm8gXAorCSAgaW50ZWxfcmVuZGVyc3RhdGVfZ2VuOC5vCisKICMgbW9kZXNldHRpbmcgY29yZSBjb2RlCiBpOTE1LXkgKz0gaW50ZWxfYmlvcy5vIFwKIAkgIGludGVsX2Rpc3BsYXkubyBcCkBAIC01NSw2ICs2Miw3IEBACiAJICBpbnRlbF9kc2lfY21kLm8gXAogCSAgaW50ZWxfZHNpLm8gXAogCSAgaW50ZWxfZHNpX3BsbC5vIFwKKwkgIGludGVsX2RzaV9wYW5lbF92YnQubyBcCiAJICBpbnRlbF9kdm8ubyBcCiAJICBpbnRlbF9oZG1pLm8gXAogCSAgaW50ZWxfaTJjLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jCmluZGV4IGEwZjViZGQuLjgwNDQ5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3eHh4LmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgewogCQkqY2ggPSBpbl9idWZbMF07CiAJCXJldHVybiB0cnVlOwotCX07CisJfQogCiAJaWYgKCFjaDd4eHgtPnF1aWV0KSB7CiAJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19pdmNoLmMKaW5kZXggMGYxODY1ZC4uMGYyNTg3ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19pdmNoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJaWYgKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAzKSA9PSAzKSB7CiAJCSpkYXRhID0gKGluX2J1ZlsxXSA8PCA4KSB8IGluX2J1ZlswXTsKIAkJcmV0dXJuIHRydWU7Ci0JfTsKKwl9CiAKIAlpZiAoIXByaXYtPnF1aWV0KSB7CiAJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19uczI1MDEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19uczI1MDEuYwppbmRleCA4MTU1ZGVkLi43NGYyYWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fbnMyNTAxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX25zMjUwMS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlpZiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpIHsKIAkJKmNoID0gaW5fYnVmWzBdOwogCQlyZXR1cm4gdHJ1ZTsKLQl9OworCX0KIAogCWlmICghbnMtPnF1aWV0KSB7CiAJCURSTV9ERUJVR19LTVMKQEAgLTIzMyw5ICsyMzMsOCBAQAogCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKIAlEUk1fREVCVUdfS01TCi0JICAgICgiJXM6IGlzIG1vZGUgdmFsaWQgKGhkaXNwbGF5PSVkLGh0b3RhbD0lZCx2ZGlzcGxheT0lZCx2dG90YWw9JWQpXG4iLAotCSAgICAgX19GVU5DVElPTl9fLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+aHRvdGFsLCBtb2RlLT52ZGlzcGxheSwKLQkgICAgIG1vZGUtPnZ0b3RhbCk7CisJICAgICgiaXMgbW9kZSB2YWxpZCAoaGRpc3BsYXk9JWQsaHRvdGFsPSVkLHZkaXNwbGF5PSVkLHZ0b3RhbD0lZClcbiIsCisJICAgICBtb2RlLT5oZGlzcGxheSwgbW9kZS0+aHRvdGFsLCBtb2RlLT52ZGlzcGxheSwgbW9kZS0+dnRvdGFsKTsKIAogCS8qCiAJICogQ3VycmVudGx5LCB0aGVzZSBhcmUgYWxsIHRoZSBtb2RlcyBJIGhhdmUgZGF0YSBmcm9tLgpAQCAtMjYxLDkgKzI2MCw4IEBACiAJc3RydWN0IG5zMjUwMV9wcml2ICpucyA9IChzdHJ1Y3QgbnMyNTAxX3ByaXYgKikoZHZvLT5kZXZfcHJpdik7CiAKIAlEUk1fREVCVUdfS01TCi0JICAgICgiJXM6IHNldCBtb2RlIChoZGlzcGxheT0lZCxodG90YWw9JWQsdmRpc3BsYXk9JWQsdnRvdGFsPSVkKS5cbiIsCi0JICAgICBfX0ZVTkNUSU9OX18sIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT5odG90YWwsIG1vZGUtPnZkaXNwbGF5LAotCSAgICAgbW9kZS0+dnRvdGFsKTsKKwkgICAgKCJzZXQgbW9kZSAoaGRpc3BsYXk9JWQsaHRvdGFsPSVkLHZkaXNwbGF5PSVkLHZ0b3RhbD0lZCkuXG4iLAorCSAgICAgbW9kZS0+aGRpc3BsYXksIG1vZGUtPmh0b3RhbCwgbW9kZS0+dmRpc3BsYXksIG1vZGUtPnZ0b3RhbCk7CiAKIAkvKgogCSAqIFdoZXJlIGRvIEkgZmluZCB0aGUgbmF0aXZlIHJlc29sdXRpb24gZm9yIHdoaWNoIHNjYWxpbmcgaXMgbm90IHJlcXVpcmVkPz8/CkBAIC0yNzcsOCArMjc1LDcgQEAKIAkJaWYgKG1vZGUtPmhkaXNwbGF5ID09IDgwMCAmJiBtb2RlLT52ZGlzcGxheSA9PSA2MDApIHsKIAkJCS8qIG1vZGUgMjc3ICovCiAJCQlucy0+cmVnXzhfc2hhZG93ICY9IH5OUzI1MDFfOF9CUEFTOwotCQkJRFJNX0RFQlVHX0tNUygiJXM6IHN3aXRjaGluZyB0byA4MDB4NjAwXG4iLAotCQkJCSAgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlEUk1fREVCVUdfS01TKCJzd2l0Y2hpbmcgdG8gODAweDYwMFxuIik7CiAKIAkJCS8qCiAJCQkgKiBObywgSSBkbyBub3Qga25vdyB3aGVyZSB0aGlzIGRhdGEgY29tZXMgZnJvbS4KQEAgLTM0MSw4ICszMzgsNyBAQAogCiAJCX0gZWxzZSBpZiAobW9kZS0+aGRpc3BsYXkgPT0gNjQwICYmIG1vZGUtPnZkaXNwbGF5ID09IDQ4MCkgewogCQkJLyogbW9kZSAyNzQgKi8KLQkJCURSTV9ERUJVR19LTVMoIiVzOiBzd2l0Y2hpbmcgdG8gNjQweDQ4MFxuIiwKLQkJCQkgICAgICBfX0ZVTkNUSU9OX18pOworCQkJRFJNX0RFQlVHX0tNUygic3dpdGNoaW5nIHRvIDY0MHg0ODBcbiIpOwogCQkJLyoKIAkJCSAqIE5vLCBJIGRvIG5vdCBrbm93IHdoZXJlIHRoaXMgZGF0YSBjb21lcyBmcm9tLgogCQkJICogSXQgaXMganVzdCB3aGF0IHRoZSB2aWRlbyBiaW9zIGxlZnQgaW4gdGhlIERWTywgc28KQEAgLTQwNiw4ICs0MDIsNyBAQAogCiAJCX0gZWxzZSBpZiAobW9kZS0+aGRpc3BsYXkgPT0gMTAyNCAmJiBtb2RlLT52ZGlzcGxheSA9PSA3NjgpIHsKIAkJCS8qIG1vZGUgMjgwICovCi0JCQlEUk1fREVCVUdfS01TKCIlczogc3dpdGNoaW5nIHRvIDEwMjR4NzY4XG4iLAotCQkJCSAgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlEUk1fREVCVUdfS01TKCJzd2l0Y2hpbmcgdG8gMTAyNHg3NjhcbiIpOwogCQkJLyoKIAkJCSAqIFRoaXMgbWlnaHQgb3IgbWlnaHQgbm90IHdvcmssIGFjdHVhbGx5LiBJJ20gc2lsZW50bHkKIAkJCSAqIGFzc3VtaW5nIGhlcmUgdGhhdCB0aGUgbmF0aXZlIHBhbmVsIHJlc29sdXRpb24gaXMKQEAgLTQ1OCw4ICs0NTMsNyBAQAogCXN0cnVjdCBuczI1MDFfcHJpdiAqbnMgPSAoc3RydWN0IG5zMjUwMV9wcml2ICopKGR2by0+ZGV2X3ByaXYpOwogCXVuc2lnbmVkIGNoYXIgY2g7CiAKLQlEUk1fREVCVUdfS01TKCIlczogVHJ5aW5nIHNldCB0aGUgZHBtcyBvZiB0aGUgRFZPIHRvICVpXG4iLAotCQkgICAgICBfX0ZVTkNUSU9OX18sIGVuYWJsZSk7CisJRFJNX0RFQlVHX0tNUygiVHJ5aW5nIHNldCB0aGUgZHBtcyBvZiB0aGUgRFZPIHRvICVpXG4iLCBlbmFibGUpOwogCiAJY2ggPSBucy0+cmVnXzhfc2hhZG93OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMKaW5kZXggN2IzZTllOS4uZmEwMTE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19zaWwxNjQuYwpAQCAtOTMsNyArOTMsNyBAQAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgewogCQkqY2ggPSBpbl9idWZbMF07CiAJCXJldHVybiB0cnVlOwotCX07CisJfQogCiAJaWYgKCFzaWwtPnF1aWV0KSB7CiAJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jCmluZGV4IDEyZWE0YjEuLjc4NTM3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b190ZnA0MTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgewogCQkqY2ggPSBpbl9idWZbMF07CiAJCXJldHVybiB0cnVlOwotCX07CisJfQogCiAJaWYgKCF0ZnAtPnF1aWV0KSB7CiAJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9jbWRfcGFyc2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2NtZF9wYXJzZXIuYwppbmRleCA0Y2Y2ZDAyLi45ZDc5NTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2NtZF9wYXJzZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2NtZF9wYXJzZXIuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKIC8qKgotICogRE9DOiBpOTE1IGJhdGNoIGJ1ZmZlciBjb21tYW5kIHBhcnNlcgorICogRE9DOiBiYXRjaCBidWZmZXIgY29tbWFuZCBwYXJzZXIKICAqCiAgKiBNb3RpdmF0aW9uOgogICogQ2VydGFpbiBPcGVuR0wgZmVhdHVyZXMgKGUuZy4gdHJhbnNmb3JtIGZlZWRiYWNrLCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nKQpAQCAtODYsNiArODYsMzY3IEBACiAgKiBnZW5lcmFsIGJpdG1hc2tpbmcgbWVjaGFuaXNtLgogICovCiAKKyNkZWZpbmUgU1REX01JX09QQ09ERV9NQVNLICAweEZGODAwMDAwCisjZGVmaW5lIFNURF8zRF9PUENPREVfTUFTSyAgMHhGRkZGMDAwMAorI2RlZmluZSBTVERfMkRfT1BDT0RFX01BU0sgIDB4RkZDMDAwMDAKKyNkZWZpbmUgU1REX01GWF9PUENPREVfTUFTSyAweEZGRkYwMDAwCisKKyNkZWZpbmUgQ01EKG9wLCBvcG0sIGYsIGxtLCBmbCwgLi4uKQkJCQlcCisJewkJCQkJCQlcCisJCS5mbGFncyA9IChmbCkgfCAoKGYpID8gQ01EX0RFU0NfRklYRUQgOiAwKSwJXAorCQkuY21kID0geyAob3ApLCAob3BtKSB9LCAJCQlcCisJCS5sZW5ndGggPSB7IChsbSkgfSwJCQkJXAorCQlfX1ZBX0FSR1NfXwkJCQkJXAorCX0KKworLyogQ29udmVuaWVuY2UgbWFjcm9zIHRvIGNvbXByZXNzIHRoZSB0YWJsZXMgKi8KKyNkZWZpbmUgU01JIFNURF9NSV9PUENPREVfTUFTSworI2RlZmluZSBTM0QgU1REXzNEX09QQ09ERV9NQVNLCisjZGVmaW5lIFMyRCBTVERfMkRfT1BDT0RFX01BU0sKKyNkZWZpbmUgU01GWCBTVERfTUZYX09QQ09ERV9NQVNLCisjZGVmaW5lIEYgdHJ1ZQorI2RlZmluZSBTIENNRF9ERVNDX1NLSVAKKyNkZWZpbmUgUiBDTURfREVTQ19SRUpFQ1QKKyNkZWZpbmUgVyBDTURfREVTQ19SRUdJU1RFUgorI2RlZmluZSBCIENNRF9ERVNDX0JJVE1BU0sKKyNkZWZpbmUgTSBDTURfREVTQ19NQVNURVIKKworLyogICAgICAgICAgICBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrICAgRml4ZWQgTGVuICAgQWN0aW9uCisJICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciBjb21tb25fY21kc1tdID0geworCUNNRCggIE1JX05PT1AsICAgICAgICAgICAgICAgICAgICAgICAgICBTTUksICAgIEYsICAxLCAgICAgIFMgICksCisJQ01EKCAgTUlfVVNFUl9JTlRFUlJVUFQsICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUiAgKSwKKwlDTUQoICBNSV9XQUlUX0ZPUl9FVkVOVCwgICAgICAgICAgICAgICAgU01JLCAgICBGLCAgMSwgICAgICBNICApLAorCUNNRCggIE1JX0FSQl9DSEVDSywgICAgICAgICAgICAgICAgICAgICBTTUksICAgIEYsICAxLCAgICAgIFMgICksCisJQ01EKCAgTUlfUkVQT1JUX0hFQUQsICAgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNSV9TVVNQRU5EX0ZMVVNILCAgICAgICAgICAgICAgICAgU01JLCAgICBGLCAgMSwgICAgICBTICApLAorCUNNRCggIE1JX1NFTUFQSE9SRV9NQk9YLCAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweEZGLCAgIFIgICksCisJQ01EKCAgTUlfU1RPUkVfRFdPUkRfSU5ERVgsICAgICAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgUiAgKSwKKwlDTUQoICBNSV9MT0FEX1JFR0lTVEVSX0lNTSgxKSwgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBXLAorCSAgICAgIC5yZWcgPSB7IC5vZmZzZXQgPSAxLCAubWFzayA9IDB4MDA3RkZGRkMgfSAgICAgICAgICAgICAgICksCisJQ01EKCAgTUlfU1RPUkVfUkVHSVNURVJfTUVNKDEpLCAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgVyB8IEIsCisJICAgICAgLnJlZyA9IHsgLm9mZnNldCA9IDEsIC5tYXNrID0gMHgwMDdGRkZGQyB9LAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAwLAorCQkJLm1hc2sgPSBNSV9HTE9CQUxfR1RULAorCQkJLmV4cGVjdGVkID0gMCwKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKKwlDTUQoICBNSV9MT0FEX1JFR0lTVEVSX01FTSwgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBXIHwgQiwKKwkgICAgICAucmVnID0geyAub2Zmc2V0ID0gMSwgLm1hc2sgPSAweDAwN0ZGRkZDIH0sCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0dMT0JBTF9HVFQsCisJCQkuZXhwZWN0ZWQgPSAwLAorCSAgICAgIH19LAkJCQkJCSAgICAgICApLAorCUNNRCggIE1JX0JBVENIX0JVRkZFUl9TVEFSVCwgICAgICAgICAgICBTTUksICAgIUYsICAweEZGLCAgIFMgICksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF9kZXNjcmlwdG9yIHJlbmRlcl9jbWRzW10gPSB7CisJQ01EKCAgTUlfRkxVU0gsICAgICAgICAgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNSV9BUkJfT05fT0ZGLCAgICAgICAgICAgICAgICAgICAgU01JLCAgICBGLCAgMSwgICAgICBSICApLAorCUNNRCggIE1JX1BSRURJQ0FURSwgICAgICAgICAgICAgICAgICAgICBTTUksICAgIEYsICAxLCAgICAgIFMgICksCisJQ01EKCAgTUlfVE9QT0xPR1lfRklMVEVSLCAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNSV9ESVNQTEFZX0ZMSVAsICAgICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBSICApLAorCUNNRCggIE1JX1NFVF9DT05URVhULCAgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweEZGLCAgIFIgICksCisJQ01EKCAgTUlfVVJCX0NMRUFSLCAgICAgICAgICAgICAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgUyAgKSwKKwlDTUQoICBNSV9TVE9SRV9EV09SRF9JTU0sICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBCLAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAwLAorCQkJLm1hc2sgPSBNSV9HTE9CQUxfR1RULAorCQkJLmV4cGVjdGVkID0gMCwKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKKwlDTUQoICBNSV9VUERBVEVfR1RULCAgICAgICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBSICApLAorCUNNRCggIE1JX0NMRkxVU0gsICAgICAgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweDNGRiwgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0dMT0JBTF9HVFQsCisJCQkuZXhwZWN0ZWQgPSAwLAorCSAgICAgIH19LAkJCQkJCSAgICAgICApLAorCUNNRCggIE1JX1JFUE9SVF9QRVJGX0NPVU5ULCAgICAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDEsCisJCQkubWFzayA9IE1JX1JFUE9SVF9QRVJGX0NPVU5UX0dHVFQsCisJCQkuZXhwZWN0ZWQgPSAwLAorCSAgICAgIH19LAkJCQkJCSAgICAgICApLAorCUNNRCggIE1JX0NPTkRJVElPTkFMX0JBVENIX0JVRkZFUl9FTkQsICBTTUksICAgIUYsICAweEZGLCAgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0dMT0JBTF9HVFQsCisJCQkuZXhwZWN0ZWQgPSAwLAorCSAgICAgIH19LAkJCQkJCSAgICAgICApLAorCUNNRCggIEdGWF9PUF8zRFNUQVRFX1ZGX1NUQVRJU1RJQ1MsICAgICBTM0QsICAgIEYsICAxLCAgICAgIFMgICksCisJQ01EKCAgUElQRUxJTkVfU0VMRUNULCAgICAgICAgICAgICAgICAgIFMzRCwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNRURJQV9WRkVfU1RBVEUsCQkJUzNELCAgICFGLCAgMHhGRkZGLCBCLAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAyLAorCQkJLm1hc2sgPSBNRURJQV9WRkVfU1RBVEVfTU1JT19BQ0NFU1NfTUFTSywKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCisJQ01EKCAgR1BHUFVfT0JKRUNULCAgICAgICAgICAgICAgICAgICAgIFMzRCwgICAhRiwgIDB4RkYsICAgUyAgKSwKKwlDTUQoICBHUEdQVV9XQUxLRVIsICAgICAgICAgICAgICAgICAgICAgUzNELCAgICFGLCAgMHhGRiwgICBTICApLAorCUNNRCggIEdGWF9PUF8zRFNUQVRFX1NPX0RFQ0xfTElTVCwgICAgICBTM0QsICAgIUYsICAweDFGRiwgIFMgICksCisJQ01EKCAgR0ZYX09QX1BJUEVfQ09OVFJPTCg1KSwgICAgICAgICAgIFMzRCwgICAhRiwgIDB4RkYsICAgQiwKKwkgICAgICAuYml0cyA9IHt7CisJCQkub2Zmc2V0ID0gMSwKKwkJCS5tYXNrID0gKFBJUEVfQ09OVFJPTF9NTUlPX1dSSVRFIHwgUElQRV9DT05UUk9MX05PVElGWSksCisJCQkuZXhwZWN0ZWQgPSAwLAorCSAgICAgIH0sCisJICAgICAgeworCQkJLm9mZnNldCA9IDEsCisJCSAgICAgICAgLm1hc2sgPSAoUElQRV9DT05UUk9MX0dMT0JBTF9HVFRfSVZCIHwKKwkJCQkgUElQRV9DT05UUk9MX1NUT1JFX0RBVEFfSU5ERVgpLAorCQkJLmV4cGVjdGVkID0gMCwKKwkJCS5jb25kaXRpb25fb2Zmc2V0ID0gMSwKKwkJCS5jb25kaXRpb25fbWFzayA9IFBJUEVfQ09OVFJPTF9QT1NUX1NZTkNfT1BfTUFTSywKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgaHN3X3JlbmRlcl9jbWRzW10gPSB7CisJQ01EKCAgTUlfU0VUX1BSRURJQ0FURSwgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNSV9SU19DT05UUk9MLCAgICAgICAgICAgICAgICAgICAgU01JLCAgICBGLCAgMSwgICAgICBTICApLAorCUNNRCggIE1JX1VSQl9BVE9NSUNfQUxMT0MsICAgICAgICAgICAgICBTTUksICAgIEYsICAxLCAgICAgIFMgICksCisJQ01EKCAgTUlfUlNfQ09OVEVYVCwgICAgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUyAgKSwKKwlDTUQoICBNSV9MT0FEX1NDQU5fTElORVNfSU5DTCwgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBNICApLAorCUNNRCggIE1JX0xPQURfU0NBTl9MSU5FU19FWENMLCAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIFIgICksCisJQ01EKCAgTUlfTE9BRF9SRUdJU1RFUl9SRUcsICAgICAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgUiAgKSwKKwlDTUQoICBNSV9SU19TVE9SRV9EQVRBX0lNTSwgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBTICApLAorCUNNRCggIE1JX0xPQURfVVJCX01FTSwgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweEZGLCAgIFMgICksCisJQ01EKCAgTUlfU1RPUkVfVVJCX01FTSwgICAgICAgICAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgUyAgKSwKKwlDTUQoICBHRlhfT1BfM0RTVEFURV9EWDlfQ09OU1RBTlRGX1ZTLCAgUzNELCAgICFGLCAgMHg3RkYsICBTICApLAorCUNNRCggIEdGWF9PUF8zRFNUQVRFX0RYOV9DT05TVEFOVEZfUFMsICBTM0QsICAgIUYsICAweDdGRiwgIFMgICksCisKKwlDTUQoICBHRlhfT1BfM0RTVEFURV9CSU5ESU5HX1RBQkxFX0VESVRfVlMsICBTM0QsICAgIUYsICAweDFGRiwgIFMgICksCisJQ01EKCAgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX0dTLCAgUzNELCAgICFGLCAgMHgxRkYsICBTICApLAorCUNNRCggIEdGWF9PUF8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfRURJVF9IUywgIFMzRCwgICAhRiwgIDB4MUZGLCAgUyAgKSwKKwlDTUQoICBHRlhfT1BfM0RTVEFURV9CSU5ESU5HX1RBQkxFX0VESVRfRFMsICBTM0QsICAgIUYsICAweDFGRiwgIFMgICksCisJQ01EKCAgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX1BTLCAgUzNELCAgICFGLCAgMHgxRkYsICBTICApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciB2aWRlb19jbWRzW10gPSB7CisJQ01EKCAgTUlfQVJCX09OX09GRiwgICAgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUiAgKSwKKwlDTUQoICBNSV9TVE9SRV9EV09SRF9JTU0sICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBCLAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAwLAorCQkJLm1hc2sgPSBNSV9HTE9CQUxfR1RULAorCQkJLmV4cGVjdGVkID0gMCwKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKKwlDTUQoICBNSV9VUERBVEVfR1RULCAgICAgICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBSICApLAorCUNNRCggIE1JX0ZMVVNIX0RXLCAgICAgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX05PVElGWSwKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfSwKKwkgICAgICB7CisJCQkub2Zmc2V0ID0gMSwKKwkJCS5tYXNrID0gTUlfRkxVU0hfRFdfVVNFX0dUVCwKKwkJCS5leHBlY3RlZCA9IDAsCisJCQkuY29uZGl0aW9uX29mZnNldCA9IDAsCisJCQkuY29uZGl0aW9uX21hc2sgPSBNSV9GTFVTSF9EV19PUF9NQVNLLAorCSAgICAgIH0sCisJICAgICAgeworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX1NUT1JFX0lOREVYLAorCQkJLmV4cGVjdGVkID0gMCwKKwkJCS5jb25kaXRpb25fb2Zmc2V0ID0gMCwKKwkJCS5jb25kaXRpb25fbWFzayA9IE1JX0ZMVVNIX0RXX09QX01BU0ssCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCisJQ01EKCAgTUlfQ09ORElUSU9OQUxfQkFUQ0hfQlVGRkVSX0VORCwgIFNNSSwgICAhRiwgIDB4RkYsICAgQiwKKwkgICAgICAuYml0cyA9IHt7CisJCQkub2Zmc2V0ID0gMCwKKwkJCS5tYXNrID0gTUlfR0xPQkFMX0dUVCwKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCisJLyoKKwkgKiBNRlhfV0FJVCBkb2Vzbid0IGZpdCB0aGUgd2F5IHdlIGhhbmRsZSBsZW5ndGggZm9yIG1vc3QgY29tbWFuZHMuCisJICogSXQgaGFzIGEgbGVuZ3RoIGZpZWxkIGJ1dCBpdCB1c2VzIGEgbm9uLXN0YW5kYXJkIGxlbmd0aCBiaWFzLgorCSAqIEl0IGlzIGFsd2F5cyAxIGR3b3JkIHRob3VnaCwgc28ganVzdCB0cmVhdCBpdCBhcyBmaXhlZCBsZW5ndGguCisJICovCisJQ01EKCAgTUZYX1dBSVQsICAgICAgICAgICAgICAgICAgICAgICAgIFNNRlgsICAgRiwgIDEsICAgICAgUyAgKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgdmVjc19jbWRzW10gPSB7CisJQ01EKCAgTUlfQVJCX09OX09GRiwgICAgICAgICAgICAgICAgICAgIFNNSSwgICAgRiwgIDEsICAgICAgUiAgKSwKKwlDTUQoICBNSV9TVE9SRV9EV09SRF9JTU0sICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHhGRiwgICBCLAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAwLAorCQkJLm1hc2sgPSBNSV9HTE9CQUxfR1RULAorCQkJLmV4cGVjdGVkID0gMCwKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKKwlDTUQoICBNSV9VUERBVEVfR1RULCAgICAgICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBSICApLAorCUNNRCggIE1JX0ZMVVNIX0RXLCAgICAgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX05PVElGWSwKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfSwKKwkgICAgICB7CisJCQkub2Zmc2V0ID0gMSwKKwkJCS5tYXNrID0gTUlfRkxVU0hfRFdfVVNFX0dUVCwKKwkJCS5leHBlY3RlZCA9IDAsCisJCQkuY29uZGl0aW9uX29mZnNldCA9IDAsCisJCQkuY29uZGl0aW9uX21hc2sgPSBNSV9GTFVTSF9EV19PUF9NQVNLLAorCSAgICAgIH0sCisJICAgICAgeworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX1NUT1JFX0lOREVYLAorCQkJLmV4cGVjdGVkID0gMCwKKwkJCS5jb25kaXRpb25fb2Zmc2V0ID0gMCwKKwkJCS5jb25kaXRpb25fbWFzayA9IE1JX0ZMVVNIX0RXX09QX01BU0ssCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCisJQ01EKCAgTUlfQ09ORElUSU9OQUxfQkFUQ0hfQlVGRkVSX0VORCwgIFNNSSwgICAhRiwgIDB4RkYsICAgQiwKKwkgICAgICAuYml0cyA9IHt7CisJCQkub2Zmc2V0ID0gMCwKKwkJCS5tYXNrID0gTUlfR0xPQkFMX0dUVCwKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF9kZXNjcmlwdG9yIGJsdF9jbWRzW10gPSB7CisJQ01EKCAgTUlfRElTUExBWV9GTElQLCAgICAgICAgICAgICAgICAgIFNNSSwgICAhRiwgIDB4RkYsICAgUiAgKSwKKwlDTUQoICBNSV9TVE9SRV9EV09SRF9JTU0sICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHgzRkYsICBCLAorCSAgICAgIC5iaXRzID0ge3sKKwkJCS5vZmZzZXQgPSAwLAorCQkJLm1hc2sgPSBNSV9HTE9CQUxfR1RULAorCQkJLmV4cGVjdGVkID0gMCwKKwkgICAgICB9fSwJCQkJCQkgICAgICAgKSwKKwlDTUQoICBNSV9VUERBVEVfR1RULCAgICAgICAgICAgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBSICApLAorCUNNRCggIE1JX0ZMVVNIX0RXLCAgICAgICAgICAgICAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIEIsCisJICAgICAgLmJpdHMgPSB7eworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX05PVElGWSwKKwkJCS5leHBlY3RlZCA9IDAsCisJICAgICAgfSwKKwkgICAgICB7CisJCQkub2Zmc2V0ID0gMSwKKwkJCS5tYXNrID0gTUlfRkxVU0hfRFdfVVNFX0dUVCwKKwkJCS5leHBlY3RlZCA9IDAsCisJCQkuY29uZGl0aW9uX29mZnNldCA9IDAsCisJCQkuY29uZGl0aW9uX21hc2sgPSBNSV9GTFVTSF9EV19PUF9NQVNLLAorCSAgICAgIH0sCisJICAgICAgeworCQkJLm9mZnNldCA9IDAsCisJCQkubWFzayA9IE1JX0ZMVVNIX0RXX1NUT1JFX0lOREVYLAorCQkJLmV4cGVjdGVkID0gMCwKKwkJCS5jb25kaXRpb25fb2Zmc2V0ID0gMCwKKwkJCS5jb25kaXRpb25fbWFzayA9IE1JX0ZMVVNIX0RXX09QX01BU0ssCisJICAgICAgfX0sCQkJCQkJICAgICAgICksCisJQ01EKCAgQ09MT1JfQkxULCAgICAgICAgICAgICAgICAgICAgICAgIFMyRCwgICAhRiwgIDB4M0YsICAgUyAgKSwKKwlDTUQoICBTUkNfQ09QWV9CTFQsICAgICAgICAgICAgICAgICAgICAgUzJELCAgICFGLCAgMHgzRiwgICBTICApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciBoc3dfYmx0X2NtZHNbXSA9IHsKKwlDTUQoICBNSV9MT0FEX1NDQU5fTElORVNfSU5DTCwgICAgICAgICAgU01JLCAgICFGLCAgMHgzRiwgICBNICApLAorCUNNRCggIE1JX0xPQURfU0NBTl9MSU5FU19FWENMLCAgICAgICAgICBTTUksICAgIUYsICAweDNGLCAgIFIgICksCit9OworCisjdW5kZWYgQ01ECisjdW5kZWYgU01JCisjdW5kZWYgUzNECisjdW5kZWYgUzJECisjdW5kZWYgU01GWAorI3VuZGVmIEYKKyN1bmRlZiBTCisjdW5kZWYgUgorI3VuZGVmIFcKKyN1bmRlZiBCCisjdW5kZWYgTQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF90YWJsZSBnZW43X3JlbmRlcl9jbWRzW10gPSB7CisJeyBjb21tb25fY21kcywgQVJSQVlfU0laRShjb21tb25fY21kcykgfSwKKwl7IHJlbmRlcl9jbWRzLCBBUlJBWV9TSVpFKHJlbmRlcl9jbWRzKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgaHN3X3JlbmRlcl9yaW5nX2NtZHNbXSA9IHsKKwl7IGNvbW1vbl9jbWRzLCBBUlJBWV9TSVpFKGNvbW1vbl9jbWRzKSB9LAorCXsgcmVuZGVyX2NtZHMsIEFSUkFZX1NJWkUocmVuZGVyX2NtZHMpIH0sCisJeyBoc3dfcmVuZGVyX2NtZHMsIEFSUkFZX1NJWkUoaHN3X3JlbmRlcl9jbWRzKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgZ2VuN192aWRlb19jbWRzW10gPSB7CisJeyBjb21tb25fY21kcywgQVJSQVlfU0laRShjb21tb25fY21kcykgfSwKKwl7IHZpZGVvX2NtZHMsIEFSUkFZX1NJWkUodmlkZW9fY21kcykgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX3RhYmxlIGhzd192ZWJveF9jbWRzW10gPSB7CisJeyBjb21tb25fY21kcywgQVJSQVlfU0laRShjb21tb25fY21kcykgfSwKKwl7IHZlY3NfY21kcywgQVJSQVlfU0laRSh2ZWNzX2NtZHMpIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF90YWJsZSBnZW43X2JsdF9jbWRzW10gPSB7CisJeyBjb21tb25fY21kcywgQVJSQVlfU0laRShjb21tb25fY21kcykgfSwKKwl7IGJsdF9jbWRzLCBBUlJBWV9TSVpFKGJsdF9jbWRzKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgaHN3X2JsdF9yaW5nX2NtZHNbXSA9IHsKKwl7IGNvbW1vbl9jbWRzLCBBUlJBWV9TSVpFKGNvbW1vbl9jbWRzKSB9LAorCXsgYmx0X2NtZHMsIEFSUkFZX1NJWkUoYmx0X2NtZHMpIH0sCisJeyBoc3dfYmx0X2NtZHMsIEFSUkFZX1NJWkUoaHN3X2JsdF9jbWRzKSB9LAorfTsKKworLyoKKyAqIFJlZ2lzdGVyIHdoaXRlbGlzdHMsIHNvcnRlZCBieSBpbmNyZWFzaW5nIHJlZ2lzdGVyIG9mZnNldC4KKyAqCisgKiBTb21lIHJlZ2lzdGVycyB0aGF0IHVzZXJzcGFjZSBhY2Nlc3NlcyBhcmUgNjQgYml0cy4gVGhlIHJlZ2lzdGVyCisgKiBhY2Nlc3MgY29tbWFuZHMgb25seSBhbGxvdyAzMi1iaXQgYWNjZXNzZXMuIEhlbmNlLCB3ZSBoYXZlIHRvIGluY2x1ZGUKKyAqIGVudHJpZXMgZm9yIGJvdGggaGFsdmVzIG9mIHRoZSA2NC1iaXQgcmVnaXN0ZXJzLgorICovCisKKy8qIENvbnZlbmllbmNlIG1hY3JvIGZvciBhZGRpbmcgNjQtYml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBSRUc2NChhZGRyKSAoYWRkciksIChhZGRyICsgc2l6ZW9mKHUzMikpCisKK3N0YXRpYyBjb25zdCB1MzIgZ2VuN19yZW5kZXJfcmVnc1tdID0geworCVJFRzY0KEhTX0lOVk9DQVRJT05fQ09VTlQpLAorCVJFRzY0KERTX0lOVk9DQVRJT05fQ09VTlQpLAorCVJFRzY0KElBX1ZFUlRJQ0VTX0NPVU5UKSwKKwlSRUc2NChJQV9QUklNSVRJVkVTX0NPVU5UKSwKKwlSRUc2NChWU19JTlZPQ0FUSU9OX0NPVU5UKSwKKwlSRUc2NChHU19JTlZPQ0FUSU9OX0NPVU5UKSwKKwlSRUc2NChHU19QUklNSVRJVkVTX0NPVU5UKSwKKwlSRUc2NChDTF9JTlZPQ0FUSU9OX0NPVU5UKSwKKwlSRUc2NChDTF9QUklNSVRJVkVTX0NPVU5UKSwKKwlSRUc2NChQU19JTlZPQ0FUSU9OX0NPVU5UKSwKKwlSRUc2NChQU19ERVBUSF9DT1VOVCksCisJT0FDT05UUk9MLCAvKiBPbmx5IGFsbG93ZWQgZm9yIExSSSBhbmQgU1JNLiBTZWUgYmVsb3cuICovCisJR0VON18zRFBSSU1fRU5EX09GRlNFVCwKKwlHRU43XzNEUFJJTV9TVEFSVF9WRVJURVgsCisJR0VON18zRFBSSU1fVkVSVEVYX0NPVU5ULAorCUdFTjdfM0RQUklNX0lOU1RBTkNFX0NPVU5ULAorCUdFTjdfM0RQUklNX1NUQVJUX0lOU1RBTkNFLAorCUdFTjdfM0RQUklNX0JBU0VfVkVSVEVYLAorCVJFRzY0KEdFTjdfU09fTlVNX1BSSU1TX1dSSVRURU4oMCkpLAorCVJFRzY0KEdFTjdfU09fTlVNX1BSSU1TX1dSSVRURU4oMSkpLAorCVJFRzY0KEdFTjdfU09fTlVNX1BSSU1TX1dSSVRURU4oMikpLAorCVJFRzY0KEdFTjdfU09fTlVNX1BSSU1TX1dSSVRURU4oMykpLAorCVJFRzY0KEdFTjdfU09fUFJJTV9TVE9SQUdFX05FRURFRCgwKSksCisJUkVHNjQoR0VON19TT19QUklNX1NUT1JBR0VfTkVFREVEKDEpKSwKKwlSRUc2NChHRU43X1NPX1BSSU1fU1RPUkFHRV9ORUVERUQoMikpLAorCVJFRzY0KEdFTjdfU09fUFJJTV9TVE9SQUdFX05FRURFRCgzKSksCisJR0VON19TT19XUklURV9PRkZTRVQoMCksCisJR0VON19TT19XUklURV9PRkZTRVQoMSksCisJR0VON19TT19XUklURV9PRkZTRVQoMiksCisJR0VON19TT19XUklURV9PRkZTRVQoMyksCit9OworCitzdGF0aWMgY29uc3QgdTMyIGdlbjdfYmx0X3JlZ3NbXSA9IHsKKwlCQ1NfU1dDVFJMLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBpdmJfbWFzdGVyX3JlZ3NbXSA9IHsKKwlGT1JDRVdBS0VfTVQsCisJREVSUk1SLAorCUdFTjdfUElQRV9ERV9MT0FEX1NMKFBJUEVfQSksCisJR0VON19QSVBFX0RFX0xPQURfU0woUElQRV9CKSwKKwlHRU43X1BJUEVfREVfTE9BRF9TTChQSVBFX0MpLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBoc3dfbWFzdGVyX3JlZ3NbXSA9IHsKKwlGT1JDRVdBS0VfTVQsCisJREVSUk1SLAorfTsKKworI3VuZGVmIFJFRzY0CisKIHN0YXRpYyB1MzIgZ2VuN19yZW5kZXJfZ2V0X2NtZF9sZW5ndGhfbWFzayh1MzIgY21kX2hlYWRlcikKIHsKIAl1MzIgY2xpZW50ID0gKGNtZF9oZWFkZXIgJiBJTlNUUl9DTElFTlRfTUFTSykgPj4gSU5TVFJfQ0xJRU5UX1NISUZUOwpAQCAtMTM3LDE1ICs0OTgsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdmFsaWRhdGVfY21kc19zb3J0ZWQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGJvb2wgdmFsaWRhdGVfY21kc19zb3J0ZWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJCQkgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF90YWJsZSAqY21kX3RhYmxlcywKKwkJCQkgaW50IGNtZF90YWJsZV9jb3VudCkKIHsKIAlpbnQgaTsKKwlib29sIHJldCA9IHRydWU7CiAKLQlpZiAoIXJpbmctPmNtZF90YWJsZXMgfHwgcmluZy0+Y21kX3RhYmxlX2NvdW50ID09IDApCi0JCXJldHVybjsKKwlpZiAoIWNtZF90YWJsZXMgfHwgY21kX3RhYmxlX2NvdW50ID09IDApCisJCXJldHVybiB0cnVlOwogCi0JZm9yIChpID0gMDsgaSA8IHJpbmctPmNtZF90YWJsZV9jb3VudDsgaSsrKSB7Ci0JCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgKnRhYmxlID0gJnJpbmctPmNtZF90YWJsZXNbaV07CisJZm9yIChpID0gMDsgaSA8IGNtZF90YWJsZV9jb3VudDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgKnRhYmxlID0gJmNtZF90YWJsZXNbaV07CiAJCXUzMiBwcmV2aW91cyA9IDA7CiAJCWludCBqOwogCkBAIC0xNTQsMzUgKzUxOCwxMDcgQEAKIAkJCQkmdGFibGUtPnRhYmxlW2ldOwogCQkJdTMyIGN1cnIgPSBkZXNjLT5jbWQudmFsdWUgJiBkZXNjLT5jbWQubWFzazsKIAotCQkJaWYgKGN1cnIgPCBwcmV2aW91cykKKwkJCWlmIChjdXJyIDwgcHJldmlvdXMpIHsKIAkJCQlEUk1fRVJST1IoIkNNRDogdGFibGUgbm90IHNvcnRlZCByaW5nPSVkIHRhYmxlPSVkIGVudHJ5PSVkIGNtZD0weCUwOFggcHJldj0weCUwOFhcbiIsCiAJCQkJCSAgcmluZy0+aWQsIGksIGosIGN1cnIsIHByZXZpb3VzKTsKKwkJCQlyZXQgPSBmYWxzZTsKKwkJCX0KIAogCQkJcHJldmlvdXMgPSBjdXJyOwogCQl9CiAJfQorCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfc29ydGVkKGludCByaW5nX2lkLCBjb25zdCB1MzIgKnJlZ190YWJsZSwgaW50IHJlZ19jb3VudCkKK3N0YXRpYyBib29sIGNoZWNrX3NvcnRlZChpbnQgcmluZ19pZCwgY29uc3QgdTMyICpyZWdfdGFibGUsIGludCByZWdfY291bnQpCiB7CiAJaW50IGk7CiAJdTMyIHByZXZpb3VzID0gMDsKKwlib29sIHJldCA9IHRydWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmVnX2NvdW50OyBpKyspIHsKIAkJdTMyIGN1cnIgPSByZWdfdGFibGVbaV07CiAKLQkJaWYgKGN1cnIgPCBwcmV2aW91cykKKwkJaWYgKGN1cnIgPCBwcmV2aW91cykgewogCQkJRFJNX0VSUk9SKCJDTUQ6IHRhYmxlIG5vdCBzb3J0ZWQgcmluZz0lZCBlbnRyeT0lZCByZWc9MHglMDhYIHByZXY9MHglMDhYXG4iLAogCQkJCSAgcmluZ19pZCwgaSwgY3VyciwgcHJldmlvdXMpOworCQkJcmV0ID0gZmFsc2U7CisJCX0KIAogCQlwcmV2aW91cyA9IGN1cnI7CiAJfQorCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdmFsaWRhdGVfcmVnc19zb3J0ZWQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGJvb2wgdmFsaWRhdGVfcmVnc19zb3J0ZWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQljaGVja19zb3J0ZWQocmluZy0+aWQsIHJpbmctPnJlZ190YWJsZSwgcmluZy0+cmVnX2NvdW50KTsKLQljaGVja19zb3J0ZWQocmluZy0+aWQsIHJpbmctPm1hc3Rlcl9yZWdfdGFibGUsIHJpbmctPm1hc3Rlcl9yZWdfY291bnQpOworCXJldHVybiBjaGVja19zb3J0ZWQocmluZy0+aWQsIHJpbmctPnJlZ190YWJsZSwgcmluZy0+cmVnX2NvdW50KSAmJgorCQljaGVja19zb3J0ZWQocmluZy0+aWQsIHJpbmctPm1hc3Rlcl9yZWdfdGFibGUsCisJCQkgICAgIHJpbmctPm1hc3Rlcl9yZWdfY291bnQpOworfQorCitzdHJ1Y3QgY21kX25vZGUgeworCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworfTsKKworLyoKKyAqIERpZmZlcmVudCBjb21tYW5kIHJhbmdlcyBoYXZlIGRpZmZlcmVudCBudW1iZXJzIG9mIGJpdHMgZm9yIHRoZSBvcGNvZGUuIEZvcgorICogZXhhbXBsZSwgTUkgY29tbWFuZHMgdXNlIGJpdHMgMzE6MjMgd2hpbGUgM0QgY29tbWFuZHMgdXNlIGJpdHMgMzE6MTYuIFRoZQorICogcHJvYmxlbSBpcyB0aGF0LCBmb3IgZXhhbXBsZSwgTUkgY29tbWFuZHMgdXNlIGJpdHMgMjI6MTYgZm9yIG90aGVyIGZpZWxkcworICogc3VjaCBhcyBHR1RUIHZzIFBQR1RUIGJpdHMuIElmIHdlIGluY2x1ZGUgdGhvc2UgYml0cyBpbiB0aGUgbWFzayB0aGVuIHdoZW4KKyAqIHdlIG1hc2sgYSBjb21tYW5kIGZyb20gYSBiYXRjaCBpdCBjb3VsZCBoYXNoIHRvIHRoZSB3cm9uZyBidWNrZXQgZHVlIHRvCisgKiBub24tb3Bjb2RlIGJpdHMgYmVpbmcgc2V0LiBCdXQgaWYgd2UgZG9uJ3QgaW5jbHVkZSB0aG9zZSBiaXRzLCBzb21lIDNECisgKiBjb21tYW5kcyBtYXkgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQgZHVlIHRvIG5vdCBpbmNsdWRpbmcgb3Bjb2RlIGJpdHMgdGhhdAorICogbWFrZSB0aGUgY29tbWFuZCB1bmlxdWUuIEZvciBub3csIHdlIHdpbGwgcmlzayBoYXNoaW5nIHRvIHRoZSBzYW1lIGJ1Y2tldC4KKyAqCisgKiBJZiB3ZSBhdHRlbXB0IHRvIGdlbmVyYXRlIGEgcGVyZmVjdCBoYXNoLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBsb29rIGF0IGJpdHMKKyAqIDMxOjI5IG9mIGEgY29tbWFuZCBmcm9tIGEgYmF0Y2ggYnVmZmVyIGFuZCB1c2UgdGhlIGZ1bGwgbWFzayBmb3IgdGhhdAorICogY2xpZW50LiBUaGUgZXhpc3RpbmcgSU5TVFJfQ0xJRU5UX01BU0svU0hJRlQgZGVmaW5lcyBjYW4gYmUgdXNlZCBmb3IgdGhpcy4KKyAqLworI2RlZmluZSBDTURfSEFTSF9NQVNLIFNURF9NSV9PUENPREVfTUFTSworCitzdGF0aWMgaW50IGluaXRfaGFzaF90YWJsZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkJICAgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF90YWJsZSAqY21kX3RhYmxlcywKKwkJCSAgIGludCBjbWRfdGFibGVfY291bnQpCit7CisJaW50IGksIGo7CisKKwloYXNoX2luaXQocmluZy0+Y21kX2hhc2gpOworCisJZm9yIChpID0gMDsgaSA8IGNtZF90YWJsZV9jb3VudDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgKnRhYmxlID0gJmNtZF90YWJsZXNbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IHRhYmxlLT5jb3VudDsgaisrKSB7CisJCQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2MgPQorCQkJCSZ0YWJsZS0+dGFibGVbal07CisJCQlzdHJ1Y3QgY21kX25vZGUgKmRlc2Nfbm9kZSA9CisJCQkJa21hbGxvYyhzaXplb2YoKmRlc2Nfbm9kZSksIEdGUF9LRVJORUwpOworCisJCQlpZiAoIWRlc2Nfbm9kZSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGVzY19ub2RlLT5kZXNjID0gZGVzYzsKKwkJCWhhc2hfYWRkKHJpbmctPmNtZF9oYXNoLCAmZGVzY19ub2RlLT5ub2RlLAorCQkJCSBkZXNjLT5jbWQudmFsdWUgJiBDTURfSEFTSF9NQVNLKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW5pX2hhc2hfdGFibGUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCXN0cnVjdCBjbWRfbm9kZSAqZGVzY19ub2RlOworCWludCBpOworCisJaGFzaF9mb3JfZWFjaF9zYWZlKHJpbmctPmNtZF9oYXNoLCBpLCB0bXAsIGRlc2Nfbm9kZSwgbm9kZSkgeworCQloYXNoX2RlbCgmZGVzY19ub2RlLT5ub2RlKTsKKwkJa2ZyZWUoZGVzY19ub2RlKTsKKwl9CiB9CiAKIC8qKgpAQCAtMTkwLDI1ICs2MjYsNzQgQEAKICAqIEByaW5nOiB0aGUgcmluZ2J1ZmZlciB0byBpbml0aWFsaXplCiAgKgogICogT3B0aW9uYWxseSBpbml0aWFsaXplcyBmaWVsZHMgcmVsYXRlZCB0byBiYXRjaCBidWZmZXIgY29tbWFuZCBwYXJzaW5nIGluIHRoZQotICogc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHBsYXRmb3JtIHJlcXVpcmVzIHNvZnR3YXJlCisgKiBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHBsYXRmb3JtIHJlcXVpcmVzIHNvZnR3YXJlCiAgKiBjb21tYW5kIHBhcnNpbmcuCisgKgorICogUmV0dXJuOiBub24temVybyBpZiBpbml0aWFsaXphdGlvbiBmYWlscwogICovCi12b2lkIGk5MTVfY21kX3BhcnNlcl9pbml0X3Jpbmcoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraW50IGk5MTVfY21kX3BhcnNlcl9pbml0X3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKKwljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX3RhYmxlICpjbWRfdGFibGVzOworCWludCBjbWRfdGFibGVfY291bnQ7CisJaW50IHJldDsKKwogCWlmICghSVNfR0VONyhyaW5nLT5kZXYpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJc3dpdGNoIChyaW5nLT5pZCkgewogCWNhc2UgUkNTOgorCQlpZiAoSVNfSEFTV0VMTChyaW5nLT5kZXYpKSB7CisJCQljbWRfdGFibGVzID0gaHN3X3JlbmRlcl9yaW5nX2NtZHM7CisJCQljbWRfdGFibGVfY291bnQgPQorCQkJCUFSUkFZX1NJWkUoaHN3X3JlbmRlcl9yaW5nX2NtZHMpOworCQl9IGVsc2UgeworCQkJY21kX3RhYmxlcyA9IGdlbjdfcmVuZGVyX2NtZHM7CisJCQljbWRfdGFibGVfY291bnQgPSBBUlJBWV9TSVpFKGdlbjdfcmVuZGVyX2NtZHMpOworCQl9CisKKwkJcmluZy0+cmVnX3RhYmxlID0gZ2VuN19yZW5kZXJfcmVnczsKKwkJcmluZy0+cmVnX2NvdW50ID0gQVJSQVlfU0laRShnZW43X3JlbmRlcl9yZWdzKTsKKworCQlpZiAoSVNfSEFTV0VMTChyaW5nLT5kZXYpKSB7CisJCQlyaW5nLT5tYXN0ZXJfcmVnX3RhYmxlID0gaHN3X21hc3Rlcl9yZWdzOworCQkJcmluZy0+bWFzdGVyX3JlZ19jb3VudCA9IEFSUkFZX1NJWkUoaHN3X21hc3Rlcl9yZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXJpbmctPm1hc3Rlcl9yZWdfdGFibGUgPSBpdmJfbWFzdGVyX3JlZ3M7CisJCQlyaW5nLT5tYXN0ZXJfcmVnX2NvdW50ID0gQVJSQVlfU0laRShpdmJfbWFzdGVyX3JlZ3MpOworCQl9CisKIAkJcmluZy0+Z2V0X2NtZF9sZW5ndGhfbWFzayA9IGdlbjdfcmVuZGVyX2dldF9jbWRfbGVuZ3RoX21hc2s7CiAJCWJyZWFrOwogCWNhc2UgVkNTOgorCQljbWRfdGFibGVzID0gZ2VuN192aWRlb19jbWRzOworCQljbWRfdGFibGVfY291bnQgPSBBUlJBWV9TSVpFKGdlbjdfdmlkZW9fY21kcyk7CiAJCXJpbmctPmdldF9jbWRfbGVuZ3RoX21hc2sgPSBnZW43X2JzZF9nZXRfY21kX2xlbmd0aF9tYXNrOwogCQlicmVhazsKIAljYXNlIEJDUzoKKwkJaWYgKElTX0hBU1dFTEwocmluZy0+ZGV2KSkgeworCQkJY21kX3RhYmxlcyA9IGhzd19ibHRfcmluZ19jbWRzOworCQkJY21kX3RhYmxlX2NvdW50ID0gQVJSQVlfU0laRShoc3dfYmx0X3JpbmdfY21kcyk7CisJCX0gZWxzZSB7CisJCQljbWRfdGFibGVzID0gZ2VuN19ibHRfY21kczsKKwkJCWNtZF90YWJsZV9jb3VudCA9IEFSUkFZX1NJWkUoZ2VuN19ibHRfY21kcyk7CisJCX0KKworCQlyaW5nLT5yZWdfdGFibGUgPSBnZW43X2JsdF9yZWdzOworCQlyaW5nLT5yZWdfY291bnQgPSBBUlJBWV9TSVpFKGdlbjdfYmx0X3JlZ3MpOworCisJCWlmIChJU19IQVNXRUxMKHJpbmctPmRldikpIHsKKwkJCXJpbmctPm1hc3Rlcl9yZWdfdGFibGUgPSBoc3dfbWFzdGVyX3JlZ3M7CisJCQlyaW5nLT5tYXN0ZXJfcmVnX2NvdW50ID0gQVJSQVlfU0laRShoc3dfbWFzdGVyX3JlZ3MpOworCQl9IGVsc2UgeworCQkJcmluZy0+bWFzdGVyX3JlZ190YWJsZSA9IGl2Yl9tYXN0ZXJfcmVnczsKKwkJCXJpbmctPm1hc3Rlcl9yZWdfY291bnQgPSBBUlJBWV9TSVpFKGl2Yl9tYXN0ZXJfcmVncyk7CisJCX0KKwogCQlyaW5nLT5nZXRfY21kX2xlbmd0aF9tYXNrID0gZ2VuN19ibHRfZ2V0X2NtZF9sZW5ndGhfbWFzazsKIAkJYnJlYWs7CiAJY2FzZSBWRUNTOgorCQljbWRfdGFibGVzID0gaHN3X3ZlYm94X2NtZHM7CisJCWNtZF90YWJsZV9jb3VudCA9IEFSUkFZX1NJWkUoaHN3X3ZlYm94X2NtZHMpOwogCQkvKiBWRUNTIGNhbiB1c2UgdGhlIHNhbWUgbGVuZ3RoX21hc2sgZnVuY3Rpb24gYXMgVkNTICovCiAJCXJpbmctPmdldF9jbWRfbGVuZ3RoX21hc2sgPSBnZW43X2JzZF9nZXRfY21kX2xlbmd0aF9tYXNrOwogCQlicmVhazsKQEAgLTIxOCwxOCArNzAzLDQ1IEBACiAJCUJVRygpOwogCX0KIAotCXZhbGlkYXRlX2NtZHNfc29ydGVkKHJpbmcpOwotCXZhbGlkYXRlX3JlZ3Nfc29ydGVkKHJpbmcpOworCUJVR19PTighdmFsaWRhdGVfY21kc19zb3J0ZWQocmluZywgY21kX3RhYmxlcywgY21kX3RhYmxlX2NvdW50KSk7CisJQlVHX09OKCF2YWxpZGF0ZV9yZWdzX3NvcnRlZChyaW5nKSk7CisKKwlyZXQgPSBpbml0X2hhc2hfdGFibGUocmluZywgY21kX3RhYmxlcywgY21kX3RhYmxlX2NvdW50KTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiQ01EOiBjbWRfcGFyc2VyX2luaXQgZmFpbGVkIVxuIik7CisJCWZpbmlfaGFzaF90YWJsZShyaW5nKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyaW5nLT5uZWVkc19jbWRfcGFyc2VyID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGk5MTVfY21kX3BhcnNlcl9maW5pX3JpbmcoKSAtIGNsZWFuIHVwIGNtZCBwYXJzZXIgcmVsYXRlZCBmaWVsZHMKKyAqIEByaW5nOiB0aGUgcmluZ2J1ZmZlciB0byBjbGVhbiB1cAorICoKKyAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgcmVsYXRlZCB0byBjb21tYW5kIHBhcnNpbmcgdGhhdCBtYXkgaGF2ZSBiZWVuCisgKiBpbml0aWFsaXplZCBmb3IgdGhlIHNwZWNpZmllZCByaW5nLgorICovCit2b2lkIGk5MTVfY21kX3BhcnNlcl9maW5pX3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKK3sKKwlpZiAoIXJpbmctPm5lZWRzX2NtZF9wYXJzZXIpCisJCXJldHVybjsKKworCWZpbmlfaGFzaF90YWJsZShyaW5nKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvcioKLWZpbmRfY21kX2luX3RhYmxlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgKnRhYmxlLAorZmluZF9jbWRfaW5fdGFibGUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJICB1MzIgY21kX2hlYWRlcikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKmRlc2Nfbm9kZTsKIAotCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+Y291bnQ7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2MgPSAmdGFibGUtPnRhYmxlW2ldOworCWhhc2hfZm9yX2VhY2hfcG9zc2libGUocmluZy0+Y21kX2hhc2gsIGRlc2Nfbm9kZSwgbm9kZSwKKwkJCSAgICAgICBjbWRfaGVhZGVyICYgQ01EX0hBU0hfTUFTSykgeworCQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2MgPSBkZXNjX25vZGUtPmRlc2M7CiAJCXUzMiBtYXNrZWRfY21kID0gZGVzYy0+Y21kLm1hc2sgJiBjbWRfaGVhZGVyOwogCQl1MzIgbWFza2VkX3ZhbHVlID0gZGVzYy0+Y21kLnZhbHVlICYgZGVzYy0+Y21kLm1hc2s7CiAKQEAgLTI0OSwyMCArNzYxLDE2IEBACiAgKiByaW5nJ3MgZGVmYXVsdCBsZW5ndGggZW5jb2RpbmcgYW5kIHJldHVybnMgZGVmYXVsdF9kZXNjLgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2NtZF9kZXNjcmlwdG9yKgotZmluZF9jbWQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorZmluZF9jbWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkgdTMyIGNtZF9oZWFkZXIsCiAJIHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciAqZGVmYXVsdF9kZXNjKQogeworCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciAqZGVzYzsKIAl1MzIgbWFzazsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCByaW5nLT5jbWRfdGFibGVfY291bnQ7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2M7Ci0KLQkJZGVzYyA9IGZpbmRfY21kX2luX3RhYmxlKCZyaW5nLT5jbWRfdGFibGVzW2ldLCBjbWRfaGVhZGVyKTsKLQkJaWYgKGRlc2MpCi0JCQlyZXR1cm4gZGVzYzsKLQl9CisJZGVzYyA9IGZpbmRfY21kX2luX3RhYmxlKHJpbmcsIGNtZF9oZWFkZXIpOworCWlmIChkZXNjKQorCQlyZXR1cm4gZGVzYzsKIAogCW1hc2sgPSByaW5nLT5nZXRfY21kX2xlbmd0aF9tYXNrKGNtZF9oZWFkZXIpOwogCWlmICghbWFzaykKQEAgLTMyOSwxNSArODM3LDExMiBAQAogICoKICAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcmluZyByZXF1aXJlcyBzb2Z0d2FyZSBjb21tYW5kIHBhcnNpbmcKICAqLwotYm9vbCBpOTE1X25lZWRzX2NtZF9wYXJzZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorYm9vbCBpOTE1X25lZWRzX2NtZF9wYXJzZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQkvKiBObyBjb21tYW5kIHRhYmxlcyBpbmRpY2F0ZXMgYSBwbGF0Zm9ybSB3aXRob3V0IHBhcnNpbmcgKi8KLQlpZiAoIXJpbmctPmNtZF90YWJsZXMpCisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghcmluZy0+bmVlZHNfY21kX3BhcnNlcikKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBYWFg6IFZMViBpcyBHZW43IGFuZCB0aGVyZWZvcmUgaGFzIGNtZF90YWJsZXMsIGJ1dCBoYXMgUFBHVFQKKwkgKiBkaXNhYmxlZC4gVGhhdCB3aWxsIGNhdXNlIGFsbCBvZiB0aGUgcGFyc2VyJ3MgUFBHVFQgY2hlY2tzIHRvCisJICogZmFpbC4gRm9yIG5vdywgZGlzYWJsZSBwYXJzaW5nIHdoZW4gUFBHVFQgaXMgb2ZmLgorCSAqLworCWlmICghZGV2X3ByaXYtPm1tLmFsaWFzaW5nX3BwZ3R0KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gKGk5MTUuZW5hYmxlX2NtZF9wYXJzZXIgPT0gMSk7CiB9CiAKK3N0YXRpYyBib29sIGNoZWNrX2NtZChjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2MsCisJCSAgICAgIGNvbnN0IHUzMiAqY21kLAorCQkgICAgICBjb25zdCBib29sIGlzX21hc3RlciwKKwkJICAgICAgYm9vbCAqb2Fjb250cm9sX3NldCkKK3sKKwlpZiAoZGVzYy0+ZmxhZ3MgJiBDTURfREVTQ19SRUpFQ1QpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiQ01EOiBSZWplY3RlZCBjb21tYW5kOiAweCUwOFhcbiIsICpjbWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKChkZXNjLT5mbGFncyAmIENNRF9ERVNDX01BU1RFUikgJiYgIWlzX21hc3RlcikgeworCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IFJlamVjdGVkIG1hc3Rlci1vbmx5IGNvbW1hbmQ6IDB4JTA4WFxuIiwKKwkJCQkgKmNtZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoZGVzYy0+ZmxhZ3MgJiBDTURfREVTQ19SRUdJU1RFUikgeworCQl1MzIgcmVnX2FkZHIgPSBjbWRbZGVzYy0+cmVnLm9mZnNldF0gJiBkZXNjLT5yZWcubWFzazsKKworCQkvKgorCQkgKiBPQUNPTlRST0wgcmVxdWlyZXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB3cml0ZXMuIFdlCisJCSAqIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYW55IGJhdGNoIHdoaWNoIGVuYWJsZXMgT0EgYWxzbworCQkgKiBkaXNhYmxlcyBpdCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYmF0Y2guIFRoZSBnb2FsIGlzIHRvCisJCSAqIHByZXZlbnQgb25lIHByb2Nlc3MgZnJvbSBzbm9vcGluZyBvbiB0aGUgcGVyZiBkYXRhIGZyb20KKwkJICogYW5vdGhlciBwcm9jZXNzLiBUbyBkbyB0aGF0LCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZQorCQkgKiB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIuIEhlbmNlLCBsaW1pdAorCQkgKiBPQUNPTlRST0wgd3JpdGVzIHRvIG9ubHkgTUlfTE9BRF9SRUdJU1RFUl9JTU0gY29tbWFuZHMuCisJCSAqLworCQlpZiAocmVnX2FkZHIgPT0gT0FDT05UUk9MKSB7CisJCQlpZiAoZGVzYy0+Y21kLnZhbHVlID09IE1JX0xPQURfUkVHSVNURVJfTUVNKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaWYgKGRlc2MtPmNtZC52YWx1ZSA9PSBNSV9MT0FEX1JFR0lTVEVSX0lNTSgxKSkKKwkJCQkqb2Fjb250cm9sX3NldCA9IChjbWRbMl0gIT0gMCk7CisJCX0KKworCQlpZiAoIXZhbGlkX3JlZyhyaW5nLT5yZWdfdGFibGUsCisJCQkgICAgICAgcmluZy0+cmVnX2NvdW50LCByZWdfYWRkcikpIHsKKwkJCWlmICghaXNfbWFzdGVyIHx8CisJCQkgICAgIXZhbGlkX3JlZyhyaW5nLT5tYXN0ZXJfcmVnX3RhYmxlLAorCQkJCSAgICAgICByaW5nLT5tYXN0ZXJfcmVnX2NvdW50LAorCQkJCSAgICAgICByZWdfYWRkcikpIHsKKwkJCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IFJlamVjdGVkIHJlZ2lzdGVyIDB4JTA4WCBpbiBjb21tYW5kOiAweCUwOFggKHJpbmc9JWQpXG4iLAorCQkJCQkJIHJlZ19hZGRyLAorCQkJCQkJICpjbWQsCisJCQkJCQkgcmluZy0+aWQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkZXNjLT5mbGFncyAmIENNRF9ERVNDX0JJVE1BU0spIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DTURfREVTQ19CSVRNQVNLUzsgaSsrKSB7CisJCQl1MzIgZHdvcmQ7CisKKwkJCWlmIChkZXNjLT5iaXRzW2ldLm1hc2sgPT0gMCkKKwkJCQlicmVhazsKKworCQkJaWYgKGRlc2MtPmJpdHNbaV0uY29uZGl0aW9uX21hc2sgIT0gMCkgeworCQkJCXUzMiBvZmZzZXQgPQorCQkJCQlkZXNjLT5iaXRzW2ldLmNvbmRpdGlvbl9vZmZzZXQ7CisJCQkJdTMyIGNvbmRpdGlvbiA9IGNtZFtvZmZzZXRdICYKKwkJCQkJZGVzYy0+Yml0c1tpXS5jb25kaXRpb25fbWFzazsKKworCQkJCWlmIChjb25kaXRpb24gPT0gMCkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCWR3b3JkID0gY21kW2Rlc2MtPmJpdHNbaV0ub2Zmc2V0XSAmCisJCQkJZGVzYy0+Yml0c1tpXS5tYXNrOworCisJCQlpZiAoZHdvcmQgIT0gZGVzYy0+Yml0c1tpXS5leHBlY3RlZCkgeworCQkJCURSTV9ERUJVR19EUklWRVIoIkNNRDogUmVqZWN0ZWQgY29tbWFuZCAweCUwOFggZm9yIGJpdG1hc2sgMHglMDhYIChleHA9MHglMDhYIGFjdD0weCUwOFgpIChyaW5nPSVkKVxuIiwKKwkJCQkJCSAqY21kLAorCQkJCQkJIGRlc2MtPmJpdHNbaV0ubWFzaywKKwkJCQkJCSBkZXNjLT5iaXRzW2ldLmV4cGVjdGVkLAorCQkJCQkJIGR3b3JkLCByaW5nLT5pZCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKICNkZWZpbmUgTEVOR1RIX0JJQVMgMgogCiAvKioKQEAgLTM1Miw3ICs5NTcsNyBAQAogICoKICAqIFJldHVybjogbm9uLXplcm8gaWYgdGhlIHBhcnNlciBmaW5kcyB2aW9sYXRpb25zIG9yIG90aGVyd2lzZSBmYWlscwogICovCi1pbnQgaTkxNV9wYXJzZV9jbWRzKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2ludCBpOTE1X3BhcnNlX2NtZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpiYXRjaF9vYmosCiAJCSAgICB1MzIgYmF0Y2hfc3RhcnRfb2Zmc2V0LAogCQkgICAgYm9vbCBpc19tYXN0ZXIpCkBAIC0zNjEsNiArOTY2LDcgQEAKIAl1MzIgKmNtZCwgKmJhdGNoX2Jhc2UsICpiYXRjaF9lbmQ7CiAJc3RydWN0IGRybV9pOTE1X2NtZF9kZXNjcmlwdG9yIGRlZmF1bHRfZGVzYyA9IHsgMCB9OwogCWludCBuZWVkc19jbGZsdXNoID0gMDsKKwlib29sIG9hY29udHJvbF9zZXQgPSBmYWxzZTsgLyogT0FDT05UUk9MIHRyYWNraW5nLiBTZWUgY2hlY2tfY21kKCkgKi8KIAogCXJldCA9IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3JlYWQoYmF0Y2hfb2JqLCAmbmVlZHNfY2xmbHVzaCk7CiAJaWYgKHJldCkgewpAQCAtNDAyLDc2ICsxMDA4LDI3IEBACiAJCQlsZW5ndGggPSAoKCpjbWQgJiBkZXNjLT5sZW5ndGgubWFzaykgKyBMRU5HVEhfQklBUyk7CiAKIAkJaWYgKChiYXRjaF9lbmQgLSBjbWQpIDwgbGVuZ3RoKSB7Ci0JCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IENvbW1hbmQgbGVuZ3RoIGV4Y2VlZHMgYmF0Y2ggbGVuZ3RoOiAweCUwOFggbGVuZ3RoPSVkIGJhdGNobGVuPSV0ZFxuIiwKKwkJCURSTV9ERUJVR19EUklWRVIoIkNNRDogQ29tbWFuZCBsZW5ndGggZXhjZWVkcyBiYXRjaCBsZW5ndGg6IDB4JTA4WCBsZW5ndGg9JXUgYmF0Y2hsZW49JXRkXG4iLAogCQkJCQkgKmNtZCwKIAkJCQkJIGxlbmd0aCwKLQkJCQkJICh1bnNpZ25lZCBsb25nKShiYXRjaF9lbmQgLSBjbWQpKTsKKwkJCQkJIGJhdGNoX2VuZCAtIGNtZCk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoZGVzYy0+ZmxhZ3MgJiBDTURfREVTQ19SRUpFQ1QpIHsKLQkJCURSTV9ERUJVR19EUklWRVIoIkNNRDogUmVqZWN0ZWQgY29tbWFuZDogMHglMDhYXG4iLCAqY21kKTsKKwkJaWYgKCFjaGVja19jbWQocmluZywgZGVzYywgY21kLCBpc19tYXN0ZXIsICZvYWNvbnRyb2xfc2V0KSkgewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKChkZXNjLT5mbGFncyAmIENNRF9ERVNDX01BU1RFUikgJiYgIWlzX21hc3RlcikgewotCQkJRFJNX0RFQlVHX0RSSVZFUigiQ01EOiBSZWplY3RlZCBtYXN0ZXItb25seSBjb21tYW5kOiAweCUwOFhcbiIsCi0JCQkJCSAqY21kKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChkZXNjLT5mbGFncyAmIENNRF9ERVNDX1JFR0lTVEVSKSB7Ci0JCQl1MzIgcmVnX2FkZHIgPSBjbWRbZGVzYy0+cmVnLm9mZnNldF0gJiBkZXNjLT5yZWcubWFzazsKLQotCQkJaWYgKCF2YWxpZF9yZWcocmluZy0+cmVnX3RhYmxlLAotCQkJCSAgICAgICByaW5nLT5yZWdfY291bnQsIHJlZ19hZGRyKSkgewotCQkJCWlmICghaXNfbWFzdGVyIHx8Ci0JCQkJICAgICF2YWxpZF9yZWcocmluZy0+bWFzdGVyX3JlZ190YWJsZSwKLQkJCQkJICAgICAgIHJpbmctPm1hc3Rlcl9yZWdfY291bnQsCi0JCQkJCSAgICAgICByZWdfYWRkcikpIHsKLQkJCQkJRFJNX0RFQlVHX0RSSVZFUigiQ01EOiBSZWplY3RlZCByZWdpc3RlciAweCUwOFggaW4gY29tbWFuZDogMHglMDhYIChyaW5nPSVkKVxuIiwKLQkJCQkJCQkgcmVnX2FkZHIsCi0JCQkJCQkJICpjbWQsCi0JCQkJCQkJIHJpbmctPmlkKTsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlc2MtPmZsYWdzICYgQ01EX0RFU0NfQklUTUFTSykgewotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ01EX0RFU0NfQklUTUFTS1M7IGkrKykgewotCQkJCXUzMiBkd29yZDsKLQotCQkJCWlmIChkZXNjLT5iaXRzW2ldLm1hc2sgPT0gMCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkd29yZCA9IGNtZFtkZXNjLT5iaXRzW2ldLm9mZnNldF0gJgotCQkJCQlkZXNjLT5iaXRzW2ldLm1hc2s7Ci0KLQkJCQlpZiAoZHdvcmQgIT0gZGVzYy0+Yml0c1tpXS5leHBlY3RlZCkgewotCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IFJlamVjdGVkIGNvbW1hbmQgMHglMDhYIGZvciBiaXRtYXNrIDB4JTA4WCAoZXhwPTB4JTA4WCBhY3Q9MHglMDhYKSAocmluZz0lZClcbiIsCi0JCQkJCQkJICpjbWQsCi0JCQkJCQkJIGRlc2MtPmJpdHNbaV0ubWFzaywKLQkJCQkJCQkgZGVzYy0+Yml0c1tpXS5leHBlY3RlZCwKLQkJCQkJCQkgZHdvcmQsIHJpbmctPmlkKTsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQl9Ci0KIAkJY21kICs9IGxlbmd0aDsKIAl9CiAKKwlpZiAob2Fjb250cm9sX3NldCkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IGJhdGNoIHNldCBPQUNPTlRST0wgYnV0IGRpZCBub3QgY2xlYXIgaXRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwogCWlmIChjbWQgPj0gYmF0Y2hfZW5kKSB7CiAJCURSTV9ERUJVR19EUklWRVIoIkNNRDogR290IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3L28gYSBCQkUgY21kIVxuIik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC00ODMsMyArMTA0MCwyMiBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBpOTE1X2NtZF9wYXJzZXJfZ2V0X3ZlcnNpb24oKSAtIGdldCB0aGUgY21kIHBhcnNlciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFRoZSBjbWQgcGFyc2VyIG1haW50YWlucyBhIHNpbXBsZSBpbmNyZWFzaW5nIGludGVnZXIgdmVyc2lvbiBudW1iZXIgc3VpdGFibGUKKyAqIGZvciBwYXNzaW5nIHRvIHVzZXJzcGFjZSBjbGllbnRzIHRvIGRldGVybWluZSB3aGF0IG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKyAqCisgKiBSZXR1cm46IHRoZSBjdXJyZW50IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjbWQgcGFyc2VyCisgKi8KK2ludCBpOTE1X2NtZF9wYXJzZXJfZ2V0X3ZlcnNpb24odm9pZCkKK3sKKwkvKgorCSAqIENvbW1hbmQgcGFyc2VyIHZlcnNpb24gaGlzdG9yeQorCSAqCisJICogMS4gSW5pdGlhbCB2ZXJzaW9uLiBDaGVja3MgYmF0Y2hlcyBhbmQgcmVwb3J0cyB2aW9sYXRpb25zLCBidXQgbGVhdmVzCisJICogICAgaGFyZHdhcmUgcGFyc2luZyBlbmFibGVkIChzbyBkb2VzIG5vdCBhbGxvdyBuZXcgdXNlIGNhc2VzKS4KKwkgKi8KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKaW5kZXggMTk1ZmU1Yi4uNjAxY2FhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAogc3RhdGljIGludCBpOTE1X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvICppbmZvID0gSU5URUxfSU5GTyhkZXYpOwogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAkJc2VxX3ByaW50ZihtLCAiICglcykiLCBvYmotPnJpbmctPm5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBkZXNjcmliZV9jdHgoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBkZXNjcmliZV9jdHgoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4KQogewogCXNlcV9wdXRjKG0sIGN0eC0+aXNfaW5pdGlhbGl6ZWQgPyAnSScgOiAnaScpOwogCXNlcV9wdXRjKG0sIGN0eC0+cmVtYXBfc2xpY2UgPyAnUicgOiAncicpOwpAQCAtMTgxLDcgKzE4MSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2xpc3RfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJdWludHB0cl90IGxpc3QgPSAodWludHB0cl90KSBub2RlLT5pbmZvX2VudC0+ZGF0YTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwpAQCAtMjM5LDcgKzIzOSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fc3RvbGVuX2xpc3RfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwpAQCAtMzcxLDcgKzM3MSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkKiBkYXRhKQogewotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGNvdW50LCBtYXBwYWJsZV9jb3VudCwgcHVyZ2VhYmxlX2NvdW50OwpAQCAtNDc0LDcgKzQ3NCw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fZ3R0X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXVpbnRwdHJfdCBsaXN0ID0gKHVpbnRwdHJfdCkgbm9kZS0+aW5mb19lbnQtPmRhdGE7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTUwOSwxMiArNTA5LDEyIEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fcGFnZWZsaXBfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQljb25zdCBjaGFyIHBpcGUgPSBwaXBlX25hbWUoY3J0Yy0+cGlwZSk7CiAJCWNvbnN0IGNoYXIgcGxhbmUgPSBwbGFuZV9uYW1lKGNydGMtPnBsYW5lKTsKIAkJc3RydWN0IGludGVsX3VucGluX3dvcmsgKndvcms7CkBAIC01NTksMTAgKzU1OSwxMCBAQAogCiBzdGF0aWMgaW50IGk5MTVfZ2VtX3JlcXVlc3RfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKmdlbV9yZXF1ZXN0OwogCWludCByZXQsIGNvdW50LCBpOwogCkBAIC01OTQsNyArNTk0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9yaW5nX3NlcW5vX2luZm8oc3RydWN0IHNlcV9maWxlICptLAotCQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQkJIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJaWYgKHJpbmctPmdldF9zZXFubykgewogCQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IHNlcXVlbmNlICglcyk6ICV1XG4iLApAQCAtNjA0LDEwICs2MDQsMTAgQEAKIAogc3RhdGljIGludCBpOTE1X2dlbV9zZXFub19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCByZXQsIGk7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTYyNywxMCArNjI3LDEwIEBACiAKIHN0YXRpYyBpbnQgaTkxNV9pbnRlcnJ1cHRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlpbnQgcmV0LCBpLCBwaXBlOwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC02MzgsNyArNjM4LDQ3IEBACiAJCXJldHVybiByZXQ7CiAJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpIHsKKwlpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCWludCBpOworCQlzZXFfcHJpbnRmKG0sICJNYXN0ZXIgSW50ZXJydXB0IENvbnRyb2w6XHQlMDh4XG4iLAorCQkJICAgSTkxNV9SRUFEKEdFTjhfTUFTVEVSX0lSUSkpOworCisJCXNlcV9wcmludGYobSwgIkRpc3BsYXkgSUVSOlx0JTA4eFxuIiwKKwkJCSAgIEk5MTVfUkVBRChWTFZfSUVSKSk7CisJCXNlcV9wcmludGYobSwgIkRpc3BsYXkgSUlSOlx0JTA4eFxuIiwKKwkJCSAgIEk5MTVfUkVBRChWTFZfSUlSKSk7CisJCXNlcV9wcmludGYobSwgIkRpc3BsYXkgSUlSX1JXOlx0JTA4eFxuIiwKKwkJCSAgIEk5MTVfUkVBRChWTFZfSUlSX1JXKSk7CisJCXNlcV9wcmludGYobSwgIkRpc3BsYXkgSU1SOlx0JTA4eFxuIiwKKwkJCSAgIEk5MTVfUkVBRChWTFZfSU1SKSk7CisJCWZvcl9lYWNoX3BpcGUocGlwZSkKKwkJCXNlcV9wcmludGYobSwgIlBpcGUgJWMgc3RhdDpcdCUwOHhcbiIsCisJCQkJICAgcGlwZV9uYW1lKHBpcGUpLAorCQkJCSAgIEk5MTVfUkVBRChQSVBFU1RBVChwaXBlKSkpOworCisJCXNlcV9wcmludGYobSwgIlBvcnQgaG90cGx1ZzpcdCUwOHhcbiIsCisJCQkgICBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX0VOKSk7CisJCXNlcV9wcmludGYobSwgIkRQRkxJUFNUQVQ6XHQlMDh4XG4iLAorCQkJICAgSTkxNV9SRUFEKFZMVl9EUEZMSVBTVEFUKSk7CisJCXNlcV9wcmludGYobSwgIkRQSU5WR1RUOlx0JTA4eFxuIiwKKwkJCSAgIEk5MTVfUkVBRChEUElOVkdUVCkpOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXNlcV9wcmludGYobSwgIkdUIEludGVycnVwdCBJTVIgJWQ6XHQlMDh4XG4iLAorCQkJCSAgIGksIEk5MTVfUkVBRChHRU44X0dUX0lNUihpKSkpOworCQkJc2VxX3ByaW50ZihtLCAiR1QgSW50ZXJydXB0IElJUiAlZDpcdCUwOHhcbiIsCisJCQkJICAgaSwgSTkxNV9SRUFEKEdFTjhfR1RfSUlSKGkpKSk7CisJCQlzZXFfcHJpbnRmKG0sICJHVCBJbnRlcnJ1cHQgSUVSICVkOlx0JTA4eFxuIiwKKwkJCQkgICBpLCBJOTE1X1JFQUQoR0VOOF9HVF9JRVIoaSkpKTsKKwkJfQorCisJCXNlcV9wcmludGYobSwgIlBDVSBpbnRlcnJ1cHQgbWFzazpcdCUwOHhcbiIsCisJCQkgICBJOTE1X1JFQUQoR0VOOF9QQ1VfSU1SKSk7CisJCXNlcV9wcmludGYobSwgIlBDVSBpbnRlcnJ1cHQgaWRlbnRpdHk6XHQlMDh4XG4iLAorCQkJICAgSTkxNV9SRUFEKEdFTjhfUENVX0lJUikpOworCQlzZXFfcHJpbnRmKG0sICJQQ1UgaW50ZXJydXB0IGVuYWJsZTpcdCUwOHhcbiIsCisJCQkgICBJOTE1X1JFQUQoR0VOOF9QQ1VfSUVSKSk7CisJfSBlbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KSB7CiAJCXNlcV9wcmludGYobSwgIk1hc3RlciBJbnRlcnJ1cHQgQ29udHJvbDpcdCUwOHhcbiIsCiAJCQkgICBJOTE1X1JFQUQoR0VOOF9NQVNURVJfSVJRKSk7CiAKQEAgLTc2OCw3ICs4MDgsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfZ2VtX2ZlbmNlX3JlZ3NfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgcmV0OwpAQCAtNzk3LDEwICs4MzcsMTAgQEAKIAogc3RhdGljIGludCBpOTE1X2h3c19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWNvbnN0IHUzMiAqaHdzOwogCWludCBpOwogCkBAIC05NDUsNyArOTg1LDcgQEAKIAogc3RhdGljIGludCBpOTE1X3JzdGRieV9kZWxheXMoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MTYgY3JzdGFuZGRlbGF5OwpAQCAtOTY2LDkgKzEwMDYsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfY3VyX2RlbGF5aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgaTkxNV9mcmVxdWVuY3lfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSAwOwpAQCAtOTkxLDYgKzEwMzEsNyBAQAogCQl1MzIgZ3RfcGVyZl9zdGF0dXMgPSBJOTE1X1JFQUQoR0VONl9HVF9QRVJGX1NUQVRVUyk7CiAJCXUzMiBycF9zdGF0ZV9saW1pdHMgPSBJOTE1X1JFQUQoR0VONl9SUF9TVEFURV9MSU1JVFMpOwogCQl1MzIgcnBfc3RhdGVfY2FwID0gSTkxNV9SRUFEKEdFTjZfUlBfU1RBVEVfQ0FQKTsKKwkJdTMyIHJwbW9kZWN0bCwgcnBpbmNsaW1pdCwgcnBkZWNsaW1pdDsKIAkJdTMyIHJwc3RhdCwgY2FnZiwgcmVxZjsKIAkJdTMyIHJwdXBlaSwgcnBjdXJ1cCwgcnBwcmV2dXA7CiAJCXUzMiBycGRvd25laSwgcnBjdXJkb3duLCBycHByZXZkb3duOwpAQCAtMTAxMSw2ICsxMDUyLDEwIEBACiAJCQlyZXFmID4+PSAyNTsKIAkJcmVxZiAqPSBHVF9GUkVRVUVOQ1lfTVVMVElQTElFUjsKIAorCQlycG1vZGVjdGwgPSBJOTE1X1JFQUQoR0VONl9SUF9DT05UUk9MKTsKKwkJcnBpbmNsaW1pdCA9IEk5MTVfUkVBRChHRU42X1JQX1VQX1RIUkVTSE9MRCk7CisJCXJwZGVjbGltaXQgPSBJOTE1X1JFQUQoR0VONl9SUF9ET1dOX1RIUkVTSE9MRCk7CisKIAkJcnBzdGF0ID0gSTkxNV9SRUFEKEdFTjZfUlBTVEFUMSk7CiAJCXJwdXBlaSA9IEk5MTVfUkVBRChHRU42X1JQX0NVUl9VUF9FSSk7CiAJCXJwY3VydXAgPSBJOTE1X1JFQUQoR0VONl9SUF9DVVJfVVApOwpAQCAtMTAyNywxNCArMTA3MiwyMyBAQAogCQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKKwkJc2VxX3ByaW50ZihtLCAiUE0gSUVSPTB4JTA4eCBJTVI9MHglMDh4IElTUj0weCUwOHggSUlSPTB4JTA4eCwgTUFTSz0weCUwOHhcbiIsCisJCQkgICBJOTE1X1JFQUQoR0VONl9QTUlFUiksCisJCQkgICBJOTE1X1JFQUQoR0VONl9QTUlNUiksCisJCQkgICBJOTE1X1JFQUQoR0VONl9QTUlTUiksCisJCQkgICBJOTE1X1JFQUQoR0VONl9QTUlJUiksCisJCQkgICBJOTE1X1JFQUQoR0VONl9QTUlOVFJNU0spKTsKIAkJc2VxX3ByaW50ZihtLCAiR1RfUEVSRl9TVEFUVVM6IDB4JTA4eFxuIiwgZ3RfcGVyZl9zdGF0dXMpOwotCQlzZXFfcHJpbnRmKG0sICJSUFNUQVQxOiAweCUwOHhcbiIsIHJwc3RhdCk7CiAJCXNlcV9wcmludGYobSwgIlJlbmRlciBwLXN0YXRlIHJhdGlvOiAlZFxuIiwKIAkJCSAgIChndF9wZXJmX3N0YXR1cyAmIDB4ZmYwMCkgPj4gOCk7CiAJCXNlcV9wcmludGYobSwgIlJlbmRlciBwLXN0YXRlIFZJRDogJWRcbiIsCiAJCQkgICBndF9wZXJmX3N0YXR1cyAmIDB4ZmYpOwogCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcC1zdGF0ZSBsaW1pdDogJWRcbiIsCiAJCQkgICBycF9zdGF0ZV9saW1pdHMgJiAweGZmKTsKKwkJc2VxX3ByaW50ZihtLCAiUlBTVEFUMTogMHglMDh4XG4iLCBycHN0YXQpOworCQlzZXFfcHJpbnRmKG0sICJSUE1PREVDVEw6IDB4JTA4eFxuIiwgcnBtb2RlY3RsKTsKKwkJc2VxX3ByaW50ZihtLCAiUlBJTkNMSU1JVDogMHglMDh4XG4iLCBycGluY2xpbWl0KTsKKwkJc2VxX3ByaW50ZihtLCAiUlBERUNMSU1JVDogMHglMDh4XG4iLCBycGRlY2xpbWl0KTsKIAkJc2VxX3ByaW50ZihtLCAiUlBOU1dSRVE6ICVkTUh6XG4iLCByZXFmKTsKIAkJc2VxX3ByaW50ZihtLCAiQ0FHRjogJWRNSHpcbiIsIGNhZ2YpOwogCQlzZXFfcHJpbnRmKG0sICJSUCBDVVIgVVAgRUk6ICVkdXNcbiIsIHJwdXBlaSAmCkBAIC0xMDk0LDcgKzExNDgsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfZGVsYXlmcmVxX3RhYmxlKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogewotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGRlbGF5ZnJlcTsKQEAgLTExMjUsNyArMTE3OSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9pbnR0b2V4dF90YWJsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBpbnR0b2V4dDsKQEAgLTExNDksNyArMTIwMyw3IEBACiAKIHN0YXRpYyBpbnQgaXJvbmxha2VfZHJwY19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiByZ3Ztb2RlY3RsLCByc3RkYnljdGw7CkBAIC0xMjE5LDE1ICsxMjczLDE5IEBACiBzdGF0aWMgaW50IHZsdl9kcnBjX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewogCi0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcnBtb2RlY3RsMSwgcmNjdGwxOwogCXVuc2lnbmVkIGZ3X3JlbmRlcmNvdW50ID0gMCwgZndfbWVkaWFjb3VudCA9IDA7CiAKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CisKIAlycG1vZGVjdGwxID0gSTkxNV9SRUFEKEdFTjZfUlBfQ09OVFJPTCk7CiAJcmNjdGwxID0gSTkxNV9SRUFEKEdFTjZfUkNfQ09OVFJPTCk7CiAKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisKIAlzZXFfcHJpbnRmKG0sICJWaWRlbyBUdXJibyBNb2RlOiAlc1xuIiwKIAkJICAgeWVzbm8ocnBtb2RlY3RsMSAmIEdFTjZfUlBfTUVESUFfVFVSQk8pKTsKIAlzZXFfcHJpbnRmKG0sICJUdXJibyBlbmFibGVkOiAlc1xuIiwKQEAgLTEyNDcsNiArMTMwNSwxMSBAQAogCQkJKEk5MTVfUkVBRChWTFZfR1RMQ19QV19TVEFUVVMpICYKIAkJCQlWTFZfR1RMQ19QV19NRURJQV9TVEFUVVNfTUFTSykgPyAiVXAiIDogIkRvd24iKTsKIAorCXNlcV9wcmludGYobSwgIlJlbmRlciBSQzYgcmVzaWRlbmN5IHNpbmNlIGJvb3Q6ICV1XG4iLAorCQkgICBJOTE1X1JFQUQoVkxWX0dUX1JFTkRFUl9SQzYpKTsKKwlzZXFfcHJpbnRmKG0sICJNZWRpYSBSQzYgcmVzaWRlbmN5IHNpbmNlIGJvb3Q6ICV1XG4iLAorCQkgICBJOTE1X1JFQUQoVkxWX0dUX01FRElBX1JDNikpOworCiAJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrKTsKIAlmd19yZW5kZXJjb3VudCA9IGRldl9wcml2LT51bmNvcmUuZndfcmVuZGVyY291bnQ7CiAJZndfbWVkaWFjb3VudCA9IGRldl9wcml2LT51bmNvcmUuZndfbWVkaWFjb3VudDsKQEAgLTEyNjMsNyArMTMyNiw3IEBACiBzdGF0aWMgaW50IGdlbjZfZHJwY19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHJwbW9kZWN0bDEsIGd0X2NvcmVfc3RhdHVzLCByY2N0bDEsIHJjNnZpZHMgPSAwOwpAQCAtMTM2Miw3ICsxNDI1LDcgQEAKIAogc3RhdGljIGludCBpOTE1X2RycGNfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAogCWlmIChJU19WQUxMRVlWSUVXKGRldikpCkBAIC0xMzc1LDcgKzE0MzgsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfZmJjX3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xNDM3LDcgKzE1MDAsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfaXBzX3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xNDYwLDcgKzE1MjMsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfc3Jfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogewotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJYm9vbCBzcl9lbmFibGVkID0gZmFsc2U7CkBAIC0xNDg2LDcgKzE1NDksNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfZW1vbl9zdGF0dXMoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIHRlbXAsIGNoaXBzZXQsIGdmeDsKQEAgLTE1MTQsNyArMTU3Nyw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9yaW5nX2ZyZXFfdGFibGUoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTE1NTcsNyArMTYyMCw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZnhlYyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CkBAIC0xNTc3LDcgKzE2NDAsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfb3ByZWdpb24oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfb3ByZWdpb24gKm9wcmVnaW9uID0gJmRldl9wcml2LT5vcHJlZ2lvbjsKQEAgLTE2MDUsNyArMTY2OCw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fZnJhbWVidWZmZXJfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGludGVsX2ZiZGV2ICppZmJkZXYgPSBOVUxMOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqZmI7CkBAIC0xNjUxLDExICsxNzE0LDExIEBACiAKIHN0YXRpYyBpbnQgaTkxNV9jb250ZXh0X3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCWludCByZXQsIGk7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwpAQCAtMTY3NSw2ICsxNzM4LDkgQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJmRldl9wcml2LT5jb250ZXh0X2xpc3QsIGxpbmspIHsKKwkJaWYgKGN0eC0+b2JqID09IE5VTEwpCisJCQljb250aW51ZTsKKwogCQlzZXFfcHV0cyhtLCAiSFcgY29udGV4dCAiKTsKIAkJZGVzY3JpYmVfY3R4KG0sIGN0eCk7CiAJCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpCkBAIC0xNjkyLDcgKzE3NTgsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfZ2VuNl9mb3JjZXdha2VfY291bnRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBmb3JjZXdha2VfY291bnQgPSAwLCBmd19yZW5kZXJjb3VudCA9IDAsIGZ3X21lZGlhY291bnQgPSAwOwpAQCAtMTc0MCw3ICsxODA2LDcgQEAKIAogc3RhdGljIGludCBpOTE1X3N3aXp6bGVfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0OwpAQCAtMTc4OCwxMCArMTg1NCwxNCBAQAogCiBzdGF0aWMgaW50IHBlcl9maWxlX2N0eChpbnQgaWQsIHZvaWQgKnB0ciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHggPSBwdHI7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmN0eCA9IHB0cjsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBkYXRhOwogCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGN0eF90b19wcGd0dChjdHgpOwogCisJaWYgKGk5MTVfZ2VtX2NvbnRleHRfaXNfZGVmYXVsdChjdHgpKQorCQlzZXFfcHV0cyhtLCAiICBkZWZhdWx0IGNvbnRleHQ6XG4iKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIiAgY29udGV4dCAlZDpcbiIsIGN0eC0+aWQpOwogCXBwZ3R0LT5kZWJ1Z19kdW1wKHBwZ3R0LCBtKTsKIAogCXJldHVybiAwOwpAQCAtMTgwMCw3ICsxODcwLDcgQEAKIHN0YXRpYyB2b2lkIGdlbjhfcHBndHRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBkZXZfcHJpdi0+bW0uYWxpYXNpbmdfcHBndHQ7CiAJaW50IHVudXNlZCwgaTsKIApAQCAtMTgxNiw4ICsxODg2LDcgQEAKIAkJCXU2NCBwZHAgPSBJOTE1X1JFQUQocmluZy0+bW1pb19iYXNlICsgb2Zmc2V0ICsgNCk7CiAJCQlwZHAgPDw9IDMyOwogCQkJcGRwIHw9IEk5MTVfUkVBRChyaW5nLT5tbWlvX2Jhc2UgKyBvZmZzZXQpOwotCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJCQlzZXFfcHJpbnRmKG0sICJcdFBEUCVkIDB4JTAxNmxseFxuIiwgaSwgcGRwKTsKKwkJCXNlcV9wcmludGYobSwgIlx0UERQJWQgMHglMDE2bGx4XG4iLCBpLCBwZHApOwogCQl9CiAJfQogfQpAQCAtMTgyNSw3ICsxODk0LDcgQEAKIHN0YXRpYyB2b2lkIGdlbjZfcHBndHRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGU7CiAJaW50IGk7CiAKQEAgLTE4NTIsMTIgKzE5MjEsOSBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGZpbGUsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkgewogCQlzdHJ1Y3QgZHJtX2k5MTVfZmlsZV9wcml2YXRlICpmaWxlX3ByaXYgPSBmaWxlLT5kcml2ZXJfcHJpdjsKLQkJc3RydWN0IGk5MTVfaHdfcHBndHQgKnB2dF9wcGd0dDsKIAotCQlwdnRfcHBndHQgPSBjdHhfdG9fcHBndHQoZmlsZV9wcml2LT5wcml2YXRlX2RlZmF1bHRfY3R4KTsKIAkJc2VxX3ByaW50ZihtLCAicHJvYzogJXNcbiIsCiAJCQkgICBnZXRfcGlkX3Rhc2soZmlsZS0+cGlkLCBQSURUWVBFX1BJRCktPmNvbW0pOwotCQlzZXFfcHV0cyhtLCAiICBkZWZhdWx0IGNvbnRleHQ6XG4iKTsKIAkJaWRyX2Zvcl9lYWNoKCZmaWxlX3ByaXYtPmNvbnRleHRfaWRyLCBwZXJfZmlsZV9jdHgsIG0pOwogCX0KIAlzZXFfcHJpbnRmKG0sICJFQ09DSEs6IDB4JTA4eFxuIiwgSTkxNV9SRUFEKEdBTV9FQ09DSEspKTsKQEAgLTE4NjUsNyArMTkzMSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9wcGd0dF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xODg1LDU2ICsxOTUxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2RwaW9faW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7Ci0KLQotCWlmICghSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0JCXNlcV9wdXRzKG0sICJ1bnN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2X3ByaXYtPmRwaW9fbG9jayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNlcV9wcmludGYobSwgIkRQSU9fQ1RMOiAweCUwOHhcbiIsIEk5MTVfUkVBRChEUElPX0NUTCkpOwotCi0Jc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFczIENIMCA6IDB4JTA4eFxuIiwKLQkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMygwKSkpOwotCXNlcV9wcmludGYobSwgIkRQSU8gUExMIERXMyBDSDE6IDB4JTA4eFxuIiwKLQkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMygxKSkpOwotCi0Jc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFc1IENIMDogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9QTExfRFc1KDApKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFc1IENIMTogMHglMDh4XG4iLAotCQkgICB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBQSVBFX0EsIFZMVl9QTExfRFc1KDEpKSk7Ci0KLQlzZXFfcHJpbnRmKG0sICJEUElPIFBMTCBEVzcgQ0gwOiAweCUwOHhcbiIsCi0JCSAgIHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIFBJUEVfQSwgVkxWX1BMTF9EVzcoMCkpKTsKLQlzZXFfcHJpbnRmKG0sICJEUElPIFBMTCBEVzcgQ0gxOiAweCUwOHhcbiIsCi0JCSAgIHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIFBJUEVfQSwgVkxWX1BMTF9EVzcoMSkpKTsKLQotCXNlcV9wcmludGYobSwgIkRQSU8gUExMIERXMTAgQ0gwOiAweCUwOHhcbiIsCi0JCSAgIHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIFBJUEVfQSwgVkxWX1BMTF9EVzEwKDApKSk7Ci0Jc2VxX3ByaW50ZihtLCAiRFBJTyBQTEwgRFcxMCBDSDE6IDB4JTA4eFxuIiwKLQkJICAgdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgUElQRV9BLCBWTFZfUExMX0RXMTAoMSkpKTsKLQotCXNlcV9wcmludGYobSwgIkRQSU9fRkFTVENMS19ESVNBQkxFOiAweCUwOHhcbiIsCi0JCSAgIHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIFBJUEVfQSwgVkxWX0NNTl9EVzApKTsKLQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpOTE1X2xsYyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMjA0MCwxMSArMjA1OSwxMSBAQAogCiBzdGF0aWMgaW50IGk5MTVfcGM4X3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKCFJU19IQVNXRUxMKGRldikpIHsKKwlpZiAoIUlTX0hBU1dFTEwoZGV2KSAmJiAhSVNfQlJPQURXRUxMKGRldikpIHsKIAkJc2VxX3B1dHMobSwgIm5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMTE1LDcgKzIxMzQsNyBAQAogCiBzdGF0aWMgaW50IGk5MTVfcG93ZXJfZG9tYWluX2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaTkxNV9wb3dlcl9kb21haW5zICpwb3dlcl9kb21haW5zID0gJmRldl9wcml2LT5wb3dlcl9kb21haW5zOwpAQCAtMjE3MCw3ICsyMTg5LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YywKIAkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlcikKIHsKLQlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmaW50ZWxfY3J0Yy0+YmFzZTsKIAlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3I7CkBAIC0yMTc4LDEyICsyMTk3LDEyIEBACiAKIAllbmNvZGVyID0gJmludGVsX2VuY29kZXItPmJhc2U7CiAJc2VxX3ByaW50ZihtLCAiXHRlbmNvZGVyICVkOiB0eXBlOiAlcywgY29ubmVjdG9yczpcbiIsCi0JCSAgIGVuY29kZXItPmJhc2UuaWQsIGRybV9nZXRfZW5jb2Rlcl9uYW1lKGVuY29kZXIpKTsKKwkJICAgZW5jb2Rlci0+YmFzZS5pZCwgZW5jb2Rlci0+bmFtZSk7CiAJZm9yX2VhY2hfY29ubmVjdG9yX29uX2VuY29kZXIoZGV2LCBlbmNvZGVyLCBpbnRlbF9jb25uZWN0b3IpIHsKIAkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZpbnRlbF9jb25uZWN0b3ItPmJhc2U7CiAJCXNlcV9wcmludGYobSwgIlx0XHRjb25uZWN0b3IgJWQ6IHR5cGU6ICVzLCBzdGF0dXM6ICVzIiwKIAkJCSAgIGNvbm5lY3Rvci0+YmFzZS5pZCwKLQkJCSAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwKKwkJCSAgIGNvbm5lY3Rvci0+bmFtZSwKIAkJCSAgIGRybV9nZXRfY29ubmVjdG9yX3N0YXR1c19uYW1lKGNvbm5lY3Rvci0+c3RhdHVzKSk7CiAJCWlmIChjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkgewogCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmY3J0Yy0+bW9kZTsKQEAgLTIxOTcsNyArMjIxNiw3IEBACiAKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjKQogewotCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZpbnRlbF9jcnRjLT5iYXNlOwogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyOwpAQCAtMjI1NCw3ICsyMjczLDcgQEAKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKIAogCXNlcV9wcmludGYobSwgImNvbm5lY3RvciAlZDogdHlwZSAlcywgc3RhdHVzOiAlc1xuIiwKLQkJICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCSAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT5uYW1lLAogCQkgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShjb25uZWN0b3ItPnN0YXR1cykpOwogCWlmIChjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkgewogCQlzZXFfcHJpbnRmKG0sICJcdG5hbWU6ICVzXG4iLCBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5uYW1lKTsKQEAgLTIyODYsMTAgKzIzMDUsOCBAQAogCiAJaWYgKElTXzg0NUcoZGV2KSB8fCBJU19JODY1RyhkZXYpKQogCQlzdGF0ZSA9IEk5MTVfUkVBRChfQ1VSQUNOVFIpICYgQ1VSU09SX0VOQUJMRTsKLQllbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA2IHx8IElTX1ZBTExFWVZJRVcoZGV2KSkKLQkJc3RhdGUgPSBJOTE1X1JFQUQoQ1VSQ05UUihwaXBlKSkgJiBDVVJTT1JfTU9ERTsKIAllbHNlCi0JCXN0YXRlID0gSTkxNV9SRUFEKENVUkNOVFJfSVZCKHBpcGUpKSAmIENVUlNPUl9NT0RFOworCQlzdGF0ZSA9IEk5MTVfUkVBRChDVVJDTlRSKHBpcGUpKSAmIENVUlNPUl9NT0RFOwogCiAJcmV0dXJuIHN0YXRlOwogfQpAQCAtMjI5OSwxMCArMjMxNiw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcG9zOwogCi0JaWYgKElTX0lWWUJSSURHRShkZXYpIHx8IElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkKLQkJcG9zID0gSTkxNV9SRUFEKENVUlBPU19JVkIocGlwZSkpOwotCWVsc2UKLQkJcG9zID0gSTkxNV9SRUFEKENVUlBPUyhwaXBlKSk7CisJcG9zID0gSTkxNV9SRUFEKENVUlBPUyhwaXBlKSk7CiAKIAkqeCA9IChwb3MgPj4gQ1VSU09SX1hfU0hJRlQpICYgQ1VSU09SX1BPU19NQVNLOwogCWlmIChwb3MgJiAoQ1VSU09SX1BPU19TSUdOIDw8IENVUlNPUl9YX1NISUZUKSkKQEAgLTIzMTcsNyArMjMzMSw3IEBACiAKIHN0YXRpYyBpbnQgaTkxNV9kaXNwbGF5X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKQEAgLTIzMjcsNyArMjM0MSw3IEBACiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAlzZXFfcHJpbnRmKG0sICJDUlRDIGluZm9cbiIpOwogCXNlcV9wcmludGYobSwgIi0tLS0tLS0tLVxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGJhc2UuaGVhZCkgeworCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBjcnRjKSB7CiAJCWJvb2wgYWN0aXZlOwogCQlpbnQgeCwgeTsKIApAQCAtMjMzOSwxMCArMjM1MywxNCBAQAogCiAJCQlhY3RpdmUgPSBjdXJzb3JfcG9zaXRpb24oZGV2LCBjcnRjLT5waXBlLCAmeCwgJnkpOwogCQkJc2VxX3ByaW50ZihtLCAiXHRjdXJzb3IgdmlzaWJsZT8gJXMsIHBvc2l0aW9uICglZCwgJWQpLCBhZGRyIDB4JTA4eCwgYWN0aXZlPyAlc1xuIiwKLQkJCQkgICB5ZXNubyhjcnRjLT5jdXJzb3JfdmlzaWJsZSksCisJCQkJICAgeWVzbm8oY3J0Yy0+Y3Vyc29yX2Jhc2UpLAogCQkJCSAgIHgsIHksIGNydGMtPmN1cnNvcl9hZGRyLAogCQkJCSAgIHllc25vKGFjdGl2ZSkpOwogCQl9CisKKwkJc2VxX3ByaW50ZihtLCAiXHR1bmRlcnJ1biByZXBvcnRpbmc6IGNwdT0lcyBwY2g9JXMgXG4iLAorCQkJICAgeWVzbm8oIWNydGMtPmNwdV9maWZvX3VuZGVycnVuX2Rpc2FibGVkKSwKKwkJCSAgIHllc25vKCFjcnRjLT5wY2hfZmlmb191bmRlcnJ1bl9kaXNhYmxlZCkpOwogCX0KIAogCXNlcV9wcmludGYobSwgIlxuIik7CkBAIC0yNTk1LDcgKzI2MTMsNyBAQAogCiAJKnNvdXJjZSA9IElOVEVMX1BJUEVfQ1JDX1NPVVJDRV9QSVBFOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwKIAkJCSAgICBiYXNlLmhlYWQpIHsKIAkJaWYgKCFlbmNvZGVyLT5iYXNlLmNydGMpCkBAIC0yNjMxLDcgKzI2NDksNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzEwNiw3ICszMTI0LDcgQEAKIHN0YXRpYyB2b2lkIHdtX2xhdGVuY3lfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IHVpbnQxNl90IHdtWzVdKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtLT5wcml2YXRlOwotCWludCBudW1fbGV2ZWxzID0gSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpID8gNSA6IDQ7CisJaW50IG51bV9sZXZlbHMgPSBpbGtfd21fbWF4X2xldmVsKGRldikgKyAxOwogCWludCBsZXZlbDsKIAogCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CkBAIC0zMTg5LDcgKzMyMDcsNyBAQAogCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAl1aW50MTZfdCBuZXdbNV0gPSB7IDAgfTsKLQlpbnQgbnVtX2xldmVscyA9IElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSA/IDUgOiA0OworCWludCBudW1fbGV2ZWxzID0gaWxrX3dtX21heF9sZXZlbChkZXYpICsgMTsKIAlpbnQgbGV2ZWw7CiAJaW50IHJldDsKIAljaGFyIHRtcFszMl07CkBAIC0zMjg2LDkgKzMzMDQsMTUgQEAKIGk5MTVfd2VkZ2VkX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlpOTE1X2hhbmRsZV9lcnJvcihkZXYsIHZhbCwKIAkJCSAgIk1hbnVhbGx5IHNldHRpbmcgd2VkZ2VkIHRvICVsbHUiLCB2YWwpOworCisJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3NzQsNyArMzc5OCw3IEBACiAJeyJpOTE1X2dlbV9od3NfYnNkIiwgaTkxNV9od3NfaW5mbywgMCwgKHZvaWQgKilWQ1N9LAogCXsiaTkxNV9nZW1faHdzX3ZlYm94IiwgaTkxNV9od3NfaW5mbywgMCwgKHZvaWQgKilWRUNTfSwKIAl7Imk5MTVfcnN0ZGJ5X2RlbGF5cyIsIGk5MTVfcnN0ZGJ5X2RlbGF5cywgMH0sCi0JeyJpOTE1X2N1cl9kZWxheWluZm8iLCBpOTE1X2N1cl9kZWxheWluZm8sIDB9LAorCXsiaTkxNV9mcmVxdWVuY3lfaW5mbyIsIGk5MTVfZnJlcXVlbmN5X2luZm8sIDB9LAogCXsiaTkxNV9kZWxheWZyZXFfdGFibGUiLCBpOTE1X2RlbGF5ZnJlcV90YWJsZSwgMH0sCiAJeyJpOTE1X2ludHRvZXh0X3RhYmxlIiwgaTkxNV9pbnR0b2V4dF90YWJsZSwgMH0sCiAJeyJpOTE1X2RycGNfaW5mbyIsIGk5MTVfZHJwY19pbmZvLCAwfSwKQEAgLTM3OTAsNyArMzgxNCw2IEBACiAJeyJpOTE1X2dlbjZfZm9yY2V3YWtlX2NvdW50IiwgaTkxNV9nZW42X2ZvcmNld2FrZV9jb3VudF9pbmZvLCAwfSwKIAl7Imk5MTVfc3dpenpsZV9pbmZvIiwgaTkxNV9zd2l6emxlX2luZm8sIDB9LAogCXsiaTkxNV9wcGd0dF9pbmZvIiwgaTkxNV9wcGd0dF9pbmZvLCAwfSwKLQl7Imk5MTVfZHBpbyIsIGk5MTVfZHBpb19pbmZvLCAwfSwKIAl7Imk5MTVfbGxjIiwgaTkxNV9sbGMsIDB9LAogCXsiaTkxNV9lZHBfcHNyX3N0YXR1cyIsIGk5MTVfZWRwX3Bzcl9zdGF0dXMsIDB9LAogCXsiaTkxNV9zaW5rX2NyY19lRFAxIiwgaTkxNV9zaW5rX2NyYywgMH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCBlZWRiMDIzLi40YzIyYTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb29tLmg+CiAKICNkZWZpbmUgTFBfUklORyhkKSAoJigoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikoZCkpLT5yaW5nW1JDU10pCiAKQEAgLTYzLDcgKzY0LDcgQEAKICAqIGhhcyBhY2Nlc3MgdG8gdGhlIHJpbmcuCiAgKi8KICNkZWZpbmUgUklOR19MT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlKSBkbyB7CQkJXAotCWlmIChMUF9SSU5HKGRldi0+ZGV2X3ByaXZhdGUpLT5vYmogPT0gTlVMTCkJCQlcCisJaWYgKExQX1JJTkcoZGV2LT5kZXZfcHJpdmF0ZSktPmJ1ZmZlci0+b2JqID09IE5VTEwpCQkJXAogCQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlKTsJCQlcCiB9IHdoaWxlICgwKQogCkBAIC0xMTksNyArMTIwLDcgQEAKIHN0YXRpYyB2b2lkIGk5MTVfZnJlZV9od3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKIAogCWlmIChkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCkgewogCQlkcm1fcGNpX2ZyZWUoZGV2LCBkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCk7CkBAIC0xMzksNyArMTQwLDggQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOwogCiAJLyoKIAkgKiBXZSBzaG91bGQgbmV2ZXIgbG9zZSBjb250ZXh0IG9uIHRoZSByaW5nIHdpdGggbW9kZXNldHRpbmcKQEAgLTE0OCwxNyArMTUwLDE3IEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybjsKIAotCXJpbmctPmhlYWQgPSBJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUjsKLQlyaW5nLT50YWlsID0gSTkxNV9SRUFEX1RBSUwocmluZykgJiBUQUlMX0FERFI7Ci0JcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyBJOTE1X1JJTkdfRlJFRV9TUEFDRSk7Ci0JaWYgKHJpbmctPnNwYWNlIDwgMCkKLQkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKKwlyaW5nYnVmLT5oZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFI7CisJcmluZ2J1Zi0+dGFpbCA9IEk5MTVfUkVBRF9UQUlMKHJpbmcpICYgVEFJTF9BRERSOworCXJpbmdidWYtPnNwYWNlID0gcmluZ2J1Zi0+aGVhZCAtIChyaW5nYnVmLT50YWlsICsgSTkxNV9SSU5HX0ZSRUVfU1BBQ0UpOworCWlmIChyaW5nYnVmLT5zcGFjZSA8IDApCisJCXJpbmdidWYtPnNwYWNlICs9IHJpbmdidWYtPnNpemU7CiAKIAlpZiAoIWRldi0+cHJpbWFyeS0+bWFzdGVyKQogCQlyZXR1cm47CiAKIAltYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKLQlpZiAocmluZy0+aGVhZCA9PSByaW5nLT50YWlsICYmIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCWlmIChyaW5nYnVmLT5oZWFkID09IHJpbmdidWYtPnRhaWwgJiYgbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCiAJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1JJTkdfRU1QVFk7CiB9CiAKQEAgLTIwMSw3ICsyMDMsNyBAQAogCX0KIAogCWlmIChpbml0LT5yaW5nX3NpemUgIT0gMCkgewotCQlpZiAoTFBfUklORyhkZXZfcHJpdiktPm9iaiAhPSBOVUxMKSB7CisJCWlmIChMUF9SSU5HKGRldl9wcml2KS0+YnVmZmVyLT5vYmogIT0gTlVMTCkgewogCQkJaTkxNV9kbWFfY2xlYW51cChkZXYpOwogCQkJRFJNX0VSUk9SKCJDbGllbnQgdHJpZWQgdG8gaW5pdGlhbGl6ZSByaW5nYnVmZmVyIGluICIKIAkJCQkgICJHRU0gbW9kZVxuIik7CkBAIC0yMzQsMTEgKzIzNiwxMSBAQAogc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CiAKIAlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKHJpbmctPnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCWlmIChyaW5nLT5idWZmZXItPnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgogCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNjAsNyArMzYyLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCByZXQ7CiAKLQlpZiAoKGR3b3JkcysxKSAqIHNpemVvZihpbnQpID49IExQX1JJTkcoZGV2X3ByaXYpLT5zaXplIC0gOCkKKwlpZiAoKGR3b3JkcysxKSAqIHNpemVvZihpbnQpID49IExQX1JJTkcoZGV2X3ByaXYpLT5idWZmZXItPnNpemUgLSA4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7KSB7CkBAIC03ODIsNyArNzg0LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCiAJRFJNX0RFQlVHX0RSSVZFUigiaXJxX25yPSVkIGJyZWFkY3J1bWI9JWRcbiIsIGlycV9uciwKIAkJICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpKTsKQEAgLTgyMyw3ICs4MjUsNyBAQAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghZGV2X3ByaXYgfHwgIUxQX1JJTkcoZGV2X3ByaXYpLT52aXJ0dWFsX3N0YXJ0KSB7CisJaWYgKCFkZXZfcHJpdiB8fCAhTFBfUklORyhkZXZfcHJpdiktPmJ1ZmZlci0+dmlydHVhbF9zdGFydCkgewogCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTAxNyw2ICsxMDE5LDkgQEAKIAljYXNlIEk5MTVfUEFSQU1fSEFTX0VYRUNfSEFORExFX0xVVDoKIAkJdmFsdWUgPSAxOwogCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fQ01EX1BBUlNFUl9WRVJTSU9OOgorCQl2YWx1ZSA9IGk5MTVfY21kX3BhcnNlcl9nZXRfdmVyc2lvbigpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fREVCVUcoIlVua25vd24gcGFyYW1ldGVyICVkXG4iLCBwYXJhbS0+cGFyYW0pOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNzAsNyArMTA3NSw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9od3NfYWRkcl90ICpod3MgPSBkYXRhOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI3NywxMiArMTI4MiwxMyBAQAogc3RhdGljIGJvb2wgaTkxNV9zd2l0Y2hlcm9vX2Nhbl9zd2l0Y2goc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlib29sIGNhbl9zd2l0Y2g7CiAKLQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7Ci0JY2FuX3N3aXRjaCA9IChkZXYtPm9wZW5fY291bnQgPT0gMCk7Ci0Jc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7Ci0JcmV0dXJuIGNhbl9zd2l0Y2g7CisJLyoKKwkgKiBGSVhNRTogb3Blbl9jb3VudCBpcyBwcm90ZWN0ZWQgYnkgZHJtX2dsb2JhbF9tdXRleCBidXQgdGhhdCB3b3VsZCBsZWFkIHRvCisJICogbG9ja2luZyBpbnZlcnNpb24gd2l0aCB0aGUgZHJpdmVyIGxvYWQgcGF0aC4gQW5kIHRoZSBhY2Nlc3MgaGVyZSBpcworCSAqIGNvbXBsZXRlbHkgcmFjeSBhbnl3YXkuIFNvIGRvbid0IGJvdGhlciB3aXRoIGxvY2tpbmcgZm9yIG5vdy4KKwkgKi8KKwlyZXR1cm4gZGV2LT5vcGVuX2NvdW50ID09IDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50X29wcyBpOTE1X3N3aXRjaGVyb29fb3BzID0gewpAQCAtMTMyNiw3ICsxMzMyLDcgQEAKIAogCWludGVsX3Bvd2VyX2RvbWFpbnNfaW5pdF9odyhkZXZfcHJpdik7CiAKLQlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2KTsKKwlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2LCBkZXYtPnBkZXYtPmlycSk7CiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX2dlbV9zdG9sZW47CiAKQEAgLTEzMzYsNyArMTM0Miw3IEBACiAKIAlyZXQgPSBpOTE1X2dlbV9pbml0KGRldik7CiAJaWYgKHJldCkKLQkJZ290byBjbGVhbnVwX3Bvd2VyOworCQlnb3RvIGNsZWFudXBfaXJxOwogCiAJSU5JVF9XT1JLKCZkZXZfcHJpdi0+Y29uc29sZV9yZXN1bWVfd29yaywgaW50ZWxfY29uc29sZV9yZXN1bWUpOwogCkBAIC0xMzQ1LDEwICsxMzUxLDggQEAKIAkvKiBBbHdheXMgc2FmZSBpbiB0aGUgbW9kZSBzZXR0aW5nIGNhc2UuICovCiAJLyogRklYTUU6IGRvIHByZS9wb3N0LW1vZGUgc2V0IHN0dWZmIGluIGNvcmUgS01TIGNvZGUgKi8KIAlkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlOwotCWlmIChJTlRFTF9JTkZPKGRldiktPm51bV9waXBlcyA9PSAwKSB7Ci0JCWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9wcml2LCBQT1dFUl9ET01BSU5fVkdBKTsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5udW1fcGlwZXMgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0ID0gaW50ZWxfZmJkZXZfaW5pdChkZXYpOwogCWlmIChyZXQpCkBAIC0xMzgzLDggKzEzODcsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCVdBUk5fT04oZGV2X3ByaXYtPm1tLmFsaWFzaW5nX3BwZ3R0KTsKIAlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5ndHQuYmFzZS5tbSk7Ci1jbGVhbnVwX3Bvd2VyOgotCWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9wcml2LCBQT1dFUl9ET01BSU5fVkdBKTsKK2NsZWFudXBfaXJxOgogCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiBjbGVhbnVwX2dlbV9zdG9sZW46CiAJaTkxNV9nZW1fY2xlYW51cF9zdG9sZW4oZGV2KTsKQEAgLTE3MzksOCArMTc0Miw4IEBACiAJaW50ZWxfcG93ZXJfZG9tYWluc19yZW1vdmUoZGV2X3ByaXYpOwogCWRybV92YmxhbmtfY2xlYW51cChkZXYpOwogb3V0X2dlbV91bmxvYWQ6Ci0JaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zY2FuX29iamVjdHMpCi0JCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJV0FSTl9PTih1bnJlZ2lzdGVyX29vbV9ub3RpZmllcigmZGV2X3ByaXYtPm1tLm9vbV9ub3RpZmllcikpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5zaHJpbmtlcik7CiAKIAlpZiAoZGV2LT5wZGV2LT5tc2lfZW5hYmxlZCkKIAkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CkBAIC0xNzkxLDggKzE3OTQsOCBAQAogCiAJaTkxNV90ZWFyZG93bl9zeXNmcyhkZXYpOwogCi0JaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zY2FuX29iamVjdHMpCi0JCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJV0FSTl9PTih1bnJlZ2lzdGVyX29vbV9ub3RpZmllcigmZGV2X3ByaXYtPm1tLm9vbV9ub3RpZmllcikpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5zaHJpbmtlcik7CiAKIAlpb19tYXBwaW5nX2ZyZWUoZGV2X3ByaXYtPmd0dC5tYXBwYWJsZSk7CiAJYXJjaF9waHlzX3djX2RlbChkZXZfcHJpdi0+Z3R0Lm10cnIpOwpAQCAtMTg2NCw3ICsxODY3LDcgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KGRldl9wcml2LT5zbGFiKTsKIAogCXBjaV9kZXZfcHV0KGRldl9wcml2LT5icmlkZ2VfZGV2KTsKLQlrZnJlZShkZXYtPmRldl9wcml2YXRlKTsKKwlrZnJlZShkZXZfcHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MjUsNiArMTkyOCw4IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7CiAKKwlpZiAoZmlsZV9wcml2ICYmIGZpbGVfcHJpdi0+YnNkX3JpbmcpCisJCWZpbGVfcHJpdi0+YnNkX3JpbmcgPSBOVUxMOwogCWtmcmVlKGZpbGVfcHJpdik7CiB9CiAKQEAgLTE5NzgsOSArMTk4MywxMCBAQAogCURSTV9JT0NUTF9ERUZfRFJWKEk5MTVfR0VNX0NPTlRFWFRfREVTVFJPWSwgaTkxNV9nZW1fY29udGV4dF9kZXN0cm95X2lvY3RsLCBEUk1fVU5MT0NLRUR8RFJNX1JFTkRFUl9BTExPVyksCiAJRFJNX0lPQ1RMX0RFRl9EUlYoSTkxNV9SRUdfUkVBRCwgaTkxNV9yZWdfcmVhZF9pb2N0bCwgRFJNX1VOTE9DS0VEfERSTV9SRU5ERVJfQUxMT1cpLAogCURSTV9JT0NUTF9ERUZfRFJWKEk5MTVfR0VUX1JFU0VUX1NUQVRTLCBpOTE1X2dldF9yZXNldF9zdGF0c19pb2N0bCwgRFJNX1VOTE9DS0VEfERSTV9SRU5ERVJfQUxMT1cpLAorCURSTV9JT0NUTF9ERUZfRFJWKEk5MTVfR0VNX1VTRVJQVFIsIGk5MTVfZ2VtX3VzZXJwdHJfaW9jdGwsIERSTV9VTkxPQ0tFRHxEUk1fUkVOREVSX0FMTE9XKSwKIH07CiAKLWludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKK2ludCBpOTE1X21heF9pb2N0bCA9IEFSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOwogCiAvKgogICogVGhpcyBpcyByZWFsbHkgdWdseTogQmVjYXVzZSBvbGQgdXNlcnNwYWNlIGFidXNlZCB0aGUgbGludXggYWdwIGludGVyZmFjZSB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggODJmNGQxZi4uNjUxZTY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KIAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlcjsKQEAgLTQ5LDEyICs1MCwzMCBAQAogCS5kcGxsX21kX29mZnNldHMgPSB7IERQTExfQV9NRF9PRkZTRVQsIERQTExfQl9NRF9PRkZTRVQgfSwgXAogCS5wYWxldHRlX29mZnNldHMgPSB7IFBBTEVUVEVfQV9PRkZTRVQsIFBBTEVUVEVfQl9PRkZTRVQgfQogCisjZGVmaW5lIEdFTl9DSFZfUElQRU9GRlNFVFMgXAorCS5waXBlX29mZnNldHMgPSB7IFBJUEVfQV9PRkZTRVQsIFBJUEVfQl9PRkZTRVQsIFwKKwkJCSAgQ0hWX1BJUEVfQ19PRkZTRVQgfSwgXAorCS50cmFuc19vZmZzZXRzID0geyBUUkFOU0NPREVSX0FfT0ZGU0VULCBUUkFOU0NPREVSX0JfT0ZGU0VULCBcCisJCQkgICBDSFZfVFJBTlNDT0RFUl9DX09GRlNFVCwgfSwgXAorCS5kcGxsX29mZnNldHMgPSB7IERQTExfQV9PRkZTRVQsIERQTExfQl9PRkZTRVQsIFwKKwkJCSAgQ0hWX0RQTExfQ19PRkZTRVQgfSwgXAorCS5kcGxsX21kX29mZnNldHMgPSB7IERQTExfQV9NRF9PRkZTRVQsIERQTExfQl9NRF9PRkZTRVQsIFwKKwkJCSAgICAgQ0hWX0RQTExfQ19NRF9PRkZTRVQgfSwgXAorCS5wYWxldHRlX29mZnNldHMgPSB7IFBBTEVUVEVfQV9PRkZTRVQsIFBBTEVUVEVfQl9PRkZTRVQsIFwKKwkJCSAgICAgQ0hWX1BBTEVUVEVfQ19PRkZTRVQgfQorCisjZGVmaW5lIENVUlNPUl9PRkZTRVRTIFwKKwkuY3Vyc29yX29mZnNldHMgPSB7IENVUlNPUl9BX09GRlNFVCwgQ1VSU09SX0JfT0ZGU0VULCBDSFZfQ1VSU09SX0NfT0ZGU0VUIH0KKworI2RlZmluZSBJVkJfQ1VSU09SX09GRlNFVFMgXAorCS5jdXJzb3Jfb2Zmc2V0cyA9IHsgQ1VSU09SX0FfT0ZGU0VULCBJVkJfQ1VSU09SX0JfT0ZGU0VULCBJVkJfQ1VSU09SX0NfT0ZGU0VUIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pODMwX2luZm8gPSB7CiAJLmdlbiA9IDIsIC5pc19tb2JpbGUgPSAxLCAuY3Vyc29yX25lZWRzX3BoeXNpY2FsID0gMSwgLm51bV9waXBlcyA9IDIsCiAJLmhhc19vdmVybGF5ID0gMSwgLm92ZXJsYXlfbmVlZHNfcGh5c2ljYWwgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfODQ1Z19pbmZvID0gewpAQCAtNjIsNiArODEsNyBAQAogCS5oYXNfb3ZlcmxheSA9IDEsIC5vdmVybGF5X25lZWRzX3BoeXNpY2FsID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2k4NXhfaW5mbyA9IHsKQEAgLTcxLDYgKzkxLDcgQEAKIAkuaGFzX2ZiYyA9IDEsCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pODY1Z19pbmZvID0gewpAQCAtNzgsNiArOTksNyBAQAogCS5oYXNfb3ZlcmxheSA9IDEsIC5vdmVybGF5X25lZWRzX3BoeXNpY2FsID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2k5MTVnX2luZm8gPSB7CkBAIC04NSw2ICsxMDcsNyBAQAogCS5oYXNfb3ZlcmxheSA9IDEsIC5vdmVybGF5X25lZWRzX3BoeXNpY2FsID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTE1Z21faW5mbyA9IHsKIAkuZ2VuID0gMywgLmlzX21vYmlsZSA9IDEsIC5udW1fcGlwZXMgPSAyLApAQCAtOTQsMTIgKzExNywxNCBAQAogCS5oYXNfZmJjID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTQ1Z19pbmZvID0gewogCS5nZW4gPSAzLCAuaGFzX2hvdHBsdWcgPSAxLCAuY3Vyc29yX25lZWRzX3BoeXNpY2FsID0gMSwgLm51bV9waXBlcyA9IDIsCiAJLmhhc19vdmVybGF5ID0gMSwgLm92ZXJsYXlfbmVlZHNfcGh5c2ljYWwgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2k5NDVnbV9pbmZvID0gewogCS5nZW4gPSAzLCAuaXNfaTk0NWdtID0gMSwgLmlzX21vYmlsZSA9IDEsIC5udW1fcGlwZXMgPSAyLApAQCAtMTA5LDYgKzEzNCw3IEBACiAJLmhhc19mYmMgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaTk2NWdfaW5mbyA9IHsKQEAgLTExNyw2ICsxNDMsNyBAQAogCS5oYXNfb3ZlcmxheSA9IDEsCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTY1Z21faW5mbyA9IHsKQEAgLTEyNiw2ICsxNTMsNyBAQAogCS5zdXBwb3J0c190diA9IDEsCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9nMzNfaW5mbyA9IHsKQEAgLTEzNCw2ICsxNjIsNyBAQAogCS5oYXNfb3ZlcmxheSA9IDEsCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9nNDVfaW5mbyA9IHsKQEAgLTE0MSw2ICsxNzAsNyBAQAogCS5oYXNfcGlwZV9jeHNyID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfZ200NV9pbmZvID0gewpAQCAtMTUwLDYgKzE4MCw3IEBACiAJLnN1cHBvcnRzX3R2ID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfcGluZXZpZXdfaW5mbyA9IHsKQEAgLTE1Nyw2ICsxODgsNyBAQAogCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAogCS5oYXNfb3ZlcmxheSA9IDEsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2lyb25sYWtlX2RfaW5mbyA9IHsKQEAgLTE2NCw2ICsxOTYsNyBAQAogCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORyB8IEJTRF9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pcm9ubGFrZV9tX2luZm8gPSB7CkBAIC0xNzIsNiArMjA1LDcgQEAKIAkuaGFzX2ZiYyA9IDEsCiAJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcsCiAJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX3NhbmR5YnJpZGdlX2RfaW5mbyA9IHsKQEAgLTE4MSw2ICsyMTUsNyBAQAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORyB8IEJTRF9SSU5HIHwgQkxUX1JJTkcsCiAJLmhhc19sbGMgPSAxLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9zYW5keWJyaWRnZV9tX2luZm8gPSB7CkBAIC0xOTAsNiArMjI1LDcgQEAKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HLAogCS5oYXNfbGxjID0gMSwKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKICNkZWZpbmUgR0VON19GRUFUVVJFUyAgXApAQCAtMjAzLDYgKzIzOSw3IEBACiAJR0VON19GRUFUVVJFUywKIAkuaXNfaXZ5YnJpZGdlID0gMSwKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlJVkJfQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2l2eWJyaWRnZV9tX2luZm8gPSB7CkBAIC0yMTAsNiArMjQ3LDcgQEAKIAkuaXNfaXZ5YnJpZGdlID0gMSwKIAkuaXNfbW9iaWxlID0gMSwKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlJVkJfQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2l2eWJyaWRnZV9xX2luZm8gPSB7CkBAIC0yMTcsNiArMjU1LDcgQEAKIAkuaXNfaXZ5YnJpZGdlID0gMSwKIAkubnVtX3BpcGVzID0gMCwgLyogbGVnYWwsIGxhc3Qgb25lIHdpbnMgKi8KIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlJVkJfQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX3ZhbGxleXZpZXdfbV9pbmZvID0gewpAQCAtMjI4LDYgKzI2Nyw3IEBACiAJLmhhc19mYmMgPSAwLCAvKiBsZWdhbCwgbGFzdCBvbmUgd2lucyAqLwogCS5oYXNfbGxjID0gMCwgLyogbGVnYWwsIGxhc3Qgb25lIHdpbnMgKi8KIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlDVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfdmFsbGV5dmlld19kX2luZm8gPSB7CkBAIC0yMzgsNiArMjc4LDcgQEAKIAkuaGFzX2ZiYyA9IDAsIC8qIGxlZ2FsLCBsYXN0IG9uZSB3aW5zICovCiAJLmhhc19sbGMgPSAwLCAvKiBsZWdhbCwgbGFzdCBvbmUgd2lucyAqLwogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9oYXN3ZWxsX2RfaW5mbyA9IHsKQEAgLTI0Nyw2ICsyODgsNyBAQAogCS5oYXNfZnBnYV9kYmcgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORyB8IEJTRF9SSU5HIHwgQkxUX1JJTkcgfCBWRUJPWF9SSU5HLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUlWQl9DVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaGFzd2VsbF9tX2luZm8gPSB7CkBAIC0yNTcsNiArMjk5LDcgQEAKIAkuaGFzX2ZwZ2FfZGJnID0gMSwKIAkucmluZ19tYXNrID0gUkVOREVSX1JJTkcgfCBCU0RfUklORyB8IEJMVF9SSU5HIHwgVkVCT1hfUklORywKIAlHRU5fREVGQVVMVF9QSVBFT0ZGU0VUUywKKwlJVkJfQ1VSU09SX09GRlNFVFMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2Jyb2Fkd2VsbF9kX2luZm8gPSB7CkBAIC0yNjcsNiArMzEwLDcgQEAKIAkuaGFzX2RkaSA9IDEsCiAJLmhhc19mYmMgPSAxLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUlWQl9DVVJTT1JfT0ZGU0VUUywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfYnJvYWR3ZWxsX21faW5mbyA9IHsKQEAgLTI3Nyw2ICszMjEsNDAgQEAKIAkuaGFzX2RkaSA9IDEsCiAJLmhhc19mYmMgPSAxLAogCUdFTl9ERUZBVUxUX1BJUEVPRkZTRVRTLAorCUlWQl9DVVJTT1JfT0ZGU0VUUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfYnJvYWR3ZWxsX2d0M2RfaW5mbyA9IHsKKwkuZ2VuID0gOCwgLm51bV9waXBlcyA9IDMsCisJLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCisJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcgfCBCTFRfUklORyB8IFZFQk9YX1JJTkcgfCBCU0QyX1JJTkcsCisJLmhhc19sbGMgPSAxLAorCS5oYXNfZGRpID0gMSwKKwkuaGFzX2ZiYyA9IDEsCisJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJSVZCX0NVUlNPUl9PRkZTRVRTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9icm9hZHdlbGxfZ3QzbV9pbmZvID0geworCS5nZW4gPSA4LCAuaXNfbW9iaWxlID0gMSwgLm51bV9waXBlcyA9IDMsCisJLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCisJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcgfCBCTFRfUklORyB8IFZFQk9YX1JJTkcgfCBCU0QyX1JJTkcsCisJLmhhc19sbGMgPSAxLAorCS5oYXNfZGRpID0gMSwKKwkuaGFzX2ZiYyA9IDEsCisJR0VOX0RFRkFVTFRfUElQRU9GRlNFVFMsCisJSVZCX0NVUlNPUl9PRkZTRVRTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9jaGVycnl2aWV3X2luZm8gPSB7CisJLmlzX3ByZWxpbWluYXJ5ID0gMSwKKwkuZ2VuID0gOCwgLm51bV9waXBlcyA9IDMsCisJLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCisJLnJpbmdfbWFzayA9IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcgfCBCTFRfUklORyB8IFZFQk9YX1JJTkcsCisJLmlzX3ZhbGxleXZpZXcgPSAxLAorCS5kaXNwbGF5X21taW9fb2Zmc2V0ID0gVkxWX0RJU1BMQVlfQkFTRSwKKwlHRU5fQ0hWX1BJUEVPRkZTRVRTLAorCUNVUlNPUl9PRkZTRVRTLAogfTsKIAogLyoKQEAgLTMxMSw4ICszODksMTEgQEAKIAlJTlRFTF9IU1dfTV9JRFMoJmludGVsX2hhc3dlbGxfbV9pbmZvKSwgXAogCUlOVEVMX1ZMVl9NX0lEUygmaW50ZWxfdmFsbGV5dmlld19tX2luZm8pLAlcCiAJSU5URUxfVkxWX0RfSURTKCZpbnRlbF92YWxsZXl2aWV3X2RfaW5mbyksCVwKLQlJTlRFTF9CRFdfTV9JRFMoJmludGVsX2Jyb2Fkd2VsbF9tX2luZm8pLAlcCi0JSU5URUxfQkRXX0RfSURTKCZpbnRlbF9icm9hZHdlbGxfZF9pbmZvKQorCUlOVEVMX0JEV19HVDEyTV9JRFMoJmludGVsX2Jyb2Fkd2VsbF9tX2luZm8pLAlcCisJSU5URUxfQkRXX0dUMTJEX0lEUygmaW50ZWxfYnJvYWR3ZWxsX2RfaW5mbyksCVwKKwlJTlRFTF9CRFdfR1QzTV9JRFMoJmludGVsX2Jyb2Fkd2VsbF9ndDNtX2luZm8pLAlcCisJSU5URUxfQkRXX0dUM0RfSURTKCZpbnRlbF9icm9hZHdlbGxfZ3QzZF9pbmZvKSwgXAorCUlOVEVMX0NIVl9JRFMoJmludGVsX2NoZXJyeXZpZXdfaW5mbykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewkJLyogYWthICovCiAJSU5URUxfUENJX0lEUywKQEAgLTQ0NSwxOCArNTI2LDIwIEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRldl9wcml2LT5ycHMuZGVsYXllZF9yZXN1bWVfd29yayk7Ci0KIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAkJZGV2X3ByaXYtPmVuYWJsZV9ob3RwbHVnX3Byb2Nlc3NpbmcgPSBmYWxzZTsKKworCQlpbnRlbF9kaXNhYmxlX2d0X3Bvd2Vyc2F2ZShkZXYpOworCiAJCS8qCiAJCSAqIERpc2FibGUgQ1JUQ3MgZGlyZWN0bHkgc2luY2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSBzdyBzdGF0ZQogCQkgKiBmb3IgX3RoYXcuCiAJCSAqLwotCQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCisJCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7CisJCWZvcl9lYWNoX2NydGMoZGV2LCBjcnRjKSB7CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5jcnRjX2Rpc2FibGUoY3J0Yyk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCX0KKwkJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwogCiAJCWludGVsX21vZGVzZXRfc3VzcGVuZF9odyhkZXYpOwogCX0KQEAgLTUxOSwyNCArNjAyLDYgQEAKIAljb25zb2xlX3VubG9jaygpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9yZXN1bWVfaG90cGx1ZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKm1vZGVfY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7Ci0Jc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7Ci0KLQltdXRleF9sb2NrKCZtb2RlX2NvbmZpZy0+bXV0ZXgpOwotCURSTV9ERUJVR19LTVMoInJ1bm5pbmcgZW5jb2RlciBob3RwbHVnIGZ1bmN0aW9uc1xuIik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZtb2RlX2NvbmZpZy0+ZW5jb2Rlcl9saXN0LCBiYXNlLmhlYWQpCi0JCWlmIChlbmNvZGVyLT5ob3RfcGx1ZykKLQkJCWVuY29kZXItPmhvdF9wbHVnKGVuY29kZXIpOwotCi0JbXV0ZXhfdW5sb2NrKCZtb2RlX2NvbmZpZy0+bXV0ZXgpOwotCi0JLyogSnVzdCBmaXJlIG9mZiBhIHVldmVudCBhbmQgbGV0IHVzZXJzcGFjZSB0ZWxsIHVzIHdoYXQgdG8gZG8gKi8KLQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZGV2KTsKLX0KLQogc3RhdGljIGludCBpOTE1X2RybV90aGF3X2Vhcmx5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU1MSw3ICs2MTYsNiBAQAogc3RhdGljIGludCBfX2k5MTVfZHJtX3RoYXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCByZXN0b3JlX2d0dF9tYXBwaW5ncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBlcnJvciA9IDA7CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSAmJgogCSAgICByZXN0b3JlX2d0dF9tYXBwaW5ncykgewpAQCAtNTY5LDEyICs2MzMsMTQgQEAKIAkJZHJtX21vZGVfY29uZmlnX3Jlc2V0KGRldik7CiAKIAkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JCWVycm9yID0gaTkxNV9nZW1faW5pdF9odyhkZXYpOworCQlpZiAoaTkxNV9nZW1faW5pdF9odyhkZXYpKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byByZS1pbml0aWFsaXplIEdQVSwgZGVjbGFyaW5nIHdlZGdlZCFcbiIpOworCQkJYXRvbWljX3NldF9tYXNrKEk5MTVfV0VER0VELCAmZGV2X3ByaXYtPmdwdV9lcnJvci5yZXNldF9jb3VudGVyKTsKKwkJfQogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCQkvKiBXZSBuZWVkIHdvcmtpbmcgaW50ZXJydXB0cyBmb3IgbW9kZXNldCBlbmFibGluZyAuLi4gKi8KLQkJZHJtX2lycV9pbnN0YWxsKGRldik7CisJCWRybV9pcnFfaW5zdGFsbChkZXYsIGRldi0+cGRldi0+aXJxKTsKIAogCQlpbnRlbF9tb2Rlc2V0X2luaXRfaHcoZGV2KTsKIApAQCAtNTkxLDcgKzY1Nyw3IEBACiAJCWludGVsX2hwZF9pbml0KGRldik7CiAJCWRldl9wcml2LT5lbmFibGVfaG90cGx1Z19wcm9jZXNzaW5nID0gdHJ1ZTsKIAkJLyogQ29uZmlnIG1heSBoYXZlIGNoYW5nZWQgYmV0d2VlbiBzdXNwZW5kIGFuZCByZXN1bWUgKi8KLQkJaW50ZWxfcmVzdW1lX2hvdHBsdWcoZGV2KTsKKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGRldik7CiAJfQogCiAJaW50ZWxfb3ByZWdpb25faW5pdChkZXYpOwpAQCAtNjEzLDcgKzY3OSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX2xvY2spOwogCiAJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpOTE1X2RybV90aGF3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC03NDYsMTggKzgxMiwyMCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCWRybV9pcnFfdW5pbnN0YWxsKGRldik7Ci0JCWRybV9pcnFfaW5zdGFsbChkZXYpOworCQkvKgorCQkgKiBGSVhNRTogVGhpcyByYWNlcyBwcmV0dHkgYmFkbHkgYWdhaW5zdCBjb25jdXJyZW50IGhvbGRlcnMgb2YKKwkJICogcmluZyBpbnRlcnJ1cHRzLiBUaGlzIGlzIHBvc3NpYmxlIHNpbmNlIHdlJ3ZlIHN0YXJ0ZWQgdG8gZHJvcAorCQkgKiBkZXYtPnN0cnVjdF9tdXRleCBpbiBzZWxlY3QgcGxhY2VzIHdoZW4gd2FpdGluZyBmb3IgdGhlIGdwdS4KKwkJICovCiAKLQkJLyogcnBzL3JjNiByZS1pbml0IGlzIG5lY2Vzc2FyeSB0byByZXN0b3JlIHN0YXRlIGxvc3QgYWZ0ZXIgdGhlCi0JCSAqIHJlc2V0IGFuZCB0aGUgcmUtaW5zdGFsbCBvZiBkcm0gaXJxLiBTa2lwIGZvciBpcm9ubGFrZSBwZXIKKwkJLyoKKwkJICogcnBzL3JjNiByZS1pbml0IGlzIG5lY2Vzc2FyeSB0byByZXN0b3JlIHN0YXRlIGxvc3QgYWZ0ZXIgdGhlCisJCSAqIHJlc2V0IGFuZCB0aGUgcmUtaW5zdGFsbCBvZiBndCBpcnFzLiBTa2lwIGZvciBpcm9ubGFrZSBwZXIKIAkJICogcHJldmlvdXMgY29uY2VybnMgdGhhdCBpdCBkb2Vzbid0IHJlc3BvbmQgd2VsbCB0byBzb21lIGZvcm1zCi0JCSAqIG9mIHJlLWluaXQgYWZ0ZXIgcmVzZXQuICovCi0JCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDUpIHsKLQkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCWludGVsX2VuYWJsZV9ndF9wb3dlcnNhdmUoZGV2KTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQl9CisJCSAqIG9mIHJlLWluaXQgYWZ0ZXIgcmVzZXQuCisJCSAqLworCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPiA1KQorCQkJaW50ZWxfcmVzZXRfZ3RfcG93ZXJzYXZlKGRldik7CiAKIAkJaW50ZWxfaHBkX2luaXQoZGV2KTsKIAl9IGVsc2UgewpAQCAtODkxLDIxICs5NTksNDUzIEBACiAJcmV0dXJuIGk5MTVfZHJtX2ZyZWV6ZShkcm1fZGV2KTsKIH0KIAotc3RhdGljIGludCBpOTE1X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGhzd19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWhzd19lbmFibGVfcGM4KGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuYl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisKKwlpbnRlbF9pbml0X3BjaF9yZWZjbGsoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaHN3X2Rpc2FibGVfcGM4KGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2F2ZSBhbGwgR3VuaXQgcmVnaXN0ZXJzIHRoYXQgbWF5IGJlIGxvc3QgYWZ0ZXIgYSBEMyBhbmQgYSBzdWJzZXF1ZW50CisgKiBTMGlbUjEyM10gdHJhbnNpdGlvbi4gVGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIG5lZWRpbmcgYSBzYXZlL3Jlc3RvcmUgaXMKKyAqIGRlZmluZWQgaW4gdGhlIFZMVjJfUzBJWFJlZ3MgZG9jdW1lbnQuIFRoaXMgZG9jdW1lbnRzIG1hcmtzIGFsbCBHdW5pdAorICogcmVnaXN0ZXJzIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogLSBEcml2ZXI6IHNhdmVkL3Jlc3RvcmVkIGJ5IHRoZSBkcml2ZXIKKyAqIC0gUHVuaXQgOiBzYXZlZC9yZXN0b3JlZCBieSB0aGUgUHVuaXQgZmlybXdhcmUKKyAqIC0gTm8sIHcvbyBtYXJraW5nOiBubyBuZWVkIHRvIHNhdmUvcmVzdG9yZSwgc2luY2UgdGhlIHJlZ2lzdGVyIGlzIFIvTyBvcgorICogICAgICAgICAgICAgICAgICAgIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgSFcgaW4gYSB3YXkgdGhhdCBkb2Vzbid0IGRlcGVuZAorICogICAgICAgICAgICAgICAgICAgIGtlZXBpbmcgdGhlIGNvbnRlbnQgYWNyb3NzIGEgc3VzcGVuZC9yZXN1bWUuCisgKiAtIERlYnVnIDogdXNlZCBmb3IgZGVidWdnaW5nCisgKgorICogV2Ugc2F2ZS9yZXN0b3JlIGFsbCByZWdpc3RlcnMgbWFya2VkIHdpdGggJ0RyaXZlcicsIHdpdGggdGhlIGZvbGxvd2luZworICogZXhjZXB0aW9uczoKKyAqIC0gUmVnaXN0ZXJzIG91dCBvZiB1c2UsIGluY2x1ZGluZyBhbHNvIHJlZ2lzdGVycyBtYXJrZWQgd2l0aCAnRGVidWcnLgorICogICBUaGVzZSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgZHJpdmVyJ3Mgb3BlcmF0aW9uLCBzbyB3ZSBkb24ndCBzYXZlL3Jlc3RvcmUKKyAqICAgdGhlbSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkLgorICogLSBSZWdpc3RlcnMgdGhhdCBhcmUgZnVsbHkgc2V0dXAgYnkgYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gY2FsbGVkIGZyb20KKyAqICAgdGhlIHJlc3VtZSBwYXRoLiBGb3IgZXhhbXBsZSBtYW55IGNsb2NrIGdhdGluZyBhbmQgUlBTL1JDNiByZWdpc3RlcnMuCisgKiAtIFJlZ2lzdGVycyB0aGF0IHByb3ZpZGUgdGhlIHJpZ2h0IGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGVpciByZXNldCBkZWZhdWx0cy4KKyAqCisgKiBUT0RPOiBFeGNlcHQgZm9yIHJlZ2lzdGVycyB0aGF0IGJhc2VkIG9uIHRoZSBhYm92ZSAzIGNyaXRlcmlhIGNhbiBiZSBzYWZlbHkKKyAqIGlnbm9yZWQsIHdlIHNhdmUvcmVzdG9yZSBhbGwgb3RoZXJzLCBwcmFjdGljYWxseSB0cmVhdGluZyB0aGUgSFcgY29udGV4dCBhcworICogYSBibGFjay1ib3ggZm9yIHRoZSBkcml2ZXIuIEZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBpcyBuZWVkZWQgdG8gcmVkdWNlIHRoZQorICogc2F2ZWQvcmVzdG9yZWQgcmVnaXN0ZXJzIGV2ZW4gZnVydGhlciwgYnkgZm9sbG93aW5nIHRoZSBzYW1lIDMgY3JpdGVyaWEuCisgKi8KK3N0YXRpYyB2b2lkIHZsdl9zYXZlX2d1bml0X3MwaXhfc3RhdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCB2bHZfczBpeF9zdGF0ZSAqcyA9ICZkZXZfcHJpdi0+dmx2X3MwaXhfc3RhdGU7CisJaW50IGk7CisKKwkvKiBHQU0gMHg0MDAwLTB4NDc3MCAqLworCXMtPndyX3dhdGVybWFyawkJPSBJOTE1X1JFQUQoR0VON19XUl9XQVRFUk1BUkspOworCXMtPmdmeF9wcmlvX2N0cmwJPSBJOTE1X1JFQUQoR0VON19HRlhfUFJJT19DVFJMKTsKKwlzLT5hcmJfbW9kZQkJPSBJOTE1X1JFQUQoQVJCX01PREUpOworCXMtPmdmeF9wZW5kX3RsYjAJPSBJOTE1X1JFQUQoR0VON19HRlhfUEVORF9UTEIwKTsKKwlzLT5nZnhfcGVuZF90bGIxCT0gSTkxNV9SRUFEKEdFTjdfR0ZYX1BFTkRfVExCMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5scmFfbGltaXRzKTsgaSsrKQorCQlzLT5scmFfbGltaXRzW2ldID0gSTkxNV9SRUFEKEdFTjdfTFJBX0xJTUlUU19CQVNFICsgaSAqIDQpOworCisJcy0+bWVkaWFfbWF4X3JlcV9jb3VudAk9IEk5MTVfUkVBRChHRU43X01FRElBX01BWF9SRVFfQ09VTlQpOworCXMtPmdmeF9tYXhfcmVxX2NvdW50CT0gSTkxNV9SRUFEKEdFTjdfTUVESUFfTUFYX1JFUV9DT1VOVCk7CisKKwlzLT5yZW5kZXJfaHdzcAkJPSBJOTE1X1JFQUQoUkVOREVSX0hXU19QR0FfR0VONyk7CisJcy0+ZWNvY2hrCQk9IEk5MTVfUkVBRChHQU1fRUNPQ0hLKTsKKwlzLT5ic2RfaHdzcAkJPSBJOTE1X1JFQUQoQlNEX0hXU19QR0FfR0VONyk7CisJcy0+Ymx0X2h3c3AJCT0gSTkxNV9SRUFEKEJMVF9IV1NfUEdBX0dFTjcpOworCisJcy0+dGxiX3JkX2FkZHIJCT0gSTkxNV9SRUFEKEdFTjdfVExCX1JEX0FERFIpOworCisJLyogTUJDIDB4OTAyNC0weDkxRDAsIDB4ODUwMCAqLworCXMtPmczZGN0bAkJPSBJOTE1X1JFQUQoVkxWX0czRENUTCk7CisJcy0+Z3Nja2djdGwJCT0gSTkxNV9SRUFEKFZMVl9HU0NLR0NUTCk7CisJcy0+bWJjdGwJCT0gSTkxNV9SRUFEKEdFTjZfTUJDVEwpOworCisJLyogR0NQIDB4OTQwMC0weDk0MjQsIDB4ODEwMC0weDgxMEMgKi8KKwlzLT51Y2djdGwxCQk9IEk5MTVfUkVBRChHRU42X1VDR0NUTDEpOworCXMtPnVjZ2N0bDMJCT0gSTkxNV9SRUFEKEdFTjZfVUNHQ1RMMyk7CisJcy0+cmNnY3RsMQkJPSBJOTE1X1JFQUQoR0VONl9SQ0dDVEwxKTsKKwlzLT5yY2djdGwyCQk9IEk5MTVfUkVBRChHRU42X1JDR0NUTDIpOworCXMtPnJzdGN0bAkJPSBJOTE1X1JFQUQoR0VONl9SU1RDVEwpOworCXMtPm1pc2NjcGN0bAkJPSBJOTE1X1JFQUQoR0VON19NSVNDQ1BDVEwpOworCisJLyogR1BNIDB4QTAwMC0weEFBODQsIDB4ODAwMC0weDgwRkMgKi8KKwlzLT5nZnhwYXVzZQkJPSBJOTE1X1JFQUQoR0VONl9HRlhQQVVTRSk7CisJcy0+cnBkZXVod3RjCQk9IEk5MTVfUkVBRChHRU42X1JQREVVSFdUQyk7CisJcy0+cnBkZXVjCQk9IEk5MTVfUkVBRChHRU42X1JQREVVQyk7CisJcy0+ZWNvYnVzCQk9IEk5MTVfUkVBRChFQ09CVVMpOworCXMtPnB3cmR3bnVwY3RsCQk9IEk5MTVfUkVBRChWTFZfUFdSRFdOVVBDVEwpOworCXMtPnJwX2Rvd25fdGltZW91dAk9IEk5MTVfUkVBRChHRU42X1JQX0RPV05fVElNRU9VVCk7CisJcy0+cnBfZGV1Y3N3CQk9IEk5MTVfUkVBRChHRU42X1JQREVVQ1NXKTsKKwlzLT5yY3VibWFiZHRtcgkJPSBJOTE1X1JFQUQoR0VONl9SQ1VCTUFCRFRNUik7CisJcy0+cmNlZGF0YQkJPSBJOTE1X1JFQUQoVkxWX1JDRURBVEEpOworCXMtPnNwYXJlMmdoCQk9IEk5MTVfUkVBRChWTFZfU1BBUkVHMkgpOworCisJLyogRGlzcGxheSBDWiBkb21haW4sIDB4NDQwMEMtMHg0NDAyQywgMHg0RjAwMC0weDRGMTFGICovCisJcy0+Z3RfaW1yCQk9IEk5MTVfUkVBRChHVElNUik7CisJcy0+Z3RfaWVyCQk9IEk5MTVfUkVBRChHVElFUik7CisJcy0+cG1faW1yCQk9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKKwlzLT5wbV9pZXIJCT0gSTkxNV9SRUFEKEdFTjZfUE1JRVIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+Z3Rfc2NyYXRjaCk7IGkrKykKKwkJcy0+Z3Rfc2NyYXRjaFtpXSA9IEk5MTVfUkVBRChHRU43X0dUX1NDUkFUQ0hfQkFTRSArIGkgKiA0KTsKKworCS8qIEdUIFNBIENaIGRvbWFpbiwgMHgxMDAwMDAtMHgxMzgxMjQgKi8KKwlzLT50aWxlY3RsCQk9IEk5MTVfUkVBRChUSUxFQ1RMKTsKKwlzLT5ndF9maWZvY3RsCQk9IEk5MTVfUkVBRChHVEZJRk9DVEwpOworCXMtPmd0bGNfd2FrZV9jdHJsCT0gSTkxNV9SRUFEKFZMVl9HVExDX1dBS0VfQ1RSTCk7CisJcy0+Z3RsY19zdXJ2aXZlCQk9IEk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRyk7CisJcy0+cG13Z2ljegkJPSBJOTE1X1JFQUQoVkxWX1BNV0dJQ1opOworCisJLyogR3VuaXQtRGlzcGxheSBDWiBkb21haW4sIDB4MTgyMDI4LTB4MTgyMUNGICovCisJcy0+Z3VfY3RsMAkJPSBJOTE1X1JFQUQoVkxWX0dVX0NUTDApOworCXMtPmd1X2N0bDEJCT0gSTkxNV9SRUFEKFZMVl9HVV9DVEwxKTsKKwlzLT5jbG9ja19nYXRlX2RpczIJPSBJOTE1X1JFQUQoVkxWX0dVTklUX0NMT0NLX0dBVEUyKTsKKworCS8qCisJICogTm90IHNhdmluZyBhbnkgb2Y6CisJICogREZULAkJMHg5ODAwLTB4OUVDMAorCSAqIFNBUkIsCTB4QjAwMC0weEIxRkMKKwkgKiBHQUMsCQkweDUyMDgtMHg1MjRDLCAweDE0MDAwLTB4MTRDMDAwCisJICogUENJIENGRworCSAqLworfQorCitzdGF0aWMgdm9pZCB2bHZfcmVzdG9yZV9ndW5pdF9zMGl4X3N0YXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3Qgdmx2X3MwaXhfc3RhdGUgKnMgPSAmZGV2X3ByaXYtPnZsdl9zMGl4X3N0YXRlOworCXUzMiB2YWw7CisJaW50IGk7CisKKwkvKiBHQU0gMHg0MDAwLTB4NDc3MCAqLworCUk5MTVfV1JJVEUoR0VON19XUl9XQVRFUk1BUkssCXMtPndyX3dhdGVybWFyayk7CisJSTkxNV9XUklURShHRU43X0dGWF9QUklPX0NUUkwsCXMtPmdmeF9wcmlvX2N0cmwpOworCUk5MTVfV1JJVEUoQVJCX01PREUsCQlzLT5hcmJfbW9kZSB8ICgweGZmZmYgPDwgMTYpKTsKKwlJOTE1X1dSSVRFKEdFTjdfR0ZYX1BFTkRfVExCMCwJcy0+Z2Z4X3BlbmRfdGxiMCk7CisJSTkxNV9XUklURShHRU43X0dGWF9QRU5EX1RMQjEsCXMtPmdmeF9wZW5kX3RsYjEpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+bHJhX2xpbWl0cyk7IGkrKykKKwkJSTkxNV9XUklURShHRU43X0xSQV9MSU1JVFNfQkFTRSArIGkgKiA0LCBzLT5scmFfbGltaXRzW2ldKTsKKworCUk5MTVfV1JJVEUoR0VON19NRURJQV9NQVhfUkVRX0NPVU5ULCBzLT5tZWRpYV9tYXhfcmVxX2NvdW50KTsKKwlJOTE1X1dSSVRFKEdFTjdfTUVESUFfTUFYX1JFUV9DT1VOVCwgcy0+Z2Z4X21heF9yZXFfY291bnQpOworCisJSTkxNV9XUklURShSRU5ERVJfSFdTX1BHQV9HRU43LAlzLT5yZW5kZXJfaHdzcCk7CisJSTkxNV9XUklURShHQU1fRUNPQ0hLLAkJcy0+ZWNvY2hrKTsKKwlJOTE1X1dSSVRFKEJTRF9IV1NfUEdBX0dFTjcsCXMtPmJzZF9od3NwKTsKKwlJOTE1X1dSSVRFKEJMVF9IV1NfUEdBX0dFTjcsCXMtPmJsdF9od3NwKTsKKworCUk5MTVfV1JJVEUoR0VON19UTEJfUkRfQUREUiwJcy0+dGxiX3JkX2FkZHIpOworCisJLyogTUJDIDB4OTAyNC0weDkxRDAsIDB4ODUwMCAqLworCUk5MTVfV1JJVEUoVkxWX0czRENUTCwJCXMtPmczZGN0bCk7CisJSTkxNV9XUklURShWTFZfR1NDS0dDVEwsCXMtPmdzY2tnY3RsKTsKKwlJOTE1X1dSSVRFKEdFTjZfTUJDVEwsCQlzLT5tYmN0bCk7CisKKwkvKiBHQ1AgMHg5NDAwLTB4OTQyNCwgMHg4MTAwLTB4ODEwQyAqLworCUk5MTVfV1JJVEUoR0VONl9VQ0dDVEwxLAlzLT51Y2djdGwxKTsKKwlJOTE1X1dSSVRFKEdFTjZfVUNHQ1RMMywJcy0+dWNnY3RsMyk7CisJSTkxNV9XUklURShHRU42X1JDR0NUTDEsCXMtPnJjZ2N0bDEpOworCUk5MTVfV1JJVEUoR0VONl9SQ0dDVEwyLAlzLT5yY2djdGwyKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlNUQ1RMLAkJcy0+cnN0Y3RsKTsKKwlJOTE1X1dSSVRFKEdFTjdfTUlTQ0NQQ1RMLAlzLT5taXNjY3BjdGwpOworCisJLyogR1BNIDB4QTAwMC0weEFBODQsIDB4ODAwMC0weDgwRkMgKi8KKwlJOTE1X1dSSVRFKEdFTjZfR0ZYUEFVU0UsCXMtPmdmeHBhdXNlKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBERVVIV1RDLAlzLT5ycGRldWh3dGMpOworCUk5MTVfV1JJVEUoR0VONl9SUERFVUMsCQlzLT5ycGRldWMpOworCUk5MTVfV1JJVEUoRUNPQlVTLAkJcy0+ZWNvYnVzKTsKKwlJOTE1X1dSSVRFKFZMVl9QV1JEV05VUENUTCwJcy0+cHdyZHdudXBjdGwpOworCUk5MTVfV1JJVEUoR0VONl9SUF9ET1dOX1RJTUVPVVQscy0+cnBfZG93bl90aW1lb3V0KTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBERVVDU1csCXMtPnJwX2RldWNzdyk7CisJSTkxNV9XUklURShHRU42X1JDVUJNQUJEVE1SLAlzLT5yY3VibWFiZHRtcik7CisJSTkxNV9XUklURShWTFZfUkNFREFUQSwJCXMtPnJjZWRhdGEpOworCUk5MTVfV1JJVEUoVkxWX1NQQVJFRzJILAlzLT5zcGFyZTJnaCk7CisKKwkvKiBEaXNwbGF5IENaIGRvbWFpbiwgMHg0NDAwQy0weDQ0MDJDLCAweDRGMDAwLTB4NEYxMUYgKi8KKwlJOTE1X1dSSVRFKEdUSU1SLAkJcy0+Z3RfaW1yKTsKKwlJOTE1X1dSSVRFKEdUSUVSLAkJcy0+Z3RfaWVyKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsCQlzLT5wbV9pbXIpOworCUk5MTVfV1JJVEUoR0VONl9QTUlFUiwJCXMtPnBtX2llcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5ndF9zY3JhdGNoKTsgaSsrKQorCQlJOTE1X1dSSVRFKEdFTjdfR1RfU0NSQVRDSF9CQVNFICsgaSAqIDQsIHMtPmd0X3NjcmF0Y2hbaV0pOworCisJLyogR1QgU0EgQ1ogZG9tYWluLCAweDEwMDAwMC0weDEzODEyNCAqLworCUk5MTVfV1JJVEUoVElMRUNUTCwJCQlzLT50aWxlY3RsKTsKKwlJOTE1X1dSSVRFKEdURklGT0NUTCwJCQlzLT5ndF9maWZvY3RsKTsKKwkvKgorCSAqIFByZXNlcnZlIHRoZSBHVCBhbGxvdyB3YWtlIGFuZCBHRlggZm9yY2UgY2xvY2sgYml0LCB0aGV5IGFyZSBub3QKKwkgKiBiZSByZXN0b3JlZCwgYXMgdGhleSBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBzMGl4IHN1c3BlbmQvcmVzdW1lCisJICogc2VxdWVuY2UgYnkgdGhlIGNhbGxlci4KKwkgKi8KKwl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfV0FLRV9DVFJMKTsKKwl2YWwgJj0gVkxWX0dUTENfQUxMT1dXQUtFUkVROworCXZhbCB8PSBzLT5ndGxjX3dha2VfY3RybCAmIH5WTFZfR1RMQ19BTExPV1dBS0VSRVE7CisJSTkxNV9XUklURShWTFZfR1RMQ19XQUtFX0NUUkwsIHZhbCk7CisKKwl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcpOworCXZhbCAmPSBWTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQ7CisJdmFsIHw9IHMtPmd0bGNfc3Vydml2ZSAmIH5WTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQ7CisJSTkxNV9XUklURShWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRywgdmFsKTsKKworCUk5MTVfV1JJVEUoVkxWX1BNV0dJQ1osCQkJcy0+cG13Z2ljeik7CisKKwkvKiBHdW5pdC1EaXNwbGF5IENaIGRvbWFpbiwgMHgxODIwMjgtMHgxODIxQ0YgKi8KKwlJOTE1X1dSSVRFKFZMVl9HVV9DVEwwLAkJCXMtPmd1X2N0bDApOworCUk5MTVfV1JJVEUoVkxWX0dVX0NUTDEsCQkJcy0+Z3VfY3RsMSk7CisJSTkxNV9XUklURShWTFZfR1VOSVRfQ0xPQ0tfR0FURTIsCXMtPmNsb2NrX2dhdGVfZGlzMik7Cit9CisKK2ludCB2bHZfZm9yY2VfZ2Z4X2Nsb2NrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBmb3JjZV9vbikKK3sKKwl1MzIgdmFsOworCWludCBlcnI7CisKKwl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcpOworCVdBUk5fT04oISEodmFsICYgVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUKSA9PSBmb3JjZV9vbik7CisKKyNkZWZpbmUgQ09ORCAoSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHKSAmIFZMVl9HRlhfQ0xLX1NUQVRVU19CSVQpCisJLyogV2FpdCBmb3IgYSBwcmV2aW91cyBmb3JjZS1vZmYgdG8gc2V0dGxlICovCisJaWYgKGZvcmNlX29uKSB7CisJCWVyciA9IHdhaXRfZm9yKCFDT05ELCAyMCk7CisJCWlmIChlcnIpIHsKKwkJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBHRlggY2xvY2sgZm9yY2Utb2ZmICglMDh4KVxuIiwKKwkJCQkgIEk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRykpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXZhbCA9IEk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRyk7CisJdmFsICY9IH5WTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQ7CisJaWYgKGZvcmNlX29uKQorCQl2YWwgfD0gVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUOworCUk5MTVfV1JJVEUoVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcsIHZhbCk7CisKKwlpZiAoIWZvcmNlX29uKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHdhaXRfZm9yKENPTkQsIDIwKTsKKwlpZiAoZXJyKQorCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgR0ZYIGNsb2NrIGZvcmNlLW9uICglMDh4KVxuIiwKKwkJCSAgSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHKSk7CisKKwlyZXR1cm4gZXJyOworI3VuZGVmIENPTkQKK30KKworc3RhdGljIGludCB2bHZfYWxsb3dfZ3Rfd2FrZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgYWxsb3cpCit7CisJdTMyIHZhbDsKKwlpbnQgZXJyID0gMDsKKworCXZhbCA9IEk5MTVfUkVBRChWTFZfR1RMQ19XQUtFX0NUUkwpOworCXZhbCAmPSB+VkxWX0dUTENfQUxMT1dXQUtFUkVROworCWlmIChhbGxvdykKKwkJdmFsIHw9IFZMVl9HVExDX0FMTE9XV0FLRVJFUTsKKwlJOTE1X1dSSVRFKFZMVl9HVExDX1dBS0VfQ1RSTCwgdmFsKTsKKwlQT1NUSU5HX1JFQUQoVkxWX0dUTENfV0FLRV9DVFJMKTsKKworI2RlZmluZSBDT05EICghIShJOTE1X1JFQUQoVkxWX0dUTENfUFdfU1RBVFVTKSAmIFZMVl9HVExDX0FMTE9XV0FLRUFDSykgPT0gXAorCSAgICAgIGFsbG93KQorCWVyciA9IHdhaXRfZm9yKENPTkQsIDEpOworCWlmIChlcnIpCisJCURSTV9FUlJPUigidGltZW91dCBkaXNhYmxpbmcgR1Qgd2FraW5nXG4iKTsKKwlyZXR1cm4gZXJyOworI3VuZGVmIENPTkQKK30KKworc3RhdGljIGludCB2bHZfd2FpdF9mb3JfZ3Rfd2VsbHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSBib29sIHdhaXRfZm9yX29uKQoreworCXUzMiBtYXNrOworCXUzMiB2YWw7CisJaW50IGVycjsKKworCW1hc2sgPSBWTFZfR1RMQ19QV19NRURJQV9TVEFUVVNfTUFTSyB8IFZMVl9HVExDX1BXX1JFTkRFUl9TVEFUVVNfTUFTSzsKKwl2YWwgPSB3YWl0X2Zvcl9vbiA/IG1hc2sgOiAwOworI2RlZmluZSBDT05EICgoSTkxNV9SRUFEKFZMVl9HVExDX1BXX1NUQVRVUykgJiBtYXNrKSA9PSB2YWwpCisJaWYgKENPTkQpCisJCXJldHVybiAwOworCisJRFJNX0RFQlVHX0tNUygid2FpdGluZyBmb3IgR1Qgd2VsbHMgdG8gZ28gJXMgKCUwOHgpXG4iLAorCQkJd2FpdF9mb3Jfb24gPyAib24iIDogIm9mZiIsCisJCQlJOTE1X1JFQUQoVkxWX0dUTENfUFdfU1RBVFVTKSk7CisKKwkvKgorCSAqIFJDNiB0cmFuc2l0aW9uaW5nIGNhbiBiZSBkZWxheWVkIHVwIHRvIDIgbXNlYyAoc2VlCisJICogdmFsbGV5dmlld19lbmFibGVfcnBzKSwgdXNlIDMgbXNlYyBmb3Igc2FmZXR5LgorCSAqLworCWVyciA9IHdhaXRfZm9yKENPTkQsIDMpOworCWlmIChlcnIpCisJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBHVCB3ZWxscyB0byBnbyAlc1xuIiwKKwkJCSAgd2FpdF9mb3Jfb24gPyAib24iIDogIm9mZiIpOworCisJcmV0dXJuIGVycjsKKyN1bmRlZiBDT05ECit9CisKK3N0YXRpYyB2b2lkIHZsdl9jaGVja19ub19ndF9hY2Nlc3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWlmICghKEk5MTVfUkVBRChWTFZfR1RMQ19QV19TVEFUVVMpICYgVkxWX0dUTENfQUxMT1dXQUtFRVJSKSkKKwkJcmV0dXJuOworCisJRFJNX0VSUk9SKCJHVCByZWdpc3RlciBhY2Nlc3Mgd2hpbGUgR1Qgd2FraW5nIGRpc2FibGVkXG4iKTsKKwlJOTE1X1dSSVRFKFZMVl9HVExDX1BXX1NUQVRVUywgVkxWX0dUTENfQUxMT1dXQUtFRVJSKTsKK30KKworc3RhdGljIGludCB2bHZfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1MzIgbWFzazsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBCc3BlYyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgR1Qgd2VsbCBvbiBmbGFncyBhcyBkZWJ1ZyBvbmx5LCBzbworCSAqIGRvbid0IHRyZWF0IHRoZW0gYXMgaGFyZCBmYWlsdXJlcy4KKwkgKi8KKwkodm9pZCl2bHZfd2FpdF9mb3JfZ3Rfd2VsbHMoZGV2X3ByaXYsIGZhbHNlKTsKKworCW1hc2sgPSBWTFZfR1RMQ19SRU5ERVJfQ1RYX0VYSVNUUyB8IFZMVl9HVExDX01FRElBX0NUWF9FWElTVFM7CisJV0FSTl9PTigoSTkxNV9SRUFEKFZMVl9HVExDX1dBS0VfQ1RSTCkgJiBtYXNrKSAhPSBtYXNrKTsKKworCXZsdl9jaGVja19ub19ndF9hY2Nlc3MoZGV2X3ByaXYpOworCisJZXJyID0gdmx2X2ZvcmNlX2dmeF9jbG9jayhkZXZfcHJpdiwgdHJ1ZSk7CisJaWYgKGVycikKKwkJZ290byBlcnIxOworCisJZXJyID0gdmx2X2FsbG93X2d0X3dha2UoZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisJdmx2X3NhdmVfZ3VuaXRfczBpeF9zdGF0ZShkZXZfcHJpdik7CisKKwllcnIgPSB2bHZfZm9yY2VfZ2Z4X2Nsb2NrKGRldl9wcml2LCBmYWxzZSk7CisJaWYgKGVycikKKwkJZ290byBlcnIyOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJLyogRm9yIHNhZmV0eSBhbHdheXMgcmUtZW5hYmxlIHdha2luZyBhbmQgZGlzYWJsZSBnZnggY2xvY2sgZm9yY2luZyAqLworCXZsdl9hbGxvd19ndF93YWtlKGRldl9wcml2LCB0cnVlKTsKK2VycjE6CisJdmx2X2ZvcmNlX2dmeF9jbG9jayhkZXZfcHJpdiwgZmFsc2UpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bHZfcnVudGltZV9yZXN1bWUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWludCBlcnI7CisJaW50IHJldDsKKworCS8qCisJICogSWYgYW55IG9mIHRoZSBzdGVwcyBmYWlsIGp1c3QgdHJ5IHRvIGNvbnRpbnVlLCB0aGF0J3MgdGhlIGJlc3Qgd2UKKwkgKiBjYW4gZG8gYXQgdGhpcyBwb2ludC4gUmV0dXJuIHRoZSBmaXJzdCBlcnJvciBjb2RlICh3aGljaCB3aWxsIGFsc28KKwkgKiBsZWF2ZSBSUE0gcGVybWFuZW50bHkgZGlzYWJsZWQpLgorCSAqLworCXJldCA9IHZsdl9mb3JjZV9nZnhfY2xvY2soZGV2X3ByaXYsIHRydWUpOworCisJdmx2X3Jlc3RvcmVfZ3VuaXRfczBpeF9zdGF0ZShkZXZfcHJpdik7CisKKwllcnIgPSB2bHZfYWxsb3dfZ3Rfd2FrZShkZXZfcHJpdiwgdHJ1ZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKworCWVyciA9IHZsdl9mb3JjZV9nZnhfY2xvY2soZGV2X3ByaXYsIGZhbHNlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCisJdmx2X2NoZWNrX25vX2d0X2FjY2VzcyhkZXZfcHJpdik7CisKKwlpbnRlbF9pbml0X2Nsb2NrX2dhdGluZyhkZXYpOworCWk5MTVfZ2VtX3Jlc3RvcmVfZmVuY2VzKGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTl9PTkNFKCEoZGV2X3ByaXYtPnJwcy5lbmFibGVkICYmIGludGVsX2VuYWJsZV9yYzYoZGV2KSkpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCVdBUk5fT04oIUhBU19SVU5USU1FX1BNKGRldikpOwogCWFzc2VydF9mb3JjZV93YWtlX2luYWN0aXZlKGRldl9wcml2KTsKIAogCURSTV9ERUJVR19LTVMoIlN1c3BlbmRpbmcgZGV2aWNlXG4iKTsKIAotCWlmIChIQVNfUEM4KGRldikpCi0JCWhzd19lbmFibGVfcGM4KGRldl9wcml2KTsKKwkvKgorCSAqIFdlIGNvdWxkIGRlYWRsb2NrIGhlcmUgaW4gY2FzZSBhbm90aGVyIHRocmVhZCBob2xkaW5nIHN0cnVjdF9tdXRleAorCSAqIGNhbGxzIFJQTSBzdXNwZW5kIGNvbmN1cnJlbnRseSwgc2luY2UgdGhlIFJQTSBzdXNwZW5kIHdpbGwgd2FpdAorCSAqIGZpcnN0IGZvciB0aGlzIFJQTSBzdXNwZW5kIHRvIGZpbmlzaC4gSW4gdGhpcyBjYXNlIHRoZSBjb25jdXJyZW50CisJICogUlBNIHJlc3VtZSB3aWxsIGJlIGZvbGxvd2VkIGJ5IGl0cyBSUE0gc3VzcGVuZCBjb3VudGVycGFydC4gU3RpbGwKKwkgKiBmb3IgY29uc2lzdGVuY3kgcmV0dXJuIC1FQUdBSU4sIHdoaWNoIHdpbGwgcmVzY2hlZHVsZSB0aGlzIHN1c3BlbmQuCisJICovCisJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpIHsKKwkJRFJNX0RFQlVHX0tNUygiZGV2aWNlIGxvY2sgY29udGVudGlvbiwgZGVmZmVyaW5nIHN1c3BlbmRcbiIpOworCQkvKgorCQkgKiBCdW1wIHRoZSBleHBpcmF0aW9uIHRpbWVzdGFtcCwgb3RoZXJ3aXNlIHRoZSBzdXNwZW5kIHdvbid0CisJCSAqIGJlIHJlc2NoZWR1bGVkLgorCQkgKi8KKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXZpY2UpOwogCisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIFdlIGFyZSBzYWZlIGhlcmUgYWdhaW5zdCByZS1mYXVsdHMsIHNpbmNlIHRoZSBmYXVsdCBoYW5kbGVyIHRha2VzCisJICogYW4gUlBNIHJlZmVyZW5jZS4KKwkgKi8KIAlpOTE1X2dlbV9yZWxlYXNlX2FsbF9tbWFwcyhkZXZfcHJpdik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKgorCSAqIHJwcy53b3JrIGNhbid0IGJlIHJlYXJtZWQgaGVyZSwgc2luY2Ugd2UgZ2V0IGhlcmUgb25seSBhZnRlciBtYWtpbmcKKwkgKiBzdXJlIHRoZSBHUFUgaXMgaWRsZSBhbmQgdGhlIFJQUyBmcmVxIGlzIHNldCB0byB0aGUgbWluaW11bS4gU2VlCisJICogaW50ZWxfbWFya19pZGxlKCkuCisJICovCisJY2FuY2VsX3dvcmtfc3luYygmZGV2X3ByaXYtPnJwcy53b3JrKTsKKwlpbnRlbF9ydW50aW1lX3BtX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCisJaWYgKElTX0dFTjYoZGV2KSkgeworCQlyZXQgPSAwOworCX0gZWxzZSBpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKSB7CisJCXJldCA9IGhzd19ydW50aW1lX3N1c3BlbmQoZGV2X3ByaXYpOworCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJCXJldCA9IHZsdl9ydW50aW1lX3N1c3BlbmQoZGV2X3ByaXYpOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9ERVY7CisJCVdBUk5fT04oMSk7CisJfQorCisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIlJ1bnRpbWUgc3VzcGVuZCBmYWlsZWQsIGRpc2FibGluZyBpdCAoJWQpXG4iLCByZXQpOworCQlpbnRlbF9ydW50aW1lX3BtX3Jlc3RvcmVfaW50ZXJydXB0cyhkZXYpOworCisJCXJldHVybiByZXQ7CisJfQogCiAJZGVsX3RpbWVyX3N5bmMoJmRldl9wcml2LT5ncHVfZXJyb3IuaGFuZ2NoZWNrX3RpbWVyKTsKIAlkZXZfcHJpdi0+cG0uc3VzcGVuZGVkID0gdHJ1ZTsKQEAgLTkyMywxMSArMTQyMywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBpbnRlbF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CiAKIAlXQVJOX09OKCFIQVNfUlVOVElNRV9QTShkZXYpKTsKIApAQCAtOTM2LDExICsxNDM3LDMzIEBACiAJaW50ZWxfb3ByZWdpb25fbm90aWZ5X2FkYXB0ZXIoZGV2LCBQQ0lfRDApOwogCWRldl9wcml2LT5wbS5zdXNwZW5kZWQgPSBmYWxzZTsKIAotCWlmIChIQVNfUEM4KGRldikpCi0JCWhzd19kaXNhYmxlX3BjOChkZXZfcHJpdik7CisJaWYgKElTX0dFTjYoZGV2KSkgeworCQlyZXQgPSBzbmJfcnVudGltZV9yZXN1bWUoZGV2X3ByaXYpOworCX0gZWxzZSBpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKSB7CisJCXJldCA9IGhzd19ydW50aW1lX3Jlc3VtZShkZXZfcHJpdik7CisJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKKwkJcmV0ID0gdmx2X3J1bnRpbWVfcmVzdW1lKGRldl9wcml2KTsKKwl9IGVsc2UgeworCQlXQVJOX09OKDEpOworCQlyZXQgPSAtRU5PREVWOworCX0KIAotCURSTV9ERUJVR19LTVMoIkRldmljZSByZXN1bWVkXG4iKTsKLQlyZXR1cm4gMDsKKwkvKgorCSAqIE5vIHBvaW50IG9mIHJvbGxpbmcgYmFjayB0aGluZ3MgaW4gY2FzZSBvZiBhbiBlcnJvciwgYXMgdGhlIGJlc3QKKwkgKiB3ZSBjYW4gZG8gaXMgdG8gaG9wZSB0aGF0IHRoaW5ncyB3aWxsIHN0aWxsIHdvcmsgKGFuZCBkaXNhYmxlIFJQTSkuCisJICovCisJaTkxNV9nZW1faW5pdF9zd2l6emxpbmcoZGV2KTsKKwlnZW42X3VwZGF0ZV9yaW5nX2ZyZXEoZGV2KTsKKworCWludGVsX3J1bnRpbWVfcG1fcmVzdG9yZV9pbnRlcnJ1cHRzKGRldik7CisJaW50ZWxfcmVzZXRfZ3RfcG93ZXJzYXZlKGRldik7CisKKwlpZiAocmV0KQorCQlEUk1fRVJST1IoIlJ1bnRpbWUgcmVzdW1lIGZhaWxlZCwgZGlzYWJsaW5nIGl0ICglZClcbiIsIHJldCk7CisJZWxzZQorCQlEUk1fREVCVUdfS01TKCJEZXZpY2UgcmVzdW1lZFxuIik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaTkxNV9wbV9vcHMgPSB7CkBAIC05NTQsOCArMTQ3Nyw4IEBACiAJLnBvd2Vyb2ZmID0gaTkxNV9wbV9wb3dlcm9mZiwKIAkucmVzdG9yZV9lYXJseSA9IGk5MTVfcG1fcmVzdW1lX2Vhcmx5LAogCS5yZXN0b3JlID0gaTkxNV9wbV9yZXN1bWUsCi0JLnJ1bnRpbWVfc3VzcGVuZCA9IGk5MTVfcnVudGltZV9zdXNwZW5kLAotCS5ydW50aW1lX3Jlc3VtZSA9IGk5MTVfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfc3VzcGVuZCA9IGludGVsX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBpbnRlbF9ydW50aW1lX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaTkxNV9nZW1fdm1fb3BzID0gewpAQCAtMTA2Miw2ICsxNTg1LDcgQEAKIAkJZHJpdmVyLmdldF92YmxhbmtfdGltZXN0YW1wID0gTlVMTDsKICNpZm5kZWYgQ09ORklHX0RSTV9JOTE1X1VNUwogCQkvKiBTaWxlbnRseSBmYWlsIGxvYWRpbmcgdG8gbm90IHVwc2V0IHVzZXJzcGFjZS4gKi8KKwkJRFJNX0RFQlVHX0RSSVZFUigiS01TIGFuZCBVTVMgZGlzYWJsZWQuXG4iKTsKIAkJcmV0dXJuIDA7CiAjZW5kaWYKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCAzODhjMDI4Li40OTQxNGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTM1LDExICszNSwxMyBAQAogI2luY2x1ZGUgImk5MTVfcmVnLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgogI2luY2x1ZGUgImludGVsX3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJpOTE1X2dlbV9ndHQuaCIKICNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8ZHJtL2ludGVsLWd0dC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgpAQCAtOTEsNyArOTMsNyBAQAogfTsKICNkZWZpbmUgcG9ydF9uYW1lKHApICgocCkgKyAnQScpCiAKLSNkZWZpbmUgSTkxNV9OVU1fUEhZU19WTFYgMQorI2RlZmluZSBJOTE1X05VTV9QSFlTX1ZMViAyCiAKIGVudW0gZHBpb19jaGFubmVsIHsKIAlEUElPX0NIMCwKQEAgLTE2Miw2ICsxNjQsMTIgQEAKICNkZWZpbmUgZm9yX2VhY2hfcGlwZShwKSBmb3IgKChwKSA9IDA7IChwKSA8IElOVEVMX0lORk8oZGV2KS0+bnVtX3BpcGVzOyAocCkrKykKICNkZWZpbmUgZm9yX2VhY2hfc3ByaXRlKHAsIHMpIGZvciAoKHMpID0gMDsgKHMpIDwgSU5URUxfSU5GTyhkZXYpLT5udW1fc3ByaXRlc1socCldOyAocykrKykKIAorI2RlZmluZSBmb3JfZWFjaF9jcnRjKGRldiwgY3J0YykgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQorCisjZGVmaW5lIGZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBpbnRlbF9jcnRjKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlbF9jcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGJhc2UuaGVhZCkKKwogI2RlZmluZSBmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoZGV2LCBfX2NydGMsIGludGVsX2VuY29kZXIpIFwKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KChpbnRlbF9lbmNvZGVyKSwgJihkZXYpLT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGJhc2UuaGVhZCkgXAogCQlpZiAoKGludGVsX2VuY29kZXIpLT5iYXNlLmNydGMgPT0gKF9fY3J0YykpCkBAIC0xNzEsNiArMTc5LDcgQEAKIAkJaWYgKChpbnRlbF9jb25uZWN0b3IpLT5iYXNlLmVuY29kZXIgPT0gKF9fZW5jb2RlcikpCiAKIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlOworc3RydWN0IGk5MTVfbW11X29iamVjdDsKIAogZW51bSBpbnRlbF9kcGxsX2lkIHsKIAlEUExMX0lEX1BSSVZBVEUgPSAtMSwgLyogbm9uLXNoYXJlZCBkcGxsIGluIHVzZSAqLwpAQCAtMzEyLDcgKzMyMSw2IEBACiAJdTMyIGdhYl9jdGw7CiAJdTMyIGdmeF9tb2RlOwogCXUzMiBleHRyYV9pbnN0ZG9uZVtJOTE1X05VTV9JTlNURE9ORV9SRUddOwotCXUzMiBwaXBlc3RhdFtJOTE1X01BWF9QSVBFU107CiAJdTY0IGZlbmNlW0k5MTVfTUFYX05VTV9GRU5DRVNdOwogCXN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0YXRlICpvdmVybGF5OwogCXN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICpkaXNwbGF5OwpAQCAtMzQ2LDcgKzM1NCw3IEBACiAJCXU2NCBiYmFkZHI7CiAJCXU2NCBhY3RoZDsKIAkJdTMyIGZhdWx0X3JlZzsKLQkJdTMyIGZhZGRyOworCQl1NjQgZmFkZHI7CiAJCXUzMiByY19wc21pOyAvKiBzbGVlcCBzdGF0ZSAqLwogCQl1MzIgc2VtYXBob3JlX21ib3hlc1tJOTE1X05VTV9SSU5HUyAtIDFdOwogCkBAIC0zODUsNiArMzkzLDcgQEAKIAkJdTMyIHRpbGluZzoyOwogCQl1MzIgZGlydHk6MTsKIAkJdTMyIHB1cmdlYWJsZToxOworCQl1MzIgdXNlcnB0cjoxOwogCQlzMzIgcmluZzo0OwogCQl1MzIgY2FjaGVfbGV2ZWw6MzsKIAl9ICoqYWN0aXZlX2JvLCAqKnBpbm5lZF9ibzsKQEAgLTQ0OSwxMCArNDU4LDExIEBACiAJaW50ICgqcXVldWVfZmxpcCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKIAkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCSAgdWludDMyX3QgZmxhZ3MpOwotCWludCAoKnVwZGF0ZV9wcmltYXJ5X3BsYW5lKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAotCQkJCSAgICBpbnQgeCwgaW50IHkpOworCXZvaWQgKCp1cGRhdGVfcHJpbWFyeV9wbGFuZSkoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgICBpbnQgeCwgaW50IHkpOwogCXZvaWQgKCpocGRfaXJxX3NldHVwKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAkvKiBjbG9jayB1cGRhdGVzIGZvciBtb2RlIHNldCAqLwogCS8qIGN1cnNvciB1cGRhdGVzICovCkBAIC01NDUsNiArNTU1LDcgQEAKIAlpbnQgZHBsbF9vZmZzZXRzW0k5MTVfTUFYX1BJUEVTXTsKIAlpbnQgZHBsbF9tZF9vZmZzZXRzW0k5MTVfTUFYX1BJUEVTXTsKIAlpbnQgcGFsZXR0ZV9vZmZzZXRzW0k5MTVfTUFYX1BJUEVTXTsKKwlpbnQgY3Vyc29yX29mZnNldHNbSTkxNV9NQVhfUElQRVNdOwogfTsKIAogI3VuZGVmIERFRklORV9GTEFHCkBAIC01NjAsMTY4ICs1NzEsNiBAQAogCUk5MTVfQ0FDSEVfV1QsIC8qIGhzdzpndDNlIFdyaXRlVGhyb3VnaCBmb3Igc2Nhbm91dHMgKi8KIH07CiAKLXR5cGVkZWYgdWludDMyX3QgZ2VuNl9ndHRfcHRlX3Q7Ci0KLS8qKgotICogQSBWTUEgcmVwcmVzZW50cyBhIEdFTSBCTyB0aGF0IGlzIGJvdW5kIGludG8gYW4gYWRkcmVzcyBzcGFjZS4gVGhlcmVmb3JlLCBhCi0gKiBWTUEncyBwcmVzZW5jZSBjYW5ub3QgYmUgZ3VhcmFudGVlZCBiZWZvcmUgYmluZGluZywgb3IgYWZ0ZXIgdW5iaW5kaW5nIHRoZQotICogb2JqZWN0IGludG8vZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAqCi0gKiBUbyBtYWtlIHRoaW5ncyBhcyBzaW1wbGUgYXMgcG9zc2libGUgKGllLiBubyByZWZjb3VudGluZyksIGEgVk1BJ3MgbGlmZXRpbWUKLSAqIHdpbGwgYWx3YXlzIGJlIDw9IGFuIG9iamVjdHMgbGlmZXRpbWUuIFNvIG9iamVjdCByZWZjb3VudGluZyBzaG91bGQgY292ZXIgdXMuCi0gKi8KLXN0cnVjdCBpOTE1X3ZtYSB7Ci0Jc3RydWN0IGRybV9tbV9ub2RlIG5vZGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKLQotCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIG9uIHRoZSBhY3RpdmUvaW5hY3RpdmUgbGlzdHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIG1tX2xpc3Q7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIHZtYV9saW5rOyAvKiBMaW5rIGluIHRoZSBvYmplY3QncyBWTUEgbGlzdCAqLwotCi0JLyoqIFRoaXMgdm1hJ3MgcGxhY2UgaW4gdGhlIGJhdGNoYnVmZmVyIG9yIG9uIHRoZSBldmljdGlvbiBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBleGVjX2xpc3Q7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmluZyBleGVjYnVmZmVyIGluc2VydGlvbi4KLQkgKi8KLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBleGVjX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBleGVjX2hhbmRsZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlY19lbnRyeTsKLQotCS8qKgotCSAqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxvd2luZwotCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQgbW9zdCBvbmUgcmVmZXJlbmNlOiBwd3JpdGUvcHJlYWQsIHBpbl9pb2N0bAotCSAqICh2aWEgdXNlcl9waW5fY291bnQpLCBleGVjYnVmZmVyIChvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBtdWx0aXBsZQotCSAqIHRpbWVzIGZvciB0aGUgc2FtZSBiYXRjaGJ1ZmZlciksIGFuZCB0aGUgZnJhbWVidWZmZXIgY29kZS4gV2hlbgotCSAqIHN3aXRjaGluZy9wYWdlZmxpcHBpbmcsIHRoZSBmcmFtZWJ1ZmZlciBjb2RlIGhhcyBhdCBtb3N0IHR3byBidWZmZXJzCi0JICogcGlubmVkIHBlciBjcnRjLgotCSAqCi0JICogSW4gdGhlIHdvcnN0IGNhc2UgdGhpcyBpcyAxICsgMSArIDEgKyAyKjIgPSA3LiBUaGF0IHdvdWxkIGZpdCBpbnRvIDMKLQkgKiBiaXRzIHdpdGggYWJzb2x1dGVseSBubyBoZWFkcm9vbS4gU28gdXNlIDQgYml0cy4gKi8KLQl1bnNpZ25lZCBpbnQgcGluX2NvdW50OjQ7Ci0jZGVmaW5lIERSTV9JOTE1X0dFTV9PQkpFQ1RfTUFYX1BJTl9DT1VOVCAweGYKLQotCS8qKiBVbm1hcCBhbiBvYmplY3QgZnJvbSBhbiBhZGRyZXNzIHNwYWNlLiBUaGlzIHVzdWFsbHkgY29uc2lzdHMgb2YKLQkgKiBzZXR0aW5nIHRoZSB2YWxpZCBQVEUgZW50cmllcyB0byBhIHJlc2VydmVkIHNjcmF0Y2ggcGFnZS4gKi8KLQl2b2lkICgqdW5iaW5kX3ZtYSkoc3RydWN0IGk5MTVfdm1hICp2bWEpOwotCS8qIE1hcCBhbiBvYmplY3QgaW50byBhbiBhZGRyZXNzIHNwYWNlIHdpdGggdGhlIGdpdmVuIGNhY2hlIGZsYWdzLiAqLwotI2RlZmluZSBHTE9CQUxfQklORCAoMTw8MCkKLQl2b2lkICgqYmluZF92bWEpKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKLQkJCSB1MzIgZmxhZ3MpOwotfTsKLQotc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSB7Ci0Jc3RydWN0IGRybV9tbSBtbTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2xpbms7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsJCS8qIFN0YXJ0IG9mZnNldCBhbHdheXMgMCBmb3IgZHJpMiAqLwotCXNpemVfdCB0b3RhbDsJCS8qIHNpemUgYWRkciBzcGFjZSBtYXBzIChleC4gMkdCIGZvciBnZ3R0KSAqLwotCi0Jc3RydWN0IHsKLQkJZG1hX2FkZHJfdCBhZGRyOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl9IHNjcmF0Y2g7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGludm9sdmVkIGluIHJlbmRlcmluZy4KLQkgKgotCSAqIEluY2x1ZGVzIGJ1ZmZlcnMgaGF2aW5nIHRoZSBjb250ZW50cyBvZiB0aGVpciBHUFUgY2FjaGVzCi0JICogZmx1c2hlZCwgbm90IG5lY2Vzc2FyaWx5IHByaW1pdGl2ZXMuICBsYXN0X3JlbmRlcmluZ19zZXFubwotCSAqIHJlcHJlc2VudHMgd2hlbiB0aGUgcmVuZGVyaW5nIGludm9sdmVkIHdpbGwgYmUgY29tcGxldGVkLgotCSAqCi0JICogQSByZWZlcmVuY2UgaXMgaGVsZCBvbiB0aGUgYnVmZmVyIHdoaWxlIG9uIHRoaXMgbGlzdC4KLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0OwotCi0JLyoqCi0JICogTFJVIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCBhcmUgbm90IGluIHRoZSByaW5nYnVmZmVyIGFuZAotCSAqIGFyZSByZWFkeSB0byB1bmJpbmQsIGJ1dCBhcmUgc3RpbGwgaW4gdGhlIEdUVC4KLQkgKgotCSAqIGxhc3RfcmVuZGVyaW5nX3NlcW5vIGlzIDAgd2hpbGUgYW4gb2JqZWN0IGlzIGluIHRoaXMgbGlzdC4KLQkgKgotCSAqIEEgcmVmZXJlbmNlIGlzIG5vdCBoZWxkIG9uIHRoZSBidWZmZXIgd2hpbGUgb24gdGhpcyBsaXN0LAotCSAqIGFzIG1lcmVseSBiZWluZyBHVFQtYm91bmQgc2hvdWxkbid0IHByZXZlbnQgaXRzIGJlaW5nCi0JICogZnJlZWQsIGFuZCB3ZSdsbCBwdWxsIGl0IG9mZiB0aGUgbGlzdCBpbiB0aGUgZnJlZSBwYXRoLgotCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgaW5hY3RpdmVfbGlzdDsKLQotCS8qIEZJWE1FOiBOZWVkIGEgbW9yZSBnZW5lcmljIHJldHVybiB0eXBlICovCi0JZ2VuNl9ndHRfcHRlX3QgKCpwdGVfZW5jb2RlKShkbWFfYWRkcl90IGFkZHIsCi0JCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCi0JCQkJICAgICBib29sIHZhbGlkKTsgLyogQ3JlYXRlIGEgdmFsaWQgUFRFICovCi0Jdm9pZCAoKmNsZWFyX3JhbmdlKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICB1aW50NjRfdCBzdGFydCwKLQkJCSAgICB1aW50NjRfdCBsZW5ndGgsCi0JCQkgICAgYm9vbCB1c2Vfc2NyYXRjaCk7Ci0Jdm9pZCAoKmluc2VydF9lbnRyaWVzKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnN0LAotCQkJICAgICAgIHVpbnQ2NF90IHN0YXJ0LAotCQkJICAgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCk7Ci0Jdm9pZCAoKmNsZWFudXApKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKTsKLX07Ci0KLS8qIFRoZSBHcmFwaGljcyBUcmFuc2xhdGlvbiBUYWJsZSBpcyB0aGUgd2F5IGluIHdoaWNoIEdFTiBoYXJkd2FyZSB0cmFuc2xhdGVzIGEKLSAqIEdyYXBoaWNzIFZpcnR1YWwgQWRkcmVzcyBpbnRvIGEgUGh5c2ljYWwgQWRkcmVzcy4gSW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbAotICogY29sbGF0ZXJhbCBhc3NvY2lhdGVkIHdpdGggYW55IHZhLT5wYSB0cmFuc2xhdGlvbnMgR0VOIGhhcmR3YXJlIGFsc28gaGFzIGEKLSAqIHBvcnRpb24gb2YgdGhlIEdUVCB3aGljaCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBDUFUgYW5kIHJlbWFpbiBib3RoIGNvaGVyZW50Ci0gKiBhbmQgY29ycmVjdCAoaW4gY2FzZXMgbGlrZSBzd2l6emxpbmcpLiBUaGF0IHJlZ2lvbiBpcyByZWZlcnJlZCB0byBhcyBHTUFEUiBpbgotICogdGhlIHNwZWMuCi0gKi8KLXN0cnVjdCBpOTE1X2d0dCB7Ci0Jc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSBiYXNlOwotCXNpemVfdCBzdG9sZW5fc2l6ZTsJCS8qIFRvdGFsIHNpemUgb2Ygc3RvbGVuIG1lbW9yeSAqLwotCi0JdW5zaWduZWQgbG9uZyBtYXBwYWJsZV9lbmQ7CS8qIEVuZCBvZmZzZXQgdGhhdCB3ZSBjYW4gQ1BVIG1hcCAqLwotCXN0cnVjdCBpb19tYXBwaW5nICptYXBwYWJsZTsJLyogTWFwcGluZyB0byBvdXIgQ1BVIG1hcHBhYmxlIHJlZ2lvbiAqLwotCXBoeXNfYWRkcl90IG1hcHBhYmxlX2Jhc2U7CS8qIFBBIG9mIG91ciBHTUFEUiAqLwotCi0JLyoqICJHcmFwaGljcyBTdG9sZW4gTWVtb3J5IiBob2xkcyB0aGUgZ2xvYmFsIFBURXMgKi8KLQl2b2lkIF9faW9tZW0gKmdzbTsKLQotCWJvb2wgZG9faWRsZV9tYXBzOwotCi0JaW50IG10cnI7Ci0KLQkvKiBnbG9iYWwgZ3R0IG9wcyAqLwotCWludCAoKmd0dF9wcm9iZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc2l6ZV90ICpndHRfdG90YWwsCi0JCQkgIHNpemVfdCAqc3RvbGVuLCBwaHlzX2FkZHJfdCAqbWFwcGFibGVfYmFzZSwKLQkJCSAgdW5zaWduZWQgbG9uZyAqbWFwcGFibGVfZW5kKTsKLX07Ci0jZGVmaW5lIGd0dF90b3RhbF9lbnRyaWVzKGd0dCkgKChndHQpLmJhc2UudG90YWwgPj4gUEFHRV9TSElGVCkKLQotI2RlZmluZSBHRU44X0xFR0FDWV9QRFBTIDQKLXN0cnVjdCBpOTE1X2h3X3BwZ3R0IHsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlIGJhc2U7Ci0Jc3RydWN0IGtyZWYgcmVmOwotCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOwotCXVuc2lnbmVkIG51bV9wZF9lbnRyaWVzOwotCXVuc2lnbmVkIG51bV9wZF9wYWdlczsgLyogZ2VuOCsgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCBwYWdlICoqcHRfcGFnZXM7Ci0JCXN0cnVjdCBwYWdlICoqZ2VuOF9wdF9wYWdlc1tHRU44X0xFR0FDWV9QRFBTXTsKLQl9OwotCXN0cnVjdCBwYWdlICpwZF9wYWdlczsKLQl1bmlvbiB7Ci0JCXVpbnQzMl90IHBkX29mZnNldDsKLQkJZG1hX2FkZHJfdCBwZF9kbWFfYWRkcltHRU44X0xFR0FDWV9QRFBTXTsKLQl9OwotCXVuaW9uIHsKLQkJZG1hX2FkZHJfdCAqcHRfZG1hX2FkZHI7Ci0JCWRtYV9hZGRyX3QgKmdlbjhfcHRfZG1hX2FkZHJbNF07Ci0JfTsKLQotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eDsKLQotCWludCAoKmVuYWJsZSkoc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0KTsKLQlpbnQgKCpzd2l0Y2hfbW0pKHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgYm9vbCBzeW5jaHJvbm91cyk7Ci0Jdm9pZCAoKmRlYnVnX2R1bXApKHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCwgc3RydWN0IHNlcV9maWxlICptKTsKLX07Ci0KIHN0cnVjdCBpOTE1X2N0eF9oYW5nX3N0YXRzIHsKIAkvKiBUaGlzIGNvbnRleHQgaGFkIGJhdGNoIHBlbmRpbmcgd2hlbiBoYW5nIHdhcyBkZWNsYXJlZCAqLwogCXVuc2lnbmVkIGJhdGNoX3BlbmRpbmc7CkBAIC03MzgsMTMgKzU4NywxMyBAQAogCiAvKiBUaGlzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgdmFsdWUgcHJldmlvdXNseSB1c2VkIGZvciBleGVjYnVmMi5yc3ZkMS4gKi8KICNkZWZpbmUgREVGQVVMVF9DT05URVhUX0lEIDAKLXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgeworc3RydWN0IGludGVsX2NvbnRleHQgewogCXN0cnVjdCBrcmVmIHJlZjsKIAlpbnQgaWQ7CiAJYm9vbCBpc19pbml0aWFsaXplZDsKIAl1aW50OF90IHJlbWFwX3NsaWNlOwogCXN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdjsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKmxhc3RfcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpsYXN0X3Jpbmc7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgaTkxNV9jdHhfaGFuZ19zdGF0cyBoYW5nX3N0YXRzOwogCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtOwpAQCAtNzgyLDYgKzYzMSwxMCBAQAogCX0gbm9fZmJjX3JlYXNvbjsKIH07CiAKK3N0cnVjdCBpOTE1X2RycnMgeworCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcjsKK307CisKIHN0cnVjdCBpOTE1X3BzciB7CiAJYm9vbCBzaW5rX3N1cHBvcnQ7CiAJYm9vbCBzb3VyY2Vfb2s7CkBAIC05NjUsNiArODE4LDY3IEBACiAJdTMyIHNhdmVQQ0hfUE9SVF9IT1RQTFVHOwogfTsKIAorc3RydWN0IHZsdl9zMGl4X3N0YXRlIHsKKwkvKiBHQU0gKi8KKwl1MzIgd3Jfd2F0ZXJtYXJrOworCXUzMiBnZnhfcHJpb19jdHJsOworCXUzMiBhcmJfbW9kZTsKKwl1MzIgZ2Z4X3BlbmRfdGxiMDsKKwl1MzIgZ2Z4X3BlbmRfdGxiMTsKKwl1MzIgbHJhX2xpbWl0c1tHRU43X0xSQV9MSU1JVFNfUkVHX05VTV07CisJdTMyIG1lZGlhX21heF9yZXFfY291bnQ7CisJdTMyIGdmeF9tYXhfcmVxX2NvdW50OworCXUzMiByZW5kZXJfaHdzcDsKKwl1MzIgZWNvY2hrOworCXUzMiBic2RfaHdzcDsKKwl1MzIgYmx0X2h3c3A7CisJdTMyIHRsYl9yZF9hZGRyOworCisJLyogTUJDICovCisJdTMyIGczZGN0bDsKKwl1MzIgZ3Nja2djdGw7CisJdTMyIG1iY3RsOworCisJLyogR0NQICovCisJdTMyIHVjZ2N0bDE7CisJdTMyIHVjZ2N0bDM7CisJdTMyIHJjZ2N0bDE7CisJdTMyIHJjZ2N0bDI7CisJdTMyIHJzdGN0bDsKKwl1MzIgbWlzY2NwY3RsOworCisJLyogR1BNICovCisJdTMyIGdmeHBhdXNlOworCXUzMiBycGRldWh3dGM7CisJdTMyIHJwZGV1YzsKKwl1MzIgZWNvYnVzOworCXUzMiBwd3Jkd251cGN0bDsKKwl1MzIgcnBfZG93bl90aW1lb3V0OworCXUzMiBycF9kZXVjc3c7CisJdTMyIHJjdWJtYWJkdG1yOworCXUzMiByY2VkYXRhOworCXUzMiBzcGFyZTJnaDsKKworCS8qIERpc3BsYXkgMSBDWiBkb21haW4gKi8KKwl1MzIgZ3RfaW1yOworCXUzMiBndF9pZXI7CisJdTMyIHBtX2ltcjsKKwl1MzIgcG1faWVyOworCXUzMiBndF9zY3JhdGNoW0dFTjdfR1RfU0NSQVRDSF9SRUdfTlVNXTsKKworCS8qIEdUIFNBIENaIGRvbWFpbiAqLworCXUzMiB0aWxlY3RsOworCXUzMiBndF9maWZvY3RsOworCXUzMiBndGxjX3dha2VfY3RybDsKKwl1MzIgZ3RsY19zdXJ2aXZlOworCXUzMiBwbXdnaWN6OworCisJLyogRGlzcGxheSAyIENaIGRvbWFpbiAqLworCXUzMiBndV9jdGwwOworCXUzMiBndV9jdGwxOworCXUzMiBjbG9ja19nYXRlX2RpczI7Cit9OworCiBzdHJ1Y3QgaW50ZWxfZ2VuNl9wb3dlcl9tZ210IHsKIAkvKiB3b3JrIGFuZCBwbV9paXIgYXJlIHByb3RlY3RlZCBieSBkZXZfcHJpdi0+aXJxX2xvY2sgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKQEAgLTEwNzQsNiArOTg4LDcgQEAKIAkgKiB0aW1lIGFyZSBvbi4gVGhleSBhcmUga2VwdCBvbiB1bnRpbCBhZnRlciB0aGUgZmlyc3QgbW9kZXNldC4KIAkgKi8KIAlib29sIGluaXRfcG93ZXJfb247CisJYm9vbCBpbml0aWFsaXppbmc7CiAJaW50IHBvd2VyX3dlbGxfY291bnQ7CiAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKQEAgLTExMzIsNyArMTA0Nyw4IEBACiAJLyoqIFBQR1RUIHVzZWQgZm9yIGFsaWFzaW5nIHRoZSBQUEdUVCB3aXRoIHRoZSBHVFQgKi8KIAlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqYWxpYXNpbmdfcHBndHQ7CiAKLQlzdHJ1Y3Qgc2hyaW5rZXIgaW5hY3RpdmVfc2hyaW5rZXI7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG9vbV9ub3RpZmllcjsKKwlzdHJ1Y3Qgc2hyaW5rZXIgc2hyaW5rZXI7CiAJYm9vbCBzaHJpbmtlcl9ub19sb2NrX3N0ZWFsaW5nOwogCiAJLyoqIExSVSBsaXN0IG9mIG9iamVjdHMgd2l0aCBmZW5jZSByZWdzIG9uIHRoZW0uICovCkBAIC0xMTcwLDYgKzEwODYsOSBAQAogCSAqLwogCWJvb2wgYnVzeTsKIAorCS8qIHRoZSBpbmRpY2F0b3IgZm9yIGRpc3BhdGNoIHZpZGVvIGNvbW1hbmRzIG9uIHR3byBCU0QgcmluZ3MgKi8KKwlpbnQgYnNkX3JpbmdfZGlzcGF0Y2hfaW5kZXg7CisKIAkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBYIHRpbGluZyAqLwogCXVpbnQzMl90IGJpdF82X3N3aXp6bGVfeDsKIAkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBZIHRpbGluZyAqLwpAQCAtMTI0NSw4ICsxMTY0LDEyIEBACiAJICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfcXVldWU7CiAKLQkvKiBGb3IgZ3B1IGhhbmcgc2ltdWxhdGlvbi4gKi8KLQl1bnNpZ25lZCBpbnQgc3RvcF9yaW5nczsKKwkvKiBVc2Vyc3BhY2Uga25vYnMgZm9yIGdwdSBoYW5nIHNpbXVsYXRpb247CisJICogY29tYmluZXMgYm90aCBhIHJpbmcgbWFzaywgYW5kIGV4dHJhIGZsYWdzCisJICovCisJdTMyIHN0b3BfcmluZ3M7CisjZGVmaW5lIEk5MTVfU1RPUF9SSU5HX0FMTE9XX0JBTiAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgSTkxNV9TVE9QX1JJTkdfQUxMT1dfV0FSTiAgICAgICgxIDw8IDMwKQogCiAJLyogRm9yIG1pc3NlZCBpcnEvc2Vxbm8gc2ltdWxhdGlvbi4gKi8KIAl1bnNpZ25lZCBpbnQgdGVzdF9pcnFfcmluZ3M7CkBAIC0xMjY2LDYgKzExODksMTIgQEAKIAl1aW50OF90IHN1cHBvcnRzX2RwOjE7CiB9OwogCitlbnVtIGRycnNfc3VwcG9ydF90eXBlIHsKKwlEUlJTX05PVF9TVVBQT1JURUQgPSAwLAorCVNUQVRJQ19EUlJTX1NVUFBPUlQgPSAxLAorCVNFQU1MRVNTX0RSUlNfU1VQUE9SVCA9IDIKK307CisKIHN0cnVjdCBpbnRlbF92YnRfZGF0YSB7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmxmcF9sdmRzX3ZidF9tb2RlOyAvKiBpZiBhbnkgKi8KIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2R2b19sdmRzX3ZidF9tb2RlOyAvKiBpZiBhbnkgKi8KQEAgLTEyNzgsOSArMTIwNywxMiBAQAogCXVuc2lnbmVkIGludCBsdmRzX3VzZV9zc2M6MTsKIAl1bnNpZ25lZCBpbnQgZGlzcGxheV9jbG9ja19tb2RlOjE7CiAJdW5zaWduZWQgaW50IGZkaV9yeF9wb2xhcml0eV9pbnZlcnRlZDoxOworCXVuc2lnbmVkIGludCBoYXNfbWlwaToxOwogCWludCBsdmRzX3NzY19mcmVxOwogCXVuc2lnbmVkIGludCBiaW9zX2x2ZHNfdmFsOyAvKiBpbml0aWFsIFtQQ0hfXUxWRFMgcmVnIHZhbCBpbiBWQklPUyAqLwogCisJZW51bSBkcnJzX3N1cHBvcnRfdHlwZSBkcnJzX3R5cGU7CisKIAkvKiBlRFAgKi8KIAlpbnQgZWRwX3JhdGU7CiAJaW50IGVkcF9sYW5lczsKQEAgLTEyOTksNyArMTIzMSwxNCBAQAogCiAJLyogTUlQSSBEU0kgKi8KIAlzdHJ1Y3QgeworCQl1MTYgcG9ydDsKIAkJdTE2IHBhbmVsX2lkOworCQlzdHJ1Y3QgbWlwaV9jb25maWcgKmNvbmZpZzsKKwkJc3RydWN0IG1pcGlfcHBzX2RhdGEgKnBwczsKKwkJdTggc2VxX3ZlcnNpb247CisJCXUzMiBzaXplOworCQl1OCAqZGF0YTsKKwkJdTggKnNlcXVlbmNlW01JUElfU0VRX01BWF07CiAJfSBkc2k7CiAKIAlpbnQgY3J0X2RkY19waW47CkBAIC0xMzUxLDIzICsxMjkwLDEzIEBACiAgKiBnb2VzIGJhY2sgdG8gZmFsc2UgZXhhY3RseSBiZWZvcmUgd2UgcmVlbmFibGUgdGhlIElSUXMuIFdlIHVzZSB0aGlzIHZhcmlhYmxlCiAgKiB0byBjaGVjayBpZiBzb21lb25lIGlzIHRyeWluZyB0byBlbmFibGUvZGlzYWJsZSBJUlFzIHdoaWxlIHRoZXkncmUgc3VwcG9zZWQKICAqIHRvIGJlIGRpc2FibGVkLiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYW5kIHdlJ2xsIHByaW50IHNvbWUgZXJyb3IgbWVzc2FnZXMgaW4KLSAqIGNhc2UgaXQgaGFwcGVucywgYnV0IGlmIGl0IGFjdHVhbGx5IGhhcHBlbnMgd2UnbGwgYWxzbyB1cGRhdGUgdGhlIHZhcmlhYmxlcwotICogaW5zaWRlIHN0cnVjdCByZWdzYXZlIHNvIHdoZW4gd2UgcmVzdG9yZSB0aGUgSVJRcyB0aGV5IHdpbGwgY29udGFpbiB0aGUKLSAqIGxhdGVzdCBleHBlY3RlZCB2YWx1ZXMuCisgKiBjYXNlIGl0IGhhcHBlbnMuCiAgKgogICogRm9yIG1vcmUsIHJlYWQgdGhlIERvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQuCiAgKi8KIHN0cnVjdCBpOTE1X3J1bnRpbWVfcG0gewogCWJvb2wgc3VzcGVuZGVkOwogCWJvb2wgaXJxc19kaXNhYmxlZDsKLQotCXN0cnVjdCB7Ci0JCXVpbnQzMl90IGRlaW1yOwotCQl1aW50MzJfdCBzZGVpbXI7Ci0JCXVpbnQzMl90IGd0aW1yOwotCQl1aW50MzJfdCBndGllcjsKLQkJdWludDMyX3QgZ2VuNl9wbWltcjsKLQl9IHJlZ3NhdmU7CiB9OwogCiBlbnVtIGludGVsX3BpcGVfY3JjX3NvdXJjZSB7CkBAIC0xNDAwLDcgKzEzMjksNyBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdxOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSB7CitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYjsKIApAQCAtMTQyNCwxMCArMTM1MywxMyBAQAogCSAqLwogCXVpbnQzMl90IGdwaW9fbW1pb19iYXNlOwogCisJLyogTU1JTyBiYXNlIGFkZHJlc3MgZm9yIE1JUEkgcmVncyAqLworCXVpbnQzMl90IG1pcGlfbW1pb19iYXNlOworCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZ21idXNfd2FpdF9xdWV1ZTsKIAogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciByaW5nW0k5MTVfTlVNX1JJTkdTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzIHJpbmdbSTkxNV9OVU1fUklOR1NdOwogCXVpbnQzMl90IGxhc3Rfc2Vxbm8sIG5leHRfc2Vxbm87CiAKIAlkcm1fZG1hX2hhbmRsZV90ICpzdGF0dXNfcGFnZV9kbWFoOwpAQCAtMTQ2OSw2ICsxNDAxLDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBob3RwbHVnX3JlZW5hYmxlX3RpbWVyOwogCiAJc3RydWN0IGk5MTVfZmJjIGZiYzsKKwlzdHJ1Y3QgaTkxNV9kcnJzIGRycnM7CiAJc3RydWN0IGludGVsX29wcmVnaW9uIG9wcmVnaW9uOwogCXN0cnVjdCBpbnRlbF92YnRfZGF0YSB2YnQ7CiAKQEAgLTE0ODYsNiArMTQxOSw3IEBACiAJaW50IG51bV9mZW5jZV9yZWdzOyAvKiA4IG9uIHByZS05NjUsIDE2IG90aGVyd2lzZSAqLwogCiAJdW5zaWduZWQgaW50IGZzYl9mcmVxLCBtZW1fZnJlcSwgaXNfZGRyMzsKKwl1bnNpZ25lZCBpbnQgdmx2X2NkY2xrX2ZyZXE7CiAKIAkvKioKIAkgKiB3cSAtIERyaXZlciB3b3JrcXVldWUgZm9yIEdFTS4KQEAgLTE1MDksOSArMTQ0MywxMiBAQAogCXN0cnVjdCBtdXRleCBtb2Rlc2V0X3Jlc3RvcmVfbG9jazsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdm1fbGlzdDsgLyogR2xvYmFsIGxpc3Qgb2YgYWxsIGFkZHJlc3Mgc3BhY2VzICovCi0Jc3RydWN0IGk5MTVfZ3R0IGd0dDsgLyogVk1BIHJlcHJlc2VudGluZyB0aGUgZ2xvYmFsIGFkZHJlc3Mgc3BhY2UgKi8KKwlzdHJ1Y3QgaTkxNV9ndHQgZ3R0OyAvKiBWTSByZXByZXNlbnRpbmcgdGhlIGdsb2JhbCBhZGRyZXNzIHNwYWNlICovCiAKIAlzdHJ1Y3QgaTkxNV9nZW1fbW0gbW07CisjaWYgZGVmaW5lZChDT05GSUdfTU1VX05PVElGSUVSKQorCURFQ0xBUkVfSEFTSFRBQkxFKG1tdV9ub3RpZmllcnMsIDcpOworI2VuZGlmCiAKIAkvKiBLZXJuZWwgTW9kZXNldHRpbmcgKi8KIApAQCAtMTU4MCw2ICsxNTE3LDcgQEAKIAogCXUzMiBzdXNwZW5kX2NvdW50OwogCXN0cnVjdCBpOTE1X3N1c3BlbmRfc2F2ZWRfcmVnaXN0ZXJzIHJlZ2ZpbGU7CisJc3RydWN0IHZsdl9zMGl4X3N0YXRlIHZsdl9zMGl4X3N0YXRlOwogCiAJc3RydWN0IHsKIAkJLyoKQEAgLTE2MDUsNyArMTU0MywxMiBAQAogCXN0cnVjdCBpOTE1X2RyaTFfc3RhdGUgZHJpMTsKIAkvKiBPbGQgdW1zIHN1cHBvcnQgaW5mcmFzdHJ1Y3R1cmUsIHNhbWUgd2FybmluZyBhcHBsaWVzLiAqLwogCXN0cnVjdCBpOTE1X3Vtc19zdGF0ZSB1bXM7Ci19IGRybV9pOTE1X3ByaXZhdGVfdDsKKworCS8qCisJICogTk9URTogVGhpcyBpcyB0aGUgZHJpMS91bXMgZHVuZ2VvbiwgZG9uJ3QgYWRkIHN0dWZmIGhlcmUuIFlvdXIgcGF0Y2gKKwkgKiB3aWxsIGJlIHJlamVjdGVkLiBJbnN0ZWFkIGxvb2sgZm9yIGEgYmV0dGVyIHBsYWNlLgorCSAqLworfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqdG9faTkxNShjb25zdCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMTY0Miw2ICsxNTg1LDggQEAKIAkgKi8KIAlpbnQgKCpnZXRfcGFnZXMpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOwogCXZvaWQgKCpwdXRfcGFnZXMpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOworCWludCAoKmRtYWJ1Zl9leHBvcnQpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqKTsKIH07CiAKIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0IHsKQEAgLTE3MzIsNyArMTY3Nyw3IEBACiAJdm9pZCAqZG1hX2J1Zl92bWFwcGluZzsKIAlpbnQgdm1hcHBpbmdfY291bnQ7CiAKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAogCS8qKiBCcmVhZGNydW1iIG9mIGxhc3QgcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuICovCiAJdWludDMyX3QgbGFzdF9yZWFkX3NlcW5vOwpAQCAtMTc1NSw4ICsxNzAwLDIwIEBACiAKIAkvKiogZm9yIHBoeSBhbGxvY2F0ZWQgb2JqZWN0cyAqLwogCWRybV9kbWFfaGFuZGxlX3QgKnBoeXNfaGFuZGxlOwotfTsKIAorCXVuaW9uIHsKKwkJc3RydWN0IGk5MTVfZ2VtX3VzZXJwdHIgeworCQkJdWludHB0cl90IHB0cjsKKwkJCXVuc2lnbmVkIHJlYWRfb25seSA6MTsKKwkJCXVuc2lnbmVkIHdvcmtlcnMgOjQ7CisjZGVmaW5lIEk5MTVfR0VNX1VTRVJQVFJfTUFYX1dPUktFUlMgMTUKKworCQkJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJCQlzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0ICptbjsKKwkJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwkJfSB1c2VycHRyOworCX07Cit9OwogI2RlZmluZSB0b19pbnRlbF9ibyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGJhc2UpCiAKIC8qKgpAQCAtMTc3MSw3ICsxNzI4LDcgQEAKICAqLwogc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0IHsKIAkvKiogT24gV2hpY2ggcmluZyB0aGlzIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCAqLwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCiAJLyoqIEdFTSBzZXF1ZW5jZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4gKi8KIAl1aW50MzJfdCBzZXFubzsKQEAgLTE3ODMsNyArMTc0MCw3IEBACiAJdTMyIHRhaWw7CiAKIAkvKiogQ29udGV4dCByZWxhdGVkIHRvIHRoaXMgcmVxdWVzdCAqLwotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCiAJLyoqIEJhdGNoIGJ1ZmZlciByZWxhdGVkIHRvIHRoaXMgcmVxdWVzdCBpZiBhbnkgKi8KIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqYmF0Y2hfb2JqOwpAQCAtMTgxMCw4ICsxNzY3LDggQEAKIAl9IG1tOwogCXN0cnVjdCBpZHIgY29udGV4dF9pZHI7CiAKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpwcml2YXRlX2RlZmF1bHRfY3R4OwogCWF0b21pY190IHJwc193YWl0X2Jvb3N0OworCXN0cnVjdCAgaW50ZWxfZW5naW5lX2NzICpic2RfcmluZzsKIH07CiAKIC8qCkBAIC0xODc5LDExICsxODM2LDE3IEBACiAJICogdGhlIGV4cGVjdGVkIHZhbHVlLCB0aGUgcGFyc2VyIHJlamVjdHMgaXQuIE9ubHkgdmFsaWQgaWYgZmxhZ3MgaGFzCiAJICogdGhlIENNRF9ERVNDX0JJVE1BU0sgYml0IHNldC4gT25seSBlbnRyaWVzIHdoZXJlIG1hc2sgaXMgbm9uLXplcm8KIAkgKiBhcmUgdmFsaWQuCisJICoKKwkgKiBJZiB0aGUgY2hlY2sgc3BlY2lmaWVzIGEgbm9uLXplcm8gY29uZGl0aW9uX21hc2sgdGhlbiB0aGUgcGFyc2VyCisJICogb25seSBwZXJmb3JtcyB0aGUgY2hlY2sgd2hlbiB0aGUgYml0cyBzcGVjaWZpZWQgYnkgY29uZGl0aW9uX21hc2sKKwkgKiBhcmUgbm9uLXplcm8uCiAJICovCiAJc3RydWN0IHsKIAkJdTMyIG9mZnNldDsKIAkJdTMyIG1hc2s7CiAJCXUzMiBleHBlY3RlZDsKKwkJdTMyIGNvbmRpdGlvbl9vZmZzZXQ7CisJCXUzMiBjb25kaXRpb25fbWFzazsKIAl9IGJpdHNbTUFYX0NNRF9ERVNDX0JJVE1BU0tTXTsKIH07CiAKQEAgLTE5MjUsOCArMTg4OCw5IEBACiAJCQkJIChkZXYpLT5wZGV2LT5kZXZpY2UgPT0gMHgwMTA2IHx8IFwKIAkJCQkgKGRldiktPnBkZXYtPmRldmljZSA9PSAweDAxMEEpCiAjZGVmaW5lIElTX1ZBTExFWVZJRVcoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc192YWxsZXl2aWV3KQorI2RlZmluZSBJU19DSEVSUllWSUVXKGRldikJKElOVEVMX0lORk8oZGV2KS0+aXNfdmFsbGV5dmlldyAmJiBJU19HRU44KGRldikpCiAjZGVmaW5lIElTX0hBU1dFTEwoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19oYXN3ZWxsKQotI2RlZmluZSBJU19CUk9BRFdFTEwoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gOCkKKyNkZWZpbmUgSVNfQlJPQURXRUxMKGRldikJKCFJTlRFTF9JTkZPKGRldiktPmlzX3ZhbGxleXZpZXcgJiYgSVNfR0VOOChkZXYpKQogI2RlZmluZSBJU19NT0JJTEUoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfbW9iaWxlKQogI2RlZmluZSBJU19IU1dfRUFSTFlfU0RWKGRldikJKElTX0hBU1dFTEwoZGV2KSAmJiBcCiAJCQkJICgoZGV2KS0+cGRldi0+ZGV2aWNlICYgMHhGRjAwKSA9PSAweDBDMDApCkBAIC0xOTYyLDE3ICsxOTI2LDIxIEBACiAjZGVmaW5lIEJTRF9SSU5HCQkoMTw8VkNTKQogI2RlZmluZSBCTFRfUklORwkJKDE8PEJDUykKICNkZWZpbmUgVkVCT1hfUklORwkJKDE8PFZFQ1MpCi0jZGVmaW5lIEhBU19CU0QoZGV2KSAgICAgICAgICAgIChJTlRFTF9JTkZPKGRldiktPnJpbmdfbWFzayAmIEJTRF9SSU5HKQotI2RlZmluZSBIQVNfQkxUKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5yaW5nX21hc2sgJiBCTFRfUklORykKLSNkZWZpbmUgSEFTX1ZFQk9YKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5yaW5nX21hc2sgJiBWRUJPWF9SSU5HKQotI2RlZmluZSBIQVNfTExDKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5oYXNfbGxjKQotI2RlZmluZSBIQVNfV1QoZGV2KSAgICAgICAgICAgIChJU19IQVNXRUxMKGRldikgJiYgdG9faTkxNShkZXYpLT5lbGxjX3NpemUpCisjZGVmaW5lIEJTRDJfUklORwkJKDE8PFZDUzIpCisjZGVmaW5lIEhBU19CU0QoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+cmluZ19tYXNrICYgQlNEX1JJTkcpCisjZGVmaW5lIEhBU19CU0QyKGRldikJCShJTlRFTF9JTkZPKGRldiktPnJpbmdfbWFzayAmIEJTRDJfUklORykKKyNkZWZpbmUgSEFTX0JMVChkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5yaW5nX21hc2sgJiBCTFRfUklORykKKyNkZWZpbmUgSEFTX1ZFQk9YKGRldikJCShJTlRFTF9JTkZPKGRldiktPnJpbmdfbWFzayAmIFZFQk9YX1JJTkcpCisjZGVmaW5lIEhBU19MTEMoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aGFzX2xsYykKKyNkZWZpbmUgSEFTX1dUKGRldikJCSgoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKSAmJiBcCisJCQkJIHRvX2k5MTUoZGV2KS0+ZWxsY19zaXplKQogI2RlZmluZSBJOTE1X05FRURfR0ZYX0hXUyhkZXYpCShJTlRFTF9JTkZPKGRldiktPm5lZWRfZ2Z4X2h3cykKIAogI2RlZmluZSBIQVNfSFdfQ09OVEVYVFMoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikKLSNkZWZpbmUgSEFTX0FMSUFTSU5HX1BQR1RUKGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYgJiYgIUlTX1ZBTExFWVZJRVcoZGV2KSkKLSNkZWZpbmUgSEFTX1BQR1RUKGRldikJCShJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3ICYmICFJU19WQUxMRVlWSUVXKGRldikgXAotCQkJCSAmJiAhSVNfQlJPQURXRUxMKGRldikpCisjZGVmaW5lIEhBU19BTElBU0lOR19QUEdUVChkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2ICYmIFwKKwkJCQkgKCFJU19WQUxMRVlWSUVXKGRldikgfHwgSVNfQ0hFUlJZVklFVyhkZXYpKSkKKyNkZWZpbmUgSEFTX1BQR1RUKGRldikJCShJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3IFwKKwkJCQkgJiYgIUlTX0dFTjgoZGV2KSkKICNkZWZpbmUgVVNFU19QUEdUVChkZXYpCQlpbnRlbF9lbmFibGVfcHBndHQoZGV2LCBmYWxzZSkKICNkZWZpbmUgVVNFU19GVUxMX1BQR1RUKGRldikJaW50ZWxfZW5hYmxlX3BwZ3R0KGRldiwgdHJ1ZSkKIApAQCAtMjAxMCw4ICsxOTc4LDggQEAKICNkZWZpbmUgSEFTX0RESShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5oYXNfZGRpKQogI2RlZmluZSBIQVNfRlBHQV9EQkdfVU5DTEFJTUVEKGRldikJKElOVEVMX0lORk8oZGV2KS0+aGFzX2ZwZ2FfZGJnKQogI2RlZmluZSBIQVNfUFNSKGRldikJCShJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCi0jZGVmaW5lIEhBU19QQzgoZGV2KQkJKElTX0hBU1dFTEwoZGV2KSkgLyogWFhYIEhTVzpVTFggKi8KLSNkZWZpbmUgSEFTX1JVTlRJTUVfUE0oZGV2KQkoSVNfSEFTV0VMTChkZXYpKQorI2RlZmluZSBIQVNfUlVOVElNRV9QTShkZXYpCShJU19HRU42KGRldikgfHwgSVNfSEFTV0VMTChkZXYpIHx8IFwKKwkJCQkgSVNfQlJPQURXRUxMKGRldikgfHwgSVNfVkFMTEVZVklFVyhkZXYpKQogCiAjZGVmaW5lIElOVEVMX1BDSF9ERVZJQ0VfSURfTUFTSwkJMHhmZjAwCiAjZGVmaW5lIElOVEVMX1BDSF9JQlhfREVWSUNFX0lEX1RZUEUJCTB4M2IwMApAQCAtMjA2OCw2ICsyMDM2LDcgQEAKIAlib29sIHByZWZhdWx0X2Rpc2FibGU7CiAJYm9vbCByZXNldDsKIAlib29sIGRpc2FibGVfZGlzcGxheTsKKwlib29sIGRpc2FibGVfdnRkX3dhOwogfTsKIGV4dGVybiBzdHJ1Y3QgaTkxNV9wYXJhbXMgaTkxNSBfX3JlYWRfbW9zdGx5OwogCkBAIC0yMDk2LDYgKzIwNjUsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaTkxNV9tY2hfdmFsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpOTE1X2dmeF92YWwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIGV4dGVybiB2b2lkIGk5MTVfdXBkYXRlX2dmeF92YWwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCB2bHZfZm9yY2VfZ2Z4X2Nsb2NrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBvbik7CiAKIGV4dGVybiB2b2lkIGludGVsX2NvbnNvbGVfcmVzdW1lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKQEAgLTIxNzAsNiArMjE0MCw5IEBACiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBpbnQgaTkxNV9nZW1fZ2V0X3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworaW50IGk5MTVfZ2VtX2luaXRfdXNlcnB0cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2dlbV91c2VycHRyX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOwogaW50IGk5MTVfZ2VtX2dldF9hcGVydHVyZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGludCBpOTE1X2dlbV93YWl0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCkBAIC0yMjI3LDkgKzIyMDAsOSBAQAogCiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGk5MTVfZ2VtX29iamVjdF9zeW5jKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp0byk7CisJCQkgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqdG8pOwogdm9pZCBpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKKwkJCSAgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiBpbnQgaTkxNV9nZW1fZHVtYl9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgKmFyZ3MpOwpAQCAtMjI0OSwzMSArMjIyMiwxNCBAQAogaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCi1zdGF0aWMgaW5saW5lIGJvb2wKLWk5MTVfZ2VtX29iamVjdF9waW5fZmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlpZiAob2JqLT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkgewotCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBvYmotPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKLQkJZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddLnBpbl9jb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWk5MTVfZ2VtX29iamVjdF91bnBpbl9mZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCWlmIChvYmotPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IG9iai0+YmFzZS5kZXYtPmRldl9wcml2YXRlOwotCQlXQVJOX09OKGRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXS5waW5fY291bnQgPD0gMCk7Ci0JCWRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXS5waW5fY291bnQtLTsKLQl9Ci19Citib29sIGk5MTVfZ2VtX29iamVjdF9waW5fZmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX29iamVjdF91bnBpbl9mZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAogc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICoKLWk5MTVfZ2VtX2ZpbmRfYWN0aXZlX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKK2k5MTVfZ2VtX2ZpbmRfYWN0aXZlX3JlcXVlc3Qoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAKIGJvb2wgaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKIGludCBfX211c3RfY2hlY2sgaTkxNV9nZW1fY2hlY2tfd2VkZ2Uoc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciwKIAkJCQkgICAgICBib29sIGludGVycnVwdGlibGUpOwogc3RhdGljIGlubGluZSBib29sIGk5MTVfcmVzZXRfaW5fcHJvZ3Jlc3Moc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvcikKQEAgLTIyOTIsMjMgKzIyNDgsMzUgQEAKIAlyZXR1cm4gKChhdG9taWNfcmVhZCgmZXJyb3ItPnJlc2V0X2NvdW50ZXIpICYgfkk5MTVfV0VER0VEKSArIDEpIC8gMjsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGk5MTVfc3RvcF9yaW5nX2FsbG93X2JhbihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIGRldl9wcml2LT5ncHVfZXJyb3Iuc3RvcF9yaW5ncyA9PSAwIHx8CisJCWRldl9wcml2LT5ncHVfZXJyb3Iuc3RvcF9yaW5ncyAmIEk5MTVfU1RPUF9SSU5HX0FMTE9XX0JBTjsKK30KKworc3RhdGljIGlubGluZSBib29sIGk5MTVfc3RvcF9yaW5nX2FsbG93X3dhcm4oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiBkZXZfcHJpdi0+Z3B1X2Vycm9yLnN0b3BfcmluZ3MgPT0gMCB8fAorCQlkZXZfcHJpdi0+Z3B1X2Vycm9yLnN0b3BfcmluZ3MgJiBJOTE1X1NUT1BfUklOR19BTExPV19XQVJOOworfQorCiB2b2lkIGk5MTVfZ2VtX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogYm9vbCBpOTE1X2dlbV9jbGZsdXNoX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIGZvcmNlKTsKIGludCBfX211c3RfY2hlY2sgaTkxNV9nZW1fb2JqZWN0X2ZpbmlzaF9ncHUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2luaXRfaHcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pbnQgaTkxNV9nZW1fbDNfcmVtYXAoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgc2xpY2UpOworaW50IGk5MTVfZ2VtX2wzX3JlbWFwKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIGludCBzbGljZSk7CiB2b2lkIGk5MTVfZ2VtX2luaXRfc3dpenpsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ3B1X2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1pbnQgX19pOTE1X2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2ludCBfX2k5MTVfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKIAkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpiYXRjaF9vYmosCiAJCSAgICAgICB1MzIgKnNlcW5vKTsKICNkZWZpbmUgaTkxNV9hZGRfcmVxdWVzdChyaW5nLCBzZXFubykgXAogCV9faTkxNV9hZGRfcmVxdWVzdChyaW5nLCBOVUxMLCBOVUxMLCBzZXFubykKLWludCBfX211c3RfY2hlY2sgaTkxNV93YWl0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2ludCBfX211c3RfY2hlY2sgaTkxNV93YWl0X3NlcW5vKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJIHVpbnQzMl90IHNlcW5vKTsKIGludCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpOwogaW50IF9fbXVzdF9jaGVjawpAQCAtMjMxOSw3ICsyMjg3LDcgQEAKIGludCBfX211c3RfY2hlY2sKIGk5MTVfZ2VtX29iamVjdF9waW5fdG9fZGlzcGxheV9wbGFuZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJCSAgICAgdTMyIGFsaWdubWVudCwKLQkJCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKTsKKwkJCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnBpcGVsaW5lZCk7CiB2b2lkIGk5MTVfZ2VtX29iamVjdF91bnBpbl9mcm9tX2Rpc3BsYXlfcGxhbmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiBpbnQgaTkxNV9nZW1fb2JqZWN0X2F0dGFjaF9waHlzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJaW50IGFsaWduKTsKQEAgLTI0MTYsMjIgKzIzODQsMjIgQEAKIGludCBpOTE1X2dlbV9jb250ZXh0X29wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlKTsKIGludCBpOTE1X2dlbV9jb250ZXh0X2VuYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogdm9pZCBpOTE1X2dlbV9jb250ZXh0X2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7Ci1pbnQgaTkxNV9zd2l0Y2hfY29udGV4dChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICp0byk7Ci1zdHJ1Y3QgaTkxNV9od19jb250ZXh0ICoKK2ludCBpOTE1X3N3aXRjaF9jb250ZXh0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCisJCQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqdG8pOworc3RydWN0IGludGVsX2NvbnRleHQgKgogaTkxNV9nZW1fY29udGV4dF9nZXQoc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2LCB1MzIgaWQpOwogdm9pZCBpOTE1X2dlbV9jb250ZXh0X2ZyZWUoc3RydWN0IGtyZWYgKmN0eF9yZWYpOwotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfZ2VtX2NvbnRleHRfcmVmZXJlbmNlKHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X2dlbV9jb250ZXh0X3JlZmVyZW5jZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4KQogewogCWtyZWZfZ2V0KCZjdHgtPnJlZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X2dlbV9jb250ZXh0X3VucmVmZXJlbmNlKHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X2dlbV9jb250ZXh0X3VucmVmZXJlbmNlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHgpCiB7CiAJa3JlZl9wdXQoJmN0eC0+cmVmLCBpOTE1X2dlbV9jb250ZXh0X2ZyZWUpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9nZW1fY29udGV4dF9pc19kZWZhdWx0KGNvbnN0IHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmMpCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV9nZW1fY29udGV4dF9pc19kZWZhdWx0KGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjKQogewogCXJldHVybiBjLT5pZCA9PSBERUZBVUxUX0NPTlRFWFRfSUQ7CiB9CkBAIC0yNDQxLDYgKzI0MDksOCBAQAogaW50IGk5MTVfZ2VtX2NvbnRleHRfZGVzdHJveV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiAKKy8qIGk5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5jICovCitpbnQgaTkxNV9nZW1fcmVuZGVyX3N0YXRlX2luaXQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAvKiBpOTE1X2dlbV9ldmljdC5jICovCiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLApAQCAtMjQ1MywyMyArMjQyMywxMiBAQAogaW50IGk5MTVfZ2VtX2V2aWN0X3ZtKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLCBib29sIGRvX2lkbGUpOwogaW50IGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLS8qIGk5MTVfZ2VtX2d0dC5jICovCi12b2lkIGk5MTVfY2hlY2tfYW5kX2NsZWFyX2ZhdWx0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLXZvaWQgaTkxNV9nZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ndHRfcHJlcGFyZV9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX2d0dF9maW5pc2hfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwotdm9pZCBpOTE1X2dlbV9pbml0X2dsb2JhbF9ndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX3NldHVwX2dsb2JhbF9ndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG1hcHBhYmxlX2VuZCwgdW5zaWduZWQgbG9uZyBlbmQpOwotaW50IGk5MTVfZ2VtX2d0dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworLyogYmVsb25ncyBpbiBpOTE1X2dlbV9ndHQuaCAqLwogc3RhdGljIGlubGluZSB2b2lkIGk5MTVfZ2VtX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA2KQogCQlpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCgpOwogfQotaW50IGk5MTVfZ2VtX2luaXRfcHBndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0KTsKLWJvb2wgaW50ZWxfZW5hYmxlX3BwZ3R0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgZnVsbCk7CiAKIC8qIGk5MTVfZ2VtX3N0b2xlbi5jICovCiBpbnQgaTkxNV9nZW1faW5pdF9zdG9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0yNTM3LDkgKzI0OTYsMTEgQEAKIGNvbnN0IGNoYXIgKmk5MTVfY2FjaGVfbGV2ZWxfc3RyKGludCB0eXBlKTsKIAogLyogaTkxNV9jbWRfcGFyc2VyLmMgKi8KLXZvaWQgaTkxNV9jbWRfcGFyc2VyX2luaXRfcmluZyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotYm9vbCBpOTE1X25lZWRzX2NtZF9wYXJzZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLWludCBpOTE1X3BhcnNlX2NtZHMoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAoraW50IGk5MTVfY21kX3BhcnNlcl9nZXRfdmVyc2lvbih2b2lkKTsKK2ludCBpOTE1X2NtZF9wYXJzZXJfaW5pdF9yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOwordm9pZCBpOTE1X2NtZF9wYXJzZXJfZmluaV9yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOworYm9vbCBpOTE1X25lZWRzX2NtZF9wYXJzZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CitpbnQgaTkxNV9wYXJzZV9jbWRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqYmF0Y2hfb2JqLAogCQkgICAgdTMyIGJhdGNoX3N0YXJ0X29mZnNldCwKIAkJICAgIGJvb2wgaXNfbWFzdGVyKTsKQEAgLTI2ODgsMjAgKzI2NDksNiBAQAogaW50IHZsdl9ncHVfZnJlcShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCB2YWwpOwogaW50IHZsdl9mcmVxX29wY29kZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCB2YWwpOwogCi12b2lkIHZsdl9mb3JjZV93YWtlX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBmd19lbmdpbmUpOwotdm9pZCB2bHZfZm9yY2Vfd2FrZV9wdXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgZndfZW5naW5lKTsKLQotI2RlZmluZSBGT1JDRVdBS0VfVkxWX1JFTkRFUl9SQU5HRV9PRkZTRVQocmVnKSBcCi0JKCgocmVnKSA+PSAweDIwMDAgJiYgKHJlZykgPCAweDQwMDApIHx8XAotCSgocmVnKSA+PSAweDUwMDAgJiYgKHJlZykgPCAweDgwMDApIHx8XAotCSgocmVnKSA+PSAweEIwMDAgJiYgKHJlZykgPCAweDEyMDAwKSB8fFwKLQkoKHJlZykgPj0gMHgyRTAwMCAmJiAocmVnKSA8IDB4MzAwMDApKQotCi0jZGVmaW5lIEZPUkNFV0FLRV9WTFZfTUVESUFfUkFOR0VfT0ZGU0VUKHJlZylcCi0JKCgocmVnKSA+PSAweDEyMDAwICYmIChyZWcpIDwgMHgxNDAwMCkgfHxcCi0JKChyZWcpID49IDB4MjIwMDAgJiYgKHJlZykgPCAweDI0MDAwKSB8fFwKLQkoKHJlZykgPj0gMHgzMDAwMCAmJiAocmVnKSA8IDB4NDAwMDApKQotCiAjZGVmaW5lIEZPUkNFV0FLRV9SRU5ERVIJKDEgPDwgMCkKICNkZWZpbmUgRk9SQ0VXQUtFX01FRElBCQkoMSA8PCAxKQogI2RlZmluZSBGT1JDRVdBS0VfQUxMCQkoRk9SQ0VXQUtFX1JFTkRFUiB8IEZPUkNFV0FLRV9NRURJQSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDMzMjY3NzBjLi5mMzYxMjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CkBAIC00Myw2ICs0NCw4IEBACiBzdGF0aWMgX19tdXN0X2NoZWNrIGludAogaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICAgICAgYm9vbCByZWFkb25seSk7CitzdGF0aWMgdm9pZAoraTkxNV9nZW1fb2JqZWN0X3JldGlyZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAogc3RhdGljIHZvaWQgaTkxNV9nZW1fd3JpdGVfZmVuY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJlZywKIAkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CkBAIC01MCwxNCArNTMsMTUgQEAKIAkJCQkJIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAogCQkJCQkgYm9vbCBlbmFibGUpOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpOTE1X2dlbV9pbmFjdGl2ZV9jb3VudChzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaTkxNV9nZW1fc2hyaW5rZXJfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKIAkJCQkJICAgICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGk5MTVfZ2VtX2luYWN0aXZlX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGk5MTVfZ2VtX3Nocmlua2VyX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKIAkJCQkJICAgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpOworc3RhdGljIGludCBpOTE1X2dlbV9zaHJpbmtlcl9vb20oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCQkgdm9pZCAqcHRyKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGk5MTVfZ2VtX3B1cmdlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgbG9uZyB0YXJnZXQpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaTkxNV9nZW1fc2hyaW5rX2FsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X3RydW5jYXRlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3Jpbmcoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogc3RhdGljIGJvb2wgY3B1X2NhY2hlX2lzX2NvaGVyZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwpCkBAIC00NzAsNiArNDc0LDggQEAKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgdHJ1ZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCisJCWk5MTVfZ2VtX29iamVjdF9yZXRpcmUob2JqKTsKIAl9CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaik7CkBAIC04ODUsNiArODkxLDggQEAKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKKworCQlpOTE1X2dlbV9vYmplY3RfcmV0aXJlKG9iaik7CiAJfQogCS8qIFNhbWUgdHJpY2sgYXBwbGllcyB0byBpbnZhbGlkYXRlIHBhcnRpYWxseSB3cml0dGVuIGNhY2hlbGluZXMgcmVhZAogCSAqIGJlZm9yZSB3cml0aW5nLiAqLwpAQCAtMTA4OCw3ICsxMDk2LDcgQEAKICAqIGVxdWFsLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9jaGVja19vbHIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pCitpOTE1X2dlbV9jaGVja19vbHIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIHNlcW5vKQogewogCWludCByZXQ7CiAKQEAgLTExMDcsNyArMTExNSw3IEBACiB9CiAKIHN0YXRpYyBib29sIG1pc3NlZF9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorCQkgICAgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlyZXR1cm4gdGVzdF9iaXQocmluZy0+aWQsICZkZXZfcHJpdi0+Z3B1X2Vycm9yLm1pc3NlZF9pcnFfcmluZ3MpOwogfQpAQCAtMTEzOCw3ICsxMTQ2LDcgQEAKICAqIFJldHVybnMgMCBpZiB0aGUgc2Vxbm8gd2FzIGZvdW5kIHdpdGhpbiB0aGUgYWxsb3RlZCB0aW1lLiBFbHNlIHJldHVybnMgdGhlCiAgKiBlcnJubyB3aXRoIHJlbWFpbmluZyB0aW1lIGZpbGxlZCBpbiB0aW1lb3V0IGFyZ3VtZW50LgogICovCi1zdGF0aWMgaW50IF9fd2FpdF9zZXFubyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiBzZXFubywKK3N0YXRpYyBpbnQgX193YWl0X3NlcW5vKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIHUzMiBzZXFubywKIAkJCXVuc2lnbmVkIHJlc2V0X2NvdW50ZXIsCiAJCQlib29sIGludGVycnVwdGlibGUsCiAJCQlzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQsCkBAIC0xMjQ1LDcgKzEyNTMsNyBAQAogICogcmVxdWVzdCBhbmQgb2JqZWN0IGxpc3RzIGFwcHJvcHJpYXRlbHkgZm9yIHRoYXQgZXZlbnQuCiAgKi8KIGludAotaTkxNV93YWl0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdWludDMyX3Qgc2Vxbm8pCitpOTE1X3dhaXRfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdWludDMyX3Qgc2Vxbm8pCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTI3MCw5ICsxMjc4LDEwIEBACiAKIHN0YXRpYyBpbnQKIGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZ19fdGFpbChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorCQkJCSAgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhyaW5nKTsKKwlpZiAoIW9iai0+YWN0aXZlKQorCQlyZXR1cm4gMDsKIAogCS8qIE1hbnVhbGx5IG1hbmFnZSB0aGUgd3JpdGUgZmx1c2ggYXMgd2UgbWF5IGhhdmUgbm90IHlldAogCSAqIHJldGlyZWQgdGhlIGJ1ZmZlci4KQEAgLTEyODIsNyArMTI5MSw2IEBACiAJICogd2Uga25vdyB3ZSBoYXZlIHBhc3NlZCB0aGUgbGFzdCB3cml0ZS4KIAkgKi8KIAlvYmotPmxhc3Rfd3JpdGVfc2Vxbm8gPSAwOwotCW9iai0+YmFzZS53cml0ZV9kb21haW4gJj0gfkk5MTVfR0VNX0dQVV9ET01BSU5TOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjk1LDcgKzEzMDMsNyBAQAogaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICAgICAgYm9vbCByZWFkb25seSkKIHsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBvYmotPnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9IG9iai0+cmluZzsKIAl1MzIgc2Vxbm87CiAJaW50IHJldDsKIApAQCAtMTMyMCw3ICsxMzI4LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IG9iai0+cmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gb2JqLT5yaW5nOwogCXVuc2lnbmVkIHJlc2V0X2NvdW50ZXI7CiAJdTMyIHNlcW5vOwogCWludCByZXQ7CkBAIC0xNTM2LDcgKzE1NDQsNyBAQAogCiAJLyogQWNjZXNzIHRvIHNub29wYWJsZSBwYWdlcyB0aHJvdWdoIHRoZSBHVFQgaXMgaW5jb2hlcmVudC4gKi8KIAlpZiAob2JqLT5jYWNoZV9sZXZlbCAhPSBJOTE1X0NBQ0hFX05PTkUgJiYgIUhBU19MTEMoZGV2KSkgewotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRUZBVUxUOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTE4MDMsMTIgKzE4MTEsMTYgQEAKIAlyZXR1cm4gaTkxNV9nZW1fbW1hcF9ndHQoZmlsZSwgZGV2LCBhcmdzLT5oYW5kbGUsICZhcmdzLT5vZmZzZXQpOwogfQogCitzdGF0aWMgaW5saW5lIGludAoraTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiBvYmotPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEOworfQorCiAvKiBJbW1lZGlhdGVseSBkaXNjYXJkIHRoZSBiYWNraW5nIHN0b3JhZ2UgKi8KIHN0YXRpYyB2b2lkCiBpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCiAJaTkxNV9nZW1fb2JqZWN0X2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKIAogCWlmIChvYmotPmJhc2UuZmlscCA9PSBOVUxMKQpAQCAtMTgxOSwxNiArMTgzMSwyOCBAQAogCSAqIFRvIGRvIHRoaXMgd2UgbXVzdCBpbnN0cnVjdCB0aGUgc2htZnMgdG8gZHJvcCBhbGwgb2YgaXRzCiAJICogYmFja2luZyBwYWdlcywgKm5vdyouCiAJICovCi0JaW5vZGUgPSBmaWxlX2lub2RlKG9iai0+YmFzZS5maWxwKTsKLQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7Ci0KKwlzaG1lbV90cnVuY2F0ZV9yYW5nZShmaWxlX2lub2RlKG9iai0+YmFzZS5maWxwKSwgMCwgKGxvZmZfdCktMSk7CiAJb2JqLT5tYWR2ID0gX19JOTE1X01BRFZfUFVSR0VEOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQorLyogVHJ5IHRvIGRpc2NhcmQgdW53YW50ZWQgcGFnZXMgKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9vYmplY3RfaW52YWxpZGF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXJldHVybiBvYmotPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCisJc3dpdGNoIChvYmotPm1hZHYpIHsKKwljYXNlIEk5MTVfTUFEVl9ET05UTkVFRDoKKwkJaTkxNV9nZW1fb2JqZWN0X3RydW5jYXRlKG9iaik7CisJY2FzZSBfX0k5MTVfTUFEVl9QVVJHRUQ6CisJCXJldHVybjsKKwl9CisKKwlpZiAob2JqLT5iYXNlLmZpbHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWFwcGluZyA9IGZpbGVfaW5vZGUob2JqLT5iYXNlLmZpbHApLT5pX21hcHBpbmcsCisJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKG1hcHBpbmcsIDAsIChsb2ZmX3QpLTEpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTg5Myw4ICsxOTE3LDcgQEAKIAlvcHMtPnB1dF9wYWdlcyhvYmopOwogCW9iai0+cGFnZXMgPSBOVUxMOwogCi0JaWYgKGk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqKSkKLQkJaTkxNV9nZW1fb2JqZWN0X3RydW5jYXRlKG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X2ludmFsaWRhdGUob2JqKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkwMyw1OCArMTkyNiw1OCBAQAogX19pOTE1X2dlbV9zaHJpbmsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBsb25nIHRhcmdldCwKIAkJICBib29sIHB1cmdlYWJsZV9vbmx5KQogewotCXN0cnVjdCBsaXN0X2hlYWQgc3RpbGxfYm91bmRfbGlzdDsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0aWxsX2luX2xpc3Q7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCi0JCQkJICZkZXZfcHJpdi0+bW0udW5ib3VuZF9saXN0LAotCQkJCSBnbG9iYWxfbGlzdCkgewotCQlpZiAoKGk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqKSB8fCAhcHVyZ2VhYmxlX29ubHkpICYmCi0JCSAgICBpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaikgPT0gMCkgewotCQkJY291bnQgKz0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsKLQkJCWlmIChjb3VudCA+PSB0YXJnZXQpCi0JCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JfQotCiAJLyoKLQkgKiBBcyB3ZSBtYXkgY29tcGxldGVseSByZXdyaXRlIHRoZSBib3VuZCBsaXN0IHdoaWxzdCB1bmJpbmRpbmcKKwkgKiBBcyB3ZSBtYXkgY29tcGxldGVseSByZXdyaXRlIHRoZSAodW4pYm91bmQgbGlzdCB3aGlsc3QgdW5iaW5kaW5nCiAJICogKGR1ZSB0byByZXRpcmluZyByZXF1ZXN0cykgd2UgaGF2ZSB0byBzdHJpY3RseSBwcm9jZXNzIG9ubHkKIAkgKiBvbmUgZWxlbWVudCBvZiB0aGUgbGlzdCBhdCB0aGUgdGltZSwgYW5kIHJlY2hlY2sgdGhlIGxpc3QKIAkgKiBvbiBldmVyeSBpdGVyYXRpb24uCisJICoKKwkgKiBJbiBwYXJ0aWN1bGFyLCB3ZSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugd2hpbHN0IHJlbW92aW5nIHRoZQorCSAqIG9iamVjdCBhcyB3ZSBtYXkgZW5kIHVwIHdhaXRpbmcgZm9yIGFuZC9vciByZXRpcmluZyB0aGUgb2JqZWN0cy4KKwkgKiBUaGlzIG1pZ2h0IHJlbGVhc2UgdGhlIGZpbmFsIHJlZmVyZW5jZSAoaGVsZCBieSB0aGUgYWN0aXZlIGxpc3QpCisJICogYW5kIHJlc3VsdCBpbiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkIGZyb20gdW5kZXIgdXMuIFRoaXMgaXMKKwkgKiBzaW1pbGFyIHRvIHRoZSBwcmVjYXV0aW9ucyB0aGUgZXZpY3Rpb24gY29kZSBtdXN0IHRha2Ugd2hpbHN0CisJICogcmVtb3Zpbmcgb2JqZWN0cy4KKwkgKgorCSAqIEFsc28gbm90ZSB0aGF0IGFsdGhvdWdoIHRoZXNlIGxpc3RzIGRvIG5vdCBob2xkIGEgcmVmZXJlbmNlIHRvCisJICogdGhlIG9iamVjdCB3ZSBjYW4gc2FmZWx5IGdyYWIgb25lIGhlcmU6IFRoZSBmaW5hbCBvYmplY3QKKwkgKiB1bnJlZmVyZW5jaW5nIGFuZCB0aGUgYm91bmRfbGlzdCBhcmUgYm90aCBwcm90ZWN0ZWQgYnkgdGhlCisJICogZGV2LT5zdHJ1Y3RfbXV0ZXggYW5kIHNvIHdlIHdvbid0IGV2ZXIgYmUgYWJsZSB0byBvYnNlcnZlIGFuCisJICogb2JqZWN0IG9uIHRoZSBib3VuZF9saXN0IHdpdGggYSByZWZlcmVuY2UgY291bnQgZXF1YWxzIDAuCiAJICovCi0JSU5JVF9MSVNUX0hFQUQoJnN0aWxsX2JvdW5kX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzdGlsbF9pbl9saXN0KTsKKwl3aGlsZSAoY291bnQgPCB0YXJnZXQgJiYgIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS51bmJvdW5kX2xpc3QpKSB7CisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS51bmJvdW5kX2xpc3QsCisJCQkJICAgICAgIHR5cGVvZigqb2JqKSwgZ2xvYmFsX2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGlzdCwgJnN0aWxsX2luX2xpc3QpOworCisJCWlmICghaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmopICYmIHB1cmdlYWJsZV9vbmx5KQorCQkJY29udGludWU7CisKKwkJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZvYmotPmJhc2UpOworCisJCWlmIChpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaikgPT0gMCkKKwkJCWNvdW50ICs9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CisKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJfQorCWxpc3Rfc3BsaWNlKCZzdGlsbF9pbl9saXN0LCAmZGV2X3ByaXYtPm1tLnVuYm91bmRfbGlzdCk7CisKKwlJTklUX0xJU1RfSEVBRCgmc3RpbGxfaW5fbGlzdCk7CiAJd2hpbGUgKGNvdW50IDwgdGFyZ2V0ICYmICFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uYm91bmRfbGlzdCkpIHsKIAkJc3RydWN0IGk5MTVfdm1hICp2bWEsICp2OwogCiAJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS5ib3VuZF9saXN0LAogCQkJCSAgICAgICB0eXBlb2YoKm9iaiksIGdsb2JhbF9saXN0KTsKLQkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpc3QsICZzdGlsbF9ib3VuZF9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpc3QsICZzdGlsbF9pbl9saXN0KTsKIAogCQlpZiAoIWk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqKSAmJiBwdXJnZWFibGVfb25seSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qCi0JCSAqIEhvbGQgYSByZWZlcmVuY2Ugd2hpbHN0IHdlIHVuYmluZCB0aGlzIG9iamVjdCwgYXMgd2UgbWF5Ci0JCSAqIGVuZCB1cCB3YWl0aW5nIGZvciBhbmQgcmV0aXJpbmcgcmVxdWVzdHMuIFRoaXMgbWlnaHQKLQkJICogcmVsZWFzZSB0aGUgZmluYWwgcmVmZXJlbmNlIChoZWxkIGJ5IHRoZSBhY3RpdmUgbGlzdCkKLQkJICogYW5kIHJlc3VsdCBpbiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkIGZyb20gdW5kZXIgdXMuCi0JCSAqIGluIHRoaXMgb2JqZWN0IGJlaW5nIGZyZWVkLgotCQkgKgotCQkgKiBOb3RlIDE6IFNocmlua2luZyB0aGUgYm91bmQgbGlzdCBpcyBzcGVjaWFsIHNpbmNlIG9ubHkgYWN0aXZlCi0JCSAqIChhbmQgaGVuY2UgYm91bmQgb2JqZWN0cykgY2FuIGNvbnRhaW4gc3VjaCBsaW1ibyBvYmplY3RzLCBzbwotCQkgKiB3ZSBkb24ndCBuZWVkIHNwZWNpYWwgdHJpY2tzIGZvciBzaHJpbmtpbmcgdGhlIHVuYm91bmQgbGlzdC4KLQkJICogVGhlIG9ubHkgb3RoZXIgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggYWN0aXZlCi0JCSAqIG9iamVjdHMgc3VkZGVubHkgZGlzYXBwZWFyaW5nIGR1ZSB0byByZXRpcmluZyByZXF1ZXN0cyBpcyB0aGUKLQkJICogZXZpY3Rpb24gY29kZS4KLQkJICoKLQkJICogTm90ZSAyOiBFdmVuIHRob3VnaCB0aGUgYm91bmQgbGlzdCBkb2Vzbid0IGhvbGQgYSByZWZlcmVuY2UKLQkJICogdG8gdGhlIG9iamVjdCB3ZSBjYW4gc2FmZWx5IGdyYWIgb25lIGhlcmU6IFRoZSBmaW5hbCBvYmplY3QKLQkJICogdW5yZWZlcmVuY2luZyBhbmQgdGhlIGJvdW5kX2xpc3QgYXJlIGJvdGggcHJvdGVjdGVkIGJ5IHRoZQotCQkgKiBkZXYtPnN0cnVjdF9tdXRleCBhbmQgc28gd2Ugd29uJ3QgZXZlciBiZSBhYmxlIHRvIG9ic2VydmUgYW4KLQkJICogb2JqZWN0IG9uIHRoZSBib3VuZF9saXN0IHdpdGggYSByZWZlcmVuY2UgY291bnQgZXF1YWxzIDAuCi0JCSAqLwogCQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZtYSwgdiwgJm9iai0+dm1hX2xpc3QsIHZtYV9saW5rKQpAQCAtMTk2Niw3ICsxOTg5LDcgQEAKIAogCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAl9Ci0JbGlzdF9zcGxpY2UoJnN0aWxsX2JvdW5kX2xpc3QsICZkZXZfcHJpdi0+bW0uYm91bmRfbGlzdCk7CisJbGlzdF9zcGxpY2UoJnN0aWxsX2luX2xpc3QsICZkZXZfcHJpdi0+bW0uYm91bmRfbGlzdCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xOTgwLDE3ICsyMDAzLDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpOTE1X2dlbV9zaHJpbmtfYWxsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqbmV4dDsKLQlsb25nIGZyZWVkID0gMDsKLQogCWk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoZGV2X3ByaXYtPmRldik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCBuZXh0LCAmZGV2X3ByaXYtPm1tLnVuYm91bmRfbGlzdCwKLQkJCQkgZ2xvYmFsX2xpc3QpIHsKLQkJaWYgKGk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMob2JqKSA9PSAwKQotCQkJZnJlZWQgKz0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsKLQl9Ci0JcmV0dXJuIGZyZWVkOworCXJldHVybiBfX2k5MTVfZ2VtX3NocmluayhkZXZfcHJpdiwgTE9OR19NQVgsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludApAQCAtMjA5NCw3ICsyMTA4LDE5IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShzZ19wYWdlX2l0ZXJfcGFnZSgmc2dfaXRlcikpOwogCXNnX2ZyZWVfdGFibGUoc3QpOwogCWtmcmVlKHN0KTsKLQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKworCS8qIHNobWVtZnMgZmlyc3QgY2hlY2tzIGlmIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIHBhZ2UKKwkgKiBhbmQgcmVwb3J0cyBFTk9TUEMgc2hvdWxkIHRoZXJlIGJlIGluc3VmZmljaWVudCwgYWxvbmcgd2l0aCB0aGUgdXN1YWwKKwkgKiBFTk9NRU0gZm9yIGEgZ2VudWluZSBhbGxvY2F0aW9uIGZhaWx1cmUuCisJICoKKwkgKiBXZSB1c2UgRU5PU1BDIGluIG91ciBkcml2ZXIgdG8gbWVhbiB0aGF0IHdlIGhhdmUgcnVuIG91dCBvZiBhcGVydHVyZQorCSAqIHNwYWNlIGFuZCBzbyB3YW50IHRvIHRyYW5zbGF0ZSB0aGUgZXJyb3IgZnJvbSBzaG1lbWZzIGJhY2sgdG8gb3VyCisJICogdXN1YWwgdW5kZXJzdGFuZGluZyBvZiBFTk9NRU0uCisJICovCisJaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVOT1NQQykKKwkJcmV0dXJuIC1FTk9NRU07CisJZWxzZQorCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKIH0KIAogLyogRW5zdXJlIHRoYXQgdGhlIGFzc29jaWF0ZWQgcGFnZXMgYXJlIGdhdGhlcmVkIGZyb20gdGhlIGJhY2tpbmcgc3RvcmFnZQpAQCAtMjEzMSw3ICsyMTU3LDcgQEAKIAogc3RhdGljIHZvaWQKIGk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJICAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKKwkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMTY5LDcgKzIxOTUsNyBAQAogfQogCiB2b2lkIGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJbGlzdF9tb3ZlX3RhaWwoJnZtYS0+bW1fbGlzdCwgJnZtYS0+dm0tPmFjdGl2ZV9saXN0KTsKIAlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fYWN0aXZlKHZtYS0+b2JqLCByaW5nKTsKQEAgLTIyMDcsMTEgKzIyMzMsMjQgQEAKIAlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogfQogCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fb2JqZWN0X3JldGlyZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSBvYmotPnJpbmc7CisKKwlpZiAocmluZyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcsIHRydWUpLAorCQkJICAgICAgb2JqLT5sYXN0X3JlYWRfc2Vxbm8pKQorCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZShvYmopOworfQorCiBzdGF0aWMgaW50CiBpOTE1X2dlbV9pbml0X3NlcW5vKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzZXFubykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCByZXQsIGksIGo7CiAKIAkvKiBDYXJlZnVsbHkgcmV0aXJlIGFsbCByZXF1ZXN0cyB3aXRob3V0IHdyaXRpbmcgdG8gdGhlIHJpbmdzICovCkBAIC0yMjI2LDggKzIyNjUsOCBAQAogCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpIHsKIAkJaW50ZWxfcmluZ19pbml0X3NlcW5vKHJpbmcsIHNlcW5vKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShyaW5nLT5zeW5jX3NlcW5vKTsgaisrKQotCQkJcmluZy0+c3luY19zZXFub1tqXSA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHJpbmctPnNlbWFwaG9yZS5zeW5jX3NlcW5vKTsgaisrKQorCQkJcmluZy0+c2VtYXBob3JlLnN5bmNfc2Vxbm9bal0gPSAwOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjI3Nyw3ICsyMzE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9faTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitpbnQgX19pOTE1X2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCiAJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkgICAgICAgdTMyICpvdXRfc2Vxbm8pCkBAIC0yMzgyLDcgKzI0MjEsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBpOTE1X2NvbnRleHRfaXNfYmFubmVkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHgpCisJCQkJICAgY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmN0eCkKIHsKIAl1bnNpZ25lZCBsb25nIGVsYXBzZWQ7CiAKQEAgLTIzOTUsOCArMjQzNCw5IEBACiAJCWlmICghaTkxNV9nZW1fY29udGV4dF9pc19kZWZhdWx0KGN0eCkpIHsKIAkJCURSTV9ERUJVRygiY29udGV4dCBoYW5naW5nIHRvbyBmYXN0LCBiYW5uaW5nIVxuIik7CiAJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Z3B1X2Vycm9yLnN0b3BfcmluZ3MgPT0gMCkgewotCQkJRFJNX0VSUk9SKCJncHUgaGFuZ2luZyB0b28gZmFzdCwgYmFubmluZyFcbiIpOworCQl9IGVsc2UgaWYgKGk5MTVfc3RvcF9yaW5nX2FsbG93X2JhbihkZXZfcHJpdikpIHsKKwkJCWlmIChpOTE1X3N0b3BfcmluZ19hbGxvd193YXJuKGRldl9wcml2KSkKKwkJCQlEUk1fRVJST1IoImdwdSBoYW5naW5nIHRvbyBmYXN0LCBiYW5uaW5nIVxuIik7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KQEAgLTI0MDUsNyArMjQ0NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGk5MTVfc2V0X3Jlc2V0X3N0YXR1cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICBzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHgsCisJCQkJICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4LAogCQkJCSAgY29uc3QgYm9vbCBndWlsdHkpCiB7CiAJc3RydWN0IGk5MTVfY3R4X2hhbmdfc3RhdHMgKmhzOwpAQCAtMjQzNiw3ICsyNDc2LDcgQEAKIH0KIAogc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICoKLWk5MTVfZ2VtX2ZpbmRfYWN0aXZlX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraTkxNV9nZW1fZmluZF9hY3RpdmVfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIAl1MzIgY29tcGxldGVkX3NlcW5vOwpAQCAtMjQ1NCw3ICsyNDk0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9nZW1fcmVzZXRfcmluZ19zdGF0dXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQkJICAgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OwogCWJvb2wgcmluZ19odW5nOwpAQCAtMjQ3Myw3ICsyNTEzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9nZW1fcmVzZXRfcmluZ19jbGVhbnVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorCQkJCQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmcmluZy0+YWN0aXZlX2xpc3QpKSB7CiAJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CkBAIC0yNTAxLDYgKzI1NDEsMTEgQEAKIAogCQlpOTE1X2dlbV9mcmVlX3JlcXVlc3QocmVxdWVzdCk7CiAJfQorCisJLyogVGhlc2UgbWF5IG5vdCBoYXZlIGJlZW4gZmx1c2ggYmVmb3JlIHRoZSByZXNldCwgZG8gc28gbm93ICovCisJa2ZyZWUocmluZy0+cHJlYWxsb2NhdGVkX2xhenlfcmVxdWVzdCk7CisJcmluZy0+cHJlYWxsb2NhdGVkX2xhenlfcmVxdWVzdCA9IE5VTEw7CisJcmluZy0+b3V0c3RhbmRpbmdfbGF6eV9zZXFubyA9IDA7CiB9CiAKIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTI1MjcsNyArMjU3Miw3IEBACiB2b2lkIGk5MTVfZ2VtX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlpbnQgaTsKIAogCS8qCkBAIC0yNTQxLDggKzI1ODYsNiBAQAogCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpCiAJCWk5MTVfZ2VtX3Jlc2V0X3JpbmdfY2xlYW51cChkZXZfcHJpdiwgcmluZyk7CiAKLQlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKLQogCWk5MTVfZ2VtX2NvbnRleHRfcmVzZXQoZGV2KTsKIAogCWk5MTVfZ2VtX3Jlc3RvcmVfZmVuY2VzKGRldik7CkBAIC0yNTUxLDggKzI1OTQsOCBAQAogLyoqCiAgKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgcmVxdWVzdCBsaXN0IGFzIHNlcXVlbmNlIG51bWJlcnMgYXJlIHBhc3NlZC4KICAqLwotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQKK2k5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJdWludDMyX3Qgc2Vxbm87CiAKQEAgLTI1OTcsNyArMjY0MCw3IEBACiAJCSAqIG9mIHRhaWwgb2YgdGhlIHJlcXVlc3QgdG8gdXBkYXRlIHRoZSBsYXN0IGtub3duIHBvc2l0aW9uCiAJCSAqIG9mIHRoZSBHUFUgaGVhZC4KIAkJICovCi0JCXJpbmctPmxhc3RfcmV0aXJlZF9oZWFkID0gcmVxdWVzdC0+dGFpbDsKKwkJcmluZy0+YnVmZmVyLT5sYXN0X3JldGlyZWRfaGVhZCA9IHJlcXVlc3QtPnRhaWw7CiAKIAkJaTkxNV9nZW1fZnJlZV9yZXF1ZXN0KHJlcXVlc3QpOwogCX0KQEAgLTI2MTUsNyArMjY1OCw3IEBACiBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWJvb2wgaWRsZSA9IHRydWU7CiAJaW50IGk7CiAKQEAgLTI3MDksNyArMjc1Miw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3dhaXQgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gTlVMTDsKIAlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dF9zdGFjaywgKnRpbWVvdXQgPSBOVUxMOwogCXVuc2lnbmVkIHJlc2V0X2NvdW50ZXI7CiAJdTMyIHNlcW5vID0gMDsKQEAgLTI3ODAsOSArMjgyMyw5IEBACiAgKi8KIGludAogaTkxNV9nZW1fb2JqZWN0X3N5bmMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvKQorCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnRvKQogewotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqZnJvbSA9IG9iai0+cmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpmcm9tID0gb2JqLT5yaW5nOwogCXUzMiBzZXFubzsKIAlpbnQgcmV0LCBpZHg7CiAKQEAgLTI3OTUsNyArMjgzOCw3IEBACiAJaWR4ID0gaW50ZWxfcmluZ19zeW5jX2luZGV4KGZyb20sIHRvKTsKIAogCXNlcW5vID0gb2JqLT5sYXN0X3JlYWRfc2Vxbm87Ci0JaWYgKHNlcW5vIDw9IGZyb20tPnN5bmNfc2Vxbm9baWR4XSkKKwlpZiAoc2Vxbm8gPD0gZnJvbS0+c2VtYXBob3JlLnN5bmNfc2Vxbm9baWR4XSkKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBpOTE1X2dlbV9jaGVja19vbHIob2JqLT5yaW5nLCBzZXFubyk7CkBAIC0yODAzLDEzICsyODQ2LDEzIEBACiAJCXJldHVybiByZXQ7CiAKIAl0cmFjZV9pOTE1X2dlbV9yaW5nX3N5bmNfdG8oZnJvbSwgdG8sIHNlcW5vKTsKLQlyZXQgPSB0by0+c3luY190byh0bywgZnJvbSwgc2Vxbm8pOworCXJldCA9IHRvLT5zZW1hcGhvcmUuc3luY190byh0bywgZnJvbSwgc2Vxbm8pOwogCWlmICghcmV0KQogCQkvKiBXZSB1c2UgbGFzdF9yZWFkX3NlcW5vIGJlY2F1c2Ugc3luY190bygpCiAJCSAqIG1pZ2h0IGhhdmUganVzdCBjYXVzZWQgc2Vxbm8gd3JhcCB1bmRlcgogCQkgKiB0aGUgcmFkYXIuCiAJCSAqLwotCQlmcm9tLT5zeW5jX3NlcW5vW2lkeF0gPSBvYmotPmxhc3RfcmVhZF9zZXFubzsKKwkJZnJvbS0+c2VtYXBob3JlLnN5bmNfc2Vxbm9baWR4XSA9IG9iai0+bGFzdF9yZWFkX3NlcW5vOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4NjUsMTIgKzI5MDgsMTQgQEAKIAkgKiBjYXVzZSBtZW1vcnkgY29ycnVwdGlvbiB0aHJvdWdoIHVzZS1hZnRlci1mcmVlLgogCSAqLwogCi0JaTkxNV9nZW1fb2JqZWN0X2ZpbmlzaF9ndHQob2JqKTsKKwlpZiAoaTkxNV9pc19nZ3R0KHZtYS0+dm0pKSB7CisJCWk5MTVfZ2VtX29iamVjdF9maW5pc2hfZ3R0KG9iaik7CiAKLQkvKiByZWxlYXNlIHRoZSBmZW5jZSByZWcgX2FmdGVyXyBmbHVzaGluZyAqLwotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQkvKiByZWxlYXNlIHRoZSBmZW5jZSByZWcgX2FmdGVyXyBmbHVzaGluZyAqLworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXRyYWNlX2k5MTVfdm1hX3VuYmluZCh2bWEpOwogCkBAIC0yOTAzLDcgKzI5NDgsNyBAQAogaW50IGk5MTVfZ3B1X2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCByZXQsIGk7CiAKIAkvKiBGbHVzaCBldmVyeXRoaW5nIG9udG8gdGhlIGluYWN0aXZlIGxpc3QuICovCkBAIC0zMTQ0LDYgKzMxODksOSBAQAogCiAJZmVuY2UgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddOwogCisJaWYgKFdBUk5fT04oZmVuY2UtPnBpbl9jb3VudCkpCisJCXJldHVybiAtRUJVU1k7CisKIAlpOTE1X2dlbV9vYmplY3RfZmVuY2VfbG9zdChvYmopOwogCWk5MTVfZ2VtX29iamVjdF91cGRhdGVfZmVuY2Uob2JqLCBmZW5jZSwgZmFsc2UpOwogCkBAIC0zNTQ4LDYgKzM1OTYsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlpOTE1X2dlbV9vYmplY3RfcmV0aXJlKG9iaik7CiAJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4ob2JqLCBmYWxzZSk7CiAKIAkvKiBTZXJpYWxpc2UgZGlyZWN0IGFjY2VzcyB0byB0aGlzIG9iamVjdCB3aXRoIHRoZSBiYXJyaWVycyBmb3IKQEAgLTM2NDYsNiArMzY5NSw3IEBACiAJCSAqIGluIG9iai0+d3JpdGVfZG9tYWluIGFuZCBoYXZlIGJlZW4gc2tpcHBpbmcgdGhlIGNsZmx1c2hlcy4KIAkJICogSnVzdCBzZXQgaXQgdG8gdGhlIENQVSBjYWNoZSBmb3Igbm93LgogCQkgKi8KKwkJaTkxNV9nZW1fb2JqZWN0X3JldGlyZShvYmopOwogCQlXQVJOX09OKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CiAKIAkJb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CkBAIC0zNzQzLDYgKzM3OTMsMTUgQEAKIAogc3RhdGljIGJvb2wgaXNfcGluX2Rpc3BsYXkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCWlmIChsaXN0X2VtcHR5KCZvYmotPnZtYV9saXN0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJdm1hID0gaTkxNV9nZW1fb2JqX3RvX2dndHQob2JqKTsKKwlpZiAoIXZtYSkKKwkJcmV0dXJuIGZhbHNlOworCiAJLyogVGhlcmUgYXJlIDMgc291cmNlcyB0aGF0IHBpbiBvYmplY3RzOgogCSAqICAgMS4gVGhlIGRpc3BsYXkgZW5naW5lIChzY2Fub3V0cywgc3ByaXRlcywgY3Vyc29ycyk7CiAJICogICAyLiBSZXNlcnZhdGlvbnMgZm9yIGV4ZWNidWZmZXI7CkBAIC0zNzU0LDcgKzM4MTMsNyBAQAogCSAqIHN1YnRyYWN0aW5nIHRoZSBwb3RlbnRpYWwgcmVmZXJlbmNlIGJ5IHRoZSB1c2VyLCBhbnkgcGluX2NvdW50CiAJICogcmVtYWlucywgaXQgbXVzdCBiZSBkdWUgdG8gYW5vdGhlciB1c2UgYnkgdGhlIGRpc3BsYXkgZW5naW5lLgogCSAqLwotCXJldHVybiBpOTE1X2dlbV9vYmpfdG9fZ2d0dChvYmopLT5waW5fY291bnQgLSAhIW9iai0+dXNlcl9waW5fY291bnQ7CisJcmV0dXJuIHZtYS0+cGluX2NvdW50IC0gISFvYmotPnVzZXJfcGluX2NvdW50OwogfQogCiAvKgpAQCAtMzc2NSw5ICszODI0LDEwIEBACiBpbnQKIGk5MTVfZ2VtX29iamVjdF9waW5fdG9fZGlzcGxheV9wbGFuZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJCSAgICAgdTMyIGFsaWdubWVudCwKLQkJCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKQorCQkJCSAgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcGlwZWxpbmVkKQogewogCXUzMiBvbGRfcmVhZF9kb21haW5zLCBvbGRfd3JpdGVfZG9tYWluOworCWJvb2wgd2FzX3Bpbl9kaXNwbGF5OwogCWludCByZXQ7CiAKIAlpZiAocGlwZWxpbmVkICE9IG9iai0+cmluZykgewpAQCAtMzc3OSw2ICszODM5LDcgQEAKIAkvKiBNYXJrIHRoZSBwaW5fZGlzcGxheSBlYXJseSBzbyB0aGF0IHdlIGFjY291bnQgZm9yIHRoZQogCSAqIGRpc3BsYXkgY29oZXJlbmN5IHdoaWxzdCBzZXR0aW5nIHVwIHRoZSBjYWNoZSBkb21haW5zLgogCSAqLworCXdhc19waW5fZGlzcGxheSA9IG9iai0+cGluX2Rpc3BsYXk7CiAJb2JqLT5waW5fZGlzcGxheSA9IHRydWU7CiAKIAkvKiBUaGUgZGlzcGxheSBlbmdpbmUgaXMgbm90IGNvaGVyZW50IHdpdGggdGhlIExMQyBjYWNoZSBvbiBnZW42LiAgQXMKQEAgLTM4MjEsNyArMzg4Miw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl91bnBpbl9kaXNwbGF5OgotCW9iai0+cGluX2Rpc3BsYXkgPSBpc19waW5fZGlzcGxheShvYmopOworCVdBUk5fT04od2FzX3Bpbl9kaXNwbGF5ICE9IGlzX3Bpbl9kaXNwbGF5KG9iaikpOworCW9iai0+cGluX2Rpc3BsYXkgPSB3YXNfcGluX2Rpc3BsYXk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzg2OCw2ICszOTMwLDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaTkxNV9nZW1fb2JqZWN0X3JldGlyZShvYmopOwogCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKG9iaik7CiAKIAlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKQEAgLTM5MTcsNyArMzk4MCw3IEBACiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7CiAJdW5zaWduZWQgbG9uZyByZWNlbnRfZW5vdWdoID0gamlmZmllcyAtIG1zZWNzX3RvX2ppZmZpZXMoMjApOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBOVUxMOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSBOVUxMOwogCXVuc2lnbmVkIHJlc2V0X2NvdW50ZXI7CiAJdTMyIHNlcW5vID0gMDsKIAlpbnQgcmV0OwpAQCAtMzk3Niw5ICs0MDM5LDEzIEBACiAJCSAgICB1aW50MzJfdCBhbGlnbm1lbnQsCiAJCSAgICB1aW50NjRfdCBmbGFncykKIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBvYmotPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKIAlpbnQgcmV0OwogCisJaWYgKFdBUk5fT04odm0gPT0gJmRldl9wcml2LT5tbS5hbGlhc2luZ19wcGd0dC0+YmFzZSkpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKFdBUk5fT04oZmxhZ3MgJiAoUElOX0dMT0JBTCB8IFBJTl9NQVBQQUJMRSkgJiYgIWk5MTVfaXNfZ2d0dCh2bSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDAzMiw2ICs0MDk5LDMyIEBACiAJCW9iai0+cGluX21hcHBhYmxlID0gZmFsc2U7CiB9CiAKK2Jvb2wKK2k5MTVfZ2VtX29iamVjdF9waW5fZmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpZiAob2JqLT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBvYmotPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKKwkJc3RydWN0IGk5MTVfdm1hICpnZ3R0X3ZtYSA9IGk5MTVfZ2VtX29ial90b19nZ3R0KG9iaik7CisKKwkJV0FSTl9PTighZ2d0dF92bWEgfHwKKwkJCWRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXS5waW5fY291bnQgPgorCQkJZ2d0dF92bWEtPnBpbl9jb3VudCk7CisJCWRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXS5waW5fY291bnQrKzsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlCisJCXJldHVybiBmYWxzZTsKK30KKwordm9pZAoraTkxNV9nZW1fb2JqZWN0X3VucGluX2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJaWYgKG9iai0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKKwkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gb2JqLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJCVdBUk5fT04oZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddLnBpbl9jb3VudCA8PSAwKTsKKwkJZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddLnBpbl9jb3VudC0tOworCX0KK30KKwogaW50CiBpOTE1X2dlbV9waW5faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgc3RydWN0IGRybV9maWxlICpmaWxlKQpAQCAtNDI5Miw2ICs0Mzg1LDMwIEBACiAJcmV0dXJuIG9iajsKIH0KIAorc3RhdGljIGJvb2wgZGlzY2FyZF9iYWNraW5nX3N0b3JhZ2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwkvKiBJZiB3ZSBhcmUgdGhlIGxhc3QgdXNlciBvZiB0aGUgYmFja2luZyBzdG9yYWdlIChiZSBpdCBzaG1lbWZzCisJICogcGFnZXMgb3Igc3RvbGVuIGV0YyksIHdlIGtub3cgdGhhdCB0aGUgcGFnZXMgYXJlIGdvaW5nIHRvIGJlCisJICogaW1tZWRpYXRlbHkgcmVsZWFzZWQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHRoZW4gc2tpcCBjb3B5aW5nCisJICogYmFjayB0aGUgY29udGVudHMgZnJvbSB0aGUgR1BVLgorCSAqLworCisJaWYgKG9iai0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChvYmotPmJhc2UuZmlscCA9PSBOVUxMKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIEF0IGZpcnN0IGdsYW5jZSwgdGhpcyBsb29rcyByYWN5LCBidXQgdGhlbiBhZ2FpbiBzbyB3b3VsZCBiZQorCSAqIHVzZXJzcGFjZSByYWNpbmcgbW1hcCBhZ2FpbnN0IGNsb3NlLiBIb3dldmVyLCB0aGUgZmlyc3QgZXh0ZXJuYWwKKwkgKiByZWZlcmVuY2UgdG8gdGhlIGZpbHAgY2FuIG9ubHkgYmUgb2J0YWluZWQgdGhyb3VnaCB0aGUKKwkgKiBpOTE1X2dlbV9tbWFwX2lvY3RsKCkgd2hpY2ggc2FmZWd1YXJkcyB1cyBhZ2FpbnN0IHRoZSB1c2VyCisJICogYWNxdWlyaW5nIHN1Y2ggYSByZWZlcmVuY2Ugd2hpbHN0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mCisJICogZnJlZWluZyB0aGUgb2JqZWN0LgorCSAqLworCXJldHVybiBhdG9taWNfbG9uZ19yZWFkKCZvYmotPmJhc2UuZmlscC0+Zl9jb3VudCkgPT0gMTsKK30KKwogdm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbV9vYmopCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKGdlbV9vYmopOwpAQCAtNDMyOSw2ICs0NDQ2LDggQEAKIAogCWlmIChXQVJOX09OKG9iai0+cGFnZXNfcGluX2NvdW50KSkKIAkJb2JqLT5wYWdlc19waW5fY291bnQgPSAwOworCWlmIChkaXNjYXJkX2JhY2tpbmdfc3RvcmFnZShvYmopKQorCQlvYmotPm1hZHYgPSBJOTE1X01BRFZfRE9OVE5FRUQ7CiAJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwogCWk5MTVfZ2VtX29iamVjdF9mcmVlX21tYXBfb2Zmc2V0KG9iaik7CiAJaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2Vfc3RvbGVuKG9iaik7CkBAIC00MzM4LDYgKzQ0NTcsOSBAQAogCWlmIChvYmotPmJhc2UuaW1wb3J0X2F0dGFjaCkKIAkJZHJtX3ByaW1lX2dlbV9kZXN0cm95KCZvYmotPmJhc2UsIE5VTEwpOwogCisJaWYgKG9iai0+b3BzLT5yZWxlYXNlKQorCQlvYmotPm9wcy0+cmVsZWFzZShvYmopOworCiAJZHJtX2dlbV9vYmplY3RfcmVsZWFzZSgmb2JqLT5iYXNlKTsKIAlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+YmFzZS5zaXplKTsKIApAQCAtNDM3MSw2ICs0NDkzLDE3IEBACiAJa2ZyZWUodm1hKTsKIH0KIAorc3RhdGljIHZvaWQKK2k5MTVfZ2VtX3N0b3BfcmluZ2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmc7CisJaW50IGk7CisKKwlmb3JfZWFjaF9yaW5nKHJpbmcsIGRldl9wcml2LCBpKQorCQlpbnRlbF9zdG9wX3JpbmdfYnVmZmVyKHJpbmcpOworfQorCiBpbnQKIGk5MTVfZ2VtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTQzOTIsNyArNDUyNSw3IEBACiAJCWk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoZGV2KTsKIAogCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOwotCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOworCWk5MTVfZ2VtX3N0b3BfcmluZ2J1ZmZlcnMoZGV2KTsKIAogCS8qIEhhY2shICBEb24ndCBsZXQgYW55Ym9keSBkbyBleGVjYnVmIHdoaWxlIHdlIGRvbid0IGNvbnRyb2wgdGhlIGNoaXAuCiAJICogV2UgbmVlZCB0byByZXBsYWNlIHRoaXMgd2l0aCBhIHNlbWFwaG9yZSwgb3Igc29tZXRoaW5nLgpAQCAtNDQxMyw3ICs0NTQ2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaTkxNV9nZW1fbDNfcmVtYXAoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgc2xpY2UpCitpbnQgaTkxNV9nZW1fbDNfcmVtYXAoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgaW50IHNsaWNlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTQ1MTIsMTMgKzQ2NDUsMjAgQEAKIAkJCWdvdG8gY2xlYW51cF9ibHRfcmluZzsKIAl9CiAKKwlpZiAoSEFTX0JTRDIoZGV2KSkgeworCQlyZXQgPSBpbnRlbF9pbml0X2JzZDJfcmluZ19idWZmZXIoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2xlYW51cF92ZWJveF9yaW5nOworCX0KIAogCXJldCA9IGk5MTVfZ2VtX3NldF9zZXFubyhkZXYsICgodTMyKX4wIC0gMHgxMDAwKSk7CiAJaWYgKHJldCkKLQkJZ290byBjbGVhbnVwX3ZlYm94X3Jpbmc7CisJCWdvdG8gY2xlYW51cF9ic2QyX3Jpbmc7CiAKIAlyZXR1cm4gMDsKIAorY2xlYW51cF9ic2QyX3Jpbmc6CisJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbVkNTMl0pOwogY2xlYW51cF92ZWJveF9yaW5nOgogCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoJmRldl9wcml2LT5yaW5nW1ZFQ1NdKTsKIGNsZWFudXBfYmx0X3Jpbmc6CkBAIC00NTc2LDE1ICs0NzE2LDExIEBACiAJICogdGhlIGRvX3N3aXRjaCksIGJ1dCBiZWZvcmUgZW5hYmxpbmcgUFBHVFQuIFNvIGRvbid0IG1vdmUgdGhpcy4KIAkgKi8KIAlyZXQgPSBpOTE1X2dlbV9jb250ZXh0X2VuYWJsZShkZXZfcHJpdik7Ci0JaWYgKHJldCkgeworCWlmIChyZXQgJiYgcmV0ICE9IC1FSU8pIHsKIAkJRFJNX0VSUk9SKCJDb250ZXh0IGVuYWJsZSBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX291dDsKKwkJaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKGRldik7CiAJfQogCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKGRldik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDU5NywxMSArNDczMywxMyBAQAogCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgewogCQkvKiBWTFZBMCAocG90ZW50aWFsIGhhY2spLCBCSU9TIGlzbid0IGFjdHVhbGx5IHdha2luZyB1cyAqLwotCQlJOTE1X1dSSVRFKFZMVl9HVExDX1dBS0VfQ1RSTCwgMSk7Ci0JCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKFZMVl9HVExDX1BXX1NUQVRVUykgJiAxKSA9PSAxLCAxMCkpCisJCUk5MTVfV1JJVEUoVkxWX0dUTENfV0FLRV9DVFJMLCBWTFZfR1RMQ19BTExPV1dBS0VSRVEpOworCQlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChWTFZfR1RMQ19QV19TVEFUVVMpICYKKwkJCSAgICAgIFZMVl9HVExDX0FMTE9XV0FLRUFDSyksIDEwKSkKIAkJCURSTV9ERUJVR19EUklWRVIoImFsbG93IHdha2UgYWNrIHRpbWVkIG91dFxuIik7CiAJfQogCisJaTkxNV9nZW1faW5pdF91c2VycHRyKGRldik7CiAJaTkxNV9nZW1faW5pdF9nbG9iYWxfZ3R0KGRldik7CiAKIAlyZXQgPSBpOTE1X2dlbV9jb250ZXh0X2luaXQoZGV2KTsKQEAgLTQ2MTEsMjUgKzQ3NDksMjggQEAKIAl9CiAKIAlyZXQgPSBpOTE1X2dlbV9pbml0X2h3KGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKHJldCkgewotCQlXQVJOX09OKGRldl9wcml2LT5tbS5hbGlhc2luZ19wcGd0dCk7Ci0JCWk5MTVfZ2VtX2NvbnRleHRfZmluaShkZXYpOwotCQlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5ndHQuYmFzZS5tbSk7Ci0JCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAtRUlPKSB7CisJCS8qIEFsbG93IHJpbmcgaW5pdGlhbGlzYXRpb24gdG8gZmFpbCBieSBtYXJraW5nIHRoZSBHUFUgYXMKKwkJICogd2VkZ2VkLiBCdXQgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgd2hlcmUgdGhlIEdQVSBpcyBhbmdyeSwKKwkJICogZm9yIGFsbCBvdGhlciBmYWlsdXJlLCBzdWNoIGFzIGFuIGFsbG9jYXRpb24gZmFpbHVyZSwgYmFpbC4KKwkJICovCisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgR1BVLCBkZWNsYXJpbmcgaXQgd2VkZ2VkXG4iKTsKKwkJYXRvbWljX3NldF9tYXNrKEk5MTVfV0VER0VELCAmZGV2X3ByaXYtPmdwdV9lcnJvci5yZXNldF9jb3VudGVyKTsKKwkJcmV0ID0gMDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAkvKiBBbGxvdyBoYXJkd2FyZSBiYXRjaGJ1ZmZlcnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLCBidXQgbm90IGZvciBLTVMuICovCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlkZXZfcHJpdi0+ZHJpMS5hbGxvd19iYXRjaGJ1ZmZlciA9IDE7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZAogaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlpbnQgaTsKIAogCWZvcl9lYWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpCkBAIC00NjYxLDE2ICs0ODAyLDE1IEBACiAJfQogCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+Z3R0LmJhc2UuYWN0aXZlX2xpc3QpKTsKLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOworCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYsIGRldi0+cGRldi0+aXJxKTsKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfcmluZ2J1ZmZlcjsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwogCiBjbGVhbnVwX3JpbmdidWZmZXI6Ci0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOwogCWRldl9wcml2LT51bXMubW1fc3VzcGVuZGVkID0gMTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTQ2ODUsNyArNDgyNSw5IEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybiAwOwogCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gaTkxNV9nZW1fc3VzcGVuZChkZXYpOwogfQpAQCAtNDcwNCw3ICs0ODQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWluaXRfcmluZ19saXN0cyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitpbml0X3JpbmdfbGlzdHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlJTklUX0xJU1RfSEVBRCgmcmluZy0+YWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5yZXF1ZXN0X2xpc3QpOwpAQCAtNDc1Miw3ICs0ODk0LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+Z3B1X2Vycm9yLnJlc2V0X3F1ZXVlKTsKIAogCS8qIE9uIEdFTjMgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBBUkIgQzMgTFAgYml0IGlzIHNldCAqLwotCWlmIChJU19HRU4zKGRldikpIHsKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkgJiYgSVNfR0VOMyhkZXYpKSB7CiAJCUk5MTVfV1JJVEUoTUlfQVJCX1NUQVRFLAogCQkJICAgX01BU0tFRF9CSVRfRU5BQkxFKE1JX0FSQl9DM19MUF9XUklURV9FTkFCTEUpKTsKIAl9CkBAIC00Nzc5LDEwICs0OTIxLDEzIEBACiAKIAlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IHRydWU7CiAKLQlkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIuc2Nhbl9vYmplY3RzID0gaTkxNV9nZW1faW5hY3RpdmVfc2NhbjsKLQlkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIuY291bnRfb2JqZWN0cyA9IGk5MTVfZ2VtX2luYWN0aXZlX2NvdW50OwotCWRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zZWVrcyA9IERFRkFVTFRfU0VFS1M7Ci0JcmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJZGV2X3ByaXYtPm1tLnNocmlua2VyLnNjYW5fb2JqZWN0cyA9IGk5MTVfZ2VtX3Nocmlua2VyX3NjYW47CisJZGV2X3ByaXYtPm1tLnNocmlua2VyLmNvdW50X29iamVjdHMgPSBpOTE1X2dlbV9zaHJpbmtlcl9jb3VudDsKKwlkZXZfcHJpdi0+bW0uc2hyaW5rZXIuc2Vla3MgPSBERUZBVUxUX1NFRUtTOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkZXZfcHJpdi0+bW0uc2hyaW5rZXIpOworCisJZGV2X3ByaXYtPm1tLm9vbV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gaTkxNV9nZW1fc2hyaW5rZXJfb29tOworCXJlZ2lzdGVyX29vbV9ub3RpZmllcigmZGV2X3ByaXYtPm1tLm9vbV9ub3RpZmllcik7CiB9CiAKIHZvaWQgaTkxNV9nZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCkBAIC00ODU3LDI3ICs1MDAyLDQ2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWk5MTVfZ2VtX2luYWN0aXZlX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCitzdGF0aWMgYm9vbCBpOTE1X2dlbV9zaHJpbmtlcl9sb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgKnVubG9jaykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQotCQljb250YWluZXJfb2Yoc2hyaW5rZXIsCi0JCQkgICAgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLAotCQkJICAgICBtbS5pbmFjdGl2ZV9zaHJpbmtlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlib29sIHVubG9jayA9IHRydWU7Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKLQogCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpKSB7CiAJCWlmICghbXV0ZXhfaXNfbG9ja2VkX2J5KCZkZXYtPnN0cnVjdF9tdXRleCwgY3VycmVudCkpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBmYWxzZTsKIAotCQlpZiAoZGV2X3ByaXYtPm1tLnNocmlua2VyX25vX2xvY2tfc3RlYWxpbmcpCi0JCQlyZXR1cm4gMDsKKwkJaWYgKHRvX2k5MTUoZGV2KS0+bW0uc2hyaW5rZXJfbm9fbG9ja19zdGVhbGluZykKKwkJCXJldHVybiBmYWxzZTsKIAotCQl1bmxvY2sgPSBmYWxzZTsKLQl9CisJCSp1bmxvY2sgPSBmYWxzZTsKKwl9IGVsc2UKKwkJKnVubG9jayA9IHRydWU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBudW1fdm1hX2JvdW5kKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50IGNvdW50ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCAmb2JqLT52bWFfbGlzdCwgdm1hX2xpbmspCisJCWlmIChkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpCisJCQljb3VudCsrOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaTkxNV9nZW1fc2hyaW5rZXJfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwgc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQljb250YWluZXJfb2Yoc2hyaW5rZXIsIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLCBtbS5zaHJpbmtlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCWJvb2wgdW5sb2NrOworCisJaWYgKCFpOTE1X2dlbV9zaHJpbmtlcl9sb2NrKGRldiwgJnVubG9jaykpCisJCXJldHVybiAwOwogCiAJY291bnQgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLnVuYm91bmRfbGlzdCwgZ2xvYmFsX2xpc3QpCkBAIC00ODg1LDEwICs1MDQ5LDggQEAKIAkJCWNvdW50ICs9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5ib3VuZF9saXN0LCBnbG9iYWxfbGlzdCkgewotCQlpZiAob2JqLT5hY3RpdmUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWk5MTVfZ2VtX29ial9pc19waW5uZWQob2JqKSAmJiBvYmotPnBhZ2VzX3Bpbl9jb3VudCA9PSAwKQorCQlpZiAoIWk5MTVfZ2VtX29ial9pc19waW5uZWQob2JqKSAmJgorCQkgICAgb2JqLT5wYWdlc19waW5fY291bnQgPT0gbnVtX3ZtYV9ib3VuZChvYmopKQogCQkJY291bnQgKz0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsKIAl9CiAKQEAgLTQ5NjEsNDQgKzUxMjMsOTkgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWk5MTVfZ2VtX2luYWN0aXZlX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwgc3RydWN0IHNocmlua19jb250cm9sICpzYykKK2k5MTVfZ2VtX3Nocmlua2VyX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwgc3RydWN0IHNocmlua19jb250cm9sICpzYykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQotCQljb250YWluZXJfb2Yoc2hyaW5rZXIsCi0JCQkgICAgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLAotCQkJICAgICBtbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJCWNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUsIG1tLnNocmlua2VyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKIAl1bnNpZ25lZCBsb25nIGZyZWVkOwotCWJvb2wgdW5sb2NrID0gdHJ1ZTsKKwlib29sIHVubG9jazsKIAotCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpKSB7Ci0JCWlmICghbXV0ZXhfaXNfbG9ja2VkX2J5KCZkZXYtPnN0cnVjdF9tdXRleCwgY3VycmVudCkpCi0JCQlyZXR1cm4gU0hSSU5LX1NUT1A7Ci0KLQkJaWYgKGRldl9wcml2LT5tbS5zaHJpbmtlcl9ub19sb2NrX3N0ZWFsaW5nKQotCQkJcmV0dXJuIFNIUklOS19TVE9QOwotCi0JCXVubG9jayA9IGZhbHNlOwotCX0KKwlpZiAoIWk5MTVfZ2VtX3Nocmlua2VyX2xvY2soZGV2LCAmdW5sb2NrKSkKKwkJcmV0dXJuIFNIUklOS19TVE9QOwogCiAJZnJlZWQgPSBpOTE1X2dlbV9wdXJnZShkZXZfcHJpdiwgc2MtPm5yX3RvX3NjYW4pOwogCWlmIChmcmVlZCA8IHNjLT5ucl90b19zY2FuKQogCQlmcmVlZCArPSBfX2k5MTVfZ2VtX3NocmluayhkZXZfcHJpdiwKIAkJCQkJICAgc2MtPm5yX3RvX3NjYW4gLSBmcmVlZCwKIAkJCQkJICAgZmFsc2UpOwotCWlmIChmcmVlZCA8IHNjLT5ucl90b19zY2FuKQotCQlmcmVlZCArPSBpOTE1X2dlbV9zaHJpbmtfYWxsKGRldl9wcml2KTsKLQogCWlmICh1bmxvY2spCiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJcmV0dXJuIGZyZWVkOwogfQogCitzdGF0aWMgaW50CitpOTE1X2dlbV9zaHJpbmtlcl9vb20oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUsIG1tLm9vbV9ub3RpZmllcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDUwMDApICsgMTsKKwl1bnNpZ25lZCBsb25nIHBpbm5lZCwgYm91bmQsIHVuYm91bmQsIGZyZWVkOworCWJvb2wgd2FzX2ludGVycnVwdGlibGU7CisJYm9vbCB1bmxvY2s7CisKKwl3aGlsZSAoIWk5MTVfZ2VtX3Nocmlua2VyX2xvY2soZGV2LCAmdW5sb2NrKSAmJiAtLXRpbWVvdXQpCisJCXNjaGVkdWxlX3RpbWVvdXRfa2lsbGFibGUoMSk7CisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBwdXJnZSBHUFUgbWVtb3J5IGR1ZSBsb2NrIGNvbnRlbnRpb24uXG4iKTsKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCXdhc19pbnRlcnJ1cHRpYmxlID0gZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGU7CisJZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGUgPSBmYWxzZTsKKworCWZyZWVkID0gaTkxNV9nZW1fc2hyaW5rX2FsbChkZXZfcHJpdik7CisKKwlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IHdhc19pbnRlcnJ1cHRpYmxlOworCisJLyogQmVjYXVzZSB3ZSBtYXkgYmUgYWxsb2NhdGluZyBpbnNpZGUgb3VyIG93biBkcml2ZXIsIHdlIGNhbm5vdAorCSAqIGFzc2VydCB0aGF0IHRoZXJlIGFyZSBubyBvYmplY3RzIHdpdGggcGlubmVkIHBhZ2VzIHRoYXQgYXJlIG5vdAorCSAqIGJlaW5nIHBvaW50ZWQgdG8gYnkgaGFyZHdhcmUuCisJICovCisJdW5ib3VuZCA9IGJvdW5kID0gcGlubmVkID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS51bmJvdW5kX2xpc3QsIGdsb2JhbF9saXN0KSB7CisJCWlmICghb2JqLT5iYXNlLmZpbHApIC8qIG5vdCBiYWNrZWQgYnkgYSBmcmVlYWJsZSBvYmplY3QgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmIChvYmotPnBhZ2VzX3Bpbl9jb3VudCkKKwkJCXBpbm5lZCArPSBvYmotPmJhc2Uuc2l6ZTsKKwkJZWxzZQorCQkJdW5ib3VuZCArPSBvYmotPmJhc2Uuc2l6ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uYm91bmRfbGlzdCwgZ2xvYmFsX2xpc3QpIHsKKwkJaWYgKCFvYmotPmJhc2UuZmlscCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChvYmotPnBhZ2VzX3Bpbl9jb3VudCkKKwkJCXBpbm5lZCArPSBvYmotPmJhc2Uuc2l6ZTsKKwkJZWxzZQorCQkJYm91bmQgKz0gb2JqLT5iYXNlLnNpemU7CisJfQorCisJaWYgKHVubG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlwcl9pbmZvKCJQdXJnaW5nIEdQVSBtZW1vcnksICVsdSBieXRlcyBmcmVlZCwgJWx1IGJ5dGVzIHN0aWxsIHBpbm5lZC5cbiIsCisJCWZyZWVkLCBwaW5uZWQpOworCWlmICh1bmJvdW5kIHx8IGJvdW5kKQorCQlwcl9lcnIoIiVsdSBhbmQgJWx1IGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGUgIgorCQkgICAgICAgImJvdW5kIGFuZCB1bmJvdW5kIEdQVSBwYWdlIGxpc3RzLlxuIiwKKwkJICAgICAgIGJvdW5kLCB1bmJvdW5kKTsKKworCSoodW5zaWduZWQgbG9uZyAqKXB0ciArPSBmcmVlZDsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKIHN0cnVjdCBpOTE1X3ZtYSAqaTkxNV9nZW1fb2JqX3RvX2dndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKIAorCS8qIFRoaXMgV0FSTiBoYXMgcHJvYmFibHkgb3V0bGl2ZWQgaXRzIHVzZWZ1bG5lc3MgKGNhbGxlcnMgYWxyZWFkeQorCSAqIFdBUk4gaWYgdGhleSBkb24ndCBmaW5kIHRoZSBHR1RUIHZtYSB0aGV5IGV4cGVjdCkuIFdoZW4gcmVtb3ZpbmcsCisJICogcmVtZW1iZXIgdG8gcmVtb3ZlIHRoZSBwcmUtY2hlY2sgaW4gaXNfcGluX2Rpc3BsYXkoKSBhcyB3ZWxsICovCiAJaWYgKFdBUk5fT04obGlzdF9lbXB0eSgmb2JqLT52bWFfbGlzdCkpKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5jCmluZGV4IGQ3MmRiMTVhLi4zZmZlMzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9jb250ZXh0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fY29udGV4dC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAogdm9pZCBpOTE1X2dlbV9jb250ZXh0X2ZyZWUoc3RydWN0IGtyZWYgKmN0eF9yZWYpCiB7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4ID0gY29udGFpbmVyX29mKGN0eF9yZWYsCisJc3RydWN0IGludGVsX2NvbnRleHQgKmN0eCA9IGNvbnRhaW5lcl9vZihjdHhfcmVmLAogCQkJCQkJICAgdHlwZW9mKCpjdHgpLCByZWYpOwogCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IE5VTEw7CiAKQEAgLTE5OSw3ICsxOTksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGk5MTVfaHdfcHBndHQgKgotY3JlYXRlX3ZtX2Zvcl9jdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4KQorY3JlYXRlX3ZtX2Zvcl9jdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGludGVsX2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQ7CiAJaW50IHJldDsKQEAgLTIxOCwxMiArMjE4LDEyIEBACiAJcmV0dXJuIHBwZ3R0OwogfQogCi1zdGF0aWMgc3RydWN0IGk5MTVfaHdfY29udGV4dCAqCitzdGF0aWMgc3RydWN0IGludGVsX2NvbnRleHQgKgogX19jcmVhdGVfaHdfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkgIHN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCWludCByZXQ7CiAKIAljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CkBAIC0yNDAsNyArMjQwLDE1IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAotCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNykgeworCQkvKgorCQkgKiBUcnkgdG8gbWFrZSB0aGUgY29udGV4dCB1dGlsaXplIEwzIGFzIHdlbGwgYXMgTExDLgorCQkgKgorCQkgKiBPbiBWTFYgd2UgZG9uJ3QgaGF2ZSBMMyBjb250cm9scyBpbiB0aGUgUFRFcyBzbyB3ZQorCQkgKiBzaG91bGRuJ3QgdG91Y2ggdGhlIGNhY2hlIGxldmVsLCBlc3BlY2lhbGx5IGFzIHRoYXQKKwkJICogd291bGQgbWFrZSB0aGUgb2JqZWN0IHNub29wZWQgd2hpY2ggbWlnaHQgaGF2ZSBhCisJCSAqIG5lZ2F0aXZlIHBlcmZvcm1hbmNlIGltcGFjdC4KKwkJICovCisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3ICYmICFJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfY2FjaGVfbGV2ZWwoY3R4LT5vYmosCiAJCQkJCQkJICAgICAgSTkxNV9DQUNIRV9MM19MTEMpOwogCQkJLyogRmFpbHVyZSBzaG91bGRuJ3QgZXZlciBoYXBwZW4gdGhpcyBlYXJseSAqLwpAQCAtMjc3LDE0ICsyODUsMTQgQEAKICAqIGNvbnRleHQgc3RhdGUgb2YgdGhlIEdQVSBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgdXRpbGl6ZSBIVyBjb250ZXh0cywgYXMKICAqIHdlbGwgYXMgYW4gaWRsZSBjYXNlLgogICovCi1zdGF0aWMgc3RydWN0IGk5MTVfaHdfY29udGV4dCAqCitzdGF0aWMgc3RydWN0IGludGVsX2NvbnRleHQgKgogaTkxNV9nZW1fY3JlYXRlX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdiwKIAkJCWJvb2wgY3JlYXRlX3ZtKQogewogCWNvbnN0IGJvb2wgaXNfZ2xvYmFsX2RlZmF1bHRfY3R4ID0gZmlsZV9wcml2ID09IE5VTEw7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmN0eDsKIAlpbnQgcmV0ID0gMDsKIAogCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwpAQCAtMzU2LDggKzM2NCw4IEBACiAJLyogUHJldmVudCB0aGUgaGFyZHdhcmUgZnJvbSByZXN0b3JpbmcgdGhlIGxhc3QgY29udGV4dCAod2hpY2ggaHVuZykgb24KIAkgKiB0aGUgbmV4dCBzd2l0Y2ggKi8KIAlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykgewotCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07Ci0JCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmRjdHggPSByaW5nLT5kZWZhdWx0X2NvbnRleHQ7CisJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CisJCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpkY3R4ID0gcmluZy0+ZGVmYXVsdF9jb250ZXh0OwogCiAJCS8qIERvIGEgZmFrZSBzd2l0Y2ggdG8gdGhlIGRlZmF1bHQgY29udGV4dCAqLwogCQlpZiAocmluZy0+bGFzdF9jb250ZXh0ID09IGRjdHgpCkBAIC0zODMsNyArMzkxLDcgQEAKIGludCBpOTE1X2dlbV9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCWludCBpOwogCiAJLyogSW5pdCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlIGxvYWQuIEV2ZW50dWFsbHkgdGhlCkBAIC00MTgsNyArNDI2LDcgQEAKIHZvaWQgaTkxNV9nZW1fY29udGV4dF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpkY3R4ID0gZGV2X3ByaXYtPnJpbmdbUkNTXS5kZWZhdWx0X2NvbnRleHQ7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmRjdHggPSBkZXZfcHJpdi0+cmluZ1tSQ1NdLmRlZmF1bHRfY29udGV4dDsKIAlpbnQgaTsKIAogCWlmIChkY3R4LT5vYmopIHsKQEAgLTQ0MSwxMCArNDQ5LDEyIEBACiAJCQlpOTE1X2dlbV9jb250ZXh0X3VucmVmZXJlbmNlKGRjdHgpOwogCQkJZGV2X3ByaXYtPnJpbmdbUkNTXS5sYXN0X2NvbnRleHQgPSBOVUxMOwogCQl9CisKKwkJaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5waW4oZGN0eC0+b2JqKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykgewotCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CisJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CiAKIAkJaWYgKHJpbmctPmxhc3RfY29udGV4dCkKIAkJCWk5MTVfZ2VtX2NvbnRleHRfdW5yZWZlcmVuY2UocmluZy0+bGFzdF9jb250ZXh0KTsKQEAgLTQ1MywxMyArNDYzLDEyIEBACiAJCXJpbmctPmxhc3RfY29udGV4dCA9IE5VTEw7CiAJfQogCi0JaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5waW4oZGN0eC0+b2JqKTsKIAlpOTE1X2dlbV9jb250ZXh0X3VucmVmZXJlbmNlKGRjdHgpOwogfQogCiBpbnQgaTkxNV9nZW1fY29udGV4dF9lbmFibGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCByZXQsIGk7CiAKIAkvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoZSBhbGlhc2luZyBQUEdUVCBnZXRzIGVuYWJsZWQsIHdoaWNoIG1lYW5zCkBAIC00ODYsMTEgKzQ5NSw3IEBACiAKIHN0YXRpYyBpbnQgY29udGV4dF9pZHJfY2xlYW51cChpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4ID0gcDsKLQotCS8qIElnbm9yZSB0aGUgZGVmYXVsdCBjb250ZXh0IGJlY2F1c2UgY2xvc2Ugd2lsbCBoYW5kbGUgaXQgKi8KLQlpZiAoaTkxNV9nZW1fY29udGV4dF9pc19kZWZhdWx0KGN0eCkpCi0JCXJldHVybiAwOworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHggPSBwOwogCiAJaTkxNV9nZW1fY29udGV4dF91bnJlZmVyZW5jZShjdHgpOwogCXJldHVybiAwOwpAQCAtNDk5LDE3ICs1MDQsMTcgQEAKIGludCBpOTE1X2dlbV9jb250ZXh0X29wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdiA9IGZpbGUtPmRyaXZlcl9wcml2OworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHg7CiAKIAlpZHJfaW5pdCgmZmlsZV9wcml2LT5jb250ZXh0X2lkcik7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZmlsZV9wcml2LT5wcml2YXRlX2RlZmF1bHRfY3R4ID0KLQkJaTkxNV9nZW1fY3JlYXRlX2NvbnRleHQoZGV2LCBmaWxlX3ByaXYsIFVTRVNfRlVMTF9QUEdUVChkZXYpKTsKKwljdHggPSBpOTE1X2dlbV9jcmVhdGVfY29udGV4dChkZXYsIGZpbGVfcHJpdiwgVVNFU19GVUxMX1BQR1RUKGRldikpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JaWYgKElTX0VSUihmaWxlX3ByaXYtPnByaXZhdGVfZGVmYXVsdF9jdHgpKSB7CisJaWYgKElTX0VSUihjdHgpKSB7CiAJCWlkcl9kZXN0cm95KCZmaWxlX3ByaXYtPmNvbnRleHRfaWRyKTsKLQkJcmV0dXJuIFBUUl9FUlIoZmlsZV9wcml2LT5wcml2YXRlX2RlZmF1bHRfY3R4KTsKKwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTUyMSwxNiArNTI2LDE0IEBACiAKIAlpZHJfZm9yX2VhY2goJmZpbGVfcHJpdi0+Y29udGV4dF9pZHIsIGNvbnRleHRfaWRyX2NsZWFudXAsIE5VTEwpOwogCWlkcl9kZXN0cm95KCZmaWxlX3ByaXYtPmNvbnRleHRfaWRyKTsKLQotCWk5MTVfZ2VtX2NvbnRleHRfdW5yZWZlcmVuY2UoZmlsZV9wcml2LT5wcml2YXRlX2RlZmF1bHRfY3R4KTsKIH0KIAotc3RydWN0IGk5MTVfaHdfY29udGV4dCAqCitzdHJ1Y3QgaW50ZWxfY29udGV4dCAqCiBpOTE1X2dlbV9jb250ZXh0X2dldChzdHJ1Y3QgZHJtX2k5MTVfZmlsZV9wcml2YXRlICpmaWxlX3ByaXYsIHUzMiBpZCkKIHsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmN0eDsKIAotCWN0eCA9IChzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICopaWRyX2ZpbmQoJmZpbGVfcHJpdi0+Y29udGV4dF9pZHIsIGlkKTsKKwljdHggPSAoc3RydWN0IGludGVsX2NvbnRleHQgKilpZHJfZmluZCgmZmlsZV9wcml2LT5jb250ZXh0X2lkciwgaWQpOwogCWlmICghY3R4KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIApAQCAtNTM4LDggKzU0MSw4IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1taV9zZXRfY29udGV4dChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JICAgICAgIHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKm5ld19jb250ZXh0LAorbWlfc2V0X2NvbnRleHQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkgICAgICAgc3RydWN0IGludGVsX2NvbnRleHQgKm5ld19jb250ZXh0LAogCSAgICAgICB1MzIgaHdfZmxhZ3MpCiB7CiAJaW50IHJldDsKQEAgLTU0OSw3ICs1NTIsNyBAQAogCSAqIGV4cGxpY2l0bHksIHNvIHdlIHJlbHkgb24gdGhlIHZhbHVlIGF0IHJpbmcgaW5pdCwgc3RvcmVkIGluCiAJICogaXRsYl9iZWZvcmVfY3R4X3N3aXRjaC4KIAkgKi8KLQlpZiAoSVNfR0VONihyaW5nLT5kZXYpICYmIHJpbmctPml0bGJfYmVmb3JlX2N0eF9zd2l0Y2gpIHsKKwlpZiAoSVNfR0VONihyaW5nLT5kZXYpKSB7CiAJCXJldCA9IHJpbmctPmZsdXNoKHJpbmcsIEk5MTVfR0VNX0dQVV9ET01BSU5TLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC01NTksOCArNTYyLDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogV2FQcm9ncmFtTWlBcmJPbk9mZkFyb3VuZE1pU2V0Q29udGV4dDppdmIsdmx2LGhzdyAqLwotCWlmIChJU19HRU43KHJpbmctPmRldikpCisJLyogV2FQcm9ncmFtTWlBcmJPbk9mZkFyb3VuZE1pU2V0Q29udGV4dDppdmIsdmx2LGhzdyxiZHcsY2h2ICovCisJaWYgKElOVEVMX0lORk8ocmluZy0+ZGV2KS0+Z2VuID49IDcpCiAJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0RJU0FCTEUpOwogCWVsc2UKIAkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOwpAQCAtNTc4LDcgKzU4MSw3IEBACiAJICovCiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOwogCi0JaWYgKElTX0dFTjcocmluZy0+ZGV2KSkKKwlpZiAoSU5URUxfSU5GTyhyaW5nLT5kZXYpLT5nZW4gPj0gNykKIAkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJfRU5BQkxFKTsKIAllbHNlCiAJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKQEAgLTU4OCwxMSArNTkxLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkb19zd2l0Y2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgICAgIHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKnRvKQorc3RhdGljIGludCBkb19zd2l0Y2goc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqdG8pCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpmcm9tID0gcmluZy0+bGFzdF9jb250ZXh0OworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpmcm9tID0gcmluZy0+bGFzdF9jb250ZXh0OwogCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGN0eF90b19wcGd0dCh0byk7CiAJdTMyIGh3X2ZsYWdzID0gMDsKIAlpbnQgcmV0LCBpOwpAQCAtNjkzLDEzICs2OTYsMTkgQEAKIAkJaTkxNV9nZW1fY29udGV4dF91bnJlZmVyZW5jZShmcm9tKTsKIAl9CiAKLQl0by0+aXNfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCiBkb25lOgogCWk5MTVfZ2VtX2NvbnRleHRfcmVmZXJlbmNlKHRvKTsKIAlyaW5nLT5sYXN0X2NvbnRleHQgPSB0bzsKIAl0by0+bGFzdF9yaW5nID0gcmluZzsKIAorCWlmIChyaW5nLT5pZCA9PSBSQ1MgJiYgIXRvLT5pc19pbml0aWFsaXplZCAmJiBmcm9tID09IE5VTEwpIHsKKwkJcmV0ID0gaTkxNV9nZW1fcmVuZGVyX3N0YXRlX2luaXQocmluZyk7CisJCWlmIChyZXQpCisJCQlEUk1fRVJST1IoImluaXQgcmVuZGVyIHN0YXRlOiAlZFxuIiwgcmV0KTsKKwl9CisKKwl0by0+aXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworCiAJcmV0dXJuIDA7CiAKIHVucGluX291dDoKQEAgLTcxOCw4ICs3MjcsOCBAQAogICogaXQgd2lsbCBoYXZlIGEgcmVmb3VjbnQgPiAxLiBUaGlzIGFsbG93cyB1cyB0byBkZXN0cm95IHRoZSBjb250ZXh0IGFic3RyYWN0CiAgKiBvYmplY3Qgd2hpbGUgbGV0dGluZyB0aGUgbm9ybWFsIG9iamVjdCB0cmFja2luZyBkZXN0cm95IHRoZSBiYWNraW5nIEJPLgogICovCi1pbnQgaTkxNV9zd2l0Y2hfY29udGV4dChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICp0bykKK2ludCBpOTE1X3N3aXRjaF9jb250ZXh0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCisJCQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqdG8pCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNzQ4LDcgKzc1Nyw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2NyZWF0ZSAqYXJncyA9IGRhdGE7CiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4OworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHg7CiAJaW50IHJldDsKIAogCWlmICghaHdfY29udGV4dF9lbmFibGVkKGRldikpCkBAIC03NzQsNyArNzgzLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfZGVzdHJveSAqYXJncyA9IGRhdGE7CiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gZmlsZS0+ZHJpdmVyX3ByaXY7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4OworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHg7CiAJaW50IHJldDsKIAogCWlmIChhcmdzLT5jdHhfaWQgPT0gREVGQVVMVF9DT05URVhUX0lEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kbWFidWYuYwppbmRleCA5YmI1MzNlLi41ODBhYTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kbWFidWYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kbWFidWYuYwpAQCAtMTYxLDEyICsxNjEsOCBAQAogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkbWFfYnVmX3RvX29iaihkbWFfYnVmKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlpbnQgcmV0OwogCi0JcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm47Ci0KKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKC0tb2JqLT52bWFwcGluZ19jb3VudCA9PSAwKSB7CiAJCXZ1bm1hcChvYmotPmRtYV9idWZfdm1hcHBpbmcpOwogCQlvYmotPmRtYV9idWZfdm1hcHBpbmcgPSBOVUxMOwpAQCAtMjMzLDYgKzIyOSwxNCBAQAogc3RydWN0IGRtYV9idWYgKmk5MTVfZ2VtX3ByaW1lX2V4cG9ydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtX29iaiwgaW50IGZsYWdzKQogeworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyhnZW1fb2JqKTsKKworCWlmIChvYmotPm9wcy0+ZG1hYnVmX2V4cG9ydCkgeworCQlpbnQgcmV0ID0gb2JqLT5vcHMtPmRtYWJ1Zl9leHBvcnQob2JqKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCiAJcmV0dXJuIGRtYV9idWZfZXhwb3J0KGdlbV9vYmosICZpOTE1X2RtYWJ1Zl9vcHMsIGdlbV9vYmotPnNpemUsIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCmluZGV4IDIwZmVmNmMuLjNhMzAxMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKQEAgLTI2NSwxMCArMjY1LDEyIEBACiAKIHN0YXRpYyBpbnQKIHJlbG9jYXRlX2VudHJ5X2NwdShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jKQorCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jLAorCQkgICB1aW50NjRfdCB0YXJnZXRfb2Zmc2V0KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXVpbnQzMl90IHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocmVsb2MtPm9mZnNldCk7CisJdWludDY0X3QgZGVsdGEgPSByZWxvYy0+ZGVsdGEgKyB0YXJnZXRfb2Zmc2V0OwogCWNoYXIgKnZhZGRyOwogCWludCByZXQ7CiAKQEAgLTI3OCw3ICsyODAsNyBAQAogCiAJdmFkZHIgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2Uob2JqLAogCQkJCXJlbG9jLT5vZmZzZXQgPj4gUEFHRV9TSElGVCkpOwotCSoodWludDMyX3QgKikodmFkZHIgKyBwYWdlX29mZnNldCkgPSByZWxvYy0+ZGVsdGE7CisJKih1aW50MzJfdCAqKSh2YWRkciArIHBhZ2Vfb2Zmc2V0KSA9IGxvd2VyXzMyX2JpdHMoZGVsdGEpOwogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpIHsKIAkJcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwYWdlX29mZnNldCArIHNpemVvZih1aW50MzJfdCkpOwpAQCAtMjg5LDcgKzI5MSw3IEBACiAJCQkgICAgKHJlbG9jLT5vZmZzZXQgKyBzaXplb2YodWludDMyX3QpKSA+PiBQQUdFX1NISUZUKSk7CiAJCX0KIAotCQkqKHVpbnQzMl90ICopKHZhZGRyICsgcGFnZV9vZmZzZXQpID0gMDsKKwkJKih1aW50MzJfdCAqKSh2YWRkciArIHBhZ2Vfb2Zmc2V0KSA9IHVwcGVyXzMyX2JpdHMoZGVsdGEpOwogCX0KIAogCWt1bm1hcF9hdG9taWModmFkZHIpOwpAQCAtMjk5LDEwICszMDEsMTIgQEAKIAogc3RhdGljIGludAogcmVsb2NhdGVfZW50cnlfZ3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2MpCisJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2MsCisJCSAgIHVpbnQ2NF90IHRhcmdldF9vZmZzZXQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50NjRfdCBkZWx0YSA9IHJlbG9jLT5kZWx0YSArIHRhcmdldF9vZmZzZXQ7CiAJdWludDMyX3QgX19pb21lbSAqcmVsb2NfZW50cnk7CiAJdm9pZCBfX2lvbWVtICpyZWxvY19wYWdlOwogCWludCByZXQ7CkBAIC0zMjEsNyArMzI1LDcgQEAKIAkJCXJlbG9jLT5vZmZzZXQgJiBQQUdFX01BU0spOwogCXJlbG9jX2VudHJ5ID0gKHVpbnQzMl90IF9faW9tZW0gKikKIAkJKHJlbG9jX3BhZ2UgKyBvZmZzZXRfaW5fcGFnZShyZWxvYy0+b2Zmc2V0KSk7Ci0JaW93cml0ZTMyKHJlbG9jLT5kZWx0YSwgcmVsb2NfZW50cnkpOworCWlvd3JpdGUzMihsb3dlcl8zMl9iaXRzKGRlbHRhKSwgcmVsb2NfZW50cnkpOwogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpIHsKIAkJcmVsb2NfZW50cnkgKz0gMTsKQEAgLTMzNCw3ICszMzgsNyBAQAogCQkJcmVsb2NfZW50cnkgPSByZWxvY19wYWdlOwogCQl9CiAKLQkJaW93cml0ZTMyKDAsIHJlbG9jX2VudHJ5KTsKKwkJaW93cml0ZTMyKHVwcGVyXzMyX2JpdHMoZGVsdGEpLCByZWxvY19lbnRyeSk7CiAJfQogCiAJaW9fbWFwcGluZ191bm1hcF9hdG9taWMocmVsb2NfcGFnZSk7CkBAIC0zNTEsNyArMzU1LDcgQEAKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnRhcmdldF9vYmo7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnRhcmdldF9pOTE1X29iajsKIAlzdHJ1Y3QgaTkxNV92bWEgKnRhcmdldF92bWE7Ci0JdWludDMyX3QgdGFyZ2V0X29mZnNldDsKKwl1aW50NjRfdCB0YXJnZXRfb2Zmc2V0OwogCWludCByZXQ7CiAKIAkvKiB3ZSd2ZSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UgdG8gYWxsIHZhbGlkIG9iamVjdHMgKi8KQEAgLTQyOSwxMSArNDMzLDEwIEBACiAJaWYgKG9iai0+YWN0aXZlICYmIGluX2F0b21pYygpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJlbG9jLT5kZWx0YSArPSB0YXJnZXRfb2Zmc2V0OwogCWlmICh1c2VfY3B1X3JlbG9jKG9iaikpCi0JCXJldCA9IHJlbG9jYXRlX2VudHJ5X2NwdShvYmosIHJlbG9jKTsKKwkJcmV0ID0gcmVsb2NhdGVfZW50cnlfY3B1KG9iaiwgcmVsb2MsIHRhcmdldF9vZmZzZXQpOwogCWVsc2UKLQkJcmV0ID0gcmVsb2NhdGVfZW50cnlfZ3R0KG9iaiwgcmVsb2MpOworCQlyZXQgPSByZWxvY2F0ZV9lbnRyeV9ndHQob2JqLCByZWxvYywgdGFyZ2V0X29mZnNldCk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTQxLDcgKzU0NCw3IEBACiAKIHN0YXRpYyBpbnQKIGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVzZXJ2ZV92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJYm9vbCAqbmVlZF9yZWxvYykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7CkBAIC02MjgsNyArNjMxLDcgQEAKIH0KIAogc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmVzZXJ2ZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnZtYXMsCiAJCQkgICAgYm9vbCAqbmVlZF9yZWxvY3MpCiB7CkBAIC02NDIsNiArNjQ1LDggQEAKIAlpZiAobGlzdF9lbXB0eSh2bWFzKSkKIAkJcmV0dXJuIDA7CiAKKwlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhyaW5nKTsKKwogCXZtID0gbGlzdF9maXJzdF9lbnRyeSh2bWFzLCBzdHJ1Y3QgaTkxNV92bWEsIGV4ZWNfbGlzdCktPnZtOwogCiAJSU5JVF9MSVNUX0hFQUQoJm9yZGVyZWRfdm1hcyk7CkBAIC03MjcsNyArNzMyLDcgQEAKIGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqYXJncywKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKLQkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJICBzdHJ1Y3QgZWJfdm1hcyAqZWIsCiAJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYykKIHsKQEAgLTg0Myw3ICs4NDgsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fZ3B1KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfbW92ZV90b19ncHUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCQlzdHJ1Y3QgbGlzdF9oZWFkICp2bWFzKQogewogCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwpAQCAtOTI2LDExICs5MzEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKgorc3RhdGljIHN0cnVjdCBpbnRlbF9jb250ZXh0ICoKIGk5MTVfZ2VtX3ZhbGlkYXRlX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlLAotCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGNvbnN0IHUzMiBjdHhfaWQpCisJCQkgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIGNvbnN0IHUzMiBjdHhfaWQpCiB7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4ID0gTlVMTDsKIAlzdHJ1Y3QgaTkxNV9jdHhfaGFuZ19zdGF0cyAqaHM7CiAKIAlpZiAocmluZy0+aWQgIT0gUkNTICYmIGN0eF9pZCAhPSBERUZBVUxUX0NPTlRFWFRfSUQpCkBAIC05NTEsNyArOTU2LDcgQEAKIAogc3RhdGljIHZvaWQKIGk5MTVfZ2VtX2V4ZWNidWZmZXJfbW92ZV90b19hY3RpdmUoc3RydWN0IGxpc3RfaGVhZCAqdm1hcywKLQkJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQkJICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKIApAQCAtOTc0LDYgKzk3OSw5IEBACiAJCQlpZiAoaTkxNV9nZW1fb2JqX2dndHRfYm91bmQob2JqKSAmJgogCQkJICAgIGk5MTVfZ2VtX29ial90b19nZ3R0KG9iaiktPnBpbl9jb3VudCkKIAkJCQlpbnRlbF9tYXJrX2ZiX2J1c3kob2JqLCByaW5nKTsKKworCQkJLyogdXBkYXRlIGZvciB0aGUgaW1wbGljaXQgZmx1c2ggYWZ0ZXIgYSBiYXRjaCAqLworCQkJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmPSB+STkxNV9HRU1fR1BVX0RPTUFJTlM7CiAJCX0KIAogCQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosIG9sZF9yZWFkLCBvbGRfd3JpdGUpOwpAQCAtOTgzLDcgKzk5MSw3IEBACiBzdGF0aWMgdm9pZAogaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXRpcmVfY29tbWFuZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlLAotCQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CiAJLyogVW5jb25kaXRpb25hbGx5IGZvcmNlIGFkZF9yZXF1ZXN0IHRvIGVtaXQgYSBmdWxsIGZsdXNoLiAqLwpAQCAtOTk1LDEzICsxMDAzLDE1IEBACiAKIHN0YXRpYyBpbnQKIGk5MTVfcmVzZXRfZ2VuN19zb2xfb2Zmc2V0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKKwkJCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldCwgaTsKIAotCWlmICghSVNfR0VONyhkZXYpIHx8IHJpbmcgIT0gJmRldl9wcml2LT5yaW5nW1JDU10pCi0JCXJldHVybiAwOworCWlmICghSVNfR0VONyhkZXYpIHx8IHJpbmcgIT0gJmRldl9wcml2LT5yaW5nW1JDU10pIHsKKwkJRFJNX0RFQlVHKCJzb2wgcmVzZXQgaXMgZ2VuNy9yY3Mgb25seVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCAqIDMpOwogCWlmIChyZXQpCkBAIC0xMDE4LDYgKzEwMjgsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBGaW5kIG9uZSBCU0QgcmluZyB0byBkaXNwYXRjaCB0aGUgY29ycmVzcG9uZGluZyBCU0QgY29tbWFuZC4KKyAqIFRoZSBSaW5nIElEIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IGdlbjhfZGlzcGF0Y2hfYnNkX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdiA9IGZpbGUtPmRyaXZlcl9wcml2OworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgZmlsZV9wcml2IGlzIHVzaW5nIG9uZSByaW5nICovCisJaWYgKGZpbGVfcHJpdi0+YnNkX3JpbmcpCisJCXJldHVybiBmaWxlX3ByaXYtPmJzZF9yaW5nLT5pZDsKKwllbHNlIHsKKwkJLyogSWYgbm8sIHVzZSB0aGUgcGluZy1wb25nIG1lY2hhbmlzbSB0byBzZWxlY3Qgb25lIHJpbmcgKi8KKwkJaW50IHJpbmdfaWQ7CisKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpZiAoZGV2X3ByaXYtPm1tLmJzZF9yaW5nX2Rpc3BhdGNoX2luZGV4ID09IDApIHsKKwkJCXJpbmdfaWQgPSBWQ1M7CisJCQlkZXZfcHJpdi0+bW0uYnNkX3JpbmdfZGlzcGF0Y2hfaW5kZXggPSAxOworCQl9IGVsc2UgeworCQkJcmluZ19pZCA9IFZDUzI7CisJCQlkZXZfcHJpdi0+bW0uYnNkX3JpbmdfZGlzcGF0Y2hfaW5kZXggPSAwOworCQl9CisJCWZpbGVfcHJpdi0+YnNkX3JpbmcgPSAmZGV2X3ByaXYtPnJpbmdbcmluZ19pZF07CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gcmluZ19pZDsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCiBlYl9nZXRfYmF0Y2goc3RydWN0IGViX3ZtYXMgKmViKQogewpAQCAtMTA0NywxMSArMTA4OCwxMSBAQAogCXN0cnVjdCBlYl92bWFzICplYjsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqYmF0Y2hfb2JqOwogCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgPSBOVUxMOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtOwogCWNvbnN0IHUzMiBjdHhfaWQgPSBpOTE1X2V4ZWNidWZmZXIyX2dldF9jb250ZXh0X2lkKCphcmdzKTsKLQl1MzIgZXhlY19zdGFydCA9IGFyZ3MtPmJhdGNoX3N0YXJ0X29mZnNldCwgZXhlY19sZW47CisJdTY0IGV4ZWNfc3RhcnQgPSBhcmdzLT5iYXRjaF9zdGFydF9vZmZzZXQsIGV4ZWNfbGVuOwogCXUzMiBtYXNrLCBmbGFnczsKIAlpbnQgcmV0LCBtb2RlLCBpOwogCWJvb2wgbmVlZF9yZWxvY3M7CkBAIC0xMDczLDcgKzExMTQsNyBAQAogCWlmIChhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19JU19QSU5ORUQpCiAJCWZsYWdzIHw9IEk5MTVfRElTUEFUQ0hfUElOTkVEOwogCi0JaWYgKChhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spID4gSTkxNV9OVU1fUklOR1MpIHsKKwlpZiAoKGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX1JJTkdfTUFTSykgPiBMQVNUX1VTRVJfUklORykgewogCQlEUk1fREVCVUcoImV4ZWNidWYgd2l0aCB1bmtub3duIHJpbmc6ICVkXG4iLAogCQkJICAoaW50KShhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDgxLDcgKzExMjIsMTQgQEAKIAogCWlmICgoYXJncy0+ZmxhZ3MgJiBJOTE1X0VYRUNfUklOR19NQVNLKSA9PSBJOTE1X0VYRUNfREVGQVVMVCkKIAkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOwotCWVsc2UKKwllbHNlIGlmICgoYXJncy0+ZmxhZ3MgJiBJOTE1X0VYRUNfUklOR19NQVNLKSA9PSBJOTE1X0VYRUNfQlNEKSB7CisJCWlmIChIQVNfQlNEMihkZXYpKSB7CisJCQlpbnQgcmluZ19pZDsKKwkJCXJpbmdfaWQgPSBnZW44X2Rpc3BhdGNoX2JzZF9yaW5nKGRldiwgZmlsZSk7CisJCQlyaW5nID0gJmRldl9wcml2LT5yaW5nW3JpbmdfaWRdOworCQl9IGVsc2UKKwkJCXJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbVkNTXTsKKwl9IGVsc2UKIAkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1soYXJncy0+ZmxhZ3MgJiBJOTE1X0VYRUNfUklOR19NQVNLKSAtIDFdOwogCiAJaWYgKCFpbnRlbF9yaW5nX2luaXRpYWxpemVkKHJpbmcpKSB7CkBAIC0xMDk2LDE0ICsxMTQ0LDIyIEBACiAJY2FzZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9HRU5FUkFMOgogCWNhc2UgSTkxNV9FWEVDX0NPTlNUQU5UU19BQlNPTFVURToKIAljYXNlIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0U6Ci0JCWlmIChyaW5nID09ICZkZXZfcHJpdi0+cmluZ1tSQ1NdICYmCi0JCSAgICBtb2RlICE9IGRldl9wcml2LT5yZWxhdGl2ZV9jb25zdGFudHNfbW9kZSkgewotCQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKKwkJaWYgKG1vZGUgIT0gMCAmJiByaW5nICE9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdKSB7CisJCQlEUk1fREVCVUcoIm5vbi0wIHJlbCBjb25zdGFudHMgbW9kZSBvbiBub24tUkNTXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG1vZGUgIT0gZGV2X3ByaXYtPnJlbGF0aXZlX2NvbnN0YW50c19tb2RlKSB7CisJCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0KSB7CisJCQkJRFJNX0RFQlVHKCJubyByZWwgY29uc3RhbnRzIG9uIHByZS1nZW40XG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAogCQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gNSAmJgotCQkJICAgIG1vZGUgPT0gSTkxNV9FWEVDX0NPTlNUQU5UU19SRUxfU1VSRkFDRSkKKwkJCSAgICBtb2RlID09IEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0UpIHsKKwkJCQlEUk1fREVCVUcoInJlbCBzdXJmYWNlIGNvbnN0YW50cyBtb2RlIGludmFsaWQgb24gZ2VuNStcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCiAJCQkvKiBUaGUgSFcgY2hhbmdlZCB0aGUgbWVhbmluZyBvbiB0aGlzIGJpdCBvbiBnZW42ICovCiAJCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikKQEAgLTExNTEsNiArMTIwNywxNiBAQAogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gcHJlX211dGV4X2VycjsKIAkJfQorCX0gZWxzZSB7CisJCWlmIChhcmdzLT5EUjQgPT0gMHhmZmZmZmZmZikgeworCQkJRFJNX0RFQlVHKCJVWEEgc3VibWl0dGluZyBnYXJiYWdlIERSNCwgZml4aW5nIHVwXG4iKTsKKwkJCWFyZ3MtPkRSNCA9IDA7CisJCX0KKworCQlpZiAoYXJncy0+RFIxIHx8IGFyZ3MtPkRSNCB8fCBhcmdzLT5jbGlwcmVjdHNfcHRyKSB7CisJCQlEUk1fREVCVUcoIjAgY2xpcHJlY3RzIGJ1dCBkaXJ0IGluIGNsaXByZWN0cyBmaWVsZHNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKIAlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CkBAIC0xMTcwLDcgKzEyMzYsNyBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0ID0gUFRSX0VSUihjdHgpOwogCQlnb3RvIHByZV9tdXRleF9lcnI7Ci0JfSAKKwl9CiAKIAlpOTE1X2dlbV9jb250ZXh0X3JlZmVyZW5jZShjdHgpOwogCkBAIC0xMTgwLDYgKzEyNDYsNyBAQAogCiAJZWIgPSBlYl9jcmVhdGUoYXJncyk7CiAJaWYgKGViID09IE5VTEwpIHsKKwkJaTkxNV9nZW1fY29udGV4dF91bnJlZmVyZW5jZShjdHgpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBwcmVfbXV0ZXhfZXJyOwpAQCAtMTQzMCw2ICsxNDk3LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChhcmdzLT5yc3ZkMiAhPSAwKSB7CisJCURSTV9ERUJVRygiZGlydHkgcnZzZDIgZmllbGRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlleGVjMl9saXN0ID0ga21hbGxvYyhzaXplb2YoKmV4ZWMyX2xpc3QpKmFyZ3MtPmJ1ZmZlcl9jb3VudCwKIAkJCSAgICAgR0ZQX1RFTVBPUkFSWSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpOwogCWlmIChleGVjMl9saXN0ID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCmluZGV4IDVkZWIyMjguLmVlYzgyMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCkBAIC0zMCw3ICszMCw4IEBACiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogCi1zdGF0aWMgdm9pZCBnZW44X3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgYmR3X3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgY2h2X3NldHVwX3ByaXZhdGVfcHBhdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogCiBib29sIGludGVsX2VuYWJsZV9wcGd0dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGZ1bGwpCiB7CkBAIC02NSw1OSArNjYsNiBAQAogCXJldHVybiBIQVNfQUxJQVNJTkdfUFBHVFQoZGV2KSA/IDEgOiAwOwogfQogCi0jZGVmaW5lIEdFTjZfUFBHVFRfUERfRU5UUklFUyA1MTIKLSNkZWZpbmUgSTkxNV9QUEdUVF9QVF9FTlRSSUVTIChQQUdFX1NJWkUgLyBzaXplb2YoZ2VuNl9ndHRfcHRlX3QpKQotdHlwZWRlZiB1aW50NjRfdCBnZW44X2d0dF9wdGVfdDsKLXR5cGVkZWYgZ2VuOF9ndHRfcHRlX3QgZ2VuOF9wcGd0dF9wZGVfdDsKLQotLyogUFBHVFQgc3R1ZmYgKi8KLSNkZWZpbmUgR0VONl9HVFRfQUREUl9FTkNPREUoYWRkcikJKChhZGRyKSB8ICgoKGFkZHIpID4+IDI4KSAmIDB4ZmYwKSkKLSNkZWZpbmUgSFNXX0dUVF9BRERSX0VOQ09ERShhZGRyKQkoKGFkZHIpIHwgKCgoYWRkcikgPj4gMjgpICYgMHg3ZjApKQotCi0jZGVmaW5lIEdFTjZfUERFX1ZBTElECQkJKDEgPDwgMCkKLS8qIGdlbjYrIGhhcyBiaXQgMTEtNCBmb3IgcGh5c2ljYWwgYWRkciBiaXQgMzktMzIgKi8KLSNkZWZpbmUgR0VONl9QREVfQUREUl9FTkNPREUoYWRkcikJR0VONl9HVFRfQUREUl9FTkNPREUoYWRkcikKLQotI2RlZmluZSBHRU42X1BURV9WQUxJRAkJCSgxIDw8IDApCi0jZGVmaW5lIEdFTjZfUFRFX1VOQ0FDSEVECQkoMSA8PCAxKQotI2RlZmluZSBIU1dfUFRFX1VOQ0FDSEVECQkoMCkKLSNkZWZpbmUgR0VONl9QVEVfQ0FDSEVfTExDCQkoMiA8PCAxKQotI2RlZmluZSBHRU43X1BURV9DQUNIRV9MM19MTEMJCSgzIDw8IDEpCi0jZGVmaW5lIEdFTjZfUFRFX0FERFJfRU5DT0RFKGFkZHIpCUdFTjZfR1RUX0FERFJfRU5DT0RFKGFkZHIpCi0jZGVmaW5lIEhTV19QVEVfQUREUl9FTkNPREUoYWRkcikJSFNXX0dUVF9BRERSX0VOQ09ERShhZGRyKQotCi0vKiBDYWNoZWFiaWxpdHkgQ29udHJvbCBpcyBhIDQtYml0IHZhbHVlLiBUaGUgbG93IHRocmVlIGJpdHMgYXJlIHN0b3JlZCBpbiAqCi0gKiBiaXRzIDM6MSBvZiB0aGUgUFRFLCB3aGlsZSB0aGUgZm91cnRoIGJpdCBpcyBzdG9yZWQgaW4gYml0IDExIG9mIHRoZSBQVEUuCi0gKi8KLSNkZWZpbmUgSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKGJpdHMpCSgoKChiaXRzKSAmIDB4NykgPDwgMSkgfCBcCi0JCQkJCSAoKChiaXRzKSAmIDB4OCkgPDwgKDExIC0gMykpKQotI2RlZmluZSBIU1dfV0JfTExDX0FHRTMJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHgyKQotI2RlZmluZSBIU1dfV0JfTExDX0FHRTAJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHgzKQotI2RlZmluZSBIU1dfV0JfRUxMQ19MTENfQUdFMAkJSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4YikKLSNkZWZpbmUgSFNXX1dCX0VMTENfTExDX0FHRTMJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDgpCi0jZGVmaW5lIEhTV19XVF9FTExDX0xMQ19BR0UwCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHg2KQotI2RlZmluZSBIU1dfV1RfRUxMQ19MTENfQUdFMwkJSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4NykKLQotI2RlZmluZSBHRU44X1BURVNfUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2YoZ2VuOF9ndHRfcHRlX3QpKQotI2RlZmluZSBHRU44X1BERVNfUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2YoZ2VuOF9wcGd0dF9wZGVfdCkpCi0KLS8qIEdFTjggbGVnYWN5IHN0eWxlIGFkZHJlc3NpcyBkZWZpbmVkIGFzIGEgMyBsZXZlbCBwYWdlIHRhYmxlOgotICogMzE6MzAgfCAyOToyMSB8IDIwOjEyIHwgIDExOjAKLSAqIFBEUEUgIHwgIFBERSAgfCAgUFRFICB8IG9mZnNldAotICogVGhlIGRpZmZlcmVuY2UgYXMgY29tcGFyZWQgdG8gbm9ybWFsIHg4NiAzIGxldmVsIHBhZ2UgdGFibGUgaXMgdGhlIFBEUEVzIGFyZQotICogcHJvZ3JhbW1lZCB2aWEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgR0VOOF9QRFBFX1NISUZUCQkJMzAKLSNkZWZpbmUgR0VOOF9QRFBFX01BU0sJCQkweDMKLSNkZWZpbmUgR0VOOF9QREVfU0hJRlQJCQkyMQotI2RlZmluZSBHRU44X1BERV9NQVNLCQkJMHgxZmYKLSNkZWZpbmUgR0VOOF9QVEVfU0hJRlQJCQkxMgotI2RlZmluZSBHRU44X1BURV9NQVNLCQkJMHgxZmYKLQotI2RlZmluZSBQUEFUX1VOQ0FDSEVEX0lOREVYCQkoX1BBR0VfUFdUIHwgX1BBR0VfUENEKQotI2RlZmluZSBQUEFUX0NBQ0hFRF9QREVfSU5ERVgJCTAgLyogV0IgTExDICovCi0jZGVmaW5lIFBQQVRfQ0FDSEVEX0lOREVYCQlfUEFHRV9QQVQgLyogV0IgTExDZUxMQyAqLwotI2RlZmluZSBQUEFUX0RJU1BMQVlfRUxMQ19JTkRFWAkJX1BBR0VfUENEIC8qIFdUIGVMTEMgKi8KIAogc3RhdGljIHZvaWQgcHBndHRfYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEsCiAJCQkgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCkBAIC0xMzEsMTAgKzc5LDE5IEBACiB7CiAJZ2VuOF9ndHRfcHRlX3QgcHRlID0gdmFsaWQgPyBfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgOiAwOwogCXB0ZSB8PSBhZGRyOwotCWlmIChsZXZlbCAhPSBJOTE1X0NBQ0hFX05PTkUpCi0JCXB0ZSB8PSBQUEFUX0NBQ0hFRF9JTkRFWDsKLQllbHNlCisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBJOTE1X0NBQ0hFX05PTkU6CiAJCXB0ZSB8PSBQUEFUX1VOQ0FDSEVEX0lOREVYOworCQlicmVhazsKKwljYXNlIEk5MTVfQ0FDSEVfV1Q6CisJCXB0ZSB8PSBQUEFUX0RJU1BMQVlfRUxMQ19JTkRFWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHRlIHw9IFBQQVRfQ0FDSEVEX0lOREVYOworCQlicmVhazsKKwl9CisKIAlyZXR1cm4gcHRlOwogfQogCkBAIC0xOTcsOSArMTU0LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi0jZGVmaW5lIEJZVF9QVEVfV1JJVEVBQkxFCQkoMSA8PCAxKQotI2RlZmluZSBCWVRfUFRFX1NOT09QRURfQllfQ1BVX0NBQ0hFUwkoMSA8PCAyKQotCiBzdGF0aWMgZ2VuNl9ndHRfcHRlX3QgYnl0X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAogCQkJCSAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAogCQkJCSAgICAgYm9vbCB2YWxpZCkKQEAgLTI1Myw3ICsyMDcsNyBAQAogfQogCiAvKiBCcm9hZHdlbGwgUGFnZSBEaXJlY3RvcnkgUG9pbnRlciBEZXNjcmlwdG9ycyAqLwotc3RhdGljIGludCBnZW44X3dyaXRlX3BkcChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHVuc2lnbmVkIGVudHJ5LAorc3RhdGljIGludCBnZW44X3dyaXRlX3BkcChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1bnNpZ25lZCBlbnRyeSwKIAkJCSAgIHVpbnQ2NF90IHZhbCwgYm9vbCBzeW5jaHJvbm91cykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwpAQCAtMjgzLDcgKzIzNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuOF9tbV9zd2l0Y2goc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0LAotCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkgIGJvb2wgc3luY2hyb25vdXMpCiB7CiAJaW50IGksIHJldDsKQEAgLTMzMiw2ICsyODYsOCBAQAogCQkJbnVtX2VudHJpZXMtLTsKIAkJfQogCisJCWlmICghSEFTX0xMQyhwcGd0dC0+YmFzZS5kZXYpKQorCQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShwdF92YWRkciwgUEFHRV9TSVpFKTsKIAkJa3VubWFwX2F0b21pYyhwdF92YWRkcik7CiAKIAkJcHRlID0gMDsKQEAgLTM2OCw2ICszMjQsOCBAQAogCQkJZ2VuOF9wdGVfZW5jb2RlKHNnX3BhZ2VfaXRlcl9kbWFfYWRkcmVzcygmc2dfaXRlciksCiAJCQkJCWNhY2hlX2xldmVsLCB0cnVlKTsKIAkJaWYgKCsrcHRlID09IEdFTjhfUFRFU19QRVJfUEFHRSkgeworCQkJaWYgKCFIQVNfTExDKHBwZ3R0LT5iYXNlLmRldikpCisJCQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShwdF92YWRkciwgUEFHRV9TSVpFKTsKIAkJCWt1bm1hcF9hdG9taWMocHRfdmFkZHIpOwogCQkJcHRfdmFkZHIgPSBOVUxMOwogCQkJaWYgKCsrcGRlID09IEdFTjhfUERFU19QRVJfUEFHRSkgewpAQCAtMzc3LDggKzMzNSwxMSBAQAogCQkJcHRlID0gMDsKIAkJfQogCX0KLQlpZiAocHRfdmFkZHIpCisJaWYgKHB0X3ZhZGRyKSB7CisJCWlmICghSEFTX0xMQyhwcGd0dC0+YmFzZS5kZXYpKQorCQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShwdF92YWRkciwgUEFHRV9TSVpFKTsKIAkJa3VubWFwX2F0b21pYyhwdF92YWRkcik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBnZW44X2ZyZWVfcGFnZV90YWJsZXMoc3RydWN0IHBhZ2UgKipwdF9wYWdlcykKQEAgLTY0MSw2ICs2MDIsOCBAQAogCQkJcGRfdmFkZHJbal0gPSBnZW44X3BkZV9lbmNvZGUocHBndHQtPmJhc2UuZGV2LCBhZGRyLAogCQkJCQkJICAgICAgSTkxNV9DQUNIRV9MTEMpOwogCQl9CisJCWlmICghSEFTX0xMQyhwcGd0dC0+YmFzZS5kZXYpKQorCQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShwZF92YWRkciwgUEFHRV9TSVpFKTsKIAkJa3VubWFwX2F0b21pYyhwZF92YWRkcik7CiAJfQogCkBAIC03NTMsNyArNzE2LDcgQEAKIH0KIAogc3RhdGljIGludCBoc3dfbW1fc3dpdGNoKHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCSBib29sIHN5bmNocm9ub3VzKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcGd0dC0+YmFzZS5kZXY7CkBAIC03OTcsNyArNzYwLDcgQEAKIH0KIAogc3RhdGljIGludCBnZW43X21tX3N3aXRjaChzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQsCi0JCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCSAgYm9vbCBzeW5jaHJvbm91cykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHBndHQtPmJhc2UuZGV2OwpAQCAtODQ4LDcgKzgxMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuNl9tbV9zd2l0Y2goc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0LAotCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkgIGJvb2wgc3luY2hyb25vdXMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBwZ3R0LT5iYXNlLmRldjsKQEAgLTg2OSw3ICs4MzIsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcGd0dC0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAlpbnQgaiwgcmV0OwogCiAJZm9yX2VhY2hfcmluZyhyaW5nLCBkZXZfcHJpdiwgaikgewpAQCAtODk5LDcgKzg2Miw3IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBwZ3R0LT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCXVpbnQzMl90IGVjb2NoaywgZWNvYml0czsKIAlpbnQgaTsKIApAQCAtOTM4LDcgKzkwMSw3IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBwZ3R0LT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCXVpbnQzMl90IGVjb2NoaywgZ2FiX2N0bCwgZWNvYml0czsKIAlpbnQgaTsKIApAQCAtMTA2Nyw4ICsxMDMwLDYgQEAKIAogc3RhdGljIGludCBnZW42X3BwZ3R0X2FsbG9jYXRlX3BhZ2VfZGlyZWN0b3JpZXMoc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0KQogewotI2RlZmluZSBHRU42X1BEX0FMSUdOIChQQUdFX1NJWkUgKiAxNikKLSNkZWZpbmUgR0VONl9QRF9TSVpFIChHRU42X1BQR1RUX1BEX0VOVFJJRVMgKiBQQUdFX1NJWkUpCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBwZ3R0LT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWJvb2wgcmV0cmllZCA9IGZhbHNlOwpAQCAtMTA4NCw4ICsxMDQ1LDcgQEAKIAkJCQkJCSAgJnBwZ3R0LT5ub2RlLCBHRU42X1BEX1NJWkUsCiAJCQkJCQkgIEdFTjZfUERfQUxJR04sIDAsCiAJCQkJCQkgIDAsIGRldl9wcml2LT5ndHQuYmFzZS50b3RhbCwKLQkJCQkJCSAgRFJNX01NX1NFQVJDSF9ERUZBVUxULAotCQkJCQkJICBEUk1fTU1fQ1JFQVRFX0RFRkFVTFQpOworCQkJCQkJICBEUk1fTU1fVE9QRE9XTik7CiAJaWYgKHJldCA9PSAtRU5PU1BDICYmICFyZXRyaWVkKSB7CiAJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhkZXYsICZkZXZfcHJpdi0+Z3R0LmJhc2UsCiAJCQkJCSAgICAgICBHRU42X1BEX1NJWkUsIEdFTjZfUERfQUxJR04sCkBAIC0xMzExLDcgKzEyNzEsNyBAQAogdm9pZCBpOTE1X2NoZWNrX2FuZF9jbGVhcl9mYXVsdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCBpOwogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNikKQEAgLTEzODYsNyArMTM0NiwxMSBAQAogCiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gOCkgewotCQlnZW44X3NldHVwX3ByaXZhdGVfcHBhdChkZXZfcHJpdik7CisJCWlmIChJU19DSEVSUllWSUVXKGRldikpCisJCQljaHZfc2V0dXBfcHJpdmF0ZV9wcGF0KGRldl9wcml2KTsKKwkJZWxzZQorCQkJYmR3X3NldHVwX3ByaXZhdGVfcHBhdChkZXZfcHJpdik7CisKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQzOCw3ICsxNDAyLDcgQEAKIAkJKGdlbjhfZ3R0X3B0ZV90IF9faW9tZW0gKilkZXZfcHJpdi0+Z3R0LmdzbSArIGZpcnN0X2VudHJ5OwogCWludCBpID0gMDsKIAlzdHJ1Y3Qgc2dfcGFnZV9pdGVyIHNnX2l0ZXI7Ci0JZG1hX2FkZHJfdCBhZGRyOworCWRtYV9hZGRyX3QgYWRkciA9IDA7CiAKIAlmb3JfZWFjaF9zZ19wYWdlKHN0LT5zZ2wsICZzZ19pdGVyLCBzdC0+bmVudHMsIDApIHsKIAkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnX2l0ZXIuc2cpICsKQEAgLTE4MTEsOSArMTc3NSwyNyBAQAogCWJkd19nbWNoX2N0bCAmPSBCRFdfR01DSF9HR01TX01BU0s7CiAJaWYgKGJkd19nbWNoX2N0bCkKIAkJYmR3X2dtY2hfY3RsID0gMSA8PCBiZHdfZ21jaF9jdGw7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLyogTGltaXQgMzJiIHBsYXRmb3JtcyB0byBhIDJHQiBHR1RUOiA0IDw8IDIwIC8gcHRlIHNpemUgKiBQQUdFX1NJWkUgKi8KKwlpZiAoYmR3X2dtY2hfY3RsID4gNCkKKwkJYmR3X2dtY2hfY3RsID0gNDsKKyNlbmRpZgorCiAJcmV0dXJuIGJkd19nbWNoX2N0bCA8PCAyMDsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2h2X2dldF90b3RhbF9ndHRfc2l6ZSh1MTYgZ21jaF9jdHJsKQoreworCWdtY2hfY3RybCA+Pj0gU05CX0dNQ0hfR0dNU19TSElGVDsKKwlnbWNoX2N0cmwgJj0gU05CX0dNQ0hfR0dNU19NQVNLOworCisJaWYgKGdtY2hfY3RybCkKKwkJcmV0dXJuIDEgPDwgKDIwICsgZ21jaF9jdHJsKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHNpemVfdCBnZW42X2dldF9zdG9sZW5fc2l6ZSh1MTYgc25iX2dtY2hfY3RsKQogewogCXNuYl9nbWNoX2N0bCA+Pj0gU05CX0dNQ0hfR01TX1NISUZUOwpAQCAtMTgyOCw2ICsxODEwLDI0IEBACiAJcmV0dXJuIGJkd19nbWNoX2N0bCA8PCAyNTsgLyogMzIgTUIgdW5pdHMgKi8KIH0KIAorc3RhdGljIHNpemVfdCBjaHZfZ2V0X3N0b2xlbl9zaXplKHUxNiBnbWNoX2N0cmwpCit7CisJZ21jaF9jdHJsID4+PSBTTkJfR01DSF9HTVNfU0hJRlQ7CisJZ21jaF9jdHJsICY9IFNOQl9HTUNIX0dNU19NQVNLOworCisJLyoKKwkgKiAweDAgIHRvIDB4MTA6IDMyTUIgaW5jcmVtZW50cyBzdGFydGluZyBhdCAwTUIKKwkgKiAweDExIHRvIDB4MTY6IDRNQiBpbmNyZW1lbnRzIHN0YXJ0aW5nIGF0IDhNQgorCSAqIDB4MTcgdG8gMHgxZDogNE1CIGluY3JlbWVudHMgc3RhcnQgYXQgMzZNQgorCSAqLworCWlmIChnbWNoX2N0cmwgPCAweDExKQorCQlyZXR1cm4gZ21jaF9jdHJsIDw8IDI1OworCWVsc2UgaWYgKGdtY2hfY3RybCA8IDB4MTcpCisJCXJldHVybiAoZ21jaF9jdHJsIC0gMHgxMSArIDIpIDw8IDIyOworCWVsc2UKKwkJcmV0dXJuIChnbWNoX2N0cmwgLSAweDE3ICsgOSkgPDwgMjI7Cit9CisKIHN0YXRpYyBpbnQgZ2d0dF9wcm9iZV9jb21tb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc2l6ZV90IGd0dF9zaXplKQogewpAQCAtMTg1OCwxOSArMTg1OCw4IEBACiAvKiBUaGUgR0dUVCBhbmQgUFBHVFQgbmVlZCBhIHByaXZhdGUgUFBBVCBzZXR1cCBpbiBvcmRlciB0byBoYW5kbGUgY2FjaGVhYmlsaXR5CiAgKiBiaXRzLiBXaGVuIHVzaW5nIGFkdmFuY2VkIGNvbnRleHRzIGVhY2ggY29udGV4dCBzdG9yZXMgaXRzIG93biBQQVQsIGJ1dAogICogd3JpdGluZyB0aGlzIGRhdGEgc2hvdWxkbid0IGJlIGhhcm1mdWwgZXZlbiBpbiB0aG9zZSBjYXNlcy4gKi8KLXN0YXRpYyB2b2lkIGdlbjhfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGJkd19zZXR1cF9wcml2YXRlX3BwYXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewotI2RlZmluZSBHRU44X1BQQVRfVUMJCSgwPDwwKQotI2RlZmluZSBHRU44X1BQQVRfV0MJCSgxPDwwKQotI2RlZmluZSBHRU44X1BQQVRfV1QJCSgyPDwwKQotI2RlZmluZSBHRU44X1BQQVRfV0IJCSgzPDwwKQotI2RlZmluZSBHRU44X1BQQVRfRUxMQ19PVkVSUklERQkoMDw8MikKLS8qIEZJWE1FKEJEVyk6IEJzcGVjIGlzIGNvbXBsZXRlbHkgY29uZnVzZWQgYWJvdXQgY2FjaGUgY29udHJvbCBiaXRzLiAqLwotI2RlZmluZSBHRU44X1BQQVRfTExDCQkoMTw8MikKLSNkZWZpbmUgR0VOOF9QUEFUX0xMQ0VMTEMJKDI8PDIpCi0jZGVmaW5lIEdFTjhfUFBBVF9MTENlTExDCSgzPDwyKQotI2RlZmluZSBHRU44X1BQQVRfQUdFKHgpCSh4PDw0KQotI2RlZmluZSBHRU44X1BQQVQoaSwgeCkgKCh1aW50NjRfdCkgKHgpIDw8ICgoaSkgKiA4KSkKIAl1aW50NjRfdCBwYXQ7CiAKIAlwYXQgPSBHRU44X1BQQVQoMCwgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQykgICAgIHwgLyogZm9yIG5vcm1hbCBvYmplY3RzLCBubyBlTExDICovCkBAIC0xODg4LDYgKzE4NzcsMzMgQEAKIAlJOTE1X1dSSVRFKEdFTjhfUFJJVkFURV9QQVQgKyA0LCBwYXQgPj4gMzIpOwogfQogCitzdGF0aWMgdm9pZCBjaHZfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1aW50NjRfdCBwYXQ7CisKKwkvKgorCSAqIE1hcCBXQiBvbiBCRFcgdG8gc25vb3BlZCBvbiBDSFYuCisJICoKKwkgKiBPbmx5IHRoZSBzbm9vcCBiaXQgaGFzIG1lYW5pbmcgZm9yIENIViwgdGhlIHJlc3QgaXMKKwkgKiBpZ25vcmVkLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSBoYXJ3YXJlIGVuZm9yY2VzIHNub29waW5nIGZvciBhbGwgcGFnZQorCSAqIHRhYmxlIGFjY2Vzc2VzLiBUaGUgc25vb3AgYml0IGlzIGFjdHVhbGx5IGlnbm9yZWQgZm9yCisJICogUERFcy4KKwkgKi8KKwlwYXQgPSBHRU44X1BQQVQoMCwgQ0hWX1BQQVRfU05PT1ApIHwKKwkgICAgICBHRU44X1BQQVQoMSwgMCkgfAorCSAgICAgIEdFTjhfUFBBVCgyLCAwKSB8CisJICAgICAgR0VOOF9QUEFUKDMsIDApIHwKKwkgICAgICBHRU44X1BQQVQoNCwgQ0hWX1BQQVRfU05PT1ApIHwKKwkgICAgICBHRU44X1BQQVQoNSwgQ0hWX1BQQVRfU05PT1ApIHwKKwkgICAgICBHRU44X1BQQVQoNiwgQ0hWX1BQQVRfU05PT1ApIHwKKwkgICAgICBHRU44X1BQQVQoNywgQ0hWX1BQQVRfU05PT1ApOworCisJSTkxNV9XUklURShHRU44X1BSSVZBVEVfUEFULCBwYXQpOworCUk5MTVfV1JJVEUoR0VOOF9QUklWQVRFX1BBVCArIDQsIHBhdCA+PiAzMik7Cit9CisKIHN0YXRpYyBpbnQgZ2VuOF9nbWNoX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICBzaXplX3QgKmd0dF90b3RhbCwKIAkJCSAgIHNpemVfdCAqc3RvbGVuLApAQCAtMTkwOCwxMiArMTkyNCwyMCBAQAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LT5wZGV2LCBTTkJfR01DSF9DVFJMLCAmc25iX2dtY2hfY3RsKTsKIAotCSpzdG9sZW4gPSBnZW44X2dldF9zdG9sZW5fc2l6ZShzbmJfZ21jaF9jdGwpOworCWlmIChJU19DSEVSUllWSUVXKGRldikpIHsKKwkJKnN0b2xlbiA9IGNodl9nZXRfc3RvbGVuX3NpemUoc25iX2dtY2hfY3RsKTsKKwkJZ3R0X3NpemUgPSBjaHZfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9nbWNoX2N0bCk7CisJfSBlbHNlIHsKKwkJKnN0b2xlbiA9IGdlbjhfZ2V0X3N0b2xlbl9zaXplKHNuYl9nbWNoX2N0bCk7CisJCWd0dF9zaXplID0gZ2VuOF9nZXRfdG90YWxfZ3R0X3NpemUoc25iX2dtY2hfY3RsKTsKKwl9CiAKLQlndHRfc2l6ZSA9IGdlbjhfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9nbWNoX2N0bCk7CiAJKmd0dF90b3RhbCA9IChndHRfc2l6ZSAvIHNpemVvZihnZW44X2d0dF9wdGVfdCkpIDw8IFBBR0VfU0hJRlQ7CiAKLQlnZW44X3NldHVwX3ByaXZhdGVfcHBhdChkZXZfcHJpdik7CisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJY2h2X3NldHVwX3ByaXZhdGVfcHBhdChkZXZfcHJpdik7CisJZWxzZQorCQliZHdfc2V0dXBfcHJpdmF0ZV9wcGF0KGRldl9wcml2KTsKIAogCXJldCA9IGdndHRfcHJvYmVfY29tbW9uKGRldiwgZ3R0X3NpemUpOwogCkBAIC0yMDQzLDYgKzIwNjcsMTAgQEAKIAkJIGd0dC0+YmFzZS50b3RhbCA+PiAyMCk7CiAJRFJNX0RFQlVHX0RSSVZFUigiR01BRFIgc2l6ZSA9ICVsZE1cbiIsIGd0dC0+bWFwcGFibGVfZW5kID4+IDIwKTsKIAlEUk1fREVCVUdfRFJJVkVSKCJHVFQgc3RvbGVuIHNpemUgPSAlemRNXG4iLCBndHQtPnN0b2xlbl9zaXplID4+IDIwKTsKKyNpZmRlZiBDT05GSUdfSU5URUxfSU9NTVUKKwlpZiAoaW50ZWxfaW9tbXVfZ2Z4X21hcHBlZCkKKwkJRFJNX0lORk8oIlZULWQgYWN0aXZlIGZvciBnZnggYWNjZXNzXG4iKTsKKyNlbmRpZgogCS8qCiAJICogaTkxNS5lbmFibGVfcHBndHQgaXMgcmVhZC1vbmx5LCBzbyBkbyBhbiBlYXJseSBwYXNzIHRvIHZhbGlkYXRlIHRoZQogCSAqIHVzZXIncyByZXF1ZXN0ZWQgc3RhdGUgYWdhaW5zdCB0aGUgaGFyZHdhcmUvZHJpdmVyIGNhcGFiaWxpdGllcy4gIFdlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTZhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaApAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFBsZWFzZSB0cnkgdG8gbWFpbnRhaW4gdGhlIGZvbGxvd2luZyBvcmRlciB3aXRoaW4gdGhpcyBmaWxlIHVubGVzcyBpdCBtYWtlcworICogc2Vuc2UgdG8gZG8gb3RoZXJ3aXNlLiBGcm9tIHRvcCB0byBib3R0b206CisgKiAxLiB0eXBlZGVmcworICogMi4gI2RlZmluZXMsIGFuZCBtYWNyb3MKKyAqIDMuIHN0cnVjdHVyZSBkZWZpbml0aW9ucworICogNC4gZnVuY3Rpb24gcHJvdG90eXBlcworICoKKyAqIFdpdGhpbiBlYWNoIHNlY3Rpb24sIHBsZWFzZSB0cnkgdG8gb3JkZXIgYnkgZ2VuZXJhdGlvbiBpbiBhc2NlbmRpbmcgb3JkZXIsCisgKiBmcm9tIHRvcCB0byBib3R0b20gKGllLiBnZW42IG9uIHRoZSB0b3AsIGdlbjggb24gdGhlIGJvdHRvbSkuCisgKi8KKworI2lmbmRlZiBfX0k5MTVfR0VNX0dUVF9IX18KKyNkZWZpbmUgX19JOTE1X0dFTV9HVFRfSF9fCisKK3R5cGVkZWYgdWludDMyX3QgZ2VuNl9ndHRfcHRlX3Q7Cit0eXBlZGVmIHVpbnQ2NF90IGdlbjhfZ3R0X3B0ZV90OwordHlwZWRlZiBnZW44X2d0dF9wdGVfdCBnZW44X3BwZ3R0X3BkZV90OworCisjZGVmaW5lIGd0dF90b3RhbF9lbnRyaWVzKGd0dCkgKChndHQpLmJhc2UudG90YWwgPj4gUEFHRV9TSElGVCkKKworI2RlZmluZSBJOTE1X1BQR1RUX1BUX0VOVFJJRVMJCShQQUdFX1NJWkUgLyBzaXplb2YoZ2VuNl9ndHRfcHRlX3QpKQorLyogZ2VuNi1oc3cgaGFzIGJpdCAxMS00IGZvciBwaHlzaWNhbCBhZGRyIGJpdCAzOS0zMiAqLworI2RlZmluZSBHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQkoKGFkZHIpIHwgKCgoYWRkcikgPj4gMjgpICYgMHhmZjApKQorI2RlZmluZSBHRU42X1BURV9BRERSX0VOQ09ERShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQorI2RlZmluZSBHRU42X1BERV9BRERSX0VOQ09ERShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQorI2RlZmluZSBHRU42X1BURV9DQUNIRV9MTEMJCSgyIDw8IDEpCisjZGVmaW5lIEdFTjZfUFRFX1VOQ0FDSEVECQkoMSA8PCAxKQorI2RlZmluZSBHRU42X1BURV9WQUxJRAkJCSgxIDw8IDApCisKKyNkZWZpbmUgR0VONl9QUEdUVF9QRF9FTlRSSUVTCQk1MTIKKyNkZWZpbmUgR0VONl9QRF9TSVpFCQkJKEdFTjZfUFBHVFRfUERfRU5UUklFUyAqIFBBR0VfU0laRSkKKyNkZWZpbmUgR0VONl9QRF9BTElHTgkJCShQQUdFX1NJWkUgKiAxNikKKyNkZWZpbmUgR0VONl9QREVfVkFMSUQJCQkoMSA8PCAwKQorCisjZGVmaW5lIEdFTjdfUFRFX0NBQ0hFX0wzX0xMQwkJKDMgPDwgMSkKKworI2RlZmluZSBCWVRfUFRFX1NOT09QRURfQllfQ1BVX0NBQ0hFUwkoMSA8PCAyKQorI2RlZmluZSBCWVRfUFRFX1dSSVRFQUJMRQkJKDEgPDwgMSkKKworLyogQ2FjaGVhYmlsaXR5IENvbnRyb2wgaXMgYSA0LWJpdCB2YWx1ZS4gVGhlIGxvdyB0aHJlZSBiaXRzIGFyZSBzdG9yZWQgaW4gYml0cworICogMzoxIG9mIHRoZSBQVEUsIHdoaWxlIHRoZSBmb3VydGggYml0IGlzIHN0b3JlZCBpbiBiaXQgMTEgb2YgdGhlIFBURS4KKyAqLworI2RlZmluZSBIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woYml0cykJKCgoKGJpdHMpICYgMHg3KSA8PCAxKSB8IFwKKwkJCQkJICgoKGJpdHMpICYgMHg4KSA8PCAoMTEgLSAzKSkpCisjZGVmaW5lIEhTV19XQl9MTENfQUdFMwkJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDIpCisjZGVmaW5lIEhTV19XQl9MTENfQUdFMAkJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDMpCisjZGVmaW5lIEhTV19XQl9FTExDX0xMQ19BR0UzCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHg4KQorI2RlZmluZSBIU1dfV0JfRUxMQ19MTENfQUdFMAkJSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4YikKKyNkZWZpbmUgSFNXX1dUX0VMTENfTExDX0FHRTMJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDcpCisjZGVmaW5lIEhTV19XVF9FTExDX0xMQ19BR0UwCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHg2KQorI2RlZmluZSBIU1dfUFRFX1VOQ0FDSEVECQkoMCkKKyNkZWZpbmUgSFNXX0dUVF9BRERSX0VOQ09ERShhZGRyKQkoKGFkZHIpIHwgKCgoYWRkcikgPj4gMjgpICYgMHg3ZjApKQorI2RlZmluZSBIU1dfUFRFX0FERFJfRU5DT0RFKGFkZHIpCUhTV19HVFRfQUREUl9FTkNPREUoYWRkcikKKworLyogR0VOOCBsZWdhY3kgc3R5bGUgYWRkcmVzcyBpcyBkZWZpbmVkIGFzIGEgMyBsZXZlbCBwYWdlIHRhYmxlOgorICogMzE6MzAgfCAyOToyMSB8IDIwOjEyIHwgIDExOjAKKyAqIFBEUEUgIHwgIFBERSAgfCAgUFRFICB8IG9mZnNldAorICogVGhlIGRpZmZlcmVuY2UgYXMgY29tcGFyZWQgdG8gbm9ybWFsIHg4NiAzIGxldmVsIHBhZ2UgdGFibGUgaXMgdGhlIFBEUEVzIGFyZQorICogcHJvZ3JhbW1lZCB2aWEgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgR0VOOF9QRFBFX1NISUZUCQkJMzAKKyNkZWZpbmUgR0VOOF9QRFBFX01BU0sJCQkweDMKKyNkZWZpbmUgR0VOOF9QREVfU0hJRlQJCQkyMQorI2RlZmluZSBHRU44X1BERV9NQVNLCQkJMHgxZmYKKyNkZWZpbmUgR0VOOF9QVEVfU0hJRlQJCQkxMgorI2RlZmluZSBHRU44X1BURV9NQVNLCQkJMHgxZmYKKyNkZWZpbmUgR0VOOF9MRUdBQ1lfUERQUwkJNAorI2RlZmluZSBHRU44X1BURVNfUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2YoZ2VuOF9ndHRfcHRlX3QpKQorI2RlZmluZSBHRU44X1BERVNfUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2YoZ2VuOF9wcGd0dF9wZGVfdCkpCisKKyNkZWZpbmUgUFBBVF9VTkNBQ0hFRF9JTkRFWAkJKF9QQUdFX1BXVCB8IF9QQUdFX1BDRCkKKyNkZWZpbmUgUFBBVF9DQUNIRURfUERFX0lOREVYCQkwIC8qIFdCIExMQyAqLworI2RlZmluZSBQUEFUX0NBQ0hFRF9JTkRFWAkJX1BBR0VfUEFUIC8qIFdCIExMQ2VMTEMgKi8KKyNkZWZpbmUgUFBBVF9ESVNQTEFZX0VMTENfSU5ERVgJCV9QQUdFX1BDRCAvKiBXVCBlTExDICovCisKKyNkZWZpbmUgQ0hWX1BQQVRfU05PT1AJCQkoMTw8NikKKyNkZWZpbmUgR0VOOF9QUEFUX0FHRSh4KQkJKHg8PDQpCisjZGVmaW5lIEdFTjhfUFBBVF9MTENlTExDCQkoMzw8MikKKyNkZWZpbmUgR0VOOF9QUEFUX0xMQ0VMTEMJCSgyPDwyKQorI2RlZmluZSBHRU44X1BQQVRfTExDCQkJKDE8PDIpCisjZGVmaW5lIEdFTjhfUFBBVF9XQgkJCSgzPDwwKQorI2RlZmluZSBHRU44X1BQQVRfV1QJCQkoMjw8MCkKKyNkZWZpbmUgR0VOOF9QUEFUX1dDCQkJKDE8PDApCisjZGVmaW5lIEdFTjhfUFBBVF9VQwkJCSgwPDwwKQorI2RlZmluZSBHRU44X1BQQVRfRUxMQ19PVkVSUklERQkJKDA8PDIpCisjZGVmaW5lIEdFTjhfUFBBVChpLCB4KQkJCSgodWludDY0X3QpICh4KSA8PCAoKGkpICogOCkpCisKK2VudW0gaTkxNV9jYWNoZV9sZXZlbDsKKy8qKgorICogQSBWTUEgcmVwcmVzZW50cyBhIEdFTSBCTyB0aGF0IGlzIGJvdW5kIGludG8gYW4gYWRkcmVzcyBzcGFjZS4gVGhlcmVmb3JlLCBhCisgKiBWTUEncyBwcmVzZW5jZSBjYW5ub3QgYmUgZ3VhcmFudGVlZCBiZWZvcmUgYmluZGluZywgb3IgYWZ0ZXIgdW5iaW5kaW5nIHRoZQorICogb2JqZWN0IGludG8vZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBUbyBtYWtlIHRoaW5ncyBhcyBzaW1wbGUgYXMgcG9zc2libGUgKGllLiBubyByZWZjb3VudGluZyksIGEgVk1BJ3MgbGlmZXRpbWUKKyAqIHdpbGwgYWx3YXlzIGJlIDw9IGFuIG9iamVjdHMgbGlmZXRpbWUuIFNvIG9iamVjdCByZWZjb3VudGluZyBzaG91bGQgY292ZXIgdXMuCisgKi8KK3N0cnVjdCBpOTE1X3ZtYSB7CisJc3RydWN0IGRybV9tbV9ub2RlIG5vZGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKKworCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIG9uIHRoZSBhY3RpdmUvaW5hY3RpdmUgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1tX2xpc3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtYV9saW5rOyAvKiBMaW5rIGluIHRoZSBvYmplY3QncyBWTUEgbGlzdCAqLworCisJLyoqIFRoaXMgdm1hJ3MgcGxhY2UgaW4gdGhlIGJhdGNoYnVmZmVyIG9yIG9uIHRoZSBldmljdGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBleGVjX2xpc3Q7CisKKwkvKioKKwkgKiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmluZyBleGVjYnVmZmVyIGluc2VydGlvbi4KKwkgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBleGVjX25vZGU7CisJdW5zaWduZWQgbG9uZyBleGVjX2hhbmRsZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlY19lbnRyeTsKKworCS8qKgorCSAqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxvd2luZworCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQgbW9zdCBvbmUgcmVmZXJlbmNlOiBwd3JpdGUvcHJlYWQsIHBpbl9pb2N0bAorCSAqICh2aWEgdXNlcl9waW5fY291bnQpLCBleGVjYnVmZmVyIChvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBtdWx0aXBsZQorCSAqIHRpbWVzIGZvciB0aGUgc2FtZSBiYXRjaGJ1ZmZlciksIGFuZCB0aGUgZnJhbWVidWZmZXIgY29kZS4gV2hlbgorCSAqIHN3aXRjaGluZy9wYWdlZmxpcHBpbmcsIHRoZSBmcmFtZWJ1ZmZlciBjb2RlIGhhcyBhdCBtb3N0IHR3byBidWZmZXJzCisJICogcGlubmVkIHBlciBjcnRjLgorCSAqCisJICogSW4gdGhlIHdvcnN0IGNhc2UgdGhpcyBpcyAxICsgMSArIDEgKyAyKjIgPSA3LiBUaGF0IHdvdWxkIGZpdCBpbnRvIDMKKwkgKiBiaXRzIHdpdGggYWJzb2x1dGVseSBubyBoZWFkcm9vbS4gU28gdXNlIDQgYml0cy4gKi8KKwl1bnNpZ25lZCBpbnQgcGluX2NvdW50OjQ7CisjZGVmaW5lIERSTV9JOTE1X0dFTV9PQkpFQ1RfTUFYX1BJTl9DT1VOVCAweGYKKworCS8qKiBVbm1hcCBhbiBvYmplY3QgZnJvbSBhbiBhZGRyZXNzIHNwYWNlLiBUaGlzIHVzdWFsbHkgY29uc2lzdHMgb2YKKwkgKiBzZXR0aW5nIHRoZSB2YWxpZCBQVEUgZW50cmllcyB0byBhIHJlc2VydmVkIHNjcmF0Y2ggcGFnZS4gKi8KKwl2b2lkICgqdW5iaW5kX3ZtYSkoc3RydWN0IGk5MTVfdm1hICp2bWEpOworCS8qIE1hcCBhbiBvYmplY3QgaW50byBhbiBhZGRyZXNzIHNwYWNlIHdpdGggdGhlIGdpdmVuIGNhY2hlIGZsYWdzLiAqLworI2RlZmluZSBHTE9CQUxfQklORCAoMTw8MCkKKwl2b2lkICgqYmluZF92bWEpKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCSB1MzIgZmxhZ3MpOworfTsKKworc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSB7CisJc3RydWN0IGRybV9tbSBtbTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2xpbms7CisJdW5zaWduZWQgbG9uZyBzdGFydDsJCS8qIFN0YXJ0IG9mZnNldCBhbHdheXMgMCBmb3IgZHJpMiAqLworCXNpemVfdCB0b3RhbDsJCS8qIHNpemUgYWRkciBzcGFjZSBtYXBzIChleC4gMkdCIGZvciBnZ3R0KSAqLworCisJc3RydWN0IHsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl9IHNjcmF0Y2g7CisKKwkvKioKKwkgKiBMaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGludm9sdmVkIGluIHJlbmRlcmluZy4KKwkgKgorCSAqIEluY2x1ZGVzIGJ1ZmZlcnMgaGF2aW5nIHRoZSBjb250ZW50cyBvZiB0aGVpciBHUFUgY2FjaGVzCisJICogZmx1c2hlZCwgbm90IG5lY2Vzc2FyaWx5IHByaW1pdGl2ZXMuICBsYXN0X3JlbmRlcmluZ19zZXFubworCSAqIHJlcHJlc2VudHMgd2hlbiB0aGUgcmVuZGVyaW5nIGludm9sdmVkIHdpbGwgYmUgY29tcGxldGVkLgorCSAqCisJICogQSByZWZlcmVuY2UgaXMgaGVsZCBvbiB0aGUgYnVmZmVyIHdoaWxlIG9uIHRoaXMgbGlzdC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0OworCisJLyoqCisJICogTFJVIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCBhcmUgbm90IGluIHRoZSByaW5nYnVmZmVyIGFuZAorCSAqIGFyZSByZWFkeSB0byB1bmJpbmQsIGJ1dCBhcmUgc3RpbGwgaW4gdGhlIEdUVC4KKwkgKgorCSAqIGxhc3RfcmVuZGVyaW5nX3NlcW5vIGlzIDAgd2hpbGUgYW4gb2JqZWN0IGlzIGluIHRoaXMgbGlzdC4KKwkgKgorCSAqIEEgcmVmZXJlbmNlIGlzIG5vdCBoZWxkIG9uIHRoZSBidWZmZXIgd2hpbGUgb24gdGhpcyBsaXN0LAorCSAqIGFzIG1lcmVseSBiZWluZyBHVFQtYm91bmQgc2hvdWxkbid0IHByZXZlbnQgaXRzIGJlaW5nCisJICogZnJlZWQsIGFuZCB3ZSdsbCBwdWxsIGl0IG9mZiB0aGUgbGlzdCBpbiB0aGUgZnJlZSBwYXRoLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgaW5hY3RpdmVfbGlzdDsKKworCS8qIEZJWE1FOiBOZWVkIGEgbW9yZSBnZW5lcmljIHJldHVybiB0eXBlICovCisJZ2VuNl9ndHRfcHRlX3QgKCpwdGVfZW5jb2RlKShkbWFfYWRkcl90IGFkZHIsCisJCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJICAgICBib29sIHZhbGlkKTsgLyogQ3JlYXRlIGEgdmFsaWQgUFRFICovCisJdm9pZCAoKmNsZWFyX3JhbmdlKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgICB1aW50NjRfdCBzdGFydCwKKwkJCSAgICB1aW50NjRfdCBsZW5ndGgsCisJCQkgICAgYm9vbCB1c2Vfc2NyYXRjaCk7CisJdm9pZCAoKmluc2VydF9lbnRyaWVzKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnN0LAorCQkJICAgICAgIHVpbnQ2NF90IHN0YXJ0LAorCQkJICAgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCk7CisJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKTsKK307CisKKy8qIFRoZSBHcmFwaGljcyBUcmFuc2xhdGlvbiBUYWJsZSBpcyB0aGUgd2F5IGluIHdoaWNoIEdFTiBoYXJkd2FyZSB0cmFuc2xhdGVzIGEKKyAqIEdyYXBoaWNzIFZpcnR1YWwgQWRkcmVzcyBpbnRvIGEgUGh5c2ljYWwgQWRkcmVzcy4gSW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbAorICogY29sbGF0ZXJhbCBhc3NvY2lhdGVkIHdpdGggYW55IHZhLT5wYSB0cmFuc2xhdGlvbnMgR0VOIGhhcmR3YXJlIGFsc28gaGFzIGEKKyAqIHBvcnRpb24gb2YgdGhlIEdUVCB3aGljaCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBDUFUgYW5kIHJlbWFpbiBib3RoIGNvaGVyZW50CisgKiBhbmQgY29ycmVjdCAoaW4gY2FzZXMgbGlrZSBzd2l6emxpbmcpLiBUaGF0IHJlZ2lvbiBpcyByZWZlcnJlZCB0byBhcyBHTUFEUiBpbgorICogdGhlIHNwZWMuCisgKi8KK3N0cnVjdCBpOTE1X2d0dCB7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSBiYXNlOworCXNpemVfdCBzdG9sZW5fc2l6ZTsJCS8qIFRvdGFsIHNpemUgb2Ygc3RvbGVuIG1lbW9yeSAqLworCisJdW5zaWduZWQgbG9uZyBtYXBwYWJsZV9lbmQ7CS8qIEVuZCBvZmZzZXQgdGhhdCB3ZSBjYW4gQ1BVIG1hcCAqLworCXN0cnVjdCBpb19tYXBwaW5nICptYXBwYWJsZTsJLyogTWFwcGluZyB0byBvdXIgQ1BVIG1hcHBhYmxlIHJlZ2lvbiAqLworCXBoeXNfYWRkcl90IG1hcHBhYmxlX2Jhc2U7CS8qIFBBIG9mIG91ciBHTUFEUiAqLworCisJLyoqICJHcmFwaGljcyBTdG9sZW4gTWVtb3J5IiBob2xkcyB0aGUgZ2xvYmFsIFBURXMgKi8KKwl2b2lkIF9faW9tZW0gKmdzbTsKKworCWJvb2wgZG9faWRsZV9tYXBzOworCisJaW50IG10cnI7CisKKwkvKiBnbG9iYWwgZ3R0IG9wcyAqLworCWludCAoKmd0dF9wcm9iZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc2l6ZV90ICpndHRfdG90YWwsCisJCQkgIHNpemVfdCAqc3RvbGVuLCBwaHlzX2FkZHJfdCAqbWFwcGFibGVfYmFzZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqbWFwcGFibGVfZW5kKTsKK307CisKK3N0cnVjdCBpOTE1X2h3X3BwZ3R0IHsKKwlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlIGJhc2U7CisJc3RydWN0IGtyZWYgcmVmOworCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOworCXVuc2lnbmVkIG51bV9wZF9lbnRyaWVzOworCXVuc2lnbmVkIG51bV9wZF9wYWdlczsgLyogZ2VuOCsgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBwYWdlICoqcHRfcGFnZXM7CisJCXN0cnVjdCBwYWdlICoqZ2VuOF9wdF9wYWdlc1tHRU44X0xFR0FDWV9QRFBTXTsKKwl9OworCXN0cnVjdCBwYWdlICpwZF9wYWdlczsKKwl1bmlvbiB7CisJCXVpbnQzMl90IHBkX29mZnNldDsKKwkJZG1hX2FkZHJfdCBwZF9kbWFfYWRkcltHRU44X0xFR0FDWV9QRFBTXTsKKwl9OworCXVuaW9uIHsKKwkJZG1hX2FkZHJfdCAqcHRfZG1hX2FkZHI7CisJCWRtYV9hZGRyX3QgKmdlbjhfcHRfZG1hX2FkZHJbNF07CisJfTsKKworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjdHg7CisKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCk7CisJaW50ICgqc3dpdGNoX21tKShzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQsCisJCQkgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJCSBib29sIHN5bmNocm9ub3VzKTsKKwl2b2lkICgqZGVidWdfZHVtcCkoc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOworfTsKKworaW50IGk5MTVfZ2VtX2d0dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBpOTE1X2dlbV9pbml0X2dsb2JhbF9ndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGk5MTVfZ2VtX3NldHVwX2dsb2JhbF9ndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG1hcHBhYmxlX2VuZCwgdW5zaWduZWQgbG9uZyBlbmQpOworCitib29sIGludGVsX2VuYWJsZV9wcGd0dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGZ1bGwpOworaW50IGk5MTVfZ2VtX2luaXRfcHBndHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0KTsKKwordm9pZCBpOTE1X2NoZWNrX2FuZF9jbGVhcl9mYXVsdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGk5MTVfZ2VtX3N1c3BlbmRfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ndHRfcHJlcGFyZV9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX2d0dF9maW5pc2hfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fcmVuZGVyX3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMWY5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIE1pa2EgS3VvcHBhbGEgPG1pa2Eua3VvcHBhbGFAaW50ZWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9yZW5kZXJzdGF0ZS5oIgorCitzdHJ1Y3QgaTkxNV9yZW5kZXJfc3RhdGUgeworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJdW5zaWduZWQgbG9uZyBnZ3R0X29mZnNldDsKKwl2b2lkICpiYXRjaDsKKwl1MzIgc2l6ZTsKKwl1MzIgbGVuOworfTsKKworc3RhdGljIHN0cnVjdCBpOTE1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk5MTVfcmVuZGVyX3N0YXRlICpzbzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmV0OworCisJc28gPSBremFsbG9jKHNpemVvZigqc28pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNvLT5vYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCA0MDk2KTsKKwlpZiAoc28tPm9iaiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZTsKKwl9CisJc28tPnNpemUgPSA0MDk2OworCisJcmV0ID0gaTkxNV9nZW1fb2JqX2dndHRfcGluKHNvLT5vYmosIDQwOTYsIDApOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9nZW07CisKKwlCVUdfT04oc28tPm9iai0+cGFnZXMtPm5lbnRzICE9IDEpOworCXBhZ2UgPSBzZ19wYWdlKHNvLT5vYmotPnBhZ2VzLT5zZ2wpOworCisJc28tPmJhdGNoID0ga21hcChwYWdlKTsKKwlpZiAoIXNvLT5iYXRjaCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVucGluOworCX0KKworCXNvLT5nZ3R0X29mZnNldCA9IGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChzby0+b2JqKTsKKworCXJldHVybiBzbzsKK3VucGluOgorCWk5MTVfZ2VtX29iamVjdF9nZ3R0X3VucGluKHNvLT5vYmopOworZnJlZV9nZW06CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJnNvLT5vYmotPmJhc2UpOworZnJlZToKKwlrZnJlZShzbyk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHZvaWQgcmVuZGVyX3N0YXRlX2ZyZWUoc3RydWN0IGk5MTVfcmVuZGVyX3N0YXRlICpzbykKK3sKKwlrdW5tYXAoc28tPmJhdGNoKTsKKwlpOTE1X2dlbV9vYmplY3RfZ2d0dF91bnBpbihzby0+b2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmc28tPm9iai0+YmFzZSk7CisJa2ZyZWUoc28pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcnN0YXRlX3JvZGF0YSAqCityZW5kZXJfc3RhdGVfZ2V0X3JvZGF0YShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBpbnQgZ2VuKQoreworCXN3aXRjaCAoZ2VuKSB7CisJY2FzZSA2OgorCQlyZXR1cm4gJmdlbjZfbnVsbF9zdGF0ZTsKKwljYXNlIDc6CisJCXJldHVybiAmZ2VuN19udWxsX3N0YXRlOworCWNhc2UgODoKKwkJcmV0dXJuICZnZW44X251bGxfc3RhdGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcmVuZGVyX3N0YXRlX3NldHVwKGNvbnN0IGludCBnZW4sCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyc3RhdGVfcm9kYXRhICpyb2RhdGEsCisJCQkgICAgICBzdHJ1Y3QgaTkxNV9yZW5kZXJfc3RhdGUgKnNvKQoreworCWNvbnN0IHU2NCBnb2Zmc2V0ID0gaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KHNvLT5vYmopOworCXUzMiByZWxvY19pbmRleCA9IDA7CisJdTMyICogY29uc3QgZCA9IHNvLT5iYXRjaDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJaW50IHJldDsKKworCWlmICghcm9kYXRhIHx8IHJvZGF0YS0+YmF0Y2hfaXRlbXMgKiA0ID4gc28tPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKHNvLT5vYmosIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAoaSA8IHJvZGF0YS0+YmF0Y2hfaXRlbXMpIHsKKwkJdTMyIHMgPSByb2RhdGEtPmJhdGNoW2ldOworCisJCWlmIChyZWxvY19pbmRleCA8IHJvZGF0YS0+cmVsb2NfaXRlbXMgJiYKKwkJICAgIGkgKiA0ICA9PSByb2RhdGEtPnJlbG9jW3JlbG9jX2luZGV4XSkgeworCisJCQlzICs9IGdvZmZzZXQgJiAweGZmZmZmZmZmOworCisJCQkvKiBXZSBrZWVwIGJhdGNoIG9mZnNldHMgbWF4IDMyYml0ICovCisJCQlpZiAoZ2VuID49IDgpIHsKKwkJCQlpZiAoaSArIDEgPj0gcm9kYXRhLT5iYXRjaF9pdGVtcyB8fAorCQkJCSAgICByb2RhdGEtPmJhdGNoW2kgKyAxXSAhPSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCWRbaV0gPSBzOworCQkJCWkrKzsKKwkJCQlzID0gKGdvZmZzZXQgJiAweGZmZmZmZmZmMDAwMDAwMDB1bGwpID4+IDMyOworCQkJfQorCisJCQlyZWxvY19pbmRleCsrOworCQl9CisKKwkJZFtpXSA9IHM7CisJCWkrKzsKKwl9CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc28tPm9iaiwgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocm9kYXRhLT5yZWxvY19pdGVtcyAhPSByZWxvY19pbmRleCkgeworCQlEUk1fRVJST1IoIm5vdCBhbGwgcmVsb2NzIHJlc29sdmVkLCAlZCBvdXQgb2YgJWRcbiIsCisJCQkgIHJlbG9jX2luZGV4LCByb2RhdGEtPnJlbG9jX2l0ZW1zKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc28tPmxlbiA9IHJvZGF0YS0+YmF0Y2hfaXRlbXMgKiA0OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X2dlbV9yZW5kZXJfc3RhdGVfaW5pdChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQoreworCWNvbnN0IGludCBnZW4gPSBJTlRFTF9JTkZPKHJpbmctPmRldiktPmdlbjsKKwlzdHJ1Y3QgaTkxNV9yZW5kZXJfc3RhdGUgKnNvOworCWNvbnN0IHN0cnVjdCBpbnRlbF9yZW5kZXJzdGF0ZV9yb2RhdGEgKnJvZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04ocmluZy0+aWQgIT0gUkNTKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyb2RhdGEgPSByZW5kZXJfc3RhdGVfZ2V0X3JvZGF0YShyaW5nLT5kZXYsIGdlbik7CisJaWYgKHJvZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNvID0gcmVuZGVyX3N0YXRlX2FsbG9jKHJpbmctPmRldik7CisJaWYgKElTX0VSUihzbykpCisJCXJldHVybiBQVFJfRVJSKHNvKTsKKworCXJldCA9IHJlbmRlcl9zdGF0ZV9zZXR1cChnZW4sIHJvZGF0YSwgc28pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gcmluZy0+ZGlzcGF0Y2hfZXhlY2J1ZmZlcihyaW5nLAorCQkJCQlpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQoc28tPm9iaiksCisJCQkJCXNvLT5sZW4sCisJCQkJCUk5MTVfRElTUEFUQ0hfU0VDVVJFKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKGk5MTVfZ2VtX29ial90b19nZ3R0KHNvLT5vYmopLCByaW5nKTsKKworCXJldCA9IF9faTkxNV9hZGRfcmVxdWVzdChyaW5nLCBOVUxMLCBzby0+b2JqLCBOVUxMKTsKKwkvKiBfX2k5MTVfYWRkX3JlcXVlc3QgbW92ZXMgb2JqZWN0IHRvIGluYWN0aXZlIGlmIGl0IGZhaWxzICovCitvdXQ6CisJcmVuZGVyX3N0YXRlX2ZyZWUoc28pOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYTkyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3VzZXJwdHIuYwpAQCAtMCwwICsxLDcxMSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyLTIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01NVV9OT1RJRklFUikKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnZhbF90cmVlLmg+CisKK3N0cnVjdCBpOTE1X21tdV9ub3RpZmllciB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJc3RydWN0IG1tdV9ub3RpZmllciBtbjsKKwlzdHJ1Y3QgcmJfcm9vdCBvYmplY3RzOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsKK307CisKK3N0cnVjdCBpOTE1X21tdV9vYmplY3QgeworCXN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW11OworCXN0cnVjdCBpbnRlcnZhbF90cmVlX25vZGUgaXQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKK307CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX3VzZXJwdHJfbW5faW52YWxpZGF0ZV9yYW5nZV9zdGFydChzdHJ1Y3QgbW11X25vdGlmaWVyICpfbW4sCisJCQkJCQkgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIgKm1uID0gY29udGFpbmVyX29mKF9tbiwgc3RydWN0IGk5MTVfbW11X25vdGlmaWVyLCBtbik7CisJc3RydWN0IGludGVydmFsX3RyZWVfbm9kZSAqaXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKKworCWVuZC0tOyAvKiBpbnRlcnZhbCByYW5nZXMgYXJlIGluY2x1c2l2ZSwgYnV0IGludmFsaWRhdGUgcmFuZ2UgaXMgZXhjbHVzaXZlICovCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwkJb2JqID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZtbi0+bG9jayk7CisJCWlmIChzZXJpYWwgPT0gbW4tPnNlcmlhbCkKKwkJCWl0ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX25leHQoaXQsIHN0YXJ0LCBlbmQpOworCQllbHNlCisJCQlpdCA9IGludGVydmFsX3RyZWVfaXRlcl9maXJzdCgmbW4tPm9iamVjdHMsIHN0YXJ0LCBlbmQpOworCQlpZiAoaXQgIT0gTlVMTCkgeworCQkJb2JqID0gY29udGFpbmVyX29mKGl0LCBzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0LCBpdCktPm9iajsKKwkJCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwkJCXNlcmlhbCA9IG1uLT5zZXJpYWw7CisJCX0KKwkJc3Bpbl91bmxvY2soJm1uLT5sb2NrKTsKKwkJaWYgKG9iaiA9PSBOVUxMKQorCQkJcmV0dXJuOworCisJCW11dGV4X2xvY2soJm1uLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJCS8qIENhbmNlbCBhbnkgYWN0aXZlIHdvcmtlciBhbmQgZm9yY2UgdXMgdG8gcmUtZXZhbHVhdGUgZ3VwICovCisJCW9iai0+dXNlcnB0ci53b3JrID0gTlVMTDsKKworCQlpZiAob2JqLT5wYWdlcyAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG1uLT5kZXYpOworCQkJc3RydWN0IGk5MTVfdm1hICp2bWEsICp0bXA7CisJCQlib29sIHdhc19pbnRlcnJ1cHRpYmxlOworCisJCQl3YXNfaW50ZXJydXB0aWJsZSA9IGRldl9wcml2LT5tbS5pbnRlcnJ1cHRpYmxlOworCQkJZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGUgPSBmYWxzZTsKKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZtYSwgdG1wLCAmb2JqLT52bWFfbGlzdCwgdm1hX2xpbmspIHsKKwkJCQlpbnQgcmV0ID0gaTkxNV92bWFfdW5iaW5kKHZtYSk7CisJCQkJV0FSTl9PTihyZXQgJiYgcmV0ICE9IC1FSU8pOworCQkJfQorCQkJV0FSTl9PTihpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaikpOworCisJCQlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IHdhc19pbnRlcnJ1cHRpYmxlOworCQl9CisKKwkJc3RhcnQgPSBvYmotPnVzZXJwdHIucHRyICsgb2JqLT5iYXNlLnNpemU7CisKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJCW11dGV4X3VubG9jaygmbW4tPmRldi0+c3RydWN0X211dGV4KTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW11X25vdGlmaWVyX29wcyBpOTE1X2dlbV91c2VycHRyX25vdGlmaWVyID0geworCS5pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0ID0gaTkxNV9nZW1fdXNlcnB0cl9tbl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0LAorfTsKKworc3RhdGljIHN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqCitfX2k5MTVfbW11X25vdGlmaWVyX2xvb2t1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3RydWN0IGk5MTVfbW11X25vdGlmaWVyICptbXU7CisKKwkvKiBQcm90ZWN0ZWQgYnkgZGV2LT5zdHJ1Y3RfbXV0ZXggKi8KKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlKGRldl9wcml2LT5tbXVfbm90aWZpZXJzLCBtbXUsIG5vZGUsICh1bnNpZ25lZCBsb25nKW1tKQorCQlpZiAobW11LT5tbSA9PSBtbSkKKwkJCXJldHVybiBtbXU7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqCitpOTE1X21tdV9ub3RpZmllcl9nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOworCXN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW11OworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwltbXUgPSBfX2k5MTVfbW11X25vdGlmaWVyX2xvb2t1cChkZXYsIG1tKTsKKwlpZiAobW11KQorCQlyZXR1cm4gbW11OworCisJbW11ID0ga21hbGxvYyhzaXplb2YoKm1tdSksIEdGUF9LRVJORUwpOworCWlmIChtbXUgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcGluX2xvY2tfaW5pdCgmbW11LT5sb2NrKTsKKwltbXUtPmRldiA9IGRldjsKKwltbXUtPm1uLm9wcyA9ICZpOTE1X2dlbV91c2VycHRyX25vdGlmaWVyOworCW1tdS0+bW0gPSBtbTsKKwltbXUtPm9iamVjdHMgPSBSQl9ST09UOworCW1tdS0+Y291bnQgPSAwOworCW1tdS0+c2VyaWFsID0gMDsKKworCS8qIFByb3RlY3RlZCBieSBtbWFwX3NlbSAod3JpdGUtbG9jaykgKi8KKwlyZXQgPSBfX21tdV9ub3RpZmllcl9yZWdpc3RlcigmbW11LT5tbiwgbW0pOworCWlmIChyZXQpIHsKKwkJa2ZyZWUobW11KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwkvKiBQcm90ZWN0ZWQgYnkgZGV2LT5zdHJ1Y3RfbXV0ZXggKi8KKwloYXNoX2FkZChkZXZfcHJpdi0+bW11X25vdGlmaWVycywgJm1tdS0+bm9kZSwgKHVuc2lnbmVkIGxvbmcpbW0pOworCXJldHVybiBtbXU7Cit9CisKK3N0YXRpYyB2b2lkCitfX2k5MTVfbW11X25vdGlmaWVyX2Rlc3Ryb3lfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIgKm1tdSA9IGNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKm1tdSksIHdvcmspOworCW1tdV9ub3RpZmllcl91bnJlZ2lzdGVyKCZtbXUtPm1uLCBtbXUtPm1tKTsKKwlrZnJlZShtbXUpOworfQorCitzdGF0aWMgdm9pZAorX19pOTE1X21tdV9ub3RpZmllcl9kZXN0cm95KHN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW11KQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm1tdS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJLyogUHJvdGVjdGVkIGJ5IGRldi0+c3RydWN0X211dGV4ICovCisJaGFzaF9kZWwoJm1tdS0+bm9kZSk7CisKKwkvKiBPdXIgbG9jayBvcmRlcmluZyBpczogbW1hcF9zZW0sIG1tdV9ub3RpZmllcl9zY3J1LCBzdHJ1Y3RfbXV0ZXguCisJICogV2UgZW50ZXIgdGhlIGZ1bmN0aW9uIGhvbGRpbmcgc3RydWN0X211dGV4LCB0aGVyZWZvcmUgd2UgbmVlZAorCSAqIHRvIGRyb3Agb3VyIG11dGV4IHByaW9yIHRvIGNhbGxpbmcgbW11X25vdGlmaWVyX3VucmVnaXN0ZXIgaW4KKwkgKiBvcmRlciB0byBwcmV2ZW50IGxvY2sgaW52ZXJzaW9uIChhbmQgc3lzdGVtLXdpZGUgZGVhZGxvY2spCisJICogYmV0d2VlbiB0aGUgbW1hcF9zZW0gYW5kIHN0cnVjdC1tdXRleC4gSGVuY2Ugd2UgZGVmZXIgdGhlCisJICogdW5yZWdpc3RyYXRpb24gdG8gYSB3b3JrcXVldWUgd2hlcmUgd2UgaG9sZCBubyBsb2Nrcy4KKwkgKi8KKwlJTklUX1dPUksoJm1tdS0+d29yaywgX19pOTE1X21tdV9ub3RpZmllcl9kZXN0cm95X3dvcmtlcik7CisJc2NoZWR1bGVfd29yaygmbW11LT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgX19pOTE1X21tdV9ub3RpZmllcl91cGRhdGVfc2VyaWFsKHN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW11KQoreworCWlmICgrK21tdS0+c2VyaWFsID09IDApCisJCW1tdS0+c2VyaWFsID0gMTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfbW11X25vdGlmaWVyX2RlbChzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIgKm1tdSwKKwkJICAgICAgc3RydWN0IGk5MTVfbW11X29iamVjdCAqbW4pCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbW11LT5kZXYtPnN0cnVjdF9tdXRleCk7CisKKwlzcGluX2xvY2soJm1tdS0+bG9jayk7CisJaW50ZXJ2YWxfdHJlZV9yZW1vdmUoJm1uLT5pdCwgJm1tdS0+b2JqZWN0cyk7CisJX19pOTE1X21tdV9ub3RpZmllcl91cGRhdGVfc2VyaWFsKG1tdSk7CisJc3Bpbl91bmxvY2soJm1tdS0+bG9jayk7CisKKwkvKiBQcm90ZWN0ZWQgYWdhaW5zdCBfYWRkKCkgYnkgZGV2LT5zdHJ1Y3RfbXV0ZXggKi8KKwlpZiAoLS1tbXUtPmNvdW50ID09IDApCisJCV9faTkxNV9tbXVfbm90aWZpZXJfZGVzdHJveShtbXUpOworfQorCitzdGF0aWMgaW50CitpOTE1X21tdV9ub3RpZmllcl9hZGQoc3RydWN0IGk5MTVfbW11X25vdGlmaWVyICptbXUsCisJCSAgICAgIHN0cnVjdCBpOTE1X21tdV9vYmplY3QgKm1uKQoreworCXN0cnVjdCBpbnRlcnZhbF90cmVlX25vZGUgKml0OworCWludCByZXQ7CisKKwlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShtbXUtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkcm9wIHRoZSBmaW5hbCBhY3RpdmUgcmVmZXJlbmNlIChhbmQgdGhlcmVieQorCSAqIHJlbW92ZSB0aGUgb2JqZWN0cyBmcm9tIHRoZSBpbnRlcnZhbCB0cmVlKSBiZWZvcmUgd2UgZG8KKwkgKiB0aGUgY2hlY2sgZm9yIG92ZXJsYXBwaW5nIG9iamVjdHMuCisJICovCisJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKG1tdS0+ZGV2KTsKKworCS8qIERpc2FsbG93IG92ZXJsYXBwaW5nIHVzZXJwdHIgb2JqZWN0cyAqLworCXNwaW5fbG9jaygmbW11LT5sb2NrKTsKKwlpdCA9IGludGVydmFsX3RyZWVfaXRlcl9maXJzdCgmbW11LT5vYmplY3RzLAorCQkJCSAgICAgIG1uLT5pdC5zdGFydCwgbW4tPml0Lmxhc3QpOworCWlmIChpdCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJCS8qIFdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSByYW5nZSBhcyBpdAorCQkgKiBlaXRoZXIgaGFzIGNhbmNlbGxlZCBndXAgd29yayBxdWV1ZWQgYW5kIHdlIG5lZWQgdG8KKwkJICogcmV0dXJuIGJhY2sgdG8gdGhlIHVzZXIgdG8gZ2l2ZSB0aW1lIGZvciB0aGUgZ3VwLXdvcmtlcnMKKwkJICogdG8gZmx1c2ggdGhlaXIgb2JqZWN0IHJlZmVyZW5jZXMgdXBvbiB3aGljaCB0aGUgb2JqZWN0IHdpbGwKKwkJICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnZhbC10cmVlLCBvciB0aGUgdGhlIHJhbmdlIGlzCisJCSAqIHN0aWxsIGluIHVzZSBieSBhbm90aGVyIGNsaWVudCBhbmQgdGhlIG92ZXJsYXAgaXMgaW52YWxpZC4KKwkJICovCisKKwkJb2JqID0gY29udGFpbmVyX29mKGl0LCBzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0LCBpdCktPm9iajsKKwkJcmV0ID0gb2JqLT51c2VycHRyLndvcmtlcnMgPyAtRUFHQUlOIDogLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbW4tPml0LCAmbW11LT5vYmplY3RzKTsKKwkJX19pOTE1X21tdV9ub3RpZmllcl91cGRhdGVfc2VyaWFsKG1tdSk7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZtbXUtPmxvY2spOworCW11dGV4X3VubG9jaygmbW11LT5kZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fdXNlcnB0cl9yZWxlYXNlX19tbXVfbm90aWZpZXIoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0ICptbjsKKworCW1uID0gb2JqLT51c2VycHRyLm1uOworCWlmIChtbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpOTE1X21tdV9ub3RpZmllcl9kZWwobW4tPm1tdSwgbW4pOworCW9iai0+dXNlcnB0ci5tbiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX3VzZXJwdHJfaW5pdF9fbW11X25vdGlmaWVyKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICAgIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW11OworCXN0cnVjdCBpOTE1X21tdV9vYmplY3QgKm1uOworCWludCByZXQ7CisKKwlpZiAoZmxhZ3MgJiBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQpCisJCXJldHVybiBjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTTsKKworCWRvd25fd3JpdGUoJm9iai0+dXNlcnB0ci5tbS0+bW1hcF9zZW0pOworCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKG9iai0+YmFzZS5kZXYpOworCWlmIChyZXQgPT0gMCkgeworCQltbXUgPSBpOTE1X21tdV9ub3RpZmllcl9nZXQob2JqLT5iYXNlLmRldiwgb2JqLT51c2VycHRyLm1tKTsKKwkJaWYgKCFJU19FUlIobW11KSkKKwkJCW1tdS0+Y291bnQrKzsgLyogcHJlZW1wdGl2ZSBhZGQgdG8gYWN0IGFzIGEgcmVmY291bnQgKi8KKwkJZWxzZQorCQkJcmV0ID0gUFRSX0VSUihtbXUpOworCQltdXRleF91bmxvY2soJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisJfQorCXVwX3dyaXRlKCZvYmotPnVzZXJwdHIubW0tPm1tYXBfc2VtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbW4gPSBremFsbG9jKHNpemVvZigqbW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAobW4gPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRlc3Ryb3lfbW11OworCX0KKworCW1uLT5tbXUgPSBtbXU7CisJbW4tPml0LnN0YXJ0ID0gb2JqLT51c2VycHRyLnB0cjsKKwltbi0+aXQubGFzdCA9IG1uLT5pdC5zdGFydCArIG9iai0+YmFzZS5zaXplIC0gMTsKKwltbi0+b2JqID0gb2JqOworCisJcmV0ID0gaTkxNV9tbXVfbm90aWZpZXJfYWRkKG1tdSwgbW4pOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9tbjsKKworCW9iai0+dXNlcnB0ci5tbiA9IG1uOworCXJldHVybiAwOworCitmcmVlX21uOgorCWtmcmVlKG1uKTsKK2Rlc3Ryb3lfbW11OgorCW11dGV4X2xvY2soJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKC0tbW11LT5jb3VudCA9PSAwKQorCQlfX2k5MTVfbW11X25vdGlmaWVyX2Rlc3Ryb3kobW11KTsKKwltdXRleF91bmxvY2soJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX3VzZXJwdHJfcmVsZWFzZV9fbW11X25vdGlmaWVyKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX3VzZXJwdHJfaW5pdF9fbW11X25vdGlmaWVyKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICAgIHVuc2lnbmVkIGZsYWdzKQoreworCWlmICgoZmxhZ3MgJiBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RydWN0IGdldF9wYWdlc193b3JrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKK307CisKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX1NXSU9UTEIpCisjZGVmaW5lIHN3aW90bGJfYWN0aXZlKCkgc3dpb3RsYl9ucl90YmwoKQorI2Vsc2UKKyNkZWZpbmUgc3dpb3RsYl9hY3RpdmUoKSAwCisjZW5kaWYKKworc3RhdGljIGludAorc3Rfc2V0X3BhZ2VzKHN0cnVjdCBzZ190YWJsZSAqKnN0LCBzdHJ1Y3QgcGFnZSAqKnB2ZWMsIGludCBudW1fcGFnZXMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgcmV0LCBuOworCisJKnN0ID0ga21hbGxvYyhzaXplb2YoKipzdCksIEdGUF9LRVJORUwpOworCWlmICgqc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoc3dpb3RsYl9hY3RpdmUoKSkgeworCQlyZXQgPSBzZ19hbGxvY190YWJsZSgqc3QsIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlmb3JfZWFjaF9zZygoKnN0KS0+c2dsLCBzZywgbnVtX3BhZ2VzLCBuKQorCQkJc2dfc2V0X3BhZ2Uoc2csIHB2ZWNbbl0sIFBBR0VfU0laRSwgMCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gc2dfYWxsb2NfdGFibGVfZnJvbV9wYWdlcygqc3QsIHB2ZWMsIG51bV9wYWdlcywKKwkJCQkJCTAsIG51bV9wYWdlcyA8PCBQQUdFX1NISUZULAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWtmcmVlKCpzdCk7CisJKnN0ID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorX19pOTE1X2dlbV91c2VycHRyX2dldF9wYWdlc193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKK3sKKwlzdHJ1Y3QgZ2V0X3BhZ2VzX3dvcmsgKndvcmsgPSBjb250YWluZXJfb2YoX3dvcmssIHR5cGVvZigqd29yayksIHdvcmspOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB3b3JrLT5vYmo7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJY29uc3QgaW50IG51bV9wYWdlcyA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IHBhZ2UgKipwdmVjOworCWludCBwaW5uZWQsIHJldDsKKworCXJldCA9IC1FTk9NRU07CisJcGlubmVkID0gMDsKKworCXB2ZWMgPSBrbWFsbG9jKG51bV9wYWdlcypzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCSAgICAgICBHRlBfVEVNUE9SQVJZIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKHB2ZWMgPT0gTlVMTCkKKwkJcHZlYyA9IGRybV9tYWxsb2NfYWIobnVtX3BhZ2VzLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmIChwdmVjICE9IE5VTEwpIHsKKwkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBvYmotPnVzZXJwdHIubW07CisKKwkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCQl3aGlsZSAocGlubmVkIDwgbnVtX3BhZ2VzKSB7CisJCQlyZXQgPSBnZXRfdXNlcl9wYWdlcyh3b3JrLT50YXNrLCBtbSwKKwkJCQkJICAgICBvYmotPnVzZXJwdHIucHRyICsgcGlubmVkICogUEFHRV9TSVpFLAorCQkJCQkgICAgIG51bV9wYWdlcyAtIHBpbm5lZCwKKwkJCQkJICAgICAhb2JqLT51c2VycHRyLnJlYWRfb25seSwgMCwKKwkJCQkJICAgICBwdmVjICsgcGlubmVkLCBOVUxMKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCisJCQlwaW5uZWQgKz0gcmV0OworCQl9CisJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlmIChvYmotPnVzZXJwdHIud29yayAhPSAmd29yay0+d29yaykgeworCQlyZXQgPSAwOworCX0gZWxzZSBpZiAocGlubmVkID09IG51bV9wYWdlcykgeworCQlyZXQgPSBzdF9zZXRfcGFnZXMoJm9iai0+cGFnZXMsIHB2ZWMsIG51bV9wYWdlcyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJbGlzdF9hZGRfdGFpbCgmb2JqLT5nbG9iYWxfbGlzdCwgJnRvX2k5MTUoZGV2KS0+bW0udW5ib3VuZF9saXN0KTsKKwkJCXBpbm5lZCA9IDA7CisJCX0KKwl9CisKKwlvYmotPnVzZXJwdHIud29yayA9IEVSUl9QVFIocmV0KTsKKwlvYmotPnVzZXJwdHIud29ya2Vycy0tOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmVsZWFzZV9wYWdlcyhwdmVjLCBwaW5uZWQsIDApOworCWRybV9mcmVlX2xhcmdlKHB2ZWMpOworCisJcHV0X3Rhc2tfc3RydWN0KHdvcmstPnRhc2spOworCWtmcmVlKHdvcmspOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV91c2VycHRyX2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCWNvbnN0IGludCBudW1fcGFnZXMgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOworCXN0cnVjdCBwYWdlICoqcHZlYzsKKwlpbnQgcGlubmVkLCByZXQ7CisKKwkvKiBJZiB1c2Vyc3BhY2Ugc2hvdWxkIGVuZ2luZWVyIHRoYXQgdGhlc2UgcGFnZXMgYXJlIHJlcGxhY2VkIGluCisJICogdGhlIHZtYSBiZXR3ZWVuIHVzIGJpbmRpbmcgdGhpcyBwYWdlIGludG8gdGhlIEdUVCBhbmQgY29tcGxldGlvbgorCSAqIG9mIHJlbmRlcmluZy4uLiBUaGVpciBsb3NzLiBJZiB0aGV5IGNoYW5nZSB0aGUgbWFwcGluZyBvZiB0aGVpcgorCSAqIHBhZ2VzIHRoZXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgYm8gdG8gcG9pbnQgdG8gdGhlIG5ldyB2bWEuCisJICoKKwkgKiBIb3dldmVyLCB0aGF0IHN0aWxsIGxlYXZlcyBvcGVuIHRoZSBwb3NzaWJpbGl0eSBvZiB0aGUgdm1hCisJICogYmVpbmcgY29waWVkIHVwb24gZm9yay4gV2hpY2ggZmFsbHMgdW5kZXIgdGhlIHNhbWUgdXNlcnNwYWNlCisJICogc3luY2hyb25pc2F0aW9uIGlzc3VlIGFzIGEgcmVndWxhciBibywgZXhjZXB0IHRoYXQgdGhpcyB0aW1lCisJICogdGhlIHByb2Nlc3MgbWF5IG5vdCBiZSBleHBlY3RpbmcgdGhhdCBhIHBhcnRpY3VsYXIgcGllY2Ugb2YKKwkgKiBtZW1vcnkgaXMgdGllZCB0byB0aGUgR1BVLgorCSAqCisJICogRm9ydHVuYXRlbHksIHdlIGNhbiBob29rIGludG8gdGhlIG1tdV9ub3RpZmllciBpbiBvcmRlciB0bworCSAqIGRpc2NhcmQgdGhlIHBhZ2UgcmVmZXJlbmNlcyBwcmlvciB0byBhbnl0aGluZyBuYXN0eSBoYXBwZW5pbmcKKwkgKiB0byB0aGUgdm1hIChkaXNjYXJkIG9yIGNsb25pbmcpIHdoaWNoIHNob3VsZCBwcmV2ZW50IHRoZSBtb3JlCisJICogZWdyZWdpb3VzIGNhc2VzIGZyb20gY2F1c2luZyBoYXJtLgorCSAqLworCisJcHZlYyA9IE5VTEw7CisJcGlubmVkID0gMDsKKwlpZiAob2JqLT51c2VycHRyLm1tID09IGN1cnJlbnQtPm1tKSB7CisJCXB2ZWMgPSBrbWFsbG9jKG51bV9wYWdlcypzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCQkgICAgICAgR0ZQX1RFTVBPUkFSWSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpOworCQlpZiAocHZlYyA9PSBOVUxMKSB7CisJCQlwdmVjID0gZHJtX21hbGxvY19hYihudW1fcGFnZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CisJCQlpZiAocHZlYyA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcGlubmVkID0gX19nZXRfdXNlcl9wYWdlc19mYXN0KG9iai0+dXNlcnB0ci5wdHIsIG51bV9wYWdlcywKKwkJCQkJICAgICAgICFvYmotPnVzZXJwdHIucmVhZF9vbmx5LCBwdmVjKTsKKwl9CisJaWYgKHBpbm5lZCA8IG51bV9wYWdlcykgeworCQlpZiAocGlubmVkIDwgMCkgeworCQkJcmV0ID0gcGlubmVkOworCQkJcGlubmVkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNwYXduIGEgd29ya2VyIHNvIHRoYXQgd2UgY2FuIGFjcXVpcmUgdGhlCisJCQkgKiB1c2VyIHBhZ2VzIHdpdGhvdXQgaG9sZGluZyBvdXIgbXV0ZXguIEFjY2VzcworCQkJICogdG8gdGhlIHVzZXIgcGFnZXMgcmVxdWlyZXMgbW1hcF9zZW0sIGFuZCB3ZSBoYXZlCisJCQkgKiBhIHN0cmljdCBsb2NrIG9yZGVyaW5nIG9mIG1tYXBfc2VtLCBzdHJ1Y3RfbXV0ZXggLQorCQkJICogd2UgYWxyZWFkeSBob2xkIHN0cnVjdF9tdXRleCBoZXJlIGFuZCBzbyBjYW5ub3QKKwkJCSAqIGNhbGwgZ3VwIHdpdGhvdXQgZW5jb3VudGVyaW5nIGEgbG9jayBpbnZlcnNpb24uCisJCQkgKgorCQkJICogVXNlcnNwYWNlIHdpbGwga2VlcCBvbiByZXBlYXRpbmcgdGhlIG9wZXJhdGlvbgorCQkJICogKHRoYW5rcyB0byBFQUdBSU4pIHVudGlsIGVpdGhlciB3ZSBoaXQgdGhlIGZhc3QKKwkJCSAqIHBhdGggb3IgdGhlIHdvcmtlciBjb21wbGV0ZXMuIElmIHRoZSB3b3JrZXIgaXMKKwkJCSAqIGNhbmNlbGxlZCBvciBzdXBlcnNlZGVkLCB0aGUgdGFzayBpcyBzdGlsbCBydW4KKwkJCSAqIGJ1dCB0aGUgcmVzdWx0cyBpZ25vcmVkLiAoVGhpcyBsZWFkcyB0bworCQkJICogY29tcGxpY2F0aW9ucyB0aGF0IHdlIG1heSBoYXZlIGEgc3RyYXkgb2JqZWN0CisJCQkgKiByZWZjb3VudCB0aGF0IHdlIG5lZWQgdG8gYmUgd2FyeSBvZiB3aGVuCisJCQkgKiBjaGVja2luZyBmb3IgZXhpc3Rpbmcgb2JqZWN0cyBkdXJpbmcgY3JlYXRpb24uKQorCQkJICogSWYgdGhlIHdvcmtlciBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCByZXBvcnRzCisJCQkgKiB0aGF0IGVycm9yIGJhY2sgdG8gdGhpcyBmdW5jdGlvbiB0aHJvdWdoCisJCQkgKiBvYmotPnVzZXJwdHIud29yayA9IEVSUl9QVFIuCisJCQkgKi8KKwkJCXJldCA9IC1FQUdBSU47CisJCQlpZiAob2JqLT51c2VycHRyLndvcmsgPT0gTlVMTCAmJgorCQkJICAgIG9iai0+dXNlcnB0ci53b3JrZXJzIDwgSTkxNV9HRU1fVVNFUlBUUl9NQVhfV09SS0VSUykgeworCQkJCXN0cnVjdCBnZXRfcGFnZXNfd29yayAqd29yazsKKworCQkJCXdvcmsgPSBrbWFsbG9jKHNpemVvZigqd29yayksIEdGUF9LRVJORUwpOworCQkJCWlmICh3b3JrICE9IE5VTEwpIHsKKwkJCQkJb2JqLT51c2VycHRyLndvcmsgPSAmd29yay0+d29yazsKKwkJCQkJb2JqLT51c2VycHRyLndvcmtlcnMrKzsKKworCQkJCQl3b3JrLT5vYmogPSBvYmo7CisJCQkJCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKworCQkJCQl3b3JrLT50YXNrID0gY3VycmVudDsKKwkJCQkJZ2V0X3Rhc2tfc3RydWN0KHdvcmstPnRhc2spOworCisJCQkJCUlOSVRfV09SSygmd29yay0+d29yaywgX19pOTE1X2dlbV91c2VycHRyX2dldF9wYWdlc193b3JrZXIpOworCQkJCQlzY2hlZHVsZV93b3JrKCZ3b3JrLT53b3JrKTsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKElTX0VSUihvYmotPnVzZXJwdHIud29yaykpIHsKKwkJCQkJcmV0ID0gUFRSX0VSUihvYmotPnVzZXJwdHIud29yayk7CisJCQkJCW9iai0+dXNlcnB0ci53b3JrID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBzdF9zZXRfcGFnZXMoJm9iai0+cGFnZXMsIHB2ZWMsIG51bV9wYWdlcyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJb2JqLT51c2VycHRyLndvcmsgPSBOVUxMOworCQkJcGlubmVkID0gMDsKKwkJfQorCX0KKworCXJlbGVhc2VfcGFnZXMocHZlYywgcGlubmVkLCAwKTsKKwlkcm1fZnJlZV9sYXJnZShwdmVjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fdXNlcnB0cl9wdXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJQlVHX09OKG9iai0+dXNlcnB0ci53b3JrICE9IE5VTEwpOworCisJaWYgKG9iai0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpCisJCW9iai0+ZGlydHkgPSAwOworCisJZm9yX2VhY2hfc2cob2JqLT5wYWdlcy0+c2dsLCBzZywgb2JqLT5wYWdlcy0+bmVudHMsIGkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHNnKTsKKworCQlpZiAob2JqLT5kaXJ0eSkKKwkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlvYmotPmRpcnR5ID0gMDsKKworCXNnX2ZyZWVfdGFibGUob2JqLT5wYWdlcyk7CisJa2ZyZWUob2JqLT5wYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X2dlbV91c2VycHRyX3JlbGVhc2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpOTE1X2dlbV91c2VycHRyX3JlbGVhc2VfX21tdV9ub3RpZmllcihvYmopOworCisJaWYgKG9iai0+dXNlcnB0ci5tbSkgeworCQltbXB1dChvYmotPnVzZXJwdHIubW0pOworCQlvYmotPnVzZXJwdHIubW0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGludAoraTkxNV9nZW1fdXNlcnB0cl9kbWFidWZfZXhwb3J0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJaWYgKG9iai0+dXNlcnB0ci5tbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaTkxNV9nZW1fdXNlcnB0cl9pbml0X19tbXVfbm90aWZpZXIob2JqLCAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyBpOTE1X2dlbV91c2VycHRyX29wcyA9IHsKKwkuZG1hYnVmX2V4cG9ydCA9IGk5MTVfZ2VtX3VzZXJwdHJfZG1hYnVmX2V4cG9ydCwKKwkuZ2V0X3BhZ2VzID0gaTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXMsCisJLnB1dF9wYWdlcyA9IGk5MTVfZ2VtX3VzZXJwdHJfcHV0X3BhZ2VzLAorCS5yZWxlYXNlID0gaTkxNV9nZW1fdXNlcnB0cl9yZWxlYXNlLAorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1tIG9iamVjdCB0aGF0IHdyYXBzIHNvbWUgbm9ybWFsIG1lbW9yeSBmcm9tIHRoZSBwcm9jZXNzCisgKiBjb250ZXh0IC0gdXNlciBtZW1vcnkuCisgKgorICogV2UgaW1wb3NlIHNldmVyYWwgcmVzdHJpY3Rpb25zIHVwb24gdGhlIG1lbW9yeSBiZWluZyBtYXBwZWQKKyAqIGludG8gdGhlIEdQVS4KKyAqIDEuIEl0IG11c3QgYmUgcGFnZSBhbGlnbmVkIChib3RoIHN0YXJ0L2VuZCBhZGRyZXNzZXMsIGkuZSBwdHIgYW5kIHNpemUpLgorICogMi4gSXQgY2Fubm90IG92ZXJsYXAgYW55IG90aGVyIHVzZXJwdHIgb2JqZWN0IGluIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2UuCisgKiAzLiBJdCBtdXN0IGJlIG5vcm1hbCBzeXN0ZW0gbWVtb3J5LCBub3QgYSBwb2ludGVyIGludG8gYW5vdGhlciBtYXAgb2YgSU8KKyAqICAgIHNwYWNlIChlLmcuIGl0IG11c3Qgbm90IGJlIGEgR1RUIG1tYXBwaW5nIG9mIGFub3RoZXIgb2JqZWN0KS4KKyAqIDQuIFdlIG9ubHkgYWxsb3cgYSBibyBhcyBsYXJnZSBhcyB3ZSBjb3VsZCBpbiB0aGVvcnkgbWFwIGludG8gdGhlIEdUVCwKKyAqICAgIHRoYXQgaXMgd2UgbGltaXQgdGhlIHNpemUgdG8gdGhlIHRvdGFsIHNpemUgb2YgdGhlIEdUVC4KKyAqIDUuIFRoZSBibyBpcyBtYXJrZWQgYXMgYmVpbmcgc25vb3BhYmxlLiBUaGUgYmFja2luZyBwYWdlcyBhcmUgbGVmdAorICogICAgYWNjZXNzaWJsZSBkaXJlY3RseSBieSB0aGUgQ1BVLCBidXQgcmVhZHMgYW5kIHdyaXRlcyBieSB0aGUgR1BVIG1heQorICogICAgaW5jdXIgdGhlIGNvc3Qgb2YgYSBzbm9vcCAodW5sZXNzIHlvdSBoYXZlIGFuIExMQyBhcmNoaXRlY3R1cmUpLgorICoKKyAqIFN5bmNocm9uaXNhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHVzZXJzIGFuZCB0aGUgR1BVIGlzIGxlZnQgdG8gdXNlcnNwYWNlCisgKiB0aHJvdWdoIHRoZSBub3JtYWwgc2V0LWRvbWFpbi1pb2N0bC4gVGhlIGtlcm5lbCB3aWxsIGVuZm9yY2UgdGhhdCB0aGUKKyAqIEdQVSByZWxpbnF1aXNoZXMgdGhlIFZNQSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYmFjayB0byB0aGUgc3lzdGVtCisgKiBpLmUuIHVwb24gZnJlZSgpLCBtdW5tYXAoKSBvciBwcm9jZXNzIHRlcm1pbmF0aW9uLiBIb3dldmVyLCB0aGUgdXNlcnNwYWNlCisgKiBtYWxsb2MoKSBsaWJyYXJ5IG1heSBub3QgaW1tZWRpYXRlbHkgcmVsaW5xdWlzaCB0aGUgVk1BIGFmdGVyIGZyZWUoKSBhbmQKKyAqIGluc3RlYWQgcmV1c2UgaXQgd2hpbHN0IHRoZSBHUFUgaXMgc3RpbGwgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgVk1BLgorICogQ2F2ZWF0IGVtcHRvci4KKyAqCisgKiBBbHNvIG5vdGUsIHRoYXQgdGhlIG9iamVjdCBjcmVhdGVkIGhlcmUgaXMgbm90IGN1cnJlbnRseSBhICJmaXJzdCBjbGFzcyIKKyAqIG9iamVjdCwgaW4gdGhhdCBzZXZlcmFsIGlvY3RscyBhcmUgYmFubmVkLiBUaGVzZSBhcmUgdGhlIENQVSBhY2Nlc3MKKyAqIGlvY3RsczogbW1hcCgpLCBwd3JpdGUgYW5kIHByZWFkLiBJbiBwcmFjdGljZSwgeW91IGFyZSBleHBlY3RlZCB0byB1c2UKKyAqIGRpcmVjdCBhY2Nlc3MgdmlhIHlvdXIgcG9pbnRlciByYXRoZXIgdGhhbiB1c2UgdGhvc2UgaW9jdGxzLgorICoKKyAqIElmIHlvdSB0aGluayB0aGlzIGlzIGEgZ29vZCBpbnRlcmZhY2UgdG8gdXNlIHRvIHBhc3MgR1BVIG1lbW9yeSBiZXR3ZWVuCisgKiBkcml2ZXJzLCBwbGVhc2UgdXNlIGRtYS1idWYgaW5zdGVhZC4gSW4gZmFjdCwgd2hlcmV2ZXIgcG9zc2libGUgdXNlCisgKiBkbWEtYnVmIGluc3RlYWQuCisgKi8KK2ludAoraTkxNV9nZW1fdXNlcnB0cl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VzZXJwdHIgKmFyZ3MgPSBkYXRhOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IHJldDsKKwl1MzIgaGFuZGxlOworCisJaWYgKGFyZ3MtPmZsYWdzICYgfihJOTE1X1VTRVJQVFJfUkVBRF9PTkxZIHwKKwkJCSAgICBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZmZzZXRfaW5fcGFnZShhcmdzLT51c2VyX3B0ciB8IGFyZ3MtPnVzZXJfc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyZ3MtPnVzZXJfc2l6ZSA+IGRldl9wcml2LT5ndHQuYmFzZS50b3RhbCkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWlmICghYWNjZXNzX29rKGFyZ3MtPmZsYWdzICYgSTkxNV9VU0VSUFRSX1JFQURfT05MWSA/IFZFUklGWV9SRUFEIDogVkVSSUZZX1dSSVRFLAorCQkgICAgICAgKGNoYXIgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYXJncy0+dXNlcl9wdHIsIGFyZ3MtPnVzZXJfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGFyZ3MtPmZsYWdzICYgSTkxNV9VU0VSUFRSX1JFQURfT05MWSkgeworCQkvKiBPbiBhbG1vc3QgYWxsIG9mIHRoZSBjdXJyZW50IGh3LCB3ZSBjYW5ub3QgdGVsbCB0aGUgR1BVIHRoYXQgYQorCQkgKiBwYWdlIGlzIHJlYWRvbmx5LCBzbyB0aGlzIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBpbiB0aGUgdUFQSS4KKwkJICovCisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBuZXcgb2JqZWN0ICovCisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2FsbG9jKGRldik7CisJaWYgKG9iaiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRybV9nZW1fcHJpdmF0ZV9vYmplY3RfaW5pdChkZXYsICZvYmotPmJhc2UsIGFyZ3MtPnVzZXJfc2l6ZSk7CisJaTkxNV9nZW1fb2JqZWN0X2luaXQob2JqLCAmaTkxNV9nZW1fdXNlcnB0cl9vcHMpOworCW9iai0+Y2FjaGVfbGV2ZWwgPSBJOTE1X0NBQ0hFX0xMQzsKKwlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmJhc2UucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKworCW9iai0+dXNlcnB0ci5wdHIgPSBhcmdzLT51c2VyX3B0cjsKKwlvYmotPnVzZXJwdHIucmVhZF9vbmx5ID0gISEoYXJncy0+ZmxhZ3MgJiBJOTE1X1VTRVJQVFJfUkVBRF9PTkxZKTsKKworCS8qIEFuZCBrZWVwIGEgcG9pbnRlciB0byB0aGUgY3VycmVudC0+bW0gZm9yIHJlc29sdmluZyB0aGUgdXNlciBwYWdlcworCSAqIGF0IGJpbmRpbmcuIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGhvb2sgaW50byB0aGUgbW11X25vdGlmaWVyCisJICogaW4gb3JkZXIgdG8gZGV0ZWN0IGlmIHRoZSBtbXUgaXMgZGVzdHJveWVkLgorCSAqLworCXJldCA9IC1FTk9NRU07CisJaWYgKChvYmotPnVzZXJwdHIubW0gPSBnZXRfdGFza19tbShjdXJyZW50KSkpCisJCXJldCA9IGk5MTVfZ2VtX3VzZXJwdHJfaW5pdF9fbW11X25vdGlmaWVyKG9iaiwgYXJncy0+ZmxhZ3MpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGUsICZvYmotPmJhc2UsICZoYW5kbGUpOworCisJLyogZHJvcCByZWZlcmVuY2UgZnJvbSBhbGxvY2F0ZSAtIGhhbmRsZSBob2xkcyBpdCBub3cgKi8KKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmb2JqLT5iYXNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYXJncy0+aGFuZGxlID0gaGFuZGxlOworCXJldHVybiAwOworfQorCitpbnQKK2k5MTVfZ2VtX2luaXRfdXNlcnB0cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworI2lmIGRlZmluZWQoQ09ORklHX01NVV9OT1RJRklFUikKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJaGFzaF9pbml0KGRldl9wcml2LT5tbXVfbm90aWZpZXJzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ncHVfZXJyb3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3B1X2Vycm9yLmMKaW5kZXggMTJmMWQ0My4uODdlYzYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ncHVfZXJyb3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dwdV9lcnJvci5jCkBAIC00Miw2ICs0Miw3IEBACiAJY2FzZSBWQ1M6IHJldHVybiAiYnNkIjsKIAljYXNlIEJDUzogcmV0dXJuICJibHQiOwogCWNhc2UgVkVDUzogcmV0dXJuICJ2ZWJveCI7CisJY2FzZSBWQ1MyOiByZXR1cm4gImJzZDIiOwogCWRlZmF1bHQ6IHJldHVybiAiIjsKIAl9CiB9CkBAIC0yMDQsNiArMjA1LDcgQEAKIAkJZXJyX3B1dHMobSwgdGlsaW5nX2ZsYWcoZXJyLT50aWxpbmcpKTsKIAkJZXJyX3B1dHMobSwgZGlydHlfZmxhZyhlcnItPmRpcnR5KSk7CiAJCWVycl9wdXRzKG0sIHB1cmdlYWJsZV9mbGFnKGVyci0+cHVyZ2VhYmxlKSk7CisJCWVycl9wdXRzKG0sIGVyci0+dXNlcnB0ciA/ICIgdXNlcnB0ciIgOiAiIik7CiAJCWVycl9wdXRzKG0sIGVyci0+cmluZyAhPSAtMSA/ICIgIiA6ICIiKTsKIAkJZXJyX3B1dHMobSwgcmluZ19zdHIoZXJyLT5yaW5nKSk7CiAJCWVycl9wdXRzKG0sIGk5MTVfY2FjaGVfbGV2ZWxfc3RyKGVyci0+Y2FjaGVfbGV2ZWwpKTsKQEAgLTI1Nyw3ICsyNTksOCBAQAogCQllcnJfcHJpbnRmKG0sICIgIElOU1RQUzogMHglMDh4XG4iLCByaW5nLT5pbnN0cHMpOwogCX0KIAllcnJfcHJpbnRmKG0sICIgIElOU1RQTTogMHglMDh4XG4iLCByaW5nLT5pbnN0cG0pOwotCWVycl9wcmludGYobSwgIiAgRkFERFI6IDB4JTA4eFxuIiwgcmluZy0+ZmFkZHIpOworCWVycl9wcmludGYobSwgIiAgRkFERFI6IDB4JTA4eCAlMDh4XG4iLCB1cHBlcl8zMl9iaXRzKHJpbmctPmZhZGRyKSwKKwkJICAgbG93ZXJfMzJfYml0cyhyaW5nLT5mYWRkcikpOwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CiAJCWVycl9wcmludGYobSwgIiAgUkMgUFNNSTogMHglMDh4XG4iLCByaW5nLT5yY19wc21pKTsKIAkJZXJyX3ByaW50ZihtLCAiICBGQVVMVF9SRUc6IDB4JTA4eFxuIiwgcmluZy0+ZmF1bHRfcmVnKTsKQEAgLTQ1MiwxNiArNDU1LDcgQEAKIAkJCWVycl9wcmludGYobSwgIiVzIC0tLSBIVyBDb250ZXh0ID0gMHglMDh4XG4iLAogCQkJCSAgIGRldl9wcml2LT5yaW5nW2ldLm5hbWUsCiAJCQkJICAgb2JqLT5ndHRfb2Zmc2V0KTsKLQkJCW9mZnNldCA9IDA7Ci0JCQlmb3IgKGVsdCA9IDA7IGVsdCA8IFBBR0VfU0laRS8xNjsgZWx0ICs9IDQpIHsKLQkJCQllcnJfcHJpbnRmKG0sICJbJTA0eF0gJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJCQkJICAgb2Zmc2V0LAotCQkJCQkgICBvYmotPnBhZ2VzWzBdW2VsdF0sCi0JCQkJCSAgIG9iai0+cGFnZXNbMF1bZWx0KzFdLAotCQkJCQkgICBvYmotPnBhZ2VzWzBdW2VsdCsyXSwKLQkJCQkJICAgb2JqLT5wYWdlc1swXVtlbHQrM10pOwotCQkJCQlvZmZzZXQgKz0gMTY7Ci0JCQl9CisJCQlwcmludF9lcnJvcl9vYmoobSwgb2JqKTsKIAkJfQogCX0KIApAQCAtNjQ4LDYgKzY0Miw3IEBACiAJZXJyLT50aWxpbmcgPSBvYmotPnRpbGluZ19tb2RlOwogCWVyci0+ZGlydHkgPSBvYmotPmRpcnR5OwogCWVyci0+cHVyZ2VhYmxlID0gb2JqLT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRDsKKwllcnItPnVzZXJwdHIgPSBvYmotPnVzZXJwdHIubW0gIT0gTlVMTDsKIAllcnItPnJpbmcgPSBvYmotPnJpbmcgPyBvYmotPnJpbmctPmlkIDogLTE7CiAJZXJyLT5jYWNoZV9sZXZlbCA9IG9iai0+Y2FjaGVfbGV2ZWw7CiB9CkBAIC03NTIsNyArNzQ3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9yZWNvcmRfcmluZ19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9lcnJvcl9yaW5nICplcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzY0LDE0ICs3NTksMTQgQEAKIAkJCT0gSTkxNV9SRUFEKFJJTkdfU1lOQ18wKHJpbmctPm1taW9fYmFzZSkpOwogCQllcmluZy0+c2VtYXBob3JlX21ib3hlc1sxXQogCQkJPSBJOTE1X1JFQUQoUklOR19TWU5DXzEocmluZy0+bW1pb19iYXNlKSk7Ci0JCWVyaW5nLT5zZW1hcGhvcmVfc2Vxbm9bMF0gPSByaW5nLT5zeW5jX3NlcW5vWzBdOwotCQllcmluZy0+c2VtYXBob3JlX3NlcW5vWzFdID0gcmluZy0+c3luY19zZXFub1sxXTsKKwkJZXJpbmctPnNlbWFwaG9yZV9zZXFub1swXSA9IHJpbmctPnNlbWFwaG9yZS5zeW5jX3NlcW5vWzBdOworCQllcmluZy0+c2VtYXBob3JlX3NlcW5vWzFdID0gcmluZy0+c2VtYXBob3JlLnN5bmNfc2Vxbm9bMV07CiAJfQogCiAJaWYgKEhBU19WRUJPWChkZXYpKSB7CiAJCWVyaW5nLT5zZW1hcGhvcmVfbWJveGVzWzJdID0KIAkJCUk5MTVfUkVBRChSSU5HX1NZTkNfMihyaW5nLT5tbWlvX2Jhc2UpKTsKLQkJZXJpbmctPnNlbWFwaG9yZV9zZXFub1syXSA9IHJpbmctPnN5bmNfc2Vxbm9bMl07CisJCWVyaW5nLT5zZW1hcGhvcmVfc2Vxbm9bMl0gPSByaW5nLT5zZW1hcGhvcmUuc3luY19zZXFub1syXTsKIAl9CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewpAQCAtNzgxLDggKzc3NiwxMCBAQAogCQllcmluZy0+aW5zdGRvbmUgPSBJOTE1X1JFQUQoUklOR19JTlNURE9ORShyaW5nLT5tbWlvX2Jhc2UpKTsKIAkJZXJpbmctPmluc3RwcyA9IEk5MTVfUkVBRChSSU5HX0lOU1RQUyhyaW5nLT5tbWlvX2Jhc2UpKTsKIAkJZXJpbmctPmJiYWRkciA9IEk5MTVfUkVBRChSSU5HX0JCQUREUihyaW5nLT5tbWlvX2Jhc2UpKTsKLQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpCisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KSB7CisJCQllcmluZy0+ZmFkZHIgfD0gKHU2NCkgSTkxNV9SRUFEKFJJTkdfRE1BX0ZBRERfVURXKHJpbmctPm1taW9fYmFzZSkpIDw8IDMyOwogCQkJZXJpbmctPmJiYWRkciB8PSAodTY0KSBJOTE1X1JFQUQoUklOR19CQkFERFJfVURXKHJpbmctPm1taW9fYmFzZSkpIDw8IDMyOworCQl9CiAJCWVyaW5nLT5iYnN0YXRlID0gSTkxNV9SRUFEKFJJTkdfQkJTVEFURShyaW5nLT5tbWlvX2Jhc2UpKTsKIAl9IGVsc2UgewogCQllcmluZy0+ZmFkZHIgPSBJOTE1X1JFQUQoRE1BX0ZBRERfSThYWCk7CkBAIC04MjgsOCArODI1LDggQEAKIAkJZXJpbmctPmh3cyA9IEk5MTVfUkVBRChtbWlvKTsKIAl9CiAKLQllcmluZy0+Y3B1X3JpbmdfaGVhZCA9IHJpbmctPmhlYWQ7Ci0JZXJpbmctPmNwdV9yaW5nX3RhaWwgPSByaW5nLT50YWlsOworCWVyaW5nLT5jcHVfcmluZ19oZWFkID0gcmluZy0+YnVmZmVyLT5oZWFkOworCWVyaW5nLT5jcHVfcmluZ190YWlsID0gcmluZy0+YnVmZmVyLT50YWlsOwogCiAJZXJpbmctPmhhbmdjaGVja19zY29yZSA9IHJpbmctPmhhbmdjaGVjay5zY29yZTsKIAllcmluZy0+aGFuZ2NoZWNrX2FjdGlvbiA9IHJpbmctPmhhbmdjaGVjay5hY3Rpb247CkBAIC04NjIsNyArODU5LDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpOTE1X2dlbV9yZWNvcmRfYWN0aXZlX2NvbnRleHQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIHZvaWQgaTkxNV9nZW1fcmVjb3JkX2FjdGl2ZV9jb250ZXh0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9lcnJvcl9zdGF0ZSAqZXJyb3IsCiAJCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9lcnJvcl9yaW5nICplcmluZykKIHsKQEAgLTg3NSwxMCArODcyLDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmJvdW5kX2xpc3QsIGdsb2JhbF9saXN0KSB7CiAJCWlmICgoZXJyb3ItPmNjaWQgJiBQQUdFX01BU0spID09IGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopKSB7Ci0JCQllcmluZy0+Y3R4ID0gaTkxNV9lcnJvcl9vYmplY3RfY3JlYXRlX3NpemVkKGRldl9wcml2LAotCQkJCQkJCQkgICAgb2JqLAotCQkJCQkJCQkgICAgJmRldl9wcml2LT5ndHQuYmFzZSwKLQkJCQkJCQkJICAgIDEpOworCQkJZXJpbmctPmN0eCA9IGk5MTVfZXJyb3JfZ2d0dF9vYmplY3RfY3JlYXRlKGRldl9wcml2LCBvYmopOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC04OTIsNyArODg2LDcgQEAKIAlpbnQgaSwgY291bnQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykgewotCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CisJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CiAKIAkJaWYgKHJpbmctPmRldiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC05MzYsNyArOTMwLDcgQEAKIAkJfQogCiAJCWVycm9yLT5yaW5nW2ldLnJpbmdidWZmZXIgPQotCQkJaTkxNV9lcnJvcl9nZ3R0X29iamVjdF9jcmVhdGUoZGV2X3ByaXYsIHJpbmctPm9iaik7CisJCQlpOTE1X2Vycm9yX2dndHRfb2JqZWN0X2NyZWF0ZShkZXZfcHJpdiwgcmluZy0+YnVmZmVyLT5vYmopOwogCiAJCWlmIChyaW5nLT5zdGF0dXNfcGFnZS5vYmopCiAJCQllcnJvci0+cmluZ1tpXS5od3NfcGFnZSA9CkBAIC0xMDM3LDcgKzEwMzEsNiBAQAogCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9lcnJvcl9zdGF0ZSAqZXJyb3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0JaW50IHBpcGU7CiAKIAkvKiBHZW5lcmFsIG9yZ2FuaXphdGlvbgogCSAqIDEuIFJlZ2lzdGVycyBzcGVjaWZpYyB0byBhIHNpbmdsZSBnZW5lcmF0aW9uCkBAIC0xMDYyLDkgKzEwNTUsNiBAQAogCQllcnJvci0+Z2Z4X21vZGUgPSBJOTE1X1JFQUQoR0ZYX01PREUpOwogCX0KIAotCWlmIChJU19HRU4yKGRldikpCi0JCWVycm9yLT5pZXIgPSBJOTE1X1JFQUQxNihJRVIpOwotCiAJLyogMjogUmVnaXN0ZXJzIHdoaWNoIGJlbG9uZyB0byBtdWx0aXBsZSBnZW5lcmF0aW9ucyAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3KQogCQllcnJvci0+Zm9yY2V3YWtlID0gSTkxNV9SRUFEKEZPUkNFV0FLRV9NVCk7CkBAIC0xMDg4LDkgKzEwNzgsMTAgQEAKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQllcnJvci0+aWVyID0gSTkxNV9SRUFEKERFSUVSKSB8IEk5MTVfUkVBRChHVElFUik7CiAJZWxzZSB7Ci0JCWVycm9yLT5pZXIgPSBJOTE1X1JFQUQoSUVSKTsKLQkJZm9yX2VhY2hfcGlwZShwaXBlKQotCQkJZXJyb3ItPnBpcGVzdGF0W3BpcGVdID0gSTkxNV9SRUFEKFBJUEVTVEFUKHBpcGUpKTsKKwkJaWYgKElTX0dFTjIoZGV2KSkKKwkJCWVycm9yLT5pZXIgPSBJOTE1X1JFQUQxNihJRVIpOworCQllbHNlCisJCQllcnJvci0+aWVyID0gSTkxNV9SRUFEKElFUik7CiAJfQogCiAJLyogNDogRXZlcnl0aGluZyBlbHNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lvYzMyLmMKaW5kZXggM2M1OTU4NC4uMmUwNjEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaW9jMzIuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKIAkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOwogCi0JaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKGk5MTVfY29tcGF0X2lvY3RscykpCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIEFSUkFZX1NJWkUoaTkxNV9jb21wYXRfaW9jdGxzKSkKIAkJZm4gPSBpOTE1X2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKIAogCWlmIChmbiAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggMGI5OWRlOS4uNmY4MDE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC04MCwxNyArODAsNjQgQEAKIAlbSFBEX1BPUlRfRF0gPSBQT1JURF9IT1RQTFVHX0lOVF9TVEFUVVMKIH07CiAKKy8qIElJUiBjYW4gdGhlb3JldGljYWxseSBxdWV1ZSB1cCB0d28gZXZlbnRzLiBCZSBwYXJhbm9pZC4gKi8KKyNkZWZpbmUgR0VOOF9JUlFfUkVTRVRfTkRYKHR5cGUsIHdoaWNoKSBkbyB7IFwKKwlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSU1SKHdoaWNoKSwgMHhmZmZmZmZmZik7IFwKKwlQT1NUSU5HX1JFQUQoR0VOOF8jI3R5cGUjI19JTVIod2hpY2gpKTsgXAorCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JRVIod2hpY2gpLCAwKTsgXAorCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JSVIod2hpY2gpLCAweGZmZmZmZmZmKTsgXAorCVBPU1RJTkdfUkVBRChHRU44XyMjdHlwZSMjX0lJUih3aGljaCkpOyBcCisJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lJUih3aGljaCksIDB4ZmZmZmZmZmYpOyBcCisJUE9TVElOR19SRUFEKEdFTjhfIyN0eXBlIyNfSUlSKHdoaWNoKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VONV9JUlFfUkVTRVQodHlwZSkgZG8geyBcCisJSTkxNV9XUklURSh0eXBlIyNJTVIsIDB4ZmZmZmZmZmYpOyBcCisJUE9TVElOR19SRUFEKHR5cGUjI0lNUik7IFwKKwlJOTE1X1dSSVRFKHR5cGUjI0lFUiwgMCk7IFwKKwlJOTE1X1dSSVRFKHR5cGUjI0lJUiwgMHhmZmZmZmZmZik7IFwKKwlQT1NUSU5HX1JFQUQodHlwZSMjSUlSKTsgXAorCUk5MTVfV1JJVEUodHlwZSMjSUlSLCAweGZmZmZmZmZmKTsgXAorCVBPU1RJTkdfUkVBRCh0eXBlIyNJSVIpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogV2Ugc2hvdWxkIGNsZWFyIElNUiBhdCBwcmVpbnN0YWxsL3VuaW5zdGFsbCwgYW5kIGp1c3QgY2hlY2sgYXQgcG9zdGluc3RhbGwuCisgKi8KKyNkZWZpbmUgR0VONV9BU1NFUlRfSUlSX0lTX1pFUk8ocmVnKSBkbyB7IFwKKwl1MzIgdmFsID0gSTkxNV9SRUFEKHJlZyk7IFwKKwlpZiAodmFsKSB7IFwKKwkJV0FSTigxLCAiSW50ZXJydXB0IHJlZ2lzdGVyIDB4JXggaXMgbm90IHplcm86IDB4JTA4eFxuIiwgXAorCQkgICAgIChyZWcpLCB2YWwpOyBcCisJCUk5MTVfV1JJVEUoKHJlZyksIDB4ZmZmZmZmZmYpOyBcCisJCVBPU1RJTkdfUkVBRChyZWcpOyBcCisJCUk5MTVfV1JJVEUoKHJlZyksIDB4ZmZmZmZmZmYpOyBcCisJCVBPU1RJTkdfUkVBRChyZWcpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFTjhfSVJRX0lOSVRfTkRYKHR5cGUsIHdoaWNoLCBpbXJfdmFsLCBpZXJfdmFsKSBkbyB7IFwKKwlHRU41X0FTU0VSVF9JSVJfSVNfWkVSTyhHRU44XyMjdHlwZSMjX0lJUih3aGljaCkpOyBcCisJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lNUih3aGljaCksIChpbXJfdmFsKSk7IFwKKwlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUVSKHdoaWNoKSwgKGllcl92YWwpKTsgXAorCVBPU1RJTkdfUkVBRChHRU44XyMjdHlwZSMjX0lFUih3aGljaCkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFTjVfSVJRX0lOSVQodHlwZSwgaW1yX3ZhbCwgaWVyX3ZhbCkgZG8geyBcCisJR0VONV9BU1NFUlRfSUlSX0lTX1pFUk8odHlwZSMjSUlSKTsgXAorCUk5MTVfV1JJVEUodHlwZSMjSU1SLCAoaW1yX3ZhbCkpOyBcCisJSTkxNV9XUklURSh0eXBlIyNJRVIsIChpZXJfdmFsKSk7IFwKKwlQT1NUSU5HX1JFQUQodHlwZSMjSUVSKTsgXAorfSB3aGlsZSAoMCkKKwogLyogRm9yIGRpc3BsYXkgaG90cGx1ZyBpbnRlcnJ1cHQgKi8KIHN0YXRpYyB2b2lkCiBpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlpZiAoZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQpIHsKLQkJV0FSTigxLCAiSVJRcyBkaXNhYmxlZFxuIik7Ci0JCWRldl9wcml2LT5wbS5yZWdzYXZlLmRlaW1yICY9IH5tYXNrOworCWlmIChXQVJOX09OKGRldl9wcml2LT5wbS5pcnFzX2Rpc2FibGVkKSkKIAkJcmV0dXJuOwotCX0KIAogCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gMCkgewogCQlkZXZfcHJpdi0+aXJxX21hc2sgJj0gfm1hc2s7CkBAIC0xMDQsMTEgKzE1MSw4IEBACiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCi0JaWYgKGRldl9wcml2LT5wbS5pcnFzX2Rpc2FibGVkKSB7Ci0JCVdBUk4oMSwgIklSUXMgZGlzYWJsZWRcbiIpOwotCQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5kZWltciB8PSBtYXNrOworCWlmIChXQVJOX09OKGRldl9wcml2LT5wbS5pcnFzX2Rpc2FibGVkKSkKIAkJcmV0dXJuOwotCX0KIAogCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gbWFzaykgewogCQlkZXZfcHJpdi0+aXJxX21hc2sgfD0gbWFzazsKQEAgLTEyOSwxMyArMTczLDggQEAKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlpZiAoZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQpIHsKLQkJV0FSTigxLCAiSVJRcyBkaXNhYmxlZFxuIik7Ci0JCWRldl9wcml2LT5wbS5yZWdzYXZlLmd0aW1yICY9IH5pbnRlcnJ1cHRfbWFzazsKLQkJZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZ3RpbXIgfD0gKH5lbmFibGVkX2lycV9tYXNrICYKLQkJCQkJCWludGVycnVwdF9tYXNrKTsKKwlpZiAoV0FSTl9PTihkZXZfcHJpdi0+cG0uaXJxc19kaXNhYmxlZCkpCiAJCXJldHVybjsKLQl9CiAKIAlkZXZfcHJpdi0+Z3RfaXJxX21hc2sgJj0gfmludGVycnVwdF9tYXNrOwogCWRldl9wcml2LT5ndF9pcnFfbWFzayB8PSAofmVuYWJsZWRfaXJxX21hc2sgJiBpbnRlcnJ1cHRfbWFzayk7CkBAIC0xNjcsMTMgKzIwNiw4IEBACiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlpZiAoZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQpIHsKLQkJV0FSTigxLCAiSVJRcyBkaXNhYmxlZFxuIik7Ci0JCWRldl9wcml2LT5wbS5yZWdzYXZlLmdlbjZfcG1pbXIgJj0gfmludGVycnVwdF9tYXNrOwotCQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5nZW42X3BtaW1yIHw9ICh+ZW5hYmxlZF9pcnFfbWFzayAmCi0JCQkJCQkgICAgIGludGVycnVwdF9tYXNrKTsKKwlpZiAoV0FSTl9PTihkZXZfcHJpdi0+cG0uaXJxc19kaXNhYmxlZCkpCiAJCXJldHVybjsKLQl9CiAKIAluZXdfdmFsID0gZGV2X3ByaXYtPnBtX2lycV9tYXNrOwogCW5ld192YWwgJj0gfmludGVycnVwdF9tYXNrOwpAQCAtMjE0LDYgKzI0OCw0NiBAQAogCXJldHVybiB0cnVlOwogfQogCisvKioKKyAgKiBiZHdfdXBkYXRlX3BtX2lycSAtIHVwZGF0ZSBHVCBpbnRlcnJ1cHQgMgorICAqIEBkZXZfcHJpdjogZHJpdmVyIHByaXZhdGUKKyAgKiBAaW50ZXJydXB0X21hc2s6IG1hc2sgb2YgaW50ZXJydXB0IGJpdHMgdG8gdXBkYXRlCisgICogQGVuYWJsZWRfaXJxX21hc2s6IG1hc2sgb2YgaW50ZXJydXB0IGJpdHMgdG8gZW5hYmxlCisgICoKKyAgKiBDb3BpZWQgZnJvbSB0aGUgc25iIGZ1bmN0aW9uLCB1cGRhdGVkIHdpdGggcmVsZXZhbnQgcmVnaXN0ZXIgb2Zmc2V0cworICAqLworc3RhdGljIHZvaWQgYmR3X3VwZGF0ZV9wbV9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICAgdWludDMyX3QgaW50ZXJydXB0X21hc2ssCisJCQkgICAgICB1aW50MzJfdCBlbmFibGVkX2lycV9tYXNrKQoreworCXVpbnQzMl90IG5ld192YWw7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CisKKwlpZiAoV0FSTl9PTihkZXZfcHJpdi0+cG0uaXJxc19kaXNhYmxlZCkpCisJCXJldHVybjsKKworCW5ld192YWwgPSBkZXZfcHJpdi0+cG1faXJxX21hc2s7CisJbmV3X3ZhbCAmPSB+aW50ZXJydXB0X21hc2s7CisJbmV3X3ZhbCB8PSAofmVuYWJsZWRfaXJxX21hc2sgJiBpbnRlcnJ1cHRfbWFzayk7CisKKwlpZiAobmV3X3ZhbCAhPSBkZXZfcHJpdi0+cG1faXJxX21hc2spIHsKKwkJZGV2X3ByaXYtPnBtX2lycV9tYXNrID0gbmV3X3ZhbDsKKwkJSTkxNV9XUklURShHRU44X0dUX0lNUigyKSwgZGV2X3ByaXYtPnBtX2lycV9tYXNrKTsKKwkJUE9TVElOR19SRUFEKEdFTjhfR1RfSU1SKDIpKTsKKwl9Cit9CisKK3ZvaWQgYmR3X2VuYWJsZV9wbV9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCBtYXNrKQoreworCWJkd191cGRhdGVfcG1faXJxKGRldl9wcml2LCBtYXNrLCBtYXNrKTsKK30KKwordm9pZCBiZHdfZGlzYWJsZV9wbV9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCBtYXNrKQoreworCWJkd191cGRhdGVfcG1faXJxKGRldl9wcml2LCBtYXNrLCAwKTsKK30KKwogc3RhdGljIGJvb2wgY3B0X2Nhbl9lbmFibGVfc2Vycl9pbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjMyLDE2ICszMDYsNTEgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgaTl4eF9jbGVhcl9maWZvX3VuZGVycnVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQordm9pZCBpOXh4X2NoZWNrX2ZpZm9fdW5kZXJydW5zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgZmxhZ3MpOworCisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKKwkJdTMyIHJlZyA9IFBJUEVTVEFUKGNydGMtPnBpcGUpOworCQl1MzIgcGlwZXN0YXQ7CisKKwkJaWYgKGNydGMtPmNwdV9maWZvX3VuZGVycnVuX2Rpc2FibGVkKQorCQkJY29udGludWU7CisKKwkJcGlwZXN0YXQgPSBJOTE1X1JFQUQocmVnKSAmIDB4ZmZmZjAwMDA7CisJCWlmICgocGlwZXN0YXQgJiBQSVBFX0ZJRk9fVU5ERVJSVU5fU1RBVFVTKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJSTkxNV9XUklURShyZWcsIHBpcGVzdGF0IHwgUElQRV9GSUZPX1VOREVSUlVOX1NUQVRVUyk7CisJCVBPU1RJTkdfUkVBRChyZWcpOworCisJCURSTV9FUlJPUigicGlwZSAlYyB1bmRlcnJ1blxuIiwgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaTl4eF9zZXRfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBlbnVtIHBpcGUgcGlwZSwKKwkJCQkJICAgICBib29sIGVuYWJsZSwgYm9vbCBvbGQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcmVnID0gUElQRVNUQVQocGlwZSk7Ci0JdTMyIHBpcGVzdGF0ID0gSTkxNV9SRUFEKHJlZykgJiAweDdmZmYwMDAwOworCXUzMiBwaXBlc3RhdCA9IEk5MTVfUkVBRChyZWcpICYgMHhmZmZmMDAwMDsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAotCUk5MTVfV1JJVEUocmVnLCBwaXBlc3RhdCB8IFBJUEVfRklGT19VTkRFUlJVTl9TVEFUVVMpOwotCVBPU1RJTkdfUkVBRChyZWcpOworCWlmIChlbmFibGUpIHsKKwkJSTkxNV9XUklURShyZWcsIHBpcGVzdGF0IHwgUElQRV9GSUZPX1VOREVSUlVOX1NUQVRVUyk7CisJCVBPU1RJTkdfUkVBRChyZWcpOworCX0gZWxzZSB7CisJCWlmIChvbGQgJiYgcGlwZXN0YXQgJiBQSVBFX0ZJRk9fVU5ERVJSVU5fU1RBVFVTKQorCQkJRFJNX0VSUk9SKCJwaXBlICVjIHVuZGVycnVuXG4iLCBwaXBlX25hbWUocGlwZSkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgaXJvbmxha2Vfc2V0X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCkBAIC0yNTgsNyArMzY3LDggQEAKIH0KIAogc3RhdGljIHZvaWQgaXZ5YnJpZGdlX3NldF9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCQkJICBlbnVtIHBpcGUgcGlwZSwgYm9vbCBlbmFibGUpCisJCQkJCQkgIGVudW0gcGlwZSBwaXBlLAorCQkJCQkJICBib29sIGVuYWJsZSwgYm9vbCBvbGQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoZW5hYmxlKSB7CkBAIC0yNjksMTUgKzM3OSwxMiBAQAogCiAJCWlyb25sYWtlX2VuYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgREVfRVJSX0lOVF9JVkIpOwogCX0gZWxzZSB7Ci0JCWJvb2wgd2FzX2VuYWJsZWQgPSAhKEk5MTVfUkVBRChERUlNUikgJiBERV9FUlJfSU5UX0lWQik7Ci0KLQkJLyogQ2hhbmdlIHRoZSBzdGF0ZSBfYWZ0ZXJfIHdlJ3ZlIHJlYWQgb3V0IHRoZSBjdXJyZW50IG9uZS4gKi8KIAkJaXJvbmxha2VfZGlzYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgREVfRVJSX0lOVF9JVkIpOwogCi0JCWlmICghd2FzX2VuYWJsZWQgJiYKLQkJICAgIChJOTE1X1JFQUQoR0VON19FUlJfSU5UKSAmIEVSUl9JTlRfRklGT19VTkRFUlJVTihwaXBlKSkpIHsKLQkJCURSTV9ERUJVR19LTVMoInVuY2xlYXJlZCBmaWZvIHVuZGVycnVuIG9uIHBpcGUgJWNcbiIsCi0JCQkJICAgICAgcGlwZV9uYW1lKHBpcGUpKTsKKwkJaWYgKG9sZCAmJgorCQkgICAgSTkxNV9SRUFEKEdFTjdfRVJSX0lOVCkgJiBFUlJfSU5UX0ZJRk9fVU5ERVJSVU4ocGlwZSkpIHsKKwkJCURSTV9FUlJPUigidW5jbGVhcmVkIGZpZm8gdW5kZXJydW4gb24gcGlwZSAlY1xuIiwKKwkJCQkgIHBpcGVfbmFtZShwaXBlKSk7CiAJCX0KIAl9CiB9CkBAIC0zMTMsMTQgKzQyMCw4IEBACiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlpZiAoZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQgJiYKLQkgICAgKGludGVycnVwdF9tYXNrICYgU0RFX0hPVFBMVUdfTUFTS19DUFQpKSB7Ci0JCVdBUk4oMSwgIklSUXMgZGlzYWJsZWRcbiIpOwotCQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5zZGVpbXIgJj0gfmludGVycnVwdF9tYXNrOwotCQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5zZGVpbXIgfD0gKH5lbmFibGVkX2lycV9tYXNrICYKLQkJCQkJCSBpbnRlcnJ1cHRfbWFzayk7CisJaWYgKFdBUk5fT04oZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQpKQogCQlyZXR1cm47Ci0JfQogCiAJSTkxNV9XUklURShTREVJTVIsIHNkZWltcik7CiAJUE9TVElOR19SRUFEKFNERUlNUik7CkBAIC0zNDYsNyArNDQ3LDcgQEAKIAogc3RhdGljIHZvaWQgY3B0X3NldF9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgZW51bSB0cmFuc2NvZGVyIHBjaF90cmFuc2NvZGVyLAotCQkJCQkgICAgYm9vbCBlbmFibGUpCisJCQkJCSAgICBib29sIGVuYWJsZSwgYm9vbCBvbGQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMzU5LDE2ICs0NjAsMTIgQEAKIAogCQlpYnhfZW5hYmxlX2Rpc3BsYXlfaW50ZXJydXB0KGRldl9wcml2LCBTREVfRVJST1JfQ1BUKTsKIAl9IGVsc2UgewotCQl1aW50MzJfdCB0bXAgPSBJOTE1X1JFQUQoU0VSUl9JTlQpOwotCQlib29sIHdhc19lbmFibGVkID0gIShJOTE1X1JFQUQoU0RFSU1SKSAmIFNERV9FUlJPUl9DUFQpOwotCi0JCS8qIENoYW5nZSB0aGUgc3RhdGUgX2FmdGVyXyB3ZSd2ZSByZWFkIG91dCB0aGUgY3VycmVudCBvbmUuICovCiAJCWlieF9kaXNhYmxlX2Rpc3BsYXlfaW50ZXJydXB0KGRldl9wcml2LCBTREVfRVJST1JfQ1BUKTsKIAotCQlpZiAoIXdhc19lbmFibGVkICYmCi0JCSAgICAodG1wICYgU0VSUl9JTlRfVFJBTlNfRklGT19VTkRFUlJVTihwY2hfdHJhbnNjb2RlcikpKSB7Ci0JCQlEUk1fREVCVUdfS01TKCJ1bmNsZWFyZWQgcGNoIGZpZm8gdW5kZXJydW4gb24gcGNoIHRyYW5zY29kZXIgJWNcbiIsCi0JCQkJICAgICAgdHJhbnNjb2Rlcl9uYW1lKHBjaF90cmFuc2NvZGVyKSk7CisJCWlmIChvbGQgJiYgSTkxNV9SRUFEKFNFUlJfSU5UKSAmCisJCSAgICBTRVJSX0lOVF9UUkFOU19GSUZPX1VOREVSUlVOKHBjaF90cmFuc2NvZGVyKSkgeworCQkJRFJNX0VSUk9SKCJ1bmNsZWFyZWQgcGNoIGZpZm8gdW5kZXJydW4gb24gcGNoIHRyYW5zY29kZXIgJWNcbiIsCisJCQkJICB0cmFuc2NvZGVyX25hbWUocGNoX3RyYW5zY29kZXIpKTsKIAkJfQogCX0KIH0KQEAgLTM4NywzNCArNDg0LDI5IEBACiAgKgogICogUmV0dXJucyB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdW5kZXJydW4gcmVwb3J0aW5nLgogICovCi1ib29sIF9faW50ZWxfc2V0X2NwdV9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCQkgICAgIGVudW0gcGlwZSBwaXBlLCBib29sIGVuYWJsZSkKK3N0YXRpYyBib29sIF9faW50ZWxfc2V0X2NwdV9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJICAgIGVudW0gcGlwZSBwaXBlLCBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5waXBlX3RvX2NydGNfbWFwcGluZ1twaXBlXTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0JYm9vbCByZXQ7CisJYm9vbCBvbGQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlyZXQgPSAhaW50ZWxfY3J0Yy0+Y3B1X2ZpZm9fdW5kZXJydW5fZGlzYWJsZWQ7Ci0KLQlpZiAoZW5hYmxlID09IHJldCkKLQkJZ290byBkb25lOwotCisJb2xkID0gIWludGVsX2NydGMtPmNwdV9maWZvX3VuZGVycnVuX2Rpc2FibGVkOwogCWludGVsX2NydGMtPmNwdV9maWZvX3VuZGVycnVuX2Rpc2FibGVkID0gIWVuYWJsZTsKIAotCWlmIChlbmFibGUgJiYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNSB8fCBJU19WQUxMRVlWSUVXKGRldikpKQotCQlpOXh4X2NsZWFyX2ZpZm9fdW5kZXJydW4oZGV2LCBwaXBlKTsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1IHx8IElTX1ZBTExFWVZJRVcoZGV2KSkKKwkJaTl4eF9zZXRfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBlbmFibGUsIG9sZCk7CiAJZWxzZSBpZiAoSVNfR0VONShkZXYpIHx8IElTX0dFTjYoZGV2KSkKIAkJaXJvbmxha2Vfc2V0X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgZW5hYmxlKTsKIAllbHNlIGlmIChJU19HRU43KGRldikpCi0JCWl2eWJyaWRnZV9zZXRfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBlbmFibGUpOworCQlpdnlicmlkZ2Vfc2V0X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgZW5hYmxlLCBvbGQpOwogCWVsc2UgaWYgKElTX0dFTjgoZGV2KSkKIAkJYnJvYWR3ZWxsX3NldF9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhkZXYsIHBpcGUsIGVuYWJsZSk7CiAKLWRvbmU6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb2xkOwogfQogCiBib29sIGludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTQ2Myw3ICs1NTUsNyBAQAogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5waXBlX3RvX2NydGNfbWFwcGluZ1twY2hfdHJhbnNjb2Rlcl07CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYm9vbCByZXQ7CisJYm9vbCBvbGQ7CiAKIAkvKgogCSAqIE5PVEU6IFByZS1MUFQgaGFzIGEgZml4ZWQgY3B1IHBpcGUgLT4gcGNoIHRyYW5zY29kZXIgbWFwcGluZywgYnV0IExQVApAQCAtNDc2LDIxICs1NjgsMTYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKIAotCXJldCA9ICFpbnRlbF9jcnRjLT5wY2hfZmlmb191bmRlcnJ1bl9kaXNhYmxlZDsKLQotCWlmIChlbmFibGUgPT0gcmV0KQotCQlnb3RvIGRvbmU7Ci0KKwlvbGQgPSAhaW50ZWxfY3J0Yy0+cGNoX2ZpZm9fdW5kZXJydW5fZGlzYWJsZWQ7CiAJaW50ZWxfY3J0Yy0+cGNoX2ZpZm9fdW5kZXJydW5fZGlzYWJsZWQgPSAhZW5hYmxlOwogCiAJaWYgKEhBU19QQ0hfSUJYKGRldikpCiAJCWlieF9zZXRfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwY2hfdHJhbnNjb2RlciwgZW5hYmxlKTsKIAllbHNlCi0JCWNwdF9zZXRfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwY2hfdHJhbnNjb2RlciwgZW5hYmxlKTsKKwkJY3B0X3NldF9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhkZXYsIHBjaF90cmFuc2NvZGVyLCBlbmFibGUsIG9sZCk7CiAKLWRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb2xkOwogfQogCiAKQEAgLTUwMyw4ICs1OTAsMTAgQEAKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAotCWlmIChXQVJOX09OX09OQ0UoZW5hYmxlX21hc2sgJiB+UElQRVNUQVRfSU5UX0VOQUJMRV9NQVNLIHx8Ci0JICAgICAgICAgICAgICAgICBzdGF0dXNfbWFzayAmIH5QSVBFU1RBVF9JTlRfU1RBVFVTX01BU0spKQorCWlmIChXQVJOX09OQ0UoZW5hYmxlX21hc2sgJiB+UElQRVNUQVRfSU5UX0VOQUJMRV9NQVNLIHx8CisJCSAgICAgIHN0YXR1c19tYXNrICYgflBJUEVTVEFUX0lOVF9TVEFUVVNfTUFTSywKKwkJICAgICAgInBpcGUgJWM6IGVuYWJsZV9tYXNrPTB4JXgsIHN0YXR1c19tYXNrPTB4JXhcbiIsCisJCSAgICAgIHBpcGVfbmFtZShwaXBlKSwgZW5hYmxlX21hc2ssIHN0YXR1c19tYXNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKChwaXBlc3RhdCAmIGVuYWJsZV9tYXNrKSA9PSBlbmFibGVfbWFzaykKQEAgLTUyNyw4ICs2MTYsMTAgQEAKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAotCWlmIChXQVJOX09OX09OQ0UoZW5hYmxlX21hc2sgJiB+UElQRVNUQVRfSU5UX0VOQUJMRV9NQVNLIHx8Ci0JICAgICAgICAgICAgICAgICBzdGF0dXNfbWFzayAmIH5QSVBFU1RBVF9JTlRfU1RBVFVTX01BU0spKQorCWlmIChXQVJOX09OQ0UoZW5hYmxlX21hc2sgJiB+UElQRVNUQVRfSU5UX0VOQUJMRV9NQVNLIHx8CisJCSAgICAgIHN0YXR1c19tYXNrICYgflBJUEVTVEFUX0lOVF9TVEFUVVNfTUFTSywKKwkJICAgICAgInBpcGUgJWM6IGVuYWJsZV9tYXNrPTB4JXgsIHN0YXR1c19tYXNrPTB4JXhcbiIsCisJCSAgICAgIHBpcGVfbmFtZShwaXBlKSwgZW5hYmxlX21hc2ssIHN0YXR1c19tYXNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKChwaXBlc3RhdCAmIGVuYWJsZV9tYXNrKSA9PSAwKQpAQCAtNTQ2LDExICs2MzcsMTcgQEAKIAl1MzIgZW5hYmxlX21hc2sgPSBzdGF0dXNfbWFzayA8PCAxNjsKIAogCS8qCi0JICogT24gcGlwZSBBIHdlIGRvbid0IHN1cHBvcnQgdGhlIFBTUiBpbnRlcnJ1cHQgeWV0LCBvbiBwaXBlIEIgdGhlCi0JICogc2FtZSBiaXQgTUJaLgorCSAqIE9uIHBpcGUgQSB3ZSBkb24ndCBzdXBwb3J0IHRoZSBQU1IgaW50ZXJydXB0IHlldCwKKwkgKiBvbiBwaXBlIEIgYW5kIEMgdGhlIHNhbWUgYml0IE1CWi4KIAkgKi8KIAlpZiAoV0FSTl9PTl9PTkNFKHN0YXR1c19tYXNrICYgUElQRV9BX1BTUl9TVEFUVVNfVkxWKSkKIAkJcmV0dXJuIDA7CisJLyoKKwkgKiBPbiBwaXBlIEIgYW5kIEMgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgUFNSIGludGVycnVwdCB5ZXQsIG9uIHBpcGUKKwkgKiBBIHRoZSBzYW1lIGJpdCBpcyBmb3IgcGVyZiBjb3VudGVycyB3aGljaCB3ZSBkb24ndCB1c2UgZWl0aGVyLgorCSAqLworCWlmIChXQVJOX09OX09OQ0Uoc3RhdHVzX21hc2sgJiBQSVBFX0JfUFNSX1NUQVRVU19WTFYpKQorCQlyZXR1cm4gMDsKIAogCWVuYWJsZV9tYXNrICY9IH4oUElQRV9GSUZPX1VOREVSUlVOX1NUQVRVUyB8CiAJCQkgU1BSSVRFMF9GTElQX0RPTkVfSU5UX0VOX1ZMViB8CkBAIC02MzcsNiArNzM0LDU2IEBACiAJfQogfQogCisvKgorICogVGhpcyB0aW1pbmcgZGlhZ3JhbSBkZXBpY3RzIHRoZSB2aWRlbyBzaWduYWwgaW4gYW5kCisgKiBhcm91bmQgdGhlIHZlcnRpY2FsIGJsYW5raW5nIHBlcmlvZC4KKyAqCisgKiBBc3N1bXB0aW9ucyBhYm91dCB0aGUgZmljdGl0aW91cyBtb2RlIHVzZWQgaW4gdGhpcyBleGFtcGxlOgorICogIHZibGFua19zdGFydCA+PSAzCisgKiAgdnN5bmNfc3RhcnQgPSB2Ymxhbmtfc3RhcnQgKyAxCisgKiAgdnN5bmNfZW5kID0gdmJsYW5rX3N0YXJ0ICsgMgorICogIHZ0b3RhbCA9IHZibGFua19zdGFydCArIDMKKyAqCisgKiAgICAgICAgICAgc3RhcnQgb2YgdmJsYW5rOgorICogICAgICAgICAgIGxhdGNoIGRvdWJsZSBidWZmZXJlZCByZWdpc3RlcnMKKyAqICAgICAgICAgICBpbmNyZW1lbnQgZnJhbWUgY291bnRlciAoY3RnKykKKyAqICAgICAgICAgICBnZW5lcmF0ZSBzdGFydCBvZiB2YmxhbmsgaW50ZXJydXB0IChnZW40KykKKyAqICAgICAgICAgICB8CisgKiAgICAgICAgICAgfCAgICAgICAgICBmcmFtZSBzdGFydDoKKyAqICAgICAgICAgICB8ICAgICAgICAgIGdlbmVyYXRlIGZyYW1lIHN0YXJ0IGludGVycnVwdCAoYWthLiB2YmxhbmsgaW50ZXJydXB0KSAoZ21jaCkKKyAqICAgICAgICAgICB8ICAgICAgICAgIG1heSBiZSBzaGlmdGVkIGZvcndhcmQgMS0zIGV4dHJhIGxpbmVzIHZpYSBQSVBFQ09ORgorICogICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgIHwgICAgICAgICAgfCAgc3RhcnQgb2YgdnN5bmM6CisgKiAgICAgICAgICAgfCAgICAgICAgICB8ICBnZW5lcmF0ZSB2c3luYyBpbnRlcnJ1cHQKKyAqICAgICAgICAgICB8ICAgICAgICAgIHwgIHwKKyAqIF9fX3h4eHhfX18gICAgX19feHh4eF9fXyAgICBfX194eHh4X19fICAgIF9fX3h4eHhfX18gICAgX19feHh4eF9fXyAgICBfX194eHh4CisgKiAgICAgICAuICAgXGhzLyAgIC4gICAgICBcaHMvICAgICAgICAgIFxocy8gICAgICAgICAgXGhzLyAgIC4gICAgICBcaHMvCisgKiAtLS0tdmEtLS0+IDwtLS0tLS0tLS0tLS0tLS0tLXZiLS0tLS0tLS0tLS0tLS0tLS0tLS0+IDwtLS0tLS0tLXZhLS0tLS0tLS0tLS0tLQorICogICAgICAgfCAgICAgICAgICB8ICAgICAgIDwtLS0tdnMtLS0tLT4gICAgICAgICAgICAgICAgICAgICB8CisgKiAtdmJzLS0tLS0+IDwtLS12YnMrMS0tLT4gPC0tLXZicysyLS0tPiA8LS0tLS0wLS0tLS0+IDwtLS0tLTEtLS0tLT4gPC0tLS0tMi0tLSAoc2NhbmxpbmUgY291bnRlciBnZW4yKQorICogLXZicy0yLS0tPiA8LS0tdmJzLTEtLS0+IDwtLS12YnMtLS0tLT4gPC0tLXZicysxLS0tPiA8LS0tdmJzKzItLS0+IDwtLS0tLTAtLS0gKHNjYW5saW5lIGNvdW50ZXIgZ2VuMyspCisgKiAtdmJzLTItLS0+IDwtLS12YnMtMi0tLT4gPC0tLXZicy0xLS0tPiA8LS0tdmJzLS0tLS0+IDwtLS12YnMrMS0tLT4gPC0tLXZicysyLSAoc2NhbmxpbmUgY291bnRlciBoc3crIGhkbWkpCisgKiAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgIGxhc3QgdmlzaWJsZSBwaXhlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdmlzaWJsZSBwaXhlbAorICogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQgZnJhbWUgY291bnRlciAoZ2VuMy80KQorICogICAgICAgICAgICAgICAgICBwaXhlbCBjb3VudGVyID0gdmJsYW5rX3N0YXJ0ICogaHRvdGFsICAgICBwaXhlbCBjb3VudGVyID0gMCAoZ2VuMy80KQorICoKKyAqIHggID0gaG9yaXpvbnRhbCBhY3RpdmUKKyAqIF8gID0gaG9yaXpvbnRhbCBibGFua2luZworICogaHMgPSBob3Jpem9udGFsIHN5bmMKKyAqIHZhID0gdmVydGljYWwgYWN0aXZlCisgKiB2YiA9IHZlcnRpY2FsIGJsYW5raW5nCisgKiB2cyA9IHZlcnRpY2FsIHN5bmMKKyAqIHZicyA9IHZibGFua19zdGFydCAobnVtYmVyKQorICoKKyAqIFN1bW1hcnk6CisgKiAtIG1vc3QgZXZlbnRzIGhhcHBlbiBhdCB0aGUgc3RhcnQgb2YgaG9yaXpvbnRhbCBzeW5jCisgKiAtIGZyYW1lIHN0YXJ0IGhhcHBlbnMgYXQgdGhlIHN0YXJ0IG9mIGhvcml6b250YWwgYmxhbmssIDEtNCBsaW5lcworICogICAoZGVwZW5kaW5nIG9uIFBJUEVDT05GIHNldHRpbmdzKSBhZnRlciB0aGUgc3RhcnQgb2YgdmJsYW5rCisgKiAtIGdlbjMvNCBwaXhlbCBhbmQgZnJhbWUgY291bnRlciBhcmUgc3luY2hyb25pemVkIHdpdGggdGhlIHN0YXJ0CisgKiAgIG9mIGhvcml6b250YWwgYWN0aXZlIG9uIHRoZSBmaXJzdCBsaW5lIG9mIHZlcnRpY2FsIGFjdGl2ZQorICovCisKIHN0YXRpYyB1MzIgaTh4eF9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJLyogR2VuMiBkb2Vzbid0IGhhdmUgYSBoYXJkd2FyZSBmcmFtZSBjb3VudGVyICovCkBAIC02NTEsNyArNzk4LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaGlnaF9mcmFtZTsKIAl1bnNpZ25lZCBsb25nIGxvd19mcmFtZTsKLQl1MzIgaGlnaDEsIGhpZ2gyLCBsb3csIHBpeGVsLCB2Ymxfc3RhcnQ7CisJdTMyIGhpZ2gxLCBoaWdoMiwgbG93LCBwaXhlbCwgdmJsX3N0YXJ0LCBoc3luY19zdGFydCwgaHRvdGFsOwogCiAJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKSB7CiAJCURSTV9ERUJVR19EUklWRVIoInRyeWluZyB0byBnZXQgdmJsYW5rIGNvdW50IGZvciBkaXNhYmxlZCAiCkBAIC02NjUsMTcgKzgxMiwyOCBAQAogCQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9CiAJCQkmaW50ZWxfY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGU7CiAKLQkJdmJsX3N0YXJ0ID0gbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgKiBtb2RlLT5jcnRjX2h0b3RhbDsKKwkJaHRvdGFsID0gbW9kZS0+Y3J0Y19odG90YWw7CisJCWhzeW5jX3N0YXJ0ID0gbW9kZS0+Y3J0Y19oc3luY19zdGFydDsKKwkJdmJsX3N0YXJ0ID0gbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQ7CisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQkJdmJsX3N0YXJ0ID0gRElWX1JPVU5EX1VQKHZibF9zdGFydCwgMik7CiAJfSBlbHNlIHsKIAkJZW51bSB0cmFuc2NvZGVyIGNwdV90cmFuc2NvZGVyID0gKGVudW0gdHJhbnNjb2RlcikgcGlwZTsKLQkJdTMyIGh0b3RhbDsKIAogCQlodG90YWwgPSAoKEk5MTVfUkVBRChIVE9UQUwoY3B1X3RyYW5zY29kZXIpKSA+PiAxNikgJiAweDFmZmYpICsgMTsKKwkJaHN5bmNfc3RhcnQgPSAoSTkxNV9SRUFEKEhTWU5DKGNwdV90cmFuc2NvZGVyKSkgICYgMHgxZmZmKSArIDE7CiAJCXZibF9zdGFydCA9IChJOTE1X1JFQUQoVkJMQU5LKGNwdV90cmFuc2NvZGVyKSkgJiAweDFmZmYpICsgMTsKLQotCQl2Ymxfc3RhcnQgKj0gaHRvdGFsOworCQlpZiAoKEk5MTVfUkVBRChQSVBFQ09ORihjcHVfdHJhbnNjb2RlcikpICYKKwkJICAgICBQSVBFQ09ORl9JTlRFUkxBQ0VfTUFTSykgIT0gUElQRUNPTkZfUFJPR1JFU1NJVkUpCisJCQl2Ymxfc3RhcnQgPSBESVZfUk9VTkRfVVAodmJsX3N0YXJ0LCAyKTsKIAl9CiAKKwkvKiBDb252ZXJ0IHRvIHBpeGVsIGNvdW50ICovCisJdmJsX3N0YXJ0ICo9IGh0b3RhbDsKKworCS8qIFN0YXJ0IG9mIHZibGFuayBldmVudCBvY2N1cnMgYXQgc3RhcnQgb2YgaHN5bmMgKi8KKwl2Ymxfc3RhcnQgLT0gaHRvdGFsIC0gaHN5bmNfc3RhcnQ7CisKIAloaWdoX2ZyYW1lID0gUElQRUZSQU1FKHBpcGUpOwogCWxvd19mcmFtZSA9IFBJUEVGUkFNRVBJWEVMKHBpcGUpOwogCkBAIC03MTksMjQgKzg3NywyOCBAQAogLyogcmF3IHJlYWRzLCBvbmx5IGZvciBmYXN0IHJlYWRzIG9mIGRpc3BsYXkgYmxvY2ssIG5vIG5lZWQgZm9yIGZvcmNld2FrZSBldGMuICovCiAjZGVmaW5lIF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2X18sIHJlZ19fKSByZWFkbCgoZGV2X3ByaXZfXyktPnJlZ3MgKyAocmVnX18pKQogCi1zdGF0aWMgYm9vbCBpbGtfcGlwZV9pbl92YmxhbmtfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQorc3RhdGljIGludCBfX2ludGVsX2dldF9jcnRjX3NjYW5saW5lKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHN0YXR1czsKLQlpbnQgcmVnOworCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJmNydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlOworCWVudW0gcGlwZSBwaXBlID0gY3J0Yy0+cGlwZTsKKwlpbnQgcG9zaXRpb24sIHZ0b3RhbDsKIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KSB7Ci0JCXN0YXR1cyA9IEdFTjhfUElQRV9WQkxBTks7Ci0JCXJlZyA9IEdFTjhfREVfUElQRV9JU1IocGlwZSk7Ci0JfSBlbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3KSB7Ci0JCXN0YXR1cyA9IERFX1BJUEVfVkJMQU5LX0lWQihwaXBlKTsKLQkJcmVnID0gREVJU1I7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gREVfUElQRV9WQkxBTksocGlwZSk7Ci0JCXJlZyA9IERFSVNSOwotCX0KKwl2dG90YWwgPSBtb2RlLT5jcnRjX3Z0b3RhbDsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJdnRvdGFsIC89IDI7CiAKLQlyZXR1cm4gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIHJlZykgJiBzdGF0dXM7CisJaWYgKElTX0dFTjIoZGV2KSkKKwkJcG9zaXRpb24gPSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgUElQRURTTChwaXBlKSkgJiBEU0xfTElORU1BU0tfR0VOMjsKKwllbHNlCisJCXBvc2l0aW9uID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIFBJUEVEU0wocGlwZSkpICYgRFNMX0xJTkVNQVNLX0dFTjM7CisKKwkvKgorCSAqIFNlZSB1cGRhdGVfc2NhbmxpbmVfb2Zmc2V0KCkgZm9yIHRoZSBkZXRhaWxzIG9uIHRoZQorCSAqIHNjYW5saW5lX29mZnNldCBhZGp1c3RtZW50LgorCSAqLworCXJldHVybiAocG9zaXRpb24gKyBjcnRjLT5zY2FubGluZV9vZmZzZXQpICUgdnRvdGFsOwogfQogCiBzdGF0aWMgaW50IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSwKQEAgLTc0OCw3ICs5MTAsNyBAQAogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZpbnRlbF9jcnRjLT5jb25maWcuYWRqdXN0ZWRfbW9kZTsKIAlpbnQgcG9zaXRpb247Ci0JaW50IHZibF9zdGFydCwgdmJsX2VuZCwgaHRvdGFsLCB2dG90YWw7CisJaW50IHZibF9zdGFydCwgdmJsX2VuZCwgaHN5bmNfc3RhcnQsIGh0b3RhbCwgdnRvdGFsOwogCWJvb2wgaW5fdmJsID0gdHJ1ZTsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtNzYwLDYgKzkyMiw3IEBACiAJfQogCiAJaHRvdGFsID0gbW9kZS0+Y3J0Y19odG90YWw7CisJaHN5bmNfc3RhcnQgPSBtb2RlLT5jcnRjX2hzeW5jX3N0YXJ0OwogCXZ0b3RhbCA9IG1vZGUtPmNydGNfdnRvdGFsOwogCXZibF9zdGFydCA9IG1vZGUtPmNydGNfdmJsYW5rX3N0YXJ0OwogCXZibF9lbmQgPSBtb2RlLT5jcnRjX3ZibGFua19lbmQ7CkBAIC03NzgsNyArOTQxLDcgQEAKIAkgKiBmb2xsb3dpbmcgY29kZSBtdXN0IG5vdCBibG9jayBvbiB1bmNvcmUubG9jay4KIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncyk7Ci0JCisKIAkvKiBwcmVlbXB0X2Rpc2FibGVfcnQoKSBzaG91bGQgZ28gcmlnaHQgaGVyZSBpbiBQUkVFTVBUX1JUIHBhdGNoc2V0LiAqLwogCiAJLyogR2V0IG9wdGlvbmFsIHN5c3RlbSB0aW1lc3RhbXAgYmVmb3JlIHF1ZXJ5LiAqLwpAQCAtNzg5LDY4ICs5NTIsNyBAQAogCQkvKiBObyBvYnZpb3VzIHBpeGVsY291bnQgcmVnaXN0ZXIuIE9ubHkgcXVlcnkgdmVydGljYWwKIAkJICogc2Nhbm91dCBwb3NpdGlvbiBmcm9tIERpc3BsYXkgc2NhbiBsaW5lIHJlZ2lzdGVyLgogCQkgKi8KLQkJaWYgKElTX0dFTjIoZGV2KSkKLQkJCXBvc2l0aW9uID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIFBJUEVEU0wocGlwZSkpICYgRFNMX0xJTkVNQVNLX0dFTjI7Ci0JCWVsc2UKLQkJCXBvc2l0aW9uID0gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIFBJUEVEU0wocGlwZSkpICYgRFNMX0xJTkVNQVNLX0dFTjM7Ci0KLQkJaWYgKEhBU19EREkoZGV2KSkgewotCQkJLyoKLQkJCSAqIE9uIEhTVyBIRE1JIG91dHB1dHMgdGhlcmUgc2VlbXMgdG8gYmUgYSAyIGxpbmUKLQkJCSAqIGRpZmZlcmVuY2UsIHdoZXJlYXMgZURQIGhhcyB0aGUgbm9ybWFsIDEgbGluZQotCQkJICogZGlmZmVyZW5jZSB0aGF0IGVhcmxpZXIgcGxhdGZvcm1zIGhhdmUuIEV4dGVybmFsCi0JCQkgKiBEUCBpcyB1bmtub3duLiBGb3Igbm93IGp1c3QgY2hlY2sgZm9yIHRoZSAyIGxpbmUKLQkJCSAqIGRpZmZlcmVuY2UgY2FzZSBvbiBhbGwgb3V0cHV0IHR5cGVzIG9uIEhTVysuCi0JCQkgKgotCQkJICogVGhpcyBtaWdodCBtaXNpbnRlcnByZXQgdGhlIHNjYW5saW5lIGNvdW50ZXIgYmVpbmcKLQkJCSAqIG9uZSBsaW5lIHRvbyBmYXIgYWxvbmcgb24gZURQLCBidXQgdGhhdCdzIGxlc3MKLQkJCSAqIGRhbmdlcm91cyB0aGFuIHRoZSBhbHRlcm5hdGl2ZSBzaW5jZSB0aGF0IHdvdWxkIGxlYWQKLQkJCSAqIHRoZSB2YmxhbmsgdGltZXN0YW1wIGNvZGUgYXN0cmF5IHdoZW4gaXQgc2VlcyBhCi0JCQkgKiBzY2FubGluZSBjb3VudCBiZWZvcmUgdmJsYW5rX3N0YXJ0IGR1cmluZyBhIHZibGFuawotCQkJICogaW50ZXJydXB0LgotCQkJICovCi0JCQlpbl92YmwgPSBpbGtfcGlwZV9pbl92YmxhbmtfbG9ja2VkKGRldiwgcGlwZSk7Ci0JCQlpZiAoKGluX3ZibCAmJiAocG9zaXRpb24gPT0gdmJsX3N0YXJ0IC0gMiB8fAotCQkJCQlwb3NpdGlvbiA9PSB2Ymxfc3RhcnQgLSAxKSkgfHwKLQkJCSAgICAoIWluX3ZibCAmJiAocG9zaXRpb24gPT0gdmJsX2VuZCAtIDIgfHwKLQkJCQkJIHBvc2l0aW9uID09IHZibF9lbmQgLSAxKSkpCi0JCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyAyKSAlIHZ0b3RhbDsKLQkJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJCS8qCi0JCQkgKiBUaGUgc2NhbmxpbmUgY291bnRlciBpbmNyZW1lbnRzIGF0IHRoZSBsZWFkaW5nIGVkZ2UKLQkJCSAqIG9mIGhzeW5jLCBpZS4gaXQgY29tcGxldGVseSBtaXNzZXMgdGhlIGFjdGl2ZSBwb3J0aW9uCi0JCQkgKiBvZiB0aGUgbGluZS4gRml4IHVwIHRoZSBjb3VudGVyIGF0IGJvdGggZWRnZXMgb2YgdmJsYW5rCi0JCQkgKiB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIHBpY3R1cmUgd2hldGhlciB3ZSdyZSBpbiB2YmxhbmsKLQkJCSAqIG9yIG5vdC4KLQkJCSAqLwotCQkJaW5fdmJsID0gaWxrX3BpcGVfaW5fdmJsYW5rX2xvY2tlZChkZXYsIHBpcGUpOwotCQkJaWYgKChpbl92YmwgJiYgcG9zaXRpb24gPT0gdmJsX3N0YXJ0IC0gMSkgfHwKLQkJCSAgICAoIWluX3ZibCAmJiBwb3NpdGlvbiA9PSB2YmxfZW5kIC0gMSkpCi0JCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyAxKSAlIHZ0b3RhbDsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJU1IgdmJsYW5rIHN0YXR1cyBiaXRzIGRvbid0IHdvcmsgdGhlIHdheSB3ZSdkIHdhbnQKLQkJCSAqIHRoZW0gdG8gd29yayBvbiBub24tUENIIHBsYXRmb3JtcyAoZm9yCi0JCQkgKiBpbGtfcGlwZV9pbl92YmxhbmtfbG9ja2VkKCkpLCBhbmQgdGhlcmUgZG9lc24ndAotCQkJICogYXBwZWFyIGFueSBvdGhlciB3YXkgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIGN1cnJlbnRseQotCQkJICogaW4gdmJsYW5rLgotCQkJICoKLQkJCSAqIEluc3RlYWQgbGV0J3MgYXNzdW1lIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB2YmxhbmsgaWYKLQkJCSAqIHdlIGdvdCBjYWxsZWQgZnJvbSB0aGUgdmJsYW5rIGludGVycnVwdCBhbmQgdGhlCi0JCQkgKiBzY2FubGluZSBjb3VudGVyIHZhbHVlIGluZGljYXRlcyB0aGF0IHdlJ3JlIG9uIHRoZQotCQkJICogbGluZSBqdXN0IHByaW9yIHRvIHZibGFuayBzdGFydC4gVGhpcyBzaG91bGQgcmVzdWx0Ci0JCQkgKiBpbiB0aGUgY29ycmVjdCBhbnN3ZXIsIHVubGVzcyB0aGUgdmJsYW5rIGludGVycnVwdAotCQkJICogZGVsaXZlcnkgcmVhbGx5IGdvdCBkZWxheWVkIGZvciBhbG1vc3QgZXhhY3RseSBvbmUKLQkJCSAqIGZ1bGwgZnJhbWUvZmllbGQuCi0JCQkgKi8KLQkJCWlmIChmbGFncyAmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEgJiYKLQkJCSAgICBwb3NpdGlvbiA9PSB2Ymxfc3RhcnQgLSAxKSB7Ci0JCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyAxKSAlIHZ0b3RhbDsKLQotCQkJCS8qIFNpZ25hbCB0aGlzIGNvcnJlY3Rpb24gYXMgImFwcGxpZWQiLiAqLwotCQkJCXJldCB8PSAweDg7Ci0JCQl9Ci0JCX0KKwkJcG9zaXRpb24gPSBfX2ludGVsX2dldF9jcnRjX3NjYW5saW5lKGludGVsX2NydGMpOwogCX0gZWxzZSB7CiAJCS8qIEhhdmUgYWNjZXNzIHRvIHBpeGVsY291bnQgc2luY2Ugc3RhcnQgb2YgZnJhbWUuCiAJCSAqIFdlIGNhbiBzcGxpdCB0aGlzIGludG8gdmVydGljYWwgYW5kIGhvcml6b250YWwKQEAgLTg2Miw2ICs5NjQsMjkgQEAKIAkJdmJsX3N0YXJ0ICo9IGh0b3RhbDsKIAkJdmJsX2VuZCAqPSBodG90YWw7CiAJCXZ0b3RhbCAqPSBodG90YWw7CisKKwkJLyoKKwkJICogSW4gaW50ZXJsYWNlZCBtb2RlcywgdGhlIHBpeGVsIGNvdW50ZXIgY291bnRzIGFsbCBwaXhlbHMsCisJCSAqIHNvIG9uZSBmaWVsZCB3aWxsIGhhdmUgaHRvdGFsIG1vcmUgcGl4ZWxzLiBJbiBvcmRlciB0byBhdm9pZAorCQkgKiB0aGUgcmVwb3J0ZWQgcG9zaXRpb24gZnJvbSBqdW1waW5nIGJhY2t3YXJkcyB3aGVuIHRoZSBwaXhlbAorCQkgKiBjb3VudGVyIGlzIGJleW9uZCB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIGZpZWxkLCBqdXN0CisJCSAqIGNsYW1wIHRoZSBwb3NpdGlvbiB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIGZpZWxkLiBUaGlzCisJCSAqIG1hdGNoZXMgaG93IHRoZSBzY2FubGluZSBjb3VudGVyIGJhc2VkIHBvc2l0aW9uIHdvcmtzIHNpbmNlCisJCSAqIHRoZSBzY2FubGluZSBjb3VudGVyIGRvZXNuJ3QgY291bnQgdGhlIHR3byBoYWxmIGxpbmVzLgorCQkgKi8KKwkJaWYgKHBvc2l0aW9uID49IHZ0b3RhbCkKKwkJCXBvc2l0aW9uID0gdnRvdGFsIC0gMTsKKworCQkvKgorCQkgKiBTdGFydCBvZiB2YmxhbmsgaW50ZXJydXB0IGlzIHRyaWdnZXJlZCBhdCBzdGFydCBvZiBoc3luYywKKwkJICoganVzdCBwcmlvciB0byB0aGUgZmlyc3QgYWN0aXZlIGxpbmUgb2YgdmJsYW5rLiBIb3dldmVyIHdlCisJCSAqIGNvbnNpZGVyIGxpbmVzIHRvIHN0YXJ0IGF0IHRoZSBsZWFkaW5nIGVkZ2Ugb2YgaG9yaXpvbnRhbAorCQkgKiBhY3RpdmUuIFNvLCBzaG91bGQgd2UgZ2V0IGhlcmUgYmVmb3JlIHdlJ3ZlIGNyb3NzZWQgaW50bworCQkgKiB0aGUgaG9yaXpvbnRhbCBhY3RpdmUgb2YgdGhlIGZpcnN0IGxpbmUgaW4gdmJsYW5rLCB3ZSB3b3VsZAorCQkgKiBub3Qgc2V0IHRoZSBEUk1fU0NBTk9VVFBPU19JTlZCTCBmbGFnLiBJbiBvcmRlciB0byBmaXggdGhhdCwKKwkJICogYWx3YXlzIGFkZCBodG90YWwtaHN5bmNfc3RhcnQgdG8gdGhlIGN1cnJlbnQgcGl4ZWwgcG9zaXRpb24uCisJCSAqLworCQlwb3NpdGlvbiA9IChwb3NpdGlvbiArIGh0b3RhbCAtIGhzeW5jX3N0YXJ0KSAlIHZ0b3RhbDsKIAl9CiAKIAkvKiBHZXQgb3B0aW9uYWwgc3lzdGVtIHRpbWVzdGFtcCBhZnRlciBxdWVyeS4gKi8KQEAgLTkwMCw2ICsxMDI1LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGludGVsX2dldF9jcnRjX3NjYW5saW5lKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCWludCBwb3NpdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsKKwlwb3NpdGlvbiA9IF9faW50ZWxfZ2V0X2NydGNfc2NhbmxpbmUoY3J0Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVuY29yZS5sb2NrLCBpcnFmbGFncyk7CisKKwlyZXR1cm4gcG9zaXRpb247Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSwKIAkJCSAgICAgIGludCAqbWF4X2Vycm9yLAogCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLApAQCAtOTQ1LDcgKzEwODMsNyBAQAogCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gc3RhdHVzIHVwZGF0ZWQgZnJvbSAlcyB0byAlc1xuIiwKIAkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLAotCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwKIAkJICAgICAgZHJtX2dldF9jb25uZWN0b3Jfc3RhdHVzX25hbWUob2xkX3N0YXR1cyksCiAJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX3N0YXR1c19uYW1lKGNvbm5lY3Rvci0+c3RhdHVzKSk7CiAKQEAgLTk5MCw3ICsxMTI4LDcgQEAKIAkJICAgIGNvbm5lY3Rvci0+cG9sbGVkID09IERSTV9DT05ORUNUT1JfUE9MTF9IUEQpIHsKIAkJCURSTV9JTkZPKCJIUEQgaW50ZXJydXB0IHN0b3JtIGRldGVjdGVkIG9uIGNvbm5lY3RvciAlczogIgogCQkJCSAic3dpdGNoaW5nIGZyb20gaG90cGx1ZyBkZXRlY3Rpb24gdG8gcG9sbGluZ1xuIiwKLQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJCWNvbm5lY3Rvci0+bmFtZSk7CiAJCQlkZXZfcHJpdi0+aHBkX3N0YXRzW2ludGVsX2VuY29kZXItPmhwZF9waW5dLmhwZF9tYXJrID0gSFBEX0RJU0FCTEVEOwogCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVAogCQkJCXwgRFJNX0NPTk5FQ1RPUl9QT0xMX0RJU0NPTk5FQ1Q7CkBAIC05OTgsNyArMTEzNiw3IEBACiAJCX0KIAkJaWYgKGhwZF9ldmVudF9iaXRzICYgKDEgPDwgaW50ZWxfZW5jb2Rlci0+aHBkX3BpbikpIHsKIAkJCURSTV9ERUJVR19LTVMoIkNvbm5lY3RvciAlcyAocGluICVpKSByZWNlaXZlZCBob3RwbHVnIGV2ZW50LlxuIiwKLQkJCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksIGludGVsX2VuY29kZXItPmhwZF9waW4pOworCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwgaW50ZWxfZW5jb2Rlci0+aHBkX3Bpbik7CiAJCX0KIAl9CiAJIC8qIGlmIHRoZXJlIHdlcmUgbm8gb3V0cHV0cyB0byBwb2xsLCBwb2xsIHdhcyBkaXNhYmxlZCwKQEAgLTEwNzMsOSArMTIxMSw5IEBACiB9CiAKIHN0YXRpYyB2b2lkIG5vdGlmeV9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewotCWlmIChyaW5nLT5vYmogPT0gTlVMTCkKKwlpZiAoIWludGVsX3JpbmdfaW5pdGlhbGl6ZWQocmluZykpCiAJCXJldHVybjsKIAogCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3RfY29tcGxldGUocmluZyk7CkBAIC0xMDk0LDggKzEyMzIsMTIgQEAKIAlzcGluX2xvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCXBtX2lpciA9IGRldl9wcml2LT5ycHMucG1faWlyOwogCWRldl9wcml2LT5ycHMucG1faWlyID0gMDsKLQkvKiBNYWtlIHN1cmUgbm90IHRvIGNvcnJ1cHQgUE1JTVIgc3RhdGUgdXNlZCBieSByaW5nYnVmZmVyIGNvZGUgKi8KLQlzbmJfZW5hYmxlX3BtX2lycShkZXZfcHJpdiwgZGV2X3ByaXYtPnBtX3Jwc19ldmVudHMpOworCWlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYtPmRldikpCisJCWJkd19lbmFibGVfcG1faXJxKGRldl9wcml2LCBkZXZfcHJpdi0+cG1fcnBzX2V2ZW50cyk7CisJZWxzZSB7CisJCS8qIE1ha2Ugc3VyZSBub3QgdG8gY29ycnVwdCBQTUlNUiBzdGF0ZSB1c2VkIGJ5IHJpbmdidWZmZXIgKi8KKwkJc25iX2VuYWJsZV9wbV9pcnEoZGV2X3ByaXYsIGRldl9wcml2LT5wbV9ycHNfZXZlbnRzKTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCiAJLyogTWFrZSBzdXJlIHdlIGRpZG4ndCBxdWV1ZSBhbnl0aGluZyB3ZSdyZSBub3QgZ29pbmcgdG8gcHJvY2Vzcy4gKi8KQEAgLTEyOTIsNiArMTQzNCwxOSBAQAogCQlpdnlicmlkZ2VfcGFyaXR5X2Vycm9yX2lycV9oYW5kbGVyKGRldiwgZ3RfaWlyKTsKIH0KIAorc3RhdGljIHZvaWQgZ2VuOF9ycHNfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcG1faWlyKQoreworCWlmICgocG1faWlyICYgZGV2X3ByaXYtPnBtX3Jwc19ldmVudHMpID09IDApCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZGV2X3ByaXYtPmlycV9sb2NrKTsKKwlkZXZfcHJpdi0+cnBzLnBtX2lpciB8PSBwbV9paXIgJiBkZXZfcHJpdi0+cG1fcnBzX2V2ZW50czsKKwliZHdfZGlzYWJsZV9wbV9pcnEoZGV2X3ByaXYsIHBtX2lpciAmIGRldl9wcml2LT5wbV9ycHNfZXZlbnRzKTsKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPmlycV9sb2NrKTsKKworCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPnJwcy53b3JrKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGdlbjhfZ3RfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCQkJCSAgICAgICB1MzIgbWFzdGVyX2N0bCkKQEAgLTEzMTUsMTggKzE0NzAsMzIgQEAKIAkJCURSTV9FUlJPUigiVGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBsaWVkIChHVDApIVxuIik7CiAJfQogCi0JaWYgKG1hc3Rlcl9jdGwgJiBHRU44X0dUX1ZDUzFfSVJRKSB7CisJaWYgKG1hc3Rlcl9jdGwgJiAoR0VOOF9HVF9WQ1MxX0lSUSB8IEdFTjhfR1RfVkNTMl9JUlEpKSB7CiAJCXRtcCA9IEk5MTVfUkVBRChHRU44X0dUX0lJUigxKSk7CiAJCWlmICh0bXApIHsKIAkJCXJldCA9IElSUV9IQU5ETEVEOwogCQkJdmNzID0gdG1wID4+IEdFTjhfVkNTMV9JUlFfU0hJRlQ7CiAJCQlpZiAodmNzICYgR1RfUkVOREVSX1VTRVJfSU5URVJSVVBUKQogCQkJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yaW5nW1ZDU10pOworCQkJdmNzID0gdG1wID4+IEdFTjhfVkNTMl9JUlFfU0hJRlQ7CisJCQlpZiAodmNzICYgR1RfUkVOREVSX1VTRVJfSU5URVJSVVBUKQorCQkJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yaW5nW1ZDUzJdKTsKIAkJCUk5MTVfV1JJVEUoR0VOOF9HVF9JSVIoMSksIHRtcCk7CiAJCX0gZWxzZQogCQkJRFJNX0VSUk9SKCJUaGUgbWFzdGVyIGNvbnRyb2wgaW50ZXJydXB0IGxpZWQgKEdUMSkhXG4iKTsKIAl9CiAKKwlpZiAobWFzdGVyX2N0bCAmIEdFTjhfR1RfUE1fSVJRKSB7CisJCXRtcCA9IEk5MTVfUkVBRChHRU44X0dUX0lJUigyKSk7CisJCWlmICh0bXAgJiBkZXZfcHJpdi0+cG1fcnBzX2V2ZW50cykgeworCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCQlnZW44X3Jwc19pcnFfaGFuZGxlcihkZXZfcHJpdiwgdG1wKTsKKwkJCUk5MTVfV1JJVEUoR0VOOF9HVF9JSVIoMiksCisJCQkJICAgdG1wICYgZGV2X3ByaXYtPnBtX3Jwc19ldmVudHMpOworCQl9IGVsc2UKKwkJCURSTV9FUlJPUigiVGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBsaWVkIChQTSkhXG4iKTsKKwl9CisKIAlpZiAobWFzdGVyX2N0bCAmIEdFTjhfR1RfVkVDU19JUlEpIHsKIAkJdG1wID0gSTkxNV9SRUFEKEdFTjhfR1RfSUlSKDMpKTsKIAkJaWYgKHRtcCkgewpAQCAtMTU0OSw2ICsxNzE4LDE5IEBACiAJfQogfQogCitzdGF0aWMgYm9vbCBpbnRlbF9waXBlX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwaXBlIHBpcGUpCit7CisJc3RydWN0IGludGVsX2NydGMgKmNydGM7CisKKwlpZiAoIWRybV9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSkpCisJCXJldHVybiBmYWxzZTsKKworCWNydGMgPSB0b19pbnRlbF9jcnRjKGludGVsX2dldF9jcnRjX2Zvcl9waXBlKGRldiwgcGlwZSkpOworCXdha2VfdXAoJmNydGMtPnZibF93YWl0KTsKKworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCB2YWxsZXl2aWV3X3BpcGVzdGF0X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBpaXIpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE1NzgsNiArMTc2MCw5IEBACiAJCWNhc2UgUElQRV9COgogCQkJaWlyX2JpdCA9IEk5MTVfRElTUExBWV9QSVBFX0JfRVZFTlRfSU5URVJSVVBUOwogCQkJYnJlYWs7CisJCWNhc2UgUElQRV9DOgorCQkJaWlyX2JpdCA9IEk5MTVfRElTUExBWV9QSVBFX0NfRVZFTlRfSU5URVJSVVBUOworCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGlpciAmIGlpcl9iaXQpCiAJCQltYXNrIHw9IGRldl9wcml2LT5waXBlc3RhdF9pcnFfbWFza1twaXBlXTsKQEAgLTE2MDAsNyArMTc4NSw3IEBACiAKIAlmb3JfZWFjaF9waXBlKHBpcGUpIHsKIAkJaWYgKHBpcGVfc3RhdHNbcGlwZV0gJiBQSVBFX1NUQVJUX1ZCTEFOS19JTlRFUlJVUFRfU1RBVFVTKQotCQkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKTsKKwkJCWludGVsX3BpcGVfaGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpOwogCiAJCWlmIChwaXBlX3N0YXRzW3BpcGVdICYgUExBTkVfRkxJUF9ET05FX0lOVF9TVEFUVVNfVkxWKSB7CiAJCQlpbnRlbF9wcmVwYXJlX3BhZ2VfZmxpcChkZXYsIHBpcGUpOwpAQCAtMTYxOSw5ICsxODA0LDM2IEBACiAJCWdtYnVzX2lycV9oYW5kbGVyKGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIGk5eHhfaHBkX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgaG90cGx1Z19zdGF0dXMgPSBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpOworCisJaWYgKElTX0c0WChkZXYpKSB7CisJCXUzMiBob3RwbHVnX3RyaWdnZXIgPSBob3RwbHVnX3N0YXR1cyAmIEhPVFBMVUdfSU5UX1NUQVRVU19HNFg7CisKKwkJaW50ZWxfaHBkX2lycV9oYW5kbGVyKGRldiwgaG90cGx1Z190cmlnZ2VyLCBocGRfc3RhdHVzX2c0eCk7CisJfSBlbHNlIHsKKwkJdTMyIGhvdHBsdWdfdHJpZ2dlciA9IGhvdHBsdWdfc3RhdHVzICYgSE9UUExVR19JTlRfU1RBVFVTX0k5MTU7CisKKwkJaW50ZWxfaHBkX2lycV9oYW5kbGVyKGRldiwgaG90cGx1Z190cmlnZ2VyLCBocGRfc3RhdHVzX2k5MTUpOworCX0KKworCWlmICgoSVNfRzRYKGRldikgfHwgSVNfVkFMTEVZVklFVyhkZXYpKSAmJgorCSAgICBob3RwbHVnX3N0YXR1cyAmIERQX0FVWF9DSEFOTkVMX01BU0tfSU5UX1NUQVRVU19HNFgpCisJCWRwX2F1eF9pcnFfaGFuZGxlcihkZXYpOworCisJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfU1RBVCwgaG90cGx1Z19zdGF0dXMpOworCS8qCisJICogTWFrZSBzdXJlIGhvdHBsdWcgc3RhdHVzIGlzIGNsZWFyZWQgYmVmb3JlIHdlIGNsZWFyIElJUiwgb3IgZWxzZSB3ZQorCSAqIG1heSBtaXNzIGhvdHBsdWcgZXZlbnRzLgorCSAqLworCVBPU1RJTkdfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCB2YWxsZXl2aWV3X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXJnOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGlpciwgZ3RfaWlyLCBwbV9paXI7CiAJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CkBAIC0xNjQxLDE5ICsxODUzLDggQEAKIAkJdmFsbGV5dmlld19waXBlc3RhdF9pcnFfaGFuZGxlcihkZXYsIGlpcik7CiAKIAkJLyogQ29uc3VtZSBwb3J0LiAgVGhlbiBjbGVhciBJSVIgb3Igd2UnbGwgbWlzcyBldmVudHMgKi8KLQkJaWYgKGlpciAmIEk5MTVfRElTUExBWV9QT1JUX0lOVEVSUlVQVCkgewotCQkJdTMyIGhvdHBsdWdfc3RhdHVzID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19TVEFUKTsKLQkJCXUzMiBob3RwbHVnX3RyaWdnZXIgPSBob3RwbHVnX3N0YXR1cyAmIEhPVFBMVUdfSU5UX1NUQVRVU19JOTE1OwotCi0JCQlpbnRlbF9ocGRfaXJxX2hhbmRsZXIoZGV2LCBob3RwbHVnX3RyaWdnZXIsIGhwZF9zdGF0dXNfaTkxNSk7Ci0KLQkJCWlmIChob3RwbHVnX3N0YXR1cyAmIERQX0FVWF9DSEFOTkVMX01BU0tfSU5UX1NUQVRVU19HNFgpCi0JCQkJZHBfYXV4X2lycV9oYW5kbGVyKGRldik7Ci0KLQkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsIGhvdHBsdWdfc3RhdHVzKTsKLQkJCUk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7Ci0JCX0KLQorCQlpZiAoaWlyICYgSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUKQorCQkJaTl4eF9ocGRfaXJxX2hhbmRsZXIoZGV2KTsKIAogCQlpZiAocG1faWlyKQogCQkJZ2VuNl9ycHNfaXJxX2hhbmRsZXIoZGV2X3ByaXYsIHBtX2lpcik7CkBAIC0xNjY3LDYgKzE4NjgsNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgY2hlcnJ5dmlld19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBtYXN0ZXJfY3RsLCBpaXI7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlmb3IgKDs7KSB7CisJCW1hc3Rlcl9jdGwgPSBJOTE1X1JFQUQoR0VOOF9NQVNURVJfSVJRKSAmIH5HRU44X01BU1RFUl9JUlFfQ09OVFJPTDsKKwkJaWlyID0gSTkxNV9SRUFEKFZMVl9JSVIpOworCisJCWlmIChtYXN0ZXJfY3RsID09IDAgJiYgaWlyID09IDApCisJCQlicmVhazsKKworCQlJOTE1X1dSSVRFKEdFTjhfTUFTVEVSX0lSUSwgMCk7CisKKwkJZ2VuOF9ndF9pcnFfaGFuZGxlcihkZXYsIGRldl9wcml2LCBtYXN0ZXJfY3RsKTsKKworCQl2YWxsZXl2aWV3X3BpcGVzdGF0X2lycV9oYW5kbGVyKGRldiwgaWlyKTsKKworCQkvKiBDb25zdW1lIHBvcnQuICBUaGVuIGNsZWFyIElJUiBvciB3ZSdsbCBtaXNzIGV2ZW50cyAqLworCQlpOXh4X2hwZF9pcnFfaGFuZGxlcihkZXYpOworCisJCUk5MTVfV1JJVEUoVkxWX0lJUiwgaWlyKTsKKworCQlJOTE1X1dSSVRFKEdFTjhfTUFTVEVSX0lSUSwgREVfTUFTVEVSX0lSUV9DT05UUk9MKTsKKwkJUE9TVElOR19SRUFEKEdFTjhfTUFTVEVSX0lSUSk7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgaWJ4X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBwY2hfaWlyKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xODI3LDcgKzIwNjIsNyBAQAogCiAJZm9yX2VhY2hfcGlwZShwaXBlKSB7CiAJCWlmIChkZV9paXIgJiBERV9QSVBFX1ZCTEFOSyhwaXBlKSkKLQkJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSk7CisJCQlpbnRlbF9waXBlX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKTsKIAogCQlpZiAoZGVfaWlyICYgREVfUElQRV9GSUZPX1VOREVSUlVOKHBpcGUpKQogCQkJaWYgKGludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBmYWxzZSkpCkBAIC0xODc3LDcgKzIxMTIsNyBAQAogCiAJZm9yX2VhY2hfcGlwZShwaXBlKSB7CiAJCWlmIChkZV9paXIgJiAoREVfUElQRV9WQkxBTktfSVZCKHBpcGUpKSkKLQkJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSk7CisJCQlpbnRlbF9waXBlX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKTsKIAogCQkvKiBwbGFuZS9waXBlcyBtYXAgMToxIG9uIGlsaysgKi8KIAkJaWYgKGRlX2lpciAmIERFX1BMQU5FX0ZMSVBfRE9ORV9JVkIocGlwZSkpIHsKQEAgLTE4OTksNyArMjEzNCw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpcm9ubGFrZV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGFyZzsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBkZV9paXIsIGd0X2lpciwgZGVfaWVyLCBzZGVfaWVyID0gMDsKIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKQEAgLTIwMjAsOSArMjI1NSw5IEBACiAKIAkJcGlwZV9paXIgPSBJOTE1X1JFQUQoR0VOOF9ERV9QSVBFX0lJUihwaXBlKSk7CiAJCWlmIChwaXBlX2lpciAmIEdFTjhfUElQRV9WQkxBTkspCi0JCQlkcm1faGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpOworCQkJaW50ZWxfcGlwZV9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSk7CiAKLQkJaWYgKHBpcGVfaWlyICYgR0VOOF9QSVBFX0ZMSVBfRE9ORSkgeworCQlpZiAocGlwZV9paXIgJiBHRU44X1BJUEVfUFJJTUFSWV9GTElQX0RPTkUpIHsKIAkJCWludGVsX3ByZXBhcmVfcGFnZV9mbGlwKGRldiwgcGlwZSk7CiAJCQlpbnRlbF9maW5pc2hfcGFnZV9mbGlwX3BsYW5lKGRldiwgcGlwZSk7CiAJCX0KQEAgLTIwNzUsNyArMjMxMCw3IEBACiBzdGF0aWMgdm9pZCBpOTE1X2Vycm9yX3dha2VfdXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgICAgIGJvb2wgcmVzZXRfY29tcGxldGVkKQogewotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCBpOwogCiAJLyoKQEAgLTIxMzcsNiArMjM3MiwxNCBAQAogCQkJCSAgIHJlc2V0X2V2ZW50KTsKIAogCQkvKgorCQkgKiBJbiBtb3N0IGNhc2VzIGl0J3MgZ3VhcmFudGVlZCB0aGF0IHdlIGdldCBoZXJlIHdpdGggYW4gUlBNCisJCSAqIHJlZmVyZW5jZSBoZWxkLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZXJlIGlzIGEgcGVuZGluZyBHUFUKKwkJICogcmVxdWVzdCB0aGF0IHdvbid0IGZpbmlzaCB1bnRpbCB0aGUgcmVzZXQgaXMgZG9uZS4gVGhpcworCQkgKiBpc24ndCB0aGUgY2FzZSBhdCBsZWFzdCB3aGVuIHdlIGdldCBoZXJlIGJ5IGRvaW5nIGEKKwkJICogc2ltdWxhdGVkIHJlc2V0IHZpYSBkZWJ1Z3MsIHNvIGdldCBhbiBSUE0gcmVmZXJlbmNlLgorCQkgKi8KKwkJaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOworCQkvKgogCQkgKiBBbGwgc3RhdGUgcmVzZXQgX211c3RfIGJlIGNvbXBsZXRlZCBiZWZvcmUgd2UgdXBkYXRlIHRoZQogCQkgKiByZXNldCBjb3VudGVyLCBmb3Igb3RoZXJ3aXNlIHdhaXRlcnMgbWlnaHQgbWlzcyB0aGUgcmVzZXQKIAkJICogcGVuZGluZyBzdGF0ZSBhbmQgbm90IHByb3Blcmx5IGRyb3AgbG9ja3MsIHJlc3VsdGluZyBpbgpAQCAtMjE0Niw2ICsyMzg5LDggQEAKIAogCQlpbnRlbF9kaXNwbGF5X2hhbmRsZV9yZXNldChkZXYpOwogCisJCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKKwogCQlpZiAocmV0ID09IDApIHsKIAkJCS8qCiAJCQkgKiBBZnRlciBhbGwgdGhlIGdlbSBzdGF0ZSBpcyByZXNldCwgaW5jcmVtZW50IHRoZSByZXNldApAQCAtMjM4MywxMCArMjYyOCw2IEBACiAJZWxzZQogCQlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgcGlwZSwKIAkJCQkgICAgIFBJUEVfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMpOwotCi0JLyogbWFpbnRhaW4gdmJsYW5rIGRlbGl2ZXJ5IGV2ZW4gaW4gZGVlcCBDLXN0YXRlcyAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAzKQotCQlJOTE1X1dSSVRFKElOU1RQTSwgX01BU0tFRF9CSVRfRElTQUJMRShJTlNUUE1fQUdQQlVTWV9ESVMpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMjQ1MCw5ICsyNjkxLDYgQEAKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAzKQotCQlJOTE1X1dSSVRFKElOU1RQTSwgX01BU0tFRF9CSVRfRU5BQkxFKElOU1RQTV9BR1BCVVNZX0RJUykpOwotCiAJaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRldl9wcml2LCBwaXBlLAogCQkJICAgICAgUElQRV9WQkxBTktfSU5URVJSVVBUX1NUQVRVUyB8CiAJCQkgICAgICBQSVBFX1NUQVJUX1ZCTEFOS19JTlRFUlJVUFRfU1RBVFVTKTsKQEAgLTI0OTgsMjkgKzI3MzYsNzcgQEAKIH0KIAogc3RhdGljIHUzMgotcmluZ19sYXN0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3JpbmdfbGFzdF9zZXFubyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXJldHVybiBsaXN0X2VudHJ5KHJpbmctPnJlcXVlc3RfbGlzdC5wcmV2LAogCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QsIGxpc3QpLT5zZXFubzsKIH0KIAogc3RhdGljIGJvb2wKLXJpbmdfaWRsZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiBzZXFubykKK3JpbmdfaWRsZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgc2Vxbm8pCiB7CiAJcmV0dXJuIChsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpIHx8CiAJCWk5MTVfc2Vxbm9fcGFzc2VkKHNlcW5vLCByaW5nX2xhc3Rfc2Vxbm8ocmluZykpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqCi1zZW1hcGhvcmVfd2FpdHNfZm9yKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyICpzZXFubykKK3N0YXRpYyBib29sCitpcGVocl9pc19zZW1hcGhvcmVfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgaXBlaHIpCit7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpIHsKKwkJLyoKKwkJICogRklYTUU6IGdlbjggc2VtYXBob3JlIHN1cHBvcnQgLSBjdXJyZW50bHkgd2UgZG9uJ3QgZW1pdAorCQkgKiBzZW1hcGhvcmVzIG9uIGJkdyBhbnl3YXksIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZCB3aGVuCisJCSAqIHdlIG1lcmdlIHRoYXQgY29kZS4KKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlpcGVociAmPSB+TUlfU0VNQVBIT1JFX1NZTkNfTUFTSzsKKwkJcmV0dXJuIGlwZWhyID09IChNSV9TRU1BUEhPUkVfTUJPWCB8IE1JX1NFTUFQSE9SRV9DT01QQVJFIHwKKwkJCQkgTUlfU0VNQVBIT1JFX1JFR0lTVEVSKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoKK3NlbWFwaG9yZV93YWl0X3RvX3NpZ25hbGxlcl9yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIHUzMiBpcGVocikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNpZ25hbGxlcjsKKwlpbnQgaTsKKworCWlmIChJTlRFTF9JTkZPKGRldl9wcml2LT5kZXYpLT5nZW4gPj0gOCkgeworCQkvKgorCQkgKiBGSVhNRTogZ2VuOCBzZW1hcGhvcmUgc3VwcG9ydCAtIGN1cnJlbnRseSB3ZSBkb24ndCBlbWl0CisJCSAqIHNlbWFwaG9yZXMgb24gYmR3IGFueXdheSwgYnV0IHRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkIHdoZW4KKwkJICogd2UgbWVyZ2UgdGhhdCBjb2RlLgorCQkgKi8KKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJdTMyIHN5bmNfYml0cyA9IGlwZWhyICYgTUlfU0VNQVBIT1JFX1NZTkNfTUFTSzsKKworCQlmb3JfZWFjaF9yaW5nKHNpZ25hbGxlciwgZGV2X3ByaXYsIGkpIHsKKwkJCWlmKHJpbmcgPT0gc2lnbmFsbGVyKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3luY19iaXRzID09IHNpZ25hbGxlci0+c2VtYXBob3JlLm1ib3gud2FpdFtyaW5nLT5pZF0pCisJCQkJcmV0dXJuIHNpZ25hbGxlcjsKKwkJfQorCX0KKworCURSTV9FUlJPUigiTm8gc2lnbmFsbGVyIHJpbmcgZm91bmQgZm9yIHJpbmcgJWksIGlwZWhyIDB4JTA4eFxuIiwKKwkJICByaW5nLT5pZCwgaXBlaHIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoKK3NlbWFwaG9yZV93YWl0c19mb3Ioc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyICpzZXFubykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwogCXUzMiBjbWQsIGlwZWhyLCBoZWFkOwogCWludCBpOwogCiAJaXBlaHIgPSBJOTE1X1JFQUQoUklOR19JUEVIUihyaW5nLT5tbWlvX2Jhc2UpKTsKLQlpZiAoKGlwZWhyICYgfigweDMgPDwgMTYpKSAhPQotCSAgICAoTUlfU0VNQVBIT1JFX01CT1ggfCBNSV9TRU1BUEhPUkVfQ09NUEFSRSB8IE1JX1NFTUFQSE9SRV9SRUdJU1RFUikpCisJaWYgKCFpcGVocl9pc19zZW1hcGhvcmVfd2FpdChyaW5nLT5kZXYsIGlwZWhyKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKgpAQCAtMjUzOCwxMCArMjgyNCwxMCBAQAogCQkgKiBvdXIgcmluZyBpcyBzbWFsbGVyIHRoYW4gd2hhdCB0aGUgaGFyZHdhcmUgKGFuZCBoZW5jZQogCQkgKiBIRUFEX0FERFIpIGFsbG93cy4gQWxzbyBoYW5kbGVzIHdyYXAtYXJvdW5kLgogCQkgKi8KLQkJaGVhZCAmPSByaW5nLT5zaXplIC0gMTsKKwkJaGVhZCAmPSByaW5nLT5idWZmZXItPnNpemUgLSAxOwogCiAJCS8qIFRoaXMgaGVyZSBzZWVtcyB0byBibG93IHVwICovCi0JCWNtZCA9IGlvcmVhZDMyKHJpbmctPnZpcnR1YWxfc3RhcnQgKyBoZWFkKTsKKwkJY21kID0gaW9yZWFkMzIocmluZy0+YnVmZmVyLT52aXJ0dWFsX3N0YXJ0ICsgaGVhZCk7CiAJCWlmIChjbWQgPT0gaXBlaHIpCiAJCQlicmVhazsKIApAQCAtMjU1MSwxNCArMjgzNywxNCBAQAogCWlmICghaSkKIAkJcmV0dXJuIE5VTEw7CiAKLQkqc2Vxbm8gPSBpb3JlYWQzMihyaW5nLT52aXJ0dWFsX3N0YXJ0ICsgaGVhZCArIDQpICsgMTsKLQlyZXR1cm4gJmRldl9wcml2LT5yaW5nWyhyaW5nLT5pZCArICgoKGlwZWhyID4+IDE3KSAmIDEpICsgMSkpICUgM107CisJKnNlcW5vID0gaW9yZWFkMzIocmluZy0+YnVmZmVyLT52aXJ0dWFsX3N0YXJ0ICsgaGVhZCArIDQpICsgMTsKKwlyZXR1cm4gc2VtYXBob3JlX3dhaXRfdG9fc2lnbmFsbGVyX3JpbmcocmluZywgaXBlaHIpOwogfQogCi1zdGF0aWMgaW50IHNlbWFwaG9yZV9wYXNzZWQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBzZW1hcGhvcmVfcGFzc2VkKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnNpZ25hbGxlcjsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpzaWduYWxsZXI7CiAJdTMyIHNlcW5vLCBjdGw7CiAKIAlyaW5nLT5oYW5nY2hlY2suZGVhZGxvY2sgPSB0cnVlOwpAQCAtMjU3Nyw3ICsyODYzLDcgQEAKIAogc3RhdGljIHZvaWQgc2VtYXBob3JlX2NsZWFyX2RlYWRsb2NrcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmc7CiAJaW50IGk7CiAKIAlmb3JfZWFjaF9yaW5nKHJpbmcsIGRldl9wcml2LCBpKQpAQCAtMjU4NSw3ICsyODcxLDcgQEAKIH0KIAogc3RhdGljIGVudW0gaW50ZWxfcmluZ19oYW5nY2hlY2tfYWN0aW9uCi1yaW5nX3N0dWNrKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTY0IGFjdGhkKQorcmluZ19zdHVjayhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1NjQgYWN0aGQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjY0MSw3ICsyOTI3LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWludCBpOwogCWludCBidXN5X2NvdW50ID0gMCwgcmluZ3NfaHVuZyA9IDA7CiAJYm9vbCBzdHVja1tJOTE1X05VTV9SSU5HU10gPSB7IDAgfTsKQEAgLTI3NTksNTcgKzMwNDUsNjMgQEAKIAkJICByb3VuZF9qaWZmaWVzX3VwKGppZmZpZXMgKyBEUk1fSTkxNV9IQU5HQ0hFQ0tfSklGRklFUykpOwogfQogCi1zdGF0aWMgdm9pZCBpYnhfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlieF9pcnFfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJaWYgKEhBU19QQ0hfTk9QKGRldikpCiAJCXJldHVybjsKIAotCS8qIHNvdXRoIGRpc3BsYXkgaXJxICovCi0JSTkxNV9XUklURShTREVJTVIsIDB4ZmZmZmZmZmYpOwotCS8qCi0JICogU0RFSUVSIGlzIGFsc28gdG91Y2hlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gd29yayBhcm91bmQgbWlzc2VkCi0JICogUENIIGludGVycnVwdHMuIEhlbmNlIHdlIGNhbid0IHVwZGF0ZSBpdCBhZnRlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKLQkgKiBpcyBlbmFibGVkIC0gaW5zdGVhZCB3ZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGFsbCBQQ0ggaW50ZXJydXB0Ci0JICogc291cmNlcyBoZXJlLCBidXQgdGhlbiBvbmx5IHVubWFzayB0aGVtIGFzIG5lZWRlZCB3aXRoIFNERUlNUi4KLQkgKi8KKwlHRU41X0lSUV9SRVNFVChTREUpOworCisJaWYgKEhBU19QQ0hfQ1BUKGRldikgfHwgSEFTX1BDSF9MUFQoZGV2KSkKKwkJSTkxNV9XUklURShTRVJSX0lOVCwgMHhmZmZmZmZmZik7Cit9CisKKy8qCisgKiBTREVJRVIgaXMgYWxzbyB0b3VjaGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byB3b3JrIGFyb3VuZCBtaXNzZWQgUENICisgKiBpbnRlcnJ1cHRzLiBIZW5jZSB3ZSBjYW4ndCB1cGRhdGUgaXQgYWZ0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGVuYWJsZWQgLQorICogaW5zdGVhZCB3ZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGFsbCBQQ0ggaW50ZXJydXB0IHNvdXJjZXMgaGVyZSwgYnV0IHRoZW4KKyAqIG9ubHkgdW5tYXNrIHRoZW0gYXMgbmVlZGVkIHdpdGggU0RFSU1SLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorICovCitzdGF0aWMgdm9pZCBpYnhfaXJxX3ByZV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoSEFTX1BDSF9OT1AoZGV2KSkKKwkJcmV0dXJuOworCisJV0FSTl9PTihJOTE1X1JFQUQoU0RFSUVSKSAhPSAwKTsKIAlJOTE1X1dSSVRFKFNERUlFUiwgMHhmZmZmZmZmZik7CiAJUE9TVElOR19SRUFEKFNERUlFUik7CiB9CiAKLXN0YXRpYyB2b2lkIGdlbjVfZ3RfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGdlbjVfZ3RfaXJxX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCS8qIGFuZCBHVCAqLwotCUk5MTVfV1JJVEUoR1RJTVIsIDB4ZmZmZmZmZmYpOwotCUk5MTVfV1JJVEUoR1RJRVIsIDB4MCk7Ci0JUE9TVElOR19SRUFEKEdUSUVSKTsKLQotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7Ci0JCS8qIGFuZCBQTSAqLwotCQlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIDB4ZmZmZmZmZmYpOwotCQlJOTE1X1dSSVRFKEdFTjZfUE1JRVIsIDB4MCk7Ci0JCVBPU1RJTkdfUkVBRChHRU42X1BNSUVSKTsKLQl9CisJR0VONV9JUlFfUkVTRVQoR1QpOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KQorCQlHRU41X0lSUV9SRVNFVChHRU42X1BNKTsKIH0KIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotc3RhdGljIHZvaWQgaXJvbmxha2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2lycV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlJOTE1X1dSSVRFKEhXU1RBTSwgMHhlZmZlKTsKKwlJOTE1X1dSSVRFKEhXU1RBTSwgMHhmZmZmZmZmZik7CiAKLQlJOTE1X1dSSVRFKERFSU1SLCAweGZmZmZmZmZmKTsKLQlJOTE1X1dSSVRFKERFSUVSLCAweDApOwotCVBPU1RJTkdfUkVBRChERUlFUik7CisJR0VONV9JUlFfUkVTRVQoREUpOworCWlmIChJU19HRU43KGRldikpCisJCUk5MTVfV1JJVEUoR0VON19FUlJfSU5ULCAweGZmZmZmZmZmKTsKIAotCWdlbjVfZ3RfaXJxX3ByZWluc3RhbGwoZGV2KTsKKwlnZW41X2d0X2lycV9yZXNldChkZXYpOwogCi0JaWJ4X2lycV9wcmVpbnN0YWxsKGRldik7CisJaWJ4X2lycV9yZXNldChkZXYpOwogfQogCiBzdGF0aWMgdm9pZCB2YWxsZXl2aWV3X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0yODI3LDcgKzMxMTksNyBAQAogCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOwogCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOwogCi0JZ2VuNV9ndF9pcnFfcHJlaW5zdGFsbChkZXYpOworCWdlbjVfZ3RfaXJxX3Jlc2V0KGRldik7CiAKIAlJOTE1X1dSSVRFKERQSU5WR1RULCAweGZmKTsKIApAQCAtMjg0MSw3ICszMTMzLDE1IEBACiAJUE9TVElOR19SRUFEKFZMVl9JRVIpOwogfQogCi1zdGF0aWMgdm9pZCBnZW44X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBnZW44X2d0X2lycV9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJR0VOOF9JUlFfUkVTRVRfTkRYKEdULCAwKTsKKwlHRU44X0lSUV9SRVNFVF9ORFgoR1QsIDEpOworCUdFTjhfSVJRX1JFU0VUX05EWChHVCwgMik7CisJR0VOOF9JUlFfUkVTRVRfTkRYKEdULCAzKTsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9pcnFfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBwaXBlOwpAQCAtMjg0OSw0MyArMzE0OSw0NCBAQAogCUk5MTVfV1JJVEUoR0VOOF9NQVNURVJfSVJRLCAwKTsKIAlQT1NUSU5HX1JFQUQoR0VOOF9NQVNURVJfSVJRKTsKIAotCS8qIElJUiBjYW4gdGhlb3JldGljYWxseSBxdWV1ZSB1cCB0d28gZXZlbnRzLiBCZSBwYXJhbm9pZCAqLwotI2RlZmluZSBHRU44X0lSUV9JTklUX05EWCh0eXBlLCB3aGljaCkgZG8geyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JTVIod2hpY2gpLCAweGZmZmZmZmZmKTsgXAotCQlQT1NUSU5HX1JFQUQoR0VOOF8jI3R5cGUjI19JTVIod2hpY2gpKTsgXAotCQlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUVSKHdoaWNoKSwgMCk7IFwKLQkJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lJUih3aGljaCksIDB4ZmZmZmZmZmYpOyBcCi0JCVBPU1RJTkdfUkVBRChHRU44XyMjdHlwZSMjX0lJUih3aGljaCkpOyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JSVIod2hpY2gpLCAweGZmZmZmZmZmKTsgXAotCX0gd2hpbGUgKDApCisJZ2VuOF9ndF9pcnFfcmVzZXQoZGV2X3ByaXYpOwogCi0jZGVmaW5lIEdFTjhfSVJRX0lOSVQodHlwZSkgZG8geyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JTVIsIDB4ZmZmZmZmZmYpOyBcCi0JCVBPU1RJTkdfUkVBRChHRU44XyMjdHlwZSMjX0lNUik7IFwKLQkJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lFUiwgMCk7IFwKLQkJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lJUiwgMHhmZmZmZmZmZik7IFwKLQkJUE9TVElOR19SRUFEKEdFTjhfIyN0eXBlIyNfSUlSKTsgXAotCQlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUlSLCAweGZmZmZmZmZmKTsgXAotCX0gd2hpbGUgKDApCisJZm9yX2VhY2hfcGlwZShwaXBlKQorCQlHRU44X0lSUV9SRVNFVF9ORFgoREVfUElQRSwgcGlwZSk7CiAKLQlHRU44X0lSUV9JTklUX05EWChHVCwgMCk7Ci0JR0VOOF9JUlFfSU5JVF9ORFgoR1QsIDEpOwotCUdFTjhfSVJRX0lOSVRfTkRYKEdULCAyKTsKLQlHRU44X0lSUV9JTklUX05EWChHVCwgMyk7CisJR0VONV9JUlFfUkVTRVQoR0VOOF9ERV9QT1JUXyk7CisJR0VONV9JUlFfUkVTRVQoR0VOOF9ERV9NSVNDXyk7CisJR0VONV9JUlFfUkVTRVQoR0VOOF9QQ1VfKTsKIAotCWZvcl9lYWNoX3BpcGUocGlwZSkgewotCQlHRU44X0lSUV9JTklUX05EWChERV9QSVBFLCBwaXBlKTsKLQl9CisJaWJ4X2lycV9yZXNldChkZXYpOworfQogCi0JR0VOOF9JUlFfSU5JVChERV9QT1JUKTsKLQlHRU44X0lSUV9JTklUKERFX01JU0MpOwotCUdFTjhfSVJRX0lOSVQoUENVKTsKLSN1bmRlZiBHRU44X0lSUV9JTklUCi0jdW5kZWYgR0VOOF9JUlFfSU5JVF9ORFgKK3N0YXRpYyB2b2lkIGNoZXJyeXZpZXdfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBwaXBlOworCisJSTkxNV9XUklURShHRU44X01BU1RFUl9JUlEsIDApOworCVBPU1RJTkdfUkVBRChHRU44X01BU1RFUl9JUlEpOworCisJZ2VuOF9ndF9pcnFfcmVzZXQoZGV2X3ByaXYpOworCisJR0VONV9JUlFfUkVTRVQoR0VOOF9QQ1VfKTsKIAogCVBPU1RJTkdfUkVBRChHRU44X1BDVV9JSVIpOwogCi0JaWJ4X2lycV9wcmVpbnN0YWxsKGRldik7CisJSTkxNV9XUklURShEUElOVkdUVCwgRFBJTlZHVFRfU1RBVFVTX01BU0tfQ0hWKTsKKworCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX0VOLCAwKTsKKwlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19TVEFULCBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpKTsKKworCWZvcl9lYWNoX3BpcGUocGlwZSkKKwkJSTkxNV9XUklURShQSVBFU1RBVChwaXBlKSwgMHhmZmZmKTsKKworCUk5MTVfV1JJVEUoVkxWX0lNUiwgMHhmZmZmZmZmZik7CisJSTkxNV9XUklURShWTFZfSUVSLCAweDApOworCUk5MTVfV1JJVEUoVkxWX0lJUiwgMHhmZmZmZmZmZik7CisJUE9TVElOR19SRUFEKFZMVl9JSVIpOwogfQogCiBzdGF0aWMgdm9pZCBpYnhfaHBkX2lycV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMjkzMSwxNSArMzIzMiwxMiBAQAogCWlmIChIQVNfUENIX05PUChkZXYpKQogCQlyZXR1cm47CiAKLQlpZiAoSEFTX1BDSF9JQlgoZGV2KSkgeworCWlmIChIQVNfUENIX0lCWChkZXYpKQogCQltYXNrID0gU0RFX0dNQlVTIHwgU0RFX0FVWF9NQVNLIHwgU0RFX1BPSVNPTjsKLQl9IGVsc2UgeworCWVsc2UKIAkJbWFzayA9IFNERV9HTUJVU19DUFQgfCBTREVfQVVYX01BU0tfQ1BUOwogCi0JCUk5MTVfV1JJVEUoU0VSUl9JTlQsIEk5MTVfUkVBRChTRVJSX0lOVCkpOwotCX0KLQotCUk5MTVfV1JJVEUoU0RFSUlSLCBJOTE1X1JFQUQoU0RFSUlSKSk7CisJR0VONV9BU1NFUlRfSUlSX0lTX1pFUk8oU0RFSUlSKTsKIAlJOTE1X1dSSVRFKFNERUlNUiwgfm1hc2spOwogfQogCkBAIC0yOTY1LDEwICszMjYzLDcgQEAKIAkJZ3RfaXJxcyB8PSBHVF9CTFRfVVNFUl9JTlRFUlJVUFQgfCBHVF9CU0RfVVNFUl9JTlRFUlJVUFQ7CiAJfQogCi0JSTkxNV9XUklURShHVElJUiwgSTkxNV9SRUFEKEdUSUlSKSk7Ci0JSTkxNV9XUklURShHVElNUiwgZGV2X3ByaXYtPmd0X2lycV9tYXNrKTsKLQlJOTE1X1dSSVRFKEdUSUVSLCBndF9pcnFzKTsKLQlQT1NUSU5HX1JFQUQoR1RJRVIpOworCUdFTjVfSVJRX0lOSVQoR1QsIGRldl9wcml2LT5ndF9pcnFfbWFzaywgZ3RfaXJxcyk7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikgewogCQlwbV9pcnFzIHw9IGRldl9wcml2LT5wbV9ycHNfZXZlbnRzOwpAQCAtMjk3NywxMCArMzI3Miw3IEBACiAJCQlwbV9pcnFzIHw9IFBNX1ZFQk9YX1VTRVJfSU5URVJSVVBUOwogCiAJCWRldl9wcml2LT5wbV9pcnFfbWFzayA9IDB4ZmZmZmZmZmY7Ci0JCUk5MTVfV1JJVEUoR0VONl9QTUlJUiwgSTkxNV9SRUFEKEdFTjZfUE1JSVIpKTsKLQkJSTkxNV9XUklURShHRU42X1BNSU1SLCBkZXZfcHJpdi0+cG1faXJxX21hc2spOwotCQlJOTE1X1dSSVRFKEdFTjZfUE1JRVIsIHBtX2lycXMpOwotCQlQT1NUSU5HX1JFQUQoR0VONl9QTUlFUik7CisJCUdFTjVfSVJRX0lOSVQoR0VONl9QTSwgZGV2X3ByaXYtPnBtX2lycV9tYXNrLCBwbV9pcnFzKTsKIAl9CiB9CiAKQEAgLTI5OTcsOCArMzI4OSw2IEBACiAJCQkJREVfUExBTkVBX0ZMSVBfRE9ORV9JVkIgfCBERV9BVVhfQ0hBTk5FTF9BX0lWQik7CiAJCWV4dHJhX21hc2sgPSAoREVfUElQRUNfVkJMQU5LX0lWQiB8IERFX1BJUEVCX1ZCTEFOS19JVkIgfAogCQkJICAgICAgREVfUElQRUFfVkJMQU5LX0lWQiB8IERFX0VSUl9JTlRfSVZCKTsKLQotCQlJOTE1X1dSSVRFKEdFTjdfRVJSX0lOVCwgSTkxNV9SRUFEKEdFTjdfRVJSX0lOVCkpOwogCX0gZWxzZSB7CiAJCWRpc3BsYXlfbWFzayA9IChERV9NQVNURVJfSVJRX0NPTlRST0wgfCBERV9HU0UgfCBERV9QQ0hfRVZFTlQgfAogCQkJCURFX1BMQU5FQV9GTElQX0RPTkUgfCBERV9QTEFORUJfRkxJUF9ET05FIHwKQEAgLTMwMTEsMTEgKzMzMDEsMTEgQEAKIAogCWRldl9wcml2LT5pcnFfbWFzayA9IH5kaXNwbGF5X21hc2s7CiAKLQkvKiBzaG91bGQgYWx3YXlzIGNhbiBnZW5lcmF0ZSBpcnEgKi8KLQlJOTE1X1dSSVRFKERFSUlSLCBJOTE1X1JFQUQoREVJSVIpKTsKLQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+aXJxX21hc2spOwotCUk5MTVfV1JJVEUoREVJRVIsIGRpc3BsYXlfbWFzayB8IGV4dHJhX21hc2spOwotCVBPU1RJTkdfUkVBRChERUlFUik7CisJSTkxNV9XUklURShIV1NUQU0sIDB4ZWZmZSk7CisKKwlpYnhfaXJxX3ByZV9wb3N0aW5zdGFsbChkZXYpOworCisJR0VONV9JUlFfSU5JVChERSwgZGV2X3ByaXYtPmlycV9tYXNrLCBkaXNwbGF5X21hc2sgfCBleHRyYV9tYXNrKTsKIAogCWdlbjVfZ3RfaXJxX3Bvc3RpbnN0YWxsKGRldik7CiAKQEAgLTMxNzUsMjEgKzM0NjUsMTYgQEAKIAkJR1RfUkVOREVSX1VTRVJfSU5URVJSVVBUIDw8IEdFTjhfVkVDU19JUlFfU0hJRlQKIAkJfTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGd0X2ludGVycnVwdHMpOyBpKyspIHsKLQkJdTMyIHRtcCA9IEk5MTVfUkVBRChHRU44X0dUX0lJUihpKSk7Ci0JCWlmICh0bXApCi0JCQlEUk1fRVJST1IoIkludGVycnVwdCAoJWQpIHNob3VsZCBoYXZlIGJlZW4gbWFza2VkIGluIHByZS1pbnN0YWxsIDB4JTA4eFxuIiwKLQkJCQkgIGksIHRtcCk7Ci0JCUk5MTVfV1JJVEUoR0VOOF9HVF9JTVIoaSksIH5ndF9pbnRlcnJ1cHRzW2ldKTsKLQkJSTkxNV9XUklURShHRU44X0dUX0lFUihpKSwgZ3RfaW50ZXJydXB0c1tpXSk7Ci0JfQotCVBPU1RJTkdfUkVBRChHRU44X0dUX0lFUigwKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3RfaW50ZXJydXB0cyk7IGkrKykKKwkJR0VOOF9JUlFfSU5JVF9ORFgoR1QsIGksIH5ndF9pbnRlcnJ1cHRzW2ldLCBndF9pbnRlcnJ1cHRzW2ldKTsKKworCWRldl9wcml2LT5wbV9pcnFfbWFzayA9IDB4ZmZmZmZmZmY7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbjhfZGVfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQl1aW50MzJfdCBkZV9waXBlX21hc2tlZCA9IEdFTjhfUElQRV9GTElQX0RPTkUgfAorCXVpbnQzMl90IGRlX3BpcGVfbWFza2VkID0gR0VOOF9QSVBFX1BSSU1BUllfRkxJUF9ET05FIHwKIAkJR0VOOF9QSVBFX0NEQ0xLX0NSQ19ET05FIHwKIAkJR0VOOF9ERV9QSVBFX0lSUV9GQVVMVF9FUlJPUlM7CiAJdWludDMyX3QgZGVfcGlwZV9lbmFibGVzID0gZGVfcGlwZV9tYXNrZWQgfCBHRU44X1BJUEVfVkJMQU5LIHwKQEAgLTMxOTksMjUgKzM0ODQsMTkgQEAKIAlkZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9CXSA9IH5kZV9waXBlX21hc2tlZDsKIAlkZXZfcHJpdi0+ZGVfaXJxX21hc2tbUElQRV9DXSA9IH5kZV9waXBlX21hc2tlZDsKIAotCWZvcl9lYWNoX3BpcGUocGlwZSkgewotCQl1MzIgdG1wID0gSTkxNV9SRUFEKEdFTjhfREVfUElQRV9JSVIocGlwZSkpOwotCQlpZiAodG1wKQotCQkJRFJNX0VSUk9SKCJJbnRlcnJ1cHQgKCVkKSBzaG91bGQgaGF2ZSBiZWVuIG1hc2tlZCBpbiBwcmUtaW5zdGFsbCAweCUwOHhcbiIsCi0JCQkJICBwaXBlLCB0bXApOwotCQlJOTE1X1dSSVRFKEdFTjhfREVfUElQRV9JTVIocGlwZSksIGRldl9wcml2LT5kZV9pcnFfbWFza1twaXBlXSk7Ci0JCUk5MTVfV1JJVEUoR0VOOF9ERV9QSVBFX0lFUihwaXBlKSwgZGVfcGlwZV9lbmFibGVzKTsKLQl9Ci0JUE9TVElOR19SRUFEKEdFTjhfREVfUElQRV9JU1IoMCkpOworCWZvcl9lYWNoX3BpcGUocGlwZSkKKwkJR0VOOF9JUlFfSU5JVF9ORFgoREVfUElQRSwgcGlwZSwgZGV2X3ByaXYtPmRlX2lycV9tYXNrW3BpcGVdLAorCQkJCSAgZGVfcGlwZV9lbmFibGVzKTsKIAotCUk5MTVfV1JJVEUoR0VOOF9ERV9QT1JUX0lNUiwgfkdFTjhfQVVYX0NIQU5ORUxfQSk7Ci0JSTkxNV9XUklURShHRU44X0RFX1BPUlRfSUVSLCBHRU44X0FVWF9DSEFOTkVMX0EpOwotCVBPU1RJTkdfUkVBRChHRU44X0RFX1BPUlRfSUVSKTsKKwlHRU41X0lSUV9JTklUKEdFTjhfREVfUE9SVF8sIH5HRU44X0FVWF9DSEFOTkVMX0EsIEdFTjhfQVVYX0NIQU5ORUxfQSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2VuOF9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCisJaWJ4X2lycV9wcmVfcG9zdGluc3RhbGwoZGV2KTsKKwogCWdlbjhfZ3RfaXJxX3Bvc3RpbnN0YWxsKGRldl9wcml2KTsKIAlnZW44X2RlX2lycV9wb3N0aW5zdGFsbChkZXZfcHJpdik7CiAKQEAgLTMyMjksNDQgKzM1MDgsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaGVycnl2aWV3X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGVuYWJsZV9tYXNrID0gSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUIHwKKwkJSTkxNV9ESVNQTEFZX1BJUEVfQV9FVkVOVF9JTlRFUlJVUFQgfAorCQlJOTE1X0RJU1BMQVlfUElQRV9CX0VWRU5UX0lOVEVSUlVQVCB8CisJCUk5MTVfRElTUExBWV9QSVBFX0NfRVZFTlRfSU5URVJSVVBUOworCXUzMiBwaXBlc3RhdF9lbmFibGUgPSBQTEFORV9GTElQX0RPTkVfSU5UX1NUQVRVU19WTFYgfAorCQlQSVBFX0NSQ19ET05FX0lOVEVSUlVQVF9TVEFUVVM7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlpbnQgcGlwZTsKKworCS8qCisJICogTGVhdmUgdmJsYW5rIGludGVycnVwdHMgbWFza2VkIGluaXRpYWxseS4gIGVuYWJsZS9kaXNhYmxlIHdpbGwKKwkgKiB0b2dnbGUgdGhlbSBiYXNlZCBvbiB1c2FnZS4KKwkgKi8KKwlkZXZfcHJpdi0+aXJxX21hc2sgPSB+ZW5hYmxlX21hc2s7CisKKwlmb3JfZWFjaF9waXBlKHBpcGUpCisJCUk5MTVfV1JJVEUoUElQRVNUQVQocGlwZSksIDB4ZmZmZik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJaTkxNV9lbmFibGVfcGlwZXN0YXQoZGV2X3ByaXYsIFBJUEVfQSwgUElQRV9HTUJVU19JTlRFUlJVUFRfU1RBVFVTKTsKKwlmb3JfZWFjaF9waXBlKHBpcGUpCisJCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCBwaXBlLCBwaXBlc3RhdF9lbmFibGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCisJSTkxNV9XUklURShWTFZfSUlSLCAweGZmZmZmZmZmKTsKKwlJOTE1X1dSSVRFKFZMVl9JTVIsIGRldl9wcml2LT5pcnFfbWFzayk7CisJSTkxNV9XUklURShWTFZfSUVSLCBlbmFibGVfbWFzayk7CisKKwlnZW44X2d0X2lycV9wb3N0aW5zdGFsbChkZXZfcHJpdik7CisKKwlJOTE1X1dSSVRFKEdFTjhfTUFTVEVSX0lSUSwgTUFTVEVSX0lOVEVSUlVQVF9FTkFCTEUpOworCVBPU1RJTkdfUkVBRChHRU44X01BU1RFUl9JUlEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGdlbjhfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHBpcGU7CiAKIAlpZiAoIWRldl9wcml2KQogCQlyZXR1cm47CiAKLQlJOTE1X1dSSVRFKEdFTjhfTUFTVEVSX0lSUSwgMCk7CisJaW50ZWxfaHBkX2lycV91bmluc3RhbGwoZGV2X3ByaXYpOwogCi0jZGVmaW5lIEdFTjhfSVJRX0ZJTklfTkRYKHR5cGUsIHdoaWNoKSBkbyB7IFwKLQkJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lNUih3aGljaCksIDB4ZmZmZmZmZmYpOyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JRVIod2hpY2gpLCAwKTsgXAotCQlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUlSKHdoaWNoKSwgMHhmZmZmZmZmZik7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIEdFTjhfSVJRX0ZJTkkodHlwZSkgZG8geyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JTVIsIDB4ZmZmZmZmZmYpOyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JRVIsIDApOyBcCi0JCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JSVIsIDB4ZmZmZmZmZmYpOyBcCi0JfSB3aGlsZSAoMCkKLQotCUdFTjhfSVJRX0ZJTklfTkRYKEdULCAwKTsKLQlHRU44X0lSUV9GSU5JX05EWChHVCwgMSk7Ci0JR0VOOF9JUlFfRklOSV9ORFgoR1QsIDIpOwotCUdFTjhfSVJRX0ZJTklfTkRYKEdULCAzKTsKLQotCWZvcl9lYWNoX3BpcGUocGlwZSkgewotCQlHRU44X0lSUV9GSU5JX05EWChERV9QSVBFLCBwaXBlKTsKLQl9Ci0KLQlHRU44X0lSUV9GSU5JKERFX1BPUlQpOwotCUdFTjhfSVJRX0ZJTkkoREVfTUlTQyk7Ci0JR0VOOF9JUlFfRklOSShQQ1UpOwotI3VuZGVmIEdFTjhfSVJRX0ZJTkkKLSN1bmRlZiBHRU44X0lSUV9GSU5JX05EWAotCi0JUE9TVElOR19SRUFEKEdFTjhfUENVX0lJUik7CisJZ2VuOF9pcnFfcmVzZXQoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgdmFsbGV5dmlld19pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0zMjc4LDYgKzM1NjgsOCBAQAogCWlmICghZGV2X3ByaXYpCiAJCXJldHVybjsKIAorCUk5MTVfV1JJVEUoVkxWX01BU1RFUl9JRVIsIDApOworCiAJaW50ZWxfaHBkX2lycV91bmluc3RhbGwoZGV2X3ByaXYpOwogCiAJZm9yX2VhY2hfcGlwZShwaXBlKQpAQCAtMzMwMCw2ICszNTkyLDU3IEBACiAJUE9TVElOR19SRUFEKFZMVl9JRVIpOwogfQogCitzdGF0aWMgdm9pZCBjaGVycnl2aWV3X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBwaXBlOworCisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJSTkxNV9XUklURShHRU44X01BU1RFUl9JUlEsIDApOworCVBPU1RJTkdfUkVBRChHRU44X01BU1RFUl9JUlEpOworCisjZGVmaW5lIEdFTjhfSVJRX0ZJTklfTkRYKHR5cGUsIHdoaWNoKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lNUih3aGljaCksIDB4ZmZmZmZmZmYpOwlcCisJSTkxNV9XUklURShHRU44XyMjdHlwZSMjX0lFUih3aGljaCksIDApOwkJXAorCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JSVIod2hpY2gpLCAweGZmZmZmZmZmKTsJXAorCVBPU1RJTkdfUkVBRChHRU44XyMjdHlwZSMjX0lJUih3aGljaCkpOwkJCVwKKwlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUlSKHdoaWNoKSwgMHhmZmZmZmZmZik7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VOOF9JUlFfRklOSSh0eXBlKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSU1SLCAweGZmZmZmZmZmKTsJXAorCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JRVIsIDApOwkJXAorCUk5MTVfV1JJVEUoR0VOOF8jI3R5cGUjI19JSVIsIDB4ZmZmZmZmZmYpOwlcCisJUE9TVElOR19SRUFEKEdFTjhfIyN0eXBlIyNfSUlSKTsJCVwKKwlJOTE1X1dSSVRFKEdFTjhfIyN0eXBlIyNfSUlSLCAweGZmZmZmZmZmKTsJXAorfSB3aGlsZSAoMCkKKworCUdFTjhfSVJRX0ZJTklfTkRYKEdULCAwKTsKKwlHRU44X0lSUV9GSU5JX05EWChHVCwgMSk7CisJR0VOOF9JUlFfRklOSV9ORFgoR1QsIDIpOworCUdFTjhfSVJRX0ZJTklfTkRYKEdULCAzKTsKKworCUdFTjhfSVJRX0ZJTkkoUENVKTsKKworI3VuZGVmIEdFTjhfSVJRX0ZJTkkKKyN1bmRlZiBHRU44X0lSUV9GSU5JX05EWAorCisJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfRU4sIDApOworCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsIEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCkpOworCisJZm9yX2VhY2hfcGlwZShwaXBlKQorCQlJOTE1X1dSSVRFKFBJUEVTVEFUKHBpcGUpLCAweGZmZmYpOworCisJSTkxNV9XUklURShWTFZfSU1SLCAweGZmZmZmZmZmKTsKKwlJOTE1X1dSSVRFKFZMVl9JRVIsIDB4MCk7CisJSTkxNV9XUklURShWTFZfSUlSLCAweGZmZmZmZmZmKTsKKwlQT1NUSU5HX1JFQUQoVkxWX0lJUik7Cit9CisKIHN0YXRpYyB2b2lkIGlyb25sYWtlX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzMwOSwyNiArMzY1Miw3IEBACiAKIAlpbnRlbF9ocGRfaXJxX3VuaW5zdGFsbChkZXZfcHJpdik7CiAKLQlJOTE1X1dSSVRFKEhXU1RBTSwgMHhmZmZmZmZmZik7Ci0KLQlJOTE1X1dSSVRFKERFSU1SLCAweGZmZmZmZmZmKTsKLQlJOTE1X1dSSVRFKERFSUVSLCAweDApOwotCUk5MTVfV1JJVEUoREVJSVIsIEk5MTVfUkVBRChERUlJUikpOwotCWlmIChJU19HRU43KGRldikpCi0JCUk5MTVfV1JJVEUoR0VON19FUlJfSU5ULCBJOTE1X1JFQUQoR0VON19FUlJfSU5UKSk7Ci0KLQlJOTE1X1dSSVRFKEdUSU1SLCAweGZmZmZmZmZmKTsKLQlJOTE1X1dSSVRFKEdUSUVSLCAweDApOwotCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOwotCi0JaWYgKEhBU19QQ0hfTk9QKGRldikpCi0JCXJldHVybjsKLQotCUk5MTVfV1JJVEUoU0RFSU1SLCAweGZmZmZmZmZmKTsKLQlJOTE1X1dSSVRFKFNERUlFUiwgMHgwKTsKLQlJOTE1X1dSSVRFKFNERUlJUiwgSTkxNV9SRUFEKFNERUlJUikpOwotCWlmIChIQVNfUENIX0NQVChkZXYpIHx8IEhBU19QQ0hfTFBUKGRldikpCi0JCUk5MTVfV1JJVEUoU0VSUl9JTlQsIEk5MTVfUkVBRChTRVJSX0lOVCkpOworCWlyb25sYWtlX2lycV9yZXNldChkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBpOHh4X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQpAQCAtMzM4Niw3ICszNzEwLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiBmbGlwX3BlbmRpbmcgPSBESVNQTEFZX1BMQU5FX0ZMSVBfUEVORElORyhwbGFuZSk7CiAKLQlpZiAoIWRybV9oYW5kbGVfdmJsYW5rKGRldiwgcGlwZSkpCisJaWYgKCFpbnRlbF9waXBlX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKChpaXIgJiBmbGlwX3BlbmRpbmcpID09IDApCkBAIC0zNDEwLDcgKzM3MzQsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaTh4eF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGFyZzsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiBpaXIsIG5ld19paXI7CiAJdTMyIHBpcGVfc3RhdHNbMl07CkBAIC0zNTcxLDcgKzM4OTUsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGZsaXBfcGVuZGluZyA9IERJU1BMQVlfUExBTkVfRkxJUF9QRU5ESU5HKHBsYW5lKTsKIAotCWlmICghZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKSkKKwlpZiAoIWludGVsX3BpcGVfaGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoKGlpciAmIGZsaXBfcGVuZGluZykgPT0gMCkKQEAgLTM1OTUsNyArMzkxOSw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpOTE1X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXJnOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGlpciwgbmV3X2lpciwgcGlwZV9zdGF0c1tJOTE1X01BWF9QSVBFU107CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTM2MzYsMTYgKzM5NjAsOSBAQAogCQkJYnJlYWs7CiAKIAkJLyogQ29uc3VtZSBwb3J0LiAgVGhlbiBjbGVhciBJSVIgb3Igd2UnbGwgbWlzcyBldmVudHMgKi8KLQkJaWYgKChJOTE1X0hBU19IT1RQTFVHKGRldikpICYmCi0JCSAgICAoaWlyICYgSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUKSkgewotCQkJdTMyIGhvdHBsdWdfc3RhdHVzID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19TVEFUKTsKLQkJCXUzMiBob3RwbHVnX3RyaWdnZXIgPSBob3RwbHVnX3N0YXR1cyAmIEhPVFBMVUdfSU5UX1NUQVRVU19JOTE1OwotCi0JCQlpbnRlbF9ocGRfaXJxX2hhbmRsZXIoZGV2LCBob3RwbHVnX3RyaWdnZXIsIGhwZF9zdGF0dXNfaTkxNSk7Ci0KLQkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsIGhvdHBsdWdfc3RhdHVzKTsKLQkJCVBPU1RJTkdfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7Ci0JCX0KKwkJaWYgKEk5MTVfSEFTX0hPVFBMVUcoZGV2KSAmJgorCQkgICAgaWlyICYgSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUKQorCQkJaTl4eF9ocGRfaXJxX2hhbmRsZXIoZGV2KTsKIAogCQlJOTE1X1dSSVRFKElJUiwgaWlyICYgfmZsaXBfbWFzayk7CiAJCW5ld19paXIgPSBJOTE1X1JFQUQoSUlSKTsgLyogRmx1c2ggcG9zdGVkIHdyaXRlcyAqLwpAQCAtMzgzMiw3ICs0MTQ5LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGk5NjVfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhcmc7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgaWlyLCBuZXdfaWlyOwogCXUzMiBwaXBlX3N0YXRzW0k5MTVfTUFYX1BJUEVTXTsKQEAgLTM4NzksMjIgKzQxOTYsOCBAQAogCQlyZXQgPSBJUlFfSEFORExFRDsKIAogCQkvKiBDb25zdW1lIHBvcnQuICBUaGVuIGNsZWFyIElJUiBvciB3ZSdsbCBtaXNzIGV2ZW50cyAqLwotCQlpZiAoaWlyICYgSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUKSB7Ci0JCQl1MzIgaG90cGx1Z19zdGF0dXMgPSBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpOwotCQkJdTMyIGhvdHBsdWdfdHJpZ2dlciA9IGhvdHBsdWdfc3RhdHVzICYgKElTX0c0WChkZXYpID8KLQkJCQkJCQkJICBIT1RQTFVHX0lOVF9TVEFUVVNfRzRYIDoKLQkJCQkJCQkJICBIT1RQTFVHX0lOVF9TVEFUVVNfSTkxNSk7Ci0KLQkJCWludGVsX2hwZF9pcnFfaGFuZGxlcihkZXYsIGhvdHBsdWdfdHJpZ2dlciwKLQkJCQkJICAgICAgSVNfRzRYKGRldikgPyBocGRfc3RhdHVzX2c0eCA6IGhwZF9zdGF0dXNfaTkxNSk7Ci0KLQkJCWlmIChJU19HNFgoZGV2KSAmJgotCQkJICAgIChob3RwbHVnX3N0YXR1cyAmIERQX0FVWF9DSEFOTkVMX01BU0tfSU5UX1NUQVRVU19HNFgpKQotCQkJCWRwX2F1eF9pcnFfaGFuZGxlcihkZXYpOwotCi0JCQlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19TVEFULCBob3RwbHVnX3N0YXR1cyk7Ci0JCQlJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpOwotCQl9CisJCWlmIChpaXIgJiBJOTE1X0RJU1BMQVlfUE9SVF9JTlRFUlJVUFQpCisJCQlpOXh4X2hwZF9pcnFfaGFuZGxlcihkZXYpOwogCiAJCUk5MTVfV1JJVEUoSUlSLCBpaXIgJiB+ZmxpcF9tYXNrKTsKIAkJbmV3X2lpciA9IEk5MTVfUkVBRChJSVIpOyAvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICovCkBAIC0zOTk3LDcgKzQzMDAsNyBAQAogCQkJaWYgKGludGVsX2Nvbm5lY3Rvci0+ZW5jb2Rlci0+aHBkX3BpbiA9PSBpKSB7CiAJCQkJaWYgKGNvbm5lY3Rvci0+cG9sbGVkICE9IGludGVsX2Nvbm5lY3Rvci0+cG9sbGVkKQogCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJSZWVuYWJsaW5nIEhQRCBvbiBjb25uZWN0b3IgJXNcbiIsCi0JCQkJCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJCQkJIGNvbm5lY3Rvci0+bmFtZSk7CiAJCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBpbnRlbF9jb25uZWN0b3ItPnBvbGxlZDsKIAkJCQlpZiAoIWNvbm5lY3Rvci0+cG9sbGVkKQogCQkJCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CkBAIC00MDQ1LDcgKzQzNDgsMTUgQEAKIAkJZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uID0gaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zOwogCX0KIAotCWlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKKwlpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IGNoZXJyeXZpZXdfaXJxX2hhbmRsZXI7CisJCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGNoZXJyeXZpZXdfaXJxX3ByZWluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBjaGVycnl2aWV3X2lycV9wb3N0aW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBjaGVycnl2aWV3X2lycV91bmluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gdmFsbGV5dmlld19lbmFibGVfdmJsYW5rOworCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSB2YWxsZXl2aWV3X2Rpc2FibGVfdmJsYW5rOworCQlkZXZfcHJpdi0+ZGlzcGxheS5ocGRfaXJxX3NldHVwID0gaTkxNV9ocGRfaXJxX3NldHVwOworCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CiAJCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IHZhbGxleXZpZXdfaXJxX2hhbmRsZXI7CiAJCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IHZhbGxleXZpZXdfaXJxX3ByZWluc3RhbGw7CiAJCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSB2YWxsZXl2aWV3X2lycV9wb3N0aW5zdGFsbDsKQEAgLTQwNTUsNyArNDM2Niw3IEBACiAJCWRldl9wcml2LT5kaXNwbGF5LmhwZF9pcnFfc2V0dXAgPSBpOTE1X2hwZF9pcnFfc2V0dXA7CiAJfSBlbHNlIGlmIChJU19HRU44KGRldikpIHsKIAkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gZ2VuOF9pcnFfaGFuZGxlcjsKLQkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gZ2VuOF9pcnFfcHJlaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gZ2VuOF9pcnFfcmVzZXQ7CiAJCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBnZW44X2lycV9wb3N0aW5zdGFsbDsKIAkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBnZW44X2lycV91bmluc3RhbGw7CiAJCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gZ2VuOF9lbmFibGVfdmJsYW5rOwpAQCAtNDA2Myw3ICs0Mzc0LDcgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cCA9IGlieF9ocGRfaXJxX3NldHVwOwogCX0gZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IGlyb25sYWtlX2lycV9oYW5kbGVyOwotCQlkZXYtPmRyaXZlci0+aXJxX3ByZWluc3RhbGwgPSBpcm9ubGFrZV9pcnFfcHJlaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaXJvbmxha2VfaXJxX3Jlc2V0OwogCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsOwogCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGlyb25sYWtlX2lycV91bmluc3RhbGw7CiAJCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaXJvbmxha2VfZW5hYmxlX3ZibGFuazsKQEAgLTQxMjEsNTcgKzQ0MzIsMjAgQEAKIH0KIAogLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiBhbGxvdyBydW50aW1lIFBNLiAqLwotdm9pZCBoc3dfcnVudGltZV9wbV9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3ZvaWQgaW50ZWxfcnVudGltZV9wbV9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7Ci0KLQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5kZWltciA9IEk5MTVfUkVBRChERUlNUik7Ci0JZGV2X3ByaXYtPnBtLnJlZ3NhdmUuc2RlaW1yID0gSTkxNV9SRUFEKFNERUlNUik7Ci0JZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZ3RpbXIgPSBJOTE1X1JFQUQoR1RJTVIpOwotCWRldl9wcml2LT5wbS5yZWdzYXZlLmd0aWVyID0gSTkxNV9SRUFEKEdUSUVSKTsKLQlkZXZfcHJpdi0+cG0ucmVnc2F2ZS5nZW42X3BtaW1yID0gSTkxNV9SRUFEKEdFTjZfUE1JTVIpOwotCi0JaXJvbmxha2VfZGlzYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgMHhmZmZmZmZmZik7Ci0JaWJ4X2Rpc2FibGVfZGlzcGxheV9pbnRlcnJ1cHQoZGV2X3ByaXYsIDB4ZmZmZmZmZmYpOwotCWlsa19kaXNhYmxlX2d0X2lycShkZXZfcHJpdiwgMHhmZmZmZmZmZik7Ci0Jc25iX2Rpc2FibGVfcG1faXJxKGRldl9wcml2LCAweGZmZmZmZmZmKTsKLQorCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsKGRldik7CiAJZGV2X3ByaXYtPnBtLmlycXNfZGlzYWJsZWQgPSB0cnVlOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKIC8qIFJlc3RvcmUgaW50ZXJydXB0cyBzbyB3ZSBjYW4gcmVjb3ZlciBmcm9tIHJ1bnRpbWUgUE0uICovCi12b2lkIGhzd19ydW50aW1lX3BtX3Jlc3RvcmVfaW50ZXJydXB0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQordm9pZCBpbnRlbF9ydW50aW1lX3BtX3Jlc3RvcmVfaW50ZXJydXB0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQl1aW50MzJfdCB2YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7Ci0KLQl2YWwgPSBJOTE1X1JFQUQoREVJTVIpOwotCVdBUk4odmFsICE9IDB4ZmZmZmZmZmYsICJERUlNUiBpcyAweCUwOHhcbiIsIHZhbCk7Ci0KLQl2YWwgPSBJOTE1X1JFQUQoU0RFSU1SKTsKLQlXQVJOKHZhbCAhPSAweGZmZmZmZmZmLCAiU0RFSU1SIGlzIDB4JTA4eFxuIiwgdmFsKTsKLQotCXZhbCA9IEk5MTVfUkVBRChHVElNUik7Ci0JV0FSTih2YWwgIT0gMHhmZmZmZmZmZiwgIkdUSU1SIGlzIDB4JTA4eFxuIiwgdmFsKTsKLQotCXZhbCA9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKLQlXQVJOKHZhbCAhPSAweGZmZmZmZmZmLCAiR0VONl9QTUlNUiBpcyAweCUwOHhcbiIsIHZhbCk7CiAKIAlkZXZfcHJpdi0+cG0uaXJxc19kaXNhYmxlZCA9IGZhbHNlOwotCi0JaXJvbmxha2VfZW5hYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCB+ZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZGVpbXIpOwotCWlieF9lbmFibGVfZGlzcGxheV9pbnRlcnJ1cHQoZGV2X3ByaXYsIH5kZXZfcHJpdi0+cG0ucmVnc2F2ZS5zZGVpbXIpOwotCWlsa19lbmFibGVfZ3RfaXJxKGRldl9wcml2LCB+ZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZ3RpbXIpOwotCXNuYl9lbmFibGVfcG1faXJxKGRldl9wcml2LCB+ZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZ2VuNl9wbWltcik7Ci0JSTkxNV9XUklURShHVElFUiwgZGV2X3ByaXYtPnBtLnJlZ3NhdmUuZ3RpZXIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKGRldik7CisJZGV2LT5kcml2ZXItPmlycV9wb3N0aW5zdGFsbChkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9wYXJhbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcGFyYW1zLmMKaW5kZXggZDFkNzk4MGYuLmQwNWEyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcGFyYW1zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9wYXJhbXMuYwpAQCAtNDYsNyArNDYsOCBAQAogCS5yZXNldCA9IHRydWUsCiAJLmludmVydF9icmlnaHRuZXNzID0gMCwKIAkuZGlzYWJsZV9kaXNwbGF5ID0gMCwKLQkuZW5hYmxlX2NtZF9wYXJzZXIgPSAwLAorCS5lbmFibGVfY21kX3BhcnNlciA9IDEsCisJLmRpc2FibGVfdnRkX3dhID0gMCwKIH07CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChtb2Rlc2V0LCBpOTE1Lm1vZGVzZXQsIGludCwgMDQwMCk7CkBAIC0xNDksNiArMTUwLDkgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2Rpc3BsYXksIGk5MTUuZGlzYWJsZV9kaXNwbGF5LCBib29sLCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9kaXNwbGF5LCAiRGlzYWJsZSBkaXNwbGF5IChkZWZhdWx0OiBmYWxzZSkiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfdnRkX3dhLCBpOTE1LmRpc2FibGVfdnRkX3dhLCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV92dGRfd2EsICJEaXNhYmxlIGFsbCBWVC1kIHdvcmthcm91bmRzIChkZWZhdWx0OiBmYWxzZSkiKTsKKwogbW9kdWxlX3BhcmFtX25hbWVkKGVuYWJsZV9jbWRfcGFyc2VyLCBpOTE1LmVuYWJsZV9jbWRfcGFyc2VyLCBpbnQsIDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfY21kX3BhcnNlciwKLQkJICJFbmFibGUgY29tbWFuZCBwYXJzaW5nICgxPWVuYWJsZWQsIDA9ZGlzYWJsZWQgW2RlZmF1bHRdKSIpOworCQkgIkVuYWJsZSBjb21tYW5kIHBhcnNpbmcgKDE9ZW5hYmxlZCBbZGVmYXVsdF0sIDA9ZGlzYWJsZWQpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBjNzdhZjY5Li5lNjkxYjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTI5LDYgKzI5LDggQEAKICNkZWZpbmUgX1RSQU5TQ09ERVIodHJhbiwgYSwgYikgKChhKSArICh0cmFuKSooKGIpLShhKSkpCiAKICNkZWZpbmUgX1BPUlQocG9ydCwgYSwgYikgKChhKSArIChwb3J0KSooKGIpLShhKSkpCisjZGVmaW5lIF9QSVBFMyhwaXBlLCBhLCBiLCBjKSAocGlwZSA8IDIgPyBfUElQRShwaXBlLCBhLCBiKSA6IGMpCisjZGVmaW5lIF9QT1JUMyhwb3J0LCBhLCBiLCBjKSAocG9ydCA8IDIgPyBfUE9SVChwb3J0LCBhLCBiKSA6IGMpCiAKICNkZWZpbmUgX01BU0tFRF9CSVRfRU5BQkxFKGEpICgoKGEpIDw8IDE2KSB8IChhKSkKICNkZWZpbmUgX01BU0tFRF9CSVRfRElTQUJMRShhKSAoKGEpIDw8IDE2KQpAQCAtNzcsMTMgKzc5LDE5IEBACiAKIC8qIEdyYXBoaWNzIHJlc2V0IHJlZ3MgKi8KICNkZWZpbmUgSTk2NV9HRFJTVCAweGMwIC8qIFBDSSBjb25maWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUxLX0dEU1IgMHgyY2E0IC8qIE1DSEJBUiBvZmZzZXQgKi8KICNkZWZpbmUgIEdSRE9NX0ZVTEwJKDA8PDIpCiAjZGVmaW5lICBHUkRPTV9SRU5ERVIJKDE8PDIpCiAjZGVmaW5lICBHUkRPTV9NRURJQQkoMzw8MikKICNkZWZpbmUgIEdSRE9NX01BU0sJKDM8PDIpCiAjZGVmaW5lICBHUkRPTV9SRVNFVF9FTkFCTEUgKDE8PDApCiAKKyNkZWZpbmUgSUxLX0dEU1IgMHgyY2E0IC8qIE1DSEJBUiBvZmZzZXQgKi8KKyNkZWZpbmUgIElMS19HUkRPTV9GVUxMCQkoMDw8MSkKKyNkZWZpbmUgIElMS19HUkRPTV9SRU5ERVIJKDE8PDEpCisjZGVmaW5lICBJTEtfR1JET01fTUVESUEJKDM8PDEpCisjZGVmaW5lICBJTEtfR1JET01fTUFTSwkJKDM8PDEpCisjZGVmaW5lICBJTEtfR1JET01fUkVTRVRfRU5BQkxFICgxPDwwKQorCiAjZGVmaW5lIEdFTjZfTUJDVU5JVF9TTlBDUgkweDkwMGMgLyogZm9yIExMQyBjb25maWcgKi8KICNkZWZpbmUgICBHRU42X01CQ19TTlBDUl9TSElGVAkyMQogI2RlZmluZSAgIEdFTjZfTUJDX1NOUENSX01BU0sJKDM8PDIxKQpAQCAtOTIsNiArMTAwLDkgQEAKICNkZWZpbmUgICBHRU42X01CQ19TTlBDUl9MT1cJKDI8PDIxKQogI2RlZmluZSAgIEdFTjZfTUJDX1NOUENSX01JTgkoMzw8MjEpIC8qIG9ubHkgMS8xNnRoIG9mIHRoZSBjYWNoZSBpcyBzaGFyZWQgKi8KIAorI2RlZmluZSBWTFZfRzNEQ1RMCQkweDkwMjQKKyNkZWZpbmUgVkxWX0dTQ0tHQ1RMCQkweDkwMjgKKwogI2RlZmluZSBHRU42X01CQ1RMCQkweDA5MDdjCiAjZGVmaW5lICAgR0VONl9NQkNUTF9FTkFCTEVfQk9PVF9GRVRDSAkoMSA8PCA0KQogI2RlZmluZSAgIEdFTjZfTUJDVExfQ1RYX0ZFVENIX05FRURFRAkoMSA8PCAzKQpAQCAtMTkwLDYgKzIwMSw4IEBACiAgKiBNZW1vcnkgaW50ZXJmYWNlIGluc3RydWN0aW9ucyB1c2VkIGJ5IHRoZSBrZXJuZWwKICAqLwogI2RlZmluZSBNSV9JTlNUUihvcGNvZGUsIGZsYWdzKSAoKChvcGNvZGUpIDw8IDIzKSB8IChmbGFncykpCisvKiBNYW55IE1JIGNvbW1hbmRzIHVzZSBiaXQgMjIgb2YgdGhlIGhlYWRlciBkd29yZCBmb3IgR0dUVCB2cyBQUEdUVCAqLworI2RlZmluZSAgTUlfR0xPQkFMX0dUVCAgICAoMTw8MjIpCiAKICNkZWZpbmUgTUlfTk9PUAkJCU1JX0lOU1RSKDAsIDApCiAjZGVmaW5lIE1JX1VTRVJfSU5URVJSVVBUCU1JX0lOU1RSKDB4MDIsIDApCkBAIC0yNDQsNyArMjU3LDggQEAKICNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19CVkUJICAgICgwPDwxNikgLyogVkVDUyB3YWl0IGZvciBCQ1MgIChWRUJTWU5DKSAqLwogI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TWU5DX1ZWRQkgICAgKDE8PDE2KSAvKiBWRUNTIHdhaXQgZm9yIFZDUyAgKFZFVlNZTkMpICovCiAjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfUlZFCSAgICAoMjw8MTYpIC8qIFZFQ1Mgd2FpdCBmb3IgUkNTICAoVkVSU1lOQykgKi8KLSNkZWZpbmUgICBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEICAoMzw8MTYpCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRCAoMzw8MTYpCisjZGVmaW5lICAgTUlfU0VNQVBIT1JFX1NZTkNfTUFTSyAgICAoMzw8MTYpCiAjZGVmaW5lIE1JX1NFVF9DT05URVhUCQlNSV9JTlNUUigweDE4LCAwKQogI2RlZmluZSAgIE1JX01NX1NQQUNFX0dUVAkJKDE8PDgpCiAjZGVmaW5lICAgTUlfTU1fU1BBQ0VfUEhZU0lDQUwJCSgwPDw4KQpAQCAtMjYyLDEzICsyNzYsMTYgQEAKICAqIC0gT25lIGNhbiBhY3R1YWxseSBsb2FkIGFyYml0cmFyeSBtYW55IGFyYml0cmFyeSByZWdpc3RlcnM6IFNpbXBseSBpc3N1ZSB4CiAgKiAgIGFkZHJlc3MvdmFsdWUgcGFpcnMuIERvbid0IG92ZXJkdWUgaXQsIHRob3VnaCwgeCA8PSAyXjQgbXVzdCBob2xkIQogICovCi0jZGVmaW5lIE1JX0xPQURfUkVHSVNURVJfSU1NKHgpCU1JX0lOU1RSKDB4MjIsIDIqeC0xKQotI2RlZmluZSBNSV9TVE9SRV9SRUdJU1RFUl9NRU0oeCkgTUlfSU5TVFIoMHgyNCwgMip4LTEpCisjZGVmaW5lIE1JX0xPQURfUkVHSVNURVJfSU1NKHgpCU1JX0lOU1RSKDB4MjIsIDIqKHgpLTEpCisjZGVmaW5lIE1JX1NUT1JFX1JFR0lTVEVSX01FTSh4KSBNSV9JTlNUUigweDI0LCAyKih4KS0xKQorI2RlZmluZSBNSV9TVE9SRV9SRUdJU1RFUl9NRU1fR0VOOCh4KSBNSV9JTlNUUigweDI0LCAzKih4KS0xKQogI2RlZmluZSAgIE1JX1NSTV9MUk1fR0xPQkFMX0dUVAkJKDE8PDIyKQogI2RlZmluZSBNSV9GTFVTSF9EVwkJTUlfSU5TVFIoMHgyNiwgMSkgLyogZm9yIEdFTjYgKi8KICNkZWZpbmUgICBNSV9GTFVTSF9EV19TVE9SRV9JTkRFWAkoMTw8MjEpCiAjZGVmaW5lICAgTUlfSU5WQUxJREFURV9UTEIJCSgxPDwxOCkKICNkZWZpbmUgICBNSV9GTFVTSF9EV19PUF9TVE9SRURXCSgxPDwxNCkKKyNkZWZpbmUgICBNSV9GTFVTSF9EV19PUF9NQVNLCQkoMzw8MTQpCisjZGVmaW5lICAgTUlfRkxVU0hfRFdfTk9USUZZCQkoMTw8OCkKICNkZWZpbmUgICBNSV9JTlZBTElEQVRFX0JTRAkJKDE8PDcpCiAjZGVmaW5lICAgTUlfRkxVU0hfRFdfVVNFX0dUVAkJKDE8PDIpCiAjZGVmaW5lICAgTUlfRkxVU0hfRFdfVVNFX1BQR1RUCQkoMDw8MikKQEAgLTMzMCw5ICszNDcsMTIgQEAKICNkZWZpbmUgICBESVNQTEFZX1BMQU5FX0IgICAgICAgICAgICgxPDwyMCkKICNkZWZpbmUgR0ZYX09QX1BJUEVfQ09OVFJPTChsZW4pCSgoMHgzPDwyOSl8KDB4Mzw8MjcpfCgweDI8PDI0KXwobGVuLTIpKQogI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUX0lWQgkJCSgxPDwyNCkgLyogZ2VuNysgKi8KKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfTU1JT19XUklURQkJCSgxPDwyMykKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfU1RPUkVfREFUQV9JTkRFWAkJCSgxPDwyMSkKICNkZWZpbmUgICBQSVBFX0NPTlRST0xfQ1NfU1RBTEwJCQkJKDE8PDIwKQogI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9UTEJfSU5WQUxJREFURQkJCSgxPDwxOCkKICNkZWZpbmUgICBQSVBFX0NPTlRST0xfUVdfV1JJVEUJCQkJKDE8PDE0KQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9QT1NUX1NZTkNfT1BfTUFTSyAgICAgICAgICAgICAgICAoMzw8MTQpCiAjZGVmaW5lICAgUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMCQkJKDE8PDEzKQogI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9XUklURV9GTFVTSAkJCSgxPDwxMikKICNkZWZpbmUgICBQSVBFX0NPTlRST0xfUkVOREVSX1RBUkdFVF9DQUNIRV9GTFVTSAkoMTw8MTIpIC8qIGdlbjYrICovCkBAIC0zNDcsNiArMzY3LDk0IEBACiAjZGVmaW5lICAgUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNICQkoMTw8MCkKICNkZWZpbmUgICBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCAoMTw8MikgLyogaW4gYWRkciBkd29yZCAqLwogCisvKgorICogQ29tbWFuZHMgdXNlZCBvbmx5IGJ5IHRoZSBjb21tYW5kIHBhcnNlcgorICovCisjZGVmaW5lIE1JX1NFVF9QUkVESUNBVEUgICAgICAgIE1JX0lOU1RSKDB4MDEsIDApCisjZGVmaW5lIE1JX0FSQl9DSEVDSyAgICAgICAgICAgIE1JX0lOU1RSKDB4MDUsIDApCisjZGVmaW5lIE1JX1JTX0NPTlRST0wgICAgICAgICAgIE1JX0lOU1RSKDB4MDYsIDApCisjZGVmaW5lIE1JX1VSQl9BVE9NSUNfQUxMT0MgICAgIE1JX0lOU1RSKDB4MDksIDApCisjZGVmaW5lIE1JX1BSRURJQ0FURSAgICAgICAgICAgIE1JX0lOU1RSKDB4MEMsIDApCisjZGVmaW5lIE1JX1JTX0NPTlRFWFQgICAgICAgICAgIE1JX0lOU1RSKDB4MEYsIDApCisjZGVmaW5lIE1JX1RPUE9MT0dZX0ZJTFRFUiAgICAgIE1JX0lOU1RSKDB4MEQsIDApCisjZGVmaW5lIE1JX0xPQURfU0NBTl9MSU5FU19FWENMIE1JX0lOU1RSKDB4MTMsIDApCisjZGVmaW5lIE1JX1VSQl9DTEVBUiAgICAgICAgICAgIE1JX0lOU1RSKDB4MTksIDApCisjZGVmaW5lIE1JX1VQREFURV9HVFQgICAgICAgICAgIE1JX0lOU1RSKDB4MjMsIDApCisjZGVmaW5lIE1JX0NMRkxVU0ggICAgICAgICAgICAgIE1JX0lOU1RSKDB4MjcsIDApCisjZGVmaW5lIE1JX1JFUE9SVF9QRVJGX0NPVU5UICAgIE1JX0lOU1RSKDB4MjgsIDApCisjZGVmaW5lICAgTUlfUkVQT1JUX1BFUkZfQ09VTlRfR0dUVCAoMTw8MCkKKyNkZWZpbmUgTUlfTE9BRF9SRUdJU1RFUl9NRU0gICAgTUlfSU5TVFIoMHgyOSwgMCkKKyNkZWZpbmUgTUlfTE9BRF9SRUdJU1RFUl9SRUcgICAgTUlfSU5TVFIoMHgyQSwgMCkKKyNkZWZpbmUgTUlfUlNfU1RPUkVfREFUQV9JTU0gICAgTUlfSU5TVFIoMHgyQiwgMCkKKyNkZWZpbmUgTUlfTE9BRF9VUkJfTUVNICAgICAgICAgTUlfSU5TVFIoMHgyQywgMCkKKyNkZWZpbmUgTUlfU1RPUkVfVVJCX01FTSAgICAgICAgTUlfSU5TVFIoMHgyRCwgMCkKKyNkZWZpbmUgTUlfQ09ORElUSU9OQUxfQkFUQ0hfQlVGRkVSX0VORCBNSV9JTlNUUigweDM2LCAwKQorCisjZGVmaW5lIFBJUEVMSU5FX1NFTEVDVCAgICAgICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDE8PDI3KXwoMHgxPDwyNCl8KDB4NDw8MTYpKQorI2RlZmluZSBHRlhfT1BfM0RTVEFURV9WRl9TVEFUSVNUSUNTICAgKCgweDM8PDI5KXwoMHgxPDwyNyl8KDB4MDw8MjQpfCgweEI8PDE2KSkKKyNkZWZpbmUgTUVESUFfVkZFX1NUQVRFICAgICAgICAgICAgICAgICgoMHgzPDwyOSl8KDB4Mjw8MjcpfCgweDA8PDI0KXwoMHgwPDwxNikpCisjZGVmaW5lICBNRURJQV9WRkVfU1RBVEVfTU1JT19BQ0NFU1NfTUFTSyAoMHgxOCkKKyNkZWZpbmUgR1BHUFVfT0JKRUNUICAgICAgICAgICAgICAgICAgICgoMHgzPDwyOSl8KDB4Mjw8MjcpfCgweDE8PDI0KXwoMHg0PDwxNikpCisjZGVmaW5lIEdQR1BVX1dBTEtFUiAgICAgICAgICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDI8PDI3KXwoMHgxPDwyNCl8KDB4NTw8MTYpKQorI2RlZmluZSBHRlhfT1BfM0RTVEFURV9EWDlfQ09OU1RBTlRGX1ZTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4Mzk8PDE2KSkKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfRFg5X0NPTlNUQU5URl9QUyBcCisJKCgweDM8PDI5KXwoMHgzPDwyNyl8KDB4MDw8MjQpfCgweDNBPDwxNikpCisjZGVmaW5lIEdGWF9PUF8zRFNUQVRFX1NPX0RFQ0xfTElTVCBcCisJKCgweDM8PDI5KXwoMHgzPDwyNyl8KDB4MTw8MjQpfCgweDE3PDwxNikpCisKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX1ZTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4NDM8PDE2KSkKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX0dTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4NDQ8PDE2KSkKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX0hTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4NDU8PDE2KSkKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX0RTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4NDY8PDE2KSkKKyNkZWZpbmUgR0ZYX09QXzNEU1RBVEVfQklORElOR19UQUJMRV9FRElUX1BTIFwKKwkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgwPDwyNCl8KDB4NDc8PDE2KSkKKworI2RlZmluZSBNRlhfV0FJVCAgKCgweDM8PDI5KXwoMHgxPDwyNyl8KDB4MDw8MTYpKQorCisjZGVmaW5lIENPTE9SX0JMVCAgICAgKCgweDI8PDI5KXwoMHg0MDw8MjIpKQorI2RlZmluZSBTUkNfQ09QWV9CTFQgICgoMHgyPDwyOSl8KDB4NDM8PDIyKSkKKworLyoKKyAqIFJlZ2lzdGVycyB1c2VkIG9ubHkgYnkgdGhlIGNvbW1hbmQgcGFyc2VyCisgKi8KKyNkZWZpbmUgQkNTX1NXQ1RSTCAweDIyMjAwCisKKyNkZWZpbmUgSFNfSU5WT0NBVElPTl9DT1VOVCAweDIzMDAKKyNkZWZpbmUgRFNfSU5WT0NBVElPTl9DT1VOVCAweDIzMDgKKyNkZWZpbmUgSUFfVkVSVElDRVNfQ09VTlQgICAweDIzMTAKKyNkZWZpbmUgSUFfUFJJTUlUSVZFU19DT1VOVCAweDIzMTgKKyNkZWZpbmUgVlNfSU5WT0NBVElPTl9DT1VOVCAweDIzMjAKKyNkZWZpbmUgR1NfSU5WT0NBVElPTl9DT1VOVCAweDIzMjgKKyNkZWZpbmUgR1NfUFJJTUlUSVZFU19DT1VOVCAweDIzMzAKKyNkZWZpbmUgQ0xfSU5WT0NBVElPTl9DT1VOVCAweDIzMzgKKyNkZWZpbmUgQ0xfUFJJTUlUSVZFU19DT1VOVCAweDIzNDAKKyNkZWZpbmUgUFNfSU5WT0NBVElPTl9DT1VOVCAweDIzNDgKKyNkZWZpbmUgUFNfREVQVEhfQ09VTlQgICAgICAweDIzNTAKKworLyogVGhlcmUgYXJlIHRoZSA0IDY0LWJpdCBjb3VudGVyIHJlZ2lzdGVycywgb25lIGZvciBlYWNoIHN0cmVhbSBvdXRwdXQgKi8KKyNkZWZpbmUgR0VON19TT19OVU1fUFJJTVNfV1JJVFRFTihuKSAoMHg1MjAwICsgKG4pICogOCkKKworI2RlZmluZSBHRU43X1NPX1BSSU1fU1RPUkFHRV9ORUVERUQobikgICgweDUyNDAgKyAobikgKiA4KQorCisjZGVmaW5lIEdFTjdfM0RQUklNX0VORF9PRkZTRVQgICAgICAgICAgMHgyNDIwCisjZGVmaW5lIEdFTjdfM0RQUklNX1NUQVJUX1ZFUlRFWCAgICAgICAgMHgyNDMwCisjZGVmaW5lIEdFTjdfM0RQUklNX1ZFUlRFWF9DT1VOVCAgICAgICAgMHgyNDM0CisjZGVmaW5lIEdFTjdfM0RQUklNX0lOU1RBTkNFX0NPVU5UICAgICAgMHgyNDM4CisjZGVmaW5lIEdFTjdfM0RQUklNX1NUQVJUX0lOU1RBTkNFICAgICAgMHgyNDNDCisjZGVmaW5lIEdFTjdfM0RQUklNX0JBU0VfVkVSVEVYICAgICAgICAgMHgyNDQwCisKKyNkZWZpbmUgT0FDT05UUk9MIDB4MjM2MAorCisjZGVmaW5lIF9HRU43X1BJUEVBX0RFX0xPQURfU0wJMHg3MDA2OAorI2RlZmluZSBfR0VON19QSVBFQl9ERV9MT0FEX1NMCTB4NzEwNjgKKyNkZWZpbmUgR0VON19QSVBFX0RFX0xPQURfU0wocGlwZSkgX1BJUEUocGlwZSwgXAorCQkJCQkgX0dFTjdfUElQRUFfREVfTE9BRF9TTCwgXAorCQkJCQkgX0dFTjdfUElQRUJfREVfTE9BRF9TTCkKIAogLyoKICAqIFJlc2V0IHJlZ2lzdGVycwpAQCAtMzcwLDYgKzQ3OCw3IEBACiAjZGVmaW5lICAgSU9TRl9QT1JUX1BVTklUCQkJMHg0CiAjZGVmaW5lICAgSU9TRl9QT1JUX05DCQkJCTB4MTEKICNkZWZpbmUgICBJT1NGX1BPUlRfRFBJTwkJCTB4MTIKKyNkZWZpbmUgICBJT1NGX1BPUlRfRFBJT18yCQkJMHgxYQogI2RlZmluZSAgIElPU0ZfUE9SVF9HUElPX05DCQkJMHgxMwogI2RlZmluZSAgIElPU0ZfUE9SVF9DQ0sJCQkJMHgxNAogI2RlZmluZSAgIElPU0ZfUE9SVF9DQ1UJCQkJMHhBOQpAQCAtMzgxLDkgKzQ5MCw2IEBACiAvKiBTZWUgY29uZmlnZGIgYnVuaXQgU0IgYWRkciBtYXAgKi8KICNkZWZpbmUgQlVOSVRfUkVHX0JJU09DCQkJCTB4MTEKIAotI2RlZmluZSBQVU5JVF9PUENPREVfUkVHX1JFQUQJCQk2Ci0jZGVmaW5lIFBVTklUX09QQ09ERV9SRUdfV1JJVEUJCQk3Ci0KICNkZWZpbmUgUFVOSVRfUkVHX0RTUEZSRVEJCQkweDM2CiAjZGVmaW5lICAgRFNQRlJFUVNUQVRfU0hJRlQJCQkzMAogI2RlZmluZSAgIERTUEZSRVFTVEFUX01BU0sJCQkoMHgzIDw8IERTUEZSRVFTVEFUX1NISUZUKQpAQCAtNDY5LDE2ICs1NzUsOTEgQEAKICNkZWZpbmUgIERTSV9QTExfTTFfRElWX01BU0sJCQkoMHgxZmYgPDwgMCkKICNkZWZpbmUgQ0NLX0RJU1BMQVlfQ0xPQ0tfQ09OVFJPTAkJMHg2YgogCisvKioKKyAqIERPQzogRFBJTworICoKKyAqIFZMViBhbmQgQ0hWIGhhdmUgc2xpZ2h0bHkgcGVjdWxpYXIgZGlzcGxheSBQSFlzIGZvciBkcml2aW5nIERQL0hETUkKKyAqIHBvcnRzLiBEUElPIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHN1Y2ggYSBkaXNwbGF5IFBIWS4gVGhlc2UgUEhZcworICogZG9uJ3QgZm9sbG93IHRoZSBzdGFuZGFyZCBwcm9ncmFtbWluZyBtb2RlbCB1c2luZyBkaXJlY3QgTU1JTworICogcmVnaXN0ZXJzLCBhbmQgaW5zdGVhZCB0aGVpciByZWdpc3RlcnMgbXVzdCBiZSBhY2Nlc3NlZCB0cm91Z2ggSU9TRgorICogc2lkZWJhbmQuIFZMViBoYXMgb25lIHN1Y2ggUEhZIGZvciBkcml2aW5nIHBvcnRzIEIgYW5kIEMsIGFuZCBDSFYKKyAqIGFkZHMgYW5vdGhlciBQSFkgZm9yIGRyaXZpbmcgcG9ydCBELiBFYWNoIFBIWSByZXNwb25kcyB0byBzcGVjaWZpYworICogSU9TRi1TQiBwb3J0LgorICoKKyAqIEVhY2ggZGlzcGxheSBQSFkgaXMgbWFkZSB1cCBvZiBvbmUgb3IgdHdvIGNoYW5uZWxzLiBFYWNoIGNoYW5uZWwKKyAqIGhvdXNlcyBhIGNvbW1vbiBsYW5lIHBhcnQgd2hpY2ggY29udGFpbnMgdGhlIFBMTCBhbmQgb3RoZXIgY29tbW9uCisgKiBsb2dpYy4gQ0gwIGNvbW1vbiBsYW5lIGFsc28gY29udGFpbnMgdGhlIElPU0YtU0IgbG9naWMgZm9yIHRoZQorICogQ29tbW9uIFJlZ2lzdGVyIEludGVyZmFjZSAoQ1JJKSBpZS4gdGhlIERQSU8gcmVnaXN0ZXJzLiBDUkkgY2xvY2sKKyAqIG11c3QgYmUgcnVubmluZyB3aGVuIGFueSBEUElPIHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQuCisgKgorICogSW4gYWRkaXRpb24gdG8gaGF2aW5nIHRoZWlyIG93biByZWdpc3RlcnMsIHRoZSBQSFlzIGFyZSBhbHNvCisgKiBjb250cm9sbGVkIHRocm91Z2ggc29tZSBkZWRpY2F0ZWQgc2lnbmFscyBmcm9tIHRoZSBkaXNwbGF5CisgKiBjb250cm9sbGVyLiBUaGVzZSBpbmNsdWRlIFBMTCByZWZlcmVuY2UgY2xvY2sgZW5hYmxlLCBQTEwgZW5hYmxlLAorICogYW5kIENSSSBjbG9jayBzZWxlY3Rpb24sIGZvciBleGFtcGxlLgorICoKKyAqIEVlYWNoIGNoYW5uZWwgYWxzbyBoYXMgdHdvIHNwbGluZXMgKGFsc28gY2FsbGVkIGRhdGEgbGFuZXMpLCBhbmQKKyAqIGVhY2ggc3BsaW5lIGlzIG1hZGUgdXAgb2Ygb25lIFBoeXNpY2FsIEFjY2VzcyBDb2RpbmcgU3ViLUxheWVyCisgKiAoUENTKSBibG9jayBhbmQgdHdvIFRYIGxhbmVzLiBTbyBlYWNoIGNoYW5uZWwgaGFzIHR3byBQQ1MgYmxvY2tzCisgKiBhbmQgZm91ciBUWCBsYW5lcy4gVGhlIFRYIGxhbmVzIGFyZSB1c2VkIGFzIERQIGxhbmVzIG9yIFRNRFMKKyAqIGRhdGEvY2xvY2sgcGFpcnMgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgdHlwZS4KKyAqCisgKiBBZGRpdGlvbmFsbHkgdGhlIFBIWSBhbHNvIGNvbnRhaW5zIGFuIEFVWCBsYW5lIHdpdGggQVVYIGJsb2NrcworICogZm9yIGVhY2ggY2hhbm5lbC4gVGhpcyBpcyB1c2VkIGZvciBEUCBBVVggY29tbXVuaWNhdGlvbiwgYnV0CisgKiB0aGlzIGZhY3QgaXNuJ3QgcmVhbGx5IHJlbGV2YW50IGZvciB0aGUgZHJpdmVyIHNpbmNlIEFVWCBpcworICogY29udHJvbGxlZCBmcm9tIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIgc2lkZS4gTm8gRFBJTyByZWdpc3RlcnMKKyAqIG5lZWQgdG8gYmUgYWNjZXNzZWQgZHVyaW5nIEFVWCBjb21tdW5pY2F0aW9uLAorICoKKyAqIEdlbmVyYWxseSB0aGUgY29tbW9uIGxhbmUgY29ycmVzcG9uZHMgdG8gdGhlIHBpcGUgYW5kCisgKiB0aGUgc3BsaW5lIChQQ1MvVFgpIGNvcnJlcG9uZHMgdG8gdGhlIHBvcnQuCisgKgorICogRm9yIGR1YWwgY2hhbm5lbCBQSFkgKFZMVi9DSFYpOgorICoKKyAqICBwaXBlIEEgPT0gQ01OL1BMTC9SRUYgQ0gwCisgKgorICogIHBpcGUgQiA9PSBDTU4vUExML1JFRiBDSDEKKyAqCisgKiAgcG9ydCBCID09IFBDUy9UWCBDSDAKKyAqCisgKiAgcG9ydCBDID09IFBDUy9UWCBDSDEKKyAqCisgKiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gd2UgY3Jvc3MgdGhlIHN0cmVhbXMKKyAqIGllLiBkcml2ZSBwb3J0IEIgd2l0aCBwaXBlIEIsIG9yIHBvcnQgQyB3aXRoIHBpcGUgQS4KKyAqCisgKiBGb3Igc2luZ2xlIGNoYW5uZWwgUEhZIChDSFYpOgorICoKKyAqICBwaXBlIEMgPT0gQ01OL1BMTC9SRUYgQ0gwCisgKgorICogIHBvcnQgRCA9PSBQQ1MvVFggQ0gwCisgKgorICogTm90ZTogZGlnaXRhbCBwb3J0IEIgaXMgRERJMCwgZGlnaXRhbCBwb3J0IEMgaXMgRERJMSwKKyAqIGRpZ2l0YWwgcG9ydCBEIGlzIERESTIKKyAqLwogLyoKLSAqIERQSU8gLSBhIHNwZWNpYWwgYnVzIGZvciB2YXJpb3VzIGRpc3BsYXkgcmVsYXRlZCByZWdpc3RlcnMgdG8gaGlkZSBiZWhpbmQKKyAqIER1YWwgY2hhbm5lbCBQSFkgKFZMVi9DSFYpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICBDSDAgICAgICB8ICAgICAgQ0gxICAgICAgfAorICogfCAgQ01OL1BMTC9SRUYgIHwgIENNTi9QTEwvUkVGICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwgRGlzcGxheSBQSFkKKyAqIHwgUENTMDEgfCBQQ1MyMyB8IFBDUzAxIHwgUENTMjMgfAorICogfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18CisgKiB8VFgwfFRYMXxUWDJ8VFgzfFRYMHxUWDF8VFgyfFRYM3wKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgRERJMCAgICAgIHwgICAgIERESTEgICAgICB8IERQL0hETUkgcG9ydHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIERQSU8gaXMgVkxWIG9ubHkuCi0gKgotICogTm90ZTogZGlnaXRhbCBwb3J0IEIgaXMgRERJMCwgZGlnaXRhbCBwb3QgQyBpcyBEREkxCisgKiBTaW5nbGUgY2hhbm5lbCBQSFkgKENIVikKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgQ0gwICAgICAgfAorICogfCAgQ01OL1BMTC9SRUYgIHwKKyAqIHwtLS0tLS0tLS0tLS0tLS18IERpc3BsYXkgUEhZCisgKiB8IFBDUzAxIHwgUENTMjMgfAorICogfC0tLS0tLS18LS0tLS0tLXwKKyAqIHxUWDB8VFgxfFRYMnxUWDN8CisgKiAtLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgRERJMiAgICAgIHwgRFAvSERNSSBwb3J0CisgKiAtLS0tLS0tLS0tLS0tLS0tLQogICovCiAjZGVmaW5lIERQSU9fREVWRk4JCQkwCi0jZGVmaW5lIERQSU9fT1BDT0RFX1JFR19XUklURQkJMQotI2RlZmluZSBEUElPX09QQ09ERV9SRUdfUkVBRAkJMAogCiAjZGVmaW5lIERQSU9fQ1RMCQkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIxMTApCiAjZGVmaW5lICBEUElPX01PRFNFTDEJCQkoMTw8MykgLyogaWYgcmVmIGNsayBiID09IDI3ICovCkBAIC01NTUsMTQgKzczNiwyOSBAQAogI2RlZmluZSAgIERQSU9fUENTX1RYX0xBTkUxX1JFU0VUCSgxPDw3KQogI2RlZmluZSBWTFZfUENTX0RXMChjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMF9DSDAsIF9WTFZfUENTX0RXMF9DSDEpCiAKKyNkZWZpbmUgX1ZMVl9QQ1MwMV9EVzBfQ0gwCQkweDIwMAorI2RlZmluZSBfVkxWX1BDUzIzX0RXMF9DSDAJCTB4NDAwCisjZGVmaW5lIF9WTFZfUENTMDFfRFcwX0NIMQkJMHgyNjAwCisjZGVmaW5lIF9WTFZfUENTMjNfRFcwX0NIMQkJMHgyODAwCisjZGVmaW5lIFZMVl9QQ1MwMV9EVzAoY2gpIF9QT1JUKGNoLCBfVkxWX1BDUzAxX0RXMF9DSDAsIF9WTFZfUENTMDFfRFcwX0NIMSkKKyNkZWZpbmUgVkxWX1BDUzIzX0RXMChjaCkgX1BPUlQoY2gsIF9WTFZfUENTMjNfRFcwX0NIMCwgX1ZMVl9QQ1MyM19EVzBfQ0gxKQorCiAjZGVmaW5lIF9WTFZfUENTX0RXMV9DSDAJCTB4ODIwNAogI2RlZmluZSBfVkxWX1BDU19EVzFfQ0gxCQkweDg0MDQKKyNkZWZpbmUgICBDSFZfUENTX1JFUV9TT0ZUUkVTRVRfRU4JKDE8PDIzKQogI2RlZmluZSAgIERQSU9fUENTX0NMS19DUklfUlhFQl9FSU9TX0VOCSgxPDwyMikKICNkZWZpbmUgICBEUElPX1BDU19DTEtfQ1JJX1JYRElHRklMVFNHX0VOICgxPDwyMSkKICNkZWZpbmUgICBEUElPX1BDU19DTEtfREFUQVdJRFRIX1NISUZUCSg2KQogI2RlZmluZSAgIERQSU9fUENTX0NMS19TT0ZUX1JFU0VUCSgxPDw1KQogI2RlZmluZSBWTFZfUENTX0RXMShjaCkgX1BPUlQoY2gsIF9WTFZfUENTX0RXMV9DSDAsIF9WTFZfUENTX0RXMV9DSDEpCiAKKyNkZWZpbmUgX1ZMVl9QQ1MwMV9EVzFfQ0gwCQkweDIwNAorI2RlZmluZSBfVkxWX1BDUzIzX0RXMV9DSDAJCTB4NDA0CisjZGVmaW5lIF9WTFZfUENTMDFfRFcxX0NIMQkJMHgyNjA0CisjZGVmaW5lIF9WTFZfUENTMjNfRFcxX0NIMQkJMHgyODA0CisjZGVmaW5lIFZMVl9QQ1MwMV9EVzEoY2gpIF9QT1JUKGNoLCBfVkxWX1BDUzAxX0RXMV9DSDAsIF9WTFZfUENTMDFfRFcxX0NIMSkKKyNkZWZpbmUgVkxWX1BDUzIzX0RXMShjaCkgX1BPUlQoY2gsIF9WTFZfUENTMjNfRFcxX0NIMCwgX1ZMVl9QQ1MyM19EVzFfQ0gxKQorCiAjZGVmaW5lIF9WTFZfUENTX0RXOF9DSDAJCTB4ODIyMAogI2RlZmluZSBfVkxWX1BDU19EVzhfQ0gxCQkweDg0MjAKICNkZWZpbmUgVkxWX1BDU19EVzgoY2gpIF9QT1JUKGNoLCBfVkxWX1BDU19EVzhfQ0gwLCBfVkxWX1BDU19EVzhfQ0gxKQpAQCAtNTc4LDYgKzc3NCwxOSBAQAogI2RlZmluZSBfVkxWX1BDU19EVzlfQ0gxCQkweDg0MjQKICNkZWZpbmUJVkxWX1BDU19EVzkoY2gpIF9QT1JUKGNoLCBfVkxWX1BDU19EVzlfQ0gwLCBfVkxWX1BDU19EVzlfQ0gxKQogCisjZGVmaW5lIF9DSFZfUENTX0RXMTBfQ0gwCQkweDgyMjgKKyNkZWZpbmUgX0NIVl9QQ1NfRFcxMF9DSDEJCTB4ODQyOAorI2RlZmluZSAgIERQSU9fUENTX1NXSU5HX0NBTENfVFgwX1RYMgkoMTw8MzApCisjZGVmaW5lICAgRFBJT19QQ1NfU1dJTkdfQ0FMQ19UWDFfVFgzCSgxPDwzMSkKKyNkZWZpbmUgQ0hWX1BDU19EVzEwKGNoKSBfUE9SVChjaCwgX0NIVl9QQ1NfRFcxMF9DSDAsIF9DSFZfUENTX0RXMTBfQ0gxKQorCisjZGVmaW5lIF9WTFZfUENTMDFfRFcxMF9DSDAJCTB4MDIyOAorI2RlZmluZSBfVkxWX1BDUzIzX0RXMTBfQ0gwCQkweDA0MjgKKyNkZWZpbmUgX1ZMVl9QQ1MwMV9EVzEwX0NIMQkJMHgyNjI4CisjZGVmaW5lIF9WTFZfUENTMjNfRFcxMF9DSDEJCTB4MjgyOAorI2RlZmluZSBWTFZfUENTMDFfRFcxMChwb3J0KSBfUE9SVChwb3J0LCBfVkxWX1BDUzAxX0RXMTBfQ0gwLCBfVkxWX1BDUzAxX0RXMTBfQ0gxKQorI2RlZmluZSBWTFZfUENTMjNfRFcxMChwb3J0KSBfUE9SVChwb3J0LCBfVkxWX1BDUzIzX0RXMTBfQ0gwLCBfVkxWX1BDUzIzX0RXMTBfQ0gxKQorCiAjZGVmaW5lIF9WTFZfUENTX0RXMTFfQ0gwCQkweDgyMmMKICNkZWZpbmUgX1ZMVl9QQ1NfRFcxMV9DSDEJCTB4ODQyYwogI2RlZmluZSBWTFZfUENTX0RXMTEoY2gpIF9QT1JUKGNoLCBfVkxWX1BDU19EVzExX0NIMCwgX1ZMVl9QQ1NfRFcxMV9DSDEpCkBAIC01OTYsMTQgKzgwNSwyMSBAQAogCiAjZGVmaW5lIF9WTFZfVFhfRFcyX0NIMAkJCTB4ODI4OAogI2RlZmluZSBfVkxWX1RYX0RXMl9DSDEJCQkweDg0ODgKKyNkZWZpbmUgICBEUElPX1NXSU5HX01BUkdJTl9TSElGVAkxNgorI2RlZmluZSAgIERQSU9fU1dJTkdfTUFSR0lOX01BU0sJKDB4ZmYgPDwgRFBJT19TV0lOR19NQVJHSU5fU0hJRlQpCisjZGVmaW5lICAgRFBJT19VTklRX1RSQU5TX1NDQUxFX1NISUZUCTgKICNkZWZpbmUgVkxWX1RYX0RXMihjaCkgX1BPUlQoY2gsIF9WTFZfVFhfRFcyX0NIMCwgX1ZMVl9UWF9EVzJfQ0gxKQogCiAjZGVmaW5lIF9WTFZfVFhfRFczX0NIMAkJCTB4ODI4YwogI2RlZmluZSBfVkxWX1RYX0RXM19DSDEJCQkweDg0OGMKKy8qIFRoZSBmb2xsb3dpbmcgYml0IGZvciBDSFYgcGh5ICovCisjZGVmaW5lICAgRFBJT19UWF9VTklRX1RSQU5TX1NDQUxFX0VOCSgxPDwyNykKICNkZWZpbmUgVkxWX1RYX0RXMyhjaCkgX1BPUlQoY2gsIF9WTFZfVFhfRFczX0NIMCwgX1ZMVl9UWF9EVzNfQ0gxKQogCiAjZGVmaW5lIF9WTFZfVFhfRFc0X0NIMAkJCTB4ODI5MAogI2RlZmluZSBfVkxWX1RYX0RXNF9DSDEJCQkweDg0OTAKKyNkZWZpbmUgICBEUElPX1NXSU5HX0RFRU1QSDlQNV9TSElGVAkyNAorI2RlZmluZSAgIERQSU9fU1dJTkdfREVFTVBIOVA1X01BU0sJKDB4ZmYgPDwgRFBJT19TV0lOR19ERUVNUEg5UDVfU0hJRlQpCiAjZGVmaW5lIFZMVl9UWF9EVzQoY2gpIF9QT1JUKGNoLCBfVkxWX1RYX0RXNF9DSDAsIF9WTFZfVFhfRFc0X0NIMSkKIAogI2RlZmluZSBfVkxWX1RYM19EVzRfQ0gwCQkweDY5MApAQCAtNjIzLDYgKzgzOSw3MyBAQAogI2RlZmluZSBfVkxWX1RYX0RXMTRfQ0gxCQkweDg0YjgKICNkZWZpbmUgVkxWX1RYX0RXMTQoY2gpIF9QT1JUKGNoLCBfVkxWX1RYX0RXMTRfQ0gwLCBfVkxWX1RYX0RXMTRfQ0gxKQogCisvKiBDSFYgZHBQaHkgcmVnaXN0ZXJzICovCisjZGVmaW5lIF9DSFZfUExMX0RXMF9DSDAJCTB4ODAwMAorI2RlZmluZSBfQ0hWX1BMTF9EVzBfQ0gxCQkweDgxODAKKyNkZWZpbmUgQ0hWX1BMTF9EVzAoY2gpIF9QSVBFKGNoLCBfQ0hWX1BMTF9EVzBfQ0gwLCBfQ0hWX1BMTF9EVzBfQ0gxKQorCisjZGVmaW5lIF9DSFZfUExMX0RXMV9DSDAJCTB4ODAwNAorI2RlZmluZSBfQ0hWX1BMTF9EVzFfQ0gxCQkweDgxODQKKyNkZWZpbmUgICBEUElPX0NIVl9OX0RJVl9TSElGVAkJOAorI2RlZmluZSAgIERQSU9fQ0hWX00xX0RJVl9CWV8yCQkoMCA8PCAwKQorI2RlZmluZSBDSFZfUExMX0RXMShjaCkgX1BJUEUoY2gsIF9DSFZfUExMX0RXMV9DSDAsIF9DSFZfUExMX0RXMV9DSDEpCisKKyNkZWZpbmUgX0NIVl9QTExfRFcyX0NIMAkJMHg4MDA4CisjZGVmaW5lIF9DSFZfUExMX0RXMl9DSDEJCTB4ODE4OAorI2RlZmluZSBDSFZfUExMX0RXMihjaCkgX1BJUEUoY2gsIF9DSFZfUExMX0RXMl9DSDAsIF9DSFZfUExMX0RXMl9DSDEpCisKKyNkZWZpbmUgX0NIVl9QTExfRFczX0NIMAkJMHg4MDBjCisjZGVmaW5lIF9DSFZfUExMX0RXM19DSDEJCTB4ODE4YworI2RlZmluZSAgRFBJT19DSFZfRlJBQ19ESVZfRU4JCSgxIDw8IDE2KQorI2RlZmluZSAgRFBJT19DSFZfRklSU1RfTU9ECQkoMCA8PCA4KQorI2RlZmluZSAgRFBJT19DSFZfU0VDT05EX01PRAkJKDEgPDwgOCkKKyNkZWZpbmUgIERQSU9fQ0hWX0ZFRURGV0RfR0FJTl9TSElGVAkwCisjZGVmaW5lIENIVl9QTExfRFczKGNoKSBfUElQRShjaCwgX0NIVl9QTExfRFczX0NIMCwgX0NIVl9QTExfRFczX0NIMSkKKworI2RlZmluZSBfQ0hWX1BMTF9EVzZfQ0gwCQkweDgwMTgKKyNkZWZpbmUgX0NIVl9QTExfRFc2X0NIMQkJMHg4MTk4CisjZGVmaW5lICAgRFBJT19DSFZfR0FJTl9DVFJMX1NISUZUCTE2CisjZGVmaW5lCSAgRFBJT19DSFZfSU5UX0NPRUZGX1NISUZUCTgKKyNkZWZpbmUgICBEUElPX0NIVl9QUk9QX0NPRUZGX1NISUZUCTAKKyNkZWZpbmUgQ0hWX1BMTF9EVzYoY2gpIF9QSVBFKGNoLCBfQ0hWX1BMTF9EVzZfQ0gwLCBfQ0hWX1BMTF9EVzZfQ0gxKQorCisjZGVmaW5lIF9DSFZfQ01OX0RXMTNfQ0gwCQkweDgxMzQKKyNkZWZpbmUgX0NIVl9DTU5fRFcwX0NIMQkJMHg4MDgwCisjZGVmaW5lICAgRFBJT19DSFZfUzFfRElWX1NISUZUCQkyMQorI2RlZmluZSAgIERQSU9fQ0hWX1AxX0RJVl9TSElGVAkJMTMgLyogMyBiaXRzICovCisjZGVmaW5lICAgRFBJT19DSFZfUDJfRElWX1NISUZUCQk4ICAvKiA1IGJpdHMgKi8KKyNkZWZpbmUgICBEUElPX0NIVl9LX0RJVl9TSElGVAkJNAorI2RlZmluZSAgIERQSU9fUExMX0ZSRVFMT0NLCQkoMSA8PCAxKQorI2RlZmluZSAgIERQSU9fUExMX0xPQ0sJCQkoMSA8PCAwKQorI2RlZmluZSBDSFZfQ01OX0RXMTMoY2gpIF9QSVBFKGNoLCBfQ0hWX0NNTl9EVzEzX0NIMCwgX0NIVl9DTU5fRFcwX0NIMSkKKworI2RlZmluZSBfQ0hWX0NNTl9EVzE0X0NIMAkJMHg4MTM4CisjZGVmaW5lIF9DSFZfQ01OX0RXMV9DSDEJCTB4ODA4NAorI2RlZmluZSAgIERQSU9fQUZDX1JFQ0FMCQkoMSA8PCAxNCkKKyNkZWZpbmUgICBEUElPX0RDTEtQX0VOCQkJKDEgPDwgMTMpCisjZGVmaW5lIENIVl9DTU5fRFcxNChjaCkgX1BJUEUoY2gsIF9DSFZfQ01OX0RXMTRfQ0gwLCBfQ0hWX0NNTl9EVzFfQ0gxKQorCisjZGVmaW5lIENIVl9DTU5fRFczMAkJCTB4ODE3OAorI2RlZmluZSAgIERQSU9fTFJDX0JZUEFTUwkJKDEgPDwgMykKKworI2RlZmluZSBfVFhMQU5FKGNoLCBsYW5lLCBvZmZzZXQpICgoY2ggPyAweDI0MDAgOiAwKSArIFwKKwkJCQkJKGxhbmUpICogMHgyMDAgKyAob2Zmc2V0KSkKKworI2RlZmluZSBDSFZfVFhfRFcwKGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDgwKQorI2RlZmluZSBDSFZfVFhfRFcxKGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDg0KQorI2RlZmluZSBDSFZfVFhfRFcyKGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDg4KQorI2RlZmluZSBDSFZfVFhfRFczKGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDhjKQorI2RlZmluZSBDSFZfVFhfRFc0KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDkwKQorI2RlZmluZSBDSFZfVFhfRFc1KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDk0KQorI2RlZmluZSBDSFZfVFhfRFc2KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDk4KQorI2RlZmluZSBDSFZfVFhfRFc3KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweDljKQorI2RlZmluZSBDSFZfVFhfRFc4KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweGEwKQorI2RlZmluZSBDSFZfVFhfRFc5KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweGE0KQorI2RlZmluZSBDSFZfVFhfRFcxMChjaCwgbGFuZSkgX1RYTEFORShjaCwgbGFuZSwgMHhhOCkKKyNkZWZpbmUgQ0hWX1RYX0RXMTEoY2gsIGxhbmUpIF9UWExBTkUoY2gsIGxhbmUsIDB4YWMpCisjZGVmaW5lICAgRFBJT19GUkNfTEFURU5DWV9TSEZJVAk4CisjZGVmaW5lIENIVl9UWF9EVzE0KGNoLCBsYW5lKSBfVFhMQU5FKGNoLCBsYW5lLCAweGI4KQorI2RlZmluZSAgIERQSU9fVVBBUl9TSElGVAkJMzAKIC8qCiAgKiBGZW5jZSByZWdpc3RlcnMKICAqLwpAQCAtNjYzLDYgKzk0Niw3IEBACiAjZGVmaW5lIFJFTkRFUl9SSU5HX0JBU0UJMHgwMjAwMAogI2RlZmluZSBCU0RfUklOR19CQVNFCQkweDA0MDAwCiAjZGVmaW5lIEdFTjZfQlNEX1JJTkdfQkFTRQkweDEyMDAwCisjZGVmaW5lIEdFTjhfQlNEMl9SSU5HX0JBU0UJMHgxYzAwMAogI2RlZmluZSBWRUJPWF9SSU5HX0JBU0UJCTB4MWEwMDAKICNkZWZpbmUgQkxUX1JJTkdfQkFTRQkJMHgyMjAwMAogI2RlZmluZSBSSU5HX1RBSUwoYmFzZSkJCSgoYmFzZSkrMHgzMCkKQEAgLTY4OCw5ICs5NzIsMjAgQEAKICNkZWZpbmUgUklOR19NQVhfSURMRShiYXNlKQkoKGJhc2UpKzB4NTQpCiAjZGVmaW5lIFJJTkdfSFdTX1BHQShiYXNlKQkoKGJhc2UpKzB4ODApCiAjZGVmaW5lIFJJTkdfSFdTX1BHQV9HRU42KGJhc2UpCSgoYmFzZSkrMHgyMDgwKQotI2RlZmluZSBBUkJfTU9ERQkJMHgwNDAzMAorCisjZGVmaW5lIEdFTjdfV1JfV0FURVJNQVJLCTB4NDAyOAorI2RlZmluZSBHRU43X0dGWF9QUklPX0NUUkwJMHg0MDJDCisjZGVmaW5lIEFSQl9NT0RFCQkweDQwMzAKICNkZWZpbmUgICBBUkJfTU9ERV9TV0laWkxFX1NOQgkoMTw8NCkKICNkZWZpbmUgICBBUkJfTU9ERV9TV0laWkxFX0lWQgkoMTw8NSkKKyNkZWZpbmUgR0VON19HRlhfUEVORF9UTEIwCTB4NDAzNAorI2RlZmluZSBHRU43X0dGWF9QRU5EX1RMQjEJMHg0MDM4CisvKiBMMywgQ1ZTLCBaVExCLCBSQ0MsIENBU0MgTFJBIG1pbiwgbWF4IHZhbHVlcyAqLworI2RlZmluZSBHRU43X0xSQV9MSU1JVFNfQkFTRQkweDQwM0MKKyNkZWZpbmUgR0VON19MUkFfTElNSVRTX1JFR19OVU0JMTMKKyNkZWZpbmUgR0VON19NRURJQV9NQVhfUkVRX0NPVU5UCTB4NDA3MAorI2RlZmluZSBHRU43X0dGWF9NQVhfUkVRX0NPVU5UCQkweDQwNzQKKwogI2RlZmluZSBHQU1UQVJCTU9ERQkJMHgwNGEwOAogI2RlZmluZSAgIEFSQl9NT0RFX0JXR1RMQl9ESVNBQkxFICgxPDw5KQogI2RlZmluZSAgIEFSQl9NT0RFX1NXSVpaTEVfQkRXCSgxPDwxKQpAQCAtNzI1LDYgKzEwMjAsOSBAQAogI2RlZmluZSAgIFJJTkdfV0FJVF9JOFhYCSgxPDwwKSAvKiBnZW4yLCBQUkJ4X0hFQUQgKi8KICNkZWZpbmUgICBSSU5HX1dBSVQJCSgxPDwxMSkgLyogZ2VuMyssIFBSQnhfQ1RMICovCiAjZGVmaW5lICAgUklOR19XQUlUX1NFTUFQSE9SRQkoMTw8MTApIC8qIGdlbjYrICovCisKKyNkZWZpbmUgR0VON19UTEJfUkRfQUREUgkweDQ3MDAKKwogI2lmIDAKICNkZWZpbmUgUFJCMF9UQUlMCTB4MDIwMzAKICNkZWZpbmUgUFJCMF9IRUFECTB4MDIwMzQKQEAgLTc0OCw2ICsxMDQ2LDcgQEAKICNkZWZpbmUgUklOR19JTlNURE9ORShiYXNlKQkoKGJhc2UpKzB4NmMpCiAjZGVmaW5lIFJJTkdfSU5TVFBTKGJhc2UpCSgoYmFzZSkrMHg3MCkKICNkZWZpbmUgUklOR19ETUFfRkFERChiYXNlKQkoKGJhc2UpKzB4NzgpCisjZGVmaW5lIFJJTkdfRE1BX0ZBRERfVURXKGJhc2UpCSgoYmFzZSkrMHg2MCkgLyogZ2VuOCsgKi8KICNkZWZpbmUgUklOR19JTlNUUE0oYmFzZSkJKChiYXNlKSsweGMwKQogI2RlZmluZSBSSU5HX01JX01PREUoYmFzZSkJKChiYXNlKSsweDljKQogI2RlZmluZSBJTlNUUFMJCTB4MDIwNzAgLyogOTY1KyBvbmx5ICovCkBAIC04NDIsMjEgKzExNDEsMjYgQEAKICNkZWZpbmUgR0ZYX01PREVfR0VONwkweDAyMjljCiAjZGVmaW5lIFJJTkdfTU9ERV9HRU43KHJpbmcpCSgocmluZyktPm1taW9fYmFzZSsweDI5YykKICNkZWZpbmUgICBHRlhfUlVOX0xJU1RfRU5BQkxFCQkoMTw8MTUpCi0jZGVmaW5lICAgR0ZYX1RMQl9JTlZBTElEQVRFX0FMV0FZUwkoMTw8MTMpCisjZGVmaW5lICAgR0ZYX1RMQl9JTlZBTElEQVRFX0VYUExJQ0lUCSgxPDwxMykKICNkZWZpbmUgICBHRlhfU1VSRkFDRV9GQVVMVF9FTkFCTEUJKDE8PDEyKQogI2RlZmluZSAgIEdGWF9SRVBMQVlfTU9ERQkJKDE8PDExKQogI2RlZmluZSAgIEdGWF9QU01JX0dSQU5VTEFSSVRZCQkoMTw8MTApCiAjZGVmaW5lICAgR0ZYX1BQR1RUX0VOQUJMRQkJKDE8PDkpCiAKICNkZWZpbmUgVkxWX0RJU1BMQVlfQkFTRSAweDE4MDAwMAorI2RlZmluZSBWTFZfTUlQSV9CQVNFIFZMVl9ESVNQTEFZX0JBU0UKIAorI2RlZmluZSBWTFZfR1VfQ1RMMAkoVkxWX0RJU1BMQVlfQkFTRSArIDB4MjAzMCkKKyNkZWZpbmUgVkxWX0dVX0NUTDEJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIwMzQpCiAjZGVmaW5lIFNDUEQwCQkweDAyMDljIC8qIDkxNSsgb25seSAqLwogI2RlZmluZSBJRVIJCTB4MDIwYTAKICNkZWZpbmUgSUlSCQkweDAyMGE0CiAjZGVmaW5lIElNUgkJMHgwMjBhOAogI2RlZmluZSBJU1IJCTB4MDIwYWMKICNkZWZpbmUgVkxWX0dVTklUX0NMT0NLX0dBVEUJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIwNjApCisjZGVmaW5lICAgR0lOVF9ESVMJCSgxPDwyMikKICNkZWZpbmUgICBHQ0ZHX0RJUwkJKDE8PDgpCisjZGVmaW5lIFZMVl9HVU5JVF9DTE9DS19HQVRFMgkoVkxWX0RJU1BMQVlfQkFTRSArIDB4MjA2NCkKICNkZWZpbmUgVkxWX0lJUl9SVwkoVkxWX0RJU1BMQVlfQkFTRSArIDB4MjA4NCkKICNkZWZpbmUgVkxWX0lFUgkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDIwYTApCiAjZGVmaW5lIFZMVl9JSVIJCShWTFZfRElTUExBWV9CQVNFICsgMHgyMGE0KQpAQCAtODc1LDcgKzExNzksNyBAQAogI2RlZmluZSAgIEk5MTVfRVJST1JfSU5TVFJVQ1RJT04JCQkoMTw8MCkKICNkZWZpbmUgSU5TVFBNCSAgICAgICAgMHgwMjBjMAogI2RlZmluZSAgIElOU1RQTV9TRUxGX0VOICgxPDwxMikgLyogOTE1R00gb25seSAqLwotI2RlZmluZSAgIElOU1RQTV9BR1BCVVNZX0RJUyAoMTw8MTEpIC8qIGdlbjM6IHdoZW4gZGlzYWJsZWQsIHBlbmRpbmcgaW50ZXJydXB0cworI2RlZmluZSAgIElOU1RQTV9BR1BCVVNZX0lOVF9FTiAoMTw8MTEpIC8qIGdlbjM6IHdoZW4gZGlzYWJsZWQsIHBlbmRpbmcgaW50ZXJydXB0cwogCQkJCQl3aWxsIG5vdCBhc3NlcnQgQUdQQlVTWSMgYW5kIHdpbGwgb25seQogCQkJCQliZSBkZWxpdmVyZWQgd2hlbiBvdXQgb2YgQzMuICovCiAjZGVmaW5lICAgSU5TVFBNX0ZPUkNFX09SREVSSU5HCQkJCSgxPDw3KSAvKiBHRU42KyAqLwpAQCAtOTU2LDYgKzEyNjAsMTAgQEAKICNkZWZpbmUgICBNSV9BUkJfRElTUExBWV9QUklPUklUWV9BX0IJCSgwIDw8IDApCS8qIGRpc3BsYXkgQSA+IGRpc3BsYXkgQiAqLwogI2RlZmluZSAgIE1JX0FSQl9ESVNQTEFZX1BSSU9SSVRZX0JfQQkJKDEgPDwgMCkJLyogZGlzcGxheSBCID4gZGlzcGxheSBBICovCiAKKyNkZWZpbmUgTUlfU1RBVEUJMHgwMjBlNCAvKiBnZW4yIG9ubHkgKi8KKyNkZWZpbmUgICBNSV9BR1BCVVNZX0lOVF9FTgkJCSgxIDw8IDEpIC8qIDg1eCBvbmx5ICovCisjZGVmaW5lICAgTUlfQUdQQlVTWV84MzBfTU9ERQkJCSgxIDw8IDApIC8qIDg1eCBvbmx5ICovCisKICNkZWZpbmUgQ0FDSEVfTU9ERV8wCTB4MDIxMjAgLyogOTE1KyBvbmx5ICovCiAjZGVmaW5lICAgQ00wX1BJUEVMSU5FRF9SRU5ERVJfRkxVU0hfRElTQUJMRSAoMTw8OCkKICNkZWZpbmUgICBDTTBfSVpfT1BUX0RJU0FCTEUgICAgICAoMTw8NikKQEAgLTk3Myw2ICsxMjgxLDcgQEAKICNkZWZpbmUgICBFQ09fRkxJUF9ET05FCQkoMTw8MCkKIAogI2RlZmluZSBDQUNIRV9NT0RFXzBfR0VONwkweDcwMDAgLyogSVZCKyAqLworI2RlZmluZSBSQ19PUF9GTFVTSF9FTkFCTEUgKDE8PDApCiAjZGVmaW5lICAgSElaX1JBV19TVEFMTF9PUFRfRElTQUJMRSAoMTw8MikKICNkZWZpbmUgQ0FDSEVfTU9ERV8xCQkweDcwMDQgLyogSVZCKyAqLwogI2RlZmluZSAgIFBJWEVMX1NVQlNQQU5fQ09MTEVDVF9PUFRfRElTQUJMRQkoMTw8NikKQEAgLTk4NCw2ICsxMjkzLDcgQEAKIAogI2RlZmluZSBHRU42X1JDX1NMRUVQX1BTTUlfQ09OVFJPTAkweDIwNTAKICNkZWZpbmUgICBHRU44X1JDX1NFTUFfSURMRV9NU0dfRElTQUJMRQkoMSA8PCAxMikKKyNkZWZpbmUgICBHRU44X0ZGX0RPUF9DTE9DS19HQVRFX0RJU0FCTEUJKDE8PDEwKQogCiAjZGVmaW5lIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTAkweDEyMDUwCiAjZGVmaW5lICAgR0VONl9CU0RfU0xFRVBfTVNHX0RJU0FCTEUJKDEgPDwgMCkKQEAgLTEwMjQsMjQgKzEzMzQsNDMgQEAKIAogLyogVGhlc2UgYXJlIGFsbCB0aGUgIm9sZCIgaW50ZXJydXB0cyAqLwogI2RlZmluZSBJTEtfQlNEX1VTRVJfSU5URVJSVVBUCQkJCSgxPDw1KQorCisjZGVmaW5lIEk5MTVfUE1fSU5URVJSVVBUCQkJCSgxPDwzMSkKKyNkZWZpbmUgSTkxNV9JU1BfSU5URVJSVVBUCQkJCSgxPDwyMikKKyNkZWZpbmUgSTkxNV9MUEVfUElQRV9CX0lOVEVSUlVQVAkJCSgxPDwyMSkKKyNkZWZpbmUgSTkxNV9MUEVfUElQRV9BX0lOVEVSUlVQVAkJCSgxPDwyMCkKKyNkZWZpbmUgSTkxNV9NSVBJQl9JTlRFUlJVUFQJCQkJKDE8PDE5KQorI2RlZmluZSBJOTE1X01JUElBX0lOVEVSUlVQVAkJCQkoMTw8MTgpCiAjZGVmaW5lIEk5MTVfUElQRV9DT05UUk9MX05PVElGWV9JTlRFUlJVUFQJCSgxPDwxOCkKICNkZWZpbmUgSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUCQkJKDE8PDE3KQorI2RlZmluZSBJOTE1X0RJU1BMQVlfUElQRV9DX0hCTEFOS19JTlRFUlJVUFQJCSgxPDwxNikKKyNkZWZpbmUgSTkxNV9NQVNURVJfRVJST1JfSU5URVJSVVBUCQkJKDE8PDE1KQogI2RlZmluZSBJOTE1X1JFTkRFUl9DT01NQU5EX1BBUlNFUl9FUlJPUl9JTlRFUlJVUFQJKDE8PDE1KQorI2RlZmluZSBJOTE1X0RJU1BMQVlfUElQRV9CX0hCTEFOS19JTlRFUlJVUFQJCSgxPDwxNCkKICNkZWZpbmUgSTkxNV9HTUNIX1RIRVJNQUxfU0VOU09SX0VWRU5UX0lOVEVSUlVQVAkoMTw8MTQpIC8qIHAtc3RhdGUgKi8KKyNkZWZpbmUgSTkxNV9ESVNQTEFZX1BJUEVfQV9IQkxBTktfSU5URVJSVVBUCQkoMTw8MTMpCiAjZGVmaW5lIEk5MTVfSFdCX09PTV9JTlRFUlJVUFQJCQkJKDE8PDEzKQorI2RlZmluZSBJOTE1X0xQRV9QSVBFX0NfSU5URVJSVVBUCQkJKDE8PDEyKQogI2RlZmluZSBJOTE1X1NZTkNfU1RBVFVTX0lOVEVSUlVQVAkJCSgxPDwxMikKKyNkZWZpbmUgSTkxNV9NSVNDX0lOVEVSUlVQVAkJCQkoMTw8MTEpCiAjZGVmaW5lIEk5MTVfRElTUExBWV9QTEFORV9BX0ZMSVBfUEVORElOR19JTlRFUlJVUFQJKDE8PDExKQorI2RlZmluZSBJOTE1X0RJU1BMQVlfUElQRV9DX1ZCTEFOS19JTlRFUlJVUFQJCSgxPDwxMCkKICNkZWZpbmUgSTkxNV9ESVNQTEFZX1BMQU5FX0JfRkxJUF9QRU5ESU5HX0lOVEVSUlVQVAkoMTw8MTApCisjZGVmaW5lIEk5MTVfRElTUExBWV9QSVBFX0NfRVZFTlRfSU5URVJSVVBUCQkoMTw8OSkKICNkZWZpbmUgSTkxNV9PVkVSTEFZX1BMQU5FX0ZMSVBfUEVORElOR19JTlRFUlJVUFQJKDE8PDkpCisjZGVmaW5lIEk5MTVfRElTUExBWV9QSVBFX0NfRFBCTV9JTlRFUlJVUFQJCSgxPDw4KQogI2RlZmluZSBJOTE1X0RJU1BMQVlfUExBTkVfQ19GTElQX1BFTkRJTkdfSU5URVJSVVBUCSgxPDw4KQogI2RlZmluZSBJOTE1X0RJU1BMQVlfUElQRV9BX1ZCTEFOS19JTlRFUlJVUFQJCSgxPDw3KQogI2RlZmluZSBJOTE1X0RJU1BMQVlfUElQRV9BX0VWRU5UX0lOVEVSUlVQVAkJKDE8PDYpCiAjZGVmaW5lIEk5MTVfRElTUExBWV9QSVBFX0JfVkJMQU5LX0lOVEVSUlVQVAkJKDE8PDUpCiAjZGVmaW5lIEk5MTVfRElTUExBWV9QSVBFX0JfRVZFTlRfSU5URVJSVVBUCQkoMTw8NCkKKyNkZWZpbmUgSTkxNV9ESVNQTEFZX1BJUEVfQV9EUEJNX0lOVEVSUlVQVAkJKDE8PDMpCisjZGVmaW5lIEk5MTVfRElTUExBWV9QSVBFX0JfRFBCTV9JTlRFUlJVUFQJCSgxPDwyKQogI2RlZmluZSBJOTE1X0RFQlVHX0lOVEVSUlVQVAkJCQkoMTw8MikKKyNkZWZpbmUgSTkxNV9XSU5WQUxJRF9JTlRFUlJVUFQJCQkJKDE8PDEpCiAjZGVmaW5lIEk5MTVfVVNFUl9JTlRFUlJVUFQJCQkJKDE8PDEpCiAjZGVmaW5lIEk5MTVfQVNMRV9JTlRFUlJVUFQJCQkJKDE8PDApCi0jZGVmaW5lIEk5MTVfQlNEX1VTRVJfSU5URVJSVVBUCQkJCSgxIDw8IDI1KQorI2RlZmluZSBJOTE1X0JTRF9VU0VSX0lOVEVSUlVQVAkJCQkoMTw8MjUpCiAKICNkZWZpbmUgR0VONl9CU0RfUk5DSUQJCQkweDEyMTk4CiAKQEAgLTExOTgsNiArMTUyNyw3IEBACiAjZGVmaW5lICAgR01CVVNfUE9SVF9TU0MJMQogI2RlZmluZSAgIEdNQlVTX1BPUlRfVkdBRERDCTIKICNkZWZpbmUgICBHTUJVU19QT1JUX1BBTkVMCTMKKyNkZWZpbmUgICBHTUJVU19QT1JUX0RQRF9DSFYJMyAvKiBIRE1JRF9DSFYgKi8KICNkZWZpbmUgICBHTUJVU19QT1JUX0RQQwk0IC8qIEhETUlDICovCiAjZGVmaW5lICAgR01CVVNfUE9SVF9EUEIJNSAvKiBTRFZPLCBIRE1JQiAqLwogI2RlZmluZSAgIEdNQlVTX1BPUlRfRFBECTYgLyogSERNSUQgKi8KQEAgLTEyMzksNiArMTU2OSw3IEBACiAgKi8KICNkZWZpbmUgRFBMTF9BX09GRlNFVCAweDYwMTQKICNkZWZpbmUgRFBMTF9CX09GRlNFVCAweDYwMTgKKyNkZWZpbmUgQ0hWX0RQTExfQ19PRkZTRVQgMHg2MDMwCiAjZGVmaW5lIERQTEwocGlwZSkgKGRldl9wcml2LT5pbmZvLmRwbGxfb2Zmc2V0c1twaXBlXSArIFwKIAkJICAgIGRldl9wcml2LT5pbmZvLmRpc3BsYXlfbW1pb19vZmZzZXQpCiAKQEAgLTEyNzMsMTAgKzE2MDQsMjMgQEAKICNkZWZpbmUgICBEUExMX0xPQ0tfVkxWCQkJKDE8PDE1KQogI2RlZmluZSAgIERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMVgkoMTw8MTQpCiAjZGVmaW5lICAgRFBMTF9JTlRFR1JBVEVEX0NMT0NLX1ZMVgkoMTw8MTMpCisjZGVmaW5lICAgRFBMTF9TU0NfUkVGX0NMT0NLX0NIVgkoMTw8MTMpCiAjZGVmaW5lICAgRFBMTF9QT1JUQ19SRUFEWV9NQVNLCQkoMHhmIDw8IDQpCiAjZGVmaW5lICAgRFBMTF9QT1JUQl9SRUFEWV9NQVNLCQkoMHhmKQogCiAjZGVmaW5lICAgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLX0k4MzAJMHgwMDFmMDAwMAorCisvKiBBZGRpdGlvbmFsIENIViBwbGwvcGh5IHJlZ2lzdGVycyAqLworI2RlZmluZSBEUElPX1BIWV9TVEFUVVMJCQkoVkxWX0RJU1BMQVlfQkFTRSArIDB4NjI0MCkKKyNkZWZpbmUgICBEUExMX1BPUlREX1JFQURZX01BU0sJCSgweGYpCisjZGVmaW5lIERJU1BMQVlfUEhZX0NPTlRST0wgKFZMVl9ESVNQTEFZX0JBU0UgKyAweDYwMTAwKQorI2RlZmluZSAgIFBIWV9DT01fTEFORV9SRVNFVF9ERUFTU0VSVChwaHksIHZhbCkgXAorCQkJCSgocGh5ID09IERQSU9fUEhZMCkgPyAodmFsIHwgMSkgOiAodmFsIHwgMikpCisjZGVmaW5lICAgUEhZX0NPTV9MQU5FX1JFU0VUX0FTU0VSVChwaHksIHZhbCkgXAorCQkJCSgocGh5ID09IERQSU9fUEhZMCkgPyAodmFsICYgfjEpIDogKHZhbCAmIH4yKSkKKyNkZWZpbmUgRElTUExBWV9QSFlfU1RBVFVTIChWTFZfRElTUExBWV9CQVNFICsgMHg2MDEwNCkKKyNkZWZpbmUgICBQSFlfUE9XRVJHT09EKHBoeSkJKChwaHkgPT0gRFBJT19QSFkwKSA/ICgxPDwzMSkgOiAoMTw8MzApKQorCiAvKgogICogVGhlIGk4MzAgZ2VuZXJhdGlvbiwgaW4gTFZEUyBtb2RlLCBkZWZpbmVzIFAxIGFzIHRoZSBiaXQgbnVtYmVyIHNldCB3aXRoaW4KICAqIHRoaXMgZmllbGQgKG9ubHkgb25lIGJpdCBtYXkgYmUgc2V0KS4KQEAgLTEzMTcsNiArMTY2MSw3IEBACiAKICNkZWZpbmUgRFBMTF9BX01EX09GRlNFVCAweDYwMWMgLyogOTY1KyBvbmx5ICovCiAjZGVmaW5lIERQTExfQl9NRF9PRkZTRVQgMHg2MDIwIC8qIDk2NSsgb25seSAqLworI2RlZmluZSBDSFZfRFBMTF9DX01EX09GRlNFVCAweDYwM2MKICNkZWZpbmUgRFBMTF9NRChwaXBlKSAoZGV2X3ByaXYtPmluZm8uZHBsbF9tZF9vZmZzZXRzW3BpcGVdICsgXAogCQkgICAgICAgZGV2X3ByaXYtPmluZm8uZGlzcGxheV9tbWlvX29mZnNldCkKIApAQCAtMTQxNiw3ICsxNzYxLDcgQEAKICMgZGVmaW5lIERQSU9VTklUX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgNikgLyogOTE1LTk0NSAqLwogIyBkZWZpbmUgT1ZGVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDUpCiAjIGRlZmluZSBPVkJVTklUX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgNCkKLS8qKgorLyoKICAqIFRoaXMgYml0IG11c3QgYmUgc2V0IG9uIHRoZSA4MzAgdG8gcHJldmVudCBoYW5ncyB3aGVuIHR1cm5pbmcgb2ZmIHRoZQogICogb3ZlcmxheSBzY2FsZXIuCiAgKi8KQEAgLTE0MzYsMTIgKzE3ODEsMTIgQEAKICMgZGVmaW5lIENPTE9SX0NBTENVTEFUT1JfQ0xPQ0tfR0FURV9ESVNBQkxFCSgxIDw8IDcpCiAjIGRlZmluZSBNT1RJT05fQ09NUF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDYpCiAjIGRlZmluZSBNQUdfQ0xPQ0tfR0FURV9ESVNBQkxFCQkJKDEgPDwgNSkKLS8qKiBUaGlzIGJpdCBtdXN0IGJlIHVuc2V0IG9uIDg1NSw4NjUgKi8KKy8qIFRoaXMgYml0IG11c3QgYmUgdW5zZXQgb24gODU1LDg2NSAqLwogIyBkZWZpbmUgTUVDSV9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDQpCiAjIGRlZmluZSBEQ01QX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMykKICMgZGVmaW5lIE1FQ19DTE9DS19HQVRFX0RJU0FCTEUJCQkoMSA8PCAyKQogIyBkZWZpbmUgTUVDT19DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDEpCi0vKiogVGhpcyBiaXQgbXVzdCBiZSBzZXQgb24gODU1LDg2NS4gKi8KKy8qIFRoaXMgYml0IG11c3QgYmUgc2V0IG9uIDg1NSw4NjUuICovCiAjIGRlZmluZSBTVl9DTE9DS19HQVRFX0RJU0FCTEUJCQkoMSA8PCAwKQogIyBkZWZpbmUgSTkxNV9NUEVHX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMTYpCiAjIGRlZmluZSBJOTE1X1ZMRF9JUF9QUl9DTE9DS19HQVRFX0RJU0FCTEUJKDEgPDwgMTUpCkBAIC0xNDYyLDE0ICsxODA3LDE0IEBACiAjIGRlZmluZSBJOTE1X0JZX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMCkKIAogIyBkZWZpbmUgSTk2NV9SQ1pfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCAzMCkKLS8qKiBUaGlzIGJpdCBtdXN0IGFsd2F5cyBiZSBzZXQgb24gOTY1Ry85NjVHTSAqLworLyogVGhpcyBiaXQgbXVzdCBhbHdheXMgYmUgc2V0IG9uIDk2NUcvOTY1R00gKi8KICMgZGVmaW5lIEk5NjVfUkNDX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMjkpCiAjIGRlZmluZSBJOTY1X1JDUEJfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCAyOCkKICMgZGVmaW5lIEk5NjVfREFQX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMjcpCiAjIGRlZmluZSBJOTY1X1JPQ19DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDI2KQogIyBkZWZpbmUgSTk2NV9HV19DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDI1KQogIyBkZWZpbmUgSTk2NV9URF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDI0KQotLyoqIFRoaXMgYml0IG11c3QgYWx3YXlzIGJlIHNldCBvbiA5NjVHICovCisvKiBUaGlzIGJpdCBtdXN0IGFsd2F5cyBiZSBzZXQgb24gOTY1RyAqLwogIyBkZWZpbmUgSTk2NV9JU0NfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCAyMykKICMgZGVmaW5lIEk5NjVfSUNfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCAyMikKICMgZGVmaW5lIEk5NjVfRVVfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCAyMSkKQEAgLTE0OTQsNiArMTgzOSwxMCBAQAogI2RlZmluZSBWRl9VTklUX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgOSkKICNkZWZpbmUgR1NfVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDcpCiAjZGVmaW5lIENMX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCA2KQorCisjZGVmaW5lIFZERUNDTEtfR0FURV9ECQkweDYyMEMJCS8qIGc0eCBvbmx5ICovCisjZGVmaW5lICBWQ1BfVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDQpCisKICNkZWZpbmUgUkFNQ0xLX0dBVEVfRAkJMHg2MjEwCQkvKiBDUkwgb25seSAqLwogI2RlZmluZSBERVVDCQkJMHg2MjE0ICAgICAgICAgIC8qIENSTCBvbmx5ICovCiAKQEAgLTE1MTMsNiArMTg2Miw3IEBACiAgKi8KICNkZWZpbmUgUEFMRVRURV9BX09GRlNFVCAweGEwMDAKICNkZWZpbmUgUEFMRVRURV9CX09GRlNFVCAweGE4MDAKKyNkZWZpbmUgQ0hWX1BBTEVUVEVfQ19PRkZTRVQgMHhjMDAwCiAjZGVmaW5lIFBBTEVUVEUocGlwZSkgKGRldl9wcml2LT5pbmZvLnBhbGV0dGVfb2Zmc2V0c1twaXBlXSArIFwKIAkJICAgICAgIGRldl9wcml2LT5pbmZvLmRpc3BsYXlfbW1pb19vZmZzZXQpCiAKQEAgLTE1MzUsNyArMTg4NSw3IEBACiAvKiBNZW1vcnkgY29udHJvbGxlciBmcmVxdWVuY3kgaW4gTUNIQkFSIGZvciBIYXN3ZWxsIChwb3NzaWJsZSBTTkIrKSAqLwogI2RlZmluZSBEQ0xLIChNQ0hCQVJfTUlSUk9SX0JBU0VfU05CICsgMHg1ZTA0KQogCi0vKiogOTE1LTk0NSBhbmQgR005NjUgTUNIIHJlZ2lzdGVyIGNvbnRyb2xsaW5nIERSQU0gY2hhbm5lbCBhY2Nlc3MgKi8KKy8qIDkxNS05NDUgYW5kIEdNOTY1IE1DSCByZWdpc3RlciBjb250cm9sbGluZyBEUkFNIGNoYW5uZWwgYWNjZXNzICovCiAjZGVmaW5lIERDQwkJCTB4MTAyMDAKICNkZWZpbmUgRENDX0FERFJFU1NJTkdfTU9ERV9TSU5HTEVfQ0hBTk5FTAkJKDAgPDwgMCkKICNkZWZpbmUgRENDX0FERFJFU1NJTkdfTU9ERV9EVUFMX0NIQU5ORUxfQVNZTU1FVFJJQwkoMSA8PCAwKQpAQCAtMTU0NCwxNSArMTg5NCwxNSBAQAogI2RlZmluZSBEQ0NfQ0hBTk5FTF9YT1JfRElTQUJMRQkJCQkoMSA8PCAxMCkKICNkZWZpbmUgRENDX0NIQU5ORUxfWE9SX0JJVF8xNwkJCQkoMSA8PCA5KQogCi0vKiogUGluZXZpZXcgTUNIIHJlZ2lzdGVyIGNvbnRhaW5zIEREUjMgc2V0dGluZyAqLworLyogUGluZXZpZXcgTUNIIHJlZ2lzdGVyIGNvbnRhaW5zIEREUjMgc2V0dGluZyAqLwogI2RlZmluZSBDU0hSRERSM0NUTCAgICAgICAgICAgIDB4MTAxYTgKICNkZWZpbmUgQ1NIUkREUjNDVExfRERSMyAgICAgICAoMSA8PCAyKQogCi0vKiogOTY1IE1DSCByZWdpc3RlciBjb250cm9sbGluZyBEUkFNIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworLyogOTY1IE1DSCByZWdpc3RlciBjb250cm9sbGluZyBEUkFNIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDMERSQjMJCQkweDEwMjA2CiAjZGVmaW5lIEMxRFJCMwkJCTB4MTA2MDYKIAotLyoqIHNuYiBNQ0ggcmVnaXN0ZXJzIGZvciByZWFkaW5nIHRoZSBEUkFNIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworLyogc25iIE1DSCByZWdpc3RlcnMgZm9yIHJlYWRpbmcgdGhlIERSQU0gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCiAjZGVmaW5lIE1BRF9ESU1NX0MwCQkJKE1DSEJBUl9NSVJST1JfQkFTRV9TTkIgKyAweDUwMDQpCiAjZGVmaW5lIE1BRF9ESU1NX0MxCQkJKE1DSEJBUl9NSVJST1JfQkFTRV9TTkIgKyAweDUwMDgpCiAjZGVmaW5lIE1BRF9ESU1NX0MyCQkJKE1DSEJBUl9NSVJST1JfQkFTRV9TTkIgKyAweDUwMEMpCkBAIC0xNTc0LDcgKzE5MjQsNyBAQAogI2RlZmluZSAgIE1BRF9ESU1NX0FfU0laRV9TSElGVAkJMAogI2RlZmluZSAgIE1BRF9ESU1NX0FfU0laRV9NQVNLCQkoMHhmZiA8PCBNQURfRElNTV9BX1NJWkVfU0hJRlQpCiAKLS8qKiBzbmIgTUNIIHJlZ2lzdGVycyBmb3IgcHJpb3JpdHkgdHVuaW5nICovCisvKiBzbmIgTUNIIHJlZ2lzdGVycyBmb3IgcHJpb3JpdHkgdHVuaW5nICovCiAjZGVmaW5lIE1DSF9TU0tQRAkJCShNQ0hCQVJfTUlSUk9SX0JBU0VfU05CICsgMHg1ZDEwKQogI2RlZmluZSAgIE1DSF9TU0tQRF9XTTBfTUFTSwkJMHgzZgogI2RlZmluZSAgIE1DSF9TU0tQRF9XTTBfVkFMCQkweGMKQEAgLTIwMDIsNiArMjM1Miw3IEBACiAjZGVmaW5lIFRSQU5TQ09ERVJfQV9PRkZTRVQgMHg2MDAwMAogI2RlZmluZSBUUkFOU0NPREVSX0JfT0ZGU0VUIDB4NjEwMDAKICNkZWZpbmUgVFJBTlNDT0RFUl9DX09GRlNFVCAweDYyMDAwCisjZGVmaW5lIENIVl9UUkFOU0NPREVSX0NfT0ZGU0VUIDB4NjMwMDAKICNkZWZpbmUgVFJBTlNDT0RFUl9FRFBfT0ZGU0VUIDB4NmYwMDAKIAogI2RlZmluZSBfVFJBTlNDT0RFUjIocGlwZSwgcmVnKSAoZGV2X3ByaXYtPmluZm8udHJhbnNfb2Zmc2V0c1socGlwZSldIC0gXApAQCAtMjIyNiw2ICsyNTc3LDcgQEAKICNkZWZpbmUgR0VOM19TRFZPQwkweDYxMTYwCiAjZGVmaW5lIEdFTjRfSERNSUIJR0VOM19TRFZPQgogI2RlZmluZSBHRU40X0hETUlDCUdFTjNfU0RWT0MKKyNkZWZpbmUgQ0hWX0hETUlECTB4NjExNkMKICNkZWZpbmUgUENIX1NEVk9CCTB4ZTExNDAKICNkZWZpbmUgUENIX0hETUlCCVBDSF9TRFZPQgogI2RlZmluZSBQQ0hfSERNSUMJMHhlMTE1MApAQCAtMjI0Niw3ICsyNTk4LDcgQEAKICNkZWZpbmUgICBTRFZPX1BJUEVfQl9TRUxFQ1QJCQkoMSA8PCAzMCkKICNkZWZpbmUgICBTRFZPX1NUQUxMX1NFTEVDVAkJCSgxIDw8IDI5KQogI2RlZmluZSAgIFNEVk9fSU5URVJSVVBUX0VOQUJMRQkJCSgxIDw8IDI2KQotLyoqCisvKgogICogOTE1Ry9HTSBTRFZPIHBpeGVsIG11bHRpcGxpZXIuCiAgKiBQcm9ncmFtbWVkIHZhbHVlIGlzIG11bHRpcGxpZXIgLSAxLCB1cCB0byA1eC4KICAqIFxzYSBEUExMX01EX1VESV9NVUxUSVBMSUVSX01BU0sKQEAgLTIyODYsNiArMjYzOCwxMCBAQAogI2RlZmluZSAgIFNEVk9fUElQRV9TRUxfQ1BUKHBpcGUpCQkoKHBpcGUpIDw8IDI5KQogI2RlZmluZSAgIFNEVk9fUElQRV9TRUxfTUFTS19DUFQJCSgzIDw8IDI5KQogCisvKiBDSFYgU0RWTy9IRE1JIGJpdHM6ICovCisjZGVmaW5lICAgU0RWT19QSVBFX1NFTF9DSFYocGlwZSkJCSgocGlwZSkgPDwgMjQpCisjZGVmaW5lICAgU0RWT19QSVBFX1NFTF9NQVNLX0NIVgkJKDMgPDwgMjQpCisKIAogLyogRFZPIHBvcnQgY29udHJvbCAqLwogI2RlZmluZSBEVk9BCQkJMHg2MTEyMApAQCAtMjU1Niw2NSArMjkxMiw2NSBAQAogCiAvKiBUViBwb3J0IGNvbnRyb2wgKi8KICNkZWZpbmUgVFZfQ1RMCQkJMHg2ODAwMAotLyoqIEVuYWJsZXMgdGhlIFRWIGVuY29kZXIgKi8KKy8qIEVuYWJsZXMgdGhlIFRWIGVuY29kZXIgKi8KICMgZGVmaW5lIFRWX0VOQ19FTkFCTEUJCQkoMSA8PCAzMSkKLS8qKiBTb3VyY2VzIHRoZSBUViBlbmNvZGVyIGlucHV0IGZyb20gcGlwZSBCIGluc3RlYWQgb2YgQS4gKi8KKy8qIFNvdXJjZXMgdGhlIFRWIGVuY29kZXIgaW5wdXQgZnJvbSBwaXBlIEIgaW5zdGVhZCBvZiBBLiAqLwogIyBkZWZpbmUgVFZfRU5DX1BJUEVCX1NFTEVDVAkJKDEgPDwgMzApCi0vKiogT3V0cHV0cyBjb21wb3NpdGUgdmlkZW8gKERBQyBBIG9ubHkpICovCisvKiBPdXRwdXRzIGNvbXBvc2l0ZSB2aWRlbyAoREFDIEEgb25seSkgKi8KICMgZGVmaW5lIFRWX0VOQ19PVVRQVVRfQ09NUE9TSVRFCSgwIDw8IDI4KQotLyoqIE91dHB1dHMgU1ZpZGVvIHZpZGVvIChEQUMgQi9DKSAqLworLyogT3V0cHV0cyBTVmlkZW8gdmlkZW8gKERBQyBCL0MpICovCiAjIGRlZmluZSBUVl9FTkNfT1VUUFVUX1NWSURFTwkJKDEgPDwgMjgpCi0vKiogT3V0cHV0cyBDb21wb25lbnQgdmlkZW8gKERBQyBBL0IvQykgKi8KKy8qIE91dHB1dHMgQ29tcG9uZW50IHZpZGVvIChEQUMgQS9CL0MpICovCiAjIGRlZmluZSBUVl9FTkNfT1VUUFVUX0NPTVBPTkVOVAkoMiA8PCAyOCkKLS8qKiBPdXRwdXRzIENvbXBvc2l0ZSBhbmQgU1ZpZGVvIChEQUMgQS9CL0MpICovCisvKiBPdXRwdXRzIENvbXBvc2l0ZSBhbmQgU1ZpZGVvIChEQUMgQS9CL0MpICovCiAjIGRlZmluZSBUVl9FTkNfT1VUUFVUX1NWSURFT19DT01QT1NJVEUJKDMgPDwgMjgpCiAjIGRlZmluZSBUVl9UUklMRVZFTF9TWU5DCQkoMSA8PCAyMSkKLS8qKiBFbmFibGVzIHNsb3cgc3luYyBnZW5lcmF0aW9uICg5NDVHTSBvbmx5KSAqLworLyogRW5hYmxlcyBzbG93IHN5bmMgZ2VuZXJhdGlvbiAoOTQ1R00gb25seSkgKi8KICMgZGVmaW5lIFRWX1NMT1dfU1lOQwkJCSgxIDw8IDIwKQotLyoqIFNlbGVjdHMgNHggb3ZlcnNhbXBsaW5nIGZvciA0ODBpIGFuZCA1NzZwICovCisvKiBTZWxlY3RzIDR4IG92ZXJzYW1wbGluZyBmb3IgNDgwaSBhbmQgNTc2cCAqLwogIyBkZWZpbmUgVFZfT1ZFUlNBTVBMRV80WAkJKDAgPDwgMTgpCi0vKiogU2VsZWN0cyAyeCBvdmVyc2FtcGxpbmcgZm9yIDcyMHAgYW5kIDEwODBpICovCisvKiBTZWxlY3RzIDJ4IG92ZXJzYW1wbGluZyBmb3IgNzIwcCBhbmQgMTA4MGkgKi8KICMgZGVmaW5lIFRWX09WRVJTQU1QTEVfMlgJCSgxIDw8IDE4KQotLyoqIFNlbGVjdHMgbm8gb3ZlcnNhbXBsaW5nIGZvciAxMDgwcCAqLworLyogU2VsZWN0cyBubyBvdmVyc2FtcGxpbmcgZm9yIDEwODBwICovCiAjIGRlZmluZSBUVl9PVkVSU0FNUExFX05PTkUJCSgyIDw8IDE4KQotLyoqIFNlbGVjdHMgOHggb3ZlcnNhbXBsaW5nICovCisvKiBTZWxlY3RzIDh4IG92ZXJzYW1wbGluZyAqLwogIyBkZWZpbmUgVFZfT1ZFUlNBTVBMRV84WAkJKDMgPDwgMTgpCi0vKiogU2VsZWN0cyBwcm9ncmVzc2l2ZSBtb2RlIHJhdGhlciB0aGFuIGludGVybGFjZWQgKi8KKy8qIFNlbGVjdHMgcHJvZ3Jlc3NpdmUgbW9kZSByYXRoZXIgdGhhbiBpbnRlcmxhY2VkICovCiAjIGRlZmluZSBUVl9QUk9HUkVTU0lWRQkJCSgxIDw8IDE3KQotLyoqIFNldHMgdGhlIGNvbG9yYnVyc3QgdG8gUEFMIG1vZGUuICBSZXF1aXJlZCBmb3Igbm9uLU0gUEFMIG1vZGVzLiAqLworLyogU2V0cyB0aGUgY29sb3JidXJzdCB0byBQQUwgbW9kZS4gIFJlcXVpcmVkIGZvciBub24tTSBQQUwgbW9kZXMuICovCiAjIGRlZmluZSBUVl9QQUxfQlVSU1QJCQkoMSA8PCAxNikKLS8qKiBGaWVsZCBmb3Igc2V0dGluZyBkZWxheSBvZiBZIGNvbXBhcmVkIHRvIEMgKi8KKy8qIEZpZWxkIGZvciBzZXR0aW5nIGRlbGF5IG9mIFkgY29tcGFyZWQgdG8gQyAqLwogIyBkZWZpbmUgVFZfWUNfU0tFV19NQVNLCQkoNyA8PCAxMikKLS8qKiBFbmFibGVzIGEgZml4IGZvciA0ODBwLzU3NnAgc3RhbmRhcmQgZGVmaW5pdGlvbiBtb2RlcyBvbiB0aGUgOTE1R00gb25seSAqLworLyogRW5hYmxlcyBhIGZpeCBmb3IgNDgwcC81NzZwIHN0YW5kYXJkIGRlZmluaXRpb24gbW9kZXMgb24gdGhlIDkxNUdNIG9ubHkgKi8KICMgZGVmaW5lIFRWX0VOQ19TRFBfRklYCQkJKDEgPDwgMTEpCi0vKioKKy8qCiAgKiBFbmFibGVzIGEgZml4IGZvciB0aGUgOTE1R00gb25seS4KICAqCiAgKiBOb3Qgc3VyZSB3aGF0IGl0IGRvZXMuCiAgKi8KICMgZGVmaW5lIFRWX0VOQ19DMF9GSVgJCQkoMSA8PCAxMCkKLS8qKiBCaXRzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkgc29mdHdhcmUgKi8KKy8qIEJpdHMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBieSBzb2Z0d2FyZSAqLwogIyBkZWZpbmUgVFZfQ1RMX1NBVkUJCQkoKDEgPDwgMTEpIHwgKDMgPDwgOSkgfCAoNyA8PCA2KSB8IDB4ZikKICMgZGVmaW5lIFRWX0ZVU0VfU1RBVEVfTUFTSwkJKDMgPDwgNCkKLS8qKiBSZWFkLW9ubHkgc3RhdGUgdGhhdCByZXBvcnRzIGFsbCBmZWF0dXJlcyBlbmFibGVkICovCisvKiBSZWFkLW9ubHkgc3RhdGUgdGhhdCByZXBvcnRzIGFsbCBmZWF0dXJlcyBlbmFibGVkICovCiAjIGRlZmluZSBUVl9GVVNFX1NUQVRFX0VOQUJMRUQJCSgwIDw8IDQpCi0vKiogUmVhZC1vbmx5IHN0YXRlIHRoYXQgcmVwb3J0cyB0aGF0IE1hY3JvdmlzaW9uIGlzIGRpc2FibGVkIGluIGhhcmR3YXJlKi8KKy8qIFJlYWQtb25seSBzdGF0ZSB0aGF0IHJlcG9ydHMgdGhhdCBNYWNyb3Zpc2lvbiBpcyBkaXNhYmxlZCBpbiBoYXJkd2FyZSovCiAjIGRlZmluZSBUVl9GVVNFX1NUQVRFX05PX01BQ1JPVklTSU9OCSgxIDw8IDQpCi0vKiogUmVhZC1vbmx5IHN0YXRlIHRoYXQgcmVwb3J0cyB0aGF0IFRWLW91dCBpcyBkaXNhYmxlZCBpbiBoYXJkd2FyZS4gKi8KKy8qIFJlYWQtb25seSBzdGF0ZSB0aGF0IHJlcG9ydHMgdGhhdCBUVi1vdXQgaXMgZGlzYWJsZWQgaW4gaGFyZHdhcmUuICovCiAjIGRlZmluZSBUVl9GVVNFX1NUQVRFX0RJU0FCTEVECQkoMiA8PCA0KQotLyoqIE5vcm1hbCBvcGVyYXRpb24gKi8KKy8qIE5vcm1hbCBvcGVyYXRpb24gKi8KICMgZGVmaW5lIFRWX1RFU1RfTU9ERV9OT1JNQUwJCSgwIDw8IDApCi0vKiogRW5jb2RlciB0ZXN0IHBhdHRlcm4gMSAtIGNvbWJvIHBhdHRlcm4gKi8KKy8qIEVuY29kZXIgdGVzdCBwYXR0ZXJuIDEgLSBjb21ibyBwYXR0ZXJuICovCiAjIGRlZmluZSBUVl9URVNUX01PREVfUEFUVEVSTl8xCQkoMSA8PCAwKQotLyoqIEVuY29kZXIgdGVzdCBwYXR0ZXJuIDIgLSBmdWxsIHNjcmVlbiB2ZXJ0aWNhbCA3NSUgY29sb3IgYmFycyAqLworLyogRW5jb2RlciB0ZXN0IHBhdHRlcm4gMiAtIGZ1bGwgc2NyZWVuIHZlcnRpY2FsIDc1JSBjb2xvciBiYXJzICovCiAjIGRlZmluZSBUVl9URVNUX01PREVfUEFUVEVSTl8yCQkoMiA8PCAwKQotLyoqIEVuY29kZXIgdGVzdCBwYXR0ZXJuIDMgLSBmdWxsIHNjcmVlbiBob3Jpem9udGFsIDc1JSBjb2xvciBiYXJzICovCisvKiBFbmNvZGVyIHRlc3QgcGF0dGVybiAzIC0gZnVsbCBzY3JlZW4gaG9yaXpvbnRhbCA3NSUgY29sb3IgYmFycyAqLwogIyBkZWZpbmUgVFZfVEVTVF9NT0RFX1BBVFRFUk5fMwkJKDMgPDwgMCkKLS8qKiBFbmNvZGVyIHRlc3QgcGF0dGVybiA0IC0gcmFuZG9tIG5vaXNlICovCisvKiBFbmNvZGVyIHRlc3QgcGF0dGVybiA0IC0gcmFuZG9tIG5vaXNlICovCiAjIGRlZmluZSBUVl9URVNUX01PREVfUEFUVEVSTl80CQkoNCA8PCAwKQotLyoqIEVuY29kZXIgdGVzdCBwYXR0ZXJuIDUgLSBsaW5lYXIgY29sb3IgcmFtcHMgKi8KKy8qIEVuY29kZXIgdGVzdCBwYXR0ZXJuIDUgLSBsaW5lYXIgY29sb3IgcmFtcHMgKi8KICMgZGVmaW5lIFRWX1RFU1RfTU9ERV9QQVRURVJOXzUJCSg1IDw8IDApCi0vKioKKy8qCiAgKiBUaGlzIHRlc3QgbW9kZSBmb3JjZXMgdGhlIERBQ3MgdG8gNTAlIG9mIGZ1bGwgb3V0cHV0LgogICoKICAqIFRoaXMgaXMgdXNlZCBmb3IgbG9hZCBkZXRlY3Rpb24gaW4gY29tYmluYXRpb24gd2l0aCBUVkRBQ19TRU5TRV9NQVNLCkBAIC0yNjI0LDM1ICsyOTgwLDM1IEBACiAKICNkZWZpbmUgVFZfREFDCQkJMHg2ODAwNAogIyBkZWZpbmUgVFZfREFDX1NBVkUJCTB4MDBmZmZmMDAKLS8qKgorLyoKICAqIFJlcG9ydHMgdGhhdCBEQUMgc3RhdGUgY2hhbmdlIGxvZ2ljIGhhcyByZXBvcnRlZCBjaGFuZ2UgKFJPKS4KICAqCiAgKiBUaGlzIGdldHMgY2xlYXJlZCB3aGVuIFRWX0RBQ19TVEFURV9FTiBpcyBjbGVhcmVkCiAqLwogIyBkZWZpbmUgVFZEQUNfU1RBVEVfQ0hHCQkoMSA8PCAzMSkKICMgZGVmaW5lIFRWREFDX1NFTlNFX01BU0sJCSg3IDw8IDI4KQotLyoqIFJlcG9ydHMgdGhhdCBEQUMgQSB2b2x0YWdlIGlzIGFib3ZlIHRoZSBkZXRlY3QgdGhyZXNob2xkICovCisvKiBSZXBvcnRzIHRoYXQgREFDIEEgdm9sdGFnZSBpcyBhYm92ZSB0aGUgZGV0ZWN0IHRocmVzaG9sZCAqLwogIyBkZWZpbmUgVFZEQUNfQV9TRU5TRQkJCSgxIDw8IDMwKQotLyoqIFJlcG9ydHMgdGhhdCBEQUMgQiB2b2x0YWdlIGlzIGFib3ZlIHRoZSBkZXRlY3QgdGhyZXNob2xkICovCisvKiBSZXBvcnRzIHRoYXQgREFDIEIgdm9sdGFnZSBpcyBhYm92ZSB0aGUgZGV0ZWN0IHRocmVzaG9sZCAqLwogIyBkZWZpbmUgVFZEQUNfQl9TRU5TRQkJCSgxIDw8IDI5KQotLyoqIFJlcG9ydHMgdGhhdCBEQUMgQyB2b2x0YWdlIGlzIGFib3ZlIHRoZSBkZXRlY3QgdGhyZXNob2xkICovCisvKiBSZXBvcnRzIHRoYXQgREFDIEMgdm9sdGFnZSBpcyBhYm92ZSB0aGUgZGV0ZWN0IHRocmVzaG9sZCAqLwogIyBkZWZpbmUgVFZEQUNfQ19TRU5TRQkJCSgxIDw8IDI4KQotLyoqCisvKgogICogRW5hYmxlcyBEQUMgc3RhdGUgZGV0ZWN0aW9uIGxvZ2ljLCBmb3IgbG9hZC1iYXNlZCBUViBkZXRlY3Rpb24uCiAgKgogICogVGhlIFBMTCBvZiB0aGUgY2hvc2VuIHBpcGUgKGluIFRWX0NUTCkgbXVzdCBiZSBydW5uaW5nLCBhbmQgdGhlIGVuY29kZXIgc2V0CiAgKiB0byBvZmYsIGZvciBsb2FkIGRldGVjdGlvbiB0byB3b3JrLgogICovCiAjIGRlZmluZSBUVkRBQ19TVEFURV9DSEdfRU4JCSgxIDw8IDI3KQotLyoqIFNldHMgdGhlIERBQyBBIHNlbnNlIHZhbHVlIHRvIGhpZ2ggKi8KKy8qIFNldHMgdGhlIERBQyBBIHNlbnNlIHZhbHVlIHRvIGhpZ2ggKi8KICMgZGVmaW5lIFRWREFDX0FfU0VOU0VfQ1RMCQkoMSA8PCAyNikKLS8qKiBTZXRzIHRoZSBEQUMgQiBzZW5zZSB2YWx1ZSB0byBoaWdoICovCisvKiBTZXRzIHRoZSBEQUMgQiBzZW5zZSB2YWx1ZSB0byBoaWdoICovCiAjIGRlZmluZSBUVkRBQ19CX1NFTlNFX0NUTAkJKDEgPDwgMjUpCi0vKiogU2V0cyB0aGUgREFDIEMgc2Vuc2UgdmFsdWUgdG8gaGlnaCAqLworLyogU2V0cyB0aGUgREFDIEMgc2Vuc2UgdmFsdWUgdG8gaGlnaCAqLwogIyBkZWZpbmUgVFZEQUNfQ19TRU5TRV9DVEwJCSgxIDw8IDI0KQotLyoqIE92ZXJyaWRlcyB0aGUgRU5DX0VOQUJMRSBhbmQgREFDIHZvbHRhZ2UgbGV2ZWxzICovCisvKiBPdmVycmlkZXMgdGhlIEVOQ19FTkFCTEUgYW5kIERBQyB2b2x0YWdlIGxldmVscyAqLwogIyBkZWZpbmUgREFDX0NUTF9PVkVSUklERQkJKDEgPDwgNykKLS8qKiBTZXRzIHRoZSBzbGV3IHJhdGUuICBNdXN0IGJlIHByZXNlcnZlZCBpbiBzb2Z0d2FyZSAqLworLyogU2V0cyB0aGUgc2xldyByYXRlLiAgTXVzdCBiZSBwcmVzZXJ2ZWQgaW4gc29mdHdhcmUgKi8KICMgZGVmaW5lIEVOQ19UVkRBQ19TTEVXX0ZBU1QJCSgxIDw8IDYpCiAjIGRlZmluZSBEQUNfQV8xXzNfVgkJCSgwIDw8IDQpCiAjIGRlZmluZSBEQUNfQV8xXzFfVgkJCSgxIDw8IDQpCkBAIC0yNjY3LDcgKzMwMjMsNyBAQAogIyBkZWZpbmUgREFDX0NfMF83X1YJCQkoMiA8PCAwKQogIyBkZWZpbmUgREFDX0NfTUFTSwkJCSgzIDw8IDApCiAKLS8qKgorLyoKICAqIENTQyBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBpbiBhIGZsb2F0aW5nIHBvaW50IGZvcm1hdCB3aXRoIDkgYml0cyBvZgogICogbWFudGlzc2EgYW5kIDIgb3IgMyBiaXRzIG9mIGV4cG9uZW50LiAgVGhlIGV4cG9uZW50IGlzIHJlcHJlc2VudGVkIGFzIDIqKi1uLAogICogd2hlcmUgMi1iaXQgZXhwb25lbnRzIGFyZSB1bnNpZ25lZCBuLCBhbmQgMy1iaXQgZXhwb25lbnRzIGFyZSBzaWduZWQgbiB3aXRoCkBAIC0yNjgyLDcgKzMwMzgsNyBAQAogI2RlZmluZSBUVl9DU0NfWTIJCTB4NjgwMTQKICMgZGVmaW5lIFRWX0JZX01BU0sJCQkweDA3ZmYwMDAwCiAjIGRlZmluZSBUVl9CWV9TSElGVAkJCTE2Ci0vKioKKy8qCiAgKiBZIGF0dGVudWF0aW9uIGZvciBjb21wb25lbnQgdmlkZW8uCiAgKgogICogU3RvcmVkIGluIDEuOSBmaXhlZCBwb2ludC4KQEAgLTI2OTksNyArMzA1NSw3IEBACiAjZGVmaW5lIFRWX0NTQ19VMgkJMHg2ODAxYwogIyBkZWZpbmUgVFZfQlVfTUFTSwkJCTB4MDdmZjAwMDAKICMgZGVmaW5lIFRWX0JVX1NISUZUCQkJMTYKLS8qKgorLyoKICAqIFUgYXR0ZW51YXRpb24gZm9yIGNvbXBvbmVudCB2aWRlby4KICAqCiAgKiBTdG9yZWQgaW4gMS45IGZpeGVkIHBvaW50LgpAQCAtMjcxNiw3ICszMDcyLDcgQEAKICNkZWZpbmUgVFZfQ1NDX1YyCQkweDY4MDI0CiAjIGRlZmluZSBUVl9CVl9NQVNLCQkJMHgwN2ZmMDAwMAogIyBkZWZpbmUgVFZfQlZfU0hJRlQJCQkxNgotLyoqCisvKgogICogViBhdHRlbnVhdGlvbiBmb3IgY29tcG9uZW50IHZpZGVvLgogICoKICAqIFN0b3JlZCBpbiAxLjkgZml4ZWQgcG9pbnQuCkBAIC0yNzI1LDc0ICszMDgxLDc0IEBACiAjIGRlZmluZSBUVl9BVl9TSElGVAkJCTAKIAogI2RlZmluZSBUVl9DTFJfS05PQlMJCTB4NjgwMjgKLS8qKiAycy1jb21wbGVtZW50IGJyaWdodG5lc3MgYWRqdXN0bWVudCAqLworLyogMnMtY29tcGxlbWVudCBicmlnaHRuZXNzIGFkanVzdG1lbnQgKi8KICMgZGVmaW5lIFRWX0JSSUdIVE5FU1NfTUFTSwkJMHhmZjAwMDAwMAogIyBkZWZpbmUgVFZfQlJJR0hUTkVTU19TSElGVAkJMjQKLS8qKiBDb250cmFzdCBhZGp1c3RtZW50LCBhcyBhIDIuNiB1bnNpZ25lZCBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KKy8qIENvbnRyYXN0IGFkanVzdG1lbnQsIGFzIGEgMi42IHVuc2lnbmVkIGZsb2F0aW5nIHBvaW50IG51bWJlciAqLwogIyBkZWZpbmUgVFZfQ09OVFJBU1RfTUFTSwkJMHgwMGZmMDAwMAogIyBkZWZpbmUgVFZfQ09OVFJBU1RfU0hJRlQJCTE2Ci0vKiogU2F0dXJhdGlvbiBhZGp1c3RtZW50LCBhcyBhIDIuNiB1bnNpZ25lZCBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KKy8qIFNhdHVyYXRpb24gYWRqdXN0bWVudCwgYXMgYSAyLjYgdW5zaWduZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCiAjIGRlZmluZSBUVl9TQVRVUkFUSU9OX01BU0sJCTB4MDAwMGZmMDAKICMgZGVmaW5lIFRWX1NBVFVSQVRJT05fU0hJRlQJCTgKLS8qKiBIdWUgYWRqdXN0bWVudCwgYXMgYW4gaW50ZWdlciBwaGFzZSBhbmdsZSBpbiBkZWdyZWVzICovCisvKiBIdWUgYWRqdXN0bWVudCwgYXMgYW4gaW50ZWdlciBwaGFzZSBhbmdsZSBpbiBkZWdyZWVzICovCiAjIGRlZmluZSBUVl9IVUVfTUFTSwkJCTB4MDAwMDAwZmYKICMgZGVmaW5lIFRWX0hVRV9TSElGVAkJCTAKIAogI2RlZmluZSBUVl9DTFJfTEVWRUwJCTB4NjgwMmMKLS8qKiBDb250cm9scyB0aGUgREFDIGxldmVsIGZvciBibGFjayAqLworLyogQ29udHJvbHMgdGhlIERBQyBsZXZlbCBmb3IgYmxhY2sgKi8KICMgZGVmaW5lIFRWX0JMQUNLX0xFVkVMX01BU0sJCTB4MDFmZjAwMDAKICMgZGVmaW5lIFRWX0JMQUNLX0xFVkVMX1NISUZUCQkxNgotLyoqIENvbnRyb2xzIHRoZSBEQUMgbGV2ZWwgZm9yIGJsYW5raW5nICovCisvKiBDb250cm9scyB0aGUgREFDIGxldmVsIGZvciBibGFua2luZyAqLwogIyBkZWZpbmUgVFZfQkxBTktfTEVWRUxfTUFTSwkJMHgwMDAwMDFmZgogIyBkZWZpbmUgVFZfQkxBTktfTEVWRUxfU0hJRlQJCTAKIAogI2RlZmluZSBUVl9IX0NUTF8xCQkweDY4MDMwCi0vKiogTnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgaHN5bmMuICovCisvKiBOdW1iZXIgb2YgcGl4ZWxzIGluIHRoZSBoc3luYy4gKi8KICMgZGVmaW5lIFRWX0hTWU5DX0VORF9NQVNLCQkweDFmZmYwMDAwCiAjIGRlZmluZSBUVl9IU1lOQ19FTkRfU0hJRlQJCTE2Ci0vKiogVG90YWwgbnVtYmVyIG9mIHBpeGVscyBtaW51cyBvbmUgaW4gdGhlIGxpbmUgKGRpc3BsYXkgYW5kIGJsYW5raW5nKS4gKi8KKy8qIFRvdGFsIG51bWJlciBvZiBwaXhlbHMgbWludXMgb25lIGluIHRoZSBsaW5lIChkaXNwbGF5IGFuZCBibGFua2luZykuICovCiAjIGRlZmluZSBUVl9IVE9UQUxfTUFTSwkJCTB4MDAwMDFmZmYKICMgZGVmaW5lIFRWX0hUT1RBTF9TSElGVAkJMAogCiAjZGVmaW5lIFRWX0hfQ1RMXzIJCTB4NjgwMzQKLS8qKiBFbmFibGVzIHRoZSBjb2xvcmJ1cnN0IChuZWVkZWQgZm9yIG5vbi1jb21wb25lbnQgY29sb3IpICovCisvKiBFbmFibGVzIHRoZSBjb2xvcmJ1cnN0IChuZWVkZWQgZm9yIG5vbi1jb21wb25lbnQgY29sb3IpICovCiAjIGRlZmluZSBUVl9CVVJTVF9FTkEJCQkoMSA8PCAzMSkKLS8qKiBPZmZzZXQgb2YgdGhlIGNvbG9yYnVyc3QgZnJvbSB0aGUgc3RhcnQgb2YgaHN5bmMsIGluIHBpeGVscyBtaW51cyBvbmUuICovCisvKiBPZmZzZXQgb2YgdGhlIGNvbG9yYnVyc3QgZnJvbSB0aGUgc3RhcnQgb2YgaHN5bmMsIGluIHBpeGVscyBtaW51cyBvbmUuICovCiAjIGRlZmluZSBUVl9IQlVSU1RfU1RBUlRfU0hJRlQJCTE2CiAjIGRlZmluZSBUVl9IQlVSU1RfU1RBUlRfTUFTSwkJMHgxZmZmMDAwMAotLyoqIExlbmd0aCBvZiB0aGUgY29sb3JidXJzdCAqLworLyogTGVuZ3RoIG9mIHRoZSBjb2xvcmJ1cnN0ICovCiAjIGRlZmluZSBUVl9IQlVSU1RfTEVOX1NISUZUCQkwCiAjIGRlZmluZSBUVl9IQlVSU1RfTEVOX01BU0sJCTB4MDAwMWZmZgogCiAjZGVmaW5lIFRWX0hfQ1RMXzMJCTB4NjgwMzgKLS8qKiBFbmQgb2YgaGJsYW5rLCBtZWFzdXJlZCBpbiBwaXhlbHMgbWludXMgb25lIGZyb20gc3RhcnQgb2YgaHN5bmMgKi8KKy8qIEVuZCBvZiBoYmxhbmssIG1lYXN1cmVkIGluIHBpeGVscyBtaW51cyBvbmUgZnJvbSBzdGFydCBvZiBoc3luYyAqLwogIyBkZWZpbmUgVFZfSEJMQU5LX0VORF9TSElGVAkJMTYKICMgZGVmaW5lIFRWX0hCTEFOS19FTkRfTUFTSwkJMHgxZmZmMDAwMAotLyoqIFN0YXJ0IG9mIGhibGFuaywgbWVhc3VyZWQgaW4gcGl4ZWxzIG1pbnVzIG9uZSBmcm9tIHN0YXJ0IG9mIGhzeW5jICovCisvKiBTdGFydCBvZiBoYmxhbmssIG1lYXN1cmVkIGluIHBpeGVscyBtaW51cyBvbmUgZnJvbSBzdGFydCBvZiBoc3luYyAqLwogIyBkZWZpbmUgVFZfSEJMQU5LX1NUQVJUX1NISUZUCQkwCiAjIGRlZmluZSBUVl9IQkxBTktfU1RBUlRfTUFTSwkJMHgwMDAxZmZmCiAKICNkZWZpbmUgVFZfVl9DVExfMQkJMHg2ODAzYwotLyoqIFhYWCAqLworLyogWFhYICovCiAjIGRlZmluZSBUVl9OQlJfRU5EX1NISUZUCQkxNgogIyBkZWZpbmUgVFZfTkJSX0VORF9NQVNLCQkweDA3ZmYwMDAwCi0vKiogWFhYICovCisvKiBYWFggKi8KICMgZGVmaW5lIFRWX1ZJX0VORF9GMV9TSElGVAkJOAogIyBkZWZpbmUgVFZfVklfRU5EX0YxX01BU0sJCTB4MDAwMDNmMDAKLS8qKiBYWFggKi8KKy8qIFhYWCAqLwogIyBkZWZpbmUgVFZfVklfRU5EX0YyX1NISUZUCQkwCiAjIGRlZmluZSBUVl9WSV9FTkRfRjJfTUFTSwkJMHgwMDAwMDAzZgogCiAjZGVmaW5lIFRWX1ZfQ1RMXzIJCTB4NjgwNDAKLS8qKiBMZW5ndGggb2YgdnN5bmMsIGluIGhhbGYgbGluZXMgKi8KKy8qIExlbmd0aCBvZiB2c3luYywgaW4gaGFsZiBsaW5lcyAqLwogIyBkZWZpbmUgVFZfVlNZTkNfTEVOX01BU0sJCTB4MDdmZjAwMDAKICMgZGVmaW5lIFRWX1ZTWU5DX0xFTl9TSElGVAkJMTYKLS8qKiBPZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHZzeW5jIGluIGZpZWxkIDEsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4gdGhlCisvKiBPZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHZzeW5jIGluIGZpZWxkIDEsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4gdGhlCiAgKiBudW1iZXIgb2YgaGFsZiBsaW5lcy4KICAqLwogIyBkZWZpbmUgVFZfVlNZTkNfU1RBUlRfRjFfTUFTSwkJMHgwMDAwN2YwMAogIyBkZWZpbmUgVFZfVlNZTkNfU1RBUlRfRjFfU0hJRlQJOAotLyoqCisvKgogICogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB2c3luYyBpbiBmaWVsZCAyLCBtZWFzdXJlZCBpbiBvbmUgbGVzcyB0aGFuIHRoZQogICogbnVtYmVyIG9mIGhhbGYgbGluZXMuCiAgKi8KQEAgLTI4MDAsMTcgKzMxNTYsMTcgQEAKICMgZGVmaW5lIFRWX1ZTWU5DX1NUQVJUX0YyX1NISUZUCTAKIAogI2RlZmluZSBUVl9WX0NUTF8zCQkweDY4MDQ0Ci0vKiogRW5hYmxlcyBnZW5lcmF0aW9uIG9mIHRoZSBlcXVhbGl6YXRpb24gc2lnbmFsICovCisvKiBFbmFibGVzIGdlbmVyYXRpb24gb2YgdGhlIGVxdWFsaXphdGlvbiBzaWduYWwgKi8KICMgZGVmaW5lIFRWX0VRVUFMX0VOQQkJCSgxIDw8IDMxKQotLyoqIExlbmd0aCBvZiB2c3luYywgaW4gaGFsZiBsaW5lcyAqLworLyogTGVuZ3RoIG9mIHZzeW5jLCBpbiBoYWxmIGxpbmVzICovCiAjIGRlZmluZSBUVl9WRVFfTEVOX01BU0sJCTB4MDA3ZjAwMDAKICMgZGVmaW5lIFRWX1ZFUV9MRU5fU0hJRlQJCTE2Ci0vKiogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiBlcXVhbGl6YXRpb24gaW4gZmllbGQgMSwgbWVhc3VyZWQgaW4gb25lIGxlc3MgdGhhbgorLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiBlcXVhbGl6YXRpb24gaW4gZmllbGQgMSwgbWVhc3VyZWQgaW4gb25lIGxlc3MgdGhhbgogICogdGhlIG51bWJlciBvZiBoYWxmIGxpbmVzLgogICovCiAjIGRlZmluZSBUVl9WRVFfU1RBUlRfRjFfTUFTSwkJMHgwMDA3ZjAwCiAjIGRlZmluZSBUVl9WRVFfU1RBUlRfRjFfU0hJRlQJCTgKLS8qKgorLyoKICAqIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgZXF1YWxpemF0aW9uIGluIGZpZWxkIDIsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4KICAqIHRoZSBudW1iZXIgb2YgaGFsZiBsaW5lcy4KICAqLwpAQCAtMjgxOCwxMyArMzE3NCwxMyBAQAogIyBkZWZpbmUgVFZfVkVRX1NUQVJUX0YyX1NISUZUCQkwCiAKICNkZWZpbmUgVFZfVl9DVExfNAkJMHg2ODA0OAotLyoqCisvKgogICogT2Zmc2V0IHRvIHN0YXJ0IG9mIHZlcnRpY2FsIGNvbG9yYnVyc3QsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4gdGhlCiAgKiBudW1iZXIgb2YgbGluZXMgZnJvbSB2ZXJ0aWNhbCBzdGFydC4KICAqLwogIyBkZWZpbmUgVFZfVkJVUlNUX1NUQVJUX0YxX01BU0sJMHgwMDNmMDAwMAogIyBkZWZpbmUgVFZfVkJVUlNUX1NUQVJUX0YxX1NISUZUCTE2Ci0vKioKKy8qCiAgKiBPZmZzZXQgdG8gdGhlIGVuZCBvZiB2ZXJ0aWNhbCBjb2xvcmJ1cnN0LCBtZWFzdXJlZCBpbiBvbmUgbGVzcyB0aGFuIHRoZQogICogbnVtYmVyIG9mIGxpbmVzIGZyb20gdGhlIHN0YXJ0IG9mIE5CUi4KICAqLwpAQCAtMjgzMiwxMyArMzE4OCwxMyBAQAogIyBkZWZpbmUgVFZfVkJVUlNUX0VORF9GMV9TSElGVAkJMAogCiAjZGVmaW5lIFRWX1ZfQ1RMXzUJCTB4NjgwNGMKLS8qKgorLyoKICAqIE9mZnNldCB0byBzdGFydCBvZiB2ZXJ0aWNhbCBjb2xvcmJ1cnN0LCBtZWFzdXJlZCBpbiBvbmUgbGVzcyB0aGFuIHRoZQogICogbnVtYmVyIG9mIGxpbmVzIGZyb20gdmVydGljYWwgc3RhcnQuCiAgKi8KICMgZGVmaW5lIFRWX1ZCVVJTVF9TVEFSVF9GMl9NQVNLCTB4MDAzZjAwMDAKICMgZGVmaW5lIFRWX1ZCVVJTVF9TVEFSVF9GMl9TSElGVAkxNgotLyoqCisvKgogICogT2Zmc2V0IHRvIHRoZSBlbmQgb2YgdmVydGljYWwgY29sb3JidXJzdCwgbWVhc3VyZWQgaW4gb25lIGxlc3MgdGhhbiB0aGUKICAqIG51bWJlciBvZiBsaW5lcyBmcm9tIHRoZSBzdGFydCBvZiBOQlIuCiAgKi8KQEAgLTI4NDYsMTMgKzMyMDIsMTMgQEAKICMgZGVmaW5lIFRWX1ZCVVJTVF9FTkRfRjJfU0hJRlQJCTAKIAogI2RlZmluZSBUVl9WX0NUTF82CQkweDY4MDUwCi0vKioKKy8qCiAgKiBPZmZzZXQgdG8gc3RhcnQgb2YgdmVydGljYWwgY29sb3JidXJzdCwgbWVhc3VyZWQgaW4gb25lIGxlc3MgdGhhbiB0aGUKICAqIG51bWJlciBvZiBsaW5lcyBmcm9tIHZlcnRpY2FsIHN0YXJ0LgogICovCiAjIGRlZmluZSBUVl9WQlVSU1RfU1RBUlRfRjNfTUFTSwkweDAwM2YwMDAwCiAjIGRlZmluZSBUVl9WQlVSU1RfU1RBUlRfRjNfU0hJRlQJMTYKLS8qKgorLyoKICAqIE9mZnNldCB0byB0aGUgZW5kIG9mIHZlcnRpY2FsIGNvbG9yYnVyc3QsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4gdGhlCiAgKiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgc3RhcnQgb2YgTkJSLgogICovCkBAIC0yODYwLDEzICszMjE2LDEzIEBACiAjIGRlZmluZSBUVl9WQlVSU1RfRU5EX0YzX1NISUZUCQkwCiAKICNkZWZpbmUgVFZfVl9DVExfNwkJMHg2ODA1NAotLyoqCisvKgogICogT2Zmc2V0IHRvIHN0YXJ0IG9mIHZlcnRpY2FsIGNvbG9yYnVyc3QsIG1lYXN1cmVkIGluIG9uZSBsZXNzIHRoYW4gdGhlCiAgKiBudW1iZXIgb2YgbGluZXMgZnJvbSB2ZXJ0aWNhbCBzdGFydC4KICAqLwogIyBkZWZpbmUgVFZfVkJVUlNUX1NUQVJUX0Y0X01BU0sJMHgwMDNmMDAwMAogIyBkZWZpbmUgVFZfVkJVUlNUX1NUQVJUX0Y0X1NISUZUCTE2Ci0vKioKKy8qCiAgKiBPZmZzZXQgdG8gdGhlIGVuZCBvZiB2ZXJ0aWNhbCBjb2xvcmJ1cnN0LCBtZWFzdXJlZCBpbiBvbmUgbGVzcyB0aGFuIHRoZQogICogbnVtYmVyIG9mIGxpbmVzIGZyb20gdGhlIHN0YXJ0IG9mIE5CUi4KICAqLwpAQCAtMjg3NCw1NiArMzIzMCw1NiBAQAogIyBkZWZpbmUgVFZfVkJVUlNUX0VORF9GNF9TSElGVAkJMAogCiAjZGVmaW5lIFRWX1NDX0NUTF8xCQkweDY4MDYwCi0vKiogVHVybnMgb24gdGhlIGZpcnN0IHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KKy8qIFR1cm5zIG9uIHRoZSBmaXJzdCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ19EREExX0VOCQkJKDEgPDwgMzEpCi0vKiogVHVybnMgb24gdGhlIGZpcnN0IHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KKy8qIFR1cm5zIG9uIHRoZSBmaXJzdCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ19EREEyX0VOCQkJKDEgPDwgMzApCi0vKiogVHVybnMgb24gdGhlIGZpcnN0IHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KKy8qIFR1cm5zIG9uIHRoZSBmaXJzdCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ19EREEzX0VOCQkJKDEgPDwgMjkpCi0vKiogU2V0cyB0aGUgc3ViY2FycmllciBEREEgdG8gcmVzZXQgZnJlcXVlbmN5IGV2ZXJ5IG90aGVyIGZpZWxkICovCisvKiBTZXRzIHRoZSBzdWJjYXJyaWVyIEREQSB0byByZXNldCBmcmVxdWVuY3kgZXZlcnkgb3RoZXIgZmllbGQgKi8KICMgZGVmaW5lIFRWX1NDX1JFU0VUX0VWRVJZXzIJCSgwIDw8IDI0KQotLyoqIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIHJlc2V0IGZyZXF1ZW5jeSBldmVyeSBmb3VydGggZmllbGQgKi8KKy8qIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIHJlc2V0IGZyZXF1ZW5jeSBldmVyeSBmb3VydGggZmllbGQgKi8KICMgZGVmaW5lIFRWX1NDX1JFU0VUX0VWRVJZXzQJCSgxIDw8IDI0KQotLyoqIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIHJlc2V0IGZyZXF1ZW5jeSBldmVyeSBlaWdodGggZmllbGQgKi8KKy8qIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIHJlc2V0IGZyZXF1ZW5jeSBldmVyeSBlaWdodGggZmllbGQgKi8KICMgZGVmaW5lIFRWX1NDX1JFU0VUX0VWRVJZXzgJCSgyIDw8IDI0KQotLyoqIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIG5ldmVyIHJlc2V0IHRoZSBmcmVxdWVuY3kgKi8KKy8qIFNldHMgdGhlIHN1YmNhcnJpZXIgRERBIHRvIG5ldmVyIHJlc2V0IHRoZSBmcmVxdWVuY3kgKi8KICMgZGVmaW5lIFRWX1NDX1JFU0VUX05FVkVSCQkoMyA8PCAyNCkKLS8qKiBTZXRzIHRoZSBwZWFrIGFtcGxpdHVkZSBvZiB0aGUgY29sb3JidXJzdC4qLworLyogU2V0cyB0aGUgcGVhayBhbXBsaXR1ZGUgb2YgdGhlIGNvbG9yYnVyc3QuKi8KICMgZGVmaW5lIFRWX0JVUlNUX0xFVkVMX01BU0sJCTB4MDBmZjAwMDAKICMgZGVmaW5lIFRWX0JVUlNUX0xFVkVMX1NISUZUCQkxNgotLyoqIFNldHMgdGhlIGluY3JlbWVudCBvZiB0aGUgZmlyc3Qgc3ViY2FycmllciBwaGFzZSBnZW5lcmF0aW9uIEREQSAqLworLyogU2V0cyB0aGUgaW5jcmVtZW50IG9mIHRoZSBmaXJzdCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ0REQTFfSU5DX01BU0sJCTB4MDAwMDBmZmYKICMgZGVmaW5lIFRWX1NDRERBMV9JTkNfU0hJRlQJCTAKIAogI2RlZmluZSBUVl9TQ19DVExfMgkJMHg2ODA2NAotLyoqIFNldHMgdGhlIHJvbGxvdmVyIGZvciB0aGUgc2Vjb25kIHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KKy8qIFNldHMgdGhlIHJvbGxvdmVyIGZvciB0aGUgc2Vjb25kIHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KICMgZGVmaW5lIFRWX1NDRERBMl9TSVpFX01BU0sJCTB4N2ZmZjAwMDAKICMgZGVmaW5lIFRWX1NDRERBMl9TSVpFX1NISUZUCQkxNgotLyoqIFNldHMgdGhlIGluY3JlZW50IG9mIHRoZSBzZWNvbmQgc3ViY2FycmllciBwaGFzZSBnZW5lcmF0aW9uIEREQSAqLworLyogU2V0cyB0aGUgaW5jcmVlbnQgb2YgdGhlIHNlY29uZCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ0REQTJfSU5DX01BU0sJCTB4MDAwMDdmZmYKICMgZGVmaW5lIFRWX1NDRERBMl9JTkNfU0hJRlQJCTAKIAogI2RlZmluZSBUVl9TQ19DVExfMwkJMHg2ODA2OAotLyoqIFNldHMgdGhlIHJvbGxvdmVyIGZvciB0aGUgdGhpcmQgc3ViY2FycmllciBwaGFzZSBnZW5lcmF0aW9uIEREQSAqLworLyogU2V0cyB0aGUgcm9sbG92ZXIgZm9yIHRoZSB0aGlyZCBzdWJjYXJyaWVyIHBoYXNlIGdlbmVyYXRpb24gRERBICovCiAjIGRlZmluZSBUVl9TQ0REQTNfU0laRV9NQVNLCQkweDdmZmYwMDAwCiAjIGRlZmluZSBUVl9TQ0REQTNfU0laRV9TSElGVAkJMTYKLS8qKiBTZXRzIHRoZSBpbmNyZWVudCBvZiB0aGUgdGhpcmQgc3ViY2FycmllciBwaGFzZSBnZW5lcmF0aW9uIEREQSAqLworLyogU2V0cyB0aGUgaW5jcmVlbnQgb2YgdGhlIHRoaXJkIHN1YmNhcnJpZXIgcGhhc2UgZ2VuZXJhdGlvbiBEREEgKi8KICMgZGVmaW5lIFRWX1NDRERBM19JTkNfTUFTSwkJMHgwMDAwN2ZmZgogIyBkZWZpbmUgVFZfU0NEREEzX0lOQ19TSElGVAkJMAogCiAjZGVmaW5lIFRWX1dJTl9QT1MJCTB4NjgwNzAKLS8qKiBYIGNvb3JkaW5hdGUgb2YgdGhlIGRpc3BsYXkgZnJvbSB0aGUgc3RhcnQgb2YgaG9yaXpvbnRhbCBhY3RpdmUgKi8KKy8qIFggY29vcmRpbmF0ZSBvZiB0aGUgZGlzcGxheSBmcm9tIHRoZSBzdGFydCBvZiBob3Jpem9udGFsIGFjdGl2ZSAqLwogIyBkZWZpbmUgVFZfWFBPU19NQVNLCQkJMHgxZmZmMDAwMAogIyBkZWZpbmUgVFZfWFBPU19TSElGVAkJCTE2Ci0vKiogWSBjb29yZGluYXRlIG9mIHRoZSBkaXNwbGF5IGZyb20gdGhlIHN0YXJ0IG9mIHZlcnRpY2FsIGFjdGl2ZSAoTkJSKSAqLworLyogWSBjb29yZGluYXRlIG9mIHRoZSBkaXNwbGF5IGZyb20gdGhlIHN0YXJ0IG9mIHZlcnRpY2FsIGFjdGl2ZSAoTkJSKSAqLwogIyBkZWZpbmUgVFZfWVBPU19NQVNLCQkJMHgwMDAwMGZmZgogIyBkZWZpbmUgVFZfWVBPU19TSElGVAkJCTAKIAogI2RlZmluZSBUVl9XSU5fU0laRQkJMHg2ODA3NAotLyoqIEhvcml6b250YWwgc2l6ZSBvZiB0aGUgZGlzcGxheSB3aW5kb3csIG1lYXN1cmVkIGluIHBpeGVscyovCisvKiBIb3Jpem9udGFsIHNpemUgb2YgdGhlIGRpc3BsYXkgd2luZG93LCBtZWFzdXJlZCBpbiBwaXhlbHMqLwogIyBkZWZpbmUgVFZfWFNJWkVfTUFTSwkJCTB4MWZmZjAwMDAKICMgZGVmaW5lIFRWX1hTSVpFX1NISUZUCQkJMTYKLS8qKgorLyoKICAqIFZlcnRpY2FsIHNpemUgb2YgdGhlIGRpc3BsYXkgd2luZG93LCBtZWFzdXJlZCBpbiBwaXhlbHMuCiAgKgogICogTXVzdCBiZSBldmVuIGZvciBpbnRlcmxhY2VkIG1vZGVzLgpAQCAtMjkzMiwyOCArMzI4OCwyOCBAQAogIyBkZWZpbmUgVFZfWVNJWkVfU0hJRlQJCQkwCiAKICNkZWZpbmUgVFZfRklMVEVSX0NUTF8xCQkweDY4MDgwCi0vKioKKy8qCiAgKiBFbmFibGVzIGF1dG9tYXRpYyBzY2FsaW5nIGNhbGN1bGF0aW9uLgogICoKICAqIElmIHNldCwgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBhcmUgaWdub3JlZCwgYW5kIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBjYW4KICAqIGJlIHJlYWQgYmFjayBmcm9tIHRoZSByZWdpc3Rlci4KICAqLwogIyBkZWZpbmUgVFZfQVVUT19TQ0FMRQkJCSgxIDw8IDMxKQotLyoqCisvKgogICogRGlzYWJsZXMgdGhlIHZlcnRpY2FsIGZpbHRlci4KICAqCiAgKiBUaGlzIGlzIHJlcXVpcmVkIG9uIG1vZGVzIG1vcmUgdGhhbiAxMDI0IHBpeGVscyB3aWRlICovCiAjIGRlZmluZSBUVl9WX0ZJTFRFUl9CWVBBU1MJCSgxIDw8IDI5KQotLyoqIEVuYWJsZXMgYWRhcHRpdmUgdmVydGljYWwgZmlsdGVyaW5nICovCisvKiBFbmFibGVzIGFkYXB0aXZlIHZlcnRpY2FsIGZpbHRlcmluZyAqLwogIyBkZWZpbmUgVFZfVkFEQVBUCQkJKDEgPDwgMjgpCiAjIGRlZmluZSBUVl9WQURBUFRfTU9ERV9NQVNLCQkoMyA8PCAyNikKLS8qKiBTZWxlY3RzIHRoZSBsZWFzdCBhZGFwdGl2ZSB2ZXJ0aWNhbCBmaWx0ZXJpbmcgbW9kZSAqLworLyogU2VsZWN0cyB0aGUgbGVhc3QgYWRhcHRpdmUgdmVydGljYWwgZmlsdGVyaW5nIG1vZGUgKi8KICMgZGVmaW5lIFRWX1ZBREFQVF9NT0RFX0xFQVNUCQkoMCA8PCAyNikKLS8qKiBTZWxlY3RzIHRoZSBtb2RlcmF0ZWx5IGFkYXB0aXZlIHZlcnRpY2FsIGZpbHRlcmluZyBtb2RlICovCisvKiBTZWxlY3RzIHRoZSBtb2RlcmF0ZWx5IGFkYXB0aXZlIHZlcnRpY2FsIGZpbHRlcmluZyBtb2RlICovCiAjIGRlZmluZSBUVl9WQURBUFRfTU9ERV9NT0RFUkFURQkoMSA8PCAyNikKLS8qKiBTZWxlY3RzIHRoZSBtb3N0IGFkYXB0aXZlIHZlcnRpY2FsIGZpbHRlcmluZyBtb2RlICovCisvKiBTZWxlY3RzIHRoZSBtb3N0IGFkYXB0aXZlIHZlcnRpY2FsIGZpbHRlcmluZyBtb2RlICovCiAjIGRlZmluZSBUVl9WQURBUFRfTU9ERV9NT1NUCQkoMyA8PCAyNikKLS8qKgorLyoKICAqIFNldHMgdGhlIGhvcml6b250YWwgc2NhbGluZyBmYWN0b3IuCiAgKgogICogVGhpcyBzaG91bGQgYmUgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgaG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvciBkaXZpZGVkCkBAIC0yOTY1LDE0ICszMzIxLDE0IEBACiAjIGRlZmluZSBUVl9IU0NBTEVfRlJBQ19TSElGVAkJMAogCiAjZGVmaW5lIFRWX0ZJTFRFUl9DVExfMgkJMHg2ODA4NAotLyoqCisvKgogICogU2V0cyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSAzLjE1IGZpeGVkLXBvaW50IHZlcnRpY2FsIHNjYWxpbmcgZmFjdG9yLgogICoKICAqIFRWX1ZTQ0FMRSBzaG91bGQgYmUgKHNyYyBoZWlnaHQgLSAxKSAvICgoaW50ZXJsYWNlICogZGVzdCBoZWlnaHQpIC0gMSkKICAqLwogIyBkZWZpbmUgVFZfVlNDQUxFX0lOVF9NQVNLCQkweDAwMDM4MDAwCiAjIGRlZmluZSBUVl9WU0NBTEVfSU5UX1NISUZUCQkxNQotLyoqCisvKgogICogU2V0cyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSAzLjE1IGZpeGVkLXBvaW50IHZlcnRpY2FsIHNjYWxpbmcgZmFjdG9yLgogICoKICAqIFxzYSBUVl9WU0NBTEVfSU5UX01BU0sKQEAgLTI5ODEsNyArMzMzNyw3IEBACiAjIGRlZmluZSBUVl9WU0NBTEVfRlJBQ19TSElGVAkJMAogCiAjZGVmaW5lIFRWX0ZJTFRFUl9DVExfMwkJMHg2ODA4OAotLyoqCisvKgogICogU2V0cyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSAzLjE1IGZpeGVkLXBvaW50IHZlcnRpY2FsIHNjYWxpbmcgZmFjdG9yLgogICoKICAqIFRWX1ZTQ0FMRSBzaG91bGQgYmUgKHNyYyBoZWlnaHQgLSAxKSAvICgxLzQgKiAoZGVzdCBoZWlnaHQgLSAxKSkKQEAgLTI5OTAsNyArMzM0Niw3IEBACiAgKi8KICMgZGVmaW5lIFRWX1ZTQ0FMRV9JUF9JTlRfTUFTSwkJMHgwMDAzODAwMAogIyBkZWZpbmUgVFZfVlNDQUxFX0lQX0lOVF9TSElGVAkJMTUKLS8qKgorLyoKICAqIFNldHMgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgMy4xNSBmaXhlZC1wb2ludCB2ZXJ0aWNhbCBzY2FsaW5nIGZhY3Rvci4KICAqCiAgKiBGb3IgcHJvZ3Jlc3NpdmUgbW9kZXMsIFRWX1ZTQ0FMRV9JUF9JTlQgc2hvdWxkIGJlIHNldCB0byB6ZXJvZXMuCkBAIC0zMDAyLDI2ICszMzU4LDI2IEBACiAKICNkZWZpbmUgVFZfQ0NfQ09OVFJPTAkJMHg2ODA5MAogIyBkZWZpbmUgVFZfQ0NfRU5BQkxFCQkJKDEgPDwgMzEpCi0vKioKKy8qCiAgKiBTcGVjaWZpZXMgd2hpY2ggZmllbGQgdG8gc2VuZCB0aGUgQ0MgZGF0YSBpbi4KICAqCiAgKiBDQyBkYXRhIGlzIHVzdWFsbHkgc2VudCBpbiBmaWVsZCAwLgogICovCiAjIGRlZmluZSBUVl9DQ19GSURfTUFTSwkJCSgxIDw8IDI3KQogIyBkZWZpbmUgVFZfQ0NfRklEX1NISUZUCQkyNwotLyoqIFNldHMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIENDIGRhdGEuICBVc3VhbGx5IDEzNS4gKi8KKy8qIFNldHMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIENDIGRhdGEuICBVc3VhbGx5IDEzNS4gKi8KICMgZGVmaW5lIFRWX0NDX0hPRkZfTUFTSwkJMHgwM2ZmMDAwMAogIyBkZWZpbmUgVFZfQ0NfSE9GRl9TSElGVAkJMTYKLS8qKiBTZXRzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgQ0MgZGF0YS4gIFVzdWFsbHkgMjEgKi8KKy8qIFNldHMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBDQyBkYXRhLiAgVXN1YWxseSAyMSAqLwogIyBkZWZpbmUgVFZfQ0NfTElORV9NQVNLCQkweDAwMDAwMDNmCiAjIGRlZmluZSBUVl9DQ19MSU5FX1NISUZUCQkwCiAKICNkZWZpbmUgVFZfQ0NfREFUQQkJMHg2ODA5NAogIyBkZWZpbmUgVFZfQ0NfUkRZCQkJKDEgPDwgMzEpCi0vKiogU2Vjb25kIHdvcmQgb2YgQ0MgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gKi8KKy8qIFNlY29uZCB3b3JkIG9mIENDIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuICovCiAjIGRlZmluZSBUVl9DQ19EQVRBXzJfTUFTSwkJMHgwMDdmMDAwMAogIyBkZWZpbmUgVFZfQ0NfREFUQV8yX1NISUZUCQkxNgotLyoqIEZpcnN0IHdvcmQgb2YgQ0MgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gKi8KKy8qIEZpcnN0IHdvcmQgb2YgQ0MgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gKi8KICMgZGVmaW5lIFRWX0NDX0RBVEFfMV9NQVNLCQkweDAwMDAwMDdmCiAjIGRlZmluZSBUVl9DQ19EQVRBXzFfU0hJRlQJCTAKIApAQCAtMzA0Myw2ICszMzk5LDggQEAKICNkZWZpbmUgICBEUF9QT1JUX0VOCQkJKDEgPDwgMzEpCiAjZGVmaW5lICAgRFBfUElQRUJfU0VMRUNUCQkoMSA8PCAzMCkKICNkZWZpbmUgICBEUF9QSVBFX01BU0sJCQkoMSA8PCAzMCkKKyNkZWZpbmUgICBEUF9QSVBFX1NFTEVDVF9DSFYocGlwZSkJKChwaXBlKSA8PCAxNikKKyNkZWZpbmUgICBEUF9QSVBFX01BU0tfQ0hWCQkoMyA8PCAxNikKIAogLyogTGluayB0cmFpbmluZyBtb2RlIC0gc2VsZWN0IGEgc3VpdGFibGUgbW9kZSBmb3IgZWFjaCBzdGFnZSAqLwogI2RlZmluZSAgIERQX0xJTktfVFJBSU5fUEFUXzEJCSgwIDw8IDI4KQpAQCAtMzA5MCwzMiArMzQ0OCwzMiBAQAogI2RlZmluZSAgIERQX1BMTF9GUkVRXzE2ME1IWgkJKDEgPDwgMTYpCiAjZGVmaW5lICAgRFBfUExMX0ZSRVFfTUFTSwkJKDMgPDwgMTYpCiAKLS8qKiBsb2NrZWQgb25jZSBwb3J0IGlzIGVuYWJsZWQgKi8KKy8qIGxvY2tlZCBvbmNlIHBvcnQgaXMgZW5hYmxlZCAqLwogI2RlZmluZSAgIERQX1BPUlRfUkVWRVJTQUwJCSgxIDw8IDE1KQogCiAvKiBlRFAgKi8KICNkZWZpbmUgICBEUF9QTExfRU5BQkxFCQkJKDEgPDwgMTQpCiAKLS8qKiBzZW5kcyB0aGUgY2xvY2sgb24gbGFuZSAxNSBvZiB0aGUgUEVHIGZvciBkZWJ1ZyAqLworLyogc2VuZHMgdGhlIGNsb2NrIG9uIGxhbmUgMTUgb2YgdGhlIFBFRyBmb3IgZGVidWcgKi8KICNkZWZpbmUgICBEUF9DTE9DS19PVVRQVVRfRU5BQkxFCSgxIDw8IDEzKQogCiAjZGVmaW5lICAgRFBfU0NSQU1CTElOR19ESVNBQkxFCQkoMSA8PCAxMikKICNkZWZpbmUgICBEUF9TQ1JBTUJMSU5HX0RJU0FCTEVfSVJPTkxBS0UJKDEgPDwgNykKIAotLyoqIGxpbWl0IFJHQiB2YWx1ZXMgdG8gYXZvaWQgY29uZnVzaW5nIFRWcyAqLworLyogbGltaXQgUkdCIHZhbHVlcyB0byBhdm9pZCBjb25mdXNpbmcgVFZzICovCiAjZGVmaW5lICAgRFBfQ09MT1JfUkFOR0VfMTZfMjM1CQkoMSA8PCA4KQogCi0vKiogVHVybiBvbiB0aGUgYXVkaW8gbGluayAqLworLyogVHVybiBvbiB0aGUgYXVkaW8gbGluayAqLwogI2RlZmluZSAgIERQX0FVRElPX09VVFBVVF9FTkFCTEUJKDEgPDwgNikKIAotLyoqIHZzIGFuZCBocyBzeW5jIHBvbGFyaXR5ICovCisvKiB2cyBhbmQgaHMgc3luYyBwb2xhcml0eSAqLwogI2RlZmluZSAgIERQX1NZTkNfVlNfSElHSAkJKDEgPDwgNCkKICNkZWZpbmUgICBEUF9TWU5DX0hTX0hJR0gJCSgxIDw8IDMpCiAKLS8qKiBBIGZhbnRhc3kgKi8KKy8qIEEgZmFudGFzeSAqLwogI2RlZmluZSAgIERQX0RFVEVDVEVECQkJKDEgPDwgMikKIAotLyoqIFRoZSBhdXggY2hhbm5lbCBwcm92aWRlcyBhIHdheSB0byB0YWxrIHRvIHRoZQorLyogVGhlIGF1eCBjaGFubmVsIHByb3ZpZGVzIGEgd2F5IHRvIHRhbGsgdG8gdGhlCiAgKiBzaWduYWwgc2luayBmb3IgRERDIGV0Yy4gTWF4IHBhY2tldCBzaXplIHN1cHBvcnRlZAogICogaXMgMjAgYnl0ZXMgaW4gZWFjaCBkaXJlY3Rpb24sIGhlbmNlIHRoZSA1IGZpeGVkCiAgKiBkYXRhIHJlZ2lzdGVycwpAQCAtMzI1OCw2ICszNjE2LDcgQEAKICNkZWZpbmUgICBQSVBFQ09ORl9JTlRFUkxBQ0VEX0RCTF9JTEsJCSg0IDw8IDIxKSAvKiBpbGsvc25iIG9ubHkgKi8KICNkZWZpbmUgICBQSVBFQ09ORl9QRklUX1BGX0lOVEVSTEFDRURfREJMX0lMSwkoNSA8PCAyMSkgLyogaWxrL3NuYiBvbmx5ICovCiAjZGVmaW5lICAgUElQRUNPTkZfSU5URVJMQUNFX01PREVfTUFTSwkJKDcgPDwgMjEpCisjZGVmaW5lICAgUElQRUNPTkZfRURQX1JSX01PREVfU1dJVENICQkoMSA8PCAyMCkKICNkZWZpbmUgICBQSVBFQ09ORl9DWFNSX0RPV05DTE9DSwkoMTw8MTYpCiAjZGVmaW5lICAgUElQRUNPTkZfQ09MT1JfUkFOR0VfU0VMRUNUCSgxIDw8IDEzKQogI2RlZmluZSAgIFBJUEVDT05GX0JQQ19NQVNLCSgweDcgPDwgNSkKQEAgLTMyNzYsNiArMzYzNSw3IEBACiAjZGVmaW5lICAgU1BSSVRFMV9GTElQX0RPTkVfSU5UX0VOX1ZMVgkJKDFVTDw8MzApCiAjZGVmaW5lICAgUElQRV9DUkNfRVJST1JfRU5BQkxFCQkJKDFVTDw8MjkpCiAjZGVmaW5lICAgUElQRV9DUkNfRE9ORV9FTkFCTEUJCQkoMVVMPDwyOCkKKyNkZWZpbmUgICBQRVJGX0NPVU5URVIyX0lOVEVSUlVQVF9FTgkJKDFVTDw8MjcpCiAjZGVmaW5lICAgUElQRV9HTUJVU19FVkVOVF9FTkFCTEUJCSgxVUw8PDI3KQogI2RlZmluZSAgIFBMQU5FX0ZMSVBfRE9ORV9JTlRfRU5fVkxWCQkoMVVMPDwyNikKICNkZWZpbmUgICBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRQkJKDFVTDw8MjYpCkBAIC0zMjg3LDggKzM2NDcsMTAgQEAKICNkZWZpbmUgICBQSVBFX09ERF9GSUVMRF9JTlRFUlJVUFRfRU5BQkxFCSgxVUw8PDIxKQogI2RlZmluZSAgIFBJUEVfRVZFTl9GSUVMRF9JTlRFUlJVUFRfRU5BQkxFCSgxVUw8PDIwKQogI2RlZmluZSAgIFBJUEVfQl9QU1JfSU5URVJSVVBUX0VOQUJMRV9WTFYJKDFVTDw8MTkpCisjZGVmaW5lICAgUEVSRl9DT1VOVEVSX0lOVEVSUlVQVF9FTgkJKDFVTDw8MTkpCiAjZGVmaW5lICAgUElQRV9IT1RQTFVHX1RWX0lOVEVSUlVQVF9FTkFCTEUJKDFVTDw8MTgpIC8qIHByZS05NjUgKi8KICNkZWZpbmUgICBQSVBFX1NUQVJUX1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFCSgxVUw8PDE4KSAvKiA5NjUgb3IgbGF0ZXIgKi8KKyNkZWZpbmUgICBQSVBFX0ZSQU1FU1RBUlRfSU5URVJSVVBUX0VOQUJMRQkoMVVMPDwxNykKICNkZWZpbmUgICBQSVBFX1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFCQkoMVVMPDwxNykKICNkZWZpbmUgICBQSVBFQV9IQkxBTktfSU5UX0VOX1ZMVgkJKDFVTDw8MTYpCiAjZGVmaW5lICAgUElQRV9PVkVSTEFZX1VQREFURURfRU5BQkxFCQkoMVVMPDwxNikKQEAgLTMyOTYsNiArMzY1OCw3IEBACiAjZGVmaW5lICAgU1BSSVRFMF9GTElQX0RPTkVfSU5UX1NUQVRVU19WTFYJKDFVTDw8MTQpCiAjZGVmaW5lICAgUElQRV9DUkNfRVJST1JfSU5URVJSVVBUX1NUQVRVUwkoMVVMPDwxMykKICNkZWZpbmUgICBQSVBFX0NSQ19ET05FX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8MTIpCisjZGVmaW5lICAgUEVSRl9DT1VOVEVSMl9JTlRFUlJVUFRfU1RBVFVTCSgxVUw8PDExKQogI2RlZmluZSAgIFBJUEVfR01CVVNfSU5URVJSVVBUX1NUQVRVUwkJKDFVTDw8MTEpCiAjZGVmaW5lICAgUExBTkVfRkxJUF9ET05FX0lOVF9TVEFUVVNfVkxWCSgxVUw8PDEwKQogI2RlZmluZSAgIFBJUEVfSE9UUExVR19JTlRFUlJVUFRfU1RBVFVTCQkoMVVMPDwxMCkKQEAgLTMzMDQsMjAgKzM2NjcsMjUgQEAKICNkZWZpbmUgICBQSVBFX0RQU1RfRVZFTlRfU1RBVFVTCQkoMVVMPDw3KQogI2RlZmluZSAgIFBJUEVfTEVHQUNZX0JMQ19FVkVOVF9TVEFUVVMJCSgxVUw8PDYpCiAjZGVmaW5lICAgUElQRV9BX1BTUl9TVEFUVVNfVkxWCQkJKDFVTDw8NikKKyNkZWZpbmUgICBQSVBFX0xFR0FDWV9CTENfRVZFTlRfU1RBVFVTCQkoMVVMPDw2KQogI2RlZmluZSAgIFBJUEVfT0REX0ZJRUxEX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8NSkKICNkZWZpbmUgICBQSVBFX0VWRU5fRklFTERfSU5URVJSVVBUX1NUQVRVUwkoMVVMPDw0KQogI2RlZmluZSAgIFBJUEVfQl9QU1JfU1RBVFVTX1ZMVgkJCSgxVUw8PDMpCisjZGVmaW5lICAgUEVSRl9DT1VOVEVSX0lOVEVSUlVQVF9TVEFUVVMJCSgxVUw8PDMpCiAjZGVmaW5lICAgUElQRV9IT1RQTFVHX1RWX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8MikgLyogcHJlLTk2NSAqLwogI2RlZmluZSAgIFBJUEVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8MikgLyogOTY1IG9yIGxhdGVyICovCisjZGVmaW5lICAgUElQRV9GUkFNRVNUQVJUX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8MSkKICNkZWZpbmUgICBQSVBFX1ZCTEFOS19JTlRFUlJVUFRfU1RBVFVTCQkoMVVMPDwxKQorI2RlZmluZSAgIFBJUEVfSEJMQU5LX0lOVF9TVEFUVVMJCSgxVUw8PDApCiAjZGVmaW5lICAgUElQRV9PVkVSTEFZX1VQREFURURfU1RBVFVTCQkoMVVMPDwwKQogCiAjZGVmaW5lIFBJUEVTVEFUX0lOVF9FTkFCTEVfTUFTSwkJMHg3ZmZmMDAwMAogI2RlZmluZSBQSVBFU1RBVF9JTlRfU1RBVFVTX01BU0sJCTB4MDAwMGZmZmYKIAotI2RlZmluZSBQSVBFX0FfT0ZGU0VUCTB4NzAwMDAKLSNkZWZpbmUgUElQRV9CX09GRlNFVAkweDcxMDAwCi0jZGVmaW5lIFBJUEVfQ19PRkZTRVQJMHg3MjAwMAorI2RlZmluZSBQSVBFX0FfT0ZGU0VUCQkweDcwMDAwCisjZGVmaW5lIFBJUEVfQl9PRkZTRVQJCTB4NzEwMDAKKyNkZWZpbmUgUElQRV9DX09GRlNFVAkJMHg3MjAwMAorI2RlZmluZSBDSFZfUElQRV9DX09GRlNFVAkweDc0MDAwCiAvKgogICogVGhlcmUncyBhY3R1YWxseSBubyBwaXBlIEVEUC4gU29tZSBwaXBlIHJlZ2lzdGVycyBoYXZlCiAgKiBzaW1wbHkgc2hpZnRlZCBmcm9tIHRoZSBwaXBlIHRvIHRoZSB0cmFuc2NvZGVyLCB3aGlsZQpAQCAtMzM1NSwxNCArMzcyMywyNSBAQAogI2RlZmluZSAgIFNQUklURURfRkxJUF9ET05FX0lOVF9FTgkJKDE8PDI2KQogI2RlZmluZSAgIFNQUklURUNfRkxJUF9ET05FX0lOVF9FTgkJKDE8PDI1KQogI2RlZmluZSAgIFBMQU5FQl9GTElQX0RPTkVfSU5UX0VOCQkoMTw8MjQpCisjZGVmaW5lICAgUElQRV9QU1JfSU5UX0VOCQkJKDE8PDIyKQogI2RlZmluZSAgIFBJUEVBX0xJTkVfQ09NUEFSRV9JTlRfRU4JCSgxPDwyMSkKICNkZWZpbmUgICBQSVBFQV9ITElORV9JTlRfRU4JCQkoMTw8MjApCiAjZGVmaW5lICAgUElQRUFfVkJMQU5LX0lOVF9FTgkJCSgxPDwxOSkKICNkZWZpbmUgICBTUFJJVEVCX0ZMSVBfRE9ORV9JTlRfRU4JCSgxPDwxOCkKICNkZWZpbmUgICBTUFJJVEVBX0ZMSVBfRE9ORV9JTlRfRU4JCSgxPDwxNykKICNkZWZpbmUgICBQTEFORUFfRkxJUERPTkVfSU5UX0VOCQkoMTw8MTYpCisjZGVmaW5lICAgUElQRUNfTElORV9DT01QQVJFX0lOVF9FTgkJKDE8PDEzKQorI2RlZmluZSAgIFBJUEVDX0hMSU5FX0lOVF9FTgkJCSgxPDwxMikKKyNkZWZpbmUgICBQSVBFQ19WQkxBTktfSU5UX0VOCQkJKDE8PDExKQorI2RlZmluZSAgIFNQUklURUZfRkxJUERPTkVfSU5UX0VOCQkoMTw8MTApCisjZGVmaW5lICAgU1BSSVRFRV9GTElQRE9ORV9JTlRfRU4JCSgxPDw5KQorI2RlZmluZSAgIFBMQU5FQ19GTElQRE9ORV9JTlRfRU4JCSgxPDw4KQogCi0jZGVmaW5lIERQSU5WR1RUCQkJCShWTFZfRElTUExBWV9CQVNFICsgMHg3MDAyYykgLyogVkxWIG9ubHkgKi8KKyNkZWZpbmUgRFBJTlZHVFQJCQkJKFZMVl9ESVNQTEFZX0JBU0UgKyAweDcwMDJjKSAvKiBWTFYvQ0hWIG9ubHkgKi8KKyNkZWZpbmUgICBTUFJJVEVGX0lOVkFMSURfR1RUX0lOVF9FTgkJKDE8PDI3KQorI2RlZmluZSAgIFNQUklURUVfSU5WQUxJRF9HVFRfSU5UX0VOCQkoMTw8MjYpCisjZGVmaW5lICAgUExBTkVDX0lOVkFMSURfR1RUX0lOVF9FTgkJKDE8PDI1KQorI2RlZmluZSAgIENVUlNPUkNfSU5WQUxJRF9HVFRfSU5UX0VOCQkoMTw8MjQpCiAjZGVmaW5lICAgQ1VSU09SQl9JTlZBTElEX0dUVF9JTlRfRU4JCSgxPDwyMykKICNkZWZpbmUgICBDVVJTT1JBX0lOVkFMSURfR1RUX0lOVF9FTgkJKDE8PDIyKQogI2RlZmluZSAgIFNQUklURURfSU5WQUxJRF9HVFRfSU5UX0VOCQkoMTw8MjEpCkBAIC0zMzcyLDYgKzM3NTEsMTEgQEAKICNkZWZpbmUgICBTUFJJVEVBX0lOVkFMSURfR1RUX0lOVF9FTgkJKDE8PDE3KQogI2RlZmluZSAgIFBMQU5FQV9JTlZBTElEX0dUVF9JTlRfRU4JCSgxPDwxNikKICNkZWZpbmUgICBEUElOVkdUVF9FTl9NQVNLCQkJMHhmZjAwMDAKKyNkZWZpbmUgICBEUElOVkdUVF9FTl9NQVNLX0NIVgkJCTB4ZmZmMDAwMAorI2RlZmluZSAgIFNQUklURUZfSU5WQUxJRF9HVFRfU1RBVFVTCQkoMTw8MTEpCisjZGVmaW5lICAgU1BSSVRFRV9JTlZBTElEX0dUVF9TVEFUVVMJCSgxPDwxMCkKKyNkZWZpbmUgICBQTEFORUNfSU5WQUxJRF9HVFRfU1RBVFVTCQkoMTw8OSkKKyNkZWZpbmUgICBDVVJTT1JDX0lOVkFMSURfR1RUX1NUQVRVUwkJKDE8PDgpCiAjZGVmaW5lICAgQ1VSU09SQl9JTlZBTElEX0dUVF9TVEFUVVMJCSgxPDw3KQogI2RlZmluZSAgIENVUlNPUkFfSU5WQUxJRF9HVFRfU1RBVFVTCQkoMTw8NikKICNkZWZpbmUgICBTUFJJVEVEX0lOVkFMSURfR1RUX1NUQVRVUwkJKDE8PDUpCkBAIC0zMzgxLDYgKzM3NjUsNyBAQAogI2RlZmluZSAgIFNQUklURUFfSU5WQUxJRF9HVFRfU1RBVFVTCQkoMTw8MSkKICNkZWZpbmUgICBQTEFORUFfSU5WQUxJRF9HVFRfU1RBVFVTCQkoMTw8MCkKICNkZWZpbmUgICBEUElOVkdUVF9TVEFUVVNfTUFTSwkJCTB4ZmYKKyNkZWZpbmUgICBEUElOVkdUVF9TVEFUVVNfTUFTS19DSFYJCTB4ZmZmCiAKICNkZWZpbmUgRFNQQVJCCQkJMHg3MDAzMAogI2RlZmluZSAgIERTUEFSQl9DU1RBUlRfTUFTSwkoMHg3ZiA8PCA3KQpAQCAtMzQyMCwxNCArMzgwNSw0MyBAQAogI2RlZmluZSBERExfQ1VSU09SQV9QUkVDSVNJT05fMzIJKDE8PDMxKQogI2RlZmluZSBERExfQ1VSU09SQV9QUkVDSVNJT05fMTYJKDA8PDMxKQogI2RlZmluZSBERExfQ1VSU09SQV9TSElGVAkJMjQKKyNkZWZpbmUgRERMX1NQUklURUJfUFJFQ0lTSU9OXzMyCSgxPDwyMykKKyNkZWZpbmUgRERMX1NQUklURUJfUFJFQ0lTSU9OXzE2CSgwPDwyMykKKyNkZWZpbmUgRERMX1NQUklURUJfU0hJRlQJCTE2CisjZGVmaW5lIERETF9TUFJJVEVBX1BSRUNJU0lPTl8zMgkoMTw8MTUpCisjZGVmaW5lIERETF9TUFJJVEVBX1BSRUNJU0lPTl8xNgkoMDw8MTUpCisjZGVmaW5lIERETF9TUFJJVEVBX1NISUZUCQk4CiAjZGVmaW5lIERETF9QTEFORUFfUFJFQ0lTSU9OXzMyCQkoMTw8NykKICNkZWZpbmUgRERMX1BMQU5FQV9QUkVDSVNJT05fMTYJCSgwPDw3KQorI2RlZmluZSBERExfUExBTkVBX1NISUZUCQkwCisKICNkZWZpbmUgVkxWX0RETDIJCQkoVkxWX0RJU1BMQVlfQkFTRSArIDB4NzAwNTQpCiAjZGVmaW5lIERETF9DVVJTT1JCX1BSRUNJU0lPTl8zMgkoMTw8MzEpCiAjZGVmaW5lIERETF9DVVJTT1JCX1BSRUNJU0lPTl8xNgkoMDw8MzEpCiAjZGVmaW5lIERETF9DVVJTT1JCX1NISUZUCQkyNAorI2RlZmluZSBERExfU1BSSVRFRF9QUkVDSVNJT05fMzIJKDE8PDIzKQorI2RlZmluZSBERExfU1BSSVRFRF9QUkVDSVNJT05fMTYJKDA8PDIzKQorI2RlZmluZSBERExfU1BSSVRFRF9TSElGVAkJMTYKKyNkZWZpbmUgRERMX1NQUklURUNfUFJFQ0lTSU9OXzMyCSgxPDwxNSkKKyNkZWZpbmUgRERMX1NQUklURUNfUFJFQ0lTSU9OXzE2CSgwPDwxNSkKKyNkZWZpbmUgRERMX1NQUklURUNfU0hJRlQJCTgKICNkZWZpbmUgRERMX1BMQU5FQl9QUkVDSVNJT05fMzIJCSgxPDw3KQogI2RlZmluZSBERExfUExBTkVCX1BSRUNJU0lPTl8xNgkJKDA8PDcpCisjZGVmaW5lIERETF9QTEFORUJfU0hJRlQJCTAKKworI2RlZmluZSBWTFZfRERMMwkJCShWTFZfRElTUExBWV9CQVNFICsgMHg3MDA1OCkKKyNkZWZpbmUgRERMX0NVUlNPUkNfUFJFQ0lTSU9OXzMyCSgxPDwzMSkKKyNkZWZpbmUgRERMX0NVUlNPUkNfUFJFQ0lTSU9OXzE2CSgwPDwzMSkKKyNkZWZpbmUgRERMX0NVUlNPUkNfU0hJRlQJCTI0CisjZGVmaW5lIERETF9TUFJJVEVGX1BSRUNJU0lPTl8zMgkoMTw8MjMpCisjZGVmaW5lIERETF9TUFJJVEVGX1BSRUNJU0lPTl8xNgkoMDw8MjMpCisjZGVmaW5lIERETF9TUFJJVEVGX1NISUZUCQkxNgorI2RlZmluZSBERExfU1BSSVRFRV9QUkVDSVNJT05fMzIJKDE8PDE1KQorI2RlZmluZSBERExfU1BSSVRFRV9QUkVDSVNJT05fMTYJKDA8PDE1KQorI2RlZmluZSBERExfU1BSSVRFRV9TSElGVAkJOAorI2RlZmluZSBERExfUExBTkVDX1BSRUNJU0lPTl8zMgkJKDE8PDcpCisjZGVmaW5lIERETF9QTEFORUNfUFJFQ0lTSU9OXzE2CQkoMDw8NykKKyNkZWZpbmUgRERMX1BMQU5FQ19TSElGVAkJMAogCiAvKiBGSUZPIHdhdGVybWFyayBzaXplcyBldGMgKi8KICNkZWZpbmUgRzRYX0ZJRk9fTElORV9TSVpFCTY0CkBAIC0zNTM1LDEyICszOTQ5LDEzIEBACiAjZGVmaW5lICAgUElQRV9QSVhFTF9NQVNLICAgICAgICAgMHgwMGZmZmZmZgogI2RlZmluZSAgIFBJUEVfUElYRUxfU0hJRlQgICAgICAgIDAKIC8qIEdNNDUrIGp1c3QgaGFzIHRvIGJlIGRpZmZlcmVudCAqLwotI2RlZmluZSBfUElQRUFfRlJNQ09VTlRfR000NQkoZGV2X3ByaXYtPmluZm8uZGlzcGxheV9tbWlvX29mZnNldCArIDB4NzAwNDApCi0jZGVmaW5lIF9QSVBFQV9GTElQQ09VTlRfR000NQkoZGV2X3ByaXYtPmluZm8uZGlzcGxheV9tbWlvX29mZnNldCArIDB4NzAwNDQpCi0jZGVmaW5lIFBJUEVfRlJNQ09VTlRfR000NShwaXBlKSBfUElQRShwaXBlLCBfUElQRUFfRlJNQ09VTlRfR000NSwgX1BJUEVCX0ZSTUNPVU5UX0dNNDUpCisjZGVmaW5lIF9QSVBFQV9GUk1DT1VOVF9HTTQ1CTB4NzAwNDAKKyNkZWZpbmUgX1BJUEVBX0ZMSVBDT1VOVF9HTTQ1CTB4NzAwNDQKKyNkZWZpbmUgUElQRV9GUk1DT1VOVF9HTTQ1KHBpcGUpIF9QSVBFMihwaXBlLCBfUElQRUFfRlJNQ09VTlRfR000NSkKKyNkZWZpbmUgUElQRV9GTElQQ09VTlRfR000NShwaXBlKSBfUElQRTIocGlwZSwgX1BJUEVBX0ZMSVBDT1VOVF9HTTQ1KQogCiAvKiBDdXJzb3IgQSAmIEIgcmVncyAqLwotI2RlZmluZSBfQ1VSQUNOVFIJCShkZXZfcHJpdi0+aW5mby5kaXNwbGF5X21taW9fb2Zmc2V0ICsgMHg3MDA4MCkKKyNkZWZpbmUgX0NVUkFDTlRSCQkweDcwMDgwCiAvKiBPbGQgc3R5bGUgQ1VSKkNOVFIgZmxhZ3MgKGRlc2t0b3AgOHh4KSAqLwogI2RlZmluZSAgIENVUlNPUl9FTkFCTEUJCTB4ODAwMDAwMDAKICNkZWZpbmUgICBDVVJTT1JfR0FNTUFfRU5BQkxFCTB4NDAwMDAwMDAKQEAgLTM1NjcsMjggKzM5ODIsMzQgQEAKICNkZWZpbmUgICBNQ1VSU09SX1BJUEVfQgkoMSA8PCAyOCkKICNkZWZpbmUgICBNQ1VSU09SX0dBTU1BX0VOQUJMRSAgKDEgPDwgMjYpCiAjZGVmaW5lICAgQ1VSU09SX1RSSUNLTEVfRkVFRF9ESVNBQkxFCSgxIDw8IDE0KQotI2RlZmluZSBfQ1VSQUJBU0UJCShkZXZfcHJpdi0+aW5mby5kaXNwbGF5X21taW9fb2Zmc2V0ICsgMHg3MDA4NCkKLSNkZWZpbmUgX0NVUkFQT1MJCShkZXZfcHJpdi0+aW5mby5kaXNwbGF5X21taW9fb2Zmc2V0ICsgMHg3MDA4OCkKKyNkZWZpbmUgX0NVUkFCQVNFCQkweDcwMDg0CisjZGVmaW5lIF9DVVJBUE9TCQkweDcwMDg4CiAjZGVmaW5lICAgQ1VSU09SX1BPU19NQVNLICAgICAgIDB4MDA3RkYKICNkZWZpbmUgICBDVVJTT1JfUE9TX1NJR04gICAgICAgMHg4MDAwCiAjZGVmaW5lICAgQ1VSU09SX1hfU0hJRlQgICAgICAgIDAKICNkZWZpbmUgICBDVVJTT1JfWV9TSElGVCAgICAgICAgMTYKICNkZWZpbmUgQ1VSU0laRQkJCTB4NzAwYTAKLSNkZWZpbmUgX0NVUkJDTlRSCQkoZGV2X3ByaXYtPmluZm8uZGlzcGxheV9tbWlvX29mZnNldCArIDB4NzAwYzApCi0jZGVmaW5lIF9DVVJCQkFTRQkJKGRldl9wcml2LT5pbmZvLmRpc3BsYXlfbW1pb19vZmZzZXQgKyAweDcwMGM0KQotI2RlZmluZSBfQ1VSQlBPUwkJKGRldl9wcml2LT5pbmZvLmRpc3BsYXlfbW1pb19vZmZzZXQgKyAweDcwMGM4KQorI2RlZmluZSBfQ1VSQkNOVFIJCTB4NzAwYzAKKyNkZWZpbmUgX0NVUkJCQVNFCQkweDcwMGM0CisjZGVmaW5lIF9DVVJCUE9TCQkweDcwMGM4CiAKICNkZWZpbmUgX0NVUkJDTlRSX0lWQgkJMHg3MTA4MAogI2RlZmluZSBfQ1VSQkJBU0VfSVZCCQkweDcxMDg0CiAjZGVmaW5lIF9DVVJCUE9TX0lWQgkJMHg3MTA4OAogCi0jZGVmaW5lIENVUkNOVFIocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFDTlRSLCBfQ1VSQkNOVFIpCi0jZGVmaW5lIENVUkJBU0UocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFCQVNFLCBfQ1VSQkJBU0UpCi0jZGVmaW5lIENVUlBPUyhwaXBlKSBfUElQRShwaXBlLCBfQ1VSQVBPUywgX0NVUkJQT1MpCisjZGVmaW5lIF9DVVJTT1IyKHBpcGUsIHJlZykgKGRldl9wcml2LT5pbmZvLmN1cnNvcl9vZmZzZXRzWyhwaXBlKV0gLSBcCisJZGV2X3ByaXYtPmluZm8uY3Vyc29yX29mZnNldHNbUElQRV9BXSArIChyZWcpICsgXAorCWRldl9wcml2LT5pbmZvLmRpc3BsYXlfbW1pb19vZmZzZXQpCiAKLSNkZWZpbmUgQ1VSQ05UUl9JVkIocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFDTlRSLCBfQ1VSQkNOVFJfSVZCKQotI2RlZmluZSBDVVJCQVNFX0lWQihwaXBlKSBfUElQRShwaXBlLCBfQ1VSQUJBU0UsIF9DVVJCQkFTRV9JVkIpCi0jZGVmaW5lIENVUlBPU19JVkIocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFQT1MsIF9DVVJCUE9TX0lWQikKKyNkZWZpbmUgQ1VSQ05UUihwaXBlKSBfQ1VSU09SMihwaXBlLCBfQ1VSQUNOVFIpCisjZGVmaW5lIENVUkJBU0UocGlwZSkgX0NVUlNPUjIocGlwZSwgX0NVUkFCQVNFKQorI2RlZmluZSBDVVJQT1MocGlwZSkgX0NVUlNPUjIocGlwZSwgX0NVUkFQT1MpCisKKyNkZWZpbmUgQ1VSU09SX0FfT0ZGU0VUIDB4NzAwODAKKyNkZWZpbmUgQ1VSU09SX0JfT0ZGU0VUIDB4NzAwYzAKKyNkZWZpbmUgQ0hWX0NVUlNPUl9DX09GRlNFVCAweDcwMGUwCisjZGVmaW5lIElWQl9DVVJTT1JfQl9PRkZTRVQgMHg3MTA4MAorI2RlZmluZSBJVkJfQ1VSU09SX0NfT0ZGU0VUIDB4NzIwODAKIAogLyogRGlzcGxheSBBIGNvbnRyb2wgKi8KICNkZWZpbmUgX0RTUEFDTlRSCQkJCTB4NzAxODAKQEAgLTQwOTMsNiArNDUxNCw3IEBACiAjZGVmaW5lICBHRU44X0RFX1BJUEVfQV9JUlEJCSgxPDwxNikKICNkZWZpbmUgIEdFTjhfREVfUElQRV9JUlEocGlwZSkJCSgxPDwoMTYrcGlwZSkpCiAjZGVmaW5lICBHRU44X0dUX1ZFQ1NfSVJRCQkoMTw8NikKKyNkZWZpbmUgIEdFTjhfR1RfUE1fSVJRCQkJKDE8PDQpCiAjZGVmaW5lICBHRU44X0dUX1ZDUzJfSVJRCQkoMTw8MykKICNkZWZpbmUgIEdFTjhfR1RfVkNTMV9JUlEJCSgxPDwyKQogI2RlZmluZSAgR0VOOF9HVF9CQ1NfSVJRCQkoMTw8MSkKQEAgLTQxMjAsNyArNDU0Miw3IEBACiAjZGVmaW5lICBHRU44X1BJUEVfU1BSSVRFX0ZBVUxUCQkoMSA8PCA5KQogI2RlZmluZSAgR0VOOF9QSVBFX1BSSU1BUllfRkFVTFQJKDEgPDwgOCkKICNkZWZpbmUgIEdFTjhfUElQRV9TUFJJVEVfRkxJUF9ET05FCSgxIDw8IDUpCi0jZGVmaW5lICBHRU44X1BJUEVfRkxJUF9ET05FCQkoMSA8PCA0KQorI2RlZmluZSAgR0VOOF9QSVBFX1BSSU1BUllfRkxJUF9ET05FCSgxIDw8IDQpCiAjZGVmaW5lICBHRU44X1BJUEVfU0NBTl9MSU5FX0VWRU5UCSgxIDw8IDIpCiAjZGVmaW5lICBHRU44X1BJUEVfVlNZTkMJCSgxIDw8IDEpCiAjZGVmaW5lICBHRU44X1BJUEVfVkJMQU5LCQkoMSA8PCAwKQpAQCAtNDgzMiw2ICs1MjU0LDggQEAKICNkZWZpbmUgIFBPUlRfVFJBTlNfU0VMX0NQVChwaXBlKQkoKHBpcGUpIDw8IDI5KQogI2RlZmluZSAgUE9SVF9UT19QSVBFKHZhbCkJKCgodmFsKSAmICgxPDwzMCkpID4+IDMwKQogI2RlZmluZSAgUE9SVF9UT19QSVBFX0NQVCh2YWwpCSgoKHZhbCkgJiBQT1JUX1RSQU5TX1NFTF9NQVNLKSA+PiAyOSkKKyNkZWZpbmUgIFNEVk9fUE9SVF9UT19QSVBFX0NIVih2YWwpCSgoKHZhbCkgJiAoMzw8MjQpKSA+PiAyNCkKKyNkZWZpbmUgIERQX1BPUlRfVE9fUElQRV9DSFYodmFsKQkoKCh2YWwpICYgKDM8PDE2KSkgPj4gMTYpCiAKICNkZWZpbmUgVFJBTlNfRFBfQ1RMX0EJCTB4ZTAzMDAKICNkZWZpbmUgVFJBTlNfRFBfQ1RMX0IJCTB4ZTEzMDAKQEAgLTQ4ODgsNiArNTMxMiw4IEBACiAKICNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTS19JVkIJKDB4M2Y8PDIyKQogCisjZGVmaW5lICBWTFZfUE1XR0lDWgkJCQkweDEzMDBhNAorCiAjZGVmaW5lICBGT1JDRVdBS0UJCQkJMHhBMThDCiAjZGVmaW5lICBGT1JDRVdBS0VfVkxWCQkJCTB4MTMwMGIwCiAjZGVmaW5lICBGT1JDRVdBS0VfQUNLX1ZMVgkJCTB4MTMwMGI0CkBAIC00ODk2LDE1ICs1MzIyLDIyIEBACiAjZGVmaW5lICBGT1JDRVdBS0VfQUNLX0hTVwkJCTB4MTMwMDQ0CiAjZGVmaW5lICBGT1JDRVdBS0VfQUNLCQkJCTB4MTMwMDkwCiAjZGVmaW5lICBWTFZfR1RMQ19XQUtFX0NUUkwJCQkweDEzMDA5MAorI2RlZmluZSAgIFZMVl9HVExDX1JFTkRFUl9DVFhfRVhJU1RTCQkoMSA8PCAyNSkKKyNkZWZpbmUgICBWTFZfR1RMQ19NRURJQV9DVFhfRVhJU1RTCQkoMSA8PCAyNCkKKyNkZWZpbmUgICBWTFZfR1RMQ19BTExPV1dBS0VSRVEJCQkoMSA8PCAwKQorCiAjZGVmaW5lICBWTFZfR1RMQ19QV19TVEFUVVMJCQkweDEzMDA5NAotI2RlZmluZSBWTFZfR1RMQ19QV19SRU5ERVJfU1RBVFVTX01BU0sJCTB4ODAKLSNkZWZpbmUgVkxWX0dUTENfUFdfTUVESUFfU1RBVFVTX01BU0sJCTB4MjAKKyNkZWZpbmUgICBWTFZfR1RMQ19BTExPV1dBS0VBQ0sJCQkoMSA8PCAwKQorI2RlZmluZSAgIFZMVl9HVExDX0FMTE9XV0FLRUVSUgkJCSgxIDw8IDEpCisjZGVmaW5lICAgVkxWX0dUTENfUFdfTUVESUFfU1RBVFVTX01BU0sJCSgxIDw8IDUpCisjZGVmaW5lICAgVkxWX0dUTENfUFdfUkVOREVSX1NUQVRVU19NQVNLCSgxIDw8IDcpCiAjZGVmaW5lICBGT1JDRVdBS0VfTVQJCQkJMHhhMTg4IC8qIG11bHRpLXRocmVhZGVkICovCiAjZGVmaW5lICAgRk9SQ0VXQUtFX0tFUk5FTAkJCTB4MQogI2RlZmluZSAgIEZPUkNFV0FLRV9VU0VSCQkJMHgyCiAjZGVmaW5lICBGT1JDRVdBS0VfTVRfQUNLCQkJMHgxMzAwNDAKICNkZWZpbmUgIEVDT0JVUwkJCQkJMHhhMTgwCiAjZGVmaW5lICAgIEZPUkNFV0FLRV9NVF9FTkFCTEUJCQkoMTw8NSkKKyNkZWZpbmUgIFZMVl9TUEFSRUcySAkJCQkweEExOTQKIAogI2RlZmluZSAgR1RGSUZPREJHCQkJCTB4MTIwMDAwCiAjZGVmaW5lICAgIEdUX0ZJRk9fU0JEUk9QRVJSCQkJKDE8PDYpCkBAIC00OTI0LDYgKzUzNTcsNyBAQAogI2RlZmluZSAgSFNXX0VEUkFNX1BSRVNFTlQJCQkweDEyMDAxMAogCiAjZGVmaW5lIEdFTjZfVUNHQ1RMMQkJCQkweDk0MDAKKyMgZGVmaW5lIEdFTjZfRVVfVENVTklUX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMTYpCiAjIGRlZmluZSBHRU42X0JMQlVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFCQkoMSA8PCA1KQogIyBkZWZpbmUgR0VONl9DU1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFCQkJKDEgPDwgNykKIApAQCAtNDkzNCwxMiArNTM2OCwxOSBAQAogIyBkZWZpbmUgR0VONl9SQ1BCVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUJCSgxIDw8IDEyKQogIyBkZWZpbmUgR0VONl9SQ0NVTklUX0NMT0NLX0dBVEVfRElTQUJMRQkJKDEgPDwgMTEpCiAKKyNkZWZpbmUgR0VONl9VQ0dDVEwzCQkJCTB4OTQwOAorCiAjZGVmaW5lIEdFTjdfVUNHQ1RMNAkJCQkweDk0MGMKICNkZWZpbmUgIEdFTjdfTDNCQU5LMlhfQ0xPQ0tfR0FURV9ESVNBQkxFCSgxPDwyNSkKIAorI2RlZmluZSBHRU42X1JDR0NUTDEJCQkJMHg5NDEwCisjZGVmaW5lIEdFTjZfUkNHQ1RMMgkJCQkweDk0MTQKKyNkZWZpbmUgR0VONl9SU1RDVEwJCQkJMHg5NDIwCisKICNkZWZpbmUgR0VOOF9VQ0dDVEw2CQkJCTB4OTQzMAogI2RlZmluZSAgIEdFTjhfU0RFVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUJKDE8PDE0KQogCisjZGVmaW5lIEdFTjZfR0ZYUEFVU0UJCQkJMHhBMDAwCiAjZGVmaW5lIEdFTjZfUlBOU1dSRVEJCQkJMHhBMDA4CiAjZGVmaW5lICAgR0VONl9UVVJCT19ESVNBQkxFCQkJKDE8PDMxKQogI2RlZmluZSAgIEdFTjZfRlJFUVVFTkNZKHgpCQkJKCh4KTw8MjUpCkBAIC00OTkyLDYgKzU0MzMsOSBAQAogI2RlZmluZSBHRU42X1JQX1VQX0VJCQkJCTB4QTA2OAogI2RlZmluZSBHRU42X1JQX0RPV05fRUkJCQkJMHhBMDZDCiAjZGVmaW5lIEdFTjZfUlBfSURMRV9IWVNURVJTSVMJCQkweEEwNzAKKyNkZWZpbmUgR0VONl9SUERFVUhXVEMJCQkJMHhBMDgwCisjZGVmaW5lIEdFTjZfUlBERVVDCQkJCTB4QTA4NAorI2RlZmluZSBHRU42X1JQREVVQ1NXCQkJCTB4QTA4OAogI2RlZmluZSBHRU42X1JDX1NUQVRFCQkJCTB4QTA5NAogI2RlZmluZSBHRU42X1JDMV9XQUtFX1JBVEVfTElNSVQJCTB4QTA5OAogI2RlZmluZSBHRU42X1JDNl9XQUtFX1JBVEVfTElNSVQJCTB4QTA5QwpAQCAtNDk5OSwxMSArNTQ0MywxNSBAQAogI2RlZmluZSBHRU42X1JDX0VWQUxVQVRJT05fSU5URVJWQUwJCTB4QTBBOAogI2RlZmluZSBHRU42X1JDX0lETEVfSFlTVEVSU0lTCQkJMHhBMEFDCiAjZGVmaW5lIEdFTjZfUkNfU0xFRVAJCQkJMHhBMEIwCisjZGVmaW5lIEdFTjZfUkNVQk1BQkRUTVIJCQkweEEwQjAKICNkZWZpbmUgR0VONl9SQzFlX1RIUkVTSE9MRAkJCTB4QTBCNAogI2RlZmluZSBHRU42X1JDNl9USFJFU0hPTEQJCQkweEEwQjgKICNkZWZpbmUgR0VONl9SQzZwX1RIUkVTSE9MRAkJCTB4QTBCQworI2RlZmluZSBWTFZfUkNFREFUQQkJCQkweEEwQkMKICNkZWZpbmUgR0VONl9SQzZwcF9USFJFU0hPTEQJCQkweEEwQzAKICNkZWZpbmUgR0VONl9QTUlOVFJNU0sJCQkJMHhBMTY4CisjZGVmaW5lIEdFTjhfUE1JTlRSX1JFRElSRUNUX1RPX05PTl9ESVNQCSgxPDwzMSkKKyNkZWZpbmUgVkxWX1BXUkRXTlVQQ1RMCQkJCTB4QTI5NAogCiAjZGVmaW5lIEdFTjZfUE1JU1IJCQkJMHg0NDAyMAogI2RlZmluZSBHRU42X1BNSU1SCQkJCTB4NDQwMjQgLyogcnBzX2xvY2sgKi8KQEAgLTUwMjAsNiArNTQ2OCw5IEBACiAJCQkJCQkgR0VONl9QTV9SUF9ET1dOX1RIUkVTSE9MRCB8IFwKIAkJCQkJCSBHRU42X1BNX1JQX0RPV05fVElNRU9VVCkKIAorI2RlZmluZSBHRU43X0dUX1NDUkFUQ0hfQkFTRQkJCTB4NEYxMDAKKyNkZWZpbmUgR0VON19HVF9TQ1JBVENIX1JFR19OVU0JCQk4CisKICNkZWZpbmUgVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcgICAgICAgICAgICAgIDB4MTMwMDk4CiAjZGVmaW5lIFZMVl9HRlhfQ0xLX1NUQVRVU19CSVQJCQkoMTw8MykKICNkZWZpbmUgVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUCQkoMTw8MikKQEAgLTUwMzAsNiArNTQ4MSw5IEBACiAjZGVmaW5lICAgVkxWX01FRElBX1JDNl9DT1VOVF9FTgkJKDE8PDEpCiAjZGVmaW5lICAgVkxWX1JFTkRFUl9SQzZfQ09VTlRfRU4JCSgxPDwwKQogI2RlZmluZSBHRU42X0dUX0dGWF9SQzYJCQkJMHgxMzgxMDgKKyNkZWZpbmUgVkxWX0dUX1JFTkRFUl9SQzYJCQkweDEzODEwOAorI2RlZmluZSBWTFZfR1RfTUVESUFfUkM2CQkJMHgxMzgxMEMKKwogI2RlZmluZSBHRU42X0dUX0dGWF9SQzZwCQkJMHgxMzgxMEMKICNkZWZpbmUgR0VONl9HVF9HRlhfUkM2cHAJCQkweDEzODExMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCmluZGV4IDU2Nzg1ZTguLjA0MzEyM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCkBAIC0zMjgsOCArMzI4LDYgQEAKIAkJfQogCX0KIAotCWludGVsX2Rpc2FibGVfZ3RfcG93ZXJzYXZlKGRldik7Ci0KIAkvKiBDYWNoZSBtb2RlIHN0YXRlICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNykKIAkJZGV2X3ByaXYtPnJlZ2ZpbGUuc2F2ZUNBQ0hFX01PREVfMCA9IEk5MTVfUkVBRChDQUNIRV9NT0RFXzApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zeXNmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zeXNmcy5jCmluZGV4IDljNTcwMjkuLjg2Y2UzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3lzZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N5c2ZzLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCXN0cnVjdCBkcm1fbWlub3IgKmRtaW5vciA9IGRldl90b19kcm1fbWlub3IoZGV2KTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IGRtaW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRybV9kZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY3R4OwogCXUzMiAqdGVtcCA9IE5VTEw7IC8qIEp1c3QgaGVyZSB0byBtYWtlIGhhbmRsaW5nIGZhaWx1cmVzIGVhc3kgKi8KIAlpbnQgc2xpY2UgPSAoaW50KSh1aW50cHRyX3QpYXR0ci0+cHJpdmF0ZTsKIAlpbnQgcmV0OwpAQCAtMjYzLDYgKzI2Myw4IEBACiAKIAlmbHVzaF9kZWxheWVkX3dvcmsoJmRldl9wcml2LT5ycHMuZGVsYXllZF9yZXN1bWVfd29yayk7CiAKKwlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CisKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwogCWlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2LT5kZXYpKSB7CiAJCXUzMiBmcmVxOwpAQCAtMjczLDYgKzI3NSw4IEBACiAJfQogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAorCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKKwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKaW5kZXggMjNjMjZmMS4uZjVhYTAwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaApAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpbnRlbF9yaW5nYnVmZmVyLmgiCiAKICN1bmRlZiBUUkFDRV9TWVNURU0KQEAgLTE0LDYgKzE1LDgwIEBACiAjZGVmaW5lIFRSQUNFX1NZU1RFTV9TVFJJTkcgX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKQogI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgaTkxNV90cmFjZQogCisvKiBwaXBlIHVwZGF0ZXMgKi8KKworVFJBQ0VfRVZFTlQoaTkxNV9waXBlX3VwZGF0ZV9zdGFydCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2NydGMgKmNydGMsIHUzMiBtaW4sIHUzMiBtYXgpLAorCSAgICBUUF9BUkdTKGNydGMsIG1pbiwgbWF4KSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKGVudW0gcGlwZSwgcGlwZSkKKwkJCSAgICAgX19maWVsZCh1MzIsIGZyYW1lKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgc2NhbmxpbmUpCisJCQkgICAgIF9fZmllbGQodTMyLCBtaW4pCisJCQkgICAgIF9fZmllbGQodTMyLCBtYXgpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCQkgICBfX2VudHJ5LT5waXBlID0gY3J0Yy0+cGlwZTsKKwkJCSAgIF9fZW50cnktPmZyYW1lID0gY3J0Yy0+YmFzZS5kZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGNydGMtPmJhc2UuZGV2LAorCQkJCQkJCQkJCSAgICAgICBjcnRjLT5waXBlKTsKKwkJCSAgIF9fZW50cnktPnNjYW5saW5lID0gaW50ZWxfZ2V0X2NydGNfc2NhbmxpbmUoY3J0Yyk7CisJCQkgICBfX2VudHJ5LT5taW4gPSBtaW47CisJCQkgICBfX2VudHJ5LT5tYXggPSBtYXg7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygicGlwZSAlYywgZnJhbWU9JXUsIHNjYW5saW5lPSV1LCBtaW49JXUsIG1heD0ldSIsCisJCSAgICAgIHBpcGVfbmFtZShfX2VudHJ5LT5waXBlKSwgX19lbnRyeS0+ZnJhbWUsCisJCSAgICAgICBfX2VudHJ5LT5zY2FubGluZSwgX19lbnRyeS0+bWluLCBfX2VudHJ5LT5tYXgpCispOworCitUUkFDRV9FVkVOVChpOTE1X3BpcGVfdXBkYXRlX3ZibGFua19ldmFkZWQsCisJICAgIFRQX1BST1RPKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLCB1MzIgbWluLCB1MzIgbWF4LCB1MzIgZnJhbWUpLAorCSAgICBUUF9BUkdTKGNydGMsIG1pbiwgbWF4LCBmcmFtZSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChlbnVtIHBpcGUsIHBpcGUpCisJCQkgICAgIF9fZmllbGQodTMyLCBmcmFtZSkKKwkJCSAgICAgX19maWVsZCh1MzIsIHNjYW5saW5lKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgbWluKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgbWF4KQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+cGlwZSA9IGNydGMtPnBpcGU7CisJCQkgICBfX2VudHJ5LT5mcmFtZSA9IGZyYW1lOworCQkJICAgX19lbnRyeS0+c2NhbmxpbmUgPSBpbnRlbF9nZXRfY3J0Y19zY2FubGluZShjcnRjKTsKKwkJCSAgIF9fZW50cnktPm1pbiA9IG1pbjsKKwkJCSAgIF9fZW50cnktPm1heCA9IG1heDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJwaXBlICVjLCBmcmFtZT0ldSwgc2NhbmxpbmU9JXUsIG1pbj0ldSwgbWF4PSV1IiwKKwkJICAgICAgcGlwZV9uYW1lKF9fZW50cnktPnBpcGUpLCBfX2VudHJ5LT5mcmFtZSwKKwkJICAgICAgIF9fZW50cnktPnNjYW5saW5lLCBfX2VudHJ5LT5taW4sIF9fZW50cnktPm1heCkKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfcGlwZV91cGRhdGVfZW5kLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywgdTMyIGZyYW1lKSwKKwkgICAgVFBfQVJHUyhjcnRjLCBmcmFtZSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChlbnVtIHBpcGUsIHBpcGUpCisJCQkgICAgIF9fZmllbGQodTMyLCBmcmFtZSkKKwkJCSAgICAgX19maWVsZCh1MzIsIHNjYW5saW5lKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+cGlwZSA9IGNydGMtPnBpcGU7CisJCQkgICBfX2VudHJ5LT5mcmFtZSA9IGZyYW1lOworCQkJICAgX19lbnRyeS0+c2NhbmxpbmUgPSBpbnRlbF9nZXRfY3J0Y19zY2FubGluZShjcnRjKTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJwaXBlICVjLCBmcmFtZT0ldSwgc2NhbmxpbmU9JXUiLAorCQkgICAgICBwaXBlX25hbWUoX19lbnRyeS0+cGlwZSksIF9fZW50cnktPmZyYW1lLAorCQkgICAgICBfX2VudHJ5LT5zY2FubGluZSkKKyk7CisKIC8qIG9iamVjdCB0cmFja2luZyAqLwogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfY3JlYXRlLApAQCAtMjUxLDggKzMyNiw4IEBACiApOwogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9yaW5nX3N5bmNfdG8sCi0JICAgIFRQX1BST1RPKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqZnJvbSwKLQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpmcm9tLAorCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnRvLAogCQkgICAgIHUzMiBzZXFubyksCiAJICAgIFRQX0FSR1MoZnJvbSwgdG8sIHNlcW5vKSwKIApAQCAtMjc3LDcgKzM1Miw3IEBACiApOwogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9yaW5nX2Rpc3BhdGNoLAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiBzZXFubywgdTMyIGZsYWdzKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIHNlcW5vLCB1MzIgZmxhZ3MpLAogCSAgICBUUF9BUkdTKHJpbmcsIHNlcW5vLCBmbGFncyksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKQEAgLTMwMCw3ICszNzUsNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmluZ19mbHVzaCwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgaW52YWxpZGF0ZSwgdTMyIGZsdXNoKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIGludmFsaWRhdGUsIHUzMiBmbHVzaCksCiAJICAgIFRQX0FSR1MocmluZywgaW52YWxpZGF0ZSwgZmx1c2gpLAogCiAJICAgIFRQX1NUUlVDVF9fZW50cnkoCkBAIC0zMjMsNyArMzk4LDcgQEAKICk7CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoaTkxNV9nZW1fcmVxdWVzdCwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgc2Vxbm8pLAogCSAgICBUUF9BUkdTKHJpbmcsIHNlcW5vKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KApAQCAtMzQzLDEyICs0MTgsMTIgQEAKICk7CiAKIERFRklORV9FVkVOVChpOTE1X2dlbV9yZXF1ZXN0LCBpOTE1X2dlbV9yZXF1ZXN0X2FkZCwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgc2Vxbm8pLAogCSAgICBUUF9BUkdTKHJpbmcsIHNlcW5vKQogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdF9jb21wbGV0ZSwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyksCiAJICAgIFRQX0FSR1MocmluZyksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKQEAgLTM2OCwxMiArNDQzLDEyIEBACiApOwogCiBERUZJTkVfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdCwgaTkxNV9nZW1fcmVxdWVzdF9yZXRpcmUsCi0JICAgIFRQX1BST1RPKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIHNlcW5vKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIHNlcW5vKSwKIAkgICAgVFBfQVJHUyhyaW5nLCBzZXFubykKICk7CiAKIFRSQUNFX0VWRU5UKGk5MTVfZ2VtX3JlcXVlc3Rfd2FpdF9iZWdpbiwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgc2Vxbm8pLAogCSAgICBUUF9BUkdTKHJpbmcsIHNlcW5vKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KApAQCAtNDAyLDEyICs0NzcsMTIgQEAKICk7CiAKIERFRklORV9FVkVOVChpOTE1X2dlbV9yZXF1ZXN0LCBpOTE1X2dlbV9yZXF1ZXN0X3dhaXRfZW5kLAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiBzZXFubyksCisJICAgIFRQX1BST1RPKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIHUzMiBzZXFubyksCiAJICAgIFRQX0FSR1MocmluZywgc2Vxbm8pCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGk5MTVfcmluZywKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyksCiAJICAgIFRQX0FSR1MocmluZyksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKQEAgLTQyNCwxMiArNDk5LDEyIEBACiApOwogCiBERUZJTkVfRVZFTlQoaTkxNV9yaW5nLCBpOTE1X3Jpbmdfd2FpdF9iZWdpbiwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyksCiAJICAgIFRQX0FSR1MocmluZykKICk7CiAKIERFRklORV9FVkVOVChpOTE1X3JpbmcsIGk5MTVfcmluZ193YWl0X2VuZCwKLQkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyksCiAJICAgIFRQX0FSR1MocmluZykKICk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwppbmRleCBhZmY0YTExMy4uMWVlOThmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwpAQCAtNDksMTMgKzQ5LDE5IEBACiAJdG90YWwgPSBiZGItPmJkYl9zaXplOwogCiAJLyogd2FsayB0aGUgc2VjdGlvbnMgbG9va2luZyBmb3Igc2VjdGlvbl9pZCAqLwotCXdoaWxlIChpbmRleCA8IHRvdGFsKSB7CisJd2hpbGUgKGluZGV4ICsgMyA8IHRvdGFsKSB7CiAJCWN1cnJlbnRfaWQgPSAqKGJhc2UgKyBpbmRleCk7CiAJCWluZGV4Kys7CisKIAkJY3VycmVudF9zaXplID0gKigodTE2ICopKGJhc2UgKyBpbmRleCkpOwogCQlpbmRleCArPSAyOworCisJCWlmIChpbmRleCArIGN1cnJlbnRfc2l6ZSA+IHRvdGFsKQorCQkJcmV0dXJuIE5VTEw7CisKIAkJaWYgKGN1cnJlbnRfaWQgPT0gc2VjdGlvbl9pZCkKIAkJCXJldHVybiBiYXNlICsgaW5kZXg7CisKIAkJaW5kZXggKz0gY3VycmVudF9zaXplOwogCX0KIApAQCAtMjA2LDcgKzIxMiw3IEBACiAJY29uc3Qgc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqcGFuZWxfZHZvX3RpbWluZzsKIAljb25zdCBzdHJ1Y3QgbHZkc19mcF90aW1pbmcgKmZwX3RpbWluZzsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKLQlpbnQgaSwgZG93bmNsb2NrOworCWludCBpLCBkb3duY2xvY2ssIGRycnNfbW9kZTsKIAogCWx2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX09QVElPTlMpOwogCWlmICghbHZkc19vcHRpb25zKQpAQCAtMjE4LDYgKzIyNCwyOCBAQAogCiAJcGFuZWxfdHlwZSA9IGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZTsKIAorCWRycnNfbW9kZSA9IChsdmRzX29wdGlvbnMtPmRwc19wYW5lbF90eXBlX2JpdHMKKwkJCQk+PiAocGFuZWxfdHlwZSAqIDIpKSAmIE1PREVfTUFTSzsKKwkvKgorCSAqIFZCVCBoYXMgc3RhdGljIERSUlMgPSAwIGFuZCBzZWFtbGVzcyBEUlJTID0gMi4KKwkgKiBUaGUgYmVsb3cgcGllY2Ugb2YgY29kZSBpcyByZXF1aXJlZCB0byBhZGp1c3QgdmJ0LmRycnNfdHlwZQorCSAqIHRvIG1hdGNoIHRoZSBlbnVtIGRycnNfc3VwcG9ydF90eXBlLgorCSAqLworCXN3aXRjaCAoZHJyc19tb2RlKSB7CisJY2FzZSAwOgorCQlkZXZfcHJpdi0+dmJ0LmRycnNfdHlwZSA9IFNUQVRJQ19EUlJTX1NVUFBPUlQ7CisJCURSTV9ERUJVR19LTVMoIkRSUlMgc3VwcG9ydGVkIG1vZGUgaXMgc3RhdGljXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkZXZfcHJpdi0+dmJ0LmRycnNfdHlwZSA9IFNFQU1MRVNTX0RSUlNfU1VQUE9SVDsKKwkJRFJNX0RFQlVHX0tNUygiRFJSUyBzdXBwb3J0ZWQgbW9kZSBpcyBzZWFtbGVzc1xuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9wcml2LT52YnQuZHJyc190eXBlID0gRFJSU19OT1RfU1VQUE9SVEVEOworCQlEUk1fREVCVUdfS01TKCJEUlJTIG5vdCBzdXBwb3J0ZWQgKFZCVCBpbnB1dClcbiIpOworCQlicmVhazsKKwl9CisKIAlsdmRzX2xmcF9kYXRhID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfTEZQX0RBVEEpOwogCWlmICghbHZkc19sZnBfZGF0YSkKIAkJcmV0dXJuOwpAQCAtNTI2LDYgKzU1NCwxNiBAQAogCiAJaWYgKGRyaXZlci0+ZHVhbF9mcmVxdWVuY3kpCiAJCWRldl9wcml2LT5yZW5kZXJfcmVjbG9ja19hdmFpbCA9IHRydWU7CisKKwlEUk1fREVCVUdfS01TKCJEUlJTIFN0YXRlIEVuYWJsZWQ6JWRcbiIsIGRyaXZlci0+ZHJyc19lbmFibGVkKTsKKwkvKgorCSAqIElmIERSUlMgaXMgbm90IHN1cHBvcnRlZCwgZHJyc190eXBlIGhhcyB0byBiZSBzZXQgdG8gMC4KKwkgKiBUaGlzIGlzIGJlY2F1c2UsIFZCVCBpcyBjb25maWd1cmVkIGluIHN1Y2ggYSB3YXkgdGhhdAorCSAqIHN0YXRpYyBEUlJTIGlzIDAgYW5kIERSUlMgbm90IHN1cHBvcnRlZCBpcyByZXByZXNlbnRlZCBieQorCSAqIGRyaXZlci0+ZHJyc19lbmFibGVkPWZhbHNlCisJICovCisJaWYgKCFkcml2ZXItPmRycnNfZW5hYmxlZCkKKwkJZGV2X3ByaXYtPnZidC5kcnJzX3R5cGUgPSBEUlJTX05PVF9TVVBQT1JURUQ7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC02MjgsMTkgKzY2NiwyMjEgQEAKIAl9CiB9CiAKK3N0YXRpYyB1OCAqZ290b19uZXh0X3NlcXVlbmNlKHU4ICpkYXRhLCBpbnQgKnNpemUpCit7CisJdTE2IGxlbjsKKwlpbnQgdG1wID0gKnNpemU7CisKKwlpZiAoLS10bXAgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGdvdG8gZmlyc3QgZWxlbWVudCAqLworCWRhdGErKzsKKwl3aGlsZSAoMSkgeworCQlzd2l0Y2ggKCpkYXRhKSB7CisJCWNhc2UgTUlQSV9TRVFfRUxFTV9TRU5EX1BLVDoKKwkJCS8qCisJCQkgKiBza2lwIGJ5IHRoaXMgZWxlbWVudCBwYXlsb2FkIHNpemUKKwkJCSAqIHNraXAgZWxlbSBpZCwgY29tbWFuZCBmbGFnIGFuZCBkYXRhIHR5cGUKKwkJCSAqLworCQkJdG1wIC09IDU7CisJCQlpZiAodG1wIDwgMCkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJZGF0YSArPSAzOworCQkJbGVuID0gKigodTE2ICopZGF0YSk7CisKKwkJCXRtcCAtPSBsZW47CisJCQlpZiAodG1wIDwgMCkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJLyogc2tpcCBieSBsZW4gKi8KKwkJCWRhdGEgPSBkYXRhICsgMiArIGxlbjsKKwkJCWJyZWFrOworCQljYXNlIE1JUElfU0VRX0VMRU1fREVMQVk6CisJCQkvKiBza2lwIGJ5IGVsZW0gaWQsIGFuZCBkZWxheSBpcyA0IGJ5dGVzICovCisJCQl0bXAgLT0gNTsKKwkJCWlmICh0bXAgPCAwKQorCQkJCXJldHVybiBOVUxMOworCisJCQlkYXRhICs9IDU7CisJCQlicmVhazsKKwkJY2FzZSBNSVBJX1NFUV9FTEVNX0dQSU86CisJCQl0bXAgLT0gMzsKKwkJCWlmICh0bXAgPCAwKQorCQkJCXJldHVybiBOVUxMOworCisJCQlkYXRhICs9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiVW5rbm93biBlbGVtZW50XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogZW5kIG9mIHNlcXVlbmNlID8gKi8KKwkJaWYgKCpkYXRhID09IDApCisJCQlicmVhazsKKwl9CisKKwkvKiBnb3RvIG5leHQgc2VxdWVuY2Ugb3IgZW5kIG9mIGJsb2NrIGJ5dGUgKi8KKwlpZiAoLS10bXAgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWRhdGErKzsKKworCS8qIHVwZGF0ZSBhbW91bnQgb2YgZGF0YSBsZWZ0IGZvciB0aGUgc2VxdWVuY2UgYmxvY2sgdG8gYmUgcGFyc2VkICovCisJKnNpemUgPSB0bXA7CisJcmV0dXJuIGRhdGE7Cit9CisKIHN0YXRpYyB2b2lkCiBwYXJzZV9taXBpKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKIHsKLQlzdHJ1Y3QgYmRiX21pcGkgKm1pcGk7CisJc3RydWN0IGJkYl9taXBpX2NvbmZpZyAqc3RhcnQ7CisJc3RydWN0IGJkYl9taXBpX3NlcXVlbmNlICpzZXF1ZW5jZTsKKwlzdHJ1Y3QgbWlwaV9jb25maWcgKmNvbmZpZzsKKwlzdHJ1Y3QgbWlwaV9wcHNfZGF0YSAqcHBzOworCXU4ICpkYXRhLCAqc2VxX2RhdGE7CisJaW50IGksIHBhbmVsX2lkLCBzZXFfc2l6ZTsKKwl1MTYgYmxvY2tfc2l6ZTsKIAotCW1pcGkgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTUlQSV9DT05GSUcpOwotCWlmICghbWlwaSkgewotCQlEUk1fREVCVUdfS01TKCJObyBNSVBJIEJEQiBmb3VuZCIpOworCS8qIHBhcnNlIE1JUEkgYmxvY2tzIG9ubHkgaWYgTEZQIHR5cGUgaXMgTUlQSSAqLworCWlmICghZGV2X3ByaXYtPnZidC5oYXNfbWlwaSkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSB0aGlzIHRvIHVuZGVmaW5lZCBpbmRpY2F0aW5nIG5vIGdlbmVyaWMgTUlQSSBzdXBwb3J0ICovCisJZGV2X3ByaXYtPnZidC5kc2kucGFuZWxfaWQgPSBNSVBJX0RTSV9VTkRFRklORURfUEFORUxfSUQ7CisKKwkvKiBCbG9jayAjNDAgaXMgYWxyZWFkeSBwYXJzZWQgYW5kIHBhbmVsX2ZpeGVkX21vZGUgaXMKKwkgKiBzdG9yZWQgaW4gZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlCisJICogcmVzdXNlIHRoaXMgd2hlbiBuZWVkZWQKKwkgKi8KKworCS8qIFBhcnNlICM1MiBmb3IgcGFuZWwgaW5kZXggdXNlZCBmcm9tIHBhbmVsX3R5cGUgYWxyZWFkeQorCSAqIHBhcnNlZAorCSAqLworCXN0YXJ0ID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX01JUElfQ09ORklHKTsKKwlpZiAoIXN0YXJ0KSB7CisJCURSTV9ERUJVR19LTVMoIk5vIE1JUEkgY29uZmlnIEJEQiBmb3VuZCIpOwogCQlyZXR1cm47CiAJfQogCi0JLyogWFhYOiBhZGQgbW9yZSBpbmZvICovCisJRFJNX0RFQlVHX0RSSVZFUigiRm91bmQgTUlQSSBDb25maWcgYmxvY2ssIHBhbmVsIGluZGV4ID0gJWRcbiIsCisJCQkJCQkJCXBhbmVsX3R5cGUpOworCisJLyoKKwkgKiBnZXQgaG9sZCBvZiB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIGJsb2NrIGFuZCBwcHMgZGF0YSBhcyBwZXIKKwkgKiB0aGUgcGFuZWxfdHlwZSBhcyBpbmRleAorCSAqLworCWNvbmZpZyA9ICZzdGFydC0+Y29uZmlnW3BhbmVsX3R5cGVdOworCXBwcyA9ICZzdGFydC0+cHBzW3BhbmVsX3R5cGVdOworCisJLyogc3RvcmUgYXMgb2Ygbm93IGZ1bGwgZGF0YS4gVHJpbSB3aGVuIHdlIHJlYWxpc2UgYWxsIGlzIG5vdCBuZWVkZWQgKi8KKwlkZXZfcHJpdi0+dmJ0LmRzaS5jb25maWcgPSBrbWVtZHVwKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCBtaXBpX2NvbmZpZyksIEdGUF9LRVJORUwpOworCWlmICghZGV2X3ByaXYtPnZidC5kc2kuY29uZmlnKQorCQlyZXR1cm47CisKKwlkZXZfcHJpdi0+dmJ0LmRzaS5wcHMgPSBrbWVtZHVwKHBwcywgc2l6ZW9mKHN0cnVjdCBtaXBpX3Bwc19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfcHJpdi0+dmJ0LmRzaS5wcHMpIHsKKwkJa2ZyZWUoZGV2X3ByaXYtPnZidC5kc2kuY29uZmlnKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGhhdmUgbWFuZGF0b3J5IG1pcGkgY29uZmlnIGJsb2Nrcy4gSW5pdGlhbGl6ZSBhcyBnZW5lcmljIHBhbmVsICovCiAJZGV2X3ByaXYtPnZidC5kc2kucGFuZWxfaWQgPSBNSVBJX0RTSV9HRU5FUklDX1BBTkVMX0lEOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzZXF1ZW5jZSBibG9jayBhcyB3ZWxsICovCisJc2VxdWVuY2UgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTUlQSV9TRVFVRU5DRSk7CisJaWYgKCFzZXF1ZW5jZSkgeworCQlEUk1fREVCVUdfS01TKCJObyBNSVBJIFNlcXVlbmNlIGZvdW5kLCBwYXJzaW5nIGNvbXBsZXRlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCURSTV9ERUJVR19EUklWRVIoIkZvdW5kIE1JUEkgc2VxdWVuY2UgYmxvY2tcbiIpOworCisJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUoc2VxdWVuY2UpOworCisJLyoKKwkgKiBwYXJzZSB0aGUgc2VxdWVuY2UgYmxvY2sgZm9yIGluZGl2aWR1YWwgc2VxdWVuY2VzCisJICovCisJZGV2X3ByaXYtPnZidC5kc2kuc2VxX3ZlcnNpb24gPSBzZXF1ZW5jZS0+dmVyc2lvbjsKKworCXNlcV9kYXRhID0gJnNlcXVlbmNlLT5kYXRhWzBdOworCisJLyoKKwkgKiBzZXF1ZW5jZSBibG9jayBpcyB2YXJpYWJsZSBsZW5ndGggYW5kIGhlbmNlIHdlIG5lZWQgdG8gcGFyc2UgYW5kCisJICogZ2V0IHRoZSBzZXF1ZW5jZSBkYXRhIGZvciBzcGVjaWZpYyBwYW5lbCBpZAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTUlQSV9DT05GSUdVUkFUSU9OUzsgaSsrKSB7CisJCXBhbmVsX2lkID0gKnNlcV9kYXRhOworCQlzZXFfc2l6ZSA9ICooKHUxNiAqKSAoc2VxX2RhdGEgKyAxKSk7CisJCWlmIChwYW5lbF9pZCA9PSBwYW5lbF90eXBlKQorCQkJYnJlYWs7CisKKwkJLyogc2tpcCB0aGUgc2VxdWVuY2UgaW5jbHVkaW5nIHNlcSBoZWFkZXIgb2YgMyBieXRlcyAqLworCQlzZXFfZGF0YSA9IHNlcV9kYXRhICsgMyArIHNlcV9zaXplOworCQlpZiAoKHNlcV9kYXRhIC0gJnNlcXVlbmNlLT5kYXRhWzBdKSA+IGJsb2NrX3NpemUpIHsKKwkJCURSTV9FUlJPUigiU2VxdWVuY2Ugc3RhcnQgaXMgYmV5b25kIHNlcXVlbmNlIGJsb2NrIHNpemUsIGNvcnJ1cHRlZCBzZXF1ZW5jZSBibG9ja1xuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoaSA9PSBNQVhfTUlQSV9DT05GSUdVUkFUSU9OUykgeworCQlEUk1fRVJST1IoIlNlcXVlbmNlIGJsb2NrIGRldGVjdGVkIGJ1dCBubyB2YWxpZCBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIGlmIGZvdW5kIHNlcXVlbmNlIGlzIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBzZXF1ZW5jZSBibG9jaworCSAqIGp1c3QgYmVpbmcgcGFyYW5vaWQgKi8KKwlpZiAoc2VxX3NpemUgPiBibG9ja19zaXplKSB7CisJCURSTV9FUlJPUigiQ29ycnVwdGVkIHNlcXVlbmNlL3NpemUsIGJhaWxpbmcgb3V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNraXAgdGhlIHBhbmVsIGlkKDEgYnl0ZSkgYW5kIHNlcSBzaXplKDIgYnl0ZXMpICovCisJZGV2X3ByaXYtPnZidC5kc2kuZGF0YSA9IGttZW1kdXAoc2VxX2RhdGEgKyAzLCBzZXFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfcHJpdi0+dmJ0LmRzaS5kYXRhKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGxvb3AgaW50byB0aGUgc2VxdWVuY2UgZGF0YSBhbmQgc3BsaXQgaW50byBtdWx0aXBsZSBzZXF1bmVjZXMKKwkgKiBUaGVyZSBhcmUgb25seSA1IHR5cGVzIG9mIHNlcXVlbmNlcyBhcyBvZiBub3cKKwkgKi8KKwlkYXRhID0gZGV2X3ByaXYtPnZidC5kc2kuZGF0YTsKKwlkZXZfcHJpdi0+dmJ0LmRzaS5zaXplID0gc2VxX3NpemU7CisKKwkvKiB0d28gY29uc2VjdXRpdmUgMHgwMCBpbmRpY2F0ZSBlbmQgb2YgYWxsIHNlcXVlbmNlcyAqLworCXdoaWxlICgxKSB7CisJCWludCBzZXFfaWQgPSAqZGF0YTsKKwkJaWYgKE1JUElfU0VRX01BWCA+IHNlcV9pZCAmJiBzZXFfaWQgPiBNSVBJX1NFUV9VTkRFRklORUQpIHsKKwkJCWRldl9wcml2LT52YnQuZHNpLnNlcXVlbmNlW3NlcV9pZF0gPSBkYXRhOworCQkJRFJNX0RFQlVHX0RSSVZFUigiRm91bmQgbWlwaSBzZXF1ZW5jZSAtICVkXG4iLCBzZXFfaWQpOworCQl9IGVsc2UgeworCQkJRFJNX0VSUk9SKCJ1bmRlZmluZWQgc2VxdWVuY2VcbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBwYXJ0aWFsIHBhcnNpbmcgdG8gc2tpcCBlbGVtZW50cyAqLworCQlkYXRhID0gZ290b19uZXh0X3NlcXVlbmNlKGRhdGEsICZzZXFfc2l6ZSk7CisKKwkJaWYgKGRhdGEgPT0gTlVMTCkgeworCQkJRFJNX0VSUk9SKCJTZXF1ZW5jZSBlbGVtZW50cyBnb2luZyBiZXlvbmQgYmxvY2sgaXRzZWxmLiBTZXF1ZW5jZSBibG9jayBwYXJzaW5nIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmICgqZGF0YSA9PSAwKQorCQkJYnJlYWs7IC8qIGVuZCBvZiBzZXF1ZW5jZSByZWFjaGVkICovCisJfQorCisJRFJNX0RFQlVHX0RSSVZFUigiTUlQSSByZWxhdGVkIHZidCBwYXJzaW5nIGNvbXBsZXRlXG4iKTsKKwlyZXR1cm47CitlcnI6CisJa2ZyZWUoZGV2X3ByaXYtPnZidC5kc2kuZGF0YSk7CisJZGV2X3ByaXYtPnZidC5kc2kuZGF0YSA9IE5VTEw7CisKKwkvKiBlcnJvciBkdXJpbmcgcGFyc2luZyBzbyBzZXQgYWxsIHBvaW50ZXJzIHRvIG51bGwKKwkgKiBiZWNhdXNlIG9mIHBhcnRpYWwgcGFyc2luZyAqLworCW1lbXNldChkZXZfcHJpdi0+dmJ0LmRzaS5zZXF1ZW5jZSwgMCwgTUlQSV9TRVFfTUFYKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfZGRpX3BvcnQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBlbnVtIHBvcnQgcG9ydCwKQEAgLTgyMyw2ICsxMDYzLDE1IEBACiAJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwogCQkJY29udGludWU7CiAJCX0KKworCQlpZiAocF9jaGlsZC0+Y29tbW9uLmR2b19wb3J0ID49IERWT19QT1JUX01JUElBCisJCSAgICAmJiBwX2NoaWxkLT5jb21tb24uZHZvX3BvcnQgPD0gRFZPX1BPUlRfTUlQSUQKKwkJICAgICYmcF9jaGlsZC0+Y29tbW9uLmRldmljZV90eXBlICYgREVWSUNFX1RZUEVfTUlQSV9PVVRQVVQpIHsKKwkJCURSTV9ERUJVR19LTVMoIkZvdW5kIE1JUEkgYXMgTEZQXG4iKTsKKwkJCWRldl9wcml2LT52YnQuaGFzX21pcGkgPSAxOworCQkJZGV2X3ByaXYtPnZidC5kc2kucG9ydCA9IHBfY2hpbGQtPmNvbW1vbi5kdm9fcG9ydDsKKwkJfQorCiAJCWNoaWxkX2Rldl9wdHIgPSBkZXZfcHJpdi0+dmJ0LmNoaWxkX2RldiArIGNvdW50OwogCQljb3VudCsrOwogCQltZW1jcHkoKHZvaWQgKiljaGlsZF9kZXZfcHRyLCAodm9pZCAqKXBfY2hpbGQsCkBAIC04OTMsNiArMTE0Miw0NiBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBiZGJfaGVhZGVyICp2YWxpZGF0ZV92YnQoY2hhciAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHN0cnVjdCB2YnRfaGVhZGVyICp2YnQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSkKK3sKKwlzaXplX3Qgb2Zmc2V0OworCXN0cnVjdCBiZGJfaGVhZGVyICpiZGI7CisKKwlpZiAodmJ0ID09IE5VTEwpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiVkJUIHNpZ25hdHVyZSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJb2Zmc2V0ID0gKGNoYXIgKil2YnQgLSBiYXNlOworCWlmIChvZmZzZXQgKyBzaXplb2Yoc3RydWN0IHZidF9oZWFkZXIpID4gc2l6ZSkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJWQlQgaGVhZGVyIGluY29tcGxldGVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobWVtY21wKHZidC0+c2lnbmF0dXJlLCAiJFZCVCIsIDQpKSB7CisJCURSTV9ERUJVR19EUklWRVIoIlZCVCBpbnZhbGlkIHNpZ25hdHVyZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW9mZnNldCArPSB2YnQtPmJkYl9vZmZzZXQ7CisJaWYgKG9mZnNldCArIHNpemVvZihzdHJ1Y3QgYmRiX2hlYWRlcikgPiBzaXplKSB7CisJCURSTV9ERUJVR19EUklWRVIoIkJEQiBoZWFkZXIgaW5jb21wbGV0ZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKShiYXNlICsgb2Zmc2V0KTsKKwlpZiAob2Zmc2V0ICsgYmRiLT5iZGJfc2l6ZSA+IHNpemUpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiQkRCIGluY29tcGxldGVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEUk1fREVCVUdfS01TKCJVc2luZyBWQlQgZnJvbSAlczogJTIwc1xuIiwKKwkJICAgICAgc291cmNlLCB2YnQtPnNpZ25hdHVyZSk7CisJcmV0dXJuIGJkYjsKK30KKwogLyoqCiAgKiBpbnRlbF9wYXJzZV9iaW9zIC0gZmluZCBWQlQgYW5kIGluaXRpYWxpemUgc2V0dGluZ3MgZnJvbSB0aGUgQklPUwogICogQGRldjogRFJNIGRldmljZQpAQCAtOTE2LDIwICsxMjA1LDEzIEBACiAJaW5pdF92YnRfZGVmYXVsdHMoZGV2X3ByaXYpOwogCiAJLyogWFhYIFNob3VsZCB0aGlzIHZhbGlkYXRpb24gYmUgbW92ZWQgdG8gaW50ZWxfb3ByZWdpb24uYz8gKi8KLQlpZiAoIWRtaV9jaGVja19zeXN0ZW0oaW50ZWxfbm9fb3ByZWdpb25fdmJ0KSAmJiBkZXZfcHJpdi0+b3ByZWdpb24udmJ0KSB7Ci0JCXN0cnVjdCB2YnRfaGVhZGVyICp2YnQgPSBkZXZfcHJpdi0+b3ByZWdpb24udmJ0OwotCQlpZiAobWVtY21wKHZidC0+c2lnbmF0dXJlLCAiJFZCVCIsIDQpID09IDApIHsKLQkJCURSTV9ERUJVR19LTVMoIlVzaW5nIFZCVCBmcm9tIE9wUmVnaW9uOiAlMjBzXG4iLAotCQkJCQkgdmJ0LT5zaWduYXR1cmUpOwotCQkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKChjaGFyICopdmJ0ICsgdmJ0LT5iZGJfb2Zmc2V0KTsKLQkJfSBlbHNlCi0JCQlkZXZfcHJpdi0+b3ByZWdpb24udmJ0ID0gTlVMTDsKLQl9CisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGludGVsX25vX29wcmVnaW9uX3ZidCkgJiYgZGV2X3ByaXYtPm9wcmVnaW9uLnZidCkKKwkJYmRiID0gdmFsaWRhdGVfdmJ0KChjaGFyICopZGV2X3ByaXYtPm9wcmVnaW9uLmhlYWRlciwgT1BSRUdJT05fU0laRSwKKwkJCQkgICAoc3RydWN0IHZidF9oZWFkZXIgKilkZXZfcHJpdi0+b3ByZWdpb24udmJ0LAorCQkJCSAgICJPcFJlZ2lvbiIpOwogCiAJaWYgKGJkYiA9PSBOVUxMKSB7Ci0JCXN0cnVjdCB2YnRfaGVhZGVyICp2YnQgPSBOVUxMOwotCQlzaXplX3Qgc2l6ZTsKLQkJaW50IGk7CisJCXNpemVfdCBpLCBzaXplOwogCiAJCWJpb3MgPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CiAJCWlmICghYmlvcykKQEAgLTkzNywxOSArMTIxOSwxOCBAQAogCiAJCS8qIFNjb3VyIG1lbW9yeSBsb29raW5nIGZvciB0aGUgVkJUIHNpZ25hdHVyZSAqLwogCQlmb3IgKGkgPSAwOyBpICsgNCA8IHNpemU7IGkrKykgewotCQkJaWYgKCFtZW1jbXAoYmlvcyArIGksICIkVkJUIiwgNCkpIHsKLQkJCQl2YnQgPSAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpOworCQkJaWYgKG1lbWNtcChiaW9zICsgaSwgIiRWQlQiLCA0KSA9PSAwKSB7CisJCQkJYmRiID0gdmFsaWRhdGVfdmJ0KGJpb3MsIHNpemUsCisJCQkJCQkgICAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpLAorCQkJCQkJICAgIlBDSSBST00iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCi0JCWlmICghdmJ0KSB7Ci0JCQlEUk1fREVCVUdfRFJJVkVSKCJWQlQgc2lnbmF0dXJlIG1pc3NpbmdcbiIpOworCQlpZiAoIWJkYikgewogCQkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCi0JCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKShiaW9zICsgaSArIHZidC0+YmRiX29mZnNldCk7CiAJfQogCiAJLyogR3JhYiB1c2VmdWwgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCmluZGV4IGYyN2Y3YjIuLmI5ODY2NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKQEAgLTI4Miw2ICsyODIsOSBAQAogCXVuaW9uIGNoaWxkX2RldmljZV9jb25maWcgZGV2aWNlc1swXTsKIH0gX19wYWNrZWQ7CiAKKy8qIE1hc2sgZm9yIERSUlMgLyBQYW5lbCBDaGFubmVsIC8gU1NDIC8gQkxUIGNvbnRyb2wgYml0cyBleHRyYWN0aW9uICovCisjZGVmaW5lIE1PREVfTUFTSwkJMHgzCisKIHN0cnVjdCBiZGJfbHZkc19vcHRpb25zIHsKIAl1OCBwYW5lbF90eXBlOwogCXU4IHJzdmQxOwpAQCAtMjk0LDYgKzI5NywxOCBAQAogCXU4IGx2ZHNfZWRpZDoxOwogCXU4IHJzdmQyOjE7CiAJdTggcnN2ZDQ7CisJLyogTFZEUyBQYW5lbCBjaGFubmVsIGJpdHMgc3RvcmVkIGhlcmUgKi8KKwl1MzIgbHZkc19wYW5lbF9jaGFubmVsX2JpdHM7CisJLyogTFZEUyBTU0MgKFNwcmVhZCBTcGVjdHJ1bSBDbG9jaykgYml0cyBzdG9yZWQgaGVyZS4gKi8KKwl1MTYgc3NjX2JpdHM7CisJdTE2IHNzY19mcmVxOworCXUxNiBzc2NfZGR0OworCS8qIFBhbmVsIGNvbG9yIGRlcHRoIGRlZmluZWQgaGVyZSAqLworCXUxNiBwYW5lbF9jb2xvcl9kZXB0aDsKKwkvKiBMVkRTIHBhbmVsIHR5cGUgYml0cyBzdG9yZWQgaGVyZSAqLworCXUzMiBkcHNfcGFuZWxfdHlwZV9iaXRzOworCS8qIExWRFMgYmFja2xpZ2h0IGNvbnRyb2wgdHlwZSBiaXRzIHN0b3JlZCBoZXJlICovCisJdTMyIGJsdF9jb250cm9sX3R5cGVfYml0czsKIH0gX19wYWNrZWQ7CiAKIC8qIExGUCBwb2ludGVyIHRhYmxlIGNvbnRhaW5zIGVudHJpZXMgdG8gdGhlIHN0cnVjdCBiZWxvdyAqLwpAQCAtNDgyLDYgKzQ5NywyMCBAQAogCiAJdTggaGRtaV90ZXJtaW5hdGlvbjsKIAl1OCBjdXN0b21fdmJ0X3ZlcnNpb247CisJLyogRHJpdmVyIGZlYXR1cmVzIGRhdGEgYmxvY2sgKi8KKwl1MTYgcm1wbV9lbmFibGVkOjE7CisJdTE2IHMyZGR0X2VuYWJsZWQ6MTsKKwl1MTYgZHBzdF9lbmFibGVkOjE7CisJdTE2IGJsdGNsdF9lbmFibGVkOjE7CisJdTE2IGFkYl9lbmFibGVkOjE7CisJdTE2IGRycnNfZW5hYmxlZDoxOworCXUxNiBncnNfZW5hYmxlZDoxOworCXUxNiBncG10X2VuYWJsZWQ6MTsKKwl1MTYgdGJ0X2VuYWJsZWQ6MTsKKwl1MTYgcHNyX2VuYWJsZWQ6MTsKKwl1MTYgaXBzX2VuYWJsZWQ6MTsKKwl1MTYgcmVzZXJ2ZWQzOjQ7CisJdTE2IHBjX2ZlYXR1cmVfdmFsaWQ6MTsKIH0gX19wYWNrZWQ7CiAKICNkZWZpbmUgRURQXzE4QlBQCTAKQEAgLTcxNCw2ICs3NDMsMTAgQEAKICNkZWZpbmUgRFZPX1BPUlRfRFBDCTgKICNkZWZpbmUgRFZPX1BPUlRfRFBECTkKICNkZWZpbmUgRFZPX1BPUlRfRFBBCTEwCisjZGVmaW5lIERWT19QT1JUX01JUElBCTIxCisjZGVmaW5lIERWT19QT1JUX01JUElCCTIyCisjZGVmaW5lIERWT19QT1JUX01JUElDCTIzCisjZGVmaW5lIERWT19QT1JUX01JUElECTI0CiAKIC8qIEJsb2NrIDUyIGNvbnRhaW5zIE1JUEkgUGFuZWwgaW5mbwogICogNiBzdWNoIGVudGVyaWVzIHdpbGwgdGhlcmUuIEluZGV4IGludG8gY29ycmVjdApAQCAtODcwLDQgKzkwMywzNSBAQAogCXU4IGRhdGFbMF07CiB9OwogCisvKiBNSVBJIFNlcXVuZWNlIEJsb2NrIGRlZmluaXRpb25zICovCitlbnVtIG1pcGlfc2VxIHsKKwlNSVBJX1NFUV9VTkRFRklORUQgPSAwLAorCU1JUElfU0VRX0FTU0VSVF9SRVNFVCwKKwlNSVBJX1NFUV9JTklUX09UUCwKKwlNSVBJX1NFUV9ESVNQTEFZX09OLAorCU1JUElfU0VRX0RJU1BMQVlfT0ZGLAorCU1JUElfU0VRX0RFQVNTRVJUX1JFU0VULAorCU1JUElfU0VRX01BWAorfTsKKworZW51bSBtaXBpX3NlcV9lbGVtZW50IHsKKwlNSVBJX1NFUV9FTEVNX1VOREVGSU5FRCA9IDAsCisJTUlQSV9TRVFfRUxFTV9TRU5EX1BLVCwKKwlNSVBJX1NFUV9FTEVNX0RFTEFZLAorCU1JUElfU0VRX0VMRU1fR1BJTywKKwlNSVBJX1NFUV9FTEVNX1NUQVRVUywKKwlNSVBJX1NFUV9FTEVNX01BWAorfTsKKworZW51bSBtaXBpX2dwaW9fcGluX2luZGV4IHsKKwlNSVBJX0dQSU9fVU5ERUZJTkVEID0gMCwKKwlNSVBJX0dQSU9fUEFORUxfRU5BQkxFLAorCU1JUElfR1BJT19CTF9FTkFCTEUsCisJTUlQSV9HUElPX1BXTV9FTkFCTEUsCisJTUlQSV9HUElPX1JFU0VUX04sCisJTUlQSV9HUElPX1BXUl9ET1dOX1IsCisJTUlQSV9HUElPX1NUREJZX1JTVF9OLAorCU1JUElfR1BJT19NQVgKK307CisKICNlbmRpZiAvKiBfSTgzMF9CSU9TX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCmluZGV4IGFhNWEzZGMuLjVhMDQ1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCkBAIC0xNDQsMjggKzE0NCw0OSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnQgKmNydCA9IGludGVsX2VuY29kZXJfdG9fY3J0KGVuY29kZXIpOwotCXUzMiB0ZW1wOworCXN0cnVjdCBpbnRlbF9jcnRjICpjcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlID0gJmNydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlOworCXUzMiBhZHBhOwogCi0JdGVtcCA9IEk5MTVfUkVBRChjcnQtPmFkcGFfcmVnKTsKLQl0ZW1wICY9IH4oQURQQV9IU1lOQ19DTlRMX0RJU0FCTEUgfCBBRFBBX1ZTWU5DX0NOVExfRElTQUJMRSk7Ci0JdGVtcCAmPSB+QURQQV9EQUNfRU5BQkxFOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA1KQorCQlhZHBhID0gQURQQV9IT1RQTFVHX0JJVFM7CisJZWxzZQorCQlhZHBhID0gMDsKKworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQlhZHBhIHw9IEFEUEFfSFNZTkNfQUNUSVZFX0hJR0g7CisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCWFkcGEgfD0gQURQQV9WU1lOQ19BQ1RJVkVfSElHSDsKKworCS8qIEZvciBDUFQgYWxsb3cgMyBwaXBlIGNvbmZpZywgZm9yIG90aGVycyBqdXN0IHVzZSBBIG9yIEIgKi8KKwlpZiAoSEFTX1BDSF9MUFQoZGV2KSkKKwkJOyAvKiBUaG9zZSBiaXRzIGRvbid0IGV4aXN0IGhlcmUgKi8KKwllbHNlIGlmIChIQVNfUENIX0NQVChkZXYpKQorCQlhZHBhIHw9IFBPUlRfVFJBTlNfU0VMX0NQVChjcnRjLT5waXBlKTsKKwllbHNlIGlmIChjcnRjLT5waXBlID09IDApCisJCWFkcGEgfD0gQURQQV9QSVBFX0FfU0VMRUNUOworCWVsc2UKKwkJYWRwYSB8PSBBRFBBX1BJUEVfQl9TRUxFQ1Q7CisKKwlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkKKwkJSTkxNV9XUklURShCQ0xSUEFUKGNydGMtPnBpcGUpLCAwKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJdGVtcCB8PSBBRFBBX0RBQ19FTkFCTEU7CisJCWFkcGEgfD0gQURQQV9EQUNfRU5BQkxFOwogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKLQkJdGVtcCB8PSBBRFBBX0RBQ19FTkFCTEUgfCBBRFBBX0hTWU5DX0NOVExfRElTQUJMRTsKKwkJYWRwYSB8PSBBRFBBX0RBQ19FTkFCTEUgfCBBRFBBX0hTWU5DX0NOVExfRElTQUJMRTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6Ci0JCXRlbXAgfD0gQURQQV9EQUNfRU5BQkxFIHwgQURQQV9WU1lOQ19DTlRMX0RJU0FCTEU7CisJCWFkcGEgfD0gQURQQV9EQUNfRU5BQkxFIHwgQURQQV9WU1lOQ19DTlRMX0RJU0FCTEU7CiAJCWJyZWFrOwogCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCXRlbXAgfD0gQURQQV9IU1lOQ19DTlRMX0RJU0FCTEUgfCBBRFBBX1ZTWU5DX0NOVExfRElTQUJMRTsKKwkJYWRwYSB8PSBBRFBBX0hTWU5DX0NOVExfRElTQUJMRSB8IEFEUEFfVlNZTkNfQ05UTF9ESVNBQkxFOwogCQlicmVhazsKIAl9CiAKLQlJOTE1X1dSSVRFKGNydC0+YWRwYV9yZWcsIHRlbXApOworCUk5MTVfV1JJVEUoY3J0LT5hZHBhX3JlZywgYWRwYSk7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX2Rpc2FibGVfY3J0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtMjc0LDQyICsyOTUsNiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9jcnRfbW9kZV9zZXQoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCi17Ci0KLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7Ci0Jc3RydWN0IGludGVsX2NydCAqY3J0ID0gaW50ZWxfZW5jb2Rlcl90b19jcnQoZW5jb2Rlcik7Ci0Jc3RydWN0IGludGVsX2NydGMgKmNydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSA9ICZjcnRjLT5jb25maWcuYWRqdXN0ZWRfbW9kZTsKLQl1MzIgYWRwYTsKLQotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA1KQotCQlhZHBhID0gQURQQV9IT1RQTFVHX0JJVFM7Ci0JZWxzZQotCQlhZHBhID0gMDsKLQotCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQotCQlhZHBhIHw9IEFEUEFfSFNZTkNfQUNUSVZFX0hJR0g7Ci0JaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCi0JCWFkcGEgfD0gQURQQV9WU1lOQ19BQ1RJVkVfSElHSDsKLQotCS8qIEZvciBDUFQgYWxsb3cgMyBwaXBlIGNvbmZpZywgZm9yIG90aGVycyBqdXN0IHVzZSBBIG9yIEIgKi8KLQlpZiAoSEFTX1BDSF9MUFQoZGV2KSkKLQkJOyAvKiBUaG9zZSBiaXRzIGRvbid0IGV4aXN0IGhlcmUgKi8KLQllbHNlIGlmIChIQVNfUENIX0NQVChkZXYpKQotCQlhZHBhIHw9IFBPUlRfVFJBTlNfU0VMX0NQVChjcnRjLT5waXBlKTsKLQllbHNlIGlmIChjcnRjLT5waXBlID09IDApCi0JCWFkcGEgfD0gQURQQV9QSVBFX0FfU0VMRUNUOwotCWVsc2UKLQkJYWRwYSB8PSBBRFBBX1BJUEVfQl9TRUxFQ1Q7Ci0KLQlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJSTkxNV9XUklURShCQ0xSUEFUKGNydGMtPnBpcGUpLCAwKTsKLQotCUk5MTVfV1JJVEUoY3J0LT5hZHBhX3JlZywgYWRwYSk7Ci19Ci0KIHN0YXRpYyBib29sIGludGVsX2lyb25sYWtlX2NydF9kZXRlY3RfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKQEAgLTY0NSwxMSArNjMwLDEyIEBACiAJZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBwb3dlcl9kb21haW47CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGludGVsX2xvYWRfZGV0ZWN0X3BpcGUgdG1wOworCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCBjdHg7CiAKIAlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSBmb3JjZT0lZFxuIiwKLQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT5uYW1lLAogCQkgICAgICBmb3JjZSk7CiAKIAlwb3dlcl9kb21haW4gPSBpbnRlbF9kaXNwbGF5X3BvcnRfcG93ZXJfZG9tYWluKGludGVsX2VuY29kZXIpOwpAQCAtNjg4LDEyICs2NzQsMTIgQEAKIAl9CiAKIAkvKiBmb3IgcHJlLTk0NWcgcGxhdGZvcm1zIHVzZSBsb2FkIGRldGVjdCAqLwotCWlmIChpbnRlbF9nZXRfbG9hZF9kZXRlY3RfcGlwZShjb25uZWN0b3IsIE5VTEwsICZ0bXApKSB7CisJaWYgKGludGVsX2dldF9sb2FkX2RldGVjdF9waXBlKGNvbm5lY3RvciwgTlVMTCwgJnRtcCwgJmN0eCkpIHsKIAkJaWYgKGludGVsX2NydF9kZXRlY3RfZGRjKGNvbm5lY3RvcikpCiAJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJZWxzZQogCQkJc3RhdHVzID0gaW50ZWxfY3J0X2xvYWRfZGV0ZWN0KGNydCk7Ci0JCWludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3RfcGlwZShjb25uZWN0b3IsICZ0bXApOworCQlpbnRlbF9yZWxlYXNlX2xvYWRfZGV0ZWN0X3BpcGUoY29ubmVjdG9yLCAmdG1wLCAmY3R4KTsKIAl9IGVsc2UKIAkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwogCkBAIC04NjcsNyArODUzLDYgQEAKIAkJY3J0LT5hZHBhX3JlZyA9IEFEUEE7CiAKIAljcnQtPmJhc2UuY29tcHV0ZV9jb25maWcgPSBpbnRlbF9jcnRfY29tcHV0ZV9jb25maWc7Ci0JY3J0LT5iYXNlLm1vZGVfc2V0ID0gaW50ZWxfY3J0X21vZGVfc2V0OwogCWNydC0+YmFzZS5kaXNhYmxlID0gaW50ZWxfZGlzYWJsZV9jcnQ7CiAJY3J0LT5iYXNlLmVuYWJsZSA9IGludGVsX2VuYWJsZV9jcnQ7CiAJaWYgKEk5MTVfSEFTX0hPVFBMVUcoZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKaW5kZXggMGFkNGU5Ni4uYjE3YjljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKQEAgLTM2NCw1NSArMzY0LDYgQEAKIAlEUk1fRVJST1IoIkZESSBsaW5rIHRyYWluaW5nIGZhaWxlZCFcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9kZGlfbW9kZV9zZXQoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IGludGVsX2NydGMgKmNydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7Ci0JaW50IHBvcnQgPSBpbnRlbF9kZGlfZ2V0X2VuY29kZXJfcG9ydChlbmNvZGVyKTsKLQlpbnQgcGlwZSA9IGNydGMtPnBpcGU7Ci0JaW50IHR5cGUgPSBlbmNvZGVyLT50eXBlOwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlID0gJmNydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlOwotCi0JRFJNX0RFQlVHX0tNUygiUHJlcGFyaW5nIERESSBtb2RlIG9uIHBvcnQgJWMsIHBpcGUgJWNcbiIsCi0JCSAgICAgIHBvcnRfbmFtZShwb3J0KSwgcGlwZV9uYW1lKHBpcGUpKTsKLQotCWNydGMtPmVsZF92bGQgPSBmYWxzZTsKLQlpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQgfHwgdHlwZSA9PSBJTlRFTF9PVVRQVVRfRURQKSB7Ci0JCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoJmVuY29kZXItPmJhc2UpOwotCQlzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCA9Ci0JCQllbmNfdG9fZGlnX3BvcnQoJmVuY29kZXItPmJhc2UpOwotCi0JCWludGVsX2RwLT5EUCA9IGludGVsX2RpZ19wb3J0LT5zYXZlZF9wb3J0X2JpdHMgfAotCQkJICAgICAgIERESV9CVUZfQ1RMX0VOQUJMRSB8IERESV9CVUZfRU1QXzQwME1WXzBEQl9IU1c7Ci0JCWludGVsX2RwLT5EUCB8PSBERElfUE9SVF9XSURUSChpbnRlbF9kcC0+bGFuZV9jb3VudCk7Ci0KLQkJaWYgKGludGVsX2RwLT5oYXNfYXVkaW8pIHsKLQkJCURSTV9ERUJVR19EUklWRVIoIkRQIGF1ZGlvIG9uIHBpcGUgJWMgb24gRERJXG4iLAotCQkJCQkgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKLQotCQkJLyogd3JpdGUgZWxkICovCi0JCQlEUk1fREVCVUdfRFJJVkVSKCJEUCBhdWRpbzogd3JpdGUgZWxkIGluZm9ybWF0aW9uXG4iKTsKLQkJCWludGVsX3dyaXRlX2VsZCgmZW5jb2Rlci0+YmFzZSwgYWRqdXN0ZWRfbW9kZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0hETUkpIHsKLQkJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWkgPSBlbmNfdG9faW50ZWxfaGRtaSgmZW5jb2Rlci0+YmFzZSk7Ci0KLQkJaWYgKGludGVsX2hkbWktPmhhc19hdWRpbykgewotCQkJLyogUHJvcGVyIHN1cHBvcnQgZm9yIGRpZ2l0YWwgYXVkaW8gbmVlZHMgYSBuZXcgbG9naWMKLQkJCSAqIGFuZCBhIG5ldyBzZXQgb2YgcmVnaXN0ZXJzLCBzbyB3ZSBsZWF2ZSBpdCBmb3IgZnV0dXJlCi0JCQkgKiBwYXRjaCBib21iaW5nLgotCQkJICovCi0JCQlEUk1fREVCVUdfRFJJVkVSKCJIRE1JIGF1ZGlvIG9uIHBpcGUgJWMgb24gRERJXG4iLAotCQkJCQkgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKLQotCQkJLyogd3JpdGUgZWxkICovCi0JCQlEUk1fREVCVUdfRFJJVkVSKCJIRE1JIGF1ZGlvOiB3cml0ZSBlbGQgaW5mb3JtYXRpb25cbiIpOwotCQkJaW50ZWxfd3JpdGVfZWxkKCZlbmNvZGVyLT5iYXNlLCBhZGp1c3RlZF9tb2RlKTsKLQkJfQotCi0JCWludGVsX2hkbWktPnNldF9pbmZvZnJhbWVzKCZlbmNvZGVyLT5iYXNlLCBhZGp1c3RlZF9tb2RlKTsKLQl9Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqCiBpbnRlbF9kZGlfZ2V0X2NydGNfZW5jb2RlcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CkBAIC0xMDYyLDkgKzEwMTMsNyBAQAogCX0KIAogCWlmICh0eXBlID09IElOVEVMX09VVFBVVF9IRE1JKSB7Ci0JCXN0cnVjdCBpbnRlbF9oZG1pICppbnRlbF9oZG1pID0gZW5jX3RvX2ludGVsX2hkbWkoZW5jb2Rlcik7Ci0KLQkJaWYgKGludGVsX2hkbWktPmhhc19oZG1pX3NpbmspCisJCWlmIChpbnRlbF9jcnRjLT5jb25maWcuaGFzX2hkbWlfc2luaykKIAkJCXRlbXAgfD0gVFJBTlNfRERJX01PREVfU0VMRUNUX0hETUk7CiAJCWVsc2UKIAkJCXRlbXAgfD0gVFJBTlNfRERJX01PREVfU0VMRUNUX0RWSTsKQEAgLTEyOTMsMjggKzEyNDIsNDggQEAKIHN0YXRpYyB2b2lkIGludGVsX2RkaV9wcmVfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZpbnRlbF9lbmNvZGVyLT5iYXNlOwotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IGludGVsX2NydGMgKmNydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOwogCWVudW0gcG9ydCBwb3J0ID0gaW50ZWxfZGRpX2dldF9lbmNvZGVyX3BvcnQoaW50ZWxfZW5jb2Rlcik7CiAJaW50IHR5cGUgPSBpbnRlbF9lbmNvZGVyLT50eXBlOwogCisJaWYgKGNydGMtPmNvbmZpZy5oYXNfYXVkaW8pIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiQXVkaW8gb24gcGlwZSAlYyBvbiBERElcbiIsCisJCQkJIHBpcGVfbmFtZShjcnRjLT5waXBlKSk7CisKKwkJLyogd3JpdGUgZWxkICovCisJCURSTV9ERUJVR19EUklWRVIoIkRESSBhdWRpbzogd3JpdGUgZWxkIGluZm9ybWF0aW9uXG4iKTsKKwkJaW50ZWxfd3JpdGVfZWxkKGVuY29kZXIsICZjcnRjLT5jb25maWcuYWRqdXN0ZWRfbW9kZSk7CisJfQorCiAJaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0VEUCkgewogCQlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKGVuY29kZXIpOwogCQlpbnRlbF9lZHBfcGFuZWxfb24oaW50ZWxfZHApOwogCX0KIAotCVdBUk5fT04oaW50ZWxfY3J0Yy0+ZGRpX3BsbF9zZWwgPT0gUE9SVF9DTEtfU0VMX05PTkUpOwotCUk5MTVfV1JJVEUoUE9SVF9DTEtfU0VMKHBvcnQpLCBpbnRlbF9jcnRjLT5kZGlfcGxsX3NlbCk7CisJV0FSTl9PTihjcnRjLT5kZGlfcGxsX3NlbCA9PSBQT1JUX0NMS19TRUxfTk9ORSk7CisJSTkxNV9XUklURShQT1JUX0NMS19TRUwocG9ydCksIGNydGMtPmRkaV9wbGxfc2VsKTsKIAogCWlmICh0eXBlID09IElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCB8fCB0eXBlID09IElOVEVMX09VVFBVVF9FRFApIHsKIAkJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKKwkJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPQorCQkJZW5jX3RvX2RpZ19wb3J0KGVuY29kZXIpOworCisJCWludGVsX2RwLT5EUCA9IGludGVsX2RpZ19wb3J0LT5zYXZlZF9wb3J0X2JpdHMgfAorCQkJICAgICAgIERESV9CVUZfQ1RMX0VOQUJMRSB8IERESV9CVUZfRU1QXzQwME1WXzBEQl9IU1c7CisJCWludGVsX2RwLT5EUCB8PSBERElfUE9SVF9XSURUSChpbnRlbF9kcC0+bGFuZV9jb3VudCk7CiAKIAkJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBEUk1fTU9ERV9EUE1TX09OKTsKIAkJaW50ZWxfZHBfc3RhcnRfbGlua190cmFpbihpbnRlbF9kcCk7CiAJCWludGVsX2RwX2NvbXBsZXRlX2xpbmtfdHJhaW4oaW50ZWxfZHApOwogCQlpZiAocG9ydCAhPSBQT1JUX0EpCiAJCQlpbnRlbF9kcF9zdG9wX2xpbmtfdHJhaW4oaW50ZWxfZHApOworCX0gZWxzZSBpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfSERNSSkgeworCQlzdHJ1Y3QgaW50ZWxfaGRtaSAqaW50ZWxfaGRtaSA9IGVuY190b19pbnRlbF9oZG1pKGVuY29kZXIpOworCisJCWludGVsX2hkbWktPnNldF9pbmZvZnJhbWVzKGVuY29kZXIsCisJCQkJCSAgIGNydGMtPmNvbmZpZy5oYXNfaGRtaV9zaW5rLAorCQkJCQkgICAmY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGUpOwogCX0KIH0KIApAQCAtMTM4NSw3ICsxMzU0LDggQEAKIAkJaW50ZWxfZWRwX3Bzcl9lbmFibGUoaW50ZWxfZHApOwogCX0KIAotCWlmIChpbnRlbF9jcnRjLT5lbGRfdmxkICYmIHR5cGUgIT0gSU5URUxfT1VUUFVUX0VEUCkgeworCWlmIChpbnRlbF9jcnRjLT5jb25maWcuaGFzX2F1ZGlvKSB7CisJCWludGVsX2Rpc3BsYXlfcG93ZXJfZ2V0KGRldl9wcml2LCBQT1dFUl9ET01BSU5fQVVESU8pOwogCQl0bXAgPSBJOTE1X1JFQUQoSFNXX0FVRF9QSU5fRUxEX0NQX1ZMRCk7CiAJCXRtcCB8PSAoKEFVRElPX09VVFBVVF9FTkFCTEVfQSB8IEFVRElPX0VMRF9WQUxJRF9BKSA8PCAocGlwZSAqIDQpKTsKIAkJSTkxNV9XUklURShIU1dfQVVEX1BJTl9FTERfQ1BfVkxELCB0bXApOwpAQCAtMTQwMywxMSArMTM3MywxNCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgdG1wOwogCi0JaWYgKGludGVsX2NydGMtPmVsZF92bGQgJiYgdHlwZSAhPSBJTlRFTF9PVVRQVVRfRURQKSB7CisJLyogV2UgY2FuJ3QgdG91Y2ggSFNXX0FVRF9QSU5fRUxEX0NQX1ZMRCB1bmNpb25kaXRpb25hbGx5IGJlY2F1c2UgdGhpcworCSAqIHJlZ2lzdGVyIGlzIHBhcnQgb2YgdGhlIHBvd2VyIHdlbGwgb24gSGFzd2VsbC4gKi8KKwlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19hdWRpbykgewogCQl0bXAgPSBJOTE1X1JFQUQoSFNXX0FVRF9QSU5fRUxEX0NQX1ZMRCk7CiAJCXRtcCAmPSB+KChBVURJT19PVVRQVVRfRU5BQkxFX0EgfCBBVURJT19FTERfVkFMSURfQSkgPDwKIAkJCSAocGlwZSAqIDQpKTsKIAkJSTkxNV9XUklURShIU1dfQVVEX1BJTl9FTERfQ1BfVkxELCB0bXApOworCQlpbnRlbF9kaXNwbGF5X3Bvd2VyX3B1dChkZXZfcHJpdiwgUE9XRVJfRE9NQUlOX0FVRElPKTsKIAl9CiAKIAlpZiAodHlwZSA9PSBJTlRFTF9PVVRQVVRfRURQKSB7CkBAIC0xNTgwLDYgKzE1NTMsNyBAQAogCiAJc3dpdGNoICh0ZW1wICYgVFJBTlNfRERJX01PREVfU0VMRUNUX01BU0spIHsKIAljYXNlIFRSQU5TX0RESV9NT0RFX1NFTEVDVF9IRE1JOgorCQlwaXBlX2NvbmZpZy0+aGFzX2hkbWlfc2luayA9IHRydWU7CiAJY2FzZSBUUkFOU19ERElfTU9ERV9TRUxFQ1RfRFZJOgogCWNhc2UgVFJBTlNfRERJX01PREVfU0VMRUNUX0ZESToKIAkJYnJlYWs7CkBAIC0xNTkyLDYgKzE1NjYsMTIgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKGludGVsX2Rpc3BsYXlfcG93ZXJfZW5hYmxlZChkZXZfcHJpdiwgUE9XRVJfRE9NQUlOX0FVRElPKSkgeworCQl0ZW1wID0gSTkxNV9SRUFEKEhTV19BVURfUElOX0VMRF9DUF9WTEQpOworCQlpZiAodGVtcCAmIChBVURJT19PVVRQVVRfRU5BQkxFX0EgPDwgKGludGVsX2NydGMtPnBpcGUgKiA0KSkpCisJCQlwaXBlX2NvbmZpZy0+aGFzX2F1ZGlvID0gdHJ1ZTsKKwl9CisKIAlpZiAoZW5jb2Rlci0+dHlwZSA9PSBJTlRFTF9PVVRQVVRfRURQICYmIGRldl9wcml2LT52YnQuZWRwX2JwcCAmJgogCSAgICBwaXBlX2NvbmZpZy0+cGlwZV9icHAgPiBkZXZfcHJpdi0+dmJ0LmVkcF9icHApIHsKIAkJLyoKQEAgLTE3MDgsNyArMTY4OCw2IEBACiAJCQkgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKIAogCWludGVsX2VuY29kZXItPmNvbXB1dGVfY29uZmlnID0gaW50ZWxfZGRpX2NvbXB1dGVfY29uZmlnOwotCWludGVsX2VuY29kZXItPm1vZGVfc2V0ID0gaW50ZWxfZGRpX21vZGVfc2V0OwogCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2VuYWJsZV9kZGk7CiAJaW50ZWxfZW5jb2Rlci0+cHJlX2VuYWJsZSA9IGludGVsX2RkaV9wcmVfZW5hYmxlOwogCWludGVsX2VuY29kZXItPmRpc2FibGUgPSBpbnRlbF9kaXNhYmxlX2RkaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCA1YjYwZTI1Li5lZmQzY2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC00MSw2ICs0MSw5IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYV9yZW1hcHBpbmcuaD4KIAorI2RlZmluZSBESVZfUk9VTkRfQ0xPU0VTVF9VTEwobGwsIGQpCVwKKwkoeyB1bnNpZ25lZCBsb25nIGxvbmcgX3RtcCA9IChsbCkrKGQpLzI7IGRvX2RpdihfdG1wLCBkKTsgX3RtcDsgfSkKKwogc3RhdGljIHZvaWQgaW50ZWxfaW5jcmVhc2VfcGxsY2xvY2soc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfdXBkYXRlX2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGJvb2wgb24pOwogCkBAIC01NSw2ICs1OCwxNSBAQAogCQkJCSAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppZmIsCiAJCQkJICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMiAqbW9kZV9jbWQsCiAJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyB2b2lkIGludGVsX2RwX3NldF9tX24oc3RydWN0IGludGVsX2NydGMgKmNydGMpOworc3RhdGljIHZvaWQgaTl4eF9zZXRfcGlwZWNvbmYoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMpOworc3RhdGljIHZvaWQgaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0Yyk7CitzdGF0aWMgdm9pZCBpbnRlbF9jcHVfdHJhbnNjb2Rlcl9zZXRfbV9uKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLAorCQkJCQkgc3RydWN0IGludGVsX2xpbmtfbV9uICptX24pOworc3RhdGljIHZvaWQgaXJvbmxha2Vfc2V0X3BpcGVjb25mKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitzdGF0aWMgdm9pZCBoYXN3ZWxsX3NldF9waXBlY29uZihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworc3RhdGljIHZvaWQgaW50ZWxfc2V0X3BpcGVfY3NjKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitzdGF0aWMgdm9pZCB2bHZfcHJlcGFyZV9wbGwoc3RydWN0IGludGVsX2NydGMgKmNydGMpOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJaW50CW1pbiwgbWF4OwpAQCAtMzI4LDYgKzM0MCwyMiBAQAogCS5wMiA9IHsgLnAyX3Nsb3cgPSAyLCAucDJfZmFzdCA9IDIwIH0sIC8qIHNsb3c9bWluLCBmYXN0PW1heCAqLwogfTsKIAorc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2NodiA9IHsKKwkvKgorCSAqIFRoZXNlIGFyZSB0aGUgZGF0YSByYXRlIGxpbWl0cyAobWVhc3VyZWQgaW4gZmFzdCBjbG9ja3MpCisJICogc2luY2UgdGhvc2UgYXJlIHRoZSBzdHJpY3Rlc3QgbGltaXRzIHdlIGhhdmUuICBUaGUgZmFzdAorCSAqIGNsb2NrIGFuZCBhY3R1YWwgcmF0ZSBsaW1pdHMgYXJlIG1vcmUgcmVsYXhlZCwgc28gY2hlY2tpbmcKKwkgKiB0aGVtIHdvdWxkIG1ha2Ugbm8gZGlmZmVyZW5jZS4KKwkgKi8KKwkuZG90ID0geyAubWluID0gMjUwMDAgKiA1LCAubWF4ID0gNTQwMDAwICogNX0sCisJLnZjbyA9IHsgLm1pbiA9IDQ4NjAwMDAsIC5tYXggPSA2NzAwMDAwIH0sCisJLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gMSB9LAorCS5tMSA9IHsgLm1pbiA9IDIsIC5tYXggPSAyIH0sCisJLm0yID0geyAubWluID0gMjQgPDwgMjIsIC5tYXggPSAxNzUgPDwgMjIgfSwKKwkucDEgPSB7IC5taW4gPSAyLCAubWF4ID0gNCB9LAorCS5wMiA9IHsJLnAyX3Nsb3cgPSAxLCAucDJfZmFzdCA9IDE0IH0sCit9OworCiBzdGF0aWMgdm9pZCB2bHZfY2xvY2soaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7CiAJY2xvY2stPm0gPSBjbG9jay0+bTEgKiBjbG9jay0+bTI7CkBAIC00MTIsNiArNDQwLDggQEAKIAkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19waW5ldmlld19sdmRzOwogCQllbHNlCiAJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfcGluZXZpZXdfc2R2bzsKKwl9IGVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfY2h2OwogCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CiAJCWxpbWl0ID0gJmludGVsX2xpbWl0c192bHY7CiAJfSBlbHNlIGlmICghSVNfR0VOMihkZXYpKSB7CkBAIC00NTYsNiArNDg2LDE3IEBACiAJY2xvY2stPmRvdCA9IERJVl9ST1VORF9DTE9TRVNUKGNsb2NrLT52Y28sIGNsb2NrLT5wKTsKIH0KIAorc3RhdGljIHZvaWQgY2h2X2Nsb2NrKGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmNsb2NrKQoreworCWNsb2NrLT5tID0gY2xvY2stPm0xICogY2xvY2stPm0yOworCWNsb2NrLT5wID0gY2xvY2stPnAxICogY2xvY2stPnAyOworCWlmIChXQVJOX09OKGNsb2NrLT5uID09IDAgfHwgY2xvY2stPnAgPT0gMCkpCisJCXJldHVybjsKKwljbG9jay0+dmNvID0gRElWX1JPVU5EX0NMT1NFU1RfVUxMKCh1aW50NjRfdClyZWZjbGsgKiBjbG9jay0+bSwKKwkJCWNsb2NrLT5uIDw8IDIyKTsKKwljbG9jay0+ZG90ID0gRElWX1JPVU5EX0NMT1NFU1QoY2xvY2stPnZjbywgY2xvY2stPnApOworfQorCiAjZGVmaW5lIElOVEVMUGxsSW52YWxpZChzKSAgIGRvIHsgLyogRFJNX0RFQlVHKHMpOyAqLyByZXR1cm4gZmFsc2U7IH0gd2hpbGUgKDApCiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc2V0IG9mIGRpdmlzb3JzIGFyZSB2YWxpZCBmb3IgYSBnaXZlbiByZWZjbGsgd2l0aApAQCAtNzMxLDYgKzc3Miw1OCBAQAogCXJldHVybiBmb3VuZDsKIH0KIAorc3RhdGljIGJvb2wKK2Nodl9maW5kX2Jlc3RfZHBsbChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkgICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICptYXRjaF9jbG9jaywKKwkJICAgaW50ZWxfY2xvY2tfdCAqYmVzdF9jbG9jaykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCWludGVsX2Nsb2NrX3QgY2xvY2s7CisJdWludDY0X3QgbTI7CisJaW50IGZvdW5kID0gZmFsc2U7CisKKwltZW1zZXQoYmVzdF9jbG9jaywgMCwgc2l6ZW9mKCpiZXN0X2Nsb2NrKSk7CisKKwkvKgorCSAqIEJhc2VkIG9uIGhhcmR3YXJlIGRvYywgdGhlIG4gYWx3YXlzIHNldCB0byAxLCBhbmQgbTEgYWx3YXlzCisJICogc2V0IHRvIDIuICBJZiByZXF1aXJlcyB0byBzdXBwb3J0IDIwME1oeiByZWZjbGssIHdlIG5lZWQgdG8KKwkgKiByZXZpc2l0IHRoaXMgYmVjYXVzZSBuIG1heSBub3QgMSBhbnltb3JlLgorCSAqLworCWNsb2NrLm4gPSAxLCBjbG9jay5tMSA9IDI7CisJdGFyZ2V0ICo9IDU7CS8qIGZhc3QgY2xvY2sgKi8KKworCWZvciAoY2xvY2sucDEgPSBsaW1pdC0+cDEubWF4OyBjbG9jay5wMSA+PSBsaW1pdC0+cDEubWluOyBjbG9jay5wMS0tKSB7CisJCWZvciAoY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfZmFzdDsKKwkJCQljbG9jay5wMiA+PSBsaW1pdC0+cDIucDJfc2xvdzsKKwkJCQljbG9jay5wMiAtPSBjbG9jay5wMiA+IDEwID8gMiA6IDEpIHsKKworCQkJY2xvY2sucCA9IGNsb2NrLnAxICogY2xvY2sucDI7CisKKwkJCW0yID0gRElWX1JPVU5EX0NMT1NFU1RfVUxMKCgodWludDY0X3QpdGFyZ2V0ICogY2xvY2sucCAqCisJCQkJCWNsb2NrLm4pIDw8IDIyLCByZWZjbGsgKiBjbG9jay5tMSk7CisKKwkJCWlmIChtMiA+IElOVF9NQVgvY2xvY2subTEpCisJCQkJY29udGludWU7CisKKwkJCWNsb2NrLm0yID0gbTI7CisKKwkJCWNodl9jbG9jayhyZWZjbGssICZjbG9jayk7CisKKwkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGRldiwgbGltaXQsICZjbG9jaykpCisJCQkJY29udGludWU7CisKKwkJCS8qIGJhc2VkIG9uIGhhcmR3YXJlIHJlcXVpcmVtZW50LCBwcmVmZXIgYmlnZ2VyIHAKKwkJCSAqLworCQkJaWYgKGNsb2NrLnAgPiBiZXN0X2Nsb2NrLT5wKSB7CisJCQkJKmJlc3RfY2xvY2sgPSBjbG9jazsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKIGJvb2wgaW50ZWxfY3J0Y19hY3RpdmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKQEAgLTc2NSw3ICs4NTgsNyBAQAogCWZyYW1lID0gSTkxNV9SRUFEKGZyYW1lX3JlZyk7CiAKIAlpZiAod2FpdF9mb3IoSTkxNV9SRUFEX05PVFJBQ0UoZnJhbWVfcmVnKSAhPSBmcmFtZSwgNTApKQotCQlEUk1fREVCVUdfS01TKCJ2Ymxhbmsgd2FpdCB0aW1lZCBvdXRcbiIpOworCQlXQVJOKDEsICJ2Ymxhbmsgd2FpdCB0aW1lZCBvdXRcbiIpOwogfQogCiAvKioKQEAgLTg3OCw3ICs5NzEsNyBAQAogCXUzMiBiaXQ7CiAKIAlpZiAoSEFTX1BDSF9JQlgoZGV2X3ByaXYtPmRldikpIHsKLQkJc3dpdGNoKHBvcnQtPnBvcnQpIHsKKwkJc3dpdGNoIChwb3J0LT5wb3J0KSB7CiAJCWNhc2UgUE9SVF9COgogCQkJYml0ID0gU0RFX1BPUlRCX0hPVFBMVUc7CiAJCQlicmVhazsKQEAgLTg5Miw3ICs5ODUsNyBAQAogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9IGVsc2UgewotCQlzd2l0Y2gocG9ydC0+cG9ydCkgeworCQlzd2l0Y2ggKHBvcnQtPnBvcnQpIHsKIAkJY2FzZSBQT1JUX0I6CiAJCQliaXQgPSBTREVfUE9SVEJfSE9UUExVR19DUFQ7CiAJCQlicmVhazsKQEAgLTEwOTcsMTAgKzExOTAsOCBAQAogCiAJaWYgKElTXzg0NUcoZGV2KSB8fCBJU19JODY1RyhkZXYpKQogCQljdXJfc3RhdGUgPSBJOTE1X1JFQUQoX0NVUkFDTlRSKSAmIENVUlNPUl9FTkFCTEU7Ci0JZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPD0gNiB8fCBJU19WQUxMRVlWSUVXKGRldikpCi0JCWN1cl9zdGF0ZSA9IEk5MTVfUkVBRChDVVJDTlRSKHBpcGUpKSAmIENVUlNPUl9NT0RFOwogCWVsc2UKLQkJY3VyX3N0YXRlID0gSTkxNV9SRUFEKENVUkNOVFJfSVZCKHBpcGUpKSAmIENVUlNPUl9NT0RFOworCQljdXJfc3RhdGUgPSBJOTE1X1JFQUQoQ1VSQ05UUihwaXBlKSkgJiBDVVJTT1JfTU9ERTsKIAogCVdBUk4oY3VyX3N0YXRlICE9IHN0YXRlLAogCSAgICAgImN1cnNvciBvbiBwaXBlICVjIGFzc2VydGlvbiBmYWlsdXJlIChleHBlY3RlZCAlcywgY3VycmVudCAlcylcbiIsCkBAIC0xMjUzLDYgKzEzNDQsOSBAQAogCQl1MzIJdHJhbnNfZHBfY3RsID0gSTkxNV9SRUFEKHRyYW5zX2RwX2N0bF9yZWcpOwogCQlpZiAoKHRyYW5zX2RwX2N0bCAmIFRSQU5TX0RQX1BPUlRfU0VMX01BU0spICE9IHBvcnRfc2VsKQogCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdi0+ZGV2KSkgeworCQlpZiAoKHZhbCAmIERQX1BJUEVfTUFTS19DSFYpICE9IERQX1BJUEVfU0VMRUNUX0NIVihwaXBlKSkKKwkJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewogCQlpZiAoKHZhbCAmIERQX1BJUEVfTUFTSykgIT0gKHBpcGUgPDwgMzApKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTI2OSw2ICsxMzYzLDkgQEAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2X3ByaXYtPmRldikpIHsKIAkJaWYgKCh2YWwgJiBTRFZPX1BJUEVfU0VMX01BU0tfQ1BUKSAhPSBTRFZPX1BJUEVfU0VMX0NQVChwaXBlKSkKIAkJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYtPmRldikpIHsKKwkJaWYgKCh2YWwgJiBTRFZPX1BJUEVfU0VMX01BU0tfQ0hWKSAhPSBTRFZPX1BJUEVfU0VMX0NIVihwaXBlKSkKKwkJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewogCQlpZiAoKHZhbCAmIFNEVk9fUElQRV9TRUxfTUFTSykgIT0gU0RWT19QSVBFX1NFTChwaXBlKSkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTEzNjcsNyArMTQ2NCwxNyBAQAogCWlmICghSVNfVkFMTEVZVklFVyhkZXYpKQogCQlyZXR1cm47CiAKLQlEUElPX1BIWV9JT1NGX1BPUlQoRFBJT19QSFkwKSA9IElPU0ZfUE9SVF9EUElPOworCS8qCisJICogSU9TRl9QT1JUX0RQSU8gaXMgdXNlZCBmb3IgVkxWIHgyIFBIWSAoRFAvSERNSSBCIGFuZCBDKSwKKwkgKiBDSFYgeDEgUEhZIChEUC9IRE1JIEQpCisJICogSU9TRl9QT1JUX0RQSU9fMiBpcyB1c2VkIGZvciBDSFYgeDIgUEhZIChEUC9IRE1JIEIgYW5kIEMpCisJICovCisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlEUElPX1BIWV9JT1NGX1BPUlQoRFBJT19QSFkwKSA9IElPU0ZfUE9SVF9EUElPXzI7CisJCURQSU9fUEhZX0lPU0ZfUE9SVChEUElPX1BIWTEpID0gSU9TRl9QT1JUX0RQSU87CisJfSBlbHNlIHsKKwkJRFBJT19QSFlfSU9TRl9QT1JUKERQSU9fUEhZMCkgPSBJT1NGX1BPUlRfRFBJTzsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3Jlc2V0X2RwaW8oc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTEzNzcsMjUgKzE0ODQsNDggQEAKIAlpZiAoIUlTX1ZBTExFWVZJRVcoZGV2KSkKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBFbmFibGUgdGhlIENSSSBjbG9jayBzb3VyY2Ugc28gd2UgY2FuIGdldCBhdCB0aGUgZGlzcGxheSBhbmQgdGhlCi0JICogcmVmZXJlbmNlIGNsb2NrIGZvciBWR0EgaG90cGx1ZyAvIG1hbnVhbCBkZXRlY3Rpb24uCi0JICovCi0JSTkxNV9XUklURShEUExMKFBJUEVfQiksIEk5MTVfUkVBRChEUExMKFBJUEVfQikpIHwKLQkJICAgRFBMTF9SRUZBX0NMS19FTkFCTEVfVkxWIHwKLQkJICAgRFBMTF9JTlRFR1JBVEVEX0NSSV9DTEtfVkxWKTsKKwlpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCWVudW0gZHBpb19waHkgcGh5OworCQl1MzIgdmFsOwogCi0JLyoKLQkgKiBGcm9tIFZMVjJBMF9EUF9lRFBfRFBJT19kcml2ZXJfdmJpb3Nfbm90ZXNfMTAuZG9jeCAtCi0JICogIDYuCURlLWFzc2VydCBjbW5fcmVzZXQvc2lkZV9yZXNldC4gU2FtZSBhcyBWTFYgWDAuCi0JICogICBhLglHVW5pdCAweDIxMTAgYml0WzBdIHNldCB0byAxIChkZWYgMCkKLQkgKiAgIGIuCVRoZSBvdGhlciBiaXRzIHN1Y2ggYXMgc2ZyIHNldHRpbmdzIC8gbW9kZXNlbCBtYXkgYWxsIGJlIHNldAotCSAqICAgICAgdG8gMC4KLQkgKgotCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBvbiBpbml0IGFuZCByZXN1bWUgZnJvbSBTMyB3aXRoIGJvdGgKLQkgKiBQTExzIGRpc2FibGVkLCBvciB3ZSByaXNrIGxvc2luZyBEUElPIGFuZCBQTEwgc3luY2hyb25pemF0aW9uLgotCSAqLwotCUk5MTVfV1JJVEUoRFBJT19DVEwsIEk5MTVfUkVBRChEUElPX0NUTCkgfCBEUElPX0NNTlJTVCk7CisJCWZvciAocGh5ID0gRFBJT19QSFkwOyBwaHkgPCBJOTE1X05VTV9QSFlTX1ZMVjsgcGh5KyspIHsKKwkJCS8qIFBvbGwgZm9yIHBoeXB3cmdvb2Qgc2lnbmFsICovCisJCQlpZiAod2FpdF9mb3IoSTkxNV9SRUFEKERJU1BMQVlfUEhZX1NUQVRVUykgJgorCQkJCQkJUEhZX1BPV0VSR09PRChwaHkpLCAxKSkKKwkJCQlEUk1fRVJST1IoIkRpc3BsYXkgUEhZICVkIGlzIG5vdCBwb3dlciB1cFxuIiwgcGh5KTsKKworCQkJLyoKKwkJCSAqIERlYXNzZXJ0IGNvbW1vbiBsYW5lIHJlc2V0IGZvciBQSFkuCisJCQkgKgorCQkJICogVGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9uIGluaXQgYW5kIHJlc3VtZSBmcm9tIFMzCisJCQkgKiB3aXRoIGJvdGggUExMcyBkaXNhYmxlZCwgb3Igd2UgcmlzayBsb3NpbmcgRFBJTyBhbmQKKwkJCSAqIFBMTCBzeW5jaHJvbml6YXRpb24uCisJCQkgKi8KKwkJCXZhbCA9IEk5MTVfUkVBRChESVNQTEFZX1BIWV9DT05UUk9MKTsKKwkJCUk5MTVfV1JJVEUoRElTUExBWV9QSFlfQ09OVFJPTCwKKwkJCQlQSFlfQ09NX0xBTkVfUkVTRVRfREVBU1NFUlQocGh5LCB2YWwpKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgRFBJTyBoYXMgYWxyZWFkeSBiZWVuIHJlc2V0LCBlLmcuIGJ5IEJJT1MsIGp1c3Qgc2tpcCBhbGwKKwkJICogdGhpcy4KKwkJICovCisJCWlmIChJOTE1X1JFQUQoRFBJT19DVEwpICYgRFBJT19DTU5SU1QpCisJCQlyZXR1cm47CisKKwkJLyoKKwkJICogRnJvbSBWTFYyQTBfRFBfZURQX0hETUlfRFBJT19kcml2ZXJfdmJpb3Nfbm90ZXNfMTEuZG9jeDoKKwkJICogTmVlZCB0byBhc3NlcnQgYW5kIGRlLWFzc2VydCBQSFkgU0IgcmVzZXQgYnkgZ2F0aW5nIHRoZQorCQkgKiBjb21tb24gbGFuZSBwb3dlciwgdGhlbiB1bi1nYXRpbmcgaXQuCisJCSAqIFNpbXBseSB1bmdhdGluZyBpc24ndCBlbm91Z2ggdG8gcmVzZXQgdGhlIFBIWSBlbm91Z2ggdG8gZ2V0CisJCSAqIHBvcnRzIGFuZCBsYW5lcyBydW5uaW5nLgorCQkgKi8KKwkJX192bHZfc2V0X3Bvd2VyX3dlbGwoZGV2X3ByaXYsIFBVTklUX1BPV0VSX1dFTExfRFBJT19DTU5fQkMsCisJCQkJICAgICBmYWxzZSk7CisJCV9fdmx2X3NldF9wb3dlcl93ZWxsKGRldl9wcml2LCBQVU5JVF9QT1dFUl9XRUxMX0RQSU9fQ01OX0JDLAorCQkJCSAgICAgdHJ1ZSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB2bHZfZW5hYmxlX3BsbChzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKQEAgLTE0MzYsNiArMTU2Niw0NCBAQAogCXVkZWxheSgxNTApOyAvKiB3YWl0IGZvciB3YXJtdXAgKi8KIH0KIAorc3RhdGljIHZvaWQgY2h2X2VuYWJsZV9wbGwoc3RydWN0IGludGVsX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHBpcGUgPSBjcnRjLT5waXBlOworCWVudW0gZHBpb19jaGFubmVsIHBvcnQgPSB2bHZfcGlwZV90b19jaGFubmVsKHBpcGUpOworCXUzMiB0bXA7CisKKwlhc3NlcnRfcGlwZV9kaXNhYmxlZChkZXZfcHJpdiwgY3J0Yy0+cGlwZSk7CisKKwlCVUdfT04oIUlTX0NIRVJSWVZJRVcoZGV2X3ByaXYtPmRldikpOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBFbmFibGUgYmFjayB0aGUgMTBiaXQgY2xvY2sgdG8gZGlzcGxheSBjb250cm9sbGVyICovCisJdG1wID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzE0KHBvcnQpKTsKKwl0bXAgfD0gRFBJT19EQ0xLUF9FTjsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzE0KHBvcnQpLCB0bXApOworCisJLyoKKwkgKiBOZWVkIHRvIHdhaXQgPiAxMDBucyBiZXR3ZWVuIGRjbGtwIGNsb2NrIGVuYWJsZSBiaXQgYW5kIFBMTCBlbmFibGUuCisJICovCisJdWRlbGF5KDEpOworCisJLyogRW5hYmxlIFBMTCAqLworCUk5MTVfV1JJVEUoRFBMTChwaXBlKSwgY3J0Yy0+Y29uZmlnLmRwbGxfaHdfc3RhdGUuZHBsbCk7CisKKwkvKiBDaGVjayBQTEwgaXMgbG9ja2VkICovCisJaWYgKHdhaXRfZm9yKCgoSTkxNV9SRUFEKERQTEwocGlwZSkpICYgRFBMTF9MT0NLX1ZMVikgPT0gRFBMTF9MT0NLX1ZMViksIDEpKQorCQlEUk1fRVJST1IoIlBMTCAlZCBmYWlsZWQgdG8gbG9ja1xuIiwgcGlwZSk7CisKKwkvKiBub3Qgc3VyZSB3aGVuIHRoaXMgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KKwlJOTE1X1dSSVRFKERQTExfTUQocGlwZSksIGNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLmRwbGxfbWQpOworCVBPU1RJTkdfUkVBRChEUExMX01EKHBpcGUpKTsKKworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGk5eHhfZW5hYmxlX3BsbChzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7CkBAIC0xNTE5LDQ1ICsxNjg3LDkyIEBACiAJCXZhbCA9IERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMViB8IERQTExfUkVGQV9DTEtfRU5BQkxFX1ZMVjsKIAlJOTE1X1dSSVRFKERQTEwocGlwZSksIHZhbCk7CiAJUE9TVElOR19SRUFEKERQTEwocGlwZSkpOworCit9CisKK3N0YXRpYyB2b2lkIGNodl9kaXNhYmxlX3BsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGVudW0gcGlwZSBwaXBlKQoreworCWVudW0gZHBpb19jaGFubmVsIHBvcnQgPSB2bHZfcGlwZV90b19jaGFubmVsKHBpcGUpOworCXUzMiB2YWw7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHBpcGUgaXNuJ3Qgc3RpbGwgcmVseWluZyBvbiB1cyAqLworCWFzc2VydF9waXBlX2Rpc2FibGVkKGRldl9wcml2LCBwaXBlKTsKKworCS8qIFNldCBQTEwgZW4gPSAwICovCisJdmFsID0gRFBMTF9TU0NfUkVGX0NMT0NLX0NIVjsKKwlpZiAocGlwZSAhPSBQSVBFX0EpCisJCXZhbCB8PSBEUExMX0lOVEVHUkFURURfQ1JJX0NMS19WTFY7CisJSTkxNV9XUklURShEUExMKHBpcGUpLCB2YWwpOworCVBPU1RJTkdfUkVBRChEUExMKHBpcGUpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCisJLyogRGlzYWJsZSAxMGJpdCBjbG9jayB0byBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBDSFZfQ01OX0RXMTQocG9ydCkpOworCXZhbCAmPSB+RFBJT19EQ0xLUF9FTjsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzE0KHBvcnQpLCB2YWwpOworCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIAogdm9pZCB2bHZfd2FpdF9wb3J0X3JlYWR5KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQpCiB7CiAJdTMyIHBvcnRfbWFzazsKKwlpbnQgZHBsbF9yZWc7CiAKIAlzd2l0Y2ggKGRwb3J0LT5wb3J0KSB7CiAJY2FzZSBQT1JUX0I6CiAJCXBvcnRfbWFzayA9IERQTExfUE9SVEJfUkVBRFlfTUFTSzsKKwkJZHBsbF9yZWcgPSBEUExMKDApOwogCQlicmVhazsKIAljYXNlIFBPUlRfQzoKIAkJcG9ydF9tYXNrID0gRFBMTF9QT1JUQ19SRUFEWV9NQVNLOworCQlkcGxsX3JlZyA9IERQTEwoMCk7CisJCWJyZWFrOworCWNhc2UgUE9SVF9EOgorCQlwb3J0X21hc2sgPSBEUExMX1BPUlREX1JFQURZX01BU0s7CisJCWRwbGxfcmVnID0gRFBJT19QSFlfU1RBVFVTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CiAKLQlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChEUExMKDApKSAmIHBvcnRfbWFzaykgPT0gMCwgMTAwMCkpCisJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQoZHBsbF9yZWcpICYgcG9ydF9tYXNrKSA9PSAwLCAxMDAwKSkKIAkJV0FSTigxLCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIHBvcnQgJWMgcmVhZHk6IDB4JTA4eFxuIiwKLQkJICAgICBwb3J0X25hbWUoZHBvcnQtPnBvcnQpLCBJOTE1X1JFQUQoRFBMTCgwKSkpOworCQkgICAgIHBvcnRfbmFtZShkcG9ydC0+cG9ydCksIEk5MTVfUkVBRChkcGxsX3JlZykpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9wcmVwYXJlX3NoYXJlZF9kcGxsKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9zaGFyZWRfZHBsbCAqcGxsID0gaW50ZWxfY3J0Y190b19zaGFyZWRfZHBsbChjcnRjKTsKKworCVdBUk5fT04oIXBsbC0+cmVmY291bnQpOworCWlmIChwbGwtPmFjdGl2ZSA9PSAwKSB7CisJCURSTV9ERUJVR19EUklWRVIoInNldHRpbmcgdXAgJXNcbiIsIHBsbC0+bmFtZSk7CisJCVdBUk5fT04ocGxsLT5vbik7CisJCWFzc2VydF9zaGFyZWRfZHBsbF9kaXNhYmxlZChkZXZfcHJpdiwgcGxsKTsKKworCQlwbGwtPm1vZGVfc2V0KGRldl9wcml2LCBwbGwpOworCX0KIH0KIAogLyoqCi0gKiBpcm9ubGFrZV9lbmFibGVfc2hhcmVkX2RwbGwgLSBlbmFibGUgUENIIFBMTAorICogaW50ZWxfZW5hYmxlX3NoYXJlZF9kcGxsIC0gZW5hYmxlIFBDSCBQTEwKICAqIEBkZXZfcHJpdjogaTkxNSBwcml2YXRlIHN0cnVjdHVyZQogICogQHBpcGU6IHBpcGUgUExMIHRvIGVuYWJsZQogICoKICAqIFRoZSBQQ0ggUExMIG5lZWRzIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZSBQQ0ggdHJhbnNjb2Rlciwgc2luY2UgaXQKICAqIGRyaXZlcyB0aGUgdHJhbnNjb2RlciBjbG9jay4KICAqLwotc3RhdGljIHZvaWQgaXJvbmxha2VfZW5hYmxlX3NoYXJlZF9kcGxsKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQorc3RhdGljIHZvaWQgaW50ZWxfZW5hYmxlX3NoYXJlZF9kcGxsKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9zaGFyZWRfZHBsbCAqcGxsID0gaW50ZWxfY3J0Y190b19zaGFyZWRfZHBsbChjcnRjKTsKIAotCS8qIFBDSCBQTExzIG9ubHkgYXZhaWxhYmxlIG9uIElMSywgU05CIGFuZCBJVkIgKi8KLQlCVUdfT04oSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1KTsKIAlpZiAoV0FSTl9PTihwbGwgPT0gTlVMTCkpCiAJCXJldHVybjsKIApAQCAtMTgwNCwxNiArMjAxOSw2IEBACiAKIAlJOTE1X1dSSVRFKHJlZywgdmFsIHwgUElQRUNPTkZfRU5BQkxFKTsKIAlQT1NUSU5HX1JFQUQocmVnKTsKLQotCS8qCi0JICogVGhlcmUncyBubyBndWFyYW50ZWUgdGhlIHBpcGUgd2lsbCByZWFsbHkgc3RhcnQgcnVubmluZyBub3cuIEl0Ci0JICogZGVwZW5kcyBvbiB0aGUgR2VuLCB0aGUgb3V0cHV0IHR5cGUgYW5kIHRoZSByZWxhdGl2ZSBvcmRlciBiZXR3ZWVuCi0JICogcGlwZSBhbmQgcGxhbmUgZW5hYmxpbmcuIEF2b2lkIHdhaXRpbmcgb24gSFNXKyBzaW5jZSBpdCdzIG5vdAotCSAqIG5lY2Vzc2FyeS4KLQkgKiBUT0RPOiBhdWRpdCB0aGUgcHJldmlvdXMgZ2Vucy4KLQkgKi8KLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPD0gNyAmJiAhSVNfSEFTV0VMTChkZXYpKQotCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2X3ByaXYtPmRldiwgcGlwZSk7CiB9CiAKIC8qKgpAQCAtMTg5MCwxOCArMjA5NSwxNyBAQAogCS8qIElmIHRoZSBwaXBlIGlzbid0IGVuYWJsZWQsIHdlIGNhbid0IHB1bXAgcGl4ZWxzIGFuZCBtYXkgaGFuZyAqLwogCWFzc2VydF9waXBlX2VuYWJsZWQoZGV2X3ByaXYsIHBpcGUpOwogCi0JV0FSTihpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQsICJQcmltYXJ5IHBsYW5lIGFscmVhZHkgZW5hYmxlZFxuIik7CisJaWYgKGludGVsX2NydGMtPnByaW1hcnlfZW5hYmxlZCkKKwkJcmV0dXJuOwogCiAJaW50ZWxfY3J0Yy0+cHJpbWFyeV9lbmFibGVkID0gdHJ1ZTsKIAogCXJlZyA9IERTUENOVFIocGxhbmUpOwogCXZhbCA9IEk5MTVfUkVBRChyZWcpOwotCWlmICh2YWwgJiBESVNQTEFZX1BMQU5FX0VOQUJMRSkKLQkJcmV0dXJuOworCVdBUk5fT04odmFsICYgRElTUExBWV9QTEFORV9FTkFCTEUpOwogCiAJSTkxNV9XUklURShyZWcsIHZhbCB8IERJU1BMQVlfUExBTkVfRU5BQkxFKTsKIAlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBwbGFuZSk7Ci0JaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldl9wcml2LT5kZXYsIHBpcGUpOwogfQogCiAvKioKQEAgLTE5MjAsMTggKzIxMjQsMTcgQEAKIAlpbnQgcmVnOwogCXUzMiB2YWw7CiAKLQlXQVJOKCFpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQsICJQcmltYXJ5IHBsYW5lIGFscmVhZHkgZGlzYWJsZWRcbiIpOworCWlmICghaW50ZWxfY3J0Yy0+cHJpbWFyeV9lbmFibGVkKQorCQlyZXR1cm47CiAKIAlpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQgPSBmYWxzZTsKIAogCXJlZyA9IERTUENOVFIocGxhbmUpOwogCXZhbCA9IEk5MTVfUkVBRChyZWcpOwotCWlmICgodmFsICYgRElTUExBWV9QTEFORV9FTkFCTEUpID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKCh2YWwgJiBESVNQTEFZX1BMQU5FX0VOQUJMRSkgPT0gMCk7CiAKIAlJOTE1X1dSSVRFKHJlZywgdmFsICYgfkRJU1BMQVlfUExBTkVfRU5BQkxFKTsKIAlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBwbGFuZSk7Ci0JaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldl9wcml2LT5kZXYsIHBpcGUpOwogfQogCiBzdGF0aWMgYm9vbCBuZWVkX3Z0ZF93YShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTk1NCw3ICsyMTU3LDcgQEAKIGludAogaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKKwkJCSAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnBpcGVsaW5lZCkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBhbGlnbm1lbnQ7CkBAIC0yMTM0LDcgKzIzMzcsNyBAQAogCSAqIEZhaWxlZCB0byBhbGxvYyB0aGUgb2JqLCBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHNoYXJlCiAJICogYW4gZmIgd2l0aCBhbm90aGVyIENSVEMgaW5zdGVhZAogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJZm9yX2VhY2hfY3J0YyhkZXYsIGMpIHsKIAkJaSA9IHRvX2ludGVsX2NydGMoYyk7CiAKIAkJaWYgKGMgPT0gJmludGVsX2NydGMtPmJhc2UpCkBAIC0yMTUyLDkgKzIzNTUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBpOXh4X3VwZGF0ZV9wcmltYXJ5X3BsYW5lKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAotCQkJCSAgICAgaW50IHgsIGludCB5KQorc3RhdGljIHZvaWQgaTl4eF91cGRhdGVfcHJpbWFyeV9wbGFuZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgICAgaW50IHgsIGludCB5KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIxNjYsMTUgKzIzNjksNiBAQAogCXUzMiBkc3BjbnRyOwogCXUzMiByZWc7CiAKLQlzd2l0Y2ggKHBsYW5lKSB7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCJDYW4ndCB1cGRhdGUgcGxhbmUgJWMgaW4gU0FSRUFcbiIsIHBsYW5lX25hbWUocGxhbmUpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CiAJb2JqID0gaW50ZWxfZmItPm9iajsKIApAQCAtMjI0OSwxMyArMjQ0MywxMSBAQAogCX0gZWxzZQogCQlJOTE1X1dSSVRFKERTUEFERFIocGxhbmUpLCBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKSArIGxpbmVhcl9vZmZzZXQpOwogCVBPU1RJTkdfUkVBRChyZWcpOwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXJvbmxha2VfdXBkYXRlX3ByaW1hcnlfcGxhbmUoc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCi0JCQkJCSBpbnQgeCwgaW50IHkpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV91cGRhdGVfcHJpbWFyeV9wbGFuZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJCSAgaW50IHgsIGludCB5KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIyNjcsMTYgKzI0NTksNiBAQAogCXUzMiBkc3BjbnRyOwogCXUzMiByZWc7CiAKLQlzd2l0Y2ggKHBsYW5lKSB7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQljYXNlIDI6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiQ2FuJ3QgdXBkYXRlIHBsYW5lICVjIGluIFNBUkVBXG4iLCBwbGFuZV9uYW1lKHBsYW5lKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwogCW9iaiA9IGludGVsX2ZiLT5vYmo7CiAKQEAgLTIzNDMsOCArMjUyNSw2IEBACiAJCUk5MTVfV1JJVEUoRFNQTElOT0ZGKHBsYW5lKSwgbGluZWFyX29mZnNldCk7CiAJfQogCVBPU1RJTkdfUkVBRChyZWcpOwotCi0JcmV0dXJuIDA7CiB9CiAKIC8qIEFzc3VtZSBmYiBvYmplY3QgaXMgcGlubmVkICYgaWRsZSAmIGZlbmNlZCBhbmQganVzdCB1cGRhdGUgYmFzZSBwb2ludGVycyAqLwpAQCAtMjM1OSw3ICsyNTM5LDkgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMoZGV2KTsKIAlpbnRlbF9pbmNyZWFzZV9wbGxjbG9jayhjcnRjKTsKIAotCXJldHVybiBkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfcHJpbWFyeV9wbGFuZShjcnRjLCBmYiwgeCwgeSk7CisJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3ByaW1hcnlfcGxhbmUoY3J0YywgZmIsIHgsIHkpOworCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaW50ZWxfZGlzcGxheV9oYW5kbGVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTIzODEsNyArMjU2Myw3IEBACiAJICogcGVuZGluZ19mbGlwX3F1ZXVlIHJlYWxseSBnb3Qgd29rZW4gdXAuCiAJICovCiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCBjcnRjKSB7CiAJCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAkJZW51bSBwbGFuZSBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwogCkBAIC0yMzg5LDEwICsyNTcxLDEwIEBACiAJCWludGVsX2ZpbmlzaF9wYWdlX2ZsaXBfcGxhbmUoZGV2LCBwbGFuZSk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwlmb3JfZWFjaF9jcnRjKGRldiwgY3J0YykgewogCQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAKLQkJbXV0ZXhfbG9jaygmY3J0Yy0+bXV0ZXgpOworCQlkcm1fbW9kZXNldF9sb2NrKCZjcnRjLT5tdXRleCwgTlVMTCk7CiAJCS8qCiAJCSAqIEZJWE1FOiBPbmNlIHdlIGhhdmUgcHJvcGVyIHN1cHBvcnQgZm9yIHByaW1hcnkgcGxhbmVzIChhbmQKIAkJICogZGlzYWJsaW5nIHRoZW0gd2l0aG91dCBkaXNhYmxpbmcgdGhlIGVudGlyZSBjcnRjKSBhbGxvdyBhZ2FpbgpAQCAtMjQwMyw3ICsyNTg1LDcgQEAKIAkJCQkJCQkgICAgICAgY3J0Yy0+cHJpbWFyeS0+ZmIsCiAJCQkJCQkJICAgICAgIGNydGMtPngsCiAJCQkJCQkJICAgICAgIGNydGMtPnkpOwotCQltdXRleF91bmxvY2soJmNydGMtPm11dGV4KTsKKwkJZHJtX21vZGVzZXRfdW5sb2NrKCZjcnRjLT5tdXRleCk7CiAJfQogfQogCkBAIC0yNTE4LDE0ICsyNzAwLDcgQEAKIAkJaW50ZWxfY3J0Yy0+Y29uZmlnLnBpcGVfc3JjX2ggPSBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5OwogCX0KIAotCXJldCA9IGRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV9wcmltYXJ5X3BsYW5lKGNydGMsIGZiLCB4LCB5KTsKLQlpZiAocmV0KSB7Ci0JCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJaW50ZWxfdW5waW5fZmJfb2JqKHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKS0+b2JqKTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIHVwZGF0ZSBiYXNlIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfcHJpbWFyeV9wbGFuZShjcnRjLCBmYiwgeCwgeSk7CiAKIAlvbGRfZmIgPSBjcnRjLT5wcmltYXJ5LT5mYjsKIAljcnRjLT5wcmltYXJ5LT5mYiA9IGZiOwpAQCAtMjYyOCwxMiArMjgwMywxMCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAl1MzIgcmVnLCB0ZW1wLCB0cmllczsKIAotCS8qIEZESSBuZWVkcyBiaXRzIGZyb20gcGlwZSAmIHBsYW5lIGZpcnN0ICovCisJLyogRkRJIG5lZWRzIGJpdHMgZnJvbSBwaXBlIGZpcnN0ICovCiAJYXNzZXJ0X3BpcGVfZW5hYmxlZChkZXZfcHJpdiwgcGlwZSk7Ci0JYXNzZXJ0X3BsYW5lX2VuYWJsZWQoZGV2X3ByaXYsIHBsYW5lKTsKIAogCS8qIFRyYWluIDE6IHVtYXNrIEZESSBSWCBJbnRlcnJ1cHQgc3ltYm9sX2xvY2sgYW5kIGJpdF9sb2NrIGJpdAogCSAgIGZvciB0cmFpbiByZXN1bHQgKi8KQEAgLTMwNjQsOSArMzIzNyw4IEBACiAJdWRlbGF5KDEwMCk7CiAKIAkvKiBJcm9ubGFrZSB3b3JrYXJvdW5kLCBkaXNhYmxlIGNsb2NrIHBvaW50ZXIgYWZ0ZXIgZG93bmluZyBGREkgKi8KLQlpZiAoSEFTX1BDSF9JQlgoZGV2KSkgeworCWlmIChIQVNfUENIX0lCWChkZXYpKQogCQlJOTE1X1dSSVRFKEZESV9SWF9DSElDS0VOKHBpcGUpLCBGRElfUlhfUEhBU0VfU1lOQ19QT0lOVEVSX09WUik7Ci0JfQogCiAJLyogc3RpbGwgc2V0IHRyYWluIHBhdHRlcm4gMSAqLwogCXJlZyA9IEZESV9UWF9DVEwocGlwZSk7CkBAIC0zMTA0LDcgKzMyNzYsNyBAQAogCSAqIGNhbm5vdCBjbGFpbSBhbmQgcGluIGEgbmV3IGZiIHdpdGhvdXQgYXQgbGVhc3QgYWNxdXJpbmcgdGhlCiAJICogc3RydWN0X211dGV4IGFuZCBzbyBzZXJpYWxpc2luZyB3aXRoIHVzLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQlpZiAoYXRvbWljX3JlYWQoJmNydGMtPnVucGluX3dvcmtfY291bnQpID09IDApCiAJCQljb250aW51ZTsKIApAQCAtMzExNyw3ICszMjg5LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzEyNyw4ICszMjk5LDkgQEAKIAogCVdBUk5fT04od2FpdHF1ZXVlX2FjdGl2ZSgmZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSkpOwogCi0Jd2FpdF9ldmVudChkZXZfcHJpdi0+cGVuZGluZ19mbGlwX3F1ZXVlLAotCQkgICAhaW50ZWxfY3J0Y19oYXNfcGVuZGluZ19mbGlwKGNydGMpKTsKKwlXQVJOX09OKHdhaXRfZXZlbnRfdGltZW91dChkZXZfcHJpdi0+cGVuZGluZ19mbGlwX3F1ZXVlLAorCQkJCSAgICFpbnRlbF9jcnRjX2hhc19wZW5kaW5nX2ZsaXAoY3J0YyksCisJCQkJICAgNjAqSFopID09IDApOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWludGVsX2ZpbmlzaF9mYihjcnRjLT5wcmltYXJ5LT5mYik7CkBAIC0zMzQxLDcgKzM1MTQsNyBAQAogCSAqIE5vdGUgdGhhdCBlbmFibGVfc2hhcmVkX2RwbGwgdHJpZXMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQKIAkgKiBnZXRfc2hhcmVkX2RwbGwgdW5jb25kaXRpb25hbGx5IHJlc2V0cyB0aGUgcGxsIC0gd2UgbmVlZCB0aGF0IHRvIGhhdmUKIAkgKiB0aGUgcmlnaHQgTFZEUyBlbmFibGUgc2VxdWVuY2UuICovCi0JaXJvbmxha2VfZW5hYmxlX3NoYXJlZF9kcGxsKGludGVsX2NydGMpOworCWludGVsX2VuYWJsZV9zaGFyZWRfZHBsbChpbnRlbF9jcnRjKTsKIAogCS8qIHNldCB0cmFuc2NvZGVyIHRpbWluZywgcGFuZWwgbXVzdCBhbGxvdyBpdCAqLwogCWFzc2VydF9wYW5lbF91bmxvY2tlZChkZXZfcHJpdiwgcGlwZSk7CkBAIC0zNDQ1LDYgKzM2MTgsOCBAQAogCQlEUk1fREVCVUdfS01TKCJDUlRDOiVkIHVzaW5nIHByZS1hbGxvY2F0ZWQgJXNcbiIsCiAJCQkgICAgICBjcnRjLT5iYXNlLmJhc2UuaWQsIHBsbC0+bmFtZSk7CiAKKwkJV0FSTl9PTihwbGwtPnJlZmNvdW50KTsKKwogCQlnb3RvIGZvdW5kOwogCX0KIApAQCAtMzQ3OCwyMCArMzY1MywxMyBAQAogCXJldHVybiBOVUxMOwogCiBmb3VuZDoKKwlpZiAocGxsLT5yZWZjb3VudCA9PSAwKQorCQlwbGwtPmh3X3N0YXRlID0gY3J0Yy0+Y29uZmlnLmRwbGxfaHdfc3RhdGU7CisKIAljcnRjLT5jb25maWcuc2hhcmVkX2RwbGwgPSBpOwogCURSTV9ERUJVR19EUklWRVIoInVzaW5nICVzIGZvciBwaXBlICVjXG4iLCBwbGwtPm5hbWUsCiAJCQkgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKIAotCWlmIChwbGwtPmFjdGl2ZSA9PSAwKSB7Ci0JCW1lbWNweSgmcGxsLT5od19zdGF0ZSwgJmNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLAotCQkgICAgICAgc2l6ZW9mKHBsbC0+aHdfc3RhdGUpKTsKLQotCQlEUk1fREVCVUdfRFJJVkVSKCJzZXR0aW5nIHVwICVzXG4iLCBwbGwtPm5hbWUpOwotCQlXQVJOX09OKHBsbC0+b24pOwotCQlhc3NlcnRfc2hhcmVkX2RwbGxfZGlzYWJsZWQoZGV2X3ByaXYsIHBsbCk7Ci0KLQkJcGxsLT5tb2RlX3NldChkZXZfcHJpdiwgcGxsKTsKLQl9CiAJcGxsLT5yZWZjb3VudCsrOwogCiAJcmV0dXJuIHBsbDsKQEAgLTM1NjIsMTcgKzM3MzAsMTcgQEAKIAogdm9pZCBoc3dfZW5hYmxlX2lwcyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoIWNydGMtPmNvbmZpZy5pcHNfZW5hYmxlZCkKIAkJcmV0dXJuOwogCi0JLyogV2UgY2FuIG9ubHkgZW5hYmxlIElQUyBhZnRlciB3ZSBlbmFibGUgYSBwbGFuZSBhbmQgd2FpdCBmb3IgYSB2YmxhbmsuCi0JICogV2UgZ3VhcmFudGVlIHRoYXQgdGhlIHBsYW5lIGlzIGVuYWJsZWQgYnkgY2FsbGluZyBpbnRlbF9lbmFibGVfaXBzCi0JICogb25seSBhZnRlciBpbnRlbF9lbmFibGVfcGxhbmUuIEFuZCBpbnRlbF9lbmFibGVfcGxhbmUgYWxyZWFkeSB3YWl0cwotCSAqIGZvciBhIHZibGFuaywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBlbmFibGUgdGhlIElQUyBiaXQuICovCisJLyogV2UgY2FuIG9ubHkgZW5hYmxlIElQUyBhZnRlciB3ZSBlbmFibGUgYSBwbGFuZSBhbmQgd2FpdCBmb3IgYSB2YmxhbmsgKi8KKwlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBjcnRjLT5waXBlKTsKKwogCWFzc2VydF9wbGFuZV9lbmFibGVkKGRldl9wcml2LCBjcnRjLT5wbGFuZSk7Ci0JaWYgKElTX0JST0FEV0VMTChjcnRjLT5iYXNlLmRldikpIHsKKwlpZiAoSVNfQlJPQURXRUxMKGRldikpIHsKIAkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAkJV0FSTl9PTihzYW5keWJyaWRnZV9wY29kZV93cml0ZShkZXZfcHJpdiwgRElTUExBWV9JUFNfQ09OVFJPTCwgMHhjMDAwMDAwMCkpOwogCQltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CkBAIC0zNjAyLDEwICszNzcwLDEzIEBACiAJCXJldHVybjsKIAogCWFzc2VydF9wbGFuZV9lbmFibGVkKGRldl9wcml2LCBjcnRjLT5wbGFuZSk7Ci0JaWYgKElTX0JST0FEV0VMTChjcnRjLT5iYXNlLmRldikpIHsKKwlpZiAoSVNfQlJPQURXRUxMKGRldikpIHsKIAkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKIAkJV0FSTl9PTihzYW5keWJyaWRnZV9wY29kZV93cml0ZShkZXZfcHJpdiwgRElTUExBWV9JUFNfQ09OVFJPTCwgMCkpOwogCQltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJCS8qIHdhaXQgZm9yIHBjb2RlIHRvIGZpbmlzaCBkaXNhYmxpbmcgSVBTLCB3aGljaCBtYXkgdGFrZSB1cCB0byA0Mm1zICovCisJCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKElQU19DVEwpICYgSVBTX0VOQUJMRSkgPT0gMCwgNDIpKQorCQkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgSVBTIGRpc2FibGVcbiIpOwogCX0gZWxzZSB7CiAJCUk5MTVfV1JJVEUoSVBTX0NUTCwgMCk7CiAJCVBPU1RJTkdfUkVBRChJUFNfQ1RMKTsKQEAgLTM2NjIsNiArMzgzMyw5NCBAQAogCQloc3dfZW5hYmxlX2lwcyhpbnRlbF9jcnRjKTsKIH0KIAorc3RhdGljIHZvaWQgaW50ZWxfY3J0Y19kcG1zX292ZXJsYXkoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMsIGJvb2wgZW5hYmxlKQoreworCWlmICghZW5hYmxlICYmIGludGVsX2NydGMtPm92ZXJsYXkpIHsKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2NydGMtPmJhc2UuZGV2OworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGUgPSBmYWxzZTsKKwkJKHZvaWQpIGludGVsX292ZXJsYXlfc3dpdGNoX29mZihpbnRlbF9jcnRjLT5vdmVybGF5KTsKKwkJZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGUgPSB0cnVlOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwl9CisKKwkvKiBMZXQgdXNlcnNwYWNlIHN3aXRjaCB0aGUgb3ZlcmxheSBvbiBhZ2Fpbi4gSW4gbW9zdCBjYXNlcyB1c2Vyc3BhY2UKKwkgKiBoYXMgdG8gcmVjb21wdXRlIHdoZXJlIHRvIHB1dCBpdCBhbnl3YXkuCisJICovCit9CisKKy8qKgorICogaTl4eF9maXh1cF9wbGFuZSAtIHVnbHkgd29ya2Fyb3VuZCBmb3IgRzQ1IHRvIGZpcmUgdXAgdGhlIGhhcmR3YXJlCisgKiBjdXJzb3IgcGxhbmUgYnJpZWZseSBpZiBub3QgYWxyZWFkeSBydW5uaW5nIGFmdGVyIGVuYWJsaW5nIHRoZSBkaXNwbGF5CisgKiBwbGFuZS4KKyAqIFRoaXMgd29ya2Fyb3VuZCBhdm9pZHMgb2NjYXNpb25hbCBibGFuayBzY3JlZW5zIHdoZW4gc2VsZiByZWZyZXNoIGlzCisgKiBlbmFibGVkLgorICovCitzdGF0aWMgdm9pZAorZzR4X2ZpeHVwX3BsYW5lKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgZW51bSBwaXBlIHBpcGUpCit7CisJdTMyIGNudGwgPSBJOTE1X1JFQUQoQ1VSQ05UUihwaXBlKSk7CisKKwlpZiAoKGNudGwgJiBDVVJTT1JfTU9ERSkgPT0gMCkgeworCQl1MzIgZndfYmNsX3NlbGYgPSBJOTE1X1JFQUQoRldfQkxDX1NFTEYpOworCisJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIGZ3X2JjbF9zZWxmICYgfkZXX0JMQ19TRUxGX0VOKTsKKwkJSTkxNV9XUklURShDVVJDTlRSKHBpcGUpLCBDVVJTT1JfTU9ERV82NF9BUkdCX0FYKTsKKwkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldl9wcml2LT5kZXYsIHBpcGUpOworCQlJOTE1X1dSSVRFKENVUkNOVFIocGlwZSksIGNudGwpOworCQlJOTE1X1dSSVRFKENVUkJBU0UocGlwZSksIEk5MTVfUkVBRChDVVJCQVNFKHBpcGUpKSk7CisJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIGZ3X2JjbF9zZWxmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2NydGNfZW5hYmxlX3BsYW5lcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CisKKwlpbnRlbF9lbmFibGVfcHJpbWFyeV9od19wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOworCWludGVsX2VuYWJsZV9wbGFuZXMoY3J0Yyk7CisJLyogVGhlIGZpeHVwIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgY3Vyc29yIGlzIGVuYWJsZWQgKi8KKwlpZiAoSVNfRzRYKGRldikpCisJCWc0eF9maXh1cF9wbGFuZShkZXZfcHJpdiwgcGlwZSk7CisJaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKGNydGMsIHRydWUpOworCWludGVsX2NydGNfZHBtc19vdmVybGF5KGludGVsX2NydGMsIHRydWUpOworCisJaHN3X2VuYWJsZV9pcHMoaW50ZWxfY3J0Yyk7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOworCWludGVsX2VkcF9wc3JfdXBkYXRlKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2NydGNfZGlzYWJsZV9wbGFuZXMoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOworCisJaW50ZWxfY3J0Y193YWl0X2Zvcl9wZW5kaW5nX2ZsaXBzKGNydGMpOworCWRybV9jcnRjX3ZibGFua19vZmYoY3J0Yyk7CisKKwlpZiAoZGV2X3ByaXYtPmZiYy5wbGFuZSA9PSBwbGFuZSkKKwkJaW50ZWxfZGlzYWJsZV9mYmMoZGV2KTsKKworCWhzd19kaXNhYmxlX2lwcyhpbnRlbF9jcnRjKTsKKworCWludGVsX2NydGNfZHBtc19vdmVybGF5KGludGVsX2NydGMsIGZhbHNlKTsKKwlpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3IoY3J0YywgZmFsc2UpOworCWludGVsX2Rpc2FibGVfcGxhbmVzKGNydGMpOworCWludGVsX2Rpc2FibGVfcHJpbWFyeV9od19wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOworfQorCiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9jcnRjX2VuYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTM2NjksMTMgKzM5MjgsMzUgQEAKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOworCWVudW0gcGxhbmUgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAogCVdBUk5fT04oIWNydGMtPmVuYWJsZWQpOwogCiAJaWYgKGludGVsX2NydGMtPmFjdGl2ZSkKIAkJcmV0dXJuOwogCisJaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfcGNoX2VuY29kZXIpCisJCWludGVsX3ByZXBhcmVfc2hhcmVkX2RwbGwoaW50ZWxfY3J0Yyk7CisKKwlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19kcF9lbmNvZGVyKQorCQlpbnRlbF9kcF9zZXRfbV9uKGludGVsX2NydGMpOworCisJaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRjKTsKKworCWlmIChpbnRlbF9jcnRjLT5jb25maWcuaGFzX3BjaF9lbmNvZGVyKSB7CisJCWludGVsX2NwdV90cmFuc2NvZGVyX3NldF9tX24oaW50ZWxfY3J0YywKKwkJCQkJICAgICAmaW50ZWxfY3J0Yy0+Y29uZmlnLmZkaV9tX24pOworCX0KKworCWlyb25sYWtlX3NldF9waXBlY29uZihjcnRjKTsKKworCS8qIFNldCB1cCB0aGUgZGlzcGxheSBwbGFuZSByZWdpc3RlciAqLworCUk5MTVfV1JJVEUoRFNQQ05UUihwbGFuZSksIERJU1BQTEFORV9HQU1NQV9FTkFCTEUpOworCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7CisKKwlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfcHJpbWFyeV9wbGFuZShjcnRjLCBjcnRjLT5wcmltYXJ5LT5mYiwKKwkJCQkJICAgICAgIGNydGMtPngsIGNydGMtPnkpOworCiAJaW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsKIAogCWludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCB0cnVlKTsKQEAgLTM3MDUsMzIgKzM5ODYsMTkgQEAKIAogCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGNydGMpOwogCWludGVsX2VuYWJsZV9waXBlKGludGVsX2NydGMpOwotCWludGVsX2VuYWJsZV9wcmltYXJ5X2h3X3BsYW5lKGRldl9wcml2LCBwbGFuZSwgcGlwZSk7Ci0JaW50ZWxfZW5hYmxlX3BsYW5lcyhjcnRjKTsKLQlpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3IoY3J0YywgdHJ1ZSk7CiAKIAlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19wY2hfZW5jb2RlcikKIAkJaXJvbmxha2VfcGNoX2VuYWJsZShjcnRjKTsKIAotCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpbnRlbF91cGRhdGVfZmJjKGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KIAlmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoZGV2LCBjcnRjLCBlbmNvZGVyKQogCQllbmNvZGVyLT5lbmFibGUoZW5jb2Rlcik7CiAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKIAkJY3B0X3ZlcmlmeV9tb2Rlc2V0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CiAKLQkvKgotCSAqIFRoZXJlIHNlZW1zIHRvIGJlIGEgcmFjZSBpbiBQQ0ggcGxhdGZvcm0gaHcgKGF0IGxlYXN0IG9uIHNvbWUKLQkgKiBvdXRwdXRzKSB3aGVyZSBhbiBlbmFibGVkIHBpcGUgc3RpbGwgY29tcGxldGVzIGFueSBwYWdlZmxpcCByaWdodAotCSAqIGF3YXkgKGFzIGlmIHRoZSBwaXBlIGlzIG9mZikgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB2YmxhbmsuIEFzIHNvb24KLQkgKiBhcyB0aGUgZmlyc3QgdmJsYW5rIGhhcHBlbmQsIGV2ZXJ5dGhpbmcgd29ya3MgYXMgZXhwZWN0ZWQuIEhlbmNlIGp1c3QKLQkgKiB3YWl0IGZvciBvbmUgdmJsYW5rIGJlZm9yZSByZXR1cm5pbmcgdG8gYXZvaWQgc3RyYW5nZSB0aGluZ3MKLQkgKiBoYXBwZW5pbmcuCi0JICovCi0JaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJaW50ZWxfY3J0Y19lbmFibGVfcGxhbmVzKGNydGMpOworCisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOwogfQogCiAvKiBJUFMgb25seSBleGlzdHMgb24gVUxUIG1hY2hpbmVzIGFuZCBpcyB0aWVkIHRvIHBpcGUgQS4gKi8KQEAgLTM3MzksNDcgKzQwMDcsNiBAQAogCXJldHVybiBIQVNfSVBTKGNydGMtPmJhc2UuZGV2KSAmJiBjcnRjLT5waXBlID09IFBJUEVfQTsKIH0KIAotc3RhdGljIHZvaWQgaGFzd2VsbF9jcnRjX2VuYWJsZV9wbGFuZXMoc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0JaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwotCi0JaW50ZWxfZW5hYmxlX3ByaW1hcnlfaHdfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKLQlpbnRlbF9lbmFibGVfcGxhbmVzKGNydGMpOwotCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjLCB0cnVlKTsKLQotCWhzd19lbmFibGVfaXBzKGludGVsX2NydGMpOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWludGVsX3VwZGF0ZV9mYmMoZGV2KTsKLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgaGFzd2VsbF9jcnRjX2Rpc2FibGVfcGxhbmVzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwotCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKLQotCWludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhjcnRjKTsKLQlkcm1fdmJsYW5rX29mZihkZXYsIHBpcGUpOwotCi0JLyogRkJDIG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIGRpc2FibGluZyB0aGUgcGxhbmUgb24gSFNXLiAqLwotCWlmIChkZXZfcHJpdi0+ZmJjLnBsYW5lID09IHBsYW5lKQotCQlpbnRlbF9kaXNhYmxlX2ZiYyhkZXYpOwotCi0JaHN3X2Rpc2FibGVfaXBzKGludGVsX2NydGMpOwotCi0JaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKGNydGMsIGZhbHNlKTsKLQlpbnRlbF9kaXNhYmxlX3BsYW5lcyhjcnRjKTsKLQlpbnRlbF9kaXNhYmxlX3ByaW1hcnlfaHdfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKLX0KLQogLyoKICAqIFRoaXMgaW1wbGVtZW50cyB0aGUgd29ya2Fyb3VuZCBkZXNjcmliZWQgaW4gdGhlICJub3RlcyIgc2VjdGlvbiBvZiB0aGUgbW9kZQogICogc2V0IHNlcXVlbmNlIGRvY3VtZW50YXRpb24uIFdoZW4gZ29pbmcgZnJvbSBubyBwaXBlcyBvciBzaW5nbGUgcGlwZSB0bwpAQCAtMzc5Myw3ICs0MDIwLDcgQEAKIAogCS8qIFdlIHdhbnQgdG8gZ2V0IHRoZSBvdGhlcl9hY3RpdmVfY3J0YyBvbmx5IGlmIHRoZXJlJ3Mgb25seSAxIG90aGVyCiAJICogYWN0aXZlIGNydGMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjX2l0LCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGJhc2UuaGVhZCkgeworCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBjcnRjX2l0KSB7CiAJCWlmICghY3J0Y19pdC0+YWN0aXZlIHx8IGNydGNfaXQgPT0gY3J0YykKIAkJCWNvbnRpbnVlOwogCkBAIC0zODE2LDEyICs0MDQzLDM0IEBACiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwllbnVtIHBsYW5lIHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAKIAlXQVJOX09OKCFjcnRjLT5lbmFibGVkKTsKIAogCWlmIChpbnRlbF9jcnRjLT5hY3RpdmUpCiAJCXJldHVybjsKIAorCWlmIChpbnRlbF9jcnRjLT5jb25maWcuaGFzX2RwX2VuY29kZXIpCisJCWludGVsX2RwX3NldF9tX24oaW50ZWxfY3J0Yyk7CisKKwlpbnRlbF9zZXRfcGlwZV90aW1pbmdzKGludGVsX2NydGMpOworCisJaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfcGNoX2VuY29kZXIpIHsKKwkJaW50ZWxfY3B1X3RyYW5zY29kZXJfc2V0X21fbihpbnRlbF9jcnRjLAorCQkJCQkgICAgICZpbnRlbF9jcnRjLT5jb25maWcuZmRpX21fbik7CisJfQorCisJaGFzd2VsbF9zZXRfcGlwZWNvbmYoY3J0Yyk7CisKKwlpbnRlbF9zZXRfcGlwZV9jc2MoY3J0Yyk7CisKKwkvKiBTZXQgdXAgdGhlIGRpc3BsYXkgcGxhbmUgcmVnaXN0ZXIgKi8KKwlJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBESVNQUExBTkVfR0FNTUFfRU5BQkxFIHwgRElTUFBMQU5FX1BJUEVfQ1NDX0VOQUJMRSk7CisJUE9TVElOR19SRUFEKERTUENOVFIocGxhbmUpKTsKKworCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV9wcmltYXJ5X3BsYW5lKGNydGMsIGNydGMtPnByaW1hcnktPmZiLAorCQkJCQkgICAgICAgY3J0Yy0+eCwgY3J0Yy0+eSk7CisKIAlpbnRlbF9jcnRjLT5hY3RpdmUgPSB0cnVlOwogCiAJaW50ZWxfc2V0X2NwdV9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhkZXYsIHBpcGUsIHRydWUpOwpAQCAtMzg2Miw3ICs0MTExLDkgQEAKIAkvKiBJZiB3ZSBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyIGJldHdlZW4gcGlwZS9wbGFuZXMgZW5hYmxpbmcsIHdlIG5lZWQKIAkgKiB0byBjaGFuZ2UgdGhlIHdvcmthcm91bmQuICovCiAJaGFzd2VsbF9tb2RlX3NldF9wbGFuZXNfd29ya2Fyb3VuZChpbnRlbF9jcnRjKTsKLQloYXN3ZWxsX2NydGNfZW5hYmxlX3BsYW5lcyhjcnRjKTsKKwlpbnRlbF9jcnRjX2VuYWJsZV9wbGFuZXMoY3J0Yyk7CisKKwlkcm1fY3J0Y192Ymxhbmtfb24oY3J0Yyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlyb25sYWtlX3BmaXRfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKQEAgLTM4ODcsMjYgKzQxMzgsMTYgQEAKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwogCXUzMiByZWcsIHRlbXA7CiAKLQogCWlmICghaW50ZWxfY3J0Yy0+YWN0aXZlKQogCQlyZXR1cm47CiAKKwlpbnRlbF9jcnRjX2Rpc2FibGVfcGxhbmVzKGNydGMpOworCiAJZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikKIAkJZW5jb2Rlci0+ZGlzYWJsZShlbmNvZGVyKTsKIAotCWludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhjcnRjKTsKLQlkcm1fdmJsYW5rX29mZihkZXYsIHBpcGUpOwotCi0JaWYgKGRldl9wcml2LT5mYmMucGxhbmUgPT0gcGxhbmUpCi0JCWludGVsX2Rpc2FibGVfZmJjKGRldik7Ci0KLQlpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3IoY3J0YywgZmFsc2UpOwotCWludGVsX2Rpc2FibGVfcGxhbmVzKGNydGMpOwotCWludGVsX2Rpc2FibGVfcHJpbWFyeV9od19wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOwotCiAJaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfcGNoX2VuY29kZXIpCiAJCWludGVsX3NldF9wY2hfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBmYWxzZSk7CiAKQEAgLTM5NTAsNiArNDE5MSw3IEBACiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOworCWludGVsX2VkcF9wc3JfdXBkYXRlKGRldik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKQEAgLTM5NjUsNyArNDIwNyw3IEBACiAJaWYgKCFpbnRlbF9jcnRjLT5hY3RpdmUpCiAJCXJldHVybjsKIAotCWhhc3dlbGxfY3J0Y19kaXNhYmxlX3BsYW5lcyhjcnRjKTsKKwlpbnRlbF9jcnRjX2Rpc2FibGVfcGxhbmVzKGNydGMpOwogCiAJZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikgewogCQlpbnRlbF9vcHJlZ2lvbl9ub3RpZnlfZW5jb2RlcihlbmNvZGVyLCBmYWxzZSk7CkBAIC0zOTk3LDYgKzQyMzksNyBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWludGVsX3VwZGF0ZV9mYmMoZGV2KTsKKwlpbnRlbF9lZHBfcHNyX3VwZGF0ZShkZXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCkBAIC00MDExLDQ4ICs0MjU0LDYgQEAKIAlpbnRlbF9kZGlfcHV0X2NydGNfcGxsKGNydGMpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2RwbXNfb3ZlcmxheShzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YywgYm9vbCBlbmFibGUpCi17Ci0JaWYgKCFlbmFibGUgJiYgaW50ZWxfY3J0Yy0+b3ZlcmxheSkgewotCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfY3J0Yy0+YmFzZS5kZXY7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IGZhbHNlOwotCQkodm9pZCkgaW50ZWxfb3ZlcmxheV9zd2l0Y2hfb2ZmKGludGVsX2NydGMtPm92ZXJsYXkpOwotCQlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IHRydWU7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCX0KLQotCS8qIExldCB1c2Vyc3BhY2Ugc3dpdGNoIHRoZSBvdmVybGF5IG9uIGFnYWluLiBJbiBtb3N0IGNhc2VzIHVzZXJzcGFjZQotCSAqIGhhcyB0byByZWNvbXB1dGUgd2hlcmUgdG8gcHV0IGl0IGFueXdheS4KLQkgKi8KLX0KLQotLyoqCi0gKiBpOXh4X2ZpeHVwX3BsYW5lIC0gdWdseSB3b3JrYXJvdW5kIGZvciBHNDUgdG8gZmlyZSB1cCB0aGUgaGFyZHdhcmUKLSAqIGN1cnNvciBwbGFuZSBicmllZmx5IGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcgYWZ0ZXIgZW5hYmxpbmcgdGhlIGRpc3BsYXkKLSAqIHBsYW5lLgotICogVGhpcyB3b3JrYXJvdW5kIGF2b2lkcyBvY2Nhc2lvbmFsIGJsYW5rIHNjcmVlbnMgd2hlbiBzZWxmIHJlZnJlc2ggaXMKLSAqIGVuYWJsZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1nNHhfZml4dXBfcGxhbmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBlbnVtIHBpcGUgcGlwZSkKLXsKLQl1MzIgY250bCA9IEk5MTVfUkVBRChDVVJDTlRSKHBpcGUpKTsKLQotCWlmICgoY250bCAmIENVUlNPUl9NT0RFKSA9PSAwKSB7Ci0JCXUzMiBmd19iY2xfc2VsZiA9IEk5MTVfUkVBRChGV19CTENfU0VMRik7Ci0KLQkJSTkxNV9XUklURShGV19CTENfU0VMRiwgZndfYmNsX3NlbGYgJiB+RldfQkxDX1NFTEZfRU4pOwotCQlJOTE1X1dSSVRFKENVUkNOVFIocGlwZSksIENVUlNPUl9NT0RFXzY0X0FSR0JfQVgpOwotCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2X3ByaXYtPmRldiwgcGlwZSk7Ci0JCUk5MTVfV1JJVEUoQ1VSQ05UUihwaXBlKSwgY250bCk7Ci0JCUk5MTVfV1JJVEUoQ1VSQkFTRShwaXBlKSwgSTkxNV9SRUFEKENVUkJBU0UocGlwZSkpKTsKLQkJSTkxNV9XUklURShGV19CTENfU0VMRiwgZndfYmNsX3NlbGYpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgaTl4eF9wZml0X2VuYWJsZShzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7CkBAIC00MTY0LDcgKzQzNjUsNyBAQAogCSAqIEZpcnN0IGdldCBhbGwgbmVlZGVkIHBvd2VyIGRvbWFpbnMsIHRoZW4gcHV0IGFsbCB1bm5lZWRlZCwgdG8gYXZvaWQKIAkgKiBhbnkgdW5uZWNlc3NhcnkgdG9nZ2xpbmcgb2YgdGhlIHBvd2VyIHdlbGxzLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQllbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIGRvbWFpbjsKIAogCQlpZiAoIWNydGMtPmJhc2UuZW5hYmxlZCkKQEAgLTQxNzYsNyArNDM3Nyw3IEBACiAJCQlpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChkZXZfcHJpdiwgZG9tYWluKTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBkb21haW47CiAKIAkJZm9yX2VhY2hfcG93ZXJfZG9tYWluKGRvbWFpbiwgY3J0Yy0+ZW5hYmxlZF9wb3dlcl9kb21haW5zKQpAQCAtNDIwNyw2ICs0NDA4LDkgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiB2YWwsIGNtZDsKIAorCVdBUk5fT04odmFsbGV5dmlld19jdXJfY2RjbGsoZGV2X3ByaXYpICE9IGRldl9wcml2LT52bHZfY2RjbGtfZnJlcSk7CisJZGV2X3ByaXYtPnZsdl9jZGNsa19mcmVxID0gY2RjbGs7CisKIAlpZiAoY2RjbGsgPj0gMzIwKSAvKiBqdW1wIHRvIGhpZ2hlc3Qgdm9sdGFnZSBmb3IgNDAwTUh6IHRvbyAqLwogCQljbWQgPSAyOwogCWVsc2UgaWYgKGNkY2xrID09IDI2NikKQEAgLTQyNjEsNyArNDQ2NSw3IEBACiAJaW50ZWxfaTJjX3Jlc2V0KGRldik7CiB9CiAKLXN0YXRpYyBpbnQgdmFsbGV5dmlld19jdXJfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoraW50IHZhbGxleXZpZXdfY3VyX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKIAlpbnQgY3VyX2NkY2xrLCB2Y287CiAJaW50IGRpdmlkZXI7CkBAIC00MjgyLDEwICs0NDg2LDYgQEAKIHN0YXRpYyBpbnQgdmFsbGV5dmlld19jYWxjX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgaW50IG1heF9waXhjbGspCiB7Ci0JaW50IGN1cl9jZGNsazsKLQotCWN1cl9jZGNsayA9IHZhbGxleXZpZXdfY3VyX2NkY2xrKGRldl9wcml2KTsKLQogCS8qCiAJICogUmVhbGx5IG9ubHkgYSBmZXcgY2FzZXMgdG8gZGVhbCB3aXRoLCBhcyBvbmx5IDQgQ0RjbGtzIGFyZSBzdXBwb3J0ZWQ6CiAJICogICAyMDBNSHoKQEAgLTQzMTEsOCArNDUxMSw3IEBACiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CiAJaW50IG1heF9waXhjbGsgPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlbF9jcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCi0JCQkgICAgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGludGVsX2NydGMpIHsKIAkJaWYgKGludGVsX2NydGMtPm5ld19lbmFibGVkKQogCQkJbWF4X3BpeGNsayA9IG1heChtYXhfcGl4Y2xrLAogCQkJCQkgaW50ZWxfY3J0Yy0+bmV3X2NvbmZpZy0+YWRqdXN0ZWRfbW9kZS5jcnRjX2Nsb2NrKTsKQEAgLTQzMjcsMTQgKzQ1MjYsMTMgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOwogCWludCBtYXhfcGl4Y2xrID0gaW50ZWxfbW9kZV9tYXhfcGl4Y2xrKGRldl9wcml2KTsKLQlpbnQgY3VyX2NkY2xrID0gdmFsbGV5dmlld19jdXJfY2RjbGsoZGV2X3ByaXYpOwogCi0JaWYgKHZhbGxleXZpZXdfY2FsY19jZGNsayhkZXZfcHJpdiwgbWF4X3BpeGNsaykgPT0gY3VyX2NkY2xrKQorCWlmICh2YWxsZXl2aWV3X2NhbGNfY2RjbGsoZGV2X3ByaXYsIG1heF9waXhjbGspID09CisJICAgIGRldl9wcml2LT52bHZfY2RjbGtfZnJlcSkKIAkJcmV0dXJuOwogCiAJLyogZGlzYWJsZS9lbmFibGUgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGlwZXMgd2hpbGUgd2UgY2hhbmdlIGNkY2xrICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlbF9jcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCi0JCQkgICAgYmFzZS5oZWFkKQorCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBpbnRlbF9jcnRjKQogCQlpZiAoaW50ZWxfY3J0Yy0+YmFzZS5lbmFibGVkKQogCQkJKnByZXBhcmVfcGlwZXMgfD0gKDEgPDwgaW50ZWxfY3J0Yy0+cGlwZSk7CiB9CkBAIC00MzQzLDEwICs0NTQxLDkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBtYXhfcGl4Y2xrID0gaW50ZWxfbW9kZV9tYXhfcGl4Y2xrKGRldl9wcml2KTsKLQlpbnQgY3VyX2NkY2xrID0gdmFsbGV5dmlld19jdXJfY2RjbGsoZGV2X3ByaXYpOwogCWludCByZXFfY2RjbGsgPSB2YWxsZXl2aWV3X2NhbGNfY2RjbGsoZGV2X3ByaXYsIG1heF9waXhjbGspOwogCi0JaWYgKHJlcV9jZGNsayAhPSBjdXJfY2RjbGspCisJaWYgKHJlcV9jZGNsayAhPSBkZXZfcHJpdi0+dmx2X2NkY2xrX2ZyZXEpCiAJCXZhbGxleXZpZXdfc2V0X2NkY2xrKGRldiwgcmVxX2NkY2xrKTsKIAltb2Rlc2V0X3VwZGF0ZV9jcnRjX3Bvd2VyX2RvbWFpbnMoZGV2KTsKIH0KQEAgLTQzNjAsMjIgKzQ1NTcsNTUgQEAKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CiAJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJYm9vbCBpc19kc2k7CisJdTMyIGRzcGNudHI7CiAKIAlXQVJOX09OKCFjcnRjLT5lbmFibGVkKTsKIAogCWlmIChpbnRlbF9jcnRjLT5hY3RpdmUpCiAJCXJldHVybjsKIAorCXZsdl9wcmVwYXJlX3BsbChpbnRlbF9jcnRjKTsKKworCS8qIFNldCB1cCB0aGUgZGlzcGxheSBwbGFuZSByZWdpc3RlciAqLworCWRzcGNudHIgPSBESVNQUExBTkVfR0FNTUFfRU5BQkxFOworCisJaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfZHBfZW5jb2RlcikKKwkJaW50ZWxfZHBfc2V0X21fbihpbnRlbF9jcnRjKTsKKworCWludGVsX3NldF9waXBlX3RpbWluZ3MoaW50ZWxfY3J0Yyk7CisKKwkvKiBwaXBlc3JjIGFuZCBkc3BzaXplIGNvbnRyb2wgdGhlIHNpemUgdGhhdCBpcyBzY2FsZWQgZnJvbSwKKwkgKiB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNpemUuCisJICovCisJSTkxNV9XUklURShEU1BTSVpFKHBsYW5lKSwKKwkJICAgKChpbnRlbF9jcnRjLT5jb25maWcucGlwZV9zcmNfaCAtIDEpIDw8IDE2KSB8CisJCSAgIChpbnRlbF9jcnRjLT5jb25maWcucGlwZV9zcmNfdyAtIDEpKTsKKwlJOTE1X1dSSVRFKERTUFBPUyhwbGFuZSksIDApOworCisJaTl4eF9zZXRfcGlwZWNvbmYoaW50ZWxfY3J0Yyk7CisKKwlJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBkc3BjbnRyKTsKKwlQT1NUSU5HX1JFQUQoRFNQQ05UUihwbGFuZSkpOworCisJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3ByaW1hcnlfcGxhbmUoY3J0YywgY3J0Yy0+cHJpbWFyeS0+ZmIsCisJCQkJCSAgICAgICBjcnRjLT54LCBjcnRjLT55KTsKKwogCWludGVsX2NydGMtPmFjdGl2ZSA9IHRydWU7CiAKKwlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgdHJ1ZSk7CisKIAlmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoZGV2LCBjcnRjLCBlbmNvZGVyKQogCQlpZiAoZW5jb2Rlci0+cHJlX3BsbF9lbmFibGUpCiAJCQllbmNvZGVyLT5wcmVfcGxsX2VuYWJsZShlbmNvZGVyKTsKIAogCWlzX2RzaSA9IGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0RTSSk7CiAKLQlpZiAoIWlzX2RzaSkKLQkJdmx2X2VuYWJsZV9wbGwoaW50ZWxfY3J0Yyk7CisJaWYgKCFpc19kc2kpIHsKKwkJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJCWNodl9lbmFibGVfcGxsKGludGVsX2NydGMpOworCQllbHNlCisJCQl2bHZfZW5hYmxlX3BsbChpbnRlbF9jcnRjKTsKKwl9CiAKIAlmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoZGV2LCBjcnRjLCBlbmNvZGVyKQogCQlpZiAoZW5jb2Rlci0+cHJlX2VuYWJsZSkKQEAgLTQzODcsMTUgKzQ2MTcsMjUgQEAKIAogCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGNydGMpOwogCWludGVsX2VuYWJsZV9waXBlKGludGVsX2NydGMpOwotCWludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCB0cnVlKTsKLQlpbnRlbF9lbmFibGVfcHJpbWFyeV9od19wbGFuZShkZXZfcHJpdiwgcGxhbmUsIHBpcGUpOwotCWludGVsX2VuYWJsZV9wbGFuZXMoY3J0Yyk7Ci0JaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKGNydGMsIHRydWUpOwotCi0JaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOwogCiAJZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikKIAkJZW5jb2Rlci0+ZW5hYmxlKGVuY29kZXIpOworCisJaW50ZWxfY3J0Y19lbmFibGVfcGxhbmVzKGNydGMpOworCisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworCisJLyogVW5kZXJydW5zIGRvbid0IHJhaXNlIGludGVycnVwdHMsIHNvIGNoZWNrIG1hbnVhbGx5LiAqLworCWk5eHhfY2hlY2tfZmlmb191bmRlcnJ1bnMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaTl4eF9zZXRfcGxsX2RpdmlkZXJzKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJSTkxNV9XUklURShGUDAoY3J0Yy0+cGlwZSksIGNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLmZwMCk7CisJSTkxNV9XUklURShGUDEoY3J0Yy0+cGlwZSksIGNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLmZwMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGk5eHhfY3J0Y19lbmFibGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQpAQCAtNDQwNiwxNCArNDY0Niw0OSBAQAogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKKwl1MzIgZHNwY250cjsKIAogCVdBUk5fT04oIWNydGMtPmVuYWJsZWQpOwogCiAJaWYgKGludGVsX2NydGMtPmFjdGl2ZSkKIAkJcmV0dXJuOwogCisJaTl4eF9zZXRfcGxsX2RpdmlkZXJzKGludGVsX2NydGMpOworCisJLyogU2V0IHVwIHRoZSBkaXNwbGF5IHBsYW5lIHJlZ2lzdGVyICovCisJZHNwY250ciA9IERJU1BQTEFORV9HQU1NQV9FTkFCTEU7CisKKwlpZiAocGlwZSA9PSAwKQorCQlkc3BjbnRyICY9IH5ESVNQUExBTkVfU0VMX1BJUEVfTUFTSzsKKwllbHNlCisJCWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0I7CisKKwlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19kcF9lbmNvZGVyKQorCQlpbnRlbF9kcF9zZXRfbV9uKGludGVsX2NydGMpOworCisJaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRjKTsKKworCS8qIHBpcGVzcmMgYW5kIGRzcHNpemUgY29udHJvbCB0aGUgc2l6ZSB0aGF0IGlzIHNjYWxlZCBmcm9tLAorCSAqIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgdGhlIHVzZXIncyByZXF1ZXN0ZWQgc2l6ZS4KKwkgKi8KKwlJOTE1X1dSSVRFKERTUFNJWkUocGxhbmUpLAorCQkgICAoKGludGVsX2NydGMtPmNvbmZpZy5waXBlX3NyY19oIC0gMSkgPDwgMTYpIHwKKwkJICAgKGludGVsX2NydGMtPmNvbmZpZy5waXBlX3NyY193IC0gMSkpOworCUk5MTVfV1JJVEUoRFNQUE9TKHBsYW5lKSwgMCk7CisKKwlpOXh4X3NldF9waXBlY29uZihpbnRlbF9jcnRjKTsKKworCUk5MTVfV1JJVEUoRFNQQ05UUihwbGFuZSksIGRzcGNudHIpOworCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7CisKKwlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfcHJpbWFyeV9wbGFuZShjcnRjLCBjcnRjLT5wcmltYXJ5LT5mYiwKKwkJCQkJICAgICAgIGNydGMtPngsIGNydGMtPnkpOworCiAJaW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsKIAorCWlmICghSVNfR0VOMihkZXYpKQorCQlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgdHJ1ZSk7CisKIAlmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoZGV2LCBjcnRjLCBlbmNvZGVyKQogCQlpZiAoZW5jb2Rlci0+cHJlX2VuYWJsZSkKIAkJCWVuY29kZXItPnByZV9lbmFibGUoZW5jb2Rlcik7CkBAIC00NDI2LDIxICs0NzAxLDI2IEBACiAKIAlpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhjcnRjKTsKIAlpbnRlbF9lbmFibGVfcGlwZShpbnRlbF9jcnRjKTsKLQlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgdHJ1ZSk7Ci0JaW50ZWxfZW5hYmxlX3ByaW1hcnlfaHdfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKLQlpbnRlbF9lbmFibGVfcGxhbmVzKGNydGMpOwotCS8qIFRoZSBmaXh1cCBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIGN1cnNvciBpcyBlbmFibGVkICovCi0JaWYgKElTX0c0WChkZXYpKQotCQlnNHhfZml4dXBfcGxhbmUoZGV2X3ByaXYsIHBpcGUpOwotCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjLCB0cnVlKTsKLQotCS8qIEdpdmUgdGhlIG92ZXJsYXkgc2NhbGVyIGEgY2hhbmNlIHRvIGVuYWJsZSBpZiBpdCdzIG9uIHRoaXMgcGlwZSAqLwotCWludGVsX2NydGNfZHBtc19vdmVybGF5KGludGVsX2NydGMsIHRydWUpOwotCi0JaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOwogCiAJZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikKIAkJZW5jb2Rlci0+ZW5hYmxlKGVuY29kZXIpOworCisJaW50ZWxfY3J0Y19lbmFibGVfcGxhbmVzKGNydGMpOworCisJLyoKKwkgKiBHZW4yIHJlcG9ydHMgcGlwZSB1bmRlcnJ1bnMgd2hlbmV2ZXIgYWxsIHBsYW5lcyBhcmUgZGlzYWJsZWQuCisJICogU28gZG9uJ3QgZW5hYmxlIHVuZGVycnVuIHJlcG9ydGluZyBiZWZvcmUgYXQgbGVhc3Qgc29tZSBwbGFuZXMKKwkgKiBhcmUgZW5hYmxlZC4KKwkgKiBGSVhNRTogTmVlZCB0byBmaXggdGhlIGxvZ2ljIHRvIHdvcmsgd2hlbiB3ZSB0dXJuIG9mZiBhbGwgcGxhbmVzCisJICogYnV0IGxlYXZlIHRoZSBwaXBlIHJ1bm5pbmcuCisJICovCisJaWYgKElTX0dFTjIoZGV2KSkKKwkJaW50ZWxfc2V0X2NwdV9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhkZXYsIHBpcGUsIHRydWUpOworCisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworCisJLyogVW5kZXJydW5zIGRvbid0IHJhaXNlIGludGVycnVwdHMsIHNvIGNoZWNrIG1hbnVhbGx5LiAqLworCWk5eHhfY2hlY2tfZmlmb191bmRlcnJ1bnMoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaTl4eF9wZml0X2Rpc2FibGUoc3RydWN0IGludGVsX2NydGMgKmNydGMpCkBAIC00NDY1LDI3ICs0NzQ1LDMxIEBACiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAogCWlmICghaW50ZWxfY3J0Yy0+YWN0aXZlKQogCQlyZXR1cm47CiAKKwkvKgorCSAqIEdlbjIgcmVwb3J0cyBwaXBlIHVuZGVycnVucyB3aGVuZXZlciBhbGwgcGxhbmVzIGFyZSBkaXNhYmxlZC4KKwkgKiBTbyBkaWFzYmxlIHVuZGVycnVuIHJlcG9ydGluZyBiZWZvcmUgYWxsIHRoZSBwbGFuZXMgZ2V0IGRpc2FibGVkLgorCSAqIEZJWE1FOiBOZWVkIHRvIGZpeCB0aGUgbG9naWMgdG8gd29yayB3aGVuIHdlIHR1cm4gb2ZmIGFsbCBwbGFuZXMKKwkgKiBidXQgbGVhdmUgdGhlIHBpcGUgcnVubmluZy4KKwkgKi8KKwlpZiAoSVNfR0VOMihkZXYpKQorCQlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgZmFsc2UpOworCisJaW50ZWxfY3J0Y19kaXNhYmxlX3BsYW5lcyhjcnRjKTsKKwogCWZvcl9lYWNoX2VuY29kZXJfb25fY3J0YyhkZXYsIGNydGMsIGVuY29kZXIpCiAJCWVuY29kZXItPmRpc2FibGUoZW5jb2Rlcik7CiAKLQkvKiBHaXZlIHRoZSBvdmVybGF5IHNjYWxlciBhIGNoYW5jZSB0byBkaXNhYmxlIGlmIGl0J3Mgb24gdGhpcyBwaXBlICovCi0JaW50ZWxfY3J0Y193YWl0X2Zvcl9wZW5kaW5nX2ZsaXBzKGNydGMpOwotCWRybV92Ymxhbmtfb2ZmKGRldiwgcGlwZSk7CisJLyoKKwkgKiBPbiBnZW4yIHBsYW5lcyBhcmUgZG91YmxlIGJ1ZmZlcmVkIGJ1dCB0aGUgcGlwZSBpc24ndCwgc28gd2UgbXVzdAorCSAqIHdhaXQgZm9yIHBsYW5lcyB0byBmdWxseSB0dXJuIG9mZiBiZWZvcmUgZGlzYWJsaW5nIHRoZSBwaXBlLgorCSAqLworCWlmIChJU19HRU4yKGRldikpCisJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIHBpcGUpOwogCi0JaWYgKGRldl9wcml2LT5mYmMucGxhbmUgPT0gcGxhbmUpCi0JCWludGVsX2Rpc2FibGVfZmJjKGRldik7Ci0KLQlpbnRlbF9jcnRjX2RwbXNfb3ZlcmxheShpbnRlbF9jcnRjLCBmYWxzZSk7Ci0JaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKGNydGMsIGZhbHNlKTsKLQlpbnRlbF9kaXNhYmxlX3BsYW5lcyhjcnRjKTsKLQlpbnRlbF9kaXNhYmxlX3ByaW1hcnlfaHdfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKLQotCWludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBmYWxzZSk7CiAJaW50ZWxfZGlzYWJsZV9waXBlKGRldl9wcml2LCBwaXBlKTsKIAogCWk5eHhfcGZpdF9kaXNhYmxlKGludGVsX2NydGMpOwpAQCAtNDQ5NCwxNSArNDc3OCwyNSBAQAogCQlpZiAoZW5jb2Rlci0+cG9zdF9kaXNhYmxlKQogCQkJZW5jb2Rlci0+cG9zdF9kaXNhYmxlKGVuY29kZXIpOwogCi0JaWYgKElTX1ZBTExFWVZJRVcoZGV2KSAmJiAhaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfRFNJKSkKLQkJdmx2X2Rpc2FibGVfcGxsKGRldl9wcml2LCBwaXBlKTsKLQllbHNlIGlmICghSVNfVkFMTEVZVklFVyhkZXYpKQotCQlpOXh4X2Rpc2FibGVfcGxsKGRldl9wcml2LCBwaXBlKTsKKwlpZiAoIWludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0RTSSkpIHsKKwkJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJCWNodl9kaXNhYmxlX3BsbChkZXZfcHJpdiwgcGlwZSk7CisJCWVsc2UgaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkKKwkJCXZsdl9kaXNhYmxlX3BsbChkZXZfcHJpdiwgcGlwZSk7CisJCWVsc2UKKwkJCWk5eHhfZGlzYWJsZV9wbGwoZGV2X3ByaXYsIHBpcGUpOworCX0KKworCWlmICghSVNfR0VOMihkZXYpKQorCQlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldiwgcGlwZSwgZmFsc2UpOwogCiAJaW50ZWxfY3J0Yy0+YWN0aXZlID0gZmFsc2U7CiAJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoY3J0Yyk7CiAKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOworCWludGVsX2VkcF9wc3JfdXBkYXRlKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIGk5eHhfY3J0Y19vZmYoc3RydWN0IGRybV9jcnRjICpjcnRjKQpAQCAtNDU2NSwxMyArNDg1OSwxMSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAogCS8qIGNydGMgc2hvdWxkIHN0aWxsIGJlIGVuYWJsZWQgd2hlbiB3ZSBkaXNhYmxlIGl0LiAqLwogCVdBUk5fT04oIWNydGMtPmVuYWJsZWQpOwogCiAJZGV2X3ByaXYtPmRpc3BsYXkuY3J0Y19kaXNhYmxlKGNydGMpOwotCWludGVsX2NydGMtPmVsZF92bGQgPSBmYWxzZTsKIAlpbnRlbF9jcnRjX3VwZGF0ZV9zYXJlYShjcnRjLCBmYWxzZSk7CiAJZGV2X3ByaXYtPmRpc3BsYXkub2ZmKGNydGMpOwogCkBAIC00NjM1LDcgKzQ5MjcsNyBAQAogCiAJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdXG4iLAogCQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmJhc2UuaWQsCi0JCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZjb25uZWN0b3ItPmJhc2UpKTsKKwkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5uYW1lKTsKIAogCQlXQVJOKGNvbm5lY3Rvci0+YmFzZS5kcG1zID09IERSTV9NT0RFX0RQTVNfT0ZGLAogCQkgICAgICJ3cm9uZyBjb25uZWN0b3IgZHBtcyBzdGF0ZVxuIik7CkBAIC01MDM5LDggKzUzMzEsNiBAQAogCQkJCSAgICAgaW50ZWxfY2xvY2tfdCAqcmVkdWNlZF9jbG9jaykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcGlwZSA9IGNydGMtPnBpcGU7CiAJdTMyIGZwLCBmcDIgPSAwOwogCiAJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKQEAgLTUwNTMsMTcgKzUzNDMsMTQgQEAKIAkJCWZwMiA9IGk5eHhfZHBsbF9jb21wdXRlX2ZwKHJlZHVjZWRfY2xvY2spOwogCX0KIAotCUk5MTVfV1JJVEUoRlAwKHBpcGUpLCBmcCk7CiAJY3J0Yy0+Y29uZmlnLmRwbGxfaHdfc3RhdGUuZnAwID0gZnA7CiAKIAljcnRjLT5sb3dmcmVxX2F2YWlsID0gZmFsc2U7CiAJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoJmNydGMtPmJhc2UsIElOVEVMX09VVFBVVF9MVkRTKSAmJgogCSAgICByZWR1Y2VkX2Nsb2NrICYmIGk5MTUucG93ZXJzYXZlKSB7Ci0JCUk5MTVfV1JJVEUoRlAxKHBpcGUpLCBmcDIpOwogCQljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5mcDEgPSBmcDI7CiAJCWNydGMtPmxvd2ZyZXFfYXZhaWwgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCUk5MTVfV1JJVEUoRlAxKHBpcGUpLCBmcCk7CiAJCWNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLmZwMSA9IGZwOwogCX0KIH0KQEAgLTUxNDEsMTIgKzU0MjgsMzQgQEAKIAogc3RhdGljIHZvaWQgdmx2X3VwZGF0ZV9wbGwoc3RydWN0IGludGVsX2NydGMgKmNydGMpCiB7CisJdTMyIGRwbGwsIGRwbGxfbWQ7CisKKwkvKgorCSAqIEVuYWJsZSBEUElPIGNsb2NrIGlucHV0LiBXZSBzaG91bGQgbmV2ZXIgZGlzYWJsZSB0aGUgcmVmZXJlbmNlCisJICogY2xvY2sgZm9yIHBpcGUgQiwgc2luY2UgVkdBIGhvdHBsdWcgLyBtYW51YWwgZGV0ZWN0aW9uIGRlcGVuZHMKKwkgKiBvbiBpdC4KKwkgKi8KKwlkcGxsID0gRFBMTF9FWFRfQlVGRkVSX0VOQUJMRV9WTFYgfCBEUExMX1JFRkFfQ0xLX0VOQUJMRV9WTFYgfAorCQlEUExMX1ZHQV9NT0RFX0RJUyB8IERQTExfSU5URUdSQVRFRF9DTE9DS19WTFY7CisJLyogV2Ugc2hvdWxkIG5ldmVyIGRpc2FibGUgdGhpcywgc2V0IGl0IGhlcmUgZm9yIHN0YXRlIHRyYWNraW5nICovCisJaWYgKGNydGMtPnBpcGUgPT0gUElQRV9CKQorCQlkcGxsIHw9IERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMVjsKKwlkcGxsIHw9IERQTExfVkNPX0VOQUJMRTsKKwljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsID0gZHBsbDsKKworCWRwbGxfbWQgPSAoY3J0Yy0+Y29uZmlnLnBpeGVsX211bHRpcGxpZXIgLSAxKQorCQk8PCBEUExMX01EX1VESV9NVUxUSVBMSUVSX1NISUZUOworCWNydGMtPmNvbmZpZy5kcGxsX2h3X3N0YXRlLmRwbGxfbWQgPSBkcGxsX21kOworfQorCitzdGF0aWMgdm9pZCB2bHZfcHJlcGFyZV9wbGwoc3RydWN0IGludGVsX2NydGMgKmNydGMpCit7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBpcGUgPSBjcnRjLT5waXBlOwotCXUzMiBkcGxsLCBtZGl2OworCXUzMiBtZGl2OwogCXUzMiBiZXN0biwgYmVzdG0xLCBiZXN0bTIsIGJlc3RwMSwgYmVzdHAyOwotCXUzMiBjb3JlY2xrLCByZWdfdmFsLCBkcGxsX21kOworCXUzMiBjb3JlY2xrLCByZWdfdmFsOwogCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CiAKQEAgLTUxNTksNyArNTQ2OCw3IEBACiAJLyogU2VlIGVEUCBIRE1JIERQSU8gZHJpdmVyIHZiaW9zIG5vdGVzIGRvYyAqLwogCiAJLyogUExMIEIgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyAqLwotCWlmIChwaXBlKQorCWlmIChwaXBlID09IFBJUEVfQikKIAkJdmx2X3BsbGJfcmVjYWxfb3BhbXAoZGV2X3ByaXYsIHBpcGUpOwogCiAJLyogU2V0IHVwIFR4IHRhcmdldCBmb3IgcGVyaW9kaWMgUmNvbXAgdXBkYXRlICovCkBAIC01MjAzLDcgKzU1MTIsNyBAQAogCWlmIChpbnRlbF9waXBlX2hhc190eXBlKCZjcnRjLT5iYXNlLCBJTlRFTF9PVVRQVVRfRURQKSB8fAogCSAgICBpbnRlbF9waXBlX2hhc190eXBlKCZjcnRjLT5iYXNlLCBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQpKSB7CiAJCS8qIFVzZSBTU0Mgc291cmNlICovCi0JCWlmICghcGlwZSkKKwkJaWYgKHBpcGUgPT0gUElQRV9BKQogCQkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QTExfRFc1KHBpcGUpLAogCQkJCQkgMHgwZGY0MDAwMCk7CiAJCWVsc2UKQEAgLTUyMTEsNyArNTUyMCw3IEBACiAJCQkJCSAweDBkZjcwMDAwKTsKIAl9IGVsc2UgeyAvKiBIRE1JIG9yIFZHQSAqLwogCQkvKiBVc2UgYmVuZCBzb3VyY2UgKi8KLQkJaWYgKCFwaXBlKQorCQlpZiAocGlwZSA9PSBQSVBFX0EpCiAJCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzUocGlwZSksCiAJCQkJCSAweDBkZjcwMDAwKTsKIAkJZWxzZQpAQCAtNTIyNywyNiArNTUzNiw4NCBAQAogCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUExMX0RXNyhwaXBlKSwgY29yZWNsayk7CiAKIAl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BMTF9EVzExKHBpcGUpLCAweDg3ODcxMDAwKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjaHZfdXBkYXRlX3BsbChzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcGlwZSA9IGNydGMtPnBpcGU7CisJaW50IGRwbGxfcmVnID0gRFBMTChjcnRjLT5waXBlKTsKKwllbnVtIGRwaW9fY2hhbm5lbCBwb3J0ID0gdmx2X3BpcGVfdG9fY2hhbm5lbChwaXBlKTsKKwl1MzIgbG9vcGZpbHRlciwgaW50Y29lZmY7CisJdTMyIGJlc3RuLCBiZXN0bTEsIGJlc3RtMiwgYmVzdHAxLCBiZXN0cDIsIGJlc3RtMl9mcmFjOworCWludCByZWZjbGs7CisKKwljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsID0gRFBMTF9TU0NfUkVGX0NMT0NLX0NIViB8CisJCURQTExfUkVGQV9DTEtfRU5BQkxFX1ZMViB8IERQTExfVkdBX01PREVfRElTIHwKKwkJRFBMTF9WQ09fRU5BQkxFOworCWlmIChwaXBlICE9IFBJUEVfQSkKKwkJY3J0Yy0+Y29uZmlnLmRwbGxfaHdfc3RhdGUuZHBsbCB8PSBEUExMX0lOVEVHUkFURURfQ1JJX0NMS19WTFY7CisKKwljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsX21kID0KKwkJKGNydGMtPmNvbmZpZy5waXhlbF9tdWx0aXBsaWVyIC0gMSkgPDwgRFBMTF9NRF9VRElfTVVMVElQTElFUl9TSElGVDsKKworCWJlc3RuID0gY3J0Yy0+Y29uZmlnLmRwbGwubjsKKwliZXN0bTJfZnJhYyA9IGNydGMtPmNvbmZpZy5kcGxsLm0yICYgMHgzZmZmZmY7CisJYmVzdG0xID0gY3J0Yy0+Y29uZmlnLmRwbGwubTE7CisJYmVzdG0yID0gY3J0Yy0+Y29uZmlnLmRwbGwubTIgPj4gMjI7CisJYmVzdHAxID0gY3J0Yy0+Y29uZmlnLmRwbGwucDE7CisJYmVzdHAyID0gY3J0Yy0+Y29uZmlnLmRwbGwucDI7CiAKIAkvKgotCSAqIEVuYWJsZSBEUElPIGNsb2NrIGlucHV0LiBXZSBzaG91bGQgbmV2ZXIgZGlzYWJsZSB0aGUgcmVmZXJlbmNlCi0JICogY2xvY2sgZm9yIHBpcGUgQiwgc2luY2UgVkdBIGhvdHBsdWcgLyBtYW51YWwgZGV0ZWN0aW9uIGRlcGVuZHMKLQkgKiBvbiBpdC4KKwkgKiBFbmFibGUgUmVmY2xrIGFuZCBTU0MKIAkgKi8KLQlkcGxsID0gRFBMTF9FWFRfQlVGRkVSX0VOQUJMRV9WTFYgfCBEUExMX1JFRkFfQ0xLX0VOQUJMRV9WTFYgfAotCQlEUExMX1ZHQV9NT0RFX0RJUyB8IERQTExfSU5URUdSQVRFRF9DTE9DS19WTFY7Ci0JLyogV2Ugc2hvdWxkIG5ldmVyIGRpc2FibGUgdGhpcywgc2V0IGl0IGhlcmUgZm9yIHN0YXRlIHRyYWNraW5nICovCi0JaWYgKHBpcGUgPT0gUElQRV9CKQotCQlkcGxsIHw9IERQTExfSU5URUdSQVRFRF9DUklfQ0xLX1ZMVjsKLQlkcGxsIHw9IERQTExfVkNPX0VOQUJMRTsKLQljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsID0gZHBsbDsKKwlJOTE1X1dSSVRFKGRwbGxfcmVnLAorCQkgICBjcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsICYgfkRQTExfVkNPX0VOQUJMRSk7CiAKLQlkcGxsX21kID0gKGNydGMtPmNvbmZpZy5waXhlbF9tdWx0aXBsaWVyIC0gMSkKLQkJPDwgRFBMTF9NRF9VRElfTVVMVElQTElFUl9TSElGVDsKLQljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsX21kID0gZHBsbF9tZDsKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIAotCWlmIChjcnRjLT5jb25maWcuaGFzX2RwX2VuY29kZXIpCi0JCWludGVsX2RwX3NldF9tX24oY3J0Yyk7CisJLyogcDEgYW5kIHAyIGRpdmlkZXIgKi8KKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzEzKHBvcnQpLAorCQkJNSA8PCBEUElPX0NIVl9TMV9ESVZfU0hJRlQgfAorCQkJYmVzdHAxIDw8IERQSU9fQ0hWX1AxX0RJVl9TSElGVCB8CisJCQliZXN0cDIgPDwgRFBJT19DSFZfUDJfRElWX1NISUZUIHwKKwkJCTEgPDwgRFBJT19DSFZfS19ESVZfU0hJRlQpOworCisJLyogRmVlZGJhY2sgcG9zdC1kaXZpZGVyIC0gbTIgKi8KKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1BMTF9EVzAocG9ydCksIGJlc3RtMik7CisKKwkvKiBGZWVkYmFjayByZWZjbGsgZGl2aWRlciAtIG4gYW5kIG0xICovCisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9QTExfRFcxKHBvcnQpLAorCQkJRFBJT19DSFZfTTFfRElWX0JZXzIgfAorCQkJMSA8PCBEUElPX0NIVl9OX0RJVl9TSElGVCk7CisKKwkvKiBNMiBmcmFjdGlvbiBkaXZpc2lvbiAqLworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBDSFZfUExMX0RXMihwb3J0KSwgYmVzdG0yX2ZyYWMpOworCisJLyogTTIgZnJhY3Rpb24gZGl2aXNpb24gZW5hYmxlICovCisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9QTExfRFczKHBvcnQpLAorCQkgICAgICAgRFBJT19DSFZfRlJBQ19ESVZfRU4gfAorCQkgICAgICAgKDIgPDwgRFBJT19DSFZfRkVFREZXRF9HQUlOX1NISUZUKSk7CisKKwkvKiBMb29wIGZpbHRlciAqLworCXJlZmNsayA9IGk5eHhfZ2V0X3JlZmNsaygmY3J0Yy0+YmFzZSwgMCk7CisJbG9vcGZpbHRlciA9IDUgPDwgRFBJT19DSFZfUFJPUF9DT0VGRl9TSElGVCB8CisJCTIgPDwgRFBJT19DSFZfR0FJTl9DVFJMX1NISUZUOworCWlmIChyZWZjbGsgPT0gMTAwMDAwKQorCQlpbnRjb2VmZiA9IDExOworCWVsc2UgaWYgKHJlZmNsayA9PSAzODQwMCkKKwkJaW50Y29lZmYgPSAxMDsKKwllbHNlCisJCWludGNvZWZmID0gOTsKKwlsb29wZmlsdGVyIHw9IGludGNvZWZmIDw8IERQSU9fQ0hWX0lOVF9DT0VGRl9TSElGVDsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1BMTF9EVzYocG9ydCksIGxvb3BmaWx0ZXIpOworCisJLyogQUZDIFJlY2FsICovCisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9DTU5fRFcxNChwb3J0KSwKKwkJCXZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIENIVl9DTU5fRFcxNChwb3J0KSkgfAorCQkJRFBJT19BRkNfUkVDQUwpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KQEAgLTUzMjUsOSArNTY5Miw2IEBACiAJCQk8PCBEUExMX01EX1VESV9NVUxUSVBMSUVSX1NISUZUOwogCQljcnRjLT5jb25maWcuZHBsbF9od19zdGF0ZS5kcGxsX21kID0gZHBsbF9tZDsKIAl9Ci0KLQlpZiAoY3J0Yy0+Y29uZmlnLmhhc19kcF9lbmNvZGVyKQotCQlpbnRlbF9kcF9zZXRfbV9uKGNydGMpOwogfQogCiBzdGF0aWMgdm9pZCBpOHh4X3VwZGF0ZV9wbGwoc3RydWN0IGludGVsX2NydGMgKmNydGMsCkBAIC01NTY3LDE2ICs1OTMxLDEyIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0JaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJaW50IHJlZmNsaywgbnVtX2Nvbm5lY3RvcnMgPSAwOwogCWludGVsX2Nsb2NrX3QgY2xvY2ssIHJlZHVjZWRfY2xvY2s7Ci0JdTMyIGRzcGNudHI7CiAJYm9vbCBvaywgaGFzX3JlZHVjZWRfY2xvY2sgPSBmYWxzZTsKIAlib29sIGlzX2x2ZHMgPSBmYWxzZSwgaXNfZHNpID0gZmFsc2U7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7CiAJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQ7Ci0JaW50IHJldDsKIAogCWZvcl9lYWNoX2VuY29kZXJfb25fY3J0YyhkZXYsIGNydGMsIGVuY29kZXIpIHsKIAkJc3dpdGNoIChlbmNvZGVyLT50eXBlKSB7CkBAIC01NTkyLDcgKzU5NTIsNyBAQAogCX0KIAogCWlmIChpc19kc2kpCi0JCWdvdG8gc2tpcF9kcGxsOworCQlyZXR1cm4gMDsKIAogCWlmICghaW50ZWxfY3J0Yy0+Y29uZmlnLmNsb2NrX3NldCkgewogCQlyZWZjbGsgPSBpOXh4X2dldF9yZWZjbGsoY3J0YywgbnVtX2Nvbm5lY3RvcnMpOwpAQCAtNTYzNyw0MyArNTk5NywxNyBAQAogCQlpOHh4X3VwZGF0ZV9wbGwoaW50ZWxfY3J0YywKIAkJCQloYXNfcmVkdWNlZF9jbG9jayA/ICZyZWR1Y2VkX2Nsb2NrIDogTlVMTCwKIAkJCQludW1fY29ubmVjdG9ycyk7CisJfSBlbHNlIGlmIChJU19DSEVSUllWSUVXKGRldikpIHsKKwkJY2h2X3VwZGF0ZV9wbGwoaW50ZWxfY3J0Yyk7CiAJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJdmx2X3VwZGF0ZV9wbGwoaW50ZWxfY3J0Yyk7CiAJfSBlbHNlIHsKIAkJaTl4eF91cGRhdGVfcGxsKGludGVsX2NydGMsCiAJCQkJaGFzX3JlZHVjZWRfY2xvY2sgPyAmcmVkdWNlZF9jbG9jayA6IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25uZWN0b3JzKTsKKwkJCQludW1fY29ubmVjdG9ycyk7CiAJfQogCi1za2lwX2RwbGw6Ci0JLyogU2V0IHVwIHRoZSBkaXNwbGF5IHBsYW5lIHJlZ2lzdGVyICovCi0JZHNwY250ciA9IERJU1BQTEFORV9HQU1NQV9FTkFCTEU7Ci0KLQlpZiAoIUlTX1ZBTExFWVZJRVcoZGV2KSkgewotCQlpZiAocGlwZSA9PSAwKQotCQkJZHNwY250ciAmPSB+RElTUFBMQU5FX1NFTF9QSVBFX01BU0s7Ci0JCWVsc2UKLQkJCWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0I7Ci0JfQotCi0JaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRjKTsKLQotCS8qIHBpcGVzcmMgYW5kIGRzcHNpemUgY29udHJvbCB0aGUgc2l6ZSB0aGF0IGlzIHNjYWxlZCBmcm9tLAotCSAqIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgdGhlIHVzZXIncyByZXF1ZXN0ZWQgc2l6ZS4KLQkgKi8KLQlJOTE1X1dSSVRFKERTUFNJWkUocGxhbmUpLAotCQkgICAoKGludGVsX2NydGMtPmNvbmZpZy5waXBlX3NyY19oIC0gMSkgPDwgMTYpIHwKLQkJICAgKGludGVsX2NydGMtPmNvbmZpZy5waXBlX3NyY193IC0gMSkpOwotCUk5MTVfV1JJVEUoRFNQUE9TKHBsYW5lKSwgMCk7Ci0KLQlpOXh4X3NldF9waXBlY29uZihpbnRlbF9jcnRjKTsKLQotCUk5MTVfV1JJVEUoRFNQQ05UUihwbGFuZSksIGRzcGNudHIpOwotCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7Ci0KLQlyZXQgPSBpbnRlbF9waXBlX3NldF9iYXNlKGNydGMsIHgsIHksIGZiKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGk5eHhfZ2V0X3BmaXRfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLApAQCAtNTc5Myw2ICs2MTI3LDM2IEBACiAKIH0KIAorc3RhdGljIHZvaWQgY2h2X2NydGNfY2xvY2tfZ2V0KHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyAqcGlwZV9jb25maWcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHBpcGUgPSBwaXBlX2NvbmZpZy0+Y3B1X3RyYW5zY29kZXI7CisJZW51bSBkcGlvX2NoYW5uZWwgcG9ydCA9IHZsdl9waXBlX3RvX2NoYW5uZWwocGlwZSk7CisJaW50ZWxfY2xvY2tfdCBjbG9jazsKKwl1MzIgY21uX2R3MTMsIHBsbF9kdzAsIHBsbF9kdzEsIHBsbF9kdzI7CisJaW50IHJlZmNsayA9IDEwMDAwMDsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCWNtbl9kdzEzID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzEzKHBvcnQpKTsKKwlwbGxfZHcwID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX1BMTF9EVzAocG9ydCkpOworCXBsbF9kdzEgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBDSFZfUExMX0RXMShwb3J0KSk7CisJcGxsX2R3MiA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIENIVl9QTExfRFcyKHBvcnQpKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCisJY2xvY2subTEgPSAocGxsX2R3MSAmIDB4NykgPT0gRFBJT19DSFZfTTFfRElWX0JZXzIgPyAyIDogMDsKKwljbG9jay5tMiA9ICgocGxsX2R3MCAmIDB4ZmYpIDw8IDIyKSB8IChwbGxfZHcyICYgMHgzZmZmZmYpOworCWNsb2NrLm4gPSAocGxsX2R3MSA+PiBEUElPX0NIVl9OX0RJVl9TSElGVCkgJiAweGY7CisJY2xvY2sucDEgPSAoY21uX2R3MTMgPj4gRFBJT19DSFZfUDFfRElWX1NISUZUKSAmIDB4NzsKKwljbG9jay5wMiA9IChjbW5fZHcxMyA+PiBEUElPX0NIVl9QMl9ESVZfU0hJRlQpICYgMHgxZjsKKworCWNodl9jbG9jayhyZWZjbGssICZjbG9jayk7CisKKwkvKiBjbG9jay5kb3QgaXMgdGhlIGZhc3QgY2xvY2sgKi8KKwlwaXBlX2NvbmZpZy0+cG9ydF9jbG9jayA9IGNsb2NrLmRvdCAvIDU7Cit9CisKIHN0YXRpYyBib29sIGk5eHhfZ2V0X3BpcGVfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLAogCQkJCSBzdHJ1Y3QgaW50ZWxfY3J0Y19jb25maWcgKnBpcGVfY29uZmlnKQogewpAQCAtNTgyNyw2ICs2MTkxLDkgQEAKIAkJfQogCX0KIAorCWlmIChJU19WQUxMRVlWSUVXKGRldikgJiYgKHRtcCAmIFBJUEVDT05GX0NPTE9SX1JBTkdFX1NFTEVDVCkpCisJCXBpcGVfY29uZmlnLT5saW1pdGVkX2NvbG9yX3JhbmdlID0gdHJ1ZTsKKwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCiAJCXBpcGVfY29uZmlnLT5kb3VibGVfd2lkZSA9IHRtcCAmIFBJUEVDT05GX0RPVUJMRV9XSURFOwogCkBAIC01ODYyLDcgKzYyMjksOSBAQAogCQkJCQkJICAgICBEUExMX1BPUlRCX1JFQURZX01BU0spOwogCX0KIAotCWlmIChJU19WQUxMRVlWSUVXKGRldikpCisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJY2h2X2NydGNfY2xvY2tfZ2V0KGNydGMsIHBpcGVfY29uZmlnKTsKKwllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpCiAJCXZsdl9jcnRjX2Nsb2NrX2dldChjcnRjLCBwaXBlX2NvbmZpZyk7CiAJZWxzZQogCQlpOXh4X2NydGNfY2xvY2tfZ2V0KGNydGMsIHBpcGVfY29uZmlnKTsKQEAgLTU5ODMsOCArNjM1Miw3IEBACiAJCQlpZiAoaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgY2FuX3NzYykgewogCQkJCURSTV9ERUJVR19LTVMoIlVzaW5nIFNTQyBvbiBlRFBcbiIpOwogCQkJCXZhbCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX0RPV05TUFJFQUQ7Ci0JCQl9Ci0JCQllbHNlCisJCQl9IGVsc2UKIAkJCQl2YWwgfD0gRFJFRl9DUFVfU09VUkNFX09VVFBVVF9OT05TUFJFQUQ7CiAJCX0gZWxzZQogCQkJdmFsIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfRElTQUJMRTsKQEAgLTY1NjMsMTAgKzY5MzEsNyBAQAogCQkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0JaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJaW50IG51bV9jb25uZWN0b3JzID0gMDsKIAlpbnRlbF9jbG9ja190IGNsb2NrLCByZWR1Y2VkX2Nsb2NrOwogCXUzMiBkcGxsID0gMCwgZnAgPSAwLCBmcDIgPSAwOwpAQCAtNjU3NCw3ICs2OTM5LDYgQEAKIAlib29sIGlzX2x2ZHMgPSBmYWxzZTsKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3QgaW50ZWxfc2hhcmVkX2RwbGwgKnBsbDsKLQlpbnQgcmV0OwogCiAJZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikgewogCQlzd2l0Y2ggKGVuY29kZXItPnR5cGUpIHsKQEAgLTY2MjQsMzYgKzY5ODgsMTggQEAKIAkJcGxsID0gaW50ZWxfZ2V0X3NoYXJlZF9kcGxsKGludGVsX2NydGMpOwogCQlpZiAocGxsID09IE5VTEwpIHsKIAkJCURSTV9ERUJVR19EUklWRVIoImZhaWxlZCB0byBmaW5kIFBMTCBmb3IgcGlwZSAlY1xuIiwKLQkJCQkJIHBpcGVfbmFtZShwaXBlKSk7CisJCQkJCSBwaXBlX25hbWUoaW50ZWxfY3J0Yy0+cGlwZSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UKIAkJaW50ZWxfcHV0X3NoYXJlZF9kcGxsKGludGVsX2NydGMpOwogCi0JaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfZHBfZW5jb2RlcikKLQkJaW50ZWxfZHBfc2V0X21fbihpbnRlbF9jcnRjKTsKLQogCWlmIChpc19sdmRzICYmIGhhc19yZWR1Y2VkX2Nsb2NrICYmIGk5MTUucG93ZXJzYXZlKQogCQlpbnRlbF9jcnRjLT5sb3dmcmVxX2F2YWlsID0gdHJ1ZTsKIAllbHNlCiAJCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSBmYWxzZTsKIAotCWludGVsX3NldF9waXBlX3RpbWluZ3MoaW50ZWxfY3J0Yyk7Ci0KLQlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19wY2hfZW5jb2RlcikgewotCQlpbnRlbF9jcHVfdHJhbnNjb2Rlcl9zZXRfbV9uKGludGVsX2NydGMsCi0JCQkJCSAgICAgJmludGVsX2NydGMtPmNvbmZpZy5mZGlfbV9uKTsKLQl9Ci0KLQlpcm9ubGFrZV9zZXRfcGlwZWNvbmYoY3J0Yyk7Ci0KLQkvKiBTZXQgdXAgdGhlIGRpc3BsYXkgcGxhbmUgcmVnaXN0ZXIgKi8KLQlJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBESVNQUExBTkVfR0FNTUFfRU5BQkxFKTsKLQlQT1NUSU5HX1JFQUQoRFNQQ05UUihwbGFuZSkpOwotCi0JcmV0ID0gaW50ZWxfcGlwZV9zZXRfYmFzZShjcnRjLCB4LCB5LCBmYik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wY2hfdHJhbnNjb2Rlcl9nZXRfbV9uKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLApAQCAtNjgzMSw2ICs3MTc3LDkgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKHRtcCAmIFBJUEVDT05GX0NPTE9SX1JBTkdFX1NFTEVDVCkKKwkJcGlwZV9jb25maWctPmxpbWl0ZWRfY29sb3JfcmFuZ2UgPSB0cnVlOworCiAJaWYgKEk5MTVfUkVBRChQQ0hfVFJBTlNDT05GKGNydGMtPnBpcGUpKSAmIFRSQU5TX0VOQUJMRSkgewogCQlzdHJ1Y3QgaW50ZWxfc2hhcmVkX2RwbGwgKnBsbDsKIApAQCAtNjg4MCwxMCArNzIyOSw4IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJc3RydWN0IGludGVsX2RkaV9wbGxzICpwbGxzID0gJmRldl9wcml2LT5kZGlfcGxsczsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCXVpbnQzMl90IHZhbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpCisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpCiAJCVdBUk4oY3J0Yy0+YWN0aXZlLCAiQ1JUQyBmb3IgcGlwZSAlYyBlbmFibGVkXG4iLAogCQkgICAgIHBpcGVfbmFtZShjcnRjLT5waXBlKSk7CiAKQEAgLTY5MDIsMTQgKzcyNDksMjkgQEAKIAkgICAgICJVdGlsaXR5IHBpbiBlbmFibGVkXG4iKTsKIAlXQVJOKEk5MTVfUkVBRChQQ0hfR1RDX0NUTCkgJiBQQ0hfR1RDX0VOQUJMRSwgIlBDSCBHVEMgZW5hYmxlZFxuIik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7Ci0JdmFsID0gSTkxNV9SRUFEKERFSU1SKTsKLQlXQVJOKCh2YWwgfCBERV9QQ0hfRVZFTlRfSVZCKSAhPSAweGZmZmZmZmZmLAotCSAgICAgIlVuZXhwZWN0ZWQgREVJTVIgYml0cyBlbmFibGVkOiAweCV4XG4iLCB2YWwpOwotCXZhbCA9IEk5MTVfUkVBRChTREVJTVIpOwotCVdBUk4oKHZhbCB8IFNERV9IT1RQTFVHX01BU0tfQ1BUKSAhPSAweGZmZmZmZmZmLAotCSAgICAgIlVuZXhwZWN0ZWQgU0RFSU1SIGJpdHMgZW5hYmxlZDogMHgleFxuIiwgdmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKKwkvKgorCSAqIEluIHRoZW9yeSB3ZSBjYW4gc3RpbGwgbGVhdmUgSVJRcyBlbmFibGVkLCBhcyBsb25nIGFzIG9ubHkgdGhlIEhQRAorCSAqIGludGVycnVwdHMgcmVtYWluIGVuYWJsZWQuIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHRoYXQsIGJ1dCBzaW5jZSBpdCdzCisJICogZ2VuLXNwZWNpZmljIGFuZCBzaW5jZSB3ZSBvbmx5IGRpc2FibGUgTENQTEwgYWZ0ZXIgd2UgZnVsbHkgZGlzYWJsZQorCSAqIHRoZSBpbnRlcnJ1cHRzLCB0aGUgY2hlY2sgYmVsb3cgc2hvdWxkIGJlIGVub3VnaC4KKwkgKi8KKwlXQVJOKCFkZXZfcHJpdi0+cG0uaXJxc19kaXNhYmxlZCwgIklSUXMgZW5hYmxlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhzd193cml0ZV9kY29tcChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCWlmIChJU19IQVNXRUxMKGRldikpIHsKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwkJaWYgKHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LCBHRU42X1BDT0RFX1dSSVRFX0RfQ09NUCwKKwkJCQkJICAgIHZhbCkpCisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBkaXNhYmxlIERfQ09NUFxuIik7CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwl9IGVsc2UgeworCQlJOTE1X1dSSVRFKERfQ09NUCwgdmFsKTsKKwl9CisJUE9TVElOR19SRUFEKERfQ09NUCk7CiB9CiAKIC8qCkBAIC02OTQ5LDExICs3MzExLDcgQEAKIAogCXZhbCA9IEk5MTVfUkVBRChEX0NPTVApOwogCXZhbCB8PSBEX0NPTVBfQ09NUF9ESVNBQkxFOwotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JaWYgKHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LCBHRU42X1BDT0RFX1dSSVRFX0RfQ09NUCwgdmFsKSkKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZGlzYWJsZSBEX0NPTVBcbiIpOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlQT1NUSU5HX1JFQUQoRF9DT01QKTsKKwloc3dfd3JpdGVfZGNvbXAoZGV2X3ByaXYsIHZhbCk7CiAJbmRlbGF5KDEwMCk7CiAKIAlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChEX0NPTVApICYgRF9DT01QX1JDT01QX0lOX1BST0dSRVNTKSA9PSAwLCAxKSkKQEAgLTcwMDgsMTEgKzczNjYsNyBAQAogCXZhbCA9IEk5MTVfUkVBRChEX0NPTVApOwogCXZhbCB8PSBEX0NPTVBfQ09NUF9GT1JDRTsKIAl2YWwgJj0gfkRfQ09NUF9DT01QX0RJU0FCTEU7Ci0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlpZiAoc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsIEdFTjZfUENPREVfV1JJVEVfRF9DT01QLCB2YWwpKQotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBlbmFibGUgRF9DT01QXG4iKTsKLQltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JUE9TVElOR19SRUFEKERfQ09NUCk7CisJaHN3X3dyaXRlX2Rjb21wKGRldl9wcml2LCB2YWwpOwogCiAJdmFsID0gSTkxNV9SRUFEKExDUExMX0NUTCk7CiAJdmFsICY9IH5MQ1BMTF9QTExfRElTQUJMRTsKQEAgLTcwNjYsOCArNzQyMCw2IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJdWludDMyX3QgdmFsOwogCi0JV0FSTl9PTighSEFTX1BDOChkZXYpKTsKLQogCURSTV9ERUJVR19LTVMoIkVuYWJsaW5nIHBhY2thZ2UgQzgrXG4iKTsKIAogCWlmIChkZXZfcHJpdi0+cGNoX2lkID09IElOVEVMX1BDSF9MUFRfTFBfREVWSUNFX0lEX1RZUEUpIHsKQEAgLTcwNzcsNyArNzQyOSw2IEBACiAJfQogCiAJbHB0X2Rpc2FibGVfY2xrb3V0X2RwKGRldik7Ci0JaHN3X3J1bnRpbWVfcG1fZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CiAJaHN3X2Rpc2FibGVfbGNwbGwoZGV2X3ByaXYsIHRydWUsIHRydWUpOwogfQogCkBAIC03MDg2LDEyICs3NDM3LDkgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKIAl1aW50MzJfdCB2YWw7CiAKLQlXQVJOX09OKCFIQVNfUEM4KGRldikpOwotCiAJRFJNX0RFQlVHX0tNUygiRGlzYWJsaW5nIHBhY2thZ2UgQzgrXG4iKTsKIAogCWhzd19yZXN0b3JlX2xjcGxsKGRldl9wcml2KTsKLQloc3dfcnVudGltZV9wbV9yZXN0b3JlX2ludGVycnVwdHMoZGV2KTsKIAlscHRfaW5pdF9wY2hfcmVmY2xrKGRldik7CiAKIAlpZiAoZGV2X3ByaXYtPnBjaF9pZCA9PSBJTlRFTF9QQ0hfTFBUX0xQX0RFVklDRV9JRF9UWVBFKSB7CkBAIC03MTAxLDEwICs3NDQ5LDExIEBACiAJfQogCiAJaW50ZWxfcHJlcGFyZV9kZGkoZGV2KTsKLQlpOTE1X2dlbV9pbml0X3N3aXp6bGluZyhkZXYpOwotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JZ2VuNl91cGRhdGVfcmluZ19mcmVxKGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzbmJfbW9kZXNldF9nbG9iYWxfcmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbW9kZXNldF91cGRhdGVfY3J0Y19wb3dlcl9kb21haW5zKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGhhc3dlbGxfbW9kZXNldF9nbG9iYWxfcmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC03MTE2LDM5ICs3NDY1LDE1IEBACiAJCQkJIGludCB4LCBpbnQgeSwKIAkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKLQlpbnQgcmV0OwogCiAJaWYgKCFpbnRlbF9kZGlfcGxsX3NlbGVjdChpbnRlbF9jcnRjKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaW50ZWxfZGRpX3BsbF9lbmFibGUoaW50ZWxfY3J0Yyk7CiAKLQlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmhhc19kcF9lbmNvZGVyKQotCQlpbnRlbF9kcF9zZXRfbV9uKGludGVsX2NydGMpOwotCiAJaW50ZWxfY3J0Yy0+bG93ZnJlcV9hdmFpbCA9IGZhbHNlOwogCi0JaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRjKTsKLQotCWlmIChpbnRlbF9jcnRjLT5jb25maWcuaGFzX3BjaF9lbmNvZGVyKSB7Ci0JCWludGVsX2NwdV90cmFuc2NvZGVyX3NldF9tX24oaW50ZWxfY3J0YywKLQkJCQkJICAgICAmaW50ZWxfY3J0Yy0+Y29uZmlnLmZkaV9tX24pOwotCX0KLQotCWhhc3dlbGxfc2V0X3BpcGVjb25mKGNydGMpOwotCi0JaW50ZWxfc2V0X3BpcGVfY3NjKGNydGMpOwotCi0JLyogU2V0IHVwIHRoZSBkaXNwbGF5IHBsYW5lIHJlZ2lzdGVyICovCi0JSTkxNV9XUklURShEU1BDTlRSKHBsYW5lKSwgRElTUFBMQU5FX0dBTU1BX0VOQUJMRSB8IERJU1BQTEFORV9QSVBFX0NTQ19FTkFCTEUpOwotCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7Ci0KLQlyZXQgPSBpbnRlbF9waXBlX3NldF9iYXNlKGNydGMsIHgsIHksIGZiKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBib29sIGhhc3dlbGxfZ2V0X3BpcGVfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLApAQCAtNzIyOCwzOCArNzU1Myw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkgICAgICAgaW50IHgsIGludCB5LAotCQkJICAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKLQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmaW50ZWxfY3J0Yy0+Y29uZmlnLnJlcXVlc3RlZF9tb2RlOwotCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQlpbnQgcmV0OwotCi0JZHJtX3ZibGFua19wcmVfbW9kZXNldChkZXYsIHBpcGUpOwotCi0JcmV0ID0gZGV2X3ByaXYtPmRpc3BsYXkuY3J0Y19tb2RlX3NldChjcnRjLCB4LCB5LCBmYik7Ci0KLQlkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChkZXYsIHBpcGUpOwotCi0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKGRldiwgY3J0YywgZW5jb2RlcikgewotCQlEUk1fREVCVUdfS01TKCJbRU5DT0RFUjolZDolc10gc2V0IFtNT0RFOiVkOiVzXVxuIiwKLQkJCWVuY29kZXItPmJhc2UuYmFzZS5pZCwKLQkJCWRybV9nZXRfZW5jb2Rlcl9uYW1lKCZlbmNvZGVyLT5iYXNlKSwKLQkJCW1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUpOwotCQllbmNvZGVyLT5tb2RlX3NldChlbmNvZGVyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCB7CiAJaW50IGNsb2NrOwogCXUzMiBjb25maWc7CkBAIC03Mzc0LDggKzc2NjcsNiBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50OF90ICplbGQgPSBjb25uZWN0b3ItPmVsZDsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAl1aW50MzJfdCBlbGR2OwogCXVpbnQzMl90IGk7CiAJaW50IGxlbjsKQEAgLTczODcsMTcgKzc2NzgsMTQgQEAKIAlpbnQgYXVkX2NvbmZpZyA9IEhTV19BVURfQ0ZHKHBpcGUpOwogCWludCBhdWRfY250cmxfc3QyID0gSFNXX0FVRF9QSU5fRUxEX0NQX1ZMRDsKIAotCi0JRFJNX0RFQlVHX0RSSVZFUigiSERNSTogSGFzd2VsbCBBdWRpbyBpbml0aWFsaXplLi4uLlxuIik7Ci0KIAkvKiBBdWRpbyBvdXRwdXQgZW5hYmxlICovCiAJRFJNX0RFQlVHX0RSSVZFUigiSERNSSBhdWRpbzogZW5hYmxlIGNvZGVjXG4iKTsKIAl0bXAgPSBJOTE1X1JFQUQoYXVkX2NudHJsX3N0Mik7CiAJdG1wIHw9IChBVURJT19PVVRQVVRfRU5BQkxFX0EgPDwgKHBpcGUgKiA0KSk7CiAJSTkxNV9XUklURShhdWRfY250cmxfc3QyLCB0bXApOworCVBPU1RJTkdfUkVBRChhdWRfY250cmxfc3QyKTsKIAotCS8qIFdhaXQgZm9yIDEgdmVydGljYWwgYmxhbmsgKi8KLQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBwaXBlKTsKKwlhc3NlcnRfcGlwZV9kaXNhYmxlZChkZXZfcHJpdiwgdG9faW50ZWxfY3J0YyhjcnRjKS0+cGlwZSk7CiAKIAkvKiBTZXQgRUxEIHZhbGlkIHN0YXRlICovCiAJdG1wID0gSTkxNV9SRUFEKGF1ZF9jbnRybF9zdDIpOwpAQCAtNzQxNyw3ICs3NzA1LDYgQEAKIAlEUk1fREVCVUdfRFJJVkVSKCJFTEQgb24gcGlwZSAlY1xuIiwgcGlwZV9uYW1lKHBpcGUpKTsKIAogCWVsZHYgPSBBVURJT19FTERfVkFMSURfQSA8PCAocGlwZSAqIDQpOwotCWludGVsX2NydGMtPmVsZF92bGQgPSB0cnVlOwogCiAJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUKSkgewogCQlEUk1fREVCVUdfRFJJVkVSKCJFTEQ6IERpc3BsYXlQb3J0IGRldGVjdGVkXG4iKTsKQEAgLTc1NjQsOSArNzg1MSw5IEBACiAKIAlEUk1fREVCVUdfRFJJVkVSKCJFTEQgb24gW0NPTk5FQ1RPUjolZDolc10sIFtFTkNPREVSOiVkOiVzXVxuIiwKIAkJCSBjb25uZWN0b3ItPmJhc2UuaWQsCi0JCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkJIGNvbm5lY3Rvci0+bmFtZSwKIAkJCSBjb25uZWN0b3ItPmVuY29kZXItPmJhc2UuaWQsCi0JCQkgZHJtX2dldF9lbmNvZGVyX25hbWUoY29ubmVjdG9yLT5lbmNvZGVyKSk7CisJCQkgY29ubmVjdG9yLT5lbmNvZGVyLT5uYW1lKTsKIAogCWNvbm5lY3Rvci0+ZWxkWzZdID0gZHJtX2F2X3N5bmNfZGVsYXkoY29ubmVjdG9yLCBtb2RlKSAvIDI7CiAKQEAgLTc1NzksMjkgKzc4NjYsMzMgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwotCWJvb2wgdmlzaWJsZSA9IGJhc2UgIT0gMDsKLQl1MzIgY250bDsKKwl1aW50MzJfdCBjbnRsOwogCi0JaWYgKGludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlID09IHZpc2libGUpCi0JCXJldHVybjsKLQotCWNudGwgPSBJOTE1X1JFQUQoX0NVUkFDTlRSKTsKLQlpZiAodmlzaWJsZSkgeworCWlmIChiYXNlICE9IGludGVsX2NydGMtPmN1cnNvcl9iYXNlKSB7CiAJCS8qIE9uIHRoZXNlIGNoaXBzZXRzIHdlIGNhbiBvbmx5IG1vZGlmeSB0aGUgYmFzZSB3aGlsc3QKIAkJICogdGhlIGN1cnNvciBpcyBkaXNhYmxlZC4KIAkJICovCisJCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfY250bCkgeworCQkJSTkxNV9XUklURShfQ1VSQUNOVFIsIDApOworCQkJUE9TVElOR19SRUFEKF9DVVJBQ05UUik7CisJCQlpbnRlbF9jcnRjLT5jdXJzb3JfY250bCA9IDA7CisJCX0KKwogCQlJOTE1X1dSSVRFKF9DVVJBQkFTRSwgYmFzZSk7CisJCVBPU1RJTkdfUkVBRChfQ1VSQUJBU0UpOworCX0KIAotCQljbnRsICY9IH4oQ1VSU09SX0ZPUk1BVF9NQVNLKTsKLQkJLyogWFhYIHdpZHRoIG11c3QgYmUgNjQsIHN0cmlkZSAyNTYgPT4gMHgwMCA8PCAyOCAqLwotCQljbnRsIHw9IENVUlNPUl9FTkFCTEUgfAorCS8qIFhYWCB3aWR0aCBtdXN0IGJlIDY0LCBzdHJpZGUgMjU2ID0+IDB4MDAgPDwgMjggKi8KKwljbnRsID0gMDsKKwlpZiAoYmFzZSkKKwkJY250bCA9IChDVVJTT1JfRU5BQkxFIHwKIAkJCUNVUlNPUl9HQU1NQV9FTkFCTEUgfAotCQkJQ1VSU09SX0ZPUk1BVF9BUkdCOwotCX0gZWxzZQotCQljbnRsICY9IH4oQ1VSU09SX0VOQUJMRSB8IENVUlNPUl9HQU1NQV9FTkFCTEUpOwotCUk5MTVfV1JJVEUoX0NVUkFDTlRSLCBjbnRsKTsKLQotCWludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlID0gdmlzaWJsZTsKKwkJCUNVUlNPUl9GT1JNQVRfQVJHQik7CisJaWYgKGludGVsX2NydGMtPmN1cnNvcl9jbnRsICE9IGNudGwpIHsKKwkJSTkxNV9XUklURShfQ1VSQUNOVFIsIGNudGwpOworCQlQT1NUSU5HX1JFQUQoX0NVUkFDTlRSKTsKKwkJaW50ZWxfY3J0Yy0+Y3Vyc29yX2NudGwgPSBjbnRsOworCX0KIH0KIAogc3RhdGljIHZvaWQgaTl4eF91cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGJhc2UpCkBAIC03NjEwLDE2ICs3OTAxLDEyIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWJvb2wgdmlzaWJsZSA9IGJhc2UgIT0gMDsKKwl1aW50MzJfdCBjbnRsOwogCi0JaWYgKGludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlICE9IHZpc2libGUpIHsKLQkJaW50MTZfdCB3aWR0aCA9IGludGVsX2NydGMtPmN1cnNvcl93aWR0aDsKLQkJdWludDMyX3QgY250bCA9IEk5MTVfUkVBRChDVVJDTlRSKHBpcGUpKTsKLQkJaWYgKGJhc2UpIHsKLQkJCWNudGwgJj0gfihDVVJTT1JfTU9ERSB8IE1DVVJTT1JfUElQRV9TRUxFQ1QpOwotCQkJY250bCB8PSBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKLQotCQkJc3dpdGNoICh3aWR0aCkgeworCWNudGwgPSAwOworCWlmIChiYXNlKSB7CisJCWNudGwgPSBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKKwkJc3dpdGNoIChpbnRlbF9jcnRjLT5jdXJzb3Jfd2lkdGgpIHsKIAkJCWNhc2UgNjQ6CiAJCQkJY250bCB8PSBDVVJTT1JfTU9ERV82NF9BUkdCX0FYOwogCQkJCWJyZWFrOwpAQCAtNzYzMiwxOCArNzkxOSwxNiBAQAogCQkJZGVmYXVsdDoKIAkJCQlXQVJOX09OKDEpOwogCQkJCXJldHVybjsKLQkJCX0KLQkJCWNudGwgfD0gcGlwZSA8PCAyODsgLyogQ29ubmVjdCB0byBjb3JyZWN0IHBpcGUgKi8KLQkJfSBlbHNlIHsKLQkJCWNudGwgJj0gfihDVVJTT1JfTU9ERSB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFKTsKLQkJCWNudGwgfD0gQ1VSU09SX01PREVfRElTQUJMRTsKIAkJfQotCQlJOTE1X1dSSVRFKENVUkNOVFIocGlwZSksIGNudGwpOwotCi0JCWludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlID0gdmlzaWJsZTsKKwkJY250bCB8PSBwaXBlIDw8IDI4OyAvKiBDb25uZWN0IHRvIGNvcnJlY3QgcGlwZSAqLwogCX0KKwlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2NudGwgIT0gY250bCkgeworCQlJOTE1X1dSSVRFKENVUkNOVFIocGlwZSksIGNudGwpOworCQlQT1NUSU5HX1JFQUQoQ1VSQ05UUihwaXBlKSk7CisJCWludGVsX2NydGMtPmN1cnNvcl9jbnRsID0gY250bDsKKwl9CisKIAkvKiBhbmQgY29tbWl0IGNoYW5nZXMgb24gbmV4dCB2YmxhbmsgKi8KLQlQT1NUSU5HX1JFQUQoQ1VSQ05UUihwaXBlKSk7CiAJSTkxNV9XUklURShDVVJCQVNFKHBpcGUpLCBiYXNlKTsKIAlQT1NUSU5HX1JFQUQoQ1VSQkFTRShwaXBlKSk7CiB9CkBAIC03NjU0LDE1ICs3OTM5LDEyIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWJvb2wgdmlzaWJsZSA9IGJhc2UgIT0gMDsKKwl1aW50MzJfdCBjbnRsOwogCi0JaWYgKGludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlICE9IHZpc2libGUpIHsKLQkJaW50MTZfdCB3aWR0aCA9IGludGVsX2NydGMtPmN1cnNvcl93aWR0aDsKLQkJdWludDMyX3QgY250bCA9IEk5MTVfUkVBRChDVVJDTlRSX0lWQihwaXBlKSk7Ci0JCWlmIChiYXNlKSB7Ci0JCQljbnRsICY9IH5DVVJTT1JfTU9ERTsKLQkJCWNudGwgfD0gTUNVUlNPUl9HQU1NQV9FTkFCTEU7Ci0JCQlzd2l0Y2ggKHdpZHRoKSB7CisJY250bCA9IDA7CisJaWYgKGJhc2UpIHsKKwkJY250bCA9IE1DVVJTT1JfR0FNTUFfRU5BQkxFOworCQlzd2l0Y2ggKGludGVsX2NydGMtPmN1cnNvcl93aWR0aCkgewogCQkJY2FzZSA2NDoKIAkJCQljbnRsIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVg7CiAJCQkJYnJlYWs7CkBAIC03Njc1LDIzICs3OTU3LDIwIEBACiAJCQlkZWZhdWx0OgogCQkJCVdBUk5fT04oMSk7CiAJCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJY250bCAmPSB+KENVUlNPUl9NT0RFIHwgTUNVUlNPUl9HQU1NQV9FTkFCTEUpOwotCQkJY250bCB8PSBDVVJTT1JfTU9ERV9ESVNBQkxFOwogCQl9Ci0JCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpIHsKLQkJCWNudGwgfD0gQ1VSU09SX1BJUEVfQ1NDX0VOQUJMRTsKLQkJCWNudGwgJj0gfkNVUlNPUl9UUklDS0xFX0ZFRURfRElTQUJMRTsKLQkJfQotCQlJOTE1X1dSSVRFKENVUkNOVFJfSVZCKHBpcGUpLCBjbnRsKTsKLQotCQlpbnRlbF9jcnRjLT5jdXJzb3JfdmlzaWJsZSA9IHZpc2libGU7CiAJfQorCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCisJCWNudGwgfD0gQ1VSU09SX1BJUEVfQ1NDX0VOQUJMRTsKKworCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfY250bCAhPSBjbnRsKSB7CisJCUk5MTVfV1JJVEUoQ1VSQ05UUihwaXBlKSwgY250bCk7CisJCVBPU1RJTkdfUkVBRChDVVJDTlRSKHBpcGUpKTsKKwkJaW50ZWxfY3J0Yy0+Y3Vyc29yX2NudGwgPSBjbnRsOworCX0KKwogCS8qIGFuZCBjb21taXQgY2hhbmdlcyBvbiBuZXh0IHZibGFuayAqLwotCVBPU1RJTkdfUkVBRChDVVJDTlRSX0lWQihwaXBlKSk7Ci0JSTkxNV9XUklURShDVVJCQVNFX0lWQihwaXBlKSwgYmFzZSk7Ci0JUE9TVElOR19SRUFEKENVUkJBU0VfSVZCKHBpcGUpKTsKKwlJOTE1X1dSSVRFKENVUkJBU0UocGlwZSksIGJhc2UpOworCVBPU1RJTkdfUkVBRChDVVJCQVNFKHBpcGUpKTsKIH0KIAogLyogSWYgbm8tcGFydCBvZiB0aGUgY3Vyc29yIGlzIHZpc2libGUgb24gdGhlIGZyYW1lYnVmZmVyLCB0aGVuIHRoZSBHUFUgbWF5IGhhbmcuLi4gKi8KQEAgLTc3MDUsNyArNzk4NCw2IEBACiAJaW50IHggPSBpbnRlbF9jcnRjLT5jdXJzb3JfeDsKIAlpbnQgeSA9IGludGVsX2NydGMtPmN1cnNvcl95OwogCXUzMiBiYXNlID0gMCwgcG9zID0gMDsKLQlib29sIHZpc2libGU7CiAKIAlpZiAob24pCiAJCWJhc2UgPSBpbnRlbF9jcnRjLT5jdXJzb3JfYWRkcjsKQEAgLTc3MzQsMjAgKzgwMTIsMTggQEAKIAl9CiAJcG9zIHw9IHkgPDwgQ1VSU09SX1lfU0hJRlQ7CiAKLQl2aXNpYmxlID0gYmFzZSAhPSAwOwotCWlmICghdmlzaWJsZSAmJiAhaW50ZWxfY3J0Yy0+Y3Vyc29yX3Zpc2libGUpCisJaWYgKGJhc2UgPT0gMCAmJiBpbnRlbF9jcnRjLT5jdXJzb3JfYmFzZSA9PSAwKQogCQlyZXR1cm47CiAKLQlpZiAoSVNfSVZZQlJJREdFKGRldikgfHwgSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKSB7Ci0JCUk5MTVfV1JJVEUoQ1VSUE9TX0lWQihwaXBlKSwgcG9zKTsKKwlJOTE1X1dSSVRFKENVUlBPUyhwaXBlKSwgcG9zKTsKKworCWlmIChJU19JVllCUklER0UoZGV2KSB8fCBJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCiAJCWl2Yl91cGRhdGVfY3Vyc29yKGNydGMsIGJhc2UpOwotCX0gZWxzZSB7Ci0JCUk5MTVfV1JJVEUoQ1VSUE9TKHBpcGUpLCBwb3MpOwotCQlpZiAoSVNfODQ1RyhkZXYpIHx8IElTX0k4NjVHKGRldikpCi0JCQlpODQ1X3VwZGF0ZV9jdXJzb3IoY3J0YywgYmFzZSk7Ci0JCWVsc2UKLQkJCWk5eHhfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKLQl9CisJZWxzZSBpZiAoSVNfODQ1RyhkZXYpIHx8IElTX0k4NjVHKGRldikpCisJCWk4NDVfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKKwllbHNlCisJCWk5eHhfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYmFzZSA9IGJhc2U7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTgwMTUsNyArODI5MSw4IEBACiAKIGJvb2wgaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQlzdHJ1Y3QgaW50ZWxfbG9hZF9kZXRlY3RfcGlwZSAqb2xkKQorCQkJCXN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQsCisJCQkJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpCiB7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIgPQpAQCAtODAyNSwxMSArODMwMiwxOSBAQAogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IE5VTEw7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKLQlpbnQgaSA9IC0xOworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKmNvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOworCWludCByZXQsIGkgPSAtMTsKIAogCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdLCBbRU5DT0RFUjolZDolc11cbiIsCi0JCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAotCQkgICAgICBlbmNvZGVyLT5iYXNlLmlkLCBkcm1fZ2V0X2VuY29kZXJfbmFtZShlbmNvZGVyKSk7CisJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT5uYW1lLAorCQkgICAgICBlbmNvZGVyLT5iYXNlLmlkLCBlbmNvZGVyLT5uYW1lKTsKKworCWRybV9tb2Rlc2V0X2FjcXVpcmVfaW5pdChjdHgsIDApOworCityZXRyeToKKwlyZXQgPSBkcm1fbW9kZXNldF9sb2NrKCZjb25maWctPmNvbm5lY3Rpb25fbXV0ZXgsIGN0eCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3VubG9jazsKIAogCS8qCiAJICogQWxnb3JpdGhtIGdldHMgYSBsaXR0bGUgbWVzc3k6CkBAIC04MDQ1LDcgKzgzMzAsOSBAQAogCWlmIChlbmNvZGVyLT5jcnRjKSB7CiAJCWNydGMgPSBlbmNvZGVyLT5jcnRjOwogCi0JCW11dGV4X2xvY2soJmNydGMtPm11dGV4KTsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9jaygmY3J0Yy0+bXV0ZXgsIGN0eCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxfdW5sb2NrOwogCiAJCW9sZC0+ZHBtc19tb2RlID0gY29ubmVjdG9yLT5kcG1zOwogCQlvbGQtPmxvYWRfZGV0ZWN0X3RlbXAgPSBmYWxzZTsKQEAgLTgwNTgsNyArODM0NSw3IEBACiAJfQogCiAJLyogRmluZCBhbiB1bnVzZWQgb25lIChpZiBwb3NzaWJsZSkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvc3NpYmxlX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCBwb3NzaWJsZV9jcnRjKSB7CiAJCWkrKzsKIAkJaWYgKCEoZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKQEAgLTgwNzMsMTAgKzgzNjAsMTIgQEAKIAkgKi8KIAlpZiAoIWNydGMpIHsKIAkJRFJNX0RFQlVHX0tNUygibm8gcGlwZSBhdmFpbGFibGUgZm9yIGxvYWQtZGV0ZWN0XG4iKTsKLQkJcmV0dXJuIGZhbHNlOworCQlnb3RvIGZhaWxfdW5sb2NrOwogCX0KIAotCW11dGV4X2xvY2soJmNydGMtPm11dGV4KTsKKwlyZXQgPSBkcm1fbW9kZXNldF9sb2NrKCZjcnRjLT5tdXRleCwgY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfdW5sb2NrOwogCWludGVsX2VuY29kZXItPm5ld19jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAl0b19pbnRlbF9jb25uZWN0b3IoY29ubmVjdG9yKS0+bmV3X2VuY29kZXIgPSBpbnRlbF9lbmNvZGVyOwogCkBAIC04MTI2LDEyICs4NDE1LDIxIEBACiAJCWludGVsX2NydGMtPm5ld19jb25maWcgPSAmaW50ZWxfY3J0Yy0+Y29uZmlnOwogCWVsc2UKIAkJaW50ZWxfY3J0Yy0+bmV3X2NvbmZpZyA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZjcnRjLT5tdXRleCk7CitmYWlsX3VubG9jazoKKwlpZiAocmV0ID09IC1FREVBRExLKSB7CisJCWRybV9tb2Rlc2V0X2JhY2tvZmYoY3R4KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKGN0eCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKGN0eCk7CisKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgaW50ZWxfcmVsZWFzZV9sb2FkX2RldGVjdF9waXBlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJICAgIHN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQpCisJCQkJICAgIHN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQsCisJCQkJICAgIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KQogewogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0KIAkJaW50ZWxfYXR0YWNoZWRfZW5jb2Rlcihjb25uZWN0b3IpOwpAQCAtODE0MCw4ICs4NDM4LDggQEAKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSwgW0VOQ09ERVI6JWQ6JXNdXG4iLAotCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwKLQkJICAgICAgZW5jb2Rlci0+YmFzZS5pZCwgZHJtX2dldF9lbmNvZGVyX25hbWUoZW5jb2RlcikpOworCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSwKKwkJICAgICAgZW5jb2Rlci0+YmFzZS5pZCwgZW5jb2Rlci0+bmFtZSk7CiAKIAlpZiAob2xkLT5sb2FkX2RldGVjdF90ZW1wKSB7CiAJCXRvX2ludGVsX2Nvbm5lY3Rvcihjb25uZWN0b3IpLT5uZXdfZW5jb2RlciA9IE5VTEw7CkBAIC04MTU1LDcgKzg0NTMsNyBAQAogCQkJZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKG9sZC0+cmVsZWFzZV9mYik7CiAJCX0KIAotCQltdXRleF91bmxvY2soJmNydGMtPm11dGV4KTsKKwkJZ290byB1bmxvY2s7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgxNjMsNyArODQ2MSw5IEBACiAJaWYgKG9sZC0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pCiAJCWNvbm5lY3Rvci0+ZnVuY3MtPmRwbXMoY29ubmVjdG9yLCBvbGQtPmRwbXNfbW9kZSk7CiAKLQltdXRleF91bmxvY2soJmNydGMtPm11dGV4KTsKK3VubG9jazoKKwlkcm1fbW9kZXNldF9kcm9wX2xvY2tzKGN0eCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9maW5pKGN0eCk7CiB9CiAKIHN0YXRpYyBpbnQgaTl4eF9wbGxfcmVmY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCkBAIC04NDQ5LDcgKzg3NDksNyBAQAogCWlmICghaTkxNS5wb3dlcnNhdmUpCiAJCWdvdG8gb3V0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwlmb3JfZWFjaF9jcnRjKGRldiwgY3J0YykgewogCQlpZiAoIWNydGMtPnByaW1hcnktPmZiKQogCQkJY29udGludWU7CiAKQEAgLTg0NjQsNyArODc2NCw3IEBACiB9CiAKIHZvaWQgaW50ZWxfbWFya19mYl9idXN5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisJCQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKQEAgLTg0NzIsNyArODc3Miw3IEBACiAJaWYgKCFpOTE1LnBvd2Vyc2F2ZSkKIAkJcmV0dXJuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwlmb3JfZWFjaF9jcnRjKGRldiwgY3J0YykgewogCQlpZiAoIWNydGMtPnByaW1hcnktPmZiKQogCQkJY29udGludWU7CiAKQEAgLTg1NjAsNyArODg2MCw3IEBACiAJaWYgKHdvcmstPmV2ZW50KQogCQlkcm1fc2VuZF92YmxhbmtfZXZlbnQoZGV2LCBpbnRlbF9jcnRjLT5waXBlLCB3b3JrLT5ldmVudCk7CiAKLQlkcm1fdmJsYW5rX3B1dChkZXYsIGludGVsX2NydGMtPnBpcGUpOworCWRybV9jcnRjX3ZibGFua19wdXQoY3J0Yyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIApAQCAtODU4Nyw2ICs4ODg3LDQ4IEBACiAJZG9faW50ZWxfZmluaXNoX3BhZ2VfZmxpcChkZXYsIGNydGMpOwogfQogCisvKiBJcyAnYScgYWZ0ZXIgb3IgZXF1YWwgdG8gJ2InPyAqLworc3RhdGljIGJvb2wgZzR4X2ZsaXBfY291bnRfYWZ0ZXJfZXEodTMyIGEsIHUzMiBiKQoreworCXJldHVybiAhKChhIC0gYikgJiAweDgwMDAwMDAwKTsKK30KKworc3RhdGljIGJvb2wgcGFnZV9mbGlwX2ZpbmlzaGVkKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLyoKKwkgKiBUaGUgcmVsZXZhbnQgcmVnaXN0ZXJzIGRvZW4ndCBleGlzdCBvbiBwcmUtY3RnLgorCSAqIEFzIHRoZSBmbGlwIGRvbmUgaW50ZXJydXB0IGRvZXNuJ3QgdHJpZ2dlciBmb3IgbW1pbworCSAqIGZsaXBzIG9uIGdtY2ggcGxhdGZvcm1zLCBhIGZsaXAgY291bnQgY2hlY2sgaXNuJ3QKKwkgKiByZWFsbHkgbmVlZGVkIHRoZXJlLiBCdXQgc2luY2UgY3RnIGhhcyB0aGUgcmVnaXN0ZXJzLAorCSAqIGluY2x1ZGUgaXQgaW4gdGhlIGNoZWNrIGFueXdheS4KKwkgKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1ICYmICFJU19HNFgoZGV2KSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIEEgRFNQU1VSRkxJVkUgY2hlY2sgaXNuJ3QgZW5vdWdoIGluIGNhc2UgdGhlIG1taW8gYW5kIENTIGZsaXBzCisJICogdXNlZCB0aGUgc2FtZSBiYXNlIGFkZHJlc3MuIEluIHRoYXQgY2FzZSB0aGUgbW1pbyBmbGlwIG1pZ2h0CisJICogaGF2ZSBjb21wbGV0ZWQsIGJ1dCB0aGUgQ1MgaGFzbid0IGV2ZW4gZXhlY3V0ZWQgdGhlIGZsaXAgeWV0LgorCSAqCisJICogQSBmbGlwIGNvdW50IGNoZWNrIGlzbid0IGVub3VnaCBhcyB0aGUgQ1MgbWlnaHQgaGF2ZSB1cGRhdGVkCisJICogdGhlIGJhc2UgYWRkcmVzcyBqdXN0IGFmdGVyIHN0YXJ0IG9mIHZibGFuaywgYnV0IGJlZm9yZSB3ZQorCSAqIG1hbmFnZWQgdG8gcHJvY2VzcyB0aGUgaW50ZXJydXB0LiBUaGlzIG1lYW5zIHdlJ2QgY29tcGxldGUgdGhlCisJICogQ1MgZmxpcCB0b28gc29vbi4KKwkgKgorCSAqIENvbWJpbmluZyBib3RoIGNoZWNrcyBzaG91bGQgZ2V0IHVzIGEgZ29vZCBlbm91Z2ggcmVzdWx0LiBJdCBtYXkKKwkgKiBzdGlsbCBoYXBwZW4gdGhhdCB0aGUgQ1MgZmxpcCBoYXMgYmVlbiBleGVjdXRlZCwgYnV0IGhhcyBub3QKKwkgKiB5ZXQgYWN0dWFsbHkgY29tcGxldGVkLiBCdXQgaW4gY2FzZSB0aGUgYmFzZSBhZGRyZXNzIGlzIHRoZSBzYW1lCisJICogYW55d2F5LCB3ZSBkb24ndCByZWFsbHkgY2FyZS4KKwkgKi8KKwlyZXR1cm4gKEk5MTVfUkVBRChEU1BTVVJGTElWRShjcnRjLT5wbGFuZSkpICYgfjB4ZmZmKSA9PQorCQljcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0ICYmCisJCWc0eF9mbGlwX2NvdW50X2FmdGVyX2VxKEk5MTVfUkVBRChQSVBFX0ZMSVBDT1VOVF9HTTQ1KGNydGMtPnBpcGUpKSwKKwkJCQkgICAgY3J0Yy0+dW5waW5fd29yay0+ZmxpcF9jb3VudCk7Cit9CisKIHZvaWQgaW50ZWxfcHJlcGFyZV9wYWdlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04NTk5LDEyICs4OTQxLDEyIEBACiAJICogaXMgYWxzbyBhY2NvbXBhbmllZCBieSBhIHNwdXJpb3VzIGludGVsX3ByZXBhcmVfcGFnZV9mbGlwKCkuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCWlmIChpbnRlbF9jcnRjLT51bnBpbl93b3JrKQorCWlmIChpbnRlbF9jcnRjLT51bnBpbl93b3JrICYmIHBhZ2VfZmxpcF9maW5pc2hlZChpbnRlbF9jcnRjKSkKIAkJYXRvbWljX2luY19ub3RfemVybygmaW50ZWxfY3J0Yy0+dW5waW5fd29yay0+cGVuZGluZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBpbnRlbF9tYXJrX3BhZ2VfZmxpcF9hY3RpdmUoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMpCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfbWFya19wYWdlX2ZsaXBfYWN0aXZlKHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjKQogewogCS8qIEVuc3VyZSB0aGF0IHRoZSB3b3JrIGl0ZW0gaXMgY29uc2lzdGVudCB3aGVuIGFjdGl2YXRpbmcgaXQgLi4uICovCiAJc21wX3dtYigpOwpAQCAtODYxNywyMSArODk1OSwxNiBAQAogCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSB1aW50MzJfdCBmbGFncykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAl1MzIgZmxpcF9tYXNrOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOwogCWludCByZXQ7CiAKLQlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgcmluZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KIAlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucGluOworCQlyZXR1cm4gcmV0OwogCiAJLyogQ2FuJ3QgcXVldWUgbXVsdGlwbGUgZmxpcHMsIHNvIHdhaXQgZm9yIHRoZSBwcmV2aW91cwogCSAqIG9uZSB0byBmaW5pc2ggYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dC4KQEAgLTg2NDUsMzggKzg5ODIsMjggQEAKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRElTUExBWV9GTElQIHwKIAkJCU1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBmYi0+cGl0Y2hlc1swXSk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBpbnRlbF9jcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0KTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7IC8qIGF1eCBkaXNwbGF5IGJhc2UgYWRkcmVzcywgdW51c2VkICovCiAKIAlpbnRlbF9tYXJrX3BhZ2VfZmxpcF9hY3RpdmUoaW50ZWxfY3J0Yyk7CiAJX19pbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAJcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpbnRlbF91bnBpbl9mYl9vYmoob2JqKTsKLWVycjoKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2dlbjNfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSB1aW50MzJfdCBmbGFncykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAl1MzIgZmxpcF9tYXNrOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOwogCWludCByZXQ7CiAKLQlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgcmluZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KIAlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucGluOworCQlyZXR1cm4gcmV0OwogCiAJaWYgKGludGVsX2NydGMtPnBsYW5lKQogCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7CkBAIC04Njg3LDM4ICs5MDE0LDI5IEBACiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0RJU1BMQVlfRkxJUF9JOTE1IHwKIAkJCU1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBmYi0+cGl0Y2hlc1swXSk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBpbnRlbF9jcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0KTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTk9PUCk7CiAKIAlpbnRlbF9tYXJrX3BhZ2VfZmxpcF9hY3RpdmUoaW50ZWxfY3J0Yyk7CiAJX19pbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAJcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpbnRlbF91bnBpbl9mYl9vYmoob2JqKTsKLWVycjoKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2dlbjRfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSB1aW50MzJfdCBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAl1aW50MzJfdCBwZiwgcGlwZXNyYzsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHJpbmcpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCiAJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl91bnBpbjsKKwkJcmV0dXJuIHJldDsKIAogCS8qIGk5NjUrIHVzZXMgdGhlIGxpbmVhciBvciB0aWxlZCBvZmZzZXRzIGZyb20gdGhlCiAJICogRGlzcGxheSBSZWdpc3RlcnMgKHdoaWNoIGRvIG5vdCBjaGFuZ2UgYWNyb3NzIGEgcGFnZS1mbGlwKQpAQCAtODcyNyw4ICs5MDQ1LDcgQEAKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRElTUExBWV9GTElQIHwKIAkJCU1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBmYi0+cGl0Y2hlc1swXSk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsCi0JCQkoaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBpbnRlbF9jcnRjLT5kc3BhZGRyX29mZnNldCkgfAorCWludGVsX3JpbmdfZW1pdChyaW5nLCBpbnRlbF9jcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0IHwKIAkJCW9iai0+dGlsaW5nX21vZGUpOwogCiAJLyogWFhYIEVuYWJsaW5nIHRoZSBwYW5lbC1maXR0ZXIgYWNyb3NzIHBhZ2UtZmxpcCBpcyBzbyBmYXIKQEAgLTg3NDIsMzcgKzkwNTksMjggQEAKIAlpbnRlbF9tYXJrX3BhZ2VfZmxpcF9hY3RpdmUoaW50ZWxfY3J0Yyk7CiAJX19pbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAJcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpbnRlbF91bnBpbl9mYl9vYmoob2JqKTsKLWVycjoKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2dlbjZfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSB1aW50MzJfdCBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAl1aW50MzJfdCBwZiwgcGlwZXNyYzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHJpbmcpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCiAJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl91bnBpbjsKKwkJcmV0dXJuIHJldDsKIAogCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9ESVNQTEFZX0ZMSVAgfAogCQkJTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIGZiLT5waXRjaGVzWzBdIHwgb2JqLT50aWxpbmdfbW9kZSk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBpbnRlbF9jcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0KTsKIAogCS8qIENvbnRyYXJ5IHRvIHRoZSBzdWdnZXN0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwKIAkgKiAiRW5hYmxlIFBhbmVsIEZpdHRlciIgZG9lcyBub3Qgc2VlbSB0byBiZSByZXF1aXJlZCB3aGVuIHBhZ2UKQEAgLTg3ODcsMzQgKzkwOTUsMjAgQEAKIAlpbnRlbF9tYXJrX3BhZ2VfZmxpcF9hY3RpdmUoaW50ZWxfY3J0Yyk7CiAJX19pbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAJcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpbnRlbF91bnBpbl9mYl9vYmoob2JqKTsKLWVycjoKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGludGVsX2dlbjdfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSB1aW50MzJfdCBmbGFncykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAJdWludDMyX3QgcGxhbmVfYml0ID0gMDsKIAlpbnQgbGVuLCByZXQ7CiAKLQlyaW5nID0gb2JqLT5yaW5nOwotCWlmIChJU19WQUxMRVlWSUVXKGRldikgfHwgcmluZyA9PSBOVUxMIHx8IHJpbmctPmlkICE9IFJDUykKLQkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tCQ1NdOwotCi0JcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHJpbmcpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0Jc3dpdGNoKGludGVsX2NydGMtPnBsYW5lKSB7CisJc3dpdGNoIChpbnRlbF9jcnRjLT5wbGFuZSkgewogCWNhc2UgUExBTkVfQToKIAkJcGxhbmVfYml0ID0gTUlfRElTUExBWV9GTElQX0lWQl9QTEFORV9BOwogCQlicmVhazsKQEAgLTg4MjYsMTMgKzkxMjAsMjAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTkNFKDEsICJ1bmtub3duIHBsYW5lIGluIGZsaXAgY29tbWFuZFxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3VucGluOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlsZW4gPSA0OwotCWlmIChyaW5nLT5pZCA9PSBSQ1MpCisJaWYgKHJpbmctPmlkID09IFJDUykgewogCQlsZW4gKz0gNjsKKwkJLyoKKwkJICogT24gR2VuIDgsIFNSTSBpcyBub3cgdGFraW5nIGFuIGV4dHJhIGR3b3JkIHRvIGFjY29tbW9kYXRlCisJCSAqIDQ4Yml0cyBhZGRyZXNzZXMsIGFuZCB3ZSBuZWVkIGEgTk9PUCBmb3IgdGhlIGJhdGNoIHNpemUgdG8KKwkJICogc3RheSBldmVuLgorCQkgKi8KKwkJaWYgKElTX0dFTjgoZGV2KSkKKwkJCWxlbiArPSAyOworCX0KIAogCS8qCiAJICogQlNwZWMgTUlfRElTUExBWV9GTElQIGZvciBJVkI6CkBAIC04ODQ2LDExICs5MTQ3LDExIEBACiAJICovCiAJcmV0ID0gaW50ZWxfcmluZ19jYWNoZWxpbmVfYWxpZ24ocmluZyk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfdW5waW47CisJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIGxlbik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfdW5waW47CisJCXJldHVybiByZXQ7CiAKIAkvKiBVbm1hc2sgdGhlIGZsaXAtZG9uZSBjb21wbGV0aW9uIG1lc3NhZ2UuIE5vdGUgdGhhdCB0aGUgYnNwZWMgc2F5cyB0aGF0CiAJICogd2Ugc2hvdWxkIGRvIHRoaXMgZm9yIGJvdGggdGhlIEJDUyBhbmQgUkNTLCBhbmQgdGhhdCB3ZSBtdXN0IG5vdCB1bm1hc2sKQEAgLTg4NjcsMzEgKzkxNjgsMzUgQEAKIAkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIH4oREVSUk1SX1BJUEVBX1BSSV9GTElQX0RPTkUgfAogCQkJCQlERVJSTVJfUElQRUJfUFJJX0ZMSVBfRE9ORSB8CiAJCQkJCURFUlJNUl9QSVBFQ19QUklfRkxJUF9ET05FKSk7Ci0JCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9SRUdJU1RFUl9NRU0oMSkgfAotCQkJCU1JX1NSTV9MUk1fR0xPQkFMX0dUVCk7CisJCWlmIChJU19HRU44KGRldikpCisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfU1RPUkVfUkVHSVNURVJfTUVNX0dFTjgoMSkgfAorCQkJCQkgICAgICBNSV9TUk1fTFJNX0dMT0JBTF9HVFQpOworCQllbHNlCisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfU1RPUkVfUkVHSVNURVJfTUVNKDEpIHwKKwkJCQkJICAgICAgTUlfU1JNX0xSTV9HTE9CQUxfR1RUKTsKIAkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIERFUlJNUik7CiAJCWludGVsX3JpbmdfZW1pdChyaW5nLCByaW5nLT5zY3JhdGNoLmd0dF9vZmZzZXQgKyAyNTYpOworCQlpZiAoSVNfR0VOOChkZXYpKSB7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTk9PUCk7CisJCX0KIAl9CiAKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRElTUExBWV9GTElQX0k5MTUgfCBwbGFuZV9iaXQpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCAoZmItPnBpdGNoZXNbMF0gfCBvYmotPnRpbGluZ19tb2RlKSk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBpbnRlbF9jcnRjLT51bnBpbl93b3JrLT5ndHRfb2Zmc2V0KTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgKE1JX05PT1ApKTsKIAogCWludGVsX21hcmtfcGFnZV9mbGlwX2FjdGl2ZShpbnRlbF9jcnRjKTsKIAlfX2ludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKIAlyZXR1cm4gMDsKLQotZXJyX3VucGluOgotCWludGVsX3VucGluX2ZiX29iaihvYmopOwotZXJyOgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfZGVmYXVsdF9xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJICAgIHVpbnQzMl90IGZsYWdzKQogewogCXJldHVybiAtRU5PREVWOwpAQCAtODkwOCw2ICs5MjEzLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpLT5vYmo7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCkBAIC04OTM2LDcgKzkyNDIsNyBAQAogCXdvcmstPm9sZF9mYl9vYmogPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihvbGRfZmIpLT5vYmo7CiAJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBpbnRlbF91bnBpbl93b3JrX2ZuKTsKIAotCXJldCA9IGRybV92YmxhbmtfZ2V0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJcmV0ID0gZHJtX2NydGNfdmJsYW5rX2dldChjcnRjKTsKIAlpZiAocmV0KQogCQlnb3RvIGZyZWVfd29yazsKIApAQCAtODk0NSw3ICs5MjUxLDcgQEAKIAlpZiAoaW50ZWxfY3J0Yy0+dW5waW5fd29yaykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAkJa2ZyZWUod29yayk7Ci0JCWRybV92YmxhbmtfcHV0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJCWRybV9jcnRjX3ZibGFua19wdXQoY3J0Yyk7CiAKIAkJRFJNX0RFQlVHX0RSSVZFUigiZmxpcCBxdWV1ZTogY3J0YyBhbHJlYWR5IGJ1c3lcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtODk3MywxMCArOTI3OSwzMCBAQAogCWF0b21pY19pbmMoJmludGVsX2NydGMtPnVucGluX3dvcmtfY291bnQpOwogCWludGVsX2NydGMtPnJlc2V0X2NvdW50ZXIgPSBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmdwdV9lcnJvci5yZXNldF9jb3VudGVyKTsKIAotCXJldCA9IGRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAoZGV2LCBjcnRjLCBmYiwgb2JqLCBwYWdlX2ZsaXBfZmxhZ3MpOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA1IHx8IElTX0c0WChkZXYpKQorCQl3b3JrLT5mbGlwX2NvdW50ID0gSTkxNV9SRUFEKFBJUEVfRkxJUENPVU5UX0dNNDUoaW50ZWxfY3J0Yy0+cGlwZSkpICsgMTsKKworCWlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKKwkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tCQ1NdOworCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNykgeworCQlyaW5nID0gb2JqLT5yaW5nOworCQlpZiAocmluZyA9PSBOVUxMIHx8IHJpbmctPmlkICE9IFJDUykKKwkJCXJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbQkNTXTsKKwl9IGVsc2UgeworCQlyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CisJfQorCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHJpbmcpOwogCWlmIChyZXQpCiAJCWdvdG8gY2xlYW51cF9wZW5kaW5nOwogCisJd29yay0+Z3R0X29mZnNldCA9CisJCWk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgaW50ZWxfY3J0Yy0+ZHNwYWRkcl9vZmZzZXQ7CisKKwlyZXQgPSBkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwKGRldiwgY3J0YywgZmIsIG9iaiwgcmluZywgcGFnZV9mbGlwX2ZsYWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXBfdW5waW47CisKIAlpbnRlbF9kaXNhYmxlX2ZiYyhkZXYpOwogCWludGVsX21hcmtfZmJfYnVzeShvYmosIE5VTEwpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtODk4NSw2ICs5MzExLDggQEAKIAogCXJldHVybiAwOwogCitjbGVhbnVwX3VucGluOgorCWludGVsX3VucGluX2ZiX29iaihvYmopOwogY2xlYW51cF9wZW5kaW5nOgogCWF0b21pY19kZWMoJmludGVsX2NydGMtPnVucGluX3dvcmtfY291bnQpOwogCWNydGMtPnByaW1hcnktPmZiID0gb2xkX2ZiOwpAQCAtODk5Nyw3ICs5MzI1LDcgQEAKIAlpbnRlbF9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAotCWRybV92YmxhbmtfcHV0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJZHJtX2NydGNfdmJsYW5rX3B1dChjcnRjKTsKIGZyZWVfd29yazoKIAlrZnJlZSh3b3JrKTsKIApAQCAtOTA0MCw4ICs5MzY4LDcgQEAKIAkJCXRvX2ludGVsX2NydGMoZW5jb2Rlci0+YmFzZS5jcnRjKTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKLQkJCSAgICBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQljcnRjLT5uZXdfZW5hYmxlZCA9IGNydGMtPmJhc2UuZW5hYmxlZDsKIAogCQlpZiAoY3J0Yy0+bmV3X2VuYWJsZWQpCkBAIC05MDcyLDIxICs5Mzk5LDIwIEBACiAJCWVuY29kZXItPmJhc2UuY3J0YyA9ICZlbmNvZGVyLT5uZXdfY3J0Yy0+YmFzZTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKLQkJCSAgICBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQljcnRjLT5iYXNlLmVuYWJsZWQgPSBjcnRjLT5uZXdfZW5hYmxlZDsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1jb25uZWN0ZWRfc2lua19jb21wdXRlX2JwcChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICogY29ubmVjdG9yLAorY29ubmVjdGVkX3NpbmtfY29tcHV0ZV9icHAoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJICAgc3RydWN0IGludGVsX2NydGNfY29uZmlnICpwaXBlX2NvbmZpZykKIHsKIAlpbnQgYnBwID0gcGlwZV9jb25maWctPnBpcGVfYnBwOwogCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gY2hlY2tpbmcgZm9yIHNpbmsgYnBwIGNvbnN0cmFpbnNcbiIsCiAJCWNvbm5lY3Rvci0+YmFzZS5iYXNlLmlkLAotCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZjb25uZWN0b3ItPmJhc2UpKTsKKwkJY29ubmVjdG9yLT5iYXNlLm5hbWUpOwogCiAJLyogRG9uJ3QgdXNlIGFuIGludmFsaWQgRURJRCBicGMgdmFsdWUgKi8KIAlpZiAoY29ubmVjdG9yLT5iYXNlLmRpc3BsYXlfaW5mby5icGMgJiYKQEAgLTk0MjcsOCArOTc1Myw3IEBACiAJfQogCiAJLyogQ2hlY2sgZm9yIHBpcGVzIHRoYXQgd2lsbCBiZSBlbmFibGVkL2Rpc2FibGVkIC4uLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZWxfY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LAotCQkJICAgIGJhc2UuaGVhZCkgeworCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBpbnRlbF9jcnRjKSB7CiAJCWlmIChpbnRlbF9jcnRjLT5iYXNlLmVuYWJsZWQgPT0gaW50ZWxfY3J0Yy0+bmV3X2VuYWJsZWQpCiAJCQljb250aW51ZTsKIApAQCAtOTUwMSw4ICs5ODI2LDcgQEAKIAlpbnRlbF9tb2Rlc2V0X2NvbW1pdF9vdXRwdXRfc3RhdGUoZGV2KTsKIAogCS8qIERvdWJsZSBjaGVjayBzdGF0ZS4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVsX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKLQkJCSAgICBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgaW50ZWxfY3J0YykgewogCQlXQVJOX09OKGludGVsX2NydGMtPmJhc2UuZW5hYmxlZCAhPSBpbnRlbF9jcnRjX2luX3VzZSgmaW50ZWxfY3J0Yy0+YmFzZSkpOwogCQlXQVJOX09OKGludGVsX2NydGMtPm5ld19jb25maWcgJiYKIAkJCWludGVsX2NydGMtPm5ld19jb25maWcgIT0gJmludGVsX2NydGMtPmNvbmZpZyk7CkBAIC05NjMxLDYgKzk5NTUsMTIgQEAKIAlQSVBFX0NPTkZfQ0hFQ0tfSShhZGp1c3RlZF9tb2RlLmNydGNfdnN5bmNfZW5kKTsKIAogCVBJUEVfQ09ORl9DSEVDS19JKHBpeGVsX211bHRpcGxpZXIpOworCVBJUEVfQ09ORl9DSEVDS19JKGhhc19oZG1pX3NpbmspOworCWlmICgoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA4ICYmICFJU19IQVNXRUxMKGRldikpIHx8CisJICAgIElTX1ZBTExFWVZJRVcoZGV2KSkKKwkJUElQRV9DT05GX0NIRUNLX0kobGltaXRlZF9jb2xvcl9yYW5nZSk7CisKKwlQSVBFX0NPTkZfQ0hFQ0tfSShoYXNfYXVkaW8pOwogCiAJUElQRV9DT05GX0NIRUNLX0ZMQUdTKGFkanVzdGVkX21vZGUuZmxhZ3MsCiAJCQkgICAgICBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSk7CkBAIC05NzI4LDcgKzEwMDU4LDcgQEAKIAogCQlEUk1fREVCVUdfS01TKCJbRU5DT0RFUjolZDolc11cbiIsCiAJCQkgICAgICBlbmNvZGVyLT5iYXNlLmJhc2UuaWQsCi0JCQkgICAgICBkcm1fZ2V0X2VuY29kZXJfbmFtZSgmZW5jb2Rlci0+YmFzZSkpOworCQkJICAgICAgZW5jb2Rlci0+YmFzZS5uYW1lKTsKIAogCQlXQVJOKCZlbmNvZGVyLT5uZXdfY3J0Yy0+YmFzZSAhPSBlbmNvZGVyLT5iYXNlLmNydGMsCiAJCSAgICAgImVuY29kZXIncyBzdGFnZSBjcnRjIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBjcnRjXG4iKTsKQEAgLTk3ODAsOCArMTAxMTAsNyBAQAogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyBwaXBlX2NvbmZpZzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LAotCQkJICAgIGJhc2UuaGVhZCkgeworCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBjcnRjKSB7CiAJCWJvb2wgZW5hYmxlZCA9IGZhbHNlOwogCQlib29sIGFjdGl2ZSA9IGZhbHNlOwogCkBAIC05ODcwLDggKzEwMTk5LDcgQEAKIAkJICAgICAicGxsIG9uIHN0YXRlIG1pc21hdGNoIChleHBlY3RlZCAlaSwgZm91bmQgJWkpXG4iLAogCQkgICAgIHBsbC0+b24sIGFjdGl2ZSk7CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCi0JCQkJICAgIGJhc2UuaGVhZCkgeworCQlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQkJaWYgKGNydGMtPmJhc2UuZW5hYmxlZCAmJiBpbnRlbF9jcnRjX3RvX3NoYXJlZF9kcGxsKGNydGMpID09IHBsbCkKIAkJCQllbmFibGVkX2NydGNzKys7CiAJCQlpZiAoY3J0Yy0+YWN0aXZlICYmIGludGVsX2NydGNfdG9fc2hhcmVkX2RwbGwoY3J0YykgPT0gcGxsKQpAQCAtOTkxMSw2ICsxMDIzOSw0NCBAQAogCSAgICAgcGlwZV9jb25maWctPmFkanVzdGVkX21vZGUuY3J0Y19jbG9jaywgZG90Y2xvY2spOwogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfc2NhbmxpbmVfb2Zmc2V0KHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKworCS8qCisJICogVGhlIHNjYW5saW5lIGNvdW50ZXIgaW5jcmVtZW50cyBhdCB0aGUgbGVhZGluZyBlZGdlIG9mIGhzeW5jLgorCSAqCisJICogT24gbW9zdCBwbGF0Zm9ybXMgaXQgc3RhcnRzIGNvdW50aW5nIGZyb20gdnRvdGFsLTEgb24gdGhlCisJICogZmlyc3QgYWN0aXZlIGxpbmUuIFRoYXQgbWVhbnMgdGhlIHNjYW5saW5lIGNvdW50ZXIgdmFsdWUgaXMKKwkgKiBhbHdheXMgb25lIGxlc3MgdGhhbiB3aGF0IHdlIHdvdWxkIGV4cGVjdC4gSWUuIGp1c3QgYWZ0ZXIKKwkgKiBzdGFydCBvZiB2YmxhbmssIHdoaWNoIGFsc28gb2NjdXJzIGF0IHN0YXJ0IG9mIGhzeW5jIChvbiB0aGUKKwkgKiBsYXN0IGFjdGl2ZSBsaW5lKSwgdGhlIHNjYW5saW5lIGNvdW50ZXIgd2lsbCByZWFkIHZibGFua19zdGFydC0xLgorCSAqCisJICogT24gZ2VuMiB0aGUgc2NhbmxpbmUgY291bnRlciBzdGFydHMgY291bnRpbmcgZnJvbSAxIGluc3RlYWQKKwkgKiBvZiB2dG90YWwtMSwgc28gd2UgaGF2ZSB0byBzdWJ0cmFjdCBvbmUgKG9yIHJhdGhlciBhZGQgdnRvdGFsLTEKKwkgKiB0byBrZWVwIHRoZSB2YWx1ZSBwb3NpdGl2ZSksIGluc3RlYWQgb2YgYWRkaW5nIG9uZS4KKwkgKgorCSAqIE9uIEhTVysgdGhlIGJlaGF2aW91ciBvZiB0aGUgc2NhbmxpbmUgY291bnRlciBkZXBlbmRzIG9uIHRoZSBvdXRwdXQKKwkgKiB0eXBlLiBGb3IgRFAgcG9ydHMgaXQgYmVoYXZlcyBsaWtlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zLCBidXQgb24gSERNSQorCSAqIHRoZXJlJ3MgYW4gZXh0cmEgMSBsaW5lIGRpZmZlcmVuY2UuIFNvIHdlIG5lZWQgdG8gYWRkIHR3byBpbnN0ZWFkIG9mCisJICogb25lIHRvIHRoZSB2YWx1ZS4KKwkgKi8KKwlpZiAoSVNfR0VOMihkZXYpKSB7CisJCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJmNydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlOworCQlpbnQgdnRvdGFsOworCisJCXZ0b3RhbCA9IG1vZGUtPmNydGNfdnRvdGFsOworCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJCXZ0b3RhbCAvPSAyOworCisJCWNydGMtPnNjYW5saW5lX29mZnNldCA9IHZ0b3RhbCAtIDE7CisJfSBlbHNlIGlmIChIQVNfRERJKGRldikgJiYKKwkJICAgaW50ZWxfcGlwZV9oYXNfdHlwZSgmY3J0Yy0+YmFzZSwgSU5URUxfT1VUUFVUX0hETUkpKSB7CisJCWNydGMtPnNjYW5saW5lX29mZnNldCA9IDI7CisJfSBlbHNlCisJCWNydGMtPnNjYW5saW5lX29mZnNldCA9IDE7Cit9CisKIHN0YXRpYyBpbnQgX19pbnRlbF9zZXRfbW9kZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkgICAgaW50IHgsIGludCB5LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKQEAgLTEwMDAyLDE1ICsxMDM2OCwzOCBAQAogCSAqIG9uIHRoZSBEUExMLgogCSAqLwogCWZvcl9lYWNoX2ludGVsX2NydGNfbWFza2VkKGRldiwgbW9kZXNldF9waXBlcywgaW50ZWxfY3J0YykgewotCQlyZXQgPSBpbnRlbF9jcnRjX21vZGVfc2V0KCZpbnRlbF9jcnRjLT5iYXNlLAotCQkJCQkgIHgsIHksIGZiKTsKKwkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiOworCisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LAorCQkJCQkJIHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKS0+b2JqLAorCQkJCQkJIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURSTV9FUlJPUigicGluICYgZmVuY2UgZmFpbGVkXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJZ290byBkb25lOworCQl9CisJCW9sZF9mYiA9IGNydGMtPnByaW1hcnktPmZiOworCQlpZiAob2xkX2ZiKQorCQkJaW50ZWxfdW5waW5fZmJfb2JqKHRvX2ludGVsX2ZyYW1lYnVmZmVyKG9sZF9mYiktPm9iaik7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJCWNydGMtPnByaW1hcnktPmZiID0gZmI7CisJCWNydGMtPnggPSB4OworCQljcnRjLT55ID0geTsKKworCQlyZXQgPSBkZXZfcHJpdi0+ZGlzcGxheS5jcnRjX21vZGVfc2V0KCZpbnRlbF9jcnRjLT5iYXNlLAorCQkJCQkJICAgICAgeCwgeSwgZmIpOwogCQlpZiAocmV0KQogCQkJZ290byBkb25lOwogCX0KIAogCS8qIE5vdyBlbmFibGUgdGhlIGNsb2NrcywgcGxhbmUsIHBpcGUsIGFuZCBjb25uZWN0b3JzIHRoYXQgd2Ugc2V0IHVwLiAqLwotCWZvcl9lYWNoX2ludGVsX2NydGNfbWFza2VkKGRldiwgcHJlcGFyZV9waXBlcywgaW50ZWxfY3J0YykKKwlmb3JfZWFjaF9pbnRlbF9jcnRjX21hc2tlZChkZXYsIHByZXBhcmVfcGlwZXMsIGludGVsX2NydGMpIHsKKwkJdXBkYXRlX3NjYW5saW5lX29mZnNldChpbnRlbF9jcnRjKTsKKwogCQlkZXZfcHJpdi0+ZGlzcGxheS5jcnRjX2VuYWJsZSgmaW50ZWxfY3J0Yy0+YmFzZSk7CisJfQogCiAJLyogRklYTUU6IGFkZCBzdWJwaXhlbCBvcmRlciAqLwogZG9uZToKQEAgLTEwMDg2LDcgKzEwNDc1LDcgQEAKIAkgKiByZXN0b3JlZCwgbm90IHRoZSBkcml2ZXJzIHBlcnNvbmFsIGJvb2trZWVwaW5nLgogCSAqLwogCWNvdW50ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCBjcnRjKSB7CiAJCWNvbmZpZy0+c2F2ZV9jcnRjX2VuYWJsZWRbY291bnQrK10gPSBjcnRjLT5lbmFibGVkOwogCX0KIApAQCAtMTAxMTIsNyArMTA1MDEsNyBAQAogCWludCBjb3VudDsKIAogCWNvdW50ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJY3J0Yy0+bmV3X2VuYWJsZWQgPSBjb25maWctPnNhdmVfY3J0Y19lbmFibGVkW2NvdW50KytdOwogCiAJCWlmIChjcnRjLT5uZXdfZW5hYmxlZCkKQEAgLTEwMjM2LDcgKzEwNjI1LDcgQEAKIAogCQkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gdG8gW05PQ1JUQ11cbiIsCiAJCQkJY29ubmVjdG9yLT5iYXNlLmJhc2UuaWQsCi0JCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmY29ubmVjdG9yLT5iYXNlKSk7CisJCQkJY29ubmVjdG9yLT5iYXNlLm5hbWUpOwogCQl9CiAKIApAQCAtMTAyNzEsNyArMTA2NjAsNyBAQAogCiAJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdIHRvIFtDUlRDOiVkXVxuIiwKIAkJCWNvbm5lY3Rvci0+YmFzZS5iYXNlLmlkLAotCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmY29ubmVjdG9yLT5iYXNlKSwKKwkJCWNvbm5lY3Rvci0+YmFzZS5uYW1lLAogCQkJbmV3X2NydGMtPmJhc2UuaWQpOwogCX0KIApAQCAtMTAzMDIsOCArMTA2OTEsNyBAQAogCX0KIAkvKiBOb3cgd2UndmUgYWxzbyB1cGRhdGVkIGVuY29kZXItPm5ld19jcnRjIGZvciBhbGwgZW5jb2RlcnMuICovCiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKLQkJCSAgICBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQljcnRjLT5uZXdfZW5hYmxlZCA9IGZhbHNlOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwKQEAgLTEwNTE2LDcgKzEwOTA0LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKIAogCS8qIE1ha2Ugc3VyZSBubyB0cmFuc2NvZGVyIGlzbid0IHN0aWxsIGRlcGVuZGluZyBvbiB1cy4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJaWYgKGludGVsX2NydGNfdG9fc2hhcmVkX2RwbGwoY3J0YykgPT0gcGxsKQogCQkJYXNzZXJ0X3BjaF90cmFuc2NvZGVyX2Rpc2FibGVkKGRldl9wcml2LCBjcnRjLT5waXBlKTsKIAl9CkBAIC0xMDU3MywxNiArMTA5NjEsNiBAQAogCiAJZHJtX2NydGNfaW5pdChkZXYsICZpbnRlbF9jcnRjLT5iYXNlLCAmaW50ZWxfY3J0Y19mdW5jcyk7CiAKLQlpZiAoSVNfR0VOMihkZXYpKSB7Ci0JCWludGVsX2NydGMtPm1heF9jdXJzb3Jfd2lkdGggPSBHRU4yX0NVUlNPUl9XSURUSDsKLQkJaW50ZWxfY3J0Yy0+bWF4X2N1cnNvcl9oZWlnaHQgPSBHRU4yX0NVUlNPUl9IRUlHSFQ7Ci0JfSBlbHNlIHsKLQkJaW50ZWxfY3J0Yy0+bWF4X2N1cnNvcl93aWR0aCA9IENVUlNPUl9XSURUSDsKLQkJaW50ZWxfY3J0Yy0+bWF4X2N1cnNvcl9oZWlnaHQgPSBDVVJTT1JfSEVJR0hUOwotCX0KLQlkZXYtPm1vZGVfY29uZmlnLmN1cnNvcl93aWR0aCA9IGludGVsX2NydGMtPm1heF9jdXJzb3Jfd2lkdGg7Ci0JZGV2LT5tb2RlX2NvbmZpZy5jdXJzb3JfaGVpZ2h0ID0gaW50ZWxfY3J0Yy0+bWF4X2N1cnNvcl9oZWlnaHQ7Ci0KIAlkcm1fbW9kZV9jcnRjX3NldF9nYW1tYV9zaXplKCZpbnRlbF9jcnRjLT5iYXNlLCAyNTYpOwogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogCQlpbnRlbF9jcnRjLT5sdXRfcltpXSA9IGk7CkBAIC0xMDYwMSwxOSArMTA5NzksMjcgQEAKIAkJaW50ZWxfY3J0Yy0+cGxhbmUgPSAhcGlwZTsKIAl9CiAKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYmFzZSA9IH4wOworCWludGVsX2NydGMtPmN1cnNvcl9jbnRsID0gfjA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnRlbF9jcnRjLT52Ymxfd2FpdCk7CisKIAlCVUdfT04ocGlwZSA+PSBBUlJBWV9TSVpFKGRldl9wcml2LT5wbGFuZV90b19jcnRjX21hcHBpbmcpIHx8CiAJICAgICAgIGRldl9wcml2LT5wbGFuZV90b19jcnRjX21hcHBpbmdbaW50ZWxfY3J0Yy0+cGxhbmVdICE9IE5VTEwpOwogCWRldl9wcml2LT5wbGFuZV90b19jcnRjX21hcHBpbmdbaW50ZWxfY3J0Yy0+cGxhbmVdID0gJmludGVsX2NydGMtPmJhc2U7CiAJZGV2X3ByaXYtPnBpcGVfdG9fY3J0Y19tYXBwaW5nW2ludGVsX2NydGMtPnBpcGVdID0gJmludGVsX2NydGMtPmJhc2U7CiAKIAlkcm1fY3J0Y19oZWxwZXJfYWRkKCZpbnRlbF9jcnRjLT5iYXNlLCAmaW50ZWxfaGVscGVyX2Z1bmNzKTsKKworCVdBUk5fT04oZHJtX2NydGNfaW5kZXgoJmludGVsX2NydGMtPmJhc2UpICE9IGludGVsX2NydGMtPnBpcGUpOwogfQogCiBlbnVtIHBpcGUgaW50ZWxfZ2V0X3BpcGVfZnJvbV9jb25uZWN0b3Ioc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGNvbm5lY3Rvci0+YmFzZS5lbmNvZGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OwogCi0JV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZjb25uZWN0b3ItPmJhc2UuZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpOworCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KSk7CiAKIAlpZiAoIWVuY29kZXIpCiAJCXJldHVybiBJTlZBTElEX1BJUEU7CkBAIC0xMDcwOSw3ICsxMTA5NSw3IEBACiAKIAlpbnRlbF9sdmRzX2luaXQoZGV2KTsKIAotCWlmICghSVNfVUxUKGRldikpCisJaWYgKCFJU19VTFQoZGV2KSAmJiAhSVNfQ0hFUlJZVklFVyhkZXYpICYmIGRldl9wcml2LT52YnQuaW50X2NydF9zdXBwb3J0KQogCQlpbnRlbF9jcnRfaW5pdChkZXYpOwogCiAJaWYgKEhBU19EREkoZGV2KSkgewpAQCAtMTA3NzMsNiArMTExNTksMTUgQEAKIAkJCQlpbnRlbF9kcF9pbml0KGRldiwgVkxWX0RJU1BMQVlfQkFTRSArIERQX0MsIFBPUlRfQyk7CiAJCX0KIAorCQlpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCQlpZiAoSTkxNV9SRUFEKFZMVl9ESVNQTEFZX0JBU0UgKyBDSFZfSERNSUQpICYgU0RWT19ERVRFQ1RFRCkgeworCQkJCWludGVsX2hkbWlfaW5pdChkZXYsIFZMVl9ESVNQTEFZX0JBU0UgKyBDSFZfSERNSUQsCisJCQkJCQlQT1JUX0QpOworCQkJCWlmIChJOTE1X1JFQUQoVkxWX0RJU1BMQVlfQkFTRSArIERQX0QpICYgRFBfREVURUNURUQpCisJCQkJCWludGVsX2RwX2luaXQoZGV2LCBWTFZfRElTUExBWV9CQVNFICsgRFBfRCwgUE9SVF9EKTsKKwkJCX0KKwkJfQorCiAJCWludGVsX2RzaV9pbml0KGRldik7CiAJfSBlbHNlIGlmIChTVVBQT1JUU19ESUdJVEFMX09VVFBVVFMoZGV2KSkgewogCQlib29sIGZvdW5kID0gZmFsc2U7CkBAIC0xMTAwMiw2ICsxMTM5Nyw4IEBACiAKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpIHx8IElTX0c0WChkZXYpKQogCQlkZXZfcHJpdi0+ZGlzcGxheS5maW5kX2RwbGwgPSBnNHhfZmluZF9iZXN0X2RwbGw7CisJZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5maW5kX2RwbGwgPSBjaHZfZmluZF9iZXN0X2RwbGw7CiAJZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKQogCQlkZXZfcHJpdi0+ZGlzcGxheS5maW5kX2RwbGwgPSB2bHZfZmluZF9iZXN0X2RwbGw7CiAJZWxzZSBpZiAoSVNfUElORVZJRVcoZGV2KSkKQEAgLTExMDgzLDYgKzExNDgwLDggQEAKIAkJfSBlbHNlIGlmIChJU19HRU42KGRldikpIHsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmZkaV9saW5rX3RyYWluID0gZ2VuNl9mZGlfbGlua190cmFpbjsKIAkJCWRldl9wcml2LT5kaXNwbGF5LndyaXRlX2VsZCA9IGlyb25sYWtlX3dyaXRlX2VsZDsKKwkJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfZ2xvYmFsX3Jlc291cmNlcyA9CisJCQkJc25iX21vZGVzZXRfZ2xvYmFsX3Jlc291cmNlczsKIAkJfSBlbHNlIGlmIChJU19JVllCUklER0UoZGV2KSkgewogCQkJLyogRklYTUU6IGRldGVjdCBCMCsgc3RlcHBpbmcgYW5kIHVzZSBhdXRvIHRyYWluaW5nICovCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5mZGlfbGlua190cmFpbiA9IGl2Yl9tYW51YWxfZmRpX2xpbmtfdHJhaW47CkBAIC0xMTIxMSw5ICsxMTYxMCw2IEBACiAJLyogVGhpbmtQYWQgVDYwIG5lZWRzIHBpcGUgQSBmb3JjZSBxdWlyayAoYnVnICMxNjQ5NCkgKi8KIAl7IDB4Mjc4MiwgMHgxN2FhLCAweDIwMWEsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCiAKLQkvKiA4MzAgbmVlZHMgdG8gbGVhdmUgcGlwZSBBICYgZHBsbCBBIHVwICovCi0JeyAweDM1NzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCi0KIAkvKiBMZW5vdm8gVTE2MCBjYW5ub3QgdXNlIFNTQyBvbiBMVkRTICovCiAJeyAweDAwNDYsIDB4MTdhYSwgMHgzOTIwLCBxdWlya19zc2NfZm9yY2VfZGlzYWJsZSB9LAogCkBAIC0xMTI4Nyw5ICsxMTY4Myw3IEBACiAKIAlpbnRlbF9yZXNldF9kcGlvKGRldik7CiAKLQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaW50ZWxfZW5hYmxlX2d0X3Bvd2Vyc2F2ZShkZXYpOwotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCiB2b2lkIGludGVsX21vZGVzZXRfc3VzcGVuZF9odyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTEzMzMsNiArMTE3MjcsMTUgQEAKIAkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwogCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOwogCX0KKworCWlmIChJU19HRU4yKGRldikpIHsKKwkJZGV2LT5tb2RlX2NvbmZpZy5jdXJzb3Jfd2lkdGggPSBHRU4yX0NVUlNPUl9XSURUSDsKKwkJZGV2LT5tb2RlX2NvbmZpZy5jdXJzb3JfaGVpZ2h0ID0gR0VOMl9DVVJTT1JfSEVJR0hUOworCX0gZWxzZSB7CisJCWRldi0+bW9kZV9jb25maWcuY3Vyc29yX3dpZHRoID0gTUFYX0NVUlNPUl9XSURUSDsKKwkJZGV2LT5tb2RlX2NvbmZpZy5jdXJzb3JfaGVpZ2h0ID0gTUFYX0NVUlNPUl9IRUlHSFQ7CisJfQorCiAJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZGV2X3ByaXYtPmd0dC5tYXBwYWJsZV9iYXNlOwogCiAJRFJNX0RFQlVHX0tNUygiJWQgZGlzcGxheSBwaXBlJXMgYXZhaWxhYmxlLlxuIiwKQEAgLTExMzYyLDEyICsxMTc2NSwxMSBAQAogCS8qIEp1c3QgaW4gY2FzZSB0aGUgQklPUyBpcyBkb2luZyBzb21ldGhpbmcgcXVlc3Rpb25hYmxlLiAqLwogCWludGVsX2Rpc2FibGVfZmJjKGRldik7CiAKLQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwogCWludGVsX21vZGVzZXRfc2V0dXBfaHdfc3RhdGUoZGV2LCBmYWxzZSk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKLQkJCSAgICBiYXNlLmhlYWQpIHsKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgY3J0YykgewogCQlpZiAoIWNydGMtPmFjdGl2ZSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMTM5NSw2ICsxMTc5Nyw3IEBACiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjcnQgPSBOVUxMOwogCXN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlIGxvYWRfZGV0ZWN0X3RlbXA7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IGN0eDsKIAogCS8qIFdlIGNhbid0IGp1c3Qgc3dpdGNoIG9uIHRoZSBwaXBlIEEsIHdlIG5lZWQgdG8gc2V0IHRoaW5ncyB1cCB3aXRoIGEKIAkgKiBwcm9wZXIgbW9kZSBhbmQgb3V0cHV0IGNvbmZpZ3VyYXRpb24uIEFzIGEgZ3Jvc3MgaGFjaywgZW5hYmxlIHBpcGUgQQpAQCAtMTE0MTEsOCArMTE4MTQsOCBAQAogCWlmICghY3J0KQogCQlyZXR1cm47CiAKLQlpZiAoaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoY3J0LCBOVUxMLCAmbG9hZF9kZXRlY3RfdGVtcCkpCi0JCWludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3RfcGlwZShjcnQsICZsb2FkX2RldGVjdF90ZW1wKTsKKwlpZiAoaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoY3J0LCBOVUxMLCAmbG9hZF9kZXRlY3RfdGVtcCwgJmN0eCkpCisJCWludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3RfcGlwZShjcnQsICZsb2FkX2RldGVjdF90ZW1wLCAmY3R4KTsKIAogCiB9CkBAIC0xMTQ0Nyw2ICsxMTg1MCwxMiBAQAogCXJlZyA9IFBJUEVDT05GKGNydGMtPmNvbmZpZy5jcHVfdHJhbnNjb2Rlcik7CiAJSTkxNV9XUklURShyZWcsIEk5MTVfUkVBRChyZWcpICYgflBJUEVDT05GX0ZSQU1FX1NUQVJUX0RFTEFZX01BU0spOwogCisJLyogcmVzdG9yZSB2YmxhbmsgaW50ZXJydXB0cyB0byBjb3JyZWN0IHN0YXRlICovCisJaWYgKGNydGMtPmFjdGl2ZSkKKwkJZHJtX3ZibGFua19vbihkZXYsIGNydGMtPnBpcGUpOworCWVsc2UKKwkJZHJtX3ZibGFua19vZmYoZGV2LCBjcnRjLT5waXBlKTsKKwogCS8qIFdlIG5lZWQgdG8gc2FuaXRpemUgdGhlIHBsYW5lIC0+IHBpcGUgbWFwcGluZyBmaXJzdCBiZWNhdXNlIHRoaXMgd2lsbAogCSAqIGRpc2FibGUgdGhlIGNydGMgKGFuZCBoZW5jZSBjaGFuZ2UgdGhlIHN0YXRlKSBpZiBpdCBpcyB3cm9uZy4gTm90ZQogCSAqIHRoYXQgZ2VuNCsgaGFzIGEgZml4ZWQgcGxhbmUgLT4gcGlwZSBtYXBwaW5nLiAgKi8KQEAgLTExNTI1LDE2ICsxMTkzNCwyNSBAQAogCQkJZW5jb2Rlci0+YmFzZS5jcnRjID0gTlVMTDsKIAkJfQogCX0KLQlpZiAoY3J0Yy0+YWN0aXZlKSB7CisKKwlpZiAoY3J0Yy0+YWN0aXZlIHx8IElTX1ZBTExFWVZJRVcoZGV2KSB8fCBJTlRFTF9JTkZPKGRldiktPmdlbiA8IDUpIHsKIAkJLyoKIAkJICogV2Ugc3RhcnQgb3V0IHdpdGggdW5kZXJydW4gcmVwb3J0aW5nIGRpc2FibGVkIHRvIGF2b2lkIHJhY2VzLgogCQkgKiBGb3IgY29ycmVjdCBib29ra2VlcGluZyBtYXJrIHRoaXMgb24gYWN0aXZlIGNydGNzLgogCQkgKgorCQkgKiBBbHNvIG9uIGdtY2ggcGxhdGZvcm1zIHdlIGRvbnQgaGF2ZSBhbnkgaGFyZHdhcmUgYml0cyB0bworCQkgKiBkaXNhYmxlIHRoZSB1bmRlcnJ1biByZXBvcnRpbmcuIFdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gc3RhcnQKKwkJICogb3V0IHdpdGggdW5kZXJydW4gcmVwb3J0aW5nIGRpc2FibGVkIGFsc28gb24gaW5hY3RpdmUgcGlwZXMsCisJCSAqIHNpbmNlIG90aGVyd2lzZSB3ZSdsbCBjb21wbGFpbiBhYm91dCB0aGUgZ2FyYmFnZSB3ZSByZWFkIHdoZW4KKwkJICogZS5nLiBjb21pbmcgdXAgYWZ0ZXIgcnVudGltZSBwbS4KKwkJICoKIAkJICogTm8gcHJvdGVjdGlvbiBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGlzIHJlcXVpcmVkIC0gYXQKIAkJICogd29yc3QgYSBmaWZvIHVuZGVycnVuIGhhcHBlbnMgd2hpY2ggYWxzbyBzZXRzIHRoaXMgdG8gZmFsc2UuCiAJCSAqLwogCQljcnRjLT5jcHVfZmlmb191bmRlcnJ1bl9kaXNhYmxlZCA9IHRydWU7CiAJCWNydGMtPnBjaF9maWZvX3VuZGVycnVuX2Rpc2FibGVkID0gdHJ1ZTsKKworCQl1cGRhdGVfc2NhbmxpbmVfb2Zmc2V0KGNydGMpOwogCX0KIH0KIApAQCAtMTE1NTIsNyArMTE5NzAsNyBAQAogCWlmIChlbmNvZGVyLT5jb25uZWN0b3JzX2FjdGl2ZSAmJiAhaGFzX2FjdGl2ZV9jcnRjKSB7CiAJCURSTV9ERUJVR19LTVMoIltFTkNPREVSOiVkOiVzXSBoYXMgYWN0aXZlIGNvbm5lY3RvcnMgYnV0IG5vIGFjdGl2ZSBwaXBlIVxuIiwKIAkJCSAgICAgIGVuY29kZXItPmJhc2UuYmFzZS5pZCwKLQkJCSAgICAgIGRybV9nZXRfZW5jb2Rlcl9uYW1lKCZlbmNvZGVyLT5iYXNlKSk7CisJCQkgICAgICBlbmNvZGVyLT5iYXNlLm5hbWUpOwogCiAJCS8qIENvbm5lY3RvciBpcyBhY3RpdmUsIGJ1dCBoYXMgbm8gYWN0aXZlIHBpcGUuIFRoaXMgaXMKIAkJICogZmFsbG91dCBmcm9tIG91ciByZXN1bWUgcmVnaXN0ZXIgcmVzdG9yaW5nLiBEaXNhYmxlCkBAIC0xMTU2MCw3ICsxMTk3OCw3IEBACiAJCWlmIChlbmNvZGVyLT5iYXNlLmNydGMpIHsKIAkJCURSTV9ERUJVR19LTVMoIltFTkNPREVSOiVkOiVzXSBtYW51YWxseSBkaXNhYmxlZFxuIiwKIAkJCQkgICAgICBlbmNvZGVyLT5iYXNlLmJhc2UuaWQsCi0JCQkJICAgICAgZHJtX2dldF9lbmNvZGVyX25hbWUoJmVuY29kZXItPmJhc2UpKTsKKwkJCQkgICAgICBlbmNvZGVyLT5iYXNlLm5hbWUpOwogCQkJZW5jb2Rlci0+ZGlzYWJsZShlbmNvZGVyKTsKIAkJfQogCQllbmNvZGVyLT5iYXNlLmNydGMgPSBOVUxMOwpAQCAtMTE2MTEsNiArMTIwMjksMTYgQEAKIAlpOTE1X3JlZGlzYWJsZV92Z2FfcG93ZXJfb24oZGV2KTsKIH0KIAorc3RhdGljIGJvb2wgcHJpbWFyeV9nZXRfaHdfc3RhdGUoc3RydWN0IGludGVsX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gY3J0Yy0+YmFzZS5kZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFjcnRjLT5hY3RpdmUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBJOTE1X1JFQUQoRFNQQ05UUihjcnRjLT5wbGFuZSkpICYgRElTUExBWV9QTEFORV9FTkFCTEU7Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX21vZGVzZXRfcmVhZG91dF9od19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTYyMCw4ICsxMjA0OCw3IEBACiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCWludCBpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCi0JCQkgICAgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJbWVtc2V0KCZjcnRjLT5jb25maWcsIDAsIHNpemVvZihjcnRjLT5jb25maWcpKTsKIAogCQljcnRjLT5jb25maWcucXVpcmtzIHw9IFBJUEVfQ09ORklHX1FVSVJLX0lOSEVSSVRFRF9NT0RFOwpAQCAtMTE2MzAsNyArMTIwNTcsNyBAQAogCQkJCQkJCQkgJmNydGMtPmNvbmZpZyk7CiAKIAkJY3J0Yy0+YmFzZS5lbmFibGVkID0gY3J0Yy0+YWN0aXZlOwotCQljcnRjLT5wcmltYXJ5X2VuYWJsZWQgPSBjcnRjLT5hY3RpdmU7CisJCWNydGMtPnByaW1hcnlfZW5hYmxlZCA9IHByaW1hcnlfZ2V0X2h3X3N0YXRlKGNydGMpOwogCiAJCURSTV9ERUJVR19LTVMoIltDUlRDOiVkXSBodyBzdGF0ZSByZWFkb3V0OiAlc1xuIiwKIAkJCSAgICAgIGNydGMtPmJhc2UuYmFzZS5pZCwKQEAgLTExNjQ2LDggKzEyMDczLDcgQEAKIAogCQlwbGwtPm9uID0gcGxsLT5nZXRfaHdfc3RhdGUoZGV2X3ByaXYsIHBsbCwgJnBsbC0+aHdfc3RhdGUpOwogCQlwbGwtPmFjdGl2ZSA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LAotCQkJCSAgICBiYXNlLmhlYWQpIHsKKwkJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJCWlmIChjcnRjLT5hY3RpdmUgJiYgaW50ZWxfY3J0Y190b19zaGFyZWRfZHBsbChjcnRjKSA9PSBwbGwpCiAJCQkJcGxsLT5hY3RpdmUrKzsKIAkJfQpAQCAtMTE2NzIsNyArMTIwOTgsNyBAQAogCQllbmNvZGVyLT5jb25uZWN0b3JzX2FjdGl2ZSA9IGZhbHNlOwogCQlEUk1fREVCVUdfS01TKCJbRU5DT0RFUjolZDolc10gaHcgc3RhdGUgcmVhZG91dDogJXMsIHBpcGUgJWNcbiIsCiAJCQkgICAgICBlbmNvZGVyLT5iYXNlLmJhc2UuaWQsCi0JCQkgICAgICBkcm1fZ2V0X2VuY29kZXJfbmFtZSgmZW5jb2Rlci0+YmFzZSksCisJCQkgICAgICBlbmNvZGVyLT5iYXNlLm5hbWUsCiAJCQkgICAgICBlbmNvZGVyLT5iYXNlLmNydGMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAogCQkJICAgICAgcGlwZV9uYW1lKHBpcGUpKTsKIAl9CkBAIC0xMTY4OSw3ICsxMjExNSw3IEBACiAJCX0KIAkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gaHcgc3RhdGUgcmVhZG91dDogJXNcbiIsCiAJCQkgICAgICBjb25uZWN0b3ItPmJhc2UuYmFzZS5pZCwKLQkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoJmNvbm5lY3Rvci0+YmFzZSksCisJCQkgICAgICBjb25uZWN0b3ItPmJhc2UubmFtZSwKIAkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5lbmNvZGVyID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJfQogfQpAQCAtMTE3MTIsOCArMTIxMzgsNyBAQAogCSAqIE5vdGUgdGhhdCB0aGlzIGNvdWxkIGdvIGF3YXkgaWYgd2UgbW92ZSB0byB1c2luZyBjcnRjX2NvbmZpZwogCSAqIGNoZWNraW5nIGV2ZXJ5d2hlcmUuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCi0JCQkgICAgYmFzZS5oZWFkKSB7CisJZm9yX2VhY2hfaW50ZWxfY3J0YyhkZXYsIGNydGMpIHsKIAkJaWYgKGNydGMtPmFjdGl2ZSAmJiBpOTE1LmZhc3Rib290KSB7CiAJCQlpbnRlbF9tb2RlX2Zyb21fcGlwZV9jb25maWcoJmNydGMtPmJhc2UubW9kZSwgJmNydGMtPmNvbmZpZyk7CiAJCQlEUk1fREVCVUdfS01TKCJbQ1JUQzolZF0gZm91bmQgYWN0aXZlIG1vZGU6ICIsCkBAIC0xMTc4OSw3ICsxMjIxNCw3IEBACiAJICogZm9yIHRoaXMuCiAJICovCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJZm9yX2VhY2hfY3J0YyhkZXYsIGMpIHsKIAkJaWYgKCFjLT5wcmltYXJ5LT5mYikKIAkJCWNvbnRpbnVlOwogCkBAIC0xMTgzNSw3ICsxMjI2MCw3IEBACiAKIAlpbnRlbF91bnJlZ2lzdGVyX2RzbV9oYW5kbGVyKCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCBjcnRjKSB7CiAJCS8qIFNraXAgaW5hY3RpdmUgQ1JUQ3MgKi8KIAkJaWYgKCFjcnRjLT5wcmltYXJ5LT5mYikKIAkJCWNvbnRpbnVlOwpAQCAtMTE5MzMsNiArMTIzNTgsNyBAQAogCXN0cnVjdCBpbnRlbF9waXBlX2Vycm9yX3N0YXRlIHsKIAkJYm9vbCBwb3dlcl9kb21haW5fb247CiAJCXUzMiBzb3VyY2U7CisJCXUzMiBzdGF0OwogCX0gcGlwZVtJOTE1X01BWF9QSVBFU107CiAKIAlzdHJ1Y3QgaW50ZWxfcGxhbmVfZXJyb3Jfc3RhdGUgewpAQCAtMTE5OTAsMTUgKzEyNDE2LDkgQEAKIAkJaWYgKCFlcnJvci0+cGlwZVtpXS5wb3dlcl9kb21haW5fb24pCiAJCQljb250aW51ZTsKIAotCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPD0gNiB8fCBJU19WQUxMRVlWSUVXKGRldikpIHsKLQkJCWVycm9yLT5jdXJzb3JbaV0uY29udHJvbCA9IEk5MTVfUkVBRChDVVJDTlRSKGkpKTsKLQkJCWVycm9yLT5jdXJzb3JbaV0ucG9zaXRpb24gPSBJOTE1X1JFQUQoQ1VSUE9TKGkpKTsKLQkJCWVycm9yLT5jdXJzb3JbaV0uYmFzZSA9IEk5MTVfUkVBRChDVVJCQVNFKGkpKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yLT5jdXJzb3JbaV0uY29udHJvbCA9IEk5MTVfUkVBRChDVVJDTlRSX0lWQihpKSk7Ci0JCQllcnJvci0+Y3Vyc29yW2ldLnBvc2l0aW9uID0gSTkxNV9SRUFEKENVUlBPU19JVkIoaSkpOwotCQkJZXJyb3ItPmN1cnNvcltpXS5iYXNlID0gSTkxNV9SRUFEKENVUkJBU0VfSVZCKGkpKTsKLQkJfQorCQllcnJvci0+Y3Vyc29yW2ldLmNvbnRyb2wgPSBJOTE1X1JFQUQoQ1VSQ05UUihpKSk7CisJCWVycm9yLT5jdXJzb3JbaV0ucG9zaXRpb24gPSBJOTE1X1JFQUQoQ1VSUE9TKGkpKTsKKwkJZXJyb3ItPmN1cnNvcltpXS5iYXNlID0gSTkxNV9SRUFEKENVUkJBU0UoaSkpOwogCiAJCWVycm9yLT5wbGFuZVtpXS5jb250cm9sID0gSTkxNV9SRUFEKERTUENOVFIoaSkpOwogCQllcnJvci0+cGxhbmVbaV0uc3RyaWRlID0gSTkxNV9SRUFEKERTUFNUUklERShpKSk7CkBAIC0xMjAxNCw2ICsxMjQzNCw5IEBACiAJCX0KIAogCQllcnJvci0+cGlwZVtpXS5zb3VyY2UgPSBJOTE1X1JFQUQoUElQRVNSQyhpKSk7CisKKwkJaWYgKCFIQVNfUENIX1NQTElUKGRldikpCisJCQllcnJvci0+cGlwZVtpXS5zdGF0ID0gSTkxNV9SRUFEKFBJUEVTVEFUKGkpKTsKIAl9CiAKIAllcnJvci0+bnVtX3RyYW5zY29kZXJzID0gSU5URUxfSU5GTyhkZXYpLT5udW1fcGlwZXM7CkBAIC0xMjA2NCw2ICsxMjQ4Nyw3IEBACiAJCWVycl9wcmludGYobSwgIiAgUG93ZXI6ICVzXG4iLAogCQkJICAgZXJyb3ItPnBpcGVbaV0ucG93ZXJfZG9tYWluX29uID8gIm9uIiA6ICJvZmYiKTsKIAkJZXJyX3ByaW50ZihtLCAiICBTUkM6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLnNvdXJjZSk7CisJCWVycl9wcmludGYobSwgIiAgU1RBVDogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0uc3RhdCk7CiAKIAkJZXJyX3ByaW50ZihtLCAiUGxhbmUgWyVkXTpcbiIsIGkpOwogCQllcnJfcHJpbnRmKG0sICIgIENOVFI6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5jb250cm9sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDJhMDBjYjguLjUyZmRhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtNjQsNiArNjQsMjQgQEAKIAkJeyAucDEgPSAyLCAucDIgPSAyLCAubiA9IDEsIC5tMSA9IDIsIC5tMiA9IDI3IH0gfQogfTsKIAorLyoKKyAqIENIViBzdXBwb3J0cyBlRFAgMS40IHRoYXQgaGF2ZSAgbW9yZSBsaW5rIHJhdGVzLgorICogQmVsb3cgb25seSBwcm92aWRlcyB0aGUgZml4ZWQgcmF0ZSBidXQgZXhjbHVkZSB2YXJpYWJsZSByYXRlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGRwX2xpbmtfZHBsbCBjaHZfZHBsbFtdID0geworCS8qCisJICogQ0hWIHJlcXVpcmVzIHRvIHByb2dyYW0gZnJhY3Rpb25hbCBkaXZpc2lvbiBmb3IgbTIuCisJICogbTIgaXMgc3RvcmVkIGluIGZpeGVkIHBvaW50IGZvcm1hdCB1c2luZyBmb3JtdWxhIGJlbG93CisJICogKG0yX2ludCA8PCAyMikgfCBtMl9mcmFjdGlvbgorCSAqLworCXsgRFBfTElOS19CV18xXzYyLAkvKiBtMl9pbnQgPSAzMiwgbTJfZnJhY3Rpb24gPSAxNjc3NzIyICovCisJCXsgLnAxID0gNCwgLnAyID0gMiwgLm4gPSAxLCAubTEgPSAyLCAubTIgPSAweDgxOTk5OWEgfSB9LAorCXsgRFBfTElOS19CV18yXzcsCS8qIG0yX2ludCA9IDI3LCBtMl9mcmFjdGlvbiA9IDAgKi8KKwkJeyAucDEgPSA0LCAucDIgPSAxLCAubiA9IDEsIC5tMSA9IDIsIC5tMiA9IDB4NmMwMDAwMCB9IH0sCisJeyBEUF9MSU5LX0JXXzVfNCwJLyogbTJfaW50ID0gMjcsIG0yX2ZyYWN0aW9uID0gMCAqLworCQl7IC5wMSA9IDIsIC5wMiA9IDEsIC5uID0gMSwgLm0xID0gMiwgLm0yID0gMHg2YzAwMDAwIH0gfQorfTsKKwogLyoqCiAgKiBpc19lZHAgLSBpcyB0aGUgZ2l2ZW4gcG9ydCBhdHRhY2hlZCB0byBhbiBlRFAgcGFuZWwgKGVpdGhlciBDUFUgb3IgUENIKQogICogQGludGVsX2RwOiBEUCBzdHJ1Y3QKQEAgLTMzMCw4ICszNDgsMTIgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHBfdG9fZGV2KGludGVsX2RwKTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0ID0gZHBfdG9fZGlnX3BvcnQoaW50ZWxfZHApOworCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0gJmludGVsX2RpZ19wb3J0LT5iYXNlOworCWVudW0gaW50ZWxfZGlzcGxheV9wb3dlcl9kb21haW4gcG93ZXJfZG9tYWluOwogCi0JcmV0dXJuICFkZXZfcHJpdi0+cG0uc3VzcGVuZGVkICYmCisJcG93ZXJfZG9tYWluID0gaW50ZWxfZGlzcGxheV9wb3J0X3Bvd2VyX2RvbWFpbihpbnRlbF9lbmNvZGVyKTsKKwlyZXR1cm4gaW50ZWxfZGlzcGxheV9wb3dlcl9lbmFibGVkKGRldl9wcml2LCBwb3dlcl9kb21haW4pICYmCiAJICAgICAgIChJOTE1X1JFQUQoX3BwX2N0cmxfcmVnKGludGVsX2RwKSkgJiBFRFBfRk9SQ0VfVkREKSAhPSAwOwogfQogCkBAIC02OTcsOSArNzE5LDkgQEAKIAlEUk1fREVCVUdfS01TKCJyZWdpc3RlcmluZyAlcyBidXMgZm9yICVzXG4iLCBuYW1lLAogCQkgICAgICBjb25uZWN0b3ItPmJhc2Uua2Rldi0+a29iai5uYW1lKTsKIAotCXJldCA9IGRybV9kcF9hdXhfcmVnaXN0ZXJfaTJjX2J1cygmaW50ZWxfZHAtPmF1eCk7CisJcmV0ID0gZHJtX2RwX2F1eF9yZWdpc3RlcigmaW50ZWxfZHAtPmF1eCk7CiAJaWYgKHJldCA8IDApIHsKLQkJRFJNX0VSUk9SKCJkcm1fZHBfYXV4X3JlZ2lzdGVyX2kyY19idXMoKSBmb3IgJXMgZmFpbGVkICglZClcbiIsCisJCURSTV9FUlJPUigiZHJtX2RwX2F1eF9yZWdpc3RlcigpIGZvciAlcyBmYWlsZWQgKCVkKVxuIiwKIAkJCSAgbmFtZSwgcmV0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTcwOSw3ICs3MzEsNyBAQAogCQkJCWludGVsX2RwLT5hdXguZGRjLmRldi5rb2JqLm5hbWUpOwogCWlmIChyZXQgPCAwKSB7CiAJCURSTV9FUlJPUigic3lzZnNfY3JlYXRlX2xpbmsoKSBmb3IgJXMgZmFpbGVkICglZClcbiIsIG5hbWUsIHJldCk7Ci0JCWRybV9kcF9hdXhfdW5yZWdpc3Rlcl9pMmNfYnVzKCZpbnRlbF9kcC0+YXV4KTsKKwkJZHJtX2RwX2F1eF91bnJlZ2lzdGVyKCZpbnRlbF9kcC0+YXV4KTsKIAl9CiB9CiAKQEAgLTczOSw2ICs3NjEsOSBAQAogCX0gZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCWRpdmlzb3IgPSBwY2hfZHBsbDsKIAkJY291bnQgPSBBUlJBWV9TSVpFKHBjaF9kcGxsKTsKKwl9IGVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlkaXZpc29yID0gY2h2X2RwbGw7CisJCWNvdW50ID0gQVJSQVlfU0laRShjaHZfZHBsbCk7CiAJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJZGl2aXNvciA9IHZsdl9kcGxsOwogCQljb3VudCA9IEFSUkFZX1NJWkUodmx2X2RwbGwpOwpAQCAtNzU1LDYgKzc4MCwyMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK2ludGVsX2RwX3NldF9tMl9uMihzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0Yywgc3RydWN0IGludGVsX2xpbmtfbV9uICptX24pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZW51bSB0cmFuc2NvZGVyIHRyYW5zY29kZXIgPSBjcnRjLT5jb25maWcuY3B1X3RyYW5zY29kZXI7CisKKwlJOTE1X1dSSVRFKFBJUEVfREFUQV9NMih0cmFuc2NvZGVyKSwKKwkJVFVfU0laRShtX24tPnR1KSB8IG1fbi0+Z21jaF9tKTsKKwlJOTE1X1dSSVRFKFBJUEVfREFUQV9OMih0cmFuc2NvZGVyKSwgbV9uLT5nbWNoX24pOworCUk5MTVfV1JJVEUoUElQRV9MSU5LX00yKHRyYW5zY29kZXIpLCBtX24tPmxpbmtfbSk7CisJSTkxNV9XUklURShQSVBFX0xJTktfTjIodHJhbnNjb2RlciksIG1fbi0+bGlua19uKTsKK30KKwogYm9vbAogaW50ZWxfZHBfY29tcHV0ZV9jb25maWcoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCiAJCQlzdHJ1Y3QgaW50ZWxfY3J0Y19jb25maWcgKnBpcGVfY29uZmlnKQpAQCAtNzgwLDYgKzgxOSw3IEBACiAJCXBpcGVfY29uZmlnLT5oYXNfcGNoX2VuY29kZXIgPSB0cnVlOwogCiAJcGlwZV9jb25maWctPmhhc19kcF9lbmNvZGVyID0gdHJ1ZTsKKwlwaXBlX2NvbmZpZy0+aGFzX2F1ZGlvID0gaW50ZWxfZHAtPmhhc19hdWRpbzsKIAogCWlmIChpc19lZHAoaW50ZWxfZHApICYmIGludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZml4ZWRfbW9kZSkgewogCQlpbnRlbF9maXhlZF9wYW5lbF9tb2RlKGludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZml4ZWRfbW9kZSwKQEAgLTg4MCw2ICs5MjAsMTQgQEAKIAkJCSAgICAgICBwaXBlX2NvbmZpZy0+cG9ydF9jbG9jaywKIAkJCSAgICAgICAmcGlwZV9jb25maWctPmRwX21fbik7CiAKKwlpZiAoaW50ZWxfY29ubmVjdG9yLT5wYW5lbC5kb3duY2xvY2tfbW9kZSAhPSBOVUxMICYmCisJCWludGVsX2RwLT5kcnJzX3N0YXRlLnR5cGUgPT0gU0VBTUxFU1NfRFJSU19TVVBQT1JUKSB7CisJCQlpbnRlbF9saW5rX2NvbXB1dGVfbV9uKGJwcCwgbGFuZV9jb3VudCwKKwkJCQlpbnRlbF9jb25uZWN0b3ItPnBhbmVsLmRvd25jbG9ja19tb2RlLT5jbG9jaywKKwkJCQlwaXBlX2NvbmZpZy0+cG9ydF9jbG9jaywKKwkJCQkmcGlwZV9jb25maWctPmRwX20yX24yKTsKKwl9CisKIAlpbnRlbF9kcF9zZXRfY2xvY2soZW5jb2RlciwgcGlwZV9jb25maWcsIGludGVsX2RwLT5saW5rX2J3KTsKIAogCXJldHVybiB0cnVlOwpAQCAtOTE1LDcgKzk2Myw3IEBACiAJdWRlbGF5KDUwMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2RwX21vZGVfc2V0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQorc3RhdGljIHZvaWQgaW50ZWxfZHBfcHJlcGFyZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk1MCw3ICs5OTgsNyBAQAogCWludGVsX2RwLT5EUCB8PSBEUF9WT0xUQUdFXzBfNCB8IERQX1BSRV9FTVBIQVNJU18wOwogCWludGVsX2RwLT5EUCB8PSBEUF9QT1JUX1dJRFRIKGludGVsX2RwLT5sYW5lX2NvdW50KTsKIAotCWlmIChpbnRlbF9kcC0+aGFzX2F1ZGlvKSB7CisJaWYgKGNydGMtPmNvbmZpZy5oYXNfYXVkaW8pIHsKIAkJRFJNX0RFQlVHX0RSSVZFUigiRW5hYmxpbmcgRFAgYXVkaW8gb24gcGlwZSAlY1xuIiwKIAkJCQkgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKIAkJaW50ZWxfZHAtPkRQIHw9IERQX0FVRElPX09VVFBVVF9FTkFCTEU7CkBAIC05ODMsMTQgKzEwMzEsMTUgQEAKIAkJaWYgKGRybV9kcF9lbmhhbmNlZF9mcmFtZV9jYXAoaW50ZWxfZHAtPmRwY2QpKQogCQkJaW50ZWxfZHAtPkRQIHw9IERQX0VOSEFOQ0VEX0ZSQU1JTkc7CiAKLQkJaWYgKGNydGMtPnBpcGUgPT0gMSkKLQkJCWludGVsX2RwLT5EUCB8PSBEUF9QSVBFQl9TRUxFQ1Q7CisJCWlmICghSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCQlpZiAoY3J0Yy0+cGlwZSA9PSAxKQorCQkJCWludGVsX2RwLT5EUCB8PSBEUF9QSVBFQl9TRUxFQ1Q7CisJCX0gZWxzZSB7CisJCQlpbnRlbF9kcC0+RFAgfD0gRFBfUElQRV9TRUxFQ1RfQ0hWKGNydGMtPnBpcGUpOworCQl9CiAJfSBlbHNlIHsKIAkJaW50ZWxfZHAtPkRQIHw9IERQX0xJTktfVFJBSU5fT0ZGX0NQVDsKIAl9Ci0KLQlpZiAocG9ydCA9PSBQT1JUX0EgJiYgIUlTX1ZBTExFWVZJRVcoZGV2KSkKLQkJaXJvbmxha2Vfc2V0X3BsbF9jcHVfZWRwKGludGVsX2RwKTsKIH0KIAogI2RlZmluZSBJRExFX09OX01BU0sJCShQUF9PTiB8IFBQX1NFUVVFTkNFX01BU0sgfCAwICAgICAgICAgICAgICAgICAgICAgfCBQUF9TRVFVRU5DRV9TVEFURV9NQVNLKQpAQCAtMTA4Miw3ICsxMTMxLDEwIEBACiBzdGF0aWMgYm9vbCBfZWRwX3BhbmVsX3ZkZF9vbihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcF90b19kZXYoaW50ZWxfZHApOworCXN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0ID0gZHBfdG9fZGlnX3BvcnQoaW50ZWxfZHApOworCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0gJmludGVsX2RpZ19wb3J0LT5iYXNlOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBwb3dlcl9kb21haW47CiAJdTMyIHBwOwogCXUzMiBwcF9zdGF0X3JlZywgcHBfY3RybF9yZWc7CiAJYm9vbCBuZWVkX3RvX2Rpc2FibGUgPSAhaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkOwpAQCAtMTA5NSw3ICsxMTQ3LDggQEAKIAlpZiAoZWRwX2hhdmVfcGFuZWxfdmRkKGludGVsX2RwKSkKIAkJcmV0dXJuIG5lZWRfdG9fZGlzYWJsZTsKIAotCWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKKwlwb3dlcl9kb21haW4gPSBpbnRlbF9kaXNwbGF5X3BvcnRfcG93ZXJfZG9tYWluKGludGVsX2VuY29kZXIpOworCWludGVsX2Rpc3BsYXlfcG93ZXJfZ2V0KGRldl9wcml2LCBwb3dlcl9kb21haW4pOwogCiAJRFJNX0RFQlVHX0tNUygiVHVybmluZyBlRFAgVkREIG9uXG4iKTsKIApAQCAtMTEzOSw5ICsxMTkyLDE0IEBACiAJdTMyIHBwOwogCXUzMiBwcF9zdGF0X3JlZywgcHBfY3RybF9yZWc7CiAKLQlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpKTsKKwlXQVJOX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCkpOwogCiAJaWYgKCFpbnRlbF9kcC0+d2FudF9wYW5lbF92ZGQgJiYgZWRwX2hhdmVfcGFuZWxfdmRkKGludGVsX2RwKSkgeworCQlzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCA9CisJCQkJCQlkcF90b19kaWdfcG9ydChpbnRlbF9kcCk7CisJCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0gJmludGVsX2RpZ19wb3J0LT5iYXNlOworCQllbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIHBvd2VyX2RvbWFpbjsKKwogCQlEUk1fREVCVUdfS01TKCJUdXJuaW5nIGVEUCBWREQgb2ZmXG4iKTsKIAogCQlwcCA9IGlyb25sYWtlX2dldF9wcF9jb250cm9sKGludGVsX2RwKTsKQEAgLTExNjAsNyArMTIxOCw4IEBACiAJCWlmICgocHAgJiBQT1dFUl9UQVJHRVRfT04pID09IDApCiAJCQlpbnRlbF9kcC0+bGFzdF9wb3dlcl9jeWNsZSA9IGppZmZpZXM7CiAKLQkJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOworCQlwb3dlcl9kb21haW4gPSBpbnRlbF9kaXNwbGF5X3BvcnRfcG93ZXJfZG9tYWluKGludGVsX2VuY29kZXIpOworCQlpbnRlbF9kaXNwbGF5X3Bvd2VyX3B1dChkZXZfcHJpdiwgcG93ZXJfZG9tYWluKTsKIAl9CiB9CiAKQEAgLTExNzAsOSArMTIyOSw5IEBACiAJCQkJCQkgc3RydWN0IGludGVsX2RwLCBwYW5lbF92ZGRfd29yayk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwX3RvX2RldihpbnRlbF9kcCk7CiAKLQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgsIE5VTEwpOwogCWVkcF9wYW5lbF92ZGRfb2ZmX3N5bmMoaW50ZWxfZHApOwotCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBlZHBfcGFuZWxfdmRkX29mZihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBib29sIHN5bmMpCkBAIC0xMjQ0LDggKzEzMDMsMTEgQEAKIAogdm9pZCBpbnRlbF9lZHBfcGFuZWxfb2ZmKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBkcF90b19kaWdfcG9ydChpbnRlbF9kcCk7CisJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIgPSAmaW50ZWxfZGlnX3BvcnQtPmJhc2U7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwX3RvX2RldihpbnRlbF9kcCk7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwllbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIHBvd2VyX2RvbWFpbjsKIAl1MzIgcHA7CiAJdTMyIHBwX2N0cmxfcmVnOwogCkBAIC0xMjc1LDcgKzEzMzcsOCBAQAogCXdhaXRfcGFuZWxfb2ZmKGludGVsX2RwKTsKIAogCS8qIFdlIGdvdCBhIHJlZmVyZW5jZSB3aGVuIHdlIGVuYWJsZWQgdGhlIFZERC4gKi8KLQlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJcG93ZXJfZG9tYWluID0gaW50ZWxfZGlzcGxheV9wb3J0X3Bvd2VyX2RvbWFpbihpbnRlbF9lbmNvZGVyKTsKKwlpbnRlbF9kaXNwbGF5X3Bvd2VyX3B1dChkZXZfcHJpdiwgcG93ZXJfZG9tYWluKTsKIH0KIAogdm9pZCBpbnRlbF9lZHBfYmFja2xpZ2h0X29uKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCkBAIC0xNDMyLDYgKzE0OTUsOCBAQAogCiAJaWYgKHBvcnQgPT0gUE9SVF9BICYmIElTX0dFTjcoZGV2KSAmJiAhSVNfVkFMTEVZVklFVyhkZXYpKSB7CiAJCSpwaXBlID0gUE9SVF9UT19QSVBFX0NQVCh0bXApOworCX0gZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCSpwaXBlID0gRFBfUE9SVF9UT19QSVBFX0NIVih0bXApOwogCX0gZWxzZSBpZiAoIUhBU19QQ0hfQ1BUKGRldikgfHwgcG9ydCA9PSBQT1JUX0EpIHsKIAkJKnBpcGUgPSBQT1JUX1RPX1BJUEUodG1wKTsKIAl9IGVsc2UgewpAQCAtMTQ3OSw4ICsxNTQ0LDExIEBACiAJc3RydWN0IGludGVsX2NydGMgKmNydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CiAJaW50IGRvdGNsb2NrOwogCisJdG1wID0gSTkxNV9SRUFEKGludGVsX2RwLT5vdXRwdXRfcmVnKTsKKwlpZiAodG1wICYgRFBfQVVESU9fT1VUUFVUX0VOQUJMRSkKKwkJcGlwZV9jb25maWctPmhhc19hdWRpbyA9IHRydWU7CisKIAlpZiAoKHBvcnQgPT0gUE9SVF9BKSB8fCAhSEFTX1BDSF9DUFQoZGV2KSkgewotCQl0bXAgPSBJOTE1X1JFQUQoaW50ZWxfZHAtPm91dHB1dF9yZWcpOwogCQlpZiAodG1wICYgRFBfU1lOQ19IU19ISUdIKQogCQkJZmxhZ3MgfD0gRFJNX01PREVfRkxBR19QSFNZTkM7CiAJCWVsc2UKQEAgLTE4MTYsMTcgKzE4ODQsNTkgQEAKIAkJaW50ZWxfZHBfbGlua19kb3duKGludGVsX2RwKTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfcG9zdF9kaXNhYmxlX2RwKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQorc3RhdGljIHZvaWQgZzR4X3Bvc3RfZGlzYWJsZV9kcChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKCZlbmNvZGVyLT5iYXNlKTsKIAllbnVtIHBvcnQgcG9ydCA9IGRwX3RvX2RpZ19wb3J0KGludGVsX2RwKS0+cG9ydDsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7CiAKLQlpZiAocG9ydCA9PSBQT1JUX0EgfHwgSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0JCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7Ci0JCWlmICghSVNfVkFMTEVZVklFVyhkZXYpKQotCQkJaXJvbmxha2VfZWRwX3BsbF9vZmYoaW50ZWxfZHApOwotCX0KKwlpZiAocG9ydCAhPSBQT1JUX0EpCisJCXJldHVybjsKKworCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CisJaXJvbmxha2VfZWRwX3BsbF9vZmYoaW50ZWxfZHApOworfQorCitzdGF0aWMgdm9pZCB2bHZfcG9zdF9kaXNhYmxlX2RwKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoJmVuY29kZXItPmJhc2UpOworCisJaW50ZWxfZHBfbGlua19kb3duKGludGVsX2RwKTsKK30KKworc3RhdGljIHZvaWQgY2h2X3Bvc3RfZGlzYWJsZV9kcChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKCZlbmNvZGVyLT5iYXNlKTsKKwlzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICpkcG9ydCA9IGRwX3RvX2RpZ19wb3J0KGludGVsX2RwKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9CisJCXRvX2ludGVsX2NydGMoZW5jb2Rlci0+YmFzZS5jcnRjKTsKKwllbnVtIGRwaW9fY2hhbm5lbCBjaCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKKwllbnVtIHBpcGUgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJdTMyIHZhbDsKKworCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CisKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKKworCS8qIFByb3BhZ2F0ZSBzb2Z0IHJlc2V0IHRvIGRhdGEgbGFuZSByZXNldCAqLworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEoY2gpKTsKKwl2YWwgfD0gQ0hWX1BDU19SRVFfU09GVFJFU0VUX0VOOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcxKGNoKSwgdmFsKTsKKworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEoY2gpKTsKKwl2YWwgfD0gQ0hWX1BDU19SRVFfU09GVFJFU0VUX0VOOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcxKGNoKSwgdmFsKTsKKworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzAoY2gpKTsKKwl2YWwgJj0gfihEUElPX1BDU19UWF9MQU5FMl9SRVNFVCB8IERQSU9fUENTX1RYX0xBTkUxX1JFU0VUKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMChjaCksIHZhbCk7CisKKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcwKGNoKSk7CisJdmFsICY9IH4oRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzAoY2gpLCB2YWwpOworCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfZW5hYmxlX2RwKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTg2OCw4ICsxOTc4LDEzIEBACiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcCgmZW5jb2Rlci0+YmFzZSk7CiAJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQgPSBkcF90b19kaWdfcG9ydChpbnRlbF9kcCk7CiAKLQlpZiAoZHBvcnQtPnBvcnQgPT0gUE9SVF9BKQorCWludGVsX2RwX3ByZXBhcmUoZW5jb2Rlcik7CisKKwkvKiBPbmx5IGlsaysgaGFzIHBvcnQgQSAqLworCWlmIChkcG9ydC0+cG9ydCA9PSBQT1JUX0EpIHsKKwkJaXJvbmxha2Vfc2V0X3BsbF9jcHVfZWRwKGludGVsX2RwKTsKIAkJaXJvbmxha2VfZWRwX3BsbF9vbihpbnRlbF9kcCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB2bHZfcHJlX2VuYWJsZV9kcChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKQEAgLTE5MjEsNiArMjAzNiw4IEBACiAJZW51bSBkcGlvX2NoYW5uZWwgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CiAKKwlpbnRlbF9kcF9wcmVwYXJlKGVuY29kZXIpOworCiAJLyogUHJvZ3JhbSBUeCBsYW5lIHJlc2V0cyB0byBkZWZhdWx0ICovCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CiAJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFcwKHBvcnQpLApAQCAtMTkzOSw2ICsyMDU2LDY5IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgY2h2X3ByZV9lbmFibGVfZHAoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcCgmZW5jb2Rlci0+YmFzZSk7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQgPSBkcF90b19kaWdfcG9ydChpbnRlbF9kcCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGVkcF9wb3dlcl9zZXEgcG93ZXJfc2VxOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0KKwkJdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCWVudW0gZHBpb19jaGFubmVsIGNoID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwlpbnQgZGF0YSwgaTsKKwl1MzIgdmFsOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBEZWFzc2VydCBzb2Z0IGRhdGEgbGFuZSByZXNldCovCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMShjaCkpOworCXZhbCB8PSBDSFZfUENTX1JFUV9TT0ZUUkVTRVRfRU47CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMShjaCkpOworCXZhbCB8PSBDSFZfUENTX1JFUV9TT0ZUUkVTRVRfRU47CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMChjaCkpOworCXZhbCB8PSAoRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzAoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMChjaCkpOworCXZhbCB8PSAoRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzAoY2gpLCB2YWwpOworCisJLyogUHJvZ3JhbSBUeCBsYW5lIGxhdGVuY3kgb3B0aW1hbCBzZXR0aW5nKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCS8qIFNldCB0aGUgbGF0ZW5jeSBvcHRpbWFsIGJpdCAqLworCQlkYXRhID0gKGkgPT0gMSkgPyAweDAgOiAweDY7CisJCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFcxMShjaCwgaSksCisJCQkJZGF0YSA8PCBEUElPX0ZSQ19MQVRFTkNZX1NIRklUKTsKKworCQkvKiBTZXQgdGhlIHVwYXIgYml0ICovCisJCWRhdGEgPSAoaSA9PSAxKSA/IDB4MCA6IDB4MTsKKwkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzE0KGNoLCBpKSwKKwkJCQlkYXRhIDw8IERQSU9fVVBBUl9TSElGVCk7CisJfQorCisJLyogRGF0YSBsYW5lIHN0YWdnZXIgcHJvZ3JhbW1pbmcgKi8KKwkvKiBGSVhNRTogRml4IHVwIHZhbHVlIG9ubHkgYWZ0ZXIgcG93ZXIgYW5hbHlzaXMgKi8KKworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwlpZiAoaXNfZWRwKGludGVsX2RwKSkgeworCQkvKiBpbml0IHBvd2VyIHNlcXVlbmNlciBvbiB0aGlzIHBpcGUgYW5kIHBvcnQgKi8KKwkJaW50ZWxfZHBfaW5pdF9wYW5lbF9wb3dlcl9zZXF1ZW5jZXIoZGV2LCBpbnRlbF9kcCwgJnBvd2VyX3NlcSk7CisJCWludGVsX2RwX2luaXRfcGFuZWxfcG93ZXJfc2VxdWVuY2VyX3JlZ2lzdGVycyhkZXYsIGludGVsX2RwLAorCQkJCQkJCSAgICAgICZwb3dlcl9zZXEpOworCX0KKworCWludGVsX2VuYWJsZV9kcChlbmNvZGVyKTsKKworCXZsdl93YWl0X3BvcnRfcmVhZHkoZGV2X3ByaXYsIGRwb3J0KTsKK30KKwogLyoKICAqIE5hdGl2ZSByZWFkIHdpdGggcmV0cnkgZm9yIGxpbmsgc3RhdHVzIGFuZCByZWNlaXZlciBjYXBhYmlsaXR5IHJlYWRzIGZvcgogICogY2FzZXMgd2hlcmUgdGhlIHNpbmsgbWF5IHN0aWxsIGJlIGFzbGVlcC4KQEAgLTIxNjMsNiArMjM0MywxNjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVpbnQzMl90IGludGVsX2Nodl9zaWduYWxfbGV2ZWxzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwX3RvX2RldihpbnRlbF9kcCk7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICpkcG9ydCA9IGRwX3RvX2RpZ19wb3J0KGludGVsX2RwKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoZHBvcnQtPmJhc2UuYmFzZS5jcnRjKTsKKwl1MzIgZGVlbXBoX3JlZ192YWx1ZSwgbWFyZ2luX3JlZ192YWx1ZSwgdmFsOworCXVpbnQ4X3QgdHJhaW5fc2V0ID0gaW50ZWxfZHAtPnRyYWluX3NldFswXTsKKwllbnVtIGRwaW9fY2hhbm5lbCBjaCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKKwllbnVtIHBpcGUgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJaW50IGk7CisKKwlzd2l0Y2ggKHRyYWluX3NldCAmIERQX1RSQUlOX1BSRV9FTVBIQVNJU19NQVNLKSB7CisJY2FzZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDoKKwkJc3dpdGNoICh0cmFpbl9zZXQgJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spIHsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMDoKKwkJCWRlZW1waF9yZWdfdmFsdWUgPSAxMjg7CisJCQltYXJnaW5fcmVnX3ZhbHVlID0gNTI7CisJCQlicmVhazsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzYwMDoKKwkJCWRlZW1waF9yZWdfdmFsdWUgPSAxMjg7CisJCQltYXJnaW5fcmVnX3ZhbHVlID0gNzc7CisJCQlicmVhazsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzgwMDoKKwkJCWRlZW1waF9yZWdfdmFsdWUgPSAxMjg7CisJCQltYXJnaW5fcmVnX3ZhbHVlID0gMTAyOworCQkJYnJlYWs7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR18xMjAwOgorCQkJZGVlbXBoX3JlZ192YWx1ZSA9IDEyODsKKwkJCW1hcmdpbl9yZWdfdmFsdWUgPSAxNTQ7CisJCQkvKiBGSVhNRSBleHRyYSB0byBzZXQgZm9yIDEyMDAgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181OgorCQlzd2l0Y2ggKHRyYWluX3NldCAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgeworCQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNDAwOgorCQkJZGVlbXBoX3JlZ192YWx1ZSA9IDg1OworCQkJbWFyZ2luX3JlZ192YWx1ZSA9IDc4OworCQkJYnJlYWs7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDA6CisJCQlkZWVtcGhfcmVnX3ZhbHVlID0gODU7CisJCQltYXJnaW5fcmVnX3ZhbHVlID0gMTE2OworCQkJYnJlYWs7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDA6CisJCQlkZWVtcGhfcmVnX3ZhbHVlID0gODU7CisJCQltYXJnaW5fcmVnX3ZhbHVlID0gMTU0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX1RSQUlOX1BSRV9FTVBIQVNJU182OgorCQlzd2l0Y2ggKHRyYWluX3NldCAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgeworCQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNDAwOgorCQkJZGVlbXBoX3JlZ192YWx1ZSA9IDY0OworCQkJbWFyZ2luX3JlZ192YWx1ZSA9IDEwNDsKKwkJCWJyZWFrOworCQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwOgorCQkJZGVlbXBoX3JlZ192YWx1ZSA9IDY0OworCQkJbWFyZ2luX3JlZ192YWx1ZSA9IDE1NDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfOV81OgorCQlzd2l0Y2ggKHRyYWluX3NldCAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgeworCQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNDAwOgorCQkJZGVlbXBoX3JlZ192YWx1ZSA9IDQzOworCQkJbWFyZ2luX3JlZ192YWx1ZSA9IDE1NDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBDbGVhciBjYWxjIGluaXQgKi8KKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcxMChjaCkpOworCXZhbCAmPSB+KERQSU9fUENTX1NXSU5HX0NBTENfVFgwX1RYMiB8IERQSU9fUENTX1NXSU5HX0NBTENfVFgxX1RYMyk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEwKGNoKSwgdmFsKTsKKworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEwKGNoKSk7CisJdmFsICY9IH4oRFBJT19QQ1NfU1dJTkdfQ0FMQ19UWDBfVFgyIHwgRFBJT19QQ1NfU1dJTkdfQ0FMQ19UWDFfVFgzKTsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMTAoY2gpLCB2YWwpOworCisJLyogUHJvZ3JhbSBzd2luZyBkZWVtcGggKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzQoY2gsIGkpKTsKKwkJdmFsICY9IH5EUElPX1NXSU5HX0RFRU1QSDlQNV9NQVNLOworCQl2YWwgfD0gZGVlbXBoX3JlZ192YWx1ZSA8PCBEUElPX1NXSU5HX0RFRU1QSDlQNV9TSElGVDsKKwkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzQoY2gsIGkpLCB2YWwpOworCX0KKworCS8qIFByb2dyYW0gc3dpbmcgbWFyZ2luICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFcyKGNoLCBpKSk7CisJCXZhbCAmPSB+RFBJT19TV0lOR19NQVJHSU5fTUFTSzsKKwkJdmFsIHw9IG1hcmdpbl9yZWdfdmFsdWUgPDwgRFBJT19TV0lOR19NQVJHSU5fU0hJRlQ7CisJCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFcyKGNoLCBpKSwgdmFsKTsKKwl9CisKKwkvKiBEaXNhYmxlIHVuaXF1ZSB0cmFuc2l0aW9uIHNjYWxlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFczKGNoLCBpKSk7CisJCXZhbCAmPSB+RFBJT19UWF9VTklRX1RSQU5TX1NDQUxFX0VOOworCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMyhjaCwgaSksIHZhbCk7CisJfQorCisJaWYgKCgodHJhaW5fc2V0ICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spCisJCQk9PSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMCkgJiYKKwkJKCh0cmFpbl9zZXQgJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spCisJCQk9PSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDApKSB7CisKKwkJLyoKKwkJICogVGhlIGRvY3VtZW50IHNhaWQgaXQgbmVlZHMgdG8gc2V0IGJpdCAyNyBmb3IgY2gwIGFuZCBiaXQgMjYKKwkJICogZm9yIGNoMS4gTWlnaHQgYmUgYSB0eXBvIGluIHRoZSBkb2MuCisJCSAqIEZvciBub3csIGZvciB0aGlzIHVuaXF1ZSB0cmFuc2l0aW9uIHNjYWxlIHNlbGVjdGlvbiwgc2V0IGJpdAorCQkgKiAyNyBmb3IgY2gwIGFuZCBjaDEuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFczKGNoLCBpKSk7CisJCQl2YWwgfD0gRFBJT19UWF9VTklRX1RSQU5TX1NDQUxFX0VOOworCQkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzMoY2gsIGkpLCB2YWwpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMihjaCwgaSkpOworCQkJdmFsICY9IH4oMHhmZiA8PCBEUElPX1VOSVFfVFJBTlNfU0NBTEVfU0hJRlQpOworCQkJdmFsIHw9ICgweDlhIDw8IERQSU9fVU5JUV9UUkFOU19TQ0FMRV9TSElGVCk7CisJCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMihjaCwgaSksIHZhbCk7CisJCX0KKwl9CisKKwkvKiBTdGFydCBzd2luZyBjYWxjdWxhdGlvbiAqLworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEwKGNoKSk7CisJdmFsIHw9IERQSU9fUENTX1NXSU5HX0NBTENfVFgwX1RYMiB8IERQSU9fUENTX1NXSU5HX0NBTENfVFgxX1RYMzsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMTAoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMTAoY2gpKTsKKwl2YWwgfD0gRFBJT19QQ1NfU1dJTkdfQ0FMQ19UWDBfVFgyIHwgRFBJT19QQ1NfU1dJTkdfQ0FMQ19UWDFfVFgzOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcxMChjaCksIHZhbCk7CisKKwkvKiBMUkMgQnlwYXNzICovCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzMwKTsKKwl2YWwgfD0gRFBJT19MUkNfQllQQVNTOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBDSFZfQ01OX0RXMzAsIHZhbCk7CisKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBpbnRlbF9nZXRfYWRqdXN0X3RyYWluKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCiAJCSAgICAgICBjb25zdCB1aW50OF90IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdKQpAQCAtMjM3Nyw2ICsyNzE3LDkgQEAKIAl9IGVsc2UgaWYgKElTX0hBU1dFTEwoZGV2KSkgewogCQlzaWduYWxfbGV2ZWxzID0gaW50ZWxfaHN3X3NpZ25hbF9sZXZlbHModHJhaW5fc2V0KTsKIAkJbWFzayA9IERESV9CVUZfRU1QX01BU0s7CisJfSBlbHNlIGlmIChJU19DSEVSUllWSUVXKGRldikpIHsKKwkJc2lnbmFsX2xldmVscyA9IGludGVsX2Nodl9zaWduYWxfbGV2ZWxzKGludGVsX2RwKTsKKwkJbWFzayA9IDA7CiAJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJc2lnbmFsX2xldmVscyA9IGludGVsX3Zsdl9zaWduYWxfbGV2ZWxzKGludGVsX2RwKTsKIAkJbWFzayA9IDA7CkBAIC0yNzQzLDIyICszMDg2LDcgQEAKIAkJdG9faW50ZWxfY3J0YyhpbnRlbF9kaWdfcG9ydC0+YmFzZS5iYXNlLmNydGMpOwogCXVpbnQzMl90IERQID0gaW50ZWxfZHAtPkRQOwogCi0JLyoKLQkgKiBEREkgY29kZSBoYXMgYSBzdHJpY3QgbW9kZSBzZXQgc2VxdWVuY2UgYW5kIHdlIHNob3VsZCB0cnkgdG8gcmVzcGVjdAotCSAqIGl0LCBvdGhlcndpc2Ugd2UgbWlnaHQgaGFuZyB0aGUgbWFjaGluZSBpbiBtYW55IGRpZmZlcmVudCB3YXlzLiBTbyB3ZQotCSAqIHJlYWxseSBzaG91bGQgYmUgZGlzYWJsaW5nIHRoZSBwb3J0IG9ubHkgb24gYSBjb21wbGV0ZSBjcnRjX2Rpc2FibGUKLQkgKiBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGNhbGxlZCB1bmRlciB0d28gY29uZGl0aW9ucyBvbiBEREkKLQkgKiBjb2RlOgotCSAqIC0gTGluayB0cmFpbiBmYWlsZWQgd2hpbGUgZG9pbmcgY3J0Y19lbmFibGUsIGFuZCBvbiB0aGlzIGNhc2Ugd2UKLQkgKiAgIHJlYWxseSBzaG91bGQgcmVzcGVjdCB0aGUgbW9kZSBzZXQgc2VxdWVuY2UgYW5kIHdhaXQgZm9yIGEKLQkgKiAgIGNydGNfZGlzYWJsZS4KLQkgKiAtIFNvbWVvbmUgdHVybmVkIHRoZSBtb25pdG9yIG9mZiBhbmQgaW50ZWxfZHBfY2hlY2tfbGlua19zdGF0dXMKLQkgKiAgIGNhbGxlZCB1cy4gV2UgZG9uJ3QgbmVlZCB0byBkaXNhYmxlIHRoZSB3aG9sZSBwb3J0IG9uIHRoaXMgY2FzZSwgc28KLQkgKiAgIHdoZW4gc29tZW9uZSB0dXJucyB0aGUgbW9uaXRvciBvbiBhZ2FpbiwKLQkgKiAgIGludGVsX2RkaV9wcmVwYXJlX2xpbmtfcmV0cmFpbiB3aWxsIHRha2UgY2FyZSBvZiByZWRvaW5nIHRoZSBsaW5rCi0JICogICB0cmFpbi4KLQkgKi8KLQlpZiAoSEFTX0RESShkZXYpKQorCWlmIChXQVJOX09OKEhBU19EREkoZGV2KSkpCiAJCXJldHVybjsKIAogCWlmIChXQVJOX09OKChJOTE1X1JFQUQoaW50ZWxfZHAtPm91dHB1dF9yZWcpICYgRFBfUE9SVF9FTikgPT0gMCkpCkBAIC0yNzc1LDkgKzMxMDMsNiBAQAogCX0KIAlQT1NUSU5HX1JFQUQoaW50ZWxfZHAtPm91dHB1dF9yZWcpOwogCi0JLyogV2UgZG9uJ3QgcmVhbGx5IGtub3cgd2h5IHdlJ3JlIGRvaW5nIHRoaXMgKi8KLQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKLQogCWlmIChIQVNfUENIX0lCWChkZXYpICYmCiAJICAgIEk5MTVfUkVBRChpbnRlbF9kcC0+b3V0cHV0X3JlZykgJiBEUF9QSVBFQl9TRUxFQ1QpIHsKIAkJc3RydWN0IGRybV9jcnRjICpjcnRjID0gaW50ZWxfZGlnX3BvcnQtPmJhc2UuYmFzZS5jcnRjOwpAQCAtMjk0OCw2ICszMjczLDcgQEAKIAl1OCBzaW5rX2lycV92ZWN0b3I7CiAJdTggbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07CiAKKwkvKiBGSVhNRTogVGhpcyBhY2Nlc3MgaXNuJ3QgcHJvdGVjdGVkIGJ5IGFueSBsb2Nrcy4gKi8KIAlpZiAoIWludGVsX2VuY29kZXItPmNvbm5lY3RvcnNfYWN0aXZlKQogCQlyZXR1cm47CiAKQEAgLTI5ODAsNyArMzMwNiw3IEBACiAKIAlpZiAoIWRybV9kcF9jaGFubmVsX2VxX29rKGxpbmtfc3RhdHVzLCBpbnRlbF9kcC0+bGFuZV9jb3VudCkpIHsKIAkJRFJNX0RFQlVHX0tNUygiJXM6IGNoYW5uZWwgRVEgbm90IG9rLCByZXRyYWluaW5nXG4iLAotCQkJICAgICAgZHJtX2dldF9lbmNvZGVyX25hbWUoJmludGVsX2VuY29kZXItPmJhc2UpKTsKKwkJCSAgICAgIGludGVsX2VuY29kZXItPmJhc2UubmFtZSk7CiAJCWludGVsX2RwX3N0YXJ0X2xpbmtfdHJhaW4oaW50ZWxfZHApOwogCQlpbnRlbF9kcF9jb21wbGV0ZV9saW5rX3RyYWluKGludGVsX2RwKTsKIAkJaW50ZWxfZHBfc3RvcF9saW5rX3RyYWluKGludGVsX2RwKTsKQEAgLTMxNjYsNyArMzQ5Miw3IEBACiAJaW50ZWxfZGlzcGxheV9wb3dlcl9nZXQoZGV2X3ByaXYsIHBvd2VyX2RvbWFpbik7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXVxuIiwKLQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSk7CiAKIAlpbnRlbF9kcC0+aGFzX2F1ZGlvID0gZmFsc2U7CiAKQEAgLTMzNzQsMTMgKzM3MDAsMTMgQEAKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gJmludGVsX2RpZ19wb3J0LT5kcDsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHBfdG9fZGV2KGludGVsX2RwKTsKIAotCWRybV9kcF9hdXhfdW5yZWdpc3Rlcl9pMmNfYnVzKCZpbnRlbF9kcC0+YXV4KTsKKwlkcm1fZHBfYXV4X3VucmVnaXN0ZXIoJmludGVsX2RwLT5hdXgpOwogCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbnRlbF9kcC0+cGFuZWxfdmRkX3dvcmspOwotCQltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwkJZHJtX21vZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LCBOVUxMKTsKIAkJZWRwX3BhbmVsX3ZkZF9vZmZfc3luYyhpbnRlbF9kcCk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCWRybV9tb2Rlc2V0X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KTsKIAl9CiAJa2ZyZWUoaW50ZWxfZGlnX3BvcnQpOwogfQpAQCAtMzY1MSw2ICszOTc3LDEzMCBAQAogCQkgICAgICBJOTE1X1JFQUQocHBfZGl2X3JlZykpOwogfQogCit2b2lkIGludGVsX2RwX3NldF9kcnJzX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWZyZXNoX3JhdGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfY3J0Y19jb25maWcgKmNvbmZpZyA9IE5VTEw7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSBOVUxMOworCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmludGVsX2Nvbm5lY3RvciA9IGRldl9wcml2LT5kcnJzLmNvbm5lY3RvcjsKKwl1MzIgcmVnLCB2YWw7CisJZW51bSBlZHBfZHJyc19yZWZyZXNoX3JhdGVfdHlwZSBpbmRleCA9IERSUlNfSElHSF9SUjsKKworCWlmIChyZWZyZXNoX3JhdGUgPD0gMCkgeworCQlEUk1fREVCVUdfS01TKCJSZWZyZXNoIHJhdGUgc2hvdWxkIGJlIHBvc2l0aXZlIG5vbi16ZXJvLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW50ZWxfY29ubmVjdG9yID09IE5VTEwpIHsKKwkJRFJNX0RFQlVHX0tNUygiRFJSUyBzdXBwb3J0ZWQgZm9yIGVEUCBvbmx5LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA4ICYmIGludGVsX2VkcF9pc19wc3JfZW5hYmxlZChkZXYpKSB7CisJCURSTV9ERUJVR19LTVMoIkRSUlMgaXMgZGlzYWJsZWQgYXMgUFNSIGlzIGVuYWJsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJZW5jb2RlciA9IGludGVsX2F0dGFjaGVkX2VuY29kZXIoJmludGVsX2Nvbm5lY3Rvci0+YmFzZSk7CisJaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoJmVuY29kZXItPmJhc2UpOworCWludGVsX2NydGMgPSBlbmNvZGVyLT5uZXdfY3J0YzsKKworCWlmICghaW50ZWxfY3J0YykgeworCQlEUk1fREVCVUdfS01TKCJEUlJTOiBpbnRlbF9jcnRjIG5vdCBpbml0aWFsaXplZFxuIik7CisJCXJldHVybjsKKwl9CisKKwljb25maWcgPSAmaW50ZWxfY3J0Yy0+Y29uZmlnOworCisJaWYgKGludGVsX2RwLT5kcnJzX3N0YXRlLnR5cGUgPCBTRUFNTEVTU19EUlJTX1NVUFBPUlQpIHsKKwkJRFJNX0RFQlVHX0tNUygiT25seSBTZWFtbGVzcyBEUlJTIHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGludGVsX2Nvbm5lY3Rvci0+cGFuZWwuZG93bmNsb2NrX21vZGUtPnZyZWZyZXNoID09IHJlZnJlc2hfcmF0ZSkKKwkJaW5kZXggPSBEUlJTX0xPV19SUjsKKworCWlmIChpbmRleCA9PSBpbnRlbF9kcC0+ZHJyc19zdGF0ZS5yZWZyZXNoX3JhdGVfdHlwZSkgeworCQlEUk1fREVCVUdfS01TKAorCQkJIkRSUlMgcmVxdWVzdGVkIGZvciBwcmV2aW91c2x5IHNldCBSUi4uLmlnbm9yaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaW50ZWxfY3J0Yy0+YWN0aXZlKSB7CisJCURSTV9ERUJVR19LTVMoImVEUCBlbmNvZGVyIGRpc2FibGVkLiBDUlRDIG5vdCBBY3RpdmVcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gNiAmJiBJTlRFTF9JTkZPKGRldiktPmdlbiA8IDgpIHsKKwkJcmVnID0gUElQRUNPTkYoaW50ZWxfY3J0Yy0+Y29uZmlnLmNwdV90cmFuc2NvZGVyKTsKKwkJdmFsID0gSTkxNV9SRUFEKHJlZyk7CisJCWlmIChpbmRleCA+IERSUlNfSElHSF9SUikgeworCQkJdmFsIHw9IFBJUEVDT05GX0VEUF9SUl9NT0RFX1NXSVRDSDsKKwkJCWludGVsX2RwX3NldF9tMl9uMihpbnRlbF9jcnRjLCAmY29uZmlnLT5kcF9tMl9uMik7CisJCX0gZWxzZSB7CisJCQl2YWwgJj0gflBJUEVDT05GX0VEUF9SUl9NT0RFX1NXSVRDSDsKKwkJfQorCQlJOTE1X1dSSVRFKHJlZywgdmFsKTsKKwl9CisKKwkvKgorCSAqIG11dGV4IHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgYmV0d2VlbiBkaWZmZXJudAorCSAqIGRycnMgY2FsbHMgdHJ5aW5nIHRvIHVwZGF0ZSByZWZyZXNoIHJhdGUuIFRoaXMgc2NlbmFyaW8gbWF5IG9jY3VyCisJICogaW4gZnV0dXJlIHdoZW4gaWRsZW5lc3MgZGV0ZWN0aW9uIGJhc2VkIERSUlMgaW4ga2VybmVsIGFuZAorCSAqIHBvc3NpYmxlIGNhbGxzIGZyb20gdXNlciBzcGFjZSB0byBzZXQgZGlmZmVybnQgUlIgYXJlIG1hZGUuCisJICovCisKKwltdXRleF9sb2NrKCZpbnRlbF9kcC0+ZHJyc19zdGF0ZS5tdXRleCk7CisKKwlpbnRlbF9kcC0+ZHJyc19zdGF0ZS5yZWZyZXNoX3JhdGVfdHlwZSA9IGluZGV4OworCisJbXV0ZXhfdW5sb2NrKCZpbnRlbF9kcC0+ZHJyc19zdGF0ZS5tdXRleCk7CisKKwlEUk1fREVCVUdfS01TKCJlRFAgUmVmcmVzaCBSYXRlIHNldCB0byA6ICVkSHpcbiIsIHJlZnJlc2hfcmF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqCitpbnRlbF9kcF9kcnJzX2luaXQoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQsCisJCQlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IsCisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmludGVsX2Nvbm5lY3Rvci0+YmFzZTsKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gJmludGVsX2RpZ19wb3J0LT5kcDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZGlnX3BvcnQtPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZG93bmNsb2NrX21vZGUgPSBOVUxMOworCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDYpIHsKKwkJRFJNX0RFQlVHX0tNUygiRFJSUyBzdXBwb3J0ZWQgZm9yIEdlbjcgYW5kIGFib3ZlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRldl9wcml2LT52YnQuZHJyc190eXBlICE9IFNFQU1MRVNTX0RSUlNfU1VQUE9SVCkgeworCQlEUk1fSU5GTygiVkJUIGRvZXNuJ3Qgc3VwcG9ydCBEUlJTXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG93bmNsb2NrX21vZGUgPSBpbnRlbF9maW5kX3BhbmVsX2Rvd25jbG9jaworCQkJCQkoZGV2LCBmaXhlZF9tb2RlLCBjb25uZWN0b3IpOworCisJaWYgKCFkb3duY2xvY2tfbW9kZSkgeworCQlEUk1fSU5GTygiRFJSUyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2X3ByaXYtPmRycnMuY29ubmVjdG9yID0gaW50ZWxfY29ubmVjdG9yOworCisJbXV0ZXhfaW5pdCgmaW50ZWxfZHAtPmRycnNfc3RhdGUubXV0ZXgpOworCisJaW50ZWxfZHAtPmRycnNfc3RhdGUudHlwZSA9IGRldl9wcml2LT52YnQuZHJyc190eXBlOworCisJaW50ZWxfZHAtPmRycnNfc3RhdGUucmVmcmVzaF9yYXRlX3R5cGUgPSBEUlJTX0hJR0hfUlI7CisJRFJNX0lORk8oInNlYW1sZXNzIERSUlMgc3VwcG9ydGVkIGZvciBlRFAgcGFuZWwuXG4iKTsKKwlyZXR1cm4gZG93bmNsb2NrX21vZGU7Cit9CisKIHN0YXRpYyBib29sIGludGVsX2VkcF9pbml0X2Nvbm5lY3RvcihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLAogCQkJCSAgICAgc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yLAogCQkJCSAgICAgc3RydWN0IGVkcF9wb3dlcl9zZXEgKnBvd2VyX3NlcSkKQEAgLTM2NjEsMTAgKzQxMTEsMTMgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZW5jb2Rlci0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSA9IE5VTEw7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRvd25jbG9ja19tb2RlID0gTlVMTDsKIAlib29sIGhhc19kcGNkOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzY2FuOwogCXN0cnVjdCBlZGlkICplZGlkOwogCisJaW50ZWxfZHAtPmRycnNfc3RhdGUudHlwZSA9IERSUlNfTk9UX1NVUFBPUlRFRDsKKwogCWlmICghaXNfZWRwKGludGVsX2RwKSkKIAkJcmV0dXJuIHRydWU7CiAKQEAgLTM3MTUsNiArNDE2OCw5IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzY2FuLCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsIGhlYWQpIHsKIAkJaWYgKChzY2FuLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpKSB7CiAJCQlmaXhlZF9tb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgc2Nhbik7CisJCQlkb3duY2xvY2tfbW9kZSA9IGludGVsX2RwX2RycnNfaW5pdCgKKwkJCQkJCWludGVsX2RpZ19wb3J0LAorCQkJCQkJaW50ZWxfY29ubmVjdG9yLCBmaXhlZF9tb2RlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzcyOCw3ICs0MTg0LDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIAotCWludGVsX3BhbmVsX2luaXQoJmludGVsX2Nvbm5lY3Rvci0+cGFuZWwsIGZpeGVkX21vZGUsIE5VTEwpOworCWludGVsX3BhbmVsX2luaXQoJmludGVsX2Nvbm5lY3Rvci0+cGFuZWwsIGZpeGVkX21vZGUsIGRvd25jbG9ja19tb2RlKTsKIAlpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKIAogCXJldHVybiB0cnVlOwpAQCAtMzgyNiwxMiArNDI4MiwxMiBAQAogCWludGVsX2RwLT5wc3Jfc2V0dXBfZG9uZSA9IGZhbHNlOwogCiAJaWYgKCFpbnRlbF9lZHBfaW5pdF9jb25uZWN0b3IoaW50ZWxfZHAsIGludGVsX2Nvbm5lY3RvciwgJnBvd2VyX3NlcSkpIHsKLQkJZHJtX2RwX2F1eF91bnJlZ2lzdGVyX2kyY19idXMoJmludGVsX2RwLT5hdXgpOworCQlkcm1fZHBfYXV4X3VucmVnaXN0ZXIoJmludGVsX2RwLT5hdXgpOwogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkgewogCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbnRlbF9kcC0+cGFuZWxfdmRkX3dvcmspOwotCQkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCQlkcm1fbW9kZXNldF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgsIE5VTEwpOwogCQkJZWRwX3BhbmVsX3ZkZF9vZmZfc3luYyhpbnRlbF9kcCk7Ci0JCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCQkJZHJtX21vZGVzZXRfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpOwogCQl9CiAJCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CiAJCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwpAQCAtMzg3NywyNSArNDMzMywzNiBAQAogCQkJIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CiAKIAlpbnRlbF9lbmNvZGVyLT5jb21wdXRlX2NvbmZpZyA9IGludGVsX2RwX2NvbXB1dGVfY29uZmlnOwotCWludGVsX2VuY29kZXItPm1vZGVfc2V0ID0gaW50ZWxfZHBfbW9kZV9zZXQ7CiAJaW50ZWxfZW5jb2Rlci0+ZGlzYWJsZSA9IGludGVsX2Rpc2FibGVfZHA7Ci0JaW50ZWxfZW5jb2Rlci0+cG9zdF9kaXNhYmxlID0gaW50ZWxfcG9zdF9kaXNhYmxlX2RwOwogCWludGVsX2VuY29kZXItPmdldF9od19zdGF0ZSA9IGludGVsX2RwX2dldF9od19zdGF0ZTsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfY29uZmlnID0gaW50ZWxfZHBfZ2V0X2NvbmZpZzsKLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlpbnRlbF9lbmNvZGVyLT5wcmVfZW5hYmxlID0gY2h2X3ByZV9lbmFibGVfZHA7CisJCWludGVsX2VuY29kZXItPmVuYWJsZSA9IHZsdl9lbmFibGVfZHA7CisJCWludGVsX2VuY29kZXItPnBvc3RfZGlzYWJsZSA9IGNodl9wb3N0X2Rpc2FibGVfZHA7CisJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJaW50ZWxfZW5jb2Rlci0+cHJlX3BsbF9lbmFibGUgPSB2bHZfZHBfcHJlX3BsbF9lbmFibGU7CiAJCWludGVsX2VuY29kZXItPnByZV9lbmFibGUgPSB2bHZfcHJlX2VuYWJsZV9kcDsKIAkJaW50ZWxfZW5jb2Rlci0+ZW5hYmxlID0gdmx2X2VuYWJsZV9kcDsKKwkJaW50ZWxfZW5jb2Rlci0+cG9zdF9kaXNhYmxlID0gdmx2X3Bvc3RfZGlzYWJsZV9kcDsKIAl9IGVsc2UgewogCQlpbnRlbF9lbmNvZGVyLT5wcmVfZW5hYmxlID0gZzR4X3ByZV9lbmFibGVfZHA7CiAJCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGc0eF9lbmFibGVfZHA7CisJCWludGVsX2VuY29kZXItPnBvc3RfZGlzYWJsZSA9IGc0eF9wb3N0X2Rpc2FibGVfZHA7CiAJfQogCiAJaW50ZWxfZGlnX3BvcnQtPnBvcnQgPSBwb3J0OwogCWludGVsX2RpZ19wb3J0LT5kcC5vdXRwdXRfcmVnID0gb3V0cHV0X3JlZzsKIAogCWludGVsX2VuY29kZXItPnR5cGUgPSBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQ7Ci0JaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpOworCWlmIChJU19DSEVSUllWSUVXKGRldikpIHsKKwkJaWYgKHBvcnQgPT0gUE9SVF9EKQorCQkJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gMSA8PCAyOworCQllbHNlCisJCQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCX0gZWxzZSB7CisJCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKTsKKwl9CiAJaW50ZWxfZW5jb2Rlci0+Y2xvbmVhYmxlID0gMDsKIAlpbnRlbF9lbmNvZGVyLT5ob3RfcGx1ZyA9IGludGVsX2RwX2hvdF9wbHVnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IDMyOGIxYTcuLmJkYTBhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC04MSw4ICs4MSw4IEBACiAvKiBNYXhpbXVtIGN1cnNvciBzaXplcyAqLwogI2RlZmluZSBHRU4yX0NVUlNPUl9XSURUSCA2NAogI2RlZmluZSBHRU4yX0NVUlNPUl9IRUlHSFQgNjQKLSNkZWZpbmUgQ1VSU09SX1dJRFRIIDI1NgotI2RlZmluZSBDVVJTT1JfSEVJR0hUIDI1NgorI2RlZmluZSBNQVhfQ1VSU09SX1dJRFRIIDI1NgorI2RlZmluZSBNQVhfQ1VSU09SX0hFSUdIVCAyNTYKIAogI2RlZmluZSBJTlRFTF9JMkNfQlVTX0RWTyAxCiAjZGVmaW5lIElOVEVMX0kyQ19CVVNfU0RWTyAyCkBAIC0xMDYsOCArMTA2LDggQEAKICNkZWZpbmUgSU5URUxfRFZPX0NISVBfVE1EUyAyCiAjZGVmaW5lIElOVEVMX0RWT19DSElQX1RWT1VUIDQKIAotI2RlZmluZSBJTlRFTF9EU0lfQ09NTUFORF9NT0RFCTAKLSNkZWZpbmUgSU5URUxfRFNJX1ZJREVPX01PREUJMQorI2RlZmluZSBJTlRFTF9EU0lfVklERU9fTU9ERQkwCisjZGVmaW5lIElOVEVMX0RTSV9DT01NQU5EX01PREUJMQogCiBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgewogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgYmFzZTsKQEAgLTI3Myw2ICsyNzMsMTMgQEAKIAkgKiBhY2NvcmRpbmdseS4gKi8KIAlib29sIGhhc19kcF9lbmNvZGVyOwogCisJLyogV2hldGhlciB3ZSBzaG91bGQgc2VuZCBOVUxMIGluZm9mcmFtZXMuIFJlcXVpcmVkIGZvciBhdWRpby4gKi8KKwlib29sIGhhc19oZG1pX3Npbms7CisKKwkvKiBBdWRpbyBlbmFibGVkIG9uIHRoaXMgcGlwZS4gT25seSB2YWxpZCBpZiBlaXRoZXIgaGFzX2hkbWlfc2luayBvcgorCSAqIGhhc19kcF9lbmNvZGVyIGlzIHNldC4gKi8KKwlib29sIGhhc19hdWRpbzsKKwogCS8qCiAJICogRW5hYmxlIGRpdGhlcmluZywgdXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBwaXBlIGJwcCBkb2Vzbid0IG1hdGNoIHRoZQogCSAqIHBsYW5lIGJwcC4KQEAgLTMwNiw2ICszMTMsOSBAQAogCWludCBwaXBlX2JwcDsKIAlzdHJ1Y3QgaW50ZWxfbGlua19tX24gZHBfbV9uOwogCisJLyogbTJfbjIgZm9yIGVEUCBkb3duY2xvY2sgKi8KKwlzdHJ1Y3QgaW50ZWxfbGlua19tX24gZHBfbTJfbjI7CisKIAkvKgogCSAqIEZyZXF1ZW5jZSB0aGUgZHBsbCBmb3IgdGhlIHBvcnQgc2hvdWxkIHJ1biBhdC4gRGlmZmVycyBmcm9tIHRoZQogCSAqIGFkanVzdGVkIGRvdGNsb2NrIGUuZy4gZm9yIERQIG9yIDEyYnBjIGhkbWkgbW9kZS4gVGhpcyBpcyBhbHNvCkBAIC0zNDMsNiArMzUzLDkgQEAKIAlzdHJ1Y3QgaW50ZWxfd21fbGV2ZWwgd21bNV07CiAJdWludDMyX3QgbGluZXRpbWU7CiAJYm9vbCBmYmNfd21fZW5hYmxlZDsKKwlib29sIHBpcGVfZW5hYmxlZDsKKwlib29sIHNwcml0ZXNfZW5hYmxlZDsKKwlib29sIHNwcml0ZXNfc2NhbGVkOwogfTsKIAogc3RydWN0IGludGVsX2NydGMgewpAQCAtMzU3LDcgKzM3MCw2IEBACiAJICovCiAJYm9vbCBhY3RpdmU7CiAJdW5zaWduZWQgbG9uZyBlbmFibGVkX3Bvd2VyX2RvbWFpbnM7Ci0JYm9vbCBlbGRfdmxkOwogCWJvb2wgcHJpbWFyeV9lbmFibGVkOyAvKiBpcyB0aGUgcHJpbWFyeSBwbGFuZSAocGFydGlhbGx5KSB2aXNpYmxlPyAqLwogCWJvb2wgbG93ZnJlcV9hdmFpbDsKIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKQEAgLTM3NCw4ICszODYsOCBAQAogCXVpbnQzMl90IGN1cnNvcl9hZGRyOwogCWludDE2X3QgY3Vyc29yX3gsIGN1cnNvcl95OwogCWludDE2X3QgY3Vyc29yX3dpZHRoLCBjdXJzb3JfaGVpZ2h0OwotCWludDE2X3QgbWF4X2N1cnNvcl93aWR0aCwgbWF4X2N1cnNvcl9oZWlnaHQ7Ci0JYm9vbCBjdXJzb3JfdmlzaWJsZTsKKwl1aW50MzJfdCBjdXJzb3JfY250bDsKKwl1aW50MzJfdCBjdXJzb3JfYmFzZTsKIAogCXN0cnVjdCBpbnRlbF9wbGFuZV9jb25maWcgcGxhbmVfY29uZmlnOwogCXN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyBjb25maWc7CkBAIC0zOTYsNiArNDA4LDEwIEBACiAJCS8qIHdhdGVybWFya3MgY3VycmVudGx5IGJlaW5nIHVzZWQgICovCiAJCXN0cnVjdCBpbnRlbF9waXBlX3dtIGFjdGl2ZTsKIAl9IHdtOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgdmJsX3dhaXQ7CisKKwlpbnQgc2NhbmxpbmVfb2Zmc2V0OwogfTsKIAogc3RydWN0IGludGVsX3BsYW5lX3dtX3BhcmFtZXRlcnMgewpAQCAtNDc5LDExICs0OTUsMjMgQEAKIAkJCQllbnVtIGhkbWlfaW5mb2ZyYW1lX3R5cGUgdHlwZSwKIAkJCQljb25zdCB2b2lkICpmcmFtZSwgc3NpemVfdCBsZW4pOwogCXZvaWQgKCpzZXRfaW5mb2ZyYW1lcykoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgIGJvb2wgZW5hYmxlLAogCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKIH07CiAKICNkZWZpbmUgRFBfTUFYX0RPV05TVFJFQU1fUE9SVFMJCTB4MTAKIAorLyoqCisgKiBISUdIX1JSIGlzIHRoZSBoaWdoZXN0IGVEUCBwYW5lbCByZWZyZXNoIHJhdGUgcmVhZCBmcm9tIEVESUQKKyAqIExPV19SUiBpcyB0aGUgbG93ZXN0IGVEUCBwYW5lbCByZWZyZXNoIHJhdGUgZm91bmQgZnJvbSBFRElECisgKiBwYXJzaW5nIGZvciBzYW1lIHJlc29sdXRpb24uCisgKi8KK2VudW0gZWRwX2RycnNfcmVmcmVzaF9yYXRlX3R5cGUgeworCURSUlNfSElHSF9SUiwKKwlEUlJTX0xPV19SUiwKKwlEUlJTX01BWF9SUiwgLyogUlIgY291bnQgKi8KK307CisKIHN0cnVjdCBpbnRlbF9kcCB7CiAJdWludDMyX3Qgb3V0cHV0X3JlZzsKIAl1aW50MzJfdCBhdXhfY2hfY3RsX3JlZzsKQEAgLTUyMiw2ICs1NTAsMTIgQEAKIAkJCQkgICAgIGJvb2wgaGFzX2F1eF9pcnEsCiAJCQkJICAgICBpbnQgc2VuZF9ieXRlcywKIAkJCQkgICAgIHVpbnQzMl90IGF1eF9jbG9ja19kaXZpZGVyKTsKKwlzdHJ1Y3QgeworCQllbnVtIGRycnNfc3VwcG9ydF90eXBlIHR5cGU7CisJCWVudW0gZWRwX2RycnNfcmVmcmVzaF9yYXRlX3R5cGUgcmVmcmVzaF9yYXRlX3R5cGU7CisJCXN0cnVjdCBtdXRleCBtdXRleDsKKwl9IGRycnNfc3RhdGU7CisKIH07CiAKIHN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgewpAQCAtNTM3LDYgKzU3MSw3IEBACiB7CiAJc3dpdGNoIChkcG9ydC0+cG9ydCkgewogCWNhc2UgUE9SVF9COgorCWNhc2UgUE9SVF9EOgogCQlyZXR1cm4gRFBJT19DSDA7CiAJY2FzZSBQT1JUX0M6CiAJCXJldHVybiBEUElPX0NIMTsKQEAgLTU0NSw2ICs1ODAsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50Cit2bHZfcGlwZV90b19jaGFubmVsKGVudW0gcGlwZSBwaXBlKQoreworCXN3aXRjaCAocGlwZSkgeworCWNhc2UgUElQRV9BOgorCWNhc2UgUElQRV9DOgorCQlyZXR1cm4gRFBJT19DSDA7CisJY2FzZSBQSVBFX0I6CisJCXJldHVybiBEUElPX0NIMTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9jcnRjICoKIGludGVsX2dldF9jcnRjX2Zvcl9waXBlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewpAQCAtNTY5LDYgKzYxOCw4IEBACiAjZGVmaW5lIElOVEVMX0ZMSVBfSU5BQ1RJVkUJMAogI2RlZmluZSBJTlRFTF9GTElQX1BFTkRJTkcJMQogI2RlZmluZSBJTlRFTF9GTElQX0NPTVBMRVRFCTIKKwl1MzIgZmxpcF9jb3VudDsKKwl1MzIgZ3R0X29mZnNldDsKIAlib29sIGVuYWJsZV9zdGFsbF9jaGVjazsKIH07CiAKQEAgLTYyMCw4ICs2NzEsNiBAQAogLyogaTkxNV9pcnEuYyAqLwogYm9vbCBpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgIGVudW0gcGlwZSBwaXBlLCBib29sIGVuYWJsZSk7Ci1ib29sIF9faW50ZWxfc2V0X2NwdV9maWZvX3VuZGVycnVuX3JlcG9ydGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCQkgICAgIGVudW0gcGlwZSBwaXBlLCBib29sIGVuYWJsZSk7CiBib29sIGludGVsX3NldF9wY2hfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgZW51bSB0cmFuc2NvZGVyIHBjaF90cmFuc2NvZGVyLAogCQkJCQkgICBib29sIGVuYWJsZSk7CkBAIC02MjksOCArNjc4LDEyIEBACiB2b2lkIGlsa19kaXNhYmxlX2d0X2lycShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IG1hc2spOwogdm9pZCBzbmJfZW5hYmxlX3BtX2lycShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IG1hc2spOwogdm9pZCBzbmJfZGlzYWJsZV9wbV9pcnEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCBtYXNrKTsKLXZvaWQgaHN3X3J1bnRpbWVfcG1fZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotdm9pZCBoc3dfcnVudGltZV9wbV9yZXN0b3JlX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGJkd19lbmFibGVfcG1faXJxKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgbWFzayk7Cit2b2lkIGJkd19kaXNhYmxlX3BtX2lycShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IG1hc2spOwordm9pZCBpbnRlbF9ydW50aW1lX3BtX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgaW50ZWxfcnVudGltZV9wbV9yZXN0b3JlX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaW50ZWxfZ2V0X2NydGNfc2NhbmxpbmUoc3RydWN0IGludGVsX2NydGMgKmNydGMpOwordm9pZCBpOXh4X2NoZWNrX2ZpZm9fdW5kZXJydW5zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAKIC8qIGludGVsX2NydC5jICovCkBAIC02NjYsOSArNzE5LDEwIEBACiBjb25zdCBjaGFyICppbnRlbF9vdXRwdXRfbmFtZShpbnQgb3V0cHV0KTsKIGJvb2wgaW50ZWxfaGFzX3BlbmRpbmdfZmJfdW5waW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaW50ZWxfcGNoX3Jhd2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCB2YWxsZXl2aWV3X2N1cl9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogdm9pZCBpbnRlbF9tYXJrX2J1c3koc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGludGVsX21hcmtfZmJfYnVzeShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKKwkJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOwogdm9pZCBpbnRlbF9tYXJrX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGludGVsX2NydGNfcmVzdG9yZV9tb2RlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiB2b2lkIGludGVsX2NydGNfdXBkYXRlX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKQEAgLTY5NSwxMiArNzQ5LDE0IEBACiAJCQkgc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQpOwogYm9vbCBpbnRlbF9nZXRfbG9hZF9kZXRlY3RfcGlwZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJCXN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQpOworCQkJCXN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQsCisJCQkJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpOwogdm9pZCBpbnRlbF9yZWxlYXNlX2xvYWRfZGV0ZWN0X3BpcGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkgICAgc3RydWN0IGludGVsX2xvYWRfZGV0ZWN0X3BpcGUgKm9sZCk7CisJCQkJICAgIHN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlICpvbGQsCisJCQkJICAgIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KTsKIGludCBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpOworCQkJICAgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnBpcGVsaW5lZCk7CiB2b2lkIGludGVsX3VucGluX2ZiX29iaihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKgogX19pbnRlbF9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTc1MSw2ICs4MDcsOCBAQAogdm9pZCBpbnRlbF9tb2RlX2Zyb21fcGlwZV9jb25maWcoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkJIHN0cnVjdCBpbnRlbF9jcnRjX2NvbmZpZyAqcGlwZV9jb25maWcpOwogaW50IGludGVsX2Zvcm1hdF90b19mb3VyY2MoaW50IGZvcm1hdCk7Cit2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworCiAKIC8qIGludGVsX2RwLmMgKi8KIHZvaWQgaW50ZWxfZHBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X3JlZywgZW51bSBwb3J0IHBvcnQpOwpAQCAtNzc0LDcgKzgzMiw3IEBACiB2b2lkIGludGVsX2VkcF9wc3JfZW5hYmxlKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApOwogdm9pZCBpbnRlbF9lZHBfcHNyX2Rpc2FibGUoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCk7CiB2b2lkIGludGVsX2VkcF9wc3JfdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCit2b2lkIGludGVsX2RwX3NldF9kcnJzX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWZyZXNoX3JhdGUpOwogCiAvKiBpbnRlbF9kc2kuYyAqLwogYm9vbCBpbnRlbF9kc2lfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTg3Niw2ICs5MzQsNyBAQAogLyogaW50ZWxfcG0uYyAqLwogdm9pZCBpbnRlbF9pbml0X2Nsb2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaW50ZWxfc3VzcGVuZF9odyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpbGtfd21fbWF4X2xldmVsKGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogdm9pZCBpbnRlbF91cGRhdGVfc3ByaXRlX3dhdGVybWFya3Moc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCiAJCQkJICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTkwMiw2ICs5NjEsNyBAQAogdm9pZCBpbnRlbF9jbGVhbnVwX2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaW50ZWxfZW5hYmxlX2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaW50ZWxfZGlzYWJsZV9ndF9wb3dlcnNhdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGludGVsX3Jlc2V0X2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaXJvbmxha2VfdGVhcmRvd25fcmM2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBnZW42X3VwZGF0ZV9yaW5nX2ZyZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGdlbjZfcnBzX2lkbGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKQEAgLTkwOSwxMSArOTY5LDEzIEBACiB2b2lkIGludGVsX2F1eF9kaXNwbGF5X3J1bnRpbWVfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX2F1eF9kaXNwbGF5X3J1bnRpbWVfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX3J1bnRpbWVfcG1fZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGludGVsX3J1bnRpbWVfcG1fZ2V0X25vcmVzdW1lKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX3J1bnRpbWVfcG1fcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGludGVsX2luaXRfcnVudGltZV9wbShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogdm9pZCBpbnRlbF9maW5pX3J1bnRpbWVfcG0oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIHZvaWQgaWxrX3dtX2dldF9od19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLQordm9pZCBfX3Zsdl9zZXRfcG93ZXJfd2VsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgIGVudW0gcHVuaXRfcG93ZXJfd2VsbCBwb3dlcl93ZWxsX2lkLCBib29sIGVuYWJsZSk7CiAKIC8qIGludGVsX3Nkdm8uYyAqLwogYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2R2b19yZWcsIGJvb2wgaXNfc2R2b2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuYwppbmRleCAzMzY1NjY0Ny4uMDJmOTlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmMKQEAgLTM1LDYgKzM1LDExIEBACiAKIC8qIHRoZSBzdWItZW5jb2RlcnMgYWthIHBhbmVsIGRyaXZlcnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSBpbnRlbF9kc2lfZGV2aWNlc1tdID0geworCXsKKwkJLnBhbmVsX2lkID0gTUlQSV9EU0lfR0VORVJJQ19QQU5FTF9JRCwKKwkJLm5hbWUgPSAidmJ0LWdlbmVyaWMtZHNpLXZpZC1tb2RlLWRpc3BsYXkiLAorCQkuZGV2X29wcyA9ICZ2YnRfZ2VuZXJpY19kc2lfZGlzcGxheV9vcHMsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIGJhbmRfZ2FwX3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKQEAgLTU5LDEyICs2NCwxMiBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlkX21vZGUoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpKQogewotCXJldHVybiBpbnRlbF9kc2ktPmRldi50eXBlID09IElOVEVMX0RTSV9WSURFT19NT0RFOworCXJldHVybiBpbnRlbF9kc2ktPm9wZXJhdGlvbl9tb2RlID09IElOVEVMX0RTSV9WSURFT19NT0RFOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY21kX21vZGUoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpKQogewotCXJldHVybiBpbnRlbF9kc2ktPmRldi50eXBlID09IElOVEVMX0RTSV9DT01NQU5EX01PREU7CisJcmV0dXJuIGludGVsX2RzaS0+b3BlcmF0aW9uX21vZGUgPT0gSU5URUxfRFNJX0NPTU1BTkRfTU9ERTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfZHNpX2hvdF9wbHVnKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtOTQsMTMgKzk5LDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfZHNpX3ByZV9wbGxfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQotewotCURSTV9ERUJVR19LTVMoIlxuIik7Ci0KLQl2bHZfZW5hYmxlX2RzaV9wbGwoZW5jb2Rlcik7Ci19Ci0KIHN0YXRpYyB2b2lkIGludGVsX2RzaV9kZXZpY2VfcmVhZHkoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOwpAQCAtMTEwLDYgKzEwOCwxNSBAQAogCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAorCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCS8qIHByb2dyYW0gcmNvbXAgZm9yIGNvbXBsaWFuY2UsIHJlZHVjZSBmcm9tIDUwIG9obXMgdG8gNDUgb2htcworCSAqIG5lZWRlZCBldmVyeXRpbWUgYWZ0ZXIgcG93ZXIgZ2F0ZSAqLworCXZsdl9mbGlzZHNpX3dyaXRlKGRldl9wcml2LCAweDA0LCAweDAwMDQpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBiYW5kZ2FwIHJlc2V0IGlzIG5lZWRlZCBhZnRlciBldmVyeXRpbWUgd2UgZG8gcG93ZXIgZ2F0ZSAqLworCWJhbmRfZ2FwX3Jlc2V0KGRldl9wcml2KTsKKwogCXZhbCA9IEk5MTVfUkVBRChNSVBJX1BPUlRfQ1RSTChwaXBlKSk7CiAJSTkxNV9XUklURShNSVBJX1BPUlRfQ1RSTChwaXBlKSwgdmFsIHwgTFBfT1VUUFVUX0hPTEQpOwogCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKQEAgLTEyMiwyMSArMTI5LDYgQEAKIAlJOTE1X1dSSVRFKE1JUElfREVWSUNFX1JFQURZKHBpcGUpLCBERVZJQ0VfUkVBRFkpOwogCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIH0KLXN0YXRpYyB2b2lkIGludGVsX2RzaV9wcmVfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGVuY190b19pbnRlbF9kc2koJmVuY29kZXItPmJhc2UpOwotCi0JRFJNX0RFQlVHX0tNUygiXG4iKTsKLQotCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5wYW5lbF9yZXNldCkKLQkJaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+cGFuZWxfcmVzZXQoJmludGVsX2RzaS0+ZGV2KTsKLQotCS8qIHB1dCBkZXZpY2UgaW4gcmVhZHkgc3RhdGUgKi8KLQlpbnRlbF9kc2lfZGV2aWNlX3JlYWR5KGVuY29kZXIpOwotCi0JaWYgKGludGVsX2RzaS0+ZGV2LmRldl9vcHMtPnNlbmRfb3RwX2NtZHMpCi0JCWludGVsX2RzaS0+ZGV2LmRldl9vcHMtPnNlbmRfb3RwX2NtZHMoJmludGVsX2RzaS0+ZGV2KTsKLX0KIAogc3RhdGljIHZvaWQgaW50ZWxfZHNpX2VuYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKQEAgLTE1MywxOCArMTQ1LDc4IEBACiAJCUk5MTVfV1JJVEUoTUlQSV9NQVhfUkVUVVJOX1BLVF9TSVpFKHBpcGUpLCA4ICogNCk7CiAJZWxzZSB7CiAJCW1zbGVlcCgyMCk7IC8qIFhYWCAqLwotCQlkcGlfc2VuZF9jbWQoaW50ZWxfZHNpLCBUVVJOX09OKTsKKwkJZHBpX3NlbmRfY21kKGludGVsX2RzaSwgVFVSTl9PTiwgRFBJX0xQX01PREVfRU4pOwogCQltc2xlZXAoMTAwKTsKIAorCQlpZiAoaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+ZW5hYmxlKQorCQkJaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+ZW5hYmxlKCZpbnRlbF9kc2ktPmRldik7CisKIAkJLyogYXNzZXJ0IGlwX3RnX2VuYWJsZSBzaWduYWwgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChNSVBJX1BPUlRfQ1RSTChwaXBlKSkgJiB+TEFORV9DT05GSUdVUkFUSU9OX01BU0s7CiAJCXRlbXAgPSB0ZW1wIHwgaW50ZWxfZHNpLT5wb3J0X2JpdHM7CiAJCUk5MTVfV1JJVEUoTUlQSV9QT1JUX0NUUkwocGlwZSksIHRlbXAgfCBEUElfRU5BQkxFKTsKIAkJUE9TVElOR19SRUFEKE1JUElfUE9SVF9DVFJMKHBpcGUpKTsKIAl9Cit9CiAKLQlpZiAoaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+ZW5hYmxlKQotCQlpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5lbmFibGUoJmludGVsX2RzaS0+ZGV2KTsKK3N0YXRpYyB2b2lkIGludGVsX2RzaV9wcmVfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGVuY190b19pbnRlbF9kc2koJmVuY29kZXItPmJhc2UpOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgdG1wOworCisJRFJNX0RFQlVHX0tNUygiXG4iKTsKKworCS8qIERpc2FibGUgRFBPdW5pdCBjbG9jayBnYXRpbmcsIGNhbiBzdGFsbCBwaXBlCisJICogYW5kIHdlIG5lZWQgRFBMTCBSRUZBIGFsd2F5cyBlbmFibGVkICovCisJdG1wID0gSTkxNV9SRUFEKERQTEwocGlwZSkpOworCXRtcCB8PSBEUExMX1JFRkFfQ0xLX0VOQUJMRV9WTFY7CisJSTkxNV9XUklURShEUExMKHBpcGUpLCB0bXApOworCisJdG1wID0gSTkxNV9SRUFEKERTUENMS19HQVRFX0QpOworCXRtcCB8PSBEUE9VTklUX0NMT0NLX0dBVEVfRElTQUJMRTsKKwlJOTE1X1dSSVRFKERTUENMS19HQVRFX0QsIHRtcCk7CisKKwkvKiBwdXQgZGV2aWNlIGluIHJlYWR5IHN0YXRlICovCisJaW50ZWxfZHNpX2RldmljZV9yZWFkeShlbmNvZGVyKTsKKworCW1zbGVlcChpbnRlbF9kc2ktPnBhbmVsX29uX2RlbGF5KTsKKworCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5wYW5lbF9yZXNldCkKKwkJaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+cGFuZWxfcmVzZXQoJmludGVsX2RzaS0+ZGV2KTsKKworCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5zZW5kX290cF9jbWRzKQorCQlpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5zZW5kX290cF9jbWRzKCZpbnRlbF9kc2ktPmRldik7CisKKwkvKiBFbmFibGUgcG9ydCBpbiBwcmUtZW5hYmxlIHBoYXNlIGl0c2VsZiBiZWNhdXNlIGFzIHBlciBodyB0ZWFtCisJICogcmVjb21tZW5kYXRpb24sIHBvcnQgc2hvdWxkIGJlIGVuYWJsZWQgYmVmb3IgcGxhbmUgJiBwaXBlICovCisJaW50ZWxfZHNpX2VuYWJsZShlbmNvZGVyKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfZHNpX2VuYWJsZV9ub3Aoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKKworCS8qIGZvciBEU0kgcG9ydCBlbmFibGUgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIHBpcGUKKwkgKiBhbmQgcGxhbmUgZW5hYmxlLCBzbyBwb3J0IGVuYWJsZSBpcyBkb25lIGluCisJICogcHJlX2VuYWJsZSBwaGFzZSBpdHNlbGYgdW5saWtlIG90aGVyIGVuY29kZXJzCisJICovCit9CisKK3N0YXRpYyB2b2lkIGludGVsX2RzaV9wcmVfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2kgPSBlbmNfdG9faW50ZWxfZHNpKCZlbmNvZGVyLT5iYXNlKTsKKworCURSTV9ERUJVR19LTVMoIlxuIik7CisKKwlpZiAoaXNfdmlkX21vZGUoaW50ZWxfZHNpKSkgeworCQkvKiBTZW5kIFNodXRkb3duIGNvbW1hbmQgdG8gdGhlIHBhbmVsIGluIExQIG1vZGUgKi8KKwkJZHBpX3NlbmRfY21kKGludGVsX2RzaSwgU0hVVERPV04sIERQSV9MUF9NT0RFX0VOKTsKKwkJbXNsZWVwKDEwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX2RzaV9kaXNhYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTc5LDkgKzIzMSw2IEBACiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCWlmIChpc192aWRfbW9kZShpbnRlbF9kc2kpKSB7Ci0JCWRwaV9zZW5kX2NtZChpbnRlbF9kc2ksIFNIVVRET1dOKTsKLQkJbXNsZWVwKDEwKTsKLQogCQkvKiBkZS1hc3NlcnQgaXBfdGdfZW5hYmxlIHNpZ25hbCAqLwogCQl0ZW1wID0gSTkxNV9SRUFEKE1JUElfUE9SVF9DVFJMKHBpcGUpKTsKIAkJSTkxNV9XUklURShNSVBJX1BPUlRfQ1RSTChwaXBlKSwgdGVtcCAmIH5EUElfRU5BQkxFKTsKQEAgLTE5MCw2ICsyMzksMjMgQEAKIAkJbXNsZWVwKDIpOwogCX0KIAorCS8qIFBhbmVsIGNvbW1hbmRzIGNhbiBiZSBzZW50IHdoZW4gY2xvY2sgaXMgaW4gTFAxMSAqLworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIDB4MCk7CisKKwl0ZW1wID0gSTkxNV9SRUFEKE1JUElfQ1RSTChwaXBlKSk7CisJdGVtcCAmPSB+RVNDQVBFX0NMT0NLX0RJVklERVJfTUFTSzsKKwlJOTE1X1dSSVRFKE1JUElfQ1RSTChwaXBlKSwgdGVtcCB8CisJCQlpbnRlbF9kc2ktPmVzY2FwZV9jbGtfZGl2IDw8CisJCQlFU0NBUEVfQ0xPQ0tfRElWSURFUl9TSElGVCk7CisKKwlJOTE1X1dSSVRFKE1JUElfRU9UX0RJU0FCTEUocGlwZSksIENMT0NLU1RPUCk7CisKKwl0ZW1wID0gSTkxNV9SRUFEKE1JUElfRFNJX0ZVTkNfUFJHKHBpcGUpKTsKKwl0ZW1wICY9IH5WSURfTU9ERV9GT1JNQVRfTUFTSzsKKwlJOTE1X1dSSVRFKE1JUElfRFNJX0ZVTkNfUFJHKHBpcGUpLCB0ZW1wKTsKKworCUk5MTVfV1JJVEUoTUlQSV9ERVZJQ0VfUkVBRFkocGlwZSksIDB4MSk7CisKIAkvKiBpZiBkaXNhYmxlIHBhY2tldHMgYXJlIHNlbnQgYmVmb3JlIHNlbmRpbmcgc2h1dGRvd24gcGFja2V0IHRoZW4gaW4KIAkgKiBzb21lIG5leHQgZW5hYmxlIHNlcXVlbmNlIHNlbmQgdHVybiBvbiBwYWNrZXQgZXJyb3IgaXMgb2JzZXJ2ZWQgKi8KIAlpZiAoaW50ZWxfZHNpLT5kZXYuZGV2X29wcy0+ZGlzYWJsZSkKQEAgLTIyNywxNiArMjkzLDI4IEBACiAKIAl2bHZfZGlzYWJsZV9kc2lfcGxsKGVuY29kZXIpOwogfQorCiBzdGF0aWMgdm9pZCBpbnRlbF9kc2lfcG9zdF9kaXNhYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQogeworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2kgPSBlbmNfdG9faW50ZWxfZHNpKCZlbmNvZGVyLT5iYXNlKTsKKwl1MzIgdmFsOwogCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAorCWludGVsX2RzaV9kaXNhYmxlKGVuY29kZXIpOworCiAJaW50ZWxfZHNpX2NsZWFyX2RldmljZV9yZWFkeShlbmNvZGVyKTsKIAorCXZhbCA9IEk5MTVfUkVBRChEU1BDTEtfR0FURV9EKTsKKwl2YWwgJj0gfkRQT1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFOworCUk5MTVfV1JJVEUoRFNQQ0xLX0dBVEVfRCwgdmFsKTsKKwogCWlmIChpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5kaXNhYmxlX3BhbmVsX3Bvd2VyKQogCQlpbnRlbF9kc2ktPmRldi5kZXZfb3BzLT5kaXNhYmxlX3BhbmVsX3Bvd2VyKCZpbnRlbF9kc2ktPmRldik7CisKKwltc2xlZXAoaW50ZWxfZHNpLT5wYW5lbF9vZmZfZGVsYXkpOworCW1zbGVlcChpbnRlbF9kc2ktPnBhbmVsX3B3cl9jeWNsZV9kZWxheSk7CiB9CiAKIHN0YXRpYyBib29sIGludGVsX2RzaV9nZXRfaHdfc3RhdGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCkBAIC0zNjQsNyArNDQyLDcgQEAKIAlJOTE1X1dSSVRFKE1JUElfVkJQX0NPVU5UKHBpcGUpLCB2YnApOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9kc2lfbW9kZV9zZXQoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIpCitzdGF0aWMgdm9pZCBpbnRlbF9kc2lfcHJlcGFyZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW50ZWxfZW5jb2Rlci0+YmFzZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwpAQCAtMzc5LDkgKzQ1Nyw2IEBACiAKIAlEUk1fREVCVUdfS01TKCJwaXBlICVjXG4iLCBwaXBlX25hbWUocGlwZSkpOwogCi0JLyogWFhYOiBMb2NhdGlvbiBvZiB0aGUgY2FsbCAqLwotCWJhbmRfZ2FwX3Jlc2V0KGRldl9wcml2KTsKLQogCS8qIGVzY2FwZSBjbG9jayBkaXZpZGVyLCAyME1Ieiwgc2hhcmVkIGZvciBBIGFuZCBDLiBkZXZpY2UgcmVhZHkgbXVzdCBiZQogCSAqIG9mZiB3aGVuIGRvaW5nIHRoaXMhIHR4Y2xrZXNjPyAqLwogCXRtcCA9IEk5MTVfUkVBRChNSVBJX0NUUkwoMCkpOwpAQCAtNDUyLDEwICs1MjcsMjAgQEAKIAkvKiBkcGh5IHN0dWZmICovCiAKIAkvKiBpbiB0ZXJtcyBvZiBsb3cgcG93ZXIgY2xvY2sgKi8KLQlJOTE1X1dSSVRFKE1JUElfSU5JVF9DT1VOVChwaXBlKSwgdHhjbGtlc2MoRVNDQVBFX0NMT0NLX0RJVklERVJfMSwgMTAwKSk7CisJSTkxNV9XUklURShNSVBJX0lOSVRfQ09VTlQocGlwZSksIHR4Y2xrZXNjKGludGVsX2RzaS0+ZXNjYXBlX2Nsa19kaXYsIDEwMCkpOworCisJdmFsID0gMDsKKwlpZiAoaW50ZWxfZHNpLT5lb3RwX3BrdCA9PSAwKQorCQl2YWwgfD0gRU9UX0RJU0FCTEU7CisKKwlpZiAoaW50ZWxfZHNpLT5jbG9ja19zdG9wKQorCQl2YWwgfD0gQ0xPQ0tTVE9QOwogCiAJLyogcmVjb3ZlcnkgZGlzYWJsZXMgKi8KLQlJOTE1X1dSSVRFKE1JUElfRU9UX0RJU0FCTEUocGlwZSksIGludGVsX2RzaS0+ZW90X2Rpc2FibGUpOworCUk5MTVfV1JJVEUoTUlQSV9FT1RfRElTQUJMRShwaXBlKSwgdmFsKTsKKworCS8qIGluIHRlcm1zIG9mIGxvdyBwb3dlciBjbG9jayAqLworCUk5MTVfV1JJVEUoTUlQSV9JTklUX0NPVU5UKHBpcGUpLCBpbnRlbF9kc2ktPmluaXRfY291bnQpOwogCiAJLyogaW4gdGVybXMgb2YgdHhieXRlY2xraHMuIGFjdHVhbCBoaWdoIHRvIGxvdyBzd2l0Y2ggKwogCSAqIE1JUElfU1RPUF9TVEFURV9TVEFMTCAqIE1JUElfTFBfQllURUNMSy4KQEAgLTQ4NCw5ICs1NjksMjMgQEAKIAkJICAgaW50ZWxfZHNpLT5jbGtfaHNfdG9fbHBfY291bnQgPDwgSFNfTFBfUFdSX1NXX0NOVF9TSElGVCk7CiAKIAlpZiAoaXNfdmlkX21vZGUoaW50ZWxfZHNpKSkKKwkJLyogU29tZSBwYW5lbHMgbWlnaHQgaGF2ZSByZXNvbHV0aW9uIHdoaWNoIGlzIG5vdCBhIG11bHRpcGxlIG9mCisJCSAqIDY0IGxpa2UgMTM2NiB4IDc2OC4gRW5hYmxlIFJBTkRPTSByZXNvbHV0aW9uIHN1cHBvcnQgZm9yIHN1Y2gKKwkJICogcGFuZWxzIGJ5IGRlZmF1bHQgKi8KIAkJSTkxNV9XUklURShNSVBJX1ZJREVPX01PREVfRk9STUFUKHBpcGUpLAogCQkJCWludGVsX2RzaS0+dmlkZW9fZnJtdF9jZmdfYml0cyB8Ci0JCQkJaW50ZWxfZHNpLT52aWRlb19tb2RlX2Zvcm1hdCk7CisJCQkJaW50ZWxfZHNpLT52aWRlb19tb2RlX2Zvcm1hdCB8CisJCQkJSVBfVEdfQ09ORklHIHwKKwkJCQlSQU5ET01fRFBJX0RJU1BMQVlfUkVTT0xVVElPTik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2RzaV9wcmVfcGxsX2VuYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3sKKwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJaW50ZWxfZHNpX3ByZXBhcmUoZW5jb2Rlcik7CisKKwl2bHZfZW5hYmxlX2RzaV9wbGwoZW5jb2Rlcik7CiB9CiAKIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCkBAIC01NjYsMTEgKzY2NSwxNiBAQAogCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmludGVsX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWNvbnN0IHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlICpkc2k7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlEUk1fREVCVUdfS01TKCJcbiIpOwogCisJLyogVGhlcmUgaXMgbm8gZGV0ZWN0aW9uIG1ldGhvZCBmb3IgTUlQSSBzbyByZWx5IG9uIFZCVCAqLworCWlmICghZGV2X3ByaXYtPnZidC5oYXNfbWlwaSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaW50ZWxfZHNpID0ga3phbGxvYyhzaXplb2YoKmludGVsX2RzaSksIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfZHNpKQogCQlyZXR1cm4gZmFsc2U7CkBAIC01ODUsNiArNjg5LDEzIEBACiAJZW5jb2RlciA9ICZpbnRlbF9lbmNvZGVyLT5iYXNlOwogCWludGVsX2RzaS0+YXR0YWNoZWRfY29ubmVjdG9yID0gaW50ZWxfY29ubmVjdG9yOwogCisJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgeworCQlkZXZfcHJpdi0+bWlwaV9tbWlvX2Jhc2UgPSBWTFZfTUlQSV9CQVNFOworCX0gZWxzZSB7CisJCURSTV9FUlJPUigiVW5zdXBwb3J0ZWQgTWlwaSBkZXZpY2UgdG8gcmVnIGJhc2UiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCWNvbm5lY3RvciA9ICZpbnRlbF9jb25uZWN0b3ItPmJhc2U7CiAKIAlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJmludGVsX2RzaV9mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EU0kpOwpAQCAtNTk0LDkgKzcwNSw4IEBACiAJaW50ZWxfZW5jb2Rlci0+Y29tcHV0ZV9jb25maWcgPSBpbnRlbF9kc2lfY29tcHV0ZV9jb25maWc7CiAJaW50ZWxfZW5jb2Rlci0+cHJlX3BsbF9lbmFibGUgPSBpbnRlbF9kc2lfcHJlX3BsbF9lbmFibGU7CiAJaW50ZWxfZW5jb2Rlci0+cHJlX2VuYWJsZSA9IGludGVsX2RzaV9wcmVfZW5hYmxlOwotCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2RzaV9lbmFibGU7Ci0JaW50ZWxfZW5jb2Rlci0+bW9kZV9zZXQgPSBpbnRlbF9kc2lfbW9kZV9zZXQ7Ci0JaW50ZWxfZW5jb2Rlci0+ZGlzYWJsZSA9IGludGVsX2RzaV9kaXNhYmxlOworCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2RzaV9lbmFibGVfbm9wOworCWludGVsX2VuY29kZXItPmRpc2FibGUgPSBpbnRlbF9kc2lfcHJlX2Rpc2FibGU7CiAJaW50ZWxfZW5jb2Rlci0+cG9zdF9kaXNhYmxlID0gaW50ZWxfZHNpX3Bvc3RfZGlzYWJsZTsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfaHdfc3RhdGUgPSBpbnRlbF9kc2lfZ2V0X2h3X3N0YXRlOwogCWludGVsX2VuY29kZXItPmdldF9jb25maWcgPSBpbnRlbF9kc2lfZ2V0X2NvbmZpZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaS5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmgKaW5kZXggYjRhMjdjZS4uMzFkYjMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmgKQEAgLTMxLDcgKzMxLDYgQEAKIHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlIHsKIAl1bnNpZ25lZCBpbnQgcGFuZWxfaWQ7CiAJY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgdHlwZTsKIAljb25zdCBzdHJ1Y3QgaW50ZWxfZHNpX2Rldl9vcHMgKmRldl9vcHM7CiAJdm9pZCAqZGV2X3ByaXY7CiB9OwpAQCAtODUsNiArODQsOSBAQAogCS8qIHZpcnR1YWwgY2hhbm5lbCAqLwogCWludCBjaGFubmVsOwogCisJLyogVmlkZW8gbW9kZSBvciBjb21tYW5kIG1vZGUgKi8KKwl1MTYgb3BlcmF0aW9uX21vZGU7CisKIAkvKiBudW1iZXIgb2YgRFNJIGxhbmVzICovCiAJdW5zaWduZWQgaW50IGxhbmVfY291bnQ7CiAKQEAgLTk1LDggKzk3LDEwIEBACiAJdTMyIHZpZGVvX21vZGVfZm9ybWF0OwogCiAJLyogZW90IGZvciBNSVBJX0VPVF9ESVNBQkxFIHJlZ2lzdGVyICovCi0JdTMyIGVvdF9kaXNhYmxlOworCXU4IGVvdHBfcGt0OworCXU4IGNsb2NrX3N0b3A7CiAKKwl1OCBlc2NhcGVfY2xrX2RpdjsKIAl1MzIgcG9ydF9iaXRzOwogCXUzMiBid190aW1lcjsKIAl1MzIgZHBoeV9yZWc7CkBAIC0xMTAsNiArMTE0LDE1IEBACiAJdTE2IGhzX3RvX2xwX2NvdW50OwogCXUxNiBjbGtfbHBfdG9faHNfY291bnQ7CiAJdTE2IGNsa19oc190b19scF9jb3VudDsKKworCXUxNiBpbml0X2NvdW50OworCisJLyogYWxsIGRlbGF5cyBpbiBtcyAqLworCXUxNiBiYWNrbGlnaHRfb2ZmX2RlbGF5OworCXUxNiBiYWNrbGlnaHRfb25fZGVsYXk7CisJdTE2IHBhbmVsX29uX2RlbGF5OworCXUxNiBwYW5lbF9vZmZfZGVsYXk7CisJdTE2IHBhbmVsX3B3cl9jeWNsZV9kZWxheTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2RzaSAqZW5jX3RvX2ludGVsX2RzaShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC0xMjAsNCArMTMzLDYgQEAKIGV4dGVybiB2b2lkIHZsdl9lbmFibGVfZHNpX3BsbChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gdm9pZCB2bHZfZGlzYWJsZV9kc2lfcGxsKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKTsKIAorZXh0ZXJuIHN0cnVjdCBpbnRlbF9kc2lfZGV2X29wcyB2YnRfZ2VuZXJpY19kc2lfZGlzcGxheV9vcHM7CisKICNlbmRpZiAvKiBfSU5URUxfRFNJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaV9jbWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaV9jbWQuYwppbmRleCA3YzQwZjk4Li4zZWViMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2lfY21kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX2NtZC5jCkBAIC0zODksNyArMzg5LDcgQEAKICAqCiAgKiBYWFg6IGNvbW1hbmRzIHdpdGggZGF0YSBpbiBNSVBJX0RQSV9EQVRBPwogICovCi1pbnQgZHBpX3NlbmRfY21kKHN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSwgdTMyIGNtZCkKK2ludCBkcGlfc2VuZF9jbWQoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpLCB1MzIgY21kLCBib29sIGhzKQogewogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZpbnRlbF9kc2ktPmJhc2UuYmFzZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJdTMyIG1hc2s7CiAKIAkvKiBYWFg6IHBpcGUsIGhzICovCi0JaWYgKGludGVsX2RzaS0+aHMpCisJaWYgKGhzKQogCQljbWQgJj0gfkRQSV9MUF9NT0RFOwogCWVsc2UKIAkJY21kIHw9IERQSV9MUF9NT0RFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX2NtZC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX2NtZC5oCmluZGV4IDU0YzhhMjMuLjlhMThjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RzaV9jbWQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2lfY21kLmgKQEAgLTMzLDYgKzMzLDkgQEAKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpbnRlbF9kc2kuaCIKIAorI2RlZmluZSBEUElfTFBfTU9ERV9FTglmYWxzZQorI2RlZmluZSBEUElfSFNfTU9ERV9FTgl0cnVlCisKIHZvaWQgZHNpX2hzX21vZGVfZW5hYmxlKHN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSwgYm9vbCBlbmFibGUpOwogCiBpbnQgZHNpX3ZjX2Rjc193cml0ZShzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2ksIGludCBjaGFubmVsLApAQCAtNDcsNyArNTAsNyBAQAogaW50IGRzaV92Y19nZW5lcmljX3JlYWQoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpLCBpbnQgY2hhbm5lbCwKIAkJCXU4ICpyZXFkYXRhLCBpbnQgcmVxbGVuLCB1OCAqYnVmLCBpbnQgYnVmbGVuKTsKIAotaW50IGRwaV9zZW5kX2NtZChzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2ksIHUzMiBjbWQpOworaW50IGRwaV9zZW5kX2NtZChzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2ksIHUzMiBjbWQsIGJvb2wgaHMpOwogCiAvKiBYWFg6IHF1ZXN0aW9uYWJsZSB3cml0ZSBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIGludCBkc2lfdmNfZGNzX3dyaXRlXzAoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX3BhbmVsX3ZidC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpX3BhbmVsX3ZidC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTBkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2lfcGFuZWxfdmJ0LmMKQEAgLTAsMCArMSw1ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFNob2JoaXQgS3VtYXIgPHNob2JoaXQua3VtYXJAaW50ZWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2VkaWQuaD4KKyNpbmNsdWRlIDxkcm0vaTkxNV9kcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlzcGxheS5oPgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaW50ZWxfZHNpLmgiCisjaW5jbHVkZSAiaW50ZWxfZHNpX2NtZC5oIgorCisjZGVmaW5lIE1JUElfVFJBTlNGRVJfTU9ERV9TSElGVAkwCisjZGVmaW5lIE1JUElfVklSVFVBTF9DSEFOTkVMX1NISUZUCTEKKyNkZWZpbmUgTUlQSV9QT1JUX1NISUZUCQkJMworCisjZGVmaW5lIFBSRVBBUkVfQ05UX01BWAkJMHgzRgorI2RlZmluZSBFWElUX1pFUk9fQ05UX01BWAkweDNGCisjZGVmaW5lIENMS19aRVJPX0NOVF9NQVgJMHhGRgorI2RlZmluZSBUUkFJTF9DTlRfTUFYCQkweDFGCisKKyNkZWZpbmUgTlNfS0haX1JBVElPIDEwMDAwMDAKKworI2RlZmluZSBHUEkwX05DXzBfSFZfRERJMF9IUEQgICAgICAgICAgIDB4NDEzMAorI2RlZmluZSBHUElPX05DXzBfSFZfRERJMF9QQUQgICAgICAgICAgIDB4NDEzOAorI2RlZmluZSBHUElPX05DXzFfSFZfRERJMF9ERENfU0RBICAgICAgIDB4NDEyMAorI2RlZmluZSBHUElPX05DXzFfSFZfRERJMF9ERENfU0RBX1BBRCAgIDB4NDEyOAorI2RlZmluZSBHUElPX05DXzJfSFZfRERJMF9ERENfU0NMICAgICAgIDB4NDExMAorI2RlZmluZSBHUElPX05DXzJfSFZfRERJMF9ERENfU0NMX1BBRCAgIDB4NDExOAorI2RlZmluZSBHUElPX05DXzNfUEFORUwwX1ZEREVOICAgICAgICAgIDB4NDE0MAorI2RlZmluZSBHUElPX05DXzNfUEFORUwwX1ZEREVOX1BBRCAgICAgIDB4NDE0OAorI2RlZmluZSBHUElPX05DXzRfUEFORUwwX0JMS0VOICAgICAgICAgIDB4NDE1MAorI2RlZmluZSBHUElPX05DXzRfUEFORUwwX0JMS0VOX1BBRCAgICAgIDB4NDE1OAorI2RlZmluZSBHUElPX05DXzVfUEFORUwwX0JMS0NUTCAgICAgICAgIDB4NDE2MAorI2RlZmluZSBHUElPX05DXzVfUEFORUwwX0JMS0NUTF9QQUQgICAgIDB4NDE2OAorI2RlZmluZSBHUElPX05DXzZfUENPTkYwICAgICAgICAgICAgICAgIDB4NDE4MAorI2RlZmluZSBHUElPX05DXzZfUEFEICAgICAgICAgICAgICAgICAgIDB4NDE4OAorI2RlZmluZSBHUElPX05DXzdfUENPTkYwICAgICAgICAgICAgICAgIDB4NDE5MAorI2RlZmluZSBHUElPX05DXzdfUEFEICAgICAgICAgICAgICAgICAgIDB4NDE5OAorI2RlZmluZSBHUElPX05DXzhfUENPTkYwICAgICAgICAgICAgICAgIDB4NDE3MAorI2RlZmluZSBHUElPX05DXzhfUEFEICAgICAgICAgICAgICAgICAgIDB4NDE3OAorI2RlZmluZSBHUElPX05DXzlfUENPTkYwICAgICAgICAgICAgICAgIDB4NDEwMAorI2RlZmluZSBHUElPX05DXzlfUEFEICAgICAgICAgICAgICAgICAgIDB4NDEwOAorI2RlZmluZSBHUElPX05DXzEwX1BDT05GMCAgICAgICAgICAgICAgIDB4NDBFMAorI2RlZmluZSBHUElPX05DXzEwX1BBRCAgICAgICAgICAgICAgICAgIDB4NDBFOAorI2RlZmluZSBHUElPX05DXzExX1BDT05GMCAgICAgICAgICAgICAgIDB4NDBGMAorI2RlZmluZSBHUElPX05DXzExX1BBRCAgICAgICAgICAgICAgICAgIDB4NDBGOAorCitzdHJ1Y3QgZ3Bpb190YWJsZSB7CisJdTE2IGZ1bmN0aW9uX3JlZzsKKwl1MTYgcGFkX3JlZzsKKwl1OCBpbml0OworfTsKKworc3RhdGljIHN0cnVjdCBncGlvX3RhYmxlIGd0YWJsZVtdID0geworCXsgR1BJMF9OQ18wX0hWX0RESTBfSFBELCBHUElPX05DXzBfSFZfRERJMF9QQUQsIDAgfSwKKwl7IEdQSU9fTkNfMV9IVl9EREkwX0REQ19TREEsIEdQSU9fTkNfMV9IVl9EREkwX0REQ19TREFfUEFELCAwIH0sCisJeyBHUElPX05DXzJfSFZfRERJMF9ERENfU0NMLCBHUElPX05DXzJfSFZfRERJMF9ERENfU0NMX1BBRCwgMCB9LAorCXsgR1BJT19OQ18zX1BBTkVMMF9WRERFTiwgR1BJT19OQ18zX1BBTkVMMF9WRERFTl9QQUQsIDAgfSwKKwl7IEdQSU9fTkNfNF9QQU5FTDBfQkxLRU4sIEdQSU9fTkNfNF9QQU5FTDBfQkxLRU5fUEFELCAwIH0sCisJeyBHUElPX05DXzVfUEFORUwwX0JMS0NUTCwgR1BJT19OQ181X1BBTkVMMF9CTEtDVExfUEFELCAwIH0sCisJeyBHUElPX05DXzZfUENPTkYwLCBHUElPX05DXzZfUEFELCAwIH0sCisJeyBHUElPX05DXzdfUENPTkYwLCBHUElPX05DXzdfUEFELCAwIH0sCisJeyBHUElPX05DXzhfUENPTkYwLCBHUElPX05DXzhfUEFELCAwIH0sCisJeyBHUElPX05DXzlfUENPTkYwLCBHUElPX05DXzlfUEFELCAwIH0sCisJeyBHUElPX05DXzEwX1BDT05GMCwgR1BJT19OQ18xMF9QQUQsIDB9LAorCXsgR1BJT19OQ18xMV9QQ09ORjAsIEdQSU9fTkNfMTFfUEFELCAwfQorfTsKKworc3RhdGljIHU4ICptaXBpX2V4ZWNfc2VuZF9wYWNrZXQoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpLCB1OCAqZGF0YSkKK3sKKwl1OCB0eXBlLCBieXRlLCBtb2RlLCB2YywgcG9ydDsKKwl1MTYgbGVuOworCisJYnl0ZSA9ICpkYXRhKys7CisJbW9kZSA9IChieXRlID4+IE1JUElfVFJBTlNGRVJfTU9ERV9TSElGVCkgJiAweDE7CisJdmMgPSAoYnl0ZSA+PiBNSVBJX1ZJUlRVQUxfQ0hBTk5FTF9TSElGVCkgJiAweDM7CisJcG9ydCA9IChieXRlID4+IE1JUElfUE9SVF9TSElGVCkgJiAweDM7CisKKwkvKiBMUCBvciBIUyBtb2RlICovCisJaW50ZWxfZHNpLT5ocyA9IG1vZGU7CisKKwkvKiBnZXQgcGFja2V0IHR5cGUgYW5kIGluY3JlbWVudCB0aGUgcG9pbnRlciAqLworCXR5cGUgPSAqZGF0YSsrOworCisJbGVuID0gKigodTE2ICopIGRhdGEpOworCWRhdGEgKz0gMjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8wX1BBUkFNOgorCQlkc2lfdmNfZ2VuZXJpY193cml0ZV8wKGludGVsX2RzaSwgdmMpOworCQlicmVhazsKKwljYXNlIE1JUElfRFNJX0dFTkVSSUNfU0hPUlRfV1JJVEVfMV9QQVJBTToKKwkJZHNpX3ZjX2dlbmVyaWNfd3JpdGVfMShpbnRlbF9kc2ksIHZjLCAqZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8yX1BBUkFNOgorCQlkc2lfdmNfZ2VuZXJpY193cml0ZV8yKGludGVsX2RzaSwgdmMsICpkYXRhLCAqKGRhdGEgKyAxKSk7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfR0VORVJJQ19SRUFEX1JFUVVFU1RfMF9QQVJBTToKKwljYXNlIE1JUElfRFNJX0dFTkVSSUNfUkVBRF9SRVFVRVNUXzFfUEFSQU06CisJY2FzZSBNSVBJX0RTSV9HRU5FUklDX1JFQURfUkVRVUVTVF8yX1BBUkFNOgorCQlEUk1fREVCVUdfRFJJVkVSKCJHZW5lcmljIFJlYWQgbm90IHlldCBpbXBsZW1lbnRlZCBvciB1c2VkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNSVBJX0RTSV9HRU5FUklDX0xPTkdfV1JJVEU6CisJCWRzaV92Y19nZW5lcmljX3dyaXRlKGludGVsX2RzaSwgdmMsIGRhdGEsIGxlbik7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFOgorCQlkc2lfdmNfZGNzX3dyaXRlXzAoaW50ZWxfZHNpLCB2YywgKmRhdGEpOworCQlicmVhazsKKwljYXNlIE1JUElfRFNJX0RDU19TSE9SVF9XUklURV9QQVJBTToKKwkJZHNpX3ZjX2Rjc193cml0ZV8xKGludGVsX2RzaSwgdmMsICpkYXRhLCAqKGRhdGEgKyAxKSk7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfRENTX1JFQUQ6CisJCURSTV9ERUJVR19EUklWRVIoIkRDUyBSZWFkIG5vdCB5ZXQgaW1wbGVtZW50ZWQgb3IgdXNlZFxuIik7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfRENTX0xPTkdfV1JJVEU6CisJCWRzaV92Y19kY3Nfd3JpdGUoaW50ZWxfZHNpLCB2YywgZGF0YSwgbGVuKTsKKwkJYnJlYWs7CisJfTsKKworCWRhdGEgKz0gbGVuOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1OCAqbWlwaV9leGVjX2RlbGF5KHN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSwgdTggKmRhdGEpCit7CisJdTMyIGRlbGF5ID0gKigodTMyICopIGRhdGEpOworCisJdXNsZWVwX3JhbmdlKGRlbGF5LCBkZWxheSArIDEwKTsKKwlkYXRhICs9IDQ7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHU4ICptaXBpX2V4ZWNfZ3BpbyhzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2ksIHU4ICpkYXRhKQoreworCXU4IGdwaW8sIGFjdGlvbjsKKwl1MTYgZnVuY3Rpb24sIHBhZDsKKwl1MzIgdmFsOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kc2ktPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWdwaW8gPSAqZGF0YSsrOworCisJLyogcHVsbCB1cC9kb3duICovCisJYWN0aW9uID0gKmRhdGErKzsKKworCWZ1bmN0aW9uID0gZ3RhYmxlW2dwaW9dLmZ1bmN0aW9uX3JlZzsKKwlwYWQgPSBndGFibGVbZ3Bpb10ucGFkX3JlZzsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCWlmICghZ3RhYmxlW2dwaW9dLmluaXQpIHsKKwkJLyogcHJvZ3JhbSB0aGUgZnVuY3Rpb24gKi8KKwkJLyogRklYTUU6IHJlbW92ZSBjb25zdGFudCBiZWxvdyAqLworCQl2bHZfZ3Bpb19uY193cml0ZShkZXZfcHJpdiwgZnVuY3Rpb24sIDB4MjAwMENDMDApOworCQlndGFibGVbZ3Bpb10uaW5pdCA9IDE7CisJfQorCisJdmFsID0gMHg0IHwgYWN0aW9uOworCisJLyogcHVsbCB1cC9kb3duICovCisJdmx2X2dwaW9fbmNfd3JpdGUoZGV2X3ByaXYsIHBhZCwgdmFsKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3R5cGVkZWYgdTggKiAoKmZuX21pcGlfZWxlbV9leGVjKShzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2ksIHU4ICpkYXRhKTsKK3N0YXRpYyBjb25zdCBmbl9taXBpX2VsZW1fZXhlYyBleGVjX2VsZW1bXSA9IHsKKwlOVUxMLCAvKiByZXNlcnZlZCAqLworCW1pcGlfZXhlY19zZW5kX3BhY2tldCwKKwltaXBpX2V4ZWNfZGVsYXksCisJbWlwaV9leGVjX2dwaW8sCisJTlVMTCwgLyogc3RhdHVzIHJlYWQ7IGxhdGVyICovCit9OworCisvKgorICogTUlQSSBTZXF1ZW5jZSBmcm9tIFZCVCAjNTMgcGFyc2luZyBsb2dpYworICogV2UgaGF2ZSBhbHJlYWR5IHNlcGFyYXRlZCBlYWNoIHNlcWVuY2UgZHVyaW5nIGJpb3MgcGFyc2luZworICogRm9sbG93aW5nIGlzIGdlbmVyaWMgZXhlY3V0aW9uIGZ1bmN0aW9uIGZvciBhbnkgc2VxdWVuY2UKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlcV9uYW1lW10gPSB7CisJIlVOREVGSU5FRCIsCisJIk1JUElfU0VRX0FTU0VSVF9SRVNFVCIsCisJIk1JUElfU0VRX0lOSVRfT1RQIiwKKwkiTUlQSV9TRVFfRElTUExBWV9PTiIsCisJIk1JUElfU0VRX0RJU1BMQVlfT0ZGIiwKKwkiTUlQSV9TRVFfREVBU1NFUlRfUkVTRVQiCit9OworCitzdGF0aWMgdm9pZCBnZW5lcmljX2V4ZWNfc2VxdWVuY2Uoc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpLCBjaGFyICpzZXF1ZW5jZSkKK3sKKwl1OCAqZGF0YSA9IHNlcXVlbmNlOworCWZuX21pcGlfZWxlbV9leGVjIG1pcGlfZWxlbV9leGVjOworCWludCBpbmRleDsKKworCWlmICghc2VxdWVuY2UpCisJCXJldHVybjsKKworCURSTV9ERUJVR19EUklWRVIoIlN0YXJ0aW5nIE1JUEkgc2VxdWVuY2UgLSAlc1xuIiwgc2VxX25hbWVbKmRhdGFdKTsKKworCS8qIGdvIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAqLworCWRhdGErKzsKKworCS8qIHBhcnNlIGVhY2ggYnl0ZSB0aWxsIHdlIHJlYWNoIGVuZCBvZiBzZXF1ZW5jZSBieXRlIC0gMHgwMCAqLworCXdoaWxlICgxKSB7CisJCWluZGV4ID0gKmRhdGE7CisJCW1pcGlfZWxlbV9leGVjID0gZXhlY19lbGVtW2luZGV4XTsKKwkJaWYgKCFtaXBpX2VsZW1fZXhlYykgeworCQkJRFJNX0VSUk9SKCJVbnN1cHBvcnRlZCBNSVBJIGVsZW1lbnQsIHNraXBwaW5nIHNlcXVlbmNlIGV4ZWN1dGlvblxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBnb3RvIGVsZW1lbnQgcGF5bG9hZCAqLworCQlkYXRhKys7CisKKwkJLyogZXhlY3V0ZSB0aGUgZWxlbWVudCBzcGVjaWZpYyByb3RpbmVzICovCisJCWRhdGEgPSBtaXBpX2VsZW1fZXhlYyhpbnRlbF9kc2ksIGRhdGEpOworCisJCS8qCisJCSAqIEFmdGVyIHByb2Nlc3NpbmcgdGhlIGVsZW1lbnQsIGRhdGEgc2hvdWxkIHBvaW50IHRvCisJCSAqIG5leHQgZWxlbWVudCBvciBlbmQgb2Ygc2VxdWVuY2UKKwkJICogY2hlY2sgaWYgaGF2ZSB3ZSByZWFjaGVkIGVuZCBvZiBzZXF1ZW5jZQorCQkgKi8KKwkJaWYgKCpkYXRhID09IDB4MDApCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBib29sIGdlbmVyaWNfaW5pdChzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKQoreworCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGNvbnRhaW5lcl9vZihkc2ksIHN0cnVjdCBpbnRlbF9kc2ksIGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RzaS0+YmFzZS5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtaXBpX2NvbmZpZyAqbWlwaV9jb25maWcgPSBkZXZfcHJpdi0+dmJ0LmRzaS5jb25maWc7CisJc3RydWN0IG1pcGlfcHBzX2RhdGEgKnBwcyA9IGRldl9wcml2LT52YnQuZHNpLnBwczsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IGRldl9wcml2LT52YnQubGZwX2x2ZHNfdmJ0X21vZGU7CisJdTMyIGJpdHNfcGVyX3BpeGVsID0gMjQ7CisJdTMyIHRscHhfbnMsIGV4dHJhX2J5dGVfY291bnQsIGJpdHJhdGUsIHRscHhfdWk7CisJdTMyIHVpX251bSwgdWlfZGVuOworCXUzMiBwcmVwYXJlX2NudCwgZXhpdF96ZXJvX2NudCwgY2xrX3plcm9fY250LCB0cmFpbF9jbnQ7CisJdTMyIHRoc19wcmVwYXJlX25zLCB0Y2xrX3RyYWlsX25zOworCXUzMiB0Y2xrX3ByZXBhcmVfY2xremVybywgdGhzX3ByZXBhcmVfaHN6ZXJvOworCXUzMiBscF90b19oc19zd2l0Y2gsIGhzX3RvX2xwX3N3aXRjaDsKKworCURSTV9ERUJVR19LTVMoIlxuIik7CisKKwlpbnRlbF9kc2ktPmVvdHBfcGt0ID0gbWlwaV9jb25maWctPmVvdF9wa3RfZGlzYWJsZWQgPyAwIDogMTsKKwlpbnRlbF9kc2ktPmNsb2NrX3N0b3AgPSBtaXBpX2NvbmZpZy0+ZW5hYmxlX2Nsa19zdG9wID8gMSA6IDA7CisJaW50ZWxfZHNpLT5sYW5lX2NvdW50ID0gbWlwaV9jb25maWctPmxhbmVfY250ICsgMTsKKwlpbnRlbF9kc2ktPnBpeGVsX2Zvcm1hdCA9IG1pcGlfY29uZmlnLT52aWRlb21vZGVfY29sb3JfZm9ybWF0IDw8IDc7CisKKwlpZiAoaW50ZWxfZHNpLT5waXhlbF9mb3JtYXQgPT0gVklEX01PREVfRk9STUFUX1JHQjY2NikKKwkJYml0c19wZXJfcGl4ZWwgPSAxODsKKwllbHNlIGlmIChpbnRlbF9kc2ktPnBpeGVsX2Zvcm1hdCA9PSBWSURfTU9ERV9GT1JNQVRfUkdCNTY1KQorCQliaXRzX3Blcl9waXhlbCA9IDE2OworCisJYml0cmF0ZSA9IChtb2RlLT5jbG9jayAqIGJpdHNfcGVyX3BpeGVsKSAvIGludGVsX2RzaS0+bGFuZV9jb3VudDsKKworCWludGVsX2RzaS0+b3BlcmF0aW9uX21vZGUgPSBtaXBpX2NvbmZpZy0+aXNfY21kX21vZGU7CisJaW50ZWxfZHNpLT52aWRlb19tb2RlX2Zvcm1hdCA9IG1pcGlfY29uZmlnLT52aWRlb190cmFuc2Zlcl9tb2RlOworCWludGVsX2RzaS0+ZXNjYXBlX2Nsa19kaXYgPSBtaXBpX2NvbmZpZy0+Ynl0ZV9jbGtfc2VsOworCWludGVsX2RzaS0+bHBfcnhfdGltZW91dCA9IG1pcGlfY29uZmlnLT5scF9yeF90aW1lb3V0OworCWludGVsX2RzaS0+dHVybl9hcm5kX3ZhbCA9IG1pcGlfY29uZmlnLT50dXJuX2Fyb3VuZF90aW1lb3V0OworCWludGVsX2RzaS0+cnN0X3RpbWVyX3ZhbCA9IG1pcGlfY29uZmlnLT5kZXZpY2VfcmVzZXRfdGltZXI7CisJaW50ZWxfZHNpLT5pbml0X2NvdW50ID0gbWlwaV9jb25maWctPm1hc3Rlcl9pbml0X3RpbWVyOworCWludGVsX2RzaS0+YndfdGltZXIgPSBtaXBpX2NvbmZpZy0+ZGJpX2J3X3RpbWVyOworCWludGVsX2RzaS0+dmlkZW9fZnJtdF9jZmdfYml0cyA9IG1pcGlfY29uZmlnLT5idGFfZW5hYmxlZCA/IERJU0FCTEVfVklERU9fQlRBIDogMDsKKworCXN3aXRjaCAoaW50ZWxfZHNpLT5lc2NhcGVfY2xrX2RpdikgeworCWNhc2UgMDoKKwkJdGxweF9ucyA9IDUwOworCQlicmVhazsKKwljYXNlIDE6CisJCXRscHhfbnMgPSAxMDA7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQl0bHB4X25zID0gMjAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0bHB4X25zID0gNTA7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW50ZWxfZHNpLT5sYW5lX2NvdW50KSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJZXh0cmFfYnl0ZV9jb3VudCA9IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZXh0cmFfYnl0ZV9jb3VudCA9IDQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwlkZWZhdWx0OgorCQlleHRyYV9ieXRlX2NvdW50ID0gMzsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiB1aShzKSA9IDEvZiBbZiBpbiBoel0KKwkgKiB1aShucykgPSAxMF45IC8gKGYqMTBeNikgW2YgaW4gTWh6XSAtPiAxMF4zL2YoTWh6KQorCSAqLworCisJLyogaW4gS2JwcyAqLworCXVpX251bSA9IE5TX0tIWl9SQVRJTzsKKwl1aV9kZW4gPSBiaXRyYXRlOworCisJdGNsa19wcmVwYXJlX2Nsa3plcm8gPSBtaXBpX2NvbmZpZy0+dGNsa19wcmVwYXJlX2Nsa3plcm87CisJdGhzX3ByZXBhcmVfaHN6ZXJvID0gbWlwaV9jb25maWctPnRoc19wcmVwYXJlX2hzemVybzsKKworCS8qCisJICogQjA2MAorCSAqIExQIGJ5dGUgY2xvY2sgPSBUTFBYLyAoOFVJKQorCSAqLworCWludGVsX2RzaS0+bHBfYnl0ZV9jbGsgPSBESVZfUk9VTkRfVVAodGxweF9ucyAqIHVpX2RlbiwgOCAqIHVpX251bSk7CisKKwkvKiBjb3VudCB2YWx1ZXMgaW4gVUkgPSAobnMgdmFsdWUpICogKGJpdHJhdGUgLyAoMiAqIDEwXjYpKQorCSAqCisJICogU2luY2UgdHhkZHJjbGtoc19pIGlzIDJ4VUksIGFsbCB0aGUgY291bnQgdmFsdWVzIHByb2dyYW1tZWQgaW4KKwkgKiBEUEhZIHBhcmFtIHJlZ2lzdGVyIGFyZSBkaXZpZGVkIGJ5IDIKKwkgKgorCSAqIHByZXBhcmUgY291bnQKKwkgKi8KKwl0aHNfcHJlcGFyZV9ucyA9IG1heChtaXBpX2NvbmZpZy0+dGhzX3ByZXBhcmUsIG1pcGlfY29uZmlnLT50Y2xrX3ByZXBhcmUpOworCXByZXBhcmVfY250ID0gRElWX1JPVU5EX1VQKHRoc19wcmVwYXJlX25zICogdWlfZGVuLCB1aV9udW0gKiAyKTsKKworCS8qIGV4aXQgemVybyBjb3VudCAqLworCWV4aXRfemVyb19jbnQgPSBESVZfUk9VTkRfVVAoCisJCQkJKHRoc19wcmVwYXJlX2hzemVybyAtIHRoc19wcmVwYXJlX25zKSAqIHVpX2RlbiwKKwkJCQl1aV9udW0gKiAyCisJCQkJKTsKKworCS8qCisJICogRXhpdCB6ZXJvICBpcyB1bmlmaWVkIHZhbCB0aHNfemVybyBhbmQgdGhzX2V4aXQKKwkgKiBtaW5pbXVtIHZhbHVlIGZvciB0aHNfZXhpdCA9IDExMG5zCisJICogbWluIChleGl0X3plcm9fY250ICogMikgPSAxMTAvVUkKKwkgKiBleGl0X3plcm9fY250ID0gNTUvVUkKKwkgKi8KKwkgaWYgKGV4aXRfemVyb19jbnQgPCAoNTUgKiB1aV9kZW4gLyB1aV9udW0pKQorCQlpZiAoKDU1ICogdWlfZGVuKSAlIHVpX251bSkKKwkJCWV4aXRfemVyb19jbnQgKz0gMTsKKworCS8qIGNsayB6ZXJvIGNvdW50ICovCisJY2xrX3plcm9fY250ID0gRElWX1JPVU5EX1VQKAorCQkJKHRjbGtfcHJlcGFyZV9jbGt6ZXJvIC0JdGhzX3ByZXBhcmVfbnMpCisJCQkqIHVpX2RlbiwgMiAqIHVpX251bSk7CisKKwkvKiB0cmFpbCBjb3VudCAqLworCXRjbGtfdHJhaWxfbnMgPSBtYXgobWlwaV9jb25maWctPnRjbGtfdHJhaWwsIG1pcGlfY29uZmlnLT50aHNfdHJhaWwpOworCXRyYWlsX2NudCA9IERJVl9ST1VORF9VUCh0Y2xrX3RyYWlsX25zICogdWlfZGVuLCAyICogdWlfbnVtKTsKKworCWlmIChwcmVwYXJlX2NudCA+IFBSRVBBUkVfQ05UX01BWCB8fAorCQlleGl0X3plcm9fY250ID4gRVhJVF9aRVJPX0NOVF9NQVggfHwKKwkJY2xrX3plcm9fY250ID4gQ0xLX1pFUk9fQ05UX01BWCB8fAorCQl0cmFpbF9jbnQgPiBUUkFJTF9DTlRfTUFYKQorCQlEUk1fREVCVUdfRFJJVkVSKCJWYWx1ZXMgY3Jvc3NpbmcgbWF4aW11bSBsaW1pdHMsIHJlc3RyaWN0aW5nIHRvIG1heCB2YWx1ZXNcbiIpOworCisJaWYgKHByZXBhcmVfY250ID4gUFJFUEFSRV9DTlRfTUFYKQorCQlwcmVwYXJlX2NudCA9IFBSRVBBUkVfQ05UX01BWDsKKworCWlmIChleGl0X3plcm9fY250ID4gRVhJVF9aRVJPX0NOVF9NQVgpCisJCWV4aXRfemVyb19jbnQgPSBFWElUX1pFUk9fQ05UX01BWDsKKworCWlmIChjbGtfemVyb19jbnQgPiBDTEtfWkVST19DTlRfTUFYKQorCQljbGtfemVyb19jbnQgPSBDTEtfWkVST19DTlRfTUFYOworCisJaWYgKHRyYWlsX2NudCA+IFRSQUlMX0NOVF9NQVgpCisJCXRyYWlsX2NudCA9IFRSQUlMX0NOVF9NQVg7CisKKwkvKiBCMDgwICovCisJaW50ZWxfZHNpLT5kcGh5X3JlZyA9IGV4aXRfemVyb19jbnQgPDwgMjQgfCB0cmFpbF9jbnQgPDwgMTYgfAorCQkJCQkJY2xrX3plcm9fY250IDw8IDggfCBwcmVwYXJlX2NudDsKKworCS8qCisJICogTFAgdG8gSFMgc3dpdGNoIGNvdW50ID0gNFRMUFggKyBQUkVQX0NPVU5UICogMiArIEVYSVRfWkVST19DT1VOVCAqIDIKKwkgKgkJCQkJKyAxMFVJICsgRXh0cmEgQnl0ZSBDb3VudAorCSAqCisJICogSFMgdG8gTFAgc3dpdGNoIGNvdW50ID0gVEhTLVRSQUlMICsgMlRMUFggKyBFeHRyYSBCeXRlIENvdW50CisJICogRXh0cmEgQnl0ZSBDb3VudCBpcyBjYWxjdWxhdGVkIGFjY29yZGluZyB0byBudW1iZXIgb2YgbGFuZXMuCisJICogSGlnaCBMb3cgU3dpdGNoIENvdW50IGlzIHRoZSBNYXggb2YgTFAgdG8gSFMgYW5kCisJICogSFMgdG8gTFAgc3dpdGNoIGNvdW50CisJICoKKwkgKi8KKwl0bHB4X3VpID0gRElWX1JPVU5EX1VQKHRscHhfbnMgKiB1aV9kZW4sIHVpX251bSk7CisKKwkvKiBCMDQ0ICovCisJLyogRklYTUU6CisJICogVGhlIGNvbW1lbnQgYWJvdmUgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgY29kZSAqLworCWxwX3RvX2hzX3N3aXRjaCA9IERJVl9ST1VORF9VUCg0ICogdGxweF91aSArIHByZXBhcmVfY250ICogMiArCisJCQkJCQlleGl0X3plcm9fY250ICogMiArIDEwLCA4KTsKKworCWhzX3RvX2xwX3N3aXRjaCA9IERJVl9ST1VORF9VUChtaXBpX2NvbmZpZy0+dGhzX3RyYWlsICsgMiAqIHRscHhfdWksIDgpOworCisJaW50ZWxfZHNpLT5oc190b19scF9jb3VudCA9IG1heChscF90b19oc19zd2l0Y2gsIGhzX3RvX2xwX3N3aXRjaCk7CisJaW50ZWxfZHNpLT5oc190b19scF9jb3VudCArPSBleHRyYV9ieXRlX2NvdW50OworCisJLyogQjA4OCAqLworCS8qIExQIC0+IEhTIGZvciBjbG9jayBsYW5lcworCSAqIExQIGNsayBzeW5jICsgTFAxMSArIExQMDEgKyB0Y2xrX3ByZXBhcmUgKyB0Y2xrX3plcm8gKworCSAqCQkJCQkJZXh0cmEgYnl0ZSBjb3VudAorCSAqIDJUUExYICsgMVRMUFggKyAxIFRQTFgoaW4gbnMpICsgcHJlcGFyZV9jbnQgKiAyICsgY2xrX3plcm9fY250ICoKKwkgKgkJCQkJMihpbiBVSSkgKyBleHRyYSBieXRlIGNvdW50CisJICogSW4gYnl0ZWNsa3MgPSAoNFRMUFggKyBwcmVwYXJlX2NudCAqIDIgKyBjbGtfemVyb19jbnQgKjIgKGluIFVJKSkgLworCSAqCQkJCQk4ICsgZXh0cmEgYnl0ZSBjb3VudAorCSAqLworCWludGVsX2RzaS0+Y2xrX2xwX3RvX2hzX2NvdW50ID0KKwkJRElWX1JPVU5EX1VQKAorCQkJNCAqIHRscHhfdWkgKyBwcmVwYXJlX2NudCAqIDIgKworCQkJY2xrX3plcm9fY250ICogMiwKKwkJCTgpOworCisJaW50ZWxfZHNpLT5jbGtfbHBfdG9faHNfY291bnQgKz0gZXh0cmFfYnl0ZV9jb3VudDsKKworCS8qIEhTLT5MUCBmb3IgQ2xvY2sgTGFuZXMKKwkgKiBMb3cgUG93ZXIgY2xvY2sgc3luY2hyb25pc2F0aW9ucyArIDFUeCBieXRlY2xrICsgdGNsa190cmFpbCArCisJICoJCQkJCQlFeHRyYSBieXRlIGNvdW50CisJICogMlRMUFggKyA4VUkgKyAodHJhaWxfY291bnQqMikoaW4gVUkpICsgRXh0cmEgYnl0ZSBjb3VudAorCSAqIEluIGJ5dGVjbGtzID0gKDIqVExweChpbiBVSSkgKyB0cmFpbF9jb3VudCoyICs4KShpbiBVSSkvOCArCisJICoJCQkJCQlFeHRyYSBieXRlIGNvdW50CisJICovCisJaW50ZWxfZHNpLT5jbGtfaHNfdG9fbHBfY291bnQgPQorCQlESVZfUk9VTkRfVVAoMiAqIHRscHhfdWkgKyB0cmFpbF9jbnQgKiAyICsgOCwKKwkJCTgpOworCWludGVsX2RzaS0+Y2xrX2hzX3RvX2xwX2NvdW50ICs9IGV4dHJhX2J5dGVfY291bnQ7CisKKwlEUk1fREVCVUdfS01TKCJFb3QgJXNcbiIsIGludGVsX2RzaS0+ZW90cF9wa3QgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlEUk1fREVCVUdfS01TKCJDbG9ja3N0b3AgJXNcbiIsIGludGVsX2RzaS0+Y2xvY2tfc3RvcCA/CisJCQkJCQkiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKwlEUk1fREVCVUdfS01TKCJNb2RlICVzXG4iLCBpbnRlbF9kc2ktPm9wZXJhdGlvbl9tb2RlID8gImNvbW1hbmQiIDogInZpZGVvIik7CisJRFJNX0RFQlVHX0tNUygiUGl4ZWwgRm9ybWF0ICVkXG4iLCBpbnRlbF9kc2ktPnBpeGVsX2Zvcm1hdCk7CisJRFJNX0RFQlVHX0tNUygiVExQWCAlZFxuIiwgaW50ZWxfZHNpLT5lc2NhcGVfY2xrX2Rpdik7CisJRFJNX0RFQlVHX0tNUygiTFAgUlggVGltZW91dCAweCV4XG4iLCBpbnRlbF9kc2ktPmxwX3J4X3RpbWVvdXQpOworCURSTV9ERUJVR19LTVMoIlR1cm5hcm91bmQgVGltZW91dCAweCV4XG4iLCBpbnRlbF9kc2ktPnR1cm5fYXJuZF92YWwpOworCURSTV9ERUJVR19LTVMoIkluaXQgQ291bnQgMHgleFxuIiwgaW50ZWxfZHNpLT5pbml0X2NvdW50KTsKKwlEUk1fREVCVUdfS01TKCJIUyB0byBMUCBDb3VudCAweCV4XG4iLCBpbnRlbF9kc2ktPmhzX3RvX2xwX2NvdW50KTsKKwlEUk1fREVCVUdfS01TKCJMUCBCeXRlIENsb2NrICVkXG4iLCBpbnRlbF9kc2ktPmxwX2J5dGVfY2xrKTsKKwlEUk1fREVCVUdfS01TKCJEQkkgQlcgVGltZXIgMHgleFxuIiwgaW50ZWxfZHNpLT5id190aW1lcik7CisJRFJNX0RFQlVHX0tNUygiTFAgdG8gSFMgQ2xvY2sgQ291bnQgMHgleFxuIiwgaW50ZWxfZHNpLT5jbGtfbHBfdG9faHNfY291bnQpOworCURSTV9ERUJVR19LTVMoIkhTIHRvIExQIENsb2NrIENvdW50IDB4JXhcbiIsIGludGVsX2RzaS0+Y2xrX2hzX3RvX2xwX2NvdW50KTsKKwlEUk1fREVCVUdfS01TKCJCVEEgJXNcbiIsCisJCQlpbnRlbF9kc2ktPnZpZGVvX2ZybXRfY2ZnX2JpdHMgJiBESVNBQkxFX1ZJREVPX0JUQSA/CisJCQkiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKworCS8qIGRlbGF5cyBpbiBWQlQgYXJlIGluIHVuaXQgb2YgMTAwdXMsIHNvIG5lZWQgdG8gY29udmVydAorCSAqIGhlcmUgaW4gbXMKKwkgKiBEZWxheSAoMTAwdXMpICogMTAwIC8xMDAwID0gRGVsYXkgLyAxMCAobXMpICovCisJaW50ZWxfZHNpLT5iYWNrbGlnaHRfb2ZmX2RlbGF5ID0gcHBzLT5ibF9kaXNhYmxlX2RlbGF5IC8gMTA7CisJaW50ZWxfZHNpLT5iYWNrbGlnaHRfb25fZGVsYXkgPSBwcHMtPmJsX2VuYWJsZV9kZWxheSAvIDEwOworCWludGVsX2RzaS0+cGFuZWxfb25fZGVsYXkgPSBwcHMtPnBhbmVsX29uX2RlbGF5IC8gMTA7CisJaW50ZWxfZHNpLT5wYW5lbF9vZmZfZGVsYXkgPSBwcHMtPnBhbmVsX29mZl9kZWxheSAvIDEwOworCWludGVsX2RzaS0+cGFuZWxfcHdyX2N5Y2xlX2RlbGF5ID0gcHBzLT5wYW5lbF9wb3dlcl9jeWNsZV9kZWxheSAvIDEwOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19tb2RlX3ZhbGlkKHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlICpkc2ksCisJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBnZW5lcmljX21vZGVfZml4dXAoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSwKKwkJICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19wYW5lbF9yZXNldChzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKQoreworCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGNvbnRhaW5lcl9vZihkc2ksIHN0cnVjdCBpbnRlbF9kc2ksIGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RzaS0+YmFzZS5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJY2hhciAqc2VxdWVuY2UgPSBkZXZfcHJpdi0+dmJ0LmRzaS5zZXF1ZW5jZVtNSVBJX1NFUV9BU1NFUlRfUkVTRVRdOworCisJZ2VuZXJpY19leGVjX3NlcXVlbmNlKGludGVsX2RzaSwgc2VxdWVuY2UpOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2Rpc2FibGVfcGFuZWxfcG93ZXIoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2kgPSBjb250YWluZXJfb2YoZHNpLCBzdHJ1Y3QgaW50ZWxfZHNpLCBkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kc2ktPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWNoYXIgKnNlcXVlbmNlID0gZGV2X3ByaXYtPnZidC5kc2kuc2VxdWVuY2VbTUlQSV9TRVFfREVBU1NFUlRfUkVTRVRdOworCisJZ2VuZXJpY19leGVjX3NlcXVlbmNlKGludGVsX2RzaSwgc2VxdWVuY2UpOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3NlbmRfb3RwX2NtZHMoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2kgPSBjb250YWluZXJfb2YoZHNpLCBzdHJ1Y3QgaW50ZWxfZHNpLCBkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kc2ktPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWNoYXIgKnNlcXVlbmNlID0gZGV2X3ByaXYtPnZidC5kc2kuc2VxdWVuY2VbTUlQSV9TRVFfSU5JVF9PVFBdOworCisJZ2VuZXJpY19leGVjX3NlcXVlbmNlKGludGVsX2RzaSwgc2VxdWVuY2UpOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2VuYWJsZShzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKQoreworCXN0cnVjdCBpbnRlbF9kc2kgKmludGVsX2RzaSA9IGNvbnRhaW5lcl9vZihkc2ksIHN0cnVjdCBpbnRlbF9kc2ksIGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RzaS0+YmFzZS5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJY2hhciAqc2VxdWVuY2UgPSBkZXZfcHJpdi0+dmJ0LmRzaS5zZXF1ZW5jZVtNSVBJX1NFUV9ESVNQTEFZX09OXTsKKworCWdlbmVyaWNfZXhlY19zZXF1ZW5jZShpbnRlbF9kc2ksIHNlcXVlbmNlKTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19kaXNhYmxlKHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlICpkc2kpCit7CisJc3RydWN0IGludGVsX2RzaSAqaW50ZWxfZHNpID0gY29udGFpbmVyX29mKGRzaSwgc3RydWN0IGludGVsX2RzaSwgZGV2KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHNpLT5iYXNlLmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwljaGFyICpzZXF1ZW5jZSA9IGRldl9wcml2LT52YnQuZHNpLnNlcXVlbmNlW01JUElfU0VRX0RJU1BMQVlfT0ZGXTsKKworCWdlbmVyaWNfZXhlY19zZXF1ZW5jZShpbnRlbF9kc2ksIHNlcXVlbmNlKTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgZ2VuZXJpY19kZXRlY3Qoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBib29sIGdlbmVyaWNfZ2V0X2h3X3N0YXRlKHN0cnVjdCBpbnRlbF9kc2lfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZ2VuZXJpY19nZXRfbW9kZXMoc3RydWN0IGludGVsX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZHNpICppbnRlbF9kc2kgPSBjb250YWluZXJfb2YoZHNpLCBzdHJ1Y3QgaW50ZWxfZHNpLCBkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kc2ktPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT52YnQubGZwX2x2ZHNfdmJ0X21vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CisJcmV0dXJuIGRldl9wcml2LT52YnQubGZwX2x2ZHNfdmJ0X21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZHNpX2RldmljZSAqZHNpKSB7IH0KKworLyogQ2FsbGJhY2tzLiBXZSBtaWdodCBub3QgbmVlZCB0aGVtIGFsbC4gKi8KK3N0cnVjdCBpbnRlbF9kc2lfZGV2X29wcyB2YnRfZ2VuZXJpY19kc2lfZGlzcGxheV9vcHMgPSB7CisJLmluaXQgPSBnZW5lcmljX2luaXQsCisJLm1vZGVfdmFsaWQgPSBnZW5lcmljX21vZGVfdmFsaWQsCisJLm1vZGVfZml4dXAgPSBnZW5lcmljX21vZGVfZml4dXAsCisJLnBhbmVsX3Jlc2V0ID0gZ2VuZXJpY19wYW5lbF9yZXNldCwKKwkuZGlzYWJsZV9wYW5lbF9wb3dlciA9IGdlbmVyaWNfZGlzYWJsZV9wYW5lbF9wb3dlciwKKwkuc2VuZF9vdHBfY21kcyA9IGdlbmVyaWNfc2VuZF9vdHBfY21kcywKKwkuZW5hYmxlID0gZ2VuZXJpY19lbmFibGUsCisJLmRpc2FibGUgPSBnZW5lcmljX2Rpc2FibGUsCisJLmRldGVjdCA9IGdlbmVyaWNfZGV0ZWN0LAorCS5nZXRfaHdfc3RhdGUgPSBnZW5lcmljX2dldF9od19zdGF0ZSwKKwkuZ2V0X21vZGVzID0gZ2VuZXJpY19nZXRfbW9kZXMsCisJLmRlc3Ryb3kgPSBnZW5lcmljX2Rlc3Ryb3ksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwppbmRleCA3ZmUzZmVlLi5hMzYzMWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2R2b19tb2RlX3NldChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKK3N0YXRpYyB2b2lkIGludGVsX2R2b19wcmVfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzQzLDcgKzM0Myw3IEBACiB7CiAJc3RydWN0IGludGVsX2R2byAqaW50ZWxfZHZvID0gaW50ZWxfYXR0YWNoZWRfZHZvKGNvbm5lY3Rvcik7CiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsCi0JCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3ItPm5hbWUpOwogCXJldHVybiBpbnRlbF9kdm8tPmRldi5kZXZfb3BzLT5kZXRlY3QoJmludGVsX2R2by0+ZGV2KTsKIH0KIApAQCAtNDc1LDcgKzQ3NSw3IEBACiAJaW50ZWxfZW5jb2Rlci0+Z2V0X2h3X3N0YXRlID0gaW50ZWxfZHZvX2dldF9od19zdGF0ZTsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfY29uZmlnID0gaW50ZWxfZHZvX2dldF9jb25maWc7CiAJaW50ZWxfZW5jb2Rlci0+Y29tcHV0ZV9jb25maWcgPSBpbnRlbF9kdm9fY29tcHV0ZV9jb25maWc7Ci0JaW50ZWxfZW5jb2Rlci0+bW9kZV9zZXQgPSBpbnRlbF9kdm9fbW9kZV9zZXQ7CisJaW50ZWxfZW5jb2Rlci0+cHJlX2VuYWJsZSA9IGludGVsX2R2b19wcmVfZW5hYmxlOwogCWludGVsX2Nvbm5lY3Rvci0+Z2V0X2h3X3N0YXRlID0gaW50ZWxfZHZvX2Nvbm5lY3Rvcl9nZXRfaHdfc3RhdGU7CiAJaW50ZWxfY29ubmVjdG9yLT51bnJlZ2lzdGVyID0gaW50ZWxfY29ubmVjdG9yX3VucmVnaXN0ZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiZGV2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYmRldi5jCmluZGV4IGY3M2JhNWUuLjA4OGZlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiZGV2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJkZXYuYwpAQCAtMzQzLDE1ICszNDMsMTUgQEAKIAkJCW51bV9jb25uZWN0b3JzX2RldGVjdGVkKys7CiAKIAkJaWYgKCFlbmFibGVkW2ldKSB7Ci0JCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJWQgbm90IGVuYWJsZWQsIHNraXBwaW5nXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCk7CisJCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgbm90IGVuYWJsZWQsIHNraXBwaW5nXG4iLAorCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWVuY29kZXIgPSBjb25uZWN0b3ItPmVuY29kZXI7CiAJCWlmICghZW5jb2RlciB8fCBXQVJOX09OKCFlbmNvZGVyLT5jcnRjKSkgewotCQkJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yICVkIGhhcyBubyBlbmNvZGVyIG9yIGNydGMsIHNraXBwaW5nXG4iLAotCQkJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCk7CisJCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgaGFzIG5vIGVuY29kZXIgb3IgY3J0Yywgc2tpcHBpbmdcbiIsCisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKIAkJCWVuYWJsZWRbaV0gPSBmYWxzZTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0zNzMsMTYgKzM3MywxNiBAQAogCQkJfQogCQl9CiAKLQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY21kbGluZSBtb2RlIG9uIGNvbm5lY3RvciAlZFxuIiwKLQkJCSAgICAgIGZiX2Nvbm4tPmNvbm5lY3Rvci0+YmFzZS5pZCk7CisJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIGNtZGxpbmUgbW9kZSBvbiBjb25uZWN0b3IgJXNcbiIsCisJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwogCiAJCS8qIGdvIGZvciBjb21tYW5kIGxpbmUgbW9kZSBmaXJzdCAqLwogCQltb2Rlc1tpXSA9IGRybV9waWNrX2NtZGxpbmVfbW9kZShmYl9jb25uLCB3aWR0aCwgaGVpZ2h0KTsKIAogCQkvKiB0cnkgZm9yIHByZWZlcnJlZCBuZXh0ICovCiAJCWlmICghbW9kZXNbaV0pIHsKLQkJCURSTV9ERUJVR19LTVMoImxvb2tpbmcgZm9yIHByZWZlcnJlZCBtb2RlIG9uIGNvbm5lY3RvciAlZFxuIiwKLQkJCQkgICAgICBmYl9jb25uLT5jb25uZWN0b3ItPmJhc2UuaWQpOworCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgcHJlZmVycmVkIG1vZGUgb24gY29ubmVjdG9yICVzXG4iLAorCQkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSk7CiAJCQltb2Rlc1tpXSA9IGRybV9oYXNfcHJlZmVycmVkX21vZGUoZmJfY29ubiwgd2lkdGgsCiAJCQkJCQkJICBoZWlnaHQpOwogCQl9CkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJLyogTm8gcHJlZmVycmVkIG1vZGUgbWFya2VkIGJ5IHRoZSBFRElEPyBBcmUgdGhlcmUgYW55IG1vZGVzPyAqLwogCQlpZiAoIW1vZGVzW2ldICYmICFsaXN0X2VtcHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgewogCQkJRFJNX0RFQlVHX0tNUygidXNpbmcgZmlyc3QgbW9kZSBsaXN0ZWQgb24gY29ubmVjdG9yICVzXG4iLAotCQkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJICAgICAgY29ubmVjdG9yLT5uYW1lKTsKIAkJCW1vZGVzW2ldID0gbGlzdF9maXJzdF9lbnRyeSgmY29ubmVjdG9yLT5tb2RlcywKIAkJCQkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwKIAkJCQkJCSAgICBoZWFkKTsKQEAgLTQwOSwxNiArNDA5LDIwIEBACiAJCQkgKiBzaW5jZSB0aGUgZmIgaGVscGVyIGxheWVyIHdhbnRzIGEgcG9pbnRlciB0bwogCQkJICogc29tZXRoaW5nIHdlIG93bi4KIAkJCSAqLworCQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgY3VycmVudCBtb2RlIG9uIGNvbm5lY3RvciAlc1xuIiwKKwkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwogCQkJaW50ZWxfbW9kZV9mcm9tX3BpcGVfY29uZmlnKCZlbmNvZGVyLT5jcnRjLT5od21vZGUsCiAJCQkJCQkgICAgJnRvX2ludGVsX2NydGMoZW5jb2Rlci0+Y3J0YyktPmNvbmZpZyk7CiAJCQltb2Rlc1tpXSA9ICZlbmNvZGVyLT5jcnRjLT5od21vZGU7CiAJCX0KIAkJY3J0Y3NbaV0gPSBuZXdfY3J0YzsKIAotCQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgJXMgb24gY3J0YyAlZDogJXNcbiIsCi0JCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksCisJCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciAlcyBvbiBwaXBlICVkIFtDUlRDOiVkXTogJWR4JWQlc1xuIiwKKwkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwKKwkJCSAgICAgIHBpcGVfbmFtZSh0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpLT5waXBlKSwKIAkJCSAgICAgIGVuY29kZXItPmNydGMtPmJhc2UuaWQsCi0JCQkgICAgICBtb2Rlc1tpXS0+bmFtZSk7CisJCQkgICAgICBtb2Rlc1tpXS0+aGRpc3BsYXksIG1vZGVzW2ldLT52ZGlzcGxheSwKKwkJCSAgICAgIG1vZGVzW2ldLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFID8gImkiIDoiIik7CiAKIAkJZmFsbGJhY2sgPSBmYWxzZTsKIAl9CkBAIC00OTcsNyArNTAxLDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogRmluZCB0aGUgbGFyZ2VzdCBmYiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJZm9yX2VhY2hfY3J0YyhkZXYsIGNydGMpIHsKIAkJaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAKIAkJaWYgKCFpbnRlbF9jcnRjLT5hY3RpdmUgfHwgIWNydGMtPnByaW1hcnktPmZiKSB7CkBAIC01MjEsNyArNTI1LDcgQEAKIAl9CiAKIAkvKiBOb3cgbWFrZSBzdXJlIGFsbCB0aGUgcGlwZXMgd2lsbCBmaXQgaW50byBpdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJZm9yX2VhY2hfY3J0YyhkZXYsIGNydGMpIHsKIAkJdW5zaWduZWQgaW50IGN1cl9zaXplOwogCiAJCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwpAQCAtNTg2LDcgKzU5MCw3IEBACiAJZHJtX2ZyYW1lYnVmZmVyX3JlZmVyZW5jZSgmaWZiZGV2LT5mYi0+YmFzZSk7CiAKIAkvKiBGaW5hbCBwYXNzIHRvIGNoZWNrIGlmIGFueSBhY3RpdmUgcGlwZXMgZG9uJ3QgaGF2ZSBmYnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCBjcnRjKSB7CiAJCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCiAJCWlmICghaW50ZWxfY3J0Yy0+YWN0aXZlKQpAQCAtNjkyLDExICs2OTYsNyBAQAogCWlmICghZGV2X3ByaXYtPmZiZGV2KQogCQlyZXR1cm47CiAKLQlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwotCi0JcmV0ID0gZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUoJmRldl9wcml2LT5mYmRldi0+aGVscGVyKTsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgmZGV2X3ByaXYtPmZiZGV2LT5oZWxwZXIpOwogCWlmIChyZXQpCiAJCURSTV9ERUJVRygiZmFpbGVkIHRvIHJlc3RvcmUgY3J0YyBtb2RlXG4iKTsKLQotCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYwppbmRleCAxNTcyNjdhLi5lZWUyYmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCkBAIC00MTgsNiArNDE4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZzR4X3NldF9pbmZvZnJhbWVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgICBib29sIGVuYWJsZSwKIAkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOwpAQCAtNDQwLDcgKzQ0MSw3IEBACiAJICogZWl0aGVyLiAqLwogCXZhbCB8PSBWSURFT19ESVBfU0VMRUNUX0FWSSB8IFZJREVPX0RJUF9GUkVRX1ZTWU5DOwogCi0JaWYgKCFpbnRlbF9oZG1pLT5oYXNfaGRtaV9zaW5rKSB7CisJaWYgKCFlbmFibGUpIHsKIAkJaWYgKCEodmFsICYgVklERU9fRElQX0VOQUJMRSkpCiAJCQlyZXR1cm47CiAJCXZhbCAmPSB+VklERU9fRElQX0VOQUJMRTsKQEAgLTQ3MSw2ICs0NzIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpYnhfc2V0X2luZm9mcmFtZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgIGJvb2wgZW5hYmxlLAogCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmRldi0+ZGV2X3ByaXZhdGU7CkBAIC00ODYsNyArNDg4LDcgQEAKIAkvKiBTZWUgdGhlIGJpZyBjb21tZW50IGluIGc0eF9zZXRfaW5mb2ZyYW1lcygpICovCiAJdmFsIHw9IFZJREVPX0RJUF9TRUxFQ1RfQVZJIHwgVklERU9fRElQX0ZSRVFfVlNZTkM7CiAKLQlpZiAoIWludGVsX2hkbWktPmhhc19oZG1pX3NpbmspIHsKKwlpZiAoIWVuYWJsZSkgewogCQlpZiAoISh2YWwgJiBWSURFT19ESVBfRU5BQkxFKSkKIAkJCXJldHVybjsKIAkJdmFsICY9IH5WSURFT19ESVBfRU5BQkxFOwpAQCAtNTE4LDYgKzUyMCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNwdF9zZXRfaW5mb2ZyYW1lcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgYm9vbCBlbmFibGUsCiAJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTUzMSw3ICs1MzQsNyBAQAogCS8qIFNlZSB0aGUgYmlnIGNvbW1lbnQgaW4gZzR4X3NldF9pbmZvZnJhbWVzKCkgKi8KIAl2YWwgfD0gVklERU9fRElQX1NFTEVDVF9BVkkgfCBWSURFT19ESVBfRlJFUV9WU1lOQzsKIAotCWlmICghaW50ZWxfaGRtaS0+aGFzX2hkbWlfc2luaykgeworCWlmICghZW5hYmxlKSB7CiAJCWlmICghKHZhbCAmIFZJREVPX0RJUF9FTkFCTEUpKQogCQkJcmV0dXJuOwogCQl2YWwgJj0gfihWSURFT19ESVBfRU5BQkxFIHwgVklERU9fRElQX0VOQUJMRV9BVkkpOwpAQCAtNTU0LDIwICs1NTcsMjMgQEAKIH0KIAogc3RhdGljIHZvaWQgdmx2X3NldF9pbmZvZnJhbWVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgICBib29sIGVuYWJsZSwKIAkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0ID0gZW5jX3RvX2RpZ19wb3J0KGVuY29kZXIpOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5jcnRjKTsKIAlzdHJ1Y3QgaW50ZWxfaGRtaSAqaW50ZWxfaGRtaSA9IGVuY190b19pbnRlbF9oZG1pKGVuY29kZXIpOwogCXUzMiByZWcgPSBWTFZfVFZJREVPX0RJUF9DVEwoaW50ZWxfY3J0Yy0+cGlwZSk7CiAJdTMyIHZhbCA9IEk5MTVfUkVBRChyZWcpOworCXUzMiBwb3J0ID0gVklERU9fRElQX1BPUlQoaW50ZWxfZGlnX3BvcnQtPnBvcnQpOwogCiAJYXNzZXJ0X2hkbWlfcG9ydF9kaXNhYmxlZChpbnRlbF9oZG1pKTsKIAogCS8qIFNlZSB0aGUgYmlnIGNvbW1lbnQgaW4gZzR4X3NldF9pbmZvZnJhbWVzKCkgKi8KIAl2YWwgfD0gVklERU9fRElQX1NFTEVDVF9BVkkgfCBWSURFT19ESVBfRlJFUV9WU1lOQzsKIAotCWlmICghaW50ZWxfaGRtaS0+aGFzX2hkbWlfc2luaykgeworCWlmICghZW5hYmxlKSB7CiAJCWlmICghKHZhbCAmIFZJREVPX0RJUF9FTkFCTEUpKQogCQkJcmV0dXJuOwogCQl2YWwgJj0gflZJREVPX0RJUF9FTkFCTEU7CkBAIC01NzYsOSArNTgyLDE5IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAocG9ydCAhPSAodmFsICYgVklERU9fRElQX1BPUlRfTUFTSykpIHsKKwkJaWYgKHZhbCAmIFZJREVPX0RJUF9FTkFCTEUpIHsKKwkJCXZhbCAmPSB+VklERU9fRElQX0VOQUJMRTsKKwkJCUk5MTVfV1JJVEUocmVnLCB2YWwpOworCQkJUE9TVElOR19SRUFEKHJlZyk7CisJCX0KKwkJdmFsICY9IH5WSURFT19ESVBfUE9SVF9NQVNLOworCQl2YWwgfD0gcG9ydDsKKwl9CisKIAl2YWwgfD0gVklERU9fRElQX0VOQUJMRTsKLQl2YWwgJj0gfihWSURFT19ESVBfRU5BQkxFX1ZFTkRPUiB8IFZJREVPX0RJUF9FTkFCTEVfR0FNVVQgfAotCQkgVklERU9fRElQX0VOQUJMRV9HQ1ApOworCXZhbCAmPSB+KFZJREVPX0RJUF9FTkFCTEVfQVZJIHwgVklERU9fRElQX0VOQUJMRV9WRU5ET1IgfAorCQkgVklERU9fRElQX0VOQUJMRV9HQU1VVCB8IFZJREVPX0RJUF9FTkFCTEVfR0NQKTsKIAogCUk5MTVfV1JJVEUocmVnLCB2YWwpOwogCVBPU1RJTkdfUkVBRChyZWcpOwpAQCAtNTg5LDYgKzYwNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGhzd19zZXRfaW5mb2ZyYW1lcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgYm9vbCBlbmFibGUsCiAJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU5OSw3ICs2MTYsNyBAQAogCiAJYXNzZXJ0X2hkbWlfcG9ydF9kaXNhYmxlZChpbnRlbF9oZG1pKTsKIAotCWlmICghaW50ZWxfaGRtaS0+aGFzX2hkbWlfc2luaykgeworCWlmICghZW5hYmxlKSB7CiAJCUk5MTVfV1JJVEUocmVnLCAwKTsKIAkJUE9TVElOR19SRUFEKHJlZyk7CiAJCXJldHVybjsKQEAgLTYxNiw3ICs2MzMsNyBAQAogCWludGVsX2hkbWlfc2V0X2hkbWlfaW5mb2ZyYW1lKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9oZG1pX21vZGVfc2V0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQorc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9wcmVwYXJlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjM4LDI3ICs2NTUsMjYgQEAKIAllbHNlCiAJCWhkbWlfdmFsIHw9IFNEVk9fQ09MT1JfRk9STUFUXzhicGM7CiAKLQkvKiBSZXF1aXJlZCBvbiBDUFQgKi8KLQlpZiAoaW50ZWxfaGRtaS0+aGFzX2hkbWlfc2luayAmJiBIQVNfUENIX0NQVChkZXYpKQorCWlmIChjcnRjLT5jb25maWcuaGFzX2hkbWlfc2luaykKIAkJaGRtaV92YWwgfD0gSERNSV9NT0RFX1NFTEVDVF9IRE1JOwogCi0JaWYgKGludGVsX2hkbWktPmhhc19hdWRpbykgeworCWlmIChjcnRjLT5jb25maWcuaGFzX2F1ZGlvKSB7CisJCVdBUk5fT04oIWNydGMtPmNvbmZpZy5oYXNfaGRtaV9zaW5rKTsKIAkJRFJNX0RFQlVHX0RSSVZFUigiRW5hYmxpbmcgSERNSSBhdWRpbyBvbiBwaXBlICVjXG4iLAogCQkJCSBwaXBlX25hbWUoY3J0Yy0+cGlwZSkpOwogCQloZG1pX3ZhbCB8PSBTRFZPX0FVRElPX0VOQUJMRTsKLQkJaGRtaV92YWwgfD0gSERNSV9NT0RFX1NFTEVDVF9IRE1JOwogCQlpbnRlbF93cml0ZV9lbGQoJmVuY29kZXItPmJhc2UsIGFkanVzdGVkX21vZGUpOwogCX0KIAogCWlmIChIQVNfUENIX0NQVChkZXYpKQogCQloZG1pX3ZhbCB8PSBTRFZPX1BJUEVfU0VMX0NQVChjcnRjLT5waXBlKTsKKwllbHNlIGlmIChJU19DSEVSUllWSUVXKGRldikpCisJCWhkbWlfdmFsIHw9IFNEVk9fUElQRV9TRUxfQ0hWKGNydGMtPnBpcGUpOwogCWVsc2UKIAkJaGRtaV92YWwgfD0gU0RWT19QSVBFX1NFTChjcnRjLT5waXBlKTsKIAogCUk5MTVfV1JJVEUoaW50ZWxfaGRtaS0+aGRtaV9yZWcsIGhkbWlfdmFsKTsKIAlQT1NUSU5HX1JFQUQoaW50ZWxfaGRtaS0+aGRtaV9yZWcpOwotCi0JaW50ZWxfaGRtaS0+c2V0X2luZm9mcmFtZXMoJmVuY29kZXItPmJhc2UsIGFkanVzdGVkX21vZGUpOwogfQogCiBzdGF0aWMgYm9vbCBpbnRlbF9oZG1pX2dldF9od19zdGF0ZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlciwKQEAgLTY4MSw2ICs2OTcsOCBAQAogCiAJaWYgKEhBU19QQ0hfQ1BUKGRldikpCiAJCSpwaXBlID0gUE9SVF9UT19QSVBFX0NQVCh0bXApOworCWVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJKnBpcGUgPSBTRFZPX1BPUlRfVE9fUElQRV9DSFYodG1wKTsKIAllbHNlCiAJCSpwaXBlID0gUE9SVF9UT19QSVBFKHRtcCk7CiAKQEAgLTcwNyw2ICs3MjUsMTIgQEAKIAllbHNlCiAJCWZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfTlZTWU5DOwogCisJaWYgKHRtcCAmIEhETUlfTU9ERV9TRUxFQ1RfSERNSSkKKwkJcGlwZV9jb25maWctPmhhc19oZG1pX3NpbmsgPSB0cnVlOworCisJaWYgKHRtcCAmIEhETUlfTU9ERV9TRUxFQ1RfSERNSSkKKwkJcGlwZV9jb25maWctPmhhc19hdWRpbyA9IHRydWU7CisKIAlwaXBlX2NvbmZpZy0+YWRqdXN0ZWRfbW9kZS5mbGFncyB8PSBmbGFnczsKIAogCWlmICgodG1wICYgU0RWT19DT0xPUl9GT1JNQVRfTUFTSykgPT0gSERNSV9DT0xPUl9GT1JNQVRfMTJicGMpCkBAIC03MjksNyArNzUzLDcgQEAKIAl1MzIgdGVtcDsKIAl1MzIgZW5hYmxlX2JpdHMgPSBTRFZPX0VOQUJMRTsKIAotCWlmIChpbnRlbF9oZG1pLT5oYXNfYXVkaW8pCisJaWYgKGludGVsX2NydGMtPmNvbmZpZy5oYXNfYXVkaW8pCiAJCWVuYWJsZV9iaXRzIHw9IFNEVk9fQVVESU9fRU5BQkxFOwogCiAJdGVtcCA9IEk5MTVfUkVBRChpbnRlbF9oZG1pLT5oZG1pX3JlZyk7CkBAIC04ODMsOSArOTA3LDExIEBACiAJaW50IHBvcnRjbG9ja19saW1pdCA9IGhkbWlfcG9ydGNsb2NrX2xpbWl0KGludGVsX2hkbWksIGZhbHNlKTsKIAlpbnQgZGVzaXJlZF9icHA7CiAKKwlwaXBlX2NvbmZpZy0+aGFzX2hkbWlfc2luayA9IGludGVsX2hkbWktPmhhc19oZG1pX3Npbms7CisKIAlpZiAoaW50ZWxfaGRtaS0+Y29sb3JfcmFuZ2VfYXV0bykgewogCQkvKiBTZWUgQ0VBLTg2MS1FIC0gNS4xIERlZmF1bHQgRW5jb2RpbmcgUGFyYW1ldGVycyAqLwotCQlpZiAoaW50ZWxfaGRtaS0+aGFzX2hkbWlfc2luayAmJgorCQlpZiAocGlwZV9jb25maWctPmhhc19oZG1pX3NpbmsgJiYKIAkJICAgIGRybV9tYXRjaF9jZWFfbW9kZShhZGp1c3RlZF9tb2RlKSA+IDEpCiAJCQlpbnRlbF9oZG1pLT5jb2xvcl9yYW5nZSA9IEhETUlfQ09MT1JfUkFOR0VfMTZfMjM1OwogCQllbHNlCkBAIC04OTgsMTMgKzkyNCwxNiBAQAogCWlmIChIQVNfUENIX1NQTElUKGRldikgJiYgIUhBU19EREkoZGV2KSkKIAkJcGlwZV9jb25maWctPmhhc19wY2hfZW5jb2RlciA9IHRydWU7CiAKKwlpZiAocGlwZV9jb25maWctPmhhc19oZG1pX3NpbmsgJiYgaW50ZWxfaGRtaS0+aGFzX2F1ZGlvKQorCQlwaXBlX2NvbmZpZy0+aGFzX2F1ZGlvID0gdHJ1ZTsKKwogCS8qCiAJICogSERNSSBpcyBlaXRoZXIgMTIgb3IgOCwgc28gaWYgdGhlIGRpc3BsYXkgbGV0cyAxMGJwYyBzbmVhawogCSAqIHRocm91Z2gsIGNsYW1wIGl0IGRvd24uIE5vdGUgdGhhdCBnNHgvdmx2IGRvbid0IHN1cHBvcnQgMTJicGMgaGRtaQogCSAqIG91dHB1dHMuIFdlIGFsc28gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBoaWdoZXIgY2xvY2sgc3RpbGwgZml0cwogCSAqIHdpdGhpbiBsaW1pdHMuCiAJICovCi0JaWYgKHBpcGVfY29uZmlnLT5waXBlX2JwcCA+IDgqMyAmJiBpbnRlbF9oZG1pLT5oYXNfaGRtaV9zaW5rICYmCisJaWYgKHBpcGVfY29uZmlnLT5waXBlX2JwcCA+IDgqMyAmJiBwaXBlX2NvbmZpZy0+aGFzX2hkbWlfc2luayAmJgogCSAgICBjbG9ja18xMmJwYyA8PSBwb3J0Y2xvY2tfbGltaXQgJiYKIAkgICAgaGRtaV8xMmJwY19wb3NzaWJsZShlbmNvZGVyLT5uZXdfY3J0YykpIHsKIAkJRFJNX0RFQlVHX0tNUygicGlja2luZyBicGMgdG8gMTIgZm9yIEhETUkgb3V0cHV0XG4iKTsKQEAgLTk0NCw3ICs5NzMsNyBAQAogCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXVxuIiwKLQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSk7CiAKIAlwb3dlcl9kb21haW4gPSBpbnRlbF9kaXNwbGF5X3BvcnRfcG93ZXJfZG9tYWluKGludGVsX2VuY29kZXIpOwogCWludGVsX2Rpc3BsYXlfcG93ZXJfZ2V0KGRldl9wcml2LCBwb3dlcl9kb21haW4pOwpAQCAtMTEwNCwyMCArMTEzMywzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX3ByZV9lbmFibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWkgPSBlbmNfdG9faW50ZWxfaGRtaSgmZW5jb2Rlci0+YmFzZSk7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUgPQorCQkmaW50ZWxfY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGU7CisKKwlpbnRlbF9oZG1pX3ByZXBhcmUoZW5jb2Rlcik7CisKKwlpbnRlbF9oZG1pLT5zZXRfaW5mb2ZyYW1lcygmZW5jb2Rlci0+YmFzZSwKKwkJCQkgICBpbnRlbF9jcnRjLT5jb25maWcuaGFzX2hkbWlfc2luaywKKwkJCQkgICBhZGp1c3RlZF9tb2RlKTsKK30KKwogc3RhdGljIHZvaWQgdmx2X2hkbWlfcHJlX2VuYWJsZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICpkcG9ydCA9IGVuY190b19kaWdfcG9ydCgmZW5jb2Rlci0+YmFzZSk7CisJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWkgPSAmZHBvcnQtPmhkbWk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPQogCQl0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUgPQorCQkmaW50ZWxfY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGU7CiAJZW51bSBkcGlvX2NoYW5uZWwgcG9ydCA9IHZsdl9kcG9ydF90b19jaGFubmVsKGRwb3J0KTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CiAJdTMyIHZhbDsKIAotCWlmICghSVNfVkFMTEVZVklFVyhkZXYpKQotCQlyZXR1cm47Ci0KIAkvKiBFbmFibGUgY2xvY2sgY2hhbm5lbHMgZm9yIHRoaXMgcG9ydCAqLwogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzgocG9ydCkpOwpAQCAtMTE0NCw2ICsxMTg3LDEwIEBACiAJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1NfRFcyMyhwb3J0KSwgMHgwMDQwMDg4OCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIAorCWludGVsX2hkbWktPnNldF9pbmZvZnJhbWVzKCZlbmNvZGVyLT5iYXNlLAorCQkJCSAgIGludGVsX2NydGMtPmNvbmZpZy5oYXNfaGRtaV9zaW5rLAorCQkJCSAgIGFkanVzdGVkX21vZGUpOworCiAJaW50ZWxfZW5hYmxlX2hkbWkoZW5jb2Rlcik7CiAKIAl2bHZfd2FpdF9wb3J0X3JlYWR5KGRldl9wcml2LCBkcG9ydCk7CkBAIC0xMTU5LDggKzEyMDYsNyBAQAogCWVudW0gZHBpb19jaGFubmVsIHBvcnQgPSB2bHZfZHBvcnRfdG9fY2hhbm5lbChkcG9ydCk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCi0JaWYgKCFJU19WQUxMRVlWSUVXKGRldikpCi0JCXJldHVybjsKKwlpbnRlbF9oZG1pX3ByZXBhcmUoZW5jb2Rlcik7CiAKIAkvKiBQcm9ncmFtIFR4IGxhbmUgcmVzZXRzIHRvIGRlZmF1bHQgKi8KIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKQEAgLTExOTksNiArMTI0NSwxNTIgQEAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBjaHZfaGRtaV9wb3N0X2Rpc2FibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQgPSBlbmNfdG9fZGlnX3BvcnQoJmVuY29kZXItPmJhc2UpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0KKwkJdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCWVudW0gZHBpb19jaGFubmVsIGNoID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOworCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgdmFsOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBQcm9wYWdhdGUgc29mdCByZXNldCB0byBkYXRhIGxhbmUgcmVzZXQgKi8KKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcxKGNoKSk7CisJdmFsIHw9IENIVl9QQ1NfUkVRX1NPRlRSRVNFVF9FTjsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMShjaCksIHZhbCk7CisKKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcxKGNoKSk7CisJdmFsIHw9IENIVl9QQ1NfUkVRX1NPRlRSRVNFVF9FTjsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMShjaCksIHZhbCk7CisKKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcwKGNoKSk7CisJdmFsICY9IH4oRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzAoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMChjaCkpOworCXZhbCAmPSB+KERQSU9fUENTX1RYX0xBTkUyX1JFU0VUIHwgRFBJT19QQ1NfVFhfTEFORTFfUkVTRVQpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcwKGNoKSwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNodl9oZG1pX3ByZV9lbmFibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqZHBvcnQgPSBlbmNfdG9fZGlnX3BvcnQoJmVuY29kZXItPmJhc2UpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0KKwkJdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5iYXNlLmNydGMpOworCWVudW0gZHBpb19jaGFubmVsIGNoID0gdmx2X2Rwb3J0X3RvX2NoYW5uZWwoZHBvcnQpOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwlpbnQgZGF0YSwgaTsKKwl1MzIgdmFsOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRwaW9fbG9jayk7CisKKwkvKiBEZWFzc2VydCBzb2Z0IGRhdGEgbGFuZSByZXNldCovCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMShjaCkpOworCXZhbCB8PSBDSFZfUENTX1JFUV9TT0ZUUkVTRVRfRU47CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMShjaCkpOworCXZhbCB8PSBDSFZfUENTX1JFUV9TT0ZUUkVTRVRfRU47CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMChjaCkpOworCXZhbCB8PSAoRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzAoY2gpLCB2YWwpOworCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMChjaCkpOworCXZhbCB8PSAoRFBJT19QQ1NfVFhfTEFORTJfUkVTRVQgfCBEUElPX1BDU19UWF9MQU5FMV9SRVNFVCk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzAoY2gpLCB2YWwpOworCisJLyogUHJvZ3JhbSBUeCBsYXRlbmN5IG9wdGltYWwgc2V0dGluZyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJLyogU2V0IHRoZSBsYXRlbmN5IG9wdGltYWwgYml0ICovCisJCWRhdGEgPSAoaSA9PSAxKSA/IDB4MCA6IDB4NjsKKwkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzExKGNoLCBpKSwKKwkJCQlkYXRhIDw8IERQSU9fRlJDX0xBVEVOQ1lfU0hGSVQpOworCisJCS8qIFNldCB0aGUgdXBhciBiaXQgKi8KKwkJZGF0YSA9IChpID09IDEpID8gMHgwIDogMHgxOworCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMTQoY2gsIGkpLAorCQkJCWRhdGEgPDwgRFBJT19VUEFSX1NISUZUKTsKKwl9CisKKwkvKiBEYXRhIGxhbmUgc3RhZ2dlciBwcm9ncmFtbWluZyAqLworCS8qIEZJWE1FOiBGaXggdXAgdmFsdWUgb25seSBhZnRlciBwb3dlciBhbmFseXNpcyAqLworCisJLyogQ2xlYXIgY2FsYyBpbml0ICovCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzAxX0RXMTAoY2gpKTsKKwl2YWwgJj0gfihEUElPX1BDU19TV0lOR19DQUxDX1RYMF9UWDIgfCBEUElPX1BDU19TV0lOR19DQUxDX1RYMV9UWDMpOworCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcxMChjaCksIHZhbCk7CisKKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMjNfRFcxMChjaCkpOworCXZhbCAmPSB+KERQSU9fUENTX1NXSU5HX0NBTENfVFgwX1RYMiB8IERQSU9fUENTX1NXSU5HX0NBTENfVFgxX1RYMyk7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEwKGNoKSwgdmFsKTsKKworCS8qIEZJWE1FOiBQcm9ncmFtIHRoZSBzdXBwb3J0IHh4eCBWLWRCICovCisJLyogVXNlIDgwMG1WLTBkQiAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXNChjaCwgaSkpOworCQl2YWwgJj0gfkRQSU9fU1dJTkdfREVFTVBIOVA1X01BU0s7CisJCXZhbCB8PSAxMjggPDwgRFBJT19TV0lOR19ERUVNUEg5UDVfU0hJRlQ7CisJCXZsdl9kcGlvX3dyaXRlKGRldl9wcml2LCBwaXBlLCBDSFZfVFhfRFc0KGNoLCBpKSwgdmFsKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzIoY2gsIGkpKTsKKwkJdmFsICY9IH5EUElPX1NXSU5HX01BUkdJTl9NQVNLOworCQl2YWwgfD0gMTAyIDw8IERQSU9fU1dJTkdfTUFSR0lOX1NISUZUOworCQl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMihjaCwgaSksIHZhbCk7CisJfQorCisJLyogRGlzYWJsZSB1bmlxdWUgdHJhbnNpdGlvbiBzY2FsZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgQ0hWX1RYX0RXMyhjaCwgaSkpOworCQl2YWwgJj0gfkRQSU9fVFhfVU5JUV9UUkFOU19TQ0FMRV9FTjsKKwkJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIENIVl9UWF9EVzMoY2gsIGkpLCB2YWwpOworCX0KKworCS8qIEFkZGl0aW9uYWwgc3RlcHMgZm9yIDEyMDBtVi0wZEIgKi8KKyNpZiAwCisJdmFsID0gdmx2X2RwaW9fcmVhZChkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMyhjaCkpOworCWlmIChjaCkKKwkJdmFsIHw9IERQSU9fVFhfVU5JUV9UUkFOU19TQ0FMRV9DSDE7CisJZWxzZQorCQl2YWwgfD0gRFBJT19UWF9VTklRX1RSQU5TX1NDQUxFX0NIMDsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMyhjaCksIHZhbCk7CisKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1RYX0RXMihjaCksCisJCQl2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfVFhfRFcyKGNoKSkgfAorCQkJCSgweDlhIDw8IERQSU9fVU5JUV9UUkFOU19TQ0FMRV9TSElGVCkpOworI2VuZGlmCisJLyogU3RhcnQgc3dpbmcgY2FsY3VsYXRpb24gKi8KKwl2YWwgPSB2bHZfZHBpb19yZWFkKGRldl9wcml2LCBwaXBlLCBWTFZfUENTMDFfRFcxMChjaCkpOworCXZhbCB8PSBEUElPX1BDU19TV0lOR19DQUxDX1RYMF9UWDIgfCBEUElPX1BDU19TV0lOR19DQUxDX1RYMV9UWDM7CisJdmx2X2RwaW9fd3JpdGUoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MwMV9EVzEwKGNoKSwgdmFsKTsKKworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIFZMVl9QQ1MyM19EVzEwKGNoKSk7CisJdmFsIHw9IERQSU9fUENTX1NXSU5HX0NBTENfVFgwX1RYMiB8IERQSU9fUENTX1NXSU5HX0NBTENfVFgxX1RYMzsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgVkxWX1BDUzIzX0RXMTAoY2gpLCB2YWwpOworCisJLyogTFJDIEJ5cGFzcyAqLworCXZhbCA9IHZsdl9kcGlvX3JlYWQoZGV2X3ByaXYsIHBpcGUsIENIVl9DTU5fRFczMCk7CisJdmFsIHw9IERQSU9fTFJDX0JZUEFTUzsKKwl2bHZfZHBpb193cml0ZShkZXZfcHJpdiwgcGlwZSwgQ0hWX0NNTl9EVzMwLCB2YWwpOworCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKKworCWludGVsX2VuYWJsZV9oZG1pKGVuY29kZXIpOworCisJdmx2X3dhaXRfcG9ydF9yZWFkeShkZXZfcHJpdiwgZHBvcnQpOworfQorCiBzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKQEAgLTEyNTksNyArMTQ1MSwxMCBAQAogCQlpbnRlbF9lbmNvZGVyLT5ocGRfcGluID0gSFBEX1BPUlRfQzsKIAkJYnJlYWs7CiAJY2FzZSBQT1JUX0Q6Ci0JCWludGVsX2hkbWktPmRkY19idXMgPSBHTUJVU19QT1JUX0RQRDsKKwkJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkKKwkJCWludGVsX2hkbWktPmRkY19idXMgPSBHTUJVU19QT1JUX0RQRF9DSFY7CisJCWVsc2UKKwkJCWludGVsX2hkbWktPmRkY19idXMgPSBHTUJVU19QT1JUX0RQRDsKIAkJaW50ZWxfZW5jb2Rlci0+aHBkX3BpbiA9IEhQRF9QT1JUX0Q7CiAJCWJyZWFrOwogCWNhc2UgUE9SVF9BOgpAQCAtMTMyOSwyMSArMTUyNCwzMiBAQAogCQkJIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CiAKIAlpbnRlbF9lbmNvZGVyLT5jb21wdXRlX2NvbmZpZyA9IGludGVsX2hkbWlfY29tcHV0ZV9jb25maWc7Ci0JaW50ZWxfZW5jb2Rlci0+bW9kZV9zZXQgPSBpbnRlbF9oZG1pX21vZGVfc2V0OwogCWludGVsX2VuY29kZXItPmRpc2FibGUgPSBpbnRlbF9kaXNhYmxlX2hkbWk7CiAJaW50ZWxfZW5jb2Rlci0+Z2V0X2h3X3N0YXRlID0gaW50ZWxfaGRtaV9nZXRfaHdfc3RhdGU7CiAJaW50ZWxfZW5jb2Rlci0+Z2V0X2NvbmZpZyA9IGludGVsX2hkbWlfZ2V0X2NvbmZpZzsKLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlpbnRlbF9lbmNvZGVyLT5wcmVfZW5hYmxlID0gY2h2X2hkbWlfcHJlX2VuYWJsZTsKKwkJaW50ZWxfZW5jb2Rlci0+ZW5hYmxlID0gdmx2X2VuYWJsZV9oZG1pOworCQlpbnRlbF9lbmNvZGVyLT5wb3N0X2Rpc2FibGUgPSBjaHZfaGRtaV9wb3N0X2Rpc2FibGU7CisJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldikpIHsKIAkJaW50ZWxfZW5jb2Rlci0+cHJlX3BsbF9lbmFibGUgPSB2bHZfaGRtaV9wcmVfcGxsX2VuYWJsZTsKIAkJaW50ZWxfZW5jb2Rlci0+cHJlX2VuYWJsZSA9IHZsdl9oZG1pX3ByZV9lbmFibGU7CiAJCWludGVsX2VuY29kZXItPmVuYWJsZSA9IHZsdl9lbmFibGVfaGRtaTsKIAkJaW50ZWxfZW5jb2Rlci0+cG9zdF9kaXNhYmxlID0gdmx2X2hkbWlfcG9zdF9kaXNhYmxlOwogCX0gZWxzZSB7CisJCWludGVsX2VuY29kZXItPnByZV9lbmFibGUgPSBpbnRlbF9oZG1pX3ByZV9lbmFibGU7CiAJCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2VuYWJsZV9oZG1pOwogCX0KIAogCWludGVsX2VuY29kZXItPnR5cGUgPSBJTlRFTF9PVVRQVVRfSERNSTsKLQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpIHwgKDEgPDwgMik7CisJaWYgKElTX0NIRVJSWVZJRVcoZGV2KSkgeworCQlpZiAocG9ydCA9PSBQT1JUX0QpCisJCQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAxIDw8IDI7CisJCWVsc2UKKwkJCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJfSBlbHNlIHsKKwkJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpOworCX0KIAlpbnRlbF9lbmNvZGVyLT5jbG9uZWFibGUgPSAxIDw8IElOVEVMX09VVFBVVF9BTkFMT0c7CiAJLyoKIAkgKiBCU3BlYyBpcyB1bmNsZWFyIGFib3V0IEhETUkrSERNSSBjbG9uaW5nIG9uIGc0eCwgYnV0IGl0IHNlZW1zCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggZjFlY2Y5MS4uMjMxMjYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtMTExLDEzICsxMTEsNiBAQAogCiAJcGlwZV9jb25maWctPmFkanVzdGVkX21vZGUuZmxhZ3MgfD0gZmxhZ3M7CiAKLQkvKiBnZW4yLzMgc3RvcmUgZGl0aGVyIHN0YXRlIGluIHBmaXQgY29udHJvbCwgbmVlZHMgdG8gbWF0Y2ggKi8KLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0KSB7Ci0JCXRtcCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOwotCi0JCXBpcGVfY29uZmlnLT5nbWNoX3BmaXQuY29udHJvbCB8PSB0bXAgJiBQQU5FTF84VE82X0RJVEhFUl9FTkFCTEU7Ci0JfQotCiAJZG90Y2xvY2sgPSBwaXBlX2NvbmZpZy0+cG9ydF9jbG9jazsKIAogCWlmIChIQVNfUENIX1NQTElUKGRldl9wcml2LT5kZXYpKQpAQCAtMTI2LDEwICsxMTksNiBAQAogCXBpcGVfY29uZmlnLT5hZGp1c3RlZF9tb2RlLmNydGNfY2xvY2sgPSBkb3RjbG9jazsKIH0KIAotLyogVGhlIExWRFMgcGluIHBhaXIgbmVlZHMgdG8gYmUgb24gYmVmb3JlIHRoZSBEUExMcyBhcmUgZW5hYmxlZC4KLSAqIFRoaXMgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBnZW5lcmFsIHJ1bGUgdGhhdCBtb2RlX3NldCBkb2Vzbid0IHR1cm4KLSAqIHRoaW5ncyBvbi4KLSAqLwogc3RhdGljIHZvaWQgaW50ZWxfcHJlX2VuYWJsZV9sdmRzKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBpbnRlbF9sdmRzX2VuY29kZXIgKmx2ZHNfZW5jb2RlciA9IHRvX2x2ZHNfZW5jb2RlcigmZW5jb2Rlci0+YmFzZSk7CkBAIC0zMzEsMTUgKzMyMCw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2x2ZHNfbW9kZV9zZXQoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCi17Ci0JLyoKLQkgKiBXZSBkb24ndCBkbyBhbnl0aGluZyBoZXJlLCB0aGUgTFZEUyBwb3J0IGlzIGZ1bGx5IHNldCB1cCBpbiB0aGUgcHJlCi0JICogZW5hYmxlIGhvb2sgLSB0aGUgb3JkZXJpbmcgY29uc3RyYWludHMgZm9yIGVuYWJsaW5nIHRoZSBsdmRzIHBvcnQgdnMuCi0JICogZW5hYmxpbmcgdGhlIGRpc3BsYXkgcGxsIGFyZSB0b28gc3RyaWN0LgotCSAqLwotfQotCiAvKioKICAqIERldGVjdCB0aGUgTFZEUyBjb25uZWN0aW9uLgogICoKQEAgLTM1NCw3ICszMzQsNyBAQAogCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzOwogCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsCi0JCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3ItPm5hbWUpOwogCiAJc3RhdHVzID0gaW50ZWxfcGFuZWxfZGV0ZWN0KGRldik7CiAJaWYgKHN0YXR1cyAhPSBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd24pCkBAIC05NTMsNyArOTMzLDYgQEAKIAlpbnRlbF9lbmNvZGVyLT5lbmFibGUgPSBpbnRlbF9lbmFibGVfbHZkczsKIAlpbnRlbF9lbmNvZGVyLT5wcmVfZW5hYmxlID0gaW50ZWxfcHJlX2VuYWJsZV9sdmRzOwogCWludGVsX2VuY29kZXItPmNvbXB1dGVfY29uZmlnID0gaW50ZWxfbHZkc19jb21wdXRlX2NvbmZpZzsKLQlpbnRlbF9lbmNvZGVyLT5tb2RlX3NldCA9IGludGVsX2x2ZHNfbW9kZV9zZXQ7CiAJaW50ZWxfZW5jb2Rlci0+ZGlzYWJsZSA9IGludGVsX2Rpc2FibGVfbHZkczsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfaHdfc3RhdGUgPSBpbnRlbF9sdmRzX2dldF9od19zdGF0ZTsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfY29uZmlnID0gaW50ZWxfbHZkc19nZXRfY29uZmlnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKaW5kZXggYWNkZTI5NC4uMmUyYzcxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAlpZiAoYmNscCA+IDI1NSkKIAkJcmV0dXJuIEFTTENfQkFDS0xJR0hUX0ZBSUxFRDsKIAotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2soJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCwgTlVMTCk7CiAKIAkvKgogCSAqIFVwZGF0ZSBiYWNrbGlnaHQgb24gYWxsIGNvbm5lY3RvcnMgdGhhdCBzdXBwb3J0IGJhY2tsaWdodCAodXN1YWxseQpAQCAtNDIxLDcgKzQyMSw3IEBACiAJCWludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoaW50ZWxfY29ubmVjdG9yLCBiY2xwLCAyNTUpOwogCWlvd3JpdGUzMihESVZfUk9VTkRfVVAoYmNscCAqIDEwMCwgMjU1KSB8IEFTTEVfQ0JMVl9WQUxJRCwgJmFzbGUtPmNibHYpOwogCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCk7CiAKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCmluZGV4IDEyOWRiMGMuLmRhYTExODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CiAJaW50IHJldDsKIAogCUJVR19PTihvdmVybGF5LT5sYXN0X2ZsaXBfcmVxKTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CiAJaW50IHJldDsKIAogCUJVR19PTihvdmVybGF5LT5hY3RpdmUpOwpAQCAtMjYzLDcgKzI2Myw3IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAl1MzIgZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOwogCXUzMiB0bXA7CiAJaW50IHJldDsKQEAgLTMyMCw3ICszMjAsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CiAJdTMyIGZsaXBfYWRkciA9IG92ZXJsYXktPmZsaXBfYWRkcjsKIAlpbnQgcmV0OwogCkBAIC0zNjMsNyArMzYzLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOwogCWludCByZXQ7CiAKIAlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQpAQCAtMzg5LDcgKzM4OSw3IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAlpbnQgcmV0OwogCiAJLyogT25seSB3YWl0IGlmIHRoZXJlIGlzIGFjdHVhbGx5IGFuIG9sZCBmcmFtZSB0byByZWxlYXNlIHRvCkBAIC02ODgsNyArNjg4LDcgQEAKIAl1MzIgc3dpZHRoLCBzd2lkdGhzdywgc2hlaWdodCwgb3N0cmlkZTsKIAogCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwotCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KSk7CisJQlVHX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCkpOwogCUJVR19PTighb3ZlcmxheSk7CiAKIAlyZXQgPSBpbnRlbF9vdmVybGF5X3JlbGVhc2Vfb2xkX3ZpZChvdmVybGF5KTsKQEAgLTc5Myw3ICs3OTMsNyBAQAogCWludCByZXQ7CiAKIAlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKLQlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpOworCUJVR19PTighZHJtX21vZGVzZXRfaXNfbG9ja2VkKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpKTsKIAogCXJldCA9IGludGVsX292ZXJsYXlfcmVjb3Zlcl9mcm9tX2ludGVycnVwdChvdmVybGF5KTsKIAlpZiAocmV0ICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwppbmRleCBjYjhjZmI3Li41ZTZjODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKQEAgLTQyLDYgKzQyLDU5IEBACiAJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwogfQogCisvKioKKyAqIGludGVsX2ZpbmRfcGFuZWxfZG93bmNsb2NrIC0gZmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMgaW4gRURJRAorICogQGRldjogZHJtIGRldmljZQorICogQGZpeGVkX21vZGUgOiBwYW5lbCBuYXRpdmUgbW9kZQorICogQGNvbm5lY3RvcjogTFZEUy9lRFAgY29ubmVjdG9yCisgKgorICogUmV0dXJuIGRvd25jbG9ja19hdmFpbAorICogRmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMvZURQIGluIEVESUQuCisgKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoKK2ludGVsX2ZpbmRfcGFuZWxfZG93bmNsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSwKKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnNjYW4sICp0bXBfbW9kZTsKKwlpbnQgdGVtcF9kb3duY2xvY2s7CisKKwl0ZW1wX2Rvd25jbG9jayA9IGZpeGVkX21vZGUtPmNsb2NrOworCXRtcF9tb2RlID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NhbiwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCS8qCisJCSAqIElmIG9uZSBtb2RlIGhhcyB0aGUgc2FtZSByZXNvbHV0aW9uIHdpdGggdGhlIGZpeGVkX3BhbmVsCisJCSAqIG1vZGUgd2hpbGUgdGhleSBoYXZlIHRoZSBkaWZmZXJlbnQgcmVmcmVzaCByYXRlLCBpdCBtZWFucworCQkgKiB0aGF0IHRoZSByZWR1Y2VkIGRvd25jbG9jayBpcyBmb3VuZC4gSW4gc3VjaAorCQkgKiBjYXNlIHdlIGNhbiBzZXQgdGhlIGRpZmZlcmVudCBGUHgwLzEgdG8gZHluYW1pY2FsbHkgc2VsZWN0CisJCSAqIGJldHdlZW4gbG93IGFuZCBoaWdoIGZyZXF1ZW5jeS4KKwkJICovCisJCWlmIChzY2FuLT5oZGlzcGxheSA9PSBmaXhlZF9tb2RlLT5oZGlzcGxheSAmJgorCQkgICAgc2Nhbi0+aHN5bmNfc3RhcnQgPT0gZml4ZWRfbW9kZS0+aHN5bmNfc3RhcnQgJiYKKwkJICAgIHNjYW4tPmhzeW5jX2VuZCA9PSBmaXhlZF9tb2RlLT5oc3luY19lbmQgJiYKKwkJICAgIHNjYW4tPmh0b3RhbCA9PSBmaXhlZF9tb2RlLT5odG90YWwgJiYKKwkJICAgIHNjYW4tPnZkaXNwbGF5ID09IGZpeGVkX21vZGUtPnZkaXNwbGF5ICYmCisJCSAgICBzY2FuLT52c3luY19zdGFydCA9PSBmaXhlZF9tb2RlLT52c3luY19zdGFydCAmJgorCQkgICAgc2Nhbi0+dnN5bmNfZW5kID09IGZpeGVkX21vZGUtPnZzeW5jX2VuZCAmJgorCQkgICAgc2Nhbi0+dnRvdGFsID09IGZpeGVkX21vZGUtPnZ0b3RhbCkgeworCQkJaWYgKHNjYW4tPmNsb2NrIDwgdGVtcF9kb3duY2xvY2spIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBkb3duY2xvY2sgaXMgYWxyZWFkeSBmb3VuZC4gQnV0IHdlCisJCQkJICogZXhwZWN0IHRvIGZpbmQgdGhlIGxvd2VyIGRvd25jbG9jay4KKwkJCQkgKi8KKwkJCQl0ZW1wX2Rvd25jbG9jayA9IHNjYW4tPmNsb2NrOworCQkJCXRtcF9tb2RlID0gc2NhbjsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0ZW1wX2Rvd25jbG9jayA8IGZpeGVkX21vZGUtPmNsb2NrKQorCQlyZXR1cm4gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgdG1wX21vZGUpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKIC8qIGFkanVzdGVkX21vZGUgaGFzIGJlZW4gcHJlc2V0IHRvIGJlIHRoZSBwYW5lbCdzIGZpeGVkIG1vZGUgKi8KIHZvaWQKIGludGVsX3BjaF9wYW5lbF9maXR0aW5nKHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjLApAQCAtMzA4LDIxICszNjEsNDMgQEAKIAkJcGZpdF9jb250cm9sIHw9ICgoaW50ZWxfY3J0Yy0+cGlwZSA8PCBQRklUX1BJUEVfU0hJRlQpIHwKIAkJCQkgUEZJVF9GSUxURVJfRlVaWlkpOwogCisJLyogTWFrZSBzdXJlIHByZS05NjUgc2V0IGRpdGhlciBjb3JyZWN0bHkgZm9yIDE4YnBwIHBhbmVscy4gKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0ICYmIHBpcGVfY29uZmlnLT5waXBlX2JwcCA9PSAxOCkKKwkJcGZpdF9jb250cm9sIHw9IFBBTkVMXzhUTzZfRElUSEVSX0VOQUJMRTsKKwogb3V0OgogCWlmICgocGZpdF9jb250cm9sICYgUEZJVF9FTkFCTEUpID09IDApIHsKIAkJcGZpdF9jb250cm9sID0gMDsKIAkJcGZpdF9wZ21fcmF0aW9zID0gMDsKIAl9CiAKLQkvKiBNYWtlIHN1cmUgcHJlLTk2NSBzZXQgZGl0aGVyIGNvcnJlY3RseSBmb3IgMThicHAgcGFuZWxzLiAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQgJiYgcGlwZV9jb25maWctPnBpcGVfYnBwID09IDE4KQotCQlwZml0X2NvbnRyb2wgfD0gUEFORUxfOFRPNl9ESVRIRVJfRU5BQkxFOwotCiAJcGlwZV9jb25maWctPmdtY2hfcGZpdC5jb250cm9sID0gcGZpdF9jb250cm9sOwogCXBpcGVfY29uZmlnLT5nbWNoX3BmaXQucGdtX3JhdGlvcyA9IHBmaXRfcGdtX3JhdGlvczsKIAlwaXBlX2NvbmZpZy0+Z21jaF9wZml0Lmx2ZHNfYm9yZGVyX2JpdHMgPSBib3JkZXI7CiB9CiAKK2VudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2ludGVsX3BhbmVsX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgQklPUyBkb2VzIG5vdCBsaWUgdGhyb3VnaCB0aGUgT3BSZWdpb24uLi4gKi8KKwlpZiAoIWk5MTUucGFuZWxfaWdub3JlX2xpZCAmJiBkZXZfcHJpdi0+b3ByZWdpb24ubGlkX3N0YXRlKSB7CisJCXJldHVybiBpb3JlYWQzMihkZXZfcHJpdi0+b3ByZWdpb24ubGlkX3N0YXRlKSAmIDB4MSA/CisJCQljb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6CisJCQljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwl9CisKKwlzd2l0Y2ggKGk5MTUucGFuZWxfaWdub3JlX2xpZCkgeworCWNhc2UgLTI6CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwljYXNlIC0xOgorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKwl9Cit9CisKIHN0YXRpYyB1MzIgaW50ZWxfcGFuZWxfY29tcHV0ZV9icmlnaHRuZXNzKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQkJICB1MzIgdmFsKQogewpAQCAtNzk1LDQwICs4NzAsMTggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+YmFja2xpZ2h0X2xvY2ssIGZsYWdzKTsKIH0KIAotZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwotaW50ZWxfcGFuZWxfZGV0ZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCS8qIEFzc3VtZSB0aGF0IHRoZSBCSU9TIGRvZXMgbm90IGxpZSB0aHJvdWdoIHRoZSBPcFJlZ2lvbi4uLiAqLwotCWlmICghaTkxNS5wYW5lbF9pZ25vcmVfbGlkICYmIGRldl9wcml2LT5vcHJlZ2lvbi5saWRfc3RhdGUpIHsKLQkJcmV0dXJuIGlvcmVhZDMyKGRldl9wcml2LT5vcHJlZ2lvbi5saWRfc3RhdGUpICYgMHgxID8KLQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoKLQkJCWNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotCX0KLQotCXN3aXRjaCAoaTkxNS5wYW5lbF9pZ25vcmVfbGlkKSB7Ci0JY2FzZSAtMjoKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCWNhc2UgLTE6Ci0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwotCX0KLX0KLQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UpCiBzdGF0aWMgaW50IGludGVsX2JhY2tsaWdodF9kZXZpY2VfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gYmxfZ2V0X2RhdGEoYmQpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OwogCi0JbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LCBOVUxMKTsKIAlEUk1fREVCVUdfS01TKCJ1cGRhdGluZyBpbnRlbF9iYWNrbGlnaHQsIGJyaWdodG5lc3M9JWQvJWRcbiIsCiAJCSAgICAgIGJkLT5wcm9wcy5icmlnaHRuZXNzLCBiZC0+cHJvcHMubWF4X2JyaWdodG5lc3MpOwogCWludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoY29ubmVjdG9yLCBiZC0+cHJvcHMuYnJpZ2h0bmVzcywKIAkJCQkgIGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0MCw5ICs4OTMsOSBAQAogCWludCByZXQ7CiAKIAlpbnRlbF9ydW50aW1lX3BtX2dldChkZXZfcHJpdik7Ci0JbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LCBOVUxMKTsKIAlyZXQgPSBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KGNvbm5lY3Rvcik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fbW9kZXNldF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCk7CiAJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTEwNzcsNyArMTEzMCw3IEBACiAKIAlpZiAocmV0KSB7CiAJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZXR1cCBiYWNrbGlnaHQgZm9yIGNvbm5lY3RvciAlc1xuIiwKLQkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTEwMyw1OSArMTE1Niw2IEBACiAJaW50ZWxfYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGludGVsX2Nvbm5lY3Rvcik7CiB9CiAKLS8qKgotICogaW50ZWxfZmluZF9wYW5lbF9kb3duY2xvY2sgLSBmaW5kIHRoZSByZWR1Y2VkIGRvd25jbG9jayBmb3IgTFZEUyBpbiBFRElECi0gKiBAZGV2OiBkcm0gZGV2aWNlCi0gKiBAZml4ZWRfbW9kZSA6IHBhbmVsIG5hdGl2ZSBtb2RlCi0gKiBAY29ubmVjdG9yOiBMVkRTL2VEUCBjb25uZWN0b3IKLSAqCi0gKiBSZXR1cm4gZG93bmNsb2NrX2F2YWlsCi0gKiBGaW5kIHRoZSByZWR1Y2VkIGRvd25jbG9jayBmb3IgTFZEUy9lRFAgaW4gRURJRC4KLSAqLwotc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKgotaW50ZWxfZmluZF9wYW5lbF9kb3duY2xvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlLAotCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2NhbiwgKnRtcF9tb2RlOwotCWludCB0ZW1wX2Rvd25jbG9jazsKLQotCXRlbXBfZG93bmNsb2NrID0gZml4ZWRfbW9kZS0+Y2xvY2s7Ci0JdG1wX21vZGUgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzY2FuLCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsIGhlYWQpIHsKLQkJLyoKLQkJICogSWYgb25lIG1vZGUgaGFzIHRoZSBzYW1lIHJlc29sdXRpb24gd2l0aCB0aGUgZml4ZWRfcGFuZWwKLQkJICogbW9kZSB3aGlsZSB0aGV5IGhhdmUgdGhlIGRpZmZlcmVudCByZWZyZXNoIHJhdGUsIGl0IG1lYW5zCi0JCSAqIHRoYXQgdGhlIHJlZHVjZWQgZG93bmNsb2NrIGlzIGZvdW5kLiBJbiBzdWNoCi0JCSAqIGNhc2Ugd2UgY2FuIHNldCB0aGUgZGlmZmVyZW50IEZQeDAvMSB0byBkeW5hbWljYWxseSBzZWxlY3QKLQkJICogYmV0d2VlbiBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5LgotCQkgKi8KLQkJaWYgKHNjYW4tPmhkaXNwbGF5ID09IGZpeGVkX21vZGUtPmhkaXNwbGF5ICYmCi0JCSAgICBzY2FuLT5oc3luY19zdGFydCA9PSBmaXhlZF9tb2RlLT5oc3luY19zdGFydCAmJgotCQkgICAgc2Nhbi0+aHN5bmNfZW5kID09IGZpeGVkX21vZGUtPmhzeW5jX2VuZCAmJgotCQkgICAgc2Nhbi0+aHRvdGFsID09IGZpeGVkX21vZGUtPmh0b3RhbCAmJgotCQkgICAgc2Nhbi0+dmRpc3BsYXkgPT0gZml4ZWRfbW9kZS0+dmRpc3BsYXkgJiYKLQkJICAgIHNjYW4tPnZzeW5jX3N0YXJ0ID09IGZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICYmCi0JCSAgICBzY2FuLT52c3luY19lbmQgPT0gZml4ZWRfbW9kZS0+dnN5bmNfZW5kICYmCi0JCSAgICBzY2FuLT52dG90YWwgPT0gZml4ZWRfbW9kZS0+dnRvdGFsKSB7Ci0JCQlpZiAoc2Nhbi0+Y2xvY2sgPCB0ZW1wX2Rvd25jbG9jaykgewotCQkJCS8qCi0JCQkJICogVGhlIGRvd25jbG9jayBpcyBhbHJlYWR5IGZvdW5kLiBCdXQgd2UKLQkJCQkgKiBleHBlY3QgdG8gZmluZCB0aGUgbG93ZXIgZG93bmNsb2NrLgotCQkJCSAqLwotCQkJCXRlbXBfZG93bmNsb2NrID0gc2Nhbi0+Y2xvY2s7Ci0JCQkJdG1wX21vZGUgPSBzY2FuOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHRlbXBfZG93bmNsb2NrIDwgZml4ZWRfbW9kZS0+Y2xvY2spCi0JCXJldHVybiBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCB0bXBfbW9kZSk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQogLyogU2V0IHVwIGNoaXAgc3BlY2lmaWMgYmFja2xpZ2h0IGZ1bmN0aW9ucyAqLwogdm9pZCBpbnRlbF9wYW5lbF9pbml0X2JhY2tsaWdodF9mdW5jcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BtLmMKaW5kZXggZDkzZGNmNi4uZDFlNTNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jCkBAIC00ODcsNyArNDg3LDcgQEAKIAkgKiAgIC0gbmV3IGZiIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gY29tcHJlc3NlZCBidWZmZXIKIAkgKiAgIC0gZ29pbmcgdG8gYW4gdW5zdXBwb3J0ZWQgY29uZmlnIChpbnRlcmxhY2UsIHBpeGVsIG11bHRpcGx5LCBldGMuKQogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCWZvcl9lYWNoX2NydGMoZGV2LCB0bXBfY3J0YykgewogCQlpZiAoaW50ZWxfY3J0Y19hY3RpdmUodG1wX2NydGMpICYmCiAJCSAgICB0b19pbnRlbF9jcnRjKHRtcF9jcnRjKS0+cHJpbWFyeV9lbmFibGVkKSB7CiAJCQlpZiAoY3J0YykgewpAQCAtMTAxMCw3ICsxMDEwLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMsICplbmFibGVkID0gTlVMTDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJZm9yX2VhY2hfY3J0YyhkZXYsIGNydGMpIHsKIAkJaWYgKGludGVsX2NydGNfYWN0aXZlKGNydGMpKSB7CiAJCQlpZiAoZW5hYmxlZCkKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTE4MzEsNiArMTgzMSw0MCBAQAogCQlyZXR1cm4gNTEyOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGlsa19wbGFuZV93bV9yZWdfbWF4KGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSBpbnQgbGV2ZWwsIGJvb2wgaXNfc3ByaXRlKQoreworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KQorCQkvKiBCRFcgcHJpbWFyeS9zcHJpdGUgcGxhbmUgd2F0ZXJtYXJrcyAqLworCQlyZXR1cm4gbGV2ZWwgPT0gMCA/IDI1NSA6IDIwNDc7CisJZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNykKKwkJLyogSVZCL0hTVyBwcmltYXJ5L3Nwcml0ZSBwbGFuZSB3YXRlcm1hcmtzICovCisJCXJldHVybiBsZXZlbCA9PSAwID8gMTI3IDogMTAyMzsKKwllbHNlIGlmICghaXNfc3ByaXRlKQorCQkvKiBJTEsvU05CIHByaW1hcnkgcGxhbmUgd2F0ZXJtYXJrcyAqLworCQlyZXR1cm4gbGV2ZWwgPT0gMCA/IDEyNyA6IDUxMTsKKwllbHNlCisJCS8qIElMSy9TTkIgc3ByaXRlIHBsYW5lIHdhdGVybWFya3MgKi8KKwkJcmV0dXJuIGxldmVsID09IDAgPyA2MyA6IDI1NTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbGtfY3Vyc29yX3dtX3JlZ19tYXgoY29uc3Qgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICBpbnQgbGV2ZWwpCit7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDcpCisJCXJldHVybiBsZXZlbCA9PSAwID8gNjMgOiAyNTU7CisJZWxzZQorCQlyZXR1cm4gbGV2ZWwgPT0gMCA/IDMxIDogNjM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWxrX2ZiY193bV9yZWdfbWF4KGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpCisJCXJldHVybiAzMTsKKwllbHNlCisJCXJldHVybiAxNTsKK30KKwogLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHByaW1hcnkvc3ByaXRlIHBsYW5lIHdhdGVybWFyayAqLwogc3RhdGljIHVuc2lnbmVkIGludCBpbGtfcGxhbmVfd21fbWF4KGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBpbnQgbGV2ZWwsCkBAIC0xODM5LDcgKzE4NzMsNiBAQAogCQkJCSAgICAgYm9vbCBpc19zcHJpdGUpCiB7CiAJdW5zaWduZWQgaW50IGZpZm9fc2l6ZSA9IGlsa19kaXNwbGF5X2ZpZm9fc2l6ZShkZXYpOwotCXVuc2lnbmVkIGludCBtYXg7CiAKIAkvKiBpZiBzcHJpdGVzIGFyZW4ndCBlbmFibGVkLCBzcHJpdGVzIGdldCBub3RoaW5nICovCiAJaWYgKGlzX3Nwcml0ZSAmJiAhY29uZmlnLT5zcHJpdGVzX2VuYWJsZWQpCkBAIC0xODcwLDE5ICsxOTAzLDcgQEAKIAl9CiAKIAkvKiBjbGFtcCB0byBtYXggdGhhdCB0aGUgcmVnaXN0ZXJzIGNhbiBob2xkICovCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDgpCi0JCW1heCA9IGxldmVsID09IDAgPyAyNTUgOiAyMDQ3OwotCWVsc2UgaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDcpCi0JCS8qIElWQi9IU1cgcHJpbWFyeS9zcHJpdGUgcGxhbmUgd2F0ZXJtYXJrcyAqLwotCQltYXggPSBsZXZlbCA9PSAwID8gMTI3IDogMTAyMzsKLQllbHNlIGlmICghaXNfc3ByaXRlKQotCQkvKiBJTEsvU05CIHByaW1hcnkgcGxhbmUgd2F0ZXJtYXJrcyAqLwotCQltYXggPSBsZXZlbCA9PSAwID8gMTI3IDogNTExOwotCWVsc2UKLQkJLyogSUxLL1NOQiBzcHJpdGUgcGxhbmUgd2F0ZXJtYXJrcyAqLwotCQltYXggPSBsZXZlbCA9PSAwID8gNjMgOiAyNTU7Ci0KLQlyZXR1cm4gbWluKGZpZm9fc2l6ZSwgbWF4KTsKKwlyZXR1cm4gbWluKGZpZm9fc2l6ZSwgaWxrX3BsYW5lX3dtX3JlZ19tYXgoZGV2LCBsZXZlbCwgaXNfc3ByaXRlKSk7CiB9CiAKIC8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBjdXJzb3IgcGxhbmUgd2F0ZXJtYXJrICovCkBAIC0xODk1LDIwICsxOTE2LDcgQEAKIAkJcmV0dXJuIDY0OwogCiAJLyogb3RoZXJ3aXNlIGp1c3QgcmVwb3J0IG1heCB0aGF0IHJlZ2lzdGVycyBjYW4gaG9sZCAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA3KQotCQlyZXR1cm4gbGV2ZWwgPT0gMCA/IDYzIDogMjU1OwotCWVsc2UKLQkJcmV0dXJuIGxldmVsID09IDAgPyAzMSA6IDYzOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gRkJDIHdhdGVybWFyayAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpbGtfZmJjX3dtX21heChjb25zdCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCS8qIG1heCB0aGF0IHJlZ2lzdGVycyBjYW4gaG9sZCAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KQotCQlyZXR1cm4gMzE7Ci0JZWxzZQotCQlyZXR1cm4gMTU7CisJcmV0dXJuIGlsa19jdXJzb3Jfd21fcmVnX21heChkZXYsIGxldmVsKTsKIH0KIAogc3RhdGljIHZvaWQgaWxrX2NvbXB1dGVfd21fbWF4aW11bXMoY29uc3Qgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTE5MjAsNyArMTkyOCwxNyBAQAogCW1heC0+cHJpID0gaWxrX3BsYW5lX3dtX21heChkZXYsIGxldmVsLCBjb25maWcsIGRkYl9wYXJ0aXRpb25pbmcsIGZhbHNlKTsKIAltYXgtPnNwciA9IGlsa19wbGFuZV93bV9tYXgoZGV2LCBsZXZlbCwgY29uZmlnLCBkZGJfcGFydGl0aW9uaW5nLCB0cnVlKTsKIAltYXgtPmN1ciA9IGlsa19jdXJzb3Jfd21fbWF4KGRldiwgbGV2ZWwsIGNvbmZpZyk7Ci0JbWF4LT5mYmMgPSBpbGtfZmJjX3dtX21heChkZXYpOworCW1heC0+ZmJjID0gaWxrX2ZiY193bV9yZWdfbWF4KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGlsa19jb21wdXRlX3dtX3JlZ19tYXhpbXVtcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgbGV2ZWwsCisJCQkJCXN0cnVjdCBpbGtfd21fbWF4aW11bXMgKm1heCkKK3sKKwltYXgtPnByaSA9IGlsa19wbGFuZV93bV9yZWdfbWF4KGRldiwgbGV2ZWwsIGZhbHNlKTsKKwltYXgtPnNwciA9IGlsa19wbGFuZV93bV9yZWdfbWF4KGRldiwgbGV2ZWwsIHRydWUpOworCW1heC0+Y3VyID0gaWxrX2N1cnNvcl93bV9yZWdfbWF4KGRldiwgbGV2ZWwpOworCW1heC0+ZmJjID0gaWxrX2ZiY193bV9yZWdfbWF4KGRldik7CiB9CiAKIHN0YXRpYyBib29sIGlsa192YWxpZGF0ZV93bV9sZXZlbChpbnQgbGV2ZWwsCkBAIC0yMDU5LDcgKzIwNzcsNyBAQAogCQl3bVszXSAqPSAyOwogfQogCi1zdGF0aWMgaW50IGlsa193bV9tYXhfbGV2ZWwoY29uc3Qgc3RydWN0IGRybV9kZXZpY2UgKmRldikKK2ludCBpbGtfd21fbWF4X2xldmVsKGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJLyogaG93IG1hbnkgV00gbGV2ZWxzIGFyZSB3ZSBleHBlY3RpbmcgKi8KIAlpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQpAQCAtMjE1NSwzOCArMjE3Myw1MiBAQAogfQogCiBzdGF0aWMgdm9pZCBpbGtfY29tcHV0ZV93bV9wYXJhbWV0ZXJzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgICAgICBzdHJ1Y3QgaWxrX3BpcGVfd21fcGFyYW1ldGVycyAqcCwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfd21fY29uZmlnICpjb25maWcpCisJCQkJICAgICAgc3RydWN0IGlsa19waXBlX3dtX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJZW51bSBwaXBlIHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lOwogCi0JcC0+YWN0aXZlID0gaW50ZWxfY3J0Y19hY3RpdmUoY3J0Yyk7Ci0JaWYgKHAtPmFjdGl2ZSkgewotCQlwLT5waXBlX2h0b3RhbCA9IGludGVsX2NydGMtPmNvbmZpZy5hZGp1c3RlZF9tb2RlLmNydGNfaHRvdGFsOwotCQlwLT5waXhlbF9yYXRlID0gaWxrX3BpcGVfcGl4ZWxfcmF0ZShkZXYsIGNydGMpOwotCQlwLT5wcmkuYnl0ZXNfcGVyX3BpeGVsID0gY3J0Yy0+cHJpbWFyeS0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKLQkJcC0+Y3VyLmJ5dGVzX3Blcl9waXhlbCA9IDQ7Ci0JCXAtPnByaS5ob3Jpel9waXhlbHMgPSBpbnRlbF9jcnRjLT5jb25maWcucGlwZV9zcmNfdzsKLQkJcC0+Y3VyLmhvcml6X3BpeGVscyA9IGludGVsX2NydGMtPmN1cnNvcl93aWR0aDsKLQkJLyogVE9ETzogZm9yIG5vdywgYXNzdW1lIHByaW1hcnkgYW5kIGN1cnNvciBwbGFuZXMgYXJlIGFsd2F5cyBlbmFibGVkLiAqLwotCQlwLT5wcmkuZW5hYmxlZCA9IHRydWU7Ci0JCXAtPmN1ci5lbmFibGVkID0gdHJ1ZTsKLQl9CisJaWYgKCFpbnRlbF9jcnRjX2FjdGl2ZShjcnRjKSkKKwkJcmV0dXJuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCi0JCWNvbmZpZy0+bnVtX3BpcGVzX2FjdGl2ZSArPSBpbnRlbF9jcnRjX2FjdGl2ZShjcnRjKTsKKwlwLT5hY3RpdmUgPSB0cnVlOworCXAtPnBpcGVfaHRvdGFsID0gaW50ZWxfY3J0Yy0+Y29uZmlnLmFkanVzdGVkX21vZGUuY3J0Y19odG90YWw7CisJcC0+cGl4ZWxfcmF0ZSA9IGlsa19waXBlX3BpeGVsX3JhdGUoZGV2LCBjcnRjKTsKKwlwLT5wcmkuYnl0ZXNfcGVyX3BpeGVsID0gY3J0Yy0+cHJpbWFyeS0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKKwlwLT5jdXIuYnl0ZXNfcGVyX3BpeGVsID0gNDsKKwlwLT5wcmkuaG9yaXpfcGl4ZWxzID0gaW50ZWxfY3J0Yy0+Y29uZmlnLnBpcGVfc3JjX3c7CisJcC0+Y3VyLmhvcml6X3BpeGVscyA9IGludGVsX2NydGMtPmN1cnNvcl93aWR0aDsKKwkvKiBUT0RPOiBmb3Igbm93LCBhc3N1bWUgcHJpbWFyeSBhbmQgY3Vyc29yIHBsYW5lcyBhcmUgYWx3YXlzIGVuYWJsZWQuICovCisJcC0+cHJpLmVuYWJsZWQgPSB0cnVlOworCXAtPmN1ci5lbmFibGVkID0gdHJ1ZTsKIAogCWRybV9mb3JfZWFjaF9sZWdhY3lfcGxhbmUocGxhbmUsICZkZXYtPm1vZGVfY29uZmlnLnBsYW5lX2xpc3QpIHsKIAkJc3RydWN0IGludGVsX3BsYW5lICppbnRlbF9wbGFuZSA9IHRvX2ludGVsX3BsYW5lKHBsYW5lKTsKIAotCQlpZiAoaW50ZWxfcGxhbmUtPnBpcGUgPT0gcGlwZSkKKwkJaWYgKGludGVsX3BsYW5lLT5waXBlID09IHBpcGUpIHsKIAkJCXAtPnNwciA9IGludGVsX3BsYW5lLT53bTsKKwkJCWJyZWFrOworCQl9CisJfQorfQogCi0JCWNvbmZpZy0+c3ByaXRlc19lbmFibGVkIHw9IGludGVsX3BsYW5lLT53bS5lbmFibGVkOwotCQljb25maWctPnNwcml0ZXNfc2NhbGVkIHw9IGludGVsX3BsYW5lLT53bS5zY2FsZWQ7CitzdGF0aWMgdm9pZCBpbGtfY29tcHV0ZV93bV9jb25maWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpbnRlbF93bV9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKKworCS8qIENvbXB1dGUgdGhlIGN1cnJlbnRseSBfYWN0aXZlXyBjb25maWcgKi8KKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgaW50ZWxfY3J0YykgeworCQljb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqd20gPSAmaW50ZWxfY3J0Yy0+d20uYWN0aXZlOworCisJCWlmICghd20tPnBpcGVfZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCWNvbmZpZy0+c3ByaXRlc19lbmFibGVkIHw9IHdtLT5zcHJpdGVzX2VuYWJsZWQ7CisJCWNvbmZpZy0+c3ByaXRlc19zY2FsZWQgfD0gd20tPnNwcml0ZXNfc2NhbGVkOworCQljb25maWctPm51bV9waXBlc19hY3RpdmUrKzsKIAl9CiB9CiAKQEAgLTIyMDYsOCArMjIzOCw5IEBACiAJfTsKIAlzdHJ1Y3QgaWxrX3dtX21heGltdW1zIG1heDsKIAotCS8qIExQMCB3YXRlcm1hcmtzIGFsd2F5cyB1c2UgMS8yIEREQiBwYXJ0aXRpb25pbmcgKi8KLQlpbGtfY29tcHV0ZV93bV9tYXhpbXVtcyhkZXYsIDAsICZjb25maWcsIElOVEVMX0REQl9QQVJUXzFfMiwgJm1heCk7CisJcGlwZV93bS0+cGlwZV9lbmFibGVkID0gcGFyYW1zLT5hY3RpdmU7CisJcGlwZV93bS0+c3ByaXRlc19lbmFibGVkID0gcGFyYW1zLT5zcHIuZW5hYmxlZDsKKwlwaXBlX3dtLT5zcHJpdGVzX3NjYWxlZCA9IHBhcmFtcy0+c3ByLnNjYWxlZDsKIAogCS8qIElMSy9TTkI6IExQMisgd2F0ZXJtYXJrcyBvbmx5IHcvbyBzcHJpdGVzICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDw9IDYgJiYgcGFyYW1zLT5zcHIuZW5hYmxlZCkKQEAgLTIyMTcsMTUgKzIyNTAsMzcgQEAKIAlpZiAocGFyYW1zLT5zcHIuc2NhbGVkKQogCQltYXhfbGV2ZWwgPSAwOwogCi0JZm9yIChsZXZlbCA9IDA7IGxldmVsIDw9IG1heF9sZXZlbDsgbGV2ZWwrKykKLQkJaWxrX2NvbXB1dGVfd21fbGV2ZWwoZGV2X3ByaXYsIGxldmVsLCBwYXJhbXMsCi0JCQkJICAgICAmcGlwZV93bS0+d21bbGV2ZWxdKTsKKwlpbGtfY29tcHV0ZV93bV9sZXZlbChkZXZfcHJpdiwgMCwgcGFyYW1zLCAmcGlwZV93bS0+d21bMF0pOwogCiAJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkKIAkJcGlwZV93bS0+bGluZXRpbWUgPSBoc3dfY29tcHV0ZV9saW5ldGltZV93bShkZXYsIGNydGMpOwogCisJLyogTFAwIHdhdGVybWFya3MgYWx3YXlzIHVzZSAxLzIgRERCIHBhcnRpdGlvbmluZyAqLworCWlsa19jb21wdXRlX3dtX21heGltdW1zKGRldiwgMCwgJmNvbmZpZywgSU5URUxfRERCX1BBUlRfMV8yLCAmbWF4KTsKKwogCS8qIEF0IGxlYXN0IExQMCBtdXN0IGJlIHZhbGlkICovCi0JcmV0dXJuIGlsa192YWxpZGF0ZV93bV9sZXZlbCgwLCAmbWF4LCAmcGlwZV93bS0+d21bMF0pOworCWlmICghaWxrX3ZhbGlkYXRlX3dtX2xldmVsKDAsICZtYXgsICZwaXBlX3dtLT53bVswXSkpCisJCXJldHVybiBmYWxzZTsKKworCWlsa19jb21wdXRlX3dtX3JlZ19tYXhpbXVtcyhkZXYsIDEsICZtYXgpOworCisJZm9yIChsZXZlbCA9IDE7IGxldmVsIDw9IG1heF9sZXZlbDsgbGV2ZWwrKykgeworCQlzdHJ1Y3QgaW50ZWxfd21fbGV2ZWwgd20gPSB7fTsKKworCQlpbGtfY29tcHV0ZV93bV9sZXZlbChkZXZfcHJpdiwgbGV2ZWwsIHBhcmFtcywgJndtKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIGFueSB3YXRlcm1hcmsgbGV2ZWwgdGhhdCBleGNlZWRzIHRoZQorCQkgKiByZWdpc3RlciBtYXhpbXVtcyBzaW5jZSBzdWNoIHdhdGVybWFya3MgYXJlCisJCSAqIGFsd2F5cyBpbnZhbGlkLgorCQkgKi8KKwkJaWYgKCFpbGtfdmFsaWRhdGVfd21fbGV2ZWwobGV2ZWwsICZtYXgsICZ3bSkpCisJCQlicmVhazsKKworCQlwaXBlX3dtLT53bVtsZXZlbF0gPSB3bTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTIyMzcsMjAgKzIyOTIsMjggQEAKIHsKIAljb25zdCBzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZWxfY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBiYXNlLmhlYWQpIHsKLQkJY29uc3Qgc3RydWN0IGludGVsX3dtX2xldmVsICp3bSA9Ci0JCQkmaW50ZWxfY3J0Yy0+d20uYWN0aXZlLndtW2xldmVsXTsKKwlyZXRfd20tPmVuYWJsZSA9IHRydWU7CiAKKwlmb3JfZWFjaF9pbnRlbF9jcnRjKGRldiwgaW50ZWxfY3J0YykgeworCQljb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZV93bSAqYWN0aXZlID0gJmludGVsX2NydGMtPndtLmFjdGl2ZTsKKwkJY29uc3Qgc3RydWN0IGludGVsX3dtX2xldmVsICp3bSA9ICZhY3RpdmUtPndtW2xldmVsXTsKKworCQlpZiAoIWFjdGl2ZS0+cGlwZV9lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhlIHdhdGVybWFyayB2YWx1ZXMgbWF5IGhhdmUgYmVlbiB1c2VkIGluIHRoZSBwYXN0LAorCQkgKiBzbyB3ZSBtdXN0IG1haW50YWluIHRoZW0gaW4gdGhlIHJlZ2lzdGVycyBmb3Igc29tZQorCQkgKiB0aW1lIGV2ZW4gaWYgdGhlIGxldmVsIGlzIG5vdyBkaXNhYmxlZC4KKwkJICovCiAJCWlmICghd20tPmVuYWJsZSkKLQkJCXJldHVybjsKKwkJCXJldF93bS0+ZW5hYmxlID0gZmFsc2U7CiAKIAkJcmV0X3dtLT5wcmlfdmFsID0gbWF4KHJldF93bS0+cHJpX3ZhbCwgd20tPnByaV92YWwpOwogCQlyZXRfd20tPnNwcl92YWwgPSBtYXgocmV0X3dtLT5zcHJfdmFsLCB3bS0+c3ByX3ZhbCk7CiAJCXJldF93bS0+Y3VyX3ZhbCA9IG1heChyZXRfd20tPmN1cl92YWwsIHdtLT5jdXJfdmFsKTsKIAkJcmV0X3dtLT5mYmNfdmFsID0gbWF4KHJldF93bS0+ZmJjX3ZhbCwgd20tPmZiY192YWwpOwogCX0KLQotCXJldF93bS0+ZW5hYmxlID0gdHJ1ZTsKIH0KIAogLyoKQEAgLTIyNjIsNiArMjMyNSw3IEBACiAJCQkgc3RydWN0IGludGVsX3BpcGVfd20gKm1lcmdlZCkKIHsKIAlpbnQgbGV2ZWwsIG1heF9sZXZlbCA9IGlsa193bV9tYXhfbGV2ZWwoZGV2KTsKKwlpbnQgbGFzdF9lbmFibGVkX2xldmVsID0gbWF4X2xldmVsOwogCiAJLyogSUxLL1NOQi9JVkI6IExQMSsgd2F0ZXJtYXJrcyBvbmx5IHcvIHNpbmdsZSBwaXBlICovCiAJaWYgKChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA2IHx8IElTX0lWWUJSSURHRShkZXYpKSAmJgpAQCAtMjI3NywxNSArMjM0MSwxOSBAQAogCiAJCWlsa19tZXJnZV93bV9sZXZlbChkZXYsIGxldmVsLCB3bSk7CiAKLQkJaWYgKCFpbGtfdmFsaWRhdGVfd21fbGV2ZWwobGV2ZWwsIG1heCwgd20pKQotCQkJYnJlYWs7CisJCWlmIChsZXZlbCA+IGxhc3RfZW5hYmxlZF9sZXZlbCkKKwkJCXdtLT5lbmFibGUgPSBmYWxzZTsKKwkJZWxzZSBpZiAoIWlsa192YWxpZGF0ZV93bV9sZXZlbChsZXZlbCwgbWF4LCB3bSkpCisJCQkvKiBtYWtlIHN1cmUgYWxsIGZvbGxvd2luZyBsZXZlbHMgZ2V0IGRpc2FibGVkICovCisJCQlsYXN0X2VuYWJsZWRfbGV2ZWwgPSBsZXZlbCAtIDE7CiAKIAkJLyoKIAkJICogVGhlIHNwZWMgc2F5cyBpdCBpcyBwcmVmZXJyZWQgdG8gZGlzYWJsZQogCQkgKiBGQkMgV01zIGluc3RlYWQgb2YgZGlzYWJsaW5nIGEgV00gbGV2ZWwuCiAJCSAqLwogCQlpZiAod20tPmZiY192YWwgPiBtYXgtPmZiYykgewotCQkJbWVyZ2VkLT5mYmNfd21fZW5hYmxlZCA9IGZhbHNlOworCQkJaWYgKHdtLT5lbmFibGUpCisJCQkJbWVyZ2VkLT5mYmNfd21fZW5hYmxlZCA9IGZhbHNlOwogCQkJd20tPmZiY192YWwgPSAwOwogCQl9CiAJfQpAQCAtMjM0MCwxNCArMjQwOCwxOSBAQAogCQlsZXZlbCA9IGlsa193bV9scF90b19sZXZlbCh3bV9scCwgbWVyZ2VkKTsKIAogCQlyID0gJm1lcmdlZC0+d21bbGV2ZWxdOwotCQlpZiAoIXItPmVuYWJsZSkKLQkJCWJyZWFrOwogCi0JCXJlc3VsdHMtPndtX2xwW3dtX2xwIC0gMV0gPSBXTTNfTFBfRU4gfAorCQkvKgorCQkgKiBNYWludGFpbiB0aGUgd2F0ZXJtYXJrIHZhbHVlcyBldmVuIGlmIHRoZSBsZXZlbCBpcworCQkgKiBkaXNhYmxlZC4gRG9pbmcgb3RoZXJ3aXNlIGNvdWxkIGNhdXNlIHVuZGVycnVucy4KKwkJICovCisJCXJlc3VsdHMtPndtX2xwW3dtX2xwIC0gMV0gPQogCQkJKGlsa193bV9scF9sYXRlbmN5KGRldiwgbGV2ZWwpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CiAJCQkoci0+cHJpX3ZhbCA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKIAkJCXItPmN1cl92YWw7CiAKKwkJaWYgKHItPmVuYWJsZSkKKwkJCXJlc3VsdHMtPndtX2xwW3dtX2xwIC0gMV0gfD0gV00xX0xQX1NSX0VOOworCiAJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA4KQogCQkJcmVzdWx0cy0+d21fbHBbd21fbHAgLSAxXSB8PQogCQkJCXItPmZiY192YWwgPDwgV00xX0xQX0ZCQ19TSElGVF9CRFc7CkBAIC0yMzU1LDYgKzI0MjgsMTAgQEAKIAkJCXJlc3VsdHMtPndtX2xwW3dtX2xwIC0gMV0gfD0KIAkJCQlyLT5mYmNfdmFsIDw8IFdNMV9MUF9GQkNfU0hJRlQ7CiAKKwkJLyoKKwkJICogQWx3YXlzIHNldCBXTTFTX0xQX0VOIHdoZW4gc3ByX3ZhbCAhPSAwLCBldmVuIGlmIHRoZQorCQkgKiBsZXZlbCBpcyBkaXNhYmxlZC4gRG9pbmcgb3RoZXJ3aXNlIGNvdWxkIGNhdXNlIHVuZGVycnVucy4KKwkJICovCiAJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8PSA2ICYmIHItPnNwcl92YWwpIHsKIAkJCVdBUk5fT04od21fbHAgIT0gMSk7CiAJCQlyZXN1bHRzLT53bV9scF9zcHJbd21fbHAgLSAxXSA9IFdNMVNfTFBfRU4gfCByLT5zcHJfdmFsOwpAQCAtMjM2Myw3ICsyNDQwLDcgQEAKIAl9CiAKIAkvKiBMUDAgcmVnaXN0ZXIgdmFsdWVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlbF9jcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGJhc2UuaGVhZCkgeworCWZvcl9lYWNoX2ludGVsX2NydGMoZGV2LCBpbnRlbF9jcnRjKSB7CiAJCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAkJY29uc3Qgc3RydWN0IGludGVsX3dtX2xldmVsICpyID0KIAkJCSZpbnRlbF9jcnRjLT53bS5hY3RpdmUud21bMF07CkBAIC0yNTk4LDcgKzI2NzUsNyBAQAogCXN0cnVjdCBpbnRlbF9waXBlX3dtIGxwX3dtXzFfMiA9IHt9LCBscF93bV81XzYgPSB7fSwgKmJlc3RfbHBfd207CiAJc3RydWN0IGludGVsX3dtX2NvbmZpZyBjb25maWcgPSB7fTsKIAotCWlsa19jb21wdXRlX3dtX3BhcmFtZXRlcnMoY3J0YywgJnBhcmFtcywgJmNvbmZpZyk7CisJaWxrX2NvbXB1dGVfd21fcGFyYW1ldGVycyhjcnRjLCAmcGFyYW1zKTsKIAogCWludGVsX2NvbXB1dGVfcGlwZV93bShjcnRjLCAmcGFyYW1zLCAmcGlwZV93bSk7CiAKQEAgLTI2MDcsNiArMjY4NCw4IEBACiAKIAlpbnRlbF9jcnRjLT53bS5hY3RpdmUgPSBwaXBlX3dtOwogCisJaWxrX2NvbXB1dGVfd21fY29uZmlnKGRldiwgJmNvbmZpZyk7CisKIAlpbGtfY29tcHV0ZV93bV9tYXhpbXVtcyhkZXYsIDEsICZjb25maWcsIElOVEVMX0REQl9QQVJUXzFfMiwgJm1heCk7CiAJaWxrX3dtX21lcmdlKGRldiwgJmNvbmZpZywgJm1heCwgJmxwX3dtXzFfMik7CiAKQEAgLTI2NzMsNyArMjc1Miw5IEBACiAJaWYgKElTX0hBU1dFTEwoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkKIAkJaHctPndtX2xpbmV0aW1lW3BpcGVdID0gSTkxNV9SRUFEKFBJUEVfV01fTElORVRJTUUocGlwZSkpOwogCi0JaWYgKGludGVsX2NydGNfYWN0aXZlKGNydGMpKSB7CisJYWN0aXZlLT5waXBlX2VuYWJsZWQgPSBpbnRlbF9jcnRjX2FjdGl2ZShjcnRjKTsKKworCWlmIChhY3RpdmUtPnBpcGVfZW5hYmxlZCkgewogCQl1MzIgdG1wID0gaHctPndtX3BpcGVbcGlwZV07CiAKIAkJLyoKQEAgLTI3MDYsNyArMjc4Nyw3IEBACiAJc3RydWN0IGlsa193bV92YWx1ZXMgKmh3ID0gJmRldl9wcml2LT53bS5odzsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKKwlmb3JfZWFjaF9jcnRjKGRldiwgY3J0YykKIAkJaWxrX3BpcGVfd21fZ2V0X2h3X3N0YXRlKGNydGMpOwogCiAJaHctPndtX2xwWzBdID0gSTkxNV9SRUFEKFdNMV9MUF9JTEspOwpAQCAtMjcxNCw4ICsyNzk1LDEwIEBACiAJaHctPndtX2xwWzJdID0gSTkxNV9SRUFEKFdNM19MUF9JTEspOwogCiAJaHctPndtX2xwX3NwclswXSA9IEk5MTVfUkVBRChXTTFTX0xQX0lMSyk7Ci0JaHctPndtX2xwX3NwclsxXSA9IEk5MTVfUkVBRChXTTJTX0xQX0lWQik7Ci0JaHctPndtX2xwX3NwclsyXSA9IEk5MTVfUkVBRChXTTNTX0xQX0lWQik7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDcpIHsKKwkJaHctPndtX2xwX3NwclsxXSA9IEk5MTVfUkVBRChXTTJTX0xQX0lWQik7CisJCWh3LT53bV9scF9zcHJbMl0gPSBJOTE1X1JFQUQoV00zU19MUF9JVkIpOworCX0KIAogCWlmIChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpCiAJCWh3LT5wYXJ0aXRpb25pbmcgPSAoSTkxNV9SRUFEKFdNX01JU0MpICYgV01fTUlTQ19EQVRBX1BBUlRJVElPTl81XzYpID8KQEAgLTMwNzEsNiArMzE1NCw5IEBACiAJaWYgKElOVEVMX0lORk8oZGV2X3ByaXYtPmRldiktPmdlbiA8PSA3ICYmICFJU19IQVNXRUxMKGRldl9wcml2LT5kZXYpKQogCQltYXNrIHw9IEdFTjZfUE1fUlBfVVBfRUlfRVhQSVJFRDsKIAorCWlmIChJU19HRU44KGRldl9wcml2LT5kZXYpKQorCQltYXNrIHw9IEdFTjhfUE1JTlRSX1JFRElSRUNUX1RPX05PTl9ESVNQOworCiAJcmV0dXJuIH5tYXNrOwogfQogCkBAIC0zMDkxLDcgKzMxNzcsNyBAQAogCWlmICh2YWwgIT0gZGV2X3ByaXYtPnJwcy5jdXJfZnJlcSkgewogCQlnZW42X3NldF9ycHNfdGhyZXNob2xkcyhkZXZfcHJpdiwgdmFsKTsKIAotCQlpZiAoSVNfSEFTV0VMTChkZXYpKQorCQlpZiAoSVNfSEFTV0VMTChkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKQogCQkJSTkxNV9XUklURShHRU42X1JQTlNXUkVRLAogCQkJCSAgIEhTV19GUkVRVUVOQ1kodmFsKSk7CiAJCWVsc2UKQEAgLTMxMzQsMTYgKzMyMjAsNyBAQAogCS8qIE1hc2sgdHVyYm8gaW50ZXJydXB0IHNvIHRoYXQgdGhleSB3aWxsIG5vdCBjb21lIGluIGJldHdlZW4gKi8KIAlJOTE1X1dSSVRFKEdFTjZfUE1JTlRSTVNLLCAweGZmZmZmZmZmKTsKIAotCS8qIEJyaW5nIHVwIHRoZSBHZnggY2xvY2sgKi8KLQlJOTE1X1dSSVRFKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHLAotCQlJOTE1X1JFQUQoVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcpIHwKLQkJCQlWTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQpOwotCi0JaWYgKHdhaXRfZm9yKCgoVkxWX0dGWF9DTEtfU1RBVFVTX0JJVCAmCi0JCUk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRykpICE9IDApLCA1KSkgewotCQkJRFJNX0VSUk9SKCJHRlhfQ0xLX09OIHJlcXVlc3QgdGltZWQgb3V0XG4iKTsKLQkJcmV0dXJuOwotCX0KKwl2bHZfZm9yY2VfZ2Z4X2Nsb2NrKGRldl9wcml2LCB0cnVlKTsKIAogCWRldl9wcml2LT5ycHMuY3VyX2ZyZXEgPSBkZXZfcHJpdi0+cnBzLm1pbl9mcmVxX3NvZnRsaW1pdDsKIApAQCAtMzE1NCwxMCArMzIzMSw3IEBACiAJCQkJJiBHRU5GUkVRU1RBVFVTKSA9PSAwLCA1KSkKIAkJRFJNX0VSUk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgUHVuaXRcbiIpOwogCi0JLyogUmVsZWFzZSB0aGUgR2Z4IGNsb2NrICovCi0JSTkxNV9XUklURShWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRywKLQkJSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHKSAmCi0JCQkJflZMVl9HRlhfQ0xLX0ZPUkNFX09OX0JJVCk7CisJdmx2X2ZvcmNlX2dmeF9jbG9jayhkZXZfcHJpdiwgZmFsc2UpOwogCiAJSTkxNV9XUklURShHRU42X1BNSU5UUk1TSywKIAkJICAgZ2VuNl9ycHNfcG1fbWFzayhkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5jdXJfZnJlcSkpOwpAQCAtMzIxNSw2ICszMjg5LDI2IEBACiAJdHJhY2VfaW50ZWxfZ3B1X2ZyZXFfY2hhbmdlKHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgdmFsKSk7CiB9CiAKK3N0YXRpYyB2b2lkIGdlbjhfZGlzYWJsZV9ycHNfaW50ZXJydXB0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFKEdFTjZfUE1JTlRSTVNLLCB+R0VOOF9QTUlOVFJfUkVESVJFQ1RfVE9fTk9OX0RJU1ApOworCUk5MTVfV1JJVEUoR0VOOF9HVF9JRVIoMiksIEk5MTVfUkVBRChHRU44X0dUX0lFUigyKSkgJgorCQkJCSAgIH5kZXZfcHJpdi0+cG1fcnBzX2V2ZW50cyk7CisJLyogQ29tcGxldGUgUE0gaW50ZXJydXB0IG1hc2tpbmcgaGVyZSBkb2Vzbid0IHJhY2Ugd2l0aCB0aGUgcnBzIHdvcmsKKwkgKiBpdGVtIGFnYWluIHVubWFza2luZyBQTSBpbnRlcnJ1cHRzIGJlY2F1c2UgdGhhdCBpcyB1c2luZyBhIGRpZmZlcmVudAorCSAqIHJlZ2lzdGVyIChHRU44X0dUX0lNUigyKSkgdG8gbWFzayBQTSBpbnRlcnJ1cHRzLiBUaGUgb25seSByaXNrIGlzIGluCisJICogbGVhdmluZyBzdGFsZSBiaXRzIGluIEdFTjhfR1RfSUlSKDIpIGFuZCBHRU44X0dUX0lNUigyKSB3aGljaAorCSAqIGdlbjhfZW5hYmxlX3JwcyB3aWxsIGNsZWFuIHVwLiAqLworCisJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKKwlkZXZfcHJpdi0+cnBzLnBtX2lpciA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOworCisJSTkxNV9XUklURShHRU44X0dUX0lJUigyKSwgZGV2X3ByaXYtPnBtX3Jwc19ldmVudHMpOworfQorCiBzdGF0aWMgdm9pZCBnZW42X2Rpc2FibGVfcnBzX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzI0MSw3ICszMzM1LDEwIEBACiAJSTkxNV9XUklURShHRU42X1JDX0NPTlRST0wsIDApOwogCUk5MTVfV1JJVEUoR0VONl9SUE5TV1JFUSwgMSA8PCAzMSk7CiAKLQlnZW42X2Rpc2FibGVfcnBzX2ludGVycnVwdHMoZGV2KTsKKwlpZiAoSVNfQlJPQURXRUxMKGRldikpCisJCWdlbjhfZGlzYWJsZV9ycHNfaW50ZXJydXB0cyhkZXYpOworCWVsc2UKKwkJZ2VuNl9kaXNhYmxlX3Jwc19pbnRlcnJ1cHRzKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIHZhbGxleXZpZXdfZGlzYWJsZV9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTMyNTUsMjEgKzMzNTIsNDQgQEAKIAogc3RhdGljIHZvaWQgaW50ZWxfcHJpbnRfcmM2X2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIG1vZGUpCiB7CisJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkgeworCQlpZiAobW9kZSAmIChHRU43X1JDX0NUTF9UT19NT0RFIHwgR0VONl9SQ19DVExfRUlfTU9ERSgxKSkpCisJCQltb2RlID0gR0VONl9SQ19DVExfUkM2X0VOQUJMRTsKKwkJZWxzZQorCQkJbW9kZSA9IDA7CisJfQogCURSTV9JTkZPKCJFbmFibGluZyBSQzYgc3RhdGVzOiBSQzYgJXMsIFJDNnAgJXMsIFJDNnBwICVzXG4iLAogCQkgKG1vZGUgJiBHRU42X1JDX0NUTF9SQzZfRU5BQkxFKSA/ICJvbiIgOiAib2ZmIiwKIAkJIChtb2RlICYgR0VONl9SQ19DVExfUkM2cF9FTkFCTEUpID8gIm9uIiA6ICJvZmYiLAogCQkgKG1vZGUgJiBHRU42X1JDX0NUTF9SQzZwcF9FTkFCTEUpID8gIm9uIiA6ICJvZmYiKTsKIH0KIAotaW50IGludGVsX2VuYWJsZV9yYzYoY29uc3Qgc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc2FuaXRpemVfcmM2X29wdGlvbihjb25zdCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5hYmxlX3JjNikKIHsKIAkvKiBObyBSQzYgYmVmb3JlIElyb25sYWtlICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBSQzYgaXMgb25seSBvbiBJcm9ubGFrZSBtb2JpbGUgbm90IG9uIGRlc2t0b3AgKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNSAmJiAhSVNfSVJPTkxBS0VfTShkZXYpKQorCQlyZXR1cm4gMDsKKwogCS8qIFJlc3BlY3QgdGhlIGtlcm5lbCBwYXJhbWV0ZXIgaWYgaXQgaXMgc2V0ICovCi0JaWYgKGk5MTUuZW5hYmxlX3JjNiA+PSAwKQotCQlyZXR1cm4gaTkxNS5lbmFibGVfcmM2OworCWlmIChlbmFibGVfcmM2ID49IDApIHsKKwkJaW50IG1hc2s7CisKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDYgfHwgSVNfSVZZQlJJREdFKGRldikpCisJCQltYXNrID0gSU5URUxfUkM2X0VOQUJMRSB8IElOVEVMX1JDNnBfRU5BQkxFIHwKKwkJCSAgICAgICBJTlRFTF9SQzZwcF9FTkFCTEU7CisJCWVsc2UKKwkJCW1hc2sgPSBJTlRFTF9SQzZfRU5BQkxFOworCisJCWlmICgoZW5hYmxlX3JjNiAmIG1hc2spICE9IGVuYWJsZV9yYzYpCisJCQlEUk1fSU5GTygiQWRqdXN0aW5nIFJDNiBtYXNrIHRvICVkIChyZXF1ZXN0ZWQgJWQsIHZhbGlkICVkKVxuIiwKKwkJCQkgZW5hYmxlX3JjNiAmIG1hc2ssIGVuYWJsZV9yYzYsIG1hc2spOworCisJCXJldHVybiBlbmFibGVfcmM2ICYgbWFzazsKKwl9CiAKIAkvKiBEaXNhYmxlIFJDNiBvbiBJcm9ubGFrZSAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA1KQpAQCAtMzI4MSw2ICszNDAxLDIyIEBACiAJcmV0dXJuIElOVEVMX1JDNl9FTkFCTEU7CiB9CiAKK2ludCBpbnRlbF9lbmFibGVfcmM2KGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGk5MTUuZW5hYmxlX3JjNjsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9lbmFibGVfcnBzX2ludGVycnVwdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKKwlXQVJOX09OKGRldl9wcml2LT5ycHMucG1faWlyKTsKKwliZHdfZW5hYmxlX3BtX2lycShkZXZfcHJpdiwgZGV2X3ByaXYtPnBtX3Jwc19ldmVudHMpOworCUk5MTVfV1JJVEUoR0VOOF9HVF9JSVIoMiksIGRldl9wcml2LT5wbV9ycHNfZXZlbnRzKTsKKwlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGdlbjZfZW5hYmxlX3Jwc19pbnRlcnJ1cHRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMyOTIsMTAgKzM0MjgsMzEgQEAKIAlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIHBhcnNlX3JwX3N0YXRlX2NhcChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiBycF9zdGF0ZV9jYXApCit7CisJLyogQWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgaW4gdW5pdHMgb2YgNTBNSHogKi8KKwlkZXZfcHJpdi0+cnBzLmN1cl9mcmVxCQk9IDA7CisJLyogc3RhdGljIHZhbHVlcyBmcm9tIEhXOiBSUDAgPCBSUGUgPCBSUDEgPCBSUG4gKG1pbl9mcmVxKSAqLworCWRldl9wcml2LT5ycHMucnAxX2ZyZXEJCT0gKHJwX3N0YXRlX2NhcCA+PiAgOCkgJiAweGZmOworCWRldl9wcml2LT5ycHMucnAwX2ZyZXEJCT0gKHJwX3N0YXRlX2NhcCA+PiAgMCkgJiAweGZmOworCWRldl9wcml2LT5ycHMubWluX2ZyZXEJCT0gKHJwX3N0YXRlX2NhcCA+PiAxNikgJiAweGZmOworCS8qIFhYWDogb25seSBCWVQgaGFzIGEgc3BlY2lhbCBlZmZpY2llbnQgZnJlcSAqLworCWRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEJPSBkZXZfcHJpdi0+cnBzLnJwMV9mcmVxOworCS8qIGh3X21heCA9IFJQMCB1bnRpbCB3ZSBjaGVjayBmb3Igb3ZlcmNsb2NraW5nICovCisJZGV2X3ByaXYtPnJwcy5tYXhfZnJlcQkJPSBkZXZfcHJpdi0+cnBzLnJwMF9mcmVxOworCisJLyogUHJlc2VydmUgbWluL21heCBzZXR0aW5ncyBpbiBjYXNlIG9mIHJlLWluaXQgKi8KKwlpZiAoZGV2X3ByaXYtPnJwcy5tYXhfZnJlcV9zb2Z0bGltaXQgPT0gMCkKKwkJZGV2X3ByaXYtPnJwcy5tYXhfZnJlcV9zb2Z0bGltaXQgPSBkZXZfcHJpdi0+cnBzLm1heF9mcmVxOworCisJaWYgKGRldl9wcml2LT5ycHMubWluX2ZyZXFfc29mdGxpbWl0ID09IDApCisJCWRldl9wcml2LT5ycHMubWluX2ZyZXFfc29mdGxpbWl0ID0gZGV2X3ByaXYtPnJwcy5taW5fZnJlcTsKK30KKwogc3RhdGljIHZvaWQgZ2VuOF9lbmFibGVfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAl1aW50MzJfdCByYzZfbWFzayA9IDAsIHJwX3N0YXRlX2NhcDsKIAlpbnQgdW51c2VkOwogCkBAIC0zMzEwLDYgKzM0NjcsNyBAQAogCUk5MTVfV1JJVEUoR0VONl9SQ19DT05UUk9MLCAwKTsKIAogCXJwX3N0YXRlX2NhcCA9IEk5MTVfUkVBRChHRU42X1JQX1NUQVRFX0NBUCk7CisJcGFyc2VfcnBfc3RhdGVfY2FwKGRldl9wcml2LCBycF9zdGF0ZV9jYXApOwogCiAJLyogMmI6IFByb2dyYW0gUkM2IHRocmVzaG9sZHMuKi8KIAlJOTE1X1dSSVRFKEdFTjZfUkM2X1dBS0VfUkFURV9MSU1JVCwgNDAgPDwgMTYpOwpAQCAtMzMyOSw4ICszNDg3LDEwIEBACiAJCQkJICAgIHJjNl9tYXNrKTsKIAogCS8qIDQgUHJvZ3JhbSBkZWZhdWx0cyBhbmQgdGhyZXNob2xkcyBmb3IgUlBTKi8KLQlJOTE1X1dSSVRFKEdFTjZfUlBOU1dSRVEsIEhTV19GUkVRVUVOQ1koMTApKTsgLyogUmVxdWVzdCA1MDAgTUh6ICovCi0JSTkxNV9XUklURShHRU42X1JDX1ZJREVPX0ZSRVEsIEhTV19GUkVRVUVOQ1koMTIpKTsgLyogUmVxdWVzdCA2MDAgTUh6ICovCisJSTkxNV9XUklURShHRU42X1JQTlNXUkVRLAorCQkgICBIU1dfRlJFUVVFTkNZKGRldl9wcml2LT5ycHMucnAxX2ZyZXEpKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNfVklERU9fRlJFUSwKKwkJICAgSFNXX0ZSRVFVRU5DWShkZXZfcHJpdi0+cnBzLnJwMV9mcmVxKSk7CiAJLyogTkI6IERvY3Mgc2F5IDFzLCBhbmQgMTAwMDAwMCAtIHdoaWNoIGFyZW4ndCBlcXVpdmFsZW50ICovCiAJSTkxNV9XUklURShHRU42X1JQX0RPV05fVElNRU9VVCwgMTAwMDAwMDAwIC8gMTI4KTsgLyogMSBzZWNvbmQgdGltZW91dCAqLwogCkBAIC0zMzQ2LDExICszNTA2LDE1IEBACiAKIAlJOTE1X1dSSVRFKEdFTjZfUlBfSURMRV9IWVNURVJTSVMsIDEwKTsKIAorCS8qIFdhRGlzYWJsZVB3cm10ckV2ZW50OmNodiAocHJlLXByb2R1Y3Rpb24gaHcpICovCisJSTkxNV9XUklURSgweEE4MEMsIEk5MTVfUkVBRCgweEE4MEMpICYgMHgwMGZmZmZmZik7CisJSTkxNV9XUklURSgweEE4MTAsIEk5MTVfUkVBRCgweEE4MTApICYgMHhmZmZmZmYwMCk7CisKIAkvKiA1OiBFbmFibGUgUlBTICovCiAJSTkxNV9XUklURShHRU42X1JQX0NPTlRST0wsCiAJCSAgIEdFTjZfUlBfTUVESUFfVFVSQk8gfAogCQkgICBHRU42X1JQX01FRElBX0hXX05PUk1BTF9NT0RFIHwKLQkJICAgR0VONl9SUF9NRURJQV9JU19HRlggfAorCQkgICBHRU42X1JQX01FRElBX0lTX0dGWCB8IC8qIFdhU2V0TWFza0ZvckdmeEJ1c3luZXNzOmNodiAocHJlLXByb2R1Y3Rpb24gaHcgPykgKi8KIAkJICAgR0VONl9SUF9FTkFCTEUgfAogCQkgICBHRU42X1JQX1VQX0JVU1lfQVZHIHwKIAkJICAgR0VONl9SUF9ET1dOX0lETEVfQVZHKTsKQEAgLTMzNTksNyArMzUyMyw3IEBACiAKIAlnZW42X3NldF9ycHMoZGV2LCAoSTkxNV9SRUFEKEdFTjZfR1RfUEVSRl9TVEFUVVMpICYgMHhmZjAwKSA+PiA4KTsKIAotCWdlbjZfZW5hYmxlX3Jwc19pbnRlcnJ1cHRzKGRldik7CisJZ2VuOF9lbmFibGVfcnBzX2ludGVycnVwdHMoZGV2KTsKIAogCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogfQpAQCAtMzM2Nyw3ICszNTMxLDcgQEAKIHN0YXRpYyB2b2lkIGdlbjZfZW5hYmxlX3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmc7CiAJdTMyIHJwX3N0YXRlX2NhcDsKIAl1MzIgZ3RfcGVyZl9zdGF0dXM7CiAJdTMyIHJjNnZpZHMsIHBjdV9tYm94ID0gMCwgcmM2X21hc2sgPSAwOwpAQCAtMzM5NiwyMyArMzU2MCw3IEBACiAJcnBfc3RhdGVfY2FwID0gSTkxNV9SRUFEKEdFTjZfUlBfU1RBVEVfQ0FQKTsKIAlndF9wZXJmX3N0YXR1cyA9IEk5MTVfUkVBRChHRU42X0dUX1BFUkZfU1RBVFVTKTsKIAotCS8qIEFsbCBvZiB0aGVzZSB2YWx1ZXMgYXJlIGluIHVuaXRzIG9mIDUwTUh6ICovCi0JZGV2X3ByaXYtPnJwcy5jdXJfZnJlcQkJPSAwOwotCS8qIHN0YXRpYyB2YWx1ZXMgZnJvbSBIVzogUlAwIDwgUlBlIDwgUlAxIDwgUlBuIChtaW5fZnJlcSkgKi8KLQlkZXZfcHJpdi0+cnBzLnJwMV9mcmVxCQk9IChycF9zdGF0ZV9jYXAgPj4gIDgpICYgMHhmZjsKLQlkZXZfcHJpdi0+cnBzLnJwMF9mcmVxCQk9IChycF9zdGF0ZV9jYXAgPj4gIDApICYgMHhmZjsKLQlkZXZfcHJpdi0+cnBzLm1pbl9mcmVxCQk9IChycF9zdGF0ZV9jYXAgPj4gMTYpICYgMHhmZjsKLQkvKiBYWFg6IG9ubHkgQllUIGhhcyBhIHNwZWNpYWwgZWZmaWNpZW50IGZyZXEgKi8KLQlkZXZfcHJpdi0+cnBzLmVmZmljaWVudF9mcmVxCT0gZGV2X3ByaXYtPnJwcy5ycDFfZnJlcTsKLQkvKiBod19tYXggPSBSUDAgdW50aWwgd2UgY2hlY2sgZm9yIG92ZXJjbG9ja2luZyAqLwotCWRldl9wcml2LT5ycHMubWF4X2ZyZXEJCT0gZGV2X3ByaXYtPnJwcy5ycDBfZnJlcTsKLQotCS8qIFByZXNlcnZlIG1pbi9tYXggc2V0dGluZ3MgaW4gY2FzZSBvZiByZS1pbml0ICovCi0JaWYgKGRldl9wcml2LT5ycHMubWF4X2ZyZXFfc29mdGxpbWl0ID09IDApCi0JCWRldl9wcml2LT5ycHMubWF4X2ZyZXFfc29mdGxpbWl0ID0gZGV2X3ByaXYtPnJwcy5tYXhfZnJlcTsKLQotCWlmIChkZXZfcHJpdi0+cnBzLm1pbl9mcmVxX3NvZnRsaW1pdCA9PSAwKQotCQlkZXZfcHJpdi0+cnBzLm1pbl9mcmVxX3NvZnRsaW1pdCA9IGRldl9wcml2LT5ycHMubWluX2ZyZXE7CisJcGFyc2VfcnBfc3RhdGVfY2FwKGRldl9wcml2LCBycF9zdGF0ZV9jYXApOwogCiAJLyogZGlzYWJsZSB0aGUgY291bnRlcnMgYW5kIHNldCBkZXRlcm1pbmlzdGljIHRocmVzaG9sZHMgKi8KIAlJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwgMCk7CkBAIC0zNDk0LDcgKzM2NDIsNyBAQAogCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwogfQogCi12b2lkIGdlbjZfdXBkYXRlX3JpbmdfZnJlcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgX19nZW42X3VwZGF0ZV9yaW5nX2ZyZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBtaW5fZnJlcSA9IDE1OwpAQCAtMzU2NCw2ICszNzEyLDE4IEBACiAJfQogfQogCit2b2lkIGdlbjZfdXBkYXRlX3JpbmdfZnJlcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA2IHx8IElTX1ZBTExFWVZJRVcoZGV2KSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwlfX2dlbjZfdXBkYXRlX3JpbmdfZnJlcShkZXYpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKK30KKwogaW50IHZhbGxleXZpZXdfcnBzX21heF9mcmVxKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKIAl1MzIgdmFsLCBycDA7CkBAIC0zNjU4LDEwICszODE4LDQ5IEBACiAJZGV2X3ByaXYtPnZsdl9wY3R4ID0gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgdmFsbGV5dmlld19pbml0X2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwl2YWxsZXl2aWV3X3NldHVwX3BjdHgoZGV2KTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisKKwlkZXZfcHJpdi0+cnBzLm1heF9mcmVxID0gdmFsbGV5dmlld19ycHNfbWF4X2ZyZXEoZGV2X3ByaXYpOworCWRldl9wcml2LT5ycHMucnAwX2ZyZXEgPSBkZXZfcHJpdi0+cnBzLm1heF9mcmVxOworCURSTV9ERUJVR19EUklWRVIoIm1heCBHUFUgZnJlcTogJWQgTUh6ICgldSlcbiIsCisJCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLm1heF9mcmVxKSwKKwkJCSBkZXZfcHJpdi0+cnBzLm1heF9mcmVxKTsKKworCWRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEgPSB2YWxsZXl2aWV3X3Jwc19ycGVfZnJlcShkZXZfcHJpdik7CisJRFJNX0RFQlVHX0RSSVZFUigiUlBlIEdQVSBmcmVxOiAlZCBNSHogKCV1KVxuIiwKKwkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpLAorCQkJIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpOworCisJZGV2X3ByaXYtPnJwcy5taW5fZnJlcSA9IHZhbGxleXZpZXdfcnBzX21pbl9mcmVxKGRldl9wcml2KTsKKwlEUk1fREVCVUdfRFJJVkVSKCJtaW4gR1BVIGZyZXE6ICVkIE1IeiAoJXUpXG4iLAorCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5taW5fZnJlcSksCisJCQkgZGV2X3ByaXYtPnJwcy5taW5fZnJlcSk7CisKKwkvKiBQcmVzZXJ2ZSBtaW4vbWF4IHNldHRpbmdzIGluIGNhc2Ugb2YgcmUtaW5pdCAqLworCWlmIChkZXZfcHJpdi0+cnBzLm1heF9mcmVxX3NvZnRsaW1pdCA9PSAwKQorCQlkZXZfcHJpdi0+cnBzLm1heF9mcmVxX3NvZnRsaW1pdCA9IGRldl9wcml2LT5ycHMubWF4X2ZyZXE7CisKKwlpZiAoZGV2X3ByaXYtPnJwcy5taW5fZnJlcV9zb2Z0bGltaXQgPT0gMCkKKwkJZGV2X3ByaXYtPnJwcy5taW5fZnJlcV9zb2Z0bGltaXQgPSBkZXZfcHJpdi0+cnBzLm1pbl9mcmVxOworCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworfQorCitzdGF0aWMgdm9pZCB2YWxsZXl2aWV3X2NsZWFudXBfZ3RfcG93ZXJzYXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdmFsbGV5dmlld19jbGVhbnVwX3BjdHgoZGV2KTsKK30KKwogc3RhdGljIHZvaWQgdmFsbGV5dmlld19lbmFibGVfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZzsKIAl1MzIgZ3RmaWZvZGJnLCB2YWwsIHJjNl9tb2RlID0gMDsKIAlpbnQgaTsKIApAQCAtMzcyNCwyOSArMzkyMyw2IEBACiAJCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLmN1cl9mcmVxKSwKIAkJCSBkZXZfcHJpdi0+cnBzLmN1cl9mcmVxKTsKIAotCWRldl9wcml2LT5ycHMubWF4X2ZyZXEgPSB2YWxsZXl2aWV3X3Jwc19tYXhfZnJlcShkZXZfcHJpdik7Ci0JZGV2X3ByaXYtPnJwcy5ycDBfZnJlcSAgPSBkZXZfcHJpdi0+cnBzLm1heF9mcmVxOwotCURSTV9ERUJVR19EUklWRVIoIm1heCBHUFUgZnJlcTogJWQgTUh6ICgldSlcbiIsCi0JCQkgdmx2X2dwdV9mcmVxKGRldl9wcml2LCBkZXZfcHJpdi0+cnBzLm1heF9mcmVxKSwKLQkJCSBkZXZfcHJpdi0+cnBzLm1heF9mcmVxKTsKLQotCWRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEgPSB2YWxsZXl2aWV3X3Jwc19ycGVfZnJlcShkZXZfcHJpdik7Ci0JRFJNX0RFQlVHX0RSSVZFUigiUlBlIEdQVSBmcmVxOiAlZCBNSHogKCV1KVxuIiwKLQkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpLAotCQkJIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpOwotCi0JZGV2X3ByaXYtPnJwcy5taW5fZnJlcSA9IHZhbGxleXZpZXdfcnBzX21pbl9mcmVxKGRldl9wcml2KTsKLQlEUk1fREVCVUdfRFJJVkVSKCJtaW4gR1BVIGZyZXE6ICVkIE1IeiAoJXUpXG4iLAotCQkJIHZsdl9ncHVfZnJlcShkZXZfcHJpdiwgZGV2X3ByaXYtPnJwcy5taW5fZnJlcSksCi0JCQkgZGV2X3ByaXYtPnJwcy5taW5fZnJlcSk7Ci0KLQkvKiBQcmVzZXJ2ZSBtaW4vbWF4IHNldHRpbmdzIGluIGNhc2Ugb2YgcmUtaW5pdCAqLwotCWlmIChkZXZfcHJpdi0+cnBzLm1heF9mcmVxX3NvZnRsaW1pdCA9PSAwKQotCQlkZXZfcHJpdi0+cnBzLm1heF9mcmVxX3NvZnRsaW1pdCA9IGRldl9wcml2LT5ycHMubWF4X2ZyZXE7Ci0KLQlpZiAoZGV2X3ByaXYtPnJwcy5taW5fZnJlcV9zb2Z0bGltaXQgPT0gMCkKLQkJZGV2X3ByaXYtPnJwcy5taW5fZnJlcV9zb2Z0bGltaXQgPSBkZXZfcHJpdi0+cnBzLm1pbl9mcmVxOwotCiAJRFJNX0RFQlVHX0RSSVZFUigic2V0dGluZyBHUFUgZnJlcSB0byAlZCBNSHogKCV1KVxuIiwKIAkJCSB2bHZfZ3B1X2ZyZXEoZGV2X3ByaXYsIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpLAogCQkJIGRldl9wcml2LT5ycHMuZWZmaWNpZW50X2ZyZXEpOwpAQCAtMzgxNSw3ICszOTkxLDcgQEAKIHN0YXRpYyB2b2lkIGlyb25sYWtlX2VuYWJsZV9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAlib29sIHdhc19pbnRlcnJ1cHRpYmxlOwogCWludCByZXQ7CiAKQEAgLTM4NzMsNyArNDA0OSw3IEBACiAJSTkxNV9XUklURShQV1JDVFhBLCBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQoZGV2X3ByaXYtPmlwcy5wd3JjdHgpIHwgUFdSQ1RYX0VOKTsKIAlJOTE1X1dSSVRFKFJTVERCWUNUTCwgSTkxNV9SRUFEKFJTVERCWUNUTCkgJiB+UkNYX1NXX0VYSVQpOwogCi0JaW50ZWxfcHJpbnRfcmM2X2luZm8oZGV2LCBJTlRFTF9SQzZfRU5BQkxFKTsKKwlpbnRlbF9wcmludF9yYzZfaW5mbyhkZXYsIEdFTjZfUkNfQ1RMX1JDNl9FTkFCTEUpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRlbF9weGZyZXEodTMyIHZpZGZyZXEpCkBAIC00MzI3LDcgKzQ1MDMsNyBAQAogYm9vbCBpOTE1X2dwdV9idXN5KHZvaWQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAJaW50IGk7CiAKQEAgLTQ0ODcsMTQgKzQ2NjMsMTYgQEAKIAogdm9pZCBpbnRlbF9pbml0X2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCWk5MTUuZW5hYmxlX3JjNiA9IHNhbml0aXplX3JjNl9vcHRpb24oZGV2LCBpOTE1LmVuYWJsZV9yYzYpOworCiAJaWYgKElTX1ZBTExFWVZJRVcoZGV2KSkKLQkJdmFsbGV5dmlld19zZXR1cF9wY3R4KGRldik7CisJCXZhbGxleXZpZXdfaW5pdF9ndF9wb3dlcnNhdmUoZGV2KTsKIH0KIAogdm9pZCBpbnRlbF9jbGVhbnVwX2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWlmIChJU19WQUxMRVlWSUVXKGRldikpCi0JCXZhbGxleXZpZXdfY2xlYW51cF9wY3R4KGRldik7CisJCXZhbGxleXZpZXdfY2xlYW51cF9ndF9wb3dlcnNhdmUoZGV2KTsKIH0KIAogdm9pZCBpbnRlbF9kaXNhYmxlX2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtNDUwNyw4ICs0Njg1LDEwIEBACiAJaWYgKElTX0lST05MQUtFX00oZGV2KSkgewogCQlpcm9ubGFrZV9kaXNhYmxlX2RycHMoZGV2KTsKIAkJaXJvbmxha2VfZGlzYWJsZV9yYzYoZGV2KTsKLQl9IGVsc2UgaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZXZfcHJpdi0+cnBzLmRlbGF5ZWRfcmVzdW1lX3dvcmspOworCX0gZWxzZSBpZiAoSVNfR0VONihkZXYpIHx8IElTX0dFTjcoZGV2KSB8fCBJU19CUk9BRFdFTEwoZGV2KSkgeworCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZXZfcHJpdi0+cnBzLmRlbGF5ZWRfcmVzdW1lX3dvcmspKQorCQkJaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOworCiAJCWNhbmNlbF93b3JrX3N5bmMoJmRldl9wcml2LT5ycHMud29yayk7CiAJCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CiAJCWlmIChJU19WQUxMRVlWSUVXKGRldikpCkBAIC00NTMzLDEzICs0NzEzLDE1IEBACiAJCXZhbGxleXZpZXdfZW5hYmxlX3JwcyhkZXYpOwogCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldikpIHsKIAkJZ2VuOF9lbmFibGVfcnBzKGRldik7Ci0JCWdlbjZfdXBkYXRlX3JpbmdfZnJlcShkZXYpOworCQlfX2dlbjZfdXBkYXRlX3JpbmdfZnJlcShkZXYpOwogCX0gZWxzZSB7CiAJCWdlbjZfZW5hYmxlX3JwcyhkZXYpOwotCQlnZW42X3VwZGF0ZV9yaW5nX2ZyZXEoZGV2KTsKKwkJX19nZW42X3VwZGF0ZV9yaW5nX2ZyZXEoZGV2KTsKIAl9CiAJZGV2X3ByaXYtPnJwcy5lbmFibGVkID0gdHJ1ZTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiB9CiAKIHZvaWQgaW50ZWxfZW5hYmxlX2d0X3Bvd2Vyc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtNDU0NywyMCArNDcyOSwzOCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKSB7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJaXJvbmxha2VfZW5hYmxlX2RycHMoZGV2KTsKIAkJaXJvbmxha2VfZW5hYmxlX3JjNihkZXYpOwogCQlpbnRlbF9pbml0X2Vtb24oZGV2KTsKLQl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSB8fCBJU19HRU43KGRldikpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJfSBlbHNlIGlmIChJU19HRU42KGRldikgfHwgSVNfR0VONyhkZXYpIHx8IElTX0JST0FEV0VMTChkZXYpKSB7CiAJCS8qCiAJCSAqIFBDVSBjb21tdW5pY2F0aW9uIGlzIHNsb3cgYW5kIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlCiAJCSAqIGRvbmUgYXQgYW55IHNwZWNpZmljIHRpbWUsIHNvIGRvIHRoaXMgb3V0IG9mIG91ciBmYXN0IHBhdGgKIAkJICogdG8gbWFrZSByZXN1bWUgYW5kIGluaXQgZmFzdGVyLgorCQkgKgorCQkgKiBXZSBkZXBlbmQgb24gdGhlIEhXIFJDNiBwb3dlciBjb250ZXh0IHNhdmUvcmVzdG9yZQorCQkgKiBtZWNoYW5pc20gd2hlbiBlbnRlcmluZyBEMyB0aHJvdWdoIHJ1bnRpbWUgUE0gc3VzcGVuZC4gU28KKwkJICogZGlzYWJsZSBSUE0gdW50aWwgUlBTL1JDNiBpcyBwcm9wZXJseSBzZXR1cC4gV2UgY2FuIG9ubHkKKwkJICogZ2V0IGhlcmUgdmlhIHRoZSBkcml2ZXIgbG9hZC9zeXN0ZW0gcmVzdW1lL3J1bnRpbWUgcmVzdW1lCisJCSAqIHBhdGhzLCBzbyB0aGUgX25vcmVzdW1lIHZlcnNpb24gaXMgZW5vdWdoIChhbmQgaW4gY2FzZSBvZgorCQkgKiBydW50aW1lIHJlc3VtZSBpdCdzIG5lY2Vzc2FyeSkuCiAJCSAqLwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldl9wcml2LT5ycHMuZGVsYXllZF9yZXN1bWVfd29yaywKLQkJCQkgICAgICByb3VuZF9qaWZmaWVzX3VwX3JlbGF0aXZlKEhaKSk7CisJCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldl9wcml2LT5ycHMuZGVsYXllZF9yZXN1bWVfd29yaywKKwkJCQkJICAgcm91bmRfamlmZmllc191cF9yZWxhdGl2ZShIWikpKQorCQkJaW50ZWxfcnVudGltZV9wbV9nZXRfbm9yZXN1bWUoZGV2X3ByaXYpOwogCX0KIH0KIAordm9pZCBpbnRlbF9yZXNldF9ndF9wb3dlcnNhdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPnJwcy5lbmFibGVkID0gZmFsc2U7CisJaW50ZWxfZW5hYmxlX2d0X3Bvd2Vyc2F2ZShkZXYpOworfQorCiBzdGF0aWMgdm9pZCBpYnhfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNDY2Niw2ICs0ODY2LDkgQEAKIAlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwKIAkJICAgX01BU0tFRF9CSVRfRU5BQkxFKENNMF9QSVBFTElORURfUkVOREVSX0ZMVVNIX0RJU0FCTEUpKTsKIAorCS8qIFdhRGlzYWJsZV9SZW5kZXJDYWNoZV9PcGVyYXRpb25hbEZsdXNoOmlsayAqLworCUk5MTVfV1JJVEUoQ0FDSEVfTU9ERV8wLCBfTUFTS0VEX0JJVF9ESVNBQkxFKFJDX09QX0ZMVVNIX0VOQUJMRSkpOworCiAJZzR4X2Rpc2FibGVfdHJpY2tsZV9mZWVkKGRldik7CiAKIAlpYnhfaW5pdF9jbG9ja19nYXRpbmcoZGV2KTsKQEAgLTQ3NDEsNiArNDk0NCw5IEBACiAJCUk5MTVfV1JJVEUoR0VONl9HVF9NT0RFLAogCQkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEdFTjZfVERfRk9VUl9ST1dfRElTUEFUQ0hfRElTQUJMRSkpOwogCisJLyogV2FEaXNhYmxlX1JlbmRlckNhY2hlX09wZXJhdGlvbmFsRmx1c2g6c25iICovCisJSTkxNV9XUklURShDQUNIRV9NT0RFXzAsIF9NQVNLRURfQklUX0RJU0FCTEUoUkNfT1BfRkxVU0hfRU5BQkxFKSk7CisKIAkvKgogCSAqIEJTcGVjIHJlY29vbWVuZHMgOHg0IHdoZW4gTVNBQSBpcyB1c2VkLAogCSAqIGhvd2V2ZXIgaW4gcHJhY3RpY2UgMTZ4NCBzZWVtcyBmYXN0ZXN0LgpAQCAtNDkwOSw2ICs1MTE1LDEwIEBACiAJSTkxNV9XUklURShHRU43X0hBTEZfU0xJQ0VfQ0hJQ0tFTjEsCiAJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU43X1NJTkdMRV9TVUJTQ0FOX0RJU1BBVENIX0VOQUJMRSkpOwogCisJLyogV2FEaXNhYmxlRG9wQ2xvY2tHYXRpbmc6YmR3IE1heSBub3QgYmUgbmVlZGVkIGZvciBwcm9kdWN0aW9uICovCisJSTkxNV9XUklURShHRU43X1JPV19DSElDS0VOMiwKKwkJICAgX01BU0tFRF9CSVRfRU5BQkxFKERPUF9DTE9DS19HQVRJTkdfRElTQUJMRSkpOworCiAJLyogV2FTd2l0Y2hTb2xWZkZBcmJpdHJhdGlvblByaW9yaXR5OmJkdyAqLwogCUk5MTVfV1JJVEUoR0FNX0VDT0NISywgSTkxNV9SRUFEKEdBTV9FQ09DSEspIHwgSFNXX0VDT0NIS19BUkJfUFJJT19TT0wpOwogCkBAIC00OTgwLDYgKzUxOTAsOSBAQAogCUk5MTVfV1JJVEUoR0VON19GRl9USFJFQURfTU9ERSwKIAkJICAgSTkxNV9SRUFEKEdFTjdfRkZfVEhSRUFEX01PREUpICYgfkdFTjdfRkZfVlNfUkVGX0NOVF9GRk1FKTsKIAorCS8qIFdhRGlzYWJsZV9SZW5kZXJDYWNoZV9PcGVyYXRpb25hbEZsdXNoOmhzdyAqLworCUk5MTVfV1JJVEUoQ0FDSEVfTU9ERV8wX0dFTjcsIF9NQVNLRURfQklUX0RJU0FCTEUoUkNfT1BfRkxVU0hfRU5BQkxFKSk7CisKIAkvKiBlbmFibGUgSGlaIFJhdyBTdGFsbCBPcHRpbWl6YXRpb24gKi8KIAlJOTE1X1dSSVRFKENBQ0hFX01PREVfMF9HRU43LAogCQkgICBfTUFTS0VEX0JJVF9ESVNBQkxFKEhJWl9SQVdfU1RBTExfT1BUX0RJU0FCTEUpKTsKQEAgLTUwMzIsNiArNTI0NSw5IEBACiAJCUk5MTVfV1JJVEUoR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAogCQkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEdFTjdfUFNEX1NJTkdMRV9QT1JUX0RJU1BBVENIX0VOQUJMRSkpOwogCisJLyogV2FEaXNhYmxlX1JlbmRlckNhY2hlX09wZXJhdGlvbmFsRmx1c2g6aXZiICovCisJSTkxNV9XUklURShDQUNIRV9NT0RFXzBfR0VONywgX01BU0tFRF9CSVRfRElTQUJMRShSQ19PUF9GTFVTSF9FTkFCTEUpKTsKKwogCS8qIEFwcGx5IHRoZSBXYURpc2FibGVSSFdPT3B0aW1pemF0aW9uRm9yUmVuZGVySGFuZzppdmIgd29ya2Fyb3VuZC4gKi8KIAlJOTE1X1dSSVRFKEdFTjdfQ09NTU9OX1NMSUNFX0NISUNLRU4xLAogCQkgICBHRU43X0NTQzFfUkhXT19PUFRfRElTQUJMRV9JTl9SQ0MpOwpAQCAtNTEyNiw2ICs1MzQyLDEwIEBACiAJfQogCURSTV9ERUJVR19EUklWRVIoIkREUiBzcGVlZDogJWQgTUh6IiwgZGV2X3ByaXYtPm1lbV9mcmVxKTsKIAorCWRldl9wcml2LT52bHZfY2RjbGtfZnJlcSA9IHZhbGxleXZpZXdfY3VyX2NkY2xrKGRldl9wcml2KTsKKwlEUk1fREVCVUdfRFJJVkVSKCJDdXJyZW50IENEIGNsb2NrIHJhdGU6ICVkIE1IeiIsCisJCQkgZGV2X3ByaXYtPnZsdl9jZGNsa19mcmVxKTsKKwogCUk5MTVfV1JJVEUoRFNQQ0xLX0dBVEVfRCwgVlJIVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOwogCiAJLyogV2FEaXNhYmxlRWFybHlDdWxsOnZsdiAqLwpAQCAtNTE0Myw2ICs1MzYzLDkgQEAKIAkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEdFTjdfTUFYX1BTX1RIUkVBRF9ERVAgfAogCQkJCSAgICAgIEdFTjdfUFNEX1NJTkdMRV9QT1JUX0RJU1BBVENIX0VOQUJMRSkpOwogCisJLyogV2FEaXNhYmxlX1JlbmRlckNhY2hlX09wZXJhdGlvbmFsRmx1c2g6dmx2ICovCisJSTkxNV9XUklURShDQUNIRV9NT0RFXzBfR0VONywgX01BU0tFRF9CSVRfRElTQUJMRShSQ19PUF9GTFVTSF9FTkFCTEUpKTsKKwogCS8qIFdhRm9yY2VMM1NlcmlhbGl6YXRpb246dmx2ICovCiAJSTkxNV9XUklURShHRU43X0wzU1FDUkVHNCwgSTkxNV9SRUFEKEdFTjdfTDNTUUNSRUc0KSAmCiAJCSAgIH5MM1NRX1VSQl9SRUFEX0NBTV9NQVRDSF9ESVNBQkxFKTsKQEAgLTUxNjUsOCArNTM4OCwxMSBAQAogCUk5MTVfV1JJVEUoR0VONl9VQ0dDVEwyLAogCQkgICBHRU42X1JDWlVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKIAotCS8qIFdhRGlzYWJsZUwzQmFuazJ4Q2xvY2tHYXRlOnZsdiAqLwotCUk5MTVfV1JJVEUoR0VON19VQ0dDVEw0LCBHRU43X0wzQkFOSzJYX0NMT0NLX0dBVEVfRElTQUJMRSk7CisJLyogV2FEaXNhYmxlTDNCYW5rMnhDbG9ja0dhdGU6dmx2CisJICogRGlzYWJsaW5nIEwzIGNsb2NrIGdhdGluZy0gTU1JTyA5NDBjWzI1XSA9IDEKKwkgKiBTZXQgYml0IDI1LCB0byBkaXNhYmxlIEwzX0JBTktfMnhfQ0xLX0dBVElORyAqLworCUk5MTVfV1JJVEUoR0VON19VQ0dDVEw0LAorCQkgICBJOTE1X1JFQUQoR0VON19VQ0dDVEw0KSB8IEdFTjdfTDNCQU5LMlhfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKIAogCUk5MTVfV1JJVEUoTUlfQVJCX1ZMViwgTUlfQVJCX0RJU1BMQVlfVFJJQ0tMRV9GRUVEX0RJU0FCTEUpOwogCkBAIC01MTkxLDYgKzU0MTcsNTkgQEAKIAlJOTE1X1dSSVRFKFZMVl9HVU5JVF9DTE9DS19HQVRFLCBHQ0ZHX0RJUyk7CiB9CiAKK3N0YXRpYyB2b2lkIGNoZXJyeXZpZXdfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJSTkxNV9XUklURShEU1BDTEtfR0FURV9ELCBWUkhVTklUX0NMT0NLX0dBVEVfRElTQUJMRSk7CisKKwlJOTE1X1dSSVRFKE1JX0FSQl9WTFYsIE1JX0FSQl9ESVNQTEFZX1RSSUNLTEVfRkVFRF9ESVNBQkxFKTsKKworCS8qIFdhRGlzYWJsZVBhcnRpYWxJbnN0U2hvb3Rkb3duOmNodiAqLworCUk5MTVfV1JJVEUoR0VOOF9ST1dfQ0hJQ0tFTiwKKwkJICAgX01BU0tFRF9CSVRfRU5BQkxFKFBBUlRJQUxfSU5TVFJVQ1RJT05fU0hPT1RET1dOX0RJU0FCTEUpKTsKKworCS8qIFdhRGlzYWJsZVRocmVhZFN0YWxsRG9wQ2xvY2tHYXRpbmc6Y2h2ICovCisJSTkxNV9XUklURShHRU44X1JPV19DSElDS0VOLAorCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoU1RBTExfRE9QX0dBVElOR19ESVNBQkxFKSk7CisKKwkvKiBXYVZTUmVmQ291bnRGdWxsZm9yY2VNaXNzRGlzYWJsZTpjaHYgKi8KKwkvKiBXYURTUmVmQ291bnRGdWxsZm9yY2VNaXNzRGlzYWJsZTpjaHYgKi8KKwlJOTE1X1dSSVRFKEdFTjdfRkZfVEhSRUFEX01PREUsCisJCSAgIEk5MTVfUkVBRChHRU43X0ZGX1RIUkVBRF9NT0RFKSAmCisJCSAgIH4oR0VOOF9GRl9EU19SRUZfQ05UX0ZGTUUgfCBHRU43X0ZGX1ZTX1JFRl9DTlRfRkZNRSkpOworCisJLyogV2FEaXNhYmxlU2VtYXBob3JlQW5kU3luY0ZsaXBXYWl0OmNodiAqLworCUk5MTVfV1JJVEUoR0VONl9SQ19TTEVFUF9QU01JX0NPTlRST0wsCisJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU44X1JDX1NFTUFfSURMRV9NU0dfRElTQUJMRSkpOworCisJLyogV2FEaXNhYmxlQ1NVbml0Q2xvY2tHYXRpbmc6Y2h2ICovCisJSTkxNV9XUklURShHRU42X1VDR0NUTDEsIEk5MTVfUkVBRChHRU42X1VDR0NUTDEpIHwKKwkJICAgR0VONl9DU1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKworCS8qIFdhRGlzYWJsZVNERVVuaXRDbG9ja0dhdGluZzpjaHYgKi8KKwlJOTE1X1dSSVRFKEdFTjhfVUNHQ1RMNiwgSTkxNV9SRUFEKEdFTjhfVUNHQ1RMNikgfAorCQkgICBHRU44X1NERVVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKworCS8qIFdhRGlzYWJsZVNhbXBsZXJQb3dlckJ5cGFzczpjaHYgKHByZS1wcm9kdWN0aW9uIGh3KSAqLworCUk5MTVfV1JJVEUoSEFMRl9TTElDRV9DSElDS0VOMywKKwkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEdFTjhfU0FNUExFUl9QT1dFUl9CWVBBU1NfRElTKSk7CisKKwkvKiBXYURpc2FibGVHdW5pdENsb2NrR2F0aW5nOmNodiAocHJlLXByb2R1Y3Rpb24gaHcpICovCisJSTkxNV9XUklURShWTFZfR1VOSVRfQ0xPQ0tfR0FURSwgSTkxNV9SRUFEKFZMVl9HVU5JVF9DTE9DS19HQVRFKSB8CisJCSAgIEdJTlRfRElTKTsKKworCS8qIFdhRGlzYWJsZUZmRG9wQ2xvY2tHYXRpbmc6Y2h2IChwcmUtcHJvZHVjdGlvbiBodykgKi8KKwlJOTE1X1dSSVRFKEdFTjZfUkNfU0xFRVBfUFNNSV9DT05UUk9MLAorCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0VOOF9GRl9ET1BfQ0xPQ0tfR0FURV9ESVNBQkxFKSk7CisKKwkvKiBXYURpc2FibGVEb3BDbG9ja0dhdGluZzpjaHYgKHByZS1wcm9kdWN0aW9uIGh3KSAqLworCUk5MTVfV1JJVEUoR0VON19ST1dfQ0hJQ0tFTjIsCisJCSAgIF9NQVNLRURfQklUX0VOQUJMRShET1BfQ0xPQ0tfR0FUSU5HX0RJU0FCTEUpKTsKKwlJOTE1X1dSSVRFKEdFTjZfVUNHQ1RMMSwgSTkxNV9SRUFEKEdFTjZfVUNHQ1RMMSkgfAorCQkgICBHRU42X0VVX1RDVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOworfQorCiBzdGF0aWMgdm9pZCBnNHhfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTIxMiw2ICs1NDkxLDkgQEAKIAlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwKIAkJICAgX01BU0tFRF9CSVRfRU5BQkxFKENNMF9QSVBFTElORURfUkVOREVSX0ZMVVNIX0RJU0FCTEUpKTsKIAorCS8qIFdhRGlzYWJsZV9SZW5kZXJDYWNoZV9PcGVyYXRpb25hbEZsdXNoOmc0eCAqLworCUk5MTVfV1JJVEUoQ0FDSEVfTU9ERV8wLCBfTUFTS0VEX0JJVF9ESVNBQkxFKFJDX09QX0ZMVVNIX0VOQUJMRSkpOworCiAJZzR4X2Rpc2FibGVfdHJpY2tsZV9mZWVkKGRldik7CiB9CiAKQEAgLTUyMjYsNiArNTUwOCw5IEBACiAJSTkxNV9XUklURTE2KERFVUMsIDApOwogCUk5MTVfV1JJVEUoTUlfQVJCX1NUQVRFLAogCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoTUlfQVJCX0RJU1BMQVlfVFJJQ0tMRV9GRUVEX0RJU0FCTEUpKTsKKworCS8qIFdhRGlzYWJsZV9SZW5kZXJDYWNoZV9PcGVyYXRpb25hbEZsdXNoOmdlbjQgKi8KKwlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwgX01BU0tFRF9CSVRfRElTQUJMRShSQ19PUF9GTFVTSF9FTkFCTEUpKTsKIH0KIAogc3RhdGljIHZvaWQgYnJvYWR3YXRlcl9pbml0X2Nsb2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtNTI0MCw2ICs1NTI1LDkgQEAKIAlJOTE1X1dSSVRFKFJFTkNMS19HQVRFX0QyLCAwKTsKIAlJOTE1X1dSSVRFKE1JX0FSQl9TVEFURSwKIAkJICAgX01BU0tFRF9CSVRfRU5BQkxFKE1JX0FSQl9ESVNQTEFZX1RSSUNLTEVfRkVFRF9ESVNBQkxFKSk7CisKKwkvKiBXYURpc2FibGVfUmVuZGVyQ2FjaGVfT3BlcmF0aW9uYWxGbHVzaDpnZW40ICovCisJSTkxNV9XUklURShDQUNIRV9NT0RFXzAsIF9NQVNLRURfQklUX0RJU0FCTEUoUkNfT1BfRkxVU0hfRU5BQkxFKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbjNfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTUyNTYsNiArNTU0NCwxMiBAQAogCiAJLyogSUlSICJmbGlwIHBlbmRpbmciIG1lYW5zIGRvbmUgaWYgdGhpcyBiaXQgaXMgc2V0ICovCiAJSTkxNV9XUklURShFQ09TS1BELCBfTUFTS0VEX0JJVF9ESVNBQkxFKEVDT19GTElQX0RPTkUpKTsKKworCS8qIGludGVycnVwdHMgc2hvdWxkIGNhdXNlIGEgd2FrZSB1cCBmcm9tIEMzICovCisJSTkxNV9XUklURShJTlNUUE0sIF9NQVNLRURfQklUX0VOQUJMRShJTlNUUE1fQUdQQlVTWV9JTlRfRU4pKTsKKworCS8qIE9uIEdFTjMgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBBUkIgQzMgTFAgYml0IGlzIHNldCAqLworCUk5MTVfV1JJVEUoTUlfQVJCX1NUQVRFLCBfTUFTS0VEX0JJVF9FTkFCTEUoTUlfQVJCX0MzX0xQX1dSSVRFX0VOQUJMRSkpOwogfQogCiBzdGF0aWMgdm9pZCBpODV4X2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC01MjYzLDYgKzU1NTcsMTAgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJSTkxNV9XUklURShSRU5DTEtfR0FURV9EMSwgU1ZfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKworCS8qIGludGVycnVwdHMgc2hvdWxkIGNhdXNlIGEgd2FrZSB1cCBmcm9tIEMzICovCisJSTkxNV9XUklURShNSV9TVEFURSwgX01BU0tFRF9CSVRfRU5BQkxFKE1JX0FHUEJVU1lfSU5UX0VOKSB8CisJCSAgIF9NQVNLRURfQklUX0RJU0FCTEUoTUlfQUdQQlVTWV84MzBfTU9ERSkpOwogfQogCiBzdGF0aWMgdm9pZCBpODMwX2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC01MzE0LDEwICs1NjEyLDI1IEBACiAJCQkJICAgIGVudW0gaW50ZWxfZGlzcGxheV9wb3dlcl9kb21haW4gZG9tYWluKQogewogCXN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgKnBvd2VyX2RvbWFpbnM7CisJc3RydWN0IGk5MTVfcG93ZXJfd2VsbCAqcG93ZXJfd2VsbDsKKwlib29sIGlzX2VuYWJsZWQ7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPnBtLnN1c3BlbmRlZCkKKwkJcmV0dXJuIGZhbHNlOwogCiAJcG93ZXJfZG9tYWlucyA9ICZkZXZfcHJpdi0+cG93ZXJfZG9tYWluczsKKwlpc19lbmFibGVkID0gdHJ1ZTsKKwlmb3JfZWFjaF9wb3dlcl93ZWxsX3JldihpLCBwb3dlcl93ZWxsLCBCSVQoZG9tYWluKSwgcG93ZXJfZG9tYWlucykgeworCQlpZiAocG93ZXJfd2VsbC0+YWx3YXlzX29uKQorCQkJY29udGludWU7CiAKLQlyZXR1cm4gcG93ZXJfZG9tYWlucy0+ZG9tYWluX3VzZV9jb3VudFtkb21haW5dOworCQlpZiAoIXBvd2VyX3dlbGwtPmNvdW50KSB7CisJCQlpc19lbmFibGVkID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaXNfZW5hYmxlZDsKIH0KIAogYm9vbCBpbnRlbF9kaXNwbGF5X3Bvd2VyX2VuYWJsZWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LApAQCAtNTM5MiwzMyArNTcwNSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByZXNldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIHBpcGUgcGlwZSkKLXsKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+dmJsX2xvY2spOwotCi0JZGV2LT52YmxhbmtbcGlwZV0ubGFzdCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzd19wb3dlcl93ZWxsX3Bvc3RfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0JZW51bSBwaXBlIHBpcGU7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQotCS8qCi0JICogQWZ0ZXIgdGhpcywgdGhlIHJlZ2lzdGVycyBvbiB0aGUgcGlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgcG93ZXIKLQkgKiB3ZWxsIHdpbGwgYmVjb21lIHplcm8sIHNvIHdlIGhhdmUgdG8gYWRqdXN0IG91ciBjb3VudGVycyBhY2NvcmRpbmcgdG8KLQkgKiB0aGF0LgotCSAqCi0JICogRklYTUU6IFNob3VsZCB3ZSBkbyB0aGlzIGluIGdlbmVyYWwgaW4gZHJtX3ZibGFua19wb3N0X21vZGVzZXQ/Ci0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKLQlmb3JfZWFjaF9waXBlKHBpcGUpCi0JCWlmIChwaXBlICE9IFBJUEVfQSkKLQkJCXJlc2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBoc3dfc2V0X3Bvd2VyX3dlbGwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgICAgIHN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGwsIGJvb2wgZW5hYmxlKQogewpAQCAtNTQ0Nyw4ICs1NzMzLDYgQEAKIAkJCUk5MTVfV1JJVEUoSFNXX1BXUl9XRUxMX0RSSVZFUiwgMCk7CiAJCQlQT1NUSU5HX1JFQUQoSFNXX1BXUl9XRUxMX0RSSVZFUik7CiAJCQlEUk1fREVCVUdfS01TKCJSZXF1ZXN0aW5nIHRvIGRpc2FibGUgdGhlIHBvd2VyIHdlbGxcbiIpOwotCi0JCQloc3dfcG93ZXJfd2VsbF9wb3N0X2Rpc2FibGUoZGV2X3ByaXYpOwogCQl9CiAJfQogfQpAQCAtNTQ4OSwxMyArNTc3MywzNCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCB2bHZfc2V0X3Bvd2VyX3dlbGwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgIHN0cnVjdCBpOTE1X3Bvd2VyX3dlbGwgKnBvd2VyX3dlbGwsIGJvb2wgZW5hYmxlKQordm9pZCBfX3Zsdl9zZXRfcG93ZXJfd2VsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgIGVudW0gcHVuaXRfcG93ZXJfd2VsbCBwb3dlcl93ZWxsX2lkLCBib29sIGVuYWJsZSkKIHsKLQllbnVtIHB1bml0X3Bvd2VyX3dlbGwgcG93ZXJfd2VsbF9pZCA9IHBvd2VyX3dlbGwtPmRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJdTMyIG1hc2s7CiAJdTMyIHN0YXRlOwogCXUzMiBjdHJsOworCWVudW0gcGlwZSBwaXBlOworCisJaWYgKHBvd2VyX3dlbGxfaWQgPT0gUFVOSVRfUE9XRVJfV0VMTF9EUElPX0NNTl9CQykgeworCQlpZiAoZW5hYmxlKSB7CisJCQkvKgorCQkJICogRW5hYmxlIHRoZSBDUkkgY2xvY2sgc291cmNlIHNvIHdlIGNhbiBnZXQgYXQgdGhlCisJCQkgKiBkaXNwbGF5IGFuZCB0aGUgcmVmZXJlbmNlIGNsb2NrIGZvciBWR0EKKwkJCSAqIGhvdHBsdWcgLyBtYW51YWwgZGV0ZWN0aW9uLgorCQkJICovCisJCQlJOTE1X1dSSVRFKERQTEwoUElQRV9CKSwgSTkxNV9SRUFEKERQTEwoUElQRV9CKSkgfAorCQkJCSAgIERQTExfUkVGQV9DTEtfRU5BQkxFX1ZMViB8CisJCQkJICAgRFBMTF9JTlRFR1JBVEVEX0NSSV9DTEtfVkxWKTsKKwkJCXVkZWxheSgxKTsgLyogPjEwbnMgZm9yIGNtbnJlc2V0LCA+MG5zIGZvciBzaWRlcmVzZXQgKi8KKwkJfSBlbHNlIHsKKwkJCWZvcl9lYWNoX3BpcGUocGlwZSkKKwkJCQlhc3NlcnRfcGxsX2Rpc2FibGVkKGRldl9wcml2LCBwaXBlKTsKKwkJCS8qIEFzc2VydCBjb21tb24gcmVzZXQgKi8KKwkJCUk5MTVfV1JJVEUoRFBJT19DVEwsIEk5MTVfUkVBRChEUElPX0NUTCkgJgorCQkJCSAgIH5EUElPX0NNTlJTVCk7CisJCX0KKwl9CiAKIAltYXNrID0gUFVOSVRfUFdSR1RfTUFTSyhwb3dlcl93ZWxsX2lkKTsKIAlzdGF0ZSA9IGVuYWJsZSA/IFBVTklUX1BXUkdUX1BXUl9PTihwb3dlcl93ZWxsX2lkKSA6CkBAIC01NTIzLDYgKzU4MjgsMjggQEAKIAogb3V0OgogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCS8qCisJICogRnJvbSBWTFYyQTBfRFBfZURQX0RQSU9fZHJpdmVyX3ZiaW9zX25vdGVzXzEwLmRvY3ggLQorCSAqICA2LglEZS1hc3NlcnQgY21uX3Jlc2V0L3NpZGVfcmVzZXQuIFNhbWUgYXMgVkxWIFgwLgorCSAqICAgYS4JR1VuaXQgMHgyMTEwIGJpdFswXSBzZXQgdG8gMSAoZGVmIDApCisJICogICBiLglUaGUgb3RoZXIgYml0cyBzdWNoIGFzIHNmciBzZXR0aW5ncyAvIG1vZGVzZWwgbWF5IGFsbAorCSAqCWJlIHNldCB0byAwLgorCSAqCisJICogVGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9uIGluaXQgYW5kIHJlc3VtZSBmcm9tIFMzIHdpdGgKKwkgKiBib3RoIFBMTHMgZGlzYWJsZWQsIG9yIHdlIHJpc2sgbG9zaW5nIERQSU8gYW5kIFBMTAorCSAqIHN5bmNocm9uaXphdGlvbi4KKwkgKi8KKwlpZiAocG93ZXJfd2VsbF9pZCA9PSBQVU5JVF9QT1dFUl9XRUxMX0RQSU9fQ01OX0JDICYmIGVuYWJsZSkKKwkJSTkxNV9XUklURShEUElPX0NUTCwgSTkxNV9SRUFEKERQSU9fQ1RMKSB8IERQSU9fQ01OUlNUKTsKK30KKworc3RhdGljIHZvaWQgdmx2X3NldF9wb3dlcl93ZWxsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgaTkxNV9wb3dlcl93ZWxsICpwb3dlcl93ZWxsLCBib29sIGVuYWJsZSkKK3sKKwllbnVtIHB1bml0X3Bvd2VyX3dlbGwgcG93ZXJfd2VsbF9pZCA9IHBvd2VyX3dlbGwtPmRhdGE7CisKKwlfX3Zsdl9zZXRfcG93ZXJfd2VsbChkZXZfcHJpdiwgcG93ZXJfd2VsbF9pZCwgZW5hYmxlKTsKIH0KIAogc3RhdGljIHZvaWQgdmx2X3Bvd2VyX3dlbGxfc3luY19odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC01NTkxLDExICs1OTE4LDEzIEBACiAJc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCiAJLyoKLQkgKiBEdXJpbmcgZHJpdmVyIGluaXRpYWxpemF0aW9uIHdlIG5lZWQgdG8gZGVmZXIgZW5hYmxpbmcgaG90cGx1ZwotCSAqIHByb2Nlc3NpbmcgdW50aWwgZmJkZXYgaXMgc2V0IHVwLgorCSAqIER1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24vcmVzdW1lIHdlIGNhbiBhdm9pZCByZXN0b3JpbmcgdGhlCisJICogcGFydCBvZiB0aGUgSFcvU1cgc3RhdGUgdGhhdCB3aWxsIGJlIGluaXRlZCBhbnl3YXkgZXhwbGljaXRseS4KIAkgKi8KLQlpZiAoZGV2X3ByaXYtPmVuYWJsZV9ob3RwbHVnX3Byb2Nlc3NpbmcpCi0JCWludGVsX2hwZF9pbml0KGRldl9wcml2LT5kZXYpOworCWlmIChkZXZfcHJpdi0+cG93ZXJfZG9tYWlucy5pbml0aWFsaXppbmcpCisJCXJldHVybjsKKworCWludGVsX2hwZF9pbml0KGRldl9wcml2LT5kZXYpOwogCiAJaTkxNV9yZWRpc2FibGVfdmdhX3Bvd2VyX29uKGRldl9wcml2LT5kZXYpOwogfQpAQCAtNTYwMywyMyArNTkzMiwxMiBAQAogc3RhdGljIHZvaWQgdmx2X2Rpc3BsYXlfcG93ZXJfd2VsbF9kaXNhYmxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkJICAgc3RydWN0IGk5MTVfcG93ZXJfd2VsbCAqcG93ZXJfd2VsbCkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQllbnVtIHBpcGUgcGlwZTsKLQogCVdBUk5fT05fT05DRShwb3dlcl93ZWxsLT5kYXRhICE9IFBVTklUX1BPV0VSX1dFTExfRElTUDJEKTsKIAogCXNwaW5fbG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7Ci0JZm9yX2VhY2hfcGlwZShwaXBlKQotCQlfX2ludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2LCBwaXBlLCBmYWxzZSk7Ci0KIAl2YWxsZXl2aWV3X2Rpc2FibGVfZGlzcGxheV9pcnFzKGRldl9wcml2KTsKIAlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlzcGluX2xvY2tfaXJxKCZkZXYtPnZibF9sb2NrKTsKLQlmb3JfZWFjaF9waXBlKHBpcGUpCi0JCXJlc2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnZibF9sb2NrKTsKLQogCXZsdl9zZXRfcG93ZXJfd2VsbChkZXZfcHJpdiwgcG93ZXJfd2VsbCwgZmFsc2UpOwogfQogCkBAIC01ODY3LDEyICs2MTg1LDYgQEAKIAkJLm9wcyA9ICZ2bHZfZGlzcGxheV9wb3dlcl93ZWxsX29wcywKIAl9LAogCXsKLQkJLm5hbWUgPSAiZHBpby1jb21tb24iLAotCQkuZG9tYWlucyA9IFZMVl9EUElPX0NNTl9CQ19QT1dFUl9ET01BSU5TLAotCQkuZGF0YSA9IFBVTklUX1BPV0VSX1dFTExfRFBJT19DTU5fQkMsCi0JCS5vcHMgPSAmdmx2X2RwaW9fcG93ZXJfd2VsbF9vcHMsCi0JfSwKLQl7CiAJCS5uYW1lID0gImRwaW8tdHgtYi0wMSIsCiAJCS5kb21haW5zID0gVkxWX0RQSU9fVFhfQl9MQU5FU18wMV9QT1dFUl9ET01BSU5TIHwKIAkJCSAgIFZMVl9EUElPX1RYX0JfTEFORVNfMjNfUE9XRVJfRE9NQUlOUyB8CkBAIC01OTA4LDYgKzYyMjAsMTIgQEAKIAkJLm9wcyA9ICZ2bHZfZHBpb19wb3dlcl93ZWxsX29wcywKIAkJLmRhdGEgPSBQVU5JVF9QT1dFUl9XRUxMX0RQSU9fVFhfQ19MQU5FU18yMywKIAl9LAorCXsKKwkJLm5hbWUgPSAiZHBpby1jb21tb24iLAorCQkuZG9tYWlucyA9IFZMVl9EUElPX0NNTl9CQ19QT1dFUl9ET01BSU5TLAorCQkuZGF0YSA9IFBVTklUX1BPV0VSX1dFTExfRFBJT19DTU5fQkMsCisJCS5vcHMgPSAmdmx2X2RwaW9fcG93ZXJfd2VsbF9vcHMsCisJfSwKIH07CiAKICNkZWZpbmUgc2V0X3Bvd2VyX3dlbGxzKHBvd2VyX2RvbWFpbnMsIF9fcG93ZXJfd2VsbHMpICh7CQlcCkBAIC01OTU5LDkgKzYyNzcsMTMgQEAKIAogdm9pZCBpbnRlbF9wb3dlcl9kb21haW5zX2luaXRfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXN0cnVjdCBpOTE1X3Bvd2VyX2RvbWFpbnMgKnBvd2VyX2RvbWFpbnMgPSAmZGV2X3ByaXYtPnBvd2VyX2RvbWFpbnM7CisKKwlwb3dlcl9kb21haW5zLT5pbml0aWFsaXppbmcgPSB0cnVlOwogCS8qIEZvciBub3csIHdlIG5lZWQgdGhlIHBvd2VyIHdlbGwgdG8gYmUgYWx3YXlzIGVuYWJsZWQuICovCiAJaW50ZWxfZGlzcGxheV9zZXRfaW5pdF9wb3dlcihkZXZfcHJpdiwgdHJ1ZSk7CiAJaW50ZWxfcG93ZXJfZG9tYWluc19yZXN1bWUoZGV2X3ByaXYpOworCXBvd2VyX2RvbWFpbnMtPmluaXRpYWxpemluZyA9IGZhbHNlOwogfQogCiB2b2lkIGludGVsX2F1eF9kaXNwbGF5X3J1bnRpbWVfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKQEAgLTU5ODYsNiArNjMwOCwxOCBAQAogCVdBUk4oZGV2X3ByaXYtPnBtLnN1c3BlbmRlZCwgIkRldmljZSBzdGlsbCBzdXNwZW5kZWQuXG4iKTsKIH0KIAordm9pZCBpbnRlbF9ydW50aW1lX3BtX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OworCisJaWYgKCFIQVNfUlVOVElNRV9QTShkZXYpKQorCQlyZXR1cm47CisKKwlXQVJOKGRldl9wcml2LT5wbS5zdXNwZW5kZWQsICJHZXR0aW5nIG5vc3luYy1yZWYgd2hpbGUgc3VzcGVuZGVkLlxuIik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2aWNlKTsKK30KKwogdm9pZCBpbnRlbF9ydW50aW1lX3BtX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CkBAIC02MDA4LDYgKzYzNDIsMTUgQEAKIAogCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXZpY2UpOwogCisJLyoKKwkgKiBSUE0gZGVwZW5kcyBvbiBSQzYgdG8gc2F2ZSByZXN0b3JlIHRoZSBHVCBIVyBjb250ZXh0LCBzbyBtYWtlIFJDNiBhCisJICogcmVxdWlyZW1lbnQuCisJICovCisJaWYgKCFpbnRlbF9lbmFibGVfcmM2KGRldikpIHsKKwkJRFJNX0lORk8oIlJDNiBkaXNhYmxlZCwgZGlzYWJsaW5nIHJ1bnRpbWUgUE0gc3VwcG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKIAlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXZpY2UsIDEwMDAwKTsgLyogMTBzICovCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXZpY2UpOwogCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldmljZSk7CkBAIC02MDIzLDYgKzYzNjYsOSBAQAogCWlmICghSEFTX1JVTlRJTUVfUE0oZGV2KSkKIAkJcmV0dXJuOwogCisJaWYgKCFpbnRlbF9lbmFibGVfcmM2KGRldikpCisJCXJldHVybjsKKwogCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3Qgc3VzcGVuZGVkIGZpcnN0LiAqLwogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2aWNlKTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoZGV2aWNlKTsKQEAgLTYwODcsNiArNjQzMywxMCBAQAogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBoYXN3ZWxsX2luaXRfY2xvY2tfZ2F0aW5nOwogCQllbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA4KQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnZW44X2luaXRfY2xvY2tfZ2F0aW5nOworCX0gZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhkZXYpKSB7CisJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IHZhbGxleXZpZXdfdXBkYXRlX3dtOworCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9CisJCQljaGVycnl2aWV3X2luaXRfY2xvY2tfZ2F0aW5nOwogCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7CiAJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IHZhbGxleXZpZXdfdXBkYXRlX3dtOwogCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZW5kZXJzdGF0ZS5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU3ODNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGUuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfSU5URUxfUkVOREVSU1RBVEVfSAorI2RlZmluZSBfSU5URUxfUkVOREVSU1RBVEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGludGVsX3JlbmRlcnN0YXRlX3JvZGF0YSB7CisJY29uc3QgdTMyICpyZWxvYzsKKwljb25zdCB1MzIgcmVsb2NfaXRlbXM7CisJY29uc3QgdTMyICpiYXRjaDsKKwljb25zdCB1MzIgYmF0Y2hfaXRlbXM7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcnN0YXRlX3JvZGF0YSBnZW42X251bGxfc3RhdGU7CitleHRlcm4gY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcnN0YXRlX3JvZGF0YSBnZW43X251bGxfc3RhdGU7CitleHRlcm4gY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcnN0YXRlX3JvZGF0YSBnZW44X251bGxfc3RhdGU7CisKKyNkZWZpbmUgUk9fUkVOREVSU1RBVEUoX2cpCQkJCQkJXAorCWNvbnN0IHN0cnVjdCBpbnRlbF9yZW5kZXJzdGF0ZV9yb2RhdGEgZ2VuICMjIF9nICMjIF9udWxsX3N0YXRlID0geyBcCisJCS5yZWxvYyA9IGdlbiAjIyBfZyAjIyBfbnVsbF9zdGF0ZV9yZWxvY3MsCQlcCisJCS5yZWxvY19pdGVtcyA9IHNpemVvZihnZW4gIyMgX2cgIyMgX251bGxfc3RhdGVfcmVsb2NzKS80LCBcCisJCS5iYXRjaCA9IGdlbiAjIyBfZyAjIyBfbnVsbF9zdGF0ZV9iYXRjaCwJCVwKKwkJLmJhdGNoX2l0ZW1zID0gc2l6ZW9mKGdlbiAjIyBfZyAjIyBfbnVsbF9zdGF0ZV9iYXRjaCkvNCwgXAorCX0KKworI2VuZGlmIC8qIElOVEVMX1JFTkRFUlNUQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlbmRlcnN0YXRlX2dlbjYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlbmRlcnN0YXRlX2dlbjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1MzhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGVfZ2VuNi5jCkBAIC0wLDAgKzEsMjg5IEBACisjaW5jbHVkZSAiaW50ZWxfcmVuZGVyc3RhdGUuaCIKKworc3RhdGljIGNvbnN0IHUzMiBnZW42X251bGxfc3RhdGVfcmVsb2NzW10gPSB7CisJMHgwMDAwMDAyMCwKKwkweDAwMDAwMDI0LAorCTB4MDAwMDAwMmMsCisJMHgwMDAwMDFlMCwKKwkweDAwMDAwMWU0LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBnZW42X251bGxfc3RhdGVfYmF0Y2hbXSA9IHsKKwkweDY5MDQwMDAwLAorCTB4NzkwZDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxODAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDYxMDEwMDA4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwJIC8qIHJlbG9jICovCisJMHgwMDAwMDAwMSwJIC8qIHJlbG9jICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLAkgLyogcmVsb2MgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLAorCTB4NjEwMjAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MDUwMDAxLAorCTB4MDAwMDAwMTgsCisJMHgwMDAwMDAwMCwKKwkweDc4MGQxMDAyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwNDIwLAorCTB4NzgxNTAwMDMsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTAwMDA0LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTYwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODExMDAwNSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTIwMDAyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxNzAwMDMsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc5MDUwMDA1LAorCTB4ZTAwNDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzkxMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc5MDAwMDAyLAorCTB4ZmZmZmZmZmYsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgwZTAwMDIsCisJMHgwMDAwMDQ0MSwKKwkweDAwMDAwNDAxLAorCTB4MDAwMDA0MDEsCisJMHg3ODAyMTAwMiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDQwMCwKKwkweDc4MTMwMDEyLAorCTB4MDA0MDA4MTAsCisJMHgwMDAwMDAwMCwKKwkweDIwMDAwMDAwLAorCTB4MDQwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODE0MDAwNywKKwkweDAwMDAwMjgwLAorCTB4MDgwODAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDYwMDAwLAorCTB4NGUwODAwMDIsCisJMHgwMDEwMDQwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODA5MDAwNSwKKwkweDAyMDAwMDAwLAorCTB4MjIyMjAwMDAsCisJMHgwMmY2MDAwMCwKKwkweDExMzMwMDAwLAorCTB4MDI4NTAwMDQsCisJMHgxMTIyMDAwMCwKKwkweDc4MDExMDAyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMjAwLAorCTB4NzgwODAwMDMsCisJMHgwMDAwMjAwMCwKKwkweDAwMDAwNDQ4LAkgLyogcmVsb2MgKi8KKwkweDAwMDAwNDQ4LAkgLyogcmVsb2MgKi8KKwkweDAwMDAwMDAwLAorCTB4MDUwMDAwMDAsCSAvKiBjbWRzIGVuZCAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDIyMCwJIC8qIHN0YXRlIHN0YXJ0ICovCisJMHgwMDAwMDI0MCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwNjAwMDVhLAorCTB4MjA0MDc3YmUsCisJMHgwMDAwMDBjMCwKKwkweDAwOGQwMDQwLAorCTB4MDA2MDAwNWEsCisJMHgyMDYwNzdiZSwKKwkweDAwMDAwMGMwLAorCTB4MDA4ZDAwODAsCisJMHgwMDYwMDA1YSwKKwkweDIwODA3N2JlLAorCTB4MDAwMDAwZDAsCisJMHgwMDhkMDA0MCwKKwkweDAwNjAwMDVhLAorCTB4MjBhMDc3YmUsCisJMHgwMDAwMDBkMCwKKwkweDAwOGQwMDgwLAorCTB4MDAwMDAyMDEsCisJMHgyMDA4MDA2MSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDYwMDAwMSwKKwkweDIwMjAwMDIyLAorCTB4MDA4ZDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAyODAwMDMxLAorCTB4MjFjMDFjYzksCisJMHgwMDAwMDAyMCwKKwkweDBhOGEwMDAxLAorCTB4MDA2MDAwMDEsCisJMHgyMDQwMDNiZSwKKwkweDAwOGQwMWMwLAorCTB4MDAwMDAwMDAsCisJMHgwMDYwMDAwMSwKKwkweDIwNjAwM2JlLAorCTB4MDA4ZDAxZTAsCisJMHgwMDAwMDAwMCwKKwkweDAwNjAwMDAxLAorCTB4MjA4MDAzYmUsCisJMHgwMDhkMDIwMCwKKwkweDAwMDAwMDAwLAorCTB4MDA2MDAwMDEsCisJMHgyMGEwMDNiZSwKKwkweDAwOGQwMjIwLAorCTB4MDAwMDAwMDAsCisJMHgwMDYwMDAwMSwKKwkweDIwYzAwM2JlLAorCTB4MDA4ZDAyNDAsCisJMHgwMDAwMDAwMCwKKwkweDAwNjAwMDAxLAorCTB4MjBlMDAzYmUsCisJMHgwMDhkMDI2MCwKKwkweDAwMDAwMDAwLAorCTB4MDA2MDAwMDEsCisJMHgyMTAwMDNiZSwKKwkweDAwOGQwMjgwLAorCTB4MDAwMDAwMDAsCisJMHgwMDYwMDAwMSwKKwkweDIxMjAwM2JlLAorCTB4MDA4ZDAyYTAsCisJMHgwMDAwMDAwMCwKKwkweDA1ODAwMDMxLAorCTB4MjQwMDFjYzgsCisJMHgwMDAwMDA0MCwKKwkweDkwMDE5MDAwLAorCTB4MDAwMDAwN2UsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA3ZSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDdlLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwN2UsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA3ZSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDdlLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwN2UsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA3ZSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDMwMDAwMDAwLAorCTB4MDAwMDAxMjQsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHhmOTlhMTMwYywKKwkweDc5OWExMzBjLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4ODAwMDAwMzEsCisJMHgwMDAwMDAwMywKKwkweDAwMDAwMDAwLAkgLyogc3RhdGUgZW5kICovCit9OworCitST19SRU5ERVJTVEFURSg2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlbmRlcnN0YXRlX2dlbjcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JlbmRlcnN0YXRlX2dlbjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmE3ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGVfZ2VuNy5jCkBAIC0wLDAgKzEsMjUzIEBACisjaW5jbHVkZSAiaW50ZWxfcmVuZGVyc3RhdGUuaCIKKworc3RhdGljIGNvbnN0IHUzMiBnZW43X251bGxfc3RhdGVfcmVsb2NzW10gPSB7CisJMHgwMDAwMDAwYywKKwkweDAwMDAwMDEwLAorCTB4MDAwMDAwMTgsCisJMHgwMDAwMDFlYywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgZ2VuN19udWxsX3N0YXRlX2JhdGNoW10gPSB7CisJMHg2OTA0MDAwMCwKKwkweDYxMDEwMDA4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwJIC8qIHJlbG9jICovCisJMHgwMDAwMDAwMSwJIC8qIHJlbG9jICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLAkgLyogcmVsb2MgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLAorCTB4NzkwZDAwMDIsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODE4MDAwMCwKKwkweDAwMDAwMDAxLAorCTB4NzkxNjAwMDAsCisJMHgwMDAwMDAwOCwKKwkweDc4MzAwMDAwLAorCTB4MDIwMTAwNDAsCisJMHg3ODMxMDAwMCwKKwkweDA0MDAwMDAwLAorCTB4NzgzMjAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDc4MzMwMDAwLAorCTB4MDIwMDAwMDAsCisJMHg3ODEwMDAwNCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODFiMDAwNSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWMwMDAyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxZDAwMDQsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxMTAwMDUsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODEyMDAwMiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MjEwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODEzMDAwNSwKKwkweDAwMDAwMDAwLAorCTB4MjAwMDAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTQwMDAxLAorCTB4MjAwMDA4MDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWUwMDAxLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MDUwMDA1LAorCTB4ZTAwNDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgwNDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgyNDAwMDAsCisJMHgwMDAwMDI0MCwKKwkweDc4MjMwMDAwLAorCTB4MDAwMDAyNjAsCisJMHg3ODJmMDAwMCwKKwkweDAwMDAwMjgwLAorCTB4NzgxZjAwMGMsCisJMHgwMDQwMDgxMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MjAwMDA2LAorCTB4MDAwMDAyYzAsCisJMHgwODA4MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MjgwMDA0MDIsCisJMHgwMDA2MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODA5MDAwNSwKKwkweDAyMDAwMDAwLAorCTB4MjIyMjAwMDAsCisJMHgwMmY2MDAwMCwKKwkweDExMjMwMDAwLAorCTB4MDJmNjAwMDQsCisJMHgxMTIzMDAwMCwKKwkweDc4MDgwMDAzLAorCTB4MDAwMDYwMDgsCisJMHgwMDAwMDM0MCwJIC8qIHJlbG9jICovCisJMHhmZmZmZmZmZiwKKwkweDAwMDAwMDAwLAorCTB4NzgyYTAwMDAsCisJMHgwMDAwMDM2MCwKKwkweDc5MDAwMDAyLAorCTB4ZmZmZmZmZmYsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4N2IwMDAwMDUsCisJMHgwMDAwMDAwZiwKKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwNTAwMDAwMCwJIC8qIGNtZHMgZW5kICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDMxLAkgLyogc3RhdGUgc3RhcnQgKi8KKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4Zjk5YTEzMGMsCisJMHg3OTlhMTMwYywKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwNDkyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDA4MDAwNWEsCisJMHgyZTIwNzdiZCwKKwkweDAwMDAwMGMwLAorCTB4MDA4ZDAwNDAsCisJMHgwMDgwMDA1YSwKKwkweDJlNjA3N2JkLAorCTB4MDAwMDAwZDAsCisJMHgwMDhkMDA0MCwKKwkweDAyODAwMDMxLAorCTB4MjE4MDFmYTksCisJMHgwMDhkMGUyMCwKKwkweDA4ODQwMDAxLAorCTB4MDA4MDAwMDEsCisJMHgyZTIwMDNiZCwKKwkweDAwOGQwMTgwLAorCTB4MDAwMDAwMDAsCisJMHgwMDgwMDAwMSwKKwkweDJlNjAwM2JkLAorCTB4MDA4ZDAxYzAsCisJMHgwMDAwMDAwMCwKKwkweDAwODAwMDAxLAorCTB4MmVhMDAzYmQsCisJMHgwMDhkMDIwMCwKKwkweDAwMDAwMDAwLAorCTB4MDA4MDAwMDEsCisJMHgyZWUwMDNiZCwKKwkweDAwOGQwMjQwLAorCTB4MDAwMDAwMDAsCisJMHgwNTgwMDAzMSwKKwkweDIwMDAxZmE4LAorCTB4MDA4ZDBlMjAsCisJMHg5MDAzMTAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDM4MCwKKwkweDAwMDAwM2EwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCSAvKiBzdGF0ZSBlbmQgKi8KK307CisKK1JPX1JFTkRFUlNUQVRFKDcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGVfZ2VuOC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVuZGVyc3RhdGVfZ2VuOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODc1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZW5kZXJzdGF0ZV9nZW44LmMKQEAgLTAsMCArMSw0NzkgQEAKKyNpbmNsdWRlICJpbnRlbF9yZW5kZXJzdGF0ZS5oIgorCitzdGF0aWMgY29uc3QgdTMyIGdlbjhfbnVsbF9zdGF0ZV9yZWxvY3NbXSA9IHsKKwkweDAwMDAwMDQ4LAorCTB4MDAwMDAwNTAsCisJMHgwMDAwMDA2MCwKKwkweDAwMDAwM2VjLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBnZW44X251bGxfc3RhdGVfYmF0Y2hbXSA9IHsKKwkweDY5MDQwMDAwLAorCTB4NjEwMjAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzkxMjAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc5MTMwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3OTE0MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzkxNTAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc5MTYwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg2MTAxMDAwZSwKKwkweDAwMDAwMDAxLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAxLAkgLyogcmVsb2MgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCSAvKiByZWxvYyAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCSAvKiByZWxvYyAqLworCTB4MDAwMDAwMDAsCisJMHhmZmZmZjAwMSwKKwkweDAwMDAxMDAxLAorCTB4ZmZmZmYwMDEsCisJMHgwMDAwMTAwMSwKKwkweDc4MjMwMDAwLAorCTB4MDAwMDA2ZTAsCisJMHg3ODIxMDAwMCwKKwkweDAwMDAwNzAwLAorCTB4NzgzMDAwMDAsCisJMHgwODAxMDA0MCwKKwkweDc4MzMwMDAwLAorCTB4MDgwMDAwMDAsCisJMHg3ODMxMDAwMCwKKwkweDA4MDAwMDAwLAorCTB4NzgzMjAwMDAsCisJMHgwODAwMDAwMCwKKwkweDc4MjQwMDAwLAorCTB4MDAwMDA2NDEsCisJMHg3ODBlMDAwMCwKKwkweDAwMDAwNjAxLAorCTB4NzgwZDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTgwMDAwLAorCTB4MDAwMDAwMDEsCisJMHg3ODUyMDAwMywKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxOTAwMDksCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWIwMDA3LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MjcwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODJjMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxYzAwMDIsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODE2MDAwOSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxMTAwMDgsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODI5MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgyZTAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWEwMDA5LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODFkMDAwNywKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODI4MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgyZDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MjYwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODJiMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgxNTAwMDksCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MTAwMDA3LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWUwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODEyMDAwMiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MWYwMDAyLAorCTB4MzA0MDA4MjAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4Nzg1MTAwMDksCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4NTAwMDAzLAorCTB4MDAyMTAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODEzMDAwMiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MmEwMDAwLAorCTB4MDAwMDA0ODAsCisJMHg3ODJmMDAwMCwKKwkweDAwMDAwNTQwLAorCTB4NzgxNDAwMDAsCisJMHgwMDAwMDgwMCwKKwkweDc4MTcwMDA5LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODIwMDAwYSwKKwkweDAwMDAwNTgwLAorCTB4MDAwMDAwMDAsCisJMHgwODA4MDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgxZjAwMDAwMiwKKwkweDAwMDYwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODRkMDAwMCwKKwkweDQwMDAwMDAwLAorCTB4Nzg0ZjAwMDAsCisJMHg4MDAwMDEwMCwKKwkweDc4MGYwMDAwLAorCTB4MDAwMDA3NDAsCisJMHg3ODA1MDAwNiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgwNzAwMDMsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MDYwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg3ODA0MDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCisJMHg3OTAwMDAwMiwKKwkweGZmZmZmZmZmLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDc4MDgwMDAzLAorCTB4MDAwMDYwMDAsCisJMHgwMDAwMDVlMCwJIC8qIHJlbG9jICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4NzgwOTAwMDUsCisJMHgwMjAwMDAwMCwKKwkweDIyMjIwMDAwLAorCTB4MDJmNjAwMDAsCisJMHgxMTIzMDAwMCwKKwkweDAyODUwMDA0LAorCTB4MTEyMzAwMDAsCisJMHg3ODRiMDAwMCwKKwkweDAwMDAwMDBmLAorCTB4Nzg0OTAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4N2IwMDAwMDUsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwNTAwMDAwMCwJIC8qIGNtZHMgZW5kICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDA0YzAsCSAvKiBzdGF0ZSBzdGFydCAqLworCTB4MDAwMDA1MDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDkyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDA2MDAwNWEsCisJMHgyMTQwM2FlOCwKKwkweDNhMDAwMGMwLAorCTB4MDA4ZDAwNDAsCisJMHgwMDYwMDA1YSwKKwkweDIxNjAzYWU4LAorCTB4M2EwMDAwYzAsCisJMHgwMDhkMDA4MCwKKwkweDAwNjAwMDVhLAorCTB4MjE4MDNhZTgsCisJMHgzYTAwMDBkMCwKKwkweDAwOGQwMDQwLAorCTB4MDA2MDAwNWEsCisJMHgyMWEwM2FlOCwKKwkweDNhMDAwMGQwLAorCTB4MDA4ZDAwODAsCisJMHgwMjgwMDAzMSwKKwkweDJlMDAyMmU4LAorCTB4MGUwMDAxNDAsCisJMHgwODg0MDAwMSwKKwkweDA1ODAwMDMxLAorCTB4MjAwMDIyZTAsCisJMHgwZTAwMGUwMCwKKwkweDkwMDMxMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDYyMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDA2MjAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDYyMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDA2MjAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDYyMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDA2MjAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDYyMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDA2MjAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDYyMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDA2MjAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwNjIwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHhmOTlhMTMwYywKKwkweDc5OWExMzBjLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4M2Y4MDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDNmODAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAkgLyogc3RhdGUgZW5kICovCit9OworCitST19SRU5ERVJTVEFURSg4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYwppbmRleCA3OWZiNGNjLi4yNzk0ODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCkBAIC0zMywyNiArMzMsNDQgQEAKICNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJpbmdfc3BhY2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorLyogRWFybHkgZ2VuMiBkZXZpY2VzIGhhdmUgYSBjYWNoZWxpbmUgb2YganVzdCAzMiBieXRlcywgdXNpbmcgNjQgaXMgb3ZlcmtpbGwsCisgKiBidXQga2VlcHMgdGhlIGxvZ2ljIHNpbXBsZS4gSW5kZWVkLCB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGlzIG1hY3JvIGlzIGp1c3QKKyAqIHRvIGdpdmUgc29tZSBpbmNsaW5hdGlvbiBhcyB0byBzb21lIG9mIHRoZSBtYWdpYyB2YWx1ZXMgdXNlZCBpbiB0aGUgdmFyaW91cworICogd29ya2Fyb3VuZHMhCisgKi8KKyNkZWZpbmUgQ0FDSEVMSU5FX0JZVEVTIDY0CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmluZ19zcGFjZShpbnQgaGVhZCwgaW50IHRhaWwsIGludCBzaXplKQogewotCWludCBzcGFjZSA9IChyaW5nLT5oZWFkICYgSEVBRF9BRERSKSAtIChyaW5nLT50YWlsICsgSTkxNV9SSU5HX0ZSRUVfU1BBQ0UpOworCWludCBzcGFjZSA9IGhlYWQgLSAodGFpbCArIEk5MTVfUklOR19GUkVFX1NQQUNFKTsKIAlpZiAoc3BhY2UgPCAwKQotCQlzcGFjZSArPSByaW5nLT5zaXplOworCQlzcGFjZSArPSBzaXplOwogCXJldHVybiBzcGFjZTsKIH0KIAotdm9pZCBfX2ludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW5saW5lIGludCByaW5nX3NwYWNlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCit7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CisJcmV0dXJuIF9fcmluZ19zcGFjZShyaW5nYnVmLT5oZWFkICYgSEVBRF9BRERSLCByaW5nYnVmLT50YWlsLCByaW5nYnVmLT5zaXplKTsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfcmluZ19zdG9wcGVkKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gZGV2X3ByaXYtPmdwdV9lcnJvci5zdG9wX3JpbmdzICYgaW50ZWxfcmluZ19mbGFnKHJpbmcpOworfQogCi0JcmluZy0+dGFpbCAmPSByaW5nLT5zaXplIC0gMTsKLQlpZiAoZGV2X3ByaXYtPmdwdV9lcnJvci5zdG9wX3JpbmdzICYgaW50ZWxfcmluZ19mbGFnKHJpbmcpKQordm9pZCBfX2ludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQoreworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOworCXJpbmdidWYtPnRhaWwgJj0gcmluZ2J1Zi0+c2l6ZSAtIDE7CisJaWYgKGludGVsX3Jpbmdfc3RvcHBlZChyaW5nKSkKIAkJcmV0dXJuOwotCXJpbmctPndyaXRlX3RhaWwocmluZywgcmluZy0+dGFpbCk7CisJcmluZy0+d3JpdGVfdGFpbChyaW5nLCByaW5nYnVmLT50YWlsKTsKIH0KIAogc3RhdGljIGludAotZ2VuMl9yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitnZW4yX3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCSAgICAgICB1MzIJaW52YWxpZGF0ZV9kb21haW5zLAogCQkgICAgICAgdTMyCWZsdXNoX2RvbWFpbnMpCiB7CkBAIC03OCw3ICs5Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdlbjRfcmVuZGVyX3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorZ2VuNF9yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkgICAgICAgdTMyCWludmFsaWRhdGVfZG9tYWlucywKIAkJICAgICAgIHUzMglmbHVzaF9kb21haW5zKQogewpAQCAtMTczLDkgKzE5MSw5IEBACiAgKiByZWFsbHkgb3VyIGJ1c2luZXNzLiAgVGhhdCBsZWF2ZXMgb25seSBzdGFsbCBhdCBzY29yZWJvYXJkLgogICovCiBzdGF0aWMgaW50Ci1pbnRlbF9lbWl0X3Bvc3Rfc3luY19ub256ZXJvX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2ludGVsX2VtaXRfcG9zdF9zeW5jX25vbnplcm9fZmx1c2goc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQl1MzIgc2NyYXRjaF9hZGRyID0gcmluZy0+c2NyYXRjaC5ndHRfb2Zmc2V0ICsgMTI4OworCXUzMiBzY3JhdGNoX2FkZHIgPSByaW5nLT5zY3JhdGNoLmd0dF9vZmZzZXQgKyAyICogQ0FDSEVMSU5FX0JZVEVTOwogCWludCByZXQ7CiAKIApAQCAtMjA4LDExICsyMjYsMTEgQEAKIH0KIAogc3RhdGljIGludAotZ2VuNl9yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitnZW42X3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGludmFsaWRhdGVfZG9tYWlucywgdTMyIGZsdXNoX2RvbWFpbnMpCiB7CiAJdTMyIGZsYWdzID0gMDsKLQl1MzIgc2NyYXRjaF9hZGRyID0gcmluZy0+c2NyYXRjaC5ndHRfb2Zmc2V0ICsgMTI4OworCXUzMiBzY3JhdGNoX2FkZHIgPSByaW5nLT5zY3JhdGNoLmd0dF9vZmZzZXQgKyAyICogQ0FDSEVMSU5FX0JZVEVTOwogCWludCByZXQ7CiAKIAkvKiBGb3JjZSBTTkIgd29ya2Fyb3VuZHMgZm9yIFBJUEVfQ09OVFJPTCBmbHVzaGVzICovCkBAIC0yNjAsNyArMjc4LDcgQEAKIH0KIAogc3RhdGljIGludAotZ2VuN19yZW5kZXJfcmluZ19jc19zdGFsbF93YShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW43X3JlbmRlcl9yaW5nX2NzX3N0YWxsX3dhKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJaW50IHJldDsKIApAQCAtMjc4LDcgKzI5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuN19yaW5nX2ZiY19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiB2YWx1ZSkKK3N0YXRpYyBpbnQgZ2VuN19yaW5nX2ZiY19mbHVzaChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgdmFsdWUpCiB7CiAJaW50IHJldDsKIApAQCAtMzAyLDExICszMjAsMTEgQEAKIH0KIAogc3RhdGljIGludAotZ2VuN19yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitnZW43X3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCSAgICAgICB1MzIgaW52YWxpZGF0ZV9kb21haW5zLCB1MzIgZmx1c2hfZG9tYWlucykKIHsKIAl1MzIgZmxhZ3MgPSAwOwotCXUzMiBzY3JhdGNoX2FkZHIgPSByaW5nLT5zY3JhdGNoLmd0dF9vZmZzZXQgKyAxMjg7CisJdTMyIHNjcmF0Y2hfYWRkciA9IHJpbmctPnNjcmF0Y2guZ3R0X29mZnNldCArIDIgKiBDQUNIRUxJTkVfQllURVM7CiAJaW50IHJldDsKIAogCS8qCkBAIC0zNjMsMTEgKzM4MSwxMSBAQAogfQogCiBzdGF0aWMgaW50Ci1nZW44X3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK2dlbjhfcmVuZGVyX3JpbmdfZmx1c2goc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJICAgICAgIHUzMiBpbnZhbGlkYXRlX2RvbWFpbnMsIHUzMiBmbHVzaF9kb21haW5zKQogewogCXUzMiBmbGFncyA9IDA7Ci0JdTMyIHNjcmF0Y2hfYWRkciA9IHJpbmctPnNjcmF0Y2guZ3R0X29mZnNldCArIDEyODsKKwl1MzIgc2NyYXRjaF9hZGRyID0gcmluZy0+c2NyYXRjaC5ndHRfb2Zmc2V0ICsgMiAqIENBQ0hFTElORV9CWVRFUzsKIAlpbnQgcmV0OwogCiAJZmxhZ3MgfD0gUElQRV9DT05UUk9MX0NTX1NUQUxMOwpAQCAtNDAzLDE0ICs0MjEsMTQgQEAKIAogfQogCi1zdGF0aWMgdm9pZCByaW5nX3dyaXRlX3RhaWwoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIHZvaWQgcmluZ193cml0ZV90YWlsKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkgICAgdTMyIHZhbHVlKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAJSTkxNV9XUklURV9UQUlMKHJpbmcsIHZhbHVlKTsKIH0KIAotdTY0IGludGVsX3JpbmdfZ2V0X2FjdGl2ZV9oZWFkKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3U2NCBpbnRlbF9yaW5nX2dldF9hY3RpdmVfaGVhZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAJdTY0IGFjdGhkOwpAQCAtNDI2LDcgKzQ0NCw3IEBACiAJcmV0dXJuIGFjdGhkOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3NldHVwX3BoeXNfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIHZvaWQgcmluZ19zZXR1cF9waHlzX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgYWRkcjsKQEAgLTQzNyw3ICs0NTUsNyBAQAogCUk5MTVfV1JJVEUoSFdTX1BHQSwgYWRkcik7CiB9CiAKLXN0YXRpYyBib29sIHN0b3BfcmluZyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgYm9vbCBzdG9wX3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHJpbmctPmRldik7CiAKQEAgLTQ2MSwxMSArNDc5LDEyIEBACiAJcmV0dXJuIChJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUikgPT0gMDsKIH0KIAotc3RhdGljIGludCBpbml0X3JpbmdfY29tbW9uKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbnQgaW5pdF9yaW5nX2NvbW1vbihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gcmluZy0+b2JqOworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSByaW5nYnVmLT5vYmo7CiAJaW50IHJldCA9IDA7CiAKIAlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKQEAgLTUwNCw3ICs1MjMsNyBAQAogCSAqIHJlZ2lzdGVyIHZhbHVlcy4gKi8KIAlJOTE1X1dSSVRFX1NUQVJUKHJpbmcsIGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopKTsKIAlJOTE1X1dSSVRFX0NUTChyaW5nLAotCQkJKChyaW5nLT5zaXplIC0gUEFHRV9TSVpFKSAmIFJJTkdfTlJfUEFHRVMpCisJCQkoKHJpbmdidWYtPnNpemUgLSBQQUdFX1NJWkUpICYgUklOR19OUl9QQUdFUykKIAkJCXwgUklOR19WQUxJRCk7CiAKIAkvKiBJZiB0aGUgaGVhZCBpcyBzdGlsbCBub3QgemVybywgdGhlIHJpbmcgaXMgZGVhZCAqLwpAQCAtNTEyLDEyICs1MzEsMTEgQEAKIAkJICAgICBJOTE1X1JFQURfU1RBUlQocmluZykgPT0gaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgJiYKIAkJICAgICAoSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFIpID09IDAsIDUwKSkgewogCQlEUk1fRVJST1IoIiVzIGluaXRpYWxpemF0aW9uIGZhaWxlZCAiCi0JCQkJImN0bCAlMDh4IGhlYWQgJTA4eCB0YWlsICUwOHggc3RhcnQgJTA4eFxuIiwKLQkJCQlyaW5nLT5uYW1lLAotCQkJCUk5MTVfUkVBRF9DVEwocmluZyksCi0JCQkJSTkxNV9SRUFEX0hFQUQocmluZyksCi0JCQkJSTkxNV9SRUFEX1RBSUwocmluZyksCi0JCQkJSTkxNV9SRUFEX1NUQVJUKHJpbmcpKTsKKwkJCSAgImN0bCAlMDh4ICh2YWxpZD8gJWQpIGhlYWQgJTA4eCB0YWlsICUwOHggc3RhcnQgJTA4eCBbZXhwZWN0ZWQgJTA4bHhdXG4iLAorCQkJICByaW5nLT5uYW1lLAorCQkJICBJOTE1X1JFQURfQ1RMKHJpbmcpLCBJOTE1X1JFQURfQ1RMKHJpbmcpICYgUklOR19WQUxJRCwKKwkJCSAgSTkxNV9SRUFEX0hFQUQocmluZyksIEk5MTVfUkVBRF9UQUlMKHJpbmcpLAorCQkJICBJOTE1X1JFQURfU1RBUlQocmluZyksICh1bnNpZ25lZCBsb25nKWk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTI1LDEwICs1NDMsMTAgQEAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUocmluZy0+ZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChyaW5nLT5kZXYpOwogCWVsc2UgewotCQlyaW5nLT5oZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZyk7Ci0JCXJpbmctPnRhaWwgPSBJOTE1X1JFQURfVEFJTChyaW5nKSAmIFRBSUxfQUREUjsKLQkJcmluZy0+c3BhY2UgPSByaW5nX3NwYWNlKHJpbmcpOwotCQlyaW5nLT5sYXN0X3JldGlyZWRfaGVhZCA9IC0xOworCQlyaW5nYnVmLT5oZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZyk7CisJCXJpbmdidWYtPnRhaWwgPSBJOTE1X1JFQURfVEFJTChyaW5nKSAmIFRBSUxfQUREUjsKKwkJcmluZ2J1Zi0+c3BhY2UgPSByaW5nX3NwYWNlKHJpbmcpOworCQlyaW5nYnVmLT5sYXN0X3JldGlyZWRfaGVhZCA9IC0xOwogCX0KIAogCW1lbXNldCgmcmluZy0+aGFuZ2NoZWNrLCAwLCBzaXplb2YocmluZy0+aGFuZ2NoZWNrKSk7CkBAIC01NDAsNyArNTU4LDcgQEAKIH0KIAogc3RhdGljIGludAotaW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlpbnQgcmV0OwogCkBAIC01ODEsNyArNTk5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGluaXRfcmVuZGVyX3Jpbmcoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbml0X3JlbmRlcl9yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTk1LDE5ICs2MTMsMjEgQEAKIAkgKiB0byB1c2UgTUlfV0FJVF9GT1JfRVZFTlQgd2l0aGluIHRoZSBDUy4gSXQgc2hvdWxkIGFscmVhZHkgYmUKIAkgKiBwcm9ncmFtbWVkIHRvICcxJyBvbiBhbGwgcHJvZHVjdHMuCiAJICoKLQkgKiBXYURpc2FibGVBc3luY0ZsaXBQZXJmTW9kZTpzbmIsaXZiLGhzdyx2bHYsYmR3CisJICogV2FEaXNhYmxlQXN5bmNGbGlwUGVyZk1vZGU6c25iLGl2Yixoc3csdmx2LGJkdyxjaHYKIAkgKi8KIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikKIAkJSTkxNV9XUklURShNSV9NT0RFLCBfTUFTS0VEX0JJVF9FTkFCTEUoQVNZTkNfRkxJUF9QRVJGX0RJU0FCTEUpKTsKIAogCS8qIFJlcXVpcmVkIGZvciB0aGUgaGFyZHdhcmUgdG8gcHJvZ3JhbSBzY2FubGluZSB2YWx1ZXMgZm9yIHdhaXRpbmcgKi8KKwkvKiBXYUVuYWJsZUZsdXNoVGxiSW52YWxpZGF0aW9uTW9kZTpzbmIgKi8KIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNikKIAkJSTkxNV9XUklURShHRlhfTU9ERSwKLQkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfVExCX0lOVkFMSURBVEVfQUxXQVlTKSk7CisJCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0ZYX1RMQl9JTlZBTElEQVRFX0VYUExJQ0lUKSk7CiAKKwkvKiBXYUJDU1ZDU1RsYkludmFsaWRhdGlvbk1vZGU6aXZiLHZsdixoc3cgKi8KIAlpZiAoSVNfR0VONyhkZXYpKQogCQlJOTE1X1dSSVRFKEdGWF9NT0RFX0dFTjcsCi0JCQkgICBfTUFTS0VEX0JJVF9ESVNBQkxFKEdGWF9UTEJfSU5WQUxJREFURV9BTFdBWVMpIHwKKwkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfVExCX0lOVkFMSURBVEVfRVhQTElDSVQpIHwKIAkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfUkVQTEFZX01PREUpKTsKIAogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA1KSB7CkBAIC02MjQsMTMgKzY0NCw2IEBACiAJCSAqLwogCQlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwKIAkJCSAgIF9NQVNLRURfQklUX0RJU0FCTEUoQ00wX1NUQ19FVklDVF9ESVNBQkxFX0xSQV9TTkIpKTsKLQotCQkvKiBUaGlzIGlzIG5vdCBleHBsaWNpdGx5IHNldCBmb3IgR0VONiwgc28gcmVhZCB0aGUgcmVnaXN0ZXIuCi0JCSAqIHNlZSBpbnRlbF9yaW5nX21pX3NldF9jb250ZXh0KCkgZm9yIHdoeSB3ZSBjYXJlLgotCQkgKiBUT0RPOiBjb25zaWRlciBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGJpdCBmb3IgR0VONQotCQkgKi8KLQkJcmluZy0+aXRsYl9iZWZvcmVfY3R4X3N3aXRjaCA9Ci0JCQkhIShJOTE1X1JFQUQoR0ZYX01PREUpICYgR0ZYX1RMQl9JTlZBTElEQVRFX0FMV0FZUyk7CiAJfQogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpCkBAIC02NDIsNyArNjU1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCByZW5kZXJfcmluZ19jbGVhbnVwKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyB2b2lkIHJlbmRlcl9yaW5nX2NsZWFudXAoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCkBAIC02NTgsMjAgKzY3MSw0NiBAQAogCXJpbmctPnNjcmF0Y2gub2JqID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKLXVwZGF0ZV9tYm94ZXMoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCSAgICAgIHUzMiBtbWlvX29mZnNldCkKK3N0YXRpYyBpbnQgZ2VuNl9zaWduYWwoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqc2lnbmFsbGVyLAorCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9kd29yZHMpCiB7Ci0vKiBOQjogSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkbyBzZW1hcGhvcmUgTUJPWCB1cGRhdGVzIGZvciB2YXJ5aW5nIG51bWJlcgotICogb2YgcmluZ3MsIGl0J3MgZWFzaWVzdCBpZiB3ZSByb3VuZCB1cCBlYWNoIGluZGl2aWR1YWwgdXBkYXRlIHRvIGEKLSAqIG11bHRpcGxlIG9mIDIgKHNpbmNlIHJpbmcgdXBkYXRlcyBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDIpCi0gKiBldmVuIHRob3VnaCB0aGUgYWN0dWFsIHVwZGF0ZSBvbmx5IHJlcXVpcmVzIDMgZHdvcmRzLgotICovCisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHNpZ25hbGxlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqdXNlbGVzczsKKwlpbnQgaSwgcmV0OworCisJLyogTkI6IEluIG9yZGVyIHRvIGJlIGFibGUgdG8gZG8gc2VtYXBob3JlIE1CT1ggdXBkYXRlcyBmb3IgdmFyeWluZworCSAqIG51bWJlciBvZiByaW5ncywgaXQncyBlYXNpZXN0IGlmIHdlIHJvdW5kIHVwIGVhY2ggaW5kaXZpZHVhbCB1cGRhdGUKKwkgKiB0byBhIG11bHRpcGxlIG9mIDIgKHNpbmNlIHJpbmcgdXBkYXRlcyBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mCisJICogMikgZXZlbiB0aG91Z2ggdGhlIGFjdHVhbCB1cGRhdGUgb25seSByZXF1aXJlcyAzIGR3b3Jkcy4KKwkgKi8KICNkZWZpbmUgTUJPWF9VUERBVEVfRFdPUkRTIDQKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTE9BRF9SRUdJU1RFUl9JTU0oMSkpOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBtbWlvX29mZnNldCk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIHJpbmctPm91dHN0YW5kaW5nX2xhenlfc2Vxbm8pOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwlpZiAoaTkxNV9zZW1hcGhvcmVfaXNfZW5hYmxlZChkZXYpKQorCQludW1fZHdvcmRzICs9ICgoSTkxNV9OVU1fUklOR1MtMSkgKiBNQk9YX1VQREFURV9EV09SRFMpOworCWVsc2UKKwkJcmV0dXJuIGludGVsX3JpbmdfYmVnaW4oc2lnbmFsbGVyLCBudW1fZHdvcmRzKTsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4oc2lnbmFsbGVyLCBudW1fZHdvcmRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworI3VuZGVmIE1CT1hfVVBEQVRFX0RXT1JEUworCisJZm9yX2VhY2hfcmluZyh1c2VsZXNzLCBkZXZfcHJpdiwgaSkgeworCQl1MzIgbWJveF9yZWcgPSBzaWduYWxsZXItPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtpXTsKKwkJaWYgKG1ib3hfcmVnICE9IEdFTjZfTk9TWU5DKSB7CisJCQlpbnRlbF9yaW5nX2VtaXQoc2lnbmFsbGVyLCBNSV9MT0FEX1JFR0lTVEVSX0lNTSgxKSk7CisJCQlpbnRlbF9yaW5nX2VtaXQoc2lnbmFsbGVyLCBtYm94X3JlZyk7CisJCQlpbnRlbF9yaW5nX2VtaXQoc2lnbmFsbGVyLCBzaWduYWxsZXItPm91dHN0YW5kaW5nX2xhenlfc2Vxbm8pOworCQkJaW50ZWxfcmluZ19lbWl0KHNpZ25hbGxlciwgTUlfTk9PUCk7CisJCX0gZWxzZSB7CisJCQlpbnRlbF9yaW5nX2VtaXQoc2lnbmFsbGVyLCBNSV9OT09QKTsKKwkJCWludGVsX3JpbmdfZW1pdChzaWduYWxsZXIsIE1JX05PT1ApOworCQkJaW50ZWxfcmluZ19lbWl0KHNpZ25hbGxlciwgTUlfTk9PUCk7CisJCQlpbnRlbF9yaW5nX2VtaXQoc2lnbmFsbGVyLCBNSV9OT09QKTsKKwkJfQorCX0KKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTY4NCwyOSArNzIzLDE0IEBACiAgKiBUaGlzIGFjdHMgbGlrZSBhIHNpZ25hbCBpbiB0aGUgY2Fub25pY2FsIHNlbWFwaG9yZS4KICAqLwogc3RhdGljIGludAotZ2VuNl9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW42X2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqdXNlbGVzczsKLQlpbnQgaSwgcmV0LCBudW1fZHdvcmRzID0gNDsKKwlpbnQgcmV0OwogCi0JaWYgKGk5MTVfc2VtYXBob3JlX2lzX2VuYWJsZWQoZGV2KSkKLQkJbnVtX2R3b3JkcyArPSAoKEk5MTVfTlVNX1JJTkdTLTEpICogTUJPWF9VUERBVEVfRFdPUkRTKTsKLSN1bmRlZiBNQk9YX1VQREFURV9EV09SRFMKLQotCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgbnVtX2R3b3Jkcyk7CisJcmV0ID0gcmluZy0+c2VtYXBob3JlLnNpZ25hbChyaW5nLCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKGk5MTVfc2VtYXBob3JlX2lzX2VuYWJsZWQoZGV2KSkgewotCQlmb3JfZWFjaF9yaW5nKHVzZWxlc3MsIGRldl9wcml2LCBpKSB7Ci0JCQl1MzIgbWJveF9yZWcgPSByaW5nLT5zaWduYWxfbWJveFtpXTsKLQkJCWlmIChtYm94X3JlZyAhPSBHRU42X05PU1lOQykKLQkJCQl1cGRhdGVfbWJveGVzKHJpbmcsIG1ib3hfcmVnKTsKLQkJfQotCX0KLQogCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHJpbmctPm91dHN0YW5kaW5nX2xhenlfc2Vxbm8pOwpAQCAtNzMxLDE0ICs3NTUsMTUgQEAKICAqIEBzZXFubyAtIHNlcW5vIHdoaWNoIHRoZSB3YWl0ZXIgd2lsbCBibG9jayBvbgogICovCiBzdGF0aWMgaW50Ci1nZW42X3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKndhaXRlciwKLQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpzaWduYWxsZXIsCitnZW42X3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICp3YWl0ZXIsCisJICAgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNpZ25hbGxlciwKIAkgICAgICAgdTMyIHNlcW5vKQogewotCWludCByZXQ7CiAJdTMyIGR3MSA9IE1JX1NFTUFQSE9SRV9NQk9YIHwKIAkJICBNSV9TRU1BUEhPUkVfQ09NUEFSRSB8CiAJCSAgTUlfU0VNQVBIT1JFX1JFR0lTVEVSOworCXUzMiB3YWl0X21ib3ggPSBzaWduYWxsZXItPnNlbWFwaG9yZS5tYm94LndhaXRbd2FpdGVyLT5pZF07CisJaW50IHJldDsKIAogCS8qIFRocm91Z2hvdXQgYWxsIG9mIHRoZSBHRU0gY29kZSwgc2Vxbm8gcGFzc2VkIGltcGxpZXMgb3VyIGN1cnJlbnQKIAkgKiBzZXFubyBpcyA+PSB0aGUgbGFzdCBzZXFubyBleGVjdXRlZC4gSG93ZXZlciBmb3IgaGFyZHdhcmUgdGhlCkBAIC03NDYsOCArNzcxLDcgQEAKIAkgKi8KIAlzZXFubyAtPSAxOwogCi0JV0FSTl9PTihzaWduYWxsZXItPnNlbWFwaG9yZV9yZWdpc3Rlclt3YWl0ZXItPmlkXSA9PQotCQlNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEKTsKKwlXQVJOX09OKHdhaXRfbWJveCA9PSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEKTsKIAogCXJldCA9IGludGVsX3JpbmdfYmVnaW4od2FpdGVyLCA0KTsKIAlpZiAocmV0KQpAQCAtNzU1LDkgKzc3OSw3IEBACiAKIAkvKiBJZiBzZXFubyB3cmFwIGhhcHBlbmVkLCBvbWl0IHRoZSB3YWl0IHdpdGggbm8tb3BzICovCiAJaWYgKGxpa2VseSghaTkxNV9nZW1faGFzX3NlcW5vX3dyYXBwZWQod2FpdGVyLT5kZXYsIHNlcW5vKSkpIHsKLQkJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwKLQkJCQlkdzEgfAotCQkJCXNpZ25hbGxlci0+c2VtYXBob3JlX3JlZ2lzdGVyW3dhaXRlci0+aWRdKTsKKwkJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgZHcxIHwgd2FpdF9tYm94KTsKIAkJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgc2Vxbm8pOwogCQlpbnRlbF9yaW5nX2VtaXQod2FpdGVyLCAwKTsKIAkJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgTUlfTk9PUCk7CkBAIC03ODIsOSArODA0LDkgQEAKIH0gd2hpbGUgKDApCiAKIHN0YXRpYyBpbnQKLXBjX3JlbmRlcl9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitwY19yZW5kZXJfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQl1MzIgc2NyYXRjaF9hZGRyID0gcmluZy0+c2NyYXRjaC5ndHRfb2Zmc2V0ICsgMTI4OworCXUzMiBzY3JhdGNoX2FkZHIgPSByaW5nLT5zY3JhdGNoLmd0dF9vZmZzZXQgKyAyICogQ0FDSEVMSU5FX0JZVEVTOwogCWludCByZXQ7CiAKIAkvKiBGb3IgSXJvbmxha2UsIE1JX1VTRVJfSU5URVJSVVBUIHdhcyBkZXByZWNhdGVkIGFuZCBhcHBhcmVudGx5CkBAIC04MDYsMTUgKzgyOCwxNSBAQAogCWludGVsX3JpbmdfZW1pdChyaW5nLCByaW5nLT5vdXRzdGFuZGluZ19sYXp5X3NlcW5vKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CiAJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7Ci0Jc2NyYXRjaF9hZGRyICs9IDEyODsgLyogd3JpdGUgdG8gc2VwYXJhdGUgY2FjaGVsaW5lcyAqLworCXNjcmF0Y2hfYWRkciArPSAyICogQ0FDSEVMSU5FX0JZVEVTOyAvKiB3cml0ZSB0byBzZXBhcmF0ZSBjYWNoZWxpbmVzICovCiAJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7Ci0Jc2NyYXRjaF9hZGRyICs9IDEyODsKKwlzY3JhdGNoX2FkZHIgKz0gMiAqIENBQ0hFTElORV9CWVRFUzsKIAlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKLQlzY3JhdGNoX2FkZHIgKz0gMTI4OworCXNjcmF0Y2hfYWRkciArPSAyICogQ0FDSEVMSU5FX0JZVEVTOwogCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOwotCXNjcmF0Y2hfYWRkciArPSAxMjg7CisJc2NyYXRjaF9hZGRyICs9IDIgKiBDQUNIRUxJTkVfQllURVM7CiAJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7Ci0Jc2NyYXRjaF9hZGRyICs9IDEyODsKKwlzY3JhdGNoX2FkZHIgKz0gMiAqIENBQ0hFTElORV9CWVRFUzsKIAlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKIAogCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MKDQpIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKQEAgLTgzMCw3ICs4NTIsNyBAQAogfQogCiBzdGF0aWMgdTMyCi1nZW42X3JpbmdfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgYm9vbCBsYXp5X2NvaGVyZW5jeSkKK2dlbjZfcmluZ19nZXRfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgYm9vbCBsYXp5X2NvaGVyZW5jeSkKIHsKIAkvKiBXb3JrYXJvdW5kIHRvIGZvcmNlIGNvcnJlY3Qgb3JkZXJpbmcgYmV0d2VlbiBpcnEgYW5kIHNlcW5vIHdyaXRlcyBvbgogCSAqIGl2YiAoYW5kIG1heWJlIGFsc28gb24gc25iKSBieSByZWFkaW5nIGZyb20gYSBDUyByZWdpc3RlciAobGlrZQpAQCAtODQ0LDMxICs4NjYsMzEgQEAKIH0KIAogc3RhdGljIHUzMgotcmluZ19nZXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBib29sIGxhenlfY29oZXJlbmN5KQorcmluZ19nZXRfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgYm9vbCBsYXp5X2NvaGVyZW5jeSkKIHsKIAlyZXR1cm4gaW50ZWxfcmVhZF9zdGF0dXNfcGFnZShyaW5nLCBJOTE1X0dFTV9IV1NfSU5ERVgpOwogfQogCiBzdGF0aWMgdm9pZAotcmluZ19zZXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pCityaW5nX3NldF9zZXFubyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCB1MzIgc2Vxbm8pCiB7CiAJaW50ZWxfd3JpdGVfc3RhdHVzX3BhZ2UocmluZywgSTkxNV9HRU1fSFdTX0lOREVYLCBzZXFubyk7CiB9CiAKIHN0YXRpYyB1MzIKLXBjX3JlbmRlcl9nZXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBib29sIGxhenlfY29oZXJlbmN5KQorcGNfcmVuZGVyX2dldF9zZXFubyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLCBib29sIGxhenlfY29oZXJlbmN5KQogewogCXJldHVybiByaW5nLT5zY3JhdGNoLmNwdV9wYWdlWzBdOwogfQogCiBzdGF0aWMgdm9pZAotcGNfcmVuZGVyX3NldF9zZXFubyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIHUzMiBzZXFubykKK3BjX3JlbmRlcl9zZXRfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIHNlcW5vKQogewogCXJpbmctPnNjcmF0Y2guY3B1X3BhZ2VbMF0gPSBzZXFubzsKIH0KIAogc3RhdGljIGJvb2wKLWdlbjVfcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2dlbjVfcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODg2LDcgKzkwOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZW41X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW41X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg5OSw3ICs5MjEsNyBAQAogfQogCiBzdGF0aWMgYm9vbAotaTl4eF9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraTl4eF9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC05MjAsNyArOTQyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWk5eHhfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2k5eHhfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtOTM2LDcgKzk1OCw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1pOHh4X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitpOHh4X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk1Nyw3ICs5NzksNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaTh4eF9yaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraTh4eF9yaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC05NzIsNyArOTk0LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQgaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk4OSw2ICsxMDExLDExIEBACiAJCWNhc2UgQkNTOgogCQkJbW1pbyA9IEJMVF9IV1NfUEdBX0dFTjc7CiAJCQlicmVhazsKKwkJLyoKKwkJICogVkNTMiBhY3R1YWxseSBkb2Vzbid0IGV4aXN0IG9uIEdlbjcuIE9ubHkgc2h1dCB1cAorCQkgKiBnY2Mgc3dpdGNoIGNoZWNrIHdhcm5pbmcKKwkJICovCisJCWNhc2UgVkNTMjoKIAkJY2FzZSBWQ1M6CiAJCQltbWlvID0gQlNEX0hXU19QR0FfR0VONzsKIAkJCWJyZWFrOwpAQCAtMTAzMCw3ICsxMDU3LDcgQEAKIH0KIAogc3RhdGljIGludAotYnNkX3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorYnNkX3JpbmdfZmx1c2goc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkgICAgICAgdTMyICAgICBpbnZhbGlkYXRlX2RvbWFpbnMsCiAJICAgICAgIHUzMiAgICAgZmx1c2hfZG9tYWlucykKIHsKQEAgLTEwNDcsNyArMTA3NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWk5eHhfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraTl4eF9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCWludCByZXQ7CiAKQEAgLTEwNjUsNyArMTA5Miw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1nZW42X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW42X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEwOTAsNyArMTExNyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZW42X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW42X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExMDgsNyArMTEzNSw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1oc3dfdmVib3hfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitoc3dfdmVib3hfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExMjgsNyArMTE1NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1oc3dfdmVib3hfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitoc3dfdmVib3hfcHV0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExNDYsNyArMTE3Myw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1nZW44X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW44X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExNzIsNyArMTE5OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZW44X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitnZW44X3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExOTIsOCArMTIxOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWk5NjVfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCwKK2k5NjVfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkJIHU2NCBvZmZzZXQsIHUzMiBsZW5ndGgsCiAJCQkgdW5zaWduZWQgZmxhZ3MpCiB7CiAJaW50IHJldDsKQEAgLTEyMTUsOCArMTI0Miw4IEBACiAvKiBKdXN0IHVzZXJzcGFjZSBBQkkgY29udmVudGlvbiB0byBsaW1pdCB0aGUgd2EgYmF0Y2ggYm8gdG8gYSByZXNvbmFibGUgc2l6ZSAqLwogI2RlZmluZSBJODMwX0JBVENIX0xJTUlUICgyNTYqMTAyNCkKIHN0YXRpYyBpbnQKLWk4MzBfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkJdTMyIG9mZnNldCwgdTMyIGxlbiwKK2k4MzBfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkJCXU2NCBvZmZzZXQsIHUzMiBsZW4sCiAJCQkJdW5zaWduZWQgZmxhZ3MpCiB7CiAJaW50IHJldDsKQEAgLTEyNjYsOCArMTI5Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWk5MTVfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgdTMyIG9mZnNldCwgdTMyIGxlbiwKK2k5MTVfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkJIHU2NCBvZmZzZXQsIHUzMiBsZW4sCiAJCQkgdW5zaWduZWQgZmxhZ3MpCiB7CiAJaW50IHJldDsKQEAgLTEyODMsNyArMTMxMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIHZvaWQgY2xlYW51cF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAKQEAgLTEyOTcsNTAgKzEzMjQsNDQgQEAKIAlyaW5nLT5zdGF0dXNfcGFnZS5vYmogPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IGluaXRfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbml0X3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCWludCByZXQ7CiAKLQlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCA0MDk2KTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3RhdHVzIHBhZ2VcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKKwlpZiAoKG9iaiA9IHJpbmctPnN0YXR1c19wYWdlLm9iaikgPT0gTlVMTCkgeworCQlpbnQgcmV0OworCisJCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChyaW5nLT5kZXYsIDQwOTYpOworCQlpZiAob2JqID09IE5VTEwpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHN0YXR1cyBwYWdlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF9jYWNoZV9sZXZlbChvYmosIEk5MTVfQ0FDSEVfTExDKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3VucmVmOworCisJCXJldCA9IGk5MTVfZ2VtX29ial9nZ3R0X3BpbihvYmosIDQwOTYsIDApOworCQlpZiAocmV0KSB7CitlcnJfdW5yZWY6CisJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyaW5nLT5zdGF0dXNfcGFnZS5vYmogPSBvYmo7CiAJfQogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF9jYWNoZV9sZXZlbChvYmosIEk5MTVfQ0FDSEVfTExDKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl91bnJlZjsKLQotCXJldCA9IGk5MTVfZ2VtX29ial9nZ3R0X3BpbihvYmosIDQwOTYsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucmVmOwotCiAJcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIgPSBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKTsKIAlyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgPSBrbWFwKHNnX3BhZ2Uob2JqLT5wYWdlcy0+c2dsKSk7Ci0JaWYgKHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3VucGluOwotCX0KLQlyaW5nLT5zdGF0dXNfcGFnZS5vYmogPSBvYmo7CiAJbWVtc2V0KHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciwgMCwgUEFHRV9TSVpFKTsKIAogCURSTV9ERUJVR19EUklWRVIoIiVzIGh3cyBvZmZzZXQ6IDB4JTA4eFxuIiwKIAkJCXJpbmctPm5hbWUsIHJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyKTsKIAogCXJldHVybiAwOwotCi1lcnJfdW5waW46Ci0JaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5waW4ob2JqKTsKLWVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKLWVycjoKLQlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGluaXRfcGh5c19zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW50IGluaXRfcGh5c19zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzNTcsNDQgKzEzNzgsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW50IGFsbG9jYXRlX3JpbmdfYnVmZmVyKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CiAKLQlyaW5nLT5kZXYgPSBkZXY7Ci0JSU5JVF9MSVNUX0hFQUQoJnJpbmctPmFjdGl2ZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcmluZy0+cmVxdWVzdF9saXN0KTsKLQlyaW5nLT5zaXplID0gMzIgKiBQQUdFX1NJWkU7Ci0JbWVtc2V0KHJpbmctPnN5bmNfc2Vxbm8sIDAsIHNpemVvZihyaW5nLT5zeW5jX3NlcW5vKSk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyaW5nLT5pcnFfcXVldWUpOwotCi0JaWYgKEk5MTVfTkVFRF9HRlhfSFdTKGRldikpIHsKLQkJcmV0ID0gaW5pdF9zdGF0dXNfcGFnZShyaW5nKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSBlbHNlIHsKLQkJQlVHX09OKHJpbmctPmlkICE9IFJDUyk7Ci0JCXJldCA9IGluaXRfcGh5c19zdGF0dXNfcGFnZShyaW5nKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCWlmIChpbnRlbF9yaW5nX2luaXRpYWxpemVkKHJpbmcpKQorCQlyZXR1cm4gMDsKIAogCW9iaiA9IE5VTEw7CiAJaWYgKCFIQVNfTExDKGRldikpCi0JCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc3RvbGVuKGRldiwgcmluZy0+c2l6ZSk7CisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc3RvbGVuKGRldiwgcmluZ2J1Zi0+c2l6ZSk7CiAJaWYgKG9iaiA9PSBOVUxMKQotCQlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCByaW5nLT5zaXplKTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmluZ2J1ZmZlclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2h3czsKLQl9Ci0KLQlyaW5nLT5vYmogPSBvYmo7CisJCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIHJpbmdidWYtPnNpemUpOworCWlmIChvYmogPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmpfZ2d0dF9waW4ob2JqLCBQQUdFX1NJWkUsIFBJTl9NQVBQQUJMRSk7CiAJaWYgKHJldCkKQEAgLTE0MDQsNjUgKzE0MDUsMTAyIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5waW47CiAKLQlyaW5nLT52aXJ0dWFsX3N0YXJ0ID0KKwlyaW5nYnVmLT52aXJ0dWFsX3N0YXJ0ID0KIAkJaW9yZW1hcF93YyhkZXZfcHJpdi0+Z3R0Lm1hcHBhYmxlX2Jhc2UgKyBpOTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQob2JqKSwKLQkJCSAgIHJpbmctPnNpemUpOwotCWlmIChyaW5nLT52aXJ0dWFsX3N0YXJ0ID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbWFwIHJpbmdidWZmZXIuXG4iKTsKKwkJCQlyaW5nYnVmLT5zaXplKTsKKwlpZiAocmluZ2J1Zi0+dmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3VucGluOwogCX0KIAotCXJldCA9IHJpbmctPmluaXQocmluZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfdW5tYXA7CisJcmluZ2J1Zi0+b2JqID0gb2JqOworCXJldHVybiAwOworCitlcnJfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5waW4ob2JqKTsKK2Vycl91bnJlZjoKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX2luaXRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCit7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CisJaW50IHJldDsKKworCWlmIChyaW5nYnVmID09IE5VTEwpIHsKKwkJcmluZ2J1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpyaW5nYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmluZ2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyaW5nLT5idWZmZXIgPSByaW5nYnVmOworCX0KKworCXJpbmctPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmcmluZy0+YWN0aXZlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5yZXF1ZXN0X2xpc3QpOworCXJpbmdidWYtPnNpemUgPSAzMiAqIFBBR0VfU0laRTsKKwltZW1zZXQocmluZy0+c2VtYXBob3JlLnN5bmNfc2Vxbm8sIDAsIHNpemVvZihyaW5nLT5zZW1hcGhvcmUuc3luY19zZXFubykpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcmluZy0+aXJxX3F1ZXVlKTsKKworCWlmIChJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7CisJCXJldCA9IGluaXRfc3RhdHVzX3BhZ2UocmluZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCUJVR19PTihyaW5nLT5pZCAhPSBSQ1MpOworCQlyZXQgPSBpbml0X3BoeXNfc3RhdHVzX3BhZ2UocmluZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGFsbG9jYXRlX3JpbmdfYnVmZmVyKHJpbmcpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmluZ2J1ZmZlciAlczogJWRcbiIsIHJpbmctPm5hbWUsIHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQogCiAJLyogV29ya2Fyb3VuZCBhbiBlcnJhdHVtIG9uIHRoZSBpODMwIHdoaWNoIGNhdXNlcyBhIGhhbmcgaWYKIAkgKiB0aGUgVEFJTCBwb2ludGVyIHBvaW50cyB0byB3aXRoaW4gdGhlIGxhc3QgMiBjYWNoZWxpbmVzCiAJICogb2YgdGhlIGJ1ZmZlci4KIAkgKi8KLQlyaW5nLT5lZmZlY3RpdmVfc2l6ZSA9IHJpbmctPnNpemU7Ci0JaWYgKElTX0k4MzAocmluZy0+ZGV2KSB8fCBJU184NDVHKHJpbmctPmRldikpCi0JCXJpbmctPmVmZmVjdGl2ZV9zaXplIC09IDEyODsKKwlyaW5nYnVmLT5lZmZlY3RpdmVfc2l6ZSA9IHJpbmdidWYtPnNpemU7CisJaWYgKElTX0k4MzAoZGV2KSB8fCBJU184NDVHKGRldikpCisJCXJpbmdidWYtPmVmZmVjdGl2ZV9zaXplIC09IDIgKiBDQUNIRUxJTkVfQllURVM7CiAKLQlpOTE1X2NtZF9wYXJzZXJfaW5pdF9yaW5nKHJpbmcpOworCXJldCA9IGk5MTVfY21kX3BhcnNlcl9pbml0X3JpbmcocmluZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHJpbmctPmluaXQocmluZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKIAogCXJldHVybiAwOwogCi1lcnJfdW5tYXA6Ci0JaW91bm1hcChyaW5nLT52aXJ0dWFsX3N0YXJ0KTsKLWVycl91bnBpbjoKLQlpOTE1X2dlbV9vYmplY3RfZ2d0dF91bnBpbihvYmopOwotZXJyX3VucmVmOgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwotCXJpbmctPm9iaiA9IE5VTEw7Ci1lcnJfaHdzOgotCWNsZWFudXBfc3RhdHVzX3BhZ2UocmluZyk7CitlcnJvcjoKKwlrZnJlZShyaW5nYnVmKTsKKwlyaW5nLT5idWZmZXIgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit2b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHJpbmctPmRldik7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CiAKLQlpZiAocmluZy0+b2JqID09IE5VTEwpCisJaWYgKCFpbnRlbF9yaW5nX2luaXRpYWxpemVkKHJpbmcpKQogCQlyZXR1cm47CiAKLQkvKiBEaXNhYmxlIHRoZSByaW5nIGJ1ZmZlci4gVGhlIHJpbmcgbXVzdCBiZSBpZGxlIGF0IHRoaXMgcG9pbnQgKi8KLQlkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7Ci0JcmV0ID0gaW50ZWxfcmluZ19pZGxlKHJpbmcpOwotCWlmIChyZXQgJiYgIWk5MTVfcmVzZXRfaW5fcHJvZ3Jlc3MoJmRldl9wcml2LT5ncHVfZXJyb3IpKQotCQlEUk1fRVJST1IoImZhaWxlZCB0byBxdWllc2NlICVzIHdoaWxzdCBjbGVhbmluZyB1cDogJWRcbiIsCi0JCQkgIHJpbmctPm5hbWUsIHJldCk7CisJaW50ZWxfc3RvcF9yaW5nX2J1ZmZlcihyaW5nKTsKKwlXQVJOX09OKCFJU19HRU4yKHJpbmctPmRldikgJiYgKEk5MTVfUkVBRF9NT0RFKHJpbmcpICYgTU9ERV9JRExFKSA9PSAwKTsKIAotCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIDApOworCWlvdW5tYXAocmluZ2J1Zi0+dmlydHVhbF9zdGFydCk7CiAKLQlpb3VubWFwKHJpbmctPnZpcnR1YWxfc3RhcnQpOwotCi0JaTkxNV9nZW1fb2JqZWN0X2dndHRfdW5waW4ocmluZy0+b2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmcmluZy0+b2JqLT5iYXNlKTsKLQlyaW5nLT5vYmogPSBOVUxMOworCWk5MTVfZ2VtX29iamVjdF9nZ3R0X3VucGluKHJpbmdidWYtPm9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJnJpbmdidWYtPm9iai0+YmFzZSk7CisJcmluZ2J1Zi0+b2JqID0gTlVMTDsKIAlyaW5nLT5wcmVhbGxvY2F0ZWRfbGF6eV9yZXF1ZXN0ID0gTlVMTDsKIAlyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3NlcW5vID0gMDsKIApAQCAtMTQ3MCw0NCArMTUwOCwzNCBAQAogCQlyaW5nLT5jbGVhbnVwKHJpbmcpOwogCiAJY2xlYW51cF9zdGF0dXNfcGFnZShyaW5nKTsKKworCWk5MTVfY21kX3BhcnNlcl9maW5pX3JpbmcocmluZyk7CisKKwlrZnJlZShyaW5nYnVmKTsKKwlyaW5nLT5idWZmZXIgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IGludGVsX3Jpbmdfd2FpdF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgaW50IG4pCitzdGF0aWMgaW50IGludGVsX3Jpbmdfd2FpdF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIGludCBuKQogeworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKLQl1MzIgc2Vxbm8gPSAwLCB0YWlsOworCXUzMiBzZXFubyA9IDA7CiAJaW50IHJldDsKIAotCWlmIChyaW5nLT5sYXN0X3JldGlyZWRfaGVhZCAhPSAtMSkgewotCQlyaW5nLT5oZWFkID0gcmluZy0+bGFzdF9yZXRpcmVkX2hlYWQ7Ci0JCXJpbmctPmxhc3RfcmV0aXJlZF9oZWFkID0gLTE7CisJaWYgKHJpbmdidWYtPmxhc3RfcmV0aXJlZF9oZWFkICE9IC0xKSB7CisJCXJpbmdidWYtPmhlYWQgPSByaW5nYnVmLT5sYXN0X3JldGlyZWRfaGVhZDsKKwkJcmluZ2J1Zi0+bGFzdF9yZXRpcmVkX2hlYWQgPSAtMTsKIAotCQlyaW5nLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7Ci0JCWlmIChyaW5nLT5zcGFjZSA+PSBuKQorCQlyaW5nYnVmLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7CisJCWlmIChyaW5nYnVmLT5zcGFjZSA+PSBuKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXF1ZXN0LCAmcmluZy0+cmVxdWVzdF9saXN0LCBsaXN0KSB7Ci0JCWludCBzcGFjZTsKLQotCQlpZiAocmVxdWVzdC0+dGFpbCA9PSAtMSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwYWNlID0gcmVxdWVzdC0+dGFpbCAtIChyaW5nLT50YWlsICsgSTkxNV9SSU5HX0ZSRUVfU1BBQ0UpOwotCQlpZiAoc3BhY2UgPCAwKQotCQkJc3BhY2UgKz0gcmluZy0+c2l6ZTsKLQkJaWYgKHNwYWNlID49IG4pIHsKKwkJaWYgKF9fcmluZ19zcGFjZShyZXF1ZXN0LT50YWlsLCByaW5nYnVmLT50YWlsLCByaW5nYnVmLT5zaXplKSA+PSBuKSB7CiAJCQlzZXFubyA9IHJlcXVlc3QtPnNlcW5vOwotCQkJdGFpbCA9IHJlcXVlc3QtPnRhaWw7CiAJCQlicmVhazsKIAkJfQotCi0JCS8qIENvbnN1bWUgdGhpcyByZXF1ZXN0IGluIGNhc2Ugd2UgbmVlZCBtb3JlIHNwYWNlIHRoYW4KLQkJICogaXMgYXZhaWxhYmxlIGFuZCBzbyBuZWVkIHRvIHByZXZlbnQgYSByYWNlIGJldHdlZW4KLQkJICogdXBkYXRpbmcgbGFzdF9yZXRpcmVkX2hlYWQgYW5kIGRpcmVjdCByZWFkcyBvZgotCQkgKiBJOTE1X1JJTkdfSEVBRC4gSXQgYWxzbyBwcm92aWRlcyBhIG5pY2Ugc2FuaXR5IGNoZWNrLgotCQkgKi8KLQkJcmVxdWVzdC0+dGFpbCA9IC0xOwogCX0KIAogCWlmIChzZXFubyA9PSAwKQpAQCAtMTUxNywxOCArMTU0NSwxOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyaW5nLT5oZWFkID0gdGFpbDsKLQlyaW5nLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7Ci0JaWYgKFdBUk5fT04ocmluZy0+c3BhY2UgPCBuKSkKLQkJcmV0dXJuIC1FTk9TUEM7CisJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3JpbmcocmluZyk7CisJcmluZ2J1Zi0+aGVhZCA9IHJpbmdidWYtPmxhc3RfcmV0aXJlZF9oZWFkOworCXJpbmdidWYtPmxhc3RfcmV0aXJlZF9oZWFkID0gLTE7CiAKKwlyaW5nYnVmLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmluZ193YWl0X2Zvcl9zcGFjZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKQorc3RhdGljIGludCByaW5nX3dhaXRfZm9yX3NwYWNlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIGludCBuKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ2J1ZmZlciAqcmluZ2J1ZiA9IHJpbmctPmJ1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGVuZDsKIAlpbnQgcmV0OwogCkBAIC0xNTM5LDcgKzE1NjgsNiBAQAogCS8qIGZvcmNlIHRoZSB0YWlsIHdyaXRlIGluIGNhc2Ugd2UgaGF2ZSBiZWVuIHNraXBwaW5nIHRoZW0gKi8KIAlfX2ludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKIAotCXRyYWNlX2k5MTVfcmluZ193YWl0X2JlZ2luKHJpbmcpOwogCS8qIFdpdGggR0VNIHRoZSBoYW5nY2hlY2sgdGltZXIgc2hvdWxkIGtpY2sgdXMgb3V0IG9mIHRoZSBsb29wLAogCSAqIGxlYXZpbmcgaXQgZWFybHkgcnVucyB0aGUgcmlzayBvZiBjb3JydXB0aW5nIEdFTSBzdGF0ZSAoZHVlCiAJICogdG8gcnVubmluZyBvbiBhbG1vc3QgdW50ZXN0ZWQgY29kZXBhdGhzKS4gQnV0IG9uIHJlc3VtZQpAQCAtMTU0NywxMiArMTU3NSwxMyBAQAogCSAqIGNhc2UgYnkgY2hvb3NpbmcgYW4gaW5zYW5lbHkgbGFyZ2UgdGltZW91dC4gKi8KIAllbmQgPSBqaWZmaWVzICsgNjAgKiBIWjsKIAorCXRyYWNlX2k5MTVfcmluZ193YWl0X2JlZ2luKHJpbmcpOwogCWRvIHsKLQkJcmluZy0+aGVhZCA9IEk5MTVfUkVBRF9IRUFEKHJpbmcpOwotCQlyaW5nLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7Ci0JCWlmIChyaW5nLT5zcGFjZSA+PSBuKSB7Ci0JCQl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9lbmQocmluZyk7Ci0JCQlyZXR1cm4gMDsKKwkJcmluZ2J1Zi0+aGVhZCA9IEk5MTVfUkVBRF9IRUFEKHJpbmcpOworCQlyaW5nYnVmLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7CisJCWlmIChyaW5nYnVmLT5zcGFjZSA+PSBuKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkgJiYKQEAgLTE1NjQsMzggKzE1OTMsNDkgQEAKIAogCQltc2xlZXAoMSk7CiAKKwkJaWYgKGRldl9wcml2LT5tbS5pbnRlcnJ1cHRpYmxlICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCiAJCXJldCA9IGk5MTVfZ2VtX2NoZWNrX3dlZGdlKCZkZXZfcHJpdi0+Z3B1X2Vycm9yLAogCQkJCQkgICBkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGVuZCkpOworCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kKSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKIAl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9lbmQocmluZyk7Ci0JcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGludGVsX3dyYXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbnRlbF93cmFwX3JpbmdfYnVmZmVyKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJdWludDMyX3QgX19pb21lbSAqdmlydDsKLQlpbnQgcmVtID0gcmluZy0+c2l6ZSAtIHJpbmctPnRhaWw7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CisJaW50IHJlbSA9IHJpbmdidWYtPnNpemUgLSByaW5nYnVmLT50YWlsOwogCi0JaWYgKHJpbmctPnNwYWNlIDwgcmVtKSB7CisJaWYgKHJpbmdidWYtPnNwYWNlIDwgcmVtKSB7CiAJCWludCByZXQgPSByaW5nX3dhaXRfZm9yX3NwYWNlKHJpbmcsIHJlbSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXZpcnQgPSByaW5nLT52aXJ0dWFsX3N0YXJ0ICsgcmluZy0+dGFpbDsKKwl2aXJ0ID0gcmluZ2J1Zi0+dmlydHVhbF9zdGFydCArIHJpbmdidWYtPnRhaWw7CiAJcmVtIC89IDQ7CiAJd2hpbGUgKHJlbS0tKQogCQlpb3dyaXRlMzIoTUlfTk9PUCwgdmlydCsrKTsKIAotCXJpbmctPnRhaWwgPSAwOwotCXJpbmctPnNwYWNlID0gcmluZ19zcGFjZShyaW5nKTsKKwlyaW5nYnVmLT50YWlsID0gMDsKKwlyaW5nYnVmLT5zcGFjZSA9IHJpbmdfc3BhY2UocmluZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGludGVsX3JpbmdfaWRsZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitpbnQgaW50ZWxfcmluZ19pZGxlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJdTMyIHNlcW5vOwogCWludCByZXQ7CkBAIC0xNjE5LDcgKzE2NTksNyBAQAogfQogCiBzdGF0aWMgaW50Ci1pbnRlbF9yaW5nX2FsbG9jX3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2ludGVsX3JpbmdfYWxsb2Nfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAlpZiAocmluZy0+b3V0c3RhbmRpbmdfbGF6eV9zZXFubykKIAkJcmV0dXJuIDA7CkBAIC0xNjM3LDE4ICsxNjc3LDE5IEBACiAJcmV0dXJuIGk5MTVfZ2VtX2dldF9zZXFubyhyaW5nLT5kZXYsICZyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3NlcW5vKTsKIH0KIAotc3RhdGljIGludCBfX2ludGVsX3JpbmdfcHJlcGFyZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgaW50IF9faW50ZWxfcmluZ19wcmVwYXJlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJaW50IGJ5dGVzKQogeworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkocmluZy0+dGFpbCArIGJ5dGVzID4gcmluZy0+ZWZmZWN0aXZlX3NpemUpKSB7CisJaWYgKHVubGlrZWx5KHJpbmdidWYtPnRhaWwgKyBieXRlcyA+IHJpbmdidWYtPmVmZmVjdGl2ZV9zaXplKSkgewogCQlyZXQgPSBpbnRlbF93cmFwX3JpbmdfYnVmZmVyKHJpbmcpOwogCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHVubGlrZWx5KHJpbmctPnNwYWNlIDwgYnl0ZXMpKSB7CisJaWYgKHVubGlrZWx5KHJpbmdidWYtPnNwYWNlIDwgYnl0ZXMpKSB7CiAJCXJldCA9IHJpbmdfd2FpdF9mb3Jfc3BhY2UocmluZywgYnl0ZXMpOwogCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCXJldHVybiByZXQ7CkBAIC0xNjU3LDcgKzE2OTgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitpbnQgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkgICAgIGludCBudW1fZHdvcmRzKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNjc3LDE5ICsxNzE4LDIwIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJpbmctPnNwYWNlIC09IG51bV9kd29yZHMgKiBzaXplb2YodWludDMyX3QpOworCXJpbmctPmJ1ZmZlci0+c3BhY2UgLT0gbnVtX2R3b3JkcyAqIHNpemVvZih1aW50MzJfdCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIEFsaWduIHRoZSByaW5nIHRhaWwgdG8gYSBjYWNoZWxpbmUgYm91bmRhcnkgKi8KLWludCBpbnRlbF9yaW5nX2NhY2hlbGluZV9hbGlnbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitpbnQgaW50ZWxfcmluZ19jYWNoZWxpbmVfYWxpZ24oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQlpbnQgbnVtX2R3b3JkcyA9ICg2NCAtIChyaW5nLT50YWlsICYgNjMpKSAvIHNpemVvZih1aW50MzJfdCk7CisJaW50IG51bV9kd29yZHMgPSAocmluZy0+YnVmZmVyLT50YWlsICYgKENBQ0hFTElORV9CWVRFUyAtIDEpKSAvIHNpemVvZih1aW50MzJfdCk7CiAJaW50IHJldDsKIAogCWlmIChudW1fZHdvcmRzID09IDApCiAJCXJldHVybiAwOwogCisJbnVtX2R3b3JkcyA9IENBQ0hFTElORV9CWVRFUyAvIHNpemVvZih1aW50MzJfdCkgLSBudW1fZHdvcmRzOwogCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgbnVtX2R3b3Jkcyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE3MDIsNyArMTc0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaW50ZWxfcmluZ19pbml0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIHNlcW5vKQordm9pZCBpbnRlbF9yaW5nX2luaXRfc2Vxbm8oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgdTMyIHNlcW5vKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE3MTksNyArMTc2MSw3IEBACiAJcmluZy0+aGFuZ2NoZWNrLnNlcW5vID0gc2Vxbm87CiB9CiAKLXN0YXRpYyB2b2lkIGdlbjZfYnNkX3Jpbmdfd3JpdGVfdGFpbChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgdm9pZCBnZW42X2JzZF9yaW5nX3dyaXRlX3RhaWwoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCQkgICAgIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwpAQCAtMTc1Miw3ICsxNzk0LDcgQEAKIAkJICAgX01BU0tFRF9CSVRfRElTQUJMRShHRU42X0JTRF9TTEVFUF9NU0dfRElTQUJMRSkpOwogfQogCi1zdGF0aWMgaW50IGdlbjZfYnNkX3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIGludCBnZW42X2JzZF9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkgICAgICAgdTMyIGludmFsaWRhdGUsIHUzMiBmbHVzaCkKIHsKIAl1aW50MzJfdCBjbWQ7CkBAIC0xNzg4LDggKzE4MzAsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1nZW44X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgICAgICB1MzIgb2Zmc2V0LCB1MzIgbGVuLAorZ2VuOF9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJCSAgICAgIHU2NCBvZmZzZXQsIHUzMiBsZW4sCiAJCQkgICAgICB1bnNpZ25lZCBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwpAQCAtMTgwMyw4ICsxODQ1LDggQEAKIAogCS8qIEZJWE1FKEJEVyk6IEFkZHJlc3Mgc3BhY2UgYW5kIHNlY3VyaXR5IHNlbGVjdG9ycy4gKi8KIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0dFTjggfCAocHBndHQ8PDgpKTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgb2Zmc2V0KTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIGxvd2VyXzMyX2JpdHMob2Zmc2V0KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHVwcGVyXzMyX2JpdHMob2Zmc2V0KSk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOwogCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKIApAQCAtMTgxMiw4ICsxODU0LDggQEAKIH0KIAogc3RhdGljIGludAotaHN3X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgICAgICB1MzIgb2Zmc2V0LCB1MzIgbGVuLAoraHN3X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkJICAgICAgdTY0IG9mZnNldCwgdTMyIGxlbiwKIAkJCSAgICAgIHVuc2lnbmVkIGZsYWdzKQogewogCWludCByZXQ7CkBAIC0xODMzLDggKzE4NzUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1nZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkgICAgICB1MzIgb2Zmc2V0LCB1MzIgbGVuLAorZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJCSAgICAgIHU2NCBvZmZzZXQsIHUzMiBsZW4sCiAJCQkgICAgICB1bnNpZ25lZCBmbGFncykKIHsKIAlpbnQgcmV0OwpAQCAtMTg1NSw3ICsxODk3LDcgQEAKIAogLyogQmxpdHRlciBzdXBwb3J0IChTYW5keUJyaWRnZSspICovCiAKLXN0YXRpYyBpbnQgZ2VuNl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK3N0YXRpYyBpbnQgZ2VuNl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkgICB1MzIgaW52YWxpZGF0ZSwgdTMyIGZsdXNoKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CkBAIC0xODk4LDcgKzE5NDAsNyBAQAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CiAKIAlyaW5nLT5uYW1lID0gInJlbmRlciByaW5nIjsKIAlyaW5nLT5pZCA9IFJDUzsKQEAgLTE5MjAsMTUgKzE5NjIsMjQgQEAKIAkJcmluZy0+aXJxX2VuYWJsZV9tYXNrID0gR1RfUkVOREVSX1VTRVJfSU5URVJSVVBUOwogCQlyaW5nLT5nZXRfc2Vxbm8gPSBnZW42X3JpbmdfZ2V0X3NlcW5vOwogCQlyaW5nLT5zZXRfc2Vxbm8gPSByaW5nX3NldF9zZXFubzsKLQkJcmluZy0+c3luY190byA9IGdlbjZfcmluZ19zeW5jOwotCQlyaW5nLT5zZW1hcGhvcmVfcmVnaXN0ZXJbUkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQ7Ci0JCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfUlY7Ci0JCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltCQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfUkI7Ci0JCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWRUNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX1JWRTsKLQkJcmluZy0+c2lnbmFsX21ib3hbUkNTXSA9IEdFTjZfTk9TWU5DOwotCQlyaW5nLT5zaWduYWxfbWJveFtWQ1NdID0gR0VONl9WUlNZTkM7Ci0JCXJpbmctPnNpZ25hbF9tYm94W0JDU10gPSBHRU42X0JSU1lOQzsKLQkJcmluZy0+c2lnbmFsX21ib3hbVkVDU10gPSBHRU42X1ZFUlNZTkM7CisJCXJpbmctPnNlbWFwaG9yZS5zeW5jX3RvID0gZ2VuNl9yaW5nX3N5bmM7CisJCXJpbmctPnNlbWFwaG9yZS5zaWduYWwgPSBnZW42X3NpZ25hbDsKKwkJLyoKKwkJICogVGhlIGN1cnJlbnQgc2VtYXBob3JlIGlzIG9ubHkgYXBwbGllZCBvbiBwcmUtZ2VuOCBwbGF0Zm9ybS4KKwkJICogQW5kIHRoZXJlIGlzIG5vIFZDUzIgcmluZyBvbiB0aGUgcHJlLWdlbjggcGxhdGZvcm0uIFNvIHRoZQorCQkgKiBzZW1hcGhvcmUgYmV0d2VlbiBSQ1MgYW5kIFZDUzIgaXMgaW5pdGlhbGl6ZWQgYXMgSU5WQUxJRC4KKwkJICogR2VuOCB3aWxsIGluaXRpYWxpemUgdGhlIHNlbWEgYmV0d2VlbiBWQ1MyIGFuZCBSQ1MgbGF0ZXIuCisJCSAqLworCQlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1JDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19SVjsKKwkJcmluZy0+c2VtYXBob3JlLm1ib3gud2FpdFtCQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfUkI7CisJCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkVDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19SVkU7CisJCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkNTMl0gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbUkNTXSA9IEdFTjZfTk9TWU5DOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkNTXSA9IEdFTjZfVlJTWU5DOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbQkNTXSA9IEdFTjZfQlJTWU5DOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkVDU10gPSBHRU42X1ZFUlNZTkM7CisJCXJpbmctPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtWQ1MyXSA9IEdFTjZfTk9TWU5DOwogCX0gZWxzZSBpZiAoSVNfR0VONShkZXYpKSB7CiAJCXJpbmctPmFkZF9yZXF1ZXN0ID0gcGNfcmVuZGVyX2FkZF9yZXF1ZXN0OwogCQlyaW5nLT5mbHVzaCA9IGdlbjRfcmVuZGVyX3JpbmdfZmx1c2g7CkBAIC0xOTk5LDE2ICsyMDUwLDI1IEBACiBpbnQgaW50ZWxfcmVuZGVyX3JpbmdfaW5pdF9kcmkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IHN0YXJ0LCB1MzIgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ2J1ZmZlciAqcmluZ2J1ZiA9IHJpbmctPmJ1ZmZlcjsKIAlpbnQgcmV0OwogCisJaWYgKHJpbmdidWYgPT0gTlVMTCkgeworCQlyaW5nYnVmID0ga3phbGxvYyhzaXplb2YoKnJpbmdidWYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyaW5nYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJpbmctPmJ1ZmZlciA9IHJpbmdidWY7CisJfQorCiAJcmluZy0+bmFtZSA9ICJyZW5kZXIgcmluZyI7CiAJcmluZy0+aWQgPSBSQ1M7CiAJcmluZy0+bW1pb19iYXNlID0gUkVOREVSX1JJTkdfQkFTRTsKIAogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CiAJCS8qIG5vbi1rbXMgbm90IHN1cHBvcnRlZCBvbiBnZW42KyAqLwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmluZ2J1ZjsKIAl9CiAKIAkvKiBOb3RlOiBnZW0gaXMgbm90IHN1cHBvcnRlZCBvbiBnZW41L2lsayB3aXRob3V0IGttcyAodGhlIGNvcnJlc3BvbmRpbmcKQEAgLTIwNDMsMzEgKzIxMDMsMzkgQEAKIAlJTklUX0xJU1RfSEVBRCgmcmluZy0+YWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5yZXF1ZXN0X2xpc3QpOwogCi0JcmluZy0+c2l6ZSA9IHNpemU7Ci0JcmluZy0+ZWZmZWN0aXZlX3NpemUgPSByaW5nLT5zaXplOworCXJpbmdidWYtPnNpemUgPSBzaXplOworCXJpbmdidWYtPmVmZmVjdGl2ZV9zaXplID0gcmluZ2J1Zi0+c2l6ZTsKIAlpZiAoSVNfSTgzMChyaW5nLT5kZXYpIHx8IElTXzg0NUcocmluZy0+ZGV2KSkKLQkJcmluZy0+ZWZmZWN0aXZlX3NpemUgLT0gMTI4OworCQlyaW5nYnVmLT5lZmZlY3RpdmVfc2l6ZSAtPSAyICogQ0FDSEVMSU5FX0JZVEVTOwogCi0JcmluZy0+dmlydHVhbF9zdGFydCA9IGlvcmVtYXBfd2Moc3RhcnQsIHNpemUpOwotCWlmIChyaW5nLT52aXJ0dWFsX3N0YXJ0ID09IE5VTEwpIHsKKwlyaW5nYnVmLT52aXJ0dWFsX3N0YXJ0ID0gaW9yZW1hcF93YyhzdGFydCwgc2l6ZSk7CisJaWYgKHJpbmdidWYtPnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgogCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JpbmdidWY7CiAJfQogCiAJaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7CiAJCXJldCA9IGluaXRfcGh5c19zdGF0dXNfcGFnZShyaW5nKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGVycl92c3RhcnQ7CiAJfQogCiAJcmV0dXJuIDA7CisKK2Vycl92c3RhcnQ6CisJaW91bm1hcChyaW5nYnVmLT52aXJ0dWFsX3N0YXJ0KTsKK2Vycl9yaW5nYnVmOgorCWtmcmVlKHJpbmdidWYpOworCXJpbmctPmJ1ZmZlciA9IE5VTEw7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbVkNTXTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1ZDU107CiAKIAlyaW5nLT5uYW1lID0gImJzZCByaW5nIjsKIAlyaW5nLT5pZCA9IFZDUzsKQEAgLTIwOTYsMTUgKzIxNjQsMjQgQEAKIAkJCXJpbmctPmRpc3BhdGNoX2V4ZWNidWZmZXIgPQogCQkJCWdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyOwogCQl9Ci0JCXJpbmctPnN5bmNfdG8gPSBnZW42X3Jpbmdfc3luYzsKLQkJcmluZy0+c2VtYXBob3JlX3JlZ2lzdGVyW1JDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19WUjsKLQkJcmluZy0+c2VtYXBob3JlX3JlZ2lzdGVyW1ZDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOwotCQlyaW5nLT5zZW1hcGhvcmVfcmVnaXN0ZXJbQkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX1ZCOwotCQlyaW5nLT5zZW1hcGhvcmVfcmVnaXN0ZXJbVkVDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19WVkU7Ci0JCXJpbmctPnNpZ25hbF9tYm94W1JDU10gPSBHRU42X1JWU1lOQzsKLQkJcmluZy0+c2lnbmFsX21ib3hbVkNTXSA9IEdFTjZfTk9TWU5DOwotCQlyaW5nLT5zaWduYWxfbWJveFtCQ1NdID0gR0VONl9CVlNZTkM7Ci0JCXJpbmctPnNpZ25hbF9tYm94W1ZFQ1NdID0gR0VONl9WRVZTWU5DOworCQlyaW5nLT5zZW1hcGhvcmUuc3luY190byA9IGdlbjZfcmluZ19zeW5jOworCQlyaW5nLT5zZW1hcGhvcmUuc2lnbmFsID0gZ2VuNl9zaWduYWw7CisJCS8qCisJCSAqIFRoZSBjdXJyZW50IHNlbWFwaG9yZSBpcyBvbmx5IGFwcGxpZWQgb24gcHJlLWdlbjggcGxhdGZvcm0uCisJCSAqIEFuZCB0aGVyZSBpcyBubyBWQ1MyIHJpbmcgb24gdGhlIHByZS1nZW44IHBsYXRmb3JtLiBTbyB0aGUKKwkJICogc2VtYXBob3JlIGJldHdlZW4gVkNTIGFuZCBWQ1MyIGlzIGluaXRpYWxpemVkIGFzIElOVkFMSUQuCisJCSAqIEdlbjggd2lsbCBpbml0aWFsaXplIHRoZSBzZW1hIGJldHdlZW4gVkNTMiBhbmQgVkNTIGxhdGVyLgorCQkgKi8KKwkJcmluZy0+c2VtYXBob3JlLm1ib3gud2FpdFtSQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVlI7CisJCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQ7CisJCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbQkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX1ZCOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZFQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVlZFOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZDUzJdID0gTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRDsKKwkJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW1JDU10gPSBHRU42X1JWU1lOQzsKKwkJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW1ZDU10gPSBHRU42X05PU1lOQzsKKwkJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW0JDU10gPSBHRU42X0JWU1lOQzsKKwkJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW1ZFQ1NdID0gR0VONl9WRVZTWU5DOworCQlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkNTMl0gPSBHRU42X05PU1lOQzsKIAl9IGVsc2UgewogCQlyaW5nLT5tbWlvX2Jhc2UgPSBCU0RfUklOR19CQVNFOwogCQlyaW5nLT5mbHVzaCA9IGJzZF9yaW5nX2ZsdXNoOwpAQCAtMjEyNywxMCArMjIwNCw2MyBAQAogCXJldHVybiBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKGRldiwgcmluZyk7CiB9CiAKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgc2Vjb25kIEJTRCByaW5nIGZvciBCcm9hZHdlbGwgR1QzLgorICogSXQgaXMgbm90ZWQgdGhhdCB0aGlzIG9ubHkgZXhpc3RzIG9uIEJyb2Fkd2VsbCBHVDMuCisgKi8KK2ludCBpbnRlbF9pbml0X2JzZDJfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbVkNTMl07CisKKwlpZiAoKElOVEVMX0lORk8oZGV2KS0+Z2VuICE9IDgpKSB7CisJCURSTV9FUlJPUigiTm8gZHVhbC1CU0QgcmluZyBvbiBub24tQkRXIG1hY2hpbmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyaW5nLT5uYW1lID0gImJkczJfcmluZyI7CisJcmluZy0+aWQgPSBWQ1MyOworCisJcmluZy0+d3JpdGVfdGFpbCA9IHJpbmdfd3JpdGVfdGFpbDsKKwlyaW5nLT5tbWlvX2Jhc2UgPSBHRU44X0JTRDJfUklOR19CQVNFOworCXJpbmctPmZsdXNoID0gZ2VuNl9ic2RfcmluZ19mbHVzaDsKKwlyaW5nLT5hZGRfcmVxdWVzdCA9IGdlbjZfYWRkX3JlcXVlc3Q7CisJcmluZy0+Z2V0X3NlcW5vID0gZ2VuNl9yaW5nX2dldF9zZXFubzsKKwlyaW5nLT5zZXRfc2Vxbm8gPSByaW5nX3NldF9zZXFubzsKKwlyaW5nLT5pcnFfZW5hYmxlX21hc2sgPQorCQkJR1RfUkVOREVSX1VTRVJfSU5URVJSVVBUIDw8IEdFTjhfVkNTMl9JUlFfU0hJRlQ7CisJcmluZy0+aXJxX2dldCA9IGdlbjhfcmluZ19nZXRfaXJxOworCXJpbmctPmlycV9wdXQgPSBnZW44X3JpbmdfcHV0X2lycTsKKwlyaW5nLT5kaXNwYXRjaF9leGVjYnVmZmVyID0KKwkJCWdlbjhfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyOworCXJpbmctPnNlbWFwaG9yZS5zeW5jX3RvID0gZ2VuNl9yaW5nX3N5bmM7CisJcmluZy0+c2VtYXBob3JlLnNpZ25hbCA9IGdlbjZfc2lnbmFsOworCS8qCisJICogVGhlIGN1cnJlbnQgc2VtYXBob3JlIGlzIG9ubHkgYXBwbGllZCBvbiB0aGUgcHJlLWdlbjguIEFuZCB0aGVyZQorCSAqIGlzIG5vIGJzZDIgcmluZyBvbiB0aGUgcHJlLWdlbjguIFNvIG5vdyB0aGUgc2VtYXBob3JlX3JlZ2lzdGVyCisJICogYmV0d2VlbiBWQ1MyIGFuZCBvdGhlciByaW5nIGlzIGluaXRpYWxpemVkIGFzIGludmFsaWQuCisJICogR2VuOCB3aWxsIGluaXRpYWxpemUgdGhlIHNlbWEgYmV0d2VlbiBWQ1MyIGFuZCBvdGhlciByaW5nIGxhdGVyLgorCSAqLworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbUkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQ7CisJcmluZy0+c2VtYXBob3JlLm1ib3gud2FpdFtWQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRDsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W0JDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkVDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkNTMl0gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOworCXJpbmctPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtSQ1NdID0gR0VONl9OT1NZTkM7CisJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW1ZDU10gPSBHRU42X05PU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbQkNTXSA9IEdFTjZfTk9TWU5DOworCXJpbmctPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtWRUNTXSA9IEdFTjZfTk9TWU5DOworCXJpbmctPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtWQ1MyXSA9IEdFTjZfTk9TWU5DOworCisJcmluZy0+aW5pdCA9IGluaXRfcmluZ19jb21tb247CisKKwlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOworfQorCiBpbnQgaW50ZWxfaW5pdF9ibHRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tCQ1NdOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbQkNTXTsKIAogCXJpbmctPm5hbWUgPSAiYmxpdHRlciByaW5nIjsKIAlyaW5nLT5pZCA9IEJDUzsKQEAgLTIxNTMsMTUgKzIyODMsMjQgQEAKIAkJcmluZy0+aXJxX3B1dCA9IGdlbjZfcmluZ19wdXRfaXJxOwogCQlyaW5nLT5kaXNwYXRjaF9leGVjYnVmZmVyID0gZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXI7CiAJfQotCXJpbmctPnN5bmNfdG8gPSBnZW42X3Jpbmdfc3luYzsKLQlyaW5nLT5zZW1hcGhvcmVfcmVnaXN0ZXJbUkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0JSOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfQlY7Ci0JcmluZy0+c2VtYXBob3JlX3JlZ2lzdGVyW0JDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWRUNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0JWRTsKLQlyaW5nLT5zaWduYWxfbWJveFtSQ1NdID0gR0VONl9SQlNZTkM7Ci0JcmluZy0+c2lnbmFsX21ib3hbVkNTXSA9IEdFTjZfVkJTWU5DOwotCXJpbmctPnNpZ25hbF9tYm94W0JDU10gPSBHRU42X05PU1lOQzsKLQlyaW5nLT5zaWduYWxfbWJveFtWRUNTXSA9IEdFTjZfVkVCU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUuc3luY190byA9IGdlbjZfcmluZ19zeW5jOworCXJpbmctPnNlbWFwaG9yZS5zaWduYWwgPSBnZW42X3NpZ25hbDsKKwkvKgorCSAqIFRoZSBjdXJyZW50IHNlbWFwaG9yZSBpcyBvbmx5IGFwcGxpZWQgb24gcHJlLWdlbjggcGxhdGZvcm0uIEFuZAorCSAqIHRoZXJlIGlzIG5vIFZDUzIgcmluZyBvbiB0aGUgcHJlLWdlbjggcGxhdGZvcm0uIFNvIHRoZSBzZW1hcGhvcmUKKwkgKiBiZXR3ZWVuIEJDUyBhbmQgVkNTMiBpcyBpbml0aWFsaXplZCBhcyBJTlZBTElELgorCSAqIEdlbjggd2lsbCBpbml0aWFsaXplIHRoZSBzZW1hIGJldHdlZW4gQkNTIGFuZCBWQ1MyIGxhdGVyLgorCSAqLworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbUkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0JSOworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbVkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0JWOworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbQkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQ7CisJcmluZy0+c2VtYXBob3JlLm1ib3gud2FpdFtWRUNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0JWRTsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZDUzJdID0gTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRDsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbUkNTXSA9IEdFTjZfUkJTWU5DOworCXJpbmctPnNlbWFwaG9yZS5tYm94LnNpZ25hbFtWQ1NdID0gR0VONl9WQlNZTkM7CisJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW0JDU10gPSBHRU42X05PU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkVDU10gPSBHRU42X1ZFQlNZTkM7CisJcmluZy0+c2VtYXBob3JlLm1ib3guc2lnbmFsW1ZDUzJdID0gR0VONl9OT1NZTkM7CiAJcmluZy0+aW5pdCA9IGluaXRfcmluZ19jb21tb247CiAKIAlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOwpAQCAtMjE3MCw3ICsyMzA5LDcgQEAKIGludCBpbnRlbF9pbml0X3ZlYm94X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbVkVDU107CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tWRUNTXTsKIAogCXJpbmctPm5hbWUgPSAidmlkZW8gZW5oYW5jZW1lbnQgcmluZyI7CiAJcmluZy0+aWQgPSBWRUNTOwpAQCAtMjE5NCwyMiArMjMzMywyNSBAQAogCQlyaW5nLT5pcnFfcHV0ID0gaHN3X3ZlYm94X3B1dF9pcnE7CiAJCXJpbmctPmRpc3BhdGNoX2V4ZWNidWZmZXIgPSBnZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcjsKIAl9Ci0JcmluZy0+c3luY190byA9IGdlbjZfcmluZ19zeW5jOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltSQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVkVSOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVkVWOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltCQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVkVCOwotCXJpbmctPnNlbWFwaG9yZV9yZWdpc3RlcltWRUNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQ7Ci0JcmluZy0+c2lnbmFsX21ib3hbUkNTXSA9IEdFTjZfUlZFU1lOQzsKLQlyaW5nLT5zaWduYWxfbWJveFtWQ1NdID0gR0VONl9WVkVTWU5DOwotCXJpbmctPnNpZ25hbF9tYm94W0JDU10gPSBHRU42X0JWRVNZTkM7Ci0JcmluZy0+c2lnbmFsX21ib3hbVkVDU10gPSBHRU42X05PU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUuc3luY190byA9IGdlbjZfcmluZ19zeW5jOworCXJpbmctPnNlbWFwaG9yZS5zaWduYWwgPSBnZW42X3NpZ25hbDsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1JDU10gPSBNSV9TRU1BUEhPUkVfU1lOQ19WRVI7CisJcmluZy0+c2VtYXBob3JlLm1ib3gud2FpdFtWQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfVkVWOworCXJpbmctPnNlbWFwaG9yZS5tYm94LndhaXRbQkNTXSA9IE1JX1NFTUFQSE9SRV9TWU5DX1ZFQjsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZFQ1NdID0gTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRDsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC53YWl0W1ZDUzJdID0gTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRDsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbUkNTXSA9IEdFTjZfUlZFU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkNTXSA9IEdFTjZfVlZFU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbQkNTXSA9IEdFTjZfQlZFU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkVDU10gPSBHRU42X05PU1lOQzsKKwlyaW5nLT5zZW1hcGhvcmUubWJveC5zaWduYWxbVkNTMl0gPSBHRU42X05PU1lOQzsKIAlyaW5nLT5pbml0ID0gaW5pdF9yaW5nX2NvbW1vbjsKIAogCXJldHVybiBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKGRldiwgcmluZyk7CiB9CiAKIGludAotaW50ZWxfcmluZ19mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2ludGVsX3JpbmdfZmx1c2hfYWxsX2NhY2hlcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCWludCByZXQ7CiAKQEAgLTIyMjcsNyArMjM2OSw3IEBACiB9CiAKIGludAotaW50ZWxfcmluZ19pbnZhbGlkYXRlX2FsbF9jYWNoZXMoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoraW50ZWxfcmluZ19pbnZhbGlkYXRlX2FsbF9jYWNoZXMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKIAl1aW50MzJfdCBmbHVzaF9kb21haW5zOwogCWludCByZXQ7CkBAIC0yMjQ1LDMgKzIzODcsMTkgQEAKIAlyaW5nLT5ncHVfY2FjaGVzX2RpcnR5ID0gZmFsc2U7CiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQKK2ludGVsX3N0b3BfcmluZ19idWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKK3sKKwlpbnQgcmV0OworCisJaWYgKCFpbnRlbF9yaW5nX2luaXRpYWxpemVkKHJpbmcpKQorCQlyZXR1cm47CisKKwlyZXQgPSBpbnRlbF9yaW5nX2lkbGUocmluZyk7CisJaWYgKHJldCAmJiAhaTkxNV9yZXNldF9pbl9wcm9ncmVzcygmdG9faTkxNShyaW5nLT5kZXYpLT5ncHVfZXJyb3IpKQorCQlEUk1fRVJST1IoImZhaWxlZCB0byBxdWllc2NlICVzIHdoaWxzdCBjbGVhbmluZyB1cDogJWRcbiIsCisJCQkgIHJpbmctPm5hbWUsIHJldCk7CisKKwlzdG9wX3JpbmcocmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKaW5kZXggMmI5MWM0Yi4uOTEwYzgzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaApAQCAtMSw2ICsxLDEwIEBACiAjaWZuZGVmIF9JTlRFTF9SSU5HQlVGRkVSX0hfCiAjZGVmaW5lIF9JTlRFTF9SSU5HQlVGRkVSX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KKworI2RlZmluZSBJOTE1X0NNRF9IQVNIX09SREVSIDkKKwogLyoKICAqIEdlbjIgQlNwZWMgIjEuIFByb2dyYW1taW5nIEVudmlyb25tZW50IiAvIDEuNC40LjYgIlJpbmcgQnVmZmVyIFVzZSIKICAqIEdlbjMgQlNwZWMgInZvbDFjIE1lbW9yeSBJbnRlcmZhY2UgRnVuY3Rpb25zIiAvIDIuMy40LjUgIlJpbmcgQnVmZmVyIFVzZSIKQEAgLTU0LDI2ICs1OCwxNSBAQAogCWJvb2wgZGVhZGxvY2s7CiB9OwogCi1zdHJ1Y3QgIGludGVsX3JpbmdfYnVmZmVyIHsKLQljb25zdCBjaGFyCSpuYW1lOwotCWVudW0gaW50ZWxfcmluZ19pZCB7Ci0JCVJDUyA9IDB4MCwKLQkJVkNTLAotCQlCQ1MsCi0JCVZFQ1MsCi0JfSBpZDsKLSNkZWZpbmUgSTkxNV9OVU1fUklOR1MgNAotCXUzMgkJbW1pb19iYXNlOwotCXZvaWQJCV9faW9tZW0gKnZpcnR1YWxfc3RhcnQ7Ci0Jc3RydWN0CQlkcm1fZGV2aWNlICpkZXY7Ci0Jc3RydWN0CQlkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CitzdHJ1Y3QgaW50ZWxfcmluZ2J1ZmZlciB7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl2b2lkIF9faW9tZW0gKnZpcnR1YWxfc3RhcnQ7CiAKLQl1MzIJCWhlYWQ7Ci0JdTMyCQl0YWlsOwotCWludAkJc3BhY2U7Ci0JaW50CQlzaXplOwotCWludAkJZWZmZWN0aXZlX3NpemU7Ci0Jc3RydWN0IGludGVsX2h3X3N0YXR1c19wYWdlIHN0YXR1c19wYWdlOworCXUzMiBoZWFkOworCXUzMiB0YWlsOworCWludCBzcGFjZTsKKwlpbnQgc2l6ZTsKKwlpbnQgZWZmZWN0aXZlX3NpemU7CiAKIAkvKiogV2UgdHJhY2sgdGhlIHBvc2l0aW9uIG9mIHRoZSByZXF1ZXN0cyBpbiB0aGUgcmluZyBidWZmZXIsIGFuZAogCSAqIHdoZW4gZWFjaCBpcyByZXRpcmVkIHdlIGluY3JlbWVudCBsYXN0X3JldGlyZWRfaGVhZCBhcyB0aGUgR1BVCkBAIC04Myw0NyArNzYsNzUgQEAKIAkgKiBsYXN0X3JldGlyZWRfaGVhZCBpcyBzZXQgdG8gLTEgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNvbnN1bWVkIHNvCiAJICogd2UgY2FuIGRldGVjdCBuZXcgcmV0aXJlbWVudHMuCiAJICovCi0JdTMyCQlsYXN0X3JldGlyZWRfaGVhZDsKKwl1MzIgbGFzdF9yZXRpcmVkX2hlYWQ7Cit9OworCitzdHJ1Y3QgIGludGVsX2VuZ2luZV9jcyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwllbnVtIGludGVsX3JpbmdfaWQgeworCQlSQ1MgPSAweDAsCisJCVZDUywKKwkJQkNTLAorCQlWRUNTLAorCQlWQ1MyCisJfSBpZDsKKyNkZWZpbmUgSTkxNV9OVU1fUklOR1MgNQorI2RlZmluZSBMQVNUX1VTRVJfUklORyAoVkVDUyArIDEpCisJdTMyCQltbWlvX2Jhc2U7CisJc3RydWN0CQlkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKmJ1ZmZlcjsKKworCXN0cnVjdCBpbnRlbF9od19zdGF0dXNfcGFnZSBzdGF0dXNfcGFnZTsKIAogCXVuc2lnbmVkIGlycV9yZWZjb3VudDsgLyogcHJvdGVjdGVkIGJ5IGRldl9wcml2LT5pcnFfbG9jayAqLwogCXUzMgkJaXJxX2VuYWJsZV9tYXNrOwkvKiBiaXRtYXNrIHRvIGVuYWJsZSByaW5nIGludGVycnVwdCAqLwogCXUzMgkJdHJhY2VfaXJxX3NlcW5vOwotCXUzMgkJc3luY19zZXFub1tJOTE1X05VTV9SSU5HUy0xXTsKLQlib29sIF9fbXVzdF9jaGVjayAoKmlycV9nZXQpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Ci0Jdm9pZAkJKCppcnFfcHV0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCWJvb2wgX19tdXN0X2NoZWNrICgqaXJxX2dldCkoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CisJdm9pZAkJKCppcnFfcHV0KShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKIAotCWludAkJKCppbml0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCWludAkJKCppbml0KShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKIAotCXZvaWQJCSgqd3JpdGVfdGFpbCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCXZvaWQJCSgqd3JpdGVfdGFpbCkoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCQkgICAgICB1MzIgdmFsdWUpOwotCWludCBfX211c3RfY2hlY2sgKCpmbHVzaCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCWludCBfX211c3RfY2hlY2sgKCpmbHVzaCkoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCQkgIHUzMglpbnZhbGlkYXRlX2RvbWFpbnMsCiAJCQkJICB1MzIJZmx1c2hfZG9tYWlucyk7Ci0JaW50CQkoKmFkZF9yZXF1ZXN0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCWludAkJKCphZGRfcmVxdWVzdCkoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAJLyogU29tZSBjaGlwc2V0cyBhcmUgbm90IHF1aXRlIGFzIGNvaGVyZW50IGFzIGFkdmVydGlzZWQgYW5kIG5lZWQKIAkgKiBhbiBleHBlbnNpdmUga2ljayB0byBmb3JjZSBhIHRydWUgcmVhZCBvZiB0aGUgdXAtdG8tZGF0ZSBzZXFuby4KIAkgKiBIb3dldmVyLCB0aGUgdXAtdG8tZGF0ZSBzZXFubyBpcyBub3QgYWx3YXlzIHJlcXVpcmVkIGFuZCB0aGUgbGFzdAogCSAqIHNlZW4gdmFsdWUgaXMgZ29vZCBlbm91Z2guIE5vdGUgdGhhdCB0aGUgc2Vxbm8gd2lsbCBhbHdheXMgYmUKIAkgKiBtb25vdG9uaWMsIGV2ZW4gaWYgbm90IGNvaGVyZW50LgogCSAqLwotCXUzMgkJKCpnZXRfc2Vxbm8pKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwl1MzIJCSgqZ2V0X3NlcW5vKShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkJCSAgICAgYm9vbCBsYXp5X2NvaGVyZW5jeSk7Ci0Jdm9pZAkJKCpzZXRfc2Vxbm8pKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwl2b2lkCQkoKnNldF9zZXFubykoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCQkgICAgIHUzMiBzZXFubyk7Ci0JaW50CQkoKmRpc3BhdGNoX2V4ZWNidWZmZXIpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgsCisJaW50CQkoKmRpc3BhdGNoX2V4ZWNidWZmZXIpKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCisJCQkJCSAgICAgICB1NjQgb2Zmc2V0LCB1MzIgbGVuZ3RoLAogCQkJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MpOwogI2RlZmluZSBJOTE1X0RJU1BBVENIX1NFQ1VSRSAweDEKICNkZWZpbmUgSTkxNV9ESVNQQVRDSF9QSU5ORUQgMHgyCi0Jdm9pZAkJKCpjbGVhbnVwKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotCWludAkJKCpzeW5jX3RvKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp0bywKLQkJCQkgICB1MzIgc2Vxbm8pOworCXZvaWQJCSgqY2xlYW51cCkoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAKLQkvKiBvdXIgbWJveCB3cml0dGVuIGJ5IG90aGVycyAqLwotCXUzMgkJc2VtYXBob3JlX3JlZ2lzdGVyW0k5MTVfTlVNX1JJTkdTXTsKLQkvKiBtYm94ZXMgdGhpcyByaW5nIHNpZ25hbHMgdG8gKi8KLQl1MzIJCXNpZ25hbF9tYm94W0k5MTVfTlVNX1JJTkdTXTsKKwlzdHJ1Y3QgeworCQl1MzIJc3luY19zZXFub1tJOTE1X05VTV9SSU5HUy0xXTsKKworCQlzdHJ1Y3QgeworCQkJLyogb3VyIG1ib3ggd3JpdHRlbiBieSBvdGhlcnMgKi8KKwkJCXUzMgkJd2FpdFtJOTE1X05VTV9SSU5HU107CisJCQkvKiBtYm94ZXMgdGhpcyByaW5nIHNpZ25hbHMgdG8gKi8KKwkJCXUzMgkJc2lnbmFsW0k5MTVfTlVNX1JJTkdTXTsKKwkJfSBtYm94OworCisJCS8qIEFLQSB3YWl0KCkgKi8KKwkJaW50CSgqc3luY190bykoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKKwkJCQkgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICp0bywKKwkJCQkgICB1MzIgc2Vxbm8pOworCQlpbnQJKCpzaWduYWwpKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNpZ25hbGxlciwKKwkJCQkgIC8qIG51bV9kd29yZHMgbmVlZGVkIGJ5IGNhbGxlciAqLworCQkJCSAgdW5zaWduZWQgaW50IG51bV9kd29yZHMpOworCX0gc2VtYXBob3JlOwogCiAJLyoqCiAJICogTGlzdCBvZiBvYmplY3RzIGN1cnJlbnRseSBpbnZvbHZlZCBpbiByZW5kZXJpbmcgZnJvbSB0aGUKQEAgLTE1MywxMiArMTc0LDggQEAKIAogCXdhaXRfcXVldWVfaGVhZF90IGlycV9xdWV1ZTsKIAotCS8qKgotCSAqIERvIGFuIGV4cGxpY2l0IFRMQiBmbHVzaCBiZWZvcmUgTUlfU0VUX0NPTlRFWFQKLQkgKi8KLQlib29sIGl0bGJfYmVmb3JlX2N0eF9zd2l0Y2g7Ci0Jc3RydWN0IGk5MTVfaHdfY29udGV4dCAqZGVmYXVsdF9jb250ZXh0OwotCXN0cnVjdCBpOTE1X2h3X2NvbnRleHQgKmxhc3RfY29udGV4dDsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqZGVmYXVsdF9jb250ZXh0OworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpsYXN0X2NvbnRleHQ7CiAKIAlzdHJ1Y3QgaW50ZWxfcmluZ19oYW5nY2hlY2sgaGFuZ2NoZWNrOwogCkBAIC0xNjgsMTIgKzE4NSwxMyBAQAogCQl2b2xhdGlsZSB1MzIgKmNwdV9wYWdlOwogCX0gc2NyYXRjaDsKIAorCWJvb2wgbmVlZHNfY21kX3BhcnNlcjsKKwogCS8qCi0JICogVGFibGVzIG9mIGNvbW1hbmRzIHRoZSBjb21tYW5kIHBhcnNlciBuZWVkcyB0byBrbm93IGFib3V0CisJICogVGFibGUgb2YgY29tbWFuZHMgdGhlIGNvbW1hbmQgcGFyc2VyIG5lZWRzIHRvIGtub3cgYWJvdXQKIAkgKiBmb3IgdGhpcyByaW5nLgogCSAqLwotCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgKmNtZF90YWJsZXM7Ci0JaW50IGNtZF90YWJsZV9jb3VudDsKKwlERUNMQVJFX0hBU0hUQUJMRShjbWRfaGFzaCwgSTkxNV9DTURfSEFTSF9PUkRFUik7CiAKIAkvKgogCSAqIFRhYmxlIG9mIHJlZ2lzdGVycyBhbGxvd2VkIGluIGNvbW1hbmRzIHRoYXQgcmVhZC93cml0ZSByZWdpc3RlcnMuCkBAIC0yMDIsMjAgKzIyMCwyMCBAQAogfTsKIAogc3RhdGljIGlubGluZSBib29sCi1pbnRlbF9yaW5nX2luaXRpYWxpemVkKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2ludGVsX3JpbmdfaW5pdGlhbGl6ZWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQlyZXR1cm4gcmluZy0+b2JqICE9IE5VTEw7CisJcmV0dXJuIHJpbmctPmJ1ZmZlciAmJiByaW5nLT5idWZmZXItPm9iajsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZAotaW50ZWxfcmluZ19mbGFnKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK2ludGVsX3JpbmdfZmxhZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewogCXJldHVybiAxIDw8IHJpbmctPmlkOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMgotaW50ZWxfcmluZ19zeW5jX2luZGV4KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpvdGhlcikKK2ludGVsX3Jpbmdfc3luY19pbmRleChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAorCQkgICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpvdGhlcikKIHsKIAlpbnQgaWR4OwogCkBAIC0yMzMsNyArMjUxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB1MzIKLWludGVsX3JlYWRfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAoraW50ZWxfcmVhZF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAogCQkgICAgICAgaW50IHJlZykKIHsKIAkvKiBFbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZSBhd2F5IHRoZSBsb2FkLiAqLwpAQCAtMjQyLDcgKzI2MCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotaW50ZWxfd3JpdGVfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAoraW50ZWxfd3JpdGVfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJCWludCByZWcsIHUzMiB2YWx1ZSkKIHsKIAlyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHJbcmVnXSA9IHZhbHVlOwpAQCAtMjY3LDQ3ICsyODUsNTEgQEAKICNkZWZpbmUgSTkxNV9HRU1fSFdTX1NDUkFUQ0hfSU5ERVgJMHgzMAogI2RlZmluZSBJOTE1X0dFTV9IV1NfU0NSQVRDSF9BRERSIChJOTE1X0dFTV9IV1NfU0NSQVRDSF9JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCkKIAotdm9pZCBpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGludGVsX3N0b3BfcmluZ19idWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7Cit2b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAKLWludCBfX211c3RfY2hlY2sgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKLWludCBfX211c3RfY2hlY2sgaW50ZWxfcmluZ19jYWNoZWxpbmVfYWxpZ24oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9yaW5nX2VtaXQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAoraW50IF9fbXVzdF9jaGVjayBpbnRlbF9yaW5nX2JlZ2luKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIGludCBuKTsKK2ludCBfX211c3RfY2hlY2sgaW50ZWxfcmluZ19jYWNoZWxpbmVfYWxpZ24oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfcmluZ19lbWl0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiAJCQkJICAgdTMyIGRhdGEpCiB7Ci0JaW93cml0ZTMyKGRhdGEsIHJpbmctPnZpcnR1YWxfc3RhcnQgKyByaW5nLT50YWlsKTsKLQlyaW5nLT50YWlsICs9IDQ7CisJc3RydWN0IGludGVsX3JpbmdidWZmZXIgKnJpbmdidWYgPSByaW5nLT5idWZmZXI7CisJaW93cml0ZTMyKGRhdGEsIHJpbmdidWYtPnZpcnR1YWxfc3RhcnQgKyByaW5nYnVmLT50YWlsKTsKKwlyaW5nYnVmLT50YWlsICs9IDQ7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9yaW5nX2FkdmFuY2Uoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKIHsKLQlyaW5nLT50YWlsICY9IHJpbmctPnNpemUgLSAxOworCXN0cnVjdCBpbnRlbF9yaW5nYnVmZmVyICpyaW5nYnVmID0gcmluZy0+YnVmZmVyOworCXJpbmdidWYtPnRhaWwgJj0gcmluZ2J1Zi0+c2l6ZSAtIDE7CiB9Ci12b2lkIF9faW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIF9faW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOwogCi1pbnQgX19tdXN0X2NoZWNrIGludGVsX3JpbmdfaWRsZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9yaW5nX2luaXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pOwotaW50IGludGVsX3JpbmdfZmx1c2hfYWxsX2NhY2hlcyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotaW50IGludGVsX3JpbmdfaW52YWxpZGF0ZV9hbGxfY2FjaGVzKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CitpbnQgX19tdXN0X2NoZWNrIGludGVsX3JpbmdfaWRsZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKK3ZvaWQgaW50ZWxfcmluZ19pbml0X3NlcW5vKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIHUzMiBzZXFubyk7CitpbnQgaW50ZWxfcmluZ19mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOworaW50IGludGVsX3JpbmdfaW52YWxpZGF0ZV9hbGxfY2FjaGVzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpOwogCiBpbnQgaW50ZWxfaW5pdF9yZW5kZXJfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaW50ZWxfaW5pdF9ic2RfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaW50ZWxfaW5pdF9ic2QyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYmx0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfdmVib3hfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLXU2NCBpbnRlbF9yaW5nX2dldF9hY3RpdmVfaGVhZChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit1NjQgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7Cit2b2lkIGludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZyk7CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGludGVsX3JpbmdfZ2V0X3RhaWwoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGlubGluZSB1MzIgaW50ZWxfcmluZ19nZXRfdGFpbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKQogewotCXJldHVybiByaW5nLT50YWlsOworCXJldHVybiByaW5nLT5idWZmZXItPnRhaWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGludGVsX3JpbmdfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbmxpbmUgdTMyIGludGVsX3JpbmdfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcpCiB7CiAJQlVHX09OKHJpbmctPm91dHN0YW5kaW5nX2xhenlfc2Vxbm8gPT0gMCk7CiAJcmV0dXJuIHJpbmctPm91dHN0YW5kaW5nX2xhenlfc2Vxbm87CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3RyYWNlX2lycV9nZXQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pCitzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV90cmFjZV9pcnFfZ2V0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsIHUzMiBzZXFubykKIHsKIAlpZiAocmluZy0+dHJhY2VfaXJxX3NlcW5vID09IDAgJiYgcmluZy0+aXJxX2dldChyaW5nKSkKIAkJcmluZy0+dHJhY2VfaXJxX3NlcW5vID0gc2Vxbm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNDZiZTAwZC4uNmE0ZDViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMTE1MywyMCArMTE1MywyMSBAQAogCXBpcGVfY29uZmlnLT5waXhlbF9tdWx0aXBsaWVyID0KIAkJaW50ZWxfc2R2b19nZXRfcGl4ZWxfbXVsdGlwbGllcihhZGp1c3RlZF9tb2RlKTsKIAorCXBpcGVfY29uZmlnLT5oYXNfaGRtaV9zaW5rID0gaW50ZWxfc2R2by0+aGFzX2hkbWlfbW9uaXRvcjsKKwogCWlmIChpbnRlbF9zZHZvLT5jb2xvcl9yYW5nZV9hdXRvKSB7CiAJCS8qIFNlZSBDRUEtODYxLUUgLSA1LjEgRGVmYXVsdCBFbmNvZGluZyBQYXJhbWV0ZXJzICovCiAJCS8qIEZJWE1FOiBUaGlzIGJpdCBpcyBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgVE1EUyBlbmNvZGluZyBhbmQgOAogCQkgKiBiaXQgcGVyIGNvbG9yIG1vZGUuICovCi0JCWlmIChpbnRlbF9zZHZvLT5oYXNfaGRtaV9tb25pdG9yICYmCisJCWlmIChwaXBlX2NvbmZpZy0+aGFzX2hkbWlfc2luayAmJgogCQkgICAgZHJtX21hdGNoX2NlYV9tb2RlKGFkanVzdGVkX21vZGUpID4gMSkKLQkJCWludGVsX3Nkdm8tPmNvbG9yX3JhbmdlID0gSERNSV9DT0xPUl9SQU5HRV8xNl8yMzU7Ci0JCWVsc2UKLQkJCWludGVsX3Nkdm8tPmNvbG9yX3JhbmdlID0gMDsKKwkJCXBpcGVfY29uZmlnLT5saW1pdGVkX2NvbG9yX3JhbmdlID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAocGlwZV9jb25maWctPmhhc19oZG1pX3NpbmsgJiYKKwkJICAgIGludGVsX3Nkdm8tPmNvbG9yX3JhbmdlID09IEhETUlfQ09MT1JfUkFOR0VfMTZfMjM1KQorCQkJcGlwZV9jb25maWctPmxpbWl0ZWRfY29sb3JfcmFuZ2UgPSB0cnVlOwogCX0KIAotCWlmIChpbnRlbF9zZHZvLT5jb2xvcl9yYW5nZSkKLQkJcGlwZV9jb25maWctPmxpbWl0ZWRfY29sb3JfcmFuZ2UgPSB0cnVlOwotCiAJLyogQ2xvY2sgY29tcHV0YXRpb24gbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHBpeGVsIG11bHRpcGxpZXIuICovCiAJaWYgKGludGVsX3Nkdm8tPmlzX3R2KQogCQlpOXh4X2FkanVzdF9zZHZvX3R2X2Nsb2NrKHBpcGVfY29uZmlnKTsKQEAgLTExNzQsNyArMTE3NSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX3Nkdm9fbW9kZV9zZXQoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIpCitzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX3ByZV9lbmFibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2VuY29kZXItPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjIzLDcgKzEyMjQsNyBAQAogCWlmICghaW50ZWxfc2R2b19zZXRfdGFyZ2V0X2lucHV0KGludGVsX3Nkdm8pKQogCQlyZXR1cm47CiAKLQlpZiAoaW50ZWxfc2R2by0+aGFzX2hkbWlfbW9uaXRvcikgeworCWlmIChjcnRjLT5jb25maWcuaGFzX2hkbWlfc2luaykgewogCQlpbnRlbF9zZHZvX3NldF9lbmNvZGUoaW50ZWxfc2R2bywgU0RWT19FTkNPREVfSERNSSk7CiAJCWludGVsX3Nkdm9fc2V0X2NvbG9yaW1ldHJ5KGludGVsX3Nkdm8sCiAJCQkJCSAgIFNEVk9fQ09MT1JJTUVUUllfUkdCMjU2KTsKQEAgLTEyNTgsOCArMTI1OSw4IEBACiAJCS8qIFRoZSByZWFsIG1vZGUgcG9sYXJpdHkgaXMgc2V0IGJ5IHRoZSBTRFZPIGNvbW1hbmRzLCB1c2luZwogCQkgKiBzdHJ1Y3QgaW50ZWxfc2R2b19kdGQuICovCiAJCXNkdm94ID0gU0RWT19WU1lOQ19BQ1RJVkVfSElHSCB8IFNEVk9fSFNZTkNfQUNUSVZFX0hJR0g7Ci0JCWlmICghSEFTX1BDSF9TUExJVChkZXYpICYmIGludGVsX3Nkdm8tPmlzX2hkbWkpCi0JCQlzZHZveCB8PSBpbnRlbF9zZHZvLT5jb2xvcl9yYW5nZTsKKwkJaWYgKCFIQVNfUENIX1NQTElUKGRldikgJiYgY3J0Yy0+Y29uZmlnLmxpbWl0ZWRfY29sb3JfcmFuZ2UpCisJCQlzZHZveCB8PSBIRE1JX0NPTE9SX1JBTkdFXzE2XzIzNTsKIAkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNSkKIAkJCXNkdm94IHw9IFNEVk9fQk9SREVSX0VOQUJMRTsKIAl9IGVsc2UgewpAQCAtMTM0OSw2ICsxMzUwLDggQEAKIAl1OCB2YWw7CiAJYm9vbCByZXQ7CiAKKwlzZHZveCA9IEk5MTVfUkVBRChpbnRlbF9zZHZvLT5zZHZvX3JlZyk7CisKIAlyZXQgPSBpbnRlbF9zZHZvX2dldF9pbnB1dF90aW1pbmcoaW50ZWxfc2R2bywgJmR0ZCk7CiAJaWYgKCFyZXQpIHsKIAkJLyogU29tZSBzZHZvIGVuY29kZXJzIGFyZSBub3Qgc3BlYyBjb21wbGlhbnQgYW5kIGRvbid0CkBAIC0xMzc3LDcgKzEzODAsNiBAQAogCSAqIG90aGVyIHBsYXRmcm9tcy4KIAkgKi8KIAlpZiAoSVNfSTkxNUcoZGV2KSB8fCBJU19JOTE1R00oZGV2KSkgewotCQlzZHZveCA9IEk5MTVfUkVBRChpbnRlbF9zZHZvLT5zZHZvX3JlZyk7CiAJCXBpcGVfY29uZmlnLT5waXhlbF9tdWx0aXBsaWVyID0KIAkJCSgoc2R2b3ggJiBTRFZPX1BPUlRfTVVMVElQTFlfTUFTSykKIAkJCSA+PiBTRFZPX1BPUlRfTVVMVElQTFlfU0hJRlQpICsgMTsKQEAgLTE0MDYsNiArMTQwOCwxNSBAQAogCQl9CiAJfQogCisJaWYgKHNkdm94ICYgSERNSV9DT0xPUl9SQU5HRV8xNl8yMzUpCisJCXBpcGVfY29uZmlnLT5saW1pdGVkX2NvbG9yX3JhbmdlID0gdHJ1ZTsKKworCWlmIChpbnRlbF9zZHZvX2dldF92YWx1ZShpbnRlbF9zZHZvLCBTRFZPX0NNRF9HRVRfRU5DT0RFLAorCQkJCSAmdmFsLCAxKSkgeworCQlpZiAodmFsID09IFNEVk9fRU5DT0RFX0hETUkpCisJCQlwaXBlX2NvbmZpZy0+aGFzX2hkbWlfc2luayA9IHRydWU7CisJfQorCiAJV0FSTihlbmNvZGVyX3BpeGVsX211bHRpcGxpZXIgIT0gcGlwZV9jb25maWctPnBpeGVsX211bHRpcGxpZXIsCiAJICAgICAiU0RWTyBwaXhlbCBtdWx0aXBsaWVyIG1pc21hdGNoLCBwb3J0OiAlaSwgZW5jb2RlcjogJWlcbiIsCiAJICAgICBwaXBlX2NvbmZpZy0+cGl4ZWxfbXVsdGlwbGllciwgZW5jb2Rlcl9waXhlbF9tdWx0aXBsaWVyKTsKQEAgLTE3MzIsNyArMTc0Myw3IEBACiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyByZXQ7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXVxuIiwKLQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSk7CiAKIAlpZiAoIWludGVsX3Nkdm9fZ2V0X3ZhbHVlKGludGVsX3Nkdm8sCiAJCQkJICBTRFZPX0NNRF9HRVRfQVRUQUNIRURfRElTUExBWVMsCkBAIC0xNzk0LDcgKzE4MDUsNyBAQAogCXN0cnVjdCBlZGlkICplZGlkOwogCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsCi0JCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0b3ItPm5hbWUpOwogCiAJLyogc2V0IHRoZSBidXMgc3dpdGNoIGFuZCBnZXQgdGhlIG1vZGVzICovCiAJZWRpZCA9IGludGVsX3Nkdm9fZ2V0X2VkaWQoY29ubmVjdG9yKTsKQEAgLTE4OTIsNyArMTkwMyw3IEBACiAJaW50IGk7CiAKIAlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXVxuIiwKLQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSk7CiAKIAkvKiBSZWFkIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBpbnB1dCByZXNvbHV0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIFRWCiAJICogZm9ybWF0LgpAQCAtMTkyOSw3ICsxOTQwLDcgQEAKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKIAogCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdXG4iLAotCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgY29ubmVjdG9yLT5uYW1lKTsKIAogCS8qCiAJICogRmV0Y2ggbW9kZXMgZnJvbSBWQlQuIEZvciBTRFZPIHByZWZlciB0aGUgVkJUIG1vZGUgc2luY2Ugc29tZQpAQCAtMjk5OSw3ICszMDEwLDcgQEAKIAogCWludGVsX2VuY29kZXItPmNvbXB1dGVfY29uZmlnID0gaW50ZWxfc2R2b19jb21wdXRlX2NvbmZpZzsKIAlpbnRlbF9lbmNvZGVyLT5kaXNhYmxlID0gaW50ZWxfZGlzYWJsZV9zZHZvOwotCWludGVsX2VuY29kZXItPm1vZGVfc2V0ID0gaW50ZWxfc2R2b19tb2RlX3NldDsKKwlpbnRlbF9lbmNvZGVyLT5wcmVfZW5hYmxlID0gaW50ZWxfc2R2b19wcmVfZW5hYmxlOwogCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2VuYWJsZV9zZHZvOwogCWludGVsX2VuY29kZXItPmdldF9od19zdGF0ZSA9IGludGVsX3Nkdm9fZ2V0X2h3X3N0YXRlOwogCWludGVsX2VuY29kZXItPmdldF9jb25maWcgPSBpbnRlbF9zZHZvX2dldF9jb25maWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zaWRlYmFuZC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2lkZWJhbmQuYwppbmRleCAwOTU0ZjEzLi4wMWQ4NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zaWRlYmFuZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3NpZGViYW5kLmMKQEAgLTI5LDEyICsyOSwyMSBAQAogICogSU9TRiBzaWRlYmFuZCwgc2VlIFZMVjJfU2lkZWJhbmRNc2dfSEFTLmRvY3ggYW5kCiAgKiBWTFZfVkxWMl9QVU5JVF9IQVNfMC44LmRvY3gKICAqLworCisvKiBTdGFuZGFyZCBNTUlPIHJlYWQsIG5vbi1wb3N0ZWQgKi8KKyNkZWZpbmUgU0JfTVJEX05QCTB4MDAKKy8qIFN0YW5kYXJkIE1NSU8gd3JpdGUsIG5vbi1wb3N0ZWQgKi8KKyNkZWZpbmUgU0JfTVdSX05QCTB4MDEKKy8qIFByaXZhdGUgcmVnaXN0ZXIgcmVhZCwgZG91YmxlLXdvcmQgYWRkcmVzc2luZywgbm9uLXBvc3RlZCAqLworI2RlZmluZSBTQl9DUlJEREFfTlAJMHgwNgorLyogUHJpdmF0ZSByZWdpc3RlciB3cml0ZSwgZG91YmxlLXdvcmQgYWRkcmVzc2luZywgbm9uLXBvc3RlZCAqLworI2RlZmluZSBTQl9DUldSREFfTlAJMHgwNworCiBzdGF0aWMgaW50IHZsdl9zaWRlYmFuZF9ydyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiBkZXZmbiwKIAkJCSAgIHUzMiBwb3J0LCB1MzIgb3Bjb2RlLCB1MzIgYWRkciwgdTMyICp2YWwpCiB7CiAJdTMyIGNtZCwgYmUgPSAweGYsIGJhciA9IDA7Ci0JYm9vbCBpc19yZWFkID0gKG9wY29kZSA9PSBQVU5JVF9PUENPREVfUkVHX1JFQUQgfHwKLQkJCW9wY29kZSA9PSBEUElPX09QQ09ERV9SRUdfUkVBRCk7CisJYm9vbCBpc19yZWFkID0gKG9wY29kZSA9PSBTQl9NUkRfTlAgfHwgb3Bjb2RlID09IFNCX0NSUkREQV9OUCk7CiAKIAljbWQgPSAoZGV2Zm4gPDwgSU9TRl9ERVZGTl9TSElGVCkgfCAob3Bjb2RlIDw8IElPU0ZfT1BDT0RFX1NISUZUKSB8CiAJCShwb3J0IDw8IElPU0ZfUE9SVF9TSElGVCkgfCAoYmUgPDwgSU9TRl9CWVRFX0VOQUJMRVNfU0hJRlQpIHwKQEAgLTc0LDcgKzgzLDcgQEAKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfUFVOSVQsCi0JCQlQVU5JVF9PUENPREVfUkVHX1JFQUQsIGFkZHIsICZ2YWwpOworCQkJU0JfQ1JSRERBX05QLCBhZGRyLCAmdmFsKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCiAJcmV0dXJuIHZhbDsKQEAgLTg2LDcgKzk1LDcgQEAKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfUFVOSVQsCi0JCQlQVU5JVF9PUENPREVfUkVHX1dSSVRFLCBhZGRyLCAmdmFsKTsKKwkJCVNCX0NSV1JEQV9OUCwgYWRkciwgJnZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHBpb19sb2NrKTsKIH0KIApAQCAtOTUsNyArMTA0LDcgQEAKIAl1MzIgdmFsID0gMDsKIAogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfQlVOSVQsCi0JCQlQVU5JVF9PUENPREVfUkVHX1JFQUQsIHJlZywgJnZhbCk7CisJCQlTQl9DUlJEREFfTlAsIHJlZywgJnZhbCk7CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtMTAzLDcgKzExMiw3IEBACiB2b2lkIHZsdl9idW5pdF93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUzMiB2YWwpCiB7CiAJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBQQ0lfREVWRk4oMiwgMCksIElPU0ZfUE9SVF9CVU5JVCwKLQkJCVBVTklUX09QQ09ERV9SRUdfV1JJVEUsIHJlZywgJnZhbCk7CisJCQlTQl9DUldSREFfTlAsIHJlZywgJnZhbCk7CiB9CiAKIHUzMiB2bHZfbmNfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHU4IGFkZHIpCkBAIC0xMTQsNyArMTIzLDcgQEAKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfTkMsCi0JCQlQVU5JVF9PUENPREVfUkVHX1JFQUQsIGFkZHIsICZ2YWwpOworCQkJU0JfQ1JSRERBX05QLCBhZGRyLCAmdmFsKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kcGlvX2xvY2spOwogCiAJcmV0dXJuIHZhbDsKQEAgLTEyNCw1NiArMTMzLDU2IEBACiB7CiAJdTMyIHZhbCA9IDA7CiAJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBQQ0lfREVWRk4oMiwgMCksIElPU0ZfUE9SVF9HUElPX05DLAotCQkJUFVOSVRfT1BDT0RFX1JFR19SRUFELCByZWcsICZ2YWwpOworCQkJU0JfQ1JSRERBX05QLCByZWcsICZ2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKIHZvaWQgdmx2X2dwaW9fbmNfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKQogewogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfR1BJT19OQywKLQkJCVBVTklUX09QQ09ERV9SRUdfV1JJVEUsIHJlZywgJnZhbCk7CisJCQlTQl9DUldSREFfTlAsIHJlZywgJnZhbCk7CiB9CiAKIHUzMiB2bHZfY2NrX3JlYWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnKQogewogCXUzMiB2YWwgPSAwOwogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfQ0NLLAotCQkJUFVOSVRfT1BDT0RFX1JFR19SRUFELCByZWcsICZ2YWwpOworCQkJU0JfQ1JSRERBX05QLCByZWcsICZ2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKIHZvaWQgdmx2X2Nja193cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUzMiB2YWwpCiB7CiAJdmx2X3NpZGViYW5kX3J3KGRldl9wcml2LCBQQ0lfREVWRk4oMiwgMCksIElPU0ZfUE9SVF9DQ0ssCi0JCQlQVU5JVF9PUENPREVfUkVHX1dSSVRFLCByZWcsICZ2YWwpOworCQkJU0JfQ1JXUkRBX05QLCByZWcsICZ2YWwpOwogfQogCiB1MzIgdmx2X2NjdV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykKIHsKIAl1MzIgdmFsID0gMDsKIAl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIFBDSV9ERVZGTigyLCAwKSwgSU9TRl9QT1JUX0NDVSwKLQkJCVBVTklUX09QQ09ERV9SRUdfUkVBRCwgcmVnLCAmdmFsKTsKKwkJCVNCX0NSUkREQV9OUCwgcmVnLCAmdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCiB2b2lkIHZsdl9jY3Vfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKQogewogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgUENJX0RFVkZOKDIsIDApLCBJT1NGX1BPUlRfQ0NVLAotCQkJUFVOSVRfT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKKwkJCVNCX0NSV1JEQV9OUCwgcmVnLCAmdmFsKTsKIH0KIAogdTMyIHZsdl9ncHNfY29yZV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykKIHsKIAl1MzIgdmFsID0gMDsKIAl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIFBDSV9ERVZGTigyLCAwKSwgSU9TRl9QT1JUX0dQU19DT1JFLAotCQkJUFVOSVRfT1BDT0RFX1JFR19SRUFELCByZWcsICZ2YWwpOworCQkJU0JfQ1JSRERBX05QLCByZWcsICZ2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKIHZvaWQgdmx2X2dwc19jb3JlX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdTMyIHZhbCkKIHsKIAl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIFBDSV9ERVZGTigyLCAwKSwgSU9TRl9QT1JUX0dQU19DT1JFLAotCQkJUFVOSVRfT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKKwkJCVNCX0NSV1JEQV9OUCwgcmVnLCAmdmFsKTsKIH0KIAogdTMyIHZsdl9kcGlvX3JlYWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBlbnVtIHBpcGUgcGlwZSwgaW50IHJlZykKQEAgLTE4MSwxNCArMTkwLDIyIEBACiAJdTMyIHZhbCA9IDA7CiAKIAl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIERQSU9fREVWRk4sIERQSU9fUEhZX0lPU0ZfUE9SVChEUElPX1BIWShwaXBlKSksCi0JCQlEUElPX09QQ09ERV9SRUdfUkVBRCwgcmVnLCAmdmFsKTsKKwkJCVNCX01SRF9OUCwgcmVnLCAmdmFsKTsKKworCS8qCisJICogRklYTUU6IFRoZXJlIG1pZ2h0IGJlIHNvbWUgcmVnaXN0ZXJzIHdoZXJlIGFsbCAxJ3MgaXMgYSB2YWxpZCB2YWx1ZSwKKwkgKiBzbyBpZGVhbGx5IHdlIHNob3VsZCBjaGVjayB0aGUgcmVnaXN0ZXIgb2Zmc2V0IGluc3RlYWQuLi4KKwkgKi8KKwlXQVJOKHZhbCA9PSAweGZmZmZmZmZmLCAiRFBJTyByZWFkIHBpcGUgJWMgcmVnIDB4JXggPT0gMHgleFxuIiwKKwkgICAgIHBpcGVfbmFtZShwaXBlKSwgcmVnLCB2YWwpOworCiAJcmV0dXJuIHZhbDsKIH0KIAogdm9pZCB2bHZfZHBpb193cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGVudW0gcGlwZSBwaXBlLCBpbnQgcmVnLCB1MzIgdmFsKQogewogCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgRFBJT19ERVZGTiwgRFBJT19QSFlfSU9TRl9QT1JUKERQSU9fUEhZKHBpcGUpKSwKLQkJCURQSU9fT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKKwkJCVNCX01XUl9OUCwgcmVnLCAmdmFsKTsKIH0KIAogLyogU0JJIGFjY2VzcyAqLwpAQCAtMjUzLDEzICsyNzAsMTMgQEAKIHUzMiB2bHZfZmxpc2RzaV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykKIHsKIAl1MzIgdmFsID0gMDsKLQl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIERQSU9fREVWRk4sIElPU0ZfUE9SVF9GTElTRFNJLAotCQkJCQlEUElPX09QQ09ERV9SRUdfUkVBRCwgcmVnLCAmdmFsKTsKKwl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIERQSU9fREVWRk4sIElPU0ZfUE9SVF9GTElTRFNJLCBTQl9DUlJEREFfTlAsCisJCQlyZWcsICZ2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKIHZvaWQgdmx2X2ZsaXNkc2lfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1MzIgdmFsKQogewotCXZsdl9zaWRlYmFuZF9ydyhkZXZfcHJpdiwgRFBJT19ERVZGTiwgSU9TRl9QT1JUX0ZMSVNEU0ksCi0JCQkJCURQSU9fT1BDT0RFX1JFR19XUklURSwgcmVnLCAmdmFsKTsKKwl2bHZfc2lkZWJhbmRfcncoZGV2X3ByaXYsIERQSU9fREVWRk4sIElPU0ZfUE9SVF9GTElTRFNJLCBTQl9DUldSREFfTlAsCisJCQlyZWcsICZ2YWwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc3ByaXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwppbmRleCAzMzZhZTZjLi4xYjY2ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwpAQCAtMzcsNiArMzcsMTA2IEBACiAjaW5jbHVkZSA8ZHJtL2k5MTVfZHJtLmg+CiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAorc3RhdGljIGludCB1c2Vjc190b19zY2FubGluZXMoY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsIGludCB1c2VjcykKK3sKKwkvKiBwYXJhbm9pYSAqLworCWlmICghbW9kZS0+Y3J0Y19odG90YWwpCisJCXJldHVybiAxOworCisJcmV0dXJuIERJVl9ST1VORF9VUCh1c2VjcyAqIG1vZGUtPmNydGNfY2xvY2ssIDEwMDAgKiBtb2RlLT5jcnRjX2h0b3RhbCk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3BpcGVfdXBkYXRlX3N0YXJ0KHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLCB1aW50MzJfdCAqc3RhcnRfdmJsX2NvdW50KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKwljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjLT5jb25maWcuYWRqdXN0ZWRfbW9kZTsKKwllbnVtIHBpcGUgcGlwZSA9IGNydGMtPnBpcGU7CisJbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllc190aW1lb3V0KDEpOworCWludCBzY2FubGluZSwgbWluLCBtYXgsIHZibGFua19zdGFydDsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmY3J0Yy0+YmFzZS5tdXRleCkpOworCisJdmJsYW5rX3N0YXJ0ID0gbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQ7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCXZibGFua19zdGFydCA9IERJVl9ST1VORF9VUCh2Ymxhbmtfc3RhcnQsIDIpOworCisJLyogRklYTUUgbmVlZHMgdG8gYmUgY2FsaWJyYXRlZCBzZW5zaWJseSAqLworCW1pbiA9IHZibGFua19zdGFydCAtIHVzZWNzX3RvX3NjYW5saW5lcyhtb2RlLCAxMDApOworCW1heCA9IHZibGFua19zdGFydCAtIDE7CisKKwlpZiAobWluIDw9IDAgfHwgbWF4IDw9IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmIChXQVJOX09OKGRybV92YmxhbmtfZ2V0KGRldiwgcGlwZSkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJdHJhY2VfaTkxNV9waXBlX3VwZGF0ZV9zdGFydChjcnRjLCBtaW4sIG1heCk7CisKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIHByZXBhcmVfdG9fd2FpdCgpIGhhcyBhIG1lbW9yeSBiYXJyaWVyLCB3aGljaCBndWFyYW50ZWVzCisJCSAqIG90aGVyIENQVXMgY2FuIHNlZSB0aGUgdGFzayBzdGF0ZSB1cGRhdGUgYnkgdGhlIHRpbWUgd2UKKwkJICogcmVhZCB0aGUgc2NhbmxpbmUuCisJCSAqLworCQlwcmVwYXJlX3RvX3dhaXQoJmNydGMtPnZibF93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCXNjYW5saW5lID0gaW50ZWxfZ2V0X2NydGNfc2NhbmxpbmUoY3J0Yyk7CisJCWlmIChzY2FubGluZSA8IG1pbiB8fCBzY2FubGluZSA+IG1heCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCURSTV9FUlJPUigiUG90ZW50aWFsIGF0b21pYyB1cGRhdGUgZmFpbHVyZSBvbiBwaXBlICVjXG4iLAorCQkJCSAgcGlwZV9uYW1lKGNydGMtPnBpcGUpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJfQorCisJZmluaXNoX3dhaXQoJmNydGMtPnZibF93YWl0LCAmd2FpdCk7CisKKwlkcm1fdmJsYW5rX3B1dChkZXYsIHBpcGUpOworCisJKnN0YXJ0X3ZibF9jb3VudCA9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBwaXBlKTsKKworCXRyYWNlX2k5MTVfcGlwZV91cGRhdGVfdmJsYW5rX2V2YWRlZChjcnRjLCBtaW4sIG1heCwgKnN0YXJ0X3ZibF9jb3VudCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfcGlwZV91cGRhdGVfZW5kKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLCB1MzIgc3RhcnRfdmJsX2NvdW50KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKKwllbnVtIHBpcGUgcGlwZSA9IGNydGMtPnBpcGU7CisJdTMyIGVuZF92YmxfY291bnQgPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSk7CisKKwl0cmFjZV9pOTE1X3BpcGVfdXBkYXRlX2VuZChjcnRjLCBlbmRfdmJsX2NvdW50KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWlmIChzdGFydF92YmxfY291bnQgIT0gZW5kX3ZibF9jb3VudCkKKwkJRFJNX0VSUk9SKCJBdG9taWMgdXBkYXRlIGZhaWx1cmUgb24gcGlwZSAlYyAoc3RhcnQ9JXUgZW5kPSV1KVxuIiwKKwkJCSAgcGlwZV9uYW1lKHBpcGUpLCBzdGFydF92YmxfY291bnQsIGVuZF92YmxfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZShzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJlZyA9IERTUENOVFIoY3J0Yy0+cGxhbmUpOworCisJaWYgKGNydGMtPnByaW1hcnlfZW5hYmxlZCkKKwkJSTkxNV9XUklURShyZWcsIEk5MTVfUkVBRChyZWcpIHwgRElTUExBWV9QTEFORV9FTkFCTEUpOworCWVsc2UKKwkJSTkxNV9XUklURShyZWcsIEk5MTVfUkVBRChyZWcpICYgfkRJU1BMQVlfUExBTkVfRU5BQkxFKTsKK30KKwogc3RhdGljIHZvaWQKIHZsdl91cGRhdGVfcGxhbmUoc3RydWN0IGRybV9wbGFuZSAqZHBsYW5lLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKQEAgLTQ4LDExICsxNDgsMTQgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZHBsYW5lLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfcGxhbmUgKmludGVsX3BsYW5lID0gdG9faW50ZWxfcGxhbmUoZHBsYW5lKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9wbGFuZS0+cGlwZTsKIAlpbnQgcGxhbmUgPSBpbnRlbF9wbGFuZS0+cGxhbmU7CiAJdTMyIHNwcmN0bDsKIAl1bnNpZ25lZCBsb25nIHNwcnN1cmZfb2Zmc2V0LCBsaW5lYXJfb2Zmc2V0OwogCWludCBwaXhlbF9zaXplID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoZmItPnBpeGVsX2Zvcm1hdCwgMCk7CisJdTMyIHN0YXJ0X3ZibF9jb3VudDsKKwlib29sIGF0b21pY191cGRhdGU7CiAKIAlzcHJjdGwgPSBJOTE1X1JFQUQoU1BDTlRSKHBpcGUsIHBsYW5lKSk7CiAKQEAgLTEzMSw2ICsyMzQsMTAgQEAKIAkJCQkJCQlmYi0+cGl0Y2hlc1swXSk7CiAJbGluZWFyX29mZnNldCAtPSBzcHJzdXJmX29mZnNldDsKIAorCWF0b21pY191cGRhdGUgPSBpbnRlbF9waXBlX3VwZGF0ZV9zdGFydChpbnRlbF9jcnRjLCAmc3RhcnRfdmJsX2NvdW50KTsKKworCWludGVsX3VwZGF0ZV9wcmltYXJ5X3BsYW5lKGludGVsX2NydGMpOworCiAJSTkxNV9XUklURShTUFNUUklERShwaXBlLCBwbGFuZSksIGZiLT5waXRjaGVzWzBdKTsKIAlJOTE1X1dSSVRFKFNQUE9TKHBpcGUsIHBsYW5lKSwgKGNydGNfeSA8PCAxNikgfCBjcnRjX3gpOwogCkBAIC0xNDMsNyArMjUwLDExIEBACiAJSTkxNV9XUklURShTUENOVFIocGlwZSwgcGxhbmUpLCBzcHJjdGwpOwogCUk5MTVfV1JJVEUoU1BTVVJGKHBpcGUsIHBsYW5lKSwgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKwogCQkgICBzcHJzdXJmX29mZnNldCk7Ci0JUE9TVElOR19SRUFEKFNQU1VSRihwaXBlLCBwbGFuZSkpOworCisJaW50ZWxfZmx1c2hfcHJpbWFyeV9wbGFuZShkZXZfcHJpdiwgaW50ZWxfY3J0Yy0+cGxhbmUpOworCisJaWYgKGF0b21pY191cGRhdGUpCisJCWludGVsX3BpcGVfdXBkYXRlX2VuZChpbnRlbF9jcnRjLCBzdGFydF92YmxfY291bnQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTUyLDE0ICsyNjMsMjUgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZHBsYW5lLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfcGxhbmUgKmludGVsX3BsYW5lID0gdG9faW50ZWxfcGxhbmUoZHBsYW5lKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9wbGFuZS0+cGlwZTsKIAlpbnQgcGxhbmUgPSBpbnRlbF9wbGFuZS0+cGxhbmU7CisJdTMyIHN0YXJ0X3ZibF9jb3VudDsKKwlib29sIGF0b21pY191cGRhdGU7CisKKwlhdG9taWNfdXBkYXRlID0gaW50ZWxfcGlwZV91cGRhdGVfc3RhcnQoaW50ZWxfY3J0YywgJnN0YXJ0X3ZibF9jb3VudCk7CisKKwlpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZShpbnRlbF9jcnRjKTsKIAogCUk5MTVfV1JJVEUoU1BDTlRSKHBpcGUsIHBsYW5lKSwgSTkxNV9SRUFEKFNQQ05UUihwaXBlLCBwbGFuZSkpICYKIAkJICAgflNQX0VOQUJMRSk7CiAJLyogQWN0aXZhdGUgZG91YmxlIGJ1ZmZlcmVkIHJlZ2lzdGVyIHVwZGF0ZSAqLwogCUk5MTVfV1JJVEUoU1BTVVJGKHBpcGUsIHBsYW5lKSwgMCk7Ci0JUE9TVElOR19SRUFEKFNQU1VSRihwaXBlLCBwbGFuZSkpOworCisJaW50ZWxfZmx1c2hfcHJpbWFyeV9wbGFuZShkZXZfcHJpdiwgaW50ZWxfY3J0Yy0+cGxhbmUpOworCisJaWYgKGF0b21pY191cGRhdGUpCisJCWludGVsX3BpcGVfdXBkYXRlX2VuZChpbnRlbF9jcnRjLCBzdGFydF92YmxfY291bnQpOwogCiAJaW50ZWxfdXBkYXRlX3Nwcml0ZV93YXRlcm1hcmtzKGRwbGFuZSwgY3J0YywgMCwgMCwgZmFsc2UsIGZhbHNlKTsKIH0KQEAgLTIyNiwxMCArMzQ4LDEzIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBsYW5lLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfcGxhbmUgKmludGVsX3BsYW5lID0gdG9faW50ZWxfcGxhbmUocGxhbmUpOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGlwZSA9IGludGVsX3BsYW5lLT5waXBlOwogCXUzMiBzcHJjdGwsIHNwcnNjYWxlID0gMDsKIAl1bnNpZ25lZCBsb25nIHNwcnN1cmZfb2Zmc2V0LCBsaW5lYXJfb2Zmc2V0OwogCWludCBwaXhlbF9zaXplID0gZHJtX2Zvcm1hdF9wbGFuZV9jcHAoZmItPnBpeGVsX2Zvcm1hdCwgMCk7CisJdTMyIHN0YXJ0X3ZibF9jb3VudDsKKwlib29sIGF0b21pY191cGRhdGU7CiAKIAlzcHJjdGwgPSBJOTE1X1JFQUQoU1BSQ1RMKHBpcGUpKTsKIApAQCAtMjk5LDYgKzQyNCwxMCBAQAogCQkJCQkgICAgICAgcGl4ZWxfc2l6ZSwgZmItPnBpdGNoZXNbMF0pOwogCWxpbmVhcl9vZmZzZXQgLT0gc3Byc3VyZl9vZmZzZXQ7CiAKKwlhdG9taWNfdXBkYXRlID0gaW50ZWxfcGlwZV91cGRhdGVfc3RhcnQoaW50ZWxfY3J0YywgJnN0YXJ0X3ZibF9jb3VudCk7CisKKwlpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZShpbnRlbF9jcnRjKTsKKwogCUk5MTVfV1JJVEUoU1BSU1RSSURFKHBpcGUpLCBmYi0+cGl0Y2hlc1swXSk7CiAJSTkxNV9XUklURShTUFJQT1MocGlwZSksIChjcnRjX3kgPDwgMTYpIHwgY3J0Y194KTsKIApAQCAtMzE3LDcgKzQ0NiwxMSBAQAogCUk5MTVfV1JJVEUoU1BSQ1RMKHBpcGUpLCBzcHJjdGwpOwogCUk5MTVfV1JJVEUoU1BSU1VSRihwaXBlKSwKIAkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBzcHJzdXJmX29mZnNldCk7Ci0JUE9TVElOR19SRUFEKFNQUlNVUkYocGlwZSkpOworCisJaW50ZWxfZmx1c2hfcHJpbWFyeV9wbGFuZShkZXZfcHJpdiwgaW50ZWxfY3J0Yy0+cGxhbmUpOworCisJaWYgKGF0b21pY191cGRhdGUpCisJCWludGVsX3BpcGVfdXBkYXRlX2VuZChpbnRlbF9jcnRjLCBzdGFydF92YmxfY291bnQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzI2LDcgKzQ1OSwxNCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwbGFuZS0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX3BsYW5lICppbnRlbF9wbGFuZSA9IHRvX2ludGVsX3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9wbGFuZS0+cGlwZTsKKwl1MzIgc3RhcnRfdmJsX2NvdW50OworCWJvb2wgYXRvbWljX3VwZGF0ZTsKKworCWF0b21pY191cGRhdGUgPSBpbnRlbF9waXBlX3VwZGF0ZV9zdGFydChpbnRlbF9jcnRjLCAmc3RhcnRfdmJsX2NvdW50KTsKKworCWludGVsX3VwZGF0ZV9wcmltYXJ5X3BsYW5lKGludGVsX2NydGMpOwogCiAJSTkxNV9XUklURShTUFJDVEwocGlwZSksIEk5MTVfUkVBRChTUFJDVEwocGlwZSkpICYgflNQUklURV9FTkFCTEUpOwogCS8qIENhbid0IGxlYXZlIHRoZSBzY2FsZXIgZW5hYmxlZC4uLiAqLwpAQCAtMzM0LDcgKzQ3NCwxMSBAQAogCQlJOTE1X1dSSVRFKFNQUlNDQUxFKHBpcGUpLCAwKTsKIAkvKiBBY3RpdmF0ZSBkb3VibGUgYnVmZmVyZWQgcmVnaXN0ZXIgdXBkYXRlICovCiAJSTkxNV9XUklURShTUFJTVVJGKHBpcGUpLCAwKTsKLQlQT1NUSU5HX1JFQUQoU1BSU1VSRihwaXBlKSk7CisKKwlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBpbnRlbF9jcnRjLT5wbGFuZSk7CisKKwlpZiAoYXRvbWljX3VwZGF0ZSkKKwkJaW50ZWxfcGlwZV91cGRhdGVfZW5kKGludGVsX2NydGMsIHN0YXJ0X3ZibF9jb3VudCk7CiAKIAkvKgogCSAqIEF2b2lkIHVuZGVycnVucyB3aGVuIGRpc2FibGluZyB0aGUgc3ByaXRlLgpAQCAtNDEwLDEwICs1NTQsMTMgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGxhbmUtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9wbGFuZSAqaW50ZWxfcGxhbmUgPSB0b19pbnRlbF9wbGFuZShwbGFuZSk7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwaXBlID0gaW50ZWxfcGxhbmUtPnBpcGU7CiAJdW5zaWduZWQgbG9uZyBkdnNzdXJmX29mZnNldCwgbGluZWFyX29mZnNldDsKIAl1MzIgZHZzY250ciwgZHZzc2NhbGU7CiAJaW50IHBpeGVsX3NpemUgPSBkcm1fZm9ybWF0X3BsYW5lX2NwcChmYi0+cGl4ZWxfZm9ybWF0LCAwKTsKKwl1MzIgc3RhcnRfdmJsX2NvdW50OworCWJvb2wgYXRvbWljX3VwZGF0ZTsKIAogCWR2c2NudHIgPSBJOTE1X1JFQUQoRFZTQ05UUihwaXBlKSk7CiAKQEAgLTQ3OCw2ICs2MjUsMTAgQEAKIAkJCQkJICAgICAgIHBpeGVsX3NpemUsIGZiLT5waXRjaGVzWzBdKTsKIAlsaW5lYXJfb2Zmc2V0IC09IGR2c3N1cmZfb2Zmc2V0OwogCisJYXRvbWljX3VwZGF0ZSA9IGludGVsX3BpcGVfdXBkYXRlX3N0YXJ0KGludGVsX2NydGMsICZzdGFydF92YmxfY291bnQpOworCisJaW50ZWxfdXBkYXRlX3ByaW1hcnlfcGxhbmUoaW50ZWxfY3J0Yyk7CisKIAlJOTE1X1dSSVRFKERWU1NUUklERShwaXBlKSwgZmItPnBpdGNoZXNbMF0pOwogCUk5MTVfV1JJVEUoRFZTUE9TKHBpcGUpLCAoY3J0Y195IDw8IDE2KSB8IGNydGNfeCk7CiAKQEAgLTQ5MSw3ICs2NDIsMTEgQEAKIAlJOTE1X1dSSVRFKERWU0NOVFIocGlwZSksIGR2c2NudHIpOwogCUk5MTVfV1JJVEUoRFZTU1VSRihwaXBlKSwKIAkJICAgaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgKyBkdnNzdXJmX29mZnNldCk7Ci0JUE9TVElOR19SRUFEKERWU1NVUkYocGlwZSkpOworCisJaW50ZWxfZmx1c2hfcHJpbWFyeV9wbGFuZShkZXZfcHJpdiwgaW50ZWxfY3J0Yy0+cGxhbmUpOworCisJaWYgKGF0b21pY191cGRhdGUpCisJCWludGVsX3BpcGVfdXBkYXRlX2VuZChpbnRlbF9jcnRjLCBzdGFydF92YmxfY291bnQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTAwLDE0ICs2NTUsMjUgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGxhbmUtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9wbGFuZSAqaW50ZWxfcGxhbmUgPSB0b19pbnRlbF9wbGFuZShwbGFuZSk7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwaXBlID0gaW50ZWxfcGxhbmUtPnBpcGU7CisJdTMyIHN0YXJ0X3ZibF9jb3VudDsKKwlib29sIGF0b21pY191cGRhdGU7CisKKwlhdG9taWNfdXBkYXRlID0gaW50ZWxfcGlwZV91cGRhdGVfc3RhcnQoaW50ZWxfY3J0YywgJnN0YXJ0X3ZibF9jb3VudCk7CisKKwlpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZShpbnRlbF9jcnRjKTsKIAogCUk5MTVfV1JJVEUoRFZTQ05UUihwaXBlKSwgSTkxNV9SRUFEKERWU0NOVFIocGlwZSkpICYgfkRWU19FTkFCTEUpOwogCS8qIERpc2FibGUgdGhlIHNjYWxlciAqLwogCUk5MTVfV1JJVEUoRFZTU0NBTEUocGlwZSksIDApOwogCS8qIEZsdXNoIGRvdWJsZSBidWZmZXJlZCByZWdpc3RlciB1cGRhdGVzICovCiAJSTkxNV9XUklURShEVlNTVVJGKHBpcGUpLCAwKTsKLQlQT1NUSU5HX1JFQUQoRFZTU1VSRihwaXBlKSk7CisKKwlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBpbnRlbF9jcnRjLT5wbGFuZSk7CisKKwlpZiAoYXRvbWljX3VwZGF0ZSkKKwkJaW50ZWxfcGlwZV91cGRhdGVfZW5kKGludGVsX2NydGMsIHN0YXJ0X3ZibF9jb3VudCk7CiAKIAkvKgogCSAqIEF2b2lkIHVuZGVycnVucyB3aGVuIGRpc2FibGluZyB0aGUgc3ByaXRlLgpAQCAtNTE5LDIwICs2ODUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWludGVsX2VuYWJsZV9wcmltYXJ5KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK2ludGVsX3Bvc3RfZW5hYmxlX3ByaW1hcnkoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0JaW50IHJlZyA9IERTUENOVFIoaW50ZWxfY3J0Yy0+cGxhbmUpOwotCi0JaWYgKGludGVsX2NydGMtPnByaW1hcnlfZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0JaW50ZWxfY3J0Yy0+cHJpbWFyeV9lbmFibGVkID0gdHJ1ZTsKLQotCUk5MTVfV1JJVEUocmVnLCBJOTE1X1JFQUQocmVnKSB8IERJU1BMQVlfUExBTkVfRU5BQkxFKTsKLQlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBpbnRlbF9jcnRjLT5wbGFuZSk7CiAKIAkvKgogCSAqIEZJWE1FIElQUyBzaG91bGQgYmUgZmluZSBhcyBsb25nIGFzIG9uZSBwbGFuZSBpcwpAQCAtNTQwLDEwICs2OTYsNyBAQAogCSAqIHdoZW4gZ29pbmcgZnJvbSBwcmltYXJ5IG9ubHkgdG8gc3ByaXRlIG9ubHkgYW5kIHZpY2UKIAkgKiB2ZXJzYS4KIAkgKi8KLQlpZiAoaW50ZWxfY3J0Yy0+Y29uZmlnLmlwc19lbmFibGVkKSB7Ci0JCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIGludGVsX2NydGMtPnBpcGUpOwotCQloc3dfZW5hYmxlX2lwcyhpbnRlbF9jcnRjKTsKLQl9CisJaHN3X2VuYWJsZV9pcHMoaW50ZWxfY3J0Yyk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaW50ZWxfdXBkYXRlX2ZiYyhkZXYpOwpAQCAtNTUxLDE3ICs3MDQsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLWludGVsX2Rpc2FibGVfcHJpbWFyeShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitpbnRlbF9wcmVfZGlzYWJsZV9wcmltYXJ5KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwotCWludCByZWcgPSBEU1BDTlRSKGludGVsX2NydGMtPnBsYW5lKTsKLQotCWlmICghaW50ZWxfY3J0Yy0+cHJpbWFyeV9lbmFibGVkKQotCQlyZXR1cm47Ci0KLQlpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQgPSBmYWxzZTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoZGV2X3ByaXYtPmZiYy5wbGFuZSA9PSBpbnRlbF9jcnRjLT5wbGFuZSkKQEAgLTU3NSw5ICs3MjIsNiBAQAogCSAqIHZlcnNhLgogCSAqLwogCWhzd19kaXNhYmxlX2lwcyhpbnRlbF9jcnRjKTsKLQotCUk5MTVfV1JJVEUocmVnLCBJOTE1X1JFQUQocmVnKSAmIH5ESVNQTEFZX1BMQU5FX0VOQUJMRSk7Ci0JaW50ZWxfZmx1c2hfcHJpbWFyeV9wbGFuZShkZXZfcHJpdiwgaW50ZWxfY3J0Yy0+cGxhbmUpOwogfQogCiBzdGF0aWMgaW50CkBAIC02NzEsNyArODE1LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2xkX29iaiA9IGludGVsX3BsYW5lLT5vYmo7CiAJaW50IHJldDsKLQlib29sIGRpc2FibGVfcHJpbWFyeSA9IGZhbHNlOworCWJvb2wgcHJpbWFyeV9lbmFibGVkOwogCWJvb2wgdmlzaWJsZTsKIAlpbnQgaHNjYWxlLCB2c2NhbGU7CiAJaW50IG1heF9zY2FsZSwgbWluX3NjYWxlOwpAQCAtODQyLDggKzk4Niw4IEBACiAJICogSWYgdGhlIHNwcml0ZSBpcyBjb21wbGV0ZWx5IGNvdmVyaW5nIHRoZSBwcmltYXJ5IHBsYW5lLAogCSAqIHdlIGNhbiBkaXNhYmxlIHRoZSBwcmltYXJ5IGFuZCBzYXZlIHBvd2VyLgogCSAqLwotCWRpc2FibGVfcHJpbWFyeSA9IGRybV9yZWN0X2VxdWFscygmZHN0LCAmY2xpcCkgJiYgIWNvbG9ya2V5X2VuYWJsZWQoaW50ZWxfcGxhbmUpOwotCVdBUk5fT04oZGlzYWJsZV9wcmltYXJ5ICYmICF2aXNpYmxlICYmIGludGVsX2NydGMtPmFjdGl2ZSk7CisJcHJpbWFyeV9lbmFibGVkID0gIWRybV9yZWN0X2VxdWFscygmZHN0LCAmY2xpcCkgfHwgY29sb3JrZXlfZW5hYmxlZChpbnRlbF9wbGFuZSk7CisJV0FSTl9PTighcHJpbWFyeV9lbmFibGVkICYmICF2aXNpYmxlICYmIGludGVsX2NydGMtPmFjdGl2ZSk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTg3MCwxMiArMTAxNCwxNSBAQAogCWludGVsX3BsYW5lLT5vYmogPSBvYmo7CiAKIAlpZiAoaW50ZWxfY3J0Yy0+YWN0aXZlKSB7Ci0JCS8qCi0JCSAqIEJlIHN1cmUgdG8gcmUtZW5hYmxlIHRoZSBwcmltYXJ5IGJlZm9yZSB0aGUgc3ByaXRlIGlzIG5vIGxvbmdlcgotCQkgKiBjb3ZlcmluZyBpdCBmdWxseS4KLQkJICovCi0JCWlmICghZGlzYWJsZV9wcmltYXJ5KQotCQkJaW50ZWxfZW5hYmxlX3ByaW1hcnkoY3J0Yyk7CisJCWJvb2wgcHJpbWFyeV93YXNfZW5hYmxlZCA9IGludGVsX2NydGMtPnByaW1hcnlfZW5hYmxlZDsKKworCQlpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQgPSBwcmltYXJ5X2VuYWJsZWQ7CisKKwkJaWYgKHByaW1hcnlfd2FzX2VuYWJsZWQgIT0gcHJpbWFyeV9lbmFibGVkKQorCQkJaW50ZWxfY3J0Y193YWl0X2Zvcl9wZW5kaW5nX2ZsaXBzKGNydGMpOworCisJCWlmIChwcmltYXJ5X3dhc19lbmFibGVkICYmICFwcmltYXJ5X2VuYWJsZWQpCisJCQlpbnRlbF9wcmVfZGlzYWJsZV9wcmltYXJ5KGNydGMpOwogCiAJCWlmICh2aXNpYmxlKQogCQkJaW50ZWxfcGxhbmUtPnVwZGF0ZV9wbGFuZShwbGFuZSwgY3J0YywgZmIsIG9iaiwKQEAgLTg4NCw4ICsxMDMxLDggQEAKIAkJZWxzZQogCQkJaW50ZWxfcGxhbmUtPmRpc2FibGVfcGxhbmUocGxhbmUsIGNydGMpOwogCi0JCWlmIChkaXNhYmxlX3ByaW1hcnkpCi0JCQlpbnRlbF9kaXNhYmxlX3ByaW1hcnkoY3J0Yyk7CisJCWlmICghcHJpbWFyeV93YXNfZW5hYmxlZCAmJiBwcmltYXJ5X2VuYWJsZWQpCisJCQlpbnRlbF9wb3N0X2VuYWJsZV9wcmltYXJ5KGNydGMpOwogCX0KIAogCS8qIFVucGluIG9sZCBvYmogYWZ0ZXIgbmV3IG9uZSBpcyBhY3RpdmUgdG8gYXZvaWQgdWdsaW5lc3MgKi8KQEAgLTkyMyw4ICsxMDcwLDE0IEBACiAJaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMocGxhbmUtPmNydGMpOwogCiAJaWYgKGludGVsX2NydGMtPmFjdGl2ZSkgewotCQlpbnRlbF9lbmFibGVfcHJpbWFyeShwbGFuZS0+Y3J0Yyk7CisJCWJvb2wgcHJpbWFyeV93YXNfZW5hYmxlZCA9IGludGVsX2NydGMtPnByaW1hcnlfZW5hYmxlZDsKKworCQlpbnRlbF9jcnRjLT5wcmltYXJ5X2VuYWJsZWQgPSB0cnVlOworCiAJCWludGVsX3BsYW5lLT5kaXNhYmxlX3BsYW5lKHBsYW5lLCBwbGFuZS0+Y3J0Yyk7CisKKwkJaWYgKCFwcmltYXJ5X3dhc19lbmFibGVkICYmIGludGVsX2NydGMtPnByaW1hcnlfZW5hYmxlZCkKKwkJCWludGVsX3Bvc3RfZW5hYmxlX3ByaW1hcnkocGxhbmUtPmNydGMpOwogCX0KIAogCWlmIChpbnRlbF9wbGFuZS0+b2JqKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwppbmRleCBiYWZlOTJlLi42N2M2YzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKQEAgLTkzNCw1NCArOTM0LDE0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX3R2X21vZGVfc2V0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKQorc3RhdGljIHZvaWQKK3NldF90dl9tb2RlX3RpbWluZ3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkgICAgY29uc3Qgc3RydWN0IHR2X21vZGUgKnR2X21vZGUsCisJCSAgICBib29sIGJ1cnN0X2VuYSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoZW5jb2Rlci0+YmFzZS5jcnRjKTsKLQlzdHJ1Y3QgaW50ZWxfdHYgKmludGVsX3R2ID0gZW5jX3RvX3R2KGVuY29kZXIpOwotCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0gaW50ZWxfdHZfbW9kZV9maW5kKGludGVsX3R2KTsKLQl1MzIgdHZfY3RsOwogCXUzMiBoY3RsMSwgaGN0bDIsIGhjdGwzOwogCXUzMiB2Y3RsMSwgdmN0bDIsIHZjdGwzLCB2Y3RsNCwgdmN0bDUsIHZjdGw2LCB2Y3RsNzsKLQl1MzIgc2NjdGwxLCBzY2N0bDIsIHNjY3RsMzsKLQlpbnQgaSwgajsKLQljb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzICp2aWRlb19sZXZlbHM7Ci0JY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gKmNvbG9yX2NvbnZlcnNpb247Ci0JYm9vbCBidXJzdF9lbmE7Ci0JaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCi0JaWYgKCF0dl9tb2RlKQotCQlyZXR1cm47CS8qIGNhbid0IGhhcHBlbiAobW9kZV9wcmVwYXJlIHByZXZlbnRzIHRoaXMpICovCi0KLQl0dl9jdGwgPSBJOTE1X1JFQUQoVFZfQ1RMKTsKLQl0dl9jdGwgJj0gVFZfQ1RMX1NBVkU7Ci0KLQlzd2l0Y2ggKGludGVsX3R2LT50eXBlKSB7Ci0JZGVmYXVsdDoKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOgotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZToKLQkJdHZfY3RsIHw9IFRWX0VOQ19PVVRQVVRfQ09NUE9TSVRFOwotCQl2aWRlb19sZXZlbHMgPSB0dl9tb2RlLT5jb21wb3NpdGVfbGV2ZWxzOwotCQljb2xvcl9jb252ZXJzaW9uID0gdHZfbW9kZS0+Y29tcG9zaXRlX2NvbG9yOwotCQlidXJzdF9lbmEgPSB0dl9tb2RlLT5idXJzdF9lbmE7Ci0JCWJyZWFrOwotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudDoKLQkJdHZfY3RsIHw9IFRWX0VOQ19PVVRQVVRfQ09NUE9ORU5UOwotCQl2aWRlb19sZXZlbHMgPSAmY29tcG9uZW50X2xldmVsczsKLQkJaWYgKHR2X21vZGUtPmJ1cnN0X2VuYSkKLQkJCWNvbG9yX2NvbnZlcnNpb24gPSAmc2R0dl9jc2NfeXBycGI7Ci0JCWVsc2UKLQkJCWNvbG9yX2NvbnZlcnNpb24gPSAmaGR0dl9jc2NfeXBycGI7Ci0JCWJ1cnN0X2VuYSA9IGZhbHNlOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86Ci0JCXR2X2N0bCB8PSBUVl9FTkNfT1VUUFVUX1NWSURFTzsKLQkJdmlkZW9fbGV2ZWxzID0gdHZfbW9kZS0+c3ZpZGVvX2xldmVsczsKLQkJY29sb3JfY29udmVyc2lvbiA9IHR2X21vZGUtPnN2aWRlb19jb2xvcjsKLQkJYnVyc3RfZW5hID0gdHZfbW9kZS0+YnVyc3RfZW5hOwotCQlicmVhazsKLQl9CiAJaGN0bDEgPSAodHZfbW9kZS0+aHN5bmNfZW5kIDw8IFRWX0hTWU5DX0VORF9TSElGVCkgfAogCQkodHZfbW9kZS0+aHRvdGFsIDw8IFRWX0hUT1RBTF9TSElGVCk7CiAKQEAgLTEwMjEsNiArOTgxLDg2IEBACiAJdmN0bDcgPSAodHZfbW9kZS0+dmJ1cnN0X3N0YXJ0X2Y0IDw8IFRWX1ZCVVJTVF9TVEFSVF9GNF9TSElGVCkgfAogCQkodHZfbW9kZS0+dmJ1cnN0X2VuZF9mNCA8PCBUVl9WQlVSU1RfRU5EX0Y0X1NISUZUKTsKIAorCUk5MTVfV1JJVEUoVFZfSF9DVExfMSwgaGN0bDEpOworCUk5MTVfV1JJVEUoVFZfSF9DVExfMiwgaGN0bDIpOworCUk5MTVfV1JJVEUoVFZfSF9DVExfMywgaGN0bDMpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfMSwgdmN0bDEpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfMiwgdmN0bDIpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfMywgdmN0bDMpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfNCwgdmN0bDQpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfNSwgdmN0bDUpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfNiwgdmN0bDYpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfNywgdmN0bDcpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY29sb3JfY29udmVyc2lvbihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uICpjb2xvcl9jb252ZXJzaW9uKQoreworCWlmICghY29sb3JfY29udmVyc2lvbikKKwkJcmV0dXJuOworCisJSTkxNV9XUklURShUVl9DU0NfWSwgKGNvbG9yX2NvbnZlcnNpb24tPnJ5IDw8IDE2KSB8CisJCSAgIGNvbG9yX2NvbnZlcnNpb24tPmd5KTsKKwlJOTE1X1dSSVRFKFRWX0NTQ19ZMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ5IDw8IDE2KSB8CisJCSAgIGNvbG9yX2NvbnZlcnNpb24tPmF5KTsKKwlJOTE1X1dSSVRFKFRWX0NTQ19VLCAoY29sb3JfY29udmVyc2lvbi0+cnUgPDwgMTYpIHwKKwkJICAgY29sb3JfY29udmVyc2lvbi0+Z3UpOworCUk5MTVfV1JJVEUoVFZfQ1NDX1UyLCAoY29sb3JfY29udmVyc2lvbi0+YnUgPDwgMTYpIHwKKwkJICAgY29sb3JfY29udmVyc2lvbi0+YXUpOworCUk5MTVfV1JJVEUoVFZfQ1NDX1YsIChjb2xvcl9jb252ZXJzaW9uLT5ydiA8PCAxNikgfAorCQkgICBjb2xvcl9jb252ZXJzaW9uLT5ndik7CisJSTkxNV9XUklURShUVl9DU0NfVjIsIChjb2xvcl9jb252ZXJzaW9uLT5idiA8PCAxNikgfAorCQkgICBjb2xvcl9jb252ZXJzaW9uLT5hdik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3R2X3ByZV9lbmFibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmJhc2UuY3J0Yyk7CisJc3RydWN0IGludGVsX3R2ICppbnRlbF90diA9IGVuY190b190dihlbmNvZGVyKTsKKwljb25zdCBzdHJ1Y3QgdHZfbW9kZSAqdHZfbW9kZSA9IGludGVsX3R2X21vZGVfZmluZChpbnRlbF90dik7CisJdTMyIHR2X2N0bDsKKwl1MzIgc2NjdGwxLCBzY2N0bDIsIHNjY3RsMzsKKwlpbnQgaSwgajsKKwljb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzICp2aWRlb19sZXZlbHM7CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gKmNvbG9yX2NvbnZlcnNpb247CisJYm9vbCBidXJzdF9lbmE7CisJaW50IHhwb3MgPSAweDAsIHlwb3MgPSAweDA7CisJdW5zaWduZWQgaW50IHhzaXplLCB5c2l6ZTsKKworCWlmICghdHZfbW9kZSkKKwkJcmV0dXJuOwkvKiBjYW4ndCBoYXBwZW4gKG1vZGVfcHJlcGFyZSBwcmV2ZW50cyB0aGlzKSAqLworCisJdHZfY3RsID0gSTkxNV9SRUFEKFRWX0NUTCk7CisJdHZfY3RsICY9IFRWX0NUTF9TQVZFOworCisJc3dpdGNoIChpbnRlbF90di0+dHlwZSkgeworCWRlZmF1bHQ6CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjoKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGU6CisJCXR2X2N0bCB8PSBUVl9FTkNfT1VUUFVUX0NPTVBPU0lURTsKKwkJdmlkZW9fbGV2ZWxzID0gdHZfbW9kZS0+Y29tcG9zaXRlX2xldmVsczsKKwkJY29sb3JfY29udmVyc2lvbiA9IHR2X21vZGUtPmNvbXBvc2l0ZV9jb2xvcjsKKwkJYnVyc3RfZW5hID0gdHZfbW9kZS0+YnVyc3RfZW5hOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb25lbnQ6CisJCXR2X2N0bCB8PSBUVl9FTkNfT1VUUFVUX0NPTVBPTkVOVDsKKwkJdmlkZW9fbGV2ZWxzID0gJmNvbXBvbmVudF9sZXZlbHM7CisJCWlmICh0dl9tb2RlLT5idXJzdF9lbmEpCisJCQljb2xvcl9jb252ZXJzaW9uID0gJnNkdHZfY3NjX3lwcnBiOworCQllbHNlCisJCQljb2xvcl9jb252ZXJzaW9uID0gJmhkdHZfY3NjX3lwcnBiOworCQlidXJzdF9lbmEgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPOgorCQl0dl9jdGwgfD0gVFZfRU5DX09VVFBVVF9TVklERU87CisJCXZpZGVvX2xldmVscyA9IHR2X21vZGUtPnN2aWRlb19sZXZlbHM7CisJCWNvbG9yX2NvbnZlcnNpb24gPSB0dl9tb2RlLT5zdmlkZW9fY29sb3I7CisJCWJ1cnN0X2VuYSA9IHR2X21vZGUtPmJ1cnN0X2VuYTsKKwkJYnJlYWs7CisJfQorCiAJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMSkKIAkJdHZfY3RsIHw9IFRWX0VOQ19QSVBFQl9TRUxFQ1Q7CiAJdHZfY3RsIHw9IHR2X21vZGUtPm92ZXJzYW1wbGU7CkBAIC0xMDUxLDM3ICsxMDkxLDE2IEBACiAJCXR2X21vZGUtPmRkYTNfaW5jIDw8IFRWX1NDRERBM19JTkNfU0hJRlQ7CiAKIAkvKiBFbmFibGUgdHdvIGZpeGVzIGZvciB0aGUgY2hpcHMgdGhhdCBuZWVkIHRoZW0uICovCi0JaWYgKGRldi0+cGRldi0+ZGV2aWNlIDwgMHgyNzcyKQorCWlmIChJU19JOTE1R00oZGV2KSkKIAkJdHZfY3RsIHw9IFRWX0VOQ19DMF9GSVggfCBUVl9FTkNfU0RQX0ZJWDsKIAotCUk5MTVfV1JJVEUoVFZfSF9DVExfMSwgaGN0bDEpOwotCUk5MTVfV1JJVEUoVFZfSF9DVExfMiwgaGN0bDIpOwotCUk5MTVfV1JJVEUoVFZfSF9DVExfMywgaGN0bDMpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfMSwgdmN0bDEpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfMiwgdmN0bDIpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfMywgdmN0bDMpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfNCwgdmN0bDQpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfNSwgdmN0bDUpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfNiwgdmN0bDYpOwotCUk5MTVfV1JJVEUoVFZfVl9DVExfNywgdmN0bDcpOworCXNldF90dl9tb2RlX3RpbWluZ3MoZGV2X3ByaXYsIHR2X21vZGUsIGJ1cnN0X2VuYSk7CisKIAlJOTE1X1dSSVRFKFRWX1NDX0NUTF8xLCBzY2N0bDEpOwogCUk5MTVfV1JJVEUoVFZfU0NfQ1RMXzIsIHNjY3RsMik7CiAJSTkxNV9XUklURShUVl9TQ19DVExfMywgc2NjdGwzKTsKIAotCWlmIChjb2xvcl9jb252ZXJzaW9uKSB7Ci0JCUk5MTVfV1JJVEUoVFZfQ1NDX1ksIChjb2xvcl9jb252ZXJzaW9uLT5yeSA8PCAxNikgfAotCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3kpOwotCQlJOTE1X1dSSVRFKFRWX0NTQ19ZMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ5IDw8IDE2KSB8Ci0JCQkgICBjb2xvcl9jb252ZXJzaW9uLT5heSk7Ci0JCUk5MTVfV1JJVEUoVFZfQ1NDX1UsIChjb2xvcl9jb252ZXJzaW9uLT5ydSA8PCAxNikgfAotCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3UpOwotCQlJOTE1X1dSSVRFKFRWX0NTQ19VMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ1IDw8IDE2KSB8Ci0JCQkgICBjb2xvcl9jb252ZXJzaW9uLT5hdSk7Ci0JCUk5MTVfV1JJVEUoVFZfQ1NDX1YsIChjb2xvcl9jb252ZXJzaW9uLT5ydiA8PCAxNikgfAotCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3YpOwotCQlJOTE1X1dSSVRFKFRWX0NTQ19WMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ2IDw8IDE2KSB8Ci0JCQkgICBjb2xvcl9jb252ZXJzaW9uLT5hdik7Ci0JfQorCXNldF9jb2xvcl9jb252ZXJzaW9uKGRldl9wcml2LCBjb2xvcl9jb252ZXJzaW9uKTsKIAogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQogCQlJOTE1X1dSSVRFKFRWX0NMUl9LTk9CUywgMHgwMDQwNDAwMCk7CkBAIC0xMDkyLDQ2ICsxMTExLDI1IEBACiAJCUk5MTVfV1JJVEUoVFZfQ0xSX0xFVkVMLAogCQkJICAgKCh2aWRlb19sZXZlbHMtPmJsYWNrIDw8IFRWX0JMQUNLX0xFVkVMX1NISUZUKSB8CiAJCQkgICAgKHZpZGVvX2xldmVscy0+YmxhbmsgPDwgVFZfQkxBTktfTEVWRUxfU0hJRlQpKSk7Ci0JewotCQlpbnQgcGlwZWNvbmZfcmVnID0gUElQRUNPTkYocGlwZSk7Ci0JCWludCBkc3BjbnRyX3JlZyA9IERTUENOVFIoaW50ZWxfY3J0Yy0+cGxhbmUpOwotCQlpbnQgcGlwZWNvbmYgPSBJOTE1X1JFQUQocGlwZWNvbmZfcmVnKTsKLQkJaW50IGRzcGNudHIgPSBJOTE1X1JFQUQoZHNwY250cl9yZWcpOwotCQlpbnQgeHBvcyA9IDB4MCwgeXBvcyA9IDB4MDsKLQkJdW5zaWduZWQgaW50IHhzaXplLCB5c2l6ZTsKLQkJLyogUGlwZSBtdXN0IGJlIG9mZiBoZXJlICovCi0JCUk5MTVfV1JJVEUoZHNwY250cl9yZWcsIGRzcGNudHIgJiB+RElTUExBWV9QTEFORV9FTkFCTEUpOwotCQlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBpbnRlbF9jcnRjLT5wbGFuZSk7CiAKLQkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVjdCAqLwotCQlpZiAoSVNfR0VOMihkZXYpKQotCQkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJYXNzZXJ0X3BpcGVfZGlzYWJsZWQoZGV2X3ByaXYsIGludGVsX2NydGMtPnBpcGUpOwogCi0JCUk5MTVfV1JJVEUocGlwZWNvbmZfcmVnLCBwaXBlY29uZiAmIH5QSVBFQ09ORl9FTkFCTEUpOwotCQkvKiBXYWl0IGZvciB2YmxhbmsgZm9yIHRoZSBkaXNhYmxlIHRvIHRha2UgZWZmZWN0LiAqLwotCQlpbnRlbF93YWl0X2Zvcl9waXBlX29mZihkZXYsIGludGVsX2NydGMtPnBpcGUpOworCS8qIEZpbHRlciBjdGwgbXVzdCBiZSBzZXQgYmVmb3JlIFRWX1dJTl9TSVpFICovCisJSTkxNV9XUklURShUVl9GSUxURVJfQ1RMXzEsIFRWX0FVVE9fU0NBTEUpOworCXhzaXplID0gdHZfbW9kZS0+aGJsYW5rX3N0YXJ0IC0gdHZfbW9kZS0+aGJsYW5rX2VuZDsKKwlpZiAodHZfbW9kZS0+cHJvZ3Jlc3NpdmUpCisJCXlzaXplID0gdHZfbW9kZS0+bmJyX2VuZCArIDE7CisJZWxzZQorCQl5c2l6ZSA9IDIqdHZfbW9kZS0+bmJyX2VuZCArIDE7CiAKLQkJLyogRmlsdGVyIGN0bCBtdXN0IGJlIHNldCBiZWZvcmUgVFZfV0lOX1NJWkUgKi8KLQkJSTkxNV9XUklURShUVl9GSUxURVJfQ1RMXzEsIFRWX0FVVE9fU0NBTEUpOwotCQl4c2l6ZSA9IHR2X21vZGUtPmhibGFua19zdGFydCAtIHR2X21vZGUtPmhibGFua19lbmQ7Ci0JCWlmICh0dl9tb2RlLT5wcm9ncmVzc2l2ZSkKLQkJCXlzaXplID0gdHZfbW9kZS0+bmJyX2VuZCArIDE7Ci0JCWVsc2UKLQkJCXlzaXplID0gMip0dl9tb2RlLT5uYnJfZW5kICsgMTsKLQotCQl4cG9zICs9IGludGVsX3R2LT5tYXJnaW5bVFZfTUFSR0lOX0xFRlRdOwotCQl5cG9zICs9IGludGVsX3R2LT5tYXJnaW5bVFZfTUFSR0lOX1RPUF07Ci0JCXhzaXplIC09IChpbnRlbF90di0+bWFyZ2luW1RWX01BUkdJTl9MRUZUXSArCi0JCQkgIGludGVsX3R2LT5tYXJnaW5bVFZfTUFSR0lOX1JJR0hUXSk7Ci0JCXlzaXplIC09IChpbnRlbF90di0+bWFyZ2luW1RWX01BUkdJTl9UT1BdICsKLQkJCSAgaW50ZWxfdHYtPm1hcmdpbltUVl9NQVJHSU5fQk9UVE9NXSk7Ci0JCUk5MTVfV1JJVEUoVFZfV0lOX1BPUywgKHhwb3M8PDE2KXx5cG9zKTsKLQkJSTkxNV9XUklURShUVl9XSU5fU0laRSwgKHhzaXplPDwxNil8eXNpemUpOwotCi0JCUk5MTVfV1JJVEUocGlwZWNvbmZfcmVnLCBwaXBlY29uZik7Ci0JCUk5MTVfV1JJVEUoZHNwY250cl9yZWcsIGRzcGNudHIpOwotCQlpbnRlbF9mbHVzaF9wcmltYXJ5X3BsYW5lKGRldl9wcml2LCBpbnRlbF9jcnRjLT5wbGFuZSk7Ci0JfQorCXhwb3MgKz0gaW50ZWxfdHYtPm1hcmdpbltUVl9NQVJHSU5fTEVGVF07CisJeXBvcyArPSBpbnRlbF90di0+bWFyZ2luW1RWX01BUkdJTl9UT1BdOworCXhzaXplIC09IChpbnRlbF90di0+bWFyZ2luW1RWX01BUkdJTl9MRUZUXSArCisJCSAgaW50ZWxfdHYtPm1hcmdpbltUVl9NQVJHSU5fUklHSFRdKTsKKwl5c2l6ZSAtPSAoaW50ZWxfdHYtPm1hcmdpbltUVl9NQVJHSU5fVE9QXSArCisJCSAgaW50ZWxfdHYtPm1hcmdpbltUVl9NQVJHSU5fQk9UVE9NXSk7CisJSTkxNV9XUklURShUVl9XSU5fUE9TLCAoeHBvczw8MTYpfHlwb3MpOworCUk5MTVfV1JJVEUoVFZfV0lOX1NJWkUsICh4c2l6ZTw8MTYpfHlzaXplKTsKIAogCWogPSAwOwogCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKQpAQCAtMTMxNiwxNyArMTMxNCwxOCBAQAogCWludCB0eXBlOwogCiAJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gZm9yY2U9JWRcbiIsCi0JCSAgICAgIGNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkgICAgICBjb25uZWN0b3ItPmJhc2UuaWQsIGNvbm5lY3Rvci0+bmFtZSwKIAkJICAgICAgZm9yY2UpOwogCiAJbW9kZSA9IHJlcG9ydGVkX21vZGVzWzBdOwogCiAJaWYgKGZvcmNlKSB7CiAJCXN0cnVjdCBpbnRlbF9sb2FkX2RldGVjdF9waXBlIHRtcDsKKwkJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IGN0eDsKIAotCQlpZiAoaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoY29ubmVjdG9yLCAmbW9kZSwgJnRtcCkpIHsKKwkJaWYgKGludGVsX2dldF9sb2FkX2RldGVjdF9waXBlKGNvbm5lY3RvciwgJm1vZGUsICZ0bXAsICZjdHgpKSB7CiAJCQl0eXBlID0gaW50ZWxfdHZfZGV0ZWN0X3R5cGUoaW50ZWxfdHYsIGNvbm5lY3Rvcik7Ci0JCQlpbnRlbF9yZWxlYXNlX2xvYWRfZGV0ZWN0X3BpcGUoY29ubmVjdG9yLCAmdG1wKTsKKwkJCWludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3RfcGlwZShjb25uZWN0b3IsICZ0bXAsICZjdHgpOwogCQl9IGVsc2UKIAkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CiAJfSBlbHNlCkBAIC0xNjM0LDcgKzE2MzMsNyBAQAogCiAJaW50ZWxfZW5jb2Rlci0+Y29tcHV0ZV9jb25maWcgPSBpbnRlbF90dl9jb21wdXRlX2NvbmZpZzsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfY29uZmlnID0gaW50ZWxfdHZfZ2V0X2NvbmZpZzsKLQlpbnRlbF9lbmNvZGVyLT5tb2RlX3NldCA9IGludGVsX3R2X21vZGVfc2V0OworCWludGVsX2VuY29kZXItPnByZV9lbmFibGUgPSBpbnRlbF90dl9wcmVfZW5hYmxlOwogCWludGVsX2VuY29kZXItPmVuYWJsZSA9IGludGVsX2VuYWJsZV90djsKIAlpbnRlbF9lbmNvZGVyLT5kaXNhYmxlID0gaW50ZWxfZGlzYWJsZV90djsKIAlpbnRlbF9lbmNvZGVyLT5nZXRfaHdfc3RhdGUgPSBpbnRlbF90dl9nZXRfaHdfc3RhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91bmNvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCmluZGV4IGQwYzc1NzcuLjc5Y2JhNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5jCkBAIC0yNTUsOCArMjU1LDcgQEAKIAogfQogCi12b2lkIHZsdl9mb3JjZV93YWtlX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJCQlpbnQgZndfZW5naW5lKQorc3RhdGljIHZvaWQgdmx2X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGZ3X2VuZ2luZSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCkBAIC0yNzUsOCArMjc0LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dW5jb3JlLmxvY2ssIGlycWZsYWdzKTsKIH0KIAotdm9pZCB2bHZfZm9yY2Vfd2FrZV9wdXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCQkJaW50IGZ3X2VuZ2luZSkKK3N0YXRpYyB2b2lkIHZsdl9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBmd19lbmdpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIApAQCAtMzc0LDcgKzM3Miw3IEBACiAJaWYgKEhBU19GUEdBX0RCR19VTkNMQUlNRUQoZGV2KSkKIAkJX19yYXdfaTkxNV93cml0ZTMyKGRldl9wcml2LCBGUEdBX0RCRywgRlBHQV9EQkdfUk1fTk9DTEFJTSk7CiAKLQlpZiAoSVNfSEFTV0VMTChkZXYpICYmCisJaWYgKChJU19IQVNXRUxMKGRldikgfHwgSVNfQlJPQURXRUxMKGRldikpICYmCiAJICAgIChfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdiwgSFNXX0VEUkFNX1BSRVNFTlQpID09IDEpKSB7CiAJCS8qIFRoZSBkb2NzIGRvIG5vdCBleHBsYWluIGV4YWN0bHkgaG93IHRoZSBjYWxjdWxhdGlvbiBjYW4gYmUKIAkJICogbWFkZS4gSXQgaXMgc29tZXdoYXQgZ3Vlc3NhYmxlLCBidXQgZm9yIG5vdywgaXQncyBhbHdheXMKQEAgLTM5NSwyNiArMzkzLDggQEAKIAogdm9pZCBpbnRlbF91bmNvcmVfc2FuaXRpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiByZWdfdmFsOwotCiAJLyogQklPUyBvZnRlbiBsZWF2ZXMgUkM2IGVuYWJsZWQsIGJ1dCBkaXNhYmxlIGl0IGZvciBodyBpbml0ICovCiAJaW50ZWxfZGlzYWJsZV9ndF9wb3dlcnNhdmUoZGV2KTsKLQotCS8qIFR1cm4gb2ZmIHBvd2VyIGdhdGUsIHJlcXVpcmUgZXNwZWNpYWxseSBmb3IgdGhlIEJJT1MgbGVzcyBzeXN0ZW0gKi8KLQlpZiAoSVNfVkFMTEVZVklFVyhkZXYpKSB7Ci0KLQkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQkJcmVnX3ZhbCA9IHZsdl9wdW5pdF9yZWFkKGRldl9wcml2LCBQVU5JVF9SRUdfUFdSR1RfU1RBVFVTKTsKLQotCQlpZiAocmVnX3ZhbCAmIChQVU5JVF9QV1JHVF9QV1JfR0FURShQVU5JVF9QT1dFUl9XRUxMX1JFTkRFUikgfAotCQkJICAgICAgIFBVTklUX1BXUkdUX1BXUl9HQVRFKFBVTklUX1BPV0VSX1dFTExfTUVESUEpIHwKLQkJCSAgICAgICBQVU5JVF9QV1JHVF9QV1JfR0FURShQVU5JVF9QT1dFUl9XRUxMX0RJU1AyRCkpKQotCQkJdmx2X3B1bml0X3dyaXRlKGRldl9wcml2LCBQVU5JVF9SRUdfUFdSR1RfQ1RSTCwgMHgwKTsKLQotCQltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0KLQl9CiB9CiAKIC8qCkBAIC00ODgsNiArNDY4LDE3IEBACiAjZGVmaW5lIE5FRURTX0ZPUkNFX1dBS0UoZGV2X3ByaXYsIHJlZykgXAogCSAoKHJlZykgPCAweDQwMDAwICYmIChyZWcpICE9IEZPUkNFV0FLRSkKIAorI2RlZmluZSBGT1JDRVdBS0VfVkxWX1JFTkRFUl9SQU5HRV9PRkZTRVQocmVnKSBcCisJKCgocmVnKSA+PSAweDIwMDAgJiYgKHJlZykgPCAweDQwMDApIHx8XAorCSgocmVnKSA+PSAweDUwMDAgJiYgKHJlZykgPCAweDgwMDApIHx8XAorCSgocmVnKSA+PSAweEIwMDAgJiYgKHJlZykgPCAweDEyMDAwKSB8fFwKKwkoKHJlZykgPj0gMHgyRTAwMCAmJiAocmVnKSA8IDB4MzAwMDApKQorCisjZGVmaW5lIEZPUkNFV0FLRV9WTFZfTUVESUFfUkFOR0VfT0ZGU0VUKHJlZylcCisJKCgocmVnKSA+PSAweDEyMDAwICYmIChyZWcpIDwgMHgxNDAwMCkgfHxcCisJKChyZWcpID49IDB4MjIwMDAgJiYgKHJlZykgPCAweDI0MDAwKSB8fFwKKwkoKHJlZykgPj0gMHgzMDAwMCAmJiAocmVnKSA8IDB4NDAwMDApKQorCiBzdGF0aWMgdm9pZAogaWxrX2R1bW15X3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKQEAgLTg1NCwxMiArODQ1LDE1IEBACiAJaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9yZXNldChkZXYsIGZhbHNlKTsKIH0KIAorI2RlZmluZSBHRU5fUkFOR0UobCwgaCkgR0VOTUFTSyhoLCBsKQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ2lzdGVyX3doaXRlbGlzdCB7CiAJdWludDY0X3Qgb2Zmc2V0OwogCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgZ2VuX2JpdG1hc2s7IC8qIHN1cHBvcnQgZ2VucywgMHgxMCBmb3IgNCwgMHgzMCBmb3IgNCBhbmQgNSwgZXRjLiAqLworCS8qIHN1cHBvcnRlZCBnZW5zLCAweDEwIGZvciA0LCAweDMwIGZvciA0IGFuZCA1LCBldGMuICovCisJdWludDMyX3QgZ2VuX2JpdG1hc2s7CiB9IHdoaXRlbGlzdFtdID0gewotCXsgUklOR19USU1FU1RBTVAoUkVOREVSX1JJTkdfQkFTRSksIDgsIDB4MUYwIH0sCisJeyBSSU5HX1RJTUVTVEFNUChSRU5ERVJfUklOR19CQVNFKSwgOCwgR0VOX1JBTkdFKDQsIDgpIH0sCiB9OwogCiBpbnQgaTkxNV9yZWdfcmVhZF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LApAQCAtOTExLDcgKzkwNSw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcmVzZXRfc3RhdHMgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBpOTE1X2N0eF9oYW5nX3N0YXRzICpoczsKLQlzdHJ1Y3QgaTkxNV9od19jb250ZXh0ICpjdHg7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmN0eDsKIAlpbnQgcmV0OwogCiAJaWYgKGFyZ3MtPmZsYWdzIHx8IGFyZ3MtPnBhZCkKQEAgLTk1NSw2ICs5NDksOSBAQAogewogCWludCByZXQ7CiAKKwkvKiBGSVhNRTogaTk2NWcvZ20gbmVlZCBhIGRpc3BsYXkgc2F2ZS9yZXN0b3JlIGZvciBncHUgcmVzZXQuICovCisJcmV0dXJuIC1FTk9ERVY7CisKIAkvKgogCSAqIFNldCB0aGUgZG9tYWlucyB3ZSB3YW50IHRvIHJlc2V0IChHUkRPTS9iaXRzIDIgYW5kIDMpIGFzCiAJICogd2VsbCBhcyB0aGUgcmVzZXQgYml0IChHUi9iaXQgMCkuICBTZXR0aW5nIHRoZSBHUiBiaXQKQEAgLTk2Niw3ICs5NjMsNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBXZSBjYW4ndCByZXNldCByZW5kZXImbWVkaWEgd2l0aG91dCBhbHNvIHJlc2V0dGluZyBkaXNwbGF5IC4uLiAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYtPnBkZXYsIEk5NjVfR0RSU1QsCiAJCQkgICAgICBHUkRPTV9NRURJQSB8IEdSRE9NX1JFU0VUX0VOQUJMRSk7CiAKQEAgLTk3OSwyNiArOTc1LDU4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXJvbmxha2VfZG9fcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZzR4X2RvX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgZ2Ryc3Q7CiAJaW50IHJldDsKIAotCWdkcnN0ID0gSTkxNV9SRUFEKE1DSEJBUl9NSVJST1JfQkFTRSArIElMS19HRFNSKTsKLQlnZHJzdCAmPSB+R1JET01fTUFTSzsKLQlJOTE1X1dSSVRFKE1DSEJBUl9NSVJST1JfQkFTRSArIElMS19HRFNSLAotCQkgICBnZHJzdCB8IEdSRE9NX1JFTkRFUiB8IEdSRE9NX1JFU0VUX0VOQUJMRSk7Ci0JcmV0ID0gd2FpdF9mb3IoSTkxNV9SRUFEKE1DSEJBUl9NSVJST1JfQkFTRSArIElMS19HRFNSKSAmIDB4MSwgNTAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LT5wZGV2LCBJOTY1X0dEUlNULAorCQkJICAgICAgR1JET01fUkVOREVSIHwgR1JET01fUkVTRVRfRU5BQkxFKTsKKwlyZXQgPSAgd2FpdF9mb3IoaTk2NV9yZXNldF9jb21wbGV0ZShkZXYpLCA1MDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBXZSBjYW4ndCByZXNldCByZW5kZXImbWVkaWEgd2l0aG91dCBhbHNvIHJlc2V0dGluZyBkaXNwbGF5IC4uLiAqLwotCWdkcnN0ID0gSTkxNV9SRUFEKE1DSEJBUl9NSVJST1JfQkFTRSArIElMS19HRFNSKTsKLQlnZHJzdCAmPSB+R1JET01fTUFTSzsKKwkvKiBXYVZjcENsa0dhdGVEaXNhYmxlRm9yTWVkaWFSZXNldDpjdGcsZWxrICovCisJSTkxNV9XUklURShWREVDQ0xLX0dBVEVfRCwgSTkxNV9SRUFEKFZERUNDTEtfR0FURV9EKSB8IFZDUF9VTklUX0NMT0NLX0dBVEVfRElTQUJMRSk7CisJUE9TVElOR19SRUFEKFZERUNDTEtfR0FURV9EKTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYtPnBkZXYsIEk5NjVfR0RSU1QsCisJCQkgICAgICBHUkRPTV9NRURJQSB8IEdSRE9NX1JFU0VUX0VOQUJMRSk7CisJcmV0ID0gIHdhaXRfZm9yKGk5NjVfcmVzZXRfY29tcGxldGUoZGV2KSwgNTAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FWY3BDbGtHYXRlRGlzYWJsZUZvck1lZGlhUmVzZXQ6Y3RnLGVsayAqLworCUk5MTVfV1JJVEUoVkRFQ0NMS19HQVRFX0QsIEk5MTVfUkVBRChWREVDQ0xLX0dBVEVfRCkgJiB+VkNQX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKwlQT1NUSU5HX1JFQUQoVkRFQ0NMS19HQVRFX0QpOworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgSTk2NV9HRFJTVCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcm9ubGFrZV9kb19yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKwogCUk5MTVfV1JJVEUoTUNIQkFSX01JUlJPUl9CQVNFICsgSUxLX0dEU1IsCi0JCSAgIGdkcnN0IHwgR1JET01fTUVESUEgfCBHUkRPTV9SRVNFVF9FTkFCTEUpOwotCXJldHVybiB3YWl0X2ZvcihJOTE1X1JFQUQoTUNIQkFSX01JUlJPUl9CQVNFICsgSUxLX0dEU1IpICYgMHgxLCA1MDApOworCQkgICBJTEtfR1JET01fUkVOREVSIHwgSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSk7CisJcmV0ID0gd2FpdF9mb3IoKEk5MTVfUkVBRChNQ0hCQVJfTUlSUk9SX0JBU0UgKyBJTEtfR0RTUikgJgorCQkJSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSkgPT0gMCwgNTAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJSTkxNV9XUklURShNQ0hCQVJfTUlSUk9SX0JBU0UgKyBJTEtfR0RTUiwKKwkJICAgSUxLX0dSRE9NX01FRElBIHwgSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSk7CisJcmV0ID0gd2FpdF9mb3IoKEk5MTVfUkVBRChNQ0hCQVJfTUlSUk9SX0JBU0UgKyBJTEtfR0RTUikgJgorCQkJSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSkgPT0gMCwgNTAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJSTkxNV9XUklURShNQ0hCQVJfTUlSUk9SX0JBU0UgKyBJTEtfR0RTUiwgMCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBnZW42X2RvX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0xMDI5LDcgKzEwNTcsMTEgQEAKIAljYXNlIDc6CiAJY2FzZSA2OiByZXR1cm4gZ2VuNl9kb19yZXNldChkZXYpOwogCWNhc2UgNTogcmV0dXJuIGlyb25sYWtlX2RvX3Jlc2V0KGRldik7Ci0JY2FzZSA0OiByZXR1cm4gaTk2NV9kb19yZXNldChkZXYpOworCWNhc2UgNDoKKwkJaWYgKElTX0c0WChkZXYpKQorCQkJcmV0dXJuIGc0eF9kb19yZXNldChkZXYpOworCQllbHNlCisJCQlyZXR1cm4gaTk2NV9kb19yZXNldChkZXYpOwogCWRlZmF1bHQ6IHJldHVybiAtRU5PREVWOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9pb2MzMi5jCmluZGV4IDg2YjRiYjguLjcyOWJmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lvYzMyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfaW9jMzIuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKIAkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOwogCi0JaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKG1nYV9jb21wYXRfaW9jdGxzKSkKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgQVJSQVlfU0laRShtZ2FfY29tcGF0X2lvY3RscykpCiAJCWZuID0gbWdhX2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKIAogCWlmIChmbiAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3N0YXRlLmMKaW5kZXggMzE0Njg1Yi4uNzkyZjkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9zdGF0ZS5jCkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogCiAJc3dpdGNoIChwYXJhbS0+cGFyYW0pIHsKIAljYXNlIE1HQV9QQVJBTV9JUlFfTlI6Ci0JCXZhbHVlID0gZHJtX2Rldl90b19pcnEoZGV2KTsKKwkJdmFsdWUgPSBkZXYtPnBkZXYtPmlycTsKIAkJYnJlYWs7CiAJY2FzZSBNR0FfUEFSQU1fQ0FSRF9UWVBFOgogCQl2YWx1ZSA9IGRldl9wcml2LT5jaGlwc2V0OwpAQCAtMTA5OSw0ICsxMDk5LDQgQEAKIAlEUk1fSU9DVExfREVGX0RSVihNR0FfRE1BX0JPT1RTVFJBUCwgbWdhX2RtYV9ib290c3RyYXAsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCiB9OwogCi1pbnQgbWdhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKG1nYV9pb2N0bHMpOworaW50IG1nYV9tYXhfaW9jdGwgPSBBUlJBWV9TSVpFKG1nYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYWcyMDAvbWdhZzIwMF9tYWluLmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX21haW4uYwppbmRleCAyNjg2OGU1Li5mNmIyODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX21haW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhZzIwMC9tZ2FnMjAwX21haW4uYwpAQCAtMzIyLDE3ICszMjIsMTMgQEAKIAogCXRibyA9ICYoKCpibyktPmJvKTsKIAl0dG1fYm9fdW5yZWYoJnRibyk7Ci0JaWYgKHRibyA9PSBOVUxMKQotCQkqYm8gPSBOVUxMOwotCisJKmJvID0gTlVMTDsKIH0KIAogdm9pZCBtZ2FnMjAwX2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgbWdhZzIwMF9ibyAqbWdhZzIwMF9ibyA9IGdlbV90b19tZ2FfYm8ob2JqKTsKIAotCWlmICghbWdhZzIwMF9ibykKLQkJcmV0dXJuOwogCW1nYWcyMDBfYm9fdW5yZWYoJm1nYWcyMDBfYm8pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25maWcKaW5kZXggYjY5ODQ5Ny4uZjEyMzg4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKIAl0cmlzdGF0ZSAiTVNNIERSTSIKIAlkZXBlbmRzIG9uIERSTQogCWRlcGVuZHMgb24gTVNNX0lPTU1VCi0JZGVwZW5kcyBvbiBBUkNIX01TTTg5NjAgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBBUkNIX1FDT00gfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCiAJc2VsZWN0IERSTV9LTVNfSEVMUEVSCiAJc2VsZWN0IFNITUVNCiAJc2VsZWN0IFRNUEZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQppbmRleCA1ZTFlNmIwLi45M2NhNDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDggQEAKIAltc21fZ2VtX3N1Ym1pdC5vIFwKIAltc21fZ3B1Lm8gXAogCW1zbV9pb21tdS5vIFwKKwltc21fcGVyZi5vIFwKKwltc21fcmQubyBcCiAJbXNtX3JpbmdidWZmZXIubwogCiBtc20tJChDT05GSUdfRFJNX01TTV9GQkRFVikgKz0gbXNtX2ZiZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHhfZ3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5jCmluZGV4IGYyMGZiZGU1Li45NDJlMDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2EzeHhfZ3B1LmMKQEAgLTIwNywxMSArMjA3LDExIEBACiAJLyogVHVybiBvbiBwZXJmb3JtYW5jZSBjb3VudGVyczogKi8KIAlncHVfd3JpdGUoZ3B1LCBSRUdfQTNYWF9SQkJNX1BFUkZDVFJfQ1RMLCAweDAxKTsKIAotCS8qIFNldCBTUCBwZXJmY291bnRlciA3IHRvIGNvdW50IFNQX0ZTX0ZVTExfQUxVX0lOU1RSVUNUSU9OUwotCSAqIHdlIHdpbGwgdXNlIHRoaXMgdG8gYXVnbWVudCBvdXIgaGFuZyBkZXRlY3Rpb246Ci0JICovCi0JZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfU1BfUEVSRkNPVU5URVI3X1NFTEVDVCwKLQkJCVNQX0ZTX0ZVTExfQUxVX0lOU1RSVUNUSU9OUyk7CisJLyogRW5hYmxlIHRoZSBwZXJmY250cnMgdGhhdCB3ZSB1c2UuLiAqLworCWZvciAoaSA9IDA7IGkgPCBncHUtPm51bV9wZXJmY250cnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbXNtX2dwdV9wZXJmY250ciAqcGVyZmNudHIgPSAmZ3B1LT5wZXJmY250cnNbaV07CisJCWdwdV93cml0ZShncHUsIHBlcmZjbnRyLT5zZWxlY3RfcmVnLCBwZXJmY250ci0+c2VsZWN0X3ZhbCk7CisJfQogCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0EzWFhfUkJCTV9JTlRfMF9NQVNLLCBBM1hYX0lOVDBfTUFTSyk7CiAKQEAgLTQ2NSw2ICs0NjUsMTMgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fZ3B1X3BlcmZjbnRyIHBlcmZjbnRyc1tdID0geworCXsgUkVHX0EzWFhfU1BfUEVSRkNPVU5URVI2X1NFTEVDVCwgUkVHX0EzWFhfUkJCTV9QRVJGQ1RSX1NQXzZfTE8sCisJCQlTUF9BTFVfQUNUSVZFX0NZQ0xFUywgIkFMVUFDVElWRSIgfSwKKwl7IFJFR19BM1hYX1NQX1BFUkZDT1VOVEVSN19TRUxFQ1QsIFJFR19BM1hYX1JCQk1fUEVSRkNUUl9TUF83X0xPLAorCQkJU1BfRlNfRlVMTF9BTFVfSU5TVFJVQ1RJT05TLCAiQUxVRlVMTCIgfSwKK307CisKIHN0cnVjdCBtc21fZ3B1ICphM3h4X2dwdV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGEzeHhfZ3B1ICphM3h4X2dwdSA9IE5VTEw7CkBAIC01MDQsNiArNTExLDkgQEAKIAlEQkcoImZhc3RfcmF0ZT0ldSwgc2xvd19yYXRlPSV1LCBidXNfZnJlcT0ldSIsCiAJCQlncHUtPmZhc3RfcmF0ZSwgZ3B1LT5zbG93X3JhdGUsIGdwdS0+YnVzX2ZyZXEpOwogCisJZ3B1LT5wZXJmY250cnMgPSBwZXJmY250cnM7CisJZ3B1LT5udW1fcGVyZmNudHJzID0gQVJSQVlfU0laRShwZXJmY250cnMpOworCiAJcmV0ID0gYWRyZW5vX2dwdV9pbml0KGRldiwgcGRldiwgYWRyZW5vX2dwdSwgJmZ1bmNzLCBjb25maWctPnJldik7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWlfY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9jb25uZWN0b3IuYwppbmRleCA3ZGVkZmRkLi5lNTZhNjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9jb25uZWN0b3IuYwpAQCAtMjQ3LDM2ICsyNDcsNDkgQEAKIAl9CiB9CiAKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGRldGVjdF9yZWcoc3RydWN0IGhkbWkgKmhkbWkpCit7CisJdWludDMyX3QgaHBkX2ludF9zdGF0dXMgPSBoZG1pX3JlYWQoaGRtaSwgUkVHX0hETUlfSFBEX0lOVF9TVEFUVVMpOworCXJldHVybiAoaHBkX2ludF9zdGF0dXMgJiBIRE1JX0hQRF9JTlRfU1RBVFVTX0NBQkxFX0RFVEVDVEVEKSA/CisJCQljb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkZXRlY3RfZ3BpbyhzdHJ1Y3QgaGRtaSAqaGRtaSkKK3sKKwljb25zdCBzdHJ1Y3QgaGRtaV9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGhkbWktPmNvbmZpZzsKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoY29uZmlnLT5ocGRfZ3BpbykgPworCQkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgorCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGhkbWlfY29ubmVjdG9yX2RldGVjdCgKIAkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgaGRtaV9jb25uZWN0b3IgKmhkbWlfY29ubmVjdG9yID0gdG9faGRtaV9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgaGRtaSAqaGRtaSA9IGhkbWlfY29ubmVjdG9yLT5oZG1pOwotCWNvbnN0IHN0cnVjdCBoZG1pX3BsYXRmb3JtX2NvbmZpZyAqY29uZmlnID0gaGRtaS0+Y29uZmlnOwotCXVpbnQzMl90IGhwZF9pbnRfc3RhdHVzOworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdF9ncGlvLCBzdGF0X3JlZzsKIAlpbnQgcmV0cnkgPSAyMDsKIAotCWhwZF9pbnRfc3RhdHVzID0gaGRtaV9yZWFkKGhkbWksIFJFR19IRE1JX0hQRF9JTlRfU1RBVFVTKTsKKwlkbyB7CisJCXN0YXRfZ3BpbyA9IGRldGVjdF9ncGlvKGhkbWkpOworCQlzdGF0X3JlZyAgPSBkZXRlY3RfcmVnKGhkbWkpOwogCi0JLyogc2Vuc2Ugc2VlbXMgdG8gaW4gc29tZSBjYXNlcyBiZSBtb21lbnRhcmlseSBkZS1hc3NlcnRlZCwgZG9uJ3QKLQkgKiBsZXQgdGhhdCB0cmljayB1cyBpbnRvIHRoaW5raW5nIHRoZSBtb25pdG9yIGlzIGdvbmU6Ci0JICovCi0Jd2hpbGUgKHJldHJ5LS0gJiYgIShocGRfaW50X3N0YXR1cyAmIEhETUlfSFBEX0lOVF9TVEFUVVNfQ0FCTEVfREVURUNURUQpKSB7Ci0JCS8qIGhkbWkgZGVib3VuY2UgbG9naWMgc2VlbXMgdG8gZ2V0IHN0dWNrIHNvbWV0aW1lcywKLQkJICogcmVhZCBkaXJlY3RseSB0aGUgZ3BpbyB0byBnZXQgYSBzZWNvbmQgb3BpbmlvbjoKLQkJICovCi0JCWlmIChncGlvX2dldF92YWx1ZShjb25maWctPmhwZF9ncGlvKSkgewotCQkJREJHKCJncGlvIHRlbGxzIHVzIHdlIGFyZSBjb25uZWN0ZWQhIik7Ci0JCQlocGRfaW50X3N0YXR1cyB8PSBIRE1JX0hQRF9JTlRfU1RBVFVTX0NBQkxFX0RFVEVDVEVEOworCQlpZiAoc3RhdF9ncGlvID09IHN0YXRfcmVnKQogCQkJYnJlYWs7Ci0JCX0KKwogCQltZGVsYXkoMTApOwotCQlocGRfaW50X3N0YXR1cyA9IGhkbWlfcmVhZChoZG1pLCBSRUdfSERNSV9IUERfSU5UX1NUQVRVUyk7Ci0JCURCRygic3RhdHVzPSUwOHgiLCBocGRfaW50X3N0YXR1cyk7CisJfSB3aGlsZSAoLS1yZXRyeSk7CisKKwkvKiB0aGUgc3RhdHVzIHdlIGdldCBmcm9tIHJlYWRpbmcgZ3BpbyBzZWVtcyB0byBiZSBtb3JlIHJlbGlhYmxlLAorCSAqIHNvIHRydXN0IHRoYXQgb25lIHRoZSBtb3N0IGlmIHdlIGRpZG4ndCBtYW5hZ2UgdG8gZ2V0IGhkbWkgYW5kCisJICogZ3BpbyBzdGF0dXMgdG8gYWdyZWU6CisJICovCisJaWYgKHN0YXRfZ3BpbyAhPSBzdGF0X3JlZykgeworCQlEQkcoIkhETUlfSFBEX0lOVF9TVEFUVVMgdGVsbHMgdXM6ICVkIiwgc3RhdF9yZWcpOworCQlEQkcoImhwZCBncGlvIHRlbGxzIHVzOiAlZCIsIHN0YXRfZ3Bpbyk7CiAJfQogCi0JcmV0dXJuIChocGRfaW50X3N0YXR1cyAmIEhETUlfSFBEX0lOVF9TVEFUVVNfQ0FCTEVfREVURUNURUQpID8KLQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDogY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJcmV0dXJuIHN0YXRfZ3BpbzsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQpAQCAtMzg5LDcgKzQwMiw4IEBACiAJCQlEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpOwogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZoZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwogCi0JY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOworCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0NPTk5FQ1QgfAorCQkJRFJNX0NPTk5FQ1RPUl9QT0xMX0RJU0NPTk5FQ1Q7CiAKIAljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMTsKIAljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNC9tZHA0X2NydGMuYwppbmRleCBlZjk5NTdkLi43NGNlYmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA0L21kcDRfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDQvbWRwNF9jcnRjLmMKQEAgLTIxNyw4ICsyMTcsNiBAQAogewogCXN0cnVjdCBtZHA0X2NydGMgKm1kcDRfY3J0YyA9IHRvX21kcDRfY3J0YyhjcnRjKTsKIAotCW1kcDRfY3J0Yy0+cGxhbmUtPmZ1bmNzLT5kZXN0cm95KG1kcDRfY3J0Yy0+cGxhbmUpOwotCiAJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKIAlkcm1fZmxpcF93b3JrX2NsZWFudXAoJm1kcDRfY3J0Yy0+dW5yZWZfZmJfd29yayk7CiAJZHJtX2ZsaXBfd29ya19jbGVhbnVwKCZtZHA0X2NydGMtPnVucmVmX2N1cnNvcl93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfY3J0Yy5jCmluZGV4IDZlYTEwYmQuLmViZTJlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2NydGMuYwpAQCAtMTk1LDggKzE5NSw2IEBACiB7CiAJc3RydWN0IG1kcDVfY3J0YyAqbWRwNV9jcnRjID0gdG9fbWRwNV9jcnRjKGNydGMpOwogCi0JbWRwNV9jcnRjLT5wbGFuZS0+ZnVuY3MtPmRlc3Ryb3kobWRwNV9jcnRjLT5wbGFuZSk7Ci0KIAlkcm1fY3J0Y19jbGVhbnVwKGNydGMpOwogCWRybV9mbGlwX3dvcmtfY2xlYW51cCgmbWRwNV9jcnRjLT51bnJlZl9mYl93b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X2ttcy5jCmluZGV4IGVlODQ0NmMuLjQyY2FmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21kcC9tZHA1L21kcDVfa21zLmMKQEAgLTI4MCwxMiArMjgwLDIyIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlyZXQgPSBnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+YXhpX2NsaywgImJ1c19jbGsiKSB8fAotCQkJZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmFoYl9jbGssICJpZmFjZV9jbGsiKSB8fAotCQkJZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPnNyY19jbGssICJjb3JlX2Nsa19zcmMiKSB8fAotCQkJZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmNvcmVfY2xrLCAiY29yZV9jbGsiKSB8fAotCQkJZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmx1dF9jbGssICJsdXRfY2xrIikgfHwKLQkJCWdldF9jbGsocGRldiwgJm1kcDVfa21zLT52c3luY19jbGssICJ2c3luY19jbGsiKTsKKwlyZXQgPSBnZXRfY2xrKHBkZXYsICZtZHA1X2ttcy0+YXhpX2NsaywgImJ1c19jbGsiKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmFoYl9jbGssICJpZmFjZV9jbGsiKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPnNyY19jbGssICJjb3JlX2Nsa19zcmMiKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmNvcmVfY2xrLCAiY29yZV9jbGsiKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gZ2V0X2NsayhwZGV2LCAmbWRwNV9rbXMtPmx1dF9jbGssICJsdXRfY2xrIik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCXJldCA9IGdldF9jbGsocGRldiwgJm1kcDVfa21zLT52c3luY19jbGssICJ2c3luY19jbGsiKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbWRwL21kcDUvbWRwNV9wbGFuZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X3BsYW5lLmMKaW5kZXggNDdmN2JiYi4uZjNkYWVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X3BsYW5lLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tZHAvbWRwNS9tZHA1X3BsYW5lLmMKQEAgLTg1LDggKzg1LDExIEBACiBzdGF0aWMgdm9pZCBtZHA1X3BsYW5lX2Rlc3Ryb3koc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCiB7CiAJc3RydWN0IG1kcDVfcGxhbmUgKm1kcDVfcGxhbmUgPSB0b19tZHA1X3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gcGxhbmUtPmRldi0+ZGV2X3ByaXZhdGU7CiAKLQltZHA1X3BsYW5lX2Rpc2FibGUocGxhbmUpOworCWlmIChwcml2LT5rbXMpCisJCW1kcDVfcGxhbmVfZGlzYWJsZShwbGFuZSk7CisKIAlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7CiAKIAlrZnJlZShtZHA1X3BsYW5lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKaW5kZXggZjlkZTE1Ni4uMGQyNTYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQkgKiBpcyBib2d1cywgYnV0IG5vbi1udWxsIGlmIGFsbG9jYXRpb24gc3VjY2VlZGVkOgogCQkgKi8KIAkJcCA9IGRtYV9hbGxvY19hdHRycyhkZXYtPmRldiwgc2l6ZSwKLQkJCQkmcHJpdi0+dnJhbS5wYWRkciwgMCwgJmF0dHJzKTsKKwkJCQkmcHJpdi0+dnJhbS5wYWRkciwgR0ZQX0tFUk5FTCwgJmF0dHJzKTsKIAkJaWYgKCFwKSB7CiAJCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIFZSQU1cbiIpOwogCQkJcHJpdi0+dnJhbS5wYWRkciA9IDA7CkBAIC0yODgsNyArMjg4LDcgQEAKIAl9CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGRldi0+ZGV2KTsKLQlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2KTsKKwlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2LCBwbGF0Zm9ybV9nZXRfaXJxKGRldi0+cGxhdGZvcm1kZXYsIDApKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgSVJRIGhhbmRsZXJcbiIpOwpAQCAtMjk5LDYgKzI5OSwxMCBAQAogCXByaXYtPmZiZGV2ID0gbXNtX2ZiZGV2X2luaXQoZGV2KTsKICNlbmRpZgogCisJcmV0ID0gbXNtX2RlYnVnZnNfbGF0ZV9pbml0KGRldik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCiAJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTM4MiwxMSArMzg2LDggQEAKIHN0YXRpYyB2b2lkIG1zbV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpZiAocHJpdi0+ZmJkZXYpIHsKLQkJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKLQkJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUocHJpdi0+ZmJkZXYpOwotCQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldik7Ci0JfQorCWlmIChwcml2LT5mYmRldikKKwkJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQocHJpdi0+ZmJkZXYpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX2lycShpbnQgaXJxLCB2b2lkICphcmcpCkBAIC01MzEsNiArNTMyLDQxIEBACiAJCXsgImZiIiwgc2hvd19sb2NrZWQsIDAsIG1zbV9mYl9zaG93IH0sCiB9OwogCitzdGF0aWMgaW50IGxhdGVfaW5pdF9taW5vcihzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtaW5vcikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBtc21fcmRfZGVidWdmc19pbml0KG1pbm9yKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobWlub3ItPmRldi0+ZGV2LCAiY291bGQgbm90IGluc3RhbGwgcmQgZGVidWdmc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbXNtX3BlcmZfZGVidWdmc19pbml0KG1pbm9yKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobWlub3ItPmRldi0+ZGV2LCAiY291bGQgbm90IGluc3RhbGwgcGVyZiBkZWJ1Z2ZzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kZWJ1Z2ZzX2xhdGVfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gbGF0ZV9pbml0X21pbm9yKGRldi0+cHJpbWFyeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBsYXRlX2luaXRfbWlub3IoZGV2LT5yZW5kZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gbGF0ZV9pbml0X21pbm9yKGRldi0+Y29udHJvbCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtc21fZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OwpAQCAtNTQ1LDEzICs1ODEsMTcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtc21fZGVidWdmc19jbGVhbnVwKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQogewogCWRybV9kZWJ1Z2ZzX3JlbW92ZV9maWxlcyhtc21fZGVidWdmc19saXN0LAogCQkJQVJSQVlfU0laRShtc21fZGVidWdmc19saXN0KSwgbWlub3IpOworCWlmICghbWlub3ItPmRldi0+ZGV2X3ByaXZhdGUpCisJCXJldHVybjsKKwltc21fcmRfZGVidWdmc19jbGVhbnVwKG1pbm9yKTsKKwltc21fcGVyZl9kZWJ1Z2ZzX2NsZWFudXAobWlub3IpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmgKaW5kZXggOWQxMGVlMC4uOGEyYzVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmgKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfQ09NUElMRV9URVNUKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9NU00pCisjaWYgZGVmaW5lZChDT05GSUdfQ09NUElMRV9URVNUKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9RQ09NKQogLyogc3R1YnMgd2UgbmVlZCBmb3IgY29tcGlsZS10ZXN0OiAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICptc21faW9tbXVfZ2V0X2N0eChjb25zdCBjaGFyICpjdHhfbmFtZSkKIHsKQEAgLTU1LDYgKzU1LDkgQEAKIHN0cnVjdCBtc21fa21zOwogc3RydWN0IG1zbV9ncHU7CiBzdHJ1Y3QgbXNtX21tdTsKK3N0cnVjdCBtc21fcmRfc3RhdGU7CitzdHJ1Y3QgbXNtX3BlcmZfc3RhdGU7CitzdHJ1Y3QgbXNtX2dlbV9zdWJtaXQ7CiAKICNkZWZpbmUgTlVNX0RPTUFJTlMgMiAgICAvKiBvbmUgZm9yIEtNUywgdGhlbiBvbmUgcGVyIGdwdSBjb3JlICg/KSAqLwogCkBAIC04Miw2ICs4NSw5IEBACiAJdWludDMyX3QgbmV4dF9mZW5jZSwgY29tcGxldGVkX2ZlbmNlOwogCXdhaXRfcXVldWVfaGVhZF90IGZlbmNlX2V2ZW50OwogCisJc3RydWN0IG1zbV9yZF9zdGF0ZSAqcmQ7CisJc3RydWN0IG1zbV9wZXJmX3N0YXRlICpwZXJmOworCiAJLyogbGlzdCBvZiBHRU0gb2JqZWN0czogKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGluYWN0aXZlX2xpc3Q7CiAKQEAgLTIwNCw2ICsyMTAsMTUgQEAKIHZvaWQgbXNtX2dlbV9kZXNjcmliZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgc3RydWN0IHNlcV9maWxlICptKTsKIHZvaWQgbXNtX2dlbV9kZXNjcmliZV9vYmplY3RzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBzZXFfZmlsZSAqbSk7CiB2b2lkIG1zbV9mcmFtZWJ1ZmZlcl9kZXNjcmliZShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgc3RydWN0IHNlcV9maWxlICptKTsKK2ludCBtc21fZGVidWdmc19sYXRlX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgbXNtX3JkX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7Cit2b2lkIG1zbV9yZF9kZWJ1Z2ZzX2NsZWFudXAoc3RydWN0IGRybV9taW5vciAqbWlub3IpOwordm9pZCBtc21fcmRfZHVtcF9zdWJtaXQoc3RydWN0IG1zbV9nZW1fc3VibWl0ICpzdWJtaXQpOworaW50IG1zbV9wZXJmX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7Cit2b2lkIG1zbV9wZXJmX2RlYnVnZnNfY2xlYW51cChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbXNtX2RlYnVnZnNfbGF0ZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fcmRfZHVtcF9zdWJtaXQoc3RydWN0IG1zbV9nZW1fc3VibWl0ICpzdWJtaXQpIHt9CiAjZW5kaWYKIAogdm9pZCBfX2lvbWVtICptc21faW9yZW1hcChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uaAppbmRleCAzMjQ2YmI0Li5iZmIwNTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uaApAQCAtOTAsNiArOTAsNyBAQAogCQl1aW50MzJfdCB0eXBlOwogCQl1aW50MzJfdCBzaXplOyAgLyogaW4gZHdvcmRzICovCiAJCXVpbnQzMl90IGlvdmE7CisJCXVpbnQzMl90IGlkeDsgICAvKiBjbWRzdHJlYW0gYnVmZmVyIGlkeCBpbiBib3NbXSAqLwogCX0gY21kW01BWF9DTURTXTsKIAlzdHJ1Y3QgewogCQl1aW50MzJfdCBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYwppbmRleCAxZjFmNGNmLi5jZDA1NTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtX3N1Ym1pdC5jCkBAIC00MDIsNiArNDAyLDcgQEAKIAkJc3VibWl0LT5jbWRbaV0udHlwZSA9IHN1Ym1pdF9jbWQudHlwZTsKIAkJc3VibWl0LT5jbWRbaV0uc2l6ZSA9IHN1Ym1pdF9jbWQuc2l6ZSAvIDQ7CiAJCXN1Ym1pdC0+Y21kW2ldLmlvdmEgPSBpb3ZhICsgc3VibWl0X2NtZC5zdWJtaXRfb2Zmc2V0OworCQlzdWJtaXQtPmNtZFtpXS5pZHggID0gc3VibWl0X2NtZC5zdWJtaXRfaWR4OwogCiAJCWlmIChzdWJtaXQtPnZhbGlkKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCmluZGV4IDNlNjY3Y2EuLmM2MzIyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5jCkBAIC0zMjAsNiArMzIwLDEwMSBAQAogfQogCiAvKgorICogUGVyZm9ybWFuY2UgQ291bnRlcnM6CisgKi8KKworLyogY2FsbGVkIHVuZGVyIHBlcmZfbG9jayAqLworc3RhdGljIGludCB1cGRhdGVfaHdfY250cnMoc3RydWN0IG1zbV9ncHUgKmdwdSwgdWludDMyX3QgbmNudHJzLCB1aW50MzJfdCAqY250cnMpCit7CisJdWludDMyX3QgY3VycmVudF9jbnRyc1tBUlJBWV9TSVpFKGdwdS0+bGFzdF9jbnRycyldOworCWludCBpLCBuID0gbWluKG5jbnRycywgZ3B1LT5udW1fcGVyZmNudHJzKTsKKworCS8qIHJlYWQgY3VycmVudCB2YWx1ZXM6ICovCisJZm9yIChpID0gMDsgaSA8IGdwdS0+bnVtX3BlcmZjbnRyczsgaSsrKQorCQljdXJyZW50X2NudHJzW2ldID0gZ3B1X3JlYWQoZ3B1LCBncHUtPnBlcmZjbnRyc1tpXS5zYW1wbGVfcmVnKTsKKworCS8qIHVwZGF0ZSBjbnRyczogKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQljbnRyc1tpXSA9IGN1cnJlbnRfY250cnNbaV0gLSBncHUtPmxhc3RfY250cnNbaV07CisKKwkvKiBzYXZlIGN1cnJlbnQgdmFsdWVzOiAqLworCWZvciAoaSA9IDA7IGkgPCBncHUtPm51bV9wZXJmY250cnM7IGkrKykKKwkJZ3B1LT5sYXN0X2NudHJzW2ldID0gY3VycmVudF9jbnRyc1tpXTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3dfY250cnMoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlrdGltZV90IHRpbWU7CisJdWludDMyX3QgZWxhcHNlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwdS0+cGVyZl9sb2NrLCBmbGFncyk7CisJaWYgKCFncHUtPnBlcmZjbnRyX2FjdGl2ZSkKKwkJZ290byBvdXQ7CisKKwl0aW1lID0ga3RpbWVfZ2V0KCk7CisJZWxhcHNlZCA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0aW1lLCBncHUtPmxhc3Rfc2FtcGxlLnRpbWUpKTsKKworCWdwdS0+dG90YWx0aW1lICs9IGVsYXBzZWQ7CisJaWYgKGdwdS0+bGFzdF9zYW1wbGUuYWN0aXZlKQorCQlncHUtPmFjdGl2ZXRpbWUgKz0gZWxhcHNlZDsKKworCWdwdS0+bGFzdF9zYW1wbGUuYWN0aXZlID0gbXNtX2dwdV9hY3RpdmUoZ3B1KTsKKwlncHUtPmxhc3Rfc2FtcGxlLnRpbWUgPSB0aW1lOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3B1LT5wZXJmX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtc21fZ3B1X3BlcmZjbnRyX3N0YXJ0KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncHUtPnBlcmZfbG9jaywgZmxhZ3MpOworCS8qIHdlIGNvdWxkIGR5bmFtaWNhbGx5IGVuYWJsZS9kaXNhYmxlIHBlcmZjbnRyIHJlZ2lzdGVycyB0b28uLiAqLworCWdwdS0+bGFzdF9zYW1wbGUuYWN0aXZlID0gbXNtX2dwdV9hY3RpdmUoZ3B1KTsKKwlncHUtPmxhc3Rfc2FtcGxlLnRpbWUgPSBrdGltZV9nZXQoKTsKKwlncHUtPmFjdGl2ZXRpbWUgPSBncHUtPnRvdGFsdGltZSA9IDA7CisJZ3B1LT5wZXJmY250cl9hY3RpdmUgPSB0cnVlOworCXVwZGF0ZV9od19jbnRycyhncHUsIDAsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdS0+cGVyZl9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbXNtX2dwdV9wZXJmY250cl9zdG9wKHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJZ3B1LT5wZXJmY250cl9hY3RpdmUgPSBmYWxzZTsKK30KKworLyogcmV0dXJucyAtZXJybm8gb3IgIyBvZiBjbnRycyBzYW1wbGVkICovCitpbnQgbXNtX2dwdV9wZXJmY250cl9zYW1wbGUoc3RydWN0IG1zbV9ncHUgKmdwdSwgdWludDMyX3QgKmFjdGl2ZXRpbWUsCisJCXVpbnQzMl90ICp0b3RhbHRpbWUsIHVpbnQzMl90IG5jbnRycywgdWludDMyX3QgKmNudHJzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncHUtPnBlcmZfbG9jaywgZmxhZ3MpOworCisJaWYgKCFncHUtPnBlcmZjbnRyX2FjdGl2ZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkqYWN0aXZldGltZSA9IGdwdS0+YWN0aXZldGltZTsKKwkqdG90YWx0aW1lID0gZ3B1LT50b3RhbHRpbWU7CisKKwlncHUtPmFjdGl2ZXRpbWUgPSBncHUtPnRvdGFsdGltZSA9IDA7CisKKwlyZXQgPSB1cGRhdGVfaHdfY250cnMoZ3B1LCBuY250cnMsIGNudHJzKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdS0+cGVyZl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogQ21kc3RyZWFtIHN1Ym1pc3Npb24vcmV0aXJlbWVudDoKICAqLwogCkBAIC0zNjEsNiArNDU2LDcgQEAKIHsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZ3B1LT5kZXYtPmRldl9wcml2YXRlOwogCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZncHUtPnJldGlyZV93b3JrKTsKKwl1cGRhdGVfc3dfY250cnMoZ3B1KTsKIH0KIAogLyogYWRkIGJvJ3MgdG8gZ3B1J3MgcmluZywgYW5kIGtpY2sgZ3B1OiAqLwpAQCAtMzc3LDYgKzQ3MywxMiBAQAogCiAJaW5hY3RpdmVfY2FuY2VsKGdwdSk7CiAKKwltc21fcmRfZHVtcF9zdWJtaXQoc3VibWl0KTsKKworCWdwdS0+c3VibWl0dGVkX2ZlbmNlID0gc3VibWl0LT5mZW5jZTsKKworCXVwZGF0ZV9zd19jbnRycyhncHUpOworCiAJcmV0ID0gZ3B1LT5mdW5jcy0+c3VibWl0KGdwdSwgc3VibWl0LCBjdHgpOwogCXByaXYtPmxhc3RjdHggPSBjdHg7CiAKQEAgLTQyOSw2ICs1MzEsOSBAQAogCXN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11OwogCWludCBpLCByZXQ7CiAKKwlpZiAoV0FSTl9PTihncHUtPm51bV9wZXJmY250cnMgPiBBUlJBWV9TSVpFKGdwdS0+bGFzdF9jbnRycykpKQorCQlncHUtPm51bV9wZXJmY250cnMgPSBBUlJBWV9TSVpFKGdwdS0+bGFzdF9jbnRycyk7CisKIAlncHUtPmRldiA9IGRybTsKIAlncHUtPmZ1bmNzID0gZnVuY3M7CiAJZ3B1LT5uYW1lID0gbmFtZTsKQEAgLTQ0NCw2ICs1NDksOCBAQAogCXNldHVwX3RpbWVyKCZncHUtPmhhbmdjaGVja190aW1lciwgaGFuZ2NoZWNrX2hhbmRsZXIsCiAJCQkodW5zaWduZWQgbG9uZylncHUpOwogCisJc3Bpbl9sb2NrX2luaXQoJmdwdS0+cGVyZl9sb2NrKTsKKwogCUJVR19PTihBUlJBWV9TSVpFKGNsa19uYW1lcykgIT0gQVJSQVlfU0laRShncHUtPmdycF9jbGtzKSk7CiAKIAkvKiBNYXAgcmVnaXN0ZXJzOiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ3B1LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaAppbmRleCBmYWQyNzAwLi45YjU3OWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9ncHUuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgIm1zbV9yaW5nYnVmZmVyLmgiCiAKIHN0cnVjdCBtc21fZ2VtX3N1Ym1pdDsKK3N0cnVjdCBtc21fZ3B1X3BlcmZjbnRyOwogCiAvKiBTbyBmYXIsIHdpdGggaGFyZHdhcmUgdGhhdCBJJ3ZlIHNlZW4gdG8gZGF0ZSwgd2UgY2FuIGhhdmU6CiAgKiAgKyB6ZXJvLCBvbmUsIG9yIHR3byB6MTgwIDJkIGNvcmVzCkBAIC02NCw2ICs2NSwxOCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJY29uc3Qgc3RydWN0IG1zbV9ncHVfZnVuY3MgKmZ1bmNzOwogCisJLyogcGVyZm9ybWFuY2UgY291bnRlcnMgKGh3ICYgc3cpOiAqLworCXNwaW5sb2NrX3QgcGVyZl9sb2NrOworCWJvb2wgcGVyZmNudHJfYWN0aXZlOworCXN0cnVjdCB7CisJCWJvb2wgYWN0aXZlOworCQlrdGltZV90IHRpbWU7CisJfSBsYXN0X3NhbXBsZTsKKwl1aW50MzJfdCB0b3RhbHRpbWUsIGFjdGl2ZXRpbWU7ICAgIC8qIHN3IGNvdW50ZXJzICovCisJdWludDMyX3QgbGFzdF9jbnRyc1s1XTsgICAgICAgICAgICAvKiBodyBjb3VudGVycyAqLworCWNvbnN0IHN0cnVjdCBtc21fZ3B1X3BlcmZjbnRyICpwZXJmY250cnM7CisJdWludDMyX3QgbnVtX3BlcmZjbnRyczsKKwogCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmI7CiAJdWludDMyX3QgcmJfaW92YTsKIApAQCAtMTEzLDYgKzEyNiwxOSBAQAogCXJldHVybiBncHUtPnN1Ym1pdHRlZF9mZW5jZSA+IGdwdS0+ZnVuY3MtPmxhc3RfZmVuY2UoZ3B1KTsKIH0KIAorLyogUGVyZi1Db3VudGVyczoKKyAqIFRoZSBzZWxlY3RfcmVnIGFuZCBzZWxlY3RfdmFsIGFyZSBqdXN0IHRoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgY2hpbGQKKyAqIGNsYXNzIHRoYXQgYWN0dWFsbHkgZW5hYmxlcyB0aGUgcGVyZiBjb3VudGVyLi4gIGJ1dCBtc21fZ3B1IGJhc2UgY2xhc3MKKyAqIHdpbGwgaGFuZGxlIHNhbXBsaW5nL2Rpc3BsYXlpbmcgdGhlIGNvdW50ZXJzLgorICovCisKK3N0cnVjdCBtc21fZ3B1X3BlcmZjbnRyIHsKKwl1aW50MzJfdCBzZWxlY3RfcmVnOworCXVpbnQzMl90IHNhbXBsZV9yZWc7CisJdWludDMyX3Qgc2VsZWN0X3ZhbDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKwogc3RhdGljIGlubGluZSB2b2lkIGdwdV93cml0ZShzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCB1MzIgcmVnLCB1MzIgZGF0YSkKIHsKIAltc21fd3JpdGVsKGRhdGEsIGdwdS0+bW1pbyArIChyZWcgPDwgMikpOwpAQCAtMTI2LDYgKzE1MiwxMSBAQAogaW50IG1zbV9ncHVfcG1fc3VzcGVuZChzdHJ1Y3QgbXNtX2dwdSAqZ3B1KTsKIGludCBtc21fZ3B1X3BtX3Jlc3VtZShzdHJ1Y3QgbXNtX2dwdSAqZ3B1KTsKIAordm9pZCBtc21fZ3B1X3BlcmZjbnRyX3N0YXJ0KHN0cnVjdCBtc21fZ3B1ICpncHUpOwordm9pZCBtc21fZ3B1X3BlcmZjbnRyX3N0b3Aoc3RydWN0IG1zbV9ncHUgKmdwdSk7CitpbnQgbXNtX2dwdV9wZXJmY250cl9zYW1wbGUoc3RydWN0IG1zbV9ncHUgKmdwdSwgdWludDMyX3QgKmFjdGl2ZXRpbWUsCisJCXVpbnQzMl90ICp0b3RhbHRpbWUsIHVpbnQzMl90IG5jbnRycywgdWludDMyX3QgKmNudHJzKTsKKwogdm9pZCBtc21fZ3B1X3JldGlyZShzdHJ1Y3QgbXNtX2dwdSAqZ3B1KTsKIGludCBtc21fZ3B1X3N1Ym1pdChzdHJ1Y3QgbXNtX2dwdSAqZ3B1LCBzdHJ1Y3QgbXNtX2dlbV9zdWJtaXQgKnN1Ym1pdCwKIAkJc3RydWN0IG1zbV9maWxlX3ByaXZhdGUgKmN0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9wZXJmLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9wZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwODU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX3BlcmYuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qIEZvciBwcm9maWxpbmcsIHVzZXJzcGFjZSBjYW46CisgKgorICogICB0YWlsIC1mIC9zeXMva2VybmVsL2RlYnVnL2RyaS88bWlub3I+L2dwdQorICoKKyAqIFRoaXMgd2lsbCBlbmFibGUgcGVyZm9ybWFuY2UgY291bnRlcnMvcHJvZmlsaW5nIHRvIHRyYWNrIHRoZSBidXN5IHRpbWUKKyAqIGFuZCBhbnkgZ3B1IHNwZWNpZmljIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHRoYXQgYXJlIHN1cHBvcnRlZC4KKyAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibXNtX2dwdS5oIgorCitzdHJ1Y3QgbXNtX3BlcmZfc3RhdGUgeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisKKwlib29sIG9wZW47CisJaW50IGNudDsKKwlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOworCisJY2hhciBidWZbMjU2XTsKKwlpbnQgYnVmdG90LCBidWZwb3M7CisKKwl1bnNpZ25lZCBsb25nIG5leHRfamlmZmllczsKKworCXN0cnVjdCBkZW50cnkgKmVudDsKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZTsKK307CisKKyNkZWZpbmUgU0FNUExFX1RJTUUgKEhaLzQpCisKKy8qIHdhaXQgZm9yIG5leHQgc2FtcGxlIHRpbWU6ICovCitzdGF0aWMgaW50IHdhaXRfc2FtcGxlKHN0cnVjdCBtc21fcGVyZl9zdGF0ZSAqcGVyZikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJaWYgKHRpbWVfYWZ0ZXIocGVyZi0+bmV4dF9qaWZmaWVzLCBzdGFydF9qaWZmaWVzKSkgeworCQl1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19qaWZmaWVzID0KKwkJCXBlcmYtPm5leHRfamlmZmllcyAtIHN0YXJ0X2ppZmZpZXM7CisJCWludCByZXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUocmVtYWluaW5nX2ppZmZpZXMpOworCQlpZiAocmV0ID4gMCkgeworCQkJLyogaW50ZXJydXB0ZWQgKi8KKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwl9CisJcGVyZi0+bmV4dF9qaWZmaWVzICs9IFNBTVBMRV9USU1FOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlZmlsbF9idWYoc3RydWN0IG1zbV9wZXJmX3N0YXRlICpwZXJmKQoreworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBwZXJmLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSBwcml2LT5ncHU7CisJY2hhciAqcHRyID0gcGVyZi0+YnVmOworCWludCByZW0gPSBzaXplb2YocGVyZi0+YnVmKTsKKwlpbnQgaSwgbjsKKworCWlmICgocGVyZi0+Y250KysgJSAzMikgPT0gMCkgeworCQkvKiBIZWFkZXIgbGluZTogKi8KKwkJbiA9IHNucHJpbnRmKHB0ciwgcmVtLCAiJSVCVVNZIik7CisJCXB0ciArPSBuOworCQlyZW0gLT0gbjsKKworCQlmb3IgKGkgPSAwOyBpIDwgZ3B1LT5udW1fcGVyZmNudHJzOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCBtc21fZ3B1X3BlcmZjbnRyICpwZXJmY250ciA9ICZncHUtPnBlcmZjbnRyc1tpXTsKKwkJCW4gPSBzbnByaW50ZihwdHIsIHJlbSwgIlx0JXMiLCBwZXJmY250ci0+bmFtZSk7CisJCQlwdHIgKz0gbjsKKwkJCXJlbSAtPSBuOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2FtcGxlIGxpbmU6ICovCisJCXVpbnQzMl90IGFjdGl2ZXRpbWUgPSAwLCB0b3RhbHRpbWUgPSAwOworCQl1aW50MzJfdCBjbnRyc1s1XTsKKwkJdWludDMyX3QgdmFsOworCQlpbnQgcmV0OworCisJCS8qIHNsZWVwIHVudGlsIG5leHQgc2FtcGxlIHRpbWU6ICovCisJCXJldCA9IHdhaXRfc2FtcGxlKHBlcmYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBtc21fZ3B1X3BlcmZjbnRyX3NhbXBsZShncHUsICZhY3RpdmV0aW1lLCAmdG90YWx0aW1lLAorCQkJCUFSUkFZX1NJWkUoY250cnMpLCBjbnRycyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwgPSB0b3RhbHRpbWUgPyAxMDAwICogYWN0aXZldGltZSAvIHRvdGFsdGltZSA6IDA7CisJCW4gPSBzbnByaW50ZihwdHIsIHJlbSwgIiUzZC4lZCUlIiwgdmFsIC8gMTAsIHZhbCAlIDEwKTsKKwkJcHRyICs9IG47CisJCXJlbSAtPSBuOworCisJCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKykgeworCQkJLyogY3ljbGUgY291bnRlcnMgKEkgdGhpbmspLi4gY29udmVydCB0byBNSHouLiAqLworCQkJdmFsID0gY250cnNbaV0gLyAxMDAwMDsKKwkJCW4gPSBzbnByaW50ZihwdHIsIHJlbSwgIlx0JTVkLiUwMmQiLAorCQkJCQl2YWwgLyAxMDAsIHZhbCAlIDEwMCk7CisJCQlwdHIgKz0gbjsKKwkJCXJlbSAtPSBuOworCQl9CisJfQorCisJbiA9IHNucHJpbnRmKHB0ciwgcmVtLCAiXG4iKTsKKwlwdHIgKz0gbjsKKwlyZW0gLT0gbjsKKworCXBlcmYtPmJ1ZnBvcyA9IDA7CisJcGVyZi0+YnVmdG90ID0gcHRyIC0gcGVyZi0+YnVmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBlcmZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IHN6LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG1zbV9wZXJmX3N0YXRlICpwZXJmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBuID0gMCwgcmV0OworCisJbXV0ZXhfbG9jaygmcGVyZi0+cmVhZF9sb2NrKTsKKworCWlmIChwZXJmLT5idWZwb3MgPj0gcGVyZi0+YnVmdG90KSB7CisJCXJldCA9IHJlZmlsbF9idWYocGVyZik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwluID0gbWluKChpbnQpc3osIHBlcmYtPmJ1ZnRvdCAtIHBlcmYtPmJ1ZnBvcyk7CisJcmV0ID0gY29weV90b191c2VyKGJ1ZiwgJnBlcmYtPmJ1ZltwZXJmLT5idWZwb3NdLCBuKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXBlcmYtPmJ1ZnBvcyArPSBuOworCSpwcG9zICs9IG47CisKK291dDoKKwltdXRleF91bmxvY2soJnBlcmYtPnJlYWRfbG9jayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBwZXJmX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1zbV9wZXJmX3N0YXRlICpwZXJmID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGVyZi0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSBwcml2LT5ncHU7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlpZiAocGVyZi0+b3BlbiB8fCAhZ3B1KSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGVyZjsKKwlwZXJmLT5vcGVuID0gdHJ1ZTsKKwlwZXJmLT5jbnQgPSAwOworCXBlcmYtPmJ1ZnRvdCA9IDA7CisJcGVyZi0+YnVmcG9zID0gMDsKKwltc21fZ3B1X3BlcmZjbnRyX3N0YXJ0KGdwdSk7CisJcGVyZi0+bmV4dF9qaWZmaWVzID0gamlmZmllcyArIFNBTVBMRV9USU1FOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwZXJmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1zbV9wZXJmX3N0YXRlICpwZXJmID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gcGVyZi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwltc21fZ3B1X3BlcmZjbnRyX3N0b3AocHJpdi0+Z3B1KTsKKwlwZXJmLT5vcGVuID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGVyZl9kZWJ1Z2ZzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBwZXJmX29wZW4sCisJLnJlYWQgPSBwZXJmX3JlYWQsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVsZWFzZSA9IHBlcmZfcmVsZWFzZSwKK307CisKK2ludCBtc21fcGVyZl9kZWJ1Z2ZzX2luaXQoc3RydWN0IGRybV9taW5vciAqbWlub3IpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IG1pbm9yLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fcGVyZl9zdGF0ZSAqcGVyZjsKKworCS8qIG9ubHkgY3JlYXRlIG9uIGZpcnN0IG1pbm9yOiAqLworCWlmIChwcml2LT5wZXJmKQorCQlyZXR1cm4gMDsKKworCXBlcmYgPSBremFsbG9jKHNpemVvZigqcGVyZiksIEdGUF9LRVJORUwpOworCWlmICghcGVyZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZXJmLT5kZXYgPSBtaW5vci0+ZGV2OworCisJbXV0ZXhfaW5pdCgmcGVyZi0+cmVhZF9sb2NrKTsKKwlwcml2LT5wZXJmID0gcGVyZjsKKworCXBlcmYtPm5vZGUgPSBremFsbG9jKHNpemVvZigqcGVyZi0+bm9kZSksIEdGUF9LRVJORUwpOworCWlmICghcGVyZi0+bm9kZSkKKwkJZ290byBmYWlsOworCisJcGVyZi0+ZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicGVyZiIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJbWlub3ItPmRlYnVnZnNfcm9vdCwgcGVyZiwgJnBlcmZfZGVidWdmc19mb3BzKTsKKwlpZiAoIXBlcmYtPmVudCkgeworCQlEUk1fRVJST1IoIkNhbm5vdCBjcmVhdGUgL3N5cy9rZXJuZWwvZGVidWcvZHJpLyVzL3BlcmZcbiIsCisJCQkJbWlub3ItPmRlYnVnZnNfcm9vdC0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGVyZi0+bm9kZS0+bWlub3IgPSBtaW5vcjsKKwlwZXJmLT5ub2RlLT5kZW50ICA9IHBlcmYtPmVudDsKKwlwZXJmLT5ub2RlLT5pbmZvX2VudCA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKKwlsaXN0X2FkZCgmcGVyZi0+bm9kZS0+bGlzdCwgJm1pbm9yLT5kZWJ1Z2ZzX2xpc3QpOworCW11dGV4X3VubG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltc21fcGVyZl9kZWJ1Z2ZzX2NsZWFudXAobWlub3IpOworCXJldHVybiAtMTsKK30KKwordm9pZCBtc21fcGVyZl9kZWJ1Z2ZzX2NsZWFudXAoc3RydWN0IGRybV9taW5vciAqbWlub3IpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IG1pbm9yLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fcGVyZl9zdGF0ZSAqcGVyZiA9IHByaXYtPnBlcmY7CisKKwlpZiAoIXBlcmYpCisJCXJldHVybjsKKworCXByaXYtPnBlcmYgPSBOVUxMOworCisJZGVidWdmc19yZW1vdmUocGVyZi0+ZW50KTsKKworCWlmIChwZXJmLT5ub2RlKSB7CisJCW11dGV4X2xvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOworCQlsaXN0X2RlbCgmcGVyZi0+bm9kZS0+bGlzdCk7CisJCW11dGV4X3VubG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CisJCWtmcmVlKHBlcmYtPm5vZGUpOworCX0KKworCW11dGV4X2Rlc3Ryb3koJnBlcmYtPnJlYWRfbG9jayk7CisKKwlrZnJlZShwZXJmKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9yZC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc4YzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fcmQuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0CisgKiBBdXRob3I6IFJvYiBDbGFyayA8cm9iZGNsYXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qIEZvciBkZWJ1Z2dpbmcgY3Jhc2hlcywgdXNlcnNwYWNlIGNhbjoKKyAqCisgKiAgIHRhaWwgLWYgL3N5cy9rZXJuZWwvZGVidWcvZHJpLzxtaW5vcj4vcmQgPiBsb2dmaWxlLnJkCisgKgorICogVG8gbG9nIHRoZSBjbWRzdHJlYW0gaW4gYSBmb3JtYXQgdGhhdCBpcyB1bmRlcnN0b29kIGJ5IGZyZWVkcmVuby9jZmZkdW1wCisgKiB1dGlsaXR5LiAgQnkgY29tcGFyaW5nIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgZmVuY2UgIywgdG8gdGhlCisgKiBjbWRzdHJlYW0gZm9yIHRoZSBuZXh0IGZlbmNlLCB5b3UgY2FuIG5hcnJvdyBkb3duIHdoaWNoIHByb2Nlc3MgYW5kIHN1Ym1pdAorICogY2F1c2VkIHRoZSBncHUgY3Jhc2gvbG9ja3VwLgorICoKKyAqIFRoaXMgYnlwYXNzZXMgZHJtX2RlYnVnZnNfY3JlYXRlX2ZpbGVzKCkgbWFpbmx5IGJlY2F1c2Ugd2UgbmVlZCB0byB1c2UKKyAqIG91ciBvd24gZm9wcyBmb3IgYSBiaXQgbW9yZSBjb250cm9sLiAgSW4gcGFydGljdWxhciwgd2UgZG9uJ3Qgd2FudCB0bworICogZG8gYW55dGhpbmcgaWYgdXNlcnNwYWNlIGRvZXNuJ3QgaGF2ZSB0aGUgZGVidWdmcyBmaWxlIG9wZW4uCisgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAibXNtX2dwdS5oIgorI2luY2x1ZGUgIm1zbV9nZW0uaCIKKworZW51bSByZF9zZWN0X3R5cGUgeworCVJEX05PTkUsCisJUkRfVEVTVCwgICAgICAgLyogYXNjaWkgdGV4dCAqLworCVJEX0NNRCwgICAgICAgIC8qIGFzY2lpIHRleHQgKi8KKwlSRF9HUFVBRERSLCAgICAvKiB1MzIgZ3B1YWRkciwgdTMyIHNpemUgKi8KKwlSRF9DT05URVhULCAgICAvKiByYXcgZHVtcCAqLworCVJEX0NNRFNUUkVBTSwgIC8qIHJhdyBkdW1wICovCisJUkRfQ01EU1RSRUFNX0FERFIsIC8qIGdwdSBhZGRyIG9mIGNtZHN0cmVhbSAqLworCVJEX1BBUkFNLCAgICAgIC8qIHUzMiBwYXJhbV90eXBlLCB1MzIgcGFyYW1fdmFsLCB1MzIgYml0bGVuICovCisJUkRfRkxVU0gsICAgICAgLyogZW1wdHksIGNsZWFyIHByZXZpb3VzIHBhcmFtcyAqLworCVJEX1BST0dSQU0sICAgIC8qIHNoYWRlciBwcm9ncmFtLCByYXcgZHVtcCAqLworCVJEX1ZFUlRfU0hBREVSLAorCVJEX0ZSQUdfU0hBREVSLAorCVJEX0JVRkZFUl9DT05URU5UUywKKwlSRF9HUFVfSUQsCit9OworCisjZGVmaW5lIEJVRl9TWiA1MTIgIC8qIHNob3VsZCBiZSBwb3dlciBvZiAyICovCisKKy8qIHNwYWNlIHVzZWQ6ICovCisjZGVmaW5lIGNpcmNfY291bnQoY2lyYykgXAorCShDSVJDX0NOVCgoY2lyYyktPmhlYWQsIChjaXJjKS0+dGFpbCwgQlVGX1NaKSkKKyNkZWZpbmUgY2lyY19jb3VudF90b19lbmQoY2lyYykgXAorCShDSVJDX0NOVF9UT19FTkQoKGNpcmMpLT5oZWFkLCAoY2lyYyktPnRhaWwsIEJVRl9TWikpCisvKiBzcGFjZSBhdmFpbGFibGU6ICovCisjZGVmaW5lIGNpcmNfc3BhY2UoY2lyYykgXAorCShDSVJDX1NQQUNFKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBCVUZfU1opKQorI2RlZmluZSBjaXJjX3NwYWNlX3RvX2VuZChjaXJjKSBcCisJKENJUkNfU1BBQ0VfVE9fRU5EKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBCVUZfU1opKQorCitzdHJ1Y3QgbXNtX3JkX3N0YXRlIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCisJYm9vbCBvcGVuOworCisJc3RydWN0IGRlbnRyeSAqZW50OworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlOworCisJLyogY3VycmVudCBzdWJtaXQgdG8gcmVhZCBvdXQ6ICovCisJc3RydWN0IG1zbV9nZW1fc3VibWl0ICpzdWJtaXQ7CisKKwkvKiBmaWZvIGFjY2VzcyBpcyBzeW5jaHJvbml6ZWQgb24gdGhlIHByb2R1Y2VyIHNpZGUgYnkKKwkgKiBzdHJ1Y3RfbXV0ZXggaGVsZCBieSBzdWJtaXQgY29kZSAob3RoZXJ3aXNlIHdlIGNvdWxkCisJICogZW5kIHVwIHcvIGNtZHMgbG9nZ2VkIGluIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkKKwkgKiB3ZXJlIGV4ZWN1dGVkKS4gIEFuZCByZWFkX2xvY2sgc3luY2hyb25pemVzIHRoZSByZWFkcworCSAqLworCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBmaWZvX2V2ZW50OworCXN0cnVjdCBjaXJjX2J1ZiBmaWZvOworCisJY2hhciBidWZbQlVGX1NaXTsKK307CisKK3N0YXRpYyB2b2lkIHJkX3dyaXRlKHN0cnVjdCBtc21fcmRfc3RhdGUgKnJkLCBjb25zdCB2b2lkICpidWYsIGludCBzeikKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKmZpZm8gPSAmcmQtPmZpZm87CisJY29uc3QgY2hhciAqcHRyID0gYnVmOworCisJd2hpbGUgKHN6ID4gMCkgeworCQljaGFyICpmcHRyID0gJmZpZm8tPmJ1ZltmaWZvLT5oZWFkXTsKKwkJaW50IG47CisKKwkJd2FpdF9ldmVudChyZC0+Zmlmb19ldmVudCwgY2lyY19zcGFjZSgmcmQtPmZpZm8pID4gMCk7CisKKwkJbiA9IG1pbihzeiwgY2lyY19zcGFjZV90b19lbmQoJnJkLT5maWZvKSk7CisJCW1lbWNweShmcHRyLCBwdHIsIG4pOworCisJCWZpZm8tPmhlYWQgPSAoZmlmby0+aGVhZCArIG4pICYgKEJVRl9TWiAtIDEpOworCQlzeiAgLT0gbjsKKwkJcHRyICs9IG47CisKKwkJd2FrZV91cF9hbGwoJnJkLT5maWZvX2V2ZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJkX3dyaXRlX3NlY3Rpb24oc3RydWN0IG1zbV9yZF9zdGF0ZSAqcmQsCisJCWVudW0gcmRfc2VjdF90eXBlIHR5cGUsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHN6KQoreworCXJkX3dyaXRlKHJkLCAmdHlwZSwgNCk7CisJcmRfd3JpdGUocmQsICZzeiwgNCk7CisJcmRfd3JpdGUocmQsIGJ1Ziwgc3opOworfQorCitzdGF0aWMgc3NpemVfdCByZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3Qgc3osIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbXNtX3JkX3N0YXRlICpyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2lyY19idWYgKmZpZm8gPSAmcmQtPmZpZm87CisJY29uc3QgY2hhciAqZnB0ciA9ICZmaWZvLT5idWZbZmlmby0+dGFpbF07CisJaW50IG4gPSAwLCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmcmQtPnJlYWRfbG9jayk7CisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmQtPmZpZm9fZXZlbnQsCisJCQljaXJjX2NvdW50KCZyZC0+ZmlmbykgPiAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW4gPSBtaW5fdChpbnQsIHN6LCBjaXJjX2NvdW50X3RvX2VuZCgmcmQtPmZpZm8pKTsKKwlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCBmcHRyLCBuKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWZpZm8tPnRhaWwgPSAoZmlmby0+dGFpbCArIG4pICYgKEJVRl9TWiAtIDEpOworCSpwcG9zICs9IG47CisKKwl3YWtlX3VwX2FsbCgmcmQtPmZpZm9fZXZlbnQpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZyZC0+cmVhZF9sb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1zbV9yZF9zdGF0ZSAqcmQgPSBpbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByZC0+ZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtc21fZ3B1ICpncHUgPSBwcml2LT5ncHU7CisJdWludDY0X3QgdmFsOworCXVpbnQzMl90IGdwdV9pZDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChyZC0+b3BlbiB8fCAhZ3B1KSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmQ7CisJcmQtPm9wZW4gPSB0cnVlOworCisJLyogdGhlIHBhcnNpbmcgdG9vbHMgbmVlZCB0byBrbm93IGdwdS1pZCB0byBrbm93IHdoaWNoCisJICogcmVnaXN0ZXIgZGF0YWJhc2UgdG8gbG9hZC4KKwkgKi8KKwlncHUtPmZ1bmNzLT5nZXRfcGFyYW0oZ3B1LCBNU01fUEFSQU1fR1BVX0lELCAmdmFsKTsKKwlncHVfaWQgPSB2YWw7CisKKwlyZF93cml0ZV9zZWN0aW9uKHJkLCBSRF9HUFVfSUQsICZncHVfaWQsIHNpemVvZihncHVfaWQpKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbXNtX3JkX3N0YXRlICpyZCA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmQtPm9wZW4gPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZF9kZWJ1Z2ZzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSByZF9vcGVuLAorCS5yZWFkID0gcmRfcmVhZCwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5yZWxlYXNlID0gcmRfcmVsZWFzZSwKK307CisKK2ludCBtc21fcmRfZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBtaW5vci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX3JkX3N0YXRlICpyZDsKKworCS8qIG9ubHkgY3JlYXRlIG9uIGZpcnN0IG1pbm9yOiAqLworCWlmIChwcml2LT5yZCkKKwkJcmV0dXJuIDA7CisKKwlyZCA9IGt6YWxsb2Moc2l6ZW9mKCpyZCksIEdGUF9LRVJORUwpOworCWlmICghcmQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmQtPmRldiA9IG1pbm9yLT5kZXY7CisJcmQtPmZpZm8uYnVmID0gcmQtPmJ1ZjsKKworCW11dGV4X2luaXQoJnJkLT5yZWFkX2xvY2spOworCXByaXYtPnJkID0gcmQ7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZC0+Zmlmb19ldmVudCk7CisKKwlyZC0+bm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpyZC0+bm9kZSksIEdGUF9LRVJORUwpOworCWlmICghcmQtPm5vZGUpCisJCWdvdG8gZmFpbDsKKworCXJkLT5lbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJbWlub3ItPmRlYnVnZnNfcm9vdCwgcmQsICZyZF9kZWJ1Z2ZzX2ZvcHMpOworCWlmICghcmQtPmVudCkgeworCQlEUk1fRVJST1IoIkNhbm5vdCBjcmVhdGUgL3N5cy9rZXJuZWwvZGVidWcvZHJpLyVzL3JkXG4iLAorCQkJCW1pbm9yLT5kZWJ1Z2ZzX3Jvb3QtPmRfbmFtZS5uYW1lKTsKKwkJZ290byBmYWlsOworCX0KKworCXJkLT5ub2RlLT5taW5vciA9IG1pbm9yOworCXJkLT5ub2RlLT5kZW50ICA9IHJkLT5lbnQ7CisJcmQtPm5vZGUtPmluZm9fZW50ID0gTlVMTDsKKworCW11dGV4X2xvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOworCWxpc3RfYWRkKCZyZC0+bm9kZS0+bGlzdCwgJm1pbm9yLT5kZWJ1Z2ZzX2xpc3QpOworCW11dGV4X3VubG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltc21fcmRfZGVidWdmc19jbGVhbnVwKG1pbm9yKTsKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgbXNtX3JkX2RlYnVnZnNfY2xlYW51cChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gbWlub3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG1zbV9yZF9zdGF0ZSAqcmQgPSBwcml2LT5yZDsKKworCWlmICghcmQpCisJCXJldHVybjsKKworCXByaXYtPnJkID0gTlVMTDsKKworCWRlYnVnZnNfcmVtb3ZlKHJkLT5lbnQpOworCisJaWYgKHJkLT5ub2RlKSB7CisJCW11dGV4X2xvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOworCQlsaXN0X2RlbCgmcmQtPm5vZGUtPmxpc3QpOworCQltdXRleF91bmxvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOworCQlrZnJlZShyZC0+bm9kZSk7CisJfQorCisJbXV0ZXhfZGVzdHJveSgmcmQtPnJlYWRfbG9jayk7CisKKwlrZnJlZShyZCk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBzdHJ1Y3RfbXV0ZXggKi8KK3ZvaWQgbXNtX3JkX2R1bXBfc3VibWl0KHN0cnVjdCBtc21fZ2VtX3N1Ym1pdCAqc3VibWl0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBzdWJtaXQtPmRldjsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXNtX3JkX3N0YXRlICpyZCA9IHByaXYtPnJkOworCWNoYXIgbXNnWzEyOF07CisJaW50IGksIG47CisKKwlpZiAoIXJkLT5vcGVuKQorCQlyZXR1cm47CisKKwkvKiB3cml0aW5nIGludG8gZmlmbyBpcyBzZXJpYWxpemVkIGJ5IGNhbGxlciwgYW5kCisJICogcmQtPnJlYWRfbG9jayBpcyB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUgcmVhZHMKKwkgKi8KKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+c3RydWN0X211dGV4KSk7CisKKwluID0gc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIiUuKnMvJWQ6IGZlbmNlPSV1IiwKKwkJCVRBU0tfQ09NTV9MRU4sIGN1cnJlbnQtPmNvbW0sIHRhc2tfcGlkX25yKGN1cnJlbnQpLAorCQkJc3VibWl0LT5mZW5jZSk7CisKKwlyZF93cml0ZV9zZWN0aW9uKHJkLCBSRF9DTUQsIG1zZywgQUxJR04obiwgNCkpOworCisJLyogY291bGQgYmUgbmljZSB0byBoYXZlIGFuIG9wdGlvbiAobW9kdWxlLXBhcmFtPykgdG8gc25hcHNob3QKKwkgKiBhbGwgdGhlIGJvJ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJtaXQuICBIYW5keSB0byBzZWUgdnR4CisJICogYnVmZmVycywgZXRjLiAgRm9yIG5vdyBqdXN0IHRoZSBjbWRzdHJlYW0gYm8ncyBpcyBlbm91Z2guCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT5ucl9jbWRzOyBpKyspIHsKKwkJdWludDMyX3QgaWR4ICA9IHN1Ym1pdC0+Y21kW2ldLmlkeDsKKwkJdWludDMyX3QgaW92YSA9IHN1Ym1pdC0+Y21kW2ldLmlvdmE7CisJCXVpbnQzMl90IHN6ZCAgPSBzdWJtaXQtPmNtZFtpXS5zaXplOyAvKiBpbiBkd29yZHMgKi8KKwkJc3RydWN0IG1zbV9nZW1fb2JqZWN0ICpvYmogPSBzdWJtaXQtPmJvc1tpZHhdLm9iajsKKwkJY29uc3QgY2hhciAqYnVmID0gbXNtX2dlbV92YWRkcl9sb2NrZWQoJm9iai0+YmFzZSk7CisKKwkJYnVmICs9IGlvdmEgLSBzdWJtaXQtPmJvc1tpZHhdLmlvdmE7CisKKwkJcmRfd3JpdGVfc2VjdGlvbihyZCwgUkRfR1BVQUREUiwKKwkJCQkodWludDMyX3RbMl0peyBpb3ZhLCBzemQgKiA0IH0sIDgpOworCQlyZF93cml0ZV9zZWN0aW9uKHJkLCBSRF9CVUZGRVJfQ09OVEVOVFMsCisJCQkJYnVmLCBzemQgKiA0KTsKKworCQlzd2l0Y2ggKHN1Ym1pdC0+Y21kW2ldLnR5cGUpIHsKKwkJY2FzZSBNU01fU1VCTUlUX0NNRF9JQl9UQVJHRVRfQlVGOgorCQkJLyogaWdub3JlIElCLXRhcmdldHMsIHdlJ3ZlIGxvZ2dlZCB0aGUgYnVmZmVyLCB0aGUKKwkJCSAqIHBhcnNlciB0b29sIHdpbGwgZm9sbG93IHRoZSBJQiBiYXNlZCBvbiB0aGUgbG9nZ2VkCisJCQkgKiBidWZmZXIvZ3B1YWRkciwgc28gbm90aGluZyBtb3JlIHRvIGRvLgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSBNU01fU1VCTUlUX0NNRF9DVFhfUkVTVE9SRV9CVUY6CisJCWNhc2UgTVNNX1NVQk1JVF9DTURfQlVGOgorCQkJcmRfd3JpdGVfc2VjdGlvbihyZCwgUkRfQ01EU1RSRUFNX0FERFIsCisJCQkJCSh1aW50MzJfdFsyXSl7IGlvdmEsIHN6ZCB9LCA4KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlCmluZGV4IGI3ZDIxNjIuLjJiNjE1NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlCkBAIC0xMDIsNiArMTAyLDcgQEAKIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9udmFmLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9udmMwLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9udmUwLm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9nazIwYS5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZmIvZ20xMDcubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2ZiL3JhbW52MDQubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2ZiL3JhbW52MTAubwpAQCAtMTE3LDI1ICsxMTgsMzIgQEAKIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9yYW1udmFhLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9yYW1udmMwLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9yYW1udmUwLm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9yYW1nazIwYS5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZmIvcmFtZ20xMDcubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2ZiL3NkZHIzLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9mYi9nZGRyNS5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZ3Bpby9iYXNlLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9ncGlvL252MTAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2dwaW8vbnY1MC5vCitub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvZ3Bpby9udjkyLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9ncGlvL252ZDAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2dwaW8vbnZlMC5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaTJjL2Jhc2Uubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2kyYy9hbng5ODA1Lm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvYXV4Lm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvYml0Lm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvcGFkLm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvcGFkbnYwNC5vCitub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaTJjL3BhZG52OTQubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2kyYy9udjA0Lm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvbnY0ZS5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaTJjL252NTAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2kyYy9udjk0Lm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pMmMvbnZkMC5vCitub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaTJjL252ZTAubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2lidXMvbnZjMC5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaWJ1cy9udmUwLm8KK25vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pYnVzL2drMjBhLm8KIG5vdXZlYXUteSArPSBjb3JlL3N1YmRldi9pbnN0bWVtL2Jhc2Uubwogbm91dmVhdS15ICs9IGNvcmUvc3ViZGV2L2luc3RtZW0vbnYwNC5vCiBub3V2ZWF1LXkgKz0gY29yZS9zdWJkZXYvaW5zdG1lbS9udjQwLm8KQEAgLTIxNCw2ICsyMjIsOSBAQAogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2RldmljZS9udmUwLm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9kZXZpY2UvZ20xMDAubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2Rpc3AvYmFzZS5vCitub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZGlzcC9jb25uLm8KK25vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9kaXNwL291dHAubworbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2Rpc3Avb3V0cGRwLm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9kaXNwL252MDQubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2Rpc3AvbnY1MC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZGlzcC9udjg0Lm8KQEAgLTI0NSw2ICsyNTYsNyBAQAogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2ZpZm8vbnY4NC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZmlmby9udmMwLm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9maWZvL252ZTAubworbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2ZpZm8vZ2syMGEubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2ZpZm8vbnYxMDgubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2dyYXBoL2N0eG52NDAubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2dyYXBoL2N0eG52NTAubwpAQCAtMjU1LDYgKzI2Nyw3IEBACiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZkNy5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZkOS5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZlNC5vCitub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvY3R4Z2syMGEubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2dyYXBoL2N0eG52ZjAubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2dyYXBoL2N0eG52MTA4Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9jdHhnbTEwNy5vCkBAIC0yNzUsNiArMjg4LDcgQEAKIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmQ3Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmQ5Lm8KIG5vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9udmU0Lm8KK25vdXZlYXUteSArPSBjb3JlL2VuZ2luZS9ncmFwaC9nazIwYS5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvbnZmMC5vCiBub3V2ZWF1LXkgKz0gY29yZS9lbmdpbmUvZ3JhcGgvbnYxMDgubwogbm91dmVhdS15ICs9IGNvcmUvZW5naW5lL2dyYXBoL2dtMTA3Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvY29yZS9ldmVudC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9jb3JlL2V2ZW50LmMKaW5kZXggM2YzYzc2NS4uYWU4MWQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9jb3JlL2V2ZW50LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9jb3JlL2V2ZW50LmMKQEAgLTI4LDE0ICsyOCwyMCBAQAogewogCXN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCA9IGhhbmRsZXItPmV2ZW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKF9fdGVzdF9hbmRfY2xlYXJfYml0KE5WS01fRVZFTlRfRU5BQkxFLCAmaGFuZGxlci0+ZmxhZ3MpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7Ci0JCWlmICghLS1ldmVudC0+aW5kZXhbaGFuZGxlci0+aW5kZXhdLnJlZnMpIHsKKwl1MzIgbSwgdDsKKworCWlmICghX190ZXN0X2FuZF9jbGVhcl9iaXQoTlZLTV9FVkVOVF9FTkFCTEUsICZoYW5kbGVyLT5mbGFncykpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7CisJZm9yIChtID0gaGFuZGxlci0+dHlwZXM7IHQgPSBfX2ZmcyhtKSwgbTsgbSAmPSB+KDEgPDwgdCkpIHsKKwkJaWYgKCEtLWV2ZW50LT5yZWZzW2hhbmRsZXItPmluZGV4ICogZXZlbnQtPnR5cGVzX25yICsgdF0pIHsKIAkJCWlmIChldmVudC0+ZGlzYWJsZSkKLQkJCQlldmVudC0+ZGlzYWJsZShldmVudCwgaGFuZGxlci0+aW5kZXgpOworCQkJCWV2ZW50LT5kaXNhYmxlKGV2ZW50LCAxIDw8IHQsIGhhbmRsZXItPmluZGV4KTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7CisKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnQtPnJlZnNfbG9jaywgZmxhZ3MpOwogfQogCiB2b2lkCkBAIC00MywxNCArNDksMjAgQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQgPSBoYW5kbGVyLT5ldmVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlmICghX190ZXN0X2FuZF9zZXRfYml0KE5WS01fRVZFTlRfRU5BQkxFLCAmaGFuZGxlci0+ZmxhZ3MpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7Ci0JCWlmICghZXZlbnQtPmluZGV4W2hhbmRsZXItPmluZGV4XS5yZWZzKyspIHsKKwl1MzIgbSwgdDsKKworCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoTlZLTV9FVkVOVF9FTkFCTEUsICZoYW5kbGVyLT5mbGFncykpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7CisJZm9yIChtID0gaGFuZGxlci0+dHlwZXM7IHQgPSBfX2ZmcyhtKSwgbTsgbSAmPSB+KDEgPDwgdCkpIHsKKwkJaWYgKCFldmVudC0+cmVmc1toYW5kbGVyLT5pbmRleCAqIGV2ZW50LT50eXBlc19uciArIHRdKyspIHsKIAkJCWlmIChldmVudC0+ZW5hYmxlKQotCQkJCWV2ZW50LT5lbmFibGUoZXZlbnQsIGhhbmRsZXItPmluZGV4KTsKKwkJCQlldmVudC0+ZW5hYmxlKGV2ZW50LCAxIDw8IHQsIGhhbmRsZXItPmluZGV4KTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudC0+cmVmc19sb2NrLCBmbGFncyk7CisKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnQtPnJlZnNfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjUsMzggKzc3LDQ3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5vdXZlYXVfZXZlbnRfaW5pdChzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBpbmRleCwKLQkJICAgaW50ICgqZnVuYykodm9pZCAqLCBpbnQpLCB2b2lkICpwcml2LAorbm91dmVhdV9ldmVudF9pbml0KHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgdTMyIHR5cGVzLCBpbnQgaW5kZXgsCisJCSAgIGludCAoKmZ1bmMpKHZvaWQgKiwgdTMyLCBpbnQpLCB2b2lkICpwcml2LAogCQkgICBzdHJ1Y3Qgbm91dmVhdV9ldmVudGggKmhhbmRsZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICh0eXBlcyAmIH4oKDEgPDwgZXZlbnQtPnR5cGVzX25yKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaW5kZXggPj0gZXZlbnQtPmluZGV4X25yKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWhhbmRsZXItPmV2ZW50ID0gZXZlbnQ7CiAJaGFuZGxlci0+ZmxhZ3MgPSAwOworCWhhbmRsZXItPnR5cGVzID0gdHlwZXM7CiAJaGFuZGxlci0+aW5kZXggPSBpbmRleDsKIAloYW5kbGVyLT5mdW5jID0gZnVuYzsKIAloYW5kbGVyLT5wcml2ID0gcHJpdjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudC0+bGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmaGFuZGxlci0+aGVhZCwgJmV2ZW50LT5pbmRleFtpbmRleF0ubGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmaGFuZGxlci0+aGVhZCwgJmV2ZW50LT5saXN0W2luZGV4XSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnQtPmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiBpbnQKLW5vdXZlYXVfZXZlbnRfbmV3KHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGluZGV4LAotCQkgIGludCAoKmZ1bmMpKHZvaWQgKiwgaW50KSwgdm9pZCAqcHJpdiwKK25vdXZlYXVfZXZlbnRfbmV3KHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgdTMyIHR5cGVzLCBpbnQgaW5kZXgsCisJCSAgaW50ICgqZnVuYykodm9pZCAqLCB1MzIsIGludCksIHZvaWQgKnByaXYsCiAJCSAgc3RydWN0IG5vdXZlYXVfZXZlbnRoICoqcGhhbmRsZXIpCiB7CiAJc3RydWN0IG5vdXZlYXVfZXZlbnRoICpoYW5kbGVyOwogCWludCByZXQgPSAtRU5PTUVNOwogCisJaWYgKGV2ZW50LT5jaGVjaykgeworCQlyZXQgPSBldmVudC0+Y2hlY2soZXZlbnQsIHR5cGVzLCBpbmRleCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWhhbmRsZXIgPSAqcGhhbmRsZXIgPSBrbWFsbG9jKHNpemVvZigqaGFuZGxlciksIEdGUF9LRVJORUwpOwogCWlmIChoYW5kbGVyKSB7Ci0JCXJldCA9IG5vdXZlYXVfZXZlbnRfaW5pdChldmVudCwgaW5kZXgsIGZ1bmMsIHByaXYsIGhhbmRsZXIpOworCQlyZXQgPSBub3V2ZWF1X2V2ZW50X2luaXQoZXZlbnQsIHR5cGVzLCBpbmRleCwgZnVuYywgcHJpdiwgaGFuZGxlcik7CiAJCWlmIChyZXQpCiAJCQlrZnJlZShoYW5kbGVyKTsKIAl9CkBAIC0xMTYsNyArMTM3LDcgQEAKIH0KIAogdm9pZAotbm91dmVhdV9ldmVudF90cmlnZ2VyKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGluZGV4KQorbm91dmVhdV9ldmVudF90cmlnZ2VyKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgdTMyIHR5cGVzLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IG5vdXZlYXVfZXZlbnRoICpoYW5kbGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMjUsMTAgKzE0NiwxNSBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnQtPmxpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlciwgJmV2ZW50LT5pbmRleFtpbmRleF0ubGlzdCwgaGVhZCkgewotCQlpZiAodGVzdF9iaXQoTlZLTV9FVkVOVF9FTkFCTEUsICZoYW5kbGVyLT5mbGFncykgJiYKLQkJICAgIGhhbmRsZXItPmZ1bmMoaGFuZGxlci0+cHJpdiwgaW5kZXgpID09IE5WS01fRVZFTlRfRFJPUCkKLQkJCW5vdXZlYXVfZXZlbnRfcHV0KGhhbmRsZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlciwgJmV2ZW50LT5saXN0W2luZGV4XSwgaGVhZCkgeworCQlpZiAoIXRlc3RfYml0KE5WS01fRVZFTlRfRU5BQkxFLCAmaGFuZGxlci0+ZmxhZ3MpKQorCQkJY29udGludWU7CisJCWlmICghKGhhbmRsZXItPnR5cGVzICYgdHlwZXMpKQorCQkJY29udGludWU7CisJCWlmIChoYW5kbGVyLT5mdW5jKGhhbmRsZXItPnByaXYsIGhhbmRsZXItPnR5cGVzICYgdHlwZXMsIGluZGV4KQorCQkJCSE9IE5WS01fRVZFTlRfRFJPUCkKKwkJCWNvbnRpbnVlOworCQlub3V2ZWF1X2V2ZW50X3B1dChoYW5kbGVyKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnQtPmxpc3RfbG9jaywgZmxhZ3MpOwogfQpAQCAtMTQ0LDIwICsxNzAsMjcgQEAKIH0KIAogaW50Ci1ub3V2ZWF1X2V2ZW50X2NyZWF0ZShpbnQgaW5kZXhfbnIsIHN0cnVjdCBub3V2ZWF1X2V2ZW50ICoqcGV2ZW50KQorbm91dmVhdV9ldmVudF9jcmVhdGUoaW50IHR5cGVzX25yLCBpbnQgaW5kZXhfbnIsIHN0cnVjdCBub3V2ZWF1X2V2ZW50ICoqcGV2ZW50KQogewogCXN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudDsKIAlpbnQgaTsKIAotCWV2ZW50ID0gKnBldmVudCA9IGt6YWxsb2Moc2l6ZW9mKCpldmVudCkgKyBpbmRleF9uciAqCi0JCQkJICBzaXplb2YoZXZlbnQtPmluZGV4WzBdKSwgR0ZQX0tFUk5FTCk7CisJZXZlbnQgPSAqcGV2ZW50ID0ga3phbGxvYyhzaXplb2YoKmV2ZW50KSArIChpbmRleF9uciAqIHR5cGVzX25yKSAqCisJCQkJICBzaXplb2YoZXZlbnQtPnJlZnNbMF0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWV2ZW50KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWV2ZW50LT5saXN0ID0ga21hbGxvYyhzaXplb2YoKmV2ZW50LT5saXN0KSAqIGluZGV4X25yLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV2ZW50LT5saXN0KSB7CisJCWtmcmVlKGV2ZW50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJc3Bpbl9sb2NrX2luaXQoJmV2ZW50LT5saXN0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZldmVudC0+cmVmc19sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5kZXhfbnI7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJmV2ZW50LT5pbmRleFtpXS5saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmV2ZW50LT5saXN0W2ldKTsKKwlldmVudC0+dHlwZXNfbnIgPSB0eXBlc19ucjsKIAlldmVudC0+aW5kZXhfbnIgPSBpbmRleF9ucjsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvY29yZS9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvY29yZS9vYmplY3QuYwppbmRleCA3ZjQ4ZTI4Li4xMjQ1Mzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2NvcmUvb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9jb3JlL29iamVjdC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAl9CiAKIAlpZiAocmV0ID09IDApIHsKLQkJbnZfZGVidWcob2JqZWN0LCAiY3JlYXRlZFxuIik7CisJCW52X3RyYWNlKG9iamVjdCwgImNyZWF0ZWRcbiIpOwogCQlhdG9taWNfc2V0KCZvYmplY3QtPnJlZmNvdW50LCAxKTsKIAl9CiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogc3RhdGljIHZvaWQKIG5vdXZlYXVfb2JqZWN0X2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCiB7Ci0JbnZfZGVidWcob2JqZWN0LCAiZGVzdHJveWluZ1xuIik7CisJbnZfdHJhY2Uob2JqZWN0LCAiZGVzdHJveWluZ1xuIik7CiAJbnZfb2Z1bmNzKG9iamVjdCktPmR0b3Iob2JqZWN0KTsKIH0KIApAQCAtMzM3LDcgKzMzNyw3IEBACiAJCWdvdG8gZmFpbF9zZWxmOwogCX0KIAotCW52X2RlYnVnKG9iamVjdCwgImluaXRpYWxpc2VkXG4iKTsKKwludl90cmFjZShvYmplY3QsICJpbml0aWFsaXNlZFxuIik7CiAJcmV0dXJuIDA7CiAKIGZhaWxfc2VsZjoKQEAgLTM3NSw3ICszNzUsNyBAQAogCWlmIChvYmplY3QtPnBhcmVudCkKIAkJbm91dmVhdV9vYmplY3RfZGVjKG9iamVjdC0+cGFyZW50LCBmYWxzZSk7CiAKLQludl9kZWJ1ZyhvYmplY3QsICJzdG9wcGVkXG4iKTsKKwludl90cmFjZShvYmplY3QsICJzdG9wcGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDExLDcgKzQxMSw3IEBACiAJCX0KIAl9CiAKLQludl9kZWJ1ZyhvYmplY3QsICJzdXNwZW5kZWRcbiIpOworCW52X3RyYWNlKG9iamVjdCwgInN1c3BlbmRlZFxuIik7CiAJcmV0dXJuIDA7CiAKIGZhaWxfcGFyZW50OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL2dtMTAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvZ20xMDAuYwppbmRleCBkMjU4YzIxLi5hNTIwMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvZ20xMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvZ20xMDAuYwpAQCAtNjAsOCArNjAsOCBAQAogCWNhc2UgMHgxMTc6CiAJCWRldmljZS0+Y25hbWUgPSAiR00xMDciOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52ZTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudmUwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnZkMF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAjaWYgMAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZkMF90aGVybV9vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MDQuYwppbmRleCAwYTUxZmY0Li40MGIyOWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjA0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAljYXNlIDB4MDQ6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYwNCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjA0X2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC02NSw3ICs2NSw3IEBACiAJY2FzZSAweDA1OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMDUiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYwNV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjEwLmMKaW5kZXggZTAwOGRlOC4uNWY3YzI1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYxMC5jCkBAIC00OCw4ICs0OCw4IEBACiAJY2FzZSAweDEwOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMTAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC02NSw4ICs2NSw4IEBACiAJY2FzZSAweDE1OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMTUiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC04NCw4ICs4NCw4IEBACiAJY2FzZSAweDE2OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMTYiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC0xMDMsOCArMTAzLDggQEAKIAljYXNlIDB4MWE6CiAJCWRldmljZS0+Y25hbWUgPSAibkZvcmNlIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwpAQCAtMTIyLDggKzEyMiw4IEBACiAJY2FzZSAweDExOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMTEiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC0xNDEsOCArMTQxLDggQEAKIAljYXNlIDB4MTc6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYxNyI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MTBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKQEAgLTE2MCw4ICsxNjAsOCBAQAogCWNhc2UgMHgxZjoKIAkJZGV2aWNlLT5jbmFtZSA9ICJuRm9yY2UyIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwpAQCAtMTc5LDggKzE3OSw4IEBACiAJY2FzZSAweDE4OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMTgiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjEwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYyMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MjAuYwppbmRleCA3YjYyOWEzLi43NWZlZDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYyMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjIwLmMKQEAgLTQ5LDggKzQ5LDggQEAKIAljYXNlIDB4MjA6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYyMCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKQEAgLTY4LDggKzY4LDggQEAKIAljYXNlIDB4MjU6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYyNSI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKQEAgLTg3LDggKzg3LDggQEAKIAljYXNlIDB4Mjg6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYyOCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKQEAgLTEwNiw4ICsxMDYsOCBAQAogCWNhc2UgMHgyYToKIAkJZGV2aWNlLT5jbmFtZSA9ICJOVjJBIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYyMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjMwLmMKaW5kZXggN2RmZGRkNS4uMzY5MTlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252MzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnYzMC5jCkBAIC00OSw4ICs0OSw4IEBACiAJY2FzZSAweDMwOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMzAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjIwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC02OCw4ICs2OCw4IEBACiAJY2FzZSAweDM1OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMzUiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjIwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC04Nyw4ICs4Nyw4IEBACiAJY2FzZSAweDMxOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WMzEiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnYwNF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjIwX2RldmluaXRfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTUMgICAgIF0gPSAgbnYwNF9tY19vY2xhc3M7CkBAIC0xMDcsOCArMTA3LDggQEAKIAljYXNlIDB4MzY6CiAJCWRldmljZS0+Y25hbWUgPSAiTlYzNiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjA0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MjBfZGV2aW5pdF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudjA0X21jX29jbGFzczsKQEAgLTEyNyw4ICsxMjcsOCBAQAogCWNhc2UgMHgzNDoKIAkJZGV2aWNlLT5jbmFtZSA9ICJOVjM0IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52MDRfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxMF9kZXZpbml0X29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52MDRfbWNfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjQwLmMKaW5kZXggN2MxY2U2Yy4uMTEzMGE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY0MC5jCkBAIC01Myw4ICs1Myw4IEBACiAJY2FzZSAweDQwOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WNDAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC03Niw4ICs3Niw4IEBACiAJY2FzZSAweDQxOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WNDEiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC05OSw4ICs5OSw4IEBACiAJY2FzZSAweDQyOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WNDIiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC0xMjIsOCArMTIyLDggQEAKIAljYXNlIDB4NDM6CiAJCWRldmljZS0+Y25hbWUgPSAiTlY0MyI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjQwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52NDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKQEAgLTE0NSw4ICsxNDUsOCBAQAogCWNhc2UgMHg0NToKIAkJZGV2aWNlLT5jbmFtZSA9ICJOVjQ1IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwpAQCAtMTY4LDggKzE2OCw4IEBACiAJY2FzZSAweDQ3OgogCQlkZXZpY2UtPmNuYW1lID0gIkc3MCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjQwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52NDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKQEAgLTE5MSw4ICsxOTEsOCBAQAogCWNhc2UgMHg0OToKIAkJZGV2aWNlLT5jbmFtZSA9ICJHNzEiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC0yMTQsOCArMjE0LDggQEAKIAljYXNlIDB4NGI6CiAJCWRldmljZS0+Y25hbWUgPSAiRzczIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwpAQCAtMjM3LDggKzIzNyw4IEBACiAJY2FzZSAweDQ0OgogCQlkZXZpY2UtPmNuYW1lID0gIk5WNDQiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC0yNjAsOCArMjYwLDggQEAKIAljYXNlIDB4NDY6CiAJCWRldmljZS0+Y25hbWUgPSAiRzcyIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwpAQCAtMjgzLDggKzI4Myw4IEBACiAJY2FzZSAweDRhOgogCQlkZXZpY2UtPmNuYW1lID0gIk5WNDRBIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwpAQCAtMzA2LDggKzMwNiw4IEBACiAJY2FzZSAweDRjOgogCQlkZXZpY2UtPmNuYW1lID0gIkM2MSI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjQwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52NDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKQEAgLTMyOSw4ICszMjksOCBAQAogCWNhc2UgMHg0ZToKIAkJZGV2aWNlLT5jbmFtZSA9ICJDNTEiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjRlX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY0ZV9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CkBAIC0zNTIsOCArMzUyLDggQEAKIAljYXNlIDB4NjM6CiAJCWRldmljZS0+Y25hbWUgPSAiQzczIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjEwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnYwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnYxMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52MDRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52NDBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY0MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBudjFhX2RldmluaXRfb2NsYXNzOwpAQCAtMzc1LDggKzM3NSw4IEBACiAJY2FzZSAweDY3OgogCQlkZXZpY2UtPmNuYW1lID0gIkM2NyI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnYxMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52MDRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52MTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjA0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudjQwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52NDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnYxYV9kZXZpbml0X29jbGFzczsKQEAgLTM5OCw4ICszOTgsOCBAQAogCWNhc2UgMHg2ODoKIAkJZGV2aWNlLT5jbmFtZSA9ICJDNjgiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52MTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjA0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjEwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnYwNF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnY0MF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0RFVklOSVRdID0gIG52MWFfZGV2aW5pdF9vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY1MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252NTAuYwppbmRleCA2NjQ5OWZhLi5lZjBiMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udjUwLmMKQEAgLTYwLDggKzYwLDggQEAKIAljYXNlIDB4NTA6CiAJCWRldmljZS0+Y25hbWUgPSAiRzgwIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjUwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnY1MF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnY1MF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52NTBfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gIG52NTBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY1MF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CkBAIC04NSw4ICs4NSw4IEBACiAJY2FzZSAweDg0OgogCQlkZXZpY2UtPmNuYW1lID0gIkc4NCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52NTBfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52NTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjUwX2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTEzLDggKzExMyw4IEBACiAJY2FzZSAweDg2OgogCQlkZXZpY2UtPmNuYW1lID0gIkc4NiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52NTBfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52NTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjUwX2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTQxLDggKzE0MSw4IEBACiAJY2FzZSAweDkyOgogCQlkZXZpY2UtPmNuYW1lID0gIkc5MiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52NTBfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjUwX2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTY5LDggKzE2OSw4IEBACiAJY2FzZSAweDk0OgogCQlkZXZpY2UtPmNuYW1lID0gIkc5NCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTk3LDggKzE5Nyw4IEBACiAJY2FzZSAweDk2OgogCQlkZXZpY2UtPmNuYW1lID0gIkc5NiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMjI1LDggKzIyNSw4IEBACiAJY2FzZSAweDk4OgogCQlkZXZpY2UtPmNuYW1lID0gIkc5OCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudjg0X2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMjUzLDggKzI1Myw4IEBACiAJY2FzZSAweGEwOgogCQlkZXZpY2UtPmNuYW1lID0gIkcyMDAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52NTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjUwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjkyX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY1MF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAgbnY4NF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudjg0X3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTI4MSw4ICsyODEsOCBAQAogCWNhc2UgMHhhYToKIAkJZGV2aWNlLT5jbmFtZSA9ICJNQ1A3Ny9NQ1A3OCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICBudmFhX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ODRfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMzA5LDggKzMwOSw4IEBACiAJY2FzZSAweGFjOgogCQlkZXZpY2UtPmNuYW1lID0gIk1DUDc5L01DUDdBIjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjUwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnY5NF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnY5Ml9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52OTRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gIG52YWFfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnY4NF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CkBAIC0zMzcsOCArMzM3LDggQEAKIAljYXNlIDB4YTM6CiAJCWRldmljZS0+Y25hbWUgPSAiR1QyMTUiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52NTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjk0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjkyX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY5NF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZhM19jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTM2Nyw4ICszNjcsOCBAQAogCWNhc2UgMHhhNToKIAkJZGV2aWNlLT5jbmFtZSA9ICJHVDIxNiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmEzX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMzk2LDggKzM5Niw4IEBACiAJY2FzZSAweGE4OgogCQlkZXZpY2UtPmNuYW1lID0gIkdUMjE4IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjUwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnY5NF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnY5Ml9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52OTRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YTNfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CkBAIC00MjUsOCArNDI1LDggQEAKIAljYXNlIDB4YWY6CiAJCWRldmljZS0+Y25hbWUgPSAiTUNQODkiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52NTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjk0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjkyX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY5NF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZhM19jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnZjMC5jCmluZGV4IDIwNzViMzAuLmYxOTk5NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252YzAuYwpAQCAtNjAsOCArNjAsOCBAQAogCWNhc2UgMHhjMDoKIAkJZGV2aWNlLT5jbmFtZSA9ICJHRjEwMCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtOTIsOCArOTIsOCBAQAogCWNhc2UgMHhjNDoKIAkJZGV2aWNlLT5jbmFtZSA9ICJHRjEwNCI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTI0LDggKzEyNCw4IEBACiAJY2FzZSAweGMzOgogCQlkZXZpY2UtPmNuYW1lID0gIkdGMTA2IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjUwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnY5NF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnY5Ml9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52OTRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CkBAIC0xNTUsOCArMTU1LDggQEAKIAljYXNlIDB4Y2U6CiAJCWRldmljZS0+Y25hbWUgPSAiR0YxMTQiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52NTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjk0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjkyX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY5NF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZjMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTE4Nyw4ICsxODcsOCBAQAogCWNhc2UgMHhjZjoKIAkJZGV2aWNlLT5jbmFtZSA9ICJHRjExNiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnY1MF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52OTRfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52OTJfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudjk0X2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52YTNfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMjE5LDggKzIxOSw4IEBACiAJY2FzZSAweGMxOgogCQlkZXZpY2UtPmNuYW1lID0gIkdGMTA4IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudjUwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnY5NF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnY5Ml9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52OTRfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZhM190aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CkBAIC0yNTAsOCArMjUwLDggQEAKIAljYXNlIDB4Yzg6CiAJCWRldmljZS0+Y25hbWUgPSAiR0YxMTAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52NTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudjk0X2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudjkyX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnY5NF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZjMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmEzX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTI4Miw4ICsyODIsOCBAQAogCWNhc2UgMHhkOToKIAkJZGV2aWNlLT5jbmFtZSA9ICJHRjExOSI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnZkMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52ZDBfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52ZDBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudmQwX2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmMwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ZDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMzEzLDggKzMxMyw4IEBACiAJY2FzZSAweGQ3OgogCQlkZXZpY2UtPmNuYW1lID0gIkdGMTE3IjsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZCSU9TICBdID0gJm5vdXZlYXVfYmlvc19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICZudmQwX2dwaW9fb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAmbnZkMF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgbnZkMF9ncGlvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gIG52ZDBfaTJjX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMT0NLICBdID0gJm52YzBfY2xvY2tfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmbnZkMF90aGVybV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnZlMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGV2aWNlL252ZTAuYwppbmRleCA5Nzg0Y2JmLi4yZDFlOTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kZXZpY2UvbnZlMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2RldmljZS9udmUwLmMKQEAgLTYwLDggKzYwLDggQEAKIAljYXNlIDB4ZTQ6CiAJCWRldmljZS0+Y25hbWUgPSAiR0sxMDQiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52ZTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudmUwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnZlMF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTkzLDggKzkzLDggQEAKIAljYXNlIDB4ZTc6CiAJCWRldmljZS0+Y25hbWUgPSAiR0sxMDciOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52ZTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudmUwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnZlMF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTEyNiw4ICsxMjYsOCBAQAogCWNhc2UgMHhlNjoKIAkJZGV2aWNlLT5jbmFtZSA9ICJHSzEwNiI7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZub3V2ZWF1X2Jpb3Nfb2NsYXNzOwotCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAmbnZlMF9ncGlvX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0kyQyAgICBdID0gJm52ZDBfaTJjX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52ZTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudmUwX2kyY19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmUwX2Nsb2NrX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ZDBfdGhlcm1fb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOwpAQCAtMTU2LDExICsxNTYsMjggQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BQUCAgICBdID0gJm52YzBfcHBwX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BFUkZNT05dID0gJm52ZTBfcGVyZm1vbl9vY2xhc3M7CiAJCWJyZWFrOworCWNhc2UgMHhlYToKKwkJZGV2aWNlLT5jbmFtZSA9ICJHSzIwQSI7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NQyAgICAgXSA9ICBudmMzX21jX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIG52YzBfYnVzX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RJTUVSICBdID0gJmdrMjBhX3RpbWVyX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0ZCICAgICBdID0gIGdrMjBhX2ZiX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lCVVMgICBdID0gJmdrMjBhX2lidXNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSU5TVE1FTV0gPSBudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVk0gICAgIF0gPSAmbnZjMF92bW1ncl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9CQVIgICAgXSA9ICZudmMwX2Jhcl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudmQwX2RtYWVuZ19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBnazIwYV9maWZvX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1NXICAgICBdID0gIG52YzBfc29mdHdhcmVfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfR1IgICAgIF0gPSAgZ2syMGFfZ3JhcGhfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ09QWTIgIF0gPSAmbnZlMF9jb3B5Ml9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9QRVJGTU9OXSA9ICZudmUwX3BlcmZtb25fb2NsYXNzOworCQlicmVhazsKIAljYXNlIDB4ZjA6CiAJCWRldmljZS0+Y25hbWUgPSAiR0sxMTAiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52ZTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudmUwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnZlMF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTE4NCwxOCArMjAxLDQ5IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9DT1BZMCAgXSA9ICZudmUwX2NvcHkwX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0NPUFkxICBdID0gJm52ZTBfY29weTFfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ09QWTIgIF0gPSAmbnZlMF9jb3B5Ml9vY2xhc3M7Ci0jaWYgMAogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQlNQICAgIF0gPSAmbnZlMF9ic3Bfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfVlAgICAgIF0gPSAmbnZlMF92cF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9QUFAgICAgXSA9ICZudmMwX3BwcF9vY2xhc3M7Ci0jZW5kaWYKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BFUkZNT05dID0gJm52ZjBfcGVyZm1vbl9vY2xhc3M7CisJCWJyZWFrOworCWNhc2UgMHhmMToKKwkJZGV2aWNlLT5jbmFtZSA9ICJHSzExMEIiOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gIG52ZTBfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9DTE9DSyAgXSA9ICZudmUwX2Nsb2NrX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1RIRVJNICBdID0gJm52ZDBfdGhlcm1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTVhNICAgIF0gPSAmbnY1MF9teG1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfREVWSU5JVF0gPSAgbnZjMF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIG52YzNfbWNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQlVTICAgIF0gPSAgbnZjMF9idXNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVElNRVIgIF0gPSAmbnYwNF90aW1lcl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBudmUwX2ZiX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0xUQ0cgICBdID0gIGdmMTAwX2x0Y2dfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmbnZlMF9pYnVzX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0lOU1RNRU1dID0gIG52NTBfaW5zdG1lbV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WTSAgICAgXSA9ICZudmMwX3ZtbWdyX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJm52YzBfYmFyX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1BXUiAgICBdID0gJm52ZDBfcHdyX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZPTFQgICBdID0gJm52NDBfdm9sdF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9ETUFPQkogXSA9ICZudmQwX2RtYWVuZ19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9GSUZPICAgXSA9ICBudmUwX2ZpZm9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfU1cgICAgIF0gPSAgbnZjMF9zb2Z0d2FyZV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9HUiAgICAgXSA9ICBudmYwX2dyYXBoX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RJU1AgICBdID0gIG52ZjBfZGlzcF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9DT1BZMCAgXSA9ICZudmUwX2NvcHkwX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0NPUFkxICBdID0gJm52ZTBfY29weTFfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ09QWTIgIF0gPSAmbnZlMF9jb3B5Ml9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9CU1AgICAgXSA9ICZudmUwX2JzcF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9WUCAgICAgXSA9ICZudmUwX3ZwX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BQUCAgICBdID0gJm52YzBfcHBwX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BFUkZNT05dID0gJm52ZjBfcGVyZm1vbl9vY2xhc3M7CiAJCWJyZWFrOwogCWNhc2UgMHgxMDg6CiAJCWRldmljZS0+Y25hbWUgPSAiR0syMDgiOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVkJJT1MgIF0gPSAmbm91dmVhdV9iaW9zX29jbGFzczsKLQkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0dQSU8gICBdID0gJm52ZTBfZ3Bpb19vY2xhc3M7Ci0JCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICZudmQwX2kyY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9HUElPICAgXSA9ICBudmUwX2dwaW9fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSTJDICAgIF0gPSAgbnZlMF9pMmNfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfQ0xPQ0sgIF0gPSAmbnZlMF9jbG9ja19vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USEVSTSAgXSA9ICZudmQwX3RoZXJtX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01YTSAgICBdID0gJm52NTBfbXhtX29jbGFzczsKQEAgLTIxOSwxMSArMjY3LDkgQEAKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0NPUFkwICBdID0gJm52ZTBfY29weTBfb2NsYXNzOwogCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ09QWTEgIF0gPSAmbnZlMF9jb3B5MV9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9DT1BZMiAgXSA9ICZudmUwX2NvcHkyX29jbGFzczsKLSNpZiAwCiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9CU1AgICAgXSA9ICZudmUwX2JzcF9vY2xhc3M7CiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9WUCAgICAgXSA9ICZudmUwX3ZwX29jbGFzczsKIAkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX1BQUCAgICBdID0gJm52YzBfcHBwX29jbGFzczsKLSNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgogCQludl9mYXRhbChkZXZpY2UsICJ1bmtub3duIEtlcGxlciBjaGlwc2V0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvYmFzZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9iYXNlLmMKaW5kZXggN2E1Y2FlNC4uYzQxZjY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9iYXNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9iYXNlLmMKQEAgLTIyLDEzICsyMiw4NyBAQAogICogQXV0aG9yczogQmVuIFNrZWdncwogICovCiAKLSNpbmNsdWRlIDxlbmdpbmUvZGlzcC5oPgorI2luY2x1ZGUgInByaXYuaCIKKyNpbmNsdWRlICJvdXRwLmgiCisjaW5jbHVkZSAiY29ubi5oIgorCitzdGF0aWMgaW50Citub3V2ZWF1X2Rpc3BfaHBkX2NoZWNrKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgdTMyIHR5cGVzLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9IGV2ZW50LT5wcml2OworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG91dHAsICZkaXNwLT5vdXRwLCBoZWFkKSB7CisJCWlmIChvdXRwLT5jb25uLT5pbmRleCA9PSBpbmRleCkgeworCQkJaWYgKG91dHAtPmNvbm4tPmhwZC5ldmVudCkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAtRU5PU1lTOworfQorCitpbnQKK19ub3V2ZWF1X2Rpc3BfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQoreworCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AgPSAodm9pZCAqKW9iamVjdDsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHA7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkob3V0cCwgJmRpc3AtPm91dHAsIGhlYWQpIHsKKwkJcmV0ID0gbnZfb2Z1bmNzKG91dHApLT5maW5pKG52X29iamVjdChvdXRwKSwgc3VzcGVuZCk7CisJCWlmIChyZXQgJiYgc3VzcGVuZCkKKwkJCWdvdG8gZmFpbF9vdXRwOworCX0KKworCXJldHVybiBub3V2ZWF1X2VuZ2luZV9maW5pKCZkaXNwLT5iYXNlLCBzdXNwZW5kKTsKKworZmFpbF9vdXRwOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShvdXRwLCAmZGlzcC0+b3V0cCwgaGVhZCkgeworCQludl9vZnVuY3Mob3V0cCktPmluaXQobnZfb2JqZWN0KG91dHApKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK19ub3V2ZWF1X2Rpc3BfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gKHZvaWQgKilvYmplY3Q7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2VuZ2luZV9pbml0KCZkaXNwLT5iYXNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvdXRwLCAmZGlzcC0+b3V0cCwgaGVhZCkgeworCQlyZXQgPSBudl9vZnVuY3Mob3V0cCktPmluaXQobnZfb2JqZWN0KG91dHApKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbF9vdXRwOworCX0KKworCXJldHVybiByZXQ7CisKK2ZhaWxfb3V0cDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2Uob3V0cCwgJmRpc3AtPm91dHAsIGhlYWQpIHsKKwkJbnZfb2Z1bmNzKG91dHApLT5maW5pKG52X29iamVjdChvdXRwKSwgZmFsc2UpOworCX0KKworCXJldHVybiByZXQ7Cit9CiAKIHZvaWQKIF9ub3V2ZWF1X2Rpc3BfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gKHZvaWQgKilvYmplY3Q7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwLCAqb3V0dDsKKwogCW5vdXZlYXVfZXZlbnRfZGVzdHJveSgmZGlzcC0+dmJsYW5rKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvdXRwLCBvdXR0LCAmZGlzcC0+b3V0cCwgaGVhZCkgeworCQlub3V2ZWF1X29iamVjdF9yZWYoTlVMTCwgKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKikmb3V0cCk7CisJfQorCiAJbm91dmVhdV9lbmdpbmVfZGVzdHJveSgmZGlzcC0+YmFzZSk7CiB9CiAKQEAgLTM5LDggKzExMywxNSBAQAogCQkgICAgIGNvbnN0IGNoYXIgKmludG5hbWUsIGNvbnN0IGNoYXIgKmV4dG5hbWUsCiAJCSAgICAgaW50IGxlbmd0aCwgdm9pZCAqKnBvYmplY3QpCiB7CisJc3RydWN0IG5vdXZlYXVfZGlzcF9pbXBsICppbXBsID0gKHZvaWQgKilvY2xhc3M7CisJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwYXJlbnQpOwogCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3A7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKipzY2xhc3M7CisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3Q7CisJc3RydWN0IGRjYl9vdXRwdXQgZGNiRTsKKwl1OCAgaHBkID0gMCwgdmVyLCBoZHI7CisJdTMyIGRhdGE7CisJaW50IHJldCwgaTsKIAogCXJldCA9IG5vdXZlYXVfZW5naW5lX2NyZWF0ZV8ocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgdHJ1ZSwKIAkJCQkgICAgIGludG5hbWUsIGV4dG5hbWUsIGxlbmd0aCwgcG9iamVjdCk7CkBAIC00OCw1ICsxMjksNDIgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIG5vdXZlYXVfZXZlbnRfY3JlYXRlKGhlYWRzLCAmZGlzcC0+dmJsYW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZGlzcC0+b3V0cCk7CisKKwkvKiBjcmVhdGUgb3V0cHV0IG9iamVjdHMgZm9yIGVhY2ggZGlzcGxheSBwYXRoIGluIHRoZSB2YmlvcyAqLworCWkgPSAtMTsKKwl3aGlsZSAoKGRhdGEgPSBkY2Jfb3V0cF9wYXJzZShiaW9zLCArK2ksICZ2ZXIsICZoZHIsICZkY2JFKSkpIHsKKwkJaWYgKGRjYkUudHlwZSA9PSBEQ0JfT1VUUFVUX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGNiRS50eXBlID09IERDQl9PVVRQVVRfRU9MKQorCQkJYnJlYWs7CisJCWRhdGEgPSBkY2JFLmxvY2F0aW9uIDw8IDQgfCBkY2JFLnR5cGU7CisKKwkJb2NsYXNzID0gbnZrbV9vdXRwdXRfb2NsYXNzOworCQlzY2xhc3MgPSBpbXBsLT5vdXRwOworCQl3aGlsZSAoc2NsYXNzICYmIHNjbGFzc1swXSkgeworCQkJaWYgKHNjbGFzc1swXS0+aGFuZGxlID09IGRhdGEpIHsKKwkJCQlvY2xhc3MgPSBzY2xhc3NbMF07CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2xhc3MrKzsKKwkJfQorCisJCW5vdXZlYXVfb2JqZWN0X2N0b3IoKnBvYmplY3QsICpwb2JqZWN0LCBvY2xhc3MsCisJCQkJICAgICZkY2JFLCBpLCAmb2JqZWN0KTsKKwkJaHBkID0gbWF4KGhwZCwgKHU4KShkY2JFLmNvbm5lY3RvciArIDEpKTsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2V2ZW50X2NyZWF0ZSgzLCBocGQsICZkaXNwLT5ocGQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkaXNwLT5ocGQtPnByaXYgPSBkaXNwOworCWRpc3AtPmhwZC0+Y2hlY2sgPSBub3V2ZWF1X2Rpc3BfaHBkX2NoZWNrOworCisJcmV0ID0gbm91dmVhdV9ldmVudF9jcmVhdGUoMSwgaGVhZHMsICZkaXNwLT52YmxhbmspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvY29ubi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9jb25uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmYmM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvY29ubi5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlIDxzdWJkZXYvZ3Bpby5oPgorCisjaW5jbHVkZSAiY29ubi5oIgorI2luY2x1ZGUgIm91dHAuaCIKKworc3RhdGljIHZvaWQKK252a21fY29ubmVjdG9yX2hwZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3sKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmNvbm4gPSBjb250YWluZXJfb2YodywgdHlwZW9mKCpjb25uKSwgaHBkLndvcmspOworCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AgPSBub3V2ZWF1X2Rpc3AoY29ubik7CisJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9IG5vdXZlYXVfZ3Bpbyhjb25uKTsKKwl1MzIgc2VuZCA9IE5WS01fSFBEX1VOUExVRzsKKwlpZiAoZ3Bpby0+Z2V0KGdwaW8sIDAsIERDQl9HUElPX1VOVVNFRCwgY29ubi0+aHBkLmV2ZW50LT5pbmRleCkpCisJCXNlbmQgPSBOVktNX0hQRF9QTFVHOworCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihkaXNwLT5ocGQsIHNlbmQsIGNvbm4tPmluZGV4KTsKKwlub3V2ZWF1X2V2ZW50X2dldChjb25uLT5ocGQuZXZlbnQpOworfQorCitzdGF0aWMgaW50CitudmttX2Nvbm5lY3Rvcl9ocGQodm9pZCAqZGF0YSwgdTMyIHR5cGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmNvbm4gPSBkYXRhOworCURCRygiSFBEOiAlZFxuIiwgdHlwZSk7CisJc2NoZWR1bGVfd29yaygmY29ubi0+aHBkLndvcmspOworCXJldHVybiBOVktNX0VWRU5UX0RST1A7Cit9CisKK2ludAorX252a21fY29ubmVjdG9yX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKK3sKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmNvbm4gPSAodm9pZCAqKW9iamVjdDsKKwlpZiAoY29ubi0+aHBkLmV2ZW50KQorCQlub3V2ZWF1X2V2ZW50X3B1dChjb25uLT5ocGQuZXZlbnQpOworCXJldHVybiBub3V2ZWF1X29iamVjdF9maW5pKCZjb25uLT5iYXNlLCBzdXNwZW5kKTsKK30KKworaW50CitfbnZrbV9jb25uZWN0b3JfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmNvbm4gPSAodm9pZCAqKW9iamVjdDsKKwlpbnQgcmV0ID0gbm91dmVhdV9vYmplY3RfaW5pdCgmY29ubi0+YmFzZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChjb25uLT5ocGQuZXZlbnQpCisJCQlub3V2ZWF1X2V2ZW50X2dldChjb25uLT5ocGQuZXZlbnQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitfbnZrbV9jb25uZWN0b3JfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmNvbm4gPSAodm9pZCAqKW9iamVjdDsKKwlub3V2ZWF1X2V2ZW50X3JlZihOVUxMLCAmY29ubi0+aHBkLmV2ZW50KTsKKwlub3V2ZWF1X29iamVjdF9kZXN0cm95KCZjb25uLT5iYXNlKTsKK30KKworaW50CitudmttX2Nvbm5lY3Rvcl9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywKKwkJICAgICAgIHN0cnVjdCBudmJpb3NfY29ubkUgKmluZm8sIGludCBpbmRleCwKKwkJICAgICAgIGludCBsZW5ndGgsIHZvaWQgKipwb2JqZWN0KQoreworCXN0YXRpYyBjb25zdCB1OCBocGRbXSA9IHsgMHgwNywgMHgwOCwgMHg1MSwgMHg1MiwgMHg1ZSwgMHg1ZiwgMHg2MCB9OworCXN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8gPSBub3V2ZWF1X2dwaW8ocGFyZW50KTsKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gKHZvaWQgKillbmdpbmU7CisJc3RydWN0IG52a21fY29ubmVjdG9yICpjb25uOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cDsKKwlzdHJ1Y3QgZGNiX2dwaW9fZnVuYyBmdW5jOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG91dHAsICZkaXNwLT5vdXRwLCBoZWFkKSB7CisJCWlmIChvdXRwLT5jb25uICYmIG91dHAtPmNvbm4tPmluZGV4ID09IGluZGV4KSB7CisJCQlhdG9taWNfaW5jKCZudl9vYmplY3Qob3V0cC0+Y29ubiktPnJlZmNvdW50KTsKKwkJCSpwb2JqZWN0ID0gb3V0cC0+Y29ubjsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0ID0gbm91dmVhdV9vYmplY3RfY3JlYXRlXyhwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAwLCBsZW5ndGgsIHBvYmplY3QpOworCWNvbm4gPSAqcG9iamVjdDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY29ubi0+aW5mbyA9ICppbmZvOworCWNvbm4tPmluZGV4ID0gaW5kZXg7CisKKwlEQkcoInR5cGUgJTAyeCBsb2MgJWQgaHBkICUwMnggZHAgJXggZGkgJXggc3IgJXggbGNkaWQgJXhcbiIsCisJICAgIGluZm8tPnR5cGUsIGluZm8tPmxvY2F0aW9uLCBpbmZvLT5ocGQsIGluZm8tPmRwLAorCSAgICBpbmZvLT5kaSwgaW5mby0+c3IsIGluZm8tPmxjZGlkKTsKKworCWlmICgoaW5mby0+aHBkID0gZmZzKGluZm8tPmhwZCkpKSB7CisJCWlmICgtLWluZm8tPmhwZCA+PSBBUlJBWV9TSVpFKGhwZCkpIHsKKwkJCUVSUigiaHBkICUwMnggdW5rbm93blxuIiwgaW5mby0+aHBkKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpbmZvLT5ocGQgPSBocGRbaW5mby0+aHBkXTsKKworCQlyZXQgPSBncGlvLT5maW5kKGdwaW8sIDAsIGluZm8tPmhwZCwgRENCX0dQSU9fVU5VU0VELCAmZnVuYyk7CisJCWlmIChyZXQpIHsKKwkJCUVSUigiZnVuYyAlMDJ4IGxvb2t1cCBmYWlsZWQsICVkXG4iLCBpbmZvLT5ocGQsIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlyZXQgPSBub3V2ZWF1X2V2ZW50X25ldyhncGlvLT5ldmVudHMsIE5WS01fR1BJT19UT0dHTEVELAorCQkJCQlmdW5jLmxpbmUsIG52a21fY29ubmVjdG9yX2hwZCwKKwkJCQkJY29ubiwgJmNvbm4tPmhwZC5ldmVudCk7CisJCWlmIChyZXQpIHsKKwkJCUVSUigiZnVuYyAlMDJ4IGZhaWxlZCwgJWRcbiIsIGluZm8tPmhwZCwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCURCRygiZnVuYyAlMDJ4IChIUEQpXG4iLCBpbmZvLT5ocGQpOworCQl9CisJfQorCitkb25lOgorCUlOSVRfV09SSygmY29ubi0+aHBkLndvcmssIG52a21fY29ubmVjdG9yX2hwZF93b3JrKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitfbnZrbV9jb25uZWN0b3JfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwKKwkJICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqaW5mbywgdTMyIGluZGV4LAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCit7CisJc3RydWN0IG52a21fY29ubmVjdG9yICpjb25uOworCWludCByZXQ7CisKKwlyZXQgPSBudmttX2Nvbm5lY3Rvcl9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgaW5mbywgaW5kZXgsICZjb25uKTsKKwkqcG9iamVjdCA9IG52X29iamVjdChjb25uKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmttX2Nvbm5lY3Rvcl9vY2xhc3MgPSAmKHN0cnVjdCBudmttX2Nvbm5lY3Rvcl9pbXBsKSB7CisJLmJhc2UgPSB7CisJCS5oYW5kbGUgPSAwLAorCQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJCS5jdG9yID0gX252a21fY29ubmVjdG9yX2N0b3IsCisJCQkuZHRvciA9IF9udmttX2Nvbm5lY3Rvcl9kdG9yLAorCQkJLmluaXQgPSBfbnZrbV9jb25uZWN0b3JfaW5pdCwKKwkJCS5maW5pID0gX252a21fY29ubmVjdG9yX2ZpbmksCisJCX0sCisJfSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvY29ubi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9jb25uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ZWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvY29ubi5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX19OVktNX0RJU1BfQ09OTl9IX18KKyNkZWZpbmUgX19OVktNX0RJU1BfQ09OTl9IX18KKworI2luY2x1ZGUgInByaXYuaCIKKworc3RydWN0IG52a21fY29ubmVjdG9yIHsKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisKKwlzdHJ1Y3QgbnZiaW9zX2Nvbm5FIGluZm87CisJaW50IGluZGV4OworCisJc3RydWN0IHsKKwkJc3RydWN0IG5vdXZlYXVfZXZlbnRoICpldmVudDsKKwkJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJfSBocGQ7Cit9OworCisjZGVmaW5lIG52a21fY29ubmVjdG9yX2NyZWF0ZShwLGUsYyxiLGksZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW52a21fY29ubmVjdG9yX2NyZWF0ZV8oKHApLCAoZSksIChjKSwgKGIpLCAoaSksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQorI2RlZmluZSBudmttX2Nvbm5lY3Rvcl9kZXN0cm95KGQpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKmRpc3AgPSAoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbnZrbV9jb25uZWN0b3JfZHRvcihudl9vYmplY3QoZGlzcCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG52a21fY29ubmVjdG9yX2luaXQoZCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBudmttX2Nvbm5lY3RvciAqZGlzcCA9IChkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9udmttX2Nvbm5lY3Rvcl9pbml0KG52X29iamVjdChkaXNwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbnZrbV9jb25uZWN0b3JfZmluaShkLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG52a21fY29ubmVjdG9yICpkaXNwID0gKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX252a21fY29ubmVjdG9yX2ZpbmkobnZfb2JqZWN0KGRpc3ApLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCitpbnQgbnZrbV9jb25uZWN0b3JfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCisJCQkgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgc3RydWN0IG52Ymlvc19jb25uRSAqLAorCQkJICAgaW50LCBpbnQsIHZvaWQgKiopOworCitpbnQgIF9udmttX2Nvbm5lY3Rvcl9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHZvaWQgKiwgdTMyLAorCQkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiopOwordm9pZCBfbnZrbV9jb25uZWN0b3JfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIF9udmttX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgX252a21fY29ubmVjdG9yX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIGJvb2wpOworCitzdHJ1Y3QgbnZrbV9jb25uZWN0b3JfaW1wbCB7CisJc3RydWN0IG5vdXZlYXVfb2NsYXNzIGJhc2U7Cit9OworCisjaWZuZGVmIE1TRworI2RlZmluZSBNU0cobCxmLGEuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9jb25uZWN0b3IgKl9jb25uID0gKHZvaWQgKiljb25uOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwludl8jI2wobnZfb2JqZWN0KGNvbm4pLT5lbmdpbmUsICIlMDJ4OiUwMnglMDJ4OiAiZiwgX2Nvbm4tPmluZGV4LCAgICAgIFwKKwkgICAgICAgX2Nvbm4tPmluZm8ubG9jYXRpb24sIF9jb25uLT5pbmZvLnR5cGUsICMjYSk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgREJHKGYsYS4uLikgTVNHKGRlYnVnLCBmLCAjI2EpCisjZGVmaW5lIEVSUihmLGEuLi4pIE1TRyhlcnJvciwgZiwgIyNhKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9kcG9ydC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9kcG9ydC5jCmluZGV4IDNjYTJkMjUuLjM5NTYyZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvZHBvcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL2Rwb3J0LmMKQEAgLTMwLDQyICszMCwzOCBAQAogCiAjaW5jbHVkZSA8ZW5naW5lL2Rpc3AuaD4KIAotI2luY2x1ZGUgImRwb3J0LmgiCisjaW5jbHVkZSA8Y29yZS9jbGFzcy5oPgogCi0jZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pIG52X2RlYnVnKGRwLT5kaXNwLCAiRFA6JTA0eDolMDR4OiAiIGZtdCwgICAgICAgICAgICAgXAotCQkJCSAgIGRwLT5vdXRwLT5oYXNodCwgZHAtPm91dHAtPmhhc2htLCAjI2FyZ3MpCi0jZGVmaW5lIEVSUihmbXQsIGFyZ3MuLi4pIG52X2Vycm9yKGRwLT5kaXNwLCAiRFA6JTA0eDolMDR4OiAiIGZtdCwgICAgICAgICAgICAgXAotCQkJCSAgIGRwLT5vdXRwLT5oYXNodCwgZHAtPm91dHAtPmhhc2htLCAjI2FyZ3MpCisjaW5jbHVkZSAiZHBvcnQuaCIKKyNpbmNsdWRlICJvdXRwZHAuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbGluayB0cmFpbmluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGRwX3N0YXRlIHsKLQljb25zdCBzdHJ1Y3Qgbm91dmVhdV9kcF9mdW5jICpmdW5jOwotCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3A7Ci0Jc3RydWN0IGRjYl9vdXRwdXQgKm91dHA7Ci0Jc3RydWN0IG52Ymlvc19kcG91dCBpbmZvOwotCXU4IHZlcnNpb247Ci0Jc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKmF1eDsKLQlpbnQgaGVhZDsKLQl1OCAgZHBjZFs0XTsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHA7CiAJaW50IGxpbmtfbnI7CiAJdTMyIGxpbmtfYnc7CiAJdTggIHN0YXRbNl07CiAJdTggIGNvbmZbNF07CisJYm9vbCBwYzI7CisJdTggIHBjMnN0YXQ7CisJdTggIHBjMmNvbmZbMl07CiB9OwogCiBzdGF0aWMgaW50CiBkcF9zZXRfbGlua19jb25maWcoc3RydWN0IGRwX3N0YXRlICpkcCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gZHAtPmRpc3A7CisJc3RydWN0IG52a21fb3V0cHV0X2RwX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29jbGFzcyhkcC0+b3V0cCk7CisJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwID0gZHAtPm91dHA7CisJc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9IG5vdXZlYXVfZGlzcChvdXRwKTsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGRpc3ApOwogCXN0cnVjdCBudmJpb3NfaW5pdCBpbml0ID0gewotCQkuc3ViZGV2ID0gbnZfc3ViZGV2KGRwLT5kaXNwKSwKKwkJLnN1YmRldiA9IG52X3N1YmRldihkaXNwKSwKIAkJLmJpb3MgPSBiaW9zLAogCQkub2Zmc2V0ID0gMHgwMDAwLAotCQkub3V0cCA9IGRwLT5vdXRwLAotCQkuY3J0YyA9IGRwLT5oZWFkLAorCQkub3V0cCA9ICZvdXRwLT5iYXNlLmluZm8sCisJCS5jcnRjID0gLTEsCiAJCS5leGVjdXRlID0gMSwKIAl9OwogCXUzMiBsbmtjbXA7CkBAIC03NSw4ICs3MSw4IEBACiAJREJHKCIlZCBsYW5lcyBhdCAlZCBLQi9zXG4iLCBkcC0+bGlua19uciwgZHAtPmxpbmtfYncpOwogCiAJLyogc2V0IGRlc2lyZWQgbGluayBjb25maWd1cmF0aW9uIG9uIHRoZSBzb3VyY2UgKi8KLQlpZiAoKGxua2NtcCA9IGRwLT5pbmZvLmxua2NtcCkpIHsKLQkJaWYgKGRwLT52ZXJzaW9uIDwgMHgzMCkgeworCWlmICgobG5rY21wID0gZHAtPm91dHAtPmluZm8ubG5rY21wKSkgeworCQlpZiAob3V0cC0+dmVyc2lvbiA8IDB4MzApIHsKIAkJCXdoaWxlICgoZHAtPmxpbmtfYncgLyAxMCkgPCBudl9ybzE2KGJpb3MsIGxua2NtcCkpCiAJCQkJbG5rY21wICs9IDQ7CiAJCQlpbml0Lm9mZnNldCA9IG52X3JvMTYoYmlvcywgbG5rY21wICsgMik7CkBAIC04OSw3MyArODUsMTEyIEBACiAJCW52Ymlvc19leGVjKCZpbml0KTsKIAl9CiAKLQlyZXQgPSBkcC0+ZnVuYy0+bG5rX2N0bChkcC0+ZGlzcCwgZHAtPm91dHAsIGRwLT5oZWFkLAotCQkJCWRwLT5saW5rX25yLCBkcC0+bGlua19idyAvIDI3MDAwLAotCQkJCWRwLT5kcGNkW0RQQ0RfUkMwMl0gJgotCQkJCQkgRFBDRF9SQzAyX0VOSEFOQ0VEX0ZSQU1FX0NBUCk7CisJcmV0ID0gaW1wbC0+bG5rX2N0bChvdXRwLCBkcC0+bGlua19uciwgZHAtPmxpbmtfYncgLyAyNzAwMCwKKwkJCSAgICBvdXRwLT5kcGNkW0RQQ0RfUkMwMl0gJgorCQkJCSAgICAgICBEUENEX1JDMDJfRU5IQU5DRURfRlJBTUVfQ0FQKTsKIAlpZiAocmV0KSB7Ci0JCUVSUigibG5rX2N0bCBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJaWYgKHJldCA8IDApCisJCQlFUlIoImxua19jdGwgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCisJaW1wbC0+bG5rX3B3cihvdXRwLCBkcC0+bGlua19ucik7CisKIAkvKiBzZXQgZGVzaXJlZCBsaW5rIGNvbmZpZ3VyYXRpb24gb24gdGhlIHNpbmsgKi8KIAlzaW5rWzBdID0gZHAtPmxpbmtfYncgLyAyNzAwMDsKIAlzaW5rWzFdID0gZHAtPmxpbmtfbnI7Ci0JaWYgKGRwLT5kcGNkW0RQQ0RfUkMwMl0gJiBEUENEX1JDMDJfRU5IQU5DRURfRlJBTUVfQ0FQKQorCWlmIChvdXRwLT5kcGNkW0RQQ0RfUkMwMl0gJiBEUENEX1JDMDJfRU5IQU5DRURfRlJBTUVfQ0FQKQogCQlzaW5rWzFdIHw9IERQQ0RfTEMwMV9FTkhBTkNFRF9GUkFNRV9FTjsKIAotCXJldHVybiBudl93cmF1eChkcC0+YXV4LCBEUENEX0xDMDAsIHNpbmssIDIpOworCXJldHVybiBudl93cmF1eChvdXRwLT5iYXNlLmVkaWQsIERQQ0RfTEMwMF9MSU5LX0JXX1NFVCwgc2luaywgMik7CiB9CiAKIHN0YXRpYyB2b2lkCiBkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihzdHJ1Y3QgZHBfc3RhdGUgKmRwLCB1OCBwYXR0ZXJuKQogeworCXN0cnVjdCBudmttX291dHB1dF9kcF9pbXBsICppbXBsID0gKHZvaWQgKiludl9vY2xhc3MoZHAtPm91dHApOworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGRwLT5vdXRwOwogCXU4IHNpbmtfdHA7CiAKIAlEQkcoInRyYWluaW5nIHBhdHRlcm4gJWRcbiIsIHBhdHRlcm4pOwotCWRwLT5mdW5jLT5wYXR0ZXJuKGRwLT5kaXNwLCBkcC0+b3V0cCwgZHAtPmhlYWQsIHBhdHRlcm4pOworCWltcGwtPnBhdHRlcm4ob3V0cCwgcGF0dGVybik7CiAKLQludl9yZGF1eChkcC0+YXV4LCBEUENEX0xDMDIsICZzaW5rX3RwLCAxKTsKKwludl9yZGF1eChvdXRwLT5iYXNlLmVkaWQsIERQQ0RfTEMwMiwgJnNpbmtfdHAsIDEpOwogCXNpbmtfdHAgJj0gfkRQQ0RfTEMwMl9UUkFJTklOR19QQVRURVJOX1NFVDsKIAlzaW5rX3RwIHw9IHBhdHRlcm47Ci0JbnZfd3JhdXgoZHAtPmF1eCwgRFBDRF9MQzAyLCAmc2lua190cCwgMSk7CisJbnZfd3JhdXgob3V0cC0+YmFzZS5lZGlkLCBEUENEX0xDMDIsICZzaW5rX3RwLCAxKTsKIH0KIAogc3RhdGljIGludAotZHBfbGlua190cmFpbl9jb21taXQoc3RydWN0IGRwX3N0YXRlICpkcCkKK2RwX2xpbmtfdHJhaW5fY29tbWl0KHN0cnVjdCBkcF9zdGF0ZSAqZHAsIGJvb2wgcGMpCiB7Ci0JaW50IGk7CisJc3RydWN0IG52a21fb3V0cHV0X2RwX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29jbGFzcyhkcC0+b3V0cCk7CisJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwID0gZHAtPm91dHA7CisJaW50IHJldCwgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkcC0+bGlua19ucjsgaSsrKSB7CiAJCXU4IGxhbmUgPSAoZHAtPnN0YXRbNCArIChpID4+IDEpXSA+PiAoKGkgJiAxKSAqIDQpKSAmIDB4ZjsKKwkJdTggbHBjMiA9IChkcC0+cGMyc3RhdCA+PiAoaSAqIDIpKSAmIDB4MzsKIAkJdTggbHByZSA9IChsYW5lICYgMHgwYykgPj4gMjsKIAkJdTggbHZzdyA9IChsYW5lICYgMHgwMykgPj4gMDsKKwkJdTggaGl2cyA9IDMgLSBscHJlOworCQl1OCBoaXBlID0gMzsKKwkJdTggaGlwYyA9IDM7CisKKwkJaWYgKGxwYzIgPj0gaGlwYykKKwkJCWxwYzIgPSBoaXBjIHwgRFBDRF9MQzBGX0xBTkUwX01BWF9QT1NUX0NVUlNPUjJfUkVBQ0hFRDsKKwkJaWYgKGxwcmUgPj0gaGlwZSkgeworCQkJbHByZSA9IGhpcGUgfCBEUENEX0xDMDNfTUFYX1NXSU5HX1JFQUNIRUQ7IC8qIHllcy4gKi8KKwkJCWx2c3cgPSBoaXZzID0gMyAtIChscHJlICYgMyk7CisJCX0gZWxzZQorCQlpZiAobHZzdyA+PSBoaXZzKSB7CisJCQlsdnN3ID0gaGl2cyB8IERQQ0RfTEMwM19NQVhfU1dJTkdfUkVBQ0hFRDsKKwkJfQogCiAJCWRwLT5jb25mW2ldID0gKGxwcmUgPDwgMykgfCBsdnN3OwotCQlpZiAobHZzdyA9PSAzKQotCQkJZHAtPmNvbmZbaV0gfD0gRFBDRF9MQzAzX01BWF9TV0lOR19SRUFDSEVEOwotCQlpZiAobHByZSA9PSAzKQotCQkJZHAtPmNvbmZbaV0gfD0gRFBDRF9MQzAzX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKwkJZHAtPnBjMmNvbmZbaSA+PiAxXSB8PSBscGMyIDw8ICgoaSAmIDEpICogNCk7CiAKLQkJREJHKCJjb25maWcgbGFuZSAlZCAlMDJ4XG4iLCBpLCBkcC0+Y29uZltpXSk7Ci0JCWRwLT5mdW5jLT5kcnZfY3RsKGRwLT5kaXNwLCBkcC0+b3V0cCwgZHAtPmhlYWQsIGksIGx2c3csIGxwcmUpOworCQlEQkcoImNvbmZpZyBsYW5lICVkICUwMnggJTAyeFxuIiwgaSwgZHAtPmNvbmZbaV0sIGxwYzIpOworCQlpbXBsLT5kcnZfY3RsKG91dHAsIGksIGx2c3cgJiAzLCBscHJlICYgMywgbHBjMiAmIDMpOwogCX0KIAotCXJldHVybiBudl93cmF1eChkcC0+YXV4LCBEUENEX0xDMDMoMCksIGRwLT5jb25mLCA0KTsKLX0KLQotc3RhdGljIGludAotZHBfbGlua190cmFpbl91cGRhdGUoc3RydWN0IGRwX3N0YXRlICpkcCwgdTMyIGRlbGF5KQotewotCWludCByZXQ7Ci0KLQl1ZGVsYXkoZGVsYXkpOwotCi0JcmV0ID0gbnZfcmRhdXgoZHAtPmF1eCwgRFBDRF9MUzAyLCBkcC0+c3RhdCwgNik7CisJcmV0ID0gbnZfd3JhdXgob3V0cC0+YmFzZS5lZGlkLCBEUENEX0xDMDMoMCksIGRwLT5jb25mLCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JREJHKCJzdGF0dXMgJTZwaFxuIiwgZHAtPnN0YXQpOworCWlmIChwYykgeworCQlyZXQgPSBudl93cmF1eChvdXRwLT5iYXNlLmVkaWQsIERQQ0RfTEMwRiwgZHAtPnBjMmNvbmYsIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHBfbGlua190cmFpbl91cGRhdGUoc3RydWN0IGRwX3N0YXRlICpkcCwgYm9vbCBwYywgdTMyIGRlbGF5KQoreworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGRwLT5vdXRwOworCWludCByZXQ7CisKKwlpZiAob3V0cC0+ZHBjZFtEUENEX1JDMEVfQVVYX1JEX0lOVEVSVkFMXSkKKwkJbWRlbGF5KG91dHAtPmRwY2RbRFBDRF9SQzBFX0FVWF9SRF9JTlRFUlZBTF0gKiA0KTsKKwllbHNlCisJCXVkZWxheShkZWxheSk7CisKKwlyZXQgPSBudl9yZGF1eChvdXRwLT5iYXNlLmVkaWQsIERQQ0RfTFMwMiwgZHAtPnN0YXQsIDYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGMpIHsKKwkJcmV0ID0gbnZfcmRhdXgob3V0cC0+YmFzZS5lZGlkLCBEUENEX0xTMEMsICZkcC0+cGMyc3RhdCwgMSk7CisJCWlmIChyZXQpCisJCQlkcC0+cGMyc3RhdCA9IDB4MDA7CisJCURCRygic3RhdHVzICU2cGggcGMyICUwMnhcbiIsIGRwLT5zdGF0LCBkcC0+cGMyc3RhdCk7CisJfSBlbHNlIHsKKwkJREJHKCJzdGF0dXMgJTZwaFxuIiwgZHAtPnN0YXQpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNjksOCArMjA0LDggQEAKIAlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkcCwgMSk7CiAKIAlkbyB7Ci0JCWlmIChkcF9saW5rX3RyYWluX2NvbW1pdChkcCkgfHwKLQkJICAgIGRwX2xpbmtfdHJhaW5fdXBkYXRlKGRwLCAxMDApKQorCQlpZiAoZHBfbGlua190cmFpbl9jb21taXQoZHAsIGZhbHNlKSB8fAorCQkgICAgZHBfbGlua190cmFpbl91cGRhdGUoZHAsIGZhbHNlLCAxMDApKQogCQkJYnJlYWs7CiAKIAkJY3JfZG9uZSA9IHRydWU7CkBAIC0xOTYsMTMgKzIzMSwxNyBAQAogc3RhdGljIGludAogZHBfbGlua190cmFpbl9lcShzdHJ1Y3QgZHBfc3RhdGUgKmRwKQogeworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGRwLT5vdXRwOwogCWJvb2wgZXFfZG9uZSA9IGZhbHNlLCBjcl9kb25lID0gdHJ1ZTsKIAlpbnQgdHJpZXMgPSAwLCBpOwogCi0JZHBfc2V0X3RyYWluaW5nX3BhdHRlcm4oZHAsIDIpOworCWlmIChvdXRwLT5kcGNkWzJdICYgRFBDRF9SQzAyX1RQUzNfU1VQUE9SVEVEKQorCQlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkcCwgMyk7CisJZWxzZQorCQlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkcCwgMik7CiAKIAlkbyB7Ci0JCWlmIChkcF9saW5rX3RyYWluX3VwZGF0ZShkcCwgNDAwKSkKKwkJaWYgKGRwX2xpbmtfdHJhaW5fdXBkYXRlKGRwLCBkcC0+cGMyLCA0MDApKQogCQkJYnJlYWs7CiAKIAkJZXFfZG9uZSA9ICEhKGRwLT5zdGF0WzJdICYgRFBDRF9MUzA0X0lOVEVSTEFORV9BTElHTl9ET05FKTsKQEAgLTIxNSw3ICsyNTQsNyBAQAogCQkJCWVxX2RvbmUgPSBmYWxzZTsKIAkJfQogCi0JCWlmIChkcF9saW5rX3RyYWluX2NvbW1pdChkcCkpCisJCWlmIChkcF9saW5rX3RyYWluX2NvbW1pdChkcCwgZHAtPnBjMikpCiAJCQlicmVhazsKIAl9IHdoaWxlICghZXFfZG9uZSAmJiBjcl9kb25lICYmICsrdHJpZXMgPD0gNSk7CiAKQEAgLTIyNSwxMjEgKzI2NCwxMDkgQEAKIHN0YXRpYyB2b2lkCiBkcF9saW5rX3RyYWluX2luaXQoc3RydWN0IGRwX3N0YXRlICpkcCwgYm9vbCBzcHJlYWQpCiB7CisJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwID0gZHAtPm91dHA7CisJc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9IG5vdXZlYXVfZGlzcChvdXRwKTsKKwlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGRpc3ApOwogCXN0cnVjdCBudmJpb3NfaW5pdCBpbml0ID0gewotCQkuc3ViZGV2ID0gbnZfc3ViZGV2KGRwLT5kaXNwKSwKLQkJLmJpb3MgPSBub3V2ZWF1X2Jpb3MoZHAtPmRpc3ApLAotCQkub3V0cCA9IGRwLT5vdXRwLAotCQkuY3J0YyA9IGRwLT5oZWFkLAorCQkuc3ViZGV2ID0gbnZfc3ViZGV2KGRpc3ApLAorCQkuYmlvcyA9IGJpb3MsCisJCS5vdXRwID0gJm91dHAtPmJhc2UuaW5mbywKKwkJLmNydGMgPSAtMSwKIAkJLmV4ZWN1dGUgPSAxLAogCX07CiAKIAkvKiBzZXQgZGVzaXJlZCBzcHJlYWQgKi8KIAlpZiAoc3ByZWFkKQotCQlpbml0Lm9mZnNldCA9IGRwLT5pbmZvLnNjcmlwdFsyXTsKKwkJaW5pdC5vZmZzZXQgPSBvdXRwLT5pbmZvLnNjcmlwdFsyXTsKIAllbHNlCi0JCWluaXQub2Zmc2V0ID0gZHAtPmluZm8uc2NyaXB0WzNdOworCQlpbml0Lm9mZnNldCA9IG91dHAtPmluZm8uc2NyaXB0WzNdOwogCW52Ymlvc19leGVjKCZpbml0KTsKIAogCS8qIHByZS10cmFpbiBzY3JpcHQgKi8KLQlpbml0Lm9mZnNldCA9IGRwLT5pbmZvLnNjcmlwdFswXTsKKwlpbml0Lm9mZnNldCA9IG91dHAtPmluZm8uc2NyaXB0WzBdOwogCW52Ymlvc19leGVjKCZpbml0KTsKIH0KIAogc3RhdGljIHZvaWQKIGRwX2xpbmtfdHJhaW5fZmluaShzdHJ1Y3QgZHBfc3RhdGUgKmRwKQogeworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGRwLT5vdXRwOworCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AgPSBub3V2ZWF1X2Rpc3Aob3V0cCk7CisJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhkaXNwKTsKIAlzdHJ1Y3QgbnZiaW9zX2luaXQgaW5pdCA9IHsKLQkJLnN1YmRldiA9IG52X3N1YmRldihkcC0+ZGlzcCksCi0JCS5iaW9zID0gbm91dmVhdV9iaW9zKGRwLT5kaXNwKSwKLQkJLm91dHAgPSBkcC0+b3V0cCwKLQkJLmNydGMgPSBkcC0+aGVhZCwKKwkJLnN1YmRldiA9IG52X3N1YmRldihkaXNwKSwKKwkJLmJpb3MgPSBiaW9zLAorCQkub3V0cCA9ICZvdXRwLT5iYXNlLmluZm8sCisJCS5jcnRjID0gLTEsCiAJCS5leGVjdXRlID0gMSwKIAl9OwogCiAJLyogcG9zdC10cmFpbiBzY3JpcHQgKi8KLQlpbml0Lm9mZnNldCA9IGRwLT5pbmZvLnNjcmlwdFsxXSwKKwlpbml0Lm9mZnNldCA9IG91dHAtPmluZm8uc2NyaXB0WzFdLAogCW52Ymlvc19leGVjKCZpbml0KTsKIH0KIAotaW50Ci1ub3V2ZWF1X2RwX3RyYWluKHN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AsIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2RwX2Z1bmMgKmZ1bmMsCi0JCSBzdHJ1Y3QgZGNiX291dHB1dCAqb3V0cCwgaW50IGhlYWQsIHUzMiBkYXRhcmF0ZSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHBfcmF0ZXMgeworCXUzMiByYXRlOworCXU4ICBidzsKKwl1OCAgbnI7Cit9IG5vdXZlYXVfZHBfcmF0ZXNbXSA9IHsKKwl7IDIxNjAwMDAsIDB4MTQsIDQgfSwKKwl7IDEwODAwMDAsIDB4MGEsIDQgfSwKKwl7IDEwODAwMDAsIDB4MTQsIDIgfSwKKwl7ICA2NDgwMDAsIDB4MDYsIDQgfSwKKwl7ICA1NDAwMDAsIDB4MGEsIDIgfSwKKwl7ICA1NDAwMDAsIDB4MTQsIDEgfSwKKwl7ICAzMjQwMDAsIDB4MDYsIDIgfSwKKwl7ICAyNzAwMDAsIDB4MGEsIDEgfSwKKwl7ICAxNjIwMDAsIDB4MDYsIDEgfSwKKwl7fQorfTsKKwordm9pZAorbm91dmVhdV9kcF90cmFpbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhkaXNwKTsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKGRpc3ApOworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGNvbnRhaW5lcl9vZih3LCB0eXBlb2YoKm91dHApLCBsdC53b3JrKTsKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gbm91dmVhdV9kaXNwKG91dHApOworCWNvbnN0IHN0cnVjdCBkcF9yYXRlcyAqY2ZnID0gbm91dmVhdV9kcF9yYXRlczsKIAlzdHJ1Y3QgZHBfc3RhdGUgX2RwID0gewotCQkuZGlzcCA9IGRpc3AsCi0JCS5mdW5jID0gZnVuYywKIAkJLm91dHAgPSBvdXRwLAotCQkuaGVhZCA9IGhlYWQsCiAJfSwgKmRwID0gJl9kcDsKLQljb25zdCB1MzIgYndfbGlzdFtdID0geyA1NDAwMDAsIDI3MDAwMCwgMTYyMDAwLCAwIH07Ci0JY29uc3QgdTMyICpsaW5rX2J3ID0gYndfbGlzdDsKLQl1OCAgaGRyLCBjbnQsIGxlbjsKLQl1MzIgZGF0YTsKKwl1MzIgZGF0YXJhdGUgPSAwOwogCWludCByZXQ7CiAKLQkvKiBmaW5kIHRoZSBiaW9zIGRpc3BsYXlwb3J0IGRhdGEgcmVsZXZhbnQgdG8gdGhpcyBvdXRwdXQgKi8KLQlkYXRhID0gbnZiaW9zX2Rwb3V0X21hdGNoKGJpb3MsIG91dHAtPmhhc2h0LCBvdXRwLT5oYXNobSwgJmRwLT52ZXJzaW9uLAotCQkJCSAmaGRyLCAmY250LCAmbGVuLCAmZHAtPmluZm8pOwotCWlmICghZGF0YSkgewotCQlFUlIoImJpb3MgZGF0YSBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBhY3F1aXJlIHRoZSBhdXggY2hhbm5lbCBhbmQgZmV0Y2ggc29tZSBpbmZvIGFib3V0IHRoZSBkaXNwbGF5ICovCi0JaWYgKG91dHAtPmxvY2F0aW9uKQotCQlkcC0+YXV4ID0gaTJjLT5maW5kX3R5cGUoaTJjLCBOVl9JMkNfVFlQRV9FWFRBVVgob3V0cC0+ZXh0ZGV2KSk7Ci0JZWxzZQotCQlkcC0+YXV4ID0gaTJjLT5maW5kKGkyYywgTlZfSTJDX1RZUEVfRENCSTJDKG91dHAtPmkyY19pbmRleCkpOwotCWlmICghZHAtPmF1eCkgewotCQlFUlIoIm5vIGF1eCBjaGFubmVsPyFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXQgPSBudl9yZGF1eChkcC0+YXV4LCAweDAwMDAwLCBkcC0+ZHBjZCwgc2l6ZW9mKGRwLT5kcGNkKSk7Ci0JaWYgKHJldCkgewotCQkvKiBpdCdzIHBvc3NpYmxlIHRoZSBkaXNwbGF5IGhhcyBiZWVuIHVucGx1Z2dlZCBiZWZvcmUgd2UKLQkJICogZ2V0IGhlcmUuICB3ZSBzdGlsbCBuZWVkIHRvIGV4ZWN1dGUgdGhlIGZ1bGwgc2V0IG9mCi0JCSAqIHZiaW9zIHNjcmlwdHMsIGFuZCBwcm9ncmFtIHRoZSBPUiBhdCBhIGhpZ2ggZW5vdWdoCi0JCSAqIGZyZXF1ZW5jeSB0byBzYXRpc2Z5IHRoZSB0YXJnZXQgbW9kZS4gIGZhaWx1cmUgdG8gZG8KLQkJICogc28gcmVzdWx0cyBhdCBiZXN0IGluIGFuIFVQREFURSBoYW5naW5nLCBhbmQgYXQgd29yc3QKLQkJICogd2l0aCBQRElTUCBydW5uaW5nIGF3YXkgdG8gam9pbiB0aGUgY2lyY3VzLgotCQkgKi8KLQkJZHAtPmRwY2RbMV0gPSBsaW5rX2J3WzBdIC8gMjcwMDA7Ci0JCWRwLT5kcGNkWzJdID0gNDsKLQkJZHAtPmRwY2RbM10gPSAweDAwOwotCQlFUlIoImZhaWxlZCB0byByZWFkIERQQ0RcbiIpOwotCX0KLQogCS8qIGJyaW5nIGNhcGFiaWxpdGllcyB3aXRoaW4gZW5jb2RlciBsaW1pdHMgKi8KLQlpZiAoKGRwLT5kcGNkWzJdICYgMHgxZikgPiBkcC0+b3V0cC0+ZHBjb25mLmxpbmtfbnIpIHsKLQkJZHAtPmRwY2RbMl0gJj0gfjB4MWY7Ci0JCWRwLT5kcGNkWzJdIHw9IGRwLT5vdXRwLT5kcGNvbmYubGlua19ucjsKKwlpZiAobnZfbWNsYXNzKGRpc3ApIDwgTlZEMF9ESVNQX0NMQVNTKQorCQlvdXRwLT5kcGNkWzJdICY9IH5EUENEX1JDMDJfVFBTM19TVVBQT1JURUQ7CisJaWYgKChvdXRwLT5kcGNkWzJdICYgMHgxZikgPiBvdXRwLT5iYXNlLmluZm8uZHBjb25mLmxpbmtfbnIpIHsKKwkJb3V0cC0+ZHBjZFsyXSAmPSB+RFBDRF9SQzAyX01BWF9MQU5FX0NPVU5UOworCQlvdXRwLT5kcGNkWzJdIHw9IG91dHAtPmJhc2UuaW5mby5kcGNvbmYubGlua19ucjsKIAl9Ci0JaWYgKGRwLT5kcGNkWzFdID4gZHAtPm91dHAtPmRwY29uZi5saW5rX2J3KQotCQlkcC0+ZHBjZFsxXSA9IGRwLT5vdXRwLT5kcGNvbmYubGlua19idzsKKwlpZiAob3V0cC0+ZHBjZFsxXSA+IG91dHAtPmJhc2UuaW5mby5kcGNvbmYubGlua19idykKKwkJb3V0cC0+ZHBjZFsxXSA9IG91dHAtPmJhc2UuaW5mby5kcGNvbmYubGlua19idzsKKwlkcC0+cGMyID0gb3V0cC0+ZHBjZFsyXSAmIERQQ0RfUkMwMl9UUFMzX1NVUFBPUlRFRDsKIAotCS8qIGFkanVzdCByZXF1aXJlZCBiYW5kd2lkdGggZm9yIDhCLzEwQiBjb2Rpbmcgb3ZlcmhlYWQgKi8KLQlkYXRhcmF0ZSA9IChkYXRhcmF0ZSAvIDgpICogMTA7CisJLyogcmVzdHJpY3QgbGluayBjb25maWcgdG8gdGhlIGxvd2VzdCByZXF1aXJlZCByYXRlLCBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAoZGF0YXJhdGUpIHsKKwkJZGF0YXJhdGUgPSAoZGF0YXJhdGUgLyA4KSAqIDEwOyAvKiA4Qi8xMEIgY29kaW5nIG92ZXJoZWFkICovCisJCXdoaWxlIChjZmdbMV0ucmF0ZSA+PSBkYXRhcmF0ZSkKKwkJCWNmZysrOworCX0KKwljZmctLTsKKworCS8qIGRpc2FibGUgbGluayBpbnRlcnJ1cHQgaGFuZGxpbmcgZHVyaW5nIGxpbmsgdHJhaW5pbmcgKi8KKwlub3V2ZWF1X2V2ZW50X3B1dChvdXRwLT5pcnEpOwogCiAJLyogZW5hYmxlIGRvd24tc3ByZWFkaW5nIGFuZCBleGVjdXRlIHByZS10cmFpbiBzY3JpcHQgZnJvbSB2YmlvcyAqLwotCWRwX2xpbmtfdHJhaW5faW5pdChkcCwgZHAtPmRwY2RbM10gJiAweDAxKTsKKwlkcF9saW5rX3RyYWluX2luaXQoZHAsIG91dHAtPmRwY2RbM10gJiAweDAxKTsKIAotCS8qIHN0YXJ0IG9mZiBhdCBoaWdoZXN0IGxpbmsgcmF0ZSBzdXBwb3J0ZWQgYnkgZW5jb2RlciBhbmQgZGlzcGxheSAqLwotCXdoaWxlICgqbGlua19idyA+IChkcC0+ZHBjZFsxXSAqIDI3MDAwKSkKLQkJbGlua19idysrOwotCi0Jd2hpbGUgKChyZXQgPSAtRUlPKSAmJiBsaW5rX2J3WzBdKSB7Ci0JCS8qIGZpbmQgbWluaW11bSByZXF1aXJlZCBsYW5lIGNvdW50IGF0IHRoaXMgbGluayByYXRlICovCi0JCWRwLT5saW5rX25yID0gZHAtPmRwY2RbMl0gJiBEUENEX1JDMDJfTUFYX0xBTkVfQ09VTlQ7Ci0JCXdoaWxlICgoZHAtPmxpbmtfbnIgPj4gMSkgKiBsaW5rX2J3WzBdID4gZGF0YXJhdGUpCi0JCQlkcC0+bGlua19uciA+Pj0gMTsKLQotCQkvKiBkcm9wIGxpbmsgcmF0ZSB0byBtaW5pbXVtIHdpdGggdGhpcyBsYW5lIGNvdW50ICovCi0JCXdoaWxlICgobGlua19id1sxXSAqIGRwLT5saW5rX25yKSA+IGRhdGFyYXRlKQotCQkJbGlua19idysrOwotCQlkcC0+bGlua19idyA9IGxpbmtfYndbMF07CisJd2hpbGUgKHJldCA9IC1FSU8sICgrK2NmZyktPnJhdGUpIHsKKwkJLyogc2VsZWN0IG5leHQgY29uZmlndXJhdGlvbiBzdXBwb3J0ZWQgYnkgZW5jb2RlciBhbmQgc2luayAqLworCQl3aGlsZSAoY2ZnLT5uciA+IChvdXRwLT5kcGNkWzJdICYgRFBDRF9SQzAyX01BWF9MQU5FX0NPVU5UKSB8fAorCQkgICAgICAgY2ZnLT5idyA+IChvdXRwLT5kcGNkW0RQQ0RfUkMwMV9NQVhfTElOS19SQVRFXSkpCisJCQljZmcrKzsKKwkJZHAtPmxpbmtfYncgPSBjZmctPmJ3ICogMjcwMDA7CisJCWRwLT5saW5rX25yID0gY2ZnLT5ucjsKIAogCQkvKiBwcm9ncmFtIHNlbGVjdGVkIGxpbmsgY29uZmlndXJhdGlvbiAqLwogCQlyZXQgPSBkcF9zZXRfbGlua19jb25maWcoZHApOwpAQCAtMzU2LDE3ICszODMsMTggQEAKIAkJCSAqLwogCQkJYnJlYWs7CiAJCX0KLQotCQkvKiByZXRyeSBhdCBsb3dlciByYXRlICovCi0JCWxpbmtfYncrKzsKIAl9CiAKLQkvKiBmaW5pc2ggbGluayB0cmFpbmluZyAqLworCS8qIGZpbmlzaCBsaW5rIHRyYWluaW5nIGFuZCBleGVjdXRlIHBvc3QtdHJhaW4gc2NyaXB0IGZyb20gdmJpb3MgKi8KIAlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkcCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCUVSUigibGluayB0cmFpbmluZyBmYWlsZWRcbiIpOwogCi0JLyogZXhlY3V0ZSBwb3N0LXRyYWluIHNjcmlwdCBmcm9tIHZiaW9zICovCiAJZHBfbGlua190cmFpbl9maW5pKGRwKTsKLQlyZXR1cm4gKHJldCA8IDApID8gZmFsc2UgOiB0cnVlOworCisJLyogc2lnbmFsIGNvbXBsZXRpb24gYW5kIGVuYWJsZSBsaW5rIGludGVycnVwdCBoYW5kbGluZyAqLworCURCRygidHJhaW5pbmcgY29tcGxldGVcbiIpOworCWF0b21pY19zZXQoJm91dHAtPmx0LmRvbmUsIDEpOworCXdha2VfdXAoJm91dHAtPmx0LndhaXQpOworCW5vdXZlYXVfZXZlbnRfZ2V0KG91dHAtPmlycSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL2Rwb3J0LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL2Rwb3J0LmgKaW5kZXggMGUxYmJkMS4uNTYyOGQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9kcG9ydC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvZHBvcnQuaApAQCAtMiwxOSArMiwxOCBAQAogI2RlZmluZSBfX05WS01fRElTUF9EUE9SVF9IX18KIAogLyogRFBDRCBSZWNlaXZlciBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgRFBDRF9SQzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAKLSNkZWZpbmUgRFBDRF9SQzAwX0RQQ0RfUkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgRFBDRF9SQzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEKLSNkZWZpbmUgRFBDRF9SQzAxX01BWF9MSU5LX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgRFBDRF9SQzAwX0RQQ0RfUkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAKKyNkZWZpbmUgRFBDRF9SQzAxX01BWF9MSU5LX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEKICNkZWZpbmUgRFBDRF9SQzAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIKICNkZWZpbmUgRFBDRF9SQzAyX0VOSEFOQ0VEX0ZSQU1FX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgRFBDRF9SQzAyX1RQUzNfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKICNkZWZpbmUgRFBDRF9SQzAyX01BWF9MQU5FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYKICNkZWZpbmUgRFBDRF9SQzAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMKICNkZWZpbmUgRFBDRF9SQzAzX01BWF9ET1dOU1BSRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFBDRF9SQzBFX0FVWF9SRF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGUKIAogLyogRFBDRCBMaW5rIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgRFBDRF9MQzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAKLSNkZWZpbmUgRFBDRF9MQzAwX0xJTktfQldfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgRFBDRF9MQzAwX0xJTktfQldfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAKICNkZWZpbmUgRFBDRF9MQzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDEKICNkZWZpbmUgRFBDRF9MQzAxX0VOSEFOQ0VEX0ZSQU1FX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKICNkZWZpbmUgRFBDRF9MQzAxX0xBTkVfQ09VTlRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYKQEAgLTI1LDYgKzI0LDE2IEBACiAjZGVmaW5lIERQQ0RfTEMwM19QUkVfRU1QSEFTSVNfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4CiAjZGVmaW5lIERQQ0RfTEMwM19NQVhfU1dJTkdfUkVBQ0hFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CiAjZGVmaW5lIERQQ0RfTEMwM19WT0xUQUdFX1NXSU5HX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERQQ0RfTEMwRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTBmCisjZGVmaW5lIERQQ0RfTEMwRl9MQU5FMV9NQVhfUE9TVF9DVVJTT1IyX1JFQUNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIERQQ0RfTEMwRl9MQU5FMV9QT1NUX0NVUlNPUjJfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIERQQ0RfTEMwRl9MQU5FMF9NQVhfUE9TVF9DVVJTT1IyX1JFQUNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIERQQ0RfTEMwRl9MQU5FMF9QT1NUX0NVUlNPUjJfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERQQ0RfTEMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTEwCisjZGVmaW5lIERQQ0RfTEMxMF9MQU5FM19NQVhfUE9TVF9DVVJTT1IyX1JFQUNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIERQQ0RfTEMxMF9MQU5FM19QT1NUX0NVUlNPUjJfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIERQQ0RfTEMxMF9MQU5FMl9NQVhfUE9TVF9DVVJTT1IyX1JFQUNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIERQQ0RfTEMxMF9MQU5FMl9QT1NUX0NVUlNPUjJfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCiAKIC8qIERQQ0QgTGluay9TaW5rIFN0YXR1cyAqLwogI2RlZmluZSBEUENEX0xTMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMgpAQCAtNTUsMjQgKzY0LDEyIEBACiAjZGVmaW5lIERQQ0RfTFMwN19MQU5FM19WT0xUQUdFX1NXSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCiAjZGVmaW5lIERQQ0RfTFMwN19MQU5FMl9QUkVfRU1QSEFTSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjCiAjZGVmaW5lIERQQ0RfTFMwN19MQU5FMl9WT0xUQUdFX1NXSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERQQ0RfTFMwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjBjCisjZGVmaW5lIERQQ0RfTFMwQ19MQU5FM19QT1NUX0NVUlNPUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGMwCisjZGVmaW5lIERQQ0RfTFMwQ19MQU5FMl9QT1NUX0NVUlNPUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIERQQ0RfTFMwQ19MQU5FMV9QT1NUX0NVUlNPUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIERQQ0RfTFMwQ19MQU5FMF9QT1NUX0NVUlNPUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCiAKLXN0cnVjdCBub3V2ZWF1X2Rpc3A7Ci1zdHJ1Y3QgZGNiX291dHB1dDsKLQotc3RydWN0IG5vdXZlYXVfZHBfZnVuYyB7Ci0JaW50ICgqcGF0dGVybikoc3RydWN0IG5vdXZlYXVfZGlzcCAqLCBzdHJ1Y3QgZGNiX291dHB1dCAqLAotCQkgICAgICAgaW50IGhlYWQsIGludCBwYXR0ZXJuKTsKLQlpbnQgKCpsbmtfY3RsKShzdHJ1Y3Qgbm91dmVhdV9kaXNwICosIHN0cnVjdCBkY2Jfb3V0cHV0ICosIGludCBoZWFkLAotCQkgICAgICAgaW50IGxpbmtfbnIsIGludCBsaW5rX2J3LCBib29sIGVuaF9mcmFtZSk7Ci0JaW50ICgqZHJ2X2N0bCkoc3RydWN0IG5vdXZlYXVfZGlzcCAqLCBzdHJ1Y3QgZGNiX291dHB1dCAqLCBpbnQgaGVhZCwKLQkJICAgICAgIGludCBsYW5lLCBpbnQgc3dpbmcsIGludCBwcmVlbSk7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG5vdXZlYXVfZHBfZnVuYyBudjk0X3Nvcl9kcF9mdW5jOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2RwX2Z1bmMgbnZkMF9zb3JfZHBfZnVuYzsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9kcF9mdW5jIG52NTBfcGlvcl9kcF9mdW5jOwotCi1pbnQgbm91dmVhdV9kcF90cmFpbihzdHJ1Y3Qgbm91dmVhdV9kaXNwICosIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2RwX2Z1bmMgKiwKLQkJICAgICBzdHJ1Y3QgZGNiX291dHB1dCAqLCBpbnQsIHUzMik7Cit2b2lkIG5vdXZlYXVfZHBfdHJhaW4oc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvZ20xMDcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvZ20xMDcuYwppbmRleCBjZjZmNTk2Li45ZmM3NDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL2dtMTA3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9nbTEwNy5jCkBAIC04MSw3ICs4MSw2IEBACiAJcHJpdi0+c29yLnBvd2VyID0gbnY1MF9zb3JfcG93ZXI7CiAJcHJpdi0+c29yLmhkYV9lbGQgPSBudmQwX2hkYV9lbGQ7CiAJcHJpdi0+c29yLmhkbWkgPSBudmQwX2hkbWlfY3RybDsKLQlwcml2LT5zb3IuZHAgPSAmbnZkMF9zb3JfZHBfZnVuYzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQsNiArOTMsNyBAQAogCQkuaW5pdCA9IF9ub3V2ZWF1X2Rpc3BfaW5pdCwKIAkJLmZpbmkgPSBfbm91dmVhdV9kaXNwX2ZpbmksCiAJfSwKKwkuYmFzZS5vdXRwID0gIG52ZDBfZGlzcF9vdXRwX3NjbGFzcywKIAkubXRoZC5jb3JlID0gJm52ZTBfZGlzcF9tYXN0X210aGRfY2hhbiwKIAkubXRoZC5iYXNlID0gJm52ZDBfZGlzcF9zeW5jX210aGRfY2hhbiwKIAkubXRoZC5vdmx5ID0gJm52ZTBfZGlzcF9vdmx5X210aGRfY2hhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjA0LmMKaW5kZXggNmM4OWFmNy4uYTMyNjY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjA0LmMKQEAgLTUxLDYgKzUxLDE0IEBACiAJYXJncy0+aHRvdGFsICA9IG52X3JkMzIocHJpdiwgMHg2ODA4MjQgKyAoaGVhZCAqIDB4MjAwMCkpICYgMHhmZmZmOwogCWFyZ3MtPmhibGFua2UgPSBhcmdzLT5odG90YWwgLSAxOwogCisJLyoKKwkgKiBJZiBvdXRwdXQgaXMgdmdhIGluc3RlYWQgb2YgZGlnaXRhbCB0aGVuIHZ0b3RhbC9odG90YWwgaXMgaW52YWxpZAorCSAqIHNvIHdlIGhhdmUgdG8gZ2l2ZSB1cCBhbmQgdHJpZ2dlciB0aGUgdGltZXN0YW1waW5nIGZhbGxiYWNrIGluIHRoZQorCSAqIGRybSBjb3JlLgorCSAqLworCWlmICghYXJncy0+dnRvdGFsIHx8ICFhcmdzLT5odG90YWwpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAlhcmdzLT50aW1lWzBdID0ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0KCkpOwogCWxpbmUgPSBudl9yZDMyKHByaXYsIDB4NjAwODY4ICsgKGhlYWQgKiAweDIwMDApKTsKIAlhcmdzLT50aW1lWzFdID0ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0KCkpOwpAQCAtNzgsMTMgKzg2LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotbnYwNF9kaXNwX3ZibGFua19lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgaGVhZCkKK252MDRfZGlzcF92YmxhbmtfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IHR5cGUsIGludCBoZWFkKQogewogCW52X3dyMzIoZXZlbnQtPnByaXYsIDB4NjAwMTQwICsgKGhlYWQgKiAweDIwMDApICwgMHgwMDAwMDAwMSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1udjA0X2Rpc3BfdmJsYW5rX2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgaGVhZCkKK252MDRfZGlzcF92YmxhbmtfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaGVhZCkKIHsKIAludl93cjMyKGV2ZW50LT5wcml2LCAweDYwMDE0MCArIChoZWFkICogMHgyMDAwKSAsIDB4MDAwMDAwMDApOwogfQpAQCAtOTgsMTIgKzEwNiwxMiBAQAogCXUzMiBwdmlkZW87CiAKIAlpZiAoY3J0YzAgJiAweDAwMDAwMDAxKSB7Ci0JCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5iYXNlLnZibGFuaywgMCk7CisJCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5iYXNlLnZibGFuaywgMSwgMCk7CiAJCW52X3dyMzIocHJpdiwgMHg2MDAxMDAsIDB4MDAwMDAwMDEpOwogCX0KIAogCWlmIChjcnRjMSAmIDB4MDAwMDAwMDEpIHsKLQkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UudmJsYW5rLCAxKTsKKwkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UudmJsYW5rLCAxLCAxKTsKIAkJbnZfd3IzMihwcml2LCAweDYwMjEwMCwgMHgwMDAwMDAwMSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCmluZGV4IDlhMGNhYjkuLjFlODVmMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY1MC5jCkBAIC04MjksMTMgKzgyOSwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotbnY1MF9kaXNwX2Jhc2VfdmJsYW5rX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBoZWFkKQorbnY1MF9kaXNwX2Jhc2VfdmJsYW5rX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaGVhZCkKIHsKIAludl9tYXNrKGV2ZW50LT5wcml2LCAweDYxMDAyYywgKDQgPDwgaGVhZCksICg0IDw8IGhlYWQpKTsKIH0KIAogc3RhdGljIHZvaWQKLW52NTBfZGlzcF9iYXNlX3ZibGFua19kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGhlYWQpCitudjUwX2Rpc3BfYmFzZV92YmxhbmtfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaGVhZCkKIHsKIAludl9tYXNrKGV2ZW50LT5wcml2LCAweDYxMDAyYywgKDQgPDwgaGVhZCksIDApOwogfQpAQCAtMTExNCwxOSArMTExNCwyMCBAQAogCW52X3dyMzIocHJpdiwgMHg2MTAwODAgKyAoY2hpZCAqIDB4MDgpLCAweDkwMDAwMDAwKTsKIH0KIAotc3RhdGljIHUxNgotZXhlY19sb29rdXAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IG91dHAsIHUzMiBjdHJsLAotCSAgICBzdHJ1Y3QgZGNiX291dHB1dCAqZGNiLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuLAorc3RhdGljIHN0cnVjdCBudmttX291dHB1dCAqCitleGVjX2xvb2t1cChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkLCBpbnQgb3IsIHUzMiBjdHJsLAorCSAgICB1MzIgKmRhdGEsIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4sCiAJICAgIHN0cnVjdCBudmJpb3Nfb3V0cCAqaW5mbykKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHByaXYpOwotCXUxNiBtYXNrLCB0eXBlLCBkYXRhOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cDsKKwl1MTYgbWFzaywgdHlwZTsKIAotCWlmIChvdXRwIDwgNCkgeworCWlmIChvciA8IDQpIHsKIAkJdHlwZSA9IERDQl9PVVRQVVRfQU5BTE9HOwogCQltYXNrID0gMDsKIAl9IGVsc2UKLQlpZiAob3V0cCA8IDgpIHsKKwlpZiAob3IgPCA4KSB7CiAJCXN3aXRjaCAoY3RybCAmIDB4MDAwMDBmMDApIHsKIAkJY2FzZSAweDAwMDAwMDAwOiB0eXBlID0gRENCX09VVFBVVF9MVkRTOyBtYXNrID0gMTsgYnJlYWs7CiAJCWNhc2UgMHgwMDAwMDEwMDogdHlwZSA9IERDQl9PVVRQVVRfVE1EUzsgbWFzayA9IDE7IGJyZWFrOwpAQCAtMTEzNiw0NSArMTEzNyw0OCBAQAogCQljYXNlIDB4MDAwMDA5MDA6IHR5cGUgPSBEQ0JfT1VUUFVUX0RQOyBtYXNrID0gMjsgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQludl9lcnJvcihwcml2LCAidW5rbm93biBTT1IgbWMgMHglMDh4XG4iLCBjdHJsKTsKLQkJCXJldHVybiAweDAwMDA7CisJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlvdXRwIC09IDQ7CisJCW9yICAtPSA0OwogCX0gZWxzZSB7Ci0JCW91dHAgPSBvdXRwIC0gODsKKwkJb3IgICA9IG9yIC0gODsKIAkJdHlwZSA9IDB4MDAxMDsKIAkJbWFzayA9IDA7CiAJCXN3aXRjaCAoY3RybCAmIDB4MDAwMDBmMDApIHsKLQkJY2FzZSAweDAwMDAwMDAwOiB0eXBlIHw9IHByaXYtPnBpb3IudHlwZVtvdXRwXTsgYnJlYWs7CisJCWNhc2UgMHgwMDAwMDAwMDogdHlwZSB8PSBwcml2LT5waW9yLnR5cGVbb3JdOyBicmVhazsKIAkJZGVmYXVsdDoKIAkJCW52X2Vycm9yKHByaXYsICJ1bmtub3duIFBJT1IgbWMgMHglMDh4XG4iLCBjdHJsKTsKLQkJCXJldHVybiAweDAwMDA7CisJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KIAogCW1hc2sgID0gMHgwMGMwICYgKG1hc2sgPDwgNik7Ci0JbWFzayB8PSAweDAwMDEgPDwgb3V0cDsKKwltYXNrIHw9IDB4MDAwMSA8PCBvcjsKIAltYXNrIHw9IDB4MDEwMCA8PCBoZWFkOwogCi0JZGF0YSA9IGRjYl9vdXRwX21hdGNoKGJpb3MsIHR5cGUsIG1hc2ssIHZlciwgaGRyLCBkY2IpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIDB4MDAwMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG91dHAsICZwcml2LT5iYXNlLm91dHAsIGhlYWQpIHsKKwkJaWYgKChvdXRwLT5pbmZvLmhhc2h0ICYgMHhmZikgPT0gdHlwZSAmJgorCQkgICAgKG91dHAtPmluZm8uaGFzaG0gJiBtYXNrKSA9PSBtYXNrKSB7CisJCQkqZGF0YSA9IG52Ymlvc19vdXRwX21hdGNoKGJpb3MsIG91dHAtPmluZm8uaGFzaHQsCisJCQkJCQkJb3V0cC0+aW5mby5oYXNobSwKKwkJCQkJCSAgdmVyLCBoZHIsIGNudCwgbGVuLCBpbmZvKTsKKwkJCWlmICghKmRhdGEpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gb3V0cDsKKwkJfQorCX0KIAotCS8qIG9mZi1jaGlwIGVuY29kZXJzIHJlcXVpcmUgbWF0Y2hpbmcgdGhlIGV4YWN0IGVuY29kZXIgdHlwZSAqLwotCWlmIChkY2ItPmxvY2F0aW9uICE9IDApCi0JCXR5cGUgfD0gZGNiLT5leHRkZXYgPDwgODsKLQotCXJldHVybiBudmJpb3Nfb3V0cF9tYXRjaChiaW9zLCB0eXBlLCBtYXNrLCB2ZXIsIGhkciwgY250LCBsZW4sIGluZm8pOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgYm9vbAorc3RhdGljIHN0cnVjdCBudmttX291dHB1dCAqCiBleGVjX3NjcmlwdChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkLCBpbnQgaWQpCiB7CiAJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwcml2KTsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHA7CiAJc3RydWN0IG52Ymlvc19vdXRwIGluZm87Ci0Jc3RydWN0IGRjYl9vdXRwdXQgZGNiOwogCXU4ICB2ZXIsIGhkciwgY250LCBsZW47Ci0JdTE2IGRhdGE7Ci0JdTMyIGN0cmwgPSAweDAwMDAwMDAwOworCXUzMiBkYXRhLCBjdHJsID0gMDsKIAl1MzIgcmVnOwogCWludCBpOwogCkBAIC0xMjA0LDM2ICsxMjA4LDM1IEBACiAJfQogCiAJaWYgKCEoY3RybCAmICgxIDw8IGhlYWQpKSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAlpLS07CiAKLQlkYXRhID0gZXhlY19sb29rdXAocHJpdiwgaGVhZCwgaSwgY3RybCwgJmRjYiwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8pOwotCWlmIChkYXRhKSB7CisJb3V0cCA9IGV4ZWNfbG9va3VwKHByaXYsIGhlYWQsIGksIGN0cmwsICZkYXRhLCAmdmVyLCAmaGRyLCAmY250LCAmbGVuLCAmaW5mbyk7CisJaWYgKG91dHApIHsKIAkJc3RydWN0IG52Ymlvc19pbml0IGluaXQgPSB7CiAJCQkuc3ViZGV2ID0gbnZfc3ViZGV2KHByaXYpLAogCQkJLmJpb3MgPSBiaW9zLAogCQkJLm9mZnNldCA9IGluZm8uc2NyaXB0W2lkXSwKLQkJCS5vdXRwID0gJmRjYiwKKwkJCS5vdXRwID0gJm91dHAtPmluZm8sCiAJCQkuY3J0YyA9IGhlYWQsCiAJCQkuZXhlY3V0ZSA9IDEsCiAJCX07CiAKLQkJcmV0dXJuIG52Ymlvc19leGVjKCZpbml0KSA9PSAwOworCQludmJpb3NfZXhlYygmaW5pdCk7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBvdXRwOwogfQogCi1zdGF0aWMgdTMyCi1leGVjX2Nsa2NtcChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkLCBpbnQgaWQsIHUzMiBwY2xrLAotCSAgICBzdHJ1Y3QgZGNiX291dHB1dCAqb3V0cCkKK3N0YXRpYyBzdHJ1Y3QgbnZrbV9vdXRwdXQgKgorZXhlY19jbGtjbXAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IGlkLCB1MzIgcGNsaywgdTMyICpjb25mKQogewogCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MocHJpdik7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOwogCXN0cnVjdCBudmJpb3Nfb3V0cCBpbmZvMTsKIAlzdHJ1Y3QgbnZiaW9zX29jZmcgaW5mbzI7CiAJdTggIHZlciwgaGRyLCBjbnQsIGxlbjsKLQl1MzIgY3RybCA9IDB4MDAwMDAwMDA7Ci0JdTMyIGRhdGEsIGNvbmYgPSB+MDsKKwl1MzIgZGF0YSwgY3RybCA9IDA7CiAJdTMyIHJlZzsKIAlpbnQgaTsKIApAQCAtMTI2MywzNyArMTI2NiwzNyBAQAogCX0KIAogCWlmICghKGN0cmwgJiAoMSA8PCBoZWFkKSkpCi0JCXJldHVybiBjb25mOworCQlyZXR1cm4gTlVMTDsKIAlpLS07CiAKLQlkYXRhID0gZXhlY19sb29rdXAocHJpdiwgaGVhZCwgaSwgY3RybCwgb3V0cCwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8xKTsKKwlvdXRwID0gZXhlY19sb29rdXAocHJpdiwgaGVhZCwgaSwgY3RybCwgJmRhdGEsICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZpbmZvMSk7CiAJaWYgKCFkYXRhKQotCQlyZXR1cm4gY29uZjsKKwkJcmV0dXJuIE5VTEw7CiAKLQlpZiAob3V0cC0+bG9jYXRpb24gPT0gMCkgewotCQlzd2l0Y2ggKG91dHAtPnR5cGUpIHsKKwlpZiAob3V0cC0+aW5mby5sb2NhdGlvbiA9PSAwKSB7CisJCXN3aXRjaCAob3V0cC0+aW5mby50eXBlKSB7CiAJCWNhc2UgRENCX09VVFBVVF9UTURTOgotCQkJY29uZiA9IChjdHJsICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJCSpjb25mID0gKGN0cmwgJiAweDAwMDAwZjAwKSA+PiA4OwogCQkJaWYgKHBjbGsgPj0gMTY1MDAwKQotCQkJCWNvbmYgfD0gMHgwMTAwOworCQkJCSpjb25mIHw9IDB4MDEwMDsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9PVVRQVVRfTFZEUzoKLQkJCWNvbmYgPSBwcml2LT5zb3IubHZkc2NvbmY7CisJCQkqY29uZiA9IHByaXYtPnNvci5sdmRzY29uZjsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9PVVRQVVRfRFA6Ci0JCQljb25mID0gKGN0cmwgJiAweDAwMDAwZjAwKSA+PiA4OworCQkJKmNvbmYgPSAoY3RybCAmIDB4MDAwMDBmMDApID4+IDg7CiAJCQlicmVhazsKIAkJY2FzZSBEQ0JfT1VUUFVUX0FOQUxPRzoKIAkJZGVmYXVsdDoKLQkJCWNvbmYgPSAweDAwZmY7CisJCQkqY29uZiA9IDB4MDBmZjsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKLQkJY29uZiA9IChjdHJsICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJKmNvbmYgPSAoY3RybCAmIDB4MDAwMDBmMDApID4+IDg7CiAJCXBjbGsgPSBwY2xrIC8gMjsKIAl9CiAKLQlkYXRhID0gbnZiaW9zX29jZmdfbWF0Y2goYmlvcywgZGF0YSwgY29uZiwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8yKTsKKwlkYXRhID0gbnZiaW9zX29jZmdfbWF0Y2goYmlvcywgZGF0YSwgKmNvbmYsICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZpbmZvMik7CiAJaWYgKGRhdGEgJiYgaWQgPCAweGZmKSB7CiAJCWRhdGEgPSBudmJpb3Nfb2Nsa19tYXRjaChiaW9zLCBpbmZvMi5jbGtjbXBbaWRdLCBwY2xrKTsKIAkJaWYgKGRhdGEpIHsKQEAgLTEzMDEsNyArMTMwNCw3IEBACiAJCQkJLnN1YmRldiA9IG52X3N1YmRldihwcml2KSwKIAkJCQkuYmlvcyA9IGJpb3MsCiAJCQkJLm9mZnNldCA9IGRhdGEsCi0JCQkJLm91dHAgPSBvdXRwLAorCQkJCS5vdXRwID0gJm91dHAtPmluZm8sCiAJCQkJLmNydGMgPSBoZWFkLAogCQkJCS5leGVjdXRlID0gMSwKIAkJCX07CkBAIC0xMzEwLDcgKzEzMTMsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIGNvbmY7CisJcmV0dXJuIG91dHA7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzIyLDcgKzEzMjUsMzUgQEAKIHN0YXRpYyB2b2lkCiBudjUwX2Rpc3BfaW50cl91bmsyMF8wKHN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiwgaW50IGhlYWQpCiB7Ci0JZXhlY19zY3JpcHQocHJpdiwgaGVhZCwgMik7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwID0gZXhlY19zY3JpcHQocHJpdiwgaGVhZCwgMik7CisKKwkvKiB0aGUgYmluYXJ5IGRyaXZlciBkb2VzIHRoaXMgb3V0c2lkZSBvZiB0aGUgc3VwZXJ2aXNvciBoYW5kbGluZworCSAqIChhZnRlciB0aGUgdGhpcmQgc3VwZXJ2aXNvciBmcm9tIGEgZGV0YWNoKS4gIHdlIChjdXJyZW50bHk/KQorCSAqIGFsbG93IGJvdGggZGV0YWNoL2F0dGFjaCB0byBoYXBwZW4gaW4gdGhlIHNhbWUgc2V0IG9mCisJICogc3VwZXJ2aXNvciBpbnRlcnJ1cHRzLCBzbyBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIGV4ZWN1dGUgdGhpcworCSAqIChmdWxsIHBvd2VyIGRvd24/KSBzY3JpcHQgYWZ0ZXIgYWxsIHRoZSBkZXRhY2ggcGhhc2VzIG9mIHRoZQorCSAqIHN1cGVydmlzb3IgaGFuZGxpbmcuICBsaWtlIHdpdGggdHJhaW5pbmcgaWYgbmVlZGVkIGZyb20gdGhlCisJICogc2Vjb25kIHN1cGVydmlzb3IsIG52aWRpYSBkb2Vzbid0IGRvIHRoaXMsIHNvIHdobyBrbm93cyBpZiBpdCdzCisJICogZW50aXJlbHkgc2FmZSwgYnV0IGl0IGRvZXMgYXBwZWFyIHRvIHdvcmsuLgorCSAqCisJICogd2l0aG91dCB0aGlzIHNjcmlwdCBiZWluZyBydW4sIG9uIHNvbWUgY29uZmlndXJhdGlvbnMgaSd2ZQorCSAqIHNlZW4sIHN3aXRjaGluZyBmcm9tIERQIHRvIFRNRFMgb24gYSBEUCBjb25uZWN0b3IgbWF5IHJlc3VsdAorCSAqIGluIGEgYmxhbmsgc2NyZWVuIChTT1JfUFdSIG9mZi9vbiBjYW4gcmVzdG9yZSBpdCkKKwkgKi8KKwlpZiAob3V0cCAmJiBvdXRwLT5pbmZvLnR5cGUgPT0gRENCX09VVFBVVF9EUCkgeworCQlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHBkcCA9ICh2b2lkICopb3V0cDsKKwkJc3RydWN0IG52Ymlvc19pbml0IGluaXQgPSB7CisJCQkuc3ViZGV2ID0gbnZfc3ViZGV2KHByaXYpLAorCQkJLmJpb3MgPSBub3V2ZWF1X2Jpb3MocHJpdiksCisJCQkub3V0cCA9ICZvdXRwLT5pbmZvLAorCQkJLmNydGMgPSBoZWFkLAorCQkJLm9mZnNldCA9IG91dHBkcC0+aW5mby5zY3JpcHRbNF0sCisJCQkuZXhlY3V0ZSA9IDEsCisJCX07CisKKwkJbnZiaW9zX2V4ZWMoJmluaXQpOworCQlhdG9taWNfc2V0KCZvdXRwZHAtPmx0LmRvbmUsIDApOworCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTE0NDQsNTYgKzE0NzUsODMgQEAKIHN0YXRpYyB2b2lkCiBudjUwX2Rpc3BfaW50cl91bmsyMF8yKHN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiwgaW50IGhlYWQpCiB7Ci0Jc3RydWN0IGRjYl9vdXRwdXQgb3V0cDsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHA7CiAJdTMyIHBjbGsgPSBudl9yZDMyKHByaXYsIDB4NjEwYWQwICsgKGhlYWQgKiAweDU0MCkpICYgMHgzZmZmZmY7CiAJdTMyIGh2YWwsIGhyZWcgPSAweDYxNDIwMCArIChoZWFkICogMHg4MDApOwogCXUzMiBvdmFsLCBvcmVnOwotCXUzMiBtYXNrOwotCXUzMiBjb25mID0gZXhlY19jbGtjbXAocHJpdiwgaGVhZCwgMHhmZiwgcGNsaywgJm91dHApOwotCWlmIChjb25mICE9IH4wKSB7Ci0JCWlmIChvdXRwLmxvY2F0aW9uID09IDAgJiYgb3V0cC50eXBlID09IERDQl9PVVRQVVRfRFApIHsKLQkJCXUzMiBzb2ZmID0gKGZmcyhvdXRwLm9yKSAtIDEpICogMHgwODsKLQkJCXUzMiBjdHJsID0gbnZfcmQzMihwcml2LCAweDYxMDc5NCArIHNvZmYpOwotCQkJdTMyIGRhdGFyYXRlOworCXUzMiBtYXNrLCBjb25mOwogCi0JCQlzd2l0Y2ggKChjdHJsICYgMHgwMDBmMDAwMCkgPj4gMTYpIHsKLQkJCWNhc2UgNjogZGF0YXJhdGUgPSBwY2xrICogMzAgLyA4OyBicmVhazsKLQkJCWNhc2UgNTogZGF0YXJhdGUgPSBwY2xrICogMjQgLyA4OyBicmVhazsKLQkJCWNhc2UgMjoKLQkJCWRlZmF1bHQ6Ci0JCQkJZGF0YXJhdGUgPSBwY2xrICogMTggLyA4OwotCQkJCWJyZWFrOwotCQkJfQorCW91dHAgPSBleGVjX2Nsa2NtcChwcml2LCBoZWFkLCAweGZmLCBwY2xrLCAmY29uZik7CisJaWYgKCFvdXRwKQorCQlyZXR1cm47CiAKLQkJCW5vdXZlYXVfZHBfdHJhaW4oJnByaXYtPmJhc2UsIHByaXYtPnNvci5kcCwKLQkJCQkJICZvdXRwLCBoZWFkLCBkYXRhcmF0ZSk7Ci0JCX0KKwkvKiB3ZSBhbGxvdyBib3RoIGVuY29kZXIgYXR0YWNoIGFuZCBkZXRhY2ggb3BlcmF0aW9ucyB0byBvY2N1cgorCSAqIHdpdGhpbiBhIHNpbmdsZSBzdXBlcnZpc29yIChpZS4gbW9kZXNldCkgc2VxdWVuY2UuICB0aGUKKwkgKiBlbmNvZGVyIGRldGFjaCBzY3JpcHRzIHF1aXRlIG9mdGVuIHN3aXRjaCBvZmYgcG93ZXIgdG8gdGhlCisJICogbGFuZXMsIHdoaWNoIHJlcXVpcmVzIHRoZSBsaW5rIHRvIGJlIHJlLXRyYWluZWQuCisJICoKKwkgKiB0aGlzIGlzIG5vdCBnZW5lcmFsbHkgYW4gaXNzdWUgYXMgdGhlIHNpbmsgIm11c3QiIChoZWgpCisJICogc2lnbmFsIGFuIGlycSB3aGVuIGl0J3MgbG9zdCBzeW5jIHNvIHRoZSBkcml2ZXIgY2FuCisJICogcmUtdHJhaW4uCisJICoKKwkgKiBob3dldmVyLCBvbiBzb21lIGJvYXJkcywgaWYgb25lIGRvZXMgbm90IGNvbmZpZ3VyZSBhdCBsZWFzdAorCSAqIHRoZSBncHUgc2lkZSBvZiB0aGUgbGluayAqYmVmb3JlKiBhdHRhY2hpbmcsIHRoZW4gdmFyaW91cworCSAqIHRoaW5ncyBjYW4gZ28gaG9ycmlibHkgd3JvbmcgKFBESVNQIGRpc2FwcGVhcmluZyBmcm9tIG1taW8sCisJICogdGhpcmQgc3VwZXJ2aXNvciBuZXZlciBoYXBwZW5zLCBldGMpLgorCSAqCisJICogdGhlIHNvbHV0aW9uIGlzIHNpbXBseSB0byByZXRyYWluIGhlcmUsIGlmIG5lY2Vzc2FyeS4gIGxhc3QKKwkgKiBpIGNoZWNrZWQsIHRoZSBiaW5hcnkgZHJpdmVyIHVzZXJzcGFjZSBkb2VzIG5vdCBhcHBlYXIgdG8KKwkgKiB0cmlnZ2VyIHRoaXMgc2l0dWF0aW9uIChpdCBmb3JjZXMgYW4gVVBEQVRFIGJldHdlZW4gc3RlcHMpLgorCSAqLworCWlmIChvdXRwLT5pbmZvLnR5cGUgPT0gRENCX09VVFBVVF9EUCkgeworCQl1MzIgc29mZiA9IChmZnMob3V0cC0+aW5mby5vcikgLSAxKSAqIDB4MDg7CisJCXUzMiBjdHJsLCBkYXRhcmF0ZTsKIAotCQlleGVjX2Nsa2NtcChwcml2LCBoZWFkLCAwLCBwY2xrLCAmb3V0cCk7Ci0KLQkJaWYgKCFvdXRwLmxvY2F0aW9uICYmIG91dHAudHlwZSA9PSBEQ0JfT1VUUFVUX0FOQUxPRykgewotCQkJb3JlZyA9IDB4NjE0MjgwICsgKGZmcyhvdXRwLm9yKSAtIDEpICogMHg4MDA7Ci0JCQlvdmFsID0gMHgwMDAwMDAwMDsKLQkJCWh2YWwgPSAweDAwMDAwMDAwOwotCQkJbWFzayA9IDB4ZmZmZmZmZmY7Ci0JCX0gZWxzZQotCQlpZiAoIW91dHAubG9jYXRpb24pIHsKLQkJCWlmIChvdXRwLnR5cGUgPT0gRENCX09VVFBVVF9EUCkKLQkJCQludjUwX2Rpc3BfaW50cl91bmsyMF8yX2RwKHByaXYsICZvdXRwLCBwY2xrKTsKLQkJCW9yZWcgPSAweDYxNDMwMCArIChmZnMob3V0cC5vcikgLSAxKSAqIDB4ODAwOwotCQkJb3ZhbCA9IChjb25mICYgMHgwMTAwKSA/IDB4MDAwMDAxMDEgOiAweDAwMDAwMDAwOwotCQkJaHZhbCA9IDB4MDAwMDAwMDA7Ci0JCQltYXNrID0gMHgwMDAwMDcwNzsKKwkJaWYgKG91dHAtPmluZm8ubG9jYXRpb24gPT0gMCkgeworCQkJY3RybCA9IG52X3JkMzIocHJpdiwgMHg2MTA3OTQgKyBzb2ZmKTsKKwkJCXNvZmYgPSAxOwogCQl9IGVsc2UgewotCQkJb3JlZyA9IDB4NjE0MzgwICsgKGZmcyhvdXRwLm9yKSAtIDEpICogMHg4MDA7Ci0JCQlvdmFsID0gMHgwMDAwMDAwMTsKLQkJCWh2YWwgPSAweDAwMDAwMDAxOwotCQkJbWFzayA9IDB4MDAwMDA3MDc7CisJCQljdHJsID0gbnZfcmQzMihwcml2LCAweDYxMGI4MCArIHNvZmYpOworCQkJc29mZiA9IDI7CiAJCX0KIAotCQludl9tYXNrKHByaXYsIGhyZWcsIDB4MDAwMDAwMGYsIGh2YWwpOwotCQludl9tYXNrKHByaXYsIG9yZWcsIG1hc2ssIG92YWwpOworCQlzd2l0Y2ggKChjdHJsICYgMHgwMDBmMDAwMCkgPj4gMTYpIHsKKwkJY2FzZSA2OiBkYXRhcmF0ZSA9IHBjbGsgKiAzMCAvIDg7IGJyZWFrOworCQljYXNlIDU6IGRhdGFyYXRlID0gcGNsayAqIDI0IC8gODsgYnJlYWs7CisJCWNhc2UgMjoKKwkJZGVmYXVsdDoKKwkJCWRhdGFyYXRlID0gcGNsayAqIDE4IC8gODsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG52a21fb3V0cHV0X2RwX3RyYWluKG91dHAsIGRhdGFyYXRlIC8gc29mZiwgdHJ1ZSkpCisJCQlFUlIoImxpbmsgbm90IHRyYWluZWQgYmVmb3JlIGF0dGFjaFxuIik7CiAJfQorCisJZXhlY19jbGtjbXAocHJpdiwgaGVhZCwgMCwgcGNsaywgJmNvbmYpOworCisJaWYgKCFvdXRwLT5pbmZvLmxvY2F0aW9uICYmIG91dHAtPmluZm8udHlwZSA9PSBEQ0JfT1VUUFVUX0FOQUxPRykgeworCQlvcmVnID0gMHg2MTQyODAgKyAoZmZzKG91dHAtPmluZm8ub3IpIC0gMSkgKiAweDgwMDsKKwkJb3ZhbCA9IDB4MDAwMDAwMDA7CisJCWh2YWwgPSAweDAwMDAwMDAwOworCQltYXNrID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UKKwlpZiAoIW91dHAtPmluZm8ubG9jYXRpb24pIHsKKwkJaWYgKG91dHAtPmluZm8udHlwZSA9PSBEQ0JfT1VUUFVUX0RQKQorCQkJbnY1MF9kaXNwX2ludHJfdW5rMjBfMl9kcChwcml2LCAmb3V0cC0+aW5mbywgcGNsayk7CisJCW9yZWcgPSAweDYxNDMwMCArIChmZnMob3V0cC0+aW5mby5vcikgLSAxKSAqIDB4ODAwOworCQlvdmFsID0gKGNvbmYgJiAweDAxMDApID8gMHgwMDAwMDEwMSA6IDB4MDAwMDAwMDA7CisJCWh2YWwgPSAweDAwMDAwMDAwOworCQltYXNrID0gMHgwMDAwMDcwNzsKKwl9IGVsc2UgeworCQlvcmVnID0gMHg2MTQzODAgKyAoZmZzKG91dHAtPmluZm8ub3IpIC0gMSkgKiAweDgwMDsKKwkJb3ZhbCA9IDB4MDAwMDAwMDE7CisJCWh2YWwgPSAweDAwMDAwMDAxOworCQltYXNrID0gMHgwMDAwMDcwNzsKKwl9CisKKwludl9tYXNrKHByaXYsIGhyZWcsIDB4MDAwMDAwMGYsIGh2YWwpOworCW52X21hc2socHJpdiwgb3JlZywgbWFzaywgb3ZhbCk7CiB9CiAKIC8qIElmIHByb2dyYW1taW5nIGEgVE1EUyBvdXRwdXQgb24gYSBTT1IgdGhhdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIGZvcgpAQCAtMTUyMSwzMCArMTU3OSwxNiBAQAogc3RhdGljIHZvaWQKIG52NTBfZGlzcF9pbnRyX3VuazQwXzAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCkKIHsKLQlzdHJ1Y3QgZGNiX291dHB1dCBvdXRwOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cDsKIAl1MzIgcGNsayA9IG52X3JkMzIocHJpdiwgMHg2MTBhZDAgKyAoaGVhZCAqIDB4NTQwKSkgJiAweDNmZmZmZjsKLQlpZiAoZXhlY19jbGtjbXAocHJpdiwgaGVhZCwgMSwgcGNsaywgJm91dHApICE9IH4wKSB7Ci0JCWlmIChvdXRwLmxvY2F0aW9uID09IDAgJiYgb3V0cC50eXBlID09IERDQl9PVVRQVVRfVE1EUykKLQkJCW52NTBfZGlzcF9pbnRyX3VuazQwXzBfdG1kcyhwcml2LCAmb3V0cCk7Ci0JCWVsc2UKLQkJaWYgKG91dHAubG9jYXRpb24gPT0gMSAmJiBvdXRwLnR5cGUgPT0gRENCX09VVFBVVF9EUCkgewotCQkJdTMyIHNvZmYgPSAoZmZzKG91dHAub3IpIC0gMSkgKiAweDA4OwotCQkJdTMyIGN0cmwgPSBudl9yZDMyKHByaXYsIDB4NjEwYjg0ICsgc29mZik7Ci0JCQl1MzIgZGF0YXJhdGU7CisJdTMyIGNvbmY7CiAKLQkJCXN3aXRjaCAoKGN0cmwgJiAweDAwMGYwMDAwKSA+PiAxNikgewotCQkJY2FzZSA2OiBkYXRhcmF0ZSA9IHBjbGsgKiAzMCAvIDg7IGJyZWFrOwotCQkJY2FzZSA1OiBkYXRhcmF0ZSA9IHBjbGsgKiAyNCAvIDg7IGJyZWFrOwotCQkJY2FzZSAyOgotCQkJZGVmYXVsdDoKLQkJCQlkYXRhcmF0ZSA9IHBjbGsgKiAxOCAvIDg7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJb3V0cCA9IGV4ZWNfY2xrY21wKHByaXYsIGhlYWQsIDEsIHBjbGssICZjb25mKTsKKwlpZiAoIW91dHApCisJCXJldHVybjsKIAotCQkJbm91dmVhdV9kcF90cmFpbigmcHJpdi0+YmFzZSwgcHJpdi0+cGlvci5kcCwKLQkJCQkJICZvdXRwLCBoZWFkLCBkYXRhcmF0ZSk7Ci0JCX0KLQl9CisJaWYgKG91dHAtPmluZm8ubG9jYXRpb24gPT0gMCAmJiBvdXRwLT5pbmZvLnR5cGUgPT0gRENCX09VVFBVVF9UTURTKQorCQludjUwX2Rpc3BfaW50cl91bms0MF8wX3RtZHMocHJpdiwgJm91dHAtPmluZm8pOwogfQogCiB2b2lkCkBAIC0xNjEwLDEzICsxNjU0LDEzIEBACiAJfQogCiAJaWYgKGludHIxICYgMHgwMDAwMDAwNCkgewotCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS52YmxhbmssIDApOworCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS52YmxhbmssIDEsIDApOwogCQludl93cjMyKHByaXYsIDB4NjEwMDI0LCAweDAwMDAwMDA0KTsKIAkJaW50cjEgJj0gfjB4MDAwMDAwMDQ7CiAJfQogCiAJaWYgKGludHIxICYgMHgwMDAwMDAwOCkgewotCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS52YmxhbmssIDEpOworCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS52YmxhbmssIDEsIDEpOwogCQludl93cjMyKHByaXYsIDB4NjEwMDI0LCAweDAwMDAwMDA4KTsKIAkJaW50cjEgJj0gfjB4MDAwMDAwMDg7CiAJfQpAQCAtMTY1NiwxMSArMTcwMCwxNiBAQAogCXByaXYtPmRhYy5zZW5zZSA9IG52NTBfZGFjX3NlbnNlOwogCXByaXYtPnNvci5wb3dlciA9IG52NTBfc29yX3Bvd2VyOwogCXByaXYtPnBpb3IucG93ZXIgPSBudjUwX3Bpb3JfcG93ZXI7Ci0JcHJpdi0+cGlvci5kcCA9ICZudjUwX3Bpb3JfZHBfZnVuYzsKIAlyZXR1cm4gMDsKIH0KIAogc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252NTBfZGlzcF9vdXRwX3NjbGFzc1tdID0geworCSZudjUwX3Bpb3JfZHBfaW1wbC5iYXNlLmJhc2UsCisJTlVMTAorfTsKKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKIG52NTBfZGlzcF9vY2xhc3MgPSAmKHN0cnVjdCBudjUwX2Rpc3BfaW1wbCkgewogCS5iYXNlLmJhc2UuaGFuZGxlID0gTlZfRU5HSU5FKERJU1AsIDB4NTApLAogCS5iYXNlLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKQEAgLTE2NjksNiArMTcxOCw3IEBACiAJCS5pbml0ID0gX25vdXZlYXVfZGlzcF9pbml0LAogCQkuZmluaSA9IF9ub3V2ZWF1X2Rpc3BfZmluaSwKIAl9LAorCS5iYXNlLm91dHAgPSAgbnY1MF9kaXNwX291dHBfc2NsYXNzLAogCS5tdGhkLmNvcmUgPSAmbnY1MF9kaXNwX21hc3RfbXRoZF9jaGFuLAogCS5tdGhkLmJhc2UgPSAmbnY1MF9kaXNwX3N5bmNfbXRoZF9jaGFuLAogCS5tdGhkLm92bHkgPSAmbnY1MF9kaXNwX292bHlfbXRoZF9jaGFuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjUwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252NTAuaAppbmRleCA0OGQ1OWRiLi4xYTg4NjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252NTAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252NTAuaApAQCAtMTEsNiArMTEsOCBAQAogCiAjaW5jbHVkZSAiZHBvcnQuaCIKICNpbmNsdWRlICJwcml2LmgiCisjaW5jbHVkZSAib3V0cC5oIgorI2luY2x1ZGUgIm91dHBkcC5oIgogCiBzdHJ1Y3QgbnY1MF9kaXNwX2ltcGwgewogCXN0cnVjdCBub3V2ZWF1X2Rpc3BfaW1wbCBiYXNlOwpAQCAtNDMsMTMgKzQ1LDExIEBACiAJCWludCAoKmhkYV9lbGQpKHN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqLCBpbnQgc29yLCB1OCAqLCB1MzIpOwogCQlpbnQgKCpoZG1pKShzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKiwgaW50IGhlYWQsIGludCBzb3IsIHUzMik7CiAJCXUzMiBsdmRzY29uZjsKLQkJY29uc3Qgc3RydWN0IG5vdXZlYXVfZHBfZnVuYyAqZHA7CiAJfSBzb3I7CiAJc3RydWN0IHsKIAkJaW50IG5yOwogCQlpbnQgKCpwb3dlcikoc3RydWN0IG52NTBfZGlzcF9wcml2ICosIGludCBleHQsIHUzMiBkYXRhKTsKIAkJdTggdHlwZVszXTsKLQkJY29uc3Qgc3RydWN0IG5vdXZlYXVfZHBfZnVuYyAqZHA7CiAJfSBwaW9yOwogfTsKIApAQCAtMTk5LDQgKzE5OSwxNCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBudjUwX2Rpc3BfbXRoZF9jaGFuIG52ZTBfZGlzcF9tYXN0X210aGRfY2hhbjsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbnY1MF9kaXNwX210aGRfY2hhbiBudmUwX2Rpc3Bfb3ZseV9tdGhkX2NoYW47CiAKK2V4dGVybiBzdHJ1Y3QgbnZrbV9vdXRwdXRfZHBfaW1wbCBudjUwX3Bpb3JfZHBfaW1wbDsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NTBfZGlzcF9vdXRwX3NjbGFzc1tdOworCitleHRlcm4gc3RydWN0IG52a21fb3V0cHV0X2RwX2ltcGwgbnY5NF9zb3JfZHBfaW1wbDsKK2ludCBudjk0X3Nvcl9kcF9sbmtfcHdyKHN0cnVjdCBudmttX291dHB1dF9kcCAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnY5NF9kaXNwX291dHBfc2NsYXNzW107CisKK2V4dGVybiBzdHJ1Y3QgbnZrbV9vdXRwdXRfZHBfaW1wbCBudmQwX3Nvcl9kcF9pbXBsOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZkMF9kaXNwX291dHBfc2NsYXNzW107CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjg0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ODQuYwppbmRleCA5OGM1YjE5Li4xY2M2MmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ODQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ODQuYwpAQCAtMjY0LDcgKzI2NCw2IEBACiAJcHJpdi0+c29yLnBvd2VyID0gbnY1MF9zb3JfcG93ZXI7CiAJcHJpdi0+c29yLmhkbWkgPSBudjg0X2hkbWlfY3RybDsKIAlwcml2LT5waW9yLnBvd2VyID0gbnY1MF9waW9yX3Bvd2VyOwotCXByaXYtPnBpb3IuZHAgPSAmbnY1MF9waW9yX2RwX2Z1bmM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3Nyw2ICsyNzYsNyBAQAogCQkuaW5pdCA9IF9ub3V2ZWF1X2Rpc3BfaW5pdCwKIAkJLmZpbmkgPSBfbm91dmVhdV9kaXNwX2ZpbmksCiAJfSwKKwkuYmFzZS5vdXRwID0gIG52NTBfZGlzcF9vdXRwX3NjbGFzcywKIAkubXRoZC5jb3JlID0gJm52ODRfZGlzcF9tYXN0X210aGRfY2hhbiwKIAkubXRoZC5iYXNlID0gJm52ODRfZGlzcF9zeW5jX210aGRfY2hhbiwKIAkubXRoZC5vdmx5ID0gJm52ODRfZGlzcF9vdmx5X210aGRfY2hhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnY5NC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKaW5kZXggNjg0NDA2MS4uNGY3MThhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udjk0LmMKQEAgLTc3LDYgKzc3LDcgQEAKIAl7IFNPUl9NVEhEKE5WNTBfRElTUF9TT1JfUFdSKSAgICAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY4NF9ESVNQX1NPUl9IRE1JX1BXUikgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUKSAsIG52NTBfc29yX210aGQgfSwKKwl7IFNPUl9NVEhEKE5WOTRfRElTUF9TT1JfRFBfUFdSKSAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgREFDX01USEQoTlY1MF9ESVNQX0RBQ19QV1IpICAgICAgICAgLCBudjUwX2RhY19tdGhkIH0sCiAJeyBEQUNfTVRIRChOVjUwX0RJU1BfREFDX0xPQUQpICAgICAgICAsIG52NTBfZGFjX210aGQgfSwKIAl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9QV1IpICAgICAgICwgbnY1MF9waW9yX210aGQgfSwKQEAgLTEyMiwxMyArMTIzLDE4IEBACiAJcHJpdi0+ZGFjLnNlbnNlID0gbnY1MF9kYWNfc2Vuc2U7CiAJcHJpdi0+c29yLnBvd2VyID0gbnY1MF9zb3JfcG93ZXI7CiAJcHJpdi0+c29yLmhkbWkgPSBudjg0X2hkbWlfY3RybDsKLQlwcml2LT5zb3IuZHAgPSAmbnY5NF9zb3JfZHBfZnVuYzsKIAlwcml2LT5waW9yLnBvd2VyID0gbnY1MF9waW9yX3Bvd2VyOwotCXByaXYtPnBpb3IuZHAgPSAmbnY1MF9waW9yX2RwX2Z1bmM7CiAJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjk0X2Rpc3Bfb3V0cF9zY2xhc3NbXSA9IHsKKwkmbnY1MF9waW9yX2RwX2ltcGwuYmFzZS5iYXNlLAorCSZudjk0X3Nvcl9kcF9pbXBsLmJhc2UuYmFzZSwKKwlOVUxMCit9OworCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgogbnY5NF9kaXNwX29jbGFzcyA9ICYoc3RydWN0IG52NTBfZGlzcF9pbXBsKSB7CiAJLmJhc2UuYmFzZS5oYW5kbGUgPSBOVl9FTkdJTkUoRElTUCwgMHg4OCksCiAJLmJhc2UuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewpAQCAtMTM3LDYgKzE0Myw3IEBACiAJCS5pbml0ID0gX25vdXZlYXVfZGlzcF9pbml0LAogCQkuZmluaSA9IF9ub3V2ZWF1X2Rpc3BfZmluaSwKIAl9LAorCS5iYXNlLm91dHAgPSAgbnY5NF9kaXNwX291dHBfc2NsYXNzLAogCS5tdGhkLmNvcmUgPSAmbnY5NF9kaXNwX21hc3RfbXRoZF9jaGFuLAogCS5tdGhkLmJhc2UgPSAmbnY4NF9kaXNwX3N5bmNfbXRoZF9jaGFuLAogCS5tdGhkLm92bHkgPSAmbnY4NF9kaXNwX292bHlfbXRoZF9jaGFuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252YTAuYwppbmRleCA4OGM5NjI0Li42MjM3YTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252YTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252YTAuYwpAQCAtMTI2LDcgKzEyNiw2IEBACiAJcHJpdi0+c29yLnBvd2VyID0gbnY1MF9zb3JfcG93ZXI7CiAJcHJpdi0+c29yLmhkbWkgPSBudjg0X2hkbWlfY3RybDsKIAlwcml2LT5waW9yLnBvd2VyID0gbnY1MF9waW9yX3Bvd2VyOwotCXByaXYtPnBpb3IuZHAgPSAmbnY1MF9waW9yX2RwX2Z1bmM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOSw2ICsxMzgsNyBAQAogCQkuaW5pdCA9IF9ub3V2ZWF1X2Rpc3BfaW5pdCwKIAkJLmZpbmkgPSBfbm91dmVhdV9kaXNwX2ZpbmksCiAJfSwKKwkuYmFzZS5vdXRwID0gIG52NTBfZGlzcF9vdXRwX3NjbGFzcywKIAkubXRoZC5jb3JlID0gJm52ODRfZGlzcF9tYXN0X210aGRfY2hhbiwKIAkubXRoZC5iYXNlID0gJm52ODRfZGlzcF9zeW5jX210aGRfY2hhbiwKIAkubXRoZC5vdmx5ID0gJm52YTBfZGlzcF9vdmx5X210aGRfY2hhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvbnZhMy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKaW5kZXggNDZjYjJjZS4uMDE5MTI0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmEzLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAl7IFNPUl9NVEhEKE5WQTNfRElTUF9TT1JfSERBX0VMRCkgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY4NF9ESVNQX1NPUl9IRE1JX1BXUikgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUKSAsIG52NTBfc29yX210aGQgfSwKKwl7IFNPUl9NVEhEKE5WOTRfRElTUF9TT1JfRFBfUFdSKSAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgREFDX01USEQoTlY1MF9ESVNQX0RBQ19QV1IpICAgICAgICAgLCBudjUwX2RhY19tdGhkIH0sCiAJeyBEQUNfTVRIRChOVjUwX0RJU1BfREFDX0xPQUQpICAgICAgICAsIG52NTBfZGFjX210aGQgfSwKIAl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9QV1IpICAgICAgICwgbnY1MF9waW9yX210aGQgfSwKQEAgLTk2LDkgKzk3LDcgQEAKIAlwcml2LT5zb3IucG93ZXIgPSBudjUwX3Nvcl9wb3dlcjsKIAlwcml2LT5zb3IuaGRhX2VsZCA9IG52YTNfaGRhX2VsZDsKIAlwcml2LT5zb3IuaGRtaSA9IG52YTNfaGRtaV9jdHJsOwotCXByaXYtPnNvci5kcCA9ICZudjk0X3Nvcl9kcF9mdW5jOwogCXByaXYtPnBpb3IucG93ZXIgPSBudjUwX3Bpb3JfcG93ZXI7Ci0JcHJpdi0+cGlvci5kcCA9ICZudjUwX3Bpb3JfZHBfZnVuYzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExLDYgKzExMCw3IEBACiAJCS5pbml0ID0gX25vdXZlYXVfZGlzcF9pbml0LAogCQkuZmluaSA9IF9ub3V2ZWF1X2Rpc3BfZmluaSwKIAl9LAorCS5iYXNlLm91dHAgPSAgbnY5NF9kaXNwX291dHBfc2NsYXNzLAogCS5tdGhkLmNvcmUgPSAmbnY5NF9kaXNwX21hc3RfbXRoZF9jaGFuLAogCS5tdGhkLmJhc2UgPSAmbnY4NF9kaXNwX3N5bmNfbXRoZF9jaGFuLAogCS5tdGhkLm92bHkgPSAmbnY4NF9kaXNwX292bHlfbXRoZF9jaGFuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmQwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYwppbmRleCA4NzZkZTlhLi40OGFhMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZDAuYwpAQCAtNzQ4LDEzICs3NDgsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLW52ZDBfZGlzcF9iYXNlX3ZibGFua19lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgaGVhZCkKK252ZDBfZGlzcF9iYXNlX3ZibGFua19lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgdHlwZSwgaW50IGhlYWQpCiB7CiAJbnZfbWFzayhldmVudC0+cHJpdiwgMHg2MTAwYzAgKyAoaGVhZCAqIDB4ODAwKSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1udmQwX2Rpc3BfYmFzZV92YmxhbmtfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBoZWFkKQorbnZkMF9kaXNwX2Jhc2VfdmJsYW5rX2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgdHlwZSwgaW50IGhlYWQpCiB7CiAJbnZfbWFzayhldmVudC0+cHJpdiwgMHg2MTAwYzAgKyAoaGVhZCAqIDB4ODAwKSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CiB9CkBAIC04ODcsNiArODg3LDcgQEAKIAl7IFNPUl9NVEhEKE5WQTNfRElTUF9TT1JfSERBX0VMRCkgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgU09SX01USEQoTlY4NF9ESVNQX1NPUl9IRE1JX1BXUikgICAgLCBudjUwX3Nvcl9tdGhkIH0sCiAJeyBTT1JfTVRIRChOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUKSAsIG52NTBfc29yX210aGQgfSwKKwl7IFNPUl9NVEhEKE5WOTRfRElTUF9TT1JfRFBfUFdSKSAgICAgICwgbnY1MF9zb3JfbXRoZCB9LAogCXsgREFDX01USEQoTlY1MF9ESVNQX0RBQ19QV1IpICAgICAgICAgLCBudjUwX2RhY19tdGhkIH0sCiAJeyBEQUNfTVRIRChOVjUwX0RJU1BfREFDX0xPQUQpICAgICAgICAsIG52NTBfZGFjX210aGQgfSwKIAl7IFBJT1JfTVRIRChOVjUwX0RJU1BfUElPUl9QV1IpICAgICAgICwgbnY1MF9waW9yX210aGQgfSwKQEAgLTkxNSwxOSArOTE2LDIwIEBACiAgKiBEaXNwbGF5IGVuZ2luZSBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHUxNgotZXhlY19sb29rdXAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IG91dHAsIHUzMiBjdHJsLAotCSAgICBzdHJ1Y3QgZGNiX291dHB1dCAqZGNiLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuLAorc3RhdGljIHN0cnVjdCBudmttX291dHB1dCAqCitleGVjX2xvb2t1cChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkLCBpbnQgb3IsIHUzMiBjdHJsLAorCSAgICB1MzIgKmRhdGEsIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4sCiAJICAgIHN0cnVjdCBudmJpb3Nfb3V0cCAqaW5mbykKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHByaXYpOwotCXUxNiBtYXNrLCB0eXBlLCBkYXRhOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cDsKKwl1MTYgbWFzaywgdHlwZTsKIAotCWlmIChvdXRwIDwgNCkgeworCWlmIChvciA8IDQpIHsKIAkJdHlwZSA9IERDQl9PVVRQVVRfQU5BTE9HOwogCQltYXNrID0gMDsKIAl9IGVsc2UgewotCQlvdXRwIC09IDQ7CisJCW9yIC09IDQ7CiAJCXN3aXRjaCAoY3RybCAmIDB4MDAwMDBmMDApIHsKIAkJY2FzZSAweDAwMDAwMDAwOiB0eXBlID0gRENCX09VVFBVVF9MVkRTOyBtYXNrID0gMTsgYnJlYWs7CiAJCWNhc2UgMHgwMDAwMDEwMDogdHlwZSA9IERDQl9PVVRQVVRfVE1EUzsgbWFzayA9IDE7IGJyZWFrOwpAQCAtOTM5LDEwMSArOTQxLDEwNiBAQAogCQkJbnZfZXJyb3IocHJpdiwgInVua25vd24gU09SIG1jIDB4JTA4eFxuIiwgY3RybCk7CiAJCQlyZXR1cm4gMHgwMDAwOwogCQl9Ci0JCWRjYi0+c29yY29uZi5saW5rID0gbWFzazsKIAl9CiAKIAltYXNrICA9IDB4MDBjMCAmIChtYXNrIDw8IDYpOwotCW1hc2sgfD0gMHgwMDAxIDw8IG91dHA7CisJbWFzayB8PSAweDAwMDEgPDwgb3I7CiAJbWFzayB8PSAweDAxMDAgPDwgaGVhZDsKIAotCWRhdGEgPSBkY2Jfb3V0cF9tYXRjaChiaW9zLCB0eXBlLCBtYXNrLCB2ZXIsIGhkciwgZGNiKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAweDAwMDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvdXRwLCAmcHJpdi0+YmFzZS5vdXRwLCBoZWFkKSB7CisJCWlmICgob3V0cC0+aW5mby5oYXNodCAmIDB4ZmYpID09IHR5cGUgJiYKKwkJICAgIChvdXRwLT5pbmZvLmhhc2htICYgbWFzaykgPT0gbWFzaykgeworCQkJKmRhdGEgPSBudmJpb3Nfb3V0cF9tYXRjaChiaW9zLCBvdXRwLT5pbmZvLmhhc2h0LAorCQkJCQkJCW91dHAtPmluZm8uaGFzaG0sCisJCQkJCQkgIHZlciwgaGRyLCBjbnQsIGxlbiwgaW5mbyk7CisJCQlpZiAoISpkYXRhKQorCQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIG91dHA7CisJCX0KKwl9CiAKLQlyZXR1cm4gbnZiaW9zX291dHBfbWF0Y2goYmlvcywgdHlwZSwgbWFzaywgdmVyLCBoZHIsIGNudCwgbGVuLCBpbmZvKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wKK3N0YXRpYyBzdHJ1Y3QgbnZrbV9vdXRwdXQgKgogZXhlY19zY3JpcHQoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IGlkKQogewogCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MocHJpdik7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOwogCXN0cnVjdCBudmJpb3Nfb3V0cCBpbmZvOwotCXN0cnVjdCBkY2Jfb3V0cHV0IGRjYjsKIAl1OCAgdmVyLCBoZHIsIGNudCwgbGVuOwotCXUzMiBjdHJsID0gMHgwMDAwMDAwMDsKLQl1MTYgZGF0YTsKLQlpbnQgb3V0cDsKKwl1MzIgZGF0YSwgY3RybCA9IDA7CisJaW50IG9yOwogCi0JZm9yIChvdXRwID0gMDsgIShjdHJsICYgKDEgPDwgaGVhZCkpICYmIG91dHAgPCA4OyBvdXRwKyspIHsKLQkJY3RybCA9IG52X3JkMzIocHJpdiwgMHg2NDAxODAgKyAob3V0cCAqIDB4MjApKTsKKwlmb3IgKG9yID0gMDsgIShjdHJsICYgKDEgPDwgaGVhZCkpICYmIG9yIDwgODsgb3IrKykgeworCQljdHJsID0gbnZfcmQzMihwcml2LCAweDY0MDE4MCArIChvciAqIDB4MjApKTsKIAkJaWYgKGN0cmwgJiAoMSA8PCBoZWFkKSkKIAkJCWJyZWFrOwogCX0KIAotCWlmIChvdXRwID09IDgpCi0JCXJldHVybiBmYWxzZTsKKwlpZiAob3IgPT0gOCkKKwkJcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gZXhlY19sb29rdXAocHJpdiwgaGVhZCwgb3V0cCwgY3RybCwgJmRjYiwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8pOwotCWlmIChkYXRhKSB7CisJb3V0cCA9IGV4ZWNfbG9va3VwKHByaXYsIGhlYWQsIG9yLCBjdHJsLCAmZGF0YSwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8pOworCWlmIChvdXRwKSB7CiAJCXN0cnVjdCBudmJpb3NfaW5pdCBpbml0ID0gewogCQkJLnN1YmRldiA9IG52X3N1YmRldihwcml2KSwKIAkJCS5iaW9zID0gYmlvcywKIAkJCS5vZmZzZXQgPSBpbmZvLnNjcmlwdFtpZF0sCi0JCQkub3V0cCA9ICZkY2IsCisJCQkub3V0cCA9ICZvdXRwLT5pbmZvLAogCQkJLmNydGMgPSBoZWFkLAogCQkJLmV4ZWN1dGUgPSAxLAogCQl9OwogCi0JCXJldHVybiBudmJpb3NfZXhlYygmaW5pdCkgPT0gMDsKKwkJbnZiaW9zX2V4ZWMoJmluaXQpOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gb3V0cDsKIH0KIAotc3RhdGljIHUzMgotZXhlY19jbGtjbXAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IGlkLAotCSAgICB1MzIgcGNsaywgc3RydWN0IGRjYl9vdXRwdXQgKmRjYikKK3N0YXRpYyBzdHJ1Y3QgbnZrbV9vdXRwdXQgKgorZXhlY19jbGtjbXAoc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2LCBpbnQgaGVhZCwgaW50IGlkLCB1MzIgcGNsaywgdTMyICpjb25mKQogewogCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MocHJpdik7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOwogCXN0cnVjdCBudmJpb3Nfb3V0cCBpbmZvMTsKIAlzdHJ1Y3QgbnZiaW9zX29jZmcgaW5mbzI7CiAJdTggIHZlciwgaGRyLCBjbnQsIGxlbjsKLQl1MzIgY3RybCA9IDB4MDAwMDAwMDA7Ci0JdTMyIGRhdGEsIGNvbmYgPSB+MDsKLQlpbnQgb3V0cDsKKwl1MzIgZGF0YSwgY3RybCA9IDA7CisJaW50IG9yOwogCi0JZm9yIChvdXRwID0gMDsgIShjdHJsICYgKDEgPDwgaGVhZCkpICYmIG91dHAgPCA4OyBvdXRwKyspIHsKLQkJY3RybCA9IG52X3JkMzIocHJpdiwgMHg2NjAxODAgKyAob3V0cCAqIDB4MjApKTsKKwlmb3IgKG9yID0gMDsgIShjdHJsICYgKDEgPDwgaGVhZCkpICYmIG9yIDwgODsgb3IrKykgeworCQljdHJsID0gbnZfcmQzMihwcml2LCAweDY2MDE4MCArIChvciAqIDB4MjApKTsKIAkJaWYgKGN0cmwgJiAoMSA8PCBoZWFkKSkKIAkJCWJyZWFrOwogCX0KIAotCWlmIChvdXRwID09IDgpCi0JCXJldHVybiBjb25mOworCWlmIChvciA9PSA4KQorCQlyZXR1cm4gTlVMTDsKIAotCWRhdGEgPSBleGVjX2xvb2t1cChwcml2LCBoZWFkLCBvdXRwLCBjdHJsLCBkY2IsICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZpbmZvMSk7Ci0JaWYgKGRhdGEgPT0gMHgwMDAwKQotCQlyZXR1cm4gY29uZjsKKwlvdXRwID0gZXhlY19sb29rdXAocHJpdiwgaGVhZCwgb3IsIGN0cmwsICZkYXRhLCAmdmVyLCAmaGRyLCAmY250LCAmbGVuLCAmaW5mbzEpOworCWlmICghb3V0cCkKKwkJcmV0dXJuIE5VTEw7CiAKLQlzd2l0Y2ggKGRjYi0+dHlwZSkgeworCXN3aXRjaCAob3V0cC0+aW5mby50eXBlKSB7CiAJY2FzZSBEQ0JfT1VUUFVUX1RNRFM6Ci0JCWNvbmYgPSAoY3RybCAmIDB4MDAwMDBmMDApID4+IDg7CisJCSpjb25mID0gKGN0cmwgJiAweDAwMDAwZjAwKSA+PiA4OwogCQlpZiAocGNsayA+PSAxNjUwMDApCi0JCQljb25mIHw9IDB4MDEwMDsKKwkJCSpjb25mIHw9IDB4MDEwMDsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfT1VUUFVUX0xWRFM6Ci0JCWNvbmYgPSBwcml2LT5zb3IubHZkc2NvbmY7CisJCSpjb25mID0gcHJpdi0+c29yLmx2ZHNjb25mOwogCQlicmVhazsKIAljYXNlIERDQl9PVVRQVVRfRFA6Ci0JCWNvbmYgPSAoY3RybCAmIDB4MDAwMDBmMDApID4+IDg7CisJCSpjb25mID0gKGN0cmwgJiAweDAwMDAwZjAwKSA+PiA4OwogCQlicmVhazsKIAljYXNlIERDQl9PVVRQVVRfQU5BTE9HOgogCWRlZmF1bHQ6Ci0JCWNvbmYgPSAweDAwZmY7CisJCSpjb25mID0gMHgwMGZmOwogCQlicmVhazsKIAl9CiAKLQlkYXRhID0gbnZiaW9zX29jZmdfbWF0Y2goYmlvcywgZGF0YSwgY29uZiwgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8yKTsKKwlkYXRhID0gbnZiaW9zX29jZmdfbWF0Y2goYmlvcywgZGF0YSwgKmNvbmYsICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZpbmZvMik7CiAJaWYgKGRhdGEgJiYgaWQgPCAweGZmKSB7CiAJCWRhdGEgPSBudmJpb3Nfb2Nsa19tYXRjaChiaW9zLCBpbmZvMi5jbGtjbXBbaWRdLCBwY2xrKTsKIAkJaWYgKGRhdGEpIHsKQEAgLTEwNDEsNyArMTA0OCw3IEBACiAJCQkJLnN1YmRldiA9IG52X3N1YmRldihwcml2KSwKIAkJCQkuYmlvcyA9IGJpb3MsCiAJCQkJLm9mZnNldCA9IGRhdGEsCi0JCQkJLm91dHAgPSBkY2IsCisJCQkJLm91dHAgPSAmb3V0cC0+aW5mbywKIAkJCQkuY3J0YyA9IGhlYWQsCiAJCQkJLmV4ZWN1dGUgPSAxLAogCQkJfTsKQEAgLTEwNTAsNyArMTA1Nyw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gY29uZjsKKwlyZXR1cm4gb3V0cDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwNjIsNyArMTA2OSwyMyBAQAogc3RhdGljIHZvaWQKIG52ZDBfZGlzcF9pbnRyX3VuazJfMChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkKQogewotCWV4ZWNfc2NyaXB0KHByaXYsIGhlYWQsIDIpOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cCA9IGV4ZWNfc2NyaXB0KHByaXYsIGhlYWQsIDIpOworCisJLyogc2VlIG5vdGUgaW4gbnY1MF9kaXNwX2ludHJfdW5rMjBfMCgpICovCisJaWYgKG91dHAgJiYgb3V0cC0+aW5mby50eXBlID09IERDQl9PVVRQVVRfRFApIHsKKwkJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwZHAgPSAodm9pZCAqKW91dHA7CisJCXN0cnVjdCBudmJpb3NfaW5pdCBpbml0ID0geworCQkJLnN1YmRldiA9IG52X3N1YmRldihwcml2KSwKKwkJCS5iaW9zID0gbm91dmVhdV9iaW9zKHByaXYpLAorCQkJLm91dHAgPSAmb3V0cC0+aW5mbywKKwkJCS5jcnRjID0gaGVhZCwKKwkJCS5vZmZzZXQgPSBvdXRwZHAtPmluZm8uc2NyaXB0WzRdLAorCQkJLmV4ZWN1dGUgPSAxLAorCQl9OworCisJCW52Ymlvc19leGVjKCZpbml0KTsKKwkJYXRvbWljX3NldCgmb3V0cGRwLT5sdC5kb25lLCAwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTI0LDQ5ICsxMTQ3LDUyIEBACiBzdGF0aWMgdm9pZAogbnZkMF9kaXNwX2ludHJfdW5rMl8yKHN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiwgaW50IGhlYWQpCiB7Ci0Jc3RydWN0IGRjYl9vdXRwdXQgb3V0cDsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHA7CiAJdTMyIHBjbGsgPSBudl9yZDMyKHByaXYsIDB4NjYwNDUwICsgKGhlYWQgKiAweDMwMCkpIC8gMTAwMDsKLQl1MzIgY29uZiA9IGV4ZWNfY2xrY21wKHByaXYsIGhlYWQsIDB4ZmYsIHBjbGssICZvdXRwKTsKLQlpZiAoY29uZiAhPSB+MCkgewotCQl1MzIgYWRkciwgZGF0YTsKKwl1MzIgY29uZiwgYWRkciwgZGF0YTsKIAotCQlpZiAob3V0cC50eXBlID09IERDQl9PVVRQVVRfRFApIHsKLQkJCXUzMiBzeW5jID0gbnZfcmQzMihwcml2LCAweDY2MDQwNCArIChoZWFkICogMHgzMDApKTsKLQkJCXN3aXRjaCAoKHN5bmMgJiAweDAwMDAwM2MwKSA+PiA2KSB7Ci0JCQljYXNlIDY6IHBjbGsgPSBwY2xrICogMzAgLyA4OyBicmVhazsKLQkJCWNhc2UgNTogcGNsayA9IHBjbGsgKiAyNCAvIDg7IGJyZWFrOwotCQkJY2FzZSAyOgotCQkJZGVmYXVsdDoKLQkJCQlwY2xrID0gcGNsayAqIDE4IC8gODsKLQkJCQlicmVhazsKLQkJCX0KKwlvdXRwID0gZXhlY19jbGtjbXAocHJpdiwgaGVhZCwgMHhmZiwgcGNsaywgJmNvbmYpOworCWlmICghb3V0cCkKKwkJcmV0dXJuOwogCi0JCQlub3V2ZWF1X2RwX3RyYWluKCZwcml2LT5iYXNlLCBwcml2LT5zb3IuZHAsCi0JCQkJCSAmb3V0cCwgaGVhZCwgcGNsayk7CisJLyogc2VlIG5vdGUgaW4gbnY1MF9kaXNwX2ludHJfdW5rMjBfMigpICovCisJaWYgKG91dHAtPmluZm8udHlwZSA9PSBEQ0JfT1VUUFVUX0RQKSB7CisJCXUzMiBzeW5jID0gbnZfcmQzMihwcml2LCAweDY2MDQwNCArIChoZWFkICogMHgzMDApKTsKKwkJc3dpdGNoICgoc3luYyAmIDB4MDAwMDAzYzApID4+IDYpIHsKKwkJY2FzZSA2OiBwY2xrID0gcGNsayAqIDMwIC8gODsgYnJlYWs7CisJCWNhc2UgNTogcGNsayA9IHBjbGsgKiAyNCAvIDg7IGJyZWFrOworCQljYXNlIDI6CisJCWRlZmF1bHQ6CisJCQlwY2xrID0gcGNsayAqIDE4IC8gODsKKwkJCWJyZWFrOwogCQl9CiAKLQkJZXhlY19jbGtjbXAocHJpdiwgaGVhZCwgMCwgcGNsaywgJm91dHApOwotCi0JCWlmIChvdXRwLnR5cGUgPT0gRENCX09VVFBVVF9BTkFMT0cpIHsKLQkJCWFkZHIgPSAweDYxMjI4MCArIChmZnMob3V0cC5vcikgLSAxKSAqIDB4ODAwOwotCQkJZGF0YSA9IDB4MDAwMDAwMDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob3V0cC50eXBlID09IERDQl9PVVRQVVRfRFApCi0JCQkJbnZkMF9kaXNwX2ludHJfdW5rMl8yX3R1KHByaXYsIGhlYWQsICZvdXRwKTsKLQkJCWFkZHIgPSAweDYxMjMwMCArIChmZnMob3V0cC5vcikgLSAxKSAqIDB4ODAwOwotCQkJZGF0YSA9IChjb25mICYgMHgwMTAwKSA/IDB4MDAwMDAxMDEgOiAweDAwMDAwMDAwOwotCQl9Ci0KLQkJbnZfbWFzayhwcml2LCBhZGRyLCAweDAwMDAwNzA3LCBkYXRhKTsKKwkJaWYgKG52a21fb3V0cHV0X2RwX3RyYWluKG91dHAsIHBjbGssIHRydWUpKQorCQkJRVJSKCJsaW5rIG5vdCB0cmFpbmVkIGJlZm9yZSBhdHRhY2hcbiIpOwogCX0KKworCWV4ZWNfY2xrY21wKHByaXYsIGhlYWQsIDAsIHBjbGssICZjb25mKTsKKworCWlmIChvdXRwLT5pbmZvLnR5cGUgPT0gRENCX09VVFBVVF9BTkFMT0cpIHsKKwkJYWRkciA9IDB4NjEyMjgwICsgKGZmcyhvdXRwLT5pbmZvLm9yKSAtIDEpICogMHg4MDA7CisJCWRhdGEgPSAweDAwMDAwMDAwOworCX0gZWxzZSB7CisJCWlmIChvdXRwLT5pbmZvLnR5cGUgPT0gRENCX09VVFBVVF9EUCkKKwkJCW52ZDBfZGlzcF9pbnRyX3VuazJfMl90dShwcml2LCBoZWFkLCAmb3V0cC0+aW5mbyk7CisJCWFkZHIgPSAweDYxMjMwMCArIChmZnMob3V0cC0+aW5mby5vcikgLSAxKSAqIDB4ODAwOworCQlkYXRhID0gKGNvbmYgJiAweDAxMDApID8gMHgwMDAwMDEwMSA6IDB4MDAwMDAwMDA7CisJfQorCisJbnZfbWFzayhwcml2LCBhZGRyLCAweDAwMDAwNzA3LCBkYXRhKTsKIH0KIAogc3RhdGljIHZvaWQKIG52ZDBfZGlzcF9pbnRyX3VuazRfMChzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBoZWFkKQogewotCXN0cnVjdCBkY2Jfb3V0cHV0IG91dHA7CiAJdTMyIHBjbGsgPSBudl9yZDMyKHByaXYsIDB4NjYwNDUwICsgKGhlYWQgKiAweDMwMCkpIC8gMTAwMDsKLQlleGVjX2Nsa2NtcChwcml2LCBoZWFkLCAxLCBwY2xrLCAmb3V0cCk7CisJdTMyIGNvbmY7CisKKwlleGVjX2Nsa2NtcChwcml2LCBoZWFkLCAxLCBwY2xrLCAmY29uZik7CiB9CiAKIHZvaWQKQEAgLTEyNDAsNyArMTI2Niw3IEBACiAJCSBjaGlkLCAobXRoZCAmIDB4MDAwMGZmYyksIGRhdGEsIG10aGQsIHVua24pOwogCiAJaWYgKGNoaWQgPT0gMCkgewotCQlzd2l0Y2ggKG10aGQpIHsKKwkJc3dpdGNoIChtdGhkICYgMHhmZmMpIHsKIAkJY2FzZSAweDAwODA6CiAJCQludjUwX2Rpc3BfbXRoZF9jaGFuKHByaXYsIE5WX0RCR19FUlJPUiwgY2hpZCAtIDAsCiAJCQkJCSAgICBpbXBsLT5tdGhkLmNvcmUpOwpAQCAtMTI1MCw3ICsxMjc2LDcgQEAKIAkJfQogCX0gZWxzZQogCWlmIChjaGlkIDw9IDQpIHsKLQkJc3dpdGNoIChtdGhkKSB7CisJCXN3aXRjaCAobXRoZCAmIDB4ZmZjKSB7CiAJCWNhc2UgMHgwMDgwOgogCQkJbnY1MF9kaXNwX210aGRfY2hhbihwcml2LCBOVl9EQkdfRVJST1IsIGNoaWQgLSAxLAogCQkJCQkgICAgaW1wbC0+bXRoZC5iYXNlKTsKQEAgLTEyNjAsNyArMTI4Niw3IEBACiAJCX0KIAl9IGVsc2UKIAlpZiAoY2hpZCA8PSA4KSB7Ci0JCXN3aXRjaCAobXRoZCkgeworCQlzd2l0Y2ggKG10aGQgJiAweGZmYykgewogCQljYXNlIDB4MDA4MDoKIAkJCW52NTBfZGlzcF9tdGhkX2NoYW4ocHJpdiwgTlZfREJHX0VSUk9SLCBjaGlkIC0gNSwKIAkJCQkJICAgIGltcGwtPm10aGQub3ZseSk7CkBAIC0xMzE3LDcgKzEzNDMsNyBAQAogCQlpZiAobWFzayAmIGludHIpIHsKIAkJCXUzMiBzdGF0ID0gbnZfcmQzMihwcml2LCAweDYxMDBiYyArIChpICogMHg4MDApKTsKIAkJCWlmIChzdGF0ICYgMHgwMDAwMDAwMSkKLQkJCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS52YmxhbmssIGkpOworCQkJCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5iYXNlLnZibGFuaywgMSwgaSk7CiAJCQludl9tYXNrKHByaXYsIDB4NjEwMGJjICsgKGkgKiAweDgwMCksIDAsIDApOwogCQkJbnZfcmQzMihwcml2LCAweDYxMDBjMCArIChpICogMHg4MDApKTsKIAkJfQpAQCAtMTM1MiwxMSArMTM3OCwxNiBAQAogCXByaXYtPnNvci5wb3dlciA9IG52NTBfc29yX3Bvd2VyOwogCXByaXYtPnNvci5oZGFfZWxkID0gbnZkMF9oZGFfZWxkOwogCXByaXYtPnNvci5oZG1pID0gbnZkMF9oZG1pX2N0cmw7Ci0JcHJpdi0+c29yLmRwID0gJm52ZDBfc29yX2RwX2Z1bmM7CiAJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmQwX2Rpc3Bfb3V0cF9zY2xhc3NbXSA9IHsKKwkmbnZkMF9zb3JfZHBfaW1wbC5iYXNlLmJhc2UsCisJTlVMTAorfTsKKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKIG52ZDBfZGlzcF9vY2xhc3MgPSAmKHN0cnVjdCBudjUwX2Rpc3BfaW1wbCkgewogCS5iYXNlLmJhc2UuaGFuZGxlID0gTlZfRU5HSU5FKERJU1AsIDB4OTApLAogCS5iYXNlLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKQEAgLTEzNjUsNiArMTM5Niw3IEBACiAJCS5pbml0ID0gX25vdXZlYXVfZGlzcF9pbml0LAogCQkuZmluaSA9IF9ub3V2ZWF1X2Rpc3BfZmluaSwKIAl9LAorCS5iYXNlLm91dHAgPSAgbnZkMF9kaXNwX291dHBfc2NsYXNzLAogCS5tdGhkLmNvcmUgPSAmbnZkMF9kaXNwX21hc3RfbXRoZF9jaGFuLAogCS5tdGhkLmJhc2UgPSAmbnZkMF9kaXNwX3N5bmNfbXRoZF9jaGFuLAogCS5tdGhkLm92bHkgPSAmbnZkMF9kaXNwX292bHlfbXRoZF9jaGFuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYwppbmRleCA0NGUwYjhmLi4xMTMyOGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZTAuYwpAQCAtMjQ2LDcgKzI0Niw2IEBACiAJcHJpdi0+c29yLnBvd2VyID0gbnY1MF9zb3JfcG93ZXI7CiAJcHJpdi0+c29yLmhkYV9lbGQgPSBudmQwX2hkYV9lbGQ7CiAJcHJpdi0+c29yLmhkbWkgPSBudmQwX2hkbWlfY3RybDsKLQlwcml2LT5zb3IuZHAgPSAmbnZkMF9zb3JfZHBfZnVuYzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU5LDYgKzI1OCw3IEBACiAJCS5pbml0ID0gX25vdXZlYXVfZGlzcF9pbml0LAogCQkuZmluaSA9IF9ub3V2ZWF1X2Rpc3BfZmluaSwKIAl9LAorCS5iYXNlLm91dHAgPSAgbnZkMF9kaXNwX291dHBfc2NsYXNzLAogCS5tdGhkLmNvcmUgPSAmbnZlMF9kaXNwX21hc3RfbXRoZF9jaGFuLAogCS5tdGhkLmJhc2UgPSAmbnZkMF9kaXNwX3N5bmNfbXRoZF9jaGFuLAogCS5tdGhkLm92bHkgPSAmbnZlMF9kaXNwX292bHlfbXRoZF9jaGFuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9udmYwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZjAuYwppbmRleCA0ODI1ODVkLi4xMDQzODgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZjAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL252ZjAuYwpAQCAtODEsNyArODEsNiBAQAogCXByaXYtPnNvci5wb3dlciA9IG52NTBfc29yX3Bvd2VyOwogCXByaXYtPnNvci5oZGFfZWxkID0gbnZkMF9oZGFfZWxkOwogCXByaXYtPnNvci5oZG1pID0gbnZkMF9oZG1pX2N0cmw7Ci0JcHJpdi0+c29yLmRwID0gJm52ZDBfc29yX2RwX2Z1bmM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk0LDYgKzkzLDcgQEAKIAkJLmluaXQgPSBfbm91dmVhdV9kaXNwX2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfZGlzcF9maW5pLAogCX0sCisJLmJhc2Uub3V0cCA9ICBudmQwX2Rpc3Bfb3V0cF9zY2xhc3MsCiAJLm10aGQuY29yZSA9ICZudmUwX2Rpc3BfbWFzdF9tdGhkX2NoYW4sCiAJLm10aGQuYmFzZSA9ICZudmQwX2Rpc3Bfc3luY19tdGhkX2NoYW4sCiAJLm10aGQub3ZseSA9ICZudmUwX2Rpc3Bfb3ZseV9tdGhkX2NoYW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL291dHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avb3V0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWJhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL291dHAuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSA8c3ViZGV2L2kyYy5oPgorI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CisjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvY29ubi5oPgorCisjaW5jbHVkZSAib3V0cC5oIgorCitpbnQKK19udmttX291dHB1dF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCit7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwID0gKHZvaWQgKilvYmplY3Q7CisJbnZfb2Z1bmNzKG91dHAtPmNvbm4pLT5maW5pKG52X29iamVjdChvdXRwLT5jb25uKSwgc3VzcGVuZCk7CisJcmV0dXJuIG5vdXZlYXVfb2JqZWN0X2ZpbmkoJm91dHAtPmJhc2UsIHN1c3BlbmQpOworfQorCitpbnQKK19udmttX291dHB1dF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cCA9ICh2b2lkICopb2JqZWN0OworCWludCByZXQgPSBub3V2ZWF1X29iamVjdF9pbml0KCZvdXRwLT5iYXNlKTsKKwlpZiAocmV0ID09IDApCisJCW52X29mdW5jcyhvdXRwLT5jb25uKS0+aW5pdChudl9vYmplY3Qob3V0cC0+Y29ubikpOworCXJldHVybiAwOworfQorCit2b2lkCitfbnZrbV9vdXRwdXRfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHAgPSAodm9pZCAqKW9iamVjdDsKKwlsaXN0X2RlbCgmb3V0cC0+aGVhZCk7CisJbm91dmVhdV9vYmplY3RfcmVmKE5VTEwsICh2b2lkICopJm91dHAtPmNvbm4pOworCW5vdXZlYXVfb2JqZWN0X2Rlc3Ryb3koJm91dHAtPmJhc2UpOworfQorCitpbnQKK252a21fb3V0cHV0X2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLAorCQkgICAgc3RydWN0IGRjYl9vdXRwdXQgKmRjYkUsIGludCBpbmRleCwKKwkJICAgIGludCBsZW5ndGgsIHZvaWQgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MoZW5naW5lKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKHBhcmVudCk7CisJc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9ICh2b2lkICopZW5naW5lOworCXN0cnVjdCBudmJpb3NfY29ubkUgY29ubkU7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOworCXU4ICB2ZXIsIGhkcjsKKwl1MzIgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9vYmplY3RfY3JlYXRlXyhwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAwLCBsZW5ndGgsIHBvYmplY3QpOworCW91dHAgPSAqcG9iamVjdDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJb3V0cC0+aW5mbyA9ICpkY2JFOworCW91dHAtPmluZGV4ID0gaW5kZXg7CisKKwlEQkcoInR5cGUgJTAyeCBsb2MgJWQgb3IgJWQgbGluayAlZCBjb24gJXggZWRpZCAleCBidXMgJWQgaGVhZCAleFxuIiwKKwkgICAgZGNiRS0+dHlwZSwgZGNiRS0+bG9jYXRpb24sIGRjYkUtPm9yLCBkY2JFLT50eXBlID49IDIgPworCSAgICBkY2JFLT5zb3Jjb25mLmxpbmsgOiAwLCBkY2JFLT5jb25uZWN0b3IsIGRjYkUtPmkyY19pbmRleCwKKwkgICAgZGNiRS0+YnVzLCBkY2JFLT5oZWFkcyk7CisKKwlvdXRwLT5wb3J0ID0gaTJjLT5maW5kKGkyYywgb3V0cC0+aW5mby5pMmNfaW5kZXgpOworCW91dHAtPmVkaWQgPSBvdXRwLT5wb3J0OworCisJZGF0YSA9IG52Ymlvc19jb25uRXAoYmlvcywgb3V0cC0+aW5mby5jb25uZWN0b3IsICZ2ZXIsICZoZHIsICZjb25uRSk7CisJaWYgKCFkYXRhKSB7CisJCURCRygidmJpb3MgY29ubmVjdG9yIGRhdGEgbm90IGZvdW5kXG4iKTsKKwkJbWVtc2V0KCZjb25uRSwgMHgwMCwgc2l6ZW9mKGNvbm5FKSk7CisJCWNvbm5FLnR5cGUgPSBEQ0JfQ09OTkVDVE9SX05PTkU7CisJfQorCisJcmV0ID0gbm91dmVhdV9vYmplY3RfY3RvcihwYXJlbnQsIGVuZ2luZSwgbnZrbV9jb25uZWN0b3Jfb2NsYXNzLAorCQkJCSAmY29ubkUsIG91dHAtPmluZm8uY29ubmVjdG9yLAorCQkJCSAoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqKSZvdXRwLT5jb25uKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlIoImVycm9yICVkIGNyZWF0aW5nIGNvbm5lY3RvciwgZGlzYWJsaW5nXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxpc3RfYWRkX3RhaWwoJm91dHAtPmhlYWQsICZkaXNwLT5vdXRwKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitfbnZrbV9vdXRwdXRfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGNiRSwgdTMyIGluZGV4LAorCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCit7CisJc3RydWN0IG52a21fb3V0cHV0ICpvdXRwOworCWludCByZXQ7CisKKwlyZXQgPSBudmttX291dHB1dF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgZGNiRSwgaW5kZXgsICZvdXRwKTsKKwkqcG9iamVjdCA9IG52X29iamVjdChvdXRwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmttX291dHB1dF9vY2xhc3MgPSAmKHN0cnVjdCBudmttX291dHB1dF9pbXBsKSB7CisJLmJhc2UgPSB7CisJCS5oYW5kbGUgPSAwLAorCQkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJCS5jdG9yID0gX252a21fb3V0cHV0X2N0b3IsCisJCQkuZHRvciA9IF9udmttX291dHB1dF9kdG9yLAorCQkJLmluaXQgPSBfbnZrbV9vdXRwdXRfaW5pdCwKKwkJCS5maW5pID0gX252a21fb3V0cHV0X2ZpbmksCisJCX0sCisJfSwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avb3V0cC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9vdXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3NmZiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avb3V0cC5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX19OVktNX0RJU1BfT1VUUF9IX18KKyNkZWZpbmUgX19OVktNX0RJU1BfT1VUUF9IX18KKworI2luY2x1ZGUgInByaXYuaCIKKworc3RydWN0IG52a21fb3V0cHV0IHsKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisKKwlzdHJ1Y3QgZGNiX291dHB1dCBpbmZvOworCWludCBpbmRleDsKKworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0OworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICplZGlkOworCisJc3RydWN0IG52a21fY29ubmVjdG9yICpjb25uOworfTsKKworI2RlZmluZSBudmttX291dHB1dF9jcmVhdGUocCxlLGMsYixpLGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwludmttX291dHB1dF9jcmVhdGVfKChwKSwgKGUpLCAoYyksIChiKSwgKGkpLCBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKKyNkZWZpbmUgbnZrbV9vdXRwdXRfZGVzdHJveShkKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG52a21fb3V0cHV0ICpfb3V0cCA9IChkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX252a21fb3V0cHV0X2R0b3IobnZfb2JqZWN0KF9vdXRwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBudmttX291dHB1dF9pbml0KGQpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKl9vdXRwID0gKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbnZrbV9vdXRwdXRfaW5pdChudl9vYmplY3QoX291dHApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG52a21fb3V0cHV0X2ZpbmkoZCxzKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBudmttX291dHB1dCAqX291dHAgPSAoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9udmttX291dHB1dF9maW5pKG52X29iamVjdChfb3V0cCksIChzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworaW50IG52a21fb3V0cHV0X2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHN0cnVjdCBkY2Jfb3V0cHV0ICosCisJCQlpbnQsIGludCwgdm9pZCAqKik7CisKK2ludCAgX252a21fb3V0cHV0X2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHZvaWQgKiwgdTMyLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqKTsKK3ZvaWQgX252a21fb3V0cHV0X2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworaW50ICBfbnZrbV9vdXRwdXRfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIF9udmttX291dHB1dF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKKworc3RydWN0IG52a21fb3V0cHV0X2ltcGwgeworCXN0cnVjdCBub3V2ZWF1X29jbGFzcyBiYXNlOworfTsKKworI2lmbmRlZiBNU0cKKyNkZWZpbmUgTVNHKGwsZixhLi4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG52a21fb3V0cHV0ICpfb3V0cCA9ICh2b2lkICopb3V0cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbnZfIyNsKG52X29iamVjdChvdXRwKS0+ZW5naW5lLCAiJTAyeDolMDR4OiUwNHg6ICJmLCBfb3V0cC0+aW5kZXgsICAgICBcCisJICAgICAgIF9vdXRwLT5pbmZvLmhhc2h0LCBfb3V0cC0+aW5mby5oYXNobSwgIyNhKTsgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisjZGVmaW5lIERCRyhmLGEuLi4pIE1TRyhkZWJ1ZywgZiwgIyNhKQorI2RlZmluZSBFUlIoZixhLi4uKSBNU0coZXJyb3IsIGYsICMjYSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avb3V0cGRwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL291dHBkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzI5OWMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9vdXRwZHAuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSA8c3ViZGV2L2kyYy5oPgorCisjaW5jbHVkZSAib3V0cGRwLmgiCisjaW5jbHVkZSAiY29ubi5oIgorI2luY2x1ZGUgImRwb3J0LmgiCisKK2ludAorbnZrbV9vdXRwdXRfZHBfdHJhaW4oc3RydWN0IG52a21fb3V0cHV0ICpiYXNlLCB1MzIgZGF0YXJhdGUsIGJvb2wgd2FpdCkKK3sKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAgPSAodm9pZCAqKWJhc2U7CisJYm9vbCByZXRyYWluID0gdHJ1ZTsKKwl1OCBsaW5rWzJdLCBzdGF0WzNdOworCXUzMiByYXRlOworCWludCByZXQsIGk7CisKKwkvKiBjaGVjayB0aGF0IHRoZSBsaW5rIGlzIHRyYWluZWQgYXQgYSBoaWdoIGVub3VnaCByYXRlICovCisJcmV0ID0gbnZfcmRhdXgob3V0cC0+YmFzZS5lZGlkLCBEUENEX0xDMDBfTElOS19CV19TRVQsIGxpbmssIDIpOworCWlmIChyZXQpIHsKKwkJREJHKCJmYWlsZWQgdG8gcmVhZCBsaW5rIGNvbmZpZywgYXNzdW1pbmcgbm8gc2lua1xuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYXRlID0gbGlua1swXSAqIDI3MDAwICogKGxpbmtbMV0gJiBEUENEX0xDMDFfTEFORV9DT1VOVF9TRVQpOworCWlmIChyYXRlIDwgKChkYXRhcmF0ZSAvIDgpICogMTApKSB7CisJCURCRygibGluayBub3QgdHJhaW5lZCBhdCBzdWZmaWNpZW50IHJhdGVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogY2hlY2sgdGhhdCBsaW5rIGlzIHN0aWxsIHRyYWluZWQgKi8KKwlyZXQgPSBudl9yZGF1eChvdXRwLT5iYXNlLmVkaWQsIERQQ0RfTFMwMiwgc3RhdCwgMyk7CisJaWYgKHJldCkgeworCQlEQkcoImZhaWxlZCB0byByZWFkIGxpbmsgc3RhdHVzLCBhc3N1bWluZyBubyBzaW5rXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzdGF0WzJdICYgRFBDRF9MUzA0X0lOVEVSTEFORV9BTElHTl9ET05FKSB7CisJCWZvciAoaSA9IDA7IGkgPCAobGlua1sxXSAmIERQQ0RfTEMwMV9MQU5FX0NPVU5UX1NFVCk7IGkrKykgeworCQkJdTggbGFuZSA9IChzdGF0W2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweDBmOworCQkJaWYgKCEobGFuZSAmIERQQ0RfTFMwMl9MQU5FMF9DUl9ET05FKSB8fAorCQkJICAgICEobGFuZSAmIERQQ0RfTFMwMl9MQU5FMF9DSEFOTkVMX0VRX0RPTkUpIHx8CisJCQkgICAgIShsYW5lICYgRFBDRF9MUzAyX0xBTkUwX1NZTUJPTF9MT0NLRUQpKSB7CisJCQkJREJHKCJsYW5lICVkIG5vdCBlcXVhbGlzZWRcbiIsIGxhbmUpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlyZXRyYWluID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJREJHKCJubyBpbnRlci1sYW5lIGFsaWdubWVudFxuIik7CisJfQorCitkb25lOgorCWlmIChyZXRyYWluIHx8ICFhdG9taWNfcmVhZCgmb3V0cC0+bHQuZG9uZSkpIHsKKwkJLyogbm8gc2luaywgYnV0IHN0aWxsIG5lZWQgdG8gY29uZmlndXJlIHNvdXJjZSAqLworCQlpZiAob3V0cC0+ZHBjZFtEUENEX1JDMDBfRFBDRF9SRVZdID09IDB4MDApIHsKKwkJCW91dHAtPmRwY2RbRFBDRF9SQzAxX01BWF9MSU5LX1JBVEVdID0KKwkJCQlvdXRwLT5iYXNlLmluZm8uZHBjb25mLmxpbmtfYnc7CisJCQlvdXRwLT5kcGNkW0RQQ0RfUkMwMl0gPQorCQkJCW91dHAtPmJhc2UuaW5mby5kcGNvbmYubGlua19ucjsKKwkJfQorCQlhdG9taWNfc2V0KCZvdXRwLT5sdC5kb25lLCAwKTsKKwkJc2NoZWR1bGVfd29yaygmb3V0cC0+bHQud29yayk7CisJfSBlbHNlIHsKKwkJbm91dmVhdV9ldmVudF9nZXQob3V0cC0+aXJxKTsKKwl9CisKKwlpZiAod2FpdCkgeworCQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChvdXRwLT5sdC53YWl0LAorCQkJCQlhdG9taWNfcmVhZCgmb3V0cC0+bHQuZG9uZSksCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpKQorCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorbnZrbV9vdXRwdXRfZHBfZW5hYmxlKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCwgYm9vbCBwcmVzZW50KQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gb3V0cC0+YmFzZS5lZGlkOworCWlmIChwcmVzZW50KSB7CisJCWlmICghb3V0cC0+cHJlc2VudCkgeworCQkJbm91dmVhdV9pMmMocG9ydCktPmFjcXVpcmVfcGFkKHBvcnQsIDApOworCQkJREJHKCJhdXggcG93ZXIgLT4gYWx3YXlzXG4iKTsKKwkJCW91dHAtPnByZXNlbnQgPSB0cnVlOworCQl9CisJCW52a21fb3V0cHV0X2RwX3RyYWluKCZvdXRwLT5iYXNlLCAwLCB0cnVlKTsKKwl9IGVsc2UgeworCQlpZiAob3V0cC0+cHJlc2VudCkgeworCQkJbm91dmVhdV9pMmMocG9ydCktPnJlbGVhc2VfcGFkKHBvcnQpOworCQkJREJHKCJhdXggcG93ZXIgLT4gZGVtYW5kXG4iKTsKKwkJCW91dHAtPnByZXNlbnQgPSBmYWxzZTsKKwkJfQorCQlhdG9taWNfc2V0KCZvdXRwLT5sdC5kb25lLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudmttX291dHB1dF9kcF9kZXRlY3Qoc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gb3V0cC0+YmFzZS5lZGlkOworCWludCByZXQgPSBub3V2ZWF1X2kyYyhwb3J0KS0+YWNxdWlyZV9wYWQocG9ydCwgMCk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IG52X3JkYXV4KG91dHAtPmJhc2UuZWRpZCwgRFBDRF9SQzAwX0RQQ0RfUkVWLAorCQkJICAgICAgIG91dHAtPmRwY2QsIHNpemVvZihvdXRwLT5kcGNkKSk7CisJCW52a21fb3V0cHV0X2RwX2VuYWJsZShvdXRwLCByZXQgPT0gMCk7CisJCW5vdXZlYXVfaTJjKHBvcnQpLT5yZWxlYXNlX3BhZChwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudmttX291dHB1dF9kcF9zZXJ2aWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKm91dHApLCB3b3JrKTsKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gbm91dmVhdV9kaXNwKG91dHApOworCWludCB0eXBlID0gYXRvbWljX3hjaGcoJm91dHAtPnBlbmRpbmcsIDApOworCXUzMiBzZW5kID0gMDsKKworCWlmICh0eXBlICYgKE5WS01fSTJDX1BMVUcgfCBOVktNX0kyQ19VTlBMVUcpKSB7CisJCW52a21fb3V0cHV0X2RwX2RldGVjdChvdXRwKTsKKwkJaWYgKHR5cGUgJiBOVktNX0kyQ19VTlBMVUcpCisJCQlzZW5kIHw9IE5WS01fSFBEX1VOUExVRzsKKwkJaWYgKHR5cGUgJiBOVktNX0kyQ19QTFVHKQorCQkJc2VuZCB8PSBOVktNX0hQRF9QTFVHOworCQlub3V2ZWF1X2V2ZW50X2dldChvdXRwLT5iYXNlLmNvbm4tPmhwZC5ldmVudCk7CisJfQorCisJaWYgKHR5cGUgJiBOVktNX0kyQ19JUlEpIHsKKwkJbnZrbV9vdXRwdXRfZHBfdHJhaW4oJm91dHAtPmJhc2UsIDAsIHRydWUpOworCQlzZW5kIHw9IE5WS01fSFBEX0lSUTsKKwl9CisKKwlub3V2ZWF1X2V2ZW50X3RyaWdnZXIoZGlzcC0+aHBkLCBzZW5kLCBvdXRwLT5iYXNlLmluZm8uY29ubmVjdG9yKTsKK30KKworc3RhdGljIGludAorbnZrbV9vdXRwdXRfZHBfc2VydmljZSh2b2lkICpkYXRhLCB1MzIgdHlwZSwgaW50IGluZGV4KQoreworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9IGRhdGE7CisJREJHKCJIUEQ6ICVkXG4iLCB0eXBlKTsKKwlhdG9taWNfb3IodHlwZSwgJm91dHAtPnBlbmRpbmcpOworCXNjaGVkdWxlX3dvcmsoJm91dHAtPndvcmspOworCXJldHVybiBOVktNX0VWRU5UX0RST1A7Cit9CisKK2ludAorX252a21fb3V0cHV0X2RwX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKK3sKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAgPSAodm9pZCAqKW9iamVjdDsKKwlub3V2ZWF1X2V2ZW50X3B1dChvdXRwLT5pcnEpOworCW52a21fb3V0cHV0X2RwX2VuYWJsZShvdXRwLCBmYWxzZSk7CisJcmV0dXJuIG52a21fb3V0cHV0X2ZpbmkoJm91dHAtPmJhc2UsIHN1c3BlbmQpOworfQorCitpbnQKK19udmttX291dHB1dF9kcF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9ICh2b2lkICopb2JqZWN0OworCW52a21fb3V0cHV0X2RwX2RldGVjdChvdXRwKTsKKwlyZXR1cm4gbnZrbV9vdXRwdXRfaW5pdCgmb3V0cC0+YmFzZSk7Cit9CisKK3ZvaWQKK19udmttX291dHB1dF9kcF9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCA9ICh2b2lkICopb2JqZWN0OworCW5vdXZlYXVfZXZlbnRfcmVmKE5VTEwsICZvdXRwLT5pcnEpOworCW52a21fb3V0cHV0X2Rlc3Ryb3koJm91dHAtPmJhc2UpOworfQorCitpbnQKK252a21fb3V0cHV0X2RwX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLAorCQkgICAgICAgc3RydWN0IGRjYl9vdXRwdXQgKmluZm8sIGludCBpbmRleCwKKwkJICAgICAgIGludCBsZW5ndGgsIHZvaWQgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBub3V2ZWF1X2Jpb3MocGFyZW50KTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKHBhcmVudCk7CisJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwOworCXU4ICBoZHIsIGNudCwgbGVuOworCXUzMiBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBudmttX291dHB1dF9jcmVhdGVfKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIGluZm8sIGluZGV4LAorCQkJCSAgbGVuZ3RoLCBwb2JqZWN0KTsKKwlvdXRwID0gKnBvYmplY3Q7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW5vdXZlYXVfZXZlbnRfcmVmKE5VTEwsICZvdXRwLT5iYXNlLmNvbm4tPmhwZC5ldmVudCk7CisKKwkvKiBhY2Nlc3MgdG8gdGhlIGF1eCBjaGFubmVsIGlzIG5vdCBvcHRpb25hbC4uLiAqLworCWlmICghb3V0cC0+YmFzZS5lZGlkKSB7CisJCUVSUigiYXV4IGNoYW5uZWwgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogbm9yIGlzIHRoZSBiaW9zIGRhdGEgZm9yIHRoaXMgb3V0cHV0Li4uICovCisJZGF0YSA9IG52Ymlvc19kcG91dF9tYXRjaChiaW9zLCBvdXRwLT5iYXNlLmluZm8uaGFzaHQsCisJCQkJICBvdXRwLT5iYXNlLmluZm8uaGFzaG0sICZvdXRwLT52ZXJzaW9uLAorCQkJCSAgJmhkciwgJmNudCwgJmxlbiwgJm91dHAtPmluZm8pOworCWlmICghZGF0YSkgeworCQlFUlIoIm5vIGJpb3MgZHAgZGF0YVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCURCRygiYmlvcyBkcCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBvdXRwLT52ZXJzaW9uLCBoZHIsIGNudCwgbGVuKTsKKworCS8qIGxpbmsgdHJhaW5pbmcgKi8KKwlJTklUX1dPUksoJm91dHAtPmx0LndvcmssIG5vdXZlYXVfZHBfdHJhaW4pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm91dHAtPmx0LndhaXQpOworCWF0b21pY19zZXQoJm91dHAtPmx0LmRvbmUsIDApOworCisJLyogbGluayBtYWludGVuYW5jZSAqLworCXJldCA9IG5vdXZlYXVfZXZlbnRfbmV3KGkyYy0+bnRmeSwgTlZLTV9JMkNfSVJRLCBvdXRwLT5iYXNlLmVkaWQtPmluZGV4LAorCQkJCW52a21fb3V0cHV0X2RwX3NlcnZpY2UsIG91dHAsICZvdXRwLT5pcnEpOworCWlmIChyZXQpIHsKKwkJRVJSKCJlcnJvciBtb25pdG9yaW5nIGF1eCBpcnEgZXZlbnQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCUlOSVRfV09SSygmb3V0cC0+d29yaywgbnZrbV9vdXRwdXRfZHBfc2VydmljZV93b3JrKTsKKworCS8qIGhvdHBsdWcgZGV0ZWN0LCByZXBsYWNlcyBncGlvLWJhc2VkIG1lY2hhbmlzbSB3aXRoIGF1eCBldmVudHMgKi8KKwlyZXQgPSBub3V2ZWF1X2V2ZW50X25ldyhpMmMtPm50ZnksIE5WS01fSTJDX1BMVUcgfCBOVktNX0kyQ19VTlBMVUcsCisJCQkJb3V0cC0+YmFzZS5lZGlkLT5pbmRleCwKKwkJCQludmttX291dHB1dF9kcF9zZXJ2aWNlLCBvdXRwLAorCQkJICAgICAgICZvdXRwLT5iYXNlLmNvbm4tPmhwZC5ldmVudCk7CisJaWYgKHJldCkgeworCQlFUlIoImVycm9yIG1vbml0b3JpbmcgYXV4IGhwZCBldmVudHM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK19udmttX291dHB1dF9kcF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICppbmZvLCB1MzIgaW5kZXgsCisJCSAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKK3sKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHA7CisJaW50IHJldDsKKworCXJldCA9IG52a21fb3V0cHV0X2RwX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBpbmZvLCBpbmRleCwgJm91dHApOworCSpwb2JqZWN0ID0gbnZfb2JqZWN0KG91dHApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avb3V0cGRwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL291dHBkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzNiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL291dHBkcC5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX19OVktNX0RJU1BfT1VUUF9EUF9IX18KKyNkZWZpbmUgX19OVktNX0RJU1BfT1VUUF9EUF9IX18KKworI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CisjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZHAuaD4KKworI2luY2x1ZGUgIm91dHAuaCIKKworc3RydWN0IG52a21fb3V0cHV0X2RwIHsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgYmFzZTsKKworCXN0cnVjdCBudmJpb3NfZHBvdXQgaW5mbzsKKwl1OCB2ZXJzaW9uOworCisJc3RydWN0IG5vdXZlYXVfZXZlbnRoICppcnE7CisJc3RydWN0IG5vdXZlYXVfZXZlbnRoICpocGQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJYXRvbWljX3QgcGVuZGluZzsKKwlib29sIHByZXNlbnQ7CisJdTggZHBjZFsxNl07CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJYXRvbWljX3QgZG9uZTsKKwl9IGx0OworfTsKKworI2RlZmluZSBudmttX291dHB1dF9kcF9jcmVhdGUocCxlLGMsYixpLGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwludmttX291dHB1dF9kcF9jcmVhdGVfKChwKSwgKGUpLCAoYyksIChiKSwgKGkpLCBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKKyNkZWZpbmUgbnZrbV9vdXRwdXRfZHBfZGVzdHJveShkKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG52a21fb3V0cHV0X2RwICpfb3V0cCA9IChkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX252a21fb3V0cHV0X2RwX2R0b3IobnZfb2JqZWN0KF9vdXRwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBudmttX291dHB1dF9kcF9pbml0KGQpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKl9vdXRwID0gKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbnZrbV9vdXRwdXRfZHBfaW5pdChudl9vYmplY3QoX291dHApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG52a21fb3V0cHV0X2RwX2ZpbmkoZCxzKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBudmttX291dHB1dF9kcCAqX291dHAgPSAoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9udmttX291dHB1dF9kcF9maW5pKG52X29iamVjdChfb3V0cCksIChzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworaW50IG52a21fb3V0cHV0X2RwX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHN0cnVjdCBkY2Jfb3V0cHV0ICosCisJCQkgICBpbnQsIGludCwgdm9pZCAqKik7CisKK2ludCAgX252a21fb3V0cHV0X2RwX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgdm9pZCAqLCB1MzIsCisJCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7Cit2b2lkIF9udmttX291dHB1dF9kcF9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgX252a21fb3V0cHV0X2RwX2luaXQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworaW50ICBfbnZrbV9vdXRwdXRfZHBfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgYm9vbCk7CisKK3N0cnVjdCBudmttX291dHB1dF9kcF9pbXBsIHsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXRfaW1wbCBiYXNlOworCWludCAoKnBhdHRlcm4pKHN0cnVjdCBudmttX291dHB1dF9kcCAqLCBpbnQpOworCWludCAoKmxua19wd3IpKHN0cnVjdCBudmttX291dHB1dF9kcCAqLCBpbnQgbnIpOworCWludCAoKmxua19jdGwpKHN0cnVjdCBudmttX291dHB1dF9kcCAqLCBpbnQgbnIsIGludCBidywgYm9vbCBlZik7CisJaW50ICgqZHJ2X2N0bCkoc3RydWN0IG52a21fb3V0cHV0X2RwICosIGludCBsbiwgaW50IHZzLCBpbnQgcGUsIGludCBwYyk7Cit9OworCitpbnQgbnZrbV9vdXRwdXRfZHBfdHJhaW4oc3RydWN0IG52a21fb3V0cHV0ICosIHUzMiByYXRlLCBib29sIHdhaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvcGlvcm52NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvcGlvcm52NTAuYwppbmRleCAyYzhjZTM1Li5mZTBmMjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Bpb3JudjUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9waW9ybnY1MC5jCkBAIC0zMyw2OCArMzMsMTA3IEBACiAjaW5jbHVkZSAibnY1MC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUTURTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK252NTBfcGlvcl90bWRzX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICppbmZvLCB1MzIgaW5kZXgsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gbm91dmVhdV9pMmMocGFyZW50KTsKKwlzdHJ1Y3QgbnZrbV9vdXRwdXQgKm91dHA7CisJaW50IHJldDsKKworCXJldCA9IG52a21fb3V0cHV0X2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBpbmZvLCBpbmRleCwgJm91dHApOworCSpwb2JqZWN0ID0gbnZfb2JqZWN0KG91dHApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlvdXRwLT5lZGlkID0gaTJjLT5maW5kX3R5cGUoaTJjLCBOVl9JMkNfVFlQRV9FWFREREMob3V0cC0+aW5mby5leHRkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG52a21fb3V0cHV0X2ltcGwKK252NTBfcGlvcl90bWRzX2ltcGwgPSB7CisJLmJhc2UuaGFuZGxlID0gRENCX09VVFBVVF9UTURTIHwgMHgwMTAwLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnY1MF9waW9yX3RtZHNfY3RvciwKKwkJLmR0b3IgPSBfbnZrbV9vdXRwdXRfZHRvciwKKwkJLmluaXQgPSBfbnZrbV9vdXRwdXRfaW5pdCwKKwkJLmZpbmkgPSBfbnZrbV9vdXRwdXRfZmluaSwKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGlzcGxheVBvcnQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqCi1udjUwX3Bpb3JfZHBfZmluZChzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwLCBzdHJ1Y3QgZGNiX291dHB1dCAqb3V0cCkKKworc3RhdGljIGludAorbnY1MF9waW9yX2RwX3BhdHRlcm4oc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwLCBpbnQgcGF0dGVybikKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKGRpc3ApOwotCXJldHVybiBpMmMtPmZpbmRfdHlwZShpMmMsIE5WX0kyQ19UWVBFX0VYVEFVWChvdXRwLT5leHRkZXYpKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCA9IG91dHAtPmJhc2UuZWRpZDsKKwlpZiAocG9ydCAmJiBwb3J0LT5mdW5jLT5wYXR0ZXJuKQorCQlyZXR1cm4gcG9ydC0+ZnVuYy0+cGF0dGVybihwb3J0LCBwYXR0ZXJuKTsKKwlyZXR1cm4gcG9ydCA/IDAgOiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50Ci1udjUwX3Bpb3JfZHBfcGF0dGVybihzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwLCBzdHJ1Y3QgZGNiX291dHB1dCAqb3V0cCwKLQkJICAgICBpbnQgaGVhZCwgaW50IHBhdHRlcm4pCitudjUwX3Bpb3JfZHBfbG5rX3B3cihzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAsIGludCBucikKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCXBvcnQgPSBudjUwX3Bpb3JfZHBfZmluZChkaXNwLCBvdXRwKTsKLQlpZiAocG9ydCkgewotCQlpZiAocG9ydC0+ZnVuYy0+cGF0dGVybikKLQkJCXJldCA9IHBvcnQtPmZ1bmMtPnBhdHRlcm4ocG9ydCwgcGF0dGVybik7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotbnY1MF9waW9yX2RwX2xua19jdGwoc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCwgc3RydWN0IGRjYl9vdXRwdXQgKm91dHAsCi0JCSAgICAgaW50IGhlYWQsIGludCBsYW5lX25yLCBpbnQgbGlua19idywgYm9vbCBlbmgpCitudjUwX3Bpb3JfZHBfbG5rX2N0bChzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAsIGludCBuciwgaW50IGJ3LCBib29sIGVmKQogewotCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0OwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JcG9ydCA9IG52NTBfcGlvcl9kcF9maW5kKGRpc3AsIG91dHApOworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gb3V0cC0+YmFzZS5lZGlkOwogCWlmIChwb3J0ICYmIHBvcnQtPmZ1bmMtPmxua19jdGwpCi0JCXJldCA9IHBvcnQtPmZ1bmMtPmxua19jdGwocG9ydCwgbGFuZV9uciwgbGlua19idywgZW5oKTsKLQotCXJldHVybiByZXQ7CisJCXJldHVybiBwb3J0LT5mdW5jLT5sbmtfY3RsKHBvcnQsIG5yLCBidywgZWYpOworCXJldHVybiBwb3J0ID8gMCA6IC1FTk9ERVY7CiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfcGlvcl9kcF9kcnZfY3RsKHN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AsIHN0cnVjdCBkY2Jfb3V0cHV0ICpvdXRwLAotCQkgICAgIGludCBoZWFkLCBpbnQgbGFuZSwgaW50IHZzdywgaW50IHByZSkKK252NTBfcGlvcl9kcF9kcnZfY3RsKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCwgaW50IGxuLCBpbnQgdnMsIGludCBwZSwgaW50IHBjKQogewotCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0OwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JcG9ydCA9IG52NTBfcGlvcl9kcF9maW5kKGRpc3AsIG91dHApOwotCWlmIChwb3J0KSB7Ci0JCWlmIChwb3J0LT5mdW5jLT5kcnZfY3RsKQotCQkJcmV0ID0gcG9ydC0+ZnVuYy0+ZHJ2X2N0bChwb3J0LCBsYW5lLCB2c3csIHByZSk7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCA9IG91dHAtPmJhc2UuZWRpZDsKKwlpZiAocG9ydCAmJiBwb3J0LT5mdW5jLT5kcnZfY3RsKQorCQlyZXR1cm4gcG9ydC0+ZnVuYy0+ZHJ2X2N0bChwb3J0LCBsbiwgdnMsIHBlKTsKKwlyZXR1cm4gcG9ydCA/IDAgOiAtRU5PREVWOwogfQogCi1jb25zdCBzdHJ1Y3Qgbm91dmVhdV9kcF9mdW5jCi1udjUwX3Bpb3JfZHBfZnVuYyA9IHsKK3N0YXRpYyBpbnQKK252NTBfcGlvcl9kcF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAorCQkgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAorCQkgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICppbmZvLCB1MzIgaW5kZXgsCisJCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKHBhcmVudCk7CisJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwOworCWludCByZXQ7CisKKwlyZXQgPSBudmttX291dHB1dF9kcF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgaW5mbywgaW5kZXgsICZvdXRwKTsKKwkqcG9iamVjdCA9IG52X29iamVjdChvdXRwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJb3V0cC0+YmFzZS5lZGlkID0gaTJjLT5maW5kX3R5cGUoaTJjLCBOVl9JMkNfVFlQRV9FWFRBVVgoCisJCQkJCSBvdXRwLT5iYXNlLmluZm8uZXh0ZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBudmttX291dHB1dF9kcF9pbXBsCitudjUwX3Bpb3JfZHBfaW1wbCA9IHsKKwkuYmFzZS5iYXNlLmhhbmRsZSA9IERDQl9PVVRQVVRfRFAgfCAweDAwMTAsCisJLmJhc2UuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52NTBfcGlvcl9kcF9jdG9yLAorCQkuZHRvciA9IF9udmttX291dHB1dF9kcF9kdG9yLAorCQkuaW5pdCA9IF9udmttX291dHB1dF9kcF9pbml0LAorCQkuZmluaSA9IF9udmttX291dHB1dF9kcF9maW5pLAorCX0sCiAJLnBhdHRlcm4gPSBudjUwX3Bpb3JfZHBfcGF0dGVybiwKKwkubG5rX3B3ciA9IG52NTBfcGlvcl9kcF9sbmtfcHdyLAogCS5sbmtfY3RsID0gbnY1MF9waW9yX2RwX2xua19jdGwsCiAJLmRydl9jdGwgPSBudjUwX3Bpb3JfZHBfZHJ2X2N0bCwKIH07CkBAIC0xMDIsNiArMTQxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEdlbmVyYWwgUElPUiBoYW5kbGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBpbnQKIG52NTBfcGlvcl9wb3dlcihzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYsIGludCBvciwgdTMyIGRhdGEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3ByaXYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvcHJpdi5oCmluZGV4IGNjM2M3YTQuLjI2ZTlhNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvcHJpdi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3AvcHJpdi5oCkBAIC0xLDEwICsxLDQyIEBACiAjaWZuZGVmIF9fTlZLTV9ESVNQX1BSSVZfSF9fCiAjZGVmaW5lIF9fTlZLTV9ESVNQX1BSSVZfSF9fCiAKKyNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgorI2luY2x1ZGUgPHN1YmRldi9iaW9zL2RjYi5oPgorI2luY2x1ZGUgPHN1YmRldi9iaW9zL2Nvbm4uaD4KKwogI2luY2x1ZGUgPGVuZ2luZS9kaXNwLmg+CiAKIHN0cnVjdCBub3V2ZWF1X2Rpc3BfaW1wbCB7CiAJc3RydWN0IG5vdXZlYXVfb2NsYXNzIGJhc2U7CisJc3RydWN0IG5vdXZlYXVfb2NsYXNzICoqb3V0cDsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKipjb25uOwogfTsKIAorI2RlZmluZSBub3V2ZWF1X2Rpc3BfY3JlYXRlKHAsZSxjLGgsaSx4LGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X2Rpc3BfY3JlYXRlXygocCksIChlKSwgKGMpLCAoaCksIChpKSwgKHgpLCAgICAgICAgICAgICAgICAgICAgIFwKKwkJCSAgICAgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCisjZGVmaW5lIG5vdXZlYXVfZGlzcF9kZXN0cm95KGQpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AgPSAoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2Rpc3BfZHRvcihudl9vYmplY3QoZGlzcCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9kaXNwX2luaXQoZCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9IChkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX25vdXZlYXVfZGlzcF9pbml0KG52X29iamVjdChkaXNwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBub3V2ZWF1X2Rpc3BfZmluaShkLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwICpkaXNwID0gKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbm91dmVhdV9kaXNwX2ZpbmkobnZfb2JqZWN0KGRpc3ApLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKK2ludCAgbm91dmVhdV9kaXNwX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50IGhlYWRzLAorCQkJICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCB2b2lkICoqKTsKK3ZvaWQgX25vdXZlYXVfZGlzcF9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgX25vdXZlYXVfZGlzcF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCAgX25vdXZlYXVfZGlzcF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKKworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZrbV9vdXRwdXRfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZrbV9jb25uZWN0b3Jfb2NsYXNzOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2Rpc3Avc29ybnY1MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9zb3JudjUwLmMKaW5kZXggNTI2Yjc1Mi4uZTE4MzI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9zb3JudjUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9zb3JudjUwLmMKQEAgLTQ3LDggKzQ3LDEyIEBACiBudjUwX3Nvcl9tdGhkKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCB1MzIgbXRoZCwgdm9pZCAqYXJncywgdTMyIHNpemUpCiB7CiAJc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3QtPmVuZ2luZTsKKwljb25zdCB1OCAgdHlwZSA9IChtdGhkICYgTlY1MF9ESVNQX1NPUl9NVEhEX1RZUEUpID4+IDEyOwogCWNvbnN0IHU4ICBoZWFkID0gKG10aGQgJiBOVjUwX0RJU1BfU09SX01USERfSEVBRCkgPj4gMzsKKwljb25zdCB1OCAgbGluayA9IChtdGhkICYgTlY1MF9ESVNQX1NPUl9NVEhEX0xJTkspID4+IDI7CiAJY29uc3QgdTggICAgb3IgPSAobXRoZCAmIE5WNTBfRElTUF9TT1JfTVRIRF9PUik7CisJY29uc3QgdTE2IG1hc2sgPSAoMHgwMTAwIDw8IGhlYWQpIHwgKDB4MDA0MCA8PCBsaW5rKSB8ICgweDAwMDEgPDwgb3IpOworCXN0cnVjdCBudmttX291dHB1dCAqb3V0cCA9IE5VTEwsICp0ZW1wOwogCXUzMiBkYXRhOwogCWludCByZXQgPSAtRUlOVkFMOwogCkBAIC01Niw2ICs2MCwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlkYXRhID0gKih1MzIgKilhcmdzOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmcHJpdi0+YmFzZS5vdXRwLCBoZWFkKSB7CisJCWlmICgodGVtcC0+aW5mby5oYXNodCAmIDB4ZmYpID09IHR5cGUgJiYKKwkJICAgICh0ZW1wLT5pbmZvLmhhc2htICYgbWFzaykgPT0gbWFzaykgeworCQkJb3V0cCA9IHRlbXA7CisJCQlicmVhazsKKwkJfQorCX0KIAogCXN3aXRjaCAobXRoZCAmIH4weDNmKSB7CiAJY2FzZSBOVjUwX0RJU1BfU09SX1BXUjoKQEAgLTcxLDYgKzgyLDIzIEBACiAJCXByaXYtPnNvci5sdmRzY29uZiA9IGRhdGEgJiBOVjUwX0RJU1BfU09SX0xWRFNfU0NSSVBUX0lEOwogCQlyZXQgPSAwOwogCQlicmVhazsKKwljYXNlIE5WOTRfRElTUF9TT1JfRFBfUFdSOgorCQlpZiAob3V0cCkgeworCQkJc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwZHAgPSAodm9pZCAqKW91dHA7CisJCQlzd2l0Y2ggKGRhdGEpIHsKKwkJCWNhc2UgTlY5NF9ESVNQX1NPUl9EUF9QV1JfU1RBVEVfT0ZGOgorCQkJCSgoc3RydWN0IG52a21fb3V0cHV0X2RwX2ltcGwgKiludl9vY2xhc3Mob3V0cCkpCisJCQkJCS0+bG5rX3B3cihvdXRwZHAsIDApOworCQkJCWF0b21pY19zZXQoJm91dHBkcC0+bHQuZG9uZSwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE5WOTRfRElTUF9TT1JfRFBfUFdSX1NUQVRFX09OOgorCQkJCW52a21fb3V0cHV0X2RwX3RyYWluKCZvdXRwZHAtPmJhc2UsIDAsIHRydWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUdfT04oMSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9zb3Judjk0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52OTQuYwppbmRleCBlZWEzZWY1Li4wNTQ4N2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52OTQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52OTQuYwpAQCAtMjksMTkgKzI5LDIxIEBACiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZGNiLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZHAuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9pbml0Lmg+CisjaW5jbHVkZSA8c3ViZGV2L3RpbWVyLmg+CiAKICNpbmNsdWRlICJudjUwLmgiCisjaW5jbHVkZSAib3V0cGRwLmgiCiAKIHN0YXRpYyBpbmxpbmUgdTMyCi1udjk0X3Nvcl9zb2ZmKHN0cnVjdCBkY2Jfb3V0cHV0ICpvdXRwKQorbnY5NF9zb3Jfc29mZihzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHApCiB7Ci0JcmV0dXJuIChmZnMob3V0cC0+b3IpIC0gMSkgKiAweDgwMDsKKwlyZXR1cm4gKGZmcyhvdXRwLT5iYXNlLmluZm8ub3IpIC0gMSkgKiAweDgwMDsKIH0KIAogc3RhdGljIGlubGluZSB1MzIKLW52OTRfc29yX2xvZmYoc3RydWN0IGRjYl9vdXRwdXQgKm91dHApCitudjk0X3Nvcl9sb2ZmKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCkKIHsKLQlyZXR1cm4gbnY5NF9zb3Jfc29mZihvdXRwKSArICEob3V0cC0+c29yY29uZi5saW5rICYgMSkgKiAweDgwOworCXJldHVybiBudjk0X3Nvcl9zb2ZmKG91dHApICsgIShvdXRwLT5iYXNlLmluZm8uc29yY29uZi5saW5rICYgMSkgKiAweDgwOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMgpAQCAtNTUsNzcgKzU3LDk2IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52OTRfc29yX2RwX3BhdHRlcm4oc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCwgc3RydWN0IGRjYl9vdXRwdXQgKm91dHAsCi0JCSAgICBpbnQgaGVhZCwgaW50IHBhdHRlcm4pCitudjk0X3Nvcl9kcF9wYXR0ZXJuKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCwgaW50IHBhdHRlcm4pCiB7Ci0Jc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilkaXNwOworCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopbm91dmVhdV9kaXNwKG91dHApOwogCWNvbnN0IHUzMiBsb2ZmID0gbnY5NF9zb3JfbG9mZihvdXRwKTsKIAludl9tYXNrKHByaXYsIDB4NjFjMTBjICsgbG9mZiwgMHgwZjAwMDAwMCwgcGF0dGVybiA8PCAyNCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLW52OTRfc29yX2RwX2xua19jdGwoc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCwgc3RydWN0IGRjYl9vdXRwdXQgKm91dHAsCi0JCSAgICBpbnQgaGVhZCwgaW50IGxpbmtfbnIsIGludCBsaW5rX2J3LCBib29sIGVuaF9mcmFtZSkKK2ludAorbnY5NF9zb3JfZHBfbG5rX3B3cihzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAsIGludCBucikKIHsKLQlzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYgPSAodm9pZCAqKWRpc3A7CisJc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilub3V2ZWF1X2Rpc3Aob3V0cCk7CiAJY29uc3QgdTMyIHNvZmYgPSBudjk0X3Nvcl9zb2ZmKG91dHApOwogCWNvbnN0IHUzMiBsb2ZmID0gbnY5NF9zb3JfbG9mZihvdXRwKTsKLQl1MzIgZHBjdHJsID0gMHgwMDAwMDAwMDsKLQl1MzIgY2xrc29yID0gMHgwMDAwMDAwMDsKLQl1MzIgbGFuZSA9IDA7Ci0JaW50IGk7CisJdTMyIG1hc2sgPSAwLCBpOwogCi0JZHBjdHJsIHw9ICgoMSA8PCBsaW5rX25yKSAtIDEpIDw8IDE2OwotCWlmIChlbmhfZnJhbWUpCi0JCWRwY3RybCB8PSAweDAwMDA0MDAwOwotCWlmIChsaW5rX2J3ID4gMHgwNikKLQkJY2xrc29yIHw9IDB4MDAwNDAwMDA7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCW1hc2sgfD0gMSA8PCAobnY5NF9zb3JfZHBfbGFuZV9tYXAocHJpdiwgaSkgPj4gMyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGlua19ucjsgaSsrKQotCQlsYW5lIHw9IDEgPDwgKG52OTRfc29yX2RwX2xhbmVfbWFwKHByaXYsIGkpID4+IDMpOwotCi0JbnZfbWFzayhwcml2LCAweDYxNDMwMCArIHNvZmYsIDB4MDAwYzAwMDAsIGNsa3Nvcik7Ci0JbnZfbWFzayhwcml2LCAweDYxYzEwYyArIGxvZmYsIDB4MDAxZjQwMDAsIGRwY3RybCk7Ci0JbnZfbWFzayhwcml2LCAweDYxYzEzMCArIGxvZmYsIDB4MDAwMDAwMGYsIGxhbmUpOworCW52X21hc2socHJpdiwgMHg2MWMxMzAgKyBsb2ZmLCAweDAwMDAwMDBmLCBtYXNrKTsKKwludl9tYXNrKHByaXYsIDB4NjFjMDM0ICsgc29mZiwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCk7CisJbnZfd2FpdChwcml2LCAweDYxYzAzNCArIHNvZmYsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1udjk0X3Nvcl9kcF9kcnZfY3RsKHN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AsIHN0cnVjdCBkY2Jfb3V0cHV0ICpvdXRwLAotCQkgICAgaW50IGhlYWQsIGludCBsYW5lLCBpbnQgc3dpbmcsIGludCBwcmVlbSkKK252OTRfc29yX2RwX2xua19jdGwoc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwLCBpbnQgbnIsIGludCBidywgYm9vbCBlZikKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGRpc3ApOwotCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopZGlzcDsKLQljb25zdCB1MzIgc2hpZnQgPSBudjk0X3Nvcl9kcF9sYW5lX21hcChwcml2LCBsYW5lKTsKKwlzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYgPSAodm9pZCAqKW5vdXZlYXVfZGlzcChvdXRwKTsKKwljb25zdCB1MzIgc29mZiA9IG52OTRfc29yX3NvZmYob3V0cCk7CisJY29uc3QgdTMyIGxvZmYgPSBudjk0X3Nvcl9sb2ZmKG91dHApOworCXUzMiBkcGN0cmwgPSAweDAwMDAwMDAwOworCXUzMiBjbGtzb3IgPSAweDAwMDAwMDAwOworCisJZHBjdHJsIHw9ICgoMSA8PCBucikgLSAxKSA8PCAxNjsKKwlpZiAoZWYpCisJCWRwY3RybCB8PSAweDAwMDA0MDAwOworCWlmIChidyA+IDB4MDYpCisJCWNsa3NvciB8PSAweDAwMDQwMDAwOworCisJbnZfbWFzayhwcml2LCAweDYxNDMwMCArIHNvZmYsIDB4MDAwYzAwMDAsIGNsa3Nvcik7CisJbnZfbWFzayhwcml2LCAweDYxYzEwYyArIGxvZmYsIDB4MDAxZjQwMDAsIGRwY3RybCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252OTRfc29yX2RwX2Rydl9jdGwoc3RydWN0IG52a21fb3V0cHV0X2RwICpvdXRwLCBpbnQgbG4sIGludCB2cywgaW50IHBlLCBpbnQgcGMpCit7CisJc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilub3V2ZWF1X2Rpc3Aob3V0cCk7CisJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwcml2KTsKKwljb25zdCB1MzIgc2hpZnQgPSBudjk0X3Nvcl9kcF9sYW5lX21hcChwcml2LCBsbik7CiAJY29uc3QgdTMyIGxvZmYgPSBudjk0X3Nvcl9sb2ZmKG91dHApOwogCXUzMiBhZGRyLCBkYXRhWzNdOwogCXU4ICB2ZXIsIGhkciwgY250LCBsZW47CiAJc3RydWN0IG52Ymlvc19kcG91dCBpbmZvOwogCXN0cnVjdCBudmJpb3NfZHBjZmcgb2NmZzsKIAotCWFkZHIgPSBudmJpb3NfZHBvdXRfbWF0Y2goYmlvcywgb3V0cC0+aGFzaHQsIG91dHAtPmhhc2htLAorCWFkZHIgPSBudmJpb3NfZHBvdXRfbWF0Y2goYmlvcywgb3V0cC0+YmFzZS5pbmZvLmhhc2h0LAorCQkJCQlvdXRwLT5iYXNlLmluZm8uaGFzaG0sCiAJCQkJICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZpbmZvKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JYWRkciA9IG52Ymlvc19kcGNmZ19tYXRjaChiaW9zLCBhZGRyLCAwLCBzd2luZywgcHJlZW0sCisJYWRkciA9IG52Ymlvc19kcGNmZ19tYXRjaChiaW9zLCBhZGRyLCAwLCB2cywgcGUsCiAJCQkJICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZvY2ZnKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGF0YVswXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMTggKyBsb2ZmKSAmIH4oMHgwMDAwMDBmZiA8PCBzaGlmdCk7CiAJZGF0YVsxXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMjAgKyBsb2ZmKSAmIH4oMHgwMDAwMDBmZiA8PCBzaGlmdCk7Ci0JZGF0YVsyXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMzAgKyBsb2ZmKSAmIH4oMHgwMDAwZmYwMCk7Ci0JbnZfd3IzMihwcml2LCAweDYxYzExOCArIGxvZmYsIGRhdGFbMF0gfCAob2NmZy5kcnYgPDwgc2hpZnQpKTsKLQludl93cjMyKHByaXYsIDB4NjFjMTIwICsgbG9mZiwgZGF0YVsxXSB8IChvY2ZnLnByZSA8PCBzaGlmdCkpOwotCW52X3dyMzIocHJpdiwgMHg2MWMxMzAgKyBsb2ZmLCBkYXRhWzJdIHwgKG9jZmcudW5rIDw8IDgpKTsKKwlkYXRhWzJdID0gbnZfcmQzMihwcml2LCAweDYxYzEzMCArIGxvZmYpOworCWlmICgoZGF0YVsyXSAmIDB4MDAwMGZmMDApIDwgKG9jZmcudHhfcHUgPDwgOCkgfHwgbG4gPT0gMCkKKwkJZGF0YVsyXSA9IChkYXRhWzJdICYgfjB4MDAwMGZmMDApIHwgKG9jZmcudHhfcHUgPDwgOCk7CisJbnZfd3IzMihwcml2LCAweDYxYzExOCArIGxvZmYsIGRhdGFbMF0gfCAob2NmZy5kYyA8PCBzaGlmdCkpOworCW52X3dyMzIocHJpdiwgMHg2MWMxMjAgKyBsb2ZmLCBkYXRhWzFdIHwgKG9jZmcucGUgPDwgc2hpZnQpKTsKKwludl93cjMyKHByaXYsIDB4NjFjMTMwICsgbG9mZiwgZGF0YVsyXSB8IChvY2ZnLnR4X3B1IDw8IDgpKTsKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IG5vdXZlYXVfZHBfZnVuYwotbnY5NF9zb3JfZHBfZnVuYyA9IHsKK3N0cnVjdCBudmttX291dHB1dF9kcF9pbXBsCitudjk0X3Nvcl9kcF9pbXBsID0geworCS5iYXNlLmJhc2UuaGFuZGxlID0gRENCX09VVFBVVF9EUCwKKwkuYmFzZS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gX252a21fb3V0cHV0X2RwX2N0b3IsCisJCS5kdG9yID0gX252a21fb3V0cHV0X2RwX2R0b3IsCisJCS5pbml0ID0gX252a21fb3V0cHV0X2RwX2luaXQsCisJCS5maW5pID0gX252a21fb3V0cHV0X2RwX2ZpbmksCisJfSwKIAkucGF0dGVybiA9IG52OTRfc29yX2RwX3BhdHRlcm4sCisJLmxua19wd3IgPSBudjk0X3Nvcl9kcF9sbmtfcHdyLAogCS5sbmtfY3RsID0gbnY5NF9zb3JfZHBfbG5rX2N0bCwKIAkuZHJ2X2N0bCA9IG52OTRfc29yX2RwX2Rydl9jdGwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZGlzcC9zb3JudmQwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52ZDAuYwppbmRleCBkMmRmNTcyLi45N2YwZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52ZDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9kaXNwL3Nvcm52ZDAuYwpAQCAtMjksMTkgKzI5LDIwIEBACiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZGNiLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZHAuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9pbml0Lmg+CisjaW5jbHVkZSA8c3ViZGV2L3RpbWVyLmg+CiAKICNpbmNsdWRlICJudjUwLmgiCiAKIHN0YXRpYyBpbmxpbmUgdTMyCi1udmQwX3Nvcl9zb2ZmKHN0cnVjdCBkY2Jfb3V0cHV0ICpvdXRwKQorbnZkMF9zb3Jfc29mZihzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHApCiB7Ci0JcmV0dXJuIChmZnMob3V0cC0+b3IpIC0gMSkgKiAweDgwMDsKKwlyZXR1cm4gKGZmcyhvdXRwLT5iYXNlLmluZm8ub3IpIC0gMSkgKiAweDgwMDsKIH0KIAogc3RhdGljIGlubGluZSB1MzIKLW52ZDBfc29yX2xvZmYoc3RydWN0IGRjYl9vdXRwdXQgKm91dHApCitudmQwX3Nvcl9sb2ZmKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCkKIHsKLQlyZXR1cm4gbnZkMF9zb3Jfc29mZihvdXRwKSArICEob3V0cC0+c29yY29uZi5saW5rICYgMSkgKiAweDgwOworCXJldHVybiBudmQwX3Nvcl9zb2ZmKG91dHApICsgIShvdXRwLT5iYXNlLmluZm8uc29yY29uZi5saW5rICYgMSkgKiAweDgwOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMgpAQCAtNTIsNzcgKzUzLDgwIEBACiB9CiAKIHN0YXRpYyBpbnQKLW52ZDBfc29yX2RwX3BhdHRlcm4oc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCwgc3RydWN0IGRjYl9vdXRwdXQgKm91dHAsCi0JCSAgICBpbnQgaGVhZCwgaW50IHBhdHRlcm4pCitudmQwX3Nvcl9kcF9wYXR0ZXJuKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCwgaW50IHBhdHRlcm4pCiB7Ci0Jc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilkaXNwOworCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopbm91dmVhdV9kaXNwKG91dHApOwogCWNvbnN0IHUzMiBsb2ZmID0gbnZkMF9zb3JfbG9mZihvdXRwKTsKIAludl9tYXNrKHByaXYsIDB4NjFjMTEwICsgbG9mZiwgMHgwZjBmMGYwZiwgMHgwMTAxMDEwMSAqIHBhdHRlcm4pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1udmQwX3Nvcl9kcF9sbmtfY3RsKHN0cnVjdCBub3V2ZWF1X2Rpc3AgKmRpc3AsIHN0cnVjdCBkY2Jfb3V0cHV0ICpvdXRwLAotCQkgICAgaW50IGhlYWQsIGludCBsaW5rX25yLCBpbnQgbGlua19idywgYm9vbCBlbmhfZnJhbWUpCitudmQwX3Nvcl9kcF9sbmtfY3RsKHN0cnVjdCBudmttX291dHB1dF9kcCAqb3V0cCwgaW50IG5yLCBpbnQgYncsIGJvb2wgZWYpCiB7Ci0Jc3RydWN0IG52NTBfZGlzcF9wcml2ICpwcml2ID0gKHZvaWQgKilkaXNwOworCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopbm91dmVhdV9kaXNwKG91dHApOwogCWNvbnN0IHUzMiBzb2ZmID0gbnZkMF9zb3Jfc29mZihvdXRwKTsKIAljb25zdCB1MzIgbG9mZiA9IG52ZDBfc29yX2xvZmYob3V0cCk7CiAJdTMyIGRwY3RybCA9IDB4MDAwMDAwMDA7CiAJdTMyIGNsa3NvciA9IDB4MDAwMDAwMDA7Ci0JdTMyIGxhbmUgPSAwOwotCWludCBpOwogCi0JY2xrc29yIHw9IGxpbmtfYncgPDwgMTg7Ci0JZHBjdHJsIHw9ICgoMSA8PCBsaW5rX25yKSAtIDEpIDw8IDE2OwotCWlmIChlbmhfZnJhbWUpCisJY2xrc29yIHw9IGJ3IDw8IDE4OworCWRwY3RybCB8PSAoKDEgPDwgbnIpIC0gMSkgPDwgMTY7CisJaWYgKGVmKQogCQlkcGN0cmwgfD0gMHgwMDAwNDAwMDsKIAotCWZvciAoaSA9IDA7IGkgPCBsaW5rX25yOyBpKyspCi0JCWxhbmUgfD0gMSA8PCAobnZkMF9zb3JfZHBfbGFuZV9tYXAocHJpdiwgaSkgPj4gMyk7Ci0KIAludl9tYXNrKHByaXYsIDB4NjEyMzAwICsgc29mZiwgMHgwMDdjMDAwMCwgY2xrc29yKTsKIAludl9tYXNrKHByaXYsIDB4NjFjMTBjICsgbG9mZiwgMHgwMDFmNDAwMCwgZHBjdHJsKTsKLQludl9tYXNrKHByaXYsIDB4NjFjMTMwICsgbG9mZiwgMHgwMDAwMDAwZiwgbGFuZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLW52ZDBfc29yX2RwX2Rydl9jdGwoc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCwgc3RydWN0IGRjYl9vdXRwdXQgKm91dHAsCi0JCSAgICBpbnQgaGVhZCwgaW50IGxhbmUsIGludCBzd2luZywgaW50IHByZWVtKQorbnZkMF9zb3JfZHBfZHJ2X2N0bChzdHJ1Y3QgbnZrbV9vdXRwdXRfZHAgKm91dHAsIGludCBsbiwgaW50IHZzLCBpbnQgcGUsIGludCBwYykKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGRpc3ApOwotCXN0cnVjdCBudjUwX2Rpc3BfcHJpdiAqcHJpdiA9ICh2b2lkICopZGlzcDsKLQljb25zdCB1MzIgc2hpZnQgPSBudmQwX3Nvcl9kcF9sYW5lX21hcChwcml2LCBsYW5lKTsKKwlzdHJ1Y3QgbnY1MF9kaXNwX3ByaXYgKnByaXYgPSAodm9pZCAqKW5vdXZlYXVfZGlzcChvdXRwKTsKKwlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKHByaXYpOworCWNvbnN0IHUzMiBzaGlmdCA9IG52ZDBfc29yX2RwX2xhbmVfbWFwKHByaXYsIGxuKTsKIAljb25zdCB1MzIgbG9mZiA9IG52ZDBfc29yX2xvZmYob3V0cCk7Ci0JdTMyIGFkZHIsIGRhdGFbM107CisJdTMyIGFkZHIsIGRhdGFbNF07CiAJdTggIHZlciwgaGRyLCBjbnQsIGxlbjsKIAlzdHJ1Y3QgbnZiaW9zX2Rwb3V0IGluZm87CiAJc3RydWN0IG52Ymlvc19kcGNmZyBvY2ZnOwogCi0JYWRkciA9IG52Ymlvc19kcG91dF9tYXRjaChiaW9zLCBvdXRwLT5oYXNodCwgb3V0cC0+aGFzaG0sCisJYWRkciA9IG52Ymlvc19kcG91dF9tYXRjaChiaW9zLCBvdXRwLT5iYXNlLmluZm8uaGFzaHQsCisJCQkJCW91dHAtPmJhc2UuaW5mby5oYXNobSwKIAkJCQkgJnZlciwgJmhkciwgJmNudCwgJmxlbiwgJmluZm8pOwogCWlmICghYWRkcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlhZGRyID0gbnZiaW9zX2RwY2ZnX21hdGNoKGJpb3MsIGFkZHIsIDAsIHN3aW5nLCBwcmVlbSwKKwlhZGRyID0gbnZiaW9zX2RwY2ZnX21hdGNoKGJpb3MsIGFkZHIsIHBjLCB2cywgcGUsCiAJCQkJICZ2ZXIsICZoZHIsICZjbnQsICZsZW4sICZvY2ZnKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGF0YVswXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMTggKyBsb2ZmKSAmIH4oMHgwMDAwMDBmZiA8PCBzaGlmdCk7CiAJZGF0YVsxXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMjAgKyBsb2ZmKSAmIH4oMHgwMDAwMDBmZiA8PCBzaGlmdCk7Ci0JZGF0YVsyXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMzAgKyBsb2ZmKSAmIH4oMHgwMDAwZmYwMCk7Ci0JbnZfd3IzMihwcml2LCAweDYxYzExOCArIGxvZmYsIGRhdGFbMF0gfCAob2NmZy5kcnYgPDwgc2hpZnQpKTsKLQludl93cjMyKHByaXYsIDB4NjFjMTIwICsgbG9mZiwgZGF0YVsxXSB8IChvY2ZnLnByZSA8PCBzaGlmdCkpOwotCW52X3dyMzIocHJpdiwgMHg2MWMxMzAgKyBsb2ZmLCBkYXRhWzJdIHwgKG9jZmcudW5rIDw8IDgpKTsKLQludl9tYXNrKHByaXYsIDB4NjFjMTNjICsgbG9mZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJZGF0YVsyXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxMzAgKyBsb2ZmKTsKKwlpZiAoKGRhdGFbMl0gJiAweDAwMDBmZjAwKSA8IChvY2ZnLnR4X3B1IDw8IDgpIHx8IGxuID09IDApCisJCWRhdGFbMl0gPSAoZGF0YVsyXSAmIH4weDAwMDBmZjAwKSB8IChvY2ZnLnR4X3B1IDw8IDgpOworCW52X3dyMzIocHJpdiwgMHg2MWMxMTggKyBsb2ZmLCBkYXRhWzBdIHwgKG9jZmcuZGMgPDwgc2hpZnQpKTsKKwludl93cjMyKHByaXYsIDB4NjFjMTIwICsgbG9mZiwgZGF0YVsxXSB8IChvY2ZnLnBlIDw8IHNoaWZ0KSk7CisJbnZfd3IzMihwcml2LCAweDYxYzEzMCArIGxvZmYsIGRhdGFbMl0gfCAob2NmZy50eF9wdSA8PCA4KSk7CisJZGF0YVszXSA9IG52X3JkMzIocHJpdiwgMHg2MWMxM2MgKyBsb2ZmKSAmIH4oMHgwMDAwMDBmZiA8PCBzaGlmdCk7CisJbnZfd3IzMihwcml2LCAweDYxYzEzYyArIGxvZmYsIGRhdGFbM10gfCAob2NmZy5wYyA8PCBzaGlmdCkpOwogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3Qgbm91dmVhdV9kcF9mdW5jCi1udmQwX3Nvcl9kcF9mdW5jID0geworc3RydWN0IG52a21fb3V0cHV0X2RwX2ltcGwKK252ZDBfc29yX2RwX2ltcGwgPSB7CisJLmJhc2UuYmFzZS5oYW5kbGUgPSBEQ0JfT1VUUFVUX0RQLAorCS5iYXNlLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbnZrbV9vdXRwdXRfZHBfY3RvciwKKwkJLmR0b3IgPSBfbnZrbV9vdXRwdXRfZHBfZHRvciwKKwkJLmluaXQgPSBfbnZrbV9vdXRwdXRfZHBfaW5pdCwKKwkJLmZpbmkgPSBfbnZrbV9vdXRwdXRfZHBfZmluaSwKKwl9LAogCS5wYXR0ZXJuID0gbnZkMF9zb3JfZHBfcGF0dGVybiwKKwkubG5rX3B3ciA9IG52OTRfc29yX2RwX2xua19wd3IsCiAJLmxua19jdGwgPSBudmQwX3Nvcl9kcF9sbmtfY3RsLAogCS5kcnZfY3RsID0gbnZkMF9zb3JfZHBfZHJ2X2N0bCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vYmFzZS5jCmluZGV4IDZmOTA0MWMuLjU2ZWQzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vYmFzZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vYmFzZS5jCkBAIC05MSw3ICs5MSw3IEBACiAJaWYgKCFjaGFuLT51c2VyKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5jZXZlbnQsIDApOworCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5jZXZlbnQsIDEsIDApOwogCiAJY2hhbi0+c2l6ZSA9IHNpemU7CiAJcmV0dXJuIDA7CkBAIC0xOTQsMTEgKzE5NCwxMSBAQAogCWlmICghcHJpdi0+Y2hhbm5lbCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBub3V2ZWF1X2V2ZW50X2NyZWF0ZSgxLCAmcHJpdi0+Y2V2ZW50KTsKKwlyZXQgPSBub3V2ZWF1X2V2ZW50X2NyZWF0ZSgxLCAxLCAmcHJpdi0+Y2V2ZW50KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbm91dmVhdV9ldmVudF9jcmVhdGUoMSwgJnByaXYtPnVldmVudCk7CisJcmV0ID0gbm91dmVhdV9ldmVudF9jcmVhdGUoMSwgMSwgJnByaXYtPnVldmVudCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9nazIwYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9nazIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzQ1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL2drMjBhLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgIm52ZTAuaCIKKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK2drMjBhX2ZpZm9fb2NsYXNzID0gJihzdHJ1Y3QgbnZlMF9maWZvX2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9FTkdJTkUoRklGTywgMHhlYSksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBudmUwX2ZpZm9fY3RvciwKKwkJLmR0b3IgPSBudmUwX2ZpZm9fZHRvciwKKwkJLmluaXQgPSBudmUwX2ZpZm9faW5pdCwKKwkJLmZpbmkgPSBudmUwX2ZpZm9fZmluaSwKKwl9LAorCS5jaGFubmVscyA9IDEyOCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udjA0LmMKaW5kZXggNTRmMjZjYy4uYzYxYjE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udjA0LmMKQEAgLTUzOSw3ICs1MzksNyBAQAogCQkJfQogCiAJCQlpZiAoc3RhdHVzICYgMHg0MDAwMDAwMCkgewotCQkJCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5iYXNlLnVldmVudCwgMCk7CisJCQkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UudWV2ZW50LCAxLCAwKTsKIAkJCQludl93cjMyKHByaXYsIDB4MDAyMTAwLCAweDQwMDAwMDAwKTsKIAkJCQlzdGF0dXMgJj0gfjB4NDAwMDAwMDA7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252ODQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnY4NC5jCmluZGV4IGZlMGY0MWUuLjZlNWFjMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnY4NC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnY4NC5jCkBAIC0zODksMTQgKzM4OSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLW52ODRfZmlmb191ZXZlbnRfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGluZGV4KQorbnY4NF9maWZvX3VldmVudF9lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgdHlwZSwgaW50IGluZGV4KQogewogCXN0cnVjdCBudjg0X2ZpZm9fcHJpdiAqcHJpdiA9IGV2ZW50LT5wcml2OwogCW52X21hc2socHJpdiwgMHgwMDIxNDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDApOwogfQogCiBzdGF0aWMgdm9pZAotbnY4NF9maWZvX3VldmVudF9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGluZGV4KQorbnY4NF9maWZvX3VldmVudF9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IHR5cGUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgbnY4NF9maWZvX3ByaXYgKnByaXYgPSBldmVudC0+cHJpdjsKIAludl9tYXNrKHByaXYsIDB4MDAyMTQwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZjMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKaW5kZXggZmExZTcxOS4uYWU0YTRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZmlmby9udmMwLmMKQEAgLTczMCw3ICs3MzAsNyBAQAogCWZvciAodW5rbiA9IDA7IHVua24gPCA4OyB1bmtuKyspIHsKIAkJdTMyIGludHMgPSAoaW50ciA+PiAodW5rbiAqIDB4MDQpKSAmIGludGU7CiAJCWlmIChpbnRzICYgMHgxKSB7Ci0JCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS51ZXZlbnQsIDApOworCQkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UudWV2ZW50LCAxLCAwKTsKIAkJCWludHMgJj0gfjE7CiAJCX0KIAkJaWYgKGludHMpIHsKQEAgLTgyNywxNCArODI3LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1udmMwX2ZpZm9fdWV2ZW50X2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBpbmRleCkKK252YzBfZmlmb191ZXZlbnRfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IHR5cGUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgbnZjMF9maWZvX3ByaXYgKnByaXYgPSBldmVudC0+cHJpdjsKIAludl9tYXNrKHByaXYsIDB4MDAyMTQwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKTsKIH0KIAogc3RhdGljIHZvaWQKLW52YzBfZmlmb191ZXZlbnRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBpbmRleCkKK252YzBfZmlmb191ZXZlbnRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IG52YzBfZmlmb19wcml2ICpwcml2ID0gZXZlbnQtPnByaXY7CiAJbnZfbWFzayhwcml2LCAweDAwMjE0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252ZTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5jCmluZGV4IGE5YTFhOWMuLjI5ODA2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5jCkBAIC04NTksNyArODU5LDcgQEAKIHN0YXRpYyB2b2lkCiBudmUwX2ZpZm9faW50cl9lbmdpbmUoc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2KQogewotCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihwcml2LT5iYXNlLnVldmVudCwgMCk7CisJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UudWV2ZW50LCAxLCAwKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTk1MiwxNCArOTUyLDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1udmUwX2ZpZm9fdWV2ZW50X2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBpbmRleCkKK252ZTBfZmlmb191ZXZlbnRfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IHR5cGUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgbnZlMF9maWZvX3ByaXYgKnByaXYgPSBldmVudC0+cHJpdjsKIAludl9tYXNrKHByaXYsIDB4MDAyMTQwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKTsKIH0KIAogc3RhdGljIHZvaWQKLW52ZTBfZmlmb191ZXZlbnRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBpbmRleCkKK252ZTBfZmlmb191ZXZlbnRfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IG52ZTBfZmlmb19wcml2ICpwcml2ID0gZXZlbnQtPnByaXY7CiAJbnZfbWFzayhwcml2LCAweDAwMjE0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9maWZvL252ZTAuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5oCmluZGV4IDAxNDM0NGUuLmU5NmIzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2ZpZm8vbnZlMC5oCkBAIC04LDYgKzgsNyBAQAogCQkgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqKTsKIHZvaWQgbnZlMF9maWZvX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOwogaW50ICBudmUwX2ZpZm9faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIG52ZTBfZmlmb19maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKIAogc3RydWN0IG52ZTBfZmlmb19pbXBsIHsKIAlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eGdrMjBhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhnazIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGVlMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4Z2syMGEuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3R4bnZjMC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG52YzBfZ3JhcGhfcGFjaworZ2syMGFfZ3JjdHhfcGFja19tdGhkW10gPSB7CisJeyBudmU0X2dyY3R4X2luaXRfYTA5N18wLCAweGEyOTcgfSwKKwl7IG52YzBfZ3JjdHhfaW5pdF85MDJkXzAsIDB4OTAyZCB9LAorCXt9Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorZ2syMGFfZ3JjdHhfb2NsYXNzID0gJihzdHJ1Y3QgbnZjMF9ncmN0eF9vY2xhc3MpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9FTkdDVFgoR1IsIDB4ZWEpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gbnZjMF9ncmFwaF9jb250ZXh0X2N0b3IsCisJCS5kdG9yID0gbnZjMF9ncmFwaF9jb250ZXh0X2R0b3IsCisJCS5pbml0ID0gX25vdXZlYXVfZ3JhcGhfY29udGV4dF9pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2dyYXBoX2NvbnRleHRfZmluaSwKKwkJLnJkMzIgPSBfbm91dmVhdV9ncmFwaF9jb250ZXh0X3JkMzIsCisJCS53cjMyID0gX25vdXZlYXVfZ3JhcGhfY29udGV4dF93cjMyLAorCX0sCisJLm1haW4gID0gbnZlNF9ncmN0eF9nZW5lcmF0ZV9tYWluLAorCS5tb2RzICA9IG52ZTRfZ3JjdHhfZ2VuZXJhdGVfbW9kcywKKwkudW5rbiAgPSBudmU0X2dyY3R4X2dlbmVyYXRlX3Vua24sCisJLmh1YiAgID0gbnZlNF9ncmN0eF9wYWNrX2h1YiwKKwkuZ3BjICAgPSBudmU0X2dyY3R4X3BhY2tfZ3BjLAorCS56Y3VsbCA9IG52YzBfZ3JjdHhfcGFja196Y3VsbCwKKwkudHBjICAgPSBudmU0X2dyY3R4X3BhY2tfdHBjLAorCS5wcGMgICA9IG52ZTRfZ3JjdHhfcGFja19wcGMsCisJLmljbWQgID0gbnZlNF9ncmN0eF9wYWNrX2ljbWQsCisJLm10aGQgID0gZ2syMGFfZ3JjdHhfcGFja19tdGhkLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnYxMDguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52MTA4LmMKaW5kZXggNDgzNTFiNC4uOGRlNGE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnYxMDguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudjEwOC5jCkBAIC01NDUsMTAgKzU0NSwxMiBAQAogCW1taW9fbGlzdCgweDQwODAxMCwgMHg4MDAwMDAwMCwgIDAsIDApOwogCW1taW9fbGlzdCgweDQxOTAwNCwgMHgwMDAwMDAwMCwgIDgsIDEpOwogCW1taW9fbGlzdCgweDQxOTAwOCwgMHgwMDAwMDAwMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQwNjRjYywgMHg4MDAwMDAwMCwgIDAsIDApOwogCW1taW9fbGlzdCgweDQwODAwNCwgMHgwMDAwMDAwMCwgIDgsIDApOwogCW1taW9fbGlzdCgweDQwODAwOCwgMHg4MDAwMDAzMCwgIDAsIDApOwogCW1taW9fbGlzdCgweDQxODgwOCwgMHgwMDAwMDAwMCwgIDgsIDApOwogCW1taW9fbGlzdCgweDQxODgwYywgMHg4MDAwMDAzMCwgIDAsIDApOworCW1taW9fbGlzdCgweDQwNjRjOCwgMHgwMGMyMDIwMCwgIDAsIDApOwogCW1taW9fbGlzdCgweDQxODgxMCwgMHg4MDAwMDAwMCwgMTIsIDIpOwogCW1taW9fbGlzdCgweDQxOTg0OCwgMHgxMDAwMDAwMCwgMTIsIDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmMwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmMwLmgKaW5kZXggOWM4MTVkMS4uOGRhOGI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZjMC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52YzAuaApAQCAtNjksNyArNjksOSBAQAogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZkOV9ncmN0eF9vY2xhc3M7CiAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZTRfZ3JjdHhfb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqZ2syMGFfZ3JjdHhfb2NsYXNzOwogdm9pZCBudmU0X2dyY3R4X2dlbmVyYXRlX21haW4oc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqLCBzdHJ1Y3QgbnZjMF9ncmN0eCAqKTsKK3ZvaWQgbnZlNF9ncmN0eF9nZW5lcmF0ZV9tb2RzKHN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKiwgc3RydWN0IG52YzBfZ3JjdHggKik7CiB2b2lkIG52ZTRfZ3JjdHhfZ2VuZXJhdGVfdW5rbihzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICopOwogdm9pZCBudmU0X2dyY3R4X2dlbmVyYXRlX3I0MThiYjgoc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqKTsKIApAQCAtMTUxLDYgKzE1MywxMyBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmU0X2dyY3R4X2luaXRfcGVzXzBbXTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmN0eF9wYWNrX2h1YltdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmN0eF9wYWNrX2dwY1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmN0eF9wYWNrX3RwY1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmN0eF9wYWNrX3BwY1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmN0eF9wYWNrX2ljbWRbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0IG52ZTRfZ3JjdHhfaW5pdF9hMDk3XzBbXTsKKwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZmMF9ncmN0eF9wYWNrX210aGRbXTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX2luaXQgbnZmMF9ncmN0eF9pbml0X3ByaV8wW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmU0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmU0LmMKaW5kZXggNDlhMTRiMS4uYzViMjQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZlNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52ZTQuYwpAQCAtMjcyLDEzICsyNzIsMTMgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKK2NvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKIG52ZTRfZ3JjdHhfcGFja19pY21kW10gPSB7CiAJeyBudmU0X2dyY3R4X2luaXRfaWNtZF8wIH0sCiAJe30KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0Citjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0CiBudmU0X2dyY3R4X2luaXRfYTA5N18wW10gPSB7CiAJeyAweDAwMDgwMCwgICA4LCAweDQwLCAweDAwMDAwMDAwIH0sCiAJeyAweDAwMDgwNCwgICA4LCAweDQwLCAweDAwMDAwMDAwIH0sCkBAIC02OTcsNyArNjk3LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKK2NvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKIG52ZTRfZ3JjdHhfcGFja19odWJbXSA9IHsKIAl7IG52YzBfZ3JjdHhfaW5pdF9tYWluXzAgfSwKIAl7IG52ZTRfZ3JjdHhfaW5pdF9mZV8wIH0sCkBAIC03MzcsNyArNzM3LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKK2NvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKIG52ZTRfZ3JjdHhfcGFja19ncGNbXSA9IHsKIAl7IG52YzBfZ3JjdHhfaW5pdF9ncGNfdW5rXzAgfSwKIAl7IG52ZDlfZ3JjdHhfaW5pdF9wcm9wXzAgfSwKQEAgLTgwMiw3ICs4MDIsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG52YzBfZ3JhcGhfcGFjaworY29uc3Qgc3RydWN0IG52YzBfZ3JhcGhfcGFjawogbnZlNF9ncmN0eF9wYWNrX3RwY1tdID0gewogCXsgbnZkN19ncmN0eF9pbml0X3BlXzAgfSwKIAl7IG52ZTRfZ3JjdHhfaW5pdF90ZXhfMCB9LApAQCAtODI2LDcgKzgyNiw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9wYWNrCitjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9wYWNrCiBudmU0X2dyY3R4X3BhY2tfcHBjW10gPSB7CiAJeyBudmU0X2dyY3R4X2luaXRfcGVzXzAgfSwKIAl7IG52ZTRfZ3JjdHhfaW5pdF9jYm1fMCB9LApAQCAtODM4LDcgKzgzOCw3IEBACiAgKiBQR1JBUEggY29udGV4dCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKK3ZvaWQKIG52ZTRfZ3JjdHhfZ2VuZXJhdGVfbW9kcyhzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2LCBzdHJ1Y3QgbnZjMF9ncmN0eCAqaW5mbykKIHsKIAl1MzIgbWFnaWNbR1BDX01BWF1bMl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmYwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9jdHhudmYwLmMKaW5kZXggMGZhYjk1ZS4uZGVjMDNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvY3R4bnZmMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL2N0eG52ZjAuYwpAQCAtODQyLDcgKzg0Miw3IEBACiAJCXUxNiBtYWdpYzMgPSAweDA2NDg7CiAJCW1hZ2ljW2dwY11bMF0gID0gMHgxMDAwMDAwMCB8IChtYWdpYzAgPDwgMTYpIHwgb2Zmc2V0OwogCQltYWdpY1tncGNdWzFdICA9IDB4MDAwMDAwMDAgfCAobWFnaWMxIDw8IDE2KTsKLQkJb2Zmc2V0ICs9IDB4MDMyNCAqIChwcml2LT50cGNfbnJbZ3BjXSAtIDEpOzsKKwkJb2Zmc2V0ICs9IDB4MDMyNCAqIChwcml2LT50cGNfbnJbZ3BjXSAtIDEpOwogCQltYWdpY1tncGNdWzJdICA9IDB4MTAwMDAwMDAgfCAobWFnaWMyIDw8IDE2KSB8IG9mZnNldDsKIAkJbWFnaWNbZ3BjXVszXSAgPSAweDAwMDAwMDAwIHwgKG1hZ2ljMyA8PCAxNik7CiAJCW9mZnNldCArPSAweDAzMjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9nazIwYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZ2syMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA0OGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvZ2syMGEuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAibnZjMC5oIgorI2luY2x1ZGUgImN0eG52YzAuaCIKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X29jbGFzcworZ2syMGFfZ3JhcGhfc2NsYXNzW10gPSB7CisJeyAweDkwMmQsICZub3V2ZWF1X29iamVjdF9vZnVuY3MgfSwKKwl7IDB4YTA0MCwgJm5vdXZlYXVfb2JqZWN0X29mdW5jcyB9LAorCXsgMHhhMjk3LCAmbm91dmVhdV9vYmplY3Rfb2Z1bmNzIH0sCisJeyAweGEwYzAsICZub3V2ZWF1X29iamVjdF9vZnVuY3MgfSwKKwl7fQorfTsKKworc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK2drMjBhX2dyYXBoX29jbGFzcyA9ICYoc3RydWN0IG52YzBfZ3JhcGhfb2NsYXNzKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfRU5HSU5FKEdSLCAweGVhKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52YzBfZ3JhcGhfY3RvciwKKwkJLmR0b3IgPSBudmMwX2dyYXBoX2R0b3IsCisJCS5pbml0ID0gbnZlNF9ncmFwaF9pbml0LAorCQkuZmluaSA9IG52ZTRfZ3JhcGhfZmluaSwKKwl9LAorCS5jY2xhc3MgPSAmZ2syMGFfZ3JjdHhfb2NsYXNzLAorCS5zY2xhc3MgPSBnazIwYV9ncmFwaF9zY2xhc3MsCisJLm1taW8gPSBudmU0X2dyYXBoX3BhY2tfbW1pbywKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252NTAuYwppbmRleCAyYzc4MDllLi4xYTJkNTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udjUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnY1MC5jCkBAIC05MDEsNyArOTAxLDcgQEAKIAkJbnZfZW5naW5lKHByaXYpLT5zY2xhc3MgPSBudmFmX2dyYXBoX3NjbGFzczsKIAkJYnJlYWs7CiAKLQl9OworCX0KIAogCS8qIHVuZm9ydHVuYXRlIGh3IGJ1ZyB3b3JrYXJvdW5kLi4uICovCiAJaWYgKG52X2RldmljZShwcml2KS0+Y2hpcHNldCAhPSAweDUwICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmMKaW5kZXggZjNjNzMyOS4uYmY3YmRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252YzAuYwpAQCAtODk0LDYgKzg5NCwxMCBAQAogCQkJbnZfd3IzMihwcml2LCBmdWNfYmFzZSArIDB4MDE4OCwgaSA+PiA2KTsKIAkJbnZfd3IzMihwcml2LCBmdWNfYmFzZSArIDB4MDE4NCwgY29kZS0+ZGF0YVtpXSk7CiAJfQorCisJLyogY29kZSBtdXN0IGJlIHBhZGRlZCB0byAweDQwIHdvcmRzICovCisJZm9yICg7IGkgJiAweDNmOyBpKyspCisJCW52X3dyMzIocHJpdiwgZnVjX2Jhc2UgKyAweDAxODQsIDApOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTI1OSwxMCArMTI2MywxNCBAQAogCXN0cnVjdCBudmMwX2dyYXBoX29jbGFzcyAqb2NsYXNzID0gKHZvaWQgKiliY2xhc3M7CiAJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXZpY2UgPSBudl9kZXZpY2UocGFyZW50KTsKIAlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2OworCWJvb2wgdXNlX2V4dF9mdywgZW5hYmxlOwogCWludCByZXQsIGk7CiAKLQlyZXQgPSBub3V2ZWF1X2dyYXBoX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgYmNsYXNzLAotCQkJCSAgIChvY2xhc3MtPmZlY3MudWNvZGUgIT0gTlVMTCksICZwcml2KTsKKwl1c2VfZXh0X2Z3ID0gbm91dmVhdV9ib29sb3B0KGRldmljZS0+Y2Znb3B0LCAiTnZHclVzZUZXIiwKKwkJCQkgICAgIG9jbGFzcy0+ZmVjcy51Y29kZSA9PSBOVUxMKTsKKwllbmFibGUgPSB1c2VfZXh0X2Z3IHx8IG9jbGFzcy0+ZmVjcy51Y29kZSAhPSBOVUxMOworCisJcmV0ID0gbm91dmVhdV9ncmFwaF9jcmVhdGUocGFyZW50LCBlbmdpbmUsIGJjbGFzcywgZW5hYmxlLCAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTEyNzIsNyArMTI4MCw3IEBACiAKIAlwcml2LT5iYXNlLnVuaXRzID0gbnZjMF9ncmFwaF91bml0czsKIAotCWlmIChub3V2ZWF1X2Jvb2xvcHQoZGV2aWNlLT5jZmdvcHQsICJOdkdyVXNlRlciLCBmYWxzZSkpIHsKKwlpZiAodXNlX2V4dF9mdykgewogCQludl9pbmZvKHByaXYsICJ1c2luZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CiAJCWlmIChudmMwX2dyYXBoX2N0b3JfZncocHJpdiwgImZ1YzQwOWMiLCAmcHJpdi0+ZnVjNDA5YykgfHwKIAkJICAgIG52YzBfZ3JhcGhfY3Rvcl9mdyhwcml2LCAiZnVjNDA5ZCIsICZwcml2LT5mdWM0MDlkKSB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZjMC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZjMC5oCmluZGV4IDkwZDQ0NjEuLjc1MjAzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252YzAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmMwLmgKQEAgLTExNiw2ICsxMTYsNyBAQAogCQkgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7CiB2b2lkIG52YzBfZ3JhcGhfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CiBpbnQgIG52YzBfZ3JhcGhfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIG52ZTRfZ3JhcGhfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgYm9vbCk7CiBpbnQgIG52ZTRfZ3JhcGhfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CiAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnZjMF9ncmFwaF9zY2xhc3NbXTsKQEAgLTIxNyw2ICsyMTgsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX2luaXQgbnZlNF9ncmFwaF9pbml0X3RwY2NzXzBbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0IG52ZTRfZ3JhcGhfaW5pdF9wZV8wW107CiBleHRlcm4gY29uc3Qgc3RydWN0IG52YzBfZ3JhcGhfaW5pdCBudmU0X2dyYXBoX2luaXRfYmVfMFtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sgbnZlNF9ncmFwaF9wYWNrX21taW9bXTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX2luaXQgbnZmMF9ncmFwaF9pbml0X2ZlXzBbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbnZjMF9ncmFwaF9pbml0IG52ZjBfZ3JhcGhfaW5pdF9za2VkXzBbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252ZTQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL2dyYXBoL252ZTQuYwppbmRleCBmN2MwMTEyLi41MWUwYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9ncmFwaC9udmU0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvZ3JhcGgvbnZlNC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKK2NvbnN0IHN0cnVjdCBudmMwX2dyYXBoX3BhY2sKIG52ZTRfZ3JhcGhfcGFja19tbWlvW10gPSB7CiAJeyBudmU0X2dyYXBoX2luaXRfbWFpbl8wIH0sCiAJeyBudmMwX2dyYXBoX2luaXRfZmVfMCB9LApAQCAtMTg5LDcgKzE4OSw3IEBACiAgKiBQR1JBUEggZW5naW5lL3N1YmRldiBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQKK2ludAogbnZlNF9ncmFwaF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCiB7CiAJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvc29mdHdhcmUvbnY1MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvc29mdHdhcmUvbnY1MC5jCmluZGV4IDVjZTY4NmUuLmYzYjRkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL3NvZnR3YXJlL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9zb2Z0d2FyZS9udjUwLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludAotbnY1MF9zb2Z0d2FyZV92YmxzZW1fcmVsZWFzZSh2b2lkICpkYXRhLCBpbnQgaGVhZCkKK252NTBfc29mdHdhcmVfdmJsc2VtX3JlbGVhc2Uodm9pZCAqZGF0YSwgdTMyIHR5cGUsIGludCBoZWFkKQogewogCXN0cnVjdCBudjUwX3NvZnR3YXJlX2NoYW4gKmNoYW4gPSBkYXRhOwogCXN0cnVjdCBudjUwX3NvZnR3YXJlX3ByaXYgKnByaXYgPSAodm9pZCAqKW52X29iamVjdChjaGFuKS0+ZW5naW5lOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IGNoYW4tPnZibGFuay5ucl9ldmVudDsgaSsrKSB7Ci0JCXJldCA9IG5vdXZlYXVfZXZlbnRfbmV3KHBkaXNwLT52YmxhbmssIGksIHBjbGFzcy0+dmJsYW5rLAorCQlyZXQgPSBub3V2ZWF1X2V2ZW50X25ldyhwZGlzcC0+dmJsYW5rLCAxLCBpLCBwY2xhc3MtPnZibGFuaywKIAkJCQkJY2hhbiwgJmNoYW4tPnZibGFuay5ldmVudFtpXSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvc29mdHdhcmUvbnY1MC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvc29mdHdhcmUvbnY1MC5oCmluZGV4IDJkZTM3MGMuLmJiNDlhN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL3NvZnR3YXJlL252NTAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9zb2Z0d2FyZS9udjUwLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RydWN0IG52NTBfc29mdHdhcmVfY2NsYXNzIHsKIAlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgYmFzZTsKLQlpbnQgKCp2YmxhbmspKHZvaWQgKiwgaW50KTsKKwlpbnQgKCp2YmxhbmspKHZvaWQgKiwgdTMyLCBpbnQpOwogfTsKIAogc3RydWN0IG52NTBfc29mdHdhcmVfY2hhbiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9zb2Z0d2FyZS9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2VuZ2luZS9zb2Z0d2FyZS9udmMwLmMKaW5kZXggZjk0MzBjMS4uMTM1YzIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9lbmdpbmUvc29mdHdhcmUvbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvZW5naW5lL3NvZnR3YXJlL252YzAuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50Ci1udmMwX3NvZnR3YXJlX3ZibHNlbV9yZWxlYXNlKHZvaWQgKmRhdGEsIGludCBoZWFkKQorbnZjMF9zb2Z0d2FyZV92YmxzZW1fcmVsZWFzZSh2b2lkICpkYXRhLCB1MzIgdHlwZSwgaW50IGhlYWQpCiB7CiAJc3RydWN0IG52NTBfc29mdHdhcmVfY2hhbiAqY2hhbiA9IGRhdGE7CiAJc3RydWN0IG52NTBfc29mdHdhcmVfcHJpdiAqcHJpdiA9ICh2b2lkICopbnZfb2JqZWN0KGNoYW4pLT5lbmdpbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvY29yZS9jbGFzcy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvY2xhc3MuaAppbmRleCA5YzBjZDczLi5lMGM4MTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvY29yZS9jbGFzcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9jb3JlL2NsYXNzLmgKQEAgLTI5NSw2ICsyOTUsMTAgQEAKICNkZWZpbmUgTlY4NF9ESVNQX1NPUl9IRE1JX1BXUl9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN2YKICNkZWZpbmUgTlY1MF9ESVNQX1NPUl9MVkRTX1NDUklQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTMwMDAKICNkZWZpbmUgTlY1MF9ESVNQX1NPUl9MVkRTX1NDUklQVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgTlY5NF9ESVNQX1NPUl9EUF9QV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTYwMDAKKyNkZWZpbmUgTlY5NF9ESVNQX1NPUl9EUF9QV1JfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY5NF9ESVNQX1NPUl9EUF9QV1JfU1RBVEVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY5NF9ESVNQX1NPUl9EUF9QV1JfU1RBVEVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKIAogI2RlZmluZSBOVjUwX0RJU1BfREFDX01USEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSBOVjUwX0RJU1BfREFDX01USERfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZjAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvZXZlbnQuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9jb3JlL2V2ZW50LmgKaW5kZXggNWQ1MzllYi4uYmEzZjFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2NvcmUvZXZlbnQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvY29yZS9ldmVudC5oCkBAIC0xMiwzMiArMTIsMzMgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHR5cGVzOwogCWludCBpbmRleDsKLQlpbnQgKCpmdW5jKSh2b2lkICosIGludCk7CisJaW50ICgqZnVuYykodm9pZCAqLCB1MzIsIGludCk7CiAJdm9pZCAqcHJpdjsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X2V2ZW50IHsKLQlzcGlubG9ja190IGxpc3RfbG9jazsKLQlzcGlubG9ja190IHJlZnNfbG9jazsKLQogCXZvaWQgKnByaXY7Ci0Jdm9pZCAoKmVuYWJsZSkoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgaW50IGluZGV4KTsKLQl2b2lkICgqZGlzYWJsZSkoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgaW50IGluZGV4KTsKKwlpbnQgKCpjaGVjaykoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgdTMyIHR5cGUsIGludCBpbmRleCk7CisJdm9pZCAoKmVuYWJsZSkoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgaW50IHR5cGUsIGludCBpbmRleCk7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICosIGludCB0eXBlLCBpbnQgaW5kZXgpOwogCisJaW50IHR5cGVzX25yOwogCWludCBpbmRleF9ucjsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JCWludCByZWZzOwotCX0gaW5kZXhbXTsKKworCXNwaW5sb2NrX3QgbGlzdF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3BpbmxvY2tfdCByZWZzX2xvY2s7CisJaW50IHJlZnNbXTsKIH07CiAKLWludCAgbm91dmVhdV9ldmVudF9jcmVhdGUoaW50IGluZGV4X25yLCBzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqKik7CitpbnQgIG5vdXZlYXVfZXZlbnRfY3JlYXRlKGludCB0eXBlc19uciwgaW50IGluZGV4X25yLCBzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqKik7CiB2b2lkIG5vdXZlYXVfZXZlbnRfZGVzdHJveShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqKik7Ci12b2lkIG5vdXZlYXVfZXZlbnRfdHJpZ2dlcihzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqLCBpbnQgaW5kZXgpOwordm9pZCBub3V2ZWF1X2V2ZW50X3RyaWdnZXIoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgdTMyIHR5cGVzLCBpbnQgaW5kZXgpOwogCi1pbnQgIG5vdXZlYXVfZXZlbnRfbmV3KHN0cnVjdCBub3V2ZWF1X2V2ZW50ICosIGludCBpbmRleCwKLQkJICAgICAgIGludCAoKmZ1bmMpKHZvaWQgKiwgaW50KSwgdm9pZCAqLAoraW50ICBub3V2ZWF1X2V2ZW50X25ldyhzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqLCB1MzIgdHlwZXMsIGludCBpbmRleCwKKwkJICAgICAgIGludCAoKmZ1bmMpKHZvaWQgKiwgdTMyLCBpbnQpLCB2b2lkICosCiAJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ldmVudGggKiopOwogdm9pZCBub3V2ZWF1X2V2ZW50X3JlZihzdHJ1Y3Qgbm91dmVhdV9ldmVudGggKiwgc3RydWN0IG5vdXZlYXVfZXZlbnRoICoqKTsKIHZvaWQgbm91dmVhdV9ldmVudF9nZXQoc3RydWN0IG5vdXZlYXVfZXZlbnRoICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9kaXNwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2Rpc3AuaAppbmRleCBmZDBjNjg4Li5mZGU4NDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2Rpc3AuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2Rpc3AuaApAQCAtNiw4ICs2LDE5IEBACiAjaW5jbHVkZSA8Y29yZS9kZXZpY2UuaD4KICNpbmNsdWRlIDxjb3JlL2V2ZW50Lmg+CiAKK2VudW0gbnZrbV9ocGRfZXZlbnQgeworCU5WS01fSFBEX1BMVUcgPSAxLAorCU5WS01fSFBEX1VOUExVRyA9IDIsCisJTlZLTV9IUERfSVJRID0gNCwKKwlOVktNX0hQRCA9IChOVktNX0hQRF9QTFVHIHwgTlZLTV9IUERfVU5QTFVHIHwgTlZLTV9IUERfSVJRKQorfTsKKwogc3RydWN0IG5vdXZlYXVfZGlzcCB7CiAJc3RydWN0IG5vdXZlYXVfZW5naW5lIGJhc2U7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG91dHA7CisJc3RydWN0IG5vdXZlYXVfZXZlbnQgKmhwZDsKKwogCXN0cnVjdCBub3V2ZWF1X2V2ZW50ICp2Ymxhbms7CiB9OwogCkBAIC0xNywyNSArMjgsNiBAQAogCXJldHVybiAodm9pZCAqKW52X2RldmljZShvYmopLT5zdWJkZXZbTlZERVZfRU5HSU5FX0RJU1BdOwogfQogCi0jZGVmaW5lIG5vdXZlYXVfZGlzcF9jcmVhdGUocCxlLGMsaCxpLHgsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfZGlzcF9jcmVhdGVfKChwKSwgKGUpLCAoYyksIChoKSwgKGkpLCAoeCksICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgICBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKLSNkZWZpbmUgbm91dmVhdV9kaXNwX2Rlc3Ryb3koZCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RydWN0IG5vdXZlYXVfZGlzcCAqZGlzcCA9IChkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX25vdXZlYXVfZGlzcF9kdG9yKG52X29iamVjdChkaXNwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19KQotI2RlZmluZSBub3V2ZWF1X2Rpc3BfaW5pdChkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlub3V2ZWF1X2VuZ2luZV9pbml0KCYoZCktPmJhc2UpCi0jZGVmaW5lIG5vdXZlYXVfZGlzcF9maW5pKGQscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfZW5naW5lX2ZpbmkoJihkKS0+YmFzZSwgKHMpKQotCi1pbnQgIG5vdXZlYXVfZGlzcF9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKLQkJCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIGludCBoZWFkcywKLQkJCSAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgdm9pZCAqKik7Ci12b2lkIF9ub3V2ZWF1X2Rpc3BfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci0jZGVmaW5lIF9ub3V2ZWF1X2Rpc3BfaW5pdCBfbm91dmVhdV9lbmdpbmVfaW5pdAotI2RlZmluZSBfbm91dmVhdV9kaXNwX2ZpbmkgX25vdXZlYXVfZW5naW5lX2ZpbmkKLQogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYwNF9kaXNwX29jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NTBfZGlzcF9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjg0X2Rpc3Bfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9maWZvLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2ZpZm8uaAppbmRleCAyNmI2YjJiLi5iNjM5ZWIyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9lbmdpbmUvZmlmby5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9lbmdpbmUvZmlmby5oCkBAIC0xMDksNiArMTA5LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ODRfZmlmb19vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmMwX2ZpZm9fb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZlMF9maWZvX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKmdrMjBhX2ZpZm9fb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYxMDhfZmlmb19vY2xhc3M7CiAKIHZvaWQgbnYwNF9maWZvX2ludHIoc3RydWN0IG5vdXZlYXVfc3ViZGV2ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9ncmFwaC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL2VuZ2luZS9ncmFwaC5oCmluZGV4IDg3MWVkZmQuLjhjMWQ0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9lbmdpbmUvZ3JhcGguaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvZW5naW5lL2dyYXBoLmgKQEAgLTY4LDYgKzY4LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZDdfZ3JhcGhfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZkOV9ncmFwaF9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmU0X2dyYXBoX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKmdrMjBhX2dyYXBoX29jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZjBfZ3JhcGhfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYxMDhfZ3JhcGhfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqZ20xMDdfZ3JhcGhfb2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9iaW9zL2Nvbm4uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9jb25uLmgKaW5kZXggYTMyZmViMy4uZjM5MzBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9iaW9zL2Nvbm4uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvY29ubi5oCkBAIC0yMiw3ICsyMiwyNSBAQAogCURDQl9DT05ORUNUT1JfTk9ORSA9IDB4ZmYKIH07CiAKLXUxNiBkY2JfY29ubnRhYihzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKTsKLXUxNiBkY2JfY29ubihzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCBpZHgsIHU4ICp2ZXIsIHU4ICpsZW4pOworc3RydWN0IG52Ymlvc19jb25uVCB7Cit9OworCit1MzIgbnZiaW9zX2Nvbm5UZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKTsKK3UzMiBudmJpb3NfY29ublRwKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHU4ICp2ZXIsIHU4ICpoZHIsIHU4ICpjbnQsIHU4ICpsZW4sCisJCSAgc3RydWN0IG52Ymlvc19jb25uVCAqaW5mbyk7CisKK3N0cnVjdCBudmJpb3NfY29ubkUgeworCXU4IHR5cGU7CisJdTggbG9jYXRpb247CisJdTggaHBkOworCXU4IGRwOworCXU4IGRpOworCXU4IHNyOworCXU4IGxjZGlkOworfTsKKwordTMyIG52Ymlvc19jb25uRWUoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgdTggaWR4LCB1OCAqdmVyLCB1OCAqaGRyKTsKK3UzMiBudmJpb3NfY29ubkVwKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHU4IGlkeCwgdTggKnZlciwgdTggKmhkciwKKwkJICBzdHJ1Y3QgbnZiaW9zX2Nvbm5FICppbmZvKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Jpb3MvZHAuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9kcC5oCmluZGV4IDZlNTQyMTguLjcyODIwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9kcC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvYmlvcy9kcC5oCkBAIC0xNyw5ICsxNywxMCBAQAogCQkgICAgICAgc3RydWN0IG52Ymlvc19kcG91dCAqKTsKIAogc3RydWN0IG52Ymlvc19kcGNmZyB7Ci0JdTggZHJ2OwotCXU4IHByZTsKLQl1OCB1bms7CisJdTggcGM7CisJdTggZGM7CisJdTggcGU7CisJdTggdHhfcHU7CiB9OwogCiB1MTYKQEAgLTI3LDcgKzI4LDcgQEAKIAkJICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwKIAkJICAgc3RydWN0IG52Ymlvc19kcGNmZyAqKTsKIHUxNgotbnZiaW9zX2RwY2ZnX21hdGNoKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKiwgdTE2IG91dHAsIHU4IHVuLCB1OCB2cywgdTggcGUsCitudmJpb3NfZHBjZmdfbWF0Y2goc3RydWN0IG5vdXZlYXVfYmlvcyAqLCB1MTYgb3V0cCwgdTggcGMsIHU4IHZzLCB1OCBwZSwKIAkJICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwKIAkJICAgc3RydWN0IG52Ymlvc19kcGNmZyAqKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9jbG9jay5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9jbG9jay5oCmluZGV4IDhmNGNlZDcuLmMwMWUyOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvY2xvY2suaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2Nsb2NrLmgKQEAgLTc3LDYgKzc3LDggQEAKIAlpbnQgdHN0YXRlOyAvKiB0aGVybWFsIGFkanVzdG1lbnQgKG1heC0pICovCiAJaW50IGRzdGF0ZTsgLyogZGlzcGxheSBhZGp1c3RtZW50IChtaW4rKSAqLwogCisJYm9vbCBhbGxvd19yZWNsb2NrOworCiAJaW50ICAoKnJlYWQpKHN0cnVjdCBub3V2ZWF1X2Nsb2NrICosIGVudW0gbnZfY2xrX3NyYyk7CiAJaW50ICAoKmNhbGMpKHN0cnVjdCBub3V2ZWF1X2Nsb2NrICosIHN0cnVjdCBub3V2ZWF1X2NzdGF0ZSAqKTsKIAlpbnQgICgqcHJvZykoc3RydWN0IG5vdXZlYXVfY2xvY2sgKik7CkBAIC0xMDYsOCArMTA4LDggQEAKIAlpbnQgbWRpdjsKIH07CiAKLSNkZWZpbmUgbm91dmVhdV9jbG9ja19jcmVhdGUocCxlLG8saSxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9jbG9ja19jcmVhdGVfKChwKSwgKGUpLCAobyksIChpKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCisjZGVmaW5lIG5vdXZlYXVfY2xvY2tfY3JlYXRlKHAsZSxvLGkscixkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfY2xvY2tfY3JlYXRlXygocCksIChlKSwgKG8pLCAoaSksIChyKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCiAjZGVmaW5lIG5vdXZlYXVfY2xvY2tfZGVzdHJveShwKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXN0cnVjdCBub3V2ZWF1X2Nsb2NrICpjbGsgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCV9ub3V2ZWF1X2Nsb2NrX2R0b3IobnZfb2JqZWN0KGNsaykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTIxLDcgKzEyMyw3IEBACiAKIGludCAgbm91dmVhdV9jbG9ja19jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKIAkJCSAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLAotCQkJICAgc3RydWN0IG5vdXZlYXVfY2xvY2tzICosIGludCwgdm9pZCAqKik7CisJCQkgICBzdHJ1Y3Qgbm91dmVhdV9jbG9ja3MgKiwgYm9vbCwgaW50LCB2b2lkICoqKTsKIHZvaWQgX25vdXZlYXVfY2xvY2tfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CiBpbnQgX25vdXZlYXVfY2xvY2tfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CiAjZGVmaW5lIF9ub3V2ZWF1X2Nsb2NrX2ZpbmkgX25vdXZlYXVfc3ViZGV2X2ZpbmkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZmIuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvZmIuaAppbmRleCA1OGM3Y2NkLi44NzFlNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2ZiLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9mYi5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52YWZfZmJfb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZjMF9mYl9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudmUwX2ZiX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKmdrMjBhX2ZiX29jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKmdtMTA3X2ZiX29jbGFzczsKIAogI2luY2x1ZGUgPHN1YmRldi9iaW9zL3JhbWNmZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9ncGlvLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2dwaW8uaAppbmRleCBjODViOWYxLi42MTJkODJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2dwaW8uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2dwaW8uaApAQCAtOCwxNyArOCwxOCBAQAogI2luY2x1ZGUgPHN1YmRldi9iaW9zLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MvZ3Bpby5oPgogCitlbnVtIG52a21fZ3Bpb19ldmVudCB7CisJTlZLTV9HUElPX0hJID0gMSwKKwlOVktNX0dQSU9fTE8gPSAyLAorCU5WS01fR1BJT19UT0dHTEVEID0gKE5WS01fR1BJT19ISSB8IE5WS01fR1BJT19MTyksCit9OworCiBzdHJ1Y3Qgbm91dmVhdV9ncGlvIHsKIAlzdHJ1Y3Qgbm91dmVhdV9zdWJkZXYgYmFzZTsKIAogCXN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudHM7CiAKLQkvKiBoYXJkd2FyZSBpbnRlcmZhY2VzICovCiAJdm9pZCAoKnJlc2V0KShzdHJ1Y3Qgbm91dmVhdV9ncGlvICosIHU4IGZ1bmMpOwotCWludCAgKCpkcml2ZSkoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCBpbnQgbGluZSwgaW50IGRpciwgaW50IG91dCk7Ci0JaW50ICAoKnNlbnNlKShzdHJ1Y3Qgbm91dmVhdV9ncGlvICosIGludCBsaW5lKTsKLQotCS8qIHNvZnR3YXJlIGludGVyZmFjZXMgKi8KIAlpbnQgICgqZmluZCkoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCBpbnQgaWR4LCB1OCB0YWcsIHU4IGxpbmUsCiAJCSAgICAgc3RydWN0IGRjYl9ncGlvX2Z1bmMgKik7CiAJaW50ICAoKnNldCkoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCBpbnQgaWR4LCB1OCB0YWcsIHU4IGxpbmUsIGludCBzdGF0ZSk7CkBAIC0zMSwyMyArMzIsMTAgQEAKIAlyZXR1cm4gKHZvaWQgKiludl9kZXZpY2Uob2JqKS0+c3ViZGV2W05WREVWX1NVQkRFVl9HUElPXTsKIH0KIAotI2RlZmluZSBub3V2ZWF1X2dwaW9fY3JlYXRlKHAsZSxvLGwsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlub3V2ZWF1X2dwaW9fY3JlYXRlXygocCksIChlKSwgKG8pLCAobCksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQotI2RlZmluZSBub3V2ZWF1X2dwaW9fZGVzdHJveShwKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfbm91dmVhdV9ncGlvX2R0b3IobnZfb2JqZWN0KGdwaW8pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0jZGVmaW5lIG5vdXZlYXVfZ3Bpb19maW5pKHAscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfc3ViZGV2X2ZpbmkoJihwKS0+YmFzZSwgKHMpKQotCi1pbnQgIG5vdXZlYXVfZ3Bpb19jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKLQkJCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIGludCwgaW50LCB2b2lkICoqKTsKLXZvaWQgX25vdXZlYXVfZ3Bpb19kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKLWludCAgbm91dmVhdV9ncGlvX2luaXQoc3RydWN0IG5vdXZlYXVfZ3BpbyAqKTsKLQotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjEwX2dwaW9fb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjUwX2dwaW9fb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudmQwX2dwaW9fb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudmUwX2dwaW9fb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnYxMF9ncGlvX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NTBfZ3Bpb19vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzICpudjkyX2dwaW9fb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqbnZkMF9ncGlvX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZTBfZ3Bpb19vY2xhc3M7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pMmMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvaTJjLmgKaW5kZXggN2Y1MGE4NS4uZGIxYjM5ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvaW5jbHVkZS9zdWJkZXYvaTJjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pMmMuaApAQCAtMTQsNTIgKzE0LDQxIEBACiAjZGVmaW5lIE5WX0kyQ19UWVBFX0VYVEREQyhlKSAoMHgwMDA1IHwgKGUpIDw8IDgpCiAjZGVmaW5lIE5WX0kyQ19UWVBFX0VYVEFVWChlKSAoMHgwMDA2IHwgKGUpIDw8IDgpCiAKK2VudW0gbnZrbV9pMmNfZXZlbnQgeworCU5WS01fSTJDX1BMVUcgPSAxLAorCU5WS01fSTJDX1VOUExVRyA9IDIsCisJTlZLTV9JMkNfSVJRID0gNCwKKwlOVktNX0kyQ19ET05FID0gOCwKKwlOVktNX0kyQ19BTlkgPSAoTlZLTV9JMkNfUExVRyB8CisJCQlOVktNX0kyQ19VTlBMVUcgfAorCQkJTlZLTV9JMkNfSVJRIHwKKwkJCU5WS01fSTJDX0RPTkUpLAorfTsKKwogc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgewogCXN0cnVjdCBub3V2ZWF1X29iamVjdCBiYXNlOwogCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOworCXN0cnVjdCBtdXRleCBtdXRleDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAl1OCAgaW5kZXg7CisJaW50IGF1eDsKIAogCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2kyY19mdW5jICpmdW5jOwogfTsKIAogc3RydWN0IG5vdXZlYXVfaTJjX2Z1bmMgewotCXZvaWQgKCphY3F1aXJlKShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqKTsKLQl2b2lkICgqcmVsZWFzZSkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKik7Ci0KIAl2b2lkICgqZHJpdmVfc2NsKShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqLCBpbnQpOwogCXZvaWQgKCpkcml2ZV9zZGEpKHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICosIGludCk7CiAJaW50ICAoKnNlbnNlX3NjbCkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKik7CiAJaW50ICAoKnNlbnNlX3NkYSkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKik7CiAKLQlpbnQgICgqYXV4KShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqLCB1OCwgdTMyLCB1OCAqLCB1OCk7CisJaW50ICAoKmF1eCkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKiwgYm9vbCwgdTgsIHUzMiwgdTggKiwgdTgpOwogCWludCAgKCpwYXR0ZXJuKShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqLCBpbnQgcGF0dGVybik7CiAJaW50ICAoKmxua19jdGwpKHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICosIGludCBuciwgaW50IGJ3LCBib29sIGVuaCk7CiAJaW50ICAoKmRydl9jdGwpKHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICosIGludCBsYW5lLCBpbnQgc3csIGludCBwZSk7CiB9OwogCi0jZGVmaW5lIG5vdXZlYXVfaTJjX3BvcnRfY3JlYXRlKHAsZSxvLGksYSxmLGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfaTJjX3BvcnRfY3JlYXRlXygocCksIChlKSwgKG8pLCAoaSksIChhKSwgKGYpLCAgICAgICAgICAgICAgICAgXAotCQkJCSBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKLSNkZWZpbmUgbm91dmVhdV9pMmNfcG9ydF9kZXN0cm95KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX25vdXZlYXVfaTJjX3BvcnRfZHRvcihudl9vYmplY3QoaTJjKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19KQotI2RlZmluZSBub3V2ZWF1X2kyY19wb3J0X2luaXQocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlub3V2ZWF1X29iamVjdF9pbml0KCYocCktPmJhc2UpCi0jZGVmaW5lIG5vdXZlYXVfaTJjX3BvcnRfZmluaShwLHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCW5vdXZlYXVfb2JqZWN0X2ZpbmkoJihwKS0+YmFzZSwgKHMpKQotCi1pbnQgbm91dmVhdV9pMmNfcG9ydF9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKLQkJCSAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHU4LAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqLAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgbm91dmVhdV9pMmNfZnVuYyAqLAotCQkJICAgICBpbnQsIHZvaWQgKiopOwotdm9pZCBfbm91dmVhdV9pMmNfcG9ydF9kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKLSNkZWZpbmUgX25vdXZlYXVfaTJjX3BvcnRfaW5pdCBub3V2ZWF1X29iamVjdF9pbml0Ci0jZGVmaW5lIF9ub3V2ZWF1X2kyY19wb3J0X2Zpbmkgbm91dmVhdV9vYmplY3RfZmluaQotCiBzdHJ1Y3Qgbm91dmVhdV9pMmNfYm9hcmRfaW5mbyB7CiAJc3RydWN0IGkyY19ib2FyZF9pbmZvIGRldjsKIAl1OCB1ZGVsYXk7IC8qIHNldCB0byAwIHRvIHVzZSB0aGUgc3RhbmRhcmQgZGVsYXkgKi8KQEAgLTY3LDEzICs1NiwyMCBAQAogCiBzdHJ1Y3Qgbm91dmVhdV9pMmMgewogCXN0cnVjdCBub3V2ZWF1X3N1YmRldiBiYXNlOworCXN0cnVjdCBub3V2ZWF1X2V2ZW50ICpudGZ5OwogCiAJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKigqZmluZCkoc3RydWN0IG5vdXZlYXVfaTJjICosIHU4IGluZGV4KTsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqKCpmaW5kX3R5cGUpKHN0cnVjdCBub3V2ZWF1X2kyYyAqLCB1MTYgdHlwZSk7CisJaW50ICAoKmFjcXVpcmVfcGFkKShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCXZvaWQgKCpyZWxlYXNlX3BhZCkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKik7CisJaW50ICAoKmFjcXVpcmUpKHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICosIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICopOwogCWludCAoKmlkZW50aWZ5KShzdHJ1Y3Qgbm91dmVhdV9pMmMgKiwgaW50IGluZGV4LAogCQkJY29uc3QgY2hhciAqd2hhdCwgc3RydWN0IG5vdXZlYXVfaTJjX2JvYXJkX2luZm8gKiwKIAkJCWJvb2wgKCptYXRjaCkoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKiwKIAkJCQkgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKiwgdm9pZCAqKSwgdm9pZCAqKTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAJc3RydWN0IGxpc3RfaGVhZCBwb3J0czsKIH07CiAKQEAgLTgzLDM3ICs3OSwxMiBAQAogCXJldHVybiAodm9pZCAqKW52X2RldmljZShvYmopLT5zdWJkZXZbTlZERVZfU1VCREVWX0kyQ107CiB9CiAKLSNkZWZpbmUgbm91dmVhdV9pMmNfY3JlYXRlKHAsZSxvLHMsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jbm91dmVhdV9pMmNfY3JlYXRlXygocCksIChlKSwgKG8pLCAocyksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQotI2RlZmluZSBub3V2ZWF1X2kyY19kZXN0cm95KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfbm91dmVhdV9pMmNfZHRvcihudl9vYmplY3QoaTJjKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0jZGVmaW5lIG5vdXZlYXVfaTJjX2luaXQocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9ub3V2ZWF1X2kyY19pbml0KG52X29iamVjdChpMmMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSkKLSNkZWZpbmUgbm91dmVhdV9pMmNfZmluaShwLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX25vdXZlYXVfaTJjX2ZpbmkobnZfb2JqZWN0KGkyYyksIChzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19KQotCi1pbnQgbm91dmVhdV9pMmNfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCi0JCQlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosCi0JCQlpbnQsIHZvaWQgKiopOwotdm9pZCBfbm91dmVhdV9pMmNfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci1pbnQgIF9ub3V2ZWF1X2kyY19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKLWludCAgX25vdXZlYXVfaTJjX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIGJvb2wpOwotCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52MDRfaTJjX29jbGFzczsKLWV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnY0ZV9pMmNfb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudjUwX2kyY19vY2xhc3M7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52OTRfaTJjX29jbGFzczsKLWV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnZkMF9pMmNfb2NsYXNzOwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBub3V2ZWF1X2FueDk4MDVfc2NsYXNzW107Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBub3V2ZWF1X2kyY19iaXRfYWxnbzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBub3V2ZWF1X2kyY19hdXhfYWxnbzsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52MDRfaTJjX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NGVfaTJjX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52NTBfaTJjX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52OTRfaTJjX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZDBfaTJjX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm52ZTBfaTJjX29jbGFzczsKIAogc3RhdGljIGlubGluZSBpbnQKIG52X3JkaTJjcihzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCwgdTggYWRkciwgdTggcmVnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9pbmNsdWRlL3N1YmRldi9pYnVzLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2lidXMuaAppbmRleCA4ODgxNGYxLi4zMWRmNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2lidXMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL2luY2x1ZGUvc3ViZGV2L2lidXMuaApAQCAtMzAsNSArMzAsNiBAQAogCiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52YzBfaWJ1c19vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52ZTBfaWJ1c19vY2xhc3M7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIGdrMjBhX2lidXNfb2NsYXNzOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9iYXNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvYmFzZS5jCmluZGV4IGJkZjU5NDEuLjczYjFlZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9iYXNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL2Jhc2UuYwpAQCAtMTE4LDggKzExOCwxMCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQliYXItPmlvbWVtID0gaW9yZW1hcChudl9kZXZpY2VfcmVzb3VyY2Vfc3RhcnQoZGV2aWNlLCAzKSwKLQkJCSAgICAgbnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIDMpKTsKKwlpZiAobnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIDMpICE9IDApCisJCWJhci0+aW9tZW0gPSBpb3JlbWFwKG52X2RldmljZV9yZXNvdXJjZV9zdGFydChkZXZpY2UsIDMpLAorCQkJCSAgICAgbnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIDMpKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvbnZjMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmFyL252YzAuYwppbmRleCAzZjMwZGI2Li5jYTgxMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iYXIvbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jhci9udmMwLmMKQEAgLTMwLDE0ICszMCwxNiBAQAogCiAjaW5jbHVkZSAicHJpdi5oIgogCitzdHJ1Y3QgbnZjMF9iYXJfcHJpdl92bSB7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICptZW07CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2Q7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtOworfTsKKwogc3RydWN0IG52YzBfYmFyX3ByaXYgewogCXN0cnVjdCBub3V2ZWF1X2JhciBiYXNlOwogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm1lbTsKLQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2Q7Ci0JCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKLQl9IGJhclsyXTsKKwlzdHJ1Y3QgbnZjMF9iYXJfcHJpdl92bSBiYXJbMl07CiB9OwogCiBzdGF0aWMgaW50CkBAIC03OSwxNCArODEsNjYgQEAKIH0KIAogc3RhdGljIGludAorbnZjMF9iYXJfaW5pdF92bShzdHJ1Y3QgbnZjMF9iYXJfcHJpdiAqcHJpdiwgc3RydWN0IG52YzBfYmFyX3ByaXZfdm0gKmJhcl92bSwKKwkJIGludCBiYXJfbnIpCit7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXZpY2UgPSBudl9kZXZpY2UoJnByaXYtPmJhc2UpOworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKKwlyZXNvdXJjZV9zaXplX3QgYmFyX2xlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KG52X29iamVjdChwcml2KSwgTlVMTCwgMHgxMDAwLCAwLCAwLAorCQkJCSZiYXJfdm0tPm1lbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhudl9vYmplY3QocHJpdiksIE5VTEwsIDB4ODAwMCwgMCwgMCwKKwkJCQkmYmFyX3ZtLT5wZ2QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliYXJfbGVuID0gbnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIGJhcl9ucik7CisKKwlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXZpY2UsIDAsIGJhcl9sZW4sIDAsICZ2bSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWF0b21pY19pbmMoJnZtLT5lbmdyZWZbTlZERVZfU1VCREVWX0JBUl0pOworCisJLyoKKwkgKiBCb290c3RyYXAgcGFnZSB0YWJsZSBsb29rdXAuCisJICovCisJaWYgKGJhcl9uciA9PSAzKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhudl9vYmplY3QocHJpdiksIE5VTEwsCisJCQkJCSAoYmFyX2xlbiA+PiAxMikgKiA4LCAweDEwMDAsCisJCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJCSZ2bS0+cGd0WzBdLm9ialswXSk7CisJCXZtLT5wZ3RbMF0ucmVmY291bnRbMF0gPSAxOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJmJhcl92bS0+dm0sIGJhcl92bS0+cGdkKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmdm0sIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludl93bzMyKGJhcl92bS0+bWVtLCAweDAyMDAsIGxvd2VyXzMyX2JpdHMoYmFyX3ZtLT5wZ2QtPmFkZHIpKTsKKwludl93bzMyKGJhcl92bS0+bWVtLCAweDAyMDQsIHVwcGVyXzMyX2JpdHMoYmFyX3ZtLT5wZ2QtPmFkZHIpKTsKKwludl93bzMyKGJhcl92bS0+bWVtLCAweDAyMDgsIGxvd2VyXzMyX2JpdHMoYmFyX2xlbiAtIDEpKTsKKwludl93bzMyKGJhcl92bS0+bWVtLCAweDAyMGMsIHVwcGVyXzMyX2JpdHMoYmFyX2xlbiAtIDEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBudmMwX2Jhcl9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKIAkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCiAJICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShwYXJlbnQpOwogCXN0cnVjdCBudmMwX2Jhcl9wcml2ICpwcml2OwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqbWVtOwotCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKKwlib29sIGhhc19iYXIzID0gbnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIDMpICE9IDA7CiAJaW50IHJldDsKIAogCXJldCA9IG5vdXZlYXVfYmFyX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAmcHJpdik7CkBAIC05NSw3MSArMTQ5LDE5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBCQVIzICovCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KG52X29iamVjdChwcml2KSwgTlVMTCwgMHgxMDAwLCAwLCAwLAotCQkJCSZwcml2LT5iYXJbMF0ubWVtKTsKLQltZW0gPSBwcml2LT5iYXJbMF0ubWVtOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcobnZfb2JqZWN0KHByaXYpLCBOVUxMLCAweDgwMDAsIDAsIDAsCi0JCQkJJnByaXYtPmJhclswXS5wZ2QpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXZpY2UsIDAsIG52X2RldmljZV9yZXNvdXJjZV9sZW4oZGV2aWNlLCAzKSwgMCwgJnZtKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JYXRvbWljX2luYygmdm0tPmVuZ3JlZltOVkRFVl9TVUJERVZfQkFSXSk7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcobnZfb2JqZWN0KHByaXYpLCBOVUxMLAotCQkJCSAobnZfZGV2aWNlX3Jlc291cmNlX2xlbihkZXZpY2UsIDMpID4+IDEyKSAqIDgsCi0JCQkJIDB4MTAwMCwgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAotCQkJCSAmdm0tPnBndFswXS5vYmpbMF0pOwotCXZtLT5wZ3RbMF0ucmVmY291bnRbMF0gPSAxOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJnByaXYtPmJhclswXS52bSwgcHJpdi0+YmFyWzBdLnBnZCk7Ci0Jbm91dmVhdV92bV9yZWYoTlVMTCwgJnZtLCBOVUxMKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JbnZfd28zMihtZW0sIDB4MDIwMCwgbG93ZXJfMzJfYml0cyhwcml2LT5iYXJbMF0ucGdkLT5hZGRyKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwNCwgdXBwZXJfMzJfYml0cyhwcml2LT5iYXJbMF0ucGdkLT5hZGRyKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwOCwgbG93ZXJfMzJfYml0cyhudl9kZXZpY2VfcmVzb3VyY2VfbGVuKGRldmljZSwgMykgLSAxKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwYywgdXBwZXJfMzJfYml0cyhudl9kZXZpY2VfcmVzb3VyY2VfbGVuKGRldmljZSwgMykgLSAxKSk7CisJaWYgKGhhc19iYXIzKSB7CisJCXJldCA9IG52YzBfYmFyX2luaXRfdm0ocHJpdiwgJnByaXYtPmJhclswXSwgMyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlwcml2LT5iYXNlLmFsbG9jID0gbm91dmVhdV9iYXJfYWxsb2M7CisJCXByaXYtPmJhc2Uua21hcCA9IG52YzBfYmFyX2ttYXA7CisJfQogCiAJLyogQkFSMSAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhudl9vYmplY3QocHJpdiksIE5VTEwsIDB4MTAwMCwgMCwgMCwKLQkJCQkmcHJpdi0+YmFyWzFdLm1lbSk7Ci0JbWVtID0gcHJpdi0+YmFyWzFdLm1lbTsKKwlyZXQgPSBudmMwX2Jhcl9pbml0X3ZtKHByaXYsICZwcml2LT5iYXJbMV0sIDEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcobnZfb2JqZWN0KHByaXYpLCBOVUxMLCAweDgwMDAsIDAsIDAsCi0JCQkJJnByaXYtPmJhclsxXS5wZ2QpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXZpY2UsIDAsIG52X2RldmljZV9yZXNvdXJjZV9sZW4oZGV2aWNlLCAxKSwgMCwgJnZtKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JYXRvbWljX2luYygmdm0tPmVuZ3JlZltOVkRFVl9TVUJERVZfQkFSXSk7Ci0KLQlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJnByaXYtPmJhclsxXS52bSwgcHJpdi0+YmFyWzFdLnBnZCk7Ci0Jbm91dmVhdV92bV9yZWYoTlVMTCwgJnZtLCBOVUxMKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JbnZfd28zMihtZW0sIDB4MDIwMCwgbG93ZXJfMzJfYml0cyhwcml2LT5iYXJbMV0ucGdkLT5hZGRyKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwNCwgdXBwZXJfMzJfYml0cyhwcml2LT5iYXJbMV0ucGdkLT5hZGRyKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwOCwgbG93ZXJfMzJfYml0cyhudl9kZXZpY2VfcmVzb3VyY2VfbGVuKGRldmljZSwgMSkgLSAxKSk7Ci0JbnZfd28zMihtZW0sIDB4MDIwYywgdXBwZXJfMzJfYml0cyhudl9kZXZpY2VfcmVzb3VyY2VfbGVuKGRldmljZSwgMSkgLSAxKSk7Ci0KLQlwcml2LT5iYXNlLmFsbG9jID0gbm91dmVhdV9iYXJfYWxsb2M7Ci0JcHJpdi0+YmFzZS5rbWFwID0gbnZjMF9iYXJfa21hcDsKIAlwcml2LT5iYXNlLnVtYXAgPSBudmMwX2Jhcl91bWFwOwogCXByaXYtPmJhc2UudW5tYXAgPSBudmMwX2Jhcl91bm1hcDsKIAlwcml2LT5iYXNlLmZsdXNoID0gbnY4NF9iYXJfZmx1c2g7CkBAIC0yMDEsNyArMjAzLDkgQEAKIAludl9tYXNrKHByaXYsIDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKIAogCW52X3dyMzIocHJpdiwgMHgwMDE3MDQsIDB4ODAwMDAwMDAgfCBwcml2LT5iYXJbMV0ubWVtLT5hZGRyID4+IDEyKTsKLQludl93cjMyKHByaXYsIDB4MDAxNzE0LCAweGMwMDAwMDAwIHwgcHJpdi0+YmFyWzBdLm1lbS0+YWRkciA+PiAxMik7CisJaWYgKHByaXYtPmJhclswXS5tZW0pCisJCW52X3dyMzIocHJpdiwgMHgwMDE3MTQsCisJCQkweGMwMDAwMDAwIHwgcHJpdi0+YmFyWzBdLm1lbS0+YWRkciA+PiAxMik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvYmFzZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9iYXNlLmMKaW5kZXggMjIyZThlYi4uZDQ1NzA0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9iYXNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9iYXNlLmMKQEAgLTE4MywxMCArMTgzLDExIEBACiAJCWdvdG8gb3V0OwogCiAJYmlvcy0+ZGF0YSA9IGttYWxsb2MoYmlvcy0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJpb3MtPmRhdGEpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJpb3MtPnNpemU7IGkgKz0gNCkKLQkJCSgodTMyICopYmlvcy0+ZGF0YSlbaS80XSA9IG52X3JkMzIoYmlvcywgMHgzMDAwMDAgKyBpKTsKLQl9CisJaWYgKCFiaW9zLT5kYXRhKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBiaW9zLT5zaXplOyBpICs9IDQpCisJCSgodTMyICopYmlvcy0+ZGF0YSlbaS80XSA9IG52X3JkMzIoYmlvcywgMHgzMDAwMDAgKyBpKTsKIAogCS8qIGNoZWNrIHRoZSBQQ0kgcmVjb3JkIGhlYWRlciAqLwogCXBjaXIgPSBudl9ybzE2KGJpb3MsIDB4MDAxOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2Nvbm4uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvY29ubi5jCmluZGV4IDVhYzAxMGUuLjJlZGUzYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvY29ubi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvY29ubi5jCkBAIC0yOCwxMiArMjgsMTIgQEAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9kY2IuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9jb25uLmg+CiAKLXUxNgotZGNiX2Nvbm50YWIoc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcywgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbikKK3UzMgorbnZiaW9zX2Nvbm5UZShzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuKQogewotCXUxNiBkY2IgPSBkY2JfdGFibGUoYmlvcywgdmVyLCBoZHIsIGNudCwgbGVuKTsKKwl1MzIgZGNiID0gZGNiX3RhYmxlKGJpb3MsIHZlciwgaGRyLCBjbnQsIGxlbik7CiAJaWYgKGRjYiAmJiAqdmVyID49IDB4MzAgJiYgKmhkciA+PSAweDE2KSB7Ci0JCXUxNiBkYXRhID0gbnZfcm8xNihiaW9zLCBkY2IgKyAweDE0KTsKKwkJdTMyIGRhdGEgPSBudl9ybzE2KGJpb3MsIGRjYiArIDB4MTQpOwogCQlpZiAoZGF0YSkgewogCQkJKnZlciA9IG52X3JvMDgoYmlvcywgZGF0YSArIDApOwogCQkJKmhkciA9IG52X3JvMDgoYmlvcywgZGF0YSArIDEpOwpAQCAtNDIsMTUgKzQyLDU5IEBACiAJCQlyZXR1cm4gZGF0YTsKIAkJfQogCX0KLQlyZXR1cm4gMHgwMDAwOworCXJldHVybiAweDAwMDAwMDAwOwogfQogCi11MTYKLWRjYl9jb25uKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHU4IGlkeCwgdTggKnZlciwgdTggKmxlbikKK3UzMgorbnZiaW9zX2Nvbm5UcChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCAqdmVyLCB1OCAqaGRyLCB1OCAqY250LCB1OCAqbGVuLAorCSAgICAgIHN0cnVjdCBudmJpb3NfY29ublQgKmluZm8pCit7CisJdTMyIGRhdGEgPSBudmJpb3NfY29ublRlKGJpb3MsIHZlciwgaGRyLCBjbnQsIGxlbik7CisJbWVtc2V0KGluZm8sIDB4MDAsIHNpemVvZigqaW5mbykpOworCXN3aXRjaCAoISFkYXRhICogKnZlcikgeworCWNhc2UgMHgzMDoKKwljYXNlIDB4NDA6CisJCXJldHVybiBkYXRhOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMHgwMDAwMDAwMDsKK30KKwordTMyCitudmJpb3NfY29ubkVlKHN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MsIHU4IGlkeCwgdTggKnZlciwgdTggKmxlbikKIHsKIAl1OCAgaGRyLCBjbnQ7Ci0JdTE2IGRhdGEgPSBkY2JfY29ubnRhYihiaW9zLCB2ZXIsICZoZHIsICZjbnQsIGxlbik7CisJdTMyIGRhdGEgPSBudmJpb3NfY29ublRlKGJpb3MsIHZlciwgJmhkciwgJmNudCwgbGVuKTsKIAlpZiAoZGF0YSAmJiBpZHggPCBjbnQpCiAJCXJldHVybiBkYXRhICsgaGRyICsgKGlkeCAqICpsZW4pOwotCXJldHVybiAweDAwMDA7CisJcmV0dXJuIDB4MDAwMDAwMDA7Cit9CisKK3UzMgorbnZiaW9zX2Nvbm5FcChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1OCBpZHgsIHU4ICp2ZXIsIHU4ICpsZW4sCisJICAgICAgc3RydWN0IG52Ymlvc19jb25uRSAqaW5mbykKK3sKKwl1MzIgZGF0YSA9IG52Ymlvc19jb25uRWUoYmlvcywgaWR4LCB2ZXIsIGxlbik7CisJbWVtc2V0KGluZm8sIDB4MDAsIHNpemVvZigqaW5mbykpOworCXN3aXRjaCAoISFkYXRhICogKnZlcikgeworCWNhc2UgMHgzMDoKKwljYXNlIDB4NDA6CisJCWluZm8tPnR5cGUgICAgID0gIG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDApOworCQlpbmZvLT5sb2NhdGlvbiA9ICBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAxKSAmIDB4MGY7CisJCWluZm8tPmhwZCAgICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpICYgMHgzMCkgPj4gNDsKKwkJaW5mby0+ZHAgICAgICAgPSAobnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMSkgJiAweGMwKSA+PiA2OworCQlpZiAoKmxlbiA8IDQpCisJCQlyZXR1cm4gZGF0YTsKKwkJaW5mby0+aHBkICAgICB8PSAobnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMikgJiAweDAzKSA8PCAyOworCQlpbmZvLT5kcCAgICAgIHw9ICBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAyKSAmIDB4MGM7CisJCWluZm8tPmRpICAgICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpICYgMHhmMCkgPj4gNDsKKwkJaW5mby0+aHBkICAgICB8PSAobnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMykgJiAweDA3KSA8PCA0OworCQlpbmZvLT5zciAgICAgICA9IChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAzKSAmIDB4MDgpID4+IDM7CisJCWluZm8tPmxjZGlkICAgID0gKG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpICYgMHg3MCkgPj4gNDsKKwkJcmV0dXJuIGRhdGE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAweDAwMDAwMDAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9kcC5jCmluZGV4IDc2MjhmZTcuLmYzMDlkZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Jpb3MvZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2RwLmMKQEAgLTE2MiwxOCArMTYyLDIwIEBACiAJCSAgIHN0cnVjdCBudmJpb3NfZHBjZmcgKmluZm8pCiB7CiAJdTE2IGRhdGEgPSBudmJpb3NfZHBjZmdfZW50cnkoYmlvcywgb3V0cCwgaWR4LCB2ZXIsIGhkciwgY250LCBsZW4pOworCW1lbXNldChpbmZvLCAweDAwLCBzaXplb2YoKmluZm8pKTsKIAlpZiAoZGF0YSkgewogCQlzd2l0Y2ggKCp2ZXIpIHsKIAkJY2FzZSAweDIxOgotCQkJaW5mby0+ZHJ2ID0gbnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMik7Ci0JCQlpbmZvLT5wcmUgPSBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAzKTsKLQkJCWluZm8tPnVuayA9IG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDQpOworCQkJaW5mby0+ZGMgICAgPSBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAyKTsKKwkJCWluZm8tPnBlICAgID0gbnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMyk7CisJCQlpbmZvLT50eF9wdSA9IG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDQpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgzMDoKIAkJY2FzZSAweDQwOgotCQkJaW5mby0+ZHJ2ID0gbnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMSk7Ci0JCQlpbmZvLT5wcmUgPSBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAyKTsKLQkJCWluZm8tPnVuayA9IG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDMpOworCQkJaW5mby0+cGMgICAgPSBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAwKTsKKwkJCWluZm8tPmRjICAgID0gbnZfcm8wOChiaW9zLCBkYXRhICsgMHgwMSk7CisJCQlpbmZvLT5wZSAgICA9IG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDIpOworCQkJaW5mby0+dHhfcHUgPSBudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAzKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGF0YSA9IDB4MDAwMDsKQEAgLTE4NCw3ICsxODYsNyBAQAogfQogCiB1MTYKLW52Ymlvc19kcGNmZ19tYXRjaChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1MTYgb3V0cCwgdTggdW4sIHU4IHZzLCB1OCBwZSwKK252Ymlvc19kcGNmZ19tYXRjaChzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zLCB1MTYgb3V0cCwgdTggcGMsIHU4IHZzLCB1OCBwZSwKIAkJICAgdTggKnZlciwgdTggKmhkciwgdTggKmNudCwgdTggKmxlbiwKIAkJICAgc3RydWN0IG52Ymlvc19kcGNmZyAqaW5mbykKIHsKQEAgLTE5MywxNiArMTk1LDE1IEBACiAKIAlpZiAoKnZlciA+PSAweDMwKSB7CiAJCWNvbnN0IHU4IHZzb2ZmW10gPSB7IDAsIDQsIDcsIDkgfTsKLQkJaWR4ID0gKHVuICogMTApICsgdnNvZmZbdnNdICsgcGU7CisJCWlkeCA9IChwYyAqIDEwKSArIHZzb2ZmW3ZzXSArIHBlOwogCX0gZWxzZSB7Ci0JCXdoaWxlICgoZGF0YSA9IG52Ymlvc19kcGNmZ19lbnRyeShiaW9zLCBvdXRwLCBpZHgsCisJCXdoaWxlICgoZGF0YSA9IG52Ymlvc19kcGNmZ19lbnRyeShiaW9zLCBvdXRwLCArK2lkeCwKIAkJCQkJCSAgdmVyLCBoZHIsIGNudCwgbGVuKSkpIHsKIAkJCWlmIChudl9ybzA4KGJpb3MsIGRhdGEgKyAweDAwKSA9PSB2cyAmJgogCQkJICAgIG52X3JvMDgoYmlvcywgZGF0YSArIDB4MDEpID09IHBlKQogCQkJCWJyZWFrOwotCQkJaWR4Kys7CiAJCX0KIAl9CiAKLQlyZXR1cm4gbnZiaW9zX2RwY2ZnX3BhcnNlKGJpb3MsIG91dHAsIHBlLCB2ZXIsIGhkciwgY250LCBsZW4sIGluZm8pOworCXJldHVybiBudmJpb3NfZHBjZmdfcGFyc2UoYmlvcywgb3V0cCwgaWR4LCB2ZXIsIGhkciwgY250LCBsZW4sIGluZm8pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvYmlvcy9pbml0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2luaXQuYwppbmRleCBhY2FlYWY3Li42MjYzODBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2luaXQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9iaW9zL2luaXQuYwpAQCAtOTgsMTUgKzk4LDE2IEBACiBpbml0X2Nvbm4oc3RydWN0IG52Ymlvc19pbml0ICppbml0KQogewogCXN0cnVjdCBub3V2ZWF1X2Jpb3MgKmJpb3MgPSBpbml0LT5iaW9zOwotCXU4ICB2ZXIsIGxlbjsKLQl1MTYgY29ubjsKKwlzdHJ1Y3QgbnZiaW9zX2Nvbm5FIGNvbm5FOworCXU4ICB2ZXIsIGhkcjsKKwl1MzIgY29ubjsKIAogCWlmIChpbml0X2V4ZWMoaW5pdCkpIHsKIAkJaWYgKGluaXQtPm91dHApIHsKIAkJCWNvbm4gPSBpbml0LT5vdXRwLT5jb25uZWN0b3I7Ci0JCQljb25uID0gZGNiX2Nvbm4oYmlvcywgY29ubiwgJnZlciwgJmxlbik7CisJCQljb25uID0gbnZiaW9zX2Nvbm5FcChiaW9zLCBjb25uLCAmdmVyLCAmaGRyLCAmY29ubkUpOwogCQkJaWYgKGNvbm4pCi0JCQkJcmV0dXJuIG52X3JvMDgoYmlvcywgY29ubik7CisJCQkJcmV0dXJuIGNvbm5FLnR5cGU7CiAJCX0KIAogCQllcnJvcigic2NyaXB0IG5lZWRzIGNvbm5lY3RvciB0eXBlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL2Jhc2UuYwppbmRleCBkZDYyYmFlLi4yMjM1MWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9iYXNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svYmFzZS5jCkBAIC0zNDYsOCArMzQ2LDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9wc3RhdGUgKnBzdGF0ZTsKIAlpbnQgaSA9IDA7CiAKLQkvKiBZS1cgcmVwZWxsYW50ICovCi0JcmV0dXJuIC1FTk9TWVM7CisJaWYgKCFjbGstPmFsbG93X3JlY2xvY2spCisJCXJldHVybiAtRU5PU1lTOwogCiAJaWYgKHJlcSAhPSAtMSAmJiByZXEgIT0gLTIpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwc3RhdGUsICZjbGstPnN0YXRlcywgaGVhZCkgewpAQCAtNDU2LDYgKzQ1Niw3IEBACiAJCSAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAogCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywKIAkJICAgICAgc3RydWN0IG5vdXZlYXVfY2xvY2tzICpjbG9ja3MsCisJCSAgICAgIGJvb2wgYWxsb3dfcmVjbG9jaywKIAkJICAgICAgaW50IGxlbmd0aCwgdm9pZCAqKm9iamVjdCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShwYXJlbnQpOwpAQCAtNDc4LDYgKzQ3OSw4IEBACiAJCXJldCA9IG5vdXZlYXVfcHN0YXRlX25ldyhjbGssIGlkeCsrKTsKIAl9IHdoaWxlIChyZXQgPT0gMCk7CiAKKwljbGstPmFsbG93X3JlY2xvY2sgPSBhbGxvd19yZWNsb2NrOworCiAJbW9kZSA9IG5vdXZlYXVfc3Ryb3B0KGRldmljZS0+Y2Znb3B0LCAiTnZDbGtNb2RlIiwgJmFyZ2xlbik7CiAJaWYgKG1vZGUpIHsKIAkJaWYgKCFzdHJuY2FzZWNtcHoobW9kZSwgImRpc2FibGVkIiwgYXJnbGVuKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnYwNC5jCmluZGV4IGI3NGRiNmMuLmViMmQ0NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252MDQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udjA0LmMKQEAgLTgyLDcgKzgyLDggQEAKIAlzdHJ1Y3QgbnYwNF9jbG9ja19wcml2ICpwcml2OwogCWludCByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X2Nsb2NrX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBudjA0X2RvbWFpbiwgJnByaXYpOworCXJldCA9IG5vdXZlYXVfY2xvY2tfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52MDRfZG9tYWluLCBmYWxzZSwKKwkJCQkgICAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252NDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252NDAuYwppbmRleCBkYjczNDZmLi44YTllMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udjQwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnY0MC5jCkBAIC0yMTMsNyArMjEzLDggQEAKIAlzdHJ1Y3QgbnY0MF9jbG9ja19wcml2ICpwcml2OwogCWludCByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X2Nsb2NrX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBudjQwX2RvbWFpbiwgJnByaXYpOworCXJldCA9IG5vdXZlYXVfY2xvY2tfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52NDBfZG9tYWluLCB0cnVlLAorCQkJCSAgICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnY1MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnY1MC5jCmluZGV4IDI1MGE2ZDkuLjhjMTMyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udjUwLmMKQEAgLTUwNyw3ICs1MDcsNyBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBub3V2ZWF1X2Nsb2NrX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBwY2xhc3MtPmRvbWFpbnMsCi0JCQkJICAmcHJpdik7CisJCQkJICAgZmFsc2UsICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZhMy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZhMy5jCmluZGV4IDRmNWExMzcuLjlmYjU4MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252YTMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmEzLmMKQEAgLTMwMiw3ICszMDIsOCBAQAogCXN0cnVjdCBudmEzX2Nsb2NrX3ByaXYgKnByaXY7CiAJaW50IHJldDsKIAotCXJldCA9IG5vdXZlYXVfY2xvY2tfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52YTNfZG9tYWluLCAmcHJpdik7CisJcmV0ID0gbm91dmVhdV9jbG9ja19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgbnZhM19kb21haW4sIGZhbHNlLAorCQkJCSAgICZwcml2KTsKIAkqcG9iamVjdCA9IG52X29iamVjdChwcml2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZhYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZhYS5jCmluZGV4IDdhNzIzYjQuLjZhNjVmYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252YWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmFhLmMKQEAgLTQyMSw3ICs0MjEsOCBAQAogCXN0cnVjdCBudmFhX2Nsb2NrX3ByaXYgKnByaXY7CiAJaW50IHJldDsKIAotCXJldCA9IG5vdXZlYXVfY2xvY2tfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52YWFfZG9tYWlucywgJnByaXYpOworCXJldCA9IG5vdXZlYXVfY2xvY2tfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52YWFfZG9tYWlucywgdHJ1ZSwKKwkJCQkgICAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252YzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252YzAuYwppbmRleCBjMzEwNTcyMC4uZGJmODUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZjMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252YzAuYwpAQCAtNDM3LDcgKzQzNyw4IEBACiAJc3RydWN0IG52YzBfY2xvY2tfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbm91dmVhdV9jbG9ja19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgbnZjMF9kb21haW4sICZwcml2KTsKKwlyZXQgPSBub3V2ZWF1X2Nsb2NrX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBudmMwX2RvbWFpbiwgZmFsc2UsCisJCQkJICAgJnByaXYpOwogCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9jbG9jay9udmUwLmMKaW5kZXggZDNjMzdjOS4uNGFjMWFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvY2xvY2svbnZlMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2Nsb2NrL252ZTAuYwpAQCAtNDczLDcgKzQ3Myw4IEBACiAJc3RydWN0IG52ZTBfY2xvY2tfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbm91dmVhdV9jbG9ja19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgbnZlMF9kb21haW4sICZwcml2KTsKKwlyZXQgPSBub3V2ZWF1X2Nsb2NrX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBudmUwX2RvbWFpbiwgdHJ1ZSwKKwkJCQkgICAmcHJpdik7CiAJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL2drMjBhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9nazIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjAyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9nazIwYS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJudmMwLmgiCisKK3N0cnVjdCBnazIwYV9mYl9wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9mYiBiYXNlOworfTsKKworc3RhdGljIGludAorZ2syMGFfZmJfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCisJICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBnazIwYV9mYl9wcml2ICpwcml2OworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2ZiX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAmcHJpdik7CisJKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorZ2syMGFfZmJfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9mYl9pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKEZCLCAweGVhKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IGdrMjBhX2ZiX2N0b3IsCisJCS5kdG9yID0gX25vdXZlYXVfZmJfZHRvciwKKwkJLmluaXQgPSBfbm91dmVhdV9mYl9pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2ZiX2ZpbmksCisJfSwKKwkubWVtdHlwZSA9IG52YzBfZmJfbWVtdHlwZV92YWxpZCwKKwkucmFtID0gJmdrMjBhX3JhbV9vY2xhc3MsCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9wcml2LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9wcml2LmgKaW5kZXggZGE3NGM4OC4uODIyNzNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcHJpdi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3ByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBudmFhX3JhbV9vY2xhc3M7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52YzBfcmFtX29jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnZlMF9yYW1fb2NsYXNzOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBnazIwYV9yYW1fb2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBnbTEwN19yYW1fb2NsYXNzOwogCiBpbnQgbm91dmVhdV9zZGRyM19jYWxjKHN0cnVjdCBub3V2ZWF1X3JhbSAqcmFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbWdrMjBhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1nazIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzdkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1nazIwYS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAicHJpdi5oIgorCisjaW5jbHVkZSA8c3ViZGV2L2ZiLmg+CisKK3N0cnVjdCBnazIwYV9tZW0geworCXN0cnVjdCBub3V2ZWF1X21lbSBiYXNlOworCXZvaWQgKmNwdWFkZHI7CisJZG1hX2FkZHJfdCBoYW5kbGU7Cit9OworI2RlZmluZSB0b19nazIwYV9tZW0obSkgY29udGFpbmVyX29mKG0sIHN0cnVjdCBnazIwYV9tZW0sIGJhc2UpCisKK3N0YXRpYyB2b2lkCitnazIwYV9yYW1fcHV0KHN0cnVjdCBub3V2ZWF1X2ZiICpwZmIsIHN0cnVjdCBub3V2ZWF1X21lbSAqKnBtZW0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbnZfZGV2aWNlX2Jhc2UobnZfZGV2aWNlKHBmYikpOworCXN0cnVjdCBnazIwYV9tZW0gKm1lbSA9IHRvX2drMjBhX21lbSgqcG1lbSk7CisKKwkqcG1lbSA9IE5VTEw7CisJaWYgKHVubGlrZWx5KG1lbSA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJaWYgKGxpa2VseShtZW0tPmNwdWFkZHIpKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIG1lbS0+YmFzZS5zaXplIDw8IFBBR0VfU0hJRlQsCisJCQkJICBtZW0tPmNwdWFkZHIsIG1lbS0+aGFuZGxlKTsKKworCWtmcmVlKG1lbS0+YmFzZS5wYWdlcyk7CisJa2ZyZWUobWVtKTsKK30KKworc3RhdGljIGludAorZ2syMGFfcmFtX2dldChzdHJ1Y3Qgbm91dmVhdV9mYiAqcGZiLCB1NjQgc2l6ZSwgdTMyIGFsaWduLCB1MzIgbmNtaW4sCisJICAgICB1MzIgbWVtdHlwZSwgc3RydWN0IG5vdXZlYXVfbWVtICoqcG1lbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBudl9kZXZpY2VfYmFzZShudl9kZXZpY2UocGZiKSk7CisJc3RydWN0IGdrMjBhX21lbSAqbWVtOworCXUzMiB0eXBlID0gbWVtdHlwZSAmIDB4ZmY7CisJdTMyIG5wYWdlcywgb3JkZXI7CisJaW50IGk7CisKKwludl9kZWJ1ZyhwZmIsICIlczogc2l6ZTogJWxseCBhbGlnbjogJXgsIG5jbWluOiAleFxuIiwgX19mdW5jX18sIHNpemUsCisJCSBhbGlnbiwgbmNtaW4pOworCisJbnBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWlmIChucGFnZXMgPT0gMCkKKwkJbnBhZ2VzID0gMTsKKworCWlmIChhbGlnbiA9PSAwKQorCQlhbGlnbiA9IFBBR0VfU0laRTsKKwlhbGlnbiA+Pj0gUEFHRV9TSElGVDsKKworCS8qIHJvdW5kIGFsaWdubWVudCB0byB0aGUgbmV4dCBwb3dlciBvZiAyLCBpZiBuZWVkZWQgKi8KKwlvcmRlciA9IGZscyhhbGlnbik7CisJaWYgKChhbGlnbiAmIChhbGlnbiAtIDEpKSA9PSAwKQorCQlvcmRlci0tOworCWFsaWduID0gQklUKG9yZGVyKTsKKworCS8qIGVuc3VyZSByZXR1cm5lZCBhZGRyZXNzIGlzIGNvcnJlY3RseSBhbGlnbmVkICovCisJbnBhZ2VzID0gbWF4KGFsaWduLCBucGFnZXMpOworCisJbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbS0+YmFzZS5zaXplID0gbnBhZ2VzOworCW1lbS0+YmFzZS5tZW10eXBlID0gdHlwZTsKKworCW1lbS0+YmFzZS5wYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKGRtYV9hZGRyX3QpICogbnBhZ2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbS0+YmFzZS5wYWdlcykgeworCQlrZnJlZShtZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkqcG1lbSA9ICZtZW0tPmJhc2U7CisKKwltZW0tPmNwdWFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBucGFnZXMgPDwgUEFHRV9TSElGVCwKKwkJCQkJICAmbWVtLT5oYW5kbGUsIEdGUF9LRVJORUwpOworCWlmICghbWVtLT5jcHVhZGRyKSB7CisJCW52X2Vycm9yKHBmYiwgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IVxuIiwgX19mdW5jX18pOworCQlnazIwYV9yYW1fcHV0KHBmYiwgcG1lbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFsaWduIDw8PSBQQUdFX1NISUZUOworCisJLyogYWxpZ25tZW50IGNoZWNrICovCisJaWYgKHVubGlrZWx5KG1lbS0+aGFuZGxlICYgKGFsaWduIC0gMSkpKQorCQludl93YXJuKHBmYiwgIm1lbW9yeSBub3QgYWxpZ25lZCBhcyByZXF1ZXN0ZWQ6ICVwYWQgKDB4JXgpXG4iLAorCQkJJm1lbS0+aGFuZGxlLCBhbGlnbik7CisKKwludl9kZWJ1ZyhwZmIsICJhbGxvYyBzaXplOiAweCV4LCBhbGlnbjogMHgleCwgcGFkZHI6ICVwYWQsIHZhZGRyOiAlcFxuIiwKKwkJIG5wYWdlcyA8PCBQQUdFX1NISUZULCBhbGlnbiwgJm1lbS0+aGFuZGxlLCBtZW0tPmNwdWFkZHIpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQorCQltZW0tPmJhc2UucGFnZXNbaV0gPSBtZW0tPmhhbmRsZSArIChQQUdFX1NJWkUgKiBpKTsKKworCW1lbS0+YmFzZS5vZmZzZXQgPSAodTY0KW1lbS0+YmFzZS5wYWdlc1swXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnazIwYV9yYW1fY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJICAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBkYXRhc2l6ZSwKKwkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X3JhbSAqcmFtOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X3JhbV9jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnJhbSk7CisJKnBvYmplY3QgPSBudl9vYmplY3QocmFtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJhbS0+dHlwZSA9IE5WX01FTV9UWVBFX1NUT0xFTjsKKwlyYW0tPnNpemUgPSBnZXRfbnVtX3BoeXNwYWdlcygpIDw8IFBBR0VfU0hJRlQ7CisKKwlyYW0tPmdldCA9IGdrMjBhX3JhbV9nZXQ7CisJcmFtLT5wdXQgPSBnazIwYV9yYW1fcHV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcworZ2syMGFfcmFtX29jbGFzcyA9IHsKKwkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBnazIwYV9yYW1fY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9yYW1fZHRvciwKKwkJLmluaXQgPSBfbm91dmVhdV9yYW1faW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9yYW1fZmluaSwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52NTAuYwppbmRleCBlZjkxYjZlODkzYWYuLmU1ZDEyYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udjUwLmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXN0cnVjdCBudjUwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnY1MF9yYW1zZXEgKmh3c3EgPSAmcmFtLT5od3NxOwogCi0JcmFtX2V4ZWMoaHdzcSwgbm91dmVhdV9ib29sb3B0KGRldmljZS0+Y2Znb3B0LCAiTnZNZW1FeGVjIiwgZmFsc2UpKTsKKwlyYW1fZXhlYyhod3NxLCBub3V2ZWF1X2Jvb2xvcHQoZGV2aWNlLT5jZmdvcHQsICJOdk1lbUV4ZWMiLCB0cnVlKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YTMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YTMuYwppbmRleCA2ZWI5N2YxLi44MDc2ZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmEzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZhMy5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShwZmIpOwogCXN0cnVjdCBudmEzX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnZhM19yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKLQlyYW1fZXhlYyhmdWMsIG5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52TWVtRXhlYyIsIGZhbHNlKSk7CisJcmFtX2V4ZWMoZnVjLCBub3V2ZWF1X2Jvb2xvcHQoZGV2aWNlLT5jZmdvcHQsICJOdk1lbUV4ZWMiLCB0cnVlKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52YzAuYwppbmRleCA4ZWRjOTIyLi41YTZhNTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmMwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZjMC5jCkBAIC00MDgsNyArNDA4LDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShwZmIpOwogCXN0cnVjdCBudmMwX3JhbSAqcmFtID0gKHZvaWQgKilwZmItPnJhbTsKIAlzdHJ1Y3QgbnZjMF9yYW1mdWMgKmZ1YyA9ICZyYW0tPmZ1YzsKLQlyYW1fZXhlYyhmdWMsIG5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52TWVtRXhlYyIsIGZhbHNlKSk7CisJcmFtX2V4ZWMoZnVjLCBub3V2ZWF1X2Jvb2xvcHQoZGV2aWNlLT5jZmdvcHQsICJOdk1lbUV4ZWMiLCB0cnVlKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52ZTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2ZiL3JhbW52ZTAuYwppbmRleCAxNjc1MjE5Li44NGM3ZWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9mYi9yYW1udmUwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZmIvcmFtbnZlMC5jCkBAIC0xMTExLDcgKzExMTEsNyBAQAogCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZfZGV2aWNlKHBmYik7CiAJc3RydWN0IG52ZTBfcmFtICpyYW0gPSAodm9pZCAqKXBmYi0+cmFtOwogCXN0cnVjdCBudmUwX3JhbWZ1YyAqZnVjID0gJnJhbS0+ZnVjOwotCXJhbV9leGVjKGZ1Yywgbm91dmVhdV9ib29sb3B0KGRldmljZS0+Y2Znb3B0LCAiTnZNZW1FeGVjIiwgZmFsc2UpKTsKKwlyYW1fZXhlYyhmdWMsIG5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52TWVtRXhlYyIsIHRydWUpKTsKIAlyZXR1cm4gKHJhbS0+YmFzZS5uZXh0ID09ICZyYW0tPmJhc2UueGl0aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9iYXNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL2Jhc2UuYwppbmRleCBmNTcyYzI4Li40NWUwMjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL2Jhc2UuYwpAQCAtMjIsMjEgKzIyLDI0IEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAotI2luY2x1ZGUgPHN1YmRldi9ncGlvLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2Jpb3MuaD4KICNpbmNsdWRlIDxzdWJkZXYvYmlvcy9ncGlvLmg+CiAKKyNpbmNsdWRlICJwcml2LmgiCisKIHN0YXRpYyBpbnQKIG5vdXZlYXVfZ3Bpb19kcml2ZShzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLAogCQkgICBpbnQgaWR4LCBpbnQgbGluZSwgaW50IGRpciwgaW50IG91dCkKIHsKLQlyZXR1cm4gZ3Bpby0+ZHJpdmUgPyBncGlvLT5kcml2ZShncGlvLCBsaW5lLCBkaXIsIG91dCkgOiAtRU5PREVWOworCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2dwaW9faW1wbCAqaW1wbCA9ICh2b2lkICopbnZfb2JqZWN0KGdwaW8pLT5vY2xhc3M7CisJcmV0dXJuIGltcGwtPmRyaXZlID8gaW1wbC0+ZHJpdmUoZ3BpbywgbGluZSwgZGlyLCBvdXQpIDogLUVOT0RFVjsKIH0KIAogc3RhdGljIGludAogbm91dmVhdV9ncGlvX3NlbnNlKHN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8sIGludCBpZHgsIGludCBsaW5lKQogewotCXJldHVybiBncGlvLT5zZW5zZSA/IGdwaW8tPnNlbnNlKGdwaW8sIGxpbmUpIDogLUVOT0RFVjsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9ncGlvX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29iamVjdChncGlvKS0+b2NsYXNzOworCXJldHVybiBpbXBsLT5zZW5zZSA/IGltcGwtPnNlbnNlKGdwaW8sIGxpbmUpIDogLUVOT0RFVjsKIH0KIAogc3RhdGljIGludApAQCAtMTAyLDM3ICsxMDUsNTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkCi1fbm91dmVhdV9ncGlvX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCitzdGF0aWMgdm9pZAorbm91dmVhdV9ncGlvX2ludHJfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9ICh2b2lkICopb2JqZWN0OwotCW5vdXZlYXVfZXZlbnRfZGVzdHJveSgmZ3Bpby0+ZXZlbnRzKTsKLQlub3V2ZWF1X3N1YmRldl9kZXN0cm95KCZncGlvLT5iYXNlKTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKGV2ZW50LT5wcml2KTsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9ncGlvX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29iamVjdChncGlvKS0+b2NsYXNzOworCWltcGwtPmludHJfbWFzayhncGlvLCB0eXBlLCAxIDw8IGluZGV4LCAwKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfZ3Bpb19pbnRyX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9IG5vdXZlYXVfZ3BpbyhldmVudC0+cHJpdik7CisJY29uc3Qgc3RydWN0IG5vdXZlYXVfZ3Bpb19pbXBsICppbXBsID0gKHZvaWQgKiludl9vYmplY3QoZ3BpbyktPm9jbGFzczsKKwlpbXBsLT5pbnRyX21hc2soZ3BpbywgdHlwZSwgMSA8PCBpbmRleCwgMSA8PCBpbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2dwaW9faW50cihzdHJ1Y3Qgbm91dmVhdV9zdWJkZXYgKnN1YmRldikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKHN1YmRldik7CisJY29uc3Qgc3RydWN0IG5vdXZlYXVfZ3Bpb19pbXBsICppbXBsID0gKHZvaWQgKiludl9vYmplY3QoZ3BpbyktPm9jbGFzczsKKwl1MzIgaGksIGxvLCBlLCBpOworCisJaW1wbC0+aW50cl9zdGF0KGdwaW8sICZoaSwgJmxvKTsKKworCWZvciAoaSA9IDA7IGUgPSAwLCAoaGkgfCBsbykgJiYgaSA8IGltcGwtPmxpbmVzOyBpKyspIHsKKwkJaWYgKGhpICYgKDEgPDwgaSkpCisJCQllIHw9IE5WS01fR1BJT19ISTsKKwkJaWYgKGxvICYgKDEgPDwgaSkpCisJCQllIHw9IE5WS01fR1BJT19MTzsKKwkJbm91dmVhdV9ldmVudF90cmlnZ2VyKGdwaW8tPmV2ZW50cywgZSwgaSk7CisJfQogfQogCiBpbnQKLW5vdXZlYXVfZ3Bpb19jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAotCQkgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCQkgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCBpbnQgbGluZXMsCi0JCSAgICAgaW50IGxlbmd0aCwgdm9pZCAqKnBvYmplY3QpCitfbm91dmVhdV9ncGlvX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IG5vdXZlYXVfZ3Bpb19pbXBsICppbXBsID0gKHZvaWQgKilvYmplY3QtPm9jbGFzczsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKG9iamVjdCk7CisJdTMyIG1hc2sgPSAoMSA8PCBpbXBsLT5saW5lcykgLSAxOwogCi0JcmV0ID0gbm91dmVhdV9zdWJkZXZfY3JlYXRlXyhwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAwLCAiR1BJTyIsICJncGlvIiwKLQkJCQkgICAgIGxlbmd0aCwgcG9iamVjdCk7Ci0JZ3BpbyA9ICpwb2JqZWN0OwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaW1wbC0+aW50cl9tYXNrKGdwaW8sIE5WS01fR1BJT19UT0dHTEVELCBtYXNrLCAwKTsKKwlpbXBsLT5pbnRyX3N0YXQoZ3BpbywgJm1hc2ssICZtYXNrKTsKIAotCXJldCA9IG5vdXZlYXVfZXZlbnRfY3JlYXRlKGxpbmVzLCAmZ3Bpby0+ZXZlbnRzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JZ3Bpby0+ZmluZCA9IG5vdXZlYXVfZ3Bpb19maW5kOwotCWdwaW8tPnNldCAgPSBub3V2ZWF1X2dwaW9fc2V0OwotCWdwaW8tPmdldCAgPSBub3V2ZWF1X2dwaW9fZ2V0OwotCXJldHVybiAwOworCXJldHVybiBub3V2ZWF1X3N1YmRldl9maW5pKCZncGlvLT5iYXNlLCBzdXNwZW5kKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGdwaW9fcmVzZXRfaWRzW10gPSB7CkBAIC0xNDcsMTIgKzE2NCw3MyBAQAogfTsKIAogaW50Ci1ub3V2ZWF1X2dwaW9faW5pdChzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvKQorX25vdXZlYXVfZ3Bpb19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQogewotCWludCByZXQgPSBub3V2ZWF1X3N1YmRldl9pbml0KCZncGlvLT5iYXNlKTsKLQlpZiAocmV0ID09IDAgJiYgZ3Bpby0+cmVzZXQpIHsKLQkJaWYgKGRtaV9jaGVja19zeXN0ZW0oZ3Bpb19yZXNldF9pZHMpKQotCQkJZ3Bpby0+cmVzZXQoZ3BpbywgRENCX0dQSU9fVU5VU0VEKTsKLQl9CisJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9IG5vdXZlYXVfZ3BpbyhvYmplY3QpOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X3N1YmRldl9pbml0KCZncGlvLT5iYXNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGdwaW8tPnJlc2V0ICYmIGRtaV9jaGVja19zeXN0ZW0oZ3Bpb19yZXNldF9pZHMpKQorCQlncGlvLT5yZXNldChncGlvLCBEQ0JfR1BJT19VTlVTRUQpOworCiAJcmV0dXJuIHJldDsKIH0KKwordm9pZAorX25vdXZlYXVfZ3Bpb19kdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8gPSAodm9pZCAqKW9iamVjdDsKKwlub3V2ZWF1X2V2ZW50X2Rlc3Ryb3koJmdwaW8tPmV2ZW50cyk7CisJbm91dmVhdV9zdWJkZXZfZGVzdHJveSgmZ3Bpby0+YmFzZSk7Cit9CisKK2ludAorbm91dmVhdV9ncGlvX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsCisJCSAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJCSAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsCisJCSAgICAgaW50IGxlbmd0aCwgdm9pZCAqKnBvYmplY3QpCit7CisJY29uc3Qgc3RydWN0IG5vdXZlYXVfZ3Bpb19pbXBsICppbXBsID0gKHZvaWQgKilvY2xhc3M7CisJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbzsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9zdWJkZXZfY3JlYXRlXyhwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAwLCAiR1BJTyIsICJncGlvIiwKKwkJCQkgICAgIGxlbmd0aCwgcG9iamVjdCk7CisJZ3BpbyA9ICpwb2JqZWN0OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlncGlvLT5maW5kID0gbm91dmVhdV9ncGlvX2ZpbmQ7CisJZ3Bpby0+c2V0ICA9IG5vdXZlYXVfZ3Bpb19zZXQ7CisJZ3Bpby0+Z2V0ICA9IG5vdXZlYXVfZ3Bpb19nZXQ7CisJZ3Bpby0+cmVzZXQgPSBpbXBsLT5yZXNldDsKKworCXJldCA9IG5vdXZlYXVfZXZlbnRfY3JlYXRlKDIsIGltcGwtPmxpbmVzLCAmZ3Bpby0+ZXZlbnRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZ3Bpby0+ZXZlbnRzLT5wcml2ID0gZ3BpbzsKKwlncGlvLT5ldmVudHMtPmVuYWJsZSA9IG5vdXZlYXVfZ3Bpb19pbnRyX2VuYWJsZTsKKwlncGlvLT5ldmVudHMtPmRpc2FibGUgPSBub3V2ZWF1X2dwaW9faW50cl9kaXNhYmxlOworCW52X3N1YmRldihncGlvKS0+aW50ciA9IG5vdXZlYXVfZ3Bpb19pbnRyOworCXJldHVybiAwOworfQorCitpbnQKK19ub3V2ZWF1X2dwaW9fY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJCSAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKKwkJICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwaW9fY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsICZncGlvKTsKKwkqcG9iamVjdCA9IG52X29iamVjdChncGlvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252MTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnYxMC5jCmluZGV4IDc2ZDVkNTQuLjI3YWQyM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnYxMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnYxMC5jCkBAIC0yNiwxMCArMjYsNiBAQAogCiAjaW5jbHVkZSAicHJpdi5oIgogCi1zdHJ1Y3QgbnYxMF9ncGlvX3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2dwaW8gYmFzZTsKLX07Ci0KIHN0YXRpYyBpbnQKIG52MTBfZ3Bpb19zZW5zZShzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLCBpbnQgbGluZSkKIHsKQEAgLTgzLDk1ICs3OSwzOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbnYxMF9ncGlvX2ludHIoc3RydWN0IG5vdXZlYXVfc3ViZGV2ICpzdWJkZXYpCitudjEwX2dwaW9faW50cl9zdGF0KHN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8sIHUzMiAqaGksIHUzMiAqbG8pCiB7Ci0Jc3RydWN0IG52MTBfZ3Bpb19wcml2ICpwcml2ID0gKHZvaWQgKilzdWJkZXY7Ci0JdTMyIGludHIgPSBudl9yZDMyKHByaXYsIDB4MDAxMTA0KTsKLQl1MzIgaGkgPSAoaW50ciAmIDB4MDAwMGZmZmYpID4+IDA7Ci0JdTMyIGxvID0gKGludHIgJiAweGZmZmYwMDAwKSA+PiAxNjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IChoaSB8IGxvKSAmJiBpIDwgMzI7IGkrKykgewotCQlpZiAoKGhpIHwgbG8pICYgKDEgPDwgaSkpCi0JCQlub3V2ZWF1X2V2ZW50X3RyaWdnZXIocHJpdi0+YmFzZS5ldmVudHMsIGkpOwotCX0KLQotCW52X3dyMzIocHJpdiwgMHgwMDExMDQsIGludHIpOworCXUzMiBpbnRyID0gbnZfcmQzMihncGlvLCAweDAwMTEwNCk7CisJdTMyIHN0YXQgPSBudl9yZDMyKGdwaW8sIDB4MDAxMTQ0KSAmIGludHI7CisJKmxvID0gKHN0YXQgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwkqaGkgPSAoc3RhdCAmIDB4MDAwMGZmZmYpOworCW52X3dyMzIoZ3BpbywgMHgwMDExMDQsIGludHIpOwogfQogCiBzdGF0aWMgdm9pZAotbnYxMF9ncGlvX2ludHJfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGxpbmUpCitudjEwX2dwaW9faW50cl9tYXNrKHN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8sIHUzMiB0eXBlLCB1MzIgbWFzaywgdTMyIGRhdGEpCiB7Ci0JbnZfd3IzMihldmVudC0+cHJpdiwgMHgwMDExMDQsIDB4MDAwMTAwMDEgPDwgbGluZSk7Ci0JbnZfbWFzayhldmVudC0+cHJpdiwgMHgwMDExNDQsIDB4MDAwMTAwMDEgPDwgbGluZSwgMHgwMDAxMDAwMSA8PCBsaW5lKTsKKwl1MzIgaW50ZSA9IG52X3JkMzIoZ3BpbywgMHgwMDExNDQpOworCWlmICh0eXBlICYgTlZLTV9HUElPX0xPKQorCQlpbnRlID0gKGludGUgJiB+KG1hc2sgPDwgMTYpKSB8IChkYXRhIDw8IDE2KTsKKwlpZiAodHlwZSAmIE5WS01fR1BJT19ISSkKKwkJaW50ZSA9IChpbnRlICYgfm1hc2spIHwgZGF0YTsKKwludl93cjMyKGdwaW8sIDB4MDAxMTQ0LCBpbnRlKTsKIH0KIAotc3RhdGljIHZvaWQKLW52MTBfZ3Bpb19pbnRyX2Rpc2FibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgbGluZSkKLXsKLQludl93cjMyKGV2ZW50LT5wcml2LCAweDAwMTEwNCwgMHgwMDAxMDAwMSA8PCBsaW5lKTsKLQludl9tYXNrKGV2ZW50LT5wcml2LCAweDAwMTE0NCwgMHgwMDAxMDAwMSA8PCBsaW5lLCAweDAwMDAwMDAwKTsKLX0KLQotc3RhdGljIGludAotbnYxMF9ncGlvX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCi17Ci0Jc3RydWN0IG52MTBfZ3Bpb19wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwaW9fY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIDE2LCAmcHJpdik7Ci0JKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXByaXYtPmJhc2UuZHJpdmUgPSBudjEwX2dwaW9fZHJpdmU7Ci0JcHJpdi0+YmFzZS5zZW5zZSA9IG52MTBfZ3Bpb19zZW5zZTsKLQlwcml2LT5iYXNlLmV2ZW50cy0+cHJpdiA9IHByaXY7Ci0JcHJpdi0+YmFzZS5ldmVudHMtPmVuYWJsZSA9IG52MTBfZ3Bpb19pbnRyX2VuYWJsZTsKLQlwcml2LT5iYXNlLmV2ZW50cy0+ZGlzYWJsZSA9IG52MTBfZ3Bpb19pbnRyX2Rpc2FibGU7Ci0JbnZfc3ViZGV2KHByaXYpLT5pbnRyID0gbnYxMF9ncGlvX2ludHI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjEwX2dwaW9fZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgbnYxMF9ncGlvX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlub3V2ZWF1X2dwaW9fZGVzdHJveSgmcHJpdi0+YmFzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW52MTBfZ3Bpb19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQotewotCXN0cnVjdCBudjEwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwaW9faW5pdCgmcHJpdi0+YmFzZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW52X3dyMzIocHJpdiwgMHgwMDExNDQsIDB4MDAwMDAwMDApOwotCW52X3dyMzIocHJpdiwgMHgwMDExMDQsIDB4ZmZmZmZmZmYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjEwX2dwaW9fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQotewotCXN0cnVjdCBudjEwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCW52X3dyMzIocHJpdiwgMHgwMDExNDQsIDB4MDAwMDAwMDApOwotCXJldHVybiBub3V2ZWF1X2dwaW9fZmluaSgmcHJpdi0+YmFzZSwgc3VzcGVuZCk7Ci19Ci0KLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnYxMF9ncGlvX29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKEdQSU8sIDB4MTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52MTBfZ3Bpb19jdG9yLAotCQkuZHRvciA9IG52MTBfZ3Bpb19kdG9yLAotCQkuaW5pdCA9IG52MTBfZ3Bpb19pbml0LAotCQkuZmluaSA9IG52MTBfZ3Bpb19maW5pLAorc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252MTBfZ3Bpb19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2dwaW9faW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihHUElPLCAweDEwKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IF9ub3V2ZWF1X2dwaW9fY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9ncGlvX2R0b3IsCisJCS5pbml0ID0gX25vdXZlYXVfZ3Bpb19pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2dwaW9fZmluaSwKIAl9LAotfTsKKwkubGluZXMgPSAxNiwKKwkuaW50cl9zdGF0ID0gbnYxMF9ncGlvX2ludHJfc3RhdCwKKwkuaW50cl9tYXNrID0gbnYxMF9ncGlvX2ludHJfbWFzaywKKwkuZHJpdmUgPSBudjEwX2dwaW9fZHJpdmUsCisJLnNlbnNlID0gbnYxMF9ncGlvX3NlbnNlLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252NTAuYwppbmRleCAyZWY3NzQ3Li4xODY0ZmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252NTAuYwpAQCAtMjQsMTUgKzI0LDEwIEBACiAKICNpbmNsdWRlICJwcml2LmgiCiAKLXN0cnVjdCBudjUwX2dwaW9fcHJpdiB7Ci0Jc3RydWN0IG5vdXZlYXVfZ3BpbyBiYXNlOwotfTsKLQotc3RhdGljIHZvaWQKK3ZvaWQKIG52NTBfZ3Bpb19yZXNldChzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLCB1OCBtYXRjaCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGdwaW8pOwotCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopZ3BpbzsKIAl1OCB2ZXIsIGxlbjsKIAl1MTYgZW50cnk7CiAJaW50IGVudCA9IC0xOwpAQCAtNTUsNyArNTAsNyBAQAogCiAJCWdwaW8tPnNldChncGlvLCAwLCBmdW5jLCBsaW5lLCBkZWZzKTsKIAotCQludl9tYXNrKHByaXYsIHJlZywgMHgwMDAxMDAwMSA8PCBsc2gsIHZhbCA8PCBsc2gpOworCQludl9tYXNrKGdwaW8sIHJlZywgMHgwMDAxMDAwMSA8PCBsc2gsIHZhbCA8PCBsc2gpOwogCX0KIH0KIApAQCAtNzIsNyArNjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50CitpbnQKIG52NTBfZ3Bpb19kcml2ZShzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLCBpbnQgbGluZSwgaW50IGRpciwgaW50IG91dCkKIHsKIAl1MzIgcmVnLCBzaGlmdDsKQEAgLTg0LDcgKzc5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAoraW50CiBudjUwX2dwaW9fc2Vuc2Uoc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbywgaW50IGxpbmUpCiB7CiAJdTMyIHJlZywgc2hpZnQ7CkBAIC05NSwxMTkgKzkwLDQwIEBACiAJcmV0dXJuICEhKG52X3JkMzIoZ3BpbywgcmVnKSAmICg0IDw8IHNoaWZ0KSk7CiB9CiAKLXZvaWQKLW52NTBfZ3Bpb19pbnRyKHN0cnVjdCBub3V2ZWF1X3N1YmRldiAqc3ViZGV2KQorc3RhdGljIHZvaWQKK252NTBfZ3Bpb19pbnRyX3N0YXQoc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbywgdTMyICpoaSwgdTMyICpsbykKIHsKLQlzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgKnByaXYgPSAodm9pZCAqKXN1YmRldjsKLQl1MzIgaW50cjAsIGludHIxID0gMDsKLQl1MzIgaGksIGxvOwotCWludCBpOwotCi0JaW50cjAgPSBudl9yZDMyKHByaXYsIDB4ZTA1NCkgJiBudl9yZDMyKHByaXYsIDB4ZTA1MCk7Ci0JaWYgKG52X2RldmljZShwcml2KS0+Y2hpcHNldCA+IDB4OTIpCi0JCWludHIxID0gbnZfcmQzMihwcml2LCAweGUwNzQpICYgbnZfcmQzMihwcml2LCAweGUwNzApOwotCi0JaGkgPSAoaW50cjAgJiAweDAwMDBmZmZmKSB8IChpbnRyMSA8PCAxNik7Ci0JbG8gPSAoaW50cjAgPj4gMTYpIHwgKGludHIxICYgMHhmZmZmMDAwMCk7Ci0KLQlmb3IgKGkgPSAwOyAoaGkgfCBsbykgJiYgaSA8IDMyOyBpKyspIHsKLQkJaWYgKChoaSB8IGxvKSAmICgxIDw8IGkpKQotCQkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UuZXZlbnRzLCBpKTsKLQl9Ci0KLQludl93cjMyKHByaXYsIDB4ZTA1NCwgaW50cjApOwotCWlmIChudl9kZXZpY2UocHJpdiktPmNoaXBzZXQgPiAweDkyKQotCQludl93cjMyKHByaXYsIDB4ZTA3NCwgaW50cjEpOworCXUzMiBpbnRyID0gbnZfcmQzMihncGlvLCAweDAwZTA1NCk7CisJdTMyIHN0YXQgPSBudl9yZDMyKGdwaW8sIDB4MDBlMDUwKSAmIGludHI7CisJKmxvID0gKHN0YXQgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwkqaGkgPSAoc3RhdCAmIDB4MDAwMGZmZmYpOworCW52X3dyMzIoZ3BpbywgMHgwMGUwNTQsIGludHIpOwogfQogCi12b2lkCi1udjUwX2dwaW9faW50cl9lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKmV2ZW50LCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkCitudjUwX2dwaW9faW50cl9tYXNrKHN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8sIHUzMiB0eXBlLCB1MzIgbWFzaywgdTMyIGRhdGEpCiB7Ci0JY29uc3QgdTMyIGFkZHIgPSBsaW5lIDwgMTYgPyAweGUwNTAgOiAweGUwNzA7Ci0JY29uc3QgdTMyIG1hc2sgPSAweDAwMDEwMDAxIDw8IChsaW5lICYgMHhmKTsKLQludl93cjMyKGV2ZW50LT5wcml2LCBhZGRyICsgMHgwNCwgbWFzayk7Ci0JbnZfbWFzayhldmVudC0+cHJpdiwgYWRkciArIDB4MDAsIG1hc2ssIG1hc2spOworCXUzMiBpbnRlID0gbnZfcmQzMihncGlvLCAweDAwZTA1MCk7CisJaWYgKHR5cGUgJiBOVktNX0dQSU9fTE8pCisJCWludGUgPSAoaW50ZSAmIH4obWFzayA8PCAxNikpIHwgKGRhdGEgPDwgMTYpOworCWlmICh0eXBlICYgTlZLTV9HUElPX0hJKQorCQlpbnRlID0gKGludGUgJiB+bWFzaykgfCBkYXRhOworCW52X3dyMzIoZ3BpbywgMHgwMGUwNTAsIGludGUpOwogfQogCi12b2lkCi1udjUwX2dwaW9faW50cl9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGxpbmUpCi17Ci0JY29uc3QgdTMyIGFkZHIgPSBsaW5lIDwgMTYgPyAweGUwNTAgOiAweGUwNzA7Ci0JY29uc3QgdTMyIG1hc2sgPSAweDAwMDEwMDAxIDw8IChsaW5lICYgMHhmKTsKLQludl93cjMyKGV2ZW50LT5wcml2LCBhZGRyICsgMHgwNCwgbWFzayk7Ci0JbnZfbWFzayhldmVudC0+cHJpdiwgYWRkciArIDB4MDAsIG1hc2ssIDB4MDAwMDAwMDApOwotfQotCi1zdGF0aWMgaW50Ci1udjUwX2dwaW9fY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCi0JICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKLQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgKnByaXY7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZ3Bpb19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywKLQkJCQkgIG52X2RldmljZShwYXJlbnQpLT5jaGlwc2V0ID4gMHg5MiA/IDMyIDogMTYsCi0JCQkJICAmcHJpdik7Ci0JKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXByaXYtPmJhc2UucmVzZXQgPSBudjUwX2dwaW9fcmVzZXQ7Ci0JcHJpdi0+YmFzZS5kcml2ZSA9IG52NTBfZ3Bpb19kcml2ZTsKLQlwcml2LT5iYXNlLnNlbnNlID0gbnY1MF9ncGlvX3NlbnNlOwotCXByaXYtPmJhc2UuZXZlbnRzLT5wcml2ID0gcHJpdjsKLQlwcml2LT5iYXNlLmV2ZW50cy0+ZW5hYmxlID0gbnY1MF9ncGlvX2ludHJfZW5hYmxlOwotCXByaXYtPmJhc2UuZXZlbnRzLT5kaXNhYmxlID0gbnY1MF9ncGlvX2ludHJfZGlzYWJsZTsKLQludl9zdWJkZXYocHJpdiktPmludHIgPSBudjUwX2dwaW9faW50cjsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotbnY1MF9ncGlvX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCi17Ci0Jc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2ID0gKHZvaWQgKilvYmplY3Q7Ci0Jbm91dmVhdV9ncGlvX2Rlc3Ryb3koJnByaXYtPmJhc2UpOwotfQotCi1pbnQKLW52NTBfZ3Bpb19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQotewotCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwaW9faW5pdCgmcHJpdi0+YmFzZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGRpc2FibGUsIGFuZCBhY2sgYW55IHBlbmRpbmcgZ3BpbyBpbnRlcnJ1cHRzICovCi0JbnZfd3IzMihwcml2LCAweGUwNTAsIDB4MDAwMDAwMDApOwotCW52X3dyMzIocHJpdiwgMHhlMDU0LCAweGZmZmZmZmZmKTsKLQlpZiAobnZfZGV2aWNlKHByaXYpLT5jaGlwc2V0ID4gMHg5MikgewotCQludl93cjMyKHByaXYsIDB4ZTA3MCwgMHgwMDAwMDAwMCk7Ci0JCW52X3dyMzIocHJpdiwgMHhlMDc0LCAweGZmZmZmZmZmKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1udjUwX2dwaW9fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQotewotCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCW52X3dyMzIocHJpdiwgMHhlMDUwLCAweDAwMDAwMDAwKTsKLQlpZiAobnZfZGV2aWNlKHByaXYpLT5jaGlwc2V0ID4gMHg5MikKLQkJbnZfd3IzMihwcml2LCAweGUwNzAsIDB4MDAwMDAwMDApOwotCXJldHVybiBub3V2ZWF1X2dwaW9fZmluaSgmcHJpdi0+YmFzZSwgc3VzcGVuZCk7Ci19Ci0KLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnY1MF9ncGlvX29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKEdQSU8sIDB4NTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52NTBfZ3Bpb19jdG9yLAotCQkuZHRvciA9IG52NTBfZ3Bpb19kdG9yLAotCQkuaW5pdCA9IG52NTBfZ3Bpb19pbml0LAotCQkuZmluaSA9IG52NTBfZ3Bpb19maW5pLAorc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252NTBfZ3Bpb19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2dwaW9faW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihHUElPLCAweDUwKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IF9ub3V2ZWF1X2dwaW9fY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9ncGlvX2R0b3IsCisJCS5pbml0ID0gX25vdXZlYXVfZ3Bpb19pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2dwaW9fZmluaSwKIAl9LAotfTsKKwkubGluZXMgPSAxNiwKKwkuaW50cl9zdGF0ID0gbnY1MF9ncGlvX2ludHJfc3RhdCwKKwkuaW50cl9tYXNrID0gbnY1MF9ncGlvX2ludHJfbWFzaywKKwkuZHJpdmUgPSBudjUwX2dwaW9fZHJpdmUsCisJLnNlbnNlID0gbnY1MF9ncGlvX3NlbnNlLAorCS5yZXNldCA9IG52NTBfZ3Bpb19yZXNldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnY5Mi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udjkyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMDgzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnY5Mi5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgInByaXYuaCIKKwordm9pZAorbnY5Ml9ncGlvX2ludHJfc3RhdChzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLCB1MzIgKmhpLCB1MzIgKmxvKQoreworCXUzMiBpbnRyMCA9IG52X3JkMzIoZ3BpbywgMHgwMGUwNTQpOworCXUzMiBpbnRyMSA9IG52X3JkMzIoZ3BpbywgMHgwMGUwNzQpOworCXUzMiBzdGF0MCA9IG52X3JkMzIoZ3BpbywgMHgwMGUwNTApICYgaW50cjA7CisJdTMyIHN0YXQxID0gbnZfcmQzMihncGlvLCAweDAwZTA3MCkgJiBpbnRyMTsKKwkqbG8gPSAoc3RhdDEgJiAweGZmZmYwMDAwKSB8IChzdGF0MCA+PiAxNik7CisJKmhpID0gKHN0YXQxIDw8IDE2KSB8IChzdGF0MCAmIDB4MDAwMGZmZmYpOworCW52X3dyMzIoZ3BpbywgMHgwMGUwNTQsIGludHIwKTsKKwludl93cjMyKGdwaW8sIDB4MDBlMDc0LCBpbnRyMSk7Cit9CisKK3ZvaWQKK252OTJfZ3Bpb19pbnRyX21hc2soc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbywgdTMyIHR5cGUsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwl1MzIgaW50ZTAgPSBudl9yZDMyKGdwaW8sIDB4MDBlMDUwKTsKKwl1MzIgaW50ZTEgPSBudl9yZDMyKGdwaW8sIDB4MDBlMDcwKTsKKwlpZiAodHlwZSAmIE5WS01fR1BJT19MTykKKwkJaW50ZTAgPSAoaW50ZTAgJiB+KG1hc2sgPDwgMTYpKSB8IChkYXRhIDw8IDE2KTsKKwlpZiAodHlwZSAmIE5WS01fR1BJT19ISSkKKwkJaW50ZTAgPSAoaW50ZTAgJiB+KG1hc2sgJiAweGZmZmYpKSB8IChkYXRhICYgMHhmZmZmKTsKKwltYXNrID4+PSAxNjsKKwlkYXRhID4+PSAxNjsKKwlpZiAodHlwZSAmIE5WS01fR1BJT19MTykKKwkJaW50ZTEgPSAoaW50ZTEgJiB+KG1hc2sgPDwgMTYpKSB8IChkYXRhIDw8IDE2KTsKKwlpZiAodHlwZSAmIE5WS01fR1BJT19ISSkKKwkJaW50ZTEgPSAoaW50ZTEgJiB+bWFzaykgfCBkYXRhOworCW52X3dyMzIoZ3BpbywgMHgwMGUwNTAsIGludGUwKTsKKwludl93cjMyKGdwaW8sIDB4MDBlMDcwLCBpbnRlMSk7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjkyX2dwaW9fb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9ncGlvX2ltcGwpIHsKKwkuYmFzZS5oYW5kbGUgPSBOVl9TVUJERVYoR1BJTywgMHg5MiksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbm91dmVhdV9ncGlvX2N0b3IsCisJCS5kdG9yID0gX25vdXZlYXVfZ3Bpb19kdG9yLAorCQkuaW5pdCA9IF9ub3V2ZWF1X2dwaW9faW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9ncGlvX2ZpbmksCisJfSwKKwkubGluZXMgPSAzMiwKKwkuaW50cl9zdGF0ID0gbnY5Ml9ncGlvX2ludHJfc3RhdCwKKwkuaW50cl9tYXNrID0gbnY5Ml9ncGlvX2ludHJfbWFzaywKKwkuZHJpdmUgPSBudjUwX2dwaW9fZHJpdmUsCisJLnNlbnNlID0gbnY1MF9ncGlvX3NlbnNlLAorCS5yZXNldCA9IG52NTBfZ3Bpb19yZXNldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vbnZkMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udmQwLmMKaW5kZXggMDEwNDMxZS4uYTQ2ODJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udmQwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udmQwLmMKQEAgLTI0LDE1ICsyNCwxMCBAQAogCiAjaW5jbHVkZSAicHJpdi5oIgogCi1zdHJ1Y3QgbnZkMF9ncGlvX3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2dwaW8gYmFzZTsKLX07Ci0KIHZvaWQKIG52ZDBfZ3Bpb19yZXNldChzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvLCB1OCBtYXRjaCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9iaW9zICpiaW9zID0gbm91dmVhdV9iaW9zKGdwaW8pOwotCXN0cnVjdCBudmQwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopZ3BpbzsKIAl1OCB2ZXIsIGxlbjsKIAl1MTYgZW50cnk7CiAJaW50IGVudCA9IC0xOwpAQCAtNTEsOSArNDYsOSBAQAogCiAJCWdwaW8tPnNldChncGlvLCAwLCBmdW5jLCBsaW5lLCBkZWZzKTsKIAotCQludl9tYXNrKHByaXYsIDB4MDBkNjEwICsgKGxpbmUgKiA0KSwgMHhmZiwgdW5rMCk7CisJCW52X21hc2soZ3BpbywgMHgwMGQ2MTAgKyAobGluZSAqIDQpLCAweGZmLCB1bmswKTsKIAkJaWYgKHVuazEtLSkKLQkJCW52X21hc2socHJpdiwgMHgwMGQ3NDAgKyAodW5rMSAqIDQpLCAweGZmLCBsaW5lKTsKKwkJCW52X21hc2soZ3BpbywgMHgwMGQ3NDAgKyAodW5rMSAqIDQpLCAweGZmLCBsaW5lKTsKIAl9CiB9CiAKQEAgLTcyLDM2ICs2NywxOSBAQAogCXJldHVybiAhIShudl9yZDMyKGdwaW8sIDB4MDBkNjEwICsgKGxpbmUgKiA0KSkgJiAweDAwMDA0MDAwKTsKIH0KIAotc3RhdGljIGludAotbnZkMF9ncGlvX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCi17Ci0Jc3RydWN0IG52ZDBfZ3Bpb19wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwaW9fY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIDMyLCAmcHJpdik7Ci0JKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXByaXYtPmJhc2UucmVzZXQgPSBudmQwX2dwaW9fcmVzZXQ7Ci0JcHJpdi0+YmFzZS5kcml2ZSA9IG52ZDBfZ3Bpb19kcml2ZTsKLQlwcml2LT5iYXNlLnNlbnNlID0gbnZkMF9ncGlvX3NlbnNlOwotCXByaXYtPmJhc2UuZXZlbnRzLT5wcml2ID0gcHJpdjsKLQlwcml2LT5iYXNlLmV2ZW50cy0+ZW5hYmxlID0gbnY1MF9ncGlvX2ludHJfZW5hYmxlOwotCXByaXYtPmJhc2UuZXZlbnRzLT5kaXNhYmxlID0gbnY1MF9ncGlvX2ludHJfZGlzYWJsZTsKLQludl9zdWJkZXYocHJpdiktPmludHIgPSBudjUwX2dwaW9faW50cjsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udmQwX2dwaW9fb2NsYXNzID0gewotCS5oYW5kbGUgPSBOVl9TVUJERVYoR1BJTywgMHhkMCksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7Ci0JCS5jdG9yID0gbnZkMF9ncGlvX2N0b3IsCi0JCS5kdG9yID0gbnY1MF9ncGlvX2R0b3IsCi0JCS5pbml0ID0gbnY1MF9ncGlvX2luaXQsCi0JCS5maW5pID0gbnY1MF9ncGlvX2ZpbmksCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnZkMF9ncGlvX29jbGFzcyA9ICYoc3RydWN0IG5vdXZlYXVfZ3Bpb19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKEdQSU8sIDB4ZDApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gX25vdXZlYXVfZ3Bpb19jdG9yLAorCQkuZHRvciA9IF9ub3V2ZWF1X2dwaW9fZHRvciwKKwkJLmluaXQgPSBfbm91dmVhdV9ncGlvX2luaXQsCisJCS5maW5pID0gX25vdXZlYXVfZ3Bpb19maW5pLAogCX0sCi19OworCS5saW5lcyA9IDMyLAorCS5pbnRyX3N0YXQgPSBudjkyX2dwaW9faW50cl9zdGF0LAorCS5pbnRyX21hc2sgPSBudjkyX2dwaW9faW50cl9tYXNrLAorCS5kcml2ZSA9IG52ZDBfZ3Bpb19kcml2ZSwKKwkuc2Vuc2UgPSBudmQwX2dwaW9fc2Vuc2UsCisJLnJlc2V0ID0gbnZkMF9ncGlvX3Jlc2V0LAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252ZTAuYwppbmRleCAxNmI4YzViLi5lMTE0NWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252ZTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9ncGlvL252ZTAuYwpAQCAtMjQsMTA4ICsyNCw1MSBAQAogCiAjaW5jbHVkZSAicHJpdi5oIgogCi1zdHJ1Y3QgbnZlMF9ncGlvX3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2dwaW8gYmFzZTsKLX07Ci0KLXZvaWQKLW52ZTBfZ3Bpb19pbnRyKHN0cnVjdCBub3V2ZWF1X3N1YmRldiAqc3ViZGV2KQorc3RhdGljIHZvaWQKK252ZTBfZ3Bpb19pbnRyX3N0YXQoc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbywgdTMyICpoaSwgdTMyICpsbykKIHsKLQlzdHJ1Y3QgbnZlMF9ncGlvX3ByaXYgKnByaXYgPSAodm9pZCAqKXN1YmRldjsKLQl1MzIgaW50cjAgPSBudl9yZDMyKHByaXYsIDB4ZGMwMCkgJiBudl9yZDMyKHByaXYsIDB4ZGMwOCk7Ci0JdTMyIGludHIxID0gbnZfcmQzMihwcml2LCAweGRjODApICYgbnZfcmQzMihwcml2LCAweGRjODgpOwotCXUzMiBoaSA9IChpbnRyMCAmIDB4MDAwMGZmZmYpIHwgKGludHIxIDw8IDE2KTsKLQl1MzIgbG8gPSAoaW50cjAgPj4gMTYpIHwgKGludHIxICYgMHhmZmZmMDAwMCk7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyAoaGkgfCBsbykgJiYgaSA8IDMyOyBpKyspIHsKLQkJaWYgKChoaSB8IGxvKSAmICgxIDw8IGkpKQotCQkJbm91dmVhdV9ldmVudF90cmlnZ2VyKHByaXYtPmJhc2UuZXZlbnRzLCBpKTsKLQl9Ci0KLQludl93cjMyKHByaXYsIDB4ZGMwMCwgaW50cjApOwotCW52X3dyMzIocHJpdiwgMHhkYzg4LCBpbnRyMSk7CisJdTMyIGludHIwID0gbnZfcmQzMihncGlvLCAweDAwZGMwMCk7CisJdTMyIGludHIxID0gbnZfcmQzMihncGlvLCAweDAwZGM4MCk7CisJdTMyIHN0YXQwID0gbnZfcmQzMihncGlvLCAweDAwZGMwOCkgJiBpbnRyMDsKKwl1MzIgc3RhdDEgPSBudl9yZDMyKGdwaW8sIDB4MDBkYzg4KSAmIGludHIxOworCSpsbyA9IChzdGF0MSAmIDB4ZmZmZjAwMDApIHwgKHN0YXQwID4+IDE2KTsKKwkqaGkgPSAoc3RhdDEgPDwgMTYpIHwgKHN0YXQwICYgMHgwMDAwZmZmZik7CisJbnZfd3IzMihncGlvLCAweDAwZGMwMCwgaW50cjApOworCW52X3dyMzIoZ3BpbywgMHgwMGRjODAsIGludHIxKTsKIH0KIAogdm9pZAotbnZlMF9ncGlvX2ludHJfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IGxpbmUpCitudmUwX2dwaW9faW50cl9tYXNrKHN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8sIHUzMiB0eXBlLCB1MzIgbWFzaywgdTMyIGRhdGEpCiB7Ci0JY29uc3QgdTMyIGFkZHIgPSBsaW5lIDwgMTYgPyAweGRjMDAgOiAweGRjODA7Ci0JY29uc3QgdTMyIG1hc2sgPSAweDAwMDEwMDAxIDw8IChsaW5lICYgMHhmKTsKLQludl93cjMyKGV2ZW50LT5wcml2LCBhZGRyICsgMHgwOCwgbWFzayk7Ci0JbnZfbWFzayhldmVudC0+cHJpdiwgYWRkciArIDB4MDAsIG1hc2ssIG1hc2spOworCXUzMiBpbnRlMCA9IG52X3JkMzIoZ3BpbywgMHgwMGRjMDgpOworCXUzMiBpbnRlMSA9IG52X3JkMzIoZ3BpbywgMHgwMGRjODgpOworCWlmICh0eXBlICYgTlZLTV9HUElPX0xPKQorCQlpbnRlMCA9IChpbnRlMCAmIH4obWFzayA8PCAxNikpIHwgKGRhdGEgPDwgMTYpOworCWlmICh0eXBlICYgTlZLTV9HUElPX0hJKQorCQlpbnRlMCA9IChpbnRlMCAmIH4obWFzayAmIDB4ZmZmZikpIHwgKGRhdGEgJiAweGZmZmYpOworCW1hc2sgPj49IDE2OworCWRhdGEgPj49IDE2OworCWlmICh0eXBlICYgTlZLTV9HUElPX0xPKQorCQlpbnRlMSA9IChpbnRlMSAmIH4obWFzayA8PCAxNikpIHwgKGRhdGEgPDwgMTYpOworCWlmICh0eXBlICYgTlZLTV9HUElPX0hJKQorCQlpbnRlMSA9IChpbnRlMSAmIH5tYXNrKSB8IGRhdGE7CisJbnZfd3IzMihncGlvLCAweDAwZGMwOCwgaW50ZTApOworCW52X3dyMzIoZ3BpbywgMHgwMGRjODgsIGludGUxKTsKIH0KIAotdm9pZAotbnZlMF9ncGlvX2ludHJfZGlzYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCBsaW5lKQotewotCWNvbnN0IHUzMiBhZGRyID0gbGluZSA8IDE2ID8gMHhkYzAwIDogMHhkYzgwOwotCWNvbnN0IHUzMiBtYXNrID0gMHgwMDAxMDAwMSA8PCAobGluZSAmIDB4Zik7Ci0JbnZfd3IzMihldmVudC0+cHJpdiwgYWRkciArIDB4MDgsIG1hc2spOwotCW52X21hc2soZXZlbnQtPnByaXYsIGFkZHIgKyAweDAwLCBtYXNrLCAweDAwMDAwMDAwKTsKLX0KLQotaW50Ci1udmUwX2dwaW9fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQotewotCXN0cnVjdCBudmUwX2dwaW9fcHJpdiAqcHJpdiA9ICh2b2lkICopb2JqZWN0OwotCW52X3dyMzIocHJpdiwgMHhkYzA4LCAweDAwMDAwMDAwKTsKLQludl93cjMyKHByaXYsIDB4ZGM4OCwgMHgwMDAwMDAwMCk7Ci0JcmV0dXJuIG5vdXZlYXVfZ3Bpb19maW5pKCZwcml2LT5iYXNlLCBzdXNwZW5kKTsKLX0KLQotaW50Ci1udmUwX2dwaW9faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgbnZlMF9ncGlvX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9ncGlvX2luaXQoJnByaXYtPmJhc2UpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQludl93cjMyKHByaXYsIDB4ZGMwMCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihwcml2LCAweGRjODAsIDB4ZmZmZmZmZmYpOwotCXJldHVybiAwOwotfQotCi12b2lkCi1udmUwX2dwaW9fZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgbnZlMF9ncGlvX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKLQlub3V2ZWF1X2dwaW9fZGVzdHJveSgmcHJpdi0+YmFzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW52ZTBfZ3Bpb19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBzaXplLAotCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQotewotCXN0cnVjdCBudmUwX2dwaW9fcHJpdiAqcHJpdjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9ncGlvX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAzMiwgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwcml2LT5iYXNlLnJlc2V0ID0gbnZkMF9ncGlvX3Jlc2V0OwotCXByaXYtPmJhc2UuZHJpdmUgPSBudmQwX2dwaW9fZHJpdmU7Ci0JcHJpdi0+YmFzZS5zZW5zZSA9IG52ZDBfZ3Bpb19zZW5zZTsKLQlwcml2LT5iYXNlLmV2ZW50cy0+cHJpdiA9IHByaXY7Ci0JcHJpdi0+YmFzZS5ldmVudHMtPmVuYWJsZSA9IG52ZTBfZ3Bpb19pbnRyX2VuYWJsZTsKLQlwcml2LT5iYXNlLmV2ZW50cy0+ZGlzYWJsZSA9IG52ZTBfZ3Bpb19pbnRyX2Rpc2FibGU7Ci0JbnZfc3ViZGV2KHByaXYpLT5pbnRyID0gbnZlMF9ncGlvX2ludHI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBub3V2ZWF1X29jbGFzcwotbnZlMF9ncGlvX29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKEdQSU8sIDB4ZTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52ZTBfZ3Bpb19jdG9yLAotCQkuZHRvciA9IG52NTBfZ3Bpb19kdG9yLAotCQkuaW5pdCA9IG52ZTBfZ3Bpb19pbml0LAotCQkuZmluaSA9IG52ZTBfZ3Bpb19maW5pLAorc3RydWN0IG5vdXZlYXVfb2NsYXNzICoKK252ZTBfZ3Bpb19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2dwaW9faW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihHUElPLCAweGUwKSwKKwkuYmFzZS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IF9ub3V2ZWF1X2dwaW9fY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9ncGlvX2R0b3IsCisJCS5pbml0ID0gX25vdXZlYXVfZ3Bpb19pbml0LAorCQkuZmluaSA9IF9ub3V2ZWF1X2dwaW9fZmluaSwKIAl9LAotfTsKKwkubGluZXMgPSAzMiwKKwkuaW50cl9zdGF0ID0gbnZlMF9ncGlvX2ludHJfc3RhdCwKKwkuaW50cl9tYXNrID0gbnZlMF9ncGlvX2ludHJfbWFzaywKKwkuZHJpdmUgPSBudmQwX2dwaW9fZHJpdmUsCisJLnNlbnNlID0gbnZkMF9ncGlvX3NlbnNlLAorCS5yZXNldCA9IG52ZDBfZ3Bpb19yZXNldCwKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2dwaW8vcHJpdi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9wcml2LmgKaW5kZXggMmVlMWM4OS4uZTE3MjRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9wcml2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvZ3Bpby9wcml2LmgKQEAgLTMsMTUgKzMsNjUgQEAKIAogI2luY2x1ZGUgPHN1YmRldi9ncGlvLmg+CiAKLXZvaWQgbnY1MF9ncGlvX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOwotaW50ICBudjUwX2dwaW9faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7Ci1pbnQgIG52NTBfZ3Bpb19maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKLXZvaWQgbnY1MF9ncGlvX2ludHIoc3RydWN0IG5vdXZlYXVfc3ViZGV2ICopOwotdm9pZCBudjUwX2dwaW9faW50cl9lbmFibGUoc3RydWN0IG5vdXZlYXVfZXZlbnQgKiwgaW50IGxpbmUpOwotdm9pZCBudjUwX2dwaW9faW50cl9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICosIGludCBsaW5lKTsKKyNkZWZpbmUgbm91dmVhdV9ncGlvX2NyZWF0ZShwLGUsbyxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbm91dmVhdV9ncGlvX2NyZWF0ZV8oKHApLCAoZSksIChvKSwgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCisjZGVmaW5lIG5vdXZlYXVfZ3Bpb19kZXN0cm95KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2dwaW8gKmdwaW8gPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2dwaW9fZHRvcihudl9vYmplY3QoZ3BpbykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9ncGlvX2luaXQocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG5vdXZlYXVfZ3BpbyAqZ3BpbyA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX25vdXZlYXVfZ3Bpb19pbml0KG52X29iamVjdChncGlvKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBub3V2ZWF1X2dwaW9fZmluaShwLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbm91dmVhdV9ncGlvX2ZpbmkobnZfb2JqZWN0KGdwaW8pLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKK2ludCAgbm91dmVhdV9ncGlvX2NyZWF0ZV8oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50LCB2b2lkICoqKTsKK2ludCAgX25vdXZlYXVfZ3Bpb19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJCXN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB2b2lkICosIHUzMiwKKwkJCXN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7Cit2b2lkIF9ub3V2ZWF1X2dwaW9fZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIF9ub3V2ZWF1X2dwaW9faW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIF9ub3V2ZWF1X2dwaW9fZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgYm9vbCk7CisKK3N0cnVjdCBub3V2ZWF1X2dwaW9faW1wbCB7CisJc3RydWN0IG5vdXZlYXVfb2NsYXNzIGJhc2U7CisJaW50IGxpbmVzOworCisJLyogcmVhZCBhbmQgYWNrIHBlbmRpbmcgaW50ZXJydXB0cywgcmV0dXJuaW5nIG9ubHkgZGF0YQorCSAqIGZvciBsaW5lcyB0aGF0IGhhdmUgbm90IGJlZW4gbWFza2VkIG9mZiwgd2hpbGUgc3RpbGwKKwkgKiBwZXJmb3JtaW5nIHRoZSBhY2sgZm9yIGFueXRoaW5nIHRoYXQgd2FzIHBlbmRpbmcuCisJICovCisJdm9pZCAoKmludHJfc3RhdCkoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCB1MzIgKiwgdTMyICopOworCisJLyogbWFzayBvbi9vZmYgaW50ZXJydXB0cyBmb3IgaGkvbG8gdHJhbnNpdGlvbnMgb24gYQorCSAqIGdpdmVuIHNldCBvZiBncGlvIGxpbmVzCisJICovCisJdm9pZCAoKmludHJfbWFzaykoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCB1MzIsIHUzMiwgdTMyKTsKKworCS8qIGNvbmZpZ3VyZSBncGlvIGRpcmVjdGlvbiBhbmQgb3V0cHV0IHZhbHVlICovCisJaW50ICAoKmRyaXZlKShzdHJ1Y3Qgbm91dmVhdV9ncGlvICosIGludCBsaW5lLCBpbnQgZGlyLCBpbnQgb3V0KTsKKworCS8qIHNlbnNlIGN1cnJlbnQgc3RhdGUgb2YgZ2l2ZW4gZ3BpbyBsaW5lICovCisJaW50ICAoKnNlbnNlKShzdHJ1Y3Qgbm91dmVhdV9ncGlvICosIGludCBsaW5lKTsKKworCS8qWFhYKi8KKwl2b2lkICgqcmVzZXQpKHN0cnVjdCBub3V2ZWF1X2dwaW8gKiwgdTgpOworfTsKKwordm9pZCBudjUwX2dwaW9fcmVzZXQoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCB1OCk7CitpbnQgIG52NTBfZ3Bpb19kcml2ZShzdHJ1Y3Qgbm91dmVhdV9ncGlvICosIGludCwgaW50LCBpbnQpOworaW50ICBudjUwX2dwaW9fc2Vuc2Uoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCBpbnQpOworCit2b2lkIG52OTJfZ3Bpb19pbnRyX3N0YXQoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCB1MzIgKiwgdTMyICopOwordm9pZCBudjkyX2dwaW9faW50cl9tYXNrKHN0cnVjdCBub3V2ZWF1X2dwaW8gKiwgdTMyLCB1MzIsIHUzMik7CiAKIHZvaWQgbnZkMF9ncGlvX3Jlc2V0KHN0cnVjdCBub3V2ZWF1X2dwaW8gKiwgdTgpOwogaW50ICBudmQwX2dwaW9fZHJpdmUoc3RydWN0IG5vdXZlYXVfZ3BpbyAqLCBpbnQsIGludCwgaW50KTsKIGludCAgbnZkMF9ncGlvX3NlbnNlKHN0cnVjdCBub3V2ZWF1X2dwaW8gKiwgaW50KTsKIAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9hbng5ODA1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvYW54OTgwNS5jCmluZGV4IDRiMTk1YWMuLjJjMjczMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9hbng5ODA1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2FueDk4MDUuYwpAQCAtMjIsNyArMjIsNyBAQAogICogQXV0aG9yczogQmVuIFNrZWdncyA8YnNrZWdnc0ByZWRoYXQuY29tPgogICovCiAKLSNpbmNsdWRlIDxzdWJkZXYvaTJjLmg+CisjaW5jbHVkZSAicG9ydC5oIgogCiBzdHJ1Y3QgYW54OTgwNV9pMmNfcG9ydCB7CiAJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgYmFzZTsKQEAgLTM3LDYgKzM3LDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqbWFzdCA9ICh2b2lkICopbnZfb2JqZWN0KGNoYW4pLT5wYXJlbnQ7CiAJdTggdG1wLCBpOwogCisJREJHKCJBTlg5ODA1IHRyYWluICVkIDB4JTAyeCAlZFxuIiwgbGlua19uciwgbGlua19idywgZW5oKTsKKwogCW52X3dyaTJjcihtYXN0LCBjaGFuLT5hZGRyLCAweGEwLCBsaW5rX2J3KTsKIAludl93cmkyY3IobWFzdCwgY2hhbi0+YWRkciwgMHhhMSwgbGlua19uciB8IChlbmggPyAweDgwIDogMHgwMCkpOwogCW52X3dyaTJjcihtYXN0LCBjaGFuLT5hZGRyLCAweGEyLCAweDAxKTsKQEAgLTYwLDIxICs2MiwyOSBAQAogfQogCiBzdGF0aWMgaW50Ci1hbng5ODA1X2F1eChzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCwgdTggdHlwZSwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1OCBzaXplKQorYW54OTgwNV9hdXgoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQsIGJvb2wgcmV0cnksCisJICAgIHU4IHR5cGUsIHUzMiBhZGRyLCB1OCAqZGF0YSwgdTggc2l6ZSkKIHsKIAlzdHJ1Y3QgYW54OTgwNV9pMmNfcG9ydCAqY2hhbiA9ICh2b2lkICopcG9ydDsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqbWFzdCA9ICh2b2lkICopbnZfb2JqZWN0KGNoYW4pLT5wYXJlbnQ7CiAJaW50IGksIHJldCA9IC1FVElNRURPVVQ7CisJdTggYnVmWzE2XSA9IHt9OwogCXU4IHRtcDsKIAorCURCRygiJTAyeCAlMDV4ICVkXG4iLCB0eXBlLCBhZGRyLCBzaXplKTsKKwogCXRtcCA9IG52X3JkaTJjcihtYXN0LCBjaGFuLT5jdHJsLCAweDA3KSAmIH4weDA0OwogCW52X3dyaTJjcihtYXN0LCBjaGFuLT5jdHJsLCAweDA3LCB0bXAgfCAweDA0KTsKIAludl93cmkyY3IobWFzdCwgY2hhbi0+Y3RybCwgMHgwNywgdG1wKTsKIAludl93cmkyY3IobWFzdCwgY2hhbi0+Y3RybCwgMHhmNywgMHgwMSk7CiAKIAludl93cmkyY3IobWFzdCwgY2hhbi0+YWRkciwgMHhlNCwgMHg4MCk7Ci0JZm9yIChpID0gMDsgISh0eXBlICYgMSkgJiYgaSA8IHNpemU7IGkrKykKLQkJbnZfd3JpMmNyKG1hc3QsIGNoYW4tPmFkZHIsIDB4ZjAgKyBpLCBkYXRhW2ldKTsKKwlpZiAoISh0eXBlICYgMSkpIHsKKwkJbWVtY3B5KGJ1ZiwgZGF0YSwgc2l6ZSk7CisJCURCRygiJTE2cGgiLCBidWYpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJbnZfd3JpMmNyKG1hc3QsIGNoYW4tPmFkZHIsIDB4ZjAgKyBpLCBidWZbaV0pOworCX0KIAludl93cmkyY3IobWFzdCwgY2hhbi0+YWRkciwgMHhlNSwgKChzaXplIC0gMSkgPDwgNCkgfCB0eXBlKTsKIAludl93cmkyY3IobWFzdCwgY2hhbi0+YWRkciwgMHhlNiwgKGFkZHIgJiAweDAwMGZmKSA+PiAgMCk7CiAJbnZfd3JpMmNyKG1hc3QsIGNoYW4tPmFkZHIsIDB4ZTcsIChhZGRyICYgMHgwZmYwMCkgPj4gIDgpOwpAQCAtOTMsOCArMTAzLDEzIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlmb3IgKGkgPSAwOyAodHlwZSAmIDEpICYmIGkgPCBzaXplOyBpKyspCi0JCWRhdGFbaV0gPSBudl9yZGkyY3IobWFzdCwgY2hhbi0+YWRkciwgMHhmMCArIGkpOworCWlmICh0eXBlICYgMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJYnVmW2ldID0gbnZfcmRpMmNyKG1hc3QsIGNoYW4tPmFkZHIsIDB4ZjAgKyBpKTsKKwkJREJHKCIlMTZwaCIsIGJ1Zik7CisJCW1lbWNweShkYXRhLCBidWYsIHNpemUpOworCX0KKwogCXJldCA9IDA7CiBkb25lOgogCW52X3dyaTJjcihtYXN0LCBjaGFuLT5jdHJsLCAweGY3LCAweDAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9hdXguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9hdXguYwppbmRleCA1ZGUwNzRhLi4wMmViNDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvYXV4LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2F1eC5jCkBAIC0yMiwxNSArMjIsMTkgQEAKICAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKICAqLwogCi0jaW5jbHVkZSA8c3ViZGV2L2kyYy5oPgorI2luY2x1ZGUgInByaXYuaCIKIAogaW50CiBudl9yZGF1eChzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1OCBzaXplKQogeworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gbm91dmVhdV9pMmMocG9ydCk7CiAJaWYgKHBvcnQtPmZ1bmMtPmF1eCkgewotCQlpZiAocG9ydC0+ZnVuYy0+YWNxdWlyZSkKLQkJCXBvcnQtPmZ1bmMtPmFjcXVpcmUocG9ydCk7Ci0JCXJldHVybiBwb3J0LT5mdW5jLT5hdXgocG9ydCwgOSwgYWRkciwgZGF0YSwgc2l6ZSk7CisJCWludCByZXQgPSBpMmMtPmFjcXVpcmUocG9ydCwgMCk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gcG9ydC0+ZnVuYy0+YXV4KHBvcnQsIHRydWUsIDksIGFkZHIsIGRhdGEsIHNpemUpOworCQkJaTJjLT5yZWxlYXNlKHBvcnQpOworCQl9CisJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAtRU5PREVWOwogfQpAQCAtMzgsMTAgKzQyLDE0IEBACiBpbnQKIG52X3dyYXV4KHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0LCB1MzIgYWRkciwgdTggKmRhdGEsIHU4IHNpemUpCiB7CisJc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSBub3V2ZWF1X2kyYyhwb3J0KTsKIAlpZiAocG9ydC0+ZnVuYy0+YXV4KSB7Ci0JCWlmIChwb3J0LT5mdW5jLT5hY3F1aXJlKQotCQkJcG9ydC0+ZnVuYy0+YWNxdWlyZShwb3J0KTsKLQkJcmV0dXJuIHBvcnQtPmZ1bmMtPmF1eChwb3J0LCA4LCBhZGRyLCBkYXRhLCBzaXplKTsKKwkJaW50IHJldCA9IGkyYy0+YWNxdWlyZShwb3J0LCAwKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBwb3J0LT5mdW5jLT5hdXgocG9ydCwgdHJ1ZSwgOCwgYWRkciwgZGF0YSwgc2l6ZSk7CisJCQlpMmMtPnJlbGVhc2UocG9ydCk7CisJCX0KKwkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC01MCwxMyArNTgsMTYgQEAKIGF1eF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCiB7CiAJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQgPSBhZGFwLT5hbGdvX2RhdGE7CisJc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSBub3V2ZWF1X2kyYyhwb3J0KTsKIAlzdHJ1Y3QgaTJjX21zZyAqbXNnID0gbXNnczsKIAlpbnQgcmV0LCBtY250ID0gbnVtOwogCiAJaWYgKCFwb3J0LT5mdW5jLT5hdXgpCiAJCXJldHVybiAtRU5PREVWOwotCWlmICggcG9ydC0+ZnVuYy0+YWNxdWlyZSkKLQkJcG9ydC0+ZnVuYy0+YWNxdWlyZShwb3J0KTsKKworCXJldCA9IGkyYy0+YWNxdWlyZShwb3J0LCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJd2hpbGUgKG1jbnQtLSkgewogCQl1OCByZW1haW5pbmcgPSBtc2ctPmxlbjsKQEAgLTc0LDkgKzg1LDExIEBACiAJCQlpZiAobWNudCB8fCByZW1haW5pbmcgPiAxNikKIAkJCQljbWQgfD0gNDsgLyogTU9UICovCiAKLQkJCXJldCA9IHBvcnQtPmZ1bmMtPmF1eChwb3J0LCBjbWQsIG1zZy0+YWRkciwgcHRyLCBjbnQpOwotCQkJaWYgKHJldCA8IDApCisJCQlyZXQgPSBwb3J0LT5mdW5jLT5hdXgocG9ydCwgdHJ1ZSwgY21kLCBtc2ctPmFkZHIsIHB0ciwgY250KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJaTJjLT5yZWxlYXNlKHBvcnQpOwogCQkJCXJldHVybiByZXQ7CisJCQl9CiAKIAkJCXB0ciArPSBjbnQ7CiAJCQlyZW1haW5pbmcgLT0gY250OwpAQCAtODUsNiArOTgsNyBAQAogCQltc2crKzsKIAl9CiAKKwlpMmMtPnJlbGVhc2UocG9ydCk7CiAJcmV0dXJuIG51bTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9iYXNlLmMKaW5kZXggMzc4ZTA1Yi4uMDliYTJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvYmFzZS5jCkBAIC0yMywxMyArMjMsMTYgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29yZS9vcHRpb24uaD4KKyNpbmNsdWRlIDxjb3JlL2V2ZW50Lmg+CiAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2RjYi5oPgogI2luY2x1ZGUgPHN1YmRldi9iaW9zL2kyYy5oPgotI2luY2x1ZGUgPHN1YmRldi9pMmMuaD4KICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CiAKKyNpbmNsdWRlICJwcml2LmgiCisjaW5jbHVkZSAicGFkLmgiCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGludGVyZmFjZSB0byBsaW51eCBpMmMgYml0LWJhbmdpbmcgYWxnb3JpdGhtCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NSw5ICs0OCwxNSBAQAogewogCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYml0ID0gYWRhcC0+YWxnb19kYXRhOwogCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gYml0LT5kYXRhOwotCWlmIChwb3J0LT5mdW5jLT5hY3F1aXJlKQotCQlwb3J0LT5mdW5jLT5hY3F1aXJlKHBvcnQpOwotCXJldHVybiAwOworCXJldHVybiBub3V2ZWF1X2kyYyhwb3J0KS0+YWNxdWlyZShwb3J0LCBiaXQtPnRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9pMmNfcG9zdF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmJpdCA9IGFkYXAtPmFsZ29fZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCA9IGJpdC0+ZGF0YTsKKwlyZXR1cm4gbm91dmVhdV9pMmMocG9ydCktPnJlbGVhc2UocG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC04Miw2ICs5MSwxNSBAQAogICogYmFzZSBpMmMgInBvcnQiIGNsYXNzIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK2ludAorX25vdXZlYXVfaTJjX3BvcnRfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gKHZvaWQgKilvYmplY3Q7CisJc3RydWN0IG52a21faTJjX3BhZCAqcGFkID0gbnZrbV9pMmNfcGFkKHBvcnQpOworCW52X29mdW5jcyhwYWQpLT5maW5pKG52X29iamVjdChwYWQpLCBzdXNwZW5kKTsKKwlyZXR1cm4gbm91dmVhdV9vYmplY3RfZmluaSgmcG9ydC0+YmFzZSwgc3VzcGVuZCk7Cit9CisKIHZvaWQKIF9ub3V2ZWF1X2kyY19wb3J0X2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QpCiB7CkBAIC05OCw3ICsxMTYsNyBAQAogCQkJIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2kyY19mdW5jICpmdW5jLAogCQkJIGludCBzaXplLCB2b2lkICoqcG9iamVjdCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZSA9IG52X2RldmljZShwYXJlbnQpOworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2aWNlID0gbnZfZGV2aWNlKGVuZ2luZSk7CiAJc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSAodm9pZCAqKWVuZ2luZTsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydDsKIAlpbnQgcmV0OwpAQCAtMTEzLDggKzEzMSw5IEBACiAJcG9ydC0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOwogCXBvcnQtPmFkYXB0ZXIuZGV2LnBhcmVudCA9IG52X2RldmljZV9iYXNlKGRldmljZSk7CiAJcG9ydC0+aW5kZXggPSBpbmRleDsKKwlwb3J0LT5hdXggPSAtMTsKIAlwb3J0LT5mdW5jID0gZnVuYzsKLQlpMmNfc2V0X2FkYXBkYXRhKCZwb3J0LT5hZGFwdGVyLCBpMmMpOworCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKIAogCWlmICggYWxnbyA9PSAmbm91dmVhdV9pMmNfYml0X2FsZ28gJiYKIAkgICAgIW5vdXZlYXVfYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52STJDIiwgQ1NUTVNFTCkpIHsKQEAgLTEyOCw2ICsxNDcsNyBAQAogCQliaXQtPnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKDIyMDApOwogCQliaXQtPmRhdGEgPSBwb3J0OwogCQliaXQtPnByZV94ZmVyID0gbm91dmVhdV9pMmNfcHJlX3hmZXI7CisJCWJpdC0+cG9zdF94ZmVyID0gbm91dmVhdV9pMmNfcG9zdF94ZmVyOwogCQliaXQtPnNldHNkYSA9IG5vdXZlYXVfaTJjX3NldHNkYTsKIAkJYml0LT5zZXRzY2wgPSBub3V2ZWF1X2kyY19zZXRzY2w7CiAJCWJpdC0+Z2V0c2RhID0gbm91dmVhdV9pMmNfZ2V0c2RhOwpAQCAtMTQxLDcgKzE2MSw2IEBACiAJCXJldCA9IGkyY19hZGRfYWRhcHRlcigmcG9ydC0+YWRhcHRlcik7CiAJfQogCi0JLyogZHJvcCBwb3J0J3MgaTJjIHN1YmRldiByZWZjb3VudCwgaTJjIGhhbmRsZXMgdGhpcyBpdHNlbGYgKi8KIAlpZiAocmV0ID09IDApCiAJCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmhlYWQsICZpMmMtPnBvcnRzKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTkzLDYgKzIxMiw3NSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZAorbm91dmVhdV9pMmNfcmVsZWFzZV9wYWQoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG52a21faTJjX3BhZCAqcGFkID0gbnZrbV9pMmNfcGFkKHBvcnQpOworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gbm91dmVhdV9pMmMocG9ydCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbnZfb2JqZWN0KHBhZCktPnVzZWNvdW50KSkgeworCQludl9vZnVuY3MocGFkKS0+ZmluaShudl9vYmplY3QocGFkKSwgZmFsc2UpOworCQl3YWtlX3VwX2FsbCgmaTJjLT53YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfaTJjX3RyeV9hY3F1aXJlX3BhZChzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbnZrbV9pMmNfcGFkICpwYWQgPSBudmttX2kyY19wYWQocG9ydCk7CisKKwlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJm52X29iamVjdChwYWQpLT51c2Vjb3VudCkgIT0gMSkgeworCQlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm93bmVyID0gKHZvaWQgKilwYWQtPnBvcnQ7CisJCWRvIHsKKwkJCWlmIChvd25lciA9PSAodm9pZCAqKXBvcnQpCisJCQkJcmV0dXJuIDA7CisJCQlvd25lciA9IG93bmVyLT5wYXJlbnQ7CisJCX0gd2hpbGUob3duZXIpOworCQlub3V2ZWF1X2kyY19yZWxlYXNlX3BhZChwb3J0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwYWQtPm5leHQgPSBwb3J0OworCW52X29mdW5jcyhwYWQpLT5pbml0KG52X29iamVjdChwYWQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9pMmNfYWNxdWlyZV9wYWQoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKHBvcnQpOworCisJaWYgKHRpbWVvdXQpIHsKKwkJaWYgKHdhaXRfZXZlbnRfdGltZW91dChpMmMtPndhaXQsCisJCQkJICAgICAgIG5vdXZlYXVfaTJjX3RyeV9hY3F1aXJlX3BhZChwb3J0KSA9PSAwLAorCQkJCSAgICAgICB0aW1lb3V0KSA9PSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9IGVsc2UgeworCQl3YWl0X2V2ZW50KGkyYy0+d2FpdCwgbm91dmVhdV9pMmNfdHJ5X2FjcXVpcmVfcGFkKHBvcnQpID09IDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9pMmNfcmVsZWFzZShzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCkKK19fcmVsZWFzZXMocGFkLT5tdXRleCkKK3sKKwlub3V2ZWF1X2kyYyhwb3J0KS0+cmVsZWFzZV9wYWQocG9ydCk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfaTJjX2FjcXVpcmUoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK19fYWNxdWlyZXMocGFkLT5tdXRleCkKK3sKKwlpbnQgcmV0OworCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKwlpZiAoKHJldCA9IG5vdXZlYXVfaTJjKHBvcnQpLT5hY3F1aXJlX3BhZChwb3J0LCB0aW1lb3V0KSkpCisJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQKIG5vdXZlYXVfaTJjX2lkZW50aWZ5KHN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKndoYXQsCiAJCSAgICAgc3RydWN0IG5vdXZlYXVfaTJjX2JvYXJkX2luZm8gKmluZm8sCkBAIC0yMzcsMTEgKzMyNSw1OSBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgdm9pZAorbm91dmVhdV9pMmNfaW50cl9kaXNhYmxlKHN0cnVjdCBub3V2ZWF1X2V2ZW50ICpldmVudCwgaW50IHR5cGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IG5vdXZlYXVfaTJjKGV2ZW50LT5wcml2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCA9IGkyYy0+ZmluZChpMmMsIGluZGV4KTsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9pMmNfaW1wbCAqaW1wbCA9ICh2b2lkICopbnZfb2JqZWN0KGkyYyktPm9jbGFzczsKKwlpZiAocG9ydCAmJiBwb3J0LT5hdXggPj0gMCkKKwkJaW1wbC0+YXV4X21hc2soaTJjLCB0eXBlLCAxIDw8IHBvcnQtPmF1eCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2kyY19pbnRyX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9ldmVudCAqZXZlbnQsIGludCB0eXBlLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSBub3V2ZWF1X2kyYyhldmVudC0+cHJpdik7CisJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQgPSBpMmMtPmZpbmQoaTJjLCBpbmRleCk7CisJY29uc3Qgc3RydWN0IG5vdXZlYXVfaTJjX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29iamVjdChpMmMpLT5vY2xhc3M7CisJaWYgKHBvcnQgJiYgcG9ydC0+YXV4ID49IDApCisJCWltcGwtPmF1eF9tYXNrKGkyYywgdHlwZSwgMSA8PCBwb3J0LT5hdXgsIDEgPDwgcG9ydC0+YXV4KTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfaTJjX2ludHIoc3RydWN0IG5vdXZlYXVfc3ViZGV2ICpzdWJkZXYpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2ltcGwgKmltcGwgPSAodm9pZCAqKW52X29jbGFzcyhzdWJkZXYpOworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gbm91dmVhdV9pMmMoc3ViZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydDsKKwl1MzIgaGksIGxvLCBycSwgdHgsIGU7CisKKwlpZiAoaW1wbC0+YXV4X3N0YXQpIHsKKwkJaW1wbC0+YXV4X3N0YXQoaTJjLCAmaGksICZsbywgJnJxLCAmdHgpOworCQlpZiAoaGkgfHwgbG8gfHwgcnEgfHwgdHgpIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmkyYy0+cG9ydHMsIGhlYWQpIHsKKwkJCQlpZiAoZSA9IDAsIHBvcnQtPmF1eCA8IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGhpICYgKDEgPDwgcG9ydC0+YXV4KSkgZSB8PSBOVktNX0kyQ19QTFVHOworCQkJCWlmIChsbyAmICgxIDw8IHBvcnQtPmF1eCkpIGUgfD0gTlZLTV9JMkNfVU5QTFVHOworCQkJCWlmIChycSAmICgxIDw8IHBvcnQtPmF1eCkpIGUgfD0gTlZLTV9JMkNfSVJROworCQkJCWlmICh0eCAmICgxIDw8IHBvcnQtPmF1eCkpIGUgfD0gTlZLTV9JMkNfRE9ORTsKKworCQkJCW5vdXZlYXVfZXZlbnRfdHJpZ2dlcihpMmMtPm50ZnksIGUsIHBvcnQtPmluZGV4KTsKKwkJCX0KKwkJfQorCX0KK30KKwogaW50CiBfbm91dmVhdV9pMmNfZmluaShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCwgYm9vbCBzdXNwZW5kKQogeworCXN0cnVjdCBub3V2ZWF1X2kyY19pbXBsICppbXBsID0gKHZvaWQgKiludl9vY2xhc3Mob2JqZWN0KTsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9ICh2b2lkICopb2JqZWN0OwogCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0OworCXUzMiBtYXNrOwogCWludCByZXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZpMmMtPnBvcnRzLCBoZWFkKSB7CkBAIC0yNTAsNiArMzg2LDExIEBACiAJCQlnb3RvIGZhaWw7CiAJfQogCisJaWYgKChtYXNrID0gKDEgPDwgaW1wbC0+YXV4KSAtIDEpLCBpbXBsLT5hdXhfc3RhdCkgeworCQlpbXBsLT5hdXhfbWFzayhpMmMsIE5WS01fSTJDX0FOWSwgbWFzaywgMCk7CisJCWltcGwtPmF1eF9zdGF0KGkyYywgJm1hc2ssICZtYXNrLCAmbWFzaywgJm1hc2spOworCX0KKwogCXJldHVybiBub3V2ZWF1X3N1YmRldl9maW5pKCZpMmMtPmJhc2UsIHN1c3BlbmQpOwogZmFpbDoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocG9ydCwgJmkyYy0+cG9ydHMsIGhlYWQpIHsKQEAgLTI5MCw2ICs0MzEsOCBAQAogCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gKHZvaWQgKilvYmplY3Q7CiAJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQsICp0ZW1wOwogCisJbm91dmVhdV9ldmVudF9kZXN0cm95KCZpMmMtPm50ZnkpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHRlbXAsICZpMmMtPnBvcnRzLCBoZWFkKSB7CiAJCW5vdXZlYXVfb2JqZWN0X3JlZihOVUxMLCAoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqKSZwb3J0KTsKIAl9CkBAIC0zMDYsMTQgKzQ0OSwxNCBAQAogbm91dmVhdV9pMmNfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwKIAkJICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAogCQkgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsCi0JCSAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKnNjbGFzcywKIAkJICAgIGludCBsZW5ndGgsIHZvaWQgKipwb2JqZWN0KQogeworCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2kyY19pbXBsICppbXBsID0gKHZvaWQgKilvY2xhc3M7CiAJc3RydWN0IG5vdXZlYXVfYmlvcyAqYmlvcyA9IG5vdXZlYXVfYmlvcyhwYXJlbnQpOwogCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjOwogCXN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0OwogCXN0cnVjdCBkY2JfaTJjX2VudHJ5IGluZm87Ci0JaW50IHJldCwgaSwgaiwgaW5kZXggPSAtMTsKKwlpbnQgcmV0LCBpLCBqLCBpbmRleCA9IC0xLCBwYWQ7CiAJc3RydWN0IGRjYl9vdXRwdXQgb3V0cDsKIAl1OCAgdmVyLCBoZHI7CiAJdTMyIGRhdGE7CkBAIC0zMjQsMjQgKzQ2Nyw0OCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwludl9zdWJkZXYoaTJjKS0+aW50ciA9IG5vdXZlYXVfaTJjX2ludHI7CiAJaTJjLT5maW5kID0gbm91dmVhdV9pMmNfZmluZDsKIAlpMmMtPmZpbmRfdHlwZSA9IG5vdXZlYXVfaTJjX2ZpbmRfdHlwZTsKKwlpMmMtPmFjcXVpcmVfcGFkID0gbm91dmVhdV9pMmNfYWNxdWlyZV9wYWQ7CisJaTJjLT5yZWxlYXNlX3BhZCA9IG5vdXZlYXVfaTJjX3JlbGVhc2VfcGFkOworCWkyYy0+YWNxdWlyZSA9IG5vdXZlYXVfaTJjX2FjcXVpcmU7CisJaTJjLT5yZWxlYXNlID0gbm91dmVhdV9pMmNfcmVsZWFzZTsKIAlpMmMtPmlkZW50aWZ5ID0gbm91dmVhdV9pMmNfaWRlbnRpZnk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53YWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmaTJjLT5wb3J0cyk7CiAKIAl3aGlsZSAoIWRjYl9pMmNfcGFyc2UoYmlvcywgKytpbmRleCwgJmluZm8pKSB7CiAJCWlmIChpbmZvLnR5cGUgPT0gRENCX0kyQ19VTlVTRUQpCiAJCQljb250aW51ZTsKIAotCQlvY2xhc3MgPSBzY2xhc3M7CisJCWlmIChpbmZvLnNoYXJlICE9IERDQl9JMkNfVU5VU0VEKSB7CisJCQlpZiAoaW5mby50eXBlID09IERDQl9JMkNfTlZJT19BVVgpCisJCQkJcGFkID0gaW5mby5kcml2ZTsKKwkJCWVsc2UKKwkJCQlwYWQgPSBpbmZvLnNoYXJlOworCQkJb2NsYXNzID0gaW1wbC0+cGFkX3M7CisJCX0gZWxzZSB7CisJCQlwYWQgPSAweDEwMCArIGluZm8uZHJpdmU7CisJCQlvY2xhc3MgPSBpbXBsLT5wYWRfeDsKKwkJfQorCisJCXJldCA9IG5vdXZlYXVfb2JqZWN0X2N0b3IoTlVMTCwgKnBvYmplY3QsIG9jbGFzcywKKwkJCQkJICBOVUxMLCBwYWQsICZwYXJlbnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWNvbnRpbnVlOworCisJCW9jbGFzcyA9IGltcGwtPnNjbGFzczsKIAkJZG8gewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWlmIChvY2xhc3MtPmhhbmRsZSA9PSBpbmZvLnR5cGUpIHsKLQkJCQlyZXQgPSBub3V2ZWF1X29iamVjdF9jdG9yKCpwb2JqZWN0LCAqcG9iamVjdCwKKwkJCQlyZXQgPSBub3V2ZWF1X29iamVjdF9jdG9yKHBhcmVudCwgKnBvYmplY3QsCiAJCQkJCQkJICBvY2xhc3MsICZpbmZvLAogCQkJCQkJCSAgaW5kZXgsICZvYmplY3QpOwogCQkJfQogCQl9IHdoaWxlIChyZXQgJiYgKCsrb2NsYXNzKS0+aGFuZGxlKTsKKworCQlub3V2ZWF1X29iamVjdF9yZWYoTlVMTCwgJnBhcmVudCk7CiAJfQogCiAJLyogaW4gYWRkaXRpb24gdG8gdGhlIGJ1c3NlcyBzcGVjaWZpZWQgaW4gdGhlIGkyYyB0YWJsZSwgdGhlcmUKQEAgLTM4MCw1ICs1NDcsMjggQEAKIAkJfQogCX0KIAorCXJldCA9IG5vdXZlYXVfZXZlbnRfY3JlYXRlKDQsIGluZGV4LCAmaTJjLT5udGZ5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaTJjLT5udGZ5LT5wcml2ID0gaTJjOworCWkyYy0+bnRmeS0+ZW5hYmxlID0gbm91dmVhdV9pMmNfaW50cl9lbmFibGU7CisJaTJjLT5udGZ5LT5kaXNhYmxlID0gbm91dmVhdV9pMmNfaW50cl9kaXNhYmxlOworCXJldHVybiAwOworfQorCitpbnQKK19ub3V2ZWF1X2kyY19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCisJCSAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYzsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9pMmNfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsICZpMmMpOworCSpwb2JqZWN0ID0gbnZfb2JqZWN0KGkyYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2JpdC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL2JpdC5jCmluZGV4IGE2ZTcyZDMuLjgxM2ZmYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9iaXQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvYml0LmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKICAqLwogCi0jaW5jbHVkZSAic3ViZGV2L2kyYy5oIgorI2luY2x1ZGUgInByaXYuaCIKIAogI2lmZGVmIENPTkZJR19OT1VWRUFVX0kyQ19JTlRFUk5BTAogI2RlZmluZSBUX1RJTUVPVVQgIDIyMDAwMDAKQEAgLTE4Nyw4ICsxODcsOSBAQAogCXN0cnVjdCBpMmNfbXNnICptc2cgPSBtc2dzOwogCWludCByZXQgPSAwLCBtY250ID0gbnVtOwogCi0JaWYgKHBvcnQtPmZ1bmMtPmFjcXVpcmUpCi0JCXBvcnQtPmZ1bmMtPmFjcXVpcmUocG9ydCk7CisJcmV0ID0gbm91dmVhdV9pMmMocG9ydCktPmFjcXVpcmUocG9ydCwgbnNlY3NfdG9famlmZmllcyhUX1RJTUVPVVQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJd2hpbGUgKCFyZXQgJiYgbWNudC0tKSB7CiAJCXU4IHJlbWFpbmluZyA9IG1zZy0+bGVuOwpAQCAtMjEwLDYgKzIxMSw3IEBACiAJfQogCiAJaTJjX3N0b3AocG9ydCk7CisJbm91dmVhdV9pMmMocG9ydCktPnJlbGVhc2UocG9ydCk7CiAJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IG51bTsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252MDQuYwppbmRleCA4NjBkNWQyLi5iMTcyNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjA0LmMKQEAgLTIyLDkgKzIyLDEwIEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAotI2luY2x1ZGUgPHN1YmRldi9pMmMuaD4KICNpbmNsdWRlIDxzdWJkZXYvdmdhLmg+CiAKKyNpbmNsdWRlICJwcml2LmgiCisKIHN0cnVjdCBudjA0X2kyY19wcml2IHsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmMgYmFzZTsKIH07CkBAIC0xMTUsMjkgKzExNiwxNSBAQAogCXt9CiB9OwogCi1zdGF0aWMgaW50Ci1udjA0X2kyY19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnYwNF9pMmNfcHJpdiAqcHJpdjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9pMmNfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52MDRfaTJjX3NjbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjA0X2kyY19vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4MDQpLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52MDRfaTJjX2N0b3IsCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnYwNF9pMmNfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9pMmNfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4MDQpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gX25vdXZlYXVfaTJjX2N0b3IsCiAJCS5kdG9yID0gX25vdXZlYXVfaTJjX2R0b3IsCiAJCS5pbml0ID0gX25vdXZlYXVfaTJjX2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfaTJjX2ZpbmksCiAJfSwKLX07CisJLnNjbGFzcyA9IG52MDRfaTJjX3NjbGFzcywKKwkucGFkX3ggPSAmbnYwNF9pMmNfcGFkX29jbGFzcywKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnY0ZS5jCmluZGV4IDBjMjY1NWEuLmYxNmM4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252NGUuYwpAQCAtMjIsOSArMjIsMTAgQEAKICAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKICAqLwogCi0jaW5jbHVkZSA8c3ViZGV2L2kyYy5oPgogI2luY2x1ZGUgPHN1YmRldi92Z2EuaD4KIAorI2luY2x1ZGUgInByaXYuaCIKKwogc3RydWN0IG52NGVfaTJjX3ByaXYgewogCXN0cnVjdCBub3V2ZWF1X2kyYyBiYXNlOwogfTsKQEAgLTEwNywyOSArMTA4LDE1IEBACiAJe30KIH07CiAKLXN0YXRpYyBpbnQKLW52NGVfaTJjX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCSAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKLQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQotewotCXN0cnVjdCBudjRlX2kyY19wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2kyY19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgbnY0ZV9pMmNfc2NsYXNzLCAmcHJpdik7Ci0JKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52NGVfaTJjX29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKEkyQywgMHg0ZSksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7Ci0JCS5jdG9yID0gbnY0ZV9pMmNfY3RvciwKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudjRlX2kyY19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2kyY19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKEkyQywgMHg0ZSksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbm91dmVhdV9pMmNfY3RvciwKIAkJLmR0b3IgPSBfbm91dmVhdV9pMmNfZHRvciwKIAkJLmluaXQgPSBfbm91dmVhdV9pMmNfaW5pdCwKIAkJLmZpbmkgPSBfbm91dmVhdV9pMmNfZmluaSwKIAl9LAotfTsKKwkuc2NsYXNzID0gbnY0ZV9pMmNfc2NsYXNzLAorCS5wYWRfeCA9ICZudjA0X2kyY19wYWRfb2NsYXNzLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252NTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjUwLmMKaW5kZXggYThkNjdhMi4uN2I4NzU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnY1MC5jCkBAIC0xMjEsMjkgKzEyMSwxNSBAQAogCXt9CiB9OwogCi1zdGF0aWMgaW50Ci1udjUwX2kyY19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnY1MF9pMmNfcHJpdiAqcHJpdjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9pMmNfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52NTBfaTJjX3NjbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjUwX2kyY19vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4NTApLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52NTBfaTJjX2N0b3IsCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnY1MF9pMmNfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9pMmNfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4NTApLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gX25vdXZlYXVfaTJjX2N0b3IsCiAJCS5kdG9yID0gX25vdXZlYXVfaTJjX2R0b3IsCiAJCS5pbml0ID0gX25vdXZlYXVfaTJjX2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfaTJjX2ZpbmksCiAJfSwKLX07CisJLnNjbGFzcyA9IG52NTBfaTJjX3NjbGFzcywKKwkucGFkX3ggPSAmbnYwNF9pMmNfcGFkX29jbGFzcywKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjUwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnY1MC5oCmluZGV4IDRlNWJhNDguLjVkMmE3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjUwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252NTAuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19OVjUwX0kyQ19IX18KICNkZWZpbmUgX19OVjUwX0kyQ19IX18KIAotI2luY2x1ZGUgPHN1YmRldi9pMmMuaD4KKyNpbmNsdWRlICJwcml2LmgiCiAKIHN0cnVjdCBudjUwX2kyY19wcml2IHsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmMgYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjk0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnY5NC5jCmluZGV4IGRmNmQzZTQuLmY1OWMzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udjk0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252OTQuYwpAQCAtMjQsNiArMjQsMzYgQEAKIAogI2luY2x1ZGUgIm52NTAuaCIKIAordm9pZAorbnY5NF9hdXhfc3RhdChzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYywgdTMyICpoaSwgdTMyICpsbywgdTMyICpycSwgdTMyICp0eCkKK3sKKwl1MzIgaW50ciA9IG52X3JkMzIoaTJjLCAweDAwZTA2Yyk7CisJdTMyIHN0YXQgPSBudl9yZDMyKGkyYywgMHgwMGUwNjgpICYgaW50ciwgaTsKKwlmb3IgKGkgPSAwLCAqaGkgPSAqbG8gPSAqcnEgPSAqdHggPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmICgoc3RhdCAmICgxIDw8IChpICogNCkpKSkgKmhpIHw9IDEgPDwgaTsKKwkJaWYgKChzdGF0ICYgKDIgPDwgKGkgKiA0KSkpKSAqbG8gfD0gMSA8PCBpOworCQlpZiAoKHN0YXQgJiAoNCA8PCAoaSAqIDQpKSkpICpycSB8PSAxIDw8IGk7CisJCWlmICgoc3RhdCAmICg4IDw8IChpICogNCkpKSkgKnR4IHw9IDEgPDwgaTsKKwl9CisJbnZfd3IzMihpMmMsIDB4MDBlMDZjLCBpbnRyKTsKK30KKwordm9pZAorbnY5NF9hdXhfbWFzayhzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYywgdTMyIHR5cGUsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwl1MzIgdGVtcCA9IG52X3JkMzIoaTJjLCAweDAwZTA2OCksIGk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CisJCQlpZiAoIShkYXRhICYgKDEgPDwgaSkpKSB7CisJCQkJdGVtcCAmPSB+KHR5cGUgPDwgKGkgKiA0KSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQl0ZW1wIHw9IHR5cGUgPDwgKGkgKiA0KTsKKwkJfQorCX0KKwludl93cjMyKGkyYywgMHgwMGUwNjgsIHRlbXApOworfQorCiAjZGVmaW5lIEFVWF9EQkcoZm10LCBhcmdzLi4uKSBudl9kZWJ1ZyhhdXgsICJBVVhDSCglZCk6ICIgZm10LCBjaCwgIyNhcmdzKQogI2RlZmluZSBBVVhfRVJSKGZtdCwgYXJncy4uLikgbnZfZXJyb3IoYXV4LCAiQVVYQ0goJWQpOiAiIGZtdCwgY2gsICMjYXJncykKIApAQCAtNjksNyArOTksOCBAQAogfQogCiBpbnQKLW52OTRfYXV4KHN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpiYXNlLCB1OCB0eXBlLCB1MzIgYWRkciwgdTggKmRhdGEsIHU4IHNpemUpCitudjk0X2F1eChzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqYmFzZSwgYm9vbCByZXRyeSwKKwkgdTggdHlwZSwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1OCBzaXplKQogewogCXN0cnVjdCBub3V2ZWF1X2kyYyAqYXV4ID0gbm91dmVhdV9pMmMoYmFzZSk7CiAJc3RydWN0IG52NTBfaTJjX3BvcnQgKnBvcnQgPSAodm9pZCAqKWJhc2U7CkBAIC0xMDUsOSArMTM2LDggQEAKIAljdHJsIHw9IHNpemUgLSAxOwogCW52X3dyMzIoYXV4LCAweDAwZTRlMCArIChjaCAqIDB4NTApLCBhZGRyKTsKIAotCS8qIHJldHJ5IHRyYW5zYWN0aW9uIGEgbnVtYmVyIG9mIHRpbWVzIG9uIGZhaWx1cmUuLi4gKi8KLQlyZXQgPSAtRVJFTU9URUlPOwotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAzMjsgcmV0cmllcysrKSB7CisJLyogKG1heWJlKSByZXRyeSB0cmFuc2FjdGlvbiBhIG51bWJlciBvZiB0aW1lcyBvbiBmYWlsdXJlLi4uICovCisJZm9yIChyZXRyaWVzID0gMDsgIXJldCAmJiByZXRyaWVzIDwgMzI7IHJldHJpZXMrKykgewogCQkvKiByZXNldCwgYW5kIGRlbGF5IGEgd2hpbGUgaWYgdGhpcyBpcyBhIHJldHJ5ICovCiAJCW52X3dyMzIoYXV4LCAweDAwZTRlNCArIChjaCAqIDB4NTApLCAweDgwMDAwMDAwIHwgY3RybCk7CiAJCW52X3dyMzIoYXV4LCAweDAwZTRlNCArIChjaCAqIDB4NTApLCAweDAwMDAwMDAwIHwgY3RybCk7CkBAIC0xMjMsMTYgKzE1MywyMSBAQAogCQkJdWRlbGF5KDEpOwogCQkJaWYgKCF0aW1lb3V0LS0pIHsKIAkJCQlBVVhfRVJSKCJ0eCByZXEgdGltZW91dCAweCUwOHhcbiIsIGN0cmwpOworCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0gd2hpbGUgKGN0cmwgJiAweDAwMDEwMDAwKTsKKwkJcmV0ID0gMTsKIAogCQkvKiByZWFkIHN0YXR1cywgYW5kIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGNvbXBsZXRlZCBvayAqLwogCQlzdGF0ID0gbnZfbWFzayhhdXgsIDB4MDBlNGU4ICsgKGNoICogMHg1MCksIDAsIDApOwotCQlpZiAoIShzdGF0ICYgMHgwMDBmMGYwMCkpIHsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAoKHN0YXQgJiAweDAwMGYwMDAwKSA9PSAweDAwMDgwMDAwIHx8CisJCSAgICAoc3RhdCAmIDB4MDAwZjAwMDApID09IDB4MDAwMjAwMDApCisJCQlyZXQgPSByZXRyeSA/IDAgOiAxOworCQlpZiAoKHN0YXQgJiAweDAwMDAwMTAwKSkKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCWlmICgoc3RhdCAmIDB4MDAwMDBlMDApKQorCQkJcmV0ID0gLUVJTzsKIAogCQlBVVhfREJHKCIlMDJkIDB4JTA4eCAweCUwOHhcbiIsIHJldHJpZXMsIGN0cmwsIHN0YXQpOwogCX0KQEAgLTE0NywyOSArMTgyLDExIEBACiAKIG91dDoKIAlhdXhjaF9maW5pKGF1eCwgY2gpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLW52OTRfaTJjX2FjcXVpcmUoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKmJhc2UpCi17Ci0Jc3RydWN0IG52NTBfaTJjX3ByaXYgKnByaXYgPSAodm9pZCAqKW52X29iamVjdChiYXNlKS0+ZW5naW5lOwotCXN0cnVjdCBudjUwX2kyY19wb3J0ICpwb3J0ID0gKHZvaWQgKiliYXNlOwotCWlmIChwb3J0LT5jdHJsKSB7Ci0JCW52X21hc2socHJpdiwgcG9ydC0+Y3RybCArIDB4MGMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCQludl9tYXNrKHByaXYsIHBvcnQtPmN0cmwgKyAweDAwLCAweDAwMDBmMDAzLCBwb3J0LT5kYXRhKTsKLQl9Ci19Ci0KLXZvaWQKLW52OTRfaTJjX3JlbGVhc2Uoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKmJhc2UpCi17CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAoc3RhdCAmIDB4MDAwZjAwMDApID4+IDE2OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfaTJjX2Z1bmMKIG52OTRfaTJjX2Z1bmMgPSB7Ci0JLmFjcXVpcmUgICA9IG52OTRfaTJjX2FjcXVpcmUsCi0JLnJlbGVhc2UgICA9IG52OTRfaTJjX3JlbGVhc2UsCiAJLmRyaXZlX3NjbCA9IG52NTBfaTJjX2RyaXZlX3NjbCwKIAkuZHJpdmVfc2RhID0gbnY1MF9pMmNfZHJpdmVfc2RhLAogCS5zZW5zZV9zY2wgPSBudjUwX2kyY19zZW5zZV9zY2wsCkBAIC0yMDYsOCArMjIzLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2kyY19mdW5jCiBudjk0X2F1eF9mdW5jID0gewotCS5hY3F1aXJlICAgPSBudjk0X2kyY19hY3F1aXJlLAotCS5yZWxlYXNlICAgPSBudjk0X2kyY19yZWxlYXNlLAogCS5hdXggICAgICAgPSBudjk0X2F1eCwKIH07CiAKQEAgLTIyNyw2ICsyNDIsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlwb3J0LT5iYXNlLmF1eCA9IGluZm8tPmRyaXZlOwogCXBvcnQtPmFkZHIgPSBpbmZvLT5kcml2ZTsKIAlpZiAoaW5mby0+c2hhcmUgIT0gRENCX0kyQ19VTlVTRUQpIHsKIAkJcG9ydC0+Y3RybCA9IDB4MDBlNTAwICsgKGluZm8tPmRyaXZlICogMHg1MCk7CkBAIC0yNTcsMjkgKzI3MywxOSBAQAogCXt9CiB9OwogCi1zdGF0aWMgaW50Ci1udjk0X2kyY19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKLQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKm9jbGFzcywgdm9pZCAqZGF0YSwgdTMyIHNpemUsCi0JICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iamVjdCkKLXsKLQlzdHJ1Y3QgbnY1MF9pMmNfcHJpdiAqcHJpdjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9pMmNfY3JlYXRlKHBhcmVudCwgZW5naW5lLCBvY2xhc3MsIG52OTRfaTJjX3NjbGFzcywgJnByaXYpOwotCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfb2NsYXNzCi1udjk0X2kyY19vY2xhc3MgPSB7Ci0JLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4OTQpLAotCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewotCQkuY3RvciA9IG52OTRfaTJjX2N0b3IsCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKgorbnY5NF9pMmNfb2NsYXNzID0gJihzdHJ1Y3Qgbm91dmVhdV9pMmNfaW1wbCkgeworCS5iYXNlLmhhbmRsZSA9IE5WX1NVQkRFVihJMkMsIDB4OTQpLAorCS5iYXNlLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7CisJCS5jdG9yID0gX25vdXZlYXVfaTJjX2N0b3IsCiAJCS5kdG9yID0gX25vdXZlYXVfaTJjX2R0b3IsCiAJCS5pbml0ID0gX25vdXZlYXVfaTJjX2luaXQsCiAJCS5maW5pID0gX25vdXZlYXVfaTJjX2ZpbmksCiAJfSwKLX07CisJLnNjbGFzcyA9IG52OTRfaTJjX3NjbGFzcywKKwkucGFkX3ggPSAmbnYwNF9pMmNfcGFkX29jbGFzcywKKwkucGFkX3MgPSAmbnY5NF9pMmNfcGFkX29jbGFzcywKKwkuYXV4ID0gNCwKKwkuYXV4X3N0YXQgPSBudjk0X2F1eF9zdGF0LAorCS5hdXhfbWFzayA9IG52OTRfYXV4X21hc2ssCit9LmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnZkMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL252ZDAuYwppbmRleCAyOTk2N2QzLi4zNjRkZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnZkMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udmQwLmMKQEAgLTQyLDggKzQyLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBub3V2ZWF1X2kyY19mdW5jCiBudmQwX2kyY19mdW5jID0gewotCS5hY3F1aXJlICAgPSBudjk0X2kyY19hY3F1aXJlLAotCS5yZWxlYXNlICAgPSBudjk0X2kyY19yZWxlYXNlLAogCS5kcml2ZV9zY2wgPSBudjUwX2kyY19kcml2ZV9zY2wsCiAJLmRyaXZlX3NkYSA9IG52NTBfaTJjX2RyaXZlX3NkYSwKIAkuc2Vuc2Vfc2NsID0gbnZkMF9pMmNfc2Vuc2Vfc2NsLApAQCAtNzUsNyArNzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfb2NsYXNzCitzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKIG52ZDBfaTJjX3NjbGFzc1tdID0gewogCXsgLmhhbmRsZSA9IE5WX0kyQ19UWVBFX0RDQkkyQyhEQ0JfSTJDX05WSU9fQklUKSwKIAkgIC5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgewpAQCAtOTYsMjkgKzk0LDE5IEBACiAJe30KIH07CiAKLXN0YXRpYyBpbnQKLW52ZDBfaTJjX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAotCSAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSwKLQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQotewotCXN0cnVjdCBudjUwX2kyY19wcml2ICpwcml2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2kyY19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgbnZkMF9pMmNfc2NsYXNzLCAmcHJpdik7Ci0JKnBvYmplY3QgPSBudl9vYmplY3QocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgbm91dmVhdV9vY2xhc3MKLW52ZDBfaTJjX29jbGFzcyA9IHsKLQkuaGFuZGxlID0gTlZfU1VCREVWKEkyQywgMHhkMCksCi0JLm9mdW5jcyA9ICYoc3RydWN0IG5vdXZlYXVfb2Z1bmNzKSB7Ci0JCS5jdG9yID0gbnZkMF9pMmNfY3RvciwKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmQwX2kyY19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2kyY19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKEkyQywgMHhkMCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbm91dmVhdV9pMmNfY3RvciwKIAkJLmR0b3IgPSBfbm91dmVhdV9pMmNfZHRvciwKIAkJLmluaXQgPSBfbm91dmVhdV9pMmNfaW5pdCwKIAkJLmZpbmkgPSBfbm91dmVhdV9pMmNfZmluaSwKIAl9LAotfTsKKwkuc2NsYXNzID0gbnZkMF9pMmNfc2NsYXNzLAorCS5wYWRfeCA9ICZudjA0X2kyY19wYWRfb2NsYXNzLAorCS5wYWRfcyA9ICZudjk0X2kyY19wYWRfb2NsYXNzLAorCS5hdXggPSA0LAorCS5hdXhfc3RhdCA9IG52OTRfYXV4X3N0YXQsCisJLmF1eF9tYXNrID0gbnY5NF9hdXhfbWFzaywKK30uYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9udmUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnZlMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTc3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvbnZlMC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgIm52NTAuaCIKKworc3RhdGljIHZvaWQKK252ZTBfYXV4X3N0YXQoc3RydWN0IG5vdXZlYXVfaTJjICppMmMsIHUzMiAqaGksIHUzMiAqbG8sIHUzMiAqcnEsIHUzMiAqdHgpCit7CisJdTMyIGludHIgPSBudl9yZDMyKGkyYywgMHgwMGRjNjApOworCXUzMiBzdGF0ID0gbnZfcmQzMihpMmMsIDB4MDBkYzY4KSAmIGludHIsIGk7CisJZm9yIChpID0gMCwgKmhpID0gKmxvID0gKnJxID0gKnR4ID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoKHN0YXQgJiAoMSA8PCAoaSAqIDQpKSkpICpoaSB8PSAxIDw8IGk7CisJCWlmICgoc3RhdCAmICgyIDw8IChpICogNCkpKSkgKmxvIHw9IDEgPDwgaTsKKwkJaWYgKChzdGF0ICYgKDQgPDwgKGkgKiA0KSkpKSAqcnEgfD0gMSA8PCBpOworCQlpZiAoKHN0YXQgJiAoOCA8PCAoaSAqIDQpKSkpICp0eCB8PSAxIDw8IGk7CisJfQorCW52X3dyMzIoaTJjLCAweDAwZGM2MCwgaW50cik7Cit9CisKK3N0YXRpYyB2b2lkCitudmUwX2F1eF9tYXNrKHN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjLCB1MzIgdHlwZSwgdTMyIG1hc2ssIHUzMiBkYXRhKQoreworCXUzMiB0ZW1wID0gbnZfcmQzMihpMmMsIDB4MDBkYzY4KSwgaTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChtYXNrICYgKDEgPDwgaSkpIHsKKwkJCWlmICghKGRhdGEgJiAoMSA8PCBpKSkpIHsKKwkJCQl0ZW1wICY9IH4odHlwZSA8PCAoaSAqIDQpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXRlbXAgfD0gdHlwZSA8PCAoaSAqIDQpOworCQl9CisJfQorCW52X3dyMzIoaTJjLCAweDAwZGM2OCwgdGVtcCk7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcyAqCitudmUwX2kyY19vY2xhc3MgPSAmKHN0cnVjdCBub3V2ZWF1X2kyY19pbXBsKSB7CisJLmJhc2UuaGFuZGxlID0gTlZfU1VCREVWKEkyQywgMHhlMCksCisJLmJhc2Uub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbm91dmVhdV9pMmNfY3RvciwKKwkJLmR0b3IgPSBfbm91dmVhdV9pMmNfZHRvciwKKwkJLmluaXQgPSBfbm91dmVhdV9pMmNfaW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9pMmNfZmluaSwKKwl9LAorCS5zY2xhc3MgPSBudmQwX2kyY19zY2xhc3MsCisJLnBhZF94ID0gJm52MDRfaTJjX3BhZF9vY2xhc3MsCisJLnBhZF9zID0gJm52OTRfaTJjX3BhZF9vY2xhc3MsCisJLmF1eCA9IDQsCisJLmF1eF9zdGF0ID0gbnZlMF9hdXhfc3RhdCwKKwkuYXV4X21hc2sgPSBudmUwX2F1eF9tYXNrLAorfS5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTQxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcGFkLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAicGFkLmgiCisKK2ludAorX252a21faTJjX3BhZF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0LCBib29sIHN1c3BlbmQpCit7CisJc3RydWN0IG52a21faTJjX3BhZCAqcGFkID0gKHZvaWQgKilvYmplY3Q7CisJREJHKCItPiBOVUxMXG4iKTsKKwlwYWQtPnBvcnQgPSBOVUxMOworCXJldHVybiBub3V2ZWF1X29iamVjdF9maW5pKCZwYWQtPmJhc2UsIHN1c3BlbmQpOworfQorCitpbnQKK19udmttX2kyY19wYWRfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3QgbnZrbV9pMmNfcGFkICpwYWQgPSAodm9pZCAqKW9iamVjdDsKKwlEQkcoIi0+IFBPUlQ6JTAyeFxuIiwgcGFkLT5uZXh0LT5pbmRleCk7CisJcGFkLT5wb3J0ID0gcGFkLT5uZXh0OworCXJldHVybiBub3V2ZWF1X29iamVjdF9pbml0KCZwYWQtPmJhc2UpOworfQorCitpbnQKK252a21faTJjX3BhZF9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqZW5naW5lLAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCBpbnQgaW5kZXgsCisJCSAgICAgaW50IHNpemUsIHZvaWQgKipwb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gKHZvaWQgKillbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQ7CisJc3RydWN0IG52a21faTJjX3BhZCAqcGFkOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZpMmMtPnBvcnRzLCBoZWFkKSB7CisJCXBhZCA9IG52a21faTJjX3BhZChwb3J0KTsKKwkJaWYgKHBhZC0+aW5kZXggPT0gaW5kZXgpIHsKKwkJCWF0b21pY19pbmMoJm52X29iamVjdChwYWQpLT5yZWZjb3VudCk7CisJCQkqcG9iamVjdCA9IHBhZDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0ID0gbm91dmVhdV9vYmplY3RfY3JlYXRlXyhwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCAwLCBzaXplLCBwb2JqZWN0KTsKKwlwYWQgPSAqcG9iamVjdDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGFkLT5pbmRleCA9IGluZGV4OworCXJldHVybiAwOworfQorCitpbnQKK19udmttX2kyY19wYWRfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJCSAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqb2NsYXNzLCB2b2lkICpkYXRhLCB1MzIgaW5kZXgsCisJCSAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKnBvYmplY3QpCit7CisJc3RydWN0IG52a21faTJjX3BhZCAqcGFkOworCWludCByZXQ7CisJcmV0ID0gbnZrbV9pMmNfcGFkX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBpbmRleCwgJnBhZCk7CisJKnBvYmplY3QgPSBudl9vYmplY3QocGFkKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmFjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcGFkLmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBfX05WS01fSTJDX1BBRF9IX18KKyNkZWZpbmUgX19OVktNX0kyQ19QQURfSF9fCisKKyNpbmNsdWRlICJwcml2LmgiCisKK3N0cnVjdCBudmttX2kyY19wYWQgeworCXN0cnVjdCBub3V2ZWF1X29iamVjdCBiYXNlOworCWludCBpbmRleDsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqbmV4dDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG52a21faTJjX3BhZCAqCitudmttX2kyY19wYWQoc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYWQgPSBudl9vYmplY3QocG9ydCk7CisJd2hpbGUgKHBhZC0+cGFyZW50KQorCQlwYWQgPSBwYWQtPnBhcmVudDsKKwlyZXR1cm4gKHZvaWQgKilwYWQ7Cit9CisKKyNkZWZpbmUgbnZrbV9pMmNfcGFkX2NyZWF0ZShwLGUsbyxpLGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbnZrbV9pMmNfcGFkX2NyZWF0ZV8oKHApLCAoZSksIChvKSwgKGkpLCBzaXplb2YoKipkKSwgKHZvaWQgKiopZCkKKyNkZWZpbmUgbnZrbV9pMmNfcGFkX2Rlc3Ryb3kocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG52a21faTJjX3BhZCAqX3AgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX252a21faTJjX3BhZF9kdG9yKG52X29iamVjdChfcCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBudmttX2kyY19wYWRfaW5pdChwKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9pMmNfcGFkICpfcCA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbnZrbV9pMmNfcGFkX2luaXQobnZfb2JqZWN0KF9wKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG52a21faTJjX3BhZF9maW5pKHAscykgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBudmttX2kyY19wYWQgKl9wID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9udmttX2kyY19wYWRfZmluaShudl9vYmplY3QoX3ApLCAocykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworaW50IG52a21faTJjX3BhZF9jcmVhdGVfKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJCSBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50IGluZGV4LCBpbnQsIHZvaWQgKiopOworCitpbnQgX252a21faTJjX3BhZF9jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB2b2lkICosIHUzMiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7CisjZGVmaW5lIF9udmttX2kyY19wYWRfZHRvciBub3V2ZWF1X29iamVjdF9kZXN0cm95CitpbnQgX252a21faTJjX3BhZF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2ludCBfbnZrbV9pMmNfcGFkX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIGJvb2wpOworCisjaWZuZGVmIE1TRworI2RlZmluZSBNU0cobCxmLGEuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbnZrbV9pMmNfcGFkICpfcGFkID0gKHZvaWQgKilwYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwludl8jI2wobnZfb2JqZWN0KF9wYWQpLT5lbmdpbmUsICJQQUQ6JWM6JTAyeDogImYsICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgX3BhZC0+aW5kZXggPj0gMHgxMDAgPyAnWCcgOiAnUycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgX3BhZC0+aW5kZXggPj0gMHgxMDAgPyBfcGFkLT5pbmRleCAtIDB4MTAwIDogX3BhZC0+aW5kZXgsICMjYSk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgREJHKGYsYS4uLikgTVNHKGRlYnVnLCBmLCAjI2EpCisjZGVmaW5lIEVSUihmLGEuLi4pIE1TRyhlcnJvciwgZiwgIyNhKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZG52MDQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9wYWRudjA0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0YjYxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9wYWRudjA0LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAicGFkLmgiCisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcworbnYwNF9pMmNfcGFkX29jbGFzcyA9IHsKKwkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBfbnZrbV9pMmNfcGFkX2N0b3IsCisJCS5kdG9yID0gX252a21faTJjX3BhZF9kdG9yLAorCQkuaW5pdCA9IF9udmttX2kyY19wYWRfaW5pdCwKKwkJLmZpbmkgPSBfbnZrbV9pMmNfcGFkX2ZpbmksCisJfSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcGFkbnY5NC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZG52OTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM2NzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3BhZG52OTQuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJwYWQuaCIKKworc3RydWN0IG52OTRfaTJjX3BhZCB7CisJc3RydWN0IG52a21faTJjX3BhZCBiYXNlOworCWludCBhZGRyOworfTsKKworc3RhdGljIGludAorbnY5NF9pMmNfcGFkX2Zpbmkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3QsIGJvb2wgc3VzcGVuZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9ICh2b2lkICopb2JqZWN0LT5lbmdpbmU7CisJc3RydWN0IG52OTRfaTJjX3BhZCAqcGFkID0gKHZvaWQgKilvYmplY3Q7CisJbnZfbWFzayhpMmMsIDB4MDBlNTBjICsgcGFkLT5hZGRyLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwlyZXR1cm4gbnZrbV9pMmNfcGFkX2ZpbmkoJnBhZC0+YmFzZSwgc3VzcGVuZCk7Cit9CisKK3N0YXRpYyBpbnQKK252OTRfaTJjX3BhZF9pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gKHZvaWQgKilvYmplY3QtPmVuZ2luZTsKKwlzdHJ1Y3QgbnY5NF9pMmNfcGFkICpwYWQgPSAodm9pZCAqKW9iamVjdDsKKworCXN3aXRjaCAobnZfb2NsYXNzKHBhZC0+YmFzZS5uZXh0KS0+aGFuZGxlKSB7CisJY2FzZSBOVl9JMkNfVFlQRV9EQ0JJMkMoRENCX0kyQ19OVklPX0FVWCk6CisJCW52X21hc2soaTJjLCAweDAwZTUwMCArIHBhZC0+YWRkciwgMHgwMDAwYzAwMywgMHgwMDAwMDAwMik7CisJCWJyZWFrOworCWNhc2UgTlZfSTJDX1RZUEVfRENCSTJDKERDQl9JMkNfTlZJT19CSVQpOgorCWRlZmF1bHQ6CisJCW52X21hc2soaTJjLCAweDAwZTUwMCArIHBhZC0+YWRkciwgMHgwMDAwYzAwMywgMHgwMDAwYzAwMSk7CisJCWJyZWFrOworCX0KKworCW52X21hc2soaTJjLCAweDAwZTUwYyArIHBhZC0+YWRkciwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJcmV0dXJuIG52a21faTJjX3BhZF9pbml0KCZwYWQtPmJhc2UpOworfQorCitzdGF0aWMgaW50Citudjk0X2kyY19wYWRfY3RvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICplbmdpbmUsCisJCSAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBpbmRleCwKKwkJICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBudjk0X2kyY19wYWQgKnBhZDsKKwlpbnQgcmV0OworCisJcmV0ID0gbnZrbV9pMmNfcGFkX2NyZWF0ZShwYXJlbnQsIGVuZ2luZSwgb2NsYXNzLCBpbmRleCwgJnBhZCk7CisJKnBvYmplY3QgPSBudl9vYmplY3QocGFkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGFkLT5hZGRyID0gaW5kZXggKiAweDUwOzsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5vdXZlYXVfb2NsYXNzCitudjk0X2kyY19wYWRfb2NsYXNzID0geworCS5vZnVuY3MgPSAmKHN0cnVjdCBub3V2ZWF1X29mdW5jcykgeworCQkuY3RvciA9IG52OTRfaTJjX3BhZF9jdG9yLAorCQkuZHRvciA9IF9udmttX2kyY19wYWRfZHRvciwKKwkJLmluaXQgPSBudjk0X2kyY19wYWRfaW5pdCwKKwkJLmZpbmkgPSBudjk0X2kyY19wYWRfZmluaSwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L2kyYy9wb3J0LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmY2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcG9ydC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19OVktNX0kyQ19QT1JUX0hfXworI2RlZmluZSBfX05WS01fSTJDX1BPUlRfSF9fCisKKyNpbmNsdWRlICJwcml2LmgiCisKKyNpZm5kZWYgTVNHCisjZGVmaW5lIE1TRyhsLGYsYS4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpfcG9ydCA9ICh2b2lkICopcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW52XyMjbChudl9vYmplY3QoX3BvcnQpLT5lbmdpbmUsICJQT1JUOiUwMng6ICJmLCBfcG9ydC0+aW5kZXgsICMjYSk7ICAgXAorfSB3aGlsZSgwKQorI2RlZmluZSBEQkcoZixhLi4uKSBNU0coZGVidWcsIGYsICMjYSkKKyNkZWZpbmUgRVJSKGYsYS4uLikgTVNHKGVycm9yLCBmLCAjI2EpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pMmMvcHJpdi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAwOTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaTJjL3ByaXYuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9fTlZLTV9JMkNfSF9fCisjZGVmaW5lIF9fTlZLTV9JMkNfSF9fCisKKyNpbmNsdWRlIDxzdWJkZXYvaTJjLmg+CisKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnYwNF9pMmNfcGFkX29jbGFzczsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgbnY5NF9pMmNfcGFkX29jbGFzczsKKworI2RlZmluZSBub3V2ZWF1X2kyY19wb3J0X2NyZWF0ZShwLGUsbyxpLGEsZixkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X2kyY19wb3J0X2NyZWF0ZV8oKHApLCAoZSksIChvKSwgKGkpLCAoYSksIChmKSwgICAgICAgICAgICAgICAgIFwKKwkJCQkgc2l6ZW9mKCoqZCksICh2b2lkICoqKWQpCisjZGVmaW5lIG5vdXZlYXVfaTJjX3BvcnRfZGVzdHJveShwKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0ID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2kyY19wb3J0X2R0b3IobnZfb2JqZWN0KGkyYykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9pMmNfcG9ydF9pbml0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbm91dmVhdV9vYmplY3RfaW5pdCgmKHApLT5iYXNlKQorI2RlZmluZSBub3V2ZWF1X2kyY19wb3J0X2ZpbmkocCxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X29iamVjdF9maW5pKCYocCktPmJhc2UsIChzKSkKKworaW50IG5vdXZlYXVfaTJjX3BvcnRfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCisJCQkgICAgIHN0cnVjdCBub3V2ZWF1X29jbGFzcyAqLCB1OCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gKiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5vdXZlYXVfaTJjX2Z1bmMgKiwKKwkJCSAgICAgaW50LCB2b2lkICoqKTsKK3ZvaWQgX25vdXZlYXVfaTJjX3BvcnRfZHRvcihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CisjZGVmaW5lIF9ub3V2ZWF1X2kyY19wb3J0X2luaXQgbm91dmVhdV9vYmplY3RfaW5pdAoraW50ICBfbm91dmVhdV9pMmNfcG9ydF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKKworI2RlZmluZSBub3V2ZWF1X2kyY19jcmVhdGUocCxlLG8sZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X2kyY19jcmVhdGVfKChwKSwgKGUpLCAobyksIHNpemVvZigqKmQpLCAodm9pZCAqKilkKQorI2RlZmluZSBub3V2ZWF1X2kyY19kZXN0cm95KHApICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgbm91dmVhdV9pMmMgKmkyYyA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfbm91dmVhdV9pMmNfZHRvcihudl9vYmplY3QoaTJjKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIG5vdXZlYXVfaTJjX2luaXQocCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBub3V2ZWF1X2kyYyAqaTJjID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9ub3V2ZWF1X2kyY19pbml0KG52X29iamVjdChpMmMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgbm91dmVhdV9pMmNfZmluaShwLHMpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IG5vdXZlYXVfaTJjICppMmMgPSAocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX25vdXZlYXVfaTJjX2ZpbmkobnZfb2JqZWN0KGkyYyksIChzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCitpbnQgbm91dmVhdV9pMmNfY3JlYXRlXyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosCisJCQlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKiwgaW50LCB2b2lkICoqKTsKK2ludCAgX25vdXZlYXVfaTJjX2N0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICosIHZvaWQgKiwgdTMyLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqKTsKK3ZvaWQgX25vdXZlYXVfaTJjX2R0b3Ioc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworaW50ICBfbm91dmVhdV9pMmNfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgIF9ub3V2ZWF1X2kyY19maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBib29sKTsKKworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X29jbGFzcyBub3V2ZWF1X2FueDk4MDVfc2NsYXNzW107CitleHRlcm4gc3RydWN0IG5vdXZlYXVfb2NsYXNzIG52ZDBfaTJjX3NjbGFzc1tdOworCitleHRlcm4gY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gbm91dmVhdV9pMmNfYml0X2FsZ287CitleHRlcm4gY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gbm91dmVhdV9pMmNfYXV4X2FsZ287CisKK3N0cnVjdCBub3V2ZWF1X2kyY19pbXBsIHsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgYmFzZTsKKworCS8qIHN1cHBvcnRlZCBpMmMgcG9ydCBjbGFzc2VzICovCisJc3RydWN0IG5vdXZlYXVfb2NsYXNzICpzY2xhc3M7CisJc3RydWN0IG5vdXZlYXVfb2NsYXNzICpwYWRfeDsKKwlzdHJ1Y3Qgbm91dmVhdV9vY2xhc3MgKnBhZF9zOworCisJLyogbnVtYmVyIG9mIG5hdGl2ZSBkcCBhdXggY2hhbm5lbHMgcHJlc2VudCAqLworCWludCBhdXg7CisKKwkvKiByZWFkIGFuZCBhY2sgcGVuZGluZyBpbnRlcnJ1cHRzLCByZXR1cm5pbmcgb25seSBkYXRhCisJICogZm9yIHBvcnRzIHRoYXQgaGF2ZSBub3QgYmVlbiBtYXNrZWQgb2ZmLCB3aGlsZSBzdGlsbAorCSAqIHBlcmZvcm1pbmcgdGhlIGFjayBmb3IgYW55dGhpbmcgdGhhdCB3YXMgcGVuZGluZy4KKwkgKi8KKwl2b2lkICgqYXV4X3N0YXQpKHN0cnVjdCBub3V2ZWF1X2kyYyAqLCB1MzIgKiwgdTMyICosIHUzMiAqLCB1MzIgKik7CisKKwkvKiBtYXNrIG9uL29mZiBpbnRlcnJ1cHQgdHlwZXMgZm9yIGEgZ2l2ZW4gc2V0IG9mIGF1eGNoCisJICovCisJdm9pZCAoKmF1eF9tYXNrKShzdHJ1Y3Qgbm91dmVhdV9pMmMgKiwgdTMyLCB1MzIsIHUzMik7Cit9OworCit2b2lkIG52OTRfYXV4X3N0YXQoc3RydWN0IG5vdXZlYXVfaTJjICosIHUzMiAqLCB1MzIgKiwgdTMyICosIHUzMiAqKTsKK3ZvaWQgbnY5NF9hdXhfbWFzayhzdHJ1Y3Qgbm91dmVhdV9pMmMgKiwgdTMyLCB1MzIsIHUzMik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaWJ1cy9nazIwYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvaWJ1cy9nazIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NWYwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9pYnVzL2drMjBhLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdWJkZXYvaWJ1cy5oPgorI2luY2x1ZGUgPHN1YmRldi90aW1lci5oPgorCitzdHJ1Y3QgZ2syMGFfaWJ1c19wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9pYnVzIGJhc2U7Cit9OworCitzdGF0aWMgdm9pZAorZ2syMGFfaWJ1c19pbml0X3ByaXZfcmluZyhzdHJ1Y3QgZ2syMGFfaWJ1c19wcml2ICpwcml2KQoreworCW52X21hc2socHJpdiwgMHgxMzcyNTAsIDB4M2YsIDApOworCisJbnZfbWFzayhwcml2LCAweDAwMDIwMCwgMHgyMCwgMCk7CisJdXNsZWVwX3JhbmdlKDIwLCAzMCk7CisJbnZfbWFzayhwcml2LCAweDAwMDIwMCwgMHgyMCwgMHgyMCk7CisKKwludl93cjMyKHByaXYsIDB4MTIwMDRjLCAweDQpOworCW52X3dyMzIocHJpdiwgMHgxMjIyMDQsIDB4Mik7CisJbnZfcmQzMihwcml2LCAweDEyMjIwNCk7Cit9CisKK3N0YXRpYyB2b2lkCitnazIwYV9pYnVzX2ludHIoc3RydWN0IG5vdXZlYXVfc3ViZGV2ICpzdWJkZXYpCit7CisJc3RydWN0IGdrMjBhX2lidXNfcHJpdiAqcHJpdiA9ICh2b2lkICopc3ViZGV2OworCXUzMiBzdGF0dXMwID0gbnZfcmQzMihwcml2LCAweDEyMDA1OCk7CisKKwlpZiAoc3RhdHVzMCAmIDB4NykgeworCQludl9kZWJ1Zyhwcml2LCAicmVzZXR0aW5nIHByaXYgcmluZ1xuIik7CisJCWdrMjBhX2lidXNfaW5pdF9wcml2X3JpbmcocHJpdik7CisJfQorCisJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJbnZfbWFzayhwcml2LCAweDEyMDA0YywgMHgyLCAweDIpOworCisJaWYgKCFudl93YWl0KHN1YmRldiwgMHgxMjAwNGMsIDB4M2YsIDB4MDApKQorCQludl93YXJuKHByaXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJpbmdtYXN0ZXIgYWNrXG4iKTsKK30KKworc3RhdGljIGludAorZ2syMGFfaWJ1c19pbml0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0KQoreworCXN0cnVjdCBnazIwYV9pYnVzX3ByaXYgKnByaXYgPSAodm9pZCAqKW9iamVjdDsKKwlpbnQgcmV0OworCisJcmV0ID0gX25vdXZlYXVfaWJ1c19pbml0KG9iamVjdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWdrMjBhX2lidXNfaW5pdF9wcml2X3JpbmcocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ2syMGFfaWJ1c19jdG9yKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmVuZ2luZSwKKwkgICAgICAgc3RydWN0IG5vdXZlYXVfb2NsYXNzICpvY2xhc3MsIHZvaWQgKmRhdGEsIHUzMiBzaXplLAorCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKipwb2JqZWN0KQoreworCXN0cnVjdCBnazIwYV9pYnVzX3ByaXYgKnByaXY7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfaWJ1c19jcmVhdGUocGFyZW50LCBlbmdpbmUsIG9jbGFzcywgJnByaXYpOworCSpwb2JqZWN0ID0gbnZfb2JqZWN0KHByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludl9zdWJkZXYocHJpdiktPmludHIgPSBnazIwYV9pYnVzX2ludHI7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X29jbGFzcworZ2syMGFfaWJ1c19vY2xhc3MgPSB7CisJLmhhbmRsZSA9IE5WX1NVQkRFVihJQlVTLCAweGVhKSwKKwkub2Z1bmNzID0gJihzdHJ1Y3Qgbm91dmVhdV9vZnVuY3MpIHsKKwkJLmN0b3IgPSBnazIwYV9pYnVzX2N0b3IsCisJCS5kdG9yID0gX25vdXZlYXVfaWJ1c19kdG9yLAorCQkuaW5pdCA9IGdrMjBhX2lidXNfaW5pdCwKKwkJLmZpbmkgPSBfbm91dmVhdV9pYnVzX2ZpbmksCisJfSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udjUwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udjUwLmMKaW5kZXggZTg4MjJhOTMuLjljYTkzZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L21jL252NTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udjUwLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogY29uc3Qgc3RydWN0IG5vdXZlYXVfbWNfaW50cgogbnY1MF9tY19pbnRyW10gPSB7CisJeyAweDA0MDAwMDAwLCBOVkRFVl9FTkdJTkVfRElTUCB9LCAgLyogRElTUCBiZWZvcmUgRklGTywgc28gcGFnZWZsaXAtdGltZXN0YW1waW5nIHdvcmtzISAqLwogCXsgMHgwMDAwMDAwMSwgTlZERVZfRU5HSU5FX01QRUcgfSwKIAl7IDB4MDAwMDAxMDAsIE5WREVWX0VOR0lORV9GSUZPIH0sCiAJeyAweDAwMDAxMDAwLCBOVkRFVl9FTkdJTkVfR1IgfSwKQEAgLTMzLDggKzM0LDggQEAKIAl7IDB4MDAwMDgwMDAsIE5WREVWX0VOR0lORV9CU1AgfSwJLyogTlY4NC0gKi8KIAl7IDB4MDAwMjAwMDAsIE5WREVWX0VOR0lORV9WUCB9LAkvKiBOVjg0LSAqLwogCXsgMHgwMDEwMDAwMCwgTlZERVZfU1VCREVWX1RJTUVSIH0sCi0JeyAweDAwMjAwMDAwLCBOVkRFVl9TVUJERVZfR1BJTyB9LAotCXsgMHgwNDAwMDAwMCwgTlZERVZfRU5HSU5FX0RJU1AgfSwKKwl7IDB4MDAyMDAwMDAsIE5WREVWX1NVQkRFVl9HUElPIH0sCS8qIFBNR1ItPkdQSU8gKi8KKwl7IDB4MDAyMDAwMDAsIE5WREVWX1NVQkRFVl9JMkMgfSwgCS8qIFBNR1ItPkkyQy9BVVggKi8KIAl7IDB4MTAwMDAwMDAsIE5WREVWX1NVQkRFVl9CVVMgfSwKIAl7IDB4ODAwMDAwMDAsIE5WREVWX0VOR0lORV9TVyB9LAogCXsgMHgwMDAyZDEwMSwgTlZERVZfU1VCREVWX0ZCIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udjk4LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udjk4LmMKaW5kZXggZjhhNmYxOC4uM2M3NmQ5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvbWMvbnY5OC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L21jL252OTguYwpAQCAtMjYsNiArMjYsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5vdXZlYXVfbWNfaW50cgogbnY5OF9tY19pbnRyW10gPSB7CisJeyAweDA0MDAwMDAwLCBOVkRFVl9FTkdJTkVfRElTUCB9LCAgLyogRElTUCBmaXJzdCwgc28gcGFnZWZsaXAgdGltZXN0YW1wcyB3b3JrICovCiAJeyAweDAwMDAwMDAxLCBOVkRFVl9FTkdJTkVfUFBQIH0sCiAJeyAweDAwMDAwMTAwLCBOVkRFVl9FTkdJTkVfRklGTyB9LAogCXsgMHgwMDAwMTAwMCwgTlZERVZfRU5HSU5FX0dSIH0sCkBAIC0zNSw5ICszNiw5IEBACiAJeyAweDAwMDQwMDAwLCBOVkRFVl9TVUJERVZfUFdSIH0sCS8qIE5WQTM6TlZDMCAqLwogCXsgMHgwMDA4MDAwMCwgTlZERVZfU1VCREVWX1RIRVJNIH0sCS8qIE5WQTM6TlZDMCAqLwogCXsgMHgwMDEwMDAwMCwgTlZERVZfU1VCREVWX1RJTUVSIH0sCi0JeyAweDAwMjAwMDAwLCBOVkRFVl9TVUJERVZfR1BJTyB9LAorCXsgMHgwMDIwMDAwMCwgTlZERVZfU1VCREVWX0dQSU8gfSwJLyogUE1HUi0+R1BJTyAqLworCXsgMHgwMDIwMDAwMCwgTlZERVZfU1VCREVWX0kyQyB9LCAJLyogUE1HUi0+STJDL0FVWCAqLwogCXsgMHgwMDQwMDAwMCwgTlZERVZfRU5HSU5FX0NPUFkwIH0sCS8qIE5WQTMtICAgICAqLwotCXsgMHgwNDAwMDAwMCwgTlZERVZfRU5HSU5FX0RJU1AgfSwKIAl7IDB4MTAwMDAwMDAsIE5WREVWX1NVQkRFVl9CVVMgfSwKIAl7IDB4ODAwMDAwMDAsIE5WREVWX0VOR0lORV9TVyB9LAogCXsgMHgwMDQyZDEwMSwgTlZERVZfU1VCREVWX0ZCIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udmMwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udmMwLmMKaW5kZXggMzQ0NzJkMzEuLmY5YzZhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L21jL252YzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9tYy9udmMwLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogY29uc3Qgc3RydWN0IG5vdXZlYXVfbWNfaW50cgogbnZjMF9tY19pbnRyW10gPSB7CisJeyAweDA0MDAwMDAwLCBOVkRFVl9FTkdJTkVfRElTUCB9LCAgLyogRElTUCBmaXJzdCwgc28gcGFnZWZsaXAgdGltZXN0YW1wcyB3b3JrLiAqLwogCXsgMHgwMDAwMDAwMSwgTlZERVZfRU5HSU5FX1BQUCB9LAogCXsgMHgwMDAwMDAyMCwgTlZERVZfRU5HSU5FX0NPUFkwIH0sCiAJeyAweDAwMDAwMDQwLCBOVkRFVl9FTkdJTkVfQ09QWTEgfSwKQEAgLTM3LDEwICszOCwxMCBAQAogCXsgMHgwMDA0MDAwMCwgTlZERVZfU1VCREVWX1RIRVJNIH0sCiAJeyAweDAwMDIwMDAwLCBOVkRFVl9FTkdJTkVfVlAgfSwKIAl7IDB4MDAxMDAwMDAsIE5WREVWX1NVQkRFVl9USU1FUiB9LAotCXsgMHgwMDIwMDAwMCwgTlZERVZfU1VCREVWX0dQSU8gfSwKKwl7IDB4MDAyMDAwMDAsIE5WREVWX1NVQkRFVl9HUElPIH0sCS8qIFBNR1ItPkdQSU8gKi8KKwl7IDB4MDAyMDAwMDAsIE5WREVWX1NVQkRFVl9JMkMgfSwJLyogUE1HUi0+STJDL0FVWCAqLwogCXsgMHgwMTAwMDAwMCwgTlZERVZfU1VCREVWX1BXUiB9LAogCXsgMHgwMjAwMDAwMCwgTlZERVZfU1VCREVWX0xUQ0cgfSwKLQl7IDB4MDQwMDAwMDAsIE5WREVWX0VOR0lORV9ESVNQIH0sCiAJeyAweDA4MDAwMDAwLCBOVkRFVl9TVUJERVZfRkIgfSwKIAl7IDB4MTAwMDAwMDAsIE5WREVWX1NVQkRFVl9CVVMgfSwKIAl7IDB4NDAwMDAwMDAsIE5WREVWX1NVQkRFVl9JQlVTIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9teG0vbnY1MC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvbXhtL252NTAuYwppbmRleCA2NGY4YjQ3Li5mY2FhYmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi9teG0vbnY1MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L214bS9udjUwLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCSAqIGNvbW1vbiBleGFtcGxlIGlzIERQLT5lRFAuCiAJICovCiAJY29ubiAgPSBiaW9zLT5kYXRhOwotCWNvbm4gKz0gZGNiX2Nvbm4oYmlvcywgKGN0eC5vdXRwWzBdICYgMHgwMDAwZjAwMCkgPj4gMTIsICZ2ZXIsICZsZW4pOworCWNvbm4gKz0gbnZiaW9zX2Nvbm5FZShiaW9zLCAoY3R4Lm91dHBbMF0gJiAweDAwMDBmMDAwKSA+PiAxMiwgJnZlciwgJmxlbik7CiAJdHlwZSAgPSBjb25uWzBdOwogCXN3aXRjaCAoY3R4LmRlc2MuY29ubl90eXBlKSB7CiAJY2FzZSAweDAxOiAvKiBMVkRTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi90aGVybS9pYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvdGhlcm0vaWMuYwppbmRleCA3NjEwZmM1Li5jYTlhZDlmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3RoZXJtL2ljLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvY29yZS9zdWJkZXYvdGhlcm0vaWMuYwpAQCAtNjAsOSArNjAsOSBAQAogbnZfYm9hcmRfaW5mb3NbXSA9IHsKIAl7IHsgSTJDX0JPQVJEX0lORk8oInc4M2w3ODV0cyIsIDB4MmQpIH0sIDAgfSwKIAl7IHsgSTJDX0JPQVJEX0lORk8oInc4Mzc4MWQiLCAweDJkKSB9LCAwICB9LAotCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmUpIH0sIDIwICB9LAotCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmQpIH0sIDIwICB9LAotCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmMpIH0sIDIwICB9LAorCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmUpIH0sIDQwICB9LAorCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmQpIH0sIDQwICB9LAorCXsgeyBJMkNfQk9BUkRfSU5GTygiYWR0NzQ3MyIsIDB4MmMpIH0sIDQwICB9LAogCXsgeyBJMkNfQk9BUkRfSU5GTygiZjc1Mzc1IiwgMHgyZSkgfSwgMCAgfSwKIAl7IHsgSTJDX0JPQVJEX0lORk8oImxtOTkiLCAweDRjKSB9LCAwICB9LAogCXsgeyBJMkNfQk9BUkRfSU5GTygibG05MCIsIDB4NGMpIH0sIDAgIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi90aGVybS9udmEzLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi90aGVybS9udmEzLmMKaW5kZXggM2IyYzQ1ODAuLjA0NzhiMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2NvcmUvc3ViZGV2L3RoZXJtL252YTMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9jb3JlL3N1YmRldi90aGVybS9udmEzLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAl1MzIgdGFjaCA9IG52X3JkMzIodGhlcm0sIDB4MDBlNzI4KSAmIDB4MDAwMGZmZmY7CiAJdTMyIGN0cmwgPSBudl9yZDMyKHRoZXJtLCAweDAwZTcyMCk7CiAJaWYgKGN0cmwgJiAweDAwMDAwMDAxKQotCQlyZXR1cm4gdGFjaCAqIDYwOworCQlyZXR1cm4gdGFjaCAqIDYwIC8gMjsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGFjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kYWMuYwppbmRleCA0MzRiOTIwLi5hOTZkZGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kYWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kYWMuYwpAQCAtNDE0LDcgKzQxNCw3IEBACiAJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwogCiAJTlZfREVCVUcoZHJtLCAiT3V0cHV0ICVzIGlzIHJ1bm5pbmcgb24gQ1JUQyAlZCB1c2luZyBvdXRwdXQgJWNcbiIsCi0JCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZSksCisJCSBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZS5uYW1lLAogCQkgbnZfY3J0Yy0+aW5kZXgsICdAJyArIGZmcyhudl9lbmNvZGVyLT5kY2ItPm9yKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L2RmcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGZwLmMKaW5kZXggYTJkNjY5Yi4uZTU3YmFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGZwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGZwLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKIAogCU5WX0RFQlVHKGRybSwgIk91dHB1dCAlcyBpcyBydW5uaW5nIG9uIENSVEMgJWQgdXNpbmcgb3V0cHV0ICVjXG4iLAotCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLAorCQkgbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UubmFtZSwKIAkJIG52X2NydGMtPmluZGV4LCAnQCcgKyBmZnMobnZfZW5jb2Rlci0+ZGNiLT5vcikpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kaXNwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnYwNC9kaXNwLmMKaW5kZXggMmYxZWQ2MS4uNDM0MmZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvZGlzcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L2Rpc3AuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAJCQkJICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CiAJCWlmICghY29ubmVjdG9yLT5lbmNvZGVyX2lkc1swXSkgewogCQkJTlZfV0FSTihkcm0sICIlcyBoYXMgbm8gZW5jb2RlcnMsIHJlbW92aW5nXG4iLAotCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJY29ubmVjdG9yLT5uYW1lKTsKIAkJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L3R2bnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjA0LmMKaW5kZXggMjQ0ODIyZC4uODY2NzYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjA0LmMKQEAgLTE3MSw3ICsxNzEsOCBAQAogCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKIAogCU5WX0RFQlVHKGRybSwgIk91dHB1dCAlcyBpcyBydW5uaW5nIG9uIENSVEMgJWQgdXNpbmcgb3V0cHV0ICVjXG4iLAotCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLCBudl9jcnRjLT5pbmRleCwgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKKwkJIG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpLT5iYXNlLm5hbWUsCisJCSBudl9jcnRjLT5pbmRleCwgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKIH0KIAogc3RhdGljIHZvaWQgbnYwNF90dl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjA0L3R2bnYxNy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjE3LmMKaW5kZXggYWNlZjQ4Zi4uMTk1YmQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjE3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52MDQvdHZudjE3LmMKQEAgLTYxMiw4ICs2MTIsNyBAQAogCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKIAogCU5WX0lORk8oZHJtLCAiT3V0cHV0ICVzIGlzIHJ1bm5pbmcgb24gQ1JUQyAlZCB1c2luZyBvdXRwdXQgJWNcbiIsCi0JCWRybV9nZXRfY29ubmVjdG9yX25hbWUoCi0JCQkmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLAorCQlub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZS5uYW1lLAogCQludl9jcnRjLT5pbmRleCwgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKaW5kZXggZDA3Y2UwMi4uMWZhMjIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCkBAIC00NCw2ICs0NCw3IEBACiAKICNpbmNsdWRlIDxzdWJkZXYvaTJjLmg+CiAjaW5jbHVkZSA8c3ViZGV2L2dwaW8uaD4KKyNpbmNsdWRlIDxlbmdpbmUvZGlzcC5oPgogCiBNT0RVTEVfUEFSTV9ERVNDKHR2X2Rpc2FibGUsICJEaXNhYmxlIFRWLW91dCBkZXRlY3Rpb24iKTsKIHN0YXRpYyBpbnQgbm91dmVhdV90dl9kaXNhYmxlID0gMDsKQEAgLTc1LDcgKzc2LDggQEAKIAkJCWNvbnRpbnVlOwogCQludl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKG9ial90b19lbmNvZGVyKG9iaikpOwogCi0JCWlmICh0eXBlID09IERDQl9PVVRQVVRfQU5ZIHx8IG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSB0eXBlKQorCQlpZiAodHlwZSA9PSBEQ0JfT1VUUFVUX0FOWSB8fAorCQkgICAgKG52X2VuY29kZXItPmRjYiAmJiBudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gdHlwZSkpCiAJCQlyZXR1cm4gbnZfZW5jb2RlcjsKIAl9CiAKQEAgLTEwMCwyMiArMTAyLDI0IEBACiBub3V2ZWF1X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCW5vdXZlYXVfZXZlbnRfcmVmKE5VTEwsICZudl9jb25uZWN0b3ItPmhwZF9mdW5jKTsKKwlub3V2ZWF1X2V2ZW50X3JlZihOVUxMLCAmbnZfY29ubmVjdG9yLT5ocGQpOwogCWtmcmVlKG52X2Nvbm5lY3Rvci0+ZWRpZCk7CiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKIAlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlpZiAobnZfY29ubmVjdG9yLT5hdXgudHJhbnNmZXIpCisJCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmbnZfY29ubmVjdG9yLT5hdXgpOwogCWtmcmVlKGNvbm5lY3Rvcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqCi1ub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkgICAgIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKipwbnZfZW5jb2RlcikKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoKK25vdXZlYXVfY29ubmVjdG9yX2RkY19kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0oZGV2KTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKGRybS0+ZGV2aWNlKTsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfcG9ydCAqcG9ydCA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJaW50IGksIHBhbmVsID0gLUVOT0RFVjsKIAogCS8qIGVEUCBwYW5lbHMgbmVlZCBwb3dlcmluZyBvbiBieSB1cyAoaWYgdGhlIFZCSU9TIGRvZXNuJ3QgZGVmYXVsdCBpdApAQCAtMTMwLDEzICsxMzQsOSBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVI7IGkrKykgewotCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOwotCQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7Ci0JCWludCBpZDsKLQotCQlpZCA9IGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV07Ci0JCWlmICghaWQpCisJZm9yIChpID0gMDsgbnZfZW5jb2RlciA9IE5VTEwsIGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKKwkJaW50IGlkID0gY29ubmVjdG9yLT5lbmNvZGVyX2lkc1tpXTsKKwkJaWYgKGlkID09IDApCiAJCQlicmVhazsKIAogCQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGlkLCBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUik7CkBAIC0xNDQsMjIgKzE0NCwyNCBAQAogCQkJY29udGludWU7CiAJCW52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIob2JqX3RvX2VuY29kZXIob2JqKSk7CiAKLQkJcG9ydCA9IG52X2VuY29kZXItPmkyYzsKLQkJaWYgKHBvcnQgJiYgbnZfcHJvYmVfaTJjKHBvcnQsIDB4NTApKSB7Ci0JCQkqcG52X2VuY29kZXIgPSBudl9lbmNvZGVyOwotCQkJYnJlYWs7CisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gRENCX09VVFBVVF9EUCkgeworCQkJaW50IHJldCA9IG5vdXZlYXVfZHBfZGV0ZWN0KG52X2VuY29kZXIpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UKKwkJaWYgKG52X2VuY29kZXItPmkyYykgeworCQkJaWYgKG52X3Byb2JlX2kyYyhudl9lbmNvZGVyLT5pMmMsIDB4NTApKQorCQkJCWJyZWFrOwogCQl9Ci0KLQkJcG9ydCA9IE5VTEw7CiAJfQogCiAJLyogZURQIHBhbmVsIG5vdCBkZXRlY3RlZCwgcmVzdG9yZSBwYW5lbCBwb3dlciBHUElPIHRvIHByZXZpb3VzCiAJICogc3RhdGUgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBTT1IgZm9yIG90aGVyIG91dHB1dCB0eXBlcy4KIAkgKi8KLQlpZiAoIXBvcnQgJiYgcGFuZWwgPT0gMCkKKwlpZiAoIW52X2VuY29kZXIgJiYgcGFuZWwgPT0gMCkKIAkJZ3Bpby0+c2V0KGdwaW8sIDAsIERDQl9HUElPX1BBTkVMX1BPV0VSLCAweGZmLCBwYW5lbCk7CiAKLQlyZXR1cm4gcG9ydDsKKwlyZXR1cm4gbnZfZW5jb2RlcjsKIH0KIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKgpAQCAtMjU4LDI1ICsyNjAsMTcgQEAKIAlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVBQ0NFUykKIAkJcmV0dXJuIGNvbm5fc3RhdHVzOwogCi0JaTJjID0gbm91dmVhdV9jb25uZWN0b3JfZGRjX2RldGVjdChjb25uZWN0b3IsICZudl9lbmNvZGVyKTsKLQlpZiAoaTJjKSB7CisJbnZfZW5jb2RlciA9IG5vdXZlYXVfY29ubmVjdG9yX2RkY19kZXRlY3QoY29ubmVjdG9yKTsKKwlpZiAobnZfZW5jb2RlciAmJiAoaTJjID0gbnZfZW5jb2Rlci0+aTJjKSAhPSBOVUxMKSB7CiAJCW52X2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZpMmMtPmFkYXB0ZXIpOwogCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLAogCQkJCQkJCW52X2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCWlmICghbnZfY29ubmVjdG9yLT5lZGlkKSB7CiAJCQlOVl9FUlJPUihkcm0sICJEREMgcmVzcG9uZGVkLCBidXQgbm8gRURJRCBmb3IgJXNcbiIsCi0JCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQkJIGNvbm5lY3Rvci0+bmFtZSk7CiAJCQlnb3RvIGRldGVjdF9hbmFsb2c7CiAJCX0KIAotCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IERDQl9PVVRQVVRfRFAgJiYKLQkJICAgICFub3V2ZWF1X2RwX2RldGVjdCh0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKSkpIHsKLQkJCU5WX0VSUk9SKGRybSwgIkRldGVjdGVkICVzLCBidXQgZmFpbGVkIGluaXRcbiIsCi0JCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7Ci0JCQljb25uX3N0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotCQkJZ290byBvdXQ7Ci0JCX0KLQogCQkvKiBPdmVycmlkZSBlbmNvZGVyIHR5cGUgZm9yIERWSS1JIGJhc2VkIG9uIHdoZXRoZXIgRURJRAogCQkgKiBzYXlzIHRoZSBkaXNwbGF5IGlzIGRpZ2l0YWwgb3IgYW5hbG9nLCBib3RoIHVzZSB0aGUKIAkJICogc2FtZSBpMmMgY2hhbm5lbCBzbyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBkZGNfZGV0ZWN0CkBAIC00MzcsNyArNDMxLDcgQEAKIAludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyKGNvbm5lY3RvciwgdHlwZSk7CiAJaWYgKCFudl9lbmNvZGVyKSB7CiAJCU5WX0VSUk9SKGRybSwgImNhbid0IGZpbmQgZW5jb2RlciB0byBmb3JjZSAlcyBvbiFcbiIsCi0JCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCSBjb25uZWN0b3ItPm5hbWUpOwogCQljb25uZWN0b3ItPnN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogCQlyZXR1cm47CiAJfQpAQCAtOTEyLDMzICs5MDYsMTAzIEBACiB9OwogCiBzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3JfZHBfZHBtcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKKworCWlmIChjb25uZWN0b3ItPmVuY29kZXIpCisJCW52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoY29ubmVjdG9yLT5lbmNvZGVyKTsKKwlpZiAobnZfZW5jb2RlciAmJiBudl9lbmNvZGVyLT5kY2IgJiYKKwkgICAgbnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IERDQl9PVVRQVVRfRFApIHsKKwkJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgeworCQkJdTggZGF0YSA9IERQX1NFVF9QT1dFUl9EMDsKKwkJCW52X3dyYXV4KG52X2VuY29kZXItPmkyYywgRFBfU0VUX1BPV0VSLCAmZGF0YSwgMSk7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJCX0gZWxzZSB7CisJCQl1OCBkYXRhID0gRFBfU0VUX1BPV0VSX0QzOworCQkJbnZfd3JhdXgobnZfZW5jb2Rlci0+aTJjLCBEUF9TRVRfUE9XRVIsICZkYXRhLCAxKTsKKwkJfQorCX0KKworCWRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMoY29ubmVjdG9yLCBtb2RlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzCitub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jc19kcCA9IHsKKwkuZHBtcyA9IG5vdXZlYXVfY29ubmVjdG9yX2RwX2RwbXMsCisJLnNhdmUgPSBOVUxMLAorCS5yZXN0b3JlID0gTlVMTCwKKwkuZGV0ZWN0ID0gbm91dmVhdV9jb25uZWN0b3JfZGV0ZWN0LAorCS5kZXN0cm95ID0gbm91dmVhdV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuc2V0X3Byb3BlcnR5ID0gbm91dmVhdV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5LAorCS5mb3JjZSA9IG5vdXZlYXVfY29ubmVjdG9yX2ZvcmNlCit9OworCitzdGF0aWMgdm9pZAogbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Z193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IsIGhwZF93b3JrKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHR5cGVvZigqbnZfY29ubmVjdG9yKSwgd29yayk7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZudl9jb25uZWN0b3ItPmJhc2U7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwotCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0oZGV2KTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKGRybS0+ZGV2aWNlKTsKLQlib29sIHBsdWdnZWQgPSBncGlvLT5nZXQoZ3BpbywgMCwgbnZfY29ubmVjdG9yLT5ocGQuZnVuYywgMHhmZik7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShjb25uZWN0b3ItPmRldik7CisJY29uc3QgY2hhciAqbmFtZSA9IGNvbm5lY3Rvci0+bmFtZTsKIAotCU5WX0RFQlVHKGRybSwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKLQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJaWYgKG52X2Nvbm5lY3Rvci0+c3RhdHVzICYgTlZLTV9IUERfSVJRKSB7CisJfSBlbHNlIHsKKwkJYm9vbCBwbHVnZ2VkID0gKG52X2Nvbm5lY3Rvci0+c3RhdHVzICE9IE5WS01fSFBEX1VOUExVRyk7CiAKLQlpZiAocGx1Z2dlZCkKLQkJZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcyhjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT04pOwotCWVsc2UKLQkJZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcyhjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJTlZfREVCVUcoZHJtLCAiJXNwbHVnZ2VkICVzXG4iLCBwbHVnZ2VkID8gIiIgOiAidW4iLCBuYW1lKTsKIAotCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkZXYpOworCQlpZiAocGx1Z2dlZCkKKwkJCWRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMoY29ubmVjdG9yLCBEUk1fTU9ERV9EUE1TX09OKTsKKwkJZWxzZQorCQkJZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcyhjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGNvbm5lY3Rvci0+ZGV2KTsKKwl9CisKKwlub3V2ZWF1X2V2ZW50X2dldChudl9jb25uZWN0b3ItPmhwZCk7CiB9CiAKIHN0YXRpYyBpbnQKLW5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcodm9pZCAqZGF0YSwgaW50IGluZGV4KQorbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICpkYXRhLCB1MzIgdHlwZSwgaW50IGluZGV4KQogewogCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gZGF0YTsKLQlzY2hlZHVsZV93b3JrKCZudl9jb25uZWN0b3ItPmhwZF93b3JrKTsKLQlyZXR1cm4gTlZLTV9FVkVOVF9LRUVQOworCW52X2Nvbm5lY3Rvci0+c3RhdHVzID0gdHlwZTsKKwlzY2hlZHVsZV93b3JrKCZudl9jb25uZWN0b3ItPndvcmspOworCXJldHVybiBOVktNX0VWRU5UX0RST1A7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citub3V2ZWF1X2Nvbm5lY3Rvcl9hdXhfeGZlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgKm1zZykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9CisJCWNvbnRhaW5lcl9vZihhdXgsIHR5cGVvZigqbnZfY29ubmVjdG9yKSwgYXV4KTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCXN0cnVjdCBub3V2ZWF1X2kyY19wb3J0ICpwb3J0OworCWludCByZXQ7CisKKwludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyKCZudl9jb25uZWN0b3ItPmJhc2UsIERDQl9PVVRQVVRfRFApOworCWlmICghbnZfZW5jb2RlciB8fCAhKHBvcnQgPSBudl9lbmNvZGVyLT5pMmMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoV0FSTl9PTihtc2ctPnNpemUgPiAxNikpCisJCXJldHVybiAtRTJCSUc7CisJaWYgKG1zZy0+c2l6ZSA9PSAwKQorCQlyZXR1cm4gbXNnLT5zaXplOworCisJcmV0ID0gbm91dmVhdV9pMmMocG9ydCktPmFjcXVpcmUocG9ydCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBvcnQtPmZ1bmMtPmF1eChwb3J0LCBmYWxzZSwgbXNnLT5yZXF1ZXN0LCBtc2ctPmFkZHJlc3MsCisJCQkgICAgICBtc2ctPmJ1ZmZlciwgbXNnLT5zaXplKTsKKwlub3V2ZWF1X2kyYyhwb3J0KS0+cmVsZWFzZShwb3J0KTsKKwlpZiAocmV0ID49IDApIHsKKwkJbXNnLT5yZXBseSA9IHJldDsKKwkJcmV0dXJuIG1zZy0+c2l6ZTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CkBAIC05NzQsOSArMTAzOCw5IEBACiB7CiAJY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgKmZ1bmNzID0gJm5vdXZlYXVfY29ubmVjdG9yX2Z1bmNzOwogCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0oZGV2KTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncGlvICpncGlvID0gbm91dmVhdV9ncGlvKGRybS0+ZGV2aWNlKTsKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5ICpkaXNwID0gbm91dmVhdV9kaXNwbGF5KGRldik7CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBOVUxMOworCXN0cnVjdCBub3V2ZWF1X2Rpc3AgKnBkaXNwID0gbm91dmVhdV9kaXNwKGRybS0+ZGV2aWNlKTsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCWludCB0eXBlLCByZXQgPSAwOwogCWJvb2wgZHVtbXk7CkBAIC05OTIsMzMgKzEwNTYsMTUgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAljb25uZWN0b3IgPSAmbnZfY29ubmVjdG9yLT5iYXNlOwotCUlOSVRfV09SSygmbnZfY29ubmVjdG9yLT5ocGRfd29yaywgbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Z193b3JrKTsKIAludl9jb25uZWN0b3ItPmluZGV4ID0gaW5kZXg7CiAKIAkvKiBhdHRlbXB0IHRvIHBhcnNlIHZiaW9zIGNvbm5lY3RvciB0eXBlIGFuZCBob3RwbHVnIGdwaW8gKi8KIAludl9jb25uZWN0b3ItPmRjYiA9IG9sZGRjYl9jb25uKGRldiwgaW5kZXgpOwogCWlmIChudl9jb25uZWN0b3ItPmRjYikgewotCQlzdGF0aWMgY29uc3QgdTggaHBkWzE2XSA9IHsKLQkJCTB4ZmYsIDB4MDcsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4NTEsIDB4NTIsIDB4ZmYsCi0JCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDVlLCAweDVmLCAweDYwLAotCQl9OwotCiAJCXUzMiBlbnRyeSA9IFJPTTE2KG52X2Nvbm5lY3Rvci0+ZGNiWzBdKTsKIAkJaWYgKG9sZGRjYl9jb25udGFiKGRldilbM10gPj0gNCkKIAkJCWVudHJ5IHw9ICh1MzIpUk9NMTYobnZfY29ubmVjdG9yLT5kY2JbMl0pIDw8IDE2OwogCi0JCXJldCA9IGdwaW8tPmZpbmQoZ3BpbywgMCwgaHBkW2ZmcygoZW50cnkgJiAweDA3MDMzMDAwKSA+PiAxMildLAotCQkJCSBEQ0JfR1BJT19VTlVTRUQsICZudl9jb25uZWN0b3ItPmhwZCk7Ci0JCWlmIChyZXQpCi0JCQludl9jb25uZWN0b3ItPmhwZC5mdW5jID0gRENCX0dQSU9fVU5VU0VEOwotCi0JCWlmIChudl9jb25uZWN0b3ItPmhwZC5mdW5jICE9IERDQl9HUElPX1VOVVNFRCkgewotCQkJbm91dmVhdV9ldmVudF9uZXcoZ3Bpby0+ZXZlbnRzLCBudl9jb25uZWN0b3ItPmhwZC5saW5lLAotCQkJCQkgIG5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcsCi0JCQkJCSAgbnZfY29ubmVjdG9yLAotCQkJCQkgJm52X2Nvbm5lY3Rvci0+aHBkX2Z1bmMpOwotCQl9Ci0KIAkJbnZfY29ubmVjdG9yLT50eXBlID0gbnZfY29ubmVjdG9yLT5kY2JbMF07CiAJCWlmIChkcm1fY29ubnR5cGVfZnJvbV9kY2IobnZfY29ubmVjdG9yLT50eXBlKSA9PQogCQkJCQkgIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKSB7CkBAIC0xMDQwLDcgKzEwODYsNiBAQAogCQl9CiAJfSBlbHNlIHsKIAkJbnZfY29ubmVjdG9yLT50eXBlID0gRENCX0NPTk5FQ1RPUl9OT05FOwotCQludl9jb25uZWN0b3ItPmhwZC5mdW5jID0gRENCX0dQSU9fVU5VU0VEOwogCX0KIAogCS8qIG5vIHZiaW9zIGRhdGEsIG9yIGFuIHVua25vd24gZGNiIGNvbm5lY3RvciB0eXBlIC0gYXR0ZW1wdCB0bwpAQCAtMTA4MCw4ICsxMTI1LDggQEAKIAkJfQogCX0KIAotCXR5cGUgPSBkcm1fY29ubnR5cGVfZnJvbV9kY2IobnZfY29ubmVjdG9yLT50eXBlKTsKLQlpZiAodHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykgeworCXN3aXRjaCAoKHR5cGUgPSBkcm1fY29ubnR5cGVfZnJvbV9kY2IobnZfY29ubmVjdG9yLT50eXBlKSkpIHsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgogCQlyZXQgPSBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIDAsICZkdW1teSwgJmR1bW15KTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZHJtLCAiRXJyb3IgcGFyc2luZyBMVkRTIHRhYmxlLCBkaXNhYmxpbmdcbiIpOwpAQCAtMTA5MCw4ICsxMTM1LDIzIEBACiAJCX0KIAogCQlmdW5jcyA9ICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jc19sdmRzOwotCX0gZWxzZSB7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX2VEUDoKKwkJbnZfY29ubmVjdG9yLT5hdXguZGV2ID0gZGV2LT5kZXY7CisJCW52X2Nvbm5lY3Rvci0+YXV4LnRyYW5zZmVyID0gbm91dmVhdV9jb25uZWN0b3JfYXV4X3hmZXI7CisJCXJldCA9IGRybV9kcF9hdXhfcmVnaXN0ZXIoJm52X2Nvbm5lY3Rvci0+YXV4KTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZHJtLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGF1eCBjaGFubmVsXG4iKTsKKwkJCWtmcmVlKG52X2Nvbm5lY3Rvcik7CisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQl9CisKKwkJZnVuY3MgPSAmbm91dmVhdV9jb25uZWN0b3JfZnVuY3NfZHA7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWZ1bmNzID0gJm5vdXZlYXVfY29ubmVjdG9yX2Z1bmNzOworCQlicmVhazsKIAl9CiAKIAkvKiBkZWZhdWx0cywgd2lsbCBnZXQgb3ZlcnJpZGRlbiBpbiBkZXRlY3QoKSAqLwpAQCAtMTE2NiwxMCArMTIyNiwxNiBAQAogCQlicmVhazsKIAl9CiAKLQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9DT05ORUNUOwotCWlmIChudl9jb25uZWN0b3ItPmhwZC5mdW5jICE9IERDQl9HUElPX1VOVVNFRCkKKwlyZXQgPSBub3V2ZWF1X2V2ZW50X25ldyhwZGlzcC0+aHBkLCBOVktNX0hQRCwgaW5kZXgsCisJCQkJbm91dmVhdV9jb25uZWN0b3JfaG90cGx1ZywKKwkJCQludl9jb25uZWN0b3IsICZudl9jb25uZWN0b3ItPmhwZCk7CisJaWYgKHJldCkKKwkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKKwllbHNlCiAJCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKIAorCUlOSVRfV09SSygmbnZfY29ubmVjdG9yLT53b3JrLCBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnX3dvcmspOworCiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKIAlyZXR1cm4gY29ubmVjdG9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmgKaW5kZXggMjY0YTc3OC4uODg2MWI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5oCkBAIC0yOCwxMiArMjgsMTIgQEAKICNkZWZpbmUgX19OT1VWRUFVX0NPTk5FQ1RPUl9IX18KIAogI2luY2x1ZGUgPGRybS9kcm1fZWRpZC5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CiAjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCiAKICNpbmNsdWRlIDxjb3JlL2V2ZW50Lmg+CiAKICNpbmNsdWRlIDxzdWJkZXYvYmlvcy5oPgotI2luY2x1ZGUgPHN1YmRldi9iaW9zL2dwaW8uaD4KIAogc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQ7CiAKQEAgLTY3LDkgKzY3LDExIEBACiAJdTggaW5kZXg7CiAJdTggKmRjYjsKIAotCXN0cnVjdCBkY2JfZ3Bpb19mdW5jIGhwZDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHBkX3dvcms7Ci0Jc3RydWN0IG5vdXZlYXVfZXZlbnRoICpocGRfZnVuYzsKKwlzdHJ1Y3Qgbm91dmVhdV9ldmVudGggKmhwZDsKKwl1MzIgc3RhdHVzOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJc3RydWN0IGRybV9kcF9hdXggYXV4OwogCiAJaW50IGRpdGhlcmluZ19tb2RlOwogCWludCBkaXRoZXJpbmdfZGVwdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCmluZGV4IGQxZTU4OTAuLmEwNTM0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCkBAIC03NCw3ICs3NCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfY3J0YyAqbm91dmVhdV9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBub3V2ZWF1X2NydGMsIGJhc2UpOworCXJldHVybiBjcnRjID8gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBub3V2ZWF1X2NydGMsIGJhc2UpIDogTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2NydGMgKnRvX2RybV9jcnRjKHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCmluZGV4IGRhNzY0YTQuLjI2YjU2NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8Y29yZS9jbGFzcy5oPgogCiBzdGF0aWMgaW50Ci1ub3V2ZWF1X2Rpc3BsYXlfdmJsYW5rX2hhbmRsZXIodm9pZCAqZGF0YSwgaW50IGhlYWQpCitub3V2ZWF1X2Rpc3BsYXlfdmJsYW5rX2hhbmRsZXIodm9pZCAqZGF0YSwgdTMyIHR5cGUsIGludCBoZWFkKQogewogCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gZGF0YTsKIAlkcm1faGFuZGxlX3ZibGFuayhkcm0tPmRldiwgaGVhZCk7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YzsgaSsrKSB7Ci0JCXJldCA9IG5vdXZlYXVfZXZlbnRfbmV3KHBkaXNwLT52YmxhbmssIGksCisJCXJldCA9IG5vdXZlYXVfZXZlbnRfbmV3KHBkaXNwLT52YmxhbmssIDEsIGksCiAJCQkJCW5vdXZlYXVfZGlzcGxheV92YmxhbmtfaGFuZGxlciwKIAkJCQkJZHJtLCAmZGlzcC0+dmJsYW5rW2ldKTsKIAkJaWYgKHJldCkgewpAQCAtMzkzLDcgKzM5Myw3IEBACiAJLyogZW5hYmxlIGhvdHBsdWcgaW50ZXJydXB0cyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewogCQlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKmNvbm4gPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQlpZiAoY29ubi0+aHBkX2Z1bmMpIG5vdXZlYXVfZXZlbnRfZ2V0KGNvbm4tPmhwZF9mdW5jKTsKKwkJaWYgKGNvbm4tPmhwZCkgbm91dmVhdV9ldmVudF9nZXQoY29ubi0+aHBkKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJLyogZGlzYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKIAkJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJaWYgKGNvbm4tPmhwZF9mdW5jKSBub3V2ZWF1X2V2ZW50X3B1dChjb25uLT5ocGRfZnVuYyk7CisJCWlmIChjb25uLT5ocGQpIG5vdXZlYXVfZXZlbnRfcHV0KGNvbm4tPmhwZCk7CiAJfQogCiAJZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRldik7CkBAIC03OTgsNiArNzk4LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZHJtLT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlICpzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNydGNpZCA9IC0xOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCkBAIC04MDgsOCArODA5LDEzIEBACiAJfQogCiAJcyA9IGxpc3RfZmlyc3RfZW50cnkoJmZjdHgtPmZsaXAsIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSwgaGVhZCk7Ci0JaWYgKHMtPmV2ZW50KQotCQlkcm1fc2VuZF92YmxhbmtfZXZlbnQoZGV2LCBzLT5jcnRjLCBzLT5ldmVudCk7CisJaWYgKHMtPmV2ZW50KSB7CisJCS8qIFZibGFuayB0aW1lc3RhbXBzL2NvdW50cyBhcmUgb25seSBjb3JyZWN0IG9uID49IE5WLTUwICovCisJCWlmIChudl9kZXZpY2UoZHJtLT5kZXZpY2UpLT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCQljcnRjaWQgPSBzLT5jcnRjOworCisJCWRybV9zZW5kX3ZibGFua19ldmVudChkZXYsIGNydGNpZCwgcy0+ZXZlbnQpOworCX0KIAogCWxpc3RfZGVsKCZzLT5oZWFkKTsKIAlpZiAocHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKaW5kZXggMzZmZDIyNS4uNTY3NWZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwpAQCAtNTUsMTEgKzU1LDEwIEBACiAKIH0KIAotYm9vbAotbm91dmVhdV9kcF9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoraW50Citub3V2ZWF1X2RwX2RldGVjdChzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyKQogewotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfZW5jb2Rlci0+YmFzZS5iYXNlLmRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKGRldik7CiAJc3RydWN0IG5vdXZlYXVfaTJjX3BvcnQgKmF1eGNoOwogCXU4ICpkcGNkID0gbnZfZW5jb2Rlci0+ZHAuZHBjZDsKQEAgLTY3LDExICs2NiwxMSBAQAogCiAJYXV4Y2ggPSBudl9lbmNvZGVyLT5pMmM7CiAJaWYgKCFhdXhjaCkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IG52X3JkYXV4KGF1eGNoLCBEUF9EUENEX1JFViwgZHBjZCwgOCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gcmV0OwogCiAJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IDI3MDAwICogZHBjZFsxXTsKIAludl9lbmNvZGVyLT5kcC5saW5rX25yID0gZHBjZFsyXSAmIERQX01BWF9MQU5FX0NPVU5UX01BU0s7CkBAIC05MSw2ICs5MCw1IEBACiAJCSAgICAgbnZfZW5jb2Rlci0+ZHAubGlua19uciwgbnZfZW5jb2Rlci0+ZHAubGlua19idyk7CiAKIAlub3V2ZWF1X2RwX3Byb2JlX291aShkZXYsIGF1eGNoLCBkcGNkKTsKLQotCXJldHVybiB0cnVlOworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaAppbmRleCAyNDY2MGMwLi41ZjBlMzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaApAQCAtNDYsNiArNDYsNyBAQAogCS8qIGRpZmZlcmVudCB0byBkcm1fZW5jb2Rlci5jcnRjLCB0aGlzIHJlZmxlY3RzIHdoYXQncwogCSAqIGFjdHVhbGx5IHByb2dyYW1tZWQgb24gdGhlIGh3LCBub3QgdGhlIHByb3Bvc2VkIGNydGMgKi8KIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJdTMyIGN0cmw7CiAKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBtb2RlOwogCWludCBsYXN0X2RwbXM7CkBAIC04NCw5ICs4NSw3IEBACiB9CiAKIC8qIG5vdXZlYXVfZHAuYyAqLwotYm9vbCBub3V2ZWF1X2RwX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKik7Ci12b2lkIG5vdXZlYXVfZHBfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKiwgaW50IG1vZGUsIHUzMiBkYXRhcmF0ZSwKLQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CitpbnQgbm91dmVhdV9kcF9kZXRlY3Qoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqKTsKIAogc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICoKIG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKmVuY29kZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCmluZGV4IDkwMDc0ZDYuLmFiNWVhM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ub3V2ZWF1X2ZlbmNlX3dhaXRfdWV2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSwgaW50IGluZGV4KQorbm91dmVhdV9mZW5jZV93YWl0X3VldmVudF9oYW5kbGVyKHZvaWQgKmRhdGEsIHUzMiB0eXBlLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2VfcHJpdiAqcHJpdiA9IGRhdGE7CiAJd2FrZV91cF9hbGwoJnByaXYtPndhaXRpbmcpOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJc3RydWN0IG5vdXZlYXVfZXZlbnRoICpoYW5kbGVyOwogCWludCByZXQgPSAwOwogCi0JcmV0ID0gbm91dmVhdV9ldmVudF9uZXcocGZpZm8tPnVldmVudCwgMCwKKwlyZXQgPSBub3V2ZWF1X2V2ZW50X25ldyhwZmlmby0+dWV2ZW50LCAxLCAwLAogCQkJCW5vdXZlYXVfZmVuY2Vfd2FpdF91ZXZlbnRfaGFuZGxlciwKIAkJCQlwcml2LCAmaGFuZGxlcik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaW9jMzIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaW9jMzIuYwppbmRleCBjMWE3ZTVhLi40NjI2NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lvYzMyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pb2MzMi5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJCXJldHVybiBkcm1fY29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKIAogI2lmIDAKLQlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FSUkFZX1NJWkUobWdhX2NvbXBhdF9pb2N0bHMpKQorCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UgKyBBUlJBWV9TSVpFKG1nYV9jb21wYXRfaW9jdGxzKSkKIAkJZm4gPSBub3V2ZWF1X2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKICNlbmRpZgogCWlmIChmbiAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92Z2EuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdmdhLmMKaW5kZXggZmI4NGRhM2MuLjRmNGMzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdmdhLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92Z2EuYwpAQCAtNjQsMTIgKzY0LDEzIEBACiBub3V2ZWF1X3N3aXRjaGVyb29fY2FuX3N3aXRjaChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWJvb2wgY2FuX3N3aXRjaDsKIAotCXNwaW5fbG9jaygmZGV2LT5jb3VudF9sb2NrKTsKLQljYW5fc3dpdGNoID0gKGRldi0+b3Blbl9jb3VudCA9PSAwKTsKLQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKLQlyZXR1cm4gY2FuX3N3aXRjaDsKKwkvKgorCSAqIEZJWE1FOiBvcGVuX2NvdW50IGlzIHByb3RlY3RlZCBieSBkcm1fZ2xvYmFsX211dGV4IGJ1dCB0aGF0IHdvdWxkIGxlYWQgdG8KKwkgKiBsb2NraW5nIGludmVyc2lvbiB3aXRoIHRoZSBkcml2ZXIgbG9hZCBwYXRoLiBBbmQgdGhlIGFjY2VzcyBoZXJlIGlzCisJICogY29tcGxldGVseSByYWN5IGFueXdheS4gU28gZG9uJ3QgYm90aGVyIHdpdGggbG9ja2luZyBmb3Igbm93LgorCSAqLworCXJldHVybiBkZXYtPm9wZW5fY291bnQgPT0gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19jbGllbnRfb3BzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCmluZGV4IDU4YWY1NDcuLmFmZGY2MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCkBAIC0xLDQgKzEsNCBAQAotCS8qCisvKgogICogQ29weXJpZ2h0IDIwMTEgUmVkIEhhdCBJbmMuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CiAKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCkBAIC05NTcsNyArOTU4LDcgQEAKIAogCW52NTBfZGlzcGxheV9mbGlwX3N0b3AoY3J0Yyk7CiAKLQlwdXNoID0gZXZvX3dhaXQobWFzdCwgMik7CisJcHVzaCA9IGV2b193YWl0KG1hc3QsIDYpOwogCWlmIChwdXNoKSB7CiAJCWlmIChudjUwX3ZlcnMobWFzdCkgPCBOVjg0X0RJU1BfTUFTVF9DTEFTUykgewogCQkJZXZvX210aGQocHVzaCwgMHgwODc0ICsgKG52X2NydGMtPmluZGV4ICogMHg0MDApLCAxKTsKQEAgLTEyMDcsNiArMTIwOCw3IEBACiBudjUwX2NydGNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IG52NTBfaGVhZCAqaGVhZCA9IG52NTBfaGVhZChjcnRjKTsKKwlldm9fc3luYyhjcnRjLT5kZXYpOwogCWlmIChoZWFkLT5pbWFnZSkKIAkJbm91dmVhdV9ib191bnBpbihoZWFkLT5pbWFnZSk7CiAJbm91dmVhdV9ib19yZWYoTlVMTCwgJmhlYWQtPmltYWdlKTsKQEAgLTE3MDAsMTAgKzE3MDIsOSBAQAogfQogCiBzdGF0aWMgdm9pZAotbnY1MF9oZG1pX2Rpc2Nvbm5lY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQorbnY1MF9oZG1pX2Rpc2Nvbm5lY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjKQogewogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0Yyhudl9lbmNvZGVyLT5jcnRjKTsKIAlzdHJ1Y3QgbnY1MF9kaXNwICpkaXNwID0gbnY1MF9kaXNwKGVuY29kZXItPmRldik7CiAJY29uc3QgdTMyIG1vZmYgPSAobnZfY3J0Yy0+aW5kZXggPDwgMykgfCBudl9lbmNvZGVyLT5vcjsKIApAQCAtMTcyMiw3ICsxNzIzLDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCBudjUwX2Rpc3AgKmRpc3AgPSBudjUwX2Rpc3AoZGV2KTsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKnBhcnRuZXI7Ci0JaW50IG9yID0gbnZfZW5jb2Rlci0+b3I7CisJdTMyIG10aGQ7CiAKIAludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBtb2RlOwogCkBAIC0xNzQwLDcgKzE3NDEsMTcgQEAKIAkJfQogCX0KIAotCW52X2NhbGwoZGlzcC0+Y29yZSwgTlY1MF9ESVNQX1NPUl9QV1IgKyBvciwgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikpOworCW10aGQgID0gKGZmcyhudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluaykgLSAxKSA8PCAyOworCW10aGQgfD0gbnZfZW5jb2Rlci0+b3I7CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IERDQl9PVVRQVVRfRFApIHsKKwkJbnZfY2FsbChkaXNwLT5jb3JlLCBOVjUwX0RJU1BfU09SX1BXUiB8IG10aGQsIDEpOworCQltdGhkIHw9IE5WOTRfRElTUF9TT1JfRFBfUFdSOworCX0gZWxzZSB7CisJCW10aGQgfD0gTlY1MF9ESVNQX1NPUl9QV1I7CisJfQorCisJbnZfY2FsbChkaXNwLT5jb3JlLCBtdGhkLCAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSk7CiB9CiAKIHN0YXRpYyBib29sCkBAIC0xNzY0LDMzICsxNzc1LDM2IEBACiB9CiAKIHN0YXRpYyB2b2lkCitudjUwX3Nvcl9jdHJsKHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgbnY1MF9tYXN0ICptYXN0ID0gbnY1MF9tYXN0KG52X2VuY29kZXItPmJhc2UuYmFzZS5kZXYpOworCXUzMiB0ZW1wID0gKG52X2VuY29kZXItPmN0cmwgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spLCAqcHVzaDsKKwlpZiAodGVtcCAhPSBudl9lbmNvZGVyLT5jdHJsICYmIChwdXNoID0gZXZvX3dhaXQobWFzdCwgMikpKSB7CisJCWlmIChudjUwX3ZlcnMobWFzdCkgPCBOVkQwX0RJU1BfTUFTVF9DTEFTUykgeworCQkJZXZvX210aGQocHVzaCwgMHgwNjAwICsgKG52X2VuY29kZXItPm9yICogMHg0MCksIDEpOworCQkJZXZvX2RhdGEocHVzaCwgKG52X2VuY29kZXItPmN0cmwgPSB0ZW1wKSk7CisJCX0gZWxzZSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAyMDAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDIwKSwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAobnZfZW5jb2Rlci0+Y3RybCA9IHRlbXApKTsKKwkJfQorCQlldm9fa2ljayhwdXNoLCBtYXN0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCiBudjUwX3Nvcl9kaXNjb25uZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBudjUwX21hc3QgKm1hc3QgPSBudjUwX21hc3QoZW5jb2Rlci0+ZGV2KTsKLQljb25zdCBpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKLQl1MzIgKnB1c2g7Ci0KLQlpZiAobnZfZW5jb2Rlci0+Y3J0YykgewotCQludjUwX2NydGNfcHJlcGFyZShudl9lbmNvZGVyLT5jcnRjKTsKLQotCQlwdXNoID0gZXZvX3dhaXQobWFzdCwgNCk7Ci0JCWlmIChwdXNoKSB7Ci0JCQlpZiAobnY1MF92ZXJzKG1hc3QpIDwgTlZEMF9ESVNQX01BU1RfQ0xBU1MpIHsKLQkJCQlldm9fbXRoZChwdXNoLCAweDA2MDAgKyAob3IgKiAweDQwKSwgMSk7Ci0JCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7Ci0JCQl9IGVsc2UgewotCQkJCWV2b19tdGhkKHB1c2gsIDB4MDIwMCArIChvciAqIDB4MjApLCAxKTsKLQkJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKLQkJCX0KLQkJCWV2b19raWNrKHB1c2gsIG1hc3QpOwotCQl9Ci0KLQkJbnY1MF9oZG1pX2Rpc2Nvbm5lY3QoZW5jb2Rlcik7Ci0JfQorCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMobnZfZW5jb2Rlci0+Y3J0Yyk7CiAKIAludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBEUk1fTU9ERV9EUE1TX09GRjsKIAludl9lbmNvZGVyLT5jcnRjID0gTlVMTDsKKworCWlmIChudl9jcnRjKSB7CisJCW52NTBfY3J0Y19wcmVwYXJlKCZudl9jcnRjLT5iYXNlKTsKKwkJbnY1MF9zb3JfY3RybChudl9lbmNvZGVyLCAxIDw8IG52X2NydGMtPmluZGV4LCAwKTsKKwkJbnY1MF9oZG1pX2Rpc2Nvbm5lY3QoJm52X2VuY29kZXItPmJhc2UuYmFzZSwgbnZfY3J0Yyk7CisJfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTgxMCwxMiArMTgyNCwxNCBAQAogCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3I7CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkcm0tPnZiaW9zOwotCXUzMiAqcHVzaCwgbHZkcyA9IDA7CisJdTMyIGx2ZHMgPSAwLCBtYXNrLCBjdHJsOwogCXU4IG93bmVyID0gMSA8PCBudl9jcnRjLT5pbmRleDsKIAl1OCBwcm90byA9IDB4ZjsKIAl1OCBkZXB0aCA9IDB4MDsKIAogCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCW52X2VuY29kZXItPmNydGMgPSBlbmNvZGVyLT5jcnRjOworCiAJc3dpdGNoIChudl9lbmNvZGVyLT5kY2ItPnR5cGUpIHsKIAljYXNlIERDQl9PVVRQVVRfVE1EUzoKIAkJaWYgKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSkgewpAQCAtMTgyNyw3ICsxODQzLDcgQEAKIAkJCXByb3RvID0gMHgyOwogCQl9CiAKLQkJbnY1MF9oZG1pX21vZGVfc2V0KGVuY29kZXIsIG1vZGUpOworCQludjUwX2hkbWlfbW9kZV9zZXQoJm52X2VuY29kZXItPmJhc2UuYmFzZSwgbW9kZSk7CiAJCWJyZWFrOwogCWNhc2UgRENCX09VVFBVVF9MVkRTOgogCQlwcm90byA9IDB4MDsKQEAgLTE4ODMsMTkgKzE4OTksMTEgQEAKIAkJYnJlYWs7CiAJfQogCi0JbnY1MF9zb3JfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwludjUwX3Nvcl9kcG1zKCZudl9lbmNvZGVyLT5iYXNlLmJhc2UsIERSTV9NT0RFX0RQTVNfT04pOwogCi0JcHVzaCA9IGV2b193YWl0KG52NTBfbWFzdChkZXYpLCA4KTsKLQlpZiAocHVzaCkgewotCQlpZiAobnY1MF92ZXJzKG1hc3QpIDwgTlZEMF9ESVNQX0NMQVNTKSB7Ci0JCQl1MzIgY3RybCA9IChkZXB0aCA8PCAxNikgfCAocHJvdG8gPDwgOCkgfCBvd25lcjsKLQkJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKQotCQkJCWN0cmwgfD0gMHgwMDAwMTAwMDsKLQkJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTlZTWU5DKQotCQkJCWN0cmwgfD0gMHgwMDAwMjAwMDsKLQkJCWV2b19tdGhkKHB1c2gsIDB4MDYwMCArIChudl9lbmNvZGVyLT5vciAqIDB4MDQwKSwgMSk7Ci0JCQlldm9fZGF0YShwdXNoLCBjdHJsKTsKLQkJfSBlbHNlIHsKKwlpZiAobnY1MF92ZXJzKG1hc3QpID49IE5WRDBfRElTUF9DTEFTUykgeworCQl1MzIgKnB1c2ggPSBldm9fd2FpdChtYXN0LCAzKTsKKwkJaWYgKHB1c2gpIHsKIAkJCXUzMiBtYWdpYyA9IDB4MzFlYzYwMDAgfCAobnZfY3J0Yy0+aW5kZXggPDwgMjUpOwogCQkJdTMyIHN5bmNzID0gMHgwMDAwMDAwMTsKIApAQCAtMTkxMCwxNCArMTkxOCwyMSBAQAogCQkJZXZvX210aGQocHVzaCwgMHgwNDA0ICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAyKTsKIAkJCWV2b19kYXRhKHB1c2gsIHN5bmNzIHwgKGRlcHRoIDw8IDYpKTsKIAkJCWV2b19kYXRhKHB1c2gsIG1hZ2ljKTsKLQkJCWV2b19tdGhkKHB1c2gsIDB4MDIwMCArIChudl9lbmNvZGVyLT5vciAqIDB4MDIwKSwgMSk7Ci0JCQlldm9fZGF0YShwdXNoLCBvd25lciB8IChwcm90byA8PCA4KSk7CisJCQlldm9fa2ljayhwdXNoLCBtYXN0KTsKIAkJfQogCi0JCWV2b19raWNrKHB1c2gsIG1hc3QpOworCQljdHJsID0gcHJvdG8gPDwgODsKKwkJbWFzayA9IDB4MDAwMDBmMDA7CisJfSBlbHNlIHsKKwkJY3RybCA9IChkZXB0aCA8PCAxNikgfCAocHJvdG8gPDwgOCk7CisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKQorCQkJY3RybCB8PSAweDAwMDAxMDAwOworCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJCWN0cmwgfD0gMHgwMDAwMjAwMDsKKwkJbWFzayA9IDB4MDAwZjNmMDA7CiAJfQogCi0JbnZfZW5jb2Rlci0+Y3J0YyA9IGVuY29kZXItPmNydGM7CisJbnY1MF9zb3JfY3RybChudl9lbmNvZGVyLCBtYXNrIHwgb3duZXIsIGN0cmwgfCBvd25lcik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjk1LDcgKzIzMTAsNyBAQAogCQkJY29udGludWU7CiAKIAkJTlZfV0FSTihkcm0sICIlcyBoYXMgbm8gZW5jb2RlcnMsIHJlbW92aW5nXG4iLAotCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCWNvbm5lY3Rvci0+bmFtZSk7CiAJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKaW5kZXggZTNjNDdhOC4uMmQyOGRjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jcnRjLmMKQEAgLTMxOSwxMyArMzE5LDEzIEBACiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmY3J0Yy0+bW9kZTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmJvOwogCi0JbXV0ZXhfbG9jaygmY3J0Yy0+bXV0ZXgpOworCWRybV9tb2Rlc2V0X2xvY2soJmNydGMtPm11dGV4LCBOVUxMKTsKIAlvbWFwX3BsYW5lX21vZGVfc2V0KG9tYXBfY3J0Yy0+cGxhbmUsIGNydGMsIGNydGMtPnByaW1hcnktPmZiLAogCQkJMCwgMCwgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAogCQkJY3J0Yy0+eCA8PCAxNiwgY3J0Yy0+eSA8PCAxNiwKIAkJCW1vZGUtPmhkaXNwbGF5IDw8IDE2LCBtb2RlLT52ZGlzcGxheSA8PCAxNiwKIAkJCXZibGFua19jYiwgY3J0Yyk7Ci0JbXV0ZXhfdW5sb2NrKCZjcnRjLT5tdXRleCk7CisJZHJtX21vZGVzZXRfdW5sb2NrKCZjcnRjLT5tdXRleCk7CiAKIAlibyA9IG9tYXBfZnJhbWVidWZmZXJfYm8oY3J0Yy0+cHJpbWFyeS0+ZmIsIDApOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGJvKTsKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCSAqIHRoZSBjYWxsYmFja3MgYW5kIGxpc3QgbW9kaWZpY2F0aW9uIGFsbCBzZXJpYWxpemVkCiAJICogd2l0aCByZXNwZWN0IHRvIG1vZGVzZXR0aW5nIGlvY3RscyBmcm9tIHVzZXJzcGFjZS4KIAkgKi8KLQltdXRleF9sb2NrKCZjcnRjLT5tdXRleCk7CisJZHJtX21vZGVzZXRfbG9jaygmY3J0Yy0+bXV0ZXgsIE5VTEwpOwogCWRpc3BjX3J1bnRpbWVfZ2V0KCk7CiAKIAkvKgpAQCAtNTEwLDcgKzUxMCw3IEBACiAKIG91dDoKIAlkaXNwY19ydW50aW1lX3B1dCgpOwotCW11dGV4X3VubG9jaygmY3J0Yy0+bXV0ZXgpOworCWRybV9tb2Rlc2V0X3VubG9jaygmY3J0Yy0+bXV0ZXgpOwogfQogCiBpbnQgb21hcF9jcnRjX2FwcGx5KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTUxOCw3ICs1MTgsNyBAQAogewogCXN0cnVjdCBvbWFwX2NydGMgKm9tYXBfY3J0YyA9IHRvX29tYXBfY3J0YyhjcnRjKTsKIAotCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmY3J0Yy0+bXV0ZXgpKTsKKwlXQVJOX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmNydGMtPm11dGV4KSk7CiAKIAkvKiBubyBuZWVkIHRvIHF1ZXVlIGl0IGFnYWluIGlmIGl0IGlzIGFscmVhZHkgcXVldWVkOiAqLwogCWlmIChhcHBseS0+cXVldWVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZHJ2LmMKaW5kZXggYzgyNzBlNC4uMDAyYjk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Rydi5jCkBAIC01ODgsOSArNTg4LDcgQEAKIAkJfQogCX0KIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Ci0JcmV0ID0gZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUocHJpdi0+ZmJkZXYpOwotCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZChwcml2LT5mYmRldik7CiAJaWYgKHJldCkKIAkJREJHKCJmYWlsZWQgdG8gcmVzdG9yZSBjcnRjIG1vZGUiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfZmIuYwppbmRleCA4YjAxOTYwLi4yYTVjYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9mYi5jCkBAIC0zNDYsNiArMzQ2LDcgQEAKIAogCVZFUkIoImZsdXNoOiAlZCwlZCAlZHglZCwgZmI9JXAiLCB4LCB5LCB3LCBoLCBmYik7CiAKKwkvKiBGSVhNRTogVGhpcyBpcyByYWN5IC0gbm8gcHJvdGVjdGlvbiBhZ2FpbnN0IG1vZGVzZXQgY29uZmlnIGNoYW5nZXMuICovCiAJd2hpbGUgKChjb25uZWN0b3IgPSBvbWFwX2ZyYW1lYnVmZmVyX2dldF9uZXh0X2Nvbm5lY3RvcihmYiwgY29ubmVjdG9yKSkpIHsKIAkJLyogb25seSBjb25zaWRlciBjb25uZWN0b3JzIHRoYXQgYXJlIHBhcnQgb2YgYSBjaGFpbiAqLwogCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyICYmIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLWxkOTA0MC5jIGIvZHJpdmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLWxkOTA0MC5jCmluZGV4IDFmMWY4MzcuLmRiMTYwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1sZDkwNDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtbGQ5MDQwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgTUNTX0VMVlNTX09OCQkweGIxCiAjZGVmaW5lIE1DU19VU0VSX1NFVFRJTkcJMHhmMAogI2RlZmluZSBNQ1NfRElTUENUTAkJMHhmMgorI2RlZmluZSBNQ1NfUE9XRVJfQ1RSTAkJMHhmNAogI2RlZmluZSBNQ1NfR1RDT04JCTB4ZjcKICNkZWZpbmUgTUNTX1BBTkVMX0NPTkRJVElPTgkweGY4CiAjZGVmaW5lIE1DU19HQU1NQV9TRVQxCQkweGY5CkBAIC0xODIsNiArMTgzLDggQEAKIAlsZDkwNDBfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCBNQ1NfRElTUENUTCwKIAkJMHgwMiwgMHgwOCwgMHgwOCwgMHgxMCwgMHgxMCk7CiAJbGQ5MDQwX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgTUNTX01BTlBXUiwgMHgwNCk7CisJbGQ5MDQwX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgTUNTX1BPV0VSX0NUUkwsCisJCTB4MGEsIDB4ODcsIDB4MjUsIDB4NmEsIDB4NDQsIDB4MDIsIDB4ODgpOwogCWxkOTA0MF9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIE1DU19FTFZTU19PTiwgMHgwZCwgMHgwMCwgMHgxNik7CiAJbGQ5MDQwX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgTUNTX0dUQ09OLCAweDA5LCAweDAwLCAweDAwKTsKIAlsZDkwNDBfYnJpZ2h0bmVzc19zZXQoY3R4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zNmU4YWEwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtczZlOGFhMC5jCmluZGV4IDM1OTQxZDIuLjA2ZTU3YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zNmU4YWEwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLXM2ZThhYTAuYwpAQCAtODQ3LDYgKzg0Nyw3IEBACiAJaWYgKGkgPj0gQVJSQVlfU0laRShzNmU4YWEwX3ZhcmlhbnRzKSkgewogCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5zdXBwb3J0ZWQgZGlzcGxheSB2ZXJzaW9uICVkXG4iLCBpZFsxXSk7CiAJCWN0eC0+ZXJyb3IgPSAtRUlOVkFMOworCQlyZXR1cm47CiAJfQogCiAJY3R4LT52YXJpYW50ID0gJnM2ZThhYTBfdmFyaWFudHNbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2ltcGxlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2ltcGxlLmMKaW5kZXggMzA5ZjI5ZS4uYTI1MTM2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1zaW1wbGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2ltcGxlLmMKQEAgLTI2Miw2ICsyNjIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcGFuZWxfc2ltcGxlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFuZWxfc2ltcGxlICpwYW5lbCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGFuZWxfc2ltcGxlX2Rpc2FibGUoJnBhbmVsLT5iYXNlKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGF1b19iMTAxYXcwM19tb2RlID0gewogCS5jbG9jayA9IDUxNDUwLAogCS5oZGlzcGxheSA9IDEwMjQsCkBAIC0yODQsNiArMjkxLDI4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBhdW9fYjEzM3h0bjAxX21vZGUgPSB7CisJLmNsb2NrID0gNjk1MDAsCisJLmhkaXNwbGF5ID0gMTM2NiwKKwkuaHN5bmNfc3RhcnQgPSAxMzY2ICsgNDgsCisJLmhzeW5jX2VuZCA9IDEzNjYgKyA0OCArIDMyLAorCS5odG90YWwgPSAxMzY2ICsgNDggKyAzMiArIDIwLAorCS52ZGlzcGxheSA9IDc2OCwKKwkudnN5bmNfc3RhcnQgPSA3NjggKyAzLAorCS52c3luY19lbmQgPSA3NjggKyAzICsgNiwKKwkudnRvdGFsID0gNzY4ICsgMyArIDYgKyAxMywKKwkudnJlZnJlc2ggPSA2MCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFuZWxfZGVzYyBhdW9fYjEzM3h0bjAxID0geworCS5tb2RlcyA9ICZhdW9fYjEzM3h0bjAxX21vZGUsCisJLm51bV9tb2RlcyA9IDEsCisJLnNpemUgPSB7CisJCS53aWR0aCA9IDI5MywKKwkJLmhlaWdodCA9IDE2NSwKKwl9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGNodW5naHdhX2NsYWExMDF3YTAxYV9tb2RlID0gewogCS5jbG9jayA9IDcyMDcwLAogCS5oZGlzcGxheSA9IDEzNjYsCkBAIC0zMjgsNiArMzU3LDUyIEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBlZHRfZXQwNTcwOTBkaHVfbW9kZSA9IHsKKwkuY2xvY2sgPSAyNTE3NSwKKwkuaGRpc3BsYXkgPSA2NDAsCisJLmhzeW5jX3N0YXJ0ID0gNjQwICsgMTYsCisJLmhzeW5jX2VuZCA9IDY0MCArIDE2ICsgMzAsCisJLmh0b3RhbCA9IDY0MCArIDE2ICsgMzAgKyAxMTQsCisJLnZkaXNwbGF5ID0gNDgwLAorCS52c3luY19zdGFydCA9IDQ4MCArIDEwLAorCS52c3luY19lbmQgPSA0ODAgKyAxMCArIDMsCisJLnZ0b3RhbCA9IDQ4MCArIDEwICsgMyArIDMyLAorCS52cmVmcmVzaCA9IDYwLAorCS5mbGFncyA9IERSTV9NT0RFX0ZMQUdfTlZTWU5DIHwgRFJNX01PREVfRkxBR19OSFNZTkMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhbmVsX2Rlc2MgZWR0X2V0MDU3MDkwZGh1ID0geworCS5tb2RlcyA9ICZlZHRfZXQwNTcwOTBkaHVfbW9kZSwKKwkubnVtX21vZGVzID0gMSwKKwkuc2l6ZSA9IHsKKwkJLndpZHRoID0gMTE1LAorCQkuaGVpZ2h0ID0gODYsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBlZHRfZXRtMDcwMGcwZGg2X21vZGUgPSB7CisJLmNsb2NrID0gMzMyNjAsCisJLmhkaXNwbGF5ID0gODAwLAorCS5oc3luY19zdGFydCA9IDgwMCArIDQwLAorCS5oc3luY19lbmQgPSA4MDAgKyA0MCArIDEyOCwKKwkuaHRvdGFsID0gODAwICsgNDAgKyAxMjggKyA4OCwKKwkudmRpc3BsYXkgPSA0ODAsCisJLnZzeW5jX3N0YXJ0ID0gNDgwICsgMTAsCisJLnZzeW5jX2VuZCA9IDQ4MCArIDEwICsgMiwKKwkudnRvdGFsID0gNDgwICsgMTAgKyAyICsgMzMsCisJLnZyZWZyZXNoID0gNjAsCisJLmZsYWdzID0gRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFuZWxfZGVzYyBlZHRfZXRtMDcwMGcwZGg2ID0geworCS5tb2RlcyA9ICZlZHRfZXRtMDcwMGcwZGg2X21vZGUsCisJLm51bV9tb2RlcyA9IDEsCisJLnNpemUgPSB7CisJCS53aWR0aCA9IDE1MiwKKwkJLmhlaWdodCA9IDkxLAorCX0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbGdfbHAxMjlxZV9tb2RlID0gewogCS5jbG9jayA9IDI4NTI1MCwKIAkuaGRpc3BsYXkgPSAyNTYwLApAQCAtMzc3LDEyICs0NTIsMjQgQEAKIAkJLmNvbXBhdGlibGUgPSAiYXVvLGIxMDFhdzAzIiwKIAkJLmRhdGEgPSAmYXVvX2IxMDFhdzAzLAogCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAiYXVvLGIxMzN4dG4wMSIsCisJCS5kYXRhID0gJmF1b19iMTMzeHRuMDEsCisJfSwgewogCQkuY29tcGF0aWJsZSA9ICJjaHVuZ2h3YSxjbGFhMTAxd2EwMWEiLAogCQkuZGF0YSA9ICZjaHVuZ2h3YV9jbGFhMTAxd2EwMWEKIAl9LCB7CiAJCS5jb21wYXRpYmxlID0gImNodW5naHdhLGNsYWExMDF3YjAxIiwKIAkJLmRhdGEgPSAmY2h1bmdod2FfY2xhYTEwMXdiMDEKIAl9LCB7CisJCS5jb21wYXRpYmxlID0gImVkdCxldDA1NzA5MGRodSIsCisJCS5kYXRhID0gJmVkdF9ldDA1NzA5MGRodSwKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gImVkdCxldDA3MDA4MGRoNiIsCisJCS5kYXRhID0gJmVkdF9ldG0wNzAwZzBkaDYsCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJlZHQsZXRtMDcwMGcwZGg2IiwKKwkJLmRhdGEgPSAmZWR0X2V0bTA3MDBnMGRoNiwKKwl9LCB7CiAJCS5jb21wYXRpYmxlID0gImxnLGxwMTI5cWUiLAogCQkuZGF0YSA9ICZsZ19scDEyOXFlLAogCX0sIHsKQEAgLTQxMiw2ICs0OTksMTEgQEAKIAlyZXR1cm4gcGFuZWxfc2ltcGxlX3JlbW92ZSgmcGRldi0+ZGV2KTsKIH0KIAorc3RhdGljIHZvaWQgcGFuZWxfc2ltcGxlX3BsYXRmb3JtX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcGFuZWxfc2ltcGxlX3NodXRkb3duKCZwZGV2LT5kZXYpOworfQorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYW5lbF9zaW1wbGVfcGxhdGZvcm1fZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInBhbmVsLXNpbXBsZSIsCkBAIC00MjAsNiArNTEyLDcgQEAKIAl9LAogCS5wcm9iZSA9IHBhbmVsX3NpbXBsZV9wbGF0Zm9ybV9wcm9iZSwKIAkucmVtb3ZlID0gcGFuZWxfc2ltcGxlX3BsYXRmb3JtX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBwYW5lbF9zaW1wbGVfcGxhdGZvcm1fc2h1dGRvd24sCiB9OwogCiBzdHJ1Y3QgcGFuZWxfZGVzY19kc2kgewpAQCAtNTYxLDYgKzY1NCwxMSBAQAogCXJldHVybiBwYW5lbF9zaW1wbGVfcmVtb3ZlKCZkc2ktPmRldik7CiB9CiAKK3N0YXRpYyB2b2lkIHBhbmVsX3NpbXBsZV9kc2lfc2h1dGRvd24oc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQoreworCXBhbmVsX3NpbXBsZV9zaHV0ZG93bigmZHNpLT5kZXYpOworfQorCiBzdGF0aWMgc3RydWN0IG1pcGlfZHNpX2RyaXZlciBwYW5lbF9zaW1wbGVfZHNpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJwYW5lbC1zaW1wbGUtZHNpIiwKQEAgLTU2OSw2ICs2NjcsNyBAQAogCX0sCiAJLnByb2JlID0gcGFuZWxfc2ltcGxlX2RzaV9wcm9iZSwKIAkucmVtb3ZlID0gcGFuZWxfc2ltcGxlX2RzaV9yZW1vdmUsCisJLnNodXRkb3duID0gcGFuZWxfc2ltcGxlX2RzaV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBhbmVsX3NpbXBsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9kaXNwbGF5LmMKaW5kZXggNDFiZGQxNy4uNWQ3ZWEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2Rpc3BsYXkuYwpAQCAtNTc0LDYgKzU3NCwxMCBAQAogCQkJICAgYm8tPnN1cmYuaGVpZ2h0LCBiby0+c3VyZi5zdHJpZGUsIGJvLT5zdXJmLmZvcm1hdCk7CiAJCXF4bF9pb19jcmVhdGVfcHJpbWFyeShxZGV2LCBiYXNlX29mZnNldCwgYm8pOwogCQliby0+aXNfcHJpbWFyeSA9IHRydWU7CisJfQorCisJaWYgKGJvLT5pc19wcmltYXJ5KSB7CisJCURSTV9ERUJVR19LTVMoInNldHRpbmcgc3VyZmFjZV9pZCB0byAwIGZvciBwcmltYXJ5IHN1cmZhY2UgJWQgb24gY3J0YyAlZFxuIiwgYm8tPnN1cmZhY2VfaWQsIHFjcnRjLT5pbmRleCk7CiAJCXN1cmZfaWQgPSAwOwogCX0gZWxzZSB7CiAJCXN1cmZfaWQgPSBiby0+c3VyZmFjZV9pZDsKQEAgLTg0MSw3ICs4NDUsNyBAQAogCS5zYXZlID0gcXhsX2Nvbm5fc2F2ZSwKIAkucmVzdG9yZSA9IHF4bF9jb25uX3Jlc3RvcmUsCiAJLmRldGVjdCA9IHF4bF9jb25uX2RldGVjdCwKLQkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlc19ub21lcmdlLAogCS5zZXRfcHJvcGVydHkgPSBxeGxfY29ubl9zZXRfcHJvcGVydHksCiAJLmRlc3Ryb3kgPSBxeGxfY29ubl9kZXN0cm95LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZHJ2LmMKaW5kZXggZmVlODc0OC4uNmU5MzY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZHJ2LmMKQEAgLTIxNCw3ICsyMTQsNiBAQAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIHF4bF9kcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9HRU0gfCBEUklWRVJfTU9ERVNFVCB8CiAJCQkgICBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCwKLQkuZGV2X3ByaXZfc2l6ZSA9IDAsCiAJLmxvYWQgPSBxeGxfZHJpdmVyX2xvYWQsCiAJLnVubG9hZCA9IHF4bF9kcml2ZXJfdW5sb2FkLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9pb2N0bC5jIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaW9jdGwuYwppbmRleCAwYmI4NmU2ZC4uYjExMDg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaW9jdGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9pb2N0bC5jCkBAIC00NTEsNCArNDUxLDQgQEAKIAkJCSAgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKIH07CiAKLWludCBxeGxfbWF4X2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKHF4bF9pb2N0bHMpOworaW50IHF4bF9tYXhfaW9jdGxzID0gQVJSQVlfU0laRShxeGxfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaXJxLmMKaW5kZXggMjhmODRiNC4uMzRkNmE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfaXJxLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAlhdG9taWNfc2V0KCZxZGV2LT5pcnFfcmVjZWl2ZWRfY3Vyc29yLCAwKTsKIAlhdG9taWNfc2V0KCZxZGV2LT5pcnFfcmVjZWl2ZWRfaW9fY21kLCAwKTsKIAlxZGV2LT5pcnFfcmVjZWl2ZWRfZXJyb3IgPSAwOwotCXJldCA9IGRybV9pcnFfaW5zdGFsbChxZGV2LT5kZGV2KTsKKwlyZXQgPSBkcm1faXJxX2luc3RhbGwocWRldi0+ZGRldiwgcWRldi0+ZGRldi0+cGRldi0+aXJxKTsKIAlxZGV2LT5yYW1faGVhZGVyLT5pbnRfbWFzayA9IFFYTF9JTlRFUlJVUFRfTUFTSzsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIGluc3RhbGxpbmcgaXJxOiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfdHRtLmMKaW5kZXggZDUyYzI3NS4uNzFhMWJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfdHRtLmMKQEAgLTEwOSwxMyArMTA5LDExIEBACiBzdGF0aWMgaW50IHF4bF90dG1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewogCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87Ci0Jc3RydWN0IHF4bF9kZXZpY2UgKnFkZXY7CiAJaW50IHI7CiAKIAlibyA9IChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKil2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAlpZiAoYm8gPT0gTlVMTCkKIAkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKLQlxZGV2ID0gcXhsX2dldF9xZGV2KGJvLT5iZGV2KTsKIAlyID0gdHRtX3ZtX29wcy0+ZmF1bHQodm1hLCB2bWYpOwogCXJldHVybiByOwogfQpAQCAtMTYyLDEwICsxNjAsNiBAQAogc3RhdGljIGludCBxeGxfaW5pdF9tZW1fdHlwZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdWludDMyX3QgdHlwZSwKIAkJCSAgICAgc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCiB7Ci0Jc3RydWN0IHF4bF9kZXZpY2UgKnFkZXY7Ci0KLQlxZGV2ID0gcXhsX2dldF9xZGV2KGJkZXYpOwotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBUVE1fUExfU1lTVEVNOgogCQkvKiBTeXN0ZW0gbWVtb3J5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lvYzMyLmMKaW5kZXggYjBkMGZkMy4uNjYzZjM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfaW9jMzIuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKIAkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOwogCi0JaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKHIxMjhfY29tcGF0X2lvY3RscykpCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIEFSUkFZX1NJWkUocjEyOF9jb21wYXRfaW9jdGxzKSkKIAkJZm4gPSByMTI4X2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKIAogCWlmIChmbiAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9zdGF0ZS5jCmluZGV4IGU4MDZkYWMuLjU3NWU5ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X3N0YXRlLmMKQEAgLTE1OTQsNyArMTU5NCw3IEBACiAKIAlzd2l0Y2ggKHBhcmFtLT5wYXJhbSkgewogCWNhc2UgUjEyOF9QQVJBTV9JUlFfTlI6Ci0JCXZhbHVlID0gZHJtX2Rldl90b19pcnEoZGV2KTsKKwkJdmFsdWUgPSBkZXYtPnBkZXYtPmlycTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjQxLDQgKzE2NDEsNCBAQAogCURSTV9JT0NUTF9ERUZfRFJWKFIxMjhfR0VUUEFSQU0sIHIxMjhfZ2V0cGFyYW0sIERSTV9BVVRIKSwKIH07CiAKLWludCByMTI4X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHIxMjhfaW9jdGxzKTsKK2ludCByMTI4X21heF9pb2N0bCA9IEFSUkFZX1NJWkUocjEyOF9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKaW5kZXggMDk0MzM1My4uZGJjYmZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCkBAIC03Miw3ICs3Miw3IEBACiAJcmFkZW9uX2NzLm8gcmFkZW9uX2Jpb3MubyByYWRlb25fYmVuY2htYXJrLm8gcjEwMC5vIHIzMDAubyByNDIwLm8gXAogCXJzNDAwLm8gcnM2MDAubyByczY5MC5vIHJ2NTE1Lm8gcjUyMC5vIHI2MDAubyBydjc3MC5vIHJhZGVvbl90ZXN0Lm8gXAogCXIyMDAubyByYWRlb25fbGVnYWN5X3R2Lm8gcjYwMF9jcy5vIHI2MDBfYmxpdF9zaGFkZXJzLm8gXAotCXJhZGVvbl9wbS5vIGF0b21iaW9zX2RwLm8gcjYwMF9hdWRpby5vIHI2MDBfaGRtaS5vIFwKKwlyYWRlb25fcG0ubyBhdG9tYmlvc19kcC5vIHI2MDBfYXVkaW8ubyByNjAwX2hkbWkubyBkY2UzXzFfYWZtdC5vIFwKIAlldmVyZ3JlZW4ubyBldmVyZ3JlZW5fY3MubyBldmVyZ3JlZW5fYmxpdF9zaGFkZXJzLm8gXAogCWV2ZXJncmVlbl9oZG1pLm8gcmFkZW9uX3RyYWNlX3BvaW50cy5vIG5pLm8gY2F5bWFuX2JsaXRfc2hhZGVycy5vIFwKIAlhdG9tYmlvc19lbmNvZGVycy5vIHJhZGVvbl9zZW1hcGhvcmUubyByYWRlb25fc2EubyBhdG9tYmlvc19pMmMubyBzaS5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggZTkxMTg5OC4uMjZjMTJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTU1Nyw2ICs1NTcsNyBAQAogCXUzMiBhZGp1c3RlZF9jbG9jayA9IG1vZGUtPmNsb2NrOwogCWludCBlbmNvZGVyX21vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwogCXUzMiBkcF9jbG9jayA9IG1vZGUtPmNsb2NrOworCXUzMiBjbG9jayA9IG1vZGUtPmNsb2NrOwogCWludCBicGMgPSByYWRlb25fY3J0Yy0+YnBjOwogCWJvb2wgaXNfZHVhbGxpbmsgPSByYWRlb25fZGlnX21vbml0b3JfaXNfZHVhbGxpbmsoZW5jb2RlciwgbW9kZS0+Y2xvY2spOwogCkBAIC02MzIsNiArNjMzLDI0IEBACiAJCQlyYWRlb25fY3J0Yy0+cGxsX2ZsYWdzIHw9IFJBREVPTl9QTExfVVNFX1JFRl9ESVY7CiAJfQogCisJLyogYWRqdXN0IHBsbCBmb3IgZGVlcCBjb2xvciBtb2RlcyAqLworCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkgeworCQlzd2l0Y2ggKGJwYykgeworCQljYXNlIDg6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWNsb2NrID0gKGNsb2NrICogNSkgLyA0OworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQljbG9jayA9IChjbG9jayAqIDMpIC8gMjsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJY2xvY2sgPSBjbG9jayAqIDI7CisJCQlicmVhazsKKwkJfQorCX0KKwogCS8qIERDRTMrIGhhcyBhbiBBZGp1c3REaXNwbGF5UGxsIHRoYXQgd2lsbCBhZGp1c3QgdGhlIHBpeGVsIGNsb2NrCiAJICogYWNjb3JkaW5nbHkgYmFzZWQgb24gdGhlIGVuY29kZXIvdHJhbnNtaXR0ZXIgdG8gd29yayBhcm91bmQKIAkgKiBzcGVjaWFsIGh3IHJlcXVpcmVtZW50cy4KQEAgLTY1Myw3ICs2NzIsNyBAQAogCQkJc3dpdGNoIChjcmV2KSB7CiAJCQljYXNlIDE6CiAJCQljYXNlIDI6Ci0JCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihtb2RlLT5jbG9jayAvIDEwKTsKKwkJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KGNsb2NrIC8gMTApOwogCQkJCWFyZ3MudjEudWNUcmFuc21pdHRlcklEID0gcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQ7CiAJCQkJYXJncy52MS51Y0VuY29kZU1vZGUgPSBlbmNvZGVyX21vZGU7CiAJCQkJaWYgKHJhZGVvbl9jcnRjLT5zc19lbmFibGVkICYmIHJhZGVvbl9jcnRjLT5zcy5wZXJjZW50YWdlKQpAQCAtNjY1LDcgKzY4NCw3IEBACiAJCQkJYWRqdXN0ZWRfY2xvY2sgPSBsZTE2X3RvX2NwdShhcmdzLnYxLnVzUGl4ZWxDbG9jaykgKiAxMDsKIAkJCQlicmVhazsKIAkJCWNhc2UgMzoKLQkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihtb2RlLT5jbG9jayAvIDEwKTsKKwkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihjbG9jayAvIDEwKTsKIAkJCQlhcmdzLnYzLnNJbnB1dC51Y1RyYW5zbWl0dGVySUQgPSByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZDsKIAkJCQlhcmdzLnYzLnNJbnB1dC51Y0VuY29kZU1vZGUgPSBlbmNvZGVyX21vZGU7CiAJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnID0gMDsKQEAgLTY3OSwxMCArNjk4LDYgQEAKIAkJCQkJYXJncy52My5zSW5wdXQudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7CiAJCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKIAkJCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCQkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKLQkJCQkJCS8qIGRlZXAgY29sb3Igc3VwcG9ydCAqLwotCQkJCQkJYXJncy52My5zSW5wdXQudXNQaXhlbENsb2NrID0KLQkJCQkJCQljcHVfdG9fbGUxNigobW9kZS0+Y2xvY2sgKiBicGMgLyA4KSAvIDEwKTsKIAkJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKIAkJCQkJCWFyZ3MudjMuc0lucHV0LnVjRGlzcFBsbENvbmZpZyB8PQogCQkJCQkJCURJU1BQTExfQ09ORklHX0NPSEVSRU5UX01PREU7CkBAIC04NjIsMTQgKzg3NywyMSBAQAogCQkJYXJncy52NS51Y01pc2NJbmZvID0gMDsgLyogSERNSSBkZXB0aCwgZXRjLiAqLwogCQkJaWYgKHNzX2VuYWJsZWQgJiYgKHNzLT50eXBlICYgQVRPTV9FWFRFUk5BTF9TU19NQVNLKSkKIAkJCQlhcmdzLnY1LnVjTWlzY0luZm8gfD0gUElYRUxfQ0xPQ0tfVjVfTUlTQ19SRUZfRElWX1NSQzsKLQkJCXN3aXRjaCAoYnBjKSB7Ci0JCQljYXNlIDg6Ci0JCQlkZWZhdWx0OgotCQkJCWFyZ3MudjUudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNV9NSVNDX0hETUlfMjRCUFA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwOgotCQkJCWFyZ3MudjUudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNV9NSVNDX0hETUlfMzBCUFA7Ci0JCQkJYnJlYWs7CisJCQlpZiAoZW5jb2Rlcl9tb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0hETUkpIHsKKwkJCQlzd2l0Y2ggKGJwYykgeworCQkJCWNhc2UgODoKKwkJCQlkZWZhdWx0OgorCQkJCQlhcmdzLnY1LnVjTWlzY0luZm8gfD0gUElYRUxfQ0xPQ0tfVjVfTUlTQ19IRE1JXzI0QlBQOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEwOgorCQkJCQkvKiB5ZXMgdGhpcyBpcyBjb3JyZWN0LCB0aGUgYXRvbSBkZWZpbmUgaXMgd3JvbmcgKi8KKwkJCQkJYXJncy52NS51Y01pc2NJbmZvIHw9IFBJWEVMX0NMT0NLX1Y1X01JU0NfSERNSV8zMkJQUDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxMjoKKwkJCQkJLyogeWVzIHRoaXMgaXMgY29ycmVjdCwgdGhlIGF0b20gZGVmaW5lIGlzIHdyb25nICovCisJCQkJCWFyZ3MudjUudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNV9NSVNDX0hETUlfMzBCUFA7CisJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KIAkJCWFyZ3MudjUudWNUcmFuc21pdHRlcklEID0gZW5jb2Rlcl9pZDsKIAkJCWFyZ3MudjUudWNFbmNvZGVyTW9kZSA9IGVuY29kZXJfbW9kZTsKQEAgLTg4NCwyMCArOTA2LDIyIEBACiAJCQlhcmdzLnY2LnVjTWlzY0luZm8gPSAwOyAvKiBIRE1JIGRlcHRoLCBldGMuICovCiAJCQlpZiAoc3NfZW5hYmxlZCAmJiAoc3MtPnR5cGUgJiBBVE9NX0VYVEVSTkFMX1NTX01BU0spKQogCQkJCWFyZ3MudjYudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNl9NSVNDX1JFRl9ESVZfU1JDOwotCQkJc3dpdGNoIChicGMpIHsKLQkJCWNhc2UgODoKLQkJCWRlZmF1bHQ6Ci0JCQkJYXJncy52Ni51Y01pc2NJbmZvIHw9IFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV8yNEJQUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTA6Ci0JCQkJYXJncy52Ni51Y01pc2NJbmZvIHw9IFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV8zMEJQUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTI6Ci0JCQkJYXJncy52Ni51Y01pc2NJbmZvIHw9IFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV8zNkJQUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJYXJncy52Ni51Y01pc2NJbmZvIHw9IFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV80OEJQUDsKLQkJCQlicmVhazsKKwkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkgeworCQkJCXN3aXRjaCAoYnBjKSB7CisJCQkJY2FzZSA4OgorCQkJCWRlZmF1bHQ6CisJCQkJCWFyZ3MudjYudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfMjRCUFA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTA6CisJCQkJCWFyZ3MudjYudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfMzBCUFBfVjY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTI6CisJCQkJCWFyZ3MudjYudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfMzZCUFBfVjY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCWFyZ3MudjYudWNNaXNjSW5mbyB8PSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfNDhCUFA7CisJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KIAkJCWFyZ3MudjYudWNUcmFuc21pdHRlcklEID0gZW5jb2Rlcl9pZDsKIAkJCWFyZ3MudjYudWNFbmNvZGVyTW9kZSA9IGVuY29kZXJfbW9kZTsKQEAgLTkzOCw2ICs5NjIsOSBAQAogCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9CiAJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKIAkJaW50IGRwX2Nsb2NrOworCisJCS8qIEFzc2lnbiBtb2RlIGNsb2NrIGZvciBoZG1pIGRlZXAgY29sb3IgbWF4IGNsb2NrIGxpbWl0IGNoZWNrICovCisJCXJhZGVvbl9jb25uZWN0b3ItPnBpeGVsY2xvY2tfZm9yX21vZGVzZXQgPSBtb2RlLT5jbG9jazsKIAkJcmFkZW9uX2NydGMtPmJwYyA9IHJhZGVvbl9nZXRfbW9uaXRvcl9icGMoY29ubmVjdG9yKTsKIAogCQlzd2l0Y2ggKGVuY29kZXJfbW9kZSkgewpAQCAtMTAxOSwxMCArMTA0NiwxNyBAQAogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPQogCQl0b19yYWRlb25fZW5jb2RlcihyYWRlb25fY3J0Yy0+ZW5jb2Rlcik7CiAJdTMyIHBsbF9jbG9jayA9IG1vZGUtPmNsb2NrOworCXUzMiBjbG9jayA9IG1vZGUtPmNsb2NrOwogCXUzMiByZWZfZGl2ID0gMCwgZmJfZGl2ID0gMCwgZnJhY19mYl9kaXYgPSAwLCBwb3N0X2RpdiA9IDA7CiAJc3RydWN0IHJhZGVvbl9wbGwgKnBsbDsKIAlpbnQgZW5jb2Rlcl9tb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShyYWRlb25fY3J0Yy0+ZW5jb2Rlcik7CiAKKwkvKiBwYXNzIHRoZSBhY3R1YWwgY2xvY2sgdG8gYXRvbWJpb3NfY3J0Y19wcm9ncmFtX3BsbCBmb3IgRENFNSw2IGZvciBIRE1JICovCisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSAmJiAhQVNJQ19JU19EQ0U4KHJkZXYpICYmCisJICAgIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkgJiYKKwkgICAgKHJhZGVvbl9jcnRjLT5icGMgPiA4KSkKKwkJY2xvY2sgPSByYWRlb25fY3J0Yy0+YWRqdXN0ZWRfY2xvY2s7CisKIAlzd2l0Y2ggKHJhZGVvbl9jcnRjLT5wbGxfaWQpIHsKIAljYXNlIEFUT01fUFBMTDE6CiAJCXBsbCA9ICZyZGV2LT5jbG9jay5wMXBsbDsKQEAgLTEwNTcsNyArMTA5MSw3IEBACiAJCQkJIHJhZGVvbl9jcnRjLT5jcnRjX2lkLCAmcmFkZW9uX2NydGMtPnNzKTsKIAogCWF0b21iaW9zX2NydGNfcHJvZ3JhbV9wbGwoY3J0YywgcmFkZW9uX2NydGMtPmNydGNfaWQsIHJhZGVvbl9jcnRjLT5wbGxfaWQsCi0JCQkJICBlbmNvZGVyX21vZGUsIHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkLCBtb2RlLT5jbG9jaywKKwkJCQkgIGVuY29kZXJfbW9kZSwgcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQsIGNsb2NrLAogCQkJCSAgcmVmX2RpdiwgZmJfZGl2LCBmcmFjX2ZiX2RpdiwgcG9zdF9kaXYsCiAJCQkJICByYWRlb25fY3J0Yy0+YnBjLCByYWRlb25fY3J0Yy0+c3NfZW5hYmxlZCwgJnJhZGVvbl9jcnRjLT5zcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYwppbmRleCA1NGU0ZjUyLi5jNWIxZjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCkBAIC05NSw5ICs5NSwxMiBAQAogCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFByb2Nlc3NBdXhDaGFubmVsVHJhbnNhY3Rpb24pOwogCXVuc2lnbmVkIGNoYXIgKmJhc2U7CiAJaW50IHJlY3ZfYnl0ZXM7CisJaW50IHIgPSAwOwogCiAJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwogCisJbXV0ZXhfbG9jaygmY2hhbi0+bXV0ZXgpOworCiAJYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQtPnNjcmF0Y2ggKyAxKTsKIAogCXJhZGVvbl9hdG9tX2NvcHlfc3dhcChiYXNlLCBzZW5kLCBzZW5kX2J5dGVzLCB0cnVlKTsKQEAgLTExNywxOSArMTIwLDIyIEBACiAJLyogdGltZW91dCAqLwogCWlmIChhcmdzLnYxLnVjUmVwbHlTdGF0dXMgPT0gMSkgewogCQlEUk1fREVCVUdfS01TKCJkcF9hdXhfY2ggdGltZW91dFxuIik7Ci0JCXJldHVybiAtRVRJTUVET1VUOworCQlyID0gLUVUSU1FRE9VVDsKKwkJZ290byBkb25lOwogCX0KIAogCS8qIGZsYWdzIG5vdCB6ZXJvICovCiAJaWYgKGFyZ3MudjEudWNSZXBseVN0YXR1cyA9PSAyKSB7CiAJCURSTV9ERUJVR19LTVMoImRwX2F1eF9jaCBmbGFncyBub3QgemVyb1xuIik7Ci0JCXJldHVybiAtRUJVU1k7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAkvKiBlcnJvciAqLwogCWlmIChhcmdzLnYxLnVjUmVwbHlTdGF0dXMgPT0gMykgewogCQlEUk1fREVCVUdfS01TKCJkcF9hdXhfY2ggZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJciA9IC1FSU87CisJCWdvdG8gZG9uZTsKIAl9CiAKIAlyZWN2X2J5dGVzID0gYXJncy52MS51Y0RhdGFPdXRMZW47CkBAIC0xMzksNyArMTQ1LDExIEBACiAJaWYgKHJlY3YgJiYgcmVjdl9zaXplKQogCQlyYWRlb25fYXRvbV9jb3B5X3N3YXAocmVjdiwgYmFzZSArIDE2LCByZWN2X2J5dGVzLCBmYWxzZSk7CiAKLQlyZXR1cm4gcmVjdl9ieXRlczsKKwlyID0gcmVjdl9ieXRlczsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZjaGFuLT5tdXRleCk7CisKKwlyZXR1cm4gcjsKIH0KIAogI2RlZmluZSBCQVJFX0FERFJFU1NfU0laRSAzCkBAIC0yMTIsMTEgKzIyMiwxMiBAQAogCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPnJlYy5ocGQgPSByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkOwogCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmF1eC5kZXYgPSByYWRlb25fY29ubmVjdG9yLT5iYXNlLmtkZXY7CiAJcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cy0+YXV4LnRyYW5zZmVyID0gcmFkZW9uX2RwX2F1eF90cmFuc2ZlcjsKLQlyZXQgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyX2kyY19idXMoJnJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmF1eCk7CisKKwlyZXQgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5hdXgpOwogCWlmICghcmV0KQogCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5oYXNfYXV4ID0gdHJ1ZTsKIAotCVdBUk4ocmV0LCAiZHJtX2RwX2F1eF9yZWdpc3Rlcl9pMmNfYnVzKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJldCk7CisJV0FSTihyZXQsICJkcm1fZHBfYXV4X3JlZ2lzdGVyKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJldCk7CiB9CiAKIC8qKioqKiBnZW5lcmFsIERQIHV0aWxpdHkgZnVuY3Rpb25zICoqKioqLwpAQCAtMjgxLDYgKzI5MiwxOSBAQAogCiAvKioqKiogcmFkZW9uIHNwZWNpZmljIERQIGZ1bmN0aW9ucyAqKioqKi8KIAorc3RhdGljIGludCByYWRlb25fZHBfZ2V0X21heF9saW5rX3JhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgICAgdTggZHBjZFtEUF9EUENEX1NJWkVdKQoreworCWludCBtYXhfbGlua19yYXRlOworCisJaWYgKHJhZGVvbl9jb25uZWN0b3JfaXNfZHAxMl9jYXBhYmxlKGNvbm5lY3RvcikpCisJCW1heF9saW5rX3JhdGUgPSBtaW4oZHJtX2RwX21heF9saW5rX3JhdGUoZHBjZCksIDU0MDAwMCk7CisJZWxzZQorCQltYXhfbGlua19yYXRlID0gbWluKGRybV9kcF9tYXhfbGlua19yYXRlKGRwY2QpLCAyNzAwMDApOworCisJcmV0dXJuIG1heF9saW5rX3JhdGU7Cit9CisKIC8qIEZpcnN0IGdldCB0aGUgbWluIGxhbmUjIHdoZW4gbG93IHJhdGUgaXMgdXNlZCBhY2NvcmRpbmcgdG8gcGl4ZWwgY2xvY2sKICAqIChwcmVmZXIgbG93IHJhdGUpLCBzZWNvbmQgY2hlY2sgbWF4IGxhbmUjIHN1cHBvcnRlZCBieSBEUCBwYW5lbCwKICAqIGlmIHRoZSBtYXggbGFuZSMgPCBsb3cgcmF0ZSBsYW5lIyB0aGVuIHVzZSBtYXggbGFuZSMgaW5zdGVhZC4KQEAgLTI5MCw3ICszMTQsNyBAQAogCQkJCQlpbnQgcGl4X2Nsb2NrKQogewogCWludCBicHAgPSBjb252ZXJ0X2JwY190b19icHAocmFkZW9uX2dldF9tb25pdG9yX2JwYyhjb25uZWN0b3IpKTsKLQlpbnQgbWF4X2xpbmtfcmF0ZSA9IGRybV9kcF9tYXhfbGlua19yYXRlKGRwY2QpOworCWludCBtYXhfbGlua19yYXRlID0gcmFkZW9uX2RwX2dldF9tYXhfbGlua19yYXRlKGNvbm5lY3RvciwgZHBjZCk7CiAJaW50IG1heF9sYW5lX251bSA9IGRybV9kcF9tYXhfbGFuZV9jb3VudChkcGNkKTsKIAlpbnQgbGFuZV9udW07CiAJaW50IG1heF9kcF9waXhfY2xvY2s7CkBAIC0zMjgsNyArMzUyLDcgQEAKIAkJCXJldHVybiA1NDAwMDA7CiAJfQogCi0JcmV0dXJuIGRybV9kcF9tYXhfbGlua19yYXRlKGRwY2QpOworCXJldHVybiByYWRlb25fZHBfZ2V0X21heF9saW5rX3JhdGUoY29ubmVjdG9yLCBkcGNkKTsKIH0KIAogc3RhdGljIHU4IHJhZGVvbl9kcF9lbmNvZGVyX3NlcnZpY2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2VuY29kZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2VuY29kZXJzLmMKaW5kZXggZTZlYjUwOS4uMmIyOTA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZW5jb2RlcnMuYwpAQCAtMTg4NCw4ICsxODg0LDExIEBACiAJCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfQ1JUOwogCQkJCWVsc2UKIAkJCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwotCQkJfSBlbHNlCisJCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfTFZEUzsKKwkJCX0gZWxzZSB7CiAJCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOworCQkJfQogCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewogCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CiAJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2kyYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19pMmMuYwppbmRleCBiNTE2MmMzLi45YzU3MGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfaTJjLmMKQEAgLTQzLDE1ICs0MywxOSBAQAogCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFByb2Nlc3NJMmNDaGFubmVsVHJhbnNhY3Rpb24pOwogCXVuc2lnbmVkIGNoYXIgKmJhc2U7CiAJdTE2IG91dCA9IGNwdV90b19sZTE2KDApOworCWludCByID0gMDsKIAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAorCW11dGV4X2xvY2soJmNoYW4tPm11dGV4KTsKKwogCWJhc2UgPSAodW5zaWduZWQgY2hhciAqKXJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQtPnNjcmF0Y2g7CiAKIAlpZiAoZmxhZ3MgJiBIV19JMkNfV1JJVEUpIHsKIAkJaWYgKG51bSA+IEFUT01fTUFYX0hXX0kyQ19XUklURSkgewogCQkJRFJNX0VSUk9SKCJodyBpMmM6IHRyaWVkIHRvIHdyaXRlIHRvbyBtYW55IGJ5dGVzICglZCB2cyAzKVxuIiwgbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJciA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJaWYgKGJ1ZiA9PSBOVUxMKQogCQkJYXJncy51Y1JlZ0luZGV4ID0gMDsKQEAgLTY1LDcgKzY5LDggQEAKIAl9IGVsc2UgewogCQlpZiAobnVtID4gQVRPTV9NQVhfSFdfSTJDX1JFQUQpIHsKIAkJCURSTV9FUlJPUigiaHcgaTJjOiB0cmllZCB0byByZWFkIHRvbyBtYW55IGJ5dGVzICglZCB2cyAyNTUpXG4iLCBudW0pOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCQlhcmdzLnVjUmVnSW5kZXggPSAwOwogCQlhcmdzLmxwSTJDRGF0YU91dCA9IDA7CkBAIC04MiwxMyArODcsMTcgQEAKIAkvKiBlcnJvciAqLwogCWlmIChhcmdzLnVjU3RhdHVzICE9IEhXX0FTU0lTVEVEX0kyQ19TVEFUVVNfU1VDQ0VTUykgewogCQlEUk1fREVCVUdfS01TKCJod19pMmMgZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJciA9IC1FSU87CisJCWdvdG8gZG9uZTsKIAl9CiAKIAlpZiAoIShmbGFncyAmIEhXX0kyQ19XUklURSkpCiAJCXJhZGVvbl9hdG9tX2NvcHlfc3dhcChidWYsIGJhc2UsIG51bSwgZmFsc2UpOwogCi0JcmV0dXJuIDA7Citkb25lOgorCW11dGV4X3VubG9jaygmY2hhbi0+bXV0ZXgpOworCisJcmV0dXJuIHI7CiB9CiAKIGludCByYWRlb25fYXRvbV9od19pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWsuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrLmMKaW5kZXggZDJmZDk4OS4uZGNkNDUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWsuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npay5jCkBAIC04MCw2ICs4MCw3IEBACiBleHRlcm4gdm9pZCBzaV92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpOwogZXh0ZXJuIHZvaWQgc2lfcmxjX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHNpX2luaXRfdXZkX2ludGVybmFsX2NnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3N0YXRpYyB1MzIgY2lrX2dldF9jdV9hY3RpdmVfYml0bWFwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgc2UsIHUzMiBzaCk7CiBleHRlcm4gaW50IGNpa19zZG1hX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBjaWtfc2RtYV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGJvb2wgZW5hYmxlKTsKIGV4dGVybiB2b2lkIGNpa19zZG1hX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMzI1Nyw3ICszMjU4LDcgQEAKIAl1MzIgbWNfc2hhcmVkX2NobWFwLCBtY19hcmJfcmFtY2ZnOwogCXUzMiBoZHBfaG9zdF9wYXRoX2NudGw7CiAJdTMyIHRtcDsKLQlpbnQgaSwgajsKKwlpbnQgaSwgaiwgazsKIAogCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJY2FzZSBDSElQX0JPTkFJUkU6CkBAIC0zNDQ2LDYgKzM0NDcsMTUgQEAKIAkJICAgICByZGV2LT5jb25maWcuY2lrLm1heF9zaF9wZXJfc2UsCiAJCSAgICAgcmRldi0+Y29uZmlnLmNpay5tYXhfYmFja2VuZHNfcGVyX3NlKTsKIAorCWZvciAoaSA9IDA7IGkgPCByZGV2LT5jb25maWcuY2lrLm1heF9zaGFkZXJfZW5naW5lczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCByZGV2LT5jb25maWcuY2lrLm1heF9zaF9wZXJfc2U7IGorKykgeworCQkJZm9yIChrID0gMDsgayA8IHJkZXYtPmNvbmZpZy5jaWsubWF4X2N1X3Blcl9zaDsgaysrKSB7CisJCQkJcmRldi0+Y29uZmlnLmNpay5hY3RpdmVfY3VzICs9CisJCQkJCWh3ZWlnaHQzMihjaWtfZ2V0X2N1X2FjdGl2ZV9iaXRtYXAocmRldiwgaSwgaikpOworCQkJfQorCQl9CisJfQorCiAJLyogc2V0IEhXIGRlZmF1bHRzIGZvciAzRCBlbmdpbmUgKi8KIAlXUkVHMzIoQ1BfTUVRX1RIUkVTSE9MRFMsIE1FUTFfU1RBUlQoMHgzMCkgfCBNRVEyX1NUQVJUKDB4NjApKTsKIApAQCAtMzY5OCw3ICszNzA4LDcgQEAKIAl1bnNpZ25lZCBzZWwgPSBlbWl0X3dhaXQgPyBQQUNLRVQzX1NFTV9TRUxfV0FJVCA6IFBBQ0tFVDNfU0VNX1NFTF9TSUdOQUw7CiAKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfTUVNX1NFTUFQSE9SRSwgMSkpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGFkZHIgJiAweGZmZmZmZmZmKTsKKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCBsb3dlcl8zMl9iaXRzKGFkZHIpKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCAodXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmZmZikgfCBzZWwpOwogCiAJcmV0dXJuIHRydWU7CkBAIC0zODE4LDcgKzM4MjgsNyBAQAogCQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX1dSSVRFX0RBVEEsIDMpKTsKIAkJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFdSSVRFX0RBVEFfRFNUX1NFTCgxKSk7CiAJCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCByaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIgJiAweGZmZmZmZmZjKTsKLQkJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMocmluZy0+bmV4dF9ycHRyX2dwdV9hZGRyKSAmIDB4ZmZmZmZmZmYpOworCQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhyaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIpKTsKIAkJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIG5leHRfcnB0cik7CiAJCX0KIApAQCAtNTM5Niw2ICs1NDA2LDcgQEAKIAlXUkVHMzIoTUNfVk1fTVhfTDFfVExCX0NOVEwsCiAJICAgICAgICgweEEgPDwgNykgfAogCSAgICAgICBFTkFCTEVfTDFfVExCIHwKKwkgICAgICAgRU5BQkxFX0wxX0ZSQUdNRU5UX1BST0NFU1NJTkcgfAogCSAgICAgICBTWVNURU1fQUNDRVNTX01PREVfTk9UX0lOX1NZUyB8CiAJICAgICAgIEVOQUJMRV9BRFZBTkNFRF9EUklWRVJfTU9ERUwgfAogCSAgICAgICBTWVNURU1fQVBFUlRVUkVfVU5NQVBQRURfQUNDRVNTX1BBU1NfVEhSVSk7CkBAIC01NDA4LDcgKzU0MTksOCBAQAogCSAgICAgICBDT05URVhUMV9JREVOVElUWV9BQ0NFU1NfTU9ERSgxKSk7CiAJV1JFRzMyKFZNX0wyX0NOVEwyLCBJTlZBTElEQVRFX0FMTF9MMV9UTEJTIHwgSU5WQUxJREFURV9MMl9DQUNIRSk7CiAJV1JFRzMyKFZNX0wyX0NOVEwzLCBMMl9DQUNIRV9CSUdLX0FTU09DSUFUSVZJVFkgfAotCSAgICAgICBMMl9DQUNIRV9CSUdLX0ZSQUdNRU5UX1NJWkUoNikpOworCSAgICAgICBCQU5LX1NFTEVDVCg0KSB8CisJICAgICAgIEwyX0NBQ0hFX0JJR0tfRlJBR01FTlRfU0laRSg0KSk7CiAJLyogc2V0dXAgY29udGV4dDAgKi8KIAlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9TVEFSVF9BRERSLCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTIpOwogCVdSRUczMihWTV9DT05URVhUMF9QQUdFX1RBQkxFX0VORF9BRERSLCByZGV2LT5tYy5ndHRfZW5kID4+IDEyKTsKQEAgLTU0NDQsNiArNTQ1Niw3IEBACiAJICAgICAgICh1MzIpKHJkZXYtPmR1bW15X3BhZ2UuYWRkciA+PiAxMikpOwogCVdSRUczMihWTV9DT05URVhUMV9DTlRMMiwgNCk7CiAJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIEVOQUJMRV9DT05URVhUIHwgUEFHRV9UQUJMRV9ERVBUSCgxKSB8CisJCQkJUEFHRV9UQUJMRV9CTE9DS19TSVpFKHJhZGVvbl92bV9ibG9ja19zaXplIC0gOSkgfAogCQkJCVJBTkdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVCB8CiAJCQkJUkFOR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfREVGQVVMVCB8CiAJCQkJRFVNTVlfUEFHRV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9JTlRFUlJVUFQgfApAQCAtNzQ1MCw3ICs3NDYzLDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzBdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAwKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5jaWsuZGlzcF9pbnQgJj0gfkxCX0QxX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZibGFua1xuIik7CiAJCQkJfQpAQCAtNzQ3Niw3ICs3NDg5LDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzFdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAxKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5jaWsuZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDIgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC03NTAyLDcgKzc1MTUsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbMl0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMik7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDIpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmNpay5kaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDMgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC03NTI4LDcgKzc1NDEsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbM10pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMyk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDMpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmNpay5kaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDQgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC03NTU0LDcgKzc1NjcsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbNF0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgNCk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDQpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmNpay5kaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDUgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC03NTgwLDcgKzc1OTMsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbNV0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgNSk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDUpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmNpay5kaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDYgdmJsYW5rXG4iKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa19zZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa19zZG1hLmMKaW5kZXggNzJlNDY0Yy4uOGU5ZDBmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWtfc2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrX3NkbWEuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCW5leHRfcnB0ciArPSA0OwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9XUklURSwgU0RNQV9XUklURV9TVUJfT1BDT0RFX0xJTkVBUiwgMCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCByaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIgJiAweGZmZmZmZmZjKTsKLQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhyaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIpICYgMHhmZmZmZmZmZik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMocmluZy0+bmV4dF9ycHRyX2dwdV9hZGRyKSk7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDEpOyAvKiBudW1iZXIgb2YgRFdzIHRvIGZvbGxvdyAqLwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBuZXh0X3JwdHIpOwogCX0KQEAgLTE1MSw3ICsxNTEsNyBAQAogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9OT1AsIDAsIDApKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9JTkRJUkVDVF9CVUZGRVIsIDAsIGV4dHJhX2JpdHMpKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBpYi0+Z3B1X2FkZHIgJiAweGZmZmZmZmUwKTsgLyogYmFzZSBtdXN0IGJlIDMyIGJ5dGUgYWxpZ25lZCAqLwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMoaWItPmdwdV9hZGRyKSAmIDB4ZmZmZmZmZmYpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMoaWItPmdwdV9hZGRyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgaWItPmxlbmd0aF9kdyk7CiAKIH0KQEAgLTIwMyw4ICsyMDMsOCBAQAogCiAJLyogd3JpdGUgdGhlIGZlbmNlICovCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfRkVOQ0UsIDAsIDApKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBhZGRyICYgMHhmZmZmZmZmZik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmZmZmZmZmYpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoYWRkcikpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMoYWRkcikpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGZlbmNlLT5zZXEpOwogCS8qIGdlbmVyYXRlIGFuIGludGVycnVwdCAqLwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFNETUFfUEFDS0VUKFNETUFfT1BDT0RFX1RSQVAsIDAsIDApKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfU0VNQVBIT1JFLCAwLCBleHRyYV9iaXRzKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgYWRkciAmIDB4ZmZmZmZmZjgpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmZmZmZmZmKTsKKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKGFkZHIpKTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtNTUxLDEwICs1NTEsMTAgQEAKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfQ09QWSwgU0RNQV9DT1BZX1NVQl9PUENPREVfTElORUFSLCAwKSk7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGN1cl9zaXplX2luX2J5dGVzKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7IC8qIHNyYy9kc3QgZW5kaWFuIHN3YXAgKi8KLQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgc3JjX29mZnNldCAmIDB4ZmZmZmZmZmYpOwotCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKHNyY19vZmZzZXQpICYgMHhmZmZmZmZmZik7Ci0JCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGRzdF9vZmZzZXQgJiAweGZmZmZmZmZmKTsKLQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSAmIDB4ZmZmZmZmZmYpOworCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBsb3dlcl8zMl9iaXRzKHNyY19vZmZzZXQpKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhzcmNfb2Zmc2V0KSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoZHN0X29mZnNldCkpOworCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKGRzdF9vZmZzZXQpKTsKIAkJc3JjX29mZnNldCArPSBjdXJfc2l6ZV9pbl9ieXRlczsKIAkJZHN0X29mZnNldCArPSBjdXJfc2l6ZV9pbl9ieXRlczsKIAl9CkBAIC02MDUsNyArNjA1LDcgQEAKIAl9CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfV1JJVEUsIFNETUFfV1JJVEVfU1VCX09QQ09ERV9MSU5FQVIsIDApKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCByZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIgJiAweGZmZmZmZmZjKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKHJkZXYtPnZyYW1fc2NyYXRjaC5ncHVfYWRkcikgJiAweGZmZmZmZmZmKTsKKwlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKHJkZXYtPnZyYW1fc2NyYXRjaC5ncHVfYWRkcikpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDEpOyAvKiBudW1iZXIgb2YgRFdzIHRvIGZvbGxvdyAqLwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDB4REVBREJFRUYpOwogCXJhZGVvbl9yaW5nX3VubG9ja19jb21taXQocmRldiwgcmluZyk7CkBAIC02NjAsNyArNjYwLDcgQEAKIAogCWliLnB0clswXSA9IFNETUFfUEFDS0VUKFNETUFfT1BDT0RFX1dSSVRFLCBTRE1BX1dSSVRFX1NVQl9PUENPREVfTElORUFSLCAwKTsKIAlpYi5wdHJbMV0gPSByZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIgJiAweGZmZmZmZmZjOwotCWliLnB0clsyXSA9IHVwcGVyXzMyX2JpdHMocmRldi0+dnJhbV9zY3JhdGNoLmdwdV9hZGRyKSAmIDB4ZmZmZmZmZmY7CisJaWIucHRyWzJdID0gdXBwZXJfMzJfYml0cyhyZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIpOwogCWliLnB0clszXSA9IDE7CiAJaWIucHRyWzRdID0gMHhERUFEQkVFRjsKIAlpYi5sZW5ndGhfZHcgPSA1OwpAQCAtNzQyLDcgKzc0MiwyNiBAQAogCiAJdHJhY2VfcmFkZW9uX3ZtX3NldF9wYWdlKHBlLCBhZGRyLCBjb3VudCwgaW5jciwgZmxhZ3MpOwogCi0JaWYgKGZsYWdzICYgUjYwMF9QVEVfU1lTVEVNKSB7CisJaWYgKGZsYWdzID09IFI2MDBfUFRFX0dBUlQpIHsKKwkJdWludDY0X3Qgc3JjID0gcmRldi0+Z2FydC50YWJsZV9hZGRyICsgKGFkZHIgPj4gMTIpICogODsKKwkJd2hpbGUgKGNvdW50KSB7CisJCQl1bnNpZ25lZCBieXRlcyA9IGNvdW50ICogODsKKwkJCWlmIChieXRlcyA+IDB4MUZGRkY4KQorCQkJCWJ5dGVzID0gMHgxRkZGRjg7CisKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IFNETUFfUEFDS0VUKFNETUFfT1BDT0RFX0NPUFksIFNETUFfV1JJVEVfU1VCX09QQ09ERV9MSU5FQVIsIDApOworCQkJaWItPnB0cltpYi0+bGVuZ3RoX2R3KytdID0gYnl0ZXM7CisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSAwOyAvKiBzcmMvZHN0IGVuZGlhbiBzd2FwICovCisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBsb3dlcl8zMl9iaXRzKHNyYyk7CisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSB1cHBlcl8zMl9iaXRzKHNyYyk7CisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBsb3dlcl8zMl9iaXRzKHBlKTsKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IHVwcGVyXzMyX2JpdHMocGUpOworCisJCQlwZSArPSBieXRlczsKKwkJCXNyYyArPSBieXRlczsKKwkJCWNvdW50IC09IGJ5dGVzIC8gODsKKwkJfQorCX0gZWxzZSBpZiAoZmxhZ3MgJiBSNjAwX1BURV9TWVNURU0pIHsKIAkJd2hpbGUgKGNvdW50KSB7CiAJCQluZHcgPSBjb3VudCAqIDI7CiAJCQlpZiAobmR3ID4gMHhGRkZGRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWtkLmgKaW5kZXggZGQ3OTI2My4uYWU4ODY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWtkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWtkLmgKQEAgLTQ4Miw2ICs0ODIsNyBAQAogI2RlZmluZQkJUkVBRF9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUCQkoMSA8PCAxNikKICNkZWZpbmUJCVdSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVAkJKDEgPDwgMTgpCiAjZGVmaW5lCQlXUklURV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUCQkoMSA8PCAxOSkKKyNkZWZpbmUJCVBBR0VfVEFCTEVfQkxPQ0tfU0laRSh4KQkJCSgoKHgpICYgMHhGKSA8PCAyNCkKICNkZWZpbmUgVk1fQ09OVEVYVDFfQ05UTAkJCQkweDE0MTQKICNkZWZpbmUgVk1fQ09OVEVYVDBfQ05UTDIJCQkJMHgxNDMwCiAjZGVmaW5lIFZNX0NPTlRFWFQxX0NOVEwyCQkJCTB4MTQzNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jbGVhcnN0YXRlX2NheW1hbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jbGVhcnN0YXRlX2NheW1hbi5oCmluZGV4IGFhOTA4YzUuLmU0OGExNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2xlYXJzdGF0ZV9jYXltYW4uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NsZWFyc3RhdGVfY2F5bWFuLmgKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAgICAge1NFQ1RfQ09OVEVYVF9kZWZfNSwgMHgwMDAwYTI5ZSwgNSB9LAogICAgIHtTRUNUX0NPTlRFWFRfZGVmXzYsIDB4MDAwMGEyYTUsIDU2IH0sCiAgICAge1NFQ1RfQ09OVEVYVF9kZWZfNywgMHgwMDAwYTJkZSwgMjkwIH0sCi0gICAgeyAwLCAwLCAwIH0KKyAgICB7IE5VTEwsIDAsIDAgfQogfTsKIHN0YXRpYyBjb25zdCB1MzIgU0VDVF9DTEVBUl9kZWZfMVtdID0KIHsKQEAgLTEwNjEsNyArMTA2MSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGNzX2V4dGVudF9kZWYgU0VDVF9DTEVBUl9kZWZzW10gPQogewogICAgIHtTRUNUX0NMRUFSX2RlZl8xLCAweDAwMDBmZmMwLCAzIH0sCi0gICAgeyAwLCAwLCAwIH0KKyAgICB7IE5VTEwsIDAsIDAgfQogfTsKIHN0YXRpYyBjb25zdCB1MzIgU0VDVF9DVFJMQ09OU1RfZGVmXzFbXSA9CiB7CkBAIC0xMDcxLDExICsxMDcxLDExIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGNzX2V4dGVudF9kZWYgU0VDVF9DVFJMQ09OU1RfZGVmc1tdID0KIHsKICAgICB7U0VDVF9DVFJMQ09OU1RfZGVmXzEsIDB4MDAwMGYzZmMsIDIgfSwKLSAgICB7IDAsIDAsIDAgfQorICAgIHsgTlVMTCwgMCwgMCB9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBjc19zZWN0aW9uX2RlZiBjYXltYW5fY3NfZGF0YVtdID0gewogICAgIHsgU0VDVF9DT05URVhUX2RlZnMsIFNFQ1RfQ09OVEVYVCB9LAogICAgIHsgU0VDVF9DTEVBUl9kZWZzLCBTRUNUX0NMRUFSIH0sCiAgICAgeyBTRUNUX0NUUkxDT05TVF9kZWZzLCBTRUNUX0NUUkxDT05TVCB9LAotICAgIHsgMCwgU0VDVF9OT05FIH0KKyAgICB7IE5VTEwsIFNFQ1RfTk9ORSB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jbGVhcnN0YXRlX2NpLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NsZWFyc3RhdGVfY2kuaAppbmRleCBjMzk4MmY5Li5mNTVkMDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NsZWFyc3RhdGVfY2kuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NsZWFyc3RhdGVfY2kuaApAQCAtOTM2LDkgKzkzNiw5IEBACiAgICAge2NpX1NFQ1RfQ09OVEVYVF9kZWZfNSwgMHgwMDAwYTJhMCwgMiB9LAogICAgIHtjaV9TRUNUX0NPTlRFWFRfZGVmXzYsIDB4MDAwMGEyYTMsIDEgfSwKICAgICB7Y2lfU0VDVF9DT05URVhUX2RlZl83LCAweDAwMDBhMmE1LCAyMzMgfSwKLSAgICB7IDAsIDAsIDAgfQorICAgIHsgTlVMTCwgMCwgMCB9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBjc19zZWN0aW9uX2RlZiBjaV9jc19kYXRhW10gPSB7CiAgICAgeyBjaV9TRUNUX0NPTlRFWFRfZGVmcywgU0VDVF9DT05URVhUIH0sCi0gICAgeyAwLCBTRUNUX05PTkUgfQorICAgIHsgTlVMTCwgU0VDVF9OT05FIH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NsZWFyc3RhdGVfc2kuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2xlYXJzdGF0ZV9zaS5oCmluZGV4IGI5OTRjYjIuLjY2ZTM5Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2xlYXJzdGF0ZV9zaS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2xlYXJzdGF0ZV9zaS5oCkBAIC05MzMsOSArOTMzLDkgQEAKICAgICB7c2lfU0VDVF9DT05URVhUX2RlZl81LCAweDAwMDBhMmExLCAxIH0sCiAgICAge3NpX1NFQ1RfQ09OVEVYVF9kZWZfNiwgMHgwMDAwYTJhMywgMSB9LAogICAgIHtzaV9TRUNUX0NPTlRFWFRfZGVmXzcsIDB4MDAwMGEyYTUsIDIzMyB9LAotICAgIHsgMCwgMCwgMCB9CisgICAgeyBOVUxMLCAwLCAwIH0KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNzX3NlY3Rpb25fZGVmIHNpX2NzX2RhdGFbXSA9IHsKICAgICB7IHNpX1NFQ1RfQ09OVEVYVF9kZWZzLCBTRUNUX0NPTlRFWFQgfSwKLSAgICB7IDAsIFNFQ1RfTk9ORSB9CisgICAgeyBOVUxMLCBTRUNUX05PTkUgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZGNlM18xX2FmbXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZGNlM18xX2FmbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwMGUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9kY2UzXzFfYWZtdC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgUmFmYcWCIE1pxYJlY2tpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9oZG1pLmg+CisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlICJyYWRlb24uaCIKKyNpbmNsdWRlICJyYWRlb25fYXNpYy5oIgorI2luY2x1ZGUgInI2MDBkLmgiCisKK3N0YXRpYyB2b2lkIGRjZTNfMl9hZm10X3dyaXRlX3NwZWFrZXJfYWxsb2NhdGlvbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSBOVUxMOworCXUzMiB0bXA7CisJdTggKnNhZGI7CisJaW50IHNhZF9jb3VudDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZW5jb2Rlci0+ZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIpIHsKKwkJCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcmFkZW9uX2Nvbm5lY3RvcikgeworCQlEUk1fRVJST1IoIkNvdWxkbid0IGZpbmQgZW5jb2RlcidzIGNvbm5lY3RvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlzYWRfY291bnQgPSBkcm1fZWRpZF90b19zcGVha2VyX2FsbG9jYXRpb24ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCwgJnNhZGIpOworCWlmIChzYWRfY291bnQgPCAwKSB7CisJCURSTV9FUlJPUigiQ291bGRuJ3QgcmVhZCBTcGVha2VyIEFsbG9jYXRpb24gRGF0YSBCbG9jazogJWRcbiIsIHNhZF9jb3VudCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBwcm9ncmFtIHRoZSBzcGVha2VyIGFsbG9jYXRpb24gKi8KKwl0bXAgPSBSUkVHMzIoQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0NIQU5ORUxfU1BFQUtFUik7CisJdG1wICY9IH4oRFBfQ09OTkVDVElPTiB8IFNQRUFLRVJfQUxMT0NBVElPTl9NQVNLKTsKKwkvKiBzZXQgSERNSSBtb2RlICovCisJdG1wIHw9IEhETUlfQ09OTkVDVElPTjsKKwlpZiAoc2FkX2NvdW50KQorCQl0bXAgfD0gU1BFQUtFUl9BTExPQ0FUSU9OKHNhZGJbMF0pOworCWVsc2UKKwkJdG1wIHw9IFNQRUFLRVJfQUxMT0NBVElPTig1KTsgLyogc3RlcmVvICovCisJV1JFRzMyKEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9DSEFOTkVMX1NQRUFLRVIsIHRtcCk7CisKKwlrZnJlZShzYWRiKTsKK30KKworc3RhdGljIHZvaWQgZGNlM18yX2FmbXRfd3JpdGVfc2FkX3JlZ3Moc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gTlVMTDsKKwlzdHJ1Y3QgY2VhX3NhZCAqc2FkczsKKwlpbnQgaSwgc2FkX2NvdW50OworCisJc3RhdGljIGNvbnN0IHUxNiBlbGRfcmVnX3RvX3R5cGVbXVsyXSA9IHsKKwkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjAsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfUENNIH0sCisJCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1IxLCBIRE1JX0FVRElPX0NPRElOR19UWVBFX0FDMyB9LAorCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SMiwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9NUEVHMSB9LAorCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SMywgSERNSV9BVURJT19DT0RJTkdfVFlQRV9NUDMgfSwKKwkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjQsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfTVBFRzIgfSwKKwkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjUsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfQUFDX0xDIH0sCisJCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1I2LCBIRE1JX0FVRElPX0NPRElOR19UWVBFX0RUUyB9LAorCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SNywgSERNSV9BVURJT19DT0RJTkdfVFlQRV9BVFJBQyB9LAorCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SOSwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9FQUMzIH0sCisJCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1IxMCwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9EVFNfSEQgfSwKKwkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjExLCBIRE1JX0FVRElPX0NPRElOR19UWVBFX01MUCB9LAorCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SMTMsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfV01BX1BSTyB9LAorCX07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmVuY29kZXItPmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciA9PSBlbmNvZGVyKSB7CisJCQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXJhZGVvbl9jb25uZWN0b3IpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZG4ndCBmaW5kIGVuY29kZXIncyBjb25uZWN0b3JcbiIpOworCQlyZXR1cm47CisJfQorCisJc2FkX2NvdW50ID0gZHJtX2VkaWRfdG9fc2FkKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQsICZzYWRzKTsKKwlpZiAoc2FkX2NvdW50IDwgMCkgeworCQlEUk1fRVJST1IoIkNvdWxkbid0IHJlYWQgU0FEczogJWRcbiIsIHNhZF9jb3VudCk7CisJCXJldHVybjsKKwl9CisJQlVHX09OKCFzYWRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9yZWdfdG9fdHlwZSk7IGkrKykgeworCQl1MzIgdmFsdWUgPSAwOworCQl1OCBzdGVyZW9fZnJlcXMgPSAwOworCQlpbnQgbWF4X2NoYW5uZWxzID0gLTE7CisJCWludCBqOworCisJCWZvciAoaiA9IDA7IGogPCBzYWRfY291bnQ7IGorKykgeworCQkJc3RydWN0IGNlYV9zYWQgKnNhZCA9ICZzYWRzW2pdOworCisJCQlpZiAoc2FkLT5mb3JtYXQgPT0gZWxkX3JlZ190b190eXBlW2ldWzFdKSB7CisJCQkJaWYgKHNhZC0+Y2hhbm5lbHMgPiBtYXhfY2hhbm5lbHMpIHsKKwkJCQkJdmFsdWUgPSBNQVhfQ0hBTk5FTFMoc2FkLT5jaGFubmVscykgfAorCQkJCQkJREVTQ1JJUFRPUl9CWVRFXzIoc2FkLT5ieXRlMikgfAorCQkJCQkJU1VQUE9SVEVEX0ZSRVFVRU5DSUVTKHNhZC0+ZnJlcSk7CisJCQkJCW1heF9jaGFubmVscyA9IHNhZC0+Y2hhbm5lbHM7CisJCQkJfQorCisJCQkJaWYgKHNhZC0+Zm9ybWF0ID09IEhETUlfQVVESU9fQ09ESU5HX1RZUEVfUENNKQorCQkJCQlzdGVyZW9fZnJlcXMgfD0gc2FkLT5mcmVxOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQl2YWx1ZSB8PSBTVVBQT1JURURfRlJFUVVFTkNJRVNfU1RFUkVPKHN0ZXJlb19mcmVxcyk7CisKKwkJV1JFRzMyKGVsZF9yZWdfdG9fdHlwZVtpXVswXSwgdmFsdWUpOworCX0KKworCWtmcmVlKHNhZHMpOworfQorCisvKgorICogdXBkYXRlIHRoZSBpbmZvIGZyYW1lcyB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIGN1cnJlbnQgZGlzcGxheSBtb2RlCisgKi8KK3ZvaWQgZGNlM18xX2hkbWlfc2V0bW9kZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwl1OCBidWZmZXJbSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJWkUgKyBIRE1JX0FWSV9JTkZPRlJBTUVfU0laRV07CisJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFtZSBmcmFtZTsKKwl1aW50MzJfdCBvZmZzZXQ7CisJc3NpemVfdCBlcnI7CisKKwlpZiAoIWRpZyB8fCAhZGlnLT5hZm10KQorCQlyZXR1cm47CisKKwkvKiBTaWxlbnQsIHI2MDBfaGRtaV9lbmFibGUgd2lsbCByYWlzZSBXQVJOIGZvciB1cyAqLworCWlmICghZGlnLT5hZm10LT5lbmFibGVkKQorCQlyZXR1cm47CisJb2Zmc2V0ID0gZGlnLT5hZm10LT5vZmZzZXQ7CisKKwkvKiBkaXNhYmxlIGF1ZGlvIHByaW9yIHRvIHNldHRpbmcgdXAgaHcgKi8KKwlkaWctPmFmbXQtPnBpbiA9IHI2MDBfYXVkaW9fZ2V0X3BpbihyZGV2KTsKKwlyNjAwX2F1ZGlvX2VuYWJsZShyZGV2LCBkaWctPmFmbXQtPnBpbiwgZmFsc2UpOworCisJcjYwMF9hdWRpb19zZXRfZHRvKGVuY29kZXIsIG1vZGUtPmNsb2NrKTsKKworCVdSRUczMihIRE1JMF9WQklfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCisJICAgICAgIEhETUkwX05VTExfU0VORCk7IC8qIHNlbmQgbnVsbCBwYWNrZXRzIHdoZW4gcmVxdWlyZWQgKi8KKworCVdSRUczMihIRE1JMF9BVURJT19DUkNfQ09OVFJPTCArIG9mZnNldCwgMHgxMDAwKTsKKworCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7CisJCVdSRUczMihIRE1JMF9BVURJT19QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKKwkJICAgICAgIEhETUkwX0FVRElPX0RFTEFZX0VOKDEpIHwgLyogZGVmYXVsdCBhdWRpbyBkZWxheSAqLworCQkgICAgICAgSERNSTBfQVVESU9fUEFDS0VUU19QRVJfTElORSgzKSk7IC8qIHNob3VsZCBiZSBzdWZmaWVudCBmb3IgYWxsIGF1ZGlvIG1vZGVzIGFuZCBzbWFsbCBlbm91Z2ggZm9yIGFsbCBoYmxhbmtzICovCisJCVdSRUczMihBRk1UX0FVRElPX1BBQ0tFVF9DT05UUk9MICsgb2Zmc2V0LAorCQkgICAgICAgQUZNVF9BVURJT19TQU1QTEVfU0VORCB8IC8qIHNlbmQgYXVkaW8gcGFja2V0cyAqLworCQkgICAgICAgQUZNVF82MDk1OF9DU19VUERBVEUpOyAvKiBhbGxvdyA2MDk1OCBjaGFubmVsIHN0YXR1cyBmaWVsZHMgdG8gYmUgdXBkYXRlZCAqLworCX0gZWxzZSB7CisJCVdSRUczMihIRE1JMF9BVURJT19QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKKwkJICAgICAgIEhETUkwX0FVRElPX1NBTVBMRV9TRU5EIHwgLyogc2VuZCBhdWRpbyBwYWNrZXRzICovCisJCSAgICAgICBIRE1JMF9BVURJT19ERUxBWV9FTigxKSB8IC8qIGRlZmF1bHQgYXVkaW8gZGVsYXkgKi8KKwkJICAgICAgIEhETUkwX0FVRElPX1BBQ0tFVFNfUEVSX0xJTkUoMykgfCAvKiBzaG91bGQgYmUgc3VmZmllbnQgZm9yIGFsbCBhdWRpbyBtb2RlcyBhbmQgc21hbGwgZW5vdWdoIGZvciBhbGwgaGJsYW5rcyAqLworCQkgICAgICAgSERNSTBfNjA5NThfQ1NfVVBEQVRFKTsgLyogYWxsb3cgNjA5NTggY2hhbm5lbCBzdGF0dXMgZmllbGRzIHRvIGJlIHVwZGF0ZWQgKi8KKwl9CisKKwlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgeworCQlkY2UzXzJfYWZtdF93cml0ZV9zcGVha2VyX2FsbG9jYXRpb24oZW5jb2Rlcik7CisJCWRjZTNfMl9hZm10X3dyaXRlX3NhZF9yZWdzKGVuY29kZXIpOworCX0KKworCVdSRUczMihIRE1JMF9BQ1JfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCisJICAgICAgIEhETUkwX0FDUl9TT1VSQ0UgfCAvKiBzZWxlY3QgU1cgQ1RTIHZhbHVlIC0gWFhYIHZlcmlmeSB0aGF0IGh3IENUUyB3b3JrcyBvbiBhbGwgZmFtaWxpZXMgKi8KKwkgICAgICAgSERNSTBfQUNSX0FVVE9fU0VORCk7IC8qIGFsbG93IGh3IHRvIHNlbnQgQUNSIHBhY2tldHMgd2hlbiByZXF1aXJlZCAqLworCisJV1JFRzMyKEhETUkwX1ZCSV9QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKKwkgICAgICAgSERNSTBfTlVMTF9TRU5EIHwgLyogc2VuZCBudWxsIHBhY2tldHMgd2hlbiByZXF1aXJlZCAqLworCSAgICAgICBIRE1JMF9HQ19TRU5EIHwgLyogc2VuZCBnZW5lcmFsIGNvbnRyb2wgcGFja2V0cyAqLworCSAgICAgICBIRE1JMF9HQ19DT05UKTsgLyogc2VuZCBnZW5lcmFsIGNvbnRyb2wgcGFja2V0cyBldmVyeSBmcmFtZSAqLworCisJLyogVE9ETzogSERNSTBfQVVESU9fSU5GT19VUERBVEUgKi8KKwlXUkVHMzIoSERNSTBfSU5GT0ZSQU1FX0NPTlRST0wwICsgb2Zmc2V0LAorCSAgICAgICBIRE1JMF9BVklfSU5GT19TRU5EIHwgLyogZW5hYmxlIEFWSSBpbmZvIGZyYW1lcyAqLworCSAgICAgICBIRE1JMF9BVklfSU5GT19DT05UIHwgLyogc2VuZCBBVkkgaW5mbyBmcmFtZXMgZXZlcnkgZnJhbWUvZmllbGQgKi8KKwkgICAgICAgSERNSTBfQVVESU9fSU5GT19TRU5EIHwgLyogZW5hYmxlIGF1ZGlvIGluZm8gZnJhbWVzIChmcmFtZXMgd29uJ3QgYmUgc2V0IHVudGlsIGF1ZGlvIGlzIGVuYWJsZWQpICovCisJICAgICAgIEhETUkwX0FVRElPX0lORk9fQ09OVCk7IC8qIHNlbmQgYXVkaW8gaW5mbyBmcmFtZXMgZXZlcnkgZnJhbWUvZmllbGQgKi8KKworCVdSRUczMihIRE1JMF9JTkZPRlJBTUVfQ09OVFJPTDEgKyBvZmZzZXQsCisJICAgICAgIEhETUkwX0FWSV9JTkZPX0xJTkUoMikgfCAvKiBhbnl0aGluZyBvdGhlciB0aGFuIDAgKi8KKwkgICAgICAgSERNSTBfQVVESU9fSU5GT19MSU5FKDIpKTsgLyogYW55dGhpbmcgb3RoZXIgdGhhbiAwICovCisKKwlXUkVHMzIoSERNSTBfR0MgKyBvZmZzZXQsIDApOyAvKiB1bnNldCBIRE1JMF9HQ19BVk1VVEUgKi8KKworCWVyciA9IGRybV9oZG1pX2F2aV9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoJmZyYW1lLCBtb2RlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXR1cCBBVkkgaW5mb2ZyYW1lOiAlemRcbiIsIGVycik7CisJCXJldHVybjsKKwl9CisKKwllcnIgPSBoZG1pX2F2aV9pbmZvZnJhbWVfcGFjaygmZnJhbWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmIChlcnIgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBhY2sgQVZJIGluZm9mcmFtZTogJXpkXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJcjYwMF9oZG1pX3VwZGF0ZV9hdmlfaW5mb2ZyYW1lKGVuY29kZXIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCXI2MDBfaGRtaV91cGRhdGVfQUNSKGVuY29kZXIsIG1vZGUtPmNsb2NrKTsKKworCS8qIGl0J3MgdW5rbm93biB3aGF0IHRoZXNlIGJpdHMgZG8gZXhjYXRseSwgYnV0IGl0J3MgaW5kZWVkIHF1aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCisJV1JFRzMyKEhETUkwX1JBTVBfQ09OVFJPTDAgKyBvZmZzZXQsIDB4MDBGRkZGRkYpOworCVdSRUczMihIRE1JMF9SQU1QX0NPTlRST0wxICsgb2Zmc2V0LCAweDAwN0ZGRkZGKTsKKwlXUkVHMzIoSERNSTBfUkFNUF9DT05UUk9MMiArIG9mZnNldCwgMHgwMDAwMDAwMSk7CisJV1JFRzMyKEhETUkwX1JBTVBfQ09OVFJPTDMgKyBvZmZzZXQsIDB4MDAwMDAwMDEpOworCisJcjYwMF9oZG1pX2F1ZGlvX3dvcmthcm91bmQoZW5jb2Rlcik7CisKKwkvKiBlbmFibGUgYXVkaW8gYWZ0ZXIgdG8gc2V0dGluZyB1cCBodyAqLworCXI2MDBfYXVkaW9fZW5hYmxlKHJkZXYsIGRpZy0+YWZtdC0+cGluLCB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCmluZGV4IDBmN2E1MWEuLmUyZjYwNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwpAQCAtMTMwMSwzNiArMTMwMSw2IEBACiB9CiAKIC8qKgotICogcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX2dldCAtIHByZS1wYWdlZmxpcCBjYWxsYmFjay4KLSAqCi0gKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCi0gKiBAY3J0YzogY3J0YyB0byBwcmVwYXJlIGZvciBwYWdlZmxpcCBvbgotICoKLSAqIFByZS1wYWdlZmxpcCBjYWxsYmFjayAoZXZlcmdyZWVuKykuCi0gKiBFbmFibGVzIHRoZSBwYWdlZmxpcCBpcnEgKHZibGFuayBpcnEpLgotICovCi12b2lkIGV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKLXsKLQkvKiBlbmFibGUgdGhlIHBmbGlwIGludCAqLwotCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQocmRldiwgY3J0Yyk7Ci19Ci0KLS8qKgotICogZXZlcmdyZWVuX3Bvc3RfcGFnZV9mbGlwIC0gcG9zLXBhZ2VmbGlwIGNhbGxiYWNrLgotICoKLSAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKLSAqIEBjcnRjOiBjcnRjIHRvIGNsZWFudXAgcGFnZWZsaXAgb24KLSAqCi0gKiBQb3N0LXBhZ2VmbGlwIGNhbGxiYWNrIChldmVyZ3JlZW4rKS4KLSAqIERpc2FibGVzIHRoZSBwYWdlZmxpcCBpcnEgKHZibGFuayBpcnEpLgotICovCi12b2lkIGV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCi17Ci0JLyogZGlzYWJsZSB0aGUgcGZsaXAgaW50ICovCi0JcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChyZGV2LCBjcnRjKTsKLX0KLQotLyoqCiAgKiBldmVyZ3JlZW5fcGFnZV9mbGlwIC0gcGFnZWZsaXAgY2FsbGJhY2suCiAgKgogICogQHJkZXY6IHJhZGVvbl9kZXZpY2UgcG9pbnRlcgpAQCAtMTM0Myw3ICsxMzEzLDcgQEAKICAqIGRvdWJsZSBidWZmZXJlZCB1cGRhdGUgdG8gdGFrZSBwbGFjZS4KICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlIHBlbmRpbmcgc3RhdHVzLgogICovCi11MzIgZXZlcmdyZWVuX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQsIHU2NCBjcnRjX2Jhc2UpCit2b2lkIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CiAJdTMyIHRtcCA9IFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOwpAQCAtMTM3NSw5ICsxMzQ1LDIzIEBACiAJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KIAl0bXAgJj0gfkVWRVJHUkVFTl9HUlBIX1VQREFURV9MT0NLOwogCVdSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7Cit9CisKKy8qKgorICogZXZlcmdyZWVuX3BhZ2VfZmxpcF9wZW5kaW5nIC0gY2hlY2sgaWYgcGFnZSBmbGlwIGlzIHN0aWxsIHBlbmRpbmcKKyAqCisgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCisgKiBAY3J0Y19pZDogY3J0YyB0byBjaGVjaworICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlIHBlbmRpbmcgc3RhdHVzLgorICovCitib29sIGV2ZXJncmVlbl9wYWdlX2ZsaXBfcGVuZGluZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKIAogCS8qIFJldHVybiBjdXJyZW50IHVwZGF0ZV9wZW5kaW5nIHN0YXR1czogKi8KLQlyZXR1cm4gUlJFRzMyKEVWRVJHUkVFTl9HUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBFVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HOworCXJldHVybiAhIShSUkVHMzIoRVZFUkdSRUVOX0dSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmCisJCUVWRVJHUkVFTl9HUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpOwogfQogCiAvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCkBAIC0zMzUzLDYgKzMzMzcsMTggQEAKIAkJCWRpc2FibGVkX3JiX21hc2sgJj0gfigxIDw8IGkpOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7IGkrKykgeworCQl1MzIgc2ltZF9kaXNhYmxlX2JpdG1hcDsKKworCQlXUkVHMzIoR1JCTV9HRlhfSU5ERVgsIElOU1RBTkNFX0JST0FEQ0FTVF9XUklURVMgfCBTRV9JTkRFWChpKSk7CisJCVdSRUczMihSTENfR0ZYX0lOREVYLCBJTlNUQU5DRV9CUk9BRENBU1RfV1JJVEVTIHwgU0VfSU5ERVgoaSkpOworCQlzaW1kX2Rpc2FibGVfYml0bWFwID0gKFJSRUczMihDQ19HQ19TSEFERVJfUElQRV9DT05GSUcpICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJCXNpbWRfZGlzYWJsZV9iaXRtYXAgfD0gMHhmZmZmZmZmZiA8PCByZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kczsKKwkJdG1wIDw8PSAxNjsKKwkJdG1wIHw9IHNpbWRfZGlzYWJsZV9iaXRtYXA7CisJfQorCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uYWN0aXZlX3NpbWRzID0gaHdlaWdodDMyKH50bXApOworCiAJV1JFRzMyKEdSQk1fR0ZYX0lOREVYLCBJTlNUQU5DRV9CUk9BRENBU1RfV1JJVEVTIHwgU0VfQlJPQURDQVNUX1dSSVRFUyk7CiAJV1JFRzMyKFJMQ19HRlhfSU5ERVgsIElOU1RBTkNFX0JST0FEQ0FTVF9XUklURVMgfCBTRV9CUk9BRENBU1RfV1JJVEVTKTsKIApAQCAtNDgxMCw3ICs0ODA2LDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzBdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAwKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJj0gfkxCX0QxX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZibGFua1xuIik7CiAJCQkJfQpAQCAtNDgzNiw3ICs0ODMyLDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzFdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAxKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDIgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC00ODYyLDcgKzQ4NTgsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbMl0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMik7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDIpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDMgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC00ODg4LDcgKzQ4ODQsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbM10pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMyk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDMpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDQgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC00OTE0LDcgKzQ5MTAsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbNF0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgNCk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDQpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDUgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC00OTQwLDcgKzQ5MzYsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbNV0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgNSk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDUpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDYgdmJsYW5rXG4iKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9oZG1pLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9oZG1pLmMKaW5kZXggMDViMGM5NS4uMWVjMGU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5faGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2hkbWkuYwpAQCAtMjkzLDEwICsyOTMsMTMgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwogCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKIAl1OCBidWZmZXJbSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJWkUgKyBIRE1JX0FWSV9JTkZPRlJBTUVfU0laRV07CiAJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFtZSBmcmFtZTsKIAl1aW50MzJfdCBvZmZzZXQ7CiAJc3NpemVfdCBlcnI7CisJdWludDMyX3QgdmFsOworCWludCBicGMgPSA4OwogCiAJaWYgKCFkaWcgfHwgIWRpZy0+YWZtdCkKIAkJcmV0dXJuOwpAQCAtMzA2LDYgKzMwOSwxMiBAQAogCQlyZXR1cm47CiAJb2Zmc2V0ID0gZGlnLT5hZm10LT5vZmZzZXQ7CiAKKwkvKiBoZG1pIGRlZXAgY29sb3IgbW9kZSBnZW5lcmFsIGNvbnRyb2wgcGFja2V0cyBzZXR1cCwgaWYgYnBjID4gOCAqLworCWlmIChlbmNvZGVyLT5jcnRjKSB7CisJCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwkJYnBjID0gcmFkZW9uX2NydGMtPmJwYzsKKwl9CisKIAkvKiBkaXNhYmxlIGF1ZGlvIHByaW9yIHRvIHNldHRpbmcgdXAgaHcgKi8KIAlpZiAoQVNJQ19JU19EQ0U2KHJkZXYpKSB7CiAJCWRpZy0+YWZtdC0+cGluID0gZGNlNl9hdWRpb19nZXRfcGluKHJkZXYpOwpAQCAtMzIyLDYgKzMzMSwzNSBAQAogCiAJV1JFRzMyKEFGTVRfQVVESU9fQ1JDX0NPTlRST0wgKyBvZmZzZXQsIDB4MTAwMCk7CiAKKwl2YWwgPSBSUkVHMzIoSERNSV9DT05UUk9MICsgb2Zmc2V0KTsKKwl2YWwgJj0gfkhETUlfREVFUF9DT0xPUl9FTkFCTEU7CisJdmFsICY9IH5IRE1JX0RFRVBfQ09MT1JfREVQVEhfTUFTSzsKKworCXN3aXRjaCAoYnBjKSB7CisJCWNhc2UgMDoKKwkJY2FzZSA2OgorCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCWRlZmF1bHQ6CisJCQlEUk1fREVCVUcoIiVzOiBEaXNhYmxpbmcgaGRtaSBkZWVwIGNvbG9yIGZvciAlZCBicGMuXG4iLAorCQkJCQkgY29ubmVjdG9yLT5uYW1lLCBicGMpOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQl2YWwgfD0gSERNSV9ERUVQX0NPTE9SX0VOQUJMRTsKKwkJCXZhbCB8PSBIRE1JX0RFRVBfQ09MT1JfREVQVEgoSERNSV8zMEJJVF9ERUVQX0NPTE9SKTsKKwkJCURSTV9ERUJVRygiJXM6IEVuYWJsaW5nIGhkbWkgZGVlcCBjb2xvciAzMCBmb3IgMTAgYnBjLlxuIiwKKwkJCQkJIGNvbm5lY3Rvci0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCXZhbCB8PSBIRE1JX0RFRVBfQ09MT1JfRU5BQkxFOworCQkJdmFsIHw9IEhETUlfREVFUF9DT0xPUl9ERVBUSChIRE1JXzM2QklUX0RFRVBfQ09MT1IpOworCQkJRFJNX0RFQlVHKCIlczogRW5hYmxpbmcgaGRtaSBkZWVwIGNvbG9yIDM2IGZvciAxMiBicGMuXG4iLAorCQkJCQkgY29ubmVjdG9yLT5uYW1lKTsKKwkJCWJyZWFrOworCX0KKworCVdSRUczMihIRE1JX0NPTlRST0wgKyBvZmZzZXQsIHZhbCk7CisKIAlXUkVHMzIoSERNSV9WQklfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCiAJICAgICAgIEhETUlfTlVMTF9TRU5EIHwgLyogc2VuZCBudWxsIHBhY2tldHMgd2hlbiByZXF1aXJlZCAqLwogCSAgICAgICBIRE1JX0dDX1NFTkQgfCAvKiBzZW5kIGdlbmVyYWwgY29udHJvbCBwYWNrZXRzICovCkBAIC0zNDgsOSArMzg2LDEzIEBACiAKIAkvKiBmZ2xyeCBjbGVhcnMgc3RoIGluIEFGTVRfQVVESU9fUEFDS0VUX0NPTlRST0wyIGhlcmUgKi8KIAotCVdSRUczMihIRE1JX0FDUl9QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKLQkgICAgICAgSERNSV9BQ1JfU09VUkNFIHwgLyogc2VsZWN0IFNXIENUUyB2YWx1ZSAqLwotCSAgICAgICBIRE1JX0FDUl9BVVRPX1NFTkQpOyAvKiBhbGxvdyBodyB0byBzZW50IEFDUiBwYWNrZXRzIHdoZW4gcmVxdWlyZWQgKi8KKwlpZiAoYnBjID4gOCkKKwkJV1JFRzMyKEhETUlfQUNSX1BBQ0tFVF9DT05UUk9MICsgb2Zmc2V0LAorCQkgICAgICAgSERNSV9BQ1JfQVVUT19TRU5EKTsgLyogYWxsb3cgaHcgdG8gc2VudCBBQ1IgcGFja2V0cyB3aGVuIHJlcXVpcmVkICovCisJZWxzZQorCQlXUkVHMzIoSERNSV9BQ1JfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCisJCSAgICAgICBIRE1JX0FDUl9TT1VSQ0UgfCAvKiBzZWxlY3QgU1cgQ1RTIHZhbHVlICovCisJCSAgICAgICBIRE1JX0FDUl9BVVRPX1NFTkQpOyAvKiBhbGxvdyBodyB0byBzZW50IEFDUiBwYWNrZXRzIHdoZW4gcmVxdWlyZWQgKi8KIAogCWV2ZXJncmVlbl9oZG1pX3VwZGF0ZV9BQ1IoZW5jb2RlciwgbW9kZS0+Y2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCmluZGV4IGY5Yzc5NjMuLmIwNjZkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCkBAIC01MTcsMTAgKzUxNywxMSBAQAogIyAgICAgICBkZWZpbmUgSERNSV9FUlJPUl9BQ0sgICAgICAgICAgICAgICAgKDEgPDwgOCkKICMgICAgICAgZGVmaW5lIEhETUlfRVJST1JfTUFTSyAgICAgICAgICAgICAgICgxIDw8IDkpCiAjICAgICAgIGRlZmluZSBIRE1JX0RFRVBfQ09MT1JfRU5BQkxFICAgICAgICAoMSA8PCAyNCkKLSMgICAgICAgZGVmaW5lIEhETUlfREVFUF9DT0xPUl9ERVBUSCAgICAgICAgICgoKHgpICYgMykgPDwgMjgpCisjICAgICAgIGRlZmluZSBIRE1JX0RFRVBfQ09MT1JfREVQVEgoeCkgICAgICAoKCh4KSAmIDMpIDw8IDI4KQogIyAgICAgICBkZWZpbmUgSERNSV8yNEJJVF9ERUVQX0NPTE9SICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgSERNSV8zMEJJVF9ERUVQX0NPTE9SICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgSERNSV8zNkJJVF9ERUVQX0NPTE9SICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgSERNSV9ERUVQX0NPTE9SX0RFUFRIX01BU0sgICAgKDMgPDwgMjgpCiAjZGVmaW5lIEhETUlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwMzQKICMgICAgICAgZGVmaW5lIEhETUlfQUNUSVZFX0FWTVVURSAgICAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBIRE1JX0FVRElPX1BBQ0tFVF9FUlJPUiAgICAgICAoMSA8PCAxNikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwppbmRleCBkMjQ2ZTA0Li41YTMzY2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCkBAIC0xMDU3LDYgKzEwNTcsMTggQEAKIAkJCWRpc2FibGVkX3JiX21hc2sgJj0gfigxIDw8IGkpOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCByZGV2LT5jb25maWcuY2F5bWFuLm1heF9zaGFkZXJfZW5naW5lczsgaSsrKSB7CisJCXUzMiBzaW1kX2Rpc2FibGVfYml0bWFwOworCisJCVdSRUczMihHUkJNX0dGWF9JTkRFWCwgSU5TVEFOQ0VfQlJPQURDQVNUX1dSSVRFUyB8IFNFX0lOREVYKGkpKTsKKwkJV1JFRzMyKFJMQ19HRlhfSU5ERVgsIElOU1RBTkNFX0JST0FEQ0FTVF9XUklURVMgfCBTRV9JTkRFWChpKSk7CisJCXNpbWRfZGlzYWJsZV9iaXRtYXAgPSAoUlJFRzMyKENDX0dDX1NIQURFUl9QSVBFX0NPTkZJRykgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwkJc2ltZF9kaXNhYmxlX2JpdG1hcCB8PSAweGZmZmZmZmZmIDw8IHJkZXYtPmNvbmZpZy5jYXltYW4ubWF4X3NpbWRzX3Blcl9zZTsKKwkJdG1wIDw8PSAxNjsKKwkJdG1wIHw9IHNpbWRfZGlzYWJsZV9iaXRtYXA7CisJfQorCXJkZXYtPmNvbmZpZy5jYXltYW4uYWN0aXZlX3NpbWRzID0gaHdlaWdodDMyKH50bXApOworCiAJV1JFRzMyKEdSQk1fR0ZYX0lOREVYLCBJTlNUQU5DRV9CUk9BRENBU1RfV1JJVEVTIHwgU0VfQlJPQURDQVNUX1dSSVRFUyk7CiAJV1JFRzMyKFJMQ19HRlhfSU5ERVgsIElOU1RBTkNFX0JST0FEQ0FTVF9XUklURVMgfCBTRV9CUk9BRENBU1RfV1JJVEVTKTsKIApAQCAtMTIyOCwxMiArMTI0MCwxNCBAQAogCSAgICAgICBTWVNURU1fQVBFUlRVUkVfVU5NQVBQRURfQUNDRVNTX1BBU1NfVEhSVSk7CiAJLyogU2V0dXAgTDIgY2FjaGUgKi8KIAlXUkVHMzIoVk1fTDJfQ05UTCwgRU5BQkxFX0wyX0NBQ0hFIHwKKwkgICAgICAgRU5BQkxFX0wyX0ZSQUdNRU5UX1BST0NFU1NJTkcgfAogCSAgICAgICBFTkFCTEVfTDJfUFRFX0NBQ0hFX0xSVV9VUERBVEVfQllfV1JJVEUgfAogCSAgICAgICBFTkFCTEVfTDJfUERFMF9DQUNIRV9MUlVfVVBEQVRFX0JZX1dSSVRFIHwKIAkgICAgICAgRUZGRUNUSVZFX0wyX1FVRVVFX1NJWkUoNykgfAogCSAgICAgICBDT05URVhUMV9JREVOVElUWV9BQ0NFU1NfTU9ERSgxKSk7CiAJV1JFRzMyKFZNX0wyX0NOVEwyLCBJTlZBTElEQVRFX0FMTF9MMV9UTEJTIHwgSU5WQUxJREFURV9MMl9DQUNIRSk7CiAJV1JFRzMyKFZNX0wyX0NOVEwzLCBMMl9DQUNIRV9CSUdLX0FTU09DSUFUSVZJVFkgfAorCSAgICAgICBCQU5LX1NFTEVDVCg2KSB8CiAJICAgICAgIEwyX0NBQ0hFX0JJR0tfRlJBR01FTlRfU0laRSg2KSk7CiAJLyogc2V0dXAgY29udGV4dDAgKi8KIAlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9TVEFSVF9BRERSLCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTIpOwpAQCAtMTI2Niw2ICsxMjgwLDcgQEAKIAkgICAgICAgKHUzMikocmRldi0+ZHVtbXlfcGFnZS5hZGRyID4+IDEyKSk7CiAJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwyLCA0KTsKIAlXUkVHMzIoVk1fQ09OVEVYVDFfQ05UTCwgRU5BQkxFX0NPTlRFWFQgfCBQQUdFX1RBQkxFX0RFUFRIKDEpIHwKKwkJCQlQQUdFX1RBQkxFX0JMT0NLX1NJWkUocmFkZW9uX3ZtX2Jsb2NrX3NpemUgLSA5KSB8CiAJCQkJUkFOR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfSU5URVJSVVBUIHwKIAkJCQlSQU5HRV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUIHwKIAkJCQlEVU1NWV9QQUdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVCB8CkBAIC0xMzQzLDcgKzEzNTgsNyBAQAogCS8qIEVWRU5UX1dSSVRFX0VPUCAtIGZsdXNoIGNhY2hlcywgc2VuZCBpbnQgKi8KIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfRVZFTlRfV1JJVEVfRU9QLCA0KSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgRVZFTlRfVFlQRShDQUNIRV9GTFVTSF9BTkRfSU5WX0VWRU5UX1RTKSB8IEVWRU5UX0lOREVYKDUpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBhZGRyICYgMHhmZmZmZmZmZik7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgbG93ZXJfMzJfYml0cyhhZGRyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmKSB8IERBVEFfU0VMKDEpIHwgSU5UX1NFTCgyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgZmVuY2UtPnNlcSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaAppbmRleCBkOTk2MDMzLi4yZTEyZTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKQEAgLTEyOCw2ICsxMjgsNyBAQAogI2RlZmluZQkJUkVBRF9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUCQkoMSA8PCAxNikKICNkZWZpbmUJCVdSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVAkJKDEgPDwgMTgpCiAjZGVmaW5lCQlXUklURV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUCQkoMSA8PCAxOSkKKyNkZWZpbmUJCVBBR0VfVEFCTEVfQkxPQ0tfU0laRSh4KQkJCSgoKHgpICYgMHhGKSA8PCAyNCkKICNkZWZpbmUgVk1fQ09OVEVYVDFfQ05UTAkJCQkweDE0MTQKICNkZWZpbmUgVk1fQ09OVEVYVDBfQ05UTDIJCQkJMHgxNDMwCiAjZGVmaW5lIFZNX0NPTlRFWFQxX0NOVEwyCQkJCTB4MTQzNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYwppbmRleCBiNmMzMjY0Li4xNTQ0ZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYwpAQCAtMTQyLDM2ICsxNDIsNiBAQAogfQogCiAvKioKLSAqIHIxMDBfcHJlX3BhZ2VfZmxpcCAtIHByZS1wYWdlZmxpcCBjYWxsYmFjay4KLSAqCi0gKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCi0gKiBAY3J0YzogY3J0YyB0byBwcmVwYXJlIGZvciBwYWdlZmxpcCBvbgotICoKLSAqIFByZS1wYWdlZmxpcCBjYWxsYmFjayAocjF4eC1yNHh4KS4KLSAqIEVuYWJsZXMgdGhlIHBhZ2VmbGlwIGlycSAodmJsYW5rIGlycSkuCi0gKi8KLXZvaWQgcjEwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKLXsKLQkvKiBlbmFibGUgdGhlIHBmbGlwIGludCAqLwotCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQocmRldiwgY3J0Yyk7Ci19Ci0KLS8qKgotICogcjEwMF9wb3N0X3BhZ2VfZmxpcCAtIHBvcy1wYWdlZmxpcCBjYWxsYmFjay4KLSAqCi0gKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCi0gKiBAY3J0YzogY3J0YyB0byBjbGVhbnVwIHBhZ2VmbGlwIG9uCi0gKgotICogUG9zdC1wYWdlZmxpcCBjYWxsYmFjayAocjF4eC1yNHh4KS4KLSAqIERpc2FibGVzIHRoZSBwYWdlZmxpcCBpcnEgKHZibGFuayBpcnEpLgotICovCi12b2lkIHIxMDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQotewotCS8qIGRpc2FibGUgdGhlIHBmbGlwIGludCAqLwotCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9wdXQocmRldiwgY3J0Yyk7Ci19Ci0KLS8qKgogICogcjEwMF9wYWdlX2ZsaXAgLSBwYWdlZmxpcCBjYWxsYmFjay4KICAqCiAgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCkBAIC0xODIsOSArMTUyLDggQEAKICAqIER1cmluZyB2Ymxhbmsgd2UgdGFrZSB0aGUgY3J0YyBsb2NrIGFuZCB3YWl0IGZvciB0aGUgdXBkYXRlX3BlbmRpbmcKICAqIGJpdCB0byBnbyBoaWdoLCB3aGVuIGl0IGRvZXMsIHdlIHJlbGVhc2UgdGhlIGxvY2ssIGFuZCBhbGxvdyB0aGUKICAqIGRvdWJsZSBidWZmZXJlZCB1cGRhdGUgdG8gdGFrZSBwbGFjZS4KLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXBkYXRlIHBlbmRpbmcgc3RhdHVzLgogICovCi11MzIgcjEwMF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQordm9pZCByMTAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQsIHU2NCBjcnRjX2Jhc2UpCiB7CiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKIAl1MzIgdG1wID0gKCh1MzIpY3J0Y19iYXNlKSB8IFJBREVPTl9DUlRDX09GRlNFVF9fT0ZGU0VUX0xPQ0s7CkBAIC0yMDYsOCArMTc1LDI0IEBACiAJdG1wICY9IH5SQURFT05fQ1JUQ19PRkZTRVRfX09GRlNFVF9MT0NLOwogCVdSRUczMihSQURFT05fQ1JUQ19PRkZTRVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CiAKK30KKworLyoqCisgKiByMTAwX3BhZ2VfZmxpcF9wZW5kaW5nIC0gY2hlY2sgaWYgcGFnZSBmbGlwIGlzIHN0aWxsIHBlbmRpbmcKKyAqCisgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCisgKiBAY3J0Y19pZDogY3J0YyB0byBjaGVjaworICoKKyAqIENoZWNrIGlmIHRoZSBsYXN0IHBhZ2VmaWxwIGlzIHN0aWxsIHBlbmRpbmcgKHIxeHgtcjR4eCkuCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHVwZGF0ZSBwZW5kaW5nIHN0YXR1cy4KKyAqLworYm9vbCByMTAwX3BhZ2VfZmxpcF9wZW5kaW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOworCiAJLyogUmV0dXJuIGN1cnJlbnQgdXBkYXRlX3BlbmRpbmcgc3RhdHVzOiAqLwotCXJldHVybiBSUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIFJBREVPTl9DUlRDX09GRlNFVF9fR1VJX1RSSUdfT0ZGU0VUOworCXJldHVybiAhIShSUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmCisJCVJBREVPTl9DUlRDX09GRlNFVF9fR1VJX1RSSUdfT0ZGU0VUKTsKIH0KIAogLyoqCkBAIC02OTcsMTUgKzY4MiwxMSBAQAogCVdSRUczMihSQURFT05fQUlDX0hJX0FERFIsIDApOwogfQogCi1pbnQgcjEwMF9wY2lfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpCit2b2lkIHIxMDBfcGNpX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIGksCisJCQkgICAgdWludDY0X3QgYWRkcikKIHsKIAl1MzIgKmd0dCA9IHJkZXYtPmdhcnQucHRyOwotCi0JaWYgKGkgPCAwIHx8IGkgPiByZGV2LT5nYXJ0Lm51bV9ncHVfcGFnZXMpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWd0dFtpXSA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoYWRkcikpOwotCXJldHVybiAwOwogfQogCiB2b2lkIHIxMDBfcGNpX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTc5NCw3ICs3NzUsNyBAQAogCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJfQogCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbMF0pKQotCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV92YmxhbmsocmRldiwgMCk7CiAJCX0KIAkJaWYgKHN0YXR1cyAmIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkgewogCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKQEAgLTgwMyw3ICs3ODQsNyBAQAogCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJfQogCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbMV0pKQotCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV92YmxhbmsocmRldiwgMSk7CiAJCX0KIAkJaWYgKHN0YXR1cyAmIFJBREVPTl9GUF9ERVRFQ1RfU1RBVCkgewogCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCmluZGV4IDIwNmNhZjkuLjNjMjFkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCkBAIC03MiwxMyArNzIsMTEgQEAKICNkZWZpbmUgUjMwMF9QVEVfV1JJVEVBQkxFICgxIDw8IDIpCiAjZGVmaW5lIFIzMDBfUFRFX1JFQURBQkxFICAoMSA8PCAzKQogCi1pbnQgcnYzNzBfcGNpZV9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcikKK3ZvaWQgcnYzNzBfcGNpZV9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBpLAorCQkJICAgICAgdWludDY0X3QgYWRkcikKIHsKIAl2b2lkIF9faW9tZW0gKnB0ciA9IHJkZXYtPmdhcnQucHRyOwogCi0JaWYgKGkgPCAwIHx8IGkgPiByZGV2LT5nYXJ0Lm51bV9ncHVfcGFnZXMpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWFkZHIgPSAobG93ZXJfMzJfYml0cyhhZGRyKSA+PiA4KSB8CiAJICAgICAgICgodXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmYpIDw8IDI0KSB8CiAJICAgICAgIFIzMDBfUFRFX1dSSVRFQUJMRSB8IFIzMDBfUFRFX1JFQURBQkxFOwpAQCAtODYsNyArODQsNiBAQAogCSAqIG9uIHBvd2VycGMgd2l0aG91dCBIVyBzd2FwcGVycywgaXQnbGwgZ2V0IHN3YXBwZWQgb24gd2F5CiAJICogaW50byBWUkFNIC0gc28gbm8gbmVlZCBmb3IgY3B1X3RvX2xlMzIgb24gVlJBTSB0YWJsZXMgKi8KIAl3cml0ZWwoYWRkciwgKCh2b2lkIF9faW9tZW0gKilwdHIpICsgKGkgKiA0KSk7Ci0JcmV0dXJuIDA7CiB9CiAKIGludCBydjM3MF9wY2llX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKaW5kZXggYmJjMTg5Zi4uYzY2OTUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKQEAgLTE5NTgsNiArMTk1OCw5IEBACiAJaWYgKHRtcCA8IHJkZXYtPmNvbmZpZy5yNjAwLm1heF9zaW1kcykgewogCQlyZGV2LT5jb25maWcucjYwMC5tYXhfc2ltZHMgPSB0bXA7CiAJfQorCXRtcCA9IHJkZXYtPmNvbmZpZy5yNjAwLm1heF9zaW1kcyAtCisJCXI2MDBfY291bnRfcGlwZV9iaXRzKChjY19nY19zaGFkZXJfcGlwZV9jb25maWcgPj4gMTYpICYgUjZYWF9NQVhfU0lNRFNfTUFTSyk7CisJcmRldi0+Y29uZmlnLnI2MDAuYWN0aXZlX3NpbWRzID0gdG1wOwogCiAJZGlzYWJsZWRfcmJfbWFzayA9IChSUkVHMzIoQ0NfUkJfQkFDS0VORF9ESVNBQkxFKSA+PiAxNikgJiBSNlhYX01BWF9CQUNLRU5EU19NQVNLOwogCXRtcCA9ICh0aWxpbmdfY29uZmlnICYgUElQRV9USUxJTkdfX01BU0spID4+IFBJUEVfVElMSU5HX19TSElGVDsKQEAgLTI3MjQsNyArMjcyNyw3IEBACiAJCS8qIEVWRU5UX1dSSVRFX0VPUCAtIGZsdXNoIGNhY2hlcywgc2VuZCBpbnQgKi8KIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX0VWRU5UX1dSSVRFX0VPUCwgNCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBFVkVOVF9UWVBFKENBQ0hFX0ZMVVNIX0FORF9JTlZfRVZFTlRfVFMpIHwgRVZFTlRfSU5ERVgoNSkpOwotCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBhZGRyICYgMHhmZmZmZmZmZik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoYWRkcikpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCAodXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmYpIHwgREFUQV9TRUwoMSkgfCBJTlRfU0VMKDIpKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgZmVuY2UtPnNlcSk7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIDApOwpAQCAtMjc2Myw3ICsyNzY2LDcgQEAKIAkJc2VsIHw9IFBBQ0tFVDNfU0VNX1dBSVRfT05fU0lHTkFMOwogCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX01FTV9TRU1BUEhPUkUsIDEpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBhZGRyICYgMHhmZmZmZmZmZik7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgbG93ZXJfMzJfYml0cyhhZGRyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmKSB8IHNlbCk7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTI4MjQsOSArMjgyNyw5IEBACiAJCWlmIChzaXplX2luX2J5dGVzID09IDApCiAJCQl0bXAgfD0gUEFDS0VUM19DUF9ETUFfQ1BfU1lOQzsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX0NQX0RNQSwgNCkpOwotCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBzcmNfb2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoc3JjX29mZnNldCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB0bXApOwotCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBkc3Rfb2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoZHN0X29mZnNldCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKGRzdF9vZmZzZXQpICYgMHhmZik7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGN1cl9zaXplX2luX2J5dGVzKTsKIAkJc3JjX29mZnNldCArPSBjdXJfc2l6ZV9pbl9ieXRlczsKQEAgLTM4NzYsNyArMzg3OSw3IEBACiAJCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKIAkJCQkJfQogCQkJCQlpZiAoYXRvbWljX3JlYWQoJnJkZXYtPmlycS5wZmxpcFswXSkpCi0JCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAwKTsKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV92YmxhbmsocmRldiwgMCk7CiAJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmPSB+TEJfRDFfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDEgdmJsYW5rXG4iKTsKIAkJCQl9CkBAIC0zOTAyLDcgKzM5MDUsNyBAQAogCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGF0b21pY19yZWFkKCZyZGV2LT5pcnEucGZsaXBbMV0pKQotCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMSk7CisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDEpOwogCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJj0gfkxCX0QyX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQyIHZibGFua1xuIik7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9oZG1pLmMKaW5kZXggODVhMmJiMi4uMjZlZjhjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfaGRtaS5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIC8qCiAgKiB1cGRhdGUgdGhlIE4gYW5kIENUUyBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIHBpeGVsIGNsb2NrIHJhdGUKICAqLwotc3RhdGljIHZvaWQgcjYwMF9oZG1pX3VwZGF0ZV9BQ1Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50MzJfdCBjbG9jaykKK3ZvaWQgcjYwMF9oZG1pX3VwZGF0ZV9BQ1Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50MzJfdCBjbG9jaykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0MiwyMSArMTQyLDMzIEBACiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CiAJdWludDMyX3Qgb2Zmc2V0ID0gZGlnLT5hZm10LT5vZmZzZXQ7CiAKLQlXUkVHMzIoSERNSTBfQUNSXzMyXzAgKyBvZmZzZXQsIEhETUkwX0FDUl9DVFNfMzIoYWNyLmN0c18zMmtoeikpOwotCVdSRUczMihIRE1JMF9BQ1JfMzJfMSArIG9mZnNldCwgYWNyLm5fMzJraHopOworCVdSRUczMl9QKEhETUkwX0FDUl8zMl8wICsgb2Zmc2V0LAorCQkgSERNSTBfQUNSX0NUU18zMihhY3IuY3RzXzMya2h6KSwKKwkJIH5IRE1JMF9BQ1JfQ1RTXzMyX01BU0spOworCVdSRUczMl9QKEhETUkwX0FDUl8zMl8xICsgb2Zmc2V0LAorCQkgSERNSTBfQUNSX05fMzIoYWNyLm5fMzJraHopLAorCQkgfkhETUkwX0FDUl9OXzMyX01BU0spOwogCi0JV1JFRzMyKEhETUkwX0FDUl80NF8wICsgb2Zmc2V0LCBIRE1JMF9BQ1JfQ1RTXzQ0KGFjci5jdHNfNDRfMWtoeikpOwotCVdSRUczMihIRE1JMF9BQ1JfNDRfMSArIG9mZnNldCwgYWNyLm5fNDRfMWtoeik7CisJV1JFRzMyX1AoSERNSTBfQUNSXzQ0XzAgKyBvZmZzZXQsCisJCSBIRE1JMF9BQ1JfQ1RTXzQ0KGFjci5jdHNfNDRfMWtoeiksCisJCSB+SERNSTBfQUNSX0NUU180NF9NQVNLKTsKKwlXUkVHMzJfUChIRE1JMF9BQ1JfNDRfMSArIG9mZnNldCwKKwkJIEhETUkwX0FDUl9OXzQ0KGFjci5uXzQ0XzFraHopLAorCQkgfkhETUkwX0FDUl9OXzQ0X01BU0spOwogCi0JV1JFRzMyKEhETUkwX0FDUl80OF8wICsgb2Zmc2V0LCBIRE1JMF9BQ1JfQ1RTXzQ4KGFjci5jdHNfNDhraHopKTsKLQlXUkVHMzIoSERNSTBfQUNSXzQ4XzEgKyBvZmZzZXQsIGFjci5uXzQ4a2h6KTsKKwlXUkVHMzJfUChIRE1JMF9BQ1JfNDhfMCArIG9mZnNldCwKKwkJIEhETUkwX0FDUl9DVFNfNDgoYWNyLmN0c180OGtoeiksCisJCSB+SERNSTBfQUNSX0NUU180OF9NQVNLKTsKKwlXUkVHMzJfUChIRE1JMF9BQ1JfNDhfMSArIG9mZnNldCwKKwkJIEhETUkwX0FDUl9OXzQ4KGFjci5uXzQ4a2h6KSwKKwkJIH5IRE1JMF9BQ1JfTl80OF9NQVNLKTsKIH0KIAogLyoKICAqIGJ1aWxkIGEgSERNSSBWaWRlbyBJbmZvIEZyYW1lCiAgKi8KLXN0YXRpYyB2b2lkIHI2MDBfaGRtaV91cGRhdGVfYXZpX2luZm9mcmFtZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIHI2MDBfaGRtaV91cGRhdGVfYXZpX2luZm9mcmFtZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMzEsNyArMjQzLDcgQEAKIC8qCiAgKiB3cml0ZSB0aGUgYXVkaW8gd29ya2Fyb3VuZCBzdGF0dXMgdG8gdGhlIGhhcmR3YXJlCiAgKi8KLXN0YXRpYyB2b2lkIHI2MDBfaGRtaV9hdWRpb193b3JrYXJvdW5kKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3ZvaWQgcjYwMF9oZG1pX2F1ZGlvX3dvcmthcm91bmQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjUwLDcgKzI2Miw3IEBACiAJCSB2YWx1ZSwgfkhETUkwX0FVRElPX1RFU1RfRU4pOwogfQogCi1zdGF0aWMgdm9pZCByNjAwX2F1ZGlvX3NldF9kdG8oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgY2xvY2spCit2b2lkIHI2MDBfYXVkaW9fc2V0X2R0byhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHUzMiBjbG9jaykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMyMCwxMjEgKzMzMiw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBkY2UzXzJfYWZtdF93cml0ZV9zcGVha2VyX2FsbG9jYXRpb24oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gTlVMTDsKLQl1MzIgdG1wOwotCXU4ICpzYWRiOwotCWludCBzYWRfY291bnQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmVuY29kZXItPmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciA9PSBlbmNvZGVyKSB7Ci0JCQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIXJhZGVvbl9jb25uZWN0b3IpIHsKLQkJRFJNX0VSUk9SKCJDb3VsZG4ndCBmaW5kIGVuY29kZXIncyBjb25uZWN0b3JcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2FkX2NvdW50ID0gZHJtX2VkaWRfdG9fc3BlYWtlcl9hbGxvY2F0aW9uKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQsICZzYWRiKTsKLQlpZiAoc2FkX2NvdW50IDwgMCkgewotCQlEUk1fRVJST1IoIkNvdWxkbid0IHJlYWQgU3BlYWtlciBBbGxvY2F0aW9uIERhdGEgQmxvY2s6ICVkXG4iLCBzYWRfY291bnQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogcHJvZ3JhbSB0aGUgc3BlYWtlciBhbGxvY2F0aW9uICovCi0JdG1wID0gUlJFRzMyKEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9DSEFOTkVMX1NQRUFLRVIpOwotCXRtcCAmPSB+KERQX0NPTk5FQ1RJT04gfCBTUEVBS0VSX0FMTE9DQVRJT05fTUFTSyk7Ci0JLyogc2V0IEhETUkgbW9kZSAqLwotCXRtcCB8PSBIRE1JX0NPTk5FQ1RJT047Ci0JaWYgKHNhZF9jb3VudCkKLQkJdG1wIHw9IFNQRUFLRVJfQUxMT0NBVElPTihzYWRiWzBdKTsKLQllbHNlCi0JCXRtcCB8PSBTUEVBS0VSX0FMTE9DQVRJT04oNSk7IC8qIHN0ZXJlbyAqLwotCVdSRUczMihBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQ0hBTk5FTF9TUEVBS0VSLCB0bXApOwotCi0Ja2ZyZWUoc2FkYik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRjZTNfMl9hZm10X3dyaXRlX3NhZF9yZWdzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGVuY29kZXItPmRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IE5VTEw7Ci0Jc3RydWN0IGNlYV9zYWQgKnNhZHM7Ci0JaW50IGksIHNhZF9jb3VudDsKLQotCXN0YXRpYyBjb25zdCB1MTYgZWxkX3JlZ190b190eXBlW11bMl0gPSB7Ci0JCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1IwLCBIRE1JX0FVRElPX0NPRElOR19UWVBFX1BDTSB9LAotCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SMSwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9BQzMgfSwKLQkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjIsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfTVBFRzEgfSwKLQkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjMsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfTVAzIH0sCi0JCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1I0LCBIRE1JX0FVRElPX0NPRElOR19UWVBFX01QRUcyIH0sCi0JCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1I1LCBIRE1JX0FVRElPX0NPRElOR19UWVBFX0FBQ19MQyB9LAotCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SNiwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9EVFMgfSwKLQkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjcsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfQVRSQUMgfSwKLQkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjksIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfRUFDMyB9LAotCQl7IEFaX0YwX0NPREVDX1BJTjBfQ09OVFJPTF9BVURJT19ERVNDUklQVE9SMTAsIEhETUlfQVVESU9fQ09ESU5HX1RZUEVfRFRTX0hEIH0sCi0JCXsgQVpfRjBfQ09ERUNfUElOMF9DT05UUk9MX0FVRElPX0RFU0NSSVBUT1IxMSwgSERNSV9BVURJT19DT0RJTkdfVFlQRV9NTFAgfSwKLQkJeyBBWl9GMF9DT0RFQ19QSU4wX0NPTlRST0xfQVVESU9fREVTQ1JJUFRPUjEzLCBIRE1JX0FVRElPX0NPRElOR19UWVBFX1dNQV9QUk8gfSwKLQl9OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZlbmNvZGVyLT5kZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7Ci0JCWlmIChjb25uZWN0b3ItPmVuY29kZXIgPT0gZW5jb2RlcikgewotCQkJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCFyYWRlb25fY29ubmVjdG9yKSB7Ci0JCURSTV9FUlJPUigiQ291bGRuJ3QgZmluZCBlbmNvZGVyJ3MgY29ubmVjdG9yXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNhZF9jb3VudCA9IGRybV9lZGlkX3RvX3NhZChyYWRlb25fY29ubmVjdG9yLT5lZGlkLCAmc2Fkcyk7Ci0JaWYgKHNhZF9jb3VudCA8IDApIHsKLQkJRFJNX0VSUk9SKCJDb3VsZG4ndCByZWFkIFNBRHM6ICVkXG4iLCBzYWRfY291bnQpOwotCQlyZXR1cm47Ci0JfQotCUJVR19PTighc2Fkcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbGRfcmVnX3RvX3R5cGUpOyBpKyspIHsKLQkJdTMyIHZhbHVlID0gMDsKLQkJdTggc3RlcmVvX2ZyZXFzID0gMDsKLQkJaW50IG1heF9jaGFubmVscyA9IC0xOwotCQlpbnQgajsKLQotCQlmb3IgKGogPSAwOyBqIDwgc2FkX2NvdW50OyBqKyspIHsKLQkJCXN0cnVjdCBjZWFfc2FkICpzYWQgPSAmc2Fkc1tqXTsKLQotCQkJaWYgKHNhZC0+Zm9ybWF0ID09IGVsZF9yZWdfdG9fdHlwZVtpXVsxXSkgewotCQkJCWlmIChzYWQtPmNoYW5uZWxzID4gbWF4X2NoYW5uZWxzKSB7Ci0JCQkJCXZhbHVlID0gTUFYX0NIQU5ORUxTKHNhZC0+Y2hhbm5lbHMpIHwKLQkJCQkJCURFU0NSSVBUT1JfQllURV8yKHNhZC0+Ynl0ZTIpIHwKLQkJCQkJCVNVUFBPUlRFRF9GUkVRVUVOQ0lFUyhzYWQtPmZyZXEpOwotCQkJCQltYXhfY2hhbm5lbHMgPSBzYWQtPmNoYW5uZWxzOwotCQkJCX0KLQotCQkJCWlmIChzYWQtPmZvcm1hdCA9PSBIRE1JX0FVRElPX0NPRElOR19UWVBFX1BDTSkKLQkJCQkJc3RlcmVvX2ZyZXFzIHw9IHNhZC0+ZnJlcTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJdmFsdWUgfD0gU1VQUE9SVEVEX0ZSRVFVRU5DSUVTX1NURVJFTyhzdGVyZW9fZnJlcXMpOwotCi0JCVdSRUczMihlbGRfcmVnX3RvX3R5cGVbaV1bMF0sIHZhbHVlKTsKLQl9Ci0KLQlrZnJlZShzYWRzKTsKLX0KLQogLyoKICAqIHVwZGF0ZSB0aGUgaW5mbyBmcmFtZXMgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZQogICovCkBAIC00NDcsNiArMzQ0LDcgQEAKIAl1OCBidWZmZXJbSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJWkUgKyBIRE1JX0FWSV9JTkZPRlJBTUVfU0laRV07CiAJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFtZSBmcmFtZTsKIAl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgYWNyX2N0bDsKIAlzc2l6ZV90IGVycjsKIAogCWlmICghZGlnIHx8ICFkaWctPmFmbXQpCkBAIC00NjMsNTIgKzM2MSw0NCBAQAogCiAJcjYwMF9hdWRpb19zZXRfZHRvKGVuY29kZXIsIG1vZGUtPmNsb2NrKTsKIAotCVdSRUczMihIRE1JMF9WQklfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCi0JICAgICAgIEhETUkwX05VTExfU0VORCk7IC8qIHNlbmQgbnVsbCBwYWNrZXRzIHdoZW4gcmVxdWlyZWQgKi8KKwlXUkVHMzJfUChIRE1JMF9BVURJT19QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKKwkJIEhETUkwX0FVRElPX1NBTVBMRV9TRU5EIHwgLyogc2VuZCBhdWRpbyBwYWNrZXRzICovCisJCSBIRE1JMF9BVURJT19ERUxBWV9FTigxKSB8IC8qIGRlZmF1bHQgYXVkaW8gZGVsYXkgKi8KKwkJIEhETUkwX0FVRElPX1BBQ0tFVFNfUEVSX0xJTkUoMykgfCAvKiBzaG91bGQgYmUgc3VmZmllbnQgZm9yIGFsbCBhdWRpbyBtb2RlcyBhbmQgc21hbGwgZW5vdWdoIGZvciBhbGwgaGJsYW5rcyAqLworCQkgSERNSTBfNjA5NThfQ1NfVVBEQVRFLCAvKiBhbGxvdyA2MDk1OCBjaGFubmVsIHN0YXR1cyBmaWVsZHMgdG8gYmUgdXBkYXRlZCAqLworCQkgfihIRE1JMF9BVURJT19TQU1QTEVfU0VORCB8CisJCSAgIEhETUkwX0FVRElPX0RFTEFZX0VOX01BU0sgfAorCQkgICBIRE1JMF9BVURJT19QQUNLRVRTX1BFUl9MSU5FX01BU0sgfAorCQkgICBIRE1JMF82MDk1OF9DU19VUERBVEUpKTsKIAotCVdSRUczMihIRE1JMF9BVURJT19DUkNfQ09OVFJPTCArIG9mZnNldCwgMHgxMDAwKTsKKwkvKiBEQ0UgMy4wIHVzZXMgcmVnaXN0ZXIgdGhhdCdzIG5vcm1hbGx5IGZvciBDUkNfQ09OVFJPTCAqLworCWFjcl9jdGwgPSBBU0lDX0lTX0RDRTMocmRldikgPyBEQ0UzX0hETUkwX0FDUl9QQUNLRVRfQ09OVFJPTCA6CisJCQkJICAgICAgIEhETUkwX0FDUl9QQUNLRVRfQ09OVFJPTDsKKwlXUkVHMzJfUChhY3JfY3RsICsgb2Zmc2V0LAorCQkgSERNSTBfQUNSX1NPVVJDRSB8IC8qIHNlbGVjdCBTVyBDVFMgdmFsdWUgLSBYWFggdmVyaWZ5IHRoYXQgaHcgQ1RTIHdvcmtzIG9uIGFsbCBmYW1pbGllcyAqLworCQkgSERNSTBfQUNSX0FVVE9fU0VORCwgLyogYWxsb3cgaHcgdG8gc2VudCBBQ1IgcGFja2V0cyB3aGVuIHJlcXVpcmVkICovCisJCSB+KEhETUkwX0FDUl9TT1VSQ0UgfAorCQkgICBIRE1JMF9BQ1JfQVVUT19TRU5EKSk7CiAKLQlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgewotCQlXUkVHMzIoSERNSTBfQVVESU9fUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCi0JCSAgICAgICBIRE1JMF9BVURJT19ERUxBWV9FTigxKSB8IC8qIGRlZmF1bHQgYXVkaW8gZGVsYXkgKi8KLQkJICAgICAgIEhETUkwX0FVRElPX1BBQ0tFVFNfUEVSX0xJTkUoMykpOyAvKiBzaG91bGQgYmUgc3VmZmllbnQgZm9yIGFsbCBhdWRpbyBtb2RlcyBhbmQgc21hbGwgZW5vdWdoIGZvciBhbGwgaGJsYW5rcyAqLwotCQlXUkVHMzIoQUZNVF9BVURJT19QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKLQkJICAgICAgIEFGTVRfQVVESU9fU0FNUExFX1NFTkQgfCAvKiBzZW5kIGF1ZGlvIHBhY2tldHMgKi8KLQkJICAgICAgIEFGTVRfNjA5NThfQ1NfVVBEQVRFKTsgLyogYWxsb3cgNjA5NTggY2hhbm5lbCBzdGF0dXMgZmllbGRzIHRvIGJlIHVwZGF0ZWQgKi8KLQl9IGVsc2UgewotCQlXUkVHMzIoSERNSTBfQVVESU9fUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCi0JCSAgICAgICBIRE1JMF9BVURJT19TQU1QTEVfU0VORCB8IC8qIHNlbmQgYXVkaW8gcGFja2V0cyAqLwotCQkgICAgICAgSERNSTBfQVVESU9fREVMQVlfRU4oMSkgfCAvKiBkZWZhdWx0IGF1ZGlvIGRlbGF5ICovCi0JCSAgICAgICBIRE1JMF9BVURJT19QQUNLRVRTX1BFUl9MSU5FKDMpIHwgLyogc2hvdWxkIGJlIHN1ZmZpZW50IGZvciBhbGwgYXVkaW8gbW9kZXMgYW5kIHNtYWxsIGVub3VnaCBmb3IgYWxsIGhibGFua3MgKi8KLQkJICAgICAgIEhETUkwXzYwOTU4X0NTX1VQREFURSk7IC8qIGFsbG93IDYwOTU4IGNoYW5uZWwgc3RhdHVzIGZpZWxkcyB0byBiZSB1cGRhdGVkICovCi0JfQorCVdSRUczMl9PUihIRE1JMF9WQklfUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCisJCSAgSERNSTBfTlVMTF9TRU5EIHwgLyogc2VuZCBudWxsIHBhY2tldHMgd2hlbiByZXF1aXJlZCAqLworCQkgIEhETUkwX0dDX1NFTkQgfCAvKiBzZW5kIGdlbmVyYWwgY29udHJvbCBwYWNrZXRzICovCisJCSAgSERNSTBfR0NfQ09OVCk7IC8qIHNlbmQgZ2VuZXJhbCBjb250cm9sIHBhY2tldHMgZXZlcnkgZnJhbWUgKi8KIAotCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7Ci0JCWRjZTNfMl9hZm10X3dyaXRlX3NwZWFrZXJfYWxsb2NhdGlvbihlbmNvZGVyKTsKLQkJZGNlM18yX2FmbXRfd3JpdGVfc2FkX3JlZ3MoZW5jb2Rlcik7Ci0JfQorCVdSRUczMl9PUihIRE1JMF9JTkZPRlJBTUVfQ09OVFJPTDAgKyBvZmZzZXQsCisJCSAgSERNSTBfQVZJX0lORk9fU0VORCB8IC8qIGVuYWJsZSBBVkkgaW5mbyBmcmFtZXMgKi8KKwkJICBIRE1JMF9BVklfSU5GT19DT05UIHwgLyogc2VuZCBBVkkgaW5mbyBmcmFtZXMgZXZlcnkgZnJhbWUvZmllbGQgKi8KKwkJICBIRE1JMF9BVURJT19JTkZPX1NFTkQgfCAvKiBlbmFibGUgYXVkaW8gaW5mbyBmcmFtZXMgKGZyYW1lcyB3b24ndCBiZSBzZXQgdW50aWwgYXVkaW8gaXMgZW5hYmxlZCkgKi8KKwkJICBIRE1JMF9BVURJT19JTkZPX1VQREFURSk7IC8qIHJlcXVpcmVkIGZvciBhdWRpbyBpbmZvIHZhbHVlcyB0byBiZSB1cGRhdGVkICovCiAKLQlXUkVHMzIoSERNSTBfQUNSX1BBQ0tFVF9DT05UUk9MICsgb2Zmc2V0LAotCSAgICAgICBIRE1JMF9BQ1JfU09VUkNFIHwgLyogc2VsZWN0IFNXIENUUyB2YWx1ZSAtIFhYWCB2ZXJpZnkgdGhhdCBodyBDVFMgd29ya3Mgb24gYWxsIGZhbWlsaWVzICovCi0JICAgICAgIEhETUkwX0FDUl9BVVRPX1NFTkQpOyAvKiBhbGxvdyBodyB0byBzZW50IEFDUiBwYWNrZXRzIHdoZW4gcmVxdWlyZWQgKi8KKwlXUkVHMzJfUChIRE1JMF9JTkZPRlJBTUVfQ09OVFJPTDEgKyBvZmZzZXQsCisJCSBIRE1JMF9BVklfSU5GT19MSU5FKDIpIHwgLyogYW55dGhpbmcgb3RoZXIgdGhhbiAwICovCisJCSBIRE1JMF9BVURJT19JTkZPX0xJTkUoMiksIC8qIGFueXRoaW5nIG90aGVyIHRoYW4gMCAqLworCQkgfihIRE1JMF9BVklfSU5GT19MSU5FX01BU0sgfAorCQkgICBIRE1JMF9BVURJT19JTkZPX0xJTkVfTUFTSykpOwogCi0JV1JFRzMyKEhETUkwX1ZCSV9QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKLQkgICAgICAgSERNSTBfTlVMTF9TRU5EIHwgLyogc2VuZCBudWxsIHBhY2tldHMgd2hlbiByZXF1aXJlZCAqLwotCSAgICAgICBIRE1JMF9HQ19TRU5EIHwgLyogc2VuZCBnZW5lcmFsIGNvbnRyb2wgcGFja2V0cyAqLwotCSAgICAgICBIRE1JMF9HQ19DT05UKTsgLyogc2VuZCBnZW5lcmFsIGNvbnRyb2wgcGFja2V0cyBldmVyeSBmcmFtZSAqLwotCi0JLyogVE9ETzogSERNSTBfQVVESU9fSU5GT19VUERBVEUgKi8KLQlXUkVHMzIoSERNSTBfSU5GT0ZSQU1FX0NPTlRST0wwICsgb2Zmc2V0LAotCSAgICAgICBIRE1JMF9BVklfSU5GT19TRU5EIHwgLyogZW5hYmxlIEFWSSBpbmZvIGZyYW1lcyAqLwotCSAgICAgICBIRE1JMF9BVklfSU5GT19DT05UIHwgLyogc2VuZCBBVkkgaW5mbyBmcmFtZXMgZXZlcnkgZnJhbWUvZmllbGQgKi8KLQkgICAgICAgSERNSTBfQVVESU9fSU5GT19TRU5EIHwgLyogZW5hYmxlIGF1ZGlvIGluZm8gZnJhbWVzIChmcmFtZXMgd29uJ3QgYmUgc2V0IHVudGlsIGF1ZGlvIGlzIGVuYWJsZWQpICovCi0JICAgICAgIEhETUkwX0FVRElPX0lORk9fQ09OVCk7IC8qIHNlbmQgYXVkaW8gaW5mbyBmcmFtZXMgZXZlcnkgZnJhbWUvZmllbGQgKi8KLQotCVdSRUczMihIRE1JMF9JTkZPRlJBTUVfQ09OVFJPTDEgKyBvZmZzZXQsCi0JICAgICAgIEhETUkwX0FWSV9JTkZPX0xJTkUoMikgfCAvKiBhbnl0aGluZyBvdGhlciB0aGFuIDAgKi8KLQkgICAgICAgSERNSTBfQVVESU9fSU5GT19MSU5FKDIpKTsgLyogYW55dGhpbmcgb3RoZXIgdGhhbiAwICovCi0KLQlXUkVHMzIoSERNSTBfR0MgKyBvZmZzZXQsIDApOyAvKiB1bnNldCBIRE1JMF9HQ19BVk1VVEUgKi8KKwlXUkVHMzJfQU5EKEhETUkwX0dDICsgb2Zmc2V0LAorCQkgICB+SERNSTBfR0NfQVZNVVRFKTsgLyogdW5zZXQgSERNSTBfR0NfQVZNVVRFICovCiAKIAllcnIgPSBkcm1faGRtaV9hdmlfaW5mb2ZyYW1lX2Zyb21fZGlzcGxheV9tb2RlKCZmcmFtZSwgbW9kZSk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTUyMywyMiArNDEzLDQ1IEBACiAJfQogCiAJcjYwMF9oZG1pX3VwZGF0ZV9hdmlfaW5mb2ZyYW1lKGVuY29kZXIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisJLyogZmdscnggZHVwbGljYXRlcyBJTkZPRlJBTUVfQ09OVFJPTDAgJiBJTkZPRlJBTUVfQ09OVFJPTDEgb3BzIGhlcmUgKi8KKworCVdSRUczMl9BTkQoSERNSTBfR0VORVJJQ19QQUNLRVRfQ09OVFJPTCArIG9mZnNldCwKKwkJICAgfihIRE1JMF9HRU5FUklDMF9TRU5EIHwKKwkJICAgICBIRE1JMF9HRU5FUklDMF9DT05UIHwKKwkJICAgICBIRE1JMF9HRU5FUklDMF9VUERBVEUgfAorCQkgICAgIEhETUkwX0dFTkVSSUMxX1NFTkQgfAorCQkgICAgIEhETUkwX0dFTkVSSUMxX0NPTlQgfAorCQkgICAgIEhETUkwX0dFTkVSSUMwX0xJTkVfTUFTSyB8CisJCSAgICAgSERNSTBfR0VORVJJQzFfTElORV9NQVNLKSk7CisKIAlyNjAwX2hkbWlfdXBkYXRlX0FDUihlbmNvZGVyLCBtb2RlLT5jbG9jayk7CiAKKwlXUkVHMzJfUChIRE1JMF82MDk1OF8wICsgb2Zmc2V0LAorCQkgSERNSTBfNjA5NThfQ1NfQ0hBTk5FTF9OVU1CRVJfTCgxKSwKKwkJIH4oSERNSTBfNjA5NThfQ1NfQ0hBTk5FTF9OVU1CRVJfTF9NQVNLIHwKKwkJICAgSERNSTBfNjA5NThfQ1NfQ0xPQ0tfQUNDVVJBQ1lfTUFTSykpOworCisJV1JFRzMyX1AoSERNSTBfNjA5NThfMSArIG9mZnNldCwKKwkJIEhETUkwXzYwOTU4X0NTX0NIQU5ORUxfTlVNQkVSX1IoMiksCisJCSB+SERNSTBfNjA5NThfQ1NfQ0hBTk5FTF9OVU1CRVJfUl9NQVNLKTsKKwogCS8qIGl0J3MgdW5rbm93biB3aGF0IHRoZXNlIGJpdHMgZG8gZXhjYXRseSwgYnV0IGl0J3MgaW5kZWVkIHF1aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCiAJV1JFRzMyKEhETUkwX1JBTVBfQ09OVFJPTDAgKyBvZmZzZXQsIDB4MDBGRkZGRkYpOwogCVdSRUczMihIRE1JMF9SQU1QX0NPTlRST0wxICsgb2Zmc2V0LCAweDAwN0ZGRkZGKTsKIAlXUkVHMzIoSERNSTBfUkFNUF9DT05UUk9MMiArIG9mZnNldCwgMHgwMDAwMDAwMSk7CiAJV1JFRzMyKEhETUkwX1JBTVBfQ09OVFJPTDMgKyBvZmZzZXQsIDB4MDAwMDAwMDEpOwogCi0JcjYwMF9oZG1pX2F1ZGlvX3dvcmthcm91bmQoZW5jb2Rlcik7Ci0KIAkvKiBlbmFibGUgYXVkaW8gYWZ0ZXIgdG8gc2V0dGluZyB1cCBodyAqLwogCXI2MDBfYXVkaW9fZW5hYmxlKHJkZXYsIGRpZy0+YWZtdC0+cGluLCB0cnVlKTsKIH0KIAotLyoKLSAqIHVwZGF0ZSBzZXR0aW5ncyB3aXRoIGN1cnJlbnQgcGFyYW1ldGVycyBmcm9tIGF1ZGlvIGVuZ2luZQorLyoqCisgKiByNjAwX2hkbWlfdXBkYXRlX2F1ZGlvX3NldHRpbmdzIC0gVXBkYXRlIGF1ZGlvIGluZm9mcmFtZQorICoKKyAqIEBlbmNvZGVyOiBkcm0gZW5jb2RlcgorICoKKyAqIEdldHMgaW5mbyBhYm91dCBjdXJyZW50IGF1ZGlvIHN0cmVhbSBhbmQgdXBkYXRlcyBhdWRpbyBpbmZvZnJhbWUuCiAgKi8KIHZvaWQgcjYwMF9oZG1pX3VwZGF0ZV9hdWRpb19zZXR0aW5ncyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CkBAIC01NTAsNyArNDYzLDcgQEAKIAl1aW50OF90IGJ1ZmZlcltIRE1JX0lORk9GUkFNRV9IRUFERVJfU0laRSArIEhETUlfQVVESU9fSU5GT0ZSQU1FX1NJWkVdOwogCXN0cnVjdCBoZG1pX2F1ZGlvX2luZm9mcmFtZSBmcmFtZTsKIAl1aW50MzJfdCBvZmZzZXQ7Ci0JdWludDMyX3QgaWVjOworCXVpbnQzMl90IHZhbHVlOwogCXNzaXplX3QgZXJyOwogCiAJaWYgKCFkaWctPmFmbXQgfHwgIWRpZy0+YWZtdC0+ZW5hYmxlZCkKQEAgLTU2Myw2MCArNDc2LDYgQEAKIAlEUk1fREVCVUcoIjB4JTAyWCBJRUM2MDk1OCBzdGF0dXMgYml0cyBhbmQgMHglMDJYIGNhdGVnb3J5IGNvZGVcbiIsCiAJCSAgKGludClhdWRpby5zdGF0dXNfYml0cywgKGludClhdWRpby5jYXRlZ29yeV9jb2RlKTsKIAotCWllYyA9IDA7Ci0JaWYgKGF1ZGlvLnN0YXR1c19iaXRzICYgQVVESU9fU1RBVFVTX1BST0ZFU1NJT05BTCkKLQkJaWVjIHw9IDEgPDwgMDsKLQlpZiAoYXVkaW8uc3RhdHVzX2JpdHMgJiBBVURJT19TVEFUVVNfTk9OQVVESU8pCi0JCWllYyB8PSAxIDw8IDE7Ci0JaWYgKGF1ZGlvLnN0YXR1c19iaXRzICYgQVVESU9fU1RBVFVTX0NPUFlSSUdIVCkKLQkJaWVjIHw9IDEgPDwgMjsKLQlpZiAoYXVkaW8uc3RhdHVzX2JpdHMgJiBBVURJT19TVEFUVVNfRU1QSEFTSVMpCi0JCWllYyB8PSAxIDw8IDM7Ci0KLQlpZWMgfD0gSERNSTBfNjA5NThfQ1NfQ0FURUdPUllfQ09ERShhdWRpby5jYXRlZ29yeV9jb2RlKTsKLQotCXN3aXRjaCAoYXVkaW8ucmF0ZSkgewotCWNhc2UgMzIwMDA6Ci0JCWllYyB8PSBIRE1JMF82MDk1OF9DU19TQU1QTElOR19GUkVRVUVOQ1koMHgzKTsKLQkJYnJlYWs7Ci0JY2FzZSA0NDEwMDoKLQkJaWVjIHw9IEhETUkwXzYwOTU4X0NTX1NBTVBMSU5HX0ZSRVFVRU5DWSgweDApOwotCQlicmVhazsKLQljYXNlIDQ4MDAwOgotCQlpZWMgfD0gSERNSTBfNjA5NThfQ1NfU0FNUExJTkdfRlJFUVVFTkNZKDB4Mik7Ci0JCWJyZWFrOwotCWNhc2UgODgyMDA6Ci0JCWllYyB8PSBIRE1JMF82MDk1OF9DU19TQU1QTElOR19GUkVRVUVOQ1koMHg4KTsKLQkJYnJlYWs7Ci0JY2FzZSA5NjAwMDoKLQkJaWVjIHw9IEhETUkwXzYwOTU4X0NTX1NBTVBMSU5HX0ZSRVFVRU5DWSgweGEpOwotCQlicmVhazsKLQljYXNlIDE3NjQwMDoKLQkJaWVjIHw9IEhETUkwXzYwOTU4X0NTX1NBTVBMSU5HX0ZSRVFVRU5DWSgweGMpOwotCQlicmVhazsKLQljYXNlIDE5MjAwMDoKLQkJaWVjIHw9IEhETUkwXzYwOTU4X0NTX1NBTVBMSU5HX0ZSRVFVRU5DWSgweGUpOwotCQlicmVhazsKLQl9Ci0KLQlXUkVHMzIoSERNSTBfNjA5NThfMCArIG9mZnNldCwgaWVjKTsKLQotCWllYyA9IDA7Ci0Jc3dpdGNoIChhdWRpby5iaXRzX3Blcl9zYW1wbGUpIHsKLQljYXNlIDE2OgotCQlpZWMgfD0gSERNSTBfNjA5NThfQ1NfV09SRF9MRU5HVEgoMHgyKTsKLQkJYnJlYWs7Ci0JY2FzZSAyMDoKLQkJaWVjIHw9IEhETUkwXzYwOTU4X0NTX1dPUkRfTEVOR1RIKDB4Myk7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCWllYyB8PSBIRE1JMF82MDk1OF9DU19XT1JEX0xFTkdUSCgweGIpOwotCQlicmVhazsKLQl9Ci0JaWYgKGF1ZGlvLnN0YXR1c19iaXRzICYgQVVESU9fU1RBVFVTX1YpCi0JCWllYyB8PSAweDUgPDwgMTY7Ci0JV1JFRzMyX1AoSERNSTBfNjA5NThfMSArIG9mZnNldCwgaWVjLCB+MHg1MDAwZik7Ci0KIAllcnIgPSBoZG1pX2F1ZGlvX2luZm9mcmFtZV9pbml0KCZmcmFtZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0dXAgYXVkaW8gaW5mb2ZyYW1lXG4iKTsKQEAgLTYzMSw4ICs0OTAsMjIgQEAKIAkJcmV0dXJuOwogCX0KIAorCXZhbHVlID0gUlJFRzMyKEhETUkwX0FVRElPX1BBQ0tFVF9DT05UUk9MICsgb2Zmc2V0KTsKKwlpZiAodmFsdWUgJiBIRE1JMF9BVURJT19URVNUX0VOKQorCQlXUkVHMzIoSERNSTBfQVVESU9fUEFDS0VUX0NPTlRST0wgKyBvZmZzZXQsCisJCSAgICAgICB2YWx1ZSAmIH5IRE1JMF9BVURJT19URVNUX0VOKTsKKworCVdSRUczMl9PUihIRE1JMF9DT05UUk9MICsgb2Zmc2V0LAorCQkgIEhETUkwX0VSUk9SX0FDSyk7CisKKwlXUkVHMzJfQU5EKEhETUkwX0lORk9GUkFNRV9DT05UUk9MMCArIG9mZnNldCwKKwkJICAgfkhETUkwX0FVRElPX0lORk9fU09VUkNFKTsKKwogCXI2MDBfaGRtaV91cGRhdGVfYXVkaW9faW5mb2ZyYW1lKGVuY29kZXIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotCXI2MDBfaGRtaV9hdWRpb193b3JrYXJvdW5kKGVuY29kZXIpOworCisJV1JFRzMyX09SKEhETUkwX0lORk9GUkFNRV9DT05UUk9MMCArIG9mZnNldCwKKwkJICBIRE1JMF9BVURJT19JTkZPX0NPTlQgfAorCQkgIEhETUkwX0FVRElPX0lORk9fVVBEQVRFKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAppbmRleCAzNzQ1NWY2Li5mOTRlN2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCkBAIC0xMDI5LDE1ICsxMDI5LDE4IEBACiAjZGVmaW5lIEhETUkwX0FVRElPX1BBQ0tFVF9DT05UUk9MICAgMHg3NDA4CiAjICAgICAgIGRlZmluZSBIRE1JMF9BVURJT19TQU1QTEVfU0VORCAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIEhETUkwX0FVRElPX0RFTEFZX0VOKHgpICAoKCh4KSAmIDMpIDw8IDQpCisjICAgICAgIGRlZmluZSBIRE1JMF9BVURJT19ERUxBWV9FTl9NQVNLCSgzIDw8IDQpCiAjICAgICAgIGRlZmluZSBIRE1JMF9BVURJT19TRU5EX01BWF9QQUNLRVRTICAoMSA8PCA4KQogIyAgICAgICBkZWZpbmUgSERNSTBfQVVESU9fVEVTVF9FTiAgICAgICAgICgxIDw8IDEyKQogIyAgICAgICBkZWZpbmUgSERNSTBfQVVESU9fUEFDS0VUU19QRVJfTElORSh4KSAgKCgoeCkgJiAweDFmKSA8PCAxNikKKyMgICAgICAgZGVmaW5lIEhETUkwX0FVRElPX1BBQ0tFVFNfUEVSX0xJTkVfTUFTSwkoMHgxZiA8PCAxNikKICMgICAgICAgZGVmaW5lIEhETUkwX0FVRElPX0NIQU5ORUxfU1dBUCAgICAoMSA8PCAyNCkKICMgICAgICAgZGVmaW5lIEhETUkwXzYwOTU4X0NTX1VQREFURSAgICAgICAoMSA8PCAyNikKICMgICAgICAgZGVmaW5lIEhETUkwX0FaX0ZPUk1BVF9XVFJJR19NQVNLICAoMSA8PCAyOCkKICMgICAgICAgZGVmaW5lIEhETUkwX0FaX0ZPUk1BVF9XVFJJR19BQ0sgICAoMSA8PCAyOSkKICNkZWZpbmUgSERNSTBfQVVESU9fQ1JDX0NPTlRST0wgICAgICAweDc0MGMKICMgICAgICAgZGVmaW5lIEhETUkwX0FVRElPX0NSQ19FTiAgICAoMSA8PCAwKQorI2RlZmluZSBEQ0UzX0hETUkwX0FDUl9QQUNLRVRfQ09OVFJPTAkweDc0MGMKICNkZWZpbmUgSERNSTBfVkJJX1BBQ0tFVF9DT05UUk9MICAgICAweDc0MTAKICMgICAgICAgZGVmaW5lIEhETUkwX05VTExfU0VORCAgICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgSERNSTBfR0NfU0VORCAgICAgICAgICgxIDw8IDQpCkBAIC0xMDU0LDcgKzEwNTcsOSBAQAogIyAgICAgICBkZWZpbmUgSERNSTBfTVBFR19JTkZPX1VQREFURSAgKDEgPDwgMTApCiAjZGVmaW5lIEhETUkwX0lORk9GUkFNRV9DT05UUk9MMSAgICAgMHg3NDE4CiAjICAgICAgIGRlZmluZSBIRE1JMF9BVklfSU5GT19MSU5FKHgpICAoKCh4KSAmIDB4M2YpIDw8IDApCisjICAgICAgIGRlZmluZSBIRE1JMF9BVklfSU5GT19MSU5FX01BU0sJCSgweDNmIDw8IDApCiAjICAgICAgIGRlZmluZSBIRE1JMF9BVURJT19JTkZPX0xJTkUoeCkgICgoKHgpICYgMHgzZikgPDwgOCkKKyMgICAgICAgZGVmaW5lIEhETUkwX0FVRElPX0lORk9fTElORV9NQVNLCSgweDNmIDw8IDgpCiAjICAgICAgIGRlZmluZSBIRE1JMF9NUEVHX0lORk9fTElORSh4KSAgKCgoeCkgJiAweDNmKSA8PCAxNikKICNkZWZpbmUgSERNSTBfR0VORVJJQ19QQUNLRVRfQ09OVFJPTCAweDc0MWMKICMgICAgICAgZGVmaW5lIEhETUkwX0dFTkVSSUMwX1NFTkQgICAoMSA8PCAwKQpAQCAtMTA2Myw3ICsxMDY4LDkgQEAKICMgICAgICAgZGVmaW5lIEhETUkwX0dFTkVSSUMxX1NFTkQgICAoMSA8PCA0KQogIyAgICAgICBkZWZpbmUgSERNSTBfR0VORVJJQzFfQ09OVCAgICgxIDw8IDUpCiAjICAgICAgIGRlZmluZSBIRE1JMF9HRU5FUklDMF9MSU5FKHgpICAoKCh4KSAmIDB4M2YpIDw8IDE2KQorIyAgICAgICBkZWZpbmUgSERNSTBfR0VORVJJQzBfTElORV9NQVNLCQkoMHgzZiA8PCAxNikKICMgICAgICAgZGVmaW5lIEhETUkwX0dFTkVSSUMxX0xJTkUoeCkgICgoKHgpICYgMHgzZikgPDwgMjQpCisjICAgICAgIGRlZmluZSBIRE1JMF9HRU5FUklDMV9MSU5FX01BU0sJCSgweDNmIDw8IDI0KQogI2RlZmluZSBIRE1JMF9HQyAgICAgICAgICAgICAgICAgICAgIDB4NzQyOAogIyAgICAgICBkZWZpbmUgSERNSTBfR0NfQVZNVVRFICAgICAgICgxIDw8IDApCiAjZGVmaW5lIEhETUkwX0FWSV9JTkZPMCAgICAgICAgICAgICAgMHg3NDU0CkBAIC0xMTE5LDE2ICsxMTI2LDIyIEBACiAjZGVmaW5lIEhETUkwX0dFTkVSSUMxXzYgICAgICAgICAgICAgMHg3NGE4CiAjZGVmaW5lIEhETUkwX0FDUl8zMl8wICAgICAgICAgICAgICAgMHg3NGFjCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfQ1RTXzMyKHgpICAgKCgoeCkgJiAweGZmZmZmKSA8PCAxMikKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9DVFNfMzJfTUFTSwkJKDB4ZmZmZmYgPDwgMTIpCiAjZGVmaW5lIEhETUkwX0FDUl8zMl8xICAgICAgICAgICAgICAgMHg3NGIwCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfTl8zMih4KSAgICgoKHgpICYgMHhmZmZmZikgPDwgMCkKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9OXzMyX01BU0sJCSgweGZmZmZmIDw8IDApCiAjZGVmaW5lIEhETUkwX0FDUl80NF8wICAgICAgICAgICAgICAgMHg3NGI0CiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfQ1RTXzQ0KHgpICAgKCgoeCkgJiAweGZmZmZmKSA8PCAxMikKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9DVFNfNDRfTUFTSwkJKDB4ZmZmZmYgPDwgMTIpCiAjZGVmaW5lIEhETUkwX0FDUl80NF8xICAgICAgICAgICAgICAgMHg3NGI4CiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfTl80NCh4KSAgICgoKHgpICYgMHhmZmZmZikgPDwgMCkKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9OXzQ0X01BU0sJCSgweGZmZmZmIDw8IDApCiAjZGVmaW5lIEhETUkwX0FDUl80OF8wICAgICAgICAgICAgICAgMHg3NGJjCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfQ1RTXzQ4KHgpICAgKCgoeCkgJiAweGZmZmZmKSA8PCAxMikKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9DVFNfNDhfTUFTSwkJKDB4ZmZmZmYgPDwgMTIpCiAjZGVmaW5lIEhETUkwX0FDUl80OF8xICAgICAgICAgICAgICAgMHg3NGMwCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfTl80OCh4KSAgICgoKHgpICYgMHhmZmZmZikgPDwgMCkKKyMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9OXzQ4X01BU0sJCSgweGZmZmZmIDw8IDApCiAjZGVmaW5lIEhETUkwX0FDUl9TVEFUVVNfMCAgICAgICAgICAgMHg3NGM0CiAjZGVmaW5lIEhETUkwX0FDUl9TVEFUVVNfMSAgICAgICAgICAgMHg3NGM4CiAjZGVmaW5lIEhETUkwX0FVRElPX0lORk8wICAgICAgICAgICAgMHg3NGNjCkBAIC0xMTQ4LDE0ICsxMTYxLDE3IEBACiAjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19DQVRFR09SWV9DT0RFKHgpICAgICAgKCgoeCkgJiAweGZmKSA8PCA4KQogIyAgICAgICBkZWZpbmUgSERNSTBfNjA5NThfQ1NfU09VUkNFX05VTUJFUih4KSAgICAgICgoKHgpICYgMHhmKSA8PCAxNikKICMgICAgICAgZGVmaW5lIEhETUkwXzYwOTU4X0NTX0NIQU5ORUxfTlVNQkVSX0woeCkgICAoKCh4KSAmIDB4ZikgPDwgMjApCisjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19DSEFOTkVMX05VTUJFUl9MX01BU0sJKDB4ZiA8PCAyMCkKICMgICAgICAgZGVmaW5lIEhETUkwXzYwOTU4X0NTX1NBTVBMSU5HX0ZSRVFVRU5DWSh4KSAoKCh4KSAmIDB4ZikgPDwgMjQpCiAjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19DTE9DS19BQ0NVUkFDWSh4KSAgICAgKCgoeCkgJiAzKSA8PCAyOCkKKyMgICAgICAgZGVmaW5lIEhETUkwXzYwOTU4X0NTX0NMT0NLX0FDQ1VSQUNZX01BU0sJKDMgPDwgMjgpCiAjZGVmaW5lIEhETUkwXzYwOTU4XzEgICAgICAgICAgICAgICAgMHg3NGQ4CiAjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19XT1JEX0xFTkdUSCh4KSAgICAgICAgKCgoeCkgJiAweGYpIDw8IDApCiAjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19PUklHSU5BTF9TQU1QTElOR19GUkVRVUVOQ1koeCkgICAoKCh4KSAmIDB4ZikgPDwgNCkKICMgICAgICAgZGVmaW5lIEhETUkwXzYwOTU4X0NTX1ZBTElEX0woeCkgICAoKCh4KSAmIDEpIDw8IDE2KQogIyAgICAgICBkZWZpbmUgSERNSTBfNjA5NThfQ1NfVkFMSURfUih4KSAgICgoKHgpICYgMSkgPDwgMTgpCiAjICAgICAgIGRlZmluZSBIRE1JMF82MDk1OF9DU19DSEFOTkVMX05VTUJFUl9SKHgpICAgKCgoeCkgJiAweGYpIDw8IDIwKQorIyAgICAgICBkZWZpbmUgSERNSTBfNjA5NThfQ1NfQ0hBTk5FTF9OVU1CRVJfUl9NQVNLCSgweGYgPDwgMjApCiAjZGVmaW5lIEhETUkwX0FDUl9QQUNLRVRfQ09OVFJPTCAgICAgMHg3NGRjCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfU0VORCAgICAgICAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIEhETUkwX0FDUl9DT05UICAgICAgICAoMSA8PCAxKQpAQCAtMTE2Niw2ICsxMTgyLDcgQEAKICMgICAgICAgZGVmaW5lIEhETUkwX0FDUl80OCAgICAgICAgICAzCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfU09VUkNFICAgICAgKDEgPDwgOCkgLyogMCAtIGh3OyAxIC0gY3RzIHZhbHVlICovCiAjICAgICAgIGRlZmluZSBIRE1JMF9BQ1JfQVVUT19TRU5EICAgKDEgPDwgMTIpCisjZGVmaW5lIERDRTNfSERNSTBfQVVESU9fQ1JDX0NPTlRST0wJMHg3NGRjCiAjZGVmaW5lIEhETUkwX1JBTVBfQ09OVFJPTDAgICAgICAgICAgMHg3NGUwCiAjICAgICAgIGRlZmluZSBIRE1JMF9SQU1QX01BWF9DT1VOVCh4KSAgICgoKHgpICYgMHhmZmZmZmYpIDw8IDApCiAjZGVmaW5lIEhETUkwX1JBTVBfQ09OVFJPTDEgICAgICAgICAgMHg3NGU0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAppbmRleCA4MTQ5ZTdjLi40YjBiYmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKQEAgLTEwMCw2ICsxMDAsOCBAQAogZXh0ZXJuIGludCByYWRlb25fYXNwbTsKIGV4dGVybiBpbnQgcmFkZW9uX3J1bnRpbWVfcG07CiBleHRlcm4gaW50IHJhZGVvbl9oYXJkX3Jlc2V0OworZXh0ZXJuIGludCByYWRlb25fdm1fc2l6ZTsKK2V4dGVybiBpbnQgcmFkZW9uX3ZtX2Jsb2NrX3NpemU7CiAKIC8qCiAgKiBDb3B5IGZyb20gcmFkZW9uX2Rydi5oIHNvIHdlIGRvbid0IGhhdmUgdG8gaW5jbHVkZSBib3RoIGFuZCBoYXZlIGNvbmZsaWN0aW5nCkBAIC02NzYsMTQgKzY3OCwxNiBAQAogICogSVJRUy4KICAqLwogCi1zdHJ1Y3QgcmFkZW9uX3VucGluX3dvcmsgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2OwotCWludCBjcnRjX2lkOwotCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlOworc3RydWN0IHJhZGVvbl9mbGlwX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdAkJZmxpcF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJdW5waW5fd29yazsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZQkJKnJkZXY7CisJaW50CQkJCWNydGNfaWQ7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlcgkJKmZiOwogCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50OwotCXN0cnVjdCByYWRlb25fYm8gKm9sZF9yYm87Ci0JdTY0IG5ld19jcnRjX2Jhc2U7CisJc3RydWN0IHJhZGVvbl9ibwkJKm9sZF9yYm87CisJc3RydWN0IHJhZGVvbl9ibwkJKm5ld19yYm87CisJc3RydWN0IHJhZGVvbl9mZW5jZQkJKmZlbmNlOwogfTsKIAogc3RydWN0IHI1MDBfaXJxX3N0YXRfcmVncyB7CkBAIC04MzUsMTMgKzgzOSw4IEBACiAvKiBtYXhpbXVtIG51bWJlciBvZiBWTUlEcyAqLwogI2RlZmluZSBSQURFT05fTlVNX1ZNCTE2CiAKLS8qIGRlZmluZXMgbnVtYmVyIG9mIGJpdHMgaW4gcGFnZSB0YWJsZSB2ZXJzdXMgcGFnZSBkaXJlY3RvcnksCi0gKiBhIHBhZ2UgaXMgNEtCIHNvIHdlIGhhdmUgMTIgYml0cyBvZmZzZXQsIDkgYml0cyBpbiB0aGUgcGFnZQotICogdGFibGUgYW5kIHRoZSByZW1haW5pbmcgMTkgYml0cyBhcmUgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5ICovCi0jZGVmaW5lIFJBREVPTl9WTV9CTE9DS19TSVpFICAgOQotCiAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBwYWdlIHRhYmxlICovCi0jZGVmaW5lIFJBREVPTl9WTV9QVEVfQ09VTlQgKDEgPDwgUkFERU9OX1ZNX0JMT0NLX1NJWkUpCisjZGVmaW5lIFJBREVPTl9WTV9QVEVfQ09VTlQgKDEgPDwgcmFkZW9uX3ZtX2Jsb2NrX3NpemUpCiAKIC8qIFBUQnMgKFBhZ2UgVGFibGUgQmxvY2tzKSBuZWVkIHRvIGJlIGFsaWduZWQgdG8gMzJLICovCiAjZGVmaW5lIFJBREVPTl9WTV9QVEJfQUxJR05fU0laRSAgIDMyNzY4CkBAIC04NTQsNiArODUzLDE1IEBACiAjZGVmaW5lIFI2MDBfUFRFX1JFQURBQkxFCSgxIDw8IDUpCiAjZGVmaW5lIFI2MDBfUFRFX1dSSVRFQUJMRQkoMSA8PCA2KQogCisvKiBQVEUgKFBhZ2UgVGFibGUgRW50cnkpIGZyYWdtZW50IGZpZWxkIGZvciBkaWZmZXJlbnQgcGFnZSBzaXplcyAqLworI2RlZmluZSBSNjAwX1BURV9GUkFHXzRLQgkoMCA8PCA3KQorI2RlZmluZSBSNjAwX1BURV9GUkFHXzY0S0IJKDQgPDwgNykKKyNkZWZpbmUgUjYwMF9QVEVfRlJBR18yNTZLQgkoNiA8PCA3KQorCisvKiBmbGFncyB1c2VkIGZvciBHQVJUIHBhZ2UgdGFibGUgZW50cmllcyBvbiBSNjAwKyAqLworI2RlZmluZSBSNjAwX1BURV9HQVJUCSggUjYwMF9QVEVfVkFMSUQgfCBSNjAwX1BURV9TWVNURU0gfCBSNjAwX1BURV9TTk9PUEVEIFwKKwkJCXwgUjYwMF9QVEVfUkVBREFCTEUgfCBSNjAwX1BURV9XUklURUFCTEUpCisKIHN0cnVjdCByYWRlb25fdm1fcHQgewogCXN0cnVjdCByYWRlb25fYm8JCSpibzsKIAl1aW50NjRfdAkJCWFkZHI7CkBAIC05ODYsOCArOTk0LDggQEAKIAlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKIAlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlcgl0djsKIAl1aW50NjRfdAkJCWdwdV9vZmZzZXQ7Ci0JdW5zaWduZWQJCQlkb21haW47Ci0JdW5zaWduZWQJCQlhbHRfZG9tYWluOworCXVuc2lnbmVkCQkJcHJlZmVyZWRfZG9tYWluczsKKwl1bnNpZ25lZAkJCWFsbG93ZWRfZG9tYWluczsKIAl1aW50MzJfdAkJCXRpbGluZ19mbGFnczsKIAl1aW50MzJfdAkJCWhhbmRsZTsKIH07CkBAIC0xNzcxLDcgKzE3NzksOCBAQAogCS8qIGdhcnQgKi8KIAlzdHJ1Y3QgewogCQl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0JCWludCAoKnNldF9wYWdlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpOworCQl2b2lkICgqc2V0X3BhZ2UpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBpLAorCQkJCSB1aW50NjRfdCBhZGRyKTsKIAl9IGdhcnQ7CiAJc3RydWN0IHsKIAkJaW50ICgqaW5pdCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMTg4Myw5ICsxODkyLDggQEAKIAl9IGRwbTsKIAkvKiBwYWdlZmxpcHBpbmcgKi8KIAlzdHJ1Y3QgewotCQl2b2lkICgqcHJlX3BhZ2VfZmxpcCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKLQkJdTMyICgqcGFnZV9mbGlwKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOwotCQl2b2lkICgqcG9zdF9wYWdlX2ZsaXApKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CisJCXZvaWQgKCpwYWdlX2ZsaXApKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7CisJCWJvb2wgKCpwYWdlX2ZsaXBfcGVuZGluZykoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKIAl9IHBmbGlwOwogfTsKIApAQCAtMTkyNCw2ICsxOTMyLDcgQEAKIAl1bnNpZ25lZAkJdGlsaW5nX2dyb3VwX3NpemU7CiAJdW5zaWduZWQJCXRpbGVfY29uZmlnOwogCXVuc2lnbmVkCQliYWNrZW5kX21hcDsKKwl1bnNpZ25lZAkJYWN0aXZlX3NpbWRzOwogfTsKIAogc3RydWN0IHJ2NzcwX2FzaWMgewpAQCAtMTk0OSw2ICsxOTU4LDcgQEAKIAl1bnNpZ25lZAkJdGlsaW5nX2dyb3VwX3NpemU7CiAJdW5zaWduZWQJCXRpbGVfY29uZmlnOwogCXVuc2lnbmVkCQliYWNrZW5kX21hcDsKKwl1bnNpZ25lZAkJYWN0aXZlX3NpbWRzOwogfTsKIAogc3RydWN0IGV2ZXJncmVlbl9hc2ljIHsKQEAgLTE5NzUsNiArMTk4NSw3IEBACiAJdW5zaWduZWQgdGlsaW5nX2dyb3VwX3NpemU7CiAJdW5zaWduZWQgdGlsZV9jb25maWc7CiAJdW5zaWduZWQgYmFja2VuZF9tYXA7CisJdW5zaWduZWQgYWN0aXZlX3NpbWRzOwogfTsKIAogc3RydWN0IGNheW1hbl9hc2ljIHsKQEAgLTIwMTMsNiArMjAyNCw3IEBACiAJdW5zaWduZWQgbXVsdGlfZ3B1X3RpbGVfc2l6ZTsKIAogCXVuc2lnbmVkIHRpbGVfY29uZmlnOworCXVuc2lnbmVkIGFjdGl2ZV9zaW1kczsKIH07CiAKIHN0cnVjdCBzaV9hc2ljIHsKQEAgLTIwNDMsNiArMjA1NSw3IEBACiAKIAl1bnNpZ25lZCB0aWxlX2NvbmZpZzsKIAl1aW50MzJfdCB0aWxlX21vZGVfYXJyYXlbMzJdOworCXVpbnQzMl90IGFjdGl2ZV9jdXM7CiB9OwogCiBzdHJ1Y3QgY2lrX2FzaWMgewpAQCAtMjA3NCw2ICsyMDg3LDcgQEAKIAl1bnNpZ25lZCB0aWxlX2NvbmZpZzsKIAl1aW50MzJfdCB0aWxlX21vZGVfYXJyYXlbMzJdOwogCXVpbnQzMl90IG1hY3JvdGlsZV9tb2RlX2FycmF5WzE2XTsKKwl1aW50MzJfdCBhY3RpdmVfY3VzOwogfTsKIAogdW5pb24gcmFkZW9uX2FzaWNfY29uZmlnIHsKQEAgLTI3NDUsOSArMjc1OSw4IEBACiAjZGVmaW5lIHJhZGVvbl9wbV9maW5pc2gocmRldikgKHJkZXYpLT5hc2ljLT5wbS5maW5pc2goKHJkZXYpKQogI2RlZmluZSByYWRlb25fcG1faW5pdF9wcm9maWxlKHJkZXYpIChyZGV2KS0+YXNpYy0+cG0uaW5pdF9wcm9maWxlKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX3BtX2dldF9keW5wbV9zdGF0ZShyZGV2KSAocmRldiktPmFzaWMtPnBtLmdldF9keW5wbV9zdGF0ZSgocmRldikpCi0jZGVmaW5lIHJhZGVvbl9wcmVfcGFnZV9mbGlwKHJkZXYsIGNydGMpIChyZGV2KS0+YXNpYy0+cGZsaXAucHJlX3BhZ2VfZmxpcCgocmRldiksIChjcnRjKSkKICNkZWZpbmUgcmFkZW9uX3BhZ2VfZmxpcChyZGV2LCBjcnRjLCBiYXNlKSAocmRldiktPmFzaWMtPnBmbGlwLnBhZ2VfZmxpcCgocmRldiksIChjcnRjKSwgKGJhc2UpKQotI2RlZmluZSByYWRlb25fcG9zdF9wYWdlX2ZsaXAocmRldiwgY3J0YykgKHJkZXYpLT5hc2ljLT5wZmxpcC5wb3N0X3BhZ2VfZmxpcCgocmRldiksIChjcnRjKSkKKyNkZWZpbmUgcmFkZW9uX3BhZ2VfZmxpcF9wZW5kaW5nKHJkZXYsIGNydGMpIChyZGV2KS0+YXNpYy0+cGZsaXAucGFnZV9mbGlwX3BlbmRpbmcoKHJkZXYpLCAoY3J0YykpCiAjZGVmaW5lIHJhZGVvbl93YWl0X2Zvcl92YmxhbmsocmRldiwgY3J0YykgKHJkZXYpLT5hc2ljLT5kaXNwbGF5LndhaXRfZm9yX3ZibGFuaygocmRldiksIChjcnRjKSkKICNkZWZpbmUgcmFkZW9uX21jX3dhaXRfZm9yX2lkbGUocmRldikgKHJkZXYpLT5hc2ljLT5tY193YWl0X2Zvcl9pZGxlKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2dldF94Y2xrKHJkZXYpIChyZGV2KS0+YXNpYy0+Z2V0X3hjbGsoKHJkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYWdwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hZ3AuYwppbmRleCA0MjQzMzM0Li5hOTI5N2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hZ3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hZ3AuYwpAQCAtMTE3LDkgKzExNyw2IEBACiAJLyogQVRJIEhvc3QgQnJpZGdlIC8gUlYyODAgW005K10gTmVlZHMgQUdQTW9kZSAxIChwaG9yb25peCBmb3J1bSkgKi8KIAl7IFBDSV9WRU5ET1JfSURfQVRJLCAweGNiYjIsIFBDSV9WRU5ET1JfSURfQVRJLCAweDVjNjEsCiAJCVBDSV9WRU5ET1JfSURfU09OWSwgMHg4MTc1LCAxfSwKLQkvKiBIUCBIb3N0IEJyaWRnZSAvIFIzMDAgW0ZpcmVHTCBYMV0gTmVlZHMgQUdQTW9kZSAyIChmZG8gIzc3NzApICovCi0JeyBQQ0lfVkVORE9SX0lEX0hQLCAweDEyMmUsIFBDSV9WRU5ET1JfSURfQVRJLCAweDRlNDcsCi0JCVBDSV9WRU5ET1JfSURfQVRJLCAweDAxNTIsIDJ9LAogCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCmluZGV4IGU1ZjAxNzcuLjM0YjlhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKQEAgLTI0OCw5ICsyNDgsOCBAQAogCQkuc2V0X2Nsb2NrX2dhdGluZyA9ICZyYWRlb25fbGVnYWN5X3NldF9jbG9ja19nYXRpbmcsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZyMTAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC0zMTUsOSArMzE0LDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2xlZ2FjeV9zZXRfY2xvY2tfZ2F0aW5nLAogCX0sCiAJLnBmbGlwID0gewotCQkucHJlX3BhZ2VfZmxpcCA9ICZyMTAwX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyMTAwX3Bvc3RfcGFnZV9mbGlwLAorCQkucGFnZV9mbGlwX3BlbmRpbmcgPSAmcjEwMF9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApAQCAtMzk2LDkgKzM5NCw4IEBACiAJCS5zZXRfY2xvY2tfZ2F0aW5nID0gJnJhZGVvbl9sZWdhY3lfc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJnIxMDBfcGFnZV9mbGlwLAotCQkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnIxMDBfcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTQ2Myw5ICs0NjAsOCBAQAogCQkuc2V0X2Nsb2NrX2dhdGluZyA9ICZyYWRlb25fbGVnYWN5X3NldF9jbG9ja19nYXRpbmcsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZyMTAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC01MzAsOSArNTI2LDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJnIxMDBfcGFnZV9mbGlwLAotCQkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnIxMDBfcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTU5Nyw5ICs1OTIsOCBAQAogCQkuc2V0X2Nsb2NrX2dhdGluZyA9ICZyYWRlb25fbGVnYWN5X3NldF9jbG9ja19nYXRpbmcsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZyMTAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC02NjYsOSArNjYwLDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC03MzUsOSArNzI4LDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC04MDIsOSArNzk0LDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC04NjksOSArODYwLDggQEAKIAkJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC05NjgsOSArOTU4LDggQEAKIAkJLmdldF90ZW1wZXJhdHVyZSA9ICZydjZ4eF9nZXRfdGVtcCwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC0xMDU5LDkgKzEwNDgsOCBAQAogCQkuZm9yY2VfcGVyZm9ybWFuY2VfbGV2ZWwgPSAmcnY2eHhfZHBtX2ZvcmNlX3BlcmZvcm1hbmNlX2xldmVsLAogCX0sCiAJLnBmbGlwID0gewotCQkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJnJzNjAwX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJnJzNjAwX3Bvc3RfcGFnZV9mbGlwLAorCQkucGFnZV9mbGlwX3BlbmRpbmcgPSAmcnM2MDBfcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTExNTAsOSArMTEzOCw4IEBACiAJCS5mb3JjZV9wZXJmb3JtYW5jZV9sZXZlbCA9ICZyczc4MF9kcG1fZm9yY2VfcGVyZm9ybWFuY2VfbGV2ZWwsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJnJzNjAwX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAotCQkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZyczYwMF9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApAQCAtMTIwMSw3ICsxMTg4LDcgQEAKIAkJLnNldF9iYWNrbGlnaHRfbGV2ZWwgPSAmYXRvbWJpb3Nfc2V0X2JhY2tsaWdodF9sZXZlbCwKIAkJLmdldF9iYWNrbGlnaHRfbGV2ZWwgPSAmYXRvbWJpb3NfZ2V0X2JhY2tsaWdodF9sZXZlbCwKIAkJLmhkbWlfZW5hYmxlID0gJnI2MDBfaGRtaV9lbmFibGUsCi0JCS5oZG1pX3NldG1vZGUgPSAmcjYwMF9oZG1pX3NldG1vZGUsCisJCS5oZG1pX3NldG1vZGUgPSAmZGNlM18xX2hkbWlfc2V0bW9kZSwKIAl9LAogCS5jb3B5ID0gewogCQkuYmxpdCA9ICZyNjAwX2NvcHlfY3BkbWEsCkBAIC0xMjU2LDkgKzEyNDMsOCBAQAogCQkudmJsYW5rX3Rvb19zaG9ydCA9ICZydjc3MF9kcG1fdmJsYW5rX3Rvb19zaG9ydCwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZydjc3MF9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJnJ2NzcwX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC0xMzc1LDkgKzEzNjEsOCBAQAogCQkudmJsYW5rX3Rvb19zaG9ydCA9ICZjeXByZXNzX2RwbV92YmxhbmtfdG9vX3Nob3J0LAogCX0sCiAJLnBmbGlwID0gewotCQkucHJlX3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcHJlX3BhZ2VfZmxpcCwKIAkJLnBhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwLAotCQkucG9zdF9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3Bvc3RfcGFnZV9mbGlwLAorCQkucGFnZV9mbGlwX3BlbmRpbmcgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcF9wZW5kaW5nLAogCX0sCiB9OwogCkBAIC0xNDY3LDkgKzE0NTIsOCBAQAogCQkuZm9yY2VfcGVyZm9ybWFuY2VfbGV2ZWwgPSAmc3Vtb19kcG1fZm9yY2VfcGVyZm9ybWFuY2VfbGV2ZWwsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTE1NjAsOSArMTU0NCw4IEBACiAJCS52YmxhbmtfdG9vX3Nob3J0ID0gJmJ0Y19kcG1fdmJsYW5rX3Rvb19zaG9ydCwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApAQCAtMTcwNCw5ICsxNjg3LDggQEAKIAkJLnZibGFua190b29fc2hvcnQgPSAmbmlfZHBtX3ZibGFua190b29fc2hvcnQsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTE4MDUsOSArMTc4Nyw4IEBACiAJCS5lbmFibGVfYmFwbSA9ICZ0cmluaXR5X2RwbV9lbmFibGVfYmFwbSwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApAQCAtMTkzNiw5ICsxOTE3LDggQEAKIAkJLnZibGFua190b29fc2hvcnQgPSAmbmlfZHBtX3ZibGFua190b29fc2hvcnQsCiAJfSwKIAkucGZsaXAgPSB7Ci0JCS5wcmVfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwLAogCQkucGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXAsCi0JCS5wb3N0X3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAsCisJCS5wYWdlX2ZsaXBfcGVuZGluZyA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwX3BlbmRpbmcsCiAJfSwKIH07CiAKQEAgLTIwNDksOCArMjAyOSw4IEBACiAJCS5ibGl0X3JpbmdfaW5kZXggPSBSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWCwKIAkJLmRtYSA9ICZjaWtfY29weV9kbWEsCiAJCS5kbWFfcmluZ19pbmRleCA9IFI2MDBfUklOR19UWVBFX0RNQV9JTkRFWCwKLQkJLmNvcHkgPSAmY2lrX2NvcHlfY3BkbWEsCi0JCS5jb3B5X3JpbmdfaW5kZXggPSBSQURFT05fUklOR19UWVBFX0dGWF9JTkRFWCwKKwkJLmNvcHkgPSAmY2lrX2NvcHlfZG1hLAorCQkuY29weV9yaW5nX2luZGV4ID0gUjYwMF9SSU5HX1RZUEVfRE1BX0lOREVYLAogCX0sCiAJLnN1cmZhY2UgPSB7CiAJCS5zZXRfcmVnID0gcjYwMF9zZXRfc3VyZmFjZV9yZWcsCkBAIC0yMDk5LDkgKzIwNzksOCBAQAogCQkucG93ZXJnYXRlX3V2ZCA9ICZjaV9kcG1fcG93ZXJnYXRlX3V2ZCwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApAQCAtMjIwNCw5ICsyMTgzLDggQEAKIAkJLmVuYWJsZV9iYXBtID0gJmt2X2RwbV9lbmFibGVfYmFwbSwKIAl9LAogCS5wZmxpcCA9IHsKLQkJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCiAJCS5wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcCwKLQkJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKKwkJLnBhZ2VfZmxpcF9wZW5kaW5nID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXBfcGVuZGluZywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCmluZGV4IDNkNTVhM2EuLjAxZTdjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKQEAgLTY3LDcgKzY3LDggQEAKIGludCByMTAwX2FzaWNfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdTMyIHIxMDBfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiB2b2lkIHIxMDBfcGNpX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX3BjaV9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcik7Cit2b2lkIHIxMDBfcGNpX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIGksCisJCQkgICAgdWludDY0X3QgYWRkcik7CiB2b2lkIHIxMDBfcmluZ19zdGFydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9yaW5nICpyaW5nKTsKIGludCByMTAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHIxMDBfaXJxX3Byb2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMTM1LDkgKzEzNiw5IEBACiBleHRlcm4gdm9pZCByMTAwX3BtX2ZpbmlzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByMTAwX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByMTAwX3BtX2dldF9keW5wbV9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByMTAwX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKLWV4dGVybiB1MzIgcjEwMF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCB1NjQgY3J0Y19iYXNlKTsKLWV4dGVybiB2b2lkIHIxMDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK2V4dGVybiB2b2lkIHIxMDBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywKKwkJCSAgIHU2NCBjcnRjX2Jhc2UpOworZXh0ZXJuIGJvb2wgcjEwMF9wYWdlX2ZsaXBfcGVuZGluZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgcjEwMF93YWl0X2Zvcl92Ymxhbmsoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKIGV4dGVybiBpbnQgcjEwMF9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIApAQCAtMTcxLDcgKzE3Miw4IEBACiAJCQkJc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwogZXh0ZXJuIGludCByMzAwX2NzX3BhcnNlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKTsKIGV4dGVybiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF90bGJfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCBydjM3MF9wY2llX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKK2V4dGVybiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgaSwKKwkJCQkgICAgIHVpbnQ2NF90IGFkZHIpOwogZXh0ZXJuIHZvaWQgcnYzNzBfc2V0X3BjaWVfbGFuZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBsYW5lcyk7CiBleHRlcm4gaW50IHJ2MzcwX2dldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHIzMDBfc2V0X3JlZ19zYWZlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTIwNiw3ICsyMDgsOCBAQAogZXh0ZXJuIGludCByczQwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcnM0MDBfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcnM0MDBfZ2FydF90bGJfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNDAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKK3ZvaWQgcnM0MDBfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgaSwKKwkJCSB1aW50NjRfdCBhZGRyKTsKIHVpbnQzMl90IHJzNDAwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJzNDAwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiBpbnQgcnM0MDBfZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTIyOSw3ICsyMzIsOCBAQAogdm9pZCByczYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB1MzIgcnM2MDBfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiB2b2lkIHJzNjAwX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByczYwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcik7Cit2b2lkIHJzNjAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIGksCisJCQkgdWludDY0X3QgYWRkcik7CiB1aW50MzJfdCByczYwMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpOwogdm9pZCByczYwMF9tY193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpOwogdm9pZCByczYwMF9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTI0MSw5ICsyNDUsOSBAQAogZXh0ZXJuIHZvaWQgcnM2MDBfcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByczYwMF9wbV9wcmVwYXJlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJzNjAwX3BtX2ZpbmlzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByczYwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gdTMyIHJzNjAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOwotZXh0ZXJuIHZvaWQgcnM2MDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK2V4dGVybiB2b2lkIHJzNjAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsCisJCQkgICAgdTY0IGNydGNfYmFzZSk7CitleHRlcm4gYm9vbCByczYwMF9wYWdlX2ZsaXBfcGVuZGluZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogdm9pZCByczYwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgYXZpdm9fd2FpdF9mb3JfdmJsYW5rKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IHJzNjAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMzg3LDYgKzM5MSwxMSBAQAogaW50IHI2MDBfYXVkaW9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdHJ1Y3QgcjYwMF9hdWRpb19waW4gcjYwMF9hdWRpb19zdGF0dXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByNjAwX2F1ZGlvX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByNjAwX2F1ZGlvX3NldF9kdG8oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgY2xvY2spOwordm9pZCByNjAwX2hkbWlfdXBkYXRlX2F2aV9pbmZvZnJhbWUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBzaXplKTsKK3ZvaWQgcjYwMF9oZG1pX3VwZGF0ZV9BQ1Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50MzJfdCBjbG9jayk7Cit2b2lkIHI2MDBfaGRtaV9hdWRpb193b3JrYXJvdW5kKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBpbnQgcjYwMF9oZG1pX2J1ZmZlcl9zdGF0dXNfY2hhbmdlZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogdm9pZCByNjAwX2hkbWlfdXBkYXRlX2F1ZGlvX3NldHRpbmdzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiB2b2lkIHI2MDBfaGRtaV9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBib29sIGVuYWJsZSk7CkBAIC00NDcsNyArNDU2LDggQEAKIGludCBydjc3MF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjc3MF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBydjc3MF9wbV9taXNjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXUzMiBydjc3MF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCB1NjQgY3J0Y19iYXNlKTsKK3ZvaWQgcnY3NzBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7Citib29sIHJ2NzcwX3BhZ2VfZmxpcF9wZW5kaW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiB2b2lkIHI3MDBfdnJhbV9ndHRfbG9jYXRpb24oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fbWMgKm1jKTsKIHZvaWQgcjcwMF9jcF9zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjcwMF9jcF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTQ1OCw2ICs0NjgsOCBAQAogdTMyIHJ2NzcwX2dldF94Y2xrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjc3MF9zZXRfdXZkX2Nsb2NrcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHZjbGssIHUzMiBkY2xrKTsKIGludCBydjc3MF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisvKiBoZG1pICovCit2b2lkIGRjZTNfMV9oZG1pX3NldG1vZGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CiAvKiBydjd4eCBwbSAqLwogaW50IHJ2NzcwX2RwbV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjc3MF9kcG1fZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTUxMyw5ICs1MjUsOSBAQAogZXh0ZXJuIHZvaWQgYnRjX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgc3Vtb19zZXRfdXZkX2Nsb2NrcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHZjbGssIHUzMiBkY2xrKTsKIGludCBldmVyZ3JlZW5fc2V0X3V2ZF9jbG9ja3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiB2Y2xrLCB1MzIgZGNsayk7Ci1leHRlcm4gdm9pZCBldmVyZ3JlZW5fcHJlX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHUzMiBldmVyZ3JlZW5fcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7Ci1leHRlcm4gdm9pZCBldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK2V4dGVybiB2b2lkIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLAorCQkJCXU2NCBjcnRjX2Jhc2UpOworZXh0ZXJuIGJvb2wgZXZlcmdyZWVuX3BhZ2VfZmxpcF9wZW5kaW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCBkY2U0X3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogdm9pZCBldmVyZ3JlZW5fZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IGV2ZXJncmVlbl9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwppbmRleCA5YWIzMDk3Li42YTAzNjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCkBAIC02MjYsNyArNjI2LDcgQEAKIAkgICAgdmhkci0+RGV2aWNlSUQgIT0gcmRldi0+cGRldi0+ZGV2aWNlKSB7CiAJCURSTV9JTkZPKCJBQ1BJIFZGQ1QgdGFibGUgaXMgbm90IGZvciB0aGlzIGNhcmRcbiIpOwogCQlnb3RvIG91dF91bm1hcDsKLQl9OworCX0KIAogCWlmICh2ZmN0LT5WQklPU0ltYWdlT2Zmc2V0ICsgc2l6ZW9mKFZGQ1RfSU1BR0VfSEVBREVSKSArIHZoZHItPkltYWdlTGVuZ3RoID4gdGJsX3NpemUpIHsKIAkJRFJNX0VSUk9SKCJBQ1BJIFZGQ1QgaW1hZ2UgdHJ1bmNhdGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCBlYTUwZTBhLi45MzNjNWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00OCw2ICs0OCw3IEBACiAJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAKIAkvKiBpZiB0aGUgY29ubmVjdG9yIGlzIGFscmVhZHkgb2ZmLCBkb24ndCB0dXJuIGl0IGJhY2sgb24gKi8KKwkvKiBGSVhNRTogVGhpcyBhY2Nlc3MgaXNuJ3QgcHJvdGVjdGVkIGJ5IGFueSBsb2Nrcy4gKi8KIAlpZiAoY29ubmVjdG9yLT5kcG1zICE9IERSTV9NT0RFX0RQTVNfT04pCiAJCXJldHVybjsKIApAQCAtMTAwLDYgKzEwMSw3IEBACiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3I7CiAJaW50IGJwYyA9IDg7CisJaW50IG1vZGVfY2xvY2ssIG1heF90bWRzX2Nsb2NrOwogCiAJc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKQEAgLTE0NSw2ICsxNDcsNjEgQEAKIAkJfQogCQlicmVhazsKIAl9CisKKwlpZiAoZHJtX2RldGVjdF9oZG1pX21vbml0b3IocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpIHsKKwkJLyogaGRtaSBkZWVwIGNvbG9yIG9ubHkgaW1wbGVtZW50ZWQgb24gRENFNCsgKi8KKwkJaWYgKChicGMgPiA4KSAmJiAhQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCQlEUk1fREVCVUcoIiVzOiBIRE1JIGRlZXAgY29sb3IgJWQgYnBjIHVuc3VwcG9ydGVkLiBVc2luZyA4IGJwYy5cbiIsCisJCQkJCSAgY29ubmVjdG9yLT5uYW1lLCBicGMpOworCQkJYnBjID0gODsKKwkJfQorCisJCS8qCisJCSAqIFByZSBEQ0UtOCBodyBjYW4ndCBoYW5kbGUgPiAxMiBicGMsIGFuZCBtb3JlIHRoYW4gMTIgYnBjIGRvZXNuJ3QgbWFrZQorCQkgKiBtdWNoIHNlbnNlIHdpdGhvdXQgc3VwcG9ydCBmb3IgPiAxMiBicGMgZnJhbWVidWZmZXJzLiBSR0IgNDo0OjQgYXQKKwkJICogMTIgYnBjIGlzIGFsd2F5cyBzdXBwb3J0ZWQgb24gaGRtaSBkZWVwIGNvbG9yIHNpbmtzLCBhcyB0aGlzIGlzCisJCSAqIHJlcXVpcmVkIGJ5IHRoZSBIRE1JLTEuMyBzcGVjLiBDbGFtcCB0byBhIHNhZmUgMTIgYnBjIG1heGltdW0uCisJCSAqLworCQlpZiAoYnBjID4gMTIpIHsKKwkJCURSTV9ERUJVRygiJXM6IEhETUkgZGVlcCBjb2xvciAlZCBicGMgdW5zdXBwb3J0ZWQuIFVzaW5nIDEyIGJwYy5cbiIsCisJCQkJCSAgY29ubmVjdG9yLT5uYW1lLCBicGMpOworCQkJYnBjID0gMTI7CisJCX0KKworCQkvKiBBbnkgZGVmaW5lZCBtYXhpbXVtIHRtZHMgY2xvY2sgbGltaXQgd2UgbXVzdCBub3QgZXhjZWVkPyAqLworCQlpZiAoY29ubmVjdG9yLT5tYXhfdG1kc19jbG9jayA+IDApIHsKKwkJCS8qIG1vZGVfY2xvY2sgaXMgY2xvY2sgaW4ga0h6IGZvciBtb2RlIHRvIGJlIG1vZGVzZXQgb24gdGhpcyBjb25uZWN0b3IgKi8KKwkJCW1vZGVfY2xvY2sgPSByYWRlb25fY29ubmVjdG9yLT5waXhlbGNsb2NrX2Zvcl9tb2Rlc2V0OworCisJCQkvKiBNYXhpbXVtIGFsbG93YWJsZSBpbnB1dCBjbG9jayBpbiBrSHogKi8KKwkJCW1heF90bWRzX2Nsb2NrID0gY29ubmVjdG9yLT5tYXhfdG1kc19jbG9jayAqIDEwMDA7CisKKwkJCURSTV9ERUJVRygiJXM6IGhkbWkgbW9kZSBkb3RjbG9jayAlZCBrSHosIG1heCB0bWRzIGlucHV0IGNsb2NrICVkIGtIei5cbiIsCisJCQkJCSAgY29ubmVjdG9yLT5uYW1lLCBtb2RlX2Nsb2NrLCBtYXhfdG1kc19jbG9jayk7CisKKwkJCS8qIENoZWNrIGlmIGJwYyBpcyB3aXRoaW4gY2xvY2sgbGltaXQuIFRyeSB0byBkZWdyYWRlIGdyYWNlZnVsbHkgb3RoZXJ3aXNlICovCisJCQlpZiAoKGJwYyA9PSAxMikgJiYgKG1vZGVfY2xvY2sgKiAzLzIgPiBtYXhfdG1kc19jbG9jaykpIHsKKwkJCQlpZiAoKGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmVkaWRfaGRtaV9kY19tb2RlcyAmIERSTV9FRElEX0hETUlfRENfMzApICYmCisJCQkJCShtb2RlX2Nsb2NrICogNS80IDw9IG1heF90bWRzX2Nsb2NrKSkKKwkJCQkJYnBjID0gMTA7CisJCQkJZWxzZQorCQkJCQlicGMgPSA4OworCisJCQkJRFJNX0RFQlVHKCIlczogSERNSSBkZWVwIGNvbG9yIDEyIGJwYyBleGNlZWRzIG1heCB0bWRzIGNsb2NrLiBVc2luZyAlZCBicGMuXG4iLAorCQkJCQkJICBjb25uZWN0b3ItPm5hbWUsIGJwYyk7CisJCQl9CisKKwkJCWlmICgoYnBjID09IDEwKSAmJiAobW9kZV9jbG9jayAqIDUvNCA+IG1heF90bWRzX2Nsb2NrKSkgeworCQkJCWJwYyA9IDg7CisJCQkJRFJNX0RFQlVHKCIlczogSERNSSBkZWVwIGNvbG9yIDEwIGJwYyBleGNlZWRzIG1heCB0bWRzIGNsb2NrLiBVc2luZyAlZCBicGMuXG4iLAorCQkJCQkJICBjb25uZWN0b3ItPm5hbWUsIGJwYyk7CisJCQl9CisJCX0KKwl9CisKKwlEUk1fREVCVUcoIiVzOiBEaXNwbGF5IGJwYz0lZCwgcmV0dXJuZWQgYnBjPSVkXG4iLAorCQkJICBjb25uZWN0b3ItPm5hbWUsIGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYywgYnBjKTsKKwogCXJldHVybiBicGM7CiB9CiAKQEAgLTI2MCwxMyArMzE3LDE3IEBACiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJaWYgKHByaW9yaXR5ID09IHRydWUpIHsKLQkJCQkJRFJNX0RFQlVHX0tNUygiMTogY29uZmxpY3RpbmcgZW5jb2RlcnMgc3dpdGNoaW5nIG9mZiAlc1xuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25mbGljdCkpOwotCQkJCQlEUk1fREVCVUdfS01TKCJpbiBmYXZvciBvZiAlc1xuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygiMTogY29uZmxpY3RpbmcgZW5jb2RlcnMgc3dpdGNoaW5nIG9mZiAlc1xuIiwKKwkJCQkJCSAgICAgIGNvbmZsaWN0LT5uYW1lKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygiaW4gZmF2b3Igb2YgJXNcbiIsCisJCQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOwogCQkJCQljb25mbGljdC0+c3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiAJCQkJCXJhZGVvbl9jb25uZWN0b3JfdXBkYXRlX3NjcmF0Y2hfcmVncyhjb25mbGljdCwgY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCURSTV9ERUJVR19LTVMoIjI6IGNvbmZsaWN0aW5nIGVuY29kZXJzIHN3aXRjaGluZyBvZmYgJXNcbiIsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7Ci0JCQkJCURSTV9ERUJVR19LTVMoImluIGZhdm9yIG9mICVzXG4iLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbmZsaWN0KSk7CisJCQkJCURSTV9ERUJVR19LTVMoIjI6IGNvbmZsaWN0aW5nIGVuY29kZXJzIHN3aXRjaGluZyBvZmYgJXNcbiIsCisJCQkJCQkgICAgICBjb25uZWN0b3ItPm5hbWUpOworCQkJCQlEUk1fREVCVUdfS01TKCJpbiBmYXZvciBvZiAlc1xuIiwKKwkJCQkJCSAgICAgIGNvbmZsaWN0LT5uYW1lKTsKIAkJCQkJY3VycmVudF9zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC03ODcsNyArODQ4LDcgQEAKIAogCQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJCURSTV9FUlJPUigiJXM6IHByb2JlZCBhIG1vbml0b3IgYnV0IG5vfGludmFsaWQgRURJRFxuIiwKLQkJCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQkJY29ubmVjdG9yLT5uYW1lKTsKIAkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCQl9IGVsc2UgewogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+dXNlX2RpZ2l0YWwgPSAhIShyYWRlb25fY29ubmVjdG9yLT5lZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUwpOwpAQCAtMTAxMCwxMiArMTA3MSwxMyBAQAogCiAJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJRFJNX0VSUk9SKCIlczogcHJvYmVkIGEgbW9uaXRvciBidXQgbm98aW52YWxpZCBFRElEXG4iLAotCQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJCQljb25uZWN0b3ItPm5hbWUpOwogCQkJLyogcnM2OTAgc2VlbXMgdG8gaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25uZWN0b3JzIG5vdCBleGlzdGluZyBhbmQgYWx3YXlzCiAJCQkgKiByZXR1cm4gYSBibG9jayBvZiAwJ3MuIElmIHdlIHNlZSB0aGlzIGp1c3Qgc3RvcCBwb2xsaW5nIG9uIHRoaXMgb3V0cHV0ICovCiAJCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNzQwKSAmJiByYWRlb25fY29ubmVjdG9yLT5iYXNlLm51bGxfZWRpZF9jb3VudGVyKSB7CiAJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Ci0JCQkJRFJNX0VSUk9SKCIlczogZGV0ZWN0ZWQgUlM2OTAgZmxvYXRpbmcgYnVzIGJ1Zywgc3RvcHBpbmcgZGRjIGRldGVjdFxuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQlEUk1fRVJST1IoIiVzOiBkZXRlY3RlZCBSUzY5MCBmbG9hdGluZyBidXMgYnVnLCBzdG9wcGluZyBkZGMgZGV0ZWN0XG4iLAorCQkJCQkgIGNvbm5lY3Rvci0+bmFtZSk7CiAJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cyA9IE5VTEw7CiAJCQl9IGVsc2UgewogCQkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwpAQCAtMTM4Nyw3ICsxNDQ5LDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpICYmCi0JICAgIChyZGV2LT5jbG9jay5kcF9leHRjbGsgPj0gNTM5MDApICYmCisJICAgIChyZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGsgPj0gNTM5MDApICYmCiAJICAgIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19oYnIyKGNvbm5lY3RvcikpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggNDFlY2Y4YS4uNzFhMTQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogCQlpZiAocC0+cmluZyA9PSBSNjAwX1JJTkdfVFlQRV9VVkRfSU5ERVggJiYKIAkJICAgIChpID09IDAgfHwgZHJtX3BjaV9kZXZpY2VfaXNfYWdwKHAtPnJkZXYtPmRkZXYpKSkgewogCQkJLyogVE9ETzogaXMgdGhpcyBzdGlsbCBuZWVkZWQgZm9yIE5JKyA/ICovCi0JCQlwLT5yZWxvY3NbaV0uZG9tYWluID0KKwkJCXAtPnJlbG9jc1tpXS5wcmVmZXJlZF9kb21haW5zID0KIAkJCQlSQURFT05fR0VNX0RPTUFJTl9WUkFNOwogCi0JCQlwLT5yZWxvY3NbaV0uYWx0X2RvbWFpbiA9CisJCQlwLT5yZWxvY3NbaV0uYWxsb3dlZF9kb21haW5zID0KIAkJCQlSQURFT05fR0VNX0RPTUFJTl9WUkFNOwogCiAJCQkvKiBwcmlvcml0aXplIHRoaXMgb3ZlciBhbnkgb3RoZXIgcmVsb2NhdGlvbiAqLwpAQCAtMTU4LDEwICsxNTgsMTAgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAotCQkJcC0+cmVsb2NzW2ldLmRvbWFpbiA9IGRvbWFpbjsKKwkJCXAtPnJlbG9jc1tpXS5wcmVmZXJlZF9kb21haW5zID0gZG9tYWluOwogCQkJaWYgKGRvbWFpbiA9PSBSQURFT05fR0VNX0RPTUFJTl9WUkFNKQogCQkJCWRvbWFpbiB8PSBSQURFT05fR0VNX0RPTUFJTl9HVFQ7Ci0JCQlwLT5yZWxvY3NbaV0uYWx0X2RvbWFpbiA9IGRvbWFpbjsKKwkJCXAtPnJlbG9jc1tpXS5hbGxvd2VkX2RvbWFpbnMgPSBkb21haW47CiAJCX0KIAogCQlwLT5yZWxvY3NbaV0udHYuYm8gPSAmcC0+cmVsb2NzW2ldLnJvYmotPnRibzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKaW5kZXggMmNkMTQ0Yy4uMDM2ODZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKQEAgLTEwNTIsNiArMTA1Miw0MyBAQAogCQlyYWRlb25fYWdwbW9kZSA9IDA7CiAJCWJyZWFrOwogCX0KKworCWlmICghcmFkZW9uX2NoZWNrX3BvdF9hcmd1bWVudChyYWRlb25fdm1fc2l6ZSkpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiVk0gc2l6ZSAoJWQpIG11c3QgYmUgYSBwb3dlciBvZiAyXG4iLAorCQkJIHJhZGVvbl92bV9zaXplKTsKKwkJcmFkZW9uX3ZtX3NpemUgPSA0MDk2OworCX0KKworCWlmIChyYWRlb25fdm1fc2l6ZSA8IDQpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiVk0gc2l6ZSAoJWQpIHRvIHNtYWxsLCBtaW4gaXMgNE1CXG4iLAorCQkJIHJhZGVvbl92bV9zaXplKTsKKwkJcmFkZW9uX3ZtX3NpemUgPSA0MDk2OworCX0KKworICAgICAgIC8qCisgICAgICAgICogTWF4IEdQVVZNIHNpemUgZm9yIENheW1hbiwgU0kgYW5kIENJIGFyZSA0MCBiaXRzLgorICAgICAgICAqLworCWlmIChyYWRlb25fdm1fc2l6ZSA+IDEwMjQqMTAyNCkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJWTSBzaXplICglZCkgdG8gbGFyZ2UsIG1heCBpcyAxVEJcbiIsCisJCQkgcmFkZW9uX3ZtX3NpemUpOworCQlyYWRlb25fdm1fc2l6ZSA9IDQwOTY7CisJfQorCisJLyogZGVmaW5lcyBudW1iZXIgb2YgYml0cyBpbiBwYWdlIHRhYmxlIHZlcnN1cyBwYWdlIGRpcmVjdG9yeSwKKwkgKiBhIHBhZ2UgaXMgNEtCIHNvIHdlIGhhdmUgMTIgYml0cyBvZmZzZXQsIG1pbmltdW0gOSBiaXRzIGluIHRoZQorCSAqIHBhZ2UgdGFibGUgYW5kIHRoZSByZW1haW5pbmcgYml0cyBhcmUgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5ICovCisJaWYgKHJhZGVvbl92bV9ibG9ja19zaXplIDwgOSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJWTSBwYWdlIHRhYmxlIHNpemUgKCVkKSB0byBzbWFsbFxuIiwKKwkJCSByYWRlb25fdm1fYmxvY2tfc2l6ZSk7CisJCXJhZGVvbl92bV9ibG9ja19zaXplID0gOTsKKwl9CisKKwlpZiAocmFkZW9uX3ZtX2Jsb2NrX3NpemUgPiAyNCB8fAorCSAgICByYWRlb25fdm1fc2l6ZSA8ICgxdWxsIDw8IHJhZGVvbl92bV9ibG9ja19zaXplKSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJWTSBwYWdlIHRhYmxlIHNpemUgKCVkKSB0byBsYXJnZVxuIiwKKwkJCSByYWRlb25fdm1fYmxvY2tfc2l6ZSk7CisJCXJhZGVvbl92bV9ibG9ja19zaXplID0gOTsKKwl9CiB9CiAKIC8qKgpAQCAtMTEyNiwxMiArMTE2MywxMyBAQAogc3RhdGljIGJvb2wgcmFkZW9uX3N3aXRjaGVyb29fY2FuX3N3aXRjaChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWJvb2wgY2FuX3N3aXRjaDsKIAotCXNwaW5fbG9jaygmZGV2LT5jb3VudF9sb2NrKTsKLQljYW5fc3dpdGNoID0gKGRldi0+b3Blbl9jb3VudCA9PSAwKTsKLQlzcGluX3VubG9jaygmZGV2LT5jb3VudF9sb2NrKTsKLQlyZXR1cm4gY2FuX3N3aXRjaDsKKwkvKgorCSAqIEZJWE1FOiBvcGVuX2NvdW50IGlzIHByb3RlY3RlZCBieSBkcm1fZ2xvYmFsX211dGV4IGJ1dCB0aGF0IHdvdWxkIGxlYWQgdG8KKwkgKiBsb2NraW5nIGludmVyc2lvbiB3aXRoIHRoZSBkcml2ZXIgbG9hZCBwYXRoLiBBbmQgdGhlIGFjY2VzcyBoZXJlIGlzCisJICogY29tcGxldGVseSByYWN5IGFueXdheS4gU28gZG9uJ3QgYm90aGVyIHdpdGggbG9ja2luZyBmb3Igbm93LgorCSAqLworCXJldHVybiBkZXYtPm9wZW5fY291bnQgPT0gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19jbGllbnRfb3BzIHJhZGVvbl9zd2l0Y2hlcm9vX29wcyA9IHsKQEAgLTExOTYsMTcgKzEyMzQsMTYgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKKwlyYWRlb25fY2hlY2tfYXJndW1lbnRzKHJkZXYpOwogCS8qIEFkanVzdCBWTSBzaXplIGhlcmUuCi0JICogQ3VycmVudGx5IHNldCB0byA0R0IgKCgxIDw8IDIwKSA0ayBwYWdlcykuCi0JICogTWF4IEdQVVZNIHNpemUgZm9yIGNheW1hbiBhbmQgU0kgaXMgNDAgYml0cy4KKwkgKiBNYXggR1BVVk0gc2l6ZSBmb3IgY2F5bWFuKyBpcyA0MCBiaXRzLgogCSAqLwotCXJkZXYtPnZtX21hbmFnZXIubWF4X3BmbiA9IDEgPDwgMjA7CisJcmRldi0+dm1fbWFuYWdlci5tYXhfcGZuID0gcmFkZW9uX3ZtX3NpemUgPDwgODsKIAogCS8qIFNldCBhc2ljIGZ1bmN0aW9ucyAqLwogCXIgPSByYWRlb25fYXNpY19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKLQlyYWRlb25fY2hlY2tfYXJndW1lbnRzKHJkZXYpOwogCiAJLyogYWxsIG9mIHRoZSBuZXdlciBJR1AgY2hpcHMgaGF2ZSBhbiBpbnRlcm5hbCBnYXJ0CiAJICogSG93ZXZlciBzb21lIHJzNHh4IHJlcG9ydCBhcyBBR1AsIHNvIHJlbW92ZSB0aGF0IGhlcmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggMzU2YjczM2MuLjVlZDYxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKQEAgLTI0OSwxNiArMjQ5LDIxIEBACiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOwogCiAJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShyYWRlb25fY3J0Yy0+ZmxpcF9xdWV1ZSk7CiAJa2ZyZWUocmFkZW9uX2NydGMpOwogfQogCi0vKgotICogSGFuZGxlIHVucGluIGV2ZW50cyBvdXRzaWRlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBwcm9wZXIuCisvKioKKyAqIHJhZGVvbl91bnBpbl93b3JrX2Z1bmMgLSB1bnBpbiBvbGQgYnVmZmVyIG9iamVjdAorICoKKyAqIEBfX3dvcmsgLSBrZXJuZWwgd29yayBpdGVtCisgKgorICogVW5waW4gdGhlIG9sZCBmcmFtZSBidWZmZXIgb2JqZWN0IG91dHNpZGUgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyCiAgKi8KIHN0YXRpYyB2b2lkIHJhZGVvbl91bnBpbl93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpfX3dvcmspCiB7Ci0Jc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp3b3JrID0KLQkJY29udGFpbmVyX29mKF9fd29yaywgc3RydWN0IHJhZGVvbl91bnBpbl93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgcmFkZW9uX2ZsaXBfd29yayAqd29yayA9CisJCWNvbnRhaW5lcl9vZihfX3dvcmssIHN0cnVjdCByYWRlb25fZmxpcF93b3JrLCB1bnBpbl93b3JrKTsKIAlpbnQgcjsKIAogCS8qIHVucGluIG9mIHRoZSBvbGQgYnVmZmVyICovCkBAIC0yNzYsMTAgKzI4MSwxMCBAQAogCWtmcmVlKHdvcmspOwogfQogCi12b2lkIHJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCkKK3ZvaWQgcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQpCiB7CiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKLQlzdHJ1Y3QgcmFkZW9uX3VucGluX3dvcmsgKndvcms7CisJc3RydWN0IHJhZGVvbl9mbGlwX3dvcmsgKndvcms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdXBkYXRlX3BlbmRpbmc7CiAJaW50IHZwb3MsIGhwb3M7CkBAIC0yODksMjQgKzI5NCwxMyBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCXdvcmsgPSByYWRlb25fY3J0Yy0+dW5waW5fd29yazsKLQlpZiAod29yayA9PSBOVUxMIHx8Ci0JICAgICh3b3JrLT5mZW5jZSAmJiAhcmFkZW9uX2ZlbmNlX3NpZ25hbGVkKHdvcmstPmZlbmNlKSkpIHsKKwl3b3JrID0gcmFkZW9uX2NydGMtPmZsaXBfd29yazsKKwlpZiAod29yayA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmRkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQkvKiBOZXcgcGFnZWZsaXAsIG9yIGp1c3QgY29tcGxldGlvbiBvZiBhIHByZXZpb3VzIG9uZT8gKi8KLQlpZiAoIXJhZGVvbl9jcnRjLT5kZWZlcnJlZF9mbGlwX2NvbXBsZXRpb24pIHsKLQkJLyogZG8gdGhlIGZsaXAgKG1taW8pICovCi0JCXVwZGF0ZV9wZW5kaW5nID0gcmFkZW9uX3BhZ2VfZmxpcChyZGV2LCBjcnRjX2lkLCB3b3JrLT5uZXdfY3J0Y19iYXNlKTsKLQl9IGVsc2UgewotCQkvKiBUaGlzIGlzIGp1c3QgYSBjb21wbGV0aW9uIG9mIGEgZmxpcCBxdWV1ZWQgaW4gY3J0YwotCQkgKiBhdCBsYXN0IGludm9jYXRpb24uIE1ha2Ugc3VyZSB3ZSBnbyBkaXJlY3RseSB0bwotCQkgKiBjb21wbGV0aW9uIHJvdXRpbmUuCi0JCSAqLwotCQl1cGRhdGVfcGVuZGluZyA9IDA7Ci0JCXJhZGVvbl9jcnRjLT5kZWZlcnJlZF9mbGlwX2NvbXBsZXRpb24gPSAwOwotCX0KKworCXVwZGF0ZV9wZW5kaW5nID0gcmFkZW9uX3BhZ2VfZmxpcF9wZW5kaW5nKHJkZXYsIGNydGNfaWQpOwogCiAJLyogSGFzIHRoZSBwYWdlZmxpcCBhbHJlYWR5IGNvbXBsZXRlZCBpbiBjcnRjLCBvciBpcyBpdCBjZXJ0YWluCiAJICogdG8gY29tcGxldGUgaW4gdGhpcyB2Ymxhbms/CkBAIC0zMjQsMTkgKzMxOCwzOCBAQAogCQkgKi8KIAkJdXBkYXRlX3BlbmRpbmcgPSAwOwogCX0KLQlpZiAodXBkYXRlX3BlbmRpbmcpIHsKLQkJLyogY3J0YyBkaWRuJ3QgZmxpcCBpbiB0aGlzIHRhcmdldCB2YmxhbmsgaW50ZXJ2YWwsCi0JCSAqIGJ1dCBmbGlwIGlzIHBlbmRpbmcgaW4gY3J0Yy4gSXQgd2lsbCBjb21wbGV0ZSBpdAotCQkgKiBpbiBuZXh0IHZibGFuayBpbnRlcnZhbCwgc28gY29tcGxldGUgdGhlIGZsaXAgYXQKLQkJICogbmV4dCB2YmxhbmsgaXJxLgotCQkgKi8KLQkJcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbiA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWlmICghdXBkYXRlX3BlbmRpbmcpCisJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIGNydGNfaWQpOworfQorCisvKioKKyAqIHJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwIC0gcGFnZSBmbGlwIGNvbXBsZXRlZAorICoKKyAqIEByZGV2OiByYWRlb24gZGV2aWNlIHBvaW50ZXIKKyAqIEBjcnRjX2lkOiBjcnRjIG51bWJlciB0aGlzIGV2ZW50IGlzIGZvcgorICoKKyAqIENhbGxlZCB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgYSBwYWdlIGZsaXAgZm9yIHRoaXMgY3J0YyBpcyBjb21wbGV0ZWQuCisgKi8KK3ZvaWQgcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CisJc3RydWN0IHJhZGVvbl9mbGlwX3dvcmsgKndvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHRoaXMgY2FuIGhhcHBlbiBhdCBpbml0ICovCisJaWYgKHJhZGVvbl9jcnRjID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5kZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJd29yayA9IHJhZGVvbl9jcnRjLT5mbGlwX3dvcms7CisJaWYgKHdvcmsgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5kZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBQYWdlZmxpcCAod2lsbCBiZSkgY2VydGFpbmx5IGNvbXBsZXRlZCBpbiB0aGlzIHZibGFuay4gQ2xlYW4gdXAuICovCi0JcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSBOVUxMOworCS8qIFBhZ2VmbGlwIGNvbXBsZXRlZC4gQ2xlYW4gdXAuICovCisJcmFkZW9uX2NydGMtPmZsaXBfd29yayA9IE5VTEw7CiAKIAkvKiB3YWtldXAgdXNlcnNwYWNlICovCiAJaWYgKHdvcmstPmV2ZW50KQpAQCAtMzQ0LDg2ICszNTcsNzEgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmRkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAotCWRybV92YmxhbmtfcHV0KHJkZXYtPmRkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKIAlyYWRlb25fZmVuY2VfdW5yZWYoJndvcmstPmZlbmNlKTsKLQlyYWRlb25fcG9zdF9wYWdlX2ZsaXAod29yay0+cmRldiwgd29yay0+Y3J0Y19pZCk7Ci0Jc2NoZWR1bGVfd29yaygmd29yay0+d29yayk7CisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX2dldChyZGV2LCB3b3JrLT5jcnRjX2lkKTsKKwlxdWV1ZV93b3JrKHJhZGVvbl9jcnRjLT5mbGlwX3F1ZXVlLCAmd29yay0+dW5waW5fd29yayk7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCi0JCQkJIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50LAotCQkJCSB1aW50MzJfdCBwYWdlX2ZsaXBfZmxhZ3MpCisvKioKKyAqIHJhZGVvbl9mbGlwX3dvcmtfZnVuYyAtIHBhZ2UgZmxpcCBmcmFtZWJ1ZmZlcgorICoKKyAqIEB3b3JrIC0ga2VybmVsIHdvcmsgaXRlbQorICoKKyAqIFdhaXQgZm9yIHRoZSBidWZmZXIgb2JqZWN0IHRvIGJlY29tZSBpZGxlIGFuZCBkbyB0aGUgYWN0dWFsIHBhZ2UgZmxpcAorICovCitzdGF0aWMgdm9pZCByYWRlb25fZmxpcF93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpfX3dvcmspCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOwotCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKm9sZF9yYWRlb25fZmI7Ci0Jc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlciAqbmV3X3JhZGVvbl9mYjsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgcmFkZW9uX2JvICpyYm87Ci0Jc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp3b3JrOworCXN0cnVjdCByYWRlb25fZmxpcF93b3JrICp3b3JrID0KKwkJY29udGFpbmVyX29mKF9fd29yaywgc3RydWN0IHJhZGVvbl9mbGlwX3dvcmssIGZsaXBfd29yayk7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSB3b3JrLT5yZGV2OworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3Nbd29yay0+Y3J0Y19pZF07CisKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmcmFkZW9uX2NydGMtPmJhc2U7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSB3b3JrLT5mYjsKKworCXVpbnQzMl90IHRpbGluZ19mbGFncywgcGl0Y2hfcGl4ZWxzOworCXVpbnQ2NF90IGJhc2U7CisKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB0aWxpbmdfZmxhZ3MsIHBpdGNoX3BpeGVsczsKLQl1NjQgYmFzZTsKIAlpbnQgcjsKIAotCXdvcmsgPSBremFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdvcmsgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGRvd25fcmVhZCgmcmRldi0+ZXhjbHVzaXZlX2xvY2spOworCXdoaWxlICh3b3JrLT5mZW5jZSkgeworCQlyID0gcmFkZW9uX2ZlbmNlX3dhaXQod29yay0+ZmVuY2UsIGZhbHNlKTsKKwkJaWYgKHIgPT0gLUVERUFETEspIHsKKwkJCXVwX3JlYWQoJnJkZXYtPmV4Y2x1c2l2ZV9sb2NrKTsKKwkJCXIgPSByYWRlb25fZ3B1X3Jlc2V0KHJkZXYpOworCQkJZG93bl9yZWFkKCZyZGV2LT5leGNsdXNpdmVfbG9jayk7CisJCX0KIAotCXdvcmstPmV2ZW50ID0gZXZlbnQ7Ci0Jd29yay0+cmRldiA9IHJkZXY7Ci0Jd29yay0+Y3J0Y19pZCA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCW9sZF9yYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoY3J0Yy0+cHJpbWFyeS0+ZmIpOwotCW5ld19yYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoZmIpOwotCS8qIHNjaGVkdWxlIHVucGluIG9mIHRoZSBvbGQgYnVmZmVyICovCi0Jb2JqID0gb2xkX3JhZGVvbl9mYi0+b2JqOwotCS8qIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBvYmplY3QgKi8KLQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uob2JqKTsKLQlyYm8gPSBnZW1fdG9fcmFkZW9uX2JvKG9iaik7Ci0Jd29yay0+b2xkX3JibyA9IHJibzsKLQlvYmogPSBuZXdfcmFkZW9uX2ZiLT5vYmo7Ci0JcmJvID0gZ2VtX3RvX3JhZGVvbl9ibyhvYmopOwotCi0Jc3Bpbl9sb2NrKCZyYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKLQlpZiAocmJvLT50Ym8uc3luY19vYmopCi0JCXdvcmstPmZlbmNlID0gcmFkZW9uX2ZlbmNlX3JlZihyYm8tPnRiby5zeW5jX29iaik7Ci0Jc3Bpbl91bmxvY2soJnJiby0+dGJvLmJkZXYtPmZlbmNlX2xvY2spOwotCi0JSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCByYWRlb25fdW5waW5fd29ya19mdW5jKTsKLQotCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIHVucGluX3dvcmsgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JaWYgKHJhZGVvbl9jcnRjLT51bnBpbl93b3JrKSB7Ci0JCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKLQkJciA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2tfZnJlZTsKKwkJaWYgKHIpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHdhaXQgb24gcGFnZSBmbGlwIGZlbmNlICglZCkhXG4iLAorCQkJCSAgcik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0gZWxzZQorCQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZ3b3JrLT5mZW5jZSk7CiAJfQotCXJhZGVvbl9jcnRjLT51bnBpbl93b3JrID0gd29yazsKLQlyYWRlb25fY3J0Yy0+ZGVmZXJyZWRfZmxpcF9jb21wbGV0aW9uID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAogCS8qIHBpbiB0aGUgbmV3IGJ1ZmZlciAqLwogCURSTV9ERUJVR19EUklWRVIoImZsaXAtaW9jdGwoKSBjdXJfZmJvID0gJXAsIGN1cl9iYm8gPSAlcFxuIiwKLQkJCSB3b3JrLT5vbGRfcmJvLCByYm8pOworCQkJIHdvcmstPm9sZF9yYm8sIHdvcmstPm5ld19yYm8pOwogCi0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJibywgZmFsc2UpOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZSh3b3JrLT5uZXdfcmJvLCBmYWxzZSk7CiAJaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVzZXJ2ZSBuZXcgcmJvIGJ1ZmZlciBiZWZvcmUgZmxpcFxuIik7Ci0JCWdvdG8gcGZsaXBfY2xlYW51cDsKKwkJZ290byBjbGVhbnVwOwogCX0KIAkvKiBPbmx5IDI3IGJpdCBvZmZzZXQgZm9yIGxlZ2FjeSBDUlRDICovCi0JciA9IHJhZGVvbl9ib19waW5fcmVzdHJpY3RlZChyYm8sIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJciA9IHJhZGVvbl9ib19waW5fcmVzdHJpY3RlZCh3b3JrLT5uZXdfcmJvLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAogCQkJCSAgICAgQVNJQ19JU19BVklWTyhyZGV2KSA/IDAgOiAxIDw8IDI3LCAmYmFzZSk7CiAJaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKLQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHdvcmstPm5ld19yYm8pOwogCQlyID0gLUVJTlZBTDsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIG5ldyByYm8gYnVmZmVyIGJlZm9yZSBmbGlwXG4iKTsKLQkJZ290byBwZmxpcF9jbGVhbnVwOworCQlnb3RvIGNsZWFudXA7CiAJfQotCXJhZGVvbl9ib19nZXRfdGlsaW5nX2ZsYWdzKHJibywgJnRpbGluZ19mbGFncywgTlVMTCk7Ci0JcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCXJhZGVvbl9ib19nZXRfdGlsaW5nX2ZsYWdzKHdvcmstPm5ld19yYm8sICZ0aWxpbmdfZmxhZ3MsIE5VTEwpOworCXJhZGVvbl9ib191bnJlc2VydmUod29yay0+bmV3X3Jibyk7CiAKIAlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikpIHsKIAkJLyogY3J0YyBvZmZzZXQgaXMgZnJvbSBkaXNwbGF5IGJhc2UgYWRkciBub3QgRkIgbG9jYXRpb24gKi8KQEAgLTQ2MSw0NCArNDU5LDkxIEBACiAJCWJhc2UgJj0gfjc7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCXdvcmstPm5ld19jcnRjX2Jhc2UgPSBiYXNlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIGZsaXBfd29yayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgcHJvcGVyIGludGVycnVwdCAqLworCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQocmRldiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCisJLyogZG8gdGhlIGZsaXAgKG1taW8pICovCisJcmFkZW9uX3BhZ2VfZmxpcChyZGV2LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCwgYmFzZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwl1cF9yZWFkKCZyZGV2LT5leGNsdXNpdmVfbG9jayk7CisKKwlyZXR1cm47CisKK2NsZWFudXA6CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJndvcmstPm9sZF9yYm8tPmdlbV9iYXNlKTsKKwlyYWRlb25fZmVuY2VfdW5yZWYoJndvcmstPmZlbmNlKTsKKwlrZnJlZSh3b3JrKTsKKwl1cF9yZWFkKCZyZGV2LT5leGNsdXNpdmVfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50LAorCQkJCSB1aW50MzJfdCBwYWdlX2ZsaXBfZmxhZ3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOworCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKm9sZF9yYWRlb25fZmI7CisJc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlciAqbmV3X3JhZGVvbl9mYjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2ZsaXBfd29yayAqd29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd29yayA9IGt6YWxsb2Moc2l6ZW9mICp3b3JrLCBHRlBfS0VSTkVMKTsKKwlpZiAod29yayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfV09SSygmd29yay0+ZmxpcF93b3JrLCByYWRlb25fZmxpcF93b3JrX2Z1bmMpOworCUlOSVRfV09SSygmd29yay0+dW5waW5fd29yaywgcmFkZW9uX3VucGluX3dvcmtfZnVuYyk7CisKKwl3b3JrLT5yZGV2ID0gcmRldjsKKwl3b3JrLT5jcnRjX2lkID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJd29yay0+ZmIgPSBmYjsKKwl3b3JrLT5ldmVudCA9IGV2ZW50OworCisJLyogc2NoZWR1bGUgdW5waW4gb2YgdGhlIG9sZCBidWZmZXIgKi8KKwlvbGRfcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGNydGMtPnByaW1hcnktPmZiKTsKKwlvYmogPSBvbGRfcmFkZW9uX2ZiLT5vYmo7CisKKwkvKiB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgb2JqZWN0ICovCisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CisJd29yay0+b2xkX3JibyA9IGdlbV90b19yYWRlb25fYm8ob2JqKTsKKworCW5ld19yYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoZmIpOworCW9iaiA9IG5ld19yYWRlb25fZmItPm9iajsKKwl3b3JrLT5uZXdfcmJvID0gZ2VtX3RvX3JhZGVvbl9ibyhvYmopOworCisJc3Bpbl9sb2NrKCZ3b3JrLT5uZXdfcmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7CisJaWYgKHdvcmstPm5ld19yYm8tPnRiby5zeW5jX29iaikKKwkJd29yay0+ZmVuY2UgPSByYWRlb25fZmVuY2VfcmVmKHdvcmstPm5ld19yYm8tPnRiby5zeW5jX29iaik7CisJc3Bpbl91bmxvY2soJndvcmstPm5ld19yYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKKworCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIGZsaXBfd29yayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWlmIChyYWRlb25fY3J0Yy0+ZmxpcF93b3JrKSB7CisJCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZ3b3JrLT5vbGRfcmJvLT5nZW1fYmFzZSk7CisJCXJhZGVvbl9mZW5jZV91bnJlZigmd29yay0+ZmVuY2UpOworCQlrZnJlZSh3b3JrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmFkZW9uX2NydGMtPmZsaXBfd29yayA9IHdvcms7CiAKIAkvKiB1cGRhdGUgY3J0YyBmYiAqLwogCWNydGMtPnByaW1hcnktPmZiID0gZmI7CiAKLQlyID0gZHJtX3ZibGFua19nZXQoZGV2LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7Ci0JaWYgKHIpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IHZibGFuayBiZWZvcmUgZmxpcFxuIik7Ci0JCWdvdG8gcGZsaXBfY2xlYW51cDE7Ci0JfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNydGMtPmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCi0JLyogc2V0IHRoZSBwcm9wZXIgaW50ZXJydXB0ICovCi0JcmFkZW9uX3ByZV9wYWdlX2ZsaXAocmRldiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCXF1ZXVlX3dvcmsocmFkZW9uX2NydGMtPmZsaXBfcXVldWUsICZ3b3JrLT5mbGlwX3dvcmspOwogCiAJcmV0dXJuIDA7Ci0KLXBmbGlwX2NsZWFudXAxOgotCWlmICh1bmxpa2VseShyYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKSAhPSAwKSkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXNlcnZlIG5ldyByYm8gaW4gZXJyb3IgcGF0aFxuIik7Ci0JCWdvdG8gcGZsaXBfY2xlYW51cDsKLQl9Ci0JaWYgKHVubGlrZWx5KHJhZGVvbl9ib191bnBpbihyYm8pICE9IDApKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIHVucGluIG5ldyByYm8gaW4gZXJyb3IgcGF0aFxuIik7Ci0JfQotCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKLQotcGZsaXBfY2xlYW51cDoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSBOVUxMOwotdW5sb2NrX2ZyZWU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2xkX3JhZGVvbl9mYi0+b2JqKTsKLQlyYWRlb25fZmVuY2VfdW5yZWYoJndvcmstPmZlbmNlKTsKLQlrZnJlZSh3b3JrKTsKLQotCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50CkBAIC01NjgsNiArNjEzLDcgQEAKIAogCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoJnJhZGVvbl9jcnRjLT5iYXNlLCAyNTYpOwogCXJhZGVvbl9jcnRjLT5jcnRjX2lkID0gaW5kZXg7CisJcmFkZW9uX2NydGMtPmZsaXBfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicmFkZW9uLWNydGMiKTsKIAlyZGV2LT5tb2RlX2luZm8uY3J0Y3NbaW5kZXhdID0gcmFkZW9uX2NydGM7CiAKIAlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfQk9OQUlSRSkgewpAQCAtNjYxLDcgKzcwNyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CiAJCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJCURSTV9JTkZPKCJDb25uZWN0b3IgJWQ6XG4iLCBpKTsKLQkJRFJNX0lORk8oIiAgJXNcbiIsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCURSTV9JTkZPKCIgICVzXG4iLCBjb25uZWN0b3ItPm5hbWUpOwogCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCAhPSBSQURFT05fSFBEX05PTkUpCiAJCQlEUk1fSU5GTygiICAlc1xuIiwgaHBkX25hbWVzW3JhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGRdKTsKIAkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggYzAwYTJmNS4uNmUzMDE3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTgxLDkgKzgxLDEwIEBACiAgKiAgIDIuMzcuMCAtIGFsbG93IEdTIHJpbmcgc2V0dXAgb24gcjZ4eC9yN3h4CiAgKiAgIDIuMzguMCAtIFJBREVPTl9HRU1fT1AgKEdFVF9JTklUSUFMX0RPTUFJTiwgU0VUX0lOSVRJQUxfRE9NQUlOKSwKICAqICAgICAgICAgICAgQ0lLOiAxRCBhbmQgbGluZWFyIHRpbGluZyBtb2RlcyBjb250YWluIHZhbGlkIFBJUEVfQ09ORklHCisgKiAgIDIuMzkuMCAtIEFkZCBJTkZPIHF1ZXJ5IGZvciBudW1iZXIgb2YgYWN0aXZlIENVcwogICovCiAjZGVmaW5lIEtNU19EUklWRVJfTUFKT1IJMgotI2RlZmluZSBLTVNfRFJJVkVSX01JTk9SCTM4CisjZGVmaW5lIEtNU19EUklWRVJfTUlOT1IJMzkKICNkZWZpbmUgS01TX0RSSVZFUl9QQVRDSExFVkVMCTAKIGludCByYWRlb25fZHJpdmVyX2xvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogaW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTE3Miw2ICsxNzMsOCBAQAogaW50IHJhZGVvbl9hc3BtID0gLTE7CiBpbnQgcmFkZW9uX3J1bnRpbWVfcG0gPSAtMTsKIGludCByYWRlb25faGFyZF9yZXNldCA9IDA7CitpbnQgcmFkZW9uX3ZtX3NpemUgPSA0MDk2OworaW50IHJhZGVvbl92bV9ibG9ja19zaXplID0gOTsKIAogTU9EVUxFX1BBUk1fREVTQyhub193YiwgIkRpc2FibGUgQUdQIHdyaXRlYmFjayBmb3Igc2NyYXRjaCByZWdpc3RlcnMiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChub193YiwgcmFkZW9uX25vX3diLCBpbnQsIDA0NDQpOwpAQCAtMjM5LDYgKzI0MiwxMiBAQAogTU9EVUxFX1BBUk1fREVTQyhoYXJkX3Jlc2V0LCAiUENJIGNvbmZpZyByZXNldCAoMSA9IGZvcmNlIGVuYWJsZSwgMCA9IGRpc2FibGUgKGRlZmF1bHQpKSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKGhhcmRfcmVzZXQsIHJhZGVvbl9oYXJkX3Jlc2V0LCBpbnQsIDA0NDQpOwogCitNT0RVTEVfUEFSTV9ERVNDKHZtX3NpemUsICJWTSBhZGRyZXNzIHNwYWNlIHNpemUgaW4gbWVnYWJ5dGVzIChkZWZhdWx0IDRHQikiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh2bV9zaXplLCByYWRlb25fdm1fc2l6ZSwgaW50LCAwNDQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyh2bV9ibG9ja19zaXplLCAiVk0gcGFnZSB0YWJsZSBzaXplIGluIGJpdHMgKGRlZmF1bHQgOSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh2bV9ibG9ja19zaXplLCByYWRlb25fdm1fYmxvY2tfc2l6ZSwgaW50LCAwNDQ0KTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXJhZGVvbl9QQ0lfSURTCiB9OwpAQCAtNTE5LDcgKzUyOCw2IEBACiAJICAgIERSSVZFUl9VU0VfQUdQIHwKIAkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfCBEUklWRVJfR0VNIHwKIAkgICAgRFJJVkVSX1BSSU1FIHwgRFJJVkVSX1JFTkRFUiwKLQkuZGV2X3ByaXZfc2l6ZSA9IDAsCiAJLmxvYWQgPSByYWRlb25fZHJpdmVyX2xvYWRfa21zLAogCS5vcGVuID0gcmFkZW9uX2RyaXZlcl9vcGVuX2ttcywKIAkucHJlY2xvc2UgPSByYWRlb25fZHJpdmVyX3ByZWNsb3NlX2ttcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCmluZGV4IGE3N2IxYzEuLjkxMzc4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwpAQCAtODE5LDE1ICs4MTksMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiByYWRlb25fZGVidWdmc19ncHVfcmVzZXQgLSBtYW51YWxseSB0cmlnZ2VyIGEgZ3B1IHJlc2V0CisgKgorICogTWFudWFsbHkgdHJpZ2dlciBhIGdwdSByZXNldCBhdCB0aGUgbmV4dCBmZW5jZSB3YWl0LgorICovCitzdGF0aWMgaW50IHJhZGVvbl9kZWJ1Z2ZzX2dwdV9yZXNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkb3duX3JlYWQoJnJkZXYtPmV4Y2x1c2l2ZV9sb2NrKTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgcmRldi0+bmVlZHNfcmVzZXQpOworCXJkZXYtPm5lZWRzX3Jlc2V0ID0gdHJ1ZTsKKwl1cF9yZWFkKCZyZGV2LT5leGNsdXNpdmVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkcm1faW5mb19saXN0IHJhZGVvbl9kZWJ1Z2ZzX2ZlbmNlX2xpc3RbXSA9IHsKIAl7InJhZGVvbl9mZW5jZV9pbmZvIiwgJnJhZGVvbl9kZWJ1Z2ZzX2ZlbmNlX2luZm8sIDAsIE5VTEx9LAorCXsicmFkZW9uX2dwdV9yZXNldCIsICZyYWRlb25fZGVidWdmc19ncHVfcmVzZXQsIDAsIE5VTEx9CiB9OwogI2VuZGlmCiAKIGludCByYWRlb25fZGVidWdmc19mZW5jZV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQotCXJldHVybiByYWRlb25fZGVidWdmc19hZGRfZmlsZXMocmRldiwgcmFkZW9uX2RlYnVnZnNfZmVuY2VfbGlzdCwgMSk7CisJcmV0dXJuIHJhZGVvbl9kZWJ1Z2ZzX2FkZF9maWxlcyhyZGV2LCByYWRlb25fZGVidWdmc19mZW5jZV9saXN0LCAyKTsKICNlbHNlCiAJcmV0dXJuIDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faTJjLmMKaW5kZXggN2I5NDQxNC4uYWRkNjIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faTJjLmMKQEAgLTk0LDYgKzk0LDggQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMgPSAmaTJjLT5yZWM7CiAJdWludDMyX3QgdGVtcDsKIAorCW11dGV4X2xvY2soJmkyYy0+bXV0ZXgpOworCiAJLyogUlY0MTAgYXBwZWFycyB0byBoYXZlIGEgYnVnIHdoZXJlIHRoZSBodyBpMmMgaW4gcmVzZXQKIAkgKiBob2xkcyB0aGUgaTJjIHBvcnQgaW4gYSBiYWQgc3RhdGUgLSBzd2l0Y2ggaHcgaTJjIGF3YXkgYmVmb3JlCiAJICogZG9pbmcgRERDIC0gZG8gdGhpcyBmb3IgYWxsIHIyMDBzL3IzMDBzL3I0MDBzIGZvciBzYWZldHkgc2FrZQpAQCAtMTcwLDYgKzE3Miw4IEBACiAJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpICYgfnJlYy0+bWFza19kYXRhX21hc2s7CiAJV1JFRzMyKHJlYy0+bWFza19kYXRhX3JlZywgdGVtcCk7CiAJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpOworCisJbXV0ZXhfdW5sb2NrKCZpMmMtPm11dGV4KTsKIH0KIAogc3RhdGljIGludCBnZXRfY2xvY2sodm9pZCAqaTJjX3ByaXYpCkBAIC04MTMsNiArODE3LDggQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMgPSAmaTJjLT5yZWM7CiAJaW50IHJldCA9IDA7CiAKKwltdXRleF9sb2NrKCZpMmMtPm11dGV4KTsKKwogCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJY2FzZSBDSElQX1IxMDA6CiAJY2FzZSBDSElQX1JWMTAwOgpAQCAtODc5LDYgKzg4NSw4IEBACiAJCWJyZWFrOwogCX0KIAorCW11dGV4X3VubG9jaygmaTJjLT5tdXRleCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MTksNiArOTI3LDcgQEAKIAlpMmMtPmFkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPnBkZXYtPmRldjsKIAlpMmMtPmRldiA9IGRldjsKIAlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXB0ZXIsIGkyYyk7CisJbXV0ZXhfaW5pdCgmaTJjLT5tdXRleCk7CiAJaWYgKHJlYy0+bW1faTJjIHx8CiAJICAgIChyZWMtPmh3X2NhcGFibGUgJiYKIAkgICAgIHJhZGVvbl9od19pMmMgJiYKQEAgLTk3OSw3ICs5ODgsNyBAQAogCQlyZXR1cm47CiAJaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXB0ZXIpOwogCWlmIChpMmMtPmhhc19hdXgpCi0JCWRybV9kcF9hdXhfdW5yZWdpc3Rlcl9pMmNfYnVzKCZpMmMtPmF1eCk7CisJCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmaTJjLT5hdXgpOwogCWtmcmVlKGkyYyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pb2MzMi5jCmluZGV4IGJkYjBmOTMuLjBiOThlYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lvYzMyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faW9jMzIuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKIAkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOwogCi0JaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKHJhZGVvbl9jb21wYXRfaW9jdGxzKSkKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgQVJSQVlfU0laRShyYWRlb25fY29tcGF0X2lvY3RscykpCiAJCWZuID0gcmFkZW9uX2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKIAogCWlmIChmbiAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCmluZGV4IDA4OWM5ZmYuLjE2ODA3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKQEAgLTI4Nyw3ICsyODcsNyBAQAogCUlOSVRfV09SSygmcmRldi0+cmVzZXRfd29yaywgcmFkZW9uX2lycV9yZXNldF93b3JrX2Z1bmMpOwogCiAJcmRldi0+aXJxLmluc3RhbGxlZCA9IHRydWU7Ci0JciA9IGRybV9pcnFfaW5zdGFsbChyZGV2LT5kZGV2KTsKKwlyID0gZHJtX2lycV9pbnN0YWxsKHJkZXYtPmRkZXYsIHJkZXYtPmRkZXYtPnBkZXYtPmlycSk7CiAJaWYgKHIpIHsKIAkJcmRldi0+aXJxLmluc3RhbGxlZCA9IGZhbHNlOwogCQlmbHVzaF93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9rbXMuYwppbmRleCBlYWFlZGJhLi4zNWQ5MzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9rbXMuYwpAQCAtNTEzLDYgKzUxMywyMiBAQAogCQl2YWx1ZV9zaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKIAkJdmFsdWU2NCA9IGF0b21pYzY0X3JlYWQoJnJkZXYtPmd0dF91c2FnZSk7CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX0lORk9fQUNUSVZFX0NVX0NPVU5UOgorCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfQk9OQUlSRSkKKwkJCSp2YWx1ZSA9IHJkZXYtPmNvbmZpZy5jaWsuYWN0aXZlX2N1czsKKwkJZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfVEFISVRJKQorCQkJKnZhbHVlID0gcmRldi0+Y29uZmlnLnNpLmFjdGl2ZV9jdXM7CisJCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0NBWU1BTikKKwkJCSp2YWx1ZSA9IHJkZXYtPmNvbmZpZy5jYXltYW4uYWN0aXZlX3NpbWRzOworCQllbHNlIGlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9DRURBUikKKwkJCSp2YWx1ZSA9IHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uYWN0aXZlX3NpbWRzOworCQllbHNlIGlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkKKwkJCSp2YWx1ZSA9IHJkZXYtPmNvbmZpZy5ydjc3MC5hY3RpdmVfc2ltZHM7CisJCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApCisJCQkqdmFsdWUgPSByZGV2LT5jb25maWcucjYwMC5hY3RpdmVfc2ltZHM7CisJCWVsc2UKKwkJCSp2YWx1ZSA9IDE7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9ERUJVR19LTVMoIkludmFsaWQgcmVxdWVzdCAlZFxuIiwgaW5mby0+cmVxdWVzdCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODU5LDQgKzg3NSw0IEBACiAJRFJNX0lPQ1RMX0RFRl9EUlYoUkFERU9OX0dFTV9WQSwgcmFkZW9uX2dlbV92YV9pb2N0bCwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEfERSTV9SRU5ERVJfQUxMT1cpLAogCURSTV9JT0NUTF9ERUZfRFJWKFJBREVPTl9HRU1fT1AsIHJhZGVvbl9nZW1fb3BfaW9jdGwsIERSTV9BVVRIfERSTV9VTkxPQ0tFRHxEUk1fUkVOREVSX0FMTE9XKSwKIH07Ci1pbnQgcmFkZW9uX21heF9rbXNfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShyYWRlb25faW9jdGxzX2ttcyk7CitpbnQgcmFkZW9uX21heF9rbXNfaW9jdGwgPSBBUlJBWV9TSVpFKHJhZGVvbl9pb2N0bHNfa21zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA2ZGRmMzFhLi5hZDBlNGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC0xOTEsNiArMTkxLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIHJlYzsKIAlzdHJ1Y3QgZHJtX2RwX2F1eCBhdXg7CiAJYm9vbCBoYXNfYXV4OworCXN0cnVjdCBtdXRleCBtdXRleDsKIH07CiAKIC8qIG1vc3RseSBmb3IgbWFjcywgYnV0IHJlYWxseSBhbnkgc3lzdGVtIHdpdGhvdXQgY29ubmVjdG9yIHRhYmxlcyAqLwpAQCAtMzI0LDggKzMyNSw4IEBACiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbmF0aXZlX21vZGU7CiAJaW50IHBsbF9pZDsKIAkvKiBwYWdlIGZsaXBwaW5nICovCi0Jc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp1bnBpbl93b3JrOwotCWludCBkZWZlcnJlZF9mbGlwX2NvbXBsZXRpb247CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmZsaXBfcXVldWU7CisJc3RydWN0IHJhZGVvbl9mbGlwX3dvcmsgKmZsaXBfd29yazsKIAkvKiBwbGwgc2hhcmluZyAqLwogCXN0cnVjdCByYWRlb25fYXRvbV9zcyBzczsKIAlib29sIHNzX2VuYWJsZWQ7CkBAIC01MDUsNiArNTA2LDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICpyb3V0ZXJfYnVzOwogCWVudW0gcmFkZW9uX2Nvbm5lY3Rvcl9hdWRpbyBhdWRpbzsKIAllbnVtIHJhZGVvbl9jb25uZWN0b3JfZGl0aGVyIGRpdGhlcjsKKwlpbnQgcGl4ZWxjbG9ja19mb3JfbW9kZXNldDsKIH07CiAKIHN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgewpAQCAtOTA2LDYgKzkwOCw3IEBACiAKIHZvaWQgcmFkZW9uX2ZiX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCit2b2lkIHJhZGVvbl9jcnRjX2hhbmRsZV92Ymxhbmsoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkKTsKIHZvaWQgcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkKTsKIAogaW50IHJhZGVvbl9hbGlnbl9waXRjaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHdpZHRoLCBpbnQgYnBwLCBib29sIHRpbGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKaW5kZXggNGZhYTRkNi4uNmM3MTdiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgdHYuaGVhZCkgewogCQlibyA9IGxvYmotPnJvYmo7CiAJCWlmICghYm8tPnBpbl9jb3VudCkgewotCQkJdTMyIGRvbWFpbiA9IGxvYmotPmRvbWFpbjsKKwkJCXUzMiBkb21haW4gPSBsb2JqLT5wcmVmZXJlZF9kb21haW5zOwogCQkJdTMyIGN1cnJlbnRfZG9tYWluID0KIAkJCQlyYWRlb25fbWVtX3R5cGVfdG9fZG9tYWluKGJvLT50Ym8ubWVtLm1lbV90eXBlKTsKIApAQCAtNDU4LDcgKzQ1OCw3IEBACiAJCQkgKiBpbnRvIGFjY291bnQuIFdlIGRvbid0IHdhbnQgdG8gZGlzYWxsb3cgYnVmZmVyIG1vdmVzCiAJCQkgKiBjb21wbGV0ZWx5LgogCQkJICovCi0JCQlpZiAoKGxvYmotPmFsdF9kb21haW4gJiBjdXJyZW50X2RvbWFpbikgIT0gMCAmJgorCQkJaWYgKChsb2JqLT5hbGxvd2VkX2RvbWFpbnMgJiBjdXJyZW50X2RvbWFpbikgIT0gMCAmJgogCQkJICAgIChkb21haW4gJiBjdXJyZW50X2RvbWFpbikgPT0gMCAmJiAvKiB3aWxsIGJlIG1vdmVkICovCiAJCQkgICAgYnl0ZXNfbW92ZWQgPiBieXRlc19tb3ZlZF90aHJlc2hvbGQpIHsKIAkJCQkvKiBkb24ndCBtb3ZlIGl0ICovCkBAIC00NzYsOCArNDc2LDkgQEAKIAkJCQkgICAgICAgaW5pdGlhbF9ieXRlc19tb3ZlZDsKIAogCQkJaWYgKHVubGlrZWx5KHIpKSB7Ci0JCQkJaWYgKHIgIT0gLUVSRVNUQVJUU1lTICYmIGRvbWFpbiAhPSBsb2JqLT5hbHRfZG9tYWluKSB7Ci0JCQkJCWRvbWFpbiA9IGxvYmotPmFsdF9kb21haW47CisJCQkJaWYgKHIgIT0gLUVSRVNUQVJUU1lTICYmCisJCQkJICAgIGRvbWFpbiAhPSBsb2JqLT5hbGxvd2VkX2RvbWFpbnMpIHsKKwkJCQkJZG9tYWluID0gbG9iai0+YWxsb3dlZF9kb21haW5zOwogCQkJCQlnb3RvIHJldHJ5OwogCQkJCX0KIAkJCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbih0aWNrZXQsIGhlYWQpOwpAQCAtNzMwLDcgKzczMSw3IEBACiB7CiAJaW50IHI7CiAKLQlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKKwlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCBOVUxMKTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkKIAkJcmV0dXJuIHI7CiAJc3Bpbl9sb2NrKCZiby0+dGJvLmJkZXYtPmZlbmNlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaAppbmRleCA5ZTdiMjVhMC4uNWE4NzNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHsKIAlpbnQgcjsKIAotCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgIW5vX2ludHIsIGZhbHNlLCBmYWxzZSwgMCk7CisJciA9IHR0bV9ib19yZXNlcnZlKCZiby0+dGJvLCAhbm9faW50ciwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkgewogCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCiAJCQlkZXZfZXJyKGJvLT5yZGV2LT5kZXYsICIlcCByZXNlcnZlIGZhaWxlZFxuIiwgYm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKaW5kZXggMmJkYWU2MS4uMTJjNjYzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCkBAIC05ODQsNiArOTg0LDggQEAKIAkJaWYgKGVuYWJsZSkgewogCQkJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCQkJcmRldi0+cG0uZHBtLnV2ZF9hY3RpdmUgPSB0cnVlOworCQkJLyogZGlzYWJsZSB0aGlzIGZvciBub3cgKi8KKyNpZiAwCiAJCQlpZiAoKHJkZXYtPnBtLmRwbS5zZCA9PSAxKSAmJiAocmRldi0+cG0uZHBtLmhkID09IDApKQogCQkJCWRwbV9zdGF0ZSA9IFBPV0VSX1NUQVRFX1RZUEVfSU5URVJOQUxfVVZEX1NEOwogCQkJZWxzZSBpZiAoKHJkZXYtPnBtLmRwbS5zZCA9PSAyKSAmJiAocmRldi0+cG0uZHBtLmhkID09IDApKQpAQCAtOTkzLDYgKzk5NSw3IEBACiAJCQllbHNlIGlmICgocmRldi0+cG0uZHBtLnNkID09IDApICYmIChyZGV2LT5wbS5kcG0uaGQgPT0gMikpCiAJCQkJZHBtX3N0YXRlID0gUE9XRVJfU1RBVEVfVFlQRV9JTlRFUk5BTF9VVkRfSEQyOwogCQkJZWxzZQorI2VuZGlmCiAJCQkJZHBtX3N0YXRlID0gUE9XRVJfU1RBVEVfVFlQRV9JTlRFUk5BTF9VVkQ7CiAJCQlyZGV2LT5wbS5kcG0uc3RhdGUgPSBkcG1fc3RhdGU7CiAJCQltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDk1NmFiN2YuLjIzYmI2NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYwpAQCAtMzA1NCw3ICszMDU0LDcgQEAKIAkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID49IENISVBfUjYwMCkKIAkJCXZhbHVlID0gMDsKIAkJZWxzZQotCQkJdmFsdWUgPSBkcm1fZGV2X3RvX2lycShkZXYpOworCQkJdmFsdWUgPSBkZXYtPnBkZXYtPmlycTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFOgogCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0OwpAQCAtMzI1OCw0ICszMjU4LDQgQEAKIAlEUk1fSU9DVExfREVGX0RSVihSQURFT05fQ1MsIHI2MDBfY3NfbGVnYWN5X2lvY3RsLCBEUk1fQVVUSCkKIH07CiAKLWludCByYWRlb25fbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7CitpbnQgcmFkZW9uX21heF9pb2N0bCA9IEFSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl91dmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCmluZGV4IDFiNjVhZTIuLmE0YWQyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3V2ZC5jCkBAIC04MTIsNyArODEyLDggQEAKIAkJICAgIChyZGV2LT5wbS5kcG0uaGQgIT0gaGQpKSB7CiAJCQlyZGV2LT5wbS5kcG0uc2QgPSBzZDsKIAkJCXJkZXYtPnBtLmRwbS5oZCA9IGhkOwotCQkJc3RyZWFtc19jaGFuZ2VkID0gdHJ1ZTsKKwkJCS8qIGRpc2FibGUgdGhpcyBmb3Igbm93ICovCisJCQkvKnN0cmVhbXNfY2hhbmdlZCA9IHRydWU7Ki8KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl92Y2UuYwppbmRleCAzOTcxZDk2Li5hYTIxYzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl92Y2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl92Y2UuYwpAQCAtNjYsNiArNjYsNyBAQAogCWNhc2UgQ0hJUF9CT05BSVJFOgogCWNhc2UgQ0hJUF9LQVZFUkk6CiAJY2FzZSBDSElQX0tBQklOSToKKwljYXNlIENISVBfSEFXQUlJOgogCWNhc2UgQ0hJUF9NVUxMSU5TOgogCQlmd19uYW1lID0gRklSTVdBUkVfQk9OQUlSRTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl92bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdm0uYwppbmRleCBjMTFiNzFkLi44OTlkOTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl92bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3ZtLmMKQEAgLTU5LDcgKzU5LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIHJhZGVvbl92bV9udW1fcGRlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlyZXR1cm4gcmRldi0+dm1fbWFuYWdlci5tYXhfcGZuID4+IFJBREVPTl9WTV9CTE9DS19TSVpFOworCXJldHVybiByZGV2LT52bV9tYW5hZ2VyLm1heF9wZm4gPj4gcmFkZW9uX3ZtX2Jsb2NrX3NpemU7CiB9CiAKIC8qKgpAQCAtMTQwLDggKzE0MCw4IEBACiAJLyogYWRkIHRoZSB2bSBwYWdlIHRhYmxlIHRvIHRoZSBsaXN0ICovCiAJbGlzdFswXS5nb2JqID0gTlVMTDsKIAlsaXN0WzBdLnJvYmogPSB2bS0+cGFnZV9kaXJlY3Rvcnk7Ci0JbGlzdFswXS5kb21haW4gPSBSQURFT05fR0VNX0RPTUFJTl9WUkFNOwotCWxpc3RbMF0uYWx0X2RvbWFpbiA9IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU07CisJbGlzdFswXS5wcmVmZXJlZF9kb21haW5zID0gUkFERU9OX0dFTV9ET01BSU5fVlJBTTsKKwlsaXN0WzBdLmFsbG93ZWRfZG9tYWlucyA9IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU07CiAJbGlzdFswXS50di5ibyA9ICZ2bS0+cGFnZV9kaXJlY3RvcnktPnRibzsKIAlsaXN0WzBdLnRpbGluZ19mbGFncyA9IDA7CiAJbGlzdFswXS5oYW5kbGUgPSAwOwpAQCAtMTUzLDggKzE1Myw4IEBACiAKIAkJbGlzdFtpZHhdLmdvYmogPSBOVUxMOwogCQlsaXN0W2lkeF0ucm9iaiA9IHZtLT5wYWdlX3RhYmxlc1tpXS5ibzsKLQkJbGlzdFtpZHhdLmRvbWFpbiA9IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU07Ci0JCWxpc3RbaWR4XS5hbHRfZG9tYWluID0gUkFERU9OX0dFTV9ET01BSU5fVlJBTTsKKwkJbGlzdFtpZHhdLnByZWZlcmVkX2RvbWFpbnMgPSBSQURFT05fR0VNX0RPTUFJTl9WUkFNOworCQlsaXN0W2lkeF0uYWxsb3dlZF9kb21haW5zID0gUkFERU9OX0dFTV9ET01BSU5fVlJBTTsKIAkJbGlzdFtpZHhdLnR2LmJvID0gJmxpc3RbaWR4XS5yb2JqLT50Ym87CiAJCWxpc3RbaWR4XS50aWxpbmdfZmxhZ3MgPSAwOwogCQlsaXN0W2lkeF0uaGFuZGxlID0gMDsKQEAgLTQ3NCw4ICs0NzQsMTAgQEAKIAlib192YS0+dmFsaWQgPSBmYWxzZTsKIAlsaXN0X21vdmUoJmJvX3ZhLT52bV9saXN0LCBoZWFkKTsKIAotCXNvZmZzZXQgPSAoc29mZnNldCAvIFJBREVPTl9HUFVfUEFHRV9TSVpFKSA+PiBSQURFT05fVk1fQkxPQ0tfU0laRTsKLQllb2Zmc2V0ID0gKGVvZmZzZXQgLyBSQURFT05fR1BVX1BBR0VfU0laRSkgPj4gUkFERU9OX1ZNX0JMT0NLX1NJWkU7CisJc29mZnNldCA9IChzb2Zmc2V0IC8gUkFERU9OX0dQVV9QQUdFX1NJWkUpID4+IHJhZGVvbl92bV9ibG9ja19zaXplOworCWVvZmZzZXQgPSAoZW9mZnNldCAvIFJBREVPTl9HUFVfUEFHRV9TSVpFKSA+PiByYWRlb25fdm1fYmxvY2tfc2l6ZTsKKworCUJVR19PTihlb2Zmc2V0ID49IHJhZGVvbl92bV9udW1fcGRlcyhyZGV2KSk7CiAKIAlpZiAoZW9mZnNldCA+IHZtLT5tYXhfcGRlX3VzZWQpCiAJCXZtLT5tYXhfcGRlX3VzZWQgPSBlb2Zmc2V0OwpAQCAtNTgzLDEwICs1ODUsOSBAQAogaW50IHJhZGVvbl92bV91cGRhdGVfcGFnZV9kaXJlY3Rvcnkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJICAgIHN0cnVjdCByYWRlb25fdm0gKnZtKQogewotCXN0YXRpYyBjb25zdCB1aW50MzJfdCBpbmNyID0gUkFERU9OX1ZNX1BURV9DT1VOVCAqIDg7Ci0KIAlzdHJ1Y3QgcmFkZW9uX2JvICpwZCA9IHZtLT5wYWdlX2RpcmVjdG9yeTsKIAl1aW50NjRfdCBwZF9hZGRyID0gcmFkZW9uX2JvX2dwdV9vZmZzZXQocGQpOworCXVpbnQzMl90IGluY3IgPSBSQURFT05fVk1fUFRFX0NPVU5UICogODsKIAl1aW50NjRfdCBsYXN0X3BkZSA9IH4wLCBsYXN0X3B0ID0gfjA7CiAJdW5zaWduZWQgY291bnQgPSAwLCBwdF9pZHgsIG5kdzsKIAlzdHJ1Y3QgcmFkZW9uX2liIGliOwpAQCAtNjYwLDYgKzY2MSw4NCBAQAogfQogCiAvKioKKyAqIHJhZGVvbl92bV9mcmFnX3B0ZXMgLSBhZGQgZnJhZ21lbnQgaW5mb3JtYXRpb24gdG8gUFRFcworICoKKyAqIEByZGV2OiByYWRlb25fZGV2aWNlIHBvaW50ZXIKKyAqIEBpYjogSUIgZm9yIHRoZSB1cGRhdGUKKyAqIEBwZV9zdGFydDogZmlyc3QgUFRFIHRvIGhhbmRsZQorICogQHBlX2VuZDogbGFzdCBQVEUgdG8gaGFuZGxlCisgKiBAYWRkcjogYWRkciB0aG9zZSBQVEVzIHNob3VsZCBwb2ludCB0bworICogQGZsYWdzOiBodyBtYXBwaW5nIGZsYWdzCisgKgorICogR2xvYmFsIGFuZCBsb2NhbCBtdXRleCBtdXN0IGJlIGxvY2tlZCEKKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX3ZtX2ZyYWdfcHRlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQlzdHJ1Y3QgcmFkZW9uX2liICppYiwKKwkJCQl1aW50NjRfdCBwZV9zdGFydCwgdWludDY0X3QgcGVfZW5kLAorCQkJCXVpbnQ2NF90IGFkZHIsIHVpbnQzMl90IGZsYWdzKQoreworCS8qKgorCSAqIFRoZSBNQyBMMSBUTEIgc3VwcG9ydHMgdmFyaWFibGUgc2l6ZWQgcGFnZXMsIGJhc2VkIG9uIGEgZnJhZ21lbnQKKwkgKiBmaWVsZCBpbiB0aGUgUFRFLiBXaGVuIHRoaXMgZmllbGQgaXMgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIHBhZ2UKKwkgKiBncmFudWxhcml0eSBpcyBpbmNyZWFzZWQgZnJvbSA0S0IgdG8gKDEgPDwgKDEyICsgZnJhZykpLiBUaGUgUFRFCisJICogZmxhZ3MgYXJlIGNvbnNpZGVyZWQgdmFsaWQgZm9yIGFsbCBQVEVzIHdpdGhpbiB0aGUgZnJhZ21lbnQgcmFuZ2UKKwkgKiBhbmQgY29ycmVzcG9uZGluZyBtYXBwaW5ncyBhcmUgYXNzdW1lZCB0byBiZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMuCisJICoKKwkgKiBUaGUgTDEgVExCIGNhbiBzdG9yZSBhIHNpbmdsZSBQVEUgZm9yIHRoZSB3aG9sZSBmcmFnbWVudCwKKwkgKiBzaWduaWZpY2FudGx5IGluY3JlYXNpbmcgdGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdHJhbnNsYXRpb24KKwkgKiBjYWNoaW5nLiBUaGlzIGxlYWRzIHRvIGxhcmdlIGltcHJvdmVtZW50cyBpbiB0aHJvdWdocHV0IHdoZW4gdGhlCisJICogVExCIGlzIHVuZGVyIHByZXNzdXJlLgorCSAqCisJICogVGhlIEwyIFRMQiBkaXN0cmlidXRlcyBzbWFsbCBhbmQgbGFyZ2UgZnJhZ21lbnRzIGludG8gdHdvCisJICogYXN5bW1ldHJpYyBwYXJ0aXRpb25zLiBUaGUgbGFyZ2UgZnJhZ21lbnQgY2FjaGUgaXMgc2lnbmlmaWNhbnRseQorCSAqIGxhcmdlci4gVGh1cywgd2UgdHJ5IHRvIHVzZSBsYXJnZSBmcmFnbWVudHMgd2hlcmV2ZXIgcG9zc2libGUuCisJICogVXNlcnNwYWNlIGNhbiBzdXBwb3J0IHRoaXMgYnkgYWxpZ25pbmcgdmlydHVhbCBiYXNlIGFkZHJlc3MgYW5kCisJICogYWxsb2NhdGlvbiBzaXplIHRvIHRoZSBmcmFnbWVudCBzaXplLgorCSAqLworCisJLyogTkkgaXMgb3B0aW1pemVkIGZvciAyNTZLQiBmcmFnbWVudHMsIFNJIGFuZCBuZXdlciBmb3IgNjRLQiAqLworCXVpbnQ2NF90IGZyYWdfZmxhZ3MgPSByZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQVlNQU4gPworCQkJUjYwMF9QVEVfRlJBR18yNTZLQiA6IFI2MDBfUFRFX0ZSQUdfNjRLQjsKKwl1aW50NjRfdCBmcmFnX2FsaWduID0gcmRldi0+ZmFtaWx5ID09IENISVBfQ0FZTUFOID8gMHgyMDAgOiAweDgwOworCisJdWludDY0X3QgZnJhZ19zdGFydCA9IEFMSUdOKHBlX3N0YXJ0LCBmcmFnX2FsaWduKTsKKwl1aW50NjRfdCBmcmFnX2VuZCA9IHBlX2VuZCAmIH4oZnJhZ19hbGlnbiAtIDEpOworCisJdW5zaWduZWQgY291bnQ7CisKKwkvKiBzeXN0ZW0gcGFnZXMgYXJlIG5vbiBjb250aW51b3VzbHkgKi8KKwlpZiAoKGZsYWdzICYgUjYwMF9QVEVfU1lTVEVNKSB8fCAhKGZsYWdzICYgUjYwMF9QVEVfVkFMSUQpIHx8CisJICAgIChmcmFnX3N0YXJ0ID49IGZyYWdfZW5kKSkgeworCisJCWNvdW50ID0gKHBlX2VuZCAtIHBlX3N0YXJ0KSAvIDg7CisJCXJhZGVvbl9hc2ljX3ZtX3NldF9wYWdlKHJkZXYsIGliLCBwZV9zdGFydCwgYWRkciwgY291bnQsCisJCQkJCVJBREVPTl9HUFVfUEFHRV9TSVpFLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBoYW5kbGUgdGhlIDRLIGFyZWEgYXQgdGhlIGJlZ2lubmluZyAqLworCWlmIChwZV9zdGFydCAhPSBmcmFnX3N0YXJ0KSB7CisJCWNvdW50ID0gKGZyYWdfc3RhcnQgLSBwZV9zdGFydCkgLyA4OworCQlyYWRlb25fYXNpY192bV9zZXRfcGFnZShyZGV2LCBpYiwgcGVfc3RhcnQsIGFkZHIsIGNvdW50LAorCQkJCQlSQURFT05fR1BVX1BBR0VfU0laRSwgZmxhZ3MpOworCQlhZGRyICs9IFJBREVPTl9HUFVfUEFHRV9TSVpFICogY291bnQ7CisJfQorCisJLyogaGFuZGxlIHRoZSBhcmVhIGluIHRoZSBtaWRkbGUgKi8KKwljb3VudCA9IChmcmFnX2VuZCAtIGZyYWdfc3RhcnQpIC8gODsKKwlyYWRlb25fYXNpY192bV9zZXRfcGFnZShyZGV2LCBpYiwgZnJhZ19zdGFydCwgYWRkciwgY291bnQsCisJCQkJUkFERU9OX0dQVV9QQUdFX1NJWkUsIGZsYWdzIHwgZnJhZ19mbGFncyk7CisKKwkvKiBoYW5kbGUgdGhlIDRLIGFyZWEgYXQgdGhlIGVuZCAqLworCWlmIChmcmFnX2VuZCAhPSBwZV9lbmQpIHsKKwkJYWRkciArPSBSQURFT05fR1BVX1BBR0VfU0laRSAqIGNvdW50OworCQljb3VudCA9IChwZV9lbmQgLSBmcmFnX2VuZCkgLyA4OworCQlyYWRlb25fYXNpY192bV9zZXRfcGFnZShyZGV2LCBpYiwgZnJhZ19lbmQsIGFkZHIsIGNvdW50LAorCQkJCQlSQURFT05fR1BVX1BBR0VfU0laRSwgZmxhZ3MpOworCX0KK30KKworLyoqCiAgKiByYWRlb25fdm1fdXBkYXRlX3B0ZXMgLSBtYWtlIHN1cmUgdGhhdCBwYWdlIHRhYmxlcyBhcmUgdmFsaWQKICAqCiAgKiBAcmRldjogcmFkZW9uX2RldmljZSBwb2ludGVyCkBAIC02NzksOCArNzU4LDcgQEAKIAkJCQkgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBlbmQsCiAJCQkJICB1aW50NjRfdCBkc3QsIHVpbnQzMl90IGZsYWdzKQogewotCXN0YXRpYyBjb25zdCB1aW50NjRfdCBtYXNrID0gUkFERU9OX1ZNX1BURV9DT1VOVCAtIDE7Ci0KKwl1aW50NjRfdCBtYXNrID0gUkFERU9OX1ZNX1BURV9DT1VOVCAtIDE7CiAJdWludDY0X3QgbGFzdF9wdGUgPSB+MCwgbGFzdF9kc3QgPSB+MDsKIAl1bnNpZ25lZCBjb3VudCA9IDA7CiAJdWludDY0X3QgYWRkcjsKQEAgLTY5MCw3ICs3NjgsNyBAQAogCiAJLyogd2FsayBvdmVyIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB1cGRhdGUgdGhlIHBhZ2UgdGFibGVzICovCiAJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7ICkgewotCQl1aW50NjRfdCBwdF9pZHggPSBhZGRyID4+IFJBREVPTl9WTV9CTE9DS19TSVpFOworCQl1aW50NjRfdCBwdF9pZHggPSBhZGRyID4+IHJhZGVvbl92bV9ibG9ja19zaXplOwogCQlzdHJ1Y3QgcmFkZW9uX2JvICpwdCA9IHZtLT5wYWdlX3RhYmxlc1twdF9pZHhdLmJvOwogCQl1bnNpZ25lZCBucHRlczsKIAkJdWludDY0X3QgcHRlOwpAQCAtNzA4LDEwICs3ODYsOSBAQAogCQlpZiAoKGxhc3RfcHRlICsgOCAqIGNvdW50KSAhPSBwdGUpIHsKIAogCQkJaWYgKGNvdW50KSB7Ci0JCQkJcmFkZW9uX2FzaWNfdm1fc2V0X3BhZ2UocmRldiwgaWIsIGxhc3RfcHRlLAotCQkJCQkJCWxhc3RfZHN0LCBjb3VudCwKLQkJCQkJCQlSQURFT05fR1BVX1BBR0VfU0laRSwKLQkJCQkJCQlmbGFncyk7CisJCQkJcmFkZW9uX3ZtX2ZyYWdfcHRlcyhyZGV2LCBpYiwgbGFzdF9wdGUsCisJCQkJCQkgICAgbGFzdF9wdGUgKyA4ICogY291bnQsCisJCQkJCQkgICAgbGFzdF9kc3QsIGZsYWdzKTsKIAkJCX0KIAogCQkJY291bnQgPSBucHRlczsKQEAgLTcyNiw5ICs4MDMsOSBAQAogCX0KIAogCWlmIChjb3VudCkgewotCQlyYWRlb25fYXNpY192bV9zZXRfcGFnZShyZGV2LCBpYiwgbGFzdF9wdGUsCi0JCQkJCWxhc3RfZHN0LCBjb3VudCwKLQkJCQkJUkFERU9OX0dQVV9QQUdFX1NJWkUsIGZsYWdzKTsKKwkJcmFkZW9uX3ZtX2ZyYWdfcHRlcyhyZGV2LCBpYiwgbGFzdF9wdGUsCisJCQkJICAgIGxhc3RfcHRlICsgOCAqIGNvdW50LAorCQkJCSAgICBsYXN0X2RzdCwgZmxhZ3MpOwogCX0KIH0KIApAQCAtNzk2LDEzICs4NzMsMTMgQEAKIAkvKiBwYWRkaW5nLCBldGMuICovCiAJbmR3ID0gNjQ7CiAKLQlpZiAoUkFERU9OX1ZNX0JMT0NLX1NJWkUgPiAxMSkKKwlpZiAocmFkZW9uX3ZtX2Jsb2NrX3NpemUgPiAxMSkKIAkJLyogcmVzZXJ2ZSBzcGFjZSBmb3Igb25lIGhlYWRlciBmb3IgZXZlcnkgMmsgZHdvcmRzICovCiAJCW5kdyArPSAobnB0ZXMgPj4gMTEpICogNDsKIAllbHNlCiAJCS8qIHJlc2VydmUgc3BhY2UgZm9yIG9uZSBoZWFkZXIgZm9yCiAJCSAgICBldmVyeSAoMSA8PCBCTE9DS19TSVpFKSBlbnRyaWVzICovCi0JCW5kdyArPSAobnB0ZXMgPj4gUkFERU9OX1ZNX0JMT0NLX1NJWkUpICogNDsKKwkJbmR3ICs9IChucHRlcyA+PiByYWRlb25fdm1fYmxvY2tfc2l6ZSkgKiA0OwogCiAJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgcHRlIGFkZHJlc3NlcyAqLwogCW5kdyArPSBucHRlcyAqIDI7CkBAIC04OTIsNiArOTY5LDggQEAKICAqLwogaW50IHJhZGVvbl92bV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX3ZtICp2bSkKIHsKKwljb25zdCB1bnNpZ25lZCBhbGlnbiA9IG1pbihSQURFT05fVk1fUFRCX0FMSUdOX1NJWkUsCisJCVJBREVPTl9WTV9QVEVfQ09VTlQgKiA4KTsKIAl1bnNpZ25lZCBwZF9zaXplLCBwZF9lbnRyaWVzLCBwdHNfc2l6ZTsKIAlpbnQgcjsKIApAQCAtOTEzLDcgKzk5Miw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIHBkX3NpemUsIFJBREVPTl9WTV9QVEJfQUxJR05fU0laRSwgZmFsc2UsCisJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgcGRfc2l6ZSwgYWxpZ24sIGZhbHNlLAogCQkJICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLCBOVUxMLAogCQkJICAgICAmdm0tPnBhZ2VfZGlyZWN0b3J5KTsKIAlpZiAocikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwppbmRleCAxMzBkNWNjLi5hMGY5NmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCkBAIC0yMTIsMjEgKzIxMiwxNiBAQAogI2RlZmluZSBSUzQwMF9QVEVfV1JJVEVBQkxFICgxIDw8IDIpCiAjZGVmaW5lIFJTNDAwX1BURV9SRUFEQUJMRSAgKDEgPDwgMykKIAotaW50IHJzNDAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKQordm9pZCByczQwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBpLCB1aW50NjRfdCBhZGRyKQogewogCXVpbnQzMl90IGVudHJ5OwogCXUzMiAqZ3R0ID0gcmRldi0+Z2FydC5wdHI7CiAKLQlpZiAoaSA8IDAgfHwgaSA+IHJkZXYtPmdhcnQubnVtX2dwdV9wYWdlcykgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAllbnRyeSA9IChsb3dlcl8zMl9iaXRzKGFkZHIpICYgUEFHRV9NQVNLKSB8CiAJCSgodXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmYpIDw8IDQpIHwKIAkJUlM0MDBfUFRFX1dSSVRFQUJMRSB8IFJTNDAwX1BURV9SRUFEQUJMRTsKIAllbnRyeSA9IGNwdV90b19sZTMyKGVudHJ5KTsKIAlndHRbaV0gPSBlbnRyeTsKLQlyZXR1cm4gMDsKIH0KIAogaW50IHJzNDAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggNzJkMzYxNi4uZDFhMzVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwpAQCAtMTA5LDE5ICsxMDksNyBAQAogCX0KIH0KIAotdm9pZCByczYwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKLXsKLQkvKiBlbmFibGUgdGhlIHBmbGlwIGludCAqLwotCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQocmRldiwgY3J0Yyk7Ci19Ci0KLXZvaWQgcnM2MDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQotewotCS8qIGRpc2FibGUgdGhlIHBmbGlwIGludCAqLwotCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9wdXQocmRldiwgY3J0Yyk7Ci19Ci0KLXUzMiByczYwMF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQordm9pZCByczYwMF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CiAJdTMyIHRtcCA9IFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KTsKQEAgLTE0OCw5ICsxMzYsMTUgQEAKIAkvKiBVbmxvY2sgdGhlIGxvY2ssIHNvIGRvdWJsZS1idWZmZXJpbmcgY2FuIHRha2UgcGxhY2UgaW5zaWRlIHZibGFuayAqLwogCXRtcCAmPSB+QVZJVk9fRDFHUlBIX1VQREFURV9MT0NLOwogCVdSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworfQorCitib29sIHJzNjAwX3BhZ2VfZmxpcF9wZW5kaW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOwogCiAJLyogUmV0dXJuIGN1cnJlbnQgdXBkYXRlX3BlbmRpbmcgc3RhdHVzOiAqLwotCXJldHVybiBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORzsKKwlyZXR1cm4gISEoUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYKKwkJQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpOwogfQogCiB2b2lkIGF2aXZvX3Byb2dyYW1fZm10KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTYzMiwyNCArNjI2LDE2IEBACiAJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9mcmVlKHJkZXYpOwogfQogCi0jZGVmaW5lIFI2MDBfUFRFX1ZBTElEICAgICAoMSA8PCAwKQotI2RlZmluZSBSNjAwX1BURV9TWVNURU0gICAgKDEgPDwgMSkKLSNkZWZpbmUgUjYwMF9QVEVfU05PT1BFRCAgICgxIDw8IDIpCi0jZGVmaW5lIFI2MDBfUFRFX1JFQURBQkxFICAoMSA8PCA1KQotI2RlZmluZSBSNjAwX1BURV9XUklURUFCTEUgKDEgPDwgNikKLQotaW50IHJzNjAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKQordm9pZCByczYwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBpLCB1aW50NjRfdCBhZGRyKQogewogCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnB0cjsKIAotCWlmIChpIDwgMCB8fCBpID4gcmRldi0+Z2FydC5udW1fZ3B1X3BhZ2VzKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAlhZGRyID0gYWRkciAmIDB4RkZGRkZGRkZGRkZGRjAwMFVMTDsKLQlhZGRyIHw9IFI2MDBfUFRFX1ZBTElEIHwgUjYwMF9QVEVfU1lTVEVNIHwgUjYwMF9QVEVfU05PT1BFRDsKLQlhZGRyIHw9IFI2MDBfUFRFX1JFQURBQkxFIHwgUjYwMF9QVEVfV1JJVEVBQkxFOworCWlmIChhZGRyID09IHJkZXYtPmR1bW15X3BhZ2UuYWRkcikKKwkJYWRkciB8PSBSNjAwX1BURV9TWVNURU0gfCBSNjAwX1BURV9TTk9PUEVEOworCWVsc2UKKwkJYWRkciB8PSBSNjAwX1BURV9HQVJUOwogCXdyaXRlcShhZGRyLCBwdHIgKyAoaSAqIDgpKTsKLQlyZXR1cm4gMDsKIH0KIAogaW50IHJzNjAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC03ODcsNyArNzczLDcgQEAKIAkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKIAkJCX0KIAkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzBdKSkKLQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAwKTsKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDApOwogCQl9CiAJCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CkBAIC03OTYsNyArNzgyLDcgQEAKIAkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKIAkJCX0KIAkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzFdKSkKLQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAxKTsKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfdmJsYW5rKHJkZXYsIDEpOwogCQl9CiAJCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QxX0lOVEVSUlVQVChyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpKSB7CiAJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCBmZWYzMTA3Li5kYTg3MDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC04MDEsNyArODAxLDcgQEAKIAlyZXR1cm4gcmVmZXJlbmNlX2Nsb2NrOwogfQogCi11MzIgcnY3NzBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSkKK3ZvaWQgcnY3NzBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOwogCXUzMiB0bXAgPSBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CkBAIC04MzUsOSArODM1LDE1IEBACiAJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KIAl0bXAgJj0gfkFWSVZPX0QxR1JQSF9VUERBVEVfTE9DSzsKIAlXUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKK30KKworYm9vbCBydjc3MF9wYWdlX2ZsaXBfcGVuZGluZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKIAogCS8qIFJldHVybiBjdXJyZW50IHVwZGF0ZV9wZW5kaW5nIHN0YXR1czogKi8KLQlyZXR1cm4gUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkc7CisJcmV0dXJuICEhKFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmCisJCUFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKTsKIH0KIAogLyogZ2V0IHRlbXBlcmF0dXJlIGluIG1pbGxpZGVncmVlcyAqLwpAQCAtMTMyMSw2ICsxMzI3LDkgQEAKIAlpZiAodG1wIDwgcmRldi0+Y29uZmlnLnJ2NzcwLm1heF9zaW1kcykgewogCQlyZGV2LT5jb25maWcucnY3NzAubWF4X3NpbWRzID0gdG1wOwogCX0KKwl0bXAgPSByZGV2LT5jb25maWcucnY3NzAubWF4X3NpbWRzIC0KKwkJcjYwMF9jb3VudF9waXBlX2JpdHMoKGNjX2djX3NoYWRlcl9waXBlX2NvbmZpZyA+PiAxNikgJiBSN1hYX01BWF9TSU1EU19NQVNLKTsKKwlyZGV2LT5jb25maWcucnY3NzAuYWN0aXZlX3NpbWRzID0gdG1wOwogCiAJc3dpdGNoIChyZGV2LT5jb25maWcucnY3NzAubWF4X3RpbGVfcGlwZXMpIHsKIAljYXNlIDE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpLmMKaW5kZXggMjJhNjNjOS4uNzMwY2VlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2kuYwpAQCAtNzEsNiArNzEsNyBAQAogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vSEFJTkFOX3JsYy5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0hBSU5BTl9zbWMuYmluIik7CiAKK3N0YXRpYyB1MzIgc2lfZ2V0X2N1X2FjdGl2ZV9iaXRtYXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiBzZSwgdTMyIHNoKTsKIHN0YXRpYyB2b2lkIHNpX3BjaWVfZ2VuM19lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogc3RhdGljIHZvaWQgc2lfcHJvZ3JhbV9hc3BtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHN1bW9fcmxjX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMjkwMCw3ICsyOTAxLDcgQEAKIAl1MzIgc3hfZGVidWdfMTsKIAl1MzIgaGRwX2hvc3RfcGF0aF9jbnRsOwogCXUzMiB0bXA7Ci0JaW50IGksIGo7CisJaW50IGksIGosIGs7CiAKIAlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCWNhc2UgQ0hJUF9UQUhJVEk6CkBAIC0zMDk4LDYgKzMwOTksMTQgQEAKIAkJICAgICByZGV2LT5jb25maWcuc2kubWF4X3NoX3Blcl9zZSwKIAkJICAgICByZGV2LT5jb25maWcuc2kubWF4X2N1X3Blcl9zaCk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgcmRldi0+Y29uZmlnLnNpLm1heF9zaGFkZXJfZW5naW5lczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCByZGV2LT5jb25maWcuc2kubWF4X3NoX3Blcl9zZTsgaisrKSB7CisJCQlmb3IgKGsgPSAwOyBrIDwgcmRldi0+Y29uZmlnLnNpLm1heF9jdV9wZXJfc2g7IGsrKykgeworCQkJCXJkZXYtPmNvbmZpZy5zaS5hY3RpdmVfY3VzICs9CisJCQkJCWh3ZWlnaHQzMihzaV9nZXRfY3VfYWN0aXZlX2JpdG1hcChyZGV2LCBpLCBqKSk7CisJCQl9CisJCX0KKwl9CiAKIAkvKiBzZXQgSFcgZGVmYXVsdHMgZm9yIDNEIGVuZ2luZSAqLwogCVdSRUczMihDUF9RVUVVRV9USFJFU0hPTERTLCAoUk9RX0lCMV9TVEFSVCgweDE2KSB8CkBAIC0zMTg2LDcgKzMxOTUsNyBAQAogCS8qIEVWRU5UX1dSSVRFX0VPUCAtIGZsdXNoIGNhY2hlcywgc2VuZCBpbnQgKi8KIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQzKFBBQ0tFVDNfRVZFTlRfV1JJVEVfRU9QLCA0KSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgRVZFTlRfVFlQRShDQUNIRV9GTFVTSF9BTkRfSU5WX1RTX0VWRU5UKSB8IEVWRU5UX0lOREVYKDUpKTsKLQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBhZGRyICYgMHhmZmZmZmZmZik7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgbG93ZXJfMzJfYml0cyhhZGRyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgKHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmKSB8IERBVEFfU0VMKDEpIHwgSU5UX1NFTCgyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgZmVuY2UtPnNlcSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgMCk7CkBAIC0zMjE5LDcgKzMyMjgsNyBAQAogCQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMyhQQUNLRVQzX1dSSVRFX0RBVEEsIDMpKTsKIAkJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsICgxIDw8IDgpKTsKIAkJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHJpbmctPm5leHRfcnB0cl9ncHVfYWRkciAmIDB4ZmZmZmZmZmMpOwotCQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhyaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIpICYgMHhmZmZmZmZmZik7CisJCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKHJpbmctPm5leHRfcnB0cl9ncHVfYWRkcikpOwogCQkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgbmV4dF9ycHRyKTsKIAkJfQogCkBAIC00MDQ0LDE4ICs0MDUzLDIxIEBACiAJV1JFRzMyKE1DX1ZNX01YX0wxX1RMQl9DTlRMLAogCSAgICAgICAoMHhBIDw8IDcpIHwKIAkgICAgICAgRU5BQkxFX0wxX1RMQiB8CisJICAgICAgIEVOQUJMRV9MMV9GUkFHTUVOVF9QUk9DRVNTSU5HIHwKIAkgICAgICAgU1lTVEVNX0FDQ0VTU19NT0RFX05PVF9JTl9TWVMgfAogCSAgICAgICBFTkFCTEVfQURWQU5DRURfRFJJVkVSX01PREVMIHwKIAkgICAgICAgU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0FDQ0VTU19QQVNTX1RIUlUpOwogCS8qIFNldHVwIEwyIGNhY2hlICovCiAJV1JFRzMyKFZNX0wyX0NOVEwsIEVOQUJMRV9MMl9DQUNIRSB8CisJICAgICAgIEVOQUJMRV9MMl9GUkFHTUVOVF9QUk9DRVNTSU5HIHwKIAkgICAgICAgRU5BQkxFX0wyX1BURV9DQUNIRV9MUlVfVVBEQVRFX0JZX1dSSVRFIHwKIAkgICAgICAgRU5BQkxFX0wyX1BERTBfQ0FDSEVfTFJVX1VQREFURV9CWV9XUklURSB8CiAJICAgICAgIEVGRkVDVElWRV9MMl9RVUVVRV9TSVpFKDcpIHwKIAkgICAgICAgQ09OVEVYVDFfSURFTlRJVFlfQUNDRVNTX01PREUoMSkpOwogCVdSRUczMihWTV9MMl9DTlRMMiwgSU5WQUxJREFURV9BTExfTDFfVExCUyB8IElOVkFMSURBVEVfTDJfQ0FDSEUpOwogCVdSRUczMihWTV9MMl9DTlRMMywgTDJfQ0FDSEVfQklHS19BU1NPQ0lBVElWSVRZIHwKLQkgICAgICAgTDJfQ0FDSEVfQklHS19GUkFHTUVOVF9TSVpFKDApKTsKKwkgICAgICAgQkFOS19TRUxFQ1QoNCkgfAorCSAgICAgICBMMl9DQUNIRV9CSUdLX0ZSQUdNRU5UX1NJWkUoNCkpOwogCS8qIHNldHVwIGNvbnRleHQwICovCiAJV1JFRzMyKFZNX0NPTlRFWFQwX1BBR0VfVEFCTEVfU1RBUlRfQUREUiwgcmRldi0+bWMuZ3R0X3N0YXJ0ID4+IDEyKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9FTkRfQUREUiwgcmRldi0+bWMuZ3R0X2VuZCA+PiAxMik7CkBAIC00MDkyLDYgKzQxMDQsNyBAQAogCSAgICAgICAodTMyKShyZGV2LT5kdW1teV9wYWdlLmFkZHIgPj4gMTIpKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDFfQ05UTDIsIDQpOwogCVdSRUczMihWTV9DT05URVhUMV9DTlRMLCBFTkFCTEVfQ09OVEVYVCB8IFBBR0VfVEFCTEVfREVQVEgoMSkgfAorCQkJCVBBR0VfVEFCTEVfQkxPQ0tfU0laRShyYWRlb25fdm1fYmxvY2tfc2l6ZSAtIDkpIHwKIAkJCQlSQU5HRV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9JTlRFUlJVUFQgfAogCQkJCVJBTkdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQgfAogCQkJCURVTU1ZX1BBR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfSU5URVJSVVBUIHwKQEAgLTYxNTEsNyArNjE2NCw3IEBACiAJCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKIAkJCQkJfQogCQkJCQlpZiAoYXRvbWljX3JlYWQoJnJkZXYtPmlycS5wZmxpcFswXSkpCi0JCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAwKTsKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV92YmxhbmsocmRldiwgMCk7CiAJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICY9IH5MQl9EMV9WQkxBTktfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMSB2YmxhbmtcbiIpOwogCQkJCX0KQEAgLTYxNzcsNyArNjE5MCw3IEBACiAJCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKIAkJCQkJfQogCQkJCQlpZiAoYXRvbWljX3JlYWQoJnJkZXYtPmlycS5wZmxpcFsxXSkpCi0JCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAxKTsKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV92YmxhbmsocmRldiwgMSk7CiAJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJj0gfkxCX0QyX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQyIHZibGFua1xuIik7CiAJCQkJfQpAQCAtNjIwMyw3ICs2MjE2LDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzJdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDIpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAyKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJj0gfkxCX0QzX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQzIHZibGFua1xuIik7CiAJCQkJfQpAQCAtNjIyOSw3ICs2MjQyLDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzNdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDMpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCAzKTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJj0gfkxCX0Q0X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ0IHZibGFua1xuIik7CiAJCQkJfQpAQCAtNjI1NSw3ICs2MjY4LDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzRdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDQpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCA0KTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJj0gfkxCX0Q1X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ1IHZibGFua1xuIik7CiAJCQkJfQpAQCAtNjI4MSw3ICs2Mjk0LDcgQEAKIAkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCQkJCQl9CiAJCQkJCWlmIChhdG9taWNfcmVhZCgmcmRldi0+aXJxLnBmbGlwWzVdKSkKLQkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDUpOworCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX3ZibGFuayhyZGV2LCA1KTsKIAkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJj0gfkxCX0Q2X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ2IHZibGFua1xuIik7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZG1hLmMKaW5kZXggZGUwY2EwNy4uZTI0Yzk0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RtYS5jCkBAIC03OSw3ICs3OSwyNSBAQAogCiAJdHJhY2VfcmFkZW9uX3ZtX3NldF9wYWdlKHBlLCBhZGRyLCBjb3VudCwgaW5jciwgZmxhZ3MpOwogCi0JaWYgKGZsYWdzICYgUjYwMF9QVEVfU1lTVEVNKSB7CisJaWYgKGZsYWdzID09IFI2MDBfUFRFX0dBUlQpIHsKKwkJdWludDY0X3Qgc3JjID0gcmRldi0+Z2FydC50YWJsZV9hZGRyICsgKGFkZHIgPj4gMTIpICogODsKKwkJd2hpbGUgKGNvdW50KSB7CisJCQl1bnNpZ25lZCBieXRlcyA9IGNvdW50ICogODsKKwkJCWlmIChieXRlcyA+IDB4RkZGRjgpCisJCQkJYnl0ZXMgPSAweEZGRkY4OworCisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBETUFfUEFDS0VUKERNQV9QQUNLRVRfQ09QWSwKKwkJCQkJCQkgICAgICAxLCAwLCAwLCBieXRlcyk7CisJCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBsb3dlcl8zMl9iaXRzKHBlKTsKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IGxvd2VyXzMyX2JpdHMoc3JjKTsKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IHVwcGVyXzMyX2JpdHMocGUpICYgMHhmZjsKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IHVwcGVyXzMyX2JpdHMoc3JjKSAmIDB4ZmY7CisKKwkJCXBlICs9IGJ5dGVzOworCQkJc3JjICs9IGJ5dGVzOworCQkJY291bnQgLT0gYnl0ZXMgLyA4OworCQl9CisJfSBlbHNlIGlmIChmbGFncyAmIFI2MDBfUFRFX1NZU1RFTSkgewogCQl3aGlsZSAoY291bnQpIHsKIAkJCW5kdyA9IGNvdW50ICogMjsKIAkJCWlmIChuZHcgPiAweEZGRkZFKQpAQCAtMjAyLDggKzIyMCw4IEBACiAJCQljdXJfc2l6ZV9pbl9ieXRlcyA9IDB4RkZGRkY7CiAJCXNpemVfaW5fYnl0ZXMgLT0gY3VyX3NpemVfaW5fYnl0ZXM7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIERNQV9QQUNLRVQoRE1BX1BBQ0tFVF9DT1BZLCAxLCAwLCAwLCBjdXJfc2l6ZV9pbl9ieXRlcykpOwotCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCBkc3Rfb2Zmc2V0ICYgMHhmZmZmZmZmZik7Ci0JCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHNyY19vZmZzZXQgJiAweGZmZmZmZmZmKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgbG93ZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoc3JjX29mZnNldCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKGRzdF9vZmZzZXQpICYgMHhmZik7CiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCkgJiAweGZmKTsKIAkJc3JjX29mZnNldCArPSBjdXJfc2l6ZV9pbl9ieXRlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RwbS5jCmluZGV4IDlhMzU2N2IuLjU4OTE4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kcG0uYwpAQCAtMTk0OCw2ICsxOTQ4LDEwIEBACiAJCQlzaV9waS0+Y2FjX3dlaWdodHMgPSBjYWNfd2VpZ2h0c19jYXBlX3ZlcmRlX3BybzsKIAkJCXNpX3BpLT5kdGVfZGF0YSA9IGR0ZV9kYXRhX2NhcGVfdmVyZGU7CiAJCQlicmVhazsKKwkJY2FzZSAweDY4MkM6CisJCQlzaV9waS0+Y2FjX3dlaWdodHMgPSBjYWNfd2VpZ2h0c19jYXBlX3ZlcmRlX3BybzsKKwkJCXNpX3BpLT5kdGVfZGF0YSA9IGR0ZV9kYXRhX3N1bl94dDsKKwkJCWJyZWFrOwogCQljYXNlIDB4NjgyNToKIAkJY2FzZSAweDY4Mjc6CiAJCQlzaV9waS0+Y2FjX3dlaWdodHMgPSBjYWNfd2VpZ2h0c19oZWF0aHJvdzsKQEAgLTE5NzEsMTAgKzE5NzUsOSBAQAogCQkJc2lfcGktPmR0ZV9kYXRhID0gZHRlX2RhdGFfdmVudXNfeHQ7CiAJCQlicmVhazsKIAkJY2FzZSAweDY4MjM6Ci0JCQlzaV9waS0+Y2FjX3dlaWdodHMgPSBjYWNfd2VpZ2h0c19jaGVsc2VhX3BybzsKLQkJCXNpX3BpLT5kdGVfZGF0YSA9IGR0ZV9kYXRhX3ZlbnVzX3BybzsKLQkJCWJyZWFrOwogCQljYXNlIDB4NjgyQjoKKwkJY2FzZSAweDY4MjI6CisJCWNhc2UgMHg2ODJBOgogCQkJc2lfcGktPmNhY193ZWlnaHRzID0gY2FjX3dlaWdodHNfY2hlbHNlYV9wcm87CiAJCQlzaV9waS0+ZHRlX2RhdGEgPSBkdGVfZGF0YV92ZW51c19wcm87CiAJCQlicmVhazsKQEAgLTE5ODgsNiArMTk5MSw3IEBACiAJCWNhc2UgMHg2NjAxOgogCQljYXNlIDB4NjYyMToKIAkJY2FzZSAweDY2MDM6CisJCWNhc2UgMHg2NjA1OgogCQkJc2lfcGktPmNhY193ZWlnaHRzID0gY2FjX3dlaWdodHNfbWFyc19wcm87CiAJCQlzaV9waS0+bGNhY19jb25maWcgPSBsY2FjX21hcnNfcHJvOwogCQkJc2lfcGktPmNhY19vdmVycmlkZSA9IGNhY19vdmVycmlkZV9vbGFuZDsKQEAgLTE5OTgsNiArMjAwMiw3IEBACiAJCWNhc2UgMHg2NjAwOgogCQljYXNlIDB4NjYwNjoKIAkJY2FzZSAweDY2MjA6CisJCWNhc2UgMHg2NjA0OgogCQkJc2lfcGktPmNhY193ZWlnaHRzID0gY2FjX3dlaWdodHNfbWFyc194dDsKIAkJCXNpX3BpLT5sY2FjX2NvbmZpZyA9IGxjYWNfbWFyc19wcm87CiAJCQlzaV9waS0+Y2FjX292ZXJyaWRlID0gY2FjX292ZXJyaWRlX29sYW5kOwpAQCAtMjAwNiw2ICsyMDExLDggQEAKIAkJCXVwZGF0ZV9kdGVfZnJvbV9wbDIgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg2NjExOgorCQljYXNlIDB4NjYxMzoKKwkJY2FzZSAweDY2MDg6CiAJCQlzaV9waS0+Y2FjX3dlaWdodHMgPSBjYWNfd2VpZ2h0c19vbGFuZF9wcm87CiAJCQlzaV9waS0+bGNhY19jb25maWcgPSBsY2FjX21hcnNfcHJvOwogCQkJc2lfcGktPmNhY19vdmVycmlkZSA9IGNhY19vdmVycmlkZV9vbGFuZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpZC5oCmluZGV4IDczMjEyODMuLmZkNDE0ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaWQuaApAQCAtMzYyLDYgKzM2Miw3IEBACiAjZGVmaW5lCQlSRUFEX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQJCSgxIDw8IDE2KQogI2RlZmluZQkJV1JJVEVfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfSU5URVJSVVBUCQkoMSA8PCAxOCkKICNkZWZpbmUJCVdSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQJCSgxIDw8IDE5KQorI2RlZmluZQkJUEFHRV9UQUJMRV9CTE9DS19TSVpFKHgpCQkJKCgoeCkgJiAweEYpIDw8IDI0KQogI2RlZmluZSBWTV9DT05URVhUMV9DTlRMCQkJCTB4MTQxNAogI2RlZmluZSBWTV9DT05URVhUMF9DTlRMMgkJCQkweDE0MzAKICNkZWZpbmUgVk1fQ09OVEVYVDFfQ05UTDIJCQkJMHgxNDM0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3V2ZF92Ml8yLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3V2ZF92Ml8yLmMKaW5kZXggZDE3NzEwMC4uOGJmZGFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi91dmRfdjJfMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdXZkX3YyXzIuYwpAQCAtNDUsNyArNDUsNyBAQAogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDAoVVZEX0NPTlRFWFRfSUQsIDApKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBmZW5jZS0+c2VxKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCBQQUNLRVQwKFVWRF9HUENPTV9WQ1BVX0RBVEEwLCAwKSk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgYWRkciAmIDB4ZmZmZmZmZmYpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIGxvd2VyXzMyX2JpdHMoYWRkcikpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJpbmcsIFBBQ0tFVDAoVVZEX0dQQ09NX1ZDUFVfREFUQTEsIDApKTsKIAlyYWRlb25fcmluZ193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKGFkZHIpICYgMHhmZik7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmluZywgUEFDS0VUMChVVkRfR1BDT01fVkNQVV9DTUQsIDApKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9LY29uZmlnCmluZGV4IGQ4ZTgzNWEuLjJlM2Q3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBEUk1fUkNBUl9EVQogCXRyaXN0YXRlICJEUk0gU3VwcG9ydCBmb3IgUi1DYXIgRGlzcGxheSBVbml0IgogCWRlcGVuZHMgb24gRFJNICYmIEFSTQorCWRlcGVuZHMgb24gQVJDSF9TSE1PQklMRSB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRFJNX0tNU19IRUxQRVIKIAlzZWxlY3QgRFJNX0tNU19DTUFfSEVMUEVSCiAJc2VsZWN0IERSTV9HRU1fQ01BX0hFTFBFUgpAQCAtMTIsNiArMTMsNyBAQAogY29uZmlnIERSTV9SQ0FSX0xWRFMKIAlib29sICJSLUNhciBEVSBMVkRTIEVuY29kZXIgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIERSTV9SQ0FSX0RVCisJZGVwZW5kcyBvbiBBUkNIX1I4QTc3OTAgfHwgQVJDSF9SOEE3NzkxIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IHRoZSBSLUNhciBEaXNwbGF5IFVuaXQgZW1iZWRkZWQgTFZEUyBlbmNvZGVycwogCSAgKGN1cnJlbnRseSBvbmx5IG9uIFI4QTc3OTApLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9sdmRzY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2x2ZHNjb24uYwppbmRleCA0ZjNiYTkzLi4yODkwNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2x2ZHNjb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2x2ZHNjb24uYwpAQCAtNTcsMTUgKzU3LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCByY2FyX2R1X2x2ZHNfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXJldHVybiBNT0RFX09LOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGNvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHJjYXJfZHVfbHZkc19jb25uZWN0b3JfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gcmNhcl9kdV9sdmRzX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAogCS5iZXN0X2VuY29kZXIgPSByY2FyX2R1X2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X3ZnYWNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV92Z2Fjb24uYwppbmRleCA0MWQ1NjNhLi5jY2ZlNjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X3ZnYWNvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfdmdhY29uLmMKQEAgLTI1LDE1ICsyNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmNhcl9kdV92Z2FfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXJldHVybiBNT0RFX09LOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGNvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHJjYXJfZHVfdmdhX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCi0JLm1vZGVfdmFsaWQgPSByY2FyX2R1X3ZnYV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIAkuYmVzdF9lbmNvZGVyID0gcmNhcl9kdV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYwppbmRleCBkMmIyZGY5Li5jOTdjZGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9iY2kuYwpAQCAtMTA3OSw0ICsxMDc5LDQgQEAKIAlEUk1fSU9DVExfREVGX0RSVihTQVZBR0VfQkNJX0VWRU5UX1dBSVQsIHNhdmFnZV9iY2lfZXZlbnRfd2FpdCwgRFJNX0FVVEgpLAogfTsKIAotaW50IHNhdmFnZV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShzYXZhZ2VfaW9jdGxzKTsKK2ludCBzYXZhZ2VfbWF4X2lvY3RsID0gQVJSQVlfU0laRShzYXZhZ2VfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL0tjb25maWcKaW5kZXggMmVlNDRjYS4uYTUwZmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgRFJNX1NITU9CSUxFCiAJdHJpc3RhdGUgIkRSTSBTdXBwb3J0IGZvciBTSCBNb2JpbGUiCi0JZGVwZW5kcyBvbiBEUk0gJiYgKEFSTSB8fCBTVVBFUkgpCisJZGVwZW5kcyBvbiBEUk0gJiYgQVJNCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJc2VsZWN0IERSTV9LTVNfSEVMUEVSCiAJc2VsZWN0IERSTV9LTVNfRkJfSEVMUEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2htb2JpbGUvc2htb2JfZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fY3J0Yy5jCmluZGV4IGU5ZTVlNmQuLmZhZjE3NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fY3J0Yy5jCkBAIC02NzQsMTIgKzY3NCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgc2htb2JfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0JcmV0dXJuIE1PREVfT0s7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXIgKgogc2htb2JfZHJtX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKQEAgLTY5MCw3ICs2ODQsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGNvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHNobW9iX2RybV9jb25uZWN0b3JfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gc2htb2JfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAogCS5iZXN0X2VuY29kZXIgPSBzaG1vYl9kcm1fY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vc2htb2JpbGUvc2htb2JfZHJtX2Rydi5jCmluZGV4IGM4MzljOWMuLjgyYzg0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zaG1vYmlsZS9zaG1vYl9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NobW9iaWxlL3NobW9iX2RybV9kcnYuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2KTsKKwlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2LCBwbGF0Zm9ybV9nZXRfaXJxKGRldi0+cGxhdGZvcm1kZXYsIDApKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5zdGFsbCBJUlEgaGFuZGxlclxuIik7CiAJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19tbS5jCmluZGV4IDA1NzNiZTAuLjc3ZjI4OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfbW0uYwpAQCAtMzU5LDQgKzM1OSw0IEBACiAJRFJNX0lPQ1RMX0RFRl9EUlYoU0lTX0ZCX0lOSVQsIHNpc19mYl9pbml0LCBEUk1fQVVUSCB8IERSTV9NQVNURVIgfCBEUk1fUk9PVF9PTkxZKSwKIH07CiAKLWludCBzaXNfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2lzX2lvY3Rscyk7CitpbnQgc2lzX21heF9pb2N0bCA9IEFSUkFZX1NJWkUoc2lzX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvTWFrZWZpbGUKaW5kZXggZDQzZjIxYi4uMmM2NmE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9NYWtlZmlsZQpAQCAtMSw3ICsxLDYgQEAKIGNjZmxhZ3MtJChDT05GSUdfRFJNX1RFR1JBX0RFQlVHKSArPSAtRERFQlVHCiAKIHRlZ3JhLWRybS15IDo9IFwKLQlidXMubyBcCiAJZHJtLm8gXAogCWdlbS5vIFwKIAlmYi5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9idXMuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9idXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjZWY1Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvYnVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIE5WSURJQSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgImRybS5oIgotCi1zdGF0aWMgaW50IGRybV9ob3N0MXhfc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKLXsKLQljb25zdCBjaGFyICpkZXZpY2UgPSBkZXZfbmFtZShkZXYtPmRldik7Ci0JY29uc3QgY2hhciAqZHJpdmVyID0gZGV2LT5kcml2ZXItPm5hbWU7Ci0JY29uc3QgY2hhciAqYnVzID0gZGV2LT5kZXYtPmJ1cy0+bmFtZTsKLQlpbnQgbGVuZ3RoOwotCi0JbWFzdGVyLT51bmlxdWVfbGVuID0gc3RybGVuKGJ1cykgKyAxICsgc3RybGVuKGRldmljZSk7Ci0JbWFzdGVyLT51bmlxdWVfc2l6ZSA9IG1hc3Rlci0+dW5pcXVlX2xlbjsKLQotCW1hc3Rlci0+dW5pcXVlID0ga21hbGxvYyhtYXN0ZXItPnVuaXF1ZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1hc3Rlci0+dW5pcXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNucHJpbnRmKG1hc3Rlci0+dW5pcXVlLCBtYXN0ZXItPnVuaXF1ZV9sZW4gKyAxLCAiJXM6JXMiLCBidXMsIGRldmljZSk7Ci0KLQlsZW5ndGggPSBzdHJsZW4oZHJpdmVyKSArIDEgKyBtYXN0ZXItPnVuaXF1ZV9sZW47Ci0KLQlkZXYtPmRldm5hbWUgPSBrbWFsbG9jKGxlbmd0aCArIDEsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5kZXZuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNucHJpbnRmKGRldi0+ZGV2bmFtZSwgbGVuZ3RoICsgMSwgIiVzQCVzIiwgZHJpdmVyLCBtYXN0ZXItPnVuaXF1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkcm1fYnVzIGRybV9ob3N0MXhfYnVzID0gewotCS5idXNfdHlwZSA9IERSSVZFUl9CVVNfSE9TVDFYLAotCS5zZXRfYnVzaWQgPSBkcm1faG9zdDF4X3NldF9idXNpZCwKLX07Ci0KLWludCBkcm1faG9zdDF4X2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IGhvc3QxeF9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOwotCWludCByZXQ7Ci0KLQlkcml2ZXItPmJ1cyA9ICZkcm1faG9zdDF4X2J1czsKLQotCWRybSA9IGRybV9kZXZfYWxsb2MoZHJpdmVyLCAmZGV2aWNlLT5kZXYpOwotCWlmICghZHJtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IGRybV9kZXZfcmVnaXN0ZXIoZHJtLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9mcmVlOwotCi0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkXG4iLCBkcml2ZXItPm5hbWUsCi0JCSBkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yLCBkcml2ZXItPnBhdGNobGV2ZWwsCi0JCSBkcml2ZXItPmRhdGUsIGRybS0+cHJpbWFyeS0+aW5kZXgpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlOgotCWRybV9kZXZfdW5yZWYoZHJtKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGRybV9ob3N0MXhfZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgaG9zdDF4X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCB0ZWdyYV9kcm0gKnRlZ3JhID0gZGV2X2dldF9kcnZkYXRhKCZkZXZpY2UtPmRldik7Ci0KLQlkcm1fcHV0X2Rldih0ZWdyYS0+ZHJtKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kYy5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmMKaW5kZXggZWRiODcxZC4uZWY0MDM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHsKIAlib29sIHN1cHBvcnRzX2ludGVybGFjaW5nOworCWJvb2wgc3VwcG9ydHNfY3Vyc29yOwogfTsKIAogc3RydWN0IHRlZ3JhX3BsYW5lIHsKQEAgLTI5LDMwOSArMzAsNzAgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHBsYW5lLCBzdHJ1Y3QgdGVncmFfcGxhbmUsIGJhc2UpOwogfQogCi1zdGF0aWMgaW50IHRlZ3JhX3BsYW5lX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCBjcnRjX3gsCi0JCQkgICAgICBpbnQgY3J0Y195LCB1bnNpZ25lZCBpbnQgY3J0Y193LAotCQkJICAgICAgdW5zaWduZWQgaW50IGNydGNfaCwgdWludDMyX3Qgc3JjX3gsCi0JCQkgICAgICB1aW50MzJfdCBzcmNfeSwgdWludDMyX3Qgc3JjX3csIHVpbnQzMl90IHNyY19oKQorc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV9kY19mb3JtYXQodWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCAqc3dhcCkKIHsKLQlzdHJ1Y3QgdGVncmFfcGxhbmUgKnAgPSB0b190ZWdyYV9wbGFuZShwbGFuZSk7Ci0Jc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKGNydGMpOwotCXN0cnVjdCB0ZWdyYV9kY193aW5kb3cgd2luZG93OwotCXVuc2lnbmVkIGludCBpOworCS8qIGFzc3VtZSBubyBzd2FwcGluZyBvZiBmZXRjaGVkIGRhdGEgKi8KKwlpZiAoc3dhcCkKKwkJKnN3YXAgPSBCWVRFX1NXQVBfTk9TV0FQOwogCi0JbWVtc2V0KCZ3aW5kb3csIDAsIHNpemVvZih3aW5kb3cpKTsKLQl3aW5kb3cuc3JjLnggPSBzcmNfeCA+PiAxNjsKLQl3aW5kb3cuc3JjLnkgPSBzcmNfeSA+PiAxNjsKLQl3aW5kb3cuc3JjLncgPSBzcmNfdyA+PiAxNjsKLQl3aW5kb3cuc3JjLmggPSBzcmNfaCA+PiAxNjsKLQl3aW5kb3cuZHN0LnggPSBjcnRjX3g7Ci0Jd2luZG93LmRzdC55ID0gY3J0Y195OwotCXdpbmRvdy5kc3QudyA9IGNydGNfdzsKLQl3aW5kb3cuZHN0LmggPSBjcnRjX2g7Ci0Jd2luZG93LmZvcm1hdCA9IHRlZ3JhX2RjX2Zvcm1hdChmYi0+cGl4ZWxfZm9ybWF0KTsKLQl3aW5kb3cuYml0c19wZXJfcGl4ZWwgPSBmYi0+Yml0c19wZXJfcGl4ZWw7Ci0Jd2luZG93LmJvdHRvbV91cCA9IHRlZ3JhX2ZiX2lzX2JvdHRvbV91cChmYik7Ci0Jd2luZG93LnRpbGVkID0gdGVncmFfZmJfaXNfdGlsZWQoZmIpOworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCQlyZXR1cm4gV0lOX0NPTE9SX0RFUFRIX1I4RzhCOEE4OwogCi0JZm9yIChpID0gMDsgaSA8IGRybV9mb3JtYXRfbnVtX3BsYW5lcyhmYi0+cGl4ZWxfZm9ybWF0KTsgaSsrKSB7Ci0JCXN0cnVjdCB0ZWdyYV9ibyAqYm8gPSB0ZWdyYV9mYl9nZXRfcGxhbmUoZmIsIGkpOworCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwkJcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9COEc4UjhBODsKIAotCQl3aW5kb3cuYmFzZVtpXSA9IGJvLT5wYWRkciArIGZiLT5vZmZzZXRzW2ldOworCWNhc2UgRFJNX0ZPUk1BVF9SR0I1NjU6CisJCXJldHVybiBXSU5fQ09MT1JfREVQVEhfQjVHNlI1OwogCi0JCS8qCi0JCSAqIFRlZ3JhIGRvZXNuJ3Qgc3VwcG9ydCBkaWZmZXJlbnQgc3RyaWRlcyBmb3IgVSBhbmQgViBwbGFuZXMKLQkJICogc28gd2UgZGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIHVzZXIgdHJpZXMgdG8gZGlzcGxheSBhCi0JCSAqIGZyYW1lYnVmZmVyIHdpdGggc3VjaCBhIGNvbmZpZ3VyYXRpb24uCi0JCSAqLwotCQlpZiAoaSA+PSAyKSB7Ci0JCQlpZiAoZmItPnBpdGNoZXNbaV0gIT0gd2luZG93LnN0cmlkZVsxXSkKLQkJCQlEUk1fRVJST1IoInVuc3VwcG9ydGVkIFVWLXBsYW5lIGNvbmZpZ3VyYXRpb25cbiIpOwotCQl9IGVsc2UgewotCQkJd2luZG93LnN0cmlkZVtpXSA9IGZiLT5waXRjaGVzW2ldOwotCQl9CisJY2FzZSBEUk1fRk9STUFUX1VZVlk6CisJCXJldHVybiBXSU5fQ09MT1JfREVQVEhfWUNiQ3I0MjI7CisKKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKKwkJaWYgKHN3YXApCisJCQkqc3dhcCA9IEJZVEVfU1dBUF9TV0FQMjsKKworCQlyZXR1cm4gV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyOworCisJY2FzZSBEUk1fRk9STUFUX1lVVjQyMDoKKwkJcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9ZQ2JDcjQyMFA7CisKKwljYXNlIERSTV9GT1JNQVRfWVVWNDIyOgorCQlyZXR1cm4gV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUDsKKworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAotCXJldHVybiB0ZWdyYV9kY19zZXR1cF93aW5kb3coZGMsIHAtPmluZGV4LCAmd2luZG93KTsKKwlXQVJOKDEsICJ1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJXUsIHVzaW5nIGRlZmF1bHRcbiIsIGZvcm1hdCk7CisJcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9COEc4UjhBODsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9wbGFuZV9kaXNhYmxlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQorc3RhdGljIGJvb2wgdGVncmFfZGNfZm9ybWF0X2lzX3l1dih1bnNpZ25lZCBpbnQgZm9ybWF0LCBib29sICpwbGFuYXIpCiB7Ci0Jc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKHBsYW5lLT5jcnRjKTsKLQlzdHJ1Y3QgdGVncmFfcGxhbmUgKnAgPSB0b190ZWdyYV9wbGFuZShwbGFuZSk7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyOgorCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lVVjQyMjoKKwkJaWYgKHBsYW5hcikKKwkJCSpwbGFuYXIgPSBmYWxzZTsKIAotCWlmICghcGxhbmUtPmNydGMpCi0JCXJldHVybiAwOworCQlyZXR1cm4gdHJ1ZTsKIAotCXZhbHVlID0gV0lORE9XX0FfU0VMRUNUIDw8IHAtPmluZGV4OwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0NNRF9ESVNQTEFZX1dJTkRPV19IRUFERVIpOworCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIwUDoKKwljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjBQOgorCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUDoKKwljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjJQOgorCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUjoKKwljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjJSOgorCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUkE6CisJY2FzZSBXSU5fQ09MT1JfREVQVEhfWVVWNDIyUkE6CisJCWlmIChwbGFuYXIpCisJCQkqcGxhbmFyID0gdHJ1ZTsKIAotCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7Ci0JdmFsdWUgJj0gfldJTl9FTkFCTEU7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfV0lOX1dJTl9PUFRJT05TKTsKLQotCXRlZ3JhX2RjX3dyaXRlbChkYywgV0lOX0FfVVBEQVRFIDw8IHAtPmluZGV4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCBXSU5fQV9BQ1RfUkVRIDw8IHAtPmluZGV4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKLXsKLQlzdHJ1Y3QgdGVncmFfcGxhbmUgKnAgPSB0b190ZWdyYV9wbGFuZShwbGFuZSk7Ci0KLQl0ZWdyYV9wbGFuZV9kaXNhYmxlKHBsYW5lKTsKLQlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7Ci0Ja2ZyZWUocCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIHRlZ3JhX3BsYW5lX2Z1bmNzID0gewotCS51cGRhdGVfcGxhbmUgPSB0ZWdyYV9wbGFuZV91cGRhdGUsCi0JLmRpc2FibGVfcGxhbmUgPSB0ZWdyYV9wbGFuZV9kaXNhYmxlLAotCS5kZXN0cm95ID0gdGVncmFfcGxhbmVfZGVzdHJveSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBwbGFuZV9mb3JtYXRzW10gPSB7Ci0JRFJNX0ZPUk1BVF9YQkdSODg4OCwKLQlEUk1fRk9STUFUX1hSR0I4ODg4LAotCURSTV9GT1JNQVRfUkdCNTY1LAotCURSTV9GT1JNQVRfVVlWWSwKLQlEUk1fRk9STUFUX1lVVjQyMCwKLQlEUk1fRk9STUFUX1lVVjQyMiwKLX07Ci0KLXN0YXRpYyBpbnQgdGVncmFfZGNfYWRkX3BsYW5lcyhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgdGVncmFfZGMgKmRjKQotewotCXVuc2lnbmVkIGludCBpOwotCWludCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlzdHJ1Y3QgdGVncmFfcGxhbmUgKnBsYW5lOwotCi0JCXBsYW5lID0ga3phbGxvYyhzaXplb2YoKnBsYW5lKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGxhbmUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlwbGFuZS0+aW5kZXggPSAxICsgaTsKLQotCQllcnIgPSBkcm1fcGxhbmVfaW5pdChkcm0sICZwbGFuZS0+YmFzZSwgMSA8PCBkYy0+cGlwZSwKLQkJCQkgICAgICZ0ZWdyYV9wbGFuZV9mdW5jcywgcGxhbmVfZm9ybWF0cywKLQkJCQkgICAgIEFSUkFZX1NJWkUocGxhbmVfZm9ybWF0cyksIGZhbHNlKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWtmcmVlKHBsYW5lKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVncmFfZGNfc2V0X2Jhc2Uoc3RydWN0IHRlZ3JhX2RjICpkYywgaW50IHgsIGludCB5LAotCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKLXsKLQl1bnNpZ25lZCBpbnQgZm9ybWF0ID0gdGVncmFfZGNfZm9ybWF0KGZiLT5waXhlbF9mb3JtYXQpOwotCXN0cnVjdCB0ZWdyYV9ibyAqYm8gPSB0ZWdyYV9mYl9nZXRfcGxhbmUoZmIsIDApOwotCXVuc2lnbmVkIGludCBoX29mZnNldCA9IDAsIHZfb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JdGVncmFfZGNfd3JpdGVsKGRjLCBXSU5ET1dfQV9TRUxFQ1QsIERDX0NNRF9ESVNQTEFZX1dJTkRPV19IRUFERVIpOwotCi0JdmFsdWUgPSBmYi0+b2Zmc2V0c1swXSArIHkgKiBmYi0+cGl0Y2hlc1swXSArCi0JCXggKiBmYi0+Yml0c19wZXJfcGl4ZWwgLyA4OwotCi0JdGVncmFfZGNfd3JpdGVsKGRjLCBiby0+cGFkZHIgKyB2YWx1ZSwgRENfV0lOQlVGX1NUQVJUX0FERFIpOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgZmItPnBpdGNoZXNbMF0sIERDX1dJTl9MSU5FX1NUUklERSk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCBmb3JtYXQsIERDX1dJTl9DT0xPUl9ERVBUSCk7Ci0KLQlpZiAodGVncmFfZmJfaXNfdGlsZWQoZmIpKSB7Ci0JCXZhbHVlID0gRENfV0lOX0JVRkZFUl9BRERSX01PREVfVElMRV9VViB8Ci0JCQlEQ19XSU5fQlVGRkVSX0FERFJfTU9ERV9USUxFOwotCX0gZWxzZSB7Ci0JCXZhbHVlID0gRENfV0lOX0JVRkZFUl9BRERSX01PREVfTElORUFSX1VWIHwKLQkJCURDX1dJTl9CVUZGRVJfQUREUl9NT0RFX0xJTkVBUjsKLQl9Ci0KLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fQlVGRkVSX0FERFJfTU9ERSk7Ci0KLQkvKiBtYWtlIHN1cmUgYm90dG9tLXVwIGJ1ZmZlcnMgYXJlIHByb3Blcmx5IGRpc3BsYXllZCAqLwotCWlmICh0ZWdyYV9mYl9pc19ib3R0b21fdXAoZmIpKSB7Ci0JCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7Ci0JCXZhbHVlIHw9IElOVkVSVF9WOwotCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fV0lOX09QVElPTlMpOwotCi0JCXZfb2Zmc2V0ICs9IGZiLT5oZWlnaHQgLSAxOwotCX0gZWxzZSB7Ci0JCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7Ci0JCXZhbHVlICY9IH5JTlZFUlRfVjsKLQkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfV0lOX1dJTl9PUFRJT05TKTsKLQl9Ci0KLQl0ZWdyYV9kY193cml0ZWwoZGMsIGhfb2Zmc2V0LCBEQ19XSU5CVUZfQUREUl9IX09GRlNFVCk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2X29mZnNldCwgRENfV0lOQlVGX0FERFJfVl9PRkZTRVQpOwotCi0JdmFsdWUgPSBHRU5FUkFMX1VQREFURSB8IFdJTl9BX1VQREFURTsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7Ci0KLQl2YWx1ZSA9IEdFTkVSQUxfQUNUX1JFUSB8IFdJTl9BX0FDVF9SRVE7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdGVncmFfZGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgdGVncmFfZGMgKmRjKQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7Ci0KLQl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19DTURfSU5UX01BU0spOwotCXZhbHVlIHw9IFZCTEFOS19JTlQ7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0lOVF9NQVNLKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgdGVncmFfZGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IHRlZ3JhX2RjICpkYykKLXsKLQl1bnNpZ25lZCBsb25nIHZhbHVlLCBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkYy0+bG9jaywgZmxhZ3MpOwotCi0JdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0lOVF9NQVNLKTsKLQl2YWx1ZSAmPSB+VkJMQU5LX0lOVDsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfSU5UX01BU0spOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGMtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfZGNfZmluaXNoX3BhZ2VfZmxpcChzdHJ1Y3QgdGVncmFfZGMgKmRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYy0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9jcnRjICpjcnRjID0gJmRjLT5iYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGJhc2U7Ci0Jc3RydWN0IHRlZ3JhX2JvICpibzsKLQotCWlmICghZGMtPmV2ZW50KQotCQlyZXR1cm47Ci0KLQlibyA9IHRlZ3JhX2ZiX2dldF9wbGFuZShjcnRjLT5wcmltYXJ5LT5mYiwgMCk7Ci0KLQkvKiBjaGVjayBpZiBuZXcgc3RhcnQgYWRkcmVzcyBoYXMgYmVlbiBsYXRjaGVkICovCi0JdGVncmFfZGNfd3JpdGVsKGRjLCBSRUFEX01VWCwgRENfQ01EX1NUQVRFX0FDQ0VTUyk7Ci0JYmFzZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19XSU5CVUZfU1RBUlRfQUREUik7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCAwLCBEQ19DTURfU1RBVEVfQUNDRVNTKTsKLQotCWlmIChiYXNlID09IGJvLT5wYWRkciArIGNydGMtPnByaW1hcnktPmZiLT5vZmZzZXRzWzBdKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkcm0tPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQkJZHJtX3NlbmRfdmJsYW5rX2V2ZW50KGRybSwgZGMtPnBpcGUsIGRjLT5ldmVudCk7Ci0JCWRybV92YmxhbmtfcHV0KGRybSwgZGMtPnBpcGUpOwotCQlkYy0+ZXZlbnQgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcm0tPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLXZvaWQgdGVncmFfZGNfY2FuY2VsX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMoY3J0Yyk7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGNydGMtPmRldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRybS0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRjLT5ldmVudCAmJiBkYy0+ZXZlbnQtPmJhc2UuZmlsZV9wcml2ID09IGZpbGUpIHsKLQkJZGMtPmV2ZW50LT5iYXNlLmRlc3Ryb3koJmRjLT5ldmVudC0+YmFzZSk7Ci0JCWRybV92YmxhbmtfcHV0KGRybSwgZGMtPnBpcGUpOwotCQlkYy0+ZXZlbnQgPSBOVUxMOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRybS0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHRlZ3JhX2RjX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAotCQkJICAgICAgc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQsIHVpbnQzMl90IHBhZ2VfZmxpcF9mbGFncykKLXsKLQlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMoY3J0Yyk7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGNydGMtPmRldjsKLQotCWlmIChkYy0+ZXZlbnQpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoZXZlbnQpIHsKLQkJZXZlbnQtPnBpcGUgPSBkYy0+cGlwZTsKLQkJZGMtPmV2ZW50ID0gZXZlbnQ7Ci0JCWRybV92YmxhbmtfZ2V0KGRybSwgZGMtPnBpcGUpOwotCX0KLQotCXRlZ3JhX2RjX3NldF9iYXNlKGRjLCAwLCAwLCBmYik7Ci0JY3J0Yy0+cHJpbWFyeS0+ZmIgPSBmYjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkcm1fY3J0Y19jbGVhcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0JbWVtc2V0KGNydGMsIDAsIHNpemVvZigqY3J0YykpOwotfQotCi1zdGF0aWMgdm9pZCB0ZWdyYV9kY19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlkcm1fY3J0Y19jbGVhbnVwKGNydGMpOwotCWRybV9jcnRjX2NsZWFyKGNydGMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHRlZ3JhX2NydGNfZnVuY3MgPSB7Ci0JLnBhZ2VfZmxpcCA9IHRlZ3JhX2RjX3BhZ2VfZmxpcCwKLQkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAotCS5kZXN0cm95ID0gdGVncmFfZGNfZGVzdHJveSwKLX07Ci0KLXN0YXRpYyB2b2lkIHRlZ3JhX2NydGNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKGNydGMpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7Ci0KLQlkcm1fZm9yX2VhY2hfbGVnYWN5X3BsYW5lKHBsYW5lLCAmZHJtLT5tb2RlX2NvbmZpZy5wbGFuZV9saXN0KSB7Ci0JCWlmIChwbGFuZS0+Y3J0YyA9PSBjcnRjKSB7Ci0JCQl0ZWdyYV9wbGFuZV9kaXNhYmxlKHBsYW5lKTsKLQkJCXBsYW5lLT5jcnRjID0gTlVMTDsKLQotCQkJaWYgKHBsYW5lLT5mYikgewotCQkJCWRybV9mcmFtZWJ1ZmZlcl91bnJlZmVyZW5jZShwbGFuZS0+ZmIpOwotCQkJCXBsYW5lLT5mYiA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlkcm1fdmJsYW5rX29mZihkcm0sIGRjLT5waXBlKTsKLX0KLQotc3RhdGljIGJvb2wgdGVncmFfY3J0Y19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkKQotewotCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgY29tcHV0ZV9kZGFfaW5jKHVuc2lnbmVkIGludCBpbiwgdW5zaWduZWQgaW50IG91dCwgYm9vbCB2LApAQCAtMzc0LDEwMyArMTM2LDggQEAKIAlyZXR1cm4gZGZpeGVkX2ZyYWMoaW5mKTsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9kY19zZXRfdGltaW5ncyhzdHJ1Y3QgdGVncmFfZGMgKmRjLAotCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCS8qIFRPRE86IEZvciBIRE1JIGNvbXBsaWFuY2UsIGggJiB2IHJlZl90b19zeW5jIHNob3VsZCBiZSBzZXQgdG8gMSAqLwotCXVuc2lnbmVkIGludCBoX3JlZl90b19zeW5jID0gMDsKLQl1bnNpZ25lZCBpbnQgdl9yZWZfdG9fc3luYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCXRlZ3JhX2RjX3dyaXRlbChkYywgMHgwLCBEQ19ESVNQX0RJU1BfVElNSU5HX09QVElPTlMpOwotCi0JdmFsdWUgPSAodl9yZWZfdG9fc3luYyA8PCAxNikgfCBoX3JlZl90b19zeW5jOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfUkVGX1RPX1NZTkMpOwotCi0JdmFsdWUgPSAoKG1vZGUtPnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5jX3N0YXJ0KSA8PCAxNikgfAotCQkoKG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0KSA8PCAgMCk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9TWU5DX1dJRFRIKTsKLQotCXZhbHVlID0gKChtb2RlLT52dG90YWwgLSBtb2RlLT52c3luY19lbmQpIDw8IDE2KSB8Ci0JCSgobW9kZS0+aHRvdGFsIC0gbW9kZS0+aHN5bmNfZW5kKSA8PCAgMCk7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9CQUNLX1BPUkNIKTsKLQotCXZhbHVlID0gKChtb2RlLT52c3luY19zdGFydCAtIG1vZGUtPnZkaXNwbGF5KSA8PCAxNikgfAotCQkoKG1vZGUtPmhzeW5jX3N0YXJ0IC0gbW9kZS0+aGRpc3BsYXkpIDw8ICAwKTsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0ZST05UX1BPUkNIKTsKLQotCXZhbHVlID0gKG1vZGUtPnZkaXNwbGF5IDw8IDE2KSB8IG1vZGUtPmhkaXNwbGF5OwotCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfQUNUSVZFKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRlZ3JhX2NydGNfc2V0dXBfY2xrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQl1bnNpZ25lZCBsb25nICpkaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBwY2xrID0gbW9kZS0+Y2xvY2sgKiAxMDAwLCByYXRlOwotCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhjcnRjKTsKLQlzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQgPSBOVUxMOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKLQlsb25nIGVycjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmNydGMtPmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKQotCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKSB7Ci0JCQlvdXRwdXQgPSBlbmNvZGVyX3RvX291dHB1dChlbmNvZGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAoIW91dHB1dCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKgotCSAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIgd2lsbCBkaXZpZGUgaXRzIHBhcmVudAotCSAqIGNsb2NrIGJ5IDIgdG8gZ2VuZXJhdGUgdGhlIHBpeGVsIGNsb2NrLgotCSAqLwotCWVyciA9IHRlZ3JhX291dHB1dF9zZXR1cF9jbG9jayhvdXRwdXQsIGRjLT5jbGssIHBjbGsgKiAyKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKGRjLT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY2xvY2s6ICVsZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyYXRlID0gY2xrX2dldF9yYXRlKGRjLT5jbGspOwotCSpkaXYgPSAocmF0ZSAqIDIgLyBwY2xrKSAtIDI7Ci0KLQlEUk1fREVCVUdfS01TKCJyYXRlOiAlbHUsIGRpdjogJWx1XG4iLCByYXRlLCAqZGl2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCB0ZWdyYV9kY19mb3JtYXRfaXNfeXV2KHVuc2lnbmVkIGludCBmb3JtYXQsIGJvb2wgKnBsYW5hcikKLXsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyOgotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lVVjQyMjoKLQkJaWYgKHBsYW5hcikKLQkJCSpwbGFuYXIgPSBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIwUDoKLQljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjBQOgotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUDoKLQljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjJQOgotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUjoKLQljYXNlIFdJTl9DT0xPUl9ERVBUSF9ZVVY0MjJSOgotCWNhc2UgV0lOX0NPTE9SX0RFUFRIX1lDYkNyNDIyUkE6Ci0JY2FzZSBXSU5fQ09MT1JfREVQVEhfWVVWNDIyUkE6Ci0JCWlmIChwbGFuYXIpCi0JCQkqcGxhbmFyID0gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWludCB0ZWdyYV9kY19zZXR1cF93aW5kb3coc3RydWN0IHRlZ3JhX2RjICpkYywgdW5zaWduZWQgaW50IGluZGV4LAotCQkJICBjb25zdCBzdHJ1Y3QgdGVncmFfZGNfd2luZG93ICp3aW5kb3cpCitzdGF0aWMgaW50IHRlZ3JhX2RjX3NldHVwX3dpbmRvdyhzdHJ1Y3QgdGVncmFfZGMgKmRjLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkJIGNvbnN0IHN0cnVjdCB0ZWdyYV9kY193aW5kb3cgKndpbmRvdykKIHsKIAl1bnNpZ25lZCBoX29mZnNldCwgdl9vZmZzZXQsIGhfc2l6ZSwgdl9zaXplLCBoX2RkYSwgdl9kZGEsIGJwcDsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwpAQCAtNDkwLDcgKzE1Nyw3IEBACiAJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfV0lORE9XX0hFQURFUik7CiAKIAl0ZWdyYV9kY193cml0ZWwoZGMsIHdpbmRvdy0+Zm9ybWF0LCBEQ19XSU5fQ09MT1JfREVQVEgpOwotCXRlZ3JhX2RjX3dyaXRlbChkYywgMCwgRENfV0lOX0JZVEVfU1dBUCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB3aW5kb3ctPnN3YXAsIERDX1dJTl9CWVRFX1NXQVApOwogCiAJdmFsdWUgPSBWX1BPU0lUSU9OKHdpbmRvdy0+ZHN0LnkpIHwgSF9QT1NJVElPTih3aW5kb3ctPmRzdC54KTsKIAl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fUE9TSVRJT04pOwpAQCAtNTc0LDcgKzI0MSw3IEBACiAJfQogCiAJaWYgKHdpbmRvdy0+Ym90dG9tX3VwKQotCQl2YWx1ZSB8PSBJTlZFUlRfVjsKKwkJdmFsdWUgfD0gVl9ESVJFQ1RJT047CiAKIAl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fV0lOX09QVElPTlMpOwogCkBAIC02MTEsMzMgKzI3OCw0ODYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgaW50IHRlZ3JhX2RjX2Zvcm1hdCh1aW50MzJfdCBmb3JtYXQpCitzdGF0aWMgaW50IHRlZ3JhX3BsYW5lX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCBjcnRjX3gsCisJCQkgICAgICBpbnQgY3J0Y195LCB1bnNpZ25lZCBpbnQgY3J0Y193LAorCQkJICAgICAgdW5zaWduZWQgaW50IGNydGNfaCwgdWludDMyX3Qgc3JjX3gsCisJCQkgICAgICB1aW50MzJfdCBzcmNfeSwgdWludDMyX3Qgc3JjX3csIHVpbnQzMl90IHNyY19oKQogewotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgotCQlyZXR1cm4gV0lOX0NPTE9SX0RFUFRIX1I4RzhCOEE4OworCXN0cnVjdCB0ZWdyYV9wbGFuZSAqcCA9IHRvX3RlZ3JhX3BsYW5lKHBsYW5lKTsKKwlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMoY3J0Yyk7CisJc3RydWN0IHRlZ3JhX2RjX3dpbmRvdyB3aW5kb3c7CisJdW5zaWduZWQgaW50IGk7CiAKLQljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6Ci0JCXJldHVybiBXSU5fQ09MT1JfREVQVEhfQjhHOFI4QTg7CisJbWVtc2V0KCZ3aW5kb3csIDAsIHNpemVvZih3aW5kb3cpKTsKKwl3aW5kb3cuc3JjLnggPSBzcmNfeCA+PiAxNjsKKwl3aW5kb3cuc3JjLnkgPSBzcmNfeSA+PiAxNjsKKwl3aW5kb3cuc3JjLncgPSBzcmNfdyA+PiAxNjsKKwl3aW5kb3cuc3JjLmggPSBzcmNfaCA+PiAxNjsKKwl3aW5kb3cuZHN0LnggPSBjcnRjX3g7CisJd2luZG93LmRzdC55ID0gY3J0Y195OworCXdpbmRvdy5kc3QudyA9IGNydGNfdzsKKwl3aW5kb3cuZHN0LmggPSBjcnRjX2g7CisJd2luZG93LmZvcm1hdCA9IHRlZ3JhX2RjX2Zvcm1hdChmYi0+cGl4ZWxfZm9ybWF0LCAmd2luZG93LnN3YXApOworCXdpbmRvdy5iaXRzX3Blcl9waXhlbCA9IGZiLT5iaXRzX3Blcl9waXhlbDsKKwl3aW5kb3cuYm90dG9tX3VwID0gdGVncmFfZmJfaXNfYm90dG9tX3VwKGZiKTsKKwl3aW5kb3cudGlsZWQgPSB0ZWdyYV9mYl9pc190aWxlZChmYik7CiAKLQljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgotCQlyZXR1cm4gV0lOX0NPTE9SX0RFUFRIX0I1RzZSNTsKKwlmb3IgKGkgPSAwOyBpIDwgZHJtX2Zvcm1hdF9udW1fcGxhbmVzKGZiLT5waXhlbF9mb3JtYXQpOyBpKyspIHsKKwkJc3RydWN0IHRlZ3JhX2JvICpibyA9IHRlZ3JhX2ZiX2dldF9wbGFuZShmYiwgaSk7CiAKLQljYXNlIERSTV9GT1JNQVRfVVlWWToKLQkJcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9ZQ2JDcjQyMjsKKwkJd2luZG93LmJhc2VbaV0gPSBiby0+cGFkZHIgKyBmYi0+b2Zmc2V0c1tpXTsKIAotCWNhc2UgRFJNX0ZPUk1BVF9ZVVY0MjA6Ci0JCXJldHVybiBXSU5fQ09MT1JfREVQVEhfWUNiQ3I0MjBQOwotCi0JY2FzZSBEUk1fRk9STUFUX1lVVjQyMjoKLQkJcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9ZQ2JDcjQyMlA7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKKwkJLyoKKwkJICogVGVncmEgZG9lc24ndCBzdXBwb3J0IGRpZmZlcmVudCBzdHJpZGVzIGZvciBVIGFuZCBWIHBsYW5lcworCQkgKiBzbyB3ZSBkaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgdXNlciB0cmllcyB0byBkaXNwbGF5IGEKKwkJICogZnJhbWVidWZmZXIgd2l0aCBzdWNoIGEgY29uZmlndXJhdGlvbi4KKwkJICovCisJCWlmIChpID49IDIpIHsKKwkJCWlmIChmYi0+cGl0Y2hlc1tpXSAhPSB3aW5kb3cuc3RyaWRlWzFdKQorCQkJCURSTV9FUlJPUigidW5zdXBwb3J0ZWQgVVYtcGxhbmUgY29uZmlndXJhdGlvblxuIik7CisJCX0gZWxzZSB7CisJCQl3aW5kb3cuc3RyaWRlW2ldID0gZmItPnBpdGNoZXNbaV07CisJCX0KIAl9CiAKLQlXQVJOKDEsICJ1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJXUsIHVzaW5nIGRlZmF1bHRcbiIsIGZvcm1hdCk7Ci0JcmV0dXJuIFdJTl9DT0xPUl9ERVBUSF9COEc4UjhBODsKKwlyZXR1cm4gdGVncmFfZGNfc2V0dXBfd2luZG93KGRjLCBwLT5pbmRleCwgJndpbmRvdyk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcGxhbmVfZGlzYWJsZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMocGxhbmUtPmNydGMpOworCXN0cnVjdCB0ZWdyYV9wbGFuZSAqcCA9IHRvX3RlZ3JhX3BsYW5lKHBsYW5lKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJaWYgKCFwbGFuZS0+Y3J0YykKKwkJcmV0dXJuIDA7CisKKwl2YWx1ZSA9IFdJTkRPV19BX1NFTEVDVCA8PCBwLT5pbmRleDsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9XSU5ET1dfSEVBREVSKTsKKworCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7CisJdmFsdWUgJj0gfldJTl9FTkFCTEU7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfV0lOX1dJTl9PUFRJT05TKTsKKworCXRlZ3JhX2RjX3dyaXRlbChkYywgV0lOX0FfVVBEQVRFIDw8IHAtPmluZGV4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCBXSU5fQV9BQ1RfUkVRIDw8IHAtPmluZGV4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwlzdHJ1Y3QgdGVncmFfcGxhbmUgKnAgPSB0b190ZWdyYV9wbGFuZShwbGFuZSk7CisKKwl0ZWdyYV9wbGFuZV9kaXNhYmxlKHBsYW5lKTsKKwlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7CisJa2ZyZWUocCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIHRlZ3JhX3BsYW5lX2Z1bmNzID0geworCS51cGRhdGVfcGxhbmUgPSB0ZWdyYV9wbGFuZV91cGRhdGUsCisJLmRpc2FibGVfcGxhbmUgPSB0ZWdyYV9wbGFuZV9kaXNhYmxlLAorCS5kZXN0cm95ID0gdGVncmFfcGxhbmVfZGVzdHJveSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBwbGFuZV9mb3JtYXRzW10gPSB7CisJRFJNX0ZPUk1BVF9YQkdSODg4OCwKKwlEUk1fRk9STUFUX1hSR0I4ODg4LAorCURSTV9GT1JNQVRfUkdCNTY1LAorCURSTV9GT1JNQVRfVVlWWSwKKwlEUk1fRk9STUFUX1lVWVYsCisJRFJNX0ZPUk1BVF9ZVVY0MjAsCisJRFJNX0ZPUk1BVF9ZVVY0MjIsCit9OworCitzdGF0aWMgaW50IHRlZ3JhX2RjX2FkZF9wbGFuZXMoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IHRlZ3JhX2RjICpkYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3RydWN0IHRlZ3JhX3BsYW5lICpwbGFuZTsKKworCQlwbGFuZSA9IGt6YWxsb2Moc2l6ZW9mKCpwbGFuZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXBsYW5lKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcGxhbmUtPmluZGV4ID0gMSArIGk7CisKKwkJZXJyID0gZHJtX3BsYW5lX2luaXQoZHJtLCAmcGxhbmUtPmJhc2UsIDEgPDwgZGMtPnBpcGUsCisJCQkJICAgICAmdGVncmFfcGxhbmVfZnVuY3MsIHBsYW5lX2Zvcm1hdHMsCisJCQkJICAgICBBUlJBWV9TSVpFKHBsYW5lX2Zvcm1hdHMpLCBmYWxzZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShwbGFuZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZGNfc2V0X2Jhc2Uoc3RydWN0IHRlZ3JhX2RjICpkYywgaW50IHgsIGludCB5LAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlzdHJ1Y3QgdGVncmFfYm8gKmJvID0gdGVncmFfZmJfZ2V0X3BsYW5lKGZiLCAwKTsKKwl1bnNpZ25lZCBpbnQgaF9vZmZzZXQgPSAwLCB2X29mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IGZvcm1hdCwgc3dhcDsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJdGVncmFfZGNfd3JpdGVsKGRjLCBXSU5ET1dfQV9TRUxFQ1QsIERDX0NNRF9ESVNQTEFZX1dJTkRPV19IRUFERVIpOworCisJdmFsdWUgPSBmYi0+b2Zmc2V0c1swXSArIHkgKiBmYi0+cGl0Y2hlc1swXSArCisJCXggKiBmYi0+Yml0c19wZXJfcGl4ZWwgLyA4OworCisJdGVncmFfZGNfd3JpdGVsKGRjLCBiby0+cGFkZHIgKyB2YWx1ZSwgRENfV0lOQlVGX1NUQVJUX0FERFIpOworCXRlZ3JhX2RjX3dyaXRlbChkYywgZmItPnBpdGNoZXNbMF0sIERDX1dJTl9MSU5FX1NUUklERSk7CisKKwlmb3JtYXQgPSB0ZWdyYV9kY19mb3JtYXQoZmItPnBpeGVsX2Zvcm1hdCwgJnN3YXApOworCXRlZ3JhX2RjX3dyaXRlbChkYywgZm9ybWF0LCBEQ19XSU5fQ09MT1JfREVQVEgpOworCXRlZ3JhX2RjX3dyaXRlbChkYywgc3dhcCwgRENfV0lOX0JZVEVfU1dBUCk7CisKKwlpZiAodGVncmFfZmJfaXNfdGlsZWQoZmIpKSB7CisJCXZhbHVlID0gRENfV0lOX0JVRkZFUl9BRERSX01PREVfVElMRV9VViB8CisJCQlEQ19XSU5fQlVGRkVSX0FERFJfTU9ERV9USUxFOworCX0gZWxzZSB7CisJCXZhbHVlID0gRENfV0lOX0JVRkZFUl9BRERSX01PREVfTElORUFSX1VWIHwKKwkJCURDX1dJTl9CVUZGRVJfQUREUl9NT0RFX0xJTkVBUjsKKwl9CisKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fQlVGRkVSX0FERFJfTU9ERSk7CisKKwkvKiBtYWtlIHN1cmUgYm90dG9tLXVwIGJ1ZmZlcnMgYXJlIHByb3Blcmx5IGRpc3BsYXllZCAqLworCWlmICh0ZWdyYV9mYl9pc19ib3R0b21fdXAoZmIpKSB7CisJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7CisJCXZhbHVlIHw9IFZfRElSRUNUSU9OOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19XSU5fV0lOX09QVElPTlMpOworCisJCXZfb2Zmc2V0ICs9IGZiLT5oZWlnaHQgLSAxOworCX0gZWxzZSB7CisJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTl9XSU5fT1BUSU9OUyk7CisJCXZhbHVlICY9IH5WX0RJUkVDVElPTjsKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfV0lOX1dJTl9PUFRJT05TKTsKKwl9CisKKwl0ZWdyYV9kY193cml0ZWwoZGMsIGhfb2Zmc2V0LCBEQ19XSU5CVUZfQUREUl9IX09GRlNFVCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2X29mZnNldCwgRENfV0lOQlVGX0FERFJfVl9PRkZTRVQpOworCisJdmFsdWUgPSBHRU5FUkFMX1VQREFURSB8IFdJTl9BX1VQREFURTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisKKwl2YWx1ZSA9IEdFTkVSQUxfQUNUX1JFUSB8IFdJTl9BX0FDVF9SRVE7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdGVncmFfZGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgdGVncmFfZGMgKmRjKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7CisKKwl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19DTURfSU5UX01BU0spOworCXZhbHVlIHw9IFZCTEFOS19JTlQ7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0lOVF9NQVNLKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgdGVncmFfZGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IHRlZ3JhX2RjICpkYykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlLCBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYy0+bG9jaywgZmxhZ3MpOworCisJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0lOVF9NQVNLKTsKKwl2YWx1ZSAmPSB+VkJMQU5LX0lOVDsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfSU5UX01BU0spOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0ZWdyYV9kY19jdXJzb3Jfc2V0MihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKKwkJCQl1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHdpZHRoLAorCQkJCXVpbnQzMl90IGhlaWdodCwgaW50MzJfdCBob3RfeCwgaW50MzJfdCBob3RfeSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gQ1VSU09SX0NMSVBfRElTUExBWTsKKwlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMoY3J0Yyk7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IHRlZ3JhX2JvICpibyA9IE5VTEw7CisKKwlpZiAoIWRjLT5zb2MtPnN1cHBvcnRzX2N1cnNvcikKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICh3aWR0aCAhPSBoZWlnaHQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgMzI6CisJCXZhbHVlIHw9IENVUlNPUl9TSVpFXzMyeDMyOworCQlicmVhazsKKworCWNhc2UgNjQ6CisJCXZhbHVlIHw9IENVUlNPUl9TSVpFXzY0eDY0OworCQlicmVhazsKKworCWNhc2UgMTI4OgorCQl2YWx1ZSB8PSBDVVJTT1JfU0laRV8xMjh4MTI4OworCisJY2FzZSAyNTY6CisJCXZhbHVlIHw9IENVUlNPUl9TSVpFXzI1NngyNTY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGhhbmRsZSkgeworCQlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoY3J0Yy0+ZGV2LCBmaWxlLCBoYW5kbGUpOworCQlpZiAoIWdlbSkKKwkJCXJldHVybiAtRU5PRU5UOworCisJCWJvID0gdG9fdGVncmFfYm8oZ2VtKTsKKwl9CisKKwlpZiAoYm8pIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gKGJvLT5wYWRkciAmIDB4ZmZmZmZjMDApID4+IDEwOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJdW5zaWduZWQgbG9uZyBoaWdoID0gKGJvLT5wYWRkciAmIDB4ZmZmZmZmZmMpID4+IDMyOworI2VuZGlmCisKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSB8IGFkZHIsIERDX0RJU1BfQ1VSU09SX1NUQVJUX0FERFIpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQl0ZWdyYV9kY193cml0ZWwoZGMsIGhpZ2gsIERDX0RJU1BfQ1VSU09SX1NUQVJUX0FERFJfSEkpOworI2VuZGlmCisKKwkJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfRElTUF9ESVNQX1dJTl9PUFRJT05TKTsKKwkJdmFsdWUgfD0gQ1VSU09SX0VOQUJMRTsKKwkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9ESVNQX1dJTl9PUFRJT05TKTsKKworCQl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19ESVNQX0JMRU5EX0NVUlNPUl9DT05UUk9MKTsKKwkJdmFsdWUgJj0gfkNVUlNPUl9EU1RfQkxFTkRfTUFTSzsKKwkJdmFsdWUgJj0gfkNVUlNPUl9TUkNfQkxFTkRfTUFTSzsKKwkJdmFsdWUgfD0gQ1VSU09SX01PREVfTk9STUFMOworCQl2YWx1ZSB8PSBDVVJTT1JfRFNUX0JMRU5EX05FR19LMV9USU1FU19TUkM7CisJCXZhbHVlIHw9IENVUlNPUl9TUkNfQkxFTkRfSzFfVElNRVNfU1JDOworCQl2YWx1ZSB8PSBDVVJTT1JfQUxQSEE7CisJCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfQkxFTkRfQ1VSU09SX0NPTlRST0wpOworCX0gZWxzZSB7CisJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX0RJU1BfRElTUF9XSU5fT1BUSU9OUyk7CisJCXZhbHVlICY9IH5DVVJTT1JfRU5BQkxFOworCQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOworCX0KKworCXRlZ3JhX2RjX3dyaXRlbChkYywgQ1VSU09SX0FDVF9SRVEgPDwgOCwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCXRlZ3JhX2RjX3dyaXRlbChkYywgQ1VSU09SX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKKworCXRlZ3JhX2RjX3dyaXRlbChkYywgR0VORVJBTF9BQ1RfUkVRIDw8IDgsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZGNfY3Vyc29yX21vdmUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHkpCit7CisJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKGNydGMpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwlpZiAoIWRjLT5zb2MtPnN1cHBvcnRzX2N1cnNvcikKKwkJcmV0dXJuIC1FTlhJTzsKKworCXZhbHVlID0gKCh5ICYgMHgzZmZmKSA8PCAxNikgfCAoeCAmIDB4M2ZmZik7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9DVVJTT1JfUE9TSVRJT04pOworCisJdGVncmFfZGNfd3JpdGVsKGRjLCBDVVJTT1JfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCBDVVJTT1JfQUNUX1JFUSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOworCisJLyogWFhYOiBvbmx5IHJlcXVpcmVkIG9uIGdlbmVyYXRpb25zIGVhcmxpZXIgdGhhbiBUZWdyYTEyND8gKi8KKwl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSA8PCA4LCBEQ19DTURfU1RBVEVfQ09OVFJPTCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCBHRU5FUkFMX0FDVF9SRVEsIERDX0NNRF9TVEFURV9DT05UUk9MKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9kY19maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCB0ZWdyYV9kYyAqZGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmZGMtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFncywgYmFzZTsKKwlzdHJ1Y3QgdGVncmFfYm8gKmJvOworCisJaWYgKCFkYy0+ZXZlbnQpCisJCXJldHVybjsKKworCWJvID0gdGVncmFfZmJfZ2V0X3BsYW5lKGNydGMtPnByaW1hcnktPmZiLCAwKTsKKworCS8qIGNoZWNrIGlmIG5ldyBzdGFydCBhZGRyZXNzIGhhcyBiZWVuIGxhdGNoZWQgKi8KKwl0ZWdyYV9kY193cml0ZWwoZGMsIFJFQURfTVVYLCBEQ19DTURfU1RBVEVfQUNDRVNTKTsKKwliYXNlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX1dJTkJVRl9TVEFSVF9BRERSKTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIDAsIERDX0NNRF9TVEFURV9BQ0NFU1MpOworCisJaWYgKGJhc2UgPT0gYm8tPnBhZGRyICsgY3J0Yy0+cHJpbWFyeS0+ZmItPm9mZnNldHNbMF0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRybS0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlkcm1fc2VuZF92YmxhbmtfZXZlbnQoZHJtLCBkYy0+cGlwZSwgZGMtPmV2ZW50KTsKKwkJZHJtX3ZibGFua19wdXQoZHJtLCBkYy0+cGlwZSk7CisJCWRjLT5ldmVudCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRybS0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCX0KK30KKwordm9pZCB0ZWdyYV9kY19jYW5jZWxfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9maWxlICpmaWxlKQoreworCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gY3J0Yy0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHJtLT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGMtPmV2ZW50ICYmIGRjLT5ldmVudC0+YmFzZS5maWxlX3ByaXYgPT0gZmlsZSkgeworCQlkYy0+ZXZlbnQtPmJhc2UuZGVzdHJveSgmZGMtPmV2ZW50LT5iYXNlKTsKKwkJZHJtX3ZibGFua19wdXQoZHJtLCBkYy0+cGlwZSk7CisJCWRjLT5ldmVudCA9IE5VTEw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJtLT5ldmVudF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCwgdWludDMyX3QgcGFnZV9mbGlwX2ZsYWdzKQoreworCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gY3J0Yy0+ZGV2OworCisJaWYgKGRjLT5ldmVudCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChldmVudCkgeworCQlldmVudC0+cGlwZSA9IGRjLT5waXBlOworCQlkYy0+ZXZlbnQgPSBldmVudDsKKwkJZHJtX3ZibGFua19nZXQoZHJtLCBkYy0+cGlwZSk7CisJfQorCisJdGVncmFfZGNfc2V0X2Jhc2UoZGMsIDAsIDAsIGZiKTsKKwljcnRjLT5wcmltYXJ5LT5mYiA9IGZiOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9jcnRjX2NsZWFyKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwltZW1zZXQoY3J0YywgMCwgc2l6ZW9mKCpjcnRjKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX2RjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7CisJZHJtX2NydGNfY2xlYXIoY3J0Yyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgdGVncmFfY3J0Y19mdW5jcyA9IHsKKwkuY3Vyc29yX3NldDIgPSB0ZWdyYV9kY19jdXJzb3Jfc2V0MiwKKwkuY3Vyc29yX21vdmUgPSB0ZWdyYV9kY19jdXJzb3JfbW92ZSwKKwkucGFnZV9mbGlwID0gdGVncmFfZGNfcGFnZV9mbGlwLAorCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCisJLmRlc3Ryb3kgPSB0ZWdyYV9kY19kZXN0cm95LAorfTsKKworc3RhdGljIHZvaWQgdGVncmFfY3J0Y19kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgdGVncmFfZGMgKmRjID0gdG9fdGVncmFfZGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZTsKKworCWRybV9mb3JfZWFjaF9sZWdhY3lfcGxhbmUocGxhbmUsICZkcm0tPm1vZGVfY29uZmlnLnBsYW5lX2xpc3QpIHsKKwkJaWYgKHBsYW5lLT5jcnRjID09IGNydGMpIHsKKwkJCXRlZ3JhX3BsYW5lX2Rpc2FibGUocGxhbmUpOworCQkJcGxhbmUtPmNydGMgPSBOVUxMOworCisJCQlpZiAocGxhbmUtPmZiKSB7CisJCQkJZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKHBsYW5lLT5mYik7CisJCQkJcGxhbmUtPmZiID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCWRybV92Ymxhbmtfb2ZmKGRybSwgZGMtPnBpcGUpOworfQorCitzdGF0aWMgYm9vbCB0ZWdyYV9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZGNfc2V0X3RpbWluZ3Moc3RydWN0IHRlZ3JhX2RjICpkYywKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaF9yZWZfdG9fc3luYyA9IDE7CisJdW5zaWduZWQgaW50IHZfcmVmX3RvX3N5bmMgPSAxOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl0ZWdyYV9kY193cml0ZWwoZGMsIDB4MCwgRENfRElTUF9ESVNQX1RJTUlOR19PUFRJT05TKTsKKworCXZhbHVlID0gKHZfcmVmX3RvX3N5bmMgPDwgMTYpIHwgaF9yZWZfdG9fc3luYzsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX1JFRl9UT19TWU5DKTsKKworCXZhbHVlID0gKChtb2RlLT52c3luY19lbmQgLSBtb2RlLT52c3luY19zdGFydCkgPDwgMTYpIHwKKwkJKChtb2RlLT5oc3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydCkgPDwgIDApOworCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfU1lOQ19XSURUSCk7CisKKwl2YWx1ZSA9ICgobW9kZS0+dnRvdGFsIC0gbW9kZS0+dnN5bmNfZW5kKSA8PCAxNikgfAorCQkoKG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX2VuZCkgPDwgIDApOworCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfQkFDS19QT1JDSCk7CisKKwl2YWx1ZSA9ICgobW9kZS0+dnN5bmNfc3RhcnQgLSBtb2RlLT52ZGlzcGxheSkgPDwgMTYpIHwKKwkJKChtb2RlLT5oc3luY19zdGFydCAtIG1vZGUtPmhkaXNwbGF5KSA8PCAgMCk7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9GUk9OVF9QT1JDSCk7CisKKwl2YWx1ZSA9IChtb2RlLT52ZGlzcGxheSA8PCAxNikgfCBtb2RlLT5oZGlzcGxheTsKKwl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19ESVNQX0FDVElWRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV9jcnRjX3NldHVwX2NsayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJdW5zaWduZWQgbG9uZyBwY2xrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOworCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhjcnRjKTsKKwlzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQgPSBOVUxMOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXUzMiB2YWx1ZTsKKwlsb25nIGVycjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmNydGMtPmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKQorCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKSB7CisJCQlvdXRwdXQgPSBlbmNvZGVyX3RvX291dHB1dChlbmNvZGVyKTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIW91dHB1dCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBwYXJlbnQgY2xvY2sgaXMgcGxsX2Rfb3V0MCBvciBwbGxfZDJfb3V0CisJICogcmVzcGVjdGl2ZWx5LCBlYWNoIG9mIHdoaWNoIGRpdmlkZXMgdGhlIGJhc2UgcGxsX2QgYnkgMi4KKwkgKi8KKwllcnIgPSB0ZWdyYV9vdXRwdXRfc2V0dXBfY2xvY2sob3V0cHV0LCBkYy0+Y2xrLCBwY2xrLCAmZGl2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRjLT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY2xvY2s6ICVsZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlEUk1fREVCVUdfS01TKCJyYXRlOiAlbHUsIGRpdjogJXVcbiIsIGNsa19nZXRfcmF0ZShkYy0+Y2xrKSwgZGl2KTsKKworCXZhbHVlID0gU0hJRlRfQ0xLX0RJVklERVIoZGl2KSB8IFBJWEVMX0NMS19ESVZJREVSX1BDRDE7CisJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9ESVNQX0NMT0NLX0NPTlRST0wpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGVncmFfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC02NDgsMTIgKzc2OCwxMiBAQAogCXN0cnVjdCB0ZWdyYV9ibyAqYm8gPSB0ZWdyYV9mYl9nZXRfcGxhbmUoY3J0Yy0+cHJpbWFyeS0+ZmIsIDApOwogCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhjcnRjKTsKIAlzdHJ1Y3QgdGVncmFfZGNfd2luZG93IHdpbmRvdzsKLQl1bnNpZ25lZCBsb25nIGRpdiwgdmFsdWU7CisJdTMyIHZhbHVlOwogCWludCBlcnI7CiAKIAlkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KGNydGMtPmRldiwgZGMtPnBpcGUpOwogCi0JZXJyID0gdGVncmFfY3J0Y19zZXR1cF9jbGsoY3J0YywgbW9kZSwgJmRpdik7CisJZXJyID0gdGVncmFfY3J0Y19zZXR1cF9jbGsoY3J0YywgbW9kZSk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKGRjLT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY2xvY2sgZm9yIENSVEM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjY5LDkgKzc4OSw2IEBACiAJCXRlZ3JhX2RjX3dyaXRlbChkYywgdmFsdWUsIERDX0RJU1BfSU5URVJMQUNFX0NPTlRST0wpOwogCX0KIAotCXZhbHVlID0gU0hJRlRfQ0xLX0RJVklERVIoZGl2KSB8IFBJWEVMX0NMS19ESVZJREVSX1BDRDE7Ci0JdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfRElTUF9ESVNQX0NMT0NLX0NPTlRST0wpOwotCiAJLyogc2V0dXAgd2luZG93IHBhcmFtZXRlcnMgKi8KIAltZW1zZXQoJndpbmRvdywgMCwgc2l6ZW9mKHdpbmRvdykpOwogCXdpbmRvdy5zcmMueCA9IDA7CkBAIC02ODIsNyArNzk5LDggQEAKIAl3aW5kb3cuZHN0LnkgPSAwOwogCXdpbmRvdy5kc3QudyA9IG1vZGUtPmhkaXNwbGF5OwogCXdpbmRvdy5kc3QuaCA9IG1vZGUtPnZkaXNwbGF5OwotCXdpbmRvdy5mb3JtYXQgPSB0ZWdyYV9kY19mb3JtYXQoY3J0Yy0+cHJpbWFyeS0+ZmItPnBpeGVsX2Zvcm1hdCk7CisJd2luZG93LmZvcm1hdCA9IHRlZ3JhX2RjX2Zvcm1hdChjcnRjLT5wcmltYXJ5LT5mYi0+cGl4ZWxfZm9ybWF0LAorCQkJCQkmd2luZG93LnN3YXApOwogCXdpbmRvdy5iaXRzX3Blcl9waXhlbCA9IGNydGMtPnByaW1hcnktPmZiLT5iaXRzX3Blcl9waXhlbDsKIAl3aW5kb3cuc3RyaWRlWzBdID0gY3J0Yy0+cHJpbWFyeS0+ZmItPnBpdGNoZXNbMF07CiAJd2luZG93LmJhc2VbMF0gPSBiby0+cGFkZHI7CkBAIC03MjgsMTAgKzg0Niw2IEBACiAJCVdJTl9BX09GX0lOVCB8IFdJTl9CX09GX0lOVCB8IFdJTl9DX09GX0lOVDsKIAl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfSU5UX1BPTEFSSVRZKTsKIAotCXZhbHVlID0gUFcwX0VOQUJMRSB8IFBXMV9FTkFCTEUgfCBQVzJfRU5BQkxFIHwgUFczX0VOQUJMRSB8Ci0JCVBXNF9FTkFCTEUgfCBQTTBfRU5BQkxFIHwgUE0xX0VOQUJMRTsKLQl0ZWdyYV9kY193cml0ZWwoZGMsIHZhbHVlLCBEQ19DTURfRElTUExBWV9QT1dFUl9DT05UUk9MKTsKLQogCS8qIGluaXRpYWxpemUgdGltZXIgKi8KIAl2YWx1ZSA9IENVUlNPUl9USFJFU0hPTEQoMCkgfCBXSU5ET1dfQV9USFJFU0hPTEQoMHgyMCkgfAogCQlXSU5ET1dfQl9USFJFU0hPTEQoMHgyMCkgfCBXSU5ET1dfQ19USFJFU0hPTEQoMHgyMCk7CkBAIC05OTEsNiArMTEwNSw4IEBACiAJRFVNUF9SRUcoRENfRElTUF9TRF9CTF9DT05UUk9MKTsKIAlEVU1QX1JFRyhEQ19ESVNQX1NEX0hXX0tfVkFMVUVTKTsKIAlEVU1QX1JFRyhEQ19ESVNQX1NEX01BTl9LX1ZBTFVFUyk7CisJRFVNUF9SRUcoRENfRElTUF9DVVJTT1JfU1RBUlRfQUREUl9ISSk7CisJRFVNUF9SRUcoRENfRElTUF9CTEVORF9DVVJTT1JfQ09OVFJPTCk7CiAJRFVNUF9SRUcoRENfV0lOX1dJTl9PUFRJT05TKTsKIAlEVU1QX1JFRyhEQ19XSU5fQllURV9TV0FQKTsKIAlEVU1QX1JFRyhEQ19XSU5fQlVGRkVSX0NPTlRST0wpOwpAQCAtMTA5NiwyNiArMTIxMiwyNiBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX2RjX2luaXQoc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CiAJc3RydWN0IHRlZ3JhX2RjICpkYyA9IGhvc3QxeF9jbGllbnRfdG9fZGMoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JZHJtX2NydGNfaW5pdCh0ZWdyYS0+ZHJtLCAmZGMtPmJhc2UsICZ0ZWdyYV9jcnRjX2Z1bmNzKTsKKwlkcm1fY3J0Y19pbml0KGRybSwgJmRjLT5iYXNlLCAmdGVncmFfY3J0Y19mdW5jcyk7CiAJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZSgmZGMtPmJhc2UsIDI1Nik7CiAJZHJtX2NydGNfaGVscGVyX2FkZCgmZGMtPmJhc2UsICZ0ZWdyYV9jcnRjX2hlbHBlcl9mdW5jcyk7CiAKLQllcnIgPSB0ZWdyYV9kY19yZ2JfaW5pdCh0ZWdyYS0+ZHJtLCBkYyk7CisJZXJyID0gdGVncmFfZGNfcmdiX2luaXQoZHJtLCBkYyk7CiAJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FTk9ERVYpIHsKIAkJZGV2X2VycihkYy0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgUkdCIG91dHB1dDogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JZXJyID0gdGVncmFfZGNfYWRkX3BsYW5lcyh0ZWdyYS0+ZHJtLCBkYyk7CisJZXJyID0gdGVncmFfZGNfYWRkX3BsYW5lcyhkcm0sIGRjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpIHsKLQkJZXJyID0gdGVncmFfZGNfZGVidWdmc19pbml0KGRjLCB0ZWdyYS0+ZHJtLT5wcmltYXJ5KTsKKwkJZXJyID0gdGVncmFfZGNfZGVidWdmc19pbml0KGRjLCBkcm0tPnByaW1hcnkpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWRldl9lcnIoZGMtPmRldiwgImRlYnVnZnMgc2V0dXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKIAl9CkBAIC0xMTYwLDE0ICsxMjc2LDE3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZGNfc29jX2luZm8gdGVncmEyMF9kY19zb2NfaW5mbyA9IHsKIAkuc3VwcG9ydHNfaW50ZXJsYWNpbmcgPSBmYWxzZSwKKwkuc3VwcG9ydHNfY3Vyc29yID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2RjX3NvY19pbmZvIHRlZ3JhMzBfZGNfc29jX2luZm8gPSB7CiAJLnN1cHBvcnRzX2ludGVybGFjaW5nID0gZmFsc2UsCisJLnN1cHBvcnRzX2N1cnNvciA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9kY19zb2NfaW5mbyB0ZWdyYTEyNF9kY19zb2NfaW5mbyA9IHsKIAkuc3VwcG9ydHNfaW50ZXJsYWNpbmcgPSB0cnVlLAorCS5zdXBwb3J0c19jdXJzb3IgPSB0cnVlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZGNfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kYy5oIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKaW5kZXggYzk0MTAxNC4uNzhjNWZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RjLmgKQEAgLTY3LDEwICs2NywxMiBAQAogI2RlZmluZSBXSU5fQV9BQ1RfUkVRICAgKDEgPDwgIDEpCiAjZGVmaW5lIFdJTl9CX0FDVF9SRVEgICAoMSA8PCAgMikKICNkZWZpbmUgV0lOX0NfQUNUX1JFUSAgICgxIDw8ICAzKQorI2RlZmluZSBDVVJTT1JfQUNUX1JFUSAgKDEgPDwgIDcpCiAjZGVmaW5lIEdFTkVSQUxfVVBEQVRFICAoMSA8PCAgOCkKICNkZWZpbmUgV0lOX0FfVVBEQVRFICAgICgxIDw8ICA5KQogI2RlZmluZSBXSU5fQl9VUERBVEUgICAgKDEgPDwgMTApCiAjZGVmaW5lIFdJTl9DX1VQREFURSAgICAoMSA8PCAxMSkKKyNkZWZpbmUgQ1VSU09SX1VQREFURSAgICgxIDw8IDE1KQogI2RlZmluZSBOQ19IT1NUX1RSSUcgICAgKDEgPDwgMjQpCiAKICNkZWZpbmUgRENfQ01EX0RJU1BMQVlfV0lORE9XX0hFQURFUgkJMHgwNDIKQEAgLTExNiw5ICsxMTgsMTAgQEAKICNkZWZpbmUgRENfRElTUF9ESVNQX1NJR05BTF9PUFRJT05TMQkJMHg0MDEKIAogI2RlZmluZSBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMJCTB4NDAyCi0jZGVmaW5lIEhETUlfRU5BQkxFICgxIDw8IDMwKQotI2RlZmluZSBEU0lfRU5BQkxFICAoMSA8PCAyOSkKLSNkZWZpbmUgU09SX0VOQUJMRSAgKDEgPDwgMjUpCisjZGVmaW5lIEhETUlfRU5BQkxFCSgxIDw8IDMwKQorI2RlZmluZSBEU0lfRU5BQkxFCSgxIDw8IDI5KQorI2RlZmluZSBTT1JfRU5BQkxFCSgxIDw8IDI1KQorI2RlZmluZSBDVVJTT1JfRU5BQkxFCSgxIDw8IDE2KQogCiAjZGVmaW5lIERDX0RJU1BfRElTUF9NRU1fSElHSF9QUklPUklUWQkJMHg0MDMKICNkZWZpbmUgQ1VSU09SX1RIUkVTSE9MRCh4KSAgICgoKHgpICYgMHgwMykgPDwgMjQpCkBAIC0yNjYsNiArMjY5LDE0IEBACiAjZGVmaW5lIERDX0RJU1BfQ1VSU09SX0JBQ0tHUk9VTkQJCTB4NDNkCiAKICNkZWZpbmUgRENfRElTUF9DVVJTT1JfU1RBUlRfQUREUgkJMHg0M2UKKyNkZWZpbmUgQ1VSU09SX0NMSVBfRElTUExBWQkoMCA8PCAyOCkKKyNkZWZpbmUgQ1VSU09SX0NMSVBfV0lOX0EJKDEgPDwgMjgpCisjZGVmaW5lIENVUlNPUl9DTElQX1dJTl9CCSgyIDw8IDI4KQorI2RlZmluZSBDVVJTT1JfQ0xJUF9XSU5fQwkoMyA8PCAyOCkKKyNkZWZpbmUgQ1VSU09SX1NJWkVfMzJ4MzIJKDAgPDwgMjQpCisjZGVmaW5lIENVUlNPUl9TSVpFXzY0eDY0CSgxIDw8IDI0KQorI2RlZmluZSBDVVJTT1JfU0laRV8xMjh4MTI4CSgyIDw8IDI0KQorI2RlZmluZSBDVVJTT1JfU0laRV8yNTZ4MjU2CSgzIDw8IDI0KQogI2RlZmluZSBEQ19ESVNQX0NVUlNPUl9TVEFSVF9BRERSX05TCQkweDQzZgogCiAjZGVmaW5lIERDX0RJU1BfQ1VSU09SX1BPU0lUSU9OCQkJMHg0NDAKQEAgLTMwMiw2ICszMTMsMTkgQEAKICNkZWZpbmUgIElOVEVSTEFDRV9TVEFSVCAgKDEgPDwgMSkKICNkZWZpbmUgIElOVEVSTEFDRV9FTkFCTEUgKDEgPDwgMCkKIAorI2RlZmluZSBEQ19ESVNQX0NVUlNPUl9TVEFSVF9BRERSX0hJCQkweDRlYworI2RlZmluZSBEQ19ESVNQX0JMRU5EX0NVUlNPUl9DT05UUk9MCQkweDRmMQorI2RlZmluZSBDVVJTT1JfTU9ERV9MRUdBQ1kJCQkoMCA8PCAyNCkKKyNkZWZpbmUgQ1VSU09SX01PREVfTk9STUFMCQkJKDEgPDwgMjQpCisjZGVmaW5lIENVUlNPUl9EU1RfQkxFTkRfWkVSTwkJCSgwIDw8IDE2KQorI2RlZmluZSBDVVJTT1JfRFNUX0JMRU5EX0sxCQkJKDEgPDwgMTYpCisjZGVmaW5lIENVUlNPUl9EU1RfQkxFTkRfTkVHX0sxX1RJTUVTX1NSQwkoMiA8PCAxNikKKyNkZWZpbmUgQ1VSU09SX0RTVF9CTEVORF9NQVNLCQkJKDMgPDwgMTYpCisjZGVmaW5lIENVUlNPUl9TUkNfQkxFTkRfSzEJCQkoMCA8PCA4KQorI2RlZmluZSBDVVJTT1JfU1JDX0JMRU5EX0sxX1RJTUVTX1NSQwkJKDEgPDwgOCkKKyNkZWZpbmUgQ1VSU09SX1NSQ19CTEVORF9NQVNLCQkJKDMgPDwgOCkKKyNkZWZpbmUgQ1VSU09SX0FMUEhBCQkJCTB4ZmYKKwogI2RlZmluZSBEQ19XSU5fQ1NDX1lPRgkJCQkweDYxMQogI2RlZmluZSBEQ19XSU5fQ1NDX0tZUkdCCQkJMHg2MTIKICNkZWZpbmUgRENfV0lOX0NTQ19LVVIJCQkJMHg2MTMKQEAgLTMxMiw3ICszMzYsOCBAQAogI2RlZmluZSBEQ19XSU5fQ1NDX0tWQgkJCQkweDYxOAogCiAjZGVmaW5lIERDX1dJTl9XSU5fT1BUSU9OUwkJCTB4NzAwCi0jZGVmaW5lIElOVkVSVF9WICAgICAoMSA8PCAgMikKKyNkZWZpbmUgSF9ESVJFQ1RJT04gICgxIDw8ICAwKQorI2RlZmluZSBWX0RJUkVDVElPTiAgKDEgPDwgIDIpCiAjZGVmaW5lIENPTE9SX0VYUEFORCAoMSA8PCAgNikKICNkZWZpbmUgQ1NDX0VOQUJMRSAgICgxIDw8IDE4KQogI2RlZmluZSBXSU5fRU5BQkxFICAgKDEgPDwgMzApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHBhdXguYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcGF1eC5jCmluZGV4IDAwNWMxOWJkLi4zZjEzMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHBhdXguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHBhdXguYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9kcm1fcGFuZWwuaD4KQEAgLTQxLDYgKzQyLDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yICp2ZGQ7CiAKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCkBAIC00OSw2ICs1MSwxMSBAQAogCXJldHVybiBjb250YWluZXJfb2YoYXV4LCBzdHJ1Y3QgdGVncmFfZHBhdXgsIGF1eCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX2RwYXV4ICp3b3JrX3RvX2RwYXV4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0ZWdyYV9kcGF1eCwgd29yayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0ZWdyYV9kcGF1eF9yZWFkbChzdHJ1Y3QgdGVncmFfZHBhdXggKmRwYXV4LAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKQEAgLTIzMSw2ICsyMzgsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCB0ZWdyYV9kcGF1eF9ob3RwbHVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdGVncmFfZHBhdXggKmRwYXV4ID0gd29ya190b19kcGF1eCh3b3JrKTsKKworCWlmIChkcGF1eC0+b3V0cHV0KQorCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZHBhdXgtPm91dHB1dC0+Y29ubmVjdG9yLmRldik7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCB0ZWdyYV9kcGF1eF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdGVncmFfZHBhdXggKmRwYXV4ID0gZGF0YTsKQEAgLTI0MSwxNiArMjU2LDggQEAKIAl2YWx1ZSA9IHRlZ3JhX2RwYXV4X3JlYWRsKGRwYXV4LCBEUEFVWF9JTlRSX0FVWCk7CiAJdGVncmFfZHBhdXhfd3JpdGVsKGRwYXV4LCB2YWx1ZSwgRFBBVVhfSU5UUl9BVVgpOwogCi0JaWYgKHZhbHVlICYgRFBBVVhfSU5UUl9QTFVHX0VWRU5UKSB7Ci0JCWlmIChkcGF1eC0+b3V0cHV0KSB7Ci0JCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZHBhdXgtPm91dHB1dC0+Y29ubmVjdG9yLmRldik7Ci0JCX0KLQl9Ci0KLQlpZiAodmFsdWUgJiBEUEFVWF9JTlRSX1VOUExVR19FVkVOVCkgewotCQlpZiAoZHBhdXgtPm91dHB1dCkKLQkJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkcGF1eC0+b3V0cHV0LT5jb25uZWN0b3IuZGV2KTsKLQl9CisJaWYgKHZhbHVlICYgKERQQVVYX0lOVFJfUExVR19FVkVOVCB8IERQQVVYX0lOVFJfVU5QTFVHX0VWRU5UKSkKKwkJc2NoZWR1bGVfd29yaygmZHBhdXgtPndvcmspOwogCiAJaWYgKHZhbHVlICYgRFBBVVhfSU5UUl9JUlFfRVZFTlQpIHsKIAkJLyogVE9ETzogaGFuZGxlIHRoaXMgKi8KQEAgLTI3Myw2ICsyODAsNyBAQAogCWlmICghZHBhdXgpCiAJCXJldHVybiAtRU5PTUVNOwogCisJSU5JVF9XT1JLKCZkcGF1eC0+d29yaywgdGVncmFfZHBhdXhfaG90cGx1Zyk7CiAJaW5pdF9jb21wbGV0aW9uKCZkcGF1eC0+Y29tcGxldGUpOwogCUlOSVRfTElTVF9IRUFEKCZkcGF1eC0+bGlzdCk7CiAJZHBhdXgtPmRldiA9ICZwZGV2LT5kZXY7CkBAIC0zMzIsNyArMzQwLDcgQEAKIAlkcGF1eC0+YXV4LnRyYW5zZmVyID0gdGVncmFfZHBhdXhfdHJhbnNmZXI7CiAJZHBhdXgtPmF1eC5kZXYgPSAmcGRldi0+ZGV2OwogCi0JZXJyID0gZHJtX2RwX2F1eF9yZWdpc3Rlcl9pMmNfYnVzKCZkcGF1eC0+YXV4KTsKKwllcnIgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZkcGF1eC0+YXV4KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzU1LDEyICszNjMsMTQgQEAKIHsKIAlzdHJ1Y3QgdGVncmFfZHBhdXggKmRwYXV4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlkcm1fZHBfYXV4X3VucmVnaXN0ZXJfaTJjX2J1cygmZHBhdXgtPmF1eCk7CisJZHJtX2RwX2F1eF91bnJlZ2lzdGVyKCZkcGF1eC0+YXV4KTsKIAogCW11dGV4X2xvY2soJmRwYXV4X2xvY2spOwogCWxpc3RfZGVsKCZkcGF1eC0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcGF1eF9sb2NrKTsKIAorCWNhbmNlbF93b3JrX3N5bmMoJmRwYXV4LT53b3JrKTsKKwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcGF1eC0+Y2xrX3BhcmVudCk7CiAJcmVzZXRfY29udHJvbF9hc3NlcnQoZHBhdXgtPnJzdCk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRwYXV4LT5jbGspOwpAQCAtNDA0LDYgKzQxNCw3IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCBlcnI7CiAKKwlvdXRwdXQtPmNvbm5lY3Rvci5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwogCWRwYXV4LT5vdXRwdXQgPSBvdXRwdXQ7CiAKIAllcnIgPSByZWd1bGF0b3JfZW5hYmxlKGRwYXV4LT52ZGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RybS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RybS5jCmluZGV4IDZmNWI2ZTIuLjMzOTZmOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHJtLmMKQEAgLTMzLDcgKzMzLDYgQEAKIAlpZiAoIXRlZ3JhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRldl9zZXRfZHJ2ZGF0YShkcm0tPmRldiwgdGVncmEpOwogCW11dGV4X2luaXQoJnRlZ3JhLT5jbGllbnRzX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZ0ZWdyYS0+Y2xpZW50cyk7CiAJZHJtLT5kZXZfcHJpdmF0ZSA9IHRlZ3JhOwpAQCAtNjQwLDE0ICs2MzksNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBob3N0MXhfZHJtX3Byb2JlKHN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGhvc3QxeF9kcm1fcHJvYmUoc3RydWN0IGhvc3QxeF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gZHJtX2hvc3QxeF9pbml0KCZ0ZWdyYV9kcm1fZHJpdmVyLCBkZXZpY2UpOworCXN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIgPSAmdGVncmFfZHJtX2RyaXZlcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtOworCWludCBlcnI7CisKKwlkcm0gPSBkcm1fZGV2X2FsbG9jKGRyaXZlciwgJmRldi0+ZGV2KTsKKwlpZiAoIWRybSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcm1fZGV2X3NldF91bmlxdWUoZHJtLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBkcm0pOworCisJZXJyID0gZHJtX2Rldl9yZWdpc3Rlcihkcm0sIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVucmVmOworCisJRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkXG4iLCBkcml2ZXItPm5hbWUsCisJCSBkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yLCBkcml2ZXItPnBhdGNobGV2ZWwsCisJCSBkcml2ZXItPmRhdGUsIGRybS0+cHJpbWFyeS0+aW5kZXgpOworCisJcmV0dXJuIDA7CisKK3VucmVmOgorCWRybV9kZXZfdW5yZWYoZHJtKTsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGhvc3QxeF9kcm1fcmVtb3ZlKHN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGhvc3QxeF9kcm1fcmVtb3ZlKHN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2hvc3QxeF9leGl0KCZ0ZWdyYV9kcm1fZHJpdmVyLCBkZXZpY2UpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCWRybV9kZXZfdW5yZWdpc3Rlcihkcm0pOworCWRybV9kZXZfdW5yZWYoZHJtKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjY2LDYgKzY5MSw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMTQtZ3IzZCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtZGMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LXNvciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaGRtaSIsIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHJtLmggYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHJtLmgKaW5kZXggMTI2MzMyYy4uNmI4ZmU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RybS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kcm0uaApAQCAtODAsMTMgKzgwLDEzIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCB0ZWdyYV9kcm1fY2xpZW50LCBiYXNlKTsKIH0KIAotZXh0ZXJuIGludCB0ZWdyYV9kcm1fcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCB0ZWdyYV9kcm0gKnRlZ3JhLAotCQkJCSAgICAgc3RydWN0IHRlZ3JhX2RybV9jbGllbnQgKmNsaWVudCk7Ci1leHRlcm4gaW50IHRlZ3JhX2RybV91bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSwKLQkJCQkgICAgICAgc3RydWN0IHRlZ3JhX2RybV9jbGllbnQgKmNsaWVudCk7CitpbnQgdGVncmFfZHJtX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSwKKwkJCSAgICAgIHN0cnVjdCB0ZWdyYV9kcm1fY2xpZW50ICpjbGllbnQpOworaW50IHRlZ3JhX2RybV91bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSwKKwkJCQlzdHJ1Y3QgdGVncmFfZHJtX2NsaWVudCAqY2xpZW50KTsKIAotZXh0ZXJuIGludCB0ZWdyYV9kcm1faW5pdChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSwgc3RydWN0IGRybV9kZXZpY2UgKmRybSk7Ci1leHRlcm4gaW50IHRlZ3JhX2RybV9leGl0KHN0cnVjdCB0ZWdyYV9kcm0gKnRlZ3JhKTsKK2ludCB0ZWdyYV9kcm1faW5pdChzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSwgc3RydWN0IGRybV9kZXZpY2UgKmRybSk7CitpbnQgdGVncmFfZHJtX2V4aXQoc3RydWN0IHRlZ3JhX2RybSAqdGVncmEpOwogCiBzdHJ1Y3QgdGVncmFfZGNfc29jX2luZm87CiBzdHJ1Y3QgdGVncmFfb3V0cHV0OwpAQCAtMTU2LDYgKzE1Niw3IEBACiAJfSBkc3Q7CiAJdW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsOwogCXVuc2lnbmVkIGludCBmb3JtYXQ7CisJdW5zaWduZWQgaW50IHN3YXA7CiAJdW5zaWduZWQgaW50IHN0cmlkZVsyXTsKIAl1bnNpZ25lZCBsb25nIGJhc2VbM107CiAJYm9vbCBib3R0b21fdXA7CkBAIC0xNjMsMTkgKzE2NCwxNSBAQAogfTsKIAogLyogZnJvbSBkYy5jICovCi1leHRlcm4gdW5zaWduZWQgaW50IHRlZ3JhX2RjX2Zvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotZXh0ZXJuIGludCB0ZWdyYV9kY19zZXR1cF93aW5kb3coc3RydWN0IHRlZ3JhX2RjICpkYywgdW5zaWduZWQgaW50IGluZGV4LAotCQkJCSBjb25zdCBzdHJ1Y3QgdGVncmFfZGNfd2luZG93ICp3aW5kb3cpOwotZXh0ZXJuIHZvaWQgdGVncmFfZGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgdGVncmFfZGMgKmRjKTsKLWV4dGVybiB2b2lkIHRlZ3JhX2RjX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCB0ZWdyYV9kYyAqZGMpOwotZXh0ZXJuIHZvaWQgdGVncmFfZGNfY2FuY2VsX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKTsKK3ZvaWQgdGVncmFfZGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgdGVncmFfZGMgKmRjKTsKK3ZvaWQgdGVncmFfZGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IHRlZ3JhX2RjICpkYyk7Cit2b2lkIHRlZ3JhX2RjX2NhbmNlbF9wYWdlX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOwogCiBzdHJ1Y3QgdGVncmFfb3V0cHV0X29wcyB7CiAJaW50ICgqZW5hYmxlKShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpOwogCWludCAoKmRpc2FibGUpKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7CiAJaW50ICgqc2V0dXBfY2xvY2spKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCwgc3RydWN0IGNsayAqY2xrLAotCQkJICAgdW5zaWduZWQgbG9uZyBwY2xrKTsKKwkJCSAgIHVuc2lnbmVkIGxvbmcgcGNsaywgdW5zaWduZWQgaW50ICpkaXYpOwogCWludCAoKmNoZWNrX21vZGUpKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCwKIAkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkgIGVudW0gZHJtX21vZGVfc3RhdHVzICpzdGF0dXMpOwpAQCAtMjMzLDEwICsyMzAsMTEgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdGVncmFfb3V0cHV0X3NldHVwX2Nsb2NrKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCwKLQkJCQkJICAgc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHBjbGspCisJCQkJCSAgIHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBwY2xrLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKmRpdikKIHsKIAlpZiAob3V0cHV0ICYmIG91dHB1dC0+b3BzICYmIG91dHB1dC0+b3BzLT5zZXR1cF9jbG9jaykKLQkJcmV0dXJuIG91dHB1dC0+b3BzLT5zZXR1cF9jbG9jayhvdXRwdXQsIGNsaywgcGNsayk7CisJCXJldHVybiBvdXRwdXQtPm9wcy0+c2V0dXBfY2xvY2sob3V0cHV0LCBjbGssIHBjbGssIGRpdik7CiAKIAlyZXR1cm4gb3V0cHV0ID8gLUVOT1NZUyA6IC1FSU5WQUw7CiB9CkBAIC0yNTEsMjcgKzI0OSwyMSBAQAogCXJldHVybiBvdXRwdXQgPyAtRU5PU1lTIDogLUVJTlZBTDsKIH0KIAotLyogZnJvbSBidXMuYyAqLwotaW50IGRybV9ob3N0MXhfaW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgaG9zdDF4X2RldmljZSAqZGV2aWNlKTsKLXZvaWQgZHJtX2hvc3QxeF9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXZpY2UpOwotCiAvKiBmcm9tIHJnYi5jICovCi1leHRlcm4gaW50IHRlZ3JhX2RjX3JnYl9wcm9iZShzdHJ1Y3QgdGVncmFfZGMgKmRjKTsKLWV4dGVybiBpbnQgdGVncmFfZGNfcmdiX3JlbW92ZShzdHJ1Y3QgdGVncmFfZGMgKmRjKTsKLWV4dGVybiBpbnQgdGVncmFfZGNfcmdiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IHRlZ3JhX2RjICpkYyk7Ci1leHRlcm4gaW50IHRlZ3JhX2RjX3JnYl9leGl0KHN0cnVjdCB0ZWdyYV9kYyAqZGMpOworaW50IHRlZ3JhX2RjX3JnYl9wcm9iZShzdHJ1Y3QgdGVncmFfZGMgKmRjKTsKK2ludCB0ZWdyYV9kY19yZ2JfcmVtb3ZlKHN0cnVjdCB0ZWdyYV9kYyAqZGMpOworaW50IHRlZ3JhX2RjX3JnYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCB0ZWdyYV9kYyAqZGMpOworaW50IHRlZ3JhX2RjX3JnYl9leGl0KHN0cnVjdCB0ZWdyYV9kYyAqZGMpOwogCiAvKiBmcm9tIG91dHB1dC5jICovCi1leHRlcm4gaW50IHRlZ3JhX291dHB1dF9wcm9iZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpOwotZXh0ZXJuIGludCB0ZWdyYV9vdXRwdXRfcmVtb3ZlKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7Ci1leHRlcm4gaW50IHRlZ3JhX291dHB1dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7Ci1leHRlcm4gaW50IHRlZ3JhX291dHB1dF9leGl0KHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7CitpbnQgdGVncmFfb3V0cHV0X3Byb2JlKHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7CitpbnQgdGVncmFfb3V0cHV0X3JlbW92ZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpOworaW50IHRlZ3JhX291dHB1dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCB0ZWdyYV9vdXRwdXQgKm91dHB1dCk7CitpbnQgdGVncmFfb3V0cHV0X2V4aXQoc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0KTsKIAogLyogZnJvbSBkcGF1eC5jICovCi0KIHN0cnVjdCB0ZWdyYV9kcGF1eDsKIHN0cnVjdCBkcm1fZHBfbGluazsKLXN0cnVjdCBkcm1fZHBfYXV4OwogCiBzdHJ1Y3QgdGVncmFfZHBhdXggKnRlZ3JhX2RwYXV4X2ZpbmRfYnlfb2Zfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgdGVncmFfZHBhdXhfZGV0ZWN0KHN0cnVjdCB0ZWdyYV9kcGF1eCAqZHBhdXgpOwpAQCAtMjg4LDEwICsyODAsMTAgQEAKIAkJCQkgICAgdW5zaWduZWQgaW50IGluZGV4KTsKIGJvb2wgdGVncmFfZmJfaXNfYm90dG9tX3VwKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKTsKIGJvb2wgdGVncmFfZmJfaXNfdGlsZWQoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIpOwotZXh0ZXJuIGludCB0ZWdyYV9kcm1fZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKTsKLWV4dGVybiB2b2lkIHRlZ3JhX2RybV9mYl9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pOworaW50IHRlZ3JhX2RybV9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pOwordm9pZCB0ZWdyYV9kcm1fZmJfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKTsKICNpZmRlZiBDT05GSUdfRFJNX1RFR1JBX0ZCREVWCi1leHRlcm4gdm9pZCB0ZWdyYV9mYmRldl9yZXN0b3JlX21vZGUoc3RydWN0IHRlZ3JhX2ZiZGV2ICpmYmRldik7Cit2b2lkIHRlZ3JhX2ZiZGV2X3Jlc3RvcmVfbW9kZShzdHJ1Y3QgdGVncmFfZmJkZXYgKmZiZGV2KTsKICNlbmRpZgogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9kY19kcml2ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmMKaW5kZXggMGU1OTlmMC4uYmQ1NmYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuYwpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKwogI2luY2x1ZGUgPGRybS9kcm1fbWlwaV9kc2kuaD4KICNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+CiAKQEAgLTQzLDExICs0NSwxNSBAQAogCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7CiAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IGZvcm1hdDsKIAl1bnNpZ25lZCBpbnQgbGFuZXM7CiAKIAlzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKm1pcGk7CiAJc3RydWN0IG1pcGlfZHNpX2hvc3QgaG9zdDsKKworCXN0cnVjdCByZWd1bGF0b3IgKnZkZDsKKwlib29sIGVuYWJsZWQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV9kc2kgKgpAQCAtMjQ0LDggKzI1MCwxMCBAQAogI2RlZmluZSBQS1RfTFAJCSgxIDw8IDMwKQogI2RlZmluZSBOVU1fUEtUX1NFUQkxMgogCi0vKiBub24tYnVyc3QgbW9kZSB3aXRoIHN5bmMtZW5kICovCi1zdGF0aWMgY29uc3QgdTMyIHBrdF9zZXFfdm5iX3N5bmVbTlVNX1BLVF9TRVFdID0geworLyoKKyAqIG5vbi1idXJzdCBtb2RlIHdpdGggc3luYyBwdWxzZXMKKyAqLworc3RhdGljIGNvbnN0IHUzMiBwa3Rfc2VxX3ZpZGVvX25vbl9idXJzdF9zeW5jX3B1bHNlc1tOVU1fUEtUX1NFUV0gPSB7CiAJWyAwXSA9IFBLVF9JRDAoTUlQSV9EU0lfVl9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKIAkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMSkgfAogCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0hfU1lOQ19FTkQpIHwgUEtUX0xFTjIoMCkgfApAQCAtMjgwLDYgKzI4OCwzNiBAQAogCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX0JMQU5LSU5HX1BBQ0tFVCkgfCBQS1RfTEVOMig0KSwKIH07CiAKKy8qCisgKiBub24tYnVyc3QgbW9kZSB3aXRoIHN5bmMgZXZlbnRzCisgKi8KK3N0YXRpYyBjb25zdCB1MzIgcGt0X3NlcV92aWRlb19ub25fYnVyc3Rfc3luY19ldmVudHNbTlVNX1BLVF9TRVFdID0geworCVsgMF0gPSBQS1RfSUQwKE1JUElfRFNJX1ZfU1lOQ19TVEFSVCkgfCBQS1RfTEVOMCgwKSB8CisJICAgICAgIFBLVF9JRDEoTUlQSV9EU0lfRU5EX09GX1RSQU5TTUlTU0lPTikgfCBQS1RfTEVOMSg3KSB8CisJICAgICAgIFBLVF9MUCwKKwlbIDFdID0gMCwKKwlbIDJdID0gUEtUX0lEMChNSVBJX0RTSV9IX1NZTkNfU1RBUlQpIHwgUEtUX0xFTjAoMCkgfAorCSAgICAgICBQS1RfSUQxKE1JUElfRFNJX0VORF9PRl9UUkFOU01JU1NJT04pIHwgUEtUX0xFTjEoNykgfAorCSAgICAgICBQS1RfTFAsCisJWyAzXSA9IDAsCisJWyA0XSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9FTkRfT0ZfVFJBTlNNSVNTSU9OKSB8IFBLVF9MRU4xKDcpIHwKKwkgICAgICAgUEtUX0xQLAorCVsgNV0gPSAwLAorCVsgNl0gPSBQS1RfSUQwKE1JUElfRFNJX0hfU1lOQ19TVEFSVCkgfCBQS1RfTEVOMCgwKSB8CisJICAgICAgIFBLVF9JRDEoTUlQSV9EU0lfQkxBTktJTkdfUEFDS0VUKSB8IFBLVF9MRU4xKDIpIHwKKwkgICAgICAgUEtUX0lEMihNSVBJX0RTSV9QQUNLRURfUElYRUxfU1RSRUFNXzI0KSB8IFBLVF9MRU4yKDMpLAorCVsgN10gPSBQS1RfSUQwKE1JUElfRFNJX0JMQU5LSU5HX1BBQ0tFVCkgfCBQS1RfTEVOMCg0KSwKKwlbIDhdID0gUEtUX0lEMChNSVBJX0RTSV9IX1NZTkNfU1RBUlQpIHwgUEtUX0xFTjAoMCkgfAorCSAgICAgICBQS1RfSUQxKE1JUElfRFNJX0VORF9PRl9UUkFOU01JU1NJT04pIHwgUEtUX0xFTjEoNykgfAorCSAgICAgICBQS1RfTFAsCisJWyA5XSA9IDAsCisJWzEwXSA9IFBLVF9JRDAoTUlQSV9EU0lfSF9TWU5DX1NUQVJUKSB8IFBLVF9MRU4wKDApIHwKKwkgICAgICAgUEtUX0lEMShNSVBJX0RTSV9CTEFOS0lOR19QQUNLRVQpIHwgUEtUX0xFTjEoMikgfAorCSAgICAgICBQS1RfSUQyKE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMjQpIHwgUEtUX0xFTjIoMyksCisJWzExXSA9IFBLVF9JRDAoTUlQSV9EU0lfQkxBTktJTkdfUEFDS0VUKSB8IFBLVF9MRU4wKDQpLAorfTsKKwogc3RhdGljIGludCB0ZWdyYV9kc2lfc2V0X3BoeV90aW1pbmcoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQogewogCXN0cnVjdCBtaXBpX2RwaHlfdGltaW5nIHRpbWluZzsKQEAgLTM2MSwyOCArMzk5LDcwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdGVncmFfZHNpX2dldF9mb3JtYXQoZW51bSBtaXBpX2RzaV9waXhlbF9mb3JtYXQgZm9ybWF0LAorCQkJCWVudW0gdGVncmFfZHNpX2Zvcm1hdCAqZm10KQoreworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCODg4OgorCQkqZm10ID0gVEVHUkFfRFNJX0ZPUk1BVF8yNFA7CisJCWJyZWFrOworCisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2OgorCQkqZm10ID0gVEVHUkFfRFNJX0ZPUk1BVF8xOE5QOworCQlicmVhazsKKworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJCSpmbXQgPSBURUdSQV9EU0lfRk9STUFUXzE4UDsKKwkJYnJlYWs7CisKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CisJCSpmbXQgPSBURUdSQV9EU0lfRk9STUFUXzE2UDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfZHNpX2VuYWJsZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCiB7CiAJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKG91dHB1dC0+ZW5jb2Rlci5jcnRjKTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZkYy0+YmFzZS5tb2RlOwogCXVuc2lnbmVkIGludCBoYWN0LCBoc3csIGhicCwgaGZwLCBpLCBtdWwsIGRpdjsKIAlzdHJ1Y3QgdGVncmFfZHNpICpkc2kgPSB0b19kc2kob3V0cHV0KTsKLQkvKiBGSVhNRTogZG9uJ3QgaGFyZGNvZGUgdGhpcyAqLwotCWNvbnN0IHUzMiAqcGt0X3NlcSA9IHBrdF9zZXFfdm5iX3N5bmU7CisJZW51bSB0ZWdyYV9kc2lfZm9ybWF0IGZvcm1hdDsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNvbnN0IHUzMiAqcGt0X3NlcTsKIAlpbnQgZXJyOwogCisJaWYgKGRzaS0+ZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHNpLT5mbGFncyAmIE1JUElfRFNJX01PREVfVklERU9fU1lOQ19QVUxTRSkgeworCQlEUk1fREVCVUdfS01TKCJOb24tYnVyc3QgdmlkZW8gbW9kZSB3aXRoIHN5bmMgcHVsc2VzXG4iKTsKKwkJcGt0X3NlcSA9IHBrdF9zZXFfdmlkZW9fbm9uX2J1cnN0X3N5bmNfcHVsc2VzOworCX0gZWxzZSB7CisJCURSTV9ERUJVR19LTVMoIk5vbi1idXJzdCB2aWRlbyBtb2RlIHdpdGggc3luYyBldmVudHNcbiIpOworCQlwa3Rfc2VxID0gcGt0X3NlcV92aWRlb19ub25fYnVyc3Rfc3luY19ldmVudHM7CisJfQorCiAJZXJyID0gdGVncmFfZHNpX2dldF9tdWxkaXYoZHNpLT5mb3JtYXQsICZtdWwsICZkaXYpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJZXJyID0gdGVncmFfZHNpX2dldF9mb3JtYXQoZHNpLT5mb3JtYXQsICZmb3JtYXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gY2xrX2VuYWJsZShkc2ktPmNsayk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlyZXNldF9jb250cm9sX2RlYXNzZXJ0KGRzaS0+cnN0KTsKIAotCXZhbHVlID0gRFNJX0NPTlRST0xfQ0hBTk5FTCgwKSB8IERTSV9DT05UUk9MX0ZPUk1BVChkc2ktPmZvcm1hdCkgfAorCXZhbHVlID0gRFNJX0NPTlRST0xfQ0hBTk5FTCgwKSB8IERTSV9DT05UUk9MX0ZPUk1BVChmb3JtYXQpIHwKIAkJRFNJX0NPTlRST0xfTEFORVMoZHNpLT5sYW5lcyAtIDEpIHwKIAkJRFNJX0NPTlRST0xfU09VUkNFKGRjLT5waXBlKTsKIAl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9DT05UUk9MKTsKQEAgLTQ1NCw2ICs1MzQsOCBAQAogCXZhbHVlIHw9IERTSV9QT1dFUl9DT05UUk9MX0VOQUJMRTsKIAl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgdmFsdWUsIERTSV9QT1dFUl9DT05UUk9MKTsKIAorCWRzaS0+ZW5hYmxlZCA9IHRydWU7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYzLDkgKzU0NSwxMiBAQAogCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IHRvX2RzaShvdXRwdXQpOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKKwlpZiAoIWRzaS0+ZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKIAkvKiBkaXNhYmxlIERTSSBjb250cm9sbGVyICovCiAJdmFsdWUgPSB0ZWdyYV9kc2lfcmVhZGwoZHNpLCBEU0lfUE9XRVJfQ09OVFJPTCk7Ci0JdmFsdWUgJj0gRFNJX1BPV0VSX0NPTlRST0xfRU5BQkxFOworCXZhbHVlICY9IH5EU0lfUE9XRVJfQ09OVFJPTF9FTkFCTEU7CiAJdGVncmFfZHNpX3dyaXRlbChkc2ksIHZhbHVlLCBEU0lfUE9XRVJfQ09OVFJPTCk7CiAKIAkvKgpAQCAtNDkyLDMwICs1NzcsNDQgQEAKIAogCWNsa19kaXNhYmxlKGRzaS0+Y2xrKTsKIAorCWRzaS0+ZW5hYmxlZCA9IGZhbHNlOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGVncmFfb3V0cHV0X2RzaV9zZXR1cF9jbG9jayhzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQsCi0JCQkJCXN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBwY2xrKQorCQkJCQlzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcGNsaywKKwkJCQkJdW5zaWduZWQgaW50ICpkaXZwKQogewogCXN0cnVjdCB0ZWdyYV9kYyAqZGMgPSB0b190ZWdyYV9kYyhvdXRwdXQtPmVuY29kZXIuY3J0Yyk7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmZGMtPmJhc2UubW9kZTsKIAl1bnNpZ25lZCBpbnQgdGltZW91dCwgbXVsLCBkaXYsIHZyZWZyZXNoOwogCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IHRvX2RzaShvdXRwdXQpOwogCXVuc2lnbmVkIGxvbmcgYmNsaywgcGxsZCwgdmFsdWU7Ci0Jc3RydWN0IGNsayAqYmFzZTsKIAlpbnQgZXJyOwogCiAJZXJyID0gdGVncmFfZHNpX2dldF9tdWxkaXYoZHNpLT5mb3JtYXQsICZtdWwsICZkaXYpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJRFJNX0RFQlVHX0tNUygibXVsOiAldSwgZGl2OiAldSwgbGFuZXM6ICV1XG4iLCBtdWwsIGRpdiwgZHNpLT5sYW5lcyk7CiAJdnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKKwlEUk1fREVCVUdfS01TKCJ2cmVmcmVzaDogJXVcbiIsIHZyZWZyZXNoKTsKIAotCXBjbGsgPSBtb2RlLT5odG90YWwgKiBtb2RlLT52dG90YWwgKiB2cmVmcmVzaDsKKwkvKiBjb21wdXRlIGJ5dGUgY2xvY2sgKi8KIAliY2xrID0gKHBjbGsgKiBtdWwpIC8gKGRpdiAqIGRzaS0+bGFuZXMpOwotCXBsbGQgPSBESVZfUk9VTkRfVVAoYmNsayAqIDgsIDEwMDAwMDApOwotCXBjbGsgPSAocGxsZCAqIDEwMDAwMDApIC8gMjsKKworCS8qCisJICogQ29tcHV0ZSBiaXQgY2xvY2sgYW5kIHJvdW5kIHVwIHRvIHRoZSBuZXh0IE1Iei4KKwkgKi8KKwlwbGxkID0gRElWX1JPVU5EX1VQKGJjbGsgKiA4LCAxMDAwMDAwKSAqIDEwMDAwMDA7CisKKwkvKgorCSAqIFdlIGRpdmlkZSB0aGUgZnJlcXVlbmN5IGJ5IHR3byBoZXJlLCBidXQgd2UgbWFrZSB1cCBmb3IgdGhhdCBieQorCSAqIHNldHRpbmcgdGhlIHNoaWZ0IGNsb2NrIGRpdmlkZXIgKGZ1cnRoZXIgYmVsb3cpIHRvIGhhbGYgb2YgdGhlCisJICogY29ycmVjdCB2YWx1ZS4KKwkgKi8KKwlwbGxkIC89IDI7CiAKIAllcnIgPSBjbGtfc2V0X3BhcmVudChjbGssIGRzaS0+Y2xrX3BhcmVudCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTUyMywyMCArNjIyLDI2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JYmFzZSA9IGNsa19nZXRfcGFyZW50KGRzaS0+Y2xrX3BhcmVudCk7Ci0KLQkvKgotCSAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBwYXJlbnQgY2xvY2sgaXMgcGxsX2Rfb3V0MCBvciBwbGxfZDJfb3V0Ci0JICogcmVzcGVjdGl2ZWx5LCBlYWNoIG9mIHdoaWNoIGRpdmlkZXMgdGhlIGJhc2UgcGxsX2QgYnkgMi4KLQkgKi8KLQllcnIgPSBjbGtfc2V0X3JhdGUoYmFzZSwgcGNsayAqIDIpOworCWVyciA9IGNsa19zZXRfcmF0ZShkc2ktPmNsa19wYXJlbnQsIHBsbGQpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoZHNpLT5kZXYsICJmYWlsZWQgdG8gc2V0IGJhc2UgY2xvY2sgcmF0ZSB0byAlbHUgSHpcbiIsCi0JCQlwY2xrICogMik7CisJCQlwbGxkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKgorCSAqIERlcml2ZSBwaXhlbCBjbG9jayBmcm9tIGJpdCBjbG9jayB1c2luZyB0aGUgc2hpZnQgY2xvY2sgZGl2aWRlci4KKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGhhbGYgb2Ygd2hhdCB3ZSB3b3VsZCBleHBlY3QsIGJ1dCB3ZSBuZWVkCisJICogdGhhdCB0byBtYWtlIHVwIGZvciB0aGUgZmFjdCB0aGF0IHdlIGRpdmlkZWQgdGhlIGJpdCBjbG9jayBieSBhCisJICogZmFjdG9yIG9mIHR3byBhYm92ZS4KKwkgKgorCSAqIEl0J3Mgbm90IGNsZWFyIGV4YWN0bHkgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LCBidXQgdGhlIGRpc3BsYXkgaXMKKwkgKiBub3Qgd29ya2luZyBwcm9wZXJseSBvdGhlcndpc2UuIFBlcmhhcHMgdGhlIFBMTHMgY2Fubm90IGdlbmVyYXRlCisJICogZnJlcXVlbmNpZXMgc3VmZmljaWVudGx5IGhpZ2guCisJICovCisJKmRpdnAgPSAoKDggKiBtdWwpIC8gKGRpdiAqIGRzaS0+bGFuZXMpKSAtIDI7CisKKwkvKgogCSAqIFhYWDogTW92ZSB0aGUgYmVsb3cgc29tZXdoZXJlIGVsc2Ugc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGhhdmUKIAkgKiBhY2Nlc3MgdG8gdGhlIHZyZWZyZXNoIGluIHRoaXMgZnVuY3Rpb24/CiAJICovCkBAIC02MTAsNjEgKzcxNSwzMiBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX2RzaV9pbml0KHN0cnVjdCBob3N0MXhfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHRlZ3JhX2RybSAqdGVncmEgPSBkZXZfZ2V0X2RydmRhdGEoY2xpZW50LT5wYXJlbnQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEoY2xpZW50LT5wYXJlbnQpOwogCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IGhvc3QxeF9jbGllbnRfdG9fZHNpKGNsaWVudCk7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZSwgaTsKIAlpbnQgZXJyOwogCiAJZHNpLT5vdXRwdXQudHlwZSA9IFRFR1JBX09VVFBVVF9EU0k7CiAJZHNpLT5vdXRwdXQuZGV2ID0gY2xpZW50LT5kZXY7CiAJZHNpLT5vdXRwdXQub3BzID0gJmRzaV9vcHM7CiAKLQllcnIgPSB0ZWdyYV9vdXRwdXRfaW5pdCh0ZWdyYS0+ZHJtLCAmZHNpLT5vdXRwdXQpOworCWVyciA9IHRlZ3JhX291dHB1dF9pbml0KGRybSwgJmRzaS0+b3V0cHV0KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKGNsaWVudC0+ZGV2LCAib3V0cHV0IHNldHVwIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0ZTKSkgewotCQllcnIgPSB0ZWdyYV9kc2lfZGVidWdmc19pbml0KGRzaSwgdGVncmEtPmRybS0+cHJpbWFyeSk7CisJCWVyciA9IHRlZ3JhX2RzaV9kZWJ1Z2ZzX2luaXQoZHNpLCBkcm0tPnByaW1hcnkpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWRldl9lcnIoZHNpLT5kZXYsICJkZWJ1Z2ZzIHNldHVwIGZhaWxlZDogJWRcbiIsIGVycik7CiAJfQogCi0JLyoKLQkgKiBlbmFibGUgaGlnaC1zcGVlZCBtb2RlLCBjaGVja3N1bSBnZW5lcmF0aW9uLCBFQ0MgZ2VuZXJhdGlvbiBhbmQKLQkgKiBkaXNhYmxlIHJhdyBtb2RlCi0JICovCi0JdmFsdWUgPSB0ZWdyYV9kc2lfcmVhZGwoZHNpLCBEU0lfSE9TVF9DT05UUk9MKTsKLQl2YWx1ZSB8PSBEU0lfSE9TVF9DT05UUk9MX0VDQyB8IERTSV9IT1NUX0NPTlRST0xfQ1MgfAotCQkgRFNJX0hPU1RfQ09OVFJPTF9IUzsKLQl2YWx1ZSAmPSB+RFNJX0hPU1RfQ09OVFJPTF9SQVc7Ci0JdGVncmFfZHNpX3dyaXRlbChkc2ksIHZhbHVlLCBEU0lfSE9TVF9DT05UUk9MKTsKLQotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfU09MX0RFTEFZKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX01BWF9USFJFU0hPTEQpOwotCi0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9JTklUX1NFUV9DT05UUk9MKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9JTklUX1NFUV9EQVRBXzAgKyBpKTsKLQkJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9JTklUX1NFUV9EQVRBXzggKyBpKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLQkJdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QS1RfU0VRXzBfTE8gKyBpKTsKLQotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfRENTX0NNRFMpOwotCiAJZXJyID0gdGVncmFfZHNpX3BhZF9jYWxpYnJhdGUoZHNpKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKGRzaS0+ZGV2LCAiTUlQSSBjYWxpYnJhdGlvbiBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCBEU0lfUE9XRVJfQ09OVFJPTF9FTkFCTEUsIERTSV9QT1dFUl9DT05UUk9MKTsKLQl1c2xlZXBfcmFuZ2UoMzAwLCAxMDAwKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03MTUsNjYgKzc5MSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9kc2lfaW5pdGlhbGl6ZShzdHJ1Y3QgdGVncmFfZHNpICpkc2kpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BPV0VSX0NPTlRST0wpOwotCi0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9JTlRfRU5BQkxFKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0lOVF9TVEFUVVMpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5UX01BU0spOwotCi0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9IT1NUX0NPTlRST0wpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfQ09OVFJPTCk7Ci0KLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1NPTF9ERUxBWSk7Ci0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9NQVhfVEhSRVNIT0xEKTsKLQotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfQ09OVFJPTCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfREFUQV8wICsgaSk7Ci0JCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfSU5JVF9TRVFfREFUQV84ICsgaSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEtUX1NFUV8wX0xPICsgaSk7Ci0KLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0RDU19DTURTKTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEtUX0xFTl8wXzEgKyBpKTsKLQotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAweDAwMDAwMDAwLCBEU0lfUEhZX1RJTUlOR18wKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMHgwMDAwMDAwMCwgRFNJX1BIWV9USU1JTkdfMSk7Ci0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDB4MDAwMDAwZmYsIERTSV9QSFlfVElNSU5HXzIpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAweDAwMDAwMDAwLCBEU0lfQlRBX1RJTUlORyk7Ci0KLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1RJTUVPVVRfMCk7Ci0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9USU1FT1VUXzEpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfVE9fVEFMTFkpOwotCi0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF8wKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MX0NEKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DRF9TVEFUVVMpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfVklERU9fTU9ERV9DT05UUk9MKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MXzEpOwotCXRlZ3JhX2RzaV93cml0ZWwoZHNpLCAwLCBEU0lfUEFEX0NPTlRST0xfMik7Ci0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9QQURfQ09OVFJPTF8zKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX1BBRF9DT05UUk9MXzQpOwotCi0JdGVncmFfZHNpX3dyaXRlbChkc2ksIDAsIERTSV9HQU5HRURfTU9ERV9DT05UUk9MKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0dBTkdFRF9NT0RFX1NUQVJUKTsKLQl0ZWdyYV9kc2lfd3JpdGVsKGRzaSwgMCwgRFNJX0dBTkdFRF9NT0RFX1NJWkUpOwotfQotCiBzdGF0aWMgaW50IHRlZ3JhX2RzaV9ob3N0X2F0dGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKIAkJCQkgc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCB0ZWdyYV9kc2kgKmRzaSA9IGhvc3RfdG9fdGVncmEoaG9zdCk7CiAJc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0ID0gJmRzaS0+b3V0cHV0OwogCisJZHNpLT5mbGFncyA9IGRldmljZS0+bW9kZV9mbGFnczsKIAlkc2ktPmZvcm1hdCA9IGRldmljZS0+Zm9ybWF0OwogCWRzaS0+bGFuZXMgPSBkZXZpY2UtPmxhbmVzOwogCkBAIC04MjksNiArODUyLDcgQEAKIAkgKiBhdHRhY2hlcyB0byB0aGUgRFNJIGhvc3QsIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgdGFrZW4gZnJvbQogCSAqIHRoZSBhdHRhY2hlZCBkZXZpY2UuCiAJICovCisJZHNpLT5mbGFncyA9IE1JUElfRFNJX01PREVfVklERU87CiAJZHNpLT5mb3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4OwogCWRzaS0+bGFuZXMgPSA0OwogCkBAIC04NzIsNiArODk2LDE4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJZHNpLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgImF2ZGQtZHNpLWNzaSIpOworCWlmIChJU19FUlIoZHNpLT52ZGQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgVkREIHN1cHBseVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRzaS0+dmRkKTsKKwl9CisKKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKGRzaS0+dmRkKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZW5hYmxlIFZERCBzdXBwbHlcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IHRlZ3JhX2RzaV9zZXR1cF9jbG9ja3MoZHNpKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3Qgc2V0dXAgY2xvY2tzXG4iKTsKQEAgLTg4Myw4ICs5MTksNiBAQAogCWlmIChJU19FUlIoZHNpLT5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIoZHNpLT5yZWdzKTsKIAotCXRlZ3JhX2RzaV9pbml0aWFsaXplKGRzaSk7Ci0KIAlkc2ktPm1pcGkgPSB0ZWdyYV9taXBpX3JlcXVlc3QoJnBkZXYtPmRldik7CiAJaWYgKElTX0VSUihkc2ktPm1pcGkpKQogCQlyZXR1cm4gUFRSX0VSUihkc2ktPm1pcGkpOwpAQCAtOTI5LDkgKzk2MywxMSBAQAogCW1pcGlfZHNpX2hvc3RfdW5yZWdpc3RlcigmZHNpLT5ob3N0KTsKIAl0ZWdyYV9taXBpX2ZyZWUoZHNpLT5taXBpKTsKIAorCXJlZ3VsYXRvcl9kaXNhYmxlKGRzaS0+dmRkKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZHNpLT5jbGtfcGFyZW50KTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZHNpLT5jbGtfbHApOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkc2ktPmNsayk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQoZHNpLT5yc3QpOwogCiAJZXJyID0gdGVncmFfb3V0cHV0X3JlbW92ZSgmZHNpLT5vdXRwdXQpOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmggYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmgKaW5kZXggMWRiNWNjMi4uNWNlNjEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuaApAQCAtMTE3LDQgKzExNywxNCBAQAogI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV8xNAkJMHg1ZQogI2RlZmluZSBEU0lfSU5JVF9TRVFfREFUQV8xNQkJMHg1ZgogCisvKgorICogcGl4ZWwgZm9ybWF0IGFzIHVzZWQgaW4gdGhlIERTSV9DT05UUk9MX0ZPUk1BVCBmaWVsZAorICovCitlbnVtIHRlZ3JhX2RzaV9mb3JtYXQgeworCVRFR1JBX0RTSV9GT1JNQVRfMTZQLAorCVRFR1JBX0RTSV9GT1JNQVRfMThOUCwKKwlURUdSQV9EU0lfRk9STUFUXzE4UCwKKwlURUdSQV9EU0lfRk9STUFUXzI0UCwKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYwppbmRleCBmN2ZjYTA5Li45Nzk4YTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZmIuYwpAQCAtMzQ2LDExICszNDYsOCBAQAogCiB2b2lkIHRlZ3JhX2ZiZGV2X3Jlc3RvcmVfbW9kZShzdHJ1Y3QgdGVncmFfZmJkZXYgKmZiZGV2KQogewotCWlmIChmYmRldikgewotCQlkcm1fbW9kZXNldF9sb2NrX2FsbChmYmRldi0+YmFzZS5kZXYpOwotCQlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZSgmZmJkZXYtPmJhc2UpOwotCQlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGZiZGV2LT5iYXNlLmRldik7Ci0JfQorCWlmIChmYmRldikKKwkJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoJmZiZGV2LT5iYXNlKTsKIH0KIAogc3RhdGljIHZvaWQgdGVncmFfZmJfb3V0cHV0X3BvbGxfY2hhbmdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dlbS5jCmluZGV4IGJjZjk4OTUuLmFhODViN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ2VtLmMKQEAgLTE2OSw3ICsxNjksOCBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKLXN0cnVjdCB0ZWdyYV9ibyAqdGVncmFfYm9faW1wb3J0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBkbWFfYnVmICpidWYpCitzdGF0aWMgc3RydWN0IHRlZ3JhX2JvICp0ZWdyYV9ib19pbXBvcnQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKKwkJCQkJc3RydWN0IGRtYV9idWYgKmJ1ZikKIHsKIAlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2g7CiAJc3RydWN0IHRlZ3JhX2JvICpibzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9ncjJkLmMgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ3IyZC5jCmluZGV4IDJjN2NhNzQuLjdjNTM5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9ncjJkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dyMmQuYwpAQCAtMjgsNyArMjgsNyBAQAogc3RhdGljIGludCBncjJkX2luaXQoc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdGVncmFfZHJtX2NsaWVudCAqZHJtID0gaG9zdDF4X3RvX2RybV9jbGllbnQoY2xpZW50KTsKLQlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IEhPU1QxWF9TWU5DUFRfSEFTX0JBU0U7CiAJc3RydWN0IGdyMmQgKmdyMmQgPSB0b19ncjJkKGRybSk7CiAKQEAgLTQyLDE3ICs0MiwxNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXR1cm4gdGVncmFfZHJtX3JlZ2lzdGVyX2NsaWVudCh0ZWdyYSwgZHJtKTsKKwlyZXR1cm4gdGVncmFfZHJtX3JlZ2lzdGVyX2NsaWVudChkZXYtPmRldl9wcml2YXRlLCBkcm0pOwogfQogCiBzdGF0aWMgaW50IGdyMmRfZXhpdChzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0ZWdyYV9kcm1fY2xpZW50ICpkcm0gPSBob3N0MXhfdG9fZHJtX2NsaWVudChjbGllbnQpOwotCXN0cnVjdCB0ZWdyYV9kcm0gKnRlZ3JhID0gZGV2X2dldF9kcnZkYXRhKGNsaWVudC0+cGFyZW50KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGNsaWVudC0+cGFyZW50KTsKIAlzdHJ1Y3QgZ3IyZCAqZ3IyZCA9IHRvX2dyMmQoZHJtKTsKIAlpbnQgZXJyOwogCi0JZXJyID0gdGVncmFfZHJtX3VucmVnaXN0ZXJfY2xpZW50KHRlZ3JhLCBkcm0pOworCWVyciA9IHRlZ3JhX2RybV91bnJlZ2lzdGVyX2NsaWVudChkZXYtPmRldl9wcml2YXRlLCBkcm0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ3IzZC5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2dyM2QuYwppbmRleCAwY2JiMjRiLi4zMGY1YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZ3IzZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9ncjNkLmMKQEAgLTM3LDcgKzM3LDcgQEAKIHN0YXRpYyBpbnQgZ3IzZF9pbml0KHN0cnVjdCBob3N0MXhfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHRlZ3JhX2RybV9jbGllbnQgKmRybSA9IGhvc3QxeF90b19kcm1fY2xpZW50KGNsaWVudCk7Ci0Jc3RydWN0IHRlZ3JhX2RybSAqdGVncmEgPSBkZXZfZ2V0X2RydmRhdGEoY2xpZW50LT5wYXJlbnQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoY2xpZW50LT5wYXJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBIT1NUMVhfU1lOQ1BUX0hBU19CQVNFOwogCXN0cnVjdCBncjNkICpncjNkID0gdG9fZ3IzZChkcm0pOwogCkBAIC01MSwxNyArNTEsMTcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0dXJuIHRlZ3JhX2RybV9yZWdpc3Rlcl9jbGllbnQodGVncmEsIGRybSk7CisJcmV0dXJuIHRlZ3JhX2RybV9yZWdpc3Rlcl9jbGllbnQoZGV2LT5kZXZfcHJpdmF0ZSwgZHJtKTsKIH0KIAogc3RhdGljIGludCBncjNkX2V4aXQoc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdGVncmFfZHJtX2NsaWVudCAqZHJtID0gaG9zdDF4X3RvX2RybV9jbGllbnQoY2xpZW50KTsKLQlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CiAJc3RydWN0IGdyM2QgKmdyM2QgPSB0b19ncjNkKGRybSk7CiAJaW50IGVycjsKIAotCWVyciA9IHRlZ3JhX2RybV91bnJlZ2lzdGVyX2NsaWVudCh0ZWdyYSwgZHJtKTsKKwllcnIgPSB0ZWdyYV9kcm1fdW5yZWdpc3Rlcl9jbGllbnQoZGV2LT5kZXZfcHJpdmF0ZSwgZHJtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9oZG1pLmMKaW5kZXggNjkyODAxNS4uYmEwNjdiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvaGRtaS5jCkBAIC00Miw4ICs0Miw5IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCWJvb2wgZW5hYmxlZDsKIAotCXN0cnVjdCByZWd1bGF0b3IgKnZkZDsKKwlzdHJ1Y3QgcmVndWxhdG9yICpoZG1pOwogCXN0cnVjdCByZWd1bGF0b3IgKnBsbDsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZGQ7CiAKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJdW5zaWduZWQgaW50IGlycTsKQEAgLTMxNyw2ICszMTgsODUgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB0bWRzX2NvbmZpZyB0ZWdyYTEyNF90bWRzX2NvbmZpZ1tdID0geworCXsgLyogNDgwcC81NzZwIC8gMjUuMk1Iei8yN01IeiBtb2RlcyAqLworCQkucGNsayA9IDI3MDAwMDAwLAorCQkucGxsMCA9IFNPUl9QTExfSUNIUE1QKDEpIHwgU09SX1BMTF9CR19WMTdfUygzKSB8CisJCQlTT1JfUExMX1ZDT0NBUCgwKSB8IFNPUl9QTExfUkVTSVNUT1JTRUwsCisJCS5wbGwxID0gU09SX1BMTF9MT0FEQURKKDMpIHwgU09SX1BMTF9UTURTX1RFUk1BREooMCksCisJCS5wZV9jdXJyZW50ID0gUEVfQ1VSUkVOVDAoUEVfQ1VSUkVOVF8wX21BX1QxMTQpIHwKKwkJCVBFX0NVUlJFTlQxKFBFX0NVUlJFTlRfMF9tQV9UMTE0KSB8CisJCQlQRV9DVVJSRU5UMihQRV9DVVJSRU5UXzBfbUFfVDExNCkgfAorCQkJUEVfQ1VSUkVOVDMoUEVfQ1VSUkVOVF8wX21BX1QxMTQpLAorCQkuZHJpdmVfY3VycmVudCA9CisJCQlEUklWRV9DVVJSRU5UX0xBTkUwX1QxMTQoRFJJVkVfQ1VSUkVOVF8xMF80MDBfbUFfVDExNCkgfAorCQkJRFJJVkVfQ1VSUkVOVF9MQU5FMV9UMTE0KERSSVZFX0NVUlJFTlRfMTBfNDAwX21BX1QxMTQpIHwKKwkJCURSSVZFX0NVUlJFTlRfTEFORTJfVDExNChEUklWRV9DVVJSRU5UXzEwXzQwMF9tQV9UMTE0KSB8CisJCQlEUklWRV9DVVJSRU5UX0xBTkUzX1QxMTQoRFJJVkVfQ1VSUkVOVF8xMF80MDBfbUFfVDExNCksCisJCS5wZWFrX2N1cnJlbnQgPSBQRUFLX0NVUlJFTlRfTEFORTAoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTEoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTIoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTMoUEVBS19DVVJSRU5UXzBfMDAwX21BKSwKKwl9LCB7IC8qIDcyMHAgLyA3NC4yNU1IeiBtb2RlcyAqLworCQkucGNsayA9IDc0MjUwMDAwLAorCQkucGxsMCA9IFNPUl9QTExfSUNIUE1QKDEpIHwgU09SX1BMTF9CR19WMTdfUygzKSB8CisJCQlTT1JfUExMX1ZDT0NBUCgxKSB8IFNPUl9QTExfUkVTSVNUT1JTRUwsCisJCS5wbGwxID0gU09SX1BMTF9QRV9FTiB8IFNPUl9QTExfTE9BREFESigzKSB8CisJCQlTT1JfUExMX1RNRFNfVEVSTUFESigwKSwKKwkJLnBlX2N1cnJlbnQgPSBQRV9DVVJSRU5UMChQRV9DVVJSRU5UXzE1X21BX1QxMTQpIHwKKwkJCVBFX0NVUlJFTlQxKFBFX0NVUlJFTlRfMTVfbUFfVDExNCkgfAorCQkJUEVfQ1VSUkVOVDIoUEVfQ1VSUkVOVF8xNV9tQV9UMTE0KSB8CisJCQlQRV9DVVJSRU5UMyhQRV9DVVJSRU5UXzE1X21BX1QxMTQpLAorCQkuZHJpdmVfY3VycmVudCA9CisJCQlEUklWRV9DVVJSRU5UX0xBTkUwX1QxMTQoRFJJVkVfQ1VSUkVOVF8xMF80MDBfbUFfVDExNCkgfAorCQkJRFJJVkVfQ1VSUkVOVF9MQU5FMV9UMTE0KERSSVZFX0NVUlJFTlRfMTBfNDAwX21BX1QxMTQpIHwKKwkJCURSSVZFX0NVUlJFTlRfTEFORTJfVDExNChEUklWRV9DVVJSRU5UXzEwXzQwMF9tQV9UMTE0KSB8CisJCQlEUklWRV9DVVJSRU5UX0xBTkUzX1QxMTQoRFJJVkVfQ1VSUkVOVF8xMF80MDBfbUFfVDExNCksCisJCS5wZWFrX2N1cnJlbnQgPSBQRUFLX0NVUlJFTlRfTEFORTAoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTEoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTIoUEVBS19DVVJSRU5UXzBfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTMoUEVBS19DVVJSRU5UXzBfMDAwX21BKSwKKwl9LCB7IC8qIDEwODBwIC8gMTQ4LjVNSHogbW9kZXMgKi8KKwkJLnBjbGsgPSAxNDg1MDAwMDAsCisJCS5wbGwwID0gU09SX1BMTF9JQ0hQTVAoMSkgfCBTT1JfUExMX0JHX1YxN19TKDMpIHwKKwkJCVNPUl9QTExfVkNPQ0FQKDMpIHwgU09SX1BMTF9SRVNJU1RPUlNFTCwKKwkJLnBsbDEgPSBTT1JfUExMX1BFX0VOIHwgU09SX1BMTF9MT0FEQURKKDMpIHwKKwkJCVNPUl9QTExfVE1EU19URVJNQURKKDApLAorCQkucGVfY3VycmVudCA9IFBFX0NVUlJFTlQwKFBFX0NVUlJFTlRfMTBfbUFfVDExNCkgfAorCQkJUEVfQ1VSUkVOVDEoUEVfQ1VSUkVOVF8xMF9tQV9UMTE0KSB8CisJCQlQRV9DVVJSRU5UMihQRV9DVVJSRU5UXzEwX21BX1QxMTQpIHwKKwkJCVBFX0NVUlJFTlQzKFBFX0NVUlJFTlRfMTBfbUFfVDExNCksCisJCS5kcml2ZV9jdXJyZW50ID0KKwkJCURSSVZFX0NVUlJFTlRfTEFORTBfVDExNChEUklWRV9DVVJSRU5UXzEyXzQwMF9tQV9UMTE0KSB8CisJCQlEUklWRV9DVVJSRU5UX0xBTkUxX1QxMTQoRFJJVkVfQ1VSUkVOVF8xMl80MDBfbUFfVDExNCkgfAorCQkJRFJJVkVfQ1VSUkVOVF9MQU5FMl9UMTE0KERSSVZFX0NVUlJFTlRfMTJfNDAwX21BX1QxMTQpIHwKKwkJCURSSVZFX0NVUlJFTlRfTEFORTNfVDExNChEUklWRV9DVVJSRU5UXzEyXzQwMF9tQV9UMTE0KSwKKwkJLnBlYWtfY3VycmVudCA9IFBFQUtfQ1VSUkVOVF9MQU5FMChQRUFLX0NVUlJFTlRfMF8wMDBfbUEpIHwKKwkJCVBFQUtfQ1VSUkVOVF9MQU5FMShQRUFLX0NVUlJFTlRfMF8wMDBfbUEpIHwKKwkJCVBFQUtfQ1VSUkVOVF9MQU5FMihQRUFLX0NVUlJFTlRfMF8wMDBfbUEpIHwKKwkJCVBFQUtfQ1VSUkVOVF9MQU5FMyhQRUFLX0NVUlJFTlRfMF8wMDBfbUEpLAorCX0sIHsgLyogMjI1LzI5N01IeiBtb2RlcyAqLworCQkucGNsayA9IFVJTlRfTUFYLAorCQkucGxsMCA9IFNPUl9QTExfSUNIUE1QKDEpIHwgU09SX1BMTF9CR19WMTdfUygzKSB8CisJCQlTT1JfUExMX1ZDT0NBUCgweGYpIHwgU09SX1BMTF9SRVNJU1RPUlNFTCwKKwkJLnBsbDEgPSBTT1JfUExMX0xPQURBREooMykgfCBTT1JfUExMX1RNRFNfVEVSTUFESig3KQorCQkJfCBTT1JfUExMX1RNRFNfVEVSTV9FTkFCTEUsCisJCS5wZV9jdXJyZW50ID0gUEVfQ1VSUkVOVDAoUEVfQ1VSUkVOVF8wX21BX1QxMTQpIHwKKwkJCVBFX0NVUlJFTlQxKFBFX0NVUlJFTlRfMF9tQV9UMTE0KSB8CisJCQlQRV9DVVJSRU5UMihQRV9DVVJSRU5UXzBfbUFfVDExNCkgfAorCQkJUEVfQ1VSUkVOVDMoUEVfQ1VSUkVOVF8wX21BX1QxMTQpLAorCQkuZHJpdmVfY3VycmVudCA9CisJCQlEUklWRV9DVVJSRU5UX0xBTkUwX1QxMTQoRFJJVkVfQ1VSUkVOVF8yNV8yMDBfbUFfVDExNCkgfAorCQkJRFJJVkVfQ1VSUkVOVF9MQU5FMV9UMTE0KERSSVZFX0NVUlJFTlRfMjVfMjAwX21BX1QxMTQpIHwKKwkJCURSSVZFX0NVUlJFTlRfTEFORTJfVDExNChEUklWRV9DVVJSRU5UXzI1XzIwMF9tQV9UMTE0KSB8CisJCQlEUklWRV9DVVJSRU5UX0xBTkUzX1QxMTQoRFJJVkVfQ1VSUkVOVF8xOV8yMDBfbUFfVDExNCksCisJCS5wZWFrX2N1cnJlbnQgPSBQRUFLX0NVUlJFTlRfTEFORTAoUEVBS19DVVJSRU5UXzNfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTEoUEVBS19DVVJSRU5UXzNfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTIoUEVBS19DVVJSRU5UXzNfMDAwX21BKSB8CisJCQlQRUFLX0NVUlJFTlRfTEFORTMoUEVBS19DVVJSRU5UXzBfODAwX21BKSwKKwl9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9oZG1pX2F1ZGlvX2NvbmZpZyAqCiB0ZWdyYV9oZG1pX2dldF9hdWRpb19jb25maWcodW5zaWduZWQgaW50IGF1ZGlvX2ZyZXEsIHVuc2lnbmVkIGludCBwY2xrKQogewpAQCAtNzE2LDEzICs3OTYsOSBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCS8qCi0JICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGRpc3BsYXkgY29udHJvbGxlciB3aWxsIGRpdmlkZSBpdHMgcGFyZW50Ci0JICogY2xvY2sgYnkgMiB0byBnZW5lcmF0ZSB0aGUgcGl4ZWwgY2xvY2suCi0JICovCi0JZXJyID0gdGVncmFfb3V0cHV0X3NldHVwX2Nsb2NrKG91dHB1dCwgaGRtaS0+Y2xrLCBwY2xrICogMik7CisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShoZG1pLT52ZGQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoaGRtaS0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGNsb2NrOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihoZG1pLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIFZERCByZWd1bGF0b3I6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzMwLDcgKzgwNiw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBjbGtfZW5hYmxlKGhkbWktPmNsayk7CisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhkbWktPmNsayk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycihoZG1pLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKQEAgLTc0MCw2ICs4MTYsMTcgQEAKIAl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAJcmVzZXRfY29udHJvbF9kZWFzc2VydChoZG1pLT5yc3QpOwogCisJLyogcG93ZXIgdXAgc2VxdWVuY2UgKi8KKwl2YWx1ZSA9IHRlZ3JhX2hkbWlfcmVhZGwoaGRtaSwgSERNSV9OVl9QRElTUF9TT1JfUExMMCk7CisJdmFsdWUgJj0gflNPUl9QTExfUERCRzsKKwl0ZWdyYV9oZG1pX3dyaXRlbChoZG1pLCB2YWx1ZSwgSERNSV9OVl9QRElTUF9TT1JfUExMMCk7CisKKwl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKworCXZhbHVlID0gdGVncmFfaGRtaV9yZWFkbChoZG1pLCBIRE1JX05WX1BESVNQX1NPUl9QTEwwKTsKKwl2YWx1ZSAmPSB+U09SX1BMTF9QV1I7CisJdGVncmFfaGRtaV93cml0ZWwoaGRtaSwgdmFsdWUsIEhETUlfTlZfUERJU1BfU09SX1BMTDApOworCiAJdGVncmFfZGNfd3JpdGVsKGRjLCBWU1lOQ19IX1BPU0lUSU9OKDEpLAogCQkJRENfRElTUF9ESVNQX1RJTUlOR19PUFRJT05TKTsKIAl0ZWdyYV9kY193cml0ZWwoZGMsIERJVEhFUl9DT05UUk9MX0RJU0FCTEUgfCBCQVNFX0NPTE9SX1NJWkU4ODgsCkBAIC04MzgsOSArOTI1LDEzIEBACiAJdGVncmFfaGRtaV93cml0ZWwoaGRtaSwgdmFsdWUsIEhETUlfTlZfUERJU1BfU09SX1NFUV9JTlNUKDApKTsKIAl0ZWdyYV9oZG1pX3dyaXRlbChoZG1pLCB2YWx1ZSwgSERNSV9OVl9QRElTUF9TT1JfU0VRX0lOU1QoOCkpOwogCi0JdmFsdWUgPSAweDFjODAwOworCXZhbHVlID0gdGVncmFfaGRtaV9yZWFkbChoZG1pLCBIRE1JX05WX1BESVNQX1NPUl9DU1RNKTsKIAl2YWx1ZSAmPSB+U09SX0NTVE1fUk9UQ0xLKH4wKTsKIAl2YWx1ZSB8PSBTT1JfQ1NUTV9ST1RDTEsoMik7CisJdmFsdWUgfD0gU09SX0NTVE1fUExMRElWOworCXZhbHVlICY9IH5TT1JfQ1NUTV9MVkRTX0VOQUJMRTsKKwl2YWx1ZSAmPSB+U09SX0NTVE1fTU9ERV9NQVNLOworCXZhbHVlIHw9IFNPUl9DU1RNX01PREVfVE1EUzsKIAl0ZWdyYV9oZG1pX3dyaXRlbChoZG1pLCB2YWx1ZSwgSERNSV9OVl9QRElTUF9TT1JfQ1NUTSk7CiAKIAkvKiBzdGFydCBTT1IgKi8KQEAgLTkzMCwxMCArMTAyMSwxOCBAQAogCSAqIHN1cmUgaXQncyBvbmx5IGV4ZWN1dGVkIHdoZW4gdGhlIG91dHB1dCBpcyBhdHRhY2hlZCB0byBvbmUuCiAJICovCiAJaWYgKGRjKSB7CisJCS8qCisJCSAqIFhYWDogV2UgY2FuJ3QgZG8gdGhpcyBoZXJlIGJlY2F1c2UgaXQgY2F1c2VzIEhETUkgdG8gZ28KKwkJICogaW50byBhbiBlcnJvbmVvdXMgc3RhdGUgd2l0aCB0aGUgcmVzdWx0IHRoYXQgSERNSSB3b24ndAorCQkgKiBwcm9wZXJseSB3b3JrIG9uY2UgZGlzYWJsZWQuIFNlZSBhbHNvIGEgc2ltaWxhciBzeW1wdG9tCisJCSAqIGZvciB0aGUgU09SIG91dHB1dC4KKwkJICovCisJCS8qCiAJCXZhbHVlID0gdGVncmFfZGNfcmVhZGwoZGMsIERDX0NNRF9ESVNQTEFZX1BPV0VSX0NPTlRST0wpOwogCQl2YWx1ZSAmPSB+KFBXMF9FTkFCTEUgfCBQVzFfRU5BQkxFIHwgUFcyX0VOQUJMRSB8IFBXM19FTkFCTEUgfAogCQkJICAgUFc0X0VOQUJMRSB8IFBNMF9FTkFCTEUgfCBQTTFfRU5BQkxFKTsKIAkJdGVncmFfZGNfd3JpdGVsKGRjLCB2YWx1ZSwgRENfQ01EX0RJU1BMQVlfUE9XRVJfQ09OVFJPTCk7CisJCSovCiAKIAkJdmFsdWUgPSB0ZWdyYV9kY19yZWFkbChkYywgRENfQ01EX0RJU1BMQVlfQ09NTUFORCk7CiAJCXZhbHVlICY9IH5ESVNQX0NUUkxfTU9ERV9NQVNLOwpAQCAtOTQ3LDggKzEwNDYsOSBAQAogCQl0ZWdyYV9kY193cml0ZWwoZGMsIEdFTkVSQUxfQUNUX1JFUSwgRENfQ01EX1NUQVRFX0NPTlRST0wpOwogCX0KIAorCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZG1pLT5jbGspOwogCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhkbWktPnJzdCk7Ci0JY2xrX2Rpc2FibGUoaGRtaS0+Y2xrKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShoZG1pLT52ZGQpOwogCXJlZ3VsYXRvcl9kaXNhYmxlKGhkbWktPnBsbCk7CiAKIAloZG1pLT5lbmFibGVkID0gZmFsc2U7CkBAIC05NTcsMTAgKzEwNTcsMTAgQEAKIH0KIAogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfaGRtaV9zZXR1cF9jbG9jayhzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQsCi0JCQkJCSBzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcGNsaykKKwkJCQkJIHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBwY2xrLAorCQkJCQkgdW5zaWduZWQgaW50ICpkaXYpCiB7CiAJc3RydWN0IHRlZ3JhX2hkbWkgKmhkbWkgPSB0b19oZG1pKG91dHB1dCk7Ci0Jc3RydWN0IGNsayAqYmFzZTsKIAlpbnQgZXJyOwogCiAJZXJyID0gY2xrX3NldF9wYXJlbnQoY2xrLCBoZG1pLT5jbGtfcGFyZW50KTsKQEAgLTk2OSwxNyArMTA2OSwxMiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWJhc2UgPSBjbGtfZ2V0X3BhcmVudChoZG1pLT5jbGtfcGFyZW50KTsKLQotCS8qCi0JICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHBhcmVudCBjbG9jayBpcyBwbGxfZF9vdXQwIG9yIHBsbF9kMl9vdXQKLQkgKiByZXNwZWN0aXZlbHksIGVhY2ggb2Ygd2hpY2ggZGl2aWRlcyB0aGUgYmFzZSBwbGxfZCBieSAyLgotCSAqLwotCWVyciA9IGNsa19zZXRfcmF0ZShiYXNlLCBwY2xrICogMik7CisJZXJyID0gY2xrX3NldF9yYXRlKGhkbWktPmNsa19wYXJlbnQsIHBjbGspOwogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKG91dHB1dC0+ZGV2LAotCQkJImZhaWxlZCB0byBzZXQgYmFzZSBjbG9jayByYXRlIHRvICVsdSBIelxuIiwKLQkJCXBjbGsgKiAyKTsKKwkJZGV2X2VycihvdXRwdXQtPmRldiwgImZhaWxlZCB0byBzZXQgY2xvY2sgcmF0ZSB0byAlbHUgSHpcbiIsCisJCQlwY2xrKTsKKworCSpkaXYgPSAwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDE3LDcgKzExMTIsNyBAQAogCXN0cnVjdCB0ZWdyYV9oZG1pICpoZG1pID0gbm9kZS0+aW5mb19lbnQtPmRhdGE7CiAJaW50IGVycjsKIAotCWVyciA9IGNsa19lbmFibGUoaGRtaS0+Y2xrKTsKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoaGRtaS0+Y2xrKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMTg2LDcgKzEyODEsNyBAQAogCiAjdW5kZWYgRFVNUF9SRUcKIAotCWNsa19kaXNhYmxlKGhkbWktPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmNsayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNTIsMzMgKzEzNDcsMzMgQEAKIAogc3RhdGljIGludCB0ZWdyYV9oZG1pX2luaXQoc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgdGVncmFfZHJtICp0ZWdyYSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRldl9nZXRfZHJ2ZGF0YShjbGllbnQtPnBhcmVudCk7CiAJc3RydWN0IHRlZ3JhX2hkbWkgKmhkbWkgPSBob3N0MXhfY2xpZW50X3RvX2hkbWkoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JZXJyID0gcmVndWxhdG9yX2VuYWJsZShoZG1pLT52ZGQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIFZERCByZWd1bGF0b3I6ICVkXG4iLAotCQkJZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KIAloZG1pLT5vdXRwdXQudHlwZSA9IFRFR1JBX09VVFBVVF9IRE1JOwogCWhkbWktPm91dHB1dC5kZXYgPSBjbGllbnQtPmRldjsKIAloZG1pLT5vdXRwdXQub3BzID0gJmhkbWlfb3BzOwogCi0JZXJyID0gdGVncmFfb3V0cHV0X2luaXQodGVncmEtPmRybSwgJmhkbWktPm91dHB1dCk7CisJZXJyID0gdGVncmFfb3V0cHV0X2luaXQoZHJtLCAmaGRtaS0+b3V0cHV0KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKGNsaWVudC0+ZGV2LCAib3V0cHV0IHNldHVwIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0ZTKSkgewotCQllcnIgPSB0ZWdyYV9oZG1pX2RlYnVnZnNfaW5pdChoZG1pLCB0ZWdyYS0+ZHJtLT5wcmltYXJ5KTsKKwkJZXJyID0gdGVncmFfaGRtaV9kZWJ1Z2ZzX2luaXQoaGRtaSwgZHJtLT5wcmltYXJ5KTsKIAkJaWYgKGVyciA8IDApCiAJCQlkZXZfZXJyKGNsaWVudC0+ZGV2LCAiZGVidWdmcyBzZXR1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCX0KIAorCWVyciA9IHJlZ3VsYXRvcl9lbmFibGUoaGRtaS0+aGRtaSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihjbGllbnQtPmRldiwgImZhaWxlZCB0byBlbmFibGUgSERNSSByZWd1bGF0b3I6ICVkXG4iLAorCQkJZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI4Nyw2ICsxMzgyLDggQEAKIAlzdHJ1Y3QgdGVncmFfaGRtaSAqaGRtaSA9IGhvc3QxeF9jbGllbnRfdG9faGRtaShjbGllbnQpOwogCWludCBlcnI7CiAKKwlyZWd1bGF0b3JfZGlzYWJsZShoZG1pLT5oZG1pKTsKKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpIHsKIAkJZXJyID0gdGVncmFfaGRtaV9kZWJ1Z2ZzX2V4aXQoaGRtaSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtMTMwNiw4ICsxNDAzLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlyZWd1bGF0b3JfZGlzYWJsZShoZG1pLT52ZGQpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNDAsNyArMTQzNSwxNiBAQAogCS5oYXNfc29yX2lvX3BlYWtfY3VycmVudCA9IHRydWUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX2hkbWlfY29uZmlnIHRlZ3JhMTI0X2hkbWlfY29uZmlnID0geworCS50bWRzID0gdGVncmExMjRfdG1kc19jb25maWcsCisJLm51bV90bWRzID0gQVJSQVlfU0laRSh0ZWdyYTEyNF90bWRzX2NvbmZpZyksCisJLmZ1c2Vfb3ZlcnJpZGVfb2Zmc2V0ID0gSERNSV9OVl9QRElTUF9TT1JfUEFEX0NUTFMwLAorCS5mdXNlX292ZXJyaWRlX3ZhbHVlID0gMSA8PCAzMSwKKwkuaGFzX3Nvcl9pb19wZWFrX2N1cnJlbnQgPSB0cnVlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfaGRtaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LWhkbWkiLCAuZGF0YSA9ICZ0ZWdyYTEyNF9oZG1pX2NvbmZpZyB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LWhkbWkiLCAuZGF0YSA9ICZ0ZWdyYTExNF9oZG1pX2NvbmZpZyB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtaGRtaSIsIC5kYXRhID0gJnRlZ3JhMzBfaGRtaV9jb25maWcgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWhkbWkiLCAuZGF0YSA9ICZ0ZWdyYTIwX2hkbWlfY29uZmlnIH0sCkBAIC0xMzgxLDI4ICsxNDg1LDIwIEBACiAJCXJldHVybiBQVFJfRVJSKGhkbWktPnJzdCk7CiAJfQogCi0JZXJyID0gY2xrX3ByZXBhcmUoaGRtaS0+Y2xrKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQogCWhkbWktPmNsa19wYXJlbnQgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBhcmVudCIpOwogCWlmIChJU19FUlIoaGRtaS0+Y2xrX3BhcmVudCkpCiAJCXJldHVybiBQVFJfRVJSKGhkbWktPmNsa19wYXJlbnQpOwogCi0JZXJyID0gY2xrX3ByZXBhcmUoaGRtaS0+Y2xrX3BhcmVudCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KIAllcnIgPSBjbGtfc2V0X3BhcmVudChoZG1pLT5jbGssIGhkbWktPmNsa19wYXJlbnQpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBjbG9ja3M6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCWhkbWktPnZkZCA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidmRkIik7Ci0JaWYgKElTX0VSUihoZG1pLT52ZGQpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgVkREIHJlZ3VsYXRvclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGhkbWktPnZkZCk7CisJaGRtaS0+aGRtaSA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAiaGRtaSIpOworCWlmIChJU19FUlIoaGRtaS0+aGRtaSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBIRE1JIHJlZ3VsYXRvclxuIik7CisJCXJldHVybiBQVFJfRVJSKGhkbWktPmhkbWkpOwogCX0KIAogCWhkbWktPnBsbCA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAicGxsIik7CkBAIC0xNDExLDYgKzE1MDcsMTIgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGRtaS0+cGxsKTsKIAl9CiAKKwloZG1pLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZCIpOworCWlmIChJU19FUlIoaGRtaS0+dmRkKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IFZERCByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUihoZG1pLT52ZGQpOworCX0KKwogCWhkbWktPm91dHB1dC5kZXYgPSAmcGRldi0+ZGV2OwogCiAJZXJyID0gdGVncmFfb3V0cHV0X3Byb2JlKCZoZG1pLT5vdXRwdXQpOwpAQCAtMTQ2Miw4ICsxNTY0LDggQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQljbGtfdW5wcmVwYXJlKGhkbWktPmNsa19wYXJlbnQpOwotCWNsa191bnByZXBhcmUoaGRtaS0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRtaS0+Y2xrX3BhcmVudCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmNsayk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9oZG1pLmggYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvaGRtaS5oCmluZGV4IDBhZWJjNDguLjkxOWExOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9oZG1pLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2hkbWkuaApAQCAtMTkwLDYgKzE5MCwxMSBAQAogCiAjZGVmaW5lIEhETUlfTlZfUERJU1BfU09SX0NTVE0JCQkJCTB4NWEKICNkZWZpbmUgU09SX0NTVE1fUk9UQ0xLKHgpICgoKHgpICYgMHhmKSA8PCAyNCkKKyNkZWZpbmUgU09SX0NTVE1fUExMRElWICgxIDw8IDIxKQorI2RlZmluZSBTT1JfQ1NUTV9MVkRTX0VOQUJMRSAoMSA8PCAxNikKKyNkZWZpbmUgU09SX0NTVE1fTU9ERV9MVkRTICgwIDw8IDEyKQorI2RlZmluZSBTT1JfQ1NUTV9NT0RFX1RNRFMgKDEgPDwgMTIpCisjZGVmaW5lIFNPUl9DU1RNX01PREVfTUFTSyAoMyA8PCAxMikKIAogI2RlZmluZSBIRE1JX05WX1BESVNQX1NPUl9MVkRTCQkJCQkweDViCiAjZGVmaW5lIEhETUlfTlZfUERJU1BfU09SX0NSQ0EJCQkJCTB4NWMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9yZ2IuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9yZ2IuYwppbmRleCAwMjY2ZmI0Li5kNmFmOWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGVncmEvcmdiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3JnYi5jCkBAIC0xNTksMTEgKzE1OSwzOCBAQAogfQogCiBzdGF0aWMgaW50IHRlZ3JhX291dHB1dF9yZ2Jfc2V0dXBfY2xvY2soc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0LAotCQkJCQlzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcGNsaykKKwkJCQkJc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHBjbGssCisJCQkJCXVuc2lnbmVkIGludCAqZGl2KQogewogCXN0cnVjdCB0ZWdyYV9yZ2IgKnJnYiA9IHRvX3JnYihvdXRwdXQpOworCWludCBlcnI7CiAKLQlyZXR1cm4gY2xrX3NldF9wYXJlbnQoY2xrLCByZ2ItPmNsa19wYXJlbnQpOworCWVyciA9IGNsa19zZXRfcGFyZW50KGNsaywgcmdiLT5jbGtfcGFyZW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKG91dHB1dC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBwYXJlbnQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogV2UgbWF5IG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBwYXJlbnQgY2xvY2ssIHNpbmNlCisJICogaXQgbWF5IGJlIGEgcGFyZW50IGZvciBvdGhlciBwZXJpcGhlcmFscy4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QKKwkgKiB0aGF0IG9uIFRlZ3JhMjAgdGhlcmUncyBvbmx5IGEgc2luZ2xlIGNsb2NrIGRlZGljYXRlZCB0byBkaXNwbGF5CisJICogKHBsbF9kX291dDApLCB3aGVyZWFzIGxhdGVyIGdlbmVyYXRpb25zIGhhdmUgYSBzZWNvbmQgb25lIHRoYXQgY2FuCisJICogYmUgdXNlZCB0byBpbmRlcGVuZGVudGx5IGRyaXZlIGEgc2Vjb25kIG91dHB1dCAocGxsX2QyX291dDApLgorCSAqCisJICogQXMgYSB3YXkgdG8gc3VwcG9ydCBtdWx0aXBsZSBvdXRwdXRzIG9uIFRlZ3JhMjAgYXMgd2VsbCwgcGxsX3AgaXMKKwkgKiB0eXBpY2FsbHkgdXNlZCBhcyB0aGUgcGFyZW50IGNsb2NrIGZvciB0aGUgZGlzcGxheSBjb250cm9sbGVycy4KKwkgKiBCdXQgdGhpcyBjb21lcyBhdCBhIGNvc3Q6IHBsbF9wIGlzIHRoZSBwYXJlbnQgb2Ygc2V2ZXJhbCBvdGhlcgorCSAqIHBlcmlwaGVyYWxzLCBzbyBpdHMgZnJlcXVlbmN5IHNob3VsZG4ndCBjaGFuZ2Ugb3V0IG9mIHRoZSBibHVlLgorCSAqCisJICogVGhlIGJlc3Qgd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQgaXMgdG8gdXNlIHRoZSBzaGlmdCBjbG9jayBkaXZpZGVyCisJICogYW5kIGhvcGUgdGhhdCB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgY2FuIGJlIG1hdGNoZWQgKG9yIGF0IGxlYXN0CisJICogbWF0Y2hlZCBzdWZmaWNpZW50bHkgY2xvc2UgdGhhdCB0aGUgcGFuZWwgd2lsbCBzdGlsbCB3b3JrKS4KKwkgKi8KKworCSpkaXYgPSAoKGNsa19nZXRfcmF0ZShjbGspICogMikgLyBwY2xrKSAtIDI7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfcmdiX2NoZWNrX21vZGUoc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3Nvci5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3Nvci5jCmluZGV4IDQ5ZWY1NzIuLjI3Yzk3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9zb3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvc29yLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CkBAIC0zMyw3ICszNCwyMyBAQAogCiAJc3RydWN0IHRlZ3JhX2RwYXV4ICpkcGF1eDsKIAorCXN0cnVjdCBtdXRleCBsb2NrOwogCWJvb2wgZW5hYmxlZDsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7Cit9OworCitzdHJ1Y3QgdGVncmFfc29yX2NvbmZpZyB7CisJdTMyIGJpdHNfcGVyX3BpeGVsOworCisJdTMyIGFjdGl2ZV9wb2xhcml0eTsKKwl1MzIgYWN0aXZlX2NvdW50OworCXUzMiB0dV9zaXplOworCXUzMiBhY3RpdmVfZnJhYzsKKwl1MzIgd2F0ZXJtYXJrOworCisJdTMyIGhibGFua19zeW1ib2xzOworCXUzMiB2Ymxhbmtfc3ltYm9sczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX3NvciAqCkBAIC0yODksMzQgKzMwNiwyMzIgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorc3RydWN0IHRlZ3JhX3Nvcl9wYXJhbXMgeworCS8qIG51bWJlciBvZiBsaW5rIGNsb2NrcyBwZXIgbGluZSAqLworCXVuc2lnbmVkIGludCBudW1fY2xvY2tzOworCS8qIHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCAqLworCXU2NCByYXRpbzsKKwkvKiBwcmVjaXNpb24gZmFjdG9yICovCisJdTY0IHByZWNpc2lvbjsKKworCXVuc2lnbmVkIGludCBhY3RpdmVfcG9sYXJpdHk7CisJdW5zaWduZWQgaW50IGFjdGl2ZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlX2ZyYWM7CisJdW5zaWduZWQgaW50IHR1X3NpemU7CisJdW5zaWduZWQgaW50IGVycm9yOworfTsKKworc3RhdGljIGludCB0ZWdyYV9zb3JfY29tcHV0ZV9wYXJhbXMoc3RydWN0IHRlZ3JhX3NvciAqc29yLAorCQkJCSAgICBzdHJ1Y3QgdGVncmFfc29yX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdHVfc2l6ZSkKK3sKKwl1NjQgYWN0aXZlX3N5bSwgYWN0aXZlX2NvdW50LCBmcmFjLCBhcHByb3g7CisJdTMyIGFjdGl2ZV9wb2xhcml0eSwgYWN0aXZlX2ZyYWMgPSAwOworCWNvbnN0IHU2NCBmID0gcGFyYW1zLT5wcmVjaXNpb247CisJczY0IGVycm9yOworCisJYWN0aXZlX3N5bSA9IHBhcmFtcy0+cmF0aW8gKiB0dV9zaXplOworCWFjdGl2ZV9jb3VudCA9IGRpdl91NjQoYWN0aXZlX3N5bSwgZikgKiBmOworCWZyYWMgPSBhY3RpdmVfc3ltIC0gYWN0aXZlX2NvdW50OworCisJLyogZnJhY3Rpb24gPCAwLjUgKi8KKwlpZiAoZnJhYyA+PSAoZiAvIDIpKSB7CisJCWFjdGl2ZV9wb2xhcml0eSA9IDE7CisJCWZyYWMgPSBmIC0gZnJhYzsKKwl9IGVsc2UgeworCQlhY3RpdmVfcG9sYXJpdHkgPSAwOworCX0KKworCWlmIChmcmFjICE9IDApIHsKKwkJZnJhYyA9IGRpdl91NjQoZiAqIGYsICBmcmFjKTsgLyogMS9mcmFjdGlvbiAqLworCQlpZiAoZnJhYyA8PSAoMTUgKiBmKSkgeworCQkJYWN0aXZlX2ZyYWMgPSBkaXZfdTY0KGZyYWMsIGYpOworCisJCQkvKiByb3VuZCB1cCAqLworCQkJaWYgKGFjdGl2ZV9wb2xhcml0eSkKKwkJCQlhY3RpdmVfZnJhYysrOworCQl9IGVsc2UgeworCQkJYWN0aXZlX2ZyYWMgPSBhY3RpdmVfcG9sYXJpdHkgPyAxIDogMTU7CisJCX0KKwl9CisKKwlpZiAoYWN0aXZlX2ZyYWMgPT0gMSkKKwkJYWN0aXZlX3BvbGFyaXR5ID0gMDsKKworCWlmIChhY3RpdmVfcG9sYXJpdHkgPT0gMSkgeworCQlpZiAoYWN0aXZlX2ZyYWMpIHsKKwkJCWFwcHJveCA9IGFjdGl2ZV9jb3VudCArIChhY3RpdmVfZnJhYyAqIChmIC0gMSkpICogZjsKKwkJCWFwcHJveCA9IGRpdl91NjQoYXBwcm94LCBhY3RpdmVfZnJhYyAqIGYpOworCQl9IGVsc2UgeworCQkJYXBwcm94ID0gYWN0aXZlX2NvdW50ICsgZjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhY3RpdmVfZnJhYykKKwkJCWFwcHJveCA9IGFjdGl2ZV9jb3VudCArIGRpdl91NjQoZiwgYWN0aXZlX2ZyYWMpOworCQllbHNlCisJCQlhcHByb3ggPSBhY3RpdmVfY291bnQ7CisJfQorCisJZXJyb3IgPSBkaXZfczY0KGFjdGl2ZV9zeW0gLSBhcHByb3gsIHR1X3NpemUpOworCWVycm9yICo9IHBhcmFtcy0+bnVtX2Nsb2NrczsKKworCWlmIChlcnJvciA8PSAwICYmIGFiczY0KGVycm9yKSA8IHBhcmFtcy0+ZXJyb3IpIHsKKwkJcGFyYW1zLT5hY3RpdmVfY291bnQgPSBkaXZfdTY0KGFjdGl2ZV9jb3VudCwgZik7CisJCXBhcmFtcy0+YWN0aXZlX3BvbGFyaXR5ID0gYWN0aXZlX3BvbGFyaXR5OworCQlwYXJhbXMtPmFjdGl2ZV9mcmFjID0gYWN0aXZlX2ZyYWM7CisJCXBhcmFtcy0+ZXJyb3IgPSBhYnM2NChlcnJvcik7CisJCXBhcmFtcy0+dHVfc2l6ZSA9IHR1X3NpemU7CisKKwkJaWYgKGVycm9yID09IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfc29yX2NhbGNfY29uZmlnKHN0cnVjdCB0ZWdyYV9zb3IgKnNvciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJIHN0cnVjdCB0ZWdyYV9zb3JfY29uZmlnICpjb25maWcsCisJCQkJIHN0cnVjdCBkcm1fZHBfbGluayAqbGluaykKK3sKKwljb25zdCB1NjQgZiA9IDEwMDAwMCwgbGlua19yYXRlID0gbGluay0+cmF0ZSAqIDEwMDA7CisJY29uc3QgdTY0IHBjbGsgPSBtb2RlLT5jbG9jayAqIDEwMDA7CisJdTY0IGlucHV0LCBvdXRwdXQsIHdhdGVybWFyaywgbnVtOworCXN0cnVjdCB0ZWdyYV9zb3JfcGFyYW1zIHBhcmFtczsKKwl1MzIgbnVtX3N5bXNfcGVyX2xpbmU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWxpbmtfcmF0ZSB8fCAhbGluay0+bnVtX2xhbmVzIHx8ICFwY2xrIHx8ICFjb25maWctPmJpdHNfcGVyX3BpeGVsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW91dHB1dCA9IGxpbmtfcmF0ZSAqIDggKiBsaW5rLT5udW1fbGFuZXM7CisJaW5wdXQgPSBwY2xrICogY29uZmlnLT5iaXRzX3Blcl9waXhlbDsKKworCWlmIChpbnB1dCA+PSBvdXRwdXQpCisJCXJldHVybiAtRVJBTkdFOworCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKwlwYXJhbXMucmF0aW8gPSBkaXY2NF91NjQoaW5wdXQgKiBmLCBvdXRwdXQpOworCXBhcmFtcy5udW1fY2xvY2tzID0gZGl2X3U2NChsaW5rX3JhdGUgKiBtb2RlLT5oZGlzcGxheSwgcGNsayk7CisJcGFyYW1zLnByZWNpc2lvbiA9IGY7CisJcGFyYW1zLmVycm9yID0gNjQgKiBmOworCXBhcmFtcy50dV9zaXplID0gNjQ7CisKKwlmb3IgKGkgPSBwYXJhbXMudHVfc2l6ZTsgaSA+PSAzMjsgaS0tKQorCQlpZiAodGVncmFfc29yX2NvbXB1dGVfcGFyYW1zKHNvciwgJnBhcmFtcywgaSkpCisJCQlicmVhazsKKworCWlmIChwYXJhbXMuYWN0aXZlX2ZyYWMgPT0gMCkgeworCQljb25maWctPmFjdGl2ZV9wb2xhcml0eSA9IDA7CisJCWNvbmZpZy0+YWN0aXZlX2NvdW50ID0gcGFyYW1zLmFjdGl2ZV9jb3VudDsKKworCQlpZiAoIXBhcmFtcy5hY3RpdmVfcG9sYXJpdHkpCisJCQljb25maWctPmFjdGl2ZV9jb3VudC0tOworCisJCWNvbmZpZy0+dHVfc2l6ZSA9IHBhcmFtcy50dV9zaXplOworCQljb25maWctPmFjdGl2ZV9mcmFjID0gMTsKKwl9IGVsc2UgeworCQljb25maWctPmFjdGl2ZV9wb2xhcml0eSA9IHBhcmFtcy5hY3RpdmVfcG9sYXJpdHk7CisJCWNvbmZpZy0+YWN0aXZlX2NvdW50ID0gcGFyYW1zLmFjdGl2ZV9jb3VudDsKKwkJY29uZmlnLT5hY3RpdmVfZnJhYyA9IHBhcmFtcy5hY3RpdmVfZnJhYzsKKwkJY29uZmlnLT50dV9zaXplID0gcGFyYW1zLnR1X3NpemU7CisJfQorCisJZGV2X2RiZyhzb3ItPmRldiwKKwkJInBvbGFyaXR5OiAlZCBhY3RpdmUgY291bnQ6ICVkIHR1IHNpemU6ICVkIGFjdGl2ZSBmcmFjOiAlZFxuIiwKKwkJY29uZmlnLT5hY3RpdmVfcG9sYXJpdHksIGNvbmZpZy0+YWN0aXZlX2NvdW50LAorCQljb25maWctPnR1X3NpemUsIGNvbmZpZy0+YWN0aXZlX2ZyYWMpOworCisJd2F0ZXJtYXJrID0gcGFyYW1zLnJhdGlvICogY29uZmlnLT50dV9zaXplICogKGYgLSBwYXJhbXMucmF0aW8pOworCXdhdGVybWFyayA9IGRpdl91NjQod2F0ZXJtYXJrLCBmKTsKKworCXdhdGVybWFyayA9IGRpdl91NjQod2F0ZXJtYXJrICsgcGFyYW1zLmVycm9yLCBmKTsKKwljb25maWctPndhdGVybWFyayA9IHdhdGVybWFyayArIChjb25maWctPmJpdHNfcGVyX3BpeGVsIC8gOCkgKyAyOworCW51bV9zeW1zX3Blcl9saW5lID0gKG1vZGUtPmhkaXNwbGF5ICogY29uZmlnLT5iaXRzX3Blcl9waXhlbCkgKgorCQkJICAgIChsaW5rLT5udW1fbGFuZXMgKiA4KTsKKworCWlmIChjb25maWctPndhdGVybWFyayA+IDMwKSB7CisJCWNvbmZpZy0+d2F0ZXJtYXJrID0gMzA7CisJCWRldl9lcnIoc29yLT5kZXYsCisJCQkidW5hYmxlIHRvIGNvbXB1dGUgVFUgc2l6ZSwgZm9yY2luZyB3YXRlcm1hcmsgdG8gJXVcbiIsCisJCQljb25maWctPndhdGVybWFyayk7CisJfSBlbHNlIGlmIChjb25maWctPndhdGVybWFyayA+IG51bV9zeW1zX3Blcl9saW5lKSB7CisJCWNvbmZpZy0+d2F0ZXJtYXJrID0gbnVtX3N5bXNfcGVyX2xpbmU7CisJCWRldl9lcnIoc29yLT5kZXYsICJ3YXRlcm1hcmsgdG9vIGhpZ2gsIGZvcmNpbmcgdG8gJXVcbiIsCisJCQljb25maWctPndhdGVybWFyayk7CisJfQorCisJLyogY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgcGVyIGhvcml6b250YWwgYmxhbmtpbmcgaW50ZXJ2YWwgKi8KKwludW0gPSAoKG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhkaXNwbGF5KSAtIDcpICogbGlua19yYXRlOworCWNvbmZpZy0+aGJsYW5rX3N5bWJvbHMgPSBkaXZfdTY0KG51bSwgcGNsayk7CisKKwlpZiAobGluay0+Y2FwYWJpbGl0aWVzICYgRFBfTElOS19DQVBfRU5IQU5DRURfRlJBTUlORykKKwkJY29uZmlnLT5oYmxhbmtfc3ltYm9scyAtPSAzOworCisJY29uZmlnLT5oYmxhbmtfc3ltYm9scyAtPSAxMiAvIGxpbmstPm51bV9sYW5lczsKKworCS8qIGNvbXB1dGUgdGhlIG51bWJlciBvZiBzeW1ib2xzIHBlciB2ZXJ0aWNhbCBibGFua2luZyBpbnRlcnZhbCAqLworCW51bSA9IChtb2RlLT5oZGlzcGxheSAtIDI1KSAqIGxpbmtfcmF0ZTsKKwljb25maWctPnZibGFua19zeW1ib2xzID0gZGl2X3U2NChudW0sIHBjbGspOworCWNvbmZpZy0+dmJsYW5rX3N5bWJvbHMgLT0gMzYgLyBsaW5rLT5udW1fbGFuZXMgKyA0OworCisJZGV2X2RiZyhzb3ItPmRldiwgImJsYW5rIHN5bWJvbHM6IEg6JXUgVjoldVxuIiwgY29uZmlnLT5oYmxhbmtfc3ltYm9scywKKwkJY29uZmlnLT52Ymxhbmtfc3ltYm9scyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB0ZWdyYV9vdXRwdXRfc29yX2VuYWJsZShzdHJ1Y3QgdGVncmFfb3V0cHV0ICpvdXRwdXQpCiB7CiAJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKG91dHB1dC0+ZW5jb2Rlci5jcnRjKTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZkYy0+YmFzZS5tb2RlOwogCXVuc2lnbmVkIGludCB2YmUsIHZzZSwgaGJlLCBoc2UsIHZicywgaGJzLCBpOwogCXN0cnVjdCB0ZWdyYV9zb3IgKnNvciA9IHRvX3NvcihvdXRwdXQpOworCXN0cnVjdCB0ZWdyYV9zb3JfY29uZmlnIGNvbmZpZzsKKwlzdHJ1Y3QgZHJtX2RwX2xpbmsgbGluazsKKwlzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4OwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnNvci0+bG9jayk7CiAKIAlpZiAoc29yLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKKwkJZ290byB1bmxvY2s7CiAKIAllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoc29yLT5jbGspOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIHVubG9jazsKIAogCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoc29yLT5yc3QpOwogCisJLyogRklYTUU6IHByb3Blcmx5IGNvbnZlcnQgdG8gc3RydWN0IGRybV9kcF9hdXggKi8KKwlhdXggPSAoc3RydWN0IGRybV9kcF9hdXggKilzb3ItPmRwYXV4OworCiAJaWYgKHNvci0+ZHBhdXgpIHsKIAkJZXJyID0gdGVncmFfZHBhdXhfZW5hYmxlKHNvci0+ZHBhdXgpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIERQOiAlZFxuIiwgZXJyKTsKKworCQllcnIgPSBkcm1fZHBfbGlua19wcm9iZShhdXgsICZsaW5rKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gcHJvYmUgZURQIGxpbms6ICVkXG4iLAorCQkJCWVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCiAJZXJyID0gY2xrX3NldF9wYXJlbnQoc29yLT5jbGssIHNvci0+Y2xrX3NhZmUpOwogCWlmIChlcnIgPCAwKQogCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIHNldCBzYWZlIHBhcmVudCBjbG9jazogJWRcbiIsIGVycik7CiAKKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5iaXRzX3Blcl9waXhlbCA9IDI0OyAvKiBYWFg6IGRvbid0IGhhcmRjb2RlPyAqLworCisJZXJyID0gdGVncmFfc29yX2NhbGNfY29uZmlnKHNvciwgbW9kZSwgJmNvbmZpZywgJmxpbmspOworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIGNvbXB1dGUgbGluayBjb25maWd1cmF0aW9uOiAlZFxuIiwKKwkJCWVycik7CisKIAl2YWx1ZSA9IHRlZ3JhX3Nvcl9yZWFkbChzb3IsIFNPUl9DTEtfQ05UUkwpOwogCXZhbHVlICY9IH5TT1JfQ0xLX0NOVFJMX0RQX0NMS19TRUxfTUFTSzsKIAl2YWx1ZSB8PSBTT1JfQ0xLX0NOVFJMX0RQX0NMS19TRUxfU0lOR0xFX0RQQ0xLOwpAQCAtMzg1LDcgKzYwMCw3IEBACiAJZXJyID0gdGVncmFfaW9fcmFpbF9wb3dlcl9vbihURUdSQV9JT19SQUlMX0xWRFMpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gcG93ZXIgb24gSS9PIHJhaWw6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAl1c2xlZXBfcmFuZ2UoNSwgMTAwKTsKQEAgLTQxOSwxNSArNjM0LDI5IEBACiAJaWYgKGVyciA8IDApCiAJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gc2V0IERQIHBhcmVudCBjbG9jazogJWRcbiIsIGVycik7CiAKLQkvKiBwb3dlciBkcGxhbmVzIChYWFggcGFyYW1ldGVyaXplIGJhc2VkIG9uIGxpbms/KSAqLworCS8qIHBvd2VyIERQIGxhbmVzICovCiAJdmFsdWUgPSB0ZWdyYV9zb3JfcmVhZGwoc29yLCBTT1JfRFBfUEFEQ1RMXzApOwotCXZhbHVlIHw9IFNPUl9EUF9QQURDVExfUERfVFhEXzMgfCBTT1JfRFBfUEFEQ1RMX1BEX1RYRF8wIHwKLQkJIFNPUl9EUF9QQURDVExfUERfVFhEXzEgfCBTT1JfRFBfUEFEQ1RMX1BEX1RYRF8yOworCisJaWYgKGxpbmsubnVtX2xhbmVzIDw9IDIpCisJCXZhbHVlICY9IH4oU09SX0RQX1BBRENUTF9QRF9UWERfMyB8IFNPUl9EUF9QQURDVExfUERfVFhEXzIpOworCWVsc2UKKwkJdmFsdWUgfD0gU09SX0RQX1BBRENUTF9QRF9UWERfMyB8IFNPUl9EUF9QQURDVExfUERfVFhEXzI7CisKKwlpZiAobGluay5udW1fbGFuZXMgPD0gMSkKKwkJdmFsdWUgJj0gflNPUl9EUF9QQURDVExfUERfVFhEXzE7CisJZWxzZQorCQl2YWx1ZSB8PSBTT1JfRFBfUEFEQ1RMX1BEX1RYRF8xOworCisJaWYgKGxpbmsubnVtX2xhbmVzID09IDApCisJCXZhbHVlICY9IH5TT1JfRFBfUEFEQ1RMX1BEX1RYRF8wOworCWVsc2UKKwkJdmFsdWUgfD0gU09SX0RQX1BBRENUTF9QRF9UWERfMDsKKwogCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX0RQX1BBRENUTF8wKTsKIAogCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX0RQX0xJTktDVExfMCk7CiAJdmFsdWUgJj0gflNPUl9EUF9MSU5LQ1RMX0xBTkVfQ09VTlRfTUFTSzsKLQl2YWx1ZSB8PSBTT1JfRFBfTElOS0NUTF9MQU5FX0NPVU5UKDQpOworCXZhbHVlIHw9IFNPUl9EUF9MSU5LQ1RMX0xBTkVfQ09VTlQobGluay5udW1fbGFuZXMpOwogCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX0RQX0xJTktDVExfMCk7CiAKIAkvKiBzdGFydCBsYW5lIHNlcXVlbmNlciAqLwpAQCAtNDQzLDEwICs2NzIsMTAgQEAKIAkJdXNsZWVwX3JhbmdlKDI1MCwgMTAwMCk7CiAJfQogCi0JLyogc2V0IGxpbmsgYmFuZHdpZHRoICgyLjcgR0h6LCBYWFg6IHBhcmFtZXRlcml6ZSBiYXNlZCBvbiBsaW5rPykgKi8KKwkvKiBzZXQgbGluayBiYW5kd2lkdGggKi8KIAl2YWx1ZSA9IHRlZ3JhX3Nvcl9yZWFkbChzb3IsIFNPUl9DTEtfQ05UUkwpOwogCXZhbHVlICY9IH5TT1JfQ0xLX0NOVFJMX0RQX0xJTktfU1BFRURfTUFTSzsKLQl2YWx1ZSB8PSBTT1JfQ0xLX0NOVFJMX0RQX0xJTktfU1BFRURfRzJfNzA7CisJdmFsdWUgfD0gZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGxpbmsucmF0ZSkgPDwgMjsKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgdmFsdWUsIFNPUl9DTEtfQ05UUkwpOwogCiAJLyogc2V0IGxpbmtjdGwgKi8KQEAgLTQ1NCw3ICs2ODMsNyBAQAogCXZhbHVlIHw9IFNPUl9EUF9MSU5LQ1RMX0VOQUJMRTsKIAogCXZhbHVlICY9IH5TT1JfRFBfTElOS0NUTF9UVV9TSVpFX01BU0s7Ci0JdmFsdWUgfD0gU09SX0RQX0xJTktDVExfVFVfU0laRSg1OSk7IC8qIFhYWDogZG9uJ3QgaGFyZGNvZGU/ICovCisJdmFsdWUgfD0gU09SX0RQX0xJTktDVExfVFVfU0laRShjb25maWcudHVfc2l6ZSk7CiAKIAl2YWx1ZSB8PSBTT1JfRFBfTElOS0NUTF9FTkhBTkNFRF9GUkFNRTsKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgdmFsdWUsIFNPUl9EUF9MSU5LQ1RMXzApOwpAQCAtNDcwLDI4ICs2OTksMzEgQEAKIAogCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX0RQX0NPTkZJR18wKTsKIAl2YWx1ZSAmPSB+U09SX0RQX0NPTkZJR19XQVRFUk1BUktfTUFTSzsKLQl2YWx1ZSB8PSBTT1JfRFBfQ09ORklHX1dBVEVSTUFSSygxNCk7IC8qIFhYWDogZG9uJ3QgaGFyZGNvZGU/ICovCisJdmFsdWUgfD0gU09SX0RQX0NPTkZJR19XQVRFUk1BUksoY29uZmlnLndhdGVybWFyayk7CiAKIAl2YWx1ZSAmPSB+U09SX0RQX0NPTkZJR19BQ1RJVkVfU1lNX0NPVU5UX01BU0s7Ci0JdmFsdWUgfD0gU09SX0RQX0NPTkZJR19BQ1RJVkVfU1lNX0NPVU5UKDQ3KTsgLyogWFhYOiBkb24ndCBoYXJkY29kZT8gKi8KKwl2YWx1ZSB8PSBTT1JfRFBfQ09ORklHX0FDVElWRV9TWU1fQ09VTlQoY29uZmlnLmFjdGl2ZV9jb3VudCk7CiAKIAl2YWx1ZSAmPSB+U09SX0RQX0NPTkZJR19BQ1RJVkVfU1lNX0ZSQUNfTUFTSzsKLQl2YWx1ZSB8PSBTT1JfRFBfQ09ORklHX0FDVElWRV9TWU1fRlJBQyg5KTsgLyogWFhYOiBkb24ndCBoYXJkY29kZT8gKi8KKwl2YWx1ZSB8PSBTT1JfRFBfQ09ORklHX0FDVElWRV9TWU1fRlJBQyhjb25maWcuYWN0aXZlX2ZyYWMpOwogCi0JdmFsdWUgJj0gflNPUl9EUF9DT05GSUdfQUNUSVZFX1NZTV9QT0xBUklUWTsgLyogWFhYOiBkb24ndCBoYXJkY29kZT8gKi8KKwlpZiAoY29uZmlnLmFjdGl2ZV9wb2xhcml0eSkKKwkJdmFsdWUgfD0gU09SX0RQX0NPTkZJR19BQ1RJVkVfU1lNX1BPTEFSSVRZOworCWVsc2UKKwkJdmFsdWUgJj0gflNPUl9EUF9DT05GSUdfQUNUSVZFX1NZTV9QT0xBUklUWTsKIAogCXZhbHVlIHw9IFNPUl9EUF9DT05GSUdfQUNUSVZFX1NZTV9FTkFCTEU7Ci0JdmFsdWUgfD0gU09SX0RQX0NPTkZJR19ESVNQQVJJVFlfTkVHQVRJVkU7IC8qIFhYWDogZG9uJ3QgaGFyZGNvZGU/ICovCisJdmFsdWUgfD0gU09SX0RQX0NPTkZJR19ESVNQQVJJVFlfTkVHQVRJVkU7CiAJdGVncmFfc29yX3dyaXRlbChzb3IsIHZhbHVlLCBTT1JfRFBfQ09ORklHXzApOwogCiAJdmFsdWUgPSB0ZWdyYV9zb3JfcmVhZGwoc29yLCBTT1JfRFBfQVVESU9fSEJMQU5LX1NZTUJPTFMpOwogCXZhbHVlICY9IH5TT1JfRFBfQVVESU9fSEJMQU5LX1NZTUJPTFNfTUFTSzsKLQl2YWx1ZSB8PSAxMzc7IC8qIFhYWDogZG9uJ3QgaGFyZGNvZGU/ICovCisJdmFsdWUgfD0gY29uZmlnLmhibGFua19zeW1ib2xzICYgMHhmZmZmOwogCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX0RQX0FVRElPX0hCTEFOS19TWU1CT0xTKTsKIAogCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX0RQX0FVRElPX1ZCTEFOS19TWU1CT0xTKTsKIAl2YWx1ZSAmPSB+U09SX0RQX0FVRElPX1ZCTEFOS19TWU1CT0xTX01BU0s7Ci0JdmFsdWUgfD0gMjM2ODsgLyogWFhYOiBkb24ndCBoYXJkY29kZT8gKi8KKwl2YWx1ZSB8PSBjb25maWcudmJsYW5rX3N5bWJvbHMgJiAweGZmZmY7CiAJdGVncmFfc29yX3dyaXRlbChzb3IsIHZhbHVlLCBTT1JfRFBfQVVESU9fVkJMQU5LX1NZTUJPTFMpOwogCiAJLyogZW5hYmxlIHBhZCBjYWxpYnJhdGlvbiBsb2dpYyAqLwpAQCAtNTAwLDMwICs3MzIsMjcgQEAKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgdmFsdWUsIFNPUl9EUF9QQURDVExfMCk7CiAKIAlpZiAoc29yLT5kcGF1eCkgewotCQkvKiBGSVhNRTogcHJvcGVybHkgY29udmVydCB0byBzdHJ1Y3QgZHJtX2RwX2F1eCAqLwotCQlzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4ID0gKHN0cnVjdCBkcm1fZHBfYXV4ICopc29yLT5kcGF1eDsKLQkJc3RydWN0IGRybV9kcF9saW5rIGxpbms7CiAJCXU4IHJhdGUsIGxhbmVzOwogCiAJCWVyciA9IGRybV9kcF9saW5rX3Byb2JlKGF1eCwgJmxpbmspOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZGV2X2Vycihzb3ItPmRldiwgImZhaWxlZCB0byBwcm9iZSBlRFAgbGluazogJWRcbiIsCiAJCQkJZXJyKTsKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIHVubG9jazsKIAkJfQogCiAJCWVyciA9IGRybV9kcF9saW5rX3Bvd2VyX3VwKGF1eCwgJmxpbmspOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZGV2X2Vycihzb3ItPmRldiwgImZhaWxlZCB0byBwb3dlciB1cCBlRFAgbGluazogJWRcbiIsCiAJCQkJZXJyKTsKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIHVubG9jazsKIAkJfQogCiAJCWVyciA9IGRybV9kcF9saW5rX2NvbmZpZ3VyZShhdXgsICZsaW5rKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gY29uZmlndXJlIGVEUCBsaW5rOiAlZFxuIiwKIAkJCQllcnIpOwotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gdW5sb2NrOwogCQl9CiAKIAkJcmF0ZSA9IGRybV9kcF9saW5rX3JhdGVfdG9fYndfY29kZShsaW5rLnJhdGUpOwpAQCAtNTU4LDcgKzc4Nyw3IEBACiAJCWlmIChlcnIgPCAwKSB7CiAJCQlkZXZfZXJyKHNvci0+ZGV2LCAiRFAgZmFzdCBsaW5rIHRyYWluaW5nIGZhaWxlZDogJWRcbiIsCiAJCQkJZXJyKTsKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIHVubG9jazsKIAkJfQogCiAJCWRldl9kYmcoc29yLT5kZXYsICJmYXN0IGxpbmsgdHJhaW5pbmcgc3VjY2VlZGVkXG4iKTsKQEAgLTU2Nyw3ICs3OTYsNyBAQAogCWVyciA9IHRlZ3JhX3Nvcl9wb3dlcl91cChzb3IsIDI1MCk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycihzb3ItPmRldiwgImZhaWxlZCB0byBwb3dlciB1cCBTT1I6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAkvKiBzdGFydCBkaXNwbGF5IGNvbnRyb2xsZXIgaW4gY29udGludW91cyBtb2RlICovCkBAIC01ODYsMTIgKzgxNSwyNiBAQAogCSAqIGNvbmZpZ3VyZSBwYW5lbCAoMjRicHAsIHZzeW5jLSwgaHN5bmMtLCBEUC1BIHByb3RvY29sLCBjb21wbGV0ZQogCSAqIHJhc3RlciwgYXNzb2NpYXRlIHdpdGggZGlzcGxheSBjb250cm9sbGVyKQogCSAqLwotCXZhbHVlID0gU09SX1NUQVRFX0FTWV9QSVhFTERFUFRIX0JQUF8yNF80NDQgfAotCQlTT1JfU1RBVEVfQVNZX1ZTWU5DUE9MIHwKKwl2YWx1ZSA9IFNPUl9TVEFURV9BU1lfVlNZTkNQT0wgfAogCQlTT1JfU1RBVEVfQVNZX0hTWU5DUE9MIHwKIAkJU09SX1NUQVRFX0FTWV9QUk9UT0NPTF9EUF9BIHwKIAkJU09SX1NUQVRFX0FTWV9DUkNfTU9ERV9DT01QTEVURSB8CiAJCVNPUl9TVEFURV9BU1lfT1dORVIoZGMtPnBpcGUgKyAxKTsKKworCXN3aXRjaCAoY29uZmlnLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAyNDoKKwkJdmFsdWUgfD0gU09SX1NUQVRFX0FTWV9QSVhFTERFUFRIX0JQUF8yNF80NDQ7CisJCWJyZWFrOworCisJY2FzZSAxODoKKwkJdmFsdWUgfD0gU09SX1NUQVRFX0FTWV9QSVhFTERFUFRIX0JQUF8xOF80NDQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwogCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX1NUQVRFXzEpOwogCiAJLyoKQEAgLTYyMCwxMSArODYzLDggQEAKIAl2YWx1ZSA9ICgodmJzICYgMHg3ZmZmKSA8PCAxNikgfCAoaGJzICYgMHg3ZmZmKTsKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgdmFsdWUsIFNPUl9IRUFEX1NUQVRFXzQoMCkpOwogCi0JLyogWFhYIGludGVybGFjZWQgbW9kZSAqLwotCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCAweDAwMDAwMDAxLCBTT1JfSEVBRF9TVEFURV81KDApKTsKLQogCS8qIENTVE0gKExWRFMsIGxpbmsgQS9CLCB1cHBlcikgKi8KLQl2YWx1ZSA9IFNPUl9DU1RNX0xWRFMgfCBTT1JfQ1NUTV9MSU5LX0FDVF9CIHwgU09SX0NTVE1fTElOS19BQ1RfQiB8CisJdmFsdWUgPSBTT1JfQ1NUTV9MVkRTIHwgU09SX0NTVE1fTElOS19BQ1RfQSB8IFNPUl9DU1RNX0xJTktfQUNUX0IgfAogCQlTT1JfQ1NUTV9VUFBFUjsKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgdmFsdWUsIFNPUl9DU1RNKTsKIApAQCAtNjMyLDcgKzg3Miw3IEBACiAJZXJyID0gdGVncmFfc29yX3NldHVwX3B3bShzb3IsIDI1MCk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycihzb3ItPmRldiwgImZhaWxlZCB0byBzZXR1cCBQV006ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAl2YWx1ZSA9IHRlZ3JhX2RjX3JlYWRsKGRjLCBEQ19ESVNQX0RJU1BfV0lOX09QVElPTlMpOwpAQCAtNjQ0LDE4ICs4ODQsMjAgQEAKIAllcnIgPSB0ZWdyYV9zb3JfYXR0YWNoKHNvcik7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycihzb3ItPmRldiwgImZhaWxlZCB0byBhdHRhY2ggU09SOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJZXJyID0gdGVncmFfc29yX3dha2V1cChzb3IpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIERDOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJc29yLT5lbmFibGVkID0gdHJ1ZTsKIAotCXJldHVybiAwOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmc29yLT5sb2NrKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHRlZ3JhX3Nvcl9kZXRhY2goc3RydWN0IHRlZ3JhX3NvciAqc29yKQpAQCAtNzQwLDcgKzk4Miw3IEBACiAJdGVncmFfc29yX3dyaXRlbChzb3IsIHZhbHVlLCBTT1JfRFBfUEFEQ1RMXzApOwogCiAJLyogc3RvcCBsYW5lIHNlcXVlbmNlciAqLwotCXZhbHVlID0gU09SX0xBTkVfU0VRX0NUTF9UUklHR0VSIHwgU09SX0xBTkVfU0VRX0NUTF9TRVFVRU5DRV9ET1dOIHwKKwl2YWx1ZSA9IFNPUl9MQU5FX1NFUV9DVExfVFJJR0dFUiB8IFNPUl9MQU5FX1NFUV9DVExfU0VRVUVOQ0VfVVAgfAogCQlTT1JfTEFORV9TRVFfQ1RMX1BPV0VSX1NUQVRFX0RPV047CiAJdGVncmFfc29yX3dyaXRlbChzb3IsIHZhbHVlLCBTT1JfTEFORV9TRVFfQ1RMKTsKIApAQCAtNzgzLDE1ICsxMDI1LDE3IEBACiAJc3RydWN0IHRlZ3JhX2RjICpkYyA9IHRvX3RlZ3JhX2RjKG91dHB1dC0+ZW5jb2Rlci5jcnRjKTsKIAlzdHJ1Y3QgdGVncmFfc29yICpzb3IgPSB0b19zb3Iob3V0cHV0KTsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CisKKwltdXRleF9sb2NrKCZzb3ItPmxvY2spOwogCiAJaWYgKCFzb3ItPmVuYWJsZWQpCi0JCXJldHVybiAwOworCQlnb3RvIHVubG9jazsKIAogCWVyciA9IHRlZ3JhX3Nvcl9kZXRhY2goc29yKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIGRldGFjaCBTT1I6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgMCwgU09SX1NUQVRFXzEpOwpAQCAtODMyLDIxICsxMDc2LDIxIEBACiAJZXJyID0gdGVncmFfc29yX3Bvd2VyX2Rvd24oc29yKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIHBvd2VyIGRvd24gU09SOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKHNvci0+ZHBhdXgpIHsKIAkJZXJyID0gdGVncmFfZHBhdXhfZGlzYWJsZShzb3ItPmRwYXV4KTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBEUDogJWRcbiIsIGVycik7Ci0JCQlyZXR1cm4gZXJyOworCQkJZ290byB1bmxvY2s7CiAJCX0KIAl9CiAKIAllcnIgPSB0ZWdyYV9pb19yYWlsX3Bvd2VyX29mZihURUdSQV9JT19SQUlMX0xWRFMpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoc29yLT5kZXYsICJmYWlsZWQgdG8gcG93ZXIgb2ZmIEkvTyByYWlsOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJcmVzZXRfY29udHJvbF9hc3NlcnQoc29yLT5yc3QpOwpAQCAtODU0LDE4ICsxMDk4LDE4IEBACiAKIAlzb3ItPmVuYWJsZWQgPSBmYWxzZTsKIAotCXJldHVybiAwOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmc29yLT5sb2NrKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHRlZ3JhX291dHB1dF9zb3Jfc2V0dXBfY2xvY2soc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0LAotCQkJCQlzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcGNsaykKKwkJCQkJc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHBjbGssCisJCQkJCXVuc2lnbmVkIGludCAqZGl2KQogewogCXN0cnVjdCB0ZWdyYV9zb3IgKnNvciA9IHRvX3NvcihvdXRwdXQpOwogCWludCBlcnI7CiAKLQkvKiByb3VuZCB0byBuZXh0IE1IeiAqLwotCXBjbGsgPSBESVZfUk9VTkRfVVAocGNsayAvIDIsIDEwMDAwMDApICogMTAwMDAwMDsKLQogCWVyciA9IGNsa19zZXRfcGFyZW50KGNsaywgc29yLT5jbGtfcGFyZW50KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIHNldCBwYXJlbnQgY2xvY2s6ICVkXG4iLCBlcnIpOwpAQCAtODc0LDExICsxMTE4LDEyIEBACiAKIAllcnIgPSBjbGtfc2V0X3JhdGUoc29yLT5jbGtfcGFyZW50LCBwY2xrKTsKIAlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIHNldCBiYXNlIGNsb2NrIHJhdGUgdG8gJWx1IEh6XG4iLAotCQkJcGNsayAqIDIpOworCQlkZXZfZXJyKHNvci0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjbG9jayByYXRlIHRvICVsdSBIelxuIiwgcGNsayk7CiAJCXJldHVybiBlcnI7CiAJfQogCisJKmRpdiA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTE0LDkgKzExNTksMTI0IEBACiAJLmRldGVjdCA9IHRlZ3JhX291dHB1dF9zb3JfZGV0ZWN0LAogfTsKIAorc3RhdGljIGludCB0ZWdyYV9zb3JfY3JjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3Nvcl9jcmNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV9zb3JfY3JjX3dhaXQoc3RydWN0IHRlZ3JhX3NvciAqc29yLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdTMyIHZhbHVlOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX0NSQ19BKTsKKwkJaWYgKHZhbHVlICYgU09SX0NSQ19BX1ZBTElEKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHNzaXplX3QgdGVncmFfc29yX2NyY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90IHNpemUsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGVncmFfc29yICpzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCBudW0sIGVycjsKKwljaGFyIGJ1ZlsxMF07CisJdTMyIHZhbHVlOworCisJbXV0ZXhfbG9jaygmc29yLT5sb2NrKTsKKworCWlmICghc29yLT5lbmFibGVkKSB7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gdW5sb2NrOworCX0KKworCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX1NUQVRFXzEpOworCXZhbHVlICY9IH5TT1JfU1RBVEVfQVNZX0NSQ19NT0RFX01BU0s7CisJdGVncmFfc29yX3dyaXRlbChzb3IsIHZhbHVlLCBTT1JfU1RBVEVfMSk7CisKKwl2YWx1ZSA9IHRlZ3JhX3Nvcl9yZWFkbChzb3IsIFNPUl9DUkNfQ05UUkwpOworCXZhbHVlIHw9IFNPUl9DUkNfQ05UUkxfRU5BQkxFOworCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX0NSQ19DTlRSTCk7CisKKwl2YWx1ZSA9IHRlZ3JhX3Nvcl9yZWFkbChzb3IsIFNPUl9URVNUKTsKKwl2YWx1ZSAmPSB+U09SX1RFU1RfQ1JDX1BPU1RfU0VSSUFMSVpFOworCXRlZ3JhX3Nvcl93cml0ZWwoc29yLCB2YWx1ZSwgU09SX1RFU1QpOworCisJZXJyID0gdGVncmFfc29yX2NyY193YWl0KHNvciwgMTAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwl0ZWdyYV9zb3Jfd3JpdGVsKHNvciwgU09SX0NSQ19BX1JFU0VULCBTT1JfQ1JDX0EpOworCXZhbHVlID0gdGVncmFfc29yX3JlYWRsKHNvciwgU09SX0NSQ19CKTsKKworCW51bSA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJTA4eFxuIiwgdmFsdWUpOworCisJZXJyID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBzaXplLCBwcG9zLCBidWYsIG51bSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnNvci0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGVncmFfc29yX2NyY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gdGVncmFfc29yX2NyY19vcGVuLAorCS5yZWFkID0gdGVncmFfc29yX2NyY19yZWFkLAorCS5yZWxlYXNlID0gdGVncmFfc29yX2NyY19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCB0ZWdyYV9zb3JfZGVidWdmc19pbml0KHN0cnVjdCB0ZWdyYV9zb3IgKnNvciwKKwkJCQkgIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXN0cnVjdCBkZW50cnkgKmVudHJ5OworCWludCBlcnIgPSAwOworCisJc29yLT5kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKCJzb3IiLCBtaW5vci0+ZGVidWdmc19yb290KTsKKwlpZiAoIXNvci0+ZGVidWdmcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImNyYyIsIDA2NDQsIHNvci0+ZGVidWdmcywgc29yLAorCQkJCSAgICAmdGVncmFfc29yX2NyY19mb3BzKTsKKwlpZiAoIWVudHJ5KSB7CisJCWRldl9lcnIoc29yLT5kZXYsCisJCQkiY2Fubm90IGNyZWF0ZSAvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvJXMvc29yL2NyY1xuIiwKKwkJCW1pbm9yLT5kZWJ1Z2ZzX3Jvb3QtPmRfbmFtZS5uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZW1vdmU7CisJfQorCisJcmV0dXJuIGVycjsKKworcmVtb3ZlOgorCWRlYnVnZnNfcmVtb3ZlKHNvci0+ZGVidWdmcyk7CisJc29yLT5kZWJ1Z2ZzID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3Nvcl9kZWJ1Z2ZzX2V4aXQoc3RydWN0IHRlZ3JhX3NvciAqc29yKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzb3ItPmRlYnVnZnMpOworCXNvci0+ZGVidWdmcyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB0ZWdyYV9zb3JfaW5pdChzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCB0ZWdyYV9kcm0gKnRlZ3JhID0gZGV2X2dldF9kcnZkYXRhKGNsaWVudC0+cGFyZW50KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGV2X2dldF9kcnZkYXRhKGNsaWVudC0+cGFyZW50KTsKIAlzdHJ1Y3QgdGVncmFfc29yICpzb3IgPSBob3N0MXhfY2xpZW50X3RvX3NvcihjbGllbnQpOwogCWludCBlcnI7CiAKQEAgLTkyOCwxMiArMTI4OCwxOCBAQAogCXNvci0+b3V0cHV0LmRldiA9IHNvci0+ZGV2OwogCXNvci0+b3V0cHV0Lm9wcyA9ICZzb3Jfb3BzOwogCi0JZXJyID0gdGVncmFfb3V0cHV0X2luaXQodGVncmEtPmRybSwgJnNvci0+b3V0cHV0KTsKKwllcnIgPSB0ZWdyYV9vdXRwdXRfaW5pdChkcm0sICZzb3ItPm91dHB1dCk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycihzb3ItPmRldiwgIm91dHB1dCBzZXR1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpIHsKKwkJZXJyID0gdGVncmFfc29yX2RlYnVnZnNfaW5pdChzb3IsIGRybS0+cHJpbWFyeSk7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2Vycihzb3ItPmRldiwgImRlYnVnZnMgc2V0dXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwl9CisKIAlpZiAoc29yLT5kcGF1eCkgewogCQllcnIgPSB0ZWdyYV9kcGF1eF9hdHRhY2goc29yLT5kcGF1eCwgJnNvci0+b3V0cHV0KTsKIAkJaWYgKGVyciA8IDApIHsKQEAgLTk2NCw2ICsxMzMwLDEyIEBACiAJCX0KIAl9CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfREVCVUdfRlMpKSB7CisJCWVyciA9IHRlZ3JhX3Nvcl9kZWJ1Z2ZzX2V4aXQoc29yKTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZXJyKHNvci0+ZGV2LCAiZGVidWdmcyBjbGVhbnVwIGZhaWxlZDogJWRcbiIsIGVycik7CisJfQorCiAJZXJyID0gdGVncmFfb3V0cHV0X2V4aXQoJnNvci0+b3V0cHV0KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHNvci0+ZGV2LCAib3V0cHV0IGNsZWFudXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKQEAgLTEwNDUsNiArMTQxNyw4IEBACiAJc29yLT5jbGllbnQub3BzID0gJnNvcl9jbGllbnRfb3BzOwogCXNvci0+Y2xpZW50LmRldiA9ICZwZGV2LT5kZXY7CiAKKwltdXRleF9pbml0KCZzb3ItPmxvY2spOworCiAJZXJyID0gaG9zdDF4X2NsaWVudF9yZWdpc3Rlcigmc29yLT5jbGllbnQpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBob3N0MXggY2xpZW50OiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9zb3IuaCBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9zb3IuaAppbmRleCBmNDE1NmQ1Li5hNWY4ODUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL3Nvci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9zb3IuaApAQCAtNDcsNiArNDcsNyBAQAogI2RlZmluZSBTT1JfSEVBRF9TVEFURV80KHgpICgweDBkICsgKHgpKQogI2RlZmluZSBTT1JfSEVBRF9TVEFURV81KHgpICgweDBmICsgKHgpKQogI2RlZmluZSBTT1JfQ1JDX0NOVFJMIDB4MTEKKyNkZWZpbmUgIFNPUl9DUkNfQ05UUkxfRU5BQkxFCQkJKDEgPDwgMCkKICNkZWZpbmUgU09SX0RQX0RFQlVHX01WSUQgMHgxMgogCiAjZGVmaW5lIFNPUl9DTEtfQ05UUkwgMHgxMwpAQCAtNjksNiArNzAsNyBAQAogI2RlZmluZSAgU09SX1BXUl9OT1JNQUxfU1RBVEVfUFUJCSgxIDw8IDApCiAKICNkZWZpbmUgU09SX1RFU1QgMHgxNgorI2RlZmluZSAgU09SX1RFU1RfQ1JDX1BPU1RfU0VSSUFMSVpFCQkoMSA8PCAyMykKICNkZWZpbmUgIFNPUl9URVNUX0FUVEFDSEVECQkJKDEgPDwgMTApCiAjZGVmaW5lICBTT1JfVEVTVF9IRUFEX01PREVfTUFTSwkJKDMgPDwgOCkKICNkZWZpbmUgIFNPUl9URVNUX0hFQURfTU9ERV9BV0FLRQkJKDIgPDwgOCkKQEAgLTExNSw2ICsxMTcsOCBAQAogCiAjZGVmaW5lIFNPUl9MVkRTIDB4MWMKICNkZWZpbmUgU09SX0NSQ19BIDB4MWQKKyNkZWZpbmUgIFNPUl9DUkNfQV9WQUxJRAkJCSgxIDw8IDApCisjZGVmaW5lICBTT1JfQ1JDX0FfUkVTRVQJCQkoMSA8PCAwKQogI2RlZmluZSBTT1JfQ1JDX0IgMHgxZQogI2RlZmluZSBTT1JfQkxBTksgMHgxZgogI2RlZmluZSBTT1JfU0VRX0NUTCAweDIwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGlsY2RjL3RpbGNkY19kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS90aWxjZGMvdGlsY2RjX2Rydi5jCmluZGV4IDE3MWE4MjAuLmIyMGI2OTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGlsY2RjL3RpbGNkY19kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGlsY2RjL3RpbGNkY19kcnYuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJfQogCiAJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7Ci0JcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CisJcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldiwgcGxhdGZvcm1fZ2V0X2lycShkZXYtPnBsYXRmb3JtZGV2LCAwKSk7CiAJcG1fcnVudGltZV9wdXRfc3luYyhkZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIElSUSBoYW5kbGVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX21haW4uYyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX21haW4uYwppbmRleCBhZmRmMzgzLi43MDk0YjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9tYWluLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfbWFpbi5jCkBAIC0yOTQsNiArMjk0LDcgQEAKIAlkZXYtPmRldl9wcml2YXRlID0gdWRsOwogCiAJaWYgKCF1ZGxfcGFyc2VfdmVuZG9yX2Rlc2NyaXB0b3IoZGV2LCBkZXYtPnVzYmRldikpIHsKKwkJcmV0ID0gLUVOT0RFVjsKIAkJRFJNX0VSUk9SKCJmaXJtd2FyZSBub3QgcmVjb2duaXplZC4gQXNzdW1lIGluY29tcGF0aWJsZSBkZXZpY2VcbiIpOwogCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCmluZGV4IGExODQ3OWMuLjZmYzA2NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCkBAIC03MzcsNCArNzM3LDQgQEAKIAlEUk1fSU9DVExfREVGX0RSVihWSUFfQkxJVF9TWU5DLCB2aWFfZG1hX2JsaXRfc3luYywgRFJNX0FVVEgpCiB9OwogCi1pbnQgdmlhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHZpYV9pb2N0bHMpOworaW50IHZpYV9tYXhfaW9jdGwgPSBBUlJBWV9TSVpFKHZpYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbW0uYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX21tLmMKaW5kZXggOTI3ODg5MS4uZDcwYjFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9tbS5jCkBAIC03OSw3ICs3OSw3IEBACiAKIAkvKiBMaW51eCBzcGVjaWZpYyB1bnRpbCBjb250ZXh0IHRyYWNraW5nIGNvZGUgZ2V0cyBwb3J0ZWQgdG8gQlNEICovCiAJLyogTGFzdCBjb250ZXh0LCBwZXJmb3JtIGNsZWFudXAgKi8KLQlpZiAobGlzdF9pc19zaW5ndWxhcigmZGV2LT5jdHhsaXN0KSAmJiBkZXYtPmRldl9wcml2YXRlKSB7CisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJmRldi0+Y3R4bGlzdCkpIHsKIAkJRFJNX0RFQlVHKCJMYXN0IENvbnRleHRcbiIpOwogCQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOwogCQl2aWFfY2xlYW51cF9mdXRleChkZXZfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWcKaW5kZXggYjcxYmNkMC4uNjc3MjBmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvS2NvbmZpZwpAQCAtMSwxMSArMSwxNCBAQAogY29uZmlnIERSTV9WTVdHRlgKIAl0cmlzdGF0ZSAiRFJNIGRyaXZlciBmb3IgVk13YXJlIFZpcnR1YWwgR1BVIgotCWRlcGVuZHMgb24gRFJNICYmIFBDSSAmJiBGQgorCWRlcGVuZHMgb24gRFJNICYmIFBDSQogCXNlbGVjdCBGQl9ERUZFUlJFRF9JTwogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAlzZWxlY3QgRFJNX1RUTQorCSMgT25seSBuZWVkZWQgZm9yIHRoZSB0cmFuc2l0aW9uYWwgdXNlIG9mIGRybV9jcnRjX2luaXQgLSBjYW4gYmUgcmVtb3ZlZAorCSMgYWdhaW4gb25jZSB2bXdnZnggc2V0cyB1cCB0aGUgcHJpbWFyeSBwbGFuZSBpdHNlbGYuCisJc2VsZWN0IERSTV9LTVNfSEVMUEVSCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHJ1biAzRCBhY2NlbGVyYXRpb24KIAkgIGluIGEgVk13YXJlIHZpcnR1YWwgbWFjaGluZS4KQEAgLTE0LDcgKzE3LDcgQEAKIAkgIFRoZSBjb21waWxlZCBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgInZtd2dmeC5rbyIuCiAKIGNvbmZpZyBEUk1fVk1XR0ZYX0ZCQ09OCi0JZGVwZW5kcyBvbiBEUk1fVk1XR0ZYCisJZGVwZW5kcyBvbiBEUk1fVk1XR0ZYICYmIEZCCiAJYm9vbCAiRW5hYmxlIGZyYW1lYnVmZmVyIGNvbnNvbGUgdW5kZXIgdm13Z2Z4IGJ5IGRlZmF1bHQiCiAJaGVscAogCSAgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIHNoaXBwaW5nIGEgbmV3IHZtd2dmeApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwppbmRleCA0YTIyM2JiLi4yNDZhNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwpAQCAtODA2LDcgKzgwNiw3IEBACiAJfQogCiAJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9JUlFNQVNLKSB7Ci0JCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOworCQlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2LCBkZXYtPnBkZXYtPmlycSk7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgaW5zdGFsbGluZyBpcnE6ICVkXG4iLCByZXQpOwogCQkJZ290byBvdXRfbm9faXJxOwpAQCAtMTQxNyw3ICsxNDE3LDcgQEAKIAkuZW5hYmxlX3ZibGFuayA9IHZtd19lbmFibGVfdmJsYW5rLAogCS5kaXNhYmxlX3ZibGFuayA9IHZtd19kaXNhYmxlX3ZibGFuaywKIAkuaW9jdGxzID0gdm13X2lvY3RscywKLQkubnVtX2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKHZtd19pb2N0bHMpLAorCS5udW1faW9jdGxzID0gQVJSQVlfU0laRSh2bXdfaW9jdGxzKSwKIAkubWFzdGVyX2NyZWF0ZSA9IHZtd19tYXN0ZXJfY3JlYXRlLAogCS5tYXN0ZXJfZGVzdHJveSA9IHZtd19tYXN0ZXJfZGVzdHJveSwKIAkubWFzdGVyX3NldCA9IHZtd19tYXN0ZXJfc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwppbmRleCBhMmRkZTVhLi44ZjNlZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJICogY2FuIGRvIHRoaXMgc2luY2UgdGhlIGNhbGxlciBpbiB0aGUgZHJtIGNvcmUgZG9lc24ndCBjaGVjayBhbnl0aGluZwogCSAqIHdoaWNoIGlzIHByb3RlY3RlZCBieSBhbnkgbG9va3MuCiAJICovCi0JbXV0ZXhfdW5sb2NrKCZjcnRjLT5tdXRleCk7CisJZHJtX21vZGVzZXRfdW5sb2NrKCZjcnRjLT5tdXRleCk7CiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2X3ByaXYtPmRldik7CiAKIAkvKiBBIGxvdCBvZiB0aGUgY29kZSBhc3N1bWVzIHRoaXMgKi8KQEAgLTI1Miw3ICsyNTIsNyBAQAogCXJldCA9IDA7CiBvdXQ6CiAJZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXZfcHJpdi0+ZGV2KTsKLQltdXRleF9sb2NrKCZjcnRjLT5tdXRleCk7CisJZHJtX21vZGVzZXRfbG9jaygmY3J0Yy0+bXV0ZXgsIE5VTEwpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3Myw3ICsyNzMsNyBAQAogCSAqIGNhbiBkbyB0aGlzIHNpbmNlIHRoZSBjYWxsZXIgaW4gdGhlIGRybSBjb3JlIGRvZXNuJ3QgY2hlY2sgYW55dGhpbmcKIAkgKiB3aGljaCBpcyBwcm90ZWN0ZWQgYnkgYW55IGxvb2tzLgogCSAqLwotCW11dGV4X3VubG9jaygmY3J0Yy0+bXV0ZXgpOworCWRybV9tb2Rlc2V0X3VubG9jaygmY3J0Yy0+bXV0ZXgpOwogCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldl9wcml2LT5kZXYpOwogCiAJdm13X2N1cnNvcl91cGRhdGVfcG9zaXRpb24oZGV2X3ByaXYsIHNob3duLApAQCAtMjgxLDcgKzI4MSw3IEBACiAJCQkJICAgZHUtPmN1cnNvcl95ICsgZHUtPmhvdHNwb3RfeSk7CiAKIAlkcm1fbW9kZXNldF91bmxvY2tfYWxsKGRldl9wcml2LT5kZXYpOwotCW11dGV4X2xvY2soJmNydGMtPm11dGV4KTsKKwlkcm1fbW9kZXNldF9sb2NrKCZjcnRjLT5tdXRleCwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMDEsNyArMjAwMSw3IEBACiAJaWYgKGR1LT5wcmVmX21vZGUpCiAJCWxpc3RfbW92ZSgmZHUtPnByZWZfbW9kZS0+aGVhZCwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzKTsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9saXN0X3VwZGF0ZShjb25uZWN0b3IpOworCWRybV9tb2RlX2Nvbm5lY3Rvcl9saXN0X3VwZGF0ZShjb25uZWN0b3IsIHRydWUpOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9ob3N0MXgvYnVzLmMgYi9kcml2ZXJzL2dwdS9ob3N0MXgvYnVzLmMKaW5kZXggY2NkZDJlNi4uYWFmNTQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L2J1cy5jCisrKyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9idXMuYwpAQCAtMjE2LDggKzIxNiw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGhvc3QxeF9kZXZpY2VfZXhpdCk7CiAKLXN0YXRpYyBpbnQgaG9zdDF4X3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgaG9zdDF4ICpob3N0MXgsCi0JCQkJICBzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBob3N0MXhfYWRkX2NsaWVudChzdHJ1Y3QgaG9zdDF4ICpob3N0MXgsCisJCQkgICAgIHN0cnVjdCBob3N0MXhfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGhvc3QxeF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgaG9zdDF4X3N1YmRldiAqc3ViZGV2OwpAQCAtMjM4LDggKzIzOCw4IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQgaG9zdDF4X3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBob3N0MXggKmhvc3QxeCwKLQkJCQkgICAgc3RydWN0IGhvc3QxeF9jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgaG9zdDF4X2RlbF9jbGllbnQoc3RydWN0IGhvc3QxeCAqaG9zdDF4LAorCQkJICAgICBzdHJ1Y3QgaG9zdDF4X2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBob3N0MXhfZGV2aWNlICpkZXZpY2UsICpkdDsKIAlzdHJ1Y3QgaG9zdDF4X3N1YmRldiAqc3ViZGV2OwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJbXV0ZXhfbG9jaygmZGV2aWNlc19sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdDF4LCAmZGV2aWNlcywgbGlzdCkgewotCQllcnIgPSBob3N0MXhfcmVnaXN0ZXJfY2xpZW50KGhvc3QxeCwgY2xpZW50KTsKKwkJZXJyID0gaG9zdDF4X2FkZF9jbGllbnQoaG9zdDF4LCBjbGllbnQpOwogCQlpZiAoIWVycikgewogCQkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX2xvY2spOwogCQkJcmV0dXJuIDA7CkBAIC01MjksNyArNTI5LDcgQEAKIAltdXRleF9sb2NrKCZkZXZpY2VzX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShob3N0MXgsICZkZXZpY2VzLCBsaXN0KSB7Ci0JCWVyciA9IGhvc3QxeF91bnJlZ2lzdGVyX2NsaWVudChob3N0MXgsIGNsaWVudCk7CisJCWVyciA9IGhvc3QxeF9kZWxfY2xpZW50KGhvc3QxeCwgY2xpZW50KTsKIAkJaWYgKCFlcnIpIHsKIAkJCW11dGV4X3VubG9jaygmZGV2aWNlc19sb2NrKTsKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaXB1LXYzL0tjb25maWcgYi9kcml2ZXJzL2dwdS9pcHUtdjMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjIyOGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL0tjb25maWcKQEAgLTAsMCArMSw3IEBACitjb25maWcgSU1YX0lQVVYzX0NPUkUKKwl0cmlzdGF0ZSAiSVBVdjMgY29yZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0lNWDUgfHwgU09DX0lNWDZRIHx8IFNPQ19JTVg2U0wgfHwgQVJDSF9NVUxUSVBMQVRGT1JNCisJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgaWYgeW91IGhhdmUgYSBpLk1YNS82IHN5c3RlbSBhbmQgd2FudCB0byB1c2UgdGhlIEltYWdlCisJICBQcm9jZXNzaW5nIFVuaXQuIFRoaXMgb3B0aW9uIG9ubHkgZW5hYmxlcyBJUFUgYmFzZSBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaXB1LXYzL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvaXB1LXYzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODc5NzJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX0lNWF9JUFVWM19DT1JFKSArPSBpbXgtaXB1LXYzLm8KKworaW14LWlwdS12My1vYmpzIDo9IGlwdS1jb21tb24ubyBpcHUtZGMubyBpcHUtZGkubyBpcHUtZHAubyBpcHUtZG1mYy5vIGlwdS1zbWZjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtY29tbW9uLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWNvbW1vbi5jCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtY29tbW9uLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2lwdS12My9pcHUtY29tbW9uLmMKaW5kZXggYTFmN2IyMC4uMDRlN2IyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1jb21tb24uYworKysgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWNvbW1vbi5jCkBAIC0zMSw3ICszMSw3IEBACiAKICNpbmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgogCi0jaW5jbHVkZSAiaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KICNpbmNsdWRlICJpcHUtcHJ2LmgiCiAKIHN0YXRpYyBpbmxpbmUgdTMyIGlwdV9jbV9yZWFkKHN0cnVjdCBpcHVfc29jICppcHUsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTY2MSw2ICs2NjEsMzkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlwdV9tb2R1bGVfZGlzYWJsZSk7CiAKK2ludCBpcHVfY3NpX2VuYWJsZShzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY3NpKQoreworCXJldHVybiBpcHVfbW9kdWxlX2VuYWJsZShpcHUsIGNzaSA/IElQVV9DT05GX0NTSTFfRU4gOiBJUFVfQ09ORl9DU0kwX0VOKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwdV9jc2lfZW5hYmxlKTsKKworaW50IGlwdV9jc2lfZGlzYWJsZShzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY3NpKQoreworCXJldHVybiBpcHVfbW9kdWxlX2Rpc2FibGUoaXB1LCBjc2kgPyBJUFVfQ09ORl9DU0kxX0VOIDogSVBVX0NPTkZfQ1NJMF9FTik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfY3NpX2Rpc2FibGUpOworCitpbnQgaXB1X3NtZmNfZW5hYmxlKHN0cnVjdCBpcHVfc29jICppcHUpCit7CisJcmV0dXJuIGlwdV9tb2R1bGVfZW5hYmxlKGlwdSwgSVBVX0NPTkZfU01GQ19FTik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfc21mY19lbmFibGUpOworCitpbnQgaXB1X3NtZmNfZGlzYWJsZShzdHJ1Y3QgaXB1X3NvYyAqaXB1KQoreworCXJldHVybiBpcHVfbW9kdWxlX2Rpc2FibGUoaXB1LCBJUFVfQ09ORl9TTUZDX0VOKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwdV9zbWZjX2Rpc2FibGUpOworCitpbnQgaXB1X2lkbWFjX2dldF9jdXJyZW50X2J1ZmZlcihzdHJ1Y3QgaXB1djNfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgaXB1X3NvYyAqaXB1ID0gY2hhbm5lbC0+aXB1OworCXVuc2lnbmVkIGludCBjaG5vID0gY2hhbm5lbC0+bnVtOworCisJcmV0dXJuIChpcHVfY21fcmVhZChpcHUsIElQVV9DSEFfQ1VSX0JVRihjaG5vKSkgJiBpZG1hX21hc2soY2hubykpID8gMSA6IDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaWRtYWNfZ2V0X2N1cnJlbnRfYnVmZmVyKTsKKwogdm9pZCBpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaXB1djNfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIGJ1Zl9udW0pCiB7CiAJc3RydWN0IGlwdV9zb2MgKmlwdSA9IGNoYW5uZWwtPmlwdTsKQEAgLTg5Niw4ICs5MjksMTcgQEAKIAkJZ290byBlcnJfZHA7CiAJfQogCisJcmV0ID0gaXB1X3NtZmNfaW5pdChpcHUsIGRldiwgaXB1X2Jhc2UgKworCQkJZGV2dHlwZS0+Y21fb2ZzICsgSVBVX0NNX1NNRkNfUkVHX09GUyk7CisJaWYgKHJldCkgeworCQl1bml0ID0gInNtZmMiOworCQlnb3RvIGVycl9zbWZjOworCX0KKwogCXJldHVybiAwOwogCitlcnJfc21mYzoKKwlpcHVfZHBfZXhpdChpcHUpOwogZXJyX2RwOgogCWlwdV9kbWZjX2V4aXQoaXB1KTsKIGVycl9kbWZjOgpAQCAtOTc3LDYgKzEwMTksNyBAQAogCiBzdGF0aWMgdm9pZCBpcHVfc3VibW9kdWxlc19leGl0KHN0cnVjdCBpcHVfc29jICppcHUpCiB7CisJaXB1X3NtZmNfZXhpdChpcHUpOwogCWlwdV9kcF9leGl0KGlwdSk7CiAJaXB1X2RtZmNfZXhpdChpcHUpOwogCWlwdV9kY19leGl0KGlwdSk7CkBAIC0xMDAxLDYgKzEwNDQsNyBAQAogc3RydWN0IGlwdV9wbGF0Zm9ybV9yZWcgewogCXN0cnVjdCBpcHVfY2xpZW50X3BsYXRmb3JtZGF0YSBwZGF0YTsKIAljb25zdCBjaGFyICpuYW1lOworCWludCByZWdfb2Zmc2V0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpcHVfcGxhdGZvcm1fcmVnIGNsaWVudF9yZWdbXSA9IHsKQEAgLTEwMjIsMTMgKzEwNjYsMjkgQEAKIAkJCS5kbWFbMV0gPSAtRUlOVkFMLAogCQl9LAogCQkubmFtZSA9ICJpbXgtaXB1djMtY3J0YyIsCisJfSwgeworCQkucGRhdGEgPSB7CisJCQkuY3NpID0gMCwKKwkJCS5kbWFbMF0gPSBJUFVWM19DSEFOTkVMX0NTSTAsCisJCQkuZG1hWzFdID0gLUVJTlZBTCwKKwkJfSwKKwkJLnJlZ19vZmZzZXQgPSBJUFVfQ01fQ1NJMF9SRUdfT0ZTLAorCQkubmFtZSA9ICJpbXgtaXB1djMtY2FtZXJhIiwKKwl9LCB7CisJCS5wZGF0YSA9IHsKKwkJCS5jc2kgPSAxLAorCQkJLmRtYVswXSA9IElQVVYzX0NIQU5ORUxfQ1NJMSwKKwkJCS5kbWFbMV0gPSAtRUlOVkFMLAorCQl9LAorCQkucmVnX29mZnNldCA9IElQVV9DTV9DU0kxX1JFR19PRlMsCisJCS5uYW1lID0gImlteC1pcHV2My1jYW1lcmEiLAogCX0sCiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGlwdV9jbGllbnRfaWRfbXV0ZXgpOwogc3RhdGljIGludCBpcHVfY2xpZW50X2lkOwogCi1zdGF0aWMgaW50IGlwdV9hZGRfY2xpZW50X2RldmljZXMoc3RydWN0IGlwdV9zb2MgKmlwdSkKK3N0YXRpYyBpbnQgaXB1X2FkZF9jbGllbnRfZGV2aWNlcyhzdHJ1Y3QgaXB1X3NvYyAqaXB1LCB1bnNpZ25lZCBsb25nIGlwdV9iYXNlKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGlwdS0+ZGV2OwogCXVuc2lnbmVkIGk7CkBAIC0xMDQyLDkgKzExMDIsMTkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGllbnRfcmVnKTsgaSsrKSB7CiAJCWNvbnN0IHN0cnVjdCBpcHVfcGxhdGZvcm1fcmVnICpyZWcgPSAmY2xpZW50X3JlZ1tpXTsKIAkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwkJc3RydWN0IHJlc291cmNlIHJlczsKIAotCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCByZWctPm5hbWUsCi0JCQlpZCsrLCAmcmVnLT5wZGF0YSwgc2l6ZW9mKHJlZy0+cGRhdGEpKTsKKwkJaWYgKHJlZy0+cmVnX29mZnNldCkgeworCQkJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKwkJCXJlcy5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQkJcmVzLnN0YXJ0ID0gaXB1X2Jhc2UgKyBpcHUtPmRldnR5cGUtPmNtX29mcyArIHJlZy0+cmVnX29mZnNldDsKKwkJCXJlcy5lbmQgPSByZXMuc3RhcnQgKyBQQUdFX1NJWkUgLSAxOworCQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YShkZXYsIHJlZy0+bmFtZSwKKwkJCQlpZCsrLCAmcmVzLCAxLCAmcmVnLT5wZGF0YSwgc2l6ZW9mKHJlZy0+cGRhdGEpKTsKKwkJfSBlbHNlIHsKKwkJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIHJlZy0+bmFtZSwKKwkJCQlpZCsrLCAmcmVnLT5wZGF0YSwgc2l6ZW9mKHJlZy0+cGRhdGEpKTsKKwkJfQogCiAJCWlmIChJU19FUlIocGRldikpCiAJCQlnb3RvIGVycl9yZWdpc3RlcjsKQEAgLTEyNDEsNyArMTMxMSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWRfc3VibW9kdWxlc19pbml0OwogCi0JcmV0ID0gaXB1X2FkZF9jbGllbnRfZGV2aWNlcyhpcHUpOworCXJldCA9IGlwdV9hZGRfY2xpZW50X2RldmljZXMoaXB1LCBpcHVfYmFzZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhZGRpbmcgY2xpZW50IGRldmljZXMgZmFpbGVkIHdpdGggJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtZGMuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRjLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2lwdS12My9pcHUtZGMuYwppbmRleCA3ODRhNGExLi4yMzI2Yzc1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtZGMuYwpAQCAtMjEsOCArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlICIuLi9pbXgtZHJtLmgiCi0jaW5jbHVkZSAiaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KICNpbmNsdWRlICJpcHUtcHJ2LmgiCiAKICNkZWZpbmUgRENfTUFQX0NPTkZfUFRSKG4pCSgweDEwOCArICgobikgJiB+MHgxKSAqIDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRpLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWRpLmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jCnJlbmFtZSB0byBkcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWRpLmMKaW5kZXggODQ5YjNlMS4uYzQ5MGJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtZGkuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSAiaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KICNpbmNsdWRlICJpcHUtcHJ2LmgiCiAKIHN0cnVjdCBpcHVfZGkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWRtZmMuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRtZmMuYwpyZW5hbWUgdG8gZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1kbWZjLmMKaW5kZXggNTlmMTgyYi4uMDQyYzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1kbWZjLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlICJpbXgtaXB1LXYzLmgiCisjaW5jbHVkZSA8dmlkZW8vaW14LWlwdS12My5oPgogI2luY2x1ZGUgImlwdS1wcnYuaCIKIAogI2RlZmluZSBETUZDX1JEX0NIQU4JCTB4MDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kcC5jIGIvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1kcC5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZHAuYwpyZW5hbWUgdG8gZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1kcC5jCmluZGV4IGQ5MGY4MmEuLjk4Njg2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZHAuYworKysgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWRwLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0jaW5jbHVkZSAiaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KICNpbmNsdWRlICJpcHUtcHJ2LmgiCiAKICNkZWZpbmUgRFBfU1lOQyAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LXBydi5oIGIvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1wcnYuaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LXBydi5oCnJlbmFtZSB0byBkcml2ZXJzL2dwdS9pcHUtdjMvaXB1LXBydi5oCmluZGV4IGJmYzFiMzMuLmM5M2Y1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtcHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1wcnYuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSAiaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KIAogI2RlZmluZSBJUFVWM19DSEFOTkVMX0NTSTAJCQkgMAogI2RlZmluZSBJUFVWM19DSEFOTkVMX0NTSTEJCQkgMQpAQCAtMTUxLDYgKzE1MSw4IEBACiBzdHJ1Y3QgaXB1X2RjX3ByaXY7CiBzdHJ1Y3QgaXB1X2RtZmNfcHJpdjsKIHN0cnVjdCBpcHVfZGk7CitzdHJ1Y3QgaXB1X3NtZmNfcHJpdjsKKwogc3RydWN0IGlwdV9kZXZ0eXBlOwogCiBzdHJ1Y3QgaXB1X3NvYyB7CkBAIC0xNzgsNiArMTgwLDcgQEAKIAlzdHJ1Y3QgaXB1X2RwX3ByaXYJKmRwX3ByaXY7CiAJc3RydWN0IGlwdV9kbWZjX3ByaXYJKmRtZmNfcHJpdjsKIAlzdHJ1Y3QgaXB1X2RpCQkqZGlfcHJpdlsyXTsKKwlzdHJ1Y3QgaXB1X3NtZmNfcHJpdgkqc21mY19wcml2OwogfTsKIAogdm9pZCBpcHVfc3JtX2RwX3N5bmNfdXBkYXRlKHN0cnVjdCBpcHVfc29jICppcHUpOwpAQCAtMjA2LDQgKzIwOSw3IEBACiBpbnQgaXB1X2NwbWVtX2luaXQoc3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGJhc2UpOwogdm9pZCBpcHVfY3BtZW1fZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1KTsKIAoraW50IGlwdV9zbWZjX2luaXQoc3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGJhc2UpOwordm9pZCBpcHVfc21mY19leGl0KHN0cnVjdCBpcHVfc29jICppcHUpOworCiAjZW5kaWYJCQkJLyogX19JUFVfUFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1zbWZjLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LXNtZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY4NWFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1zbWZjLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDx2aWRlby9pbXgtaXB1LXYzLmg+CisKKyNpbmNsdWRlICJpcHUtcHJ2LmgiCisKK3N0cnVjdCBpcHVfc21mY19wcml2IHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLypTTUZDIFJlZ2lzdGVycyAqLworI2RlZmluZSBTTUZDX01BUAkweDAwMDAKKyNkZWZpbmUgU01GQ19XTUMJMHgwMDA0CisjZGVmaW5lIFNNRkNfQlMJCTB4MDAwOAorCitpbnQgaXB1X3NtZmNfc2V0X2J1cnN0c2l6ZShzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY2hhbm5lbCwgaW50IGJ1cnN0c2l6ZSkKK3sKKwlzdHJ1Y3QgaXB1X3NtZmNfcHJpdiAqc21mYyA9IGlwdS0+c21mY19wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbCwgc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc21mYy0+bG9jaywgZmxhZ3MpOworCisJc2hpZnQgPSBjaGFubmVsICogNDsKKwl2YWwgPSByZWFkbChzbWZjLT5iYXNlICsgU01GQ19CUyk7CisJdmFsICY9IH4oMHhmIDw8IHNoaWZ0KTsKKwl2YWwgfD0gYnVyc3RzaXplIDw8IHNoaWZ0OworCXdyaXRlbCh2YWwsIHNtZmMtPmJhc2UgKyBTTUZDX0JTKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtZmMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXB1X3NtZmNfc2V0X2J1cnN0c2l6ZSk7CisKK2ludCBpcHVfc21mY19tYXBfY2hhbm5lbChzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY2hhbm5lbCwgaW50IGNzaV9pZCwgaW50IG1pcGlfaWQpCit7CisJc3RydWN0IGlwdV9zbWZjX3ByaXYgKnNtZmMgPSBpcHUtPnNtZmNfcHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWwsIHNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNtZmMtPmxvY2ssIGZsYWdzKTsKKworCXNoaWZ0ID0gY2hhbm5lbCAqIDM7CisJdmFsID0gcmVhZGwoc21mYy0+YmFzZSArIFNNRkNfTUFQKTsKKwl2YWwgJj0gfigweDcgPDwgc2hpZnQpOworCXZhbCB8PSAoKGNzaV9pZCA8PCAyKSB8IG1pcGlfaWQpIDw8IHNoaWZ0OworCXdyaXRlbCh2YWwsIHNtZmMtPmJhc2UgKyBTTUZDX01BUCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWZjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwdV9zbWZjX21hcF9jaGFubmVsKTsKKworaW50IGlwdV9zbWZjX2luaXQoc3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0IGRldmljZSAqZGV2LAorCQkgIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlzdHJ1Y3QgaXB1X3NtZmNfcHJpdiAqc21mYzsKKworCXNtZmMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNtZmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtZmMpCisJCXJldHVybiAtRU5PTUVNOworCisJaXB1LT5zbWZjX3ByaXYgPSBzbWZjOworCXNwaW5fbG9ja19pbml0KCZzbWZjLT5sb2NrKTsKKworCXNtZmMtPmJhc2UgPSBkZXZtX2lvcmVtYXAoZGV2LCBiYXNlLCBQQUdFX1NJWkUpOworCWlmICghc21mYy0+YmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9kZWJ1ZygiJXM6IGlvcmVtYXAgMHglMDhseCAtPiAlcFxuIiwgX19mdW5jX18sIGJhc2UsIHNtZmMtPmJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXB1X3NtZmNfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvdmdhL3ZnYV9zd2l0Y2hlcm9vLmMgYi9kcml2ZXJzL2dwdS92Z2EvdmdhX3N3aXRjaGVyb28uYwppbmRleCBlYzBhZTJkLi42ODY2NDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS92Z2EvdmdhX3N3aXRjaGVyb28uYworKysgYi9kcml2ZXJzL2dwdS92Z2EvdmdhX3N3aXRjaGVyb28uYwpAQCAtNjIzLDcgKzYyMyw4IEBACiAJcmV0ID0gZGV2LT5idXMtPnBtLT5ydW50aW1lX3N1c3BlbmQoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCisJaWYgKHZnYXNyX3ByaXYuaGFuZGxlci0+c3dpdGNodG8pCisJCXZnYXNyX3ByaXYuaGFuZGxlci0+c3dpdGNodG8oVkdBX1NXSVRDSEVST09fSUdEKTsKIAl2Z2Ffc3dpdGNoZXJvb19wb3dlcl9zd2l0Y2gocGRldiwgVkdBX1NXSVRDSEVST09fT0ZGKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY2hhbm5lbF9tZ210LmMgYi9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCmluZGV4IDZjOGIwMzJjLi5lZDkzNTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCisrKyBiL2RyaXZlcnMvaHYvY2hhbm5lbF9tZ210LmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogICogcGVyZm9ybWFuY2UgY3JpdGljYWwgY2hhbm5lbHMgKElERSwgU0NTSSBhbmQgTmV0d29yaykgd2lsbCBiZSB1bmlmb3JtbHkKICAqIGRpc3RyaWJ1dGVkIGFjcm9zcyBhbGwgYXZhaWxhYmxlIENQVXMuCiAgKi8KLXN0YXRpYyB2b2lkIGluaXRfdnBfaW5kZXgoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsIHV1aWRfbGUgKnR5cGVfZ3VpZCkKK3N0YXRpYyB2b2lkIGluaXRfdnBfaW5kZXgoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHV1aWRfbGUgKnR5cGVfZ3VpZCkKIHsKIAl1MzIgY3VyX2NwdTsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmggYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCmluZGV4IDE4ZDFhODQuLjIyYjc1MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKKysrIGIvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaApAQCAtNjQ5LDkgKzY0OSw5IEBACiAKIC8qIEdlbmVyYWwgdm1idXMgaW50ZXJmYWNlICovCiAKLXN0cnVjdCBodl9kZXZpY2UgKnZtYnVzX2RldmljZV9jcmVhdGUodXVpZF9sZSAqdHlwZSwKLQkJCQkJIHV1aWRfbGUgKmluc3RhbmNlLAotCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOworc3RydWN0IGh2X2RldmljZSAqdm1idXNfZGV2aWNlX2NyZWF0ZShjb25zdCB1dWlkX2xlICp0eXBlLAorCQkJCSAgICAgIGNvbnN0IHV1aWRfbGUgKmluc3RhbmNlLAorCQkJCSAgICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKIAogaW50IHZtYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKTsKIHZvaWQgdm1idXNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwppbmRleCA4ZTUzYTNjLi40ZDZiMjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCisrKyBiL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1dWlkX2xlIG51bGxfZ3VpZDsKK3N0YXRpYyBjb25zdCB1dWlkX2xlIG51bGxfZ3VpZDsKIAogc3RhdGljIGlubGluZSBib29sIGlzX251bGxfZ3VpZChjb25zdCBfX3U4ICpndWlkKQogewpAQCAtNDUwLDcgKzQ1MCw3IEBACiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkICpodl92bWJ1c19nZXRfaWQoCiAJCQkJCWNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmlkLAotCQkJCQlfX3U4ICpndWlkKQorCQkJCQljb25zdCBfX3U4ICpndWlkKQogewogCWZvciAoOyAhaXNfbnVsbF9ndWlkKGlkLT5ndWlkKTsgaWQrKykKIAkJaWYgKCFtZW1jbXAoJmlkLT5ndWlkLCBndWlkLCBzaXplb2YodXVpZF9sZSkpKQpAQCAtNzc5LDkgKzc3OSw5IEBACiAgKiB2bWJ1c19kZXZpY2VfY3JlYXRlIC0gQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgbmV3IGNoaWxkIGRldmljZQogICogb24gdGhlIHZtYnVzLgogICovCi1zdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19kZXZpY2VfY3JlYXRlKHV1aWRfbGUgKnR5cGUsCi0JCQkJCSAgICB1dWlkX2xlICppbnN0YW5jZSwKLQkJCQkJICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQorc3RydWN0IGh2X2RldmljZSAqdm1idXNfZGV2aWNlX2NyZWF0ZShjb25zdCB1dWlkX2xlICp0eXBlLAorCQkJCSAgICAgIGNvbnN0IHV1aWRfbGUgKmluc3RhbmNlLAorCQkJCSAgICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmo7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKaW5kZXggOTZkNzEzMS4uNWUxNTNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKQEAgLTIzNCwxMiArMjM0LDE2IEBACiAKIHN0YXRpYyB2b2lkIHNldF9lbXNzKHN0cnVjdCBjNGl3X2VwICplcCwgdTE2IG9wdCkKIHsKLQllcC0+ZW1zcyA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1c1tHRVRfVENQT1BUX01TUyhvcHQpXSAtIDQwOworCWVwLT5lbXNzID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzW0dFVF9UQ1BPUFRfTVNTKG9wdCldIC0KKwkJICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAJZXAtPm1zcyA9IGVwLT5lbXNzOwogCWlmIChHRVRfVENQT1BUX1RTVEFNUChvcHQpKQogCQllcC0+ZW1zcyAtPSAxMjsKIAlpZiAoZXAtPmVtc3MgPCAxMjgpCiAJCWVwLT5lbXNzID0gMTI4OworCWlmIChlcC0+ZW1zcyAmIDcpCisJCVBEQkcoIldhcm5pbmc6IG1pc2FsaWduZWQgbXR1IGlkeCAldSBtc3MgJXUgZW1zcz0ldVxuIiwKKwkJICAgICBHRVRfVENQT1BUX01TUyhvcHQpLCBlcC0+bXNzLCBlcC0+ZW1zcyk7CiAJUERCRygiJXMgbXNzX2lkeCAldSBtc3MgJXUgZW1zcz0ldVxuIiwgX19mdW5jX18sIEdFVF9UQ1BPUFRfTVNTKG9wdCksCiAJICAgICBlcC0+bXNzLCBlcC0+ZW1zcyk7CiB9CkBAIC00NzMsNyArNDc3LDcgQEAKIAlmbG93Yy0+bW5lbXZhbFs1XS5tbmVtb25pYyA9IEZXX0ZMT1dDX01ORU1fUkNWTlhUOwogCWZsb3djLT5tbmVtdmFsWzVdLnZhbCA9IGNwdV90b19iZTMyKGVwLT5yY3Zfc2VxKTsKIAlmbG93Yy0+bW5lbXZhbFs2XS5tbmVtb25pYyA9IEZXX0ZMT1dDX01ORU1fU05EQlVGOwotCWZsb3djLT5tbmVtdmFsWzZdLnZhbCA9IGNwdV90b19iZTMyKHNuZF93aW4pOworCWZsb3djLT5tbmVtdmFsWzZdLnZhbCA9IGNwdV90b19iZTMyKGVwLT5zbmRfd2luKTsKIAlmbG93Yy0+bW5lbXZhbFs3XS5tbmVtb25pYyA9IEZXX0ZMT1dDX01ORU1fTVNTOwogCWZsb3djLT5tbmVtdmFsWzddLnZhbCA9IGNwdV90b19iZTMyKGVwLT5lbXNzKTsKIAkvKiBQYWQgV1IgdG8gMTYgYnl0ZSBib3VuZGFyeSAqLwpAQCAtNTY1LDYgKzU2OSwxNyBAQAogCQlzaXplb2YoZXAtPmNvbS5tYXBwZWRfcmVtb3RlX2FkZHIpKTsKIH0KIAorc3RhdGljIHZvaWQgYmVzdF9tdHUoY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXMsIHVuc2lnbmVkIHNob3J0IG10dSwKKwkJICAgICB1bnNpZ25lZCBpbnQgKmlkeCwgaW50IHVzZV90cykKK3sKKwl1bnNpZ25lZCBzaG9ydCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArCisJCQkJICAodXNlX3RzID8gMTIgOiAwKTsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3NpemUgPSBtdHUgLSBoZHJfc2l6ZTsKKworCWN4Z2I0X2Jlc3RfYWxpZ25lZF9tdHUobXR1cywgaGRyX3NpemUsIGRhdGFfc2l6ZSwgOCwgaWR4KTsKK30KKwogc3RhdGljIGludCBzZW5kX2Nvbm5lY3Qoc3RydWN0IGM0aXdfZXAgKmVwKQogewogCXN0cnVjdCBjcGxfYWN0X29wZW5fcmVxICpyZXE7CkBAIC01OTEsNiArNjA2LDcgQEAKIAkJCQkgICAmZXAtPmNvbS5tYXBwZWRfbG9jYWxfYWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpyYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQogCQkJCSAgICZlcC0+Y29tLm1hcHBlZF9yZW1vdGVfYWRkcjsKKwlpbnQgd2luOwogCiAJd3JsZW4gPSAoZXAtPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVCkgPwogCQkJcm91bmR1cChzaXpldjQsIDE2KSA6CkBAIC02MDYsOCArNjIyLDE4IEBACiAJfQogCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfU0VUVVAsIGVwLT5jdHJscV9pZHgpOwogCi0JY3hnYjRfYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCk7CisJYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKKwkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcyk7CiAJd3NjYWxlID0gY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CisKKwkvKgorCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCisJICogcmVtYWluZGVyIHdpbGwgYmUgc3BlY2lmaWVkIGluIHRoZSByeF9kYXRhX2Fjay4KKwkgKi8KKwl3aW4gPSBlcC0+cmN2X3dpbiA+PiAxMDsKKwlpZiAod2luID4gUkNWX0JVRlNJWl9NQVNLKQorCQl3aW4gPSBSQ1ZfQlVGU0laX01BU0s7CisKIAlvcHQwID0gKG5vY29uZyA/IE5PX0NPTkcoMSkgOiAwKSB8CiAJICAgICAgIEtFRVBfQUxJVkUoMSkgfAogCSAgICAgICBERUxBQ0soMSkgfApAQCAtNjE4LDcgKzY0NCw3IEBACiAJICAgICAgIFNNQUNfU0VMKGVwLT5zbWFjX2lkeCkgfAogCSAgICAgICBEU0NQKGVwLT50b3MpIHwKIAkgICAgICAgVUxQX01PREUoVUxQX01PREVfVENQRERQKSB8Ci0JICAgICAgIFJDVl9CVUZTSVoocmN2X3dpbj4+MTApOworCSAgICAgICBSQ1ZfQlVGU0laKHdpbik7CiAJb3B0MiA9IFJYX0NIQU5ORUwoMCkgfAogCSAgICAgICBDQ1RSTF9FQ04oZW5hYmxlX2VjbikgfAogCSAgICAgICBSU1NfUVVFVUVfVkFMSUQgfCBSU1NfUVVFVUUoZXAtPnJzc19xaWQpOwpAQCAtNjc0LDYgKzcwMCwxMyBAQAogCQkJcmVxNi0+b3B0MiA9IGNwdV90b19iZTMyKG9wdDIpOwogCQl9CiAJfSBlbHNlIHsKKwkJdTMyIGlzbiA9IChwcmFuZG9tX3UzMigpICYgfjdVTCkgLSAxOworCisJCW9wdDIgfD0gVDVfT1BUXzJfVkFMSUQ7CisJCW9wdDIgfD0gQ09OR19DTlRSTF9WQUxJRDsgLyogT1BUXzJfSVNTIGZvciBUNSAqLworCQlpZiAocGVlcjJwZWVyKQorCQkJaXNuICs9IDQ7CisKIAkJaWYgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpIHsKIAkJCXQ1X3JlcSA9IChzdHJ1Y3QgY3BsX3Q1X2FjdF9vcGVuX3JlcSAqKQogCQkJCSBza2JfcHV0KHNrYiwgd3JsZW4pOwpAQCAtNjkwLDYgKzcyMyw5IEBACiAJCQkJCQkgICAgIGN4Z2I0X3NlbGVjdF9udHVwbGUoCiAJCQkJCSAgICAgZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5wb3J0c1swXSwKIAkJCQkJICAgICBlcC0+bDJ0KSkpOworCQkJdDVfcmVxLT5yc3ZkID0gY3B1X3RvX2JlMzIoaXNuKTsKKwkJCVBEQkcoIiVzIHNuZF9pc24gJXVcbiIsIF9fZnVuY19fLAorCQkJICAgICBiZTMyX3RvX2NwdSh0NV9yZXEtPnJzdmQpKTsKIAkJCXQ1X3JlcS0+b3B0MiA9IGNwdV90b19iZTMyKG9wdDIpOwogCQl9IGVsc2UgewogCQkJdDVfcmVxNiA9IChzdHJ1Y3QgY3BsX3Q1X2FjdF9vcGVuX3JlcTYgKikKQEAgLTcxMyw2ICs3NDksOSBAQAogCQkJCQkJCWN4Z2I0X3NlbGVjdF9udHVwbGUoCiAJCQkJCQllcC0+Y29tLmRldi0+cmRldi5sbGRpLnBvcnRzWzBdLAogCQkJCQkJZXAtPmwydCkpOworCQkJdDVfcmVxNi0+cnN2ZCA9IGNwdV90b19iZTMyKGlzbik7CisJCQlQREJHKCIlcyBzbmRfaXNuICV1XG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgYmUzMl90b19jcHUodDVfcmVxNi0+cnN2ZCkpOwogCQkJdDVfcmVxNi0+b3B0MiA9IGNwdV90b19iZTMyKG9wdDIpOwogCQl9CiAJfQpAQCAtMTE4Niw2ICsxMjI1LDE0IEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qCisJICogSWYgd2UgY291bGRuJ3Qgc3BlY2lmeSB0aGUgZW50aXJlIHJjdiB3aW5kb3cgYXQgY29ubmVjdGlvbiBzZXR1cAorCSAqIGR1ZSB0byB0aGUgbGltaXQgaW4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBSQ1ZfQlVGU0laIGZpZWxkLAorCSAqIHRoZW4gYWRkIHRoZSBvdmVyYWdlIGluIHRvIHRoZSBjcmVkaXRzIHJldHVybmVkLgorCSAqLworCWlmIChlcC0+cmN2X3dpbiA+IFJDVl9CVUZTSVpfTUFTSyAqIDEwMjQpCisJCWNyZWRpdHMgKz0gZXAtPnJjdl93aW4gLSBSQ1ZfQlVGU0laX01BU0sgKiAxMDI0OworCiAJcmVxID0gKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKikgc2tiX3B1dChza2IsIHdybGVuKTsKIAltZW1zZXQocmVxLCAwLCB3cmxlbik7CiAJSU5JVF9UUF9XUihyZXEsIGVwLT5od3RpZCk7CkBAIC0xNjU5LDYgKzE3MDYsNyBAQAogCXVuc2lnbmVkIGludCBtdHVfaWR4OwogCWludCB3c2NhbGU7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisJaW50IHdpbjsKIAogCXNrYiA9IGdldF9za2IoTlVMTCwgc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKIAlyZXEgPSAoc3RydWN0IGZ3X29mbGRfY29ubmVjdGlvbl93ciAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CkBAIC0xNjgxLDggKzE3MjksMTggQEAKIAkJCWh0b25zKEZfRldfT0ZMRF9DT05ORUNUSU9OX1dSX0NQTFJYREFUQUFDSyk7CiAJcmVxLT50Y2IudHhfbWF4ID0gKF9fZm9yY2UgX19iZTMyKSBqaWZmaWVzOwogCXJlcS0+dGNiLnJjdl9hZHYgPSBodG9ucygxKTsKLQljeGdiNF9iZXN0X210dShlcC0+Y29tLmRldi0+cmRldi5sbGRpLm10dXMsIGVwLT5tdHUsICZtdHVfaWR4KTsKKwliZXN0X210dShlcC0+Y29tLmRldi0+cmRldi5sbGRpLm10dXMsIGVwLT5tdHUsICZtdHVfaWR4LAorCQkgZW5hYmxlX3RjcF90aW1lc3RhbXBzKTsKIAl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKworCS8qCisJICogU3BlY2lmeSB0aGUgbGFyZ2VzdCB3aW5kb3cgdGhhdCB3aWxsIGZpdCBpbiBvcHQwLiBUaGUKKwkgKiByZW1haW5kZXIgd2lsbCBiZSBzcGVjaWZpZWQgaW4gdGhlIHJ4X2RhdGFfYWNrLgorCSAqLworCXdpbiA9IGVwLT5yY3Zfd2luID4+IDEwOworCWlmICh3aW4gPiBSQ1ZfQlVGU0laX01BU0spCisJCXdpbiA9IFJDVl9CVUZTSVpfTUFTSzsKKwogCXJlcS0+dGNiLm9wdDAgPSAoX19mb3JjZSBfX2JlNjQpIChUQ0FNX0JZUEFTUygxKSB8CiAJCShub2NvbmcgPyBOT19DT05HKDEpIDogMCkgfAogCQlLRUVQX0FMSVZFKDEpIHwKQEAgLTE2OTQsNyArMTc1Miw3IEBACiAJCVNNQUNfU0VMKGVwLT5zbWFjX2lkeCkgfAogCQlEU0NQKGVwLT50b3MpIHwKIAkJVUxQX01PREUoVUxQX01PREVfVENQRERQKSB8Ci0JCVJDVl9CVUZTSVoocmN2X3dpbiA+PiAxMCkpOworCQlSQ1ZfQlVGU0laKHdpbikpOwogCXJlcS0+dGNiLm9wdDIgPSAoX19mb3JjZSBfX2JlMzIpIChQQUNFKDEpIHwKIAkJVFhfUVVFVUUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS50eF9tb2RxW2VwLT50eF9jaGFuXSkgfAogCQlSWF9DSEFOTkVMKDApIHwKQEAgLTE3MzEsNiArMTc4OSwxMyBAQAogCSAgICAgICBzdGF0dXMgPT0gQ1BMX0VSUl9LRUVQQUxWX05FR19BRFZJQ0U7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF90Y3Bfd2luZG93KHN0cnVjdCBjNGl3X2VwICplcCwgc3RydWN0IHBvcnRfaW5mbyAqcGkpCit7CisJZXAtPnNuZF93aW4gPSBzbmRfd2luOworCWVwLT5yY3Zfd2luID0gcmN2X3dpbjsKKwlQREJHKCIlcyBzbmRfd2luICVkIHJjdl93aW4gJWRcbiIsIF9fZnVuY19fLCBlcC0+c25kX3dpbiwgZXAtPnJjdl93aW4pOworfQorCiAjZGVmaW5lIEFDVF9PUEVOX1JFVFJZX0NPVU5UIDIKIAogc3RhdGljIGludCBpbXBvcnRfZXAoc3RydWN0IGM0aXdfZXAgKmVwLCBpbnQgaXB0eXBlLCBfX3U4ICpwZWVyX2lwLApAQCAtMTc3OSw2ICsxODQ0LDcgQEAKIAkJZXAtPmN0cmxxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KHBkZXYpOwogCQllcC0+cnNzX3FpZCA9IGNkZXYtPnJkZXYubGxkaS5yeHFfaWRzWwogCQkJY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwXTsKKwkJc2V0X3RjcF93aW5kb3coZXAsIChzdHJ1Y3QgcG9ydF9pbmZvICopbmV0ZGV2X3ByaXYocGRldikpOwogCQlkZXZfcHV0KHBkZXYpOwogCX0gZWxzZSB7CiAJCXBkZXYgPSBnZXRfcmVhbF9kZXYobi0+ZGV2KTsKQEAgLTE3OTcsNiArMTg2Myw3IEBACiAJCQljZGV2LT5yZGV2LmxsZGkubmNoYW47CiAJCWVwLT5yc3NfcWlkID0gY2Rldi0+cmRldi5sbGRpLnJ4cV9pZHNbCiAJCQljeGdiNF9wb3J0X2lkeChwZGV2KSAqIHN0ZXBdOworCQlzZXRfdGNwX3dpbmRvdyhlcCwgKHN0cnVjdCBwb3J0X2luZm8gKiluZXRkZXZfcHJpdihwZGV2KSk7CiAKIAkJaWYgKGNsZWFyX21wYV92MSkgewogCQkJZXAtPnJldHJ5X3dpdGhfbXBhX3YxID0gMDsKQEAgLTIwMjcsMTMgKzIwOTQsMzYgQEAKIAl1NjQgb3B0MDsKIAl1MzIgb3B0MjsKIAlpbnQgd3NjYWxlOworCXN0cnVjdCBjcGxfdDVfcGFzc19hY2NlcHRfcnBsICpycGw1ID0gTlVMTDsKKwlpbnQgd2luOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCk7CiAJQlVHX09OKHNrYl9jbG9uZWQoc2tiKSk7Ci0Jc2tiX3RyaW0oc2tiLCBzaXplb2YoKnJwbCkpOworCiAJc2tiX2dldChza2IpOwotCWN4Z2I0X2Jlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgpOworCXJwbCA9IGNwbGhkcihza2IpOworCWlmIChpc190NShlcC0+Y29tLmRldi0+cmRldi5sbGRpLmFkYXB0ZXJfdHlwZSkpIHsKKwkJc2tiX3RyaW0oc2tiLCByb3VuZHVwKHNpemVvZigqcnBsNSksIDE2KSk7CisJCXJwbDUgPSAodm9pZCAqKXJwbDsKKwkJSU5JVF9UUF9XUihycGw1LCBlcC0+aHd0aWQpOworCX0gZWxzZSB7CisJCXNrYl90cmltKHNrYiwgc2l6ZW9mKCpycGwpKTsKKwkJSU5JVF9UUF9XUihycGwsIGVwLT5od3RpZCk7CisJfQorCU9QQ09ERV9USUQocnBsKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1BBU1NfQUNDRVBUX1JQTCwKKwkJCQkJCSAgICBlcC0+aHd0aWQpKTsKKworCWJlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCisJCSBlbmFibGVfdGNwX3RpbWVzdGFtcHMgJiYgcmVxLT50Y3BvcHQudHN0YW1wKTsKIAl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKworCS8qCisJICogU3BlY2lmeSB0aGUgbGFyZ2VzdCB3aW5kb3cgdGhhdCB3aWxsIGZpdCBpbiBvcHQwLiBUaGUKKwkgKiByZW1haW5kZXIgd2lsbCBiZSBzcGVjaWZpZWQgaW4gdGhlIHJ4X2RhdGFfYWNrLgorCSAqLworCXdpbiA9IGVwLT5yY3Zfd2luID4+IDEwOworCWlmICh3aW4gPiBSQ1ZfQlVGU0laX01BU0spCisJCXdpbiA9IFJDVl9CVUZTSVpfTUFTSzsKIAlvcHQwID0gKG5vY29uZyA/IE5PX0NPTkcoMSkgOiAwKSB8CiAJICAgICAgIEtFRVBfQUxJVkUoMSkgfAogCSAgICAgICBERUxBQ0soMSkgfApAQCAtMjA0NCw3ICsyMTM0LDcgQEAKIAkgICAgICAgU01BQ19TRUwoZXAtPnNtYWNfaWR4KSB8CiAJICAgICAgIERTQ1AoZXAtPnRvcyA+PiAyKSB8CiAJICAgICAgIFVMUF9NT0RFKFVMUF9NT0RFX1RDUEREUCkgfAotCSAgICAgICBSQ1ZfQlVGU0laKHJjdl93aW4+PjEwKTsKKwkgICAgICAgUkNWX0JVRlNJWih3aW4pOwogCW9wdDIgPSBSWF9DSEFOTkVMKDApIHwKIAkgICAgICAgUlNTX1FVRVVFX1ZBTElEIHwgUlNTX1FVRVVFKGVwLT5yc3NfcWlkKTsKIApAQCAtMjA2NCwxNCArMjE1NCwxOCBAQAogCQkJb3B0MiB8PSBDQ1RSTF9FQ04oMSk7CiAJfQogCWlmIChpc190NShlcC0+Y29tLmRldi0+cmRldi5sbGRpLmFkYXB0ZXJfdHlwZSkpIHsKKwkJdTMyIGlzbiA9IChwcmFuZG9tX3UzMigpICYgfjdVTCkgLSAxOwogCQlvcHQyIHw9IFQ1X09QVF8yX1ZBTElEOwogCQlvcHQyIHw9IFZfQ09OR19DTlRSTChDT05HX0FMR19UQUhPRSk7CisJCW9wdDIgfD0gQ09OR19DTlRSTF9WQUxJRDsgLyogT1BUXzJfSVNTIGZvciBUNSAqLworCQlycGw1ID0gKHZvaWQgKilycGw7CisJCW1lbXNldCgmcnBsNS0+aXNzLCAwLCByb3VuZHVwKHNpemVvZigqcnBsNSktc2l6ZW9mKCpycGwpLCAxNikpOworCQlpZiAocGVlcjJwZWVyKQorCQkJaXNuICs9IDQ7CisJCXJwbDUtPmlzcyA9IGNwdV90b19iZTMyKGlzbik7CisJCVBEQkcoIiVzIGlzcyAldVxuIiwgX19mdW5jX18sIGJlMzJfdG9fY3B1KHJwbDUtPmlzcykpOwogCX0KIAotCXJwbCA9IGNwbGhkcihza2IpOwotCUlOSVRfVFBfV1IocnBsLCBlcC0+aHd0aWQpOwotCU9QQ09ERV9USUQocnBsKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1BBU1NfQUNDRVBUX1JQTCwKLQkJCQkgICAgICBlcC0+aHd0aWQpKTsKIAlycGwtPm9wdDAgPSBjcHVfdG9fYmU2NChvcHQwKTsKIAlycGwtPm9wdDIgPSBjcHVfdG9fYmUzMihvcHQyKTsKIAlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCBlcC0+Y3RybHFfaWR4KTsKQEAgLTIxMzYsNiArMjIzMCw3IEBACiAJaW50IGVycjsKIAl1MTYgcGVlcl9tc3MgPSBudG9ocyhyZXEtPnRjcG9wdC5tc3MpOwogCWludCBpcHR5cGU7CisJdW5zaWduZWQgc2hvcnQgaGRyczsKIAogCXBhcmVudF9lcCA9IGxvb2t1cF9zdGlkKHQsIHN0aWQpOwogCWlmICghcGFyZW50X2VwKSB7CkBAIC0yMTkzLDggKzIyODgsMTAgQEAKIAkJZ290byByZWplY3Q7CiAJfQogCi0JaWYgKHBlZXJfbXNzICYmIGNoaWxkX2VwLT5tdHUgPiAocGVlcl9tc3MgKyA0MCkpCi0JCWNoaWxkX2VwLT5tdHUgPSBwZWVyX21zcyArIDQwOworCWhkcnMgPSBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArCisJICAgICAgICgoZW5hYmxlX3RjcF90aW1lc3RhbXBzICYmIHJlcS0+dGNwb3B0LnRzdGFtcCkgPyAxMiA6IDApOworCWlmIChwZWVyX21zcyAmJiBjaGlsZF9lcC0+bXR1ID4gKHBlZXJfbXNzICsgaGRycykpCisJCWNoaWxkX2VwLT5tdHUgPSBwZWVyX21zcyArIGhkcnM7CiAKIAlzdGF0ZV9zZXQoJmNoaWxkX2VwLT5jb20sIENPTk5FQ1RJTkcpOwogCWNoaWxkX2VwLT5jb20uZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwppbmRleCA3MTUxYTAyLi5jMDQyOTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwpAQCAtMTM0LDcgKzEzNCw4IEBACiAJCQlWX0ZXX1JJX1JFU19XUl9JUUFOVVMoMCkgfAogCQkJVl9GV19SSV9SRVNfV1JfSVFBTlVEKDEpIHwKIAkJCUZfRldfUklfUkVTX1dSX0lRQU5EU1QgfAotCQkJVl9GV19SSV9SRVNfV1JfSVFBTkRTVElOREVYKCpyZGV2LT5sbGRpLnJ4cV9pZHMpKTsKKwkJCVZfRldfUklfUkVTX1dSX0lRQU5EU1RJTkRFWCgKKwkJCQlyZGV2LT5sbGRpLmNpcV9pZHNbY3EtPnZlY3Rvcl0pKTsKIAlyZXMtPnUuY3EuaXFkcm9wcnNzX3RvX2lxZXNpemUgPSBjcHVfdG9fYmUxNigKIAkJCUZfRldfUklfUkVTX1dSX0lRRFJPUFJTUyB8CiAJCQlWX0ZXX1JJX1JFU19XUl9JUVBDSUVDSCgyKSB8CkBAIC04NzAsNiArODcxLDkgQEAKIAogCXJocCA9IHRvX2M0aXdfZGV2KGliZGV2KTsKIAorCWlmICh2ZWN0b3IgPj0gcmhwLT5yZGV2LmxsZGkubmNpcSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKIAljaHAgPSBremFsbG9jKHNpemVvZigqY2hwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaHApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpAQCAtOTE1LDYgKzkxOSw3IEBACiAJfQogCWNocC0+Y3Euc2l6ZSA9IGh3ZW50cmllczsKIAljaHAtPmNxLm1lbXNpemUgPSBtZW1zaXplOworCWNocC0+Y3EudmVjdG9yID0gdmVjdG9yOwogCiAJcmV0ID0gY3JlYXRlX2NxKCZyaHAtPnJkZXYsICZjaHAtPmNxLAogCQkJdWNvbnRleHQgPyAmdWNvbnRleHQtPnVjdHggOiAmcmhwLT5yZGV2LnVjdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAppbmRleCA2ZjUzM2ZiLi4xMjViYzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaApAQCAtODEwLDYgKzgxMCw4IEBACiAJdTggcmV0cnlfd2l0aF9tcGFfdjE7CiAJdTggdHJpZWRfd2l0aF9tcGFfdjE7CiAJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50OworCWludCBzbmRfd2luOworCWludCByY3Zfd2luOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIHByaW50X2FkZHIoc3RydWN0IGM0aXdfZXBfY29tbW9uICplcGMsIGNvbnN0IGNoYXIgKmZ1bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCmluZGV4IGM3NzdlMjIuLmIxZDMwNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCkBAIC01MDAsNyArNTAwLDcgQEAKIAlkZXYtPmliZGV2Lm5vZGVfdHlwZSA9IFJETUFfTk9ERV9STklDOwogCW1lbWNweShkZXYtPmliZGV2Lm5vZGVfZGVzYywgQzRJV19OT0RFX0RFU0MsIHNpemVvZihDNElXX05PREVfREVTQykpOwogCWRldi0+aWJkZXYucGh5c19wb3J0X2NudCA9IGRldi0+cmRldi5sbGRpLm5wb3J0czsKLQlkZXYtPmliZGV2Lm51bV9jb21wX3ZlY3RvcnMgPSAxOworCWRldi0+aWJkZXYubnVtX2NvbXBfdmVjdG9ycyA9ICBkZXYtPnJkZXYubGxkaS5uY2lxOwogCWRldi0+aWJkZXYuZG1hX2RldmljZSA9ICYoZGV2LT5yZGV2LmxsZGkucGRldi0+ZGV2KTsKIAlkZXYtPmliZGV2LnF1ZXJ5X2RldmljZSA9IGM0aXdfcXVlcnlfZGV2aWNlOwogCWRldi0+aWJkZXYucXVlcnlfcG9ydCA9IGM0aXdfcXVlcnlfcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKaW5kZXggMjE3OGYzMS4uNjhiMGE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKQEAgLTU0Miw2ICs1NDIsNyBAQAogCXNpemVfdCBtZW1zaXplOwogCV9fYmU2NCBiaXRzX3R5cGVfdHM7CiAJdTMyIGNxaWQ7CisJaW50IHZlY3RvcjsKIAl1MTYgc2l6ZTsgLyogaW5jbHVkaW5nIHN0YXR1cyBwYWdlICovCiAJdTE2IGNpZHg7CiAJdTE2IHN3X3BpZHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvdDRmd19yaV9hcGkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NGZ3X3JpX2FwaS5oCmluZGV4IDYxMjFjYTAuLjkxMjg5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NGZ3X3JpX2FwaS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NGZ3X3JpX2FwaS5oCkBAIC04NDgsNiArODQ4LDcgQEAKICNkZWZpbmUgVl9DT05HX0NOVFJMKHgpICgoeCkgPDwgU19DT05HX0NOVFJMKQogI2RlZmluZSBHX0NPTkdfQ05UUkwoeCkgKCgoeCkgPj4gU19DT05HX0NOVFJMKSAmIE1fQ09OR19DTlRSTCkKIAorI2RlZmluZSBDT05HX0NOVFJMX1ZBTElEICAgKDEgPDwgMTgpCiAjZGVmaW5lIFQ1X09QVF8yX1ZBTElEICAgICAgICgxIDw8IDMxKQogCiAjZW5kaWYgLyogX1Q0RldfUklfQVBJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2V0aHRvb2wuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCmluZGV4IGM0YjM5NDAuLjA3OGNhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCkBAIC0xMDUsNSArMTA1LDUgQEAKIAogdm9pZCBpcG9pYl9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmaXBvaWJfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmaXBvaWJfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCmluZGV4IDJlMmQ5MDMuLjhkNDRhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCkBAIC00MSwxMSArNDEsMTEgQEAKICNpbmNsdWRlICJpc2NzaV9pc2VyLmgiCiAKIC8qIFJlZ2lzdGVyIHVzZXIgYnVmZmVyIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSBwYXNzaXZlIHJkbWEKLSAqICBkdG8gZGVzY3JpcHRvci4gVG90YWwgZGF0YSBzaXplIGlzIHN0b3JlZCBpbgotICogIGlzZXJfdGFzay0+ZGF0YVtJU0VSX0RJUl9JTl0uZGF0YV9sZW4KKyAqICBkdG8gZGVzY3JpcHRvci4gRGF0YSBzaXplIGlzIHN0b3JlZCBpbgorICogIHRhc2stPmRhdGFbSVNFUl9ESVJfSU5dLmRhdGFfbGVuLCBQcm90ZWN0aW9uIHNpemUKKyAqICBvcyBzdG9yZWQgaW4gdGFzay0+cHJvdFtJU0VSX0RJUl9JTl0uZGF0YV9sZW4KICAqLwotc3RhdGljIGludCBpc2VyX3ByZXBhcmVfcmVhZF9jbWQoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssCi0JCQkJIHVuc2lnbmVkIGludCBlZHRsKQorc3RhdGljIGludCBpc2VyX3ByZXBhcmVfcmVhZF9jbWQoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCiAKIHsKIAlzdHJ1Y3QgaXNjc2lfaXNlcl90YXNrICppc2VyX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwpAQCAtNzMsMTQgKzczLDYgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKGVkdGwgPiBpc2VyX3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dLmRhdGFfbGVuKSB7Ci0JCWlzZXJfZXJyKCJUb3RhbCBkYXRhIGxlbmd0aDogJWxkLCBsZXNzIHRoYW4gRURUTDogIgotCQkJICIlZCwgaW4gUkVBRCBjbWQgQkhTIGl0dDogJWQsIGNvbm46IDB4JXBcbiIsCi0JCQkgaXNlcl90YXNrLT5kYXRhW0lTRVJfRElSX0lOXS5kYXRhX2xlbiwgZWR0bCwKLQkJCSB0YXNrLT5pdHQsIGlzZXJfdGFzay0+aWJfY29ubik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWVyciA9IGRldmljZS0+aXNlcl9yZWdfcmRtYV9tZW0oaXNlcl90YXNrLCBJU0VSX0RJUl9JTik7CiAJaWYgKGVycikgewogCQlpc2VyX2VycigiRmFpbGVkIHRvIHNldCB1cCBEYXRhLUlOIFJETUFcbiIpOwpAQCAtMTAwLDggKzkyLDkgQEAKIH0KIAogLyogUmVnaXN0ZXIgdXNlciBidWZmZXIgbWVtb3J5IGFuZCBpbml0aWFsaXplIHBhc3NpdmUgcmRtYQotICogIGR0byBkZXNjcmlwdG9yLiBUb3RhbCBkYXRhIHNpemUgaXMgc3RvcmVkIGluCi0gKiAgdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuCisgKiAgZHRvIGRlc2NyaXB0b3IuIERhdGEgc2l6ZSBpcyBzdG9yZWQgaW4KKyAqICB0YXNrLT5kYXRhW0lTRVJfRElSX09VVF0uZGF0YV9sZW4sIFByb3RlY3Rpb24gc2l6ZQorICogIGlzIHN0b3JlZCBhdCB0YXNrLT5wcm90W0lTRVJfRElSX09VVF0uZGF0YV9sZW4KICAqLwogc3RhdGljIGludAogaXNlcl9wcmVwYXJlX3dyaXRlX2NtZChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKQEAgLTEzNSwxNCArMTI4LDYgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKGVkdGwgPiBpc2VyX3Rhc2stPmRhdGFbSVNFUl9ESVJfT1VUXS5kYXRhX2xlbikgewotCQlpc2VyX2VycigiVG90YWwgZGF0YSBsZW5ndGg6ICVsZCwgbGVzcyB0aGFuIEVEVEw6ICVkLCAiCi0JCQkgImluIFdSSVRFIGNtZCBCSFMgaXR0OiAlZCwgY29ubjogMHglcFxuIiwKLQkJCSBpc2VyX3Rhc2stPmRhdGFbSVNFUl9ESVJfT1VUXS5kYXRhX2xlbiwKLQkJCSBlZHRsLCB0YXNrLT5pdHQsIHRhc2stPmNvbm4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAllcnIgPSBkZXZpY2UtPmlzZXJfcmVnX3JkbWFfbWVtKGlzZXJfdGFzaywgSVNFUl9ESVJfT1VUKTsKIAlpZiAoZXJyICE9IDApIHsKIAkJaXNlcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciB3cml0ZSBjbWQgUkRNQSBtZW1cbiIpOwpAQCAtNDE3LDExICs0MDIsMTIgQEAKIAlpZiAoc2NzaV9wcm90X3NnX2NvdW50KHNjKSkgewogCQlwcm90X2J1Zi0+YnVmICA9IHNjc2lfcHJvdF9zZ2xpc3Qoc2MpOwogCQlwcm90X2J1Zi0+c2l6ZSA9IHNjc2lfcHJvdF9zZ19jb3VudChzYyk7Ci0JCXByb3RfYnVmLT5kYXRhX2xlbiA9IHNjLT5wcm90X3NkYi0+bGVuZ3RoOworCQlwcm90X2J1Zi0+ZGF0YV9sZW4gPSBkYXRhX2J1Zi0+ZGF0YV9sZW4gPj4KKwkJCQkgICAgIGlsb2cyKHNjLT5kZXZpY2UtPnNlY3Rvcl9zaXplKSAqIDg7CiAJfQogCiAJaWYgKGhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0NNRF9SRUFEKSB7Ci0JCWVyciA9IGlzZXJfcHJlcGFyZV9yZWFkX2NtZCh0YXNrLCBlZHRsKTsKKwkJZXJyID0gaXNlcl9wcmVwYXJlX3JlYWRfY21kKHRhc2spOwogCQlpZiAoZXJyKQogCQkJZ290byBzZW5kX2NvbW1hbmRfZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jCmluZGV4IGI5ZDY0NzQuLmQ0Yzc5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMKQEAgLTY2Myw4ICs2NjMsOSBAQAogCiAJcGlfc3VwcG9ydCA9IG5wLT50cGdfbnAtPnRwZy0+dHBnX2F0dHJpYi50MTBfcGk7CiAJaWYgKHBpX3N1cHBvcnQgJiYgIWRldmljZS0+cGlfY2FwYWJsZSkgewotCQlwcl9lcnIoIlByb3RlY3Rpb24gaW5mb3JtYXRpb24gcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcHJfZXJyKCJQcm90ZWN0aW9uIGluZm9ybWF0aW9uIHJlcXVlc3RlZCBidXQgbm90IHN1cHBvcnRlZCwgIgorCQkgICAgICAgInJlamVjdGluZyBjb25uZWN0IHJlcXVlc3RcbiIpOworCQlyZXQgPSByZG1hX3JlamVjdChjbWFfaWQsIE5VTEwsIDApOwogCQlnb3RvIG91dF9tcjsKIAl9CiAKQEAgLTc4NywxNCArNzg4LDEyIEBACiAJCWlzZXJ0X3B1dF9jb25uKGlzZXJ0X2Nvbm4pOwogCQlyZXR1cm47CiAJfQotCWlmICghaXNlcnRfY29ubi0+bG9nb3V0X3Bvc3RlZCkgewotCQlwcl9kZWJ1ZygiQ2FsbGluZyByZG1hX2Rpc2Nvbm5lY3QgZm9yICFsb2dvdXRfcG9zdGVkIGZyb20iCi0JCQkgIiBpc2VydF9kaXNjb25uZWN0X3dvcmtcbiIpOworCisJaWYgKGlzZXJ0X2Nvbm4tPmRpc2Nvbm5lY3QpIHsKKwkJLyogU2VuZCBEUkVRL0RSRVAgdG93YXJkcyBvdXIgaW5pdGlhdG9yICovCiAJCXJkbWFfZGlzY29ubmVjdChpc2VydF9jb25uLT5jb25uX2NtX2lkKTsKLQkJbXV0ZXhfdW5sb2NrKCZpc2VydF9jb25uLT5jb25uX211dGV4KTsKLQkJaXNjc2l0X2NhdXNlX2Nvbm5lY3Rpb25fcmVpbnN0YXRlbWVudChpc2VydF9jb25uLT5jb25uLCAwKTsKLQkJZ290byB3YWtlX3VwOwogCX0KKwogCW11dGV4X3VubG9jaygmaXNlcnRfY29ubi0+Y29ubl9tdXRleCk7CiAKIHdha2VfdXA6CkBAIC04MDMsMTAgKzgwMiwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotaXNlcnRfZGlzY29ubmVjdGVkX2hhbmRsZXIoc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK2lzZXJ0X2Rpc2Nvbm5lY3RlZF9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQsIGJvb2wgZGlzY29ubmVjdCkKIHsKIAlzdHJ1Y3QgaXNlcnRfY29ubiAqaXNlcnRfY29ubiA9IChzdHJ1Y3QgaXNlcnRfY29ubiAqKWNtYV9pZC0+Y29udGV4dDsKIAorCWlzZXJ0X2Nvbm4tPmRpc2Nvbm5lY3QgPSBkaXNjb25uZWN0OwogCUlOSVRfV09SSygmaXNlcnRfY29ubi0+Y29ubl9sb2dvdXRfd29yaywgaXNlcnRfZGlzY29ubmVjdF93b3JrKTsKIAlzY2hlZHVsZV93b3JrKCZpc2VydF9jb25uLT5jb25uX2xvZ291dF93b3JrKTsKIH0KQEAgLTgxNSwyOSArODE1LDI4IEBACiBpc2VydF9jbWFfaGFuZGxlcihzdHJ1Y3QgcmRtYV9jbV9pZCAqY21hX2lkLCBzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqZXZlbnQpCiB7CiAJaW50IHJldCA9IDA7CisJYm9vbCBkaXNjb25uZWN0ID0gZmFsc2U7CiAKIAlwcl9kZWJ1ZygiaXNlcnRfY21hX2hhbmRsZXI6IGV2ZW50ICVkIHN0YXR1cyAlZCBjb25uICVwIGlkICVwXG4iLAogCQkgZXZlbnQtPmV2ZW50LCBldmVudC0+c3RhdHVzLCBjbWFfaWQtPmNvbnRleHQsIGNtYV9pZCk7CiAKIAlzd2l0Y2ggKGV2ZW50LT5ldmVudCkgewogCWNhc2UgUkRNQV9DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q6Ci0JCXByX2RlYnVnKCJSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDogPj4+Pj4+Pj4+Pj4+Pj4+XG4iKTsKIAkJcmV0ID0gaXNlcnRfY29ubmVjdF9yZXF1ZXN0KGNtYV9pZCwgZXZlbnQpOwogCQlicmVhazsKIAljYXNlIFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQ6Ci0JCXByX2RlYnVnKCJSRE1BX0NNX0VWRU5UX0VTVEFCTElTSEVEID4+Pj4+Pj4+Pj4+Pj4+XG4iKTsKIAkJaXNlcnRfY29ubmVjdGVkX2hhbmRsZXIoY21hX2lkKTsKIAkJYnJlYWs7Ci0JY2FzZSBSRE1BX0NNX0VWRU5UX0RJU0NPTk5FQ1RFRDoKLQkJcHJfZGVidWcoIlJETUFfQ01fRVZFTlRfRElTQ09OTkVDVEVEOiA+Pj4+Pj4+Pj4+Pj4+PlxuIik7Ci0JCWlzZXJ0X2Rpc2Nvbm5lY3RlZF9oYW5kbGVyKGNtYV9pZCk7Ci0JCWJyZWFrOwotCWNhc2UgUkRNQV9DTV9FVkVOVF9ERVZJQ0VfUkVNT1ZBTDoKLQljYXNlIFJETUFfQ01fRVZFTlRfQUREUl9DSEFOR0U6CisJY2FzZSBSRE1BX0NNX0VWRU5UX0FERFJfQ0hBTkdFOiAgICAvKiBGQUxMVEhSVSAqLworCWNhc2UgUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ6ICAgLyogRkFMTFRIUlUgKi8KKwljYXNlIFJETUFfQ01fRVZFTlRfREVWSUNFX1JFTU9WQUw6IC8qIEZBTExUSFJVICovCisJCWRpc2Nvbm5lY3QgPSB0cnVlOworCWNhc2UgUkRNQV9DTV9FVkVOVF9USU1FV0FJVF9FWElUOiAgLyogRkFMTFRIUlUgKi8KKwkJaXNlcnRfZGlzY29ubmVjdGVkX2hhbmRsZXIoY21hX2lkLCBkaXNjb25uZWN0KTsKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfRVJST1I6CiAJZGVmYXVsdDoKLQkJcHJfZXJyKCJVbmtub3duIFJETUEgQ01BIGV2ZW50OiAlZFxuIiwgZXZlbnQtPmV2ZW50KTsKKwkJcHJfZXJyKCJVbmhhbmRsZWQgUkRNQSBDTUEgZXZlbnQ6ICVkXG4iLCBldmVudC0+ZXZlbnQpOwogCQlicmVhazsKIAl9CiAKQEAgLTEwNTQsNyArMTA1Myw5IEBACiAJfQogCWlmICghbG9naW4tPmxvZ2luX2ZhaWxlZCkgewogCQlpZiAobG9naW4tPmxvZ2luX2NvbXBsZXRlKSB7Ci0JCQlpZiAoaXNlcnRfY29ubi0+Y29ubl9kZXZpY2UtPnVzZV9mYXN0cmVnKSB7CisJCQlpZiAoIWNvbm4tPnNlc3MtPnNlc3Nfb3BzLT5TZXNzaW9uVHlwZSAmJgorCQkJICAgIGlzZXJ0X2Nvbm4tPmNvbm5fZGV2aWNlLT51c2VfZmFzdHJlZykgeworCQkJCS8qIE5vcm1hbCBTZXNzaW9uIGFuZCBmYXN0cmVnIGlzIHVzZWQgKi8KIAkJCQl1OCBwaV9zdXBwb3J0ID0gbG9naW4tPm5wLT50cGdfbnAtPnRwZy0+dHBnX2F0dHJpYi50MTBfcGk7CiAKIAkJCQlyZXQgPSBpc2VydF9jb25uX2NyZWF0ZV9mYXN0cmVnX3Bvb2woaXNlcnRfY29ubiwKQEAgLTE4MjQsMTEgKzE4MjUsOCBAQAogCQlicmVhazsKIAljYXNlIElTVEFURV9TRU5EX0xPR09VVFJTUDoKIAkJcHJfZGVidWcoIkNhbGxpbmcgaXNjc2l0X2xvZ291dF9wb3N0X2hhbmRsZXIgPj4+Pj4+Pj4+Pj4+Pj5cbiIpOwotCQkvKgotCQkgKiBDYWxsIGF0b21pY19kZWMoJmlzZXJ0X2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpCi0JCSAqIGZyb20gaXNlcnRfd2FpdF9jb25uKCkKLQkJICovCi0JCWlzZXJ0X2Nvbm4tPmxvZ291dF9wb3N0ZWQgPSB0cnVlOworCisJCWF0b21pY19kZWMoJmlzZXJ0X2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpOwogCQlpc2NzaXRfbG9nb3V0X3Bvc3RfaGFuZGxlcihjbWQsIGNtZC0+Y29ubik7CiAJCWJyZWFrOwogCWNhc2UgSVNUQVRFX1NFTkRfVEVYVFJTUDoKQEAgLTIwMzQsNiArMjAzMiw4IEBACiAJaXNlcnRfY29ubi0+c3RhdGUgPSBJU0VSX0NPTk5fRE9XTjsKIAltdXRleF91bmxvY2soJmlzZXJ0X2Nvbm4tPmNvbm5fbXV0ZXgpOwogCisJaXNjc2l0X2NhdXNlX2Nvbm5lY3Rpb25fcmVpbnN0YXRlbWVudChpc2VydF9jb25uLT5jb25uLCAwKTsKKwogCWNvbXBsZXRlKCZpc2VydF9jb25uLT5jb25uX3dhaXRfY29tcF9lcnIpOwogfQogCkBAIC0yMzIwLDcgKzIzMjAsNyBAQAogCWludCByYzsKIAogCWlzZXJ0X2NyZWF0ZV9zZW5kX2Rlc2MoaXNlcnRfY29ubiwgaXNlcnRfY21kLCAmaXNlcnRfY21kLT50eF9kZXNjKTsKLQlyYyA9IGlzY3NpdF9idWlsZF90ZXh0X3JzcChjbWQsIGNvbm4sIGhkcik7CisJcmMgPSBpc2NzaXRfYnVpbGRfdGV4dF9yc3AoY21kLCBjb25uLCBoZHIsIElTQ1NJX0lORklOSUJBTkQpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIApAQCAtMzE1Niw5ICszMTU2LDE0IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJc3Bpbl9sb2NrX2JoKCZucC0+bnBfdGhyZWFkX2xvY2spOwotCWlmIChucC0+bnBfdGhyZWFkX3N0YXRlID09IElTQ1NJX05QX1RIUkVBRF9SRVNFVCkgeworCWlmIChucC0+bnBfdGhyZWFkX3N0YXRlID49IElTQ1NJX05QX1RIUkVBRF9SRVNFVCkgewogCQlzcGluX3VubG9ja19iaCgmbnAtPm5wX3RocmVhZF9sb2NrKTsKLQkJcHJfZGVidWcoIklTQ1NJX05QX1RIUkVBRF9SRVNFVCBmb3IgaXNlcnRfYWNjZXB0X25wXG4iKTsKKwkJcHJfZGVidWcoIm5wX3RocmVhZF9zdGF0ZSAlZCBmb3IgaXNlcnRfYWNjZXB0X25wXG4iLAorCQkJIG5wLT5ucF90aHJlYWRfc3RhdGUpOworCQkvKioKKwkJICogTm8gcG9pbnQgaW4gc3RhbGxpbmcgaGVyZSB3aGVuIG5wX3RocmVhZAorCQkgKiBpcyBpbiBzdGF0ZSBSRVNFVC9TSFVURE9XTi9FWElUIC0gYmFpbAorCQkgKiovCiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlzcGluX3VubG9ja19iaCgmbnAtPm5wX3RocmVhZF9sb2NrKTsKQEAgLTMyMDgsMTUgKzMyMTMsOSBAQAogCXN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uID0gY29ubi0+Y29udGV4dDsKIAogCXByX2RlYnVnKCJpc2VydF93YWl0X2Nvbm46IFN0YXJ0aW5nIFxuIik7Ci0JLyoKLQkgKiBEZWNyZW1lbnQgcG9zdF9zZW5kX2J1Zl9jb3VudCBmb3Igc3BlY2lhbCBjYXNlIHdoZW4gY2FsbGVkCi0JICogZnJvbSBpc2VydF9kb19jb250cm9sX2NvbXAoKSAtPiBpc2NzaXRfbG9nb3V0X3Bvc3RfaGFuZGxlcigpCi0JICovCi0JbXV0ZXhfbG9jaygmaXNlcnRfY29ubi0+Y29ubl9tdXRleCk7Ci0JaWYgKGlzZXJ0X2Nvbm4tPmxvZ291dF9wb3N0ZWQpCi0JCWF0b21pY19kZWMoJmlzZXJ0X2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpOwogCi0JaWYgKGlzZXJ0X2Nvbm4tPmNvbm5fY21faWQgJiYgaXNlcnRfY29ubi0+c3RhdGUgIT0gSVNFUl9DT05OX0RPV04pIHsKKwltdXRleF9sb2NrKCZpc2VydF9jb25uLT5jb25uX211dGV4KTsKKwlpZiAoaXNlcnRfY29ubi0+Y29ubl9jbV9pZCkgewogCQlwcl9kZWJ1ZygiQ2FsbGluZyByZG1hX2Rpc2Nvbm5lY3QgZnJvbSBpc2VydF93YWl0X2Nvbm5cbiIpOwogCQlyZG1hX2Rpc2Nvbm5lY3QoaXNlcnRfY29ubi0+Y29ubl9jbV9pZCk7CiAJfQpAQCAtMzI5Myw2ICszMjkyLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlzZXJ0X2V4aXQodm9pZCkKIHsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGlzZXJ0X2NvbXBfd3EpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGlzZXJ0X3J4X3dxKTsKIAlpc2NzaXRfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJmlzZXJfdGFyZ2V0X3RyYW5zcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmgKaW5kZXggZGE2NjEyZS4uMDRmNTFmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaApAQCAtMTE2LDcgKzExNiw2IEBACiAKIHN0cnVjdCBpc2VydF9jb25uIHsKIAllbnVtIGlzZXJfY29ubl9zdGF0ZQlzdGF0ZTsKLQlib29sCQkJbG9nb3V0X3Bvc3RlZDsKIAlpbnQJCQlwb3N0X3JlY3ZfYnVmX2NvdW50OwogCWF0b21pY190CQlwb3N0X3NlbmRfYnVmX2NvdW50OwogCXUzMgkJCXJlc3BvbmRlcl9yZXNvdXJjZXM7CkBAIC0xNTEsNiArMTUwLDcgQEAKICNkZWZpbmUgSVNFUlRfQ09NUF9CQVRDSF9DT1VOVAk4CiAJaW50CQkJY29ubl9jb21wX2JhdGNoOwogCXN0cnVjdCBsbGlzdF9oZWFkCWNvbm5fY29tcF9sbGlzdDsKKwlib29sICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0OwogfTsKIAogI2RlZmluZSBJU0VSVF9NQVhfQ1EgNjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCmluZGV4IDk4MTZjNTEuLjc2NDFiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZwpAQCAtMSwxMSArMSwzIEBACi1jb25maWcgSVNETl9EUlZfQVZNQjFfVkVSQk9TRV9SRUFTT04KLQlib29sICJWZXJib3NlIHJlYXNvbiBjb2RlIHJlcG9ydGluZyIKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIENBUEkgZHJpdmVycyB3aWxsIGdpdmUgdmVyYm9zZSByZWFzb25zIGZvcgotCSAgZGlzY29ubmVjdGluZy4gVGhpcyB3aWxsIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwgYnkgNyBLQi4gSWYKLQkgIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBDQVBJX1RSQUNFCiAJYm9vbCAiQ0FQSSB0cmFjZSBzdXBwb3J0IgogCWRlZmF1bHQgeQpAQCAtMTcsNyArOSw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgSVNETl9DQVBJX0NBUEkyMAotCXRyaXN0YXRlICJDQVBJMi4wIC9kZXYvY2FwaSBzdXBwb3J0IgorCXRyaXN0YXRlICJDQVBJMi4wIC9kZXYvY2FwaTIwIHN1cHBvcnQiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gd2lsbCBwcm92aWRlIHRoZSBDQVBJIDIuMCBpbnRlcmZhY2UgdG8gdXNlcnNwYWNlCiAJICBhcHBsaWNhdGlvbnMgdmlhIC9kZXYvY2FwaTIwLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUKQEAgLTQyLDMgKzM0LDExIEBACiAJICB0aGUgbGVnYWN5IGlzZG40bGludXggbGluayBsYXllci4gIElmIHlvdSBoYXZlIGEgY2FyZCB3aGljaCBpcwogCSAgc3VwcG9ydGVkIGJ5IGEgQ0FQSSBkcml2ZXIsIGJ1dCBzdGlsbCB3YW50IHRvIHVzZSBvbGQgZmVhdHVyZXMgbGlrZQogCSAgaXBwcCBpbnRlcmZhY2VzIG9yIHR0eUkgZW11bGF0aW9uLCBzYXkgWS9NIGhlcmUuCisKK2NvbmZpZyBJU0ROX0NBUElfQ0FQSURSVl9WRVJCT1NFCisJYm9vbCAiVmVyYm9zZSByZWFzb24gY29kZSByZXBvcnRpbmciCisJZGVwZW5kcyBvbiBJU0ROX0NBUElfQ0FQSURSVgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgY2FwaWRydiBpbnRlcmZhY2Ugd2lsbCBnaXZlIHZlcmJvc2UgcmVhc29ucworCSAgZm9yIGRpc2Nvbm5lY3RpbmcuIFRoaXMgd2lsbCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUga2VybmVsIGJ5IDcgS0IuCisJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCmluZGV4IGFjNmY3MmIuLmY5YTg3ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKQEAgLTEyNzEsNyArMTI3MSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlkcnYtPmRyaXZlcl9uYW1lID0gImNhcGlfbmMiOwotCWRydi0+bmFtZSA9ICJjYXBpIjsKKwlkcnYtPm5hbWUgPSAiY2FwaSEiOwogCWRydi0+bWFqb3IgPSAwOwogCWRydi0+bWlub3Jfc3RhcnQgPSAwOwogCWRydi0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CkBAIC0xNDE3LDcgKzE0MTcsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihjYXBpX2NsYXNzKTsKIAl9CiAKLQlkZXZpY2VfY3JlYXRlKGNhcGlfY2xhc3MsIE5VTEwsIE1LREVWKGNhcGlfbWFqb3IsIDApLCBOVUxMLCAiY2FwaSIpOworCWRldmljZV9jcmVhdGUoY2FwaV9jbGFzcywgTlVMTCwgTUtERVYoY2FwaV9tYWpvciwgMCksIE5VTEwsICJjYXBpMjAiKTsKIAogCWlmIChjYXBpbmNfdHR5X2luaXQoKSA8IDApIHsKIAkJZGV2aWNlX2Rlc3Ryb3koY2FwaV9jbGFzcywgTUtERVYoY2FwaV9tYWpvciwgMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCmluZGV4IGNjOWYxOTIuLmZkNmQyOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKQEAgLTc2Myw2ICs3NjMsMjAxIEBACiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjaGFyICpjYXBpX2luZm8yc3RyKHUxNiByZWFzb24pCit7CisjaWZuZGVmIENPTkZJR19JU0ROX0NBUElfQ0FQSURSVl9WRVJCT1NFCisJcmV0dXJuICIuLiI7CisjZWxzZQorCXN3aXRjaCAocmVhc29uKSB7CisKKy8qLS0gaW5mb3JtYXRpdmUgdmFsdWVzIChjb3JyZXNwb25kaW5nIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZCkgLS0tLS0qLworCWNhc2UgMHgwMDAxOgorCQlyZXR1cm4gIk5DUEkgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sLCBOQ1BJIGlnbm9yZWQiOworCWNhc2UgMHgwMDAyOgorCQlyZXR1cm4gIkZsYWdzIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBwcm90b2NvbCwgZmxhZ3MgaWdub3JlZCI7CisJY2FzZSAweDAwMDM6CisJCXJldHVybiAiQWxlcnQgYWxyZWFkeSBzZW50IGJ5IGFub3RoZXIgYXBwbGljYXRpb24iOworCisvKi0tIGVycm9yIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgQ0FQSV9SRUdJU1RFUiAtLS0tLSovCisJY2FzZSAweDEwMDE6CisJCXJldHVybiAiVG9vIG1hbnkgYXBwbGljYXRpb25zIjsKKwljYXNlIDB4MTAwMjoKKwkJcmV0dXJuICJMb2dpY2FsIGJsb2NrIHNpemUgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0IDEyOCBCeXRlcyI7CisJY2FzZSAweDEwMDM6CisJCXJldHVybiAiQnVmZmVyIGV4Y2VlZHMgNjQga0J5dGUiOworCWNhc2UgMHgxMDA0OgorCQlyZXR1cm4gIk1lc3NhZ2UgYnVmZmVyIHNpemUgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0IDEwMjQgQnl0ZXMiOworCWNhc2UgMHgxMDA1OgorCQlyZXR1cm4gIk1heC4gbnVtYmVyIG9mIGxvZ2ljYWwgY29ubmVjdGlvbnMgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDEwMDY6CisJCXJldHVybiAiUmVzZXJ2ZWQiOworCWNhc2UgMHgxMDA3OgorCQlyZXR1cm4gIlRoZSBtZXNzYWdlIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBiZWNhdXNlIG9mIGFuIGludGVybmFsIGJ1c3kgY29uZGl0aW9uIjsKKwljYXNlIDB4MTAwODoKKwkJcmV0dXJuICJPUyByZXNvdXJjZSBlcnJvciAobm8gbWVtb3J5ID8pIjsKKwljYXNlIDB4MTAwOToKKwkJcmV0dXJuICJDQVBJIG5vdCBpbnN0YWxsZWQiOworCWNhc2UgMHgxMDBBOgorCQlyZXR1cm4gIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBlcXVpcG1lbnQiOworCWNhc2UgMHgxMDBCOgorCQlyZXR1cm4gIkNvbnRyb2xsZXIgZG9lcyBvbmx5IHN1cHBvcnQgZXh0ZXJuYWwgZXF1aXBtZW50IjsKKworLyotLSBlcnJvciBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIG1lc3NhZ2UgZXhjaGFuZ2UgZnVuY3Rpb25zIC0tLS0tKi8KKwljYXNlIDB4MTEwMToKKwkJcmV0dXJuICJJbGxlZ2FsIGFwcGxpY2F0aW9uIG51bWJlciI7CisJY2FzZSAweDExMDI6CisJCXJldHVybiAiSWxsZWdhbCBjb21tYW5kIG9yIHN1YmNvbW1hbmQgb3IgbWVzc2FnZSBsZW5ndGggbGVzcyB0aGFuIDEyIGJ5dGVzIjsKKwljYXNlIDB4MTEwMzoKKwkJcmV0dXJuICJUaGUgbWVzc2FnZSBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgYmVjYXVzZSBvZiBhIHF1ZXVlIGZ1bGwgY29uZGl0aW9uICEhIFRoZSBlcnJvciBjb2RlIGRvZXMgbm90IGltcGx5IHRoYXQgQ0FQSSBjYW5ub3QgcmVjZWl2ZSBtZXNzYWdlcyBkaXJlY3RlZCB0byBhbm90aGVyIGNvbnRyb2xsZXIsIFBMQ0kgb3IgTkNDSSI7CisJY2FzZSAweDExMDQ6CisJCXJldHVybiAiUXVldWUgaXMgZW1wdHkiOworCWNhc2UgMHgxMTA1OgorCQlyZXR1cm4gIlF1ZXVlIG92ZXJmbG93LCBhIG1lc3NhZ2Ugd2FzIGxvc3QgISEgVGhpcyBpbmRpY2F0ZXMgYSBjb25maWd1cmF0aW9uIGVycm9yLiBUaGUgb25seSByZWNvdmVyeSBmcm9tIHRoaXMgZXJyb3IgaXMgdG8gcGVyZm9ybSBhIENBUElfUkVMRUFTRSI7CisJY2FzZSAweDExMDY6CisJCXJldHVybiAiVW5rbm93biBub3RpZmljYXRpb24gcGFyYW1ldGVyIjsKKwljYXNlIDB4MTEwNzoKKwkJcmV0dXJuICJUaGUgTWVzc2FnZSBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgYmVjYXVzZSBvZiBhbiBpbnRlcm5hbCBidXN5IGNvbmRpdGlvbiI7CisJY2FzZSAweDExMDg6CisJCXJldHVybiAiT1MgUmVzb3VyY2UgZXJyb3IgKG5vIG1lbW9yeSA/KSI7CisJY2FzZSAweDExMDk6CisJCXJldHVybiAiQ0FQSSBub3QgaW5zdGFsbGVkIjsKKwljYXNlIDB4MTEwQToKKwkJcmV0dXJuICJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgZXF1aXBtZW50IjsKKwljYXNlIDB4MTEwQjoKKwkJcmV0dXJuICJDb250cm9sbGVyIGRvZXMgb25seSBzdXBwb3J0IGV4dGVybmFsIGVxdWlwbWVudCI7CisKKy8qLS0gZXJyb3IgaW5mb3JtYXRpb24gY29uY2VybmluZyByZXNvdXJjZSAvIGNvZGluZyBwcm9ibGVtcyAtLS0tLSovCisJY2FzZSAweDIwMDE6CisJCXJldHVybiAiTWVzc2FnZSBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgc3RhdGUiOworCWNhc2UgMHgyMDAyOgorCQlyZXR1cm4gIklsbGVnYWwgQ29udHJvbGxlciAvIFBMQ0kgLyBOQ0NJIjsKKwljYXNlIDB4MjAwMzoKKwkJcmV0dXJuICJPdXQgb2YgUExDSSI7CisJY2FzZSAweDIwMDQ6CisJCXJldHVybiAiT3V0IG9mIE5DQ0kiOworCWNhc2UgMHgyMDA1OgorCQlyZXR1cm4gIk91dCBvZiBMSVNURU4iOworCWNhc2UgMHgyMDA2OgorCQlyZXR1cm4gIk91dCBvZiBGQVggcmVzb3VyY2VzIChwcm90b2NvbCBULjMwKSI7CisJY2FzZSAweDIwMDc6CisJCXJldHVybiAiSWxsZWdhbCBtZXNzYWdlIHBhcmFtZXRlciBjb2RpbmciOworCisvKi0tIGVycm9yIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgcmVxdWVzdGVkIHNlcnZpY2VzICAtLS0tLSovCisJY2FzZSAweDMwMDE6CisJCXJldHVybiAiQjEgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDMwMDI6CisJCXJldHVybiAiQjIgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDMwMDM6CisJCXJldHVybiAiQjMgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDMwMDQ6CisJCXJldHVybiAiQjEgcHJvdG9jb2wgcGFyYW1ldGVyIG5vdCBzdXBwb3J0ZWQiOworCWNhc2UgMHgzMDA1OgorCQlyZXR1cm4gIkIyIHByb3RvY29sIHBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIjsKKwljYXNlIDB4MzAwNjoKKwkJcmV0dXJuICJCMyBwcm90b2NvbCBwYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDMwMDc6CisJCXJldHVybiAiQiBwcm90b2NvbCBjb21iaW5hdGlvbiBub3Qgc3VwcG9ydGVkIjsKKwljYXNlIDB4MzAwODoKKwkJcmV0dXJuICJOQ1BJIG5vdCBzdXBwb3J0ZWQiOworCWNhc2UgMHgzMDA5OgorCQlyZXR1cm4gIkNJUCBWYWx1ZSB1bmtub3duIjsKKwljYXNlIDB4MzAwQToKKwkJcmV0dXJuICJGbGFncyBub3Qgc3VwcG9ydGVkIChyZXNlcnZlZCBiaXRzKSI7CisJY2FzZSAweDMwMEI6CisJCXJldHVybiAiRmFjaWxpdHkgbm90IHN1cHBvcnRlZCI7CisJY2FzZSAweDMwMEM6CisJCXJldHVybiAiRGF0YSBsZW5ndGggbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sIjsKKwljYXNlIDB4MzAwRDoKKwkJcmV0dXJuICJSZXNldCBwcm9jZWR1cmUgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sIjsKKworLyotLSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIGNsZWFyaW5nIG9mIGEgcGh5c2ljYWwgY29ubmVjdGlvbiAtLS0tLSovCisJY2FzZSAweDMzMDE6CisJCXJldHVybiAiUHJvdG9jb2wgZXJyb3IgbGF5ZXIgMSAoYnJva2VuIGxpbmUgb3IgQi1jaGFubmVsIHJlbW92ZWQgYnkgc2lnbmFsbGluZyBwcm90b2NvbCkiOworCWNhc2UgMHgzMzAyOgorCQlyZXR1cm4gIlByb3RvY29sIGVycm9yIGxheWVyIDIiOworCWNhc2UgMHgzMzAzOgorCQlyZXR1cm4gIlByb3RvY29sIGVycm9yIGxheWVyIDMiOworCWNhc2UgMHgzMzA0OgorCQlyZXR1cm4gIkFub3RoZXIgYXBwbGljYXRpb24gZ290IHRoYXQgY2FsbCI7CisvKi0tIFQuMzAgc3BlY2lmaWMgcmVhc29ucyAtLS0tLSovCisJY2FzZSAweDMzMTE6CisJCXJldHVybiAiQ29ubmVjdGluZyBub3Qgc3VjY2Vzc2Z1bCAocmVtb3RlIHN0YXRpb24gaXMgbm8gRkFYIEczIG1hY2hpbmUpIjsKKwljYXNlIDB4MzMxMjoKKwkJcmV0dXJuICJDb25uZWN0aW5nIG5vdCBzdWNjZXNzZnVsICh0cmFpbmluZyBlcnJvcikiOworCWNhc2UgMHgzMzEzOgorCQlyZXR1cm4gIkRpc2Nvbm5lY3RlZCBiZWZvcmUgdHJhbnNmZXIgKHJlbW90ZSBzdGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNmZXIgbW9kZSwgZS5nLiByZXNvbHV0aW9uKSI7CisJY2FzZSAweDMzMTQ6CisJCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAocmVtb3RlIGFib3J0KSI7CisJY2FzZSAweDMzMTU6CisJCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAocmVtb3RlIHByb2NlZHVyZSBlcnJvciwgZS5nLiB1bnN1Y2Nlc3NmdWwgcmVwZXRpdGlvbiBvZiBULjMwIGNvbW1hbmRzKSI7CisJY2FzZSAweDMzMTY6CisJCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAobG9jYWwgdHggZGF0YSB1bmRlcnJ1bikiOworCWNhc2UgMHgzMzE3OgorCQlyZXR1cm4gIkRpc2Nvbm5lY3RlZCBkdXJpbmcgdHJhbnNmZXIgKGxvY2FsIHJ4IGRhdGEgb3ZlcmZsb3cpIjsKKwljYXNlIDB4MzMxODoKKwkJcmV0dXJuICJEaXNjb25uZWN0ZWQgZHVyaW5nIHRyYW5zZmVyIChsb2NhbCBhYm9ydCkiOworCWNhc2UgMHgzMzE5OgorCQlyZXR1cm4gIklsbGVnYWwgcGFyYW1ldGVyIGNvZGluZyAoZS5nLiBTRkYgY29kaW5nIGVycm9yKSI7CisKKy8qLS0gZGlzY29ubmVjdCBjYXVzZXMgZnJvbSB0aGUgbmV0d29yayBhY2NvcmRpbmcgdG8gRVRTIDMwMCAxMDItMS9RLjkzMSAtLS0tLSovCisJY2FzZSAweDM0ODE6IHJldHVybiAiVW5hbGxvY2F0ZWQgKHVuYXNzaWduZWQpIG51bWJlciI7CisJY2FzZSAweDM0ODI6IHJldHVybiAiTm8gcm91dGUgdG8gc3BlY2lmaWVkIHRyYW5zaXQgbmV0d29yayI7CisJY2FzZSAweDM0ODM6IHJldHVybiAiTm8gcm91dGUgdG8gZGVzdGluYXRpb24iOworCWNhc2UgMHgzNDg2OiByZXR1cm4gIkNoYW5uZWwgdW5hY2NlcHRhYmxlIjsKKwljYXNlIDB4MzQ4NzoKKwkJcmV0dXJuICJDYWxsIGF3YXJkZWQgYW5kIGJlaW5nIGRlbGl2ZXJlZCBpbiBhbiBlc3RhYmxpc2hlZCBjaGFubmVsIjsKKwljYXNlIDB4MzQ5MDogcmV0dXJuICJOb3JtYWwgY2FsbCBjbGVhcmluZyI7CisJY2FzZSAweDM0OTE6IHJldHVybiAiVXNlciBidXN5IjsKKwljYXNlIDB4MzQ5MjogcmV0dXJuICJObyB1c2VyIHJlc3BvbmRpbmciOworCWNhc2UgMHgzNDkzOiByZXR1cm4gIk5vIGFuc3dlciBmcm9tIHVzZXIgKHVzZXIgYWxlcnRlZCkiOworCWNhc2UgMHgzNDk1OiByZXR1cm4gIkNhbGwgcmVqZWN0ZWQiOworCWNhc2UgMHgzNDk2OiByZXR1cm4gIk51bWJlciBjaGFuZ2VkIjsKKwljYXNlIDB4MzQ5QTogcmV0dXJuICJOb24tc2VsZWN0ZWQgdXNlciBjbGVhcmluZyI7CisJY2FzZSAweDM0OUI6IHJldHVybiAiRGVzdGluYXRpb24gb3V0IG9mIG9yZGVyIjsKKwljYXNlIDB4MzQ5QzogcmV0dXJuICJJbnZhbGlkIG51bWJlciBmb3JtYXQiOworCWNhc2UgMHgzNDlEOiByZXR1cm4gIkZhY2lsaXR5IHJlamVjdGVkIjsKKwljYXNlIDB4MzQ5RTogcmV0dXJuICJSZXNwb25zZSB0byBTVEFUVVMgRU5RVUlSWSI7CisJY2FzZSAweDM0OUY6IHJldHVybiAiTm9ybWFsLCB1bnNwZWNpZmllZCI7CisJY2FzZSAweDM0QTI6IHJldHVybiAiTm8gY2lyY3VpdCAvIGNoYW5uZWwgYXZhaWxhYmxlIjsKKwljYXNlIDB4MzRBNjogcmV0dXJuICJOZXR3b3JrIG91dCBvZiBvcmRlciI7CisJY2FzZSAweDM0QTk6IHJldHVybiAiVGVtcG9yYXJ5IGZhaWx1cmUiOworCWNhc2UgMHgzNEFBOiByZXR1cm4gIlN3aXRjaGluZyBlcXVpcG1lbnQgY29uZ2VzdGlvbiI7CisJY2FzZSAweDM0QUI6IHJldHVybiAiQWNjZXNzIGluZm9ybWF0aW9uIGRpc2NhcmRlZCI7CisJY2FzZSAweDM0QUM6IHJldHVybiAiUmVxdWVzdGVkIGNpcmN1aXQgLyBjaGFubmVsIG5vdCBhdmFpbGFibGUiOworCWNhc2UgMHgzNEFGOiByZXR1cm4gIlJlc291cmNlcyB1bmF2YWlsYWJsZSwgdW5zcGVjaWZpZWQiOworCWNhc2UgMHgzNEIxOiByZXR1cm4gIlF1YWxpdHkgb2Ygc2VydmljZSB1bmF2YWlsYWJsZSI7CisJY2FzZSAweDM0QjI6IHJldHVybiAiUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBzdWJzY3JpYmVkIjsKKwljYXNlIDB4MzRCOTogcmV0dXJuICJCZWFyZXIgY2FwYWJpbGl0eSBub3QgYXV0aG9yaXplZCI7CisJY2FzZSAweDM0QkE6IHJldHVybiAiQmVhcmVyIGNhcGFiaWxpdHkgbm90IHByZXNlbnRseSBhdmFpbGFibGUiOworCWNhc2UgMHgzNEJGOiByZXR1cm4gIlNlcnZpY2Ugb3Igb3B0aW9uIG5vdCBhdmFpbGFibGUsIHVuc3BlY2lmaWVkIjsKKwljYXNlIDB4MzRDMTogcmV0dXJuICJCZWFyZXIgY2FwYWJpbGl0eSBub3QgaW1wbGVtZW50ZWQiOworCWNhc2UgMHgzNEMyOiByZXR1cm4gIkNoYW5uZWwgdHlwZSBub3QgaW1wbGVtZW50ZWQiOworCWNhc2UgMHgzNEM1OiByZXR1cm4gIlJlcXVlc3RlZCBmYWNpbGl0eSBub3QgaW1wbGVtZW50ZWQiOworCWNhc2UgMHgzNEM2OiByZXR1cm4gIk9ubHkgcmVzdHJpY3RlZCBkaWdpdGFsIGluZm9ybWF0aW9uIGJlYXJlciBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZSI7CisJY2FzZSAweDM0Q0Y6IHJldHVybiAiU2VydmljZSBvciBvcHRpb24gbm90IGltcGxlbWVudGVkLCB1bnNwZWNpZmllZCI7CisJY2FzZSAweDM0RDE6IHJldHVybiAiSW52YWxpZCBjYWxsIHJlZmVyZW5jZSB2YWx1ZSI7CisJY2FzZSAweDM0RDI6IHJldHVybiAiSWRlbnRpZmllZCBjaGFubmVsIGRvZXMgbm90IGV4aXN0IjsKKwljYXNlIDB4MzREMzogcmV0dXJuICJBIHN1c3BlbmRlZCBjYWxsIGV4aXN0cywgYnV0IHRoaXMgY2FsbCBpZGVudGl0eSBkb2VzIG5vdCI7CisJY2FzZSAweDM0RDQ6IHJldHVybiAiQ2FsbCBpZGVudGl0eSBpbiB1c2UiOworCWNhc2UgMHgzNEQ1OiByZXR1cm4gIk5vIGNhbGwgc3VzcGVuZGVkIjsKKwljYXNlIDB4MzRENjogcmV0dXJuICJDYWxsIGhhdmluZyB0aGUgcmVxdWVzdGVkIGNhbGwgaWRlbnRpdHkgaGFzIGJlZW4gY2xlYXJlZCI7CisJY2FzZSAweDM0RDg6IHJldHVybiAiSW5jb21wYXRpYmxlIGRlc3RpbmF0aW9uIjsKKwljYXNlIDB4MzREQjogcmV0dXJuICJJbnZhbGlkIHRyYW5zaXQgbmV0d29yayBzZWxlY3Rpb24iOworCWNhc2UgMHgzNERGOiByZXR1cm4gIkludmFsaWQgbWVzc2FnZSwgdW5zcGVjaWZpZWQiOworCWNhc2UgMHgzNEUwOiByZXR1cm4gIk1hbmRhdG9yeSBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIG1pc3NpbmciOworCWNhc2UgMHgzNEUxOiByZXR1cm4gIk1lc3NhZ2UgdHlwZSBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIjsKKwljYXNlIDB4MzRFMjogcmV0dXJuICJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggY2FsbCBzdGF0ZSBvciBtZXNzYWdlIHR5cGUgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCI7CisJY2FzZSAweDM0RTM6IHJldHVybiAiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIjsKKwljYXNlIDB4MzRFNDogcmV0dXJuICJJbnZhbGlkIGluZm9ybWF0aW9uIGVsZW1lbnQgY29udGVudHMiOworCWNhc2UgMHgzNEU1OiByZXR1cm4gIk1lc3NhZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBjYWxsIHN0YXRlIjsKKwljYXNlIDB4MzRFNjogcmV0dXJuICJSZWNvdmVyeSBvbiB0aW1lciBleHBpcnkiOworCWNhc2UgMHgzNEVGOiByZXR1cm4gIlByb3RvY29sIGVycm9yLCB1bnNwZWNpZmllZCI7CisJY2FzZSAweDM0RkY6IHJldHVybiAiSW50ZXJ3b3JraW5nLCB1bnNwZWNpZmllZCI7CisKKwlkZWZhdWx0OiByZXR1cm4gIk5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iOworCX0KKyNlbmRpZgorfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfY29udHJvbGxlcihfY21zZyAqY21zZykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGl1dGlsLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpdXRpbC5jCmluZGV4IGQyNmYxNzAuLjZlNzk3ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGl1dGlsLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaXV0aWwuYwpAQCAtMjIsMjA1ICsyMiw2IEBACiAKIC8qIGZyb20gQ0FQSTIuMCBEREsgQVZNIEJlcmxpbiBHbWJIICovCiAKLSNpZm5kZWYgQ09ORklHX0lTRE5fRFJWX0FWTUIxX1ZFUkJPU0VfUkVBU09OCi1jaGFyICpjYXBpX2luZm8yc3RyKHUxNiByZWFzb24pCi17Ci0JcmV0dXJuICIuLiI7Ci19Ci0jZWxzZQotY2hhciAqY2FwaV9pbmZvMnN0cih1MTYgcmVhc29uKQotewotCXN3aXRjaCAocmVhc29uKSB7Ci0KLS8qLS0gaW5mb3JtYXRpdmUgdmFsdWVzIChjb3JyZXNwb25kaW5nIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZCkgLS0tLS0qLwotCWNhc2UgMHgwMDAxOgotCQlyZXR1cm4gIk5DUEkgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sLCBOQ1BJIGlnbm9yZWQiOwotCWNhc2UgMHgwMDAyOgotCQlyZXR1cm4gIkZsYWdzIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBwcm90b2NvbCwgZmxhZ3MgaWdub3JlZCI7Ci0JY2FzZSAweDAwMDM6Ci0JCXJldHVybiAiQWxlcnQgYWxyZWFkeSBzZW50IGJ5IGFub3RoZXIgYXBwbGljYXRpb24iOwotCi0vKi0tIGVycm9yIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgQ0FQSV9SRUdJU1RFUiAtLS0tLSovCi0JY2FzZSAweDEwMDE6Ci0JCXJldHVybiAiVG9vIG1hbnkgYXBwbGljYXRpb25zIjsKLQljYXNlIDB4MTAwMjoKLQkJcmV0dXJuICJMb2dpY2FsIGJsb2NrIHNpemUgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0IDEyOCBCeXRlcyI7Ci0JY2FzZSAweDEwMDM6Ci0JCXJldHVybiAiQnVmZmVyIGV4Y2VlZHMgNjQga0J5dGUiOwotCWNhc2UgMHgxMDA0OgotCQlyZXR1cm4gIk1lc3NhZ2UgYnVmZmVyIHNpemUgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0IDEwMjQgQnl0ZXMiOwotCWNhc2UgMHgxMDA1OgotCQlyZXR1cm4gIk1heC4gbnVtYmVyIG9mIGxvZ2ljYWwgY29ubmVjdGlvbnMgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDEwMDY6Ci0JCXJldHVybiAiUmVzZXJ2ZWQiOwotCWNhc2UgMHgxMDA3OgotCQlyZXR1cm4gIlRoZSBtZXNzYWdlIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBiZWNhdXNlIG9mIGFuIGludGVybmFsIGJ1c3kgY29uZGl0aW9uIjsKLQljYXNlIDB4MTAwODoKLQkJcmV0dXJuICJPUyByZXNvdXJjZSBlcnJvciAobm8gbWVtb3J5ID8pIjsKLQljYXNlIDB4MTAwOToKLQkJcmV0dXJuICJDQVBJIG5vdCBpbnN0YWxsZWQiOwotCWNhc2UgMHgxMDBBOgotCQlyZXR1cm4gIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBlcXVpcG1lbnQiOwotCWNhc2UgMHgxMDBCOgotCQlyZXR1cm4gIkNvbnRyb2xsZXIgZG9lcyBvbmx5IHN1cHBvcnQgZXh0ZXJuYWwgZXF1aXBtZW50IjsKLQotLyotLSBlcnJvciBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIG1lc3NhZ2UgZXhjaGFuZ2UgZnVuY3Rpb25zIC0tLS0tKi8KLQljYXNlIDB4MTEwMToKLQkJcmV0dXJuICJJbGxlZ2FsIGFwcGxpY2F0aW9uIG51bWJlciI7Ci0JY2FzZSAweDExMDI6Ci0JCXJldHVybiAiSWxsZWdhbCBjb21tYW5kIG9yIHN1YmNvbW1hbmQgb3IgbWVzc2FnZSBsZW5ndGggbGVzcyB0aGFuIDEyIGJ5dGVzIjsKLQljYXNlIDB4MTEwMzoKLQkJcmV0dXJuICJUaGUgbWVzc2FnZSBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgYmVjYXVzZSBvZiBhIHF1ZXVlIGZ1bGwgY29uZGl0aW9uICEhIFRoZSBlcnJvciBjb2RlIGRvZXMgbm90IGltcGx5IHRoYXQgQ0FQSSBjYW5ub3QgcmVjZWl2ZSBtZXNzYWdlcyBkaXJlY3RlZCB0byBhbm90aGVyIGNvbnRyb2xsZXIsIFBMQ0kgb3IgTkNDSSI7Ci0JY2FzZSAweDExMDQ6Ci0JCXJldHVybiAiUXVldWUgaXMgZW1wdHkiOwotCWNhc2UgMHgxMTA1OgotCQlyZXR1cm4gIlF1ZXVlIG92ZXJmbG93LCBhIG1lc3NhZ2Ugd2FzIGxvc3QgISEgVGhpcyBpbmRpY2F0ZXMgYSBjb25maWd1cmF0aW9uIGVycm9yLiBUaGUgb25seSByZWNvdmVyeSBmcm9tIHRoaXMgZXJyb3IgaXMgdG8gcGVyZm9ybSBhIENBUElfUkVMRUFTRSI7Ci0JY2FzZSAweDExMDY6Ci0JCXJldHVybiAiVW5rbm93biBub3RpZmljYXRpb24gcGFyYW1ldGVyIjsKLQljYXNlIDB4MTEwNzoKLQkJcmV0dXJuICJUaGUgTWVzc2FnZSBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgYmVjYXVzZSBvZiBhbiBpbnRlcm5hbCBidXN5IGNvbmRpdGlvbiI7Ci0JY2FzZSAweDExMDg6Ci0JCXJldHVybiAiT1MgUmVzb3VyY2UgZXJyb3IgKG5vIG1lbW9yeSA/KSI7Ci0JY2FzZSAweDExMDk6Ci0JCXJldHVybiAiQ0FQSSBub3QgaW5zdGFsbGVkIjsKLQljYXNlIDB4MTEwQToKLQkJcmV0dXJuICJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgZXF1aXBtZW50IjsKLQljYXNlIDB4MTEwQjoKLQkJcmV0dXJuICJDb250cm9sbGVyIGRvZXMgb25seSBzdXBwb3J0IGV4dGVybmFsIGVxdWlwbWVudCI7Ci0KLS8qLS0gZXJyb3IgaW5mb3JtYXRpb24gY29uY2VybmluZyByZXNvdXJjZSAvIGNvZGluZyBwcm9ibGVtcyAtLS0tLSovCi0JY2FzZSAweDIwMDE6Ci0JCXJldHVybiAiTWVzc2FnZSBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgc3RhdGUiOwotCWNhc2UgMHgyMDAyOgotCQlyZXR1cm4gIklsbGVnYWwgQ29udHJvbGxlciAvIFBMQ0kgLyBOQ0NJIjsKLQljYXNlIDB4MjAwMzoKLQkJcmV0dXJuICJPdXQgb2YgUExDSSI7Ci0JY2FzZSAweDIwMDQ6Ci0JCXJldHVybiAiT3V0IG9mIE5DQ0kiOwotCWNhc2UgMHgyMDA1OgotCQlyZXR1cm4gIk91dCBvZiBMSVNURU4iOwotCWNhc2UgMHgyMDA2OgotCQlyZXR1cm4gIk91dCBvZiBGQVggcmVzb3VyY2VzIChwcm90b2NvbCBULjMwKSI7Ci0JY2FzZSAweDIwMDc6Ci0JCXJldHVybiAiSWxsZWdhbCBtZXNzYWdlIHBhcmFtZXRlciBjb2RpbmciOwotCi0vKi0tIGVycm9yIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgcmVxdWVzdGVkIHNlcnZpY2VzICAtLS0tLSovCi0JY2FzZSAweDMwMDE6Ci0JCXJldHVybiAiQjEgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDMwMDI6Ci0JCXJldHVybiAiQjIgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDMwMDM6Ci0JCXJldHVybiAiQjMgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDMwMDQ6Ci0JCXJldHVybiAiQjEgcHJvdG9jb2wgcGFyYW1ldGVyIG5vdCBzdXBwb3J0ZWQiOwotCWNhc2UgMHgzMDA1OgotCQlyZXR1cm4gIkIyIHByb3RvY29sIHBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIjsKLQljYXNlIDB4MzAwNjoKLQkJcmV0dXJuICJCMyBwcm90b2NvbCBwYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDMwMDc6Ci0JCXJldHVybiAiQiBwcm90b2NvbCBjb21iaW5hdGlvbiBub3Qgc3VwcG9ydGVkIjsKLQljYXNlIDB4MzAwODoKLQkJcmV0dXJuICJOQ1BJIG5vdCBzdXBwb3J0ZWQiOwotCWNhc2UgMHgzMDA5OgotCQlyZXR1cm4gIkNJUCBWYWx1ZSB1bmtub3duIjsKLQljYXNlIDB4MzAwQToKLQkJcmV0dXJuICJGbGFncyBub3Qgc3VwcG9ydGVkIChyZXNlcnZlZCBiaXRzKSI7Ci0JY2FzZSAweDMwMEI6Ci0JCXJldHVybiAiRmFjaWxpdHkgbm90IHN1cHBvcnRlZCI7Ci0JY2FzZSAweDMwMEM6Ci0JCXJldHVybiAiRGF0YSBsZW5ndGggbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sIjsKLQljYXNlIDB4MzAwRDoKLQkJcmV0dXJuICJSZXNldCBwcm9jZWR1cmUgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHByb3RvY29sIjsKLQotLyotLSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIGNsZWFyaW5nIG9mIGEgcGh5c2ljYWwgY29ubmVjdGlvbiAtLS0tLSovCi0JY2FzZSAweDMzMDE6Ci0JCXJldHVybiAiUHJvdG9jb2wgZXJyb3IgbGF5ZXIgMSAoYnJva2VuIGxpbmUgb3IgQi1jaGFubmVsIHJlbW92ZWQgYnkgc2lnbmFsbGluZyBwcm90b2NvbCkiOwotCWNhc2UgMHgzMzAyOgotCQlyZXR1cm4gIlByb3RvY29sIGVycm9yIGxheWVyIDIiOwotCWNhc2UgMHgzMzAzOgotCQlyZXR1cm4gIlByb3RvY29sIGVycm9yIGxheWVyIDMiOwotCWNhc2UgMHgzMzA0OgotCQlyZXR1cm4gIkFub3RoZXIgYXBwbGljYXRpb24gZ290IHRoYXQgY2FsbCI7Ci0vKi0tIFQuMzAgc3BlY2lmaWMgcmVhc29ucyAtLS0tLSovCi0JY2FzZSAweDMzMTE6Ci0JCXJldHVybiAiQ29ubmVjdGluZyBub3Qgc3VjY2Vzc2Z1bCAocmVtb3RlIHN0YXRpb24gaXMgbm8gRkFYIEczIG1hY2hpbmUpIjsKLQljYXNlIDB4MzMxMjoKLQkJcmV0dXJuICJDb25uZWN0aW5nIG5vdCBzdWNjZXNzZnVsICh0cmFpbmluZyBlcnJvcikiOwotCWNhc2UgMHgzMzEzOgotCQlyZXR1cm4gIkRpc2Nvbm5lY3RlZCBiZWZvcmUgdHJhbnNmZXIgKHJlbW90ZSBzdGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNmZXIgbW9kZSwgZS5nLiByZXNvbHV0aW9uKSI7Ci0JY2FzZSAweDMzMTQ6Ci0JCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAocmVtb3RlIGFib3J0KSI7Ci0JY2FzZSAweDMzMTU6Ci0JCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAocmVtb3RlIHByb2NlZHVyZSBlcnJvciwgZS5nLiB1bnN1Y2Nlc3NmdWwgcmVwZXRpdGlvbiBvZiBULjMwIGNvbW1hbmRzKSI7Ci0JY2FzZSAweDMzMTY6Ci0JCXJldHVybiAiRGlzY29ubmVjdGVkIGR1cmluZyB0cmFuc2ZlciAobG9jYWwgdHggZGF0YSB1bmRlcnJ1bikiOwotCWNhc2UgMHgzMzE3OgotCQlyZXR1cm4gIkRpc2Nvbm5lY3RlZCBkdXJpbmcgdHJhbnNmZXIgKGxvY2FsIHJ4IGRhdGEgb3ZlcmZsb3cpIjsKLQljYXNlIDB4MzMxODoKLQkJcmV0dXJuICJEaXNjb25uZWN0ZWQgZHVyaW5nIHRyYW5zZmVyIChsb2NhbCBhYm9ydCkiOwotCWNhc2UgMHgzMzE5OgotCQlyZXR1cm4gIklsbGVnYWwgcGFyYW1ldGVyIGNvZGluZyAoZS5nLiBTRkYgY29kaW5nIGVycm9yKSI7Ci0KLS8qLS0gZGlzY29ubmVjdCBjYXVzZXMgZnJvbSB0aGUgbmV0d29yayBhY2NvcmRpbmcgdG8gRVRTIDMwMCAxMDItMS9RLjkzMSAtLS0tLSovCi0JY2FzZSAweDM0ODE6IHJldHVybiAiVW5hbGxvY2F0ZWQgKHVuYXNzaWduZWQpIG51bWJlciI7Ci0JY2FzZSAweDM0ODI6IHJldHVybiAiTm8gcm91dGUgdG8gc3BlY2lmaWVkIHRyYW5zaXQgbmV0d29yayI7Ci0JY2FzZSAweDM0ODM6IHJldHVybiAiTm8gcm91dGUgdG8gZGVzdGluYXRpb24iOwotCWNhc2UgMHgzNDg2OiByZXR1cm4gIkNoYW5uZWwgdW5hY2NlcHRhYmxlIjsKLQljYXNlIDB4MzQ4NzoKLQkJcmV0dXJuICJDYWxsIGF3YXJkZWQgYW5kIGJlaW5nIGRlbGl2ZXJlZCBpbiBhbiBlc3RhYmxpc2hlZCBjaGFubmVsIjsKLQljYXNlIDB4MzQ5MDogcmV0dXJuICJOb3JtYWwgY2FsbCBjbGVhcmluZyI7Ci0JY2FzZSAweDM0OTE6IHJldHVybiAiVXNlciBidXN5IjsKLQljYXNlIDB4MzQ5MjogcmV0dXJuICJObyB1c2VyIHJlc3BvbmRpbmciOwotCWNhc2UgMHgzNDkzOiByZXR1cm4gIk5vIGFuc3dlciBmcm9tIHVzZXIgKHVzZXIgYWxlcnRlZCkiOwotCWNhc2UgMHgzNDk1OiByZXR1cm4gIkNhbGwgcmVqZWN0ZWQiOwotCWNhc2UgMHgzNDk2OiByZXR1cm4gIk51bWJlciBjaGFuZ2VkIjsKLQljYXNlIDB4MzQ5QTogcmV0dXJuICJOb24tc2VsZWN0ZWQgdXNlciBjbGVhcmluZyI7Ci0JY2FzZSAweDM0OUI6IHJldHVybiAiRGVzdGluYXRpb24gb3V0IG9mIG9yZGVyIjsKLQljYXNlIDB4MzQ5QzogcmV0dXJuICJJbnZhbGlkIG51bWJlciBmb3JtYXQiOwotCWNhc2UgMHgzNDlEOiByZXR1cm4gIkZhY2lsaXR5IHJlamVjdGVkIjsKLQljYXNlIDB4MzQ5RTogcmV0dXJuICJSZXNwb25zZSB0byBTVEFUVVMgRU5RVUlSWSI7Ci0JY2FzZSAweDM0OUY6IHJldHVybiAiTm9ybWFsLCB1bnNwZWNpZmllZCI7Ci0JY2FzZSAweDM0QTI6IHJldHVybiAiTm8gY2lyY3VpdCAvIGNoYW5uZWwgYXZhaWxhYmxlIjsKLQljYXNlIDB4MzRBNjogcmV0dXJuICJOZXR3b3JrIG91dCBvZiBvcmRlciI7Ci0JY2FzZSAweDM0QTk6IHJldHVybiAiVGVtcG9yYXJ5IGZhaWx1cmUiOwotCWNhc2UgMHgzNEFBOiByZXR1cm4gIlN3aXRjaGluZyBlcXVpcG1lbnQgY29uZ2VzdGlvbiI7Ci0JY2FzZSAweDM0QUI6IHJldHVybiAiQWNjZXNzIGluZm9ybWF0aW9uIGRpc2NhcmRlZCI7Ci0JY2FzZSAweDM0QUM6IHJldHVybiAiUmVxdWVzdGVkIGNpcmN1aXQgLyBjaGFubmVsIG5vdCBhdmFpbGFibGUiOwotCWNhc2UgMHgzNEFGOiByZXR1cm4gIlJlc291cmNlcyB1bmF2YWlsYWJsZSwgdW5zcGVjaWZpZWQiOwotCWNhc2UgMHgzNEIxOiByZXR1cm4gIlF1YWxpdHkgb2Ygc2VydmljZSB1bmF2YWlsYWJsZSI7Ci0JY2FzZSAweDM0QjI6IHJldHVybiAiUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBzdWJzY3JpYmVkIjsKLQljYXNlIDB4MzRCOTogcmV0dXJuICJCZWFyZXIgY2FwYWJpbGl0eSBub3QgYXV0aG9yaXplZCI7Ci0JY2FzZSAweDM0QkE6IHJldHVybiAiQmVhcmVyIGNhcGFiaWxpdHkgbm90IHByZXNlbnRseSBhdmFpbGFibGUiOwotCWNhc2UgMHgzNEJGOiByZXR1cm4gIlNlcnZpY2Ugb3Igb3B0aW9uIG5vdCBhdmFpbGFibGUsIHVuc3BlY2lmaWVkIjsKLQljYXNlIDB4MzRDMTogcmV0dXJuICJCZWFyZXIgY2FwYWJpbGl0eSBub3QgaW1wbGVtZW50ZWQiOwotCWNhc2UgMHgzNEMyOiByZXR1cm4gIkNoYW5uZWwgdHlwZSBub3QgaW1wbGVtZW50ZWQiOwotCWNhc2UgMHgzNEM1OiByZXR1cm4gIlJlcXVlc3RlZCBmYWNpbGl0eSBub3QgaW1wbGVtZW50ZWQiOwotCWNhc2UgMHgzNEM2OiByZXR1cm4gIk9ubHkgcmVzdHJpY3RlZCBkaWdpdGFsIGluZm9ybWF0aW9uIGJlYXJlciBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZSI7Ci0JY2FzZSAweDM0Q0Y6IHJldHVybiAiU2VydmljZSBvciBvcHRpb24gbm90IGltcGxlbWVudGVkLCB1bnNwZWNpZmllZCI7Ci0JY2FzZSAweDM0RDE6IHJldHVybiAiSW52YWxpZCBjYWxsIHJlZmVyZW5jZSB2YWx1ZSI7Ci0JY2FzZSAweDM0RDI6IHJldHVybiAiSWRlbnRpZmllZCBjaGFubmVsIGRvZXMgbm90IGV4aXN0IjsKLQljYXNlIDB4MzREMzogcmV0dXJuICJBIHN1c3BlbmRlZCBjYWxsIGV4aXN0cywgYnV0IHRoaXMgY2FsbCBpZGVudGl0eSBkb2VzIG5vdCI7Ci0JY2FzZSAweDM0RDQ6IHJldHVybiAiQ2FsbCBpZGVudGl0eSBpbiB1c2UiOwotCWNhc2UgMHgzNEQ1OiByZXR1cm4gIk5vIGNhbGwgc3VzcGVuZGVkIjsKLQljYXNlIDB4MzRENjogcmV0dXJuICJDYWxsIGhhdmluZyB0aGUgcmVxdWVzdGVkIGNhbGwgaWRlbnRpdHkgaGFzIGJlZW4gY2xlYXJlZCI7Ci0JY2FzZSAweDM0RDg6IHJldHVybiAiSW5jb21wYXRpYmxlIGRlc3RpbmF0aW9uIjsKLQljYXNlIDB4MzREQjogcmV0dXJuICJJbnZhbGlkIHRyYW5zaXQgbmV0d29yayBzZWxlY3Rpb24iOwotCWNhc2UgMHgzNERGOiByZXR1cm4gIkludmFsaWQgbWVzc2FnZSwgdW5zcGVjaWZpZWQiOwotCWNhc2UgMHgzNEUwOiByZXR1cm4gIk1hbmRhdG9yeSBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIG1pc3NpbmciOwotCWNhc2UgMHgzNEUxOiByZXR1cm4gIk1lc3NhZ2UgdHlwZSBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIjsKLQljYXNlIDB4MzRFMjogcmV0dXJuICJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggY2FsbCBzdGF0ZSBvciBtZXNzYWdlIHR5cGUgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCI7Ci0JY2FzZSAweDM0RTM6IHJldHVybiAiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIjsKLQljYXNlIDB4MzRFNDogcmV0dXJuICJJbnZhbGlkIGluZm9ybWF0aW9uIGVsZW1lbnQgY29udGVudHMiOwotCWNhc2UgMHgzNEU1OiByZXR1cm4gIk1lc3NhZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBjYWxsIHN0YXRlIjsKLQljYXNlIDB4MzRFNjogcmV0dXJuICJSZWNvdmVyeSBvbiB0aW1lciBleHBpcnkiOwotCWNhc2UgMHgzNEVGOiByZXR1cm4gIlByb3RvY29sIGVycm9yLCB1bnNwZWNpZmllZCI7Ci0JY2FzZSAweDM0RkY6IHJldHVybiAiSW50ZXJ3b3JraW5nLCB1bnNwZWNpZmllZCI7Ci0KLQlkZWZhdWx0OiByZXR1cm4gIk5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iOwotCX0KLX0KLSNlbmRpZgotCiB0eXBlZGVmIHN0cnVjdCB7CiAJaW50IHR5cDsKIAlzaXplX3Qgb2ZmOwpAQCAtMTA3Myw0ICs4NzQsMyBAQAogRVhQT1JUX1NZTUJPTChjYXBpX2NtZDJzdHIpOwogRVhQT1JUX1NZTUJPTChjYXBpX2Ntc2cyc3RyKTsKIEVYUE9SVF9TWU1CT0woY2FwaV9tZXNzYWdlMnN0cik7Ci1FWFBPUlRfU1lNQk9MKGNhcGlfaW5mbzJzdHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmMKaW5kZXggNDE0ZGJmNi4uZmM5ZjlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5jCkBAIC0xOTcsMjUgKzE5Nyw2IEBACiAKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaW5saW5lIGZ1bmN0aW9uIGRlZmluZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0JLyogaW5saW5lIGZ1bmN0aW9ucyBtZW1vcnkgbWFwcGVkICovCi0KLS8qIG1lbW9yeSB3cml0ZSBhbmQgZHVtbXkgSU8gcmVhZCB0byBhdm9pZCBQQ0kgYnl0ZSBtZXJnZSBwcm9ibGVtcyAqLwotI2RlZmluZSBXcml0ZV9oZmM4KGEsIGIsIGMpIHsoKigodm9sYXRpbGUgdV9jaGFyICopKGEtPm1lbWJhc2UgKyBiKSkgPSBjKTsgaW5iKGEtPmlvYmFzZSArIDQpO30KLS8qIG1lbW9yeSB3cml0ZSB3aXRob3V0IGR1bW15IElPIGFjY2VzcyBmb3IgZmlmbyBkYXRhIGFjY2VzcyAqLwotI2RlZmluZSBmV3JpdGVfaGZjOChhLCBiLCBjKSAoKigodm9sYXRpbGUgdV9jaGFyICopKGEtPm1lbWJhc2UgKyBiKSkgPSBjKQotI2RlZmluZSBSZWFkX2hmYzgoYSwgYikgKCooKHZvbGF0aWxlIHVfY2hhciAqKShhLT5tZW1iYXNlICsgYikpKQotI2RlZmluZSBXcml0ZV9oZmMxNihhLCBiLCBjKSAoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYS0+bWVtYmFzZSArIGIpKSA9IGMpCi0jZGVmaW5lIFJlYWRfaGZjMTYoYSwgYikgKCooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEtPm1lbWJhc2UgKyBiKSkpCi0jZGVmaW5lIFdyaXRlX2hmYzMyKGEsIGIsIGMpICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKGEtPm1lbWJhc2UgKyBiKSkgPSBjKQotI2RlZmluZSBSZWFkX2hmYzMyKGEsIGIpICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKGEtPm1lbWJhc2UgKyBiKSkpCi0jZGVmaW5lIHdhaXRfYnVzeShhKSB7d2hpbGUgKChSZWFkX2hmYzgoYSwgUl9TVEFUVVMpICYgTV9CVVNZKSk7fQotI2RlZmluZSBQQ0lfRU5BX01FTUlPCTB4MDMKLQotI2Vsc2UKLQogLyogaW5saW5lIGZ1bmN0aW9ucyBpbyBtYXBwZWQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogU2V0UmVnQWRkcihoZmM0czhzX2h3ICphLCB1X2NoYXIgYikKQEAgLTMwNiw4ICsyODcsNiBAQAogCiAjZGVmaW5lIFBDSV9FTkFfUkVHSU8JMHgwMQogCi0jZW5kaWYJCQkJLyogSElTQVhfSEZDNFM4U19QQ0lNRU0gKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZ1bmN0aW9uIHRvIHJlYWQgY3JpdGljYWwgY291bnRlciByZWdpc3RlcnMgdGhhdCAgICovCiAvKiBtYXkgYmUgdXBkYXRlZCBieSB0aGUgY2hpcCBkdXJpbmcgcmVhZCAgICAgICAgICAgICAqLwpAQCAtNzI0LDI2ICs3MDMsMTUgQEAKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCS8qIHJlYWQgZXJyb3Jub3VzIEQgZnJhbWUgKi8KLQotI2lmbmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQogCQkJCVNldFJlZ0FkZHIobDFwLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbmRpZgogCiAJCQkJd2hpbGUgKHoxID49IDQpIHsKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCQkJCQlSZWFkX2hmYzMyKGwxcC0+aHcsIEFfRklGT19EQVRBMCk7Ci0jZWxzZQogCQkJCQlmUmVhZF9oZmMzMihsMXAtPmh3KTsKLSNlbmRpZgogCQkJCQl6MSAtPSA0OwogCQkJCX0KIAogCQkJCXdoaWxlICh6MS0tKQotI2lmZGVmIEhJU0FYX0hGQzRTOFNfUENJTUVNCi0JCQkJCVJlYWRfaGZjOChsMXAtPmh3LCBBX0ZJRk9fREFUQTApOwotI2Vsc2UKLQkJCQlmUmVhZF9oZmM4KGwxcC0+aHcpOwotI2VuZGlmCisJCQkJCWZSZWFkX2hmYzgobDFwLT5odyk7CiAKIAkJCQlXcml0ZV9oZmM4KGwxcC0+aHcsIEFfSU5DX1JFU19GSUZPLCAxKTsKIAkJCQl3YWl0X2J1c3kobDFwLT5odyk7CkBAIC03NTMsMjcgKzcyMSwxNiBAQAogCiAJCWNwID0gc2tiLT5kYXRhOwogCi0jaWZuZGVmIEhJU0FYX0hGQzRTOFNfUENJTUVNCiAJCVNldFJlZ0FkZHIobDFwLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbmRpZgogCiAJCXdoaWxlICh6MSA+PSA0KSB7Ci0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KLQkJCSooKHVuc2lnbmVkIGxvbmcgKikgY3ApID0KLQkJCQlSZWFkX2hmYzMyKGwxcC0+aHcsIEFfRklGT19EQVRBMCk7Ci0jZWxzZQogCQkJKigodW5zaWduZWQgbG9uZyAqKSBjcCkgPSBmUmVhZF9oZmMzMihsMXAtPmh3KTsKLSNlbmRpZgogCQkJY3AgKz0gNDsKIAkJCXoxIC09IDQ7CiAJCX0KIAogCQl3aGlsZSAoejEtLSkKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCQkJKmNwKysgPSBSZWFkX2hmYzgobDFwLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbHNlCi0JCSpjcCsrID0gZlJlYWRfaGZjOChsMXAtPmh3KTsKLSNlbmRpZgorCQkJKmNwKysgPSBmUmVhZF9oZmM4KGwxcC0+aHcpOwogCiAJCVdyaXRlX2hmYzgobDFwLT5odywgQV9JTkNfUkVTX0ZJRk8sIDEpOwkvKiBpbmNyZW1lbnQgZiBjb3VudGVyICovCiAJCXdhaXRfYnVzeShsMXAtPmh3KTsKQEAgLTg1OSwyOCArODE2LDE3IEBACiAJCQl3YWl0X2J1c3kobDEtPmh3KTsKIAkJCXJldHVybjsKIAkJfQotI2lmbmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQogCQlTZXRSZWdBZGRyKGwxLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbmRpZgogCiAJCXdoaWxlICh6MSA+PSA0KSB7Ci0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KLQkJCSooKHVuc2lnbmVkIGxvbmcgKikgYmNoLT5yeF9wdHIpID0KLQkJCQlSZWFkX2hmYzMyKGwxLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbHNlCiAJCQkqKCh1bnNpZ25lZCBsb25nICopIGJjaC0+cnhfcHRyKSA9CiAJCQkJZlJlYWRfaGZjMzIobDEtPmh3KTsKLSNlbmRpZgogCQkJYmNoLT5yeF9wdHIgKz0gNDsKIAkJCXoxIC09IDQ7CiAJCX0KIAogCQl3aGlsZSAoejEtLSkKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCQkJKihiY2gtPnJ4X3B0cisrKSA9IFJlYWRfaGZjOChsMS0+aHcsIEFfRklGT19EQVRBMCk7Ci0jZWxzZQotCQkqKGJjaC0+cnhfcHRyKyspID0gZlJlYWRfaGZjOChsMS0+aHcpOwotI2VuZGlmCisJCQkqKGJjaC0+cnhfcHRyKyspID0gZlJlYWRfaGZjOChsMS0+aHcpOwogCiAJCWlmIChoZGxjX2NvbXBsZXRlKSB7CiAJCQkvKiBpbmNyZW1lbnQgZiBjb3VudGVyICovCkBAIC05NDAsMjkgKzg4NiwxNyBAQAogCWlmICgoc2tiID0gc2tiX2RlcXVldWUoJmwxcC0+ZF90eF9xdWV1ZSkpKSB7CiAJCWNwID0gc2tiLT5kYXRhOwogCQljbnQgPSBza2ItPmxlbjsKLSNpZm5kZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KIAkJU2V0UmVnQWRkcihsMXAtPmh3LCBBX0ZJRk9fREFUQTApOwotI2VuZGlmCiAKIAkJd2hpbGUgKGNudCA+PSA0KSB7Ci0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KLQkJCWZXcml0ZV9oZmMzMihsMXAtPmh3LCBBX0ZJRk9fREFUQTAsCi0JCQkJICAgICAqKHVuc2lnbmVkIGxvbmcgKikgY3ApOwotI2Vsc2UKIAkJCVNldFJlZ0FkZHIobDFwLT5odywgQV9GSUZPX0RBVEEwKTsKIAkJCWZXcml0ZV9oZmMzMihsMXAtPmh3LCAqKHVuc2lnbmVkIGxvbmcgKikgY3ApOwotI2VuZGlmCiAJCQljcCArPSA0OwogCQkJY250IC09IDQ7CiAJCX0KIAotI2lmZGVmIEhJU0FYX0hGQzRTOFNfUENJTUVNCi0JCXdoaWxlIChjbnQtLSkKLQkJCWZXcml0ZV9oZmM4KGwxcC0+aHcsIEFfRklGT19EQVRBMCwgKmNwKyspOwotI2Vsc2UKIAkJd2hpbGUgKGNudC0tKQogCQkJZldyaXRlX2hmYzgobDFwLT5odywgKmNwKyspOwotI2VuZGlmCiAKIAkJbDFwLT50eF9jbnQgPSBza2ItPnRydWVzaXplOwogCQlXcml0ZV9oZmM4KGwxcC0+aHcsIEFfSU5DX1JFU19GSUZPLCAxKTsJLyogaW5jcmVtZW50IGYgY291bnRlciAqLwpAQCAtMTAzNywyNiArOTcxLDE1IEBACiAJCWNwID0gc2tiLT5kYXRhICsgYmNoLT50eF9jbnQ7CiAJCWJjaC0+dHhfY250ICs9IGNudDsKIAotI2lmbmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQogCQlTZXRSZWdBZGRyKGwxLT5odywgQV9GSUZPX0RBVEEwKTsKLSNlbmRpZgogCQl3aGlsZSAoY250ID49IDQpIHsKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCQkJZldyaXRlX2hmYzMyKGwxLT5odywgQV9GSUZPX0RBVEEwLAotCQkJCSAgICAgKih1bnNpZ25lZCBsb25nICopIGNwKTsKLSNlbHNlCiAJCQlmV3JpdGVfaGZjMzIobDEtPmh3LCAqKHVuc2lnbmVkIGxvbmcgKikgY3ApOwotI2VuZGlmCiAJCQljcCArPSA0OwogCQkJY250IC09IDQ7CiAJCX0KIAogCQl3aGlsZSAoY250LS0pCi0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KLQkJCWZXcml0ZV9oZmM4KGwxLT5odywgQV9GSUZPX0RBVEEwLCAqY3ArKyk7Ci0jZWxzZQotCQlmV3JpdGVfaGZjOChsMS0+aHcsICpjcCsrKTsKLSNlbmRpZgorCQkJZldyaXRlX2hmYzgobDEtPmh3LCAqY3ArKyk7CiAKIAkJaWYgKGJjaC0+dHhfY250ID49IHNrYi0+bGVuKSB7CiAJCQlpZiAoYmNoLT5tb2RlID09IEwxX01PREVfSERMQykgewpAQCAtMTI4MSwxMCArMTIwNCw4IEBACiAJaWYgKCFodyB8fCAhKGh3LT5tci5yX2lycV9jdHJsICYgTV9HTE9CX0lSUV9FTikpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotI2lmbmRlZglISVNBWF9IRkM0UzhTX1BDSU1FTQogCS8qIHJlYWQgY3VycmVudCBzZWxlY3RlZCByZWdzaXN0ZXIgKi8KIAlvbGRfaW9yZWcgPSBHZXRSZWdBZGRyKGh3KTsKLSNlbmRpZgogCiAJLyogTGF5ZXIgMSBTdGF0ZSBjaGFuZ2UgKi8KIAlody0+bXIucl9pcnFfc3RhdGVjaCB8PQpAQCAtMTI5Miw5ICsxMjEzLDcgQEAKIAlpZiAoIQogCSAgICAoYiA9IChSZWFkX2hmYzgoaHcsIFJfU1RBVFVTKSAmIChNX01JU0NfSVJRU1RBIHwgTV9GUl9JUlFTVEEpKSkKIAkgICAgJiYgIWh3LT5tci5yX2lycV9zdGF0ZWNoKSB7Ci0jaWZuZGVmCUhJU0FYX0hGQzRTOFNfUENJTUVNCiAJCVNldFJlZ0FkZHIoaHcsIG9sZF9pb3JlZyk7Ci0jZW5kaWYKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMTMyMiw5ICsxMjQxLDcgQEAKIAkvKiBxdWV1ZSB0aGUgcmVxdWVzdCB0byBhbGxvdyBvdGhlciBjYXJkcyB0byBpbnRlcnJ1cHQgKi8KIAlzY2hlZHVsZV93b3JrKCZody0+dHF1ZXVlKTsKIAotI2lmbmRlZglISVNBWF9IRkM0UzhTX1BDSU1FTQogCVNldFJlZ0FkZHIoaHcsIG9sZF9pb3JlZyk7Ci0jZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CQkJCS8qIGhmYzRzOHNfaW50ZXJydXB0ICovCiAKQEAgLTE0NzEsMTMgKzEzODgsOCBAQAogcmVsZWFzZV9wY2lfcG9ydHMoaGZjNHM4c19odyAqaHcpCiB7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfQ09NTUFORCwgMCk7Ci0jaWZkZWYgSElTQVhfSEZDNFM4U19QQ0lNRU0KLQlpZiAoaHctPm1lbWJhc2UpCi0JCWlvdW5tYXAoKHZvaWQgKikgaHctPm1lbWJhc2UpOwotI2Vsc2UKIAlpZiAoaHctPmlvYmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oaHctPmlvYmFzZSwgOCk7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTQ4NiwxMSArMTM5OCw3IEBACiBzdGF0aWMgdm9pZAogZW5hYmxlX3BjaV9wb3J0cyhoZmM0czhzX2h3ICpodykKIHsKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX0NPTU1BTkQsIFBDSV9FTkFfTUVNSU8pOwotI2Vsc2UKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaHctPnBkZXYsIFBDSV9DT01NQU5ELCBQQ0lfRU5BX1JFR0lPKTsKLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE1NjEsMTUgKzE0NjksOSBAQAogCQkgICAgICAgaHctPmlycSk7CiAJCWdvdG8gb3V0OwogCX0KLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIkhGQy00Uy84UzogZm91bmQgUENJIGNhcmQgYXQgbWVtYmFzZSAweCVwLCBpcnEgJWRcbiIsCi0JICAgICAgIGh3LT5od19tZW1iYXNlLCBody0+aXJxKTsKLSNlbHNlCiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiSEZDLTRTLzhTOiBmb3VuZCBQQ0kgY2FyZCBhdCBpb2Jhc2UgMHgleCwgaXJxICVkXG4iLAogCSAgICAgICBody0+aW9iYXNlLCBody0+aXJxKTsKLSNlbmRpZgogCiAJaGZjX2hhcmR3YXJlX2VuYWJsZShodywgMSwgMCk7CiAKQEAgLTE2MTQsMTcgKzE1MTYsMTIgQEAKIAlody0+aXJxID0gcGRldi0+aXJxOwogCWh3LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAKLSNpZmRlZiBISVNBWF9IRkM0UzhTX1BDSU1FTQotCWh3LT5od19tZW1iYXNlID0gKHVfY2hhciAqKSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0JaHctPm1lbWJhc2UgPSBpb3JlbWFwKCh1bG9uZykgaHctPmh3X21lbWJhc2UsIDI1Nik7Ci0jZWxzZQogCWlmICghcmVxdWVzdF9yZWdpb24oaHctPmlvYmFzZSwgOCwgaHctPmNhcmRfbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgIkhGQy00Uy84UzogZmFpbGVkIHRvIHJlcXVlc3QgYWRkcmVzcyBzcGFjZSBhdCAweCUwNHhcbiIsCiAJCSAgICAgICBody0+aW9iYXNlKTsKIAkJZ290byBvdXQ7CiAJfQotI2VuZGlmCiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOwogCWVyciA9IHNldHVwX2luc3RhbmNlKGh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYwppbmRleCBhNWRhNTExLi42MWFjNjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCkBAIC02MzQsNyArNjM0LDcgQEAKICNpZmRlZiBDT05GSUdfSVBQUF9GSUxURVIKIAljYXNlIFBQUElPQ1NQQVNTOgogCXsKLQkJc3RydWN0IHNvY2tfZnByb2cgZnByb2c7CisJCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gZnByb2c7CiAJCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZTsKIAkJaW50IGVyciwgbGVuID0gZ2V0X2ZpbHRlcihhcmdwLCAmY29kZSk7CiAKQEAgLTY1Myw3ICs2NTMsNyBAQAogCX0KIAljYXNlIFBQUElPQ1NBQ1RJVkU6CiAJewotCQlzdHJ1Y3Qgc29ja19mcHJvZyBmcHJvZzsKKwkJc3RydWN0IHNvY2tfZnByb2dfa2VybiBmcHJvZzsKIAkJc3RydWN0IHNvY2tfZmlsdGVyICpjb2RlOwogCQlpbnQgZXJyLCBsZW4gPSBnZXRfZmlsdGVyKGFyZ3AsICZjb2RlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2wxb2lwX2NvcmUuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9sMW9pcF9jb3JlLmMKaW5kZXggMmMwZDJjMi4uOWY0NTRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2wxb2lwX2NvcmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vbDFvaXBfY29yZS5jCkBAIC0yODcsMTEgKzI4Nyw5IEBACiAJcCA9IGZyYW1lOwogCiAJLyogcmVzdGFydCB0aW1lciAqLwotCWlmICgoaW50KShoYy0+a2VlcF90bC5leHBpcmVzLWppZmZpZXMpIDwgNSAqIEhaKSB7Ci0JCWRlbF90aW1lcigmaGMtPmtlZXBfdGwpOwotCQloYy0+a2VlcF90bC5leHBpcmVzID0gamlmZmllcyArIEwxT0lQX0tFRVBBTElWRSAqIEhaOwotCQlhZGRfdGltZXIoJmhjLT5rZWVwX3RsKTsKLQl9IGVsc2UKKwlpZiAodGltZV9iZWZvcmUoaGMtPmtlZXBfdGwuZXhwaXJlcywgamlmZmllcyArIDUgKiBIWikpCisJCW1vZF90aW1lcigmaGMtPmtlZXBfdGwsIGppZmZpZXMgKyBMMU9JUF9LRUVQQUxJVkUgKiBIWik7CisJZWxzZQogCQloYy0+a2VlcF90bC5leHBpcmVzID0gamlmZmllcyArIEwxT0lQX0tFRVBBTElWRSAqIEhaOwogCiAJaWYgKGRlYnVnICYgREVCVUdfTDFPSVBfTVNHKQpAQCAtNjIxLDExICs2MTksOSBAQAogCQlnb3RvIG11bHRpZnJhbWU7CiAKIAkvKiByZXN0YXJ0IHRpbWVyICovCi0JaWYgKChpbnQpKGhjLT50aW1lb3V0X3RsLmV4cGlyZXMtamlmZmllcykgPCA1ICogSFogfHwgIWhjLT50aW1lb3V0X29uKSB7CisJaWYgKHRpbWVfYmVmb3JlKGhjLT50aW1lb3V0X3RsLmV4cGlyZXMsIGppZmZpZXMgKyA1ICogSFopIHx8ICFoYy0+dGltZW91dF9vbikgewogCQloYy0+dGltZW91dF9vbiA9IDE7Ci0JCWRlbF90aW1lcigmaGMtPnRpbWVvdXRfdGwpOwotCQloYy0+dGltZW91dF90bC5leHBpcmVzID0gamlmZmllcyArIEwxT0lQX1RJTUVPVVQgKiBIWjsKLQkJYWRkX3RpbWVyKCZoYy0+dGltZW91dF90bCk7CisJCW1vZF90aW1lcigmaGMtPnRpbWVvdXRfdGwsIGppZmZpZXMgKyBMMU9JUF9USU1FT1VUICogSFopOwogCX0gZWxzZSAvKiBvbmx5IGFkanVzdCB0aW1lciAqLwogCQloYy0+dGltZW91dF90bC5leHBpcmVzID0gamlmZmllcyArIEwxT0lQX1RJTUVPVVQgKiBIWjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwppbmRleCAwODk4NDFjLi5hMWIwNDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwpAQCAtMzAwLDE2ICszMDAsNiBAQAogCSAgTEVEIGRyaXZlciBjaGlwIGFjY2Vzc2VkIHZpYSB0aGUgSTJDIGJ1cy4gU3VwcG9ydGVkCiAJICBkZXZpY2VzIGluY2x1ZGUgUENBOTYzMyBhbmQgUENBOTYzNAogCi1jb25maWcgTEVEU19QQ0E5Njg1Ci0JdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBQQ0E5Njg1IEkyQyBjaGlwIgotCWRlcGVuZHMgb24gTEVEU19DTEFTUwotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBMRURzIGNvbm5lY3RlZCB0byB0aGUgUENBOTY4NQotCSAgTEVEIGRyaXZlciBjaGlwIGFjY2Vzc2VkIHZpYSB0aGUgSTJDIGJ1cy4KLQkgIFRoZSBQQ0E5Njg1IG9mZmVycyAxMi1iaXQgUFdNICg0MDk1IGxldmVscyBvZiBicmlnaHRuZXNzKSBvbgotCSAgMTYgaW5kaXZpZHVhbCBjaGFubmVscy4KLQogY29uZmlnIExFRFNfV004MzFYX1NUQVRVUwogCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBmb3Igc3RhdHVzIExFRHMgb24gV004MzF4IFBNSUNzIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCmluZGV4IDhiNGM5NTYuLjc5YzUxNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTM2LDcgKzM2LDYgQEAKIG9iai0kKENPTkZJR19MRURTX0ZTRykJCQkrPSBsZWRzLWZzZy5vCiBvYmotJChDT05GSUdfTEVEU19QQ0E5NTVYKQkJKz0gbGVkcy1wY2E5NTV4Lm8KIG9iai0kKENPTkZJR19MRURTX1BDQTk2M1gpCQkrPSBsZWRzLXBjYTk2M3gubwotb2JqLSQoQ09ORklHX0xFRFNfUENBOTY4NSkJCSs9IGxlZHMtcGNhOTY4NS5vCiBvYmotJChDT05GSUdfTEVEU19EQTkwM1gpCQkrPSBsZWRzLWRhOTAzeC5vCiBvYmotJChDT05GSUdfTEVEU19EQTkwNTIpCQkrPSBsZWRzLWRhOTA1Mi5vCiBvYmotJChDT05GSUdfTEVEU19XTTgzMVhfU1RBVFVTKQkrPSBsZWRzLXdtODMxeC1zdGF0dXMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2RlbGwtbGVkLmMgYi9kcml2ZXJzL2xlZHMvZGVsbC1sZWQuYwppbmRleCBlNWM1NzM4Li5jMzZhY2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvZGVsbC1sZWQuYworKysgYi9kcml2ZXJzL2xlZHMvZGVsbC1sZWQuYwpAQCAtMTUsMTIgKzE1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxsLWxlZC5oPgogCiBNT0RVTEVfQVVUSE9SKCJMb3VpcyBEYXZpcy9KaW0gRGFpbGV5Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRlbGwgTEVEIENvbnRyb2wgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgREVMTF9MRURfQklPU19HVUlEICJGNkU0RkU2RS05MDlELTQ3Y2ItOEJBQi1DOUY2RjJGOEQzOTYiCisjZGVmaW5lIERFTExfQVBQX0dVSUQgIkE4MDU5M0NFLUE5OTctMTFEQS1CMDEyLUI2MjJBMUVGNTQ5MiIKIE1PRFVMRV9BTElBUygid21pOiIgREVMTF9MRURfQklPU19HVUlEKTsKIAogLyogRXJyb3IgUmVzdWx0IENvZGVzOiAqLwpAQCAtMzksNiArNDIsMTQ5IEBACiAjZGVmaW5lIENNRF9MRURfT0ZGCTE3CiAjZGVmaW5lIENNRF9MRURfQkxJTksJMTgKIAorc3RydWN0IGFwcF93bWlfYXJncyB7CisJdTE2IGNsYXNzOworCXUxNiBzZWxlY3RvcjsKKwl1MzIgYXJnMTsKKwl1MzIgYXJnMjsKKwl1MzIgYXJnMzsKKwl1MzIgYXJnNDsKKwl1MzIgcmVzMTsKKwl1MzIgcmVzMjsKKwl1MzIgcmVzMzsKKwl1MzIgcmVzNDsKKwljaGFyIGR1bW15WzkyXTsKK307CisKKyNkZWZpbmUgR0xPQkFMX01JQ19NVVRFX0VOQUJMRQkweDM2NAorI2RlZmluZSBHTE9CQUxfTUlDX01VVEVfRElTQUJMRQkweDM2NQorCitzdHJ1Y3QgZGVsbF9iaW9zX2RhdGFfdG9rZW4geworCXUxNiB0b2tlbmlkOworCXUxNiBsb2NhdGlvbjsKKwl1MTYgdmFsdWU7Cit9OworCitzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkZWxsX2Jpb3NfY2FsbGluZ19pbnRlcmZhY2UgeworCXN0cnVjdAlkbWlfaGVhZGVyIGhlYWRlcjsKKwl1MTYJY21kX2lvX2FkZHI7CisJdTgJY21kX2lvX2NvZGU7CisJdTMyCXN1cHBvcnRlZF9jbWRzOworCXN0cnVjdAlkZWxsX2Jpb3NfZGF0YV90b2tlbiBkYW1hcFtdOworfTsKKworc3RhdGljIHN0cnVjdCBkZWxsX2Jpb3NfZGF0YV90b2tlbiBkZWxsX21pY190b2tlbnNbMl07CisKK3N0YXRpYyBpbnQgZGVsbF93bWlfcGVyZm9ybV9xdWVyeShzdHJ1Y3QgYXBwX3dtaV9hcmdzICphcmdzKQoreworCXN0cnVjdCBhcHBfd21pX2FyZ3MgKmJpb3NfcmV0dXJuOworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiByYyA9IC1FSU5WQUw7CisKKwlpbnB1dC5sZW5ndGggPSAxMjg7CisJaW5wdXQucG9pbnRlciA9IGFyZ3M7CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKERFTExfQVBQX0dVSUQsIDAsIDEsICZpbnB1dCwgJm91dHB1dCk7CisJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZ290byBlcnJfb3V0MDsKKworCW9iaiA9IG91dHB1dC5wb2ludGVyOworCWlmICghb2JqKQorCQlnb3RvIGVycl9vdXQwOworCisJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKQorCQlnb3RvIGVycl9vdXQxOworCisJYmlvc19yZXR1cm4gPSAoc3RydWN0IGFwcF93bWlfYXJncyAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJcmMgPSBiaW9zX3JldHVybi0+cmVzMTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDE7CisKKwltZW1jcHkoYXJncywgYmlvc19yZXR1cm4sIHNpemVvZihzdHJ1Y3QgYXBwX3dtaV9hcmdzKSk7CisJcmMgPSAwOworCisgZXJyX291dDE6CisJa2ZyZWUob2JqKTsKKyBlcnJfb3V0MDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBmaW5kX21pY211dGVfdG9rZW5zKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IGRlbGxfYmlvc19jYWxsaW5nX2ludGVyZmFjZSAqY2FsbGluZ19pbnRlcmZhY2U7CisJc3RydWN0IGRlbGxfYmlvc19kYXRhX3Rva2VuICp0b2tlbjsKKwlpbnQgdG9rZW5fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGVsbF9iaW9zX2RhdGFfdG9rZW4pOworCWludCBpID0gMDsKKworCWlmIChkbS0+dHlwZSA9PSAweGRhICYmIGRtLT5sZW5ndGggPiAxNykgeworCQljYWxsaW5nX2ludGVyZmFjZSA9IGNvbnRhaW5lcl9vZihkbSwKKwkJCQlzdHJ1Y3QgZGVsbF9iaW9zX2NhbGxpbmdfaW50ZXJmYWNlLCBoZWFkZXIpOworCisJCXRva2VuID0gJmNhbGxpbmdfaW50ZXJmYWNlLT5kYW1hcFtpXTsKKwkJd2hpbGUgKHRva2VuLT50b2tlbmlkICE9IDB4ZmZmZikgeworCQkJaWYgKHRva2VuLT50b2tlbmlkID09IEdMT0JBTF9NSUNfTVVURV9ESVNBQkxFKQorCQkJCW1lbWNweSgmZGVsbF9taWNfdG9rZW5zWzBdLCB0b2tlbiwgdG9rZW5fc2l6ZSk7CisJCQllbHNlIGlmICh0b2tlbi0+dG9rZW5pZCA9PSBHTE9CQUxfTUlDX01VVEVfRU5BQkxFKQorCQkJCW1lbWNweSgmZGVsbF9taWNfdG9rZW5zWzFdLCB0b2tlbiwgdG9rZW5fc2l6ZSk7CisKKwkJCWkrKzsKKwkJCXRva2VuID0gJmNhbGxpbmdfaW50ZXJmYWNlLT5kYW1hcFtpXTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBkZWxsX21pY211dGVfbGVkX3NldChpbnQgc3RhdGUpCit7CisJc3RydWN0IGFwcF93bWlfYXJncyBhcmdzOworCXN0cnVjdCBkZWxsX2Jpb3NfZGF0YV90b2tlbiAqdG9rZW47CisKKwlpZiAoIXdtaV9oYXNfZ3VpZChERUxMX0FQUF9HVUlEKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQorCQl0b2tlbiA9ICZkZWxsX21pY190b2tlbnNbc3RhdGVdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgYXBwX3dtaV9hcmdzKSk7CisKKwlhcmdzLmNsYXNzID0gMTsKKwlhcmdzLmFyZzEgPSB0b2tlbi0+bG9jYXRpb247CisJYXJncy5hcmcyID0gdG9rZW4tPnZhbHVlOworCisJZGVsbF93bWlfcGVyZm9ybV9xdWVyeSgmYXJncyk7CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKK2ludCBkZWxsX2FwcF93bWlfbGVkX3NldChpbnQgd2hpY2hsZWQsIGludCBvbikKK3sKKwlpbnQgc3RhdGUgPSAwOworCisJc3dpdGNoICh3aGljaGxlZCkgeworCWNhc2UgREVMTF9MRURfTUlDTVVURToKKwkJc3RhdGUgPSBkZWxsX21pY211dGVfbGVkX3NldChvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX3dhcm4oImxlZCB0eXBlICV4IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHdoaWNobGVkKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXRlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVsbF9hcHBfd21pX2xlZF9zZXQpOworCitzdGF0aWMgaW50IF9faW5pdCBkZWxsX21pY211dGVfbGVkX2luaXQodm9pZCkKK3sKKwltZW1zZXQoZGVsbF9taWNfdG9rZW5zLCAwLCBzaXplb2Yoc3RydWN0IGRlbGxfYmlvc19kYXRhX3Rva2VuKSAqIDIpOworCWRtaV93YWxrKGZpbmRfbWljbXV0ZV90b2tlbnMsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBiaW9zX2FyZ3MgewogCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOwogCXVuc2lnbmVkIGNoYXIgcmVzdWx0X2NvZGU7CkBAIC0xODEsMjEgKzMyNywzMiBAQAogewogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoIXdtaV9oYXNfZ3VpZChERUxMX0xFRF9CSU9TX0dVSUQpKQorCWlmICghd21pX2hhc19ndWlkKERFTExfTEVEX0JJT1NfR1VJRCkgJiYgIXdtaV9oYXNfZ3VpZChERUxMX0FQUF9HVUlEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnJvciA9IGxlZF9vZmYoKTsKLQlpZiAoZXJyb3IgIT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHdtaV9oYXNfZ3VpZChERUxMX0FQUF9HVUlEKSkKKwkJZXJyb3IgPSBkZWxsX21pY211dGVfbGVkX2luaXQoKTsKIAotCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoTlVMTCwgJmRlbGxfbGVkKTsKKwlpZiAod21pX2hhc19ndWlkKERFTExfTEVEX0JJT1NfR1VJRCkpIHsKKwkJZXJyb3IgPSBsZWRfb2ZmKCk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJZXJyb3IgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoTlVMTCwgJmRlbGxfbGVkKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkZWxsX2xlZF9leGl0KHZvaWQpCiB7Ci0JbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRlbGxfbGVkKTsKKwlpbnQgZXJyb3IgPSAwOwogCi0JbGVkX29mZigpOworCWlmICh3bWlfaGFzX2d1aWQoREVMTF9MRURfQklPU19HVUlEKSkgeworCQllcnJvciA9IGxlZF9vZmYoKTsKKwkJaWYgKGVycm9yID09IDApCisJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGVsbF9sZWQpOworCX0KIH0KIAogbW9kdWxlX2luaXQoZGVsbF9sZWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy04OHBtODYweC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtODhwbTg2MHguYwppbmRleCBkMWUxYmNhLi5jMmRlZjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy04OHBtODYweC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLTg4cG04NjB4LmMKQEAgLTEzMCwxMCArMTMwLDkgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wcm9vdCwgKm5wOwogCWludCBpc2V0ID0gMDsKIAotCW5wcm9vdCA9IG9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOwotCWlmICghbnByb290KQorCWlmICghcGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JbnByb290ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnByb290LCAibGVkcyIpOworCW5wcm9vdCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJsZWRzIik7CiAJaWYgKCFucHJvb3QpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgbGVkcyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1hZHA1NTIwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1hZHA1NTIwLmMKaW5kZXggODZiNWJkYi4uNTAzNmQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYWRwNTUyMC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFkcDU1MjAuYwpAQCAtMTIwLDEzICsxMjAsMTAgQEAKIAogCWxlZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmxlZCkgKiBwZGF0YS0+bnVtX2xlZHMsCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGxlZCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBtZW1vcnlcbiIpOworCWlmICghbGVkKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyZXQgPSBhZHA1NTIwX2xlZF9wcmVwYXJlKHBkZXYpOwotCiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gd3JpdGVcbiIpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYmQyODAyLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1iZDI4MDIuYwppbmRleCBmYjVhMzQ3Li42MDc4YzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1iZDI4MDIuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1iZDI4MDIuYwpAQCAtNjc4LDEwICs2NzgsOCBAQAogCWludCByZXQsIGk7CiAKIAlsZWQgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGJkMjgwMl9sZWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxlZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgZGF0YVxuIik7CisJaWYgKCFsZWQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxlZC0+Y2xpZW50ID0gY2xpZW50OwogCXBkYXRhID0gbGVkLT5wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWRhOTAzeC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZGE5MDN4LmMKaW5kZXggMzVkZmZiMS4uNTRiOGI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtZGE5MDN4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZGE5MDN4LmMKQEAgLTEwOCwxMCArMTA4LDggQEAKIAl9CiAKIAlsZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBkYTkwM3hfbGVkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxlZCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBtZW1vcnkgZm9yIExFRCVkXG4iLCBpZCk7CisJaWYgKCFsZWQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxlZC0+Y2Rldi5uYW1lID0gcGRhdGEtPm5hbWU7CiAJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHBkYXRhLT5kZWZhdWx0X3RyaWdnZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1kYTkwNTIuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWRhOTA1Mi5jCmluZGV4IDAxNDg2YWQuLmU0ZGExZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWRhOTA1Mi5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWRhOTA1Mi5jCkBAIC0xMjYsOCArMTI2LDcgQEAKIAlsZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKIAkJCSAgIHNpemVvZihzdHJ1Y3QgZGE5MDUyX2xlZCkgKiBwbGVkLT5udW1fbGVkcywKIAkJCSAgIEdGUF9LRVJORUwpOwotCWlmIChsZWQgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgbWVtb3J5XG4iKTsKKwlpZiAoIWxlZCkgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWxwNTUyMy5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMKaW5kZXggY2I1ZWQ4Mi4uOWUxNzE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbHA1NTIzLmMgLSBMUDU1MjMgTEVEIERyaXZlcgorICogbHA1NTIzLmMgLSBMUDU1MjMsIExQNTUyMzEgTEVEIERyaXZlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgogICogQ29weXJpZ2h0IChDKSAyMDEyIFRleGFzIEluc3RydW1lbnRzCkBAIC04MTQsNiArODE0LDcgQEAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2xwNTUyM19sZWRzX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJuYXRpb25hbCxscDU1MjMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksbHA1NTIzMSIsIH0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5Njg1LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5Njg1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWVmM2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTY4NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBNYXhpbWlsaWFuIEfDvG50bmVyIDxtYXhpbWlsaWFuLmd1ZW50bmVyQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAyIG9mCi0gKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbgotICogZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIEJhc2VkIG9uIGxlZHMtcGNhOTYzeC5jIGRyaXZlciBieQotICogUGV0ZXIgTWVlcndhbGQgPHAubWVlcndhbGRAYmN0LWVsZWN0cm9uaWMuY29tPgotICoKLSAqIERyaXZlciBmb3IgdGhlIE5YUCBQQ0E5Njg1IDEyLUJpdCBQV00gTEVEIGRyaXZlciBjaGlwLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2xlZHMtcGNhOTY4NS5oPgotCi0vKiBSZWdpc3RlciBBZGRyZXNzZXMgKi8KLSNkZWZpbmUgUENBOTY4NV9NT0RFMSAweDAwCi0jZGVmaW5lIFBDQTk2ODVfTU9ERTIgMHgwMQotI2RlZmluZSBQQ0E5Njg1X0xFRDBfT05fTCAweDA2Ci0jZGVmaW5lIFBDQTk2ODVfQUxMX0xFRF9PTl9MIDB4RkEKLQotLyogTU9ERTEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUENBOTY4NV9BTExDQUxMIDB4MDAKLSNkZWZpbmUgUENBOTY4NV9TTEVFUCAgIDB4MDQKLSNkZWZpbmUgUENBOTY4NV9BSSAgICAgIDB4MDUKLQotLyogTU9ERTIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUENBOTY4NV9JTlZSVCAgIDB4MDQKLSNkZWZpbmUgUENBOTY4NV9PVVREUlYgIDB4MDIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBjYTk2ODVfaWRbXSA9IHsKLQl7ICJwY2E5Njg1IiwgMCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2E5Njg1X2lkKTsKLQotc3RydWN0IHBjYTk2ODVfbGVkIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXUxNiBicmlnaHRuZXNzOwotCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2NkZXY7Ci0JaW50IGxlZF9udW07IC8qIDAtMTUgKi8KLQljaGFyIG5hbWVbMzJdOwotfTsKLQotc3RhdGljIHZvaWQgcGNhOTY4NV93cml0ZV9tc2coc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKmJ1ZiwgdTggbGVuKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKLQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCi0JCS5mbGFncyA9IDB4MDAsCi0JCS5sZW4gPSBsZW4sCi0JCS5idWYgPSBidWYKLQl9OwotCWkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2csIDEpOwotfQotCi1zdGF0aWMgdm9pZCBwY2E5Njg1X2FsbF9vZmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQl1OCBpMmNfYnVmZmVyWzVdID0ge1BDQTk2ODVfQUxMX0xFRF9PTl9MLCAweDAwLCAweDAwLCAweDAwLCAweDEwfTsKLQlwY2E5Njg1X3dyaXRlX21zZyhjbGllbnQsIGkyY19idWZmZXIsIDUpOwotfQotCi1zdGF0aWMgdm9pZCBwY2E5Njg1X2xlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcGNhOTY4NV9sZWQgKnBjYTk2ODU7Ci0JdTggaTJjX2J1ZmZlcls1XTsKLQotCXBjYTk2ODUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBjYTk2ODVfbGVkLCB3b3JrKTsKLQlpMmNfYnVmZmVyWzBdID0gUENBOTY4NV9MRUQwX09OX0wgKyA0ICogcGNhOTY4NS0+bGVkX251bTsKLQkvKgotCSAqIDQwOTUgaXMgdGhlIG1heGltdW0gYnJpZ2h0bmVzcywgc28gd2Ugc2V0IHRoZSBPTiB0aW1lIHRvIDB4MTAwMAotCSAqIHdoaWNoIGRpc2FibGVzIHRoZSBQV00gZ2VuZXJhdG9yIGZvciB0aGF0IExFRAotCSAqLwotCWlmIChwY2E5Njg1LT5icmlnaHRuZXNzID09IDQwOTUpCi0JCSooKF9fbGUxNiAqKShpMmNfYnVmZmVyKzEpKSA9IGNwdV90b19sZTE2KDB4MTAwMCk7Ci0JZWxzZQotCQkqKChfX2xlMTYgKikoaTJjX2J1ZmZlcisxKSkgPSAweDAwMDA7Ci0KLQlpZiAocGNhOTY4NS0+YnJpZ2h0bmVzcyA9PSAwKQotCQkqKChfX2xlMTYgKikoaTJjX2J1ZmZlciszKSkgPSBjcHVfdG9fbGUxNigweDEwMDApOwotCWVsc2UgaWYgKHBjYTk2ODUtPmJyaWdodG5lc3MgPT0gNDA5NSkKLQkJKigoX19sZTE2ICopKGkyY19idWZmZXIrMykpID0gMHgwMDAwOwotCWVsc2UKLQkJKigoX19sZTE2ICopKGkyY19idWZmZXIrMykpID0gY3B1X3RvX2xlMTYocGNhOTY4NS0+YnJpZ2h0bmVzcyk7Ci0KLQlwY2E5Njg1X3dyaXRlX21zZyhwY2E5Njg1LT5jbGllbnQsIGkyY19idWZmZXIsIDUpOwotfQotCi1zdGF0aWMgdm9pZCBwY2E5Njg1X2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCi17Ci0Jc3RydWN0IHBjYTk2ODVfbGVkICpwY2E5Njg1OwotCXBjYTk2ODUgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBwY2E5Njg1X2xlZCwgbGVkX2NkZXYpOwotCXBjYTk2ODUtPmJyaWdodG5lc3MgPSB2YWx1ZTsKLQotCXNjaGVkdWxlX3dvcmsoJnBjYTk2ODUtPndvcmspOwotfQotCi1zdGF0aWMgaW50IHBjYTk2ODVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBwY2E5Njg1X2xlZCAqcGNhOTY4NTsKLQlzdHJ1Y3QgcGNhOTY4NV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlpbnQgZXJyOwotCXU4IGk7Ci0KLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKLQlpZiAocGRhdGEpIHsKLQkJaWYgKHBkYXRhLT5sZWRzLm51bV9sZWRzIDwgMSB8fCBwZGF0YS0+bGVkcy5udW1fbGVkcyA+IDE1KSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImJvYXJkIGluZm8gbXVzdCBjbGFpbSAxLTE2IExFRHMiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcGNhOTY4NSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIDE2ICogc2l6ZW9mKCpwY2E5Njg1KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2E5Njg1KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBjYTk2ODUpOwotCXBjYTk2ODVfYWxsX29mZihjbGllbnQpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJcGNhOTY4NVtpXS5jbGllbnQgPSBjbGllbnQ7Ci0JCXBjYTk2ODVbaV0ubGVkX251bSA9IGk7Ci0JCXBjYTk2ODVbaV0ubmFtZVswXSA9ICdcMCc7Ci0JCWlmIChwZGF0YSAmJiBpIDwgcGRhdGEtPmxlZHMubnVtX2xlZHMpIHsKLQkJCWlmIChwZGF0YS0+bGVkcy5sZWRzW2ldLm5hbWUpCi0JCQkJc3RybmNweShwY2E5Njg1W2ldLm5hbWUsCi0JCQkJCXBkYXRhLT5sZWRzLmxlZHNbaV0ubmFtZSwKLQkJCQkJc2l6ZW9mKHBjYTk2ODVbaV0ubmFtZSktMSk7Ci0JCQlpZiAocGRhdGEtPmxlZHMubGVkc1tpXS5kZWZhdWx0X3RyaWdnZXIpCi0JCQkJcGNhOTY4NVtpXS5sZWRfY2Rldi5kZWZhdWx0X3RyaWdnZXIgPQotCQkJCQlwZGF0YS0+bGVkcy5sZWRzW2ldLmRlZmF1bHRfdHJpZ2dlcjsKLQkJfQotCQlpZiAoc3RybGVuKHBjYTk2ODVbaV0ubmFtZSkgPT0gMCkgewotCQkJLyoKLQkJCSAqIFdyaXRlIGFkYXB0ZXIgYW5kIGFkZHJlc3MgdG8gdGhlIG5hbWUgYXMgd2VsbC4KLQkJCSAqIE90aGVyd2lzZSBtdWx0aXBsZSBjaGlwcyBhdHRhY2hlZCB0byBvbmUgaG9zdCB3b3VsZAotCQkJICogbm90IHdvcmsuCi0JCQkgKi8KLQkJCXNucHJpbnRmKHBjYTk2ODVbaV0ubmFtZSwgc2l6ZW9mKHBjYTk2ODVbaV0ubmFtZSksCi0JCQkJCSJwY2E5Njg1OiVkOnglLjJ4OiVkIiwKLQkJCQkJY2xpZW50LT5hZGFwdGVyLT5uciwgY2xpZW50LT5hZGRyLCBpKTsKLQkJfQotCQlwY2E5Njg1W2ldLmxlZF9jZGV2Lm5hbWUgPSBwY2E5Njg1W2ldLm5hbWU7Ci0JCXBjYTk2ODVbaV0ubGVkX2NkZXYubWF4X2JyaWdodG5lc3MgPSAweGZmZjsKLQkJcGNhOTY4NVtpXS5sZWRfY2Rldi5icmlnaHRuZXNzX3NldCA9IHBjYTk2ODVfbGVkX3NldDsKLQotCQlJTklUX1dPUksoJnBjYTk2ODVbaV0ud29yaywgcGNhOTY4NV9sZWRfd29yayk7Ci0JCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZwY2E5Njg1W2ldLmxlZF9jZGV2KTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBkYXRhKQotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgUENBOTY4NV9NT0RFMiwKLQkJCXBkYXRhLT5vdXRkcnYgPDwgUENBOTY4NV9PVVREUlYgfAotCQkJcGRhdGEtPmludmVydGVkIDw8IFBDQTk2ODVfSU5WUlQpOwotCWVsc2UKLQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFBDQTk2ODVfTU9ERTIsCi0JCQlQQ0E5Njg1X1RPVEVNX1BPTEUgPDwgUENBOTY4NV9PVVREUlYpOwotCS8qIEVuYWJsZSBBdXRvLUluY3JlbWVudCwgZW5hYmxlIG9zY2lsbGF0b3IsIEFMTENBTEwvU1VCQUREUiBkaXNhYmxlZCAqLwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBQQ0E5Njg1X01PREUxLCBCSVQoUENBOTY4NV9BSSkpOwotCi0JcmV0dXJuIDA7Ci0KLWV4aXQ6Ci0Jd2hpbGUgKGktLSkgewotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcGNhOTY4NVtpXS5sZWRfY2Rldik7Ci0JCWNhbmNlbF93b3JrX3N5bmMoJnBjYTk2ODVbaV0ud29yayk7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgcGNhOTY4NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgcGNhOTY4NV9sZWQgKnBjYTk2ODUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnBjYTk2ODVbaV0ubGVkX2NkZXYpOwotCQljYW5jZWxfd29ya19zeW5jKCZwY2E5Njg1W2ldLndvcmspOwotCX0KLQlwY2E5Njg1X2FsbF9vZmYoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjYTk2ODVfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImxlZHMtcGNhOTY4NSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gcGNhOTY4NV9wcm9iZSwKLQkucmVtb3ZlID0gcGNhOTY4NV9yZW1vdmUsCi0JLmlkX3RhYmxlID0gcGNhOTY4NV9pZCwKLX07Ci0KLW1vZHVsZV9pMmNfZHJpdmVyKHBjYTk2ODVfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiTWF4aW1pbGlhbiBHw7xudG5lciA8bWF4aW1pbGlhbi5ndWVudG5lckBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBDQTk2ODUgTEVEIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcHdtLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1wd20uYwppbmRleCBhYTc3MGVjLi5kNjcyYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1wd20uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wd20uYwpAQCAtNjksNiArNjksMTAgQEAKIAogCWR1dHkgKj0gYnJpZ2h0bmVzczsKIAlkb19kaXYoZHV0eSwgbWF4KTsKKworCWlmIChsZWRfZGF0LT5hY3RpdmVfbG93KQorCQlkdXR5ID0gbGVkX2RhdC0+cGVyaW9kIC0gZHV0eTsKKwogCWxlZF9kYXQtPmR1dHkgPSBkdXR5OwogCiAJaWYgKGxlZF9kYXQtPmNhbl9zbGVlcCkKQEAgLTkyLDU0ICs5Niw3NyBAQAogCX0KIH0KIAotc3RhdGljIGludCBsZWRfcHdtX2NyZWF0ZV9vZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJICAgICBzdHJ1Y3QgbGVkX3B3bV9wcml2ICpwcml2KQorc3RhdGljIGludCBsZWRfcHdtX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBsZWRfcHdtX3ByaXYgKnByaXYsCisJCSAgICAgICBzdHJ1Y3QgbGVkX3B3bSAqbGVkLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CisJc3RydWN0IGxlZF9wd21fZGF0YSAqbGVkX2RhdGEgPSAmcHJpdi0+bGVkc1twcml2LT5udW1fbGVkc107CiAJaW50IHJldDsKIAotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUocGRldi0+ZGV2Lm9mX25vZGUsIGNoaWxkKSB7Ci0JCXN0cnVjdCBsZWRfcHdtX2RhdGEgKmxlZF9kYXQgPSAmcHJpdi0+bGVkc1twcml2LT5udW1fbGVkc107CisJbGVkX2RhdGEtPmFjdGl2ZV9sb3cgPSBsZWQtPmFjdGl2ZV9sb3c7CisJbGVkX2RhdGEtPmNkZXYubmFtZSA9IGxlZC0+bmFtZTsKKwlsZWRfZGF0YS0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBsZWQtPmRlZmF1bHRfdHJpZ2dlcjsKKwlsZWRfZGF0YS0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGxlZF9wd21fc2V0OworCWxlZF9kYXRhLT5jZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOworCWxlZF9kYXRhLT5jZGV2Lm1heF9icmlnaHRuZXNzID0gbGVkLT5tYXhfYnJpZ2h0bmVzczsKKwlsZWRfZGF0YS0+Y2Rldi5mbGFncyA9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CiAKLQkJbGVkX2RhdC0+Y2Rldi5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAibGFiZWwiLAotCQkJCQkJICAgICBOVUxMKSA/IDogY2hpbGQtPm5hbWU7Ci0KLQkJbGVkX2RhdC0+cHdtID0gZGV2bV9vZl9wd21fZ2V0KCZwZGV2LT5kZXYsIGNoaWxkLCBOVUxMKTsKLQkJaWYgKElTX0VSUihsZWRfZGF0LT5wd20pKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBQV00gZm9yICVzXG4iLAotCQkJCWxlZF9kYXQtPmNkZXYubmFtZSk7Ci0JCQlyZXQgPSBQVFJfRVJSKGxlZF9kYXQtPnB3bSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQkvKiBHZXQgdGhlIHBlcmlvZCBmcm9tIFBXTSBjb3JlIHdoZW4gbiovCi0JCWxlZF9kYXQtPnBlcmlvZCA9IHB3bV9nZXRfcGVyaW9kKGxlZF9kYXQtPnB3bSk7Ci0KLQkJbGVkX2RhdC0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsCi0JCQkJCQkibGludXgsZGVmYXVsdC10cmlnZ2VyIiwgTlVMTCk7Ci0JCW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAibWF4LWJyaWdodG5lc3MiLAotCQkJCSAgICAgJmxlZF9kYXQtPmNkZXYubWF4X2JyaWdodG5lc3MpOwotCi0JCWxlZF9kYXQtPmNkZXYuYnJpZ2h0bmVzc19zZXQgPSBsZWRfcHdtX3NldDsKLQkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzID0gTEVEX09GRjsKLQkJbGVkX2RhdC0+Y2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwotCi0JCWxlZF9kYXQtPmNhbl9zbGVlcCA9IHB3bV9jYW5fc2xlZXAobGVkX2RhdC0+cHdtKTsKLQkJaWYgKGxlZF9kYXQtPmNhbl9zbGVlcCkKLQkJCUlOSVRfV09SSygmbGVkX2RhdC0+d29yaywgbGVkX3B3bV93b3JrKTsKLQotCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmxlZF9kYXQtPmNkZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGZvciAlc1xuIiwKLQkJCQlsZWRfZGF0LT5jZGV2Lm5hbWUpOwotCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJcHJpdi0+bnVtX2xlZHMrKzsKKwlpZiAoY2hpbGQpCisJCWxlZF9kYXRhLT5wd20gPSBkZXZtX29mX3B3bV9nZXQoZGV2LCBjaGlsZCwgTlVMTCk7CisJZWxzZQorCQlsZWRfZGF0YS0+cHdtID0gZGV2bV9wd21fZ2V0KGRldiwgbGVkLT5uYW1lKTsKKwlpZiAoSVNfRVJSKGxlZF9kYXRhLT5wd20pKSB7CisJCXJldCA9IFBUUl9FUlIobGVkX2RhdGEtPnB3bSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgUFdNIGZvciAlczogJWRcbiIsCisJCQlsZWQtPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIDA7Ci1lcnI6Ci0JbGVkX3B3bV9jbGVhbnVwKHByaXYpOworCWlmIChjaGlsZCkKKwkJbGVkX2RhdGEtPnBlcmlvZCA9IHB3bV9nZXRfcGVyaW9kKGxlZF9kYXRhLT5wd20pOworCisJbGVkX2RhdGEtPmNhbl9zbGVlcCA9IHB3bV9jYW5fc2xlZXAobGVkX2RhdGEtPnB3bSk7CisJaWYgKGxlZF9kYXRhLT5jYW5fc2xlZXApCisJCUlOSVRfV09SSygmbGVkX2RhdGEtPndvcmssIGxlZF9wd21fd29yayk7CisKKwlsZWRfZGF0YS0+cGVyaW9kID0gcHdtX2dldF9wZXJpb2QobGVkX2RhdGEtPnB3bSk7CisJaWYgKCFsZWRfZGF0YS0+cGVyaW9kICYmIChsZWQtPnB3bV9wZXJpb2RfbnMgPiAwKSkKKwkJbGVkX2RhdGEtPnBlcmlvZCA9IGxlZC0+cHdtX3BlcmlvZF9uczsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihkZXYsICZsZWRfZGF0YS0+Y2Rldik7CisJaWYgKHJldCA9PSAwKSB7CisJCXByaXYtPm51bV9sZWRzKys7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgUFdNIGxlZCBmb3IgJXM6ICVkXG4iLAorCQkJbGVkLT5uYW1lLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGVkX3B3bV9jcmVhdGVfb2Yoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbGVkX3B3bV9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CisJc3RydWN0IGxlZF9wd20gbGVkOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZsZWQsIDAsIHNpemVvZihsZWQpKTsKKworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoZGV2LT5vZl9ub2RlLCBjaGlsZCkgeworCQlsZWQubmFtZSA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgImxhYmVsIiwgTlVMTCkgPyA6CisJCQkgICBjaGlsZC0+bmFtZTsKKworCQlsZWQuZGVmYXVsdF90cmlnZ2VyID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLAorCQkJCQkJImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsIE5VTEwpOworCQlsZWQuYWN0aXZlX2xvdyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChjaGlsZCwgImFjdGl2ZS1sb3ciKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJtYXgtYnJpZ2h0bmVzcyIsCisJCQkJICAgICAmbGVkLm1heF9icmlnaHRuZXNzKTsKKworCQlyZXQgPSBsZWRfcHdtX2FkZChkZXYsIHByaXYsICZsZWQsIGNoaWxkKTsKKwkJaWYgKHJldCkgeworCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTY2LDU0ICsxOTMsMjMgQEAKIAogCWlmIChwZGF0YSkgewogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJc3RydWN0IGxlZF9wd20gKmN1cl9sZWQgPSAmcGRhdGEtPmxlZHNbaV07Ci0JCQlzdHJ1Y3QgbGVkX3B3bV9kYXRhICpsZWRfZGF0ID0gJnByaXYtPmxlZHNbaV07Ci0KLQkJCWxlZF9kYXQtPnB3bSA9IGRldm1fcHdtX2dldCgmcGRldi0+ZGV2LCBjdXJfbGVkLT5uYW1lKTsKLQkJCWlmIChJU19FUlIobGVkX2RhdC0+cHdtKSkgewotCQkJCXJldCA9IFBUUl9FUlIobGVkX2RhdC0+cHdtKTsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSJ1bmFibGUgdG8gcmVxdWVzdCBQV00gZm9yICVzXG4iLAotCQkJCQljdXJfbGVkLT5uYW1lKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQotCQkJbGVkX2RhdC0+Y2Rldi5uYW1lID0gY3VyX2xlZC0+bmFtZTsKLQkJCWxlZF9kYXQtPmNkZXYuZGVmYXVsdF90cmlnZ2VyID0gY3VyX2xlZC0+ZGVmYXVsdF90cmlnZ2VyOwotCQkJbGVkX2RhdC0+YWN0aXZlX2xvdyA9IGN1cl9sZWQtPmFjdGl2ZV9sb3c7Ci0JCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gbGVkX3B3bV9zZXQ7Ci0JCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOwotCQkJbGVkX2RhdC0+Y2Rldi5tYXhfYnJpZ2h0bmVzcyA9IGN1cl9sZWQtPm1heF9icmlnaHRuZXNzOwotCQkJbGVkX2RhdC0+Y2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwotCi0JCQlsZWRfZGF0LT5jYW5fc2xlZXAgPSBwd21fY2FuX3NsZWVwKGxlZF9kYXQtPnB3bSk7Ci0JCQlpZiAobGVkX2RhdC0+Y2FuX3NsZWVwKQotCQkJCUlOSVRfV09SSygmbGVkX2RhdC0+d29yaywgbGVkX3B3bV93b3JrKTsKLQotCQkJbGVkX2RhdC0+cGVyaW9kID0gcHdtX2dldF9wZXJpb2QobGVkX2RhdC0+cHdtKTsKLQkJCWlmICghbGVkX2RhdC0+cGVyaW9kICYmIChjdXJfbGVkLT5wd21fcGVyaW9kX25zID4gMCkpCi0JCQkJbGVkX2RhdC0+cGVyaW9kID0gY3VyX2xlZC0+cHdtX3BlcmlvZF9uczsKLQotCQkJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZsZWRfZGF0LT5jZGV2KTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gZXJyOworCQkJcmV0ID0gbGVkX3B3bV9hZGQoJnBkZXYtPmRldiwgcHJpdiwgJnBkYXRhLT5sZWRzW2ldLAorCQkJCQkgIE5VTEwpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKIAkJfQotCQlwcml2LT5udW1fbGVkcyA9IGNvdW50OwogCX0gZWxzZSB7Ci0JCXJldCA9IGxlZF9wd21fY3JlYXRlX29mKHBkZXYsIHByaXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gbGVkX3B3bV9jcmVhdGVfb2YoJnBkZXYtPmRldiwgcHJpdik7CisJfQorCisJaWYgKHJldCkgeworCQlsZWRfcHdtX2NsZWFudXAocHJpdik7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXByaXYtPm51bV9sZWRzID0gaTsKLQlsZWRfcHdtX2NsZWFudXAocHJpdik7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGxlZF9wd21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1zM2MyNHh4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1zM2MyNHh4LmMKaW5kZXggMjg5ODhiNy4uNzg1ZWI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYwpAQCAtNzYsMTAgKzc2LDggQEAKIAogCWxlZCA9IGRldm1fa3phbGxvYygmZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgczNjMjR4eF9ncGlvX2xlZCksCiAJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAobGVkID09IE5VTEwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJObyBtZW1vcnkgZm9yIGRldmljZVxuIik7CisJaWYgKCFsZWQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbGVkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtc3VuZmlyZS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtc3VuZmlyZS5jCmluZGV4IDM4ODYzMmQuLjBiOGNjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXN1bmZpcmUuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1zdW5maXJlLmMKQEAgLTEzNSwxMCArMTM1LDggQEAKIAl9CiAKIAlwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcCksIEdGUF9LRVJORUwpOwotCWlmICghcCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IHN1bmZpcmVfZHJ2ZGF0YVxuIik7CisJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0xFRFNfUEVSX0JPQVJEOyBpKyspIHsKIAkJc3RydWN0IGxlZF9jbGFzc2RldiAqbHAgPSAmcC0+bGVkc1tpXS5sZWRfY2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy90cmlnZ2VyL2xlZHRyaWctY3B1LmMgYi9kcml2ZXJzL2xlZHMvdHJpZ2dlci9sZWR0cmlnLWNwdS5jCmluZGV4IDFjM2VlOWYuLmFlYzBmMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy90cmlnZ2VyL2xlZHRyaWctY3B1LmMKKysrIGIvZHJpdmVycy9sZWRzL3RyaWdnZXIvbGVkdHJpZy1jcHUuYwpAQCAtNDcsNyArNDcsNyBAQAogICovCiB2b2lkIGxlZHRyaWdfY3B1KGVudW0gY3B1X2xlZF9ldmVudCBsZWRldnQpCiB7Ci0Jc3RydWN0IGxlZF90cmlnZ2VyX2NwdSAqdHJpZyA9ICZfX2dldF9jcHVfdmFyKGNwdV90cmlnKTsKKwlzdHJ1Y3QgbGVkX3RyaWdnZXJfY3B1ICp0cmlnID0gdGhpc19jcHVfcHRyKCZjcHVfdHJpZyk7CiAKIAkvKiBMb2NhdGUgdGhlIGNvcnJlY3QgQ1BVIExFRCAqLwogCXN3aXRjaCAobGVkZXZ0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uYyBiL2RyaXZlcnMvbWQvZG0tYmlvLXByaXNvbi5jCmluZGV4IDg1ZjBiNzAuLmY3NTJkMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uYworKysgYi9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uYwpAQCAtMTQsMTMgKzE0LDE3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCBkbV9iaW9fcHJpc29uIHsKK3N0cnVjdCBidWNrZXQgewogCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBjZWxsczsKK307CisKK3N0cnVjdCBkbV9iaW9fcHJpc29uIHsKIAltZW1wb29sX3QgKmNlbGxfcG9vbDsKIAogCXVuc2lnbmVkIG5yX2J1Y2tldHM7CiAJdW5zaWduZWQgaGFzaF9tYXNrOwotCXN0cnVjdCBobGlzdF9oZWFkICpjZWxsczsKKwlzdHJ1Y3QgYnVja2V0ICpidWNrZXRzOwogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQwLDYgKzQ0LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2NlbGxfY2FjaGU7CiAKK3N0YXRpYyB2b2lkIGluaXRfYnVja2V0KHN0cnVjdCBidWNrZXQgKmIpCit7CisJc3Bpbl9sb2NrX2luaXQoJmItPmxvY2spOworCUlOSVRfSExJU1RfSEVBRCgmYi0+Y2VsbHMpOworfQorCiAvKgogICogQG5yX2NlbGxzIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHlvdSB3YW50IGluIHVzZSBfY29uY3VycmVudGx5Xy4KICAqIERvbid0IGNvbmZ1c2UgaXQgd2l0aCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGtleXMuCkBAIC00OSwxMyArNTksMTIgQEAKIAl1bnNpZ25lZCBpOwogCXVpbnQzMl90IG5yX2J1Y2tldHMgPSBjYWxjX25yX2J1Y2tldHMobnJfY2VsbHMpOwogCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGRtX2Jpb19wcmlzb24pICsKLQkJKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgKiBucl9idWNrZXRzKTsKKwkJKHNpemVvZihzdHJ1Y3QgYnVja2V0KSAqIG5yX2J1Y2tldHMpOwogCXN0cnVjdCBkbV9iaW9fcHJpc29uICpwcmlzb24gPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXByaXNvbikKIAkJcmV0dXJuIE5VTEw7CiAKLQlzcGluX2xvY2tfaW5pdCgmcHJpc29uLT5sb2NrKTsKIAlwcmlzb24tPmNlbGxfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChucl9jZWxscywgX2NlbGxfY2FjaGUpOwogCWlmICghcHJpc29uLT5jZWxsX3Bvb2wpIHsKIAkJa2ZyZWUocHJpc29uKTsKQEAgLTY0LDkgKzczLDkgQEAKIAogCXByaXNvbi0+bnJfYnVja2V0cyA9IG5yX2J1Y2tldHM7CiAJcHJpc29uLT5oYXNoX21hc2sgPSBucl9idWNrZXRzIC0gMTsKLQlwcmlzb24tPmNlbGxzID0gKHN0cnVjdCBobGlzdF9oZWFkICopIChwcmlzb24gKyAxKTsKKwlwcmlzb24tPmJ1Y2tldHMgPSAoc3RydWN0IGJ1Y2tldCAqKSAocHJpc29uICsgMSk7CiAJZm9yIChpID0gMDsgaSA8IG5yX2J1Y2tldHM7IGkrKykKLQkJSU5JVF9ITElTVF9IRUFEKHByaXNvbi0+Y2VsbHMgKyBpKTsKKwkJaW5pdF9idWNrZXQocHJpc29uLT5idWNrZXRzICsgaSk7CiAKIAlyZXR1cm4gcHJpc29uOwogfQpAQCAtMTA3LDQwICsxMTYsNDQgQEAKIAkJICAgICAgIChsaHMtPmJsb2NrID09IHJocy0+YmxvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqX19zZWFyY2hfYnVja2V0KHN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQsCitzdGF0aWMgc3RydWN0IGJ1Y2tldCAqZ2V0X2J1Y2tldChzdHJ1Y3QgZG1fYmlvX3ByaXNvbiAqcHJpc29uLAorCQkJCSBzdHJ1Y3QgZG1fY2VsbF9rZXkgKmtleSkKK3sKKwlyZXR1cm4gcHJpc29uLT5idWNrZXRzICsgaGFzaF9rZXkocHJpc29uLCBrZXkpOworfQorCitzdGF0aWMgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqX19zZWFyY2hfYnVja2V0KHN0cnVjdCBidWNrZXQgKmIsCiAJCQkJCQkgIHN0cnVjdCBkbV9jZWxsX2tleSAqa2V5KQogewogCXN0cnVjdCBkbV9iaW9fcHJpc29uX2NlbGwgKmNlbGw7CiAKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShjZWxsLCBidWNrZXQsIGxpc3QpCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2VsbCwgJmItPmNlbGxzLCBsaXN0KQogCQlpZiAoa2V5c19lcXVhbCgmY2VsbC0+a2V5LCBrZXkpKQogCQkJcmV0dXJuIGNlbGw7CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgX19zZXR1cF9uZXdfY2VsbChzdHJ1Y3QgZG1fYmlvX3ByaXNvbiAqcHJpc29uLAorc3RhdGljIHZvaWQgX19zZXR1cF9uZXdfY2VsbChzdHJ1Y3QgYnVja2V0ICpiLAogCQkJICAgICBzdHJ1Y3QgZG1fY2VsbF9rZXkgKmtleSwKIAkJCSAgICAgc3RydWN0IGJpbyAqaG9sZGVyLAotCQkJICAgICB1aW50MzJfdCBoYXNoLAogCQkJICAgICBzdHJ1Y3QgZG1fYmlvX3ByaXNvbl9jZWxsICpjZWxsKQogewogCW1lbWNweSgmY2VsbC0+a2V5LCBrZXksIHNpemVvZihjZWxsLT5rZXkpKTsKIAljZWxsLT5ob2xkZXIgPSBob2xkZXI7CiAJYmlvX2xpc3RfaW5pdCgmY2VsbC0+Ymlvcyk7Ci0JaGxpc3RfYWRkX2hlYWQoJmNlbGwtPmxpc3QsIHByaXNvbi0+Y2VsbHMgKyBoYXNoKTsKKwlobGlzdF9hZGRfaGVhZCgmY2VsbC0+bGlzdCwgJmItPmNlbGxzKTsKIH0KIAotc3RhdGljIGludCBfX2Jpb19kZXRhaW4oc3RydWN0IGRtX2Jpb19wcmlzb24gKnByaXNvbiwKK3N0YXRpYyBpbnQgX19iaW9fZGV0YWluKHN0cnVjdCBidWNrZXQgKmIsCiAJCQlzdHJ1Y3QgZG1fY2VsbF9rZXkgKmtleSwKIAkJCXN0cnVjdCBiaW8gKmlubWF0ZSwKIAkJCXN0cnVjdCBkbV9iaW9fcHJpc29uX2NlbGwgKmNlbGxfcHJlYWxsb2MsCiAJCQlzdHJ1Y3QgZG1fYmlvX3ByaXNvbl9jZWxsICoqY2VsbF9yZXN1bHQpCiB7Ci0JdWludDMyX3QgaGFzaCA9IGhhc2hfa2V5KHByaXNvbiwga2V5KTsKIAlzdHJ1Y3QgZG1fYmlvX3ByaXNvbl9jZWxsICpjZWxsOwogCi0JY2VsbCA9IF9fc2VhcmNoX2J1Y2tldChwcmlzb24tPmNlbGxzICsgaGFzaCwga2V5KTsKKwljZWxsID0gX19zZWFyY2hfYnVja2V0KGIsIGtleSk7CiAJaWYgKGNlbGwpIHsKIAkJaWYgKGlubWF0ZSkKIAkJCWJpb19saXN0X2FkZCgmY2VsbC0+YmlvcywgaW5tYXRlKTsKQEAgLTE0OCw3ICsxNjEsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlfX3NldHVwX25ld19jZWxsKHByaXNvbiwga2V5LCBpbm1hdGUsIGhhc2gsIGNlbGxfcHJlYWxsb2MpOworCV9fc2V0dXBfbmV3X2NlbGwoYiwga2V5LCBpbm1hdGUsIGNlbGxfcHJlYWxsb2MpOwogCSpjZWxsX3Jlc3VsdCA9IGNlbGxfcHJlYWxsb2M7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNjEsMTAgKzE3NCwxMSBAQAogewogCWludCByOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJ1Y2tldCAqYiA9IGdldF9idWNrZXQocHJpc29uLCBrZXkpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOwotCXIgPSBfX2Jpb19kZXRhaW4ocHJpc29uLCBrZXksIGlubWF0ZSwgY2VsbF9wcmVhbGxvYywgY2VsbF9yZXN1bHQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5sb2NrLCBmbGFncyk7CisJciA9IF9fYmlvX2RldGFpbihiLCBrZXksIGlubWF0ZSwgY2VsbF9wcmVhbGxvYywgY2VsbF9yZXN1bHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmItPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByOwogfQpAQCAtMjA4LDEwICsyMjIsMTEgQEAKIAkJICAgICBzdHJ1Y3QgYmlvX2xpc3QgKmJpb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVja2V0ICpiID0gZ2V0X2J1Y2tldChwcmlzb24sICZjZWxsLT5rZXkpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5sb2NrLCBmbGFncyk7CiAJX19jZWxsX3JlbGVhc2UoY2VsbCwgYmlvcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYi0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZG1fY2VsbF9yZWxlYXNlKTsKIApAQCAtMjMwLDI4ICsyNDUsMjUgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYmlvX2xpc3QgKmlubWF0ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVja2V0ICpiID0gZ2V0X2J1Y2tldChwcmlzb24sICZjZWxsLT5rZXkpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5sb2NrLCBmbGFncyk7CiAJX19jZWxsX3JlbGVhc2Vfbm9faG9sZGVyKGNlbGwsIGlubWF0ZXMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmItPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRtX2NlbGxfcmVsZWFzZV9ub19ob2xkZXIpOwogCiB2b2lkIGRtX2NlbGxfZXJyb3Ioc3RydWN0IGRtX2Jpb19wcmlzb24gKnByaXNvbiwKLQkJICAgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqY2VsbCkKKwkJICAgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqY2VsbCwgaW50IGVycm9yKQogewogCXN0cnVjdCBiaW9fbGlzdCBiaW9zOwogCXN0cnVjdCBiaW8gKmJpbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYmlvX2xpc3RfaW5pdCgmYmlvcyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7Ci0JX19jZWxsX3JlbGVhc2UoY2VsbCwgJmJpb3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCWRtX2NlbGxfcmVsZWFzZShwcmlzb24sIGNlbGwsICZiaW9zKTsKIAogCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZiaW9zKSkpCi0JCWJpb19pb19lcnJvcihiaW8pOworCQliaW9fZW5kaW8oYmlvLCBlcnJvcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkbV9jZWxsX2Vycm9yKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1iaW8tcHJpc29uLmggYi9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uaAppbmRleCAzZjgzMzE5Li42ODA1YTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uaAorKysgYi9kcml2ZXJzL21kL2RtLWJpby1wcmlzb24uaApAQCAtODUsNyArODUsNyBAQAogCQkJICAgICAgIHN0cnVjdCBkbV9iaW9fcHJpc29uX2NlbGwgKmNlbGwsCiAJCQkgICAgICAgc3RydWN0IGJpb19saXN0ICppbm1hdGVzKTsKIHZvaWQgZG1fY2VsbF9lcnJvcihzdHJ1Y3QgZG1fYmlvX3ByaXNvbiAqcHJpc29uLAotCQkgICBzdHJ1Y3QgZG1fYmlvX3ByaXNvbl9jZWxsICpjZWxsKTsKKwkJICAgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqY2VsbCwgaW50IGVycm9yKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1lcmEtdGFyZ2V0LmMgYi9kcml2ZXJzL21kL2RtLWVyYS10YXJnZXQuYwppbmRleCA0MTRkYWQ0Li5hZDkxM2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWVyYS10YXJnZXQuYworKysgYi9kcml2ZXJzL21kL2RtLWVyYS10YXJnZXQuYwpAQCAtMTM5MSw3ICsxMzkxLDggQEAKIAogc3RhdGljIHZvaWQgZXJhX2Rlc3Ryb3koc3RydWN0IGVyYSAqZXJhKQogewotCW1ldGFkYXRhX2Nsb3NlKGVyYS0+bWQpOworCWlmIChlcmEtPm1kKQorCQltZXRhZGF0YV9jbG9zZShlcmEtPm1kKTsKIAogCWlmIChlcmEtPndxKQogCQlkZXN0cm95X3dvcmtxdWV1ZShlcmEtPndxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCBlYmZhNDExLi4zZjZmZDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC0xMjQyLDE3ICsxMjQyLDggQEAKIAlpZiAoIWVycm9yICYmICFjbG9uZS0+ZXJyb3JzKQogCQlyZXR1cm4gMDsJLyogSS9PIGNvbXBsZXRlICovCiAKLQlpZiAobm9yZXRyeV9lcnJvcihlcnJvcikpIHsKLQkJaWYgKChjbG9uZS0+Y21kX2ZsYWdzICYgUkVRX1dSSVRFX1NBTUUpICYmCi0JCSAgICAhY2xvbmUtPnEtPmxpbWl0cy5tYXhfd3JpdGVfc2FtZV9zZWN0b3JzKSB7Ci0JCQlzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW1pdHM7Ci0KLQkJCS8qIGRldmljZSBkb2Vzbid0IHJlYWxseSBzdXBwb3J0IFdSSVRFIFNBTUUsIGRpc2FibGUgaXQgKi8KLQkJCWxpbWl0cyA9IGRtX2dldF9xdWV1ZV9saW1pdHMoZG1fdGFibGVfZ2V0X21kKG0tPnRpLT50YWJsZSkpOwotCQkJbGltaXRzLT5tYXhfd3JpdGVfc2FtZV9zZWN0b3JzID0gMDsKLQkJfQorCWlmIChub3JldHJ5X2Vycm9yKGVycm9yKSkKIAkJcmV0dXJuIGVycm9yOwotCX0KIAogCWlmIChtcGlvLT5wZ3BhdGgpCiAJCWZhaWxfcGF0aChtcGlvLT5wZ3BhdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA4ZTBjYWVkLi41YmQyMjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwpAQCAtMjE0MSw2ICsyMTQxLDExIEBACiAgKiBPcmlnaW46IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBkZXZpY2UsIHdpdGggaG9va3MgZm9yIHNuYXBzaG90dGluZy4KICAqLwogCitzdHJ1Y3QgZG1fb3JpZ2luIHsKKwlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisJdW5zaWduZWQgc3BsaXRfYm91bmRhcnk7Cit9OworCiAvKgogICogQ29uc3RydWN0IGFuIG9yaWdpbiBtYXBwaW5nOiA8ZGV2X3BhdGg+CiAgKiBUaGUgY29udGV4dCBmb3IgYW4gb3JpZ2luIGlzIG1lcmVseSBhICdzdHJ1Y3QgZG1fZGV2IConCkBAIC0yMTQ5LDQxICsyMTU0LDY1IEBACiBzdGF0aWMgaW50IG9yaWdpbl9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlpbnQgcjsKLQlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisJc3RydWN0IGRtX29yaWdpbiAqbzsKIAogCWlmIChhcmdjICE9IDEpIHsKIAkJdGktPmVycm9yID0gIm9yaWdpbjogaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyID0gZG1fZ2V0X2RldmljZSh0aSwgYXJndlswXSwgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJmRldik7Ci0JaWYgKHIpIHsKLQkJdGktPmVycm9yID0gIkNhbm5vdCBnZXQgdGFyZ2V0IGRldmljZSI7Ci0JCXJldHVybiByOworCW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG1fb3JpZ2luKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvKSB7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBvcmlnaW4gc3RydWN0dXJlIjsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkX2FsbG9jOwogCX0KIAotCXRpLT5wcml2YXRlID0gZGV2OworCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzBdLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLCAmby0+ZGV2KTsKKwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGdldCB0YXJnZXQgZGV2aWNlIjsKKwkJZ290byBiYWRfb3BlbjsKKwl9CisKKwl0aS0+cHJpdmF0ZSA9IG87CiAJdGktPm51bV9mbHVzaF9iaW9zID0gMTsKIAogCXJldHVybiAwOworCitiYWRfb3BlbjoKKwlrZnJlZShvKTsKK2JhZF9hbGxvYzoKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHZvaWQgb3JpZ2luX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZXYgPSB0aS0+cHJpdmF0ZTsKLQlkbV9wdXRfZGV2aWNlKHRpLCBkZXYpOworCXN0cnVjdCBkbV9vcmlnaW4gKm8gPSB0aS0+cHJpdmF0ZTsKKwlkbV9wdXRfZGV2aWNlKHRpLCBvLT5kZXYpOworCWtmcmVlKG8pOwogfQogCiBzdGF0aWMgaW50IG9yaWdpbl9tYXAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZXYgPSB0aS0+cHJpdmF0ZTsKLQliaW8tPmJpX2JkZXYgPSBkZXYtPmJkZXY7CisJc3RydWN0IGRtX29yaWdpbiAqbyA9IHRpLT5wcml2YXRlOworCXVuc2lnbmVkIGF2YWlsYWJsZV9zZWN0b3JzOwogCi0JaWYgKGJpby0+YmlfcncgJiBSRVFfRkxVU0gpCisJYmlvLT5iaV9iZGV2ID0gby0+ZGV2LT5iZGV2OworCisJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKQogCQlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiAKKwlpZiAoYmlvX3J3KGJpbykgIT0gV1JJVEUpCisJCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKKworCWF2YWlsYWJsZV9zZWN0b3JzID0gby0+c3BsaXRfYm91bmRhcnkgLQorCQkoKHVuc2lnbmVkKWJpby0+YmlfaXRlci5iaV9zZWN0b3IgJiAoby0+c3BsaXRfYm91bmRhcnkgLSAxKSk7CisKKwlpZiAoYmlvX3NlY3RvcnMoYmlvKSA+IGF2YWlsYWJsZV9zZWN0b3JzKQorCQlkbV9hY2NlcHRfcGFydGlhbF9iaW8oYmlvLCBhdmFpbGFibGVfc2VjdG9ycyk7CisKIAkvKiBPbmx5IHRlbGwgc25hcHNob3RzIGlmIHRoaXMgaXMgYSB3cml0ZSAqLwotCXJldHVybiAoYmlvX3J3KGJpbykgPT0gV1JJVEUpID8gZG9fb3JpZ2luKGRldiwgYmlvKSA6IERNX01BUElPX1JFTUFQUEVEOworCXJldHVybiBkb19vcmlnaW4oby0+ZGV2LCBiaW8pOwogfQogCiAvKgpAQCAtMjE5MiwxNSArMjIyMSwxNSBAQAogICovCiBzdGF0aWMgdm9pZCBvcmlnaW5fcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewotCXN0cnVjdCBkbV9kZXYgKmRldiA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBkbV9vcmlnaW4gKm8gPSB0aS0+cHJpdmF0ZTsKIAotCXRpLT5tYXhfaW9fbGVuID0gZ2V0X29yaWdpbl9taW5pbXVtX2NodW5rc2l6ZShkZXYtPmJkZXYpOworCW8tPnNwbGl0X2JvdW5kYXJ5ID0gZ2V0X29yaWdpbl9taW5pbXVtX2NodW5rc2l6ZShvLT5kZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBvcmlnaW5fc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCiAJCQkgIHVuc2lnbmVkIHN0YXR1c19mbGFncywgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBtYXhsZW4pCiB7Ci0Jc3RydWN0IGRtX2RldiAqZGV2ID0gdGktPnByaXZhdGU7CisJc3RydWN0IGRtX29yaWdpbiAqbyA9IHRpLT5wcml2YXRlOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTVEFUVVNUWVBFX0lORk86CkBAIC0yMjA4LDcgKzIyMzcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKLQkJc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIlcyIsIGRldi0+bmFtZSk7CisJCXNucHJpbnRmKHJlc3VsdCwgbWF4bGVuLCAiJXMiLCBvLT5kZXYtPm5hbWUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0yMjE2LDEzICsyMjQ1LDEzIEBACiBzdGF0aWMgaW50IG9yaWdpbl9tZXJnZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ2ZWNfbWVyZ2VfZGF0YSAqYnZtLAogCQkJc3RydWN0IGJpb192ZWMgKmJpb3ZlYywgaW50IG1heF9zaXplKQogewotCXN0cnVjdCBkbV9kZXYgKmRldiA9IHRpLT5wcml2YXRlOwotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KTsKKwlzdHJ1Y3QgZG1fb3JpZ2luICpvID0gdGktPnByaXZhdGU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShvLT5kZXYtPmJkZXYpOwogCiAJaWYgKCFxLT5tZXJnZV9idmVjX2ZuKQogCQlyZXR1cm4gbWF4X3NpemU7CiAKLQlidm0tPmJpX2JkZXYgPSBkZXYtPmJkZXY7CisJYnZtLT5iaV9iZGV2ID0gby0+ZGV2LT5iZGV2OwogCiAJcmV0dXJuIG1pbihtYXhfc2l6ZSwgcS0+bWVyZ2VfYnZlY19mbihxLCBidm0sIGJpb3ZlYykpOwogfQpAQCAtMjIzMCw5ICsyMjU5LDkgQEAKIHN0YXRpYyBpbnQgb3JpZ2luX2l0ZXJhdGVfZGV2aWNlcyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCQkgIGl0ZXJhdGVfZGV2aWNlc19jYWxsb3V0X2ZuIGZuLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkbV9kZXYgKmRldiA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBkbV9vcmlnaW4gKm8gPSB0aS0+cHJpdmF0ZTsKIAotCXJldHVybiBmbih0aSwgZGV2LCAwLCB0aS0+bGVuLCBkYXRhKTsKKwlyZXR1cm4gZm4odGksIG8tPmRldiwgMCwgdGktPmxlbiwgZGF0YSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgb3JpZ2luX3RhcmdldCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCA1MDYwMWVjLi41ZjU5ZjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC00NjUsOCArNDY1LDggQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1fZ2V0X2RldmljZSk7CiAKLWludCBkbV9zZXRfZGV2aWNlX2xpbWl0cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZGV2LAotCQkJIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4sIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGRtX3NldF9kZXZpY2VfbGltaXRzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZXYsCisJCQkJc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW1pdHMgPSBkYXRhOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBkZXYtPmJkZXY7CkBAIC00OTksNyArNDk5LDYgQEAKIAkJCQkJICAodW5zaWduZWQgaW50KSAoUEFHRV9TSVpFID4+IDkpKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRtX3NldF9kZXZpY2VfbGltaXRzKTsKIAogLyoKICAqIERlY3JlbWVudCBhIGRldmljZSdzIHVzZSBjb3VudCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jIGIvZHJpdmVycy9tZC9kbS10aGluLmMKaW5kZXggMjQyYWMyZS4uZmM5Yzg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10aGluLmMKKysrIGIvZHJpdmVycy9tZC9kbS10aGluLmMKQEAgLTMxMCwxMyArMzEwLDE4IEBACiAJd2FrZV93b3JrZXIocG9vbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNlbGxfZXJyb3Ioc3RydWN0IHBvb2wgKnBvb2wsCi0JCSAgICAgICBzdHJ1Y3QgZG1fYmlvX3ByaXNvbl9jZWxsICpjZWxsKQorc3RhdGljIHZvaWQgY2VsbF9lcnJvcl93aXRoX2NvZGUoc3RydWN0IHBvb2wgKnBvb2wsCisJCQkJIHN0cnVjdCBkbV9iaW9fcHJpc29uX2NlbGwgKmNlbGwsIGludCBlcnJvcl9jb2RlKQogewotCWRtX2NlbGxfZXJyb3IocG9vbC0+cHJpc29uLCBjZWxsKTsKKwlkbV9jZWxsX2Vycm9yKHBvb2wtPnByaXNvbiwgY2VsbCwgZXJyb3JfY29kZSk7CiAJZG1fYmlvX3ByaXNvbl9mcmVlX2NlbGwocG9vbC0+cHJpc29uLCBjZWxsKTsKIH0KIAorc3RhdGljIHZvaWQgY2VsbF9lcnJvcihzdHJ1Y3QgcG9vbCAqcG9vbCwgc3RydWN0IGRtX2Jpb19wcmlzb25fY2VsbCAqY2VsbCkKK3sKKwljZWxsX2Vycm9yX3dpdGhfY29kZShwb29sLCBjZWxsLCAtRUlPKTsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTEwMjcsNyArMTAzMiw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGMtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGJvb2wgc2hvdWxkX2Vycm9yX3Vuc2VydmljZWFibGVfYmlvKHN0cnVjdCBwb29sICpwb29sKQorc3RhdGljIGludCBzaG91bGRfZXJyb3JfdW5zZXJ2aWNlYWJsZV9iaW8oc3RydWN0IHBvb2wgKnBvb2wpCiB7CiAJZW51bSBwb29sX21vZGUgbSA9IGdldF9wb29sX21vZGUocG9vbCk7CiAKQEAgLTEwMzUsMjUgKzEwNDAsMjcgQEAKIAljYXNlIFBNX1dSSVRFOgogCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KIAkJRE1FUlJfTElNSVQoImJpbyB1bnNlcnZpY2VhYmxlLCB5ZXQgcG9vbCBpcyBpbiBQTV9XUklURSBtb2RlIik7Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gLUVJTzsKIAogCWNhc2UgUE1fT1VUX09GX0RBVEFfU1BBQ0U6Ci0JCXJldHVybiBwb29sLT5wZi5lcnJvcl9pZl9ub19zcGFjZTsKKwkJcmV0dXJuIHBvb2wtPnBmLmVycm9yX2lmX25vX3NwYWNlID8gLUVOT1NQQyA6IDA7CiAKIAljYXNlIFBNX1JFQURfT05MWToKIAljYXNlIFBNX0ZBSUw6Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gLUVJTzsKIAlkZWZhdWx0OgogCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KIAkJRE1FUlJfTElNSVQoImJpbyB1bnNlcnZpY2VhYmxlLCB5ZXQgcG9vbCBoYXMgYW4gdW5rbm93biBtb2RlIik7Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gLUVJTzsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV91bnNlcnZpY2VhYmxlX2JpbyhzdHJ1Y3QgcG9vbCAqcG9vbCwgc3RydWN0IGJpbyAqYmlvKQogewotCWlmIChzaG91bGRfZXJyb3JfdW5zZXJ2aWNlYWJsZV9iaW8ocG9vbCkpCi0JCWJpb19pb19lcnJvcihiaW8pOworCWludCBlcnJvciA9IHNob3VsZF9lcnJvcl91bnNlcnZpY2VhYmxlX2Jpbyhwb29sKTsKKworCWlmIChlcnJvcikKKwkJYmlvX2VuZGlvKGJpbywgZXJyb3IpOwogCWVsc2UKIAkJcmV0cnlfb25fcmVzdW1lKGJpbyk7CiB9CkBAIC0xMDYyLDE4ICsxMDY5LDIxIEBACiB7CiAJc3RydWN0IGJpbyAqYmlvOwogCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworCWludCBlcnJvcjsKIAotCWlmIChzaG91bGRfZXJyb3JfdW5zZXJ2aWNlYWJsZV9iaW8ocG9vbCkpIHsKLQkJY2VsbF9lcnJvcihwb29sLCBjZWxsKTsKKwllcnJvciA9IHNob3VsZF9lcnJvcl91bnNlcnZpY2VhYmxlX2Jpbyhwb29sKTsKKwlpZiAoZXJyb3IpIHsKKwkJY2VsbF9lcnJvcl93aXRoX2NvZGUocG9vbCwgY2VsbCwgZXJyb3IpOwogCQlyZXR1cm47CiAJfQogCiAJYmlvX2xpc3RfaW5pdCgmYmlvcyk7CiAJY2VsbF9yZWxlYXNlKHBvb2wsIGNlbGwsICZiaW9zKTsKIAotCWlmIChzaG91bGRfZXJyb3JfdW5zZXJ2aWNlYWJsZV9iaW8ocG9vbCkpCisJZXJyb3IgPSBzaG91bGRfZXJyb3JfdW5zZXJ2aWNlYWJsZV9iaW8ocG9vbCk7CisJaWYgKGVycm9yKQogCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQotCQkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCQliaW9fZW5kaW8oYmlvLCBlcnJvcik7CiAJZWxzZQogCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQogCQkJcmV0cnlfb25fcmVzdW1lKGJpbyk7CkBAIC0xNjEwLDQ3ICsxNjIwLDYzIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCBub2ZsdXNoX3dvcmsgeworc3RydWN0IHBvb2xfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtlcjsKLQlzdHJ1Y3QgdGhpbl9jICp0YzsKLQotCWF0b21pY190IGNvbXBsZXRlOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CiB9OwogCi1zdGF0aWMgdm9pZCBjb21wbGV0ZV9ub2ZsdXNoX3dvcmsoc3RydWN0IG5vZmx1c2hfd29yayAqdykKK3N0YXRpYyBzdHJ1Y3QgcG9vbF93b3JrICp0b19wb29sX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKIHsKLQlhdG9taWNfc2V0KCZ3LT5jb21wbGV0ZSwgMSk7Ci0Jd2FrZV91cCgmdy0+d2FpdCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih3cywgc3RydWN0IHBvb2xfd29yaywgd29ya2VyKTsKK30KKworc3RhdGljIHZvaWQgcG9vbF93b3JrX2NvbXBsZXRlKHN0cnVjdCBwb29sX3dvcmsgKnB3KQoreworCWNvbXBsZXRlKCZwdy0+Y29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBwb29sX3dvcmtfd2FpdChzdHJ1Y3QgcG9vbF93b3JrICpwdywgc3RydWN0IHBvb2wgKnBvb2wsCisJCQkgICB2b2lkICgqZm4pKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKK3sKKwlJTklUX1dPUktfT05TVEFDSygmcHctPndvcmtlciwgZm4pOworCWluaXRfY29tcGxldGlvbigmcHctPmNvbXBsZXRlKTsKKwlxdWV1ZV93b3JrKHBvb2wtPndxLCAmcHctPndvcmtlcik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcHctPmNvbXBsZXRlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IG5vZmx1c2hfd29yayB7CisJc3RydWN0IHBvb2xfd29yayBwdzsKKwlzdHJ1Y3QgdGhpbl9jICp0YzsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm9mbHVzaF93b3JrICp0b19ub2ZsdXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0b19wb29sX3dvcmsod3MpLCBzdHJ1Y3Qgbm9mbHVzaF93b3JrLCBwdyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX25vZmx1c2hfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKIHsKLQlzdHJ1Y3Qgbm9mbHVzaF93b3JrICp3ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3Qgbm9mbHVzaF93b3JrLCB3b3JrZXIpOworCXN0cnVjdCBub2ZsdXNoX3dvcmsgKncgPSB0b19ub2ZsdXNoKHdzKTsKIAl3LT50Yy0+cmVxdWV1ZV9tb2RlID0gdHJ1ZTsKIAlyZXF1ZXVlX2lvKHctPnRjKTsKLQljb21wbGV0ZV9ub2ZsdXNoX3dvcmsodyk7CisJcG9vbF93b3JrX2NvbXBsZXRlKCZ3LT5wdyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX25vZmx1c2hfc3RvcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewotCXN0cnVjdCBub2ZsdXNoX3dvcmsgKncgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBub2ZsdXNoX3dvcmssIHdvcmtlcik7CisJc3RydWN0IG5vZmx1c2hfd29yayAqdyA9IHRvX25vZmx1c2god3MpOwogCXctPnRjLT5yZXF1ZXVlX21vZGUgPSBmYWxzZTsKLQljb21wbGV0ZV9ub2ZsdXNoX3dvcmsodyk7CisJcG9vbF93b3JrX2NvbXBsZXRlKCZ3LT5wdyk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vZmx1c2hfd29yayhzdHJ1Y3QgdGhpbl9jICp0Yywgdm9pZCAoKmZuKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikpCiB7CiAJc3RydWN0IG5vZmx1c2hfd29yayB3OwogCi0JSU5JVF9XT1JLX09OU1RBQ0soJncud29ya2VyLCBmbik7CiAJdy50YyA9IHRjOwotCWF0b21pY19zZXQoJncuY29tcGxldGUsIDApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJncud2FpdCk7Ci0KLQlxdWV1ZV93b3JrKHRjLT5wb29sLT53cSwgJncud29ya2VyKTsKLQotCXdhaXRfZXZlbnQody53YWl0LCBhdG9taWNfcmVhZCgmdy5jb21wbGV0ZSkpOworCXBvb2xfd29ya193YWl0KCZ3LnB3LCB0Yy0+cG9vbCwgZm4pOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzA2OCw3ICszMDk0LDggQEAKIAkgKi8KIAlpZiAocHQtPmFkanVzdGVkX3BmLmRpc2NhcmRfcGFzc2Rvd24pIHsKIAkJZGF0YV9saW1pdHMgPSAmYmRldl9nZXRfcXVldWUocHQtPmRhdGFfZGV2LT5iZGV2KS0+bGltaXRzOwotCQlsaW1pdHMtPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBkYXRhX2xpbWl0cy0+ZGlzY2FyZF9ncmFudWxhcml0eTsKKwkJbGltaXRzLT5kaXNjYXJkX2dyYW51bGFyaXR5ID0gbWF4KGRhdGFfbGltaXRzLT5kaXNjYXJkX2dyYW51bGFyaXR5LAorCQkJCQkJICBwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOwogCX0gZWxzZQogCQlsaW1pdHMtPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggYWE5ZTA5My4uNDM3ZDk5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtNzU1LDYgKzc1NSwxNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZGlzYWJsZV93cml0ZV9zYW1lKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW1pdHMgPSBkbV9nZXRfcXVldWVfbGltaXRzKG1kKTsKKworCS8qIGRldmljZSBkb2Vzbid0IHJlYWxseSBzdXBwb3J0IFdSSVRFIFNBTUUsIGRpc2FibGUgaXQgKi8KKwlsaW1pdHMtPm1heF93cml0ZV9zYW1lX3NlY3RvcnMgPSAwOworfQorCiBzdGF0aWMgdm9pZCBjbG9uZV9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKIHsKIAlpbnQgciA9IDA7CkBAIC03ODMsNiArNzkxLDEwIEBACiAJCX0KIAl9CiAKKwlpZiAodW5saWtlbHkociA9PSAtRVJFTU9URUlPICYmIChiaW8tPmJpX3J3ICYgUkVRX1dSSVRFX1NBTUUpICYmCisJCSAgICAgIWJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldiktPmxpbWl0cy5tYXhfd3JpdGVfc2FtZV9zZWN0b3JzKSkKKwkJZGlzYWJsZV93cml0ZV9zYW1lKG1kKTsKKwogCWZyZWVfdGlvKG1kLCB0aW8pOwogCWRlY19wZW5kaW5nKGlvLCBlcnJvcik7CiB9CkBAIC05NzcsNiArOTg5LDEwIEBACiAJCQlyID0gcnFfZW5kX2lvKHRpby0+dGksIGNsb25lLCBlcnJvciwgJnRpby0+aW5mbyk7CiAJfQogCisJaWYgKHVubGlrZWx5KHIgPT0gLUVSRU1PVEVJTyAmJiAoY2xvbmUtPmNtZF9mbGFncyAmIFJFUV9XUklURV9TQU1FKSAmJgorCQkgICAgICFjbG9uZS0+cS0+bGltaXRzLm1heF93cml0ZV9zYW1lX3NlY3RvcnMpKQorCQlkaXNhYmxlX3dyaXRlX3NhbWUodGlvLT5tZCk7CisKIAlpZiAociA8PSAwKQogCQkvKiBUaGUgdGFyZ2V0IHdhbnRzIHRvIGNvbXBsZXRlIHRoZSBJL08gKi8KIAkJZG1fZW5kX3JlcXVlc3QoY2xvbmUsIHIpOwpAQCAtMTExMCw2ICsxMTI2LDQ2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkbV9zZXRfdGFyZ2V0X21heF9pb19sZW4pOwogCisvKgorICogQSB0YXJnZXQgbWF5IGNhbGwgZG1fYWNjZXB0X3BhcnRpYWxfYmlvIG9ubHkgZnJvbSB0aGUgbWFwIHJvdXRpbmUuICBJdCBpcworICogYWxsb3dlZCBmb3IgYWxsIGJpbyB0eXBlcyBleGNlcHQgUkVRX0ZMVVNILgorICoKKyAqIGRtX2FjY2VwdF9wYXJ0aWFsX2JpbyBpbmZvcm1zIHRoZSBkbSB0aGF0IHRoZSB0YXJnZXQgb25seSB3YW50cyB0byBwcm9jZXNzCisgKiBhZGRpdGlvbmFsIG5fc2VjdG9ycyBzZWN0b3JzIG9mIHRoZSBiaW8gYW5kIHRoZSByZXN0IG9mIHRoZSBkYXRhIHNob3VsZCBiZQorICogc2VudCBpbiBhIG5leHQgYmlvLgorICoKKyAqIEEgZGlhZ3JhbSB0aGF0IGV4cGxhaW5zIHRoZSBhcml0aG1ldGljczoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKyAqIHwgICAgICAgICAxICAgICAgICAgIHwgICAgICAgMiAgICAgICB8ICAgMyAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKyAqCisgKiA8LS0tLS0tLS0tLS0tLS0gKnRpby0+bGVuX3B0ciAtLS0tLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICAgICA8LS0tLS0tLSBiaV9zaXplIC0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICAgICA8LS0gbl9zZWN0b3JzIC0tPgorICoKKyAqIFJlZ2lvbiAxIHdhcyBhbHJlYWR5IGl0ZXJhdGVkIG92ZXIgd2l0aCBiaW9fYWR2YW5jZSBvciBzaW1pbGFyIGZ1bmN0aW9uLgorICoJKGl0IG1heSBiZSBlbXB0eSBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgdXNlIGJpb19hZHZhbmNlKQorICogUmVnaW9uIDIgaXMgdGhlIHJlbWFpbmluZyBiaW8gc2l6ZSB0aGF0IHRoZSB0YXJnZXQgd2FudHMgdG8gcHJvY2Vzcy4KKyAqCShpdCBtYXkgYmUgZW1wdHkgaWYgcmVnaW9uIDEgaXMgbm9uLWVtcHR5LCBhbHRob3VnaCB0aGVyZSBpcyBubyByZWFzb24KKyAqCSB0byBtYWtlIGl0IGVtcHR5KQorICogVGhlIHRhcmdldCByZXF1aXJlcyB0aGF0IHJlZ2lvbiAzIGlzIHRvIGJlIHNlbnQgaW4gdGhlIG5leHQgYmlvLgorICoKKyAqIElmIHRoZSB0YXJnZXQgd2FudHMgdG8gcmVjZWl2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIGJpbyAodmlhIG51bV8qYmlvcywgZXRjKSwKKyAqIHRoZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkIHBhcnQgKHRoZSBzdW0gb2YgcmVnaW9ucyAxKzIpIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbAorICogY29waWVzIG9mIHRoZSBiaW8uCisgKi8KK3ZvaWQgZG1fYWNjZXB0X3BhcnRpYWxfYmlvKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbl9zZWN0b3JzKQoreworCXN0cnVjdCBkbV90YXJnZXRfaW8gKnRpbyA9IGNvbnRhaW5lcl9vZihiaW8sIHN0cnVjdCBkbV90YXJnZXRfaW8sIGNsb25lKTsKKwl1bnNpZ25lZCBiaV9zaXplID0gYmlvLT5iaV9pdGVyLmJpX3NpemUgPj4gU0VDVE9SX1NISUZUOworCUJVR19PTihiaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKKwlCVUdfT04oYmlfc2l6ZSA+ICp0aW8tPmxlbl9wdHIpOworCUJVR19PTihuX3NlY3RvcnMgPiBiaV9zaXplKTsKKwkqdGlvLT5sZW5fcHRyIC09IGJpX3NpemUgLSBuX3NlY3RvcnM7CisJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBuX3NlY3RvcnMgPDwgU0VDVE9SX1NISUZUOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYWNjZXB0X3BhcnRpYWxfYmlvKTsKKwogc3RhdGljIHZvaWQgX19tYXBfYmlvKHN0cnVjdCBkbV90YXJnZXRfaW8gKnRpbykKIHsKIAlpbnQgcjsKQEAgLTExNTIsMTAgKzEyMDgsMTAgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJc3RydWN0IGRtX2lvICppbzsKIAlzZWN0b3JfdCBzZWN0b3I7Ci0Jc2VjdG9yX3Qgc2VjdG9yX2NvdW50OworCXVuc2lnbmVkIHNlY3Rvcl9jb3VudDsKIH07CiAKLXN0YXRpYyB2b2lkIGJpb19zZXR1cF9zZWN0b3Ioc3RydWN0IGJpbyAqYmlvLCBzZWN0b3JfdCBzZWN0b3IsIHNlY3Rvcl90IGxlbikKK3N0YXRpYyB2b2lkIGJpb19zZXR1cF9zZWN0b3Ioc3RydWN0IGJpbyAqYmlvLCBzZWN0b3JfdCBzZWN0b3IsIHVuc2lnbmVkIGxlbikKIHsKIAliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCWJpby0+YmlfaXRlci5iaV9zaXplID0gdG9fYnl0ZXMobGVuKTsKQEAgLTEyMDAsMTEgKzEyNTYsMTMgQEAKIAogc3RhdGljIHZvaWQgX19jbG9uZV9hbmRfbWFwX3NpbXBsZV9iaW8oc3RydWN0IGNsb25lX2luZm8gKmNpLAogCQkJCSAgICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJCQkgICAgICAgdW5zaWduZWQgdGFyZ2V0X2Jpb19uciwgc2VjdG9yX3QgbGVuKQorCQkJCSAgICAgICB1bnNpZ25lZCB0YXJnZXRfYmlvX25yLCB1bnNpZ25lZCAqbGVuKQogewogCXN0cnVjdCBkbV90YXJnZXRfaW8gKnRpbyA9IGFsbG9jX3RpbyhjaSwgdGksIGNpLT5iaW8tPmJpX21heF92ZWNzLCB0YXJnZXRfYmlvX25yKTsKIAlzdHJ1Y3QgYmlvICpjbG9uZSA9ICZ0aW8tPmNsb25lOwogCisJdGlvLT5sZW5fcHRyID0gbGVuOworCiAJLyoKIAkgKiBEaXNjYXJkIHJlcXVlc3RzIHJlcXVpcmUgdGhlIGJpbydzIGlubGluZSBpb3ZlY3MgYmUgaW5pdGlhbGl6ZWQuCiAJICogY2ktPmJpby0+YmlfbWF4X3ZlY3MgaXMgQklPX0lOTElORV9WRUNTIGFueXdheSwgZm9yIGJvdGggZmx1c2gKQEAgLTEyMTIsMTMgKzEyNzAsMTMgQEAKIAkgKi8KIAkgX19iaW9fY2xvbmVfZmFzdChjbG9uZSwgY2ktPmJpbyk7CiAJaWYgKGxlbikKLQkJYmlvX3NldHVwX3NlY3RvcihjbG9uZSwgY2ktPnNlY3RvciwgbGVuKTsKKwkJYmlvX3NldHVwX3NlY3RvcihjbG9uZSwgY2ktPnNlY3RvciwgKmxlbik7CiAKIAlfX21hcF9iaW8odGlvKTsKIH0KIAogc3RhdGljIHZvaWQgX19zZW5kX2R1cGxpY2F0ZV9iaW9zKHN0cnVjdCBjbG9uZV9pbmZvICpjaSwgc3RydWN0IGRtX3RhcmdldCAqdGksCi0JCQkJICB1bnNpZ25lZCBudW1fYmlvcywgc2VjdG9yX3QgbGVuKQorCQkJCSAgdW5zaWduZWQgbnVtX2Jpb3MsIHVuc2lnbmVkICpsZW4pCiB7CiAJdW5zaWduZWQgdGFyZ2V0X2Jpb19ucjsKIApAQCAtMTIzMywxMyArMTI5MSwxMyBAQAogCiAJQlVHX09OKGJpb19oYXNfZGF0YShjaS0+YmlvKSk7CiAJd2hpbGUgKCh0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQoY2ktPm1hcCwgdGFyZ2V0X25yKyspKSkKLQkJX19zZW5kX2R1cGxpY2F0ZV9iaW9zKGNpLCB0aSwgdGktPm51bV9mbHVzaF9iaW9zLCAwKTsKKwkJX19zZW5kX2R1cGxpY2F0ZV9iaW9zKGNpLCB0aSwgdGktPm51bV9mbHVzaF9iaW9zLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2Nsb25lX2FuZF9tYXBfZGF0YV9iaW8oc3RydWN0IGNsb25lX2luZm8gKmNpLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJCQkgICAgIHNlY3Rvcl90IHNlY3RvciwgdW5zaWduZWQgbGVuKQorCQkJCSAgICAgc2VjdG9yX3Qgc2VjdG9yLCB1bnNpZ25lZCAqbGVuKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IGNpLT5iaW87CiAJc3RydWN0IGRtX3RhcmdldF9pbyAqdGlvOwpAQCAtMTI1NCw3ICsxMzEyLDggQEAKIAogCWZvciAodGFyZ2V0X2Jpb19uciA9IDA7IHRhcmdldF9iaW9fbnIgPCBudW1fdGFyZ2V0X2Jpb3M7IHRhcmdldF9iaW9fbnIrKykgewogCQl0aW8gPSBhbGxvY190aW8oY2ksIHRpLCAwLCB0YXJnZXRfYmlvX25yKTsKLQkJY2xvbmVfYmlvKHRpbywgYmlvLCBzZWN0b3IsIGxlbik7CisJCXRpby0+bGVuX3B0ciA9IGxlbjsKKwkJY2xvbmVfYmlvKHRpbywgYmlvLCBzZWN0b3IsICpsZW4pOwogCQlfX21hcF9iaW8odGlvKTsKIAl9CiB9CkBAIC0xMjgzLDcgKzEzNDIsNyBAQAogCQkJCSAgICAgICBpc19zcGxpdF9yZXF1aXJlZF9mbiBpc19zcGxpdF9yZXF1aXJlZCkKIHsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKLQlzZWN0b3JfdCBsZW47CisJdW5zaWduZWQgbGVuOwogCXVuc2lnbmVkIG51bV9iaW9zOwogCiAJZG8gewpAQCAtMTMwMiwxMSArMTM2MSwxMSBAQAogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJCWlmIChpc19zcGxpdF9yZXF1aXJlZCAmJiAhaXNfc3BsaXRfcmVxdWlyZWQodGkpKQotCQkJbGVuID0gbWluKGNpLT5zZWN0b3JfY291bnQsIG1heF9pb19sZW5fdGFyZ2V0X2JvdW5kYXJ5KGNpLT5zZWN0b3IsIHRpKSk7CisJCQlsZW4gPSBtaW4oKHNlY3Rvcl90KWNpLT5zZWN0b3JfY291bnQsIG1heF9pb19sZW5fdGFyZ2V0X2JvdW5kYXJ5KGNpLT5zZWN0b3IsIHRpKSk7CiAJCWVsc2UKLQkJCWxlbiA9IG1pbihjaS0+c2VjdG9yX2NvdW50LCBtYXhfaW9fbGVuKGNpLT5zZWN0b3IsIHRpKSk7CisJCQlsZW4gPSBtaW4oKHNlY3Rvcl90KWNpLT5zZWN0b3JfY291bnQsIG1heF9pb19sZW4oY2ktPnNlY3RvciwgdGkpKTsKIAotCQlfX3NlbmRfZHVwbGljYXRlX2Jpb3MoY2ksIHRpLCBudW1fYmlvcywgbGVuKTsKKwkJX19zZW5kX2R1cGxpY2F0ZV9iaW9zKGNpLCB0aSwgbnVtX2Jpb3MsICZsZW4pOwogCiAJCWNpLT5zZWN0b3IgKz0gbGVuOwogCX0gd2hpbGUgKGNpLT5zZWN0b3JfY291bnQgLT0gbGVuKTsKQEAgLTEzNDUsNyArMTQwNCw3IEBACiAKIAlsZW4gPSBtaW5fdChzZWN0b3JfdCwgbWF4X2lvX2xlbihjaS0+c2VjdG9yLCB0aSksIGNpLT5zZWN0b3JfY291bnQpOwogCi0JX19jbG9uZV9hbmRfbWFwX2RhdGFfYmlvKGNpLCB0aSwgY2ktPnNlY3RvciwgbGVuKTsKKwlfX2Nsb25lX2FuZF9tYXBfZGF0YV9iaW8oY2ksIHRpLCBjaS0+c2VjdG9yLCAmbGVuKTsKIAogCWNpLT5zZWN0b3IgKz0gbGVuOwogCWNpLT5zZWN0b3JfY291bnQgLT0gbGVuOwpAQCAtMTQzOSw3ICsxNDk4LDYgQEAKIAkgKiBqdXN0IG9uZSBwYWdlLgogCSAqLwogCWVsc2UgaWYgKHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw9IFBBR0VfU0laRSA+PiA5KQotCiAJCW1heF9zaXplID0gMDsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnCmluZGV4IDIwZjE2NTUuLjgxMDhjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcKQEAgLTkzLDcgKzkzLDkgQEAKIAogY29uZmlnIFZJREVPX09NQVAzCiAJdHJpc3RhdGUgIk9NQVAgMyBDYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE9NQVBfSU9WTU0gJiYgVklERU9fVjRMMiAmJiBJMkMgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJICYmIEFSQ0hfT01BUDMKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBBUkNIX09NQVAzCisJc2VsZWN0IEFSTV9ETUFfVVNFX0lPTU1VCisJc2VsZWN0IE9NQVBfSU9NTVUKIAktLS1oZWxwLS0tCiAJICBEcml2ZXIgZm9yIGFuIE9NQVAgMyBjYW1lcmEgY29udHJvbGxlci4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvTWFrZWZpbGUKaW5kZXggZTg4NDdlNy4uMjU0OTc1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogY2NmbGFncy0kKENPTkZJR19WSURFT19PTUFQM19ERUJVRykgKz0gLURERUJVRwogCiBvbWFwMy1pc3Atb2JqcyArPSBcCi0JaXNwLm8gaXNwcXVldWUubyBpc3B2aWRlby5vIFwKKwlpc3AubyBpc3B2aWRlby5vIFwKIAlpc3Bjc2lwaHkubyBpc3BjY3AyLm8gaXNwY3NpMi5vIFwKIAlpc3BjY2RjLm8gaXNwcHJldmlldy5vIGlzcHJlc2l6ZXIubyBcCiAJaXNwc3RhdC5vIGlzcGgzYV9hZXdiLm8gaXNwaDNhX2FmLm8gaXNwaGlzdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuYwppbmRleCAwNmEwZGY0My4uMmM3YWE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcC5jCkBAIC02OSw2ICs2OSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKKyNpbmNsdWRlIDxhc20vZG1hLWlvbW11Lmg+CisKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKQEAgLTEzOTcsMTQgKzEzOTksMTQgQEAKIAlpZiAoaXNwX3BpcGVsaW5lX2lzX2xhc3QobWUpKSB7CiAJCXN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvID0gcGlwZS0+b3V0cHV0OwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogCQlpZiAodmlkZW8tPmRtYXF1ZXVlX2ZsYWdzICYgSVNQX1ZJREVPX0RNQVFVRVVFX1VOREVSUlVOKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+cXVldWUtPmlycWxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CiAJCQlhdG9taWNfc2V0KHN0b3BwaW5nLCAwKTsKIAkJCXNtcF9tYigpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CiAJCWlmICghd2FpdF9ldmVudF90aW1lb3V0KCp3YWl0LCAhYXRvbWljX3JlYWQoc3RvcHBpbmcpLAogCQkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKSkgewogCQkJYXRvbWljX3NldChzdG9wcGluZywgMCk7CkBAIC0xNjI1LDcgKzE2MjcsNyBAQAogICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIElTUC4gSWYgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLAogICogcG93ZXItZG93biBhbGwgc3VibW9kdWxlcywgZGlzYWJsZSBjbG9ja3MgYW5kIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlcnMuCiAgKi8KLXZvaWQgb21hcDNpc3BfcHV0KHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCitzdGF0aWMgdm9pZCBfX29tYXAzaXNwX3B1dChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwLCBib29sIHNhdmVfY3R4KQogewogCWlmIChpc3AgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTYzNCw3ICsxNjM2LDcgQEAKIAlCVUdfT04oaXNwLT5yZWZfY291bnQgPT0gMCk7CiAJaWYgKC0taXNwLT5yZWZfY291bnQgPT0gMCkgewogCQlpc3BfZGlzYWJsZV9pbnRlcnJ1cHRzKGlzcCk7Ci0JCWlmIChpc3AtPmRvbWFpbikgeworCQlpZiAoc2F2ZV9jdHgpIHsKIAkJCWlzcF9zYXZlX2N0eChpc3ApOwogCQkJaXNwLT5oYXNfY29udGV4dCA9IDE7CiAJCX0KQEAgLTE2NDgsNiArMTY1MCwxMSBAQAogCW11dGV4X3VubG9jaygmaXNwLT5pc3BfbXV0ZXgpOwogfQogCit2b2lkIG9tYXAzaXNwX3B1dChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQoreworCV9fb21hcDNpc3BfcHV0KGlzcCwgdHJ1ZSk7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQbGF0Zm9ybSBkZXZpY2UgZHJpdmVyCiAgKi8KQEAgLTIxMjAsNiArMjEyNyw2MSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGlzcF9kZXRhY2hfaW9tbXUoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKK3sKKwlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKGlzcC0+bWFwcGluZyk7CisJaXNwLT5tYXBwaW5nID0gTlVMTDsKKwlpb21tdV9ncm91cF9yZW1vdmVfZGV2aWNlKGlzcC0+ZGV2KTsKK30KKworc3RhdGljIGludCBpc3BfYXR0YWNoX2lvbW11KHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCit7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nOworCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXA7CisJaW50IHJldDsKKworCS8qIENyZWF0ZSBhIGRldmljZSBncm91cCBhbmQgYWRkIHRoZSBkZXZpY2UgdG8gaXQuICovCisJZ3JvdXAgPSBpb21tdV9ncm91cF9hbGxvYygpOworCWlmIChJU19FUlIoZ3JvdXApKSB7CisJCWRldl9lcnIoaXNwLT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgSU9NTVUgZ3JvdXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihncm91cCk7CisJfQorCisJcmV0ID0gaW9tbXVfZ3JvdXBfYWRkX2RldmljZShncm91cCwgaXNwLT5kZXYpOworCWlvbW11X2dyb3VwX3B1dChncm91cCk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGlzcC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBkZXZpY2UgdG8gSVBNTVUgZ3JvdXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBBUk0gbWFwcGluZywgdXNlZCBieSB0aGUgQVJNIERNQSBtYXBwaW5nIGNvcmUgdG8gYWxsb2NhdGUKKwkgKiBWQXMuIFRoaXMgd2lsbCBhbGxvY2F0ZSBhIGNvcnJlc3BvbmRpbmcgSU9NTVUgZG9tYWluLgorCSAqLworCW1hcHBpbmcgPSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoJnBsYXRmb3JtX2J1c190eXBlLCBTWl8xRywgU1pfMkcpOworCWlmIChJU19FUlIobWFwcGluZykpIHsKKwkJZGV2X2Vycihpc3AtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgQVJNIElPTU1VIG1hcHBpbmdcbiIpOworCQlyZXQgPSBQVFJfRVJSKG1hcHBpbmcpOworCQlnb3RvIGVycm9yOworCX0KKworCWlzcC0+bWFwcGluZyA9IG1hcHBpbmc7CisKKwkvKiBBdHRhY2ggdGhlIEFSTSBWQSBtYXBwaW5nIHRvIHRoZSBkZXZpY2UuICovCisJcmV0ID0gYXJtX2lvbW11X2F0dGFjaF9kZXZpY2UoaXNwLT5kZXYsIG1hcHBpbmcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaXNwLT5kZXYsICJmYWlsZWQgdG8gYXR0YWNoIGRldmljZSB0byBWQSBtYXBwaW5nXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaXNwX2RldGFjaF9pb21tdShpc3ApOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBpc3BfcmVtb3ZlIC0gUmVtb3ZlIElTUCBwbGF0Zm9ybSBkZXZpY2UKICAqIEBwZGV2OiBQb2ludGVyIHRvIElTUCBwbGF0Zm9ybSBkZXZpY2UKQEAgLTIxMzUsMTAgKzIxOTcsOCBAQAogCWlzcF94Y2xrX2NsZWFudXAoaXNwKTsKIAogCV9fb21hcDNpc3BfZ2V0KGlzcCwgZmFsc2UpOwotCWlvbW11X2RldGFjaF9kZXZpY2UoaXNwLT5kb21haW4sICZwZGV2LT5kZXYpOwotCWlvbW11X2RvbWFpbl9mcmVlKGlzcC0+ZG9tYWluKTsKLQlpc3AtPmRvbWFpbiA9IE5VTEw7Ci0Jb21hcDNpc3BfcHV0KGlzcCk7CisJaXNwX2RldGFjaF9pb21tdShpc3ApOworCV9fb21hcDNpc3BfcHV0KGlzcCwgZmFsc2UpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjY1LDM5ICsyMzI1LDMyIEBACiAJCX0KIAl9CiAKLQlpc3AtPmRvbWFpbiA9IGlvbW11X2RvbWFpbl9hbGxvYyhwZGV2LT5kZXYuYnVzKTsKLQlpZiAoIWlzcC0+ZG9tYWluKSB7Ci0JCWRldl9lcnIoaXNwLT5kZXYsICJjYW4ndCBhbGxvYyBpb21tdSBkb21haW5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOworCS8qIElPTU1VICovCisJcmV0ID0gaXNwX2F0dGFjaF9pb21tdShpc3ApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhdHRhY2ggdG8gSU9NTVVcbiIpOwogCQlnb3RvIGVycm9yX2lzcDsKIAl9CiAKLQlyZXQgPSBpb21tdV9hdHRhY2hfZGV2aWNlKGlzcC0+ZG9tYWluLCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGF0dGFjaCBpb21tdSBkZXZpY2U6ICVkXG4iLCByZXQpOwotCQlyZXQgPSAtRVBST0JFX0RFRkVSOwotCQlnb3RvIGZyZWVfZG9tYWluOwotCX0KLQogCS8qIEludGVycnVwdCAqLwogCWlzcC0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlzcC0+aXJxX251bSA8PSAwKSB7CiAJCWRldl9lcnIoaXNwLT5kZXYsICJObyBJUlEgcmVzb3VyY2VcbiIpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGRldGFjaF9kZXY7CisJCWdvdG8gZXJyb3JfaW9tbXU7CiAJfQogCiAJaWYgKGRldm1fcmVxdWVzdF9pcnEoaXNwLT5kZXYsIGlzcC0+aXJxX251bSwgaXNwX2lzciwgSVJRRl9TSEFSRUQsCiAJCQkgICAgICJPTUFQMyBJU1AiLCBpc3ApKSB7CiAJCWRldl9lcnIoaXNwLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBJUlFcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRldGFjaF9kZXY7CisJCWdvdG8gZXJyb3JfaW9tbXU7CiAJfQogCiAJLyogRW50aXRpZXMgKi8KIAlyZXQgPSBpc3BfaW5pdGlhbGl6ZV9tb2R1bGVzKGlzcCk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZGV0YWNoX2RldjsKKwkJZ290byBlcnJvcl9pb21tdTsKIAogCXJldCA9IGlzcF9yZWdpc3Rlcl9lbnRpdGllcyhpc3ApOwogCWlmIChyZXQgPCAwKQpAQCAtMjMxMCwxNCArMjM2MywxMSBAQAogCiBlcnJvcl9tb2R1bGVzOgogCWlzcF9jbGVhbnVwX21vZHVsZXMoaXNwKTsKLWRldGFjaF9kZXY6Ci0JaW9tbXVfZGV0YWNoX2RldmljZShpc3AtPmRvbWFpbiwgJnBkZXYtPmRldik7Ci1mcmVlX2RvbWFpbjoKLQlpb21tdV9kb21haW5fZnJlZShpc3AtPmRvbWFpbik7Ci0JaXNwLT5kb21haW4gPSBOVUxMOworZXJyb3JfaW9tbXU6CisJaXNwX2RldGFjaF9pb21tdShpc3ApOwogZXJyb3JfaXNwOgogCWlzcF94Y2xrX2NsZWFudXAoaXNwKTsKLQlvbWFwM2lzcF9wdXQoaXNwKTsKKwlfX29tYXAzaXNwX3B1dChpc3AsIGZhbHNlKTsKIGVycm9yOgogCW11dGV4X2Rlc3Ryb3koJmlzcC0+aXNwX211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwLmgKaW5kZXggNmQ1ZTY5Ny4uMmMzMTRlZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3AuaApAQCAtNDUsOCArNDUsNiBAQAogI2luY2x1ZGUgImlzcGNzaTIuaCIKICNpbmNsdWRlICJpc3BjY3AyLmgiCiAKLSNkZWZpbmUgSU9NTVVfRkxBRyAoSU9WTUZfRU5ESUFOX0xJVFRMRSB8IElPVk1GX0VMU1pfOCkKLQogI2RlZmluZSBJU1BfVE9LX1RFUk0JCTB4RkZGRkZGRkYJLyoKIAkJCQkJCSAqIHRlcm1pbmF0aW5nIHRva2VuIGZvciBJU1AKIAkJCQkJCSAqIG1vZHVsZXMgcmVnIGxpc3QKQEAgLTE1Miw2ICsxNTAsNyBAQAogICogICAgICAgICAgICAgcmVnaW9ucy4KICAqIEBtbWlvX2Jhc2VfcGh5czogQXJyYXkgd2l0aCBwaHlzaWNhbCBMNCBidXMgYWRkcmVzc2VzIGZvciBJU1AgcmVnaXN0ZXIKICAqICAgICAgICAgICAgICAgICAgcmVnaW9ucy4KKyAqIEBtYXBwaW5nOiBJT01NVSBtYXBwaW5nCiAgKiBAc3RhdF9sb2NrOiBTcGlubG9jayBmb3IgaGFuZGxpbmcgc3RhdGlzdGljcwogICogQGlzcF9tdXRleDogTXV0ZXggZm9yIHNlcmlhbGl6aW5nIHJlcXVlc3RzIHRvIElTUC4KICAqIEBzdG9wX2ZhaWx1cmU6IEluZGljYXRlcyB0aGF0IGFuIGVudGl0eSBmYWlsZWQgdG8gc3RvcC4KQEAgLTE3MSw3ICsxNzAsNiBAQAogICogQGlzcF9yZXM6IFBvaW50ZXIgdG8gY3VycmVudCBzZXR0aW5ncyBmb3IgSVNQIFJlc2l6ZXIuCiAgKiBAaXNwX3ByZXY6IFBvaW50ZXIgdG8gY3VycmVudCBzZXR0aW5ncyBmb3IgSVNQIFByZXZpZXcuCiAgKiBAaXNwX2NjZGM6IFBvaW50ZXIgdG8gY3VycmVudCBzZXR0aW5ncyBmb3IgSVNQIENDREMuCi0gKiBAaW9tbXU6IFBvaW50ZXIgdG8gcmVxdWVzdGVkIElPTU1VIGluc3RhbmNlIGZvciBJU1AuCiAgKiBAcGxhdGZvcm1fY2I6IElTUCBkcml2ZXIgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHBsYXRmb3JtIGNvZGUKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBPTUFQIElTUCBJbmZvcm1hdGlvbi4KQEAgLTE4OSw2ICsxODcsOCBAQAogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlW09NQVAzX0lTUF9JT01FTV9MQVNUXTsKIAl1bnNpZ25lZCBsb25nIG1taW9fYmFzZV9waHlzW09NQVAzX0lTUF9JT01FTV9MQVNUXTsKIAorCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZzsKKwogCS8qIElTUCBPYmogKi8KIAlzcGlubG9ja190IHN0YXRfbG9jazsJLyogY29tbW9uIGxvY2sgZm9yIHN0YXRpc3RpYyBkcml2ZXJzICovCiAJc3RydWN0IG11dGV4IGlzcF9tdXRleDsJLyogRm9yIGhhbmRsaW5nIHJlZl9jb3VudCBmaWVsZCAqLwpAQCAtMjE5LDggKzIxOSw2IEBACiAKIAl1bnNpZ25lZCBpbnQgc2JsX3Jlc291cmNlczsKIAl1bnNpZ25lZCBpbnQgc3ViY2xrX3Jlc291cmNlczsKLQotCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsKIH07CiAKICNkZWZpbmUgdjRsMl9kZXZfdG9faXNwX2RldmljZShkZXYpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NkYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKaW5kZXggNGQ5MjBjOC4uOWY3MjdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvb21hcC1pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KQEAgLTIwNiw3ICsyMDUsOCBAQAogICogY2NkY19sc2NfcHJvZ3JhbV90YWJsZSAtIFByb2dyYW0gTGVucyBTaGFkaW5nIENvbXBlbnNhdGlvbiB0YWJsZSBhZGRyZXNzLgogICogQGNjZGM6IFBvaW50ZXIgdG8gSVNQIENDREMgZGV2aWNlLgogICovCi1zdGF0aWMgdm9pZCBjY2RjX2xzY19wcm9ncmFtX3RhYmxlKHN0cnVjdCBpc3BfY2NkY19kZXZpY2UgKmNjZGMsIHUzMiBhZGRyKQorc3RhdGljIHZvaWQgY2NkY19sc2NfcHJvZ3JhbV90YWJsZShzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjLAorCQkJCSAgIGRtYV9hZGRyX3QgYWRkcikKIHsKIAlpc3BfcmVnX3dyaXRlbCh0b19pc3BfZGV2aWNlKGNjZGMpLCBhZGRyLAogCQkgICAgICAgT01BUDNfSVNQX0lPTUVNX0NDREMsIElTUENDRENfTFNDX1RBQkxFX0JBU0UpOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAljY2RjX2xzY19zZXR1cF9yZWdzKGNjZGMsICZyZXEtPmNvbmZpZyk7Ci0JY2NkY19sc2NfcHJvZ3JhbV90YWJsZShjY2RjLCByZXEtPnRhYmxlKTsKKwljY2RjX2xzY19wcm9ncmFtX3RhYmxlKGNjZGMsIHJlcS0+dGFibGUuZG1hKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY4LDExICszNjgsMTIgQEAKIAlpZiAocmVxID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmIChyZXEtPmlvdm0pCi0JCWRtYV91bm1hcF9zZyhpc3AtPmRldiwgcmVxLT5pb3ZtLT5zZ3QtPnNnbCwKLQkJCSAgICAgcmVxLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfVE9fREVWSUNFKTsKLQlpZiAocmVxLT50YWJsZSkKLQkJb21hcF9pb21tdV92ZnJlZShpc3AtPmRvbWFpbiwgaXNwLT5kZXYsIHJlcS0+dGFibGUpOworCWlmIChyZXEtPnRhYmxlLmFkZHIpIHsKKwkJc2dfZnJlZV90YWJsZSgmcmVxLT50YWJsZS5zZ3QpOworCQlkbWFfZnJlZV9jb2hlcmVudChpc3AtPmRldiwgcmVxLT5jb25maWcuc2l6ZSwgcmVxLT50YWJsZS5hZGRyLAorCQkJCSAgcmVxLT50YWJsZS5kbWEpOworCX0KKwogCWtmcmVlKHJlcSk7CiB9CiAKQEAgLTQxNiw3ICs0MTcsNiBAQAogCXN0cnVjdCBpc3BfZGV2aWNlICppc3AgPSB0b19pc3BfZGV2aWNlKGNjZGMpOwogCXN0cnVjdCBpc3BjY2RjX2xzY19jb25maWdfcmVxICpyZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICp0YWJsZTsKIAl1MTYgdXBkYXRlOwogCWludCByZXQ7CiAKQEAgLTQ0NCwzOCArNDQ0LDMxIEBACiAKIAkJcmVxLT5lbmFibGUgPSAxOwogCi0JCXJlcS0+dGFibGUgPSBvbWFwX2lvbW11X3ZtYWxsb2MoaXNwLT5kb21haW4sIGlzcC0+ZGV2LCAwLAotCQkJCQlyZXEtPmNvbmZpZy5zaXplLCBJT01NVV9GTEFHKTsKLQkJaWYgKElTX0VSUl9WQUxVRShyZXEtPnRhYmxlKSkgewotCQkJcmVxLT50YWJsZSA9IDA7CisJCXJlcS0+dGFibGUuYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChpc3AtPmRldiwgcmVxLT5jb25maWcuc2l6ZSwKKwkJCQkJCSAgICAgJnJlcS0+dGFibGUuZG1hLAorCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKHJlcS0+dGFibGUuYWRkciA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBkb25lOwogCQl9CiAKLQkJcmVxLT5pb3ZtID0gb21hcF9maW5kX2lvdm1fYXJlYShpc3AtPmRldiwgcmVxLT50YWJsZSk7Ci0JCWlmIChyZXEtPmlvdm0gPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKKwkJcmV0ID0gZG1hX2dldF9zZ3RhYmxlKGlzcC0+ZGV2LCAmcmVxLT50YWJsZS5zZ3QsCisJCQkJICAgICAgcmVxLT50YWJsZS5hZGRyLCByZXEtPnRhYmxlLmRtYSwKKwkJCQkgICAgICByZXEtPmNvbmZpZy5zaXplKTsKKwkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGRvbmU7Ci0JCX0KIAotCQlpZiAoIWRtYV9tYXBfc2coaXNwLT5kZXYsIHJlcS0+aW92bS0+c2d0LT5zZ2wsCi0JCQkJcmVxLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfVE9fREVWSUNFKSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCXJlcS0+aW92bSA9IE5VTEw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KKwkJZG1hX3N5bmNfc2dfZm9yX2NwdShpc3AtPmRldiwgcmVxLT50YWJsZS5zZ3Quc2dsLAorCQkJCSAgICByZXEtPnRhYmxlLnNndC5uZW50cywgRE1BX1RPX0RFVklDRSk7CiAKLQkJZG1hX3N5bmNfc2dfZm9yX2NwdShpc3AtPmRldiwgcmVxLT5pb3ZtLT5zZ3QtPnNnbCwKLQkJCQkgICAgcmVxLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfVE9fREVWSUNFKTsKLQotCQl0YWJsZSA9IG9tYXBfZGFfdG9fdmEoaXNwLT5kZXYsIHJlcS0+dGFibGUpOwotCQlpZiAoY29weV9mcm9tX3VzZXIodGFibGUsIGNvbmZpZy0+bHNjLCByZXEtPmNvbmZpZy5zaXplKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIocmVxLT50YWJsZS5hZGRyLCBjb25maWctPmxzYywKKwkJCQkgICByZXEtPmNvbmZpZy5zaXplKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoaXNwLT5kZXYsIHJlcS0+aW92bS0+c2d0LT5zZ2wsCi0JCQkJICAgICAgIHJlcS0+aW92bS0+c2d0LT5uZW50cywgRE1BX1RPX0RFVklDRSk7CisJCWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoaXNwLT5kZXYsIHJlcS0+dGFibGUuc2d0LnNnbCwKKwkJCQkgICAgICAgcmVxLT50YWJsZS5zZ3QubmVudHMsIERNQV9UT19ERVZJQ0UpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjY2RjLT5sc2MucmVxX2xvY2ssIGZsYWdzKTsKQEAgLTU4NCw3ICs1NzcsNyBAQAogCWlmICghY2NkYy0+ZnBjX2VuKQogCQlyZXR1cm47CiAKLQlpc3BfcmVnX3dyaXRlbChpc3AsIGNjZGMtPmZwYy5mcGNhZGRyLCBPTUFQM19JU1BfSU9NRU1fQ0NEQywKKwlpc3BfcmVnX3dyaXRlbChpc3AsIGNjZGMtPmZwYy5kbWEsIE9NQVAzX0lTUF9JT01FTV9DQ0RDLAogCQkgICAgICAgSVNQQ0NEQ19GUENfQUREUik7CiAJLyogVGhlIEZQTlVNIGZpZWxkIG11c3QgYmUgc2V0IGJlZm9yZSBlbmFibGluZyBGUEMuICovCiAJaXNwX3JlZ193cml0ZWwoaXNwLCAoY2NkYy0+ZnBjLmZwbnVtIDw8IElTUENDRENfRlBDX0ZQTlVNX1NISUZUKSwKQEAgLTcyNCw4ICs3MTcsOSBAQAogCWNjZGMtPnNoYWRvd191cGRhdGUgPSAwOwogCiAJaWYgKE9NQVAzSVNQX0NDRENfRlBDICYgY2NkY19zdHJ1Y3QtPnVwZGF0ZSkgewotCQl1MzIgdGFibGVfb2xkID0gMDsKLQkJdTMyIHRhYmxlX25ldzsKKwkJc3RydWN0IG9tYXAzaXNwX2NjZGNfZnBjIGZwYzsKKwkJc3RydWN0IGlzcGNjZGNfZnBjIGZwY19vbGQgPSB7IC5hZGRyID0gTlVMTCwgfTsKKwkJc3RydWN0IGlzcGNjZGNfZnBjIGZwY19uZXc7CiAJCXUzMiBzaXplOwogCiAJCWlmIChjY2RjLT5zdGF0ZSAhPSBJU1BfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCkBAIC03MzQsMzUgKzcyOCwzOSBAQAogCQljY2RjLT5mcGNfZW4gPSAhIShPTUFQM0lTUF9DQ0RDX0ZQQyAmIGNjZGNfc3RydWN0LT5mbGFnKTsKIAogCQlpZiAoY2NkYy0+ZnBjX2VuKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmNjZGMtPmZwYywgY2NkY19zdHJ1Y3QtPmZwYywKLQkJCQkJICAgc2l6ZW9mKGNjZGMtPmZwYykpKQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcGMsIGNjZGNfc3RydWN0LT5mcGMsIHNpemVvZihmcGMpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAorCQkJc2l6ZSA9IGZwYy5mcG51bSAqIDQ7CisKIAkJCS8qCi0JCQkgKiB0YWJsZV9uZXcgbXVzdCBiZSA2NC1ieXRlcyBhbGlnbmVkLCBidXQgaXQncwotCQkJICogYWxyZWFkeSBkb25lIGJ5IG9tYXBfaW9tbXVfdm1hbGxvYygpLgorCQkJICogVGhlIHRhYmxlIGFkZHJlc3MgbXVzdCBiZSA2NC1ieXRlcyBhbGlnbmVkLCB3aGljaCBpcworCQkJICogZ3VhcmFudGVlZCBieSBkbWFfYWxsb2NfY29oZXJlbnQoKS4KIAkJCSAqLwotCQkJc2l6ZSA9IGNjZGMtPmZwYy5mcG51bSAqIDQ7Ci0JCQl0YWJsZV9uZXcgPSBvbWFwX2lvbW11X3ZtYWxsb2MoaXNwLT5kb21haW4sIGlzcC0+ZGV2LAotCQkJCQkJCTAsIHNpemUsIElPTU1VX0ZMQUcpOwotCQkJaWYgKElTX0VSUl9WQUxVRSh0YWJsZV9uZXcpKQorCQkJZnBjX25ldy5mcG51bSA9IGZwYy5mcG51bTsKKwkJCWZwY19uZXcuYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChpc3AtPmRldiwgc2l6ZSwKKwkJCQkJCQkgICZmcGNfbmV3LmRtYSwKKwkJCQkJCQkgIEdGUF9LRVJORUwpOworCQkJaWYgKGZwY19uZXcuYWRkciA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwogCi0JCQlpZiAoY29weV9mcm9tX3VzZXIob21hcF9kYV90b192YShpc3AtPmRldiwgdGFibGVfbmV3KSwKLQkJCQkJICAgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikKLQkJCQkJICAgY2NkYy0+ZnBjLmZwY2FkZHIsIHNpemUpKSB7Ci0JCQkJb21hcF9pb21tdV92ZnJlZShpc3AtPmRvbWFpbiwgaXNwLT5kZXYsCi0JCQkJCQkJCXRhYmxlX25ldyk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZnBjX25ldy5hZGRyLAorCQkJCQkgICAoX19mb3JjZSB2b2lkIF9fdXNlciAqKWZwYy5mcGNhZGRyLAorCQkJCQkgICBzaXplKSkgeworCQkJCWRtYV9mcmVlX2NvaGVyZW50KGlzcC0+ZGV2LCBzaXplLCBmcGNfbmV3LmFkZHIsCisJCQkJCQkgIGZwY19uZXcuZG1hKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAotCQkJdGFibGVfb2xkID0gY2NkYy0+ZnBjLmZwY2FkZHI7Ci0JCQljY2RjLT5mcGMuZnBjYWRkciA9IHRhYmxlX25ldzsKKwkJCWZwY19vbGQgPSBjY2RjLT5mcGM7CisJCQljY2RjLT5mcGMgPSBmcGNfbmV3OwogCQl9CiAKIAkJY2NkY19jb25maWd1cmVfZnBjKGNjZGMpOwotCQlpZiAodGFibGVfb2xkICE9IDApCi0JCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmRldiwgdGFibGVfb2xkKTsKKworCQlpZiAoZnBjX29sZC5hZGRyICE9IE5VTEwpCisJCQlkbWFfZnJlZV9jb2hlcmVudChpc3AtPmRldiwgZnBjX29sZC5mcG51bSAqIDQsCisJCQkJCSAgZnBjX29sZC5hZGRyLCBmcGNfb2xkLmRtYSk7CiAJfQogCiAJcmV0dXJuIGNjZGNfbHNjX2NvbmZpZyhjY2RjLCBjY2RjX3N0cnVjdCk7CkBAIC0xNTIzLDcgKzE1MjEsNyBAQAogCiAJYnVmZmVyID0gb21hcDNpc3BfdmlkZW9fYnVmZmVyX25leHQoJmNjZGMtPnZpZGVvX291dCk7CiAJaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0JCWNjZGNfc2V0X291dGFkZHIoY2NkYywgYnVmZmVyLT5pc3BfYWRkcik7CisJCWNjZGNfc2V0X291dGFkZHIoY2NkYywgYnVmZmVyLT5kbWEpOwogCQlyZXN0YXJ0ID0gMTsKIAl9CiAKQEAgLTE2NjIsNyArMTY2MCw3IEBACiAJaWYgKCEoY2NkYy0+b3V0cHV0ICYgQ0NEQ19PVVRQVVRfTUVNT1JZKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljY2RjX3NldF9vdXRhZGRyKGNjZGMsIGJ1ZmZlci0+aXNwX2FkZHIpOworCWNjZGNfc2V0X291dGFkZHIoY2NkYywgYnVmZmVyLT5kbWEpOwogCiAJLyogV2Ugbm93IGhhdmUgYSBidWZmZXIgcXVldWVkIG9uIHRoZSBvdXRwdXQsIHJlc3RhcnQgdGhlIHBpcGVsaW5lCiAJICogb24gdGhlIG5leHQgQ0NEQyBpbnRlcnJ1cHQgaWYgcnVubmluZyBpbiBjb250aW51b3VzIG1vZGUgKG9yIHdoZW4KQEAgLTI1ODAsOCArMjU3OCw5IEBACiAJY2FuY2VsX3dvcmtfc3luYygmY2NkYy0+bHNjLnRhYmxlX3dvcmspOwogCWNjZGNfbHNjX2ZyZWVfcXVldWUoY2NkYywgJmNjZGMtPmxzYy5mcmVlX3F1ZXVlKTsKIAotCWlmIChjY2RjLT5mcGMuZnBjYWRkciAhPSAwKQotCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmRldiwgY2NkYy0+ZnBjLmZwY2FkZHIpOworCWlmIChjY2RjLT5mcGMuYWRkciAhPSBOVUxMKQorCQlkbWFfZnJlZV9jb2hlcmVudChpc3AtPmRldiwgY2NkYy0+ZnBjLmZwbnVtICogNCwgY2NkYy0+ZnBjLmFkZHIsCisJCQkJICBjY2RjLT5mcGMuZG1hKTsKIAogCW11dGV4X2Rlc3Ryb3koJmNjZGMtPmlvY3RsX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY2RjLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNjZGMuaAppbmRleCA5ZDI0ZTQxLi5mNjUwNjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNjZGMuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGNjZGMuaApAQCAtNDYsNiArNDYsMTIgQEAKIAogI2RlZmluZQlPTUFQM0lTUF9DQ0RDX05FVkVOVFMJMTYKIAorc3RydWN0IGlzcGNjZGNfZnBjIHsKKwl2b2lkICphZGRyOworCWRtYV9hZGRyX3QgZG1hOworCXVuc2lnbmVkIGludCBmcG51bTsKK307CisKIGVudW0gaXNwY2NkY19sc2Nfc3RhdGUgewogCUxTQ19TVEFURV9TVE9QUEVEID0gMCwKIAlMU0NfU1RBVEVfU1RPUFBJTkcgPSAxLApAQCAtNTcsOCArNjMsMTIgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IG9tYXAzaXNwX2NjZGNfbHNjX2NvbmZpZyBjb25maWc7CiAJdW5zaWduZWQgY2hhciBlbmFibGU7Ci0JdTMyIHRhYmxlOwotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqaW92bTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmFkZHI7CisJCWRtYV9hZGRyX3QgZG1hOworCQlzdHJ1Y3Qgc2dfdGFibGUgc2d0OworCX0gdGFibGU7CiB9OwogCiAvKgpAQCAtMTM2LDcgKzE0Niw3IEBACiAJCSAgICAgZnBjX2VuOjE7CiAJc3RydWN0IG9tYXAzaXNwX2NjZGNfYmxjb21wIGJsY29tcDsKIAlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19iY2xhbXAgY2xhbXA7Ci0Jc3RydWN0IG9tYXAzaXNwX2NjZGNfZnBjIGZwYzsKKwlzdHJ1Y3QgaXNwY2NkY19mcGMgZnBjOwogCXN0cnVjdCBpc3BjY2RjX2xzYyBsc2M7CiAJdW5zaWduZWQgaW50IHVwZGF0ZTsKIAl1bnNpZ25lZCBpbnQgc2hhZG93X3VwZGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY2NwMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY3AyLmMKaW5kZXggYjMwYjY3ZC4uZjM4MDFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY3AyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BjY3AyLmMKQEAgLTU0OSw3ICs1NDksNyBAQAogCiAJYnVmZmVyID0gb21hcDNpc3BfdmlkZW9fYnVmZmVyX25leHQoJmNjcDItPnZpZGVvX2luKTsKIAlpZiAoYnVmZmVyICE9IE5VTEwpCi0JCWNjcDJfc2V0X2luYWRkcihjY3AyLCBidWZmZXItPmlzcF9hZGRyKTsKKwkJY2NwMl9zZXRfaW5hZGRyKGNjcDIsIGJ1ZmZlci0+ZG1hKTsKIAogCXBpcGUtPnN0YXRlIHw9IElTUF9QSVBFTElORV9JRExFX0lOUFVUOwogCkBAIC05NDAsNyArOTQwLDcgQEAKIHsKIAlzdHJ1Y3QgaXNwX2NjcDJfZGV2aWNlICpjY3AyID0gJnZpZGVvLT5pc3AtPmlzcF9jY3AyOwogCi0JY2NwMl9zZXRfaW5hZGRyKGNjcDIsIGJ1ZmZlci0+aXNwX2FkZHIpOworCWNjcDJfc2V0X2luYWRkcihjY3AyLCBidWZmZXItPmRtYSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY3NpMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3Bjc2kyLmMKaW5kZXggNjIwNTYwODIuLjVhMmU0N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY3NpMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwY3NpMi5jCkBAIC02OTUsNyArNjk1LDcgQEAKIAlpZiAoYnVmZmVyID09IE5VTEwpCiAJCXJldHVybjsKIAotCWNzaTJfc2V0X291dGFkZHIoY3NpMiwgYnVmZmVyLT5pc3BfYWRkcik7CisJY3NpMl9zZXRfb3V0YWRkcihjc2kyLCBidWZmZXItPmRtYSk7CiAJY3NpMl9jdHhfZW5hYmxlKGlzcCwgY3NpMiwgMCwgMSk7CiB9CiAKQEAgLTgxMiw3ICs4MTIsNyBAQAogCXN0cnVjdCBpc3BfZGV2aWNlICppc3AgPSB2aWRlby0+aXNwOwogCXN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTIgPSAmaXNwLT5pc3BfY3NpMmE7CiAKLQljc2kyX3NldF9vdXRhZGRyKGNzaTIsIGJ1ZmZlci0+aXNwX2FkZHIpOworCWNzaTJfc2V0X291dGFkZHIoY3NpMiwgYnVmZmVyLT5kbWEpOwogCiAJLyoKIAkgKiBJZiBzdHJlYW1pbmcgd2FzIGVuYWJsZWQgYmVmb3JlIHRoZXJlIHdhcyBhIGJ1ZmZlciBxdWV1ZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwaDNhX2Fld2IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwaDNhX2Fld2IuYwppbmRleCA3NWZkODJiLi5kNjgxMWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGgzYV9hZXdiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BoM2FfYWV3Yi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJaWYgKGFld2ItPnN0YXRlID09IElTUFNUQVRfRElTQUJMRUQpCiAJCXJldHVybjsKIAotCWlzcF9yZWdfd3JpdGVsKGFld2ItPmlzcCwgYWV3Yi0+YWN0aXZlX2J1Zi0+aW9tbXVfYWRkciwKKwlpc3BfcmVnX3dyaXRlbChhZXdiLT5pc3AsIGFld2ItPmFjdGl2ZV9idWYtPmRtYV9hZGRyLAogCQkgICAgICAgT01BUDNfSVNQX0lPTUVNX0gzQSwgSVNQSDNBX0FFV0JVRlNUKTsKIAogCWlmICghYWV3Yi0+dXBkYXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BoM2FfYWYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwaDNhX2FmLmMKaW5kZXggYTBiZjVhZi4uNmZjOTYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BoM2FfYWYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcGgzYV9hZi5jCkBAIC01MSw3ICs1MSw3IEBACiAJaWYgKGFmLT5zdGF0ZSA9PSBJU1BTVEFUX0RJU0FCTEVEKQogCQlyZXR1cm47CiAKLQlpc3BfcmVnX3dyaXRlbChhZi0+aXNwLCBhZi0+YWN0aXZlX2J1Zi0+aW9tbXVfYWRkciwgT01BUDNfSVNQX0lPTUVNX0gzQSwKKwlpc3BfcmVnX3dyaXRlbChhZi0+aXNwLCBhZi0+YWN0aXZlX2J1Zi0+ZG1hX2FkZHIsIE9NQVAzX0lTUF9JT01FTV9IM0EsCiAJCSAgICAgICBJU1BIM0FfQUZCVUZTVCk7CiAKIAlpZiAoIWFmLT51cGRhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHByZXZpZXcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCmluZGV4IDM5NWIyYjAuLjcyMDgwOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcHJldmlldy5jCkBAIC0xNDk5LDE0ICsxNDk5LDE0IEBACiAJaWYgKHByZXYtPmlucHV0ID09IFBSRVZJRVdfSU5QVVRfTUVNT1JZKSB7CiAJCWJ1ZmZlciA9IG9tYXAzaXNwX3ZpZGVvX2J1ZmZlcl9uZXh0KCZwcmV2LT52aWRlb19pbik7CiAJCWlmIChidWZmZXIgIT0gTlVMTCkKLQkJCXByZXZpZXdfc2V0X2luYWRkcihwcmV2LCBidWZmZXItPmlzcF9hZGRyKTsKKwkJCXByZXZpZXdfc2V0X2luYWRkcihwcmV2LCBidWZmZXItPmRtYSk7CiAJCXBpcGUtPnN0YXRlIHw9IElTUF9QSVBFTElORV9JRExFX0lOUFVUOwogCX0KIAogCWlmIChwcmV2LT5vdXRwdXQgJiBQUkVWSUVXX09VVFBVVF9NRU1PUlkpIHsKIAkJYnVmZmVyID0gb21hcDNpc3BfdmlkZW9fYnVmZmVyX25leHQoJnByZXYtPnZpZGVvX291dCk7CiAJCWlmIChidWZmZXIgIT0gTlVMTCkgewotCQkJcHJldmlld19zZXRfb3V0YWRkcihwcmV2LCBidWZmZXItPmlzcF9hZGRyKTsKKwkJCXByZXZpZXdfc2V0X291dGFkZHIocHJldiwgYnVmZmVyLT5kbWEpOwogCQkJcmVzdGFydCA9IDE7CiAJCX0KIAkJcGlwZS0+c3RhdGUgfD0gSVNQX1BJUEVMSU5FX0lETEVfT1VUUFVUOwpAQCAtMTU3NywxMCArMTU3NywxMCBAQAogCXN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYgPSAmdmlkZW8tPmlzcC0+aXNwX3ByZXY7CiAKIAlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCi0JCXByZXZpZXdfc2V0X2luYWRkcihwcmV2LCBidWZmZXItPmlzcF9hZGRyKTsKKwkJcHJldmlld19zZXRfaW5hZGRyKHByZXYsIGJ1ZmZlci0+ZG1hKTsKIAogCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXByZXZpZXdfc2V0X291dGFkZHIocHJldiwgYnVmZmVyLT5pc3BfYWRkcik7CisJCXByZXZpZXdfc2V0X291dGFkZHIocHJldiwgYnVmZmVyLT5kbWEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHF1ZXVlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHF1ZXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTY1ODUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BxdWV1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MSArMCwwIEBACi0vKgotICogaXNwcXVldWUuYwotICoKLSAqIFRJIE9NQVAzIElTUCAtIFZpZGVvIGJ1ZmZlcnMgcXVldWUgaGFuZGxpbmcKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiBDb250YWN0czogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgotICoJICAgICBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bpa2kuZmk+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAiaXNwcXVldWUuaCIKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFZpZGVvIGJ1ZmZlcnMgbWFuYWdlbWVudAotICovCi0KLS8qCi0gKiBpc3BfdmlkZW9fYnVmZmVyX2NhY2hlX3N5bmMgLSBLZWVwIHRoZSBidWZmZXJzIGNvaGVyZW50IGJldHdlZW4gQ1BVIGFuZCBJU1AKLSAqCi0gKiBUaGUgdHlwaWNhbCBvcGVyYXRpb24gcmVxdWlyZWQgaGVyZSBpcyBDYWNoZSBJbnZhbGlkYXRpb24gYWNyb3NzCi0gKiB0aGUgKHVzZXIgc3BhY2UpIGJ1ZmZlciBhZGRyZXNzIHJhbmdlLiBBbmQgdGhpcyBfbXVzdF8gYmUgZG9uZQotICogYXQgUUJVRiBzdGFnZSAoYW5kICpvbmx5KiBhdCBRQlVGKS4KLSAqCi0gKiBXZSB0cnkgdG8gdXNlIG9wdGltYWwgY2FjaGUgaW52YWxpZGF0aW9uIGZ1bmN0aW9uOgotICogLSBkbWFjX21hcF9hcmVhOgotICogICAgLSB1c2VkIHdoZW4gdGhlIG51bWJlciBvZiBwYWdlcyBhcmUgX2xvd18uCi0gKiAgICAtIGl0IGJlY29tZXMgcXVpdGUgc2xvdyBhcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluY3JlYXNlLgotICogICAgICAgLSBmb3IgNjQ4eDQ5MiB2aWV3ZmluZGVyICgxNTAgcGFnZXMpIGl0IHRha2VzIDEuMyBtcy4KLSAqICAgICAgIC0gZm9yIDUgTXBpeCBidWZmZXIgKDI0OTEgcGFnZXMpIGl0IHRha2VzIGJldHdlZW4gMjUtNTAgbXMuCi0gKgotICogLSBmbHVzaF9jYWNoZV9hbGw6Ci0gKiAgICAtIHVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFyZSBfaGlnaF8uCi0gKiAgICAtIHRpbWUgdGFrZW4gaW4gdGhlIHJhbmdlIG9mIDUwMC05MDAgdXMuCi0gKiAgICAtIGhhcyBhIGhpZ2hlciBwZW5hbHR5IGJ1dCwgYXMgd2hvbGUgZGNhY2hlICsgaWNhY2hlIGlzIGludmFsaWRhdGVkCi0gKi8KLS8qCi0gKiBGSVhNRTogZG1hY19pbnZfcmFuZ2UgY3Jhc2hlcyByYW5kb21seSBvbiB0aGUgdXNlciBzcGFjZSBidWZmZXIKLSAqICAgICAgICBhZGRyZXNzLiBGYWxsIGJhY2sgdG8gZmx1c2hfY2FjaGVfYWxsIGZvciBub3cuCi0gKi8KLSNkZWZpbmUgSVNQX0NBQ0hFX0ZMVVNIX1BBR0VTX01BWCAgICAgICAwCi0KLXN0YXRpYyB2b2lkIGlzcF92aWRlb19idWZmZXJfY2FjaGVfc3luYyhzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCWlmIChidWYtPnNraXBfY2FjaGUpCi0JCXJldHVybjsKLQotCWlmIChidWYtPnZidWYubS51c2VycHRyID09IDAgfHwgYnVmLT5ucGFnZXMgPT0gMCB8fAotCSAgICBidWYtPm5wYWdlcyA+IElTUF9DQUNIRV9GTFVTSF9QQUdFU19NQVgpCi0JCWZsdXNoX2NhY2hlX2FsbCgpOwotCWVsc2UgewotCQlkbWFjX21hcF9hcmVhKCh2b2lkICopYnVmLT52YnVmLm0udXNlcnB0ciwgYnVmLT52YnVmLmxlbmd0aCwKLQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7Ci0JCW91dGVyX2ludl9yYW5nZShidWYtPnZidWYubS51c2VycHRyLAotCQkJCWJ1Zi0+dmJ1Zi5tLnVzZXJwdHIgKyBidWYtPnZidWYubGVuZ3RoKTsKLQl9Ci19Ci0KLS8qCi0gKiBpc3BfdmlkZW9fYnVmZmVyX2xvY2tfdm1hIC0gUHJldmVudCBWTUFzIGZyb20gYmVpbmcgdW5tYXBwZWQKLSAqCi0gKiBMb2NrIHRoZSBWTUFzIHVuZGVybHlpbmcgdGhlIGdpdmVuIGJ1ZmZlciBpbnRvIG1lbW9yeS4gVGhpcyBhdm9pZHMgdGhlCi0gKiB1c2Vyc3BhY2UgYnVmZmVyIG1hcHBpbmcgZnJvbSBiZWluZyBzd2FwcGVkIG91dCwgbWFraW5nIFZJUFQgY2FjaGUgaGFuZGxpbmcKLSAqIGVhc2llci4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHBhZ2VzIHdpbGwgbm90IGJlIGZyZWVkIGFzIHRoZSBidWZmZXJzIGhhdmUgYmVlbiBsb2NrZWQgdG8KLSAqIG1lbW9yeSB1c2luZyBieSBhIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKSwgYnV0IHRoZSB1c2Vyc3BhY2UgbWFwcGluZyBjb3VsZAotICogc3RpbGwgZGlzYXBwZWFyIGlmIHRoZSBWTUFzIGFyZSBub3QgbG9ja2VkLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgbWVtb3J5Ci0gKiBtYW5hZ2VtZW50IGNvZGUgdHJ5aW5nIHRvIGJlIGFzIGxvY2stbGVzcyBhcyBwb3NzaWJsZSwgd2hpY2ggcmVzdWx0cyBpbiB0aGUKLSAqIHVzZXJzcGFjZSBtYXBwaW5nIG1hbmFnZXIgbm90IGZpbmRpbmcgb3V0IHRoYXQgdGhlIHBhZ2VzIGFyZSBsb2NrZWQgdW5kZXIKLSAqIHNvbWUgY29uZGl0aW9ucy4KLSAqLwotc3RhdGljIGludCBpc3BfdmlkZW9fYnVmZmVyX2xvY2tfdm1hKHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYsIGludCBsb2NrKQotewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoYnVmLT52YnVmLm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXR1cm4gMDsKLQotCS8qIFdlIGNhbiBiZSBjYWxsZWQgZnJvbSB3b3JrcXVldWUgY29udGV4dCBpZiB0aGUgY3VycmVudCB0YXNrIGRpZXMgdG8KLQkgKiB1bmxvY2sgdGhlIFZNQXMuIEluIHRoYXQgY2FzZSB0aGVyZSdzIG5vIGN1cnJlbnQgbWVtb3J5IG1hbmFnZW1lbnQKLQkgKiBjb250ZXh0IHNvIHVubG9ja2luZyBjYW4ndCBiZSBwZXJmb3JtZWQsIGJ1dCB0aGUgVk1BcyBoYXZlIGJlZW4gb3IKLQkgKiBhcmUgZ2V0dGluZyBkZXN0cm95ZWQgYW55d2F5IHNvIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KLQkgKi8KLQlpZiAoIWN1cnJlbnQgfHwgIWN1cnJlbnQtPm1tKQotCQlyZXR1cm4gbG9jayA/IC1FSU5WQUwgOiAwOwotCi0Jc3RhcnQgPSBidWYtPnZidWYubS51c2VycHRyOwotCWVuZCA9IGJ1Zi0+dmJ1Zi5tLnVzZXJwdHIgKyBidWYtPnZidWYubGVuZ3RoIC0gMTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0Jc3Bpbl9sb2NrKCZjdXJyZW50LT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKLQotCWRvIHsKLQkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIHN0YXJ0KTsKLQkJaWYgKHZtYSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAobG9jaykKLQkJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEOwotCQllbHNlCi0JCQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9MT0NLRUQ7Ci0KLQkJc3RhcnQgPSB2bWEtPnZtX2VuZCArIDE7Ci0JfSB3aGlsZSAodm1hLT52bV9lbmQgPCBlbmQpOwotCi0JaWYgKGxvY2spCi0JCWJ1Zi0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEOwotCWVsc2UKLQkJYnVmLT52bV9mbGFncyAmPSB+Vk1fTE9DS0VEOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpc3BfdmlkZW9fYnVmZmVyX3NnbGlzdF9rZXJuZWwgLSBCdWlsZCBhIHNjYXR0ZXIgbGlzdCBmb3IgYSB2bWFsbG9jJ2VkIGJ1ZmZlcgotICoKLSAqIEl0ZXJhdGUgb3ZlciB0aGUgdm1hbGxvYydlZCBhcmVhIGFuZCBjcmVhdGUgYSBzY2F0dGVyIGxpc3QgZW50cnkgZm9yIGV2ZXJ5Ci0gKiBwYWdlLgotICovCi1zdGF0aWMgaW50IGlzcF92aWRlb19idWZmZXJfc2dsaXN0X2tlcm5lbChzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OwotCXVuc2lnbmVkIGludCBucGFnZXM7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jdm9pZCAqYWRkcjsKLQotCWFkZHIgPSBidWYtPnZhZGRyOwotCW5wYWdlcyA9IFBBR0VfQUxJR04oYnVmLT52YnVmLmxlbmd0aCkgPj4gUEFHRV9TSElGVDsKLQotCXNnbGlzdCA9IHZtYWxsb2MobnBhZ2VzICogc2l6ZW9mKCpzZ2xpc3QpKTsKLQlpZiAoc2dsaXN0ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2dfaW5pdF90YWJsZShzZ2xpc3QsIG5wYWdlcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2ksIGFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gdm1hbGxvY190b19wYWdlKGFkZHIpOwotCi0JCWlmIChwYWdlID09IE5VTEwgfHwgUGFnZUhpZ2hNZW0ocGFnZSkpIHsKLQkJCXZmcmVlKHNnbGlzdCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXNnX3NldF9wYWdlKCZzZ2xpc3RbaV0sIHBhZ2UsIFBBR0VfU0laRSwgMCk7Ci0JfQotCi0JYnVmLT5zZ2xlbiA9IG5wYWdlczsKLQlidWYtPnNnbGlzdCA9IHNnbGlzdDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogaXNwX3ZpZGVvX2J1ZmZlcl9zZ2xpc3RfdXNlciAtIEJ1aWxkIGEgc2NhdHRlciBsaXN0IGZvciBhIHVzZXJzcGFjZSBidWZmZXIKLSAqCi0gKiBXYWxrIHRoZSBidWZmZXIgcGFnZXMgbGlzdCBhbmQgY3JlYXRlIGEgMToxIG1hcHBpbmcgdG8gYSBzY2F0dGVyIGxpc3QuCi0gKi8KLXN0YXRpYyBpbnQgaXNwX3ZpZGVvX2J1ZmZlcl9zZ2xpc3RfdXNlcihzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSBidWYtPm9mZnNldDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXNnbGlzdCA9IHZtYWxsb2MoYnVmLT5ucGFnZXMgKiBzaXplb2YoKnNnbGlzdCkpOwotCWlmIChzZ2xpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzZ19pbml0X3RhYmxlKHNnbGlzdCwgYnVmLT5ucGFnZXMpOwotCi0JZm9yIChpID0gMDsgaSA8IGJ1Zi0+bnBhZ2VzOyArK2kpIHsKLQkJaWYgKFBhZ2VIaWdoTWVtKGJ1Zi0+cGFnZXNbaV0pKSB7Ci0JCQl2ZnJlZShzZ2xpc3QpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlzZ19zZXRfcGFnZSgmc2dsaXN0W2ldLCBidWYtPnBhZ2VzW2ldLCBQQUdFX1NJWkUgLSBvZmZzZXQsCi0JCQkgICAgb2Zmc2V0KTsKLQkJb2Zmc2V0ID0gMDsKLQl9Ci0KLQlidWYtPnNnbGVuID0gYnVmLT5ucGFnZXM7Ci0JYnVmLT5zZ2xpc3QgPSBzZ2xpc3Q7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGlzcF92aWRlb19idWZmZXJfc2dsaXN0X3Bmbm1hcCAtIEJ1aWxkIGEgc2NhdHRlciBsaXN0IGZvciBhIFZNX1BGTk1BUCBidWZmZXIKLSAqCi0gKiBDcmVhdGUgYSBzY2F0dGVyIGxpc3Qgb2YgcGh5c2ljYWxseSBjb250aWd1b3VzIHBhZ2VzIHN0YXJ0aW5nIGF0IHRoZSBidWZmZXIKLSAqIG1lbW9yeSBwaHlzaWNhbCBhZGRyZXNzLgotICovCi1zdGF0aWMgaW50IGlzcF92aWRlb19idWZmZXJfc2dsaXN0X3Bmbm1hcChzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSBidWYtPm9mZnNldDsKLQl1bnNpZ25lZCBsb25nIHBmbiA9IGJ1Zi0+cGFkZHIgPj4gUEFHRV9TSElGVDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXNnbGlzdCA9IHZtYWxsb2MoYnVmLT5ucGFnZXMgKiBzaXplb2YoKnNnbGlzdCkpOwotCWlmIChzZ2xpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzZ19pbml0X3RhYmxlKHNnbGlzdCwgYnVmLT5ucGFnZXMpOwotCi0JZm9yIChpID0gMDsgaSA8IGJ1Zi0+bnBhZ2VzOyArK2ksICsrcGZuKSB7Ci0JCXNnX3NldF9wYWdlKCZzZ2xpc3RbaV0sIHBmbl90b19wYWdlKHBmbiksIFBBR0VfU0laRSAtIG9mZnNldCwKLQkJCSAgICBvZmZzZXQpOwotCQkvKiBQRk5NQVAgYnVmZmVycyB3aWxsIG5vdCBnZXQgRE1BLW1hcHBlZCwgc2V0IHRoZSBETUEgYWRkcmVzcwotCQkgKiBtYW51YWxseS4KLQkJICovCi0JCXNnX2RtYV9hZGRyZXNzKCZzZ2xpc3RbaV0pID0gKHBmbiA8PCBQQUdFX1NISUZUKSArIG9mZnNldDsKLQkJb2Zmc2V0ID0gMDsKLQl9Ci0KLQlidWYtPnNnbGVuID0gYnVmLT5ucGFnZXM7Ci0JYnVmLT5zZ2xpc3QgPSBzZ2xpc3Q7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGlzcF92aWRlb19idWZmZXJfY2xlYW51cCAtIFJlbGVhc2UgcGFnZXMgZm9yIGEgdXNlcnNwYWNlIFZNQS4KLSAqCi0gKiBSZWxlYXNlIHBhZ2VzIGxvY2tlZCBieSBhIGNhbGwgaXNwX3ZpZGVvX2J1ZmZlcl9wcmVwYXJlX3VzZXIgYW5kIGZyZWUgdGhlCi0gKiBwYWdlcyB0YWJsZS4KLSAqLwotc3RhdGljIHZvaWQgaXNwX3ZpZGVvX2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYpCi17Ci0JZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKGJ1Zi0+cXVldWUtPm9wcy0+YnVmZmVyX2NsZWFudXApCi0JCWJ1Zi0+cXVldWUtPm9wcy0+YnVmZmVyX2NsZWFudXAoYnVmKTsKLQotCWlmICghKGJ1Zi0+dm1fZmxhZ3MgJiBWTV9QRk5NQVApKSB7Ci0JCWRpcmVjdGlvbiA9IGJ1Zi0+dmJ1Zi50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRQotCQkJICA/IERNQV9GUk9NX0RFVklDRSA6IERNQV9UT19ERVZJQ0U7Ci0JCWRtYV91bm1hcF9zZyhidWYtPnF1ZXVlLT5kZXYsIGJ1Zi0+c2dsaXN0LCBidWYtPnNnbGVuLAotCQkJICAgICBkaXJlY3Rpb24pOwotCX0KLQotCXZmcmVlKGJ1Zi0+c2dsaXN0KTsKLQlidWYtPnNnbGlzdCA9IE5VTEw7Ci0JYnVmLT5zZ2xlbiA9IDA7Ci0KLQlpZiAoYnVmLT5wYWdlcyAhPSBOVUxMKSB7Ci0JCWlzcF92aWRlb19idWZmZXJfbG9ja192bWEoYnVmLCAwKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5ucGFnZXM7ICsraSkKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShidWYtPnBhZ2VzW2ldKTsKLQotCQl2ZnJlZShidWYtPnBhZ2VzKTsKLQkJYnVmLT5wYWdlcyA9IE5VTEw7Ci0JfQotCi0JYnVmLT5ucGFnZXMgPSAwOwotCWJ1Zi0+c2tpcF9jYWNoZSA9IGZhbHNlOwotfQotCi0vKgotICogaXNwX3ZpZGVvX2J1ZmZlcl9wcmVwYXJlX3VzZXIgLSBQaW4gdXNlcnNwYWNlIFZNQSBwYWdlcyB0byBtZW1vcnkuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbGlzdCBvZiBwYWdlcyBmb3IgYSB1c2Vyc3BhY2UgVk1BLiBUaGUgbnVtYmVyIG9mCi0gKiBwYWdlcyBpcyBmaXJzdCBjb21wdXRlZCBiYXNlZCBvbiB0aGUgYnVmZmVyIHNpemUsIGFuZCBwYWdlcyBhcmUgdGhlbgotICogcmV0cmlldmVkIGJ5IGEgY2FsbCB0byBnZXRfdXNlcl9wYWdlcy4KLSAqCi0gKiBQYWdlcyBhcmUgcGlubmVkIHRvIG1lbW9yeSBieSBnZXRfdXNlcl9wYWdlcywgbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciBETUEKLSAqIHRyYW5zZmVycy4gSG93ZXZlciwgZHVlIHRvIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGltaXphdGlvbiwgaXQgc2VlbXMgdGhlCi0gKiBnZXRfdXNlcl9wYWdlcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBwaW5uZWQgcGFnZXMgd2lsbCBub3QgYmUgd3JpdHRlbgotICogdG8gc3dhcCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSB1c2Vyc3BhY2UgbWFwcGluZyhzKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGEgcGFnZQotICogZmF1bHQgY2FuIGJlIGdlbmVyYXRlZCB3aGVuIGFjY2Vzc2luZyB0aG9zZSB1bm1hcHBlZCBwYWdlcy4KLSAqCi0gKiBJZiB0aGUgZmF1bHQgaXMgdHJpZ2dlcmVkIGJ5IGEgcGFnZSB0YWJsZSB3YWxrIGNhdXNlZCBieSBWSVBUIGNhY2hlCi0gKiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMsIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIgbWlnaHQgb29wcyBpZiB0aGUgTU0gc2VtYXBob3JlCi0gKiBpcyBoZWxkLCBhcyBpdCBjYW4ndCBoYW5kbGUga2VybmVsIHBhZ2UgZmF1bHRzIGluIHRoYXQgY2FzZS4gVG8gZml4IHRoYXQsIGEKLSAqIGZpeHVwIGVudHJ5IG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBjYWNoZSBtYW5hZ2VtZW50IGNvZGUsIG9yIHRoZSB1c2Vyc3BhY2UKLSAqIFZNQSBtdXN0IGJlIGxvY2tlZCB0byBhdm9pZCByZW1vdmluZyBwYWdlcyBmcm9tIHRoZSB1c2Vyc3BhY2UgbWFwcGluZyBpbiB0aGUKLSAqIGZpcnN0IHBsYWNlLgotICoKLSAqIElmIHRoZSBudW1iZXIgb2YgcGFnZXMgcmV0cmlldmVkIGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIHJlcXVpcmVkIGJ5IHRoZQotICogYnVmZmVyIHNpemUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIC1FRkFVTFQuCi0gKi8KLXN0YXRpYyBpbnQgaXNwX3ZpZGVvX2J1ZmZlcl9wcmVwYXJlX3VzZXIoc3RydWN0IGlzcF92aWRlb19idWZmZXIgKmJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JdW5zaWduZWQgaW50IGZpcnN0OwotCXVuc2lnbmVkIGludCBsYXN0OwotCWludCByZXQ7Ci0KLQlkYXRhID0gYnVmLT52YnVmLm0udXNlcnB0cjsKLQlmaXJzdCA9IChkYXRhICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwotCWxhc3QgPSAoKGRhdGEgKyBidWYtPnZidWYubGVuZ3RoIC0gMSkgJiBQQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0KLQlidWYtPm9mZnNldCA9IGRhdGEgJiB+UEFHRV9NQVNLOwotCWJ1Zi0+bnBhZ2VzID0gbGFzdCAtIGZpcnN0ICsgMTsKLQlidWYtPnBhZ2VzID0gdm1hbGxvYyhidWYtPm5wYWdlcyAqIHNpemVvZihidWYtPnBhZ2VzWzBdKSk7Ci0JaWYgKGJ1Zi0+cGFnZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGRhdGEgJiBQQUdFX01BU0ssCi0JCQkgICAgIGJ1Zi0+bnBhZ2VzLAotCQkJICAgICBidWYtPnZidWYudHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDAsCi0JCQkgICAgIGJ1Zi0+cGFnZXMsIE5VTEwpOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAocmV0ICE9IGJ1Zi0+bnBhZ2VzKSB7Ci0JCWJ1Zi0+bnBhZ2VzID0gcmV0IDwgMCA/IDAgOiByZXQ7Ci0JCWlzcF92aWRlb19idWZmZXJfY2xlYW51cChidWYpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX2xvY2tfdm1hKGJ1ZiwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCWlzcF92aWRlb19idWZmZXJfY2xlYW51cChidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGlzcF92aWRlb19idWZmZXJfcHJlcGFyZV9wZm5tYXAgLSBWYWxpZGF0ZSBhIFZNX1BGTk1BUCB1c2Vyc3BhY2UgYnVmZmVyCi0gKgotICogVXNlcnNwYWNlIFZNX1BGTk1BUCBidWZmZXJzIGFyZSBzdXBwb3J0ZWQgb25seSBpZiB0aGV5IGFyZSBjb250aWd1b3VzIGluCi0gKiBtZW1vcnkgYW5kIGlmIHRoZXkgc3BhbiBhIHNpbmdsZSBWTUEuCi0gKgotICogUmV0dXJuIDAgaWYgdGhlIGJ1ZmZlciBpcyB2YWxpZCwgb3IgLUVGQVVMVCBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgaXNwX3ZpZGVvX2J1ZmZlcl9wcmVwYXJlX3Bmbm1hcChzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXVuc2lnbmVkIGxvbmcgcHJldl9wZm47Ci0JdW5zaWduZWQgbG9uZyB0aGlzX3BmbjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZW5kOwotCWRtYV9hZGRyX3QgcGEgPSAwOwotCWludCByZXQgPSAtRUZBVUxUOwotCi0Jc3RhcnQgPSBidWYtPnZidWYubS51c2VycHRyOwotCWVuZCA9IGJ1Zi0+dmJ1Zi5tLnVzZXJwdHIgKyBidWYtPnZidWYubGVuZ3RoIC0gMTsKLQotCWJ1Zi0+b2Zmc2V0ID0gc3RhcnQgJiB+UEFHRV9NQVNLOwotCWJ1Zi0+bnBhZ2VzID0gKGVuZCA+PiBQQUdFX1NISUZUKSAtIChzdGFydCA+PiBQQUdFX1NISUZUKSArIDE7Ci0JYnVmLT5wYWdlcyA9IE5VTEw7Ci0KLQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0Jdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIHN0YXJ0KTsKLQlpZiAodm1hID09IE5VTEwgfHwgdm1hLT52bV9lbmQgPCBlbmQpCi0JCWdvdG8gZG9uZTsKLQotCWZvciAocHJldl9wZm4gPSAwOyBzdGFydCA8PSBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgewotCQlyZXQgPSBmb2xsb3dfcGZuKHZtYSwgc3RhcnQsICZ0aGlzX3Bmbik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGRvbmU7Ci0KLQkJaWYgKHByZXZfcGZuID09IDApCi0JCQlwYSA9IHRoaXNfcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JCWVsc2UgaWYgKHRoaXNfcGZuICE9IHByZXZfcGZuICsgMSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXByZXZfcGZuID0gdGhpc19wZm47Ci0JfQotCi0JYnVmLT5wYWRkciA9IHBhICsgYnVmLT5vZmZzZXQ7Ci0JcmV0ID0gMDsKLQotZG9uZToKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmVfdm1fZmxhZ3MgLSBHZXQgVk1BIGZsYWdzIGZvciBhIHVzZXJzcGFjZSBhZGRyZXNzCi0gKgotICogVGhpcyBmdW5jdGlvbiBsb2NhdGVzIHRoZSBWTUFzIGZvciB0aGUgYnVmZmVyJ3MgdXNlcnNwYWNlIGFkZHJlc3MgYW5kIGNoZWNrcwotICogdGhhdCB0aGVpciBmbGFncyBtYXRjaC4gVGhlIG9ubHkgZmxhZyB0aGF0IHdlIG5lZWQgdG8gY2FyZSBmb3IgYXQgdGhlIG1vbWVudAotICogaXMgVk1fUEZOTUFQLgotICoKLSAqIFRoZSBidWZmZXIgdm1fZmxhZ3MgZmllbGQgaXMgc2V0IHRvIHRoZSBmaXJzdCBWTUEgZmxhZ3MuCi0gKgotICogUmV0dXJuIC1FRkFVTFQgaWYgbm8gVk1BIGNhbiBiZSBmb3VuZCBmb3IgcGFydCBvZiB0aGUgYnVmZmVyLCBvciBpZiB0aGUgVk1BcwotICogaGF2ZSBpbmNvbXBhdGlibGUgZmxhZ3MuCi0gKi8KLXN0YXRpYyBpbnQgaXNwX3ZpZGVvX2J1ZmZlcl9wcmVwYXJlX3ZtX2ZsYWdzKHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0JcGdwcm90X3QgdW5pbml0aWFsaXplZF92YXIodm1fcGFnZV9wcm90KTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZW5kOwotCWludCByZXQgPSAtRUZBVUxUOwotCi0Jc3RhcnQgPSBidWYtPnZidWYubS51c2VycHRyOwotCWVuZCA9IGJ1Zi0+dmJ1Zi5tLnVzZXJwdHIgKyBidWYtPnZidWYubGVuZ3RoIC0gMTsKLQotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWRvIHsKLQkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIHN0YXJ0KTsKLQkJaWYgKHZtYSA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCi0JCWlmIChzdGFydCA9PSBidWYtPnZidWYubS51c2VycHRyKSB7Ci0JCQlidWYtPnZtX2ZsYWdzID0gdm1hLT52bV9mbGFnczsKLQkJCXZtX3BhZ2VfcHJvdCA9IHZtYS0+dm1fcGFnZV9wcm90OwotCQl9Ci0KLQkJaWYgKChidWYtPnZtX2ZsYWdzIF4gdm1hLT52bV9mbGFncykgJiBWTV9QRk5NQVApCi0JCQlnb3RvIGRvbmU7Ci0KLQkJaWYgKHZtX3BhZ2VfcHJvdCAhPSB2bWEtPnZtX3BhZ2VfcHJvdCkKLQkJCWdvdG8gZG9uZTsKLQotCQlzdGFydCA9IHZtYS0+dm1fZW5kICsgMTsKLQl9IHdoaWxlICh2bWEtPnZtX2VuZCA8IGVuZCk7Ci0KLQkvKiBTa2lwIGNhY2hlIG1hbmFnZW1lbnQgdG8gZW5oYW5jZSBwZXJmb3JtYW5jZXMgZm9yIG5vbi1jYWNoZWQgb3IKLQkgKiB3cml0ZS1jb21iaW5pbmcgYnVmZmVycy4KLQkgKi8KLQlpZiAodm1fcGFnZV9wcm90ID09IHBncHJvdF9ub25jYWNoZWQodm1fcGFnZV9wcm90KSB8fAotCSAgICB2bV9wYWdlX3Byb3QgPT0gcGdwcm90X3dyaXRlY29tYmluZSh2bV9wYWdlX3Byb3QpKQotCQlidWYtPnNraXBfY2FjaGUgPSB0cnVlOwotCi0JcmV0ID0gMDsKLQotZG9uZToKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmUgLSBNYWtlIGEgYnVmZmVyIHJlYWR5IGZvciBvcGVyYXRpb24KLSAqCi0gKiBQcmVwYXJpbmcgYSBidWZmZXIgaW52b2x2ZXM6Ci0gKgotICogLSB2YWxpZGF0aW5nIFZNQXMgKHVzZXJzcGFjZSBidWZmZXJzIG9ubHkpCi0gKiAtIGxvY2tpbmcgcGFnZXMgYW5kIFZNQXMgaW50byBtZW1vcnkgKHVzZXJzcGFjZSBidWZmZXJzIG9ubHkpCi0gKiAtIGJ1aWxkaW5nIHBhZ2UgYW5kIHNjYXR0ZXItZ2F0aGVyIGxpc3RzCi0gKiAtIG1hcHBpbmcgYnVmZmVycyBmb3IgRE1BIG9wZXJhdGlvbgotICogLSBwZXJmb3JtaW5nIGRyaXZlci1zcGVjaWZpYyBwcmVwYXJhdGlvbgotICoKLSAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB1c2Vyc3BhY2UgY29udGV4dCB3aXRoIGEgdmFsaWQgbW0gY29udGV4dAotICogKHRoaXMgZXhjbHVkZXMgY2xlYW51cCBwYXRocyBzdWNoIGFzIHN5c19jbG9zZSB3aGVuIHRoZSB1c2Vyc3BhY2UgcHJvY2VzcwotICogc2VnZmF1bHRzKS4KLSAqLwotc3RhdGljIGludCBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmUoc3RydWN0IGlzcF92aWRlb19idWZmZXIgKmJ1ZikKLXsKLQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247Ci0JaW50IHJldDsKLQotCXN3aXRjaCAoYnVmLT52YnVmLm1lbW9yeSkgewotCWNhc2UgVjRMMl9NRU1PUllfTU1BUDoKLQkJcmV0ID0gaXNwX3ZpZGVvX2J1ZmZlcl9zZ2xpc3Rfa2VybmVsKGJ1Zik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgotCQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmVfdm1fZmxhZ3MoYnVmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlmIChidWYtPnZtX2ZsYWdzICYgVk1fUEZOTUFQKSB7Ci0JCQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmVfcGZubWFwKGJ1Zik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX3NnbGlzdF9wZm5tYXAoYnVmKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IGlzcF92aWRlb19idWZmZXJfcHJlcGFyZV91c2VyKGJ1Zik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX3NnbGlzdF91c2VyKGJ1Zik7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JaWYgKCEoYnVmLT52bV9mbGFncyAmIFZNX1BGTk1BUCkpIHsKLQkJZGlyZWN0aW9uID0gYnVmLT52YnVmLnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFCi0JCQkgID8gRE1BX0ZST01fREVWSUNFIDogRE1BX1RPX0RFVklDRTsKLQkJcmV0ID0gZG1hX21hcF9zZyhidWYtPnF1ZXVlLT5kZXYsIGJ1Zi0+c2dsaXN0LCBidWYtPnNnbGVuLAotCQkJCSBkaXJlY3Rpb24pOwotCQlpZiAocmV0ICE9IGJ1Zi0+c2dsZW4pIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlpZiAoYnVmLT5xdWV1ZS0+b3BzLT5idWZmZXJfcHJlcGFyZSkKLQkJcmV0ID0gYnVmLT5xdWV1ZS0+b3BzLT5idWZmZXJfcHJlcGFyZShidWYpOwotCi1kb25lOgotCWlmIChyZXQgPCAwKSB7Ci0JCWlzcF92aWRlb19idWZmZXJfY2xlYW51cChidWYpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpc3BfdmlkZW9fcXVldWVfcXVlcnkgLSBRdWVyeSB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gYnVmZmVyCi0gKgotICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcXVldWUgbG9jayBoZWxkLgotICovCi1zdGF0aWMgdm9pZCBpc3BfdmlkZW9fYnVmZmVyX3F1ZXJ5KHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYsCi0JCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICp2YnVmKQotewotCW1lbWNweSh2YnVmLCAmYnVmLT52YnVmLCBzaXplb2YoKnZidWYpKTsKLQotCWlmIChidWYtPnZtYV91c2VfY291bnQpCi0JCXZidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCi0Jc3dpdGNoIChidWYtPnN0YXRlKSB7Ci0JY2FzZSBJU1BfQlVGX1NUQVRFX0VSUk9SOgotCQl2YnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0VSUk9SOwotCQkvKiBGYWxsdGhyb3VnaCAqLwotCWNhc2UgSVNQX0JVRl9TVEFURV9ET05FOgotCQl2YnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCWJyZWFrOwotCWNhc2UgSVNQX0JVRl9TVEFURV9RVUVVRUQ6Ci0JY2FzZSBJU1BfQlVGX1NUQVRFX0FDVElWRToKLQkJdmJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0JCWJyZWFrOwotCWNhc2UgSVNQX0JVRl9TVEFURV9JRExFOgotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIGlzcF92aWRlb19idWZmZXJfd2FpdCAtIFdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHJlYWR5Ci0gKgotICogSW4gbm9uLWJsb2NraW5nIG1vZGUsIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIDAgaWYgdGhlIGJ1ZmZlciBpcyByZWFkeSBvcgotICogLUVBR0FJTiBpZiB0aGUgYnVmZmVyIGlzIGluIHRoZSBRVUVVRUQgb3IgQUNUSVZFIHN0YXRlLgotICoKLSAqIEluIGJsb2NraW5nIG1vZGUsIHdhaXQgKGludGVycnVwdGlibHkgYnV0IHdpdGggbm8gdGltZW91dCkgb24gdGhlIGJ1ZmZlciB3YWl0Ci0gKiBxdWV1ZSB1c2luZyB0aGUgc2FtZSBjb25kaXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgaXNwX3ZpZGVvX2J1ZmZlcl93YWl0KHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYsIGludCBub25ibG9ja2luZykKLXsKLQlpZiAobm9uYmxvY2tpbmcpIHsKLQkJcmV0dXJuIChidWYtPnN0YXRlICE9IElTUF9CVUZfU1RBVEVfUVVFVUVEICYmCi0JCQlidWYtPnN0YXRlICE9IElTUF9CVUZfU1RBVEVfQUNUSVZFKQotCQkJPyAwIDogLUVBR0FJTjsKLQl9Ci0KLQlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJ1Zi0+d2FpdCwKLQkJYnVmLT5zdGF0ZSAhPSBJU1BfQlVGX1NUQVRFX1FVRVVFRCAmJgotCQlidWYtPnN0YXRlICE9IElTUF9CVUZfU1RBVEVfQUNUSVZFKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFF1ZXVlIG1hbmFnZW1lbnQKLSAqLwotCi0vKgotICogaXNwX3ZpZGVvX3F1ZXVlX2ZyZWUgLSBGcmVlIHZpZGVvIGJ1ZmZlcnMgbWVtb3J5Ci0gKgotICogQnVmZmVycyBjYW4gb25seSBiZSBmcmVlZCBpZiB0aGUgcXVldWUgaXNuJ3Qgc3RyZWFtaW5nIGFuZCBpZiBubyBidWZmZXIgaXMKLSAqIG1hcHBlZCB0byB1c2Vyc3BhY2UuIFJldHVybiAtRUJVU1kgaWYgdGhvc2UgY29uZGl0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcXVldWUgbG9jayBoZWxkLgotICovCi1zdGF0aWMgaW50IGlzcF92aWRlb19xdWV1ZV9mcmVlKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKHF1ZXVlLT5zdHJlYW1pbmcpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmNvdW50OyArK2kpIHsKLQkJaWYgKHF1ZXVlLT5idWZmZXJzW2ldLT52bWFfdXNlX2NvdW50ICE9IDApCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+Y291bnQ7ICsraSkgewotCQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmID0gcXVldWUtPmJ1ZmZlcnNbaV07Ci0KLQkJaXNwX3ZpZGVvX2J1ZmZlcl9jbGVhbnVwKGJ1Zik7Ci0KLQkJdmZyZWUoYnVmLT52YWRkcik7Ci0JCWJ1Zi0+dmFkZHIgPSBOVUxMOwotCi0JCWtmcmVlKGJ1Zik7Ci0JCXF1ZXVlLT5idWZmZXJzW2ldID0gTlVMTDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPnF1ZXVlKTsKLQlxdWV1ZS0+Y291bnQgPSAwOwotCXJldHVybiAwOwotfQotCi0vKgotICogaXNwX3ZpZGVvX3F1ZXVlX2FsbG9jIC0gQWxsb2NhdGUgdmlkZW8gYnVmZmVycyBtZW1vcnkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHF1ZXVlIGxvY2sgaGVsZC4KLSAqLwotc3RhdGljIGludCBpc3BfdmlkZW9fcXVldWVfYWxsb2Moc3RydWN0IGlzcF92aWRlb19xdWV1ZSAqcXVldWUsCi0JCQkJIHVuc2lnbmVkIGludCBuYnVmZmVycywKLQkJCQkgdW5zaWduZWQgaW50IHNpemUsIGVudW0gdjRsMl9tZW1vcnkgbWVtb3J5KQotewotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWY7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jdm9pZCAqbWVtOwotCWludCByZXQ7Ci0KLQkvKiBTdGFydCBieSBmcmVlaW5nIHRoZSBidWZmZXJzLiAqLwotCXJldCA9IGlzcF92aWRlb19xdWV1ZV9mcmVlKHF1ZXVlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIEJhaWwgb3V0IGlmIG5vIGJ1ZmZlcnMgc2hvdWxkIGJlIGFsbG9jYXRlZC4gKi8KLQlpZiAobmJ1ZmZlcnMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBhbGxvY2F0ZWQgYnVmZmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbmJ1ZmZlcnM7ICsraSkgewotCQlidWYgPSBremFsbG9jKHF1ZXVlLT5idWZzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKSB7Ci0JCQkvKiBBbGxvY2F0ZSB2aWRlbyBidWZmZXJzIG1lbW9yeSBmb3IgbW1hcCBtb2RlLiBBbGlnbgotCQkJICogdGhlIHNpemUgdG8gdGhlIHBhZ2Ugc2l6ZS4KLQkJCSAqLwotCQkJbWVtID0gdm1hbGxvY18zMl91c2VyKFBBR0VfQUxJR04oc2l6ZSkpOwotCQkJaWYgKG1lbSA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoYnVmKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJYnVmLT52YnVmLm0ub2Zmc2V0ID0gaSAqIFBBR0VfQUxJR04oc2l6ZSk7Ci0JCQlidWYtPnZhZGRyID0gbWVtOwotCQl9Ci0KLQkJYnVmLT52YnVmLmluZGV4ID0gaTsKLQkJYnVmLT52YnVmLmxlbmd0aCA9IHNpemU7Ci0JCWJ1Zi0+dmJ1Zi50eXBlID0gcXVldWUtPnR5cGU7Ci0JCWJ1Zi0+dmJ1Zi5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQzsKLQkJYnVmLT52YnVmLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCQlidWYtPnZidWYubWVtb3J5ID0gbWVtb3J5OwotCi0JCWJ1Zi0+cXVldWUgPSBxdWV1ZTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmYnVmLT53YWl0KTsKLQotCQlxdWV1ZS0+YnVmZmVyc1tpXSA9IGJ1ZjsKLQl9Ci0KLQlpZiAoaSA9PSAwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXF1ZXVlLT5jb3VudCA9IGk7Ci0JcmV0dXJuIG5idWZmZXJzOwotfQotCi0vKioKLSAqIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX2NsZWFudXAgLSBDbGVhbiB1cCB0aGUgdmlkZW8gYnVmZmVycyBxdWV1ZQotICogQHF1ZXVlOiBWaWRlbyBidWZmZXJzIHF1ZXVlCi0gKgotICogRnJlZSBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyBhbmQgY2xlYW4gdXAgdGhlIHZpZGVvIGJ1ZmZlcnMgcXVldWUuIFRoZSBxdWV1ZQotICogbXVzdCBub3QgYmUgYnVzeSAobm8gb25nb2luZyB2aWRlbyBzdHJlYW0pIGFuZCBidWZmZXJzIG11c3QgaGF2ZSBiZWVuCi0gKiB1bm1hcHBlZC4KLSAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1FQlVTWSBpZiB0aGUgcXVldWUgaXMgYnVzeSBvciBidWZmZXJzIGhhdmVuJ3QgYmVlbgotICogdW5tYXBwZWQuCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKQotewotCXJldHVybiBpc3BfdmlkZW9fcXVldWVfZnJlZShxdWV1ZSk7Ci19Ci0KLS8qKgotICogb21hcDNpc3BfdmlkZW9fcXVldWVfaW5pdCAtIEluaXRpYWxpemUgdGhlIHZpZGVvIGJ1ZmZlcnMgcXVldWUKLSAqIEBxdWV1ZTogVmlkZW8gYnVmZmVycyBxdWV1ZQotICogQHR5cGU6IFY0TDIgYnVmZmVyIHR5cGUgKGNhcHR1cmUgb3Igb3V0cHV0KQotICogQG9wczogRHJpdmVyLXNwZWNpZmljIHF1ZXVlIG9wZXJhdGlvbnMKLSAqIEBkZXY6IERldmljZSB1c2VkIGZvciBETUEgb3BlcmF0aW9ucwotICogQGJ1ZnNpemU6IFNpemUgb2YgdGhlIGRyaXZlci1zcGVjaWZpYyBidWZmZXIgc3RydWN0dXJlCi0gKgotICogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gYnVmZmVycyBxdWV1ZSB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLgotICoKLSAqIFRoZSBxdWV1ZSB0eXBlIG11c3QgYmUgb25lIG9mIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSBvcgotICogVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQuIE90aGVyIGJ1ZmZlciB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCi0gKgotICogQnVmZmVyIG9iamVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhlIGdpdmVuIGJ1ZmZlciBzaXplIHRvIGFsbG93IHJvb20KLSAqIGZvciBkcml2ZXItc3BlY2lmaWMgZmllbGRzLiBEcml2ZXItc3BlY2lmaWMgYnVmZmVyIHN0cnVjdHVyZXMgbXVzdCBzdGFydAotICogd2l0aCBhIHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyIGZpZWxkLiBEcml2ZXJzIHdpdGggbm8gZHJpdmVyLXNwZWNpZmljIGJ1ZmZlcgotICogc3RydWN0dXJlIG11c3QgcGFzcyB0aGUgc2l6ZSBvZiB0aGUgaXNwX3ZpZGVvX2J1ZmZlciBzdHJ1Y3R1cmUgaW4gdGhlIGJ1ZnNpemUKLSAqIHBhcmFtZXRlci4KLSAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzLgotICovCi1pbnQgb21hcDNpc3BfdmlkZW9fcXVldWVfaW5pdChzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCSAgICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlzcF92aWRlb19xdWV1ZV9vcGVyYXRpb25zICpvcHMsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBidWZzaXplKQotewotCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+cXVldWUpOwotCW11dGV4X2luaXQoJnF1ZXVlLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmlycWxvY2spOwotCi0JcXVldWUtPnR5cGUgPSB0eXBlOwotCXF1ZXVlLT5vcHMgPSBvcHM7Ci0JcXVldWUtPmRldiA9IGRldjsKLQlxdWV1ZS0+YnVmc2l6ZSA9IGJ1ZnNpemU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFY0TDIgb3BlcmF0aW9ucwotICovCi0KLS8qKgotICogb21hcDNpc3BfdmlkZW9fcXVldWVfcmVxYnVmcyAtIEFsbG9jYXRlIHZpZGVvIGJ1ZmZlcnMgbWVtb3J5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgVklESU9DX1JFUUJVRlMgaW9jdGwgaGFuZGxlci4gSXQKLSAqIGFsbG9jYXRlZCB2aWRlbyBidWZmZXIgb2JqZWN0cyBhbmQsIGZvciBNTUFQIGJ1ZmZlcnMsIGJ1ZmZlciBtZW1vcnkuCi0gKgotICogSWYgdGhlIG51bWJlciBvZiBidWZmZXJzIGlzIDAsIGFsbCBidWZmZXJzIGFyZSBmcmVlZCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMKLSAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgYWxsb2NhdGlvbi4KLSAqCi0gKiBJZiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgbm90IDAsIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVycyAoaWYgYW55KSBhcmUKLSAqIGZyZWVkIGFuZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIGFyZSBhbGxvY2F0ZWQuIERlcGVuZGluZyBvbgotICogZHJpdmVyLXNwZWNpZmljIHJlcXVpcmVtZW50cyBhbmQgb24gbWVtb3J5IGF2YWlsYWJpbGl0eSwgYSBudW1iZXIgb2YgYnVmZmVyCi0gKiBzbWFsbGVyIG9yIGJpZ2dlciB0aGFuIHJlcXVlc3RlZCBjYW4gYmUgYWxsb2NhdGVkLiBUaGlzIGlzbid0IGNvbnNpZGVyZWQgYXMKLSAqIGFuIGVycm9yLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6Ci0gKgotICogLUVJTlZBTCBpZiB0aGUgYnVmZmVyIHR5cGUgb3IgaW5kZXggYXJlIGludmFsaWQKLSAqIC1FQlVTWSBpZiB0aGUgcXVldWUgaXMgYnVzeSAoc3RyZWFtaW5nIG9yIGJ1ZmZlcnMgbWFwcGVkKQotICogLUVOT01FTSBpZiB0aGUgYnVmZmVycyBjYW4ndCBiZSBhbGxvY2F0ZWQgZHVlIHRvIGFuIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9yZXFidWZzKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlLAotCQkJCSBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpCi17Ci0JdW5zaWduZWQgaW50IG5idWZmZXJzID0gcmItPmNvdW50OwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCByZXQ7Ci0KLQlpZiAocmItPnR5cGUgIT0gcXVldWUtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcXVldWUtPm9wcy0+cXVldWVfcHJlcGFyZShxdWV1ZSwgJm5idWZmZXJzLCAmc2l6ZSk7Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQluYnVmZmVycyA9IG1pbl90KHVuc2lnbmVkIGludCwgbmJ1ZmZlcnMsIElTUF9WSURFT19NQVhfQlVGRkVSUyk7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlyZXQgPSBpc3BfdmlkZW9fcXVldWVfYWxsb2MocXVldWUsIG5idWZmZXJzLCBzaXplLCByYi0+bWVtb3J5KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JcmItPmNvdW50ID0gcmV0OwotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBvbWFwM2lzcF92aWRlb19xdWV1ZV9xdWVyeWJ1ZiAtIFF1ZXJ5IHRoZSBzdGF0dXMgb2YgYSBidWZmZXIgaW4gYSBxdWV1ZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIFZJRElPQ19RVUVSWUJVRiBpb2N0bCBoYW5kbGVyLiBJdAotICogcmV0dXJucyB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gdmlkZW8gYnVmZmVyLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBpZiB0aGUgYnVmZmVyIHR5cGUgb3IgaW5kZXggYXJlIGludmFsaWQuCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9xdWVyeWJ1ZihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCQkgIHN0cnVjdCB2NGwyX2J1ZmZlciAqdmJ1ZikKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOwotCWludCByZXQgPSAwOwotCi0JaWYgKHZidWYtPnR5cGUgIT0gcXVldWUtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcXVldWUtPmxvY2spOwotCi0JaWYgKHZidWYtPmluZGV4ID49IHF1ZXVlLT5jb3VudCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYnVmID0gcXVldWUtPmJ1ZmZlcnNbdmJ1Zi0+aW5kZXhdOwotCWlzcF92aWRlb19idWZmZXJfcXVlcnkoYnVmLCB2YnVmKTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3FidWYgLSBRdWV1ZSBhIGJ1ZmZlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIFZJRElPQ19RQlVGIGlvY3RsIGhhbmRsZXIuCi0gKgotICogVGhlIHY0bDJfYnVmZmVyIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgaXMgZmlyc3Qgc2FuaXR5IHRlc3RlZC4gSWYKLSAqIHNhbmUsIHRoZSBidWZmZXIgaXMgdGhlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSBtYWluIHF1ZXVlIGFuZCwgaWYgdGhlCi0gKiBxdWV1ZSBpcyBzdHJlYW1pbmcsIHRvIHRoZSBJUlEgcXVldWUuCi0gKgotICogQmVmb3JlIGJlaW5nIGVucXVldWVkLCBVU0VSUFRSIGJ1ZmZlcnMgYXJlIGNoZWNrZWQgZm9yIGFkZHJlc3MgY2hhbmdlcy4gSWYKLSAqIHRoZSBidWZmZXIgaGFzIGEgZGlmZmVyZW50IHVzZXJzcGFjZSBhZGRyZXNzLCB0aGUgb2xkIG1lbW9yeSBhcmVhIGlzIHVubG9ja2VkCi0gKiBhbmQgdGhlIG5ldyBtZW1vcnkgYXJlYSBpcyBsb2NrZWQuCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9xYnVmKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlLAotCQkJICAgICAgc3RydWN0IHY0bDJfYnVmZmVyICp2YnVmKQotewotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWlmICh2YnVmLT50eXBlICE9IHF1ZXVlLT50eXBlKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAodmJ1Zi0+aW5kZXggPj0gcXVldWUtPmNvdW50KQotCQlnb3RvIGRvbmU7Ci0KLQlidWYgPSBxdWV1ZS0+YnVmZmVyc1t2YnVmLT5pbmRleF07Ci0KLQlpZiAodmJ1Zi0+bWVtb3J5ICE9IGJ1Zi0+dmJ1Zi5tZW1vcnkpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChidWYtPnN0YXRlICE9IElTUF9CVUZfU1RBVEVfSURMRSkKLQkJZ290byBkb25lOwotCi0JaWYgKHZidWYtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSICYmCi0JICAgIHZidWYtPmxlbmd0aCA8IGJ1Zi0+dmJ1Zi5sZW5ndGgpCi0JCWdvdG8gZG9uZTsKLQotCWlmICh2YnVmLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUiAmJgotCSAgICB2YnVmLT5tLnVzZXJwdHIgIT0gYnVmLT52YnVmLm0udXNlcnB0cikgewotCQlpc3BfdmlkZW9fYnVmZmVyX2NsZWFudXAoYnVmKTsKLQkJYnVmLT52YnVmLm0udXNlcnB0ciA9IHZidWYtPm0udXNlcnB0cjsKLQkJYnVmLT5wcmVwYXJlZCA9IDA7Ci0JfQotCi0JaWYgKCFidWYtPnByZXBhcmVkKSB7Ci0JCXJldCA9IGlzcF92aWRlb19idWZmZXJfcHJlcGFyZShidWYpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJYnVmLT5wcmVwYXJlZCA9IDE7Ci0JfQotCi0JaXNwX3ZpZGVvX2J1ZmZlcl9jYWNoZV9zeW5jKGJ1Zik7Ci0KLQlidWYtPnN0YXRlID0gSVNQX0JVRl9TVEFURV9RVUVVRUQ7Ci0JbGlzdF9hZGRfdGFpbCgmYnVmLT5zdHJlYW0sICZxdWV1ZS0+cXVldWUpOwotCi0JaWYgKHF1ZXVlLT5zdHJlYW1pbmcpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7Ci0JCXF1ZXVlLT5vcHMtPmJ1ZmZlcl9xdWV1ZShidWYpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBvbWFwM2lzcF92aWRlb19xdWV1ZV9kcWJ1ZiAtIERlcXVldWUgYSBidWZmZXIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBWSURJT0NfRFFCVUYgaW9jdGwgaGFuZGxlci4KLSAqCi0gKiBXYWl0IHVudGlsIGEgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIGRlcXVldWVkLCByZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUgYW5kCi0gKiBjb3B5IGl0cyBpbmZvcm1hdGlvbiB0byB0aGUgdjRsMl9idWZmZXIgc3RydWN0dXJlLgotICoKLSAqIElmIHRoZSBub25ibG9ja2luZyBhcmd1bWVudCBpcyBub3QgemVybyBhbmQgbm8gYnVmZmVyIGlzIHJlYWR5LCByZXR1cm4KLSAqIC1FQUdBSU4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nLgotICoKLSAqIElmIG5vIGJ1ZmZlciBoYXMgYmVlbiBlbnF1ZXVlZCwgb3IgaWYgdGhlIHJlcXVlc3RlZCBidWZmZXIgdHlwZSBkb2Vzbid0IG1hdGNoCi0gKiB0aGUgcXVldWUgdHlwZSwgcmV0dXJuIC1FSU5WQUwuCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9kcWJ1ZihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKnZidWYsIGludCBub25ibG9ja2luZykKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOwotCWludCByZXQ7Ci0KLQlpZiAodmJ1Zi0+dHlwZSAhPSBxdWV1ZS0+dHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmcXVldWUtPnF1ZXVlKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcXVldWUtPnF1ZXVlLCBzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciwgc3RyZWFtKTsKLQlyZXQgPSBpc3BfdmlkZW9fYnVmZmVyX3dhaXQoYnVmLCBub25ibG9ja2luZyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZTsKLQotCWxpc3RfZGVsKCZidWYtPnN0cmVhbSk7Ci0KLQlpc3BfdmlkZW9fYnVmZmVyX3F1ZXJ5KGJ1ZiwgdmJ1Zik7Ci0JYnVmLT5zdGF0ZSA9IElTUF9CVUZfU1RBVEVfSURMRTsKLQl2YnVmLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBvbWFwM2lzcF92aWRlb19xdWV1ZV9zdHJlYW1vbiAtIFN0YXJ0IHN0cmVhbWluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIFZJRElPQ19TVFJFQU1PTiBpb2N0bCBoYW5kbGVyLiBJdAotICogc3RhcnRzIHN0cmVhbWluZyBvbiB0aGUgcXVldWUgYW5kIGNhbGxzIHRoZSBidWZmZXJfcXVldWUgb3BlcmF0aW9uIGZvciBhbGwKLSAqIHF1ZXVlZCBidWZmZXJzLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MuCi0gKi8KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9zdHJlYW1vbihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAocXVldWUtPnN0cmVhbWluZykKLQkJZ290byBkb25lOwotCi0JcXVldWUtPnN0cmVhbWluZyA9IDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZiwgJnF1ZXVlLT5xdWV1ZSwgc3RyZWFtKQotCQlxdWV1ZS0+b3BzLT5idWZmZXJfcXVldWUoYnVmKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmcXVldWUtPmxvY2spOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3N0cmVhbW9mZiAtIFN0b3Agc3RyZWFtaW5nCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgVklESU9DX1NUUkVBTU9GRiBpb2N0bCBoYW5kbGVyLiBJdAotICogc3RvcHMgc3RyZWFtaW5nIG9uIHRoZSBxdWV1ZSBhbmQgd2FrZXMgdXAgYWxsIHRoZSBidWZmZXJzLgotICoKLSAqIERyaXZlcnMgbXVzdCBzdG9wIHRoZSBoYXJkd2FyZSBhbmQgc3luY2hyb25pemUgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlcnMgYW5kL29yCi0gKiBkZWxheWVkIHdvcmtzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIG5vIGJ1ZmZlciB3aWxsIGJlCi0gKiB0b3VjaGVkIGJ5IHRoZSBkcml2ZXIgYW5kL29yIGhhcmR3YXJlLgotICovCi12b2lkIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3N0cmVhbW9mZihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAoIXF1ZXVlLT5zdHJlYW1pbmcpCi0JCWdvdG8gZG9uZTsKLQotCXF1ZXVlLT5zdHJlYW1pbmcgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IHF1ZXVlLT5jb3VudDsgKytpKSB7Ci0JCWJ1ZiA9IHF1ZXVlLT5idWZmZXJzW2ldOwotCi0JCWlmIChidWYtPnN0YXRlID09IElTUF9CVUZfU1RBVEVfQUNUSVZFKQotCQkJd2FrZV91cCgmYnVmLT53YWl0KTsKLQotCQlidWYtPnN0YXRlID0gSVNQX0JVRl9TVEFURV9JRExFOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOwotCi0JSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5xdWV1ZSk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci19Ci0KLS8qKgotICogb21hcDNpc3BfdmlkZW9fcXVldWVfZGlzY2FyZF9kb25lIC0gRGlzY2FyZCBhbGwgYnVmZmVycyBtYXJrZWQgYXMgRE9ORQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHN1c3BlbmQvcmVzdW1lIG9wZXJhdGlvbnMuIEl0Ci0gKiBkaXNjYXJkcyBhbGwgJ2RvbmUnIGJ1ZmZlcnMgYXMgdGhleSB3b3VsZCBiZSB0b28gb2xkIHRvIGJlIHJlcXVlc3RlZCBhZnRlcgotICogcmVzdW1lLgotICoKLSAqIERyaXZlcnMgbXVzdCBzdG9wIHRoZSBoYXJkd2FyZSBhbmQgc3luY2hyb25pemUgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlcnMgYW5kL29yCi0gKiBkZWxheWVkIHdvcmtzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIG5vIGJ1ZmZlciB3aWxsIGJlCi0gKiB0b3VjaGVkIGJ5IHRoZSBkcml2ZXIgYW5kL29yIGhhcmR3YXJlLgotICovCi12b2lkIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX2Rpc2NhcmRfZG9uZShzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOwotCXVuc2lnbmVkIGludCBpOwotCi0JbXV0ZXhfbG9jaygmcXVldWUtPmxvY2spOwotCi0JaWYgKCFxdWV1ZS0+c3RyZWFtaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmNvdW50OyArK2kpIHsKLQkJYnVmID0gcXVldWUtPmJ1ZmZlcnNbaV07Ci0KLQkJaWYgKGJ1Zi0+c3RhdGUgPT0gSVNQX0JVRl9TVEFURV9ET05FKQotCQkJYnVmLT5zdGF0ZSA9IElTUF9CVUZfU1RBVEVfRVJST1I7Ci0JfQotCi1kb25lOgotCW11dGV4X3VubG9jaygmcXVldWUtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBpc3BfdmlkZW9fcXVldWVfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0KLQlidWYtPnZtYV91c2VfY291bnQrKzsKLX0KLQotc3RhdGljIHZvaWQgaXNwX3ZpZGVvX3F1ZXVlX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQotCWJ1Zi0+dm1hX3VzZV9jb3VudC0tOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGlzcF92aWRlb19xdWV1ZV92bV9vcHMgPSB7Ci0JLm9wZW4gPSBpc3BfdmlkZW9fcXVldWVfdm1fb3BlbiwKLQkuY2xvc2UgPSBpc3BfdmlkZW9fcXVldWVfdm1fY2xvc2UsCi19OwotCi0vKioKLSAqIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX21tYXAgLSBNYXAgYnVmZmVycyB0byB1c2Vyc3BhY2UKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYW4gbW1hcCgpIGZpbGUgb3BlcmF0aW9uIGhhbmRsZXIuIEl0Ci0gKiBtYXBzIGEgYnVmZmVyIHRvIHVzZXJzcGFjZSBiYXNlZCBvbiB0aGUgVk1BIG9mZnNldC4KLSAqCi0gKiBPbmx5IGJ1ZmZlcnMgb2YgbWVtb3J5IHR5cGUgTU1BUCBhcmUgc3VwcG9ydGVkLgotICovCi1pbnQgb21hcDNpc3BfdmlkZW9fcXVldWVfbW1hcChzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqdW5pbml0aWFsaXplZF92YXIoYnVmKTsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmNvdW50OyArK2kpIHsKLQkJYnVmID0gcXVldWUtPmJ1ZmZlcnNbaV07Ci0JCWlmICgoYnVmLT52YnVmLm0ub2Zmc2V0ID4+IFBBR0VfU0hJRlQpID09IHZtYS0+dm1fcGdvZmYpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBxdWV1ZS0+Y291bnQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0KLQlpZiAoYnVmLT52YnVmLm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQIHx8Ci0JICAgIHNpemUgIT0gUEFHRV9BTElHTihidWYtPnZidWYubGVuZ3RoKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gcmVtYXBfdm1hbGxvY19yYW5nZSh2bWEsIGJ1Zi0+dmFkZHIsIDApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQl2bWEtPnZtX29wcyA9ICZpc3BfdmlkZW9fcXVldWVfdm1fb3BzOwotCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gYnVmOwotCWlzcF92aWRlb19xdWV1ZV92bV9vcGVuKHZtYSk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBvbWFwM2lzcF92aWRlb19xdWV1ZV9wb2xsIC0gUG9sbCB2aWRlbyBxdWV1ZSBzdGF0ZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIHBvbGwoKSBmaWxlIG9wZXJhdGlvbiBoYW5kbGVyLiBJdAotICogcG9sbHMgdGhlIHN0YXRlIG9mIHRoZSB2aWRlbyBidWZmZXIgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBhbgotICogZXZlbnRzIG1hc2suCi0gKgotICogSWYgbm8gYnVmZmVyIGlzIHByZXNlbnQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSwgUE9MTEVSUiBpcyByZXR1cm5lZC4KLSAqLwotdW5zaWduZWQgaW50IG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3BvbGwoc3RydWN0IGlzcF92aWRlb19xdWV1ZSAqcXVldWUsCi0JCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWY7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JbXV0ZXhfbG9jaygmcXVldWUtPmxvY2spOwotCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+cXVldWUpKSB7Ci0JCW1hc2sgfD0gUE9MTEVSUjsKLQkJZ290byBkb25lOwotCX0KLQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxdWV1ZS0+cXVldWUsIHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyLCBzdHJlYW0pOwotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPndhaXQsIHdhaXQpOwotCWlmIChidWYtPnN0YXRlID09IElTUF9CVUZfU1RBVEVfRE9ORSB8fAotCSAgICBidWYtPnN0YXRlID09IElTUF9CVUZfU1RBVEVfRVJST1IpIHsKLQkJaWYgKHF1ZXVlLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJZWxzZQotCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQl9Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIG1hc2s7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHF1ZXVlLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHF1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDQ4YWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BxdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBpc3BxdWV1ZS5oCi0gKgotICogVEkgT01BUDMgSVNQIC0gVmlkZW8gYnVmZmVycyBxdWV1ZSBoYW5kbGluZwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIENvbnRhY3RzOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Ci0gKgkgICAgIFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQGlraS5maT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBPTUFQM19JU1BfUVVFVUVfSAotI2RlZmluZSBPTUFQM19JU1BfUVVFVUVfSAotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLXN0cnVjdCBpc3BfdmlkZW9fcXVldWU7Ci1zdHJ1Y3QgcGFnZTsKLXN0cnVjdCBzY2F0dGVybGlzdDsKLQotI2RlZmluZSBJU1BfVklERU9fTUFYX0JVRkZFUlMJCTE2Ci0KLS8qKgotICogZW51bSBpc3BfdmlkZW9fYnVmZmVyX3N0YXRlIC0gSVNQIHZpZGVvIGJ1ZmZlciBzdGF0ZQotICogQElTUF9CVUZfU1RBVEVfSURMRToJVGhlIGJ1ZmZlciBpcyB1bmRlciB1c2Vyc3BhY2UgY29udHJvbCAoZGVxdWV1ZWQKLSAqCW9yIG5vdCBxdWV1ZWQgeWV0KS4KLSAqIEBJU1BfQlVGX1NUQVRFX1FVRVVFRDogVGhlIGJ1ZmZlciBoYXMgYmVlbiBxdWV1ZWQgYnV0IGlzbid0IHVzZWQgYnkgdGhlCi0gKglkZXZpY2UgeWV0LgotICogQElTUF9CVUZfU1RBVEVfQUNUSVZFOiBUaGUgYnVmZmVyIGlzIGluIHVzZSBmb3IgYW4gYWN0aXZlIHZpZGVvIHRyYW5zZmVyLgotICogQElTUF9CVUZfU1RBVEVfRVJST1I6IFRoZSBkZXZpY2UgaXMgZG9uZSB3aXRoIHRoZSBidWZmZXIgYW5kIGFuIGVycm9yCi0gKglvY2N1cnJlZC4gRm9yIGNhcHR1cmUgZGV2aWNlIHRoZSBidWZmZXIgbGlrZWx5IGNvbnRhaW5zIGNvcnJ1cHRlZCBkYXRhIG9yCi0gKglubyBkYXRhIGF0IGFsbC4KLSAqIEBJU1BfQlVGX1NUQVRFX0RPTkU6IFRoZSBkZXZpY2UgaXMgZG9uZSB3aXRoIHRoZSBidWZmZXIgYW5kIG5vIGVycm9yIG9jY3VycmVkLgotICoJRm9yIGNhcHR1cmUgZGV2aWNlcyB0aGUgYnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEuCi0gKi8KLWVudW0gaXNwX3ZpZGVvX2J1ZmZlcl9zdGF0ZSB7Ci0JSVNQX0JVRl9TVEFURV9JRExFLAotCUlTUF9CVUZfU1RBVEVfUVVFVUVELAotCUlTUF9CVUZfU1RBVEVfQUNUSVZFLAotCUlTUF9CVUZfU1RBVEVfRVJST1IsCi0JSVNQX0JVRl9TVEFURV9ET05FLAotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAtIElTUCB2aWRlbyBidWZmZXIKLSAqIEB2bWFfdXNlX2NvdW50OiBOdW1iZXIgb2YgdGltZXMgdGhlIGJ1ZmZlciBpcyBtbWFwJ2VkIHRvIHVzZXJzcGFjZQotICogQHN0cmVhbTogTGlzdCBoZWFkIGZvciBpbnNlcnRpb24gaW50byBtYWluIHF1ZXVlCi0gKiBAcXVldWU6IElTUCBidWZmZXJzIHF1ZXVlIHRoaXMgYnVmZmVyIGJlbG9uZ3MgdG8KLSAqIEBwcmVwYXJlZDogV2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIHByZXBhcmVkCi0gKiBAc2tpcF9jYWNoZTogV2hldGhlciB0byBza2lwIGNhY2hlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyBmb3IgdGhpcyBidWZmZXIKLSAqIEB2YWRkcjogTWVtb3J5IHZpcnR1YWwgYWRkcmVzcyAoZm9yIGtlcm5lbCBidWZmZXJzKQotICogQHZtX2ZsYWdzOiBCdWZmZXIgVk1BIGZsYWdzIChmb3IgdXNlcnNwYWNlIGJ1ZmZlcnMpCi0gKiBAb2Zmc2V0OiBPZmZzZXQgaW5zaWRlIHRoZSBmaXJzdCBwYWdlIChmb3IgdXNlcnNwYWNlIGJ1ZmZlcnMpCi0gKiBAbnBhZ2VzOiBOdW1iZXIgb2YgcGFnZXMgKGZvciB1c2Vyc3BhY2UgYnVmZmVycykKLSAqIEBwYWdlczogUGFnZXMgdGFibGUgKGZvciB1c2Vyc3BhY2Ugbm9uLVZNX1BGTk1BUCBidWZmZXJzKQotICogQHBhZGRyOiBNZW1vcnkgcGh5c2ljYWwgYWRkcmVzcyAoZm9yIHVzZXJzcGFjZSBWTV9QRk5NQVAgYnVmZmVycykKLSAqIEBzZ2xlbjogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzY2F0dGVyIGxpc3QgKGZvciBub24tVk1fUEZOTUFQIGJ1ZmZlcnMpCi0gKiBAc2dsaXN0OiBTY2F0dGVyIGxpc3QgKGZvciBub24tVk1fUEZOTUFQIGJ1ZmZlcnMpCi0gKiBAdmJ1ZjogVjRMMiBidWZmZXIKLSAqIEBpcnFsaXN0OiBMaXN0IGhlYWQgZm9yIGluc2VydGlvbiBpbnRvIElSUSBxdWV1ZQotICogQHN0YXRlOiBDdXJyZW50IGJ1ZmZlciBzdGF0ZQotICogQHdhaXQ6IFdhaXQgcXVldWUgdG8gc2lnbmFsIGJ1ZmZlciBjb21wbGV0aW9uCi0gKi8KLXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyIHsKLQl1bnNpZ25lZCBsb25nIHZtYV91c2VfY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzdHJlYW07Ci0Jc3RydWN0IGlzcF92aWRlb19xdWV1ZSAqcXVldWU7Ci0JdW5zaWduZWQgaW50IHByZXBhcmVkOjE7Ci0JYm9vbCBza2lwX2NhY2hlOwotCi0JLyogRm9yIGtlcm5lbCBidWZmZXJzLiAqLwotCXZvaWQgKnZhZGRyOwotCi0JLyogRm9yIHVzZXJzcGFjZSBidWZmZXJzLiAqLwotCXZtX2ZsYWdzX3Qgdm1fZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgaW50IG5wYWdlczsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCWRtYV9hZGRyX3QgcGFkZHI7Ci0KLQkvKiBGb3IgYWxsIGJ1ZmZlcnMgZXhjZXB0IFZNX1BGTk1BUC4gKi8KLQl1bnNpZ25lZCBpbnQgc2dsZW47Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7Ci0KLQkvKiBUb3VjaGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KLQlzdHJ1Y3QgdjRsMl9idWZmZXIgdmJ1ZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGlycWxpc3Q7Ci0JZW51bSBpc3BfdmlkZW9fYnVmZmVyX3N0YXRlIHN0YXRlOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci19OwotCi0jZGVmaW5lIHRvX2lzcF92aWRlb19idWZmZXIodmIpCWNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGlzcF92aWRlb19idWZmZXIsIHZiKQotCi0vKioKLSAqIHN0cnVjdCBpc3BfdmlkZW9fcXVldWVfb3BlcmF0aW9ucyAtIERyaXZlci1zcGVjaWZpYyBvcGVyYXRpb25zCi0gKiBAcXVldWVfcHJlcGFyZTogQ2FsbGVkIGJlZm9yZSBhbGxvY2F0aW5nIGJ1ZmZlcnMuIERyaXZlcnMgc2hvdWxkIGNsYW1wIHRoZQotICoJbnVtYmVyIG9mIGJ1ZmZlcnMgYWNjb3JkaW5nIHRvIHRoZWlyIHJlcXVpcmVtZW50cywgYW5kIG11c3QgcmV0dXJuIHRoZQotICoJYnVmZmVyIHNpemUgaW4gYnl0ZXMuCi0gKiBAYnVmZmVyX3ByZXBhcmU6IENhbGxlZCB0aGUgZmlyc3QgdGltZSBhIGJ1ZmZlciBpcyBxdWV1ZWQsIG9yIGFmdGVyIGNoYW5naW5nCi0gKgl0aGUgdXNlcnNwYWNlIG1lbW9yeSBhZGRyZXNzIGZvciBhIFVTRVJQVFIgYnVmZmVyLCB3aXRoIHRoZSBxdWV1ZSBsb2NrCi0gKgloZWxkLiBEcml2ZXJzIHNob3VsZCBwZXJmb3JtIGRldmljZS1zcGVjaWZpYyBidWZmZXIgcHJlcGFyYXRpb24gKHN1Y2ggYXMKLSAqCW1hcHBpbmcgdGhlIGJ1ZmZlciBtZW1vcnkgaW4gYW4gSU9NTVUpLiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4KLSAqIEBidWZmZXJfcXVldWU6IENhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZQotICoJcXVldWUgaXJxbG9jayBzcGlubG9jayBoZWxkLgotICogQGJ1ZmZlcl9jbGVhbnVwOiBDYWxsZWQgYmVmb3JlIGZyZWVpbmcgYnVmZmVycywgb3IgYmVmb3JlIGNoYW5naW5nIHRoZQotICoJdXNlcnNwYWNlIG1lbW9yeSBhZGRyZXNzIGZvciBhIFVTRVJQVFIgYnVmZmVyLCB3aXRoIHRoZSBxdWV1ZSBsb2NrIGhlbGQuCi0gKglEcml2ZXJzIG11c3QgcGVyZm9ybSBjbGVhbnVwIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gdW5kbyB0aGUKLSAqCWJ1ZmZlcl9wcmVwYXJlIGNhbGwuIFRoaXMgb3BlcmF0aW9uIGlzIG9wdGlvbmFsLgotICovCi1zdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlX29wZXJhdGlvbnMgewotCXZvaWQgKCpxdWV1ZV9wcmVwYXJlKShzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsIHVuc2lnbmVkIGludCAqc2l6ZSk7Ci0JaW50ICAoKmJ1ZmZlcl9wcmVwYXJlKShzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKTsKLQl2b2lkICgqYnVmZmVyX3F1ZXVlKShzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKTsKLQl2b2lkICgqYnVmZmVyX2NsZWFudXApKHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYpOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlIC0gSVNQIHZpZGVvIGJ1ZmZlcnMgcXVldWUKLSAqIEB0eXBlOiBUeXBlIG9mIHZpZGVvIGJ1ZmZlcnMgaGFuZGxlZCBieSB0aGlzIHF1ZXVlCi0gKiBAb3BzOiBRdWV1ZSBvcGVyYXRpb25zCi0gKiBAZGV2OiBEZXZpY2UgdXNlZCBmb3IgRE1BIG9wZXJhdGlvbnMKLSAqIEBidWZzaXplOiBTaXplIG9mIGEgZHJpdmVyLXNwZWNpZmljIGJ1ZmZlciBvYmplY3QKLSAqIEBjb3VudDogTnVtYmVyIG9mIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVycwotICogQGJ1ZmZlcnM6IElTUCB2aWRlbyBidWZmZXJzCi0gKiBAbG9jazogTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIG1haW4gcXVldWUgYW5kIHN0YXRlCi0gKiBAaXJxbG9jazogU3BpbmxvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIElSUSBxdWV1ZQotICogQHN0cmVhbWluZzogUXVldWUgc3RhdGUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBzdHJlYW1pbmcKLSAqIEBxdWV1ZTogTGlzdCBvZiBhbGwgcXVldWVkIGJ1ZmZlcnMKLSAqLwotc3RydWN0IGlzcF92aWRlb19xdWV1ZSB7Ci0JZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7Ci0JY29uc3Qgc3RydWN0IGlzcF92aWRlb19xdWV1ZV9vcGVyYXRpb25zICpvcHM7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXVuc2lnbmVkIGludCBidWZzaXplOwotCi0JdW5zaWduZWQgaW50IGNvdW50OwotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWZmZXJzW0lTUF9WSURFT19NQVhfQlVGRkVSU107Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3BpbmxvY2tfdCBpcnFsb2NrOwotCi0JdW5zaWduZWQgaW50IHN0cmVhbWluZzoxOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKLX07Ci0KLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKTsKLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9pbml0KHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlLAotCQkJICAgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlX29wZXJhdGlvbnMgKm9wcywKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpOwotCi1pbnQgb21hcDNpc3BfdmlkZW9fcXVldWVfcmVxYnVmcyhzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCQkgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJiKTsKLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9xdWVyeWJ1ZihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCQkgIHN0cnVjdCB2NGwyX2J1ZmZlciAqdmJ1Zik7Ci1pbnQgb21hcDNpc3BfdmlkZW9fcXVldWVfcWJ1ZihzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCSAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqdmJ1Zik7Ci1pbnQgb21hcDNpc3BfdmlkZW9fcXVldWVfZHFidWYoc3RydWN0IGlzcF92aWRlb19xdWV1ZSAqcXVldWUsCi0JCQkgICAgICAgc3RydWN0IHY0bDJfYnVmZmVyICp2YnVmLCBpbnQgbm9uYmxvY2tpbmcpOwotaW50IG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3N0cmVhbW9uKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKTsKLXZvaWQgb21hcDNpc3BfdmlkZW9fcXVldWVfc3RyZWFtb2ZmKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKTsKLXZvaWQgb21hcDNpc3BfdmlkZW9fcXVldWVfZGlzY2FyZF9kb25lKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlKTsKLWludCBvbWFwM2lzcF92aWRlb19xdWV1ZV9tbWFwKHN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlLAotCQkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotdW5zaWduZWQgaW50IG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX3BvbGwoc3RydWN0IGlzcF92aWRlb19xdWV1ZSAqcXVldWUsCi0JCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKLQotI2VuZGlmIC8qIE9NQVAzX0lTUF9RVUVVRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHJlc2l6ZXIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcmVzaXplci5jCmluZGV4IDg2MzY5ZGYuLjZmMDc3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcmVzaXplci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwcmVzaXplci5jCkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogCSAqLwogCWJ1ZmZlciA9IG9tYXAzaXNwX3ZpZGVvX2J1ZmZlcl9uZXh0KCZyZXMtPnZpZGVvX291dCk7CiAJaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0JCXJlc2l6ZXJfc2V0X291dGFkZHIocmVzLCBidWZmZXItPmlzcF9hZGRyKTsKKwkJcmVzaXplcl9zZXRfb3V0YWRkcihyZXMsIGJ1ZmZlci0+ZG1hKTsKIAkJcmVzdGFydCA9IDE7CiAJfQogCkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCWlmIChyZXMtPmlucHV0ID09IFJFU0laRVJfSU5QVVRfTUVNT1JZKSB7CiAJCWJ1ZmZlciA9IG9tYXAzaXNwX3ZpZGVvX2J1ZmZlcl9uZXh0KCZyZXMtPnZpZGVvX2luKTsKIAkJaWYgKGJ1ZmZlciAhPSBOVUxMKQotCQkJcmVzaXplcl9zZXRfaW5hZGRyKHJlcywgYnVmZmVyLT5pc3BfYWRkcik7CisJCQlyZXNpemVyX3NldF9pbmFkZHIocmVzLCBidWZmZXItPmRtYSk7CiAJCXBpcGUtPnN0YXRlIHw9IElTUF9QSVBFTElORV9JRExFX0lOUFVUOwogCX0KIApAQCAtMTEwMSw3ICsxMTAxLDcgQEAKIAlzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcyA9ICZ2aWRlby0+aXNwLT5pc3BfcmVzOwogCiAJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKQotCQlyZXNpemVyX3NldF9pbmFkZHIocmVzLCBidWZmZXItPmlzcF9hZGRyKTsKKwkJcmVzaXplcl9zZXRfaW5hZGRyKHJlcywgYnVmZmVyLT5kbWEpOwogCiAJLyoKIAkgKiBXZSBub3cgaGF2ZSBhIGJ1ZmZlciBxdWV1ZWQgb24gdGhlIG91dHB1dC4gRGVzcGl0ZSB3aGF0IHRoZQpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAkgKiBjb250aW51b3VzIG1vZGUgb3Igd2hlbiBzdGFydGluZyB0aGUgc3RyZWFtLgogCSAqLwogCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJlc2l6ZXJfc2V0X291dGFkZHIocmVzLCBidWZmZXItPmlzcF9hZGRyKTsKKwkJcmVzaXplcl9zZXRfb3V0YWRkcihyZXMsIGJ1ZmZlci0+ZG1hKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BzdGF0LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuYwppbmRleCA1NzA3Zjg1Li5lNmNiYzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuYwpAQCAtMjYsMTMgKzI2LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvb21hcC1pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpc3AuaCIKIAotI2RlZmluZSBJU19DT0hFUkVOVF9CVUYoc3RhdCkJKChzdGF0KS0+ZG1hX2NoID49IDApCisjZGVmaW5lIElTUF9TVEFUX1VTRVNfRE1BRU5HSU5FKHN0YXQpCSgoc3RhdCktPmRtYV9jaCA+PSAwKQogCiAvKgogICogTUFHSUNfU0laRSBtdXN0IGFsd2F5cyBiZSB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YKQEAgLTc3LDIxICs3NiwxMCBAQAogCQkJCQlkbWFfYWRkcl90LCB1bnNpZ25lZCBsb25nLCBzaXplX3QsCiAJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzdGF0LT5pc3AtPmRldjsKLQlzdHJ1Y3QgcGFnZSAqcGc7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQl1MzIgb2Zmc2V0OwotCi0JLyogSW5pdGlhbCBtYWdpYyB3b3JkcyAqLwotCXBnID0gdm1hbGxvY190b19wYWdlKGJ1Zi0+dmlydF9hZGRyKTsKLQlkbWFfYWRkciA9IHBmbl90b19kbWEoZGV2LCBwYWdlX3RvX3BmbihwZykpOwotCWRtYV9zeW5jKGRldiwgZG1hX2FkZHIsIDAsIE1BR0lDX1NJWkUsIGRpcik7Ci0KLQkvKiBGaW5hbCBtYWdpYyB3b3JkcyAqLwotCXBnID0gdm1hbGxvY190b19wYWdlKGJ1Zi0+dmlydF9hZGRyICsgYnVmX3NpemUpOwotCWRtYV9hZGRyID0gcGZuX3RvX2RtYShkZXYsIHBhZ2VfdG9fcGZuKHBnKSk7Ci0Jb2Zmc2V0ID0gKCh1MzIpYnVmLT52aXJ0X2FkZHIgKyBidWZfc2l6ZSkgJiB+UEFHRV9NQVNLOwotCWRtYV9zeW5jKGRldiwgZG1hX2FkZHIsIG9mZnNldCwgTUFHSUNfU0laRSwgZGlyKTsKKwkvKiBTeW5jIHRoZSBpbml0aWFsIGFuZCBmaW5hbCBtYWdpYyB3b3Jkcy4gKi8KKwlkbWFfc3luYyhzdGF0LT5pc3AtPmRldiwgYnVmLT5kbWFfYWRkciwgMCwgTUFHSUNfU0laRSwgZGlyKTsKKwlkbWFfc3luYyhzdGF0LT5pc3AtPmRldiwgYnVmLT5kbWFfYWRkciArIChidWZfc2l6ZSAmIFBBR0VfTUFTSyksCisJCSBidWZfc2l6ZSAmIH5QQUdFX01BU0ssIE1BR0lDX1NJWkUsIGRpcik7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcF9zdGF0X2J1Zl9zeW5jX21hZ2ljX2Zvcl9kZXZpY2Uoc3RydWN0IGlzcHN0YXQgKnN0YXQsCkBAIC05OSw3ICs4Nyw3IEBACiAJCQkJCSAgICAgICB1MzIgYnVmX3NpemUsCiAJCQkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JaWYgKElTX0NPSEVSRU5UX0JVRihzdGF0KSkKKwlpZiAoSVNQX1NUQVRfVVNFU19ETUFFTkdJTkUoc3RhdCkpCiAJCXJldHVybjsKIAogCV9faXNwX3N0YXRfYnVmX3N5bmNfbWFnaWMoc3RhdCwgYnVmLCBidWZfc2l6ZSwgZGlyLApAQCAtMTExLDcgKzk5LDcgQEAKIAkJCQkJICAgIHUzMiBidWZfc2l6ZSwKIAkJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlpZiAoSVNfQ09IRVJFTlRfQlVGKHN0YXQpKQorCWlmIChJU1BfU1RBVF9VU0VTX0RNQUVOR0lORShzdGF0KSkKIAkJcmV0dXJuOwogCiAJX19pc3Bfc3RhdF9idWZfc3luY19tYWdpYyhzdGF0LCBidWYsIGJ1Zl9zaXplLCBkaXIsCkBAIC0xODAsMjEgKzE2OCwyMSBAQAogc3RhdGljIHZvaWQgaXNwX3N0YXRfYnVmX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwKIAkJCQkJIHN0cnVjdCBpc3BzdGF0X2J1ZmZlciAqYnVmKQogewotCWlmIChJU19DT0hFUkVOVF9CVUYoc3RhdCkpCisJaWYgKElTUF9TVEFUX1VTRVNfRE1BRU5HSU5FKHN0YXQpKQogCQlyZXR1cm47CiAKLQlkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0YXQtPmlzcC0+ZGV2LCBidWYtPmlvdm0tPnNndC0+c2dsLAotCQkJICAgICAgIGJ1Zi0+aW92bS0+c2d0LT5uZW50cywgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0YXQtPmlzcC0+ZGV2LCBidWYtPnNndC5zZ2wsCisJCQkgICAgICAgYnVmLT5zZ3QubmVudHMsIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcF9zdGF0X2J1Zl9zeW5jX2Zvcl9jcHUoc3RydWN0IGlzcHN0YXQgKnN0YXQsCiAJCQkJICAgICAgc3RydWN0IGlzcHN0YXRfYnVmZmVyICpidWYpCiB7Ci0JaWYgKElTX0NPSEVSRU5UX0JVRihzdGF0KSkKKwlpZiAoSVNQX1NUQVRfVVNFU19ETUFFTkdJTkUoc3RhdCkpCiAJCXJldHVybjsKIAotCWRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RhdC0+aXNwLT5kZXYsIGJ1Zi0+aW92bS0+c2d0LT5zZ2wsCi0JCQkgICAgYnVmLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOworCWRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RhdC0+aXNwLT5kZXYsIGJ1Zi0+c2d0LnNnbCwKKwkJCSAgICBidWYtPnNndC5uZW50cywgRE1BX0ZST01fREVWSUNFKTsKIH0KIAogc3RhdGljIHZvaWQgaXNwX3N0YXRfYnVmX2NsZWFyKHN0cnVjdCBpc3BzdGF0ICpzdGF0KQpAQCAtMzU0LDI5ICszNDIsMjEgQEAKIAogc3RhdGljIHZvaWQgaXNwX3N0YXRfYnVmc19mcmVlKHN0cnVjdCBpc3BzdGF0ICpzdGF0KQogewotCXN0cnVjdCBpc3BfZGV2aWNlICppc3AgPSBzdGF0LT5pc3A7Ci0JaW50IGk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gSVNQX1NUQVRfVVNFU19ETUFFTkdJTkUoc3RhdCkKKwkJCSAgID8gTlVMTCA6IHN0YXQtPmlzcC0+ZGV2OworCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IFNUQVRfTUFYX0JVRlM7IGkrKykgewogCQlzdHJ1Y3QgaXNwc3RhdF9idWZmZXIgKmJ1ZiA9ICZzdGF0LT5idWZbaV07CiAKLQkJaWYgKCFJU19DT0hFUkVOVF9CVUYoc3RhdCkpIHsKLQkJCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKWJ1Zi0+aW9tbXVfYWRkcikpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYnVmLT5pb3ZtKQotCQkJCWRtYV91bm1hcF9zZyhpc3AtPmRldiwgYnVmLT5pb3ZtLT5zZ3QtPnNnbCwKLQkJCQkJICAgICBidWYtPmlvdm0tPnNndC0+bmVudHMsCi0JCQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+ZGV2LAotCQkJCQkJCWJ1Zi0+aW9tbXVfYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWJ1Zi0+dmlydF9hZGRyKQotCQkJCWNvbnRpbnVlOwotCQkJZG1hX2ZyZWVfY29oZXJlbnQoc3RhdC0+aXNwLT5kZXYsIHN0YXQtPmJ1Zl9hbGxvY19zaXplLAotCQkJCQkgIGJ1Zi0+dmlydF9hZGRyLCBidWYtPmRtYV9hZGRyKTsKLQkJfQotCQlidWYtPmlvbW11X2FkZHIgPSAwOwotCQlidWYtPmlvdm0gPSBOVUxMOworCQlpZiAoIWJ1Zi0+dmlydF9hZGRyKQorCQkJY29udGludWU7CisKKwkJc2dfZnJlZV90YWJsZSgmYnVmLT5zZ3QpOworCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc3RhdC0+YnVmX2FsbG9jX3NpemUsIGJ1Zi0+dmlydF9hZGRyLAorCQkJCSAgYnVmLT5kbWFfYWRkcik7CisKIAkJYnVmLT5kbWFfYWRkciA9IDA7CiAJCWJ1Zi0+dmlydF9hZGRyID0gTlVMTDsKIAkJYnVmLT5lbXB0eSA9IDE7CkBAIC0zODksODMgKzM2OSw1MSBAQAogCXN0YXQtPmFjdGl2ZV9idWYgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IGlzcF9zdGF0X2J1ZnNfYWxsb2NfaW9tbXUoc3RydWN0IGlzcHN0YXQgKnN0YXQsIHVuc2lnbmVkIGludCBzaXplKQorc3RhdGljIGludCBpc3Bfc3RhdF9idWZzX2FsbG9jX29uZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGlzcHN0YXRfYnVmZmVyICpidWYsCisJCQkJICAgdW5zaWduZWQgaW50IHNpemUpCiB7Ci0Jc3RydWN0IGlzcF9kZXZpY2UgKmlzcCA9IHN0YXQtPmlzcDsKLQlpbnQgaTsKKwlpbnQgcmV0OwogCi0Jc3RhdC0+YnVmX2FsbG9jX3NpemUgPSBzaXplOworCWJ1Zi0+dmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJmJ1Zi0+ZG1hX2FkZHIsCisJCQkJCSAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFidWYtPnZpcnRfYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGkgPSAwOyBpIDwgU1RBVF9NQVhfQlVGUzsgaSsrKSB7Ci0JCXN0cnVjdCBpc3BzdGF0X2J1ZmZlciAqYnVmID0gJnN0YXQtPmJ1ZltpXTsKLQkJc3RydWN0IGlvdm1fc3RydWN0ICppb3ZtOwotCi0JCVdBUk5fT04oYnVmLT5kbWFfYWRkcik7Ci0JCWJ1Zi0+aW9tbXVfYWRkciA9IG9tYXBfaW9tbXVfdm1hbGxvYyhpc3AtPmRvbWFpbiwgaXNwLT5kZXYsIDAsCi0JCQkJCQkJc2l6ZSwgSU9NTVVfRkxBRyk7Ci0JCWlmIChJU19FUlIoKHZvaWQgKilidWYtPmlvbW11X2FkZHIpKSB7Ci0JCQlkZXZfZXJyKHN0YXQtPmlzcC0+ZGV2LAotCQkJCSAiJXM6IENhbid0IGFjcXVpcmUgbWVtb3J5IGZvciAiCi0JCQkJICJidWZmZXIgJWRcbiIsIHN0YXQtPnN1YmRldi5uYW1lLCBpKTsKLQkJCWlzcF9zdGF0X2J1ZnNfZnJlZShzdGF0KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJaW92bSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEoaXNwLT5kZXYsIGJ1Zi0+aW9tbXVfYWRkcik7Ci0JCWlmICghaW92bSB8fAotCQkgICAgIWRtYV9tYXBfc2coaXNwLT5kZXYsIGlvdm0tPnNndC0+c2dsLCBpb3ZtLT5zZ3QtPm5lbnRzLAotCQkJCURNQV9GUk9NX0RFVklDRSkpIHsKLQkJCWlzcF9zdGF0X2J1ZnNfZnJlZShzdGF0KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWJ1Zi0+aW92bSA9IGlvdm07Ci0KLQkJYnVmLT52aXJ0X2FkZHIgPSBvbWFwX2RhX3RvX3ZhKHN0YXQtPmlzcC0+ZGV2LAotCQkJCQkgICh1MzIpYnVmLT5pb21tdV9hZGRyKTsKLQkJYnVmLT5lbXB0eSA9IDE7Ci0JCWRldl9kYmcoc3RhdC0+aXNwLT5kZXYsICIlczogYnVmZmVyWyVkXSBhbGxvY2F0ZWQuIgotCQkJImlvbW11X2FkZHI9MHglMDhseCB2aXJ0X2FkZHI9MHglMDhseCIsCi0JCQlzdGF0LT5zdWJkZXYubmFtZSwgaSwgYnVmLT5pb21tdV9hZGRyLAotCQkJKHVuc2lnbmVkIGxvbmcpYnVmLT52aXJ0X2FkZHIpOworCXJldCA9IGRtYV9nZXRfc2d0YWJsZShkZXYsICZidWYtPnNndCwgYnVmLT52aXJ0X2FkZHIsIGJ1Zi0+ZG1hX2FkZHIsCisJCQkgICAgICBzaXplKTsKKwlpZiAocmV0IDwgMCkgeworCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIGJ1Zi0+dmlydF9hZGRyLCBidWYtPmRtYV9hZGRyKTsKKwkJYnVmLT52aXJ0X2FkZHIgPSBOVUxMOworCQlidWYtPmRtYV9hZGRyID0gMDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpc3Bfc3RhdF9idWZzX2FsbG9jX2RtYShzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IGk7Ci0KLQlzdGF0LT5idWZfYWxsb2Nfc2l6ZSA9IHNpemU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU1RBVF9NQVhfQlVGUzsgaSsrKSB7Ci0JCXN0cnVjdCBpc3BzdGF0X2J1ZmZlciAqYnVmID0gJnN0YXQtPmJ1ZltpXTsKLQotCQlXQVJOX09OKGJ1Zi0+aW9tbXVfYWRkcik7Ci0JCWJ1Zi0+dmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHN0YXQtPmlzcC0+ZGV2LCBzaXplLAotCQkJCQkmYnVmLT5kbWFfYWRkciwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCi0JCWlmICghYnVmLT52aXJ0X2FkZHIgfHwgIWJ1Zi0+ZG1hX2FkZHIpIHsKLQkJCWRldl9pbmZvKHN0YXQtPmlzcC0+ZGV2LAotCQkJCSAiJXM6IENhbid0IGFjcXVpcmUgbWVtb3J5IGZvciAiCi0JCQkJICJETUEgYnVmZmVyICVkXG4iLCBzdGF0LT5zdWJkZXYubmFtZSwgaSk7Ci0JCQlpc3Bfc3RhdF9idWZzX2ZyZWUoc3RhdCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlidWYtPmVtcHR5ID0gMTsKLQotCQlkZXZfZGJnKHN0YXQtPmlzcC0+ZGV2LCAiJXM6IGJ1ZmZlclslZF0gYWxsb2NhdGVkLiIKLQkJCSJkbWFfYWRkcj0weCUwOGx4IHZpcnRfYWRkcj0weCUwOGx4XG4iLAotCQkJc3RhdC0+c3ViZGV2Lm5hbWUsIGksICh1bnNpZ25lZCBsb25nKWJ1Zi0+ZG1hX2FkZHIsCi0JCQkodW5zaWduZWQgbG9uZylidWYtPnZpcnRfYWRkcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KKy8qCisgKiBUaGUgZGV2aWNlIHBhc3NlZCB0byB0aGUgRE1BIEFQSSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHN0YXRpc3RpY3MgYmxvY2sgdXNlcworICogSVNQIERNQSwgZXh0ZXJuYWwgRE1BIG9yIFBJTyB0byB0cmFuc2ZlciBkYXRhLgorICoKKyAqIFRoZSBmaXJzdCBjYXNlIChmb3IgdGhlIEFFV0IgYW5kIEFGIGVuZ2luZXMpIHBhc3NlcyB0aGUgSVNQIGRldmljZSwgcmVzdWx0aW5nCisgKiBpbiB0aGUgRE1BIGJ1ZmZlcnMgYmVpbmcgbWFwcGVkIHRocm91Z2ggdGhlIElTUCBJT01NVS4KKyAqCisgKiBUaGUgc2Vjb25kIGNhc2UgKGZvciB0aGUgaGlzdG9ncmFtIGVuZ2luZSkgc2hvdWxkIHBhc3MgdGhlIERNQSBlbmdpbmUgZGV2aWNlLgorICogQXMgdGhhdCBkZXZpY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBPTUFQIERNQSBlbmdpbmUgQVBJIHRoZSBkcml2ZXIKKyAqIHBhc3NlcyBOVUxMIGluc3RlYWQsIHJlc3VsdGluZyBpbiB0aGUgYnVmZmVycyBiZWluZyBtYXBwZWQgZGlyZWN0bHkgYXMKKyAqIHBoeXNpY2FsIHBhZ2VzLgorICoKKyAqIFRoZSB0aGlyZCBjYXNlIChmb3IgdGhlIGhpc3RvZ3JhbSBlbmdpbmUpIGRvZXNuJ3QgcmVxdWlyZSBhbnkgbWFwcGluZy4gVGhlCisgKiBidWZmZXJzIGNvdWxkIGJlIGFsbG9jYXRlZCB3aXRoIGttYWxsb2Mvdm1hbGxvYywgYnV0IHdlIHN0aWxsIHVzZQorICogZG1hX2FsbG9jX2NvaGVyZW50KCkgZm9yIGNvbnNpc3RlbmN5IHB1cnBvc2UuCisgKi8KIHN0YXRpYyBpbnQgaXNwX3N0YXRfYnVmc19hbGxvYyhzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgdTMyIHNpemUpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gSVNQX1NUQVRfVVNFU19ETUFFTkdJTkUoc3RhdCkKKwkJCSAgID8gTlVMTCA6IHN0YXQtPmlzcC0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdC0+aXNwLT5zdGF0X2xvY2ssIGZsYWdzKTsKIApAQCAtNDg5LDEwICs0MzcsMzEgQEAKIAogCWlzcF9zdGF0X2J1ZnNfZnJlZShzdGF0KTsKIAotCWlmIChJU19DT0hFUkVOVF9CVUYoc3RhdCkpCi0JCXJldHVybiBpc3Bfc3RhdF9idWZzX2FsbG9jX2RtYShzdGF0LCBzaXplKTsKLQllbHNlCi0JCXJldHVybiBpc3Bfc3RhdF9idWZzX2FsbG9jX2lvbW11KHN0YXQsIHNpemUpOworCXN0YXQtPmJ1Zl9hbGxvY19zaXplID0gc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBTVEFUX01BWF9CVUZTOyBpKyspIHsKKwkJc3RydWN0IGlzcHN0YXRfYnVmZmVyICpidWYgPSAmc3RhdC0+YnVmW2ldOworCQlpbnQgcmV0OworCisJCXJldCA9IGlzcF9zdGF0X2J1ZnNfYWxsb2Nfb25lKGRldiwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoc3RhdC0+aXNwLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciAldVxuIiwKKwkJCQlzdGF0LT5zdWJkZXYubmFtZSwgaSk7CisJCQlpc3Bfc3RhdF9idWZzX2ZyZWUoc3RhdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYnVmLT5lbXB0eSA9IDE7CisKKwkJZGV2X2RiZyhzdGF0LT5pc3AtPmRldiwKKwkJCSIlczogYnVmZmVyWyV1XSBhbGxvY2F0ZWQuIGRtYT0weCUwOGx4IHZpcnQ9MHglMDhseCIsCisJCQlzdGF0LT5zdWJkZXYubmFtZSwgaSwKKwkJCSh1bnNpZ25lZCBsb25nKWJ1Zi0+ZG1hX2FkZHIsCisJCQkodW5zaWduZWQgbG9uZylidWYtPnZpcnRfYWRkcik7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcF9zdGF0X3F1ZXVlX2V2ZW50KHN0cnVjdCBpc3BzdGF0ICpzdGF0LCBpbnQgZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3BzdGF0LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuaAppbmRleCA5YTA0N2M5Li41OGQ2YWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHN0YXQuaApAQCAtNDYsOCArNDYsNyBAQAogc3RydWN0IGlzcHN0YXQ7CiAKIHN0cnVjdCBpc3BzdGF0X2J1ZmZlciB7Ci0JdW5zaWduZWQgbG9uZyBpb21tdV9hZGRyOwotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqaW92bTsKKwlzdHJ1Y3Qgc2dfdGFibGUgc2d0OwogCXZvaWQgKnZpcnRfYWRkcjsKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwogCXN0cnVjdCB0aW1lc3BlYyB0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uYwppbmRleCA4NWI0MDM2Li5lMzZiYWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3B2aWRlby5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vbWFwLWlvbW11Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KIAogI2luY2x1ZGUgImlzcHZpZGVvLmgiCiAjaW5jbHVkZSAiaXNwLmgiCkBAIC0zMjYsOTAgKzMyNiwzNiBAQAogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSU9NTVUgbWFuYWdlbWVudAotICovCi0KLSNkZWZpbmUgSU9NTVVfRkxBRwkoSU9WTUZfRU5ESUFOX0xJVFRMRSB8IElPVk1GX0VMU1pfOCkKLQotLyoKLSAqIGlzcG1tdV92bWFwIC0gV3JhcHBlciBmb3IgVmlydHVhbCBtZW1vcnkgbWFwcGluZyBvZiBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QKLSAqIEBpc3A6IERldmljZSBwb2ludGVyIHNwZWNpZmljIHRvIHRoZSBPTUFQMyBJU1AuCi0gKiBAc2dsaXN0OiBQb2ludGVyIHRvIHNvdXJjZSBTY2F0dGVyIGdhdGhlciBsaXN0IHRvIGFsbG9jYXRlLgotICogQHNnbGVuOiBOdW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIHNjYXR0ZXItZ2F0dGVyIGxpc3QuCi0gKgotICogUmV0dXJucyBhIHJlc3VsdGluZyBtYXBwZWQgZGV2aWNlIGFkZHJlc3MgYnkgdGhlIElTUCBNTVUsIG9yIC1FTk9NRU0gaWYKLSAqIHdlIHJhbiBvdXQgb2YgbWVtb3J5LgotICovCi1zdGF0aWMgZG1hX2FkZHJfdAotaXNwbW11X3ZtYXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCwgY29uc3Qgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBzZ2xlbikKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQl1MzIgZGE7Ci0KLQlzZ3QgPSBrbWFsbG9jKHNpemVvZigqc2d0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNndCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNndC0+c2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNnbGlzdDsKLQlzZ3QtPm5lbnRzID0gc2dsZW47Ci0Jc2d0LT5vcmlnX25lbnRzID0gc2dsZW47Ci0KLQlkYSA9IG9tYXBfaW9tbXVfdm1hcChpc3AtPmRvbWFpbiwgaXNwLT5kZXYsIDAsIHNndCwgSU9NTVVfRkxBRyk7Ci0JaWYgKElTX0VSUl9WQUxVRShkYSkpCi0JCWtmcmVlKHNndCk7Ci0KLQlyZXR1cm4gZGE7Ci19Ci0KLS8qCi0gKiBpc3BtbXVfdnVubWFwIC0gVW5tYXAgYSBkZXZpY2UgYWRkcmVzcyBmcm9tIHRoZSBJU1AgTU1VCi0gKiBAaXNwOiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDMgSVNQLgotICogQGRhOiBEZXZpY2UgYWRkcmVzcyBnZW5lcmF0ZWQgZnJvbSBhIGlzcG1tdV92bWFwIGNhbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGlzcG1tdV92dW5tYXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCwgZG1hX2FkZHJfdCBkYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQotCXNndCA9IG9tYXBfaW9tbXVfdnVubWFwKGlzcC0+ZG9tYWluLCBpc3AtPmRldiwgKHUzMilkYSk7Ci0Ja2ZyZWUoc2d0KTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFZpZGVvIHF1ZXVlIG9wZXJhdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBpc3BfdmlkZW9fcXVldWVfcHJlcGFyZShzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpuYnVmZmVycywgdW5zaWduZWQgaW50ICpzaXplKQorc3RhdGljIGludCBpc3BfdmlkZW9fcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcXVldWUsCisJCQkJIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJCSB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCisJCQkJIHVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCiB7Ci0Jc3RydWN0IGlzcF92aWRlb19maCAqdmZoID0KLQkJY29udGFpbmVyX29mKHF1ZXVlLCBzdHJ1Y3QgaXNwX3ZpZGVvX2ZoLCBxdWV1ZSk7CisJc3RydWN0IGlzcF92aWRlb19maCAqdmZoID0gdmIyX2dldF9kcnZfcHJpdihxdWV1ZSk7CiAJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2ZmgtPnZpZGVvOwogCi0JKnNpemUgPSB2ZmgtPmZvcm1hdC5mbXQucGl4LnNpemVpbWFnZTsKLQlpZiAoKnNpemUgPT0gMCkKLQkJcmV0dXJuOworCSpudW1fcGxhbmVzID0gMTsKIAotCSpuYnVmZmVycyA9IG1pbigqbmJ1ZmZlcnMsIHZpZGVvLT5jYXB0dXJlX21lbSAvIFBBR0VfQUxJR04oKnNpemUpKTsKKwlzaXplc1swXSA9IHZmaC0+Zm9ybWF0LmZtdC5waXguc2l6ZWltYWdlOworCWlmIChzaXplc1swXSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFsbG9jX2N0eHNbMF0gPSB2aWRlby0+YWxsb2NfY3R4OworCisJKmNvdW50ID0gbWluKCpjb3VudCwgdmlkZW8tPmNhcHR1cmVfbWVtIC8gUEFHRV9BTElHTihzaXplc1swXSkpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlzcF92aWRlb19idWZmZXJfY2xlYW51cChzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQorc3RhdGljIGludCBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2ZoICp2ZmggPSBpc3BfdmlkZW9fcXVldWVfdG9faXNwX3ZpZGVvX2ZoKGJ1Zi0+cXVldWUpOworCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHZiMl9nZXRfZHJ2X3ByaXYoYnVmLT52YjJfcXVldWUpOwogCXN0cnVjdCBpc3BfYnVmZmVyICpidWZmZXIgPSB0b19pc3BfYnVmZmVyKGJ1Zik7CiAJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2ZmgtPnZpZGVvOwotCi0JaWYgKGJ1ZmZlci0+aXNwX2FkZHIpIHsKLQkJaXNwbW11X3Z1bm1hcCh2aWRlby0+aXNwLCBidWZmZXItPmlzcF9hZGRyKTsKLQkJYnVmZmVyLT5pc3BfYWRkciA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IGlzcF92aWRlb19idWZmZXJfcHJlcGFyZShzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IGlzcF92aWRlb19xdWV1ZV90b19pc3BfdmlkZW9fZmgoYnVmLT5xdWV1ZSk7Ci0Jc3RydWN0IGlzcF9idWZmZXIgKmJ1ZmZlciA9IHRvX2lzcF9idWZmZXIoYnVmKTsKLQlzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbyA9IHZmaC0+dmlkZW87Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCWRtYV9hZGRyX3QgYWRkcjsKIAogCS8qIFJlZnVzZSB0byBwcmVwYXJlIHRoZSBidWZmZXIgaXMgdGhlIHZpZGVvIG5vZGUgaGFzIHJlZ2lzdGVyZWQgYW4KIAkgKiBlcnJvci4gV2UgZG9uJ3QgbmVlZCB0byB0YWtlIGFueSBsb2NrIGhlcmUgYXMgdGhlIG9wZXJhdGlvbiBpcwpAQCAtNDIwLDE5ICszNjYsMTYgQEAKIAlpZiAodW5saWtlbHkodmlkZW8tPmVycm9yKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlhZGRyID0gaXNwbW11X3ZtYXAodmlkZW8tPmlzcCwgYnVmLT5zZ2xpc3QsIGJ1Zi0+c2dsZW4pOwotCWlmIChJU19FUlJfVkFMVUUoYWRkcikpCi0JCXJldHVybiAtRUlPOwotCisJYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGJ1ZiwgMCk7CiAJaWYgKCFJU19BTElHTkVEKGFkZHIsIDMyKSkgewotCQlkZXZfZGJnKHZpZGVvLT5pc3AtPmRldiwgIkJ1ZmZlciBhZGRyZXNzIG11c3QgYmUgIgotCQkJImFsaWduZWQgdG8gMzIgYnl0ZXMgYm91bmRhcnkuXG4iKTsKLQkJaXNwbW11X3Z1bm1hcCh2aWRlby0+aXNwLCBidWZmZXItPmlzcF9hZGRyKTsKKwkJZGV2X2RiZyh2aWRlby0+aXNwLT5kZXYsCisJCQkiQnVmZmVyIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIDMyIGJ5dGVzIGJvdW5kYXJ5LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWJ1Zi0+dmJ1Zi5ieXRlc3VzZWQgPSB2ZmgtPmZvcm1hdC5mbXQucGl4LnNpemVpbWFnZTsKLQlidWZmZXItPmlzcF9hZGRyID0gYWRkcjsKKwl2YjJfc2V0X3BsYW5lX3BheWxvYWQoJmJ1ZmZlci0+dmIsIDAsIHZmaC0+Zm9ybWF0LmZtdC5waXguc2l6ZWltYWdlKTsKKwlidWZmZXItPmRtYSA9IGFkZHI7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ1LDkgKzM4OCw5IEBACiAgKiBJZiB0aGUgcGlwZWxpbmUgaXMgYnVzeSwgaXQgd2lsbCBiZSByZXN0YXJ0ZWQgaW4gdGhlIG91dHB1dCBtb2R1bGUgaW50ZXJydXB0CiAgKiBoYW5kbGVyLgogICovCi1zdGF0aWMgdm9pZCBpc3BfdmlkZW9fYnVmZmVyX3F1ZXVlKHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyICpidWYpCitzdGF0aWMgdm9pZCBpc3BfdmlkZW9fYnVmZmVyX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICpidWYpCiB7Ci0Jc3RydWN0IGlzcF92aWRlb19maCAqdmZoID0gaXNwX3ZpZGVvX3F1ZXVlX3RvX2lzcF92aWRlb19maChidWYtPnF1ZXVlKTsKKwlzdHJ1Y3QgaXNwX3ZpZGVvX2ZoICp2ZmggPSB2YjJfZ2V0X2Rydl9wcml2KGJ1Zi0+dmIyX3F1ZXVlKTsKIAlzdHJ1Y3QgaXNwX2J1ZmZlciAqYnVmZmVyID0gdG9faXNwX2J1ZmZlcihidWYpOwogCXN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvID0gdmZoLT52aWRlbzsKIAlzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlID0gdG9faXNwX3BpcGVsaW5lKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKQEAgLTQ1NiwxNCArMzk5LDE4IEBACiAJdW5zaWduZWQgaW50IGVtcHR5OwogCXVuc2lnbmVkIGludCBzdGFydDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOworCiAJaWYgKHVubGlrZWx5KHZpZGVvLT5lcnJvcikpIHsKLQkJYnVmLT5zdGF0ZSA9IElTUF9CVUZfU1RBVEVfRVJST1I7Ci0JCXdha2VfdXAoJmJ1Zi0+d2FpdCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmZmVyLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKIAllbXB0eSA9IGxpc3RfZW1wdHkoJnZpZGVvLT5kbWFxdWV1ZSk7Ci0JbGlzdF9hZGRfdGFpbCgmYnVmZmVyLT5idWZmZXIuaXJxbGlzdCwgJnZpZGVvLT5kbWFxdWV1ZSk7CisJbGlzdF9hZGRfdGFpbCgmYnVmZmVyLT5pcnFsaXN0LCAmdmlkZW8tPmRtYXF1ZXVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CiAKIAlpZiAoZW1wdHkpIHsKIAkJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKQEAgLTQ4NywyMyArNDM0LDIyIEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlzcF92aWRlb19xdWV1ZV9vcGVyYXRpb25zIGlzcF92aWRlb19xdWV1ZV9vcHMgPSB7Ci0JLnF1ZXVlX3ByZXBhcmUgPSAmaXNwX3ZpZGVvX3F1ZXVlX3ByZXBhcmUsCi0JLmJ1ZmZlcl9wcmVwYXJlID0gJmlzcF92aWRlb19idWZmZXJfcHJlcGFyZSwKLQkuYnVmZmVyX3F1ZXVlID0gJmlzcF92aWRlb19idWZmZXJfcXVldWUsCi0JLmJ1ZmZlcl9jbGVhbnVwID0gJmlzcF92aWRlb19idWZmZXJfY2xlYW51cCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmIyX29wcyBpc3BfdmlkZW9fcXVldWVfb3BzID0geworCS5xdWV1ZV9zZXR1cCA9IGlzcF92aWRlb19xdWV1ZV9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgPSBpc3BfdmlkZW9fYnVmZmVyX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSA9IGlzcF92aWRlb19idWZmZXJfcXVldWUsCiB9OwogCiAvKgogICogb21hcDNpc3BfdmlkZW9fYnVmZmVyX25leHQgLSBDb21wbGV0ZSB0aGUgY3VycmVudCBidWZmZXIgYW5kIHJldHVybiB0aGUgbmV4dAogICogQHZpZGVvOiBJU1AgdmlkZW8gb2JqZWN0CiAgKgotICogUmVtb3ZlIHRoZSBjdXJyZW50IHZpZGVvIGJ1ZmZlciBmcm9tIHRoZSBETUEgcXVldWUgYW5kIGZpbGwgaXRzIHRpbWVzdGFtcCwKLSAqIGZpZWxkIGNvdW50IGFuZCBzdGF0ZSBmaWVsZHMgYmVmb3JlIHdha2luZyB1cCBpdHMgY29tcGxldGlvbiBoYW5kbGVyLgorICogUmVtb3ZlIHRoZSBjdXJyZW50IHZpZGVvIGJ1ZmZlciBmcm9tIHRoZSBETUEgcXVldWUgYW5kIGZpbGwgaXRzIHRpbWVzdGFtcCBhbmQKKyAqIGZpZWxkIGNvdW50IGJlZm9yZSBoYW5kaW5nIGl0IGJhY2sgdG8gdmlkZW9idWYyLgogICoKLSAqIEZvciBjYXB0dXJlIHZpZGVvIG5vZGVzIHRoZSBidWZmZXIgc3RhdGUgaXMgc2V0IHRvIElTUF9CVUZfU1RBVEVfRE9ORSBpZiBubwotICogZXJyb3IgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgcGlwZWxpbmUsIG9yIHRvIElTUF9CVUZfU1RBVEVfRVJST1Igb3RoZXJ3aXNlLgotICogRm9yIHZpZGVvIG91dHB1dCBub2RlcyB0aGUgYnVmZmVyIHN0YXRlIGlzIGFsd2F5cyBzZXQgdG8gSVNQX0JVRl9TVEFURV9ET05FLgorICogRm9yIGNhcHR1cmUgdmlkZW8gbm9kZXMgdGhlIGJ1ZmZlciBzdGF0ZSBpcyBzZXQgdG8gVkIyX0JVRl9TVEFURV9ET05FIGlmIG5vCisgKiBlcnJvciBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBwaXBlbGluZSwgb3IgdG8gVkIyX0JVRl9TVEFURV9FUlJPUiBvdGhlcndpc2UuCisgKiBGb3IgdmlkZW8gb3V0cHV0IG5vZGVzIHRoZSBidWZmZXIgc3RhdGUgaXMgYWx3YXlzIHNldCB0byBWQjJfQlVGX1NUQVRFX0RPTkUuCiAgKgogICogVGhlIERNQSBxdWV1ZSBpcyBleHBlY3RlZCB0byBjb250YWluIGF0IGxlYXN0IG9uZSBidWZmZXIuCiAgKgpAQCAtNTEzLDI2ICs0NTksMjUgQEAKIHN0cnVjdCBpc3BfYnVmZmVyICpvbWFwM2lzcF92aWRlb19idWZmZXJfbmV4dChzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbykKIHsKIAlzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlID0gdG9faXNwX3BpcGVsaW5lKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSA9IHZpZGVvLT5xdWV1ZTsKIAllbnVtIGlzcF9waXBlbGluZV9zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX2J1ZmZlciAqYnVmOworCXN0cnVjdCBpc3BfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmlycWxvY2ssIGZsYWdzKTsKIAlpZiAoV0FSTl9PTihsaXN0X2VtcHR5KCZ2aWRlby0+ZG1hcXVldWUpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hcXVldWUsIHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyLAorCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnZpZGVvLT5kbWFxdWV1ZSwgc3RydWN0IGlzcF9idWZmZXIsCiAJCQkgICAgICAgaXJxbGlzdCk7CiAJbGlzdF9kZWwoJmJ1Zi0+aXJxbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogCiAJa3RpbWVfZ2V0X3RzKCZ0cyk7Ci0JYnVmLT52YnVmLnRpbWVzdGFtcC50dl9zZWMgPSB0cy50dl9zZWM7Ci0JYnVmLT52YnVmLnRpbWVzdGFtcC50dl91c2VjID0gdHMudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CisJYnVmLT52Yi52NGwyX2J1Zi50aW1lc3RhbXAudHZfc2VjID0gdHMudHZfc2VjOworCWJ1Zi0+dmIudjRsMl9idWYudGltZXN0YW1wLnR2X3VzZWMgPSB0cy50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKIAogCS8qIERvIGZyYW1lIG51bWJlciBwcm9wYWdhdGlvbiBvbmx5IGlmIHRoaXMgaXMgdGhlIG91dHB1dCB2aWRlbyBub2RlLgogCSAqIEZyYW1lIG51bWJlciBlaXRoZXIgY29tZXMgZnJvbSB0aGUgQ1NJIHJlY2VpdmVycyBvciBpdCBnZXRzCkBAIC01NDEsMjIgKzQ4NiwyNyBAQAogCSAqIGZpcnN0LCBzbyB0aGUgaW5wdXQgbnVtYmVyIG1pZ2h0IGxhZyBiZWhpbmQgYnkgMSBpbiBzb21lIGNhc2VzLgogCSAqLwogCWlmICh2aWRlbyA9PSBwaXBlLT5vdXRwdXQgJiYgIXBpcGUtPmRvX3Byb3BhZ2F0aW9uKQotCQlidWYtPnZidWYuc2VxdWVuY2UgPSBhdG9taWNfaW5jX3JldHVybigmcGlwZS0+ZnJhbWVfbnVtYmVyKTsKKwkJYnVmLT52Yi52NGwyX2J1Zi5zZXF1ZW5jZSA9CisJCQlhdG9taWNfaW5jX3JldHVybigmcGlwZS0+ZnJhbWVfbnVtYmVyKTsKIAllbHNlCi0JCWJ1Zi0+dmJ1Zi5zZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZwaXBlLT5mcmFtZV9udW1iZXIpOworCQlidWYtPnZiLnY0bDJfYnVmLnNlcXVlbmNlID0gYXRvbWljX3JlYWQoJnBpcGUtPmZyYW1lX251bWJlcik7CiAKIAkvKiBSZXBvcnQgcGlwZWxpbmUgZXJyb3JzIHRvIHVzZXJzcGFjZSBvbiB0aGUgY2FwdHVyZSBkZXZpY2Ugc2lkZS4gKi8KLQlpZiAocXVldWUtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICYmIHBpcGUtPmVycm9yKSB7Ci0JCWJ1Zi0+c3RhdGUgPSBJU1BfQlVGX1NUQVRFX0VSUk9SOworCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYgcGlwZS0+ZXJyb3IpIHsKKwkJc3RhdGUgPSBWQjJfQlVGX1NUQVRFX0VSUk9SOwogCQlwaXBlLT5lcnJvciA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCWJ1Zi0+c3RhdGUgPSBJU1BfQlVGX1NUQVRFX0RPTkU7CisJCXN0YXRlID0gVkIyX0JVRl9TVEFURV9ET05FOwogCX0KIAotCXdha2VfdXAoJmJ1Zi0+d2FpdCk7CisJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBzdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmlycWxvY2ssIGZsYWdzKTsKIAogCWlmIChsaXN0X2VtcHR5KCZ2aWRlby0+ZG1hcXVldWUpKSB7Ci0JCWlmIChxdWV1ZS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CisKKwkJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJCXN0YXRlID0gSVNQX1BJUEVMSU5FX1FVRVVFX09VVFBVVAogCQkJICAgICAgfCBJU1BfUElQRUxJTkVfU1RSRUFNOwogCQllbHNlCkBAIC01NzEsMTYgKzUyMSwxOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAocXVldWUtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICYmIHBpcGUtPmlucHV0ICE9IE5VTEwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKKwlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICYmIHBpcGUtPmlucHV0ICE9IE5VTEwpIHsKKwkJc3Bpbl9sb2NrKCZwaXBlLT5sb2NrKTsKIAkJcGlwZS0+c3RhdGUgJj0gfklTUF9QSVBFTElORV9TVFJFQU07Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2soJnBpcGUtPmxvY2spOwogCX0KIAotCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnZpZGVvLT5kbWFxdWV1ZSwgc3RydWN0IGlzcF92aWRlb19idWZmZXIsCisJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmdmlkZW8tPmRtYXF1ZXVlLCBzdHJ1Y3QgaXNwX2J1ZmZlciwKIAkJCSAgICAgICBpcnFsaXN0KTsKLQlidWYtPnN0YXRlID0gSVNQX0JVRl9TVEFURV9BQ1RJVkU7Ci0JcmV0dXJuIHRvX2lzcF9idWZmZXIoYnVmKTsKKwlidWYtPnZiLnN0YXRlID0gVkIyX0JVRl9TVEFURV9BQ1RJVkU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ1ZjsKIH0KIAogLyoKQEAgLTU5MiwyNSArNTQ1LDIyIEBACiAgKi8KIHZvaWQgb21hcDNpc3BfdmlkZW9fY2FuY2VsX3N0cmVhbShzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbykKIHsKLQlzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZSA9IHZpZGVvLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5pcnFsb2NrLCBmbGFncyk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnZpZGVvLT5kbWFxdWV1ZSkpIHsKLQkJc3RydWN0IGlzcF92aWRlb19idWZmZXIgKmJ1ZjsKKwkJc3RydWN0IGlzcF9idWZmZXIgKmJ1ZjsKIAogCQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hcXVldWUsCi0JCQkJICAgICAgIHN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyLCBpcnFsaXN0KTsKKwkJCQkgICAgICAgc3RydWN0IGlzcF9idWZmZXIsIGlycWxpc3QpOwogCQlsaXN0X2RlbCgmYnVmLT5pcnFsaXN0KTsKLQotCQlidWYtPnN0YXRlID0gSVNQX0JVRl9TVEFURV9FUlJPUjsKLQkJd2FrZV91cCgmYnVmLT53YWl0KTsKKwkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKIAl9CiAKIAl2aWRlby0+ZXJyb3IgPSB0cnVlOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtNjI3LDEyICs1NzcsMTUgQEAKIHsKIAlzdHJ1Y3QgaXNwX2J1ZmZlciAqYnVmID0gTlVMTDsKIAotCWlmIChjb250aW51b3VzICYmIHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJb21hcDNpc3BfdmlkZW9fcXVldWVfZGlzY2FyZF9kb25lKHZpZGVvLT5xdWV1ZSk7CisJaWYgKGNvbnRpbnVvdXMgJiYgdmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwkJdmIyX2Rpc2NhcmRfZG9uZSh2aWRlby0+cXVldWUpOworCQltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnZpZGVvLT5kbWFxdWV1ZSkpIHsKIAkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmdmlkZW8tPmRtYXF1ZXVlLAotCQkJCSAgICAgICBzdHJ1Y3QgaXNwX2J1ZmZlciwgYnVmZmVyLmlycWxpc3QpOworCQkJCSAgICAgICBzdHJ1Y3QgaXNwX2J1ZmZlciwgaXJxbGlzdCk7CiAJCXZpZGVvLT5vcHMtPnF1ZXVlKHZpZGVvLCBidWYpOwogCQl2aWRlby0+ZG1hcXVldWVfZmxhZ3MgfD0gSVNQX1ZJREVPX0RNQVFVRVVFX1FVRVVFRDsKIAl9IGVsc2UgewpAQCAtODQwLDMzICs3OTMsNTYgQEAKIGlzcF92aWRlb19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJiKQogewogCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHRvX2lzcF92aWRlb19maChmaCk7CisJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQ7CiAKLQlyZXR1cm4gb21hcDNpc3BfdmlkZW9fcXVldWVfcmVxYnVmcygmdmZoLT5xdWV1ZSwgcmIpOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwlyZXQgPSB2YjJfcmVxYnVmcygmdmZoLT5xdWV1ZSwgcmIpOworCW11dGV4X3VubG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogaXNwX3ZpZGVvX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHRvX2lzcF92aWRlb19maChmaCk7CisJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQ7CiAKLQlyZXR1cm4gb21hcDNpc3BfdmlkZW9fcXVldWVfcXVlcnlidWYoJnZmaC0+cXVldWUsIGIpOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwlyZXQgPSB2YjJfcXVlcnlidWYoJnZmaC0+cXVldWUsIGIpOworCW11dGV4X3VubG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogaXNwX3ZpZGVvX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7CiAJc3RydWN0IGlzcF92aWRlb19maCAqdmZoID0gdG9faXNwX3ZpZGVvX2ZoKGZoKTsKKwlzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJaW50IHJldDsKIAotCXJldHVybiBvbWFwM2lzcF92aWRlb19xdWV1ZV9xYnVmKCZ2ZmgtPnF1ZXVlLCBiKTsKKwltdXRleF9sb2NrKCZ2aWRlby0+cXVldWVfbG9jayk7CisJcmV0ID0gdmIyX3FidWYoJnZmaC0+cXVldWUsIGIpOworCW11dGV4X3VubG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogaXNwX3ZpZGVvX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHRvX2lzcF92aWRlb19maChmaCk7CisJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQ7CiAKLQlyZXR1cm4gb21hcDNpc3BfdmlkZW9fcXVldWVfZHFidWYoJnZmaC0+cXVldWUsIGIsCi0JCQkJCSAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwlyZXQgPSB2YjJfZHFidWYoJnZmaC0+cXVldWUsIGIsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaXNwX3ZpZGVvX2NoZWNrX2V4dGVybmFsX3N1YmRldnMoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8sCkBAIC0xMDA2LDExICs5ODIsNiBAQAogCiAJbXV0ZXhfbG9jaygmdmlkZW8tPnN0cmVhbV9sb2NrKTsKIAotCWlmICh2aWRlby0+c3RyZWFtaW5nKSB7Ci0JCW11dGV4X3VubG9jaygmdmlkZW8tPnN0cmVhbV9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KIAkvKiBTdGFydCBzdHJlYW1pbmcgb24gdGhlIHBpcGVsaW5lLiBObyBsaW5rIHRvdWNoaW5nIGFuIGVudGl0eSBpbiB0aGUKIAkgKiBwaXBlbGluZSBjYW4gYmUgYWN0aXZhdGVkIG9yIGRlYWN0aXZhdGVkIG9uY2Ugc3RyZWFtaW5nIGlzIHN0YXJ0ZWQuCiAJICovCkBAIC0xMDY5LDcgKzEwNDAsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZ2aWRlby0+ZG1hcXVldWUpOwogCWF0b21pY19zZXQoJnBpcGUtPmZyYW1lX251bWJlciwgLTEpOwogCi0JcmV0ID0gb21hcDNpc3BfdmlkZW9fcXVldWVfc3RyZWFtb24oJnZmaC0+cXVldWUpOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwlyZXQgPSB2YjJfc3RyZWFtb24oJnZmaC0+cXVldWUsIHR5cGUpOworCW11dGV4X3VubG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jaGVja19mb3JtYXQ7CiAKQEAgLTEwODIsMTkgKzEwNTUsMTkgQEAKIAkJCQkJICAgICAgSVNQX1BJUEVMSU5FX1NUUkVBTV9DT05USU5VT1VTKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycl9zZXRfc3RyZWFtOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnF1ZXVlLT5pcnFsb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogCQlpZiAobGlzdF9lbXB0eSgmdmlkZW8tPmRtYXF1ZXVlKSkKIAkJCXZpZGVvLT5kbWFxdWV1ZV9mbGFncyB8PSBJU1BfVklERU9fRE1BUVVFVUVfVU5ERVJSVU47Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5xdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+aXJxbG9jaywgZmxhZ3MpOwogCX0KIAotCXZpZGVvLT5zdHJlYW1pbmcgPSAxOwotCiAJbXV0ZXhfdW5sb2NrKCZ2aWRlby0+c3RyZWFtX2xvY2spOwogCXJldHVybiAwOwogCiBlcnJfc2V0X3N0cmVhbToKLQlvbWFwM2lzcF92aWRlb19xdWV1ZV9zdHJlYW1vZmYoJnZmaC0+cXVldWUpOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwl2YjJfc3RyZWFtb2ZmKCZ2ZmgtPnF1ZXVlLCB0eXBlKTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKIGVycl9jaGVja19mb3JtYXQ6CiAJbWVkaWFfZW50aXR5X3BpcGVsaW5lX3N0b3AoJnZpZGVvLT52aWRlby5lbnRpdHkpOwogZXJyX3BpcGVsaW5lX3N0YXJ0OgpAQCAtMTEzMCw5ICsxMTAzLDkgQEAKIAltdXRleF9sb2NrKCZ2aWRlby0+c3RyZWFtX2xvY2spOwogCiAJLyogTWFrZSBzdXJlIHdlJ3JlIG5vdCBzdHJlYW1pbmcgeWV0LiAqLwotCW11dGV4X2xvY2soJnZmaC0+cXVldWUubG9jayk7Ci0Jc3RyZWFtaW5nID0gdmZoLT5xdWV1ZS5zdHJlYW1pbmc7Ci0JbXV0ZXhfdW5sb2NrKCZ2ZmgtPnF1ZXVlLmxvY2spOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwlzdHJlYW1pbmcgPSB2YjJfaXNfc3RyZWFtaW5nKCZ2ZmgtPnF1ZXVlKTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKIAogCWlmICghc3RyZWFtaW5nKQogCQlnb3RvIGRvbmU7CkBAIC0xMTUxLDkgKzExMjQsMTIgQEAKIAogCS8qIFN0b3AgdGhlIHN0cmVhbS4gKi8KIAlvbWFwM2lzcF9waXBlbGluZV9zZXRfc3RyZWFtKHBpcGUsIElTUF9QSVBFTElORV9TVFJFQU1fU1RPUFBFRCk7Ci0Jb21hcDNpc3BfdmlkZW9fcXVldWVfc3RyZWFtb2ZmKCZ2ZmgtPnF1ZXVlKTsKKwlvbWFwM2lzcF92aWRlb19jYW5jZWxfc3RyZWFtKHZpZGVvKTsKKworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwl2YjJfc3RyZWFtb2ZmKCZ2ZmgtPnF1ZXVlLCB0eXBlKTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKIAl2aWRlby0+cXVldWUgPSBOVUxMOwotCXZpZGVvLT5zdHJlYW1pbmcgPSAwOwogCXZpZGVvLT5lcnJvciA9IGZhbHNlOwogCiAJaWYgKHZpZGVvLT5pc3AtPnBkYXRhLT5zZXRfY29uc3RyYWludHMpCkBAIC0xMjIzLDYgKzExOTksNyBAQAogewogCXN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgaXNwX3ZpZGVvX2ZoICpoYW5kbGU7CisJc3RydWN0IHZiMl9xdWV1ZSAqcXVldWU7CiAJaW50IHJldCA9IDA7CiAKIAloYW5kbGUgPSBremFsbG9jKHNpemVvZigqaGFuZGxlKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjQ0LDkgKzEyMjEsMjAgQEAKIAkJZ290byBkb25lOwogCX0KIAotCW9tYXAzaXNwX3ZpZGVvX3F1ZXVlX2luaXQoJmhhbmRsZS0+cXVldWUsIHZpZGVvLT50eXBlLAotCQkJCSAgJmlzcF92aWRlb19xdWV1ZV9vcHMsIHZpZGVvLT5pc3AtPmRldiwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaXNwX2J1ZmZlcikpOworCXF1ZXVlID0gJmhhbmRsZS0+cXVldWU7CisJcXVldWUtPnR5cGUgPSB2aWRlby0+dHlwZTsKKwlxdWV1ZS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCXF1ZXVlLT5kcnZfcHJpdiA9IGhhbmRsZTsKKwlxdWV1ZS0+b3BzID0gJmlzcF92aWRlb19xdWV1ZV9vcHM7CisJcXVldWUtPm1lbV9vcHMgPSAmdmIyX2RtYV9jb250aWdfbWVtb3BzOworCXF1ZXVlLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IGlzcF9idWZmZXIpOworCXF1ZXVlLT50aW1lc3RhbXBfZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUM7CisKKwlyZXQgPSB2YjJfcXVldWVfaW5pdCgmaGFuZGxlLT5xdWV1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJb21hcDNpc3BfcHV0KHZpZGVvLT5pc3ApOworCQlnb3RvIGRvbmU7CisJfQogCiAJbWVtc2V0KCZoYW5kbGUtPmZvcm1hdCwgMCwgc2l6ZW9mKGhhbmRsZS0+Zm9ybWF0KSk7CiAJaGFuZGxlLT5mb3JtYXQudHlwZSA9IHZpZGVvLT50eXBlOwpAQCAtMTI3Myw5ICsxMjYxLDkgQEAKIAkvKiBEaXNhYmxlIHN0cmVhbWluZyBhbmQgZnJlZSB0aGUgYnVmZmVycyBxdWV1ZSByZXNvdXJjZXMuICovCiAJaXNwX3ZpZGVvX3N0cmVhbW9mZihmaWxlLCB2ZmgsIHZpZGVvLT50eXBlKTsKIAotCW11dGV4X2xvY2soJmhhbmRsZS0+cXVldWUubG9jayk7Ci0Jb21hcDNpc3BfdmlkZW9fcXVldWVfY2xlYW51cCgmaGFuZGxlLT5xdWV1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZoYW5kbGUtPnF1ZXVlLmxvY2spOworCW11dGV4X2xvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKwl2YjJfcXVldWVfcmVsZWFzZSgmaGFuZGxlLT5xdWV1ZSk7CisJbXV0ZXhfdW5sb2NrKCZ2aWRlby0+cXVldWVfbG9jayk7CiAKIAlvbWFwM2lzcF9waXBlbGluZV9wbV91c2UoJnZpZGVvLT52aWRlby5lbnRpdHksIDApOwogCkBAIC0xMjkyLDE2ICsxMjgwLDI3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGlzcF92aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHRvX2lzcF92aWRlb19maChmaWxlLT5wcml2YXRlX2RhdGEpOwotCXN0cnVjdCBpc3BfdmlkZW9fcXVldWUgKnF1ZXVlID0gJnZmaC0+cXVldWU7CisJc3RydWN0IGlzcF92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQ7CiAKLQlyZXR1cm4gb21hcDNpc3BfdmlkZW9fcXVldWVfcG9sbChxdWV1ZSwgZmlsZSwgd2FpdCk7CisJbXV0ZXhfbG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCXJldCA9IHZiMl9wb2xsKCZ2ZmgtPnF1ZXVlLCBmaWxlLCB3YWl0KTsKKwltdXRleF91bmxvY2soJnZpZGVvLT5xdWV1ZV9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaXNwX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBpc3BfdmlkZW9fZmggKnZmaCA9IHRvX2lzcF92aWRlb19maChmaWxlLT5wcml2YXRlX2RhdGEpOworCXN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIG9tYXAzaXNwX3ZpZGVvX3F1ZXVlX21tYXAoJnZmaC0+cXVldWUsIHZtYSk7CisJbXV0ZXhfbG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCXJldCA9IHZiMl9tbWFwKCZ2ZmgtPnF1ZXVlLCB2bWEpOworCW11dGV4X3VubG9jaygmdmlkZW8tPnF1ZXVlX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBpc3BfdmlkZW9fZm9wcyA9IHsKQEAgLTEzNDIsMTUgKzEzNDEsMjMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJdmlkZW8tPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KHZpZGVvLT5pc3AtPmRldik7CisJaWYgKElTX0VSUih2aWRlby0+YWxsb2NfY3R4KSkKKwkJcmV0dXJuIFBUUl9FUlIodmlkZW8tPmFsbG9jX2N0eCk7CisKIAlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmdmlkZW8tPnZpZGVvLmVudGl0eSwgMSwgJnZpZGVvLT5wYWQsIDApOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KHZpZGVvLT5hbGxvY19jdHgpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCW11dGV4X2luaXQoJnZpZGVvLT5tdXRleCk7CiAJYXRvbWljX3NldCgmdmlkZW8tPmFjdGl2ZSwgMCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmdmlkZW8tPnBpcGUubG9jayk7CiAJbXV0ZXhfaW5pdCgmdmlkZW8tPnN0cmVhbV9sb2NrKTsKKwltdXRleF9pbml0KCZ2aWRlby0+cXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnZpZGVvLT5pcnFsb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHZpZGVvIGRldmljZS4gKi8KIAlpZiAodmlkZW8tPm9wcyA9PSBOVUxMKQpAQCAtMTM3MSw3ICsxMzc4LDkgQEAKIAogdm9pZCBvbWFwM2lzcF92aWRlb19jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKQogeworCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KHZpZGVvLT5hbGxvY19jdHgpOwogCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwltdXRleF9kZXN0cm95KCZ2aWRlby0+cXVldWVfbG9jayk7CiAJbXV0ZXhfZGVzdHJveSgmdmlkZW8tPnN0cmVhbV9sb2NrKTsKIAltdXRleF9kZXN0cm95KCZ2aWRlby0+bXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3B2aWRlby5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9vbWFwM2lzcC9pc3B2aWRlby5oCmluZGV4IDRlMTk0MDcuLjdkMmU4MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vb21hcDNpc3AvaXNwdmlkZW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL29tYXAzaXNwL2lzcHZpZGVvLmgKQEAgLTMwLDggKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1lbnRpdHkuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KLQotI2luY2x1ZGUgImlzcHF1ZXVlLmgiCisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KIAogI2RlZmluZSBJU1BfVklERU9fRFJJVkVSX05BTUUJCSJpc3B2aWRlbyIKICNkZWZpbmUgSVNQX1ZJREVPX0RSSVZFUl9WRVJTSU9OCSIwLjAuMiIKQEAgLTEyNCwxNyArMTIzLDE5IEBACiAJCQkgICAgICAgSVNQX1BJUEVMSU5FX0lETEVfT1VUUFVUKTsKIH0KIAotLyoKLSAqIHN0cnVjdCBpc3BfYnVmZmVyIC0gSVNQIGJ1ZmZlcgotICogQGJ1ZmZlcjogSVNQIHZpZGVvIGJ1ZmZlcgotICogQGlzcF9hZGRyOiBNTVUgbWFwcGVkIGFkZHJlc3MgKGEuay5hLiBkZXZpY2UgYWRkcmVzcykgb2YgdGhlIGJ1ZmZlci4KKy8qKgorICogc3RydWN0IGlzcF9idWZmZXIgLSBJU1AgdmlkZW8gYnVmZmVyCisgKiBAdmI6IHZpZGVvYnVmMiBidWZmZXIKKyAqIEBpcnFsaXN0OiBMaXN0IGhlYWQgZm9yIGluc2VydGlvbiBpbnRvIElSUSBxdWV1ZQorICogQGRtYTogRE1BIGFkZHJlc3MKICAqLwogc3RydWN0IGlzcF9idWZmZXIgewotCXN0cnVjdCBpc3BfdmlkZW9fYnVmZmVyIGJ1ZmZlcjsKLQlkbWFfYWRkcl90IGlzcF9hZGRyOworCXN0cnVjdCB2YjJfYnVmZmVyIHZiOworCXN0cnVjdCBsaXN0X2hlYWQgaXJxbGlzdDsKKwlkbWFfYWRkcl90IGRtYTsKIH07CiAKLSNkZWZpbmUgdG9faXNwX2J1ZmZlcihidWYpCWNvbnRhaW5lcl9vZihidWYsIHN0cnVjdCBpc3BfYnVmZmVyLCBidWZmZXIpCisjZGVmaW5lIHRvX2lzcF9idWZmZXIoYnVmKQljb250YWluZXJfb2YoYnVmLCBzdHJ1Y3QgaXNwX2J1ZmZlciwgdmIpCiAKIGVudW0gaXNwX3ZpZGVvX2RtYXF1ZXVlX2ZsYWdzIHsKIAkvKiBTZXQgaWYgRE1BIHF1ZXVlIGJlY29tZXMgZW1wdHkgd2hlbiBJU1BfUElQRUxJTkVfU1RSRUFNX0NPTlRJTlVPVVMgKi8KQEAgLTE3MiwxNiArMTczLDE2IEBACiAJdW5zaWduZWQgaW50IGJwbF92YWx1ZTsJCS8qIGJ5dGVzIHBlciBsaW5lIHZhbHVlICovCiAJdW5zaWduZWQgaW50IGJwbF9wYWRkaW5nOwkvKiBwYWRkaW5nIGF0IGVuZCBvZiBsaW5lICovCiAKLQkvKiBFbnRpdHkgdmlkZW8gbm9kZSBzdHJlYW1pbmcgKi8KLQl1bnNpZ25lZCBpbnQgc3RyZWFtaW5nOjE7Ci0KIAkvKiBQaXBlbGluZSBzdGF0ZSAqLwogCXN0cnVjdCBpc3BfcGlwZWxpbmUgcGlwZTsKIAlzdHJ1Y3QgbXV0ZXggc3RyZWFtX2xvY2s7CS8qIHBpcGVsaW5lIGFuZCBzdHJlYW0gc3RhdGVzICovCiAJYm9vbCBlcnJvcjsKIAogCS8qIFZpZGVvIGJ1ZmZlcnMgcXVldWUgKi8KLQlzdHJ1Y3QgaXNwX3ZpZGVvX3F1ZXVlICpxdWV1ZTsKKwl2b2lkICphbGxvY19jdHg7CisJc3RydWN0IHZiMl9xdWV1ZSAqcXVldWU7CisJc3RydWN0IG11dGV4IHF1ZXVlX2xvY2s7CS8qIHByb3RlY3RzIHRoZSBxdWV1ZSAqLworCXNwaW5sb2NrX3QgaXJxbG9jazsJCS8qIHByb3RlY3RzIGRtYXF1ZXVlICovCiAJc3RydWN0IGxpc3RfaGVhZCBkbWFxdWV1ZTsKIAllbnVtIGlzcF92aWRlb19kbWFxdWV1ZV9mbGFncyBkbWFxdWV1ZV9mbGFnczsKIApAQCAtMTkzLDcgKzE5NCw3IEBACiBzdHJ1Y3QgaXNwX3ZpZGVvX2ZoIHsKIAlzdHJ1Y3QgdjRsMl9maCB2Zmg7CiAJc3RydWN0IGlzcF92aWRlbyAqdmlkZW87Ci0Jc3RydWN0IGlzcF92aWRlb19xdWV1ZSBxdWV1ZTsKKwlzdHJ1Y3QgdmIyX3F1ZXVlIHF1ZXVlOwogCXN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CiAJc3RydWN0IHY0bDJfZnJhY3QgdGltZXBlcmZyYW1lOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItY29yZS5jCmluZGV4IDM0OWU2NTkuLjdjNDQ4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWNvcmUuYwpAQCAtMTIwMCw2ICsxMjAwLDMwIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfYnVmZmVyX2RvbmUpOwogCiAvKioKKyAqIHZiMl9kaXNjYXJkX2RvbmUoKSAtIGRpc2NhcmQgYWxsIGJ1ZmZlcnMgbWFya2VkIGFzIERPTkUKKyAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggc3VzcGVuZC9yZXN1bWUgb3BlcmF0aW9ucy4gSXQKKyAqIGRpc2NhcmRzIGFsbCAnZG9uZScgYnVmZmVycyBhcyB0aGV5IHdvdWxkIGJlIHRvbyBvbGQgdG8gYmUgcmVxdWVzdGVkIGFmdGVyCisgKiByZXN1bWUuCisgKgorICogRHJpdmVycyBtdXN0IHN0b3AgdGhlIGhhcmR3YXJlIGFuZCBzeW5jaHJvbml6ZSB3aXRoIGludGVycnVwdCBoYW5kbGVycyBhbmQvb3IKKyAqIGRlbGF5ZWQgd29ya3MgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgbm8gYnVmZmVyIHdpbGwgYmUKKyAqIHRvdWNoZWQgYnkgdGhlIGRyaXZlciBhbmQvb3IgaGFyZHdhcmUuCisgKi8KK3ZvaWQgdmIyX2Rpc2NhcmRfZG9uZShzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmRvbmVfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodmIsICZxLT5kb25lX2xpc3QsIGRvbmVfZW50cnkpCisJCXZiLT5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfRVJST1I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+ZG9uZV9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2YjJfZGlzY2FyZF9kb25lKTsKKworLyoqCiAgKiBfX2ZpbGxfdmIyX2J1ZmZlcigpIC0gZmlsbCBhIHZiMl9idWZmZXIgd2l0aCBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiBhCiAgKiB2NGwyX2J1ZmZlciBieSB0aGUgdXNlcnNwYWNlLiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IHZlcmlmaWVkIHRoYXQgc3RydWN0CiAgKiB2NGwyX2J1ZmZlciBoYXMgYSB2YWxpZCBudW1iZXIgb2YgcGxhbmVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jCmluZGV4IDk2MTYyYjYuLjNiYzk2OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtcG93ZXIuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLXBvd2VyLmMKQEAgLTI5LDEzICsyOSwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogc3RhdGljIHU4IHR3bDQwMzBfc3RhcnRfc2NyaXB0X2FkZHJlc3MgPSAweDJiOwogCi0jZGVmaW5lIFBXUl9QMV9TV19FVkVOVFMJMHgxMAotI2RlZmluZSBQV1JfREVWT0ZGCQkoMSA8PCAwKQorLyogUmVnaXN0ZXIgYml0cyBmb3IgUDEsIFAyIGFuZCBQM19TV19FVkVOVFMgKi8KKyNkZWZpbmUgUFdSX1NUT1BPTl9QUldPTglCSVQoNikKKyNkZWZpbmUgUFdSX1NUT1BPTl9TWVNFTglCSVQoNSkKKyNkZWZpbmUgUFdSX0VOQUJMRV9XQVJNUkVTRVQJQklUKDQpCisjZGVmaW5lIFBXUl9MVkxfV0FLRVVQCQlCSVQoMykKKyNkZWZpbmUgUFdSX0RFVkFDVAkJQklUKDIpCisjZGVmaW5lIFBXUl9ERVZTTFAJCUJJVCgxKQorI2RlZmluZSBQV1JfREVWT0ZGCQlCSVQoMCkKKwogI2RlZmluZSBTRVFfT0ZGU1lOQwkJKDEgPDwgMCkKIAogI2RlZmluZSBQSFlfVE9fT0ZGX1BNX01BU1RFUihwKQkJKHAgLSAweDM2KQpAQCAtNTIsMTAgKzYwLDYgQEAKICNkZWZpbmUgUl9DRkdfUDJfVFJBTlNJVElPTglQSFlfVE9fT0ZGX1BNX01BU1RFUigweDM3KQogI2RlZmluZSBSX0NGR19QM19UUkFOU0lUSU9OCVBIWV9UT19PRkZfUE1fTUFTVEVSKDB4MzgpCiAKLSNkZWZpbmUgTFZMX1dBS0VVUAkweDA4Ci0KLSNkZWZpbmUgRU5BQkxFX1dBUk1SRVNFVCAoMTw8NCkKLQogI2RlZmluZSBFTkRfT0ZfU0NSSVBUCQkweDNmCiAKICNkZWZpbmUgUl9TRVFfQUREX0EyUwkJUEhZX1RPX09GRl9QTV9NQVNURVIoMHg1NSkKQEAgLTEyNSw2ICsxMjksNTMgQEAKIAlbUkVTX01BSU5fUkVGXQk9IDB4OTQsCiB9OwogCisvKgorICogVXNhYmxlIHZhbHVlcyBmb3IgLnJlbWFwX3NsZWVwIGFuZCAucmVtYXBfb2ZmCisgKiBCYXNlZCBvbiB0YWJsZSAiNS4zLjMgUmVzb3VyY2UgT3BlcmF0aW5nIG1vZGVzIgorICovCitlbnVtIHsKKwlUV0xfUkVNQVBfT0ZGID0gMCwKKwlUV0xfUkVNQVBfU0xFRVAgPSA4LAorCVRXTF9SRU1BUF9BQ1RJVkUgPSA5LAorfTsKKworLyoKKyAqIE1hY3JvcyB0byBjb25maWd1cmUgdGhlIFBNIHJlZ2lzdGVyIHN0YXRlcyBmb3IgdmFyaW91cyByZXNvdXJjZXMuCisgKiBOb3RlIHRoYXQgd2UgY2FuIG1ha2UgTVNHX1NJTkdVTEFSIGV0YyBwcml2YXRlIHRvIHRoaXMgZHJpdmVyIG9uY2UKKyAqIG9tYXAzIGhhcyBiZWVuIG1hZGUgRFQgb25seS4KKyAqLworI2RlZmluZSBUV0xfREZMVF9ERUxBWQkJMgkvKiB0eXBpY2FsbHkgMiAzMiBLaUh6IGN5Y2xlcyAqLworI2RlZmluZSBUV0xfREVWX0dSUF9QMTIzCShERVZfR1JQX1AxIHwgREVWX0dSUF9QMiB8IERFVl9HUlBfUDMpCisjZGVmaW5lIFRXTF9SRVNPVVJDRV9TRVQocmVzLCBzdGF0ZSkJCQkJCVwKKwl7IE1TR19TSU5HVUxBUihERVZfR1JQX05VTEwsIChyZXMpLCAoc3RhdGUpKSwgVFdMX0RGTFRfREVMQVkgfQorI2RlZmluZSBUV0xfUkVTT1VSQ0VfT04ocmVzKQlUV0xfUkVTT1VSQ0VfU0VUKHJlcywgUkVTX1NUQVRFX0FDVElWRSkKKyNkZWZpbmUgVFdMX1JFU09VUkNFX09GRihyZXMpCVRXTF9SRVNPVVJDRV9TRVQocmVzLCBSRVNfU1RBVEVfT0ZGKQorI2RlZmluZSBUV0xfUkVTT1VSQ0VfUkVTRVQocmVzKQlUV0xfUkVTT1VSQ0VfU0VUKHJlcywgUkVTX1NUQVRFX1dSU1QpCisvKgorICogSXQgc2VlbXMgdGhhdCB0eXBlMSBhbmQgdHlwZTIgaXMganVzdCB0aGUgcmVzb3VyY2UgaW5pdCBvcmRlcgorICogbnVtYmVyIGZvciB0aGUgdHlwZTEgYW5kIHR5cGUyIGdyb3VwLgorICovCisjZGVmaW5lIFRXTF9SRVNPVVJDRV9TRVRfQUNUSVZFKHJlcywgc3RhdGUpCQkJICAgICAgIAlcCisJeyBNU0dfU0lOR1VMQVIoREVWX0dSUF9OVUxMLCAocmVzKSwgUkVTX1NUQVRFX0FDVElWRSksIChzdGF0ZSkgfQorI2RlZmluZSBUV0xfUkVTT1VSQ0VfR1JPVVBfUkVTRVQoZ3JvdXAsIHR5cGUxLCB0eXBlMikJCQlcCisJeyBNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgKGdyb3VwKSwgKHR5cGUxKSwgKHR5cGUyKSwJXAorCQlSRVNfU1RBVEVfV1JTVCksIFRXTF9ERkxUX0RFTEFZIH0KKyNkZWZpbmUgVFdMX1JFU09VUkNFX0dST1VQX1NMRUVQKGdyb3VwLCB0eXBlLCB0eXBlMikJCQlcCisJeyBNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgKGdyb3VwKSwgKHR5cGUpLCAodHlwZTIpLAkJXAorCQlSRVNfU1RBVEVfU0xFRVApLCBUV0xfREZMVF9ERUxBWSB9CisjZGVmaW5lIFRXTF9SRVNPVVJDRV9HUk9VUF9BQ1RJVkUoZ3JvdXAsIHR5cGUsIHR5cGUyKQkJCVwKKwl7IE1TR19CUk9BRENBU1QoREVWX0dSUF9OVUxMLCAoZ3JvdXApLCAodHlwZSksICh0eXBlMiksCQlcCisJCVJFU19TVEFURV9BQ1RJVkUpLCBUV0xfREZMVF9ERUxBWSB9CisjZGVmaW5lIFRXTF9SRU1BUF9TTEVFUChyZXMsIGRldmdycCwgdHlwLCB0eXAyKQkJCQlcCisJeyAucmVzb3VyY2UgPSAocmVzKSwgLmRldmdyb3VwID0gKGRldmdycCksCQkJXAorCSAgLnR5cGUgPSAodHlwKSwgLnR5cGUyID0gKHR5cDIpLAkJCQlcCisJICAucmVtYXBfb2ZmID0gVFdMX1JFTUFQX09GRiwJCQkJCVwKKwkgIC5yZW1hcF9zbGVlcCA9IFRXTF9SRU1BUF9TTEVFUCwgfQorI2RlZmluZSBUV0xfUkVNQVBfT0ZGKHJlcywgZGV2Z3JwLCB0eXAsIHR5cDIpCQkJCVwKKwl7IC5yZXNvdXJjZSA9IChyZXMpLCAuZGV2Z3JvdXAgPSAoZGV2Z3JwKSwJCQlcCisJICAudHlwZSA9ICh0eXApLCAudHlwZTIgPSAodHlwMiksCQkJCVwKKwkgIC5yZW1hcF9vZmYgPSBUV0xfUkVNQVBfT0ZGLCAucmVtYXBfc2xlZXAgPSBUV0xfUkVNQVBfT0ZGLCB9CisKIHN0YXRpYyBpbnQgdHdsNDAzMF93cml0ZV9zY3JpcHRfYnl0ZSh1OCBhZGRyZXNzLCB1OCBieXRlKQogewogCWludCBlcnI7CkBAIC0xOTYsNyArMjQ3LDcgQEAKIAllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLCBSX1AzX1NXX0VWRU5UUyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZGF0YSB8PSBMVkxfV0FLRVVQOworCWRhdGEgfD0gUFdSX0xWTF9XQUtFVVA7CiAJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgZGF0YSwgUl9QM19TV19FVkVOVFMpOwogb3V0OgogCWlmIChlcnIpCkBAIC0yMTksNyArMjcwLDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWRhdGEgfD0gTFZMX1dBS0VVUDsKKwlkYXRhIHw9IFBXUl9MVkxfV0FLRVVQOwogCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsIFJfUDFfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTIyOCw3ICsyNzksNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JZGF0YSB8PSBMVkxfV0FLRVVQOworCWRhdGEgfD0gUFdSX0xWTF9XQUtFVVA7CiAJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgZGF0YSwgUl9QMl9TV19FVkVOVFMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMjgxLDcgKzMzMiw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlyZF9kYXRhIHw9IEVOQUJMRV9XQVJNUkVTRVQ7CisJcmRfZGF0YSB8PSBQV1JfRU5BQkxFX1dBUk1SRVNFVDsKIAllcnIgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLCBSX1AxX1NXX0VWRU5UUyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yOTAsNyArMzQxLDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXJkX2RhdGEgfD0gRU5BQkxFX1dBUk1SRVNFVDsKKwlyZF9kYXRhIHw9IFBXUl9FTkFCTEVfV0FSTVJFU0VUOwogCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QTV9NQVNURVIsIHJkX2RhdGEsIFJfUDJfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTI5OSw3ICszNTAsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JcmRfZGF0YSB8PSBFTkFCTEVfV0FSTVJFU0VUOworCXJkX2RhdGEgfD0gUFdSX0VOQUJMRV9XQVJNUkVTRVQ7CiAJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgcmRfZGF0YSwgUl9QM19TV19FVkVOVFMpOwogb3V0OgogCWlmIChlcnIpCkBAIC00MjEsNiArNDcyLDEyIEBACiAJCQlnb3RvIG91dDsKIAl9CiAJaWYgKHRzY3JpcHQtPmZsYWdzICYgVFdMNDAzMF9XQUtFVVAxMl9TQ1JJUFQpIHsKKwkJLyogUmVzZXQgYW55IGV4aXN0aW5nIHNsZWVwIHNjcmlwdCB0byBhdm9pZCBoYW5ncyBvbiByZWJvb3QgKi8KKwkJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgRU5EX09GX1NDUklQVCwKKwkJCQkgICAgICAgUl9TRVFfQUREX0EyUyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwogCQllcnIgPSB0d2w0MDMwX2NvbmZpZ193YWtldXAxMl9zZXF1ZW5jZShhZGRyZXNzKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwpAQCAtNDkzLDcgKzU1MCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB0d2w0MDMwX3Bvd2VyX2NvbmZpZ3VyZV9zY3JpcHRzKHN0cnVjdCB0d2w0MDMwX3Bvd2VyX2RhdGEgKnBkYXRhKQorc3RhdGljIGludAordHdsNDAzMF9wb3dlcl9jb25maWd1cmVfc2NyaXB0cyhjb25zdCBzdHJ1Y3QgdHdsNDAzMF9wb3dlcl9kYXRhICpwZGF0YSkKIHsKIAlpbnQgZXJyOwogCWludCBpOwpAQCAtNTA5LDEyICs1NjcsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0d2w0MDMwX3Bvd2VyX2NvbmZpZ3VyZV9yZXNvdXJjZXMoc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSAqcGRhdGEpCitzdGF0aWMgdm9pZCB0d2w0MDMwX3BhdGNoX3Jjb25maWcoc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpjb21tb24sCisJCQkJICBzdHJ1Y3QgdHdsNDAzMF9yZXNjb25maWcgKmJvYXJkKQoreworCXdoaWxlIChjb21tb24tPnJlc291cmNlKSB7CisJCXN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyAqYiA9IGJvYXJkOworCisJCXdoaWxlIChiLT5yZXNvdXJjZSkgeworCQkJaWYgKGItPnJlc291cmNlID09IGNvbW1vbi0+cmVzb3VyY2UpIHsKKwkJCQkqY29tbW9uID0gKmI7CisJCQkJYnJlYWs7CisJCQl9CisJCQliKys7CisJCX0KKwkJY29tbW9uKys7CisJfQorfQorCitzdGF0aWMgaW50Cit0d2w0MDMwX3Bvd2VyX2NvbmZpZ3VyZV9yZXNvdXJjZXMoY29uc3Qgc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSAqcGRhdGEpCiB7CiAJc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpyZXNjb25maWcgPSBwZGF0YS0+cmVzb3VyY2VfY29uZmlnOworCXN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyAqYm9hcmRjb25mID0gcGRhdGEtPmJvYXJkX2NvbmZpZzsKIAlpbnQgZXJyOwogCiAJaWYgKHJlc2NvbmZpZykgeworCQlpZiAoYm9hcmRjb25mKQorCQkJdHdsNDAzMF9wYXRjaF9yY29uZmlnKHJlc2NvbmZpZywgYm9hcmRjb25mKTsKKwogCQl3aGlsZSAocmVzY29uZmlnLT5yZXNvdXJjZSkgewogCQkJZXJyID0gdHdsNDAzMF9jb25maWd1cmVfcmVzb3VyY2UocmVzY29uZmlnKTsKIAkJCWlmIChlcnIpCkBAIC01NDEsNyArNjIxLDcgQEAKIAkJcHJfZXJyKCJUV0w0MDMwIFVuYWJsZSB0byBwb3dlciBvZmZcbiIpOwogfQogCi1zdGF0aWMgYm9vbCB0d2w0MDMwX3Bvd2VyX3VzZV9wb3dlcm9mZihzdHJ1Y3QgdHdsNDAzMF9wb3dlcl9kYXRhICpwZGF0YSwKK3N0YXRpYyBib29sIHR3bDQwMzBfcG93ZXJfdXNlX3Bvd2Vyb2ZmKGNvbnN0IHN0cnVjdCB0d2w0MDMwX3Bvd2VyX2RhdGEgKnBkYXRhLAogCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJaWYgKHBkYXRhICYmIHBkYXRhLT51c2VfcG93ZXJvZmYpCkBAIC01NTMsMTAgKzYzMywxNzAgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKyNpZmRlZiBDT05GSUdfT0YKKworLyogR2VuZXJpYyB3YXJtIHJlc2V0IGNvbmZpZ3VyYXRpb24gZm9yIG9tYXAzICovCisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9pbnMgb21hcDNfd3JzdF9zZXFbXSA9IHsKKwlUV0xfUkVTT1VSQ0VfT0ZGKFJFU19OUkVTX1BXUk9OKSwKKwlUV0xfUkVTT1VSQ0VfT0ZGKFJFU19SRVNFVCksCisJVFdMX1JFU09VUkNFX1JFU0VUKFJFU19NQUlOX1JFRiksCisJVFdMX1JFU09VUkNFX0dST1VQX1JFU0VUKFJFU19HUlBfQUxMLCBSRVNfVFlQRV9SMCwgUkVTX1RZUEUyX1IyKSwKKwlUV0xfUkVTT1VSQ0VfUkVTRVQoUkVTX1ZVU0JfM1YxKSwKKwlUV0xfUkVTT1VSQ0VfR1JPVVBfUkVTRVQoUkVTX0dSUF9BTEwsIFJFU19UWVBFX1IwLCBSRVNfVFlQRTJfUjEpLAorCVRXTF9SRVNPVVJDRV9HUk9VUF9SRVNFVChSRVNfR1JQX1JDLCBSRVNfVFlQRV9BTEwsIFJFU19UWVBFMl9SMCksCisJVFdMX1JFU09VUkNFX09OKFJFU19SRVNFVCksCisJVFdMX1JFU09VUkNFX09OKFJFU19OUkVTX1BXUk9OKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgb21hcDNfd3JzdF9zY3JpcHQgPSB7CisJLnNjcmlwdAk9IG9tYXAzX3dyc3Rfc2VxLAorCS5zaXplCT0gQVJSQVlfU0laRShvbWFwM193cnN0X3NlcSksCisJLmZsYWdzCT0gVFdMNDAzMF9XUlNUX1NDUklQVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgKm9tYXAzX3Jlc2V0X3NjcmlwdHNbXSA9IHsKKwkmb21hcDNfd3JzdF9zY3JpcHQsCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnIG9tYXAzX3Jjb25maWdbXSA9IHsKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX0hGQ0xLT1VULCBERVZfR1JQX1AzLCAtMSwgLTEpLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVkREMSwgREVWX0dSUF9QMSwgLTEsIC0xKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZERDIsIERFVl9HUlBfUDEsIC0xLCAtMSksCisJeyAwLCAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSBvbWFwM19yZXNldCA9IHsKKwkuc2NyaXB0cwkJPSBvbWFwM19yZXNldF9zY3JpcHRzLAorCS5udW0JCQk9IEFSUkFZX1NJWkUob21hcDNfcmVzZXRfc2NyaXB0cyksCisJLnJlc291cmNlX2NvbmZpZwk9IG9tYXAzX3Jjb25maWcsCit9OworCisvKiBSZWNvbW1lbmRlZCBnZW5lcmljIGRlZmF1bHQgaWRsZSBjb25maWd1cmF0aW9uIGZvciBvZmYtaWRsZSAqLworCisvKiBCcm9hZGNhc3QgbWVzc2FnZSB0byBwdXQgcmVzIHRvIHNsZWVwICovCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIG9tYXAzX2lkbGVfc2xlZXBfb25fc2VxW10gPSB7CisJVFdMX1JFU09VUkNFX0dST1VQX1NMRUVQKFJFU19HUlBfQUxMLCBSRVNfVFlQRV9BTEwsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3NjcmlwdCBvbWFwM19pZGxlX3NsZWVwX29uX3NjcmlwdCA9IHsKKwkuc2NyaXB0CT0gb21hcDNfaWRsZV9zbGVlcF9vbl9zZXEsCisJLnNpemUJPSBBUlJBWV9TSVpFKG9tYXAzX2lkbGVfc2xlZXBfb25fc2VxKSwKKwkuZmxhZ3MJPSBUV0w0MDMwX1NMRUVQX1NDUklQVCwKK307CisKKy8qIEJyb2FkY2FzdCBtZXNzYWdlIHRvIHB1dCByZXMgdG8gYWN0aXZlICovCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIG9tYXAzX2lkbGVfd2FrZXVwX3AxMl9zZXFbXSA9IHsKKwlUV0xfUkVTT1VSQ0VfR1JPVVBfQUNUSVZFKFJFU19HUlBfQUxMLCBSRVNfVFlQRV9BTEwsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3NjcmlwdCBvbWFwM19pZGxlX3dha2V1cF9wMTJfc2NyaXB0ID0geworCS5zY3JpcHQJPSBvbWFwM19pZGxlX3dha2V1cF9wMTJfc2VxLAorCS5zaXplCT0gQVJSQVlfU0laRShvbWFwM19pZGxlX3dha2V1cF9wMTJfc2VxKSwKKwkuZmxhZ3MJPSBUV0w0MDMwX1dBS0VVUDEyX1NDUklQVCwKK307CisKKy8qIEJyb2FkY2FzdCBtZXNzYWdlIHRvIHB1dCByZXMgdG8gYWN0aXZlICovCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIG9tYXAzX2lkbGVfd2FrZXVwX3AzX3NlcVtdID0geworCVRXTF9SRVNPVVJDRV9TRVRfQUNUSVZFKFJFU19DTEtFTiwgMHgzNyksCisJVFdMX1JFU09VUkNFX0dST1VQX0FDVElWRShSRVNfR1JQX0FMTCwgUkVTX1RZUEVfQUxMLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgb21hcDNfaWRsZV93YWtldXBfcDNfc2NyaXB0ID0geworCS5zY3JpcHQJPSBvbWFwM19pZGxlX3dha2V1cF9wM19zZXEsCisJLnNpemUJPSBBUlJBWV9TSVpFKG9tYXAzX2lkbGVfd2FrZXVwX3AzX3NlcSksCisJLmZsYWdzCT0gVFdMNDAzMF9XQUtFVVAzX1NDUklQVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgKm9tYXAzX2lkbGVfc2NyaXB0c1tdID0geworCSZvbWFwM19pZGxlX3dha2V1cF9wMTJfc2NyaXB0LAorCSZvbWFwM19pZGxlX3dha2V1cF9wM19zY3JpcHQsCisJJm9tYXAzX3dyc3Rfc2NyaXB0LAorCSZvbWFwM19pZGxlX3NsZWVwX29uX3NjcmlwdCwKK307CisKKy8qCisgKiBSZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uIGJhc2VkIG9uICJSZWNvbW1lbmRlZCBTbGVlcAorICogU2VxdWVuY2VzIGZvciB0aGUgWm9vbSBQbGF0Zm9ybSI6CisgKiBodHRwOi8vb21hcHBlZGlhLmNvbS93aWtpL0ZpbGU6UmVjb21tZW5kZWRfU2xlZXBfU2VxdWVuY2VzX1pvb20ucGRmCisgKiBOb3RlIHRoYXQgdGhlIHR5cGUxIGFuZCB0eXBlMiBzZWVtIHRvIGJlIGp1c3QgdGhlIGluaXQgb3JkZXIgbnVtYmVyCisgKiBmb3IgdHlwZTEgYW5kIHR5cGUyIGdyb3VwcyBhcyBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50IG1lbnRpb25lZAorICogYWJvdmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9yZXNjb25maWcgb21hcDNfaWRsZV9yY29uZmlnW10gPSB7CisJVFdMX1JFTUFQX1NMRUVQKFJFU19WQVVYMSwgREVWX0dSUF9OVUxMLCAwLCAwKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZBVVgyLCBERVZfR1JQX05VTEwsIDAsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVkFVWDMsIERFVl9HUlBfTlVMTCwgMCwgMCksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19WQVVYNCwgREVWX0dSUF9OVUxMLCAwLCAwKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZNTUMxLCBERVZfR1JQX05VTEwsIDAsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVk1NQzIsIERFVl9HUlBfTlVMTCwgMCwgMCksCisJVFdMX1JFTUFQX09GRihSRVNfVlBMTDEsIERFVl9HUlBfUDEsIDMsIDEpLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVlBMTDIsIERFVl9HUlBfUDEsIDAsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVlNJTSwgREVWX0dSUF9OVUxMLCAwLCAwKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZEQUMsIERFVl9HUlBfTlVMTCwgMCwgMCksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19WSU5UQU5BMSwgVFdMX0RFVl9HUlBfUDEyMywgMSwgMiksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19WSU5UQU5BMiwgVFdMX0RFVl9HUlBfUDEyMywgMCwgMiksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19WSU5URElHLCBUV0xfREVWX0dSUF9QMTIzLCAxLCAyKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZJTywgVFdMX0RFVl9HUlBfUDEyMywgMiwgMiksCisJVFdMX1JFTUFQX09GRihSRVNfVkREMSwgREVWX0dSUF9QMSwgNCwgMSksCisJVFdMX1JFTUFQX09GRihSRVNfVkREMiwgREVWX0dSUF9QMSwgMywgMSksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19WVVNCXzFWNSwgREVWX0dSUF9OVUxMLCAwLCAwKSwKKwlUV0xfUkVNQVBfU0xFRVAoUkVTX1ZVU0JfMVY4LCBERVZfR1JQX05VTEwsIDAsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfVlVTQl8zVjEsIFRXTF9ERVZfR1JQX1AxMjMsIDAsIDApLAorCS8qIFJlc291cmNlICMyMCBVU0IgY2hhcmdlIHB1bXAgc2tpcHBlZCAqLworCVRXTF9SRU1BUF9TTEVFUChSRVNfUkVHRU4sIFRXTF9ERVZfR1JQX1AxMjMsIDIsIDEpLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfTlJFU19QV1JPTiwgVFdMX0RFVl9HUlBfUDEyMywgMCwgMSksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19DTEtFTiwgVFdMX0RFVl9HUlBfUDEyMywgMywgMiksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19TWVNFTiwgVFdMX0RFVl9HUlBfUDEyMywgNiwgMSksCisJVFdMX1JFTUFQX1NMRUVQKFJFU19IRkNMS09VVCwgREVWX0dSUF9QMywgMCwgMiksCisJVFdMX1JFTUFQX1NMRUVQKFJFU18zMktDTEtPVVQsIFRXTF9ERVZfR1JQX1AxMjMsIDAsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfUkVTRVQsIFRXTF9ERVZfR1JQX1AxMjMsIDYsIDApLAorCVRXTF9SRU1BUF9TTEVFUChSRVNfTUFJTl9SRUYsIFRXTF9ERVZfR1JQX1AxMjMsIDAsIDApLAorCXsgLyogVGVybWluYXRvciAqLyB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3Bvd2VyX2RhdGEgb21hcDNfaWRsZSA9IHsKKwkuc2NyaXB0cwkJPSBvbWFwM19pZGxlX3NjcmlwdHMsCisJLm51bQkJCT0gQVJSQVlfU0laRShvbWFwM19pZGxlX3NjcmlwdHMpLAorCS5yZXNvdXJjZV9jb25maWcJPSBvbWFwM19pZGxlX3Jjb25maWcsCit9OworCisvKiBEaXNhYmxlIDMyIEtpSHogb3NjaWxsYXRvciBkdXJpbmcgaWRsZSAqLworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyBvc2Nfb2ZmX3Jjb25maWdbXSA9IHsKKwlUV0xfUkVNQVBfT0ZGKFJFU19DTEtFTiwgREVWX0dSUF9QMSB8IERFVl9HUlBfUDMsIDMsIDIpLAorCXsgLyogVGVybWluYXRvciAqLyB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3Bvd2VyX2RhdGEgb3NjX29mZl9pZGxlID0geworCS5zY3JpcHRzCQk9IG9tYXAzX2lkbGVfc2NyaXB0cywKKwkubnVtCQkJPSBBUlJBWV9TSVpFKG9tYXAzX2lkbGVfc2NyaXB0cyksCisJLnJlc291cmNlX2NvbmZpZwk9IG9tYXAzX2lkbGVfcmNvbmZpZywKKwkuYm9hcmRfY29uZmlnCQk9IG9zY19vZmZfcmNvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHR3bDQwMzBfcG93ZXJfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLHR3bDQwMzAtcG93ZXItcmVzZXQiLAorCQkuZGF0YSA9ICZvbWFwM19yZXNldCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksdHdsNDAzMC1wb3dlci1pZGxlIiwKKwkJLmRhdGEgPSAmb21hcDNfaWRsZSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksdHdsNDAzMC1wb3dlci1pZGxlLW9zYy1vZmYiLAorCQkuZGF0YSA9ICZvc2Nfb2ZmX2lkbGUsCisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdHdsNDAzMF9wb3dlcl9vZl9tYXRjaCk7CisjZW5kaWYJLyogQ09ORklHX09GICovCisKIHN0YXRpYyBpbnQgdHdsNDAzMF9wb3dlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCB0d2w0MDMwX3Bvd2VyX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwljb25zdCBzdHJ1Y3QgdHdsNDAzMF9wb3dlcl9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJaW50IGVyciA9IDA7CiAJaW50IGVycjIgPSAwOwogCXU4IHZhbDsKQEAgLTU3Nyw4ICs4MTcsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIodHdsNDAzMF9wb3dlcl9vZl9tYXRjaCksCisJCQkJJnBkZXYtPmRldik7CisJaWYgKG1hdGNoICYmIG1hdGNoLT5kYXRhKQorCQlwZGF0YSA9IG1hdGNoLT5kYXRhOworCiAJaWYgKHBkYXRhKSB7Ci0JCS8qIFRPRE86IGNvbnZlcnQgdG8gZGV2aWNlIHRyZWUgKi8KIAkJZXJyID0gdHdsNDAzMF9wb3dlcl9jb25maWd1cmVfc2NyaXB0cyhwZGF0YSk7CiAJCWlmIChlcnIpIHsKIAkJCXByX2VycigiVFdMNDAzMCBmYWlsZWQgdG8gbG9hZCBzY3JpcHRzXG4iKTsKQEAgLTYyOCwxNCArODcyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHdsNDAzMF9wb3dlcl9vZl9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJ0aSx0d2w0MDMwLXBvd2VyIiwgfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdHdsNDAzMF9wb3dlcl9vZl9tYXRjaCk7Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHdsNDAzMF9wb3dlcl9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAidHdsNDAzMF9wb3dlciIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKaW5kZXggN2ZlZTIyNC4uYTU2NTI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwpAQCAtMjE2LDggKzIxNiw3IEBACiBjb25maWcgTU1DX1NESENJX1BYQVYzCiAJdHJpc3RhdGUgIk1hcnZlbGwgTU1QMiBTRCBIb3N0IENvbnRyb2xsZXIgc3VwcG9ydCAoUFhBVjMpIgogCWRlcGVuZHMgb24gQ0xLREVWX0xPT0tVUAotCXNlbGVjdCBNTUNfU0RIQ0kKLQlzZWxlY3QgTU1DX1NESENJX1BMVEZNCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KIAlkZWZhdWx0IENQVV9NTVAyCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBNYXJ2ZWxsKFIpIFBYQVYzIFNEIEhvc3QgQ29udHJvbGxlci4KQEAgLTIyOSw4ICsyMjgsNyBAQAogY29uZmlnIE1NQ19TREhDSV9QWEFWMgogCXRyaXN0YXRlICJNYXJ2ZWxsIFBYQTlYWCBTRCBIb3N0IENvbnRyb2xsZXIgc3VwcG9ydCAoUFhBVjIpIgogCWRlcGVuZHMgb24gQ0xLREVWX0xPT0tVUAotCXNlbGVjdCBNTUNfU0RIQ0kKLQlzZWxlY3QgTU1DX1NESENJX1BMVEZNCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KIAlkZWZhdWx0IENQVV9QWEE5MTAKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIE1hcnZlbGwoUikgUFhBVjIgU0QgSG9zdCBDb250cm9sbGVyLgpAQCAtMjY0LDcgKzI2Miw3IEBACiBjb25maWcgTU1DX1NESENJX0JDTV9LT05BCiAJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gQnJvYWRjb20gS09OQSBwbGF0Zm9ybSIKIAlkZXBlbmRzIG9uIEFSQ0hfQkNNX01PQklMRQotCXNlbGVjdCBNTUNfU0RIQ0lfUExURk0KKwlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTQogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgQnJvYWRjb20gS29uYSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIKIAkgIEludGVyZmFjZShTREhDSSkgc3VwcG9ydC4KQEAgLTI5NSw3ICsyOTMsNyBAQAogY29uZmlnIE1NQ19PTUFQCiAJdHJpc3RhdGUgIlRJIE9NQVAgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9PTUFQCi0Jc2VsZWN0IFRQUzY1MDEwIGlmIE1BQ0hfT01BUF9IMgorCWRlcGVuZHMgb24gVFBTNjUwMTAgfHwgIU1BQ0hfT01BUF9IMgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgVEkgT01BUCBNdWx0aW1lZGlhIGNhcmQgSW50ZXJmYWNlLgogCSAgSWYgeW91IGhhdmUgYW4gT01BUCBib2FyZCB3aXRoIGEgTXVsdGltZWRpYSBDYXJkIHNsb3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwppbmRleCBhZWNlN2NhLi5iYjU4NWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbF9wZGMuaD4KIAorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCmluZGV4IDBhODdlNTYuLmNjOGQ0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCkBAIC00NDgsNyArNDQ4LDYgQEAKIHsKIAlzdHJ1Y3Qgc2NyYXRjaAkJKmRhdGEgPSBob3N0LT5kYXRhOwogCXU4CQkJKmNwID0gZGF0YS0+c3RhdHVzOwotCXUzMgkJCWFyZyA9IGNtZC0+YXJnOwogCWludAkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OwogCkBAIC00NjUsMTQgKzQ2NCwxMiBAQAogCSAqIFdlIGluaXQgdGhlIHdob2xlIGJ1ZmZlciB0byBhbGwtb25lcywgd2hpY2ggaXMgd2hhdCB3ZSBuZWVkCiAJICogdG8gd3JpdGUgd2hpbGUgd2UncmUgcmVhZGluZyAobGF0ZXIpIHJlc3BvbnNlIGRhdGEuCiAJICovCi0JbWVtc2V0KGNwKyssIDB4ZmYsIHNpemVvZihkYXRhLT5zdGF0dXMpKTsKKwltZW1zZXQoY3AsIDB4ZmYsIHNpemVvZihkYXRhLT5zdGF0dXMpKTsKIAotCSpjcCsrID0gMHg0MCB8IGNtZC0+b3Bjb2RlOwotCSpjcCsrID0gKHU4KShhcmcgPj4gMjQpOwotCSpjcCsrID0gKHU4KShhcmcgPj4gMTYpOwotCSpjcCsrID0gKHU4KShhcmcgPj4gOCk7Ci0JKmNwKysgPSAodTgpYXJnOwotCSpjcCsrID0gKGNyYzcoMCwgJmRhdGEtPnN0YXR1c1sxXSwgNSkgPDwgMSkgfCAweDAxOworCWNwWzFdID0gMHg0MCB8IGNtZC0+b3Bjb2RlOworCXB1dF91bmFsaWduZWRfYmUzMihjbWQtPmFyZywgY3ArMik7CisJY3BbNl0gPSBjcmM3X2JlKDAsIGNwKzEsIDUpIHwgMHgwMTsKKwljcCArPSA3OwogCiAJLyogVGhlbiwgcmVhZCB1cCB0byAxMyBieXRlcyAod2hpbGUgd3JpdGluZyBhbGwtb25lcyk6CiAJICogIC0gTihDUikgKD09IDEuLjgpIGJ5dGVzIG9mIGFsbC1vbmVzCkBAIC03MTEsMTAgKzcwOCw3IEBACiAJICogc28gd2UgaGF2ZSB0byBjb3BlIHdpdGggdGhpcyBzaXR1YXRpb24gYW5kIGNoZWNrIHRoZSByZXNwb25zZQogCSAqIGJpdC1ieS1iaXQuIEFyZ2doISEhCiAJICovCi0JcGF0dGVybiAgPSBzY3JhdGNoLT5zdGF0dXNbMF0gPDwgMjQ7Ci0JcGF0dGVybiB8PSBzY3JhdGNoLT5zdGF0dXNbMV0gPDwgMTY7Ci0JcGF0dGVybiB8PSBzY3JhdGNoLT5zdGF0dXNbMl0gPDwgODsKLQlwYXR0ZXJuIHw9IHNjcmF0Y2gtPnN0YXR1c1szXTsKKwlwYXR0ZXJuID0gZ2V0X3VuYWxpZ25lZF9iZTMyKHNjcmF0Y2gtPnN0YXR1cyk7CiAKIAkvKiBGaXJzdCAzIGJpdCBvZiBwYXR0ZXJuIGFyZSB1bmRlZmluZWQgKi8KIAlwYXR0ZXJuIHw9IDB4RTAwMDAwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jIGIvZHJpdmVycy9tbWMvaG9zdC9tdnNkaW8uYwppbmRleCA5Mzc3Mjg0Li42YjRjNWFkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tdnNkaW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jCkBAIC03OSwxMSArNzksMTEgQEAKIAkJdW5zaWduZWQgbG9uZyB0ID0gamlmZmllcyArIEhaOwogCQl1bnNpZ25lZCBpbnQgaHdfc3RhdGUsICBjb3VudCA9IDA7CiAJCWRvIHsKKwkJCWh3X3N0YXRlID0gbXZzZF9yZWFkKE1WU0RfSFdfU1RBVEUpOwogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdCkpIHsKIAkJCQlkZXZfd2Fybihob3N0LT5kZXYsICJGSUZPX0VNUFRZIGJpdCBtaXNzaW5nXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWh3X3N0YXRlID0gbXZzZF9yZWFkKE1WU0RfSFdfU1RBVEUpOwogCQkJY291bnQrKzsKIAkJfSB3aGlsZSAoIShod19zdGF0ZSAmICgxIDw8IDEzKSkpOwogCQlkZXZfZGJnKGhvc3QtPmRldiwgIioqKiB3YWl0IGZvciBGSUZPX0VNUFRZIGJpdCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uYwppbmRleCBhY2IwZTllLi40MDU3M2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmMKQEAgLTQ2OCw2ICs0NjgsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfbXNtX29wcyA9IHsKIAkucGxhdGZvcm1fZXhlY3V0ZV90dW5pbmcgPSBzZGhjaV9tc21fZXhlY3V0ZV90dW5pbmcsCisJLnJlc2V0ID0gc2RoY2lfcmVzZXQsCisJLnNldF9jbG9jayA9IHNkaGNpX3NldF9jbG9jaywKKwkuc2V0X2J1c193aWR0aCA9IHNkaGNpX3NldF9idXNfd2lkdGgsCisJLnNldF91aHNfc2lnbmFsaW5nID0gc2RoY2lfc2V0X3Voc19zaWduYWxpbmcsCiB9OwogCiBzdGF0aWMgaW50IHNkaGNpX21zbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC91c2RoaTZyb2wwLmMgYi9kcml2ZXJzL21tYy9ob3N0L3VzZGhpNnJvbDAuYwppbmRleCBlYjJiYmJlLi5mMGEzOWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3VzZGhpNnJvbDAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3VzZGhpNnJvbDAuYwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAKIAlXQVJOKGhvc3QtPnBnLnBhZ2UsICIlcCBub3QgcHJvcGVybHkgdW5tYXBwZWQhXG4iLCBob3N0LT5wZy5wYWdlKTsKIAlpZiAoV0FSTihzZ19kbWFfbGVuKHNnKSAlIGRhdGEtPmJsa3N6LAotCQkgIlNHIHNpemUgJXpkIGlzbid0IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAlemRcbiIsCisJCSAiU0cgc2l6ZSAldSBpc24ndCBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUgJXVcbiIsCiAJCSBzZ19kbWFfbGVuKHNnKSwgZGF0YS0+Ymxrc3opKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNDU5LDcgKzQ1OSw3IEBACiAJZG9uZSA9IChob3N0LT5wYWdlX2lkeCA8PCBQQUdFX1NISUZUKSArIGhvc3QtPm9mZnNldDsKIAl0b3RhbCA9IGhvc3QtPnNnLT5vZmZzZXQgKyBzZ19kbWFfbGVuKGhvc3QtPnNnKTsKIAotCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiJXMoKTogJXp1IG9mICV6dSBAICV1XG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIiVzKCk6ICV6dSBvZiAlenUgQCAlenVcbiIsIF9fZnVuY19fLAogCQlkb25lLCB0b3RhbCwgaG9zdC0+b2Zmc2V0KTsKIAogCWlmIChkb25lIDwgdG90YWwgJiYgaG9zdC0+b2Zmc2V0KSB7CkBAIC00ODksNyArNDg5LDcgQEAKIAkJaG9zdC0+c2cgPSBuZXh0OwogCiAJCWlmIChXQVJOKG5leHQgJiYgc2dfZG1hX2xlbihuZXh0KSAlIGRhdGEtPmJsa3N6LAotCQkJICJTRyBzaXplICV6ZCBpc24ndCBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUgJXpkXG4iLAorCQkJICJTRyBzaXplICV1IGlzbid0IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAldVxuIiwKIAkJCSBzZ19kbWFfbGVuKG5leHQpLCBkYXRhLT5ibGtzeikpCiAJCQlkYXRhLT5lcnJvciA9IC1FSU5WQUw7CiAKQEAgLTg5Niw3ICs4OTYsNyBAQAogCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IG1ycS0+ZGF0YTsKIAogCWlmIChXQVJOKGhvc3QtPnBnLnBhZ2UgfHwgaG9zdC0+aGVhZF9wZy5wYWdlLAotCQkgIlBhZ2UgJXAgb3IgJXAgbm90IHVubWFwcGVkOiB3YWl0ICV1LCBDTUQlZCglYykgQCArMHgleCAldXgldSBpbiBTRyV1IVxuIiwKKwkJICJQYWdlICVwIG9yICVwIG5vdCB1bm1hcHBlZDogd2FpdCAldSwgQ01EJWQoJWMpIEAgKzB4JXp4ICV1eCV1IGluIFNHJXUhXG4iLAogCQkgaG9zdC0+cGcucGFnZSwgaG9zdC0+aGVhZF9wZy5wYWdlLCBob3N0LT53YWl0LCBtcnEtPmNtZC0+b3Bjb2RlLAogCQkgZGF0YSA/IChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQgPyAnUicgOiAnVycpIDogJy0nLAogCQkgZGF0YSA/IGhvc3QtPm9mZnNldCA6IDAsIGRhdGEgPyBkYXRhLT5ibG9ja3MgOiAwLApAQCAtMTY2Niw3ICsxNjY2LDcgQEAKIAljYXNlIFVTREhJNl9XQUlUX0ZPUl9SRUFEOgogCWNhc2UgVVNESEk2X1dBSVRfRk9SX1dSSVRFOgogCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwKLQkJCSIlYzogcGFnZSAjJXUgQCArMHgleCAldXgldSBpbiBTRyV1LiBDdXJyZW50IFNHICV1IGJ5dGVzIEAgJXVcbiIsCisJCQkiJWM6IHBhZ2UgIyV1IEAgKzB4JXp4ICV1eCV1IGluIFNHJXUuIEN1cnJlbnQgU0cgJXUgYnl0ZXMgQCAldVxuIiwKIAkJCWRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCA/ICdSJyA6ICdXJywgaG9zdC0+cGFnZV9pZHgsCiAJCQlob3N0LT5vZmZzZXQsIGRhdGEtPmJsb2NrcywgZGF0YS0+Ymxrc3osIGRhdGEtPnNnX2xlbiwKIAkJCXNnX2RtYV9sZW4oaG9zdC0+c2cpLCBob3N0LT5zZy0+b2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKaW5kZXggNDJlOGE3Ny4uNGYwZDgzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKQEAgLTU3NSwxMiArNTc1LDEyIEBACiAJCWNmaWxlID0gZmlscF9vcGVuKGNhY2hlX2ZpbGUsIE9fQ1JFQVQgfCBPX1JEV1IgfCBPX0xBUkdFRklMRSwgMDYwMCk7CiAJCWlmIChJU19FUlIoY2ZpbGUpKQogCQkJcmV0dXJuIFBUUl9FUlIoY2ZpbGUpOwotCQlpZiAoIWNmaWxlLT5mX29wLT5yZWFkICYmICFjZmlsZS0+Zl9vcC0+YWlvX3JlYWQpIHsKKwkJaWYgKCEoY2ZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9SRUFEKSkgewogCQkJTlNfRVJSKCJhbGxvY19kZXZpY2U6IGNhY2hlIGZpbGUgbm90IHJlYWRhYmxlXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9jbG9zZTsKIAkJfQotCQlpZiAoIWNmaWxlLT5mX29wLT53cml0ZSAmJiAhY2ZpbGUtPmZfb3AtPmFpb193cml0ZSkgeworCQlpZiAoIShjZmlsZS0+Zl9tb2RlICYgRk1PREVfQ0FOX1dSSVRFKSkgewogCQkJTlNfRVJSKCJhbGxvY19kZXZpY2U6IGNhY2hlIGZpbGUgbm90IHdyaXRlYWJsZVxuIik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfY2xvc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKaW5kZXggYjY2N2E1MS4uMGRmZWFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZmlyc3Rfc2xhdmUgPSBib25kX2ZpcnN0X3NsYXZlX3JjdShib25kKTsKLQlhZ2cgPSBmaXJzdF9zbGF2ZSA/ICYoU0xBVkVfQURfSU5GTyhmaXJzdF9zbGF2ZSkuYWdncmVnYXRvcikgOiBOVUxMOworCWFnZyA9IGZpcnN0X3NsYXZlID8gJihTTEFWRV9BRF9JTkZPKGZpcnN0X3NsYXZlKS0+YWdncmVnYXRvcikgOiBOVUxMOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIGFnZzsKQEAgLTE5Miw3ICsxOTIsNyBAQAogewogCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBwb3J0LT5zbGF2ZTsKIAotCWlmICgoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSAmJiBJU19VUChzbGF2ZS0+ZGV2KSkKKwlpZiAoKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYgYm9uZF9zbGF2ZV9pc191cChzbGF2ZSkpCiAJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhzbGF2ZSwgQk9ORF9TTEFWRV9OT1RJRllfTEFURVIpOwogfQogCkBAIC0yNDEsNyArMjQxLDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3N0YXRlX21hY2hpbmVfbG9jayhzdHJ1Y3QgcG9ydCAqcG9ydCkKIHsKLQlzcGluX2xvY2tfYmgoJihTTEFWRV9BRF9JTkZPKHBvcnQtPnNsYXZlKS5zdGF0ZV9tYWNoaW5lX2xvY2spKTsKKwlzcGluX2xvY2tfYmgoJihTTEFWRV9BRF9JTkZPKHBvcnQtPnNsYXZlKS0+c3RhdGVfbWFjaGluZV9sb2NrKSk7CiB9CiAKIC8qKgpAQCAtMjUwLDcgKzI1MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbGVhc2Vfc3RhdGVfbWFjaGluZV9sb2NrKHN0cnVjdCBwb3J0ICpwb3J0KQogewotCXNwaW5fdW5sb2NrX2JoKCYoU0xBVkVfQURfSU5GTyhwb3J0LT5zbGF2ZSkuc3RhdGVfbWFjaGluZV9sb2NrKSk7CisJc3Bpbl91bmxvY2tfYmgoJihTTEFWRV9BRF9JTkZPKHBvcnQtPnNsYXZlKS0+c3RhdGVfbWFjaGluZV9sb2NrKSk7CiB9CiAKIC8qKgpAQCAtMzUwLDcgKzM1MCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0aWFsaXplX3BvcnRfbG9ja3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKIHsKIAkvKiBtYWtlIHN1cmUgaXQgaXNuJ3QgY2FsbGVkIHR3aWNlICovCi0Jc3Bpbl9sb2NrX2luaXQoJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5zdGF0ZV9tYWNoaW5lX2xvY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5zdGF0ZV9tYWNoaW5lX2xvY2spKTsKIH0KIAogLyogQ29udmVyc2lvbnMgKi8KQEAgLTY4OCw4ICs2ODgsOCBAQAogCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlX3JjdShib25kLCBzbGF2ZSwgaXRlcikKLQkJaWYgKFNMQVZFX0FEX0lORk8oc2xhdmUpLmFnZ3JlZ2F0b3IuaXNfYWN0aXZlKQotCQkJcmV0dXJuICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkuYWdncmVnYXRvcik7CisJCWlmIChTTEFWRV9BRF9JTkZPKHNsYXZlKS0+YWdncmVnYXRvci5pc19hY3RpdmUpCisJCQlyZXR1cm4gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS0+YWdncmVnYXRvcik7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEyOTMsNyArMTI5Myw3IEBACiAJfQogCS8qIHNlYXJjaCBvbiBhbGwgYWdncmVnYXRvcnMgZm9yIGEgc3VpdGFibGUgYWdncmVnYXRvciBmb3IgdGhpcyBwb3J0ICovCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaXRlcikgewotCQlhZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5hZ2dyZWdhdG9yKTsKKwkJYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPmFnZ3JlZ2F0b3IpOwogCiAJCS8qIGtlZXAgYSBmcmVlIGFnZ3JlZ2F0b3IgZm9yIGxhdGVyIHVzZShpZiBuZWVkZWQpICovCiAJCWlmICghYWdncmVnYXRvci0+bGFnX3BvcnRzKSB7CkBAIC0xNTA0LDcgKzE1MDQsNyBAQAogCWJlc3QgPSAoYWN0aXZlICYmIGFnZ19kZXZpY2VfdXAoYWN0aXZlKSkgPyBhY3RpdmUgOiBOVUxMOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJYWdnID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5hZ2dyZWdhdG9yKTsKKwkJYWdnID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS0+YWdncmVnYXRvcik7CiAKIAkJYWdnLT5pc19hY3RpdmUgPSAwOwogCkBAIC0xNTQ5LDcgKzE1NDksNyBAQAogCQkJIGJlc3QtPnNsYXZlID8gYmVzdC0+c2xhdmUtPmRldi0+bmFtZSA6ICJOVUxMIik7CiAKIAkJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJCWFnZyA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkuYWdncmVnYXRvcik7CisJCQlhZ2cgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5hZ2dyZWdhdG9yKTsKIAogCQkJcHJfZGVidWcoIkFnZz0lZDsgUD0lZDsgYSBrPSVkOyBwIGs9JWQ7IEluZD0lZDsgQWN0PSVkXG4iLAogCQkJCSBhZ2ctPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciwgYWdnLT5udW1fb2ZfcG9ydHMsCkBAIC0xODQwLDE2ICsxODQwLDE2IEBACiAJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3I7CiAKIAkvKiBjaGVjayB0aGF0IHRoZSBzbGF2ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiAqLwotCWlmIChTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LnNsYXZlICE9IHNsYXZlKSB7CisJaWYgKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0LnNsYXZlICE9IHNsYXZlKSB7CiAKIAkJLyogcG9ydCBpbml0aWFsaXphdGlvbiAqLwotCQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKwkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPnBvcnQpOwogCiAJCWFkX2luaXRpYWxpemVfcG9ydChwb3J0LCBib25kLT5wYXJhbXMubGFjcF9mYXN0KTsKIAogCQlfX2luaXRpYWxpemVfcG9ydF9sb2NrcyhzbGF2ZSk7CiAJCXBvcnQtPnNsYXZlID0gc2xhdmU7Ci0JCXBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyID0gU0xBVkVfQURfSU5GTyhzbGF2ZSkuaWQ7CisJCXBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyID0gU0xBVkVfQURfSU5GTyhzbGF2ZSktPmlkOwogCQkvKiBrZXkgaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIGxpbmsgc3BlZWQsIGR1cGxleCBhbmQgdXNlciBrZXkod2hpY2gKIAkJICogaXMgeWV0IG5vdCBzdXBwb3J0ZWQpCiAJCSAqLwpAQCAtMTg3NCw3ICsxODc0LDcgQEAKIAkJX19kaXNhYmxlX3BvcnQocG9ydCk7CiAKIAkJLyogYWdncmVnYXRvciBpbml0aWFsaXphdGlvbiAqLwotCQlhZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5hZ2dyZWdhdG9yKTsKKwkJYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPmFnZ3JlZ2F0b3IpOwogCiAJCWFkX2luaXRpYWxpemVfYWdnKGFnZ3JlZ2F0b3IpOwogCkBAIC0xOTAzLDggKzE5MDMsOCBAQAogCXN0cnVjdCBzbGF2ZSAqc2xhdmVfaXRlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCi0JYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkuYWdncmVnYXRvcik7Ci0JcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisJYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPmFnZ3JlZ2F0b3IpOworCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0KTsKIAogCS8qIGlmIHNsYXZlIGlzIG51bGwsIHRoZSB3aG9sZSBwb3J0IGlzIG5vdCBpbml0aWFsaXplZCAqLwogCWlmICghcG9ydC0+c2xhdmUpIHsKQEAgLTE5MzIsNyArMTkzMiw3IEBACiAJCSAgICAoYWdncmVnYXRvci0+bGFnX3BvcnRzLT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcikpIHsKIAkJCS8qIGZpbmQgbmV3IGFnZ3JlZ2F0b3IgZm9yIHRoZSByZWxhdGVkIHBvcnQocykgKi8KIAkJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmVfaXRlciwgaXRlcikgewotCQkJCW5ld19hZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlX2l0ZXIpLmFnZ3JlZ2F0b3IpOworCQkJCW5ld19hZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlX2l0ZXIpLT5hZ2dyZWdhdG9yKTsKIAkJCQkvKiBpZiB0aGUgbmV3IGFnZ3JlZ2F0b3IgaXMgZW1wdHksIG9yIGl0IGlzCiAJCQkJICogY29ubmVjdGVkIHRvIG91ciBwb3J0IG9ubHkKIAkJCQkgKi8KQEAgLTIwMTAsNyArMjAxMCw3IEBACiAKIAkvKiBmaW5kIHRoZSBhZ2dyZWdhdG9yIHRoYXQgdGhpcyBwb3J0IGlzIGNvbm5lY3RlZCB0byAqLwogCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmVfaXRlciwgaXRlcikgewotCQl0ZW1wX2FnZ3JlZ2F0b3IgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmVfaXRlcikuYWdncmVnYXRvcik7CisJCXRlbXBfYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZV9pdGVyKS0+YWdncmVnYXRvcik7CiAJCXByZXZfcG9ydCA9IE5VTEw7CiAJCS8qIHNlYXJjaCB0aGUgcG9ydCBpbiB0aGUgYWdncmVnYXRvcidzIHJlbGF0ZWQgcG9ydHMgKi8KIAkJZm9yICh0ZW1wX3BvcnQgPSB0ZW1wX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0czsgdGVtcF9wb3J0OwpAQCAtMjA3Niw3ICsyMDc2LDcgQEAKIAlpZiAoQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfdGltZXIgJiYKIAkgICAgISgtLUJPTkRfQURfSU5GTyhib25kKS5hZ2dfc2VsZWN0X3RpbWVyKSkgewogCQlzbGF2ZSA9IGJvbmRfZmlyc3Rfc2xhdmVfcmN1KGJvbmQpOwotCQlwb3J0ID0gc2xhdmUgPyAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpIDogTlVMTDsKKwkJcG9ydCA9IHNsYXZlID8gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydCkgOiBOVUxMOwogCiAJCS8qIHNlbGVjdCB0aGUgYWN0aXZlIGFnZ3JlZ2F0b3IgZm9yIHRoZSBib25kICovCiAJCWlmIChwb3J0KSB7CkBAIC0yMDk0LDcgKzIwOTQsNyBAQAogCiAJLyogZm9yIGVhY2ggcG9ydCBydW4gdGhlIHN0YXRlIG1hY2hpbmVzICovCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisJCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0KTsKIAkJaWYgKCFwb3J0LT5zbGF2ZSkgewogCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgiJXM6IFdhcm5pbmc6IEZvdW5kIGFuIHVuaW5pdGlhbGl6ZWQgcG9ydFxuIiwKIAkJCQkJICAgIGJvbmQtPmRldi0+bmFtZSk7CkBAIC0yMTU1LDcgKzIxNTUsNyBAQAogCiAJaWYgKGxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IGxhY3BkdSkpIHsKIAotCQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKwkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPnBvcnQpOwogCiAJCWlmICghcG9ydC0+c2xhdmUpIHsKIAkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIiVzOiBXYXJuaW5nOiBwb3J0IG9mIHNsYXZlICVzIGlzIHVuaW5pdGlhbGl6ZWRcbiIsCkBAIC0yMjEyLDcgKzIyMTIsNyBAQAogewogCXN0cnVjdCBwb3J0ICpwb3J0OwogCi0JcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSktPnBvcnQpOwogCiAJLyogaWYgc2xhdmUgaXMgbnVsbCwgdGhlIHdob2xlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkICovCiAJaWYgKCFwb3J0LT5zbGF2ZSkgewpAQCAtMjI0NSw3ICsyMjQ1LDcgQEAKIHsKIAlzdHJ1Y3QgcG9ydCAqcG9ydDsKIAotCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0KTsKIAogCS8qIGlmIHNsYXZlIGlzIG51bGwsIHRoZSB3aG9sZSBwb3J0IGlzIG5vdCBpbml0aWFsaXplZCAqLwogCWlmICghcG9ydC0+c2xhdmUpIHsKQEAgLTIyNzksNyArMjI3OSw3IEBACiB7CiAJc3RydWN0IHBvcnQgKnBvcnQ7CiAKLQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKwlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydCk7CiAKIAkvKiBpZiBzbGF2ZSBpcyBudWxsLCB0aGUgd2hvbGUgcG9ydCBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KIAlpZiAoIXBvcnQtPnNsYXZlKSB7CkBAIC0yMzQ3LDcgKzIzNDcsNyBAQAogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9Ci0JYWN0aXZlID0gX19nZXRfYWN0aXZlX2FnZygmKFNMQVZFX0FEX0lORk8oZmlyc3Rfc2xhdmUpLmFnZ3JlZ2F0b3IpKTsKKwlhY3RpdmUgPSBfX2dldF9hY3RpdmVfYWdnKCYoU0xBVkVfQURfSU5GTyhmaXJzdF9zbGF2ZSktPmFnZ3JlZ2F0b3IpKTsKIAlpZiAoYWN0aXZlKSB7CiAJCS8qIGFyZSBlbm91Z2ggc2xhdmVzIGF2YWlsYWJsZSB0byBjb25zaWRlciBsaW5rIHVwPyAqLwogCQlpZiAoYWN0aXZlLT5udW1fb2ZfcG9ydHMgPCBib25kLT5wYXJhbXMubWluX2xpbmtzKSB7CkBAIC0yMzg0LDcgKzIzODQsNyBAQAogCXN0cnVjdCBwb3J0ICpwb3J0OwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisJCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0KTsKIAkJaWYgKHBvcnQtPmFnZ3JlZ2F0b3IgJiYgcG9ydC0+YWdncmVnYXRvci0+aXNfYWN0aXZlKSB7CiAJCQlhZ2dyZWdhdG9yID0gcG9ydC0+YWdncmVnYXRvcjsKIAkJCWJyZWFrOwpAQCAtMjQ0MCwyMiArMjQ0MCwyMiBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCXNsYXZlX2FnZ19ubyA9IGJvbmRfeG1pdF9oYXNoKGJvbmQsIHNrYiwgc2xhdmVzX2luX2FnZyk7CisJc2xhdmVfYWdnX25vID0gYm9uZF94bWl0X2hhc2goYm9uZCwgc2tiKSAlIHNsYXZlc19pbl9hZ2c7CiAJZmlyc3Rfb2tfc2xhdmUgPSBOVUxMOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJYWdnID0gU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydC5hZ2dyZWdhdG9yOworCQlhZ2cgPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydC5hZ2dyZWdhdG9yOwogCQlpZiAoIWFnZyB8fCBhZ2ctPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciAhPSBhZ2dfaWQpCiAJCQljb250aW51ZTsKIAogCQlpZiAoc2xhdmVfYWdnX25vID49IDApIHsKLQkJCWlmICghZmlyc3Rfb2tfc2xhdmUgJiYgU0xBVkVfSVNfT0soc2xhdmUpKQorCQkJaWYgKCFmaXJzdF9va19zbGF2ZSAmJiBib25kX3NsYXZlX2Nhbl90eChzbGF2ZSkpCiAJCQkJZmlyc3Rfb2tfc2xhdmUgPSBzbGF2ZTsKIAkJCXNsYXZlX2FnZ19uby0tOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoU0xBVkVfSVNfT0soc2xhdmUpKSB7CisJCWlmIChib25kX3NsYXZlX2Nhbl90eChzbGF2ZSkpIHsKIAkJCWJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCBzbGF2ZS0+ZGV2KTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0yNTIyLDcgKzI1MjIsNyBAQAogCiAJbGFjcF9mYXN0ID0gYm9uZC0+cGFyYW1zLmxhY3BfZmFzdDsKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpdGVyKSB7Ci0JCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydCk7CiAJCV9fZ2V0X3N0YXRlX21hY2hpbmVfbG9jayhwb3J0KTsKIAkJaWYgKGxhY3BfZmFzdCkKIAkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSB8PSBBRF9TVEFURV9MQUNQX1RJTUVPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggOTM1ODBhNC4uNzZjMGRhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAKIAkvKiBGaW5kIHRoZSBzbGF2ZSB3aXRoIHRoZSBsYXJnZXN0IGdhcCAqLwogCWJvbmRfZm9yX2VhY2hfc2xhdmVfcmN1KGJvbmQsIHNsYXZlLCBpdGVyKSB7Ci0JCWlmIChTTEFWRV9JU19PSyhzbGF2ZSkpIHsKKwkJaWYgKGJvbmRfc2xhdmVfY2FuX3R4KHNsYXZlKSkgewogCQkJbG9uZyBsb25nIGdhcCA9IGNvbXB1dGVfZ2FwKHNsYXZlKTsKIAogCQkJaWYgKG1heF9nYXAgPCBnYXApIHsKQEAgLTM4NCw3ICszODQsNyBAQAogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAogCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJaWYgKCFTTEFWRV9JU19PSyhzbGF2ZSkpCisJCWlmICghYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUpKQogCQkJY29udGludWU7CiAJCWlmICghZm91bmQpIHsKIAkJCWlmICghYmVmb3JlIHx8IGJlZm9yZS0+c3BlZWQgPCBzbGF2ZS0+c3BlZWQpCkBAIC00MTcsNyArNDE3LDcgQEAKIAlib29sIGZvdW5kID0gZmFsc2U7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlX3JjdShib25kLCBzbGF2ZSwgaXRlcikgewotCQlpZiAoIVNMQVZFX0lTX09LKHNsYXZlKSkKKwkJaWYgKCFib25kX3NsYXZlX2Nhbl90eChzbGF2ZSkpCiAJCQljb250aW51ZTsKIAkJaWYgKCFmb3VuZCkgewogCQkJaWYgKCFiZWZvcmUgfHwgYmVmb3JlLT5zcGVlZCA8IHNsYXZlLT5zcGVlZCkKQEAgLTc1NSw3ICs3NTUsNyBAQAogCS8qIERvbid0IG1vZGlmeSBvciBsb2FkIGJhbGFuY2UgQVJQcyB0aGF0IGRvIG5vdCBvcmlnaW5hdGUgbG9jYWxseQogCSAqIChlLmcuLGFycml2ZSB2aWEgYSBicmlkZ2UpLgogCSAqLwotCWlmICghYm9uZF9zbGF2ZV9oYXNfbWFjX3JjdShib25kLCBhcnAtPm1hY19zcmMpKQorCWlmICghYm9uZF9zbGF2ZV9oYXNfbWFjX3J4KGJvbmQsIGFycC0+bWFjX3NyYykpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGFycC0+b3BfY29kZSA9PSBodG9ucyhBUlBPUF9SRVBMWSkpIHsKQEAgLTEwMzksMTEgKzEwMzksMTQgQEAKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZ2V0X2JvbmRfYnlfc2xhdmUoc2xhdmUpOwogCXN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOworCXN0cnVjdCBib25kX3ZsYW5fdGFnIHRhZ3NbQk9ORF9NQVhfVkxBTl9FTkNBUF07CiAKIAkvKiBzZW5kIHVudGFnZ2VkICovCiAJYWxiX3NlbmRfbHBfdmlkKHNsYXZlLCBtYWNfYWRkciwgMCwgMCk7CiAKLQkvKiBsb29wIHRocm91Z2ggdmxhbnMgYW5kIHNlbmQgb25lIHBhY2tldCBmb3IgZWFjaCAqLworCS8qIGxvb3AgdGhyb3VnaCBhbGwgZGV2aWNlcyBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gc2VuZCBhIHBhY2tldAorCSAqIGZvciB0aGF0IGRldmljZS4KKwkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJbmV0ZGV2X2Zvcl9lYWNoX2FsbF91cHBlcl9kZXZfcmN1KGJvbmQtPmRldiwgdXBwZXIsIGl0ZXIpIHsKIAkJaWYgKGlzX3ZsYW5fZGV2KHVwcGVyKSAmJiB2bGFuX2dldF9lbmNhcF9sZXZlbCh1cHBlcikgPT0gMCkgewpAQCAtMTA1OSw2ICsxMDYyLDE2IEBACiAJCQkJCQl2bGFuX2Rldl92bGFuX2lkKHVwcGVyKSk7CiAJCQl9CiAJCX0KKworCQkvKiBJZiB0aGlzIGlzIGEgbWFjdmxhbiBkZXZpY2UsIHRoZW4gb25seSBzZW5kIHVwZGF0ZXMKKwkJICogd2hlbiBzdHJpY3RfbWF0Y2ggaXMgdHVybmVkIG9mZi4KKwkJICovCisJCWlmIChuZXRpZl9pc19tYWN2bGFuKHVwcGVyKSAmJiAhc3RyaWN0X21hdGNoKSB7CisJCQltZW1zZXQodGFncywgMCwgc2l6ZW9mKHRhZ3MpKTsKKwkJCWJvbmRfdmVyaWZ5X2RldmljZV9wYXRoKGJvbmQtPmRldiwgdXBwZXIsIHRhZ3MpOworCQkJYWxiX3NlbmRfbHBfdmlkKHNsYXZlLCB1cHBlci0+ZGV2X2FkZHIsCisJCQkJCXRhZ3NbMF0udmxhbl9wcm90bywgdGFnc1swXS52bGFuX2lkKTsKKwkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTEwNjgsNyArMTA4MSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNsYXZlLT5kZXY7CiAJc3RydWN0IHNvY2thZGRyIHNfYWRkcjsKIAotCWlmIChzbGF2ZS0+Ym9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgeworCWlmIChCT05EX01PREUoc2xhdmUtPmJvbmQpID09IEJPTkRfTU9ERV9UTEIpIHsKIAkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIGRldi0+YWRkcl9sZW4pOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTExLDEzICsxMTI0LDEzIEBACiBzdGF0aWMgdm9pZCBhbGJfZmFzdGVuX21hY19zd2FwKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlMSwKIAkJCQlzdHJ1Y3Qgc2xhdmUgKnNsYXZlMikKIHsKLQlpbnQgc2xhdmVzX3N0YXRlX2RpZmZlciA9IChTTEFWRV9JU19PSyhzbGF2ZTEpICE9IFNMQVZFX0lTX09LKHNsYXZlMikpOworCWludCBzbGF2ZXNfc3RhdGVfZGlmZmVyID0gKGJvbmRfc2xhdmVfY2FuX3R4KHNsYXZlMSkgIT0gYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUyKSk7CiAJc3RydWN0IHNsYXZlICpkaXNhYmxlZF9zbGF2ZSA9IE5VTEw7CiAKIAlBU1NFUlRfUlROTCgpOwogCiAJLyogZmFzdGVuIHRoZSBjaGFuZ2UgaW4gdGhlIHN3aXRjaCAqLwotCWlmIChTTEFWRV9JU19PSyhzbGF2ZTEpKSB7CisJaWYgKGJvbmRfc2xhdmVfY2FuX3R4KHNsYXZlMSkpIHsKIAkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzbGF2ZTEsIHNsYXZlMS0+ZGV2LT5kZXZfYWRkciwgZmFsc2UpOwogCQlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKIAkJCS8qIGluZm9ybSB0aGUgY2xpZW50cyB0aGF0IHRoZSBtYWMgYWRkcmVzcwpAQCAtMTEyOSw3ICsxMTQyLDcgQEAKIAkJZGlzYWJsZWRfc2xhdmUgPSBzbGF2ZTE7CiAJfQogCi0JaWYgKFNMQVZFX0lTX09LKHNsYXZlMikpIHsKKwlpZiAoYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUyKSkgewogCQlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHNsYXZlMiwgc2xhdmUyLT5kZXYtPmRldl9hZGRyLCBmYWxzZSk7CiAJCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgewogCQkJLyogaW5mb3JtIHRoZSBjbGllbnRzIHRoYXQgdGhlIG1hYyBhZGRyZXNzCkBAIC0xMzU4LDYgKzEzNzEsNzcgQEAKIAkJcmxiX2RlaW5pdGlhbGl6ZShib25kKTsKIH0KIAorc3RhdGljIGludCBib25kX2RvX2FsYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kLAorCQlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBldGhoZHIgKmV0aF9kYXRhID0gZXRoX2hkcihza2IpOworCisJaWYgKCF0eF9zbGF2ZSkgeworCQkvKiB1bmJhbGFuY2VkIG9yIHVuYXNzaWduZWQsIHNlbmQgdGhyb3VnaCBwcmltYXJ5ICovCisJCXR4X3NsYXZlID0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKKwkJaWYgKGJvbmQtPnBhcmFtcy50bGJfZHluYW1pY19sYikKKwkJCWJvbmRfaW5mby0+dW5iYWxhbmNlZF9sb2FkICs9IHNrYi0+bGVuOworCX0KKworCWlmICh0eF9zbGF2ZSAmJiBib25kX3NsYXZlX2Nhbl90eCh0eF9zbGF2ZSkpIHsKKwkJaWYgKHR4X3NsYXZlICE9IHJjdV9kZXJlZmVyZW5jZShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkpIHsKKwkJCWV0aGVyX2FkZHJfY29weShldGhfZGF0YS0+aF9zb3VyY2UsCisJCQkJCXR4X3NsYXZlLT5kZXYtPmRldl9hZGRyKTsKKwkJfQorCisJCWJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCB0eF9zbGF2ZS0+ZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHR4X3NsYXZlICYmIGJvbmQtPnBhcmFtcy50bGJfZHluYW1pY19sYikgeworCQlfbG9ja190eF9oYXNodGJsKGJvbmQpOworCQlfX3RsYl9jbGVhcl9zbGF2ZShib25kLCB0eF9zbGF2ZSwgMCk7CisJCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKKwl9CisKKwkvKiBubyBzdWl0YWJsZSBpbnRlcmZhY2UsIGZyYW1lIG5vdCBzZW50ICovCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK291dDoKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitpbnQgYm9uZF90bGJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBuZXRkZXZfcHJpdihib25kX2Rldik7CisJc3RydWN0IGV0aGhkciAqZXRoX2RhdGE7CisJc3RydWN0IHNsYXZlICp0eF9zbGF2ZSA9IE5VTEw7CisJdTMyIGhhc2hfaW5kZXg7CisKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCWV0aF9kYXRhID0gZXRoX2hkcihza2IpOworCisJLyogRG8gbm90IFRYIGJhbGFuY2UgYW55IG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KKwlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aF9kYXRhLT5oX2Rlc3QpKSB7CisJCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgeworCQljYXNlIGh0b25zKEVUSF9QX0lQKToKKwkJY2FzZSBodG9ucyhFVEhfUF9JUFgpOgorCQkgICAgLyogSW4gY2FzZSBvZiBJUFgsIGl0IHdpbGwgZmFsYmFjayB0byBMMiBoYXNoICovCisJCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CisJCQloYXNoX2luZGV4ID0gYm9uZF94bWl0X2hhc2goYm9uZCwgc2tiKTsKKwkJCWlmIChib25kLT5wYXJhbXMudGxiX2R5bmFtaWNfbGIpIHsKKwkJCQl0eF9zbGF2ZSA9IHRsYl9jaG9vc2VfY2hhbm5lbChib25kLAorCQkJCQkJCSAgICAgIGhhc2hfaW5kZXggJiAweEZGLAorCQkJCQkJCSAgICAgIHNrYi0+bGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKKwkJCQlpbnQgaWR4ID0gaGFzaF9pbmRleCAlIGJvbmQtPnNsYXZlX2NudDsKKworCQkJCWJvbmRfZm9yX2VhY2hfc2xhdmVfcmN1KGJvbmQsIHR4X3NsYXZlLCBpdGVyKQorCQkJCQlpZiAoLS1pZHggPCAwKQorCQkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gYm9uZF9kb19hbGJfeG1pdChza2IsIGJvbmQsIHR4X3NsYXZlKTsKK30KKwogaW50IGJvbmRfYWxiX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoYm9uZF9kZXYpOwpAQCAtMTM2Niw3ICsxNDUwLDcgQEAKIAlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlID0gTlVMTDsKIAlzdGF0aWMgY29uc3QgX19iZTMyIGlwX2JjYXN0ID0gaHRvbmwoMHhmZmZmZmZmZik7CiAJaW50IGhhc2hfc2l6ZSA9IDA7Ci0JaW50IGRvX3R4X2JhbGFuY2UgPSAxOworCWJvb2wgZG9fdHhfYmFsYW5jZSA9IHRydWU7CiAJdTMyIGhhc2hfaW5kZXggPSAwOwogCWNvbnN0IHU4ICpoYXNoX3N0YXJ0ID0gTlVMTDsKIAlzdHJ1Y3QgaXB2NmhkciAqaXA2aGRyOwpAQCAtMTM4MSw3ICsxNDY1LDcgQEAKIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWxfNjRiaXRzKGV0aF9kYXRhLT5oX2Rlc3QsIG1hY19iY2FzdCkgfHwKIAkJICAgIChpcGgtPmRhZGRyID09IGlwX2JjYXN0KSB8fAogCQkgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JR01QKSkgewotCQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCQlkb190eF9iYWxhbmNlID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQogCQloYXNoX3N0YXJ0ID0gKGNoYXIgKikmKGlwaC0+ZGFkZHIpOwpAQCAtMTM5Myw3ICsxNDc3LDcgQEAKIAkJICogdGhhdCBoZXJlIGp1c3QgaW4gY2FzZS4KIAkJICovCiAJCWlmIChldGhlcl9hZGRyX2VxdWFsXzY0Yml0cyhldGhfZGF0YS0+aF9kZXN0LCBtYWNfYmNhc3QpKSB7Ci0JCQlkb190eF9iYWxhbmNlID0gMDsKKwkJCWRvX3R4X2JhbGFuY2UgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE0MDEsNyArMTQ4NSw3IEBACiAJCSAqIGJyb2FkY2FzdHMgaW4gSVB2NC4KIAkJICovCiAJCWlmIChldGhlcl9hZGRyX2VxdWFsXzY0Yml0cyhldGhfZGF0YS0+aF9kZXN0LCBtYWNfdjZfYWxsbWNhc3QpKSB7Ci0JCQlkb190eF9iYWxhbmNlID0gMDsKKwkJCWRvX3R4X2JhbGFuY2UgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE0MTEsNyArMTQ5NSw3IEBACiAJCSAqLwogCQlpcDZoZHIgPSBpcHY2X2hkcihza2IpOwogCQlpZiAoaXB2Nl9hZGRyX2FueSgmaXA2aGRyLT5zYWRkcikpIHsKLQkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJZG9fdHhfYmFsYW5jZSA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQyMSw3ICsxNTA1LDcgQEAKIAljYXNlIEVUSF9QX0lQWDoKIAkJaWYgKGlweF9oZHIoc2tiKS0+aXB4X2NoZWNrc3VtICE9IElQWF9OT19DSEVDS1NVTSkgewogCQkJLyogc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhpcyBwYWNrZXQgKi8KLQkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJZG9fdHhfYmFsYW5jZSA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQzMCw3ICsxNTE0LDcgQEAKIAkJCSAqIHRoaXMgZmFtaWx5IHNpbmNlIGl0IGhhcyBhbiAiQVJQIiBsaWtlCiAJCQkgKiBtZWNoYW5pc20KIAkJCSAqLwotCQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCQlkb190eF9iYWxhbmNlID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNDM4LDEyICsxNTIyLDEyIEBACiAJCWhhc2hfc2l6ZSA9IEVUSF9BTEVOOwogCQlicmVhazsKIAljYXNlIEVUSF9QX0FSUDoKLQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCWRvX3R4X2JhbGFuY2UgPSBmYWxzZTsKIAkJaWYgKGJvbmRfaW5mby0+cmxiX2VuYWJsZWQpCiAJCQl0eF9zbGF2ZSA9IHJsYl9hcnBfeG1pdChza2IsIGJvbmQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkb190eF9iYWxhbmNlID0gMDsKKwkJZG9fdHhfYmFsYW5jZSA9IGZhbHNlOwogCQlicmVhazsKIAl9CiAKQEAgLTE0NTIsMzIgKzE1MzYsNyBAQAogCQl0eF9zbGF2ZSA9IHRsYl9jaG9vc2VfY2hhbm5lbChib25kLCBoYXNoX2luZGV4LCBza2ItPmxlbik7CiAJfQogCi0JaWYgKCF0eF9zbGF2ZSkgewotCQkvKiB1bmJhbGFuY2VkIG9yIHVuYXNzaWduZWQsIHNlbmQgdGhyb3VnaCBwcmltYXJ5ICovCi0JCXR4X3NsYXZlID0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKLQkJYm9uZF9pbmZvLT51bmJhbGFuY2VkX2xvYWQgKz0gc2tiLT5sZW47Ci0JfQotCi0JaWYgKHR4X3NsYXZlICYmIFNMQVZFX0lTX09LKHR4X3NsYXZlKSkgewotCQlpZiAodHhfc2xhdmUgIT0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSkgewotCQkJZXRoZXJfYWRkcl9jb3B5KGV0aF9kYXRhLT5oX3NvdXJjZSwKLQkJCQkJdHhfc2xhdmUtPmRldi0+ZGV2X2FkZHIpOwotCQl9Ci0KLQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHR4X3NsYXZlLT5kZXYpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodHhfc2xhdmUpIHsKLQkJX2xvY2tfdHhfaGFzaHRibChib25kKTsKLQkJX190bGJfY2xlYXJfc2xhdmUoYm9uZCwgdHhfc2xhdmUsIDApOwotCQlfdW5sb2NrX3R4X2hhc2h0YmwoYm9uZCk7Ci0JfQotCi0JLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLwotCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci1vdXQ6Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKKwlyZXR1cm4gYm9uZF9kb19hbGJfeG1pdChza2IsIGJvbmQsIHR4X3NsYXZlKTsKIH0KIAogdm9pZCBib25kX2FsYl9tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE1MTQsOCArMTU3MywxMCBAQAogCQkJLyogSWYgdXBkYXRpbmcgY3VycmVudF9hY3RpdmUsIHVzZSBhbGwgY3VycmVudGx5CiAJCQkgKiB1c2VyIG1hYyBhZGRyZXNlcyAoIXN0cmljdF9tYXRjaCkuICBPdGhlcndpc2UsIG9ubHkKIAkJCSAqIHVzZSBtYWMgb2YgdGhlIHNsYXZlIGRldmljZS4KKwkJCSAqIEluIFJMQiBtb2RlLCB3ZSBhbHdheXMgdXNlIHN0cmljdCBtYXRjaGVzLgogCQkJICovCi0JCQlzdHJpY3RfbWF0Y2ggPSAoc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpOworCQkJc3RyaWN0X21hdGNoID0gKHNsYXZlICE9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlIHx8CisJCQkJCWJvbmRfaW5mby0+cmxiX2VuYWJsZWQpOwogCQkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzbGF2ZSwgc2xhdmUtPmRldi0+ZGV2X2FkZHIsCiAJCQkJCQkgIHN0cmljdF9tYXRjaCk7CiAJCX0KQEAgLTE3MTksNyArMTc4MCw3IEBACiAJLyogaW4gVExCIG1vZGUsIHRoZSBzbGF2ZSBtaWdodCBmbGlwIGRvd24vdXAgd2l0aCB0aGUgb2xkIGRldl9hZGRyLAogCSAqIGFuZCB0aHVzIGZpbHRlciBib25kLT5kZXZfYWRkcidzIHBhY2tldHMsIHNvIGZvcmNlIGJvbmQncyBtYWMKIAkgKi8KLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgeworCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX1RMQikgewogCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CiAJCXU4IHRtcF9hZGRyW0VUSF9BTEVOXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oCmluZGV4IGUwOWRkNGJmLi41ZmM3NmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oCkBAIC0xNzUsNiArMTc1LDcgQEAKIHZvaWQgYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBjaGFyIGxpbmspOwogdm9pZCBib25kX2FsYl9oYW5kbGVfYWN0aXZlX2NoYW5nZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpuZXdfc2xhdmUpOwogaW50IGJvbmRfYWxiX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KTsKK2ludCBib25kX3RsYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldik7CiB2b2lkIGJvbmRfYWxiX21vbml0b3Ioc3RydWN0IHdvcmtfc3RydWN0ICopOwogaW50IGJvbmRfYWxiX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHZvaWQgKmFkZHIpOwogdm9pZCBib25kX2FsYl9jbGVhcl92bGFuKHN0cnVjdCBib25kaW5nICpib25kLCB1bnNpZ25lZCBzaG9ydCB2bGFuX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfZGVidWdmcy5jCmluZGV4IDJkM2Y3ZmEuLjY1OGU3NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2RlYnVnZnMuYwpAQCAtMjMsNyArMjMsNyBAQAogCXN0cnVjdCBybGJfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvOwogCXUzMiBoYXNoX2luZGV4OwogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BTEIpCisJaWYgKEJPTkRfTU9ERShib25kKSAhPSBCT05EX01PREVfQUxCKQogCQlyZXR1cm4gMDsKIAogCXNlcV9wcmludGYobSwgIlNvdXJjZUlQICAgICAgICBEZXN0aW5hdGlvbklQICAgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggZDNhNjc4OS4uMDRmMzVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAlpZiAoIWJvbmRfaGFzX3NsYXZlcyhib25kKSkKIAkJZ290byBkb3duOwogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpCisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQogCQlyZXR1cm4gYm9uZF8zYWRfc2V0X2NhcnJpZXIoYm9uZCk7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpdGVyKSB7CkBAIC00OTcsNyArNDk3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCWludCBlcnIgPSAwOwogCi0JaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwlpZiAoYm9uZF91c2VzX3ByaW1hcnkoYm9uZCkpIHsKIAkJLyogd3JpdGUgbG9jayBhbHJlYWR5IGFjcXVpcmVkICovCiAJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgewogCQkJZXJyID0gZGV2X3NldF9wcm9taXNjdWl0eShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LApAQCAtNTIzLDcgKzUyMyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJaWYgKGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKSB7CiAJCS8qIHdyaXRlIGxvY2sgYWxyZWFkeSBhY3F1aXJlZCAqLwogCQlpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKIAkJCWVyciA9IGRldl9zZXRfYWxsbXVsdGkoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldiwKQEAgLTU3NCw3ICs1NzQsNyBAQAogCWRldl91Y191bnN5bmMoc2xhdmVfZGV2LCBib25kX2Rldik7CiAJZGV2X21jX3Vuc3luYyhzbGF2ZV9kZXYsIGJvbmRfZGV2KTsKIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCS8qIGRlbCBsYWNwZHUgbWMgYWRkciBmcm9tIG1jIGxpc3QgKi8KIAkJdTggbGFjcGR1X211bHRpY2FzdFtFVEhfQUxFTl0gPSBNVUxUSUNBU1RfTEFDUERVX0FERFI7CiAKQEAgLTU4NSw4ICs1ODUsOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWN0aXZlIHNsYXZlIGNoYW5nZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBVcGRhdGUgdGhlIGhhcmR3YXJlIGFkZHJlc3MgbGlzdCBhbmQgcHJvbWlzYy9hbGxtdWx0aSBmb3IgdGhlIG5ldyBhbmQKLSAqIG9sZCBhY3RpdmUgc2xhdmVzIChpZiBhbnkpLiAgTW9kZXMgdGhhdCBhcmUgIVVTRVNfUFJJTUFSWSBrZWVwIGFsbAotICogc2xhdmVzIHVwIGRhdGUgYXQgYWxsIHRpbWVzOyBvbmx5IHRoZSBVU0VTX1BSSU1BUlkgbW9kZXMgbmVlZCB0byBjYWxsCisgKiBvbGQgYWN0aXZlIHNsYXZlcyAoaWYgYW55KS4gIE1vZGVzIHRoYXQgYXJlIG5vdCB1c2luZyBwcmltYXJ5IGtlZXAgYWxsCisgKiBzbGF2ZXMgdXAgZGF0ZSBhdCBhbGwgdGltZXM7IG9ubHkgdGhlIG1vZGVzIHRoYXQgdXNlIHByaW1hcnkgbmVlZCB0byBjYWxsCiAgKiB0aGlzIGZ1bmN0aW9uIHRvIHN3YXAgdGhlc2Ugc2V0dGluZ3MgZHVyaW5nIGEgZmFpbG92ZXIuCiAgKi8KIHN0YXRpYyB2b2lkIGJvbmRfaHdfYWRkcl9zd2FwKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKm5ld19hY3RpdmUsCkBAIC03NDcsNyArNzQ3LDcgQEAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpdGVyKSB7CiAJCWlmIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApCiAJCQlyZXR1cm4gc2xhdmU7Ci0JCWlmIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfQkFDSyAmJiBJU19VUChzbGF2ZS0+ZGV2KSAmJgorCQlpZiAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX0JBQ0sgJiYgYm9uZF9zbGF2ZV9pc191cChzbGF2ZSkgJiYKIAkJICAgIHNsYXZlLT5kZWxheSA8IG1pbnRpbWUpIHsKIAkJCW1pbnRpbWUgPSBzbGF2ZS0+ZGVsYXk7CiAJCQliZXN0c2xhdmUgPSBzbGF2ZTsKQEAgLTgwMSw3ICs4MDEsNyBAQAogCQluZXdfYWN0aXZlLT5sYXN0X2xpbmtfdXAgPSBqaWZmaWVzOwogCiAJCWlmIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19CQUNLKSB7Ci0JCQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkJaWYgKGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKSB7CiAJCQkJcHJfaW5mbygiJXM6IG1ha2luZyBpbnRlcmZhY2UgJXMgdGhlIG5ldyBhY3RpdmUgb25lICVkIG1zIGVhcmxpZXJcbiIsCiAJCQkJCWJvbmQtPmRldi0+bmFtZSwgbmV3X2FjdGl2ZS0+ZGV2LT5uYW1lLAogCQkJCQkoYm9uZC0+cGFyYW1zLnVwZGVsYXkgLSBuZXdfYWN0aXZlLT5kZWxheSkgKiBib25kLT5wYXJhbXMubWlpbW9uKTsKQEAgLTgxMCwyMCArODEwLDIwIEBACiAJCQluZXdfYWN0aXZlLT5kZWxheSA9IDA7CiAJCQluZXdfYWN0aXZlLT5saW5rID0gQk9ORF9MSU5LX1VQOwogCi0JCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkKKwkJCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkKIAkJCQlib25kXzNhZF9oYW5kbGVfbGlua19jaGFuZ2UobmV3X2FjdGl2ZSwgQk9ORF9MSU5LX1VQKTsKIAogCQkJaWYgKGJvbmRfaXNfbGIoYm9uZCkpCiAJCQkJYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKGJvbmQsIG5ld19hY3RpdmUsIEJPTkRfTElOS19VUCk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkJaWYgKGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKSB7CiAJCQkJcHJfaW5mbygiJXM6IG1ha2luZyBpbnRlcmZhY2UgJXMgdGhlIG5ldyBhY3RpdmUgb25lXG4iLAogCQkJCQlib25kLT5kZXYtPm5hbWUsIG5ld19hY3RpdmUtPmRldi0+bmFtZSk7CiAJCQl9CiAJCX0KIAl9CiAKLQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkKKwlpZiAoYm9uZF91c2VzX3ByaW1hcnkoYm9uZCkpCiAJCWJvbmRfaHdfYWRkcl9zd2FwKGJvbmQsIG5ld19hY3RpdmUsIG9sZF9hY3RpdmUpOwogCiAJaWYgKGJvbmRfaXNfbGIoYm9uZCkpIHsKQEAgLTgzOCw3ICs4MzgsNyBAQAogCQlyY3VfYXNzaWduX3BvaW50ZXIoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUsIG5ld19hY3RpdmUpOwogCX0KIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CiAJCWlmIChvbGRfYWN0aXZlKQogCQkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3Mob2xkX2FjdGl2ZSwKIAkJCQkJCSAgICAgIEJPTkRfU0xBVkVfTk9USUZZX05PVyk7CkBAIC04NzYsOCArODc2LDggQEAKIAkgKiByZXNlbmQgb25seSBpZiBib25kIGlzIGJyb3VnaHQgdXAgd2l0aCB0aGUgYWZmZWN0ZWQKIAkgKiBib25kaW5nIG1vZGVzIGFuZCB0aGUgcmV0cmFuc21pc3Npb24gaXMgZW5hYmxlZCAqLwogCWlmIChuZXRpZl9ydW5uaW5nKGJvbmQtPmRldikgJiYgKGJvbmQtPnBhcmFtcy5yZXNlbmRfaWdtcCA+IDApICYmCi0JICAgICgoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSAmJiBuZXdfYWN0aXZlKSB8fAotCSAgICAgYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1JPVU5EUk9CSU4pKSB7CisJICAgICgoYm9uZF91c2VzX3ByaW1hcnkoYm9uZCkgJiYgbmV3X2FjdGl2ZSkgfHwKKwkgICAgIEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfUk9VTkRST0JJTikpIHsKIAkJYm9uZC0+aWdtcF9yZXRyYW5zID0gYm9uZC0+cGFyYW1zLnJlc2VuZF9pZ21wOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm9uZC0+d3EsICZib25kLT5tY2FzdF93b3JrLCAxKTsKIAl9CkBAIC05NTgsNyArOTU4LDcgQEAKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaXRlcikKLQkJaWYgKElTX1VQKHNsYXZlLT5kZXYpKQorCQlpZiAoYm9uZF9zbGF2ZV9pc191cChzbGF2ZSkpCiAJCQlzbGF2ZV9kaXNhYmxlX25ldHBvbGwoc2xhdmUpOwogfQogCkBAIC0xMDM4LDYgKzEwMzgsNyBAQAogCiAJaWYgKCFib25kX2hhc19zbGF2ZXMoYm9uZCkpCiAJCWdvdG8gZG9uZTsKKwl2bGFuX2ZlYXR1cmVzICY9IE5FVElGX0ZfQUxMX0ZPUl9BTEw7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpdGVyKSB7CiAJCXZsYW5fZmVhdHVyZXMgPSBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzKHZsYW5fZmVhdHVyZXMsCkBAIC0xMDg0LDcgKzEwODUsNyBAQAogCQkJCQkgICAgc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CiAJaWYgKGJvbmRfaXNfc2xhdmVfaW5hY3RpdmUoc2xhdmUpKSB7Ci0JCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCICYmCisJCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX0FMQiAmJgogCQkgICAgc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfQlJPQURDQVNUICYmCiAJCSAgICBza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9NVUxUSUNBU1QpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0xMTI2LDcgKzExMjcsNyBAQAogCiAJc2tiLT5kZXYgPSBib25kLT5kZXY7CiAKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQiAmJgorCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX0FMQiAmJgogCSAgICBib25kLT5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQgJiYKIAkgICAgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfSE9TVCkgewogCkBAIC0xMTYzLDYgKzExNjQsMzUgQEAKIAlydG1zZ19pZmluZm8oUlRNX05FV0xJTkssIHNsYXZlX2RldiwgSUZGX1NMQVZFLCBHRlBfS0VSTkVMKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzbGF2ZSAqYm9uZF9hbGxvY19zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gTlVMTDsKKworCXNsYXZlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNsYXZlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbGF2ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJU0xBVkVfQURfSU5GTyhzbGF2ZSkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRfc2xhdmVfaW5mbyksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFTTEFWRV9BRF9JTkZPKHNsYXZlKSkgeworCQkJa2ZyZWUoc2xhdmUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHNsYXZlOworfQorCitzdGF0aWMgdm9pZCBib25kX2ZyZWVfc2xhdmUoc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZ2V0X2JvbmRfYnlfc2xhdmUoc2xhdmUpOworCisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQorCQlrZnJlZShTTEFWRV9BRF9JTkZPKHNsYXZlKSk7CisKKwlrZnJlZShzbGF2ZSk7Cit9CisKIC8qIGVuc2xhdmUgZGV2aWNlIDxzbGF2ZT4gdG8gYm9uZCBkZXZpY2UgPG1hc3Rlcj4gKi8KIGludCBib25kX2Vuc2xhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQogewpAQCAtMTI2OSw3ICsxMjk5LDcgQEAKIAkJaWYgKCFib25kX2hhc19zbGF2ZXMoYm9uZCkpIHsKIAkJCXByX3dhcm4oIiVzOiBXYXJuaW5nOiBUaGUgZmlyc3Qgc2xhdmUgZGV2aWNlIHNwZWNpZmllZCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgdGhlIE1BQyBhZGRyZXNzXG4iLAogCQkJCWJvbmRfZGV2LT5uYW1lKTsKLQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCQlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKIAkJCQlib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYyA9IEJPTkRfRk9NX0FDVElWRTsKIAkJCQlwcl93YXJuKCIlczogU2V0dGluZyBmYWlsX292ZXJfbWFjIHRvIGFjdGl2ZSBmb3IgYWN0aXZlLWJhY2t1cCBtb2RlXG4iLAogCQkJCQlib25kX2Rldi0+bmFtZSk7CkBAIC0xMjkwLDExICsxMzIwLDE0IEBACiAJICAgIGJvbmQtPmRldi0+YWRkcl9hc3NpZ25fdHlwZSA9PSBORVRfQUREUl9SQU5ET00pCiAJCWJvbmRfc2V0X2Rldl9hZGRyKGJvbmQtPmRldiwgc2xhdmVfZGV2KTsKIAotCW5ld19zbGF2ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGF2ZSksIEdGUF9LRVJORUwpOworCW5ld19zbGF2ZSA9IGJvbmRfYWxsb2Nfc2xhdmUoYm9uZCk7CiAJaWYgKCFuZXdfc2xhdmUpIHsKIAkJcmVzID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5kb19mbGFnczsKIAl9CisKKwluZXdfc2xhdmUtPmJvbmQgPSBib25kOworCW5ld19zbGF2ZS0+ZGV2ID0gc2xhdmVfZGV2OwogCS8qCiAJICogU2V0IHRoZSBuZXdfc2xhdmUncyBxdWV1ZV9pZCB0byBiZSB6ZXJvLiAgUXVldWUgSUQgbWFwcGluZwogCSAqIGlzIHNldCB2aWEgc3lzZnMgb3IgbW9kdWxlIG9wdGlvbiBpZiBkZXNpcmVkLgpAQCAtMTMxNyw3ICsxMzUwLDcgQEAKIAlldGhlcl9hZGRyX2NvcHkobmV3X3NsYXZlLT5wZXJtX2h3YWRkciwgc2xhdmVfZGV2LT5kZXZfYWRkcik7CiAKIAlpZiAoIWJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjIHx8Ci0JICAgIGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKKwkgICAgQk9ORF9NT0RFKGJvbmQpICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKIAkJLyoKIAkJICogU2V0IHNsYXZlIHRvIG1hc3RlcidzIG1hYyBhZGRyZXNzLiAgVGhlIGFwcGxpY2F0aW9uIGFscmVhZHkKIAkJICogc2V0IHRoZSBtYXN0ZXIncyBtYWMgYWRkcmVzcyB0byB0aGF0IG9mIHRoZSBmaXJzdCBzbGF2ZQpAQCAtMTMzOCw4ICsxMzcxLDYgQEAKIAkJZ290byBlcnJfcmVzdG9yZV9tYWM7CiAJfQogCi0JbmV3X3NsYXZlLT5ib25kID0gYm9uZDsKLQluZXdfc2xhdmUtPmRldiA9IHNsYXZlX2RldjsKIAlzbGF2ZV9kZXYtPnByaXZfZmxhZ3MgfD0gSUZGX0JPTkRJTkc7CiAKIAlpZiAoYm9uZF9pc19sYihib25kKSkgewpAQCAtMTM1MSwxMCArMTM4MiwxMCBAQAogCQkJZ290byBlcnJfY2xvc2U7CiAJfQogCi0JLyogSWYgdGhlIG1vZGUgVVNFU19QUklNQVJZLCB0aGVuIHRoZSBmb2xsb3dpbmcgaXMgaGFuZGxlZCBieQorCS8qIElmIHRoZSBtb2RlIHVzZXMgcHJpbWFyeSwgdGhlbiB0aGUgZm9sbG93aW5nIGlzIGhhbmRsZWQgYnkKIAkgKiBib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoKS4KIAkgKi8KLQlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwlpZiAoIWJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKSB7CiAJCS8qIHNldCBwcm9taXNjdWl0eSBsZXZlbCB0byBuZXcgc2xhdmUgKi8KIAkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCQlyZXMgPSBkZXZfc2V0X3Byb21pc2N1aXR5KHNsYXZlX2RldiwgMSk7CkBAIC0xMzc3LDcgKzE0MDgsNyBAQAogCQluZXRpZl9hZGRyX3VubG9ja19iaChib25kX2Rldik7CiAJfQogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJLyogYWRkIGxhY3BkdSBtYyBhZGRyIHRvIG1jIGxpc3QgKi8KIAkJdTggbGFjcGR1X211bHRpY2FzdFtFVEhfQUxFTl0gPSBNVUxUSUNBU1RfTEFDUERVX0FERFI7CiAKQEAgLTE0NTAsNyArMTQ4MSw3IEBACiAJCSBuZXdfc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX0RPV04gPyAiRE9XTiIgOgogCQkgKG5ld19zbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVAgPyAiVVAiIDogIkJBQ0siKSk7CiAKLQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSAmJiBib25kLT5wYXJhbXMucHJpbWFyeVswXSkgeworCWlmIChib25kX3VzZXNfcHJpbWFyeShib25kKSAmJiBib25kLT5wYXJhbXMucHJpbWFyeVswXSkgewogCQkvKiBpZiB0aGVyZSBpcyBhIHByaW1hcnkgc2xhdmUsIHJlbWVtYmVyIGl0ICovCiAJCWlmIChzdHJjbXAoYm9uZC0+cGFyYW1zLnByaW1hcnksIG5ld19zbGF2ZS0+ZGV2LT5uYW1lKSA9PSAwKSB7CiAJCQlib25kLT5wcmltYXJ5X3NsYXZlID0gbmV3X3NsYXZlOwpAQCAtMTQ1OCw3ICsxNDg5LDcgQEAKIAkJfQogCX0KIAotCXN3aXRjaCAoYm9uZC0+cGFyYW1zLm1vZGUpIHsKKwlzd2l0Y2ggKEJPTkRfTU9ERShib25kKSkgewogCWNhc2UgQk9ORF9NT0RFX0FDVElWRUJBQ0tVUDoKIAkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3MobmV3X3NsYXZlLAogCQkJCQkgICAgICBCT05EX1NMQVZFX05PVElGWV9OT1cpOwpAQCAtMTQ3MSwxNCArMTUwMiwxNCBAQAogCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhuZXdfc2xhdmUsIEJPTkRfU0xBVkVfTk9USUZZX05PVyk7CiAJCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHNsYXZlICovCiAJCWlmICghcHJldl9zbGF2ZSkgewotCQkJU0xBVkVfQURfSU5GTyhuZXdfc2xhdmUpLmlkID0gMTsKKwkJCVNMQVZFX0FEX0lORk8obmV3X3NsYXZlKS0+aWQgPSAxOwogCQkJLyogSW5pdGlhbGl6ZSBBRCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgQUQgdGltZXIgaXMgY2FsbGVkIGluIDEgc2Vjb25kCiAJCQkgKiBjYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBib25kIGlzIHNldAogCQkJICovCiAJCQlib25kXzNhZF9pbml0aWFsaXplKGJvbmQsIDEwMDAvQURfVElNRVJfSU5URVJWQUwpOwogCQl9IGVsc2UgewotCQkJU0xBVkVfQURfSU5GTyhuZXdfc2xhdmUpLmlkID0KLQkJCQlTTEFWRV9BRF9JTkZPKHByZXZfc2xhdmUpLmlkICsgMTsKKwkJCVNMQVZFX0FEX0lORk8obmV3X3NsYXZlKS0+aWQgPQorCQkJCVNMQVZFX0FEX0lORk8ocHJldl9zbGF2ZSktPmlkICsgMTsKIAkJfQogCiAJCWJvbmRfM2FkX2JpbmRfc2xhdmUobmV3X3NsYXZlKTsKQEAgLTE1MzksNyArMTU3MCw3IEBACiAJYm9uZF9jb21wdXRlX2ZlYXR1cmVzKGJvbmQpOwogCWJvbmRfc2V0X2NhcnJpZXIoYm9uZCk7CiAKLQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCWlmIChib25kX3VzZXNfcHJpbWFyeShib25kKSkgewogCQlibG9ja19uZXRwb2xsX3R4KCk7CiAJCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CiAJCWJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZShib25kKTsKQEAgLTE1NjMsNyArMTU5NCw3IEBACiAJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlcihzbGF2ZV9kZXYpOwogCiBlcnJfZGV0YWNoOgotCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkKKwlpZiAoIWJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKQogCQlib25kX2h3X2FkZHJfZmx1c2goYm9uZF9kZXYsIHNsYXZlX2Rldik7CiAKIAl2bGFuX3ZpZHNfZGVsX2J5X2RldihzbGF2ZV9kZXYsIGJvbmRfZGV2KTsKQEAgLTE1ODUsNyArMTYxNiw3IEBACiAKIGVycl9yZXN0b3JlX21hYzoKIAlpZiAoIWJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjIHx8Ci0JICAgIGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKKwkgICAgQk9ORF9NT0RFKGJvbmQpICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKIAkJLyogWFhYIFRPRE8gLSBmb20gZm9sbG93IG1vZGUgbmVlZHMgdG8gY2hhbmdlIG1hc3RlcidzCiAJCSAqIE1BQyBpZiB0aGlzIHNsYXZlJ3MgTUFDIGlzIGluIHVzZSBieSB0aGUgYm9uZCwgb3IgYXQKIAkJICogbGVhc3QgcHJpbnQgYSB3YXJuaW5nLgpAQCAtMTU5OSw3ICsxNjMwLDcgQEAKIAlkZXZfc2V0X210dShzbGF2ZV9kZXYsIG5ld19zbGF2ZS0+b3JpZ2luYWxfbXR1KTsKIAogZXJyX2ZyZWU6Ci0Ja2ZyZWUobmV3X3NsYXZlKTsKKwlib25kX2ZyZWVfc2xhdmUobmV3X3NsYXZlKTsKIAogZXJyX3VuZG9fZmxhZ3M6CiAJLyogRW5zbGF2ZSBvZiBmaXJzdCBzbGF2ZSBoYXMgZmFpbGVkIGFuZCB3ZSBuZWVkIHRvIGZpeCBtYXN0ZXIncyBtYWMgKi8KQEAgLTE2NjEsNyArMTY5Miw3IEBACiAJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CiAKIAkvKiBJbmZvcm0gQUQgcGFja2FnZSBvZiB1bmJpbmRpbmcgb2Ygc2xhdmUuICovCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpCisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQogCQlib25kXzNhZF91bmJpbmRfc2xhdmUoc2xhdmUpOwogCiAJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKQEAgLTE2NzYsNyArMTcwNyw3IEBACiAJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBOVUxMOwogCiAJaWYgKCFhbGwgJiYgKCFib25kLT5wYXJhbXMuZmFpbF9vdmVyX21hYyB8fAotCQkgICAgIGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApKSB7CisJCSAgICAgQk9ORF9NT0RFKGJvbmQpICE9IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApKSB7CiAJCWlmIChldGhlcl9hZGRyX2VxdWFsXzY0Yml0cyhib25kX2Rldi0+ZGV2X2FkZHIsIHNsYXZlLT5wZXJtX2h3YWRkcikgJiYKIAkJICAgIGJvbmRfaGFzX3NsYXZlcyhib25kKSkKIAkJCXByX3dhcm4oIiVzOiBXYXJuaW5nOiB0aGUgcGVybWFuZW50IEhXYWRkciBvZiAlcyAtICVwTSAtIGlzIHN0aWxsIGluIHVzZSBieSAlcyAtIHNldCB0aGUgSFdhZGRyIG9mICVzIHRvIGEgZGlmZmVyZW50IGFkZHJlc3MgdG8gYXZvaWQgY29uZmxpY3RzXG4iLApAQCAtMTc0OCwxMCArMTc3OSwxMCBAQAogCS8qIG11c3QgZG8gdGhpcyBmcm9tIG91dHNpZGUgYW55IHNwaW5sb2NrcyAqLwogCXZsYW5fdmlkc19kZWxfYnlfZGV2KHNsYXZlX2RldiwgYm9uZF9kZXYpOwogCi0JLyogSWYgdGhlIG1vZGUgVVNFU19QUklNQVJZLCB0aGVuIHRoaXMgY2FzZXMgd2FzIGhhbmRsZWQgYWJvdmUgYnkKKwkvKiBJZiB0aGUgbW9kZSB1c2VzIHByaW1hcnksIHRoZW4gdGhpcyBjYXNlcyB3YXMgaGFuZGxlZCBhYm92ZSBieQogCSAqIGJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZSguLi4sIE5VTEwpCiAJICovCi0JaWYgKCFVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJaWYgKCFib25kX3VzZXNfcHJpbWFyeShib25kKSkgewogCQkvKiB1bnNldCBwcm9taXNjdWl0eSBsZXZlbCBmcm9tIHNsYXZlCiAJCSAqIE5PVEU6IFRoZSBORVRERVZfQ0hBTkdFQUREUiBjYWxsIGFib3ZlIG1heSBjaGFuZ2UgdGhlIHZhbHVlCiAJCSAqIG9mIHRoZSBJRkZfUFJPTUlTQyBmbGFnIGluIHRoZSBib25kX2RldiwgYnV0IHdlIG5lZWQgdGhlCkBAIC0xNzc1LDcgKzE4MDYsNyBAQAogCWRldl9jbG9zZShzbGF2ZV9kZXYpOwogCiAJaWYgKGJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjICE9IEJPTkRfRk9NX0FDVElWRSB8fAotCSAgICBib25kLT5wYXJhbXMubW9kZSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJICAgIEJPTkRfTU9ERShib25kKSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CiAJCS8qIHJlc3RvcmUgb3JpZ2luYWwgKCJwZXJtYW5lbnQiKSBtYWMgYWRkcmVzcyAqLwogCQlldGhlcl9hZGRyX2NvcHkoYWRkci5zYV9kYXRhLCBzbGF2ZS0+cGVybV9od2FkZHIpOwogCQlhZGRyLnNhX2ZhbWlseSA9IHNsYXZlX2Rldi0+dHlwZTsKQEAgLTE3ODYsNyArMTgxNyw3IEBACiAKIAlzbGF2ZV9kZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9CT05ESU5HOwogCi0Ja2ZyZWUoc2xhdmUpOworCWJvbmRfZnJlZV9zbGF2ZShzbGF2ZSk7CiAKIAlyZXR1cm4gMDsgIC8qIGRlbGV0aW9uIE9LICovCiB9CkBAIC0xODIxLDcgKzE4NTIsNyBAQAogewogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoYm9uZF9kZXYpOwogCi0JaW5mby0+Ym9uZF9tb2RlID0gYm9uZC0+cGFyYW1zLm1vZGU7CisJaW5mby0+Ym9uZF9tb2RlID0gQk9ORF9NT0RFKGJvbmQpOwogCWluZm8tPm1paW1vbiA9IGJvbmQtPnBhcmFtcy5taWltb247CiAKIAlpbmZvLT5udW1fc2xhdmVzID0gYm9uZC0+c2xhdmVfY250OwpAQCAtMTg3Nyw3ICsxOTA4LDcgQEAKIAkJCWlmIChzbGF2ZS0+ZGVsYXkpIHsKIAkJCQlwcl9pbmZvKCIlczogbGluayBzdGF0dXMgZG93biBmb3IgJXNpbnRlcmZhY2UgJXMsIGRpc2FibGluZyBpdCBpbiAlZCBtc1xuIiwKIAkJCQkJYm9uZC0+ZGV2LT5uYW1lLAotCQkJCQkoYm9uZC0+cGFyYW1zLm1vZGUgPT0KKwkJCQkJKEJPTkRfTU9ERShib25kKSA9PQogCQkJCQkgQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkgPwogCQkJCQkoYm9uZF9pc19hY3RpdmVfc2xhdmUoc2xhdmUpID8KIAkJCQkJICJhY3RpdmUgIiA6ICJiYWNrdXAgIikgOiAiIiwKQEAgLTE5NjgsMTAgKzE5OTksMTAgQEAKIAkJCXNsYXZlLT5saW5rID0gQk9ORF9MSU5LX1VQOwogCQkJc2xhdmUtPmxhc3RfbGlua191cCA9IGppZmZpZXM7CiAKLQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJCQkvKiBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdGhlIGFjdGl2ZSBvbmUgKi8KIAkJCQlib25kX3NldF9iYWNrdXBfc2xhdmUoc2xhdmUpOwotCQkJfSBlbHNlIGlmIChib25kLT5wYXJhbXMubW9kZSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCQl9IGVsc2UgaWYgKEJPTkRfTU9ERShib25kKSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CiAJCQkJLyogbWFrZSBpdCBpbW1lZGlhdGVseSBhY3RpdmUgKi8KIAkJCQlib25kX3NldF9hY3RpdmVfc2xhdmUoc2xhdmUpOwogCQkJfSBlbHNlIGlmIChzbGF2ZSAhPSBib25kLT5wcmltYXJ5X3NsYXZlKSB7CkBAIC0xOTg1LDcgKzIwMTYsNyBAQAogCQkJCXNsYXZlLT5kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOwogCiAJCQkvKiBub3RpZnkgYWQgdGhhdCB0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KLQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKQorCQkJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQogCQkJCWJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzbGF2ZSwgQk9ORF9MSU5LX1VQKTsKIAogCQkJaWYgKGJvbmRfaXNfbGIoYm9uZCkpCkBAIC0yMDA0LDE1ICsyMDM1LDE1IEBACiAKIAkJCXNsYXZlLT5saW5rID0gQk9ORF9MSU5LX0RPV047CiAKLQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQIHx8Ci0JCQkgICAgYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkKKwkJCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCB8fAorCQkJICAgIEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQogCQkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHNsYXZlLAogCQkJCQkJCSAgICAgIEJPTkRfU0xBVkVfTk9USUZZX05PVyk7CiAKIAkJCXByX2luZm8oIiVzOiBsaW5rIHN0YXR1cyBkZWZpbml0ZWx5IGRvd24gZm9yIGludGVyZmFjZSAlcywgZGlzYWJsaW5nIGl0XG4iLAogCQkJCWJvbmQtPmRldi0+bmFtZSwgc2xhdmUtPmRldi0+bmFtZSk7CiAKLQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKQorCQkJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQogCQkJCWJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzbGF2ZSwKIAkJCQkJCQkgICAgQk9ORF9MSU5LX0RPV04pOwogCkBAIC0yMTc1LDkgKzIyMDYsOSBAQAogICogV2hlbiB0aGUgcGF0aCBpcyB2YWxpZGF0ZWQsIGNvbGxlY3QgYW55IHZsYW4gaW5mb3JtYXRpb24gaW4gdGhlCiAgKiBwYXRoLgogICovCi1zdGF0aWMgYm9vbCBib25kX3ZlcmlmeV9kZXZpY2VfcGF0aChzdHJ1Y3QgbmV0X2RldmljZSAqc3RhcnRfZGV2LAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZW5kX2RldiwKLQkJCQkgICAgc3RydWN0IGJvbmRfdmxhbl90YWcgKnRhZ3MpCitib29sIGJvbmRfdmVyaWZ5X2RldmljZV9wYXRoKHN0cnVjdCBuZXRfZGV2aWNlICpzdGFydF9kZXYsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICplbmRfZGV2LAorCQkJICAgICBzdHJ1Y3QgYm9uZF92bGFuX3RhZyAqdGFncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXI7CiAJc3RydWN0IGxpc3RfaGVhZCAgKml0ZXI7CkBAIC0yMjg3LDggKzIzMTgsOCBAQAogCWludCBhbGVuLCBpc19hcnAgPSBza2ItPnByb3RvY29sID09IF9fY3B1X3RvX2JlMTYoRVRIX1BfQVJQKTsKIAogCWlmICghc2xhdmVfZG9fYXJwX3ZhbGlkYXRlKGJvbmQsIHNsYXZlKSkgewotCQlpZiAoKHNsYXZlX2RvX2FycF92YWxpZGF0ZV9vbmx5KGJvbmQsIHNsYXZlKSAmJiBpc19hcnApIHx8Ci0JCSAgICAhc2xhdmVfZG9fYXJwX3ZhbGlkYXRlX29ubHkoYm9uZCwgc2xhdmUpKQorCQlpZiAoKHNsYXZlX2RvX2FycF92YWxpZGF0ZV9vbmx5KGJvbmQpICYmIGlzX2FycCkgfHwKKwkJICAgICFzbGF2ZV9kb19hcnBfdmFsaWRhdGVfb25seShib25kKSkKIAkJCXNsYXZlLT5sYXN0X3J4ID0gamlmZmllczsKIAkJcmV0dXJuIFJYX0hBTkRMRVJfQU5PVEhFUjsKIAl9IGVsc2UgaWYgKCFpc19hcnApIHsKQEAgLTI0NTYsNyArMjQ4Nyw3IEBACiAJCSAqIGRvIC0gYWxsIHJlcGxpZXMgd2lsbCBiZSByeCdlZCBvbiBzYW1lIGxpbmsgY2F1c2luZyBzbGF2ZXMKIAkJICogdG8gYmUgdW5zdGFibGUgZHVyaW5nIGxvdy9ubyB0cmFmZmljIHBlcmlvZHMKIAkJICovCi0JCWlmIChJU19VUChzbGF2ZS0+ZGV2KSkKKwkJaWYgKGJvbmRfc2xhdmVfaXNfdXAoc2xhdmUpKQogCQkJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgc2xhdmUpOwogCX0KIApAQCAtMjY3OCwxMCArMjcwOSwxMCBAQAogCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKGN1cnJfYXJwX3NsYXZlLCBCT05EX1NMQVZFX05PVElGWV9MQVRFUik7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlX3JjdShib25kLCBzbGF2ZSwgaXRlcikgewotCQlpZiAoIWZvdW5kICYmICFiZWZvcmUgJiYgSVNfVVAoc2xhdmUtPmRldikpCisJCWlmICghZm91bmQgJiYgIWJlZm9yZSAmJiBib25kX3NsYXZlX2lzX3VwKHNsYXZlKSkKIAkJCWJlZm9yZSA9IHNsYXZlOwogCi0JCWlmIChmb3VuZCAmJiAhbmV3X3NsYXZlICYmIElTX1VQKHNsYXZlLT5kZXYpKQorCQlpZiAoZm91bmQgJiYgIW5ld19zbGF2ZSAmJiBib25kX3NsYXZlX2lzX3VwKHNsYXZlKSkKIAkJCW5ld19zbGF2ZSA9IHNsYXZlOwogCQkvKiBpZiB0aGUgbGluayBzdGF0ZSBpcyB1cCBhdCB0aGlzIHBvaW50LCB3ZQogCQkgKiBtYXJrIGl0IGRvd24gLSB0aGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZQpAQCAtMjY5MCw3ICsyNzIxLDcgQEAKIAkJICogb25lIHRoZSBjdXJyZW50IHNsYXZlIHNvIGl0IGlzIHN0aWxsIG1hcmtlZAogCQkgKiB1cCB3aGVuIGl0IGlzIGFjdHVhbGx5IGRvd24KIAkJICovCi0JCWlmICghSVNfVVAoc2xhdmUtPmRldikgJiYgc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CisJCWlmICghYm9uZF9zbGF2ZV9pc191cChzbGF2ZSkgJiYgc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CiAJCQlzbGF2ZS0+bGluayA9IEJPTkRfTElOS19ET1dOOwogCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkKIAkJCQlzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50Kys7CkBAIC0yODUzLDcgKzI4ODQsNyBAQAogCiAJCWJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChzbGF2ZSk7CiAKLQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCQlpZiAob2xkX3NwZWVkICE9IHNsYXZlLT5zcGVlZCkKIAkJCQlib25kXzNhZF9hZGFwdGVyX3NwZWVkX2NoYW5nZWQoc2xhdmUpOwogCQkJaWYgKG9sZF9kdXBsZXggIT0gc2xhdmUtPmR1cGxleCkKQEAgLTI4ODEsNyArMjkxMiw3IEBACiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX0NIQU5HRU5BTUU6CiAJCS8qIHdlIGRvbid0IGNhcmUgaWYgd2UgZG9uJ3QgaGF2ZSBwcmltYXJ5IHNldCAqLwotCQlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkgfHwKKwkJaWYgKCFib25kX3VzZXNfcHJpbWFyeShib25kKSB8fAogCQkgICAgIWJvbmQtPnBhcmFtcy5wcmltYXJ5WzBdKQogCQkJYnJlYWs7CiAKQEAgLTMwMTEsMjAgKzMwNDIsMTggQEAKICAqIGJvbmRfeG1pdF9oYXNoIC0gZ2VuZXJhdGUgYSBoYXNoIHZhbHVlIGJhc2VkIG9uIHRoZSB4bWl0IHBvbGljeQogICogQGJvbmQ6IGJvbmRpbmcgZGV2aWNlCiAgKiBAc2tiOiBidWZmZXIgdG8gdXNlIGZvciBoZWFkZXJzCi0gKiBAY291bnQ6IG1vZHVsbyB2YWx1ZQogICoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBleHRyYWN0IHRoZSBuZWNlc3NhcnkgaGVhZGVycyBmcm9tIHRoZSBza2IgYnVmZmVyIGFuZCB1c2UKICAqIHRoZW0gdG8gZ2VuZXJhdGUgYSBoYXNoIGJhc2VkIG9uIHRoZSB4bWl0X3BvbGljeSBzZXQgaW4gdGhlIGJvbmRpbmcgZGV2aWNlCi0gKiB3aGljaCB3aWxsIGJlIHJlZHVjZWQgbW9kdWxvIGNvdW50IGJlZm9yZSByZXR1cm5pbmcuCiAgKi8KLWludCBib25kX3htaXRfaGFzaChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvdW50KQordTMyIGJvbmRfeG1pdF9oYXNoKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbG93X2tleXMgZmxvdzsKIAl1MzIgaGFzaDsKIAogCWlmIChib25kLT5wYXJhbXMueG1pdF9wb2xpY3kgPT0gQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIgfHwKIAkgICAgIWJvbmRfZmxvd19kaXNzZWN0KGJvbmQsIHNrYiwgJmZsb3cpKQotCQlyZXR1cm4gYm9uZF9ldGhfaGFzaChza2IpICUgY291bnQ7CisJCXJldHVybiBib25kX2V0aF9oYXNoKHNrYik7CiAKIAlpZiAoYm9uZC0+cGFyYW1zLnhtaXRfcG9saWN5ID09IEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIyMyB8fAogCSAgICBib25kLT5wYXJhbXMueG1pdF9wb2xpY3kgPT0gQk9ORF9YTUlUX1BPTElDWV9FTkNBUDIzKQpAQCAtMzAzNSw3ICszMDY0LDcgQEAKIAloYXNoIF49IChoYXNoID4+IDE2KTsKIAloYXNoIF49IChoYXNoID4+IDgpOwogCi0JcmV0dXJuIGhhc2ggJSBjb3VudDsKKwlyZXR1cm4gaGFzaDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgZW50cnkgcG9pbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzA0Niw3ICszMDc1LDcgQEAKIAkJCSAgYm9uZF9yZXNlbmRfaWdtcF9qb2luX3JlcXVlc3RzX2RlbGF5ZWQpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZib25kLT5hbGJfd29yaywgYm9uZF9hbGJfbW9uaXRvcik7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmJvbmQtPm1paV93b3JrLCBib25kX21paV9tb25pdG9yKTsKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApCiAJCUlOSVRfREVMQVlFRF9XT1JLKCZib25kLT5hcnBfd29yaywgYm9uZF9hY3RpdmViYWNrdXBfYXJwX21vbik7CiAJZWxzZQogCQlJTklUX0RFTEFZRURfV09SSygmYm9uZC0+YXJwX3dvcmssIGJvbmRfbG9hZGJhbGFuY2VfYXJwX21vbik7CkBAIC0zMDczLDcgKzMxMDIsNyBAQAogCWlmIChib25kX2hhc19zbGF2ZXMoYm9uZCkpIHsKIAkJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOwogCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpdGVyKSB7Ci0JCQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKQorCQkJaWYgKGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpCiAJCQkJJiYgKHNsYXZlICE9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSkgewogCQkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHNsYXZlLAogCQkJCQkJCSAgICAgIEJPTkRfU0xBVkVfTk9USUZZX05PVyk7CkBAIC0zMDkyLDkgKzMxMjEsMTAgQEAKIAkJLyogYm9uZF9hbGJfaW5pdGlhbGl6ZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHRpbWVyCiAJCSAqIGlzIHN0YXJ0ZWQuCiAJCSAqLwotCQlpZiAoYm9uZF9hbGJfaW5pdGlhbGl6ZShib25kLCAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpKQorCQlpZiAoYm9uZF9hbGJfaW5pdGlhbGl6ZShib25kLCAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BTEIpKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm9uZC0+d3EsICZib25kLT5hbGJfd29yaywgMCk7CisJCWlmIChib25kLT5wYXJhbXMudGxiX2R5bmFtaWNfbGIpCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm9uZC0+d3EsICZib25kLT5hbGJfd29yaywgMCk7CiAJfQogCiAJaWYgKGJvbmQtPnBhcmFtcy5taWltb24pICAvKiBsaW5rIGNoZWNrIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuICovCkBAIC0zMTA1LDcgKzMxMzUsNyBAQAogCQlib25kLT5yZWN2X3Byb2JlID0gYm9uZF9hcnBfcmN2OwogCX0KIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhib25kLT53cSwgJmJvbmQtPmFkX3dvcmssIDApOwogCQkvKiByZWdpc3RlciB0byByZWNlaXZlIExBQ1BEVXMgKi8KIAkJYm9uZC0+cmVjdl9wcm9iZSA9IGJvbmRfM2FkX2xhY3BkdV9yZWN2OwpAQCAtMzMxMCw3ICszMzQwLDcgQEAKIAogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJaWYgKGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpKSB7CiAJCXNsYXZlID0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKIAkJaWYgKHNsYXZlKSB7CiAJCQlkZXZfdWNfc3luYyhzbGF2ZS0+ZGV2LCBib25kX2Rldik7CkBAIC0zNDY0LDcgKzM0OTQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJaW50IHJlcyA9IDA7CiAKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BTEIpCiAJCXJldHVybiBib25kX2FsYl9zZXRfbWFjX2FkZHJlc3MoYm9uZF9kZXYsIGFkZHIpOwogCiAKQEAgLTM0NzUsNyArMzUwNSw3IEBACiAJICogUmV0dXJuaW5nIGFuIGVycm9yIGNhdXNlcyBpZmVuc2xhdmUgdG8gZmFpbC4KIAkgKi8KIAlpZiAoYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMgJiYKLQkgICAgYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkKKwkgICAgQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApCiAJCXJldHVybiAwOwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNhLT5zYV9kYXRhKSkKQEAgLTM1NTUsNyArMzU4NSw3IEBACiAJLyogSGVyZSB3ZSBzdGFydCBmcm9tIHRoZSBzbGF2ZSB3aXRoIHNsYXZlX2lkICovCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKIAkJaWYgKC0taSA8IDApIHsKLQkJCWlmIChzbGF2ZV9jYW5fdHgoc2xhdmUpKSB7CisJCQlpZiAoYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUpKSB7CiAJCQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTM1NjcsNyArMzU5Nyw3IEBACiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKIAkJaWYgKC0taSA8IDApCiAJCQlicmVhazsKLQkJaWYgKHNsYXZlX2Nhbl90eChzbGF2ZSkpIHsKKwkJaWYgKGJvbmRfc2xhdmVfY2FuX3R4KHNsYXZlKSkgewogCQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0zNjI0LDcgKzM2NTQsNyBAQAogCSAqLwogCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCAmJiBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewogCQlzbGF2ZSA9IHJjdV9kZXJlZmVyZW5jZShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSk7Ci0JCWlmIChzbGF2ZSAmJiBzbGF2ZV9jYW5fdHgoc2xhdmUpKQorCQlpZiAoc2xhdmUgJiYgYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUpKQogCQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCQllbHNlCiAJCQlib25kX3htaXRfc2xhdmVfaWQoYm9uZCwgc2tiLCAwKTsKQEAgLTM2NjIsNyArMzY5Miw3IEBACiB7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBuZXRkZXZfcHJpdihib25kX2Rldik7CiAKLQlib25kX3htaXRfc2xhdmVfaWQoYm9uZCwgc2tiLCBib25kX3htaXRfaGFzaChib25kLCBza2IsIGJvbmQtPnNsYXZlX2NudCkpOworCWJvbmRfeG1pdF9zbGF2ZV9pZChib25kLCBza2IsIGJvbmRfeG1pdF9oYXNoKGJvbmQsIHNrYikgJSBib25kLT5zbGF2ZV9jbnQpOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KQEAgLTM2NzcsNyArMzcwNyw3IEBACiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKIAkJaWYgKGJvbmRfaXNfbGFzdF9zbGF2ZShib25kLCBzbGF2ZSkpCiAJCQlicmVhazsKLQkJaWYgKElTX1VQKHNsYXZlLT5kZXYpICYmIHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgeworCQlpZiAoYm9uZF9zbGF2ZV9pc191cChzbGF2ZSkgJiYgc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCiAJCQlpZiAoIXNrYjIpIHsKQEAgLTM2ODksNyArMzcxOSw3IEBACiAJCQlib25kX2Rldl9xdWV1ZV94bWl0KGJvbmQsIHNrYjIsIHNsYXZlLT5kZXYpOwogCQl9CiAJfQotCWlmIChzbGF2ZSAmJiBJU19VUChzbGF2ZS0+ZGV2KSAmJiBzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApCisJaWYgKHNsYXZlICYmIGJvbmRfc2xhdmVfaXNfdXAoc2xhdmUpICYmIHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkKIAkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCWVsc2UKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTM3MTQsNyArMzc0NCw3IEBACiAJLyogRmluZCBvdXQgaWYgYW55IHNsYXZlcyBoYXZlIHRoZSBzYW1lIG1hcHBpbmcgYXMgdGhpcyBza2IuICovCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKIAkJaWYgKHNsYXZlLT5xdWV1ZV9pZCA9PSBza2ItPnF1ZXVlX21hcHBpbmcpIHsKLQkJCWlmIChzbGF2ZV9jYW5fdHgoc2xhdmUpKSB7CisJCQlpZiAoYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUpKSB7CiAJCQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMzc1NSwxMiArMzc4NSwxMSBAQAogewogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChUWF9RVUVVRV9PVkVSUklERShib25kLT5wYXJhbXMubW9kZSkpIHsKLQkJaWYgKCFib25kX3NsYXZlX292ZXJyaWRlKGJvbmQsIHNrYikpCi0JCQlyZXR1cm4gTkVUREVWX1RYX09LOwotCX0KKwlpZiAoYm9uZF9zaG91bGRfb3ZlcnJpZGVfdHhfcXVldWUoYm9uZCkgJiYKKwkgICAgIWJvbmRfc2xhdmVfb3ZlcnJpZGUoYm9uZCwgc2tiKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotCXN3aXRjaCAoYm9uZC0+cGFyYW1zLm1vZGUpIHsKKwlzd2l0Y2ggKEJPTkRfTU9ERShib25kKSkgewogCWNhc2UgQk9ORF9NT0RFX1JPVU5EUk9CSU46CiAJCXJldHVybiBib25kX3htaXRfcm91bmRyb2Jpbihza2IsIGRldik7CiAJY2FzZSBCT05EX01PREVfQUNUSVZFQkFDS1VQOgpAQCAtMzc3MiwxMiArMzgwMSwxMyBAQAogCWNhc2UgQk9ORF9NT0RFXzgwMjNBRDoKIAkJcmV0dXJuIGJvbmRfM2FkX3htaXRfeG9yKHNrYiwgZGV2KTsKIAljYXNlIEJPTkRfTU9ERV9BTEI6Ci0JY2FzZSBCT05EX01PREVfVExCOgogCQlyZXR1cm4gYm9uZF9hbGJfeG1pdChza2IsIGRldik7CisJY2FzZSBCT05EX01PREVfVExCOgorCQlyZXR1cm4gYm9uZF90bGJfeG1pdChza2IsIGRldik7CiAJZGVmYXVsdDoKIAkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiwgbW9kZSBhbHJlYWR5IGNoZWNrZWQgKi8KIAkJcHJfZXJyKCIlczogRXJyb3I6IFVua25vd24gYm9uZGluZyBtb2RlICVkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBib25kLT5wYXJhbXMubW9kZSk7CisJCSAgICAgICBkZXYtPm5hbWUsIEJPTkRfTU9ERShib25kKSk7CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTM4MTcsMTQgKzM4NDcsMTQgQEAKIAllY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAllY21kLT5wb3J0ID0gUE9SVF9PVEhFUjsKIAotCS8qIFNpbmNlIFNMQVZFX0lTX09LIHJldHVybnMgZmFsc2UgZm9yIGFsbCBpbmFjdGl2ZSBvciBkb3duIHNsYXZlcywgd2UKKwkvKiBTaW5jZSBib25kX3NsYXZlX2Nhbl90eCByZXR1cm5zIGZhbHNlIGZvciBhbGwgaW5hY3RpdmUgb3IgZG93biBzbGF2ZXMsIHdlCiAJICogZG8gbm90IG5lZWQgdG8gY2hlY2sgbW9kZS4gIFRob3VnaCBsaW5rIHNwZWVkIG1pZ2h0IG5vdCByZXByZXNlbnQKIAkgKiB0aGUgdHJ1ZSByZWNlaXZlIG9yIHRyYW5zbWl0IGJhbmR3aWR0aCAobm90IGFsbCBtb2RlcyBhcmUgc3ltbWV0cmljKQogCSAqIHRoaXMgaXMgYW4gYWNjdXJhdGUgbWF4aW11bS4KIAkgKi8KIAlyZWFkX2xvY2soJmJvbmQtPmxvY2spOwogCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKLQkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSkgeworCQlpZiAoYm9uZF9zbGF2ZV9jYW5fdHgoc2xhdmUpKSB7CiAJCQlpZiAoc2xhdmUtPnNwZWVkICE9IFNQRUVEX1VOS05PV04pCiAJCQkJc3BlZWQgKz0gc2xhdmUtPnNwZWVkOwogCQkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfVU5LTk9XTiAmJgpAQCAtMzkxNSw3ICszOTQ1LDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugb3B0aW9ucyAqLwogCWJvbmRfZGV2LT50eF9xdWV1ZV9sZW4gPSAwOwogCWJvbmRfZGV2LT5mbGFncyB8PSBJRkZfTUFTVEVSfElGRl9NVUxUSUNBU1Q7Ci0JYm9uZF9kZXYtPnByaXZfZmxhZ3MgfD0gSUZGX0JPTkRJTkc7CisJYm9uZF9kZXYtPnByaXZfZmxhZ3MgfD0gSUZGX0JPTkRJTkcgfCBJRkZfVU5JQ0FTVF9GTFQ7CiAJYm9uZF9kZXYtPnByaXZfZmxhZ3MgJj0gfihJRkZfWE1JVF9EU1RfUkVMRUFTRSB8IElGRl9UWF9TS0JfU0hBUklORyk7CiAKIAkvKiBBdCBmaXJzdCwgd2UgYmxvY2sgYWRkaW5nIFZMQU5zLiBUaGF0J3MgdGhlIG9ubHkgd2F5IHRvCkBAIC0zOTk0LDcgKzQwMjQsOCBAQAogCiAJaWYgKHhtaXRfaGFzaF9wb2xpY3kpIHsKIAkJaWYgKChib25kX21vZGUgIT0gQk9ORF9NT0RFX1hPUikgJiYKLQkJICAgIChib25kX21vZGUgIT0gQk9ORF9NT0RFXzgwMjNBRCkpIHsKKwkJICAgIChib25kX21vZGUgIT0gQk9ORF9NT0RFXzgwMjNBRCkgJiYKKwkJICAgIChib25kX21vZGUgIT0gQk9ORF9NT0RFX1RMQikpIHsKIAkJCXByX2luZm8oInhtaXRfaGFzaF9wb2xpY3kgcGFyYW0gaXMgaXJyZWxldmFudCBpbiBtb2RlICVzXG4iLAogCQkJCWJvbmRfbW9kZV9uYW1lKGJvbmRfbW9kZSkpOwogCQl9IGVsc2UgewpAQCAtNDA3OSw3ICs0MTEwLDcgQEAKIAl9CiAKIAkvKiByZXNldCB2YWx1ZXMgZm9yIDgwMi4zYWQvVExCL0FMQiAqLwotCWlmIChCT05EX05PX1VTRVNfQVJQKGJvbmRfbW9kZSkpIHsKKwlpZiAoIWJvbmRfbW9kZV91c2VzX2FycChib25kX21vZGUpKSB7CiAJCWlmICghbWlpbW9uKSB7CiAJCQlwcl93YXJuKCJXYXJuaW5nOiBtaWltb24gbXVzdCBiZSBzcGVjaWZpZWQsIG90aGVyd2lzZSBib25kaW5nIHdpbGwgbm90IGRldGVjdCBsaW5rIGZhaWx1cmUsIHNwZWVkIGFuZCBkdXBsZXggd2hpY2ggYXJlIGVzc2VudGlhbCBmb3IgODAyLjNhZCBvcGVyYXRpb25cbiIpOwogCQkJcHJfd2FybigiRm9yY2luZyBtaWltb24gdG8gMTAwbXNlY1xuIik7CkBAIC00MTYxLDcgKzQxOTIsNyBAQAogCQkgICBjYXRjaCBtaXN0YWtlcyAqLwogCQlfX2JlMzIgaXA7CiAJCWlmICghaW40X3B0b24oYXJwX2lwX3RhcmdldFtpXSwgLTEsICh1OCAqKSZpcCwgLTEsIE5VTEwpIHx8Ci0JCSAgICBJU19JUF9UQVJHRVRfVU5VU0FCTEVfQUREUkVTUyhpcCkpIHsKKwkJICAgICFib25kX2lzX2lwX3RhcmdldF9vayhpcCkpIHsKIAkJCXByX3dhcm4oIldhcm5pbmc6IGJhZCBhcnBfaXBfdGFyZ2V0IG1vZHVsZSBwYXJhbWV0ZXIgKCVzKSwgQVJQIG1vbml0b3Jpbmcgd2lsbCBub3QgYmUgcGVyZm9ybWVkXG4iLAogCQkJCWFycF9pcF90YXJnZXRbaV0pOwogCQkJYXJwX2ludGVydmFsID0gMDsKQEAgLTQyMzQsNyArNDI2NSw3IEBACiAJCXByX2RlYnVnKCJXYXJuaW5nOiBlaXRoZXIgbWlpbW9uIG9yIGFycF9pbnRlcnZhbCBhbmQgYXJwX2lwX3RhcmdldCBtb2R1bGUgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGJvbmRpbmcgd2lsbCBub3QgZGV0ZWN0IGxpbmsgZmFpbHVyZXMhIHNlZSBib25kaW5nLnR4dCBmb3IgZGV0YWlsc1xuIik7CiAJfQogCi0JaWYgKHByaW1hcnkgJiYgIVVTRVNfUFJJTUFSWShib25kX21vZGUpKSB7CisJaWYgKHByaW1hcnkgJiYgIWJvbmRfbW9kZV91c2VzX3ByaW1hcnkoYm9uZF9tb2RlKSkgewogCQkvKiBjdXJyZW50bHksIHVzaW5nIGEgcHJpbWFyeSBvbmx5IG1ha2VzIHNlbnNlCiAJCSAqIGluIGFjdGl2ZSBiYWNrdXAsIFRMQiBvciBBTEIgbW9kZXMKIAkJICovCkBAIC00MzAwLDYgKzQzMzEsNyBAQAogCXBhcmFtcy0+bWluX2xpbmtzID0gbWluX2xpbmtzOwogCXBhcmFtcy0+bHBfaW50ZXJ2YWwgPSBscF9pbnRlcnZhbDsKIAlwYXJhbXMtPnBhY2tldHNfcGVyX3NsYXZlID0gcGFja2V0c19wZXJfc2xhdmU7CisJcGFyYW1zLT50bGJfZHluYW1pY19sYiA9IDE7IC8qIERlZmF1bHQgdmFsdWUgKi8KIAlpZiAocGFja2V0c19wZXJfc2xhdmUgPiAwKSB7CiAJCXBhcmFtcy0+cmVjaXByb2NhbF9wYWNrZXRzX3Blcl9zbGF2ZSA9CiAJCQlyZWNpcHJvY2FsX3ZhbHVlKHBhY2tldHNfcGVyX3NsYXZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9uZXRsaW5rLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbmV0bGluay5jCmluZGV4IGY4NDdlMTYuLjVhYjNjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX25ldGxpbmsuYwpAQCAtNTYsMTAgKzU2LDEwIEBACiAJaWYgKG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9CT05EX1NMQVZFX1FVRVVFX0lELCBzbGF2ZS0+cXVldWVfaWQpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCWlmIChzbGF2ZS0+Ym9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCWlmIChCT05EX01PREUoc2xhdmUtPmJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJY29uc3Qgc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZzsKIAotCQlhZ2cgPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LmFnZ3JlZ2F0b3I7CisJCWFnZyA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0LmFnZ3JlZ2F0b3I7CiAJCWlmIChhZ2cpCiAJCQlpZiAobmxhX3B1dF91MTYoc2tiLCBJRkxBX0JPTkRfU0xBVkVfQURfQUdHUkVHQVRPUl9JRCwKIAkJCQkJYWdnLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpKQpAQCAtNDA3LDcgKzQwNyw3IEBACiAJdW5zaWduZWQgaW50IHBhY2tldHNfcGVyX3NsYXZlOwogCWludCBpLCB0YXJnZXRzX2FkZGVkOwogCi0JaWYgKG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JPTkRfTU9ERSwgYm9uZC0+cGFyYW1zLm1vZGUpKQorCWlmIChubGFfcHV0X3U4KHNrYiwgSUZMQV9CT05EX01PREUsIEJPTkRfTU9ERShib25kKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJaWYgKHNsYXZlX2RldiAmJgpAQCAtNTA1LDcgKzUwNSw3IEBACiAJCSAgICAgICBib25kLT5wYXJhbXMuYWRfc2VsZWN0KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQlzdHJ1Y3QgYWRfaW5mbyBpbmZvOwogCiAJCWlmICghYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhib25kLCAmaW5mbykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9vcHRpb25zLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfb3B0aW9ucy5jCmluZGV4IDgzMjA3MDIuLjU0MGUwMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9vcHRpb25zLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX29wdGlvbnMuYwpAQCAtNzAsNiArNzAsOCBAQAogCQkJCWNvbnN0IHN0cnVjdCBib25kX29wdF92YWx1ZSAqbmV3dmFsKTsKIHN0YXRpYyBpbnQgYm9uZF9vcHRpb25fc2xhdmVzX3NldChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBib25kX29wdF92YWx1ZSAqbmV3dmFsKTsKK3N0YXRpYyBpbnQgYm9uZF9vcHRpb25fdGxiX2R5bmFtaWNfbGJfc2V0KHN0cnVjdCBib25kaW5nICpib25kLAorCQkJCSAgY29uc3Qgc3RydWN0IGJvbmRfb3B0X3ZhbHVlICpuZXd2YWwpOwogCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgYm9uZF9tb2RlX3RibFtdID0gewpAQCAtMTgwLDYgKzE4MiwxMiBAQAogCXsgTlVMTCwgICAgICAtMSwgICAgICAwfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgYm9uZF90bGJfZHluYW1pY19sYl90YmxbXSA9IHsKKwl7ICJvZmYiLCAwLCAgMH0sCisJeyAib24iLCAgMSwgIEJPTkRfVkFMRkxBR19ERUZBVUxUfSwKKwl7IE5VTEwsICAtMSwgMH0KK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYm9uZF9vcHRpb24gYm9uZF9vcHRzW10gPSB7CiAJW0JPTkRfT1BUX01PREVdID0gewogCQkuaWQgPSBCT05EX09QVF9NT0RFLApAQCAtMjAwLDcgKzIwOCw3IEBACiAJW0JPTkRfT1BUX1hNSVRfSEFTSF0gPSB7CiAJCS5pZCA9IEJPTkRfT1BUX1hNSVRfSEFTSCwKIAkJLm5hbWUgPSAieG1pdF9oYXNoX3BvbGljeSIsCi0JCS5kZXNjID0gImJhbGFuY2UteG9yIGFuZCA4MDIuM2FkIGhhc2hpbmcgbWV0aG9kIiwKKwkJLmRlc2MgPSAiYmFsYW5jZS14b3IsIDgwMi4zYWQsIGFuZCB0bGIgaGFzaGluZyBtZXRob2QiLAogCQkudmFsdWVzID0gYm9uZF94bWl0X2hhc2h0eXBlX3RibCwKIAkJLnNldCA9IGJvbmRfb3B0aW9uX3htaXRfaGFzaF9wb2xpY3lfc2V0CiAJfSwKQEAgLTM2NSw5ICszNzMsMzMgQEAKIAkJLmZsYWdzID0gQk9ORF9PUFRGTEFHX1JBV1ZBTCwKIAkJLnNldCA9IGJvbmRfb3B0aW9uX3NsYXZlc19zZXQKIAl9LAorCVtCT05EX09QVF9UTEJfRFlOQU1JQ19MQl0gPSB7CisJCS5pZCA9IEJPTkRfT1BUX1RMQl9EWU5BTUlDX0xCLAorCQkubmFtZSA9ICJ0bGJfZHluYW1pY19sYiIsCisJCS5kZXNjID0gIkVuYWJsZSBkeW5hbWljIGZsb3cgc2h1ZmZsaW5nIiwKKwkJLnVuc3VwcG1vZGVzID0gQk9ORF9NT0RFX0FMTF9FWChCSVQoQk9ORF9NT0RFX1RMQikpLAorCQkudmFsdWVzID0gYm9uZF90bGJfZHluYW1pY19sYl90YmwsCisJCS5mbGFncyA9IEJPTkRfT1BURkxBR19JRkRPV04sCisJCS5zZXQgPSBib25kX29wdGlvbl90bGJfZHluYW1pY19sYl9zZXQsCisJfSwKIAl7IH0KIH07CiAKKy8qIFNlYXJjaGVzIGZvciBhbiBvcHRpb24gYnkgbmFtZSAqLworY29uc3Qgc3RydWN0IGJvbmRfb3B0aW9uICpib25kX29wdF9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBib25kX29wdGlvbiAqb3B0OworCWludCBvcHRpb247CisKKwlmb3IgKG9wdGlvbiA9IDA7IG9wdGlvbiA8IEJPTkRfT1BUX0xBU1Q7IG9wdGlvbisrKSB7CisJCW9wdCA9IGJvbmRfb3B0X2dldChvcHRpb24pOworCQlpZiAob3B0ICYmICFzdHJjbXAob3B0LT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBvcHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qIFNlYXJjaGVzIGZvciBhIHZhbHVlIGluIG9wdCdzIHZhbHVlc1tdIHRhYmxlICovCiBjb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgKmJvbmRfb3B0X2dldF92YWwodW5zaWduZWQgaW50IG9wdGlvbiwgdTY0IHZhbCkKIHsKQEAgLTY0MSw3ICs2NzMsNyBAQAogCiBpbnQgYm9uZF9vcHRpb25fbW9kZV9zZXQoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGNvbnN0IHN0cnVjdCBib25kX29wdF92YWx1ZSAqbmV3dmFsKQogewotCWlmIChCT05EX05PX1VTRVNfQVJQKG5ld3ZhbC0+dmFsdWUpICYmIGJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwpIHsKKwlpZiAoIWJvbmRfbW9kZV91c2VzX2FycChuZXd2YWwtPnZhbHVlKSAmJiBib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKSB7CiAJCXByX2luZm8oIiVzOiAlcyBtb2RlIGlzIGluY29tcGF0aWJsZSB3aXRoIGFycCBtb25pdG9yaW5nLCBzdGFydCBtaWkgbW9uaXRvcmluZ1xuIiwKIAkJCWJvbmQtPmRldi0+bmFtZSwgbmV3dmFsLT5zdHJpbmcpOwogCQkvKiBkaXNhYmxlIGFycCBtb25pdG9yaW5nICovCkBAIC02NjIsNyArNjk0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqX19ib25kX29wdGlvbl9hY3RpdmVfc2xhdmVfZ2V0KHN0cnVjdCBib25kaW5nICpib25kLAogCQkJCQkJCSBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQogewotCXJldHVybiBVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpICYmIHNsYXZlID8gc2xhdmUtPmRldiA6IE5VTEw7CisJcmV0dXJuIGJvbmRfdXNlc19wcmltYXJ5KGJvbmQpICYmIHNsYXZlID8gc2xhdmUtPmRldiA6IE5VTEw7CiB9CiAKIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX29wdGlvbl9hY3RpdmVfc2xhdmVfZ2V0X3JjdShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKQEAgLTcyNyw3ICs3NTksNyBAQAogCQkJCWJvbmQtPmRldi0+bmFtZSwgbmV3X2FjdGl2ZS0+ZGV2LT5uYW1lKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChvbGRfYWN0aXZlICYmIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYKLQkJCSAgICBJU19VUChuZXdfYWN0aXZlLT5kZXYpKSB7CisJCQkgICAgYm9uZF9zbGF2ZV9pc191cChuZXdfYWN0aXZlKSkgewogCQkJCXByX2luZm8oIiVzOiBTZXR0aW5nICVzIGFzIGFjdGl2ZSBzbGF2ZVxuIiwKIAkJCQkJYm9uZC0+ZGV2LT5uYW1lLCBuZXdfYWN0aXZlLT5kZXYtPm5hbWUpOwogCQkJCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBuZXdfYWN0aXZlKTsKQEAgLTc0Niw2ICs3NzgsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBUaGVyZSBhcmUgdHdvIHRyaWNreSBiaXRzIGhlcmUuICBGaXJzdCwgaWYgTUlJIG1vbml0b3JpbmcgaXMgYWN0aXZhdGVkLCB0aGVuCisgKiB3ZSBtdXN0IGRpc2FibGUgQVJQIG1vbml0b3JpbmcuICBTZWNvbmQsIGlmIHRoZSB0aW1lciBpc24ndCBydW5uaW5nLCB3ZSBtdXN0CisgKiBzdGFydCBpdC4KKyAqLwogc3RhdGljIGludCBib25kX29wdGlvbl9taWltb25fc2V0KHN0cnVjdCBib25kaW5nICpib25kLAogCQkJCSAgY29uc3Qgc3RydWN0IGJvbmRfb3B0X3ZhbHVlICpuZXd2YWwpCiB7CkBAIC03ODQsNiArODIwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFNldCB1cCBhbmQgZG93biBkZWxheXMuIFRoZXNlIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZQorICogTUlJIG1vbml0b3JpbmcgdmFsdWUsIGFuZCBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgdGhlIG11bHRpcGxpZXIuCisgKiBUaHVzLCB3ZSBtdXN0IHRyYW5zbGF0ZSB0byBNUyBmb3IgdGhlIHJlYWwgd29ybGQuCisgKi8KIHN0YXRpYyBpbnQgYm9uZF9vcHRpb25fdXBkZWxheV9zZXQoc3RydWN0IGJvbmRpbmcgKmJvbmQsCiAJCQkJICAgY29uc3Qgc3RydWN0IGJvbmRfb3B0X3ZhbHVlICpuZXd2YWwpCiB7CkBAIC04NDIsNiArODgyLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFRoZXJlIGFyZSB0d28gdHJpY2t5IGJpdHMgaGVyZS4gIEZpcnN0LCBpZiBBUlAgbW9uaXRvcmluZyBpcyBhY3RpdmF0ZWQsIHRoZW4KKyAqIHdlIG11c3QgZGlzYWJsZSBNSUkgbW9uaXRvcmluZy4gIFNlY29uZCwgaWYgdGhlIEFSUCB0aW1lciBpc24ndCBydW5uaW5nLAorICogd2UgbXVzdCBzdGFydCBpdC4KKyAqLwogc3RhdGljIGludCBib25kX29wdGlvbl9hcnBfaW50ZXJ2YWxfc2V0KHN0cnVjdCBib25kaW5nICpib25kLAogCQkJCQljb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgKm5ld3ZhbCkKIHsKQEAgLTg5OSw3ICs5NDMsNyBAQAogCV9fYmUzMiAqdGFyZ2V0cyA9IGJvbmQtPnBhcmFtcy5hcnBfdGFyZ2V0czsKIAlpbnQgaW5kOwogCi0JaWYgKElTX0lQX1RBUkdFVF9VTlVTQUJMRV9BRERSRVNTKHRhcmdldCkpIHsKKwlpZiAoIWJvbmRfaXNfaXBfdGFyZ2V0X29rKHRhcmdldCkpIHsKIAkJcHJfZXJyKCIlczogaW52YWxpZCBBUlAgdGFyZ2V0ICVwSTQgc3BlY2lmaWVkIGZvciBhZGRpdGlvblxuIiwKIAkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgJnRhcmdldCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTQ0LDcgKzk4OCw3IEBACiAJdW5zaWduZWQgbG9uZyAqdGFyZ2V0c19yeDsKIAlpbnQgaW5kLCBpOwogCi0JaWYgKElTX0lQX1RBUkdFVF9VTlVTQUJMRV9BRERSRVNTKHRhcmdldCkpIHsKKwlpZiAoIWJvbmRfaXNfaXBfdGFyZ2V0X29rKHRhcmdldCkpIHsKIAkJcHJfZXJyKCIlczogaW52YWxpZCBBUlAgdGFyZ2V0ICVwSTQgc3BlY2lmaWVkIGZvciByZW1vdmFsXG4iLAogCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lLCAmdGFyZ2V0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzM4LDMgKzEzODIsMTMgQEAKIAlyZXQgPSAtRVBFUk07CiAJZ290byBvdXQ7CiB9CisKK3N0YXRpYyBpbnQgYm9uZF9vcHRpb25fdGxiX2R5bmFtaWNfbGJfc2V0KHN0cnVjdCBib25kaW5nICpib25kLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBib25kX29wdF92YWx1ZSAqbmV3dmFsKQoreworCXByX2luZm8oIiVzOiBTZXR0aW5nIGR5bmFtaWMtbGIgdG8gJXMgKCVsbHUpXG4iLAorCQlib25kLT5kZXYtPm5hbWUsIG5ld3ZhbC0+c3RyaW5nLCBuZXd2YWwtPnZhbHVlKTsKKwlib25kLT5wYXJhbXMudGxiX2R5bmFtaWNfbGIgPSBuZXd2YWwtPnZhbHVlOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfb3B0aW9ucy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX29wdGlvbnMuaAppbmRleCAxMmJlOWUxLi4xN2RlZDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfb3B0aW9ucy5oCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9vcHRpb25zLmgKQEAgLTYyLDYgKzYyLDcgQEAKIAlCT05EX09QVF9SRVNFTkRfSUdNUCwKIAlCT05EX09QVF9MUF9JTlRFUlZBTCwKIAlCT05EX09QVF9TTEFWRVMsCisJQk9ORF9PUFRfVExCX0RZTkFNSUNfTEIsCiAJQk9ORF9PUFRfTEFTVAogfTsKIApAQCAtMTA0LDYgKzEwNSw3IEBACiBjb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgKmJvbmRfb3B0X3BhcnNlKGNvbnN0IHN0cnVjdCBib25kX29wdGlvbiAqb3B0LAogCQkJCQkgICAgc3RydWN0IGJvbmRfb3B0X3ZhbHVlICp2YWwpOwogY29uc3Qgc3RydWN0IGJvbmRfb3B0aW9uICpib25kX29wdF9nZXQodW5zaWduZWQgaW50IG9wdGlvbik7Citjb25zdCBzdHJ1Y3QgYm9uZF9vcHRpb24gKmJvbmRfb3B0X2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOwogY29uc3Qgc3RydWN0IGJvbmRfb3B0X3ZhbHVlICpib25kX29wdF9nZXRfdmFsKHVuc2lnbmVkIGludCBvcHRpb24sIHU2NCB2YWwpOwogCiAvKiBUaGlzIGhlbHBlciBpcyB1c2VkIHRvIGluaXRpYWxpemUgYSBib25kX29wdF92YWx1ZSBzdHJ1Y3R1cmUgZm9yIHBhcmFtZXRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jCmluZGV4IDAxM2ZkZDAuLmIyMTViNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfcHJvY2ZzLmMKQEAgLTcyLDkgKzcyLDkgQEAKIAljdXJyID0gcmN1X2RlcmVmZXJlbmNlKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKIAogCXNlcV9wcmludGYoc2VxLCAiQm9uZGluZyBNb2RlOiAlcyIsCi0JCSAgIGJvbmRfbW9kZV9uYW1lKGJvbmQtPnBhcmFtcy5tb2RlKSk7CisJCSAgIGJvbmRfbW9kZV9uYW1lKEJPTkRfTU9ERShib25kKSkpOwogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVAgJiYKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVAgJiYKIAkgICAgYm9uZC0+cGFyYW1zLmZhaWxfb3Zlcl9tYWMpIHsKIAkJb3B0dmFsID0gYm9uZF9vcHRfZ2V0X3ZhbChCT05EX09QVF9GQUlMX09WRVJfTUFDLAogCQkJCQkgIGJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjKTsKQEAgLTgzLDE1ICs4MywxNSBAQAogCiAJc2VxX3ByaW50ZihzZXEsICJcbiIpOwogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9YT1IgfHwKLQkJYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX1hPUiB8fAorCQlCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQlvcHR2YWwgPSBib25kX29wdF9nZXRfdmFsKEJPTkRfT1BUX1hNSVRfSEFTSCwKIAkJCQkJICBib25kLT5wYXJhbXMueG1pdF9wb2xpY3kpOwogCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0IEhhc2ggUG9saWN5OiAlcyAoJWQpXG4iLAogCQkJICAgb3B0dmFsLT5zdHJpbmcsIGJvbmQtPnBhcmFtcy54bWl0X3BvbGljeSk7CiAJfQogCi0JaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwlpZiAoYm9uZF91c2VzX3ByaW1hcnkoYm9uZCkpIHsKIAkJc2VxX3ByaW50ZihzZXEsICJQcmltYXJ5IFNsYXZlOiAlcyIsCiAJCQkgICAoYm9uZC0+cHJpbWFyeV9zbGF2ZSkgPwogCQkJICAgYm9uZC0+cHJpbWFyeV9zbGF2ZS0+ZGV2LT5uYW1lIDogIk5vbmUiKTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiAJfQogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJc3RydWN0IGFkX2luZm8gYWRfaW5mbzsKIAogCQlzZXFfcHV0cyhzZXEsICJcbjgwMi4zYWQgaW5mb1xuIik7CkBAIC0xODgsOSArMTg4LDkgQEAKIAogCXNlcV9wcmludGYoc2VxLCAiUGVybWFuZW50IEhXIGFkZHI6ICVwTVxuIiwgc2xhdmUtPnBlcm1faHdhZGRyKTsKIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCWNvbnN0IHN0cnVjdCBhZ2dyZWdhdG9yICphZ2cKLQkJCT0gU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydC5hZ2dyZWdhdG9yOworCQkJPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydC5hZ2dyZWdhdG9yOwogCiAJCWlmIChhZ2cpCiAJCQlzZXFfcHJpbnRmKHNlcSwgIkFnZ3JlZ2F0b3IgSUQ6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCA1ZjZiYWJjLi5kYWVkNTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtNDUsOCArNDUsNyBAQAogI2RlZmluZSB0b19kZXYob2JqKQljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQogI2RlZmluZSB0b19ib25kKGNkKQkoKHN0cnVjdCBib25kaW5nICopKG5ldGRldl9wcml2KHRvX25ldF9kZXYoY2QpKSkpCiAKLS8qCi0gKiAic2hvdyIgZnVuY3Rpb24gZm9yIHRoZSBib25kX21hc3RlcnMgYXR0cmlidXRlLgorLyogInNob3ciIGZ1bmN0aW9uIGZvciB0aGUgYm9uZF9tYXN0ZXJzIGF0dHJpYnV0ZS4KICAqIFRoZSBjbGFzcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2JvbmRzKHN0cnVjdCBjbGFzcyAqY2xzLApAQCAtODgsMTQgKzg3LDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiAic3RvcmUiIGZ1bmN0aW9uIGZvciB0aGUgYm9uZF9tYXN0ZXJzIGF0dHJpYnV0ZS4gIFRoaXMgaXMgd2hhdAorLyogInN0b3JlIiBmdW5jdGlvbiBmb3IgdGhlIGJvbmRfbWFzdGVycyBhdHRyaWJ1dGUuICBUaGlzIGlzIHdoYXQKICAqIGNyZWF0ZXMgYW5kIGRlbGV0ZXMgZW50aXJlIGJvbmRzLgogICoKICAqIFRoZSBjbGFzcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAqCiAgKi8KLQogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9ib25kcyhzdHJ1Y3QgY2xhc3MgKmNscywKIAkJCQkgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAogCQkJCSAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQpAQCAtMTU4LDkgKzE1NSwyNiBAQAogCS5zdG9yZSA9IGJvbmRpbmdfc3RvcmVfYm9uZHMsCiB9OwogCi0vKgotICogU2hvdyB0aGUgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuCi0gKi8KKy8qIEdlbmVyaWMgInN0b3JlIiBtZXRob2QgZm9yIGJvbmRpbmcgc3lzZnMgb3B0aW9uIHNldHRpbmcgKi8KK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOworCWNvbnN0IHN0cnVjdCBib25kX29wdGlvbiAqb3B0OworCWludCByZXQ7CisKKwlvcHQgPSBib25kX29wdF9nZXRfYnlfbmFtZShhdHRyLT5hdHRyLm5hbWUpOworCWlmIChXQVJOX09OKCFvcHQpKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBvcHQtPmlkLCAoY2hhciAqKWJ1ZmZlcik7CisJaWYgKCFyZXQpCisJCXJldCA9IGNvdW50OworCisJcmV0dXJuIHJldDsKK30KKworLyogU2hvdyB0aGUgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfc2xhdmVzKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTE5MCw2MiArMjA0LDI0IEBACiAKIAlyZXR1cm4gcmVzOwogfQotCi0vKgotICogU2V0IHRoZSBzbGF2ZXMgaW4gdGhlIGN1cnJlbnQgYm9uZC4KLSAqIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb25seSB0aGluIHdyYXBwZXIgZm9yIGJvbmRfZW5zbGF2ZSBhbmQgYm9uZF9yZWxlYXNlLgotICogQWxsIGhhcmQgd29yayBzaG91bGQgYmUgZG9uZSB0aGVyZS4KLSAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9zbGF2ZXMoc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfU0xBVkVTLCAoY2hhciAqKWJ1ZmZlcik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUihzbGF2ZXMsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfc2xhdmVzLAotCQkgICBib25kaW5nX3N0b3JlX3NsYXZlcyk7CisJCSAgIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAotLyoKLSAqIFNob3cgYW5kIHNldCB0aGUgYm9uZGluZyBtb2RlLiAgVGhlIGJvbmQgaW50ZXJmYWNlIG11c3QgYmUgZG93biB0bwotICogY2hhbmdlIHRoZSBtb2RlLgotICovCisvKiBTaG93IHRoZSBib25kaW5nIG1vZGUuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAljb25zdCBzdHJ1Y3QgYm9uZF9vcHRfdmFsdWUgKnZhbDsKIAotCXZhbCA9IGJvbmRfb3B0X2dldF92YWwoQk9ORF9PUFRfTU9ERSwgYm9uZC0+cGFyYW1zLm1vZGUpOworCXZhbCA9IGJvbmRfb3B0X2dldF92YWwoQk9ORF9PUFRfTU9ERSwgQk9ORF9NT0RFKGJvbmQpKTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzICVkXG4iLCB2YWwtPnN0cmluZywgYm9uZC0+cGFyYW1zLm1vZGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZCwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9NT0RFLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwgdmFsLT5zdHJpbmcsIEJPTkRfTU9ERShib25kKSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19tb2RlLCBib25kaW5nX3N0b3JlX21vZGUpOworCQkgICBib25kaW5nX3Nob3dfbW9kZSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBib25kaW5nIHRyYW5zbWl0IGhhc2ggbWV0aG9kLgotICovCisvKiBTaG93IHRoZSBib25kaW5nIHRyYW5zbWl0IGhhc2ggbWV0aG9kLiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X3htaXRfaGFzaChzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICAgIGNoYXIgKmJ1ZikKQEAgLTI1NywyNiArMjMzLDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwgdmFsLT5zdHJpbmcsIGJvbmQtPnBhcmFtcy54bWl0X3BvbGljeSk7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfeG1pdF9oYXNoKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX1hNSVRfSEFTSCwgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIoeG1pdF9oYXNoX3BvbGljeSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd194bWl0X2hhc2gsIGJvbmRpbmdfc3RvcmVfeG1pdF9oYXNoKTsKKwkJICAgYm9uZGluZ19zaG93X3htaXRfaGFzaCwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IGFycF92YWxpZGF0ZS4KLSAqLworLyogU2hvdyBhcnBfdmFsaWRhdGUuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYXJwX3ZhbGlkYXRlKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJIGNoYXIgKmJ1ZikKQEAgLTI4OSwyNiArMjQ5LDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwgdmFsLT5zdHJpbmcsIGJvbmQtPnBhcmFtcy5hcnBfdmFsaWRhdGUpOwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FycF92YWxpZGF0ZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfQVJQX1ZBTElEQVRFLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIERFVklDRV9BVFRSKGFycF92YWxpZGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19hcnBfdmFsaWRhdGUsCi0JCSAgIGJvbmRpbmdfc3RvcmVfYXJwX3ZhbGlkYXRlKTsKLS8qCi0gKiBTaG93IGFuZCBzZXQgYXJwX2FsbF90YXJnZXRzLgotICovCisJCSAgIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKKworLyogU2hvdyBhcnBfYWxsX3RhcmdldHMuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYXJwX2FsbF90YXJnZXRzKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJIGNoYXIgKmJ1ZikKQEAgLTMyMSwyOCArMjY1LDEwIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWRcbiIsCiAJCSAgICAgICB2YWwtPnN0cmluZywgYm9uZC0+cGFyYW1zLmFycF9hbGxfdGFyZ2V0cyk7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYXJwX2FsbF90YXJnZXRzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9BUlBfQUxMX1RBUkdFVFMsIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgREVWSUNFX0FUVFIoYXJwX2FsbF90YXJnZXRzLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgYm9uZGluZ19zaG93X2FycF9hbGxfdGFyZ2V0cywgYm9uZGluZ19zdG9yZV9hcnBfYWxsX3RhcmdldHMpOworCQkgICBib25kaW5nX3Nob3dfYXJwX2FsbF90YXJnZXRzLCBib25kaW5nX3N5c2ZzX3N0b3JlX29wdGlvbik7CiAKLS8qCi0gKiBTaG93IGFuZCBzdG9yZSBmYWlsX292ZXJfbWFjLiAgVXNlciBvbmx5IGFsbG93ZWQgdG8gY2hhbmdlIHRoZQotICogdmFsdWUgd2hlbiB0aGVyZSBhcmUgbm8gc2xhdmVzLgotICovCisvKiBTaG93IGZhaWxfb3Zlcl9tYWMuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfZmFpbF9vdmVyX21hYyhzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgIGNoYXIgKmJ1ZikKQEAgLTM1NSwzMCArMjgxLDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwgdmFsLT5zdHJpbmcsIGJvbmQtPnBhcmFtcy5mYWlsX292ZXJfbWFjKTsKIH0KLQotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9mYWlsX292ZXJfbWFjKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX0ZBSUxfT1ZFUl9NQUMsIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgREVWSUNFX0FUVFIoZmFpbF9vdmVyX21hYywgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19mYWlsX292ZXJfbWFjLCBib25kaW5nX3N0b3JlX2ZhaWxfb3Zlcl9tYWMpOworCQkgICBib25kaW5nX3Nob3dfZmFpbF9vdmVyX21hYywgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBhcnAgdGltZXIgaW50ZXJ2YWwuICBUaGVyZSBhcmUgdHdvIHRyaWNreSBiaXRzCi0gKiBoZXJlLiAgRmlyc3QsIGlmIEFSUCBtb25pdG9yaW5nIGlzIGFjdGl2YXRlZCwgdGhlbiB3ZSBtdXN0IGRpc2FibGUKLSAqIE1JSSBtb25pdG9yaW5nLiAgU2Vjb25kLCBpZiB0aGUgQVJQIHRpbWVyIGlzbid0IHJ1bm5pbmcsIHdlIG11c3QKLSAqIHN0YXJ0IGl0LgotICovCisvKiBTaG93IHRoZSBhcnAgdGltZXIgaW50ZXJ2YWwuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYXJwX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJIGNoYXIgKmJ1ZikKQEAgLTM4NywyNiArMjkzLDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCk7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYXJwX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9BUlBfSU5URVJWQUwsIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIERFVklDRV9BVFRSKGFycF9pbnRlcnZhbCwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19hcnBfaW50ZXJ2YWwsIGJvbmRpbmdfc3RvcmVfYXJwX2ludGVydmFsKTsKKwkJICAgYm9uZGluZ19zaG93X2FycF9pbnRlcnZhbCwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBhcnAgdGFyZ2V0cy4KLSAqLworLyogU2hvdyB0aGUgYXJwIHRhcmdldHMuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYXJwX3RhcmdldHMoc3RydWN0IGRldmljZSAqZCwKIAkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCWNoYXIgKmJ1ZikKQEAgLTQyNCwyNyArMzE0LDEwIEBACiAKIAlyZXR1cm4gcmVzOwogfQorc3RhdGljIERFVklDRV9BVFRSKGFycF9pcF90YXJnZXQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBib25kaW5nX3Nob3dfYXJwX3RhcmdldHMsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9hcnBfdGFyZ2V0cyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX0FSUF9UQVJHRVRTLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihhcnBfaXBfdGFyZ2V0LCBTX0lSVUdPIHwgU19JV1VTUiAsIGJvbmRpbmdfc2hvd19hcnBfdGFyZ2V0cywgYm9uZGluZ19zdG9yZV9hcnBfdGFyZ2V0cyk7Ci0KLS8qCi0gKiBTaG93IGFuZCBzZXQgdGhlIHVwIGFuZCBkb3duIGRlbGF5cy4gIFRoZXNlIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZQotICogTUlJIG1vbml0b3JpbmcgdmFsdWUsIGFuZCBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgdGhlIG11bHRpcGxpZXIuCi0gKiBUaHVzLCB3ZSBtdXN0IHRyYW5zbGF0ZSB0byBNUyBmb3IgdGhlIHJlYWwgd29ybGQuCi0gKi8KKy8qIFNob3cgdGhlIHVwIGFuZCBkb3duIGRlbGF5cy4gKi8KIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19kb3duZGVsYXkoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICBjaGFyICpidWYpCkBAIC00NTMsMjIgKzMyNiw4IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYm9uZC0+cGFyYW1zLmRvd25kZWxheSAqIGJvbmQtPnBhcmFtcy5taWltb24pOwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2Rvd25kZWxheShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9ET1dOREVMQVksIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIERFVklDRV9BVFRSKGRvd25kZWxheSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19kb3duZGVsYXksIGJvbmRpbmdfc3RvcmVfZG93bmRlbGF5KTsKKwkJICAgYm9uZGluZ19zaG93X2Rvd25kZWxheSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfdXBkZWxheShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTQ3OSwyNyArMzM4LDEwIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy51cGRlbGF5ICogYm9uZC0+cGFyYW1zLm1paW1vbik7CiAKIH0KLQotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV91cGRlbGF5KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfVVBERUxBWSwgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIodXBkZWxheSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd191cGRlbGF5LCBib25kaW5nX3N0b3JlX3VwZGVsYXkpOworCQkgICBib25kaW5nX3Nob3dfdXBkZWxheSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBMQUNQIGludGVydmFsLiAgSW50ZXJmYWNlIG11c3QgYmUgZG93biwgYW5kIHRoZSBtb2RlCi0gKiBtdXN0IGJlIHNldCB0byA4MDIuM2FkIG1vZGUuCi0gKi8KKy8qIFNob3cgdGhlIExBQ1AgaW50ZXJ2YWwuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbGFjcChzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgY2hhciAqYnVmKQpAQCAtNTExLDIyICszNTMsOCBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWRcbiIsIHZhbC0+c3RyaW5nLCBib25kLT5wYXJhbXMubGFjcF9mYXN0KTsKIH0KLQotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9sYWNwKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfTEFDUF9SQVRFLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUihsYWNwX3JhdGUsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBib25kaW5nX3Nob3dfbGFjcCwgYm9uZGluZ19zdG9yZV9sYWNwKTsKKwkJICAgYm9uZGluZ19zaG93X2xhY3AsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X21pbl9saW5rcyhzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtNTM2LDIyICszNjQsOCBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGJvbmQtPnBhcmFtcy5taW5fbGlua3MpOwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX21pbl9saW5rcyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9NSU5MSU5LUywgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIobWluX2xpbmtzLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgYm9uZGluZ19zaG93X21pbl9saW5rcywgYm9uZGluZ19zdG9yZV9taW5fbGlua3MpOworCQkgICBib25kaW5nX3Nob3dfbWluX2xpbmtzLCBib25kaW5nX3N5c2ZzX3N0b3JlX29wdGlvbik7CiAKIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9zZWxlY3Qoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTU2NCwyNyArMzc4LDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwgdmFsLT5zdHJpbmcsIGJvbmQtPnBhcmFtcy5hZF9zZWxlY3QpOwogfQotCi0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYWRfc2VsZWN0KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX0FEX1NFTEVDVCwgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIoYWRfc2VsZWN0LCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgYm9uZGluZ19zaG93X2FkX3NlbGVjdCwgYm9uZGluZ19zdG9yZV9hZF9zZWxlY3QpOworCQkgICBib25kaW5nX3Nob3dfYWRfc2VsZWN0LCBib25kaW5nX3N5c2ZzX3N0b3JlX29wdGlvbik7CiAKLS8qCi0gKiBTaG93IGFuZCBzZXQgdGhlIG51bWJlciBvZiBwZWVyIG5vdGlmaWNhdGlvbnMgdG8gc2VuZCBhZnRlciBhIGZhaWxvdmVyIGV2ZW50LgotICovCisvKiBTaG93IGFuZCBzZXQgdGhlIG51bWJlciBvZiBwZWVyIG5vdGlmaWNhdGlvbnMgdG8gc2VuZCBhZnRlciBhIGZhaWxvdmVyIGV2ZW50LiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X251bV9wZWVyX25vdGlmKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICBjaGFyICpidWYpCkBAIC02MTEsMTIgKzQwOCw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIobnVtX3Vuc29sX25hLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgYm9uZGluZ19zaG93X251bV9wZWVyX25vdGlmLCBib25kaW5nX3N0b3JlX251bV9wZWVyX25vdGlmKTsKIAotLyoKLSAqIFNob3cgYW5kIHNldCB0aGUgTUlJIG1vbml0b3IgaW50ZXJ2YWwuICBUaGVyZSBhcmUgdHdvIHRyaWNreSBiaXRzCi0gKiBoZXJlLiAgRmlyc3QsIGlmIE1JSSBtb25pdG9yaW5nIGlzIGFjdGl2YXRlZCwgdGhlbiB3ZSBtdXN0IGRpc2FibGUKLSAqIEFSUCBtb25pdG9yaW5nLiAgU2Vjb25kLCBpZiB0aGUgdGltZXIgaXNuJ3QgcnVubmluZywgd2UgbXVzdAotICogc3RhcnQgaXQuCi0gKi8KKy8qIFNob3cgdGhlIE1JSSBtb25pdG9yIGludGVydmFsLiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X21paW1vbihzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgIGNoYXIgKmJ1ZikKQEAgLTYyNSwzMCArNDE3LDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYm9uZC0+cGFyYW1zLm1paW1vbik7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfbWlpbW9uKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX01JSU1PTiwgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIobWlpbW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgYm9uZGluZ19zaG93X21paW1vbiwgYm9uZGluZ19zdG9yZV9taWltb24pOworCQkgICBib25kaW5nX3Nob3dfbWlpbW9uLCBib25kaW5nX3N5c2ZzX3N0b3JlX29wdGlvbik7CiAKLS8qCi0gKiBTaG93IGFuZCBzZXQgdGhlIHByaW1hcnkgc2xhdmUuICBUaGUgc3RvcmUgZnVuY3Rpb24gaXMgbXVjaAotICogc2ltcGxlciB0aGFuIGJvbmRpbmdfc3RvcmVfc2xhdmVzIGZ1bmN0aW9uIGJlY2F1c2UgaXQgb25seSBuZWVkcyB0bwotICogaGFuZGxlIG9uZSBpbnRlcmZhY2UgbmFtZS4KLSAqIFRoZSBib25kIG11c3QgYmUgYSBtb2RlIHRoYXQgc3VwcG9ydHMgYSBwcmltYXJ5IGZvciB0aGlzIGJlCi0gKiBzZXQuCi0gKi8KKy8qIFNob3cgdGhlIHByaW1hcnkgc2xhdmUuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfcHJpbWFyeShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgY2hhciAqYnVmKQpAQCAtNjYxLDI2ICs0MzMsMTAgQEAKIAogCXJldHVybiBjb3VudDsKIH0KLQotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9wcmltYXJ5KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfUFJJTUFSWSwgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgREVWSUNFX0FUVFIocHJpbWFyeSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19wcmltYXJ5LCBib25kaW5nX3N0b3JlX3ByaW1hcnkpOworCQkgICBib25kaW5nX3Nob3dfcHJpbWFyeSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBwcmltYXJ5X3Jlc2VsZWN0IGZsYWcuCi0gKi8KKy8qIFNob3cgdGhlIHByaW1hcnlfcmVzZWxlY3QgZmxhZy4gKi8KIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19wcmltYXJ5X3Jlc2VsZWN0KHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgICAgY2hhciAqYnVmKQpAQCAtNjk0LDI4ICs0NTAsMTAgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwKIAkJICAgICAgIHZhbC0+c3RyaW5nLCBib25kLT5wYXJhbXMucHJpbWFyeV9yZXNlbGVjdCk7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfcHJpbWFyeV9yZXNlbGVjdChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9QUklNQVJZX1JFU0VMRUNULAotCQkJCSAgIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIERFVklDRV9BVFRSKHByaW1hcnlfcmVzZWxlY3QsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBib25kaW5nX3Nob3dfcHJpbWFyeV9yZXNlbGVjdCwKLQkJICAgYm9uZGluZ19zdG9yZV9wcmltYXJ5X3Jlc2VsZWN0KTsKKwkJICAgYm9uZGluZ19zaG93X3ByaW1hcnlfcmVzZWxlY3QsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAotLyoKLSAqIFNob3cgYW5kIHNldCB0aGUgdXNlX2NhcnJpZXIgZmxhZy4KLSAqLworLyogU2hvdyB0aGUgdXNlX2NhcnJpZXIgZmxhZy4gKi8KIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19jYXJyaWVyKHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICBjaGFyICpidWYpCkBAIC03MjQsMjcgKzQ2MiwxMSBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy51c2VfY2Fycmllcik7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfY2FycmllcihzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX1VTRV9DQVJSSUVSLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUih1c2VfY2FycmllciwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19jYXJyaWVyLCBib25kaW5nX3N0b3JlX2NhcnJpZXIpOworCQkgICBib25kaW5nX3Nob3dfY2FycmllciwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCiAKLS8qCi0gKiBTaG93IGFuZCBzZXQgY3VycmVudGx5IGFjdGl2ZV9zbGF2ZS4KLSAqLworLyogU2hvdyBjdXJyZW50bHkgYWN0aXZlX3NsYXZlLiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSBjaGFyICpidWYpCkBAIC03NjEsMjcgKzQ4MywxMCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfQUNUSVZFX1NMQVZFLCAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUihhY3RpdmVfc2xhdmUsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBib25kaW5nX3Nob3dfYWN0aXZlX3NsYXZlLCBib25kaW5nX3N0b3JlX2FjdGl2ZV9zbGF2ZSk7CisJCSAgIGJvbmRpbmdfc2hvd19hY3RpdmVfc2xhdmUsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAotCi0vKgotICogU2hvdyBsaW5rIHN0YXR1cyBvZiB0aGUgYm9uZCBpbnRlcmZhY2UuCi0gKi8KKy8qIFNob3cgbGluayBzdGF0dXMgb2YgdGhlIGJvbmQgaW50ZXJmYWNlLiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X21paV9zdGF0dXMoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgICAgIGNoYXIgKmJ1ZikKQEAgLTc5Miw5ICs0OTcsNyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKG1paV9zdGF0dXMsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19taWlfc3RhdHVzLCBOVUxMKTsKIAotLyoKLSAqIFNob3cgY3VycmVudCA4MDIuM2FkIGFnZ3JlZ2F0b3IgSUQuCi0gKi8KKy8qIFNob3cgY3VycmVudCA4MDIuM2FkIGFnZ3JlZ2F0b3IgSUQuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYWRfYWdncmVnYXRvcihzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgIGNoYXIgKmJ1ZikKQEAgLTgwMiw3ICs1MDUsNyBAQAogCWludCBjb3VudCA9IDA7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCi0JaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwlpZiAoQk9ORF9NT0RFKGJvbmQpID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJc3RydWN0IGFkX2luZm8gYWRfaW5mbzsKIAkJY291bnQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAogCQkJCWJvbmRfM2FkX2dldF9hY3RpdmVfYWdnX2luZm8oYm9uZCwgJmFkX2luZm8pCkBAIC04MTQsOSArNTE3LDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihhZF9hZ2dyZWdhdG9yLCBTX0lSVUdPLCBib25kaW5nX3Nob3dfYWRfYWdncmVnYXRvciwgTlVMTCk7CiAKIAotLyoKLSAqIFNob3cgbnVtYmVyIG9mIGFjdGl2ZSA4MDIuM2FkIHBvcnRzLgotICovCisvKiBTaG93IG51bWJlciBvZiBhY3RpdmUgODAyLjNhZCBwb3J0cy4gKi8KIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9udW1fcG9ydHMoc3RydWN0IGRldmljZSAqZCwKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY2hhciAqYnVmKQpAQCAtODI0LDcgKzUyNSw3IEBACiAJaW50IGNvdW50ID0gMDsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQlzdHJ1Y3QgYWRfaW5mbyBhZF9pbmZvOwogCQljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsCiAJCQkJYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhib25kLCAmYWRfaW5mbykKQEAgLTgzNiw5ICs1MzcsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKGFkX251bV9wb3J0cywgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX251bV9wb3J0cywgTlVMTCk7CiAKIAotLyoKLSAqIFNob3cgY3VycmVudCA4MDIuM2FkIGFjdG9yIGtleS4KLSAqLworLyogU2hvdyBjdXJyZW50IDgwMi4zYWQgYWN0b3Iga2V5LiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX2FjdG9yX2tleShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSBjaGFyICpidWYpCkBAIC04NDYsNyArNTQ1LDcgQEAKIAlpbnQgY291bnQgPSAwOwogCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CiAJCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJCQlib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvKGJvbmQsICZhZF9pbmZvKQpAQCAtODU4LDkgKzU1Nyw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYWRfYWN0b3Jfa2V5LCBTX0lSVUdPLCBib25kaW5nX3Nob3dfYWRfYWN0b3Jfa2V5LCBOVUxMKTsKIAogCi0vKgotICogU2hvdyBjdXJyZW50IDgwMi4zYWQgcGFydG5lciBrZXkuCi0gKi8KKy8qIFNob3cgY3VycmVudCA4MDIuM2FkIHBhcnRuZXIga2V5LiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfa2V5KHN0cnVjdCBkZXZpY2UgKmQsCiAJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICBjaGFyICpidWYpCkBAIC04NjgsNyArNTY1LDcgQEAKIAlpbnQgY291bnQgPSAwOwogCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CiAJCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJCQlib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvKGJvbmQsICZhZF9pbmZvKQpAQCAtODgwLDkgKzU3Nyw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYWRfcGFydG5lcl9rZXksIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9wYXJ0bmVyX2tleSwgTlVMTCk7CiAKIAotLyoKLSAqIFNob3cgY3VycmVudCA4MDIuM2FkIHBhcnRuZXIgbWFjLgotICovCisvKiBTaG93IGN1cnJlbnQgODAyLjNhZCBwYXJ0bmVyIG1hYy4gKi8KIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9wYXJ0bmVyX21hYyhzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICAgY2hhciAqYnVmKQpAQCAtODkwLDcgKzU4NSw3IEBACiAJaW50IGNvdW50ID0gMDsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKLQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQlzdHJ1Y3QgYWRfaW5mbyBhZF9pbmZvOwogCQlpZiAoIWJvbmRfM2FkX2dldF9hY3RpdmVfYWdnX2luZm8oYm9uZCwgJmFkX2luZm8pKQogCQkJY291bnQgPSBzcHJpbnRmKGJ1ZiwgIiVwTVxuIiwgYWRfaW5mby5wYXJ0bmVyX3N5c3RlbSk7CkBAIC05MDAsOSArNTk1LDcgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihhZF9wYXJ0bmVyX21hYywgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfbWFjLCBOVUxMKTsKIAotLyoKLSAqIFNob3cgdGhlIHF1ZXVlX2lkcyBvZiB0aGUgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuCi0gKi8KKy8qIFNob3cgdGhlIHF1ZXVlX2lkcyBvZiB0aGUgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfcXVldWVfaWQoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICAgY2hhciAqYnVmKQpAQCAtOTMzLDMxICs2MjYsMTEgQEAKIAogCXJldHVybiByZXM7CiB9Ci0KLS8qCi0gKiBTZXQgdGhlIHF1ZXVlX2lkcyBvZiB0aGUgIHNsYXZlcyBpbiB0aGUgY3VycmVudCBib25kLiAgVGhlIGJvbmQKLSAqIGludGVyZmFjZSBtdXN0IGJlIGVuc2xhdmVkIGZvciB0aGlzIHRvIHdvcmsuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfcXVldWVfaWQoc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJvbmRfb3B0X3RyeXNldF9ydG5sKGJvbmQsIEJPTkRfT1BUX1FVRVVFX0lELCAoY2hhciAqKWJ1ZmZlcik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV9pZCwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19xdWV1ZV9pZCwKLQkJICAgYm9uZGluZ19zdG9yZV9xdWV1ZV9pZCk7CisJCSAgIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBhbGxfc2xhdmVzX2FjdGl2ZSBmbGFnLgotICovCisvKiBTaG93IHRoZSBhbGxfc2xhdmVzX2FjdGl2ZSBmbGFnLiAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X3NsYXZlc19hY3RpdmUoc3RydWN0IGRldmljZSAqZCwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICBjaGFyICpidWYpCkBAIC05NjYsMjcgKzYzOSwxMCBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy5hbGxfc2xhdmVzX2FjdGl2ZSk7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfc2xhdmVzX2FjdGl2ZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBib25kX29wdF90cnlzZXRfcnRubChib25kLCBCT05EX09QVF9BTExfU0xBVkVTX0FDVElWRSwKLQkJCQkgICAoY2hhciAqKWJ1Zik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGNvdW50OwotCi0JcmV0dXJuIHJldDsKLX0KIHN0YXRpYyBERVZJQ0VfQVRUUihhbGxfc2xhdmVzX2FjdGl2ZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19zbGF2ZXNfYWN0aXZlLCBib25kaW5nX3N0b3JlX3NsYXZlc19hY3RpdmUpOworCQkgICBib25kaW5nX3Nob3dfc2xhdmVzX2FjdGl2ZSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCi0vKgotICogU2hvdyBhbmQgc2V0IHRoZSBudW1iZXIgb2YgSUdNUCBtZW1iZXJzaGlwIHJlcG9ydHMgdG8gc2VuZCBvbiBsaW5rIGZhaWx1cmUKLSAqLworLyogU2hvdyB0aGUgbnVtYmVyIG9mIElHTVAgbWVtYmVyc2hpcCByZXBvcnRzIHRvIHNlbmQgb24gbGluayBmYWlsdXJlICovCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfcmVzZW5kX2lnbXAoc3RydWN0IGRldmljZSAqZCwKIAkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCWNoYXIgKmJ1ZikKQEAgLTk5NSwyMyArNjUxLDggQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBib25kLT5wYXJhbXMucmVzZW5kX2lnbXApOwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX3Jlc2VuZF9pZ21wKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfUkVTRU5EX0lHTVAsIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgREVWSUNFX0FUVFIocmVzZW5kX2lnbXAsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBib25kaW5nX3Nob3dfcmVzZW5kX2lnbXAsIGJvbmRpbmdfc3RvcmVfcmVzZW5kX2lnbXApOworCQkgICBib25kaW5nX3Nob3dfcmVzZW5kX2lnbXAsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAogCiBzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbHBfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZCwKQEAgLTEwMTksMjUgKzY2MCwyMSBAQAogCQkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOworCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy5scF9pbnRlcnZhbCk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobHBfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBib25kaW5nX3Nob3dfbHBfaW50ZXJ2YWwsIGJvbmRpbmdfc3lzZnNfc3RvcmVfb3B0aW9uKTsKIAotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9scF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd190bGJfZHluYW1pY19sYihzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfTFBfSU5URVJWQUwsIChjaGFyICopYnVmKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gY291bnQ7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBib25kLT5wYXJhbXMudGxiX2R5bmFtaWNfbGIpOwogfQotCi1zdGF0aWMgREVWSUNFX0FUVFIobHBfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBib25kaW5nX3Nob3dfbHBfaW50ZXJ2YWwsIGJvbmRpbmdfc3RvcmVfbHBfaW50ZXJ2YWwpOworc3RhdGljIERFVklDRV9BVFRSKHRsYl9keW5hbWljX2xiLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgYm9uZGluZ19zaG93X3RsYl9keW5hbWljX2xiLCBib25kaW5nX3N5c2ZzX3N0b3JlX29wdGlvbik7CiAKIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19wYWNrZXRzX3Blcl9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTEwNDUsMjcgKzY4MiwxMSBAQAogewogCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAl1bnNpZ25lZCBpbnQgcGFja2V0c19wZXJfc2xhdmUgPSBib25kLT5wYXJhbXMucGFja2V0c19wZXJfc2xhdmU7CisKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcGFja2V0c19wZXJfc2xhdmUpOwogfQotCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX3BhY2tldHNfcGVyX3NsYXZlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYm9uZF9vcHRfdHJ5c2V0X3J0bmwoYm9uZCwgQk9ORF9PUFRfUEFDS0VUU19QRVJfU0xBVkUsCi0JCQkJICAgKGNoYXIgKilidWYpOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBERVZJQ0VfQVRUUihwYWNrZXRzX3Blcl9zbGF2ZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIGJvbmRpbmdfc2hvd19wYWNrZXRzX3Blcl9zbGF2ZSwKLQkJICAgYm9uZGluZ19zdG9yZV9wYWNrZXRzX3Blcl9zbGF2ZSk7CisJCSAgIGJvbmRpbmdfc2hvd19wYWNrZXRzX3Blcl9zbGF2ZSwgYm9uZGluZ19zeXNmc19zdG9yZV9vcHRpb24pOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGVyX2JvbmRfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfc2xhdmVzLmF0dHIsCkBAIC0xMDk5LDYgKzcyMCw3IEBACiAJJmRldl9hdHRyX21pbl9saW5rcy5hdHRyLAogCSZkZXZfYXR0cl9scF9pbnRlcnZhbC5hdHRyLAogCSZkZXZfYXR0cl9wYWNrZXRzX3Blcl9zbGF2ZS5hdHRyLAorCSZkZXZfYXR0cl90bGJfZHluYW1pY19sYi5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0xMTA3LDggKzcyOSw3IEBACiAJLmF0dHJzID0gcGVyX2JvbmRfYXR0cnMsCiB9OwogCi0vKgotICogSW5pdGlhbGl6ZSBzeXNmcy4gIFRoaXMgc2V0cyB1cCB0aGUgYm9uZGluZ19tYXN0ZXJzIGZpbGUgaW4KKy8qIEluaXRpYWxpemUgc3lzZnMuICBUaGlzIHNldHMgdXAgdGhlIGJvbmRpbmdfbWFzdGVycyBmaWxlIGluCiAgKiAvc3lzL2NsYXNzL25ldC4KICAqLwogaW50IGJvbmRfY3JlYXRlX3N5c2ZzKHN0cnVjdCBib25kX25ldCAqYm4pCkBAIC0xMTIwLDggKzc0MSw3IEBACiAKIAlyZXQgPSBuZXRkZXZfY2xhc3NfY3JlYXRlX2ZpbGVfbnMoJmJuLT5jbGFzc19hdHRyX2JvbmRpbmdfbWFzdGVycywKIAkJCQkJICBibi0+bmV0KTsKLQkvKgotCSAqIFBlcm1pdCBtdWx0aXBsZSBsb2FkcyBvZiB0aGUgbW9kdWxlIGJ5IGlnbm9yaW5nIGZhaWx1cmVzIHRvCisJLyogUGVybWl0IG11bHRpcGxlIGxvYWRzIG9mIHRoZSBtb2R1bGUgYnkgaWdub3JpbmcgZmFpbHVyZXMgdG8KIAkgKiBjcmVhdGUgdGhlIGJvbmRpbmdfbWFzdGVycyBzeXNmcyBmaWxlLiAgQm9uZGluZyBkZXZpY2VzCiAJICogY3JlYXRlZCBieSBzZWNvbmQgb3Igc3Vic2VxdWVudCBsb2FkcyBvZiB0aGUgbW9kdWxlIHdpbGwKIAkgKiBub3QgYmUgbGlzdGVkIGluLCBvciBjb250cm9sbGFibGUgYnksIGJvbmRpbmdfbWFzdGVycywgYnV0CkBAIC0xMTQ0LDE2ICs3NjQsMTMgQEAKIAogfQogCi0vKgotICogUmVtb3ZlIC9zeXMvY2xhc3MvbmV0L2JvbmRpbmdfbWFzdGVycy4KLSAqLworLyogUmVtb3ZlIC9zeXMvY2xhc3MvbmV0L2JvbmRpbmdfbWFzdGVycy4gKi8KIHZvaWQgYm9uZF9kZXN0cm95X3N5c2ZzKHN0cnVjdCBib25kX25ldCAqYm4pCiB7CiAJbmV0ZGV2X2NsYXNzX3JlbW92ZV9maWxlX25zKCZibi0+Y2xhc3NfYXR0cl9ib25kaW5nX21hc3RlcnMsIGJuLT5uZXQpOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBzeXNmcyBmb3IgZWFjaCBib25kLiAgVGhpcyBzZXRzIHVwIGFuZCByZWdpc3RlcnMKKy8qIEluaXRpYWxpemUgc3lzZnMgZm9yIGVhY2ggYm9uZC4gIFRoaXMgc2V0cyB1cCBhbmQgcmVnaXN0ZXJzCiAgKiB0aGUgJ2JvbmRjdGwnIGRpcmVjdG9yeSBmb3IgZWFjaCBpbmRpdmlkdWFsIGJvbmQgdW5kZXIgL3N5cy9jbGFzcy9uZXQuCiAgKi8KIHZvaWQgYm9uZF9wcmVwYXJlX3N5c2ZzX2dyb3VwKHN0cnVjdCBib25kaW5nICpib25kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzX3NsYXZlLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnNfc2xhdmUuYwppbmRleCAyZTRlZWM1NC4uMTk4Njc3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzX3NsYXZlLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzX3NsYXZlLmMKQEAgLTY5LDggKzY5LDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgYWdncmVnYXRvciAqYWdnOwogCi0JaWYgKHNsYXZlLT5ib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7Ci0JCWFnZyA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQuYWdncmVnYXRvcjsKKwlpZiAoQk9ORF9NT0RFKHNsYXZlLT5ib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCWFnZyA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0LmFnZ3JlZ2F0b3I7CiAJCWlmIChhZ2cpCiAJCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJCQkgICAgICAgYWdnLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAppbmRleCAwMGJlYTMyLi4wYjRkOWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtNDEsNDIgKzQxLDYgQEAKIAogI2RlZmluZSBCT05EX0RFRkFVTFRfTUlJTU9OCTEwMAogCi0jZGVmaW5lIElTX1VQKGRldikJCQkJCSAgIFwKLQkgICAgICAoKCgoZGV2KS0+ZmxhZ3MgJiBJRkZfVVApID09IElGRl9VUCkJJiYgXAotCSAgICAgICBuZXRpZl9ydW5uaW5nKGRldikJCQkmJiBcCi0JICAgICAgIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKLQotLyoKLSAqIENoZWNrcyB3aGV0aGVyIHNsYXZlIGlzIHJlYWR5IGZvciB0cmFuc21pdC4KLSAqLwotI2RlZmluZSBTTEFWRV9JU19PSyhzbGF2ZSkJCQkgICAgICAgIFwKLQkJICAgICgoKHNsYXZlKS0+ZGV2LT5mbGFncyAmIElGRl9VUCkgICYmIFwKLQkJICAgICBuZXRpZl9ydW5uaW5nKChzbGF2ZSktPmRldikgICAgICYmIFwKLQkJICAgICAoKHNsYXZlKS0+bGluayA9PSBCT05EX0xJTktfVVApICYmIFwKLQkJICAgICBib25kX2lzX2FjdGl2ZV9zbGF2ZShzbGF2ZSkpCi0KLQotI2RlZmluZSBVU0VTX1BSSU1BUlkobW9kZSkJCQkJXAotCQkoKChtb2RlKSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB8fAlcCi0JCSAoKG1vZGUpID09IEJPTkRfTU9ERV9UTEIpICAgICAgICAgIHx8CVwKLQkJICgobW9kZSkgPT0gQk9ORF9NT0RFX0FMQikpCi0KLSNkZWZpbmUgQk9ORF9OT19VU0VTX0FSUChtb2RlKQkJCQlcCi0JCSgoKG1vZGUpID09IEJPTkRfTU9ERV84MDIzQUQpCXx8CVwKLQkJICgobW9kZSkgPT0gQk9ORF9NT0RFX1RMQikJfHwJXAotCQkgKChtb2RlKSA9PSBCT05EX01PREVfQUxCKSkKLQotI2RlZmluZSBUWF9RVUVVRV9PVkVSUklERShtb2RlKQkJCQlcCi0JCQkoKChtb2RlKSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB8fAlcCi0JCQkgKChtb2RlKSA9PSBCT05EX01PREVfUk9VTkRST0JJTikpCi0KLSNkZWZpbmUgQk9ORF9NT0RFX0lTX0xCKG1vZGUpCQkJXAotCQkoKChtb2RlKSA9PSBCT05EX01PREVfVExCKSB8fAlcCi0JCSAoKG1vZGUpID09IEJPTkRfTU9ERV9BTEIpKQotCi0jZGVmaW5lIElTX0lQX1RBUkdFVF9VTlVTQUJMRV9BRERSRVNTKGEpCVwKLQkoKGh0b25sKElOQUREUl9CUk9BRENBU1QpID09IGEpIHx8CVwKLQkgaXB2NF9pc196ZXJvbmV0KGEpKQogLyoKICAqIExlc3MgYmFkIHdheSB0byBjYWxsIGlvY3RsIGZyb20gd2l0aGluIHRoZSBrZXJuZWw7IHRoaXMgbmVlZHMgdG8gYmUKICAqIGRvbmUgc29tZSBvdGhlciB3YXkgdG8gZ2V0IHRoZSBjYWxsIG91dCBvZiBpbnRlcnJ1cHQgY29udGV4dC4KQEAgLTkwLDYgKzU0LDggQEAKIAlzZXRfZnMoZnMpOwkJCVwKIAlyZXM7IH0pCiAKKyNkZWZpbmUgQk9ORF9NT0RFKGJvbmQpICgoYm9uZCktPnBhcmFtcy5tb2RlKQorCiAvKiBzbGF2ZSBsaXN0IHByaW1pdGl2ZXMgKi8KICNkZWZpbmUgYm9uZF9zbGF2ZV9saXN0KGJvbmQpICgmKGJvbmQpLT5kZXYtPmFkal9saXN0Lmxvd2VyKQogCkBAIC0xNzUsNiArMTQxLDcgQEAKIAlpbnQgcmVzZW5kX2lnbXA7CiAJaW50IGxwX2ludGVydmFsOwogCWludCBwYWNrZXRzX3Blcl9zbGF2ZTsKKwlpbnQgdGxiX2R5bmFtaWNfbGI7CiAJc3RydWN0IHJlY2lwcm9jYWxfdmFsdWUgcmVjaXByb2NhbF9wYWNrZXRzX3Blcl9zbGF2ZTsKIH07CiAKQEAgLTE4Myw4ICsxNTAsNiBAQAogCWludCBtb2RlOwogfTsKIAotI2RlZmluZSBCT05EX01BWF9NT0RFTkFNRV9MRU4gMjAKLQogc3RydWN0IHNsYXZlIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBmaXJzdCAtIHVzZWZ1bCBmb3IgcGFuaWMgZGVidWcgKi8KIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZDsgLyogb3VyIG1hc3RlciAqLwpAQCAtMjA1LDcgKzE3MCw3IEBACiAJdTMyICAgIHNwZWVkOwogCXUxNiAgICBxdWV1ZV9pZDsKIAl1OCAgICAgcGVybV9od2FkZHJbRVRIX0FMRU5dOwotCXN0cnVjdCBhZF9zbGF2ZV9pbmZvIGFkX2luZm87IC8qIEhVR0UgLSBiZXR0ZXIgdG8gZHluYW1pY2FsbHkgYWxsb2MgKi8KKwlzdHJ1Y3QgYWRfc2xhdmVfaW5mbyAqYWRfaW5mbzsKIAlzdHJ1Y3QgdGxiX3NsYXZlX2luZm8gdGxiX2luZm87CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAlzdHJ1Y3QgbmV0cG9sbCAqbnA7CkBAIC0yODUsMTQgKzI1MCw0MSBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBib25kaW5nICpib25kX2dldF9ib25kX2J5X3NsYXZlKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCiB7Ci0JaWYgKCFzbGF2ZSB8fCAhc2xhdmUtPmJvbmQpCi0JCXJldHVybiBOVUxMOwogCXJldHVybiBzbGF2ZS0+Ym9uZDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGJvbmRfc2hvdWxkX292ZXJyaWRlX3R4X3F1ZXVlKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXJldHVybiBCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCB8fAorCSAgICAgICBCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX1JPVU5EUk9CSU47Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBib25kX2lzX2xiKGNvbnN0IHN0cnVjdCBib25kaW5nICpib25kKQogewotCXJldHVybiBCT05EX01PREVfSVNfTEIoYm9uZC0+cGFyYW1zLm1vZGUpOworCXJldHVybiBCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX1RMQiB8fAorCSAgICAgICBCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFX0FMQjsKK30KKworc3RhdGljIGlubGluZSBib29sIGJvbmRfbW9kZV91c2VzX2FycChpbnQgbW9kZSkKK3sKKwlyZXR1cm4gbW9kZSAhPSBCT05EX01PREVfODAyM0FEICYmIG1vZGUgIT0gQk9ORF9NT0RFX1RMQiAmJgorCSAgICAgICBtb2RlICE9IEJPTkRfTU9ERV9BTEI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBib25kX21vZGVfdXNlc19wcmltYXJ5KGludCBtb2RlKQoreworCXJldHVybiBtb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVAgfHwgbW9kZSA9PSBCT05EX01PREVfVExCIHx8CisJICAgICAgIG1vZGUgPT0gQk9ORF9NT0RFX0FMQjsKK30KKworc3RhdGljIGlubGluZSBib29sIGJvbmRfdXNlc19wcmltYXJ5KHN0cnVjdCBib25kaW5nICpib25kKQoreworCXJldHVybiBib25kX21vZGVfdXNlc19wcmltYXJ5KEJPTkRfTU9ERShib25kKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBib25kX3NsYXZlX2lzX3VwKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJcmV0dXJuIG5ldGlmX3J1bm5pbmcoc2xhdmUtPmRldikgJiYgbmV0aWZfY2Fycmllcl9vayhzbGF2ZS0+ZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJvbmRfc2V0X2FjdGl2ZV9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQpAQCAtMzY1LDYgKzM1NywxMiBAQAogCXJldHVybiAhYm9uZF9zbGF2ZV9zdGF0ZShzbGF2ZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBib25kX3NsYXZlX2Nhbl90eChzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXJldHVybiBib25kX3NsYXZlX2lzX3VwKHNsYXZlKSAmJiBzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVAgJiYKKwkgICAgICAgYm9uZF9pc19hY3RpdmVfc2xhdmUoc2xhdmUpOworfQorCiAjZGVmaW5lIEJPTkRfUFJJX1JFU0VMRUNUX0FMV0FZUwkwCiAjZGVmaW5lIEJPTkRfUFJJX1JFU0VMRUNUX0JFVFRFUgkxCiAjZGVmaW5lIEJPTkRfUFJJX1JFU0VMRUNUX0ZBSUxVUkUJMgpAQCAtMzk2LDEyICszOTQsMTYgQEAKIAlyZXR1cm4gYm9uZC0+cGFyYW1zLmFycF92YWxpZGF0ZSAmICgxIDw8IGJvbmRfc2xhdmVfc3RhdGUoc2xhdmUpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2xhdmVfZG9fYXJwX3ZhbGlkYXRlX29ubHkoc3RydWN0IGJvbmRpbmcgKmJvbmQsCi0JCQkJCSAgICAgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3N0YXRpYyBpbmxpbmUgaW50IHNsYXZlX2RvX2FycF92YWxpZGF0ZV9vbmx5KHN0cnVjdCBib25kaW5nICpib25kKQogewogCXJldHVybiBib25kLT5wYXJhbXMuYXJwX3ZhbGlkYXRlICYgQk9ORF9BUlBfRklMVEVSOwogfQogCitzdGF0aWMgaW5saW5lIGludCBib25kX2lzX2lwX3RhcmdldF9vayhfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gIWlwdjRfaXNfbGJjYXN0KGFkZHIpICYmICFpcHY0X2lzX3plcm9uZXQoYWRkcik7Cit9CisKIC8qIEdldCB0aGUgb2xkZXN0IGFycCB3aGljaCB3ZSd2ZSByZWNlaXZlZCBvbiB0aGlzIHNsYXZlIGZvciBib25kJ3MKICAqIGFycF90YXJnZXRzLgogICovCkBAIC00NzksMTYgKzQ4MSwxNCBAQAogCXJldHVybiBhZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgc2xhdmVfY2FuX3R4KHN0cnVjdCBzbGF2ZSAqc2xhdmUpCi17Ci0JaWYgKElTX1VQKHNsYXZlLT5kZXYpICYmIHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCAmJgotCSAgICBib25kX2lzX2FjdGl2ZV9zbGF2ZShzbGF2ZSkpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgYm9uZF9uZXQ7CitzdHJ1Y3QgYm9uZF9uZXQgeworCXN0cnVjdCBuZXQJCSpuZXQ7CS8qIEFzc29jaWF0ZWQgbmV0d29yayBuYW1lc3BhY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWRldl9saXN0OworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX2RpcjsKKyNlbmRpZgorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUJY2xhc3NfYXR0cl9ib25kaW5nX21hc3RlcnM7Cit9OwogCiBpbnQgYm9uZF9hcnBfcmN2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKIHZvaWQgYm9uZF9kZXZfcXVldWVfeG1pdChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2Rldik7CkBAIC01MDAsNyArNTAwLDcgQEAKIHZvaWQgYm9uZF9zeXNmc19zbGF2ZV9kZWwoc3RydWN0IHNsYXZlICpzbGF2ZSk7CiBpbnQgYm9uZF9lbnNsYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2Rldik7CiBpbnQgYm9uZF9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2Rldik7Ci1pbnQgYm9uZF94bWl0X2hhc2goc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBza19idWZmICpza2IsIGludCBjb3VudCk7Cit1MzIgYm9uZF94bWl0X2hhc2goc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQpOwogdm9pZCBib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqbmV3X2FjdGl2ZSk7CiB2b2lkIGJvbmRfY3JlYXRlX2RlYnVnZnModm9pZCk7CkBAIC01MTYsMTUgKzUxNiw5IEBACiBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9vcHRpb25fYWN0aXZlX3NsYXZlX2dldF9yY3Uoc3RydWN0IGJvbmRpbmcgKmJvbmQpOwogc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfb3B0aW9uX2FjdGl2ZV9zbGF2ZV9nZXQoc3RydWN0IGJvbmRpbmcgKmJvbmQpOwogY29uc3QgY2hhciAqYm9uZF9zbGF2ZV9saW5rX3N0YXR1cyhzOCBsaW5rKTsKLQotc3RydWN0IGJvbmRfbmV0IHsKLQlzdHJ1Y3QgbmV0ICoJCW5ldDsJLyogQXNzb2NpYXRlZCBuZXR3b3JrIG5hbWVzcGFjZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZGV2X2xpc3Q7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKglwcm9jX2RpcjsKLSNlbmRpZgotCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUJY2xhc3NfYXR0cl9ib25kaW5nX21hc3RlcnM7Ci19OworYm9vbCBib25kX3ZlcmlmeV9kZXZpY2VfcGF0aChzdHJ1Y3QgbmV0X2RldmljZSAqc3RhcnRfZGV2LAorCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZW5kX2RldiwKKwkJCSAgICAgc3RydWN0IGJvbmRfdmxhbl90YWcgKnRhZ3MpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHZvaWQgYm9uZF9jcmVhdGVfcHJvY19lbnRyeShzdHJ1Y3QgYm9uZGluZyAqYm9uZCk7CkBAIC01NzYsNiArNTcwLDI3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qIENhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jaygpIGZvciByZWFkICovCitzdGF0aWMgaW5saW5lIGJvb2wgYm9uZF9zbGF2ZV9oYXNfbWFjX3J4KHN0cnVjdCBib25kaW5nICpib25kLCBjb25zdCB1OCAqbWFjKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CisJc3RydWN0IHNsYXZlICp0bXA7CisJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmVfcmN1KGJvbmQsIHRtcCwgaXRlcikKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWxfNjRiaXRzKG1hYywgdG1wLT5kZXYtPmRldl9hZGRyKSkKKwkJCXJldHVybiB0cnVlOworCisJaWYgKG5ldGRldl91Y19lbXB0eShib25kLT5kZXYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgYm9uZC0+ZGV2KQorCQlpZiAoZXRoZXJfYWRkcl9lcXVhbF82NGJpdHMobWFjLCBoYS0+YWRkcikpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogLyogQ2hlY2sgaWYgdGhlIGlwIGlzIHByZXNlbnQgaW4gYXJwIGlwIGxpc3QsIG9yIGZpcnN0IGZyZWUgc2xvdCBpZiBpcCA9PSAwCiAgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZCwgaW5kZXggaWYgZm91bmQKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCA5ZTdkOTVkLi40MTY4ODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtNjUsNyArNjUsNyBAQAogCiBjb25maWcgQ0FOX0FUOTEKIAl0cmlzdGF0ZSAiQXRtZWwgQVQ5MSBvbmNoaXAgQ0FOIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBBUk0KKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSB8fCBDT01QSUxFX1RFU1QKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU29DIENBTiBjb250cm9sbGVyIGluIEF0bWVsJ3MgQVQ5MVNBTTkyNjMKIAkgIGFuZCBBVDkxU0FNOVg1IHByb2Nlc3NvcnMuCkBAIC03NywxMiArNzcsNiBAQAogCSAgRHJpdmVyIGZvciBUSSBIRUNDIChIaWdoIEVuZCBDQU4gQ29udHJvbGxlcikgbW9kdWxlIGZvdW5kIG9uIG1hbnkKIAkgIFRJIGRldmljZXMuIFRoZSBkZXZpY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGF2YWlsYWJsZSBmcm9tIHd3dy50aS5jb20KIAotY29uZmlnIENBTl9NQ1AyNTFYCi0JdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyNTF4IFNQSSBDQU4gY29udHJvbGxlcnMiCi0JZGVwZW5kcyBvbiBTUEkgJiYgSEFTX0RNQQotCS0tLWhlbHAtLS0KLQkgIERyaXZlciBmb3IgdGhlIE1pY3JvY2hpcCBNQ1AyNTF4IFNQSSBDQU4gY29udHJvbGxlcnMuCi0KIGNvbmZpZyBDQU5fQkZJTgogCWRlcGVuZHMgb24gQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcgfHwgQkY1MzggfHwgQkY1MzkgfHwgQkY1NHgKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQmxhY2tmaW4gb24tY2hpcCBDQU4iCkBAIC0xMTAsNyArMTA0LDcgQEAKIAogY29uZmlnIFBDSF9DQU4KIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIIENBTiBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBDT01QSUxFX1RFU1QpCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIFBDSCBDQU4gb2YgVG9wY2xpZmYgKEludGVsIEVHMjBUIFBDSCkgd2hpY2gKIAkgIGlzIGFuIElPSCBmb3IgeDg2IGVtYmVkZGVkIHByb2Nlc3NvciAoSW50ZWwgQXRvbSBFNnh4IHNlcmllcykuCkBAIC0xMjUsNiArMTE5LDI0IEBACiAJICBlbmRpYW4gc3ludGhlc2VzIG9mIHRoZSBjb3JlcyB3b3VsZCBuZWVkIHNvbWUgbW9kaWZpY2F0aW9ucyBvbgogCSAgdGhlIGhhcmR3YXJlIGxldmVsIHRvIHdvcmsuCiAKK2NvbmZpZyBDQU5fUkNBUgorCXRyaXN0YXRlICJSZW5lc2FzIFItQ2FyIENBTiBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJNCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgQ0FOIGNvbnRyb2xsZXIgZm91bmQgb24gUmVuZXNhcyBSLUNhcgorCSAgU29Dcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgcmNhcl9jYW4uCisKK2NvbmZpZyBDQU5fWElMSU5YQ0FOCisJdHJpc3RhdGUgIlhpbGlueCBDQU4iCisJZGVwZW5kcyBvbiBBUkNIX1pZTlEgfHwgTUlDUk9CTEFaRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsgJiYgSEFTX0lPTUVNCisJLS0taGVscC0tLQorCSAgWGlsaW54IENBTiBkcml2ZXIuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGJvdGggc29mdCBBWEkgQ0FOIElQIGFuZAorCSAgWnlucSBDQU5QUyBJUC4KKwogc291cmNlICJkcml2ZXJzL25ldC9jYW4vbXNjYW4vS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL25ldC9jYW4vc2phMTAwMC9LY29uZmlnIgpAQCAtMTMzLDYgKzE0NSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL2NjNzcwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9uZXQvY2FuL3NwaS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbmV0L2Nhbi91c2IvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL25ldC9jYW4vc29mdGluZy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlCmluZGV4IGM3NDQwMzkuLjE2OTdmMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIAogY2FuLWRldi0kKENPTkZJR19DQU5fTEVEUykJKz0gbGVkLm8KIAorb2JqLXkJCQkJKz0gc3BpLwogb2JqLXkJCQkJKz0gdXNiLwogb2JqLXkJCQkJKz0gc29mdGluZy8KIApAQCAtMTksMTEgKzIwLDEyIEBACiBvYmotJChDT05GSUdfQ0FOX0NDNzcwKQkJKz0gY2M3NzAvCiBvYmotJChDT05GSUdfQ0FOX0FUOTEpCQkrPSBhdDkxX2Nhbi5vCiBvYmotJChDT05GSUdfQ0FOX1RJX0hFQ0MpCSs9IHRpX2hlY2Mubwotb2JqLSQoQ09ORklHX0NBTl9NQ1AyNTFYKQkrPSBtY3AyNTF4Lm8KIG9iai0kKENPTkZJR19DQU5fQkZJTikJCSs9IGJmaW5fY2FuLm8KIG9iai0kKENPTkZJR19DQU5fSkFOWl9JQ0FOMykJKz0gamFuei1pY2FuMy5vCiBvYmotJChDT05GSUdfQ0FOX0ZMRVhDQU4pCSs9IGZsZXhjYW4ubwogb2JqLSQoQ09ORklHX1BDSF9DQU4pCQkrPSBwY2hfY2FuLm8KIG9iai0kKENPTkZJR19DQU5fR1JDQU4pCQkrPSBncmNhbi5vCitvYmotJChDT05GSUdfQ0FOX1JDQVIpCQkrPSByY2FyX2Nhbi5vCitvYmotJChDT05GSUdfQ0FOX1hJTElOWENBTikJKz0geGlsaW54X2Nhbi5vCiAKIGNjZmxhZ3MtJChDT05GSUdfQ0FOX0RFQlVHX0RFVklDRVMpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKaW5kZXggOTVlMDRlMi4uOGU3OGJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKQEAgLTI1Miw4ICsyNTIsNyBAQAogCXN0cnVjdCBjX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgY250LCByZWcgPSBDX0NBTl9JRkFDRShDT01SRVFfUkVHLCBpZmFjZSk7CiAKLQlwcml2LT53cml0ZV9yZWcocHJpdiwgcmVnICsgMSwgY21kKTsKLQlwcml2LT53cml0ZV9yZWcocHJpdiwgcmVnLCBvYmopOworCXByaXYtPndyaXRlX3JlZzMyKHByaXYsIHJlZywgKGNtZCA8PCAxNikgfCBvYmopOwogCiAJZm9yIChjbnQgPSBNSU5fVElNRU9VVF9WQUxVRTsgY250OyBjbnQtLSkgewogCQlpZiAoIShwcml2LT5yZWFkX3JlZyhwcml2LCByZWcpICYgSUZfQ09NUl9CVVNZKSkKQEAgLTMyOCw4ICszMjcsNyBAQAogCQljaGFuZ2VfYml0KGlkeCwgJnByaXYtPnR4X2Rpcik7CiAJfQogCi0JcHJpdi0+d3JpdGVfcmVnKHByaXYsIENfQ0FOX0lGQUNFKEFSQjFfUkVHLCBpZmFjZSksIGFyYik7Ci0JcHJpdi0+d3JpdGVfcmVnKHByaXYsIENfQ0FOX0lGQUNFKEFSQjJfUkVHLCBpZmFjZSksIGFyYiA+PiAxNik7CisJcHJpdi0+d3JpdGVfcmVnMzIocHJpdiwgQ19DQU5fSUZBQ0UoQVJCMV9SRUcsIGlmYWNlKSwgYXJiKTsKIAogCXByaXYtPndyaXRlX3JlZyhwcml2LCBDX0NBTl9JRkFDRShNU0dDVFJMX1JFRywgaWZhY2UpLCBjdHJsKTsKIApAQCAtMzkxLDggKzM4OSw3IEBACiAKIAlmcmFtZS0+Y2FuX2RsYyA9IGdldF9jYW5fZGxjKGN0cmwgJiAweDBGKTsKIAotCWFyYiA9IHByaXYtPnJlYWRfcmVnKHByaXYsIENfQ0FOX0lGQUNFKEFSQjFfUkVHLCBpZmFjZSkpOwotCWFyYiB8PSBwcml2LT5yZWFkX3JlZyhwcml2LCBDX0NBTl9JRkFDRShBUkIyX1JFRywgaWZhY2UpKSA8PCAxNjsKKwlhcmIgPSBwcml2LT5yZWFkX3JlZzMyKHByaXYsIENfQ0FOX0lGQUNFKEFSQjFfUkVHLCBpZmFjZSkpOwogCiAJaWYgKGFyYiAmIElGX0FSQl9NU0dYVEQpCiAJCWZyYW1lLT5jYW5faWQgPSAoYXJiICYgQ0FOX0VGRl9NQVNLKSB8IENBTl9FRkZfRkxBRzsKQEAgLTQyNCwxMiArNDIxLDEwIEBACiAJc3RydWN0IGNfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJbWFzayB8PSBCSVQoMjkpOwotCXByaXYtPndyaXRlX3JlZyhwcml2LCBDX0NBTl9JRkFDRShNQVNLMV9SRUcsIGlmYWNlKSwgbWFzayk7Ci0JcHJpdi0+d3JpdGVfcmVnKHByaXYsIENfQ0FOX0lGQUNFKE1BU0syX1JFRywgaWZhY2UpLCBtYXNrID4+IDE2KTsKKwlwcml2LT53cml0ZV9yZWczMihwcml2LCBDX0NBTl9JRkFDRShNQVNLMV9SRUcsIGlmYWNlKSwgbWFzayk7CiAKIAlpZCB8PSBJRl9BUkJfTVNHVkFMOwotCXByaXYtPndyaXRlX3JlZyhwcml2LCBDX0NBTl9JRkFDRShBUkIxX1JFRywgaWZhY2UpLCBpZCk7Ci0JcHJpdi0+d3JpdGVfcmVnKHByaXYsIENfQ0FOX0lGQUNFKEFSQjJfUkVHLCBpZmFjZSksIGlkID4+IDE2KTsKKwlwcml2LT53cml0ZV9yZWczMihwcml2LCBDX0NBTl9JRkFDRShBUkIxX1JFRywgaWZhY2UpLCBpZCk7CiAKIAlwcml2LT53cml0ZV9yZWcocHJpdiwgQ19DQU5fSUZBQ0UoTVNHQ1RSTF9SRUcsIGlmYWNlKSwgbWNvbnQpOwogCWNfY2FuX29iamVjdF9wdXQoZGV2LCBpZmFjZSwgb2JqLCBJRl9DT01NX1JDVl9TRVRVUCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW4uaCBiL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbi5oCmluZGV4IGM1NmYxYjEuLjk5YWQxYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbi5oCkBAIC03OCw2ICs3OCw3IEBACiAJQ19DQU5fSU5UUE5EMl9SRUcsCiAJQ19DQU5fTVNHVkFMMV9SRUcsCiAJQ19DQU5fTVNHVkFMMl9SRUcsCisJQ19DQU5fRlVOQ1RJT05fUkVHLAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiByZWdfbWFwX2NfY2FuW10gPSB7CkBAIC0xMjksNiArMTMwLDcgQEAKIAlbQ19DQU5fQlJQRVhUX1JFR10JPSAweDBFLAogCVtDX0NBTl9JTlRfUkVHXQkJPSAweDEwLAogCVtDX0NBTl9URVNUX1JFR10JPSAweDE0LAorCVtDX0NBTl9GVU5DVElPTl9SRUddCT0gMHgxOCwKIAlbQ19DQU5fVFhSUVNUMV9SRUddCT0gMHg4OCwKIAlbQ19DQU5fVFhSUVNUMl9SRUddCT0gMHg4QSwKIAlbQ19DQU5fTkVXREFUMV9SRUddCT0gMHg5QywKQEAgLTE3Niw4ICsxNzgsMTAgQEAKIAlhdG9taWNfdCB0eF9hY3RpdmU7CiAJdW5zaWduZWQgbG9uZyB0eF9kaXI7CiAJaW50IGxhc3Rfc3RhdHVzOwotCXUxNiAoKnJlYWRfcmVnKSAoc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGVudW0gcmVnIGluZGV4KTsKLQl2b2lkICgqd3JpdGVfcmVnKSAoc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGVudW0gcmVnIGluZGV4LCB1MTYgdmFsKTsKKwl1MTYgKCpyZWFkX3JlZykgKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCk7CisJdm9pZCAoKndyaXRlX3JlZykgKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCwgdTE2IHZhbCk7CisJdTMyICgqcmVhZF9yZWczMikgKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCk7CisJdm9pZCAoKndyaXRlX3JlZzMyKSAoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGVudW0gcmVnIGluZGV4LCB1MzIgdmFsKTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJY29uc3QgdTE2ICpyZWdzOwogCXZvaWQgKnByaXY7CQkvKiBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BjaS5jIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BjaS5jCmluZGV4IGZlNWY2MzAuLjVkMTFlMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbl9wY2kuYworKysgYi9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW5fcGNpLmMKQEAgLTE5LDkgKzE5LDEzIEBACiAKICNpbmNsdWRlICJjX2Nhbi5oIgogCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENIX0NBTgkweDg4MTgKKyNkZWZpbmUgUENIX1BDSV9TT0ZUX1JFU0VUCTB4MDFmYworCiBlbnVtIGNfY2FuX3BjaV9yZWdfYWxpZ24gewogCUNfQ0FOX1JFR19BTElHTl8xNiwKIAlDX0NBTl9SRUdfQUxJR05fMzIsCisJQ19DQU5fUkVHXzMyLAogfTsKIAogc3RydWN0IGNfY2FuX3BjaV9kYXRhIHsKQEAgLTMxLDYgKzM1LDEwIEBACiAJZW51bSBjX2Nhbl9wY2lfcmVnX2FsaWduIHJlZ19hbGlnbjsKIAkvKiBTZXQgdGhlIGZyZXF1ZW5jeSAqLwogCXVuc2lnbmVkIGludCBmcmVxOworCS8qIFBDSSBiYXIgbnVtYmVyICovCisJaW50IGJhcjsKKwkvKiBDYWxsYmFjayBmb3IgcmVzZXQgKi8KKwl2b2lkICgqaW5pdCkoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGJvb2wgZW5hYmxlKTsKIH07CiAKIC8qCkBAIC0zOSwzMCArNDcsNzAgQEAKICAqIHJlZ2lzdGVycyBjYW4gYmUgYWxpZ25lZCB0byBhIDE2LWJpdCBib3VuZGFyeSBvciAzMi1iaXQgYm91bmRhcnkgZXRjLgogICogSGFuZGxlIHRoZSBzYW1lIGJ5IHByb3ZpZGluZyBhIGNvbW1vbiByZWFkL3dyaXRlIGludGVyZmFjZS4KICAqLwotc3RhdGljIHUxNiBjX2Nhbl9wY2lfcmVhZF9yZWdfYWxpZ25lZF90b18xNmJpdChzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKK3N0YXRpYyB1MTYgY19jYW5fcGNpX3JlYWRfcmVnX2FsaWduZWRfdG9fMTZiaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsCiAJCQkJCQllbnVtIHJlZyBpbmRleCkKIHsKIAlyZXR1cm4gcmVhZHcocHJpdi0+YmFzZSArIHByaXYtPnJlZ3NbaW5kZXhdKTsKIH0KIAotc3RhdGljIHZvaWQgY19jYW5fcGNpX3dyaXRlX3JlZ19hbGlnbmVkX3RvXzE2Yml0KHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LAorc3RhdGljIHZvaWQgY19jYW5fcGNpX3dyaXRlX3JlZ19hbGlnbmVkX3RvXzE2Yml0KGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LAogCQkJCQkJZW51bSByZWcgaW5kZXgsIHUxNiB2YWwpCiB7CiAJd3JpdGV3KHZhbCwgcHJpdi0+YmFzZSArIHByaXYtPnJlZ3NbaW5kZXhdKTsKIH0KIAotc3RhdGljIHUxNiBjX2Nhbl9wY2lfcmVhZF9yZWdfYWxpZ25lZF90b18zMmJpdChzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKK3N0YXRpYyB1MTYgY19jYW5fcGNpX3JlYWRfcmVnX2FsaWduZWRfdG9fMzJiaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsCiAJCQkJCQllbnVtIHJlZyBpbmRleCkKIHsKIAlyZXR1cm4gcmVhZHcocHJpdi0+YmFzZSArIDIgKiBwcml2LT5yZWdzW2luZGV4XSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNfY2FuX3BjaV93cml0ZV9yZWdfYWxpZ25lZF90b18zMmJpdChzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGNfY2FuX3BjaV93cml0ZV9yZWdfYWxpZ25lZF90b18zMmJpdChjb25zdCBzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKIAkJCQkJCWVudW0gcmVnIGluZGV4LCB1MTYgdmFsKQogewogCXdyaXRldyh2YWwsIHByaXYtPmJhc2UgKyAyICogcHJpdi0+cmVnc1tpbmRleF0pOwogfQogCitzdGF0aWMgdTE2IGNfY2FuX3BjaV9yZWFkX3JlZ18zMmJpdChjb25zdCBzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKKwkJCQkgICAgZW51bSByZWcgaW5kZXgpCit7CisJcmV0dXJuICh1MTYpaW9yZWFkMzIocHJpdi0+YmFzZSArIDIgKiBwcml2LT5yZWdzW2luZGV4XSk7Cit9CisKK3N0YXRpYyB2b2lkIGNfY2FuX3BjaV93cml0ZV9yZWdfMzJiaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsCisJCQkJICAgICAgZW51bSByZWcgaW5kZXgsIHUxNiB2YWwpCit7CisJaW93cml0ZTMyKCh1MzIpdmFsLCBwcml2LT5iYXNlICsgMiAqIHByaXYtPnJlZ3NbaW5kZXhdKTsKK30KKworc3RhdGljIHUzMiBjX2Nhbl9wY2lfcmVhZF9yZWczMihjb25zdCBzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwgZW51bSByZWcgaW5kZXgpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHByaXYtPnJlYWRfcmVnKHByaXYsIGluZGV4KTsKKwl2YWwgfD0gKCh1MzIpIHByaXYtPnJlYWRfcmVnKHByaXYsIGluZGV4ICsgMSkpIDw8IDE2OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgY19jYW5fcGNpX3dyaXRlX3JlZzMyKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCwKKwkJdTMyIHZhbCkKK3sKKwlwcml2LT53cml0ZV9yZWcocHJpdiwgaW5kZXggKyAxLCB2YWwgPj4gMTYpOworCXByaXYtPndyaXRlX3JlZyhwcml2LCBpbmRleCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY19jYW5fcGNpX3Jlc2V0X3BjaChjb25zdCBzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQl1MzIgX19pb21lbSAqYWRkciA9IHByaXYtPmJhc2UgKyBQQ0hfUENJX1NPRlRfUkVTRVQ7CisKKwkJLyogd3JpdGUgdG8gc3cgcmVzZXQgcmVnaXN0ZXIgKi8KKwkJaW93cml0ZTMyKDEsIGFkZHIpOworCQlpb3dyaXRlMzIoMCwgYWRkcik7CisJfQorfQorCiBzdGF0aWMgaW50IGNfY2FuX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC05MCw3ICsxMzgsOCBAQAogCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAl9CiAKLQlhZGRyID0gcGNpX2lvbWFwKHBkZXYsIDAsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWFkZHIgPSBwY2lfaW9tYXAocGRldiwgY19jYW5fcGNpX2RhdGEtPmJhciwKKwkJCSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGNfY2FuX3BjaV9kYXRhLT5iYXIpKTsKIAlpZiAoIWFkZHIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJImRldmljZSBoYXMgbm8gUENJIG1lbW9yeSByZXNvdXJjZXMsICIKQEAgLTE0NywxMCArMTk2LDE4IEBACiAJCXByaXYtPnJlYWRfcmVnID0gY19jYW5fcGNpX3JlYWRfcmVnX2FsaWduZWRfdG9fMTZiaXQ7CiAJCXByaXYtPndyaXRlX3JlZyA9IGNfY2FuX3BjaV93cml0ZV9yZWdfYWxpZ25lZF90b18xNmJpdDsKIAkJYnJlYWs7CisJY2FzZSBDX0NBTl9SRUdfMzI6CisJCXByaXYtPnJlYWRfcmVnID0gY19jYW5fcGNpX3JlYWRfcmVnXzMyYml0OworCQlwcml2LT53cml0ZV9yZWcgPSBjX2Nhbl9wY2lfd3JpdGVfcmVnXzMyYml0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlX2NfY2FuOwogCX0KKwlwcml2LT5yZWFkX3JlZzMyID0gY19jYW5fcGNpX3JlYWRfcmVnMzI7CisJcHJpdi0+d3JpdGVfcmVnMzIgPSBjX2Nhbl9wY2lfd3JpdGVfcmVnMzI7CisKKwlwcml2LT5yYW1pbml0ID0gY19jYW5fcGNpX2RhdGEtPmluaXQ7CiAKIAlyZXQgPSByZWdpc3Rlcl9jX2Nhbl9kZXYoZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0xOTgsNiArMjU1LDE1IEBACiAJLnR5cGUgPSBCT1NDSF9DX0NBTiwKIAkucmVnX2FsaWduID0gQ19DQU5fUkVHX0FMSUdOXzMyLAogCS5mcmVxID0gNTIwMDAwMDAsIC8qIDUyIE1oeiAqLworCS5iYXIgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjX2Nhbl9wY2lfZGF0YSBjX2Nhbl9wY2ggPSB7CisJLnR5cGUgPSBCT1NDSF9DX0NBTiwKKwkucmVnX2FsaWduID0gQ19DQU5fUkVHXzMyLAorCS5mcmVxID0gNTAwMDAwMDAsIC8qIDUwIE1IeiAqLworCS5pbml0ID0gY19jYW5fcGNpX3Jlc2V0X3BjaCwKKwkuYmFyID0gMSwKIH07CiAKICNkZWZpbmUgQ19DQU5fSUQoX3ZlbmQsIF9kZXYsIF9kcml2ZXJkYXRhKSB7CQlcCkBAIC0yMDcsNiArMjczLDggQEAKIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShjX2Nhbl9wY2lfdGJsKSA9IHsKIAlDX0NBTl9JRChQQ0lfVkVORE9SX0lEX1NUTUlDUk8sIFBDSV9ERVZJQ0VfSURfU1RNSUNST19DQU4sCiAJCSBjX2Nhbl9zdGEyeDExKSwKKwlDX0NBTl9JRChQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX1BDSF9DQU4sCisJCSBjX2Nhbl9wY2gpLAogCXt9LAogfTsKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjX2Nhbl9wY2lfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW5fcGxhdGZvcm0uYwppbmRleCAxZGYwYjMyLi44MjQxMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW5fcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW5fcGxhdGZvcm0uYwpAQCAtNDAsNiArNDAsNyBAQAogI2RlZmluZSBDQU5fUkFNSU5JVF9TVEFSVF9NQVNLKGkpCSgweDAwMSA8PCAoaSkpCiAjZGVmaW5lIENBTl9SQU1JTklUX0RPTkVfTUFTSyhpKQkoMHgxMDAgPDwgKGkpKQogI2RlZmluZSBDQU5fUkFNSU5JVF9BTExfTUFTSyhpKQkJKDB4MTAxIDw8IChpKSkKKyNkZWZpbmUgRENBTl9SQU1fSU5JVF9CSVQJCSgxIDw8IDMpCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJhbWluaXRfbG9jayk7CiAvKgogICogMTYtYml0IGNfY2FuIHJlZ2lzdGVycyBjYW4gYmUgYXJyYW5nZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1lbW9yeQpAQCAtNDcsMzEgKzQ4LDMxIEBACiAgKiByZWdpc3RlcnMgY2FuIGJlIGFsaWduZWQgdG8gYSAxNi1iaXQgYm91bmRhcnkgb3IgMzItYml0IGJvdW5kYXJ5IGV0Yy4KICAqIEhhbmRsZSB0aGUgc2FtZSBieSBwcm92aWRpbmcgYSBjb21tb24gcmVhZC93cml0ZSBpbnRlcmZhY2UuCiAgKi8KLXN0YXRpYyB1MTYgY19jYW5fcGxhdF9yZWFkX3JlZ19hbGlnbmVkX3RvXzE2Yml0KHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LAorc3RhdGljIHUxNiBjX2Nhbl9wbGF0X3JlYWRfcmVnX2FsaWduZWRfdG9fMTZiaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsCiAJCQkJCQllbnVtIHJlZyBpbmRleCkKIHsKIAlyZXR1cm4gcmVhZHcocHJpdi0+YmFzZSArIHByaXYtPnJlZ3NbaW5kZXhdKTsKIH0KIAotc3RhdGljIHZvaWQgY19jYW5fcGxhdF93cml0ZV9yZWdfYWxpZ25lZF90b18xNmJpdChzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGNfY2FuX3BsYXRfd3JpdGVfcmVnX2FsaWduZWRfdG9fMTZiaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsCiAJCQkJCQllbnVtIHJlZyBpbmRleCwgdTE2IHZhbCkKIHsKIAl3cml0ZXcodmFsLCBwcml2LT5iYXNlICsgcHJpdi0+cmVnc1tpbmRleF0pOwogfQogCi1zdGF0aWMgdTE2IGNfY2FuX3BsYXRfcmVhZF9yZWdfYWxpZ25lZF90b18zMmJpdChzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKK3N0YXRpYyB1MTYgY19jYW5fcGxhdF9yZWFkX3JlZ19hbGlnbmVkX3RvXzMyYml0KGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LAogCQkJCQkJZW51bSByZWcgaW5kZXgpCiB7CiAJcmV0dXJuIHJlYWR3KHByaXYtPmJhc2UgKyAyICogcHJpdi0+cmVnc1tpbmRleF0pOwogfQogCi1zdGF0aWMgdm9pZCBjX2Nhbl9wbGF0X3dyaXRlX3JlZ19hbGlnbmVkX3RvXzMyYml0KHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LAorc3RhdGljIHZvaWQgY19jYW5fcGxhdF93cml0ZV9yZWdfYWxpZ25lZF90b18zMmJpdChjb25zdCBzdHJ1Y3QgY19jYW5fcHJpdiAqcHJpdiwKIAkJCQkJCWVudW0gcmVnIGluZGV4LCB1MTYgdmFsKQogewogCXdyaXRldyh2YWwsIHByaXYtPmJhc2UgKyAyICogcHJpdi0+cmVnc1tpbmRleF0pOwogfQogCi1zdGF0aWMgdm9pZCBjX2Nhbl9od19yYW1pbml0X3dhaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIHUzMiBtYXNrLAorc3RhdGljIHZvaWQgY19jYW5faHdfcmFtaW5pdF93YWl0X3RpKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCB1MzIgbWFzaywKIAkJCQkgIHUzMiB2YWwpCiB7CiAJLyogV2UgbG9vayBvbmx5IGF0IHRoZSBiaXRzIG9mIG91ciBpbnN0YW5jZS4gKi8KQEAgLTgwLDcgKzgxLDcgQEAKIAkJdWRlbGF5KDEpOwogfQogCi1zdGF0aWMgdm9pZCBjX2Nhbl9od19yYW1pbml0KGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBib29sIGVuYWJsZSkKK3N0YXRpYyB2b2lkIGNfY2FuX2h3X3JhbWluaXRfdGkoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGJvb2wgZW5hYmxlKQogewogCXUzMiBtYXNrID0gQ0FOX1JBTUlOSVRfQUxMX01BU0socHJpdi0+aW5zdGFuY2UpOwogCXUzMiBjdHJsOwpAQCAtOTYsMTggKzk3LDY4IEBACiAJY3RybCB8PSBDQU5fUkFNSU5JVF9ET05FX01BU0socHJpdi0+aW5zdGFuY2UpOwogCXdyaXRlbChjdHJsLCBwcml2LT5yYW1pbml0X2N0cmxyZWcpOwogCWN0cmwgJj0gfkNBTl9SQU1JTklUX0RPTkVfTUFTSyhwcml2LT5pbnN0YW5jZSk7Ci0JY19jYW5faHdfcmFtaW5pdF93YWl0KHByaXYsIGN0cmwsIG1hc2spOworCWNfY2FuX2h3X3JhbWluaXRfd2FpdF90aShwcml2LCBjdHJsLCBtYXNrKTsKIAogCWlmIChlbmFibGUpIHsKIAkJLyogU2V0IHN0YXJ0IGJpdCBhbmQgd2FpdCBmb3IgdGhlIGRvbmUgYml0LiAqLwogCQljdHJsIHw9IENBTl9SQU1JTklUX1NUQVJUX01BU0socHJpdi0+aW5zdGFuY2UpOwogCQl3cml0ZWwoY3RybCwgcHJpdi0+cmFtaW5pdF9jdHJscmVnKTsKIAkJY3RybCB8PSBDQU5fUkFNSU5JVF9ET05FX01BU0socHJpdi0+aW5zdGFuY2UpOwotCQljX2Nhbl9od19yYW1pbml0X3dhaXQocHJpdiwgY3RybCwgbWFzayk7CisJCWNfY2FuX2h3X3JhbWluaXRfd2FpdF90aShwcml2LCBjdHJsLCBtYXNrKTsKIAl9CiAJc3Bpbl91bmxvY2soJnJhbWluaXRfbG9jayk7CiB9CiAKK3N0YXRpYyB1MzIgY19jYW5fcGxhdF9yZWFkX3JlZzMyKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgaW5kZXgpOworCXZhbCB8PSAoKHUzMikgcHJpdi0+cmVhZF9yZWcocHJpdiwgaW5kZXggKyAxKSkgPDwgMTY7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBjX2Nhbl9wbGF0X3dyaXRlX3JlZzMyKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCwKKwkJdTMyIHZhbCkKK3sKKwlwcml2LT53cml0ZV9yZWcocHJpdiwgaW5kZXggKyAxLCB2YWwgPj4gMTYpOworCXByaXYtPndyaXRlX3JlZyhwcml2LCBpbmRleCwgdmFsKTsKK30KKworc3RhdGljIHUzMiBkX2Nhbl9wbGF0X3JlYWRfcmVnMzIoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGVudW0gcmVnIGluZGV4KQoreworCXJldHVybiByZWFkbChwcml2LT5iYXNlICsgcHJpdi0+cmVnc1tpbmRleF0pOworfQorCitzdGF0aWMgdm9pZCBkX2Nhbl9wbGF0X3dyaXRlX3JlZzMyKGNvbnN0IHN0cnVjdCBjX2Nhbl9wcml2ICpwcml2LCBlbnVtIHJlZyBpbmRleCwKKwkJdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBwcml2LT5iYXNlICsgcHJpdi0+cmVnc1tpbmRleF0pOworfQorCitzdGF0aWMgdm9pZCBjX2Nhbl9od19yYW1pbml0X3dhaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIHUzMiBtYXNrKQoreworCXdoaWxlIChwcml2LT5yZWFkX3JlZzMyKHByaXYsIENfQ0FOX0ZVTkNUSU9OX1JFRykgJiBtYXNrKQorCQl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNfY2FuX2h3X3JhbWluaXQoY29uc3Qgc3RydWN0IGNfY2FuX3ByaXYgKnByaXYsIGJvb2wgZW5hYmxlKQoreworCXUzMiBjdHJsOworCisJY3RybCA9IHByaXYtPnJlYWRfcmVnMzIocHJpdiwgQ19DQU5fRlVOQ1RJT05fUkVHKTsKKwljdHJsICY9IH5EQ0FOX1JBTV9JTklUX0JJVDsKKwlwcml2LT53cml0ZV9yZWczMihwcml2LCBDX0NBTl9GVU5DVElPTl9SRUcsIGN0cmwpOworCWNfY2FuX2h3X3JhbWluaXRfd2FpdChwcml2LCBjdHJsKTsKKworCWlmIChlbmFibGUpIHsKKwkJY3RybCB8PSBEQ0FOX1JBTV9JTklUX0JJVDsKKwkJcHJpdi0+d3JpdGVfcmVnMzIocHJpdiwgQ19DQU5fRlVOQ1RJT05fUkVHLCBjdHJsKTsKKwkJY19jYW5faHdfcmFtaW5pdF93YWl0KHByaXYsIGN0cmwpOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgY19jYW5faWRfdGFibGVbXSA9IHsKIAlbQk9TQ0hfQ19DQU5fUExBVEZPUk1dID0gewogCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLApAQCAtMjAxLDExICsyNTIsMTUgQEAKIAkJY2FzZSBJT1JFU09VUkNFX01FTV8zMkJJVDoKIAkJCXByaXYtPnJlYWRfcmVnID0gY19jYW5fcGxhdF9yZWFkX3JlZ19hbGlnbmVkX3RvXzMyYml0OwogCQkJcHJpdi0+d3JpdGVfcmVnID0gY19jYW5fcGxhdF93cml0ZV9yZWdfYWxpZ25lZF90b18zMmJpdDsKKwkJCXByaXYtPnJlYWRfcmVnMzIgPSBjX2Nhbl9wbGF0X3JlYWRfcmVnMzI7CisJCQlwcml2LT53cml0ZV9yZWczMiA9IGNfY2FuX3BsYXRfd3JpdGVfcmVnMzI7CiAJCQlicmVhazsKIAkJY2FzZSBJT1JFU09VUkNFX01FTV8xNkJJVDoKIAkJZGVmYXVsdDoKIAkJCXByaXYtPnJlYWRfcmVnID0gY19jYW5fcGxhdF9yZWFkX3JlZ19hbGlnbmVkX3RvXzE2Yml0OwogCQkJcHJpdi0+d3JpdGVfcmVnID0gY19jYW5fcGxhdF93cml0ZV9yZWdfYWxpZ25lZF90b18xNmJpdDsKKwkJCXByaXYtPnJlYWRfcmVnMzIgPSBjX2Nhbl9wbGF0X3JlYWRfcmVnMzI7CisJCQlwcml2LT53cml0ZV9yZWczMiA9IGNfY2FuX3BsYXRfd3JpdGVfcmVnMzI7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTIxNCw2ICsyNjksOCBAQAogCQlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkIHw9IENBTl9DVFJMTU9ERV8zX1NBTVBMRVM7CiAJCXByaXYtPnJlYWRfcmVnID0gY19jYW5fcGxhdF9yZWFkX3JlZ19hbGlnbmVkX3RvXzE2Yml0OwogCQlwcml2LT53cml0ZV9yZWcgPSBjX2Nhbl9wbGF0X3dyaXRlX3JlZ19hbGlnbmVkX3RvXzE2Yml0OworCQlwcml2LT5yZWFkX3JlZzMyID0gZF9jYW5fcGxhdF9yZWFkX3JlZzMyOworCQlwcml2LT53cml0ZV9yZWczMiA9IGRfY2FuX3BsYXRfd3JpdGVfcmVnMzI7CiAKIAkJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQogCQkJcHJpdi0+aW5zdGFuY2UgPSBvZl9hbGlhc19nZXRfaWQocGRldi0+ZGV2Lm9mX25vZGUsICJkX2NhbiIpOwpAQCAtMjIxLDExICsyNzgsMjAgQEAKIAkJCXByaXYtPmluc3RhbmNlID0gcGRldi0+aWQ7CiAKIAkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwkJLyogTm90IGFsbCBEX0NBTiBtb2R1bGVzIGhhdmUgYSBzZXBhcmF0ZSByZWdpc3RlciBmb3IgdGhlIERfQ0FOCisJCSAqIFJBTSBpbml0aWFsaXphdGlvbi4gVXNlIGRlZmF1bHQgUkFNIGluaXQgYml0IGluIERfQ0FOIG1vZHVsZQorCQkgKiBpZiBub3Qgc3BlY2lmaWVkIGluIERULgorCQkgKi8KKwkJaWYgKCFyZXMpIHsKKwkJCXByaXYtPnJhbWluaXQgPSBjX2Nhbl9od19yYW1pbml0OworCQkJYnJlYWs7CisJCX0KKwogCQlwcml2LT5yYW1pbml0X2N0cmxyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAkJaWYgKElTX0VSUihwcml2LT5yYW1pbml0X2N0cmxyZWcpIHx8IHByaXYtPmluc3RhbmNlIDwgMCkKIAkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJjb250cm9sIG1lbW9yeSBpcyBub3QgdXNlZCBmb3IgcmFtaW5pdFxuIik7CiAJCWVsc2UKLQkJCXByaXYtPnJhbWluaXQgPSBjX2Nhbl9od19yYW1pbml0OworCQkJcHJpdi0+cmFtaW5pdCA9IGNfY2FuX2h3X3JhbWluaXRfdGk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vbXNjYW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9LY29uZmlnCmluZGV4IGYxOWJlNTIuLjgxYzcxMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogY29uZmlnIENBTl9NU0NBTgotCWRlcGVuZHMgb24gUFBDIHx8IE02OEsKKwlkZXBlbmRzIG9uIFBQQwogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBGcmVlc2NhbGUgTVNDQU4gYmFzZWQgY2hpcHMiCiAJLS0taGVscC0tLQogCSAgVGhlIE1vdG9yb2xhIFNjYWxhYmxlIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChNU0NBTikgZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3JjYXJfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vcmNhcl9jYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY4ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL3JjYXJfY2FuLmMKQEAgLTAsMCArMSw4NzYgQEAKKy8qIFJlbmVzYXMgUi1DYXIgQ0FOIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29nZW50IEVtYmVkZGVkLCBJbmMuIDxzb3VyY2VAY29nZW50ZW1iZWRkZWQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9sZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL3BsYXRmb3JtL3JjYXJfY2FuLmg+CisKKyNkZWZpbmUgUkNBUl9DQU5fRFJWX05BTUUJInJjYXJfY2FuIgorCisvKiBNYWlsYm94IGNvbmZpZ3VyYXRpb246CisgKiBtYWlsYm94IDYwIC0gNjMgLSBSeCBGSUZPIG1haWxib3hlcworICogbWFpbGJveCA1NiAtIDU5IC0gVHggRklGTyBtYWlsYm94ZXMKKyAqIG5vbi1GSUZPIG1haWxib3hlcyBhcmUgbm90IHVzZWQKKyAqLworI2RlZmluZSBSQ0FSX0NBTl9OX01CWAkJNjQgLyogTnVtYmVyIG9mIG1haWxib3hlcyBpbiBub24tRklGTyBtb2RlICovCisjZGVmaW5lIFJDQVJfQ0FOX1JYX0ZJRk9fTUJYCTYwIC8qIE1haWxib3ggLSB3aW5kb3cgdG8gUnggRklGTyAqLworI2RlZmluZSBSQ0FSX0NBTl9UWF9GSUZPX01CWAk1NiAvKiBNYWlsYm94IC0gd2luZG93IHRvIFR4IEZJRk8gKi8KKyNkZWZpbmUgUkNBUl9DQU5fRklGT19ERVBUSAk0CisKKy8qIE1haWxib3ggcmVnaXN0ZXJzIHN0cnVjdHVyZSAqLworc3RydWN0IHJjYXJfY2FuX21ib3hfcmVncyB7CisJdTMyIGlkOwkJLyogSURFIGFuZCBSVFIgYml0cywgU0lEIGFuZCBFSUQgKi8KKwl1OCBzdHViOwkvKiBOb3QgdXNlZCAqLworCXU4IGRsYzsJCS8qIERhdGEgTGVuZ3RoIENvZGUgLSBiaXRzIFswLi4zXSAqLworCXU4IGRhdGFbOF07CS8qIERhdGEgQnl0ZXMgKi8KKwl1OCB0c2g7CQkvKiBUaW1lIFN0YW1wIEhpZ2hlciBCeXRlICovCisJdTggdHNsOwkJLyogVGltZSBTdGFtcCBMb3dlciBCeXRlICovCit9OworCitzdHJ1Y3QgcmNhcl9jYW5fcmVncyB7CisJc3RydWN0IHJjYXJfY2FuX21ib3hfcmVncyBtYltSQ0FSX0NBTl9OX01CWF07IC8qIE1haWxib3ggcmVnaXN0ZXJzICovCisJdTMyIG1rcl8yXzlbOF07CS8qIE1hc2sgUmVnaXN0ZXJzIDItOSAqLworCXUzMiBmaWRjclsyXTsJLyogRklGTyBSZWNlaXZlZCBJRCBDb21wYXJlIFJlZ2lzdGVyICovCisJdTMyIG1raXZscjE7CS8qIE1hc2sgSW52YWxpZCBSZWdpc3RlciAxICovCisJdTMyIG1pZXIxOwkvKiBNYWlsYm94IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMSAqLworCXUzMiBta3JfMF8xWzJdOwkvKiBNYXNrIFJlZ2lzdGVycyAwLTEgKi8KKwl1MzIgbWtpdmxyMDsgICAgLyogTWFzayBJbnZhbGlkIFJlZ2lzdGVyIDAqLworCXUzMiBtaWVyMDsgICAgICAvKiBNYWlsYm94IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMCAqLworCXU4IHBhZF80NDBbMHgzYzBdOworCXU4IG1jdGxbNjRdOwkvKiBNZXNzYWdlIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTE2IGN0bHI7CS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MTYgc3RyOwkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKwl1OCBiY3JbM107CS8qIEJpdCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTggY2xrcjsJLyogQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyICovCisJdTggcmZjcjsJLyogUmVjZWl2ZSBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1OCByZnBjcjsJLyogUmVjZWl2ZSBGSUZPIFBvaW50ZXIgQ29udHJvbCBSZWdpc3RlciAqLworCXU4IHRmY3I7CS8qIFRyYW5zbWl0IEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLworCXU4IHRmcGNyOyAgICAgICAvKiBUcmFuc21pdCBGSUZPIFBvaW50ZXIgQ29udHJvbCBSZWdpc3RlciAqLworCXU4IGVpZXI7CS8qIEVycm9yIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1OCBlaWZyOwkvKiBFcnJvciBJbnRlcnJ1cHQgRmFjdG9yIEp1ZGdlIFJlZ2lzdGVyICovCisJdTggcmVjcjsJLyogUmVjZWl2ZSBFcnJvciBDb3VudCBSZWdpc3RlciAqLworCXU4IHRlY3I7ICAgICAgICAvKiBUcmFuc21pdCBFcnJvciBDb3VudCBSZWdpc3RlciAqLworCXU4IGVjc3I7CS8qIEVycm9yIENvZGUgU3RvcmUgUmVnaXN0ZXIgKi8KKwl1OCBjc3NyOwkvKiBDaGFubmVsIFNlYXJjaCBTdXBwb3J0IFJlZ2lzdGVyICovCisJdTggbXNzcjsJLyogTWFpbGJveCBTZWFyY2ggU3RhdHVzIFJlZ2lzdGVyICovCisJdTggbXNtcjsJLyogTWFpbGJveCBTZWFyY2ggTW9kZSBSZWdpc3RlciAqLworCXUxNiB0c3I7CS8qIFRpbWUgU3RhbXAgUmVnaXN0ZXIgKi8KKwl1OCBhZnNyOwkvKiBBY2NlcHRhbmNlIEZpbHRlciBTdXBwb3J0IFJlZ2lzdGVyICovCisJdTggcGFkXzg1NzsKKwl1OCB0Y3I7CQkvKiBUZXN0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1OCBwYWRfODU5WzddOworCXU4IGllcjsJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1OCBpc3I7CQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisJdTggcGFkXzg2MjsKKwl1OCBtYnNtcjsJLyogTWFpbGJveCBTZWFyY2ggTWFzayBSZWdpc3RlciAqLworfTsKKworc3RydWN0IHJjYXJfY2FuX3ByaXYgeworCXN0cnVjdCBjYW5fcHJpdiBjYW47CS8qIE11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciEgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwlzdHJ1Y3QgcmNhcl9jYW5fcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjbGsgKmNsazsKKwl1OCB0eF9kbGNbUkNBUl9DQU5fRklGT19ERVBUSF07CisJdTMyIHR4X2hlYWQ7CisJdTMyIHR4X3RhaWw7CisJdTggY2xvY2tfc2VsZWN0OworCXU4IGllcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCByY2FyX2Nhbl9iaXR0aW1pbmdfY29uc3QgPSB7CisJLm5hbWUgPSBSQ0FSX0NBTl9EUlZfTkFNRSwKKwkudHNlZzFfbWluID0gNCwKKwkudHNlZzFfbWF4ID0gMTYsCisJLnRzZWcyX21pbiA9IDIsCisJLnRzZWcyX21heCA9IDgsCisJLnNqd19tYXggPSA0LAorCS5icnBfbWluID0gMSwKKwkuYnJwX21heCA9IDEwMjQsCisJLmJycF9pbmMgPSAxLAorfTsKKworLyogQ29udHJvbCBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX0NUTFJfQk9NCSgzIDw8IDExKSAvKiBCdXMtT2ZmIFJlY292ZXJ5IE1vZGUgQml0cyAqLworI2RlZmluZSBSQ0FSX0NBTl9DVExSX0JPTV9FTlQJKDEgPDwgMTEpIC8qIEVudHJ5IHRvIGhhbHQgbW9kZSAqLworCQkJCQkvKiBhdCBidXMtb2ZmIGVudHJ5ICovCisjZGVmaW5lIFJDQVJfQ0FOX0NUTFJfU0xQTQkoMSA8PCAxMCkKKyNkZWZpbmUgUkNBUl9DQU5fQ1RMUl9DQU5NCSgzIDw8IDgpIC8qIE9wZXJhdGluZyBNb2RlIFNlbGVjdCBCaXQgKi8KKyNkZWZpbmUgUkNBUl9DQU5fQ1RMUl9DQU5NX0hBTFQJKDEgPDwgOSkKKyNkZWZpbmUgUkNBUl9DQU5fQ1RMUl9DQU5NX1JFU0VUICgxIDw8IDgpCisjZGVmaW5lIFJDQVJfQ0FOX0NUTFJfQ0FOTV9GT1JDRV9SRVNFVCAoMyA8PCA4KQorI2RlZmluZSBSQ0FSX0NBTl9DVExSX01MTQkoMSA8PCAzKSAvKiBNZXNzYWdlIExvc3QgTW9kZSBTZWxlY3QgKi8KKyNkZWZpbmUgUkNBUl9DQU5fQ1RMUl9JREZNCSgzIDw8IDEpIC8qIElEIEZvcm1hdCBNb2RlIFNlbGVjdCBCaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX0NUTFJfSURGTV9NSVhFRCAoMSA8PCAyKSAvKiBNaXhlZCBJRCBtb2RlICovCisjZGVmaW5lIFJDQVJfQ0FOX0NUTFJfTUJNCSgxIDw8IDApIC8qIE1haWxib3ggTW9kZSBzZWxlY3QgKi8KKworLyogU3RhdHVzIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fU1RSX1JTVFNUCSgxIDw8IDgpIC8qIFJlc2V0IFN0YXR1cyBCaXQgKi8KKworLyogRklGTyBSZWNlaXZlZCBJRCBDb21wYXJlIFJlZ2lzdGVycyAwIGFuZCAxIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRklEQ1JfSURFCSgxIDw8IDMxKSAvKiBJRCBFeHRlbnNpb24gQml0ICovCisjZGVmaW5lIFJDQVJfQ0FOX0ZJRENSX1JUUgkoMSA8PCAzMCkgLyogUmVtb3RlIFRyYW5zbWlzc2lvbiBSZXF1ZXN0IEJpdCAqLworCisvKiBSZWNlaXZlIEZJRk8gQ29udHJvbCBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX1JGQ1JfUkZFU1QJKDEgPDwgNykgLyogUmVjZWl2ZSBGSUZPIEVtcHR5IFN0YXR1cyBGbGFnICovCisjZGVmaW5lIFJDQVJfQ0FOX1JGQ1JfUkZFCSgxIDw8IDApIC8qIFJlY2VpdmUgRklGTyBFbmFibGUgKi8KKworLyogVHJhbnNtaXQgRklGTyBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fVEZDUl9URlVTVAkoNyA8PCAxKSAvKiBUcmFuc21pdCBGSUZPIFVuc2VudCBNZXNzYWdlICovCisJCQkJCS8qIE51bWJlciBTdGF0dXMgQml0cyAqLworI2RlZmluZSBSQ0FSX0NBTl9URkNSX1RGVVNUX1NISUZUIDEJLyogT2Zmc2V0IG9mIFRyYW5zbWl0IEZJRk8gVW5zZW50ICovCisJCQkJCS8qIE1lc3NhZ2UgTnVtYmVyIFN0YXR1cyBCaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX1RGQ1JfVEZFCSgxIDw8IDApIC8qIFRyYW5zbWl0IEZJRk8gRW5hYmxlICovCisKKyNkZWZpbmUgUkNBUl9DQU5fTl9SWF9NS1JFR1MxCTIJLyogTnVtYmVyIG9mIG1hc2sgcmVnaXN0ZXJzICovCisJCQkJCS8qIGZvciBSeCBtYWlsYm94ZXMgMC0zMSAqLworI2RlZmluZSBSQ0FSX0NBTl9OX1JYX01LUkVHUzIJOAorCisvKiBCaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBzZXR0aW5ncyAqLworI2RlZmluZSBSQ0FSX0NBTl9CQ1JfVFNFRzEoeCkJKCgoeCkgJiAweDBmKSA8PCAyMCkKKyNkZWZpbmUgUkNBUl9DQU5fQkNSX0JQUih4KQkoKCh4KSAmIDB4M2ZmKSA8PCA4KQorI2RlZmluZSBSQ0FSX0NBTl9CQ1JfU0pXKHgpCSgoKHgpICYgMHgzKSA8PCA0KQorI2RlZmluZSBSQ0FSX0NBTl9CQ1JfVFNFRzIoeCkJKCh4KSAmIDB4MDcpCisKKy8qIE1haWxib3ggYW5kIE1hc2sgUmVnaXN0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fSURFCQkoMSA8PCAzMSkKKyNkZWZpbmUgUkNBUl9DQU5fUlRSCQkoMSA8PCAzMCkKKyNkZWZpbmUgUkNBUl9DQU5fU0lEX1NISUZUCTE4CisKKy8qIE1haWxib3ggSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAxIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fTUlFUjFfUlhGSUUJKDEgPDwgMjgpIC8qIFJlY2VpdmUgIEZJRk8gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSQ0FSX0NBTl9NSUVSMV9UWEZJRQkoMSA8PCAyNCkgLyogVHJhbnNtaXQgRklGTyBJbnRlcnJ1cHQgRW5hYmxlICovCisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBSQ0FSX0NBTl9JRVJfRVJTSUUJKDEgPDwgNSkgLyogRXJyb3IgKEVSUykgSW50ZXJydXB0IEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgUkNBUl9DQU5fSUVSX1JYRklFCSgxIDw8IDQpIC8qIFJlY2VwdGlvbiBGSUZPIEludGVycnVwdCAqLworCQkJCQkvKiBFbmFibGUgQml0ICovCisjZGVmaW5lIFJDQVJfQ0FOX0lFUl9UWEZJRQkoMSA8PCAzKSAvKiBUcmFuc21pc3Npb24gRklGTyBJbnRlcnJ1cHQgKi8KKwkJCQkJLyogRW5hYmxlIEJpdCAqLworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX0lTUl9FUlNGCSgxIDw8IDUpIC8qIEVycm9yIChFUlMpIEludGVycnVwdCBTdGF0dXMgQml0ICovCisjZGVmaW5lIFJDQVJfQ0FOX0lTUl9SWEZGCSgxIDw8IDQpIC8qIFJlY2VwdGlvbiBGSUZPIEludGVycnVwdCAqLworCQkJCQkvKiBTdGF0dXMgQml0ICovCisjZGVmaW5lIFJDQVJfQ0FOX0lTUl9UWEZGCSgxIDw8IDMpIC8qIFRyYW5zbWlzc2lvbiBGSUZPIEludGVycnVwdCAqLworCQkJCQkvKiBTdGF0dXMgQml0ICovCisKKy8qIEVycm9yIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUVSX0JMSUUJKDEgPDwgNykgLyogQnVzIExvY2sgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUVSX09MSUUJKDEgPDwgNikgLyogT3ZlcmxvYWQgRnJhbWUgVHJhbnNtaXQgKi8KKwkJCQkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUVSX09SSUUJKDEgPDwgNSkgLyogUmVjZWl2ZSBPdmVycnVuICBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJDQVJfQ0FOX0VJRVJfQk9SSUUJKDEgPDwgNCkgLyogQnVzLU9mZiBSZWNvdmVyeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJDQVJfQ0FOX0VJRVJfQk9FSUUJKDEgPDwgMykgLyogQnVzLU9mZiBFbnRyeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJDQVJfQ0FOX0VJRVJfRVBJRQkoMSA8PCAyKSAvKiBFcnJvciBQYXNzaXZlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUlFUl9FV0lFCSgxIDw8IDEpIC8qIEVycm9yIFdhcm5pbmcgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUVSX0JFSUUJKDEgPDwgMCkgLyogQnVzIEVycm9yIEludGVycnVwdCBFbmFibGUgKi8KKworLyogRXJyb3IgSW50ZXJydXB0IEZhY3RvciBKdWRnZSBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJDQVJfQ0FOX0VJRlJfQkxJRgkoMSA8PCA3KSAvKiBCdXMgTG9jayBEZXRlY3QgRmxhZyAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUZSX09MSUYJKDEgPDwgNikgLyogT3ZlcmxvYWQgRnJhbWUgVHJhbnNtaXNzaW9uICovCisJCQkJCSAvKiBEZXRlY3QgRmxhZyAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUZSX09SSUYJKDEgPDwgNSkgLyogUmVjZWl2ZSBPdmVycnVuIERldGVjdCBGbGFnICovCisjZGVmaW5lIFJDQVJfQ0FOX0VJRlJfQk9SSUYJKDEgPDwgNCkgLyogQnVzLU9mZiBSZWNvdmVyeSBEZXRlY3QgRmxhZyAqLworI2RlZmluZSBSQ0FSX0NBTl9FSUZSX0JPRUlGCSgxIDw8IDMpIC8qIEJ1cy1PZmYgRW50cnkgRGV0ZWN0IEZsYWcgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUlGUl9FUElGCSgxIDw8IDIpIC8qIEVycm9yIFBhc3NpdmUgRGV0ZWN0IEZsYWcgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUlGUl9FV0lGCSgxIDw8IDEpIC8qIEVycm9yIFdhcm5pbmcgRGV0ZWN0IEZsYWcgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUlGUl9CRUlGCSgxIDw8IDApIC8qIEJ1cyBFcnJvciBEZXRlY3QgRmxhZyAqLworCisvKiBFcnJvciBDb2RlIFN0b3JlIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUNTUl9FRFBNCSgxIDw8IDcpIC8qIEVycm9yIERpc3BsYXkgTW9kZSBTZWxlY3QgQml0ICovCisjZGVmaW5lIFJDQVJfQ0FOX0VDU1JfQURFRgkoMSA8PCA2KSAvKiBBQ0sgRGVsaW1pdGVyIEVycm9yIEZsYWcgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUNTUl9CRTBGCSgxIDw8IDUpIC8qIEJpdCBFcnJvciAoZG9taW5hbnQpIEZsYWcgKi8KKyNkZWZpbmUgUkNBUl9DQU5fRUNTUl9CRTFGCSgxIDw8IDQpIC8qIEJpdCBFcnJvciAocmVjZXNzaXZlKSBGbGFnICovCisjZGVmaW5lIFJDQVJfQ0FOX0VDU1JfQ0VGCSgxIDw8IDMpIC8qIENSQyBFcnJvciBGbGFnICovCisjZGVmaW5lIFJDQVJfQ0FOX0VDU1JfQUVGCSgxIDw8IDIpIC8qIEFDSyBFcnJvciBGbGFnICovCisjZGVmaW5lIFJDQVJfQ0FOX0VDU1JfRkVGCSgxIDw8IDEpIC8qIEZvcm0gRXJyb3IgRmxhZyAqLworI2RlZmluZSBSQ0FSX0NBTl9FQ1NSX1NFRgkoMSA8PCAwKSAvKiBTdHVmZiBFcnJvciBGbGFnICovCisKKyNkZWZpbmUgUkNBUl9DQU5fTkFQSV9XRUlHSFQJNAorI2RlZmluZSBNQVhfU1RSX1JFQURTCQkweDEwMAorCitzdGF0aWMgdm9pZCB0eF9mYWlsdXJlX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkNBUl9DQU5fRklGT19ERVBUSDsgaSsrKQorCQljYW5fZnJlZV9lY2hvX3NrYihuZGV2LCBpKTsKK30KKworc3RhdGljIHZvaWQgcmNhcl9jYW5fZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbmRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBlaWZyLCB0eGVyciA9IDAsIHJ4ZXJyID0gMDsKKworCS8qIFByb3BhZ2F0ZSB0aGUgZXJyb3IgY29uZGl0aW9uIHRvIHRoZSBDQU4gc3RhY2sgKi8KKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihuZGV2LCAmY2YpOworCisJZWlmciA9IHJlYWRiKCZwcml2LT5yZWdzLT5laWZyKTsKKwlpZiAoZWlmciAmIChSQ0FSX0NBTl9FSUZSX0VXSUYgfCBSQ0FSX0NBTl9FSUZSX0VQSUYpKSB7CisJCXR4ZXJyID0gcmVhZGIoJnByaXYtPnJlZ3MtPnRlY3IpOworCQlyeGVyciA9IHJlYWRiKCZwcml2LT5yZWdzLT5yZWNyKTsKKwkJaWYgKHNrYikgeworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCQljZi0+ZGF0YVs2XSA9IHR4ZXJyOworCQkJY2YtPmRhdGFbN10gPSByeGVycjsKKwkJfQorCX0KKwlpZiAoZWlmciAmIFJDQVJfQ0FOX0VJRlJfQkVJRikgeworCQlpbnQgcnhfZXJyb3JzID0gMCwgdHhfZXJyb3JzID0gMDsKKwkJdTggZWNzcjsKKworCQluZXRkZXZfZGJnKHByaXYtPm5kZXYsICJCdXMgZXJyb3IgaW50ZXJydXB0OlxuIik7CisJCWlmIChza2IpIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9CVVNFUlJPUiB8IENBTl9FUlJfUFJPVDsKKwkJCWNmLT5kYXRhWzJdID0gQ0FOX0VSUl9QUk9UX1VOU1BFQzsKKwkJfQorCQllY3NyID0gcmVhZGIoJnByaXYtPnJlZ3MtPmVjc3IpOworCQlpZiAoZWNzciAmIFJDQVJfQ0FOX0VDU1JfQURFRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiQUNLIERlbGltaXRlciBFcnJvclxuIik7CisJCQl0eF9lcnJvcnMrKzsKKwkJCXdyaXRlYih+UkNBUl9DQU5fRUNTUl9BREVGLCAmcHJpdi0+cmVncy0+ZWNzcik7CisJCQlpZiAoc2tiKQorCQkJCWNmLT5kYXRhWzNdIHw9IENBTl9FUlJfUFJPVF9MT0NfQUNLX0RFTDsKKwkJfQorCQlpZiAoZWNzciAmIFJDQVJfQ0FOX0VDU1JfQkUwRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiQml0IEVycm9yIChkb21pbmFudClcbiIpOworCQkJdHhfZXJyb3JzKys7CisJCQl3cml0ZWIoflJDQVJfQ0FOX0VDU1JfQkUwRiwgJnByaXYtPnJlZ3MtPmVjc3IpOworCQkJaWYgKHNrYikKKwkJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfQklUMDsKKwkJfQorCQlpZiAoZWNzciAmIFJDQVJfQ0FOX0VDU1JfQkUxRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiQml0IEVycm9yIChyZWNlc3NpdmUpXG4iKTsKKwkJCXR4X2Vycm9ycysrOworCQkJd3JpdGViKH5SQ0FSX0NBTl9FQ1NSX0JFMUYsICZwcml2LT5yZWdzLT5lY3NyKTsKKwkJCWlmIChza2IpCisJCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0JJVDE7CisJCX0KKwkJaWYgKGVjc3IgJiBSQ0FSX0NBTl9FQ1NSX0NFRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiQ1JDIEVycm9yXG4iKTsKKwkJCXJ4X2Vycm9ycysrOworCQkJd3JpdGViKH5SQ0FSX0NBTl9FQ1NSX0NFRiwgJnByaXYtPnJlZ3MtPmVjc3IpOworCQkJaWYgKHNrYikKKwkJCQljZi0+ZGF0YVszXSB8PSBDQU5fRVJSX1BST1RfTE9DX0NSQ19TRVE7CisJCX0KKwkJaWYgKGVjc3IgJiBSQ0FSX0NBTl9FQ1NSX0FFRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiQUNLIEVycm9yXG4iKTsKKwkJCXR4X2Vycm9ycysrOworCQkJd3JpdGViKH5SQ0FSX0NBTl9FQ1NSX0FFRiwgJnByaXYtPnJlZ3MtPmVjc3IpOworCQkJaWYgKHNrYikgeworCQkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9BQ0s7CisJCQkJY2YtPmRhdGFbM10gfD0gQ0FOX0VSUl9QUk9UX0xPQ19BQ0s7CisJCQl9CisJCX0KKwkJaWYgKGVjc3IgJiBSQ0FSX0NBTl9FQ1NSX0ZFRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiRm9ybSBFcnJvclxuIik7CisJCQlyeF9lcnJvcnMrKzsKKwkJCXdyaXRlYih+UkNBUl9DQU5fRUNTUl9GRUYsICZwcml2LT5yZWdzLT5lY3NyKTsKKwkJCWlmIChza2IpCisJCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0ZPUk07CisJCX0KKwkJaWYgKGVjc3IgJiBSQ0FSX0NBTl9FQ1NSX1NFRikgeworCQkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LCAiU3R1ZmYgRXJyb3JcbiIpOworCQkJcnhfZXJyb3JzKys7CisJCQl3cml0ZWIoflJDQVJfQ0FOX0VDU1JfU0VGLCAmcHJpdi0+cmVncy0+ZWNzcik7CisJCQlpZiAoc2tiKQorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9TVFVGRjsKKwkJfQorCisJCXByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX2Vycm9yKys7CisJCW5kZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSByeF9lcnJvcnM7CisJCW5kZXYtPnN0YXRzLnR4X2Vycm9ycyArPSB0eF9lcnJvcnM7CisJCXdyaXRlYih+UkNBUl9DQU5fRUlGUl9CRUlGLCAmcHJpdi0+cmVncy0+ZWlmcik7CisJfQorCWlmIChlaWZyICYgUkNBUl9DQU5fRUlGUl9FV0lGKSB7CisJCW5ldGRldl9kYmcocHJpdi0+bmRldiwgIkVycm9yIHdhcm5pbmcgaW50ZXJydXB0XG4iKTsKKwkJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc7CisJCXByaXYtPmNhbi5jYW5fc3RhdHMuZXJyb3Jfd2FybmluZysrOworCQkvKiBDbGVhciBpbnRlcnJ1cHQgY29uZGl0aW9uICovCisJCXdyaXRlYih+UkNBUl9DQU5fRUlGUl9FV0lGLCAmcHJpdi0+cmVncy0+ZWlmcik7CisJCWlmIChza2IpCisJCQljZi0+ZGF0YVsxXSA9IHR4ZXJyID4gcnhlcnIgPyBDQU5fRVJSX0NSVExfVFhfV0FSTklORyA6CisJCQkJCSAgICAgIENBTl9FUlJfQ1JUTF9SWF9XQVJOSU5HOworCX0KKwlpZiAoZWlmciAmIFJDQVJfQ0FOX0VJRlJfRVBJRikgeworCQluZXRkZXZfZGJnKHByaXYtPm5kZXYsICJFcnJvciBwYXNzaXZlIGludGVycnVwdFxuIik7CisJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKwkJLyogQ2xlYXIgaW50ZXJydXB0IGNvbmRpdGlvbiAqLworCQl3cml0ZWIoflJDQVJfQ0FOX0VJRlJfRVBJRiwgJnByaXYtPnJlZ3MtPmVpZnIpOworCQlpZiAoc2tiKQorCQkJY2YtPmRhdGFbMV0gPSB0eGVyciA+IHJ4ZXJyID8gQ0FOX0VSUl9DUlRMX1RYX1BBU1NJVkUgOgorCQkJCQkgICAgICBDQU5fRVJSX0NSVExfUlhfUEFTU0lWRTsKKwl9CisJaWYgKGVpZnIgJiBSQ0FSX0NBTl9FSUZSX0JPRUlGKSB7CisJCW5ldGRldl9kYmcocHJpdi0+bmRldiwgIkJ1cy1vZmYgZW50cnkgaW50ZXJydXB0XG4iKTsKKwkJdHhfZmFpbHVyZV9jbGVhbnVwKG5kZXYpOworCQlwcml2LT5pZXIgPSBSQ0FSX0NBTl9JRVJfRVJTSUU7CisJCXdyaXRlYihwcml2LT5pZXIsICZwcml2LT5yZWdzLT5pZXIpOworCQlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsKKwkJLyogQ2xlYXIgaW50ZXJydXB0IGNvbmRpdGlvbiAqLworCQl3cml0ZWIoflJDQVJfQ0FOX0VJRlJfQk9FSUYsICZwcml2LT5yZWdzLT5laWZyKTsKKwkJY2FuX2J1c19vZmYobmRldik7CisJCWlmIChza2IpCisJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCX0KKwlpZiAoZWlmciAmIFJDQVJfQ0FOX0VJRlJfT1JJRikgeworCQluZXRkZXZfZGJnKHByaXYtPm5kZXYsICJSZWNlaXZlIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0XG4iKTsKKwkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJbmRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXdyaXRlYih+UkNBUl9DQU5fRUlGUl9PUklGLCAmcHJpdi0+cmVncy0+ZWlmcik7CisJCWlmIChza2IpIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9DUlRMOworCQkJY2YtPmRhdGFbMV0gPSBDQU5fRVJSX0NSVExfUlhfT1ZFUkZMT1c7CisJCX0KKwl9CisJaWYgKGVpZnIgJiBSQ0FSX0NBTl9FSUZSX09MSUYpIHsKKwkJbmV0ZGV2X2RiZyhwcml2LT5uZGV2LAorCQkJICAgIk92ZXJsb2FkIEZyYW1lIFRyYW5zbWlzc2lvbiBlcnJvciBpbnRlcnJ1cHRcbiIpOworCQluZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJd3JpdGViKH5SQ0FSX0NBTl9FSUZSX09MSUYsICZwcml2LT5yZWdzLT5laWZyKTsKKwkJaWYgKHNrYikgeworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1Q7CisJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfT1ZFUkxPQUQ7CisJCX0KKwl9CisKKwlpZiAoc2tiKSB7CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKwkJbmV0aWZfcngoc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJjYXJfY2FuX3R4X2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbmRldi0+c3RhdHM7CisJdTggaXNyOworCisJd2hpbGUgKDEpIHsKKwkJdTggdW5zZW50ID0gcmVhZGIoJnByaXYtPnJlZ3MtPnRmY3IpOworCisJCXVuc2VudCA9ICh1bnNlbnQgJiBSQ0FSX0NBTl9URkNSX1RGVVNUKSA+PgorCQkJICBSQ0FSX0NBTl9URkNSX1RGVVNUX1NISUZUOworCQlpZiAocHJpdi0+dHhfaGVhZCAtIHByaXYtPnR4X3RhaWwgPD0gdW5zZW50KQorCQkJYnJlYWs7CisJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCXN0YXRzLT50eF9ieXRlcyArPSBwcml2LT50eF9kbGNbcHJpdi0+dHhfdGFpbCAlCisJCQkJCQlSQ0FSX0NBTl9GSUZPX0RFUFRIXTsKKwkJcHJpdi0+dHhfZGxjW3ByaXYtPnR4X3RhaWwgJSBSQ0FSX0NBTl9GSUZPX0RFUFRIXSA9IDA7CisJCWNhbl9nZXRfZWNob19za2IobmRldiwgcHJpdi0+dHhfdGFpbCAlIFJDQVJfQ0FOX0ZJRk9fREVQVEgpOworCQlwcml2LT50eF90YWlsKys7CisJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJfQorCS8qIENsZWFyIGludGVycnVwdCAqLworCWlzciA9IHJlYWRiKCZwcml2LT5yZWdzLT5pc3IpOworCXdyaXRlYihpc3IgJiB+UkNBUl9DQU5fSVNSX1RYRkYsICZwcml2LT5yZWdzLT5pc3IpOworCWNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9UWCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByY2FyX2Nhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2lkOworCXN0cnVjdCByY2FyX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTggaXNyOworCisJaXNyID0gcmVhZGIoJnByaXYtPnJlZ3MtPmlzcik7CisJaWYgKCEoaXNyICYgcHJpdi0+aWVyKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKGlzciAmIFJDQVJfQ0FOX0lTUl9FUlNGKQorCQlyY2FyX2Nhbl9lcnJvcihuZGV2KTsKKworCWlmIChpc3IgJiBSQ0FSX0NBTl9JU1JfVFhGRikKKwkJcmNhcl9jYW5fdHhfZG9uZShuZGV2KTsKKworCWlmIChpc3IgJiBSQ0FSX0NBTl9JU1JfUlhGRikgeworCQlpZiAobmFwaV9zY2hlZHVsZV9wcmVwKCZwcml2LT5uYXBpKSkgeworCQkJLyogRGlzYWJsZSBSeCBGSUZPIGludGVycnVwdHMgKi8KKwkJCXByaXYtPmllciAmPSB+UkNBUl9DQU5fSUVSX1JYRklFOworCQkJd3JpdGViKHByaXYtPmllciwgJnByaXYtPnJlZ3MtPmllcik7CisJCQlfX25hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOworCQl9CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCByY2FyX2Nhbl9zZXRfYml0dGltaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjYW5fYml0dGltaW5nICpidCA9ICZwcml2LT5jYW4uYml0dGltaW5nOworCXUzMiBiY3I7CisKKwliY3IgPSBSQ0FSX0NBTl9CQ1JfVFNFRzEoYnQtPnBoYXNlX3NlZzEgKyBidC0+cHJvcF9zZWcgLSAxKSB8CisJICAgICAgUkNBUl9DQU5fQkNSX0JQUihidC0+YnJwIC0gMSkgfCBSQ0FSX0NBTl9CQ1JfU0pXKGJ0LT5zancgLSAxKSB8CisJICAgICAgUkNBUl9DQU5fQkNSX1RTRUcyKGJ0LT5waGFzZV9zZWcyIC0gMSk7CisJLyogRG9uJ3Qgb3ZlcndyaXRlIENMS1Igd2l0aCAzMi1iaXQgQkNSIGFjY2VzczsgQ0xLUiBoYXMgOC1iaXQgYWNjZXNzLgorCSAqIEFsbCB0aGUgcmVnaXN0ZXJzIGFyZSBiaWctZW5kaWFuIGJ1dCB0aGV5IGdldCBieXRlLXN3YXBwZWQgb24gMzItYml0CisJICogcmVhZC93cml0ZSAoYnV0IG5vdCBvbiA4LWJpdCwgY29udHJhcnkgdG8gdGhlIG1hbnVhbHMpLi4uCisJICovCisJd3JpdGVsKChiY3IgPDwgOCkgfCBwcml2LT5jbG9ja19zZWxlY3QsICZwcml2LT5yZWdzLT5iY3IpOworfQorCitzdGF0aWMgdm9pZCByY2FyX2Nhbl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcmNhcl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUxNiBjdGxyOworCWludCBpOworCisJLyogU2V0IGNvbnRyb2xsZXIgdG8ga25vd24gbW9kZToKKwkgKiAtIEZJRk8gbWFpbGJveCBtb2RlCisJICogLSBhY2NlcHQgYWxsIG1lc3NhZ2VzCisJICogLSBvdmVycnVuIG1vZGUKKwkgKiBDQU4gaXMgaW4gc2xlZXAgbW9kZSBhZnRlciBNQ1UgaGFyZHdhcmUgb3Igc29mdHdhcmUgcmVzZXQuCisJICovCisJY3RsciA9IHJlYWR3KCZwcml2LT5yZWdzLT5jdGxyKTsKKwljdGxyICY9IH5SQ0FSX0NBTl9DVExSX1NMUE07CisJd3JpdGV3KGN0bHIsICZwcml2LT5yZWdzLT5jdGxyKTsKKwkvKiBHbyB0byByZXNldCBtb2RlICovCisJY3RsciB8PSBSQ0FSX0NBTl9DVExSX0NBTk1fRk9SQ0VfUkVTRVQ7CisJd3JpdGV3KGN0bHIsICZwcml2LT5yZWdzLT5jdGxyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUl9SRUFEUzsgaSsrKSB7CisJCWlmIChyZWFkdygmcHJpdi0+cmVncy0+c3RyKSAmIFJDQVJfQ0FOX1NUUl9SU1RTVCkKKwkJCWJyZWFrOworCX0KKwlyY2FyX2Nhbl9zZXRfYml0dGltaW5nKG5kZXYpOworCWN0bHIgfD0gUkNBUl9DQU5fQ1RMUl9JREZNX01JWEVEOyAvKiBTZWxlY3QgbWl4ZWQgSUQgbW9kZSAqLworCWN0bHIgfD0gUkNBUl9DQU5fQ1RMUl9CT01fRU5UOwkvKiBFbnRyeSB0byBoYWx0IG1vZGUgYXV0b21hdGljYWxseSAqLworCQkJCQkvKiBhdCBidXMtb2ZmICovCisJY3RsciB8PSBSQ0FSX0NBTl9DVExSX01CTTsJLyogU2VsZWN0IEZJRk8gbWFpbGJveCBtb2RlICovCisJY3RsciB8PSBSQ0FSX0NBTl9DVExSX01MTTsJLyogT3ZlcnJ1biBtb2RlICovCisJd3JpdGV3KGN0bHIsICZwcml2LT5yZWdzLT5jdGxyKTsKKworCS8qIEFjY2VwdCBhbGwgU0lEIGFuZCBFSUQgKi8KKwl3cml0ZWwoMCwgJnByaXYtPnJlZ3MtPm1rcl8yXzlbNl0pOworCXdyaXRlbCgwLCAmcHJpdi0+cmVncy0+bWtyXzJfOVs3XSk7CisJLyogSW4gRklGTyBtYWlsYm94IG1vZGUsIHdyaXRlICIwIiB0byBiaXRzIDI0IHRvIDMxICovCisJd3JpdGVsKDAsICZwcml2LT5yZWdzLT5ta2l2bHIxKTsKKwkvKiBBY2NlcHQgYWxsIGZyYW1lcyAqLworCXdyaXRlbCgwLCAmcHJpdi0+cmVncy0+ZmlkY3JbMF0pOworCXdyaXRlbChSQ0FSX0NBTl9GSURDUl9JREUgfCBSQ0FSX0NBTl9GSURDUl9SVFIsICZwcml2LT5yZWdzLT5maWRjclsxXSk7CisJLyogRW5hYmxlIGFuZCBjb25maWd1cmUgRklGTyBtYWlsYm94IGludGVycnVwdHMgKi8KKwl3cml0ZWwoUkNBUl9DQU5fTUlFUjFfUlhGSUUgfCBSQ0FSX0NBTl9NSUVSMV9UWEZJRSwgJnByaXYtPnJlZ3MtPm1pZXIxKTsKKworCXByaXYtPmllciA9IFJDQVJfQ0FOX0lFUl9FUlNJRSB8IFJDQVJfQ0FOX0lFUl9SWEZJRSB8CisJCSAgICBSQ0FSX0NBTl9JRVJfVFhGSUU7CisJd3JpdGViKHByaXYtPmllciwgJnByaXYtPnJlZ3MtPmllcik7CisKKwkvKiBBY2N1bXVsYXRlIGVycm9yIGNvZGVzICovCisJd3JpdGViKFJDQVJfQ0FOX0VDU1JfRURQTSwgJnByaXYtPnJlZ3MtPmVjc3IpOworCS8qIEVuYWJsZSBlcnJvciBpbnRlcnJ1cHRzICovCisJd3JpdGViKFJDQVJfQ0FOX0VJRVJfRVdJRSB8IFJDQVJfQ0FOX0VJRVJfRVBJRSB8IFJDQVJfQ0FOX0VJRVJfQk9FSUUgfAorCSAgICAgICAocHJpdi0+Y2FuLmN0cmxtb2RlICYgQ0FOX0NUUkxNT0RFX0JFUlJfUkVQT1JUSU5HID8KKwkgICAgICAgUkNBUl9DQU5fRUlFUl9CRUlFIDogMCkgfCBSQ0FSX0NBTl9FSUVSX09SSUUgfAorCSAgICAgICBSQ0FSX0NBTl9FSUVSX09MSUUsICZwcml2LT5yZWdzLT5laWVyKTsKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJLyogR28gdG8gb3BlcmF0aW9uIG1vZGUgKi8KKwl3cml0ZXcoY3RsciAmIH5SQ0FSX0NBTl9DVExSX0NBTk0sICZwcml2LT5yZWdzLT5jdGxyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUl9SRUFEUzsgaSsrKSB7CisJCWlmICghKHJlYWR3KCZwcml2LT5yZWdzLT5zdHIpICYgUkNBUl9DQU5fU1RSX1JTVFNUKSkKKwkJCWJyZWFrOworCX0KKwkvKiBFbmFibGUgUnggYW5kIFR4IEZJRk8gKi8KKwl3cml0ZWIoUkNBUl9DQU5fUkZDUl9SRkUsICZwcml2LT5yZWdzLT5yZmNyKTsKKwl3cml0ZWIoUkNBUl9DQU5fVEZDUl9URkUsICZwcml2LT5yZWdzLT50ZmNyKTsKK30KKworc3RhdGljIGludCByY2FyX2Nhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCByY2FyX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IGVycjsKKworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiY2xrX3ByZXBhcmVfZW5hYmxlKCkgZmFpbGVkLCBlcnJvciAlZFxuIiwKKwkJCSAgIGVycik7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSBvcGVuX2NhbmRldihuZGV2KTsKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9lcnIobmRldiwgIm9wZW5fY2FuZGV2KCkgZmFpbGVkLCBlcnJvciAlZFxuIiwgZXJyKTsKKwkJZ290byBvdXRfY2xvY2s7CisJfQorCW5hcGlfZW5hYmxlKCZwcml2LT5uYXBpKTsKKwllcnIgPSByZXF1ZXN0X2lycShuZGV2LT5pcnEsIHJjYXJfY2FuX2ludGVycnVwdCwgMCwgbmRldi0+bmFtZSwgbmRldik7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKG5kZXYsICJlcnJvciByZXF1ZXN0aW5nIGludGVycnVwdCAleFxuIiwgbmRldi0+aXJxKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCWNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9PUEVOKTsKKwlyY2FyX2Nhbl9zdGFydChuZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwlyZXR1cm4gMDsKK291dF9jbG9zZToKKwluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOworCWNsb3NlX2NhbmRldihuZGV2KTsKK291dF9jbG9jazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCByY2FyX2Nhbl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCByY2FyX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTE2IGN0bHI7CisJaW50IGk7CisKKwkvKiBHbyB0byAoZm9yY2UpIHJlc2V0IG1vZGUgKi8KKwljdGxyID0gcmVhZHcoJnByaXYtPnJlZ3MtPmN0bHIpOworCWN0bHIgfD0gUkNBUl9DQU5fQ1RMUl9DQU5NX0ZPUkNFX1JFU0VUOworCXdyaXRldyhjdGxyLCAmcHJpdi0+cmVncy0+Y3Rscik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9TVFJfUkVBRFM7IGkrKykgeworCQlpZiAocmVhZHcoJnByaXYtPnJlZ3MtPnN0cikgJiBSQ0FSX0NBTl9TVFJfUlNUU1QpCisJCQlicmVhazsKKwl9CisJd3JpdGVsKDAsICZwcml2LT5yZWdzLT5taWVyMCk7CisJd3JpdGVsKDAsICZwcml2LT5yZWdzLT5taWVyMSk7CisJd3JpdGViKDAsICZwcml2LT5yZWdzLT5pZXIpOworCXdyaXRlYigwLCAmcHJpdi0+cmVncy0+ZWllcik7CisJLyogR28gdG8gc2xlZXAgbW9kZSAqLworCWN0bHIgfD0gUkNBUl9DQU5fQ1RMUl9TTFBNOworCXdyaXRldyhjdGxyLCAmcHJpdi0+cmVncy0+Y3Rscik7CisJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NUT1BQRUQ7Cit9CisKK3N0YXRpYyBpbnQgcmNhcl9jYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJcmNhcl9jYW5fc3RvcChuZGV2KTsKKwlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOworCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7CisJY2xvc2VfY2FuZGV2KG5kZXYpOworCWNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9TVE9QKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5ldGRldl90eF90IHJjYXJfY2FuX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZiA9IChzdHJ1Y3QgY2FuX2ZyYW1lICopc2tiLT5kYXRhOworCXUzMiBkYXRhLCBpOworCisJaWYgKGNhbl9kcm9wcGVkX2ludmFsaWRfc2tiKG5kZXYsIHNrYikpCisJCXJldHVybiBORVRERVZfVFhfT0s7CisKKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9FRkZfRkxBRykJLyogRXh0ZW5kZWQgZnJhbWUgZm9ybWF0ICovCisJCWRhdGEgPSAoY2YtPmNhbl9pZCAmIENBTl9FRkZfTUFTSykgfCBSQ0FSX0NBTl9JREU7CisJZWxzZQkJCQkvKiBTdGFuZGFyZCBmcmFtZSBmb3JtYXQgKi8KKwkJZGF0YSA9IChjZi0+Y2FuX2lkICYgQ0FOX1NGRl9NQVNLKSA8PCBSQ0FSX0NBTl9TSURfU0hJRlQ7CisKKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9SVFJfRkxBRykgeyAvKiBSZW1vdGUgdHJhbnNtaXNzaW9uIHJlcXVlc3QgKi8KKwkJZGF0YSB8PSBSQ0FSX0NBTl9SVFI7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNmLT5jYW5fZGxjOyBpKyspCisJCQl3cml0ZWIoY2YtPmRhdGFbaV0sCisJCQkgICAgICAgJnByaXYtPnJlZ3MtPm1iW1JDQVJfQ0FOX1RYX0ZJRk9fTUJYXS5kYXRhW2ldKTsKKwl9CisKKwl3cml0ZWwoZGF0YSwgJnByaXYtPnJlZ3MtPm1iW1JDQVJfQ0FOX1RYX0ZJRk9fTUJYXS5pZCk7CisKKwl3cml0ZWIoY2YtPmNhbl9kbGMsICZwcml2LT5yZWdzLT5tYltSQ0FSX0NBTl9UWF9GSUZPX01CWF0uZGxjKTsKKworCXByaXYtPnR4X2RsY1twcml2LT50eF9oZWFkICUgUkNBUl9DQU5fRklGT19ERVBUSF0gPSBjZi0+Y2FuX2RsYzsKKwljYW5fcHV0X2VjaG9fc2tiKHNrYiwgbmRldiwgcHJpdi0+dHhfaGVhZCAlIFJDQVJfQ0FOX0ZJRk9fREVQVEgpOworCXByaXYtPnR4X2hlYWQrKzsKKwkvKiBTdGFydCBUeDogd3JpdGUgMHhmZiB0byB0aGUgVEZQQ1IgcmVnaXN0ZXIgdG8gaW5jcmVtZW50CisJICogdGhlIENQVS1zaWRlIHBvaW50ZXIgZm9yIHRoZSB0cmFuc21pdCBGSUZPIHRvIHRoZSBuZXh0CisJICogbWFpbGJveCBsb2NhdGlvbgorCSAqLworCXdyaXRlYigweGZmLCAmcHJpdi0+cmVncy0+dGZwY3IpOworCS8qIFN0b3AgdGhlIHF1ZXVlIGlmIHdlJ3ZlIGZpbGxlZCBhbGwgRklGTyBlbnRyaWVzICovCisJaWYgKHByaXYtPnR4X2hlYWQgLSBwcml2LT50eF90YWlsID49IFJDQVJfQ0FOX0ZJRk9fREVQVEgpCisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJjYXJfY2FuX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0gcmNhcl9jYW5fb3BlbiwKKwkubmRvX3N0b3AgPSByY2FyX2Nhbl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPSByY2FyX2Nhbl9zdGFydF94bWl0LAorfTsKKworc3RhdGljIHZvaWQgcmNhcl9jYW5fcnhfcGt0KHN0cnVjdCByY2FyX2Nhbl9wcml2ICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5uZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBkYXRhOworCXU4IGRsYzsKKworCXNrYiA9IGFsbG9jX2Nhbl9za2IocHJpdi0+bmRldiwgJmNmKTsKKwlpZiAoIXNrYikgeworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJZGF0YSA9IHJlYWRsKCZwcml2LT5yZWdzLT5tYltSQ0FSX0NBTl9SWF9GSUZPX01CWF0uaWQpOworCWlmIChkYXRhICYgUkNBUl9DQU5fSURFKQorCQljZi0+Y2FuX2lkID0gKGRhdGEgJiBDQU5fRUZGX01BU0spIHwgQ0FOX0VGRl9GTEFHOworCWVsc2UKKwkJY2YtPmNhbl9pZCA9IChkYXRhID4+IFJDQVJfQ0FOX1NJRF9TSElGVCkgJiBDQU5fU0ZGX01BU0s7CisKKwlkbGMgPSByZWFkYigmcHJpdi0+cmVncy0+bWJbUkNBUl9DQU5fUlhfRklGT19NQlhdLmRsYyk7CisJY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYyhkbGMpOworCWlmIChkYXRhICYgUkNBUl9DQU5fUlRSKSB7CisJCWNmLT5jYW5faWQgfD0gQ0FOX1JUUl9GTEFHOworCX0gZWxzZSB7CisJCWZvciAoZGxjID0gMDsgZGxjIDwgY2YtPmNhbl9kbGM7IGRsYysrKQorCQkJY2YtPmRhdGFbZGxjXSA9CisJCQlyZWFkYigmcHJpdi0+cmVncy0+bWJbUkNBUl9DQU5fUlhfRklGT19NQlhdLmRhdGFbZGxjXSk7CisJfQorCisJY2FuX2xlZF9ldmVudChwcml2LT5uZGV2LCBDQU5fTEVEX0VWRU5UX1JYKTsKKworCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgcmNhcl9jYW5fcnhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBxdW90YSkKK3sKKwlzdHJ1Y3QgcmNhcl9jYW5fcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihuYXBpLAorCQkJCQkJICBzdHJ1Y3QgcmNhcl9jYW5fcHJpdiwgbmFwaSk7CisJaW50IG51bV9wa3RzOworCisJZm9yIChudW1fcGt0cyA9IDA7IG51bV9wa3RzIDwgcXVvdGE7IG51bV9wa3RzKyspIHsKKwkJdTggcmZjciwgaXNyOworCisJCWlzciA9IHJlYWRiKCZwcml2LT5yZWdzLT5pc3IpOworCQkvKiBDbGVhciBpbnRlcnJ1cHQgYml0ICovCisJCWlmIChpc3IgJiBSQ0FSX0NBTl9JU1JfUlhGRikKKwkJCXdyaXRlYihpc3IgJiB+UkNBUl9DQU5fSVNSX1JYRkYsICZwcml2LT5yZWdzLT5pc3IpOworCQlyZmNyID0gcmVhZGIoJnByaXYtPnJlZ3MtPnJmY3IpOworCQlpZiAocmZjciAmIFJDQVJfQ0FOX1JGQ1JfUkZFU1QpCisJCQlicmVhazsKKwkJcmNhcl9jYW5fcnhfcGt0KHByaXYpOworCQkvKiBXcml0ZSAweGZmIHRvIHRoZSBSRlBDUiByZWdpc3RlciB0byBpbmNyZW1lbnQKKwkJICogdGhlIENQVS1zaWRlIHBvaW50ZXIgZm9yIHRoZSByZWNlaXZlIEZJRk8KKwkJICogdG8gdGhlIG5leHQgbWFpbGJveCBsb2NhdGlvbgorCQkgKi8KKwkJd3JpdGViKDB4ZmYsICZwcml2LT5yZWdzLT5yZnBjcik7CisJfQorCS8qIEFsbCBwYWNrZXRzIHByb2Nlc3NlZCAqLworCWlmIChudW1fcGt0cyA8IHF1b3RhKSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisJCXByaXYtPmllciB8PSBSQ0FSX0NBTl9JRVJfUlhGSUU7CisJCXdyaXRlYihwcml2LT5pZXIsICZwcml2LT5yZWdzLT5pZXIpOworCX0KKwlyZXR1cm4gbnVtX3BrdHM7Cit9CisKK3N0YXRpYyBpbnQgcmNhcl9jYW5fZG9fc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGVudW0gY2FuX21vZGUgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENBTl9NT0RFX1NUQVJUOgorCQlyY2FyX2Nhbl9zdGFydChuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCByY2FyX2Nhbl9nZXRfYmVycl9jb3VudGVyKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY2FuX2JlcnJfY291bnRlciAqYmVjKQoreworCXN0cnVjdCByY2FyX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwliZWMtPnR4ZXJyID0gcmVhZGIoJnByaXYtPnJlZ3MtPnRlY3IpOworCWJlYy0+cnhlcnIgPSByZWFkYigmcHJpdi0+cmVncy0+cmVjcik7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmNhcl9jYW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmNhcl9jYW5fcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCBlcnIgPSAtRU5PREVWOworCWludCBpcnE7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHByb3ZpZGVkIVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghaXJxKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSByZXNvdXJjZVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKGFkZHIpKSB7CisJCWVyciA9IFBUUl9FUlIoYWRkcik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwluZGV2ID0gYWxsb2NfY2FuZGV2KHNpemVvZihzdHJ1Y3QgcmNhcl9jYW5fcHJpdiksIFJDQVJfQ0FOX0ZJRk9fREVQVEgpOworCWlmICghbmRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhbGxvY19jYW5kZXYoKSBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgeworCQllcnIgPSBQVFJfRVJSKHByaXYtPmNsayk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgY2xvY2s6ICVkXG4iLCBlcnIpOworCQlnb3RvIGZhaWxfY2xrOworCX0KKworCW5kZXYtPm5ldGRldl9vcHMgPSAmcmNhcl9jYW5fbmV0ZGV2X29wczsKKwluZGV2LT5pcnEgPSBpcnE7CisJbmRldi0+ZmxhZ3MgfD0gSUZGX0VDSE87CisJcHJpdi0+bmRldiA9IG5kZXY7CisJcHJpdi0+cmVncyA9IGFkZHI7CisJcHJpdi0+Y2xvY2tfc2VsZWN0ID0gcGRhdGEtPmNsb2NrX3NlbGVjdDsKKwlwcml2LT5jYW4uY2xvY2suZnJlcSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOworCXByaXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmcmNhcl9jYW5fYml0dGltaW5nX2NvbnN0OworCXByaXYtPmNhbi5kb19zZXRfbW9kZSA9IHJjYXJfY2FuX2RvX3NldF9tb2RlOworCXByaXYtPmNhbi5kb19nZXRfYmVycl9jb3VudGVyID0gcmNhcl9jYW5fZ2V0X2JlcnJfY291bnRlcjsKKwlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkID0gQ0FOX0NUUkxNT0RFX0JFUlJfUkVQT1JUSU5HOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOworCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCisJbmV0aWZfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGksIHJjYXJfY2FuX3J4X3BvbGwsCisJCSAgICAgICBSQ0FSX0NBTl9OQVBJX1dFSUdIVCk7CisJZXJyID0gcmVnaXN0ZXJfY2FuZGV2KG5kZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXJfY2FuZGV2KCkgZmFpbGVkLCBlcnJvciAlZFxuIiwKKwkJCWVycik7CisJCWdvdG8gZmFpbF9jYW5kZXY7CisJfQorCisJZGV2bV9jYW5fbGVkX2luaXQobmRldik7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIHJlZ2lzdGVyZWQgKHJlZ19iYXNlPSVwLCBpcnE9JXUpXG4iLAorCQkgcHJpdi0+cmVncywgbmRldi0+aXJxKTsKKworCXJldHVybiAwOworZmFpbF9jYW5kZXY6CisJbmV0aWZfbmFwaV9kZWwoJnByaXYtPm5hcGkpOworZmFpbF9jbGs6CisJZnJlZV9jYW5kZXYobmRldik7CitmYWlsOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmNhcl9jYW5fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmNhcl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJdW5yZWdpc3Rlcl9jYW5kZXYobmRldik7CisJbmV0aWZfbmFwaV9kZWwoJnByaXYtPm5hcGkpOworCWZyZWVfY2FuZGV2KG5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHJjYXJfY2FuX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MTYgY3RscjsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisJfQorCWN0bHIgPSByZWFkdygmcHJpdi0+cmVncy0+Y3Rscik7CisJY3RsciB8PSBSQ0FSX0NBTl9DVExSX0NBTk1fSEFMVDsKKwl3cml0ZXcoY3RsciwgJnByaXYtPnJlZ3MtPmN0bHIpOworCWN0bHIgfD0gUkNBUl9DQU5fQ1RMUl9TTFBNOworCXdyaXRldyhjdGxyLCAmcHJpdi0+cmVncy0+Y3Rscik7CisJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NMRUVQSU5HOworCisJY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCByY2FyX2Nhbl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJjYXJfY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MTYgY3RscjsKKwlpbnQgZXJyOworCisJZXJyID0gY2xrX2VuYWJsZShwcml2LT5jbGspOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiY2xrX2VuYWJsZSgpIGZhaWxlZCwgZXJyb3IgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJY3RsciA9IHJlYWR3KCZwcml2LT5yZWdzLT5jdGxyKTsKKwljdGxyICY9IH5SQ0FSX0NBTl9DVExSX1NMUE07CisJd3JpdGV3KGN0bHIsICZwcml2LT5yZWdzLT5jdGxyKTsKKwljdGxyICY9IH5SQ0FSX0NBTl9DVExSX0NBTk07CisJd3JpdGV3KGN0bHIsICZwcml2LT5yZWdzLT5jdGxyKTsKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocmNhcl9jYW5fcG1fb3BzLCByY2FyX2Nhbl9zdXNwZW5kLCByY2FyX2Nhbl9yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByY2FyX2Nhbl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBSQ0FSX0NBTl9EUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZyY2FyX2Nhbl9wbV9vcHMsCisJfSwKKwkucHJvYmUgPSByY2FyX2Nhbl9wcm9iZSwKKwkucmVtb3ZlID0gcmNhcl9jYW5fcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyY2FyX2Nhbl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJDb2dlbnQgRW1iZWRkZWQsIEluYy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ0FOIGRyaXZlciBmb3IgUmVuZXNhcyBSLUNhciBTb0MiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBSQ0FSX0NBTl9EUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX21haW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCmluZGV4IDdkOGM4ZjMuLmJhY2QyMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCkBAIC01NTYsMTUgKzU1Niw2IEBACiAvKgogICogbmV0ZGV2IHN5c2ZzCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IHNvZnRpbmdfcHJpdiAqcHJpdiA9IG5ldGRldjJzb2Z0aW5nKG5kZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHByaXYtPmluZGV4KTsKLX0KLQogc3RhdGljIHNzaXplX3Qgc2hvd19jaGlwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNoYXIgKmJ1ZikKIHsKQEAgLTYwOSwxMiArNjAwLDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgY29uc3QgREVWSUNFX0FUVFIoY2hhbm5lbCwgU19JUlVHTywgc2hvd19jaGFubmVsLCBOVUxMKTsKIHN0YXRpYyBjb25zdCBERVZJQ0VfQVRUUihjaGlwLCBTX0lSVUdPLCBzaG93X2NoaXAsIE5VTEwpOwogc3RhdGljIGNvbnN0IERFVklDRV9BVFRSKG91dHB1dCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfb3V0cHV0LCBzdG9yZV9vdXRwdXQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgbmV0ZGV2X3N5c2ZzX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2NoYW5uZWwuYXR0ciwKIAkmZGV2X2F0dHJfY2hpcC5hdHRyLAogCSZkZXZfYXR0cl9vdXRwdXQuYXR0ciwKIAlOVUxMLApAQCAtNjc5LDE3ICs2NjgsMjAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmV0ZGV2LT5zeXNmc19ncm91cHNbMF0gPSAmbmV0ZGV2X3N5c2ZzX2dyb3VwOwogCXJldCA9IHJlZ2lzdGVyX2NhbmRldihuZXRkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2FsZXJ0KCZuZXRkZXYtPmRldiwgInJlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCXJldHVybiByZXQ7CiAJfQorCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJm5ldGRldi0+ZGV2LmtvYmosICZuZXRkZXZfc3lzZnNfZ3JvdXApIDwgMCkKKwkJbmV0ZGV2X2FsZXJ0KG5ldGRldiwgInN5c2ZzIGdyb3VwIGZhaWxlZFxuIik7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc29mdGluZ19uZXRkZXZfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogeworCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV0ZGV2LT5kZXYua29iaiwgJm5ldGRldl9zeXNmc19ncm91cCk7CiAJdW5yZWdpc3Rlcl9jYW5kZXYobmV0ZGV2KTsKIAlmcmVlX2NhbmRldihuZXRkZXYpOwogfQpAQCAtNzIxLDggKzcxMyw2IEBACiBERVZfQVRUUl9ST19TVFIoaGFyZHdhcmUsIHBkYXQtPm5hbWUpOwogREVWX0FUVFJfUk8oaGFyZHdhcmVfdmVyc2lvbiwgaWQuaHdfdmVyc2lvbik7CiBERVZfQVRUUl9STyhsaWNlbnNlLCBpZC5saWNlbnNlKTsKLURFVl9BVFRSX1JPKGZyZXF1ZW5jeSwgaWQuZnJlcSk7Ci1ERVZfQVRUUl9STyh0eHBlbmRpbmcsIHR4LnBlbmRpbmcpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc29mdGluZ19wZGV2X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3NlcmlhbC5hdHRyLApAQCAtNzMxLDggKzcyMSw2IEBACiAJJmRldl9hdHRyX2hhcmR3YXJlLmF0dHIsCiAJJmRldl9hdHRyX2hhcmR3YXJlX3ZlcnNpb24uYXR0ciwKIAkmZGV2X2F0dHJfbGljZW5zZS5hdHRyLAotCSZkZXZfYXR0cl9mcmVxdWVuY3kuYXR0ciwKLQkmZGV2X2F0dHJfdHhwZW5kaW5nLmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2Nhbi9zcGkvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDhjYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NwaS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK21lbnUgIkNBTiBTUEkgaW50ZXJmYWNlcyIKKwlkZXBlbmRzIG9uIFNQSQorCitjb25maWcgQ0FOX01DUDI1MVgKKwl0cmlzdGF0ZSAiTWljcm9jaGlwIE1DUDI1MXggU1BJIENBTiBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIEhBU19ETUEKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIHRoZSBNaWNyb2NoaXAgTUNQMjUxeCBTUEkgQ0FOIGNvbnRyb2xsZXJzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc3BpL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY2FuL3NwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJjYWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NwaS9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgIE1ha2VmaWxlIGZvciB0aGUgTGludXggQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgU1BJIGRyaXZlcnMuCisjCisKKworb2JqLSQoQ09ORklHX0NBTl9NQ1AyNTFYKQkrPSBtY3AyNTF4Lm8KKworY2NmbGFncy0kKENPTkZJR19DQU5fREVCVUdfREVWSUNFUykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL21jcDI1MXguYyBiL2RyaXZlcnMvbmV0L2Nhbi9zcGkvbWNwMjUxeC5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L2Nhbi9tY3AyNTF4LmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2Nhbi9zcGkvbWNwMjUxeC5jCmluZGV4IDI4YzExZjguLjVkZjIzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9tY3AyNTF4LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NwaS9tY3AyNTF4LmMKQEAgLTIxNCw2ICsyMTQsOCBAQAogCiAjZGVmaW5lIFRYX0VDSE9fU0tCX01BWAkxCiAKKyNkZWZpbmUgTUNQMjUxWF9PU1RfREVMQVlfTVMJKDUpCisKICNkZWZpbmUgREVWSUNFX05BTUUgIm1jcDI1MXgiCiAKIHN0YXRpYyBpbnQgbWNwMjUxeF9lbmFibGVfZG1hOyAvKiBFbmFibGUgU1BJIERNQS4gRGVmYXVsdDogMCAoT2ZmKSAqLwpAQCAtNjI0LDUwICs2MjYsNDUgQEAKIHN0YXRpYyBpbnQgbWNwMjUxeF9od19yZXNldChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBtY3AyNTF4X3ByaXYgKnByaXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwl1OCByZWc7CiAJaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBXYWl0IGZvciBvc2NpbGxhdG9yIHN0YXJ0dXAgdGltZXIgYWZ0ZXIgcG93ZXIgdXAgKi8KKwltZGVsYXkoTUNQMjUxWF9PU1RfREVMQVlfTVMpOwogCiAJcHJpdi0+c3BpX3R4X2J1ZlswXSA9IElOU1RSVUNUSU9OX1JFU0VUOwotCXJldCA9IHNwaV93cml0ZShzcGksIHByaXYtPnNwaV90eF9idWYsIDEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJyZXNldCBmYWlsZWQ6IHJldCA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJcmV0ID0gbWNwMjUxeF9zcGlfdHJhbnMoc3BpLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JLyogV2FpdCBmb3IgcmVzZXQgdG8gZmluaXNoICovCi0JdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQltZGVsYXkoMTApOwotCXdoaWxlICgobWNwMjUxeF9yZWFkX3JlZyhzcGksIENBTlNUQVQpICYgQ0FOQ1RSTF9SRVFPUF9NQVNLKQotCSAgICAgICAhPSBDQU5DVFJMX1JFUU9QX0NPTkYpIHsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiTUNQMjUxeCBkaWRuJ3QiCi0JCQkJIiBlbnRlciBpbiBjb25mIG1vZGUgYWZ0ZXIgcmVzZXRcbiIpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KKwkvKiBXYWl0IGZvciBvc2NpbGxhdG9yIHN0YXJ0dXAgdGltZXIgYWZ0ZXIgcmVzZXQgKi8KKwltZGVsYXkoTUNQMjUxWF9PU1RfREVMQVlfTVMpOworCQorCXJlZyA9IG1jcDI1MXhfcmVhZF9yZWcoc3BpLCBDQU5TVEFUKTsKKwlpZiAoKHJlZyAmIENBTkNUUkxfUkVRT1BfTUFTSykgIT0gQ0FOQ1RSTF9SRVFPUF9DT05GKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1jcDI1MXhfaHdfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgc3QxLCBzdDI7CisJdTggY3RybDsKKwlpbnQgcmV0OwogCi0JbWNwMjUxeF9od19yZXNldChzcGkpOworCXJldCA9IG1jcDI1MXhfaHdfcmVzZXQoc3BpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JLyoKLQkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIGFyZSAibWFnaWMgdmFsdWVzIiBiYXNlZCBvbiBhZnRlcgotCSAqIHJlc2V0IGRlZmF1bHRzIHRha2VuIGZyb20gZGF0YSBzaGVldCB3aGljaCBhbGxvd3MgdXMgdG8gc2VlCi0JICogaWYgd2UgcmVhbGx5IGhhdmUgYSBjaGlwIG9uIHRoZSBidXMgKHdlIGF2b2lkIGNvbW1vbiBhbGwKLQkgKiB6ZXJvZXMgb3IgYWxsIG9uZXMgc2l0dWF0aW9ucykKLQkgKi8KLQlzdDEgPSBtY3AyNTF4X3JlYWRfcmVnKHNwaSwgQ0FOU1RBVCkgJiAweEVFOwotCXN0MiA9IG1jcDI1MXhfcmVhZF9yZWcoc3BpLCBDQU5DVFJMKSAmIDB4MTc7CisJY3RybCA9IG1jcDI1MXhfcmVhZF9yZWcoc3BpLCBDQU5DVFJMKTsKIAotCWRldl9kYmcoJnNwaS0+ZGV2LCAiQ0FOU1RBVCAweCUwMnggQ0FOQ1RSTCAweCUwMnhcbiIsIHN0MSwgc3QyKTsKKwlkZXZfZGJnKCZzcGktPmRldiwgIkNBTkNUUkwgMHglMDJ4XG4iLCBjdHJsKTsKIAotCS8qIENoZWNrIGZvciBwb3dlciB1cCBkZWZhdWx0IHZhbHVlcyAqLwotCXJldHVybiAoc3QxID09IDB4ODAgJiYgc3QyID09IDB4MDcpID8gMSA6IDA7CisJLyogQ2hlY2sgZm9yIHBvd2VyIHVwIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAoKGN0cmwgJiAweDE3KSAhPSAweDA3KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1jcDI1MXhfcG93ZXJfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3IgKnJlZywgaW50IGVuYWJsZSkKQEAgLTc3Niw3ICs3NzMsNiBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bWNwX2xvY2spOwogCWlmIChwcml2LT5hZnRlcl9zdXNwZW5kKSB7Ci0JCW1kZWxheSgxMCk7CiAJCW1jcDI1MXhfaHdfcmVzZXQoc3BpKTsKIAkJbWNwMjUxeF9zZXR1cChuZXQsIHByaXYsIHNwaSk7CiAJCWlmIChwcml2LT5hZnRlcl9zdXNwZW5kICYgQUZURVJfU1VTUEVORF9SRVNUQVJUKSB7CkBAIC05NTUsNyArOTUxLDcgQEAKIAlwcml2LT50eF9sZW4gPSAwOwogCiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3BpLT5pcnEsIE5VTEwsIG1jcDI1MXhfY2FuX2lzdCwKLQkJCQkgICBmbGFncywgREVWSUNFX05BTUUsIHByaXYpOworCQkJCSAgIGZsYWdzIHwgSVJRRl9PTkVTSE9ULCBERVZJQ0VfTkFNRSwgcHJpdik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBhY3F1aXJlIGlycSAlZFxuIiwgc3BpLT5pcnEpOwogCQltY3AyNTF4X3Bvd2VyX2VuYWJsZShwcml2LT50cmFuc2NlaXZlciwgMCk7CkBAIC0xMDMyLDggKzEwMjgsOCBAQAogCXN0cnVjdCBtY3AyNTF4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmc3BpLT5kZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CiAJc3RydWN0IG1jcDI1MXhfcHJpdiAqcHJpdjsKLQlpbnQgZnJlcSwgcmV0ID0gLUVOT0RFVjsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGZyZXEsIHJldDsKIAogCWNsayA9IGRldm1fY2xrX2dldCgmc3BpLT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoY2xrKSkgewpAQCAtMTA3Niw2ICsxMDcyLDE4IEBACiAJcHJpdi0+bmV0ID0gbmV0OwogCXByaXYtPmNsayA9IGNsazsKIAorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHByaXYpOworCisJLyogQ29uZmlndXJlIHRoZSBTUEkgYnVzICovCisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlpZiAobWNwMjUxeF9pc18yNTEwKHNwaSkpCisJCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHogPyA6IDUgKiAxMDAwICogMTAwMDsKKwllbHNlCisJCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHogPyA6IDEwICogMTAwMCAqIDEwMDA7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfY2xrOworCiAJcHJpdi0+cG93ZXIgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmRkIik7CiAJcHJpdi0+dHJhbnNjZWl2ZXIgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAieGNlaXZlciIpOwogCWlmICgoUFRSX0VSUihwcml2LT5wb3dlcikgPT0gLUVQUk9CRV9ERUZFUikgfHwKQEAgLTEwODgsOCArMTA5Niw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfY2xrOwogCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgcHJpdik7Ci0KIAlwcml2LT5zcGkgPSBzcGk7CiAJbXV0ZXhfaW5pdCgmcHJpdi0+bWNwX2xvY2spOwogCkBAIC0xMTM0LDIwICsxMTQwLDExIEBACiAKIAlTRVRfTkVUREVWX0RFVihuZXQsICZzcGktPmRldik7CiAKLQkvKiBDb25maWd1cmUgdGhlIFNQSSBidXMgKi8KLQlzcGktPm1vZGUgPSBzcGktPm1vZGUgPyA6IFNQSV9NT0RFXzA7Ci0JaWYgKG1jcDI1MXhfaXNfMjUxMChzcGkpKQotCQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiA1ICogMTAwMCAqIDEwMDA7Ci0JZWxzZQotCQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiAxMCAqIDEwMDAgKiAxMDAwOwotCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7Ci0Jc3BpX3NldHVwKHNwaSk7Ci0KIAkvKiBIZXJlIGlzIE9LIHRvIG5vdCBsb2NrIHRoZSBNQ1AsIG5vIG9uZSBrbm93cyBhYm91dCBpdCB5ZXQgKi8KLQlpZiAoIW1jcDI1MXhfaHdfcHJvYmUoc3BpKSkgewotCQlyZXQgPSAtRU5PREVWOworCXJldCA9IG1jcDI1MXhfaHdfcHJvYmUoc3BpKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycm9yX3Byb2JlOwotCX0KKwogCW1jcDI1MXhfaHdfc2xlZXAoc3BpKTsKIAogCXJldCA9IHJlZ2lzdGVyX2NhbmRldihuZXQpOwpAQCAtMTE1Niw3ICsxMTUzLDcgQEAKIAogCWRldm1fY2FuX2xlZF9pbml0KG5ldCk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogCiBlcnJvcl9wcm9iZToKIAlpZiAobWNwMjUxeF9lbmFibGVfZG1hKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9LY29uZmlnIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9LY29uZmlnCmluZGV4IGZjOTZhM2QuLmE3N2RiOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9LY29uZmlnCkBAIC0xMywxMyArMTMsMjEgQEAKICAgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ0FOLVVTQi8yIGludGVyZmFjZQogICAgICAgICAgIGZyb20gZXNkIGVsZWN0cm9uaWMgc3lzdGVtIGRlc2lnbiBnbWJoIChodHRwOi8vd3d3LmVzZC5ldSkuCiAKK2NvbmZpZyBDQU5fR1NfVVNCCisJdHJpc3RhdGUgIkdlc2Nod2lzdGVyIFNjaG5laWRlciBVRyBpbnRlcmZhY2VzIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBHZXNjaHdpc3RlciBTY2huZWlkZXIgVVNCL0NBTiBkZXZpY2VzLgorCSAgSWYgdW5zdXJlIGNob29zZSBOLAorCSAgY2hvb3NlIFkgZm9yIGJ1aWx0IGluIHN1cHBvcnQsCisJICBNIHRvIGNvbXBpbGUgYXMgbW9kdWxlIChtb2R1bGUgd2lsbCBiZSBuYW1lZDogZ3NfdXNiKS4KKwogY29uZmlnIENBTl9LVkFTRVJfVVNCCiAJdHJpc3RhdGUgIkt2YXNlciBDQU4vVVNCIGludGVyZmFjZSIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEt2YXNlciBDQU4vVVNCIGRldmljZXMgbGlrZSBLdmFzZXIKIAkgIExlYWYgTGlnaHQuCiAKLQkgIFRoZSBkcml2ZXIgZ2l2ZXMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgorCSAgVGhlIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIGRldmljZXM6CiAJICAgIC0gS3Zhc2VyIExlYWYgTGlnaHQKIAkgICAgLSBLdmFzZXIgTGVhZiBQcm9mZXNzaW9uYWwgSFMKIAkgICAgLSBLdmFzZXIgTGVhZiBTZW1pUHJvIEhTCkBAIC0zNiw2ICs0NCw4IEBACiAJICAgIC0gS3Zhc2VyIExlYWYgTGlnaHQgIkNoaW5hIgogCSAgICAtIEt2YXNlciBCbGFja0JpcmQgU2VtaVBybwogCSAgICAtIEt2YXNlciBVU0JjYW4gUgorCSAgICAtIEt2YXNlciBMZWFmIExpZ2h0IHYyCisJICAgIC0gS3Zhc2VyIE1pbmkgUENJIEV4cHJlc3MgSFMKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvTWFrZWZpbGUKaW5kZXggYmVjZWY0Ni4uN2I5YTM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQ0FOX0VNU19VU0IpICs9IGVtc191c2Iubwogb2JqLSQoQ09ORklHX0NBTl9FU0RfVVNCMikgKz0gZXNkX3VzYjIubworb2JqLSQoQ09ORklHX0NBTl9HU19VU0IpICs9IGdzX3VzYi5vCiBvYmotJChDT05GSUdfQ0FOX0tWQVNFUl9VU0IpICs9IGt2YXNlcl91c2Iubwogb2JqLSQoQ09ORklHX0NBTl9QRUFLX1VTQikgKz0gcGVha191c2IvCiBvYmotJChDT05GSUdfQ0FOXzhERVZfVVNCKSArPSB1c2JfOGRldi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2dzX3VzYi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGIwZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYwpAQCAtMCwwICsxLDk3MSBAQAorLyogQ0FOIGRyaXZlciBmb3IgR2VzY2h3aXN0ZXIgU2NobmVpZGVyIFVTQi9DQU4gZGV2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR2VzY2h3aXN0ZXIgU2NobmVpZGVyIFRlY2hub2xvZ2llLSwKKyAqIEVudHdpY2tsdW5ncy0gdW5kIFZlcnRyaWVicyBVRyAoSGFmdHVuZ3NiZXNjaHLDpG5rdCkuCisgKgorICogTWFueSB0aGFua3MgdG8gYWxsIHNvY2tldGNhbiBkZXZzIQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8bGludXgvY2FuLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9lcnJvci5oPgorCisvKiBEZXZpY2Ugc3BlY2lmaWMgY29uc3RhbnRzICovCisjZGVmaW5lIFVTQl9HU1VTQl8xX1ZFTkRPUl9JRCAgICAgIDB4MWQ1MAorI2RlZmluZSBVU0JfR1NVU0JfMV9QUk9EVUNUX0lEICAgICAweDYwNmYKKworI2RlZmluZSBHU1VTQl9FTkRQT0lOVF9JTiAgICAgICAgICAxCisjZGVmaW5lIEdTVVNCX0VORFBPSU5UX09VVCAgICAgICAgIDIKKworLyogRGV2aWNlIHNwZWNpZmljIGNvbnN0YW50cyAqLworZW51bSBnc191c2JfYnJlcSB7CisJR1NfVVNCX0JSRVFfSE9TVF9GT1JNQVQgPSAwLAorCUdTX1VTQl9CUkVRX0JJVFRJTUlORywKKwlHU19VU0JfQlJFUV9NT0RFLAorCUdTX1VTQl9CUkVRX0JFUlIsCisJR1NfVVNCX0JSRVFfQlRfQ09OU1QsCisJR1NfVVNCX0JSRVFfREVWSUNFX0NPTkZJRworfTsKKworZW51bSBnc19jYW5fbW9kZSB7CisJLyogcmVzZXQgYSBjaGFubmVsLiB0dXJucyBpdCBvZmYgKi8KKwlHU19DQU5fTU9ERV9SRVNFVCA9IDAsCisJLyogc3RhcnRzIGEgY2hhbm5lbCAqLworCUdTX0NBTl9NT0RFX1NUQVJUCit9OworCitlbnVtIGdzX2Nhbl9zdGF0ZSB7CisJR1NfQ0FOX1NUQVRFX0VSUk9SX0FDVElWRSA9IDAsCisJR1NfQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkcsCisJR1NfQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUsCisJR1NfQ0FOX1NUQVRFX0JVU19PRkYsCisJR1NfQ0FOX1NUQVRFX1NUT1BQRUQsCisJR1NfQ0FOX1NUQVRFX1NMRUVQSU5HCit9OworCisvKiBkYXRhIHR5cGVzIHBhc3NlZCBiZXR3ZWVuIGhvc3QgYW5kIGRldmljZSAqLworc3RydWN0IGdzX2hvc3RfY29uZmlnIHsKKwl1MzIgYnl0ZV9vcmRlcjsKK30gX19wYWNrZWQ7CisvKiBBbGwgZGF0YSBleGNoYW5nZWQgYmV0d2VlbiBob3N0IGFuZCBkZXZpY2UgaXMgZXhjaGFuZ2VkIGluIGhvc3QgYnl0ZSBvcmRlciwKKyAqIHRoYW5rcyB0byB0aGUgc3RydWN0IGdzX2hvc3RfY29uZmlnIGJ5dGVfb3JkZXIgbWVtYmVyLCB3aGljaCBpcyBzZW50IGZpcnN0CisgKiB0byBpbmRpY2F0ZSB0aGUgZGVzaXJlZCBieXRlIG9yZGVyLgorICovCisKK3N0cnVjdCBnc19kZXZpY2VfY29uZmlnIHsKKwl1OCByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQyOworCXU4IHJlc2VydmVkMzsKKwl1OCBpY291bnQ7CisJdTMyIHN3X3ZlcnNpb247CisJdTMyIGh3X3ZlcnNpb247Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdTX0NBTl9NT0RFX05PUk1BTCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1NfQ0FOX01PREVfTElTVEVOX09OTFkgICAgICAgICAgKDE8PDApCisjZGVmaW5lIEdTX0NBTl9NT0RFX0xPT1BfQkFDSyAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBHU19DQU5fTU9ERV9UUklQTEVfU0FNUExFICAgICAgICAoMTw8MikKKyNkZWZpbmUgR1NfQ0FOX01PREVfT05FX1NIT1QgICAgICAgICAgICAgKDE8PDMpCisKK3N0cnVjdCBnc19kZXZpY2VfbW9kZSB7CisJdTMyIG1vZGU7CisJdTMyIGZsYWdzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdzX2RldmljZV9zdGF0ZSB7CisJdTMyIHN0YXRlOworCXUzMiByeGVycjsKKwl1MzIgdHhlcnI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3NfZGV2aWNlX2JpdHRpbWluZyB7CisJdTMyIHByb3Bfc2VnOworCXUzMiBwaGFzZV9zZWcxOworCXUzMiBwaGFzZV9zZWcyOworCXUzMiBzanc7CisJdTMyIGJycDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgR1NfQ0FOX0ZFQVRVUkVfTElTVEVOX09OTFkgICAgICAoMTw8MCkKKyNkZWZpbmUgR1NfQ0FOX0ZFQVRVUkVfTE9PUF9CQUNLICAgICAgICAoMTw8MSkKKyNkZWZpbmUgR1NfQ0FOX0ZFQVRVUkVfVFJJUExFX1NBTVBMRSAgICAoMTw8MikKKyNkZWZpbmUgR1NfQ0FOX0ZFQVRVUkVfT05FX1NIT1QgICAgICAgICAoMTw8MykKKworc3RydWN0IGdzX2RldmljZV9idF9jb25zdCB7CisJdTMyIGZlYXR1cmU7CisJdTMyIGZjbGtfY2FuOworCXUzMiB0c2VnMV9taW47CisJdTMyIHRzZWcxX21heDsKKwl1MzIgdHNlZzJfbWluOworCXUzMiB0c2VnMl9tYXg7CisJdTMyIHNqd19tYXg7CisJdTMyIGJycF9taW47CisJdTMyIGJycF9tYXg7CisJdTMyIGJycF9pbmM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdTX0NBTl9GTEFHX09WRVJGTE9XIDEKKworc3RydWN0IGdzX2hvc3RfZnJhbWUgeworCXUzMiBlY2hvX2lkOworCXUzMiBjYW5faWQ7CisKKwl1OCBjYW5fZGxjOworCXU4IGNoYW5uZWw7CisJdTggZmxhZ3M7CisJdTggcmVzZXJ2ZWQ7CisKKwl1OCBkYXRhWzhdOworfSBfX3BhY2tlZDsKKy8qIFRoZSBHUyBVU0IgZGV2aWNlcyBtYWtlIHVzZSBvZiB0aGUgc2FtZSBmbGFncyBhbmQgbWFza3MgYXMgaW4KKyAqIGxpbnV4L2Nhbi5oIGFuZCBsaW51eC9jYW4vZXJyb3IuaCwgYW5kIG5vIGFkZGl0aW9uYWwgbWFwcGluZyBpcyBuZWNlc3NhcnkuCisgKi8KKworLyogT25seSBzZW5kIGEgbWF4IG9mIEdTX01BWF9UWF9VUkJTIGZyYW1lcyBwZXIgY2hhbm5lbCBhdCBhIHRpbWUuICovCisjZGVmaW5lIEdTX01BWF9UWF9VUkJTIDEwCisvKiBPbmx5IGxhdW5jaCBhIG1heCBvZiBHU19NQVhfUlhfVVJCUyB1c2IgcmVxdWVzdHMgYXQgYSB0aW1lLiAqLworI2RlZmluZSBHU19NQVhfUlhfVVJCUyAzMAorLyogTWF4aW11bSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGUgZHJpdmVyIHN1cHBvcnRzIHBlciBkZXZpY2UuCisgKiBDdXJyZW50IGhhcmR3YXJlIG9ubHkgc3VwcG9ydHMgMiBpbnRlcmZhY2VzLiBUaGUgZnV0dXJlIG1heSB2YXJ5LgorICovCisjZGVmaW5lIEdTX01BWF9JTlRGIDIKKworc3RydWN0IGdzX3R4X2NvbnRleHQgeworCXN0cnVjdCBnc19jYW4gKmRldjsKKwl1bnNpZ25lZCBpbnQgZWNob19pZDsKK307CisKK3N0cnVjdCBnc19jYW4geworCXN0cnVjdCBjYW5fcHJpdiBjYW47IC8qIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciAqLworCisJc3RydWN0IGdzX3VzYiAqcGFyZW50OworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CisKKwlzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCBidF9jb25zdDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsJLyogY2hhbm5lbCBudW1iZXIgKi8KKworCS8qIFRoaXMgbG9jayBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4geG1pdCBhbmQgcmVjaWV2ZS4gKi8KKwlzcGlubG9ja190IHR4X2N0eF9sb2NrOworCXN0cnVjdCBnc190eF9jb250ZXh0IHR4X2NvbnRleHRbR1NfTUFYX1RYX1VSQlNdOworCisJc3RydWN0IHVzYl9hbmNob3IgdHhfc3VibWl0dGVkOworCWF0b21pY190IGFjdGl2ZV90eF91cmJzOworfTsKKworLyogdXNiIGludGVyZmFjZSBzdHJ1Y3QgKi8KK3N0cnVjdCBnc191c2IgeworCXN0cnVjdCBnc19jYW4gKmNhbmNoW0dTX01BWF9JTlRGXTsKKwlzdHJ1Y3QgdXNiX2FuY2hvciByeF9zdWJtaXR0ZWQ7CisJYXRvbWljX3QgYWN0aXZlX2NoYW5uZWxzOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworfTsKKworLyogJ2FsbG9jYXRlJyBhIHR4IGNvbnRleHQuCisgKiByZXR1cm5zIGEgdmFsaWQgdHggY29udGV4dCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIHNwYWNlLgorICovCitzdGF0aWMgc3RydWN0IGdzX3R4X2NvbnRleHQgKmdzX2FsbG9jX3R4X2NvbnRleHQoc3RydWN0IGdzX2NhbiAqZGV2KQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfY3R4X2xvY2ssIGZsYWdzKTsKKworCWZvciAoOyBpIDwgR1NfTUFYX1RYX1VSQlM7IGkrKykgeworCQlpZiAoZGV2LT50eF9jb250ZXh0W2ldLmVjaG9faWQgPT0gR1NfTUFYX1RYX1VSQlMpIHsKKwkJCWRldi0+dHhfY29udGV4dFtpXS5lY2hvX2lkID0gaTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfY3R4X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAmZGV2LT50eF9jb250ZXh0W2ldOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9jdHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBOVUxMOworfQorCisvKiByZWxlYXNlcyBhIHR4IGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgZ3NfZnJlZV90eF9jb250ZXh0KHN0cnVjdCBnc190eF9jb250ZXh0ICp0eGMpCit7CisJdHhjLT5lY2hvX2lkID0gR1NfTUFYX1RYX1VSQlM7Cit9CisKKy8qIEdldCBhIHR4IGNvbnRleHQgYnkgaWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3NfdHhfY29udGV4dCAqZ3NfZ2V0X3R4X2NvbnRleHQoc3RydWN0IGdzX2NhbiAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpZCA8IEdTX01BWF9UWF9VUkJTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2N0eF9sb2NrLCBmbGFncyk7CisJCWlmIChkZXYtPnR4X2NvbnRleHRbaWRdLmVjaG9faWQgPT0gaWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfY3R4X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAmZGV2LT50eF9jb250ZXh0W2lkXTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2N0eF9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdzX2NtZF9yZXNldChzdHJ1Y3QgZ3NfdXNiICpnc3VzYiwgc3RydWN0IGdzX2NhbiAqZ3NkZXYpCit7CisJc3RydWN0IGdzX2RldmljZV9tb2RlICpkbTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGdzZGV2LT5pZmFjZTsKKwlpbnQgcmM7CisKKwlkbSA9IGt6YWxsb2Moc2l6ZW9mKCpkbSksIEdGUF9LRVJORUwpOworCWlmICghZG0pCisJCXJldHVybiAtRU5PTUVNOworCisJZG0tPm1vZGUgPSBHU19DQU5fTU9ERV9SRVNFVDsKKworCXJjID0gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCisJCQkgICAgIHVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKKwkJCSAgICAgR1NfVVNCX0JSRVFfTU9ERSwKKwkJCSAgICAgVVNCX0RJUl9PVVR8VVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkgICAgIGdzZGV2LT5jaGFubmVsLAorCQkJICAgICAwLAorCQkJICAgICBkbSwKKwkJCSAgICAgc2l6ZW9mKCpkbSksCisJCQkgICAgIDEwMDApOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBnc191cGRhdGVfc3RhdGUoc3RydWN0IGdzX2NhbiAqZGV2LCBzdHJ1Y3QgY2FuX2ZyYW1lICpjZikKK3sKKwlzdHJ1Y3QgY2FuX2RldmljZV9zdGF0cyAqY2FuX3N0YXRzID0gJmRldi0+Y2FuLmNhbl9zdGF0czsKKworCWlmIChjZi0+Y2FuX2lkICYgQ0FOX0VSUl9SRVNUQVJURUQpIHsKKwkJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCQljYW5fc3RhdHMtPnJlc3RhcnRzKys7CisJfSBlbHNlIGlmIChjZi0+Y2FuX2lkICYgQ0FOX0VSUl9CVVNPRkYpIHsKKwkJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsKKwkJY2FuX3N0YXRzLT5idXNfb2ZmKys7CisJfSBlbHNlIGlmIChjZi0+Y2FuX2lkICYgQ0FOX0VSUl9DUlRMKSB7CisJCWlmICgoY2YtPmRhdGFbMV0gJiBDQU5fRVJSX0NSVExfVFhfV0FSTklORykgfHwKKwkJICAgIChjZi0+ZGF0YVsxXSAmIENBTl9FUlJfQ1JUTF9SWF9XQVJOSU5HKSkgeworCQkJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzsKKwkJCWNhbl9zdGF0cy0+ZXJyb3Jfd2FybmluZysrOworCQl9IGVsc2UgaWYgKChjZi0+ZGF0YVsxXSAmIENBTl9FUlJfQ1JUTF9UWF9QQVNTSVZFKSB8fAorCQkJICAgKGNmLT5kYXRhWzFdICYgQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkUpKSB7CisJCQlkZXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCQkJY2FuX3N0YXRzLT5lcnJvcl9wYXNzaXZlKys7CisJCX0gZWxzZSB7CisJCQlkZXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdzX3VzYl9yZWNpZXZlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBnc191c2IgKnVzYmNhbiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZ3NfY2FuICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgcmM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXN0cnVjdCBnc19ob3N0X2ZyYW1lICpoZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCXN0cnVjdCBnc190eF9jb250ZXh0ICp0eGM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJVR19PTighdXNiY2FuKTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6IC8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdCByZXN1Ym1pdCBhYm9ydGVkIHVyYnMuIGVnOiB3aGVuIGRldmljZSBnb2VzIGRvd24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIGRldmljZSByZXBvcnRzIG91dCBvZiByYW5nZSBjaGFubmVsIGlkICovCisJaWYgKGhmLT5jaGFubmVsID49IEdTX01BWF9JTlRGKQorCQlnb3RvIHJlc3VibWl0X3VyYjsKKworCWRldiA9IHVzYmNhbi0+Y2FuY2hbaGYtPmNoYW5uZWxdOworCisJbmV0ZGV2ID0gZGV2LT5uZXRkZXY7CisJc3RhdHMgPSAmbmV0ZGV2LT5zdGF0czsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQobmV0ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKGhmLT5lY2hvX2lkID09IC0xKSB7IC8qIG5vcm1hbCByeCAqLworCQlza2IgPSBhbGxvY19jYW5fc2tiKGRldi0+bmV0ZGV2LCAmY2YpOworCQlpZiAoIXNrYikKKwkJCXJldHVybjsKKworCQljZi0+Y2FuX2lkID0gaGYtPmNhbl9pZDsKKworCQljZi0+Y2FuX2RsYyA9IGdldF9jYW5fZGxjKGhmLT5jYW5fZGxjKTsKKwkJbWVtY3B5KGNmLT5kYXRhLCBoZi0+ZGF0YSwgOCk7CisKKwkJLyogRVJST1IgZnJhbWVzIHRlbGwgdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIgKi8KKwkJaWYgKGhmLT5jYW5faWQgJiBDQU5fRVJSX0ZMQUcpCisJCQlnc191cGRhdGVfc3RhdGUoZGV2LCBjZik7CisKKwkJbmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCW5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gaGYtPmNhbl9kbGM7CisKKwkJbmV0aWZfcngoc2tiKTsKKwl9IGVsc2UgeyAvKiBlY2hvX2lkID09IGhmLT5lY2hvX2lkICovCisJCWlmIChoZi0+ZWNob19pZCA+PSBHU19NQVhfVFhfVVJCUykgeworCQkJbmV0ZGV2X2VycihuZXRkZXYsCisJCQkJICAgIlVuZXhwZWN0ZWQgb3V0IG9mIHJhbmdlIGVjaG8gaWQgJWRcbiIsCisJCQkJICAgaGYtPmVjaG9faWQpOworCQkJZ290byByZXN1Ym1pdF91cmI7CisJCX0KKworCQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBoZi0+Y2FuX2RsYzsKKworCQl0eGMgPSBnc19nZXRfdHhfY29udGV4dChkZXYsIGhmLT5lY2hvX2lkKTsKKworCQkvKiBiYWQgZGV2aWNlcyBzZW5kIGJhZCBlY2hvX2lkcy4gKi8KKwkJaWYgKCF0eGMpIHsKKwkJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJCSAgICJVbmV4cGVjdGVkIHVudXNlZCBlY2hvIGlkICVkXG4iLAorCQkJCSAgIGhmLT5lY2hvX2lkKTsKKwkJCWdvdG8gcmVzdWJtaXRfdXJiOworCQl9CisKKwkJY2FuX2dldF9lY2hvX3NrYihuZXRkZXYsIGhmLT5lY2hvX2lkKTsKKworCQlnc19mcmVlX3R4X2NvbnRleHQodHhjKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCisJaWYgKGhmLT5mbGFncyAmIEdTX0NBTl9GTEFHX09WRVJGTE9XKSB7CisJCXNrYiA9IGFsbG9jX2Nhbl9lcnJfc2tiKG5ldGRldiwgJmNmKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIHJlc3VibWl0X3VyYjsKKworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsKKwkJY2YtPmNhbl9kbGMgPSBDQU5fRVJSX0RMQzsKKwkJY2YtPmRhdGFbMV0gPSBDQU5fRVJSX0NSVExfUlhfT1ZFUkZMT1c7CisJCXN0YXRzLT5yeF9vdmVyX2Vycm9ycysrOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCW5ldGlmX3J4KHNrYik7CisJfQorCisgcmVzdWJtaXRfdXJiOgorCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJCSAgdXNiY2FuLT51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUodXNiY2FuLT51ZGV2LCBHU1VTQl9FTkRQT0lOVF9JTiksCisJCQkgIGhmLAorCQkJICBzaXplb2Yoc3RydWN0IGdzX2hvc3RfZnJhbWUpLAorCQkJICBnc191c2JfcmVjaWV2ZV9idWxrX2NhbGxiYWNrLAorCQkJICB1c2JjYW4KKwkJCSAgKTsKKworCXJjID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCS8qIFVTQiBmYWlsdXJlIHRha2UgZG93biBhbGwgaW50ZXJmYWNlcyAqLworCWlmIChyYyA9PSAtRU5PREVWKSB7CisJCWZvciAocmMgPSAwOyByYyA8IEdTX01BWF9JTlRGOyByYysrKSB7CisJCQlpZiAodXNiY2FuLT5jYW5jaFtyY10pCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaCh1c2JjYW4tPmNhbmNoW3JjXS0+bmV0ZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBnc191c2Jfc2V0X2JpdHRpbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBnc19jYW4gKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0ID0gJmRldi0+Y2FuLmJpdHRpbWluZzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGRldi0+aWZhY2U7CisJaW50IHJjOworCXN0cnVjdCBnc19kZXZpY2VfYml0dGltaW5nICpkYnQ7CisKKwlkYnQgPSBrbWFsbG9jKHNpemVvZigqZGJ0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYnQpCisJCXJldHVybiAtRU5PTUVNOworCisJZGJ0LT5wcm9wX3NlZyA9IGJ0LT5wcm9wX3NlZzsKKwlkYnQtPnBoYXNlX3NlZzEgPSBidC0+cGhhc2Vfc2VnMTsKKwlkYnQtPnBoYXNlX3NlZzIgPSBidC0+cGhhc2Vfc2VnMjsKKwlkYnQtPnNqdyA9IGJ0LT5zanc7CisJZGJ0LT5icnAgPSBidC0+YnJwOworCisJLyogcmVxdWVzdCBiaXQgdGltaW5ncyAqLworCXJjID0gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCisJCQkgICAgIHVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKKwkJCSAgICAgR1NfVVNCX0JSRVFfQklUVElNSU5HLAorCQkJICAgICBVU0JfRElSX09VVHxVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCSAgICAgZGV2LT5jaGFubmVsLAorCQkJICAgICAwLAorCQkJICAgICBkYnQsCisJCQkgICAgIHNpemVvZigqZGJ0KSwKKwkJCSAgICAgMTAwMCk7CisKKwlrZnJlZShkYnQpOworCisJaWYgKHJjIDwgMCkKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsICJDb3VsZG4ndCBzZXQgYml0dGltaW5ncyAoZXJyPSVkKSIsCisJCQlyYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGdzX3VzYl94bWl0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZ3NfdHhfY29udGV4dCAqdHhjID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBnc19jYW4gKmRldiA9IHR4Yy0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXYtPm5ldGRldjsKKworCWlmICh1cmItPnN0YXR1cykKKwkJbmV0ZGV2X2luZm8obmV0ZGV2LCAidXNiIHhtaXQgZmFpbCAlZFxuIiwgdHhjLT5lY2hvX2lkKTsKKworCXVzYl9mcmVlX2NvaGVyZW50KHVyYi0+ZGV2LAorCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJICB1cmItPnRyYW5zZmVyX2RtYSk7CisKKwlhdG9taWNfZGVjKCZkZXYtPmFjdGl2ZV90eF91cmJzKTsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQobmV0ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QgZ3NfY2FuX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZ3NfY2FuICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPm5ldGRldi0+c3RhdHM7CisJc3RydWN0IHVyYiAqdXJiOworCXN0cnVjdCBnc19ob3N0X2ZyYW1lICpoZjsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgZ3NfdHhfY29udGV4dCAqdHhjOworCisJaWYgKGNhbl9kcm9wcGVkX2ludmFsaWRfc2tiKG5ldGRldiwgc2tiKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworCS8qIGZpbmQgYW4gZW1wdHkgY29udGV4dCB0byBrZWVwIHRyYWNrIG9mIHRyYW5zbWlzc2lvbiAqLworCXR4YyA9IGdzX2FsbG9jX3R4X2NvbnRleHQoZGV2KTsKKwlpZiAoIXR4YykKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCisJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0ICovCisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXVyYikgeworCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJcbiIpOworCQlnb3RvIG5vbWVtX3VyYjsKKwl9CisKKwloZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsIHNpemVvZigqaGYpLCBHRlBfQVRPTUlDLAorCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CisJaWYgKCFoZikgeworCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVU0IgYnVmZmVyXG4iKTsKKwkJZ290byBub21lbV9oZjsKKwl9CisKKwlpZHggPSB0eGMtPmVjaG9faWQ7CisKKwlpZiAoaWR4ID49IEdTX01BWF9UWF9VUkJTKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LCAiSW52YWxpZCB0eCBjb250ZXh0ICVkXG4iLCBpZHgpOworCQlnb3RvIGJhZGlkeDsKKwl9CisKKwloZi0+ZWNob19pZCA9IGlkeDsKKwloZi0+Y2hhbm5lbCA9IGRldi0+Y2hhbm5lbDsKKworCWNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CisKKwloZi0+Y2FuX2lkID0gY2YtPmNhbl9pZDsKKwloZi0+Y2FuX2RsYyA9IGNmLT5jYW5fZGxjOworCW1lbWNweShoZi0+ZGF0YSwgY2YtPmRhdGEsIGNmLT5jYW5fZGxjKTsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LAorCQkJICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCBHU1VTQl9FTkRQT0lOVF9PVVQpLAorCQkJICBoZiwKKwkJCSAgc2l6ZW9mKCpoZiksCisJCQkgIGdzX3VzYl94bWl0X2NhbGxiYWNrLAorCQkJICB0eGMpOworCisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwl1c2JfYW5jaG9yX3VyYih1cmIsICZkZXYtPnR4X3N1Ym1pdHRlZCk7CisKKwljYW5fcHV0X2VjaG9fc2tiKHNrYiwgbmV0ZGV2LCBpZHgpOworCisJYXRvbWljX2luYygmZGV2LT5hY3RpdmVfdHhfdXJicyk7CisKKwlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KHJjKSkgewkJCS8qIHVzYiBzZW5kIGZhaWxlZCAqLworCQlhdG9taWNfZGVjKCZkZXYtPmFjdGl2ZV90eF91cmJzKTsKKworCQljYW5fZnJlZV9lY2hvX3NrYihuZXRkZXYsIGlkeCk7CisJCWdzX2ZyZWVfdHhfY29udGV4dCh0eGMpOworCisJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKwkJdXNiX2ZyZWVfY29oZXJlbnQoZGV2LT51ZGV2LAorCQkJCSAgc2l6ZW9mKCpoZiksCisJCQkJICBoZiwKKwkJCQkgIHVyYi0+dHJhbnNmZXJfZG1hKTsKKworCisJCWlmIChyYyA9PSAtRU5PREVWKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJCX0gZWxzZSB7CisJCQluZXRkZXZfZXJyKG5ldGRldiwgInVzYl9zdWJtaXQgZmFpbGVkIChlcnI9JWQpXG4iLCByYyk7CisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2xvdyBkb3duIHR4IHBhdGggKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmFjdGl2ZV90eF91cmJzKSA+PSBHU19NQVhfVFhfVVJCUykKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwl9CisKKwkvKiBsZXQgdXNiIGNvcmUgdGFrZSBjYXJlIG9mIHRoaXMgdXJiICovCisJdXNiX2ZyZWVfdXJiKHVyYik7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCisgYmFkaWR4OgorCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwKKwkJCSAgc2l6ZW9mKCpoZiksCisJCQkgIGhmLAorCQkJICB1cmItPnRyYW5zZmVyX2RtYSk7Cisgbm9tZW1faGY6CisJdXNiX2ZyZWVfdXJiKHVyYik7CisKKyBub21lbV91cmI6CisJZ3NfZnJlZV90eF9jb250ZXh0KHR4Yyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXN0YXRzLT50eF9kcm9wcGVkKys7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIGludCBnc19jYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBnc19jYW4gKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGdzX3VzYiAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisJaW50IHJjLCBpOworCXN0cnVjdCBnc19kZXZpY2VfbW9kZSAqZG07CisJdTMyIGN0cmxtb2RlOworCisJcmMgPSBvcGVuX2NhbmRldihuZXRkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZwYXJlbnQtPmFjdGl2ZV9jaGFubmVscykgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgR1NfTUFYX1JYX1VSQlM7IGkrKykgeworCQkJc3RydWN0IHVyYiAqdXJiOworCQkJdTggKmJ1ZjsKKworCQkJLyogYWxsb2MgcnggdXJiICovCisJCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQkJaWYgKCF1cmIpIHsKKwkJCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCQkJICAgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQkvKiBhbGxvYyByeCBidWZmZXIgKi8KKwkJCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdCBnc19ob3N0X2ZyYW1lKSwKKwkJCQkJCSBHRlBfS0VSTkVMLAorCQkJCQkJICZ1cmItPnRyYW5zZmVyX2RtYSk7CisJCQlpZiAoIWJ1ZikgeworCQkJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJCQkgICAiTm8gbWVtb3J5IGxlZnQgZm9yIFVTQiBidWZmZXJcbiIpOworCQkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQkvKiBmaWxsLCBhbmNob3IsIGFuZCBzdWJtaXQgcnggdXJiICovCisJCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsCisJCQkJCSAgZGV2LT51ZGV2LAorCQkJCQkgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCQkJICBHU1VTQl9FTkRQT0lOVF9JTiksCisJCQkJCSAgYnVmLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgZ3NfaG9zdF9mcmFtZSksCisJCQkJCSAgZ3NfdXNiX3JlY2lldmVfYnVsa19jYWxsYmFjaywKKwkJCQkJICBwYXJlbnQpOworCQkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCQkJdXNiX2FuY2hvcl91cmIodXJiLCAmcGFyZW50LT5yeF9zdWJtaXR0ZWQpOworCisJCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocmMpIHsKKwkJCQlpZiAocmMgPT0gLUVOT0RFVikKKwkJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYtPm5ldGRldik7CisKKwkJCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCQkJICAgInVzYl9zdWJtaXQgZmFpbGVkIChlcnI9JWQpXG4iLAorCQkJCQkgICByYyk7CisKKwkJCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIERyb3AgcmVmZXJlbmNlLAorCQkJICogVVNCIGNvcmUgd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZyBpdAorCQkJICovCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJfQorCX0KKworCWRtID0ga21hbGxvYyhzaXplb2YoKmRtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBmbGFncyAqLworCWN0cmxtb2RlID0gZGV2LT5jYW4uY3RybG1vZGU7CisJZG0tPmZsYWdzID0gMDsKKworCWlmIChjdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9MT09QQkFDSykKKwkJZG0tPmZsYWdzIHw9IEdTX0NBTl9NT0RFX0xPT1BfQkFDSzsKKwllbHNlIGlmIChjdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9MSVNURU5PTkxZKQorCQlkbS0+ZmxhZ3MgfD0gR1NfQ0FOX01PREVfTElTVEVOX09OTFk7CisKKwkvKiBDb250cm9sbGVyIGlzIG5vdCBhbGxvd2VkIHRvIHJldHJ5IFRYCisJICogdGhpcyBtb2RlIGlzIHVuYXZhaWxhYmxlIG9uIGF0bWVscyB1YzNjIGhhcmR3YXJlCisJICovCisJaWYgKGN0cmxtb2RlICYgQ0FOX0NUUkxNT0RFX09ORV9TSE9UKQorCQlkbS0+ZmxhZ3MgfD0gR1NfQ0FOX01PREVfT05FX1NIT1Q7CisKKwlpZiAoY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfM19TQU1QTEVTKQorCQlkbS0+ZmxhZ3MgfD0gR1NfQ0FOX01PREVfVFJJUExFX1NBTVBMRTsKKworCS8qIGZpbmFsbHkgc3RhcnQgZGV2aWNlICovCisJZG0tPm1vZGUgPSBHU19DQU5fTU9ERV9TVEFSVDsKKwlyYyA9IHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aWZhY2UpLAorCQkJICAgICB1c2Jfc25kY3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmlmYWNlKSwgMCksCisJCQkgICAgIEdTX1VTQl9CUkVRX01PREUsCisJCQkgICAgIFVTQl9ESVJfT1VUfFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJICAgICBkZXYtPmNoYW5uZWwsCisJCQkgICAgIDAsCisJCQkgICAgIGRtLAorCQkJICAgICBzaXplb2YoKmRtKSwKKwkJCSAgICAgMTAwMCk7CisKKwlpZiAocmMgPCAwKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LCAiQ291bGRuJ3Qgc3RhcnQgZGV2aWNlIChlcnI9JWQpXG4iLCByYyk7CisJCWtmcmVlKGRtKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWtmcmVlKGRtKTsKKworCWRldi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsKKworCWlmICghKGRldi0+Y2FuLmN0cmxtb2RlICYgQ0FOX0NUUkxNT0RFX0xJU1RFTk9OTFkpKQorCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NfY2FuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCBnc19jYW4gKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGdzX3VzYiAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBTdG9wIHBvbGxpbmcgKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGFyZW50LT5hY3RpdmVfY2hhbm5lbHMpKQorCQl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZwYXJlbnQtPnJ4X3N1Ym1pdHRlZCk7CisKKwkvKiBTdG9wIHNlbmRpbmcgVVJCcyAqLworCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldi0+dHhfc3VibWl0dGVkKTsKKwlhdG9taWNfc2V0KCZkZXYtPmFjdGl2ZV90eF91cmJzLCAwKTsKKworCS8qIHJlc2V0IHRoZSBkZXZpY2UgKi8KKwlyYyA9IGdzX2NtZF9yZXNldChwYXJlbnQsIGRldik7CisJaWYgKHJjIDwgMCkKKwkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAiQ291bGRuJ3Qgc2h1dGRvd24gZGV2aWNlIChlcnI9JWQpIiwgcmMpOworCisJLyogcmVzZXQgdHggY29udGV4dHMgKi8KKwlmb3IgKHJjID0gMDsgcmMgPCBHU19NQVhfVFhfVVJCUzsgcmMrKykgeworCQlkZXYtPnR4X2NvbnRleHRbcmNdLmRldiA9IGRldjsKKwkJZGV2LT50eF9jb250ZXh0W3JjXS5lY2hvX2lkID0gR1NfTUFYX1RYX1VSQlM7CisJfQorCisJLyogY2xvc2UgdGhlIG5ldGRldiAqLworCWNsb3NlX2NhbmRldihuZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZ3NfdXNiX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0gZ3NfY2FuX29wZW4sCisJLm5kb19zdG9wID0gZ3NfY2FuX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCA9IGdzX2Nhbl9zdGFydF94bWl0LAorfTsKKworc3RhdGljIHN0cnVjdCBnc19jYW4gKmdzX21ha2VfY2FuZGV2KHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ3NfY2FuICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgcmM7CisJc3RydWN0IGdzX2RldmljZV9idF9jb25zdCAqYnRfY29uc3Q7CisKKwlidF9jb25zdCA9IGttYWxsb2Moc2l6ZW9mKCpidF9jb25zdCksIEdGUF9LRVJORUwpOworCWlmICghYnRfY29uc3QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJLyogZmV0Y2ggYml0IHRpbWluZyBjb25zdGFudHMgKi8KKwlyYyA9IHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAorCQkJICAgICB1c2JfcmN2Y3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgMCksCisJCQkgICAgIEdTX1VTQl9CUkVRX0JUX0NPTlNULAorCQkJICAgICBVU0JfRElSX0lOfFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJICAgICBjaGFubmVsLAorCQkJICAgICAwLAorCQkJICAgICBidF9jb25zdCwKKwkJCSAgICAgc2l6ZW9mKCpidF9jb25zdCksCisJCQkgICAgIDEwMDApOworCisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiQ291bGRuJ3QgZ2V0IGJpdCB0aW1pbmcgY29uc3QgZm9yIGNoYW5uZWwgKGVycj0lZClcbiIsCisJCQlyYyk7CisJCWtmcmVlKGJ0X2NvbnN0KTsKKwkJcmV0dXJuIEVSUl9QVFIocmMpOworCX0KKworCS8qIGNyZWF0ZSBuZXRkZXYgKi8KKwluZXRkZXYgPSBhbGxvY19jYW5kZXYoc2l6ZW9mKHN0cnVjdCBnc19jYW4pLCBHU19NQVhfVFhfVVJCUyk7CisJaWYgKCFuZXRkZXYpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgY2FuZGV2XG4iKTsKKwkJa2ZyZWUoYnRfY29uc3QpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmdzX3VzYl9uZXRkZXZfb3BzOworCisJbmV0ZGV2LT5mbGFncyB8PSBJRkZfRUNITzsgLyogd2Ugc3VwcG9ydCBmdWxsIHJvdW5kdHJpcCBlY2hvICovCisKKwkvKiBkZXYgc2V0dHVwICovCisJc3RyY3B5KGRldi0+YnRfY29uc3QubmFtZSwgImdzX3VzYiIpOworCWRldi0+YnRfY29uc3QudHNlZzFfbWluID0gYnRfY29uc3QtPnRzZWcxX21pbjsKKwlkZXYtPmJ0X2NvbnN0LnRzZWcxX21heCA9IGJ0X2NvbnN0LT50c2VnMV9tYXg7CisJZGV2LT5idF9jb25zdC50c2VnMl9taW4gPSBidF9jb25zdC0+dHNlZzJfbWluOworCWRldi0+YnRfY29uc3QudHNlZzJfbWF4ID0gYnRfY29uc3QtPnRzZWcyX21heDsKKwlkZXYtPmJ0X2NvbnN0LnNqd19tYXggPSBidF9jb25zdC0+c2p3X21heDsKKwlkZXYtPmJ0X2NvbnN0LmJycF9taW4gPSBidF9jb25zdC0+YnJwX21pbjsKKwlkZXYtPmJ0X2NvbnN0LmJycF9tYXggPSBidF9jb25zdC0+YnJwX21heDsKKwlkZXYtPmJ0X2NvbnN0LmJycF9pbmMgPSBidF9jb25zdC0+YnJwX2luYzsKKworCWRldi0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJZGV2LT5pZmFjZSA9IGludGY7CisJZGV2LT5uZXRkZXYgPSBuZXRkZXY7CisJZGV2LT5jaGFubmVsID0gY2hhbm5lbDsKKworCWluaXRfdXNiX2FuY2hvcigmZGV2LT50eF9zdWJtaXR0ZWQpOworCWF0b21pY19zZXQoJmRldi0+YWN0aXZlX3R4X3VyYnMsIDApOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnR4X2N0eF9sb2NrKTsKKwlmb3IgKHJjID0gMDsgcmMgPCBHU19NQVhfVFhfVVJCUzsgcmMrKykgeworCQlkZXYtPnR4X2NvbnRleHRbcmNdLmRldiA9IGRldjsKKwkJZGV2LT50eF9jb250ZXh0W3JjXS5lY2hvX2lkID0gR1NfTUFYX1RYX1VSQlM7CisJfQorCisJLyogY2FuIHNldHR1cCAqLworCWRldi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NUT1BQRUQ7CisJZGV2LT5jYW4uY2xvY2suZnJlcSA9IGJ0X2NvbnN0LT5mY2xrX2NhbjsKKwlkZXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmZGV2LT5idF9jb25zdDsKKwlkZXYtPmNhbi5kb19zZXRfYml0dGltaW5nID0gZ3NfdXNiX3NldF9iaXR0aW1pbmc7CisKKwlkZXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgPSAwOworCisJaWYgKGJ0X2NvbnN0LT5mZWF0dXJlICYgR1NfQ0FOX0ZFQVRVUkVfTElTVEVOX09OTFkpCisJCWRldi0+Y2FuLmN0cmxtb2RlX3N1cHBvcnRlZCB8PSBDQU5fQ1RSTE1PREVfTElTVEVOT05MWTsKKworCWlmIChidF9jb25zdC0+ZmVhdHVyZSAmIEdTX0NBTl9GRUFUVVJFX0xPT1BfQkFDSykKKwkJZGV2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkIHw9IENBTl9DVFJMTU9ERV9MT09QQkFDSzsKKworCWlmIChidF9jb25zdC0+ZmVhdHVyZSAmIEdTX0NBTl9GRUFUVVJFX1RSSVBMRV9TQU1QTEUpCisJCWRldi0+Y2FuLmN0cmxtb2RlX3N1cHBvcnRlZCB8PSBDQU5fQ1RSTE1PREVfM19TQU1QTEVTOworCisJaWYgKGJ0X2NvbnN0LT5mZWF0dXJlICYgR1NfQ0FOX0ZFQVRVUkVfT05FX1NIT1QpCisJCWRldi0+Y2FuLmN0cmxtb2RlX3N1cHBvcnRlZCB8PSBDQU5fQ1RSTE1PREVfT05FX1NIT1Q7CisKKwlrZnJlZShidF9jb25zdCk7CisKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZpbnRmLT5kZXYpOworCisJcmMgPSByZWdpc3Rlcl9jYW5kZXYoZGV2LT5uZXRkZXYpOworCWlmIChyYykgeworCQlmcmVlX2NhbmRldihkZXYtPm5ldGRldik7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIGNhbmRldiAoZXJyPSVkKVxuIiwgcmMpOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgZ3NfZGVzdHJveV9jYW5kZXYoc3RydWN0IGdzX2NhbiAqZGV2KQoreworCXVucmVnaXN0ZXJfY2FuZGV2KGRldi0+bmV0ZGV2KTsKKwlmcmVlX2NhbmRldihkZXYtPm5ldGRldik7CisJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2LT50eF9zdWJtaXR0ZWQpOworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgZ3NfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGdzX3VzYiAqZGV2OworCWludCByYyA9IC1FTk9NRU07CisJdW5zaWduZWQgaW50IGljb3VudCwgaTsKKwlzdHJ1Y3QgZ3NfaG9zdF9jb25maWcgKmhjb25mOworCXN0cnVjdCBnc19kZXZpY2VfY29uZmlnICpkY29uZjsKKworCWhjb25mID0ga21hbGxvYyhzaXplb2YoKmhjb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoY29uZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloY29uZi0+Ynl0ZV9vcmRlciA9IDB4MDAwMGJlZWY7CisKKwkvKiBzZW5kIGhvc3QgY29uZmlnICovCisJcmMgPSB1c2JfY29udHJvbF9tc2coaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDApLAorCQkJICAgICBHU19VU0JfQlJFUV9IT1NUX0ZPUk1BVCwKKwkJCSAgICAgVVNCX0RJUl9PVVR8VVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkgICAgIDEsCisJCQkgICAgIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJICAgICBoY29uZiwKKwkJCSAgICAgc2l6ZW9mKCpoY29uZiksCisJCQkgICAgIDEwMDApOworCisJa2ZyZWUoaGNvbmYpOworCisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBzZW5kIGRhdGEgZm9ybWF0IChlcnI9JWQpXG4iLAorCQkJcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJZGNvbmYgPSBrbWFsbG9jKHNpemVvZigqZGNvbmYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRjb25mKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHJlYWQgZGV2aWNlIGNvbmZpZyAqLworCXJjID0gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCisJCQkgICAgIHVzYl9yY3ZjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKKwkJCSAgICAgR1NfVVNCX0JSRVFfREVWSUNFX0NPTkZJRywKKwkJCSAgICAgVVNCX0RJUl9JTnxVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCSAgICAgMSwKKwkJCSAgICAgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkgICAgIGRjb25mLAorCQkJICAgICBzaXplb2YoKmRjb25mKSwKKwkJCSAgICAgMTAwMCk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBnZXQgZGV2aWNlIGNvbmZpZzogKGVycj0lZClcbiIsCisJCQlyYyk7CisKKwkJa2ZyZWUoZGNvbmYpOworCisJCXJldHVybiByYzsKKwl9CisKKwlpY291bnQgPSBkY29uZi0+aWNvdW50KzE7CisKKwlrZnJlZShkY29uZik7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiQ29uZmlndXJpbmcgZm9yICVkIGludGVyZmFjZXNcbiIsIGljb3VudCk7CisKKwlpZiAoaWNvdW50ID4gR1NfTUFYX0lOVEYpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJIkRyaXZlciBjYW5ub3QgaGFuZGxlIG1vcmUgdGhhdCAlZCBDQU4gaW50ZXJmYWNlc1xuIiwKKwkJCUdTX01BWF9JTlRGKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWluaXRfdXNiX2FuY2hvcigmZGV2LT5yeF9zdWJtaXR0ZWQpOworCisJYXRvbWljX3NldCgmZGV2LT5hY3RpdmVfY2hhbm5lbHMsIDApOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCWRldi0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHsKKwkJZGV2LT5jYW5jaFtpXSA9IGdzX21ha2VfY2FuZGV2KGksIGludGYpOworCQlpZiAoSVNfRVJSX09SX05VTEwoZGV2LT5jYW5jaFtpXSkpIHsKKwkJCS8qIG9uIGZhaWx1cmUgZGVzdHJveSBwcmV2aW91c2x5IGNyZWF0ZWQgY2FuZGV2cyAqLworCQkJaWNvdW50ID0gaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpY291bnQ7IGkrKykgeworCQkJCWdzX2Rlc3Ryb3lfY2FuZGV2KGRldi0+Y2FuY2hbaV0pOworCQkJCWRldi0+Y2FuY2hbaV0gPSBOVUxMOworCQkJfQorCQkJa2ZyZWUoZGV2KTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlkZXYtPmNhbmNoW2ldLT5wYXJlbnQgPSBkZXY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdzX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGdzX3VzYiAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJaWYgKCFkZXYpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiRGlzY29ubmVjdCAobm9kYXRhKVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgR1NfTUFYX0lOVEY7IGkrKykgeworCQlzdHJ1Y3QgZ3NfY2FuICpjYW4gPSBkZXYtPmNhbmNoW2ldOworCisJCWlmICghY2FuKQorCQkJY29udGludWU7CisKKwkJZ3NfZGVzdHJveV9jYW5kZXYoY2FuKTsKKwl9CisKKwl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkZXYtPnJ4X3N1Ym1pdHRlZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBnc191c2JfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShVU0JfR1NVU0JfMV9WRU5ET1JfSUQsIFVTQl9HU1VTQl8xX1BST0RVQ1RfSUQpfSwKKwl7fSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGdzX3VzYl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBnc191c2JfZHJpdmVyID0geworCS5uYW1lICAgICAgID0gImdzX3VzYiIsCisJLnByb2JlICAgICAgPSBnc191c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnc191c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgICA9IGdzX3VzYl90YWJsZSwKK307CisKK21vZHVsZV91c2JfZHJpdmVyKGdzX3VzYl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXhpbWlsaWFuIFNjaG5laWRlciA8bXdzQHNjaG5laWRlcnNvZnQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorIlNvY2tldCBDQU4gZGV2aWNlIGRyaXZlciBmb3IgR2VzY2h3aXN0ZXIgU2NobmVpZGVyIFRlY2hub2xvZ2llLSwgIgorIkVudHdpY2tsdW5ncy0gdW5kIFZlcnRyaWVicyBVRy4gVVNCMi4wIHRvIENBTiBpbnRlcmZhY2VzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9rdmFzZXJfdXNiLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2t2YXNlcl91c2IuYwppbmRleCA0Y2E0NmVkLi41NDFmYjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL2t2YXNlcl91c2IuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2t2YXNlcl91c2IuYwpAQCAtNTMsNiArNTMsOCBAQAogI2RlZmluZSBVU0JfT0VNX01FUkNVUllfUFJPRFVDVF9JRAkzNAogI2RlZmluZSBVU0JfT0VNX0xFQUZfUFJPRFVDVF9JRAkJMzUKICNkZWZpbmUgVVNCX0NBTl9SX1BST0RVQ1RfSUQJCTM5CisjZGVmaW5lIFVTQl9MRUFGX0xJVEVfVjJfUFJPRFVDVF9JRAkyODgKKyNkZWZpbmUgVVNCX01JTklfUENJRV9IU19QUk9EVUNUX0lECTI4OQogCiAvKiBVU0IgZGV2aWNlcyBmZWF0dXJlcyAqLwogI2RlZmluZSBLVkFTRVJfSEFTX1NJTEVOVF9NT0RFCQlCSVQoMCkKQEAgLTM1Niw2ICszNTgsOCBAQAogCQkuZHJpdmVyX2luZm8gPSBLVkFTRVJfSEFTX1RYUlhfRVJST1JTIH0sCiAJeyBVU0JfREVWSUNFKEtWQVNFUl9WRU5ET1JfSUQsIFVTQl9DQU5fUl9QUk9EVUNUX0lEKSwKIAkJLmRyaXZlcl9pbmZvID0gS1ZBU0VSX0hBU19UWFJYX0VSUk9SUyB9LAorCXsgVVNCX0RFVklDRShLVkFTRVJfVkVORE9SX0lELCBVU0JfTEVBRl9MSVRFX1YyX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKEtWQVNFUl9WRU5ET1JfSUQsIFVTQl9NSU5JX1BDSUVfSFNfUFJPRFVDVF9JRCkgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwga3Zhc2VyX3VzYl90YWJsZSk7CkBAIC0zNzksMzggKzM4Myw0MyBAQAogCXZvaWQgKmJ1ZjsKIAlpbnQgYWN0dWFsX2xlbjsKIAlpbnQgZXJyOwotCWludCBwb3MgPSAwOworCWludCBwb3M7CisJdW5zaWduZWQgbG9uZyB0byA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFVTQl9SRUNWX1RJTUVPVVQpOwogCiAJYnVmID0ga3phbGxvYyhSWF9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKLQkJCSAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCi0JCQkJCSAgIGRldi0+YnVsa19pbi0+YkVuZHBvaW50QWRkcmVzcyksCi0JCQkgICBidWYsIFJYX0JVRkZFUl9TSVpFLCAmYWN0dWFsX2xlbiwKLQkJCSAgIFVTQl9SRUNWX1RJTUVPVVQpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVuZDsKLQotCXdoaWxlIChwb3MgPD0gYWN0dWFsX2xlbiAtIE1TR19IRUFERVJfTEVOKSB7Ci0JCXRtcCA9IGJ1ZiArIHBvczsKLQotCQlpZiAoIXRtcC0+bGVuKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHBvcyArIHRtcC0+bGVuID4gYWN0dWFsX2xlbikgewotCQkJZGV2X2VycihkZXYtPnVkZXYtPmRldi5wYXJlbnQsICJGb3JtYXQgZXJyb3JcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodG1wLT5pZCA9PSBpZCkgewotCQkJbWVtY3B5KG1zZywgdG1wLCB0bXAtPmxlbik7CisJZG8geworCQllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJCSAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCWRldi0+YnVsa19pbi0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkJICAgYnVmLCBSWF9CVUZGRVJfU0laRSwgJmFjdHVhbF9sZW4sCisJCQkJICAgVVNCX1JFQ1ZfVElNRU9VVCk7CisJCWlmIChlcnIgPCAwKQogCQkJZ290byBlbmQ7Ci0JCX0KIAotCQlwb3MgKz0gdG1wLT5sZW47Ci0JfQorCQlwb3MgPSAwOworCQl3aGlsZSAocG9zIDw9IGFjdHVhbF9sZW4gLSBNU0dfSEVBREVSX0xFTikgeworCQkJdG1wID0gYnVmICsgcG9zOworCisJCQlpZiAoIXRtcC0+bGVuKQorCQkJCWJyZWFrOworCisJCQlpZiAocG9zICsgdG1wLT5sZW4gPiBhY3R1YWxfbGVuKSB7CisJCQkJZGV2X2VycihkZXYtPnVkZXYtPmRldi5wYXJlbnQsCisJCQkJCSJGb3JtYXQgZXJyb3JcbiIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodG1wLT5pZCA9PSBpZCkgeworCQkJCW1lbWNweShtc2csIHRtcCwgdG1wLT5sZW4pOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQlwb3MgKz0gdG1wLT5sZW47CisJCX0KKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0bykpOwogCiAJZXJyID0gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3hpbGlueF9jYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi94aWxpbnhfY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4YjU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi94aWxpbnhfY2FuLmMKQEAgLTAsMCArMSwxMjA4IEBACisvKiBYaWxpbnggQ0FOIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE0IFhpbGlueCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFBldGFMb2dpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZHJpdmVyIGlzIGRldmVsb3BlZCBmb3IgQXhpIENBTiBJUCBhbmQgZm9yIFp5bnEgQ0FOUFMgQ29udHJvbGxlci4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9lcnJvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9sZWQuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkieGlsaW54X2NhbiIKKworLyogQ0FOIHJlZ2lzdGVycyBzZXQgKi8KK2VudW0geGNhbl9yZWcgeworCVhDQU5fU1JSX09GRlNFVAkJPSAweDAwLCAvKiBTb2Z0d2FyZSByZXNldCAqLworCVhDQU5fTVNSX09GRlNFVAkJPSAweDA0LCAvKiBNb2RlIHNlbGVjdCAqLworCVhDQU5fQlJQUl9PRkZTRVQJPSAweDA4LCAvKiBCYXVkIHJhdGUgcHJlc2NhbGVyICovCisJWENBTl9CVFJfT0ZGU0VUCQk9IDB4MEMsIC8qIEJpdCB0aW1pbmcgKi8KKwlYQ0FOX0VDUl9PRkZTRVQJCT0gMHgxMCwgLyogRXJyb3IgY291bnRlciAqLworCVhDQU5fRVNSX09GRlNFVAkJPSAweDE0LCAvKiBFcnJvciBzdGF0dXMgKi8KKwlYQ0FOX1NSX09GRlNFVAkJPSAweDE4LCAvKiBTdGF0dXMgKi8KKwlYQ0FOX0lTUl9PRkZTRVQJCT0gMHgxQywgLyogSW50ZXJydXB0IHN0YXR1cyAqLworCVhDQU5fSUVSX09GRlNFVAkJPSAweDIwLCAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCisJWENBTl9JQ1JfT0ZGU0VUCQk9IDB4MjQsIC8qIEludGVycnVwdCBjbGVhciAqLworCVhDQU5fVFhGSUZPX0lEX09GRlNFVAk9IDB4MzAsLyogVFggRklGTyBJRCAqLworCVhDQU5fVFhGSUZPX0RMQ19PRkZTRVQJPSAweDM0LCAvKiBUWCBGSUZPIERMQyAqLworCVhDQU5fVFhGSUZPX0RXMV9PRkZTRVQJPSAweDM4LCAvKiBUWCBGSUZPIERhdGEgV29yZCAxICovCisJWENBTl9UWEZJRk9fRFcyX09GRlNFVAk9IDB4M0MsIC8qIFRYIEZJRk8gRGF0YSBXb3JkIDIgKi8KKwlYQ0FOX1JYRklGT19JRF9PRkZTRVQJPSAweDUwLCAvKiBSWCBGSUZPIElEICovCisJWENBTl9SWEZJRk9fRExDX09GRlNFVAk9IDB4NTQsIC8qIFJYIEZJRk8gRExDICovCisJWENBTl9SWEZJRk9fRFcxX09GRlNFVAk9IDB4NTgsIC8qIFJYIEZJRk8gRGF0YSBXb3JkIDEgKi8KKwlYQ0FOX1JYRklGT19EVzJfT0ZGU0VUCT0gMHg1QywgLyogUlggRklGTyBEYXRhIFdvcmQgMiAqLworfTsKKworLyogQ0FOIHJlZ2lzdGVyIGJpdCBtYXNrcyAtIFhDQU5fPFJFRz5fPEJJVD5fTUFTSyAqLworI2RlZmluZSBYQ0FOX1NSUl9DRU5fTUFTSwkJMHgwMDAwMDAwMiAvKiBDQU4gZW5hYmxlICovCisjZGVmaW5lIFhDQU5fU1JSX1JFU0VUX01BU0sJCTB4MDAwMDAwMDEgLyogU29mdCBSZXNldCB0aGUgQ0FOIGNvcmUgKi8KKyNkZWZpbmUgWENBTl9NU1JfTEJBQ0tfTUFTSwkJMHgwMDAwMDAwMiAvKiBMb29wIGJhY2sgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgWENBTl9NU1JfU0xFRVBfTUFTSwkJMHgwMDAwMDAwMSAvKiBTbGVlcCBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBYQ0FOX0JSUFJfQlJQX01BU0sJCTB4MDAwMDAwRkYgLyogQmF1ZCByYXRlIHByZXNjYWxlciAqLworI2RlZmluZSBYQ0FOX0JUUl9TSldfTUFTSwkJMHgwMDAwMDE4MCAvKiBTeW5jaHJvbm91cyBqdW1wIHdpZHRoICovCisjZGVmaW5lIFhDQU5fQlRSX1RTMl9NQVNLCQkweDAwMDAwMDcwIC8qIFRpbWUgc2VnbWVudCAyICovCisjZGVmaW5lIFhDQU5fQlRSX1RTMV9NQVNLCQkweDAwMDAwMDBGIC8qIFRpbWUgc2VnbWVudCAxICovCisjZGVmaW5lIFhDQU5fRUNSX1JFQ19NQVNLCQkweDAwMDBGRjAwIC8qIFJlY2VpdmUgZXJyb3IgY291bnRlciAqLworI2RlZmluZSBYQ0FOX0VDUl9URUNfTUFTSwkJMHgwMDAwMDBGRiAvKiBUcmFuc21pdCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIFhDQU5fRVNSX0FDS0VSX01BU0sJCTB4MDAwMDAwMTAgLyogQUNLIGVycm9yICovCisjZGVmaW5lIFhDQU5fRVNSX0JFUlJfTUFTSwkJMHgwMDAwMDAwOCAvKiBCaXQgZXJyb3IgKi8KKyNkZWZpbmUgWENBTl9FU1JfU1RFUl9NQVNLCQkweDAwMDAwMDA0IC8qIFN0dWZmIGVycm9yICovCisjZGVmaW5lIFhDQU5fRVNSX0ZNRVJfTUFTSwkJMHgwMDAwMDAwMiAvKiBGb3JtIGVycm9yICovCisjZGVmaW5lIFhDQU5fRVNSX0NSQ0VSX01BU0sJCTB4MDAwMDAwMDEgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFhDQU5fU1JfVFhGTExfTUFTSwkJMHgwMDAwMDQwMCAvKiBUWCBGSUZPIGlzIGZ1bGwgKi8KKyNkZWZpbmUgWENBTl9TUl9FU1RBVF9NQVNLCQkweDAwMDAwMTgwIC8qIEVycm9yIHN0YXR1cyAqLworI2RlZmluZSBYQ0FOX1NSX0VSUldSTl9NQVNLCQkweDAwMDAwMDQwIC8qIEVycm9yIHdhcm5pbmcgKi8KKyNkZWZpbmUgWENBTl9TUl9OT1JNQUxfTUFTSwkJMHgwMDAwMDAwOCAvKiBOb3JtYWwgbW9kZSAqLworI2RlZmluZSBYQ0FOX1NSX0xCQUNLX01BU0sJCTB4MDAwMDAwMDIgLyogTG9vcCBiYWNrIG1vZGUgKi8KKyNkZWZpbmUgWENBTl9TUl9DT05GSUdfTUFTSwkJMHgwMDAwMDAwMSAvKiBDb25maWd1cmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgWENBTl9JWFJfVFhGRU1QX01BU0sJCTB4MDAwMDQwMDAgLyogVFggRklGTyBFbXB0eSAqLworI2RlZmluZSBYQ0FOX0lYUl9XS1VQX01BU0sJCTB4MDAwMDA4MDAgLyogV2FrZSB1cCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWENBTl9JWFJfU0xQX01BU0sJCTB4MDAwMDA0MDAgLyogU2xlZXAgaW50ZXJydXB0ICovCisjZGVmaW5lIFhDQU5fSVhSX0JTT0ZGX01BU0sJCTB4MDAwMDAyMDAgLyogQnVzIG9mZiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWENBTl9JWFJfRVJST1JfTUFTSwkJMHgwMDAwMDEwMCAvKiBFcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWENBTl9JWFJfUlhORU1QX01BU0sJCTB4MDAwMDAwODAgLyogUlggRklGTyBOb3RFbXB0eSBpbnRyICovCisjZGVmaW5lIFhDQU5fSVhSX1JYT0ZMV19NQVNLCQkweDAwMDAwMDQwIC8qIFJYIEZJRk8gT3ZlcmZsb3cgaW50ciAqLworI2RlZmluZSBYQ0FOX0lYUl9SWE9LX01BU0sJCTB4MDAwMDAwMTAgLyogTWVzc2FnZSByZWNlaXZlZCBpbnRyICovCisjZGVmaW5lIFhDQU5fSVhSX1RYRkxMX01BU0sJCTB4MDAwMDAwMDQgLyogVHggRklGTyBGdWxsIGludHIgKi8KKyNkZWZpbmUgWENBTl9JWFJfVFhPS19NQVNLCQkweDAwMDAwMDAyIC8qIFRYIHN1Y2Nlc3NmdWwgaW50ciAqLworI2RlZmluZSBYQ0FOX0lYUl9BUkJMU1RfTUFTSwkJMHgwMDAwMDAwMSAvKiBBcmJpdHJhdGlvbiBsb3N0IGludHIgKi8KKyNkZWZpbmUgWENBTl9JRFJfSUQxX01BU0sJCTB4RkZFMDAwMDAgLyogU3RhbmRhcmQgbXNnIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgWENBTl9JRFJfU1JSX01BU0sJCTB4MDAxMDAwMDAgLyogU3Vic3RpdHV0ZSByZW1vdGUgVFhyZXEgKi8KKyNkZWZpbmUgWENBTl9JRFJfSURFX01BU0sJCTB4MDAwODAwMDAgLyogSWRlbnRpZmllciBleHRlbnNpb24gKi8KKyNkZWZpbmUgWENBTl9JRFJfSUQyX01BU0sJCTB4MDAwN0ZGRkUgLyogRXh0ZW5kZWQgbWVzc2FnZSBpZGVudCAqLworI2RlZmluZSBYQ0FOX0lEUl9SVFJfTUFTSwkJMHgwMDAwMDAwMSAvKiBSZW1vdGUgVFggcmVxdWVzdCAqLworI2RlZmluZSBYQ0FOX0RMQ1JfRExDX01BU0sJCTB4RjAwMDAwMDAgLyogRGF0YSBsZW5ndGggY29kZSAqLworCisjZGVmaW5lIFhDQU5fSU5UUl9BTEwJCShYQ0FOX0lYUl9UWE9LX01BU0sgfCBYQ0FOX0lYUl9CU09GRl9NQVNLIHxcCisJCQkJIFhDQU5fSVhSX1dLVVBfTUFTSyB8IFhDQU5fSVhSX1NMUF9NQVNLIHwgXAorCQkJCSBYQ0FOX0lYUl9SWE5FTVBfTUFTSyB8IFhDQU5fSVhSX0VSUk9SX01BU0sgfCBcCisJCQkJIFhDQU5fSVhSX0FSQkxTVF9NQVNLIHwgWENBTl9JWFJfUlhPS19NQVNLKQorCisvKiBDQU4gcmVnaXN0ZXIgYml0IHNoaWZ0IC0gWENBTl88UkVHPl88QklUPl9TSElGVCAqLworI2RlZmluZSBYQ0FOX0JUUl9TSldfU0hJRlQJCTcgIC8qIFN5bmNocm9ub3VzIGp1bXAgd2lkdGggKi8KKyNkZWZpbmUgWENBTl9CVFJfVFMyX1NISUZUCQk0ICAvKiBUaW1lIHNlZ21lbnQgMiAqLworI2RlZmluZSBYQ0FOX0lEUl9JRDFfU0hJRlQJCTIxIC8qIFN0YW5kYXJkIE1lc3NnIElkZW50aWZpZXIgKi8KKyNkZWZpbmUgWENBTl9JRFJfSUQyX1NISUZUCQkxICAvKiBFeHRlbmRlZCBNZXNzYWdlIElkZW50aWZpZXIgKi8KKyNkZWZpbmUgWENBTl9ETENSX0RMQ19TSElGVAkJMjggLyogRGF0YSBsZW5ndGggY29kZSAqLworI2RlZmluZSBYQ0FOX0VTUl9SRUNfU0hJRlQJCTggIC8qIFJ4IEVycm9yIENvdW50ICovCisKKy8qIENBTiBmcmFtZSBsZW5ndGggY29uc3RhbnRzICovCisjZGVmaW5lIFhDQU5fRlJBTUVfTUFYX0RBVEFfTEVOCQk4CisjZGVmaW5lIFhDQU5fVElNRU9VVAkJCSgxICogSFopCisKKy8qKgorICogc3RydWN0IHhjYW5fcHJpdiAtIFRoaXMgZGVmaW5pdGlvbiBkZWZpbmUgQ0FOIGRyaXZlciBpbnN0YW5jZQorICogQGNhbjoJCQlDQU4gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEB0eF9oZWFkOgkJCVR4IENBTiBwYWNrZXRzIHJlYWR5IHRvIHNlbmQgb24gdGhlIHF1ZXVlCisgKiBAdHhfdGFpbDoJCQlUeCBDQU4gcGFja2V0cyBzdWNjZXNzZnVsbHkgc2VuZGVkIG9uIHRoZSBxdWV1ZQorICogQHR4X21heDoJCQlNYXhpbXVtIG51bWJlciBwYWNrZXRzIHRoZSBkcml2ZXIgY2FuIHNlbmQKKyAqIEBuYXBpOgkJCU5BUEkgc3RydWN0dXJlCisgKiBAcmVhZF9yZWc6CQkJRm9yIHJlYWRpbmcgZGF0YSBmcm9tIENBTiByZWdpc3RlcnMKKyAqIEB3cml0ZV9yZWc6CQkJRm9yIHdyaXRpbmcgZGF0YSB0byBDQU4gcmVnaXN0ZXJzCisgKiBAZGV2OgkJCU5ldHdvcmsgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKiBAcmVnX2Jhc2U6CQkJSW9yZW1hcHBlZCBhZGRyZXNzIHRvIHJlZ2lzdGVycworICogQGlycV9mbGFnczoJCQlGb3IgcmVxdWVzdF9pcnEoKQorICogQGJ1c19jbGs6CQkJUG9pbnRlciB0byBzdHJ1Y3QgY2xrCisgKiBAY2FuX2NsazoJCQlQb2ludGVyIHRvIHN0cnVjdCBjbGsKKyAqLworc3RydWN0IHhjYW5fcHJpdiB7CisJc3RydWN0IGNhbl9wcml2IGNhbjsKKwl1bnNpZ25lZCBpbnQgdHhfaGVhZDsKKwl1bnNpZ25lZCBpbnQgdHhfdGFpbDsKKwl1bnNpZ25lZCBpbnQgdHhfbWF4OworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXUzMiAoKnJlYWRfcmVnKShjb25zdCBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2LCBlbnVtIHhjYW5fcmVnIHJlZyk7CisJdm9pZCAoKndyaXRlX3JlZykoY29uc3Qgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiwgZW51bSB4Y2FuX3JlZyByZWcsCisJCQl1MzIgdmFsKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IGNsayAqYnVzX2NsazsKKwlzdHJ1Y3QgY2xrICpjYW5fY2xrOworfTsKKworLyogQ0FOIEJpdHRpbWluZyBjb25zdGFudHMgYXMgcGVyIFhpbGlueCBDQU4gc3BlY3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCB4Y2FuX2JpdHRpbWluZ19jb25zdCA9IHsKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS50c2VnMV9taW4gPSAxLAorCS50c2VnMV9tYXggPSAxNiwKKwkudHNlZzJfbWluID0gMSwKKwkudHNlZzJfbWF4ID0gOCwKKwkuc2p3X21heCA9IDQsCisJLmJycF9taW4gPSAxLAorCS5icnBfbWF4ID0gMjU2LAorCS5icnBfaW5jID0gMSwKK307CisKKy8qKgorICogeGNhbl93cml0ZV9yZWdfbGUgLSBXcml0ZSBhIHZhbHVlIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXIgbGl0dGxlIGVuZGlhbgorICogQHByaXY6CURyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAcmVnOglSZWdpc3RlciBvZmZzZXQKKyAqIEB2YWw6CVZhbHVlIHRvIHdyaXRlIGF0IHRoZSBSZWdpc3RlciBvZmZzZXQKKyAqCisgKiBXcml0ZSBkYXRhIHRvIHRoZSBwYXJpY3VsYXIgQ0FOIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHhjYW5fd3JpdGVfcmVnX2xlKGNvbnN0IHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYsIGVudW0geGNhbl9yZWcgcmVnLAorCQkJdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzIodmFsLCBwcml2LT5yZWdfYmFzZSArIHJlZyk7Cit9CisKKy8qKgorICogeGNhbl9yZWFkX3JlZ19sZSAtIFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXIgbGl0dGxlIGVuZGlhbgorICogQHByaXY6CURyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAcmVnOglSZWdpc3RlciBvZmZzZXQKKyAqCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgcGFydGljdWxhciBDQU4gcmVnaXN0ZXIKKyAqIFJldHVybjogdmFsdWUgcmVhZCBmcm9tIHRoZSBDQU4gcmVnaXN0ZXIKKyAqLworc3RhdGljIHUzMiB4Y2FuX3JlYWRfcmVnX2xlKGNvbnN0IHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYsIGVudW0geGNhbl9yZWcgcmVnKQoreworCXJldHVybiBpb3JlYWQzMihwcml2LT5yZWdfYmFzZSArIHJlZyk7Cit9CisKKy8qKgorICogeGNhbl93cml0ZV9yZWdfYmUgLSBXcml0ZSBhIHZhbHVlIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXIgYmlnIGVuZGlhbgorICogQHByaXY6CURyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAcmVnOglSZWdpc3RlciBvZmZzZXQKKyAqIEB2YWw6CVZhbHVlIHRvIHdyaXRlIGF0IHRoZSBSZWdpc3RlciBvZmZzZXQKKyAqCisgKiBXcml0ZSBkYXRhIHRvIHRoZSBwYXJpY3VsYXIgQ0FOIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHhjYW5fd3JpdGVfcmVnX2JlKGNvbnN0IHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYsIGVudW0geGNhbl9yZWcgcmVnLAorCQkJdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzJiZSh2YWwsIHByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworLyoqCisgKiB4Y2FuX3JlYWRfcmVnX2JlIC0gUmVhZCBhIHZhbHVlIGZyb20gdGhlIGRldmljZSByZWdpc3RlciBiaWcgZW5kaWFuCisgKiBAcHJpdjoJRHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZWc6CVJlZ2lzdGVyIG9mZnNldAorICoKKyAqIFJlYWQgZGF0YSBmcm9tIHRoZSBwYXJ0aWN1bGFyIENBTiByZWdpc3RlcgorICogUmV0dXJuOiB2YWx1ZSByZWFkIGZyb20gdGhlIENBTiByZWdpc3RlcgorICovCitzdGF0aWMgdTMyIHhjYW5fcmVhZF9yZWdfYmUoY29uc3Qgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiwgZW51bSB4Y2FuX3JlZyByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyYmUocHJpdi0+cmVnX2Jhc2UgKyByZWcpOworfQorCisvKioKKyAqIHNldF9yZXNldF9tb2RlIC0gUmVzZXRzIHRoZSBDQU4gZGV2aWNlIG1vZGUKKyAqIEBuZGV2OglQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHJlc2V0IG1vZGUgcm91dGluZS5UaGUgZHJpdmVyCisgKiBlbnRlcnMgaW50byBjb25maWd1cmF0aW9uIG1vZGUuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBzZXRfcmVzZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwgWENBTl9TUlJfUkVTRVRfTUFTSyk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIFhDQU5fVElNRU9VVDsKKwl3aGlsZSAoIShwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkgJiBYQ0FOX1NSX0NPTkZJR19NQVNLKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJbmV0ZGV2X3dhcm4obmRldiwgInRpbWVkIG91dCBmb3IgY29uZmlnIG1vZGVcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMDApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHhjYW5fc2V0X2JpdHRpbWluZyAtIENBTiBzZXQgYml0IHRpbWluZyByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBzZXQgYml0dGltaW5nICByb3V0aW5lLgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB4Y2FuX3NldF9iaXR0aW1pbmcoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjYW5fYml0dGltaW5nICpidCA9ICZwcml2LT5jYW4uYml0dGltaW5nOworCXUzMiBidHIwLCBidHIxOworCXUzMiBpc19jb25maWdfbW9kZTsKKworCS8qIENoZWNrIHdoZXRoZXIgWGlsaW54IENBTiBpcyBpbiBjb25maWd1cmF0aW9uIG1vZGUuCisJICogSXQgY2Fubm90IHNldCBiaXQgdGltaW5nIGlmIFhpbGlueCBDQU4gaXMgbm90IGluIGNvbmZpZ3VyYXRpb24gbW9kZS4KKwkgKi8KKwlpc19jb25maWdfbW9kZSA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fU1JfT0ZGU0VUKSAmCisJCQkJWENBTl9TUl9DT05GSUdfTUFTSzsKKwlpZiAoIWlzX2NvbmZpZ19tb2RlKSB7CisJCW5ldGRldl9hbGVydChuZGV2LAorCQkgICAgICJCVUchIENhbm5vdCBzZXQgYml0dGltaW5nIC0gQ0FOIGlzIG5vdCBpbiBjb25maWcgbW9kZVxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogU2V0dGluZyBCYXVkIFJhdGUgcHJlc2NhbGFyIHZhbHVlIGluIEJSUFIgUmVnaXN0ZXIgKi8KKwlidHIwID0gKGJ0LT5icnAgLSAxKTsKKworCS8qIFNldHRpbmcgVGltZSBTZWdtZW50IDEgaW4gQlRSIFJlZ2lzdGVyICovCisJYnRyMSA9IChidC0+cHJvcF9zZWcgKyBidC0+cGhhc2Vfc2VnMSAtIDEpOworCisJLyogU2V0dGluZyBUaW1lIFNlZ21lbnQgMiBpbiBCVFIgUmVnaXN0ZXIgKi8KKwlidHIxIHw9IChidC0+cGhhc2Vfc2VnMiAtIDEpIDw8IFhDQU5fQlRSX1RTMl9TSElGVDsKKworCS8qIFNldHRpbmcgU3luY2hyb25vdXMganVtcCB3aWR0aCBpbiBCVFIgUmVnaXN0ZXIgKi8KKwlidHIxIHw9IChidC0+c2p3IC0gMSkgPDwgWENBTl9CVFJfU0pXX1NISUZUOworCisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fQlJQUl9PRkZTRVQsIGJ0cjApOworCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0JUUl9PRkZTRVQsIGJ0cjEpOworCisJbmV0ZGV2X2RiZyhuZGV2LCAiQlJQUj0weCUwOHgsIEJUUj0weCUwOHhcbiIsCisJCQlwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0JSUFJfT0ZGU0VUKSwKKwkJCXByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fQlRSX09GRlNFVCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGNhbl9jaGlwX3N0YXJ0IC0gVGhpcyB0aGUgZHJpdmVycyBzdGFydCByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlcnMgc3RhcnQgcm91dGluZS4KKyAqIEJhc2VkIG9uIHRoZSBTdGF0ZSBvZiB0aGUgQ0FOIGRldmljZSBpdCBwdXRzCisgKiB0aGUgQ0FOIGRldmljZSBpbnRvIGEgcHJvcGVyIG1vZGUuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB4Y2FuX2NoaXBfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBlcnIsIHJlZ19tc3IsIHJlZ19zcl9tYXNrOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIENoZWNrIGlmIGl0IGlzIGluIHJlc2V0IG1vZGUgKi8KKwllcnIgPSBzZXRfcmVzZXRfbW9kZShuZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHhjYW5fc2V0X2JpdHRpbWluZyhuZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUVSX09GRlNFVCwgWENBTl9JTlRSX0FMTCk7CisKKwkvKiBDaGVjayB3aGV0aGVyIGl0IGlzIGxvb3BiYWNrIG1vZGUgb3Igbm9ybWFsIG1vZGUgICovCisJaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9MT09QQkFDSykgeworCQlyZWdfbXNyID0gWENBTl9NU1JfTEJBQ0tfTUFTSzsKKwkJcmVnX3NyX21hc2sgPSBYQ0FOX1NSX0xCQUNLX01BU0s7CisJfSBlbHNlIHsKKwkJcmVnX21zciA9IDB4MDsKKwkJcmVnX3NyX21hc2sgPSBYQ0FOX1NSX05PUk1BTF9NQVNLOworCX0KKworCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX01TUl9PRkZTRVQsIHJlZ19tc3IpOworCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX1NSUl9PRkZTRVQsIFhDQU5fU1JSX0NFTl9NQVNLKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgWENBTl9USU1FT1VUOworCXdoaWxlICghKHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fU1JfT0ZGU0VUKSAmIHJlZ19zcl9tYXNrKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJbmV0ZGV2X3dhcm4obmRldiwKKwkJCQkidGltZWQgb3V0IGZvciBjb3JyZWN0IG1vZGVcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisJbmV0ZGV2X2RiZyhuZGV2LCAic3RhdHVzOiN4JTA4eFxuIiwKKwkJCXByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fU1JfT0ZGU0VUKSk7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCXJldHVybiAwOworfQorCisvKioKKyAqIHhjYW5fZG9fc2V0X21vZGUgLSBUaGlzIHNldHMgdGhlIG1vZGUgb2YgdGhlIGRyaXZlcgorICogQG5kZXY6CVBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBtb2RlOglUZWxscyB0aGUgbW9kZSBvZiB0aGUgZHJpdmVyCisgKgorICogVGhpcyBjaGVjayB0aGUgZHJpdmVycyBzdGF0ZSBhbmQgY2FsbHMgdGhlCisgKiB0aGUgY29ycmVzcG9uZGluZyBtb2RlcyB0byBzZXQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB4Y2FuX2RvX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBlbnVtIGNhbl9tb2RlIG1vZGUpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0FOX01PREVfU1RBUlQ6CisJCXJldCA9IHhjYW5fY2hpcF9zdGFydChuZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW5ldGRldl9lcnIobmRldiwgInhjYW5fY2hpcF9zdGFydCBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogeGNhbl9zdGFydF94bWl0IC0gU3RhcnRzIHRoZSB0cmFuc21pc3Npb24KKyAqIEBza2I6CXNrX2J1ZmYgcG9pbnRlciB0aGF0IGNvbnRhaW5zIGRhdGEgdG8gYmUgVHhlZAorICogQG5kZXY6CVBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSB1cHBlciBsYXllcnMgdG8gaW5pdGlhdGUgdHJhbnNtaXNzaW9uLiBUaGlzCisgKiBmdW5jdGlvbiB1c2VzIHRoZSBuZXh0IGF2YWlsYWJsZSBmcmVlIHR4YnVmZiBhbmQgcG9wdWxhdGVzIHRoZWlyIGZpZWxkcyB0bworICogc3RhcnQgdGhlIHRyYW5zbWlzc2lvbi4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZmFpbHVyZSB2YWx1ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHhjYW5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5kZXYtPnN0YXRzOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CisJdTMyIGlkLCBkbGMsIGRhdGFbMl0gPSB7MCwgMH07CisKKwlpZiAoY2FuX2Ryb3BwZWRfaW52YWxpZF9za2IobmRldiwgc2tiKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworCS8qIENoZWNrIGlmIHRoZSBUWCBidWZmZXIgaXMgZnVsbCAqLworCWlmICh1bmxpa2VseShwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkgJgorCQkJWENBTl9TUl9UWEZMTF9NQVNLKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQluZXRkZXZfZXJyKG5kZXYsICJCVUchLCBUWCBGSUZPIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJLyogV2F0Y2ggY2FyZWZ1bGx5IG9uIHRoZSBiaXQgc2VxdWVuY2UgKi8KKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9FRkZfRkxBRykgeworCQkvKiBFeHRlbmRlZCBDQU4gSUQgZm9ybWF0ICovCisJCWlkID0gKChjZi0+Y2FuX2lkICYgQ0FOX0VGRl9NQVNLKSA8PCBYQ0FOX0lEUl9JRDJfU0hJRlQpICYKKwkJCVhDQU5fSURSX0lEMl9NQVNLOworCQlpZCB8PSAoKChjZi0+Y2FuX2lkICYgQ0FOX0VGRl9NQVNLKSA+PgorCQkJKENBTl9FRkZfSURfQklUUy1DQU5fU0ZGX0lEX0JJVFMpKSA8PAorCQkJWENBTl9JRFJfSUQxX1NISUZUKSAmIFhDQU5fSURSX0lEMV9NQVNLOworCisJCS8qIFRoZSBzdWJzdGlidXRlIHJlbW90ZSBUWCByZXF1ZXN0IGJpdCBzaG91bGQgYmUgIjEiCisJCSAqIGZvciBleHRlbmRlZCBmcmFtZXMgYXMgaW4gdGhlIFhpbGlueCBDQU4gZGF0YXNoZWV0CisJCSAqLworCQlpZCB8PSBYQ0FOX0lEUl9JREVfTUFTSyB8IFhDQU5fSURSX1NSUl9NQVNLOworCisJCWlmIChjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKQorCQkJLyogRXh0ZW5kZWQgZnJhbWVzIHJlbW90ZSBUWCByZXF1ZXN0ICovCisJCQlpZCB8PSBYQ0FOX0lEUl9SVFJfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBTdGFuZGFyZCBDQU4gSUQgZm9ybWF0ICovCisJCWlkID0gKChjZi0+Y2FuX2lkICYgQ0FOX1NGRl9NQVNLKSA8PCBYQ0FOX0lEUl9JRDFfU0hJRlQpICYKKwkJCVhDQU5fSURSX0lEMV9NQVNLOworCisJCWlmIChjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKQorCQkJLyogU3RhbmRhcmQgZnJhbWVzIHJlbW90ZSBUWCByZXF1ZXN0ICovCisJCQlpZCB8PSBYQ0FOX0lEUl9TUlJfTUFTSzsKKwl9CisKKwlkbGMgPSBjZi0+Y2FuX2RsYyA8PCBYQ0FOX0RMQ1JfRExDX1NISUZUOworCisJaWYgKGNmLT5jYW5fZGxjID4gMCkKKwkJZGF0YVswXSA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKGNmLT5kYXRhICsgMCkpOworCWlmIChjZi0+Y2FuX2RsYyA+IDQpCisJCWRhdGFbMV0gPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKShjZi0+ZGF0YSArIDQpKTsKKworCWNhbl9wdXRfZWNob19za2Ioc2tiLCBuZGV2LCBwcml2LT50eF9oZWFkICUgcHJpdi0+dHhfbWF4KTsKKwlwcml2LT50eF9oZWFkKys7CisKKwkvKiBXcml0ZSB0aGUgRnJhbWUgdG8gWGlsaW54IENBTiBUWCBGSUZPICovCisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fVFhGSUZPX0lEX09GRlNFVCwgaWQpOworCS8qIElmIHRoZSBDQU4gZnJhbWUgaXMgUlRSIGZyYW1lIHRoaXMgd3JpdGUgdHJpZ2dlcnMgdHJhbm1pc3Npb24gKi8KKwlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9UWEZJRk9fRExDX09GRlNFVCwgZGxjKTsKKwlpZiAoIShjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKSkgeworCQlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9UWEZJRk9fRFcxX09GRlNFVCwgZGF0YVswXSk7CisJCS8qIElmIHRoZSBDQU4gZnJhbWUgaXMgU3RhbmRhcmQvRXh0ZW5kZWQgZnJhbWUgdGhpcworCQkgKiB3cml0ZSB0cmlnZ2VycyB0cmFubWlzc2lvbgorCQkgKi8KKwkJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fVFhGSUZPX0RXMl9PRkZTRVQsIGRhdGFbMV0pOworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIFRYIGJ1ZmZlciBpcyBmdWxsICovCisJaWYgKChwcml2LT50eF9oZWFkIC0gcHJpdi0+dHhfdGFpbCkgPT0gcHJpdi0+dHhfbWF4KQorCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoqCisgKiB4Y2FuX3J4IC0gIElzIGNhbGxlZCBmcm9tIENBTiBpc3IgdG8gY29tcGxldGUgdGhlIHJlY2VpdmVkCisgKgkJZnJhbWUgIHByb2Nlc3NpbmcKKyAqIEBuZGV2OglQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gdGhlIENBTiBpc3IocG9sbCkgdG8gcHJvY2VzcyB0aGUgUnggZnJhbWVzLiBJdAorICogZG9lcyBtaW5pbWFsIHByb2Nlc3NpbmcgYW5kIGludm9rZXMgIm5ldGlmX3JlY2VpdmVfc2tiIiB0byBjb21wbGV0ZSBmdXJ0aGVyCisgKiBwcm9jZXNzaW5nLgorICogUmV0dXJuOiAxIG9uIHN1Y2Nlc3MgYW5kIDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB4Y2FuX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbmRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgaWRfeGNhbiwgZGxjLCBkYXRhWzJdID0gezAsIDB9OworCisJc2tiID0gYWxsb2NfY2FuX3NrYihuZGV2LCAmY2YpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWFkIGEgZnJhbWUgZnJvbSBYaWxpbnggenlucSBDQU5QUyAqLworCWlkX3hjYW4gPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1JYRklGT19JRF9PRkZTRVQpOworCWRsYyA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fUlhGSUZPX0RMQ19PRkZTRVQpID4+CisJCQkJWENBTl9ETENSX0RMQ19TSElGVDsKKworCS8qIENoYW5nZSBYaWxpbnggQ0FOIGRhdGEgbGVuZ3RoIGZvcm1hdCB0byBzb2NrZXRDQU4gZGF0YSBmb3JtYXQgKi8KKwljZi0+Y2FuX2RsYyA9IGdldF9jYW5fZGxjKGRsYyk7CisKKwkvKiBDaGFuZ2UgWGlsaW54IENBTiBJRCBmb3JtYXQgdG8gc29ja2V0Q0FOIElEIGZvcm1hdCAqLworCWlmIChpZF94Y2FuICYgWENBTl9JRFJfSURFX01BU0spIHsKKwkJLyogVGhlIHJlY2VpdmVkIGZyYW1lIGlzIGFuIEV4dGVuZGVkIGZvcm1hdCBmcmFtZSAqLworCQljZi0+Y2FuX2lkID0gKGlkX3hjYW4gJiBYQ0FOX0lEUl9JRDFfTUFTSykgPj4gMzsKKwkJY2YtPmNhbl9pZCB8PSAoaWRfeGNhbiAmIFhDQU5fSURSX0lEMl9NQVNLKSA+PgorCQkJCVhDQU5fSURSX0lEMl9TSElGVDsKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRUZGX0ZMQUc7CisJCWlmIChpZF94Y2FuICYgWENBTl9JRFJfUlRSX01BU0spCisJCQljZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsKKwl9IGVsc2UgeworCQkvKiBUaGUgcmVjZWl2ZWQgZnJhbWUgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZnJhbWUgKi8KKwkJY2YtPmNhbl9pZCA9IChpZF94Y2FuICYgWENBTl9JRFJfSUQxX01BU0spID4+CisJCQkJWENBTl9JRFJfSUQxX1NISUZUOworCQlpZiAoaWRfeGNhbiAmIFhDQU5fSURSX1NSUl9NQVNLKQorCQkJY2YtPmNhbl9pZCB8PSBDQU5fUlRSX0ZMQUc7CisJfQorCisJaWYgKCEoaWRfeGNhbiAmIFhDQU5fSURSX1NSUl9NQVNLKSkgeworCQlkYXRhWzBdID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9SWEZJRk9fRFcxX09GRlNFVCk7CisJCWRhdGFbMV0gPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1JYRklGT19EVzJfT0ZGU0VUKTsKKworCQkvKiBDaGFuZ2UgWGlsaW54IENBTiBkYXRhIGZvcm1hdCB0byBzb2NrZXRDQU4gZGF0YSBmb3JtYXQgKi8KKwkJaWYgKGNmLT5jYW5fZGxjID4gMCkKKwkJCSooX19iZTMyICopKGNmLT5kYXRhKSA9IGNwdV90b19iZTMyKGRhdGFbMF0pOworCQlpZiAoY2YtPmNhbl9kbGMgPiA0KQorCQkJKihfX2JlMzIgKikoY2YtPmRhdGEgKyA0KSA9IGNwdV90b19iZTMyKGRhdGFbMV0pOworCX0KKworCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiB4Y2FuX2Vycl9pbnRlcnJ1cHQgLSBlcnJvciBmcmFtZSBJc3IKKyAqIEBuZGV2OgluZXRfZGV2aWNlIHBvaW50ZXIKKyAqIEBpc3I6CWludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKiBUaGlzIGlzIHRoZSBDQU4gZXJyb3IgaW50ZXJydXB0IGFuZCBpdCB3aWxsCisgKiBjaGVjayB0aGUgdGhlIHR5cGUgb2YgZXJyb3IgYW5kIGZvcndhcmQgdGhlIGVycm9yCisgKiBmcmFtZSB0byB1cHBlciBsYXllcnMuCisgKi8KK3N0YXRpYyB2b2lkIHhjYW5fZXJyX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGlzcikKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5kZXYtPnN0YXRzOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGVycl9zdGF0dXMsIHN0YXR1cywgdHhlcnIgPSAwLCByeGVyciA9IDA7CisKKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihuZGV2LCAmY2YpOworCisJZXJyX3N0YXR1cyA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fRVNSX09GRlNFVCk7CisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fRVNSX09GRlNFVCwgZXJyX3N0YXR1cyk7CisJdHhlcnIgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0VDUl9PRkZTRVQpICYgWENBTl9FQ1JfVEVDX01BU0s7CisJcnhlcnIgPSAoKHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fRUNSX09GRlNFVCkgJgorCQkJWENBTl9FQ1JfUkVDX01BU0spID4+IFhDQU5fRVNSX1JFQ19TSElGVCk7CisJc3RhdHVzID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9TUl9PRkZTRVQpOworCisJaWYgKGlzciAmIFhDQU5fSVhSX0JTT0ZGX01BU0spIHsKKwkJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0JVU19PRkY7CisJCXByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX29mZisrOworCQkvKiBMZWF2ZSBkZXZpY2UgaW4gQ29uZmlnIE1vZGUgaW4gYnVzLW9mZiBzdGF0ZSAqLworCQlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9TUlJfT0ZGU0VULCBYQ0FOX1NSUl9SRVNFVF9NQVNLKTsKKwkJY2FuX2J1c19vZmYobmRldik7CisJCWlmIChza2IpCisJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFhDQU5fU1JfRVNUQVRfTUFTSykgPT0gWENBTl9TUl9FU1RBVF9NQVNLKSB7CisJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKwkJaWYgKHNrYikgeworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCQljZi0+ZGF0YVsxXSA9IChyeGVyciA+IDEyNykgPworCQkJCQlDQU5fRVJSX0NSVExfUlhfUEFTU0lWRSA6CisJCQkJCUNBTl9FUlJfQ1JUTF9UWF9QQVNTSVZFOworCQkJY2YtPmRhdGFbNl0gPSB0eGVycjsKKwkJCWNmLT5kYXRhWzddID0gcnhlcnI7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFhDQU5fU1JfRVJSV1JOX01BU0spIHsKKwkJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc7CisJCXByaXYtPmNhbi5jYW5fc3RhdHMuZXJyb3Jfd2FybmluZysrOworCQlpZiAoc2tiKSB7CisJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsKKwkJCWNmLT5kYXRhWzFdIHw9ICh0eGVyciA+IHJ4ZXJyKSA/CisJCQkJCUNBTl9FUlJfQ1JUTF9UWF9XQVJOSU5HIDoKKwkJCQkJQ0FOX0VSUl9DUlRMX1JYX1dBUk5JTkc7CisJCQljZi0+ZGF0YVs2XSA9IHR4ZXJyOworCQkJY2YtPmRhdGFbN10gPSByeGVycjsKKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBBcmJpdHJhdGlvbiBsb3N0IGludGVycnVwdCAqLworCWlmIChpc3IgJiBYQ0FOX0lYUl9BUkJMU1RfTUFTSykgeworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmFyYml0cmF0aW9uX2xvc3QrKzsKKwkJaWYgKHNrYikgeworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0xPU1RBUkI7CisJCQljZi0+ZGF0YVswXSA9IENBTl9FUlJfTE9TVEFSQl9VTlNQRUM7CisJCX0KKwl9CisKKwkvKiBDaGVjayBmb3IgUlggRklGTyBPdmVyZmxvdyBpbnRlcnJ1cHQgKi8KKwlpZiAoaXNyICYgWENBTl9JWFJfUlhPRkxXX01BU0spIHsKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzKys7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwgWENBTl9TUlJfUkVTRVRfTUFTSyk7CisJCWlmIChza2IpIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9DUlRMOworCQkJY2YtPmRhdGFbMV0gfD0gQ0FOX0VSUl9DUlRMX1JYX09WRVJGTE9XOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIGVycm9yIGludGVycnVwdCAqLworCWlmIChpc3IgJiBYQ0FOX0lYUl9FUlJPUl9NQVNLKSB7CisJCWlmIChza2IpIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9QUk9UIHwgQ0FOX0VSUl9CVVNFUlJPUjsKKwkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9VTlNQRUM7CisJCX0KKworCQkvKiBDaGVjayBmb3IgQWNrIGVycm9yIGludGVycnVwdCAqLworCQlpZiAoZXJyX3N0YXR1cyAmIFhDQU5fRVNSX0FDS0VSX01BU0spIHsKKwkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCWlmIChza2IpIHsKKwkJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQUNLOworCQkJCWNmLT5kYXRhWzNdIHw9IENBTl9FUlJfUFJPVF9MT0NfQUNLOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIEJpdCBlcnJvciBpbnRlcnJ1cHQgKi8KKwkJaWYgKGVycl9zdGF0dXMgJiBYQ0FOX0VTUl9CRVJSX01BU0spIHsKKwkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCWlmIChza2IpIHsKKwkJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsKKwkJCQljZi0+ZGF0YVsyXSA9IENBTl9FUlJfUFJPVF9CSVQ7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBmb3IgU3R1ZmYgZXJyb3IgaW50ZXJydXB0ICovCisJCWlmIChlcnJfc3RhdHVzICYgWENBTl9FU1JfU1RFUl9NQVNLKSB7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlpZiAoc2tiKSB7CisJCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1Q7CisJCQkJY2YtPmRhdGFbMl0gPSBDQU5fRVJSX1BST1RfU1RVRkY7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBmb3IgRm9ybSBlcnJvciBpbnRlcnJ1cHQgKi8KKwkJaWYgKGVycl9zdGF0dXMgJiBYQ0FOX0VTUl9GTUVSX01BU0spIHsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCWlmIChza2IpIHsKKwkJCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsKKwkJCQljZi0+ZGF0YVsyXSA9IENBTl9FUlJfUFJPVF9GT1JNOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIENSQyBlcnJvciBpbnRlcnJ1cHQgKi8KKwkJaWYgKGVycl9zdGF0dXMgJiBYQ0FOX0VTUl9DUkNFUl9NQVNLKSB7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlpZiAoc2tiKSB7CisJCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1Q7CisJCQkJY2YtPmRhdGFbM10gPSBDQU5fRVJSX1BST1RfTE9DX0NSQ19TRVEgfAorCQkJCQkJQ0FOX0VSUl9QUk9UX0xPQ19DUkNfREVMOworCQkJfQorCQl9CisJCQlwcml2LT5jYW4uY2FuX3N0YXRzLmJ1c19lcnJvcisrOworCX0KKworCWlmIChza2IpIHsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCQluZXRpZl9yeChza2IpOworCX0KKworCW5ldGRldl9kYmcobmRldiwgIiVzOiBlcnJvciBzdGF0dXMgcmVnaXN0ZXI6MHgleFxuIiwKKwkJCV9fZnVuY19fLCBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0VTUl9PRkZTRVQpKTsKK30KKworLyoqCisgKiB4Y2FuX3N0YXRlX2ludGVycnVwdCAtIEl0IHdpbGwgY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBDQU4gZGV2aWNlCisgKiBAbmRldjoJbmV0X2RldmljZSBwb2ludGVyCisgKiBAaXNyOglpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlCisgKgorICogVGhpcyB3aWxsIGNoZWNrcyB0aGUgc3RhdGUgb2YgdGhlIENBTiBkZXZpY2UKKyAqIGFuZCBwdXRzIHRoZSBkZXZpY2UgaW50byBhcHByb3ByaWF0ZSBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgeGNhbl9zdGF0ZV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBpc3IpCit7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyogQ2hlY2sgZm9yIFNsZWVwIGludGVycnVwdCBpZiBzZXQgcHV0IENBTiBkZXZpY2UgaW4gc2xlZXAgc3RhdGUgKi8KKwlpZiAoaXNyICYgWENBTl9JWFJfU0xQX01BU0spCisJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9TTEVFUElORzsKKworCS8qIENoZWNrIGZvciBXYWtlIHVwIGludGVycnVwdCBpZiBzZXQgcHV0IENBTiBkZXZpY2UgaW4gQWN0aXZlIHN0YXRlICovCisJaWYgKGlzciAmIFhDQU5fSVhSX1dLVVBfTUFTSykKKwkJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsKK30KKworLyoqCisgKiB4Y2FuX3J4X3BvbGwgLSBQb2xsIHJvdXRpbmUgZm9yIHJ4IHBhY2tldHMgKE5BUEkpCisgKiBAbmFwaToJbmFwaSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQHF1b3RhOglNYXggbnVtYmVyIG9mIHJ4IHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkLgorICoKKyAqIFRoaXMgaXMgdGhlIHBvbGwgcm91dGluZSBmb3IgcnggcGFydC4KKyAqIEl0IHdpbGwgcHJvY2VzcyB0aGUgcGFja2V0cyBtYXhpbXV4IHF1b3RhIHZhbHVlLgorICoKKyAqIFJldHVybjogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQKKyAqLworc3RhdGljIGludCB4Y2FuX3J4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgcXVvdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBuYXBpLT5kZXY7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBpc3IsIGllcjsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWlzciA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fSVNSX09GRlNFVCk7CisJd2hpbGUgKChpc3IgJiBYQ0FOX0lYUl9SWE5FTVBfTUFTSykgJiYgKHdvcmtfZG9uZSA8IHF1b3RhKSkgeworCQlpZiAoaXNyICYgWENBTl9JWFJfUlhPS19NQVNLKSB7CisJCQlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JQ1JfT0ZGU0VULAorCQkJCVhDQU5fSVhSX1JYT0tfTUFTSyk7CisJCQl3b3JrX2RvbmUgKz0geGNhbl9yeChuZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lDUl9PRkZTRVQsCisJCQkJWENBTl9JWFJfUlhORU1QX01BU0spOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUNSX09GRlNFVCwgWENBTl9JWFJfUlhORU1QX01BU0spOworCQlpc3IgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0lTUl9PRkZTRVQpOworCX0KKworCWlmICh3b3JrX2RvbmUpCisJCWNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9SWCk7CisKKwlpZiAod29ya19kb25lIDwgcXVvdGEpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJaWVyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VUKTsKKwkJaWVyIHw9IChYQ0FOX0lYUl9SWE9LX01BU0sgfCBYQ0FOX0lYUl9SWE5FTVBfTUFTSyk7CisJCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lFUl9PRkZTRVQsIGllcik7CisJfQorCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKy8qKgorICogeGNhbl90eF9pbnRlcnJ1cHQgLSBUeCBEb25lIElzcgorICogQG5kZXY6CW5ldF9kZXZpY2UgcG9pbnRlcgorICogQGlzcjoJSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB2YWx1ZQorICovCitzdGF0aWMgdm9pZCB4Y2FuX3R4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGlzcikKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5kZXYtPnN0YXRzOworCisJd2hpbGUgKChwcml2LT50eF9oZWFkIC0gcHJpdi0+dHhfdGFpbCA+IDApICYmCisJCQkoaXNyICYgWENBTl9JWFJfVFhPS19NQVNLKSkgeworCQlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JQ1JfT0ZGU0VULCBYQ0FOX0lYUl9UWE9LX01BU0spOworCQljYW5fZ2V0X2VjaG9fc2tiKG5kZXYsIHByaXYtPnR4X3RhaWwgJQorCQkJCQlwcml2LT50eF9tYXgpOworCQlwcml2LT50eF90YWlsKys7CisJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCWlzciA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fSVNSX09GRlNFVCk7CisJfQorCWNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9UWCk7CisJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKK30KKworLyoqCisgKiB4Y2FuX2ludGVycnVwdCAtIENBTiBJc3IKKyAqIEBpcnE6CWlycSBudW1iZXIKKyAqIEBkZXZfaWQ6CWRldmljZSBpZCBwb25pdGVyCisgKgorICogVGhpcyBpcyB0aGUgeGlsaW54IENBTiBJc3IuIEl0IGNoZWNrcyBmb3IgdGhlIHR5cGUgb2YgaW50ZXJydXB0CisgKiBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZyBJU1IuCisgKgorICogUmV0dXJuOgorICogSVJRX05PTkUgLSBJZiBDQU4gZGV2aWNlIGlzIGluIHNsZWVwIG1vZGUsIElSUV9IQU5ETEVEIG90aGVyd2lzZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgeGNhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgaXNyLCBpZXI7CisKKwkvKiBHZXQgdGhlIGludGVycnVwdCBzdGF0dXMgZnJvbSBYaWxpbnggQ0FOICovCisJaXNyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9JU1JfT0ZGU0VUKTsKKwlpZiAoIWlzcikKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogQ2hlY2sgZm9yIHRoZSB0eXBlIG9mIGludGVycnVwdCBhbmQgUHJvY2Vzc2luZyBpdCAqLworCWlmIChpc3IgJiAoWENBTl9JWFJfU0xQX01BU0sgfCBYQ0FOX0lYUl9XS1VQX01BU0spKSB7CisJCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lDUl9PRkZTRVQsIChYQ0FOX0lYUl9TTFBfTUFTSyB8CisJCQkJWENBTl9JWFJfV0tVUF9NQVNLKSk7CisJCXhjYW5fc3RhdGVfaW50ZXJydXB0KG5kZXYsIGlzcik7CisJfQorCisJLyogQ2hlY2sgZm9yIFR4IGludGVycnVwdCBhbmQgUHJvY2Vzc2luZyBpdCAqLworCWlmIChpc3IgJiBYQ0FOX0lYUl9UWE9LX01BU0spCisJCXhjYW5fdHhfaW50ZXJydXB0KG5kZXYsIGlzcik7CisKKwkvKiBDaGVjayBmb3IgdGhlIHR5cGUgb2YgZXJyb3IgaW50ZXJydXB0IGFuZCBQcm9jZXNzaW5nIGl0ICovCisJaWYgKGlzciAmIChYQ0FOX0lYUl9FUlJPUl9NQVNLIHwgWENBTl9JWFJfUlhPRkxXX01BU0sgfAorCQkJWENBTl9JWFJfQlNPRkZfTUFTSyB8IFhDQU5fSVhSX0FSQkxTVF9NQVNLKSkgeworCQlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JQ1JfT0ZGU0VULCAoWENBTl9JWFJfRVJST1JfTUFTSyB8CisJCQkJWENBTl9JWFJfUlhPRkxXX01BU0sgfCBYQ0FOX0lYUl9CU09GRl9NQVNLIHwKKwkJCQlYQ0FOX0lYUl9BUkJMU1RfTUFTSykpOworCQl4Y2FuX2Vycl9pbnRlcnJ1cHQobmRldiwgaXNyKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgdGhlIHR5cGUgb2YgcmVjZWl2ZSBpbnRlcnJ1cHQgYW5kIFByb2Nlc3NpbmcgaXQgKi8KKwlpZiAoaXNyICYgKFhDQU5fSVhSX1JYTkVNUF9NQVNLIHwgWENBTl9JWFJfUlhPS19NQVNLKSkgeworCQlpZXIgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0lFUl9PRkZTRVQpOworCQlpZXIgJj0gfihYQ0FOX0lYUl9SWE5FTVBfTUFTSyB8IFhDQU5fSVhSX1JYT0tfTUFTSyk7CisJCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lFUl9PRkZTRVQsIGllcik7CisJCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogeGNhbl9jaGlwX3N0b3AgLSBEcml2ZXIgc3RvcCByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlcnMgc3RvcCByb3V0aW5lLiBJdCB3aWxsIGRpc2FibGUgdGhlCisgKiBpbnRlcnJ1cHRzIGFuZCBwdXQgdGhlIGRldmljZSBpbnRvIGNvbmZpZ3VyYXRpb24gbW9kZS4KKyAqLworc3RhdGljIHZvaWQgeGNhbl9jaGlwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBpZXI7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIGxlYXZlIHRoZSBjYW4gaW4gY29uZmlndXJhdGlvbiBtb2RlICovCisJaWVyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VUKTsKKwlpZXIgJj0gflhDQU5fSU5UUl9BTEw7CisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUVSX09GRlNFVCwgaWVyKTsKKwlwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9TUlJfT0ZGU0VULCBYQ0FOX1NSUl9SRVNFVF9NQVNLKTsKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKK30KKworLyoqCisgKiB4Y2FuX29wZW4gLSBEcml2ZXIgb3BlbiByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBvcGVuIHJvdXRpbmUuCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZmFpbHVyZSB2YWx1ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHhjYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKG5kZXYtPmlycSwgeGNhbl9pbnRlcnJ1cHQsIHByaXYtPmlycV9mbGFncywKKwkJCW5kZXYtPm5hbWUsIG5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgImlycSBhbGxvY2F0aW9uIGZvciBDQU4gZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNhbl9jbGspOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIGVuYWJsZSBkZXZpY2UgY2xvY2tcbiIpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmJ1c19jbGspOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIGVuYWJsZSBidXMgY2xvY2tcbiIpOworCQlnb3RvIGVycl9jYW5fY2xrOworCX0KKworCS8qIFNldCBjaGlwIGludG8gcmVzZXQgbW9kZSAqLworCXJldCA9IHNldF9yZXNldF9tb2RlKG5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgIm1vZGUgcmVzZXR0aW5nIGZhaWxlZCFcbiIpOworCQlnb3RvIGVycl9idXNfY2xrOworCX0KKworCS8qIENvbW1vbiBvcGVuICovCisJcmV0ID0gb3Blbl9jYW5kZXYobmRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYnVzX2NsazsKKworCXJldCA9IHhjYW5fY2hpcF9zdGFydChuZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZXJyKG5kZXYsICJ4Y2FuX2NoaXBfc3RhcnQgZmFpbGVkIVxuIik7CisJCWdvdG8gZXJyX2NhbmRldjsKKwl9CisKKwljYW5fbGVkX2V2ZW50KG5kZXYsIENBTl9MRURfRVZFTlRfT1BFTik7CisJbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9jYW5kZXY6CisJY2xvc2VfY2FuZGV2KG5kZXYpOworZXJyX2J1c19jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmJ1c19jbGspOworZXJyX2Nhbl9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNhbl9jbGspOworZXJyX2lycToKKwlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogeGNhbl9jbG9zZSAtIERyaXZlciBjbG9zZSByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjogMCBhbHdheXMKKyAqLworc3RhdGljIGludCB4Y2FuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKwl4Y2FuX2NoaXBfc3RvcChuZGV2KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNhbl9jbGspOworCWZyZWVfaXJxKG5kZXYtPmlycSwgbmRldik7CisJY2xvc2VfY2FuZGV2KG5kZXYpOworCisJY2FuX2xlZF9ldmVudChuZGV2LCBDQU5fTEVEX0VWRU5UX1NUT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGNhbl9nZXRfYmVycl9jb3VudGVyIC0gZXJyb3IgY291bnRlciByb3V0aW5lCisgKiBAbmRldjoJUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQGJlYzoJUG9pbnRlciB0byBjYW5fYmVycl9jb3VudGVyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlcnJvciBjb3VudGVyIHJvdXRpbmUuCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZmFpbHVyZSB2YWx1ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHhjYW5fZ2V0X2JlcnJfY291bnRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkJc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgKmJlYykKK3sKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jYW5fY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5idXNfY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jbGs7CisKKwliZWMtPnR4ZXJyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9FQ1JfT0ZGU0VUKSAmIFhDQU5fRUNSX1RFQ19NQVNLOworCWJlYy0+cnhlcnIgPSAoKHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fRUNSX09GRlNFVCkgJgorCQkJWENBTl9FQ1JfUkVDX01BU0spID4+IFhDQU5fRVNSX1JFQ19TSElGVCk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNhbl9jbGspOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNhbl9jbGspOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4Y2FuX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0geGNhbl9vcGVuLAorCS5uZG9fc3RvcAk9IHhjYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0CT0geGNhbl9zdGFydF94bWl0LAorfTsKKworLyoqCisgKiB4Y2FuX3N1c3BlbmQgLSBTdXNwZW5kIG1ldGhvZCBmb3IgdGhlIGRyaXZlcgorICogQGRldjoJQWRkcmVzcyBvZiB0aGUgcGxhdGZvcm1fZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFB1dCB0aGUgZHJpdmVyIGludG8gbG93IHBvd2VyIG1vZGUuCisgKiBSZXR1cm46IDAgYWx3YXlzCisgKi8KK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgeGNhbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOworCX0KKworCXByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX01TUl9PRkZTRVQsIFhDQU5fTVNSX1NMRUVQX01BU0spOworCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9TTEVFUElORzsKKworCWNsa19kaXNhYmxlKHByaXYtPmJ1c19jbGspOworCWNsa19kaXNhYmxlKHByaXYtPmNhbl9jbGspOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGNhbl9yZXN1bWUgLSBSZXN1bWUgZnJvbSBzdXNwZW5kCisgKiBAZGV2OglBZGRyZXNzIG9mIHRoZSBwbGF0Zm9ybWRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXN1bWUgb3BlcmF0aW9uIGFmdGVyIHN1c3BlbmQuCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZmFpbHVyZSB2YWx1ZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHhjYW5fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19lbmFibGUocHJpdi0+YnVzX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBlbmFibGUgY2xvY2suXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gY2xrX2VuYWJsZShwcml2LT5jYW5fY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGVuYWJsZSBjbG9jay5cbiIpOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fTVNSX09GRlNFVCwgMCk7CisJcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwgWENBTl9TUlJfQ0VOX01BU0spOworCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHhjYW5fZGV2X3BtX29wcywgeGNhbl9zdXNwZW5kLCB4Y2FuX3Jlc3VtZSk7CisKKy8qKgorICogeGNhbl9wcm9iZSAtIFBsYXRmb3JtIHJlZ2lzdHJhdGlvbiBjYWxsCisgKiBAcGRldjoJSGFuZGxlIHRvIHRoZSBwbGF0Zm9ybSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIENBTgorICogZGV2aWNlLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlIHZhbHVlIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgeGNhbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOyAvKiBJTyBtZW0gcmVzb3VyY2VzICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IHhjYW5fcHJpdiAqcHJpdjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IHJldCwgcnhfbWF4LCB0eF9tYXg7CisKKwkvKiBHZXQgdGhlIHZpcnR1YWwgYmFzZSBhZGRyZXNzIGZvciB0aGUgZGV2aWNlICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlhZGRyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihhZGRyKSkgeworCQlyZXQgPSBQVFJfRVJSKGFkZHIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInR4LWZpZm8tZGVwdGgiLCAmdHhfbWF4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInJ4LWZpZm8tZGVwdGgiLCAmcnhfbWF4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwkvKiBDcmVhdGUgYSBDQU4gZGV2aWNlIGluc3RhbmNlICovCisJbmRldiA9IGFsbG9jX2NhbmRldihzaXplb2Yoc3RydWN0IHhjYW5fcHJpdiksIHR4X21heCk7CisJaWYgKCFuZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlwcml2LT5kZXYgPSBuZGV2OworCXByaXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmeGNhbl9iaXR0aW1pbmdfY29uc3Q7CisJcHJpdi0+Y2FuLmRvX3NldF9tb2RlID0geGNhbl9kb19zZXRfbW9kZTsKKwlwcml2LT5jYW4uZG9fZ2V0X2JlcnJfY291bnRlciA9IHhjYW5fZ2V0X2JlcnJfY291bnRlcjsKKwlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkID0gQ0FOX0NUUkxNT0RFX0xPT1BCQUNLIHwKKwkJCQkJQ0FOX0NUUkxNT0RFX0JFUlJfUkVQT1JUSU5HOworCXByaXYtPnJlZ19iYXNlID0gYWRkcjsKKwlwcml2LT50eF9tYXggPSB0eF9tYXg7CisKKwkvKiBHZXQgSVJRIGZvciB0aGUgZGV2aWNlICovCisJbmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwluZGV2LT5mbGFncyB8PSBJRkZfRUNITzsJLyogV2Ugc3VwcG9ydCBsb2NhbCBlY2hvICovCisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKwluZGV2LT5uZXRkZXZfb3BzID0gJnhjYW5fbmV0ZGV2X29wczsKKworCS8qIEdldHRpbmcgdGhlIENBTiBjYW5fY2xrIGluZm8gKi8KKwlwcml2LT5jYW5fY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJjYW5fY2xrIik7CisJaWYgKElTX0VSUihwcml2LT5jYW5fY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2UgY2xvY2sgbm90IGZvdW5kLlxuIik7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+Y2FuX2Nsayk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCS8qIENoZWNrIGZvciB0eXBlIG9mIENBTiBkZXZpY2UgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICAgICJ4bG54LHp5bnEtY2FuLTEuMCIpKSB7CisJCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKKwkJaWYgKElTX0VSUihwcml2LT5idXNfY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiYnVzIGNsb2NrIG5vdCBmb3VuZFxuIik7CisJCQlyZXQgPSBQVFJfRVJSKHByaXYtPmJ1c19jbGspOworCQkJZ290byBlcnJfZnJlZTsKKwkJfQorCX0gZWxzZSB7CisJCXByaXYtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInNfYXhpX2FjbGsiKTsKKwkJaWYgKElTX0VSUihwcml2LT5idXNfY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiYnVzIGNsb2NrIG5vdCBmb3VuZFxuIik7CisJCQlyZXQgPSBQVFJfRVJSKHByaXYtPmJ1c19jbGspOworCQkJZ290byBlcnJfZnJlZTsKKwkJfQorCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jYW5fY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBlbmFibGUgZGV2aWNlIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YnVzX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZW5hYmxlIGJ1cyBjbG9ja1xuIik7CisJCWdvdG8gZXJyX3VucHJlcGFyZV9kaXNhYmxlX2RldjsKKwl9CisKKwlwcml2LT53cml0ZV9yZWcgPSB4Y2FuX3dyaXRlX3JlZ19sZTsKKwlwcml2LT5yZWFkX3JlZyA9IHhjYW5fcmVhZF9yZWdfbGU7CisKKwlpZiAocHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9TUl9PRkZTRVQpICE9IFhDQU5fU1JfQ09ORklHX01BU0spIHsKKwkJcHJpdi0+d3JpdGVfcmVnID0geGNhbl93cml0ZV9yZWdfYmU7CisJCXByaXYtPnJlYWRfcmVnID0geGNhbl9yZWFkX3JlZ19iZTsKKwl9CisKKwlwcml2LT5jYW4uY2xvY2suZnJlcSA9IGNsa19nZXRfcmF0ZShwcml2LT5jYW5fY2xrKTsKKworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpLCB4Y2FuX3J4X3BvbGwsIHJ4X21heCk7CisKKwlyZXQgPSByZWdpc3Rlcl9jYW5kZXYobmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsIHRvIHJlZ2lzdGVyIGZhaWxlZCAoZXJyPSVkKVxuIiwgcmV0KTsKKwkJZ290byBlcnJfdW5wcmVwYXJlX2Rpc2FibGVfYnVzY2xrOworCX0KKworCWRldm1fY2FuX2xlZF9pbml0KG5kZXYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5idXNfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2FuX2Nsayk7CisJbmV0ZGV2X2RiZyhuZGV2LCAicmVnX2Jhc2U9MHglcCBpcnE9JWQgY2xvY2s9JWQsIHR4IGZpZm8gZGVwdGg6JWRcbiIsCisJCQlwcml2LT5yZWdfYmFzZSwgbmRldi0+aXJxLCBwcml2LT5jYW4uY2xvY2suZnJlcSwKKwkJCXByaXYtPnR4X21heCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3VucHJlcGFyZV9kaXNhYmxlX2J1c2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YnVzX2Nsayk7CitlcnJfdW5wcmVwYXJlX2Rpc2FibGVfZGV2OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jYW5fY2xrKTsKK2Vycl9mcmVlOgorCWZyZWVfY2FuZGV2KG5kZXYpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogeGNhbl9yZW1vdmUgLSBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UgYWZ0ZXIgcmVsZWFzaW5nIHRoZSByZXNvdXJjZXMKKyAqIEBwZGV2OglIYW5kbGUgdG8gdGhlIHBsYXRmb3JtIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byB0aGUgZGV2aWNlLgorICogUmV0dXJuOiAwIGFsd2F5cworICovCitzdGF0aWMgaW50IHhjYW5fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAoc2V0X3Jlc2V0X21vZGUobmRldikgPCAwKQorCQluZXRkZXZfZXJyKG5kZXYsICJtb2RlIHJlc2V0dGluZyBmYWlsZWQhXG4iKTsKKworCXVucmVnaXN0ZXJfY2FuZGV2KG5kZXYpOworCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKKwlmcmVlX2NhbmRldihuZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBNYXRjaCB0YWJsZSBmb3IgT0YgcGxhdGZvcm0gYmluZGluZyAqLworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgeGNhbl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCx6eW5xLWNhbi0xLjAiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAieGxueCxheGktY2FuLTEuMDAuYSIsIH0sCisJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHhjYW5fb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Y2FuX2RyaXZlciA9IHsKKwkucHJvYmUgPSB4Y2FuX3Byb2JlLAorCS5yZW1vdmUJPSB4Y2FuX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLnBtID0gJnhjYW5fZGV2X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlCT0geGNhbl9vZl9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4Y2FuX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlhpbGlueCBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IENBTiBpbnRlcmZhY2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYwppbmRleCA0MWVlNWI2Li42OWM0MjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTIzXzYxXzY1LmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjEyM182MV82NS5jCkBAIC0yODksNyArMjg5LDcgQEAKIAogc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTMxLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTMxLmMKaW5kZXggZGFkZmFmYi4uOTUzYmM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjEzMS5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMzEuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2MTMxX3NldHVwX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CiAJaW50IGFkZHIgPSBSRUdfUE9SVChwKTsKIAl1MTYgdmFsOwogCkBAIC0yNzQsNyArMjc0LDcgQEAKIAogc3RhdGljIGludCBtdjg4ZTYxMzFfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmMKaW5kZXggMTczMTRlZC4uOWNlMjE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHguYwpAQCAtNzQsNyArNzQsNyBAQAogCiBpbnQgbXY4OGU2eHh4X3JlZ19yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWcpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9ICh2b2lkICopKGRzICsgMSk7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZwcy0+c21pX211dGV4KTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiBpbnQgbXY4OGU2eHh4X3JlZ193cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CkBAIC0yNTYsNyArMjU2LDcgQEAKIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmcHMtPnBwdV9tdXRleCk7CkBAIC0yODMsNyArMjgzLDcgQEAKIAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BwdV9hY2Nlc3NfcHV0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CiAKIAkvKiBTY2hlZHVsZSBhIHRpbWVyIHRvIHJlLWVuYWJsZSB0aGUgUEhZIHBvbGxpbmcgdW5pdC4gKi8KIAltb2RfdGltZXIoJnBzLT5wcHVfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKSk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAogdm9pZCBtdjg4ZTZ4eHhfcHB1X3N0YXRlX2luaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAogCW11dGV4X2luaXQoJnBzLT5wcHVfbXV0ZXgpOwogCUlOSVRfV09SSygmcHMtPnBwdV93b3JrLCBtdjg4ZTZ4eHhfcHB1X3JlZW5hYmxlX3dvcmspOwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQkJIGludCBucl9zdGF0cywgc3RydWN0IG12ODhlNnh4eF9od19zdGF0ICpzdGF0cywKIAkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgcmV0OwogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTA5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTA5LmMKaW5kZXggMzVkZjBiOS4uYTk2ODY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1MDkuYwpAQCAtNTM0LDcgKzUzNCw3IEBACiAJLyogVGhlIEVMMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZldGh0b29sX29wczsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1ODlfY3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1ODlfY3MuYwppbmRleCAwNjM1NTdlLi5mMTg2NDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU4OV9jcy5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlkZXYtPm5ldGRldl9vcHMgPSAmZWwzX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKIAogCXJldHVybiB0YzU4OV9jb25maWcobGluayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tL3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCmluZGV4IDQ2NWNjNzEuLmUxM2IwNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCkBAIC0yNDM1LDcgKzI0MzUsNyBAQAogCW5ldGlmX25hcGlfYWRkKGRldiwgJnRwLT5uYXBpLCB0eXBob29uX3BvbGwsIDE2KTsKIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKIAotCVNFVF9FVEhUT09MX09QUyhkZXYsICZ0eXBob29uX2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnR5cGhvb25fZXRodG9vbF9vcHM7CiAKIAkvKiBXZSBjYW4gaGFuZGxlIHNjYXR0ZXIgZ2F0aGVyLCB1cCB0byAxNiBlbnRyaWVzLCBhbmQKIAkgKiB3ZSBjYW4gZG8gSVAgY2hlY2tzdW1taW5nIChvbmx5IHZlcnNpb24gNCwgZG9oLi4uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9heDg4Nzk2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYwppbmRleCA0NTVkNGMzLi4xZDE2MmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIAkvKiBUaGlzIGNoZWNrIF9zaG91bGRfbm90XyBiZSBuZWNlc3NhcnksIG9taXQgZXZlbnR1YWxseS4gKi8KIAl3aGlsZSAoKGVpX2luYihhZGRyICsgRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkgewotCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyICogSFogLyAxMDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcmVzZXRfc3RhcnRfdGltZSArIDIgKiBIWiAvIDEwMCkpIHsKIAkJCW5ldGRldl93YXJuKGRldiwgIiVzOiBkaWQgbm90IGNvbXBsZXRlLlxuIiwgX19mdW5jX18pOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI5Myw3ICsyOTMsNyBAQAogCWRtYV9zdGFydCA9IGppZmZpZXM7CiAKIAl3aGlsZSAoKGVpX2luYihuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKSB7Ci0JCWlmIChqaWZmaWVzIC0gZG1hX3N0YXJ0ID4gMiAqIEhaIC8gMTAwKSB7CQkvKiAyMG1zICovCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRtYV9zdGFydCArIDIgKiBIWiAvIDEwMCkpIHsgLyogMjBtcyAqLwogCQkJbmV0ZGV2X3dhcm4oZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iKTsKIAkJCWF4X3Jlc2V0XzgzOTAoZGV2KTsKIAkJCWF4X05TODM5MF9pbml0KGRldiwgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZwppbmRleCAwNTEzNDk0Li5lZGI3MTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKQEAgLTY4LDYgKzY4LDcgQEAKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvZnVqaXRzdS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvaHAvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCmluZGV4IDM1MTkwZTMuLjU4ZGUzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCkBAIC0zMSw2ICszMSw3IEBACiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9GQVJBREFZKSArPSBmYXJhZGF5Lwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfRlJFRVNDQUxFKSArPSBmcmVlc2NhbGUvCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9GVUpJVFNVKSArPSBmdWppdHN1Lworb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfSElTSUxJQ09OKSArPSBoaXNpbGljb24vCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9IUCkgKz0gaHAvCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9JQk0pICs9IGlibS8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0lOVEVMKSArPSBpbnRlbC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYwppbmRleCAxNzFkNzNjLi40MGRiYmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jCkBAIC03ODQsNyArNzg0LDcgQEAKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZldGh0b29sX29wczsKIAogCW5ldGlmX25hcGlfYWRkKGRldiwgJm5wLT5uYXBpLCBuZXRkZXZfcG9sbCwgbWF4X2ludGVycnVwdF93b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZW9uL2FjZW5pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZW9uL2FjZW5pYy5jCmluZGV4IDE1MTdlOWRmLi45YTY5OTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlb24vYWNlbmljLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZW9uL2FjZW5pYy5jCkBAIC00NzYsNyArNDc2LDcgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZhY2VfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYWNlX2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmFjZV9ldGh0b29sX29wczsKIAogCS8qIHdlIG9ubHkgZGlzcGxheSB0aGlzIHN0cmluZyBPTkNFICovCiAJaWYgKCFib2FyZHNfZm91bmQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlcmEvYWx0ZXJhX3NnZG1hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlcmEvYWx0ZXJhX3NnZG1hLmMKaW5kZXggOTljYzU2Zi4uNTgwNTUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL2FsdGVyYV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FsdGVyYS9hbHRlcmFfc2dkbWEuYwpAQCAtMzUzLDcgKzM1Myw2IEBACiAKIAlzdHJ1Y3Qgc2dkbWFfZGVzY3JpcCBfX2lvbWVtICpjZGVzYyA9ICZkZXNjYmFzZVswXTsKIAlzdHJ1Y3Qgc2dkbWFfZGVzY3JpcCBfX2lvbWVtICpuZGVzYyA9ICZkZXNjYmFzZVsxXTsKLQogCXN0cnVjdCB0c2VfYnVmZmVyICpyeGJ1ZmZlciA9IE5VTEw7CiAKIAlpZiAoIXNnZG1hX3J4YnVzeShwcml2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL2FsdGVyYV90c2VfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL2FsdGVyYV90c2VfZXRodG9vbC5jCmluZGV4IDU0YzI1ZWYuLmJlNzJlMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FsdGVyYS9hbHRlcmFfdHNlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlcmEvYWx0ZXJhX3RzZV9ldGh0b29sLmMKQEAgLTI3MSw1ICsyNzEsNSBAQAogCiB2b2lkIGFsdGVyYV90c2Vfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnRzZV9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZ0c2VfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9LY29uZmlnCmluZGV4IDU2MmRmNDYuLmJiYWYzNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9LY29uZmlnCkBAIC03LDcgKzcsNyBAQAogCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gRElPIHx8IE1BQ0hfREVDU1RBVElPTiB8fCBNVk1FMTQ3IHx8IEFUQVJJIHx8IFNVTjMgfHwgXAogCQkgICBTVU4zWCB8fCBTQlVTIHx8IFBDSSB8fCBaT1JSTyB8fCAoSVNBICYmIElTQV9ETUFfQVBJKSB8fCBcCi0JCSAgIChBUk0gJiYgQVJDSF9FQlNBMTEwKSB8fCBJU0EgfHwgRUlTQSB8fCBQQ01DSUEKKwkJICAgKEFSTSAmJiBBUkNIX0VCU0ExMTApIHx8IElTQSB8fCBFSVNBIHx8IFBDTUNJQSB8fCBBUk02NAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNoaXBzZXQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsCiAJICBzYXkgWS4KQEAgLTE3Nyw0ICsxNzcsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHN1bmxhbmNlLgogCitjb25maWcgQU1EX1hHQkUKKwl0cmlzdGF0ZSAiQU1EIDEwR2JFIEV0aGVybmV0IGRyaXZlciIKKwlkZXBlbmRzIG9uIE9GX05FVAorCXNlbGVjdCBQSFlMSUIKKwlzZWxlY3QgQU1EX1hHQkVfUEhZCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFNRCAxMEdiRSBFdGhlcm5ldCBkZXZpY2UgZm91bmQgb24gYW4KKwkgIEFNRCBTb0MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFtZC14Z2JlLgorCiBlbmRpZiAjIE5FVF9WRU5ET1JfQU1ECmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvTWFrZWZpbGUKaW5kZXggY2RkNDMwMS4uYTM4YTJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9NYWtlZmlsZQpAQCAtMTcsMyArMTcsNCBAQAogb2JqLSQoQ09ORklHX1BDTkVUMzIpICs9IHBjbmV0MzIubwogb2JqLSQoQ09ORklHX1NVTjNMQU5DRSkgKz0gc3VuM2xhbmNlLm8KIG9iai0kKENPTkZJR19TVU5MQU5DRSkgKz0gc3VubGFuY2Uubworb2JqLSQoQ09ORklHX0FNRF9YR0JFKSArPSB4Z2JlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwppbmRleCAyNmVmYWFhLi4wNjhkYzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwpAQCAtMTkwMCw3ICsxOTAwLDcgQEAKIAogCS8qIEluaXRpYWxpemUgZHJpdmVyIGVudHJ5IHBvaW50cyAqLwogCWRldi0+bmV0ZGV2X29wcyA9ICZhbWQ4MTExZV9uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCWRldi0+aXJxID1wZGV2LT5pcnE7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEFNRDgxMTFFX1RYX1RJTUVPVVQ7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmbHAtPm5hcGksIGFtZDgxMTFlX3J4X3BvbGwsIDMyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hcmlhZG5lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXJpYWRuZS5jCmluZGV4IGIwODEwMWIuLjk2OGI3YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hcmlhZG5lLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FyaWFkbmUuYwpAQCAtNzE4LDcgKzcxOCw2IEBACiAJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBib2FyZCArIEFSSUFETkVfUkFNOwogCXN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CiAJdTMyIHNlcmlhbDsKIAlpbnQgZXJyOwogCkBAIC03MzgsOCArNzM3LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlyMS0+bmFtZSA9IGRldi0+bmFtZTsKIAlyMi0+bmFtZSA9IGRldi0+bmFtZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmMKaW5kZXggYTJiZDkxZS4uYTc4ZTRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jCkBAIC0xMjI5LDcgKzEyMjksNyBAQAogCWRldi0+YmFzZV9hZGRyID0gYmFzZS0+c3RhcnQ7CiAJZGV2LT5pcnEgPSBpcnE7CiAJZGV2LT5uZXRkZXZfb3BzID0gJmF1MTAwMF9uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZhdTEwMDBfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmYXUxMDAwX2V0aHRvb2xfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBFVEhfVFhfVElNRU9VVDsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvaHBsYW5jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2hwbGFuY2UuYwppbmRleCA0N2NlNTdjLi42YzlkZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvaHBsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9ocGxhbmNlLmMKQEAgLTI3LDkgKzI3LDkgQEAKIAogI2luY2x1ZGUgImhwbGFuY2UuaCIKIAotLyogV2UgaGF2ZSAxNjgzNCBieXRlcyBvZiBSQU0gZm9yIHRoZSBpbml0IGJsb2NrIGFuZCBidWZmZXJzLiBUaGlzIHBsYWNlcworLyogV2UgaGF2ZSAxNjM5MiBieXRlcyBvZiBSQU0gZm9yIHRoZSBpbml0IGJsb2NrIGFuZCBidWZmZXJzLiBUaGlzIHBsYWNlcwogICogYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBidWZmZXJzIHdlIGNhbiB1c2UuIE5ldEJTRCB1c2VzIDggUngKLSAqIGJ1ZmZlcnMgYW5kIDIgVHggYnVmZmVycy4KKyAqIGJ1ZmZlcnMgYW5kIDIgVHggYnVmZmVycywgaXQgdGFrZXMgKDggKyAyKSAqIDE1NDQgYnl0ZXMuCiAgKi8KICNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMgMQogI2RlZmluZSBMQU5DRV9MT0dfUlhfQlVGRkVSUyAzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvbXZtZTE0Ny5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL212bWUxNDcuYwppbmRleCAwZTgzOTlkLi4wNjYwYWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvbXZtZTE0Ny5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9tdm1lMTQ3LmMKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9tdm1lMTQ3aHcuaD4KIAotLyogV2UgaGF2ZSAxNjgzNCBieXRlcyBvZiBSQU0gZm9yIHRoZSBpbml0IGJsb2NrIGFuZCBidWZmZXJzLiBUaGlzIHBsYWNlcworLyogV2UgaGF2ZSAzMksgb2YgUkFNIGZvciB0aGUgaW5pdCBibG9jayBhbmQgYnVmZmVycy4gVGhpcyBwbGFjZXMKICAqIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYnVmZmVycyB3ZSBjYW4gdXNlLiBOZXRCU0QgdXNlcyA4IFJ4Ci0gKiBidWZmZXJzIGFuZCAyIFR4IGJ1ZmZlcnMuCisgKiBidWZmZXJzIGFuZCAyIFR4IGJ1ZmZlcnMsIGl0IHRha2VzICg4ICsgMikgKiAxNTQ0IGJ5dGVzLgogICovCiAjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDEKICNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgMwpAQCAtMTExLDcgKzExMSw3IEBACiAJICAgICAgIGRldi0+ZGV2X2FkZHIpOwogCiAJbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWxwLT5yYW0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0FUT01JQywgMyk7CS8qIDE2SyAqLworCWxwLT5yYW0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0FUT01JQywgMyk7CS8qIDMySyAqLwogCWlmICghbHAtPnJhbSkgewogCQlwcmludGsoIiVzOiBObyBtZW1vcnkgZm9yIExBTkNFIGJ1ZmZlcnNcbiIsIGRldi0+bmFtZSk7CiAJCWZyZWVfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvbm1jbGFuX2NzLmMKaW5kZXggMDg1NjlmZS4uYWJmM2IxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9ubWNsYW5fY3MuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAgICAgbHAtPnR4X2ZyZWVfZnJhbWVzPUFNMjE1MF9NQVhfVFhfRlJBTUVTOwogCiAgICAgZGV2LT5uZXRkZXZfb3BzID0gJm1hY2VfbmV0ZGV2X29wczsKLSAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKyAgICBkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKICAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogICAgIHJldHVybiBubWNsYW5fY29uZmlnKGxpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNmOWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitvYmotJChDT05GSUdfQU1EX1hHQkUpICs9IGFtZC14Z2JlLm8KKworYW1kLXhnYmUtb2JqcyA6PSB4Z2JlLW1haW4ubyB4Z2JlLWRydi5vIHhnYmUtZGV2Lm8gXAorCQkgeGdiZS1kZXNjLm8geGdiZS1ldGh0b29sLm8geGdiZS1tZGlvLm8KKworYW1kLXhnYmUtJChDT05GSUdfREVCVUdfRlMpICs9IHhnYmUtZGVidWdmcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWNvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQ2MmVlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtY29tbW9uLmgKQEAgLTAsMCArMSwxMDA3IEBACisvKgorICogQU1EIDEwR2IgRXRoZXJuZXQgZHJpdmVyCisgKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIGZvbGxvd2luZyB0d28KKyAqIGxpY2Vuc2VzOgorICoKKyAqIExpY2Vuc2UgMTogR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IGNvcHksIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogTGljZW5zZSAyOiBNb2RpZmllZCBCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19YR0JFX0NPTU1PTl9IX18KKyNkZWZpbmUgX19YR0JFX0NPTU1PTl9IX18KKworLyogRE1BIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX01SCQkJCTB4MzAwMAorI2RlZmluZSBETUFfU0JNUgkJCTB4MzAwNAorI2RlZmluZSBETUFfSVNSCQkJCTB4MzAwOAorI2RlZmluZSBETUFfQVhJQVJDUgkJCTB4MzAxMAorI2RlZmluZSBETUFfQVhJQVdDUgkJCTB4MzAxOAorI2RlZmluZSBETUFfRFNSMAkJCTB4MzAyMAorI2RlZmluZSBETUFfRFNSMQkJCTB4MzAyNAorI2RlZmluZSBETUFfRFNSMgkJCTB4MzAyOAorI2RlZmluZSBETUFfRFNSMwkJCTB4MzAyYworI2RlZmluZSBETUFfRFNSNAkJCTB4MzAzMAorCisvKiBETUEgcmVnaXN0ZXIgZW50cnkgYml0IHBvc2l0aW9ucyBhbmQgc2l6ZXMgKi8KKyNkZWZpbmUgRE1BX0FYSUFSQ1JfRFJDX0lOREVYCQkwCisjZGVmaW5lIERNQV9BWElBUkNSX0RSQ19XSURUSAkJNAorI2RlZmluZSBETUFfQVhJQVJDUl9EUkRfSU5ERVgJCTQKKyNkZWZpbmUgRE1BX0FYSUFSQ1JfRFJEX1dJRFRICQkyCisjZGVmaW5lIERNQV9BWElBUkNSX1RFQ19JTkRFWAkJOAorI2RlZmluZSBETUFfQVhJQVJDUl9URUNfV0lEVEgJCTQKKyNkZWZpbmUgRE1BX0FYSUFSQ1JfVEVEX0lOREVYCQkxMgorI2RlZmluZSBETUFfQVhJQVJDUl9URURfV0lEVEgJCTIKKyNkZWZpbmUgRE1BX0FYSUFSQ1JfVEhDX0lOREVYCQkxNgorI2RlZmluZSBETUFfQVhJQVJDUl9USENfV0lEVEgJCTQKKyNkZWZpbmUgRE1BX0FYSUFSQ1JfVEhEX0lOREVYCQkyMAorI2RlZmluZSBETUFfQVhJQVJDUl9USERfV0lEVEgJCTIKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfRFdDX0lOREVYCQkwCisjZGVmaW5lIERNQV9BWElBV0NSX0RXQ19XSURUSAkJNAorI2RlZmluZSBETUFfQVhJQVdDUl9EV0RfSU5ERVgJCTQKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfRFdEX1dJRFRICQkyCisjZGVmaW5lIERNQV9BWElBV0NSX1JQQ19JTkRFWAkJOAorI2RlZmluZSBETUFfQVhJQVdDUl9SUENfV0lEVEgJCTQKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfUlBEX0lOREVYCQkxMgorI2RlZmluZSBETUFfQVhJQVdDUl9SUERfV0lEVEgJCTIKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfUkhDX0lOREVYCQkxNgorI2RlZmluZSBETUFfQVhJQVdDUl9SSENfV0lEVEgJCTQKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfUkhEX0lOREVYCQkyMAorI2RlZmluZSBETUFfQVhJQVdDUl9SSERfV0lEVEgJCTIKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfVERDX0lOREVYCQkyNAorI2RlZmluZSBETUFfQVhJQVdDUl9URENfV0lEVEgJCTQKKyNkZWZpbmUgRE1BX0FYSUFXQ1JfVEREX0lOREVYCQkyOAorI2RlZmluZSBETUFfQVhJQVdDUl9URERfV0lEVEgJCTIKKyNkZWZpbmUgRE1BX0RTUjBfUlBTX0lOREVYCQk4CisjZGVmaW5lIERNQV9EU1IwX1JQU19XSURUSAkJNAorI2RlZmluZSBETUFfRFNSMF9UUFNfSU5ERVgJCTEyCisjZGVmaW5lIERNQV9EU1IwX1RQU19XSURUSAkJNAorI2RlZmluZSBETUFfSVNSX01BQ0lTX0lOREVYCQkxNworI2RlZmluZSBETUFfSVNSX01BQ0lTX1dJRFRICQkxCisjZGVmaW5lIERNQV9JU1JfTVRMSVNfSU5ERVgJCTE2CisjZGVmaW5lIERNQV9JU1JfTVRMSVNfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX01SX1NXUl9JTkRFWAkJMAorI2RlZmluZSBETUFfTVJfU1dSX1dJRFRICQkxCisjZGVmaW5lIERNQV9TQk1SX0VBTUVfSU5ERVgJCTExCisjZGVmaW5lIERNQV9TQk1SX0VBTUVfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX1NCTVJfVU5ERUZfSU5ERVgJCTAKKyNkZWZpbmUgRE1BX1NCTVJfVU5ERUZfV0lEVEgJCTEKKworLyogRE1BIGNoYW5uZWwgcmVnaXN0ZXIgb2Zmc2V0cworICogICBNdWx0aXBsZSBjaGFubmVscyBjYW4gYmUgYWN0aXZlLiAgVGhlIGZpcnN0IGNoYW5uZWwgaGFzIHJlZ2lzdGVycworICogICB0aGF0IGJlZ2luIGF0IDB4MzEwMC4gIEVhY2ggc3Vic2VxdWVudCBjaGFubmVsIGhhcyByZWdpc3RlcnMgdGhhdAorICogICBhcmUgYWNjZXNzZWQgdXNpbmcgYW4gb2Zmc2V0IG9mIDB4ODAgZnJvbSB0aGUgcHJldmlvdXMgY2hhbm5lbC4KKyAqLworI2RlZmluZSBETUFfQ0hfQkFTRQkJCTB4MzEwMAorI2RlZmluZSBETUFfQ0hfSU5DCQkJMHg4MAorCisjZGVmaW5lIERNQV9DSF9DUgkJCTB4MDAKKyNkZWZpbmUgRE1BX0NIX1RDUgkJCTB4MDQKKyNkZWZpbmUgRE1BX0NIX1JDUgkJCTB4MDgKKyNkZWZpbmUgRE1BX0NIX1RETFJfSEkJCQkweDEwCisjZGVmaW5lIERNQV9DSF9URExSX0xPCQkJMHgxNAorI2RlZmluZSBETUFfQ0hfUkRMUl9ISQkJCTB4MTgKKyNkZWZpbmUgRE1BX0NIX1JETFJfTE8JCQkweDFjCisjZGVmaW5lIERNQV9DSF9URFRSX0xPCQkJMHgyNAorI2RlZmluZSBETUFfQ0hfUkRUUl9MTwkJCTB4MmMKKyNkZWZpbmUgRE1BX0NIX1REUkxSCQkJMHgzMAorI2RlZmluZSBETUFfQ0hfUkRSTFIJCQkweDM0CisjZGVmaW5lIERNQV9DSF9JRVIJCQkweDM4CisjZGVmaW5lIERNQV9DSF9SSVdUCQkJMHgzYworI2RlZmluZSBETUFfQ0hfQ0FURFJfTE8JCQkweDQ0CisjZGVmaW5lIERNQV9DSF9DQVJEUl9MTwkJCTB4NGMKKyNkZWZpbmUgRE1BX0NIX0NBVEJSX0hJCQkJMHg1MAorI2RlZmluZSBETUFfQ0hfQ0FUQlJfTE8JCQkweDU0CisjZGVmaW5lIERNQV9DSF9DQVJCUl9ISQkJCTB4NTgKKyNkZWZpbmUgRE1BX0NIX0NBUkJSX0xPCQkJMHg1YworI2RlZmluZSBETUFfQ0hfU1IJCQkweDYwCisKKy8qIERNQSBjaGFubmVsIHJlZ2lzdGVyIGVudHJ5IGJpdCBwb3NpdGlvbnMgYW5kIHNpemVzICovCisjZGVmaW5lIERNQV9DSF9DUl9QQkxYOF9JTkRFWAkJMTYKKyNkZWZpbmUgRE1BX0NIX0NSX1BCTFg4X1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9JRVJfQUlFX0lOREVYCQkxNQorI2RlZmluZSBETUFfQ0hfSUVSX0FJRV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX0ZCRUVfSU5ERVgJCTEyCisjZGVmaW5lIERNQV9DSF9JRVJfRkJFRV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX05JRV9JTkRFWAkJMTYKKyNkZWZpbmUgRE1BX0NIX0lFUl9OSUVfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX0NIX0lFUl9SQlVFX0lOREVYCQk3CisjZGVmaW5lIERNQV9DSF9JRVJfUkJVRV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX1JJRV9JTkRFWAkJNgorI2RlZmluZSBETUFfQ0hfSUVSX1JJRV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX1JTRV9JTkRFWAkJOAorI2RlZmluZSBETUFfQ0hfSUVSX1JTRV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX1RCVUVfSU5ERVgJCTIKKyNkZWZpbmUgRE1BX0NIX0lFUl9UQlVFX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9JRVJfVElFX0lOREVYCQkwCisjZGVmaW5lIERNQV9DSF9JRVJfVElFX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9JRVJfVFhTRV9JTkRFWAkJMQorI2RlZmluZSBETUFfQ0hfSUVSX1RYU0VfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX0NIX1JDUl9QQkxfSU5ERVgJCTE2CisjZGVmaW5lIERNQV9DSF9SQ1JfUEJMX1dJRFRICQk2CisjZGVmaW5lIERNQV9DSF9SQ1JfUkJTWl9JTkRFWAkJMQorI2RlZmluZSBETUFfQ0hfUkNSX1JCU1pfV0lEVEgJCTE0CisjZGVmaW5lIERNQV9DSF9SQ1JfU1JfSU5ERVgJCTAKKyNkZWZpbmUgRE1BX0NIX1JDUl9TUl9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfUklXVF9SV1RfSU5ERVgJCTAKKyNkZWZpbmUgRE1BX0NIX1JJV1RfUldUX1dJRFRICQk4CisjZGVmaW5lIERNQV9DSF9TUl9GQkVfSU5ERVgJCTEyCisjZGVmaW5lIERNQV9DSF9TUl9GQkVfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX0NIX1NSX1JCVV9JTkRFWAkJNworI2RlZmluZSBETUFfQ0hfU1JfUkJVX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9TUl9SSV9JTkRFWAkJNgorI2RlZmluZSBETUFfQ0hfU1JfUklfV0lEVEgJCTEKKyNkZWZpbmUgRE1BX0NIX1NSX1JQU19JTkRFWAkJOAorI2RlZmluZSBETUFfQ0hfU1JfUlBTX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9TUl9UQlVfSU5ERVgJCTIKKyNkZWZpbmUgRE1BX0NIX1NSX1RCVV9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfU1JfVElfSU5ERVgJCTAKKyNkZWZpbmUgRE1BX0NIX1NSX1RJX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9TUl9UUFNfSU5ERVgJCTEKKyNkZWZpbmUgRE1BX0NIX1NSX1RQU19XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfVENSX09TUF9JTkRFWAkJNAorI2RlZmluZSBETUFfQ0hfVENSX09TUF9XSURUSAkJMQorI2RlZmluZSBETUFfQ0hfVENSX1BCTF9JTkRFWAkJMTYKKyNkZWZpbmUgRE1BX0NIX1RDUl9QQkxfV0lEVEgJCTYKKyNkZWZpbmUgRE1BX0NIX1RDUl9TVF9JTkRFWAkJMAorI2RlZmluZSBETUFfQ0hfVENSX1NUX1dJRFRICQkxCisjZGVmaW5lIERNQV9DSF9UQ1JfVFNFX0lOREVYCQkxMgorI2RlZmluZSBETUFfQ0hfVENSX1RTRV9XSURUSAkJMQorCisvKiBETUEgY2hhbm5lbCByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgRE1BX09TUF9ESVNBQkxFCQkJMHgwMAorI2RlZmluZSBETUFfT1NQX0VOQUJMRQkJCTB4MDEKKyNkZWZpbmUgRE1BX1BCTF8xCQkJMQorI2RlZmluZSBETUFfUEJMXzIJCQkyCisjZGVmaW5lIERNQV9QQkxfNAkJCTQKKyNkZWZpbmUgRE1BX1BCTF84CQkJOAorI2RlZmluZSBETUFfUEJMXzE2CQkJMTYKKyNkZWZpbmUgRE1BX1BCTF8zMgkJCTMyCisjZGVmaW5lIERNQV9QQkxfNjQJCQk2NCAgICAgIC8qIDggeCA4ICovCisjZGVmaW5lIERNQV9QQkxfMTI4CQkJMTI4ICAgICAvKiA4IHggMTYgKi8KKyNkZWZpbmUgRE1BX1BCTF8yNTYJCQkyNTYgICAgIC8qIDggeCAzMiAqLworI2RlZmluZSBETUFfUEJMX1g4X0RJU0FCTEUJCTB4MDAKKyNkZWZpbmUgRE1BX1BCTF9YOF9FTkFCTEUJCTB4MDEKKworCisvKiBNQUMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNQUNfVENSCQkJCTB4MDAwMAorI2RlZmluZSBNQUNfUkNSCQkJCTB4MDAwNAorI2RlZmluZSBNQUNfUEZSCQkJCTB4MDAwOAorI2RlZmluZSBNQUNfV1RSCQkJCTB4MDAwYworI2RlZmluZSBNQUNfSFRSMAkJCTB4MDAxMAorI2RlZmluZSBNQUNfSFRSMQkJCTB4MDAxNAorI2RlZmluZSBNQUNfSFRSMgkJCTB4MDAxOAorI2RlZmluZSBNQUNfSFRSMwkJCTB4MDAxYworI2RlZmluZSBNQUNfSFRSNAkJCTB4MDAyMAorI2RlZmluZSBNQUNfSFRSNQkJCTB4MDAyNAorI2RlZmluZSBNQUNfSFRSNgkJCTB4MDAyOAorI2RlZmluZSBNQUNfSFRSNwkJCTB4MDAyYworI2RlZmluZSBNQUNfVkxBTlRSCQkJMHgwMDUwCisjZGVmaW5lIE1BQ19WTEFOSFRSCQkJMHgwMDU4CisjZGVmaW5lIE1BQ19WTEFOSVIJCQkweDAwNjAKKyNkZWZpbmUgTUFDX0lWTEFOSVIJCQkweDAwNjQKKyNkZWZpbmUgTUFDX1JFVE1SCQkJMHgwMDZjCisjZGVmaW5lIE1BQ19RMFRGQ1IJCQkweDAwNzAKKyNkZWZpbmUgTUFDX1JGQ1IJCQkweDAwOTAKKyNkZWZpbmUgTUFDX1JRQzBSCQkJMHgwMGEwCisjZGVmaW5lIE1BQ19SUUMxUgkJCTB4MDBhNAorI2RlZmluZSBNQUNfUlFDMlIJCQkweDAwYTgKKyNkZWZpbmUgTUFDX1JRQzNSCQkJMHgwMGFjCisjZGVmaW5lIE1BQ19JU1IJCQkJMHgwMGIwCisjZGVmaW5lIE1BQ19JRVIJCQkJMHgwMGI0CisjZGVmaW5lIE1BQ19SVFNSCQkJMHgwMGI4CisjZGVmaW5lIE1BQ19QTVRDU1IJCQkweDAwYzAKKyNkZWZpbmUgTUFDX1JXS1BGUgkJCTB4MDBjNAorI2RlZmluZSBNQUNfTFBJQ1NSCQkJMHgwMGQwCisjZGVmaW5lIE1BQ19MUElUQ1IJCQkweDAwZDQKKyNkZWZpbmUgTUFDX1ZSCQkJCTB4MDExMAorI2RlZmluZSBNQUNfRFIJCQkJMHgwMTE0CisjZGVmaW5lIE1BQ19IV0YwUgkJCTB4MDExYworI2RlZmluZSBNQUNfSFdGMVIJCQkweDAxMjAKKyNkZWZpbmUgTUFDX0hXRjJSCQkJMHgwMTI0CisjZGVmaW5lIE1BQ19HUElPQ1IJCQkweDAyNzgKKyNkZWZpbmUgTUFDX0dQSU9TUgkJCTB4MDI3YworI2RlZmluZSBNQUNfTUFDQTBIUgkJCTB4MDMwMAorI2RlZmluZSBNQUNfTUFDQTBMUgkJCTB4MDMwNAorI2RlZmluZSBNQUNfTUFDQTFIUgkJCTB4MDMwOAorI2RlZmluZSBNQUNfTUFDQTFMUgkJCTB4MDMwYworCisjZGVmaW5lIE1BQ19RVEZDUl9JTkMJCQk0CisjZGVmaW5lIE1BQ19NQUNBX0lOQwkJCTQKKworLyogTUFDIHJlZ2lzdGVyIGVudHJ5IGJpdCBwb3NpdGlvbnMgYW5kIHNpemVzICovCisjZGVmaW5lIE1BQ19IV0YwUl9BRERNQUNBRFJTRUxfSU5ERVgJMTgKKyNkZWZpbmUgTUFDX0hXRjBSX0FERE1BQ0FEUlNFTF9XSURUSAk1CisjZGVmaW5lIE1BQ19IV0YwUl9BUlBPRkZTRUxfSU5ERVgJOQorI2RlZmluZSBNQUNfSFdGMFJfQVJQT0ZGU0VMX1dJRFRICTEKKyNkZWZpbmUgTUFDX0hXRjBSX0VFRVNFTF9JTkRFWAkJMTMKKyNkZWZpbmUgTUFDX0hXRjBSX0VFRVNFTF9XSURUSAkJMQorI2RlZmluZSBNQUNfSFdGMFJfR01JSVNFTF9JTkRFWAkJMQorI2RlZmluZSBNQUNfSFdGMFJfR01JSVNFTF9XSURUSAkJMQorI2RlZmluZSBNQUNfSFdGMFJfTUdLU0VMX0lOREVYCQk3CisjZGVmaW5lIE1BQ19IV0YwUl9NR0tTRUxfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX0hXRjBSX01NQ1NFTF9JTkRFWAkJOAorI2RlZmluZSBNQUNfSFdGMFJfTU1DU0VMX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YwUl9SV0tTRUxfSU5ERVgJCTYKKyNkZWZpbmUgTUFDX0hXRjBSX1JXS1NFTF9XSURUSAkJMQorI2RlZmluZSBNQUNfSFdGMFJfUlhDT0VTRUxfSU5ERVgJMTYKKyNkZWZpbmUgTUFDX0hXRjBSX1JYQ09FU0VMX1dJRFRICTEKKyNkZWZpbmUgTUFDX0hXRjBSX1NBVkxBTklOU19JTkRFWAkyNworI2RlZmluZSBNQUNfSFdGMFJfU0FWTEFOSU5TX1dJRFRICTEKKyNkZWZpbmUgTUFDX0hXRjBSX1NNQVNFTF9JTkRFWAkJNQorI2RlZmluZSBNQUNfSFdGMFJfU01BU0VMX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YwUl9UU1NFTF9JTkRFWAkJMTIKKyNkZWZpbmUgTUFDX0hXRjBSX1RTU0VMX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YwUl9UU1NUU1NFTF9JTkRFWAkyNQorI2RlZmluZSBNQUNfSFdGMFJfVFNTVFNTRUxfV0lEVEgJMgorI2RlZmluZSBNQUNfSFdGMFJfVFhDT0VTRUxfSU5ERVgJMTQKKyNkZWZpbmUgTUFDX0hXRjBSX1RYQ09FU0VMX1dJRFRICTEKKyNkZWZpbmUgTUFDX0hXRjBSX1ZMSEFTSF9JTkRFWAkJNAorI2RlZmluZSBNQUNfSFdGMFJfVkxIQVNIX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YxUl9BRFZUSFdPUkRfSU5ERVgJMTMKKyNkZWZpbmUgTUFDX0hXRjFSX0FEVlRIV09SRF9XSURUSAkxCisjZGVmaW5lIE1BQ19IV0YxUl9EQkdNRU1BX0lOREVYCQkxOQorI2RlZmluZSBNQUNfSFdGMVJfREJHTUVNQV9XSURUSAkJMQorI2RlZmluZSBNQUNfSFdGMVJfRENCRU5fSU5ERVgJCTE2CisjZGVmaW5lIE1BQ19IV0YxUl9EQ0JFTl9XSURUSAkJMQorI2RlZmluZSBNQUNfSFdGMVJfSEFTSFRCTFNaX0lOREVYCTI0CisjZGVmaW5lIE1BQ19IV0YxUl9IQVNIVEJMU1pfV0lEVEgJMworI2RlZmluZSBNQUNfSFdGMVJfTDNMNEZOVU1fSU5ERVgJMjcKKyNkZWZpbmUgTUFDX0hXRjFSX0wzTDRGTlVNX1dJRFRICTQKKyNkZWZpbmUgTUFDX0hXRjFSX1JTU0VOX0lOREVYCQkyMAorI2RlZmluZSBNQUNfSFdGMVJfUlNTRU5fV0lEVEgJCTEKKyNkZWZpbmUgTUFDX0hXRjFSX1JYRklGT1NJWkVfSU5ERVgJMAorI2RlZmluZSBNQUNfSFdGMVJfUlhGSUZPU0laRV9XSURUSAk1CisjZGVmaW5lIE1BQ19IV0YxUl9TUEhFTl9JTkRFWAkJMTcKKyNkZWZpbmUgTUFDX0hXRjFSX1NQSEVOX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YxUl9UU09FTl9JTkRFWAkJMTgKKyNkZWZpbmUgTUFDX0hXRjFSX1RTT0VOX1dJRFRICQkxCisjZGVmaW5lIE1BQ19IV0YxUl9UWEZJRk9TSVpFX0lOREVYCTYKKyNkZWZpbmUgTUFDX0hXRjFSX1RYRklGT1NJWkVfV0lEVEgJNQorI2RlZmluZSBNQUNfSFdGMlJfQVVYU05BUE5VTV9JTkRFWAkyOAorI2RlZmluZSBNQUNfSFdGMlJfQVVYU05BUE5VTV9XSURUSAkzCisjZGVmaW5lIE1BQ19IV0YyUl9QUFNPVVROVU1fSU5ERVgJMjQKKyNkZWZpbmUgTUFDX0hXRjJSX1BQU09VVE5VTV9XSURUSAkzCisjZGVmaW5lIE1BQ19IV0YyUl9SWENIQ05UX0lOREVYCQkxMgorI2RlZmluZSBNQUNfSFdGMlJfUlhDSENOVF9XSURUSAkJNAorI2RlZmluZSBNQUNfSFdGMlJfUlhRQ05UX0lOREVYCQkwCisjZGVmaW5lIE1BQ19IV0YyUl9SWFFDTlRfV0lEVEgJCTQKKyNkZWZpbmUgTUFDX0hXRjJSX1RYQ0hDTlRfSU5ERVgJCTE4CisjZGVmaW5lIE1BQ19IV0YyUl9UWENIQ05UX1dJRFRICQk0CisjZGVmaW5lIE1BQ19IV0YyUl9UWFFDTlRfSU5ERVgJCTYKKyNkZWZpbmUgTUFDX0hXRjJSX1RYUUNOVF9XSURUSAkJNAorI2RlZmluZSBNQUNfSVNSX01NQ1JYSVNfSU5ERVgJCTkKKyNkZWZpbmUgTUFDX0lTUl9NTUNSWElTX1dJRFRICQkxCisjZGVmaW5lIE1BQ19JU1JfTU1DVFhJU19JTkRFWAkJMTAKKyNkZWZpbmUgTUFDX0lTUl9NTUNUWElTX1dJRFRICQkxCisjZGVmaW5lIE1BQ19JU1JfUE1USVNfSU5ERVgJCTQKKyNkZWZpbmUgTUFDX0lTUl9QTVRJU19XSURUSAkJMQorI2RlZmluZSBNQUNfTUFDQTFIUl9BRV9JTkRFWAkJMzEKKyNkZWZpbmUgTUFDX01BQ0ExSFJfQUVfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1BGUl9ITUNfSU5ERVgJCTIKKyNkZWZpbmUgTUFDX1BGUl9ITUNfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1BGUl9IVUNfSU5ERVgJCTEKKyNkZWZpbmUgTUFDX1BGUl9IVUNfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1BGUl9QTV9JTkRFWAkJNAorI2RlZmluZSBNQUNfUEZSX1BNX1dJRFRICQkxCisjZGVmaW5lIE1BQ19QRlJfUFJfSU5ERVgJCTAKKyNkZWZpbmUgTUFDX1BGUl9QUl9XSURUSAkJMQorI2RlZmluZSBNQUNfUE1UQ1NSX01HS1BLVEVOX0lOREVYCTEKKyNkZWZpbmUgTUFDX1BNVENTUl9NR0tQS1RFTl9XSURUSAkxCisjZGVmaW5lIE1BQ19QTVRDU1JfUFdSRFdOX0lOREVYCQkwCisjZGVmaW5lIE1BQ19QTVRDU1JfUFdSRFdOX1dJRFRICQkxCisjZGVmaW5lIE1BQ19QTVRDU1JfUldLRklMVFJTVF9JTkRFWAkzMQorI2RlZmluZSBNQUNfUE1UQ1NSX1JXS0ZJTFRSU1RfV0lEVEgJMQorI2RlZmluZSBNQUNfUE1UQ1NSX1JXS1BLVEVOX0lOREVYCTIKKyNkZWZpbmUgTUFDX1BNVENTUl9SV0tQS1RFTl9XSURUSAkxCisjZGVmaW5lIE1BQ19RMFRGQ1JfUFRfSU5ERVgJCTE2CisjZGVmaW5lIE1BQ19RMFRGQ1JfUFRfV0lEVEgJCTE2CisjZGVmaW5lIE1BQ19RMFRGQ1JfVEZFX0lOREVYCQkxCisjZGVmaW5lIE1BQ19RMFRGQ1JfVEZFX1dJRFRICQkxCisjZGVmaW5lIE1BQ19SQ1JfQUNTX0lOREVYCQkxCisjZGVmaW5lIE1BQ19SQ1JfQUNTX1dJRFRICQkxCisjZGVmaW5lIE1BQ19SQ1JfQ1NUX0lOREVYCQkyCisjZGVmaW5lIE1BQ19SQ1JfQ1NUX1dJRFRICQkxCisjZGVmaW5lIE1BQ19SQ1JfRENSQ0NfSU5ERVgJCTMKKyNkZWZpbmUgTUFDX1JDUl9EQ1JDQ19XSURUSAkJMQorI2RlZmluZSBNQUNfUkNSX0lQQ19JTkRFWAkJOQorI2RlZmluZSBNQUNfUkNSX0lQQ19XSURUSAkJMQorI2RlZmluZSBNQUNfUkNSX0pFX0lOREVYCQk4CisjZGVmaW5lIE1BQ19SQ1JfSkVfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1JDUl9MTV9JTkRFWAkJMTAKKyNkZWZpbmUgTUFDX1JDUl9MTV9XSURUSAkJMQorI2RlZmluZSBNQUNfUkNSX1JFX0lOREVYCQkwCisjZGVmaW5lIE1BQ19SQ1JfUkVfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1JGQ1JfUkZFX0lOREVYCQkwCisjZGVmaW5lIE1BQ19SRkNSX1JGRV9XSURUSAkJMQorI2RlZmluZSBNQUNfUlFDMFJfUlhRMEVOX0lOREVYCQkwCisjZGVmaW5lIE1BQ19SUUMwUl9SWFEwRU5fV0lEVEgJCTIKKyNkZWZpbmUgTUFDX1RDUl9TU19JTkRFWAkJMjkKKyNkZWZpbmUgTUFDX1RDUl9TU19XSURUSAkJMgorI2RlZmluZSBNQUNfVENSX1RFX0lOREVYCQkwCisjZGVmaW5lIE1BQ19UQ1JfVEVfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1ZMQU5UUl9ET1ZMVENfSU5ERVgJCTIwCisjZGVmaW5lIE1BQ19WTEFOVFJfRE9WTFRDX1dJRFRICQkxCisjZGVmaW5lIE1BQ19WTEFOVFJfRVJTVkxNX0lOREVYCQkxOQorI2RlZmluZSBNQUNfVkxBTlRSX0VSU1ZMTV9XSURUSAkJMQorI2RlZmluZSBNQUNfVkxBTlRSX0VTVkxfSU5ERVgJCTE4CisjZGVmaW5lIE1BQ19WTEFOVFJfRVNWTF9XSURUSAkJMQorI2RlZmluZSBNQUNfVkxBTlRSX0VWTFNfSU5ERVgJCTIxCisjZGVmaW5lIE1BQ19WTEFOVFJfRVZMU19XSURUSAkJMgorI2RlZmluZSBNQUNfVkxBTlRSX0VWTFJYU19JTkRFWAkJMjQKKyNkZWZpbmUgTUFDX1ZMQU5UUl9FVkxSWFNfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX1ZSX0RFVklEX0lOREVYCQk4CisjZGVmaW5lIE1BQ19WUl9ERVZJRF9XSURUSAkJOAorI2RlZmluZSBNQUNfVlJfU05QU1ZFUl9JTkRFWAkJMAorI2RlZmluZSBNQUNfVlJfU05QU1ZFUl9XSURUSAkJOAorI2RlZmluZSBNQUNfVlJfVVNFUlZFUl9JTkRFWAkJMTYKKyNkZWZpbmUgTUFDX1ZSX1VTRVJWRVJfV0lEVEgJCTgKKworLyogTU1DIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTU1DX0NSCQkJCTB4MDgwMAorI2RlZmluZSBNTUNfUklTUgkJCTB4MDgwNAorI2RlZmluZSBNTUNfVElTUgkJCTB4MDgwOAorI2RlZmluZSBNTUNfUklFUgkJCTB4MDgwYworI2RlZmluZSBNTUNfVElFUgkJCTB4MDgxMAorI2RlZmluZSBNTUNfVFhPQ1RFVENPVU5UX0dCX0xPCQkweDA4MTQKKyNkZWZpbmUgTU1DX1RYT0NURVRDT1VOVF9HQl9ISQkJMHgwODE4CisjZGVmaW5lIE1NQ19UWEZSQU1FQ09VTlRfR0JfTE8JCTB4MDgxYworI2RlZmluZSBNTUNfVFhGUkFNRUNPVU5UX0dCX0hJCQkweDA4MjAKKyNkZWZpbmUgTU1DX1RYQlJPQURDQVNURlJBTUVTX0dfTE8JMHgwODI0CisjZGVmaW5lIE1NQ19UWEJST0FEQ0FTVEZSQU1FU19HX0hJCTB4MDgyOAorI2RlZmluZSBNTUNfVFhNVUxUSUNBU1RGUkFNRVNfR19MTwkweDA4MmMKKyNkZWZpbmUgTU1DX1RYTVVMVElDQVNURlJBTUVTX0dfSEkJMHgwODMwCisjZGVmaW5lIE1NQ19UWDY0T0NURVRTX0dCX0xPCQkweDA4MzQKKyNkZWZpbmUgTU1DX1RYNjRPQ1RFVFNfR0JfSEkJCTB4MDgzOAorI2RlZmluZSBNTUNfVFg2NVRPMTI3T0NURVRTX0dCX0xPCTB4MDgzYworI2RlZmluZSBNTUNfVFg2NVRPMTI3T0NURVRTX0dCX0hJCTB4MDg0MAorI2RlZmluZSBNTUNfVFgxMjhUTzI1NU9DVEVUU19HQl9MTwkweDA4NDQKKyNkZWZpbmUgTU1DX1RYMTI4VE8yNTVPQ1RFVFNfR0JfSEkJMHgwODQ4CisjZGVmaW5lIE1NQ19UWDI1NlRPNTExT0NURVRTX0dCX0xPCTB4MDg0YworI2RlZmluZSBNTUNfVFgyNTZUTzUxMU9DVEVUU19HQl9ISQkweDA4NTAKKyNkZWZpbmUgTU1DX1RYNTEyVE8xMDIzT0NURVRTX0dCX0xPCTB4MDg1NAorI2RlZmluZSBNTUNfVFg1MTJUTzEwMjNPQ1RFVFNfR0JfSEkJMHgwODU4CisjZGVmaW5lIE1NQ19UWDEwMjRUT01BWE9DVEVUU19HQl9MTwkweDA4NWMKKyNkZWZpbmUgTU1DX1RYMTAyNFRPTUFYT0NURVRTX0dCX0hJCTB4MDg2MAorI2RlZmluZSBNTUNfVFhVTklDQVNURlJBTUVTX0dCX0xPCTB4MDg2NAorI2RlZmluZSBNTUNfVFhVTklDQVNURlJBTUVTX0dCX0hJCTB4MDg2OAorI2RlZmluZSBNTUNfVFhNVUxUSUNBU1RGUkFNRVNfR0JfTE8JMHgwODZjCisjZGVmaW5lIE1NQ19UWE1VTFRJQ0FTVEZSQU1FU19HQl9ISQkweDA4NzAKKyNkZWZpbmUgTU1DX1RYQlJPQURDQVNURlJBTUVTX0dCX0xPCTB4MDg3NAorI2RlZmluZSBNTUNfVFhCUk9BRENBU1RGUkFNRVNfR0JfSEkJMHgwODc4CisjZGVmaW5lIE1NQ19UWFVOREVSRkxPV0VSUk9SX0xPCQkweDA4N2MKKyNkZWZpbmUgTU1DX1RYVU5ERVJGTE9XRVJST1JfSEkJCTB4MDg4MAorI2RlZmluZSBNTUNfVFhPQ1RFVENPVU5UX0dfTE8JCTB4MDg4NAorI2RlZmluZSBNTUNfVFhPQ1RFVENPVU5UX0dfSEkJCTB4MDg4OAorI2RlZmluZSBNTUNfVFhGUkFNRUNPVU5UX0dfTE8JCTB4MDg4YworI2RlZmluZSBNTUNfVFhGUkFNRUNPVU5UX0dfSEkJCTB4MDg5MAorI2RlZmluZSBNTUNfVFhQQVVTRUZSQU1FU19MTwkJMHgwODk0CisjZGVmaW5lIE1NQ19UWFBBVVNFRlJBTUVTX0hJCQkweDA4OTgKKyNkZWZpbmUgTU1DX1RYVkxBTkZSQU1FU19HX0xPCQkweDA4OWMKKyNkZWZpbmUgTU1DX1RYVkxBTkZSQU1FU19HX0hJCQkweDA4YTAKKyNkZWZpbmUgTU1DX1JYRlJBTUVDT1VOVF9HQl9MTwkJMHgwOTAwCisjZGVmaW5lIE1NQ19SWEZSQU1FQ09VTlRfR0JfSEkJCTB4MDkwNAorI2RlZmluZSBNTUNfUlhPQ1RFVENPVU5UX0dCX0xPCQkweDA5MDgKKyNkZWZpbmUgTU1DX1JYT0NURVRDT1VOVF9HQl9ISQkJMHgwOTBjCisjZGVmaW5lIE1NQ19SWE9DVEVUQ09VTlRfR19MTwkJMHgwOTEwCisjZGVmaW5lIE1NQ19SWE9DVEVUQ09VTlRfR19ISQkJMHgwOTE0CisjZGVmaW5lIE1NQ19SWEJST0FEQ0FTVEZSQU1FU19HX0xPCTB4MDkxOAorI2RlZmluZSBNTUNfUlhCUk9BRENBU1RGUkFNRVNfR19ISQkweDA5MWMKKyNkZWZpbmUgTU1DX1JYTVVMVElDQVNURlJBTUVTX0dfTE8JMHgwOTIwCisjZGVmaW5lIE1NQ19SWE1VTFRJQ0FTVEZSQU1FU19HX0hJCTB4MDkyNAorI2RlZmluZSBNTUNfUlhDUkNFUlJPUl9MTwkJMHgwOTI4CisjZGVmaW5lIE1NQ19SWENSQ0VSUk9SX0hJCQkweDA5MmMKKyNkZWZpbmUgTU1DX1JYUlVOVEVSUk9SCQkJMHgwOTMwCisjZGVmaW5lIE1NQ19SWEpBQkJFUkVSUk9SCQkweDA5MzQKKyNkZWZpbmUgTU1DX1JYVU5ERVJTSVpFX0cJCTB4MDkzOAorI2RlZmluZSBNTUNfUlhPVkVSU0laRV9HCQkweDA5M2MKKyNkZWZpbmUgTU1DX1JYNjRPQ1RFVFNfR0JfTE8JCTB4MDk0MAorI2RlZmluZSBNTUNfUlg2NE9DVEVUU19HQl9ISQkJMHgwOTQ0CisjZGVmaW5lIE1NQ19SWDY1VE8xMjdPQ1RFVFNfR0JfTE8JMHgwOTQ4CisjZGVmaW5lIE1NQ19SWDY1VE8xMjdPQ1RFVFNfR0JfSEkJMHgwOTRjCisjZGVmaW5lIE1NQ19SWDEyOFRPMjU1T0NURVRTX0dCX0xPCTB4MDk1MAorI2RlZmluZSBNTUNfUlgxMjhUTzI1NU9DVEVUU19HQl9ISQkweDA5NTQKKyNkZWZpbmUgTU1DX1JYMjU2VE81MTFPQ1RFVFNfR0JfTE8JMHgwOTU4CisjZGVmaW5lIE1NQ19SWDI1NlRPNTExT0NURVRTX0dCX0hJCTB4MDk1YworI2RlZmluZSBNTUNfUlg1MTJUTzEwMjNPQ1RFVFNfR0JfTE8JMHgwOTYwCisjZGVmaW5lIE1NQ19SWDUxMlRPMTAyM09DVEVUU19HQl9ISQkweDA5NjQKKyNkZWZpbmUgTU1DX1JYMTAyNFRPTUFYT0NURVRTX0dCX0xPCTB4MDk2OAorI2RlZmluZSBNTUNfUlgxMDI0VE9NQVhPQ1RFVFNfR0JfSEkJMHgwOTZjCisjZGVmaW5lIE1NQ19SWFVOSUNBU1RGUkFNRVNfR19MTwkweDA5NzAKKyNkZWZpbmUgTU1DX1JYVU5JQ0FTVEZSQU1FU19HX0hJCTB4MDk3NAorI2RlZmluZSBNTUNfUlhMRU5HVEhFUlJPUl9MTwkJMHgwOTc4CisjZGVmaW5lIE1NQ19SWExFTkdUSEVSUk9SX0hJCQkweDA5N2MKKyNkZWZpbmUgTU1DX1JYT1VUT0ZSQU5HRVRZUEVfTE8JCTB4MDk4MAorI2RlZmluZSBNTUNfUlhPVVRPRlJBTkdFVFlQRV9ISQkJMHgwOTg0CisjZGVmaW5lIE1NQ19SWFBBVVNFRlJBTUVTX0xPCQkweDA5ODgKKyNkZWZpbmUgTU1DX1JYUEFVU0VGUkFNRVNfSEkJCTB4MDk4YworI2RlZmluZSBNTUNfUlhGSUZPT1ZFUkZMT1dfTE8JCTB4MDk5MAorI2RlZmluZSBNTUNfUlhGSUZPT1ZFUkZMT1dfSEkJCTB4MDk5NAorI2RlZmluZSBNTUNfUlhWTEFORlJBTUVTX0dCX0xPCQkweDA5OTgKKyNkZWZpbmUgTU1DX1JYVkxBTkZSQU1FU19HQl9ISQkJMHgwOTljCisjZGVmaW5lIE1NQ19SWFdBVENIRE9HRVJST1IJCTB4MDlhMAorCisvKiBNTUMgcmVnaXN0ZXIgZW50cnkgYml0IHBvc2l0aW9ucyBhbmQgc2l6ZXMgKi8KKyNkZWZpbmUgTU1DX0NSX0NSX0lOREVYCQkJCTAKKyNkZWZpbmUgTU1DX0NSX0NSX1dJRFRICQkJCTEKKyNkZWZpbmUgTU1DX0NSX0NTUl9JTkRFWAkJCTEKKyNkZWZpbmUgTU1DX0NSX0NTUl9XSURUSAkJCTEKKyNkZWZpbmUgTU1DX0NSX1JPUl9JTkRFWAkJCTIKKyNkZWZpbmUgTU1DX0NSX1JPUl9XSURUSAkJCTEKKyNkZWZpbmUgTU1DX0NSX01DRl9JTkRFWAkJCTMKKyNkZWZpbmUgTU1DX0NSX01DRl9XSURUSAkJCTEKKyNkZWZpbmUgTU1DX0NSX01DVF9JTkRFWAkJCTQKKyNkZWZpbmUgTU1DX0NSX01DVF9XSURUSAkJCTIKKyNkZWZpbmUgTU1DX1JJRVJfQUxMX0lOVEVSUlVQVFNfSU5ERVgJCTAKKyNkZWZpbmUgTU1DX1JJRVJfQUxMX0lOVEVSUlVQVFNfV0lEVEgJCTIzCisjZGVmaW5lIE1NQ19SSVNSX1JYRlJBTUVDT1VOVF9HQl9JTkRFWAkJMAorI2RlZmluZSBNTUNfUklTUl9SWEZSQU1FQ09VTlRfR0JfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhPQ1RFVENPVU5UX0dCX0lOREVYCQkxCisjZGVmaW5lIE1NQ19SSVNSX1JYT0NURVRDT1VOVF9HQl9XSURUSAkJMQorI2RlZmluZSBNTUNfUklTUl9SWE9DVEVUQ09VTlRfR19JTkRFWAkJMgorI2RlZmluZSBNTUNfUklTUl9SWE9DVEVUQ09VTlRfR19XSURUSAkJMQorI2RlZmluZSBNTUNfUklTUl9SWEJST0FEQ0FTVEZSQU1FU19HX0lOREVYCTMKKyNkZWZpbmUgTU1DX1JJU1JfUlhCUk9BRENBU1RGUkFNRVNfR19XSURUSAkxCisjZGVmaW5lIE1NQ19SSVNSX1JYTVVMVElDQVNURlJBTUVTX0dfSU5ERVgJNAorI2RlZmluZSBNTUNfUklTUl9SWE1VTFRJQ0FTVEZSQU1FU19HX1dJRFRICTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhDUkNFUlJPUl9JTkRFWAkJNQorI2RlZmluZSBNTUNfUklTUl9SWENSQ0VSUk9SX1dJRFRICQkxCisjZGVmaW5lIE1NQ19SSVNSX1JYUlVOVEVSUk9SX0lOREVYCQk2CisjZGVmaW5lIE1NQ19SSVNSX1JYUlVOVEVSUk9SX1dJRFRICQkxCisjZGVmaW5lIE1NQ19SSVNSX1JYSkFCQkVSRVJST1JfSU5ERVgJCTcKKyNkZWZpbmUgTU1DX1JJU1JfUlhKQUJCRVJFUlJPUl9XSURUSAkJMQorI2RlZmluZSBNTUNfUklTUl9SWFVOREVSU0laRV9HX0lOREVYCQk4CisjZGVmaW5lIE1NQ19SSVNSX1JYVU5ERVJTSVpFX0dfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhPVkVSU0laRV9HX0lOREVYCQk5CisjZGVmaW5lIE1NQ19SSVNSX1JYT1ZFUlNJWkVfR19XSURUSAkJMQorI2RlZmluZSBNTUNfUklTUl9SWDY0T0NURVRTX0dCX0lOREVYCQkxMAorI2RlZmluZSBNTUNfUklTUl9SWDY0T0NURVRTX0dCX1dJRFRICQkxCisjZGVmaW5lIE1NQ19SSVNSX1JYNjVUTzEyN09DVEVUU19HQl9JTkRFWAkxMQorI2RlZmluZSBNTUNfUklTUl9SWDY1VE8xMjdPQ1RFVFNfR0JfV0lEVEgJMQorI2RlZmluZSBNTUNfUklTUl9SWDEyOFRPMjU1T0NURVRTX0dCX0lOREVYCTEyCisjZGVmaW5lIE1NQ19SSVNSX1JYMTI4VE8yNTVPQ1RFVFNfR0JfV0lEVEgJMQorI2RlZmluZSBNTUNfUklTUl9SWDI1NlRPNTExT0NURVRTX0dCX0lOREVYCTEzCisjZGVmaW5lIE1NQ19SSVNSX1JYMjU2VE81MTFPQ1RFVFNfR0JfV0lEVEgJMQorI2RlZmluZSBNTUNfUklTUl9SWDUxMlRPMTAyM09DVEVUU19HQl9JTkRFWAkxNAorI2RlZmluZSBNTUNfUklTUl9SWDUxMlRPMTAyM09DVEVUU19HQl9XSURUSAkxCisjZGVmaW5lIE1NQ19SSVNSX1JYMTAyNFRPTUFYT0NURVRTX0dCX0lOREVYCTE1CisjZGVmaW5lIE1NQ19SSVNSX1JYMTAyNFRPTUFYT0NURVRTX0dCX1dJRFRICTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhVTklDQVNURlJBTUVTX0dfSU5ERVgJMTYKKyNkZWZpbmUgTU1DX1JJU1JfUlhVTklDQVNURlJBTUVTX0dfV0lEVEgJMQorI2RlZmluZSBNTUNfUklTUl9SWExFTkdUSEVSUk9SX0lOREVYCQkxNworI2RlZmluZSBNTUNfUklTUl9SWExFTkdUSEVSUk9SX1dJRFRICQkxCisjZGVmaW5lIE1NQ19SSVNSX1JYT1VUT0ZSQU5HRVRZUEVfSU5ERVgJCTE4CisjZGVmaW5lIE1NQ19SSVNSX1JYT1VUT0ZSQU5HRVRZUEVfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhQQVVTRUZSQU1FU19JTkRFWAkJMTkKKyNkZWZpbmUgTU1DX1JJU1JfUlhQQVVTRUZSQU1FU19XSURUSAkJMQorI2RlZmluZSBNTUNfUklTUl9SWEZJRk9PVkVSRkxPV19JTkRFWAkJMjAKKyNkZWZpbmUgTU1DX1JJU1JfUlhGSUZPT1ZFUkZMT1dfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhWTEFORlJBTUVTX0dCX0lOREVYCQkyMQorI2RlZmluZSBNTUNfUklTUl9SWFZMQU5GUkFNRVNfR0JfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1JJU1JfUlhXQVRDSERPR0VSUk9SX0lOREVYCQkyMgorI2RlZmluZSBNTUNfUklTUl9SWFdBVENIRE9HRVJST1JfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1RJRVJfQUxMX0lOVEVSUlVQVFNfSU5ERVgJCTAKKyNkZWZpbmUgTU1DX1RJRVJfQUxMX0lOVEVSUlVQVFNfV0lEVEgJCTE4CisjZGVmaW5lIE1NQ19USVNSX1RYT0NURVRDT1VOVF9HQl9JTkRFWAkJMAorI2RlZmluZSBNTUNfVElTUl9UWE9DVEVUQ09VTlRfR0JfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1RJU1JfVFhGUkFNRUNPVU5UX0dCX0lOREVYCQkxCisjZGVmaW5lIE1NQ19USVNSX1RYRlJBTUVDT1VOVF9HQl9XSURUSAkJMQorI2RlZmluZSBNTUNfVElTUl9UWEJST0FEQ0FTVEZSQU1FU19HX0lOREVYCTIKKyNkZWZpbmUgTU1DX1RJU1JfVFhCUk9BRENBU1RGUkFNRVNfR19XSURUSAkxCisjZGVmaW5lIE1NQ19USVNSX1RYTVVMVElDQVNURlJBTUVTX0dfSU5ERVgJMworI2RlZmluZSBNTUNfVElTUl9UWE1VTFRJQ0FTVEZSQU1FU19HX1dJRFRICTEKKyNkZWZpbmUgTU1DX1RJU1JfVFg2NE9DVEVUU19HQl9JTkRFWAkJNAorI2RlZmluZSBNTUNfVElTUl9UWDY0T0NURVRTX0dCX1dJRFRICQkxCisjZGVmaW5lIE1NQ19USVNSX1RYNjVUTzEyN09DVEVUU19HQl9JTkRFWAk1CisjZGVmaW5lIE1NQ19USVNSX1RYNjVUTzEyN09DVEVUU19HQl9XSURUSAkxCisjZGVmaW5lIE1NQ19USVNSX1RYMTI4VE8yNTVPQ1RFVFNfR0JfSU5ERVgJNgorI2RlZmluZSBNTUNfVElTUl9UWDEyOFRPMjU1T0NURVRTX0dCX1dJRFRICTEKKyNkZWZpbmUgTU1DX1RJU1JfVFgyNTZUTzUxMU9DVEVUU19HQl9JTkRFWAk3CisjZGVmaW5lIE1NQ19USVNSX1RYMjU2VE81MTFPQ1RFVFNfR0JfV0lEVEgJMQorI2RlZmluZSBNTUNfVElTUl9UWDUxMlRPMTAyM09DVEVUU19HQl9JTkRFWAk4CisjZGVmaW5lIE1NQ19USVNSX1RYNTEyVE8xMDIzT0NURVRTX0dCX1dJRFRICTEKKyNkZWZpbmUgTU1DX1RJU1JfVFgxMDI0VE9NQVhPQ1RFVFNfR0JfSU5ERVgJOQorI2RlZmluZSBNTUNfVElTUl9UWDEwMjRUT01BWE9DVEVUU19HQl9XSURUSAkxCisjZGVmaW5lIE1NQ19USVNSX1RYVU5JQ0FTVEZSQU1FU19HQl9JTkRFWAkxMAorI2RlZmluZSBNTUNfVElTUl9UWFVOSUNBU1RGUkFNRVNfR0JfV0lEVEgJMQorI2RlZmluZSBNTUNfVElTUl9UWE1VTFRJQ0FTVEZSQU1FU19HQl9JTkRFWAkxMQorI2RlZmluZSBNTUNfVElTUl9UWE1VTFRJQ0FTVEZSQU1FU19HQl9XSURUSAkxCisjZGVmaW5lIE1NQ19USVNSX1RYQlJPQURDQVNURlJBTUVTX0dCX0lOREVYCTEyCisjZGVmaW5lIE1NQ19USVNSX1RYQlJPQURDQVNURlJBTUVTX0dCX1dJRFRICTEKKyNkZWZpbmUgTU1DX1RJU1JfVFhVTkRFUkZMT1dFUlJPUl9JTkRFWAkJMTMKKyNkZWZpbmUgTU1DX1RJU1JfVFhVTkRFUkZMT1dFUlJPUl9XSURUSAkJMQorI2RlZmluZSBNTUNfVElTUl9UWE9DVEVUQ09VTlRfR19JTkRFWAkJMTQKKyNkZWZpbmUgTU1DX1RJU1JfVFhPQ1RFVENPVU5UX0dfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1RJU1JfVFhGUkFNRUNPVU5UX0dfSU5ERVgJCTE1CisjZGVmaW5lIE1NQ19USVNSX1RYRlJBTUVDT1VOVF9HX1dJRFRICQkxCisjZGVmaW5lIE1NQ19USVNSX1RYUEFVU0VGUkFNRVNfSU5ERVgJCTE2CisjZGVmaW5lIE1NQ19USVNSX1RYUEFVU0VGUkFNRVNfV0lEVEgJCTEKKyNkZWZpbmUgTU1DX1RJU1JfVFhWTEFORlJBTUVTX0dfSU5ERVgJCTE3CisjZGVmaW5lIE1NQ19USVNSX1RYVkxBTkZSQU1FU19HX1dJRFRICQkxCisKKy8qIE1UTCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1UTF9PTVIJCQkJMHgxMDAwCisjZGVmaW5lIE1UTF9GRENSCQkJMHgxMDA4CisjZGVmaW5lIE1UTF9GRFNSCQkJMHgxMDBjCisjZGVmaW5lIE1UTF9GRERSCQkJMHgxMDEwCisjZGVmaW5lIE1UTF9JU1IJCQkJMHgxMDIwCisjZGVmaW5lIE1UTF9SUURDTTBSCQkJMHgxMDMwCisjZGVmaW5lIE1UTF9UQ1BNMFIJCQkweDEwNDAKKyNkZWZpbmUgTVRMX1RDUE0xUgkJCTB4MTA0NAorCisjZGVmaW5lIE1UTF9SUURDTV9JTkMJCQk0CisjZGVmaW5lIE1UTF9SUURDTV9RX1BFUl9SRUcJCTQKKworLyogTVRMIHJlZ2lzdGVyIGVudHJ5IGJpdCBwb3NpdGlvbnMgYW5kIHNpemVzICovCisjZGVmaW5lIE1UTF9PTVJfRVRTQUxHX0lOREVYCQk1CisjZGVmaW5lIE1UTF9PTVJfRVRTQUxHX1dJRFRICQkyCisjZGVmaW5lIE1UTF9PTVJfUkFBX0lOREVYCQkyCisjZGVmaW5lIE1UTF9PTVJfUkFBX1dJRFRICQkxCisKKy8qIE1UTCBxdWV1ZSByZWdpc3RlciBvZmZzZXRzCisgKiAgIE11bHRpcGxlIHF1ZXVlcyBjYW4gYmUgYWN0aXZlLiAgVGhlIGZpcnN0IHF1ZXVlIGhhcyByZWdpc3RlcnMKKyAqICAgdGhhdCBiZWdpbiBhdCAweDExMDAuICBFYWNoIHN1YnNlcXVlbnQgcXVldWUgaGFzIHJlZ2lzdGVycyB0aGF0CisgKiAgIGFyZSBhY2Nlc3NlZCB1c2luZyBhbiBvZmZzZXQgb2YgMHg4MCBmcm9tIHRoZSBwcmV2aW91cyBxdWV1ZS4KKyAqLworI2RlZmluZSBNVExfUV9CQVNFCQkJMHgxMTAwCisjZGVmaW5lIE1UTF9RX0lOQwkJCTB4ODAKKworI2RlZmluZSBNVExfUV9UUU9NUgkJCTB4MDAKKyNkZWZpbmUgTVRMX1FfVFFVUgkJCTB4MDQKKyNkZWZpbmUgTVRMX1FfVFFEUgkJCTB4MDgKKyNkZWZpbmUgTVRMX1FfVENFQ1IJCQkweDEwCisjZGVmaW5lIE1UTF9RX1RDRVNSCQkJMHgxNAorI2RlZmluZSBNVExfUV9UQ1FXUgkJCTB4MTgKKyNkZWZpbmUgTVRMX1FfUlFPTVIJCQkweDQwCisjZGVmaW5lIE1UTF9RX1JRTVBPQ1IJCQkweDQ0CisjZGVmaW5lIE1UTF9RX1JRRFIJCQkweDRjCisjZGVmaW5lIE1UTF9RX0lFUgkJCTB4NzAKKyNkZWZpbmUgTVRMX1FfSVNSCQkJMHg3NAorCisvKiBNVEwgcXVldWUgcmVnaXN0ZXIgZW50cnkgYml0IHBvc2l0aW9ucyBhbmQgc2l6ZXMgKi8KKyNkZWZpbmUgTVRMX1FfVENRV1JfUVdfSU5ERVgJCTAKKyNkZWZpbmUgTVRMX1FfVENRV1JfUVdfV0lEVEgJCTIxCisjZGVmaW5lIE1UTF9RX1JRT01SX0VIRkNfSU5ERVgJCTcKKyNkZWZpbmUgTVRMX1FfUlFPTVJfRUhGQ19XSURUSAkJMQorI2RlZmluZSBNVExfUV9SUU9NUl9SRkFfSU5ERVgJCTgKKyNkZWZpbmUgTVRMX1FfUlFPTVJfUkZBX1dJRFRICQkzCisjZGVmaW5lIE1UTF9RX1JRT01SX1JGRF9JTkRFWAkJMTMKKyNkZWZpbmUgTVRMX1FfUlFPTVJfUkZEX1dJRFRICQkzCisjZGVmaW5lIE1UTF9RX1JRT01SX1JRU19JTkRFWAkJMTYKKyNkZWZpbmUgTVRMX1FfUlFPTVJfUlFTX1dJRFRICQk5CisjZGVmaW5lIE1UTF9RX1JRT01SX1JTRl9JTkRFWAkJNQorI2RlZmluZSBNVExfUV9SUU9NUl9SU0ZfV0lEVEgJCTEKKyNkZWZpbmUgTVRMX1FfUlFPTVJfUlRDX0lOREVYCQkwCisjZGVmaW5lIE1UTF9RX1JRT01SX1JUQ19XSURUSAkJMgorI2RlZmluZSBNVExfUV9UUU9NUl9GVFFfSU5ERVgJCTAKKyNkZWZpbmUgTVRMX1FfVFFPTVJfRlRRX1dJRFRICQkxCisjZGVmaW5lIE1UTF9RX1RRT01SX1RRU19JTkRFWAkJMTYKKyNkZWZpbmUgTVRMX1FfVFFPTVJfVFFTX1dJRFRICQkxMAorI2RlZmluZSBNVExfUV9UUU9NUl9UU0ZfSU5ERVgJCTEKKyNkZWZpbmUgTVRMX1FfVFFPTVJfVFNGX1dJRFRICQkxCisjZGVmaW5lIE1UTF9RX1RRT01SX1RUQ19JTkRFWAkJNAorI2RlZmluZSBNVExfUV9UUU9NUl9UVENfV0lEVEgJCTMKKyNkZWZpbmUgTVRMX1FfVFFPTVJfVFhRRU5fSU5ERVgJCTIKKyNkZWZpbmUgTVRMX1FfVFFPTVJfVFhRRU5fV0lEVEgJCTIKKworLyogTVRMIHF1ZXVlIHJlZ2lzdGVyIHZhbHVlICovCisjZGVmaW5lIE1UTF9SU0ZfRElTQUJMRQkJCTB4MDAKKyNkZWZpbmUgTVRMX1JTRl9FTkFCTEUJCQkweDAxCisjZGVmaW5lIE1UTF9UU0ZfRElTQUJMRQkJCTB4MDAKKyNkZWZpbmUgTVRMX1RTRl9FTkFCTEUJCQkweDAxCisKKyNkZWZpbmUgTVRMX1JYX1RIUkVTSE9MRF82NAkJMHgwMAorI2RlZmluZSBNVExfUlhfVEhSRVNIT0xEXzk2CQkweDAyCisjZGVmaW5lIE1UTF9SWF9USFJFU0hPTERfMTI4CQkweDAzCisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfMzIJCTB4MDEKKyNkZWZpbmUgTVRMX1RYX1RIUkVTSE9MRF82NAkJMHgwMAorI2RlZmluZSBNVExfVFhfVEhSRVNIT0xEXzk2CQkweDAyCisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfMTI4CQkweDAzCisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfMTkyCQkweDA0CisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfMjU2CQkweDA1CisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfMzg0CQkweDA2CisjZGVmaW5lIE1UTF9UWF9USFJFU0hPTERfNTEyCQkweDA3CisKKyNkZWZpbmUgTVRMX0VUU0FMR19XUlIJCQkweDAwCisjZGVmaW5lIE1UTF9FVFNBTEdfV0ZRCQkJMHgwMQorI2RlZmluZSBNVExfRVRTQUxHX0RXUlIJCQkweDAyCisjZGVmaW5lIE1UTF9SQUFfU1AJCQkweDAwCisjZGVmaW5lIE1UTF9SQUFfV1NQCQkJMHgwMQorCisjZGVmaW5lIE1UTF9RX0RJU0FCTEVECQkJMHgwMAorI2RlZmluZSBNVExfUV9FTkFCTEVECQkJMHgwMgorCisKKy8qIE1UTCB0cmFmZmljIGNsYXNzIHJlZ2lzdGVyIG9mZnNldHMKKyAqICAgTXVsdGlwbGUgdHJhZmZpYyBjbGFzc2VzIGNhbiBiZSBhY3RpdmUuICBUaGUgZmlyc3QgY2xhc3MgaGFzIHJlZ2lzdGVycworICogICB0aGF0IGJlZ2luIGF0IDB4MTEwMC4gIEVhY2ggc3Vic2VxdWVudCBxdWV1ZSBoYXMgcmVnaXN0ZXJzIHRoYXQKKyAqICAgYXJlIGFjY2Vzc2VkIHVzaW5nIGFuIG9mZnNldCBvZiAweDgwIGZyb20gdGhlIHByZXZpb3VzIHF1ZXVlLgorICovCisjZGVmaW5lIE1UTF9UQ19CQVNFCQkJTVRMX1FfQkFTRQorI2RlZmluZSBNVExfVENfSU5DCQkJTVRMX1FfSU5DCisKKyNkZWZpbmUgTVRMX1RDX0VUU0NSCQkJMHgxMAorCisvKiBNVEwgdHJhZmZpYyBjbGFzcyByZWdpc3RlciBlbnRyeSBiaXQgcG9zaXRpb25zIGFuZCBzaXplcyAqLworI2RlZmluZSBNVExfVENfRVRTQ1JfVFNBX0lOREVYCQkwCisjZGVmaW5lIE1UTF9UQ19FVFNDUl9UU0FfV0lEVEgJCTIKKworLyogTVRMIHRyYWZmaWMgY2xhc3MgcmVnaXN0ZXIgdmFsdWUgKi8KKyNkZWZpbmUgTVRMX1RTQV9TUAkJCTB4MDAKKyNkZWZpbmUgTVRMX1RTQV9FVFMJCQkweDAyCisKKworLyogUENTIE1NRCBzZWxlY3QgcmVnaXN0ZXIgb2Zmc2V0CisgKiAgVGhlIE1NRCBzZWxlY3QgcmVnaXN0ZXIgaXMgdXNlZCBmb3IgYWNjZXNzaW5nIFBDUyByZWdpc3RlcnMKKyAqICB3aGVuIHRoZSB1bmRlcmx5aW5nIEFQQjMgaW50ZXJmYWNlIGlzIHVzaW5nIGluZGlyZWN0IGFkZHJlc3NpbmcuCisgKiAgSW5kaXJlY3QgYWRkcmVzc2luZyByZXF1aXJlcyBhY2Nlc3NpbmcgcmVnaXN0ZXJzIGluIHR3byBwaGFzZXMsCisgKiAgYW4gYWRkcmVzcyBwaGFzZSBhbmQgYSBkYXRhIHBoYXNlLiAgVGhlIGFkZHJlc3MgcGhhc2VzIHJlcXVpcmVzCisgKiAgd3JpdGluZyBhbiBhZGRyZXNzIHNlbGVjdGlvbiB2YWx1ZSB0byB0aGUgTU1EIHNlbGVjdCByZWdpZXN0ZXJzLgorICovCisjZGVmaW5lIFBDU19NTURfU0VMRUNUCQkJMHhmZgorCisKKy8qIERlc2NyaXB0b3IvUGFja2V0IGVudHJ5IGJpdCBwb3NpdGlvbnMgYW5kIHNpemVzICovCisjZGVmaW5lIFJYX1BBQ0tFVF9FUlJPUlNfQ1JDX0lOREVYCQkyCisjZGVmaW5lIFJYX1BBQ0tFVF9FUlJPUlNfQ1JDX1dJRFRICQkxCisjZGVmaW5lIFJYX1BBQ0tFVF9FUlJPUlNfRlJBTUVfSU5ERVgJCTMKKyNkZWZpbmUgUlhfUEFDS0VUX0VSUk9SU19GUkFNRV9XSURUSAkJMQorI2RlZmluZSBSWF9QQUNLRVRfRVJST1JTX0xFTkdUSF9JTkRFWAkJMAorI2RlZmluZSBSWF9QQUNLRVRfRVJST1JTX0xFTkdUSF9XSURUSAkJMQorI2RlZmluZSBSWF9QQUNLRVRfRVJST1JTX09WRVJSVU5fSU5ERVgJCTEKKyNkZWZpbmUgUlhfUEFDS0VUX0VSUk9SU19PVkVSUlVOX1dJRFRICQkxCisKKyNkZWZpbmUgUlhfUEFDS0VUX0FUVFJJQlVURVNfQ1NVTV9ET05FX0lOREVYCTAKKyNkZWZpbmUgUlhfUEFDS0VUX0FUVFJJQlVURVNfQ1NVTV9ET05FX1dJRFRICTEKKyNkZWZpbmUgUlhfUEFDS0VUX0FUVFJJQlVURVNfVkxBTl9DVEFHX0lOREVYCTEKKyNkZWZpbmUgUlhfUEFDS0VUX0FUVFJJQlVURVNfVkxBTl9DVEFHX1dJRFRICTEKKyNkZWZpbmUgUlhfUEFDS0VUX0FUVFJJQlVURVNfSU5DT01QTEVURV9JTkRFWAkyCisjZGVmaW5lIFJYX1BBQ0tFVF9BVFRSSUJVVEVTX0lOQ09NUExFVEVfV0lEVEgJMQorCisjZGVmaW5lIFJYX05PUk1BTF9ERVNDMF9PVlRfSU5ERVgJCTAKKyNkZWZpbmUgUlhfTk9STUFMX0RFU0MwX09WVF9XSURUSAkJMTYKKyNkZWZpbmUgUlhfTk9STUFMX0RFU0MzX0VTX0lOREVYCQkxNQorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfRVNfV0lEVEgJCTEKKyNkZWZpbmUgUlhfTk9STUFMX0RFU0MzX0VUTFRfSU5ERVgJCTE2CisjZGVmaW5lIFJYX05PUk1BTF9ERVNDM19FVExUX1dJRFRICQk0CisjZGVmaW5lIFJYX05PUk1BTF9ERVNDM19JTlRFX0lOREVYCQkzMAorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfSU5URV9XSURUSAkJMQorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfTERfSU5ERVgJCTI4CisjZGVmaW5lIFJYX05PUk1BTF9ERVNDM19MRF9XSURUSAkJMQorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfT1dOX0lOREVYCQkzMQorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfT1dOX1dJRFRICQkxCisjZGVmaW5lIFJYX05PUk1BTF9ERVNDM19QTF9JTkRFWAkJMAorI2RlZmluZSBSWF9OT1JNQUxfREVTQzNfUExfV0lEVEgJCTE0CisKKyNkZWZpbmUgVFhfUEFDS0VUX0FUVFJJQlVURVNfQ1NVTV9FTkFCTEVfSU5ERVgJMAorI2RlZmluZSBUWF9QQUNLRVRfQVRUUklCVVRFU19DU1VNX0VOQUJMRV9XSURUSAkxCisjZGVmaW5lIFRYX1BBQ0tFVF9BVFRSSUJVVEVTX1RTT19FTkFCTEVfSU5ERVgJMQorI2RlZmluZSBUWF9QQUNLRVRfQVRUUklCVVRFU19UU09fRU5BQkxFX1dJRFRICTEKKyNkZWZpbmUgVFhfUEFDS0VUX0FUVFJJQlVURVNfVkxBTl9DVEFHX0lOREVYCTIKKyNkZWZpbmUgVFhfUEFDS0VUX0FUVFJJQlVURVNfVkxBTl9DVEFHX1dJRFRICTEKKworI2RlZmluZSBUWF9DT05URVhUX0RFU0MyX01TU19JTkRFWAkJMAorI2RlZmluZSBUWF9DT05URVhUX0RFU0MyX01TU19XSURUSAkJMTUKKyNkZWZpbmUgVFhfQ09OVEVYVF9ERVNDM19DVFhUX0lOREVYCQkzMAorI2RlZmluZSBUWF9DT05URVhUX0RFU0MzX0NUWFRfV0lEVEgJCTEKKyNkZWZpbmUgVFhfQ09OVEVYVF9ERVNDM19UQ01TU1ZfSU5ERVgJCTI2CisjZGVmaW5lIFRYX0NPTlRFWFRfREVTQzNfVENNU1NWX1dJRFRICQkxCisjZGVmaW5lIFRYX0NPTlRFWFRfREVTQzNfVkxUVl9JTkRFWAkJMTYKKyNkZWZpbmUgVFhfQ09OVEVYVF9ERVNDM19WTFRWX1dJRFRICQkxCisjZGVmaW5lIFRYX0NPTlRFWFRfREVTQzNfVlRfSU5ERVgJCTAKKyNkZWZpbmUgVFhfQ09OVEVYVF9ERVNDM19WVF9XSURUSAkJMTYKKworI2RlZmluZSBUWF9OT1JNQUxfREVTQzJfSExfQjFMX0lOREVYCQkwCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDMl9ITF9CMUxfV0lEVEgJCTE0CisjZGVmaW5lIFRYX05PUk1BTF9ERVNDMl9JQ19JTkRFWAkJMzEKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MyX0lDX1dJRFRICQkxCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDMl9WVElSX0lOREVYCQkxNAorI2RlZmluZSBUWF9OT1JNQUxfREVTQzJfVlRJUl9XSURUSAkJMgorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfQ0lDX0lOREVYCQkxNgorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfQ0lDX1dJRFRICQkyCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19DUENfSU5ERVgJCTI2CisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19DUENfV0lEVEgJCTIKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX0NUWFRfSU5ERVgJCTMwCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19DVFhUX1dJRFRICQkxCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19GRF9JTkRFWAkJMjkKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX0ZEX1dJRFRICQkxCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19GTF9JTkRFWAkJMAorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfRkxfV0lEVEgJCTE1CisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19MRF9JTkRFWAkJMjgKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX0xEX1dJRFRICQkxCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19PV05fSU5ERVgJCTMxCisjZGVmaW5lIFRYX05PUk1BTF9ERVNDM19PV05fV0lEVEgJCTEKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX1RDUEhEUkxFTl9JTkRFWAkJMTkKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX1RDUEhEUkxFTl9XSURUSAkJNAorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfVENQUExfSU5ERVgJCTAKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MzX1RDUFBMX1dJRFRICQkxOAorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfVFNFX0lOREVYCQkxOAorI2RlZmluZSBUWF9OT1JNQUxfREVTQzNfVFNFX1dJRFRICQkxCisKKyNkZWZpbmUgVFhfTk9STUFMX0RFU0MyX1ZMQU5fSU5TRVJUCQkweDIKKworLyogTURJTyB1bmRlZmluZWQgb3IgdmVuZG9yIHNwZWNpZmljIHJlZ2lzdGVycyAqLworI2lmbmRlZiBNRElPX0FOX0NPTVBfU1RBVAorI2RlZmluZSBNRElPX0FOX0NPTVBfU1RBVAkJMHgwMDMwCisjZW5kaWYKKworCisvKiBCaXQgc2V0dGluZyBhbmQgZ2V0dGluZyBtYWNyb3MKKyAqICBUaGUgZ2V0IG1hY3JvIHdpbGwgZXh0cmFjdCB0aGUgY3VycmVudCBiaXQgZmllbGQgdmFsdWUgZnJvbSB3aXRoaW4KKyAqICB0aGUgdmFyaWFibGUKKyAqCisgKiAgVGhlIHNldCBtYWNybyB3aWxsIGNsZWFyIHRoZSBjdXJyZW50IGJpdCBmaWVsZCB2YWx1ZSB3aXRoaW4gdGhlCisgKiAgdmFyaWFibGUgYW5kIHRoZW4gc2V0IHRoZSBiaXQgZmllbGQgb2YgdGhlIHZhcmlhYmxlIHRvIHRoZQorICogIHNwZWNpZmllZCB2YWx1ZQorICovCisjZGVmaW5lIEdFVF9CSVRTKF92YXIsIF9pbmRleCwgX3dpZHRoKQkJCQkJXAorCSgoKF92YXIpID4+IChfaW5kZXgpKSAmICgoMHgxIDw8IChfd2lkdGgpKSAtIDEpKQorCisjZGVmaW5lIFNFVF9CSVRTKF92YXIsIF9pbmRleCwgX3dpZHRoLCBfdmFsKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShfdmFyKSAmPSB+KCgoMHgxIDw8IChfd2lkdGgpKSAtIDEpIDw8IChfaW5kZXgpKTsJCVwKKwkoX3ZhcikgfD0gKCgoX3ZhbCkgJiAoKDB4MSA8PCAoX3dpZHRoKSkgLSAxKSkgPDwgKF9pbmRleCkpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9CSVRTX0xFKF92YXIsIF9pbmRleCwgX3dpZHRoKQkJCQlcCisJKChsZTMyX3RvX2NwdSgoX3ZhcikpID4+IChfaW5kZXgpKSAmICgoMHgxIDw8IChfd2lkdGgpKSAtIDEpKQorCisjZGVmaW5lIFNFVF9CSVRTX0xFKF92YXIsIF9pbmRleCwgX3dpZHRoLCBfdmFsKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShfdmFyKSAmPSBjcHVfdG9fbGUzMih+KCgoMHgxIDw8IChfd2lkdGgpKSAtIDEpIDw8IChfaW5kZXgpKSk7CVwKKwkoX3ZhcikgfD0gY3B1X3RvX2xlMzIoKCgoX3ZhbCkgJgkJCQlcCisJCQkgICAgICAoKDB4MSA8PCAoX3dpZHRoKSkgLSAxKSkgPDwgKF9pbmRleCkpKTsJXAorfSB3aGlsZSAoMCkKKworCisvKiBCaXQgc2V0dGluZyBhbmQgZ2V0dGluZyBtYWNyb3MgYmFzZWQgb24gcmVnaXN0ZXIgZmllbGRzCisgKiAgVGhlIGdldCBtYWNybyB1c2VzIHRoZSBiaXQgZmllbGQgZGVmaW5pdGlvbnMgZm9ybWVkIHVzaW5nIHRoZSBpbnB1dAorICogIG5hbWVzIHRvIGV4dHJhY3QgdGhlIGN1cnJlbnQgYml0IGZpZWxkIHZhbHVlIGZyb20gd2l0aGluIHRoZQorICogIHZhcmlhYmxlCisgKgorICogIFRoZSBzZXQgbWFjcm8gdXNlcyB0aGUgYml0IGZpZWxkIGRlZmluaXRpb25zIGZvcm1lZCB1c2luZyB0aGUgaW5wdXQKKyAqICBuYW1lcyB0byBzZXQgdGhlIGJpdCBmaWVsZCBvZiB0aGUgdmFyaWFibGUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQorICovCisjZGVmaW5lIFhHTUFDX0dFVF9CSVRTKF92YXIsIF9wcmVmaXgsIF9maWVsZCkJCQkJXAorCUdFVF9CSVRTKChfdmFyKSwJCQkJCQlcCisJCSBfcHJlZml4IyNfIyNfZmllbGQjI19JTkRFWCwJCQkJXAorCQkgX3ByZWZpeCMjXyMjX2ZpZWxkIyNfV0lEVEgpCisKKyNkZWZpbmUgWEdNQUNfU0VUX0JJVFMoX3ZhciwgX3ByZWZpeCwgX2ZpZWxkLCBfdmFsKQkJCVwKKwlTRVRfQklUUygoX3ZhciksCQkJCQkJXAorCQkgX3ByZWZpeCMjXyMjX2ZpZWxkIyNfSU5ERVgsCQkJCVwKKwkJIF9wcmVmaXgjI18jI19maWVsZCMjX1dJRFRILCAoX3ZhbCkpCisKKyNkZWZpbmUgWEdNQUNfR0VUX0JJVFNfTEUoX3ZhciwgX3ByZWZpeCwgX2ZpZWxkKQkJCVwKKwlHRVRfQklUU19MRSgoX3ZhciksCQkJCQkJXAorCQkgX3ByZWZpeCMjXyMjX2ZpZWxkIyNfSU5ERVgsCQkJCVwKKwkJIF9wcmVmaXgjI18jI19maWVsZCMjX1dJRFRIKQorCisjZGVmaW5lIFhHTUFDX1NFVF9CSVRTX0xFKF92YXIsIF9wcmVmaXgsIF9maWVsZCwgX3ZhbCkJCQlcCisJU0VUX0JJVFNfTEUoKF92YXIpLAkJCQkJCVwKKwkJIF9wcmVmaXgjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcHJlZml4IyNfIyNfZmllbGQjI19XSURUSCwgKF92YWwpKQorCisKKy8qIE1hY3JvcyBmb3IgcmVhZGluZyBvciB3cml0aW5nIHJlZ2lzdGVycworICogIFRoZSBpb3JlYWQgbWFjcm9zIHdpbGwgZ2V0IGJpdCBmaWVsZHMgb3IgZnVsbCB2YWx1ZXMgdXNpbmcgdGhlCisgKiAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9ybWVkIHVzaW5nIHRoZSBpbnB1dCBuYW1lcworICoKKyAqICBUaGUgaW93cml0ZSBtYWNyb3Mgd2lsbCBzZXQgYml0IGZpZWxkcyBvciBmdWxsIHZhbHVlcyB1c2luZyB0aGUKKyAqICByZWdpc3RlciBkZWZpbml0aW9ucyBmb3JtZWQgdXNpbmcgdGhlIGlucHV0IG5hbWVzCisgKi8KKyNkZWZpbmUgWEdNQUNfSU9SRUFEKF9wZGF0YSwgX3JlZykJCQkJCVwKKwlpb3JlYWQzMigoX3BkYXRhKS0+eGdtYWNfcmVncyArIF9yZWcpCisKKyNkZWZpbmUgWEdNQUNfSU9SRUFEX0JJVFMoX3BkYXRhLCBfcmVnLCBfZmllbGQpCQkJCVwKKwlHRVRfQklUUyhYR01BQ19JT1JFQUQoKF9wZGF0YSksIF9yZWcpLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19JTkRFWCwJCQkJXAorCQkgX3JlZyMjXyMjX2ZpZWxkIyNfV0lEVEgpCisKKyNkZWZpbmUgWEdNQUNfSU9XUklURShfcGRhdGEsIF9yZWcsIF92YWwpCQkJCVwKKwlpb3dyaXRlMzIoKF92YWwpLCAoX3BkYXRhKS0+eGdtYWNfcmVncyArIF9yZWcpCisKKyNkZWZpbmUgWEdNQUNfSU9XUklURV9CSVRTKF9wZGF0YSwgX3JlZywgX2ZpZWxkLCBfdmFsKQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdTMyIHJlZ192YWwgPSBYR01BQ19JT1JFQUQoKF9wZGF0YSksIF9yZWcpOwkJCVwKKwlTRVRfQklUUyhyZWdfdmFsLAkJCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCwgKF92YWwpKTsJCQlcCisJWEdNQUNfSU9XUklURSgoX3BkYXRhKSwgX3JlZywgcmVnX3ZhbCk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyogTWFjcm9zIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgTVRMIHF1ZXVlIG9yIHRyYWZmaWMgY2xhc3MgcmVnaXN0ZXJzCisgKiAgU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgcmVhZCBhbmQgd3JpdGUgbWFjcm9zIGV4Y2VwdCB0aGF0IHRoZQorICogIGJhc2UgcmVnaXN0ZXIgdmFsdWUgaXMgY2FsY3VsYXRlZCBieSB0aGUgcXVldWUgb3IgdHJhZmZpYyBjbGFzcyBudW1iZXIKKyAqLworI2RlZmluZSBYR01BQ19NVExfSU9SRUFEKF9wZGF0YSwgX24sIF9yZWcpCQkJCVwKKwlpb3JlYWQzMigoX3BkYXRhKS0+eGdtYWNfcmVncyArCQkJCQlcCisJCSBNVExfUV9CQVNFICsgKChfbikgKiBNVExfUV9JTkMpICsgX3JlZykKKworI2RlZmluZSBYR01BQ19NVExfSU9SRUFEX0JJVFMoX3BkYXRhLCBfbiwgX3JlZywgX2ZpZWxkKQkJCVwKKwlHRVRfQklUUyhYR01BQ19NVExfSU9SRUFEKChfcGRhdGEpLCAoX24pLCBfcmVnKSwJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCkKKworI2RlZmluZSBYR01BQ19NVExfSU9XUklURShfcGRhdGEsIF9uLCBfcmVnLCBfdmFsKQkJCVwKKwlpb3dyaXRlMzIoKF92YWwpLCAoX3BkYXRhKS0+eGdtYWNfcmVncyArCQkJXAorCQkgIE1UTF9RX0JBU0UgKyAoKF9uKSAqIE1UTF9RX0lOQykgKyBfcmVnKQorCisjZGVmaW5lIFhHTUFDX01UTF9JT1dSSVRFX0JJVFMoX3BkYXRhLCBfbiwgX3JlZywgX2ZpZWxkLCBfdmFsKQkJXAorZG8gewkJCQkJCQkJCVwKKwl1MzIgcmVnX3ZhbCA9IFhHTUFDX01UTF9JT1JFQUQoKF9wZGF0YSksIChfbiksIF9yZWcpOwkJXAorCVNFVF9CSVRTKHJlZ192YWwsCQkJCQkJXAorCQkgX3JlZyMjXyMjX2ZpZWxkIyNfSU5ERVgsCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX1dJRFRILCAoX3ZhbCkpOwkJCVwKKwlYR01BQ19NVExfSU9XUklURSgoX3BkYXRhKSwgKF9uKSwgX3JlZywgcmVnX3ZhbCk7CQlcCit9IHdoaWxlICgwKQorCisKKy8qIE1hY3JvcyBmb3IgcmVhZGluZyBvciB3cml0aW5nIERNQSBjaGFubmVsIHJlZ2lzdGVycworICogIFNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIHJlYWQgYW5kIHdyaXRlIG1hY3JvcyBleGNlcHQgdGhhdCB0aGUKKyAqICBiYXNlIHJlZ2lzdGVyIHZhbHVlIGlzIG9idGFpbmVkIGZyb20gdGhlIHJpbmcKKyAqLworI2RlZmluZSBYR01BQ19ETUFfSU9SRUFEKF9jaGFubmVsLCBfcmVnKQkJCQlcCisJaW9yZWFkMzIoKF9jaGFubmVsKS0+ZG1hX3JlZ3MgKyBfcmVnKQorCisjZGVmaW5lIFhHTUFDX0RNQV9JT1JFQURfQklUUyhfY2hhbm5lbCwgX3JlZywgX2ZpZWxkKQkJCVwKKwlHRVRfQklUUyhYR01BQ19ETUFfSU9SRUFEKChfY2hhbm5lbCksIF9yZWcpLAkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCkKKworI2RlZmluZSBYR01BQ19ETUFfSU9XUklURShfY2hhbm5lbCwgX3JlZywgX3ZhbCkJCQkJXAorCWlvd3JpdGUzMigoX3ZhbCksIChfY2hhbm5lbCktPmRtYV9yZWdzICsgX3JlZykKKworI2RlZmluZSBYR01BQ19ETUFfSU9XUklURV9CSVRTKF9jaGFubmVsLCBfcmVnLCBfZmllbGQsIF92YWwpCQlcCitkbyB7CQkJCQkJCQkJXAorCXUzMiByZWdfdmFsID0gWEdNQUNfRE1BX0lPUkVBRCgoX2NoYW5uZWwpLCBfcmVnKTsJCVwKKwlTRVRfQklUUyhyZWdfdmFsLAkJCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCwgKF92YWwpKTsJCQlcCisJWEdNQUNfRE1BX0lPV1JJVEUoKF9jaGFubmVsKSwgX3JlZywgcmVnX3ZhbCk7CQkJXAorfSB3aGlsZSAoMCkKKworCisvKiBNYWNyb3MgZm9yIGJ1aWxkaW5nLCByZWFkaW5nIG9yIHdyaXRpbmcgcmVnaXN0ZXIgdmFsdWVzIG9yIGJpdHMKKyAqIHdpdGhpbiB0aGUgcmVnaXN0ZXIgdmFsdWVzIG9mIFhQQ1MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFhQQ1NfSU9XUklURShfcGRhdGEsIF9vZmYsIF92YWwpCQkJCVwKKwlpb3dyaXRlMzIoX3ZhbCwgKF9wZGF0YSktPnhwY3NfcmVncyArIChfb2ZmKSkKKworI2RlZmluZSBYUENTX0lPUkVBRChfcGRhdGEsIF9vZmYpCQkJCQlcCisJaW9yZWFkMzIoKF9wZGF0YSktPnhwY3NfcmVncyArIChfb2ZmKSkKKworCisvKiBNYWNyb3MgZm9yIGJ1aWxkaW5nLCByZWFkaW5nIG9yIHdyaXRpbmcgcmVnaXN0ZXIgdmFsdWVzIG9yIGJpdHMKKyAqIHVzaW5nIE1ESU8uICBEaWZmZXJlbnQgZnJvbSBhYm92ZSBiZWNhdXNlIG9mIHRoZSB1c2Ugb2Ygc3RhbmRhcmRpemVkCisgKiBMaW51eCBpbmNsdWRlIHZhbHVlcy4gIE5vIHNoaWZ0aW5nIGlzIHBlcmZvcm1lZCB3aXRoIHRoZSBiaXQKKyAqIG9wZXJhdGlvbnMsIGV2ZXJ5dGhpbmcgd29ya3Mgb24gbWFzayB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgWE1ESU9fUkVBRChfcGRhdGEsIF9tbWQsIF9yZWcpCQkJCQlcCisJKChfcGRhdGEpLT5od19pZi5yZWFkX21tZF9yZWdzKChfcGRhdGEpLCAwLAkJCVwKKwkJTUlJX0FERFJfQzQ1IHwgKF9tbWQgPDwgMTYpIHwgKChfcmVnKSAmIDB4ZmZmZikpKQorCisjZGVmaW5lIFhNRElPX1JFQURfQklUUyhfcGRhdGEsIF9tbWQsIF9yZWcsIF9tYXNrKQkJCVwKKwkoWE1ESU9fUkVBRCgoX3BkYXRhKSwgX21tZCwgX3JlZykgJiBfbWFzaykKKworI2RlZmluZSBYTURJT19XUklURShfcGRhdGEsIF9tbWQsIF9yZWcsIF92YWwpCQkJCVwKKwkoKF9wZGF0YSktPmh3X2lmLndyaXRlX21tZF9yZWdzKChfcGRhdGEpLCAwLAkJCVwKKwkJTUlJX0FERFJfQzQ1IHwgKF9tbWQgPDwgMTYpIHwgKChfcmVnKSAmIDB4ZmZmZiksIChfdmFsKSkpCisKKyNkZWZpbmUgWE1ESU9fV1JJVEVfQklUUyhfcGRhdGEsIF9tbWQsIF9yZWcsIF9tYXNrLCBfdmFsKQkJXAorZG8gewkJCQkJCQkJCVwKKwl1MzIgbW1kX3ZhbCA9IFhNRElPX1JFQUQoKF9wZGF0YSksIF9tbWQsIF9yZWcpOwkJCVwKKwltbWRfdmFsICY9IH5fbWFzazsJCQkJCQlcCisJbW1kX3ZhbCB8PSAoX3ZhbCk7CQkJCQkJXAorCVhNRElPX1dSSVRFKChfcGRhdGEpLCBfbW1kLCBfcmVnLCBtbWRfdmFsKTsJCQlcCit9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiNzZkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGVidWdmcy5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQU1EIDEwR2IgRXRoZXJuZXQgZHJpdmVyCisgKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIGZvbGxvd2luZyB0d28KKyAqIGxpY2Vuc2VzOgorICoKKyAqIExpY2Vuc2UgMTogR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IGNvcHksIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogTGljZW5zZSAyOiBNb2RpZmllZCBCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAieGdiZS5oIgorI2luY2x1ZGUgInhnYmUtY29tbW9uLmgiCisKKworc3RhdGljIHNzaXplX3QgeGdiZV9jb21tb25fcmVhZChjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJCQkJbG9mZl90ICpwcG9zLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJY2hhciAqYnVmOworCXNzaXplX3QgbGVuOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCisJYnVmID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIweCUwOHhcbiIsIHZhbHVlKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY291bnQgPCBzdHJsZW4oYnVmKSkgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlsZW4gPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIGNvdW50LCBwcG9zLCBidWYsIHN0cmxlbihidWYpKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgeGdiZV9jb21tb25fd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJCSBsb2ZmX3QgKnBwb3MsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisJY2hhciB3b3JrYXJlYVszMl07CisJc3NpemVfdCBsZW47CisJdW5zaWduZWQgaW50IHNjYW5fdmFsdWU7CisKKwlpZiAoKnBwb3MgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY291bnQgPj0gc2l6ZW9mKHdvcmthcmVhKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlsZW4gPSBzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKHdvcmthcmVhLCBzaXplb2Yod29ya2FyZWEpIC0gMSwgcHBvcywKKwkJCQkgICAgIGJ1ZmZlciwgY291bnQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJd29ya2FyZWFbbGVuXSA9ICdcMCc7CisJaWYgKHNzY2FuZih3b3JrYXJlYSwgIiV4IiwgJnNjYW5fdmFsdWUpID09IDEpCisJCSp2YWx1ZSA9IHNjYW5fdmFsdWU7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhnbWFjX3JlZ19hZGRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHhnYmVfY29tbW9uX3JlYWQoYnVmZmVyLCBjb3VudCwgcHBvcywgcGRhdGEtPmRlYnVnZnNfeGdtYWNfcmVnKTsKK30KKworc3RhdGljIHNzaXplX3QgeGdtYWNfcmVnX2FkZHJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB4Z2JlX2NvbW1vbl93cml0ZShidWZmZXIsIGNvdW50LCBwcG9zLAorCQkJCSAmcGRhdGEtPmRlYnVnZnNfeGdtYWNfcmVnKTsKK30KKworc3RhdGljIHNzaXplX3QgeGdtYWNfcmVnX3ZhbHVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IFhHTUFDX0lPUkVBRChwZGF0YSwgcGRhdGEtPmRlYnVnZnNfeGdtYWNfcmVnKTsKKworCXJldHVybiB4Z2JlX2NvbW1vbl9yZWFkKGJ1ZmZlciwgY291bnQsIHBwb3MsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgeGdtYWNfcmVnX3ZhbHVlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3NpemVfdCBsZW47CisKKwlsZW4gPSB4Z2JlX2NvbW1vbl93cml0ZShidWZmZXIsIGNvdW50LCBwcG9zLCAmdmFsdWUpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJWEdNQUNfSU9XUklURShwZGF0YSwgcGRhdGEtPmRlYnVnZnNfeGdtYWNfcmVnLCB2YWx1ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4Z21hY19yZWdfYWRkcl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSAgeGdtYWNfcmVnX2FkZHJfcmVhZCwKKwkud3JpdGUgPSB4Z21hY19yZWdfYWRkcl93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhnbWFjX3JlZ192YWx1ZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSAgeGdtYWNfcmVnX3ZhbHVlX3JlYWQsCisJLndyaXRlID0geGdtYWNfcmVnX3ZhbHVlX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgeHBjc19tbWRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHhnYmVfY29tbW9uX3JlYWQoYnVmZmVyLCBjb3VudCwgcHBvcywgcGRhdGEtPmRlYnVnZnNfeHBjc19tbWQpOworfQorCitzdGF0aWMgc3NpemVfdCB4cGNzX21tZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB4Z2JlX2NvbW1vbl93cml0ZShidWZmZXIsIGNvdW50LCBwcG9zLAorCQkJCSAmcGRhdGEtPmRlYnVnZnNfeHBjc19tbWQpOworfQorCitzdGF0aWMgc3NpemVfdCB4cGNzX3JlZ19hZGRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4geGdiZV9jb21tb25fcmVhZChidWZmZXIsIGNvdW50LCBwcG9zLCBwZGF0YS0+ZGVidWdmc194cGNzX3JlZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwY3NfcmVnX2FkZHJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHhnYmVfY29tbW9uX3dyaXRlKGJ1ZmZlciwgY291bnQsIHBwb3MsCisJCQkJICZwZGF0YS0+ZGVidWdmc194cGNzX3JlZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwY3NfcmVnX3ZhbHVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXZhbHVlID0gcGRhdGEtPmh3X2lmLnJlYWRfbW1kX3JlZ3MocGRhdGEsIHBkYXRhLT5kZWJ1Z2ZzX3hwY3NfbW1kLAorCQkJCQkgICBwZGF0YS0+ZGVidWdmc194cGNzX3JlZyk7CisKKwlyZXR1cm4geGdiZV9jb21tb25fcmVhZChidWZmZXIsIGNvdW50LCBwcG9zLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwY3NfcmVnX3ZhbHVlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXNzaXplX3QgbGVuOworCisJbGVuID0geGdiZV9jb21tb25fd3JpdGUoYnVmZmVyLCBjb3VudCwgcHBvcywgJnZhbHVlKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKworCXBkYXRhLT5od19pZi53cml0ZV9tbWRfcmVncyhwZGF0YSwgcGRhdGEtPmRlYnVnZnNfeHBjc19tbWQsCisJCQkJICAgIHBkYXRhLT5kZWJ1Z2ZzX3hwY3NfcmVnLCB2YWx1ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4cGNzX21tZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSAgeHBjc19tbWRfcmVhZCwKKwkud3JpdGUgPSB4cGNzX21tZF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhwY3NfcmVnX2FkZHJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAorCS5yZWFkID0gIHhwY3NfcmVnX2FkZHJfcmVhZCwKKwkud3JpdGUgPSB4cGNzX3JlZ19hZGRyX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHBjc19yZWdfdmFsdWVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAorCS5yZWFkID0gIHhwY3NfcmVnX3ZhbHVlX3JlYWQsCisJLndyaXRlID0geHBjc19yZWdfdmFsdWVfd3JpdGUsCit9OworCit2b2lkIHhnYmVfZGVidWdmc19pbml0KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwZmlsZTsKKwljaGFyICpidWY7CisKKwkvKiBTZXQgZGVmYXVsdHMgKi8KKwlwZGF0YS0+ZGVidWdmc194Z21hY19yZWcgPSAwOworCXBkYXRhLT5kZWJ1Z2ZzX3hwY3NfbW1kID0gMTsKKwlwZGF0YS0+ZGVidWdmc194cGNzX3JlZyA9IDA7CisKKwlidWYgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImFtZC14Z2JlLSVzIiwgcGRhdGEtPm5ldGRldi0+bmFtZSk7CisJcGRhdGEtPnhnYmVfZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcihidWYsIE5VTEwpOworCWlmIChwZGF0YS0+eGdiZV9kZWJ1Z2ZzID09IE5VTEwpIHsKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmV0ZGV2LCAiZGVidWdmc19jcmVhdGVfZGlyIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInhnbWFjX3JlZ2lzdGVyIiwgMDYwMCwKKwkJCQkgICAgcGRhdGEtPnhnYmVfZGVidWdmcywgcGRhdGEsCisJCQkJICAgICZ4Z21hY19yZWdfYWRkcl9mb3BzKTsKKwlpZiAoIXBmaWxlKQorCQluZXRkZXZfZXJyKHBkYXRhLT5uZXRkZXYsICJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisKKwlwZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInhnbWFjX3JlZ2lzdGVyX3ZhbHVlIiwgMDYwMCwKKwkJCQkgICAgcGRhdGEtPnhnYmVfZGVidWdmcywgcGRhdGEsCisJCQkJICAgICZ4Z21hY19yZWdfdmFsdWVfZm9wcyk7CisJaWYgKCFwZmlsZSkKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmV0ZGV2LCAiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCisJcGZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ4cGNzX21tZCIsIDA2MDAsCisJCQkJICAgIHBkYXRhLT54Z2JlX2RlYnVnZnMsIHBkYXRhLAorCQkJCSAgICAmeHBjc19tbWRfZm9wcyk7CisJaWYgKCFwZmlsZSkKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmV0ZGV2LCAiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCisJcGZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ4cGNzX3JlZ2lzdGVyIiwgMDYwMCwKKwkJCQkgICAgcGRhdGEtPnhnYmVfZGVidWdmcywgcGRhdGEsCisJCQkJICAgICZ4cGNzX3JlZ19hZGRyX2ZvcHMpOworCWlmICghcGZpbGUpCisJCW5ldGRldl9lcnIocGRhdGEtPm5ldGRldiwgImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKKworCXBmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgieHBjc19yZWdpc3Rlcl92YWx1ZSIsIDA2MDAsCisJCQkJICAgIHBkYXRhLT54Z2JlX2RlYnVnZnMsIHBkYXRhLAorCQkJCSAgICAmeHBjc19yZWdfdmFsdWVfZm9wcyk7CisJaWYgKCFwZmlsZSkKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmV0ZGV2LCAiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCisJa2ZyZWUoYnVmKTsKK30KKwordm9pZCB4Z2JlX2RlYnVnZnNfZXhpdChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHBkYXRhLT54Z2JlX2RlYnVnZnMpOworCXBkYXRhLT54Z2JlX2RlYnVnZnMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kZXNjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRlc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjFjODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kZXNjLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBBTUQgMTBHYiBFdGhlcm5ldCBkcml2ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgZm9sbG93aW5nIHR3bworICogbGljZW5zZXM6CisgKgorICogTGljZW5zZSAxOiBHUEx2MgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgY29weSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBMaWNlbnNlIDI6IE1vZGlmaWVkIEJTRAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqICAgICBUaGUgU3lub3BzeXMgRFdDIEVUSEVSIFhHTUFDIFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbgorICogICAgIChoZXJlaW5hZnRlciAiU29mdHdhcmUiKSBpcyBhbiB1bnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLAorICogICAgIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cworICogICAgIGFuZCB5b3UuCisgKgorICogICAgIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiAgICAgdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQKKyAqICAgICBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5CisgKiAgICAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICAgYW5ub3RhdGVkIHdpdGggdGhpcyBsaWNlbnNlIGFuZCB0aGUgU29mdHdhcmUsIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCisgKiAgICAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAqICAgICB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiAgICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqICAgICBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogICAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTCisgKiAgICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgInhnYmUuaCIKKyNpbmNsdWRlICJ4Z2JlLWNvbW1vbi5oIgorCisKK3N0YXRpYyB2b2lkIHhnYmVfdW5tYXBfc2tiKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqKTsKKworc3RhdGljIHZvaWQgeGdiZV9mcmVlX3Jpbmcoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorCQkJICAgc3RydWN0IHhnYmVfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFyaW5nKQorCQlyZXR1cm47CisKKwlpZiAocmluZy0+cmRhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJpbmctPnJkZXNjX2NvdW50OyBpKyspIHsKKwkJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBpKTsKKwkJCXhnYmVfdW5tYXBfc2tiKHBkYXRhLCByZGF0YSk7CisJCX0KKworCQlrZnJlZShyaW5nLT5yZGF0YSk7CisJCXJpbmctPnJkYXRhID0gTlVMTDsKKwl9CisKKwlpZiAocmluZy0+cmRlc2MpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocGRhdGEtPmRldiwKKwkJCQkgIChzaXplb2Yoc3RydWN0IHhnYmVfcmluZ19kZXNjKSAqCisJCQkJICAgcmluZy0+cmRlc2NfY291bnQpLAorCQkJCSAgcmluZy0+cmRlc2MsIHJpbmctPnJkZXNjX2RtYSk7CisJCXJpbmctPnJkZXNjID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCURCR1BSKCItLT54Z2JlX2ZyZWVfcmluZ19yZXNvdXJjZXNcbiIpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJeGdiZV9mcmVlX3JpbmcocGRhdGEsIGNoYW5uZWwtPnR4X3JpbmcpOworCQl4Z2JlX2ZyZWVfcmluZyhwZGF0YSwgY2hhbm5lbC0+cnhfcmluZyk7CisJfQorCisJREJHUFIoIjwtLXhnYmVfZnJlZV9yaW5nX3Jlc291cmNlc1xuIik7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9pbml0X3Jpbmcoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorCQkJICBzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nLCB1bnNpZ25lZCBpbnQgcmRlc2NfY291bnQpCit7CisJREJHUFIoIi0tPnhnYmVfaW5pdF9yaW5nXG4iKTsKKworCWlmICghcmluZykKKwkJcmV0dXJuIDA7CisKKwkvKiBEZXNjcmlwdG9ycyAqLworCXJpbmctPnJkZXNjX2NvdW50ID0gcmRlc2NfY291bnQ7CisJcmluZy0+cmRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQocGRhdGEtPmRldiwKKwkJCQkJIChzaXplb2Yoc3RydWN0IHhnYmVfcmluZ19kZXNjKSAqCisJCQkJCSAgcmRlc2NfY291bnQpLCAmcmluZy0+cmRlc2NfZG1hLAorCQkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nLT5yZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEZXNjcmlwdG9yIGluZm9ybWF0aW9uICovCisJcmluZy0+cmRhdGEgPSBrY2FsbG9jKHJkZXNjX2NvdW50LCBzaXplb2Yoc3RydWN0IHhnYmVfcmluZ19kYXRhKSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghcmluZy0+cmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJREJHUFIoIiAgICByZGVzYz0weCVwLCByZGVzY19kbWE9MHglbGx4LCByZGF0YT0weCVwXG4iLAorCSAgICAgIHJpbmctPnJkZXNjLCByaW5nLT5yZGVzY19kbWEsIHJpbmctPnJkYXRhKTsKKworCURCR1BSKCI8LS14Z2JlX2luaXRfcmluZ1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2FsbG9jX3JpbmdfcmVzb3VyY2VzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlEQkdQUigiLS0+eGdiZV9hbGxvY19yaW5nX3Jlc291cmNlc1xuIik7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlEQkdQUigiICAlcyAtIHR4X3Jpbmc6XG4iLCBjaGFubmVsLT5uYW1lKTsKKwkJcmV0ID0geGdiZV9pbml0X3JpbmcocGRhdGEsIGNoYW5uZWwtPnR4X3JpbmcsCisJCQkJICAgICBwZGF0YS0+dHhfZGVzY19jb3VudCk7CisJCWlmIChyZXQpIHsKKwkJCW5ldGRldl9hbGVydChwZGF0YS0+bmV0ZGV2LAorCQkJCSAgICAgImVycm9yIGluaXRpYWxpemluZyBUeCByaW5nXG4iKTsKKwkJCWdvdG8gZXJyX3Jpbmc7CisJCX0KKworCQlEQkdQUigiICAlcyAtIHJ4X3Jpbmc6XG4iLCBjaGFubmVsLT5uYW1lKTsKKwkJcmV0ID0geGdiZV9pbml0X3JpbmcocGRhdGEsIGNoYW5uZWwtPnJ4X3JpbmcsCisJCQkJICAgICBwZGF0YS0+cnhfZGVzY19jb3VudCk7CisJCWlmIChyZXQpIHsKKwkJCW5ldGRldl9hbGVydChwZGF0YS0+bmV0ZGV2LAorCQkJCSAgICAgImVycm9yIGluaXRpYWxpemluZyBUeCByaW5nXG4iKTsKKwkJCWdvdG8gZXJyX3Jpbmc7CisJCX0KKwl9CisKKwlEQkdQUigiPC0teGdiZV9hbGxvY19yaW5nX3Jlc291cmNlc1xuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX3Jpbmc6CisJeGdiZV9mcmVlX3JpbmdfcmVzb3VyY2VzKHBkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfd3JhcHBlcl90eF9kZXNjcmlwdG9yX2luaXQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nOworCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CisJc3RydWN0IHhnYmVfcmluZ19kZXNjICpyZGVzYzsKKwlkbWFfYWRkcl90IHJkZXNjX2RtYTsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCURCR1BSKCItLT54Z2JlX3dyYXBwZXJfdHhfZGVzY3JpcHRvcl9pbml0XG4iKTsKKworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCXJpbmcgPSBjaGFubmVsLT50eF9yaW5nOworCQlpZiAoIXJpbmcpCisJCQlicmVhazsKKworCQlyZGVzYyA9IHJpbmctPnJkZXNjOworCQlyZGVzY19kbWEgPSByaW5nLT5yZGVzY19kbWE7CisKKwkJZm9yIChqID0gMDsgaiA8IHJpbmctPnJkZXNjX2NvdW50OyBqKyspIHsKKwkJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBqKTsKKworCQkJcmRhdGEtPnJkZXNjID0gcmRlc2M7CisJCQlyZGF0YS0+cmRlc2NfZG1hID0gcmRlc2NfZG1hOworCisJCQlyZGVzYysrOworCQkJcmRlc2NfZG1hICs9IHNpemVvZihzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MpOworCQl9CisKKwkJcmluZy0+Y3VyID0gMDsKKwkJcmluZy0+ZGlydHkgPSAwOworCQlyaW5nLT50eC5xdWV1ZV9zdG9wcGVkID0gMDsKKworCQlod19pZi0+dHhfZGVzY19pbml0KGNoYW5uZWwpOworCX0KKworCURCR1BSKCI8LS14Z2JlX3dyYXBwZXJfdHhfZGVzY3JpcHRvcl9pbml0XG4iKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV93cmFwcGVyX3J4X2Rlc2NyaXB0b3JfaW5pdChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmc7CisJc3RydWN0IHhnYmVfcmluZ19kZXNjICpyZGVzYzsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhOworCWRtYV9hZGRyX3QgcmRlc2NfZG1hLCBza2JfZG1hOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXVuc2lnbmVkIGludCBpLCBqOworCisJREJHUFIoIi0tPnhnYmVfd3JhcHBlcl9yeF9kZXNjcmlwdG9yX2luaXRcbiIpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJcmluZyA9IGNoYW5uZWwtPnJ4X3Jpbmc7CisJCWlmICghcmluZykKKwkJCWJyZWFrOworCisJCXJkZXNjID0gcmluZy0+cmRlc2M7CisJCXJkZXNjX2RtYSA9IHJpbmctPnJkZXNjX2RtYTsKKworCQlmb3IgKGogPSAwOyBqIDwgcmluZy0+cmRlc2NfY291bnQ7IGorKykgeworCQkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIGopOworCisJCQlyZGF0YS0+cmRlc2MgPSByZGVzYzsKKwkJCXJkYXRhLT5yZGVzY19kbWEgPSByZGVzY19kbWE7CisKKwkJCS8qIEFsbG9jYXRlIHNrYiAmIGFzc2lnbiB0byBlYWNoIHJkZXNjICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBkYXRhLT5yeF9idWZfc2l6ZSk7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlza2JfZG1hID0gZG1hX21hcF9zaW5nbGUocGRhdGEtPmRldiwgc2tiLT5kYXRhLAorCQkJCQkJIHBkYXRhLT5yeF9idWZfc2l6ZSwKKwkJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHBkYXRhLT5kZXYsIHNrYl9kbWEpKSB7CisJCQkJbmV0ZGV2X2FsZXJ0KHBkYXRhLT5uZXRkZXYsCisJCQkJCSAgICAgImZhaWxlZCB0byBkbyB0aGUgZG1hIG1hcFxuIik7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJkYXRhLT5za2IgPSBza2I7CisJCQlyZGF0YS0+c2tiX2RtYSA9IHNrYl9kbWE7CisJCQlyZGF0YS0+c2tiX2RtYV9sZW4gPSBwZGF0YS0+cnhfYnVmX3NpemU7CisKKwkJCXJkZXNjKys7CisJCQlyZGVzY19kbWEgKz0gc2l6ZW9mKHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyk7CisJCX0KKworCQlyaW5nLT5jdXIgPSAwOworCQlyaW5nLT5kaXJ0eSA9IDA7CisJCXJpbmctPnJ4LnJlYWxsb2NfaW5kZXggPSAwOworCQlyaW5nLT5yeC5yZWFsbG9jX3RocmVzaG9sZCA9IDA7CisKKwkJaHdfaWYtPnJ4X2Rlc2NfaW5pdChjaGFubmVsKTsKKwl9CisKKwlEQkdQUigiPC0teGdiZV93cmFwcGVyX3J4X2Rlc2NyaXB0b3JfaW5pdFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfdW5tYXBfc2tiKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSwKKwkJCSAgIHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGEpCit7CisJaWYgKHJkYXRhLT5za2JfZG1hKSB7CisJCWlmIChyZGF0YS0+bWFwcGVkX2FzX3BhZ2UpIHsKKwkJCWRtYV91bm1hcF9wYWdlKHBkYXRhLT5kZXYsIHJkYXRhLT5za2JfZG1hLAorCQkJCSAgICAgICByZGF0YS0+c2tiX2RtYV9sZW4sIERNQV9UT19ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJZG1hX3VubWFwX3NpbmdsZShwZGF0YS0+ZGV2LCByZGF0YS0+c2tiX2RtYSwKKwkJCQkJIHJkYXRhLT5za2JfZG1hX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCX0KKwkJcmRhdGEtPnNrYl9kbWEgPSAwOworCQlyZGF0YS0+c2tiX2RtYV9sZW4gPSAwOworCX0KKworCWlmIChyZGF0YS0+c2tiKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHJkYXRhLT5za2IpOworCQlyZGF0YS0+c2tiID0gTlVMTDsKKwl9CisKKwlyZGF0YS0+dHNvX2hlYWRlciA9IDA7CisJcmRhdGEtPmxlbiA9IDA7CisJcmRhdGEtPmludGVycnVwdCA9IDA7CisJcmRhdGEtPm1hcHBlZF9hc19wYWdlID0gMDsKK30KKworc3RhdGljIGludCB4Z2JlX21hcF90eF9za2Ioc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBjaGFubmVsLT5wZGF0YTsKKwlzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nID0gY2hhbm5lbC0+dHhfcmluZzsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhOworCXN0cnVjdCB4Z2JlX3BhY2tldF9kYXRhICpwYWNrZXQ7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwlkbWFfYWRkcl90IHNrYl9kbWE7CisJdW5zaWduZWQgaW50IHN0YXJ0X2luZGV4LCBjdXJfaW5kZXg7CisJdW5zaWduZWQgaW50IG9mZnNldCwgdHNvLCB2bGFuLCBkYXRhbGVuLCBsZW47CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdQUigiLS0+eGdiZV9tYXBfdHhfc2tiOiBjdXIgPSAlZFxuIiwgcmluZy0+Y3VyKTsKKworCW9mZnNldCA9IDA7CisJc3RhcnRfaW5kZXggPSByaW5nLT5jdXI7CisJY3VyX2luZGV4ID0gcmluZy0+Y3VyOworCisJcGFja2V0ID0gJnJpbmctPnBhY2tldF9kYXRhOworCXBhY2tldC0+cmRlc2NfY291bnQgPSAwOworCXBhY2tldC0+bGVuZ3RoID0gMDsKKworCXRzbyA9IFhHTUFDX0dFVF9CSVRTKHBhY2tldC0+YXR0cmlidXRlcywgVFhfUEFDS0VUX0FUVFJJQlVURVMsCisJCQkgICAgIFRTT19FTkFCTEUpOworCXZsYW4gPSBYR01BQ19HRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFRYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJICAgICAgVkxBTl9DVEFHKTsKKworCS8qIFNhdmUgc3BhY2UgZm9yIGEgY29udGV4dCBkZXNjcmlwdG9yIGlmIG5lZWRlZCAqLworCWlmICgodHNvICYmIChwYWNrZXQtPm1zcyAhPSByaW5nLT50eC5jdXJfbXNzKSkgfHwKKwkgICAgKHZsYW4gJiYgKHBhY2tldC0+dmxhbl9jdGFnICE9IHJpbmctPnR4LmN1cl92bGFuX2N0YWcpKSkKKwkJY3VyX2luZGV4Kys7CisJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIGN1cl9pbmRleCk7CisKKwlpZiAodHNvKSB7CisJCURCR1BSKCIgIFRTTyBwYWNrZXRcbiIpOworCisJCS8qIE1hcCB0aGUgVFNPIGhlYWRlciAqLworCQlza2JfZG1hID0gZG1hX21hcF9zaW5nbGUocGRhdGEtPmRldiwgc2tiLT5kYXRhLAorCQkJCQkgcGFja2V0LT5oZWFkZXJfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHBkYXRhLT5kZXYsIHNrYl9kbWEpKSB7CisJCQluZXRkZXZfYWxlcnQocGRhdGEtPm5ldGRldiwgImRtYV9tYXBfc2luZ2xlIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJcmRhdGEtPnNrYl9kbWEgPSBza2JfZG1hOworCQlyZGF0YS0+c2tiX2RtYV9sZW4gPSBwYWNrZXQtPmhlYWRlcl9sZW47CisJCXJkYXRhLT50c29faGVhZGVyID0gMTsKKworCQlvZmZzZXQgPSBwYWNrZXQtPmhlYWRlcl9sZW47CisKKwkJcGFja2V0LT5sZW5ndGggKz0gcGFja2V0LT5oZWFkZXJfbGVuOworCisJCWN1cl9pbmRleCsrOworCQlyZGF0YSA9IEdFVF9ERVNDX0RBVEEocmluZywgY3VyX2luZGV4KTsKKwl9CisKKwkvKiBNYXAgdGhlIChyZW1haW5kZXIgb2YgdGhlKSBwYWNrZXQgKi8KKwlmb3IgKGRhdGFsZW4gPSBza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0OyBkYXRhbGVuOyApIHsKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBkYXRhbGVuLCBUWF9NQVhfQlVGX1NJWkUpOworCisJCXNrYl9kbWEgPSBkbWFfbWFwX3NpbmdsZShwZGF0YS0+ZGV2LCBza2ItPmRhdGEgKyBvZmZzZXQsIGxlbiwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocGRhdGEtPmRldiwgc2tiX2RtYSkpIHsKKwkJCW5ldGRldl9hbGVydChwZGF0YS0+bmV0ZGV2LCAiZG1hX21hcF9zaW5nbGUgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlyZGF0YS0+c2tiX2RtYSA9IHNrYl9kbWE7CisJCXJkYXRhLT5za2JfZG1hX2xlbiA9IGxlbjsKKwkJREJHUFIoIiAgc2tiIGRhdGE6IGluZGV4PSV1LCBkbWE9MHglbGx4LCBsZW49JXVcbiIsCisJCSAgICAgIGN1cl9pbmRleCwgc2tiX2RtYSwgbGVuKTsKKworCQlkYXRhbGVuIC09IGxlbjsKKwkJb2Zmc2V0ICs9IGxlbjsKKworCQlwYWNrZXQtPmxlbmd0aCArPSBsZW47CisKKwkJY3VyX2luZGV4Kys7CisJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBjdXJfaW5kZXgpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJREJHUFIoIiAgbWFwcGluZyBmcmFnICV1XG4iLCBpKTsKKworCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCW9mZnNldCA9IDA7CisKKwkJZm9yIChkYXRhbGVuID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsgZGF0YWxlbjsgKSB7CisJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFsZW4sIFRYX01BWF9CVUZfU0laRSk7CisKKwkJCXNrYl9kbWEgPSBza2JfZnJhZ19kbWFfbWFwKHBkYXRhLT5kZXYsIGZyYWcsIG9mZnNldCwKKwkJCQkJCSAgIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocGRhdGEtPmRldiwgc2tiX2RtYSkpIHsKKwkJCQluZXRkZXZfYWxlcnQocGRhdGEtPm5ldGRldiwKKwkJCQkJICAgICAic2tiX2ZyYWdfZG1hX21hcCBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCXJkYXRhLT5za2JfZG1hID0gc2tiX2RtYTsKKwkJCXJkYXRhLT5za2JfZG1hX2xlbiA9IGxlbjsKKwkJCXJkYXRhLT5tYXBwZWRfYXNfcGFnZSA9IDE7CisJCQlEQkdQUigiICBza2IgZGF0YTogaW5kZXg9JXUsIGRtYT0weCVsbHgsIGxlbj0ldVxuIiwKKwkJCSAgICAgIGN1cl9pbmRleCwgc2tiX2RtYSwgbGVuKTsKKworCQkJZGF0YWxlbiAtPSBsZW47CisJCQlvZmZzZXQgKz0gbGVuOworCisJCQlwYWNrZXQtPmxlbmd0aCArPSBsZW47CisKKwkJCWN1cl9pbmRleCsrOworCQkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIGN1cl9pbmRleCk7CisJCX0KKwl9CisKKwkvKiBTYXZlIHRoZSBza2IgYWRkcmVzcyBpbiB0aGUgbGFzdCBlbnRyeSAqLworCXJkYXRhLT5za2IgPSBza2I7CisKKwkvKiBTYXZlIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBlbnRyaWVzIHVzZWQgKi8KKwlwYWNrZXQtPnJkZXNjX2NvdW50ID0gY3VyX2luZGV4IC0gc3RhcnRfaW5kZXg7CisKKwlEQkdQUigiPC0teGdiZV9tYXBfdHhfc2tiOiBjb3VudD0ldVxuIiwgcGFja2V0LT5yZGVzY19jb3VudCk7CisKKwlyZXR1cm4gcGFja2V0LT5yZGVzY19jb3VudDsKKworZXJyX291dDoKKwl3aGlsZSAoc3RhcnRfaW5kZXggPCBjdXJfaW5kZXgpIHsKKwkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIHN0YXJ0X2luZGV4KyspOworCQl4Z2JlX3VubWFwX3NrYihwZGF0YSwgcmRhdGEpOworCX0KKworCURCR1BSKCI8LS14Z2JlX21hcF90eF9za2I6IGNvdW50PTBcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcmVhbGxvY19za2Ioc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBjaGFubmVsLT5wZGF0YTsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcgPSBjaGFubmVsLT5yeF9yaW5nOworCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJZG1hX2FkZHJfdCBza2JfZG1hOworCWludCBpOworCisJREJHUFIoIi0tPnhnYmVfcmVhbGxvY19za2I6IHJ4X3JpbmctPnJ4LnJlYWxsb2NfaW5kZXggPSAldVxuIiwKKwkgICAgICByaW5nLT5yeC5yZWFsbG9jX2luZGV4KTsKKworCWZvciAoaSA9IDA7IGkgPCByaW5nLT5kaXJ0eTsgaSsrKSB7CisJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5yeC5yZWFsbG9jX2luZGV4KTsKKworCQkvKiBSZXNldCByZGF0YSB2YWx1ZXMgKi8KKwkJeGdiZV91bm1hcF9za2IocGRhdGEsIHJkYXRhKTsKKworCQkvKiBBbGxvY2F0ZSBza2IgJiBhc3NpZ24gdG8gZWFjaCByZGVzYyAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBkYXRhLT5yeF9idWZfc2l6ZSk7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJbmV0ZGV2X2FsZXJ0KHBkYXRhLT5uZXRkZXYsCisJCQkJICAgICAiZmFpbGVkIHRvIGFsbG9jYXRlIHNrYlxuIik7CisJCQlicmVhazsKKwkJfQorCQlza2JfZG1hID0gZG1hX21hcF9zaW5nbGUocGRhdGEtPmRldiwgc2tiLT5kYXRhLAorCQkJCQkgcGRhdGEtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocGRhdGEtPmRldiwgc2tiX2RtYSkpIHsKKwkJCW5ldGRldl9hbGVydChwZGF0YS0+bmV0ZGV2LAorCQkJCSAgICAgImZhaWxlZCB0byBkbyB0aGUgZG1hIG1hcFxuIik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJYnJlYWs7CisJCX0KKwkJcmRhdGEtPnNrYiA9IHNrYjsKKwkJcmRhdGEtPnNrYl9kbWEgPSBza2JfZG1hOworCQlyZGF0YS0+c2tiX2RtYV9sZW4gPSBwZGF0YS0+cnhfYnVmX3NpemU7CisKKwkJaHdfaWYtPnJ4X2Rlc2NfcmVzZXQocmRhdGEpOworCisJCXJpbmctPnJ4LnJlYWxsb2NfaW5kZXgrKzsKKwl9CisJcmluZy0+ZGlydHkgPSAwOworCisJREJHUFIoIjwtLXhnYmVfcmVhbGxvY19za2JcbiIpOworfQorCit2b2lkIHhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX2Rlc2Moc3RydWN0IHhnYmVfZGVzY19pZiAqZGVzY19pZikKK3sKKwlEQkdQUigiLS0+eGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGVzY1xuIik7CisKKwlkZXNjX2lmLT5hbGxvY19yaW5nX3Jlc291cmNlcyA9IHhnYmVfYWxsb2NfcmluZ19yZXNvdXJjZXM7CisJZGVzY19pZi0+ZnJlZV9yaW5nX3Jlc291cmNlcyA9IHhnYmVfZnJlZV9yaW5nX3Jlc291cmNlczsKKwlkZXNjX2lmLT5tYXBfdHhfc2tiID0geGdiZV9tYXBfdHhfc2tiOworCWRlc2NfaWYtPnJlYWxsb2Nfc2tiID0geGdiZV9yZWFsbG9jX3NrYjsKKwlkZXNjX2lmLT51bm1hcF9za2IgPSB4Z2JlX3VubWFwX3NrYjsKKwlkZXNjX2lmLT53cmFwcGVyX3R4X2Rlc2NfaW5pdCA9IHhnYmVfd3JhcHBlcl90eF9kZXNjcmlwdG9yX2luaXQ7CisJZGVzY19pZi0+d3JhcHBlcl9yeF9kZXNjX2luaXQgPSB4Z2JlX3dyYXBwZXJfcnhfZGVzY3JpcHRvcl9pbml0OworCisJREJHUFIoIjwtLXhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX2Rlc2NcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyMjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGV2LmMKQEAgLTAsMCArMSwyMTgyIEBACisvKgorICogQU1EIDEwR2IgRXRoZXJuZXQgZHJpdmVyCisgKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIGZvbGxvd2luZyB0d28KKyAqIGxpY2Vuc2VzOgorICoKKyAqIExpY2Vuc2UgMTogR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IGNvcHksIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogTGljZW5zZSAyOiBNb2RpZmllZCBCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgInhnYmUuaCIKKyNpbmNsdWRlICJ4Z2JlLWNvbW1vbi5oIgorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGdiZV91c2VjX3RvX3Jpd3Qoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1c2VjKQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJREJHUFIoIi0tPnhnYmVfdXNlY190b19yaXd0XG4iKTsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGRhdGEtPnN5c2Nsb2NrKTsKKworCS8qCisJICogQ29udmVydCB0aGUgaW5wdXQgdXNlYyB2YWx1ZSB0byB0aGUgd2F0Y2hkb2cgdGltZXIgdmFsdWUuIEVhY2gKKwkgKiB3YXRjaGRvZyB0aW1lciB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIDI1NiBjbG9jayBjeWNsZXMuCisJICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCB2YWx1ZSBhczoKKwkgKiAgICggdXNlYyAqICggc3lzdGVtX2Nsb2NrX21oeiAvIDEwXjYgKSAvIDI1NgorCSAqLworCXJldCA9ICh1c2VjICogKHJhdGUgLyAxMDAwMDAwKSkgLyAyNTY7CisKKwlEQkdQUigiPC0teGdiZV91c2VjX3RvX3Jpd3RcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4Z2JlX3Jpd3RfdG9fdXNlYyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHJpd3QpCit7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlEQkdQUigiLS0+eGdiZV9yaXd0X3RvX3VzZWNcbiIpOworCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShwZGF0YS0+c3lzY2xvY2spOworCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBpbnB1dCB3YXRjaGRvZyB0aW1lciB2YWx1ZSB0byB0aGUgdXNlYyB2YWx1ZS4gRWFjaAorCSAqIHdhdGNoZG9nIHRpbWVyIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gMjU2IGNsb2NrIGN5Y2xlcy4KKwkgKiBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHZhbHVlIGFzOgorCSAqICAgKCByaXd0ICogMjU2ICkgLyAoIHN5c3RlbV9jbG9ja19taHogLyAxMF42ICkKKwkgKi8KKwlyZXQgPSAocml3dCAqIDI1NikgLyAocmF0ZSAvIDEwMDAwMDApOworCisJREJHUFIoIjwtLXhnYmVfcml3dF90b191c2VjXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jb25maWdfcGJseDgoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGk7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfQ1IsIFBCTFg4LAorCQkJCSAgICAgICBwZGF0YS0+cGJseDgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9nZXRfdHhfcGJsX3ZhbChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJcmV0dXJuIFhHTUFDX0RNQV9JT1JFQURfQklUUyhwZGF0YS0+Y2hhbm5lbCwgRE1BX0NIX1RDUiwgUEJMKTsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ190eF9wYmxfdmFsKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKCFjaGFubmVsLT50eF9yaW5nKQorCQkJYnJlYWs7CisKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfVENSLCBQQkwsCisJCQkJICAgICAgIHBkYXRhLT50eF9wYmwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfZ2V0X3J4X3BibF92YWwoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXJldHVybiBYR01BQ19ETUFfSU9SRUFEX0JJVFMocGRhdGEtPmNoYW5uZWwsIERNQV9DSF9SQ1IsIFBCTCk7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jb25maWdfcnhfcGJsX3ZhbChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCWlmICghY2hhbm5lbC0+cnhfcmluZykKKwkJCWJyZWFrOworCisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX1JDUiwgUEJMLAorCQkJCSAgICAgICBwZGF0YS0+cnhfcGJsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ19vc3BfbW9kZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCWlmICghY2hhbm5lbC0+dHhfcmluZykKKwkJCWJyZWFrOworCisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX1RDUiwgT1NQLAorCQkJCSAgICAgICBwZGF0YS0+dHhfb3NwX21vZGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfY29uZmlnX3JzZl9tb2RlKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+aHdfZmVhdC5yeF9xX2NudDsgaSsrKQorCQlYR01BQ19NVExfSU9XUklURV9CSVRTKHBkYXRhLCBpLCBNVExfUV9SUU9NUiwgUlNGLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jb25maWdfdHNmX21vZGUoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnR4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1RRT01SLCBUU0YsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ19yeF90aHJlc2hvbGQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnJ4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1JRT01SLCBSVEMsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ190eF90aHJlc2hvbGQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnR4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1RRT01SLCBUVEMsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ19yeF9jb2FsZXNjZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCWlmICghY2hhbm5lbC0+cnhfcmluZykKKwkJCWJyZWFrOworCisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX1JJV1QsIFJXVCwKKwkJCQkgICAgICAgcGRhdGEtPnJ4X3Jpd3QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfY29uZmlnX3R4X2NvYWxlc2NlKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfcnhfYnVmZmVyX3NpemUoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGk7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnJ4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9SQ1IsIFJCU1osCisJCQkJICAgICAgIHBkYXRhLT5yeF9idWZfc2l6ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ190c29fbW9kZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCWlmICghY2hhbm5lbC0+dHhfcmluZykKKwkJCWJyZWFrOworCisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX1RDUiwgVFNFLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9kaXNhYmxlX3R4X2Zsb3dfY29udHJvbChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IG1heF9xX2NvdW50LCBxX2NvdW50OworCXVuc2lnbmVkIGludCByZWcsIHJlZ192YWw7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDbGVhciBNVEwgZmxvdyBjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnJ4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1JRT01SLCBFSEZDLCAwKTsKKworCS8qIENsZWFyIE1BQyBmbG93IGNvbnRyb2wgKi8KKwltYXhfcV9jb3VudCA9IFhHTUFDX01BWF9GTE9XX0NPTlRST0xfUVVFVUVTOworCXFfY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHBkYXRhLT5od19mZWF0LnJ4X3FfY250LCBtYXhfcV9jb3VudCk7CisJcmVnID0gTUFDX1EwVEZDUjsKKwlmb3IgKGkgPSAwOyBpIDwgcV9jb3VudDsgaSsrKSB7CisJCXJlZ192YWwgPSBYR01BQ19JT1JFQUQocGRhdGEsIHJlZyk7CisJCVhHTUFDX1NFVF9CSVRTKHJlZ192YWwsIE1BQ19RMFRGQ1IsIFRGRSwgMCk7CisJCVhHTUFDX0lPV1JJVEUocGRhdGEsIHJlZywgcmVnX3ZhbCk7CisKKwkJcmVnICs9IE1BQ19RVEZDUl9JTkM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9lbmFibGVfdHhfZmxvd19jb250cm9sKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X3FfY291bnQsIHFfY291bnQ7CisJdW5zaWduZWQgaW50IHJlZywgcmVnX3ZhbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFNldCBNVEwgZmxvdyBjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnJ4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1JRT01SLCBFSEZDLCAxKTsKKworCS8qIFNldCBNQUMgZmxvdyBjb250cm9sICovCisJbWF4X3FfY291bnQgPSBYR01BQ19NQVhfRkxPV19DT05UUk9MX1FVRVVFUzsKKwlxX2NvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCBwZGF0YS0+aHdfZmVhdC5yeF9xX2NudCwgbWF4X3FfY291bnQpOworCXJlZyA9IE1BQ19RMFRGQ1I7CisJZm9yIChpID0gMDsgaSA8IHFfY291bnQ7IGkrKykgeworCQlyZWdfdmFsID0gWEdNQUNfSU9SRUFEKHBkYXRhLCByZWcpOworCisJCS8qIEVuYWJsZSB0cmFuc21pdCBmbG93IGNvbnRyb2wgKi8KKwkJWEdNQUNfU0VUX0JJVFMocmVnX3ZhbCwgTUFDX1EwVEZDUiwgVEZFLCAxKTsKKwkJLyogU2V0IHBhdXNlIHRpbWUgKi8KKwkJWEdNQUNfU0VUX0JJVFMocmVnX3ZhbCwgTUFDX1EwVEZDUiwgUFQsIDB4ZmZmZik7CisKKwkJWEdNQUNfSU9XUklURShwZGF0YSwgcmVnLCByZWdfdmFsKTsKKworCQlyZWcgKz0gTUFDX1FURkNSX0lOQzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2Rpc2FibGVfcnhfZmxvd19jb250cm9sKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19SRkNSLCBSRkUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9lbmFibGVfcnhfZmxvd19jb250cm9sKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19SRkNSLCBSRkUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jb25maWdfdHhfZmxvd19jb250cm9sKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlpZiAocGRhdGEtPnR4X3BhdXNlKQorCQl4Z2JlX2VuYWJsZV90eF9mbG93X2NvbnRyb2wocGRhdGEpOworCWVsc2UKKwkJeGdiZV9kaXNhYmxlX3R4X2Zsb3dfY29udHJvbChwZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2NvbmZpZ19yeF9mbG93X2NvbnRyb2woc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCWlmIChwZGF0YS0+cnhfcGF1c2UpCisJCXhnYmVfZW5hYmxlX3J4X2Zsb3dfY29udHJvbChwZGF0YSk7CisJZWxzZQorCQl4Z2JlX2Rpc2FibGVfcnhfZmxvd19jb250cm9sKHBkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ19mbG93X2NvbnRyb2woc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXhnYmVfY29uZmlnX3R4X2Zsb3dfY29udHJvbChwZGF0YSk7CisJeGdiZV9jb25maWdfcnhfZmxvd19jb250cm9sKHBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9lbmFibGVfZG1hX2ludGVycnVwdHMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGRtYV9jaF9pc3IsIGRtYV9jaF9pZXI7CisJdW5zaWduZWQgaW50IGk7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQkvKiBDbGVhciBhbGwgdGhlIGludGVycnVwdHMgd2hpY2ggYXJlIHNldCAqLworCQlkbWFfY2hfaXNyID0gWEdNQUNfRE1BX0lPUkVBRChjaGFubmVsLCBETUFfQ0hfU1IpOworCQlYR01BQ19ETUFfSU9XUklURShjaGFubmVsLCBETUFfQ0hfU1IsIGRtYV9jaF9pc3IpOworCisJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgKi8KKwkJZG1hX2NoX2llciA9IDA7CisKKwkJLyogRW5hYmxlIGZvbGxvd2luZyBpbnRlcnJ1cHRzCisJCSAqICAgTklFICAtIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSBFbmFibGUKKwkJICogICBBSUUgIC0gQWJub3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgRW5hYmxlCisJCSAqICAgRkJFRSAtIEZhdGFsIEJ1cyBFcnJvciBFbmFibGUKKwkJICovCisJCVhHTUFDX1NFVF9CSVRTKGRtYV9jaF9pZXIsIERNQV9DSF9JRVIsIE5JRSwgMSk7CisJCVhHTUFDX1NFVF9CSVRTKGRtYV9jaF9pZXIsIERNQV9DSF9JRVIsIEFJRSwgMSk7CisJCVhHTUFDX1NFVF9CSVRTKGRtYV9jaF9pZXIsIERNQV9DSF9JRVIsIEZCRUUsIDEpOworCisJCWlmIChjaGFubmVsLT50eF9yaW5nKSB7CisJCQkvKiBFbmFibGUgdGhlIGZvbGxvd2luZyBUeCBpbnRlcnJ1cHRzCisJCQkgKiAgIFRJRSAgLSBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlICh1bmxlc3MgcG9sbGluZykKKwkJCSAqLworCQkJWEdNQUNfU0VUX0JJVFMoZG1hX2NoX2llciwgRE1BX0NIX0lFUiwgVElFLCAxKTsKKwkJfQorCQlpZiAoY2hhbm5lbC0+cnhfcmluZykgeworCQkJLyogRW5hYmxlIGZvbGxvd2luZyBSeCBpbnRlcnJ1cHRzCisJCQkgKiAgIFJCVUUgLSBSZWNlaXZlIEJ1ZmZlciBVbmF2YWlsYWJsZSBFbmFibGUKKwkJCSAqICAgUklFICAtIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZQorCQkJICovCisJCQlYR01BQ19TRVRfQklUUyhkbWFfY2hfaWVyLCBETUFfQ0hfSUVSLCBSQlVFLCAxKTsKKwkJCVhHTUFDX1NFVF9CSVRTKGRtYV9jaF9pZXIsIERNQV9DSF9JRVIsIFJJRSwgMSk7CisJCX0KKworCQlYR01BQ19ETUFfSU9XUklURShjaGFubmVsLCBETUFfQ0hfSUVSLCBkbWFfY2hfaWVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZW5hYmxlX210bF9pbnRlcnJ1cHRzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgbXRsX3FfaXNyOworCXVuc2lnbmVkIGludCBxX2NvdW50LCBpOworCisJcV9jb3VudCA9IG1heChwZGF0YS0+aHdfZmVhdC50eF9xX2NudCwgcGRhdGEtPmh3X2ZlYXQucnhfcV9jbnQpOworCWZvciAoaSA9IDA7IGkgPCBxX2NvdW50OyBpKyspIHsKKwkJLyogQ2xlYXIgYWxsIHRoZSBpbnRlcnJ1cHRzIHdoaWNoIGFyZSBzZXQgKi8KKwkJbXRsX3FfaXNyID0gWEdNQUNfTVRMX0lPUkVBRChwZGF0YSwgaSwgTVRMX1FfSVNSKTsKKwkJWEdNQUNfTVRMX0lPV1JJVEUocGRhdGEsIGksIE1UTF9RX0lTUiwgbXRsX3FfaXNyKTsKKworCQkvKiBObyBNVEwgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkICovCisJCVhHTUFDX01UTF9JT1dSSVRFKHBkYXRhLCBpLCBNVExfUV9JU1IsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgeGdiZV9lbmFibGVfbWFjX2ludGVycnVwdHMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCS8qIE5vIE1BQyBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgKi8KKwlYR01BQ19JT1dSSVRFKHBkYXRhLCBNQUNfSUVSLCAwKTsKKworCS8qIEVuYWJsZSBhbGwgY291bnRlciBpbnRlcnJ1cHRzICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNTUNfUklFUiwgQUxMX0lOVEVSUlVQVFMsIDB4ZmYpOworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTU1DX1RJRVIsIEFMTF9JTlRFUlJVUFRTLCAweGZmKTsKK30KKworc3RhdGljIGludCB4Z2JlX3NldF9nbWlpX3NwZWVkKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19UQ1IsIFNTLCAweDMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfZ21paV8yNTAwX3NwZWVkKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19UQ1IsIFNTLCAweDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfeGdtaWlfc3BlZWQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1RDUiwgU1MsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB2YWwgPSBlbmFibGUgPyAxIDogMDsKKworCWlmIChYR01BQ19JT1JFQURfQklUUyhwZGF0YSwgTUFDX1BGUiwgUFIpID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwlEQkdQUigiICAlcyBwcm9taXNjdW91cyBtb2RlXG4iLCBlbmFibGUgPyAiZW50ZXJpbmciIDogImxlYXZpbmciKTsKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19QRlIsIFBSLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfYWxsX211bHRpY2FzdF9tb2RlKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gZW5hYmxlID8gMSA6IDA7CisKKwlpZiAoWEdNQUNfSU9SRUFEX0JJVFMocGRhdGEsIE1BQ19QRlIsIFBNKSA9PSB2YWwpCisJCXJldHVybiAwOworCisJREJHUFIoIiAgJXMgYWxsbXVsdGkgbW9kZVxuIiwgZW5hYmxlID8gImVudGVyaW5nIiA6ICJsZWF2aW5nIik7CisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUEZSLCBQTSwgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfc2V0X2FkZG5fbWFjX2FkZHJzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYW1fbW9kZSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCXVuc2lnbmVkIGludCBtYWNfcmVnOworCXVuc2lnbmVkIGludCBtYWNfYWRkcl9oaSwgbWFjX2FkZHJfbG87CisJdTggKm1hY19hZGRyOworCXVuc2lnbmVkIGludCBpOworCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUEZSLCBIVUMsIDApOworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1BGUiwgSE1DLCAwKTsKKworCWkgPSAwOworCW1hY19yZWcgPSBNQUNfTUFDQTFIUjsKKworCW5ldGRldl9mb3JfZWFjaF91Y19hZGRyKGhhLCBwZGF0YS0+bmV0ZGV2KSB7CisJCW1hY19hZGRyX2xvID0gMDsKKwkJbWFjX2FkZHJfaGkgPSAwOworCQltYWNfYWRkciA9ICh1OCAqKSZtYWNfYWRkcl9sbzsKKwkJbWFjX2FkZHJbMF0gPSBoYS0+YWRkclswXTsKKwkJbWFjX2FkZHJbMV0gPSBoYS0+YWRkclsxXTsKKwkJbWFjX2FkZHJbMl0gPSBoYS0+YWRkclsyXTsKKwkJbWFjX2FkZHJbM10gPSBoYS0+YWRkclszXTsKKwkJbWFjX2FkZHIgPSAodTggKikmbWFjX2FkZHJfaGk7CisJCW1hY19hZGRyWzBdID0gaGEtPmFkZHJbNF07CisJCW1hY19hZGRyWzFdID0gaGEtPmFkZHJbNV07CisKKwkJREJHUFIoIiAgYWRkaW5nIHVuaWNhc3QgYWRkcmVzcyAlcE0gYXQgMHglMDR4XG4iLAorCQkgICAgICBoYS0+YWRkciwgbWFjX3JlZyk7CisKKwkJWEdNQUNfU0VUX0JJVFMobWFjX2FkZHJfaGksIE1BQ19NQUNBMUhSLCBBRSwgMSk7CisKKwkJWEdNQUNfSU9XUklURShwZGF0YSwgbWFjX3JlZywgbWFjX2FkZHJfaGkpOworCQltYWNfcmVnICs9IE1BQ19NQUNBX0lOQzsKKwkJWEdNQUNfSU9XUklURShwZGF0YSwgbWFjX3JlZywgbWFjX2FkZHJfbG8pOworCQltYWNfcmVnICs9IE1BQ19NQUNBX0lOQzsKKworCQlpKys7CisJfQorCisJaWYgKCFhbV9tb2RlKSB7CisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBwZGF0YS0+bmV0ZGV2KSB7CisJCQltYWNfYWRkcl9sbyA9IDA7CisJCQltYWNfYWRkcl9oaSA9IDA7CisJCQltYWNfYWRkciA9ICh1OCAqKSZtYWNfYWRkcl9sbzsKKwkJCW1hY19hZGRyWzBdID0gaGEtPmFkZHJbMF07CisJCQltYWNfYWRkclsxXSA9IGhhLT5hZGRyWzFdOworCQkJbWFjX2FkZHJbMl0gPSBoYS0+YWRkclsyXTsKKwkJCW1hY19hZGRyWzNdID0gaGEtPmFkZHJbM107CisJCQltYWNfYWRkciA9ICh1OCAqKSZtYWNfYWRkcl9oaTsKKwkJCW1hY19hZGRyWzBdID0gaGEtPmFkZHJbNF07CisJCQltYWNfYWRkclsxXSA9IGhhLT5hZGRyWzVdOworCisJCQlEQkdQUigiICBhZGRpbmcgbXVsdGljYXN0IGFkZHJlc3MgJXBNIGF0IDB4JTA0eFxuIiwKKwkJCSAgICAgIGhhLT5hZGRyLCBtYWNfcmVnKTsKKworCQkJWEdNQUNfU0VUX0JJVFMobWFjX2FkZHJfaGksIE1BQ19NQUNBMUhSLCBBRSwgMSk7CisKKwkJCVhHTUFDX0lPV1JJVEUocGRhdGEsIG1hY19yZWcsIG1hY19hZGRyX2hpKTsKKwkJCW1hY19yZWcgKz0gTUFDX01BQ0FfSU5DOworCQkJWEdNQUNfSU9XUklURShwZGF0YSwgbWFjX3JlZywgbWFjX2FkZHJfbG8pOworCQkJbWFjX3JlZyArPSBNQUNfTUFDQV9JTkM7CisKKwkJCWkrKzsKKwkJfQorCX0KKworCS8qIENsZWFyIHJlbWFpbmluZyBhZGRpdGlvbmFsIE1BQyBhZGRyZXNzIGVudHJpZXMgKi8KKwlmb3IgKDsgaSA8IHBkYXRhLT5od19mZWF0LmFkZG5fbWFjOyBpKyspIHsKKwkJWEdNQUNfSU9XUklURShwZGF0YSwgbWFjX3JlZywgMCk7CisJCW1hY19yZWcgKz0gTUFDX01BQ0FfSU5DOworCQlYR01BQ19JT1dSSVRFKHBkYXRhLCBtYWNfcmVnLCAwKTsKKwkJbWFjX3JlZyArPSBNQUNfTUFDQV9JTkM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLCB1OCAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFjX2FkZHJfaGksIG1hY19hZGRyX2xvOworCisJbWFjX2FkZHJfaGkgPSAoYWRkcls1XSA8PCAgOCkgfCAoYWRkcls0XSA8PCAgMCk7CisJbWFjX2FkZHJfbG8gPSAoYWRkclszXSA8PCAyNCkgfCAoYWRkclsyXSA8PCAxNikgfAorCQkgICAgICAoYWRkclsxXSA8PCAgOCkgfCAoYWRkclswXSA8PCAgMCk7CisKKwlYR01BQ19JT1dSSVRFKHBkYXRhLCBNQUNfTUFDQTBIUiwgbWFjX2FkZHJfaGkpOworCVhHTUFDX0lPV1JJVEUocGRhdGEsIE1BQ19NQUNBMExSLCBtYWNfYWRkcl9sbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX3JlYWRfbW1kX3JlZ3Moc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLCBpbnQgcHJ0YWQsCisJCQkgICAgICBpbnQgbW1kX3JlZykKK3sKKwl1bnNpZ25lZCBpbnQgbW1kX2FkZHJlc3M7CisJaW50IG1tZF9kYXRhOworCisJaWYgKG1tZF9yZWcgJiBNSUlfQUREUl9DNDUpCisJCW1tZF9hZGRyZXNzID0gbW1kX3JlZyAmIH5NSUlfQUREUl9DNDU7CisJZWxzZQorCQltbWRfYWRkcmVzcyA9IChwZGF0YS0+bWRpb19tbWQgPDwgMTYpIHwgKG1tZF9yZWcgJiAweGZmZmYpOworCisJLyogVGhlIFBDUyByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIHVzaW5nIG1taW8uIFRoZSB1bmRlcmx5aW5nIEFQQjMKKwkgKiBtYW5hZ2VtZW50IGludGVyZmFjZSB1c2VzIGluZGlyZWN0IGFkZHJlc3NpbmcgdG8gYWNjZXNzIHRoZSBNTUQKKwkgKiByZWdpc3RlciBzZXRzLiBUaGlzIHJlcXVpcmVzIGFjY2Vzc2luZyBvZiB0aGUgUENTIHJlZ2lzdGVyIGluIHR3bworCSAqIHBoYXNlcywgYW4gYWRkcmVzcyBwaGFzZSBhbmQgYSBkYXRhIHBoYXNlLgorCSAqCisJICogVGhlIG1taW8gaW50ZXJmYWNlIGlzIGJhc2VkIG9uIDMyLWJpdCBvZmZzZXRzIGFuZCB2YWx1ZXMuIEFsbAorCSAqIHJlZ2lzdGVyIG9mZnNldHMgbXVzdCB0aGVyZWZvcmUgYmUgYWRqdXN0ZWQgYnkgbGVmdCBzaGlmdGluZyB0aGUKKwkgKiBvZmZzZXQgMiBiaXRzIGFuZCByZWFkaW5nIDMyIGJpdHMgb2YgZGF0YS4KKwkgKi8KKwltdXRleF9sb2NrKCZwZGF0YS0+eHBjc19tdXRleCk7CisJWFBDU19JT1dSSVRFKHBkYXRhLCBQQ1NfTU1EX1NFTEVDVCA8PCAyLCBtbWRfYWRkcmVzcyA+PiA4KTsKKwltbWRfZGF0YSA9IFhQQ1NfSU9SRUFEKHBkYXRhLCAobW1kX2FkZHJlc3MgJiAweGZmKSA8PCAyKTsKKwltdXRleF91bmxvY2soJnBkYXRhLT54cGNzX211dGV4KTsKKworCXJldHVybiBtbWRfZGF0YTsKK30KKworc3RhdGljIHZvaWQgeGdiZV93cml0ZV9tbWRfcmVncyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEsIGludCBwcnRhZCwKKwkJCQlpbnQgbW1kX3JlZywgaW50IG1tZF9kYXRhKQoreworCXVuc2lnbmVkIGludCBtbWRfYWRkcmVzczsKKworCWlmIChtbWRfcmVnICYgTUlJX0FERFJfQzQ1KQorCQltbWRfYWRkcmVzcyA9IG1tZF9yZWcgJiB+TUlJX0FERFJfQzQ1OworCWVsc2UKKwkJbW1kX2FkZHJlc3MgPSAocGRhdGEtPm1kaW9fbW1kIDw8IDE2KSB8IChtbWRfcmVnICYgMHhmZmZmKTsKKworCS8qIFRoZSBQQ1MgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCB1c2luZyBtbWlvLiBUaGUgdW5kZXJseWluZyBBUEIzCisJICogbWFuYWdlbWVudCBpbnRlcmZhY2UgdXNlcyBpbmRpcmVjdCBhZGRyZXNzaW5nIHRvIGFjY2VzcyB0aGUgTU1ECisJICogcmVnaXN0ZXIgc2V0cy4gVGhpcyByZXF1aXJlcyBhY2Nlc3Npbmcgb2YgdGhlIFBDUyByZWdpc3RlciBpbiB0d28KKwkgKiBwaGFzZXMsIGFuIGFkZHJlc3MgcGhhc2UgYW5kIGEgZGF0YSBwaGFzZS4KKwkgKgorCSAqIFRoZSBtbWlvIGludGVyZmFjZSBpcyBiYXNlZCBvbiAzMi1iaXQgb2Zmc2V0cyBhbmQgdmFsdWVzLiBBbGwKKwkgKiByZWdpc3RlciBvZmZzZXRzIG11c3QgdGhlcmVmb3JlIGJlIGFkanVzdGVkIGJ5IGxlZnQgc2hpZnRpbmcgdGhlCisJICogb2Zmc2V0IDIgYml0cyBhbmQgcmVhZGluZyAzMiBiaXRzIG9mIGRhdGEuCisJICovCisJbXV0ZXhfbG9jaygmcGRhdGEtPnhwY3NfbXV0ZXgpOworCVhQQ1NfSU9XUklURShwZGF0YSwgUENTX01NRF9TRUxFQ1QgPDwgMiwgbW1kX2FkZHJlc3MgPj4gOCk7CisJWFBDU19JT1dSSVRFKHBkYXRhLCAobW1kX2FkZHJlc3MgJiAweGZmKSA8PCAyLCBtbWRfZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+eHBjc19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV90eF9jb21wbGV0ZShzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjKQoreworCXJldHVybiAhWEdNQUNfR0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIE9XTik7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9kaXNhYmxlX3J4X2NzdW0oc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1JDUiwgSVBDLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfZW5hYmxlX3J4X2NzdW0oc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1JDUiwgSVBDLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfZW5hYmxlX3J4X3ZsYW5fc3RyaXBwaW5nKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwkvKiBQdXQgdGhlIFZMQU4gdGFnIGluIHRoZSBSeCBkZXNjcmlwdG9yICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfVkxBTlRSLCBFVkxSWFMsIDEpOworCisJLyogRG9uJ3QgY2hlY2sgdGhlIFZMQU4gdHlwZSAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1ZMQU5UUiwgRE9WTFRDLCAxKTsKKworCS8qIENoZWNrIG9ubHkgQy1UQUcgKDB4ODEwMCkgcGFja2V0cyAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1ZMQU5UUiwgRVJTVkxNLCAwKTsKKworCS8qIERvbid0IGNvbnNpZGVyIGFuIFMtVEFHICgweDg4QTgpIHBhY2tldCBhcyBhIFZMQU4gcGFja2V0ICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfVkxBTlRSLCBFU1ZMLCAwKTsKKworCS8qIEVuYWJsZSBWTEFOIHRhZyBzdHJpcHBpbmcgKi8KKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19WTEFOVFIsIEVWTFMsIDB4Myk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2Rpc2FibGVfcnhfdmxhbl9zdHJpcHBpbmcoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1ZMQU5UUiwgRVZMUywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGdiZV90eF9kZXNjX3Jlc2V0KHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGEpCit7CisJc3RydWN0IHhnYmVfcmluZ19kZXNjICpyZGVzYyA9IHJkYXRhLT5yZGVzYzsKKworCS8qIFJlc2V0IHRoZSBUeCBkZXNjcmlwdG9yCisJICogICBTZXQgYnVmZmVyIDEgKGxvKSBhZGRyZXNzIHRvIHplcm8KKwkgKiAgIFNldCBidWZmZXIgMSAoaGkpIGFkZHJlc3MgdG8gemVybworCSAqICAgUmVzZXQgYWxsIG90aGVyIGNvbnRyb2wgYml0cyAoSUMsIFRUU0UsIEIyTCAmIEIxTCkKKwkgKiAgIFJlc2V0IGFsbCBvdGhlciBjb250cm9sIGJpdHMgKE9XTiwgQ1RYVCwgRkQsIExELCBDUEMsIENJQywgZXRjKQorCSAqLworCXJkZXNjLT5kZXNjMCA9IDA7CisJcmRlc2MtPmRlc2MxID0gMDsKKwlyZGVzYy0+ZGVzYzIgPSAwOworCXJkZXNjLT5kZXNjMyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfdHhfZGVzY19pbml0KHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHhnYmVfcmluZyAqcmluZyA9IGNoYW5uZWwtPnR4X3Jpbmc7CisJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjOworCWludCBpOworCWludCBzdGFydF9pbmRleCA9IHJpbmctPmN1cjsKKworCURCR1BSKCItLT50eF9kZXNjX2luaXRcbiIpOworCisJLyogSW5pdGlhbHplIGFsbCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCByaW5nLT5yZGVzY19jb3VudDsgaSsrKSB7CisJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBpKTsKKwkJcmRlc2MgPSByZGF0YS0+cmRlc2M7CisKKwkJLyogSW5pdGlhbGl6ZSBUeCBkZXNjcmlwdG9yCisJCSAqICAgU2V0IGJ1ZmZlciAxIChsbykgYWRkcmVzcyB0byB6ZXJvCisJCSAqICAgU2V0IGJ1ZmZlciAxIChoaSkgYWRkcmVzcyB0byB6ZXJvCisJCSAqICAgUmVzZXQgYWxsIG90aGVyIGNvbnRyb2wgYml0cyAoSUMsIFRUU0UsIEIyTCAmIEIxTCkKKwkJICogICBSZXNldCBhbGwgb3RoZXIgY29udHJvbCBiaXRzIChPV04sIENUWFQsIEZELCBMRCwgQ1BDLCBDSUMsCisJCSAqICAgICBldGMpCisJCSAqLworCQlyZGVzYy0+ZGVzYzAgPSAwOworCQlyZGVzYy0+ZGVzYzEgPSAwOworCQlyZGVzYy0+ZGVzYzIgPSAwOworCQlyZGVzYy0+ZGVzYzMgPSAwOworCX0KKworCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIGRlc2NyaXB0b3IocykgYmVmb3JlCisJICogdGVsbGluZyB0aGUgZGV2aWNlIGFib3V0IHRoZW0KKwkgKi8KKwl3bWIoKTsKKworCS8qIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIFR4IGRlc2NyaXB0b3JzICovCisJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1REUkxSLCByaW5nLT5yZGVzY19jb3VudCAtIDEpOworCisJLyogVXBkYXRlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBzdGFydF9pbmRleCk7CisJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1RETFJfSEksCisJCQkgIHVwcGVyXzMyX2JpdHMocmRhdGEtPnJkZXNjX2RtYSkpOworCVhHTUFDX0RNQV9JT1dSSVRFKGNoYW5uZWwsIERNQV9DSF9URExSX0xPLAorCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKKworCURCR1BSKCI8LS10eF9kZXNjX2luaXRcbiIpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3J4X2Rlc2NfcmVzZXQoc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjID0gcmRhdGEtPnJkZXNjOworCisJLyogUmVzZXQgdGhlIFJ4IGRlc2NyaXB0b3IKKwkgKiAgIFNldCBidWZmZXIgMSAobG8pIGFkZHJlc3MgdG8gZG1hIGFkZHJlc3MgKGxvKQorCSAqICAgU2V0IGJ1ZmZlciAxIChoaSkgYWRkcmVzcyB0byBkbWEgYWRkcmVzcyAoaGkpCisJICogICBTZXQgYnVmZmVyIDIgKGxvKSBhZGRyZXNzIHRvIHplcm8KKwkgKiAgIFNldCBidWZmZXIgMiAoaGkpIGFkZHJlc3MgdG8gemVybyBhbmQgc2V0IGNvbnRyb2wgYml0cworCSAqICAgICBPV04gYW5kIElOVEUKKwkgKi8KKwlyZGVzYy0+ZGVzYzAgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHJkYXRhLT5za2JfZG1hKSk7CisJcmRlc2MtPmRlc2MxID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhyZGF0YS0+c2tiX2RtYSkpOworCXJkZXNjLT5kZXNjMiA9IDA7CisKKwlyZGVzYy0+ZGVzYzMgPSAwOworCWlmIChyZGF0YS0+aW50ZXJydXB0KQorCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFJYX05PUk1BTF9ERVNDMywgSU5URSwgMSk7CisKKwkvKiBTaW5jZSB0aGUgUnggRE1BIGVuZ2luZSBpcyBsaWtlbHkgcnVubmluZywgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcKKwkgKiBpcyB3cml0dGVuIHRvIHRoZSBkZXNjcmlwdG9yKHMpIGJlZm9yZSBzZXR0aW5nIHRoZSBPV04gYml0CisJICogZm9yIHRoZSBkZXNjcmlwdG9yCisJICovCisJd21iKCk7CisKKwlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFJYX05PUk1BTF9ERVNDMywgT1dOLCAxKTsKKworCS8qIE1ha2Ugc3VyZSBvd25lcnNoaXAgaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvciAqLworCXdtYigpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3J4X2Rlc2NfaW5pdChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGNoYW5uZWwtPnBkYXRhOworCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcgPSBjaGFubmVsLT5yeF9yaW5nOworCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CisJc3RydWN0IHhnYmVfcmluZ19kZXNjICpyZGVzYzsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfaW5kZXggPSByaW5nLT5jdXI7CisJdW5zaWduZWQgaW50IHJ4X2NvYWxlc2NlLCByeF9mcmFtZXM7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdQUigiLS0+cnhfZGVzY19pbml0XG4iKTsKKworCXJ4X2NvYWxlc2NlID0gKHBkYXRhLT5yeF9yaXd0IHx8IHBkYXRhLT5yeF9mcmFtZXMpID8gMSA6IDA7CisJcnhfZnJhbWVzID0gcGRhdGEtPnJ4X2ZyYW1lczsKKworCS8qIEluaXRpYWxpemUgYWxsIGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IHJpbmctPnJkZXNjX2NvdW50OyBpKyspIHsKKwkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIGkpOworCQlyZGVzYyA9IHJkYXRhLT5yZGVzYzsKKworCQkvKiBJbml0aWFsaXplIFJ4IGRlc2NyaXB0b3IKKwkJICogICBTZXQgYnVmZmVyIDEgKGxvKSBhZGRyZXNzIHRvIGRtYSBhZGRyZXNzIChsbykKKwkJICogICBTZXQgYnVmZmVyIDEgKGhpKSBhZGRyZXNzIHRvIGRtYSBhZGRyZXNzIChoaSkKKwkJICogICBTZXQgYnVmZmVyIDIgKGxvKSBhZGRyZXNzIHRvIHplcm8KKwkJICogICBTZXQgYnVmZmVyIDIgKGhpKSBhZGRyZXNzIHRvIHplcm8gYW5kIHNldCBjb250cm9sCisJCSAqICAgICBiaXRzIE9XTiBhbmQgSU5URSBhcHByb3ByaWF0ZWxleQorCQkgKi8KKwkJcmRlc2MtPmRlc2MwID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhyZGF0YS0+c2tiX2RtYSkpOworCQlyZGVzYy0+ZGVzYzEgPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHJkYXRhLT5za2JfZG1hKSk7CisJCXJkZXNjLT5kZXNjMiA9IDA7CisJCXJkZXNjLT5kZXNjMyA9IDA7CisJCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgUlhfTk9STUFMX0RFU0MzLCBPV04sIDEpOworCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFJYX05PUk1BTF9ERVNDMywgSU5URSwgMSk7CisJCXJkYXRhLT5pbnRlcnJ1cHQgPSAxOworCQlpZiAocnhfY29hbGVzY2UgJiYgKCFyeF9mcmFtZXMgfHwgKChpICsgMSkgJSByeF9mcmFtZXMpKSkgeworCQkJLyogQ2xlYXIgaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gYml0ICovCisJCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFJYX05PUk1BTF9ERVNDMywgSU5URSwKKwkJCQkJICAwKTsKKwkJCXJkYXRhLT5pbnRlcnJ1cHQgPSAwOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvcnMgYmVmb3JlCisJICogdGVsbGluZyB0aGUgZGV2aWNlIGFib3V0IHRoZW0KKwkgKi8KKwl3bWIoKTsKKworCS8qIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3JzICovCisJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1JEUkxSLCByaW5nLT5yZGVzY19jb3VudCAtIDEpOworCisJLyogVXBkYXRlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBzdGFydF9pbmRleCk7CisJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1JETFJfSEksCisJCQkgIHVwcGVyXzMyX2JpdHMocmRhdGEtPnJkZXNjX2RtYSkpOworCVhHTUFDX0RNQV9JT1dSSVRFKGNoYW5uZWwsIERNQV9DSF9SRExSX0xPLAorCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKKworCS8qIFVwZGF0ZSB0aGUgUnggRGVzY3JpcHRvciBUYWlsIFBvaW50ZXIgKi8KKwlyZGF0YSA9IEdFVF9ERVNDX0RBVEEocmluZywgc3RhcnRfaW5kZXggKyByaW5nLT5yZGVzY19jb3VudCAtIDEpOworCVhHTUFDX0RNQV9JT1dSSVRFKGNoYW5uZWwsIERNQV9DSF9SRFRSX0xPLAorCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKKworCURCR1BSKCI8LS1yeF9kZXNjX2luaXRcbiIpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3ByZV94bWl0KHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY2hhbm5lbC0+cGRhdGE7CisJc3RydWN0IHhnYmVfcmluZyAqcmluZyA9IGNoYW5uZWwtPnR4X3Jpbmc7CisJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjOworCXN0cnVjdCB4Z2JlX3BhY2tldF9kYXRhICpwYWNrZXQgPSAmcmluZy0+cGFja2V0X2RhdGE7CisJdW5zaWduZWQgaW50IGNzdW0sIHRzbywgdmxhbjsKKwl1bnNpZ25lZCBpbnQgdHNvX2NvbnRleHQsIHZsYW5fY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgdHhfY29hbGVzY2UsIHR4X2ZyYW1lczsKKwlpbnQgc3RhcnRfaW5kZXggPSByaW5nLT5jdXI7CisJaW50IGk7CisKKwlEQkdQUigiLS0+eGdiZV9wcmVfeG1pdFxuIik7CisKKwljc3VtID0gWEdNQUNfR0VUX0JJVFMocGFja2V0LT5hdHRyaWJ1dGVzLCBUWF9QQUNLRVRfQVRUUklCVVRFUywKKwkJCSAgICAgIENTVU1fRU5BQkxFKTsKKwl0c28gPSBYR01BQ19HRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFRYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJICAgICBUU09fRU5BQkxFKTsKKwl2bGFuID0gWEdNQUNfR0VUX0JJVFMocGFja2V0LT5hdHRyaWJ1dGVzLCBUWF9QQUNLRVRfQVRUUklCVVRFUywKKwkJCSAgICAgIFZMQU5fQ1RBRyk7CisKKwlpZiAodHNvICYmIChwYWNrZXQtPm1zcyAhPSByaW5nLT50eC5jdXJfbXNzKSkKKwkJdHNvX2NvbnRleHQgPSAxOworCWVsc2UKKwkJdHNvX2NvbnRleHQgPSAwOworCisJaWYgKHZsYW4gJiYgKHBhY2tldC0+dmxhbl9jdGFnICE9IHJpbmctPnR4LmN1cl92bGFuX2N0YWcpKQorCQl2bGFuX2NvbnRleHQgPSAxOworCWVsc2UKKwkJdmxhbl9jb250ZXh0ID0gMDsKKworCXR4X2NvYWxlc2NlID0gKHBkYXRhLT50eF91c2VjcyB8fCBwZGF0YS0+dHhfZnJhbWVzKSA/IDEgOiAwOworCXR4X2ZyYW1lcyA9IHBkYXRhLT50eF9mcmFtZXM7CisJaWYgKHR4X2NvYWxlc2NlICYmICFjaGFubmVsLT50eF90aW1lcl9hY3RpdmUpCisJCXJpbmctPmNvYWxlc2NlX2NvdW50ID0gMDsKKworCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5jdXIpOworCXJkZXNjID0gcmRhdGEtPnJkZXNjOworCisJLyogQ3JlYXRlIGEgY29udGV4dCBkZXNjcmlwdG9yIGlmIHRoaXMgaXMgYSBUU08gcGFja2V0ICovCisJaWYgKHRzb19jb250ZXh0IHx8IHZsYW5fY29udGV4dCkgeworCQlpZiAodHNvX2NvbnRleHQpIHsKKwkJCURCR1BSKCIgIFRTTyBjb250ZXh0IGRlc2NyaXB0b3IsIG1zcz0ldVxuIiwKKwkJCSAgICAgIHBhY2tldC0+bXNzKTsKKworCQkJLyogU2V0IHRoZSBNU1Mgc2l6ZSAqLworCQkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MyLCBUWF9DT05URVhUX0RFU0MyLAorCQkJCQkgIE1TUywgcGFja2V0LT5tc3MpOworCisJCQkvKiBNYXJrIGl0IGFzIGEgQ09OVEVYVCBkZXNjcmlwdG9yICovCisJCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX0NPTlRFWFRfREVTQzMsCisJCQkJCSAgQ1RYVCwgMSk7CisKKwkJCS8qIEluZGljYXRlIHRoaXMgZGVzY3JpcHRvciBjb250YWlucyB0aGUgTVNTICovCisJCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX0NPTlRFWFRfREVTQzMsCisJCQkJCSAgVENNU1NWLCAxKTsKKworCQkJcmluZy0+dHguY3VyX21zcyA9IHBhY2tldC0+bXNzOworCQl9CisKKwkJaWYgKHZsYW5fY29udGV4dCkgeworCQkJREJHUFIoIiAgVkxBTiBjb250ZXh0IGRlc2NyaXB0b3IsIGN0YWc9JXVcbiIsCisJCQkgICAgICBwYWNrZXQtPnZsYW5fY3RhZyk7CisKKwkJCS8qIE1hcmsgaXQgYXMgYSBDT05URVhUIGRlc2NyaXB0b3IgKi8KKwkJCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfQ09OVEVYVF9ERVNDMywKKwkJCQkJICBDVFhULCAxKTsKKworCQkJLyogU2V0IHRoZSBWTEFOIHRhZyAqLworCQkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9DT05URVhUX0RFU0MzLAorCQkJCQkgIFZULCBwYWNrZXQtPnZsYW5fY3RhZyk7CisKKwkJCS8qIEluZGljYXRlIHRoaXMgZGVzY3JpcHRvciBjb250YWlucyB0aGUgVkxBTiB0YWcgKi8KKwkJCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfQ09OVEVYVF9ERVNDMywKKwkJCQkJICBWTFRWLCAxKTsKKworCQkJcmluZy0+dHguY3VyX3ZsYW5fY3RhZyA9IHBhY2tldC0+dmxhbl9jdGFnOworCQl9CisKKwkJcmluZy0+Y3VyKys7CisJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5jdXIpOworCQlyZGVzYyA9IHJkYXRhLT5yZGVzYzsKKwl9CisKKwkvKiBVcGRhdGUgYnVmZmVyIGFkZHJlc3MgKGZvciBUU08gdGhpcyBpcyB0aGUgaGVhZGVyKSAqLworCXJkZXNjLT5kZXNjMCA9ICBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHJkYXRhLT5za2JfZG1hKSk7CisJcmRlc2MtPmRlc2MxID0gIGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMocmRhdGEtPnNrYl9kbWEpKTsKKworCS8qIFVwZGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCAqLworCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMiwgVFhfTk9STUFMX0RFU0MyLCBITF9CMUwsCisJCQkgIHJkYXRhLT5za2JfZG1hX2xlbik7CisKKwkvKiBWTEFOIHRhZyBpbnNlcnRpb24gY2hlY2sgKi8KKwlpZiAodmxhbikKKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MyLCBUWF9OT1JNQUxfREVTQzIsIFZUSVIsCisJCQkJICBUWF9OT1JNQUxfREVTQzJfVkxBTl9JTlNFUlQpOworCisJLyogU2V0IElDIGJpdCBiYXNlZCBvbiBUeCBjb2FsZXNjaW5nIHNldHRpbmdzICovCisJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MyLCBUWF9OT1JNQUxfREVTQzIsIElDLCAxKTsKKwlpZiAodHhfY29hbGVzY2UgJiYgKCF0eF9mcmFtZXMgfHwKKwkJCSAgICAoKytyaW5nLT5jb2FsZXNjZV9jb3VudCAlIHR4X2ZyYW1lcykpKQorCQkvKiBDbGVhciBJQyBiaXQgKi8KKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MyLCBUWF9OT1JNQUxfREVTQzIsIElDLCAwKTsKKworCS8qIE1hcmsgaXQgYXMgRmlyc3QgRGVzY3JpcHRvciAqLworCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfTk9STUFMX0RFU0MzLCBGRCwgMSk7CisKKwkvKiBNYXJrIGl0IGFzIGEgTk9STUFMIGRlc2NyaXB0b3IgKi8KKwlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywgQ1RYVCwgMCk7CisKKwkvKiBTZXQgT1dOIGJpdCBpZiBub3QgdGhlIGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlpZiAocmluZy0+Y3VyICE9IHN0YXJ0X2luZGV4KQorCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywgT1dOLCAxKTsKKworCWlmICh0c28pIHsKKwkJLyogRW5hYmxlIFRTTyAqLworCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywgVFNFLCAxKTsKKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIFRDUFBMLAorCQkJCSAgcGFja2V0LT50Y3BfcGF5bG9hZF9sZW4pOworCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywgVENQSERSTEVOLAorCQkJCSAgcGFja2V0LT50Y3BfaGVhZGVyX2xlbiAvIDQpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBDUkMgYW5kIFBhZCBJbnNlcnRpb24gKi8KKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIENQQywgMCk7CisKKwkJLyogRW5hYmxlIEhXIENTVU0gKi8KKwkJaWYgKGNzdW0pCisJCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywKKwkJCQkJICBDSUMsIDB4Myk7CisKKwkJLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIEZMLAorCQkJCSAgcGFja2V0LT5sZW5ndGgpOworCX0KKworCWZvciAoaSA9IHJpbmctPmN1ciAtIHN0YXJ0X2luZGV4ICsgMTsgaSA8IHBhY2tldC0+cmRlc2NfY291bnQ7IGkrKykgeworCQlyaW5nLT5jdXIrKzsKKwkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIHJpbmctPmN1cik7CisJCXJkZXNjID0gcmRhdGEtPnJkZXNjOworCisJCS8qIFVwZGF0ZSBidWZmZXIgYWRkcmVzcyAqLworCQlyZGVzYy0+ZGVzYzAgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHJkYXRhLT5za2JfZG1hKSk7CisJCXJkZXNjLT5kZXNjMSA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMocmRhdGEtPnNrYl9kbWEpKTsKKworCQkvKiBVcGRhdGUgdGhlIGJ1ZmZlciBsZW5ndGggKi8KKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MyLCBUWF9OT1JNQUxfREVTQzIsIEhMX0IxTCwKKwkJCQkgIHJkYXRhLT5za2JfZG1hX2xlbik7CisKKwkJLyogU2V0IElDIGJpdCBiYXNlZCBvbiBUeCBjb2FsZXNjaW5nIHNldHRpbmdzICovCisJCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMiwgVFhfTk9STUFMX0RFU0MyLCBJQywgMSk7CisJCWlmICh0eF9jb2FsZXNjZSAmJiAoIXR4X2ZyYW1lcyB8fAorCQkJCSAgICAoKytyaW5nLT5jb2FsZXNjZV9jb3VudCAlIHR4X2ZyYW1lcykpKQorCQkJLyogQ2xlYXIgSUMgYml0ICovCisJCQlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzIsIFRYX05PUk1BTF9ERVNDMiwgSUMsIDApOworCisJCS8qIFNldCBPV04gYml0ICovCisJCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfTk9STUFMX0RFU0MzLCBPV04sIDEpOworCisJCS8qIE1hcmsgaXQgYXMgTk9STUFMIGRlc2NyaXB0b3IgKi8KKwkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIENUWFQsIDApOworCisJCS8qIEVuYWJsZSBIVyBDU1VNICovCisJCWlmIChjc3VtKQorCQkJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsCisJCQkJCSAgQ0lDLCAweDMpOworCX0KKworCS8qIFNldCBMQVNUIGJpdCBmb3IgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfTk9STUFMX0RFU0MzLCBMRCwgMSk7CisKKwkvKiBJbiBjYXNlIHRoZSBUeCBETUEgZW5naW5lIGlzIHJ1bm5pbmcsIG1ha2Ugc3VyZSBldmVyeXRoaW5nCisJICogaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvcihzKSBiZWZvcmUgc2V0dGluZyB0aGUgT1dOIGJpdAorCSAqIGZvciB0aGUgZmlyc3QgZGVzY3JpcHRvcgorCSAqLworCXdtYigpOworCisJLyogU2V0IE9XTiBiaXQgZm9yIHRoZSBmaXJzdCBkZXNjcmlwdG9yICovCisJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIHN0YXJ0X2luZGV4KTsKKwlyZGVzYyA9IHJkYXRhLT5yZGVzYzsKKwlYR01BQ19TRVRfQklUU19MRShyZGVzYy0+ZGVzYzMsIFRYX05PUk1BTF9ERVNDMywgT1dOLCAxKTsKKworI2lmZGVmIFhHTUFDX0VOQUJMRV9UWF9ERVNDX0RVTVAKKwl4Z2JlX2R1bXBfdHhfZGVzYyhyaW5nLCBzdGFydF9pbmRleCwgcGFja2V0LT5yZGVzY19jb3VudCwgMSk7CisjZW5kaWYKKworCS8qIE1ha2Ugc3VyZSBvd25lcnNoaXAgaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvciAqLworCXdtYigpOworCisJLyogSXNzdWUgYSBwb2xsIGNvbW1hbmQgdG8gVHggRE1BIGJ5IHdyaXRpbmcgYWRkcmVzcworCSAqIG9mIG5leHQgaW1tZWRpYXRlIGZyZWUgZGVzY3JpcHRvciAqLworCXJpbmctPmN1cisrOworCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5jdXIpOworCVhHTUFDX0RNQV9JT1dSSVRFKGNoYW5uZWwsIERNQV9DSF9URFRSX0xPLAorCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKKworCS8qIFN0YXJ0IHRoZSBUeCBjb2FsZXNjaW5nIHRpbWVyICovCisJaWYgKHR4X2NvYWxlc2NlICYmICFjaGFubmVsLT50eF90aW1lcl9hY3RpdmUpIHsKKwkJY2hhbm5lbC0+dHhfdGltZXJfYWN0aXZlID0gMTsKKwkJaHJ0aW1lcl9zdGFydCgmY2hhbm5lbC0+dHhfdGltZXIsCisJCQkgICAgICBrdGltZV9zZXQoMCwgcGRhdGEtPnR4X3VzZWNzICogTlNFQ19QRVJfVVNFQyksCisJCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKKwl9CisKKwlEQkdQUigiICAlczogZGVzY3JpcHRvcnMgJXUgdG8gJXUgd3JpdHRlblxuIiwKKwkgICAgICBjaGFubmVsLT5uYW1lLCBzdGFydF9pbmRleCAmIChyaW5nLT5yZGVzY19jb3VudCAtIDEpLAorCSAgICAgIChyaW5nLT5jdXIgLSAxKSAmIChyaW5nLT5yZGVzY19jb3VudCAtIDEpKTsKKworCURCR1BSKCI8LS14Z2JlX3ByZV94bWl0XG4iKTsKK30KKworc3RhdGljIGludCB4Z2JlX2Rldl9yZWFkKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHhnYmVfcmluZyAqcmluZyA9IGNoYW5uZWwtPnJ4X3Jpbmc7CisJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjOworCXN0cnVjdCB4Z2JlX3BhY2tldF9kYXRhICpwYWNrZXQgPSAmcmluZy0+cGFja2V0X2RhdGE7CisJdW5zaWduZWQgaW50IGVyciwgZXRsdDsKKworCURCR1BSKCItLT54Z2JlX2Rldl9yZWFkOiBjdXIgPSAlZFxuIiwgcmluZy0+Y3VyKTsKKworCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5jdXIpOworCXJkZXNjID0gcmRhdGEtPnJkZXNjOworCisJLyogQ2hlY2sgZm9yIGRhdGEgYXZhaWxhYmlsaXR5ICovCisJaWYgKFhHTUFDX0dFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgUlhfTk9STUFMX0RFU0MzLCBPV04pKQorCQlyZXR1cm4gMTsKKworI2lmZGVmIFhHTUFDX0VOQUJMRV9SWF9ERVNDX0RVTVAKKwl4Z2JlX2R1bXBfcnhfZGVzYyhyaW5nLCByZGVzYywgcmluZy0+Y3VyKTsKKyNlbmRpZgorCisJLyogR2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJcmRhdGEtPmxlbiA9IFhHTUFDX0dFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgUlhfTk9STUFMX0RFU0MzLCBQTCk7CisKKwlpZiAoIVhHTUFDX0dFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgUlhfTk9STUFMX0RFU0MzLCBMRCkpIHsKKwkJLyogTm90IGFsbCB0aGUgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBmb3IgdGhpcyBwYWNrZXQgKi8KKwkJWEdNQUNfU0VUX0JJVFMocGFja2V0LT5hdHRyaWJ1dGVzLCBSWF9QQUNLRVRfQVRUUklCVVRFUywKKwkJCSAgICAgICBJTkNPTVBMRVRFLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhpcyBpcyB0aGUgbGFzdCBvZiB0aGUgZGF0YSBmb3IgdGhpcyBwYWNrZXQgKi8KKwlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFJYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkgICAgICAgSU5DT01QTEVURSwgMCk7CisKKwkvKiBTZXQgY2hlY2tzdW0gZG9uZSBpbmRpY2F0b3IgYXMgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2hhbm5lbC0+cGRhdGEtPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKKwkJWEdNQUNfU0VUX0JJVFMocGFja2V0LT5hdHRyaWJ1dGVzLCBSWF9QQUNLRVRfQVRUUklCVVRFUywKKwkJCSAgICAgICBDU1VNX0RPTkUsIDEpOworCisJLyogQ2hlY2sgZm9yIGVycm9ycyAob25seSB2YWxpZCBpbiBsYXN0IGRlc2NyaXB0b3IpICovCisJZXJyID0gWEdNQUNfR0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBSWF9OT1JNQUxfREVTQzMsIEVTKTsKKwlldGx0ID0gWEdNQUNfR0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBSWF9OT1JNQUxfREVTQzMsIEVUTFQpOworCURCR1BSKCIgIGVycj0ldSwgZXRsdD0lI3hcbiIsIGVyciwgZXRsdCk7CisKKwlpZiAoIWVyciB8fCAoZXJyICYmICFldGx0KSkgeworCQlpZiAoZXRsdCA9PSAweDA5KSB7CisJCQlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFJYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJCSAgICAgICBWTEFOX0NUQUcsIDEpOworCQkJcGFja2V0LT52bGFuX2N0YWcgPSBYR01BQ19HRVRfQklUU19MRShyZGVzYy0+ZGVzYzAsCisJCQkJCQkJICAgICAgUlhfTk9STUFMX0RFU0MwLAorCQkJCQkJCSAgICAgIE9WVCk7CisJCQlEQkdQUigiICB2bGFuLWN0YWc9MHglMDR4XG4iLCBwYWNrZXQtPnZsYW5fY3RhZyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGV0bHQgPT0gMHgwNSkgfHwgKGV0bHQgPT0gMHgwNikpCisJCQlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFJYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJCSAgICAgICBDU1VNX0RPTkUsIDApOworCQllbHNlCisJCQlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmVycm9ycywgUlhfUEFDS0VUX0VSUk9SUywKKwkJCQkgICAgICAgRlJBTUUsIDEpOworCX0KKworCURCR1BSKCI8LS14Z2JlX2Rldl9yZWFkOiAlcyAtIGRlc2NyaXB0b3I9JXUgKGN1cj0lZClcbiIsIGNoYW5uZWwtPm5hbWUsCisJICAgICAgcmluZy0+Y3VyICYgKHJpbmctPnJkZXNjX2NvdW50IC0gMSksIHJpbmctPmN1cik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2lzX2NvbnRleHRfZGVzYyhzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjKQoreworCS8qIFJ4IGFuZCBUeCBzaGFyZSBDVFhUIGJpdCwgc28gY2hlY2sgVERFUzMuQ1RYVCBiaXQgKi8KKwlyZXR1cm4gWEdNQUNfR0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBUWF9OT1JNQUxfREVTQzMsIENUWFQpOworfQorCitzdGF0aWMgaW50IHhnYmVfaXNfbGFzdF9kZXNjKHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqcmRlc2MpCit7CisJLyogUnggYW5kIFR4IHNoYXJlIExEIGJpdCwgc28gY2hlY2sgVERFUzMuTEQgYml0ICovCisJcmV0dXJuIFhHTUFDX0dFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgVFhfTk9STUFMX0RFU0MzLCBMRCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfc2F2ZV9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICAgIGVudW0geGdiZV9pbnRfc3RhdGUgaW50X3N0YXRlKQoreworCXVuc2lnbmVkIGludCBkbWFfY2hfaWVyOworCisJaWYgKGludF9zdGF0ZSA9PSBYR01BQ19JTlRfU1RBVEVfU0FWRSkgeworCQljaGFubmVsLT5zYXZlZF9pZXIgPSBYR01BQ19ETUFfSU9SRUFEKGNoYW5uZWwsIERNQV9DSF9JRVIpOworCQljaGFubmVsLT5zYXZlZF9pZXIgJj0gRE1BX0lOVEVSUlVQVF9NQVNLOworCX0gZWxzZSB7CisJCWRtYV9jaF9pZXIgPSBYR01BQ19ETUFfSU9SRUFEKGNoYW5uZWwsIERNQV9DSF9JRVIpOworCQlkbWFfY2hfaWVyIHw9IGNoYW5uZWwtPnNhdmVkX2llcjsKKwkJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX0lFUiwgZG1hX2NoX2llcik7CisJfQorfQorCitzdGF0aWMgaW50IHhnYmVfZW5hYmxlX2ludChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsLAorCQkJICAgZW51bSB4Z2JlX2ludCBpbnRfaWQpCit7CisJc3dpdGNoIChpbnRfaWQpIHsKKwljYXNlIFhHTUFDX0lOVF9ETUFfSVNSX0RDMElTOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFRJRSwgMSk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9DSF9TUl9USToKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfSUVSLCBUSUUsIDEpOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfVFBTOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFRYU0UsIDEpOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfVEJVOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFRCVUUsIDEpOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfUkk6CisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX0lFUiwgUklFLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBYR01BQ19JTlRfRE1BX0NIX1NSX1JCVToKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfSUVSLCBSQlVFLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBYR01BQ19JTlRfRE1BX0NIX1NSX1JQUzoKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfSUVSLCBSU0UsIDEpOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfRkJFOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIEZCRUUsIDEpOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQUxMOgorCQl4Z2JlX3NhdmVfaW50ZXJydXB0X3N0YXR1cyhjaGFubmVsLCBYR01BQ19JTlRfU1RBVEVfUkVTVE9SRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2Rpc2FibGVfaW50KHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAgZW51bSB4Z2JlX2ludCBpbnRfaWQpCit7CisJdW5zaWduZWQgaW50IGRtYV9jaF9pZXI7CisKKwlzd2l0Y2ggKGludF9pZCkgeworCWNhc2UgWEdNQUNfSU5UX0RNQV9JU1JfREMwSVM6CisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX0lFUiwgVElFLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBYR01BQ19JTlRfRE1BX0NIX1NSX1RJOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFRJRSwgMCk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9DSF9TUl9UUFM6CisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX0lFUiwgVFhTRSwgMCk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9DSF9TUl9UQlU6CisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX0lFUiwgVEJVRSwgMCk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9DSF9TUl9SSToKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfSUVSLCBSSUUsIDApOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfUkJVOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFJCVUUsIDApOworCQlicmVhazsKKwljYXNlIFhHTUFDX0lOVF9ETUFfQ0hfU1JfUlBTOgorCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9JRVIsIFJTRSwgMCk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9DSF9TUl9GQkU6CisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX0lFUiwgRkJFRSwgMCk7CisJCWJyZWFrOworCWNhc2UgWEdNQUNfSU5UX0RNQV9BTEw6CisJCXhnYmVfc2F2ZV9pbnRlcnJ1cHRfc3RhdHVzKGNoYW5uZWwsIFhHTUFDX0lOVF9TVEFURV9TQVZFKTsKKworCQlkbWFfY2hfaWVyID0gWEdNQUNfRE1BX0lPUkVBRChjaGFubmVsLCBETUFfQ0hfSUVSKTsKKwkJZG1hX2NoX2llciAmPSB+RE1BX0lOVEVSUlVQVF9NQVNLOworCQlYR01BQ19ETUFfSU9XUklURShjaGFubmVsLCBETUFfQ0hfSUVSLCBkbWFfY2hfaWVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnYmVfZXhpdChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMjAwMDsKKworCURCR1BSKCItLT54Z2JlX2V4aXRcbiIpOworCisJLyogSXNzdWUgYSBzb2Z0d2FyZSByZXNldCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgRE1BX01SLCBTV1IsIDEpOworCXVzbGVlcF9yYW5nZSgxMCwgMTUpOworCisJLyogUG9sbCBVbnRpbCBQb2xsIENvbmRpdGlvbiAqLworCXdoaWxlIChjb3VudC0tICYmIFhHTUFDX0lPUkVBRF9CSVRTKHBkYXRhLCBETUFfTVIsIFNXUikpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDYwMCk7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJREJHUFIoIjwtLXhnYmVfZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2ZsdXNoX3R4X3F1ZXVlcyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGksIGNvdW50OworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnR4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1RRT01SLCBGVFEsIDEpOworCisJLyogUG9sbCBVbnRpbCBQb2xsIENvbmRpdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+aHdfZmVhdC50eF9xX2NudDsgaSsrKSB7CisJCWNvdW50ID0gMjAwMDsKKwkJd2hpbGUgKGNvdW50LS0gJiYgWEdNQUNfTVRMX0lPUkVBRF9CSVRTKHBkYXRhLCBpLAorCQkJCQkJCU1UTF9RX1RRT01SLCBGVFEpKQorCQkJdXNsZWVwX3JhbmdlKDUwMCwgNjAwKTsKKworCQlpZiAoIWNvdW50KQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfZG1hX2J1cyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJLyogU2V0IGVuaGFuY2VkIGFkZHJlc3NpbmcgbW9kZSAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgRE1BX1NCTVIsIEVBTUUsIDEpOworCisJLyogU2V0IHRoZSBTeXN0ZW0gQnVzIG1vZGUgKi8KKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIERNQV9TQk1SLCBVTkRFRiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfY29uZmlnX2RtYV9jYWNoZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGFyY2FjaGUsIGF3Y2FjaGU7CisKKwlhcmNhY2hlID0gMDsKKwlYR01BQ19TRVRfQklUUyhhcmNhY2hlLCBETUFfQVhJQVJDUiwgRFJDLCBETUFfQVJDQUNIRV9TRVRUSU5HKTsKKwlYR01BQ19TRVRfQklUUyhhcmNhY2hlLCBETUFfQVhJQVJDUiwgRFJELCBETUFfQVJET01BSU5fU0VUVElORyk7CisJWEdNQUNfU0VUX0JJVFMoYXJjYWNoZSwgRE1BX0FYSUFSQ1IsIFRFQywgRE1BX0FSQ0FDSEVfU0VUVElORyk7CisJWEdNQUNfU0VUX0JJVFMoYXJjYWNoZSwgRE1BX0FYSUFSQ1IsIFRFRCwgRE1BX0FSRE9NQUlOX1NFVFRJTkcpOworCVhHTUFDX1NFVF9CSVRTKGFyY2FjaGUsIERNQV9BWElBUkNSLCBUSEMsIERNQV9BUkNBQ0hFX1NFVFRJTkcpOworCVhHTUFDX1NFVF9CSVRTKGFyY2FjaGUsIERNQV9BWElBUkNSLCBUSEQsIERNQV9BUkRPTUFJTl9TRVRUSU5HKTsKKwlYR01BQ19JT1dSSVRFKHBkYXRhLCBETUFfQVhJQVJDUiwgYXJjYWNoZSk7CisKKwlhd2NhY2hlID0gMDsKKwlYR01BQ19TRVRfQklUUyhhd2NhY2hlLCBETUFfQVhJQVdDUiwgRFdDLCBETUFfQVdDQUNIRV9TRVRUSU5HKTsKKwlYR01BQ19TRVRfQklUUyhhd2NhY2hlLCBETUFfQVhJQVdDUiwgRFdELCBETUFfQVdET01BSU5fU0VUVElORyk7CisJWEdNQUNfU0VUX0JJVFMoYXdjYWNoZSwgRE1BX0FYSUFXQ1IsIFJQQywgRE1BX0FXQ0FDSEVfU0VUVElORyk7CisJWEdNQUNfU0VUX0JJVFMoYXdjYWNoZSwgRE1BX0FYSUFXQ1IsIFJQRCwgRE1BX0FXRE9NQUlOX1NFVFRJTkcpOworCVhHTUFDX1NFVF9CSVRTKGF3Y2FjaGUsIERNQV9BWElBV0NSLCBSSEMsIERNQV9BV0NBQ0hFX1NFVFRJTkcpOworCVhHTUFDX1NFVF9CSVRTKGF3Y2FjaGUsIERNQV9BWElBV0NSLCBSSEQsIERNQV9BV0RPTUFJTl9TRVRUSU5HKTsKKwlYR01BQ19TRVRfQklUUyhhd2NhY2hlLCBETUFfQVhJQVdDUiwgVERDLCBETUFfQVdDQUNIRV9TRVRUSU5HKTsKKwlYR01BQ19TRVRfQklUUyhhd2NhY2hlLCBETUFfQVhJQVdDUiwgVERELCBETUFfQVdET01BSU5fU0VUVElORyk7CisJWEdNQUNfSU9XUklURShwZGF0YSwgRE1BX0FYSUFXQ1IsIGF3Y2FjaGUpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ19tdGxfbW9kZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBTZXQgVHggdG8gd2VpZ2h0ZWQgcm91bmQgcm9iaW4gc2NoZWR1bGluZyBhbGdvcml0aG0gKHdoZW4KKwkgKiB0cmFmZmljIGNsYXNzIGlzIHVzaW5nIEVUUyBhbGdvcml0aG0pCisJICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNVExfT01SLCBFVFNBTEcsIE1UTF9FVFNBTEdfV1JSKTsKKworCS8qIFNldCBUeCB0cmFmZmljIGNsYXNzZXMgdG8gc3RyaWN0IHByaW9yaXR5IGFsZ29yaXRobSAqLworCWZvciAoaSA9IDA7IGkgPCBYR0JFX1RDX0NOVDsgaSsrKQorCQlYR01BQ19NVExfSU9XUklURV9CSVRTKHBkYXRhLCBpLCBNVExfVENfRVRTQ1IsIFRTQSwgTVRMX1RTQV9TUCk7CisKKwkvKiBTZXQgUnggdG8gc3RyaWN0IHByaW9yaXR5IGFsZ29yaXRobSAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTVRMX09NUiwgUkFBLCBNVExfUkFBX1NQKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4Z2JlX2NhbGN1bGF0ZV9wZXJfcXVldWVfZmlmbyh1bnNpZ25lZCBsb25nIGZpZm9fc2l6ZSwKKwkJCQkJCSAgdW5zaWduZWQgY2hhciBxdWV1ZV9jb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgcV9maWZvX3NpemUgPSAwOworCWVudW0geGdiZV9tdGxfZmlmb19zaXplIHBfZmlmbyA9IFhHTUFDX01UTF9GSUZPX1NJWkVfMjU2OworCisJLyogQ2FsY3VsYXRlIFR4L1J4IGZpZm8gc2hhcmUgcGVyIHF1ZXVlICovCisJc3dpdGNoIChmaWZvX3NpemUpIHsKKwljYXNlIDA6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0IoMTI4KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlxX2ZpZm9fc2l6ZSA9IEZJRk9fU0laRV9CKDI1Nik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcV9maWZvX3NpemUgPSBGSUZPX1NJWkVfQig1MTIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0tCKDEpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0tCKDIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0tCKDQpOworCQlicmVhazsKKwljYXNlIDY6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0tCKDgpOworCQlicmVhazsKKwljYXNlIDc6CisJCXFfZmlmb19zaXplID0gRklGT19TSVpFX0tCKDE2KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlxX2ZpZm9fc2l6ZSA9IEZJRk9fU0laRV9LQigzMik7CisJCWJyZWFrOworCWNhc2UgOToKKwkJcV9maWZvX3NpemUgPSBGSUZPX1NJWkVfS0IoNjQpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlxX2ZpZm9fc2l6ZSA9IEZJRk9fU0laRV9LQigxMjgpOworCQlicmVhazsKKwljYXNlIDExOgorCQlxX2ZpZm9fc2l6ZSA9IEZJRk9fU0laRV9LQigyNTYpOworCQlicmVhazsKKwl9CisJcV9maWZvX3NpemUgPSBxX2ZpZm9fc2l6ZSAvIHF1ZXVlX2NvdW50OworCisJLyogU2V0IHRoZSBxdWV1ZSBmaWZvIHNpemUgcHJvZ3JhbW1hYmxlIHZhbHVlICovCisJaWYgKHFfZmlmb19zaXplID49IEZJRk9fU0laRV9LQigyNTYpKQorCQlwX2ZpZm8gPSBYR01BQ19NVExfRklGT19TSVpFXzI1Nks7CisJZWxzZSBpZiAocV9maWZvX3NpemUgPj0gRklGT19TSVpFX0tCKDEyOCkpCisJCXBfZmlmbyA9IFhHTUFDX01UTF9GSUZPX1NJWkVfMTI4SzsKKwllbHNlIGlmIChxX2ZpZm9fc2l6ZSA+PSBGSUZPX1NJWkVfS0IoNjQpKQorCQlwX2ZpZm8gPSBYR01BQ19NVExfRklGT19TSVpFXzY0SzsKKwllbHNlIGlmIChxX2ZpZm9fc2l6ZSA+PSBGSUZPX1NJWkVfS0IoMzIpKQorCQlwX2ZpZm8gPSBYR01BQ19NVExfRklGT19TSVpFXzMySzsKKwllbHNlIGlmIChxX2ZpZm9fc2l6ZSA+PSBGSUZPX1NJWkVfS0IoMTYpKQorCQlwX2ZpZm8gPSBYR01BQ19NVExfRklGT19TSVpFXzE2SzsKKwllbHNlIGlmIChxX2ZpZm9fc2l6ZSA+PSBGSUZPX1NJWkVfS0IoOCkpCisJCXBfZmlmbyA9IFhHTUFDX01UTF9GSUZPX1NJWkVfOEs7CisJZWxzZSBpZiAocV9maWZvX3NpemUgPj0gRklGT19TSVpFX0tCKDQpKQorCQlwX2ZpZm8gPSBYR01BQ19NVExfRklGT19TSVpFXzRLOworCWVsc2UgaWYgKHFfZmlmb19zaXplID49IEZJRk9fU0laRV9LQigyKSkKKwkJcF9maWZvID0gWEdNQUNfTVRMX0ZJRk9fU0laRV8ySzsKKwllbHNlIGlmIChxX2ZpZm9fc2l6ZSA+PSBGSUZPX1NJWkVfS0IoMSkpCisJCXBfZmlmbyA9IFhHTUFDX01UTF9GSUZPX1NJWkVfMUs7CisJZWxzZSBpZiAocV9maWZvX3NpemUgPj0gRklGT19TSVpFX0IoNTEyKSkKKwkJcF9maWZvID0gWEdNQUNfTVRMX0ZJRk9fU0laRV81MTI7CisJZWxzZSBpZiAocV9maWZvX3NpemUgPj0gRklGT19TSVpFX0IoMjU2KSkKKwkJcF9maWZvID0gWEdNQUNfTVRMX0ZJRk9fU0laRV8yNTY7CisKKwlyZXR1cm4gcF9maWZvOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ190eF9maWZvX3NpemUoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCWVudW0geGdiZV9tdGxfZmlmb19zaXplIGZpZm9fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZpZm9fc2l6ZSA9IHhnYmVfY2FsY3VsYXRlX3Blcl9xdWV1ZV9maWZvKHBkYXRhLT5od19mZWF0LnR4X2ZpZm9fc2l6ZSwKKwkJCQkJCSAgcGRhdGEtPmh3X2ZlYXQudHhfcV9jbnQpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnR4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1RRT01SLCBUUVMsIGZpZm9fc2l6ZSk7CisKKwluZXRkZXZfbm90aWNlKHBkYXRhLT5uZXRkZXYsICIlZCBUeCBxdWV1ZXMsICVkIGJ5dGUgZmlmbyBwZXIgcXVldWVcbiIsCisJCSAgICAgIHBkYXRhLT5od19mZWF0LnR4X3FfY250LCAoKGZpZm9fc2l6ZSArIDEpICogMjU2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfY29uZmlnX3J4X2ZpZm9fc2l6ZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJZW51bSB4Z2JlX210bF9maWZvX3NpemUgZmlmb19zaXplOworCXVuc2lnbmVkIGludCBpOworCisJZmlmb19zaXplID0geGdiZV9jYWxjdWxhdGVfcGVyX3F1ZXVlX2ZpZm8ocGRhdGEtPmh3X2ZlYXQucnhfZmlmb19zaXplLAorCQkJCQkJICBwZGF0YS0+aHdfZmVhdC5yeF9xX2NudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmh3X2ZlYXQucnhfcV9jbnQ7IGkrKykKKwkJWEdNQUNfTVRMX0lPV1JJVEVfQklUUyhwZGF0YSwgaSwgTVRMX1FfUlFPTVIsIFJRUywgZmlmb19zaXplKTsKKworCW5ldGRldl9ub3RpY2UocGRhdGEtPm5ldGRldiwgIiVkIFJ4IHF1ZXVlcywgJWQgYnl0ZSBmaWZvIHBlciBxdWV1ZVxuIiwKKwkJICAgICAgcGRhdGEtPmh3X2ZlYXQucnhfcV9jbnQsICgoZmlmb19zaXplICsgMSkgKiAyNTYpKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfcnhfcXVldWVfbWFwcGluZyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGksIHJlZywgcmVnX3ZhbDsKKwl1bnNpZ25lZCBpbnQgcV9jb3VudCA9IHBkYXRhLT5od19mZWF0LnJ4X3FfY250OworCisJLyogU2VsZWN0IGR5bmFtaWMgbWFwcGluZyBvZiBNVEwgUnggcXVldWUgdG8gRE1BIFJ4IGNoYW5uZWwgKi8KKwlyZWcgPSBNVExfUlFEQ00wUjsKKwlyZWdfdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcV9jb3VudDspIHsKKwkJcmVnX3ZhbCB8PSAoMHg4MCA8PCAoKGkrKyAlIE1UTF9SUURDTV9RX1BFUl9SRUcpIDw8IDMpKTsKKworCQlpZiAoKGkgJSBNVExfUlFEQ01fUV9QRVJfUkVHKSAmJiAoaSAhPSBxX2NvdW50KSkKKwkJCWNvbnRpbnVlOworCisJCVhHTUFDX0lPV1JJVEUocGRhdGEsIHJlZywgcmVnX3ZhbCk7CisKKwkJcmVnICs9IE1UTF9SUURDTV9JTkM7CisJCXJlZ192YWwgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfZmxvd19jb250cm9sX3RocmVzaG9sZChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmh3X2ZlYXQucnhfcV9jbnQ7IGkrKykgeworCQkvKiBBY3RpdmF0ZSBmbG93IGNvbnRyb2wgd2hlbiBsZXNzIHRoYW4gNGsgbGVmdCBpbiBmaWZvICovCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1JRT01SLCBSRkEsIDIpOworCisJCS8qIERlLWFjdGl2YXRlIGZsb3cgY29udHJvbCB3aGVuIG1vcmUgdGhhbiA2ayBsZWZ0IGluIGZpZm8gKi8KKwkJWEdNQUNfTVRMX0lPV1JJVEVfQklUUyhwZGF0YSwgaSwgTVRMX1FfUlFPTVIsIFJGRCwgNCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ19tYWNfYWRkcmVzcyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJeGdiZV9zZXRfbWFjX2FkZHJlc3MocGRhdGEsIHBkYXRhLT5uZXRkZXYtPmRldl9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfanVtYm9fZW5hYmxlKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gKHBkYXRhLT5uZXRkZXYtPm10dSA+IFhHTUFDX1NURF9QQUNLRVRfTVRVKSA/IDEgOiAwOworCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUkNSLCBKRSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9jb25maWdfY2hlY2tzdW1fb2ZmbG9hZChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJaWYgKHBkYXRhLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pCisJCXhnYmVfZW5hYmxlX3J4X2NzdW0ocGRhdGEpOworCWVsc2UKKwkJeGdiZV9kaXNhYmxlX3J4X2NzdW0ocGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2NvbmZpZ192bGFuX3N1cHBvcnQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCWlmIChwZGF0YS0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKQorCQl4Z2JlX2VuYWJsZV9yeF92bGFuX3N0cmlwcGluZyhwZGF0YSk7CisJZWxzZQorCQl4Z2JlX2Rpc2FibGVfcnhfdmxhbl9zdHJpcHBpbmcocGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3R4X21tY19pbnQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX21tY19zdGF0cyAqc3RhdHMgPSAmcGRhdGEtPm1tY19zdGF0czsKKwl1bnNpZ25lZCBpbnQgbW1jX2lzciA9IFhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RJU1IpOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWE9DVEVUQ09VTlRfR0IpKQorCQlzdGF0cy0+dHhvY3RldGNvdW50X2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWE9DVEVUQ09VTlRfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWEZSQU1FQ09VTlRfR0IpKQorCQlzdGF0cy0+dHhmcmFtZWNvdW50X2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWEZSQU1FQ09VTlRfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWEJST0FEQ0FTVEZSQU1FU19HKSkKKwkJc3RhdHMtPnR4YnJvYWRjYXN0ZnJhbWVzX2cgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYQlJPQURDQVNURlJBTUVTX0dfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWE1VTFRJQ0FTVEZSQU1FU19HKSkKKwkJc3RhdHMtPnR4bXVsdGljYXN0ZnJhbWVzX2cgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYTVVMVElDQVNURlJBTUVTX0dfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDY0T0NURVRTX0dCKSkKKwkJc3RhdHMtPnR4NjRvY3RldHNfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYNjRPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDY1VE8xMjdPQ1RFVFNfR0IpKQorCQlzdGF0cy0+dHg2NXRvMTI3b2N0ZXRzX2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWDY1VE8xMjdPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDEyOFRPMjU1T0NURVRTX0dCKSkKKwkJc3RhdHMtPnR4MTI4dG8yNTVvY3RldHNfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYMTI4VE8yNTVPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDI1NlRPNTExT0NURVRTX0dCKSkKKwkJc3RhdHMtPnR4MjU2dG81MTFvY3RldHNfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYMjU2VE81MTFPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDUxMlRPMTAyM09DVEVUU19HQikpCisJCXN0YXRzLT50eDUxMnRvMTAyM29jdGV0c19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFg1MTJUTzEwMjNPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWDEwMjRUT01BWE9DVEVUU19HQikpCisJCXN0YXRzLT50eDEwMjR0b21heG9jdGV0c19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFgxMDI0VE9NQVhPQ1RFVFNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWFVOSUNBU1RGUkFNRVNfR0IpKQorCQlzdGF0cy0+dHh1bmljYXN0ZnJhbWVzX2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWFVOSUNBU1RGUkFNRVNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWE1VTFRJQ0FTVEZSQU1FU19HQikpCisJCXN0YXRzLT50eG11bHRpY2FzdGZyYW1lc19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFhNVUxUSUNBU1RGUkFNRVNfR0JfTE8pOworCisJaWYgKFhHTUFDX0dFVF9CSVRTKG1tY19pc3IsIE1NQ19USVNSLCBUWEJST0FEQ0FTVEZSQU1FU19HQikpCisJCXN0YXRzLT50eGJyb2FkY2FzdGZyYW1lc19nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWEJST0FEQ0FTVEZSQU1FU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1RJU1IsIFRYVU5ERVJGTE9XRVJST1IpKQorCQlzdGF0cy0+dHh1bmRlcmZsb3dlcnJvciArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFhVTkRFUkZMT1dFUlJPUl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1RJU1IsIFRYT0NURVRDT1VOVF9HKSkKKwkJc3RhdHMtPnR4b2N0ZXRjb3VudF9nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWE9DVEVUQ09VTlRfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1RJU1IsIFRYRlJBTUVDT1VOVF9HKSkKKwkJc3RhdHMtPnR4ZnJhbWVjb3VudF9nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWEZSQU1FQ09VTlRfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1RJU1IsIFRYUEFVU0VGUkFNRVMpKQorCQlzdGF0cy0+dHhwYXVzZWZyYW1lcyArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFhQQVVTRUZSQU1FU19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1RJU1IsIFRYVkxBTkZSQU1FU19HKSkKKwkJc3RhdHMtPnR4dmxhbmZyYW1lc19nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWFZMQU5GUkFNRVNfR19MTyk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcnhfbW1jX2ludChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfbW1jX3N0YXRzICpzdGF0cyA9ICZwZGF0YS0+bW1jX3N0YXRzOworCXVuc2lnbmVkIGludCBtbWNfaXNyID0gWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUklTUik7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYRlJBTUVDT1VOVF9HQikpCisJCXN0YXRzLT5yeGZyYW1lY291bnRfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYRlJBTUVDT1VOVF9HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYT0NURVRDT1VOVF9HQikpCisJCXN0YXRzLT5yeG9jdGV0Y291bnRfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYT0NURVRDT1VOVF9HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYT0NURVRDT1VOVF9HKSkKKwkJc3RhdHMtPnJ4b2N0ZXRjb3VudF9nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWE9DVEVUQ09VTlRfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYQlJPQURDQVNURlJBTUVTX0cpKQorCQlzdGF0cy0+cnhicm9hZGNhc3RmcmFtZXNfZyArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhCUk9BRENBU1RGUkFNRVNfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYTVVMVElDQVNURlJBTUVTX0cpKQorCQlzdGF0cy0+cnhtdWx0aWNhc3RmcmFtZXNfZyArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhNVUxUSUNBU1RGUkFNRVNfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYQ1JDRVJST1IpKQorCQlzdGF0cy0+cnhjcmNlcnJvciArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhDUkNFUlJPUl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYUlVOVEVSUk9SKSkKKwkJc3RhdHMtPnJ4cnVudGVycm9yICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWFJVTlRFUlJPUik7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYSkFCQkVSRVJST1IpKQorCQlzdGF0cy0+cnhqYWJiZXJlcnJvciArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhKQUJCRVJFUlJPUik7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYVU5ERVJTSVpFX0cpKQorCQlzdGF0cy0+cnh1bmRlcnNpemVfZyArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhVTkRFUlNJWkVfRyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYT1ZFUlNJWkVfRykpCisJCXN0YXRzLT5yeG92ZXJzaXplX2cgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYT1ZFUlNJWkVfRyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYNjRPQ1RFVFNfR0IpKQorCQlzdGF0cy0+cng2NG9jdGV0c19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlg2NE9DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYNjVUTzEyN09DVEVUU19HQikpCisJCXN0YXRzLT5yeDY1dG8xMjdvY3RldHNfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYNjVUTzEyN09DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYMTI4VE8yNTVPQ1RFVFNfR0IpKQorCQlzdGF0cy0+cngxMjh0bzI1NW9jdGV0c19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlgxMjhUTzI1NU9DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYMjU2VE81MTFPQ1RFVFNfR0IpKQorCQlzdGF0cy0+cngyNTZ0bzUxMW9jdGV0c19nYiArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlgyNTZUTzUxMU9DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYNTEyVE8xMDIzT0NURVRTX0dCKSkKKwkJc3RhdHMtPnJ4NTEydG8xMDIzb2N0ZXRzX2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWDUxMlRPMTAyM09DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYMTAyNFRPTUFYT0NURVRTX0dCKSkKKwkJc3RhdHMtPnJ4MTAyNHRvbWF4b2N0ZXRzX2diICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWDEwMjRUT01BWE9DVEVUU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYVU5JQ0FTVEZSQU1FU19HKSkKKwkJc3RhdHMtPnJ4dW5pY2FzdGZyYW1lc19nICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWFVOSUNBU1RGUkFNRVNfR19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYTEVOR1RIRVJST1IpKQorCQlzdGF0cy0+cnhsZW5ndGhlcnJvciArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhMRU5HVEhFUlJPUl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYT1VUT0ZSQU5HRVRZUEUpKQorCQlzdGF0cy0+cnhvdXRvZnJhbmdldHlwZSArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhPVVRPRlJBTkdFVFlQRV9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYUEFVU0VGUkFNRVMpKQorCQlzdGF0cy0+cnhwYXVzZWZyYW1lcyArPQorCQkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhQQVVTRUZSQU1FU19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYRklGT09WRVJGTE9XKSkKKwkJc3RhdHMtPnJ4Zmlmb292ZXJmbG93ICs9CisJCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWEZJRk9PVkVSRkxPV19MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYVkxBTkZSQU1FU19HQikpCisJCXN0YXRzLT5yeHZsYW5mcmFtZXNfZ2IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYVkxBTkZSQU1FU19HQl9MTyk7CisKKwlpZiAoWEdNQUNfR0VUX0JJVFMobW1jX2lzciwgTU1DX1JJU1IsIFJYV0FUQ0hET0dFUlJPUikpCisJCXN0YXRzLT5yeHdhdGNoZG9nZXJyb3IgKz0KKwkJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYV0FUQ0hET0dFUlJPUik7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcmVhZF9tbWNfc3RhdHMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX21tY19zdGF0cyAqc3RhdHMgPSAmcGRhdGEtPm1tY19zdGF0czsKKworCS8qIEZyZWV6ZSBjb3VudGVycyAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTU1DX0NSLCBNQ0YsIDEpOworCisJc3RhdHMtPnR4b2N0ZXRjb3VudF9nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWE9DVEVUQ09VTlRfR0JfTE8pOworCisJc3RhdHMtPnR4ZnJhbWVjb3VudF9nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWEZSQU1FQ09VTlRfR0JfTE8pOworCisJc3RhdHMtPnR4YnJvYWRjYXN0ZnJhbWVzX2cgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFhCUk9BRENBU1RGUkFNRVNfR19MTyk7CisKKwlzdGF0cy0+dHhtdWx0aWNhc3RmcmFtZXNfZyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWE1VTFRJQ0FTVEZSQU1FU19HX0xPKTsKKworCXN0YXRzLT50eDY0b2N0ZXRzX2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYNjRPQ1RFVFNfR0JfTE8pOworCisJc3RhdHMtPnR4NjV0bzEyN29jdGV0c19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWDY1VE8xMjdPQ1RFVFNfR0JfTE8pOworCisJc3RhdHMtPnR4MTI4dG8yNTVvY3RldHNfZ2IgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFgxMjhUTzI1NU9DVEVUU19HQl9MTyk7CisKKwlzdGF0cy0+dHgyNTZ0bzUxMW9jdGV0c19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWDI1NlRPNTExT0NURVRTX0dCX0xPKTsKKworCXN0YXRzLT50eDUxMnRvMTAyM29jdGV0c19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWDUxMlRPMTAyM09DVEVUU19HQl9MTyk7CisKKwlzdGF0cy0+dHgxMDI0dG9tYXhvY3RldHNfZ2IgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfVFgxMDI0VE9NQVhPQ1RFVFNfR0JfTE8pOworCisJc3RhdHMtPnR4dW5pY2FzdGZyYW1lc19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWFVOSUNBU1RGUkFNRVNfR0JfTE8pOworCisJc3RhdHMtPnR4bXVsdGljYXN0ZnJhbWVzX2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYTVVMVElDQVNURlJBTUVTX0dCX0xPKTsKKworCXN0YXRzLT50eGJyb2FkY2FzdGZyYW1lc19nICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYQlJPQURDQVNURlJBTUVTX0dCX0xPKTsKKworCXN0YXRzLT50eHVuZGVyZmxvd2Vycm9yICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYVU5ERVJGTE9XRVJST1JfTE8pOworCisJc3RhdHMtPnR4b2N0ZXRjb3VudF9nICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1RYT0NURVRDT1VOVF9HX0xPKTsKKworCXN0YXRzLT50eGZyYW1lY291bnRfZyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWEZSQU1FQ09VTlRfR19MTyk7CisKKwlzdGF0cy0+dHhwYXVzZWZyYW1lcyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWFBBVVNFRlJBTUVTX0xPKTsKKworCXN0YXRzLT50eHZsYW5mcmFtZXNfZyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19UWFZMQU5GUkFNRVNfR19MTyk7CisKKwlzdGF0cy0+cnhmcmFtZWNvdW50X2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYRlJBTUVDT1VOVF9HQl9MTyk7CisKKwlzdGF0cy0+cnhvY3RldGNvdW50X2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYT0NURVRDT1VOVF9HQl9MTyk7CisKKwlzdGF0cy0+cnhvY3RldGNvdW50X2cgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhPQ1RFVENPVU5UX0dfTE8pOworCisJc3RhdHMtPnJ4YnJvYWRjYXN0ZnJhbWVzX2cgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhCUk9BRENBU1RGUkFNRVNfR19MTyk7CisKKwlzdGF0cy0+cnhtdWx0aWNhc3RmcmFtZXNfZyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWE1VTFRJQ0FTVEZSQU1FU19HX0xPKTsKKworCXN0YXRzLT5yeGNyY2Vycm9yICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYQ1JDRVJST1JfTE8pOworCisJc3RhdHMtPnJ4cnVudGVycm9yICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYUlVOVEVSUk9SKTsKKworCXN0YXRzLT5yeGphYmJlcmVycm9yICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYSkFCQkVSRVJST1IpOworCisJc3RhdHMtPnJ4dW5kZXJzaXplX2cgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhVTkRFUlNJWkVfRyk7CisKKwlzdGF0cy0+cnhvdmVyc2l6ZV9nICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYT1ZFUlNJWkVfRyk7CisKKwlzdGF0cy0+cng2NG9jdGV0c19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWDY0T0NURVRTX0dCX0xPKTsKKworCXN0YXRzLT5yeDY1dG8xMjdvY3RldHNfZ2IgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlg2NVRPMTI3T0NURVRTX0dCX0xPKTsKKworCXN0YXRzLT5yeDEyOHRvMjU1b2N0ZXRzX2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYMTI4VE8yNTVPQ1RFVFNfR0JfTE8pOworCisJc3RhdHMtPnJ4MjU2dG81MTFvY3RldHNfZ2IgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlgyNTZUTzUxMU9DVEVUU19HQl9MTyk7CisKKwlzdGF0cy0+cng1MTJ0bzEwMjNvY3RldHNfZ2IgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlg1MTJUTzEwMjNPQ1RFVFNfR0JfTE8pOworCisJc3RhdHMtPnJ4MTAyNHRvbWF4b2N0ZXRzX2diICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYMTAyNFRPTUFYT0NURVRTX0dCX0xPKTsKKworCXN0YXRzLT5yeHVuaWNhc3RmcmFtZXNfZyArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWFVOSUNBU1RGUkFNRVNfR19MTyk7CisKKwlzdGF0cy0+cnhsZW5ndGhlcnJvciArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWExFTkdUSEVSUk9SX0xPKTsKKworCXN0YXRzLT5yeG91dG9mcmFuZ2V0eXBlICs9CisJCVhHTUFDX0lPUkVBRChwZGF0YSwgTU1DX1JYT1VUT0ZSQU5HRVRZUEVfTE8pOworCisJc3RhdHMtPnJ4cGF1c2VmcmFtZXMgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhQQVVTRUZSQU1FU19MTyk7CisKKwlzdGF0cy0+cnhmaWZvb3ZlcmZsb3cgKz0KKwkJWEdNQUNfSU9SRUFEKHBkYXRhLCBNTUNfUlhGSUZPT1ZFUkZMT1dfTE8pOworCisJc3RhdHMtPnJ4dmxhbmZyYW1lc19nYiArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWFZMQU5GUkFNRVNfR0JfTE8pOworCisJc3RhdHMtPnJ4d2F0Y2hkb2dlcnJvciArPQorCQlYR01BQ19JT1JFQUQocGRhdGEsIE1NQ19SWFdBVENIRE9HRVJST1IpOworCisJLyogVW4tZnJlZXplIGNvdW50ZXJzICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNTUNfQ1IsIE1DRiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfY29uZmlnX21tYyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJLyogU2V0IGNvdW50ZXJzIHRvIHJlc2V0IG9uIHJlYWQgKi8KKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1NQ19DUiwgUk9SLCAxKTsKKworCS8qIFJlc2V0IHRoZSBjb3VudGVycyAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTU1DX0NSLCBDUiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZW5hYmxlX3R4KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCisJLyogRW5hYmxlIGVhY2ggVHggRE1BIGNoYW5uZWwgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnR4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9UQ1IsIFNULCAxKTsKKwl9CisKKwkvKiBFbmFibGUgZWFjaCBUeCBxdWV1ZSAqLworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+aHdfZmVhdC50eF9xX2NudDsgaSsrKQorCQlYR01BQ19NVExfSU9XUklURV9CSVRTKHBkYXRhLCBpLCBNVExfUV9UUU9NUiwgVFhRRU4sCisJCQkJICAgICAgIE1UTF9RX0VOQUJMRUQpOworCisJLyogRW5hYmxlIE1BQyBUeCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1RDUiwgVEUsIDEpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2Rpc2FibGVfdHgoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBEaXNhYmxlIE1BQyBUeCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1RDUiwgVEUsIDApOworCisJLyogRGlzYWJsZSBlYWNoIFR4IHF1ZXVlICovCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5od19mZWF0LnR4X3FfY250OyBpKyspCisJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1RRT01SLCBUWFFFTiwgMCk7CisKKwkvKiBEaXNhYmxlIGVhY2ggVHggRE1BIGNoYW5uZWwgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnR4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9UQ1IsIFNULCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZW5hYmxlX3J4KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCByZWdfdmFsLCBpOworCisJLyogRW5hYmxlIGVhY2ggUnggRE1BIGNoYW5uZWwgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnJ4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9SQ1IsIFNSLCAxKTsKKwl9CisKKwkvKiBFbmFibGUgZWFjaCBSeCBxdWV1ZSAqLworCXJlZ192YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+aHdfZmVhdC5yeF9xX2NudDsgaSsrKQorCQlyZWdfdmFsIHw9ICgweDAyIDw8IChpIDw8IDEpKTsKKwlYR01BQ19JT1dSSVRFKHBkYXRhLCBNQUNfUlFDMFIsIHJlZ192YWwpOworCisJLyogRW5hYmxlIE1BQyBSeCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1JDUiwgRENSQ0MsIDEpOworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1JDUiwgQ1NULCAxKTsKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19SQ1IsIEFDUywgMSk7CisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUkNSLCBSRSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZGlzYWJsZV9yeChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERpc2FibGUgTUFDIFJ4ICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUkNSLCBEQ1JDQywgMCk7CisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfUkNSLCBDU1QsIDApOworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1JDUiwgQUNTLCAwKTsKKwlYR01BQ19JT1dSSVRFX0JJVFMocGRhdGEsIE1BQ19SQ1IsIFJFLCAwKTsKKworCS8qIERpc2FibGUgZWFjaCBSeCBxdWV1ZSAqLworCVhHTUFDX0lPV1JJVEUocGRhdGEsIE1BQ19SUUMwUiwgMCk7CisKKwkvKiBEaXNhYmxlIGVhY2ggUnggRE1BIGNoYW5uZWwgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnJ4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9SQ1IsIFNSLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcG93ZXJ1cF90eChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEVuYWJsZSBlYWNoIFR4IERNQSBjaGFubmVsICovCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKCFjaGFubmVsLT50eF9yaW5nKQorCQkJYnJlYWs7CisKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfVENSLCBTVCwgMSk7CisJfQorCisJLyogRW5hYmxlIE1BQyBUeCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTUFDX1RDUiwgVEUsIDEpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3Bvd2VyZG93bl90eChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERpc2FibGUgTUFDIFR4ICovCisJWEdNQUNfSU9XUklURV9CSVRTKHBkYXRhLCBNQUNfVENSLCBURSwgMCk7CisKKwkvKiBEaXNhYmxlIGVhY2ggVHggRE1BIGNoYW5uZWwgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnR4X3JpbmcpCisJCQlicmVhazsKKworCQlYR01BQ19ETUFfSU9XUklURV9CSVRTKGNoYW5uZWwsIERNQV9DSF9UQ1IsIFNULCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcG93ZXJ1cF9yeChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEVuYWJsZSBlYWNoIFJ4IERNQSBjaGFubmVsICovCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKCFjaGFubmVsLT5yeF9yaW5nKQorCQkJYnJlYWs7CisKKwkJWEdNQUNfRE1BX0lPV1JJVEVfQklUUyhjaGFubmVsLCBETUFfQ0hfUkNSLCBTUiwgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2JlX3Bvd2VyZG93bl9yeChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERpc2FibGUgZWFjaCBSeCBETUEgY2hhbm5lbCAqLworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKSB7CisJCWlmICghY2hhbm5lbC0+cnhfcmluZykKKwkJCWJyZWFrOworCisJCVhHTUFDX0RNQV9JT1dSSVRFX0JJVFMoY2hhbm5lbCwgRE1BX0NIX1JDUiwgU1IsIDApOworCX0KK30KKworc3RhdGljIGludCB4Z2JlX2luaXQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2Rlc2NfaWYgKmRlc2NfaWYgPSAmcGRhdGEtPmRlc2NfaWY7CisJaW50IHJldDsKKworCURCR1BSKCItLT54Z2JlX2luaXRcbiIpOworCisJLyogRmx1c2ggVHggcXVldWVzICovCisJcmV0ID0geGdiZV9mbHVzaF90eF9xdWV1ZXMocGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgRE1BIHJlbGF0ZWQgZmVhdHVyZXMKKwkgKi8KKwl4Z2JlX2NvbmZpZ19kbWFfYnVzKHBkYXRhKTsKKwl4Z2JlX2NvbmZpZ19kbWFfY2FjaGUocGRhdGEpOworCXhnYmVfY29uZmlnX29zcF9tb2RlKHBkYXRhKTsKKwl4Z2JlX2NvbmZpZ19wYmx4OChwZGF0YSk7CisJeGdiZV9jb25maWdfdHhfcGJsX3ZhbChwZGF0YSk7CisJeGdiZV9jb25maWdfcnhfcGJsX3ZhbChwZGF0YSk7CisJeGdiZV9jb25maWdfcnhfY29hbGVzY2UocGRhdGEpOworCXhnYmVfY29uZmlnX3R4X2NvYWxlc2NlKHBkYXRhKTsKKwl4Z2JlX2NvbmZpZ19yeF9idWZmZXJfc2l6ZShwZGF0YSk7CisJeGdiZV9jb25maWdfdHNvX21vZGUocGRhdGEpOworCWRlc2NfaWYtPndyYXBwZXJfdHhfZGVzY19pbml0KHBkYXRhKTsKKwlkZXNjX2lmLT53cmFwcGVyX3J4X2Rlc2NfaW5pdChwZGF0YSk7CisJeGdiZV9lbmFibGVfZG1hX2ludGVycnVwdHMocGRhdGEpOworCisJLyoKKwkgKiBJbml0aWFsaXplIE1UTCByZWxhdGVkIGZlYXR1cmVzCisJICovCisJeGdiZV9jb25maWdfbXRsX21vZGUocGRhdGEpOworCXhnYmVfY29uZmlnX3J4X3F1ZXVlX21hcHBpbmcocGRhdGEpOworCS8qVE9ETzogUHJvZ3JhbSB0aGUgcHJpb3JpdGllcyBtYXBwZWQgdG8gdGhlIFNlbGVjdGVkIFRyYWZmaWMgQ2xhc3NlcworCQlpbiBNVExfVENfUHJ0eV9NYXAwLTMgcmVnaXN0ZXJzICovCisJeGdiZV9jb25maWdfdHNmX21vZGUocGRhdGEsIHBkYXRhLT50eF9zZl9tb2RlKTsKKwl4Z2JlX2NvbmZpZ19yc2ZfbW9kZShwZGF0YSwgcGRhdGEtPnJ4X3NmX21vZGUpOworCXhnYmVfY29uZmlnX3R4X3RocmVzaG9sZChwZGF0YSwgcGRhdGEtPnR4X3RocmVzaG9sZCk7CisJeGdiZV9jb25maWdfcnhfdGhyZXNob2xkKHBkYXRhLCBwZGF0YS0+cnhfdGhyZXNob2xkKTsKKwl4Z2JlX2NvbmZpZ190eF9maWZvX3NpemUocGRhdGEpOworCXhnYmVfY29uZmlnX3J4X2ZpZm9fc2l6ZShwZGF0YSk7CisJeGdiZV9jb25maWdfZmxvd19jb250cm9sX3RocmVzaG9sZChwZGF0YSk7CisJLypUT0RPOiBRdWV1ZSB0byBUcmFmZmljIENsYXNzIE1hcHBpbmcgKFEyVENNQVApICovCisJLypUT0RPOiBFcnJvciBQYWNrZXQgYW5kIHVuZGVyc2l6ZWQgZ29vZCBQYWNrZXQgZm9yd2FyZGluZyBlbmFibGUKKwkJKEZFUCBhbmQgRlVQKQorCSAqLworCXhnYmVfZW5hYmxlX210bF9pbnRlcnJ1cHRzKHBkYXRhKTsKKworCS8qIFRyYW5zbWl0IENsYXNzIFdlaWdodCAqLworCVhHTUFDX0lPV1JJVEVfQklUUyhwZGF0YSwgTVRMX1FfVENRV1IsIFFXLCAweDEwKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBNQUMgcmVsYXRlZCBmZWF0dXJlcworCSAqLworCXhnYmVfY29uZmlnX21hY19hZGRyZXNzKHBkYXRhKTsKKwl4Z2JlX2NvbmZpZ19qdW1ib19lbmFibGUocGRhdGEpOworCXhnYmVfY29uZmlnX2Zsb3dfY29udHJvbChwZGF0YSk7CisJeGdiZV9jb25maWdfY2hlY2tzdW1fb2ZmbG9hZChwZGF0YSk7CisJeGdiZV9jb25maWdfdmxhbl9zdXBwb3J0KHBkYXRhKTsKKwl4Z2JlX2NvbmZpZ19tbWMocGRhdGEpOworCXhnYmVfZW5hYmxlX21hY19pbnRlcnJ1cHRzKHBkYXRhKTsKKworCURCR1BSKCI8LS14Z2JlX2luaXRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGV2KHN0cnVjdCB4Z2JlX2h3X2lmICpod19pZikKK3sKKwlEQkdQUigiLS0+eGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNcbiIpOworCisJaHdfaWYtPnR4X2NvbXBsZXRlID0geGdiZV90eF9jb21wbGV0ZTsKKworCWh3X2lmLT5zZXRfcHJvbWlzY3VvdXNfbW9kZSA9IHhnYmVfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJaHdfaWYtPnNldF9hbGxfbXVsdGljYXN0X21vZGUgPSB4Z2JlX3NldF9hbGxfbXVsdGljYXN0X21vZGU7CisJaHdfaWYtPnNldF9hZGRuX21hY19hZGRycyA9IHhnYmVfc2V0X2FkZG5fbWFjX2FkZHJzOworCWh3X2lmLT5zZXRfbWFjX2FkZHJlc3MgPSB4Z2JlX3NldF9tYWNfYWRkcmVzczsKKworCWh3X2lmLT5lbmFibGVfcnhfY3N1bSA9IHhnYmVfZW5hYmxlX3J4X2NzdW07CisJaHdfaWYtPmRpc2FibGVfcnhfY3N1bSA9IHhnYmVfZGlzYWJsZV9yeF9jc3VtOworCisJaHdfaWYtPmVuYWJsZV9yeF92bGFuX3N0cmlwcGluZyA9IHhnYmVfZW5hYmxlX3J4X3ZsYW5fc3RyaXBwaW5nOworCWh3X2lmLT5kaXNhYmxlX3J4X3ZsYW5fc3RyaXBwaW5nID0geGdiZV9kaXNhYmxlX3J4X3ZsYW5fc3RyaXBwaW5nOworCisJaHdfaWYtPnJlYWRfbW1kX3JlZ3MgPSB4Z2JlX3JlYWRfbW1kX3JlZ3M7CisJaHdfaWYtPndyaXRlX21tZF9yZWdzID0geGdiZV93cml0ZV9tbWRfcmVnczsKKworCWh3X2lmLT5zZXRfZ21paV9zcGVlZCA9IHhnYmVfc2V0X2dtaWlfc3BlZWQ7CisJaHdfaWYtPnNldF9nbWlpXzI1MDBfc3BlZWQgPSB4Z2JlX3NldF9nbWlpXzI1MDBfc3BlZWQ7CisJaHdfaWYtPnNldF94Z21paV9zcGVlZCA9IHhnYmVfc2V0X3hnbWlpX3NwZWVkOworCisJaHdfaWYtPmVuYWJsZV90eCA9IHhnYmVfZW5hYmxlX3R4OworCWh3X2lmLT5kaXNhYmxlX3R4ID0geGdiZV9kaXNhYmxlX3R4OworCWh3X2lmLT5lbmFibGVfcnggPSB4Z2JlX2VuYWJsZV9yeDsKKwlod19pZi0+ZGlzYWJsZV9yeCA9IHhnYmVfZGlzYWJsZV9yeDsKKworCWh3X2lmLT5wb3dlcnVwX3R4ID0geGdiZV9wb3dlcnVwX3R4OworCWh3X2lmLT5wb3dlcmRvd25fdHggPSB4Z2JlX3Bvd2VyZG93bl90eDsKKwlod19pZi0+cG93ZXJ1cF9yeCA9IHhnYmVfcG93ZXJ1cF9yeDsKKwlod19pZi0+cG93ZXJkb3duX3J4ID0geGdiZV9wb3dlcmRvd25fcng7CisKKwlod19pZi0+cHJlX3htaXQgPSB4Z2JlX3ByZV94bWl0OworCWh3X2lmLT5kZXZfcmVhZCA9IHhnYmVfZGV2X3JlYWQ7CisJaHdfaWYtPmVuYWJsZV9pbnQgPSB4Z2JlX2VuYWJsZV9pbnQ7CisJaHdfaWYtPmRpc2FibGVfaW50ID0geGdiZV9kaXNhYmxlX2ludDsKKwlod19pZi0+aW5pdCA9IHhnYmVfaW5pdDsKKwlod19pZi0+ZXhpdCA9IHhnYmVfZXhpdDsKKworCS8qIERlc2NyaXB0b3IgcmVsYXRlZCBTZXF1ZW5jZXMgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBoZXJlICovCisJaHdfaWYtPnR4X2Rlc2NfaW5pdCA9IHhnYmVfdHhfZGVzY19pbml0OworCWh3X2lmLT5yeF9kZXNjX2luaXQgPSB4Z2JlX3J4X2Rlc2NfaW5pdDsKKwlod19pZi0+dHhfZGVzY19yZXNldCA9IHhnYmVfdHhfZGVzY19yZXNldDsKKwlod19pZi0+cnhfZGVzY19yZXNldCA9IHhnYmVfcnhfZGVzY19yZXNldDsKKwlod19pZi0+aXNfbGFzdF9kZXNjID0geGdiZV9pc19sYXN0X2Rlc2M7CisJaHdfaWYtPmlzX2NvbnRleHRfZGVzYyA9IHhnYmVfaXNfY29udGV4dF9kZXNjOworCisJLyogRm9yIEZMT1cgY3RybCAqLworCWh3X2lmLT5jb25maWdfdHhfZmxvd19jb250cm9sID0geGdiZV9jb25maWdfdHhfZmxvd19jb250cm9sOworCWh3X2lmLT5jb25maWdfcnhfZmxvd19jb250cm9sID0geGdiZV9jb25maWdfcnhfZmxvd19jb250cm9sOworCisJLyogRm9yIFJYIGNvYWxlc2NpbmcgKi8KKwlod19pZi0+Y29uZmlnX3J4X2NvYWxlc2NlID0geGdiZV9jb25maWdfcnhfY29hbGVzY2U7CisJaHdfaWYtPmNvbmZpZ190eF9jb2FsZXNjZSA9IHhnYmVfY29uZmlnX3R4X2NvYWxlc2NlOworCWh3X2lmLT51c2VjX3RvX3Jpd3QgPSB4Z2JlX3VzZWNfdG9fcml3dDsKKwlod19pZi0+cml3dF90b191c2VjID0geGdiZV9yaXd0X3RvX3VzZWM7CisKKwkvKiBGb3IgUlggYW5kIFRYIHRocmVzaG9sZCBjb25maWcgKi8KKwlod19pZi0+Y29uZmlnX3J4X3RocmVzaG9sZCA9IHhnYmVfY29uZmlnX3J4X3RocmVzaG9sZDsKKwlod19pZi0+Y29uZmlnX3R4X3RocmVzaG9sZCA9IHhnYmVfY29uZmlnX3R4X3RocmVzaG9sZDsKKworCS8qIEZvciBSWCBhbmQgVFggU3RvcmUgYW5kIEZvcndhcmQgTW9kZSBjb25maWcgKi8KKwlod19pZi0+Y29uZmlnX3JzZl9tb2RlID0geGdiZV9jb25maWdfcnNmX21vZGU7CisJaHdfaWYtPmNvbmZpZ190c2ZfbW9kZSA9IHhnYmVfY29uZmlnX3RzZl9tb2RlOworCisJLyogRm9yIFRYIERNQSBPcGVyYXRpbmcgb24gU2Vjb25kIEZyYW1lIGNvbmZpZyAqLworCWh3X2lmLT5jb25maWdfb3NwX21vZGUgPSB4Z2JlX2NvbmZpZ19vc3BfbW9kZTsKKworCS8qIEZvciBSWCBhbmQgVFggUEJMIGNvbmZpZyAqLworCWh3X2lmLT5jb25maWdfcnhfcGJsX3ZhbCA9IHhnYmVfY29uZmlnX3J4X3BibF92YWw7CisJaHdfaWYtPmdldF9yeF9wYmxfdmFsID0geGdiZV9nZXRfcnhfcGJsX3ZhbDsKKwlod19pZi0+Y29uZmlnX3R4X3BibF92YWwgPSB4Z2JlX2NvbmZpZ190eF9wYmxfdmFsOworCWh3X2lmLT5nZXRfdHhfcGJsX3ZhbCA9IHhnYmVfZ2V0X3R4X3BibF92YWw7CisJaHdfaWYtPmNvbmZpZ19wYmx4OCA9IHhnYmVfY29uZmlnX3BibHg4OworCisJLyogRm9yIE1NQyBzdGF0aXN0aWNzIHN1cHBvcnQgKi8KKwlod19pZi0+dHhfbW1jX2ludCA9IHhnYmVfdHhfbW1jX2ludDsKKwlod19pZi0+cnhfbW1jX2ludCA9IHhnYmVfcnhfbW1jX2ludDsKKwlod19pZi0+cmVhZF9tbWNfc3RhdHMgPSB4Z2JlX3JlYWRfbW1jX3N0YXRzOworCisJREJHUFIoIjwtLXhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTNkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCkBAIC0wLDAgKzEsMTM1MSBAQAorLyoKKyAqIEFNRCAxMEdiIEV0aGVybmV0IGRyaXZlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisgKiBsaWNlbnNlczoKKyAqCisgKiBMaWNlbnNlIDE6IEdQTHYyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSBjb3B5LCByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqICAgICBUaGUgU3lub3BzeXMgRFdDIEVUSEVSIFhHTUFDIFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbgorICogICAgIChoZXJlaW5hZnRlciAiU29mdHdhcmUiKSBpcyBhbiB1bnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLAorICogICAgIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cworICogICAgIGFuZCB5b3UuCisgKgorICogICAgIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiAgICAgdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQKKyAqICAgICBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5CisgKiAgICAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICAgYW5ub3RhdGVkIHdpdGggdGhpcyBsaWNlbnNlIGFuZCB0aGUgU29mdHdhcmUsIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCisgKiAgICAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAqICAgICB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiAgICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqICAgICBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogICAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTCisgKiAgICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIExpY2Vuc2UgMjogTW9kaWZpZWQgQlNECisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKyNpbmNsdWRlICJ4Z2JlLmgiCisjaW5jbHVkZSAieGdiZS1jb21tb24uaCIKKworCitzdGF0aWMgaW50IHhnYmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHhnYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHhnYmVfdHhfYXZhaWxfZGVzYyhzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nKQoreworCXJldHVybiAocmluZy0+cmRlc2NfY291bnQgLSAocmluZy0+Y3VyIC0gcmluZy0+ZGlydHkpKTsKK30KKworc3RhdGljIGludCB4Z2JlX2NhbGNfcnhfYnVmX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdW5zaWduZWQgaW50IG10dSkKK3sKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3NpemU7CisKKwlpZiAobXR1ID4gWEdNQUNfSlVNQk9fUEFDS0VUX01UVSkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiTVRVIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyeF9idWZfc2l6ZSA9IG10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyBWTEFOX0hMRU47CisJaWYgKHJ4X2J1Zl9zaXplIDwgUlhfTUlOX0JVRl9TSVpFKQorCQlyeF9idWZfc2l6ZSA9IFJYX01JTl9CVUZfU0laRTsKKwlyeF9idWZfc2l6ZSA9IChyeF9idWZfc2l6ZSArIFJYX0JVRl9BTElHTiAtIDEpICYgfihSWF9CVUZfQUxJR04gLSAxKTsKKworCXJldHVybiByeF9idWZfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9lbmFibGVfcnhfdHhfaW50cyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKGNoYW5uZWwtPnR4X3JpbmcpCisJCQlod19pZi0+ZW5hYmxlX2ludChjaGFubmVsLAorCQkJCQkgIFhHTUFDX0lOVF9ETUFfQ0hfU1JfVEkpOworCQlpZiAoY2hhbm5lbC0+cnhfcmluZykKKwkJCWh3X2lmLT5lbmFibGVfaW50KGNoYW5uZWwsCisJCQkJCSAgWEdNQUNfSU5UX0RNQV9DSF9TUl9SSSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2JlX2Rpc2FibGVfcnhfdHhfaW50cyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKGNoYW5uZWwtPnR4X3JpbmcpCisJCQlod19pZi0+ZGlzYWJsZV9pbnQoY2hhbm5lbCwKKwkJCQkJICAgWEdNQUNfSU5UX0RNQV9DSF9TUl9USSk7CisJCWlmIChjaGFubmVsLT5yeF9yaW5nKQorCQkJaHdfaWYtPmRpc2FibGVfaW50KGNoYW5uZWwsCisJCQkJCSAgIFhHTUFDX0lOVF9ETUFfQ0hfU1JfUkkpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHhnYmVfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gZGF0YTsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGRtYV9pc3IsIGRtYV9jaF9pc3I7CisJdW5zaWduZWQgaW50IG1hY19pc3I7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBUaGUgRE1BIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgYWxzbyByZXBvcnRzIE1BQyBhbmQgTVRMCisJICogaW50ZXJydXB0cy4gU28gZm9yIHBvbGxpbmcgbW9kZSwgd2UganVzdCBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIHRoaXMgcmVnaXN0ZXIgdG8gYmUgbm9uLXplcm8KKwkgKi8KKwlkbWFfaXNyID0gWEdNQUNfSU9SRUFEKHBkYXRhLCBETUFfSVNSKTsKKwlpZiAoIWRtYV9pc3IpCisJCWdvdG8gaXNyX2RvbmU7CisKKwlEQkdQUigiLS0+eGdiZV9pc3JcbiIpOworCisJREJHUFIoIiAgRE1BX0lTUiA9ICUwOHhcbiIsIGRtYV9pc3IpOworCURCR1BSKCIgIERNQV9EUzAgPSAlMDh4XG4iLCBYR01BQ19JT1JFQUQocGRhdGEsIERNQV9EU1IwKSk7CisJREJHUFIoIiAgRE1BX0RTMSA9ICUwOHhcbiIsIFhHTUFDX0lPUkVBRChwZGF0YSwgRE1BX0RTUjEpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCWlmICghKGRtYV9pc3IgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKworCQljaGFubmVsID0gcGRhdGEtPmNoYW5uZWwgKyBpOworCisJCWRtYV9jaF9pc3IgPSBYR01BQ19ETUFfSU9SRUFEKGNoYW5uZWwsIERNQV9DSF9TUik7CisJCURCR1BSKCIgIERNQV9DSCV1X0lTUiA9ICUwOHhcbiIsIGksIGRtYV9jaF9pc3IpOworCisJCWlmIChYR01BQ19HRVRfQklUUyhkbWFfY2hfaXNyLCBETUFfQ0hfU1IsIFRJKSB8fAorCQkgICAgWEdNQUNfR0VUX0JJVFMoZG1hX2NoX2lzciwgRE1BX0NIX1NSLCBSSSkpIHsKKwkJCWlmIChuYXBpX3NjaGVkdWxlX3ByZXAoJnBkYXRhLT5uYXBpKSkgeworCQkJCS8qIERpc2FibGUgVHggYW5kIFJ4IGludGVycnVwdHMgKi8KKwkJCQl4Z2JlX2Rpc2FibGVfcnhfdHhfaW50cyhwZGF0YSk7CisKKwkJCQkvKiBUdXJuIG9uIHBvbGxpbmcgKi8KKwkJCQlfX25hcGlfc2NoZWR1bGUoJnBkYXRhLT5uYXBpKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlc3RhcnQgdGhlIGRldmljZSBvbiBhIEZhdGFsIEJ1cyBFcnJvciAqLworCQlpZiAoWEdNQUNfR0VUX0JJVFMoZG1hX2NoX2lzciwgRE1BX0NIX1NSLCBGQkUpKQorCQkJc2NoZWR1bGVfd29yaygmcGRhdGEtPnJlc3RhcnRfd29yayk7CisKKwkJLyogQ2xlYXIgYWxsIGludGVycnVwdCBzaWduYWxzICovCisJCVhHTUFDX0RNQV9JT1dSSVRFKGNoYW5uZWwsIERNQV9DSF9TUiwgZG1hX2NoX2lzcik7CisJfQorCisJaWYgKFhHTUFDX0dFVF9CSVRTKGRtYV9pc3IsIERNQV9JU1IsIE1BQ0lTKSkgeworCQltYWNfaXNyID0gWEdNQUNfSU9SRUFEKHBkYXRhLCBNQUNfSVNSKTsKKworCQlpZiAoWEdNQUNfR0VUX0JJVFMobWFjX2lzciwgTUFDX0lTUiwgTU1DVFhJUykpCisJCQlod19pZi0+dHhfbW1jX2ludChwZGF0YSk7CisKKwkJaWYgKFhHTUFDX0dFVF9CSVRTKG1hY19pc3IsIE1BQ19JU1IsIE1NQ1JYSVMpKQorCQkJaHdfaWYtPnJ4X21tY19pbnQocGRhdGEpOworCX0KKworCURCR1BSKCIgIERNQV9JU1IgPSAlMDh4XG4iLCBYR01BQ19JT1JFQUQocGRhdGEsIERNQV9JU1IpKTsKKworCURCR1BSKCI8LS14Z2JlX2lzclxuIik7CisKK2lzcl9kb25lOgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHhnYmVfdHhfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2YodGltZXIsCisJCQkJCQkgICAgc3RydWN0IHhnYmVfY2hhbm5lbCwKKwkJCQkJCSAgICB0eF90aW1lcik7CisJc3RydWN0IHhnYmVfcmluZyAqcmluZyA9IGNoYW5uZWwtPnR4X3Jpbmc7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY2hhbm5lbC0+cGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURCR1BSKCItLT54Z2JlX3R4X3RpbWVyXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyaW5nLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobmFwaV9zY2hlZHVsZV9wcmVwKCZwZGF0YS0+bmFwaSkpIHsKKwkJLyogRGlzYWJsZSBUeCBhbmQgUnggaW50ZXJydXB0cyAqLworCQl4Z2JlX2Rpc2FibGVfcnhfdHhfaW50cyhwZGF0YSk7CisKKwkJLyogVHVybiBvbiBwb2xsaW5nICovCisJCV9fbmFwaV9zY2hlZHVsZSgmcGRhdGEtPm5hcGkpOworCX0KKworCWNoYW5uZWwtPnR4X3RpbWVyX2FjdGl2ZSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW5nLT5sb2NrLCBmbGFncyk7CisKKwlEQkdQUigiPC0teGdiZV90eF90aW1lclxuIik7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfaW5pdF90eF90aW1lcnMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdQUigiLS0+eGdiZV9pbml0X3R4X3RpbWVyc1xuIik7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlpZiAoIWNoYW5uZWwtPnR4X3JpbmcpCisJCQlicmVhazsKKworCQlEQkdQUigiICAlcyBhZGRpbmcgdHggdGltZXJcbiIsIGNoYW5uZWwtPm5hbWUpOworCQlocnRpbWVyX2luaXQoJmNoYW5uZWwtPnR4X3RpbWVyLCBDTE9DS19NT05PVE9OSUMsCisJCQkgICAgIEhSVElNRVJfTU9ERV9SRUwpOworCQljaGFubmVsLT50eF90aW1lci5mdW5jdGlvbiA9IHhnYmVfdHhfdGltZXI7CisJfQorCisJREJHUFIoIjwtLXhnYmVfaW5pdF90eF90aW1lcnNcbiIpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3N0b3BfdHhfdGltZXJzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpOworCisJREJHUFIoIi0tPnhnYmVfc3RvcF90eF90aW1lcnNcbiIpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJaWYgKCFjaGFubmVsLT50eF9yaW5nKQorCQkJYnJlYWs7CisKKwkJREJHUFIoIiAgJXMgZGVsZXRpbmcgdHggdGltZXJcbiIsIGNoYW5uZWwtPm5hbWUpOworCQljaGFubmVsLT50eF90aW1lcl9hY3RpdmUgPSAwOworCQlocnRpbWVyX2NhbmNlbCgmY2hhbm5lbC0+dHhfdGltZXIpOworCX0KKworCURCR1BSKCI8LS14Z2JlX3N0b3BfdHhfdGltZXJzXG4iKTsKK30KKwordm9pZCB4Z2JlX2dldF9hbGxfaHdfZmVhdHVyZXMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXVuc2lnbmVkIGludCBtYWNfaGZyMCwgbWFjX2hmcjEsIG1hY19oZnIyOworCXN0cnVjdCB4Z2JlX2h3X2ZlYXR1cmVzICpod19mZWF0ID0gJnBkYXRhLT5od19mZWF0OworCisJREJHUFIoIi0tPnhnYmVfZ2V0X2FsbF9od19mZWF0dXJlc1xuIik7CisKKwltYWNfaGZyMCA9IFhHTUFDX0lPUkVBRChwZGF0YSwgTUFDX0hXRjBSKTsKKwltYWNfaGZyMSA9IFhHTUFDX0lPUkVBRChwZGF0YSwgTUFDX0hXRjFSKTsKKwltYWNfaGZyMiA9IFhHTUFDX0lPUkVBRChwZGF0YSwgTUFDX0hXRjJSKTsKKworCW1lbXNldChod19mZWF0LCAwLCBzaXplb2YoKmh3X2ZlYXQpKTsKKworCS8qIEhhcmR3YXJlIGZlYXR1cmUgcmVnaXN0ZXIgMCAqLworCWh3X2ZlYXQtPmdtaWkgICAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwgR01JSVNFTCk7CisJaHdfZmVhdC0+dmxoYXNoICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMCwgTUFDX0hXRjBSLCBWTEhBU0gpOworCWh3X2ZlYXQtPnNtYSAgICAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwgU01BU0VMKTsKKwlod19mZWF0LT5yd2sgICAgICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIwLCBNQUNfSFdGMFIsIFJXS1NFTCk7CisJaHdfZmVhdC0+bWdrICAgICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMCwgTUFDX0hXRjBSLCBNR0tTRUwpOworCWh3X2ZlYXQtPm1tYyAgICAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwgTU1DU0VMKTsKKwlod19mZWF0LT5hb2UgICAgICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIwLCBNQUNfSFdGMFIsIEFSUE9GRlNFTCk7CisJaHdfZmVhdC0+dHMgICAgICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMCwgTUFDX0hXRjBSLCBUU1NFTCk7CisJaHdfZmVhdC0+ZWVlICAgICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMCwgTUFDX0hXRjBSLCBFRUVTRUwpOworCWh3X2ZlYXQtPnR4X2NvZSAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwgVFhDT0VTRUwpOworCWh3X2ZlYXQtPnJ4X2NvZSAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwgUlhDT0VTRUwpOworCWh3X2ZlYXQtPmFkZG5fbWFjICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjAsIE1BQ19IV0YwUiwKKwkJCQkJICAgICAgQURETUFDQURSU0VMKTsKKwlod19mZWF0LT50c19zcmMgICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIwLCBNQUNfSFdGMFIsIFRTU1RTU0VMKTsKKwlod19mZWF0LT5zYV92bGFuX2lucyA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIwLCBNQUNfSFdGMFIsIFNBVkxBTklOUyk7CisKKwkvKiBIYXJkd2FyZSBmZWF0dXJlIHJlZ2lzdGVyIDEgKi8KKwlod19mZWF0LT5yeF9maWZvX3NpemUgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjEsIE1BQ19IV0YxUiwKKwkJCQkJCVJYRklGT1NJWkUpOworCWh3X2ZlYXQtPnR4X2ZpZm9fc2l6ZSAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMSwgTUFDX0hXRjFSLAorCQkJCQkJVFhGSUZPU0laRSk7CisJaHdfZmVhdC0+ZGNiICAgICAgICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIxLCBNQUNfSFdGMVIsIERDQkVOKTsKKwlod19mZWF0LT5zcGggICAgICAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjEsIE1BQ19IV0YxUiwgU1BIRU4pOworCWh3X2ZlYXQtPnRzbyAgICAgICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMSwgTUFDX0hXRjFSLCBUU09FTik7CisJaHdfZmVhdC0+ZG1hX2RlYnVnICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIxLCBNQUNfSFdGMVIsIERCR01FTUEpOworCWh3X2ZlYXQtPmhhc2hfdGFibGVfc2l6ZSA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIxLCBNQUNfSFdGMVIsCisJCQkJCQkgIEhBU0hUQkxTWik7CisJaHdfZmVhdC0+bDNsNF9maWx0ZXJfbnVtID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjEsIE1BQ19IV0YxUiwKKwkJCQkJCSAgTDNMNEZOVU0pOworCisJLyogSGFyZHdhcmUgZmVhdHVyZSByZWdpc3RlciAyICovCisJaHdfZmVhdC0+cnhfcV9jbnQgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjIsIE1BQ19IV0YyUiwgUlhRQ05UKTsKKwlod19mZWF0LT50eF9xX2NudCAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMiwgTUFDX0hXRjJSLCBUWFFDTlQpOworCWh3X2ZlYXQtPnJ4X2NoX2NudCAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIyLCBNQUNfSFdGMlIsIFJYQ0hDTlQpOworCWh3X2ZlYXQtPnR4X2NoX2NudCAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIyLCBNQUNfSFdGMlIsIFRYQ0hDTlQpOworCWh3X2ZlYXQtPnBwc19vdXRfbnVtICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIyLCBNQUNfSFdGMlIsIFBQU09VVE5VTSk7CisJaHdfZmVhdC0+YXV4X3NuYXBfbnVtID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjIsIE1BQ19IV0YyUiwgQVVYU05BUE5VTSk7CisKKwkvKiBUaGUgUXVldWUgYW5kIENoYW5uZWwgY291bnRzIGFyZSB6ZXJvIGJhc2VkIHNvIGluY3JlbWVudCB0aGVtCisJICogdG8gZ2V0IHRoZSBhY3R1YWwgbnVtYmVyCisJICovCisJaHdfZmVhdC0+cnhfcV9jbnQrKzsKKwlod19mZWF0LT50eF9xX2NudCsrOworCWh3X2ZlYXQtPnJ4X2NoX2NudCsrOworCWh3X2ZlYXQtPnR4X2NoX2NudCsrOworCisJREJHUFIoIjwtLXhnYmVfZ2V0X2FsbF9od19mZWF0dXJlc1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfbmFwaV9lbmFibGUoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBpbnQgYWRkKQoreworCWlmIChhZGQpCisJCW5ldGlmX25hcGlfYWRkKHBkYXRhLT5uZXRkZXYsICZwZGF0YS0+bmFwaSwgeGdiZV9wb2xsLAorCQkJICAgICAgIE5BUElfUE9MTF9XRUlHSFQpOworCW5hcGlfZW5hYmxlKCZwZGF0YS0+bmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfbmFwaV9kaXNhYmxlKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwluYXBpX2Rpc2FibGUoJnBkYXRhLT5uYXBpKTsKK30KKwordm9pZCB4Z2JlX2luaXRfdHhfY29hbGVzY2Uoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisKKwlEQkdQUigiLS0+eGdiZV9pbml0X3R4X2NvYWxlc2NlXG4iKTsKKworCXBkYXRhLT50eF91c2VjcyA9IFhHTUFDX0lOSVRfRE1BX1RYX1VTRUNTOworCXBkYXRhLT50eF9mcmFtZXMgPSBYR01BQ19JTklUX0RNQV9UWF9GUkFNRVM7CisKKwlod19pZi0+Y29uZmlnX3R4X2NvYWxlc2NlKHBkYXRhKTsKKworCURCR1BSKCI8LS14Z2JlX2luaXRfdHhfY29hbGVzY2VcbiIpOworfQorCit2b2lkIHhnYmVfaW5pdF9yeF9jb2FsZXNjZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKworCURCR1BSKCItLT54Z2JlX2luaXRfcnhfY29hbGVzY2VcbiIpOworCisJcGRhdGEtPnJ4X3Jpd3QgPSBod19pZi0+dXNlY190b19yaXd0KHBkYXRhLCBYR01BQ19JTklUX0RNQV9SWF9VU0VDUyk7CisJcGRhdGEtPnJ4X2ZyYW1lcyA9IFhHTUFDX0lOSVRfRE1BX1JYX0ZSQU1FUzsKKworCWh3X2lmLT5jb25maWdfcnhfY29hbGVzY2UocGRhdGEpOworCisJREJHUFIoIjwtLXhnYmVfaW5pdF9yeF9jb2FsZXNjZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZnJlZV90eF9za2J1ZmYoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2Rlc2NfaWYgKmRlc2NfaWYgPSAmcGRhdGEtPmRlc2NfaWY7CisJc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nOworCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlEQkdQUigiLS0+eGdiZV9mcmVlX3R4X3NrYnVmZlxuIik7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlyaW5nID0gY2hhbm5lbC0+dHhfcmluZzsKKwkJaWYgKCFyaW5nKQorCQkJYnJlYWs7CisKKwkJZm9yIChqID0gMDsgaiA8IHJpbmctPnJkZXNjX2NvdW50OyBqKyspIHsKKwkJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCBqKTsKKwkJCWRlc2NfaWYtPnVubWFwX3NrYihwZGF0YSwgcmRhdGEpOworCQl9CisJfQorCisJREJHUFIoIjwtLXhnYmVfZnJlZV90eF9za2J1ZmZcbiIpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX2ZyZWVfcnhfc2tidWZmKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9kZXNjX2lmICpkZXNjX2lmID0gJnBkYXRhLT5kZXNjX2lmOworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IHhnYmVfcmluZyAqcmluZzsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhOworCXVuc2lnbmVkIGludCBpLCBqOworCisJREJHUFIoIi0tPnhnYmVfZnJlZV9yeF9za2J1ZmZcbiIpOworCisJY2hhbm5lbCA9IHBkYXRhLT5jaGFubmVsOworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Y2hhbm5lbF9jb3VudDsgaSsrLCBjaGFubmVsKyspIHsKKwkJcmluZyA9IGNoYW5uZWwtPnJ4X3Jpbmc7CisJCWlmICghcmluZykKKwkJCWJyZWFrOworCisJCWZvciAoaiA9IDA7IGogPCByaW5nLT5yZGVzY19jb3VudDsgaisrKSB7CisJCQlyZGF0YSA9IEdFVF9ERVNDX0RBVEEocmluZywgaik7CisJCQlkZXNjX2lmLT51bm1hcF9za2IocGRhdGEsIHJkYXRhKTsKKwkJfQorCX0KKworCURCR1BSKCI8LS14Z2JlX2ZyZWVfcnhfc2tidWZmXG4iKTsKK30KKworaW50IHhnYmVfcG93ZXJkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVuc2lnbmVkIGludCBjYWxsZXIpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdQUigiLS0+eGdiZV9wb3dlcmRvd25cbiIpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikgfHwKKwkgICAgKGNhbGxlciA9PSBYR01BQ19JT0NUTF9DT05URVhUICYmIHBkYXRhLT5wb3dlcl9kb3duKSkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiRGV2aWNlIGlzIGFscmVhZHkgcG93ZXJlZCBkb3duXG4iKTsKKwkJREJHUFIoIjwtLXhnYmVfcG93ZXJkb3duXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGh5X3N0b3AocGRhdGEtPnBoeWRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKworCWlmIChjYWxsZXIgPT0gWEdNQUNfRFJJVkVSX0NPTlRFWFQpCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCXhnYmVfbmFwaV9kaXNhYmxlKHBkYXRhKTsKKworCS8qIFBvd2VyZG93biBUeC9SeCAqLworCWh3X2lmLT5wb3dlcmRvd25fdHgocGRhdGEpOworCWh3X2lmLT5wb3dlcmRvd25fcngocGRhdGEpOworCisJcGRhdGEtPnBvd2VyX2Rvd24gPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKworCURCR1BSKCI8LS14Z2JlX3Bvd2VyZG93blxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhnYmVfcG93ZXJ1cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1bnNpZ25lZCBpbnQgY2FsbGVyKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREJHUFIoIi0tPnhnYmVfcG93ZXJ1cFxuIik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fAorCSAgICAoY2FsbGVyID09IFhHTUFDX0lPQ1RMX0NPTlRFWFQgJiYgIXBkYXRhLT5wb3dlcl9kb3duKSkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiRGV2aWNlIGlzIGFscmVhZHkgcG93ZXJlZCB1cFxuIik7CisJCURCR1BSKCI8LS14Z2JlX3Bvd2VydXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKworCXBkYXRhLT5wb3dlcl9kb3duID0gMDsKKworCXBoeV9zdGFydChwZGF0YS0+cGh5ZGV2KTsKKworCS8qIEVuYWJsZSBUeC9SeCAqLworCWh3X2lmLT5wb3dlcnVwX3R4KHBkYXRhKTsKKwlod19pZi0+cG93ZXJ1cF9yeChwZGF0YSk7CisKKwlpZiAoY2FsbGVyID09IFhHTUFDX0RSSVZFUl9DT05URVhUKQorCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKKwl4Z2JlX25hcGlfZW5hYmxlKHBkYXRhLCAwKTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKG5ldGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+bG9jaywgZmxhZ3MpOworCisJREJHUFIoIjwtLXhnYmVfcG93ZXJ1cFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX3N0YXJ0KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwZGF0YS0+bmV0ZGV2OworCisJREJHUFIoIi0tPnhnYmVfc3RhcnRcbiIpOworCisJeGdiZV9zZXRfcnhfbW9kZShuZXRkZXYpOworCisJaHdfaWYtPmluaXQocGRhdGEpOworCisJcGh5X3N0YXJ0KHBkYXRhLT5waHlkZXYpOworCisJaHdfaWYtPmVuYWJsZV90eChwZGF0YSk7CisJaHdfaWYtPmVuYWJsZV9yeChwZGF0YSk7CisKKwl4Z2JlX2luaXRfdHhfdGltZXJzKHBkYXRhKTsKKworCXhnYmVfbmFwaV9lbmFibGUocGRhdGEsIDEpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMobmV0ZGV2KTsKKworCURCR1BSKCI8LS14Z2JlX3N0YXJ0XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3N0b3Aoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBkYXRhLT5uZXRkZXY7CisKKwlEQkdQUigiLS0+eGdiZV9zdG9wXG4iKTsKKworCXBoeV9zdG9wKHBkYXRhLT5waHlkZXYpOworCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJeGdiZV9uYXBpX2Rpc2FibGUocGRhdGEpOworCisJeGdiZV9zdG9wX3R4X3RpbWVycyhwZGF0YSk7CisKKwlod19pZi0+ZGlzYWJsZV90eChwZGF0YSk7CisJaHdfaWYtPmRpc2FibGVfcngocGRhdGEpOworCisJREJHUFIoIjwtLXhnYmVfc3RvcFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfcmVzdGFydF9kZXYoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBpbnQgcmVzZXQpCit7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKworCURCR1BSKCItLT54Z2JlX3Jlc3RhcnRfZGV2XG4iKTsKKworCS8qIElmIG5vdCBydW5uaW5nLCAicmVzdGFydCIgd2lsbCBoYXBwZW4gb24gb3BlbiAqLworCWlmICghbmV0aWZfcnVubmluZyhwZGF0YS0+bmV0ZGV2KSkKKwkJcmV0dXJuOworCisJeGdiZV9zdG9wKHBkYXRhKTsKKwlzeW5jaHJvbml6ZV9pcnEocGRhdGEtPmlycV9udW1iZXIpOworCisJeGdiZV9mcmVlX3R4X3NrYnVmZihwZGF0YSk7CisJeGdiZV9mcmVlX3J4X3NrYnVmZihwZGF0YSk7CisKKwkvKiBJc3N1ZSBzb2Z0d2FyZSByZXNldCB0byBkZXZpY2UgaWYgcmVxdWVzdGVkICovCisJaWYgKHJlc2V0KQorCQlod19pZi0+ZXhpdChwZGF0YSk7CisKKwl4Z2JlX3N0YXJ0KHBkYXRhKTsKKworCURCR1BSKCI8LS14Z2JlX3Jlc3RhcnRfZGV2XG4iKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgIHN0cnVjdCB4Z2JlX3Bydl9kYXRhLAorCQkJCQkJICAgcmVzdGFydF93b3JrKTsKKworCXJ0bmxfbG9jaygpOworCisJeGdiZV9yZXN0YXJ0X2RldihwZGF0YSwgMSk7CisKKwlydG5sX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3ByZXBfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeGdiZV9wYWNrZXRfZGF0YSAqcGFja2V0KQoreworCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpCisJCXBhY2tldC0+dmxhbl9jdGFnID0gdmxhbl90eF90YWdfZ2V0KHNrYik7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9wcmVwX3RzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeGdiZV9wYWNrZXRfZGF0YSAqcGFja2V0KQoreworCWludCByZXQ7CisKKwlpZiAoIVhHTUFDX0dFVF9CSVRTKHBhY2tldC0+YXR0cmlidXRlcywgVFhfUEFDS0VUX0FUVFJJQlVURVMsCisJCQkgICAgVFNPX0VOQUJMRSkpCisJCXJldHVybiAwOworCisJcmV0ID0gc2tiX2Nvd19oZWFkKHNrYiwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBhY2tldC0+aGVhZGVyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CisJcGFja2V0LT50Y3BfaGVhZGVyX2xlbiA9IHRjcF9oZHJsZW4oc2tiKTsKKwlwYWNrZXQtPnRjcF9wYXlsb2FkX2xlbiA9IHNrYi0+bGVuIC0gcGFja2V0LT5oZWFkZXJfbGVuOworCXBhY2tldC0+bXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlEQkdQUigiICBwYWNrZXQtPmhlYWRlcl9sZW49JXVcbiIsIHBhY2tldC0+aGVhZGVyX2xlbik7CisJREJHUFIoIiAgcGFja2V0LT50Y3BfaGVhZGVyX2xlbj0ldSwgcGFja2V0LT50Y3BfcGF5bG9hZF9sZW49JXVcbiIsCisJICAgICAgcGFja2V0LT50Y3BfaGVhZGVyX2xlbiwgcGFja2V0LT50Y3BfcGF5bG9hZF9sZW4pOworCURCR1BSKCIgIHBhY2tldC0+bXNzPSV1XG4iLCBwYWNrZXQtPm1zcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX2lzX3RzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQorCQlyZXR1cm4gMDsKKworCWlmICghc2tiX2lzX2dzbyhza2IpKQorCQlyZXR1cm4gMDsKKworCURCR1BSKCIgIFRTTyBwYWNrZXQgdG8gYmUgcHJvY2Vzc2VkXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB4Z2JlX3BhY2tldF9pbmZvKHN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCB4Z2JlX3BhY2tldF9kYXRhICpwYWNrZXQpCit7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwl1bnNpZ25lZCBpbnQgY29udGV4dF9kZXNjOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IGk7CisKKwljb250ZXh0X2Rlc2MgPSAwOworCXBhY2tldC0+cmRlc2NfY291bnQgPSAwOworCisJaWYgKHhnYmVfaXNfdHNvKHNrYikpIHsKKwkJLyogVFNPIHJlcXVpcmVzIGFuIGV4dHJhIGRlc3JpcHRvciBpZiBtc3MgaXMgZGlmZmVyZW50ICovCisJCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICE9IHJpbmctPnR4LmN1cl9tc3MpIHsKKwkJCWNvbnRleHRfZGVzYyA9IDE7CisJCQlwYWNrZXQtPnJkZXNjX2NvdW50Kys7CisJCX0KKworCQkvKiBUU08gcmVxdWlyZXMgYW4gZXh0cmEgZGVzcmlwdG9yIGZvciBUU08gaGVhZGVyICovCisJCXBhY2tldC0+cmRlc2NfY291bnQrKzsKKworCQlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFRYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJICAgICAgIFRTT19FTkFCTEUsIDEpOworCQlYR01BQ19TRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsIFRYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJICAgICAgIENTVU1fRU5BQkxFLCAxKTsKKwl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCVhHTUFDX1NFVF9CSVRTKHBhY2tldC0+YXR0cmlidXRlcywgVFhfUEFDS0VUX0FUVFJJQlVURVMsCisJCQkgICAgICAgQ1NVTV9FTkFCTEUsIDEpOworCisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQkvKiBWTEFOIHJlcXVpcmVzIGFuIGV4dHJhIGRlc2NyaXB0b3IgaWYgdGFnIGlzIGRpZmZlcmVudCAqLworCQlpZiAodmxhbl90eF90YWdfZ2V0KHNrYikgIT0gcmluZy0+dHguY3VyX3ZsYW5fY3RhZykKKwkJCS8qIFdlIGNhbiBzaGFyZSB3aXRoIHRoZSBUU08gY29udGV4dCBkZXNjcmlwdG9yICovCisJCQlpZiAoIWNvbnRleHRfZGVzYykgeworCQkJCWNvbnRleHRfZGVzYyA9IDE7CisJCQkJcGFja2V0LT5yZGVzY19jb3VudCsrOworCQkJfQorCisJCVhHTUFDX1NFVF9CSVRTKHBhY2tldC0+YXR0cmlidXRlcywgVFhfUEFDS0VUX0FUVFJJQlVURVMsCisJCQkgICAgICAgVkxBTl9DVEFHLCAxKTsKKwl9CisKKwlmb3IgKGxlbiA9IHNrYl9oZWFkbGVuKHNrYik7IGxlbjspIHsKKwkJcGFja2V0LT5yZGVzY19jb3VudCsrOworCQlsZW4gLT0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIFRYX01BWF9CVUZfU0laRSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCWZvciAobGVuID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsgbGVuOyApIHsKKwkJCXBhY2tldC0+cmRlc2NfY291bnQrKzsKKwkJCWxlbiAtPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgVFhfTUFYX0JVRl9TSVpFKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB4Z2JlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IHhnYmVfZGVzY19pZiAqZGVzY19pZiA9ICZwZGF0YS0+ZGVzY19pZjsKKwlpbnQgcmV0OworCisJREJHUFIoIi0tPnhnYmVfb3BlblxuIik7CisKKwkvKiBFbmFibGUgdGhlIGNsb2NrICovCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBkYXRhLT5zeXNjbG9jayk7CisJaWYgKHJldCkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiY2xrX3ByZXBhcmVfZW5hYmxlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBSeCBidWZmZXIgc2l6ZSBiZWZvcmUgYWxsb2NhdGluZyByaW5ncyAqLworCXJldCA9IHhnYmVfY2FsY19yeF9idWZfc2l6ZShuZXRkZXYsIG5ldGRldi0+bXR1KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY2xrOworCXBkYXRhLT5yeF9idWZfc2l6ZSA9IHJldDsKKworCS8qIEFsbG9jYXRlIHRoZSByaW5nIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzICovCisJcmV0ID0gZGVzY19pZi0+YWxsb2NfcmluZ19yZXNvdXJjZXMocGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsazsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSByZXN0YXJ0IHdvcmsgc3RydWN0ICovCisJSU5JVF9XT1JLKCZwZGF0YS0+cmVzdGFydF93b3JrLCB4Z2JlX3Jlc3RhcnQpOworCisJLyogUmVxdWVzdCBpbnRlcnJ1cHRzICovCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShwZGF0YS0+ZGV2LCBuZXRkZXYtPmlycSwgeGdiZV9pc3IsIDAsCisJCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBwZGF0YSk7CisJaWYgKHJldCkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBpcnEgJWRcbiIsCisJCQkgICAgIHBkYXRhLT5pcnFfbnVtYmVyKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlwZGF0YS0+aXJxX251bWJlciA9IG5ldGRldi0+aXJxOworCisJcmV0ID0geGdiZV9zdGFydChwZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfc3RhcnQ7CisKKwlEQkdQUigiPC0teGdiZV9vcGVuXG4iKTsKKworCXJldHVybiAwOworCitlcnJfc3RhcnQ6CisJaHdfaWYtPmV4aXQocGRhdGEpOworCisJZGV2bV9mcmVlX2lycShwZGF0YS0+ZGV2LCBwZGF0YS0+aXJxX251bWJlciwgcGRhdGEpOworCXBkYXRhLT5pcnFfbnVtYmVyID0gMDsKKworZXJyX2lycToKKwlkZXNjX2lmLT5mcmVlX3JpbmdfcmVzb3VyY2VzKHBkYXRhKTsKKworZXJyX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGRhdGEtPnN5c2Nsb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3QgeGdiZV9kZXNjX2lmICpkZXNjX2lmID0gJnBkYXRhLT5kZXNjX2lmOworCisJREJHUFIoIi0tPnhnYmVfY2xvc2VcbiIpOworCisJLyogU3RvcCB0aGUgZGV2aWNlICovCisJeGdiZV9zdG9wKHBkYXRhKTsKKworCS8qIElzc3VlIHNvZnR3YXJlIHJlc2V0IHRvIGRldmljZSAqLworCWh3X2lmLT5leGl0KHBkYXRhKTsKKworCS8qIEZyZWUgYWxsIHRoZSByaW5nIGRhdGEgKi8KKwlkZXNjX2lmLT5mcmVlX3JpbmdfcmVzb3VyY2VzKHBkYXRhKTsKKworCS8qIFJlbGVhc2UgdGhlIGludGVycnVwdCAqLworCWlmIChwZGF0YS0+aXJxX251bWJlciAhPSAwKSB7CisJCWRldm1fZnJlZV9pcnEocGRhdGEtPmRldiwgcGRhdGEtPmlycV9udW1iZXIsIHBkYXRhKTsKKwkJcGRhdGEtPmlycV9udW1iZXIgPSAwOworCX0KKworCS8qIERpc2FibGUgdGhlIGNsb2NrICovCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBkYXRhLT5zeXNjbG9jayk7CisKKwlEQkdQUigiPC0teGdiZV9jbG9zZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IHhnYmVfZGVzY19pZiAqZGVzY19pZiA9ICZwZGF0YS0+ZGVzY19pZjsKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmc7CisJc3RydWN0IHhnYmVfcGFja2V0X2RhdGEgKnBhY2tldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlEQkdQUigiLS0+eGdiZV94bWl0OiBza2ItPmxlbiA9ICVkXG4iLCBza2ItPmxlbik7CisKKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWwgKyBza2ItPnF1ZXVlX21hcHBpbmc7CisJcmluZyA9IGNoYW5uZWwtPnR4X3Jpbmc7CisJcGFja2V0ID0gJnJpbmctPnBhY2tldF9kYXRhOworCisJcmV0ID0gTkVUREVWX1RYX09LOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKworCWlmIChza2ItPmxlbiA9PSAwKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LCAiZW1wdHkgc2tiIHJlY2VpdmVkIGZyb20gc3RhY2tcbiIpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlnb3RvIHR4X25ldGRldl9yZXR1cm47CisJfQorCisJLyogQ2FsY3VsYXRlIHByZWxpbWluYXJ5IHBhY2tldCBpbmZvICovCisJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwl4Z2JlX3BhY2tldF9pbmZvKHJpbmcsIHNrYiwgcGFja2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIGVub3VnaCBkZXNjcmlwdG9ycyBhdmFpbGFibGUgKi8KKwlpZiAocGFja2V0LT5yZGVzY19jb3VudCA+IHhnYmVfdHhfYXZhaWxfZGVzYyhyaW5nKSkgeworCQlEQkdQUigiICBUeCBxdWV1ZSBzdG9wcGVkLCBub3QgZW5vdWdoIGRlc2NyaXB0b3JzIGF2YWlsYWJsZVxuIik7CisJCW5ldGlmX3N0b3Bfc3VicXVldWUobmV0ZGV2LCBjaGFubmVsLT5xdWV1ZV9pbmRleCk7CisJCXJpbmctPnR4LnF1ZXVlX3N0b3BwZWQgPSAxOworCQlyZXQgPSBORVRERVZfVFhfQlVTWTsKKwkJZ290byB0eF9uZXRkZXZfcmV0dXJuOworCX0KKworCXJldCA9IHhnYmVfcHJlcF90c28oc2tiLCBwYWNrZXQpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihuZXRkZXYsICJlcnJvciBwcm9jZXNzaW5nIFRTTyBwYWNrZXRcbiIpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlnb3RvIHR4X25ldGRldl9yZXR1cm47CisJfQorCXhnYmVfcHJlcF92bGFuKHNrYiwgcGFja2V0KTsKKworCWlmICghZGVzY19pZi0+bWFwX3R4X3NrYihjaGFubmVsLCBza2IpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWdvdG8gdHhfbmV0ZGV2X3JldHVybjsKKwl9CisKKwkvKiBDb25maWd1cmUgcmVxdWlyZWQgZGVzY3JpcHRvciBmaWVsZHMgZm9yIHRyYW5zbWlzc2lvbiAqLworCWh3X2lmLT5wcmVfeG1pdChjaGFubmVsKTsKKworI2lmZGVmIFhHTUFDX0VOQUJMRV9UWF9QS1RfRFVNUAorCXhnYmVfcHJpbnRfcGt0KG5ldGRldiwgc2tiLCB0cnVlKTsKKyNlbmRpZgorCit0eF9uZXRkZXZfcmV0dXJuOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKworCURCR1BSKCI8LS14Z2JlX3htaXRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGdiZV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwl1bnNpZ25lZCBpbnQgcHJfbW9kZSwgYW1fbW9kZTsKKworCURCR1BSKCItLT54Z2JlX3NldF9yeF9tb2RlXG4iKTsKKworCXByX21vZGUgPSAoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gMCk7CisJYW1fbW9kZSA9ICgobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIT0gMCk7CisKKwlpZiAobmV0ZGV2X3VjX2NvdW50KG5ldGRldikgPiBwZGF0YS0+aHdfZmVhdC5hZGRuX21hYykKKwkJcHJfbW9kZSA9IDE7CisJaWYgKG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gcGRhdGEtPmh3X2ZlYXQuYWRkbl9tYWMpCisJCWFtX21vZGUgPSAxOworCWlmICgobmV0ZGV2X3VjX2NvdW50KG5ldGRldikgKyBuZXRkZXZfbWNfY291bnQobmV0ZGV2KSkgPgorCSAgICAgcGRhdGEtPmh3X2ZlYXQuYWRkbl9tYWMpCisJCXByX21vZGUgPSAxOworCisJaHdfaWYtPnNldF9wcm9taXNjdW91c19tb2RlKHBkYXRhLCBwcl9tb2RlKTsKKwlod19pZi0+c2V0X2FsbF9tdWx0aWNhc3RfbW9kZShwZGF0YSwgYW1fbW9kZSk7CisJaWYgKCFwcl9tb2RlKQorCQlod19pZi0+c2V0X2FkZG5fbWFjX2FkZHJzKHBkYXRhLCBhbV9tb2RlKTsKKworCURCR1BSKCI8LS14Z2JlX3NldF9yeF9tb2RlXG4iKTsKK30KKworc3RhdGljIGludCB4Z2JlX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gYWRkcjsKKworCURCR1BSKCItLT54Z2JlX3NldF9tYWNfYWRkcmVzc1xuIik7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2FkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaHdfaWYtPnNldF9tYWNfYWRkcmVzcyhwZGF0YSwgbmV0ZGV2LT5kZXZfYWRkcik7CisKKwlEQkdQUigiPC0teGdiZV9zZXRfbWFjX2FkZHJlc3NcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBtdHUpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0OworCisJREJHUFIoIi0tPnhnYmVfY2hhbmdlX210dVxuIik7CisKKwlyZXQgPSB4Z2JlX2NhbGNfcnhfYnVmX3NpemUobmV0ZGV2LCBtdHUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcGRhdGEtPnJ4X2J1Zl9zaXplID0gcmV0OworCW5ldGRldi0+bXR1ID0gbXR1OworCisJeGdiZV9yZXN0YXJ0X2RldihwZGF0YSwgMCk7CisKKwlEQkdQUigiPC0teGdiZV9jaGFuZ2VfbXR1XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp4Z2JlX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCQkgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqcykKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB4Z2JlX21tY19zdGF0cyAqcHN0YXRzID0gJnBkYXRhLT5tbWNfc3RhdHM7CisKKwlEQkdQUigiLS0+JXNcbiIsIF9fZnVuY19fKTsKKworCXBkYXRhLT5od19pZi5yZWFkX21tY19zdGF0cyhwZGF0YSk7CisKKwlzLT5yeF9wYWNrZXRzID0gcHN0YXRzLT5yeGZyYW1lY291bnRfZ2I7CisJcy0+cnhfYnl0ZXMgPSBwc3RhdHMtPnJ4b2N0ZXRjb3VudF9nYjsKKwlzLT5yeF9lcnJvcnMgPSBwc3RhdHMtPnJ4ZnJhbWVjb3VudF9nYiAtCisJCSAgICAgICBwc3RhdHMtPnJ4YnJvYWRjYXN0ZnJhbWVzX2cgLQorCQkgICAgICAgcHN0YXRzLT5yeG11bHRpY2FzdGZyYW1lc19nIC0KKwkJICAgICAgIHBzdGF0cy0+cnh1bmljYXN0ZnJhbWVzX2c7CisJcy0+bXVsdGljYXN0ID0gcHN0YXRzLT5yeG11bHRpY2FzdGZyYW1lc19nOworCXMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBwc3RhdHMtPnJ4bGVuZ3RoZXJyb3I7CisJcy0+cnhfY3JjX2Vycm9ycyA9IHBzdGF0cy0+cnhjcmNlcnJvcjsKKwlzLT5yeF9maWZvX2Vycm9ycyA9IHBzdGF0cy0+cnhmaWZvb3ZlcmZsb3c7CisKKwlzLT50eF9wYWNrZXRzID0gcHN0YXRzLT50eGZyYW1lY291bnRfZ2I7CisJcy0+dHhfYnl0ZXMgPSBwc3RhdHMtPnR4b2N0ZXRjb3VudF9nYjsKKwlzLT50eF9lcnJvcnMgPSBwc3RhdHMtPnR4ZnJhbWVjb3VudF9nYiAtIHBzdGF0cy0+dHhmcmFtZWNvdW50X2c7CisJcy0+dHhfZHJvcHBlZCA9IG5ldGRldi0+c3RhdHMudHhfZHJvcHBlZDsKKworCURCR1BSKCI8LS0lc1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHM7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgeGdiZV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJREJHUFIoIi0tPnhnYmVfcG9sbF9jb250cm9sbGVyXG4iKTsKKworCWRpc2FibGVfaXJxKHBkYXRhLT5pcnFfbnVtYmVyKTsKKworCXhnYmVfaXNyKHBkYXRhLT5pcnFfbnVtYmVyLCBwZGF0YSk7CisKKwllbmFibGVfaXJxKHBkYXRhLT5pcnFfbnVtYmVyKTsKKworCURCR1BSKCI8LS14Z2JlX3BvbGxfY29udHJvbGxlclxuIik7Cit9CisjZW5kaWYgLyogRW5kIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXVuc2lnbmVkIGludCByeGNzdW1fZW5hYmxlZCwgcnh2bGFuX2VuYWJsZWQ7CisKKwlyeGNzdW1fZW5hYmxlZCA9ICEhKHBkYXRhLT5uZXRkZXZfZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSk7CisJcnh2bGFuX2VuYWJsZWQgPSAhIShwZGF0YS0+bmV0ZGV2X2ZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpOworCisJaWYgKChmZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSAmJiAhcnhjc3VtX2VuYWJsZWQpIHsKKwkJaHdfaWYtPmVuYWJsZV9yeF9jc3VtKHBkYXRhKTsKKwkJbmV0ZGV2X2FsZXJ0KG5ldGRldiwgInN0YXRlIGNoYW5nZSAtIHJ4Y3N1bSBlbmFibGVkXG4iKTsKKwl9IGVsc2UgaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgJiYgcnhjc3VtX2VuYWJsZWQpIHsKKwkJaHdfaWYtPmRpc2FibGVfcnhfY3N1bShwZGF0YSk7CisJCW5ldGRldl9hbGVydChuZXRkZXYsICJzdGF0ZSBjaGFuZ2UgLSByeGNzdW0gZGlzYWJsZWRcbiIpOworCX0KKworCWlmICgoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCkgJiYgIXJ4dmxhbl9lbmFibGVkKSB7CisJCWh3X2lmLT5lbmFibGVfcnhfdmxhbl9zdHJpcHBpbmcocGRhdGEpOworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAic3RhdGUgY2hhbmdlIC0gcnh2bGFuIGVuYWJsZWRcbiIpOworCX0gZWxzZSBpZiAoIShmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSAmJiByeHZsYW5fZW5hYmxlZCkgeworCQlod19pZi0+ZGlzYWJsZV9yeF92bGFuX3N0cmlwcGluZyhwZGF0YSk7CisJCW5ldGRldl9hbGVydChuZXRkZXYsICJzdGF0ZSBjaGFuZ2UgLSByeHZsYW4gZGlzYWJsZWRcbiIpOworCX0KKworCXBkYXRhLT5uZXRkZXZfZmVhdHVyZXMgPSBmZWF0dXJlczsKKworCURCR1BSKCI8LS14Z2JlX3NldF9mZWF0dXJlc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4Z2JlX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHhnYmVfb3BlbiwKKwkubmRvX3N0b3AJCT0geGdiZV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0geGdiZV94bWl0LAorCS5uZG9fc2V0X3J4X21vZGUJPSB4Z2JlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0geGdiZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHhnYmVfY2hhbmdlX210dSwKKwkubmRvX2dldF9zdGF0czY0CT0geGdiZV9nZXRfc3RhdHM2NCwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0geGdiZV9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKKwkubmRvX3NldF9mZWF0dXJlcwk9IHhnYmVfc2V0X2ZlYXR1cmVzLAorfTsKKworc3RydWN0IG5ldF9kZXZpY2Vfb3BzICp4Z2JlX2dldF9uZXRkZXZfb3BzKHZvaWQpCit7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKikmeGdiZV9uZXRkZXZfb3BzOworfQorCitzdGF0aWMgaW50IHhnYmVfdHhfcG9sbChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IGNoYW5uZWwtPnBkYXRhOworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IHhnYmVfZGVzY19pZiAqZGVzY19pZiA9ICZwZGF0YS0+ZGVzY19pZjsKKwlzdHJ1Y3QgeGdiZV9yaW5nICpyaW5nID0gY2hhbm5lbC0+dHhfcmluZzsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhOworCXN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqcmRlc2M7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBkYXRhLT5uZXRkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcHJvY2Vzc2VkID0gMDsKKworCURCR1BSKCItLT54Z2JlX3R4X3BvbGxcbiIpOworCisJLyogTm90aGluZyB0byBkbyBpZiB0aGVyZSBpc24ndCBhIFR4IHJpbmcgZm9yIHRoaXMgY2hhbm5lbCAqLworCWlmICghcmluZykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKChwcm9jZXNzZWQgPCBUWF9ERVNDX01BWF9QUk9DKSAmJiAocmluZy0+ZGlydHkgPCByaW5nLT5jdXIpKSB7CisJCXJkYXRhID0gR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5kaXJ0eSk7CisJCXJkZXNjID0gcmRhdGEtPnJkZXNjOworCisJCWlmICghaHdfaWYtPnR4X2NvbXBsZXRlKHJkZXNjKSkKKwkJCWJyZWFrOworCisjaWZkZWYgWEdNQUNfRU5BQkxFX1RYX0RFU0NfRFVNUAorCQl4Z2JlX2R1bXBfdHhfZGVzYyhyaW5nLCByaW5nLT5kaXJ0eSwgMSwgMCk7CisjZW5kaWYKKworCQkvKiBGcmVlIHRoZSBTS0IgYW5kIHJlc2V0IHRoZSBkZXNjcmlwdG9yIGZvciByZS11c2UgKi8KKwkJZGVzY19pZi0+dW5tYXBfc2tiKHBkYXRhLCByZGF0YSk7CisJCWh3X2lmLT50eF9kZXNjX3Jlc2V0KHJkYXRhKTsKKworCQlwcm9jZXNzZWQrKzsKKwkJcmluZy0+ZGlydHkrKzsKKwl9CisKKwlpZiAoKHJpbmctPnR4LnF1ZXVlX3N0b3BwZWQgPT0gMSkgJiYKKwkgICAgKHhnYmVfdHhfYXZhaWxfZGVzYyhyaW5nKSA+IFRYX0RFU0NfTUlOX0ZSRUUpKSB7CisJCXJpbmctPnR4LnF1ZXVlX3N0b3BwZWQgPSAwOworCQluZXRpZl93YWtlX3N1YnF1ZXVlKG5ldGRldiwgY2hhbm5lbC0+cXVldWVfaW5kZXgpOworCX0KKworCURCR1BSKCI8LS14Z2JlX3R4X3BvbGw6IHByb2Nlc3NlZD0lZFxuIiwgcHJvY2Vzc2VkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBwcm9jZXNzZWQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9yeF9wb2xsKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwsIGludCBidWRnZXQpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY2hhbm5lbC0+cGRhdGE7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwlzdHJ1Y3QgeGdiZV9kZXNjX2lmICpkZXNjX2lmID0gJnBkYXRhLT5kZXNjX2lmOworCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcgPSBjaGFubmVsLT5yeF9yaW5nOworCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CisJc3RydWN0IHhnYmVfcGFja2V0X2RhdGEgKnBhY2tldDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGRhdGEtPm5ldGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBpbmNvbXBsZXRlLCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgY3VyX2xlbiwgcHV0X2xlbiwgbWF4X2xlbjsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCisJREJHUFIoIi0tPnhnYmVfcnhfcG9sbDogYnVkZ2V0PSVkXG4iLCBidWRnZXQpOworCisJLyogTm90aGluZyB0byBkbyBpZiB0aGVyZSBpc24ndCBhIFJ4IHJpbmcgZm9yIHRoaXMgY2hhbm5lbCAqLworCWlmICghcmluZykKKwkJcmV0dXJuIDA7CisKKwlwYWNrZXQgPSAmcmluZy0+cGFja2V0X2RhdGE7CisJd2hpbGUgKHJlY2VpdmVkIDwgYnVkZ2V0KSB7CisJCURCR1BSKCIgIGN1ciA9ICVkXG4iLCByaW5nLT5jdXIpOworCisJCS8qIENsZWFyIHRoZSBwYWNrZXQgZGF0YSBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQocGFja2V0LCAwLCBzaXplb2YoKnBhY2tldCkpOworCQlza2IgPSBOVUxMOworCQllcnJvciA9IDA7CisJCWN1cl9sZW4gPSAwOworCityZWFkX2FnYWluOgorCQlyZGF0YSA9IEdFVF9ERVNDX0RBVEEocmluZywgcmluZy0+Y3VyKTsKKworCQlpZiAoaHdfaWYtPmRldl9yZWFkKGNoYW5uZWwpKQorCQkJYnJlYWs7CisKKwkJcmVjZWl2ZWQrKzsKKwkJcmluZy0+Y3VyKys7CisJCXJpbmctPmRpcnR5Kys7CisKKwkJZG1hX3VubWFwX3NpbmdsZShwZGF0YS0+ZGV2LCByZGF0YS0+c2tiX2RtYSwKKwkJCQkgcmRhdGEtPnNrYl9kbWFfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlyZGF0YS0+c2tiX2RtYSA9IDA7CisKKwkJaW5jb21wbGV0ZSA9IFhHTUFDX0dFVF9CSVRTKHBhY2tldC0+YXR0cmlidXRlcywKKwkJCQkJICAgIFJYX1BBQ0tFVF9BVFRSSUJVVEVTLAorCQkJCQkgICAgSU5DT01QTEVURSk7CisKKwkJLyogRWFybGllciBlcnJvciwganVzdCBkcmFpbiB0aGUgcmVtYWluaW5nIGRhdGEgKi8KKwkJaWYgKGluY29tcGxldGUgJiYgZXJyb3IpCisJCQlnb3RvIHJlYWRfYWdhaW47CisKKwkJaWYgKGVycm9yIHx8IHBhY2tldC0+ZXJyb3JzKSB7CisJCQlpZiAocGFja2V0LT5lcnJvcnMpCisJCQkJREJHUFIoIkVycm9yIGluIHJlY2VpdmVkIHBhY2tldFxuIik7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXB1dF9sZW4gPSByZGF0YS0+bGVuIC0gY3VyX2xlbjsKKwkJaWYgKHNrYikgeworCQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBwdXRfbGVuLCBHRlBfQVRPTUlDKSkgeworCQkJCURCR1BSKCJwc2tiX2V4cGFuZF9oZWFkIGVycm9yXG4iKTsKKwkJCQlpZiAoaW5jb21wbGV0ZSkgeworCQkJCQllcnJvciA9IDE7CisJCQkJCWdvdG8gcmVhZF9hZ2FpbjsKKwkJCQl9CisKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJY29udGludWU7CisJCQl9CisJCQltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCByZGF0YS0+c2tiLT5kYXRhLAorCQkJICAgICAgIHB1dF9sZW4pOworCQl9IGVsc2UgeworCQkJc2tiID0gcmRhdGEtPnNrYjsKKwkJCXJkYXRhLT5za2IgPSBOVUxMOworCQl9CisJCXNrYl9wdXQoc2tiLCBwdXRfbGVuKTsKKwkJY3VyX2xlbiArPSBwdXRfbGVuOworCisJCWlmIChpbmNvbXBsZXRlKQorCQkJZ290byByZWFkX2FnYWluOworCisJCS8qIEJlIHN1cmUgd2UgZG9uJ3QgZXhjZWVkIHRoZSBjb25maWd1cmVkIE1UVSAqLworCQltYXhfbGVuID0gbmV0ZGV2LT5tdHUgKyBFVEhfSExFTjsKKwkJaWYgKCEobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSAmJgorCQkgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSkKKwkJCW1heF9sZW4gKz0gVkxBTl9ITEVOOworCisJCWlmIChza2ItPmxlbiA+IG1heF9sZW4pIHsKKwkJCURCR1BSKCJwYWNrZXQgbGVuZ3RoIGV4Y2VlZHMgY29uZmlndXJlZCBNVFVcbiIpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKworI2lmZGVmIFhHTUFDX0VOQUJMRV9SWF9QS1RfRFVNUAorCQl4Z2JlX3ByaW50X3BrdChuZXRkZXYsIHNrYiwgZmFsc2UpOworI2VuZGlmCisKKwkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CisJCWlmIChYR01BQ19HRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsCisJCQkJICAgUlhfUEFDS0VUX0FUVFJJQlVURVMsIENTVU1fRE9ORSkpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJCWlmIChYR01BQ19HRVRfQklUUyhwYWNrZXQtPmF0dHJpYnV0ZXMsCisJCQkJICAgUlhfUEFDS0VUX0FUVFJJQlVURVMsIFZMQU5fQ1RBRykpCisJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLAorCQkJCQkgICAgICAgcGFja2V0LT52bGFuX2N0YWcpOworCisJCXNrYi0+ZGV2ID0gbmV0ZGV2OworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOworCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgY2hhbm5lbC0+cXVldWVfaW5kZXgpOworCQlza2JfbWFya19uYXBpX2lkKHNrYiwgJnBkYXRhLT5uYXBpKTsKKworCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluYXBpX2dyb19yZWNlaXZlKCZwZGF0YS0+bmFwaSwgc2tiKTsKKwl9CisKKwlpZiAocmVjZWl2ZWQpIHsKKwkJZGVzY19pZi0+cmVhbGxvY19za2IoY2hhbm5lbCk7CisKKwkJLyogVXBkYXRlIHRoZSBSeCBUYWlsIFBvaW50ZXIgUmVnaXN0ZXIgd2l0aCBhZGRyZXNzIG9mCisJCSAqIHRoZSBsYXN0IGNsZWFuZWQgZW50cnkgKi8KKwkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIHJpbmctPnJ4LnJlYWxsb2NfaW5kZXggLSAxKTsKKwkJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1JEVFJfTE8sCisJCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKKwl9CisKKwlEQkdQUigiPC0teGdiZV9yeF9wb2xsOiByZWNlaXZlZCA9ICVkXG4iLCByZWNlaXZlZCk7CisKKwlyZXR1cm4gcmVjZWl2ZWQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHhnYmVfcHJ2X2RhdGEsCisJCQkJCQkgICBuYXBpKTsKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCWludCBwcm9jZXNzZWQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdQUigiLS0+eGdiZV9wb2xsOiBidWRnZXQ9JWRcbiIsIGJ1ZGdldCk7CisKKwkvKiBDbGVhbnVwIFR4IHJpbmcgZmlyc3QgKi8KKwljaGFubmVsID0gcGRhdGEtPmNoYW5uZWw7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5jaGFubmVsX2NvdW50OyBpKyssIGNoYW5uZWwrKykKKwkJeGdiZV90eF9wb2xsKGNoYW5uZWwpOworCisJLyogUHJvY2VzcyBSeCByaW5nIG5leHQgKi8KKwlwcm9jZXNzZWQgPSAwOworCWNoYW5uZWwgPSBwZGF0YS0+Y2hhbm5lbDsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNoYW5uZWxfY291bnQ7IGkrKywgY2hhbm5lbCsrKQorCQlwcm9jZXNzZWQgKz0geGdiZV9yeF9wb2xsKGNoYW5uZWwsIGJ1ZGdldCAtIHByb2Nlc3NlZCk7CisKKwkvKiBJZiB3ZSBwcm9jZXNzZWQgZXZlcnl0aGluZywgd2UgYXJlIGRvbmUgKi8KKwlpZiAocHJvY2Vzc2VkIDwgYnVkZ2V0KSB7CisJCS8qIFR1cm4gb2ZmIHBvbGxpbmcgKi8KKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKworCQkvKiBFbmFibGUgVHggYW5kIFJ4IGludGVycnVwdHMgKi8KKwkJeGdiZV9lbmFibGVfcnhfdHhfaW50cyhwZGF0YSk7CisJfQorCisJREJHUFIoIjwtLXhnYmVfcG9sbDogcmVjZWl2ZWQgPSAlZFxuIiwgcHJvY2Vzc2VkKTsKKworCXJldHVybiBwcm9jZXNzZWQ7Cit9CisKK3ZvaWQgeGdiZV9kdW1wX3R4X2Rlc2Moc3RydWN0IHhnYmVfcmluZyAqcmluZywgdW5zaWduZWQgaW50IGlkeCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWcpCit7CisJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJcmRhdGEgPSBHRVRfREVTQ19EQVRBKHJpbmcsIGlkeCk7CisJCXJkZXNjID0gcmRhdGEtPnJkZXNjOworCQlEQkdQUigiVFhfTk9STUFMX0RFU0NbJWQgJXNdID0gJTA4eDolMDh4OiUwOHg6JTA4eFxuIiwgaWR4LAorCQkgICAgICAoZmxhZyA9PSAxKSA/ICJRVUVVRUQgRk9SIFRYIiA6ICJUWCBCWSBERVZJQ0UiLAorCQkgICAgICBsZTMyX3RvX2NwdShyZGVzYy0+ZGVzYzApLCBsZTMyX3RvX2NwdShyZGVzYy0+ZGVzYzEpLAorCQkgICAgICBsZTMyX3RvX2NwdShyZGVzYy0+ZGVzYzIpLCBsZTMyX3RvX2NwdShyZGVzYy0+ZGVzYzMpKTsKKwkJaWR4Kys7CisJfQorfQorCit2b2lkIHhnYmVfZHVtcF9yeF9kZXNjKHN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcsIHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqZGVzYywKKwkJICAgICAgIHVuc2lnbmVkIGludCBpZHgpCit7CisJREJHUFIoIlJYX05PUk1BTF9ERVNDWyVkIFJYIEJZIERFVklDRV0gPSAlMDh4OiUwOHg6JTA4eDolMDh4XG4iLCBpZHgsCisJICAgICAgbGUzMl90b19jcHUoZGVzYy0+ZGVzYzApLCBsZTMyX3RvX2NwdShkZXNjLT5kZXNjMSksCisJICAgICAgbGUzMl90b19jcHUoZGVzYy0+ZGVzYzIpLCBsZTMyX3RvX2NwdShkZXNjLT5kZXNjMykpOworfQorCit2b2lkIHhnYmVfcHJpbnRfcGt0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgdHhfcngpCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJdW5zaWduZWQgY2hhciAqYnVmID0gc2tiLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzEyOF07CisJdW5zaWduZWQgaW50IGksIGo7CisKKwluZXRkZXZfYWxlcnQobmV0ZGV2LCAiXG4qKioqKioqKioqKioqKiBTS0IgZHVtcCAqKioqKioqKioqKioqKioqXG4iKTsKKworCW5ldGRldl9hbGVydChuZXRkZXYsICIlcyBwYWNrZXQgb2YgJWQgYnl0ZXNcbiIsCisJCSAgICAgKHR4X3J4ID8gIlRYIiA6ICJSWCIpLCBza2ItPmxlbik7CisKKwluZXRkZXZfYWxlcnQobmV0ZGV2LCAiRHN0IE1BQyBhZGRyOiAlcE1cbiIsIGV0aC0+aF9kZXN0KTsKKwluZXRkZXZfYWxlcnQobmV0ZGV2LCAiU3JjIE1BQyBhZGRyOiAlcE1cbiIsIGV0aC0+aF9zb3VyY2UpOworCW5ldGRldl9hbGVydChuZXRkZXYsICJQcm90b2NvbDogMHglMDRoeFxuIiwgbnRvaHMoZXRoLT5oX3Byb3RvKSk7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHNrYi0+bGVuOykgeworCQlqICs9IHNucHJpbnRmKGJ1ZmZlciArIGosIHNpemVvZihidWZmZXIpIC0gaiwgIiUwMmhoeCIsCisJCQkgICAgICBidWZbaSsrXSk7CisKKwkJaWYgKChpICUgMzIpID09IDApIHsKKwkJCW5ldGRldl9hbGVydChuZXRkZXYsICIgIDB4JTA0eDogJXNcbiIsIGkgLSAzMiwgYnVmZmVyKTsKKwkJCWogPSAwOworCQl9IGVsc2UgaWYgKChpICUgMTYpID09IDApIHsKKwkJCWJ1ZmZlcltqKytdID0gJyAnOworCQkJYnVmZmVyW2orK10gPSAnICc7CisJCX0gZWxzZSBpZiAoKGkgJSA0KSA9PSAwKSB7CisJCQlidWZmZXJbaisrXSA9ICcgJzsKKwkJfQorCX0KKwlpZiAoaSAlIDMyKQorCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAiICAweCUwNHg6ICVzXG4iLCBpIC0gKGkgJSAzMiksIGJ1ZmZlcik7CisKKwluZXRkZXZfYWxlcnQobmV0ZGV2LCAiXG4qKioqKioqKioqKioqKiBTS0IgZHVtcCAqKioqKioqKioqKioqKioqXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwOWYyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogQU1EIDEwR2IgRXRoZXJuZXQgZHJpdmVyCisgKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIGZvbGxvd2luZyB0d28KKyAqIGxpY2Vuc2VzOgorICoKKyAqIExpY2Vuc2UgMTogR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IGNvcHksIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogTGljZW5zZSAyOiBNb2RpZmllZCBCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSAieGdiZS5oIgorI2luY2x1ZGUgInhnYmUtY29tbW9uLmgiCisKKworc3RydWN0IHhnYmVfc3RhdHMgeworCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc3RhdF9zaXplOworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgWEdNQUNfTU1DX1NUQVQoX3N0cmluZywgX3ZhcikJCQkJXAorCXsgX3N0cmluZywJCQkJCQlcCisJICBGSUVMRF9TSVpFT0Yoc3RydWN0IHhnYmVfbW1jX3N0YXRzLCBfdmFyKSwJCVwKKwkgIG9mZnNldG9mKHN0cnVjdCB4Z2JlX3Bydl9kYXRhLCBtbWNfc3RhdHMuX3ZhciksCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGdiZV9zdGF0cyB4Z2JlX2dzdHJpbmdfc3RhdHNbXSA9IHsKKwlYR01BQ19NTUNfU1RBVCgidHhfYnl0ZXMiLCB0eG9jdGV0Y291bnRfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJ0eF9wYWNrZXRzIiwgdHhmcmFtZWNvdW50X2diKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfdW5pY2FzdF9wYWNrZXRzIiwgdHh1bmljYXN0ZnJhbWVzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfYnJvYWRjYXN0X3BhY2tldHMiLCB0eGJyb2FkY2FzdGZyYW1lc19nYiksCisJWEdNQUNfTU1DX1NUQVQoInR4X211bHRpY2FzdF9wYWNrZXRzIiwgdHhtdWx0aWNhc3RmcmFtZXNfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJ0eF92bGFuX3BhY2tldHMiLCB0eHZsYW5mcmFtZXNfZyksCisJWEdNQUNfTU1DX1NUQVQoInR4XzY0X2J5dGVfcGFja2V0cyIsIHR4NjRvY3RldHNfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJ0eF82NV90b18xMjdfYnl0ZV9wYWNrZXRzIiwgdHg2NXRvMTI3b2N0ZXRzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfMTI4X3RvXzI1NV9ieXRlX3BhY2tldHMiLCB0eDEyOHRvMjU1b2N0ZXRzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfMjU2X3RvXzUxMV9ieXRlX3BhY2tldHMiLCB0eDI1NnRvNTExb2N0ZXRzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfNTEyX3RvXzEwMjNfYnl0ZV9wYWNrZXRzIiwgdHg1MTJ0bzEwMjNvY3RldHNfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJ0eF8xMDI0X3RvX21heF9ieXRlX3BhY2tldHMiLCB0eDEwMjR0b21heG9jdGV0c19nYiksCisJWEdNQUNfTU1DX1NUQVQoInR4X3VuZGVyZmxvd19lcnJvcnMiLCB0eHVuZGVyZmxvd2Vycm9yKSwKKwlYR01BQ19NTUNfU1RBVCgidHhfcGF1c2VfZnJhbWVzIiwgdHhwYXVzZWZyYW1lcyksCisKKwlYR01BQ19NTUNfU1RBVCgicnhfYnl0ZXMiLCByeG9jdGV0Y291bnRfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9wYWNrZXRzIiwgcnhmcmFtZWNvdW50X2diKSwKKwlYR01BQ19NTUNfU1RBVCgicnhfdW5pY2FzdF9wYWNrZXRzIiwgcnh1bmljYXN0ZnJhbWVzX2cpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9icm9hZGNhc3RfcGFja2V0cyIsIHJ4YnJvYWRjYXN0ZnJhbWVzX2cpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9tdWx0aWNhc3RfcGFja2V0cyIsIHJ4bXVsdGljYXN0ZnJhbWVzX2cpLAorCVhHTUFDX01NQ19TVEFUKCJyeF92bGFuX3BhY2tldHMiLCByeHZsYW5mcmFtZXNfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJyeF82NF9ieXRlX3BhY2tldHMiLCByeDY0b2N0ZXRzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgicnhfNjVfdG9fMTI3X2J5dGVfcGFja2V0cyIsIHJ4NjV0bzEyN29jdGV0c19nYiksCisJWEdNQUNfTU1DX1NUQVQoInJ4XzEyOF90b18yNTVfYnl0ZV9wYWNrZXRzIiwgcngxMjh0bzI1NW9jdGV0c19nYiksCisJWEdNQUNfTU1DX1NUQVQoInJ4XzI1Nl90b181MTFfYnl0ZV9wYWNrZXRzIiwgcngyNTZ0bzUxMW9jdGV0c19nYiksCisJWEdNQUNfTU1DX1NUQVQoInJ4XzUxMl90b18xMDIzX2J5dGVfcGFja2V0cyIsIHJ4NTEydG8xMDIzb2N0ZXRzX2diKSwKKwlYR01BQ19NTUNfU1RBVCgicnhfMTAyNF90b19tYXhfYnl0ZV9wYWNrZXRzIiwgcngxMDI0dG9tYXhvY3RldHNfZ2IpLAorCVhHTUFDX01NQ19TVEFUKCJyeF91bmRlcnNpemVfcGFja2V0cyIsIHJ4dW5kZXJzaXplX2cpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9vdmVyc2l6ZV9wYWNrZXRzIiwgcnhvdmVyc2l6ZV9nKSwKKwlYR01BQ19NTUNfU1RBVCgicnhfY3JjX2Vycm9ycyIsIHJ4Y3JjZXJyb3IpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9jcmNfZXJyb3JzX3NtYWxsX3BhY2tldHMiLCByeHJ1bnRlcnJvciksCisJWEdNQUNfTU1DX1NUQVQoInJ4X2NyY19lcnJvcnNfZ2lhbnRfcGFja2V0cyIsIHJ4amFiYmVyZXJyb3IpLAorCVhHTUFDX01NQ19TVEFUKCJyeF9sZW5ndGhfZXJyb3JzIiwgcnhsZW5ndGhlcnJvciksCisJWEdNQUNfTU1DX1NUQVQoInJ4X291dF9vZl9yYW5nZV9lcnJvcnMiLCByeG91dG9mcmFuZ2V0eXBlKSwKKwlYR01BQ19NTUNfU1RBVCgicnhfZmlmb19vdmVyZmxvd19lcnJvcnMiLCByeGZpZm9vdmVyZmxvdyksCisJWEdNQUNfTU1DX1NUQVQoInJ4X3dhdGNoZG9nX2Vycm9ycyIsIHJ4d2F0Y2hkb2dlcnJvciksCisJWEdNQUNfTU1DX1NUQVQoInJ4X3BhdXNlX2ZyYW1lcyIsIHJ4cGF1c2VmcmFtZXMpLAorfTsKKyNkZWZpbmUgWEdCRV9TVEFUU19DT1VOVAlBUlJBWV9TSVpFKHhnYmVfZ3N0cmluZ19zdGF0cykKKworc3RhdGljIHZvaWQgeGdiZV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCURCR1BSKCItLT4lc1xuIiwgX19mdW5jX18pOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IFhHQkVfU1RBVFNfQ09VTlQ7IGkrKykgeworCQkJbWVtY3B5KGRhdGEsIHhnYmVfZ3N0cmluZ19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJfQorCisJREJHUFIoIjwtLSVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXU4ICpzdGF0OworCWludCBpOworCisJREJHUFIoIi0tPiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlwZGF0YS0+aHdfaWYucmVhZF9tbWNfc3RhdHMocGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBYR0JFX1NUQVRTX0NPVU5UOyBpKyspIHsKKwkJc3RhdCA9ICh1OCAqKXBkYXRhICsgeGdiZV9nc3RyaW5nX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OworCQkqZGF0YSsrID0gKih1NjQgKilzdGF0OworCX0KKworCURCR1BSKCI8LS0lc1xuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IHhnYmVfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHN0cmluZ3NldCkKK3sKKwlpbnQgcmV0OworCisJREJHUFIoIi0tPiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXQgPSBYR0JFX1NUQVRTX0NPVU5UOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCURCR1BSKCI8LS0lc1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGdiZV9nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlEQkdQUigiLS0+eGdiZV9nZXRfcGF1c2VwYXJhbVxuIik7CisKKwlwYXVzZS0+YXV0b25lZyA9IHBkYXRhLT5wYXVzZV9hdXRvbmVnOworCXBhdXNlLT50eF9wYXVzZSA9IHBkYXRhLT50eF9wYXVzZTsKKwlwYXVzZS0+cnhfcGF1c2UgPSBwZGF0YS0+cnhfcGF1c2U7CisKKwlEQkdQUigiPC0teGdiZV9nZXRfcGF1c2VwYXJhbVxuIik7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlkZXY7CisJaW50IHJldCA9IDA7CisKKwlEQkdQUigiLS0+eGdiZV9zZXRfcGF1c2VwYXJhbVxuIik7CisKKwlEQkdQUigiICBhdXRvbmVnID0gJWQsIHR4X3BhdXNlID0gJWQsIHJ4X3BhdXNlID0gJWRcbiIsCisJICAgICAgcGF1c2UtPmF1dG9uZWcsIHBhdXNlLT50eF9wYXVzZSwgcGF1c2UtPnJ4X3BhdXNlKTsKKworCXBkYXRhLT5wYXVzZV9hdXRvbmVnID0gcGF1c2UtPmF1dG9uZWc7CisJaWYgKHBhdXNlLT5hdXRvbmVnKSB7CisJCXBoeWRldi0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZTsKKwkJcGh5ZGV2LT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisKKwl9IGVsc2UgeworCQlwaHlkZXYtPmFkdmVydGlzaW5nICY9IH5BRFZFUlRJU0VEX1BhdXNlOworCQlwaHlkZXYtPmFkdmVydGlzaW5nICY9IH5BRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisKKwkJcGRhdGEtPnR4X3BhdXNlID0gcGF1c2UtPnR4X3BhdXNlOworCQlwZGF0YS0+cnhfcGF1c2UgPSBwYXVzZS0+cnhfcGF1c2U7CisJfQorCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0ID0gcGh5X3N0YXJ0X2FuZWcocGh5ZGV2KTsKKworCURCR1BSKCI8LS14Z2JlX3NldF9wYXVzZXBhcmFtXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0OworCisJREJHUFIoIi0tPnhnYmVfZ2V0X3NldHRpbmdzXG4iKTsKKworCWlmICghcGRhdGEtPnBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisKKwlyZXQgPSBwaHlfZXRodG9vbF9nc2V0KHBkYXRhLT5waHlkZXYsIGNtZCk7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKworCURCR1BSKCI8LS14Z2JlX2dldF9zZXR0aW5nc1xuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhnYmVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlkZXY7CisJdTMyIHNwZWVkOworCWludCByZXQ7CisKKwlEQkdQUigiLS0+eGdiZV9zZXRfc2V0dGluZ3NcbiIpOworCisJaWYgKCFwZGF0YS0+cGh5ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKworCXNwZWVkID0gZXRodG9vbF9jbWRfc3BlZWQoY21kKTsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKGNtZC0+cGh5X2FkZHJlc3MgIT0gcGh5ZGV2LT5hZGRyKQorCQlnb3RvIHVubG9jazsKKworCWlmICgoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKSAmJgorCSAgICAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSAmJgorCSAgICAoKChzcGVlZCAhPSBTUEVFRF8xMDAwMCkgJiYgKHNwZWVkICE9IFNQRUVEXzEwMDApKSB8fAorCSAgICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiBDbGVhciBzZXR0aW5ncyBuZWVkZWQgdG8gZm9yY2Ugc3BlZWRzICovCisJCXBoeWRldi0+c3VwcG9ydGVkICY9IH5TVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisJCXBoeWRldi0+c3VwcG9ydGVkICY9IH5TVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsOworCX0gZWxzZSB7CisJCS8qIEFkZCBzZXR0aW5ncyBuZWVkZWQgdG8gZm9yY2Ugc3BlZWQgKi8KKwkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsOworCX0KKworCWNtZC0+YWR2ZXJ0aXNpbmcgJj0gcGh5ZGV2LT5zdXBwb3J0ZWQ7CisJaWYgKChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpICYmICFjbWQtPmFkdmVydGlzaW5nKQorCQlnb3RvIHVubG9jazsKKworCXJldCA9IDA7CisJcGh5ZGV2LT5hdXRvbmVnID0gY21kLT5hdXRvbmVnOworCXBoeWRldi0+c3BlZWQgPSBzcGVlZDsKKwlwaHlkZXYtPmR1cGxleCA9IGNtZC0+ZHVwbGV4OworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBjbWQtPmFkdmVydGlzaW5nOworCisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJcGh5ZGV2LT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJZWxzZQorCQlwaHlkZXYtPmFkdmVydGlzaW5nICY9IH5BRFZFUlRJU0VEX0F1dG9uZWc7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXQgPSBwaHlfc3RhcnRfYW5lZyhwaHlkZXYpOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisKKwlEQkdQUigiPC0teGdiZV9zZXRfc2V0dGluZ3NcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGdiZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgWEdCRV9EUlZfTkFNRSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgWEdCRV9EUlZfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBkZXZfbmFtZShwZGF0YS0+ZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CisJc25wcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pLCAiJWQuJWQuJWQiLAorCQkgWEdNQUNfSU9SRUFEX0JJVFMocGRhdGEsIE1BQ19WUiwgVVNFUlZFUiksCisJCSBYR01BQ19JT1JFQURfQklUUyhwZGF0YSwgTUFDX1ZSLCBERVZJRCksCisJCSBYR01BQ19JT1JFQURfQklUUyhwZGF0YSwgTUFDX1ZSLCBTTlBTVkVSKSk7CisJZHJ2aW5mby0+bl9zdGF0cyA9IFhHQkVfU1RBVFNfQ09VTlQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKKwl1bnNpZ25lZCBpbnQgcml3dDsKKworCURCR1BSKCItLT54Z2JlX2dldF9jb2FsZXNjZVxuIik7CisKKwltZW1zZXQoZWMsIDAsIHNpemVvZihzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSkpOworCisJcml3dCA9IHBkYXRhLT5yeF9yaXd0OworCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IGh3X2lmLT5yaXd0X3RvX3VzZWMocGRhdGEsIHJpd3QpOworCWVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHBkYXRhLT5yeF9mcmFtZXM7CisKKwllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSBwZGF0YS0+dHhfdXNlY3M7CisJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gcGRhdGEtPnR4X2ZyYW1lczsKKworCURCR1BSKCI8LS14Z2JlX2dldF9jb2FsZXNjZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2JlX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCXVuc2lnbmVkIGludCByeF9mcmFtZXMsIHJ4X3Jpd3QsIHJ4X3VzZWNzOworCXVuc2lnbmVkIGludCB0eF9mcmFtZXMsIHR4X3VzZWNzOworCisJREJHUFIoIi0tPnhnYmVfc2V0X2NvYWxlc2NlXG4iKTsKKworCS8qIENoZWNrIGZvciBub3Qgc3VwcG9ydGVkIHBhcmFtZXRlcnMgICovCisJaWYgKChlYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxKSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkgfHwKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEpIHx8CisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxKSB8fAorCSAgICAoZWMtPnN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzKSB8fAorCSAgICAoZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkgfHwKKwkgICAgKGVjLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UpIHx8CisJICAgIChlYy0+cGt0X3JhdGVfbG93KSB8fAorCSAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdykgfHwKKwkgICAgKGVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3cpIHx8CisJICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3NfbG93KSB8fAorCSAgICAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdykgfHwKKwkgICAgKGVjLT5wa3RfcmF0ZV9oaWdoKSB8fAorCSAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2gpIHx8CisJICAgIChlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCkgfHwKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2Vjc19oaWdoKSB8fAorCSAgICAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2gpIHx8CisJICAgIChlYy0+cmF0ZV9zYW1wbGVfaW50ZXJ2YWwpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBDYW4gb25seSBjaGFuZ2UgcngtZnJhbWVzIHdoZW4gaW50ZXJmYWNlIGlzIGRvd24gKHNlZQorCSAqIHJ4X2Rlc2NyaXB0b3JfaW5pdCBpbiB4Z2JlLWRldi5jKQorCSAqLworCXJ4X2ZyYW1lcyA9IHBkYXRhLT5yeF9mcmFtZXM7CisJaWYgKHJ4X2ZyYW1lcyAhPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCW5ldGRldl9hbGVydChuZXRkZXYsCisJCQkgICAgICJpbnRlcmZhY2UgbXVzdCBiZSBkb3duIHRvIGNoYW5nZSByeC1mcmFtZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyeF9yaXd0ID0gaHdfaWYtPnVzZWNfdG9fcml3dChwZGF0YSwgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwlyeF9mcmFtZXMgPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisKKwkvKiBVc2Ugc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaWYgY29udmVyc2lvbiByZXN1bHRlZCBpbiB6ZXJvICovCisJaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyAmJiAhcnhfcml3dCkKKwkJcnhfcml3dCA9IDE7CisKKwkvKiBDaGVjayB0aGUgYm91bmRzIG9mIHZhbHVlcyBmb3IgUnggKi8KKwlpZiAocnhfcml3dCA+IFhHTUFDX01BWF9ETUFfUklXVCkgeworCQlyeF91c2VjcyA9IGh3X2lmLT5yaXd0X3RvX3VzZWMocGRhdGEsIFhHTUFDX01BWF9ETUFfUklXVCk7CisJCW5ldGRldl9hbGVydChuZXRkZXYsICJyeC11c2VjIGlzIGxpbWl0ZWQgdG8gJWQgdXNlY3NcbiIsCisJCQkgICAgIHJ4X3VzZWNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyeF9mcmFtZXMgPiBwZGF0YS0+Y2hhbm5lbC0+cnhfcmluZy0+cmRlc2NfY291bnQpIHsKKwkJbmV0ZGV2X2FsZXJ0KG5ldGRldiwgInJ4LWZyYW1lcyBpcyBsaW1pdGVkIHRvICVkIGZyYW1lc1xuIiwKKwkJCSAgICAgcGRhdGEtPmNoYW5uZWwtPnJ4X3JpbmctPnJkZXNjX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHhfdXNlY3MgPSBlYy0+dHhfY29hbGVzY2VfdXNlY3M7CisJdHhfZnJhbWVzID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCisJLyogQ2hlY2sgdGhlIGJvdW5kcyBvZiB2YWx1ZXMgZm9yIFR4ICovCisJaWYgKHR4X2ZyYW1lcyA+IHBkYXRhLT5jaGFubmVsLT50eF9yaW5nLT5yZGVzY19jb3VudCkgeworCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAidHgtZnJhbWVzIGlzIGxpbWl0ZWQgdG8gJWQgZnJhbWVzXG4iLAorCQkJICAgICBwZGF0YS0+Y2hhbm5lbC0+dHhfcmluZy0+cmRlc2NfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwZGF0YS0+cnhfcml3dCA9IHJ4X3Jpd3Q7CisJcGRhdGEtPnJ4X2ZyYW1lcyA9IHJ4X2ZyYW1lczsKKwlod19pZi0+Y29uZmlnX3J4X2NvYWxlc2NlKHBkYXRhKTsKKworCXBkYXRhLT50eF91c2VjcyA9IHR4X3VzZWNzOworCXBkYXRhLT50eF9mcmFtZXMgPSB0eF9mcmFtZXM7CisJaHdfaWYtPmNvbmZpZ190eF9jb2FsZXNjZShwZGF0YSk7CisKKwlEQkdQUigiPC0teGdiZV9zZXRfY29hbGVzY2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgeGdiZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0geGdiZV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IHhnYmVfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IHhnYmVfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2NvYWxlc2NlID0geGdiZV9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZSA9IHhnYmVfc2V0X2NvYWxlc2NlLAorCS5nZXRfcGF1c2VwYXJhbSA9IHhnYmVfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtID0geGdiZV9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3N0cmluZ3MgPSB4Z2JlX2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IHhnYmVfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9zc2V0X2NvdW50ID0geGdiZV9nZXRfc3NldF9jb3VudCwKK307CisKK3N0cnVjdCBldGh0b29sX29wcyAqeGdiZV9nZXRfZXRodG9vbF9vcHModm9pZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBldGh0b29sX29wcyAqKSZ4Z2JlX2V0aHRvb2xfb3BzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM1ODRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKiBBTUQgMTBHYiBFdGhlcm5ldCBkcml2ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgZm9sbG93aW5nIHR3bworICogbGljZW5zZXM6CisgKgorICogTGljZW5zZSAxOiBHUEx2MgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgY29weSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBMaWNlbnNlIDI6IE1vZGlmaWVkIEJTRAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqICAgICBUaGUgU3lub3BzeXMgRFdDIEVUSEVSIFhHTUFDIFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbgorICogICAgIChoZXJlaW5hZnRlciAiU29mdHdhcmUiKSBpcyBhbiB1bnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLAorICogICAgIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cworICogICAgIGFuZCB5b3UuCisgKgorICogICAgIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiAgICAgdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQKKyAqICAgICBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5CisgKiAgICAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICAgYW5ub3RhdGVkIHdpdGggdGhpcyBsaWNlbnNlIGFuZCB0aGUgU29mdHdhcmUsIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCisgKiAgICAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAqICAgICB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiAgICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqICAgICBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogICAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTCisgKiAgICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlICJ4Z2JlLmgiCisjaW5jbHVkZSAieGdiZS1jb21tb24uaCIKKworCitNT0RVTEVfQVVUSE9SKCJUb20gTGVuZGFja3kgPHRob21hcy5sZW5kYWNreUBhbWQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oWEdCRV9EUlZfVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oWEdCRV9EUlZfREVTQyk7CisKK3N0YXRpYyBzdHJ1Y3QgeGdiZV9jaGFubmVsICp4Z2JlX2FsbG9jX3JpbmdzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsX21lbSwgKmNoYW5uZWw7CisJc3RydWN0IHhnYmVfcmluZyAqdHhfcmluZywgKnJ4X3Jpbmc7CisJdW5zaWduZWQgaW50IGNvdW50LCBpOworCisJREJHUFIoIi0tPnhnYmVfYWxsb2NfcmluZ3NcbiIpOworCisJY291bnQgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIHBkYXRhLT50eF9yaW5nX2NvdW50LCBwZGF0YS0+cnhfcmluZ19jb3VudCk7CisKKwljaGFubmVsX21lbSA9IGRldm1fa2NhbGxvYyhwZGF0YS0+ZGV2LCBjb3VudCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHhnYmVfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbF9tZW0pCisJCXJldHVybiBOVUxMOworCisJdHhfcmluZyA9IGRldm1fa2NhbGxvYyhwZGF0YS0+ZGV2LCBwZGF0YS0+dHhfcmluZ19jb3VudCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHhnYmVfcmluZyksIEdGUF9LRVJORUwpOworCWlmICghdHhfcmluZykKKwkJcmV0dXJuIE5VTEw7CisKKwlyeF9yaW5nID0gZGV2bV9rY2FsbG9jKHBkYXRhLT5kZXYsIHBkYXRhLT5yeF9yaW5nX2NvdW50LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgeGdiZV9yaW5nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9yaW5nKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDAsIGNoYW5uZWwgPSBjaGFubmVsX21lbTsgaSA8IGNvdW50OyBpKyssIGNoYW5uZWwrKykgeworCQlzbnByaW50ZihjaGFubmVsLT5uYW1lLCBzaXplb2YoY2hhbm5lbC0+bmFtZSksICJjaGFubmVsLSVkIiwgaSk7CisJCWNoYW5uZWwtPnBkYXRhID0gcGRhdGE7CisJCWNoYW5uZWwtPnF1ZXVlX2luZGV4ID0gaTsKKwkJY2hhbm5lbC0+ZG1hX3JlZ3MgPSBwZGF0YS0+eGdtYWNfcmVncyArIERNQV9DSF9CQVNFICsKKwkJCQkgICAgKERNQV9DSF9JTkMgKiBpKTsKKworCQlpZiAoaSA8IHBkYXRhLT50eF9yaW5nX2NvdW50KSB7CisJCQlzcGluX2xvY2tfaW5pdCgmdHhfcmluZy0+bG9jayk7CisJCQljaGFubmVsLT50eF9yaW5nID0gdHhfcmluZysrOworCQl9CisKKwkJaWYgKGkgPCBwZGF0YS0+cnhfcmluZ19jb3VudCkgeworCQkJc3Bpbl9sb2NrX2luaXQoJnR4X3JpbmctPmxvY2spOworCQkJY2hhbm5lbC0+cnhfcmluZyA9IHJ4X3JpbmcrKzsKKwkJfQorCisJCURCR1BSKCIgICVzIC0gcXVldWVfaW5kZXg9JXUsIGRtYV9yZWdzPSVwLCB0eD0lcCwgcng9JXBcbiIsCisJCSAgICAgIGNoYW5uZWwtPm5hbWUsIGNoYW5uZWwtPnF1ZXVlX2luZGV4LCBjaGFubmVsLT5kbWFfcmVncywKKwkJICAgICAgY2hhbm5lbC0+dHhfcmluZywgY2hhbm5lbC0+cnhfcmluZyk7CisJfQorCisJcGRhdGEtPmNoYW5uZWxfY291bnQgPSBjb3VudDsKKworCURCR1BSKCI8LS14Z2JlX2FsbG9jX3JpbmdzXG4iKTsKKworCXJldHVybiBjaGFubmVsX21lbTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9kZWZhdWx0X2NvbmZpZyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJREJHUFIoIi0tPnhnYmVfZGVmYXVsdF9jb25maWdcbiIpOworCisJcGRhdGEtPnBibHg4ID0gRE1BX1BCTF9YOF9FTkFCTEU7CisJcGRhdGEtPnR4X3NmX21vZGUgPSBNVExfVFNGX0VOQUJMRTsKKwlwZGF0YS0+dHhfdGhyZXNob2xkID0gTVRMX1RYX1RIUkVTSE9MRF82NDsKKwlwZGF0YS0+dHhfcGJsID0gRE1BX1BCTF8xNjsKKwlwZGF0YS0+dHhfb3NwX21vZGUgPSBETUFfT1NQX0VOQUJMRTsKKwlwZGF0YS0+cnhfc2ZfbW9kZSA9IE1UTF9SU0ZfRElTQUJMRTsKKwlwZGF0YS0+cnhfdGhyZXNob2xkID0gTVRMX1JYX1RIUkVTSE9MRF82NDsKKwlwZGF0YS0+cnhfcGJsID0gRE1BX1BCTF8xNjsKKwlwZGF0YS0+cGF1c2VfYXV0b25lZyA9IDE7CisJcGRhdGEtPnR4X3BhdXNlID0gMTsKKwlwZGF0YS0+cnhfcGF1c2UgPSAxOworCXBkYXRhLT5wb3dlcl9kb3duID0gMDsKKwlwZGF0YS0+ZGVmYXVsdF9hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJcGRhdGEtPmRlZmF1bHRfc3BlZWQgPSBTUEVFRF8xMDAwMDsKKworCURCR1BSKCI8LS14Z2JlX2RlZmF1bHRfY29uZmlnXG4iKTsKK30KKworc3RhdGljIHZvaWQgeGdiZV9pbml0X2FsbF9mcHRycyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCit7CisJeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGV2KCZwZGF0YS0+aHdfaWYpOworCXhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX2Rlc2MoJnBkYXRhLT5kZXNjX2lmKTsKK30KKworc3RhdGljIGludCB4Z2JlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhOworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZjsKKwlzdHJ1Y3QgeGdiZV9kZXNjX2lmICpkZXNjX2lmOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljb25zdCB1OCAqbWFjX2FkZHI7CisJaW50IHJldDsKKworCURCR1BSKCItLT4geGdiZV9wcm9iZVxuIik7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IHhnYmVfcHJ2X2RhdGEpLAorCQkJCSAgIFhHQkVfTUFYX0RNQV9DSEFOTkVMUyk7CisJaWYgKCFuZXRkZXYpIHsKKwkJZGV2X2VycihkZXYsICJhbGxvY19ldGhlcmRldiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCBkZXYpOworCXBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwZGF0YS0+bmV0ZGV2ID0gbmV0ZGV2OworCXBkYXRhLT5wZGV2ID0gcGRldjsKKwlwZGF0YS0+ZGV2ID0gZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmcGRhdGEtPmxvY2spOworCW11dGV4X2luaXQoJnBkYXRhLT54cGNzX211dGV4KTsKKworCS8qIFNldCBhbmQgdmFsaWRhdGUgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBmb3IgYSByaW5nICovCisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFRYX0RFU0NfQ05UKTsKKwlwZGF0YS0+dHhfZGVzY19jb3VudCA9IFRYX0RFU0NfQ05UOworCWlmIChwZGF0YS0+dHhfZGVzY19jb3VudCAmIChwZGF0YS0+dHhfZGVzY19jb3VudCAtIDEpKSB7CisJCWRldl9lcnIoZGV2LCAidHggZGVzY3JpcHRvciBjb3VudCAoJWQpIGlzIG5vdCB2YWxpZFxuIiwKKwkJCXBkYXRhLT50eF9kZXNjX2NvdW50KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfaW87CisJfQorCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihSWF9ERVNDX0NOVCk7CisJcGRhdGEtPnJ4X2Rlc2NfY291bnQgPSBSWF9ERVNDX0NOVDsKKwlpZiAocGRhdGEtPnJ4X2Rlc2NfY291bnQgJiAocGRhdGEtPnJ4X2Rlc2NfY291bnQgLSAxKSkgeworCQlkZXZfZXJyKGRldiwgInJ4IGRlc2NyaXB0b3IgY291bnQgKCVkKSBpcyBub3QgdmFsaWRcbiIsCisJCQlwZGF0YS0+cnhfZGVzY19jb3VudCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lvOworCX0KKworCS8qIE9idGFpbiB0aGUgc3lzdGVtIGNsb2NrIHNldHRpbmcgKi8KKwlwZGF0YS0+c3lzY2xvY2sgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5zeXNjbG9jaykpIHsKKwkJZGV2X2VycihkZXYsICJkZXZtX2Nsa19nZXQgZmFpbGVkXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihwZGF0YS0+c3lzY2xvY2spOworCQlnb3RvIGVycl9pbzsKKwl9CisKKwkvKiBPYnRhaW4gdGhlIG1taW8gYXJlYXMgZm9yIHRoZSBkZXZpY2UgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXBkYXRhLT54Z21hY19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT54Z21hY19yZWdzKSkgeworCQlkZXZfZXJyKGRldiwgInhnbWFjIGlvcmVtYXAgZmFpbGVkXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihwZGF0YS0+eGdtYWNfcmVncyk7CisJCWdvdG8gZXJyX2lvOworCX0KKwlEQkdQUigiICB4Z21hY19yZWdzID0gJXBcbiIsIHBkYXRhLT54Z21hY19yZWdzKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJcGRhdGEtPnhwY3NfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihwZGF0YS0+eHBjc19yZWdzKSkgeworCQlkZXZfZXJyKGRldiwgInhwY3MgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSBQVFJfRVJSKHBkYXRhLT54cGNzX3JlZ3MpOworCQlnb3RvIGVycl9pbzsKKwl9CisJREJHUFIoIiAgeHBjc19yZWdzICA9ICVwXG4iLCBwZGF0YS0+eHBjc19yZWdzKTsKKworCS8qIFNldCB0aGUgRE1BIG1hc2sgKi8KKwlpZiAoIWRldi0+ZG1hX21hc2spCisJCWRldi0+ZG1hX21hc2sgPSAmZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKKwkqKGRldi0+ZG1hX21hc2spID0gRE1BX0JJVF9NQVNLKDQwKTsKKwlkZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDQwKTsKKworCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJwbGF0Zm9ybV9nZXRfaXJxIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2lvOworCX0KKwluZXRkZXYtPmlycSA9IHJldDsKKwluZXRkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKXBkYXRhLT54Z21hY19yZWdzOworCisJLyogU2V0IGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwl4Z2JlX2luaXRfYWxsX2ZwdHJzKHBkYXRhKTsKKwlod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJZGVzY19pZiA9ICZwZGF0YS0+ZGVzY19pZjsKKworCS8qIElzc3VlIHNvZnR3YXJlIHJlc2V0IHRvIGRldmljZSAqLworCWh3X2lmLT5leGl0KHBkYXRhKTsKKworCS8qIFBvcHVsYXRlIHRoZSBoYXJkd2FyZSBmZWF0dXJlcyAqLworCXhnYmVfZ2V0X2FsbF9od19mZWF0dXJlcyhwZGF0YSk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgTUFDIGFkZHJlc3MgKi8KKwltYWNfYWRkciA9IG9mX2dldF9tYWNfYWRkcmVzcyhkZXYtPm9mX25vZGUpOworCWlmICghbWFjX2FkZHIpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIG1hYyBhZGRyZXNzIGZvciB0aGlzIGRldmljZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lvOworCX0KKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgbWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJLyogUmV0cmlldmUgdGhlIFBIWSBtb2RlIC0gaXQgbXVzdCBiZSAieGdtaWkiICovCisJcGRhdGEtPnBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKGRldi0+b2Zfbm9kZSk7CisJaWYgKHBkYXRhLT5waHlfbW9kZSAhPSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIHBoeS1tb2RlIHNwZWNpZmllZCBmb3IgdGhpcyBkZXZpY2VcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9pbzsKKwl9CisKKwkvKiBTZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRhdGEgKi8KKwl4Z2JlX2RlZmF1bHRfY29uZmlnKHBkYXRhKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCByaW5ncyB0byBiZSBjcmVhdGVkICovCisJcGRhdGEtPnR4X3JpbmdfY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG51bV9vbmxpbmVfY3B1cygpLAorCQkJCSAgICAgcGRhdGEtPmh3X2ZlYXQudHhfY2hfY250KTsKKwlpZiAobmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXRkZXYsIHBkYXRhLT50eF9yaW5nX2NvdW50KSkgeworCQlkZXZfZXJyKGRldiwgImVycm9yIHNldHRpbmcgcmVhbCB0eCBxdWV1ZSBjb3VudFxuIik7CisJCWdvdG8gZXJyX2lvOworCX0KKworCXBkYXRhLT5yeF9yaW5nX2NvdW50ID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICAgbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKSwKKwkJCQkgICAgIHBkYXRhLT5od19mZWF0LnJ4X2NoX2NudCk7CisJcmV0ID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIHBkYXRhLT5yeF9yaW5nX2NvdW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZXJyb3Igc2V0dGluZyByZWFsIHJ4IHF1ZXVlIGNvdW50XG4iKTsKKwkJZ290byBlcnJfaW87CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHJpbmdzIGZvciB0aGUgRE1BIGNoYW5uZWxzICovCisJcGRhdGEtPmNoYW5uZWwgPSB4Z2JlX2FsbG9jX3JpbmdzKHBkYXRhKTsKKwlpZiAoIXBkYXRhLT5jaGFubmVsKSB7CisJCWRldl9lcnIoZGV2LCAicmluZyBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvOworCX0KKworCS8qIFByZXBhcmUgdG8gcmVnc2l0ZXIgd2l0aCBNRElPICovCisJcGRhdGEtPm1paV9idXNfaWQgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzIiwgcGRldi0+bmFtZSk7CisJaWYgKCFwZGF0YS0+bWlpX2J1c19pZCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtaWkgYnVzIGlkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW87CisJfQorCXJldCA9IHhnYmVfbWRpb19yZWdpc3RlcihwZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYnVzX2lkOworCisJLyogU2V0IG5ldHdvcmsgYW5kIGV0aHRvb2wgb3BlcmF0aW9ucyAqLworCW5ldGRldi0+bmV0ZGV2X29wcyA9IHhnYmVfZ2V0X25ldGRldl9vcHMoKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0geGdiZV9nZXRfZXRodG9vbF9vcHMoKTsKKworCS8qIFNldCBkZXZpY2UgZmVhdHVyZXMgKi8KKwluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CisJCQkgICAgICBORVRJRl9GX0lQX0NTVU0gfAorCQkJICAgICAgTkVUSUZfRl9JUFY2X0NTVU0gfAorCQkJICAgICAgTkVUSUZfRl9SWENTVU0gfAorCQkJICAgICAgTkVUSUZfRl9UU08gfAorCQkJICAgICAgTkVUSUZfRl9UU082IHwKKwkJCSAgICAgIE5FVElGX0ZfR1JPIHwKKwkJCSAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCSAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYOworCisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfAorCQkJCSBORVRJRl9GX0lQX0NTVU0gfAorCQkJCSBORVRJRl9GX0lQVjZfQ1NVTSB8CisJCQkJIE5FVElGX0ZfVFNPIHwKKwkJCQkgTkVUSUZfRl9UU082OworCisJbmV0ZGV2LT5mZWF0dXJlcyB8PSBuZXRkZXYtPmh3X2ZlYXR1cmVzOworCXBkYXRhLT5uZXRkZXZfZmVhdHVyZXMgPSBuZXRkZXYtPmZlYXR1cmVzOworCisJeGdiZV9pbml0X3J4X2NvYWxlc2NlKHBkYXRhKTsKKwl4Z2JlX2luaXRfdHhfY29hbGVzY2UocGRhdGEpOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAibmV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfcmVnX25ldGRldjsKKwl9CisKKwl4Z2JlX2RlYnVnZnNfaW5pdChwZGF0YSk7CisKKwluZXRkZXZfbm90aWNlKG5ldGRldiwgIm5ldCBkZXZpY2UgZW5hYmxlZFxuIik7CisKKwlEQkdQUigiPC0tIHhnYmVfcHJvYmVcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdfbmV0ZGV2OgorCXhnYmVfbWRpb191bnJlZ2lzdGVyKHBkYXRhKTsKKworZXJyX2J1c19pZDoKKwlrZnJlZShwZGF0YS0+bWlpX2J1c19pZCk7CisKK2Vycl9pbzoKKwlmcmVlX25ldGRldihuZXRkZXYpOworCitlcnJfYWxsb2M6CisJZGV2X25vdGljZShkZXYsICJuZXQgZGV2aWNlIG5vdCBlbmFibGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdiZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCURCR1BSKCItLT54Z2JlX3JlbW92ZVxuIik7CisKKwl4Z2JlX2RlYnVnZnNfZXhpdChwZGF0YSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJeGdiZV9tZGlvX3VucmVnaXN0ZXIocGRhdGEpOworCisJa2ZyZWUocGRhdGEtPm1paV9idXNfaWQpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCURCR1BSKCI8LS14Z2JlX3JlbW92ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB4Z2JlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJREJHUFIoIi0tPnhnYmVfc3VzcGVuZFxuIik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlEQkdQUigiPC0teGdiZV9kZXZfc3VzcGVuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHhnYmVfcG93ZXJkb3duKG5ldGRldiwgWEdNQUNfRFJJVkVSX0NPTlRFWFQpOworCisJREJHUFIoIjwtLXhnYmVfc3VzcGVuZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhnYmVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCURCR1BSKCItLT54Z2JlX3Jlc3VtZVxuIik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlEQkdQUigiPC0teGdiZV9kZXZfcmVzdW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0geGdiZV9wb3dlcnVwKG5ldGRldiwgWEdNQUNfRFJJVkVSX0NPTlRFWFQpOworCisJREJHUFIoIjwtLXhnYmVfcmVzdW1lXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnYmVfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFtZCx4Z2JlLXNlYXR0bGUtdjFhIiwgfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHhnYmVfb2ZfbWF0Y2gpOworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHhnYmVfcG1fb3BzLCB4Z2JlX3N1c3BlbmQsIHhnYmVfcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGdiZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYW1kLXhnYmUiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB4Z2JlX29mX21hdGNoLAorCQkucG0gPSAmeGdiZV9wbV9vcHMsCisJfSwKKwkucHJvYmUgPSB4Z2JlX3Byb2JlLAorCS5yZW1vdmUgPSB4Z2JlX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGdiZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdhNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tZGlvLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBBTUQgMTBHYiBFdGhlcm5ldCBkcml2ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgZm9sbG93aW5nIHR3bworICogbGljZW5zZXM6CisgKgorICogTGljZW5zZSAxOiBHUEx2MgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgY29weSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisgKiAgICAgVGhlIFN5bm9wc3lzIERXQyBFVEhFUiBYR01BQyBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24KKyAqICAgICAoaGVyZWluYWZ0ZXIgIlNvZnR3YXJlIikgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywKKyAqICAgICBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMKKyAqICAgICBhbmQgeW91LgorICoKKyAqICAgICBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogICAgIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkCisgKiAgICAgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uICBQZXJtaXNzaW9uIGlzIGhlcmVieQorICogICAgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZQorICogICAgIGFubm90YXRlZCB3aXRoIHRoaXMgbGljZW5zZSBhbmQgdGhlIFNvZnR3YXJlLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQorICogICAgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiAgICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCisgKiAgICAgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogICAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiAgICAgQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICAgICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqICAgICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUworICogICAgIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiAgICAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqICAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBMaWNlbnNlIDI6IE1vZGlmaWVkIEJTRAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqICAgICBUaGUgU3lub3BzeXMgRFdDIEVUSEVSIFhHTUFDIFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbgorICogICAgIChoZXJlaW5hZnRlciAiU29mdHdhcmUiKSBpcyBhbiB1bnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLAorICogICAgIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cworICogICAgIGFuZCB5b3UuCisgKgorICogICAgIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiAgICAgdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQKKyAqICAgICBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5CisgKiAgICAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICAgYW5ub3RhdGVkIHdpdGggdGhpcyBsaWNlbnNlIGFuZCB0aGUgU29mdHdhcmUsIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCisgKiAgICAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAqICAgICB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiAgICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqICAgICBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogICAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTCisgKiAgICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjaW5jbHVkZSAieGdiZS5oIgorI2luY2x1ZGUgInhnYmUtY29tbW9uLmgiCisKKworc3RhdGljIGludCB4Z2JlX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqbWlpLCBpbnQgcHJ0YWQsIGludCBtbWRfcmVnKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG1paS0+cHJpdjsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCWludCBtbWRfZGF0YTsKKworCURCR1BSX01ESU8oIi0tPnhnYmVfbWRpb19yZWFkOiBwcnRhZD0lI3ggbW1kX3JlZz0lI3hcbiIsCisJCSAgIHBydGFkLCBtbWRfcmVnKTsKKworCW1tZF9kYXRhID0gaHdfaWYtPnJlYWRfbW1kX3JlZ3MocGRhdGEsIHBydGFkLCBtbWRfcmVnKTsKKworCURCR1BSX01ESU8oIjwtLXhnYmVfbWRpb19yZWFkOiBtbWRfZGF0YT0lI3hcbiIsIG1tZF9kYXRhKTsKKworCXJldHVybiBtbWRfZGF0YTsKK30KKworc3RhdGljIGludCB4Z2JlX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKm1paSwgaW50IHBydGFkLCBpbnQgbW1kX3JlZywKKwkJCSAgIHUxNiBtbWRfdmFsKQoreworCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG1paS0+cHJpdjsKKwlzdHJ1Y3QgeGdiZV9od19pZiAqaHdfaWYgPSAmcGRhdGEtPmh3X2lmOworCWludCBtbWRfZGF0YSA9IG1tZF92YWw7CisKKwlEQkdQUl9NRElPKCItLT54Z2JlX21kaW9fd3JpdGU6IHBydGFkPSUjeCBtbWRfcmVnPSUjeCBtbWRfZGF0YT0lI3hcbiIsCisJCSAgIHBydGFkLCBtbWRfcmVnLCBtbWRfZGF0YSk7CisKKwlod19pZi0+d3JpdGVfbW1kX3JlZ3MocGRhdGEsIHBydGFkLCBtbWRfcmVnLCBtbWRfZGF0YSk7CisKKwlEQkdQUl9NRElPKCI8LS14Z2JlX21kaW9fd3JpdGVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnYmVfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbmV3X3N0YXRlID0gMDsKKworCWlmIChwaHlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJREJHUFJfTURJTygiLS0+eGdiZV9hZGp1c3RfbGluazogYWRkcmVzcz0lZCwgbmV3bGluaz0lZCwgY3VybGluaz0lZFxuIiwKKwkJICAgcGh5ZGV2LT5hZGRyLCBwaHlkZXYtPmxpbmssIHBkYXRhLT5waHlfbGluayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwaHlkZXYtPmxpbmspIHsKKwkJLyogRmxvdyBjb250cm9sIHN1cHBvcnQgKi8KKwkJaWYgKHBkYXRhLT5wYXVzZV9hdXRvbmVnKSB7CisJCQlpZiAocGh5ZGV2LT5wYXVzZSB8fCBwaHlkZXYtPmFzeW1fcGF1c2UpIHsKKwkJCQlwZGF0YS0+dHhfcGF1c2UgPSAxOworCQkJCXBkYXRhLT5yeF9wYXVzZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCXBkYXRhLT50eF9wYXVzZSA9IDA7CisJCQkJcGRhdGEtPnJ4X3BhdXNlID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwZGF0YS0+dHhfcGF1c2UgIT0gcGRhdGEtPnBoeV90eF9wYXVzZSkgeworCQkJaHdfaWYtPmNvbmZpZ190eF9mbG93X2NvbnRyb2wocGRhdGEpOworCQkJcGRhdGEtPnBoeV90eF9wYXVzZSA9IHBkYXRhLT50eF9wYXVzZTsKKwkJfQorCisJCWlmIChwZGF0YS0+cnhfcGF1c2UgIT0gcGRhdGEtPnBoeV9yeF9wYXVzZSkgeworCQkJaHdfaWYtPmNvbmZpZ19yeF9mbG93X2NvbnRyb2wocGRhdGEpOworCQkJcGRhdGEtPnBoeV9yeF9wYXVzZSA9IHBkYXRhLT5yeF9wYXVzZTsKKwkJfQorCisJCS8qIFNwZWVkIHN1cHBvcnQgKi8KKwkJaWYgKHBoeWRldi0+c3BlZWQgIT0gcGRhdGEtPnBoeV9zcGVlZCkgeworCQkJbmV3X3N0YXRlID0gMTsKKworCQkJc3dpdGNoIChwaHlkZXYtPnNwZWVkKSB7CisJCQljYXNlIFNQRUVEXzEwMDAwOgorCQkJCWh3X2lmLT5zZXRfeGdtaWlfc3BlZWQocGRhdGEpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNQRUVEXzI1MDA6CisJCQkJaHdfaWYtPnNldF9nbWlpXzI1MDBfc3BlZWQocGRhdGEpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNQRUVEXzEwMDA6CisJCQkJaHdfaWYtPnNldF9nbWlpX3NwZWVkKHBkYXRhKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBkYXRhLT5waHlfc3BlZWQgPSBwaHlkZXYtPnNwZWVkOworCQl9CisKKwkJaWYgKHBoeWRldi0+bGluayAhPSBwZGF0YS0+cGh5X2xpbmspIHsKKwkJCW5ld19zdGF0ZSA9IDE7CisJCQlwZGF0YS0+cGh5X2xpbmsgPSAxOworCQl9CisJfSBlbHNlIGlmIChwZGF0YS0+cGh5X2xpbmspIHsKKwkJbmV3X3N0YXRlID0gMTsKKwkJcGRhdGEtPnBoeV9saW5rID0gMDsKKwkJcGRhdGEtPnBoeV9zcGVlZCA9IFNQRUVEX1VOS05PV047CisJfQorCisJaWYgKG5ld19zdGF0ZSkKKwkJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKworCURCR1BSX01ESU8oIjwtLXhnYmVfYWRqdXN0X2xpbmtcbiIpOworfQorCit2b2lkIHhnYmVfZHVtcF9waHlfcmVnaXN0ZXJzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwZGF0YS0+ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwZGF0YS0+bWlpLT5waHlfbWFwW1hHQkVfUFJUQURdOworCWludCBpOworCisJZGV2X2FsZXJ0KGRldiwgIlxuKioqKioqKioqKioqKiBQSFkgUmVnIGR1bXAgKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisKKwlkZXZfYWxlcnQoZGV2LCAiUENTIENvbnRyb2wgUmVnICglIzA0eCkgPSAlIzA0eFxuIiwgTURJT19DVFJMMSwKKwkJICBYTURJT19SRUFEKHBkYXRhLCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDEpKTsKKwlkZXZfYWxlcnQoZGV2LCAiUENTIFN0YXR1cyBSZWcgKCUjMDR4KSA9ICUjMDR4XG4iLCBNRElPX1NUQVQxLAorCQkgIFhNRElPX1JFQUQocGRhdGEsIE1ESU9fTU1EX1BDUywgTURJT19TVEFUMSkpOworCWRldl9hbGVydChkZXYsICJQaHkgSWQgKFBIWVMgSUQgMSAlIzA0eCk9ICUjMDR4XG4iLCBNRElPX0RFVklEMSwKKwkJICBYTURJT19SRUFEKHBkYXRhLCBNRElPX01NRF9QQ1MsIE1ESU9fREVWSUQxKSk7CisJZGV2X2FsZXJ0KGRldiwgIlBoeSBJZCAoUEhZUyBJRCAyICUjMDR4KT0gJSMwNHhcbiIsIE1ESU9fREVWSUQyLAorCQkgIFhNRElPX1JFQUQocGRhdGEsIE1ESU9fTU1EX1BDUywgTURJT19ERVZJRDIpKTsKKwlkZXZfYWxlcnQoZGV2LCAiRGV2aWNlcyBpbiBQYWNrYWdlICglIzA0eCk9ICUjMDR4XG4iLCBNRElPX0RFVlMxLAorCQkgIFhNRElPX1JFQUQocGRhdGEsIE1ESU9fTU1EX1BDUywgTURJT19ERVZTMSkpOworCWRldl9hbGVydChkZXYsICJEZXZpY2VzIGluIFBhY2thZ2UgKCUjMDR4KT0gJSMwNHhcbiIsIE1ESU9fREVWUzIsCisJCSAgWE1ESU9fUkVBRChwZGF0YSwgTURJT19NTURfUENTLCBNRElPX0RFVlMyKSk7CisKKwlkZXZfYWxlcnQoZGV2LCAiQXV0by1OZWcgQ29udHJvbCBSZWcgKCUjMDR4KSA9ICUjMDR4XG4iLCBNRElPX0NUUkwxLAorCQkgIFhNRElPX1JFQUQocGRhdGEsIE1ESU9fTU1EX0FOLCBNRElPX0NUUkwxKSk7CisJZGV2X2FsZXJ0KGRldiwgIkF1dG8tTmVnIFN0YXR1cyBSZWcgKCUjMDR4KSA9ICUjMDR4XG4iLCBNRElPX1NUQVQxLAorCQkgIFhNRElPX1JFQUQocGRhdGEsIE1ESU9fTU1EX0FOLCBNRElPX1NUQVQxKSk7CisJZGV2X2FsZXJ0KGRldiwgIkF1dG8tTmVnIEFkIFJlZyAxICglIzA0eCkgPSAlIzA0eFxuIiwKKwkJICBNRElPX0FOX0FEVkVSVElTRSwKKwkJICBYTURJT19SRUFEKHBkYXRhLCBNRElPX01NRF9BTiwgTURJT19BTl9BRFZFUlRJU0UpKTsKKwlkZXZfYWxlcnQoZGV2LCAiQXV0by1OZWcgQWQgUmVnIDIgKCUjMDR4KSA9ICUjMDR4XG4iLAorCQkgIE1ESU9fQU5fQURWRVJUSVNFICsgMSwKKwkJICBYTURJT19SRUFEKHBkYXRhLCBNRElPX01NRF9BTiwgTURJT19BTl9BRFZFUlRJU0UgKyAxKSk7CisJZGV2X2FsZXJ0KGRldiwgIkF1dG8tTmVnIEFkIFJlZyAzICglIzA0eCkgPSAlIzA0eFxuIiwKKwkJICBNRElPX0FOX0FEVkVSVElTRSArIDIsCisJCSAgWE1ESU9fUkVBRChwZGF0YSwgTURJT19NTURfQU4sIE1ESU9fQU5fQURWRVJUSVNFICsgMikpOworCWRldl9hbGVydChkZXYsICJBdXRvLU5lZyBDb21wbGV0aW9uIFJlZyAoJSMwNHgpID0gJSMwNHhcbiIsCisJCSAgTURJT19BTl9DT01QX1NUQVQsCisJCSAgWE1ESU9fUkVBRChwZGF0YSwgTURJT19NTURfQU4sIE1ESU9fQU5fQ09NUF9TVEFUKSk7CisKKwlkZXZfYWxlcnQoZGV2LCAiTU1EIERldmljZSBNYXNrID0gJSN4XG4iLAorCQkgIHBoeWRldi0+YzQ1X2lkcy5kZXZpY2VzX2luX3BhY2thZ2UpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBoeWRldi0+YzQ1X2lkcy5kZXZpY2VfaWRzKTsgaSsrKQorCQlkZXZfYWxlcnQoZGV2LCAiICBNTUQgJWQ6IElEID0gJSMwOHhcbiIsIGksCisJCQkgIHBoeWRldi0+YzQ1X2lkcy5kZXZpY2VfaWRzW2ldKTsKKworCWRldl9hbGVydChkZXYsICJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworfQorCitpbnQgeGdiZV9tZGlvX3JlZ2lzdGVyKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGRhdGEtPm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2RlOworCXN0cnVjdCBtaWlfYnVzICptaWk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwlpbnQgcmV0ID0gMDsKKworCURCR1BSKCItLT54Z2JlX21kaW9fcmVnaXN0ZXJcbiIpOworCisJLyogUmV0cmlldmUgdGhlIHBoeS1oYW5kbGUgKi8KKwlwaHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRhdGEtPmRldi0+b2Zfbm9kZSwgInBoeS1oYW5kbGUiLCAwKTsKKwlpZiAoIXBoeV9ub2RlKSB7CisJCWRldl9lcnIocGRhdGEtPmRldiwgInVuYWJsZSB0byBwYXJzZSBwaHktaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVnaXN0ZXIgd2l0aCB0aGUgTURJTyBidXMgKi8KKwltaWkgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKG1paSA9PSBOVUxMKSB7CisJCWRldl9lcnIocGRhdGEtPmRldiwgIm1kaW9idXNfYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbm9kZV9nZXQ7CisJfQorCisJLyogUmVnaXN0ZXIgb24gdGhlIE1ESU8gYnVzIChkb24ndCBwcm9iZSBhbnkgUEhZcykgKi8KKwltaWktPm5hbWUgPSBYR0JFX1BIWV9OQU1FOworCW1paS0+cmVhZCA9IHhnYmVfbWRpb19yZWFkOworCW1paS0+d3JpdGUgPSB4Z2JlX21kaW9fd3JpdGU7CisJc25wcmludGYobWlpLT5pZCwgc2l6ZW9mKG1paS0+aWQpLCAiJXMiLCBwZGF0YS0+bWlpX2J1c19pZCk7CisJbWlpLT5wcml2ID0gcGRhdGE7CisJbWlpLT5waHlfbWFzayA9IH4wOworCW1paS0+cGFyZW50ID0gcGRhdGEtPmRldjsKKwlyZXQgPSBtZGlvYnVzX3JlZ2lzdGVyKG1paSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBkYXRhLT5kZXYsICJtZGlvYnVzX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX21kaW9idXNfYWxsb2M7CisJfQorCURCR1BSKCIgIG1kaW9idXNfcmVnaXN0ZXIgc3VjY2VlZGVkIGZvciAlc1xuIiwgcGRhdGEtPm1paV9idXNfaWQpOworCisJLyogUHJvYmUgdGhlIFBDUyB1c2luZyBDbGF1c2UgNDUgKi8KKwlwaHlkZXYgPSBnZXRfcGh5X2RldmljZShtaWksIFhHQkVfUFJUQUQsIHRydWUpOworCWlmIChJU19FUlIocGh5ZGV2KSB8fCAhcGh5ZGV2IHx8CisJICAgICFwaHlkZXYtPmM0NV9pZHMuZGV2aWNlX2lkc1tNRElPX01NRF9QQ1NdKSB7CisJCWRldl9lcnIocGRhdGEtPmRldiwgImdldF9waHlfZGV2aWNlIGZhaWxlZFxuIik7CisJCXJldCA9IHBoeWRldiA/IFBUUl9FUlIocGh5ZGV2KSA6IC1FTk9MSU5LOworCQlnb3RvIGVycl9tZGlvYnVzX3JlZ2lzdGVyOworCX0KKwlyZXF1ZXN0X21vZHVsZShNRElPX01PRFVMRV9QUkVGSVggTURJT19JRF9GTVQsCisJCSAgICAgICBNRElPX0lEX0FSR1MocGh5ZGV2LT5jNDVfaWRzLmRldmljZV9pZHNbTURJT19NTURfUENTXSkpOworCisJb2Zfbm9kZV9nZXQocGh5X25vZGUpOworCXBoeWRldi0+ZGV2Lm9mX25vZGUgPSBwaHlfbm9kZTsKKwlyZXQgPSBwaHlfZGV2aWNlX3JlZ2lzdGVyKHBoeWRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBkYXRhLT5kZXYsICJwaHlfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKKwkJZ290byBlcnJfcGh5X2RldmljZTsKKwl9CisKKwkvKiBBZGQgYSByZWZlcmVuY2UgdG8gdGhlIFBIWSBkcml2ZXIgc28gaXQgY2FuJ3QgYmUgdW5sb2FkZWQgKi8KKwlwZGF0YS0+cGh5X21vZHVsZSA9IHBoeWRldi0+ZGV2LmRyaXZlciA/CisJCQkgICAgcGh5ZGV2LT5kZXYuZHJpdmVyLT5vd25lciA6IE5VTEw7CisJaWYgKCF0cnlfbW9kdWxlX2dldChwZGF0YS0+cGh5X21vZHVsZSkpIHsKKwkJZGV2X2VycihwZGF0YS0+ZGV2LCAidHJ5X21vZHVsZV9nZXQgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcGh5X2RldmljZTsKKwl9CisKKwlwZGF0YS0+bWlpID0gbWlpOworCXBkYXRhLT5tZGlvX21tZCA9IE1ESU9fTU1EX1BDUzsKKworCXBkYXRhLT5waHlfbGluayA9IC0xOworCXBkYXRhLT5waHlfc3BlZWQgPSBTUEVFRF9VTktOT1dOOworCXBkYXRhLT5waHlfdHhfcGF1c2UgPSBwZGF0YS0+dHhfcGF1c2U7CisJcGRhdGEtPnBoeV9yeF9wYXVzZSA9IHBkYXRhLT5yeF9wYXVzZTsKKworCXJldCA9IHBoeV9jb25uZWN0X2RpcmVjdChuZXRkZXYsIHBoeWRldiwgJnhnYmVfYWRqdXN0X2xpbmssCisJCQkJIHBkYXRhLT5waHlfbW9kZSk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKG5ldGRldiwgInBoeV9jb25uZWN0X2RpcmVjdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9waHlfZGV2aWNlOworCX0KKworCWlmICghcGh5ZGV2LT5kcnYgfHwgKHBoeWRldi0+ZHJ2LT5waHlfaWQgPT0gMCkpIHsKKwkJbmV0ZGV2X2VycihuZXRkZXYsICJwaHlfaWQgbm90IHZhbGlkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcGh5X2Nvbm5lY3Q7CisJfQorCURCR1BSKCIgIHBoeV9jb25uZWN0X2RpcmVjdCBzdWNjZWVkZWQgZm9yIFBIWSAlcywgbGluaz0lZFxuIiwKKwkgICAgICBkZXZfbmFtZSgmcGh5ZGV2LT5kZXYpLCBwaHlkZXYtPmxpbmspOworCisJcGh5ZGV2LT5hdXRvbmVnID0gcGRhdGEtPmRlZmF1bHRfYXV0b25lZzsKKwlpZiAocGh5ZGV2LT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgeworCQkvKiBBZGQgc2V0dGluZ3MgbmVlZGVkIHRvIGZvcmNlIHNwZWVkICovCisJCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKworCQlwaHlkZXYtPnNwZWVkID0gcGRhdGEtPmRlZmF1bHRfc3BlZWQ7CisJCXBoeWRldi0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwkJcGh5ZGV2LT5hZHZlcnRpc2luZyAmPSB+QURWRVJUSVNFRF9BdXRvbmVnOworCX0KKworCXBkYXRhLT5waHlkZXYgPSBwaHlkZXY7CisKKwlvZl9ub2RlX3B1dChwaHlfbm9kZSk7CisKKwlEQkdQSFlfUkVHUyhwZGF0YSk7CisKKwlEQkdQUigiPC0teGdiZV9tZGlvX3JlZ2lzdGVyXG4iKTsKKworCXJldHVybiAwOworCitlcnJfcGh5X2Nvbm5lY3Q6CisJcGh5X2Rpc2Nvbm5lY3QocGh5ZGV2KTsKKworZXJyX3BoeV9kZXZpY2U6CisJcGh5X2RldmljZV9mcmVlKHBoeWRldik7CisKK2Vycl9tZGlvYnVzX3JlZ2lzdGVyOgorCW1kaW9idXNfdW5yZWdpc3RlcihtaWkpOworCitlcnJfbWRpb2J1c19hbGxvYzoKKwltZGlvYnVzX2ZyZWUobWlpKTsKKworZXJyX25vZGVfZ2V0OgorCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgeGdiZV9tZGlvX3VucmVnaXN0ZXIoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCURCR1BSKCItLT54Z2JlX21kaW9fdW5yZWdpc3RlclxuIik7CisKKwlwaHlfZGlzY29ubmVjdChwZGF0YS0+cGh5ZGV2KTsKKwlwZGF0YS0+cGh5ZGV2ID0gTlVMTDsKKworCW1vZHVsZV9wdXQocGRhdGEtPnBoeV9tb2R1bGUpOworCXBkYXRhLT5waHlfbW9kdWxlID0gTlVMTDsKKworCW1kaW9idXNfdW5yZWdpc3RlcihwZGF0YS0+bWlpKTsKKwlwZGF0YS0+bWlpLT5wcml2ID0gTlVMTDsKKworCW1kaW9idXNfZnJlZShwZGF0YS0+bWlpKTsKKwlwZGF0YS0+bWlpID0gTlVMTDsKKworCURCR1BSKCI8LS14Z2JlX21kaW9fdW5yZWdpc3RlclxuIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwNjI3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaApAQCAtMCwwICsxLDY3NiBAQAorLyoKKyAqIEFNRCAxMEdiIEV0aGVybmV0IGRyaXZlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisgKiBsaWNlbnNlczoKKyAqCisgKiBMaWNlbnNlIDE6IEdQTHYyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSBjb3B5LCByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqICAgICBUaGUgU3lub3BzeXMgRFdDIEVUSEVSIFhHTUFDIFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbgorICogICAgIChoZXJlaW5hZnRlciAiU29mdHdhcmUiKSBpcyBhbiB1bnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLAorICogICAgIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cworICogICAgIGFuZCB5b3UuCisgKgorICogICAgIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiAgICAgdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQKKyAqICAgICBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5CisgKiAgICAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICAgYW5ub3RhdGVkIHdpdGggdGhpcyBsaWNlbnNlIGFuZCB0aGUgU29mdHdhcmUsIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCisgKiAgICAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqICAgICBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAqICAgICB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiAgICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqICAgICBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogICAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTCisgKiAgICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqICAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIExpY2Vuc2UgMjogTW9kaWZpZWQgQlNECisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorICogICAgIFRoZSBTeW5vcHN5cyBEV0MgRVRIRVIgWEdNQUMgU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uCisgKiAgICAgKGhlcmVpbmFmdGVyICJTb2Z0d2FyZSIpIGlzIGFuIHVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsCisgKiAgICAgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzCisgKiAgICAgYW5kIHlvdS4KKyAqCisgKiAgICAgVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqICAgICB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZAorICogICAgIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkKKyAqICAgICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUKKyAqICAgICBhbm5vdGF0ZWQgd2l0aCB0aGlzIGxpY2Vuc2UgYW5kIHRoZSBTb2Z0d2FyZSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUKKyAqICAgICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogICAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAorICogICAgIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqICAgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogICAgIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMKKyAqICAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fWEdCRV9IX18KKyNkZWZpbmUgX19YR0JFX0hfXworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworCisjZGVmaW5lIFhHQkVfRFJWX05BTUUJCSJhbWQteGdiZSIKKyNkZWZpbmUgWEdCRV9EUlZfVkVSU0lPTgkiMS4wLjAtYSIKKyNkZWZpbmUgWEdCRV9EUlZfREVTQwkJIkFNRCAxMCBHaWdhYml0IEV0aGVybmV0IERyaXZlciIKKworLyogRGVzY3JpcHRvciByZWxhdGVkIGRlZmluZXMgKi8KKyNkZWZpbmUgVFhfREVTQ19DTlQJCTUxMgorI2RlZmluZSBUWF9ERVNDX01JTl9GUkVFCShUWF9ERVNDX0NOVCA+PiAzKQorI2RlZmluZSBUWF9ERVNDX01BWF9QUk9DCShUWF9ERVNDX0NOVCA+PiAxKQorI2RlZmluZSBSWF9ERVNDX0NOVAkJNTEyCisKKyNkZWZpbmUgVFhfTUFYX0JVRl9TSVpFCQkoMHgzZmZmICYgfig2NCAtIDEpKQorCisjZGVmaW5lIFJYX01JTl9CVUZfU0laRQkJKEVUSF9GUkFNRV9MRU4gKyBFVEhfRkNTX0xFTiArIFZMQU5fSExFTikKKyNkZWZpbmUgUlhfQlVGX0FMSUdOCQk2NAorCisjZGVmaW5lIFhHQkVfTUFYX0RNQV9DSEFOTkVMUwkxNgorI2RlZmluZSBETUFfQVJET01BSU5fU0VUVElORwkweDIKKyNkZWZpbmUgRE1BX0FSQ0FDSEVfU0VUVElORwkweGIKKyNkZWZpbmUgRE1BX0FXRE9NQUlOX1NFVFRJTkcJMHgyCisjZGVmaW5lIERNQV9BV0NBQ0hFX1NFVFRJTkcJMHg3CisjZGVmaW5lIERNQV9JTlRFUlJVUFRfTUFTSwkweDMxYzcKKworI2RlZmluZSBYR01BQ19NSU5fUEFDS0VUCTYwCisjZGVmaW5lIFhHTUFDX1NURF9QQUNLRVRfTVRVCTE1MDAKKyNkZWZpbmUgWEdNQUNfTUFYX1NURF9QQUNLRVQJMTUxOAorI2RlZmluZSBYR01BQ19KVU1CT19QQUNLRVRfTVRVCTkwMDAKKyNkZWZpbmUgWEdNQUNfTUFYX0pVTUJPX1BBQ0tFVAk5MDE4CisKKyNkZWZpbmUgTUFYX01VTFRJQ0FTVF9MSVNUCTE0CisjZGVmaW5lIFRYX0ZMQUdTX0lQX1BLVAkJMHgwMDAwMDAwMQorI2RlZmluZSBUWF9GTEFHU19UQ1BfUEtUCTB4MDAwMDAwMDIKKworLyogTURJTyBidXMgcGh5IG5hbWUgKi8KKyNkZWZpbmUgWEdCRV9QSFlfTkFNRQkJImFtZF94Z2JlX3BoeSIKKyNkZWZpbmUgWEdCRV9QUlRBRAkJMAorCisvKiBEcml2ZXIgUE1UIG1hY3JvcyAqLworI2RlZmluZSBYR01BQ19EUklWRVJfQ09OVEVYVAkxCisjZGVmaW5lIFhHTUFDX0lPQ1RMX0NPTlRFWFQJMgorCisjZGVmaW5lIEZJRk9fU0laRV9CKHgpCQkoeCkKKyNkZWZpbmUgRklGT19TSVpFX0tCKHgpCQkoeCAqIDEwMjQpCisKKyNkZWZpbmUgWEdCRV9UQ19DTlQJCTIKKworLyogSGVscGVyIG1hY3JvIGZvciBkZXNjcmlwdG9yIGhhbmRsaW5nCisgKiAgQWx3YXlzIHVzZSBHRVRfREVTQ19EQVRBIHRvIGFjY2VzcyB0aGUgZGVzY3JpcHRvciBkYXRhCisgKiAgc2luY2UgdGhlIGluZGV4IGlzIGZyZWUtcnVubmluZyBhbmQgbmVlZHMgdG8gYmUgYW5kLWVkCisgKiAgd2l0aCB0aGUgZGVzY3JpcHRvciBjb3VudCB2YWx1ZSBvZiB0aGUgcmluZyB0byBpbmRleCB0bworICogIHRoZSBwcm9wZXIgZGVzY3JpcHRvciBkYXRhLgorICovCisjZGVmaW5lIEdFVF9ERVNDX0RBVEEoX3JpbmcsIF9pZHgpCQkJCVwKKwkoKF9yaW5nKS0+cmRhdGEgKwkJCQkJXAorCSAoKF9pZHgpICYgKChfcmluZyktPnJkZXNjX2NvdW50IC0gMSkpKQorCisKKy8qIERlZmF1bHQgY29hbGVzY2luZyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFhHTUFDX0lOSVRfRE1BX1RYX1VTRUNTCQkxMDAKKyNkZWZpbmUgWEdNQUNfSU5JVF9ETUFfVFhfRlJBTUVTCTE2CisKKyNkZWZpbmUgWEdNQUNfTUFYX0RNQV9SSVdUCQkweGZmCisjZGVmaW5lIFhHTUFDX0lOSVRfRE1BX1JYX1VTRUNTCQkxMDAKKyNkZWZpbmUgWEdNQUNfSU5JVF9ETUFfUlhfRlJBTUVTCTE2CisKKy8qIEZsb3cgY29udHJvbCBxdWV1ZSBjb3VudCAqLworI2RlZmluZSBYR01BQ19NQVhfRkxPV19DT05UUk9MX1FVRVVFUwk4CisKKworc3RydWN0IHhnYmVfcHJ2X2RhdGE7CisKK3N0cnVjdCB4Z2JlX3BhY2tldF9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgYXR0cmlidXRlczsKKworCXVuc2lnbmVkIGludCBlcnJvcnM7CisKKwl1bnNpZ25lZCBpbnQgcmRlc2NfY291bnQ7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuOworCXVuc2lnbmVkIGludCB0Y3BfaGVhZGVyX2xlbjsKKwl1bnNpZ25lZCBpbnQgdGNwX3BheWxvYWRfbGVuOworCXVuc2lnbmVkIHNob3J0IG1zczsKKworCXVuc2lnbmVkIHNob3J0IHZsYW5fY3RhZzsKK307CisKKy8qIENvbW1vbiBSeCBhbmQgVHggZGVzY3JpcHRvciBtYXBwaW5nICovCitzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgeworCXVuc2lnbmVkIGludCBkZXNjMDsKKwl1bnNpZ25lZCBpbnQgZGVzYzE7CisJdW5zaWduZWQgaW50IGRlc2MyOworCXVuc2lnbmVkIGludCBkZXNjMzsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZGVzY3JpcHRvcgorICogYW5kIHRoZSBwYWNrZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXNjcmlwdG9yIChhbHdheXMgdXNlCisgKiB1c2UgdGhlIEdFVF9ERVNDX0RBVEEgbWFjcm8gdG8gYWNjZXNzIHRoaXMgZGF0YSBmcm9tIHRoZSByaW5nKQorICovCitzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgeworCXN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqcmRlc2M7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBkZXNjcmlwdG9yICovCisJZG1hX2FkZHJfdCByZGVzY19kbWE7CQkvKiBETUEgYWRkcmVzcyBvZiBkZXNjcmlwdG9yICovCisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkJLyogVmlydHVhbCBhZGRyZXNzIG9mIFNLQiAqLworCWRtYV9hZGRyX3Qgc2tiX2RtYTsJCS8qIERNQSBhZGRyZXNzIG9mIFNLQiBkYXRhICovCisJdW5zaWduZWQgaW50IHNrYl9kbWFfbGVuOwkvKiBMZW5ndGggb2YgU0tCIERNQSBhcmVhICovCisJdW5zaWduZWQgaW50IHRzb19oZWFkZXI7ICAgICAgICAvKiBUU08gaGVhZGVyIGluZGljYXRvciAqLworCisJdW5zaWduZWQgc2hvcnQgbGVuOwkJLyogTGVuZ3RoIG9mIHJlY2VpdmVkIFJ4IHBhY2tldCAqLworCisJdW5zaWduZWQgaW50IGludGVycnVwdDsJCS8qIEludGVycnVwdCBpbmRpY2F0b3IgKi8KKworCXVuc2lnbmVkIGludCBtYXBwZWRfYXNfcGFnZTsKK307CisKK3N0cnVjdCB4Z2JlX3JpbmcgeworCS8qIFJpbmcgbG9jayAtIHVzZWQganVzdCBmb3IgVFggcmluZ3MgYXQgdGhlIG1vbWVudCAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIFBlciBwYWNrZXQgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB4Z2JlX3BhY2tldF9kYXRhIHBhY2tldF9kYXRhOworCisJLyogVmlydHVhbC9ETUEgYWRkcmVzc2VzIGFuZCBjb3VudCBvZiBhbGxvY2F0ZWQgZGVzY3JpcHRvciBtZW1vcnkgKi8KKwlzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKnJkZXNjOworCWRtYV9hZGRyX3QgcmRlc2NfZG1hOworCXVuc2lnbmVkIGludCByZGVzY19jb3VudDsKKworCS8qIEFycmF5IG9mIGRlc2NyaXB0b3IgZGF0YSBjb3JyZXNwb25kaW5nIHRoZSBkZXNjcmlwdG9yIG1lbW9yeQorCSAqIChhbHdheXMgdXNlIHRoZSBHRVRfREVTQ19EQVRBIG1hY3JvIHRvIGFjY2VzcyB0aGlzIGRhdGEpCisJICovCisJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKKworCS8qIFJpbmcgaW5kZXggdmFsdWVzCisJICogIGN1ciAgIC0gVHg6IGluZGV4IG9mIGRlc2NyaXB0b3IgdG8gYmUgdXNlZCBmb3IgY3VycmVudCB0cmFuc2ZlcgorCSAqICAgICAgICAgIFJ4OiBpbmRleCBvZiBkZXNjcmlwdG9yIHRvIGNoZWNrIGZvciBwYWNrZXQgYXZhaWxhYmlsaXR5CisJICogIGRpcnR5IC0gVHg6IGluZGV4IG9mIGRlc2NyaXB0b3IgdG8gY2hlY2sgZm9yIHRyYW5zZmVyIGNvbXBsZXRlCisJICogICAgICAgICAgUng6IGNvdW50IG9mIGRlc2NyaXB0b3JzIGluIHdoaWNoIGEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisJICogICAgICAgICAgICAgICh1c2VkIHdpdGggc2tiX3JlYWxsb2NfaW5kZXggdG8gcmVmcmVzaCB0aGUgcmluZykKKwkgKi8KKwl1bnNpZ25lZCBpbnQgY3VyOworCXVuc2lnbmVkIGludCBkaXJ0eTsKKworCS8qIENvYWxlc2NlIGZyYW1lIGNvdW50IHVzZWQgZm9yIGludGVycnVwdCBiaXQgc2V0dGluZyAqLworCXVuc2lnbmVkIGludCBjb2FsZXNjZV9jb3VudDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCBxdWV1ZV9zdG9wcGVkOworCQkJdW5zaWduZWQgc2hvcnQgY3VyX21zczsKKwkJCXVuc2lnbmVkIHNob3J0IGN1cl92bGFuX2N0YWc7CisJCX0gdHg7CisKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCByZWFsbG9jX2luZGV4OworCQkJdW5zaWduZWQgaW50IHJlYWxsb2NfdGhyZXNob2xkOworCQl9IHJ4OworCX07Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRlc2NyaXB0b3IgcmluZ3MgYXNzb2NpYXRlZCB3aXRoCisgKiBhIERNQSBjaGFubmVsLgorICovCitzdHJ1Y3QgeGdiZV9jaGFubmVsIHsKKwljaGFyIG5hbWVbMTZdOworCisJLyogQWRkcmVzcyBvZiBwcml2YXRlIGRhdGEgYXJlYSBmb3IgZGV2aWNlICovCisJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhOworCisJLyogUXVldWUgaW5kZXggYW5kIGJhc2UgYWRkcmVzcyBvZiBxdWV1ZSdzIERNQSByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgcXVldWVfaW5kZXg7CisJdm9pZCBfX2lvbWVtICpkbWFfcmVnczsKKworCXVuc2lnbmVkIGludCBzYXZlZF9pZXI7CisKKwl1bnNpZ25lZCBpbnQgdHhfdGltZXJfYWN0aXZlOworCXN0cnVjdCBocnRpbWVyIHR4X3RpbWVyOworCisJc3RydWN0IHhnYmVfcmluZyAqdHhfcmluZzsKKwlzdHJ1Y3QgeGdiZV9yaW5nICpyeF9yaW5nOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK2VudW0geGdiZV9pbnQgeworCVhHTUFDX0lOVF9ETUFfSVNSX0RDMElTLAorCVhHTUFDX0lOVF9ETUFfQ0hfU1JfVEksCisJWEdNQUNfSU5UX0RNQV9DSF9TUl9UUFMsCisJWEdNQUNfSU5UX0RNQV9DSF9TUl9UQlUsCisJWEdNQUNfSU5UX0RNQV9DSF9TUl9SSSwKKwlYR01BQ19JTlRfRE1BX0NIX1NSX1JCVSwKKwlYR01BQ19JTlRfRE1BX0NIX1NSX1JQUywKKwlYR01BQ19JTlRfRE1BX0NIX1NSX0ZCRSwKKwlYR01BQ19JTlRfRE1BX0FMTCwKK307CisKK2VudW0geGdiZV9pbnRfc3RhdGUgeworCVhHTUFDX0lOVF9TVEFURV9TQVZFLAorCVhHTUFDX0lOVF9TVEFURV9SRVNUT1JFLAorfTsKKworZW51bSB4Z2JlX210bF9maWZvX3NpemUgeworCVhHTUFDX01UTF9GSUZPX1NJWkVfMjU2ICA9IDB4MDAsCisJWEdNQUNfTVRMX0ZJRk9fU0laRV81MTIgID0gMHgwMSwKKwlYR01BQ19NVExfRklGT19TSVpFXzFLICAgPSAweDAzLAorCVhHTUFDX01UTF9GSUZPX1NJWkVfMksgICA9IDB4MDcsCisJWEdNQUNfTVRMX0ZJRk9fU0laRV80SyAgID0gMHgwZiwKKwlYR01BQ19NVExfRklGT19TSVpFXzhLICAgPSAweDFmLAorCVhHTUFDX01UTF9GSUZPX1NJWkVfMTZLICA9IDB4M2YsCisJWEdNQUNfTVRMX0ZJRk9fU0laRV8zMksgID0gMHg3ZiwKKwlYR01BQ19NVExfRklGT19TSVpFXzY0SyAgPSAweGZmLAorCVhHTUFDX01UTF9GSUZPX1NJWkVfMTI4SyA9IDB4MWZmLAorCVhHTUFDX01UTF9GSUZPX1NJWkVfMjU2SyA9IDB4M2ZmLAorfTsKKworc3RydWN0IHhnYmVfbW1jX3N0YXRzIHsKKwkvKiBUeCBTdGF0cyAqLworCXU2NCB0eG9jdGV0Y291bnRfZ2I7CisJdTY0IHR4ZnJhbWVjb3VudF9nYjsKKwl1NjQgdHhicm9hZGNhc3RmcmFtZXNfZzsKKwl1NjQgdHhtdWx0aWNhc3RmcmFtZXNfZzsKKwl1NjQgdHg2NG9jdGV0c19nYjsKKwl1NjQgdHg2NXRvMTI3b2N0ZXRzX2diOworCXU2NCB0eDEyOHRvMjU1b2N0ZXRzX2diOworCXU2NCB0eDI1NnRvNTExb2N0ZXRzX2diOworCXU2NCB0eDUxMnRvMTAyM29jdGV0c19nYjsKKwl1NjQgdHgxMDI0dG9tYXhvY3RldHNfZ2I7CisJdTY0IHR4dW5pY2FzdGZyYW1lc19nYjsKKwl1NjQgdHhtdWx0aWNhc3RmcmFtZXNfZ2I7CisJdTY0IHR4YnJvYWRjYXN0ZnJhbWVzX2diOworCXU2NCB0eHVuZGVyZmxvd2Vycm9yOworCXU2NCB0eG9jdGV0Y291bnRfZzsKKwl1NjQgdHhmcmFtZWNvdW50X2c7CisJdTY0IHR4cGF1c2VmcmFtZXM7CisJdTY0IHR4dmxhbmZyYW1lc19nOworCisJLyogUnggU3RhdHMgKi8KKwl1NjQgcnhmcmFtZWNvdW50X2diOworCXU2NCByeG9jdGV0Y291bnRfZ2I7CisJdTY0IHJ4b2N0ZXRjb3VudF9nOworCXU2NCByeGJyb2FkY2FzdGZyYW1lc19nOworCXU2NCByeG11bHRpY2FzdGZyYW1lc19nOworCXU2NCByeGNyY2Vycm9yOworCXU2NCByeHJ1bnRlcnJvcjsKKwl1NjQgcnhqYWJiZXJlcnJvcjsKKwl1NjQgcnh1bmRlcnNpemVfZzsKKwl1NjQgcnhvdmVyc2l6ZV9nOworCXU2NCByeDY0b2N0ZXRzX2diOworCXU2NCByeDY1dG8xMjdvY3RldHNfZ2I7CisJdTY0IHJ4MTI4dG8yNTVvY3RldHNfZ2I7CisJdTY0IHJ4MjU2dG81MTFvY3RldHNfZ2I7CisJdTY0IHJ4NTEydG8xMDIzb2N0ZXRzX2diOworCXU2NCByeDEwMjR0b21heG9jdGV0c19nYjsKKwl1NjQgcnh1bmljYXN0ZnJhbWVzX2c7CisJdTY0IHJ4bGVuZ3RoZXJyb3I7CisJdTY0IHJ4b3V0b2ZyYW5nZXR5cGU7CisJdTY0IHJ4cGF1c2VmcmFtZXM7CisJdTY0IHJ4Zmlmb292ZXJmbG93OworCXU2NCByeHZsYW5mcmFtZXNfZ2I7CisJdTY0IHJ4d2F0Y2hkb2dlcnJvcjsKK307CisKK3N0cnVjdCB4Z2JlX2h3X2lmIHsKKwlpbnQgKCp0eF9jb21wbGV0ZSkoc3RydWN0IHhnYmVfcmluZ19kZXNjICopOworCisJaW50ICgqc2V0X3Byb21pc2N1b3VzX21vZGUpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqc2V0X2FsbF9tdWx0aWNhc3RfbW9kZSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKiwgdW5zaWduZWQgaW50KTsKKwlpbnQgKCpzZXRfYWRkbl9tYWNfYWRkcnMpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqc2V0X21hY19hZGRyZXNzKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCB1OCAqYWRkcik7CisKKwlpbnQgKCplbmFibGVfcnhfY3N1bSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqZGlzYWJsZV9yeF9jc3VtKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKworCWludCAoKmVuYWJsZV9yeF92bGFuX3N0cmlwcGluZykoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqZGlzYWJsZV9yeF92bGFuX3N0cmlwcGluZykoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisKKwlpbnQgKCpyZWFkX21tZF9yZWdzKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCBpbnQsIGludCk7CisJdm9pZCAoKndyaXRlX21tZF9yZWdzKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCBpbnQsIGludCwgaW50KTsKKwlpbnQgKCpzZXRfZ21paV9zcGVlZCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqc2V0X2dtaWlfMjUwMF9zcGVlZCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqc2V0X3hnbWlpX3NwZWVkKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKworCXZvaWQgKCplbmFibGVfdHgpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCXZvaWQgKCpkaXNhYmxlX3R4KShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKwl2b2lkICgqZW5hYmxlX3J4KShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKwl2b2lkICgqZGlzYWJsZV9yeCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisKKwl2b2lkICgqcG93ZXJ1cF90eCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJdm9pZCAoKnBvd2VyZG93bl90eCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJdm9pZCAoKnBvd2VydXBfcngpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCXZvaWQgKCpwb3dlcmRvd25fcngpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCisJaW50ICgqaW5pdCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqZXhpdCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisKKwlpbnQgKCplbmFibGVfaW50KShzdHJ1Y3QgeGdiZV9jaGFubmVsICosIGVudW0geGdiZV9pbnQpOworCWludCAoKmRpc2FibGVfaW50KShzdHJ1Y3QgeGdiZV9jaGFubmVsICosIGVudW0geGdiZV9pbnQpOworCXZvaWQgKCpwcmVfeG1pdCkoc3RydWN0IHhnYmVfY2hhbm5lbCAqKTsKKwlpbnQgKCpkZXZfcmVhZCkoc3RydWN0IHhnYmVfY2hhbm5lbCAqKTsKKwl2b2lkICgqdHhfZGVzY19pbml0KShzdHJ1Y3QgeGdiZV9jaGFubmVsICopOworCXZvaWQgKCpyeF9kZXNjX2luaXQpKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKik7CisJdm9pZCAoKnJ4X2Rlc2NfcmVzZXQpKHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqKTsKKwl2b2lkICgqdHhfZGVzY19yZXNldCkoc3RydWN0IHhnYmVfcmluZ19kYXRhICopOworCWludCAoKmlzX2xhc3RfZGVzYykoc3RydWN0IHhnYmVfcmluZ19kZXNjICopOworCWludCAoKmlzX2NvbnRleHRfZGVzYykoc3RydWN0IHhnYmVfcmluZ19kZXNjICopOworCisJLyogRm9yIEZMT1cgY3RybCAqLworCWludCAoKmNvbmZpZ190eF9mbG93X2NvbnRyb2wpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCWludCAoKmNvbmZpZ19yeF9mbG93X2NvbnRyb2wpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCisJLyogRm9yIFJYIGNvYWxlc2NpbmcgKi8KKwlpbnQgKCpjb25maWdfcnhfY29hbGVzY2UpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCWludCAoKmNvbmZpZ190eF9jb2FsZXNjZSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJdW5zaWduZWQgaW50ICgqdXNlY190b19yaXd0KShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCB1bnNpZ25lZCBpbnQpOworCXVuc2lnbmVkIGludCAoKnJpd3RfdG9fdXNlYykoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKiwgdW5zaWduZWQgaW50KTsKKworCS8qIEZvciBSWCBhbmQgVFggdGhyZXNob2xkIGNvbmZpZyAqLworCWludCAoKmNvbmZpZ19yeF90aHJlc2hvbGQpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqY29uZmlnX3R4X3RocmVzaG9sZCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKiwgdW5zaWduZWQgaW50KTsKKworCS8qIEZvciBSWCBhbmQgVFggU3RvcmUgYW5kIEZvcndhcmQgTW9kZSBjb25maWcgKi8KKwlpbnQgKCpjb25maWdfcnNmX21vZGUpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqY29uZmlnX3RzZl9tb2RlKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCB1bnNpZ25lZCBpbnQpOworCisJLyogRm9yIFRYIERNQSBPcGVyYXRlIG9uIFNlY29uZCBGcmFtZSBjb25maWcgKi8KKwlpbnQgKCpjb25maWdfb3NwX21vZGUpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCisJLyogRm9yIFJYIGFuZCBUWCBQQkwgY29uZmlnICovCisJaW50ICgqY29uZmlnX3J4X3BibF92YWwpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCWludCAoKmdldF9yeF9wYmxfdmFsKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKwlpbnQgKCpjb25maWdfdHhfcGJsX3ZhbCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJaW50ICgqZ2V0X3R4X3BibF92YWwpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCWludCAoKmNvbmZpZ19wYmx4OCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisKKwkvKiBGb3IgTU1DIHN0YXRpc3RpY3MgKi8KKwl2b2lkICgqcnhfbW1jX2ludCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJdm9pZCAoKnR4X21tY19pbnQpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCXZvaWQgKCpyZWFkX21tY19zdGF0cykoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7Cit9OworCitzdHJ1Y3QgeGdiZV9kZXNjX2lmIHsKKwlpbnQgKCphbGxvY19yaW5nX3Jlc291cmNlcykoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisJdm9pZCAoKmZyZWVfcmluZ19yZXNvdXJjZXMpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCWludCAoKm1hcF90eF9za2IpKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisJdm9pZCAoKnJlYWxsb2Nfc2tiKShzdHJ1Y3QgeGdiZV9jaGFubmVsICopOworCXZvaWQgKCp1bm1hcF9za2IpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqKTsKKwl2b2lkICgqd3JhcHBlcl90eF9kZXNjX2luaXQpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOworCXZvaWQgKCp3cmFwcGVyX3J4X2Rlc2NfaW5pdCkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBmbGFncyB0aGF0IGluZGljYXRlIHdoYXQgaGFyZHdhcmUgZmVhdHVyZXMKKyAqIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmVzZW50IGluIHRoZSBkZXZpY2UuCisgKi8KK3N0cnVjdCB4Z2JlX2h3X2ZlYXR1cmVzIHsKKwkvKiBIVyBGZWF0dXJlIFJlZ2lzdGVyMCAqLworCXVuc2lnbmVkIGludCBnbWlpOwkJLyogMTAwMCBNYnBzIHN1cHBvcnQgKi8KKwl1bnNpZ25lZCBpbnQgdmxoYXNoOwkJLyogVkxBTiBIYXNoIEZpbHRlciAqLworCXVuc2lnbmVkIGludCBzbWE7CQkvKiBTTUEoTURJTykgSW50ZXJmYWNlICovCisJdW5zaWduZWQgaW50IHJ3azsJCS8qIFBNVCByZW1vdGUgd2FrZS11cCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBpbnQgbWdrOwkJLyogUE1UIG1hZ2ljIHBhY2tldCAqLworCXVuc2lnbmVkIGludCBtbWM7CQkvKiBSTU9OIG1vZHVsZSAqLworCXVuc2lnbmVkIGludCBhb2U7CQkvKiBBUlAgT2ZmbG9hZCAqLworCXVuc2lnbmVkIGludCB0czsJCS8qIElFRUUgMTU4OC0yMDA4IEFkYXZhbmNlZCBUaW1lc3RhbXAgKi8KKwl1bnNpZ25lZCBpbnQgZWVlOwkJLyogRW5lcmd5IEVmZmljaWVudCBFdGhlcm5ldCAqLworCXVuc2lnbmVkIGludCB0eF9jb2U7CQkvKiBUeCBDaGVja3N1bSBPZmZsb2FkICovCisJdW5zaWduZWQgaW50IHJ4X2NvZTsJCS8qIFJ4IENoZWNrc3VtIE9mZmxvYWQgKi8KKwl1bnNpZ25lZCBpbnQgYWRkbl9tYWM7CQkvKiBBZGRpdGlvbmFsIE1BQyBBZGRyZXNzZXMgKi8KKwl1bnNpZ25lZCBpbnQgdHNfc3JjOwkJLyogVGltZXN0YW1wIFNvdXJjZSAqLworCXVuc2lnbmVkIGludCBzYV92bGFuX2luczsJLyogU291cmNlIEFkZHJlc3Mgb3IgVkxBTiBJbnNlcnRpb24gKi8KKworCS8qIEhXIEZlYXR1cmUgUmVnaXN0ZXIxICovCisJdW5zaWduZWQgaW50IHJ4X2ZpZm9fc2l6ZTsJLyogTVRMIFJlY2VpdmUgRklGTyBTaXplICovCisJdW5zaWduZWQgaW50IHR4X2ZpZm9fc2l6ZTsJLyogTVRMIFRyYW5zbWl0IEZJRk8gU2l6ZSAqLworCXVuc2lnbmVkIGludCBhZHZfdHNfaGk7CQkvKiBBZHZhbmNlIFRpbWVzdGFtcGluZyBIaWdoIFdvcmQgKi8KKwl1bnNpZ25lZCBpbnQgZGNiOwkJLyogRENCIEZlYXR1cmUgKi8KKwl1bnNpZ25lZCBpbnQgc3BoOwkJLyogU3BsaXQgSGVhZGVyIEZlYXR1cmUgKi8KKwl1bnNpZ25lZCBpbnQgdHNvOwkJLyogVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkICovCisJdW5zaWduZWQgaW50IGRtYV9kZWJ1ZzsJCS8qIERNQSBEZWJ1ZyBSZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgcnNzOwkJLyogUmVjZWl2ZSBTaWRlIFNjYWxpbmcgKi8KKwl1bnNpZ25lZCBpbnQgaGFzaF90YWJsZV9zaXplOwkvKiBIYXNoIFRhYmxlIFNpemUgKi8KKwl1bnNpZ25lZCBpbnQgbDNsNF9maWx0ZXJfbnVtOwkvKiBOdW1iZXIgb2YgTDMtTDQgRmlsdGVycyAqLworCisJLyogSFcgRmVhdHVyZSBSZWdpc3RlcjIgKi8KKwl1bnNpZ25lZCBpbnQgcnhfcV9jbnQ7CQkvKiBOdW1iZXIgb2YgTVRMIFJlY2VpdmUgUXVldWVzICovCisJdW5zaWduZWQgaW50IHR4X3FfY250OwkJLyogTnVtYmVyIG9mIE1UTCBUcmFuc21pdCBRdWV1ZXMgKi8KKwl1bnNpZ25lZCBpbnQgcnhfY2hfY250OwkJLyogTnVtYmVyIG9mIERNQSBSZWNlaXZlIENoYW5uZWxzICovCisJdW5zaWduZWQgaW50IHR4X2NoX2NudDsJCS8qIE51bWJlciBvZiBETUEgVHJhbnNtaXQgQ2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgcHBzX291dF9udW07CS8qIE51bWJlciBvZiBQUFMgb3V0cHV0cyAqLworCXVuc2lnbmVkIGludCBhdXhfc25hcF9udW07CS8qIE51bWJlciBvZiBBdXggc25hcHNob3QgaW5wdXRzICovCit9OworCitzdHJ1Y3QgeGdiZV9wcnZfZGF0YSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qIFhHTUFDL1hQQ1MgcmVsYXRlZCBtbWlvIHJlZ2lzdGVycyAqLworCXZvaWQgX19pb21lbSAqeGdtYWNfcmVnczsJLyogWEdNQUMgQ1NScyAqLworCXZvaWQgX19pb21lbSAqeHBjc19yZWdzOwkvKiBYUENTIE1NRCByZWdpc3RlcnMgKi8KKworCS8qIE92ZXJhbGwgZGV2aWNlIGxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwkvKiBYUENTIGluZGlyZWN0IGFkZHJlc3NpbmcgbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggeHBjc19tdXRleDsKKworCWludCBpcnFfbnVtYmVyOworCisJc3RydWN0IHhnYmVfaHdfaWYgaHdfaWY7CisJc3RydWN0IHhnYmVfZGVzY19pZiBkZXNjX2lmOworCisJLyogUmluZ3MgZm9yIFR4L1J4IG9uIGEgRE1BIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBjaGFubmVsX2NvdW50OworCXVuc2lnbmVkIGludCB0eF9yaW5nX2NvdW50OworCXVuc2lnbmVkIGludCB0eF9kZXNjX2NvdW50OworCXVuc2lnbmVkIGludCByeF9yaW5nX2NvdW50OworCXVuc2lnbmVkIGludCByeF9kZXNjX2NvdW50OworCisJLyogVHgvUnggY29tbW9uIHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHBibHg4OworCisJLyogVHggc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgdHhfc2ZfbW9kZTsKKwl1bnNpZ25lZCBpbnQgdHhfdGhyZXNob2xkOworCXVuc2lnbmVkIGludCB0eF9wYmw7CisJdW5zaWduZWQgaW50IHR4X29zcF9tb2RlOworCisJLyogUnggc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgcnhfc2ZfbW9kZTsKKwl1bnNpZ25lZCBpbnQgcnhfdGhyZXNob2xkOworCXVuc2lnbmVkIGludCByeF9wYmw7CisKKwkvKiBUeCBjb2FsZXNjaW5nIHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHR4X3VzZWNzOworCXVuc2lnbmVkIGludCB0eF9mcmFtZXM7CisKKwkvKiBSeCBjb2FsZXNjaW5nIHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHJ4X3Jpd3Q7CisJdW5zaWduZWQgaW50IHJ4X2ZyYW1lczsKKworCS8qIEN1cnJlbnQgTVRVICovCisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zaXplOworCisJLyogRmxvdyBjb250cm9sIHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHBhdXNlX2F1dG9uZWc7CisJdW5zaWduZWQgaW50IHR4X3BhdXNlOworCXVuc2lnbmVkIGludCByeF9wYXVzZTsKKworCS8qIE1ESU8gc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgbW9kdWxlICpwaHlfbW9kdWxlOworCWNoYXIgKm1paV9idXNfaWQ7CisJc3RydWN0IG1paV9idXMgKm1paTsKKwlpbnQgbWRpb19tbWQ7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwlpbnQgZGVmYXVsdF9hdXRvbmVnOworCWludCBkZWZhdWx0X3NwZWVkOworCisJLyogQ3VycmVudCBQSFkgc2V0dGluZ3MgKi8KKwlwaHlfaW50ZXJmYWNlX3QgcGh5X21vZGU7CisJaW50IHBoeV9saW5rOworCWludCBwaHlfc3BlZWQ7CisJdW5zaWduZWQgaW50IHBoeV90eF9wYXVzZTsKKwl1bnNpZ25lZCBpbnQgcGh5X3J4X3BhdXNlOworCisJLyogTmV0ZGV2IHJlbGF0ZWQgc2V0dGluZ3MgKi8KKwluZXRkZXZfZmVhdHVyZXNfdCBuZXRkZXZfZmVhdHVyZXM7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisJc3RydWN0IHhnYmVfbW1jX3N0YXRzIG1tY19zdGF0czsKKworCS8qIFN5c3RlbSBjbG9jayB2YWx1ZSB1c2VkIGZvciBSeCB3YXRjaGRvZyAqLworCXN0cnVjdCBjbGsgKnN5c2Nsb2NrOworCisJLyogSGFyZHdhcmUgZmVhdHVyZXMgb2YgdGhlIGRldmljZSAqLworCXN0cnVjdCB4Z2JlX2h3X2ZlYXR1cmVzIGh3X2ZlYXQ7CisKKwkvKiBEZXZpY2UgcmVzdGFydCB3b3JrIHN0cnVjdHVyZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN0YXJ0X3dvcms7CisKKwkvKiBLZWVwcyB0cmFjayBvZiBwb3dlciBtb2RlICovCisJdW5zaWduZWQgaW50IHBvd2VyX2Rvd247CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzdHJ1Y3QgZGVudHJ5ICp4Z2JlX2RlYnVnZnM7CisKKwl1bnNpZ25lZCBpbnQgZGVidWdmc194Z21hY19yZWc7CisKKwl1bnNpZ25lZCBpbnQgZGVidWdmc194cGNzX21tZDsKKwl1bnNpZ25lZCBpbnQgZGVidWdmc194cGNzX3JlZzsKKyNlbmRpZgorfTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyovCisKK3ZvaWQgeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGV2KHN0cnVjdCB4Z2JlX2h3X2lmICopOwordm9pZCB4Z2JlX2luaXRfZnVuY3Rpb25fcHRyc19kZXNjKHN0cnVjdCB4Z2JlX2Rlc2NfaWYgKik7CitzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnhnYmVfZ2V0X25ldGRldl9vcHModm9pZCk7CitzdHJ1Y3QgZXRodG9vbF9vcHMgKnhnYmVfZ2V0X2V0aHRvb2xfb3BzKHZvaWQpOworCitpbnQgeGdiZV9tZGlvX3JlZ2lzdGVyKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICopOwordm9pZCB4Z2JlX21kaW9fdW5yZWdpc3RlcihzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKK3ZvaWQgeGdiZV9kdW1wX3BoeV9yZWdpc3RlcnMoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7Cit2b2lkIHhnYmVfZHVtcF90eF9kZXNjKHN0cnVjdCB4Z2JlX3JpbmcgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQpOwordm9pZCB4Z2JlX2R1bXBfcnhfZGVzYyhzdHJ1Y3QgeGdiZV9yaW5nICosIHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqLAorCQkgICAgICAgdW5zaWduZWQgaW50KTsKK3ZvaWQgeGdiZV9wcmludF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7Cit2b2lkIHhnYmVfZ2V0X2FsbF9od19mZWF0dXJlcyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKK2ludCB4Z2JlX3Bvd2VydXAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKK2ludCB4Z2JlX3Bvd2VyZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBpbnQpOwordm9pZCB4Z2JlX2luaXRfcnhfY29hbGVzY2Uoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7Cit2b2lkIHhnYmVfaW5pdF90eF9jb2FsZXNjZShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUwordm9pZCB4Z2JlX2RlYnVnZnNfaW5pdChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKK3ZvaWQgeGdiZV9kZWJ1Z2ZzX2V4aXQoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHhnYmVfZGVidWdmc19pbml0KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCB4Z2JlX2RlYnVnZnNfZXhpdChzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpIHt9CisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCisKKy8qIE5PVEU6IFVuY29tbWVudCBmb3IgVFggYW5kIFJYIERFU0NSSVBUT1IgRFVNUCBpbiBLRVJORUwgTE9HICovCisjaWYgMAorI2RlZmluZSBYR01BQ19FTkFCTEVfVFhfREVTQ19EVU1QCisjZGVmaW5lIFhHTUFDX0VOQUJMRV9SWF9ERVNDX0RVTVAKKyNlbmRpZgorCisvKiBOT1RFOiBVbmNvbW1lbnQgZm9yIFRYIGFuZCBSWCBQQUNLRVQgRFVNUCBpbiBLRVJORUwgTE9HICovCisjaWYgMAorI2RlZmluZSBYR01BQ19FTkFCTEVfVFhfUEtUX0RVTVAKKyNkZWZpbmUgWEdNQUNfRU5BQkxFX1JYX1BLVF9EVU1QCisjZW5kaWYKKworLyogTk9URTogVW5jb21tZW50IGZvciBmdW5jdGlvbiB0cmFjZSBsb2cgbWVzc2FnZXMgaW4gS0VSTkVMIExPRyAqLworI2lmIDAKKyNkZWZpbmUgWURFQlVHCisjZGVmaW5lIFlERUJVR19NRElPCisjZW5kaWYKKworLyogRm9yIGRlYnVnIHByaW50cyAqLworI2lmZGVmIFlERUJVRworI2RlZmluZSBEQkdQUih4Li4uKSBwcl9hbGVydCh4KQorI2RlZmluZSBEQkdQSFlfUkVHUyh4Li4uKSB4Z2JlX2R1bXBfcGh5X3JlZ2lzdGVycyh4KQorI2Vsc2UKKyNkZWZpbmUgREJHUFIoeC4uLikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBEQkdQSFlfUkVHUyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIFlERUJVR19NRElPCisjZGVmaW5lIERCR1BSX01ESU8oeC4uLikgcHJfYWxlcnQoeCkKKyNlbHNlCisjZGVmaW5lIERCR1BSX01ESU8oeC4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWFpbi5jCmluZGV4IGQ2NDdhN2QuLjE4ZTJmYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tYWluLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqCQlWaW5lZXQgR3VwdGEKICAqLwogCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0zNjIsNiArMzYzLDE1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGFyY19lbWFjX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlhcmNfZW1hY19pbnRyKGRldi0+aXJxLCBkZXYpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKIC8qKgogICogYXJjX2VtYWNfb3BlbiAtIE9wZW4gdGhlIG5ldHdvcmsgZGV2aWNlLgogICogQG5kZXY6CVBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgZGV2aWNlLgpAQCAtNDUxLDYgKzQ2MSw0MSBAQAogfQogCiAvKioKKyAqIGFyY19lbWFjX3NldF9yeF9tb2RlIC0gQ2hhbmdlIHRoZSByZWNlaXZlIGZpbHRlcmluZyBtb2RlLgorICogQG5kZXY6CVBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgZGV2aWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcy9kaXNhYmxlcyBwcm9taXNjdW91cyBvciBhbGwtbXVsdGljYXN0IG1vZGUKKyAqIGFuZCB1cGRhdGVzIHRoZSBtdWx0aWNhc3QgZmlsdGVyaW5nIGxpc3Qgb2YgdGhlIG5ldHdvcmsgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBhcmNfZW1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgYXJjX2VtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKG5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJYXJjX3JlZ19vcihwcml2LCBSX0NUUkwsIFBST01fTUFTSyk7CisJfSBlbHNlIHsKKwkJYXJjX3JlZ19jbHIocHJpdiwgUl9DVFJMLCBQUk9NX01BU0spOworCisJCWlmIChuZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJYXJjX3JlZ19zZXQocHJpdiwgUl9MQUZMLCB+MCk7CisJCQlhcmNfcmVnX3NldChwcml2LCBSX0xBRkgsIH4wKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJCQl1bnNpZ25lZCBpbnQgZmlsdGVyWzJdID0geyAwLCAwIH07CisJCQlpbnQgYml0OworCisJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmRldikgeworCQkJCWJpdCA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgaGEtPmFkZHIpID4+IDI2OworCQkJCWZpbHRlcltiaXQgPj4gNV0gfD0gMSA8PCAoYml0ICYgMzEpOworCQkJfQorCisJCQlhcmNfcmVnX3NldChwcml2LCBSX0xBRkwsIGZpbHRlclswXSk7CisJCQlhcmNfcmVnX3NldChwcml2LCBSX0xBRkgsIGZpbHRlclsxXSk7CisJCX0KKwl9Cit9CisKKy8qKgogICogYXJjX2VtYWNfc3RvcCAtIENsb3NlIHRoZSBuZXR3b3JrIGRldmljZS4KICAqIEBuZGV2OglQb2ludGVyIHRvIHRoZSBuZXR3b3JrIGRldmljZS4KICAqCkBAIC02MjAsNiArNjY1LDEwIEBACiAJLm5kb19zdGFydF94bWl0CQk9IGFyY19lbWFjX3R4LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYXJjX2VtYWNfc2V0X2FkZHJlc3MsCiAJLm5kb19nZXRfc3RhdHMJCT0gYXJjX2VtYWNfc3RhdHMsCisJLm5kb19zZXRfcnhfbW9kZQk9IGFyY19lbWFjX3NldF9yeF9tb2RlLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBhcmNfZW1hY19wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgYXJjX2VtYWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYwppbmRleCAxN2JiOWNlLi40OWZhYTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCkBAIC0xMzAyLDcgKzEzMDIsNyBAQAogCX0KIAogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZhbHhfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYWx4X2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmFseF9ldGh0b29sX29wczsKIAluZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKIAluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gQUxYX1dBVENIRE9HX1RJTUU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19ldGh0b29sLmMKaW5kZXggODU5ZWE4NC4uNDg2OTRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19ldGh0b29sLmMKQEAgLTU2LDggKzU2LDggQEAKIAkJZWxzZQogCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIC0xKTsKLQkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF9VTktOT1dOKTsKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCiAJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwpAQCAtMzA1LDUgKzMwNSw1IEBACiAKIHZvaWQgYXRsMWNfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmF0bDFjX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmF0bDFjX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX2V0aHRvb2wuYwppbmRleCA4MmIyMzg2Li4xYmUwNzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX2V0aHRvb2wuYwpAQCAtNTcsOCArNTcsOCBAQAogCQllbHNlCiAJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKIAl9IGVsc2UgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgLTEpOwotCQllY21kLT5kdXBsZXggPSAtMTsKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEX1VOS05PV04pOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAKIAllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CkBAIC0zODgsNSArMzg4LDUgQEAKIAogdm9pZCBhdGwxZV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYXRsMWVfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYXRsMWVfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bDEuYwppbmRleCBkZmQwZTkxLi5iNDYwZGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGwxLmMKQEAgLTMyNTgsOCArMzI1OCw4IEBACiAJCWVsc2UKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAlpZiAoaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUiB8fAogCSAgICBody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bDIuYwppbmRleCA3OGJlZmI1Li42NzQ2YmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGwyLmMKQEAgLTEzOTYsNyArMTM5Niw3IEBACiAJYXRsMl9zZXR1cF9wY2ljbWQocGRldik7CiAKIAluZXRkZXYtPm5ldGRldl9vcHMgPSAmYXRsMl9uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZhdGwyX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmF0bDJfZXRodG9vbF9vcHM7CiAJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKIAlzdHJuY3B5KG5ldGRldi0+bmFtZSwgcGNpX25hbWUocGRldiksIHNpemVvZihuZXRkZXYtPm5hbWUpIC0gMSk7CiAKQEAgLTE3NjksOCArMTc2OSw4IEBACiAJCWVsc2UKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9LY29uZmlnCmluZGV4IDg1ZGJkZGQuLjNlNDg4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZwpAQCAtMTUwLDQgKzE1MCwxNSBAQAogCSAgSW4gY2FzZSBvZiB1c2luZyB0aGlzIGRyaXZlciBvbiBCQ000NzA2IGl0J3MgYWxzbyByZXF1aXJlcyB0byBlbmFibGUKIAkgIEJDTUFfRFJJVkVSX0dNQUNfQ01OIHRvIG1ha2UgaXQgd29yay4KIAorY29uZmlnIFNZU1RFTVBPUlQKKwl0cmlzdGF0ZSAiQnJvYWRjb20gU1lTVEVNUE9SVCBpbnRlcm5hbCBNQUMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IE1JSQorCXNlbGVjdCBQSFlMSUIKKwlzZWxlY3QgRklYRURfUEhZIGlmIFNZU1RFTVBPUlQ9eQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBidWlsdC1pbiBFdGhlcm5ldCBNQUNzIGZvdW5kIGluIHRoZQorCSAgQnJvYWRjb20gQkNNN3h4eCBTZXQgVG9wIEJveCBmYW1pbHkgY2hpcHNldCB1c2luZyBhbiBpbnRlcm5hbAorCSAgRXRoZXJuZXQgc3dpdGNoLgorCiBlbmRpZiAjIE5FVF9WRU5ET1JfQlJPQURDT00KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vTWFrZWZpbGUKaW5kZXggZmQ2MzlhMC4uZTJhOTU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vTWFrZWZpbGUKQEAgLTExLDMgKzExLDQgQEAKIG9iai0kKENPTkZJR19TQjEyNTBfTUFDKSArPSBzYjEyNTAtbWFjLm8KIG9iai0kKENPTkZJR19USUdPTjMpICs9IHRnMy5vCiBvYmotJChDT05GSUdfQkdNQUMpICs9IGJnbWFjLm8KK29iai0kKENPTkZJR19TWVNURU1QT1JUKSArPSBiY21zeXNwb3J0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKaW5kZXggMDViYTYyNS4uY2E1YTIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKQEAgLTIzODAsNyArMjM4MCw3IEBACiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmYnAtPm5hcGksIGI0NF9wb2xsLCA2NCk7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEI0NF9UWF9USU1FT1VUOwogCWRldi0+aXJxID0gc2Rldi0+aXJxOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZiNDRfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmYjQ0X2V0aHRvb2xfb3BzOwogCiAJZXJyID0gc3NiX2J1c19wb3dlcnVwKHNkZXYtPmJ1cywgMCk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYwppbmRleCBhN2QxMWY1Li4zZThkMWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYwpAQCAtMTMxNSw4ICsxMzE1LDcgQEAKIAogfTsKIAotI2RlZmluZSBCQ01fRU5FVF9TVEFUU19MRU4JXAotCShzaXplb2YoYmNtX2VuZXRfZ3N0cmluZ3Nfc3RhdHMpIC8gc2l6ZW9mKHN0cnVjdCBiY21fZW5ldF9zdGF0cykpCisjZGVmaW5lIEJDTV9FTkVUX1NUQVRTX0xFTglBUlJBWV9TSVpFKGJjbV9lbmV0X2dzdHJpbmdzX3N0YXRzKQogCiBzdGF0aWMgY29uc3QgdTMyIHVudXNlZF9taWJfcmVnc1tdID0gewogCUVUSF9NSUJfVFhfQUxMX09DVEVUUywKQEAgLTE4OTgsNyArMTg5Nyw3IEBACiAJZGV2LT5uZXRkZXZfb3BzID0gJmJjbV9lbmV0X29wczsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZwcml2LT5uYXBpLCBiY21fZW5ldF9wb2xsLCAxNik7CiAKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYmNtX2VuZXRfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmYmNtX2VuZXRfZXRodG9vbF9vcHM7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpAQCAtMjc4NCw3ICsyNzgzLDcgQEAKIAkvKiByZWdpc3RlciBuZXRkZXZpY2UgKi8KIAlkZXYtPm5ldGRldl9vcHMgPSAmYmNtX2VuZXRzd19vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgYmNtX2VuZXRfcG9sbCwgMTYpOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZiY21fZW5ldHN3X2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmJjbV9lbmV0c3dfZXRodG9vbF9vcHM7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5lbmV0c3dfbWRpb19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDExNjBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5jCkBAIC0wLDAgKzEsMTY1NCBAQAorLyoKKyAqIEJyb2FkY29tIEJDTTd4eHggU3lzdGVtIFBvcnQgRXRoZXJuZXQgTUFDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5X2ZpeGVkLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgImJjbXN5c3BvcnQuaCIKKworLyogSS9PIGFjY2Vzc29ycyByZWdpc3RlciBoZWxwZXJzICovCisjZGVmaW5lIEJDTV9TWVNQT1JUX0lPX01BQ1JPKG5hbWUsIG9mZnNldCkgXAorc3RhdGljIGlubGluZSB1MzIgbmFtZSMjX3JlYWRsKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LCB1MzIgb2ZmKQlcCit7CQkJCQkJCQkJXAorCXUzMiByZWcgPSBfX3Jhd19yZWFkbChwcml2LT5iYXNlICsgb2Zmc2V0ICsgb2ZmKTsJCVwKKwlyZXR1cm4gcmVnOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG5hbWUjI193cml0ZWwoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsCQlcCisJCQkJICB1MzIgdmFsLCB1MzIgb2ZmKQkJCVwKK3sJCQkJCQkJCQlcCisJX19yYXdfd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIG9mZnNldCArIG9mZik7CQkJXAorfQkJCQkJCQkJCVwKKworQkNNX1NZU1BPUlRfSU9fTUFDUk8oaW50cmwyXzAsIFNZU19QT1JUX0lOVFJMMl8wX09GRlNFVCk7CitCQ01fU1lTUE9SVF9JT19NQUNSTyhpbnRybDJfMSwgU1lTX1BPUlRfSU5UUkwyXzFfT0ZGU0VUKTsKK0JDTV9TWVNQT1JUX0lPX01BQ1JPKHVtYWMsIFNZU19QT1JUX1VNQUNfT0ZGU0VUKTsKK0JDTV9TWVNQT1JUX0lPX01BQ1JPKHRkbWEsIFNZU19QT1JUX1RETUFfT0ZGU0VUKTsKK0JDTV9TWVNQT1JUX0lPX01BQ1JPKHJkbWEsIFNZU19QT1JUX1JETUFfT0ZGU0VUKTsKK0JDTV9TWVNQT1JUX0lPX01BQ1JPKHJ4Y2hrLCBTWVNfUE9SVF9SWENIS19PRkZTRVQpOworQkNNX1NZU1BPUlRfSU9fTUFDUk8odHhjaGssIFNZU19QT1JUX1RYQ0hLX09GRlNFVCk7CitCQ01fU1lTUE9SVF9JT19NQUNSTyhyYnVmLCBTWVNfUE9SVF9SQlVGX09GRlNFVCk7CitCQ01fU1lTUE9SVF9JT19NQUNSTyh0YnVmLCBTWVNfUE9SVF9UQlVGX09GRlNFVCk7CitCQ01fU1lTUE9SVF9JT19NQUNSTyh0b3BjdHJsLCBTWVNfUE9SVF9UT1BDVFJMX09GRlNFVCk7CisKKy8qIEwyLWludGVycnVwdCBtYXNraW5nL3VubWFza2luZyBoZWxwZXJzLCBkb2VzIGF1dG9tYXRpYyBzYXZpbmcgb2YgdGhlIGFwcGxpZWQKKyAqIG1hc2sgaW4gYSBzb2Z0d2FyZSBjb3B5IHRvIGF2b2lkIENQVV9NQVNLX1NUQVRVUyByZWFkcyBpbiBob3QtcGF0aHMuCisgICovCisjZGVmaW5lIEJDTV9TWVNQT1JUX0lOVFJfTDIod2hpY2gpCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRybDJfIyN3aGljaCMjX21hc2tfY2xlYXIoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsIFwKKwkJCQkJCXUzMiBtYXNrKQkJXAorewkJCQkJCQkJCVwKKwlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCisJcHJpdi0+aXJxIyN3aGljaCMjX21hc2sgJj0gfihtYXNrKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRybDJfIyN3aGljaCMjX21hc2tfc2V0KHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LCBcCisJCQkJCQl1MzIgbWFzaykJCVwKK3sJCQkJCQkJCQlcCisJaW50cmwyXyMjIHdoaWNoIyNfd3JpdGVsKHByaXYsIG1hc2ssIElOVFJMMl9DUFVfTUFTS19TRVQpOwlcCisJcHJpdi0+aXJxIyN3aGljaCMjX21hc2sgfD0gKG1hc2spOwkJCQlcCit9CQkJCQkJCQkJXAorCitCQ01fU1lTUE9SVF9JTlRSX0wyKDApCitCQ01fU1lTUE9SVF9JTlRSX0wyKDEpCisKKy8qIFJlZ2lzdGVyIGFjY2Vzc2VzIHRvIEdJU0IvUkJVUyByZWdpc3RlcnMgYXJlIGV4cGVuc2l2ZSAoZmV3IGh1bmRyZWQKKyAqIG5hbm9zZWNvbmRzKSwgc28ga2VlcCB0aGUgY2hlY2sgZm9yIDY0LWJpdHMgZXhwbGljaXQgaGVyZSB0byBzYXZlCisgKiBvbmUgcmVnaXN0ZXIgd3JpdGUgcGVyLXBhY2tldCBvbiAzMi1iaXRzIHBsYXRmb3Jtcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRtYV9kZXNjX3NldF9hZGRyKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCSAgICAgdm9pZCBfX2lvbWVtICpkLAorCQkJCSAgICAgZG1hX2FkZHJfdCBhZGRyKQoreworI2lmZGVmIENPTkZJR19QSFlTX0FERFJfVF82NEJJVAorCV9fcmF3X3dyaXRlbCh1cHBlcl8zMl9iaXRzKGFkZHIpICYgREVTQ19BRERSX0hJX01BU0ssCisJCQlkICsgREVTQ19BRERSX0hJX1NUQVRVU19MRU4pOworI2VuZGlmCisJX19yYXdfd3JpdGVsKGxvd2VyXzMyX2JpdHMoYWRkciksIGQgKyBERVNDX0FERFJfTE8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGRtYV9wb3J0X3dyaXRlX2Rlc2NfYWRkcihzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiwKKwkJCQkJCXN0cnVjdCBkbWFfZGVzYyAqZGVzYywKKwkJCQkJCXVuc2lnbmVkIGludCBwb3J0KQoreworCS8qIFBvcnRzIGFyZSBsYXRjaGVkLCBzbyB3cml0ZSB1cHBlciBhZGRyZXNzIGZpcnN0ICovCisJdGRtYV93cml0ZWwocHJpdiwgZGVzYy0+YWRkcl9zdGF0dXNfbGVuLCBURE1BX1dSSVRFX1BPUlRfSEkocG9ydCkpOworCXRkbWFfd3JpdGVsKHByaXYsIGRlc2MtPmFkZHJfbG8sIFRETUFfV1JJVEVfUE9SVF9MTyhwb3J0KSk7Cit9CisKKy8qIEV0aHRvb2wgb3BlcmF0aW9ucyAqLworc3RhdGljIGludCBiY21fc3lzcG9ydF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5ZGV2LCBjbWQpOworfQorCitzdGF0aWMgaW50IGJjbV9zeXNwb3J0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHlkZXYsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3N5c3BvcnRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJbmV0ZGV2X2ZlYXR1cmVzX3Qgd2FudGVkKQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcmVnOworCisJcHJpdi0+cnhfY3N1bV9lbiA9ICEhKHdhbnRlZCAmIE5FVElGX0ZfUlhDU1VNKTsKKwlyZWcgPSByeGNoa19yZWFkbChwcml2LCBSWENIS19DT05UUk9MKTsKKwlpZiAocHJpdi0+cnhfY3N1bV9lbikKKwkJcmVnIHw9IFJYQ0hLX0VOOworCWVsc2UKKwkJcmVnICY9IH5SWENIS19FTjsKKworCS8qIElmIFVuaU1BQyBmb3J3YXJkcyBDUkMsIHdlIG5lZWQgdG8gc2tpcCBvdmVyIGl0IHRvIGdldAorCSAqIGEgdmFsaWQgQ0hLIGJpdCB0byBiZSBzZXQgaW4gdGhlIHBlci1wYWNrZXQgc3RhdHVzIHdvcmQKKwkgKi8KKwlpZiAocHJpdi0+cnhfY3N1bV9lbiAmJiBwcml2LT5jcmNfZndkKQorCQlyZWcgfD0gUlhDSEtfU0tJUF9GQ1M7CisJZWxzZQorCQlyZWcgJj0gflJYQ0hLX1NLSVBfRkNTOworCisJcnhjaGtfd3JpdGVsKHByaXYsIHJlZywgUlhDSEtfQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQluZXRkZXZfZmVhdHVyZXNfdCB3YW50ZWQpCit7CisJc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZWc7CisKKwkvKiBIYXJkd2FyZSB0cmFuc21pdCBjaGVja3N1bSByZXF1aXJlcyB1cyB0byBlbmFibGUgdGhlIFRyYW5zbWl0IHN0YXR1cworCSAqIGJsb2NrIHByZXBlbmRlZCB0byB0aGUgcGFja2V0IGNvbnRlbnRzCisJICovCisJcHJpdi0+dHNiX2VuID0gISEod2FudGVkICYgKE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNKSk7CisJcmVnID0gdGRtYV9yZWFkbChwcml2LCBURE1BX0NPTlRST0wpOworCWlmIChwcml2LT50c2JfZW4pCisJCXJlZyB8PSBUU0JfRU47CisJZWxzZQorCQlyZWcgJj0gflRTQl9FTjsKKwl0ZG1hX3dyaXRlbChwcml2LCByZWcsIFRETUFfQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGZlYXR1cmVzIF4gZGV2LT5mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCB3YW50ZWQgPSBkZXYtPndhbnRlZF9mZWF0dXJlczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9SWENTVU0pCisJCXJldCA9IGJjbV9zeXNwb3J0X3NldF9yeF9jc3VtKGRldiwgd2FudGVkKTsKKwlpZiAoY2hhbmdlZCAmIChORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSkpCisJCXJldCA9IGJjbV9zeXNwb3J0X3NldF90eF9jc3VtKGRldiwgd2FudGVkKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEhhcmR3YXJlIGNvdW50ZXJzIG11c3QgYmUga2VwdCBpbiBzeW5jIGJlY2F1c2UgdGhlIG9yZGVyL29mZnNldAorICogaXMgaW1wb3J0YW50IGhlcmUgKG9yZGVyIGluIHN0cnVjdHVyZSBkZWNsYXJhdGlvbiA9IG9yZGVyIGluIGhhcmR3YXJlKQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJjbV9zeXNwb3J0X3N0YXRzIGJjbV9zeXNwb3J0X2dzdHJpbmdzX3N0YXRzW10gPSB7CisJLyogZ2VuZXJhbCBzdGF0cyAqLworCVNUQVRfTkVUREVWKHJ4X3BhY2tldHMpLAorCVNUQVRfTkVUREVWKHR4X3BhY2tldHMpLAorCVNUQVRfTkVUREVWKHJ4X2J5dGVzKSwKKwlTVEFUX05FVERFVih0eF9ieXRlcyksCisJU1RBVF9ORVRERVYocnhfZXJyb3JzKSwKKwlTVEFUX05FVERFVih0eF9lcnJvcnMpLAorCVNUQVRfTkVUREVWKHJ4X2Ryb3BwZWQpLAorCVNUQVRfTkVUREVWKHR4X2Ryb3BwZWQpLAorCVNUQVRfTkVUREVWKG11bHRpY2FzdCksCisJLyogVW5pTUFDIFJTViBjb3VudGVycyAqLworCVNUQVRfTUlCX1JYKCJyeF82NF9vY3RldHMiLCBtaWIucngucGt0X2NudC5jbnRfNjQpLAorCVNUQVRfTUlCX1JYKCJyeF82NV8xMjdfb2N0IiwgbWliLnJ4LnBrdF9jbnQuY250XzEyNyksCisJU1RBVF9NSUJfUlgoInJ4XzEyOF8yNTVfb2N0IiwgbWliLnJ4LnBrdF9jbnQuY250XzI1NSksCisJU1RBVF9NSUJfUlgoInJ4XzI1Nl81MTFfb2N0IiwgbWliLnJ4LnBrdF9jbnQuY250XzUxMSksCisJU1RBVF9NSUJfUlgoInJ4XzUxMl8xMDIzX29jdCIsIG1pYi5yeC5wa3RfY250LmNudF8xMDIzKSwKKwlTVEFUX01JQl9SWCgicnhfMTAyNF8xNTE4X29jdCIsIG1pYi5yeC5wa3RfY250LmNudF8xNTE4KSwKKwlTVEFUX01JQl9SWCgicnhfdmxhbl8xNTE5XzE1MjJfb2N0IiwgbWliLnJ4LnBrdF9jbnQuY250X21ndiksCisJU1RBVF9NSUJfUlgoInJ4XzE1MjJfMjA0N19vY3QiLCBtaWIucngucGt0X2NudC5jbnRfMjA0NyksCisJU1RBVF9NSUJfUlgoInJ4XzIwNDhfNDA5NV9vY3QiLCBtaWIucngucGt0X2NudC5jbnRfNDA5NSksCisJU1RBVF9NSUJfUlgoInJ4XzQwOTZfOTIxNl9vY3QiLCBtaWIucngucGt0X2NudC5jbnRfOTIxNiksCisJU1RBVF9NSUJfUlgoInJ4X3BrdHMiLCBtaWIucngucGt0KSwKKwlTVEFUX01JQl9SWCgicnhfYnl0ZXMiLCBtaWIucnguYnl0ZXMpLAorCVNUQVRfTUlCX1JYKCJyeF9tdWx0aWNhc3QiLCBtaWIucngubWNhKSwKKwlTVEFUX01JQl9SWCgicnhfYnJvYWRjYXN0IiwgbWliLnJ4LmJjYSksCisJU1RBVF9NSUJfUlgoInJ4X2ZjcyIsIG1pYi5yeC5mY3MpLAorCVNUQVRfTUlCX1JYKCJyeF9jb250cm9sIiwgbWliLnJ4LmNmKSwKKwlTVEFUX01JQl9SWCgicnhfcGF1c2UiLCBtaWIucngucGYpLAorCVNUQVRfTUlCX1JYKCJyeF91bmtub3duIiwgbWliLnJ4LnVvKSwKKwlTVEFUX01JQl9SWCgicnhfYWxpZ24iLCBtaWIucnguYWxuKSwKKwlTVEFUX01JQl9SWCgicnhfb3V0cmFuZ2UiLCBtaWIucnguZmxyKSwKKwlTVEFUX01JQl9SWCgicnhfY29kZSIsIG1pYi5yeC5jZGUpLAorCVNUQVRfTUlCX1JYKCJyeF9jYXJyaWVyIiwgbWliLnJ4LmZjciksCisJU1RBVF9NSUJfUlgoInJ4X292ZXJzaXplIiwgbWliLnJ4Lm92ciksCisJU1RBVF9NSUJfUlgoInJ4X2phYmJlciIsIG1pYi5yeC5qYnIpLAorCVNUQVRfTUlCX1JYKCJyeF9tdHVfZXJyIiwgbWliLnJ4Lm10dWUpLAorCVNUQVRfTUlCX1JYKCJyeF9nb29kX3BrdHMiLCBtaWIucngucG9rKSwKKwlTVEFUX01JQl9SWCgicnhfdW5pY2FzdCIsIG1pYi5yeC51YyksCisJU1RBVF9NSUJfUlgoInJ4X3BwcCIsIG1pYi5yeC5wcHApLAorCVNUQVRfTUlCX1JYKCJyeF9jcmMiLCBtaWIucngucmNyYyksCisJLyogVW5pTUFDIFRTViBjb3VudGVycyAqLworCVNUQVRfTUlCX1RYKCJ0eF82NF9vY3RldHMiLCBtaWIudHgucGt0X2NudC5jbnRfNjQpLAorCVNUQVRfTUlCX1RYKCJ0eF82NV8xMjdfb2N0IiwgbWliLnR4LnBrdF9jbnQuY250XzEyNyksCisJU1RBVF9NSUJfVFgoInR4XzEyOF8yNTVfb2N0IiwgbWliLnR4LnBrdF9jbnQuY250XzI1NSksCisJU1RBVF9NSUJfVFgoInR4XzI1Nl81MTFfb2N0IiwgbWliLnR4LnBrdF9jbnQuY250XzUxMSksCisJU1RBVF9NSUJfVFgoInR4XzUxMl8xMDIzX29jdCIsIG1pYi50eC5wa3RfY250LmNudF8xMDIzKSwKKwlTVEFUX01JQl9UWCgidHhfMTAyNF8xNTE4X29jdCIsIG1pYi50eC5wa3RfY250LmNudF8xNTE4KSwKKwlTVEFUX01JQl9UWCgidHhfdmxhbl8xNTE5XzE1MjJfb2N0IiwgbWliLnR4LnBrdF9jbnQuY250X21ndiksCisJU1RBVF9NSUJfVFgoInR4XzE1MjJfMjA0N19vY3QiLCBtaWIudHgucGt0X2NudC5jbnRfMjA0NyksCisJU1RBVF9NSUJfVFgoInR4XzIwNDhfNDA5NV9vY3QiLCBtaWIudHgucGt0X2NudC5jbnRfNDA5NSksCisJU1RBVF9NSUJfVFgoInR4XzQwOTZfOTIxNl9vY3QiLCBtaWIudHgucGt0X2NudC5jbnRfOTIxNiksCisJU1RBVF9NSUJfVFgoInR4X3BrdHMiLCBtaWIudHgucGt0cyksCisJU1RBVF9NSUJfVFgoInR4X211bHRpY2FzdCIsIG1pYi50eC5tY2EpLAorCVNUQVRfTUlCX1RYKCJ0eF9icm9hZGNhc3QiLCBtaWIudHguYmNhKSwKKwlTVEFUX01JQl9UWCgidHhfcGF1c2UiLCBtaWIudHgucGYpLAorCVNUQVRfTUlCX1RYKCJ0eF9jb250cm9sIiwgbWliLnR4LmNmKSwKKwlTVEFUX01JQl9UWCgidHhfZmNzX2VyciIsIG1pYi50eC5mY3MpLAorCVNUQVRfTUlCX1RYKCJ0eF9vdmVyc2l6ZSIsIG1pYi50eC5vdnIpLAorCVNUQVRfTUlCX1RYKCJ0eF9kZWZlciIsIG1pYi50eC5kcmYpLAorCVNUQVRfTUlCX1RYKCJ0eF9leGNlc3NfZGVmZXIiLCBtaWIudHguZWRmKSwKKwlTVEFUX01JQl9UWCgidHhfc2luZ2xlX2NvbCIsIG1pYi50eC5zY2wpLAorCVNUQVRfTUlCX1RYKCJ0eF9tdWx0aV9jb2wiLCBtaWIudHgubWNsKSwKKwlTVEFUX01JQl9UWCgidHhfbGF0ZV9jb2wiLCBtaWIudHgubGNsKSwKKwlTVEFUX01JQl9UWCgidHhfZXhjZXNzX2NvbCIsIG1pYi50eC5lY2wpLAorCVNUQVRfTUlCX1RYKCJ0eF9mcmFncyIsIG1pYi50eC5mcmcpLAorCVNUQVRfTUlCX1RYKCJ0eF90b3RhbF9jb2wiLCBtaWIudHgubmNsKSwKKwlTVEFUX01JQl9UWCgidHhfamFiYmVyIiwgbWliLnR4LmpiciksCisJU1RBVF9NSUJfVFgoInR4X2J5dGVzIiwgbWliLnR4LmJ5dGVzKSwKKwlTVEFUX01JQl9UWCgidHhfZ29vZF9wa3RzIiwgbWliLnR4LnBvayksCisJU1RBVF9NSUJfVFgoInR4X3VuaWNhc3QiLCBtaWIudHgudWMpLAorCS8qIFVuaU1BQyBSVU5UIGNvdW50ZXJzICovCisJU1RBVF9SVU5UKCJyeF9ydW50X3BrdHMiLCBtaWIucnhfcnVudF9jbnQpLAorCVNUQVRfUlVOVCgicnhfcnVudF92YWxpZF9mY3MiLCBtaWIucnhfcnVudF9mY3MpLAorCVNUQVRfUlVOVCgicnhfcnVudF9pbnZhbF9mY3NfYWxpZ24iLCBtaWIucnhfcnVudF9mY3NfYWxpZ24pLAorCVNUQVRfUlVOVCgicnhfcnVudF9ieXRlcyIsIG1pYi5yeF9ydW50X2J5dGVzKSwKKwkvKiBSWENISyBtaXNjIHN0YXRpc3RpY3MgKi8KKwlTVEFUX1JYQ0hLKCJyeGNoa19iYWRfY3N1bSIsIG1pYi5yeGNoa19iYWRfY3N1bSwgUlhDSEtfQkFEX0NTVU1fQ05UUiksCisJU1RBVF9SWENISygicnhjaGtfb3RoZXJfcGt0X2Rpc2MiLCBtaWIucnhjaGtfb3RoZXJfcGt0X2Rpc2MsCisJCQlSWENIS19PVEhFUl9ESVNDX0NOVFIpLAorCS8qIFJCVUYgbWlzYyBzdGF0aXN0aWNzICovCisJU1RBVF9SQlVGKCJyYnVmX292Zmxvd19jbnQiLCBtaWIucmJ1Zl9vdmZsb3dfY250LCBSQlVGX09WRkxfRElTQ19DTlRSKSwKKwlTVEFUX1JCVUYoInJidWZfZXJyX2NudCIsIG1pYi5yYnVmX2Vycl9jbnQsIFJCVUZfRVJSX1BLVF9DTlRSKSwKK307CisKKyNkZWZpbmUgQkNNX1NZU1BPUlRfU1RBVFNfTEVOCUFSUkFZX1NJWkUoYmNtX3N5c3BvcnRfZ3N0cmluZ3Nfc3RhdHMpCisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCAiMC4xIiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCAicGxhdGZvcm0iLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKwlpbmZvLT5uX3N0YXRzID0gQkNNX1NZU1BPUlRfU1RBVFNfTEVOOworfQorCitzdGF0aWMgdTMyIGJjbV9zeXNwb3J0X2dldF9tc2dsdmwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gcHJpdi0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgYmNtX3N5c3BvcnRfc2V0X21zZ2x2bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZW5hYmxlKQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPm1zZ19lbmFibGUgPSBlbmFibGU7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3N5c3BvcnRfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0cmluZ19zZXQpCit7CisJc3dpdGNoIChzdHJpbmdfc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBCQ01fU1lTUE9SVF9TVEFUU19MRU47CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHZvaWQgYmNtX3N5c3BvcnRfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IgKGkgPSAwOyBpIDwgQkNNX1NZU1BPUlRfU1RBVFNfTEVOOyBpKyspIHsKKwkJCW1lbWNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQliY21fc3lzcG9ydF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCQlFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYmNtX3N5c3BvcnRfdXBkYXRlX21pYl9jb3VudGVycyhzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdikKK3sKKwlpbnQgaSwgaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkNNX1NZU1BPUlRfU1RBVFNfTEVOOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGJjbV9zeXNwb3J0X3N0YXRzICpzOworCQl1OCBvZmZzZXQgPSAwOworCQl1MzIgdmFsID0gMDsKKwkJY2hhciAqcDsKKworCQlzID0gJmJjbV9zeXNwb3J0X2dzdHJpbmdzX3N0YXRzW2ldOworCQlzd2l0Y2ggKHMtPnR5cGUpIHsKKwkJY2FzZSBCQ01fU1lTUE9SVF9TVEFUX05FVERFVjoKKwkJCWNvbnRpbnVlOworCQljYXNlIEJDTV9TWVNQT1JUX1NUQVRfTUlCX1JYOgorCQljYXNlIEJDTV9TWVNQT1JUX1NUQVRfTUlCX1RYOgorCQljYXNlIEJDTV9TWVNQT1JUX1NUQVRfUlVOVDoKKwkJCWlmIChzLT50eXBlICE9IEJDTV9TWVNQT1JUX1NUQVRfTUlCX1JYKQorCQkJCW9mZnNldCA9IFVNQUNfTUlCX1NUQVRfT0ZGU0VUOworCQkJdmFsID0gdW1hY19yZWFkbChwcml2LCBVTUFDX01JQl9TVEFSVCArIGogKyBvZmZzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgQkNNX1NZU1BPUlRfU1RBVF9SWENISzoKKwkJCXZhbCA9IHJ4Y2hrX3JlYWRsKHByaXYsIHMtPnJlZ19vZmZzZXQpOworCQkJaWYgKHZhbCA9PSB+MCkKKwkJCQlyeGNoa193cml0ZWwocHJpdiwgMCwgcy0+cmVnX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBCQ01fU1lTUE9SVF9TVEFUX1JCVUY6CisJCQl2YWwgPSByYnVmX3JlYWRsKHByaXYsIHMtPnJlZ19vZmZzZXQpOworCQkJaWYgKHZhbCA9PSB+MCkKKwkJCQlyYnVmX3dyaXRlbChwcml2LCAwLCBzLT5yZWdfb2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaiArPSBzLT5zdGF0X3NpemVvZjsKKwkJcCA9IChjaGFyICopcHJpdiArIHMtPnN0YXRfb2Zmc2V0OworCQkqKHUzMiAqKXAgPSB2YWw7CisJfQorCisJbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5uZXRkZXYsICJ1cGRhdGVkIE1JQiBjb3VudGVyc1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQliY21fc3lzcG9ydF91cGRhdGVfbWliX2NvdW50ZXJzKHByaXYpOworCisJZm9yIChpID0gIDA7IGkgPCBCQ01fU1lTUE9SVF9TVEFUU19MRU47IGkrKykgeworCQljb25zdCBzdHJ1Y3QgYmNtX3N5c3BvcnRfc3RhdHMgKnM7CisJCWNoYXIgKnA7CisKKwkJcyA9ICZiY21fc3lzcG9ydF9nc3RyaW5nc19zdGF0c1tpXTsKKwkJaWYgKHMtPnR5cGUgPT0gQkNNX1NZU1BPUlRfU1RBVF9ORVRERVYpCisJCQlwID0gKGNoYXIgKikmZGV2LT5zdGF0czsKKwkJZWxzZQorCQkJcCA9IChjaGFyICopcHJpdjsKKwkJcCArPSBzLT5zdGF0X29mZnNldDsKKwkJZGF0YVtpXSA9ICoodTMyICopcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X2ZyZWVfY2Ioc3RydWN0IGJjbV9zeXNwb3J0X2NiICpjYikKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShjYi0+c2tiKTsKKwljYi0+c2tiID0gTlVMTDsKKwlkbWFfdW5tYXBfYWRkcl9zZXQoY2IsIGRtYV9hZGRyLCAwKTsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9yeF9yZWZpbGwoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsCisJCQkJIHN0cnVjdCBiY21fc3lzcG9ydF9jYiAqY2IpCit7CisJc3RydWN0IGRldmljZSAqa2RldiA9ICZwcml2LT5wZGV2LT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5uZXRkZXY7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCByZXQ7CisKKwljYi0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwcml2LT5uZXRkZXYsIFJYX0JVRl9MRU5HVEgpOworCWlmICghY2ItPnNrYikgeworCQluZXRpZl9lcnIocHJpdiwgcnhfZXJyLCBuZGV2LCAiU0tCIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShrZGV2LCBjYi0+c2tiLT5kYXRhLAorCQkJCVJYX0JVRl9MRU5HVEgsIERNQV9GUk9NX0RFVklDRSk7CisJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3Ioa2RldiwgbWFwcGluZyk7CisJaWYgKHJldCkgeworCQliY21fc3lzcG9ydF9mcmVlX2NiKGNiKTsKKwkJbmV0aWZfZXJyKHByaXYsIHJ4X2VyciwgbmRldiwgIkRNQSBtYXBwaW5nIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRtYV91bm1hcF9hZGRyX3NldChjYiwgZG1hX2FkZHIsIG1hcHBpbmcpOworCWRtYV9kZXNjX3NldF9hZGRyKHByaXYsIHByaXYtPnJ4X2JkX2Fzc2lnbl9wdHIsIG1hcHBpbmcpOworCisJcHJpdi0+cnhfYmRfYXNzaWduX2luZGV4Kys7CisJcHJpdi0+cnhfYmRfYXNzaWduX2luZGV4ICY9IChwcml2LT5udW1fcnhfYmRzIC0gMSk7CisJcHJpdi0+cnhfYmRfYXNzaWduX3B0ciA9IHByaXYtPnJ4X2JkcyArCisJCShwcml2LT5yeF9iZF9hc3NpZ25faW5kZXggKiBERVNDX1NJWkUpOworCisJbmV0aWZfZGJnKHByaXYsIHJ4X3N0YXR1cywgbmRldiwgIlJYIHJlZmlsbFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9hbGxvY19yeF9idWZzKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9jYiAqY2I7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX3J4X2JkczsgaSsrKSB7CisJCWNiID0gJnByaXYtPnJ4X2Nic1twcml2LT5yeF9iZF9hc3NpZ25faW5kZXhdOworCQlpZiAoY2ItPnNrYikKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IGJjbV9zeXNwb3J0X3J4X3JlZmlsbChwcml2LCBjYik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb2xsIHRoZSBoYXJkd2FyZSBmb3IgdXAgdG8gYnVkZ2V0IHBhY2tldHMgdG8gcHJvY2VzcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBiY21fc3lzcG9ydF9kZXNjX3J4KHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQl1bnNpZ25lZCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBkZXZpY2UgKmtkZXYgPSAmcHJpdi0+cGRldi0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBwcm9jZXNzZWQgPSAwLCB0b19wcm9jZXNzOworCXN0cnVjdCBiY21fc3lzcG9ydF9jYiAqY2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgcF9pbmRleDsKKwl1MTYgbGVuLCBzdGF0dXM7CisJc3RydWN0IGJjbV9yc2IgKnJzYjsKKworCS8qIERldGVybWluZSBob3cgbXVjaCB3ZSBzaG91bGQgcHJvY2VzcyBzaW5jZSBsYXN0IGNhbGwgKi8KKwlwX2luZGV4ID0gcmRtYV9yZWFkbChwcml2LCBSRE1BX1BST0RfSU5ERVgpOworCXBfaW5kZXggJj0gUkRNQV9QUk9EX0lOREVYX01BU0s7CisKKwlpZiAocF9pbmRleCA8IHByaXYtPnJ4X2NfaW5kZXgpCisJCXRvX3Byb2Nlc3MgPSAoUkRNQV9DT05TX0lOREVYX01BU0sgKyAxKSAtCisJCQlwcml2LT5yeF9jX2luZGV4ICsgcF9pbmRleDsKKwllbHNlCisJCXRvX3Byb2Nlc3MgPSBwX2luZGV4IC0gcHJpdi0+cnhfY19pbmRleDsKKworCW5ldGlmX2RiZyhwcml2LCByeF9zdGF0dXMsIG5kZXYsCisJCQkicF9pbmRleD0lZCByeF9jX2luZGV4PSVkIHRvX3Byb2Nlc3M9JWRcbiIsCisJCQlwX2luZGV4LCBwcml2LT5yeF9jX2luZGV4LCB0b19wcm9jZXNzKTsKKworCXdoaWxlICgocHJvY2Vzc2VkIDwgdG9fcHJvY2VzcykgJiYKKwkJKHByb2Nlc3NlZCA8IGJ1ZGdldCkpIHsKKworCQljYiA9ICZwcml2LT5yeF9jYnNbcHJpdi0+cnhfcmVhZF9wdHJdOworCQlza2IgPSBjYi0+c2tiOworCQlkbWFfdW5tYXBfc2luZ2xlKGtkZXYsIGRtYV91bm1hcF9hZGRyKGNiLCBkbWFfYWRkciksCisJCQkJUlhfQlVGX0xFTkdUSCwgRE1BX0ZST01fREVWSUNFKTsKKworCQkvKiBFeHRyYWN0IHRoZSBSZWNlaXZlIFN0YXR1cyBCbG9jayBwcmVwZW5kZWQgKi8KKwkJcnNiID0gKHN0cnVjdCBiY21fcnNiICopc2tiLT5kYXRhOworCQlsZW4gPSAocnNiLT5yeF9zdGF0dXNfbGVuID4+IERFU0NfTEVOX1NISUZUKSAmIERFU0NfTEVOX01BU0s7CisJCXN0YXR1cyA9IChyc2ItPnJ4X3N0YXR1c19sZW4gPj4gREVTQ19TVEFUVVNfU0hJRlQpICYKKwkJCURFU0NfU1RBVFVTX01BU0s7CisKKwkJcHJvY2Vzc2VkKys7CisJCXByaXYtPnJ4X3JlYWRfcHRyKys7CisJCWlmIChwcml2LT5yeF9yZWFkX3B0ciA9PSBwcml2LT5udW1fcnhfYmRzKQorCQkJcHJpdi0+cnhfcmVhZF9wdHIgPSAwOworCisJCW5ldGlmX2RiZyhwcml2LCByeF9zdGF0dXMsIG5kZXYsCisJCQkJInA9JWQsIGM9JWQsIHJkX3B0cj0lZCwgbGVuPSVkLCBmbGFnPTB4JTA0eFxuIiwKKwkJCQlwX2luZGV4LCBwcml2LT5yeF9jX2luZGV4LCBwcml2LT5yeF9yZWFkX3B0ciwKKwkJCQlsZW4sIHN0YXR1cyk7CisKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQluZXRpZl9lcnIocHJpdiwgcnhfZXJyLCBuZGV2LCAib3V0IG9mIG1lbW9yeSFcbiIpOworCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJbmRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlnb3RvIHJlZmlsbDsKKwkJfQorCisJCWlmICh1bmxpa2VseSghKHN0YXR1cyAmIERFU0NfRU9QKSB8fCAhKHN0YXR1cyAmIERFU0NfU09QKSkpIHsKKwkJCW5ldGlmX2Vycihwcml2LCByeF9zdGF0dXMsIG5kZXYsICJmcmFnbWVudGVkIHBhY2tldCFcbiIpOworCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJbmRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQliY21fc3lzcG9ydF9mcmVlX2NiKGNiKTsKKwkJCWdvdG8gcmVmaWxsOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChSWF9TVEFUVVNfRVJSIHwgUlhfU1RBVFVTX09WRkxPVykpKSB7CisJCQluZXRpZl9lcnIocHJpdiwgcnhfZXJyLCBuZGV2LCAiZXJyb3IgcGFja2V0XG4iKTsKKwkJCWlmIChzdGF0dXMgJiBSWF9TVEFUVVNfT1ZGTE9XKQorCQkJCW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWJjbV9zeXNwb3J0X2ZyZWVfY2IoY2IpOworCQkJZ290byByZWZpbGw7CisJCX0KKworCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQkvKiBIYXJkd2FyZSB2YWxpZGF0ZWQgb3VyIGNoZWNrc3VtICovCisJCWlmIChsaWtlbHkoc3RhdHVzICYgREVTQ19MNF9DU1VNKSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwkJLyogSGFyZHdhcmUgcHJlLXBlbmRzIHBhY2tldHMgd2l0aCAyYnl0ZXMgYmVmb3JlIEV0aGVybmV0CisJCSAqIGhlYWRlciBwbHVzIHdlIGhhdmUgdGhlIFJlY2VpdmUgU3RhdHVzIEJsb2NrLCBzdHJpcCBvZmYgYWxsCisJCSAqIG9mIHRoaXMgZnJvbSB0aGUgU0tCLgorCQkgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnJzYikgKyAyKTsKKwkJbGVuIC09IChzaXplb2YoKnJzYikgKyAyKTsKKworCQkvKiBVbmlNQUMgbWF5IGZvcndhcmQgQ1JDICovCisJCWlmIChwcml2LT5jcmNfZndkKSB7CisJCQlza2JfdHJpbShza2IsIGxlbiAtIEVUSF9GQ1NfTEVOKTsKKwkJCWxlbiAtPSBFVEhfRkNTX0xFTjsKKwkJfQorCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCQluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQluYXBpX2dyb19yZWNlaXZlKCZwcml2LT5uYXBpLCBza2IpOworcmVmaWxsOgorCQliY21fc3lzcG9ydF9yeF9yZWZpbGwocHJpdiwgY2IpOworCX0KKworCXJldHVybiBwcm9jZXNzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X3R4X3JlY2xhaW1fb25lKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQlzdHJ1Y3QgYmNtX3N5c3BvcnRfY2IgKmNiLAorCQkJCQl1bnNpZ25lZCBpbnQgKmJ5dGVzX2NvbXBsLAorCQkJCQl1bnNpZ25lZCBpbnQgKnBrdHNfY29tcGwpCit7CisJc3RydWN0IGRldmljZSAqa2RldiA9ICZwcml2LT5wZGV2LT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5uZXRkZXY7CisKKwlpZiAoY2ItPnNrYikgeworCQluZGV2LT5zdGF0cy50eF9ieXRlcyArPSBjYi0+c2tiLT5sZW47CisJCSpieXRlc19jb21wbCArPSBjYi0+c2tiLT5sZW47CisJCWRtYV91bm1hcF9zaW5nbGUoa2RldiwgZG1hX3VubWFwX2FkZHIoY2IsIGRtYV9hZGRyKSwKKwkJCQlkbWFfdW5tYXBfbGVuKGNiLCBkbWFfbGVuKSwKKwkJCQlETUFfVE9fREVWSUNFKTsKKwkJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkoKnBrdHNfY29tcGwpKys7CisJCWJjbV9zeXNwb3J0X2ZyZWVfY2IoY2IpOworCS8qIFNLQiBmcmFnbWVudCAqLworCX0gZWxzZSBpZiAoZG1hX3VubWFwX2FkZHIoY2IsIGRtYV9hZGRyKSkgeworCQluZGV2LT5zdGF0cy50eF9ieXRlcyArPSBkbWFfdW5tYXBfbGVuKGNiLCBkbWFfbGVuKTsKKwkJZG1hX3VubWFwX3BhZ2Uoa2RldiwgZG1hX3VubWFwX2FkZHIoY2IsIGRtYV9hZGRyKSwKKwkJCQlkbWFfdW5tYXBfbGVuKGNiLCBkbWFfbGVuKSwgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9hZGRyX3NldChjYiwgZG1hX2FkZHIsIDApOworCX0KK30KKworLyogUmVjbGFpbSBxdWV1ZWQgU0tCcyBmb3IgdHJhbnNtaXNzaW9uIGNvbXBsZXRpb24sIGxvY2tsZXNzIHZlcnNpb24gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19iY21fc3lzcG9ydF90eF9yZWNsYWltKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQkgICAgIHN0cnVjdCBiY21fc3lzcG9ydF90eF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBjX2luZGV4LCBsYXN0X2NfaW5kZXgsIGxhc3RfdHhfY24sIG51bV90eF9jYnM7CisJdW5zaWduZWQgaW50IHBrdHNfY29tcGwgPSAwLCBieXRlc19jb21wbCA9IDA7CisJc3RydWN0IGJjbV9zeXNwb3J0X2NiICpjYjsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJdTMyIGh3X2luZDsKKworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcmluZy0+aW5kZXgpOworCisJLyogQ29tcHV0ZSBob3cgbWFueSBkZXNjcmlwdG9ycyBoYXZlIGJlZW4gcHJvY2Vzc2VkIHNpbmNlIGxhc3QgY2FsbCAqLworCWh3X2luZCA9IHRkbWFfcmVhZGwocHJpdiwgVERNQV9ERVNDX1JJTkdfUFJPRF9DT05TX0lOREVYKHJpbmctPmluZGV4KSk7CisJY19pbmRleCA9IChod19pbmQgPj4gUklOR19DT05TX0lOREVYX1NISUZUKSAmIFJJTkdfQ09OU19JTkRFWF9NQVNLOworCXJpbmctPnBfaW5kZXggPSAoaHdfaW5kICYgUklOR19QUk9EX0lOREVYX01BU0spOworCisJbGFzdF9jX2luZGV4ID0gcmluZy0+Y19pbmRleDsKKwludW1fdHhfY2JzID0gcmluZy0+c2l6ZTsKKworCWNfaW5kZXggJj0gKG51bV90eF9jYnMgLSAxKTsKKworCWlmIChjX2luZGV4ID49IGxhc3RfY19pbmRleCkKKwkJbGFzdF90eF9jbiA9IGNfaW5kZXggLSBsYXN0X2NfaW5kZXg7CisJZWxzZQorCQlsYXN0X3R4X2NuID0gbnVtX3R4X2NicyAtIGxhc3RfY19pbmRleCArIGNfaW5kZXg7CisKKwluZXRpZl9kYmcocHJpdiwgdHhfZG9uZSwgbmRldiwKKwkJCSJyaW5nPSVkIGNfaW5kZXg9JWQgbGFzdF90eF9jbj0lZCBsYXN0X2NfaW5kZXg9JWRcbiIsCisJCQlyaW5nLT5pbmRleCwgY19pbmRleCwgbGFzdF90eF9jbiwgbGFzdF9jX2luZGV4KTsKKworCXdoaWxlIChsYXN0X3R4X2NuLS0gPiAwKSB7CisJCWNiID0gcmluZy0+Y2JzICsgbGFzdF9jX2luZGV4OworCQliY21fc3lzcG9ydF90eF9yZWNsYWltX29uZShwcml2LCBjYiwgJmJ5dGVzX2NvbXBsLCAmcGt0c19jb21wbCk7CisKKwkJcmluZy0+ZGVzY19jb3VudCsrOworCQlsYXN0X2NfaW5kZXgrKzsKKwkJbGFzdF9jX2luZGV4ICY9IChudW1fdHhfY2JzIC0gMSk7CisJfQorCisJcmluZy0+Y19pbmRleCA9IGNfaW5kZXg7CisKKwlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpICYmIHBrdHNfY29tcGwpCisJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKworCW5ldGlmX2RiZyhwcml2LCB0eF9kb25lLCBuZGV2LAorCQkJInJpbmc9JWQgY19pbmRleD0lZCBwa3RzX2NvbXBsPSVkLCBieXRlc19jb21wbD0lZFxuIiwKKwkJCXJpbmctPmluZGV4LCByaW5nLT5jX2luZGV4LCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7CisKKwlyZXR1cm4gcGt0c19jb21wbDsKK30KKworLyogTG9ja2VkIHZlcnNpb24gb2YgdGhlIHBlci1yaW5nIFRYIHJlY2xhaW0gcm91dGluZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBiY21fc3lzcG9ydF90eF9yZWNsYWltKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQkgICBzdHJ1Y3QgYmNtX3N5c3BvcnRfdHhfcmluZyAqcmluZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVsZWFzZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyaW5nLT5sb2NrLCBmbGFncyk7CisJcmVsZWFzZWQgPSBfX2JjbV9zeXNwb3J0X3R4X3JlY2xhaW0ocHJpdiwgcmluZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmluZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlbGVhc2VkOworfQorCitzdGF0aWMgaW50IGJjbV9zeXNwb3J0X3R4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF90eF9yaW5nICpyaW5nID0KKwkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBiY21fc3lzcG9ydF90eF9yaW5nLCBuYXBpKTsKKwl1bnNpZ25lZCBpbnQgd29ya19kb25lID0gMDsKKworCXdvcmtfZG9uZSA9IGJjbV9zeXNwb3J0X3R4X3JlY2xhaW0ocmluZy0+cHJpdiwgcmluZyk7CisKKwlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisJCS8qIHJlLWVuYWJsZSBUWCBpbnRlcnJ1cHQgKi8KKwkJaW50cmwyXzFfbWFza19jbGVhcihyaW5nLT5wcml2LCBCSVQocmluZy0+aW5kZXgpKTsKKwl9CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCitzdGF0aWMgdm9pZCBiY21fc3lzcG9ydF90eF9yZWNsYWltX2FsbChzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgcTsKKworCWZvciAocSA9IDA7IHEgPCBwcml2LT5uZXRkZXYtPm51bV90eF9xdWV1ZXM7IHErKykKKwkJYmNtX3N5c3BvcnRfdHhfcmVjbGFpbShwcml2LCAmcHJpdi0+dHhfcmluZ3NbcV0pOworfQorCitzdGF0aWMgaW50IGJjbV9zeXNwb3J0X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBiY21fc3lzcG9ydF9wcml2LCBuYXBpKTsKKwl1bnNpZ25lZCBpbnQgd29ya19kb25lID0gMDsKKworCXdvcmtfZG9uZSA9IGJjbV9zeXNwb3J0X2Rlc2NfcngocHJpdiwgYnVkZ2V0KTsKKworCXByaXYtPnJ4X2NfaW5kZXggKz0gd29ya19kb25lOworCXByaXYtPnJ4X2NfaW5kZXggJj0gUkRNQV9DT05TX0lOREVYX01BU0s7CisJcmRtYV93cml0ZWwocHJpdiwgcHJpdi0+cnhfY19pbmRleCwgUkRNQV9DT05TX0lOREVYKTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJLyogcmUtZW5hYmxlIFJYIGludGVycnVwdHMgKi8KKwkJaW50cmwyXzBfbWFza19jbGVhcihwcml2LCBJTlRSTDJfMF9SRE1BX01CRE9ORSk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworCisvKiBSWCBhbmQgbWlzYyBpbnRlcnJ1cHQgcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IGJjbV9zeXNwb3J0X3J4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcml2LT5pcnEwX3N0YXQgPSBpbnRybDJfMF9yZWFkbChwcml2LCBJTlRSTDJfQ1BVX1NUQVRVUykgJgorCQkJICB+aW50cmwyXzBfcmVhZGwocHJpdiwgSU5UUkwyX0NQVV9NQVNLX1NUQVRVUyk7CisJaW50cmwyXzBfd3JpdGVsKHByaXYsIHByaXYtPmlycTBfc3RhdCwgSU5UUkwyX0NQVV9DTEVBUik7CisKKwlpZiAodW5saWtlbHkocHJpdi0+aXJxMF9zdGF0ID09IDApKSB7CisJCW5ldGRldl93YXJuKHByaXYtPm5ldGRldiwgInNwdXJpb3VzIFJYIGludGVycnVwdFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAocHJpdi0+aXJxMF9zdGF0ICYgSU5UUkwyXzBfUkRNQV9NQkRPTkUpIHsKKwkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJnByaXYtPm5hcGkpKSkgeworCQkJLyogZGlzYWJsZSBSWCBpbnRlcnJ1cHRzICovCisJCQlpbnRybDJfMF9tYXNrX3NldChwcml2LCBJTlRSTDJfMF9SRE1BX01CRE9ORSk7CisJCQlfX25hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOworCQl9CisJfQorCisJLyogVFggcmluZyBpcyBmdWxsLCBwZXJmb3JtIGEgZnVsbCByZWNsYWltIHNpbmNlIHdlIGRvIG5vdCBrbm93CisJICogd2hpY2ggb25lIHdvdWxkIHRyaWdnZXIgdGhpcyBpbnRlcnJ1cHQKKwkgKi8KKwlpZiAocHJpdi0+aXJxMF9zdGF0ICYgSU5UUkwyXzBfVFhfUklOR19GVUxMKQorCQliY21fc3lzcG9ydF90eF9yZWNsYWltX2FsbChwcml2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVFggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IGJjbV9zeXNwb3J0X3R4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJjbV9zeXNwb3J0X3R4X3JpbmcgKnR4cjsKKwl1bnNpZ25lZCBpbnQgcmluZzsKKworCXByaXYtPmlycTFfc3RhdCA9IGludHJsMl8xX3JlYWRsKHByaXYsIElOVFJMMl9DUFVfU1RBVFVTKSAmCisJCQkJfmludHJsMl8xX3JlYWRsKHByaXYsIElOVFJMMl9DUFVfTUFTS19TVEFUVVMpOworCWludHJsMl8xX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX0NMRUFSKTsKKworCWlmICh1bmxpa2VseShwcml2LT5pcnExX3N0YXQgPT0gMCkpIHsKKwkJbmV0ZGV2X3dhcm4ocHJpdi0+bmV0ZGV2LCAic3B1cmlvdXMgVFggaW50ZXJydXB0XG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWZvciAocmluZyA9IDA7IHJpbmcgPCBkZXYtPm51bV90eF9xdWV1ZXM7IHJpbmcrKykgeworCQlpZiAoIShwcml2LT5pcnExX3N0YXQgJiBCSVQocmluZykpKQorCQkJY29udGludWU7CisKKwkJdHhyID0gJnByaXYtPnR4X3JpbmdzW3JpbmddOworCisJCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZ0eHItPm5hcGkpKSkgeworCQkJaW50cmwyXzFfbWFza19zZXQocHJpdiwgQklUKHJpbmcpKTsKKwkJCV9fbmFwaV9zY2hlZHVsZSgmdHhyLT5uYXBpKTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9pbnNlcnRfdHNiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJc3RydWN0IGJjbV90c2IgKnRzYjsKKwl1MzIgY3N1bV9pbmZvOworCXU4IGlwX3Byb3RvOworCXUxNiBjc3VtX3N0YXJ0OworCXUxNiBpcF92ZXI7CisKKwkvKiBSZS1hbGxvY2F0ZSBTS0IgaWYgbmVlZGVkICovCisJaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwgc2l6ZW9mKCp0c2IpKSkgeworCQluc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBzaXplb2YoKnRzYikpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCWlmICghbnNrYikgeworCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJc2tiID0gbnNrYjsKKwl9CisKKwl0c2IgPSAoc3RydWN0IGJjbV90c2IgKilza2JfcHVzaChza2IsIHNpemVvZigqdHNiKSk7CisJLyogWmVyby1vdXQgVFNCIGJ5IGRlZmF1bHQgKi8KKwltZW1zZXQodHNiLCAwLCBzaXplb2YoKnRzYikpOworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJaXBfdmVyID0gaHRvbnMoc2tiLT5wcm90b2NvbCk7CisJCXN3aXRjaCAoaXBfdmVyKSB7CisJCWNhc2UgRVRIX1BfSVA6CisJCQlpcF9wcm90byA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKKwkJCWJyZWFrOworCQljYXNlIEVUSF9QX0lQVjY6CisJCQlpcF9wcm90byA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogR2V0IHRoZSBjaGVja3N1bSBvZmZzZXQgYW5kIHRoZSBMNCAodHJhbnNwb3J0KSBvZmZzZXQgKi8KKwkJY3N1bV9zdGFydCA9IHNrYl9jaGVja3N1bV9zdGFydF9vZmZzZXQoc2tiKSAtIHNpemVvZigqdHNiKTsKKwkJY3N1bV9pbmZvID0gKGNzdW1fc3RhcnQgKyBza2ItPmNzdW1fb2Zmc2V0KSAmIEw0X0NTVU1fUFRSX01BU0s7CisJCWNzdW1faW5mbyB8PSAoY3N1bV9zdGFydCA8PCBMNF9QVFJfU0hJRlQpOworCisJCWlmIChpcF9wcm90byA9PSBJUFBST1RPX1RDUCB8fCBpcF9wcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkJY3N1bV9pbmZvIHw9IEw0X0xFTkdUSF9WQUxJRDsKKwkJCWlmIChpcF9wcm90byA9PSBJUFBST1RPX1VEUCAmJiBpcF92ZXIgPT0gRVRIX1BfSVApCisJCQkJY3N1bV9pbmZvIHw9IEw0X1VEUDsKKwkJfSBlbHNlCisJCQljc3VtX2luZm8gPSAwOworCisJCXRzYi0+bDRfcHRyX2Rlc3RfbWFwID0gY3N1bV9pbmZvOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QgYmNtX3N5c3BvcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICprZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfdHhfcmluZyAqcmluZzsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfY2IgKmNiOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgZG1hX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IHNrYl9sZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTMyIGxlbl9zdGF0dXM7CisJdTE2IHF1ZXVlOworCWludCByZXQ7CisKKwlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxdWV1ZSk7CisJcmluZyA9ICZwcml2LT50eF9yaW5nc1txdWV1ZV07CisKKwkvKiBsb2NrIGFnYWluc3QgdHggcmVjbGFpbSBpbiBCSCBjb250ZXh0IGFuZCBUWCByaW5nIGZ1bGwgaW50ZXJydXB0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkocmluZy0+ZGVzY19jb3VudCA9PSAwKSkgeworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJCW5ldGRldl9lcnIoZGV2LCAicXVldWUgJWQgYXdha2UgYW5kIHJpbmcgZnVsbCFcbiIsIHF1ZXVlKTsKKwkJcmV0ID0gTkVUREVWX1RYX0JVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEluc2VydCBUU0IgYW5kIGNoZWNrc3VtIGluZm9zICovCisJaWYgKHByaXYtPnRzYl9lbikgeworCQlyZXQgPSBiY21fc3lzcG9ydF9pbnNlcnRfdHNiKHNrYiwgZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gTkVUREVWX1RYX09LOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBUaGUgRXRoZXJuZXQgc3dpdGNoIHdlIGFyZSBpbnRlcmZhY2VkIHdpdGggbmVlZHMgcGFja2V0cyB0byBiZSBhdAorCSAqIGxlYXN0IDY0IGJ5dGVzIChpbmNsdWRpbmcgRkNTKSBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuCisJICogdGhleSBlbnRlciB0aGUgc3dpdGNoIHBvcnQgbG9naWMuIFdoZW4gQnJvYWRjb20gdGFncyBhcmUgZW5hYmxlZCwgd2UKKwkgKiBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHBhY2tldHMgYXJlIGF0IGxlYXN0IDY4IGJ5dGVzCisJICogKGluY2x1ZGluZyBGQ1MgYW5kIHRhZykgYmVjYXVzZSB0aGUgbGVuZ3RoIHZlcmlmaWNhdGlvbiBpcyBkb25lIGFmdGVyCisJICogdGhlIEJyb2FkY29tIHRhZyBpcyBzdHJpcHBlZCBvZmYgdGhlIGluZ3Jlc3MgcGFja2V0LgorCSAqLworCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTiArIEVORVRfQlJDTV9UQUdfTEVOKSkgeworCQlyZXQgPSBORVRERVZfVFhfT0s7CisJCWdvdG8gb3V0OworCX0KKworCXNrYl9sZW4gPSBza2ItPmxlbiA8IEVUSF9aTEVOICsgRU5FVF9CUkNNX1RBR19MRU4gPworCQkJRVRIX1pMRU4gKyBFTkVUX0JSQ01fVEFHX0xFTiA6IHNrYi0+bGVuOworCisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKGtkZXYsIHNrYi0+ZGF0YSwgc2tiX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGtkZXYsIG1hcHBpbmcpKSB7CisJCW5ldGlmX2Vycihwcml2LCB0eF9lcnIsIGRldiwgIkRNQSBtYXAgZmFpbGVkIGF0ICVwIChsZW49JWQpXG4iLAorCQkJCXNrYi0+ZGF0YSwgc2tiX2xlbik7CisJCXJldCA9IE5FVERFVl9UWF9PSzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUmVtZW1iZXIgdGhlIFNLQiBmb3IgZnV0dXJlIGZyZWVpbmcgKi8KKwljYiA9ICZyaW5nLT5jYnNbcmluZy0+Y3Vycl9kZXNjXTsKKwljYi0+c2tiID0gc2tiOworCWRtYV91bm1hcF9hZGRyX3NldChjYiwgZG1hX2FkZHIsIG1hcHBpbmcpOworCWRtYV91bm1hcF9sZW5fc2V0KGNiLCBkbWFfbGVuLCBza2JfbGVuKTsKKworCS8qIEZldGNoIGEgZGVzY3JpcHRvciBlbnRyeSBmcm9tIG91ciBwb29sICovCisJZGVzYyA9IHJpbmctPmRlc2NfY3B1OworCisJZGVzYy0+YWRkcl9sbyA9IGxvd2VyXzMyX2JpdHMobWFwcGluZyk7CisJbGVuX3N0YXR1cyA9IHVwcGVyXzMyX2JpdHMobWFwcGluZykgJiBERVNDX0FERFJfSElfTUFTSzsKKwlsZW5fc3RhdHVzIHw9IChza2JfbGVuIDw8IERFU0NfTEVOX1NISUZUKTsKKwlsZW5fc3RhdHVzIHw9IChERVNDX1NPUCB8IERFU0NfRU9QIHwgVFhfU1RBVFVTX0FQUF9DUkMpIDw8CisJCQlERVNDX1NUQVRVU19TSElGVDsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJbGVuX3N0YXR1cyB8PSAoREVTQ19MNF9DU1VNIDw8IERFU0NfU1RBVFVTX1NISUZUKTsKKworCXJpbmctPmN1cnJfZGVzYysrOworCWlmIChyaW5nLT5jdXJyX2Rlc2MgPT0gcmluZy0+c2l6ZSkKKwkJcmluZy0+Y3Vycl9kZXNjID0gMDsKKwlyaW5nLT5kZXNjX2NvdW50LS07CisKKwkvKiBFbnN1cmUgd3JpdGUgY29tcGxldGlvbiBvZiB0aGUgZGVzY3JpcHRvciBzdGF0dXMvbGVuZ3RoCisJICogaW4gRFJBTSBiZWZvcmUgdGhlIFN5c3RlbSBQb3J0IFdSSVRFX1BPUlQgcmVnaXN0ZXIgbGF0Y2hlcworCSAqIHRoZSB2YWx1ZQorCSAqLworCXdtYigpOworCWRlc2MtPmFkZHJfc3RhdHVzX2xlbiA9IGxlbl9zdGF0dXM7CisJd21iKCk7CisKKwkvKiBXcml0ZSB0aGlzIGRlc2NyaXB0b3IgYWRkcmVzcyB0byB0aGUgUklORyB3cml0ZSBwb3J0ICovCisJdGRtYV9wb3J0X3dyaXRlX2Rlc2NfYWRkcihwcml2LCBkZXNjLCByaW5nLT5pbmRleCk7CisKKwkvKiBDaGVjayByaW5nIHNwYWNlIGFuZCB1cGRhdGUgU1cgY29udHJvbCBmbG93ICovCisJaWYgKHJpbmctPmRlc2NfY291bnQgPT0gMCkKKwkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCisJbmV0aWZfZGJnKHByaXYsIHR4X3F1ZXVlZCwgZGV2LCAicmluZz0lZCBkZXNjX2NvdW50PSVkLCBjdXJyX2Rlc2M9JWRcbiIsCisJCQlyaW5nLT5pbmRleCwgcmluZy0+ZGVzY19jb3VudCwgcmluZy0+Y3Vycl9kZXNjKTsKKworCXJldCA9IE5FVERFVl9UWF9PSzsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW5nLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYmNtX3N5c3BvcnRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGRldl93YXJuKGRldiwgInRyYW5zbWl0IHRpbWVvdXQhXG4iKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoZGV2KTsKK30KKworLyogcGh5bGliIGFkanVzdCBsaW5rIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBiY21fc3lzcG9ydF9hZGpfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCXVuc2lnbmVkIGludCBjaGFuZ2VkID0gMDsKKwl1MzIgY21kX2JpdHMgPSAwLCByZWc7CisKKwlpZiAocHJpdi0+b2xkX2xpbmsgIT0gcGh5ZGV2LT5saW5rKSB7CisJCWNoYW5nZWQgPSAxOworCQlwcml2LT5vbGRfbGluayA9IHBoeWRldi0+bGluazsKKwl9CisKKwlpZiAocHJpdi0+b2xkX2R1cGxleCAhPSBwaHlkZXYtPmR1cGxleCkgeworCQljaGFuZ2VkID0gMTsKKwkJcHJpdi0+b2xkX2R1cGxleCA9IHBoeWRldi0+ZHVwbGV4OworCX0KKworCXN3aXRjaCAocGh5ZGV2LT5zcGVlZCkgeworCWNhc2UgU1BFRURfMjUwMDoKKwkJY21kX2JpdHMgPSBDTURfU1BFRURfMjUwMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCQljbWRfYml0cyA9IENNRF9TUEVFRF8xMDAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJY21kX2JpdHMgPSBDTURfU1BFRURfMTAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwOgorCQljbWRfYml0cyA9IENNRF9TUEVFRF8xMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNtZF9iaXRzIDw8PSBDTURfU1BFRURfU0hJRlQ7CisKKwlpZiAocGh5ZGV2LT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCWNtZF9iaXRzIHw9IENNRF9IRF9FTjsKKworCWlmIChwcml2LT5vbGRfcGF1c2UgIT0gcGh5ZGV2LT5wYXVzZSkgeworCQljaGFuZ2VkID0gMTsKKwkJcHJpdi0+b2xkX3BhdXNlID0gcGh5ZGV2LT5wYXVzZTsKKwl9CisKKwlpZiAoIXBoeWRldi0+cGF1c2UpCisJCWNtZF9iaXRzIHw9IENNRF9SWF9QQVVTRV9JR05PUkUgfCBDTURfVFhfUEFVU0VfSUdOT1JFOworCisJaWYgKGNoYW5nZWQpIHsKKwkJcmVnID0gdW1hY19yZWFkbChwcml2LCBVTUFDX0NNRCk7CisJCXJlZyAmPSB+KChDTURfU1BFRURfTUFTSyA8PCBDTURfU1BFRURfU0hJRlQpIHwKKwkJCUNNRF9IRF9FTiB8IENNRF9SWF9QQVVTRV9JR05PUkUgfAorCQkJQ01EX1RYX1BBVVNFX0lHTk9SRSk7CisJCXJlZyB8PSBjbWRfYml0czsKKwkJdW1hY193cml0ZWwocHJpdiwgcmVnLCBVTUFDX0NNRCk7CisKKwkJcGh5X3ByaW50X3N0YXR1cyhwcml2LT5waHlkZXYpOworCX0KK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9pbml0X3R4X3Jpbmcoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfdHhfcmluZyAqcmluZyA9ICZwcml2LT50eF9yaW5nc1tpbmRleF07CisJc3RydWN0IGRldmljZSAqa2RldiA9ICZwcml2LT5wZGV2LT5kZXY7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqcDsKKwl1MzIgcmVnOworCisJLyogU2ltcGxlIGRlc2NyaXB0b3JzIHBhcnRpdGlvbmluZyBmb3Igbm93ICovCisJc2l6ZSA9IDI1NjsKKworCS8qIFdlIGp1c3QgbmVlZCBvbmUgRE1BIGRlc2NyaXB0b3Igd2hpY2ggaXMgRE1BLWFibGUsIHNpbmNlIHdyaXRpbmcgdG8KKwkgKiB0aGUgcG9ydCB3aWxsIGFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3IgaW4gaXRzIGludGVybmFsIGxpbmtlZC1saXN0CisJICovCisJcCA9IGRtYV96YWxsb2NfY29oZXJlbnQoa2RldiwgMSwgJnJpbmctPmRlc2NfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJbmV0aWZfZXJyKHByaXYsIGh3LCBwcml2LT5uZXRkZXYsICJETUEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmluZy0+Y2JzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjbV9zeXNwb3J0X2NiKSAqIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcmluZy0+Y2JzKSB7CisJCW5ldGlmX2Vycihwcml2LCBodywgcHJpdi0+bmV0ZGV2LCAiQ0IgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFNXIHZpZXcgb2YgdGhlIHJpbmcgKi8KKwlzcGluX2xvY2tfaW5pdCgmcmluZy0+bG9jayk7CisJcmluZy0+cHJpdiA9IHByaXY7CisJbmV0aWZfbmFwaV9hZGQocHJpdi0+bmV0ZGV2LCAmcmluZy0+bmFwaSwgYmNtX3N5c3BvcnRfdHhfcG9sbCwgNjQpOworCXJpbmctPmluZGV4ID0gaW5kZXg7CisJcmluZy0+c2l6ZSA9IHNpemU7CisJcmluZy0+YWxsb2Nfc2l6ZSA9IHJpbmctPnNpemU7CisJcmluZy0+ZGVzY19jcHUgPSBwOworCXJpbmctPmRlc2NfY291bnQgPSByaW5nLT5zaXplOworCXJpbmctPmN1cnJfZGVzYyA9IDA7CisKKwkvKiBJbml0aWFsaXplIEhXIHJpbmcgKi8KKwl0ZG1hX3dyaXRlbChwcml2LCBSSU5HX0VOLCBURE1BX0RFU0NfUklOR19IRUFEX1RBSUxfUFRSKGluZGV4KSk7CisJdGRtYV93cml0ZWwocHJpdiwgMCwgVERNQV9ERVNDX1JJTkdfQ09VTlQoaW5kZXgpKTsKKwl0ZG1hX3dyaXRlbChwcml2LCAxLCBURE1BX0RFU0NfUklOR19JTlRSX0NPTlRST0woaW5kZXgpKTsKKwl0ZG1hX3dyaXRlbChwcml2LCAwLCBURE1BX0RFU0NfUklOR19QUk9EX0NPTlNfSU5ERVgoaW5kZXgpKTsKKwl0ZG1hX3dyaXRlbChwcml2LCBSSU5HX0lHTk9SRV9TVEFUVVMsIFRETUFfREVTQ19SSU5HX01BUFBJTkcoaW5kZXgpKTsKKwl0ZG1hX3dyaXRlbChwcml2LCAwLCBURE1BX0RFU0NfUklOR19QQ1BfREVJX1ZJRChpbmRleCkpOworCisJLyogUHJvZ3JhbSB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGFzIE1BWF9USFJFU0hPTEQgYW5kIGhhbGYgb2YKKwkgKiBpdHMgc2l6ZSBmb3IgdGhlIGh5c3RlcmVzaXMgdHJpZ2dlcgorCSAqLworCXRkbWFfd3JpdGVsKHByaXYsIHJpbmctPnNpemUgfAorCQkJMSA8PCBSSU5HX0hZU1RfVEhSRVNIX1NISUZULAorCQkJVERNQV9ERVNDX1JJTkdfTUFYX0hZU1QoaW5kZXgpKTsKKworCS8qIEVuYWJsZSB0aGUgcmluZyBxdWV1ZSBpbiB0aGUgYXJiaXRlciAqLworCXJlZyA9IHRkbWFfcmVhZGwocHJpdiwgVERNQV9USUVSMV9BUkJfMF9RVUVVRV9FTik7CisJcmVnIHw9ICgxIDw8IGluZGV4KTsKKwl0ZG1hX3dyaXRlbChwcml2LCByZWcsIFRETUFfVElFUjFfQVJCXzBfUVVFVUVfRU4pOworCisJbmFwaV9lbmFibGUoJnJpbmctPm5hcGkpOworCisJbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5uZXRkZXYsCisJCQkiVERNQSBjZmcsIHNpemU9JWQsIGRlc2NfY3B1PSVwXG4iLAorCQkJcmluZy0+c2l6ZSwgcmluZy0+ZGVzY19jcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X2ZpbmlfdHhfcmluZyhzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiwKKwkJCQkJdW5zaWduZWQgaW50IGluZGV4KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdzW2luZGV4XTsKKwlzdHJ1Y3QgZGV2aWNlICprZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKKwl1MzIgcmVnOworCisJLyogQ2FsbGVyIHNob3VsZCBzdG9wIHRoZSBURE1BIGVuZ2luZSAqLworCXJlZyA9IHRkbWFfcmVhZGwocHJpdiwgVERNQV9TVEFUVVMpOworCWlmICghKHJlZyAmIFRETUFfRElTQUJMRUQpKQorCQluZXRkZXZfd2Fybihwcml2LT5uZXRkZXYsICJURE1BIG5vdCBzdG9wcGVkIVxuIik7CisKKwluYXBpX2Rpc2FibGUoJnJpbmctPm5hcGkpOworCW5ldGlmX25hcGlfZGVsKCZyaW5nLT5uYXBpKTsKKworCWJjbV9zeXNwb3J0X3R4X3JlY2xhaW0ocHJpdiwgcmluZyk7CisKKwlrZnJlZShyaW5nLT5jYnMpOworCXJpbmctPmNicyA9IE5VTEw7CisKKwlpZiAocmluZy0+ZGVzY19kbWEpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoa2RldiwgMSwgcmluZy0+ZGVzY19jcHUsIHJpbmctPmRlc2NfZG1hKTsKKwkJcmluZy0+ZGVzY19kbWEgPSAwOworCX0KKwlyaW5nLT5zaXplID0gMDsKKwlyaW5nLT5hbGxvY19zaXplID0gMDsKKworCW5ldGlmX2RiZyhwcml2LCBodywgcHJpdi0+bmV0ZGV2LCAiVERNQSBmaW5pIGRvbmVcbiIpOworfQorCisvKiBSRE1BIGhlbHBlciAqLworc3RhdGljIGlubGluZSBpbnQgcmRtYV9lbmFibGVfc2V0KHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQl1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKKwl1MzIgcmVnOworCisJcmVnID0gcmRtYV9yZWFkbChwcml2LCBSRE1BX0NPTlRST0wpOworCWlmIChlbmFibGUpCisJCXJlZyB8PSBSRE1BX0VOOworCWVsc2UKKwkJcmVnICY9IH5SRE1BX0VOOworCXJkbWFfd3JpdGVsKHByaXYsIHJlZywgUkRNQV9DT05UUk9MKTsKKworCS8qIFBvbGwgZm9yIFJNREEgZGlzYWJsaW5nIGNvbXBsZXRpb24gKi8KKwlkbyB7CisJCXJlZyA9IHJkbWFfcmVhZGwocHJpdiwgUkRNQV9TVEFUVVMpOworCQlpZiAoISEocmVnICYgUkRNQV9ESVNBQkxFRCkgPT0gIWVuYWJsZSkKKwkJCXJldHVybiAwOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfSB3aGlsZSAodGltZW91dC0tID4gMCk7CisKKwluZXRkZXZfZXJyKHByaXYtPm5ldGRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgUkRNQSB0byBmaW5pc2hcbiIpOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIFRETUEgaGVscGVyICovCitzdGF0aWMgaW5saW5lIGludCB0ZG1hX2VuYWJsZV9zZXQoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsCisJCQkJCXVuc2lnbmVkIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwOworCXUzMiByZWc7CisKKwlyZWcgPSB0ZG1hX3JlYWRsKHByaXYsIFRETUFfQ09OVFJPTCk7CisJaWYgKGVuYWJsZSkKKwkJcmVnIHw9IFRETUFfRU47CisJZWxzZQorCQlyZWcgJj0gflRETUFfRU47CisJdGRtYV93cml0ZWwocHJpdiwgcmVnLCBURE1BX0NPTlRST0wpOworCisJLyogUG9sbCBmb3IgVE1EQSBkaXNhYmxpbmcgY29tcGxldGlvbiAqLworCWRvIHsKKwkJcmVnID0gdGRtYV9yZWFkbChwcml2LCBURE1BX1NUQVRVUyk7CisJCWlmICghIShyZWcgJiBURE1BX0RJU0FCTEVEKSA9PSAhZW5hYmxlKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0gd2hpbGUgKHRpbWVvdXQtLSA+IDApOworCisJbmV0ZGV2X2Vycihwcml2LT5uZXRkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFRETUEgdG8gZmluaXNoXG4iKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGJjbV9zeXNwb3J0X2luaXRfcnhfcmluZyhzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdikKK3sKKwl1MzIgcmVnOworCWludCByZXQ7CisKKwkvKiBJbml0aWFsaXplIFNXIHZpZXcgb2YgdGhlIFJYIHJpbmcgKi8KKwlwcml2LT5udW1fcnhfYmRzID0gTlVNX1JYX0RFU0M7CisJcHJpdi0+cnhfYmRzID0gcHJpdi0+YmFzZSArIFNZU19QT1JUX1JETUFfT0ZGU0VUOworCXByaXYtPnJ4X2JkX2Fzc2lnbl9wdHIgPSBwcml2LT5yeF9iZHM7CisJcHJpdi0+cnhfYmRfYXNzaWduX2luZGV4ID0gMDsKKwlwcml2LT5yeF9jX2luZGV4ID0gMDsKKwlwcml2LT5yeF9yZWFkX3B0ciA9IDA7CisJcHJpdi0+cnhfY2JzID0ga3phbGxvYyhwcml2LT5udW1fcnhfYmRzICoKKwkJCQlzaXplb2Yoc3RydWN0IGJjbV9zeXNwb3J0X2NiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5yeF9jYnMpIHsKKwkJbmV0aWZfZXJyKHByaXYsIGh3LCBwcml2LT5uZXRkZXYsICJDQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGJjbV9zeXNwb3J0X2FsbG9jX3J4X2J1ZnMocHJpdik7CisJaWYgKHJldCkgeworCQluZXRpZl9lcnIocHJpdiwgaHcsIHByaXYtPm5ldGRldiwgIlNLQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSBIVywgZW5zdXJlIFJETUEgaXMgZGlzYWJsZWQgKi8KKwlyZWcgPSByZG1hX3JlYWRsKHByaXYsIFJETUFfU1RBVFVTKTsKKwlpZiAoIShyZWcgJiBSRE1BX0RJU0FCTEVEKSkKKwkJcmRtYV9lbmFibGVfc2V0KHByaXYsIDApOworCisJcmRtYV93cml0ZWwocHJpdiwgMCwgUkRNQV9XUklURV9QVFJfTE8pOworCXJkbWFfd3JpdGVsKHByaXYsIDAsIFJETUFfV1JJVEVfUFRSX0hJKTsKKwlyZG1hX3dyaXRlbChwcml2LCAwLCBSRE1BX1BST0RfSU5ERVgpOworCXJkbWFfd3JpdGVsKHByaXYsIDAsIFJETUFfQ09OU19JTkRFWCk7CisJcmRtYV93cml0ZWwocHJpdiwgcHJpdi0+bnVtX3J4X2JkcyA8PCBSRE1BX1JJTkdfU0laRV9TSElGVCB8CisJCQkgIFJYX0JVRl9MRU5HVEgsIFJETUFfUklOR19CVUZfU0laRSk7CisJLyogT3BlcmF0ZSB0aGUgcXVldWUgaW4gcmluZyBtb2RlICovCisJcmRtYV93cml0ZWwocHJpdiwgMCwgUkRNQV9TVEFSVF9BRERSX0hJKTsKKwlyZG1hX3dyaXRlbChwcml2LCAwLCBSRE1BX1NUQVJUX0FERFJfTE8pOworCXJkbWFfd3JpdGVsKHByaXYsIDAsIFJETUFfRU5EX0FERFJfSEkpOworCXJkbWFfd3JpdGVsKHByaXYsIE5VTV9IV19SWF9ERVNDX1dPUkRTIC0gMSwgUkRNQV9FTkRfQUREUl9MTyk7CisKKwlyZG1hX3dyaXRlbChwcml2LCAxLCBSRE1BX01CRE9ORV9JTlRSKTsKKworCW5ldGlmX2RiZyhwcml2LCBodywgcHJpdi0+bmV0ZGV2LAorCQkJIlJETUEgY2ZnLCBudW1fcnhfYmRzPSVkLCByeF9iZHM9JXBcbiIsCisJCQlwcml2LT5udW1fcnhfYmRzLCBwcml2LT5yeF9iZHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X2ZpbmlfcnhfcmluZyhzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfY2IgKmNiOworCXVuc2lnbmVkIGludCBpOworCXUzMiByZWc7CisKKwkvKiBDYWxsZXIgc2hvdWxkIGVuc3VyZSBSRE1BIGlzIGRpc2FibGVkICovCisJcmVnID0gcmRtYV9yZWFkbChwcml2LCBSRE1BX1NUQVRVUyk7CisJaWYgKCEocmVnICYgUkRNQV9ESVNBQkxFRCkpCisJCW5ldGRldl93YXJuKHByaXYtPm5ldGRldiwgIlJETUEgbm90IHN0b3BwZWQhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fcnhfYmRzOyBpKyspIHsKKwkJY2IgPSAmcHJpdi0+cnhfY2JzW2ldOworCQlpZiAoZG1hX3VubWFwX2FkZHIoY2IsIGRtYV9hZGRyKSkKKwkJCWRtYV91bm1hcF9zaW5nbGUoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkJZG1hX3VubWFwX2FkZHIoY2IsIGRtYV9hZGRyKSwKKwkJCQkJUlhfQlVGX0xFTkdUSCwgRE1BX0ZST01fREVWSUNFKTsKKwkJYmNtX3N5c3BvcnRfZnJlZV9jYihjYik7CisJfQorCisJa2ZyZWUocHJpdi0+cnhfY2JzKTsKKwlwcml2LT5yeF9jYnMgPSBOVUxMOworCisJbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5uZXRkZXYsICJSRE1BIGZpbmkgZG9uZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zeXNwb3J0X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZWc7CisKKwlyZWcgPSB1bWFjX3JlYWRsKHByaXYsIFVNQUNfQ01EKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlyZWcgfD0gQ01EX1BST01JU0M7CisJZWxzZQorCQlyZWcgJj0gfkNNRF9QUk9NSVNDOworCXVtYWNfd3JpdGVsKHByaXYsIHJlZywgVU1BQ19DTUQpOworCisJLyogTm8gc3VwcG9ydCBmb3IgQUxMTVVMVEkgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW1hY19lbmFibGVfc2V0KHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LAorCQkJCQl1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXUzMiByZWc7CisKKwlyZWcgPSB1bWFjX3JlYWRsKHByaXYsIFVNQUNfQ01EKTsKKwlpZiAoZW5hYmxlKQorCQlyZWcgfD0gQ01EX1JYX0VOIHwgQ01EX1RYX0VOOworCWVsc2UKKwkJcmVnICY9IH4oQ01EX1JYX0VOIHwgQ01EX1RYX0VOKTsKKwl1bWFjX3dyaXRlbChwcml2LCByZWcsIFVNQUNfQ01EKTsKKworCS8qIFVuaU1BQyBzdG9wcyBvbiBhIHBhY2tldCBib3VuZGFyeSwgd2FpdCBmb3IgYSBmdWxsLXNpemVkIHBhY2tldAorCSAqIHRvIGJlIHByb2Nlc3NlZCAoMSBtc2VjKS4KKwkgKi8KKwlpZiAoZW5hYmxlID09IDApCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdW1hY19yZXNldChzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDA7CisJdTMyIHJlZzsKKwlpbnQgcmV0ID0gMDsKKworCXVtYWNfd3JpdGVsKHByaXYsIDAsIFVNQUNfQ01EKTsKKwl3aGlsZSAodGltZW91dCsrIDwgMTAwMCkgeworCQlyZWcgPSB1bWFjX3JlYWRsKHByaXYsIFVNQUNfQ01EKTsKKwkJaWYgKCEocmVnICYgQ01EX1NXX1JFU0VUKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxKTsKKwl9CisKKwlpZiAodGltZW91dCA9PSAxMDAwKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIE1BQyB0byBjb21lIG91dCBvZiByZXNldFxuIik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdW1hY19zZXRfaHdfYWRkcihzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiwKKwkJCQl1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXVtYWNfd3JpdGVsKHByaXYsIChhZGRyWzBdIDw8IDI0KSB8IChhZGRyWzFdIDw8IDE2KSB8CisJCQkoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10sIFVNQUNfTUFDMCk7CisJdW1hY193cml0ZWwocHJpdiwgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdLCBVTUFDX01BQzEpOworfQorCitzdGF0aWMgdm9pZCB0b3BjdHJsX2ZsdXNoKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2KQoreworCXRvcGN0cmxfd3JpdGVsKHByaXYsIFJYX0ZMVVNILCBSWF9GTFVTSF9DTlRMKTsKKwl0b3BjdHJsX3dyaXRlbChwcml2LCBUWF9GTFVTSCwgVFhfRkxVU0hfQ05UTCk7CisJbWRlbGF5KDEpOworCXRvcGN0cmxfd3JpdGVsKHByaXYsIDAsIFJYX0ZMVVNIX0NOVEwpOworCXRvcGN0cmxfd3JpdGVsKHByaXYsIDAsIFRYX0ZMVVNIX0NOVEwpOworfQorCitzdGF0aWMgaW50IGJjbV9zeXNwb3J0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHJlZzsKKwlpbnQgcmV0OworCisJLyogUmVzZXQgVW5pTUFDICovCisJcmV0ID0gdW1hY19yZXNldChwcml2KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoZGV2LCAiVW5pTUFDIHJlc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRmx1c2ggVFggYW5kIFJYIEZJRk9zIGF0IFRPUENUUkwgbGV2ZWwgKi8KKwl0b3BjdHJsX2ZsdXNoKHByaXYpOworCisJLyogRGlzYWJsZSB0aGUgVW5pTUFDIFJYL1RYICovCisJdW1hY19lbmFibGVfc2V0KHByaXYsIDApOworCisJLyogRW5hYmxlIFJCVUYgMmJ5dGVzIGFsaWdubWVudCBhbmQgUmVjZWl2ZSBTdGF0dXMgQmxvY2sgKi8KKwlyZWcgPSByYnVmX3JlYWRsKHByaXYsIFJCVUZfQ09OVFJPTCk7CisJcmVnIHw9IFJCVUZfNEJfQUxHTiB8IFJCVUZfUlNCX0VOOworCXJidWZfd3JpdGVsKHByaXYsIHJlZywgUkJVRl9DT05UUk9MKTsKKworCS8qIFNldCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworCXVtYWNfd3JpdGVsKHByaXYsIFVNQUNfTUFYX01UVV9TSVpFLCBVTUFDX01BWF9GUkFNRV9MRU4pOworCisJLyogU2V0IE1BQyBhZGRyZXNzICovCisJdW1hY19zZXRfaHdfYWRkcihwcml2LCBkZXYtPmRldl9hZGRyKTsKKworCS8qIFJlYWQgQ1JDIGZvcndhcmQgKi8KKwlwcml2LT5jcmNfZndkID0gISEodW1hY19yZWFkbChwcml2LCBVTUFDX0NNRCkgJiBDTURfQ1JDX0ZXRCk7CisKKwlwcml2LT5waHlkZXYgPSBvZl9waHlfY29ubmVjdChkZXYsIHByaXYtPnBoeV9kbiwgYmNtX3N5c3BvcnRfYWRqX2xpbmssCisJCQkJCTAsIHByaXYtPnBoeV9pbnRlcmZhY2UpOworCWlmICghcHJpdi0+cGh5ZGV2KSB7CisJCW5ldGRldl9lcnIoZGV2LCAiY291bGQgbm90IGF0dGFjaCB0byBQSFlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBSZXNldCBob3VzZSBrZWVwaW5nIGxpbmsgc3RhdHVzICovCisJcHJpdi0+b2xkX2R1cGxleCA9IC0xOworCXByaXYtPm9sZF9saW5rID0gLTE7CisJcHJpdi0+b2xkX3BhdXNlID0gLTE7CisKKwkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZXF1ZXN0IHRoZW0gKi8KKwlpbnRybDJfMF93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9NQVNLX1NFVCk7CisJaW50cmwyXzBfd3JpdGVsKHByaXYsIDB4ZmZmZmZmZmYsIElOVFJMMl9DUFVfQ0xFQVIpOworCWludHJsMl8wX3dyaXRlbChwcml2LCAwLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworCWludHJsMl8xX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX01BU0tfU0VUKTsKKwlpbnRybDJfMV93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9DTEVBUik7CisJaW50cmwyXzFfd3JpdGVsKHByaXYsIDAsIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShwcml2LT5pcnEwLCBiY21fc3lzcG9ydF9yeF9pc3IsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgUlggaW50ZXJydXB0XG4iKTsKKwkJZ290byBvdXRfcGh5X2Rpc2Nvbm5lY3Q7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEocHJpdi0+aXJxMSwgYmNtX3N5c3BvcnRfdHhfaXNyLCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IFRYIGludGVycnVwdFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGJvdGggaGFyZHdhcmUgYW5kIHNvZnR3YXJlIHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fdHhfcXVldWVzOyBpKyspIHsKKwkJcmV0ID0gYmNtX3N5c3BvcnRfaW5pdF90eF9yaW5nKHByaXYsIGkpOworCQlpZiAocmV0KSB7CisJCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIFRYIHJpbmcgJWRcbiIsCisJCQkJCWkpOworCQkJZ290byBvdXRfZnJlZV90eF9yaW5nOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBsaW5rZWQtbGlzdCAqLworCXRkbWFfd3JpdGVsKHByaXYsIFRETUFfTExfUkFNX0lOSVRfQlVTWSwgVERNQV9TVEFUVVMpOworCisJLyogSW5pdGlhbGl6ZSBSWCByaW5nICovCisJcmV0ID0gYmNtX3N5c3BvcnRfaW5pdF9yeF9yaW5nKHByaXYpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBSWCByaW5nXG4iKTsKKwkJZ290byBvdXRfZnJlZV9yeF9yaW5nOworCX0KKworCS8qIFR1cm4gb24gUkRNQSAqLworCXJldCA9IHJkbWFfZW5hYmxlX3NldChwcml2LCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlX3J4X3Jpbmc7CisKKwkvKiBFbmFibGUgUlggaW50ZXJydXB0IGFuZCBUWCByaW5nIGZ1bGwgaW50ZXJydXB0ICovCisJaW50cmwyXzBfbWFza19jbGVhcihwcml2LCBJTlRSTDJfMF9SRE1BX01CRE9ORSB8IElOVFJMMl8wX1RYX1JJTkdfRlVMTCk7CisKKwkvKiBUdXJuIG9uIFRETUEgKi8KKwlyZXQgPSB0ZG1hX2VuYWJsZV9zZXQocHJpdiwgMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfY2xlYXJfcnhfaW50OworCisJLyogRW5hYmxlIE5BUEkgKi8KKwluYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7CisKKwkvKiBUdXJuIG9uIFVuaU1BQyBUWC9SWCAqLworCXVtYWNfZW5hYmxlX3NldChwcml2LCAxKTsKKworCXBoeV9zdGFydChwcml2LT5waHlkZXYpOworCisJLyogRW5hYmxlIFRYIGludGVycnVwdHMgZm9yIHRoZSAzMiBUWFFzICovCisJaW50cmwyXzFfbWFza19jbGVhcihwcml2LCAweGZmZmZmZmZmKTsKKworCS8qIExhc3QgY2FsbCBiZWZvcmUgd2Ugc3RhcnQgdGhlIHJlYWwgYnVzaW5lc3MgKi8KKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2NsZWFyX3J4X2ludDoKKwlpbnRybDJfMF9tYXNrX3NldChwcml2LCBJTlRSTDJfMF9SRE1BX01CRE9ORSB8IElOVFJMMl8wX1RYX1JJTkdfRlVMTCk7CitvdXRfZnJlZV9yeF9yaW5nOgorCWJjbV9zeXNwb3J0X2ZpbmlfcnhfcmluZyhwcml2KTsKK291dF9mcmVlX3R4X3Jpbmc6CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3R4X3F1ZXVlczsgaSsrKQorCQliY21fc3lzcG9ydF9maW5pX3R4X3JpbmcocHJpdiwgaSk7CisJZnJlZV9pcnEocHJpdi0+aXJxMSwgZGV2KTsKK291dF9mcmVlX2lycTA6CisJZnJlZV9pcnEocHJpdi0+aXJxMCwgZGV2KTsKK291dF9waHlfZGlzY29ubmVjdDoKKwlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3N5c3BvcnRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgcmVnOworCWludCByZXQ7CisKKwkvKiBzdG9wIGFsbCBzb2Z0d2FyZSBmcm9tIHVwZGF0aW5nIGhhcmR3YXJlICovCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGRldik7CisJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKwlwaHlfc3RvcChwcml2LT5waHlkZXYpOworCisJLyogbWFzayBhbGwgaW50ZXJydXB0cyAqLworCWludHJsMl8wX21hc2tfc2V0KHByaXYsIDB4ZmZmZmZmZmYpOworCWludHJsMl8wX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX0NMRUFSKTsKKwlpbnRybDJfMV9tYXNrX3NldChwcml2LCAweGZmZmZmZmZmKTsKKwlpbnRybDJfMV93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9DTEVBUik7CisKKwkvKiBEaXNhYmxlIFVuaU1BQyBSWCAqLworCXJlZyA9IHVtYWNfcmVhZGwocHJpdiwgVU1BQ19DTUQpOworCXJlZyAmPSB+Q01EX1JYX0VOOworCXVtYWNfd3JpdGVsKHByaXYsIHJlZywgVU1BQ19DTUQpOworCisJcmV0ID0gdGRtYV9lbmFibGVfc2V0KHByaXYsIDApOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJ0aW1lb3V0IGRpc2FibGluZyBSRE1BXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXYWl0IGZvciBhIG1heGltdW0gcGFja2V0IHNpemUgdG8gYmUgZHJhaW5lZCAqLworCXVzbGVlcF9yYW5nZSgyMDAwLCAzMDAwKTsKKworCXJldCA9IHJkbWFfZW5hYmxlX3NldChwcml2LCAwKTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoZGV2LCAidGltZW91dCBkaXNhYmxpbmcgVERNQVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRGlzYWJsZSBVbmlNQUMgVFggKi8KKwlyZWcgPSB1bWFjX3JlYWRsKHByaXYsIFVNQUNfQ01EKTsKKwlyZWcgJj0gfkNNRF9UWF9FTjsKKwl1bWFjX3dyaXRlbChwcml2LCByZWcsIFVNQUNfQ01EKTsKKworCS8qIEZyZWUgUlgvVFggcmluZ3MgU1cgc3RydWN0dXJlcyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV90eF9xdWV1ZXM7IGkrKykKKwkJYmNtX3N5c3BvcnRfZmluaV90eF9yaW5nKHByaXYsIGkpOworCWJjbV9zeXNwb3J0X2ZpbmlfcnhfcmluZyhwcml2KTsKKworCWZyZWVfaXJxKHByaXYtPmlycTAsIGRldik7CisJZnJlZV9pcnEocHJpdi0+aXJxMSwgZGV2KTsKKworCS8qIERpc2Nvbm5lY3QgZnJvbSBQSFkgKi8KKwlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtX3N5c3BvcnRfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBiY21fc3lzcG9ydF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBiY21fc3lzcG9ydF9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGJjbV9zeXNwb3J0X2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJCT0gYmNtX3N5c3BvcnRfZ2V0X21zZ2x2bCwKKwkuc2V0X21zZ2xldmVsCQk9IGJjbV9zeXNwb3J0X3NldF9tc2dsdmwsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9zdHJpbmdzCQk9IGJjbV9zeXNwb3J0X2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IGJjbV9zeXNwb3J0X2dldF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQJCT0gYmNtX3N5c3BvcnRfZ2V0X3NzZXRfY291bnQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJjbV9zeXNwb3J0X25ldGRldl9vcHMgPSB7CisJLm5kb19zdGFydF94bWl0CQk9IGJjbV9zeXNwb3J0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IGJjbV9zeXNwb3J0X3R4X3RpbWVvdXQsCisJLm5kb19vcGVuCQk9IGJjbV9zeXNwb3J0X29wZW4sCisJLm5kb19zdG9wCQk9IGJjbV9zeXNwb3J0X3N0b3AsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBiY21fc3lzcG9ydF9zZXRfZmVhdHVyZXMsCisJLm5kb19zZXRfcnhfbW9kZQk9IGJjbV9zeXNwb3J0X3NldF9yeF9tb2RlLAorfTsKKworI2RlZmluZSBSRVZfRk1UCSJ2JTJ4LiUwMngiCisKK3N0YXRpYyBpbnQgYmNtX3N5c3BvcnRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY29uc3Qgdm9pZCAqbWFjYWRkcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJdTMyIHR4cSwgcnhxOworCWludCByZXQ7CisKKwlkbiA9IHBkZXYtPmRldi5vZl9ub2RlOworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJLyogUmVhZCB0aGUgVHJhbnNtaXQvUmVjZWl2ZSBRdWV1ZSBwcm9wZXJ0aWVzICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRuLCAic3lzdGVtcG9ydCxudW0tdHhxIiwgJnR4cSkpCisJCXR4cSA9IFRETUFfTlVNX1JJTkdTOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkbiwgInN5c3RlbXBvcnQsbnVtLXJ4cSIsICZyeHEpKQorCQlyeHEgPSAxOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZigqcHJpdiksIHR4cSwgcnhxKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbml0aWFsaXplIHByaXZhdGUgbWVtYmVycyAqLworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpdi0+aXJxMCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJcHJpdi0+aXJxMSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKHByaXYtPmlycTAgPD0gMCB8fCBwcml2LT5pcnExIDw9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBpbnRlcnJ1cHRzXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcHJpdi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByKTsKKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+YmFzZSk7CisJCWdvdG8gZXJyOworCX0KKworCXByaXYtPm5ldGRldiA9IGRldjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKworCXByaXYtPnBoeV9pbnRlcmZhY2UgPSBvZl9nZXRfcGh5X21vZGUoZG4pOworCS8qIERlZmF1bHQgdG8gR01JSSBpbnRlcmZhY2UgbW9kZSAqLworCWlmIChwcml2LT5waHlfaW50ZXJmYWNlIDwgMCkKKwkJcHJpdi0+cGh5X2ludGVyZmFjZSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJOworCisJLyogSW4gdGhlIGNhc2Ugb2YgYSBmaXhlZCBQSFksIHRoZSBEVCBub2RlIGFzc29jaWF0ZWQKKwkgKiB0byB0aGUgUEhZIGlzIHRoZSBFdGhlcm5ldCBNQUMgRFQgbm9kZS4KKwkgKi8KKwlpZiAob2ZfcGh5X2lzX2ZpeGVkX2xpbmsoZG4pKSB7CisJCXJldCA9IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKGRuKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGZpeGVkIFBIWVxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXByaXYtPnBoeV9kbiA9IGRuOworCX0KKworCS8qIEluaXRpYWxpemUgbmV0ZGV2aWNlIG1lbWJlcnMgKi8KKwltYWNhZGRyID0gb2ZfZ2V0X21hY19hZGRyZXNzKGRuKTsKKwlpZiAoIW1hY2FkZHIgfHwgIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjYWRkcikpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInVzaW5nIHJhbmRvbSBFdGhlcm5ldCBNQUNcbiIpOworCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKKwl9IGVsc2UgeworCQlldGhlcl9hZGRyX2NvcHkoZGV2LT5kZXZfYWRkciwgbWFjYWRkcik7CisJfQorCisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGV2KTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmJjbV9zeXNwb3J0X2V0aHRvb2xfb3BzOworCWRldi0+bmV0ZGV2X29wcyA9ICZiY21fc3lzcG9ydF9uZXRkZXZfb3BzOworCW5ldGlmX25hcGlfYWRkKGRldiwgJnByaXYtPm5hcGksIGJjbV9zeXNwb3J0X3BvbGwsIDY0KTsKKworCS8qIEhXIHN1cHBvcnRlZCBmZWF0dXJlcywgbm9uZSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwlkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9ISUdIRE1BIHwKKwkJCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTTsKKworCS8qIFNldCB0aGUgbmVlZGVkIGhlYWRyb29tIG9uY2UgYW5kIGZvciBhbGwgKi8KKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBiY21fdHNiKSAhPSA4KTsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSArPSBzaXplb2Yoc3RydWN0IGJjbV90c2IpOworCisJLyogV2UgYXJlIGludGVyZmFjZWQgdG8gYSBzd2l0Y2ggd2hpY2ggaGFuZGxlcyB0aGUgbXVsdGljYXN0CisJICogZmlsdGVyaW5nIGZvciB1cywgc28gd2UgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgYW55CisJICogbXVsdGljYXN0IGhhc2ggdGFibGUgaW4gdGhpcyBFdGhlcm5ldCBNQUMuCisJICovCisJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKworCS8qIGxpYnBoeSB3aWxsIGFkanVzdCB0aGUgbGluayBzdGF0ZSBhY2NvcmRpbmdseSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBuZXRfZGV2aWNlXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcHJpdi0+cmV2ID0gdG9wY3RybF9yZWFkbChwcml2LCBSRVZfQ05UTCkgJiBSRVZfTUFTSzsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkiQnJvYWRjb20gU1lTVEVNUE9SVCIgUkVWX0ZNVAorCQkiIGF0IDB4JXAgKGlycXM6ICVkLCAlZCwgVFhRczogJWQsIFJYUXM6ICVkKVxuIiwKKwkJKHByaXYtPnJldiA+PiA4KSAmIDB4ZmYsIHByaXYtPnJldiAmIDB4ZmYsCisJCXByaXYtPmJhc2UsIHByaXYtPmlycTAsIHByaXYtPmlycTEsIHR4cSwgcnhxKTsKKworCXJldHVybiAwOworZXJyOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiY21fc3lzcG9ydF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJLyogTm90IG11Y2ggdG8gZG8sIG5kb19jbG9zZSBoYXMgYmVlbiBjYWxsZWQKKwkgKiBhbmQgd2UgdXNlIG1hbmFnZWQgYWxsb2NhdGlvbnMKKwkgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbV9zeXNwb3J0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHN5c3RlbXBvcnQtdjEuMDAiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHN5c3RlbXBvcnQiIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY21fc3lzcG9ydF9kcml2ZXIgPSB7CisJLnByb2JlCT0gYmNtX3N5c3BvcnRfcHJvYmUsCisJLnJlbW92ZQk9IGJjbV9zeXNwb3J0X3JlbW92ZSwKKwkuZHJpdmVyID0gIHsKKwkJLm5hbWUgPSAiYnJjbS1zeXN0ZW1wb3J0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9zeXNwb3J0X29mX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fc3lzcG9ydF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBTeXN0ZW0gUG9ydCBFdGhlcm5ldCBNQUMgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJyY20tc3lzdGVtcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWMwODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LmgKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBCcm9hZGNvbSBCQ003eHh4IFN5c3RlbSBQb3J0IEV0aGVybmV0IE1BQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19CQ01fU1lTUE9SVF9ICisjZGVmaW5lIF9fQkNNX1NZU1BPUlRfSAorCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisvKiBSZWNlaXZlL3RyYW5zbWl0IGRlc2NyaXB0b3IgZm9ybWF0ICovCisjZGVmaW5lIERFU0NfQUREUl9ISV9TVEFUVVNfTEVOCTB4MDAKKyNkZWZpbmUgIERFU0NfQUREUl9ISV9TSElGVAkwCisjZGVmaW5lICBERVNDX0FERFJfSElfTUFTSwkweGZmCisjZGVmaW5lICBERVNDX1NUQVRVU19TSElGVAk4CisjZGVmaW5lICBERVNDX1NUQVRVU19NQVNLCTB4M2ZmCisjZGVmaW5lICBERVNDX0xFTl9TSElGVAkJMTgKKyNkZWZpbmUgIERFU0NfTEVOX01BU0sJCTB4N2ZmZgorI2RlZmluZSBERVNDX0FERFJfTE8JCTB4MDQKKworLyogSFcgc3VwcG9ydHMgNDAtYml0IGFkZHJlc3NpbmcgaGVuY2UgdGhlICovCisjZGVmaW5lIERFU0NfU0laRQkJKFdPUkRTX1BFUl9ERVNDICogc2l6ZW9mKHUzMikpCisKKy8qIERlZmF1bHQgUlggYnVmZmVyIGFsbG9jYXRpb24gc2l6ZSAqLworI2RlZmluZSBSWF9CVUZfTEVOR1RICQkyMDQ4CisKKy8qIEJvZHkoMTUwMCkgKyBFSF9TSVpFKDE0KSArIFZMQU5UQUcoNCkgKyBCUkNNVEFHKDQpICsgRkNTKDQpID0gMTUyNi4KKyAqIDE1MzYgaXMgbXVsdGlwbGUgb2YgMjU2IGJ5dGVzCisgKi8KKyNkZWZpbmUgRU5FVF9CUkNNX1RBR19MRU4JNAorI2RlZmluZSBFTkVUX1BBRAkJMTAKKyNkZWZpbmUgVU1BQ19NQVhfTVRVX1NJWkUJKEVUSF9EQVRBX0xFTiArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgXAorCQkJCSBFTkVUX0JSQ01fVEFHX0xFTiArIEVUSF9GQ1NfTEVOICsgRU5FVF9QQUQpCisKKy8qIFRyYW5zbWl0IHN0YXR1cyBibG9jayAqLworc3RydWN0IGJjbV90c2IgeworCXUzMiBwY3BfZGVpX3ZpZDsKKyNkZWZpbmUgUENQX0RFSV9NQVNLCQkweGYKKyNkZWZpbmUgVklEX1NISUZUCQk0CisjZGVmaW5lIFZJRF9NQVNLCQkweGZmZgorCXUzMiBsNF9wdHJfZGVzdF9tYXA7CisjZGVmaW5lIEw0X0NTVU1fUFRSX01BU0sJMHgxZmYKKyNkZWZpbmUgTDRfUFRSX1NISUZUCQk5CisjZGVmaW5lIEw0X1BUUl9NQVNLCQkweDFmZgorI2RlZmluZSBMNF9VRFAJCQkoMSA8PCAxOCkKKyNkZWZpbmUgTDRfTEVOR1RIX1ZBTElECQkoMSA8PCAxOSkKKyNkZWZpbmUgREVTVF9NQVBfU0hJRlQJCTIwCisjZGVmaW5lIERFU1RfTUFQX01BU0sJCTB4MWZmCit9OworCisvKiBSZWNlaXZlIHN0YXR1cyBibG9jayB1c2VzIHRoZSBzYW1lCisgKiBkZWZpbml0aW9ucyBhcyB0aGUgRE1BIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGJjbV9yc2IgeworCXUzMiByeF9zdGF0dXNfbGVuOworCXUzMiBicmNtX2VncmVzc190YWc7Cit9OworCisvKiBDb21tb24gUmVjZWl2ZS9UcmFuc21pdCBzdGF0dXMgYml0cyAqLworI2RlZmluZSBERVNDX0w0X0NTVU0JCSgxIDw8IDcpCisjZGVmaW5lIERFU0NfU09QCQkoMSA8PCA4KQorI2RlZmluZSBERVNDX0VPUAkJKDEgPDwgOSkKKworLyogUmVjZWl2ZSBTdGF0dXMgYml0cyAqLworI2RlZmluZSBSWF9TVEFUVVNfVUNBU1QJCQkwCisjZGVmaW5lIFJYX1NUQVRVU19CQ0FTVAkJCTB4MDQKKyNkZWZpbmUgUlhfU1RBVFVTX01DQVNUCQkJMHgwOAorI2RlZmluZSBSWF9TVEFUVVNfTDJfTUNBU1QJCTB4MGMKKyNkZWZpbmUgUlhfU1RBVFVTX0VSUgkJCSgxIDw8IDQpCisjZGVmaW5lIFJYX1NUQVRVU19PVkZMT1cJCSgxIDw8IDUpCisjZGVmaW5lIFJYX1NUQVRVU19QQVJTRV9GQUlMCQkoMSA8PCA2KQorCisvKiBUcmFuc21pdCBTdGF0dXMgYml0cyAqLworI2RlZmluZSBUWF9TVEFUVVNfVkxBTl9OT19BQ1QJCTB4MDAKKyNkZWZpbmUgVFhfU1RBVFVTX1ZMQU5fUENQX1RTQgkJMHgwMQorI2RlZmluZSBUWF9TVEFUVVNfVkxBTl9RVUVVRQkJMHgwMgorI2RlZmluZSBUWF9TVEFUVVNfVkxBTl9WSURfVFNCCQkweDAzCisjZGVmaW5lIFRYX1NUQVRVU19PV1JfQ1JDCQkoMSA8PCAyKQorI2RlZmluZSBUWF9TVEFUVVNfQVBQX0NSQwkJKDEgPDwgMykKKyNkZWZpbmUgVFhfU1RBVFVTX0JSQ01fVEFHX05PX0FDVAkwCisjZGVmaW5lIFRYX1NUQVRVU19CUkNNX1RBR19aRVJPCQkweDEwCisjZGVmaW5lIFRYX1NUQVRVU19CUkNNX1RBR19PTkVfUVVFVUUJMHgyMAorI2RlZmluZSBUWF9TVEFUVVNfQlJDTV9UQUdfT05FX1RTQgkweDMwCisjZGVmaW5lIFRYX1NUQVRVU19TS0lQX0JZVEVTCQkoMSA8PCA2KQorCisvKiBTcGVjaWZpYyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTWVNfUE9SVF9UT1BDVFJMX09GRlNFVAkJMAorI2RlZmluZSBSRVZfQ05UTAkJCTB4MDAKKyNkZWZpbmUgIFJFVl9NQVNLCQkJMHhmZmZmCisKKyNkZWZpbmUgUlhfRkxVU0hfQ05UTAkJCTB4MDQKKyNkZWZpbmUgIFJYX0ZMVVNICQkJKDEgPDwgMCkKKworI2RlZmluZSBUWF9GTFVTSF9DTlRMCQkJMHgwOAorI2RlZmluZSAgVFhfRkxVU0gJCQkoMSA8PCAwKQorCisjZGVmaW5lIE1JU0NfQ05UTAkJCTB4MGMKKyNkZWZpbmUgIFNZU19DTEtfU0VMCQkJKDEgPDwgMCkKKyNkZWZpbmUgIFRETUFfRU9QX1NFTAkJCSgxIDw8IDEpCisKKy8qIExldmVsLTIgSW50ZXJydXB0IGNvbnRyb2xsZXIgb2Zmc2V0cyBhbmQgZGVmaW5lcyAqLworI2RlZmluZSBTWVNfUE9SVF9JTlRSTDJfMF9PRkZTRVQJMHgyMDAKKyNkZWZpbmUgU1lTX1BPUlRfSU5UUkwyXzFfT0ZGU0VUCTB4MjQwCisjZGVmaW5lIElOVFJMMl9DUFVfU1RBVFVTCQkweDAwCisjZGVmaW5lIElOVFJMMl9DUFVfU0VUCQkJMHgwNAorI2RlZmluZSBJTlRSTDJfQ1BVX0NMRUFSCQkweDA4CisjZGVmaW5lIElOVFJMMl9DUFVfTUFTS19TVEFUVVMJCTB4MGMKKyNkZWZpbmUgSU5UUkwyX0NQVV9NQVNLX1NFVAkJMHgxMAorI2RlZmluZSBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIJCTB4MTQKKworLyogTGV2ZWwtMiBpbnN0YW5jZSAwIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIElOVFJMMl8wX0dJU0JfRVJSCQkoMSA8PCAwKQorI2RlZmluZSBJTlRSTDJfMF9SQlVGX09WRkxPVwkJKDEgPDwgMSkKKyNkZWZpbmUgSU5UUkwyXzBfVEJVRl9VTkRGTE9XCQkoMSA8PCAyKQorI2RlZmluZSBJTlRSTDJfMF9NUEQJCQkoMSA8PCAzKQorI2RlZmluZSBJTlRSTDJfMF9CUkNNX01BVENIX1RBRwkJKDEgPDwgNCkKKyNkZWZpbmUgSU5UUkwyXzBfUkRNQV9NQkRPTkUJCSgxIDw8IDUpCisjZGVmaW5lIElOVFJMMl8wX09WRVJfTUFYX1RIUkVTSAkoMSA8PCA2KQorI2RlZmluZSBJTlRSTDJfMF9CRUxPV19IWVNUX1RIUkVTSAkoMSA8PCA3KQorI2RlZmluZSBJTlRSTDJfMF9GUkVFX0xJU1RfRU1QVFkJKDEgPDwgOCkKKyNkZWZpbmUgSU5UUkwyXzBfVFhfUklOR19GVUxMCQkoMSA8PCA5KQorI2RlZmluZSBJTlRSTDJfMF9ERVNDX0FMTE9DX0VSUgkJKDEgPDwgMTApCisjZGVmaW5lIElOVFJMMl8wX1VORVhQX1BLVFNJWkVfQUNLCSgxIDw8IDExKQorCisvKiBSWENISyBvZmZzZXQgYW5kIGRlZmluZXMgKi8KKyNkZWZpbmUgU1lTX1BPUlRfUlhDSEtfT0ZGU0VUCQkweDMwMAorCisjZGVmaW5lIFJYQ0hLX0NPTlRST0wJCQkweDAwCisjZGVmaW5lICBSWENIS19FTgkJCSgxIDw8IDApCisjZGVmaW5lICBSWENIS19TS0lQX0ZDUwkJCSgxIDw8IDEpCisjZGVmaW5lICBSWENIS19CQURfQ1NVTV9ESVMJCSgxIDw8IDIpCisjZGVmaW5lICBSWENIS19CUkNNX1RBR19FTgkJKDEgPDwgMykKKyNkZWZpbmUgIFJYQ0hLX0JSQ01fVEFHX01BVENIX1NISUZUCTQKKyNkZWZpbmUgIFJYQ0hLX0JSQ01fVEFHX01BVENIX01BU0sJMHhmZgorI2RlZmluZSAgUlhDSEtfUEFSU0VfVE5MCQkoMSA8PCAxMikKKyNkZWZpbmUgIFJYQ0hLX1ZJT0xfRU4JCQkoMSA8PCAxMykKKyNkZWZpbmUgIFJYQ0hLX1ZJT0xfRElTCQkJKDEgPDwgMTQpCisjZGVmaW5lICBSWENIS19JTkNPTV9QS1QJCSgxIDw8IDE1KQorI2RlZmluZSAgUlhDSEtfVjZfRFVQRVhUX0VOCQkoMSA8PCAxNikKKyNkZWZpbmUgIFJYQ0hLX1Y2X0RVUEVYVF9ESVMJCSgxIDw8IDE3KQorI2RlZmluZSAgUlhDSEtfRVRIRVJUWVBFX0RJUwkJKDEgPDwgMTgpCisjZGVmaW5lICBSWENIS19MMl9IRFJfRElTCQkoMSA8PCAxOSkKKyNkZWZpbmUgIFJYQ0hLX0wzX0hEUl9ESVMJCSgxIDw8IDIwKQorI2RlZmluZSAgUlhDSEtfTUFDX1JYX0VSUl9ESVMJCSgxIDw8IDIxKQorI2RlZmluZSAgUlhDSEtfUEFSU0VfQVVUSAkJKDEgPDwgMjIpCisKKyNkZWZpbmUgUlhDSEtfQlJDTV9UQUcwCQkJMHgwNAorI2RlZmluZSBSWENIS19CUkNNX1RBRyhpKQkJKChpKSAqIFJYQ0hLX0JSQ01fVEFHMCkKKyNkZWZpbmUgUlhDSEtfQlJDTV9UQUcwX01BU0sJCTB4MjQKKyNkZWZpbmUgUlhDSEtfQlJDTV9UQUdfTUFTSyhpKQkJKChpKSAqIFJYQ0hLX0JSQ01fVEFHMF9NQVNLKQorI2RlZmluZSBSWENIS19CUkNNX1RBR19NQVRDSF9TVEFUVVMJMHg0NAorI2RlZmluZSBSWENIS19FVEhFUlRZUEUJCQkweDQ4CisjZGVmaW5lIFJYQ0hLX0JBRF9DU1VNX0NOVFIJCTB4NEMKKyNkZWZpbmUgUlhDSEtfT1RIRVJfRElTQ19DTlRSCQkweDUwCisKKy8qIFRYQ0hDSyBvZmZzZXRzIGFuZCBkZWZpbmVzICovCisjZGVmaW5lIFNZU19QT1JUX1RYQ0hLX09GRlNFVAkJMHgzODAKKyNkZWZpbmUgVFhDSEtfUEtUX1JEWV9USFJFU0gJCTB4MDAKKworLyogUmVjZWl2ZSBidWZmZXIgb2Zmc2V0IGFuZCBkZWZpbmVzICovCisjZGVmaW5lIFNZU19QT1JUX1JCVUZfT0ZGU0VUCQkweDQwMAorCisjZGVmaW5lIFJCVUZfQ09OVFJPTAkJCTB4MDAKKyNkZWZpbmUgIFJCVUZfUlNCX0VOCQkJKDEgPDwgMCkKKyNkZWZpbmUgIFJCVUZfNEJfQUxHTgkJCSgxIDw8IDEpCisjZGVmaW5lICBSQlVGX0JSQ01fVEFHX1NUUklQCQkoMSA8PCAyKQorI2RlZmluZSAgUkJVRl9CQURfUEtUX0RJU0MJCSgxIDw8IDMpCisjZGVmaW5lICBSQlVGX1JFU1VNRV9USFJFU0hfU0hJRlQJNAorI2RlZmluZSAgUkJVRl9SRVNVTUVfVEhSRVNIX01BU0sJMHhmZgorI2RlZmluZSAgUkJVRl9PS19UT19TRU5EX1NISUZUCQkxMgorI2RlZmluZSAgUkJVRl9PS19UT19TRU5EX01BU0sJCTB4ZmYKKyNkZWZpbmUgIFJCVUZfQ1JDX1JFUExBQ0UJCSgxIDw8IDIwKQorI2RlZmluZSAgUkJVRl9PS19UT19TRU5EX01PREUJCSgxIDw8IDIxKQorI2RlZmluZSAgUkJVRl9SU0JfU1dBUAkJCSgxIDw8IDIyKQorI2RlZmluZSAgUkJVRl9BQ1BJX0VOCQkJKDEgPDwgMjMpCisKKyNkZWZpbmUgUkJVRl9QS1RfUkRZX1RIUkVTSAkJMHgwNAorCisjZGVmaW5lIFJCVUZfU1RBVFVTCQkJMHgwOAorI2RlZmluZSAgUkJVRl9XT0xfTU9ERQkJCSgxIDw8IDApCisjZGVmaW5lICBSQlVGX01QRAkJCSgxIDw8IDEpCisjZGVmaW5lICBSQlVGX0FDUEkJCQkoMSA8PCAyKQorCisjZGVmaW5lIFJCVUZfT1ZGTF9ESVNDX0NOVFIJCTB4MGMKKyNkZWZpbmUgUkJVRl9FUlJfUEtUX0NOVFIJCTB4MTAKKworLyogVHJhbnNtaXQgYnVmZmVyIG9mZnNldCBhbmQgZGVmaW5lcyAqLworI2RlZmluZSBTWVNfUE9SVF9UQlVGX09GRlNFVAkJMHg2MDAKKworI2RlZmluZSBUQlVGX0NPTlRST0wJCQkweDAwCisjZGVmaW5lICBUQlVGX0JQX0VOCQkJKDEgPDwgMCkKKyNkZWZpbmUgIFRCVUZfTUFYX1BLVF9USFJFU0hfU0hJRlQJMQorI2RlZmluZSAgVEJVRl9NQVhfUEtUX1RIUkVTSF9NQVNLCTB4MWYKKyNkZWZpbmUgIFRCVUZfRlVMTF9USFJFU0hfU0hJRlQJCTgKKyNkZWZpbmUgIFRCVUZfRlVMTF9USFJFU0hfTUFTSwkJMHgxZgorCisvKiBVbmlNQUMgb2Zmc2V0IGFuZCBkZWZpbmVzICovCisjZGVmaW5lIFNZU19QT1JUX1VNQUNfT0ZGU0VUCQkweDgwMAorCisjZGVmaW5lIFVNQUNfQ01ECQkJMHgwMDgKKyNkZWZpbmUgIENNRF9UWF9FTgkJCSgxIDw8IDApCisjZGVmaW5lICBDTURfUlhfRU4JCQkoMSA8PCAxKQorI2RlZmluZSAgQ01EX1NQRUVEX1NISUZUCQkyCisjZGVmaW5lICBDTURfU1BFRURfMTAJCQkwCisjZGVmaW5lICBDTURfU1BFRURfMTAwCQkJMQorI2RlZmluZSAgQ01EX1NQRUVEXzEwMDAJCQkyCisjZGVmaW5lICBDTURfU1BFRURfMjUwMAkJCTMKKyNkZWZpbmUgIENNRF9TUEVFRF9NQVNLCQkJMworI2RlZmluZSAgQ01EX1BST01JU0MJCQkoMSA8PCA0KQorI2RlZmluZSAgQ01EX1BBRF9FTgkJCSgxIDw8IDUpCisjZGVmaW5lICBDTURfQ1JDX0ZXRAkJCSgxIDw8IDYpCisjZGVmaW5lICBDTURfUEFVU0VfRldECQkJKDEgPDwgNykKKyNkZWZpbmUgIENNRF9SWF9QQVVTRV9JR05PUkUJCSgxIDw8IDgpCisjZGVmaW5lICBDTURfVFhfQUREUl9JTlMJCSgxIDw8IDkpCisjZGVmaW5lICBDTURfSERfRU4JCQkoMSA8PCAxMCkKKyNkZWZpbmUgIENNRF9TV19SRVNFVAkJCSgxIDw8IDEzKQorI2RlZmluZSAgQ01EX0xDTF9MT09QX0VOCQkoMSA8PCAxNSkKKyNkZWZpbmUgIENNRF9BVVRPX0NPTkZJRwkJKDEgPDwgMjIpCisjZGVmaW5lICBDTURfQ05UTF9GUk1fRU4JCSgxIDw8IDIzKQorI2RlZmluZSAgQ01EX05PX0xFTl9DSEsJCQkoMSA8PCAyNCkKKyNkZWZpbmUgIENNRF9STVRfTE9PUF9FTgkJKDEgPDwgMjUpCisjZGVmaW5lICBDTURfUFJCTF9FTgkJCSgxIDw8IDI3KQorI2RlZmluZSAgQ01EX1RYX1BBVVNFX0lHTk9SRQkJKDEgPDwgMjgpCisjZGVmaW5lICBDTURfVFhfUlhfRU4JCQkoMSA8PCAyOSkKKyNkZWZpbmUgIENNRF9SVU5UX0ZJTFRFUl9ESVMJCSgxIDw8IDMwKQorCisjZGVmaW5lIFVNQUNfTUFDMAkJCTB4MDBjCisjZGVmaW5lIFVNQUNfTUFDMQkJCTB4MDEwCisjZGVmaW5lIFVNQUNfTUFYX0ZSQU1FX0xFTgkJMHgwMTQKKworI2RlZmluZSBVTUFDX1RYX0ZMVVNICQkJMHgzMzQKKworI2RlZmluZSBVTUFDX01JQl9TVEFSVAkJCTB4NDAwCisKKy8qIFRoZXJlIGlzIGEgMHhDIGdhcCBiZXR3ZWVuIHRoZSBlbmQgb2YgUlggYW5kIGJlZ2lubmluZyBvZiBUWCBzdGF0cyBhbmQgdGhlbgorICogYmV0d2VlbiB0aGUgZW5kIG9mIFRYIHN0YXRzIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBSWCBSVU5UCisgKi8KKyNkZWZpbmUgVU1BQ19NSUJfU1RBVF9PRkZTRVQJCTB4YworCisjZGVmaW5lIFVNQUNfTUlCX0NUUkwJCQkweDU4MAorI2RlZmluZSAgTUlCX1JYX0NOVF9SU1QJCQkoMSA8PCAwKQorI2RlZmluZSAgTUlCX1JVTlRfQ05UX1JTVAkJKDEgPDwgMSkKKyNkZWZpbmUgIE1JQl9UWF9DTlRfUlNUCQkJKDEgPDwgMikKKyNkZWZpbmUgVU1BQ19NREZfQ1RSTAkJCTB4NjUwCisjZGVmaW5lIFVNQUNfTURGX0FERFIJCQkweDY1NAorCisvKiBSZWNlaXZlIERNQSBvZmZzZXQgYW5kIGRlZmluZXMgKi8KKyNkZWZpbmUgU1lTX1BPUlRfUkRNQV9PRkZTRVQJCTB4MjAwMAorCisjZGVmaW5lIFJETUFfQ09OVFJPTAkJCTB4MTAwMAorI2RlZmluZSAgUkRNQV9FTgkJCSgxIDw8IDApCisjZGVmaW5lICBSRE1BX1JJTkdfQ0ZHCQkJKDEgPDwgMSkKKyNkZWZpbmUgIFJETUFfRElTQ19FTgkJCSgxIDw8IDIpCisjZGVmaW5lICBSRE1BX0JVRl9EQVRBX09GRlNFVF9TSElGVAk0CisjZGVmaW5lICBSRE1BX0JVRl9EQVRBX09GRlNFVF9NQVNLCTB4M2ZmCisKKyNkZWZpbmUgUkRNQV9TVEFUVVMJCQkweDEwMDQKKyNkZWZpbmUgIFJETUFfRElTQUJMRUQJCQkoMSA8PCAwKQorI2RlZmluZSAgUkRNQV9ERVNDX1JBTV9JTklUX0JVU1kJKDEgPDwgMSkKKyNkZWZpbmUgIFJETUFfQlBfU1RBVFVTCQkJKDEgPDwgMikKKworI2RlZmluZSBSRE1BX1NDQl9CVVJTVF9TSVpFCQkweDEwMDgKKworI2RlZmluZSBSRE1BX1JJTkdfQlVGX1NJWkUJCTB4MTAwYworI2RlZmluZSAgUkRNQV9SSU5HX1NJWkVfU0hJRlQJCTE2CisKKyNkZWZpbmUgUkRNQV9XUklURV9QVFJfSEkJCTB4MTAxMAorI2RlZmluZSBSRE1BX1dSSVRFX1BUUl9MTwkJMHgxMDE0CisjZGVmaW5lIFJETUFfUFJPRF9JTkRFWAkJCTB4MTAxOAorI2RlZmluZSAgUkRNQV9QUk9EX0lOREVYX01BU0sJCTB4ZmZmZgorCisjZGVmaW5lIFJETUFfQ09OU19JTkRFWAkJCTB4MTAxYworI2RlZmluZSAgUkRNQV9DT05TX0lOREVYX01BU0sJCTB4ZmZmZgorCisjZGVmaW5lIFJETUFfU1RBUlRfQUREUl9ISQkJMHgxMDIwCisjZGVmaW5lIFJETUFfU1RBUlRfQUREUl9MTwkJMHgxMDI0CisjZGVmaW5lIFJETUFfRU5EX0FERFJfSEkJCTB4MTAyOAorI2RlZmluZSBSRE1BX0VORF9BRERSX0xPCQkweDEwMmMKKworI2RlZmluZSBSRE1BX01CRE9ORV9JTlRSCQkweDEwMzAKKyNkZWZpbmUgIFJETUFfSU5UUl9USFJFU0hfTUFTSwkJMHhmZgorI2RlZmluZSAgUkRNQV9USU1FT1VUX1NISUZUCQkxNgorI2RlZmluZSAgUkRNQV9USU1FT1VUX01BU0sJCTB4ZmZmZgorCisjZGVmaW5lIFJETUFfWE9OX1hPRkZfVEhSRVNICQkweDEwMzQKKyNkZWZpbmUgIFJETUFfWE9OX1hPRkZfVEhSRVNIX01BU0sJMHhmZmZmCisjZGVmaW5lICBSRE1BX1hPRkZfVEhSRVNIX1NISUZUCQkxNgorCisjZGVmaW5lIFJETUFfUkVBRF9QVFJfSEkJCTB4MTAzOAorI2RlZmluZSBSRE1BX1JFQURfUFRSX0xPCQkweDEwM2MKKworI2RlZmluZSBSRE1BX09WRVJSSURFCQkJMHgxMDQwCisjZGVmaW5lICBSRE1BX0xFX01PREUJCQkoMSA8PCAwKQorI2RlZmluZSAgUkRNQV9SRUdfTU9ERQkJCSgxIDw8IDEpCisKKyNkZWZpbmUgUkRNQV9URVNUCQkJMHgxMDQ0CisjZGVmaW5lICBSRE1BX1RQX09VVF9TRUwJCSgxIDw8IDApCisjZGVmaW5lICBSRE1BX01FTV9TRUwJCQkoMSA8PCAxKQorCisjZGVmaW5lIFJETUFfREVCVUcJCQkweDEwNDgKKworLyogVHJhbnNtaXQgRE1BIG9mZnNldCBhbmQgZGVmaW5lcyAqLworI2RlZmluZSBURE1BX05VTV9SSU5HUwkJCTMyCS8qIHJpbmdzID0gcXVldWVzICovCisjZGVmaW5lIFRETUFfUE9SVF9TSVpFCQkJREVTQ19TSVpFIC8qIHR3byAzMi1iaXRzIHdvcmRzICovCisKKyNkZWZpbmUgU1lTX1BPUlRfVERNQV9PRkZTRVQJCTB4NDAwMAorI2RlZmluZSBURE1BX1dSSVRFX1BPUlRfT0ZGU0VUCQkweDAwMDAKKyNkZWZpbmUgVERNQV9XUklURV9QT1JUX0hJKGkpCQkoVERNQV9XUklURV9QT1JUX09GRlNFVCArIFwKKwkJCQkJKGkpICogVERNQV9QT1JUX1NJWkUpCisjZGVmaW5lIFRETUFfV1JJVEVfUE9SVF9MTyhpKQkJKFRETUFfV1JJVEVfUE9SVF9PRkZTRVQgKyBcCisJCQkJCXNpemVvZih1MzIpICsgKGkpICogVERNQV9QT1JUX1NJWkUpCisKKyNkZWZpbmUgVERNQV9SRUFEX1BPUlRfT0ZGU0VUCQkoVERNQV9XUklURV9QT1JUX09GRlNFVCArIFwKKwkJCQkJKFRETUFfTlVNX1JJTkdTICogVERNQV9QT1JUX1NJWkUpKQorI2RlZmluZSBURE1BX1JFQURfUE9SVF9ISShpKQkJKFRETUFfUkVBRF9QT1JUX09GRlNFVCArIFwKKwkJCQkJKGkpICogVERNQV9QT1JUX1NJWkUpCisjZGVmaW5lIFRETUFfUkVBRF9QT1JUX0xPKGkpCQkoVERNQV9SRUFEX1BPUlRfT0ZGU0VUICsgXAorCQkJCQlzaXplb2YodTMyKSArIChpKSAqIFRETUFfUE9SVF9TSVpFKQorCisjZGVmaW5lIFRETUFfUkVBRF9QT1JUX0NNRF9PRkZTRVQJKFRETUFfUkVBRF9QT1JUX09GRlNFVCArIFwKKwkJCQkJKFRETUFfTlVNX1JJTkdTICogVERNQV9QT1JUX1NJWkUpKQorI2RlZmluZSBURE1BX1JFQURfUE9SVF9DTUQoaSkJCShURE1BX1JFQURfUE9SVF9DTURfT0ZGU0VUICsgXAorCQkJCQkoaSkgKiBzaXplb2YodTMyKSkKKworI2RlZmluZSBURE1BX0RFU0NfUklOR18wMF9CQVNFCQkoVERNQV9SRUFEX1BPUlRfQ01EX09GRlNFVCArIFwKKwkJCQkJKFRETUFfTlVNX1JJTkdTICogc2l6ZW9mKHUzMikpKQorCisvKiBSZWdpc3RlciBvZmZzZXRzIGFuZCBkZWZpbmVzIHJlbGF0aXZlcyB0byBhIHNwZWNpZmljIHJpbmcgbnVtYmVyICovCisjZGVmaW5lIFJJTkdfSEVBRF9UQUlMX1BUUgkJMHgwMAorI2RlZmluZSAgUklOR19IRUFEX01BU0sJCQkweDdmZgorI2RlZmluZSAgUklOR19UQUlMX1NISUZUCQkxMQorI2RlZmluZSAgUklOR19UQUlMX01BU0sJCQkweDdmZgorI2RlZmluZSAgUklOR19GTFVTSAkJCSgxIDw8IDI0KQorI2RlZmluZSAgUklOR19FTgkJCSgxIDw8IDI1KQorCisjZGVmaW5lIFJJTkdfQ09VTlQJCQkweDA0CisjZGVmaW5lICBSSU5HX0NPVU5UX01BU0sJCTB4N2ZmCisjZGVmaW5lICBSSU5HX0JVRkZfRE9ORV9TSElGVAkJMTEKKyNkZWZpbmUgIFJJTkdfQlVGRl9ET05FX01BU0sJCTB4N2ZmCisKKyNkZWZpbmUgUklOR19NQVhfSFlTVAkJCTB4MDgKKyNkZWZpbmUgIFJJTkdfTUFYX1RIUkVTSF9NQVNLCQkweDdmZgorI2RlZmluZSAgUklOR19IWVNUX1RIUkVTSF9TSElGVAkJMTEKKyNkZWZpbmUgIFJJTkdfSFlTVF9USFJFU0hfTUFTSwkJMHg3ZmYKKworI2RlZmluZSBSSU5HX0lOVFJfQ09OVFJPTAkJMHgwYworI2RlZmluZSAgUklOR19JTlRSX1RIUkVTSF9NQVNLCQkweDdmZgorI2RlZmluZSAgUklOR19FTVBUWV9JTlRSX0VOCQkoMSA8PCAxNSkKKyNkZWZpbmUgIFJJTkdfVElNRU9VVF9TSElGVAkJMTYKKyNkZWZpbmUgIFJJTkdfVElNRU9VVF9NQVNLCQkweGZmZmYKKworI2RlZmluZSBSSU5HX1BST0RfQ09OU19JTkRFWAkJMHgxMAorI2RlZmluZSAgUklOR19QUk9EX0lOREVYX01BU0sJCTB4ZmZmZgorI2RlZmluZSAgUklOR19DT05TX0lOREVYX1NISUZUCQkxNgorI2RlZmluZSAgUklOR19DT05TX0lOREVYX01BU0sJCTB4ZmZmZgorCisjZGVmaW5lIFJJTkdfTUFQUElORwkJCTB4MTQKKyNkZWZpbmUgIFJJTkdfUUlEX01BU0sJCQkweDMKKyNkZWZpbmUgIFJJTkdfUE9SVF9JRF9TSElGVAkJMworI2RlZmluZSAgUklOR19QT1JUX0lEX01BU0sJCTB4NworI2RlZmluZSAgUklOR19JR05PUkVfU1RBVFVTCQkoMSA8PCA2KQorI2RlZmluZSAgUklOR19GQUlMT1ZFUl9FTgkJKDEgPDwgNykKKyNkZWZpbmUgIFJJTkdfQ1JFRElUX1NISUZUCQk4CisjZGVmaW5lICBSSU5HX0NSRURJVF9NQVNLCQkweGZmZmYKKworI2RlZmluZSBSSU5HX1BDUF9ERUlfVklECQkweDE4CisjZGVmaW5lICBSSU5HX1ZJRF9NQVNLCQkJMHg3ZmYKKyNkZWZpbmUgIFJJTkdfREVJCQkJKDEgPDwgMTIpCisjZGVmaW5lICBSSU5HX1BDUF9TSElGVAkJCTEzCisjZGVmaW5lICBSSU5HX1BDUF9NQVNLCQkJMHg3CisjZGVmaW5lICBSSU5HX1BLVF9TSVpFX0FESl9TSElGVAkxNgorI2RlZmluZSAgUklOR19QS1RfU0laRV9BREpfTUFTSwkJMHhmCisKKyNkZWZpbmUgVERNQV9ERVNDX1JJTkdfU0laRQkJMjgKKworLyogRGVmaW5pbml0aW9uIGZvciBhIGdpdmVuIFRYIHJpbmcgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRETUFfREVTQ19SSU5HX0JBU0UoaSkJCShURE1BX0RFU0NfUklOR18wMF9CQVNFICsgXAorCQkJCQkoKGkpICogVERNQV9ERVNDX1JJTkdfU0laRSkpCisKKy8qIFJpbmcgaW5kZXhlZCByZWdpc3RlciBhZGRyZXNlcyAqLworI2RlZmluZSBURE1BX0RFU0NfUklOR19IRUFEX1RBSUxfUFRSKGkpCShURE1BX0RFU0NfUklOR19CQVNFKGkpICsgXAorCQkJCQlSSU5HX0hFQURfVEFJTF9QVFIpCisjZGVmaW5lIFRETUFfREVTQ19SSU5HX0NPVU5UKGkpCQkoVERNQV9ERVNDX1JJTkdfQkFTRShpKSArIFwKKwkJCQkJUklOR19DT1VOVCkKKyNkZWZpbmUgVERNQV9ERVNDX1JJTkdfTUFYX0hZU1QoaSkJKFRETUFfREVTQ19SSU5HX0JBU0UoaSkgKyBcCisJCQkJCVJJTkdfTUFYX0hZU1QpCisjZGVmaW5lIFRETUFfREVTQ19SSU5HX0lOVFJfQ09OVFJPTChpKQkoVERNQV9ERVNDX1JJTkdfQkFTRShpKSArIFwKKwkJCQkJUklOR19JTlRSX0NPTlRST0wpCisjZGVmaW5lIFRETUFfREVTQ19SSU5HX1BST0RfQ09OU19JTkRFWChpKSBcCisJCQkJCShURE1BX0RFU0NfUklOR19CQVNFKGkpICsgXAorCQkJCQlSSU5HX1BST0RfQ09OU19JTkRFWCkKKyNkZWZpbmUgVERNQV9ERVNDX1JJTkdfTUFQUElORyhpKQkoVERNQV9ERVNDX1JJTkdfQkFTRShpKSArIFwKKwkJCQkJUklOR19NQVBQSU5HKQorI2RlZmluZSBURE1BX0RFU0NfUklOR19QQ1BfREVJX1ZJRChpKQkoVERNQV9ERVNDX1JJTkdfQkFTRShpKSArIFwKKwkJCQkJUklOR19QQ1BfREVJX1ZJRCkKKworI2RlZmluZSBURE1BX0NPTlRST0wJCQkweDYwMAorI2RlZmluZSAgVERNQV9FTgkJCSgxIDw8IDApCisjZGVmaW5lICBUU0JfRU4JCQkJKDEgPDwgMSkKKyNkZWZpbmUgIFRTQl9TV0FQCQkJKDEgPDwgMikKKyNkZWZpbmUgIEFDQl9BTEdPCQkJKDEgPDwgMykKKyNkZWZpbmUgIEJVRl9EQVRBX09GRlNFVF9TSElGVAkJNAorI2RlZmluZSAgQlVGX0RBVEFfT0ZGU0VUX01BU0sJCTB4M2ZmCisjZGVmaW5lICBWTEFOX0VOCQkJKDEgPDwgMTQpCisjZGVmaW5lICBTV19CUkNNX1RBRwkJCSgxIDw8IDE1KQorI2RlZmluZSAgV05DX0tQVF9TSVpFX1VQREFURQkJKDEgPDwgMTYpCisjZGVmaW5lICBTWU5DX1BLVF9TSVpFCQkJKDEgPDwgMTcpCisjZGVmaW5lICBBQ0hfVFhET05FX0RFTEFZX1NISUZUCQkxOAorI2RlZmluZSAgQUNIX1RYRE9ORV9ERUxBWV9NQVNLCQkweGZmCisKKyNkZWZpbmUgVERNQV9TVEFUVVMJCQkweDYwNAorI2RlZmluZSAgVERNQV9ESVNBQkxFRAkJCSgxIDw8IDApCisjZGVmaW5lICBURE1BX0xMX1JBTV9JTklUX0JVU1kJCSgxIDw8IDEpCisKKyNkZWZpbmUgVERNQV9TQ0JfQlVSU1RfU0laRQkJMHg2MDgKKyNkZWZpbmUgVERNQV9PVkVSX01BWF9USFJFU0hfU1RBVFVTCTB4NjBjCisjZGVmaW5lIFRETUFfT1ZFUl9IWVNUX1RIUkVTSF9TVEFUVVMJMHg2MTAKKyNkZWZpbmUgVERNQV9UUElECQkJMHg2MTQKKworI2RlZmluZSBURE1BX0ZSRUVfTElTVF9IRUFEX1RBSUxfUFRSCTB4NjE4CisjZGVmaW5lICBURE1BX0ZSRUVfSEVBRF9NQVNLCQkweDdmZgorI2RlZmluZSAgVERNQV9GUkVFX1RBSUxfU0hJRlQJCTExCisjZGVmaW5lICBURE1BX0ZSRUVfVEFJTF9NQVNLCQkweDdmZgorCisjZGVmaW5lIFRETUFfRlJFRV9MSVNUX0NPVU5UCQkweDYxYworI2RlZmluZSAgVERNQV9GUkVFX0xJU1RfQ09VTlRfTUFTSwkweDdmZgorCisjZGVmaW5lIFRETUFfVElFUjJfQVJCX0NUUkwJCTB4NjIwCisjZGVmaW5lICBURE1BX0FSQl9NT0RFX1JSCQkwCisjZGVmaW5lICBURE1BX0FSQl9NT0RFX1dFSUdIVF9SUgkweDEKKyNkZWZpbmUgIFRETUFfQVJCX01PREVfU1RSSUNUCQkweDIKKyNkZWZpbmUgIFRETUFfQVJCX01PREVfREVGSUNJVF9SUgkweDMKKyNkZWZpbmUgIFRETUFfQ1JFRElUX1NISUZUCQk0CisjZGVmaW5lICBURE1BX0NSRURJVF9NQVNLCQkweGZmZmYKKworI2RlZmluZSBURE1BX1RJRVIxX0FSQl8wX0NUUkwJCTB4NjI0CisjZGVmaW5lICBURE1BX0FSQl9FTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgVERNQV9USUVSMV9BUkJfMF9RVUVVRV9FTgkweDYyOAorI2RlZmluZSBURE1BX1RJRVIxX0FSQl8xX0NUUkwJCTB4NjJjCisjZGVmaW5lIFRETUFfVElFUjFfQVJCXzFfUVVFVUVfRU4JMHg2MzAKKyNkZWZpbmUgVERNQV9USUVSMV9BUkJfMl9DVFJMCQkweDYzNAorI2RlZmluZSBURE1BX1RJRVIxX0FSQl8yX1FVRVVFX0VOCTB4NjM4CisjZGVmaW5lIFRETUFfVElFUjFfQVJCXzNfQ1RSTAkJMHg2M2MKKyNkZWZpbmUgVERNQV9USUVSMV9BUkJfM19RVUVVRV9FTgkweDY0MAorCisjZGVmaW5lIFRETUFfU0NCX0VORElBTl9PVkVSUklERQkweDY0NAorI2RlZmluZSAgVERNQV9MRV9NT0RFCQkJKDEgPDwgMCkKKyNkZWZpbmUgIFRETUFfUkVHX01PREUJCQkoMSA8PCAxKQorCisjZGVmaW5lIFRETUFfVEVTVAkJCTB4NjQ4CisjZGVmaW5lICBURE1BX1RQX09VVF9TRUwJCSgxIDw8IDApCisjZGVmaW5lICBURE1BX01FTV9UTQkJCSgxIDw8IDEpCisKKyNkZWZpbmUgVERNQV9ERUJVRwkJCTB4NjRjCisKKy8qIFRyYW5zbWl0L1JlY2VpdmUgZGVzY3JpcHRvciAqLworc3RydWN0IGRtYV9kZXNjIHsKKwl1MzIJYWRkcl9zdGF0dXNfbGVuOworCXUzMglhZGRyX2xvOworfTsKKworLyogTnVtYmVyIG9mIFJlY2VpdmUgaGFyZHdhcmUgZGVzY3JpcHRvciB3b3JkcyAqLworI2RlZmluZSBOVU1fSFdfUlhfREVTQ19XT1JEUwkJMTAyNAorLyogUmVhbCBudW1iZXIgb2YgdXNhYmxlIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIE5VTV9SWF9ERVNDCQkJKE5VTV9IV19SWF9ERVNDX1dPUkRTIC8gV09SRFNfUEVSX0RFU0MpCisKKy8qIEludGVybmFsIGxpbmtlZC1saXN0IFJBTSBoYXMgdXAgdG8gMTUzNiBlbnRyaWVzICovCisjZGVmaW5lIE5VTV9UWF9ERVNDCQkJMTUzNgorCisjZGVmaW5lIFdPUkRTX1BFUl9ERVNDCQkJKHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpIC8gc2l6ZW9mKHUzMikpCisKKy8qIFJ4L1R4IGNvbW1vbiBjb3VudGVyIGdyb3VwLiovCitzdHJ1Y3QgYmNtX3N5c3BvcnRfcGt0X2NvdW50ZXJzIHsKKwl1MzIJY250XzY0OwkJLyogUk8gUmVjZWl2ZWQvVHJhbnNtaXRlZCA2NCBieXRlcyBwYWNrZXQgKi8KKwl1MzIJY250XzEyNzsJLyogUk8gUngvVHggMTI3IGJ5dGVzIHBhY2tldCAqLworCXUzMgljbnRfMjU1OwkvKiBSTyBSeC9UeCA2NS0yNTUgYnl0ZXMgcGFja2V0ICovCisJdTMyCWNudF81MTE7CS8qIFJPIFJ4L1R4IDI1Ni01MTEgYnl0ZXMgcGFja2V0ICovCisJdTMyCWNudF8xMDIzOwkvKiBSTyBSeC9UeCA1MTItMTAyMyBieXRlcyBwYWNrZXQgKi8KKwl1MzIJY250XzE1MTg7CS8qIFJPIFJ4L1R4IDEwMjQtMTUxOCBieXRlcyBwYWNrZXQgKi8KKwl1MzIJY250X21ndjsJLyogUk8gUngvVHggMTUxOS0xNTIyIGdvb2QgVkxBTiBwYWNrZXQgKi8KKwl1MzIJY250XzIwNDc7CS8qIFJPIFJ4L1R4IDE1MjItMjA0NyBieXRlcyBwYWNrZXQqLworCXUzMgljbnRfNDA5NTsJLyogUk8gUngvVHggMjA0OC00MDk1IGJ5dGVzIHBhY2tldCovCisJdTMyCWNudF85MjE2OwkvKiBSTyBSeC9UeCA0MDk2LTkyMTYgYnl0ZXMgcGFja2V0Ki8KK307CisKKy8qIFJTViwgUmVjZWl2ZSBTdGF0dXMgVmVjdG9yICovCitzdHJ1Y3QgYmNtX3N5c3BvcnRfcnhfY291bnRlcnMgeworCXN0cnVjdCAgYmNtX3N5c3BvcnRfcGt0X2NvdW50ZXJzIHBrdF9jbnQ7CisJdTMyCXBrdDsJCS8qIFJPICgweDQyOCkgUmVjZWl2ZWQgcGt0IGNvdW50Ki8KKwl1MzIJYnl0ZXM7CQkvKiBSTyBSZWNlaXZlZCBieXRlIGNvdW50ICovCisJdTMyCW1jYTsJCS8qIFJPICMgb2YgUmVjZWl2ZWQgbXVsdGljYXN0IHBrdCAqLworCXUzMgliY2E7CQkvKiBSTyAjIG9mIFJlY2VpdmUgYnJvYWRjYXN0IHBrdCAqLworCXUzMglmY3M7CQkvKiBSTyAjIG9mIFJlY2VpdmVkIEZDUyBlcnJvciAgKi8KKwl1MzIJY2Y7CQkvKiBSTyAjIG9mIFJlY2VpdmVkIGNvbnRyb2wgZnJhbWUgcGt0Ki8KKwl1MzIJcGY7CQkvKiBSTyAjIG9mIFJlY2VpdmVkIHBhdXNlIGZyYW1lIHBrdCAqLworCXUzMgl1bzsJCS8qIFJPICMgb2YgdW5rbm93biBvcCBjb2RlIHBrdCAqLworCXUzMglhbG47CQkvKiBSTyAjIG9mIGFsaWdubWVudCBlcnJvciBjb3VudCAqLworCXUzMglmbHI7CQkvKiBSTyAjIG9mIGZyYW1lIGxlbmd0aCBvdXQgb2YgcmFuZ2UgY291bnQgKi8KKwl1MzIJY2RlOwkJLyogUk8gIyBvZiBjb2RlIGVycm9yIHBrdCAqLworCXUzMglmY3I7CQkvKiBSTyAjIG9mIGNhcnJpZXIgc2Vuc2UgZXJyb3IgcGt0ICovCisJdTMyCW92cjsJCS8qIFJPICMgb2Ygb3ZlcnNpemUgcGt0Ki8KKwl1MzIJamJyOwkJLyogUk8gIyBvZiBqYWJiZXIgY291bnQgKi8KKwl1MzIJbXR1ZTsJCS8qIFJPICMgb2YgTVRVIGVycm9yIHBrdCovCisJdTMyCXBvazsJCS8qIFJPICMgb2YgUmVjZWl2ZWQgZ29vZCBwa3QgKi8KKwl1MzIJdWM7CQkvKiBSTyAjIG9mIHVuaWNhc3QgcGt0ICovCisJdTMyCXBwcDsJCS8qIFJPICMgb2YgUFBQIHBrdCAqLworCXUzMglyY3JjOwkJLyogUk8gKDB4NDcwKSwjIG9mIENSQyBtYXRjaCBwa3QgKi8KK307CisKKy8qIFRTViwgVHJhbnNtaXQgU3RhdHVzIFZlY3RvciAqLworc3RydWN0IGJjbV9zeXNwb3J0X3R4X2NvdW50ZXJzIHsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcGt0X2NvdW50ZXJzIHBrdF9jbnQ7CisJdTMyCXBrdHM7CQkvKiBSTyAoMHg0YTgpIFRyYW5zbWl0ZWQgcGt0ICovCisJdTMyCW1jYTsJCS8qIFJPICMgb2YgeG1pdGVkIG11bHRpY2FzdCBwa3QgKi8KKwl1MzIJYmNhOwkJLyogUk8gIyBvZiB4bWl0ZWQgYnJvYWRjYXN0IHBrdCAqLworCXUzMglwZjsJCS8qIFJPICMgb2YgeG1pdGVkIHBhdXNlIGZyYW1lIGNvdW50ICovCisJdTMyCWNmOwkJLyogUk8gIyBvZiB4bWl0ZWQgY29udHJvbCBmcmFtZSBjb3VudCAqLworCXUzMglmY3M7CQkvKiBSTyAjIG9mIHhtaXRlZCBGQ1MgZXJyb3IgY291bnQgKi8KKwl1MzIJb3ZyOwkJLyogUk8gIyBvZiB4bWl0ZWQgb3ZlcnNpemUgcGt0ICovCisJdTMyCWRyZjsJCS8qIFJPICMgb2YgeG1pdGVkIGRlZmVycmFsIHBrdCAqLworCXUzMgllZGY7CQkvKiBSTyAjIG9mIHhtaXRlZCBFeGNlc3NpdmUgZGVmZXJyYWwgcGt0Ki8KKwl1MzIJc2NsOwkJLyogUk8gIyBvZiB4bWl0ZWQgc2luZ2xlIGNvbGxpc2lvbiBwa3QgKi8KKwl1MzIJbWNsOwkJLyogUk8gIyBvZiB4bWl0ZWQgbXVsdGlwbGUgY29sbGlzaW9uIHBrdCovCisJdTMyCWxjbDsJCS8qIFJPICMgb2YgeG1pdGVkIGxhdGUgY29sbGlzaW9uIHBrdCAqLworCXUzMgllY2w7CQkvKiBSTyAjIG9mIHhtaXRlZCBleGNlc3NpdmUgY29sbGlzaW9uIHBrdCovCisJdTMyCWZyZzsJCS8qIFJPICMgb2YgeG1pdGVkIGZyYWdtZW50cyBwa3QqLworCXUzMgluY2w7CQkvKiBSTyAjIG9mIHhtaXRlZCB0b3RhbCBjb2xsaXNpb24gY291bnQgKi8KKwl1MzIJamJyOwkJLyogUk8gIyBvZiB4bWl0ZWQgamFiYmVyIGNvdW50Ki8KKwl1MzIJYnl0ZXM7CQkvKiBSTyAjIG9mIHhtaXRlZCBieXRlIGNvdW50ICovCisJdTMyCXBvazsJCS8qIFJPICMgb2YgeG1pdGVkIGdvb2QgcGt0ICovCisJdTMyCXVjOwkJLyogUk8gKDB4MHg0ZjApIyBvZiB4bWl0ZWQgdW5pdGNhc3QgcGt0ICovCit9OworCitzdHJ1Y3QgYmNtX3N5c3BvcnRfbWliIHsKKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcnhfY291bnRlcnMgcng7CisJc3RydWN0IGJjbV9zeXNwb3J0X3R4X2NvdW50ZXJzIHR4OworCXUzMiByeF9ydW50X2NudDsKKwl1MzIgcnhfcnVudF9mY3M7CisJdTMyIHJ4X3J1bnRfZmNzX2FsaWduOworCXUzMiByeF9ydW50X2J5dGVzOworCXUzMiByeGNoa19iYWRfY3N1bTsKKwl1MzIgcnhjaGtfb3RoZXJfcGt0X2Rpc2M7CisJdTMyIHJidWZfb3ZmbG93X2NudDsKKwl1MzIgcmJ1Zl9lcnJfY250OworfTsKKworLyogSFcgbWFpbnRhaW5zIGEgbGFyZ2UgbGlzdCBvZiBjb3VudGVycyAqLworZW51bSBiY21fc3lzcG9ydF9zdGF0X3R5cGUgeworCUJDTV9TWVNQT1JUX1NUQVRfTkVUREVWID0gLTEsCisJQkNNX1NZU1BPUlRfU1RBVF9NSUJfUlgsCisJQkNNX1NZU1BPUlRfU1RBVF9NSUJfVFgsCisJQkNNX1NZU1BPUlRfU1RBVF9SVU5ULAorCUJDTV9TWVNQT1JUX1NUQVRfUlhDSEssCisJQkNNX1NZU1BPUlRfU1RBVF9SQlVGLAorfTsKKworLyogTWFjcm9zIHRvIGhlbHAgZGVmaW5lIGV0aHRvb2wgc3RhdGlzdGljcyAqLworI2RlZmluZSBTVEFUX05FVERFVihtKSB7IFwKKwkuc3RhdF9zdHJpbmcgPSBfX3N0cmluZ2lmeShtKSwgXAorCS5zdGF0X3NpemVvZiA9IHNpemVvZigoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopMCktPm0pLCBcCisJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMsIG0pLCBcCisJLnR5cGUgPSBCQ01fU1lTUE9SVF9TVEFUX05FVERFViwgXAorfQorCisjZGVmaW5lIFNUQVRfTUlCKHN0ciwgbSwgX3R5cGUpIHsgXAorCS5zdGF0X3N0cmluZyA9IHN0ciwgXAorCS5zdGF0X3NpemVvZiA9IHNpemVvZigoKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICopMCktPm0pLCBcCisJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYsIG0pLCBcCisJLnR5cGUgPSBfdHlwZSwgXAorfQorCisjZGVmaW5lIFNUQVRfTUlCX1JYKHN0ciwgbSkgU1RBVF9NSUIoc3RyLCBtLCBCQ01fU1lTUE9SVF9TVEFUX01JQl9SWCkKKyNkZWZpbmUgU1RBVF9NSUJfVFgoc3RyLCBtKSBTVEFUX01JQihzdHIsIG0sIEJDTV9TWVNQT1JUX1NUQVRfTUlCX1RYKQorI2RlZmluZSBTVEFUX1JVTlQoc3RyLCBtKSBTVEFUX01JQihzdHIsIG0sIEJDTV9TWVNQT1JUX1NUQVRfUlVOVCkKKworI2RlZmluZSBTVEFUX1JYQ0hLKHN0ciwgbSwgb2ZzKSB7IFwKKwkuc3RhdF9zdHJpbmcgPSBzdHIsIFwKKwkuc3RhdF9zaXplb2YgPSBzaXplb2YoKChzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqKTApLT5tKSwgXAorCS5zdGF0X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2LCBtKSwgXAorCS50eXBlID0gQkNNX1NZU1BPUlRfU1RBVF9SWENISywgXAorCS5yZWdfb2Zmc2V0ID0gb2ZzLCBcCit9CisKKyNkZWZpbmUgU1RBVF9SQlVGKHN0ciwgbSwgb2ZzKSB7IFwKKwkuc3RhdF9zdHJpbmcgPSBzdHIsIFwKKwkuc3RhdF9zaXplb2YgPSBzaXplb2YoKChzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqKTApLT5tKSwgXAorCS5zdGF0X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2LCBtKSwgXAorCS50eXBlID0gQkNNX1NZU1BPUlRfU1RBVF9SQlVGLCBcCisJLnJlZ19vZmZzZXQgPSBvZnMsIFwKK30KKworc3RydWN0IGJjbV9zeXNwb3J0X3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHN0YXRfc2l6ZW9mOworCWludCBzdGF0X29mZnNldDsKKwllbnVtIGJjbV9zeXNwb3J0X3N0YXRfdHlwZSB0eXBlOworCS8qIHJlZyBvZmZzZXQgZnJvbSBVTUFDIGJhc2UgZm9yIG1pc2MgY291bnRlcnMgKi8KKwl1MTYgcmVnX29mZnNldDsKK307CisKKy8qIFNvZnR3YXJlIGhvdXNlIGtlZXBpbmcgaGVscGVyIHN0cnVjdHVyZSAqLworc3RydWN0IGJjbV9zeXNwb3J0X2NiIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwkJLyogU0tCIGZvciBSWCBwYWNrZXRzICovCisJdm9pZCBfX2lvbWVtCSpiZF9hZGRyOwkvKiBCdWZmZXIgZGVzY3JpcHRvciBQSFlTIGFkZHIgKi8KKworCURFRklORV9ETUFfVU5NQVBfQUREUihkbWFfYWRkcik7CisJREVGSU5FX0RNQV9VTk1BUF9MRU4oZG1hX2xlbik7Cit9OworCisvKiBTb2Z0d2FyZSB2aWV3IG9mIHRoZSBUWCByaW5nICovCitzdHJ1Y3QgYmNtX3N5c3BvcnRfdHhfcmluZyB7CisJc3BpbmxvY2tfdAlsb2NrOwkJLyogUmluZyBsb2NrIGZvciB0eCByZWNsYWltL3htaXQgKi8KKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsJLyogTkFQSSBwZXIgdHggcXVldWUgKi8KKwlkbWFfYWRkcl90CWRlc2NfZG1hOwkvKiBETUEgY29va2llICovCisJdW5zaWduZWQgaW50CWluZGV4OwkJLyogUmluZyBpbmRleCAqLworCXVuc2lnbmVkIGludAlzaXplOwkJLyogUmluZyBjdXJyZW50IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQJYWxsb2Nfc2l6ZTsJLyogUmluZyBvbmUtdGltZSBhbGxvY2F0ZWQgc2l6ZSAqLworCXVuc2lnbmVkIGludAlkZXNjX2NvdW50OwkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgKi8KKwl1bnNpZ25lZCBpbnQJY3Vycl9kZXNjOwkvKiBDdXJyZW50IGRlc2NyaXB0b3IgKi8KKwl1bnNpZ25lZCBpbnQJY19pbmRleDsJLyogTGFzdCBjb25zdW1lciBpbmRleCAqLworCXVuc2lnbmVkIGludAlwX2luZGV4OwkvKiBDdXJyZW50IHByb2R1Y2VyIGluZGV4ICovCisJc3RydWN0IGJjbV9zeXNwb3J0X2NiICpjYnM7CS8qIFRyYW5zbWl0IGNvbnRyb2wgYmxvY2tzICovCisJc3RydWN0IGRtYV9kZXNjCSpkZXNjX2NwdTsJLyogQ1BVIHZpZXcgb2YgdGhlIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdjsJLyogcHJpdmF0ZSBjb250ZXh0IGJhY2twb2ludGVyICovCit9OworCisvKiBEcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21fc3lzcG9ydF9wcml2IHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXUzMgkJCWlycTBfc3RhdDsKKwl1MzIJCQlpcnEwX21hc2s7CisJdTMyCQkJaXJxMV9zdGF0OworCXUzMgkJCWlycTFfbWFzazsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCWludAkJCWlycTA7CisJaW50CQkJaXJxMTsKKworCS8qIFRyYW5zbWl0IHJpbmdzICovCisJc3RydWN0IGJjbV9zeXNwb3J0X3R4X3JpbmcgdHhfcmluZ3NbVERNQV9OVU1fUklOR1NdOworCisJLyogUmVjZWl2ZSBxdWV1ZSAqLworCXZvaWQgX19pb21lbQkJKnJ4X2JkczsKKwl2b2lkIF9faW9tZW0JCSpyeF9iZF9hc3NpZ25fcHRyOworCXVuc2lnbmVkIGludAkJcnhfYmRfYXNzaWduX2luZGV4OworCXN0cnVjdCBiY21fc3lzcG9ydF9jYgkqcnhfY2JzOworCXVuc2lnbmVkIGludAkJbnVtX3J4X2JkczsKKwl1bnNpZ25lZCBpbnQJCXJ4X3JlYWRfcHRyOworCXVuc2lnbmVkIGludAkJcnhfY19pbmRleDsKKworCS8qIFBIWSBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKnBoeV9kbjsKKwlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5ZGV2OworCXBoeV9pbnRlcmZhY2VfdAkJcGh5X2ludGVyZmFjZTsKKwlpbnQJCQlvbGRfcGF1c2U7CisJaW50CQkJb2xkX2xpbms7CisJaW50CQkJb2xkX2R1cGxleDsKKworCS8qIE1pc2MgZmllbGRzICovCisJdW5zaWduZWQgaW50CQlyeF9jc3VtX2VuOjE7CisJdW5zaWduZWQgaW50CQl0c2JfZW46MTsKKwl1bnNpZ25lZCBpbnQJCWNyY19md2Q6MTsKKwl1MTYJCQlyZXY7CisKKwkvKiBNSUIgcmVsYXRlZCBmaWVsZHMgKi8KKwlzdHJ1Y3QgYmNtX3N5c3BvcnRfbWliCW1pYjsKKworCS8qIEV0aHRvb2wgKi8KKwl1MzIJCQltc2dfZW5hYmxlOworfTsKKyNlbmRpZiAvKiBfX0JDTV9TWVNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jCmluZGV4IDAyOTdhNzkuLjA1YzZhZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYwpAQCAtMTQzNiw3ICsxNDM2LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbmV0X2Rldi0+bmV0ZGV2X29wcyA9ICZiZ21hY19uZXRkZXZfb3BzOwogCW5ldF9kZXYtPmlycSA9IGNvcmUtPmlycTsKLQlTRVRfRVRIVE9PTF9PUFMobmV0X2RldiwgJmJnbWFjX2V0aHRvb2xfb3BzKTsKKwluZXRfZGV2LT5ldGh0b29sX29wcyA9ICZiZ21hY19ldGh0b29sX29wczsKIAliZ21hYyA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCWJnbWFjLT5uZXRfZGV2ID0gbmV0X2RldjsKIAliZ21hYy0+Y29yZSA9IGNvcmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKaW5kZXggMGFiODM3MC4uNjdkMmIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYwpAQCAtNjkxNiw4ICs2OTE2LDggQEAKIAkJfQogCX0KIAllbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgLTEpOwotCQljbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF9VTktOT1dOKTsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJwLT5waHlfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeC5oCmluZGV4IDRkOGY4YWIuLjRjYWIwOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnguaApAQCAtNiw3ICs2LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKICAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5jCmluZGV4IGRkNTdjN2MuLjQ3YzU4MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uYwpAQCAtNiw3ICs2LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKICAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgogICogVURQIENTVU0gZXJyYXRhIHdvcmthcm91bmQgYnkgQXJpayBHZW5kZWxtYW4KQEAgLTkwNiw2ICs5MDYsMTggQEAKIAkJYmRfcHJvZCA9IFJYX0JEKGJkX3Byb2QpOwogCQliZF9jb25zID0gUlhfQkQoYmRfY29ucyk7CiAKKwkJLyogQSBybWIoKSBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgQ1FFIGlzIG5vdCByZWFkCisJCSAqIGJlZm9yZSBpdCBpcyB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyIERNQS4gIFBDSSBvcmRlcmluZworCQkgKiBydWxlcyB3aWxsIG1ha2Ugc3VyZSB0aGUgb3RoZXIgZmllbGRzIGFyZSB3cml0dGVuIGJlZm9yZQorCQkgKiB0aGUgbWFya2VyIGF0IHRoZSBlbmQgb2Ygc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlCisJCSAqIGJ1dCB3aXRob3V0IHJtYigpIGEgd2Vha2x5IG9yZGVyZWQgcHJvY2Vzc29yIGNhbiBwcm9jZXNzCisJCSAqIHN0YWxlIGRhdGEuICBXaXRob3V0IHRoZSBiYXJyaWVyIFRQQSBzdGF0ZS1tYWNoaW5lIG1pZ2h0CisJCSAqIGVudGVyIGluY29uc2lzdGVudCBzdGF0ZSBhbmQga2VybmVsIHN0YWNrIG1pZ2h0IGJlCisJCSAqIHByb3ZpZGVkIHdpdGggaW5jb3JyZWN0IHBhY2tldCBkZXNjcmlwdGlvbiAtIHRoZXNlIGxlYWQKKwkJICogdG8gdmFyaW91cyBrZXJuZWwgY3Jhc2hlZC4KKwkJICovCisJCXJtYigpOworCiAJCWNxZV9mcF9mbGFncyA9IGNxZV9mcC0+dHlwZV9lcnJvcl9mbGFnczsKIAkJY3FlX2ZwX3R5cGUgPSBjcWVfZnBfZmxhZ3MgJiBFVEhfRkFTVF9QQVRIX1JYX0NRRV9UWVBFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCmluZGV4IDM0NDhjYzAuLjU3MTQyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCkBAIC02LDcgKzYsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgogICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCiAgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9kY2IuYwppbmRleCA5N2VhNTQyLi41MWE5NTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9kY2IuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9kY2IuYwpAQCAtMTIsNyArMTIsNyBAQAogICogbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yIHdyaXR0ZW4KICAqIGNvbnNlbnQuCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogRG1pdHJ5IEtyYXZrb3YKICAqCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2RjYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKaW5kZXggODA0YjhmNi4uYzY5MzllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKQEAgLTEyLDcgKzEyLDcgQEAKICAqIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvciB3cml0dGVuCiAgKiBjb25zZW50LgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqIFdyaXR0ZW4gYnk6IERtaXRyeSBLcmF2a292CiAgKgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMKaW5kZXggYjZkZTA1ZS4uYmQwNjAwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2V0aHRvb2wuYwpAQCAtNiw3ICs2LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKICAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgogICogVURQIENTVU0gZXJyYXRhIHdvcmthcm91bmQgYnkgQXJpayBHZW5kZWxtYW4KQEAgLTMzMTYsNyArMzMxNiw3IEBACiAJcmV0dXJuIFRfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkU7CiB9CiAKLXN0YXRpYyBpbnQgYm54MnhfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICppbmRpcikKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICppbmRpciwgdTggKmtleSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBpbmRfdGFibGVbVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRV0gPSB7MH07CkBAIC0zMzQwLDE0ICszMzQwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYm54Mnhfc2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTMyICppbmRpcikKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTMyICppbmRpciwKKwkJCSAgY29uc3QgdTggKmtleSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOyBpKyspIHsKIAkJLyoKLQkJICogVGhlIHNhbWUgYXMgaW4gYm54MnhfZ2V0X3J4ZmhfaW5kaXI6IHdlIGNhbid0IHVzZSBhIG1lbWNweSgpCisJCSAqIFRoZSBzYW1lIGFzIGluIGJueDJ4X2dldF9yeGZoOiB3ZSBjYW4ndCB1c2UgYSBtZW1jcHkoKQogCQkgKiBhcyBhbiBpbnRlcm5hbCBzdG9yYWdlIG9mIGFuIGluZGlyZWN0aW9uIHRhYmxlIGlzIGEgdTggYXJyYXkKIAkJICogd2hpbGUgaW5kaXItPnJpbmdfaW5kZXggcG9pbnRzIHRvIGFuIGFycmF5IG9mIHUzMi4KIAkJICoKQEAgLTM0NzEsOCArMzQ3Miw4IEBACiAJLmdldF9yeG5mYwkJPSBibngyeF9nZXRfcnhuZmMsCiAJLnNldF9yeG5mYwkJPSBibngyeF9zZXRfcnhuZmMsCiAJLmdldF9yeGZoX2luZGlyX3NpemUJPSBibngyeF9nZXRfcnhmaF9pbmRpcl9zaXplLAotCS5nZXRfcnhmaF9pbmRpcgkJPSBibngyeF9nZXRfcnhmaF9pbmRpciwKLQkuc2V0X3J4ZmhfaW5kaXIJCT0gYm54Mnhfc2V0X3J4ZmhfaW5kaXIsCisJLmdldF9yeGZoCQk9IGJueDJ4X2dldF9yeGZoLAorCS5zZXRfcnhmaAkJPSBibngyeF9zZXRfcnhmaCwKIAkuZ2V0X2NoYW5uZWxzCQk9IGJueDJ4X2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzCQk9IGJueDJ4X3NldF9jaGFubmVscywKIAkuZ2V0X21vZHVsZV9pbmZvCT0gYm54MnhfZ2V0X21vZHVsZV9pbmZvLApAQCAtMzQ5OCwxNiArMzQ5OSwxNCBAQAogCS5nZXRfcnhuZmMJCT0gYm54MnhfZ2V0X3J4bmZjLAogCS5zZXRfcnhuZmMJCT0gYm54Mnhfc2V0X3J4bmZjLAogCS5nZXRfcnhmaF9pbmRpcl9zaXplCT0gYm54MnhfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKLQkuZ2V0X3J4ZmhfaW5kaXIJCT0gYm54MnhfZ2V0X3J4ZmhfaW5kaXIsCi0JLnNldF9yeGZoX2luZGlyCQk9IGJueDJ4X3NldF9yeGZoX2luZGlyLAorCS5nZXRfcnhmaAkJPSBibngyeF9nZXRfcnhmaCwKKwkuc2V0X3J4ZmgJCT0gYm54Mnhfc2V0X3J4ZmgsCiAJLmdldF9jaGFubmVscwkJPSBibngyeF9nZXRfY2hhbm5lbHMsCiAJLnNldF9jaGFubmVscwkJPSBibngyeF9zZXRfY2hhbm5lbHMsCiB9OwogCiB2b2lkIGJueDJ4X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCWlmIChJU19QRihicCkpCi0JCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZibngyeF9ldGh0b29sX29wcyk7Ci0JZWxzZSAvKiB2ZiAqLwotCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYm54MnhfdmZfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAoSVNfUEYoYnApKSA/CisJCSZibngyeF9ldGh0b29sX29wcyA6ICZibngyeF92Zl9ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Z3X2ZpbGVfaGRyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9md19maWxlX2hkci5oCmluZGV4IGY1NzJhZTEuLjhhYWZkOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Z3X2ZpbGVfaGRyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZndfZmlsZV9oZHIuaApAQCAtNiw4ICs2LDggQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+Ci0gKiBXcml0dGVuIGJ5OiBWbGFkaXNsYXYgWm9sb3Rhcm92IDx2bGFkekBicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IFZsYWRpc2xhdiBab2xvdGFyb3YKICAqIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpZGVhIG9mIEpvaG4gV3JpZ2h0IDxqb2huLndyaWdodEBocC5jb20+LgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXQuaAppbmRleCBjMmRmZWE3Li5iZDkwZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9pbml0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaW5pdC5oCkBAIC03LDkgKzcsOSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgotICogTW9kaWZpZWQgYnk6IFZsYWRpc2xhdiBab2xvdGFyb3YgPHZsYWR6QGJyb2FkY29tLmNvbT4KKyAqIE1vZGlmaWVkIGJ5OiBWbGFkaXNsYXYgWm9sb3Rhcm92CiAgKi8KIAogI2lmbmRlZiBCTlgyWF9JTklUX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXRfb3BzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9pbml0X29wcy5oCmluZGV4IDhhYjBkZDkuLjU2NjllZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXRfb3BzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaW5pdF9vcHMuaApAQCAtOCw4ICs4LDggQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+Ci0gKiBXcml0dGVuIGJ5OiBWbGFkaXNsYXYgWm9sb3Rhcm92IDx2bGFkekBicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IFZsYWRpc2xhdiBab2xvdGFyb3YKICAqLwogCiAjaWZuZGVmIEJOWDJYX0lOSVRfT1BTX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuYwppbmRleCA5YjZiM2Q3Li41M2ZiNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9saW5rLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbGluay5jCkBAIC0yMjE4LDcgKzIyMTgsNiBAQAogCSAqLwogCXUzMiB2YWw7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JaW50IGJueDJ4X3N0YXR1cyA9IDA7CiAJdTggYm1hY19sb29wYmFjayA9IChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfQk1BQyk7CiAKIAlpZiAocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmIEZFQVRVUkVfQ09ORklHX1BGQ19FTkFCTEVEKQpAQCAtMjIzMiw3ICsyMjMxLDcgQEAKIAlibngyeF91cGRhdGVfcGZjX25pZyhwYXJhbXMsIHZhcnMsIHBmY19wYXJhbXMpOwogCiAJaWYgKCF2YXJzLT5saW5rX3VwKQotCQlyZXR1cm4gYm54Mnhfc3RhdHVzOworCQlyZXR1cm4gMDsKIAogCURQKE5FVElGX01TR19MSU5LLCAiQWJvdXQgdG8gdXBkYXRlIFBGQyBpbiBCTUFDXG4iKTsKIApAQCAtMjI0Niw3ICsyMjQ1LDcgQEAKIAkJICAgID09IDApIHsKIAkJCURQKE5FVElGX01TR19MSU5LLCAiQWJvdXQgdG8gdXBkYXRlIFBGQyBpbiBFTUFDXG4iKTsKIAkJCWJueDJ4X2VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0JCQlyZXR1cm4gYm54Mnhfc3RhdHVzOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKENISVBfSVNfRTIoYnApKQogCQkJYm54MnhfdXBkYXRlX3BmY19ibWFjMihwYXJhbXMsIHZhcnMsIGJtYWNfbG9vcGJhY2spOwpAQCAtMjI2MCw3ICsyMjU5LDcgQEAKIAkJCXZhbCA9IDE7CiAJCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwYXJhbXMtPnBvcnQqNCwgdmFsKTsKIAl9Ci0JcmV0dXJuIGJueDJ4X3N0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBibngyeF9ibWFjMV9lbmFibGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCkBAIC0zNzAzLDcgKzM3MDIsOCBAQAogc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfZW5hYmxlX0FOX0tSKHN0cnVjdCBibngyeF9waHkgKnBoeSwKIAkJCQkJc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJCXN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpIHsKLQl1MTYgbGFuZSwgaSwgY2w3Ml9jdHJsLCBhbl9hZHYgPSAwOworCXUxNiBsYW5lLCBpLCBjbDcyX2N0cmwsIGFuX2FkdiA9IDAsIHZhbDsKKwl1MzIgd2NfbGFuZV9jb25maWc7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJc3RhdGljIHN0cnVjdCBibngyeF9yZWdfc2V0IHJlZ19zZXRbXSA9IHsKIAkJe01ESU9fV0NfREVWQUQsIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwgMHg3fSwKQEAgLTM4MjIsMTUgKzM4MjIsMjcgQEAKIAkJLyogRW5hYmxlIEF1dG8tRGV0ZWN0IHRvIHN1cHBvcnQgMUcgb3ZlciBDTDM3IGFzIHdlbGwgKi8KIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAogCQkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDEsIDB4MTApOwotCisJCXdjX2xhbmVfY29uZmlnID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KKwkJCQkJc2hhcmVkX2h3X2NvbmZpZy53Y19sYW5lX2NvbmZpZykpOworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19SWDBfUENJX0NUUkwgKyAobGFuZSA8PCA0KSwgJnZhbCk7CiAJCS8qIEZvcmNlIGNsNDggc3luY19zdGF0dXMgTE9XIHRvIGF2b2lkIGdldHRpbmcgc3R1Y2sgaW4gQ0w3MwogCQkgKiBwYXJhbGxlbC1kZXRlY3QgbG9vcCB3aGVuIENMNzMgYW5kIENMMzcgYXJlIGVuYWJsZWQuCiAJCSAqLwotCQlDTDIyX1dSX09WRVJfQ0w0NShicCwgcGh5LCBNRElPX1JFR19CQU5LX0FFUl9CTE9DSywKLQkJCQkgIE1ESU9fQUVSX0JMT0NLX0FFUl9SRUcsIDApOworCQl2YWwgfD0gMSA8PCAxMTsKKworCQkvKiBSZXN0b3JlIFBvbGFyaXR5IHNldHRpbmdzIGluIGNhc2UgaXQgd2FzIHJ1biBvdmVyIGJ5CisJCSAqIHByZXZpb3VzIGxpbmsgb3duZXIKKwkJICovCisJCWlmICh3Y19sYW5lX2NvbmZpZyAmCisJCSAgICAoU0hBUkVEX0hXX0NGR19SWF9MQU5FMF9QT0xfRkxJUF9FTkFCTEVEIDw8IGxhbmUpKQorCQkJdmFsIHw9IDMgPDwgMjsKKwkJZWxzZQorCQkJdmFsICY9IH4oMyA8PCAyKTsKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAotCQkJCSBNRElPX1dDX1JFR19SWEJfQU5BX1JYX0NPTlRST0xfUENJLCAweDA4MDApOwotCQlibngyeF9zZXRfYWVyX21tZChwYXJhbXMsIHBoeSk7CisJCQkJIE1ESU9fV0NfUkVHX1JYMF9QQ0lfQ1RSTCArIChsYW5lIDw8IDQpLAorCQkJCSB2YWwpOwogCiAJCWJueDJ4X2Rpc2FibGVfa3IyKHBhcmFtcywgdmFycywgcGh5KTsKIAl9CkBAIC02NDczLDcgKzY0ODUsNiBAQAogc3RhdGljIGludCBibngyeF9saW5rX2luaXRpYWxpemUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7Ci0JaW50IHJjID0gMDsKIAl1OCBwaHlfaW5kZXgsIG5vbl9leHRfcGh5OwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCS8qIEluIGNhc2Ugb2YgZXh0ZXJuYWwgcGh5IGV4aXN0ZW5jZSwgdGhlIGxpbmUgc3BlZWQgd291bGQgYmUgdGhlCkBAIC02NTQ2LDcgKzY1NTcsNyBAQAogCQkJTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVUyB8CiAJCQlOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMgfAogCQkJTklHX01BU0tfTUlfSU5UKSk7Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9pbnRfbGlua19yZXNldChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCkBAIC0xMjQ2MSw2ICsxMjQ3Miw3IEBACiAJdTMyIGRvbnRfY2xlYXJfc3RhdCwgbGZhX3N0czsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAorCWJueDJ4X3NldF9tZGlvX2VtYWNfcGVyX3BoeShicCwgcGFyYW1zKTsKIAkvKiBTeW5jIHRoZSBsaW5rIHBhcmFtZXRlcnMgKi8KIAlibngyeF9saW5rX3N0YXR1c191cGRhdGUocGFyYW1zLCB2YXJzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCmluZGV4IDNhOGU1MWUuLjI4ODcwMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKQEAgLTYsNyArNiw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogTWFpbnRhaW5lZCBieTogQXJpZWwgRWxpb3IgPGFyaWVsLmVsaW9yQHFsb2dpYy5jb20+CiAgKiBXcml0dGVuIGJ5OiBFbGllemVyIFRhbWlyCiAgKiBCYXNlZCBvbiBjb2RlIGZyb20gTWljaGFlbCBDaGFuJ3MgYm54MiBkcml2ZXIKICAqIFVEUCBDU1VNIGVycmF0YSB3b3JrYXJvdW5kIGJ5IEFyaWsgR2VuZGVsbWFuCkBAIC0xMDA1Myw2ICsxMDA1MywyNCBAQAogI2RlZmluZSBCQ01fNTcxMF9VTkRJX0ZXX01GX1ZFUlMJKDB4MDUpCiAjZGVmaW5lIEJOWDJYX1BSRVZfVU5ESV9NRl9QT1JUKHApIChCQVJfVFNUUk9STV9JTlRNRU0gKyAweDE1MGMgKyAoKHApIDw8IDQpKQogI2RlZmluZSBCTlgyWF9QUkVWX1VORElfTUZfRlVOQyhmKSAoQkFSX1RTVFJPUk1fSU5UTUVNICsgMHgxODRjICsgKChmKSA8PCA0KSkKKworc3RhdGljIGJvb2wgYm54MnhfcHJldl9pc19hZnRlcl91bmRpKHN0cnVjdCBibngyeCAqYnApCit7CisJLyogVU5ESSBtYXJrcyBpdHMgcHJlc2VuY2UgaW4gRE9SUSAtCisJICogaXQgaW5pdGlhbGl6ZXMgQ0lEIG9mZnNldCBmb3Igbm9ybWFsIGJlbGwgdG8gMHg3CisJICovCisJaWYgKCEoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMSkgJgorCSAgICBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9SU1RfRE9SUSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChSRUdfUkQoYnAsIERPUlFfUkVHX05PUk1fQ0lEX09GU1QpID09IDB4NykgeworCQlCTlgyWF9ERVZfSU5GTygiVU5ESSBwcmV2aW91c2x5IGxvYWRlZFxuIik7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGJvb2wgYm54MnhfcHJldl91bmxvYWRfdW5kaV9md19zdXBwb3J0c19tZihzdHJ1Y3QgYm54MnggKmJwKQogewogCXU4IG1ham9yLCBtaW5vciwgdmVyc2lvbjsKQEAgLTEwMzAyLDYgKzEwMzIwLDEwIEBACiAKIAlCTlgyWF9ERVZfSU5GTygiUGF0aCBpcyB1bm1hcmtlZFxuIik7CiAKKwkvKiBDYW5ub3QgcHJvY2VlZCB3aXRoIEZMUiBpZiBVTkRJIGlzIGxvYWRlZCwgc2luY2UgRlcgZG9lcyBub3QgbWF0Y2ggKi8KKwlpZiAoYm54MnhfcHJldl9pc19hZnRlcl91bmRpKGJwKSkKKwkJZ290byBvdXQ7CisKIAkvKiBJZiBmdW5jdGlvbiBoYXMgRkxSIGNhcGFiaWxpdGllcywgYW5kIGV4aXN0aW5nIEZXIHZlcnNpb24gbWF0Y2hlcwogCSAqIHRoZSBvbmUgcmVxdWlyZWQsIHRoZW4gRkxSIHdpbGwgYmUgc3VmZmljaWVudCB0byBjbGVhbiBhbnkgcmVzaWR1ZQogCSAqIGxlZnQgYnkgcHJldmlvdXMgZHJpdmVyCkBAIC0xMDMyMiw2ICsxMDM0NCw3IEBACiAKIAlCTlgyWF9ERVZfSU5GTygiQ291bGQgbm90IEZMUlxuIik7CiAKK291dDoKIAkvKiBDbG9zZSB0aGUgTUNQIHJlcXVlc3QsIHJldHVybiBmYWlsdXJlKi8KIAlyYyA9IGJueDJ4X3ByZXZfbWNwX2RvbmUoYnApOwogCWlmICghcmMpCkBAIC0xMDM2MCwxOSArMTAzODMsMTMgQEAKIAkJLyogY2xvc2UgTExIIGZpbHRlcnMgdG93YXJkcyB0aGUgQlJCICovCiAJCWJueDJ4X3NldF9yeF9maWx0ZXIoJmJwLT5saW5rX3BhcmFtcywgMCk7CiAKLQkJLyogQ2hlY2sgaWYgdGhlIFVOREkgZHJpdmVyIHdhcyBwcmV2aW91c2x5IGxvYWRlZAotCQkgKiBVTkRJIGRyaXZlciBpbml0aWFsaXplcyBDSUQgb2Zmc2V0IGZvciBub3JtYWwgYmVsbCB0byAweDcKLQkJICovCi0JCWlmIChyZXNldF9yZWcgJiBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9SU1RfRE9SUSkgewotCQkJdG1wX3JlZyA9IFJFR19SRChicCwgRE9SUV9SRUdfTk9STV9DSURfT0ZTVCk7Ci0JCQlpZiAodG1wX3JlZyA9PSAweDcpIHsKLQkJCQlCTlgyWF9ERVZfSU5GTygiVU5ESSBwcmV2aW91c2x5IGxvYWRlZFxuIik7Ci0JCQkJcHJldl91bmRpID0gdHJ1ZTsKLQkJCQkvKiBjbGVhciB0aGUgVU5ESSBpbmRpY2F0aW9uICovCi0JCQkJUkVHX1dSKGJwLCBET1JRX1JFR19OT1JNX0NJRF9PRlNULCAwKTsKLQkJCQkvKiBjbGVhciBwb3NzaWJsZSBpZGxlIGNoZWNrIGVycm9ycyAqLwotCQkJCVJFR19SRChicCwgTklHX1JFR19OSUdfSU5UX1NUU19DTFJfMCk7Ci0JCQl9CisJCS8qIENoZWNrIGlmIHRoZSBVTkRJIGRyaXZlciB3YXMgcHJldmlvdXNseSBsb2FkZWQgKi8KKwkJaWYgKGJueDJ4X3ByZXZfaXNfYWZ0ZXJfdW5kaShicCkpIHsKKwkJCXByZXZfdW5kaSA9IHRydWU7CisJCQkvKiBjbGVhciB0aGUgVU5ESSBpbmRpY2F0aW9uICovCisJCQlSRUdfV1IoYnAsIERPUlFfUkVHX05PUk1fQ0lEX09GU1QsIDApOworCQkJLyogY2xlYXIgcG9zc2libGUgaWRsZSBjaGVjayBlcnJvcnMgKi8KKwkJCVJFR19SRChicCwgTklHX1JFR19OSUdfSU5UX1NUU19DTFJfMCk7CiAJCX0KIAkJaWYgKCFDSElQX0lTX0UxeChicCkpCiAJCQkvKiBibG9jayBGVyBmcm9tIHdyaXRpbmcgdG8gaG9zdCAqLwpAQCAtMTMyODMsOCArMTMzMDAsOCBAQAogCW5ldGRldl9yZXNldF90YyhicC0+ZGV2KTsKIAogCWRlbF90aW1lcl9zeW5jKCZicC0+dGltZXIpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmJwLT5zcF90YXNrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kX3Rhc2spOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnAtPnNwX3Rhc2spOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnAtPnBlcmlvZF90YXNrKTsKIAogCXNwaW5fbG9ja19iaCgmYnAtPnN0YXRzX2xvY2spOwogCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKaW5kZXggZDcyNTMxN2MuLmIxOTM2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYwpAQCAtMTIsNyArMTIsNyBAQAogICogbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yIHdyaXR0ZW4KICAqIGNvbnNlbnQuCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogVmxhZGlzbGF2IFpvbG90YXJvdgogICoKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmgKaW5kZXggODBmNmM3OS4uNzE4ZWNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oCkBAIC0xMiw3ICsxMiw3IEBACiAgKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgogICogY29uc2VudC4KICAqCi0gKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogTWFpbnRhaW5lZCBieTogQXJpZWwgRWxpb3IgPGFyaWVsLmVsaW9yQHFsb2dpYy5jb20+CiAgKiBXcml0dGVuIGJ5OiBWbGFkaXNsYXYgWm9sb3Rhcm92CiAgKgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYwppbmRleCBmYWYwMTQ4Li5lZGE4NTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKQEAgLTEyLDkgKzEyLDkgQEAKICAqIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvciB3cml0dGVuCiAgKiBjb25zZW50LgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+Ci0gKiBXcml0dGVuIGJ5OiBTaG11bGlrIFJhdmlkIDxzaG11bGlrckBicm9hZGNvbS5jb20+Ci0gKgkgICAgICAgQXJpZWwgRWxpb3IgPGFyaWVsZUBicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IFNobXVsaWsgUmF2aWQKKyAqCSAgICAgICBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqCiAgKi8KICNpbmNsdWRlICJibngyeC5oIgpAQCAtMTA3MSw4ICsxMDcxLDEwIEBACiAJUkVHX1dSKGJwLCBET1JRX1JFR19WRl9UWVBFX01JTl9NQ0lEXzAsIDApOwogCVJFR19XUihicCwgRE9SUV9SRUdfVkZfVFlQRV9NQVhfTUNJRF8wLCAweDFmZmZmKTsKIAotCS8qIHNldCB0aGUgVkYgZG9vcmJlbGwgdGhyZXNob2xkICovCi0JUkVHX1dSKGJwLCBET1JRX1JFR19WRl9VU0FHRV9DVF9MSU1JVCwgNCk7CisJLyogc2V0IHRoZSBWRiBkb29yYmVsbCB0aHJlc2hvbGQuIFRoaXMgdGhyZXNob2xkIHJlcHJlc2VudHMgdGhlIGFtb3VudAorCSAqIG9mIGRvb3JiZWxscyBhbGxvd2VkIGluIHRoZSBtYWluIERPUlEgZmlmbyBmb3IgYSBzcGVjaWZpYyBWRi4KKwkgKi8KKwlSRUdfV1IoYnAsIERPUlFfUkVHX1ZGX1VTQUdFX0NUX0xJTUlULCA2NCk7CiB9CiAKIHZvaWQgYm54MnhfaW92X2luaXRfZG1hZShzdHJ1Y3QgYm54MnggKmJwKQpAQCAtMjU3Niw3ICsyNTc4LDggQEAKIAogCWl2aS0+dmYgPSB2ZmlkeDsKIAlpdmktPnFvcyA9IDA7Ci0JaXZpLT50eF9yYXRlID0gMTAwMDA7IC8qIGFsd2F5cyAxMEcuIFRCQSB0YWtlIGZyb20gbGluayBzdHJ1Y3QgKi8KKwlpdmktPm1heF90eF9yYXRlID0gMTAwMDA7IC8qIGFsd2F5cyAxMEcuIFRCQSB0YWtlIGZyb20gbGluayBzdHJ1Y3QgKi8KKwlpdmktPm1pbl90eF9yYXRlID0gMDsKIAlpdmktPnNwb29mY2hrID0gMTsgLyphbHdheXMgZW5hYmxlZCAqLwogCWlmICh2Zi0+c3RhdGUgPT0gVkZfRU5BQkxFRCkgewogCQkvKiBtYWMgYW5kIHZsYW4gYXJlIGluIHZsYW5fbWFjIG9iamVjdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5oCmluZGV4IDY5MjlhZGIuLjk2YzU3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuaApAQCAtMTIsOSArMTIsOSBAQAogICogbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yIHdyaXR0ZW4KICAqIGNvbnNlbnQuCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KLSAqIFdyaXR0ZW4gYnk6IFNobXVsaWsgUmF2aWQgPHNobXVsaWtyQGJyb2FkY29tLmNvbT4KLSAqCSAgICAgICBBcmllbCBFbGlvciA8YXJpZWxlQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgorICogV3JpdHRlbiBieTogU2htdWxpayBSYXZpZAorICoJICAgICAgIEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICovCiAjaWZuZGVmIEJOWDJYX1NSSU9WX0gKICNkZWZpbmUgQk5YMlhfU1JJT1ZfSApAQCAtNTcxLDcgKzU3MSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF92Zl9wY2lfZGVhbGxvYyhzdHJ1Y3QgYm54MiAqYnApIHtyZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3ZmX3BjaV9kZWFsbG9jKHN0cnVjdCBibngyeCAqYnApIHt9CiBzdGF0aWMgaW5saW5lIGludCBibngyeF92Zl9wY2lfYWxsb2Moc3RydWN0IGJueDJ4ICpicCkge3JldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcGZfc2V0X3Zmc192bGFuKHN0cnVjdCBibngyeCAqYnApIHt9CiBzdGF0aWMgaW5saW5lIGludCBibngyeF9zcmlvdl9jb25maWd1cmUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG51bV92ZnMpIHtyZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmMKaW5kZXggM2I3NTA3MC4uY2E0NzY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5jCkBAIC02LDcgKzYsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgogICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCiAgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmgKaW5kZXggZjM1ODQ1MC4uMmJlY2VhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5oCkBAIC02LDcgKzYsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIE1haW50YWluZWQgYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgogICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCiAgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfdmZwZi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfdmZwZi5jCmluZGV4IDc4NGM3MTUuLmQ3MTJkMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3ZmcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF92ZnBmLmMKQEAgLTEyLDkgKzEyLDkgQEAKICAqIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvciB3cml0dGVuCiAgKiBjb25zZW50LgogICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+Ci0gKiBXcml0dGVuIGJ5OiBTaG11bGlrIFJhdmlkIDxzaG11bGlrckBicm9hZGNvbS5jb20+Ci0gKgkgICAgICAgQXJpZWwgRWxpb3IgPGFyaWVsZUBicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IFNobXVsaWsgUmF2aWQKKyAqCSAgICAgICBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KICAqLwogCiAjaW5jbHVkZSAiYm54MnguaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3ZmcGYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3ZmcGYuaAppbmRleCBjOTIyYjgxLi5lMjFlNzA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF92ZnBmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfdmZwZi5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgogICogY29uc2VudC4KICAqCi0gKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgotICogV3JpdHRlbiBieTogQXJpZWwgRWxpb3IgPGFyaWVsZUBicm9hZGNvbS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBBcmllbCBFbGlvciA8YXJpZWwuZWxpb3JAcWxvZ2ljLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IEFyaWVsIEVsaW9yIDxhcmllbC5lbGlvckBxbG9naWMuY29tPgogICovCiAjaWZuZGVmIFZGX1BGX0lGX0gKICNkZWZpbmUgVkZfUEZfSUZfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jCmluZGV4IDRkZDQ4ZDIuLjgyNDRlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmMKQEAgLTYwOCw2ICs2MDgsMTAgQEAKIAkJcHJfZXJyKCIlczogQmFkIHR5cGUgJWRcbiIsIF9fZnVuY19fLCB1bHBfdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCWlmICh1bHBfdHlwZSA9PSBDTklDX1VMUF9JU0NTSSkKKwkJY25pY19zZW5kX25sbXNnKGNwLCBJU0NTSV9LRVZFTlRfSUZfRE9XTiwgTlVMTCk7CisKIAltdXRleF9sb2NrKCZjbmljX2xvY2spOwogCWlmIChyY3VfZGVyZWZlcmVuY2UoY3AtPnVscF9vcHNbdWxwX3R5cGVdKSkgewogCQlSQ1VfSU5JVF9QT0lOVEVSKGNwLT51bHBfb3BzW3VscF90eXBlXSwgTlVMTCk7CkBAIC02MjAsOSArNjI0LDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjbmljX2xvY2spOwogCi0JaWYgKHVscF90eXBlID09IENOSUNfVUxQX0lTQ1NJKQotCQljbmljX3NlbmRfbmxtc2coY3AsIElTQ1NJX0tFVkVOVF9JRl9ET1dOLCBOVUxMKTsKLQllbHNlIGlmICh1bHBfdHlwZSA9PSBDTklDX1VMUF9GQ09FKQorCWlmICh1bHBfdHlwZSA9PSBDTklDX1VMUF9GQ09FKQogCQlkZXYtPmZjb2VfY2FwID0gTlVMTDsKIAogCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtMTAzOSwyMSArMTA0MSwxNyBAQAogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwogCXN0cnVjdCBjbmljX3Vpb19kZXYgKnVkZXY7CiAKLQlyZWFkX2xvY2soJmNuaWNfZGV2X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodWRldiwgJmNuaWNfdWRldl9saXN0LCBsaXN0KSB7CiAJCWlmICh1ZGV2LT5wZGV2ID09IGRldi0+cGNpZGV2KSB7CiAJCQl1ZGV2LT5kZXYgPSBkZXY7CiAJCQlpZiAoX19jbmljX2FsbG9jX3Vpb19yaW5ncyh1ZGV2LCBwYWdlcykpIHsKIAkJCQl1ZGV2LT5kZXYgPSBOVUxMOwotCQkJCXJlYWRfdW5sb2NrKCZjbmljX2Rldl9sb2NrKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWNwLT51ZGV2ID0gdWRldjsKLQkJCXJlYWRfdW5sb2NrKCZjbmljX2Rldl9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCXJlYWRfdW5sb2NrKCZjbmljX2Rldl9sb2NrKTsKIAogCXVkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY25pY191aW9fZGV2KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1ZGV2KQpAQCAtMTA2Nyw5ICsxMDY1LDcgQEAKIAlpZiAoX19jbmljX2FsbG9jX3Vpb19yaW5ncyh1ZGV2LCBwYWdlcykpCiAJCWdvdG8gZXJyX3VkZXY7CiAKLQl3cml0ZV9sb2NrKCZjbmljX2Rldl9sb2NrKTsKIAlsaXN0X2FkZCgmdWRldi0+bGlzdCwgJmNuaWNfdWRldl9saXN0KTsKLQl3cml0ZV91bmxvY2soJmNuaWNfZGV2X2xvY2spOwogCiAJcGNpX2Rldl9nZXQodWRldi0+cGRldik7CiAKQEAgLTU2MjQsMjAgKzU2MjAsMjcgQEAKIHsKIAlpbnQgaWZfdHlwZTsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGlmX3R5cGUgPSAwOyBpZl90eXBlIDwgTUFYX0NOSUNfVUxQX1RZUEU7IGlmX3R5cGUrKykgewogCQlzdHJ1Y3QgY25pY191bHBfb3BzICp1bHBfb3BzOwogCQl2b2lkICpjdHg7CiAKLQkJdWxwX29wcyA9IHJjdV9kZXJlZmVyZW5jZShjcC0+dWxwX29wc1tpZl90eXBlXSk7Ci0JCWlmICghdWxwX29wcyB8fCAhdWxwX29wcy0+aW5kaWNhdGVfbmV0ZXZlbnQpCisJCW11dGV4X2xvY2soJmNuaWNfbG9jayk7CisJCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGNwLT51bHBfb3BzW2lmX3R5cGVdLAorCQkJCQkJbG9ja2RlcF9pc19oZWxkKCZjbmljX2xvY2spKTsKKwkJaWYgKCF1bHBfb3BzIHx8ICF1bHBfb3BzLT5pbmRpY2F0ZV9uZXRldmVudCkgeworCQkJbXV0ZXhfdW5sb2NrKCZjbmljX2xvY2spOwogCQkJY29udGludWU7CisJCX0KIAogCQljdHggPSBjcC0+dWxwX2hhbmRsZVtpZl90eXBlXTsKIAorCQlzZXRfYml0KFVMUF9GX0NBTExfUEVORElORywgJmNwLT51bHBfZmxhZ3NbaWZfdHlwZV0pOworCQltdXRleF91bmxvY2soJmNuaWNfbG9jayk7CisKIAkJdWxwX29wcy0+aW5kaWNhdGVfbmV0ZXZlbnQoY3R4LCBldmVudCwgdmxhbl9pZCk7CisKKwkJY2xlYXJfYml0KFVMUF9GX0NBTExfUEVORElORywgJmNwLT51bHBfZmxhZ3NbaWZfdHlwZV0pOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyogbmV0ZGV2IGV2ZW50IGhhbmRsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jCmluZGV4IDA5NjZiZDAuLjViYTFjZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYwpAQCAtMjQ4MSw3ICsyNDgxLDcgQEAKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGV2KTsKIAlldGhlcl9hZGRyX2NvcHkoZGV2LT5kZXZfYWRkciwgbWFjYWRkcik7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDIgKiBIWjsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYmNtZ2VuZXRfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmYmNtZ2VuZXRfZXRodG9vbF9vcHM7CiAJZGV2LT5uZXRkZXZfb3BzID0gJmJjbWdlbmV0X25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgYmNtZ2VuZXRfcG9sbCwgNjQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21taWkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCmluZGV4IDQ2MDg2NzMuLmFkZDhkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCkBAIC0yOTgsNiArMjk4LDcgQEAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfbWlpX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBwcml2LT5wZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCXVuc2lnbmVkIGludCBwaHlfZmxhZ3M7CiAJaW50IHJldDsKQEAgLTMwNywxNSArMzA4LDE5IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwcml2LT5waHlfZG4pCi0JCXBoeWRldiA9IG9mX3BoeV9jb25uZWN0KGRldiwgcHJpdi0+cGh5X2RuLAotCQkJCQliY21nZW5ldF9taWlfc2V0dXAsIDAsCi0JCQkJCXByaXYtPnBoeV9pbnRlcmZhY2UpOwotCWVsc2UKLQkJcGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayhkZXYsCi0JCQkJCWJjbWdlbmV0X21paV9zZXR1cCwKLQkJCQkJcHJpdi0+cGh5X2ludGVyZmFjZSk7CisJLyogSW4gdGhlIGNhc2Ugb2YgYSBmaXhlZCBQSFksIHRoZSBEVCBub2RlIGFzc29jaWF0ZWQKKwkgKiB0byB0aGUgUEhZIGlzIHRoZSBFdGhlcm5ldCBNQUMgRFQgbm9kZS4KKwkgKi8KKwlpZiAob2ZfcGh5X2lzX2ZpeGVkX2xpbmsoZG4pKSB7CisJCXJldCA9IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKGRuKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKKwkJcHJpdi0+cGh5X2RuID0gZG47CisJfQorCisJcGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3QoZGV2LCBwcml2LT5waHlfZG4sIGJjbWdlbmV0X21paV9zZXR1cCwgMCwKKwkJCQlwcml2LT5waHlfaW50ZXJmYWNlKTsKIAlpZiAoIXBoeWRldikgewogCQlwcl9lcnIoImNvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCmluZGV4IGU1ZDk1YzUuLmRmMjc5MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBKZWZmIEdhcnppayAoamdhcnppa0Bwb2JveC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uLgogICoKICAqIEZpcm13YXJlIGlzOgogICoJRGVyaXZlZCBmcm9tIHByb3ByaWV0YXJ5IHVucHVibGlzaGVkIHNvdXJjZSBjb2RlLApAQCAtOTQsMTAgKzk0LDEwIEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBURzNfTUFKX05VTQkJCTMKLSNkZWZpbmUgVEczX01JTl9OVU0JCQkxMzYKKyNkZWZpbmUgVEczX01JTl9OVU0JCQkxMzcKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCVwKIAlfX3N0cmluZ2lmeShURzNfTUFKX05VTSkgIi4iIF9fc3RyaW5naWZ5KFRHM19NSU5fTlVNKQotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkphbiAwMywgMjAxNCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXkgMTEsIDIwMTQiCiAKICNkZWZpbmUgUkVTRVRfS0lORF9TSFVURE9XTgkwCiAjZGVmaW5lIFJFU0VUX0tJTkRfSU5JVAkJMQpAQCAtMzIyNCw3ICszMjI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBOVlJBTV9DTURfVElNRU9VVCAxMDAwMAorI2RlZmluZSBOVlJBTV9DTURfVElNRU9VVCAxMDAKIAogc3RhdGljIGludCB0ZzNfbnZyYW1fZXhlY19jbWQoc3RydWN0IHRnMyAqdHAsIHUzMiBudnJhbV9jbWQpCiB7CkBAIC03ODcxLDkgKzc4NzEsNyBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLS8qIGhhcmRfc3RhcnRfeG1pdCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgdGhlIDRHIGJ1ZyBhbmQvb3IgNDAtYml0IGJ1ZyBhbmQKLSAqIHN1cHBvcnQgVEczX0ZMQUdfSFdfVFNPXzEgb3IgZmlybXdhcmUgVFNPIG9ubHkuCi0gKi8KKy8qIGhhcmRfc3RhcnRfeG1pdCBmb3IgYWxsIGRldmljZXMgKi8KIHN0YXRpYyBuZXRkZXZfdHhfdCB0ZzNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTc4ODQsNiArNzg4MiwxMCBAQAogCXN0cnVjdCB0ZzNfbmFwaSAqdG5hcGk7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOwogCXVuc2lnbmVkIGludCBsYXN0OworCXN0cnVjdCBpcGhkciAqaXBoID0gTlVMTDsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoID0gTlVMTDsKKwlfX3N1bTE2IHRjcF9jc3VtID0gMCwgaXBfY3N1bSA9IDA7CisJX19iZTE2IGlwX3RvdF9sZW4gPSAwOwogCiAJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKIAl0bmFwaSA9ICZ0cC0+bmFwaVtza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CkBAIC03OTE1LDcgKzc5MTcsNiBAQAogCiAJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAlpZiAobXNzKSB7Ci0JCXN0cnVjdCBpcGhkciAqaXBoOwogCQl1MzIgdGNwX29wdF9sZW4sIGhkcl9sZW47CiAKIAkJaWYgKHNrYl9jb3dfaGVhZChza2IsIDApKQpAQCAtNzkyNywyNyArNzkyOCwzMSBAQAogCQloZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKSAtIEVUSF9ITEVOOwogCiAJCWlmICghc2tiX2lzX2dzb192Nihza2IpKSB7CisJCQlpZiAodW5saWtlbHkoKEVUSF9ITEVOICsgaGRyX2xlbikgPiA4MCkgJiYKKwkJCSAgICB0ZzNfZmxhZyh0cCwgVFNPX0JVRykpCisJCQkJcmV0dXJuIHRnM190c29fYnVnKHRwLCBza2IpOworCisJCQlpcF9jc3VtID0gaXBoLT5jaGVjazsKKwkJCWlwX3RvdF9sZW4gPSBpcGgtPnRvdF9sZW47CiAJCQlpcGgtPmNoZWNrID0gMDsKIAkJCWlwaC0+dG90X2xlbiA9IGh0b25zKG1zcyArIGhkcl9sZW4pOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KChFVEhfSExFTiArIGhkcl9sZW4pID4gODApICYmCi0JCSAgICB0ZzNfZmxhZyh0cCwgVFNPX0JVRykpCi0JCQlyZXR1cm4gdGczX3Rzb19idWcodHAsIHNrYik7Ci0KIAkJYmFzZV9mbGFncyB8PSAoVFhEX0ZMQUdfQ1BVX1BSRV9ETUEgfAogCQkJICAgICAgIFRYRF9GTEFHX0NQVV9QT1NUX0RNQSk7CiAKKwkJdGNwaCA9IHRjcF9oZHIoc2tiKTsKKwkJdGNwX2NzdW0gPSB0Y3BoLT5jaGVjazsKKwogCQlpZiAodGczX2ZsYWcodHAsIEhXX1RTT18xKSB8fAogCQkgICAgdGczX2ZsYWcodHAsIEhXX1RTT18yKSB8fAogCQkgICAgdGczX2ZsYWcodHAsIEhXX1RTT18zKSkgewotCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IDA7CisJCQl0Y3BoLT5jaGVjayA9IDA7CiAJCQliYXNlX2ZsYWdzICY9IH5UWERfRkxBR19UQ1BVRFBfQ1NVTTsKLQkJfSBlbHNlCi0JCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCi0JCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAotCQkJCQkJCQkgSVBQUk9UT19UQ1AsCi0JCQkJCQkJCSAwKTsKKwkJfSBlbHNlIHsKKwkJCXRjcGgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCQkJIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJfQogCiAJCWlmICh0ZzNfZmxhZyh0cCwgSFdfVFNPXzMpKSB7CiAJCQltc3MgfD0gKGhkcl9sZW4gJiAweGMpIDw8IDEyOwpAQCAtODA0Nyw2ICs4MDUyLDE4IEBACiAJaWYgKHdvdWxkX2hpdF9od2J1ZykgewogCQl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCB0bmFwaS0+dHhfcHJvZCwgaSk7CiAKKwkJaWYgKG1zcykgeworCQkJLyogSWYgaXQncyBhIFRTTyBwYWNrZXQsIGRvIEdTTyBpbnN0ZWFkIG9mCisJCQkgKiBhbGxvY2F0aW5nIGFuZCBjb3B5aW5nIHRvIGEgbGFyZ2UgbGluZWFyIFNLQgorCQkJICovCisJCQlpZiAoaXBfdG90X2xlbikgeworCQkJCWlwaC0+Y2hlY2sgPSBpcF9jc3VtOworCQkJCWlwaC0+dG90X2xlbiA9IGlwX3RvdF9sZW47CisJCQl9CisJCQl0Y3BoLT5jaGVjayA9IHRjcF9jc3VtOworCQkJcmV0dXJuIHRnM190c29fYnVnKHRwLCBza2IpOworCQl9CisKIAkJLyogSWYgdGhlIHdvcmthcm91bmQgZmFpbHMgZHVlIHRvIG1lbW9yeS9tYXBwaW5nCiAJCSAqIGZhaWx1cmUsIHNpbGVudGx5IGRyb3AgdGhpcyBwYWNrZXQuCiAJCSAqLwpAQCAtMTE4NzYsOSArMTE4OTMsOSBAQAogc3RhdGljIGludCB0ZzNfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByZXQ7CisJaW50IHJldCwgY3BtdV9yZXN0b3JlID0gMDsKIAl1OCAgKnBkOwotCXUzMiBpLCBvZmZzZXQsIGxlbiwgYl9vZmZzZXQsIGJfY291bnQ7CisJdTMyIGksIG9mZnNldCwgbGVuLCBiX29mZnNldCwgYl9jb3VudCwgY3BtdV92YWwgPSAwOwogCV9fYmUzMiB2YWw7CiAKIAlpZiAodGczX2ZsYWcodHAsIE5PX05WUkFNKSkKQEAgLTExODkwLDYgKzExOTA3LDE5IEBACiAKIAllZXByb20tPm1hZ2ljID0gVEczX0VFUFJPTV9NQUdJQzsKIAorCS8qIE92ZXJyaWRlIGNsb2NrLCBsaW5rIGF3YXJlIGFuZCBsaW5rIGlkbGUgbW9kZXMgKi8KKwlpZiAodGczX2ZsYWcodHAsIENQTVVfUFJFU0VOVCkpIHsKKwkJY3BtdV92YWwgPSB0cjMyKFRHM19DUE1VX0NUUkwpOworCQlpZiAoY3BtdV92YWwgJiAoQ1BNVV9DVFJMX0xJTktfQVdBUkVfTU9ERSB8CisJCQkJQ1BNVV9DVFJMX0xJTktfSURMRV9NT0RFKSkgeworCQkJdHczMihURzNfQ1BNVV9DVFJMLCBjcG11X3ZhbCAmCisJCQkJCSAgICB+KENQTVVfQ1RSTF9MSU5LX0FXQVJFX01PREUgfAorCQkJCQkgICAgIENQTVVfQ1RSTF9MSU5LX0lETEVfTU9ERSkpOworCQkJY3BtdV9yZXN0b3JlID0gMTsKKwkJfQorCX0KKwl0ZzNfb3ZlcnJpZGVfY2xrKHRwKTsKKwogCWlmIChvZmZzZXQgJiAzKSB7CiAJCS8qIGFkanVzdG1lbnRzIHRvIHN0YXJ0IG9uIHJlcXVpcmVkIDQgYnl0ZSBib3VuZGFyeSAqLwogCQliX29mZnNldCA9IG9mZnNldCAmIDM7CkBAIC0xMTkwMCw3ICsxMTkzMCw3IEBACiAJCX0KIAkJcmV0ID0gdGczX252cmFtX3JlYWRfYmUzMih0cCwgb2Zmc2V0LWJfb2Zmc2V0LCAmdmFsKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGVlcHJvbV9kb25lOwogCQltZW1jcHkoZGF0YSwgKChjaGFyICopJnZhbCkgKyBiX29mZnNldCwgYl9jb3VudCk7CiAJCWxlbiAtPSBiX2NvdW50OwogCQlvZmZzZXQgKz0gYl9jb3VudDsKQEAgLTExOTEyLDEwICsxMTk0MiwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCAobGVuIC0gKGxlbiAmIDMpKTsgaSArPSA0KSB7CiAJCXJldCA9IHRnM19udnJhbV9yZWFkX2JlMzIodHAsIG9mZnNldCArIGksICZ2YWwpOwogCQlpZiAocmV0KSB7CisJCQlpZiAoaSkKKwkJCQlpIC09IDQ7CiAJCQllZXByb20tPmxlbiArPSBpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZWVwcm9tX2RvbmU7CiAJCX0KIAkJbWVtY3B5KHBkICsgaSwgJnZhbCwgNCk7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJZWVwcm9tLT5sZW4gKz0gaTsKKwkJCQlyZXQgPSAtRUlOVFI7CisJCQkJZ290byBlZXByb21fZG9uZTsKKwkJCX0KKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CiAJfQogCWVlcHJvbS0+bGVuICs9IGk7CiAKQEAgLTExOTI2LDExICsxMTk2NiwxOSBAQAogCQliX29mZnNldCA9IG9mZnNldCArIGxlbiAtIGJfY291bnQ7CiAJCXJldCA9IHRnM19udnJhbV9yZWFkX2JlMzIodHAsIGJfb2Zmc2V0LCAmdmFsKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGVlcHJvbV9kb25lOwogCQltZW1jcHkocGQsICZ2YWwsIGJfY291bnQpOwogCQllZXByb20tPmxlbiArPSBiX2NvdW50OwogCX0KLQlyZXR1cm4gMDsKKwlyZXQgPSAwOworCitlZXByb21fZG9uZToKKwkvKiBSZXN0b3JlIGNsb2NrLCBsaW5rIGF3YXJlIGFuZCBsaW5rIGlkbGUgbW9kZXMgKi8KKwl0ZzNfcmVzdG9yZV9jbGsodHApOworCWlmIChjcG11X3Jlc3RvcmUpCisJCXR3MzIoVEczX0NQTVVfQ1RSTCwgY3BtdV92YWwpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB0ZzNfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCkBAIC0xMjQ4NCw3ICsxMjUzMiw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBpbnQgdGczX2dldF9yeGZoX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqaW5kaXIpCitzdGF0aWMgaW50IHRnM19nZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKmluZGlyLCB1OCAqa2V5KQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKQEAgLTEyNDk1LDcgKzEyNTQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZzNfc2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTMyICppbmRpcikKK3N0YXRpYyBpbnQgdGczX3NldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHUzMiAqaW5kaXIsIGNvbnN0IHU4ICprZXkpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNpemVfdCBpOwpAQCAtMTQwMjcsOCArMTQwNzUsOCBAQAogCS5nZXRfc3NldF9jb3VudAkJPSB0ZzNfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9yeG5mYwkJPSB0ZzNfZ2V0X3J4bmZjLAogCS5nZXRfcnhmaF9pbmRpcl9zaXplICAgID0gdGczX2dldF9yeGZoX2luZGlyX3NpemUsCi0JLmdldF9yeGZoX2luZGlyCQk9IHRnM19nZXRfcnhmaF9pbmRpciwKLQkuc2V0X3J4ZmhfaW5kaXIJCT0gdGczX3NldF9yeGZoX2luZGlyLAorCS5nZXRfcnhmaAkJPSB0ZzNfZ2V0X3J4ZmgsCisJLnNldF9yeGZoCQk9IHRnM19zZXRfcnhmaCwKIAkuZ2V0X2NoYW5uZWxzCQk9IHRnM19nZXRfY2hhbm5lbHMsCiAJLnNldF9jaGFubmVscwkJPSB0ZzNfc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbwkJPSB0ZzNfZ2V0X3RzX2luZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCmluZGV4IDA0MzIxZTUuLjQ2MWFjY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMSBKZWZmIEdhcnppayAoamdhcnppa0Bwb2JveC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uLgogICovCiAKICNpZm5kZWYgX1QzX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKaW5kZXggZjllMTUwOC4uODgyY2FkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKQEAgLTI2Niw4ICsyNjYsOCBAQAogCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF8xMDAwMCk7CiAJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgLTEpOwotCQljbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF9VTktOT1dOKTsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CiAJY21kLT5tYXh0eHBrdCA9IDA7CkBAIC0xMTM3LDUgKzExMzcsNSBAQAogdm9pZAogYm5hZF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYm5hZF9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZibmFkX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS94Z21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS94Z21hYy5jCmluZGV4IDUyMWRmZWEuLjI1ZDZiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhbHhlZGEveGdtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL3hnbWFjLmMKQEAgLTE3MzcsNyArMTczNyw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CiAJZXRoZXJfc2V0dXAobmRldik7CiAJbmRldi0+bmV0ZGV2X29wcyA9ICZ4Z21hY19uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmeGdtYWNfZXRodG9vbF9vcHMpOworCW5kZXYtPmV0aHRvb2xfb3BzID0gJnhnbWFjX2V0aHRvb2xfb3BzOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGF0c19sb2NrKTsKIAlJTklUX1dPUksoJnByaXYtPnR4X3RpbWVvdXRfd29yaywgeGdtYWNfdHhfdGltZW91dF93b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiL2N4Z2IyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYwppbmRleCAwNTYxM2E4Li4xODY1NjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYwpAQCAtNTgwLDggKzU4MCw4IEBACiAJCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIHAtPmxpbmtfY29uZmlnLnNwZWVkKTsKIAkJY21kLT5kdXBsZXggPSBwLT5saW5rX2NvbmZpZy5kdXBsZXg7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgLTEpOwotCQljbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF9VTktOT1dOKTsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAKIAljbWQtPnBvcnQgPSAoY21kLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfVFApID8gUE9SVF9UUCA6IFBPUlRfRklCUkU7CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogCiAJCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJmFkYXB0ZXItPm5hcGksIHQxX3BvbGwsIDY0KTsKIAotCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmdDFfZXRodG9vbF9vcHMpOworCQluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnQxX2V0aHRvb2xfb3BzOwogCX0KIAogCWlmICh0MV9pbml0X3N3X21vZHVsZXMoYWRhcHRlciwgYmkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCAwN2JiYjcxLi41ZDljY2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMTgwOSw4ICsxODA5LDggQEAKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgcC0+bGlua19jb25maWcuc3BlZWQpOwogCQljbWQtPmR1cGxleCA9IHAtPmxpbmtfY29uZmlnLmR1cGxleDsKIAl9IGVsc2UgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAtMSk7Ci0JCWNtZC0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEX1VOS05PV04pOworCQljbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWNtZC0+cG9ydCA9IChjbWQtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9UUCkgPyBQT1JUX1RQIDogUE9SVF9GSUJSRTsKQEAgLTMyOTEsNyArMzI5MSw3IEBACiAJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAogCQluZXRkZXYtPm5ldGRldl9vcHMgPSAmY3hnYl9uZXRkZXZfb3BzOwotCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmY3hnYl9ldGh0b29sX29wcyk7CisJCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmY3hnYl9ldGh0b29sX29wczsKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCmluZGV4IGMwYTlkZDUuLmIwY2JiMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoZGV2LT5kZXZfYWRkciwgbWFjKSkgewogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJaWYgKHZsYW4gJiYgdmxhbiAhPSBWTEFOX1ZJRF9NQVNLKSB7Ci0JCQkJZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIHZsYW4pOworCQkJCWRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShkZXYsIGh0b25zKEVUSF9QXzgwMjFRKSwgdmxhbik7CiAJCQl9IGVsc2UgaWYgKG5ldGlmX2lzX2JvbmRfc2xhdmUoZGV2KSkgewogCQkJCXN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcl9kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaAppbmRleCAzMmRiMzc3Li5mNTAzZGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oCkBAIC0zNTcsMTEgKzM1NywxNyBAQAogCU1BWF9PRkxEX1FTRVRTID0gMTYsICAgICAgICAgIC8qICMgb2Ygb2ZmbG9hZCBUeC9SeCBxdWV1ZSBzZXRzICovCiAJTUFYX0NUUkxfUVVFVUVTID0gTkNIQU4sICAgICAgLyogIyBvZiBjb250cm9sIFR4IHF1ZXVlcyAqLwogCU1BWF9SRE1BX1FVRVVFUyA9IE5DSEFOLCAgICAgIC8qICMgb2Ygc3RyZWFtaW5nIFJETUEgUnggcXVldWVzICovCisJTUFYX1JETUFfQ0lRUyA9IE5DSEFOLCAgICAgICAgLyogIyBvZiAgUkRNQSBjb25jZW50cmF0b3IgSVFzICovCisJTUFYX0lTQ1NJX1FVRVVFUyA9IE5DSEFOLCAgICAgLyogIyBvZiBzdHJlYW1pbmcgaVNDU0kgUnggcXVldWVzICovCiB9OwogCiBlbnVtIHsKLQlNQVhfRUdSUSA9IDEyOCwgICAgICAgICAvKiBtYXggIyBvZiBlZ3Jlc3MgcXVldWVzLCBpbmNsdWRpbmcgRkxzICovCi0JTUFYX0lOR1EgPSA2NCAgICAgICAgICAgLyogbWF4ICMgb2YgaW50ZXJydXB0LWNhcGFibGUgaW5ncmVzcyBxdWV1ZXMgKi8KKwlJTkdRX0VYVFJBUyA9IDIsICAgICAgICAvKiBmaXJtd2FyZSBldmVudCBxdWV1ZSBhbmQgKi8KKwkJCQkvKiAgIGZvcndhcmRlZCBpbnRlcnJ1cHRzICovCisJTUFYX0VHUlEgPSBNQVhfRVRIX1FTRVRTKjIgKyBNQVhfT0ZMRF9RU0VUUyoyCisJCSAgICsgTUFYX0NUUkxfUVVFVUVTICsgTUFYX1JETUFfUVVFVUVTICsgTUFYX0lTQ1NJX1FVRVVFUywKKwlNQVhfSU5HUSA9IE1BWF9FVEhfUVNFVFMgKyBNQVhfT0ZMRF9RU0VUUyArIE1BWF9SRE1BX1FVRVVFUworCQkgICArIE1BWF9SRE1BX0NJUVMgKyBNQVhfSVNDU0lfUVVFVUVTICsgSU5HUV9FWFRSQVMsCiB9OwogCiBzdHJ1Y3QgYWRhcHRlcjsKQEAgLTUzOCw2ICs1NDQsNyBAQAogCXN0cnVjdCBzZ2VfZXRoX3J4cSBldGhyeHFbTUFYX0VUSF9RU0VUU107CiAJc3RydWN0IHNnZV9vZmxkX3J4cSBvZmxkcnhxW01BWF9PRkxEX1FTRVRTXTsKIAlzdHJ1Y3Qgc2dlX29mbGRfcnhxIHJkbWFyeHFbTUFYX1JETUFfUVVFVUVTXTsKKwlzdHJ1Y3Qgc2dlX29mbGRfcnhxIHJkbWFjaXFbTUFYX1JETUFfQ0lRU107CiAJc3RydWN0IHNnZV9yc3BxIGZ3X2V2dHEgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogCXN0cnVjdCBzZ2VfcnNwcSBpbnRycSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwpAQCAtNTQ4LDggKzU1NSwxMCBAQAogCXUxNiBldGh0eHFfcm92ZXI7ICAgICAgICAgICAvKiBUeCBxdWV1ZSB0byBjbGVhbiB1cCBuZXh0ICovCiAJdTE2IG9mbGRxc2V0czsgICAgICAgICAgICAgIC8qICMgb2YgYWN0aXZlIG9mZmxvYWQgcXVldWUgc2V0cyAqLwogCXUxNiByZG1hcXM7ICAgICAgICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBSRE1BIFJ4IHF1ZXVlcyAqLworCXUxNiByZG1hY2lxczsgICAgICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBSRE1BIGNvbmNlbnRyYXRvciBJUXMgKi8KIAl1MTYgb2ZsZF9yeHFbTUFYX09GTERfUVNFVFNdOwogCXUxNiByZG1hX3J4cVtOQ0hBTl07CisJdTE2IHJkbWFfY2lxW05DSEFOXTsKIAl1MTYgdGltZXJfdmFsW1NHRV9OVElNRVJTXTsKIAl1OCBjb3VudGVyX3ZhbFtTR0VfTkNPVU5URVJTXTsKIAl1MzIgZmxfcGdfb3JkZXI7ICAgICAgICAgICAgLyogbGFyZ2UgcGFnZSBhbGxvY2F0aW9uIHNpemUgKi8KQEAgLTU3Nyw2ICs1ODYsNyBAQAogI2RlZmluZSBmb3JfZWFjaF9ldGhyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPmV0aHFzZXRzOyBpKyspCiAjZGVmaW5lIGZvcl9lYWNoX29mbGRyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPm9mbGRxc2V0czsgaSsrKQogI2RlZmluZSBmb3JfZWFjaF9yZG1hcnhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5yZG1hcXM7IGkrKykKKyNkZWZpbmUgZm9yX2VhY2hfcmRtYWNpcShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+cmRtYWNpcXM7IGkrKykKIAogc3RydWN0IGwydF9kYXRhOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCmluZGV4IDI0ZTE2ZTMzLi4yZjhkNmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYwpAQCAtODE4LDEyICs4MTgsMTcgQEAKIAlmb3JfZWFjaF9yZG1hcnhxKCZhZGFwLT5zZ2UsIGkpCiAJCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4KytdLmRlc2MsIG4sICIlcy1yZG1hJWQiLAogCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIGkpOworCisJZm9yX2VhY2hfcmRtYWNpcSgmYWRhcC0+c2dlLCBpKQorCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeCsrXS5kZXNjLCBuLCAiJXMtcmRtYS1jaXElZCIsCisJCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgaSk7CiB9CiAKIHN0YXRpYyBpbnQgcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7Ci0JaW50IGVyciwgZXRocWlkeCwgb2ZsZHFpZHggPSAwLCByZG1hcWlkeCA9IDAsIG1zaV9pbmRleCA9IDI7CisJaW50IGVyciwgZXRocWlkeCwgb2ZsZHFpZHggPSAwLCByZG1hcWlkeCA9IDAsIHJkbWFjaXFxaWR4ID0gMDsKKwlpbnQgbXNpX2luZGV4ID0gMjsKIAogCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1sxXS52ZWMsIHQ0X3NnZV9pbnRyX21zaXgsIDAsCiAJCQkgIGFkYXAtPm1zaXhfaW5mb1sxXS5kZXNjLCAmcy0+ZndfZXZ0cSk7CkBAIC04NTcsOSArODYyLDIxIEBACiAJCQlnb3RvIHVud2luZDsKIAkJbXNpX2luZGV4Kys7CiAJfQorCWZvcl9lYWNoX3JkbWFjaXEocywgcmRtYWNpcXFpZHgpIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0udmVjLAorCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKKwkJCQkgIGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLmRlc2MsCisJCQkJICAmcy0+cmRtYWNpcVtyZG1hY2lxcWlkeF0ucnNwcSk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVud2luZDsKKwkJbXNpX2luZGV4Kys7CisJfQogCXJldHVybiAwOwogCiB1bndpbmQ6CisJd2hpbGUgKC0tcmRtYWNpcXFpZHggPj0gMCkKKwkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCisJCQkgJnMtPnJkbWFjaXFbcmRtYWNpcXFpZHhdLnJzcHEpOwogCXdoaWxlICgtLXJkbWFxaWR4ID49IDApCiAJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAogCQkJICZzLT5yZG1hcnhxW3JkbWFxaWR4XS5yc3BxKTsKQEAgLTg4NSw2ICs5MDIsOCBAQAogCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPm9mbGRyeHFbaV0ucnNwcSk7CiAJZm9yX2VhY2hfcmRtYXJ4cShzLCBpKQogCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPnJkbWFyeHFbaV0ucnNwcSk7CisJZm9yX2VhY2hfcmRtYWNpcShzLCBpKQorCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPnJkbWFjaXFbaV0ucnNwcSk7CiB9CiAKIC8qKgpAQCAtMTA0Nyw3ICsxMDY2LDggQEAKIAkJaWYgKG1zaV9pZHggPiAwKQogCQkJbXNpX2lkeCsrOwogCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwgZGV2LCBtc2lfaWR4LAotCQkJCSAgICAgICAmcS0+ZmwsIHVsZHJ4X2hhbmRsZXIpOworCQkJCSAgICAgICBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCwKKwkJCQkgICAgICAgdWxkcnhfaGFuZGxlcik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZyZWVvdXQ7CiAJCW1lbXNldCgmcS0+c3RhdHMsIDAsIHNpemVvZihxLT5zdGF0cykpOwpAQCAtMTA2NCwxMyArMTA4NCwyOCBAQAogCQlpZiAobXNpX2lkeCA+IDApCiAJCQltc2lfaWR4Kys7CiAJCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnEtPnJzcHEsIGZhbHNlLCBhZGFwLT5wb3J0W2ldLAotCQkJCSAgICAgICBtc2lfaWR4LCAmcS0+ZmwsIHVsZHJ4X2hhbmRsZXIpOworCQkJCSAgICAgICBtc2lfaWR4LCBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCwKKwkJCQkgICAgICAgdWxkcnhfaGFuZGxlcik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZyZWVvdXQ7CiAJCW1lbXNldCgmcS0+c3RhdHMsIDAsIHNpemVvZihxLT5zdGF0cykpOwogCQlzLT5yZG1hX3J4cVtpXSA9IHEtPnJzcHEuYWJzX2lkOwogCX0KIAorCWZvcl9lYWNoX3JkbWFjaXEocywgaSkgeworCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpxID0gJnMtPnJkbWFjaXFbaV07CisKKwkJaWYgKG1zaV9pZHggPiAwKQorCQkJbXNpX2lkeCsrOworCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwgYWRhcC0+cG9ydFtpXSwKKwkJCQkgICAgICAgbXNpX2lkeCwgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCisJCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIpOworCQlpZiAoZXJyKQorCQkJZ290byBmcmVlb3V0OworCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKKwkJcy0+cmRtYV9jaXFbaV0gPSBxLT5yc3BxLmFic19pZDsKKwl9CisKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJLyoKIAkJICogTm90ZSB0aGF0IC0+cmRtYXJ4cVtpXS5yc3BxLmNudHh0X2lkIGJlbG93IGlzIDAgaWYgd2UgZG9uJ3QKQEAgLTIyNTIsMTIgKzIyODcsMTkgQEAKIAllbHNlIGlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hGSSB8fAogCQkgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUl9YQVVJKQogCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwotCWVsc2UgaWYgKHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfU0ZQKSB7Ci0JCWlmIChwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1RXSU5BWF9QQVNTSVZFIHx8Ci0JCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1RXSU5BWF9BQ1RJVkUpCisJZWxzZSBpZiAocC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9TRlAgfHwKKwkJIHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfUVNGUF8xMEcgfHwKKwkJIHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfUVNGUCkgeworCQlpZiAocC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9MUiB8fAorCQkgICAgcC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9TUiB8fAorCQkgICAgcC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9FUiB8fAorCQkgICAgcC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9MUk0pCisJCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQllbHNlIGlmIChwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1RXSU5BWF9QQVNTSVZFIHx8CisJCQkgcC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9UV0lOQVhfQUNUSVZFKQogCQkJY21kLT5wb3J0ID0gUE9SVF9EQTsKIAkJZWxzZQotCQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJCWNtZC0+cG9ydCA9IFBPUlRfT1RIRVI7CiAJfSBlbHNlCiAJCWNtZC0+cG9ydCA9IFBPUlRfT1RIRVI7CiAKQEAgLTI0NjEsOCArMjUwMyw3IEBACiB9CiAKIC8qKgotICoJc2V0X3J4cV9pbnRyX3BhcmFtcyAtIHNldCBhIHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGRvZmYgcGFyYW1ldGVycwotICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglzZXRfcnNwcV9pbnRyX3BhcmFtcyAtIHNldCBhIHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGRvZmYgcGFyYW1ldGVycwogICoJQHE6IHRoZSBSeCBxdWV1ZQogICoJQHVzOiB0aGUgaG9sZC1vZmYgdGltZSBpbiB1cywgb3IgMCB0byBkaXNhYmxlIHRpbWVyCiAgKglAY250OiB0aGUgaG9sZC1vZmYgcGFja2V0IGNvdW50LCBvciAwIHRvIGRpc2FibGUgY291bnRlcgpAQCAtMjQ3MCw5ICsyNTExLDExIEBACiAgKglTZXRzIGFuIFJ4IHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGQtb2ZmIHRpbWUgYW5kIHBhY2tldCBjb3VudC4gIEF0IGxlYXN0CiAgKglvbmUgb2YgdGhlIHR3byBuZWVkcyB0byBiZSBlbmFibGVkIGZvciB0aGUgcXVldWUgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cy4KICAqLwotc3RhdGljIGludCBzZXRfcnhxX2ludHJfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnEsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250KQorc3RhdGljIGludCBzZXRfcnNwcV9pbnRyX3BhcmFtcyhzdHJ1Y3Qgc2dlX3JzcHEgKnEsCisJCQkJdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250KQogeworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcS0+YWRhcDsKKwogCWlmICgodXMgfCBjbnQpID09IDApCiAJCWNudCA9IDE7CiAKQEAgLTI0OTksMjQgKzI1NDIsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBzZXRfcnhfaW50cl9wYXJhbXMgLSBzZXQgYSBuZXQgZGV2aWNlcydzIFJYIGludGVycnVwdCBob2xkb2ZmIHBhcmFtZXRlIQorICogQGRldjogdGhlIG5ldHdvcmsgZGV2aWNlCisgKiBAdXM6IHRoZSBob2xkLW9mZiB0aW1lIGluIHVzLCBvciAwIHRvIGRpc2FibGUgdGltZXIKKyAqIEBjbnQ6IHRoZSBob2xkLW9mZiBwYWNrZXQgY291bnQsIG9yIDAgdG8gZGlzYWJsZSBjb3VudGVyCisgKgorICogU2V0IHRoZSBSWCBpbnRlcnJ1cHQgaG9sZC1vZmYgcGFyYW1ldGVycyBmb3IgYSBuZXR3b3JrIGRldmljZS4KKyAqLworc3RhdGljIGludCBzZXRfcnhfaW50cl9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB1cywgdW5zaWduZWQgaW50IGNudCkKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXN0cnVjdCBzZ2VfZXRoX3J4cSAqcSA9ICZhZGFwLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKKworCWZvciAoaSA9IDA7IGkgPCBwaS0+bnFzZXRzOyBpKyssIHErKykgeworCQllcnIgPSBzZXRfcnNwcV9pbnRyX3BhcmFtcygmcS0+cnNwcSwgdXMsIGNudCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmMpCiB7Ci0JY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7Ci0Jc3RydWN0IHNnZV9yc3BxICpxOwotCWludCBpOwotCWludCByID0gMDsKLQotCWZvciAoaSA9IHBpLT5maXJzdF9xc2V0OyBpIDwgcGktPmZpcnN0X3FzZXQgKyBwaS0+bnFzZXRzOyBpKyspIHsKLQkJcSA9ICZhZGFwLT5zZ2UuZXRocnhxW2ldLnJzcHE7Ci0JCXIgPSBzZXRfcnhxX2ludHJfcGFyYW1zKGFkYXAsIHEsIGMtPnJ4X2NvYWxlc2NlX3VzZWNzLAotCQkJYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOwotCQlpZiAocikgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0IGNvYWxlc2NlICVkXG4iLCByKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByOworCXJldHVybiBzZXRfcnhfaW50cl9wYXJhbXMoZGV2LCBjLT5yeF9jb2FsZXNjZV91c2VjcywKKwkJCQkgIGMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKIH0KIAogc3RhdGljIGludCBnZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmMpCkBAIC0yNzMyLDcgKzI3ODUsNyBAQAogCXJldHVybiBwaS0+cnNzX3NpemU7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKnApCitzdGF0aWMgaW50IGdldF9yc3NfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpwLCB1OCAqa2V5KQogewogCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgbiA9IHBpLT5yc3Nfc2l6ZTsKQEAgLTI3NDIsNyArMjc5NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1MzIgKnApCitzdGF0aWMgaW50IHNldF9yc3NfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTMyICpwLCBjb25zdCB1OCAqa2V5KQogewogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI4NDQsOCArMjg5Nyw4IEBACiAJLnNldF93b2wgICAgICAgICAgID0gc2V0X3dvbCwKIAkuZ2V0X3J4bmZjICAgICAgICAgPSBnZXRfcnhuZmMsCiAJLmdldF9yeGZoX2luZGlyX3NpemUgPSBnZXRfcnNzX3RhYmxlX3NpemUsCi0JLmdldF9yeGZoX2luZGlyICAgID0gZ2V0X3Jzc190YWJsZSwKLQkuc2V0X3J4ZmhfaW5kaXIgICAgPSBzZXRfcnNzX3RhYmxlLAorCS5nZXRfcnhmaAkgICA9IGdldF9yc3NfdGFibGUsCisJLnNldF9yeGZoCSAgID0gc2V0X3Jzc190YWJsZSwKIAkuZmxhc2hfZGV2aWNlICAgICAgPSBzZXRfZmxhc2gsCiB9OwogCkBAIC0zMzg2LDYgKzM0MzksNzcgQEAKIEVYUE9SVF9TWU1CT0woY3hnYjRfYmVzdF9tdHUpOwogCiAvKioKKyAqICAgICBjeGdiNF9iZXN0X2FsaWduZWRfbXR1IC0gZmluZCBiZXN0IE1UVSwgW2hvcGVmdWxseV0gZGF0YSBzaXplIGFsaWduZWQKKyAqICAgICBAbXR1czogdGhlIEhXIE1UVSB0YWJsZQorICogICAgIEBoZWFkZXJfc2l6ZTogSGVhZGVyIFNpemUKKyAqICAgICBAZGF0YV9zaXplX21heDogbWF4aW11bSBEYXRhIFNlZ21lbnQgU2l6ZQorICogICAgIEBkYXRhX3NpemVfYWxpZ246IGRlc2lyZWQgRGF0YSBTZWdtZW50IFNpemUgQWxpZ25tZW50ICgyXk4pCisgKiAgICAgQG10dV9pZHhwOiBIVyBNVFUgVGFibGUgSW5kZXggcmV0dXJuIHZhbHVlIHBvaW50ZXIgKHBvc3NpYmx5IE5VTEwpCisgKgorICogICAgIFNpbWlsYXIgdG8gY3hnYjRfYmVzdF9tdHUoKSBidXQgaW5zdGVhZCBvZiBzZWFyY2hpbmcgdGhlIEhhcmR3YXJlCisgKiAgICAgTVRVIFRhYmxlIGJhc2VkIHNvbGVseSBvbiBhIE1heGltdW0gTVRVIHBhcmFtZXRlciwgd2UgYnJlYWsgdGhhdAorICogICAgIHBhcmFtZXRlciB1cCBpbnRvIGEgSGVhZGVyIFNpemUgYW5kIE1heGltdW0gRGF0YSBTZWdtZW50IFNpemUsIGFuZAorICogICAgIHByb3ZpZGUgYSBkZXNpcmVkIERhdGEgU2VnbWVudCBTaXplIEFsaWdubWVudC4gIElmIHdlIGZpbmQgYW4gTVRVIGluCisgKiAgICAgdGhlIEhhcmR3YXJlIE1UVSBUYWJsZSB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIERhdGEgU2VnbWVudCBTaXplIHdpdGgKKyAqICAgICB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBfYW5kXyB0aGF0IE1UVSBpc24ndCAidG9vIGZhciIgZnJvbSB0aGUKKyAqICAgICBjbG9zZXN0IE1UVSwgdGhlbiB3ZSdsbCByZXR1cm4gdGhhdCByYXRoZXIgdGhhbiB0aGUgY2xvc2VzdCBNVFUuCisgKi8KK3Vuc2lnbmVkIGludCBjeGdiNF9iZXN0X2FsaWduZWRfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLAorCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBoZWFkZXJfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplX21heCwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplX2FsaWduLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKm10dV9pZHhwKQoreworCXVuc2lnbmVkIHNob3J0IG1heF9tdHUgPSBoZWFkZXJfc2l6ZSArIGRhdGFfc2l6ZV9tYXg7CisJdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplX2FsaWduX21hc2sgPSBkYXRhX3NpemVfYWxpZ24gLSAxOworCWludCBtdHVfaWR4LCBhbGlnbmVkX210dV9pZHg7CisKKwkvKiBTY2FuIHRoZSBNVFUgVGFibGUgdGlsbCB3ZSBmaW5kIGFuIE1UVSB3aGljaCBpcyBsYXJnZXIgdGhhbiBvdXIKKwkgKiBNYXhpbXVtIE1UVSBvciB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gIEFsb25nIHRoZSB3YXksCisJICogcmVjb3JkIHRoZSBsYXN0IE1UVSBmb3VuZCwgaWYgYW55LCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIERhdGEKKwkgKiBTZWdtZW50IExlbmd0aCBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIGFsaWdubWVudC4KKwkgKi8KKwlmb3IgKG10dV9pZHggPSAwLCBhbGlnbmVkX210dV9pZHggPSAtMTsgbXR1X2lkeCA8IE5NVFVTOyBtdHVfaWR4KyspIHsKKwkJdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplID0gbXR1c1ttdHVfaWR4XSAtIGhlYWRlcl9zaXplOworCisJCS8qIElmIHRoaXMgTVRVIG1pbnVzIHRoZSBIZWFkZXIgU2l6ZSB3b3VsZCByZXN1bHQgaW4gYQorCQkgKiBEYXRhIFNlZ21lbnQgU2l6ZSBvZiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQsIHJlbWVtYmVyIGl0LgorCQkgKi8KKwkJaWYgKChkYXRhX3NpemUgJiBkYXRhX3NpemVfYWxpZ25fbWFzaykgPT0gMCkKKwkJCWFsaWduZWRfbXR1X2lkeCA9IG10dV9pZHg7CisKKwkJLyogSWYgd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIEhhcmR3YXJlIE1UVSBUYWJsZSBhbmQgdGhlCisJCSAqIG5leHQgZWxlbWVudCBpcyBsYXJnZXIgdGhhbiBvdXIgTWF4aW11bSBNVFUsIGRyb3Agb3V0IG9mCisJCSAqIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKG10dV9pZHgrMSA8IE5NVFVTICYmIG10dXNbbXR1X2lkeCsxXSA+IG1heF9tdHUpCisJCQlicmVhazsKKwl9CisKKwkvKiBJZiB3ZSBmZWxsIG91dCBvZiB0aGUgbG9vcCBiZWNhdXNlIHdlIHJhbiB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZSwKKwkgKiB0aGVuIHdlIGp1c3QgaGF2ZSB0byB1c2UgdGhlIGxhc3QgW2xhcmdlc3RdIGVudHJ5LgorCSAqLworCWlmIChtdHVfaWR4ID09IE5NVFVTKQorCQltdHVfaWR4LS07CisKKwkvKiBJZiB3ZSBmb3VuZCBhbiBNVFUgd2hpY2ggcmVzdWx0ZWQgaW4gdGhlIHJlcXVlc3RlZCBEYXRhIFNlZ21lbnQKKwkgKiBMZW5ndGggYWxpZ25tZW50IGFuZCB0aGF0J3MgIm5vdCBmYXIiIGZyb20gdGhlIGxhcmdlc3QgTVRVIHdoaWNoIGlzCisJICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtYXhpbXVtIE1UVSwgdGhlbiB1c2UgdGhhdC4KKwkgKi8KKwlpZiAoYWxpZ25lZF9tdHVfaWR4ID49IDAgJiYKKwkgICAgbXR1X2lkeCAtIGFsaWduZWRfbXR1X2lkeCA8PSAxKQorCQltdHVfaWR4ID0gYWxpZ25lZF9tdHVfaWR4OworCisJLyogSWYgdGhlIGNhbGxlciBoYXMgcGFzc2VkIGluIGFuIE1UVSBJbmRleCBwb2ludGVyLCBwYXNzIHRoZQorCSAqIE1UVSBJbmRleCBiYWNrLiAgUmV0dXJuIHRoZSBNVFUgdmFsdWUuCisJICovCisJaWYgKG10dV9pZHhwKQorCQkqbXR1X2lkeHAgPSBtdHVfaWR4OworCXJldHVybiBtdHVzW210dV9pZHhdOworfQorRVhQT1JUX1NZTUJPTChjeGdiNF9iZXN0X2FsaWduZWRfbXR1KTsKKworLyoqCiAgKgljeGdiNF9wb3J0X2NoYW4gLSBnZXQgdGhlIEhXIGNoYW5uZWwgb2YgYSBwb3J0CiAgKglAZGV2OiB0aGUgbmV0IGRldmljZSBmb3IgdGhlIHBvcnQKICAqCkBAIC0zNzgyLDcgKzM5MDYsOSBAQAogCWxsaS5tdHVzID0gYWRhcC0+cGFyYW1zLm10dXM7CiAJaWYgKHVsZCA9PSBDWEdCNF9VTERfUkRNQSkgewogCQlsbGkucnhxX2lkcyA9IGFkYXAtPnNnZS5yZG1hX3J4cTsKKwkJbGxpLmNpcV9pZHMgPSBhZGFwLT5zZ2UucmRtYV9jaXE7CiAJCWxsaS5ucnhxID0gYWRhcC0+c2dlLnJkbWFxczsKKwkJbGxpLm5jaXEgPSBhZGFwLT5zZ2UucmRtYWNpcXM7CiAJfSBlbHNlIGlmICh1bGQgPT0gQ1hHQjRfVUxEX0lTQ1NJKSB7CiAJCWxsaS5yeHFfaWRzID0gYWRhcC0+c2dlLm9mbGRfcnhxOwogCQlsbGkubnJ4cSA9IGFkYXAtPnNnZS5vZmxkcXNldHM7CkBAIC00MDYxLDcgKzQxODcsNyBAQAogCiAJLyogUGFyc2UgYWxsIGJvbmQgYW5kIHZsYW4gZGV2aWNlcyBsYXllcmVkIG9uIHRvcCBvZiB0aGUgcGh5c2ljYWwgZGV2ICovCiAJZm9yIChpID0gMDsgaSA8IFZMQU5fTl9WSUQ7IGkrKykgewotCQlyb290X2RldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCBpKTsKKwkJcm9vdF9kZXYgPSBfX3ZsYW5fZmluZF9kZXZfZGVlcF9yY3UoZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIGkpOwogCQlpZiAoIXJvb3RfZGV2KQogCQkJY29udGludWU7CiAKQEAgLTU1MjgsMTMgKzU2NTQsNDEgQEAKICN1bmRlZiBGV19QQVJBTV9QRlZGCiAjdW5kZWYgRldfUEFSQU1fREVWCiAKLQkvKgotCSAqIFRoZXNlIGFyZSBmaW5hbGl6ZWQgYnkgRlcgaW5pdGlhbGl6YXRpb24sIGxvYWQgdGhlaXIgdmFsdWVzIG5vdy4KKwkvKiBUaGUgTVRVL01TUyBUYWJsZSBpcyBpbml0aWFsaXplZCBieSBub3csIHNvIGxvYWQgdGhlaXIgdmFsdWVzLiAgSWYKKwkgKiB3ZSdyZSBpbml0aWFsaXppbmcgdGhlIGFkYXB0ZXIsIHRoZW4gd2UnbGwgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucworCSAqIHdlIHdhbnQgdG8gdGhlIE1UVS9NU1MgVGFibGUgYW5kIGFsc28gaW5pdGlhbGl6ZSB0aGUgY29uZ2VzdGlvbgorCSAqIHBhcmFtZXRlcnMuCiAJICovCiAJdDRfcmVhZF9tdHVfdGJsKGFkYXAsIGFkYXAtPnBhcmFtcy5tdHVzLCBOVUxMKTsKLQl0NF9sb2FkX210dXMoYWRhcCwgYWRhcC0+cGFyYW1zLm10dXMsIGFkYXAtPnBhcmFtcy5hX3duZCwKLQkJICAgICBhZGFwLT5wYXJhbXMuYl93bmQpOworCWlmIChzdGF0ZSAhPSBERVZfU1RBVEVfSU5JVCkgeworCQlpbnQgaTsKIAorCQkvKiBUaGUgZGVmYXVsdCBNVFUgVGFibGUgY29udGFpbnMgdmFsdWVzIDE0OTIgYW5kIDE1MDAuCisJCSAqIEhvd2V2ZXIsIGZvciBUQ1AsIGl0J3MgYmV0dGVyIHRvIGhhdmUgdHdvIHZhbHVlcyB3aGljaCBhcmUKKwkJICogYSBtdWx0aXBsZSBvZiA4ICsvLSA0IGJ5dGVzIGFwYXJ0IG5lYXIgdGhpcyBwb3B1bGFyIE1UVS4KKwkJICogVGhpcyBhbGxvd3MgdXMgdG8gaGF2ZSBhIFRDUCBEYXRhIFBheWxvYWQgd2hpY2ggaXMgYQorCQkgKiBtdWx0aXBsZSBvZiA4IHJlZ2FyZGxlc3Mgb2Ygd2hhdCBjb21iaW5hdGlvbiBvZiBUQ1AgT3B0aW9ucworCQkgKiBhcmUgaW4gdXNlIChhbHdheXMgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzKSB3aGljaCBpcworCQkgKiBpbXBvcnRhbnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuICBGb3IgaW5zdGFuY2UsIGlmIG5vCisJCSAqIG9wdGlvbnMgYXJlIGluIHVzZSwgdGhlbiB3ZSBoYXZlIGEgMjAtYnl0ZSBJUCBoZWFkZXIgYW5kIGEKKwkJICogMjAtYnl0ZSBUQ1AgaGVhZGVyLiAgSW4gdGhpcyBjYXNlLCBhIDE1MDAtYnl0ZSBNU1Mgd291bGQKKwkJICogcmVzdWx0IGluIGEgVENQIERhdGEgUGF5bG9hZCBvZiAxNTAwIC0gNDAgPT0gMTQ2MCBieXRlcworCQkgKiB3aGljaCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgU28gdXNpbmcgYW4gTVNTIG9mIDE0ODggaW4KKwkJICogdGhpcyBjYXNlIHJlc3VsdHMgaW4gYSBUQ1AgRGF0YSBQYXlsb2FkIG9mIDE0NDggYnl0ZXMgd2hpY2gKKwkJICogaXMgYSBtdWx0aXBsZSBvZiA4LiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIDEyLWJ5dGUgVENQIFRpbWUKKwkJICogU3RhbXBzIGhhdmUgYmVlbiBuZWdvdGlhdGVkLCB0aGVuIGFuIE1UVSBvZiAxNTAwIGJ5dGVzCisJCSAqIHJlc3VsdHMgaW4gYSBUQ1AgRGF0YSBQYXlsb2FkIG9mIDE0NDggYnl0ZXMgd2hpY2gsIGFzCisJCSAqIGFib3ZlLCBpcyBhIG11bHRpcGxlIG9mIDggYnl0ZXMgLi4uCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgTk1UVVM7IGkrKykKKwkJCWlmIChhZGFwLT5wYXJhbXMubXR1c1tpXSA9PSAxNDkyKSB7CisJCQkJYWRhcC0+cGFyYW1zLm10dXNbaV0gPSAxNDg4OworCQkJCWJyZWFrOworCQkJfQorCisJCXQ0X2xvYWRfbXR1cyhhZGFwLCBhZGFwLT5wYXJhbXMubXR1cywgYWRhcC0+cGFyYW1zLmFfd25kLAorCQkJICAgICBhZGFwLT5wYXJhbXMuYl93bmQpOworCX0KIAl0NF9pbml0X3RwX3BhcmFtcyhhZGFwKTsKIAlhZGFwLT5mbGFncyB8PSBGV19PSzsKIAlyZXR1cm4gMDsKQEAgLTU2NjksMTIgKzU4MjMsMTIgQEAKIAkgICAgICAgKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF80MEcpICE9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3JzcHEoc3RydWN0IHNnZV9yc3BxICpxLCB1OCB0aW1lcl9pZHgsIHU4IHBrdF9jbnRfaWR4LAorc3RhdGljIGlubGluZSB2b2lkIGluaXRfcnNwcShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpxLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdXMsIHVuc2lnbmVkIGludCBjbnQsCiAJCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgaXFlX3NpemUpCiB7Ci0JcS0+aW50cl9wYXJhbXMgPSBRSU5UUl9USU1FUl9JRFgodGltZXJfaWR4KSB8Ci0JCQkgKHBrdF9jbnRfaWR4IDwgU0dFX05DT1VOVEVSUyA/IFFJTlRSX0NOVF9FTiA6IDApOwotCXEtPnBrdGNudF9pZHggPSBwa3RfY250X2lkeCA8IFNHRV9OQ09VTlRFUlMgPyBwa3RfY250X2lkeCA6IDA7CisJcS0+YWRhcCA9IGFkYXA7CisJc2V0X3JzcHFfaW50cl9wYXJhbXMocSwgdXMsIGNudCk7CiAJcS0+aXFlX2xlbiA9IGlxZV9zaXplOwogCXEtPnNpemUgPSBzaXplOwogfQpAQCAtNTY4OCw2ICs1ODQyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKIAlpbnQgaSwgcTEwZyA9IDAsIG4xMGcgPSAwLCBxaWR4ID0gMDsKKwlpbnQgY2lxX3NpemU7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpCiAJCW4xMGcgKz0gaXNfeF8xMGdfcG9ydCgmYWRhcDJwaW5mbyhhZGFwLCBpKS0+bGlua19jZmcpOwpAQCAtNTcyNiwxMiArNTg4MSwxMyBAQAogCQkJcy0+b2ZsZHFzZXRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKIAkJLyogRm9yIFJETUEgb25lIFJ4IHF1ZXVlIHBlciBjaGFubmVsIHN1ZmZpY2VzICovCiAJCXMtPnJkbWFxcyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7CisJCXMtPnJkbWFjaXFzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5ldGhyeHEpOyBpKyspIHsKIAkJc3RydWN0IHNnZV9ldGhfcnhxICpyID0gJnMtPmV0aHJ4cVtpXTsKIAotCQlpbml0X3JzcHEoJnItPnJzcHEsIDAsIDAsIDEwMjQsIDY0KTsKKwkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxMCwgMTAyNCwgNjQpOwogCQlyLT5mbC5zaXplID0gNzI7CiAJfQogCkBAIC01NzQ3LDcgKzU5MDMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPm9mbGRyeHEpOyBpKyspIHsKIAkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZzLT5vZmxkcnhxW2ldOwogCi0JCWluaXRfcnNwcSgmci0+cnNwcSwgMCwgMCwgMTAyNCwgNjQpOworCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIDEwMjQsIDY0KTsKIAkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfSVNDU0k7CiAJCXItPmZsLnNpemUgPSA3MjsKIAl9CkBAIC01NzU1LDEzICs1OTExLDI2IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+cmRtYXJ4cSk7IGkrKykgewogCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnMtPnJkbWFyeHFbaV07CiAKLQkJaW5pdF9yc3BxKCZyLT5yc3BxLCAwLCAwLCA1MTEsIDY0KTsKKwkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCA1MTEsIDY0KTsKIAkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfUkRNQTsKIAkJci0+Zmwuc2l6ZSA9IDcyOwogCX0KIAotCWluaXRfcnNwcSgmcy0+ZndfZXZ0cSwgNiwgMCwgNTEyLCA2NCk7Ci0JaW5pdF9yc3BxKCZzLT5pbnRycSwgNiwgMCwgMiAqIE1BWF9JTkdRLCA2NCk7CisJY2lxX3NpemUgPSA2NCArIGFkYXAtPnZyZXMuY3Euc2l6ZSArIGFkYXAtPnRpZHMubmZ0aWRzOworCWlmIChjaXFfc2l6ZSA+IFNHRV9NQVhfSVFfU0laRSkgeworCQlDSF9XQVJOKGFkYXAsICJDSVEgc2l6ZSB0b28gc21hbGwgZm9yIGF2YWlsYWJsZSBJUXNcbiIpOworCQljaXFfc2l6ZSA9IFNHRV9NQVhfSVFfU0laRTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5yZG1hY2lxKTsgaSsrKSB7CisJCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcy0+cmRtYWNpcVtpXTsKKworCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIGNpcV9zaXplLCA2NCk7CisJCXItPnJzcHEudWxkID0gQ1hHQjRfVUxEX1JETUE7CisJfQorCisJaW5pdF9yc3BxKGFkYXAsICZzLT5md19ldnRxLCAwLCAxLCAxMDI0LCA2NCk7CisJaW5pdF9yc3BxKGFkYXAsICZzLT5pbnRycSwgMCwgMSwgMiAqIE1BWF9JTkdRLCA2NCk7CiB9CiAKIC8qCkBAIC01ODA4LDkgKzU5NzcsOSBAQAogCiAJd2FudCA9IHMtPm1heF9ldGhxc2V0cyArIEVYVFJBX1ZFQ1M7CiAJaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKLQkJd2FudCArPSBzLT5yZG1hcXMgKyBzLT5vZmxkcXNldHM7CisJCXdhbnQgKz0gcy0+cmRtYXFzICsgcy0+cmRtYWNpcXMgKyBzLT5vZmxkcXNldHM7CiAJCS8qIG5lZWQgbmNoYW4gZm9yIGVhY2ggcG9zc2libGUgVUxEICovCi0JCW9mbGRfbmVlZCA9IDIgKiBuY2hhbjsKKwkJb2ZsZF9uZWVkID0gMyAqIG5jaGFuOwogCX0KIAluZWVkID0gYWRhcC0+cGFyYW1zLm5wb3J0cyArIEVYVFJBX1ZFQ1MgKyBvZmxkX25lZWQ7CiAKQEAgLTYwNzYsNyArNjI0NSw3IEBACiAJCW5ldGRldi0+cHJpdl9mbGFncyB8PSBJRkZfVU5JQ0FTVF9GTFQ7CiAKIAkJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmN4Z2I0X25ldGRldl9vcHM7Ci0JCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZjeGdiX2V0aHRvb2xfb3BzKTsKKwkJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZjeGdiX2V0aHRvb2xfb3BzOwogCX0KIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5oCmluZGV4IGUyNzRhMDQuLjU1ZTlkYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuaApAQCAtMjMyLDggKzIzMiwxMCBAQAogCWNvbnN0IHN0cnVjdCBjeGdiNF92aXJ0X3JlcyAqdnI7ICAgICAvKiBhc3NvcnRlZCBIVyByZXNvdXJjZXMgKi8KIAljb25zdCB1bnNpZ25lZCBzaG9ydCAqbXR1czsgICAgICAgICAgLyogTVRVIHRhYmxlICovCiAJY29uc3QgdW5zaWduZWQgc2hvcnQgKnJ4cV9pZHM7ICAgICAgIC8qIHRoZSBVTEQncyBSeCBxdWV1ZSBpZHMgKi8KKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqY2lxX2lkczsgICAgICAgLyogdGhlIFVMRCdzIGNvbmNlbnRyYXRvciBJUSBpZHMgKi8KIAl1bnNpZ25lZCBzaG9ydCBucnhxOyAgICAgICAgICAgICAgICAgLyogIyBvZiBSeCBxdWV1ZXMgKi8KIAl1bnNpZ25lZCBzaG9ydCBudHhxOyAgICAgICAgICAgICAgICAgLyogIyBvZiBUeCBxdWV1ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBuY2lxOwkJICAgICAvKiAjIG9mIGNvbmNlbnRyYXRvciBJUSAqLwogCXVuc2lnbmVkIGNoYXIgbmNoYW46NDsgICAgICAgICAgICAgICAvKiAjIG9mIGNoYW5uZWxzICovCiAJdW5zaWduZWQgY2hhciBucG9ydHM6NDsgICAgICAgICAgICAgIC8qICMgb2YgcG9ydHMgKi8KIAl1bnNpZ25lZCBjaGFyIHdyX2NyZWQ7ICAgICAgICAgICAgICAgLyogV1IgMTYtYnl0ZSBjcmVkaXRzICovCkBAIC0yNzQsNiArMjc2LDExIEBACiB1bnNpZ25lZCBpbnQgY3hnYjRfcG9ydF9pZHgoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB1bnNpZ25lZCBpbnQgY3hnYjRfYmVzdF9tdHUoY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXMsIHVuc2lnbmVkIHNob3J0IG10dSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgKmlkeCk7Cit1bnNpZ25lZCBpbnQgY3hnYjRfYmVzdF9hbGlnbmVkX210dShjb25zdCB1bnNpZ25lZCBzaG9ydCAqbXR1cywKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgaGVhZGVyX3NpemUsCisJCQkJICAgIHVuc2lnbmVkIHNob3J0IGRhdGFfc2l6ZV9tYXgsCisJCQkJICAgIHVuc2lnbmVkIHNob3J0IGRhdGFfc2l6ZV9hbGlnbiwKKwkJCQkgICAgdW5zaWduZWQgaW50ICptdHVfaWR4cCk7CiB2b2lkIGN4Z2I0X2dldF90Y3Bfc3RhdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB0cF90Y3Bfc3RhdHMgKnY0LAogCQkJIHN0cnVjdCB0cF90Y3Bfc3RhdHMgKnY2KTsKIHZvaWQgY3hnYjRfaXNjc2lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdGFnX21hc2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwppbmRleCBlMjQ5NTI4Li5kZDQzNTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKQEAgLTE2OTcsNyArMTY5Nyw4IEBACiAJCXJldHVybiBoYW5kbGVfdHJhY2VfcGt0KHEtPmFkYXAsIHNpKTsKIAogCXBrdCA9IChjb25zdCBzdHJ1Y3QgY3BsX3J4X3BrdCAqKXJzcDsKLQljc3VtX29rID0gcGt0LT5jc3VtX2NhbGMgJiYgIXBrdC0+ZXJyX3ZlYzsKKwljc3VtX29rID0gcGt0LT5jc3VtX2NhbGMgJiYgIXBrdC0+ZXJyX3ZlYyAmJgorCQkgIChxLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pOwogCWlmICgocGt0LT5sMmluZm8gJiBodG9ubChSWEZfVENQKSkgJiYKIAkgICAgKHEtPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dSTykgJiYgY3N1bV9vayAmJiAhcGt0LT5pcF9mcmFnKSB7CiAJCWRvX2dybyhyeHEsIHNpLCBwa3QpOwpAQCAtMTcyMCw4ICsxNzIxLDcgQEAKIAogCXJ4cS0+c3RhdHMucGt0cysrOwogCi0JaWYgKGNzdW1fb2sgJiYgKHEtPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgJiYKLQkgICAgKHBrdC0+bDJpbmZvICYgaHRvbmwoUlhGX1VEUCB8IFJYRl9UQ1ApKSkgeworCWlmIChjc3VtX29rICYmIChwa3QtPmwyaW5mbyAmIGh0b25sKFJYRl9VRFAgfCBSWEZfVENQKSkpIHsKIAkJaWYgKCFwa3QtPmlwX2ZyYWcpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQlyeHEtPnN0YXRzLnJ4X2NzbysrOwpAQCAtMjIxNSw3ICsyMjE1LDYgQEAKIAlpcS0+Y250eHRfaWQgPSBudG9ocyhjLmlxaWQpOwogCWlxLT5hYnNfaWQgPSBudG9ocyhjLnBoeXNpcWlkKTsKIAlpcS0+c2l6ZS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHN0YXR1cyBlbnRyeSAqLwotCWlxLT5hZGFwID0gYWRhcDsKIAlpcS0+bmV0ZGV2ID0gZGV2OwogCWlxLT5oYW5kbGVyID0gaG5kOwogCkBAIC0yNTE1LDYgKzI1MTQsMTAgQEAKIAkJaWYgKG9xLT5yc3BxLmRlc2MpCiAJCQlmcmVlX3JzcHFfZmwoYWRhcCwgJm9xLT5yc3BxLCAmb3EtPmZsKTsKIAl9CisJZm9yIChpID0gMCwgb3EgPSBhZGFwLT5zZ2UucmRtYWNpcTsgaSA8IGFkYXAtPnNnZS5yZG1hY2lxczsgaSsrLCBvcSsrKSB7CisJCWlmIChvcS0+cnNwcS5kZXNjKQorCQkJZnJlZV9yc3BxX2ZsKGFkYXAsICZvcS0+cnNwcSwgJm9xLT5mbCk7CisJfQogCiAJLyogY2xlYW4gdXAgb2ZmbG9hZCBUeCBxdWV1ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGFwLT5zZ2Uub2ZsZHR4cSk7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5oCmluZGV4IDFkMTYyM2IuLjcxYjc5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmgKQEAgLTY4LDYgKzY4LDcgQEAKIAlTR0VfTUFYX1dSX0xFTiA9IDUxMiwgICAgIC8qIG1heCBXUiBzaXplIGluIGJ5dGVzICovCiAJU0dFX05USU1FUlMgPSA2LCAgICAgICAgICAvKiAjIG9mIGludGVycnVwdCBob2xkb2ZmIHRpbWVyIHZhbHVlcyAqLwogCVNHRV9OQ09VTlRFUlMgPSA0LCAgICAgICAgLyogIyBvZiBpbnRlcnJ1cHQgcGFja2V0IGNvdW50ZXIgdmFsdWVzICovCisJU0dFX01BWF9JUV9TSVpFID0gNjU1MjAsCiAKIAlTR0VfVElNRVJfUlNUUlRfQ05UUiA9IDYsIC8qIHJlc3RhcnQgUlggcGFja2V0IHRocmVzaG9sZCBjb3VudGVyICovCiAJU0dFX1RJTUVSX1VQRF9DSURYID0gNywgICAvKiB1cGRhdGUgY2lkeCBvbmx5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaAppbmRleCBmMjczOGM3Li45NzNlYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmgKQEAgLTIyNyw2ICsyMjcsNyBAQAogI2RlZmluZSBERUxBQ0soeCkgICAgICgoeCkgPDwgNSkKICNkZWZpbmUgVUxQX01PREUoeCkgICAoKHgpIDw8IDgpCiAjZGVmaW5lIFJDVl9CVUZTSVooeCkgKCh4KSA8PCAxMikKKyNkZWZpbmUgUkNWX0JVRlNJWl9NQVNLIDB4M0ZGVQogI2RlZmluZSBEU0NQKHgpICAgICAgICgoeCkgPDwgMjIpCiAjZGVmaW5lIFNNQUNfU0VMKHgpICAgKCh1NjQpKHgpIDw8IDI4KQogI2RlZmluZSBMMlRfSURYKHgpICAgICgodTY0KSh4KSA8PCAzNikKQEAgLTI3OCw2ICsyNzksMTUgQEAKIAlfX2JlNjQgb3B0MDsKIH07CiAKK3N0cnVjdCBjcGxfdDVfcGFzc19hY2NlcHRfcnBsIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMzIgb3B0MjsKKwlfX2JlNjQgb3B0MDsKKwlfX2JlMzIgaXNzOworCV9fYmUzMiByc3ZkOworfTsKKwogc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgewogCVdSX0hEUjsKIAl1bmlvbiBvcGNvZGVfdGlkIG90OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCmluZGV4IDUyODU5MjguLmZmMWNkZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKQEAgLTI2NjQsNyArMjY2NCw3IEBACiAJCW5ldGRldi0+cHJpdl9mbGFncyB8PSBJRkZfVU5JQ0FTVF9GTFQ7CiAKIAkJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmN4Z2I0dmZfbmV0ZGV2X29wczsKLQkJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmN4Z2I0dmZfZXRodG9vbF9vcHMpOworCQluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmN4Z2I0dmZfZXRodG9vbF9vcHM7CiAKIAkJLyoKIAkJICogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUvc29mdHdhcmUgc3RhdGUgZm9yIHRoZSBwb3J0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCmluZGV4IDlkODhjMWQuLmJkZmE4MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKQEAgLTE1MTAsNyArMTUxMCw4IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAljb25zdCBzdHJ1Y3QgY3BsX3J4X3BrdCAqcGt0ID0gKHZvaWQgKilyc3A7Ci0JYm9vbCBjc3VtX29rID0gcGt0LT5jc3VtX2NhbGMgJiYgIXBrdC0+ZXJyX3ZlYzsKKwlib29sIGNzdW1fb2sgPSBwa3QtPmNzdW1fY2FsYyAmJiAhcGt0LT5lcnJfdmVjICYmCisJCSAgICAgICAocnNwcS0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKTsKIAlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9IGNvbnRhaW5lcl9vZihyc3BxLCBzdHJ1Y3Qgc2dlX2V0aF9yeHEsIHJzcHEpOwogCiAJLyoKQEAgLTE1MzgsOCArMTUzOSw4IEBACiAJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHJzcHEtPmlkeCk7CiAJcnhxLT5zdGF0cy5wa3RzKys7CiAKLQlpZiAoY3N1bV9vayAmJiAocnNwcS0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSAmJgotCSAgICAhcGt0LT5lcnJfdmVjICYmIChiZTMyX3RvX2NwdShwa3QtPmwyaW5mbykgJiAoUlhGX1VEUHxSWEZfVENQKSkpIHsKKwlpZiAoY3N1bV9vayAmJiAhcGt0LT5lcnJfdmVjICYmCisJICAgIChiZTMyX3RvX2NwdShwa3QtPmwyaW5mbykgJiAoUlhGX1VEUHxSWEZfVENQKSkpIHsKIAkJaWYgKCFwa3QtPmlwX2ZyYWcpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQllbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljLmgKaW5kZXggZTM1YzhlMC4uMTRmNDY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljLmgKQEAgLTQzLDYgKzQzLDggQEAKICNkZWZpbmUgRU5JQ19DUV9NQVgJCShFTklDX1dRX01BWCArIEVOSUNfUlFfTUFYKQogI2RlZmluZSBFTklDX0lOVFJfTUFYCQkoRU5JQ19DUV9NQVggKyAyKQogCisjZGVmaW5lIEVOSUNfQUlDX0xBUkdFX1BLVF9ESUZGCTMKKwogc3RydWN0IGVuaWNfbXNpeF9lbnRyeSB7CiAJaW50IHJlcXVlc3RlZDsKIAljaGFyIGRldm5hbWVbSUZOQU1TSVpdOwpAQCAtNTAsNiArNTIsMzMgQEAKIAl2b2lkICpkZXZpZDsKIH07CiAKKy8qIFN0b3JlIG9ubHkgdGhlIGxvd2VyIHJhbmdlLiAgSGlnaGVyIHJhbmdlIGlzIGdpdmVuIGJ5IGZ3LiAqLworc3RydWN0IGVuaWNfaW50cl9tb2RfcmFuZ2UgeworCXUzMiBzbWFsbF9wa3RfcmFuZ2Vfc3RhcnQ7CisJdTMyIGxhcmdlX3BrdF9yYW5nZV9zdGFydDsKK307CisKK3N0cnVjdCBlbmljX2ludHJfbW9kX3RhYmxlIHsKKwl1MzIgcnhfcmF0ZTsKKwl1MzIgcmFuZ2VfcGVyY2VudDsKK307CisKKyNkZWZpbmUgRU5JQ19NQVhfTElOS19TUEVFRFMJCTMKKyNkZWZpbmUgRU5JQ19MSU5LX1NQRUVEXzEwRwkJMTAwMDAKKyNkZWZpbmUgRU5JQ19MSU5LX1NQRUVEXzRHCQk0MDAwCisjZGVmaW5lIEVOSUNfTElOS180MEdfSU5ERVgJCTIKKyNkZWZpbmUgRU5JQ19MSU5LXzEwR19JTkRFWAkJMQorI2RlZmluZSBFTklDX0xJTktfNEdfSU5ERVgJCTAKKyNkZWZpbmUgRU5JQ19SWF9DT0FMRVNDRV9SQU5HRV9FTkQJMTI1CisjZGVmaW5lIEVOSUNfQUlDX1RTX0JSRUFLCQkxMDAKKworc3RydWN0IGVuaWNfcnhfY29hbCB7CisJdTMyIHNtYWxsX3BrdF9yYW5nZV9zdGFydDsKKwl1MzIgbGFyZ2VfcGt0X3JhbmdlX3N0YXJ0OworCXUzMiByYW5nZV9lbmQ7CisJdTMyIHVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKK307CisKIC8qIHByaXZfZmxhZ3MgKi8KICNkZWZpbmUgRU5JQ19TUklPVl9FTkFCTEVECQkoMSA8PCAwKQogCkBAIC04NSwxMyArMTE0LDEyIEBACiAJdTMyIG1zZ19lbmFibGU7CiAJc3BpbmxvY2tfdCBkZXZjbWRfbG9jazsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07Ci0JdTggbWNfYWRkcltFTklDX01VTFRJQ0FTVF9QRVJGRUNUX0ZJTFRFUlNdW0VUSF9BTEVOXTsKLQl1OCB1Y19hZGRyW0VOSUNfVU5JQ0FTVF9QRVJGRUNUX0ZJTFRFUlNdW0VUSF9BTEVOXTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHByaXZfZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1jX2NvdW50OwogCXVuc2lnbmVkIGludCB1Y19jb3VudDsKIAl1MzIgcG9ydF9tdHU7CisJc3RydWN0IGVuaWNfcnhfY29hbCByeF9jb2FsZXNjZV9zZXR0aW5nOwogCXUzMiByeF9jb2FsZXNjZV91c2VjczsKIAl1MzIgdHhfY29hbGVzY2VfdXNlY3M7CiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuYwppbmRleCA0YjZlNTY5Li4zZTI3ZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2Rldi5jCkBAIC04OCw3ICs4OCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGVuaWNfZGV2X2FkZF9hZGRyKHN0cnVjdCBlbmljICplbmljLCB1OCAqYWRkcikKK2ludCBlbmljX2Rldl9hZGRfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgY29uc3QgdTggKmFkZHIpCiB7CiAJaW50IGVycjsKIApAQCAtOTksNyArOTksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBlbmljX2Rldl9kZWxfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpCitpbnQgZW5pY19kZXZfZGVsX2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIGNvbnN0IHU4ICphZGRyKQogewogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuaAppbmRleCAxMjliMTRhLi4zNmVhMWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2Rldi5oCkBAIC00NSw4ICs0NSw4IEBACiBpbnQgZW5pY19kZXZfZGVsX3N0YXRpb25fYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYyk7CiBpbnQgZW5pY19kZXZfcGFja2V0X2ZpbHRlcihzdHJ1Y3QgZW5pYyAqZW5pYywgaW50IGRpcmVjdGVkLCBpbnQgbXVsdGljYXN0LAogCWludCBicm9hZGNhc3QsIGludCBwcm9taXNjLCBpbnQgYWxsbXVsdGkpOwotaW50IGVuaWNfZGV2X2FkZF9hZGRyKHN0cnVjdCBlbmljICplbmljLCB1OCAqYWRkcik7Ci1pbnQgZW5pY19kZXZfZGVsX2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIHU4ICphZGRyKTsKK2ludCBlbmljX2Rldl9hZGRfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgY29uc3QgdTggKmFkZHIpOworaW50IGVuaWNfZGV2X2RlbF9hZGRyKHN0cnVjdCBlbmljICplbmljLCBjb25zdCB1OCAqYWRkcik7CiBpbnQgZW5pY192bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgX19iZTE2IHByb3RvLCB1MTYgdmlkKTsKIGludCBlbmljX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgX19iZTE2IHByb3RvLCB1MTYgdmlkKTsKIGludCBlbmljX2Rldl9ub3RpZnlfdW5zZXQoc3RydWN0IGVuaWMgKmVuaWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19ldGh0b29sLmMKaW5kZXggNDdlMzU2Mi4uMmU1MGI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZXRodG9vbC5jCkBAIC03OSw2ICs3OSwxNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmljX25fdHhfc3RhdHMgPSBBUlJBWV9TSVpFKGVuaWNfdHhfc3RhdHMpOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmljX25fcnhfc3RhdHMgPSBBUlJBWV9TSVpFKGVuaWNfcnhfc3RhdHMpOwogCit2b2lkIGVuaWNfaW50cl9jb2FsX3NldF9yeChzdHJ1Y3QgZW5pYyAqZW5pYywgdTMyIHRpbWVyKQoreworCWludCBpOworCWludCBpbnRyOworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPnJxX2NvdW50OyBpKyspIHsKKwkJaW50ciA9IGVuaWNfbXNpeF9ycV9pbnRyKGVuaWMsIGkpOworCQl2bmljX2ludHJfY29hbGVzY2luZ190aW1lcl9zZXQoJmVuaWMtPmludHJbaW50cl0sIHRpbWVyKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZW5pY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAlzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CkBAIC05Myw4ICsxMDQsOCBAQAogCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgdm5pY19kZXZfcG9ydF9zcGVlZChlbmljLT52ZGV2KSk7CiAJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CkBAIC0xNzgsOSArMTg5LDE0IEBACiAJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjbWQpCiB7CiAJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlbmljX3J4X2NvYWwgKnJ4Y29hbCA9ICZlbmljLT5yeF9jb2FsZXNjZV9zZXR0aW5nOwogCiAJZWNtZC0+dHhfY29hbGVzY2VfdXNlY3MgPSBlbmljLT50eF9jb2FsZXNjZV91c2VjczsKIAllY21kLT5yeF9jb2FsZXNjZV91c2VjcyA9IGVuaWMtPnJ4X2NvYWxlc2NlX3VzZWNzOworCWlmIChyeGNvYWwtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKKwkJZWNtZC0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gMTsKKwllY21kLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPSByeGNvYWwtPnNtYWxsX3BrdF9yYW5nZV9zdGFydDsKKwllY21kLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoID0gcnhjb2FsLT5yYW5nZV9lbmQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MSwxNyArMjA3LDMxIEBACiAJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXUzMiB0eF9jb2FsZXNjZV91c2VjczsKIAl1MzIgcnhfY29hbGVzY2VfdXNlY3M7CisJdTMyIHJ4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwl1MzIgcnhfY29hbGVzY2VfdXNlY3NfaGlnaDsKKwl1MzIgY29hbGVzY2VfdXNlY3NfbWF4OwogCXVuc2lnbmVkIGludCBpLCBpbnRyOworCXN0cnVjdCBlbmljX3J4X2NvYWwgKnJ4Y29hbCA9ICZlbmljLT5yeF9jb2FsZXNjZV9zZXR0aW5nOwogCisJY29hbGVzY2VfdXNlY3NfbWF4ID0gdm5pY19kZXZfZ2V0X2ludHJfY29hbF90aW1lcl9tYXgoZW5pYy0+dmRldik7CiAJdHhfY29hbGVzY2VfdXNlY3MgPSBtaW5fdCh1MzIsIGVjbWQtPnR4X2NvYWxlc2NlX3VzZWNzLAotCQl2bmljX2Rldl9nZXRfaW50cl9jb2FsX3RpbWVyX21heChlbmljLT52ZGV2KSk7CisJCQkJICBjb2FsZXNjZV91c2Vjc19tYXgpOwogCXJ4X2NvYWxlc2NlX3VzZWNzID0gbWluX3QodTMyLCBlY21kLT5yeF9jb2FsZXNjZV91c2VjcywKLQkJdm5pY19kZXZfZ2V0X2ludHJfY29hbF90aW1lcl9tYXgoZW5pYy0+dmRldikpOworCQkJCSAgY29hbGVzY2VfdXNlY3NfbWF4KTsKKworCXJ4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IG1pbl90KHUzMiwgZWNtZC0+cnhfY29hbGVzY2VfdXNlY3NfbG93LAorCQkJCSAgICAgIGNvYWxlc2NlX3VzZWNzX21heCk7CisJcnhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IG1pbl90KHUzMiwgZWNtZC0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaCwKKwkJCQkgICAgICAgY29hbGVzY2VfdXNlY3NfbWF4KTsKIAogCXN3aXRjaCAodm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KSkgewogCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX0lOVFg6CiAJCWlmICh0eF9jb2FsZXNjZV91c2VjcyAhPSByeF9jb2FsZXNjZV91c2VjcykKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZWNtZC0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlCXx8CisJCSAgICBlY21kLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cJCXx8CisJCSAgICBlY21kLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJCWludHIgPSBlbmljX2xlZ2FjeV9pb19pbnRyKCk7CiAJCXZuaWNfaW50cl9jb2FsZXNjaW5nX3RpbWVyX3NldCgmZW5pYy0+aW50cltpbnRyXSwKQEAgLTIxMCw2ICsyNDAsMTAgQEAKIAljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0k6CiAJCWlmICh0eF9jb2FsZXNjZV91c2VjcyAhPSByeF9jb2FsZXNjZV91c2VjcykKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZWNtZC0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlCXx8CisJCSAgICBlY21kLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cJCXx8CisJCSAgICBlY21kLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJCXZuaWNfaW50cl9jb2FsZXNjaW5nX3RpbWVyX3NldCgmZW5pYy0+aW50clswXSwKIAkJCXR4X2NvYWxlc2NlX3VzZWNzKTsKQEAgLTIyMSwxMiArMjU1LDI3IEBACiAJCQkJdHhfY29hbGVzY2VfdXNlY3MpOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IGVuaWMtPnJxX2NvdW50OyBpKyspIHsKLQkJCWludHIgPSBlbmljX21zaXhfcnFfaW50cihlbmljLCBpKTsKLQkJCXZuaWNfaW50cl9jb2FsZXNjaW5nX3RpbWVyX3NldCgmZW5pYy0+aW50cltpbnRyXSwKLQkJCQlyeF9jb2FsZXNjZV91c2Vjcyk7CisJCWlmIChyeGNvYWwtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkgeworCQkJaWYgKCFlY21kLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpIHsKKwkJCQlyeGNvYWwtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IDA7CisJCQkJZW5pY19pbnRyX2NvYWxfc2V0X3J4KGVuaWMsIHJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChlY21kLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCQkJcnhjb2FsLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAxOworCQkJZWxzZQorCQkJCWVuaWNfaW50cl9jb2FsX3NldF9yeChlbmljLCByeF9jb2FsZXNjZV91c2Vjcyk7CiAJCX0KIAorCQlpZiAoZWNtZC0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaCkgeworCQkJaWYgKHJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPAorCQkJICAgIChyeF9jb2FsZXNjZV91c2Vjc19sb3cgKyBFTklDX0FJQ19MQVJHRV9QS1RfRElGRikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyeGNvYWwtPnJhbmdlX2VuZCA9IHJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2g7CisJCQlyeGNvYWwtPnNtYWxsX3BrdF9yYW5nZV9zdGFydCA9IHJ4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwkJCXJ4Y29hbC0+bGFyZ2VfcGt0X3JhbmdlX3N0YXJ0ID0gcnhfY29hbGVzY2VfdXNlY3NfbG93ICsKKwkJCQkJCQlFTklDX0FJQ19MQVJHRV9QS1RfRElGRjsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTI1Myw1ICszMDIsNSBAQAogCiB2b2lkIGVuaWNfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmVuaWNfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmZW5pY19ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfbWFpbi5jCmluZGV4IDI5NDU3MTguLmYzMmY4MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX21haW4uYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAKICNpbmNsdWRlICJjcV9lbmV0X2Rlc2MuaCIKICNpbmNsdWRlICJ2bmljX2Rldi5oIgpAQCAtNzIsNiArNzMsMzUgQEAKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlbmljX2lkX3RhYmxlKTsKIAorI2RlZmluZSBFTklDX0xBUkdFX1BLVF9USFJFU0hPTEQJCTEwMDAKKyNkZWZpbmUgRU5JQ19NQVhfQ09BTEVTQ0VfVElNRVJTCQkxMAorLyogIEludGVycnVwdCBtb2RlcmF0aW9uIHRhYmxlLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHRoZQorICogIGNvYWxlc2NpbmcgdGltZXIgdmFsdWVzCisgKiAge3J4X3JhdGUgaW4gTWJwcywgbWFwcGluZyBwZXJjZW50YWdlIG9mIHRoZSByYW5nZX0KKyAqLworc3RydWN0IGVuaWNfaW50cl9tb2RfdGFibGUgbW9kX3RhYmxlW0VOSUNfTUFYX0NPQUxFU0NFX1RJTUVSUyArIDFdID0geworCXs0MDAwLCAgMH0sCisJezQ0MDAsIDEwfSwKKwl7NTA2MCwgMjB9LAorCXs1MjMwLCAzMH0sCisJezU1NDAsIDQwfSwKKwl7NTgyMCwgNTB9LAorCXs2MTIwLCA2MH0sCisJezY0MzUsIDcwfSwKKwl7Njc0NSwgODB9LAorCXs3MDAwLCA5MH0sCisJezB4RkZGRkZGRkYsIDEwMH0KK307CisKKy8qIFRoaXMgdGFibGUgaGVscHMgdGhlIGRyaXZlciB0byBwaWNrIGRpZmZlcmVudCByYW5nZXMgZm9yIHJ4IGNvYWxlc2NpbmcKKyAqIHRpbWVyIGRlcGVuZGluZyBvbiB0aGUgbGluayBzcGVlZC4KKyAqLworc3RydWN0IGVuaWNfaW50cl9tb2RfcmFuZ2UgbW9kX3JhbmdlW0VOSUNfTUFYX0xJTktfU1BFRURTXSA9IHsKKwl7MCwgIDB9LCAvKiAwICAtIDQgIEdicHMgKi8KKwl7MCwgIDN9LCAvKiA0ICAtIDEwIEdicHMgKi8KKwl7MywgIDZ9LCAvKiAxMCAtIDQwIEdicHMgKi8KK307CisKIGludCBlbmljX2lzX2R5bmFtaWMoc3RydWN0IGVuaWMgKmVuaWMpCiB7CiAJcmV0dXJuIGVuaWMtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NJU0NPX1ZJQ19FTkVUX0RZTjsKQEAgLTU4Niw4ICs2MTYsNzEgQEAKIAlyZXR1cm4gbmV0X3N0YXRzOwogfQogCitzdGF0aWMgaW50IGVuaWNfbWNfc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1OCAqbWNfYWRkcikKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoZW5pYy0+bWNfY291bnQgPT0gRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTKSB7CisJCXVuc2lnbmVkIGludCBtY19jb3VudCA9IG5ldGRldl9tY19jb3VudChuZXRkZXYpOworCisJCW5ldGRldl93YXJuKG5ldGRldiwgIlJlZ2lzdGVyaW5nIG9ubHkgJWQgb3V0IG9mICVkIG11bHRpY2FzdCBhZGRyZXNzZXNcbiIsCisJCQkgICAgRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTLCBtY19jb3VudCk7CisKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZW5pY19kZXZfYWRkX2FkZHIoZW5pYywgbWNfYWRkcik7CisJZW5pYy0+bWNfY291bnQrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuaWNfbWNfdW5zeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHU4ICptY19hZGRyKQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWVuaWNfZGV2X2RlbF9hZGRyKGVuaWMsIG1jX2FkZHIpOworCWVuaWMtPm1jX2NvdW50LS07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmljX3VjX3N5bmMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTggKnVjX2FkZHIpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGVuaWMtPnVjX2NvdW50ID09IEVOSUNfVU5JQ0FTVF9QRVJGRUNUX0ZJTFRFUlMpIHsKKwkJdW5zaWduZWQgaW50IHVjX2NvdW50ID0gbmV0ZGV2X3VjX2NvdW50KG5ldGRldik7CisKKwkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAiUmVnaXN0ZXJpbmcgb25seSAlZCBvdXQgb2YgJWQgdW5pY2FzdCBhZGRyZXNzZXNcbiIsCisJCQkgICAgRU5JQ19VTklDQVNUX1BFUkZFQ1RfRklMVEVSUywgdWNfY291bnQpOworCisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVuaWNfZGV2X2FkZF9hZGRyKGVuaWMsIHVjX2FkZHIpOworCWVuaWMtPnVjX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmljX3VjX3Vuc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1OCAqdWNfYWRkcikKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwllbmljX2Rldl9kZWxfYWRkcihlbmljLCB1Y19hZGRyKTsKKwllbmljLT51Y19jb3VudC0tOworCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgZW5pY19yZXNldF9hZGRyX2xpc3RzKHN0cnVjdCBlbmljICplbmljKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7CisKKwlfX2Rldl91Y191bnN5bmMobmV0ZGV2LCBOVUxMKTsKKwlfX2Rldl9tY191bnN5bmMobmV0ZGV2LCBOVUxMKTsKKwogCWVuaWMtPm1jX2NvdW50ID0gMDsKIAllbmljLT51Y19jb3VudCA9IDA7CiAJZW5pYy0+ZmxhZ3MgPSAwOwpAQCAtNjU0LDExMiArNzQ3LDYgQEAKIAlyZXR1cm4gZW5pY19kZXZfYWRkX3N0YXRpb25fYWRkcihlbmljKTsKIH0KIAotc3RhdGljIHZvaWQgZW5pY191cGRhdGVfbXVsdGljYXN0X2FkZHJfbGlzdChzdHJ1Y3QgZW5pYyAqZW5pYykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZW5pYy0+bmV0ZGV2OwotCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JdW5zaWduZWQgaW50IG1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KG5ldGRldik7Ci0JdTggbWNfYWRkcltFTklDX01VTFRJQ0FTVF9QRVJGRUNUX0ZJTFRFUlNdW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCWlmIChtY19jb3VudCA+IEVOSUNfTVVMVElDQVNUX1BFUkZFQ1RfRklMVEVSUykgewotCQluZXRkZXZfd2FybihuZXRkZXYsICJSZWdpc3RlcmluZyBvbmx5ICVkIG91dCBvZiAlZCAiCi0JCQkibXVsdGljYXN0IGFkZHJlc3Nlc1xuIiwKLQkJCUVOSUNfTVVMVElDQVNUX1BFUkZFQ1RfRklMVEVSUywgbWNfY291bnQpOwotCQltY19jb3VudCA9IEVOSUNfTVVMVElDQVNUX1BFUkZFQ1RfRklMVEVSUzsKLQl9Ci0KLQkvKiBJcyB0aGVyZSBhbiBlYXNpZXIgd2F5PyAgVHJ5aW5nIHRvIG1pbmltaXplIHRvCi0JICogY2FsbHMgdG8gYWRkL2RlbCBtdWx0aWNhc3QgYWRkcnMuICBXZSBrZWVwIHRoZQotCSAqIGFkZHJzIGZyb20gdGhlIGxhc3QgY2FsbCBpbiBlbmljLT5tY19hZGRyIGFuZAotCSAqIGxvb2sgZm9yIGNoYW5nZXMgdG8gYWRkL2RlbC4KLQkgKi8KLQotCWkgPSAwOwotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpIHsKLQkJaWYgKGkgPT0gbWNfY291bnQpCi0JCQlicmVhazsKLQkJbWVtY3B5KG1jX2FkZHJbaSsrXSwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+bWNfY291bnQ7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgbWNfY291bnQ7IGorKykKLQkJCWlmIChldGhlcl9hZGRyX2VxdWFsKGVuaWMtPm1jX2FkZHJbaV0sIG1jX2FkZHJbal0pKQotCQkJCWJyZWFrOwotCQlpZiAoaiA9PSBtY19jb3VudCkKLQkJCWVuaWNfZGV2X2RlbF9hZGRyKGVuaWMsIGVuaWMtPm1jX2FkZHJbaV0pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBlbmljLT5tY19jb3VudDsgaisrKQotCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobWNfYWRkcltpXSwgZW5pYy0+bWNfYWRkcltqXSkpCi0JCQkJYnJlYWs7Ci0JCWlmIChqID09IGVuaWMtPm1jX2NvdW50KQotCQkJZW5pY19kZXZfYWRkX2FkZHIoZW5pYywgbWNfYWRkcltpXSk7Ci0JfQotCi0JLyogU2F2ZSB0aGUgbGlzdCB0byBjb21wYXJlIGFnYWluc3QgbmV4dCB0aW1lCi0JICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykKLQkJbWVtY3B5KGVuaWMtPm1jX2FkZHJbaV0sIG1jX2FkZHJbaV0sIEVUSF9BTEVOKTsKLQotCWVuaWMtPm1jX2NvdW50ID0gbWNfY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuaWNfdXBkYXRlX3VuaWNhc3RfYWRkcl9saXN0KHN0cnVjdCBlbmljICplbmljKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQl1bnNpZ25lZCBpbnQgdWNfY291bnQgPSBuZXRkZXZfdWNfY291bnQobmV0ZGV2KTsKLQl1OCB1Y19hZGRyW0VOSUNfVU5JQ0FTVF9QRVJGRUNUX0ZJTFRFUlNdW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCWlmICh1Y19jb3VudCA+IEVOSUNfVU5JQ0FTVF9QRVJGRUNUX0ZJTFRFUlMpIHsKLQkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAiUmVnaXN0ZXJpbmcgb25seSAlZCBvdXQgb2YgJWQgIgotCQkJInVuaWNhc3QgYWRkcmVzc2VzXG4iLAotCQkJRU5JQ19VTklDQVNUX1BFUkZFQ1RfRklMVEVSUywgdWNfY291bnQpOwotCQl1Y19jb3VudCA9IEVOSUNfVU5JQ0FTVF9QRVJGRUNUX0ZJTFRFUlM7Ci0JfQotCi0JLyogSXMgdGhlcmUgYW4gZWFzaWVyIHdheT8gIFRyeWluZyB0byBtaW5pbWl6ZSB0bwotCSAqIGNhbGxzIHRvIGFkZC9kZWwgdW5pY2FzdCBhZGRycy4gIFdlIGtlZXAgdGhlCi0JICogYWRkcnMgZnJvbSB0aGUgbGFzdCBjYWxsIGluIGVuaWMtPnVjX2FkZHIgYW5kCi0JICogbG9vayBmb3IgY2hhbmdlcyB0byBhZGQvZGVsLgotCSAqLwotCi0JaSA9IDA7Ci0JbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgewotCQlpZiAoaSA9PSB1Y19jb3VudCkKLQkJCWJyZWFrOwotCQltZW1jcHkodWNfYWRkcltpKytdLCBoYS0+YWRkciwgRVRIX0FMRU4pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBlbmljLT51Y19jb3VudDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCB1Y19jb3VudDsgaisrKQotCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoZW5pYy0+dWNfYWRkcltpXSwgdWNfYWRkcltqXSkpCi0JCQkJYnJlYWs7Ci0JCWlmIChqID09IHVjX2NvdW50KQotCQkJZW5pY19kZXZfZGVsX2FkZHIoZW5pYywgZW5pYy0+dWNfYWRkcltpXSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHVjX2NvdW50OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IGVuaWMtPnVjX2NvdW50OyBqKyspCi0JCQlpZiAoZXRoZXJfYWRkcl9lcXVhbCh1Y19hZGRyW2ldLCBlbmljLT51Y19hZGRyW2pdKSkKLQkJCQlicmVhazsKLQkJaWYgKGogPT0gZW5pYy0+dWNfY291bnQpCi0JCQllbmljX2Rldl9hZGRfYWRkcihlbmljLCB1Y19hZGRyW2ldKTsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBsaXN0IHRvIGNvbXBhcmUgYWdhaW5zdCBuZXh0IHRpbWUKLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCB1Y19jb3VudDsgaSsrKQotCQltZW1jcHkoZW5pYy0+dWNfYWRkcltpXSwgdWNfYWRkcltpXSwgRVRIX0FMRU4pOwotCi0JZW5pYy0+dWNfY291bnQgPSB1Y19jb3VudDsKLX0KLQogLyogbmV0aWZfdHhfbG9jayBoZWxkLCBCSHMgZGlzYWJsZWQgKi8KIHN0YXRpYyB2b2lkIGVuaWNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKQEAgLTc4Miw5ICs3NjksOSBAQAogCX0KIAogCWlmICghcHJvbWlzYykgewotCQllbmljX3VwZGF0ZV91bmljYXN0X2FkZHJfbGlzdChlbmljKTsKKwkJX19kZXZfdWNfc3luYyhuZXRkZXYsIGVuaWNfdWNfc3luYywgZW5pY191Y191bnN5bmMpOwogCQlpZiAoIWFsbG11bHRpKQotCQkJZW5pY191cGRhdGVfbXVsdGljYXN0X2FkZHJfbGlzdChlbmljKTsKKwkJCV9fZGV2X21jX3N5bmMobmV0ZGV2LCBlbmljX21jX3N5bmMsIGVuaWNfbWNfdW5zeW5jKTsKIAl9CiB9CiAKQEAgLTk3OSw2ICs5NjYsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZW5pY19pbnRyX3VwZGF0ZV9wa3Rfc2l6ZShzdHJ1Y3Qgdm5pY19yeF9ieXRlc19jb3VudGVyICpwa3Rfc2l6ZSwKKwkJCQkgICAgICB1MzIgcGt0X2xlbikKK3sKKwlpZiAoRU5JQ19MQVJHRV9QS1RfVEhSRVNIT0xEIDw9IHBrdF9sZW4pCisJCXBrdF9zaXplLT5sYXJnZV9wa3RfYnl0ZXNfY250ICs9IHBrdF9sZW47CisJZWxzZQorCQlwa3Rfc2l6ZS0+c21hbGxfcGt0X2J5dGVzX2NudCArPSBwa3RfbGVuOworfQorCiBzdGF0aWMgdm9pZCBlbmljX3JxX2luZGljYXRlX2J1ZihzdHJ1Y3Qgdm5pY19ycSAqcnEsCiAJc3RydWN0IGNxX2Rlc2MgKmNxX2Rlc2MsIHN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmLAogCWludCBza2lwcGVkLCB2b2lkICpvcGFxdWUpCkBAIC05ODYsNiArOTgyLDcgQEAKIAlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYocnEtPnZkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgdm5pY19jcSAqY3EgPSAmZW5pYy0+Y3FbZW5pY19jcV9ycShlbmljLCBycS0+aW5kZXgpXTsKIAogCXU4IHR5cGUsIGNvbG9yLCBlb3AsIHNvcCwgaW5ncmVzc19wb3J0LCB2bGFuX3N0cmlwcGVkOwogCXU4IGZjb2UsIGZjb2Vfc29mLCBmY29lX2ZjX2NyY19vaywgZmNvZV9lbmNfZXJyb3IsIGZjb2VfZW9mOwpAQCAtMTA1Niw2ICsxMDUzLDkgQEAKIAkJCW5hcGlfZ3JvX3JlY2VpdmUoJmVuaWMtPm5hcGlbcV9udW1iZXJdLCBza2IpOwogCQllbHNlCiAJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQlpZiAoZW5pYy0+cnhfY29hbGVzY2Vfc2V0dGluZy51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCQllbmljX2ludHJfdXBkYXRlX3BrdF9zaXplKCZjcS0+cGt0X3NpemVfY291bnRlciwKKwkJCQkJCSAgYnl0ZXNfd3JpdHRlbik7CiAJfSBlbHNlIHsKIAogCQkvKiBCdWZmZXIgb3ZlcmZsb3cKQEAgLTExMzQsNiArMTEzNCw2NCBAQAogCXJldHVybiBycV93b3JrX2RvbmU7CiB9CiAKK3N0YXRpYyB2b2lkIGVuaWNfc2V0X2ludF9tb2RlcmF0aW9uKHN0cnVjdCBlbmljICplbmljLCBzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJdW5zaWduZWQgaW50IGludHIgPSBlbmljX21zaXhfcnFfaW50cihlbmljLCBycS0+aW5kZXgpOworCXN0cnVjdCB2bmljX2NxICpjcSA9ICZlbmljLT5jcVtlbmljX2NxX3JxKGVuaWMsIHJxLT5pbmRleCldOworCXUzMiB0aW1lciA9IGNxLT50b2JlX3J4X2NvYWxfdGltZXZhbDsKKworCWlmIChjcS0+dG9iZV9yeF9jb2FsX3RpbWV2YWwgIT0gY3EtPmN1cl9yeF9jb2FsX3RpbWV2YWwpIHsKKwkJdm5pY19pbnRyX2NvYWxlc2NpbmdfdGltZXJfc2V0KCZlbmljLT5pbnRyW2ludHJdLCB0aW1lcik7CisJCWNxLT5jdXJfcnhfY29hbF90aW1ldmFsID0gY3EtPnRvYmVfcnhfY29hbF90aW1ldmFsOworCX0KK30KKworc3RhdGljIHZvaWQgZW5pY19jYWxjX2ludF9tb2RlcmF0aW9uKHN0cnVjdCBlbmljICplbmljLCBzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJc3RydWN0IGVuaWNfcnhfY29hbCAqcnhfY29hbCA9ICZlbmljLT5yeF9jb2FsZXNjZV9zZXR0aW5nOworCXN0cnVjdCB2bmljX2NxICpjcSA9ICZlbmljLT5jcVtlbmljX2NxX3JxKGVuaWMsIHJxLT5pbmRleCldOworCXN0cnVjdCB2bmljX3J4X2J5dGVzX2NvdW50ZXIgKnBrdF9zaXplX2NvdW50ZXIgPSAmY3EtPnBrdF9zaXplX2NvdW50ZXI7CisJaW50IGluZGV4OworCXUzMiB0aW1lcjsKKwl1MzIgcmFuZ2Vfc3RhcnQ7CisJdTMyIHRyYWZmaWM7CisJdTY0IGRlbHRhOworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwlkZWx0YSA9IGt0aW1lX3VzX2RlbHRhKG5vdywgY3EtPnByZXZfdHMpOworCWlmIChkZWx0YSA8IEVOSUNfQUlDX1RTX0JSRUFLKQorCQlyZXR1cm47CisJY3EtPnByZXZfdHMgPSBub3c7CisKKwl0cmFmZmljID0gcGt0X3NpemVfY291bnRlci0+bGFyZ2VfcGt0X2J5dGVzX2NudCArCisJCSAgcGt0X3NpemVfY291bnRlci0+c21hbGxfcGt0X2J5dGVzX2NudDsKKwkvKiBUaGUgdGFibGUgdGFrZXMgTWJwcworCSAqIHRyYWZmaWMgKj0gOCAgICA9PiBiaXRzCisJICogdHJhZmZpYyAqPSAoMTBeNiAvIGRlbHRhKSAgICA9PiBicHMKKwkgKiB0cmFmZmljIC89IDEwXjYgICAgID0+IE1icHMKKwkgKgorCSAqIENvbWJpbmluZywgdHJhZmZpYyAqPSAoOCAvIGRlbHRhKQorCSAqLworCisJdHJhZmZpYyA8PD0gMzsKKwl0cmFmZmljID0gZGVsdGEgPiBVSU5UX01BWCA/IDAgOiB0cmFmZmljIC8gKHUzMilkZWx0YTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEVOSUNfTUFYX0NPQUxFU0NFX1RJTUVSUzsgaW5kZXgrKykKKwkJaWYgKHRyYWZmaWMgPCBtb2RfdGFibGVbaW5kZXhdLnJ4X3JhdGUpCisJCQlicmVhazsKKwlyYW5nZV9zdGFydCA9IChwa3Rfc2l6ZV9jb3VudGVyLT5zbWFsbF9wa3RfYnl0ZXNfY250ID4KKwkJICAgICAgIHBrdF9zaXplX2NvdW50ZXItPmxhcmdlX3BrdF9ieXRlc19jbnQgPDwgMSkgPworCQkgICAgICByeF9jb2FsLT5zbWFsbF9wa3RfcmFuZ2Vfc3RhcnQgOgorCQkgICAgICByeF9jb2FsLT5sYXJnZV9wa3RfcmFuZ2Vfc3RhcnQ7CisJdGltZXIgPSByYW5nZV9zdGFydCArICgocnhfY29hbC0+cmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQpICoKKwkJCSAgICAgICBtb2RfdGFibGVbaW5kZXhdLnJhbmdlX3BlcmNlbnQgLyAxMDApOworCS8qIERhbXBpbmcgKi8KKwljcS0+dG9iZV9yeF9jb2FsX3RpbWV2YWwgPSAodGltZXIgKyBjcS0+dG9iZV9yeF9jb2FsX3RpbWV2YWwpID4+IDE7CisKKwlwa3Rfc2l6ZV9jb3VudGVyLT5sYXJnZV9wa3RfYnl0ZXNfY250ID0gMDsKKwlwa3Rfc2l6ZV9jb3VudGVyLT5zbWFsbF9wa3RfYnl0ZXNfY250ID0gMDsKK30KKwogc3RhdGljIGludCBlbmljX3BvbGxfbXNpeChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktPmRldjsKQEAgLTExNzEsNiArMTIyOSwxMyBAQAogCiAJaWYgKGVycikKIAkJd29ya19kb25lID0gd29ya190b19kbzsKKwlpZiAoZW5pYy0+cnhfY29hbGVzY2Vfc2V0dGluZy51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCS8qIENhbGwgdGhlIGZ1bmN0aW9uIHdoaWNoIHJlZnJlc2hlcworCQkgKiB0aGUgaW50ciBjb2FsZXNjaW5nIHRpbWVyIHZhbHVlIGJhc2VkIG9uCisJCSAqIHRoZSB0cmFmZmljLiAgVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbgorCQkgKiB0aGUgY2FzZSBvZiBNU0kteCBtb2RlCisJCSAqLworCQllbmljX2NhbGNfaW50X21vZGVyYXRpb24oZW5pYywgJmVuaWMtPnJxW3JxXSk7CiAKIAlpZiAod29ya19kb25lIDwgd29ya190b19kbykgewogCkBAIC0xMTc5LDYgKzEyNDQsOCBAQAogCQkgKi8KIAogCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQlpZiAoZW5pYy0+cnhfY29hbGVzY2Vfc2V0dGluZy51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCQllbmljX3NldF9pbnRfbW9kZXJhdGlvbihlbmljLCAmZW5pYy0+cnFbcnFdKTsKIAkJdm5pY19pbnRyX3VubWFzaygmZW5pYy0+aW50cltpbnRyXSk7CiAJfQogCkBAIC0xMzE0LDYgKzEzODEsNDIgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGVuaWNfc2V0X3J4X2NvYWxfc2V0dGluZyhzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisJaW50IGluZGV4ID0gLTE7CisJc3RydWN0IGVuaWNfcnhfY29hbCAqcnhfY29hbCA9ICZlbmljLT5yeF9jb2FsZXNjZV9zZXR0aW5nOworCisJLyogSWYgaW50ciBtb2RlIGlzIG5vdCBNU0lYLCBkbyBub3QgZG8gYWRhcHRpdmUgY29hbGVzY2luZyAqLworCWlmIChWTklDX0RFVl9JTlRSX01PREVfTVNJWCAhPSB2bmljX2Rldl9nZXRfaW50cl9tb2RlKGVuaWMtPnZkZXYpKSB7CisJCW5ldGRldl9pbmZvKGVuaWMtPm5ldGRldiwgIklOVFIgbW9kZSBpcyBub3QgTVNJWCwgTm90IGluaXRpYWxpemluZyBhZGFwdGl2ZSBjb2FsZXNjaW5nIik7CisJCXJldHVybjsKKwl9CisKKwkvKiAxLiBSZWFkIHRoZSBsaW5rIHNwZWVkIGZyb20gZncKKwkgKiAyLiBQaWNrIHRoZSBkZWZhdWx0IHJhbmdlIGZvciB0aGUgc3BlZWQKKwkgKiAzLiBVcGRhdGUgaXQgaW4gZW5pYy0+cnhfY29hbGVzY2Vfc2V0dGluZworCSAqLworCXNwZWVkID0gdm5pY19kZXZfcG9ydF9zcGVlZChlbmljLT52ZGV2KTsKKwlpZiAoRU5JQ19MSU5LX1NQRUVEXzEwRyA8IHNwZWVkKQorCQlpbmRleCA9IEVOSUNfTElOS180MEdfSU5ERVg7CisJZWxzZSBpZiAoRU5JQ19MSU5LX1NQRUVEXzRHIDwgc3BlZWQpCisJCWluZGV4ID0gRU5JQ19MSU5LXzEwR19JTkRFWDsKKwllbHNlCisJCWluZGV4ID0gRU5JQ19MSU5LXzRHX0lOREVYOworCisJcnhfY29hbC0+c21hbGxfcGt0X3JhbmdlX3N0YXJ0ID0gbW9kX3JhbmdlW2luZGV4XS5zbWFsbF9wa3RfcmFuZ2Vfc3RhcnQ7CisJcnhfY29hbC0+bGFyZ2VfcGt0X3JhbmdlX3N0YXJ0ID0gbW9kX3JhbmdlW2luZGV4XS5sYXJnZV9wa3RfcmFuZ2Vfc3RhcnQ7CisJcnhfY29hbC0+cmFuZ2VfZW5kID0gRU5JQ19SWF9DT0FMRVNDRV9SQU5HRV9FTkQ7CisKKwkvKiBTdGFydCB3aXRoIHRoZSB2YWx1ZSBwcm92aWRlZCBieSBVQ1NNICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZW5pYy0+cnFfY291bnQ7IGluZGV4KyspCisJCWVuaWMtPmNxW2luZGV4XS5jdXJfcnhfY29hbF90aW1ldmFsID0KKwkJCQllbmljLT5jb25maWcuaW50cl90aW1lcl91c2VjOworCisJcnhfY29hbC0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gMTsKK30KKwogc3RhdGljIGludCBlbmljX2Rldl9ub3RpZnlfc2V0KHN0cnVjdCBlbmljICplbmljKQogewogCWludCBlcnI7CkBAIC0yMjMxLDYgKzIzMzQsNyBAQAogCWVuaWMtPm5vdGlmeV90aW1lci5mdW5jdGlvbiA9IGVuaWNfbm90aWZ5X3RpbWVyOwogCWVuaWMtPm5vdGlmeV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZW5pYzsKIAorCWVuaWNfc2V0X3J4X2NvYWxfc2V0dGluZyhlbmljKTsKIAlJTklUX1dPUksoJmVuaWMtPnJlc2V0LCBlbmljX3Jlc2V0KTsKIAlJTklUX1dPUksoJmVuaWMtPmNoYW5nZV9tdHVfd29yaywgZW5pY19jaGFuZ2VfbXR1X3dvcmspOwogCkBAIC0yMjUwLDYgKzIzNTQsOSBAQAogCX0KIAogCWVuaWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gZW5pYy0+Y29uZmlnLmludHJfdGltZXJfdXNlYzsKKwkvKiByeCBjb2FsZXNjZSB0aW1lIGFscmVhZHkgZ290IGluaXRpYWxpemVkLiBUaGlzIGdldHMgdXNlZAorCSAqIGlmIGFkYXB0aXZlIGNvYWwgaXMgdHVybmVkIG9mZgorCSAqLwogCWVuaWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gZW5pYy0+dHhfY29hbGVzY2VfdXNlY3M7CiAKIAlpZiAoZW5pY19pc19keW5hbWljKGVuaWMpIHx8IGVuaWNfaXNfc3Jpb3ZfdmYoZW5pYykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL3ZuaWNfY3EuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvdm5pY19jcS5oCmluZGV4IDU3OTMxNWMuLjRlNmFhNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvdm5pY19jcS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvdm5pY19jcS5oCkBAIC01MCw2ICs1MCwxMSBAQAogCXUzMiBwYWQxMDsKIH07CiAKK3N0cnVjdCB2bmljX3J4X2J5dGVzX2NvdW50ZXIgeworCXVuc2lnbmVkIGludCBzbWFsbF9wa3RfYnl0ZXNfY250OworCXVuc2lnbmVkIGludCBsYXJnZV9wa3RfYnl0ZXNfY250OworfTsKKwogc3RydWN0IHZuaWNfY3EgewogCXVuc2lnbmVkIGludCBpbmRleDsKIAlzdHJ1Y3Qgdm5pY19kZXYgKnZkZXY7CkBAIC01OCw2ICs2MywxMCBAQAogCXVuc2lnbmVkIGludCB0b19jbGVhbjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9jb2xvcjsKIAl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X29mZnNldDsKKwlzdHJ1Y3Qgdm5pY19yeF9ieXRlc19jb3VudGVyIHBrdF9zaXplX2NvdW50ZXI7CisJdW5zaWduZWQgaW50IGN1cl9yeF9jb2FsX3RpbWV2YWw7CisJdW5zaWduZWQgaW50IHRvYmVfcnhfY29hbF90aW1ldmFsOworCWt0aW1lX3QgcHJldl90czsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZuaWNfY3Ffc2VydmljZShzdHJ1Y3Qgdm5pY19jcSAqY3EsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL3ZuaWNfZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL3ZuaWNfZGV2LmMKaW5kZXggNjlkZDkyNS4uZTg2YTQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy92bmljX2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvdm5pY19kZXYuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHZuaWNfZGV2X2FkZF9hZGRyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTggKmFkZHIpCitpbnQgdm5pY19kZXZfYWRkX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBjb25zdCB1OCAqYWRkcikKIHsKIAl1NjQgYTAgPSAwLCBhMSA9IDA7CiAJaW50IHdhaXQgPSAxMDAwOwpAQCAtNjc0LDcgKzY3NCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHZuaWNfZGV2X2RlbF9hZGRyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTggKmFkZHIpCitpbnQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBjb25zdCB1OCAqYWRkcikKIHsKIAl1NjQgYTAgPSAwLCBhMSA9IDA7CiAJaW50IHdhaXQgPSAxMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy92bmljX2Rldi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy92bmljX2Rldi5oCmluZGV4IGU2NzAwMjkuLjFmM2IzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvdm5pY19kZXYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL3ZuaWNfZGV2LmgKQEAgLTk1LDggKzk1LDggQEAKIGludCB2bmljX2Rldl9oYW5nX25vdGlmeShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogaW50IHZuaWNfZGV2X3BhY2tldF9maWx0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgZGlyZWN0ZWQsIGludCBtdWx0aWNhc3QsCiAJaW50IGJyb2FkY2FzdCwgaW50IHByb21pc2MsIGludCBhbGxtdWx0aSk7Ci1pbnQgdm5pY19kZXZfYWRkX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcik7Ci1pbnQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcik7CitpbnQgdm5pY19kZXZfYWRkX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBjb25zdCB1OCAqYWRkcik7CitpbnQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBjb25zdCB1OCAqYWRkcik7CiBpbnQgdm5pY19kZXZfZ2V0X21hY19hZGRyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTggKm1hY19hZGRyKTsKIGludCB2bmljX2Rldl9ub3RpZnlfc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTE2IGludHIpOwogaW50IHZuaWNfZGV2X25vdGlmeV91bnNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGF2aWNvbS9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMKaW5kZXggOGM0YjkzYi4uMTM3MjNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGF2aWNvbS9kbTkwMDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kYXZpY29tL2RtOTAwMC5jCkBAIC0xMDksNiArMTA5LDcgQEAKIAl1OAkJaW1yX2FsbDsKIAogCXVuc2lnbmVkIGludAlmbGFnczsKKwl1bnNpZ25lZCBpbnQJaW5fdGltZW91dDoxOwogCXVuc2lnbmVkIGludAlpbl9zdXNwZW5kOjE7CiAJdW5zaWduZWQgaW50CXdha2Vfc3VwcG9ydGVkOjE7CiAKQEAgLTE4NywxMyArMTg4LDEzIEBACiAJICogVGhlIGVzc2VudGlhbCBwb2ludCBpcyB0aGF0IHdlIGhhdmUgdG8gZG8gYSBkb3VibGUgcmVzZXQsIGFuZCB0aGUKIAkgKiBpbnN0cnVjdGlvbiBpcyB0byBzZXQgTEJLIGludG8gTUFDIGludGVybmFsIGxvb3BiYWNrIG1vZGUuCiAJICovCi0JaW93KGRiLCBETTkwMDBfTkNSLCAweDAzKTsKKwlpb3coZGIsIERNOTAwMF9OQ1IsIE5DUl9SU1QgfCBOQ1JfTUFDX0xCSyk7CiAJdWRlbGF5KDEwMCk7IC8qIEFwcGxpY2F0aW9uIG5vdGUgc2F5cyBhdCBsZWFzdCAyMCB1cyAqLwogCWlmIChpb3IoZGIsIERNOTAwMF9OQ1IpICYgMSkKIAkJZGV2X2VycihkYi0+ZGV2LCAiZG05MDAwIGRpZCBub3QgcmVzcG9uZCB0byBmaXJzdCByZXNldFxuIik7CiAKIAlpb3coZGIsIERNOTAwMF9OQ1IsIDApOwotCWlvdyhkYiwgRE05MDAwX05DUiwgMHgwMyk7CisJaW93KGRiLCBETTkwMDBfTkNSLCBOQ1JfUlNUIHwgTkNSX01BQ19MQkspOwogCXVkZWxheSgxMDApOwogCWlmIChpb3IoZGIsIERNOTAwMF9OQ1IpICYgMSkKIAkJZGV2X2VycihkYi0+ZGV2LCAiZG05MDAwIGRpZCBub3QgcmVzcG9uZCB0byBzZWNvbmQgcmVzZXRcbiIpOwpAQCAtMjczLDcgKzI3NCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRtOTAwMF9tc2xlZXAoYm9hcmRfaW5mb190ICpkYiwgdW5zaWduZWQgaW50IG1zKQogewotCWlmIChkYi0+aW5fc3VzcGVuZCkKKwlpZiAoZGItPmluX3N1c3BlbmQgfHwgZGItPmluX3RpbWVvdXQpCiAJCW1kZWxheShtcyk7CiAJZWxzZQogCQltc2xlZXAobXMpOwpAQCAtMzM0LDcgKzMzNSw4IEBACiAJdW5zaWduZWQgbG9uZyByZWdfc2F2ZTsKIAogCWRtOTAwMF9kYmcoZGIsIDUsICJwaHlfd3JpdGVbJTAyeF0gPSAlMDR4XG4iLCByZWcsIHZhbHVlKTsKLQltdXRleF9sb2NrKCZkYi0+YWRkcl9sb2NrKTsKKwlpZiAoIWRiLT5pbl90aW1lb3V0KQorCQltdXRleF9sb2NrKCZkYi0+YWRkcl9sb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOwogCkBAIC0zNjUsNyArMzY3LDggQEAKIAl3cml0ZWIocmVnX3NhdmUsIGRiLT5pb19hZGRyKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfdW5sb2NrKCZkYi0+YWRkcl9sb2NrKTsKKwlpZiAoIWRiLT5pbl90aW1lb3V0KQorCQltdXRleF91bmxvY2soJmRiLT5hZGRyX2xvY2spOwogfQogCiAvKiBkbTkwMDBfc2V0X2lvCkBAIC04ODIsNiArODg1LDE4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQKK2RtOTAwMF9tYXNrX2ludGVycnVwdHMoYm9hcmRfaW5mb190ICpkYikKK3sKKwlpb3coZGIsIERNOTAwMF9JTVIsIElNUl9QQVIpOworfQorCitzdGF0aWMgdm9pZAorZG05MDAwX3VubWFza19pbnRlcnJ1cHRzKGJvYXJkX2luZm9fdCAqZGIpCit7CisJaW93KGRiLCBETTkwMDBfSU1SLCBkYi0+aW1yX2FsbCk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIGRtOTAwMCBib2FyZAogICovCkBAIC04OTQsNiArOTA5LDkgQEAKIAogCWRtOTAwMF9kYmcoZGIsIDEsICJlbnRlcmluZyAlc1xuIiwgX19mdW5jX18pOwogCisJZG05MDAwX3Jlc2V0KGRiKTsKKwlkbTkwMDBfbWFza19pbnRlcnJ1cHRzKGRiKTsKKwogCS8qIEkvTyBtb2RlICovCiAJZGItPmlvX21vZGUgPSBpb3IoZGIsIERNOTAwMF9JU1IpID4+IDY7CS8qIElTUiBiaXQ3OjYga2VlcHMgSS9PIG1vZGUgKi8KIApAQCAtOTQxLDkgKzk1OSw2IEBACiAKIAlkYi0+aW1yX2FsbCA9IGltcjsKIAotCS8qIEVuYWJsZSBUWC9SWCBpbnRlcnJ1cHQgbWFzayAqLwotCWlvdyhkYiwgRE05MDAwX0lNUiwgaW1yKTsKLQogCS8qIEluaXQgRHJpdmVyIHZhcmlhYmxlICovCiAJZGItPnR4X3BrdF9jbnQgPSAwOwogCWRiLT5xdWV1ZV9wa3RfbGVuID0gMDsKQEAgLTk1OSwxNyArOTc0LDE5IEBACiAKIAkvKiBTYXZlIHByZXZpb3VzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKwlkYi0+aW5fdGltZW91dCA9IDE7CiAJcmVnX3NhdmUgPSByZWFkYihkYi0+aW9fYWRkcik7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JZG05MDAwX3Jlc2V0KGRiKTsKIAlkbTkwMDBfaW5pdF9kbTkwMDAoZGV2KTsKKwlkbTkwMDBfdW5tYXNrX2ludGVycnVwdHMoZGIpOwogCS8qIFdlIGNhbiBhY2NlcHQgVFggcGFja2V0cyBhZ2FpbiAqLwogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBwcmV2ZW50IHR4IHRpbWVvdXQgKi8KIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAKIAkvKiBSZXN0b3JlIHByZXZpb3VzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KIAl3cml0ZWIocmVnX3NhdmUsIGRiLT5pb19hZGRyKTsKKwlkYi0+aW5fdGltZW91dCA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTA5Myw3ICsxMTEwLDYgQEAKIAkJaWYgKHJ4Ynl0ZSAmIERNOTAwMF9QS1RfRVJSKSB7CiAJCQlkZXZfd2FybihkYi0+ZGV2LCAic3RhdHVzIGNoZWNrIGZhaWw6ICVkXG4iLCByeGJ5dGUpOwogCQkJaW93KGRiLCBETTkwMDBfUkNSLCAweDAwKTsJLyogU3RvcCBEZXZpY2UgKi8KLQkJCWlvdyhkYiwgRE05MDAwX0lTUiwgSU1SX1BBUik7CS8qIFN0b3AgSU5UIHJlcXVlc3QgKi8KIAkJCXJldHVybjsKIAkJfQogCkBAIC0xMTkzLDkgKzEyMDksNyBAQAogCS8qIFNhdmUgcHJldmlvdXMgcmVnaXN0ZXIgYWRkcmVzcyAqLwogCXJlZ19zYXZlID0gcmVhZGIoZGItPmlvX2FkZHIpOwogCi0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWlvdyhkYiwgRE05MDAwX0lNUiwgSU1SX1BBUik7Ci0KKwlkbTkwMDBfbWFza19pbnRlcnJ1cHRzKGRiKTsKIAkvKiBHb3QgRE05MDAwIGludGVycnVwdCBzdGF0dXMgKi8KIAlpbnRfc3RhdHVzID0gaW9yKGRiLCBETTkwMDBfSVNSKTsJLyogR290IElTUiAqLwogCWlvdyhkYiwgRE05MDAwX0lTUiwgaW50X3N0YXR1cyk7CS8qIENsZWFyIElTUiBzdGF0dXMgKi8KQEAgLTEyMTgsOSArMTIzMiw3IEBACiAJCX0KIAl9CiAKLQkvKiBSZS1lbmFibGUgaW50ZXJydXB0IG1hc2sgKi8KLQlpb3coZGIsIERNOTAwMF9JTVIsIGRiLT5pbXJfYWxsKTsKLQorCWRtOTAwMF91bm1hc2tfaW50ZXJydXB0cyhkYik7CiAJLyogUmVzdG9yZSBwcmV2aW91cyByZWdpc3RlciBhZGRyZXNzICovCiAJd3JpdGViKHJlZ19zYXZlLCBkYi0+aW9fYWRkcik7CiAKQEAgLTEyOTIsNiArMTMwNCw5IEBACiAJICogbWF5IHdvcmssIGFuZCB0ZWxsIHRoZSB1c2VyIHRoYXQgdGhpcyBpcyBhIHByb2JsZW0gKi8KIAogCWlmIChpcnFmbGFncyA9PSBJUlFGX1RSSUdHRVJfTk9ORSkKKwkJaXJxZmxhZ3MgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShkZXYtPmlycSk7CisKKwlpZiAoaXJxZmxhZ3MgPT0gSVJRRl9UUklHR0VSX05PTkUpCiAJCWRldl93YXJuKGRiLT5kZXYsICJXQVJOSU5HOiBubyBJUlEgcmVzb3VyY2UgZmxhZ3Mgc2V0LlxuIik7CiAKIAlpcnFmbGFncyB8PSBJUlFGX1NIQVJFRDsKQEAgLTEzMDEsMTEgKzEzMTYsMTQgQEAKIAltZGVsYXkoMSk7IC8qIGRlbGF5IG5lZWRzIGJ5IERNOTAwMEIgKi8KIAogCS8qIEluaXRpYWxpemUgRE05MDAwIGJvYXJkICovCi0JZG05MDAwX3Jlc2V0KGRiKTsKIAlkbTkwMDBfaW5pdF9kbTkwMDAoZGV2KTsKIAogCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZG05MDAwX2ludGVycnVwdCwgaXJxZmxhZ3MsIGRldi0+bmFtZSwgZGV2KSkKIAkJcmV0dXJuIC1FQUdBSU47CisJLyogTm93IHRoYXQgd2UgaGF2ZSBhbiBpbnRlcnJ1cHQgaGFuZGxlciBob29rZWQgdXAgd2UgY2FuIHVubWFzaworCSAqIG91ciBpbnRlcnJ1cHRzCisJICovCisJZG05MDAwX3VubWFza19pbnRlcnJ1cHRzKGRiKTsKIAogCS8qIEluaXQgZHJpdmVyIHZhcmlhYmxlICovCiAJZGItPmRidWdfY250ID0gMDsKQEAgLTEzMTMsNyArMTMzMSw4IEBACiAJbWlpX2NoZWNrX21lZGlhKCZkYi0+bWlpLCBuZXRpZl9tc2dfbGluayhkYiksIDEpOwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQlkbTkwMDBfc2NoZWR1bGVfcG9sbChkYik7CisJLyogUG9sbCBpbml0aWFsIGxpbmsgc3RhdHVzICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkYi0+cGh5X3BvbGwsIDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzI2LDcgKzEzNDUsNyBAQAogCS8qIFJFU0VUIGRldmljZSAqLwogCWRtOTAwMF9waHlfd3JpdGUoZGV2LCAwLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CS8qIFBIWSBSRVNFVCAqLwogCWlvdyhkYiwgRE05MDAwX0dQUiwgMHgwMSk7CS8qIFBvd2VyLURvd24gUEhZICovCi0JaW93KGRiLCBETTkwMDBfSU1SLCBJTVJfUEFSKTsJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0ICovCisJZG05MDAwX21hc2tfaW50ZXJydXB0cyhkYik7CiAJaW93KGRiLCBETTkwMDBfUkNSLCAweDAwKTsJLyogRGlzYWJsZSBSWCAqLwogfQogCkBAIC0xNTQ3LDEyICsxNTY2LDcgQEAKIAlkYi0+ZmxhZ3MgfD0gRE05MDAwX1BMQVRGX1NJTVBMRV9QSFk7CiAjZW5kaWYKIAotCS8qIEZpeGluZyBidWcgb24gZG05MDAwX3Byb2JlLCB0YWtlb3ZlciBkbTkwMDBfcmVzZXQoZGIpLAotCSAqIE5lZWQgJ05DUl9NQUNfTEJLJyBiaXQgdG8gaW5kZWVkIHN0YWJsZSBvdXIgRE05MDAwIGZpZm8KLQkgKiB3aGlsZSBwcm9iZSBzdGFnZS4KLQkgKi8KLQotCWlvdyhkYiwgRE05MDAwX05DUiwgTkNSX01BQ19MQksgfCBOQ1JfUlNUKTsKKwlkbTkwMDBfcmVzZXQoZGIpOwogCiAJLyogdHJ5IG11bHRpcGxlIHRpbWVzLCBETTkwMDAgc29tZXRpbWVzIGdldHMgdGhlIHJlYWQgd3JvbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CkBAIC0xNjk1LDggKzE3MDksOCBAQAogCQkJLyogcmVzZXQgaWYgd2Ugd2VyZSBub3QgaW4gd2FrZSBtb2RlIHRvIGVuc3VyZSBpZgogCQkJICogdGhlIGRldmljZSB3YXMgcG93ZXJlZCBvZmYgaXQgaXMgaW4gYSBrbm93biBzdGF0ZSAqLwogCQkJaWYgKCFkYi0+d2FrZV9zdGF0ZSkgewotCQkJCWRtOTAwMF9yZXNldChkYik7CiAJCQkJZG05MDAwX2luaXRfZG05MDAwKG5kZXYpOworCQkJCWRtOTAwMF91bm1hc2tfaW50ZXJydXB0cyhkYik7CiAJCQl9CiAKIAkJCW5ldGlmX2RldmljZV9hdHRhY2gobmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3R1bGlwX2NvcmUuYwppbmRleCAxNjQyZGU3Li44NjE2NjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdHVsaXBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTE3MDMsNyArMTcwMyw3IEBACiAjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKIAluZXRpZl9uYXBpX2FkZChkZXYsICZ0cC0+bmFwaSwgdHVsaXBfcG9sbCwgMTYpOwogI2VuZGlmCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZvcHM7CiAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCiAJCWdvdG8gZXJyX291dF9mcmVlX3Jpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdWxpNTI2eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3VsaTUyNnguYwppbmRleCBhYTgwMWE2Li44MGFmZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdWxpNTI2eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC91bGk1MjZ4LmMKQEAgLTk2Miw4ICs5NjIsOCBAQAogCX0KIAlpZihkYi0+bGlua19mYWlsZWQpCiAJewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgLTEpOwotCQllY21kLT5kdXBsZXggPSAtMTsKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEX1VOS05PV04pOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAKIAlpZiAoZGItPm1lZGlhX21vZGUgJiBVTEk1MjZYX0FVVE8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9kbDJrLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9kbDJrLmMKaW5kZXggNGZiNzU2ZC4uMTI3NGI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvZGwyay5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL2RsMmsuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJfQogCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZldGh0b29sX29wczsKICNpZiAwCiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTTsKICNlbmRpZgpAQCAtMTE4NSw4ICsxMTg1LDggQEAKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgbnAtPnNwZWVkKTsKIAkJY21kLT5kdXBsZXggPSBucC0+ZnVsbF9kdXBsZXggPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIC0xKTsKLQkJY21kLT5kdXBsZXggPSAtMTsKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfVU5LTk9XTik7CisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCWlmICggbnAtPmFuX2VuYWJsZSkKIAkJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYwppbmRleCBkOWU1Y2EwLi40MzNjMWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCiAJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VjX2JoZi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZWNfYmhmLmMKaW5kZXggNDg4NDIwNS4uMDU2YjQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZWNfYmhmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZWNfYmhmLmMKQEAgLTEzNCwxNyArMTM0LDE3IEBACiAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCi0Jdm9pZCAqIF9faW9tZW0gaW87Ci0Jdm9pZCAqIF9faW9tZW0gZG1hX2lvOworCXZvaWQgX19pb21lbSAqaW87CisJdm9pZCBfX2lvbWVtICpkbWFfaW87CiAKIAlzdHJ1Y3QgaHJ0aW1lciBocnRpbWVyOwogCiAJaW50IHR4X2RtYV9jaGFuOwogCWludCByeF9kbWFfY2hhbjsKLQl2b2lkICogX19pb21lbSBlY19pbzsKLQl2b2lkICogX19pb21lbSBmaWZvX2lvOwotCXZvaWQgKiBfX2lvbWVtIG1paV9pbzsKLQl2b2lkICogX19pb21lbSBtYWNfaW87CisJdm9pZCBfX2lvbWVtICplY19pbzsKKwl2b2lkIF9faW9tZW0gKmZpZm9faW87CisJdm9pZCBfX2lvbWVtICptaWlfaW87CisJdm9pZCBfX2lvbWVtICptYWNfaW87CiAKIAlzdHJ1Y3QgYmhmX2RtYSByeF9idWY7CiAJc3RydWN0IHJ4X2Rlc2MgKnJ4X2Rlc2NzOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gUFJJVl9UT19ERVYocHJpdik7CiAJdW5zaWduZWQgYmxvY2tfY291bnQsIGk7Ci0Jdm9pZCAqIF9faW9tZW0gZWNfaW5mbzsKKwl2b2lkIF9faW9tZW0gKmVjX2luZm87CiAKIAlkZXZfZGJnKGRldiwgIkluZm8gYmxvY2s6XG4iKTsKIAlkZXZfZGJnKGRldiwgIlR5cGUgb2YgZnVuY3Rpb246ICV4XG4iLCAodW5zaWduZWQpaW9yZWFkMTYocHJpdi0+aW8pKTsKQEAgLTU2OSw4ICs1NjksOCBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwogCXN0cnVjdCBlY19iaGZfcHJpdiAqcHJpdjsKLQl2b2lkICogX19pb21lbSBkbWFfaW87Ci0Jdm9pZCAqIF9faW9tZW0gaW87CisJdm9pZCBfX2lvbWVtICpkbWFfaW87CisJdm9pZCBfX2lvbWVtICppbzsKIAlpbnQgZXJyID0gMDsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CkBAIC02MTUsNyArNjE1LDcgQEAKIAl9CiAKIAluZXRfZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlY19iaGZfcHJpdikpOwotCWlmIChuZXRfZGV2ID09IDApIHsKKwlpZiAobmV0X2RldiA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VubWFwX2RtYV9pbzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCmluZGV4IDk3ZGI1YTcuLjJlN2M1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCkBAIC0xMjAsNiArMTIwLDkgQEAKICNkZWZpbmUgTUFYX1ZGUwkJCTMwIC8qIE1heCBWRnMgc3VwcG9ydGVkIGJ5IEJFMyBGVyAqLwogI2RlZmluZSBGV19WRVJfTEVOCQkzMgogCisjZGVmaW5lCVJTU19JTkRJUl9UQUJMRV9MRU4JMTI4CisjZGVmaW5lIFJTU19IQVNIX0tFWV9MRU4JNDAKKwogc3RydWN0IGJlX2RtYV9tZW0gewogCXZvaWQgKnZhOwogCWRtYV9hZGRyX3QgZG1hOwpAQCAtMzcxLDYgKzM3NCw3IEBACiAjZGVmaW5lIEJFX0ZMQUdTX0xJTktfU1RBVFVTX0lOSVQJCTEKICNkZWZpbmUgQkVfRkxBR1NfV09SS0VSX1NDSEVEVUxFRAkJKDEgPDwgMykKICNkZWZpbmUgQkVfRkxBR1NfVkxBTl9QUk9NSVNDCQkJKDEgPDwgNCkKKyNkZWZpbmUgQkVfRkxBR1NfTUNBU1RfUFJPTUlTQwkJCSgxIDw8IDUpCiAjZGVmaW5lIEJFX0ZMQUdTX05BUElfRU5BQkxFRAkJCSgxIDw8IDkpCiAjZGVmaW5lIEJFX0ZMQUdTX1FOUV9BU1lOQ19FVlRfUkNWRAkJKDEgPDwgMTEpCiAjZGVmaW5lIEJFX0ZMQUdTX1ZYTEFOX09GRkxPQURTCQkJKDEgPDwgMTIpCkBAIC00MDksNiArNDEzLDEzIEBACiAJdTMyIGlmX2NhcF9mbGFnczsKIH07CiAKK3N0cnVjdCByc3NfaW5mbyB7CisJdTY0IHJzc19mbGFnczsKKwl1OCByc3N0YWJsZVtSU1NfSU5ESVJfVEFCTEVfTEVOXTsKKwl1OCByc3NfcXVldWVbUlNTX0lORElSX1RBQkxFX0xFTl07CisJdTggcnNzX2hrZXlbUlNTX0hBU0hfS0VZX0xFTl07Cit9OworCiBzdHJ1Y3QgYmVfYWRhcHRlciB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTQ0NSw3ICs0NTYsNyBAQAogCXN0cnVjdCBiZV9kcnZfc3RhdHMgZHJ2X3N0YXRzOwogCXN0cnVjdCBiZV9haWNfb2JqIGFpY19vYmpbTUFYX0VWVF9RU107CiAJdTE2IHZsYW5zX2FkZGVkOwotCXU4IHZsYW5fdGFnW1ZMQU5fTl9WSURdOworCXVuc2lnbmVkIGxvbmcgdmlkc1tCSVRTX1RPX0xPTkdTKFZMQU5fTl9WSUQpXTsKIAl1OCB2bGFuX3ByaW9fYm1hcDsJLyogQXZhaWxhYmxlIFByaW9yaXR5IEJpdE1hcCAqLwogCXUxNiByZWNvbW1lbmRlZF9wcmlvOwkvKiBSZWNvbW1lbmRlZCBQcmlvcml0eSAqLwogCXN0cnVjdCBiZV9kbWFfbWVtIHJ4X2ZpbHRlcjsgLyogQ21kIERNQSBtZW0gZm9yIHJ4LWZpbHRlciAqLwpAQCAtNTA3LDcgKzUxOCw3IEBACiAJdTMyIG1zZ19lbmFibGU7CiAJaW50IGJlX2dldF90ZW1wX2ZyZXE7CiAJdTggcGZfbnVtYmVyOwotCXU2NCByc3NfZmxhZ3M7CisJc3RydWN0IHJzc19pbmZvIHJzc19pbmZvOwogfTsKIAogI2RlZmluZSBiZV9waHlzZm4oYWRhcHRlcikJCSghYWRhcHRlci0+dmlydGZuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKaW5kZXggZDFlYzE1YS4uZjRlYTM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCkBAIC01Miw4ICs1Miw3IEBACiAJfQogfTsKIAotc3RhdGljIGJvb2wgYmVfY21kX2FsbG93ZWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IG9wY29kZSwKLQkJCSAgIHU4IHN1YnN5c3RlbSkKK3N0YXRpYyBib29sIGJlX2NtZF9hbGxvd2VkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCBvcGNvZGUsIHU4IHN1YnN5c3RlbSkKIHsKIAlpbnQgaTsKIAlpbnQgbnVtX2VudHJpZXMgPSBzaXplb2YoY21kX3ByaXZfbWFwKS9zaXplb2Yoc3RydWN0IGJlX2NtZF9wcml2X21hcCk7CkBAIC0xMjAsMjIgKzExOSwyOSBAQAogCXJldHVybiAodm9pZCAqKWFkZHI7CiB9CiAKLXN0YXRpYyBpbnQgYmVfbWNjX2NvbXBsX3Byb2Nlc3Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCitzdGF0aWMgYm9vbCBiZV9za2lwX2Vycl9sb2codTggb3Bjb2RlLCB1MTYgYmFzZV9zdGF0dXMsIHUxNiBhZGRsX3N0YXR1cykKIHsKLQl1MTYgY29tcGxfc3RhdHVzLCBleHRkX3N0YXR1czsKLQlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICpyZXNwX2hkcjsKKwlpZiAoYmFzZV9zdGF0dXMgPT0gTUNDX1NUQVRVU19OT1RfU1VQUE9SVEVEIHx8CisJICAgIGJhc2Vfc3RhdHVzID09IE1DQ19TVEFUVVNfSUxMRUdBTF9SRVFVRVNUIHx8CisJICAgIGFkZGxfc3RhdHVzID09IE1DQ19BRERMX1NUQVRVU19UT09fTUFOWV9JTlRFUkZBQ0VTIHx8CisJICAgIChvcGNvZGUgPT0gT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSAmJgorCSAgICAoYmFzZV9zdGF0dXMgPT0gTUNDX1NUQVRVU19JTExFR0FMX0ZJRUxEIHx8CisJICAgICBhZGRsX3N0YXR1cyA9PSBNQ0NfQURETF9TVEFUVVNfRkxBU0hfSU1BR0VfQ1JDX01JU01BVENIKSkpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisvKiBQbGFjZSBob2xkZXIgZm9yIGFsbCB0aGUgYXN5bmMgTUNDIGNtZHMgd2hlcmVpbiB0aGUgY2FsbGVyIGlzIG5vdCBpbiBhIGJ1c3kKKyAqIGxvb3AgKGhhcyBub3QgaXNzdWVkIGJlX21jY19ub3RpZnlfd2FpdCgpKQorICovCitzdGF0aWMgdm9pZCBiZV9hc3luY19jbWRfcHJvY2VzcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwsCisJCQkJIHN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKnJlc3BfaGRyKQoreworCWVudW0gbWNjX2Jhc2Vfc3RhdHVzIGJhc2Vfc3RhdHVzID0gYmFzZV9zdGF0dXMoY29tcGwtPnN0YXR1cyk7CiAJdTggb3Bjb2RlID0gMCwgc3Vic3lzdGVtID0gMDsKIAotCS8qIEp1c3Qgc3dhcCB0aGUgc3RhdHVzIHRvIGhvc3QgZW5kaWFuOyBtY2MgdGFnIGlzIG9wYXF1ZWx5IGNvcGllZAotCSAqIGZyb20gbWNjX3dyYiAqLwotCWJlX2R3c19sZV90b19jcHUoY29tcGwsIDQpOwotCi0JY29tcGxfc3RhdHVzID0gKGNvbXBsLT5zdGF0dXMgPj4gQ1FFX1NUQVRVU19DT01QTF9TSElGVCkgJgotCQkJCUNRRV9TVEFUVVNfQ09NUExfTUFTSzsKLQotCXJlc3BfaGRyID0gYmVfZGVjb2RlX3Jlc3BfaGRyKGNvbXBsLT50YWcwLCBjb21wbC0+dGFnMSk7Ci0KIAlpZiAocmVzcF9oZHIpIHsKIAkJb3Bjb2RlID0gcmVzcF9oZHItPm9wY29kZTsKIAkJc3Vic3lzdGVtID0gcmVzcF9oZHItPnN1YnN5c3RlbTsKQEAgLTE0NCw2MSArMTUwLDg2IEBACiAJaWYgKG9wY29kZSA9PSBPUENPREVfTE9XTEVWRUxfTE9PUEJBQ0tfVEVTVCAmJgogCSAgICBzdWJzeXN0ZW0gPT0gQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCkgewogCQljb21wbGV0ZSgmYWRhcHRlci0+ZXRfY21kX2NvbXBsKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKLQlpZiAoKChvcGNvZGUgPT0gT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSkgfHwKLQkgICAgIChvcGNvZGUgPT0gT1BDT0RFX0NPTU1PTl9XUklURV9PQkpFQ1QpKSAmJgotCSAgICAoc3Vic3lzdGVtID09IENNRF9TVUJTWVNURU1fQ09NTU9OKSkgewotCQlhZGFwdGVyLT5mbGFzaF9zdGF0dXMgPSBjb21wbF9zdGF0dXM7CisJaWYgKChvcGNvZGUgPT0gT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSB8fAorCSAgICAgb3Bjb2RlID09IE9QQ09ERV9DT01NT05fV1JJVEVfT0JKRUNUKSAmJgorCSAgICBzdWJzeXN0ZW0gPT0gQ01EX1NVQlNZU1RFTV9DT01NT04pIHsKKwkJYWRhcHRlci0+Zmxhc2hfc3RhdHVzID0gY29tcGwtPnN0YXR1czsKIAkJY29tcGxldGUoJmFkYXB0ZXItPmV0X2NtZF9jb21wbCk7CisJCXJldHVybjsKIAl9CiAKLQlpZiAoY29tcGxfc3RhdHVzID09IE1DQ19TVEFUVVNfU1VDQ0VTUykgewotCQlpZiAoKChvcGNvZGUgPT0gT1BDT0RFX0VUSF9HRVRfU1RBVElTVElDUykgfHwKLQkJICAgICAob3Bjb2RlID09IE9QQ09ERV9FVEhfR0VUX1BQT1JUX1NUQVRTKSkgJiYKLQkJICAgIChzdWJzeXN0ZW0gPT0gQ01EX1NVQlNZU1RFTV9FVEgpKSB7Ci0JCQliZV9wYXJzZV9zdGF0cyhhZGFwdGVyKTsKLQkJCWFkYXB0ZXItPnN0YXRzX2NtZF9zZW50ID0gZmFsc2U7Ci0JCX0KLQkJaWYgKG9wY29kZSA9PSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FERElUSU9OQUxfQVRUUklCVVRFUyAmJgotCQkgICAgc3Vic3lzdGVtID09IENNRF9TVUJTWVNURU1fQ09NTU9OKSB7CisJaWYgKChvcGNvZGUgPT0gT1BDT0RFX0VUSF9HRVRfU1RBVElTVElDUyB8fAorCSAgICAgb3Bjb2RlID09IE9QQ09ERV9FVEhfR0VUX1BQT1JUX1NUQVRTKSAmJgorCSAgICBzdWJzeXN0ZW0gPT0gQ01EX1NVQlNZU1RFTV9FVEggJiYKKwkgICAgYmFzZV9zdGF0dXMgPT0gTUNDX1NUQVRVU19TVUNDRVNTKSB7CisJCWJlX3BhcnNlX3N0YXRzKGFkYXB0ZXIpOworCQlhZGFwdGVyLT5zdGF0c19jbWRfc2VudCA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJaWYgKG9wY29kZSA9PSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FERElUSU9OQUxfQVRUUklCVVRFUyAmJgorCSAgICBzdWJzeXN0ZW0gPT0gQ01EX1NVQlNZU1RFTV9DT01NT04pIHsKKwkJaWYgKGJhc2Vfc3RhdHVzID09IE1DQ19TVEFUVVNfU1VDQ0VTUykgewogCQkJc3RydWN0IGJlX2NtZF9yZXNwX2dldF9jbnRsX2FkZG5sX2F0dHJpYnMgKnJlc3AgPQotCQkJCSh2b2lkICopcmVzcF9oZHI7CisJCQkJCQkJKHZvaWQgKilyZXNwX2hkcjsKIAkJCWFkYXB0ZXItPmRydl9zdGF0cy5iZV9vbl9kaWVfdGVtcGVyYXR1cmUgPQotCQkJCXJlc3AtPm9uX2RpZV90ZW1wZXJhdHVyZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChvcGNvZGUgPT0gT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BRERJVElPTkFMX0FUVFJJQlVURVMpCisJCQkJCQlyZXNwLT5vbl9kaWVfdGVtcGVyYXR1cmU7CisJCX0gZWxzZSB7CiAJCQlhZGFwdGVyLT5iZV9nZXRfdGVtcF9mcmVxID0gMDsKKwkJfQorCQlyZXR1cm47CisJfQorfQogCi0JCWlmIChjb21wbF9zdGF0dXMgPT0gTUNDX1NUQVRVU19OT1RfU1VQUE9SVEVEIHx8Ci0JCQljb21wbF9zdGF0dXMgPT0gTUNDX1NUQVRVU19JTExFR0FMX1JFUVVFU1QpCi0JCQlnb3RvIGRvbmU7CitzdGF0aWMgaW50IGJlX21jY19jb21wbF9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCXN0cnVjdCBiZV9tY2NfY29tcGwgKmNvbXBsKQoreworCWVudW0gbWNjX2Jhc2Vfc3RhdHVzIGJhc2Vfc3RhdHVzOworCWVudW0gbWNjX2FkZGxfc3RhdHVzIGFkZGxfc3RhdHVzOworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKnJlc3BfaGRyOworCXU4IG9wY29kZSA9IDAsIHN1YnN5c3RlbSA9IDA7CiAKLQkJaWYgKGNvbXBsX3N0YXR1cyA9PSBNQ0NfU1RBVFVTX1VOQVVUSE9SSVpFRF9SRVFVRVNUKSB7CisJLyogSnVzdCBzd2FwIHRoZSBzdGF0dXMgdG8gaG9zdCBlbmRpYW47IG1jYyB0YWcgaXMgb3BhcXVlbHkgY29waWVkCisJICogZnJvbSBtY2Nfd3JiICovCisJYmVfZHdzX2xlX3RvX2NwdShjb21wbCwgNCk7CisKKwliYXNlX3N0YXR1cyA9IGJhc2Vfc3RhdHVzKGNvbXBsLT5zdGF0dXMpOworCWFkZGxfc3RhdHVzID0gYWRkbF9zdGF0dXMoY29tcGwtPnN0YXR1cyk7CisKKwlyZXNwX2hkciA9IGJlX2RlY29kZV9yZXNwX2hkcihjb21wbC0+dGFnMCwgY29tcGwtPnRhZzEpOworCWlmIChyZXNwX2hkcikgeworCQlvcGNvZGUgPSByZXNwX2hkci0+b3Bjb2RlOworCQlzdWJzeXN0ZW0gPSByZXNwX2hkci0+c3Vic3lzdGVtOworCX0KKworCWJlX2FzeW5jX2NtZF9wcm9jZXNzKGFkYXB0ZXIsIGNvbXBsLCByZXNwX2hkcik7CisKKwlpZiAoYmFzZV9zdGF0dXMgIT0gTUNDX1NUQVRVU19TVUNDRVNTICYmCisJICAgICFiZV9za2lwX2Vycl9sb2cob3Bjb2RlLCBiYXNlX3N0YXR1cywgYWRkbF9zdGF0dXMpKSB7CisKKwkJaWYgKGJhc2Vfc3RhdHVzID09IE1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QpIHsKIAkJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJICJWRiBpcyBub3QgcHJpdmlsZWdlZCB0byBpc3N1ZSBvcGNvZGUgJWQtJWRcbiIsCiAJCQkJIG9wY29kZSwgc3Vic3lzdGVtKTsKIAkJfSBlbHNlIHsKLQkJCWV4dGRfc3RhdHVzID0gKGNvbXBsLT5zdGF0dXMgPj4gQ1FFX1NUQVRVU19FWFREX1NISUZUKSAmCi0JCQkJCUNRRV9TVEFUVVNfRVhURF9NQVNLOwogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJvcGNvZGUgJWQtJWQgZmFpbGVkOnN0YXR1cyAlZC0lZFxuIiwKLQkJCQlvcGNvZGUsIHN1YnN5c3RlbSwgY29tcGxfc3RhdHVzLCBleHRkX3N0YXR1cyk7Ci0KLQkJCWlmIChleHRkX3N0YXR1cyA9PSBNQ0NfQURETF9TVFNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUykKLQkJCQlyZXR1cm4gZXh0ZF9zdGF0dXM7CisJCQkJb3Bjb2RlLCBzdWJzeXN0ZW0sIGJhc2Vfc3RhdHVzLCBhZGRsX3N0YXR1cyk7CiAJCX0KIAl9Ci1kb25lOgotCXJldHVybiBjb21wbF9zdGF0dXM7CisJcmV0dXJuIGNvbXBsLT5zdGF0dXM7CiB9CiAKIC8qIExpbmsgc3RhdGUgZXZ0IGlzIGEgc3RyaW5nIG9mIGJ5dGVzOyBubyBuZWVkIGZvciBlbmRpYW4gc3dhcHBpbmcgKi8KIHN0YXRpYyB2b2lkIGJlX2FzeW5jX2xpbmtfc3RhdGVfcHJvY2VzcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJc3RydWN0IGJlX2FzeW5jX2V2ZW50X2xpbmtfc3RhdGUgKmV2dCkKKwkJCQkJc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCiB7CisJc3RydWN0IGJlX2FzeW5jX2V2ZW50X2xpbmtfc3RhdGUgKmV2dCA9CisJCQkoc3RydWN0IGJlX2FzeW5jX2V2ZW50X2xpbmtfc3RhdGUgKiljb21wbDsKKwogCS8qIFdoZW4gbGluayBzdGF0dXMgY2hhbmdlcywgbGluayBzcGVlZCBtdXN0IGJlIHJlLXF1ZXJpZWQgZnJvbSBGVyAqLwogCWFkYXB0ZXItPnBoeS5saW5rX3NwZWVkID0gLTE7CiAKQEAgLTIyMSw4ICsyNTIsMTEgQEAKIAogLyogR3JwNSBDb1MgUHJpb3JpdHkgZXZ0ICovCiBzdGF0aWMgdm9pZCBiZV9hc3luY19ncnA1X2Nvc19wcmlvcml0eV9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9jb3NfcHJpb3JpdHkgKmV2dCkKKwkJCQkJICAgICAgIHN0cnVjdCBiZV9tY2NfY29tcGwgKmNvbXBsKQogeworCXN0cnVjdCBiZV9hc3luY19ldmVudF9ncnA1X2Nvc19wcmlvcml0eSAqZXZ0ID0KKwkJCShzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9jb3NfcHJpb3JpdHkgKiljb21wbDsKKwogCWlmIChldnQtPnZhbGlkKSB7CiAJCWFkYXB0ZXItPnZsYW5fcHJpb19ibWFwID0gZXZ0LT5hdmFpbGFibGVfcHJpb3JpdHlfYm1hcDsKIAkJYWRhcHRlci0+cmVjb21tZW5kZWRfcHJpbyAmPSB+VkxBTl9QUklPX01BU0s7CkBAIC0yMzMsOCArMjY3LDExIEBACiAKIC8qIEdycDUgUU9TIFNwZWVkIGV2dDogcW9zX2xpbmtfc3BlZWQgaXMgaW4gdW5pdHMgb2YgMTAgTWJwcyAqLwogc3RhdGljIHZvaWQgYmVfYXN5bmNfZ3JwNV9xb3Nfc3BlZWRfcHJvY2VzcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJc3RydWN0IGJlX2FzeW5jX2V2ZW50X2dycDVfcW9zX2xpbmtfc3BlZWQgKmV2dCkKKwkJCQkJICAgIHN0cnVjdCBiZV9tY2NfY29tcGwgKmNvbXBsKQogeworCXN0cnVjdCBiZV9hc3luY19ldmVudF9ncnA1X3Fvc19saW5rX3NwZWVkICpldnQgPQorCQkJKHN0cnVjdCBiZV9hc3luY19ldmVudF9ncnA1X3Fvc19saW5rX3NwZWVkICopY29tcGw7CisKIAlpZiAoYWRhcHRlci0+cGh5Lmxpbmtfc3BlZWQgPj0gMCAmJgogCSAgICBldnQtPnBoeXNpY2FsX3BvcnQgPT0gYWRhcHRlci0+cG9ydF9udW0pCiAJCWFkYXB0ZXItPnBoeS5saW5rX3NwZWVkID0gbGUxNl90b19jcHUoZXZ0LT5xb3NfbGlua19zcGVlZCkgKiAxMDsKQEAgLTI0Miw4ICsyNzksMTEgQEAKIAogLypHcnA1IFBWSUQgZXZ0Ki8KIHN0YXRpYyB2b2lkIGJlX2FzeW5jX2dycDVfcHZpZF9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9wdmlkX3N0YXRlICpldnQpCisJCQkJCSAgICAgc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCiB7CisJc3RydWN0IGJlX2FzeW5jX2V2ZW50X2dycDVfcHZpZF9zdGF0ZSAqZXZ0ID0KKwkJCShzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9wdmlkX3N0YXRlICopY29tcGw7CisKIAlpZiAoZXZ0LT5lbmFibGVkKSB7CiAJCWFkYXB0ZXItPnB2aWQgPSBsZTE2X3RvX2NwdShldnQtPnRhZykgJiBWTEFOX1ZJRF9NQVNLOwogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTFBWSUQ6ICVkXG4iLCBhZGFwdGVyLT5wdmlkKTsKQEAgLTI1MywyNiArMjkzLDIxIEBACiB9CiAKIHN0YXRpYyB2b2lkIGJlX2FzeW5jX2dycDVfZXZ0X3Byb2Nlc3Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCXUzMiB0cmFpbGVyLCBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpldnQpCisJCQkJICAgICAgc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCiB7Ci0JdTggZXZlbnRfdHlwZSA9IDA7Ci0KLQlldmVudF90eXBlID0gKHRyYWlsZXIgPj4gQVNZTkNfVFJBSUxFUl9FVkVOVF9UWVBFX1NISUZUKSAmCi0JCUFTWU5DX1RSQUlMRVJfRVZFTlRfVFlQRV9NQVNLOworCXU4IGV2ZW50X3R5cGUgPSAoY29tcGwtPmZsYWdzID4+IEFTWU5DX0VWRU5UX1RZUEVfU0hJRlQpICYKKwkJCQlBU1lOQ19FVkVOVF9UWVBFX01BU0s7CiAKIAlzd2l0Y2ggKGV2ZW50X3R5cGUpIHsKIAljYXNlIEFTWU5DX0VWRU5UX0NPU19QUklPUklUWToKLQkJYmVfYXN5bmNfZ3JwNV9jb3NfcHJpb3JpdHlfcHJvY2VzcyhhZGFwdGVyLAotCQkoc3RydWN0IGJlX2FzeW5jX2V2ZW50X2dycDVfY29zX3ByaW9yaXR5ICopZXZ0KTsKLQlicmVhazsKKwkJYmVfYXN5bmNfZ3JwNV9jb3NfcHJpb3JpdHlfcHJvY2VzcyhhZGFwdGVyLCBjb21wbCk7CisJCWJyZWFrOwogCWNhc2UgQVNZTkNfRVZFTlRfUU9TX1NQRUVEOgotCQliZV9hc3luY19ncnA1X3Fvc19zcGVlZF9wcm9jZXNzKGFkYXB0ZXIsCi0JCShzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9xb3NfbGlua19zcGVlZCAqKWV2dCk7Ci0JYnJlYWs7CisJCWJlX2FzeW5jX2dycDVfcW9zX3NwZWVkX3Byb2Nlc3MoYWRhcHRlciwgY29tcGwpOworCQlicmVhazsKIAljYXNlIEFTWU5DX0VWRU5UX1BWSURfU1RBVEU6Ci0JCWJlX2FzeW5jX2dycDVfcHZpZF9zdGF0ZV9wcm9jZXNzKGFkYXB0ZXIsCi0JCShzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfZ3JwNV9wdmlkX3N0YXRlICopZXZ0KTsKLQlicmVhazsKKwkJYmVfYXN5bmNfZ3JwNV9wdmlkX3N0YXRlX3Byb2Nlc3MoYWRhcHRlciwgY29tcGwpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVW5rbm93biBncnA1IGV2ZW50IDB4JXghXG4iLAogCQkJIGV2ZW50X3R5cGUpOwpAQCAtMjgxLDEzICszMTYsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQgYmVfYXN5bmNfZGJnX2V2dF9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQl1MzIgdHJhaWxlciwgc3RydWN0IGJlX21jY19jb21wbCAqY21wKQorCQkJCSAgICAgc3RydWN0IGJlX21jY19jb21wbCAqY21wKQogewogCXU4IGV2ZW50X3R5cGUgPSAwOwogCXN0cnVjdCBiZV9hc3luY19ldmVudF9xbnEgKmV2dCA9IChzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfcW5xICopIGNtcDsKIAotCWV2ZW50X3R5cGUgPSAodHJhaWxlciA+PiBBU1lOQ19UUkFJTEVSX0VWRU5UX1RZUEVfU0hJRlQpICYKLQkJQVNZTkNfVFJBSUxFUl9FVkVOVF9UWVBFX01BU0s7CisJZXZlbnRfdHlwZSA9IChjbXAtPmZsYWdzID4+IEFTWU5DX0VWRU5UX1RZUEVfU0hJRlQpICYKKwkJCUFTWU5DX0VWRU5UX1RZUEVfTUFTSzsKIAogCXN3aXRjaCAoZXZlbnRfdHlwZSkgewogCWNhc2UgQVNZTkNfREVCVUdfRVZFTlRfVFlQRV9RTlE6CkBAIC0zMDIsMjUgKzMzNywzMyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzX2xpbmtfc3RhdGVfZXZ0KHUzMiB0cmFpbGVyKQorc3RhdGljIGlubGluZSBib29sIGlzX2xpbmtfc3RhdGVfZXZ0KHUzMiBmbGFncykKIHsKLQlyZXR1cm4gKCh0cmFpbGVyID4+IEFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9TSElGVCkgJgotCQlBU1lOQ19UUkFJTEVSX0VWRU5UX0NPREVfTUFTSykgPT0KLQkJCQlBU1lOQ19FVkVOVF9DT0RFX0xJTktfU1RBVEU7CisJcmV0dXJuICgoZmxhZ3MgPj4gQVNZTkNfRVZFTlRfQ09ERV9TSElGVCkgJiBBU1lOQ19FVkVOVF9DT0RFX01BU0spID09CisJCQlBU1lOQ19FVkVOVF9DT0RFX0xJTktfU1RBVEU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19ncnA1X2V2dCh1MzIgdHJhaWxlcikKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19ncnA1X2V2dCh1MzIgZmxhZ3MpCiB7Ci0JcmV0dXJuICgoKHRyYWlsZXIgPj4gQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX1NISUZUKSAmCi0JCUFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9NQVNLKSA9PQotCQkJCUFTWU5DX0VWRU5UX0NPREVfR1JQXzUpOworCXJldHVybiAoKGZsYWdzID4+IEFTWU5DX0VWRU5UX0NPREVfU0hJRlQpICYgQVNZTkNfRVZFTlRfQ09ERV9NQVNLKSA9PQorCQkJQVNZTkNfRVZFTlRfQ09ERV9HUlBfNTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzX2RiZ19ldnQodTMyIHRyYWlsZXIpCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZGJnX2V2dCh1MzIgZmxhZ3MpCiB7Ci0JcmV0dXJuICgoKHRyYWlsZXIgPj4gQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX1NISUZUKSAmCi0JCUFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9NQVNLKSA9PQotCQkJCUFTWU5DX0VWRU5UX0NPREVfUU5RKTsKKwlyZXR1cm4gKChmbGFncyA+PiBBU1lOQ19FVkVOVF9DT0RFX1NISUZUKSAmIEFTWU5DX0VWRU5UX0NPREVfTUFTSykgPT0KKwkJCUFTWU5DX0VWRU5UX0NPREVfUU5ROworfQorCitzdGF0aWMgdm9pZCBiZV9tY2NfZXZlbnRfcHJvY2VzcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCit7CisJaWYgKGlzX2xpbmtfc3RhdGVfZXZ0KGNvbXBsLT5mbGFncykpCisJCWJlX2FzeW5jX2xpbmtfc3RhdGVfcHJvY2VzcyhhZGFwdGVyLCBjb21wbCk7CisJZWxzZSBpZiAoaXNfZ3JwNV9ldnQoY29tcGwtPmZsYWdzKSkKKwkJYmVfYXN5bmNfZ3JwNV9ldnRfcHJvY2VzcyhhZGFwdGVyLCBjb21wbCk7CisJZWxzZSBpZiAoaXNfZGJnX2V2dChjb21wbC0+ZmxhZ3MpKQorCQliZV9hc3luY19kYmdfZXZ0X3Byb2Nlc3MoYWRhcHRlciwgY29tcGwpOwogfQogCiBzdGF0aWMgc3RydWN0IGJlX21jY19jb21wbCAqYmVfbWNjX2NvbXBsX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTM2MiwyMSArNDA1LDEzIEBACiAJc3RydWN0IGJlX21jY19vYmogKm1jY19vYmogPSAmYWRhcHRlci0+bWNjX29iajsKIAogCXNwaW5fbG9jaygmYWRhcHRlci0+bWNjX2NxX2xvY2spOworCiAJd2hpbGUgKChjb21wbCA9IGJlX21jY19jb21wbF9nZXQoYWRhcHRlcikpKSB7CiAJCWlmIChjb21wbC0+ZmxhZ3MgJiBDUUVfRkxBR1NfQVNZTkNfTUFTSykgewotCQkJLyogSW50ZXJwcmV0IGZsYWdzIGFzIGFuIGFzeW5jIHRyYWlsZXIgKi8KLQkJCWlmIChpc19saW5rX3N0YXRlX2V2dChjb21wbC0+ZmxhZ3MpKQotCQkJCWJlX2FzeW5jX2xpbmtfc3RhdGVfcHJvY2VzcyhhZGFwdGVyLAotCQkJCShzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfbGlua19zdGF0ZSAqKSBjb21wbCk7Ci0JCQllbHNlIGlmIChpc19ncnA1X2V2dChjb21wbC0+ZmxhZ3MpKQotCQkJCWJlX2FzeW5jX2dycDVfZXZ0X3Byb2Nlc3MoYWRhcHRlciwKLQkJCQljb21wbC0+ZmxhZ3MsIGNvbXBsKTsKLQkJCWVsc2UgaWYgKGlzX2RiZ19ldnQoY29tcGwtPmZsYWdzKSkKLQkJCQliZV9hc3luY19kYmdfZXZ0X3Byb2Nlc3MoYWRhcHRlciwKLQkJCQljb21wbC0+ZmxhZ3MsIGNvbXBsKTsKKwkJCWJlX21jY19ldmVudF9wcm9jZXNzKGFkYXB0ZXIsIGNvbXBsKTsKIAkJfSBlbHNlIGlmIChjb21wbC0+ZmxhZ3MgJiBDUUVfRkxBR1NfQ09NUExFVEVEX01BU0spIHsKLQkJCQlzdGF0dXMgPSBiZV9tY2NfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCBjb21wbCk7Ci0JCQkJYXRvbWljX2RlYygmbWNjX29iai0+cS51c2VkKTsKKwkJCXN0YXR1cyA9IGJlX21jY19jb21wbF9wcm9jZXNzKGFkYXB0ZXIsIGNvbXBsKTsKKwkJCWF0b21pY19kZWMoJm1jY19vYmotPnEudXNlZCk7CiAJCX0KIAkJYmVfbWNjX2NvbXBsX3VzZShjb21wbCk7CiAJCW51bSsrOwpAQCAtNDM2LDcgKzQ3MSw5IEBACiAJaWYgKHN0YXR1cyA9PSAtRUlPKQogCQlnb3RvIG91dDsKIAotCXN0YXR1cyA9IHJlc3AtPnN0YXR1czsKKwlzdGF0dXMgPSAocmVzcC0+YmFzZV9zdGF0dXMgfAorCQkgICgocmVzcC0+YWRkbF9zdGF0dXMgJiBDUUVfQURETF9TVEFUVVNfTUFTSykgPDwKKwkJICAgQ1FFX0FERExfU1RBVFVTX1NISUZUKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU2MCwxMCArNTk3LDggQEAKIAl1MzIgc2xpcG9ydF9zdGF0dXMgPSAwLCBzbGlwb3J0X2VycjEgPSAwLCBzbGlwb3J0X2VycjIgPSAwOwogCXNsaXBvcnRfc3RhdHVzID0gaW9yZWFkMzIoYWRhcHRlci0+ZGIgKyBTTElQT1JUX1NUQVRVU19PRkZTRVQpOwogCWlmIChzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX0VSUl9NQVNLKSB7Ci0JCXNsaXBvcnRfZXJyMSA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKLQkJCQkJU0xJUE9SVF9FUlJPUjFfT0ZGU0VUKTsKLQkJc2xpcG9ydF9lcnIyID0gaW9yZWFkMzIoYWRhcHRlci0+ZGIgKwotCQkJCQlTTElQT1JUX0VSUk9SMl9PRkZTRVQpOworCQlzbGlwb3J0X2VycjEgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArIFNMSVBPUlRfRVJST1IxX09GRlNFVCk7CisJCXNsaXBvcnRfZXJyMiA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsgU0xJUE9SVF9FUlJPUjJfT0ZGU0VUKTsKIAogCQlpZiAoc2xpcG9ydF9lcnIxID09IFNMSVBPUlRfRVJST1JfTk9fUkVTT1VSQ0UxICYmCiAJCSAgICBzbGlwb3J0X2VycjIgPT0gU0xJUE9SVF9FUlJPUl9OT19SRVNPVVJDRTIpCkBAIC02MzAsOCArNjY1LDcgQEAKIAkJaWYgKHN0YWdlID09IFBPU1RfU1RBR0VfQVJNRldfUkRZKQogCQkJcmV0dXJuIDA7CiAKLQkJZGV2X2luZm8oZGV2LCAiV2FpdGluZyBmb3IgUE9TVCwgJWRzIGVsYXBzZWRcbiIsCi0JCQkgdGltZW91dCk7CisJCWRldl9pbmZvKGRldiwgIldhaXRpbmcgZm9yIFBPU1QsICVkcyBlbGFwc2VkXG4iLCB0aW1lb3V0KTsKIAkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMDApKSB7CiAJCQlkZXZfZXJyKGRldiwgIldhaXRpbmcgZm9yIFBPU1QgYWJvcnRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlRSOwpAQCAtNjQ5LDggKzY4Myw3IEBACiAJcmV0dXJuICZ3cmItPnBheWxvYWQuc2dsWzBdOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsbF93cmJfdGFncyhzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiLAotCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF93cmJfdGFncyhzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJd3JiLT50YWcwID0gYWRkciAmIDB4RkZGRkZGRkY7CiAJd3JiLT50YWcxID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKQEAgLTY1OSw4ICs2OTIsOSBAQAogLyogRG9uJ3QgdG91Y2ggdGhlIGhkciBhZnRlciBpdCdzIHByZXBhcmVkICovCiAvKiBtZW0gd2lsbCBiZSBOVUxMIGZvciBlbWJlZGRlZCBjb21tYW5kcyAqLwogc3RhdGljIHZvaWQgYmVfd3JiX2NtZF9oZHJfcHJlcGFyZShzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKnJlcV9oZHIsCi0JCQkJdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuLAotCQkJCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIsIHN0cnVjdCBiZV9kbWFfbWVtICptZW0pCisJCQkJICAgdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuLAorCQkJCSAgIHN0cnVjdCBiZV9tY2Nfd3JiICp3cmIsCisJCQkJICAgc3RydWN0IGJlX2RtYV9tZW0gKm1lbSkKIHsKIAlzdHJ1Y3QgYmVfc2dlICpzZ2U7CiAKQEAgLTY4Myw3ICs3MTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBiZV9jbWRfcGFnZV9hZGRyc19wcmVwYXJlKHN0cnVjdCBwaHlzX2FkZHIgKnBhZ2VzLCB1MzIgbWF4X3BhZ2VzLAotCQkJc3RydWN0IGJlX2RtYV9tZW0gKm1lbSkKKwkJCQkgICAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtKQogewogCWludCBpLCBidWZfcGFnZXMgPSBtaW4oUEFHRVNfNEtfU1BBTk5FRChtZW0tPnZhLCBtZW0tPnNpemUpLCBtYXhfcGFnZXMpOwogCXU2NCBkbWEgPSAodTY0KW1lbS0+ZG1hOwpAQCAtODY4LDcgKzkwMiw4IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQlPUENPREVfQ09NTU9OX0VRX0NSRUFURSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fRVFfQ1JFQVRFLCBzaXplb2YoKnJlcSksIHdyYiwKKwkJCSAgICAgICBOVUxMKTsKIAogCS8qIFN1cHBvcnQgZm9yIEVRX0NSRUFURXYyIGF2YWlsYWJsZSBvbmx5IFNILVIgb253YXJkcyAqLwogCWlmICghKEJFeF9jaGlwKGFkYXB0ZXIpIHx8IGxhbmNlcl9jaGlwKGFkYXB0ZXIpKSkKQEAgLTkxNyw3ICs5NTIsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9OVFdLX01BQ19RVUVSWSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTlRXS19NQUNfUVVFUlksIHNpemVvZigqcmVxKSwgd3JiLAorCQkJICAgICAgIE5VTEwpOwogCXJlcS0+dHlwZSA9IE1BQ19BRERSRVNTX1RZUEVfTkVUV09SSzsKIAlpZiAocGVybWFuZW50KSB7CiAJCXJlcS0+cGVybWFuZW50ID0gMTsKQEAgLTk0MCw3ICs5NzYsNyBAQAogCiAvKiBVc2VzIHN5bmNocm9ub3VzIE1DQ1EgKi8KIGludCBiZV9jbWRfcG1hY19hZGQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKLQkJdTMyIGlmX2lkLCB1MzIgKnBtYWNfaWQsIHUzMiBkb21haW4pCisJCSAgICB1MzIgaWZfaWQsIHUzMiAqcG1hY19pZCwgdTMyIGRvbWFpbikKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX3BtYWNfYWRkICpyZXE7CkBAIC05NTYsNyArOTkyLDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fTlRXS19QTUFDX0FERCwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTlRXS19QTUFDX0FERCwgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAKIAlyZXEtPmhkci5kb21haW4gPSBkb21haW47CiAJcmVxLT5pZl9pZCA9IGNwdV90b19sZTMyKGlmX2lkKTsKQEAgLTEwMTIsNyArMTA0OSw3IEBACiAKIC8qIFVzZXMgTWJveCAqLwogaW50IGJlX2NtZF9jcV9jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSwKLQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLCBib29sIG5vX2RlbGF5LCBpbnQgY29hbGVzY2Vfd20pCisJCSAgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLCBib29sIG5vX2RlbGF5LCBpbnQgY29hbGVzY2Vfd20pCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9jcV9jcmVhdGUgKnJlcTsKQEAgLTEwMjgsMTcgKzEwNjUsMTggQEAKIAljdHh0ID0gJnJlcS0+Y29udGV4dDsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9DUV9DUkVBVEUsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX0NRX0NSRUFURSwgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAKIAlyZXEtPm51bV9wYWdlcyA9ICBjcHVfdG9fbGUxNihQQUdFU180S19TUEFOTkVEKHFfbWVtLT52YSwgcV9tZW0tPnNpemUpKTsKIAogCWlmIChCRXhfY2hpcChhZGFwdGVyKSkgewogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHRfYmUsIGNvYWxlc2N3bSwgY3R4dCwKLQkJCQkJCQkJY29hbGVzY2Vfd20pOworCQkJICAgICAgY29hbGVzY2Vfd20pOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHRfYmUsIG5vZGVsYXksCi0JCQkJCQkJCWN0eHQsIG5vX2RlbGF5KTsKKwkJCSAgICAgIGN0eHQsIG5vX2RlbGF5KTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0X2JlLCBjb3VudCwgY3R4dCwKLQkJCQkJCV9faWxvZzJfdTMyKGNxLT5sZW4vMjU2KSk7CisJCQkgICAgICBfX2lsb2cyX3UzMihjcS0+bGVuIC8gMjU2KSk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dF9iZSwgdmFsaWQsIGN0eHQsIDEpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHRfYmUsIGV2ZW50YWJsZSwgY3R4dCwgMSk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dF9iZSwgZXFpZCwgY3R4dCwgZXEtPmlkKTsKQEAgLTEwNTMsMTQgKzEwOTEsMTIgQEAKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dF92MiwgY29hbGVzY3dtLAogCQkJCSAgICAgIGN0eHQsIGNvYWxlc2NlX3dtKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0X3YyLCBub2RlbGF5LCBjdHh0LAotCQkJCQkJCQlub19kZWxheSk7CisJCQkgICAgICBub19kZWxheSk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dF92MiwgY291bnQsIGN0eHQsCi0JCQkJCQlfX2lsb2cyX3UzMihjcS0+bGVuLzI1NikpOworCQkJICAgICAgX19pbG9nMl91MzIoY3EtPmxlbiAvIDI1NikpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHRfdjIsIHZhbGlkLCBjdHh0LCAxKTsKLQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0X3YyLCBldmVudGFibGUsCi0JCQkJCQkJCWN0eHQsIDEpOwotCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHRfdjIsIGVxaWQsCi0JCQkJCQkJCWN0eHQsIGVxLT5pZCk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dF92MiwgZXZlbnRhYmxlLCBjdHh0LCAxKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0X3YyLCBlcWlkLCBjdHh0LCBlcS0+aWQpOwogCX0KIAogCWJlX2R3c19jcHVfdG9fbGUoY3R4dCwgc2l6ZW9mKHJlcS0+Y29udGV4dCkpOwpAQCAtMTA4OCw4ICsxMTI0LDggQEAKIH0KIAogc3RhdGljIGludCBiZV9jbWRfbWNjcV9leHRfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAotCQkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKKwkJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAorCQkJCSAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfbWNjX2V4dF9jcmVhdGUgKnJlcTsKQEAgLTExMDUsMTMgKzExNDEsMTQgQEAKIAljdHh0ID0gJnJlcS0+Y29udGV4dDsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCU9QQ09ERV9DT01NT05fTUNDX0NSRUFURV9FWFQsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX01DQ19DUkVBVEVfRVhULCBzaXplb2YoKnJlcSksIHdyYiwKKwkJCSAgICAgICBOVUxMKTsKIAogCXJlcS0+bnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYoUEFHRVNfNEtfU1BBTk5FRChxX21lbS0+dmEsIHFfbWVtLT5zaXplKSk7CiAJaWYgKEJFeF9jaGlwKGFkYXB0ZXIpKSB7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbWNjX2NvbnRleHRfYmUsIHZhbGlkLCBjdHh0LCAxKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dF9iZSwgcmluZ19zaXplLCBjdHh0LAotCQkJCQkJYmVfZW5jb2RlZF9xX2xlbihtY2NxLT5sZW4pKTsKKwkJCSAgICAgIGJlX2VuY29kZWRfcV9sZW4obWNjcS0+bGVuKSk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbWNjX2NvbnRleHRfYmUsIGNxX2lkLCBjdHh0LCBjcS0+aWQpOwogCX0gZWxzZSB7CiAJCXJlcS0+aGRyLnZlcnNpb24gPSAxOwpAQCAtMTE0NSw4ICsxMTgyLDggQEAKIH0KIAogc3RhdGljIGludCBiZV9jbWRfbWNjcV9vcmdfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAotCQkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKKwkJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAorCQkJCSAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfbWNjX2NyZWF0ZSAqcmVxOwpAQCAtMTE2MiwxMyArMTE5OSwxNCBAQAogCWN0eHQgPSAmcmVxLT5jb250ZXh0OwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQkJT1BDT0RFX0NPTU1PTl9NQ0NfQ1JFQVRFLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9NQ0NfQ1JFQVRFLCBzaXplb2YoKnJlcSksIHdyYiwKKwkJCSAgICAgICBOVUxMKTsKIAogCXJlcS0+bnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYoUEFHRVNfNEtfU1BBTk5FRChxX21lbS0+dmEsIHFfbWVtLT5zaXplKSk7CiAKIAlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX21jY19jb250ZXh0X2JlLCB2YWxpZCwgY3R4dCwgMSk7CiAJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dF9iZSwgcmluZ19zaXplLCBjdHh0LAotCQkJYmVfZW5jb2RlZF9xX2xlbihtY2NxLT5sZW4pKTsKKwkJICAgICAgYmVfZW5jb2RlZF9xX2xlbihtY2NxLT5sZW4pKTsKIAlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX21jY19jb250ZXh0X2JlLCBjcV9pZCwgY3R4dCwgY3EtPmlkKTsKIAogCWJlX2R3c19jcHVfdG9fbGUoY3R4dCwgc2l6ZW9mKHJlcS0+Y29udGV4dCkpOwpAQCAtMTE4Nyw4ICsxMjI1LDcgQEAKIH0KIAogaW50IGJlX2NtZF9tY2NxX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAotCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxKQorCQkgICAgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jY3EsIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0xMjEzLDcgKzEyNTAsNyBAQAogCiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCgmd3JiKTsKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9FVEgsCi0JCQkJT1BDT0RFX0VUSF9UWF9DUkVBVEUsIHNpemVvZigqcmVxKSwgJndyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0VUSF9UWF9DUkVBVEUsIHNpemVvZigqcmVxKSwgJndyYiwgTlVMTCk7CiAKIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKIAkJcmVxLT5oZHIudmVyc2lvbiA9IDE7CkBAIC0xMjUwLDggKzEyODcsOCBAQAogCiAvKiBVc2VzIE1DQyAqLwogaW50IGJlX2NtZF9yeHFfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcnhxLCB1MTYgY3FfaWQsIHUxNiBmcmFnX3NpemUsCi0JCXUzMiBpZl9pZCwgdTMyIHJzcywgdTggKnJzc19pZCkKKwkJICAgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKnJ4cSwgdTE2IGNxX2lkLCB1MTYgZnJhZ19zaXplLAorCQkgICAgICB1MzIgaWZfaWQsIHUzMiByc3MsIHU4ICpyc3NfaWQpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9ldGhfcnhfY3JlYXRlICpyZXE7CkBAIC0xMjY4LDcgKzEzMDUsNyBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0VUSCwKLQkJCQlPUENPREVfRVRIX1JYX0NSRUFURSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9FVEhfUlhfQ1JFQVRFLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CiAKIAlyZXEtPmNxX2lkID0gY3B1X3RvX2xlMTYoY3FfaWQpOwogCXJlcS0+ZnJhZ19zaXplID0gZmxzKGZyYWdfc2l6ZSkgLSAxOwpAQCAtMTI5NSw3ICsxMzMyLDcgQEAKICAqIFVzZXMgTWJveAogICovCiBpbnQgYmVfY21kX3FfZGVzdHJveShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEsCi0JCWludCBxdWV1ZV90eXBlKQorCQkgICAgIGludCBxdWV1ZV90eXBlKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfcV9kZXN0cm95ICpyZXE7CkBAIC0xMzM0LDcgKzEzNzEsNyBAQAogCX0KIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBzdWJzeXMsIG9wY29kZSwgc2l6ZW9mKCpyZXEpLCB3cmIsCi0JCQkJTlVMTCk7CisJCQkgICAgICAgTlVMTCk7CiAJcmVxLT5pZCA9IGNwdV90b19sZTE2KHEtPmlkKTsKIAogCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5X3dhaXQoYWRhcHRlcik7CkBAIC0xMzYxLDcgKzEzOTgsNyBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0VUSCwKLQkJCU9QQ09ERV9FVEhfUlhfREVTVFJPWSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9FVEhfUlhfREVTVFJPWSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOwogCXJlcS0+aWQgPSBjcHVfdG9fbGUxNihxLT5pZCk7CiAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CkBAIC0xMzg0LDcgKzE0MjEsOCBAQAogCiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCgmd3JiKTsKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fTlRXS19JTlRFUkZBQ0VfQ1JFQVRFLCBzaXplb2YoKnJlcSksICZ3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTlRXS19JTlRFUkZBQ0VfQ1JFQVRFLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgJndyYiwgTlVMTCk7CiAJcmVxLT5oZHIuZG9tYWluID0gZG9tYWluOwogCXJlcS0+Y2FwYWJpbGl0eV9mbGFncyA9IGNwdV90b19sZTMyKGNhcF9mbGFncyk7CiAJcmVxLT5lbmFibGVfZmxhZ3MgPSBjcHVfdG9fbGUzMihlbl9mbGFncyk7CkBAIC0xNDIyLDcgKzE0NjAsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9OVFdLX0lOVEVSRkFDRV9ERVNUUk9ZLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9OVFdLX0lOVEVSRkFDRV9ERVNUUk9ZLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIAlyZXEtPmhkci5kb21haW4gPSBkb21haW47CiAJcmVxLT5pbnRlcmZhY2VfaWQgPSBjcHVfdG9fbGUzMihpbnRlcmZhY2VfaWQpOwogCkBAIC0xNDUyLDcgKzE0OTEsOCBAQAogCWhkciA9IG5vbmVtYl9jbWQtPnZhOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZShoZHIsIENNRF9TVUJTWVNURU1fRVRILAotCQlPUENPREVfRVRIX0dFVF9TVEFUSVNUSUNTLCBub25lbWJfY21kLT5zaXplLCB3cmIsIG5vbmVtYl9jbWQpOworCQkJICAgICAgIE9QQ09ERV9FVEhfR0VUX1NUQVRJU1RJQ1MsIG5vbmVtYl9jbWQtPnNpemUsIHdyYiwKKwkJCSAgICAgICBub25lbWJfY21kKTsKIAogCS8qIHZlcnNpb24gMSBvZiB0aGUgY21kIGlzIG5vdCBzdXBwb3J0ZWQgb25seSBieSBCRTIgKi8KIAlpZiAoQkUyX2NoaXAoYWRhcHRlcikpCkBAIC0xNDcyLDcgKzE1MTIsNyBAQAogCiAvKiBMYW5jZXIgU3RhdHMgKi8KIGludCBsYW5jZXJfY21kX2dldF9wcG9ydF9zdGF0cyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQlzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKKwkJCSAgICAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKIHsKIAogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CkBAIC0xNDkzLDggKzE1MzMsOCBAQAogCXJlcSA9IG5vbmVtYl9jbWQtPnZhOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fRVRILAotCQkJT1BDT0RFX0VUSF9HRVRfUFBPUlRfU1RBVFMsIG5vbmVtYl9jbWQtPnNpemUsIHdyYiwKLQkJCW5vbmVtYl9jbWQpOworCQkJICAgICAgIE9QQ09ERV9FVEhfR0VUX1BQT1JUX1NUQVRTLCBub25lbWJfY21kLT5zaXplLAorCQkJICAgICAgIHdyYiwgbm9uZW1iX2NtZCk7CiAKIAlyZXEtPmNtZF9wYXJhbXMucGFyYW1zLnBwb3J0X251bSA9IGNwdV90b19sZTE2KGFkYXB0ZXItPmhiYV9wb3J0X251bSk7CiAJcmVxLT5jbWRfcGFyYW1zLnBhcmFtcy5yZXNldF9zdGF0cyA9IDA7CkBAIC0xNTUzLDcgKzE1OTMsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIAogCS8qIHZlcnNpb24gMSBvZiB0aGUgY21kIGlzIG5vdCBzdXBwb3J0ZWQgb25seSBieSBCRTIgKi8KIAlpZiAoIUJFMl9jaGlwKGFkYXB0ZXIpKQpAQCAtMTU5OCw4ICsxNjM5LDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fR0VUX0NOVExfQURESVRJT05BTF9BVFRSSUJVVEVTLCBzaXplb2YoKnJlcSksCi0JCXdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BRERJVElPTkFMX0FUVFJJQlVURVMsCisJCQkgICAgICAgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOwogCiAJYmVfbWNjX25vdGlmeShhZGFwdGVyKTsKIApAQCAtMTYyNSw3ICsxNjY2LDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fTUFOQUdFX0ZBVCwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTUFOQUdFX0ZBVCwgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAJcmVxLT5mYXRfb3BlcmF0aW9uID0gY3B1X3RvX2xlMzIoUVVFUllfRkFUKTsKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAJaWYgKCFzdGF0dXMpIHsKQEAgLTE2NTUsOCArMTY5Nyw4IEBACiAKIAlnZXRfZmF0X2NtZC5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVxX2dldF9mYXQpICsgNjAqMTAyNDsKIAlnZXRfZmF0X2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQlnZXRfZmF0X2NtZC5zaXplLAotCQkJJmdldF9mYXRfY21kLmRtYSk7CisJCQkJCSAgICAgIGdldF9mYXRfY21kLnNpemUsCisJCQkJCSAgICAgICZnZXRfZmF0X2NtZC5kbWEpOwogCWlmICghZ2V0X2ZhdF9jbWQudmEpIHsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LApAQCAtMTY3OSw4ICsxNzIxLDggQEAKIAogCQlwYXlsb2FkX2xlbiA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfZmF0KSArIGJ1Zl9zaXplOwogCQliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQkJT1BDT0RFX0NPTU1PTl9NQU5BR0VfRkFULCBwYXlsb2FkX2xlbiwgd3JiLAotCQkJCSZnZXRfZmF0X2NtZCk7CisJCQkJICAgICAgIE9QQ09ERV9DT01NT05fTUFOQUdFX0ZBVCwgcGF5bG9hZF9sZW4sCisJCQkJICAgICAgIHdyYiwgJmdldF9mYXRfY21kKTsKIAogCQlyZXEtPmZhdF9vcGVyYXRpb24gPSBjcHVfdG9fbGUzMihSRVRSSUVWRV9GQVQpOwogCQlyZXEtPnJlYWRfbG9nX29mZnNldCA9IGNwdV90b19sZTMyKGxvZ19vZmZzZXQpOwpAQCAtMTY5MSw4ICsxNzMzLDggQEAKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfZmF0ICpyZXNwID0gZ2V0X2ZhdF9jbWQudmE7CiAJCQltZW1jcHkoYnVmICsgb2Zmc2V0LAotCQkJCXJlc3AtPmRhdGFfYnVmZmVyLAotCQkJCWxlMzJfdG9fY3B1KHJlc3AtPnJlYWRfbG9nX2xlbmd0aCkpOworCQkJICAgICAgIHJlc3AtPmRhdGFfYnVmZmVyLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KHJlc3AtPnJlYWRfbG9nX2xlbmd0aCkpOwogCQl9IGVsc2UgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiRkFUIFRhYmxlIFJldHJpZXZlIGVycm9yXG4iKTsKIAkJCWdvdG8gZXJyOwpAQCAtMTcwMiwxNCArMTc0NCwxMyBAQAogCX0KIGVycjoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGdldF9mYXRfY21kLnNpemUsCi0JCQlnZXRfZmF0X2NtZC52YSwKLQkJCWdldF9mYXRfY21kLmRtYSk7CisJCQkgICAgZ2V0X2ZhdF9jbWQudmEsIGdldF9mYXRfY21kLmRtYSk7CiAJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKIH0KIAogLyogVXNlcyBzeW5jaHJvbm91cyBtY2MgKi8KIGludCBiZV9jbWRfZ2V0X2Z3X3ZlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgY2hhciAqZndfdmVyLAotCQkJY2hhciAqZndfb25fZmxhc2gpCisJCSAgICAgIGNoYXIgKmZ3X29uX2ZsYXNoKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2Z3X3ZlcnNpb24gKnJlcTsKQEAgLTE3MjYsNyArMTc2Nyw4IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQlPUENPREVfQ09NTU9OX0dFVF9GV19WRVJTSU9OLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9HRVRfRldfVkVSU0lPTiwgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfZndfdmVyc2lvbiAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKQEAgLTE3NTksNyArMTgwMSw4IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQlPUENPREVfQ09NTU9OX01PRElGWV9FUV9ERUxBWSwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTU9ESUZZX0VRX0RFTEFZLCBzaXplb2YoKnJlcSksIHdyYiwKKwkJCSAgICAgICBOVUxMKTsKIAogCXJlcS0+bnVtX2VxID0gY3B1X3RvX2xlMzIobnVtKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKQEAgLTE3NzcsNyArMTgyMCw3IEBACiAKIC8qIFVzZXMgc3ljbmhyb25vdXMgbWNjICovCiBpbnQgYmVfY21kX3ZsYW5fY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfaWQsIHUxNiAqdnRhZ19hcnJheSwKLQkJICAgICAgIHUzMiBudW0sIGJvb2wgcHJvbWlzY3VvdXMpCisJCSAgICAgICB1MzIgbnVtKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfdmxhbl9jb25maWcgKnJlcTsKQEAgLTE3OTMsMTkgKzE4MzYsMTYgQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fTlRXS19WTEFOX0NPTkZJRywgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTlRXS19WTEFOX0NPTkZJRywgc2l6ZW9mKCpyZXEpLAorCQkJICAgICAgIHdyYiwgTlVMTCk7CiAKIAlyZXEtPmludGVyZmFjZV9pZCA9IGlmX2lkOwotCXJlcS0+cHJvbWlzY3VvdXMgPSBwcm9taXNjdW91czsKIAlyZXEtPnVudGFnZ2VkID0gQkVfSUZfRkxBR1NfVU5UQUdHRUQgJiBiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlcikgPyAxIDogMDsKIAlyZXEtPm51bV92bGFuID0gbnVtOwotCWlmICghcHJvbWlzY3VvdXMpIHsKLQkJbWVtY3B5KHJlcS0+bm9ybWFsX3ZsYW4sIHZ0YWdfYXJyYXksCi0JCQlyZXEtPm51bV92bGFuICogc2l6ZW9mKHZ0YWdfYXJyYXlbMF0pKTsKLQl9CisJbWVtY3B5KHJlcS0+bm9ybWFsX3ZsYW4sIHZ0YWdfYXJyYXksCisJICAgICAgIHJlcS0+bnVtX3ZsYW4gKiBzaXplb2YodnRhZ19hcnJheVswXSkpOwogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwotCiBlcnI6CiAJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTgyNywxOCArMTg2NywxOSBAQAogCX0KIAltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCQlPUENPREVfQ09NTU9OX05UV0tfUlhfRklMVEVSLCBzaXplb2YoKnJlcSksCi0JCQkJd3JiLCBtZW0pOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fTlRXS19SWF9GSUxURVIsIHNpemVvZigqcmVxKSwKKwkJCSAgICAgICB3cmIsIG1lbSk7CiAKIAlyZXEtPmlmX2lkID0gY3B1X3RvX2xlMzIoYWRhcHRlci0+aWZfaGFuZGxlKTsKIAlpZiAoZmxhZ3MgJiBJRkZfUFJPTUlTQykgewogCQlyZXEtPmlmX2ZsYWdzX21hc2sgPSBjcHVfdG9fbGUzMihCRV9JRl9GTEFHU19QUk9NSVNDVU9VUyB8Ci0JCQkJCUJFX0lGX0ZMQUdTX1ZMQU5fUFJPTUlTQ1VPVVMgfAotCQkJCQlCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUyk7CisJCQkJCQkgQkVfSUZfRkxBR1NfVkxBTl9QUk9NSVNDVU9VUyB8CisJCQkJCQkgQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMpOwogCQlpZiAodmFsdWUgPT0gT04pCi0JCQlyZXEtPmlmX2ZsYWdzID0gY3B1X3RvX2xlMzIoQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMgfAotCQkJCQkJQkVfSUZfRkxBR1NfVkxBTl9QUk9NSVNDVU9VUyB8Ci0JCQkJCQlCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUyk7CisJCQlyZXEtPmlmX2ZsYWdzID0KKwkJCQljcHVfdG9fbGUzMihCRV9JRl9GTEFHU19QUk9NSVNDVU9VUyB8CisJCQkJCSAgICBCRV9JRl9GTEFHU19WTEFOX1BST01JU0NVT1VTIHwKKwkJCQkJICAgIEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTKTsKIAl9IGVsc2UgaWYgKGZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CiAJCXJlcS0+aWZfZmxhZ3NfbWFzayA9IHJlcS0+aWZfZmxhZ3MgPQogCQkJCWNwdV90b19sZTMyKEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTKTsKQEAgLTE4NjcsNyArMTkwOCw3IEBACiAJfQogCiAJaWYgKChyZXEtPmlmX2ZsYWdzX21hc2sgJiBjcHVfdG9fbGUzMihiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlcikpKSAhPQotCSAgICAgcmVxLT5pZl9mbGFnc19tYXNrKSB7CisJICAgIHJlcS0+aWZfZmxhZ3NfbWFzaykgewogCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJICJDYW5ub3Qgc2V0IHJ4IGZpbHRlciBmbGFncyAweCV4XG4iLAogCQkJIHJlcS0+aWZfZmxhZ3NfbWFzayk7CkBAIC0xOTA1LDcgKzE5NDYsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MLCBzaXplb2YoKnJlcSksCisJCQkgICAgICAgd3JiLCBOVUxMKTsKIAogCXJlcS0+dHhfZmxvd19jb250cm9sID0gY3B1X3RvX2xlMTYoKHUxNil0eF9mYyk7CiAJcmVxLT5yeF9mbG93X2NvbnRyb2wgPSBjcHVfdG9fbGUxNigodTE2KXJ4X2ZjKTsKQEAgLTE5MzgsNyArMTk4MCw4IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQlPUENPREVfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wsIHNpemVvZigqcmVxKSwKKwkJCSAgICAgICB3cmIsIE5VTEwpOwogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCWlmICghc3RhdHVzKSB7CkBAIC0xOTY4LDcgKzIwMTEsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9RVUVSWV9GSVJNV0FSRV9DT05GSUcsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1FVRVJZX0ZJUk1XQVJFX0NPTkZJRywKKwkJCSAgICAgICBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CiAKIAlzdGF0dXMgPSBiZV9tYm94X25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCWlmICghc3RhdHVzKSB7CkBAIC0yMDExLDcgKzIwNTUsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUocmVxLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9GVU5DVElPTl9SRVNFVCwgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fRlVOQ1RJT05fUkVTRVQsIHNpemVvZigqcmVxKSwgd3JiLAorCQkJICAgICAgIE5VTEwpOwogCiAJc3RhdHVzID0gYmVfbWJveF9ub3RpZnlfd2FpdChhZGFwdGVyKTsKIApAQCAtMjAyMCw0NyArMjA2NSw0NyBAQAogfQogCiBpbnQgYmVfY21kX3Jzc19jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpyc3N0YWJsZSwKLQkJCXUzMiByc3NfaGFzaF9vcHRzLCB1MTYgdGFibGVfc2l6ZSkKKwkJICAgICAgdTMyIHJzc19oYXNoX29wdHMsIHUxNiB0YWJsZV9zaXplLCBjb25zdCB1OCAqcnNzX2hrZXkpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9yc3NfY29uZmlnICpyZXE7Ci0JdTMyIG15aGFzaFsxMF0gPSB7MHgxNWQ0M2ZhNSwgMHgyNTM0Njg1YSwgMHg1Zjg3NjkzYSwgMHg1NjY4NDk0ZSwKLQkJCTB4MzNjZjZhNTMsIDB4MzgzMzM0YzYsIDB4NzZhYzQyNTcsIDB4NTliMjQyYjIsCi0JCQkweDNlYTgzYzAyLCAweDRhMTEwMzA0fTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKCEoYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpICYgQkVfSUZfRkxBR1NfUlNTKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQotCQlyZXR1cm4gLTE7CisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKLQl3cmIgPSB3cmJfZnJvbV9tYm94KGFkYXB0ZXIpOworCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CisJaWYgKCF3cmIpIHsKKwkJc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fRVRILAotCQlPUENPREVfRVRIX1JTU19DT05GSUcsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfRVRIX1JTU19DT05GSUcsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIAogCXJlcS0+aWZfaWQgPSBjcHVfdG9fbGUzMihhZGFwdGVyLT5pZl9oYW5kbGUpOwogCXJlcS0+ZW5hYmxlX3JzcyA9IGNwdV90b19sZTE2KHJzc19oYXNoX29wdHMpOwogCXJlcS0+Y3B1X3RhYmxlX3NpemVfbG9nMiA9IGNwdV90b19sZTE2KGZscyh0YWJsZV9zaXplKSAtIDEpOwogCi0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpIHx8IHNreWhhd2tfY2hpcChhZGFwdGVyKSkKKwlpZiAoIUJFeF9jaGlwKGFkYXB0ZXIpKQogCQlyZXEtPmhkci52ZXJzaW9uID0gMTsKIAogCW1lbWNweShyZXEtPmNwdV90YWJsZSwgcnNzdGFibGUsIHRhYmxlX3NpemUpOwotCW1lbWNweShyZXEtPmhhc2gsIG15aGFzaCwgc2l6ZW9mKG15aGFzaCkpOworCW1lbWNweShyZXEtPmhhc2gsIHJzc19oa2V5LCBSU1NfSEFTSF9LRVlfTEVOKTsKIAliZV9kd3NfY3B1X3RvX2xlKHJlcS0+aGFzaCwgc2l6ZW9mKHJlcS0+aGFzaCkpOwogCi0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnlfd2FpdChhZGFwdGVyKTsKLQotCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CitlcnI6CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBVc2VzIHN5bmMgbWNjICovCiBpbnQgYmVfY21kX3NldF9iZWFjb25fc3RhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHBvcnRfbnVtLAotCQkJdTggYmNuLCB1OCBzdHMsIHU4IHN0YXRlKQorCQkJICAgIHU4IGJjbiwgdTggc3RzLCB1OCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX2VuYWJsZV9kaXNhYmxlX2JlYWNvbiAqcmVxOwpAQCAtMjA3Niw3ICsyMTIxLDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fRU5BQkxFX0RJU0FCTEVfQkVBQ09OLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9CRUFDT04sCisJCQkgICAgICAgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOwogCiAJcmVxLT5wb3J0X251bSA9IHBvcnRfbnVtOwogCXJlcS0+YmVhY29uX3N0YXRlID0gc3RhdGU7CkBAIC0yMTA3LDcgKzIxNTMsOCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9HRVRfQkVBQ09OX1NUQVRFLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9HRVRfQkVBQ09OX1NUQVRFLCBzaXplb2YoKnJlcSksCisJCQkgICAgICAgd3JiLCBOVUxMKTsKIAogCXJlcS0+cG9ydF9udW0gPSBwb3J0X251bTsKIApAQCAtMjE0NiwyMCArMjE5MywyMCBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCQlPUENPREVfQ09NTU9OX1dSSVRFX09CSkVDVCwKLQkJCQlzaXplb2Yoc3RydWN0IGxhbmNlcl9jbWRfcmVxX3dyaXRlX29iamVjdCksIHdyYiwKLQkJCQlOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1dSSVRFX09CSkVDVCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxhbmNlcl9jbWRfcmVxX3dyaXRlX29iamVjdCksIHdyYiwKKwkJCSAgICAgICBOVUxMKTsKIAogCWN0eHQgPSAmcmVxLT5jb250ZXh0OwogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbGFuY2VyX3dyaXRlX29ial9jb250ZXh0LAotCQkJd3JpdGVfbGVuZ3RoLCBjdHh0LCBkYXRhX3NpemUpOworCQkgICAgICB3cml0ZV9sZW5ndGgsIGN0eHQsIGRhdGFfc2l6ZSk7CiAKIAlpZiAoZGF0YV9zaXplID09IDApCiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbGFuY2VyX3dyaXRlX29ial9jb250ZXh0LAotCQkJCWVvZiwgY3R4dCwgMSk7CisJCQkgICAgICBlb2YsIGN0eHQsIDEpOwogCWVsc2UKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9sYW5jZXJfd3JpdGVfb2JqX2NvbnRleHQsCi0JCQkJZW9mLCBjdHh0LCAwKTsKKwkJCSAgICAgIGVvZiwgY3R4dCwgMCk7CiAKIAliZV9kd3NfY3B1X3RvX2xlKGN0eHQsIHNpemVvZihyZXEtPmNvbnRleHQpKTsKIAlyZXEtPndyaXRlX29mZnNldCA9IGNwdV90b19sZTMyKGRhdGFfb2Zmc2V0KTsKQEAgLTIxNjcsOCArMjIxNCw4IEBACiAJcmVxLT5kZXNjcmlwdG9yX2NvdW50ID0gY3B1X3RvX2xlMzIoMSk7CiAJcmVxLT5idWZfbGVuID0gY3B1X3RvX2xlMzIoZGF0YV9zaXplKTsKIAlyZXEtPmFkZHJfbG93ID0gY3B1X3RvX2xlMzIoKGNtZC0+ZG1hICsKLQkJCQlzaXplb2Yoc3RydWN0IGxhbmNlcl9jbWRfcmVxX3dyaXRlX29iamVjdCkpCi0JCQkJJiAweEZGRkZGRkZGKTsKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VyX2NtZF9yZXFfd3JpdGVfb2JqZWN0KSkKKwkJCQkgICAgJiAweEZGRkZGRkZGKTsKIAlyZXEtPmFkZHJfaGlnaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoY21kLT5kbWEgKwogCQkJCXNpemVvZihzdHJ1Y3QgbGFuY2VyX2NtZF9yZXFfd3JpdGVfb2JqZWN0KSkpOwogCkBAIC0yMTk3LDggKzIyNDQsOCBAQAogfQogCiBpbnQgbGFuY2VyX2NtZF9yZWFkX29iamVjdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX2RtYV9tZW0gKmNtZCwKLQkJdTMyIGRhdGFfc2l6ZSwgdTMyIGRhdGFfb2Zmc2V0LCBjb25zdCBjaGFyICpvYmpfbmFtZSwKLQkJdTMyICpkYXRhX3JlYWQsIHUzMiAqZW9mLCB1OCAqYWRkbl9zdGF0dXMpCisJCQkgICB1MzIgZGF0YV9zaXplLCB1MzIgZGF0YV9vZmZzZXQsIGNvbnN0IGNoYXIgKm9ial9uYW1lLAorCQkJICAgdTMyICpkYXRhX3JlYWQsIHUzMiAqZW9mLCB1OCAqYWRkbl9zdGF0dXMpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgbGFuY2VyX2NtZF9yZXFfcmVhZF9vYmplY3QgKnJlcTsKQEAgLTIyMTYsOSArMjI2Myw5IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQkJT1BDT0RFX0NPTU1PTl9SRUFEX09CSkVDVCwKLQkJCXNpemVvZihzdHJ1Y3QgbGFuY2VyX2NtZF9yZXFfcmVhZF9vYmplY3QpLCB3cmIsCi0JCQlOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1JFQURfT0JKRUNULAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VyX2NtZF9yZXFfcmVhZF9vYmplY3QpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAKIAlyZXEtPmRlc2lyZWRfcmVhZF9sZW4gPSBjcHVfdG9fbGUzMihkYXRhX3NpemUpOwogCXJlcS0+cmVhZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihkYXRhX29mZnNldCk7CkBAIC0yMjQ0LDcgKzIyOTEsNyBAQAogfQogCiBpbnQgYmVfY21kX3dyaXRlX2ZsYXNocm9tKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfZG1hX21lbSAqY21kLAotCQkJdTMyIGZsYXNoX3R5cGUsIHUzMiBmbGFzaF9vcGNvZGUsIHUzMiBidWZfc2l6ZSkKKwkJCSAgdTMyIGZsYXNoX3R5cGUsIHUzMiBmbGFzaF9vcGNvZGUsIHUzMiBidWZfc2l6ZSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfd3JpdGVfZmxhc2hyb20gKnJlcTsKQEAgLTIyNjEsNyArMjMwOCw4IEBACiAJcmVxID0gY21kLT52YTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSwgY21kLT5zaXplLCB3cmIsIGNtZCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSwgY21kLT5zaXplLCB3cmIsCisJCQkgICAgICAgY21kKTsKIAogCXJlcS0+cGFyYW1zLm9wX3R5cGUgPSBjcHVfdG9fbGUzMihmbGFzaF90eXBlKTsKIAlyZXEtPnBhcmFtcy5vcF9jb2RlID0gY3B1X3RvX2xlMzIoZmxhc2hfb3Bjb2RlKTsKQEAgLTIyODQsNyArMjMzMiw3IEBACiB9CiAKIGludCBiZV9jbWRfZ2V0X2ZsYXNoX2NyYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKmZsYXNoZWRfY3JjLAotCQkJIGludCBvZmZzZXQpCisJCQkgIHUxNiBvcHR5cGUsIGludCBvZmZzZXQpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlYWRfZmxhc2hfY3JjICpyZXE7CkBAIC0yMzAzLDcgKzIzNTEsNyBAQAogCQkJICAgICAgIE9QQ09ERV9DT01NT05fUkVBRF9GTEFTSFJPTSwgc2l6ZW9mKCpyZXEpLAogCQkJICAgICAgIHdyYiwgTlVMTCk7CiAKLQlyZXEtPnBhcmFtcy5vcF90eXBlID0gY3B1X3RvX2xlMzIoT1BUWVBFX1JFREJPT1QpOworCXJlcS0+cGFyYW1zLm9wX3R5cGUgPSBjcHVfdG9fbGUzMihvcHR5cGUpOwogCXJlcS0+cGFyYW1zLm9wX2NvZGUgPSBjcHVfdG9fbGUzMihGTEFTSFJPTV9PUEVSX1JFUE9SVCk7CiAJcmVxLT5wYXJhbXMub2Zmc2V0ID0gY3B1X3RvX2xlMzIob2Zmc2V0KTsKIAlyZXEtPnBhcmFtcy5kYXRhX2J1Zl9zaXplID0gY3B1X3RvX2xlMzIoMHg0KTsKQEAgLTIzMTgsNyArMjM2Niw3IEBACiB9CiAKIGludCBiZV9jbWRfZW5hYmxlX21hZ2ljX3dvbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYywKLQkJCQlzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKKwkJCSAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX2FjcGlfd29sX21hZ2ljX2NvbmZpZyAqcmVxOwpAQCAtMjMzNCw4ICsyMzgyLDggQEAKIAlyZXEgPSBub25lbWJfY21kLT52YTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0VUSCwKLQkJT1BDT0RFX0VUSF9BQ1BJX1dPTF9NQUdJQ19DT05GSUcsIHNpemVvZigqcmVxKSwgd3JiLAotCQlub25lbWJfY21kKTsKKwkJCSAgICAgICBPUENPREVfRVRIX0FDUElfV09MX01BR0lDX0NPTkZJRywgc2l6ZW9mKCpyZXEpLAorCQkJICAgICAgIHdyYiwgbm9uZW1iX2NtZCk7CiAJbWVtY3B5KHJlcS0+bWFnaWNfbWFjLCBtYWMsIEVUSF9BTEVOKTsKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKQEAgLTIzNjMsOCArMjQxMSw4IEBACiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fTE9XTEVWRUwsCi0JCQlPUENPREVfTE9XTEVWRUxfU0VUX0xPT1BCQUNLX01PREUsIHNpemVvZigqcmVxKSwgd3JiLAotCQkJTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0xPV0xFVkVMX1NFVF9MT09QQkFDS19NT0RFLCBzaXplb2YoKnJlcSksCisJCQkgICAgICAgd3JiLCBOVUxMKTsKIAogCXJlcS0+c3JjX3BvcnQgPSBwb3J0X251bTsKIAlyZXEtPmRlc3RfcG9ydCA9IHBvcnRfbnVtOwpAQCAtMjM3OCw3ICsyNDI2LDggQEAKIH0KIAogaW50IGJlX2NtZF9sb29wYmFja190ZXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgcG9ydF9udW0sCi0JCXUzMiBsb29wYmFja190eXBlLCB1MzIgcGt0X3NpemUsIHUzMiBudW1fcGt0cywgdTY0IHBhdHRlcm4pCisJCQkgdTMyIGxvb3BiYWNrX3R5cGUsIHUzMiBwa3Rfc2l6ZSwgdTMyIG51bV9wa3RzLAorCQkJIHU2NCBwYXR0ZXJuKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfbG9vcGJhY2tfdGVzdCAqcmVxOwpAQCAtMjM5Niw3ICsyNDQ1LDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCwKLQkJCU9QQ09ERV9MT1dMRVZFTF9MT09QQkFDS19URVNULCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0xPV0xFVkVMX0xPT1BCQUNLX1RFU1QsIHNpemVvZigqcmVxKSwgd3JiLAorCQkJICAgICAgIE5VTEwpOwogCiAJcmVxLT5oZHIudGltZW91dCA9IGNwdV90b19sZTMyKDE1KTsKIAlyZXEtPnBhdHRlcm4gPSBjcHVfdG9fbGU2NChwYXR0ZXJuKTsKQEAgLTI0MjEsNyArMjQ3MSw3IEBACiB9CiAKIGludCBiZV9jbWRfZGRyX2RtYV90ZXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1NjQgcGF0dGVybiwKLQkJCQl1MzIgYnl0ZV9jbnQsIHN0cnVjdCBiZV9kbWFfbWVtICpjbWQpCisJCQl1MzIgYnl0ZV9jbnQsIHN0cnVjdCBiZV9kbWFfbWVtICpjbWQpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9kZHJkbWFfdGVzdCAqcmVxOwpAQCAtMjQzNyw3ICsyNDg3LDggQEAKIAl9CiAJcmVxID0gY21kLT52YTsKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCwKLQkJCU9QQ09ERV9MT1dMRVZFTF9IT1NUX0REUl9ETUEsIGNtZC0+c2l6ZSwgd3JiLCBjbWQpOworCQkJICAgICAgIE9QQ09ERV9MT1dMRVZFTF9IT1NUX0REUl9ETUEsIGNtZC0+c2l6ZSwgd3JiLAorCQkJICAgICAgIGNtZCk7CiAKIAlyZXEtPnBhdHRlcm4gPSBjcHVfdG9fbGU2NChwYXR0ZXJuKTsKIAlyZXEtPmJ5dGVfY291bnQgPSBjcHVfdG9fbGUzMihieXRlX2NudCk7CkBAIC0yNDY1LDcgKzI1MTYsNyBAQAogfQogCiBpbnQgYmVfY21kX2dldF9zZWVwcm9tX2RhdGEoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQpCisJCQkgICAgc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZWVwcm9tX3JlYWQgKnJlcTsKQEAgLTI0ODEsOCArMjUzMiw4IEBACiAJcmVxID0gbm9uZW1iX2NtZC0+dmE7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQlPUENPREVfQ09NTU9OX1NFRVBST01fUkVBRCwgc2l6ZW9mKCpyZXEpLCB3cmIsCi0JCQlub25lbWJfY21kKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFRVBST01fUkVBRCwgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgbm9uZW1iX2NtZCk7CiAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKQEAgLTI1MTAsOCArMjU2MSw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAljbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfcGh5X2luZm8pOwotCWNtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGNtZC5zaXplLAotCQkJCQkmY21kLmRtYSk7CisJY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgY21kLnNpemUsICZjbWQuZG1hKTsKIAlpZiAoIWNtZC52YSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHVyZVxuIik7CiAJCXN0YXR1cyA9IC1FTk9NRU07CkBAIC0yNTIxLDggKzI1NzEsOCBAQAogCXJlcSA9IGNtZC52YTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCU9QQ09ERV9DT01NT05fR0VUX1BIWV9ERVRBSUxTLCBzaXplb2YoKnJlcSksCi0JCQl3cmIsICZjbWQpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fR0VUX1BIWV9ERVRBSUxTLCBzaXplb2YoKnJlcSksCisJCQkgICAgICAgd3JiLCAmY21kKTsKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAlpZiAoIXN0YXR1cykgewpAQCAtMjU0NCw4ICsyNTk0LDcgQEAKIAkJCQlCRV9TVVBQT1JURURfU1BFRURfMUdCUFM7CiAJCX0KIAl9Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBjbWQuc2l6ZSwKLQkJCQljbWQudmEsIGNtZC5kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgY21kLnNpemUsIGNtZC52YSwgY21kLmRtYSk7CiBlcnI6CiAJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjU2OCw3ICsyNjE3LDcgQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQlPUENPREVfQ09NTU9OX1NFVF9RT1MsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9RT1MsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIAogCXJlcS0+aGRyLmRvbWFpbiA9IGRvbWFpbjsKIAlyZXEtPnZhbGlkX2JpdHMgPSBjcHVfdG9fbGUzMihCRV9RT1NfQklUU19OSUMpOwpAQCAtMjU5NywxMCArMjY0Niw5IEBACiAJbWVtc2V0KCZhdHRyaWJzX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZV9kbWFfbWVtKSk7CiAJYXR0cmlic19jbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3Jlc3BfY250bF9hdHRyaWJzKTsKIAlhdHRyaWJzX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGF0dHJpYnNfY21kLnNpemUsCi0JCQkJCQkmYXR0cmlic19jbWQuZG1hKTsKKwkJCQkJICAgICAgJmF0dHJpYnNfY21kLmRtYSk7CiAJaWYgKCFhdHRyaWJzX2NtZC52YSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMjYxMyw4ICsyNjYxLDggQEAKIAlyZXEgPSBhdHRyaWJzX2NtZC52YTsKIAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FUVFJJQlVURVMsIHBheWxvYWRfbGVuLCB3cmIsCi0JCQkmYXR0cmlic19jbWQpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fR0VUX0NOVExfQVRUUklCVVRFUywgcGF5bG9hZF9sZW4sCisJCQkgICAgICAgd3JiLCAmYXR0cmlic19jbWQpOwogCiAJc3RhdHVzID0gYmVfbWJveF9ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAlpZiAoIXN0YXR1cykgewpAQCAtMjY0OSw3ICsyNjk3LDggQEAKIAlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCU9QQ09ERV9DT01NT05fU0VUX0RSSVZFUl9GVU5DVElPTl9DQVAsIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9EUklWRVJfRlVOQ1RJT05fQ0FQLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIAogCXJlcS0+dmFsaWRfY2FwX2ZsYWdzID0gY3B1X3RvX2xlMzIoQ0FQQUJJTElUWV9TV19USU1FU1RBTVBTIHwKIAkJCQlDQVBBQklMSVRZX0JFM19OQVRJVkVfRVJYX0FQSSk7CkBAIC0yNzYyLDEyICsyODExLDEyIEBACiAJbWVtc2V0KCZnZXRfbWFjX2xpc3RfY21kLCAwLCBzaXplb2Yoc3RydWN0IGJlX2RtYV9tZW0pKTsKIAlnZXRfbWFjX2xpc3RfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXNwX2dldF9tYWNfbGlzdCk7CiAJZ2V0X21hY19saXN0X2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQlnZXRfbWFjX2xpc3RfY21kLnNpemUsCi0JCQkmZ2V0X21hY19saXN0X2NtZC5kbWEpOworCQkJCQkJICAgZ2V0X21hY19saXN0X2NtZC5zaXplLAorCQkJCQkJICAgJmdldF9tYWNfbGlzdF9jbWQuZG1hKTsKIAogCWlmICghZ2V0X21hY19saXN0X2NtZC52YSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgZHVyaW5nIEdFVF9NQUNfTElTVFxuIik7CisJCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBkdXJpbmcgR0VUX01BQ19MSVNUXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yODMxLDE4ICsyODgwLDE4IEBACiAJCS8qIElmIG5vIGFjdGl2ZSBtYWNfaWQgZm91bmQsIHJldHVybiBmaXJzdCBtYWMgYWRkciAqLwogCQkqcG1hY19pZF92YWxpZCA9IGZhbHNlOwogCQltZW1jcHkobWFjLCByZXNwLT5tYWNhZGRyX2xpc3RbMF0ubWFjX2FkZHJfaWQubWFjYWRkciwKLQkJCQkJCQkJRVRIX0FMRU4pOworCQkgICAgICAgRVRIX0FMRU4pOwogCX0KIAogb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBnZXRfbWFjX2xpc3RfY21kLnNpemUsCi0JCQlnZXRfbWFjX2xpc3RfY21kLnZhLCBnZXRfbWFjX2xpc3RfY21kLmRtYSk7CisJCQkgICAgZ2V0X21hY19saXN0X2NtZC52YSwgZ2V0X21hY19saXN0X2NtZC5kbWEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCBiZV9jbWRfZ2V0X2FjdGl2ZV9tYWMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjdXJyX3BtYWNfaWQsIHU4ICptYWMsCi0JCQkgIHUzMiBpZl9oYW5kbGUsIGJvb2wgYWN0aXZlLCB1MzIgZG9tYWluKQoraW50IGJlX2NtZF9nZXRfYWN0aXZlX21hYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGN1cnJfcG1hY19pZCwKKwkJCSAgdTggKm1hYywgdTMyIGlmX2hhbmRsZSwgYm9vbCBhY3RpdmUsIHUzMiBkb21haW4pCiB7CiAKIAlpZiAoIWFjdGl2ZSkKQEAgLTI4OTIsNyArMjk0MSw3IEBACiAJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgYmVfZG1hX21lbSkpOwogCWNtZC5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVxX3NldF9tYWNfbGlzdCk7CiAJY21kLnZhID0gZG1hX2FsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC5zaXplLAotCQkJJmNtZC5kbWEsIEdGUF9LRVJORUwpOworCQkJCSAgICAmY21kLmRtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbWQudmEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yOTA2LDggKzI5NTUsOCBAQAogCiAJcmVxID0gY21kLnZhOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCQlPUENPREVfQ09NTU9OX1NFVF9NQUNfTElTVCwgc2l6ZW9mKCpyZXEpLAotCQkJCXdyYiwgJmNtZCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9TRVRfTUFDX0xJU1QsIHNpemVvZigqcmVxKSwKKwkJCSAgICAgICB3cmIsICZjbWQpOwogCiAJcmVxLT5oZHIuZG9tYWluID0gZG9tYWluOwogCXJlcS0+bWFjX2NvdW50ID0gbWFjX2NvdW50OwpAQCAtMjkxNyw4ICsyOTY2LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwKLQkJCQljbWQudmEsIGNtZC5kbWEpOworCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC5zaXplLCBjbWQudmEsIGNtZC5kbWEpOwogCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI5NjMsNyArMzAxMSw4IEBACiAJY3R4dCA9ICZyZXEtPmNvbnRleHQ7CiAKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQlPUENPREVfQ09NTU9OX1NFVF9IU1dfQ09ORklHLCBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisJCQkgICAgICAgT1BDT0RFX0NPTU1PTl9TRVRfSFNXX0NPTkZJRywgc2l6ZW9mKCpyZXEpLCB3cmIsCisJCQkgICAgICAgTlVMTCk7CiAKIAlyZXEtPmhkci5kb21haW4gPSBkb21haW47CiAJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9zZXRfaHN3X2NvbnRleHQsIGludGVyZmFjZV9pZCwgY3R4dCwgaW50Zl9pZCk7CkBAIC0zMDA5LDcgKzMwNTgsOCBAQAogCWN0eHQgPSAmcmVxLT5jb250ZXh0OwogCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQkJT1BDT0RFX0NPTU1PTl9HRVRfSFNXX0NPTkZJRywgc2l6ZW9mKCpyZXEpLCB3cmIsIE5VTEwpOworCQkJICAgICAgIE9QQ09ERV9DT01NT05fR0VUX0hTV19DT05GSUcsIHNpemVvZigqcmVxKSwgd3JiLAorCQkJICAgICAgIE5VTEwpOwogCiAJcmVxLT5oZHIuZG9tYWluID0gZG9tYWluOwogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZ2V0X2hzd19yZXFfY29udGV4dCwgaW50ZXJmYWNlX2lkLApAQCAtMzAyNywxMCArMzA3Nyw5IEBACiAJaWYgKCFzdGF0dXMpIHsKIAkJc3RydWN0IGJlX2NtZF9yZXNwX2dldF9oc3dfY29uZmlnICpyZXNwID0KIAkJCQkJCWVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQkJYmVfZHdzX2xlX3RvX2NwdSgmcmVzcC0+Y29udGV4dCwKLQkJCQkJCXNpemVvZihyZXNwLT5jb250ZXh0KSk7CisJCWJlX2R3c19sZV90b19jcHUoJnJlc3AtPmNvbnRleHQsIHNpemVvZihyZXNwLT5jb250ZXh0KSk7CiAJCXZpZCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZ2V0X2hzd19yZXNwX2NvbnRleHQsCi0JCQkJCQkJcHZpZCwgJnJlc3AtPmNvbnRleHQpOworCQkJCSAgICBwdmlkLCAmcmVzcC0+Y29udGV4dCk7CiAJCWlmIChwdmlkKQogCQkJKnB2aWQgPSBsZTE2X3RvX2NwdSh2aWQpOwogCQlpZiAobW9kZSkKQEAgLTMwNjIsMTEgKzMxMTEsOSBAQAogCiAJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgYmVfZG1hX21lbSkpOwogCWNtZC5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVzcF9hY3BpX3dvbF9tYWdpY19jb25maWdfdjEpOwotCWNtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGNtZC5zaXplLAotCQkJCQkgICAgICAgJmNtZC5kbWEpOworCWNtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGNtZC5zaXplLCAmY21kLmRtYSk7CiAJaWYgKCFjbWQudmEpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMzNDksOCArMzM5Niw3IEBACiAKIAltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZV9kbWFfbWVtKSk7CiAJY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXNwX2dldF9mdW5jX2NvbmZpZyk7Ci0JY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgY21kLnNpemUsCi0JCQkJICAgICAgJmNtZC5kbWEpOworCWNtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGNtZC5zaXplLCAmY21kLmRtYSk7CiAJaWYgKCFjbWQudmEpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOwogCQlzdGF0dXMgPSAtRU5PTUVNOwpAQCAtMzM5Niw3ICszNDQyLDcgQEAKIAogLyogVXNlcyBtYm94ICovCiBzdGF0aWMgaW50IGJlX2NtZF9nZXRfcHJvZmlsZV9jb25maWdfbWJveChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJdTggZG9tYWluLCBzdHJ1Y3QgYmVfZG1hX21lbSAqY21kKQorCQkJCQkgIHU4IGRvbWFpbiwgc3RydWN0IGJlX2RtYV9tZW0gKmNtZCkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9wcm9maWxlX2NvbmZpZyAqcmVxOwpAQCAtMzQyNCw3ICszNDcwLDcgQEAKIAogLyogVXNlcyBzeW5jIG1jYyAqLwogc3RhdGljIGludCBiZV9jbWRfZ2V0X3Byb2ZpbGVfY29uZmlnX21jY3Eoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCXU4IGRvbWFpbiwgc3RydWN0IGJlX2RtYV9tZW0gKmNtZCkKKwkJCQkJICB1OCBkb21haW4sIHN0cnVjdCBiZV9kbWFfbWVtICpjbWQpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfcHJvZmlsZV9jb25maWcgKnJlcTsKQEAgLTM0ODQsOCArMzUzMCw4IEBACiAJcmVzcCA9IGNtZC52YTsKIAlkZXNjX2NvdW50ID0gbGUzMl90b19jcHUocmVzcC0+ZGVzY19jb3VudCk7CiAKLQlwY2llID0gIGJlX2dldF9wY2llX2Rlc2MoYWRhcHRlci0+cGRldi0+ZGV2Zm4sIHJlc3AtPmZ1bmNfcGFyYW0sCi0JCQkJIGRlc2NfY291bnQpOworCXBjaWUgPSBiZV9nZXRfcGNpZV9kZXNjKGFkYXB0ZXItPnBkZXYtPmRldmZuLCByZXNwLT5mdW5jX3BhcmFtLAorCQkJCWRlc2NfY291bnQpOwogCWlmIChwY2llKQogCQlyZXMtPm1heF92ZnMgPSBsZTE2X3RvX2NwdShwY2llLT5udW1fdmZzKTsKIApAQCAtMzU0OCwzMyArMzU5NCw0NyBAQAogCW5pYy0+Y3FfY291bnQgPSAweEZGRkY7CiAJbmljLT50b2VfY29ubl9jb3VudCA9IDB4RkZGRjsKIAluaWMtPmVxX2NvdW50ID0gMHhGRkZGOworCW5pYy0+aWZhY2VfY291bnQgPSAweEZGRkY7CiAJbmljLT5saW5rX3BhcmFtID0gMHhGRjsKKwluaWMtPmNoYW5uZWxfaWRfcGFyYW0gPSBjcHVfdG9fbGUxNigweEYwMDApOwogCW5pYy0+YWNwaV9wYXJhbXMgPSAweEZGOwogCW5pYy0+d29sX3BhcmFtID0gMHgwRjsKLQluaWMtPmJ3X21pbiA9IDB4RkZGRkZGRkY7CisJbmljLT50dW5uZWxfaWZhY2VfY291bnQgPSAweEZGRkY7CisJbmljLT5kaXJlY3RfdGVuYW50X2lmYWNlX2NvdW50ID0gMHhGRkZGOwogCW5pYy0+YndfbWF4ID0gMHhGRkZGRkZGRjsKIH0KIAotaW50IGJlX2NtZF9jb25maWdfcW9zKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgYnBzLCB1OCBkb21haW4pCitpbnQgYmVfY21kX2NvbmZpZ19xb3Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtYXhfcmF0ZSwgdTE2IGxpbmtfc3BlZWQsCisJCSAgICAgIHU4IGRvbWFpbikKIHsKLQlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKLQkJc3RydWN0IGJlX25pY19yZXNfZGVzYyBuaWNfZGVzYzsKKwlzdHJ1Y3QgYmVfbmljX3Jlc19kZXNjIG5pY19kZXNjOworCXUzMiBid19wZXJjZW50OworCXUxNiB2ZXJzaW9uID0gMDsKIAotCQliZV9yZXNldF9uaWNfZGVzYygmbmljX2Rlc2MpOworCWlmIChCRTNfY2hpcChhZGFwdGVyKSkKKwkJcmV0dXJuIGJlX2NtZF9zZXRfcW9zKGFkYXB0ZXIsIG1heF9yYXRlIC8gMTAsIGRvbWFpbik7CisKKwliZV9yZXNldF9uaWNfZGVzYygmbmljX2Rlc2MpOworCW5pY19kZXNjLnBmX251bSA9IGFkYXB0ZXItPnBmX251bWJlcjsKKwluaWNfZGVzYy52Zl9udW0gPSBkb21haW47CisJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7CiAJCW5pY19kZXNjLmhkci5kZXNjX3R5cGUgPSBOSUNfUkVTT1VSQ0VfREVTQ19UWVBFX1YwOwogCQluaWNfZGVzYy5oZHIuZGVzY19sZW4gPSBSRVNPVVJDRV9ERVNDX1NJWkVfVjA7CiAJCW5pY19kZXNjLmZsYWdzID0gKDEgPDwgUVVOX1NISUZUKSB8ICgxIDw8IElNTV9TSElGVCkgfAogCQkJCQkoMSA8PCBOT1NWX1NISUZUKTsKLQkJbmljX2Rlc2MucGZfbnVtID0gYWRhcHRlci0+cGZfbnVtYmVyOwotCQluaWNfZGVzYy52Zl9udW0gPSBkb21haW47Ci0JCW5pY19kZXNjLmJ3X21heCA9IGNwdV90b19sZTMyKGJwcyk7Ci0KLQkJcmV0dXJuIGJlX2NtZF9zZXRfcHJvZmlsZV9jb25maWcoYWRhcHRlciwgJm5pY19kZXNjLAotCQkJCQkJIFJFU09VUkNFX0RFU0NfU0laRV9WMCwKLQkJCQkJCSAwLCBkb21haW4pOworCQluaWNfZGVzYy5id19tYXggPSBjcHVfdG9fbGUzMihtYXhfcmF0ZSAvIDEwKTsKIAl9IGVsc2UgewotCQlyZXR1cm4gYmVfY21kX3NldF9xb3MoYWRhcHRlciwgYnBzLCBkb21haW4pOworCQl2ZXJzaW9uID0gMTsKKwkJbmljX2Rlc2MuaGRyLmRlc2NfdHlwZSA9IE5JQ19SRVNPVVJDRV9ERVNDX1RZUEVfVjE7CisJCW5pY19kZXNjLmhkci5kZXNjX2xlbiA9IFJFU09VUkNFX0RFU0NfU0laRV9WMTsKKwkJbmljX2Rlc2MuZmxhZ3MgPSAoMSA8PCBJTU1fU0hJRlQpIHwgKDEgPDwgTk9TVl9TSElGVCk7CisJCWJ3X3BlcmNlbnQgPSBtYXhfcmF0ZSA/IChtYXhfcmF0ZSAqIDEwMCkgLyBsaW5rX3NwZWVkIDogMTAwOworCQluaWNfZGVzYy5id19tYXggPSBjcHVfdG9fbGUzMihid19wZXJjZW50KTsKIAl9CisKKwlyZXR1cm4gYmVfY21kX3NldF9wcm9maWxlX2NvbmZpZyhhZGFwdGVyLCAmbmljX2Rlc2MsCisJCQkJCSBuaWNfZGVzYy5oZHIuZGVzY19sZW4sCisJCQkJCSB2ZXJzaW9uLCBkb21haW4pOwogfQogCiBpbnQgYmVfY21kX21hbmFnZV9pZmFjZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGlmYWNlLCB1OCBvcCkKQEAgLTM4NTksNyArMzkxOSw3IEBACiB9CiAKIGludCBiZV9yb2NlX21jY19jbWQodm9pZCAqbmV0ZGV2X2hhbmRsZSwgdm9pZCAqd3JiX3BheWxvYWQsCi0JCQlpbnQgd3JiX3BheWxvYWRfc2l6ZSwgdTE2ICpjbWRfc3RhdHVzLCB1MTYgKmV4dF9zdGF0dXMpCisJCSAgICBpbnQgd3JiX3BheWxvYWRfc2l6ZSwgdTE2ICpjbWRfc3RhdHVzLCB1MTYgKmV4dF9zdGF0dXMpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXZfaGFuZGxlKTsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKaW5kZXggYjYwZTRkNS4uM2UwYTZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIENRRV9GTEFHU19DT05TVU1FRF9NQVNLIAkoMSA8PCAyNykKIAogLyogQ29tcGxldGlvbiBTdGF0dXMgKi8KLWVudW0geworZW51bSBtY2NfYmFzZV9zdGF0dXMgewogCU1DQ19TVEFUVVNfU1VDQ0VTUyA9IDAsCiAJTUNDX1NUQVRVU19GQUlMRUQgPSAxLAogCU1DQ19TVEFUVVNfSUxMRUdBTF9SRVFVRVNUID0gMiwKQEAgLTYwLDEyICs2MCwyNSBAQAogCU1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IDY2CiB9OwogCi0jZGVmaW5lIE1DQ19BRERMX1NUU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTCTB4MTYKKy8qIEFkZGl0aW9uYWwgc3RhdHVzICovCitlbnVtIG1jY19hZGRsX3N0YXR1cyB7CisJTUNDX0FERExfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgPSAweDE2LAorCU1DQ19BRERMX1NUQVRVU19GTEFTSF9JTUFHRV9DUkNfTUlTTUFUQ0ggPSAweDRkLAorCU1DQ19BRERMX1NUQVRVU19UT09fTUFOWV9JTlRFUkZBQ0VTID0gMHg0YQorfTsKIAotI2RlZmluZSBDUUVfU1RBVFVTX0NPTVBMX01BU0sJCTB4RkZGRgotI2RlZmluZSBDUUVfU1RBVFVTX0NPTVBMX1NISUZUCQkwCS8qIGJpdHMgMCAtIDE1ICovCi0jZGVmaW5lIENRRV9TVEFUVVNfRVhURF9NQVNLCQkweEZGRkYKLSNkZWZpbmUgQ1FFX1NUQVRVU19FWFREX1NISUZUCQkxNgkvKiBiaXRzIDE2IC0gMzEgKi8KKyNkZWZpbmUgQ1FFX0JBU0VfU1RBVFVTX01BU0sJCTB4RkZGRgorI2RlZmluZSBDUUVfQkFTRV9TVEFUVVNfU0hJRlQJCTAJLyogYml0cyAwIC0gMTUgKi8KKyNkZWZpbmUgQ1FFX0FERExfU1RBVFVTX01BU0sJCTB4RkYKKyNkZWZpbmUgQ1FFX0FERExfU1RBVFVTX1NISUZUCQkxNgkvKiBiaXRzIDE2IC0gMzEgKi8KKworI2RlZmluZSBiYXNlX3N0YXR1cyhzdGF0dXMpCQlcCisJCSgoZW51bSBtY2NfYmFzZV9zdGF0dXMpCVwKKwkJCShzdGF0dXMgPiAwID8gKHN0YXR1cyAmIENRRV9CQVNFX1NUQVRVU19NQVNLKSA6IDApKQorI2RlZmluZSBhZGRsX3N0YXR1cyhzdGF0dXMpCQlcCisJCSgoZW51bSBtY2NfYWRkbF9zdGF0dXMpCVwKKwkJCShzdGF0dXMgPiAwID8gKHN0YXR1cyA+PiBDUUVfQURETF9TVEFUVVNfU0hJRlQpICYgXAorCQkJCQlDUUVfQURETF9TVEFUVVNfTUFTSyA6IDApKQogCiBzdHJ1Y3QgYmVfbWNjX2NvbXBsIHsKIAl1MzIgc3RhdHVzOwkJLyogZHdvcmQgMCAqLwpAQCAtNzQsMTMgKzg3LDEzIEBACiAJdTMyIGZsYWdzOwkJLyogZHdvcmQgMyAqLwogfTsKIAotLyogV2hlbiB0aGUgYXN5bmMgYml0IG9mIG1jY19jb21wbCBpcyBzZXQsIHRoZSBsYXN0IDQgYnl0ZXMgb2YKLSAqIG1jY19jb21wbCBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorLyogV2hlbiB0aGUgYXN5bmMgYml0IG9mIG1jY19jb21wbCBmbGFncyBpcyBzZXQsIGZsYWdzCisgKiBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgogICovCi0jZGVmaW5lIEFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9TSElGVAk4CS8qIGJpdHMgOCAtIDE1ICovCi0jZGVmaW5lIEFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9NQVNLCTB4RkYKLSNkZWZpbmUgQVNZTkNfVFJBSUxFUl9FVkVOVF9UWVBFX1NISUZUCTE2Ci0jZGVmaW5lIEFTWU5DX1RSQUlMRVJfRVZFTlRfVFlQRV9NQVNLCTB4RkYKKyNkZWZpbmUgQVNZTkNfRVZFTlRfQ09ERV9TSElGVAkJOAkvKiBiaXRzIDggLSAxNSAqLworI2RlZmluZSBBU1lOQ19FVkVOVF9DT0RFX01BU0sJCTB4RkYKKyNkZWZpbmUgQVNZTkNfRVZFTlRfVFlQRV9TSElGVAkJMTYKKyNkZWZpbmUgQVNZTkNfRVZFTlRfVFlQRV9NQVNLCQkweEZGCiAjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURQkweDEKICNkZWZpbmUgQVNZTkNfRVZFTlRfQ09ERV9HUlBfNQkJMHg1CiAjZGVmaW5lIEFTWU5DX0VWRU5UX1FPU19TUEVFRAkJMHgxCkBAIC04OSwxMCArMTAyLDYgQEAKICNkZWZpbmUgQVNZTkNfRVZFTlRfQ09ERV9RTlEJCTB4NgogI2RlZmluZSBBU1lOQ19ERUJVR19FVkVOVF9UWVBFX1FOUQkxCiAKLXN0cnVjdCBiZV9hc3luY19ldmVudF90cmFpbGVyIHsKLQl1MzIgY29kZTsKLX07Ci0KIGVudW0gewogCUxJTktfRE9XTgk9IDB4MCwKIAlMSU5LX1VQCQk9IDB4MQpAQCAtMTAwLDcgKzEwOSw3IEBACiAjZGVmaW5lIExJTktfU1RBVFVTX01BU0sJCQkweDEKICNkZWZpbmUgTE9HSUNBTF9MSU5LX1NUQVRVU19NQVNLCQkweDIKIAotLyogV2hlbiB0aGUgZXZlbnQgY29kZSBvZiBhbiBhc3luYyB0cmFpbGVyIGlzIGxpbmstc3RhdGUsIHRoZSBtY2NfY29tcGwKKy8qIFdoZW4gdGhlIGV2ZW50IGNvZGUgb2YgY29tcGwtPmZsYWdzIGlzIGxpbmstc3RhdGUsIHRoZSBtY2NfY29tcGwKICAqIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93cwogICovCiBzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfbGlua19zdGF0ZSB7CkBAIC0xMTAsMTAgKzExOSwxMCBAQAogCXU4IHBvcnRfc3BlZWQ7CiAJdTggcG9ydF9mYXVsdDsKIAl1OCByc3ZkMFs3XTsKLQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfdHJhaWxlciB0cmFpbGVyOworCXUzMiBmbGFnczsKIH0gX19wYWNrZWQ7CiAKLS8qIFdoZW4gdGhlIGV2ZW50IGNvZGUgb2YgYW4gYXN5bmMgdHJhaWxlciBpcyBHUlAtNSBhbmQgZXZlbnRfdHlwZSBpcyBRT1NfU1BFRUQKKy8qIFdoZW4gdGhlIGV2ZW50IGNvZGUgb2YgY29tcGwtPmZsYWdzIGlzIEdSUC01IGFuZCBldmVudF90eXBlIGlzIFFPU19TUEVFRAogICogdGhlIG1jY19jb21wbCBtdXN0IGJlIGludGVycHJldGVkIGFzIGZvbGxvd3MKICAqLwogc3RydWN0IGJlX2FzeW5jX2V2ZW50X2dycDVfcW9zX2xpbmtfc3BlZWQgewpAQCAtMTIxLDEwICsxMzAsMTAgQEAKIAl1OCByc3ZkWzVdOwogCXUxNiBxb3NfbGlua19zcGVlZDsKIAl1MzIgZXZlbnRfdGFnOwotCXN0cnVjdCBiZV9hc3luY19ldmVudF90cmFpbGVyIHRyYWlsZXI7CisJdTMyIGZsYWdzOwogfSBfX3BhY2tlZDsKIAotLyogV2hlbiB0aGUgZXZlbnQgY29kZSBvZiBhbiBhc3luYyB0cmFpbGVyIGlzIEdSUDUgYW5kIGV2ZW50IHR5cGUgaXMKKy8qIFdoZW4gdGhlIGV2ZW50IGNvZGUgb2YgY29tcGwtPmZsYWdzIGlzIEdSUDUgYW5kIGV2ZW50IHR5cGUgaXMKICAqIENvUy1Qcmlvcml0eSwgdGhlIG1jY19jb21wbCBtdXN0IGJlIGludGVycHJldGVkIGFzIGZvbGxvd3MKICAqLwogc3RydWN0IGJlX2FzeW5jX2V2ZW50X2dycDVfY29zX3ByaW9yaXR5IHsKQEAgLTEzNCwxMCArMTQzLDEwIEBACiAJdTggdmFsaWQ7CiAJdTggcnN2ZDA7CiAJdTggZXZlbnRfdGFnOwotCXN0cnVjdCBiZV9hc3luY19ldmVudF90cmFpbGVyIHRyYWlsZXI7CisJdTMyIGZsYWdzOwogfSBfX3BhY2tlZDsKIAotLyogV2hlbiB0aGUgZXZlbnQgY29kZSBvZiBhbiBhc3luYyB0cmFpbGVyIGlzIEdSUDUgYW5kIGV2ZW50IHR5cGUgaXMKKy8qIFdoZW4gdGhlIGV2ZW50IGNvZGUgb2YgY29tcGwtPmZsYWdzIGlzIEdSUDUgYW5kIGV2ZW50IHR5cGUgaXMKICAqIFBWSUQgc3RhdGUsIHRoZSBtY2NfY29tcGwgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzCiAgKi8KIHN0cnVjdCBiZV9hc3luY19ldmVudF9ncnA1X3B2aWRfc3RhdGUgewpAQCAtMTQ2LDcgKzE1NSw3IEBACiAJdTE2IHRhZzsKIAl1MzIgZXZlbnRfdGFnOwogCXUzMiByc3ZkMTsKLQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfdHJhaWxlciB0cmFpbGVyOworCXUzMiBmbGFnczsKIH0gX19wYWNrZWQ7CiAKIC8qIGFzeW5jIGV2ZW50IGluZGljYXRpbmcgb3V0ZXIgVkxBTiB0YWcgaW4gUW5RICovCkBAIC0xNTYsNyArMTY1LDcgQEAKIAl1MTYgdmxhbl90YWc7CiAJdTMyIGV2ZW50X3RhZzsKIAl1OCByc3ZkMVs0XTsKLQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfdHJhaWxlciB0cmFpbGVyOworCXUzMiBmbGFnczsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBiZV9tY2NfbWFpbGJveCB7CkBAIC0yNTgsOCArMjY3LDggQEAKIAl1OCBvcGNvZGU7CQkvKiBkd29yZCAwICovCiAJdTggc3Vic3lzdGVtOwkJLyogZHdvcmQgMCAqLwogCXU4IHJzdmRbMl07CQkvKiBkd29yZCAwICovCi0JdTggc3RhdHVzOwkJLyogZHdvcmQgMSAqLwotCXU4IGFkZF9zdGF0dXM7CQkvKiBkd29yZCAxICovCisJdTggYmFzZV9zdGF0dXM7CQkvKiBkd29yZCAxICovCisJdTggYWRkbF9zdGF0dXM7CQkvKiBkd29yZCAxICovCiAJdTggcnN2ZDFbMl07CQkvKiBkd29yZCAxICovCiAJdTMyIHJlc3BvbnNlX2xlbmd0aDsJLyogZHdvcmQgMiAqLwogCXUzMiBhY3R1YWxfcmVzcF9sZW47CS8qIGR3b3JkIDMgKi8KQEAgLTExODYsNyArMTE5NSw4IEBACiAJc3RydWN0IGZsYXNocm9tX3BhcmFtcyBwYXJhbXM7CiAJdTggY3JjWzRdOwogCXU4IHJzdmRbNF07Ci19OworfSBfX3BhY2tlZDsKKwogLyoqKioqKioqKioqKioqKiogTGFuY2VyIEZpcm13YXJlIEZsYXNoICoqKioqKioqKioqKi8KIHN0cnVjdCBhbWFwX2xhbmNlcl93cml0ZV9vYmpfY29udGV4dCB7CiAJdTggd3JpdGVfbGVuZ3RoWzI0XTsKQEAgLTE4OTEsMTYgKzE5MDEsMjAgQEAKIAl1MTYgY3FfY291bnQ7CiAJdTE2IHRvZV9jb25uX2NvdW50OwogCXUxNiBlcV9jb3VudDsKLQl1MzIgcnN2ZDU7CisJdTE2IHZsYW5faWQ7CisJdTE2IGlmYWNlX2NvdW50OwogCXUzMiBjYXBfZmxhZ3M7CiAJdTggbGlua19wYXJhbTsKLQl1OCByc3ZkNlszXTsKKwl1OCByc3ZkNjsKKwl1MTYgY2hhbm5lbF9pZF9wYXJhbTsKIAl1MzIgYndfbWluOwogCXUzMiBid19tYXg7CiAJdTggYWNwaV9wYXJhbXM7CiAJdTggd29sX3BhcmFtOwogCXUxNiByc3ZkNzsKLQl1MzIgcnN2ZDhbN107CisJdTE2IHR1bm5lbF9pZmFjZV9jb3VudDsKKwl1MTYgZGlyZWN0X3RlbmFudF9pZmFjZV9jb3VudDsKKwl1MzIgcnN2ZDhbNl07CiB9IF9fcGFja2VkOwogCiAvKioqKioqKioqKioqIE11bHRpLUNoYW5uZWwgdHlwZSAqKioqKioqKioqKi8KQEAgLTIwNjAsNyArMjA3NCw3IEBACiAJCSAgICAgIGNoYXIgKmZ3X29uX2ZsYXNoKTsKIGludCBiZV9jbWRfbW9kaWZ5X2VxZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3NldF9lcWQgKiwgaW50IG51bSk7CiBpbnQgYmVfY21kX3ZsYW5fY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfaWQsIHUxNiAqdnRhZ19hcnJheSwKLQkJICAgICAgIHUzMiBudW0sIGJvb2wgcHJvbWlzY3VvdXMpOworCQkgICAgICAgdTMyIG51bSk7CiBpbnQgYmVfY21kX3J4X2ZpbHRlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGZsYWdzLCB1MzIgc3RhdHVzKTsKIGludCBiZV9jbWRfc2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIHR4X2ZjLCB1MzIgcnhfZmMpOwogaW50IGJlX2NtZF9nZXRfZmxvd19jb250cm9sKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKnR4X2ZjLCB1MzIgKnJ4X2ZjKTsKQEAgLTIwNjgsNyArMjA4Miw3IEBACiAJCQl1MzIgKmZ1bmN0aW9uX21vZGUsIHUzMiAqZnVuY3Rpb25fY2FwcywgdTE2ICphc2ljX3Jldik7CiBpbnQgYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9jbWRfcnNzX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKnJzc3RhYmxlLAotCQkgICAgICB1MzIgcnNzX2hhc2hfb3B0cywgdTE2IHRhYmxlX3NpemUpOworCQkgICAgICB1MzIgcnNzX2hhc2hfb3B0cywgdTE2IHRhYmxlX3NpemUsIGNvbnN0IHU4ICpyc3NfaGtleSk7CiBpbnQgYmVfcHJvY2Vzc19tY2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGJlX2NtZF9zZXRfYmVhY29uX3N0YXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCBwb3J0X251bSwgdTggYmVhY29uLAogCQkJICAgIHU4IHN0YXR1cywgdTggc3RhdGUpOwpAQCAtMjA4NCw3ICsyMDk4LDcgQEAKIAkJCSAgIHUzMiBkYXRhX3NpemUsIHUzMiBkYXRhX29mZnNldCwgY29uc3QgY2hhciAqb2JqX25hbWUsCiAJCQkgICB1MzIgKmRhdGFfcmVhZCwgdTMyICplb2YsIHU4ICphZGRuX3N0YXR1cyk7CiBpbnQgYmVfY21kX2dldF9mbGFzaF9jcmMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpmbGFzaGVkX2NyYywKLQkJCSBpbnQgb2Zmc2V0KTsKKwkJCSAgdTE2IG9wdHlwZSwgaW50IG9mZnNldCk7CiBpbnQgYmVfY21kX2VuYWJsZV9tYWdpY193b2woc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWMsCiAJCQkgICAgc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQpOwogaW50IGJlX2NtZF9md19pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKQEAgLTIxMDEsNyArMjExNSw4IEBACiBpbnQgYmVfY21kX3NldF9sb29wYmFjayhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggcG9ydF9udW0sCiAJCQl1OCBsb29wYmFja190eXBlLCB1OCBlbmFibGUpOwogaW50IGJlX2NtZF9nZXRfcGh5X2luZm8oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50IGJlX2NtZF9jb25maWdfcW9zKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgYnBzLCB1OCBkb21haW4pOworaW50IGJlX2NtZF9jb25maWdfcW9zKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgbWF4X3JhdGUsCisJCSAgICAgIHUxNiBsaW5rX3NwZWVkLCB1OCBkb21haW4pOwogdm9pZCBiZV9kZXRlY3RfZXJyb3Ioc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGJlX2NtZF9nZXRfZGllX3RlbXBlcmF0dXJlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9jbWRfZ2V0X2NudGxfYXR0cmlidXRlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYwppbmRleCAxNWJhOTZjLi5lMmRhNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogCXtEUlZTVEFUX1JYX0lORk8ocnhfYnl0ZXMpfSwvKiBJZiBtb3ZpbmcgdGhpcyBtZW1iZXIgc2VlIGFib3ZlIG5vdGUgKi8KIAl7RFJWU1RBVF9SWF9JTkZPKHJ4X3BrdHMpfSwgLyogSWYgbW92aW5nIHRoaXMgbWVtYmVyIHNlZSBhYm92ZSBub3RlICovCiAJe0RSVlNUQVRfUlhfSU5GTyhyeF9jb21wbCl9LAorCXtEUlZTVEFUX1JYX0lORk8ocnhfY29tcGxfZXJyKX0sCiAJe0RSVlNUQVRfUlhfSU5GTyhyeF9tY2FzdF9wa3RzKX0sCiAJLyogTnVtYmVyIG9mIHBhZ2UgYWxsb2NhdGlvbiBmYWlsdXJlcyB3aGlsZSBwb3N0aW5nIHJlY2VpdmUgYnVmZmVycwogCSAqIHRvIEhXLgpAQCAtMTgxLDcgKzE4Miw3IEBACiAjZGVmaW5lIEJFX05PX0xPT1BCQUNLIDB4ZmYKIAogc3RhdGljIHZvaWQgYmVfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQorCQkJICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTIwMSw4ICsyMDIsNyBAQAogCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOwogfQogCi1zdGF0aWMgdTMyCi1sYW5jZXJfY21kX2dldF9maWxlX2xlbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKmZpbGVfbmFtZSkKK3N0YXRpYyB1MzIgbGFuY2VyX2NtZF9nZXRfZmlsZV9sZW4oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpmaWxlX25hbWUpCiB7CiAJdTMyIGRhdGFfcmVhZCA9IDAsIGVvZjsKIAl1OCBhZGRuX3N0YXR1czsKQEAgLTIxMiwxNCArMjEyLDE0IEBACiAJbWVtc2V0KCZkYXRhX2xlbl9jbWQsIDAsIHNpemVvZihkYXRhX2xlbl9jbWQpKTsKIAkvKiBkYXRhX29mZnNldCBhbmQgZGF0YV9zaXplIHNob3VsZCBiZSAwIHRvIGdldCByZWcgbGVuICovCiAJc3RhdHVzID0gbGFuY2VyX2NtZF9yZWFkX29iamVjdChhZGFwdGVyLCAmZGF0YV9sZW5fY21kLCAwLCAwLAotCQkJCWZpbGVfbmFtZSwgJmRhdGFfcmVhZCwgJmVvZiwgJmFkZG5fc3RhdHVzKTsKKwkJCQkJZmlsZV9uYW1lLCAmZGF0YV9yZWFkLCAmZW9mLAorCQkJCQkmYWRkbl9zdGF0dXMpOwogCiAJcmV0dXJuIGRhdGFfcmVhZDsKIH0KIAotc3RhdGljIGludAotbGFuY2VyX2NtZF9yZWFkX2ZpbGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpmaWxlX25hbWUsCi0JCXUzMiBidWZfbGVuLCB2b2lkICpidWYpCitzdGF0aWMgaW50IGxhbmNlcl9jbWRfcmVhZF9maWxlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCAqZmlsZV9uYW1lLAorCQkJCXUzMiBidWZfbGVuLCB2b2lkICpidWYpCiB7CiAJc3RydWN0IGJlX2RtYV9tZW0gcmVhZF9jbWQ7CiAJdTMyIHJlYWRfbGVuID0gMCwgdG90YWxfcmVhZF9sZW4gPSAwLCBjaHVua19zaXplOwpAQCAtMjI5LDExICsyMjksMTEgQEAKIAogCXJlYWRfY21kLnNpemUgPSBMQU5DRVJfUkVBRF9GSUxFX0NIVU5LOwogCXJlYWRfY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcmVhZF9jbWQuc2l6ZSwKLQkJCSZyZWFkX2NtZC5kbWEpOworCQkJCQkgICAmcmVhZF9jbWQuZG1hKTsKIAogCWlmICghcmVhZF9jbWQudmEpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIHdoaWxlIHJlYWRpbmcgZHVtcFxuIik7CisJCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSB3aGlsZSByZWFkaW5nIGR1bXBcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI0Miw4ICsyNDIsOCBAQAogCQkJCUxBTkNFUl9SRUFEX0ZJTEVfQ0hVTkspOwogCQljaHVua19zaXplID0gQUxJR04oY2h1bmtfc2l6ZSwgNCk7CiAJCXN0YXR1cyA9IGxhbmNlcl9jbWRfcmVhZF9vYmplY3QoYWRhcHRlciwgJnJlYWRfY21kLCBjaHVua19zaXplLAotCQkJCXRvdGFsX3JlYWRfbGVuLCBmaWxlX25hbWUsICZyZWFkX2xlbiwKLQkJCQkmZW9mLCAmYWRkbl9zdGF0dXMpOworCQkJCQkJdG90YWxfcmVhZF9sZW4sIGZpbGVfbmFtZSwKKwkJCQkJCSZyZWFkX2xlbiwgJmVvZiwgJmFkZG5fc3RhdHVzKTsKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCW1lbWNweShidWYgKyB0b3RhbF9yZWFkX2xlbiwgcmVhZF9jbWQudmEsIHJlYWRfbGVuKTsKIAkJCXRvdGFsX3JlYWRfbGVuICs9IHJlYWRfbGVuOwpAQCAtMjU0LDEzICsyNTQsMTIgQEAKIAkJfQogCX0KIAlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHJlYWRfY21kLnNpemUsIHJlYWRfY21kLnZhLAotCQkJcmVhZF9jbWQuZG1hKTsKKwkJCSAgICByZWFkX2NtZC5kbWEpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAotYmVfZ2V0X3JlZ19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyBpbnQgYmVfZ2V0X3JlZ19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTMyIGxvZ19zaXplID0gMDsKQEAgLTI3MSw3ICsyNzAsNyBAQAogCWlmIChiZV9waHlzZm4oYWRhcHRlcikpIHsKIAkJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKQogCQkJbG9nX3NpemUgPSBsYW5jZXJfY21kX2dldF9maWxlX2xlbihhZGFwdGVyLAotCQkJCQlMQU5DRVJfRldfRFVNUF9GSUxFKTsKKwkJCQkJCQkgICBMQU5DRVJfRldfRFVNUF9GSUxFKTsKIAkJZWxzZQogCQkJYmVfY21kX2dldF9yZWdfbGVuKGFkYXB0ZXIsICZsb2dfc2l6ZSk7CiAJfQpAQCAtMjg3LDcgKzI4Niw3IEBACiAJCW1lbXNldChidWYsIDAsIHJlZ3MtPmxlbik7CiAJCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKIAkJCWxhbmNlcl9jbWRfcmVhZF9maWxlKGFkYXB0ZXIsIExBTkNFUl9GV19EVU1QX0ZJTEUsCi0JCQkJCXJlZ3MtPmxlbiwgYnVmKTsKKwkJCQkJICAgICByZWdzLT5sZW4sIGJ1Zik7CiAJCWVsc2UKIAkJCWJlX2NtZF9nZXRfcmVncyhhZGFwdGVyLCByZWdzLT5sZW4sIGJ1Zik7CiAJfQpAQCAtMzM3LDkgKzMzNiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1iZV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQorc3RhdGljIHZvaWQgYmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGJlX3J4X29iaiAqcnhvOwpAQCAtMzkwLDkgKzM4OCw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotYmVfZ2V0X3N0YXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsCi0JCXVpbnQ4X3QgKmRhdGEpCitzdGF0aWMgdm9pZCBiZV9nZXRfc3RhdF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IHN0cmluZ3NldCwKKwkJCQl1aW50OF90ICpkYXRhKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgaSwgajsKQEAgLTY0MiwxNiArNjM5LDE1IEBACiAJYWRhcHRlci0+cnhfZmMgPSBlY21kLT5yeF9wYXVzZTsKIAogCXN0YXR1cyA9IGJlX2NtZF9zZXRfZmxvd19jb250cm9sKGFkYXB0ZXIsCi0JCQkJCWFkYXB0ZXItPnR4X2ZjLCBhZGFwdGVyLT5yeF9mYyk7CisJCQkJCSBhZGFwdGVyLT50eF9mYywgYWRhcHRlci0+cnhfZmMpOwogCWlmIChzdGF0dXMpCiAJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJQYXVzZSBwYXJhbSBzZXQgZmFpbGVkLlxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50Ci1iZV9zZXRfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCSAgICAgICBlbnVtIGV0aHRvb2xfcGh5c19pZF9zdGF0ZSBzdGF0ZSkKK3N0YXRpYyBpbnQgYmVfc2V0X3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUgc3RhdGUpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC03MDgsOCArNzA0LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZAotYmVfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCitzdGF0aWMgdm9pZCBiZV9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTcyMyw4ICs3MTgsNyBAQAogCW1lbXNldCgmd29sLT5zb3Bhc3MsIDAsIHNpemVvZih3b2wtPnNvcGFzcykpOwogfQogCi1zdGF0aWMgaW50Ci1iZV9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3N0YXRpYyBpbnQgYmVfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC03NDQsOCArNzM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotYmVfdGVzdF9kZHJfZG1hKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBiZV90ZXN0X2Rkcl9kbWEoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgYmVfZG1hX21lbSBkZHJkbWFfY21kOwpAQCAtNzYxLDcgKzc1NCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXJldCA9IGJlX2NtZF9kZHJfZG1hX3Rlc3QoYWRhcHRlciwgcGF0dGVybltpXSwKLQkJCQkJNDA5NiwgJmRkcmRtYV9jbWQpOworCQkJCQkgIDQwOTYsICZkZHJkbWFfY21kKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnI7CiAJfQpAQCAtNzczLDIwICs3NjYsMTcgQEAKIH0KIAogc3RhdGljIHU2NCBiZV9sb29wYmFja190ZXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCBsb29wYmFja190eXBlLAotCQkJCXU2NCAqc3RhdHVzKQorCQkJICAgIHU2NCAqc3RhdHVzKQogewotCWJlX2NtZF9zZXRfbG9vcGJhY2soYWRhcHRlciwgYWRhcHRlci0+aGJhX3BvcnRfbnVtLAotCQkJCWxvb3BiYWNrX3R5cGUsIDEpOworCWJlX2NtZF9zZXRfbG9vcGJhY2soYWRhcHRlciwgYWRhcHRlci0+aGJhX3BvcnRfbnVtLCBsb29wYmFja190eXBlLCAxKTsKIAkqc3RhdHVzID0gYmVfY21kX2xvb3BiYWNrX3Rlc3QoYWRhcHRlciwgYWRhcHRlci0+aGJhX3BvcnRfbnVtLAotCQkJCWxvb3BiYWNrX3R5cGUsIDE1MDAsCi0JCQkJMiwgMHhhYmMpOwotCWJlX2NtZF9zZXRfbG9vcGJhY2soYWRhcHRlciwgYWRhcHRlci0+aGJhX3BvcnRfbnVtLAotCQkJCUJFX05PX0xPT1BCQUNLLCAxKTsKKwkJCQkgICAgICAgbG9vcGJhY2tfdHlwZSwgMTUwMCwgMiwgMHhhYmMpOworCWJlX2NtZF9zZXRfbG9vcGJhY2soYWRhcHRlciwgYWRhcHRlci0+aGJhX3BvcnRfbnVtLCBCRV9OT19MT09QQkFDSywgMSk7CiAJcmV0dXJuICpzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkCi1iZV9zZWxmX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfdGVzdCAqdGVzdCwgdTY0ICpkYXRhKQorc3RhdGljIHZvaWQgYmVfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3Rlc3QgKnRlc3QsCisJCQkgdTY0ICpkYXRhKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgc3RhdHVzOwpAQCAtODAxLDEyICs3OTEsMTAgQEAKIAltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHU2NCkgKiBFVEhUT09MX1RFU1RTX05VTSk7CiAKIAlpZiAodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7Ci0JCWlmIChiZV9sb29wYmFja190ZXN0KGFkYXB0ZXIsIEJFX01BQ19MT09QQkFDSywKLQkJCQkgICAgICZkYXRhWzBdKSAhPSAwKQorCQlpZiAoYmVfbG9vcGJhY2tfdGVzdChhZGFwdGVyLCBCRV9NQUNfTE9PUEJBQ0ssICZkYXRhWzBdKSAhPSAwKQogCQkJdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCi0JCWlmIChiZV9sb29wYmFja190ZXN0KGFkYXB0ZXIsIEJFX1BIWV9MT09QQkFDSywKLQkJCQkgICAgICZkYXRhWzFdKSAhPSAwKQorCQlpZiAoYmVfbG9vcGJhY2tfdGVzdChhZGFwdGVyLCBCRV9QSFlfTE9PUEJBQ0ssICZkYXRhWzFdKSAhPSAwKQogCQkJdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCWlmICh0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCKSB7CkBAIC04MzIsMTYgKzgyMCwxNCBAQAogCX0KIH0KIAotc3RhdGljIGludAotYmVfZG9fZmxhc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfZmxhc2ggKmVmbCkKK3N0YXRpYyBpbnQgYmVfZG9fZmxhc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfZmxhc2ggKmVmbCkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlyZXR1cm4gYmVfbG9hZF9mdyhhZGFwdGVyLCBlZmwtPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1iZV9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGludCBiZV9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtODUxLDE4ICs4MzcsMTcgQEAKIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKIAkJaWYgKGJlX3BoeXNmbihhZGFwdGVyKSkKIAkJCXJldHVybiBsYW5jZXJfY21kX2dldF9maWxlX2xlbihhZGFwdGVyLAotCQkJCQlMQU5DRVJfVlBEX1BGX0ZJTEUpOworCQkJCQkJICAgICAgIExBTkNFUl9WUERfUEZfRklMRSk7CiAJCWVsc2UKIAkJCXJldHVybiBsYW5jZXJfY21kX2dldF9maWxlX2xlbihhZGFwdGVyLAotCQkJCQlMQU5DRVJfVlBEX1ZGX0ZJTEUpOworCQkJCQkJICAgICAgIExBTkNFUl9WUERfVkZfRklMRSk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIEJFX1JFQURfU0VFUFJPTV9MRU47CiAJfQogfQogCi1zdGF0aWMgaW50Ci1iZV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKLQkJCXVpbnQ4X3QgKmRhdGEpCitzdGF0aWMgaW50IGJlX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1aW50OF90ICpkYXRhKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYmVfZG1hX21lbSBlZXByb21fY21kOwpAQCAtODc1LDEwICs4NjAsMTAgQEAKIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKIAkJaWYgKGJlX3BoeXNmbihhZGFwdGVyKSkKIAkJCXJldHVybiBsYW5jZXJfY21kX3JlYWRfZmlsZShhZGFwdGVyLCBMQU5DRVJfVlBEX1BGX0ZJTEUsCi0JCQkJCWVlcHJvbS0+bGVuLCBkYXRhKTsKKwkJCQkJCSAgICBlZXByb20tPmxlbiwgZGF0YSk7CiAJCWVsc2UKIAkJCXJldHVybiBsYW5jZXJfY21kX3JlYWRfZmlsZShhZGFwdGVyLCBMQU5DRVJfVlBEX1ZGX0ZJTEUsCi0JCQkJCWVlcHJvbS0+bGVuLCBkYXRhKTsKKwkJCQkJCSAgICBlZXByb20tPmxlbiwgZGF0YSk7CiAJfQogCiAJZWVwcm9tLT5tYWdpYyA9IEJFX1ZFTkRPUl9JRCB8IChhZGFwdGVyLT5wZGV2LT5kZXZpY2U8PDE2KTsKQEAgLTkzMywyNyArOTE4LDI3IEBACiAKIAlzd2l0Y2ggKGZsb3dfdHlwZSkgewogCWNhc2UgVENQX1Y0X0ZMT1c6Ci0JCWlmIChhZGFwdGVyLT5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX0lQVjQpCisJCWlmIChhZGFwdGVyLT5yc3NfaW5mby5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX0lQVjQpCiAJCQlkYXRhIHw9IFJYSF9JUF9EU1QgfCBSWEhfSVBfU1JDOwotCQlpZiAoYWRhcHRlci0+cnNzX2ZsYWdzICYgUlNTX0VOQUJMRV9UQ1BfSVBWNCkKKwkJaWYgKGFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncyAmIFJTU19FTkFCTEVfVENQX0lQVjQpCiAJCQlkYXRhIHw9IFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKIAkJYnJlYWs7CiAJY2FzZSBVRFBfVjRfRkxPVzoKLQkJaWYgKGFkYXB0ZXItPnJzc19mbGFncyAmIFJTU19FTkFCTEVfSVBWNCkKKwkJaWYgKGFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncyAmIFJTU19FTkFCTEVfSVBWNCkKIAkJCWRhdGEgfD0gUlhIX0lQX0RTVCB8IFJYSF9JUF9TUkM7Ci0JCWlmIChhZGFwdGVyLT5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX1VEUF9JUFY0KQorCQlpZiAoYWRhcHRlci0+cnNzX2luZm8ucnNzX2ZsYWdzICYgUlNTX0VOQUJMRV9VRFBfSVBWNCkKIAkJCWRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOwogCQlicmVhazsKIAljYXNlIFRDUF9WNl9GTE9XOgotCQlpZiAoYWRhcHRlci0+cnNzX2ZsYWdzICYgUlNTX0VOQUJMRV9JUFY2KQorCQlpZiAoYWRhcHRlci0+cnNzX2luZm8ucnNzX2ZsYWdzICYgUlNTX0VOQUJMRV9JUFY2KQogCQkJZGF0YSB8PSBSWEhfSVBfRFNUIHwgUlhIX0lQX1NSQzsKLQkJaWYgKGFkYXB0ZXItPnJzc19mbGFncyAmIFJTU19FTkFCTEVfVENQX0lQVjYpCisJCWlmIChhZGFwdGVyLT5yc3NfaW5mby5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX1RDUF9JUFY2KQogCQkJZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CiAJCWJyZWFrOwogCWNhc2UgVURQX1Y2X0ZMT1c6Ci0JCWlmIChhZGFwdGVyLT5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX0lQVjYpCisJCWlmIChhZGFwdGVyLT5yc3NfaW5mby5yc3NfZmxhZ3MgJiBSU1NfRU5BQkxFX0lQVjYpCiAJCQlkYXRhIHw9IFJYSF9JUF9EU1QgfCBSWEhfSVBfU1JDOwotCQlpZiAoYWRhcHRlci0+cnNzX2ZsYWdzICYgUlNTX0VOQUJMRV9VRFBfSVBWNikKKwkJaWYgKGFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncyAmIFJTU19FTkFCTEVfVURQX0lQVjYpCiAJCQlkYXRhIHw9IFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKIAkJYnJlYWs7CiAJfQpAQCAtOTYyLDcgKzk0Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYmVfZ2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCi0JCSAgICAgIHUzMiAqcnVsZV9sb2NzKQorCQkJdTMyICpydWxlX2xvY3MpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC05OTIsNyArOTc3LDcgQEAKIAlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CiAJaW50IHN0YXR1cyA9IDAsIGksIGo7CiAJdTggcnNzdGFibGVbMTI4XTsKLQl1MzIgcnNzX2ZsYWdzID0gYWRhcHRlci0+cnNzX2ZsYWdzOworCXUzMiByc3NfZmxhZ3MgPSBhZGFwdGVyLT5yc3NfaW5mby5yc3NfZmxhZ3M7CiAKIAlpZiAoY21kLT5kYXRhICE9IEwzX1JTU19GTEFHUyAmJgogCSAgICBjbWQtPmRhdGEgIT0gKEwzX1JTU19GTEFHUyB8IEw0X1JTU19GTEFHUykpCkBAIC0xMDM5LDcgKzEwMjQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAocnNzX2ZsYWdzID09IGFkYXB0ZXItPnJzc19mbGFncykKKwlpZiAocnNzX2ZsYWdzID09IGFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncykKIAkJcmV0dXJuIHN0YXR1czsKIAogCWlmIChiZV9tdWx0aV9yeHEoYWRhcHRlcikpIHsKQEAgLTEwNTEsOSArMTAzNiwxMSBAQAogCQkJfQogCQl9CiAJfQotCXN0YXR1cyA9IGJlX2NtZF9yc3NfY29uZmlnKGFkYXB0ZXIsIHJzc3RhYmxlLCByc3NfZmxhZ3MsIDEyOCk7CisKKwlzdGF0dXMgPSBiZV9jbWRfcnNzX2NvbmZpZyhhZGFwdGVyLCBhZGFwdGVyLT5yc3NfaW5mby5yc3N0YWJsZSwKKwkJCQkgICByc3NfZmxhZ3MsIDEyOCwgYWRhcHRlci0+cnNzX2luZm8ucnNzX2hrZXkpOwogCWlmICghc3RhdHVzKQotCQlhZGFwdGVyLT5yc3NfZmxhZ3MgPSByc3NfZmxhZ3M7CisJCWFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncyA9IHJzc19mbGFnczsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTAzLDYgKzEwOTAsNjkgQEAKIAlyZXR1cm4gYmVfdXBkYXRlX3F1ZXVlcyhhZGFwdGVyKTsKIH0KIAorc3RhdGljIHUzMiBiZV9nZXRfcnhmaF9pbmRpcl9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIFJTU19JTkRJUl9UQUJMRV9MRU47Cit9CisKK3N0YXRpYyB1MzIgYmVfZ2V0X3J4Zmhfa2V5X3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gUlNTX0hBU0hfS0VZX0xFTjsKK30KKworc3RhdGljIGludCBiZV9nZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgKmluZGlyLCB1OCAqaGtleSkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGk7CisJc3RydWN0IHJzc19pbmZvICpyc3MgPSAmYWRhcHRlci0+cnNzX2luZm87CisKKwlpZiAoaW5kaXIpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJTU19JTkRJUl9UQUJMRV9MRU47IGkrKykKKwkJCWluZGlyW2ldID0gcnNzLT5yc3NfcXVldWVbaV07CisJfQorCisJaWYgKGhrZXkpCisJCW1lbWNweShoa2V5LCByc3MtPnJzc19oa2V5LCBSU1NfSEFTSF9LRVlfTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlX3NldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHUzMiAqaW5kaXIsCisJCSAgICAgICBjb25zdCB1OCAqaGtleSkKK3sKKwlpbnQgcmMgPSAwLCBpLCBqOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1OCByc3N0YWJsZVtSU1NfSU5ESVJfVEFCTEVfTEVOXTsKKworCWlmIChpbmRpcikgeworCQlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CisJCWZvciAoaSA9IDA7IGkgPCBSU1NfSU5ESVJfVEFCTEVfTEVOOyBpKyspIHsKKwkJCWogPSBpbmRpcltpXTsKKwkJCXJ4byA9ICZhZGFwdGVyLT5yeF9vYmpbal07CisJCQlyc3N0YWJsZVtpXSA9IHJ4by0+cnNzX2lkOworCQkJYWRhcHRlci0+cnNzX2luZm8ucnNzX3F1ZXVlW2ldID0gajsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShyc3N0YWJsZSwgYWRhcHRlci0+cnNzX2luZm8ucnNzdGFibGUsCisJCSAgICAgICBSU1NfSU5ESVJfVEFCTEVfTEVOKTsKKwl9CisKKwlpZiAoIWhrZXkpCisJCWhrZXkgPSAgYWRhcHRlci0+cnNzX2luZm8ucnNzX2hrZXk7CisKKwlyYyA9IGJlX2NtZF9yc3NfY29uZmlnKGFkYXB0ZXIsIHJzc3RhYmxlLAorCQkJYWRhcHRlci0+cnNzX2luZm8ucnNzX2ZsYWdzLAorCQkJUlNTX0lORElSX1RBQkxFX0xFTiwgaGtleSk7CisJaWYgKHJjKSB7CisJCWFkYXB0ZXItPnJzc19pbmZvLnJzc19mbGFncyA9IFJTU19FTkFCTEVfTk9ORTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1lbWNweShhZGFwdGVyLT5yc3NfaW5mby5yc3NfaGtleSwgaGtleSwgUlNTX0hBU0hfS0VZX0xFTik7CisJbWVtY3B5KGFkYXB0ZXItPnJzc19pbmZvLnJzc3RhYmxlLCByc3N0YWJsZSwKKwkgICAgICAgUlNTX0lORElSX1RBQkxFX0xFTik7CisJcmV0dXJuIDA7Cit9CisKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzID0gYmVfZ2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyA9IGJlX2dldF9kcnZpbmZvLApAQCAtMTEyOSw2ICsxMTc5LDEwIEBACiAJLnNlbGZfdGVzdCA9IGJlX3NlbGZfdGVzdCwKIAkuZ2V0X3J4bmZjID0gYmVfZ2V0X3J4bmZjLAogCS5zZXRfcnhuZmMgPSBiZV9zZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUgPSBiZV9nZXRfcnhmaF9pbmRpcl9zaXplLAorCS5nZXRfcnhmaF9rZXlfc2l6ZSA9IGJlX2dldF9yeGZoX2tleV9zaXplLAorCS5nZXRfcnhmaCA9IGJlX2dldF9yeGZoLAorCS5zZXRfcnhmaCA9IGJlX3NldF9yeGZoLAogCS5nZXRfY2hhbm5lbHMgPSBiZV9nZXRfY2hhbm5lbHMsCiAJLnNldF9jaGFubmVscyA9IGJlX3NldF9jaGFubmVscwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ody5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKaW5kZXggM2JkMTk4NS4uODg0MGM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKQEAgLTE4OCwxMCArMTg4LDE0IEBACiAjZGVmaW5lIE9QVFlQRV9GQ09FX0ZXX0FDVElWRQkJMTAKICNkZWZpbmUgT1BUWVBFX0ZDT0VfRldfQkFDS1VQCQkxMQogI2RlZmluZSBPUFRZUEVfTkNTSV9GVwkJCTEzCisjZGVmaW5lIE9QVFlQRV9SRURCT09UX0RJUgkJMTgKKyNkZWZpbmUgT1BUWVBFX1JFREJPT1RfQ09ORklHCQkxOQorI2RlZmluZSBPUFRZUEVfU0hfUEhZX0ZXCQkyMQorI2RlZmluZSBPUFRZUEVfRkxBU0hJU01fSlVNUFZFQ1RPUgkyMgorI2RlZmluZSBPUFRZUEVfVUZJX0RJUgkJCTIzCiAjZGVmaW5lIE9QVFlQRV9QSFlfRlcJCQk5OQogI2RlZmluZSBUTl84MDIyCQkJCTEzCiAKLSNkZWZpbmUgSUxMRUdBTF9JT0NUTF9SRVEJCTIKICNkZWZpbmUgRkxBU0hST01fT1BFUl9QSFlfRkxBU0gJCTkKICNkZWZpbmUgRkxBU0hST01fT1BFUl9QSFlfU0FWRQkJMTAKICNkZWZpbmUgRkxBU0hST01fT1BFUl9GTEFTSAkJMQpAQCAtMjUwLDYgKzI1NCw5IEBACiAjZGVmaW5lIElNQUdFX0ZJUk1XQVJFX0JBQ0tVUF9GQ29FCTE3OAogI2RlZmluZSBJTUFHRV9GSVJNV0FSRV9CQUNLVVBfQ09NUF9GQ29FIDE3OQogI2RlZmluZSBJTUFHRV9GSVJNV0FSRV9QSFkJCTE5MgorI2RlZmluZSBJTUFHRV9SRURCT09UX0RJUgkJMjA4CisjZGVmaW5lIElNQUdFX1JFREJPT1RfQ09ORklHCQkyMDkKKyNkZWZpbmUgSU1BR0VfVUZJX0RJUgkJCTIxMAogI2RlZmluZSBJTUFHRV9CT09UX0NPREUJCQkyMjQKIAogLyoqKioqKioqKioqKiogUnggUGFja2V0IFR5cGUgRW5jb2RpbmcgKioqKioqKioqKioqKiovCkBAIC01MzQsNyArNTQxLDggQEAKIAl1MzIgaW1hZ2Vfc2l6ZTsKIAl1MzIgY2tzdW07CiAJdTMyIGVudHJ5X3BvaW50OwotCXUzMiByc3ZkMDsKKwl1MTYgb3B0eXBlOworCXUxNiByc3ZkMDsKIAl1MzIgcnN2ZDE7CiAJdTggdmVyX2RhdGFbMzJdOwogfSBfX3BhY2tlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCmluZGV4IGRjMTliYzUuLjY4MjJiM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYmVfcXVldWVfYWxsb2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxLAotCQl1MTYgbGVuLCB1MTYgZW50cnlfc2l6ZSkKKwkJCSAgdTE2IGxlbiwgdTE2IGVudHJ5X3NpemUpCiB7CiAJc3RydWN0IGJlX2RtYV9tZW0gKm1lbSA9ICZxLT5kbWFfbWVtOwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl1MzIgcmVnLCBlbmFibGVkOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIFBDSUNGR19NRU1CQVJfQ1RSTF9JTlRfQ1RSTF9PRkZTRVQsCi0JCQkJJnJlZyk7CisJCQkgICAgICAmcmVnKTsKIAllbmFibGVkID0gcmVnICYgTUVNQkFSX0NUUkxfSU5UX0NUUkxfSE9TVElOVFJfTUFTSzsKIAogCWlmICghZW5hYmxlZCAmJiBlbmFibGUpCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJcmV0dXJuOwogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJUENJQ0ZHX01FTUJBUl9DVFJMX0lOVF9DVFJMX09GRlNFVCwgcmVnKTsKKwkJCSAgICAgICBQQ0lDRkdfTUVNQkFSX0NUUkxfSU5UX0NUUkxfT0ZGU0VULCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBiZV9pbnRyX3NldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCkBAIC0yMDYsMTIgKzIwNiwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBiZV9lcV9ub3RpZnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBxaWQsCi0JCWJvb2wgYXJtLCBib29sIGNsZWFyX2ludCwgdTE2IG51bV9wb3BwZWQpCisJCQkgYm9vbCBhcm0sIGJvb2wgY2xlYXJfaW50LCB1MTYgbnVtX3BvcHBlZCkKIHsKIAl1MzIgdmFsID0gMDsKIAl2YWwgfD0gcWlkICYgREJfRVFfUklOR19JRF9NQVNLOwotCXZhbCB8PSAoKHFpZCAmIERCX0VRX1JJTkdfSURfRVhUX01BU0spIDw8Ci0JCQlEQl9FUV9SSU5HX0lEX0VYVF9NQVNLX1NISUZUKTsKKwl2YWwgfD0gKChxaWQgJiBEQl9FUV9SSU5HX0lEX0VYVF9NQVNLKSA8PCBEQl9FUV9SSU5HX0lEX0VYVF9NQVNLX1NISUZUKTsKIAogCWlmIChhZGFwdGVyLT5lZWhfZXJyb3IpCiAJCXJldHVybjsKQEAgLTQ3Nyw3ICs0NzYsNyBAQAogCWRydnMtPnJ4X2Ryb3BzX25vX3RwcmVfZGVzY3IgPSByeGZfc3RhdHMtPnJ4X2Ryb3BzX25vX3RwcmVfZGVzY3I7CiAJZHJ2cy0+cnhfZHJvcHNfdG9vX21hbnlfZnJhZ3MgPSByeGZfc3RhdHMtPnJ4X2Ryb3BzX3Rvb19tYW55X2ZyYWdzOwogCWFkYXB0ZXItPmRydl9zdGF0cy5ldGhfcmVkX2Ryb3BzID0gcG1lbV9zdHMtPmV0aF9yZWRfZHJvcHM7Ci0JaWYgKGJlX3JvY2Vfc3VwcG9ydGVkKGFkYXB0ZXIpKSAgeworCWlmIChiZV9yb2NlX3N1cHBvcnRlZChhZGFwdGVyKSkgewogCQlkcnZzLT5yeF9yb2NlX2J5dGVzX2xzZCA9IHBvcnRfc3RhdHMtPnJvY2VfYnl0ZXNfcmVjZWl2ZWRfbHNkOwogCQlkcnZzLT5yeF9yb2NlX2J5dGVzX21zZCA9IHBvcnRfc3RhdHMtPnJvY2VfYnl0ZXNfcmVjZWl2ZWRfbXNkOwogCQlkcnZzLT5yeF9yb2NlX2ZyYW1lcyA9IHBvcnRfc3RhdHMtPnJvY2VfZnJhbWVzX3JlY2VpdmVkOwpAQCAtNDkxLDggKzQ5MCw3IEBACiB7CiAKIAlzdHJ1Y3QgYmVfZHJ2X3N0YXRzICpkcnZzID0gJmFkYXB0ZXItPmRydl9zdGF0czsKLQlzdHJ1Y3QgbGFuY2VyX3Bwb3J0X3N0YXRzICpwcG9ydF9zdGF0cyA9Ci0JCQkJCXBwb3J0X3N0YXRzX2Zyb21fY21kKGFkYXB0ZXIpOworCXN0cnVjdCBsYW5jZXJfcHBvcnRfc3RhdHMgKnBwb3J0X3N0YXRzID0gcHBvcnRfc3RhdHNfZnJvbV9jbWQoYWRhcHRlcik7CiAKIAliZV9kd3NfbGVfdG9fY3B1KHBwb3J0X3N0YXRzLCBzaXplb2YoKnBwb3J0X3N0YXRzKSk7CiAJZHJ2cy0+cnhfcGF1c2VfZnJhbWVzID0gcHBvcnRfc3RhdHMtPnJ4X3BhdXNlX2ZyYW1lc19sbzsKQEAgLTUzOSw4ICs1MzcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwb3B1bGF0ZV9lcnhfc3RhdHMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlzdHJ1Y3QgYmVfcnhfb2JqICpyeG8sCi0JCQl1MzIgZXJ4X3N0YXQpCisJCQkgICAgICAgc3RydWN0IGJlX3J4X29iaiAqcnhvLCB1MzIgZXJ4X3N0YXQpCiB7CiAJaWYgKCFCRXhfY2hpcChhZGFwdGVyKSkKIAkJcnhfc3RhdHMocnhvKS0+cnhfZHJvcHNfbm9fZnJhZ3MgPSBlcnhfc3RhdDsKQEAgLTU3OSw3ICs1NzYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpiZV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQorCQkJCQkJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGJlX2Rydl9zdGF0cyAqZHJ2cyA9ICZhZGFwdGVyLT5kcnZfc3RhdHM7CkBAIC02NjAsNyArNjU3LDggQEAKIH0KIAogc3RhdGljIHZvaWQgYmVfdHhfc3RhdHNfdXBkYXRlKHN0cnVjdCBiZV90eF9vYmogKnR4bywKLQkJCXUzMiB3cmJfY250LCB1MzIgY29waWVkLCB1MzIgZ3NvX3NlZ3MsIGJvb2wgc3RvcHBlZCkKKwkJCSAgICAgICB1MzIgd3JiX2NudCwgdTMyIGNvcGllZCwgdTMyIGdzb19zZWdzLAorCQkJICAgICAgIGJvb2wgc3RvcHBlZCkKIHsKIAlzdHJ1Y3QgYmVfdHhfc3RhdHMgKnN0YXRzID0gdHhfc3RhdHModHhvKTsKIApAQCAtNjc2LDcgKzY3NCw3IEBACiAKIC8qIERldGVybWluZSBudW1iZXIgb2YgV1JCIGVudHJpZXMgbmVlZGVkIHRvIHhtaXQgZGF0YSBpbiBhbiBza2IgKi8KIHN0YXRpYyB1MzIgd3JiX2NudF9mb3Jfc2tiKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJCQlib29sICpkdW1teSkKKwkJCSAgIGJvb2wgKmR1bW15KQogewogCWludCBjbnQgPSAoc2tiLT5sZW4gPiBza2ItPmRhdGFfbGVuKTsKIApAQCAtNzA0LDcgKzcwMiw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdTE2IGJlX2dldF90eF92bGFuX3RhZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTggdmxhbl9wcmlvOwogCXUxNiB2bGFuX3RhZzsKQEAgLTczMyw3ICs3MzEsOCBAQAogfQogCiBzdGF0aWMgdm9pZCB3cmJfZmlsbF9oZHIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9ldGhfaGRyX3dyYiAqaGRyLAotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgd3JiX2NudCwgdTMyIGxlbiwgYm9vbCBza2lwX2h3X3ZsYW4pCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHdyYl9jbnQsIHUzMiBsZW4sCisJCQkgYm9vbCBza2lwX2h3X3ZsYW4pCiB7CiAJdTE2IHZsYW5fdGFnLCBwcm90bzsKIApAQCAtNzc0LDcgKzc3Myw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHVubWFwX3R4X2ZyYWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgYmVfZXRoX3dyYiAqd3JiLAotCQlib29sIHVubWFwX3NpbmdsZSkKKwkJCSAgYm9vbCB1bm1hcF9zaW5nbGUpCiB7CiAJZG1hX2FkZHJfdCBkbWE7CiAKQEAgLTc5MSw4ICs3OTAsOCBAQAogfQogCiBzdGF0aWMgaW50IG1ha2VfdHhfd3JicyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSwKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHdyYl9jbnQsIGJvb2wgZHVtbXlfd3JiLAotCQlib29sIHNraXBfaHdfdmxhbikKKwkJCXN0cnVjdCBza19idWZmICpza2IsIHUzMiB3cmJfY250LCBib29sIGR1bW15X3dyYiwKKwkJCWJvb2wgc2tpcF9od192bGFuKQogewogCWRtYV9hZGRyX3QgYnVzYWRkcjsKIAlpbnQgaSwgY29waWVkID0gMDsKQEAgLTgyMSw4ICs4MjAsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9Ci0JCQkmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJY29uc3Qgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCQlidXNhZGRyID0gc2tiX2ZyYWdfZG1hX21hcChkZXYsIGZyYWcsIDAsCiAJCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOwogCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBidXNhZGRyKSkKQEAgLTkyNyw4ICs5MjUsNyBAQAogCXJldHVybiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikgfHwgYWRhcHRlci0+cHZpZCB8fCBhZGFwdGVyLT5xbnFfdmlkOwogfQogCi1zdGF0aWMgaW50IGJlX2lwdjZfdHhfc3RhbGxfY2hrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGJlX2lwdjZfdHhfc3RhbGxfY2hrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBCRTNfY2hpcChhZGFwdGVyKSAmJiBiZV9pcHY2X2V4dGhkcl9jaGVjayhza2IpOwogfQpAQCAtOTU5LDcgKzk1Niw3IEBACiAJICovCiAJaWYgKGJlX3B2aWRfdGFnZ2luZ19lbmFibGVkKGFkYXB0ZXIpICYmCiAJICAgIHZlaC0+aF92bGFuX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkKLQkJCSpza2lwX2h3X3ZsYW4gPSB0cnVlOworCQkqc2tpcF9od192bGFuID0gdHJ1ZTsKIAogCS8qIEhXIGhhcyBhIGJ1ZyB3aGVyZWluIGl0IHdpbGwgY2FsY3VsYXRlIENTVU0gZm9yIFZMQU4KIAkgKiBwa3RzIGV2ZW4gdGhvdWdoIGl0IGlzIGRpc2FibGVkLgpAQCAtMTA3NywxNiArMTA3NCwxNSBAQAogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpZiAobmV3X210dSA8IEJFX01JTl9NVFUgfHwKLQkJCW5ld19tdHUgPiAoQkVfTUFYX0pVTUJPX0ZSQU1FX1NJWkUgLQotCQkJCQkoRVRIX0hMRU4gKyBFVEhfRkNTX0xFTikpKSB7CisJICAgIG5ld19tdHUgPiAoQkVfTUFYX0pVTUJPX0ZSQU1FX1NJWkUgLSAoRVRIX0hMRU4gKyBFVEhfRkNTX0xFTikpKSB7CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkiTVRVIG11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQgYnl0ZXNcbiIsCi0JCQlCRV9NSU5fTVRVLAotCQkJKEJFX01BWF9KVU1CT19GUkFNRV9TSVpFIC0gKEVUSF9ITEVOICsgRVRIX0ZDU19MRU4pKSk7CisJCQkgIk1UVSBtdXN0IGJlIGJldHdlZW4gJWQgYW5kICVkIGJ5dGVzXG4iLAorCQkJIEJFX01JTl9NVFUsCisJCQkgKEJFX01BWF9KVU1CT19GUkFNRV9TSVpFIC0gKEVUSF9ITEVOICsgRVRIX0ZDU19MRU4pKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTVRVIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBieXRlc1xuIiwKLQkJCW5ldGRldi0+bXR1LCBuZXdfbXR1KTsKKwkJIG5ldGRldi0+bXR1LCBuZXdfbXR1KTsKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDk4LDcgKzEwOTQsNyBAQAogc3RhdGljIGludCBiZV92aWRfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXUxNiB2aWRzW0JFX05VTV9WTEFOU19TVVBQT1JURURdOwotCXUxNiBudW0gPSAwLCBpOworCXUxNiBudW0gPSAwLCBpID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCS8qIE5vIG5lZWQgdG8gZnVydGhlciBjb25maWd1cmUgdmlkcyBpZiBpbiBwcm9taXNjdW91cyBtb2RlICovCkBAIC0xMTA5LDE2ICsxMTA1LDE0IEBACiAJCWdvdG8gc2V0X3ZsYW5fcHJvbWlzYzsKIAogCS8qIENvbnN0cnVjdCBWTEFOIFRhYmxlIHRvIGdpdmUgdG8gSFcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9OX1ZJRDsgaSsrKQotCQlpZiAoYWRhcHRlci0+dmxhbl90YWdbaV0pCi0JCQl2aWRzW251bSsrXSA9IGNwdV90b19sZTE2KGkpOworCWZvcl9lYWNoX3NldF9iaXQoaSwgYWRhcHRlci0+dmlkcywgVkxBTl9OX1ZJRCkKKwkJdmlkc1tudW0rK10gPSBjcHVfdG9fbGUxNihpKTsKIAotCXN0YXR1cyA9IGJlX2NtZF92bGFuX2NvbmZpZyhhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJICAgIHZpZHMsIG51bSwgMCk7Ci0KKwlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCB2aWRzLCBudW0pOwogCWlmIChzdGF0dXMpIHsKIAkJLyogU2V0IHRvIFZMQU4gcHJvbWlzYyBtb2RlIGFzIHNldHRpbmcgVkxBTiBmaWx0ZXIgZmFpbGVkICovCi0JCWlmIChzdGF0dXMgPT0gTUNDX0FERExfU1RTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMpCisJCWlmIChhZGRsX3N0YXR1cyhzdGF0dXMpID09CisJCQkJTUNDX0FERExfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMpCiAJCQlnb3RvIHNldF92bGFuX3Byb21pc2M7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJTZXR0aW5nIEhXIFZMQU4gZmlsdGVyaW5nIGZhaWxlZC5cbiIpOwpAQCAtMTE2MCwxNiArMTE1NCwxNiBAQAogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiB2aWQgPT0gMCkKIAkJcmV0dXJuIHN0YXR1czsKIAotCWlmIChhZGFwdGVyLT52bGFuX3RhZ1t2aWRdKQorCWlmICh0ZXN0X2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JYWRhcHRlci0+dmxhbl90YWdbdmlkXSA9IDE7CisJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwogCWFkYXB0ZXItPnZsYW5zX2FkZGVkKys7CiAKIAlzdGF0dXMgPSBiZV92aWRfY29uZmlnKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpIHsKIAkJYWRhcHRlci0+dmxhbnNfYWRkZWQtLTsKLQkJYWRhcHRlci0+dmxhbl90YWdbdmlkXSA9IDA7CisJCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwogCX0KIAogCXJldHVybiBzdGF0dXM7CkBAIC0xMTg0LDEyICsxMTc4LDEyIEBACiAJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpICYmIHZpZCA9PSAwKQogCQlnb3RvIHJldDsKIAotCWFkYXB0ZXItPnZsYW5fdGFnW3ZpZF0gPSAwOworCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwogCXN0YXR1cyA9IGJlX3ZpZF9jb25maWcoYWRhcHRlcik7CiAJaWYgKCFzdGF0dXMpCiAJCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07CiAJZWxzZQotCQlhZGFwdGVyLT52bGFuX3RhZ1t2aWRdID0gMTsKKwkJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwogcmV0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTk3LDcgKzExOTEsNyBAQAogc3RhdGljIHZvaWQgYmVfY2xlYXJfcHJvbWlzYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlhZGFwdGVyLT5wcm9taXNjdW91cyA9IGZhbHNlOwotCWFkYXB0ZXItPmZsYWdzICY9IH5CRV9GTEFHU19WTEFOX1BST01JU0M7CisJYWRhcHRlci0+ZmxhZ3MgJj0gfihCRV9GTEFHU19WTEFOX1BST01JU0MgfCBCRV9GTEFHU19NQ0FTVF9QUk9NSVNDKTsKIAogCWJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgSUZGX1BST01JU0MsIE9GRik7CiB9CkBAIC0xMjIyLDEwICsxMjE2LDggQEAKIAogCS8qIEVuYWJsZSBtdWx0aWNhc3QgcHJvbWlzYyBpZiBudW0gY29uZmlndXJlZCBleGNlZWRzIHdoYXQgd2Ugc3VwcG9ydCAqLwogCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8Ci0JICAgIG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gYmVfbWF4X21jKGFkYXB0ZXIpKSB7Ci0JCWJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgSUZGX0FMTE1VTFRJLCBPTik7Ci0JCWdvdG8gZG9uZTsKLQl9CisJICAgIG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gYmVfbWF4X21jKGFkYXB0ZXIpKQorCQlnb3RvIHNldF9tY2FzdF9wcm9taXNjOwogCiAJaWYgKG5ldGRldl91Y19jb3VudChuZXRkZXYpICE9IGFkYXB0ZXItPnVjX21hY3MpIHsKIAkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKQEAgLTEyNTEsMTMgKzEyNDMsMjIgQEAKIAl9CiAKIAlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIElGRl9NVUxUSUNBU1QsIE9OKTsKLQotCS8qIFNldCB0byBNQ0FTVCBwcm9taXNjIG1vZGUgaWYgc2V0dGluZyBNVUxUSUNBU1QgYWRkcmVzcyBmYWlscyAqLwotCWlmIChzdGF0dXMpIHsKLQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkV4aGF1c3RlZCBtdWx0aWNhc3QgSFcgZmlsdGVycy5cbiIpOwotCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiRGlzYWJsaW5nIEhXIG11bHRpY2FzdCBmaWx0ZXJpbmcuXG4iKTsKLQkJYmVfY21kX3J4X2ZpbHRlcihhZGFwdGVyLCBJRkZfQUxMTVVMVEksIE9OKTsKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19NQ0FTVF9QUk9NSVNDKQorCQkJYWRhcHRlci0+ZmxhZ3MgJj0gfkJFX0ZMQUdTX01DQVNUX1BST01JU0M7CisJCWdvdG8gZG9uZTsKIAl9CisKK3NldF9tY2FzdF9wcm9taXNjOgorCWlmIChhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX01DQVNUX1BST01JU0MpCisJCXJldHVybjsKKworCS8qIFNldCB0byBNQ0FTVCBwcm9taXNjIG1vZGUgaWYgc2V0dGluZyBNVUxUSUNBU1QgYWRkcmVzcyBmYWlscworCSAqIG9yIGlmIG51bSBjb25maWd1cmVkIGV4Y2VlZHMgd2hhdCB3ZSBzdXBwb3J0CisJICovCisJc3RhdHVzID0gYmVfY21kX3J4X2ZpbHRlcihhZGFwdGVyLCBJRkZfQUxMTVVMVEksIE9OKTsKKwlpZiAoIXN0YXR1cykKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gQkVfRkxBR1NfTUNBU1RfUFJPTUlTQzsKIGRvbmU6CiAJcmV0dXJuOwogfQpAQCAtMTI4Nyw3ICsxMjg4LDcgQEAKIAogCWlmIChzdGF0dXMpCiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIk1BQyAlcE0gc2V0IG9uIFZGICVkIEZhaWxlZFxuIiwKLQkJCQltYWMsIHZmKTsKKwkJCW1hYywgdmYpOwogCWVsc2UKIAkJbWVtY3B5KHZmX2NmZy0+bWFjX2FkZHIsIG1hYywgRVRIX0FMRU4pOwogCkBAIC0xMjk1LDcgKzEyOTYsNyBAQAogfQogCiBzdGF0aWMgaW50IGJlX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAotCQkJc3RydWN0IGlmbGFfdmZfaW5mbyAqdmkpCisJCQkgICAgc3RydWN0IGlmbGFfdmZfaW5mbyAqdmkpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZyA9ICZhZGFwdGVyLT52Zl9jZmdbdmZdOwpAQCAtMTMwNyw3ICsxMzA4LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2aS0+dmYgPSB2ZjsKLQl2aS0+dHhfcmF0ZSA9IHZmX2NmZy0+dHhfcmF0ZTsKKwl2aS0+bWF4X3R4X3JhdGUgPSB2Zl9jZmctPnR4X3JhdGU7CisJdmktPm1pbl90eF9yYXRlID0gMDsKIAl2aS0+dmxhbiA9IHZmX2NmZy0+dmxhbl90YWcgJiBWTEFOX1ZJRF9NQVNLOwogCXZpLT5xb3MgPSB2Zl9jZmctPnZsYW5fdGFnID4+IFZMQU5fUFJJT19TSElGVDsKIAltZW1jcHkoJnZpLT5tYWMsIHZmX2NmZy0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKQEAgLTEzMTYsOCArMTMxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCWludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcykKK3N0YXRpYyBpbnQgYmVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW3ZmXTsKQEAgLTEzNDgsMTEgKzEzNDksMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IGJlX3NldF92Zl90eF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQlpbnQgdmYsIGludCByYXRlKQorc3RhdGljIGludCBiZV9zZXRfdmZfdHhfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCisJCQkgICAgIGludCBtaW5fdHhfcmF0ZSwgaW50IG1heF90eF9yYXRlKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCWludCBwZXJjZW50X3JhdGUsIHN0YXR1cyA9IDA7CisJdTE2IGxpbmtfc3BlZWQgPSAwOworCXU4IGxpbmtfc3RhdHVzOwogCiAJaWYgKCFzcmlvdl9lbmFibGVkKGFkYXB0ZXIpKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTM2MCwxOCArMTM2NCw1MCBAQAogCWlmICh2ZiA+PSBhZGFwdGVyLT5udW1fdmZzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChyYXRlIDwgMTAwIHx8IHJhdGUgPiAxMDAwMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkidHggcmF0ZSBtdXN0IGJlIGJldHdlZW4gMTAwIGFuZCAxMDAwMCBNYnBzXG4iKTsKKwlpZiAobWluX3R4X3JhdGUpCiAJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFtYXhfdHhfcmF0ZSkKKwkJZ290byBjb25maWdfcW9zOworCisJc3RhdHVzID0gYmVfY21kX2xpbmtfc3RhdHVzX3F1ZXJ5KGFkYXB0ZXIsICZsaW5rX3NwZWVkLAorCQkJCQkgICZsaW5rX3N0YXR1cywgMCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnI7CisKKwlpZiAoIWxpbmtfc3RhdHVzKSB7CisJCWRldl9lcnIoZGV2LCAiVFgtcmF0ZSBzZXR0aW5nIG5vdCBhbGxvd2VkIHdoZW4gbGluayBpcyBkb3duXG4iKTsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGVycjsKIAl9CiAKLQlzdGF0dXMgPSBiZV9jbWRfY29uZmlnX3FvcyhhZGFwdGVyLCByYXRlIC8gMTAsIHZmICsgMSk7CisJaWYgKG1heF90eF9yYXRlIDwgMTAwIHx8IG1heF90eF9yYXRlID4gbGlua19zcGVlZCkgeworCQlkZXZfZXJyKGRldiwgIlRYLXJhdGUgbXVzdCBiZSBiZXR3ZWVuIDEwMCBhbmQgJWQgTWJwc1xuIiwKKwkJCWxpbmtfc3BlZWQpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBPbiBTa3loYXdrIHRoZSBRT1Mgc2V0dGluZyBtdXN0IGJlIGRvbmUgb25seSBhcyBhICUgdmFsdWUgKi8KKwlwZXJjZW50X3JhdGUgPSBsaW5rX3NwZWVkIC8gMTAwOworCWlmIChza3loYXdrX2NoaXAoYWRhcHRlcikgJiYgKG1heF90eF9yYXRlICUgcGVyY2VudF9yYXRlKSkgeworCQlkZXZfZXJyKGRldiwgIlRYLXJhdGUgbXVzdCBiZSBhIG11bHRpcGxlIG9mICVkIE1icHNcbiIsCisJCQlwZXJjZW50X3JhdGUpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKK2NvbmZpZ19xb3M6CisJc3RhdHVzID0gYmVfY21kX2NvbmZpZ19xb3MoYWRhcHRlciwgbWF4X3R4X3JhdGUsIGxpbmtfc3BlZWQsIHZmICsgMSk7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJ0eCByYXRlICVkIG9uIFZGICVkIGZhaWxlZFxuIiwgcmF0ZSwgdmYpOwotCWVsc2UKLQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS50eF9yYXRlID0gcmF0ZTsKKwkJZ290byBlcnI7CisKKwlhZGFwdGVyLT52Zl9jZmdbdmZdLnR4X3JhdGUgPSBtYXhfdHhfcmF0ZTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldl9lcnIoZGV2LCAiVFgtcmF0ZSBzZXR0aW5nIG9mICVkTWJwcyBvbiBWRiVkIGZhaWxlZFxuIiwKKwkJbWF4X3R4X3JhdGUsIHZmKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogc3RhdGljIGludCBiZV9zZXRfdmZfbGlua19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCkBAIC0xNDY5LDcgKzE1MDUsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBiZV9yeF9zdGF0c191cGRhdGUoc3RydWN0IGJlX3J4X29iaiAqcnhvLAotCQlzdHJ1Y3QgYmVfcnhfY29tcGxfaW5mbyAqcnhjcCkKKwkJCSAgICAgICBzdHJ1Y3QgYmVfcnhfY29tcGxfaW5mbyAqcnhjcCkKIHsKIAlzdHJ1Y3QgYmVfcnhfc3RhdHMgKnN0YXRzID0gcnhfc3RhdHMocnhvKTsKIApAQCAtMTU2Niw3ICsxNjAyLDggQEAKIAkJc2tiX2ZyYWdfc2V0X3BhZ2Uoc2tiLCAwLCBwYWdlX2luZm8tPnBhZ2UpOwogCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ID0KIAkJCQkJcGFnZV9pbmZvLT5wYWdlX29mZnNldCArIGhkcl9sZW47Ci0JCXNrYl9mcmFnX3NpemVfc2V0KCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLCBjdXJyX2ZyYWdfbGVuIC0gaGRyX2xlbik7CisJCXNrYl9mcmFnX3NpemVfc2V0KCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLAorCQkJCSAgY3Vycl9mcmFnX2xlbiAtIGhkcl9sZW4pOwogCQlza2ItPmRhdGFfbGVuID0gY3Vycl9mcmFnX2xlbiAtIGhkcl9sZW47CiAJCXNrYi0+dHJ1ZXNpemUgKz0gcnhfZnJhZ19zaXplOwogCQlza2ItPnRhaWwgKz0gaGRyX2xlbjsKQEAgLTE3MjUsOCArMTc2Miw4IEBACiAJaWYgKHJ4Y3AtPnZsYW5mKSB7CiAJCXJ4Y3AtPnFucSA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsX3YxLCBxbnEsCiAJCQkJCSAgY29tcGwpOwotCQlyeGNwLT52bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsX3YxLCB2bGFuX3RhZywKLQkJCQkJICAgICAgIGNvbXBsKTsKKwkJcnhjcC0+dmxhbl90YWcgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbF92MSwKKwkJCQkJICAgICAgIHZsYW5fdGFnLCBjb21wbCk7CiAJfQogCXJ4Y3AtPnBvcnQgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbF92MSwgcG9ydCwgY29tcGwpOwogCXJ4Y3AtPnR1bm5lbGVkID0KQEAgLTE3NTcsOCArMTc5NCw4IEBACiAJaWYgKHJ4Y3AtPnZsYW5mKSB7CiAJCXJ4Y3AtPnFucSA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsX3YwLCBxbnEsCiAJCQkJCSAgY29tcGwpOwotCQlyeGNwLT52bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsX3YwLCB2bGFuX3RhZywKLQkJCQkJICAgICAgIGNvbXBsKTsKKwkJcnhjcC0+dmxhbl90YWcgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbF92MCwKKwkJCQkJICAgICAgIHZsYW5fdGFnLCBjb21wbCk7CiAJfQogCXJ4Y3AtPnBvcnQgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbF92MCwgcG9ydCwgY29tcGwpOwogCXJ4Y3AtPmlwX2ZyYWcgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbF92MCwKQEAgLTE3OTksNyArMTgzNiw3IEBACiAJCQlyeGNwLT52bGFuX3RhZyA9IHN3YWIxNihyeGNwLT52bGFuX3RhZyk7CiAKIAkJaWYgKGFkYXB0ZXItPnB2aWQgPT0gKHJ4Y3AtPnZsYW5fdGFnICYgVkxBTl9WSURfTUFTSykgJiYKLQkJICAgICFhZGFwdGVyLT52bGFuX3RhZ1tyeGNwLT52bGFuX3RhZ10pCisJCSAgICAhdGVzdF9iaXQocnhjcC0+dmxhbl90YWcsIGFkYXB0ZXItPnZpZHMpKQogCQkJcnhjcC0+dmxhbmYgPSAwOwogCX0KIApAQCAtMTkxNSw3ICsxOTUyLDcgQEAKIH0KIAogc3RhdGljIHUxNiBiZV90eF9jb21wbF9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQlzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sIHUxNiBsYXN0X2luZGV4KQorCQkJICAgICAgIHN0cnVjdCBiZV90eF9vYmogKnR4bywgdTE2IGxhc3RfaW5kZXgpCiB7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7CiAJc3RydWN0IGJlX2V0aF93cmIgKndyYjsKQEAgLTIxMjIsNyArMjE1OSw3IEBACiAKIAkJZXEgPSAmZXFvLT5xOwogCQlyYyA9IGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIGVxLCBFVk5UX1FfTEVOLAotCQkJCQlzaXplb2Yoc3RydWN0IGJlX2VxX2VudHJ5KSk7CisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYmVfZXFfZW50cnkpKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCkBAIC0yMTU1LDcgKzIxOTIsNyBAQAogCiAJY3EgPSAmYWRhcHRlci0+bWNjX29iai5jcTsKIAlpZiAoYmVfcXVldWVfYWxsb2MoYWRhcHRlciwgY3EsIE1DQ19DUV9MRU4sCi0JCQlzaXplb2Yoc3RydWN0IGJlX21jY19jb21wbCkpKQorCQkJICAgc2l6ZW9mKHN0cnVjdCBiZV9tY2NfY29tcGwpKSkKIAkJZ290byBlcnI7CiAKIAkvKiBVc2UgdGhlIGRlZmF1bHQgRVEgZm9yIE1DQyBjb21wbGV0aW9ucyAqLwpAQCAtMjI3NSw3ICsyMzEyLDcgQEAKIAkJcnhvLT5hZGFwdGVyID0gYWRhcHRlcjsKIAkJY3EgPSAmcnhvLT5jcTsKIAkJcmMgPSBiZV9xdWV1ZV9hbGxvYyhhZGFwdGVyLCBjcSwgUlhfQ1FfTEVOLAotCQkJCXNpemVvZihzdHJ1Y3QgYmVfZXRoX3J4X2NvbXBsKSk7CisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYmVfZXRoX3J4X2NvbXBsKSk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApAQCAtMjMzOSw3ICsyMzc2LDcgQEAKIH0KIAogc3RhdGljIGludCBiZV9wcm9jZXNzX3J4KHN0cnVjdCBiZV9yeF9vYmogKnJ4bywgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAotCQkJaW50IGJ1ZGdldCwgaW50IHBvbGxpbmcpCisJCQkgaW50IGJ1ZGdldCwgaW50IHBvbGxpbmcpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSByeG8tPmFkYXB0ZXI7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnJ4X2NxID0gJnJ4by0+Y3E7CkBAIC0yMzY1LDcgKzI0MDIsNyBAQAogCQkgKiBwcm9taXNjdW91cyBtb2RlIG9uIHNvbWUgc2tld3MKIAkJICovCiAJCWlmICh1bmxpa2VseShyeGNwLT5wb3J0ICE9IGFkYXB0ZXItPnBvcnRfbnVtICYmCi0JCQkJIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKSkgeworCQkJICAgICAhbGFuY2VyX2NoaXAoYWRhcHRlcikpKSB7CiAJCQliZV9yeF9jb21wbF9kaXNjYXJkKHJ4bywgcnhjcCk7CiAJCQlnb3RvIGxvb3BfY29udGludWU7CiAJCX0KQEAgLTI0MDUsOCArMjQ0Miw5IEBACiAJCWlmICghdHhjcCkKIAkJCWJyZWFrOwogCQludW1fd3JicyArPSBiZV90eF9jb21wbF9wcm9jZXNzKGFkYXB0ZXIsIHR4bywKLQkJCQlBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF90eF9jb21wbCwKLQkJCQkJd3JiX2luZGV4LCB0eGNwKSk7CisJCQkJCQlBTUFQX0dFVF9CSVRTKHN0cnVjdAorCQkJCQkJCSAgICAgIGFtYXBfZXRoX3R4X2NvbXBsLAorCQkJCQkJCSAgICAgIHdyYl9pbmRleCwgdHhjcCkpOwogCX0KIAogCWlmICh3b3JrX2RvbmUpIHsKQEAgLTI0MTYsNyArMjQ1NCw3IEBACiAJCS8qIEFzIFR4IHdyYnMgaGF2ZSBiZWVuIGZyZWVkIHVwLCB3YWtlIHVwIG5ldGRldiBxdWV1ZQogCQkgKiBpZiBpdCB3YXMgc3RvcHBlZCBkdWUgdG8gbGFjayBvZiB0eCB3cmJzLiAgKi8KIAkJaWYgKF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChhZGFwdGVyLT5uZXRkZXYsIGlkeCkgJiYKLQkJCWF0b21pY19yZWFkKCZ0eG8tPnEudXNlZCkgPCB0eG8tPnEubGVuIC8gMikgeworCQkgICAgYXRvbWljX3JlYWQoJnR4by0+cS51c2VkKSA8IHR4by0+cS5sZW4gLyAyKSB7CiAJCQluZXRpZl93YWtlX3N1YnF1ZXVlKGFkYXB0ZXItPm5ldGRldiwgaWR4KTsKIAkJfQogCkBAIC0yNTEwLDkgKzI1NDgsOSBAQAogCQlzbGlwb3J0X3N0YXR1cyA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUKTsKIAkJaWYgKHNsaXBvcnRfc3RhdHVzICYgU0xJUE9SVF9TVEFUVVNfRVJSX01BU0spIHsKIAkJCXNsaXBvcnRfZXJyMSA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKLQkJCQkJU0xJUE9SVF9FUlJPUjFfT0ZGU0VUKTsKKwkJCQkJCVNMSVBPUlRfRVJST1IxX09GRlNFVCk7CiAJCQlzbGlwb3J0X2VycjIgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArCi0JCQkJCVNMSVBPUlRfRVJST1IyX09GRlNFVCk7CisJCQkJCQlTTElQT1JUX0VSUk9SMl9PRkZTRVQpOwogCQkJYWRhcHRlci0+aHdfZXJyb3IgPSB0cnVlOwogCQkJLyogRG8gbm90IGxvZyBlcnJvciBtZXNzYWdlcyBpZiBpdHMgYSBGVyByZXNldCAqLwogCQkJaWYgKHNsaXBvcnRfZXJyMSA9PSBTTElQT1JUX0VSUk9SX0ZXX1JFU0VUMSAmJgpAQCAtMjUzMSwxMyArMjU2OSwxMyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCi0JCQkJUENJQ0ZHX1VFX1NUQVRVU19MT1csICZ1ZV9sbyk7CisJCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19MT1csICZ1ZV9sbyk7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfSElHSCwgJnVlX2hpKTsKKwkJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0hJR0gsICZ1ZV9oaSk7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfTE9XX01BU0ssICZ1ZV9sb19tYXNrKTsKKwkJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLLCAmdWVfbG9fbWFzayk7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX2hpX21hc2spOworCQkJCSAgICAgIFBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX2hpX21hc2spOwogCiAJCXVlX2xvID0gKHVlX2xvICYgfnVlX2xvX21hc2spOwogCQl1ZV9oaSA9ICh1ZV9oaSAmIH51ZV9oaV9tYXNrKTsKQEAgLTI2MjQsNyArMjY2Miw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJlX21zaXhfdmVjX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQlzdHJ1Y3QgYmVfZXFfb2JqICplcW8pCisJCQkJICBzdHJ1Y3QgYmVfZXFfb2JqICplcW8pCiB7CiAJcmV0dXJuIGFkYXB0ZXItPm1zaXhfZW50cmllc1tlcW8tPm1zaXhfaWR4XS52ZWN0b3I7CiB9CkBAIC0yNjQ4LDcgKzI2ODYsNyBAQAogCWZvciAoaS0tLCBlcW8gPSAmYWRhcHRlci0+ZXFfb2JqW2ldOyBpID49IDA7IGktLSwgZXFvLS0pCiAJCWZyZWVfaXJxKGJlX21zaXhfdmVjX2dldChhZGFwdGVyLCBlcW8pLCBlcW8pOwogCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJNU0lYIFJlcXVlc3QgSVJRIGZhaWxlZCAtIGVyciAlZFxuIiwKLQkJc3RhdHVzKTsKKwkJIHN0YXR1cyk7CiAJYmVfbXNpeF9kaXNhYmxlKGFkYXB0ZXIpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yNzc0LDcgKzI4MTIsOCBAQAogewogCXN0cnVjdCBiZV9yeF9vYmogKnJ4bzsKIAlpbnQgcmMsIGksIGo7Ci0JdTggcnNzdGFibGVbMTI4XTsKKwl1OCByc3NfaGtleVtSU1NfSEFTSF9LRVlfTEVOXTsKKwlzdHJ1Y3QgcnNzX2luZm8gKnJzcyA9ICZhZGFwdGVyLT5yc3NfaW5mbzsKIAogCWZvcl9hbGxfcnhfcXVldWVzKGFkYXB0ZXIsIHJ4bywgaSkgewogCQlyYyA9IGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsICZyeG8tPnEsIFJYX1FfTEVOLApAQCAtMjc5OSwzMSArMjgzOCwzNiBAQAogCX0KIAogCWlmIChiZV9tdWx0aV9yeHEoYWRhcHRlcikpIHsKLQkJZm9yIChqID0gMDsgaiA8IDEyODsgaiArPSBhZGFwdGVyLT5udW1fcnhfcXMgLSAxKSB7CisJCWZvciAoaiA9IDA7IGogPCBSU1NfSU5ESVJfVEFCTEVfTEVOOworCQkJaiArPSBhZGFwdGVyLT5udW1fcnhfcXMgLSAxKSB7CiAJCQlmb3JfYWxsX3Jzc19xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7Ci0JCQkJaWYgKChqICsgaSkgPj0gMTI4KQorCQkJCWlmICgoaiArIGkpID49IFJTU19JTkRJUl9UQUJMRV9MRU4pCiAJCQkJCWJyZWFrOwotCQkJCXJzc3RhYmxlW2ogKyBpXSA9IHJ4by0+cnNzX2lkOworCQkJCXJzcy0+cnNzdGFibGVbaiArIGldID0gcnhvLT5yc3NfaWQ7CisJCQkJcnNzLT5yc3NfcXVldWVbaiArIGldID0gaTsKIAkJCX0KIAkJfQotCQlhZGFwdGVyLT5yc3NfZmxhZ3MgPSBSU1NfRU5BQkxFX1RDUF9JUFY0IHwgUlNTX0VOQUJMRV9JUFY0IHwKLQkJCQkJUlNTX0VOQUJMRV9UQ1BfSVBWNiB8IFJTU19FTkFCTEVfSVBWNjsKKwkJcnNzLT5yc3NfZmxhZ3MgPSBSU1NfRU5BQkxFX1RDUF9JUFY0IHwgUlNTX0VOQUJMRV9JUFY0IHwKKwkJCVJTU19FTkFCTEVfVENQX0lQVjYgfCBSU1NfRU5BQkxFX0lQVjY7CiAKIAkJaWYgKCFCRXhfY2hpcChhZGFwdGVyKSkKLQkJCWFkYXB0ZXItPnJzc19mbGFncyB8PSBSU1NfRU5BQkxFX1VEUF9JUFY0IHwKLQkJCQkJCVJTU19FTkFCTEVfVURQX0lQVjY7CisJCQlyc3MtPnJzc19mbGFncyB8PSBSU1NfRU5BQkxFX1VEUF9JUFY0IHwKKwkJCQlSU1NfRU5BQkxFX1VEUF9JUFY2OwogCX0gZWxzZSB7CiAJCS8qIERpc2FibGUgUlNTLCBpZiBvbmx5IGRlZmF1bHQgUlggUSBpcyBjcmVhdGVkICovCi0JCWFkYXB0ZXItPnJzc19mbGFncyA9IFJTU19FTkFCTEVfTk9ORTsKKwkJcnNzLT5yc3NfZmxhZ3MgPSBSU1NfRU5BQkxFX05PTkU7CiAJfQogCi0JcmMgPSBiZV9jbWRfcnNzX2NvbmZpZyhhZGFwdGVyLCByc3N0YWJsZSwgYWRhcHRlci0+cnNzX2ZsYWdzLAotCQkJICAgICAgIDEyOCk7CisJZ2V0X3JhbmRvbV9ieXRlcyhyc3NfaGtleSwgUlNTX0hBU0hfS0VZX0xFTik7CisJcmMgPSBiZV9jbWRfcnNzX2NvbmZpZyhhZGFwdGVyLCByc3MtPnJzc3RhYmxlLCByc3MtPnJzc19mbGFncywKKwkJCSAgICAgICAxMjgsIHJzc19oa2V5KTsKIAlpZiAocmMpIHsKLQkJYWRhcHRlci0+cnNzX2ZsYWdzID0gUlNTX0VOQUJMRV9OT05FOworCQlyc3MtPnJzc19mbGFncyA9IFJTU19FTkFCTEVfTk9ORTsKIAkJcmV0dXJuIHJjOwogCX0KIAorCW1lbWNweShyc3MtPnJzc19oa2V5LCByc3NfaGtleSwgUlNTX0hBU0hfS0VZX0xFTik7CisKIAkvKiBGaXJzdCB0aW1lIHBvc3RpbmcgKi8KIAlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpCiAJCWJlX3Bvc3RfcnhfZnJhZ3MocnhvLCBHRlBfS0VSTkVMKTsKQEAgLTI4OTYsNyArMjk0MCw4IEBACiAKIAlpZiAoZW5hYmxlKSB7CiAJCXN0YXR1cyA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCVBDSUNGR19QTV9DT05UUk9MX09GRlNFVCwgUENJQ0ZHX1BNX0NPTlRST0xfTUFTSyk7CisJCQkJCQlQQ0lDRkdfUE1fQ09OVFJPTF9PRkZTRVQsCisJCQkJCQlQQ0lDRkdfUE1fQ09OVFJPTF9NQVNLKTsKIAkJaWYgKHN0YXR1cykgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJDb3VsZCBub3QgZW5hYmxlIFdha2Utb24tbGFuXG4iKTsKQEAgLTI5MDUsNyArMjk1MCw4IEBACiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCXN0YXR1cyA9IGJlX2NtZF9lbmFibGVfbWFnaWNfd29sKGFkYXB0ZXIsCi0JCQkJYWRhcHRlci0+bmV0ZGV2LT5kZXZfYWRkciwgJmNtZCk7CisJCQkJCQkgYWRhcHRlci0+bmV0ZGV2LT5kZXZfYWRkciwKKwkJCQkJCSAmY21kKTsKIAkJcGNpX2VuYWJsZV93YWtlKGFkYXB0ZXItPnBkZXYsIFBDSV9EM2hvdCwgMSk7CiAJCXBjaV9lbmFibGVfd2FrZShhZGFwdGVyLT5wZGV2LCBQQ0lfRDNjb2xkLCAxKTsKIAl9IGVsc2UgewpAQCAtMjk0NCw3ICsyOTkwLDggQEAKIAogCQlpZiAoc3RhdHVzKQogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIk1hYyBhZGRyZXNzIGFzc2lnbm1lbnQgZmFpbGVkIGZvciBWRiAlZFxuIiwgdmYpOworCQkJCSJNYWMgYWRkcmVzcyBhc3NpZ25tZW50IGZhaWxlZCBmb3IgVkYgJWRcbiIsCisJCQkJdmYpOwogCQllbHNlCiAJCQltZW1jcHkodmZfY2ZnLT5tYWNfYWRkciwgbWFjLCBFVEhfQUxFTik7CiAKQEAgLTMwODYsOSArMzEzMywxMSBAQAogCiAJCS8qIElmIGEgRlcgcHJvZmlsZSBleGlzdHMsIHRoZW4gY2FwX2ZsYWdzIGFyZSB1cGRhdGVkICovCiAJCWVuX2ZsYWdzID0gY2FwX2ZsYWdzICYgKEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwKLQkJCSAgIEJFX0lGX0ZMQUdTX0JST0FEQ0FTVCB8IEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCk7Ci0JCXN0YXR1cyA9IGJlX2NtZF9pZl9jcmVhdGUoYWRhcHRlciwgY2FwX2ZsYWdzLCBlbl9mbGFncywKLQkJCQkJICAmdmZfY2ZnLT5pZl9oYW5kbGUsIHZmICsgMSk7CisJCQkJCUJFX0lGX0ZMQUdTX0JST0FEQ0FTVCB8CisJCQkJCUJFX0lGX0ZMQUdTX01VTFRJQ0FTVCk7CisJCXN0YXR1cyA9CisJCSAgICBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGNhcF9mbGFncywgZW5fZmxhZ3MsCisJCQkJICAgICAmdmZfY2ZnLT5pZl9oYW5kbGUsIHZmICsgMSk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIGVycjsKIAl9CkBAIC0zMTE5LDcgKzMxNjgsNiBAQAogCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZzsKIAlpbnQgc3RhdHVzLCBvbGRfdmZzLCB2ZjsKIAl1MzIgcHJpdmlsZWdlczsKLQl1MTYgbG5rX3NwZWVkOwogCiAJb2xkX3ZmcyA9IHBjaV9udW1fdmYoYWRhcHRlci0+cGRldik7CiAJaWYgKG9sZF92ZnMpIHsKQEAgLTMxNzUsMTYgKzMyMjMsOSBAQAogCQkJCQkgdmYpOwogCQl9CiAKLQkJLyogQkUzIEZXLCBieSBkZWZhdWx0LCBjYXBzIFZGIFRYLXJhdGUgdG8gMTAwbWJwcy4KLQkJICogQWxsb3cgZnVsbCBhdmFpbGFibGUgYmFuZHdpZHRoCi0JCSAqLwotCQlpZiAoQkUzX2NoaXAoYWRhcHRlcikgJiYgIW9sZF92ZnMpCi0JCQliZV9jbWRfY29uZmlnX3FvcyhhZGFwdGVyLCAxMDAwLCB2ZiArIDEpOwotCi0JCXN0YXR1cyA9IGJlX2NtZF9saW5rX3N0YXR1c19xdWVyeShhZGFwdGVyLCAmbG5rX3NwZWVkLAotCQkJCQkJICBOVUxMLCB2ZiArIDEpOwotCQlpZiAoIXN0YXR1cykKLQkJCXZmX2NmZy0+dHhfcmF0ZSA9IGxua19zcGVlZDsKKwkJLyogQWxsb3cgZnVsbCBhdmFpbGFibGUgYmFuZHdpZHRoICovCisJCWlmICghb2xkX3ZmcykKKwkJCWJlX2NtZF9jb25maWdfcW9zKGFkYXB0ZXIsIDAsIDAsIHZmICsgMSk7CiAKIAkJaWYgKCFvbGRfdmZzKSB7CiAJCQliZV9jbWRfZW5hYmxlX3ZmKGFkYXB0ZXIsIHZmICsgMSk7CkBAIC0zNTkwLDM1ICszNjMxLDcgQEAKIH0KICNlbmRpZgogCi0jZGVmaW5lIEZXX0ZJTEVfSERSX1NJR04gCSJTZXJ2ZXJFbmdpbmVzIENvcnAuICIKLXN0YXRpYyBjaGFyIGZsYXNoX2Nvb2tpZVsyXVsxNl0gPSAgICAgIHsiKioqIFNFIEZMQVMiLCAiSCBESVJFQ1RPUlkgKioqICJ9OwotCi1zdGF0aWMgYm9vbCBiZV9mbGFzaF9yZWRib290KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJY29uc3QgdTggKnAsIHUzMiBpbWdfc3RhcnQsIGludCBpbWFnZV9zaXplLAotCQkJaW50IGhkcl9zaXplKQotewotCXUzMiBjcmNfb2Zmc2V0OwotCXU4IGZsYXNoZWRfY3JjWzRdOwotCWludCBzdGF0dXM7Ci0KLQljcmNfb2Zmc2V0ID0gaGRyX3NpemUgKyBpbWdfc3RhcnQgKyBpbWFnZV9zaXplIC0gNDsKLQotCXAgKz0gY3JjX29mZnNldDsKLQotCXN0YXR1cyA9IGJlX2NtZF9nZXRfZmxhc2hfY3JjKGFkYXB0ZXIsIGZsYXNoZWRfY3JjLAotCQkJKGltYWdlX3NpemUgLSA0KSk7Ci0JaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCSJjb3VsZCBub3QgZ2V0IGNyYyBmcm9tIGZsYXNoLCBub3QgZmxhc2hpbmcgcmVkYm9vdFxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKnVwZGF0ZSByZWRib290IG9ubHkgaWYgY3JjIGRvZXMgbm90IG1hdGNoKi8KLQlpZiAoIW1lbWNtcChmbGFzaGVkX2NyYywgcCwgNCkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotfQorc3RhdGljIGNoYXIgZmxhc2hfY29va2llWzJdWzE2XSA9IHsiKioqIFNFIEZMQVMiLCAiSCBESVJFQ1RPUlkgKioqICJ9OwogCiBzdGF0aWMgYm9vbCBwaHlfZmxhc2hpbmdfcmVxdWlyZWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC0zNjQ5LDggKzM2NjIsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZsYXNoX3NlY3Rpb25faW5mbyAqZ2V0X2ZzZWNfaW5mbyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJIGludCBoZWFkZXJfc2l6ZSwKLQkJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCisJCQkJCQlpbnQgaGVhZGVyX3NpemUsCisJCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQogewogCXN0cnVjdCBmbGFzaF9zZWN0aW9uX2luZm8gKmZzZWMgPSBOVUxMOwogCWNvbnN0IHU4ICpwID0gZnctPmRhdGE7CkBAIC0zNjY1LDEyICszNjc4LDM1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgYmVfZmxhc2goc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICppbWcsCi0JCXN0cnVjdCBiZV9kbWFfbWVtICpmbGFzaF9jbWQsIGludCBvcHR5cGUsIGludCBpbWdfc2l6ZSkKK3N0YXRpYyBpbnQgYmVfY2hlY2tfZmxhc2hfY3JjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcCwKKwkJCSAgICAgIHUzMiBpbWdfb2Zmc2V0LCB1MzIgaW1nX3NpemUsIGludCBoZHJfc2l6ZSwKKwkJCSAgICAgIHUxNiBpbWdfb3B0eXBlLCBib29sICpjcmNfbWF0Y2gpCiB7Ci0JdTMyIHRvdGFsX2J5dGVzID0gMCwgZmxhc2hfb3AsIG51bV9ieXRlcyA9IDA7Ci0JaW50IHN0YXR1cyA9IDA7CisJdTMyIGNyY19vZmZzZXQ7CisJaW50IHN0YXR1czsKKwl1OCBjcmNbNF07CisKKwlzdGF0dXMgPSBiZV9jbWRfZ2V0X2ZsYXNoX2NyYyhhZGFwdGVyLCBjcmMsIGltZ19vcHR5cGUsIGltZ19zaXplIC0gNCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWNyY19vZmZzZXQgPSBoZHJfc2l6ZSArIGltZ19vZmZzZXQgKyBpbWdfc2l6ZSAtIDQ7CisKKwkvKiBTa2lwIGZsYXNoaW5nLCBpZiBjcmMgb2YgZmxhc2hlZCByZWdpb24gbWF0Y2hlcyAqLworCWlmICghbWVtY21wKGNyYywgcCArIGNyY19vZmZzZXQsIDQpKQorCQkqY3JjX21hdGNoID0gdHJ1ZTsKKwllbHNlCisJCSpjcmNfbWF0Y2ggPSBmYWxzZTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmVfZmxhc2goc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICppbWcsCisJCSAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqZmxhc2hfY21kLCBpbnQgb3B0eXBlLCBpbnQgaW1nX3NpemUpCit7CiAJc3RydWN0IGJlX2NtZF93cml0ZV9mbGFzaHJvbSAqcmVxID0gZmxhc2hfY21kLT52YTsKKwl1MzIgdG90YWxfYnl0ZXMsIGZsYXNoX29wLCBudW1fYnl0ZXM7CisJaW50IHN0YXR1czsKIAogCXRvdGFsX2J5dGVzID0gaW1nX3NpemU7CiAJd2hpbGUgKHRvdGFsX2J5dGVzKSB7CkBAIC0zNjkzLDMyICszNzI5LDI4IEBACiAJCW1lbWNweShyZXEtPmRhdGFfYnVmLCBpbWcsIG51bV9ieXRlcyk7CiAJCWltZyArPSBudW1fYnl0ZXM7CiAJCXN0YXR1cyA9IGJlX2NtZF93cml0ZV9mbGFzaHJvbShhZGFwdGVyLCBmbGFzaF9jbWQsIG9wdHlwZSwKLQkJCQkJCWZsYXNoX29wLCBudW1fYnl0ZXMpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlpZiAoc3RhdHVzID09IElMTEVHQUxfSU9DVExfUkVRICYmCi0JCQkgICAgb3B0eXBlID09IE9QVFlQRV9QSFlfRlcpCi0JCQkJYnJlYWs7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJImNtZCB0byB3cml0ZSB0byBmbGFzaCByb20gZmFpbGVkLlxuIik7CisJCQkJCSAgICAgICBmbGFzaF9vcCwgbnVtX2J5dGVzKTsKKwkJaWYgKGJhc2Vfc3RhdHVzKHN0YXR1cykgPT0gTUNDX1NUQVRVU19JTExFR0FMX1JFUVVFU1QgJiYKKwkJICAgIG9wdHlwZSA9PSBPUFRZUEVfUEhZX0ZXKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7Ci0JCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qIEZvciBCRTIsIEJFMyBhbmQgQkUzLVIgKi8KIHN0YXRpYyBpbnQgYmVfZmxhc2hfQkV4KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCi0JCQkgc3RydWN0IGJlX2RtYV9tZW0gKmZsYXNoX2NtZCwKLQkJCSBpbnQgbnVtX29mX2ltYWdlcykKLQorCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCXN0cnVjdCBiZV9kbWFfbWVtICpmbGFzaF9jbWQsIGludCBudW1fb2ZfaW1hZ2VzKQogewotCWludCBzdGF0dXMgPSAwLCBpLCBmaWxlaGRyX3NpemUgPSAwOwogCWludCBpbWdfaGRyc19zaXplID0gKG51bV9vZl9pbWFnZXMgKiBzaXplb2Yoc3RydWN0IGltYWdlX2hkcikpOwotCWNvbnN0IHU4ICpwID0gZnctPmRhdGE7Ci0JY29uc3Qgc3RydWN0IGZsYXNoX2NvbXAgKnBmbGFzaGNvbXA7Ci0JaW50IG51bV9jb21wLCByZWRib290OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJc3RydWN0IGZsYXNoX3NlY3Rpb25faW5mbyAqZnNlYyA9IE5VTEw7CisJaW50IHN0YXR1cywgaSwgZmlsZWhkcl9zaXplLCBudW1fY29tcDsKKwljb25zdCBzdHJ1Y3QgZmxhc2hfY29tcCAqcGZsYXNoY29tcDsKKwlib29sIGNyY19tYXRjaDsKKwljb25zdCB1OCAqcDsKIAogCXN0cnVjdCBmbGFzaF9jb21wIGdlbjNfZmxhc2hfdHlwZXNbXSA9IHsKIAkJeyBGTEFTSF9pU0NTSV9QUklNQVJZX0lNQUdFX1NUQVJUX2czLCBPUFRZUEVfSVNDU0lfQUNUSVZFLApAQCAtMzc3NSw4ICszODA3LDcgQEAKIAkvKiBHZXQgZmxhc2ggc2VjdGlvbiBpbmZvKi8KIAlmc2VjID0gZ2V0X2ZzZWNfaW5mbyhhZGFwdGVyLCBmaWxlaGRyX3NpemUgKyBpbWdfaGRyc19zaXplLCBmdyk7CiAJaWYgKCFmc2VjKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJJbnZhbGlkIENvb2tpZS4gVUZJIGNvcnJ1cHRlZCA/XG4iKTsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIENvb2tpZS4gRlcgaW1hZ2UgbWF5IGJlIGNvcnJ1cHRlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IG51bV9jb21wOyBpKyspIHsKQEAgLTM3OTIsMjMgKzM4MjMsMzIgQEAKIAkJCQljb250aW51ZTsKIAogCQlpZiAocGZsYXNoY29tcFtpXS5vcHR5cGUgPT0gT1BUWVBFX1JFREJPT1QpIHsKLQkJCXJlZGJvb3QgPSBiZV9mbGFzaF9yZWRib290KGFkYXB0ZXIsIGZ3LT5kYXRhLAotCQkJCXBmbGFzaGNvbXBbaV0ub2Zmc2V0LCBwZmxhc2hjb21wW2ldLnNpemUsCi0JCQkJZmlsZWhkcl9zaXplICsgaW1nX2hkcnNfc2l6ZSk7Ci0JCQlpZiAoIXJlZGJvb3QpCisJCQlzdGF0dXMgPSBiZV9jaGVja19mbGFzaF9jcmMoYWRhcHRlciwgZnctPmRhdGEsCisJCQkJCQkgICAgcGZsYXNoY29tcFtpXS5vZmZzZXQsCisJCQkJCQkgICAgcGZsYXNoY29tcFtpXS5zaXplLAorCQkJCQkJICAgIGZpbGVoZHJfc2l6ZSArCisJCQkJCQkgICAgaW1nX2hkcnNfc2l6ZSwKKwkJCQkJCSAgICBPUFRZUEVfUkVEQk9PVCwgJmNyY19tYXRjaCk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJZGV2X2VycihkZXYsCisJCQkJCSJDb3VsZCBub3QgZ2V0IENSQyBmb3IgMHgleCByZWdpb25cbiIsCisJCQkJCXBmbGFzaGNvbXBbaV0ub3B0eXBlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNyY19tYXRjaCkKIAkJCQljb250aW51ZTsKIAkJfQogCi0JCXAgPSBmdy0+ZGF0YTsKLQkJcCArPSBmaWxlaGRyX3NpemUgKyBwZmxhc2hjb21wW2ldLm9mZnNldCArIGltZ19oZHJzX3NpemU7CisJCXAgPSBmdy0+ZGF0YSArIGZpbGVoZHJfc2l6ZSArIHBmbGFzaGNvbXBbaV0ub2Zmc2V0ICsKKwkJCWltZ19oZHJzX3NpemU7CiAJCWlmIChwICsgcGZsYXNoY29tcFtpXS5zaXplID4gZnctPmRhdGEgKyBmdy0+c2l6ZSkKIAkJCXJldHVybiAtMTsKIAogCQlzdGF0dXMgPSBiZV9mbGFzaChhZGFwdGVyLCBwLCBmbGFzaF9jbWQsIHBmbGFzaGNvbXBbaV0ub3B0eXBlLAotCQkJCQlwZmxhc2hjb21wW2ldLnNpemUpOworCQkJCSAgcGZsYXNoY29tcFtpXS5zaXplKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJGbGFzaGluZyBzZWN0aW9uIHR5cGUgJWQgZmFpbGVkLlxuIiwKKwkJCWRldl9lcnIoZGV2LCAiRmxhc2hpbmcgc2VjdGlvbiB0eXBlIDB4JXggZmFpbGVkXG4iLAogCQkJCXBmbGFzaGNvbXBbaV0uaW1nX3R5cGUpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQpAQCAtMzgxNiw4MCArMzg1NiwxNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZV9mbGFzaF9za3loYXdrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAotCQlzdHJ1Y3QgYmVfZG1hX21lbSAqZmxhc2hfY21kLCBpbnQgbnVtX29mX2ltYWdlcykKK3N0YXRpYyB1MTYgYmVfZ2V0X2ltZ19vcHR5cGUoc3RydWN0IGZsYXNoX3NlY3Rpb25fZW50cnkgZnNlY19lbnRyeSkKIHsKLQlpbnQgc3RhdHVzID0gMCwgaSwgZmlsZWhkcl9zaXplID0gMDsKLQlpbnQgaW1nX29mZnNldCwgaW1nX3NpemUsIGltZ19vcHR5cGUsIHJlZGJvb3Q7CisJdTMyIGltZ190eXBlID0gbGUzMl90b19jcHUoZnNlY19lbnRyeS50eXBlKTsKKwl1MTYgaW1nX29wdHlwZSA9IGxlMTZfdG9fY3B1KGZzZWNfZW50cnkub3B0eXBlKTsKKworCWlmIChpbWdfb3B0eXBlICE9IDB4RkZGRikKKwkJcmV0dXJuIGltZ19vcHR5cGU7CisKKwlzd2l0Y2ggKGltZ190eXBlKSB7CisJY2FzZSBJTUFHRV9GSVJNV0FSRV9pU0NTSToKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9JU0NTSV9BQ1RJVkU7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfQk9PVF9DT0RFOgorCQlpbWdfb3B0eXBlID0gT1BUWVBFX1JFREJPT1Q7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfT1BUSU9OX1JPTV9JU0NTSToKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9CSU9TOworCQlicmVhazsKKwljYXNlIElNQUdFX09QVElPTl9ST01fUFhFOgorCQlpbWdfb3B0eXBlID0gT1BUWVBFX1BYRV9CSU9TOworCQlicmVhazsKKwljYXNlIElNQUdFX09QVElPTl9ST01fRkNvRToKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9GQ09FX0JJT1M7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfRklSTVdBUkVfQkFDS1VQX2lTQ1NJOgorCQlpbWdfb3B0eXBlID0gT1BUWVBFX0lTQ1NJX0JBQ0tVUDsKKwkJYnJlYWs7CisJY2FzZSBJTUFHRV9OQ1NJOgorCQlpbWdfb3B0eXBlID0gT1BUWVBFX05DU0lfRlc7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfRkxBU0hJU01fSlVNUFZFQ1RPUjoKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9GTEFTSElTTV9KVU1QVkVDVE9SOworCQlicmVhazsKKwljYXNlIElNQUdFX0ZJUk1XQVJFX1BIWToKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9TSF9QSFlfRlc7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfUkVEQk9PVF9ESVI6CisJCWltZ19vcHR5cGUgPSBPUFRZUEVfUkVEQk9PVF9ESVI7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfUkVEQk9PVF9DT05GSUc6CisJCWltZ19vcHR5cGUgPSBPUFRZUEVfUkVEQk9PVF9DT05GSUc7CisJCWJyZWFrOworCWNhc2UgSU1BR0VfVUZJX0RJUjoKKwkJaW1nX29wdHlwZSA9IE9QVFlQRV9VRklfRElSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaW1nX29wdHlwZTsKK30KKworc3RhdGljIGludCBiZV9mbGFzaF9za3loYXdrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkgICAgc3RydWN0IGJlX2RtYV9tZW0gKmZsYXNoX2NtZCwgaW50IG51bV9vZl9pbWFnZXMpCit7CiAJaW50IGltZ19oZHJzX3NpemUgPSBudW1fb2ZfaW1hZ2VzICogc2l6ZW9mKHN0cnVjdCBpbWFnZV9oZHIpOwotCWNvbnN0IHU4ICpwID0gZnctPmRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKIAlzdHJ1Y3QgZmxhc2hfc2VjdGlvbl9pbmZvICpmc2VjID0gTlVMTDsKKwl1MzIgaW1nX29mZnNldCwgaW1nX3NpemUsIGltZ190eXBlOworCWludCBzdGF0dXMsIGksIGZpbGVoZHJfc2l6ZTsKKwlib29sIGNyY19tYXRjaCwgb2xkX2Z3X2ltZzsKKwl1MTYgaW1nX29wdHlwZTsKKwljb25zdCB1OCAqcDsKIAogCWZpbGVoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmxhc2hfZmlsZV9oZHJfZzMpOwogCWZzZWMgPSBnZXRfZnNlY19pbmZvKGFkYXB0ZXIsIGZpbGVoZHJfc2l6ZSArIGltZ19oZHJzX3NpemUsIGZ3KTsKIAlpZiAoIWZzZWMpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIkludmFsaWQgQ29va2llLiBVRkkgY29ycnVwdGVkID9cbiIpOworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgQ29va2llLiBGVyBpbWFnZSBtYXkgYmUgY29ycnVwdGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZTMyX3RvX2NwdShmc2VjLT5mc2VjX2hkci5udW1faW1hZ2VzKTsgaSsrKSB7CiAJCWltZ19vZmZzZXQgPSBsZTMyX3RvX2NwdShmc2VjLT5mc2VjX2VudHJ5W2ldLm9mZnNldCk7CiAJCWltZ19zaXplICAgPSBsZTMyX3RvX2NwdShmc2VjLT5mc2VjX2VudHJ5W2ldLnBhZF9zaXplKTsKKwkJaW1nX3R5cGUgICA9IGxlMzJfdG9fY3B1KGZzZWMtPmZzZWNfZW50cnlbaV0udHlwZSk7CisJCWltZ19vcHR5cGUgPSBiZV9nZXRfaW1nX29wdHlwZShmc2VjLT5mc2VjX2VudHJ5W2ldKTsKKwkJb2xkX2Z3X2ltZyA9IGZzZWMtPmZzZWNfZW50cnlbaV0ub3B0eXBlID09IDB4RkZGRjsKIAotCQlzd2l0Y2ggKGxlMzJfdG9fY3B1KGZzZWMtPmZzZWNfZW50cnlbaV0udHlwZSkpIHsKLQkJY2FzZSBJTUFHRV9GSVJNV0FSRV9pU0NTSToKLQkJCWltZ19vcHR5cGUgPSBPUFRZUEVfSVNDU0lfQUNUSVZFOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1BR0VfQk9PVF9DT0RFOgotCQkJaW1nX29wdHlwZSA9IE9QVFlQRV9SRURCT09UOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1BR0VfT1BUSU9OX1JPTV9JU0NTSToKLQkJCWltZ19vcHR5cGUgPSBPUFRZUEVfQklPUzsKLQkJCWJyZWFrOwotCQljYXNlIElNQUdFX09QVElPTl9ST01fUFhFOgotCQkJaW1nX29wdHlwZSA9IE9QVFlQRV9QWEVfQklPUzsKLQkJCWJyZWFrOwotCQljYXNlIElNQUdFX09QVElPTl9ST01fRkNvRToKLQkJCWltZ19vcHR5cGUgPSBPUFRZUEVfRkNPRV9CSU9TOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1BR0VfRklSTVdBUkVfQkFDS1VQX2lTQ1NJOgotCQkJaW1nX29wdHlwZSA9IE9QVFlQRV9JU0NTSV9CQUNLVVA7Ci0JCQlicmVhazsKLQkJY2FzZSBJTUFHRV9OQ1NJOgotCQkJaW1nX29wdHlwZSA9IE9QVFlQRV9OQ1NJX0ZXOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CisJCWlmIChpbWdfb3B0eXBlID09IDB4RkZGRikKIAkJCWNvbnRpbnVlOworCQkvKiBEb24ndCBib3RoZXIgdmVyaWZ5aW5nIENSQyBpZiBhbiBvbGQgRlcgaW1hZ2UgaXMgYmVpbmcKKwkJICogZmxhc2hlZAorCQkgKi8KKwkJaWYgKG9sZF9md19pbWcpCisJCQlnb3RvIGZsYXNoOworCisJCXN0YXR1cyA9IGJlX2NoZWNrX2ZsYXNoX2NyYyhhZGFwdGVyLCBmdy0+ZGF0YSwgaW1nX29mZnNldCwKKwkJCQkJICAgIGltZ19zaXplLCBmaWxlaGRyX3NpemUgKworCQkJCQkgICAgaW1nX2hkcnNfc2l6ZSwgaW1nX29wdHlwZSwKKwkJCQkJICAgICZjcmNfbWF0Y2gpOworCQkvKiBUaGUgY3VycmVudCBGVyBpbWFnZSBvbiB0aGUgY2FyZCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIG5ldworCQkgKiBGTEFTSCBvcF90eXBlLiBUaGUgRlcgZG93bmxvYWQgaXMgcGFydGlhbGx5IGNvbXBsZXRlLgorCQkgKiBSZWJvb3QgdGhlIHNlcnZlciBub3cgdG8gZW5hYmxlIEZXIGltYWdlIHRvIHJlY29nbml6ZSB0aGUKKwkJICogbmV3IEZMQVNIIG9wX3R5cGUuIFRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgcHJvY2VzcywKKwkJICogZG93bmxvYWQgdGhlIHNhbWUgRlcgYWdhaW4gYWZ0ZXIgdGhlIHJlYm9vdC4KKwkJICovCisJCWlmIChiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSUxMRUdBTF9SRVFVRVNUIHx8CisJCSAgICBiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSUxMRUdBTF9GSUVMRCkgeworCQkJZGV2X2VycihkZXYsICJGbGFzaCBpbmNvbXBsZXRlLiBSZXNldCB0aGUgc2VydmVyXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiRG93bmxvYWQgRlcgaW1hZ2UgYWdhaW4gYWZ0ZXIgcmVzZXRcbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSBpZiAoc3RhdHVzKSB7CisJCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBnZXQgQ1JDIGZvciAweCV4IHJlZ2lvblxuIiwKKwkJCQlpbWdfb3B0eXBlKTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKLQkJaWYgKGltZ19vcHR5cGUgPT0gT1BUWVBFX1JFREJPT1QpIHsKLQkJCXJlZGJvb3QgPSBiZV9mbGFzaF9yZWRib290KGFkYXB0ZXIsIGZ3LT5kYXRhLAotCQkJCQlpbWdfb2Zmc2V0LCBpbWdfc2l6ZSwKLQkJCQkJZmlsZWhkcl9zaXplICsgaW1nX2hkcnNfc2l6ZSk7Ci0JCQlpZiAoIXJlZGJvb3QpCi0JCQkJY29udGludWU7Ci0JCX0KKwkJaWYgKGNyY19tYXRjaCkKKwkJCWNvbnRpbnVlOwogCi0JCXAgPSBmdy0+ZGF0YTsKLQkJcCArPSBmaWxlaGRyX3NpemUgKyBpbWdfb2Zmc2V0ICsgaW1nX2hkcnNfc2l6ZTsKK2ZsYXNoOgorCQlwID0gZnctPmRhdGEgKyBmaWxlaGRyX3NpemUgKyBpbWdfb2Zmc2V0ICsgaW1nX2hkcnNfc2l6ZTsKIAkJaWYgKHAgKyBpbWdfc2l6ZSA+IGZ3LT5kYXRhICsgZnctPnNpemUpCiAJCQlyZXR1cm4gLTE7CiAKIAkJc3RhdHVzID0gYmVfZmxhc2goYWRhcHRlciwgcCwgZmxhc2hfY21kLCBpbWdfb3B0eXBlLCBpbWdfc2l6ZSk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkiRmxhc2hpbmcgc2VjdGlvbiB0eXBlICVkIGZhaWxlZC5cbiIsCi0JCQkJZnNlYy0+ZnNlY19lbnRyeVtpXS50eXBlKTsKLQkJCXJldHVybiBzdGF0dXM7CisJCS8qIEZvciBvbGQgRlcgaW1hZ2VzIGlnbm9yZSBJTExFR0FMX0ZJRUxEIGVycm9yIG9yIGVycm9ycyBvbgorCQkgKiBVRklfRElSIHJlZ2lvbgorCQkgKi8KKwkJaWYgKG9sZF9md19pbWcgJiYKKwkJICAgIChiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSUxMRUdBTF9GSUVMRCB8fAorCQkgICAgIChpbWdfb3B0eXBlID09IE9QVFlQRV9VRklfRElSICYmCisJCSAgICAgIGJhc2Vfc3RhdHVzKHN0YXR1cykgPT0gTUNDX1NUQVRVU19GQUlMRUQpKSkgeworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RhdHVzKSB7CisJCQlkZXZfZXJyKGRldiwgIkZsYXNoaW5nIHNlY3Rpb24gdHlwZSAweCV4IGZhaWxlZFxuIiwKKwkJCQlpbWdfdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsYW5jZXJfZndfZG93bmxvYWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCiB7CiAjZGVmaW5lIExBTkNFUl9GV19ET1dOTE9BRF9DSFVOSyAgICAgICgzMiAqIDEwMjQpCiAjZGVmaW5lIExBTkNFUl9GV19ET1dOTE9BRF9MT0NBVElPTiAgICIvcHJnIgpAQCAtMzk1NSw3ICs0MDU3LDcgQEAKIAl9CiAKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBmbGFzaF9jbWQuc2l6ZSwgZmxhc2hfY21kLnZhLAotCQkJCWZsYXNoX2NtZC5kbWEpOworCQkJICBmbGFzaF9jbWQuZG1hKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJGaXJtd2FyZSBsb2FkIGVycm9yLiAiCkBAIC0zOTc2LDkgKzQwNzgsOCBAQAogCQkJZ290byBsYW5jZXJfZndfZXhpdDsKIAkJfQogCX0gZWxzZSBpZiAoY2hhbmdlX3N0YXR1cyAhPSBMQU5DRVJfTk9fUkVTRVRfTkVFREVEKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIlN5c3RlbSByZWJvb3QgcmVxdWlyZWQgZm9yIG5ldyBGVyIKLQkJCQkiIHRvIGJlIGFjdGl2ZVxuIik7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJTeXN0ZW0gcmVib290IHJlcXVpcmVkIGZvciBuZXcgRlcgdG8gYmUgYWN0aXZlXG4iKTsKIAl9CiAKIAlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiRmlybXdhcmUgZmxhc2hlZCBzdWNjZXNzZnVsbHlcbiIpOwpAQCAtNDA0Miw3ICs0MTQzLDcgQEAKIAkJCXN3aXRjaCAodWZpX3R5cGUpIHsKIAkJCWNhc2UgVUZJX1RZUEU0OgogCQkJCXN0YXR1cyA9IGJlX2ZsYXNoX3NreWhhd2soYWRhcHRlciwgZncsCi0JCQkJCQkJJmZsYXNoX2NtZCwgbnVtX2ltZ3MpOworCQkJCQkJCSAgJmZsYXNoX2NtZCwgbnVtX2ltZ3MpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBVRklfVFlQRTNSOgogCQkJCXN0YXR1cyA9IGJlX2ZsYXNoX0JFeChhZGFwdGVyLCBmdywgJmZsYXNoX2NtZCwKQEAgLTQxMTIsOCArNDIxMyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBiZV9uZG9fYnJpZGdlX3NldGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IG5sbXNnaGRyICpubGgpCitzdGF0aWMgaW50IGJlX25kb19icmlkZ2Vfc2V0bGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5sYXR0ciAqYXR0ciwgKmJyX3NwZWM7CkBAIC00MTU1LDggKzQyNTUsNyBAQAogfQogCiBzdGF0aWMgaW50IGJlX25kb19icmlkZ2VfZ2V0bGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICB1MzIgZmlsdGVyX21hc2spCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmaWx0ZXJfbWFzaykKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHN0YXR1cyA9IDA7CkBAIC00MjU0LDcgKzQzNTMsNyBAQAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGJlX3ZsYW5fcmVtX3ZpZCwKIAkubmRvX3NldF92Zl9tYWMJCT0gYmVfc2V0X3ZmX21hYywKIAkubmRvX3NldF92Zl92bGFuCT0gYmVfc2V0X3ZmX3ZsYW4sCi0JLm5kb19zZXRfdmZfdHhfcmF0ZQk9IGJlX3NldF92Zl90eF9yYXRlLAorCS5uZG9fc2V0X3ZmX3JhdGUJPSBiZV9zZXRfdmZfdHhfcmF0ZSwKIAkubmRvX2dldF92Zl9jb25maWcJPSBiZV9nZXRfdmZfY29uZmlnLAogCS5uZG9fc2V0X3ZmX2xpbmtfc3RhdGUgID0gYmVfc2V0X3ZmX2xpbmtfc3RhdGUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTQzMDEsNyArNDQwMCw3IEBACiAKIAluZXRkZXYtPm5ldGRldl9vcHMgPSAmYmVfbmV0ZGV2X29wczsKIAotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZiZV9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZiZV9ldGh0b29sX29wczsKIH0KIAogc3RhdGljIHZvaWQgYmVfdW5tYXBfcGNpX2JhcnMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00ODcwLDcgKzQ5NjksNyBAQAogfQogCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBiZV9lZWhfZXJyX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCXBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCisJCQkJCSAgICBwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAgYWRhcHRlci0+bmV0ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKaW5kZXggOGI3MGNhNy4uZjM2NThiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCkBAIC03NjksMTEgKzc2OSw2IEBACiAJcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5LCBpZnIsIGNtZCk7CiB9CiAKLXN0YXRpYyBpbnQgZXRob2NfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCiBzdGF0aWMgdm9pZCBldGhvY19kb19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRob2MgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtOTk1LDcgKzk5MCw2IEBACiAJLm5kb19vcGVuID0gZXRob2Nfb3BlbiwKIAkubmRvX3N0b3AgPSBldGhvY19zdG9wLAogCS5uZG9fZG9faW9jdGwgPSBldGhvY19pb2N0bCwKLQkubmRvX3NldF9jb25maWcgPSBldGhvY19jb25maWcsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBldGhvY19zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zZXRfcnhfbW9kZSA9IGV0aG9jX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUgPSBldGhvY19jaGFuZ2VfbXR1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMKaW5kZXggNjgwNjllYS4uYzc3ZmE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5jCkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKIAotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZmdGdtYWMxMDBfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmZnRnbWFjMTAwX2V0aHRvb2xfb3BzOwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZmdGdtYWMxMDBfbmV0ZGV2X29wczsKIAluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9HUk87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRtYWMxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRtYWMxMDAuYwppbmRleCA4YmU1YjQwLi40ZmYxYWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0bWFjMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdG1hYzEwMC5jCkBAIC0xMDg1LDcgKzEwODUsNyBAQAogCX0KIAogCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmZ0bWFjMTAwX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmZ0bWFjMTAwX2V0aHRvb2xfb3BzOwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZmdG1hYzEwMF9uZXRkZXZfb3BzOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKaW5kZXggNjA0OGRjOC4uMjcwMzA4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKQEAgLTY3LDYgKzY3LDcgQEAKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIFhHTUFDIE1ESU8iCiAJZGVwZW5kcyBvbiBGU0xfU09DCiAJc2VsZWN0IFBIWUxJQgorCXNlbGVjdCBPRl9NRElPCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gYnVzIG9uIHRoZSBGbWFuIDEwRyBFdGhlcm5ldCBNQUNzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjLmgKaW5kZXggM2I4ZDZkMS4uNjcxZDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWMuaApAQCAtMjIxLDcgKzIyMSw3IEBACiAjZGVmaW5lIEJEX0VORVRfVFhfUkNNQVNLICAgICAgICgodXNob3J0KTB4MDAzYykKICNkZWZpbmUgQkRfRU5FVF9UWF9VTiAgICAgICAgICAgKCh1c2hvcnQpMHgwMDAyKQogI2RlZmluZSBCRF9FTkVUX1RYX0NTTCAgICAgICAgICAoKHVzaG9ydCkweDAwMDEpCi0jZGVmaW5lIEJEX0VORVRfVFhfU1RBVFMgICAgICAgICgodXNob3J0KTB4MDNmZikgICAgICAgIC8qIEFsbCBzdGF0dXMgYml0cyAqLworI2RlZmluZSBCRF9FTkVUX1RYX1NUQVRTICAgICAgICAoKHVzaG9ydCkweDBmZmYpICAgICAgICAvKiBBbGwgc3RhdHVzIGJpdHMgKi8KIAogLyplbmhhbmNlZCBidWZmZXIgZGVzY3JpcHRvciBjb250cm9sL3N0YXR1cyB1c2VkIGJ5IEV0aGVybmV0IHRyYW5zbWl0Ki8KICNkZWZpbmUgQkRfRU5FVF9UWF9JTlQgICAgICAgICAgMHg0MDAwMDAwMApAQCAtMjQ2LDggKzI0Niw4IEBACiAjZGVmaW5lIFJYX1JJTkdfU0laRQkJKEZFQ19FTkVUX1JYX0ZSUFBHICogRkVDX0VORVRfUlhfUEFHRVMpCiAjZGVmaW5lIEZFQ19FTkVUX1RYX0ZSU0laRQkyMDQ4CiAjZGVmaW5lIEZFQ19FTkVUX1RYX0ZSUFBHCShQQUdFX1NJWkUgLyBGRUNfRU5FVF9UWF9GUlNJWkUpCi0jZGVmaW5lIFRYX1JJTkdfU0laRQkJMTYJLyogTXVzdCBiZSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkxNQkvKiAgIGZvciB0aGlzIHRvIHdvcmsgKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCQk1MTIJLyogTXVzdCBiZSBwb3dlciBvZiB0d28gKi8KKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwk1MTEJLyogICBmb3IgdGhpcyB0byB3b3JrICovCiAKICNkZWZpbmUgQkRfRU5FVF9SWF9JTlQgICAgICAgICAgMHgwMDgwMDAwMAogI2RlZmluZSBCRF9FTkVUX1JYX1BUUCAgICAgICAgICAoKHVzaG9ydCkweDA0MDApCkBAIC0yOTYsOCArMjk2LDE1IEBACiAJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZCAqLwogCXN0cnVjdCBidWZkZXNjCSpkaXJ0eV90eDsKIAorCXVuc2lnbmVkIHNob3J0IGJ1ZmRlc2Nfc2l6ZTsKIAl1bnNpZ25lZCBzaG9ydCB0eF9yaW5nX3NpemU7CiAJdW5zaWduZWQgc2hvcnQgcnhfcmluZ19zaXplOworCXVuc2lnbmVkIHNob3J0IHR4X3N0b3BfdGhyZXNob2xkOworCXVuc2lnbmVkIHNob3J0IHR4X3dha2VfdGhyZXNob2xkOworCisJLyogU29mdHdhcmUgVFNPICovCisJY2hhciAqdHNvX2hkcnM7CisJZG1hX2FkZHJfdCB0c29faGRyc19kbWE7CiAKIAlzdHJ1Y3QJcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCmluZGV4IDhkNjllNDMuLjM4ZDlkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90c28uaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wLmg+CkBAIC01NCw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKQEAgLTE3MiwxMCArMTc0LDYgQEAKICNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19NNTI3MiAqLwogCi0jaWYgKCgoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIDMyKSA+IFBBR0VfU0laRSkKLSNlcnJvciAiRkVDOiBkZXNjcmlwdG9yIHJpbmcgc2l6ZSBjb25zdGFudHMgdG9vIGxhcmdlIgotI2VuZGlmCi0KIC8qIEludGVycnVwdCBldmVudHMvbWFza3MuICovCiAjZGVmaW5lIEZFQ19FTkVUX0hCRVJSCSgodWludCkweDgwMDAwMDAwKQkvKiBIZWFydGJlYXQgZXJyb3IgKi8KICNkZWZpbmUgRkVDX0VORVRfQkFCUgkoKHVpbnQpMHg0MDAwMDAwMCkJLyogQmFiYmxpbmcgcmVjZWl2ZXIgKi8KQEAgLTIzMSw2ICsyMjksMTUgQEAKICNkZWZpbmUgRkVDX1BBVVNFX0ZMQUdfQVVUT05FRwkweDEKICNkZWZpbmUgRkVDX1BBVVNFX0ZMQUdfRU5BQkxFCTB4MgogCisjZGVmaW5lIFRTT19IRUFERVJfU0laRQkJMTI4CisvKiBNYXggbnVtYmVyIG9mIGFsbG93ZWQgVENQIHNlZ21lbnRzIGZvciBzb2Z0d2FyZSBUU08gKi8KKyNkZWZpbmUgRkVDX01BWF9UU09fU0VHUwkxMDAKKyNkZWZpbmUgRkVDX01BWF9TS0JfREVTQ1MJKEZFQ19NQVhfVFNPX1NFR1MgKiAyICsgTUFYX1NLQl9GUkFHUykKKworI2RlZmluZSBJU19UU09fSEVBREVSKHR4cSwgYWRkcikgXAorCSgoYWRkciA+PSB0eHEtPnRzb19oZHJzX2RtYSkgJiYgXAorCShhZGRyIDwgdHhxLT50c29faGRyc19kbWEgKyB0eHEtPnR4X3Jpbmdfc2l6ZSAqIFRTT19IRUFERVJfU0laRSkpCisKIHN0YXRpYyBpbnQgbWlpX2NudDsKIAogc3RhdGljIGlubGluZQpAQCAtMjg2LDYgKzI5MywyMiBAQAogCQlyZXR1cm4gKG5ld19iZCA8IGJhc2UpID8gKG5ld19iZCArIHJpbmdfc2l6ZSkgOiBuZXdfYmQ7CiB9CiAKK3N0YXRpYyBpbnQgZmVjX2VuZXRfZ2V0X2JkX2luZGV4KHN0cnVjdCBidWZkZXNjICpiYXNlLCBzdHJ1Y3QgYnVmZGVzYyAqYmRwLAorCQkJCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXApCit7CisJcmV0dXJuICgoY29uc3QgY2hhciAqKWJkcCAtIChjb25zdCBjaGFyICopYmFzZSkgLyBmZXAtPmJ1ZmRlc2Nfc2l6ZTsKK30KKworc3RhdGljIGludCBmZWNfZW5ldF9nZXRfZnJlZV90eGRlc2NfbnVtKHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXApCit7CisJaW50IGVudHJpZXM7CisKKwllbnRyaWVzID0gKChjb25zdCBjaGFyICopZmVwLT5kaXJ0eV90eCAtCisJCQkoY29uc3QgY2hhciAqKWZlcC0+Y3VyX3R4KSAvIGZlcC0+YnVmZGVzY19zaXplIC0gMTsKKworCXJldHVybiBlbnRyaWVzID4gMCA/IGVudHJpZXMgOiBlbnRyaWVzICsgZmVwLT50eF9yaW5nX3NpemU7Cit9CisKIHN0YXRpYyB2b2lkICpzd2FwX2J1ZmZlcih2b2lkICpidWZhZGRyLCBpbnQgbGVuKQogewogCWludCBpOwpAQCAtMzA3LDExNSArMzMwLDE4IEBACiAJaWYgKHVubGlrZWx5KHNrYl9jb3dfaGVhZChza2IsIDApKSkKIAkJcmV0dXJuIC0xOwogCisJaXBfaGRyKHNrYiktPmNoZWNrID0gMDsKIAkqKF9fc3VtMTYgKikoc2tiLT5oZWFkICsgc2tiLT5jc3VtX3N0YXJ0ICsgc2tiLT5jc3VtX29mZnNldCkgPSAwOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBuZXRkZXZfdHhfdAotZmVjX2VuZXRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3N0YXRpYyB2b2lkCitmZWNfZW5ldF9zdWJtaXRfd29yayhzdHJ1Y3QgYnVmZGVzYyAqYmRwLCBzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwKQogewotCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZF9lbnRyeSA9CiAJCQkJcGxhdGZvcm1fZ2V0X2RldmljZV9pZChmZXAtPnBkZXYpOwotCXN0cnVjdCBidWZkZXNjICpiZHAsICpiZHBfcHJlOwotCXZvaWQgKmJ1ZmFkZHI7Ci0JdW5zaWduZWQgc2hvcnQJc3RhdHVzOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQotCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCi0JYmRwID0gZmVwLT5jdXJfdHg7Ci0KLQlzdGF0dXMgPSBiZHAtPmNiZF9zYzsKLQotCWlmIChzdGF0dXMgJiBCRF9FTkVUX1RYX1JFQURZKSB7Ci0JCS8qIE9vb3BzLiAgQWxsIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGZ1bGwuICBCYWlsIG91dC4KLQkJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgc2luY2UgbmRldi0+dGJ1c3kgc2hvdWxkIGJlIHNldC4KLQkJICovCi0JCW5ldGRldl9lcnIobmRldiwgInR4IHF1ZXVlIGZ1bGwhXG4iKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotCX0KLQotCS8qIFByb3RvY29sIGNoZWNrc3VtIG9mZi1sb2FkIGZvciBUQ1AgYW5kIFVEUC4gKi8KLQlpZiAoZmVjX2VuZXRfY2xlYXJfY3N1bShza2IsIG5kZXYpKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXJldHVybiBORVRERVZfVFhfT0s7Ci0JfQotCi0JLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0dXMgZmxhZ3MgKi8KLQlzdGF0dXMgJj0gfkJEX0VORVRfVFhfU1RBVFM7Ci0KLQkvKiBTZXQgYnVmZmVyIGxlbmd0aCBhbmQgYnVmZmVyIHBvaW50ZXIgKi8KLQlidWZhZGRyID0gc2tiLT5kYXRhOwotCWJkcC0+Y2JkX2RhdGxlbiA9IHNrYi0+bGVuOwotCi0JLyoKLQkgKiBPbiBzb21lIEZFQyBpbXBsZW1lbnRhdGlvbnMgZGF0YSBtdXN0IGJlIGFsaWduZWQgb24KLQkgKiA0LWJ5dGUgYm91bmRhcmllcy4gVXNlIGJvdW5jZSBidWZmZXJzIHRvIGNvcHkgZGF0YQotCSAqIGFuZCBnZXQgaXQgYWxpZ25lZC4gVWdoLgotCSAqLwotCWlmIChmZXAtPmJ1ZmRlc2NfZXgpCi0JCWluZGV4ID0gKHN0cnVjdCBidWZkZXNjX2V4ICopYmRwIC0KLQkJCShzdHJ1Y3QgYnVmZGVzY19leCAqKWZlcC0+dHhfYmRfYmFzZTsKLQllbHNlCi0JCWluZGV4ID0gYmRwIC0gZmVwLT50eF9iZF9iYXNlOwotCi0JaWYgKCgodW5zaWduZWQgbG9uZykgYnVmYWRkcikgJiBGRUNfQUxJR05NRU5UKSB7Ci0JCW1lbWNweShmZXAtPnR4X2JvdW5jZVtpbmRleF0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlidWZhZGRyID0gZmVwLT50eF9ib3VuY2VbaW5kZXhdOwotCX0KLQotCS8qCi0JICogU29tZSBkZXNpZ24gbWFkZSBhbiBpbmNvcnJlY3QgYXNzdW1wdGlvbiBvbiBlbmRpYW4gbW9kZSBvZgotCSAqIHRoZSBzeXN0ZW0gdGhhdCBpdCdzIHJ1bm5pbmcgb24uIEFzIHRoZSByZXN1bHQsIGRyaXZlciBoYXMgdG8KLQkgKiBzd2FwIGV2ZXJ5IGZyYW1lIGdvaW5nIHRvIGFuZCBjb21pbmcgZnJvbSB0aGUgY29udHJvbGxlci4KLQkgKi8KLQlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX1NXQVBfRlJBTUUpCi0JCXN3YXBfYnVmZmVyKGJ1ZmFkZHIsIHNrYi0+bGVuKTsKLQotCS8qIFNhdmUgc2tiIHBvaW50ZXIgKi8KLQlmZXAtPnR4X3NrYnVmZltpbmRleF0gPSBza2I7Ci0KLQkvKiBQdXNoIHRoZSBkYXRhIGNhY2hlIHNvIHRoZSBDUE0gZG9lcyBub3QgZ2V0IHN0YWxlIG1lbW9yeQotCSAqIGRhdGEuCi0JICovCi0JYmRwLT5jYmRfYnVmYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZmZXAtPnBkZXYtPmRldiwgYnVmYWRkciwKLQkJCXNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyKSkgewotCQliZHAtPmNiZF9idWZhZGRyID0gMDsKLQkJZmVwLT50eF9za2J1ZmZbaW5kZXhdID0gTlVMTDsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCW5ldGRldl9lcnIobmRldiwgIlR4IERNQSBtZW1vcnkgbWFwIGZhaWxlZFxuIik7Ci0JCXJldHVybiBORVRERVZfVFhfT0s7Ci0JfQotCi0JaWYgKGZlcC0+YnVmZGVzY19leCkgewotCi0JCXN0cnVjdCBidWZkZXNjX2V4ICplYmRwID0gKHN0cnVjdCBidWZkZXNjX2V4ICopYmRwOwotCQllYmRwLT5jYmRfYmR1ID0gMDsKLQkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9IV19UU1RBTVAgJiYKLQkJCWZlcC0+aHd0c190eF9lbikpIHsKLQkJCWViZHAtPmNiZF9lc2MgPSAoQkRfRU5FVF9UWF9UUyB8IEJEX0VORVRfVFhfSU5UKTsKLQkJCXNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgfD0gU0tCVFhfSU5fUFJPR1JFU1M7Ci0JCX0gZWxzZSB7Ci0JCQllYmRwLT5jYmRfZXNjID0gQkRfRU5FVF9UWF9JTlQ7Ci0KLQkJCS8qIEVuYWJsZSBwcm90b2NvbCBjaGVja3N1bSBmbGFncwotCQkJICogV2UgZG8gbm90IGJvdGhlciB3aXRoIHRoZSBJUCBDaGVja3N1bSBiaXRzIGFzIHRoZXkKLQkJCSAqIGFyZSBkb25lIGJ5IHRoZSBrZXJuZWwKLQkJCSAqLwotCQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0JCQkJZWJkcC0+Y2JkX2VzYyB8PSBCRF9FTkVUX1RYX1BJTlM7Ci0JCX0KLQl9Ci0KLQkvKiBTZW5kIGl0IG9uIGl0cyB3YXkuICBUZWxsIEZFQyBpdCdzIHJlYWR5LCBpbnRlcnJ1cHQgd2hlbiBkb25lLAotCSAqIGl0J3MgdGhlIGxhc3QgQkQgb2YgdGhlIGZyYW1lLCBhbmQgdG8gcHV0IHRoZSBDUkMgb24gdGhlIGVuZC4KLQkgKi8KLQlzdGF0dXMgfD0gKEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0lOVFIKLQkJCXwgQkRfRU5FVF9UWF9MQVNUIHwgQkRfRU5FVF9UWF9UQyk7Ci0JYmRwLT5jYmRfc2MgPSBzdGF0dXM7CisJc3RydWN0IGJ1ZmRlc2MgKmJkcF9wcmU7CiAKIAliZHBfcHJlID0gZmVjX2VuZXRfZ2V0X3ByZXZkZXNjKGJkcCwgZmVwKTsKIAlpZiAoKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19FUlIwMDYzNTgpICYmCkBAIC00MjQsMjAgKzM1MCw0MTUgQEAKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCYoZmVwLT5kZWxheV93b3JrLmRlbGF5X3dvcmspLAogCQkJCQltc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9Cit9CisKK3N0YXRpYyBpbnQKK2ZlY19lbmV0X3R4cV9zdWJtaXRfZnJhZ19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KG5kZXYpOworCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0KKwkJCQlwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKGZlcC0+cGRldik7CisJc3RydWN0IGJ1ZmRlc2MgKmJkcCA9IGZlcC0+Y3VyX3R4OworCXN0cnVjdCBidWZkZXNjX2V4ICplYmRwOworCWludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaW50IGZyYWcsIGZyYWdfbGVuOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZXN0YXR1cyA9IDA7CisJc2tiX2ZyYWdfdCAqdGhpc19mcmFnOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2b2lkICpidWZhZGRyOworCWludCBpOworCisJZm9yIChmcmFnID0gMDsgZnJhZyA8IG5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJdGhpc19mcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ107CisJCWJkcCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhiZHAsIGZlcCk7CisJCWViZHAgPSAoc3RydWN0IGJ1ZmRlc2NfZXggKiliZHA7CisKKwkJc3RhdHVzID0gYmRwLT5jYmRfc2M7CisJCXN0YXR1cyAmPSB+QkRfRU5FVF9UWF9TVEFUUzsKKwkJc3RhdHVzIHw9IChCRF9FTkVUX1RYX1RDIHwgQkRfRU5FVF9UWF9SRUFEWSk7CisJCWZyYWdfbGVuID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnXS5zaXplOworCisJCS8qIEhhbmRsZSB0aGUgbGFzdCBCRCBzcGVjaWFsbHkgKi8KKwkJaWYgKGZyYWcgPT0gbnJfZnJhZ3MgLSAxKSB7CisJCQlzdGF0dXMgfD0gKEJEX0VORVRfVFhfSU5UUiB8IEJEX0VORVRfVFhfTEFTVCk7CisJCQlpZiAoZmVwLT5idWZkZXNjX2V4KSB7CisJCQkJZXN0YXR1cyB8PSBCRF9FTkVUX1RYX0lOVDsKKwkJCQlpZiAodW5saWtlbHkoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmCisJCQkJCVNLQlRYX0hXX1RTVEFNUCAmJiBmZXAtPmh3dHNfdHhfZW4pKQorCQkJCQllc3RhdHVzIHw9IEJEX0VORVRfVFhfVFM7CisJCQl9CisJCX0KKworCQlpZiAoZmVwLT5idWZkZXNjX2V4KSB7CisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJCQllc3RhdHVzIHw9IEJEX0VORVRfVFhfUElOUyB8IEJEX0VORVRfVFhfSUlOUzsKKwkJCWViZHAtPmNiZF9iZHUgPSAwOworCQkJZWJkcC0+Y2JkX2VzYyA9IGVzdGF0dXM7CisJCX0KKworCQlidWZhZGRyID0gcGFnZV9hZGRyZXNzKHRoaXNfZnJhZy0+cGFnZS5wKSArIHRoaXNfZnJhZy0+cGFnZV9vZmZzZXQ7CisKKwkJaW5kZXggPSBmZWNfZW5ldF9nZXRfYmRfaW5kZXgoZmVwLT50eF9iZF9iYXNlLCBiZHAsIGZlcCk7CisJCWlmICgoKHVuc2lnbmVkIGxvbmcpIGJ1ZmFkZHIpICYgRkVDX0FMSUdOTUVOVCB8fAorCQkJaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX1NXQVBfRlJBTUUpIHsKKwkJCW1lbWNweShmZXAtPnR4X2JvdW5jZVtpbmRleF0sIGJ1ZmFkZHIsIGZyYWdfbGVuKTsKKwkJCWJ1ZmFkZHIgPSBmZXAtPnR4X2JvdW5jZVtpbmRleF07CisKKwkJCWlmIChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfU1dBUF9GUkFNRSkKKwkJCQlzd2FwX2J1ZmZlcihidWZhZGRyLCBmcmFnX2xlbik7CisJCX0KKworCQliZHAtPmNiZF9idWZhZGRyID0gZG1hX21hcF9zaW5nbGUoJmZlcC0+cGRldi0+ZGV2LCBidWZhZGRyLAorCQkJCQkJZnJhZ19sZW4sIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyKSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJbmV0ZGV2X2VycihuZGV2LCAiVHggRE1BIG1lbW9yeSBtYXAgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZG1hX21hcHBpbmdfZXJyb3I7CisJCX0KKworCQliZHAtPmNiZF9kYXRsZW4gPSBmcmFnX2xlbjsKKwkJYmRwLT5jYmRfc2MgPSBzdGF0dXM7CisJfQorCisJZmVwLT5jdXJfdHggPSBiZHA7CisKKwlyZXR1cm4gMDsKKworZG1hX21hcHBpbmdfZXJyb3I6CisJYmRwID0gZmVwLT5jdXJfdHg7CisJZm9yIChpID0gMDsgaSA8IGZyYWc7IGkrKykgeworCQliZHAgPSBmZWNfZW5ldF9nZXRfbmV4dGRlc2MoYmRwLCBmZXApOworCQlkbWFfdW5tYXBfc2luZ2xlKCZmZXAtPnBkZXYtPmRldiwgYmRwLT5jYmRfYnVmYWRkciwKKwkJCQliZHAtPmNiZF9kYXRsZW4sIERNQV9UT19ERVZJQ0UpOworCX0KKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgaW50IGZlY19lbmV0X3R4cV9zdWJtaXRfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZF9lbnRyeSA9CisJCQkJcGxhdGZvcm1fZ2V0X2RldmljZV9pZChmZXAtPnBkZXYpOworCWludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJc3RydWN0IGJ1ZmRlc2MgKmJkcCwgKmxhc3RfYmRwOworCXZvaWQgKmJ1ZmFkZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGJ1ZmxlbjsKKwl1bnNpZ25lZCBpbnQgZXN0YXR1cyA9IDA7CisJdW5zaWduZWQgaW50IGluZGV4OworCWludCBlbnRyaWVzX2ZyZWU7CisJaW50IHJldDsKKworCWVudHJpZXNfZnJlZSA9IGZlY19lbmV0X2dldF9mcmVlX3R4ZGVzY19udW0oZmVwKTsKKwlpZiAoZW50cmllc19mcmVlIDwgTUFYX1NLQl9GUkFHUyArIDEpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9lcnIobmRldiwgIk5PVCBlbm91Z2ggQkQgZm9yIFNHIVxuIik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJLyogUHJvdG9jb2wgY2hlY2tzdW0gb2ZmLWxvYWQgZm9yIFRDUCBhbmQgVURQLiAqLworCWlmIChmZWNfZW5ldF9jbGVhcl9jc3VtKHNrYiwgbmRldikpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwkvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLworCWJkcCA9IGZlcC0+Y3VyX3R4OworCXN0YXR1cyA9IGJkcC0+Y2JkX3NjOworCXN0YXR1cyAmPSB+QkRfRU5FVF9UWF9TVEFUUzsKKworCS8qIFNldCBidWZmZXIgbGVuZ3RoIGFuZCBidWZmZXIgcG9pbnRlciAqLworCWJ1ZmFkZHIgPSBza2ItPmRhdGE7CisJYnVmbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCWluZGV4ID0gZmVjX2VuZXRfZ2V0X2JkX2luZGV4KGZlcC0+dHhfYmRfYmFzZSwgYmRwLCBmZXApOworCWlmICgoKHVuc2lnbmVkIGxvbmcpIGJ1ZmFkZHIpICYgRkVDX0FMSUdOTUVOVCB8fAorCQlpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfU1dBUF9GUkFNRSkgeworCQltZW1jcHkoZmVwLT50eF9ib3VuY2VbaW5kZXhdLCBza2ItPmRhdGEsIGJ1Zmxlbik7CisJCWJ1ZmFkZHIgPSBmZXAtPnR4X2JvdW5jZVtpbmRleF07CisKKwkJaWYgKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19TV0FQX0ZSQU1FKQorCQkJc3dhcF9idWZmZXIoYnVmYWRkciwgYnVmbGVuKTsKKwl9CisKKwkvKiBQdXNoIHRoZSBkYXRhIGNhY2hlIHNvIHRoZSBDUE0gZG9lcyBub3QgZ2V0IHN0YWxlIG1lbW9yeQorCSAqIGRhdGEuCisJICovCisJYmRwLT5jYmRfYnVmYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZmZXAtPnBkZXYtPmRldiwgYnVmYWRkciwKKwkJCQkJYnVmbGVuLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2VycihuZGV2LCAiVHggRE1BIG1lbW9yeSBtYXAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlpZiAobnJfZnJhZ3MpIHsKKwkJcmV0ID0gZmVjX2VuZXRfdHhxX3N1Ym1pdF9mcmFnX3NrYihza2IsIG5kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlzdGF0dXMgfD0gKEJEX0VORVRfVFhfSU5UUiB8IEJEX0VORVRfVFhfTEFTVCk7CisJCWlmIChmZXAtPmJ1ZmRlc2NfZXgpIHsKKwkJCWVzdGF0dXMgPSBCRF9FTkVUX1RYX0lOVDsKKwkJCWlmICh1bmxpa2VseShza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICYKKwkJCQlTS0JUWF9IV19UU1RBTVAgJiYgZmVwLT5od3RzX3R4X2VuKSkKKwkJCQllc3RhdHVzIHw9IEJEX0VORVRfVFhfVFM7CisJCX0KKwl9CisKKwlpZiAoZmVwLT5idWZkZXNjX2V4KSB7CisKKwkJc3RydWN0IGJ1ZmRlc2NfZXggKmViZHAgPSAoc3RydWN0IGJ1ZmRlc2NfZXggKiliZHA7CisKKwkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9IV19UU1RBTVAgJiYKKwkJCWZlcC0+aHd0c190eF9lbikpCisJCQlza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzIHw9IFNLQlRYX0lOX1BST0dSRVNTOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQkJZXN0YXR1cyB8PSBCRF9FTkVUX1RYX1BJTlMgfCBCRF9FTkVUX1RYX0lJTlM7CisKKwkJZWJkcC0+Y2JkX2JkdSA9IDA7CisJCWViZHAtPmNiZF9lc2MgPSBlc3RhdHVzOworCX0KKworCWxhc3RfYmRwID0gZmVwLT5jdXJfdHg7CisJaW5kZXggPSBmZWNfZW5ldF9nZXRfYmRfaW5kZXgoZmVwLT50eF9iZF9iYXNlLCBsYXN0X2JkcCwgZmVwKTsKKwkvKiBTYXZlIHNrYiBwb2ludGVyICovCisJZmVwLT50eF9za2J1ZmZbaW5kZXhdID0gc2tiOworCisJYmRwLT5jYmRfZGF0bGVuID0gYnVmbGVuOworCisJLyogU2VuZCBpdCBvbiBpdHMgd2F5LiAgVGVsbCBGRUMgaXQncyByZWFkeSwgaW50ZXJydXB0IHdoZW4gZG9uZSwKKwkgKiBpdCdzIHRoZSBsYXN0IEJEIG9mIHRoZSBmcmFtZSwgYW5kIHRvIHB1dCB0aGUgQ1JDIG9uIHRoZSBlbmQuCisJICovCisJc3RhdHVzIHw9IChCRF9FTkVUX1RYX1JFQURZIHwgQkRfRU5FVF9UWF9UQyk7CisJYmRwLT5jYmRfc2MgPSBzdGF0dXM7CisKKwlmZWNfZW5ldF9zdWJtaXRfd29yayhiZHAsIGZlcCk7CiAKIAkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBCRCBpbiB0aGUgcmluZywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhZ2Fpbi4gKi8KLQliZHAgPSBmZWNfZW5ldF9nZXRfbmV4dGRlc2MoYmRwLCBmZXApOworCWJkcCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhsYXN0X2JkcCwgZmVwKTsKIAogCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKIAogCWZlcC0+Y3VyX3R4ID0gYmRwOwogCi0JaWYgKGZlcC0+Y3VyX3R4ID09IGZlcC0+ZGlydHlfdHgpCi0JCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJLyogVHJpZ2dlciB0cmFuc21pc3Npb24gc3RhcnQgKi8KKwl3cml0ZWwoMCwgZmVwLT5od3AgKyBGRUNfWF9ERVNfQUNUSVZFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmZWNfZW5ldF90eHFfcHV0X2RhdGFfdHNvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJc3RydWN0IGJ1ZmRlc2MgKmJkcCwgaW50IGluZGV4LCBjaGFyICpkYXRhLAorCQkJaW50IHNpemUsIGJvb2wgbGFzdF90Y3AsIGJvb2wgaXNfbGFzdCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYobmRldik7CisJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWRfZW50cnkgPQorCQkJCXBsYXRmb3JtX2dldF9kZXZpY2VfaWQoZmVwLT5wZGV2KTsKKwlzdHJ1Y3QgYnVmZGVzY19leCAqZWJkcCA9IChzdHJ1Y3QgYnVmZGVzY19leCAqKWJkcDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGVzdGF0dXMgPSAwOworCisJc3RhdHVzID0gYmRwLT5jYmRfc2M7CisJc3RhdHVzICY9IH5CRF9FTkVUX1RYX1NUQVRTOworCisJc3RhdHVzIHw9IChCRF9FTkVUX1RYX1RDIHwgQkRfRU5FVF9UWF9SRUFEWSk7CisJYmRwLT5jYmRfZGF0bGVuID0gc2l6ZTsKKworCWlmICgoKHVuc2lnbmVkIGxvbmcpIGRhdGEpICYgRkVDX0FMSUdOTUVOVCB8fAorCQlpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfU1dBUF9GUkFNRSkgeworCQltZW1jcHkoZmVwLT50eF9ib3VuY2VbaW5kZXhdLCBkYXRhLCBzaXplKTsKKwkJZGF0YSA9IGZlcC0+dHhfYm91bmNlW2luZGV4XTsKKworCQlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX1NXQVBfRlJBTUUpCisJCQlzd2FwX2J1ZmZlcihkYXRhLCBzaXplKTsKKwl9CisKKwliZHAtPmNiZF9idWZhZGRyID0gZG1hX21hcF9zaW5nbGUoJmZlcC0+cGRldi0+ZGV2LCBkYXRhLAorCQkJCQlzaXplLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2VycihuZGV2LCAiVHggRE1BIG1lbW9yeSBtYXAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWlmIChmZXAtPmJ1ZmRlc2NfZXgpIHsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCQllc3RhdHVzIHw9IEJEX0VORVRfVFhfUElOUyB8IEJEX0VORVRfVFhfSUlOUzsKKwkJZWJkcC0+Y2JkX2JkdSA9IDA7CisJCWViZHAtPmNiZF9lc2MgPSBlc3RhdHVzOworCX0KKworCS8qIEhhbmRsZSB0aGUgbGFzdCBCRCBzcGVjaWFsbHkgKi8KKwlpZiAobGFzdF90Y3ApCisJCXN0YXR1cyB8PSAoQkRfRU5FVF9UWF9MQVNUIHwgQkRfRU5FVF9UWF9UQyk7CisJaWYgKGlzX2xhc3QpIHsKKwkJc3RhdHVzIHw9IEJEX0VORVRfVFhfSU5UUjsKKwkJaWYgKGZlcC0+YnVmZGVzY19leCkKKwkJCWViZHAtPmNiZF9lc2MgfD0gQkRfRU5FVF9UWF9JTlQ7CisJfQorCisJYmRwLT5jYmRfc2MgPSBzdGF0dXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZmVjX2VuZXRfdHhxX3B1dF9oZHJfdHNvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJc3RydWN0IGJ1ZmRlc2MgKmJkcCwgaW50IGluZGV4KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZF9lbnRyeSA9CisJCQkJcGxhdGZvcm1fZ2V0X2RldmljZV9pZChmZXAtPnBkZXYpOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKwlzdHJ1Y3QgYnVmZGVzY19leCAqZWJkcCA9IChzdHJ1Y3QgYnVmZGVzY19leCAqKWJkcDsKKwl2b2lkICpidWZhZGRyOworCXVuc2lnbmVkIGxvbmcgZG1hYnVmOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZXN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBiZHAtPmNiZF9zYzsKKwlzdGF0dXMgJj0gfkJEX0VORVRfVFhfU1RBVFM7CisJc3RhdHVzIHw9IChCRF9FTkVUX1RYX1RDIHwgQkRfRU5FVF9UWF9SRUFEWSk7CisKKwlidWZhZGRyID0gZmVwLT50c29faGRycyArIGluZGV4ICogVFNPX0hFQURFUl9TSVpFOworCWRtYWJ1ZiA9IGZlcC0+dHNvX2hkcnNfZG1hICsgaW5kZXggKiBUU09fSEVBREVSX1NJWkU7CisJaWYgKCgodW5zaWduZWQgbG9uZykgYnVmYWRkcikgJiBGRUNfQUxJR05NRU5UIHx8CisJCWlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19TV0FQX0ZSQU1FKSB7CisJCW1lbWNweShmZXAtPnR4X2JvdW5jZVtpbmRleF0sIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJCWJ1ZmFkZHIgPSBmZXAtPnR4X2JvdW5jZVtpbmRleF07CisKKwkJaWYgKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19TV0FQX0ZSQU1FKQorCQkJc3dhcF9idWZmZXIoYnVmYWRkciwgaGRyX2xlbik7CisKKwkJZG1hYnVmID0gZG1hX21hcF9zaW5nbGUoJmZlcC0+cGRldi0+ZGV2LCBidWZhZGRyLAorCQkJCQloZHJfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZmZXAtPnBkZXYtPmRldiwgZG1hYnVmKSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJbmV0ZGV2X2VycihuZGV2LCAiVHggRE1BIG1lbW9yeSBtYXAgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJfQorCX0KKworCWJkcC0+Y2JkX2J1ZmFkZHIgPSBkbWFidWY7CisJYmRwLT5jYmRfZGF0bGVuID0gaGRyX2xlbjsKKworCWlmIChmZXAtPmJ1ZmRlc2NfZXgpIHsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCQllc3RhdHVzIHw9IEJEX0VORVRfVFhfUElOUyB8IEJEX0VORVRfVFhfSUlOUzsKKwkJZWJkcC0+Y2JkX2JkdSA9IDA7CisJCWViZHAtPmNiZF9lc2MgPSBlc3RhdHVzOworCX0KKworCWJkcC0+Y2JkX3NjID0gc3RhdHVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmVjX2VuZXRfdHhxX3N1Ym1pdF90c28oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKwlpbnQgdG90YWxfbGVuLCBkYXRhX2xlZnQ7CisJc3RydWN0IGJ1ZmRlc2MgKmJkcCA9IGZlcC0+Y3VyX3R4OworCXN0cnVjdCB0c29fdCB0c287CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKwlpbnQgcmV0OworCisJaWYgKHRzb19jb3VudF9kZXNjcyhza2IpID49IGZlY19lbmV0X2dldF9mcmVlX3R4ZGVzY19udW0oZmVwKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2VycihuZGV2LCAiTk9UIGVub3VnaCBCRCBmb3IgVFNPIVxuIik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJLyogUHJvdG9jb2wgY2hlY2tzdW0gb2ZmLWxvYWQgZm9yIFRDUCBhbmQgVURQLiAqLworCWlmIChmZWNfZW5ldF9jbGVhcl9jc3VtKHNrYiwgbmRldikpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBUU08gaGFuZGxlciwgYW5kIHByZXBhcmUgdGhlIGZpcnN0IHBheWxvYWQgKi8KKwl0c29fc3RhcnQoc2tiLCAmdHNvKTsKKworCXRvdGFsX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwl3aGlsZSAodG90YWxfbGVuID4gMCkgeworCQljaGFyICpoZHI7CisKKwkJaW5kZXggPSBmZWNfZW5ldF9nZXRfYmRfaW5kZXgoZmVwLT50eF9iZF9iYXNlLCBiZHAsIGZlcCk7CisJCWRhdGFfbGVmdCA9IG1pbl90KGludCwgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSwgdG90YWxfbGVuKTsKKwkJdG90YWxfbGVuIC09IGRhdGFfbGVmdDsKKworCQkvKiBwcmVwYXJlIHBhY2tldCBoZWFkZXJzOiBNQUMgKyBJUCArIFRDUCAqLworCQloZHIgPSBmZXAtPnRzb19oZHJzICsgaW5kZXggKiBUU09fSEVBREVSX1NJWkU7CisJCXRzb19idWlsZF9oZHIoc2tiLCBoZHIsICZ0c28sIGRhdGFfbGVmdCwgdG90YWxfbGVuID09IDApOworCQlyZXQgPSBmZWNfZW5ldF90eHFfcHV0X2hkcl90c28oc2tiLCBuZGV2LCBiZHAsIGluZGV4KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3JlbGVhc2U7CisKKwkJd2hpbGUgKGRhdGFfbGVmdCA+IDApIHsKKwkJCWludCBzaXplOworCisJCQlzaXplID0gbWluX3QoaW50LCB0c28uc2l6ZSwgZGF0YV9sZWZ0KTsKKwkJCWJkcCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhiZHAsIGZlcCk7CisJCQlpbmRleCA9IGZlY19lbmV0X2dldF9iZF9pbmRleChmZXAtPnR4X2JkX2Jhc2UsIGJkcCwgZmVwKTsKKwkJCXJldCA9IGZlY19lbmV0X3R4cV9wdXRfZGF0YV90c28oc2tiLCBuZGV2LCBiZHAsIGluZGV4LCB0c28uZGF0YSwKKwkJCQkJCQlzaXplLCBzaXplID09IGRhdGFfbGVmdCwKKwkJCQkJCQl0b3RhbF9sZW4gPT0gMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX3JlbGVhc2U7CisKKwkJCWRhdGFfbGVmdCAtPSBzaXplOworCQkJdHNvX2J1aWxkX2RhdGEoc2tiLCAmdHNvLCBzaXplKTsKKwkJfQorCisJCWJkcCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhiZHAsIGZlcCk7CisJfQorCisJLyogU2F2ZSBza2IgcG9pbnRlciAqLworCWZlcC0+dHhfc2tidWZmW2luZGV4XSA9IHNrYjsKKworCWZlY19lbmV0X3N1Ym1pdF93b3JrKGJkcCwgZmVwKTsKKworCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwlmZXAtPmN1cl90eCA9IGJkcDsKIAogCS8qIFRyaWdnZXIgdHJhbnNtaXNzaW9uIHN0YXJ0ICovCiAJd3JpdGVsKDAsIGZlcC0+aHdwICsgRkVDX1hfREVTX0FDVElWRSk7CiAKKwlyZXR1cm4gMDsKKworZXJyX3JlbGVhc2U6CisJLyogVE9ETzogUmVsZWFzZSBhbGwgdXNlZCBkYXRhIGRlc2NyaXB0b3JzIGZvciBUU08gKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QKK2ZlY19lbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBlbnRyaWVzX2ZyZWU7CisJaW50IHJldDsKKworCWlmIChza2JfaXNfZ3NvKHNrYikpCisJCXJldCA9IGZlY19lbmV0X3R4cV9zdWJtaXRfdHNvKHNrYiwgbmRldik7CisJZWxzZQorCQlyZXQgPSBmZWNfZW5ldF90eHFfc3VibWl0X3NrYihza2IsIG5kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllbnRyaWVzX2ZyZWUgPSBmZWNfZW5ldF9nZXRfZnJlZV90eGRlc2NfbnVtKGZlcCk7CisJaWYgKGVudHJpZXNfZnJlZSA8PSBmZXAtPnR4X3N0b3BfdGhyZXNob2xkKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtNzU2LDYgKzEwNzcsNyBAQAogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAlzdHJ1Y3QJc2tfYnVmZgkqc2tiOwogCWludAlpbmRleCA9IDA7CisJaW50CWVudHJpZXNfZnJlZTsKIAogCWZlcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCWJkcCA9IGZlcC0+ZGlydHlfdHg7CkBAIC03NjksMTYgKzEwOTEsMTcgQEAKIAkJaWYgKGJkcCA9PSBmZXAtPmN1cl90eCkKIAkJCWJyZWFrOwogCi0JCWlmIChmZXAtPmJ1ZmRlc2NfZXgpCi0JCQlpbmRleCA9IChzdHJ1Y3QgYnVmZGVzY19leCAqKWJkcCAtCi0JCQkJKHN0cnVjdCBidWZkZXNjX2V4ICopZmVwLT50eF9iZF9iYXNlOwotCQllbHNlCi0JCQlpbmRleCA9IGJkcCAtIGZlcC0+dHhfYmRfYmFzZTsKKwkJaW5kZXggPSBmZWNfZW5ldF9nZXRfYmRfaW5kZXgoZmVwLT50eF9iZF9iYXNlLCBiZHAsIGZlcCk7CiAKIAkJc2tiID0gZmVwLT50eF9za2J1ZmZbaW5kZXhdOwotCQlkbWFfdW5tYXBfc2luZ2xlKCZmZXAtPnBkZXYtPmRldiwgYmRwLT5jYmRfYnVmYWRkciwgc2tiLT5sZW4sCi0JCQkJRE1BX1RPX0RFVklDRSk7CisJCWlmICghSVNfVFNPX0hFQURFUihmZXAsIGJkcC0+Y2JkX2J1ZmFkZHIpKQorCQkJZG1hX3VubWFwX3NpbmdsZSgmZmVwLT5wZGV2LT5kZXYsIGJkcC0+Y2JkX2J1ZmFkZHIsCisJCQkJCWJkcC0+Y2JkX2RhdGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJCWJkcC0+Y2JkX2J1ZmFkZHIgPSAwOworCQlpZiAoIXNrYikgeworCQkJYmRwID0gZmVjX2VuZXRfZ2V0X25leHRkZXNjKGJkcCwgZmVwKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KIAkJaWYgKHN0YXR1cyAmIChCRF9FTkVUX1RYX0hCIHwgQkRfRU5FVF9UWF9MQyB8CkBAIC03OTcsNyArMTEyMCw3IEBACiAJCQkJbmRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKIAkJfSBlbHNlIHsKIAkJCW5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGJkcC0+Y2JkX2RhdGxlbjsKKwkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQl9CiAKIAkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9JTl9QUk9HUkVTUykgJiYKQEAgLTgzNCwxNSArMTE1NywxNSBAQAogCiAJCS8qIFNpbmNlIHdlIGhhdmUgZnJlZWQgdXAgYSBidWZmZXIsIHRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsCiAJCSAqLwotCQlpZiAoZmVwLT5kaXJ0eV90eCAhPSBmZXAtPmN1cl90eCkgewotCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldikpCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpKSB7CisJCQllbnRyaWVzX2ZyZWUgPSBmZWNfZW5ldF9nZXRfZnJlZV90eGRlc2NfbnVtKGZlcCk7CisJCQlpZiAoZW50cmllc19mcmVlID49IGZlcC0+dHhfd2FrZV90aHJlc2hvbGQpCiAJCQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKIAkJfQogCX0KIAlyZXR1cm47CiB9CiAKLQogLyogRHVyaW5nIGEgcmVjZWl2ZSwgdGhlIGN1cl9yeCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgaW5jb21pbmcgYnVmZmVyLgogICogV2hlbiB3ZSB1cGRhdGUgdGhyb3VnaCB0aGUgcmluZywgaWYgdGhlIG5leHQgaW5jb21pbmcgYnVmZmVyIGhhcwogICogbm90IGJlZW4gZ2l2ZW4gdG8gdGhlIHN5c3RlbSwgd2UganVzdCBzZXQgdGhlIGVtcHR5IGluZGljYXRvciwKQEAgLTkyMCwxMSArMTI0Myw3IEBACiAJCXBrdF9sZW4gPSBiZHAtPmNiZF9kYXRsZW47CiAJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CiAKLQkJaWYgKGZlcC0+YnVmZGVzY19leCkKLQkJCWluZGV4ID0gKHN0cnVjdCBidWZkZXNjX2V4ICopYmRwIC0KLQkJCQkoc3RydWN0IGJ1ZmRlc2NfZXggKilmZXAtPnJ4X2JkX2Jhc2U7Ci0JCWVsc2UKLQkJCWluZGV4ID0gYmRwIC0gZmVwLT5yeF9iZF9iYXNlOworCQlpbmRleCA9IGZlY19lbmV0X2dldF9iZF9pbmRleChmZXAtPnJ4X2JkX2Jhc2UsIGJkcCwgZmVwKTsKIAkJZGF0YSA9IGZlcC0+cnhfc2tidWZmW2luZGV4XS0+ZGF0YTsKIAkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyLAogCQkJCQlGRUNfRU5FVF9SWF9GUlNJWkUsIERNQV9GUk9NX0RFVklDRSk7CkBAIC0xMjU1LDYgKzE1NzQsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmZWNfZW5ldF9jbGtfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGZlcC0+Y2xrX2FoYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZmVwLT5jbGtfaXBnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbGVkX2Nsa19pcGc7CisJCWlmIChmZXAtPmNsa19lbmV0X291dCkgeworCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGZlcC0+Y2xrX2VuZXRfb3V0KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBmYWlsZWRfY2xrX2VuZXRfb3V0OworCQl9CisJCWlmIChmZXAtPmNsa19wdHApIHsKKwkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShmZXAtPmNsa19wdHApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGZhaWxlZF9jbGtfcHRwOworCQl9CisJfSBlbHNlIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2FoYik7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19pcGcpOworCQlpZiAoZmVwLT5jbGtfZW5ldF9vdXQpCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfZW5ldF9vdXQpOworCQlpZiAoZmVwLT5jbGtfcHRwKQorCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX3B0cCk7CisJfQorCisJcmV0dXJuIDA7CitmYWlsZWRfY2xrX3B0cDoKKwlpZiAoZmVwLT5jbGtfZW5ldF9vdXQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19lbmV0X291dCk7CitmYWlsZWRfY2xrX2VuZXRfb3V0OgorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfaXBnKTsKK2ZhaWxlZF9jbGtfaXBnOgorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfYWhiKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgZmVjX2VuZXRfbWlpX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTEzNjQsNyArMTcyNiw3IEBACiAJICogUmVmZXJlbmNlIE1hbnVhbCBoYXMgYW4gZXJyb3Igb24gdGhpcywgYW5kIGdldHMgZml4ZWQgb24gaS5NWDZRCiAJICogZG9jdW1lbnQuCiAJICovCi0JZmVwLT5waHlfc3BlZWQgPSBESVZfUk9VTkRfVVAoY2xrX2dldF9yYXRlKGZlcC0+Y2xrX2FoYiksIDUwMDAwMDApOworCWZlcC0+cGh5X3NwZWVkID0gRElWX1JPVU5EX1VQKGNsa19nZXRfcmF0ZShmZXAtPmNsa19pcGcpLCA1MDAwMDAwKTsKIAlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX0VORVRfTUFDKQogCQlmZXAtPnBoeV9zcGVlZC0tOwogCWZlcC0+cGh5X3NwZWVkIDw8PSAxOwpAQCAtMTc3Myw2ICsyMTM1LDExIEBACiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCByZXQ7CiAKKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKCZmZXAtPnBkZXYtPmRldik7CisJcmV0ID0gZmVjX2VuZXRfY2xrX2VuYWJsZShuZGV2LCB0cnVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogSSBzaG91bGQgcmVzZXQgdGhlIHJpbmcgYnVmZmVycyBoZXJlLCBidXQgSSBkb24ndCB5ZXQga25vdwogCSAqIGEgc2ltcGxlIHdheSB0byBkbyB0aGF0LgogCSAqLwpAQCAtMTgxMSw2ICsyMTc4LDggQEAKIAkJcGh5X2Rpc2Nvbm5lY3QoZmVwLT5waHlfZGV2KTsKIAl9CiAKKwlmZWNfZW5ldF9jbGtfZW5hYmxlKG5kZXYsIGZhbHNlKTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZSgmZmVwLT5wZGV2LT5kZXYpOwogCWZlY19lbmV0X2ZyZWVfYnVmZmVycyhuZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTk4OCwxMyArMjM1NywzNSBAQAogCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0KIAkJCQlwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKGZlcC0+cGRldik7CiAJc3RydWN0IGJ1ZmRlc2MgKmNiZF9iYXNlOworCWludCBiZF9zaXplOworCisJLyogaW5pdCB0aGUgdHggJiByeCByaW5nIHNpemUgKi8KKwlmZXAtPnR4X3Jpbmdfc2l6ZSA9IFRYX1JJTkdfU0laRTsKKwlmZXAtPnJ4X3Jpbmdfc2l6ZSA9IFJYX1JJTkdfU0laRTsKKworCWZlcC0+dHhfc3RvcF90aHJlc2hvbGQgPSBGRUNfTUFYX1NLQl9ERVNDUzsKKwlmZXAtPnR4X3dha2VfdGhyZXNob2xkID0gKGZlcC0+dHhfcmluZ19zaXplIC0gZmVwLT50eF9zdG9wX3RocmVzaG9sZCkgLyAyOworCisJaWYgKGZlcC0+YnVmZGVzY19leCkKKwkJZmVwLT5idWZkZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IGJ1ZmRlc2NfZXgpOworCWVsc2UKKwkJZmVwLT5idWZkZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IGJ1ZmRlc2MpOworCWJkX3NpemUgPSAoZmVwLT50eF9yaW5nX3NpemUgKyBmZXAtPnJ4X3Jpbmdfc2l6ZSkgKgorCQkJZmVwLT5idWZkZXNjX3NpemU7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KLQljYmRfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsICZmZXAtPmJkX2RtYSwKKwljYmRfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBiZF9zaXplLCAmZmVwLT5iZF9kbWEsCiAJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYmRfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlmZXAtPnRzb19oZHJzID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIGZlcC0+dHhfcmluZ19zaXplICogVFNPX0hFQURFUl9TSVpFLAorCQkJCQkJJmZlcC0+dHNvX2hkcnNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZlcC0+dHNvX2hkcnMpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgYmRfc2l6ZSwgY2JkX2Jhc2UsIGZlcC0+YmRfZG1hKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJbWVtc2V0KGNiZF9iYXNlLCAwLCBQQUdFX1NJWkUpOwogCiAJZmVwLT5uZXRkZXYgPSBuZGV2OwpAQCAtMjAwNCwxMCArMjM5NSw2IEBACiAJLyogbWFrZSBzdXJlIE1BQyB3ZSBqdXN0IGFjcXVpcmVkIGlzIHByb2dyYW1tZWQgaW50byB0aGUgaHcgKi8KIAlmZWNfc2V0X21hY19hZGRyZXNzKG5kZXYsIE5VTEwpOwogCi0JLyogaW5pdCB0aGUgdHggJiByeCByaW5nIHNpemUgKi8KLQlmZXAtPnR4X3Jpbmdfc2l6ZSA9IFRYX1JJTkdfU0laRTsKLQlmZXAtPnJ4X3Jpbmdfc2l6ZSA9IFJYX1JJTkdfU0laRTsKLQogCS8qIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UuICovCiAJZmVwLT5yeF9iZF9iYXNlID0gY2JkX2Jhc2U7CiAJaWYgKGZlcC0+YnVmZGVzY19leCkKQEAgLTIwMjQsMjEgKzI0MTEsMjEgQEAKIAl3cml0ZWwoRkVDX1JYX0RJU0FCTEVEX0lNQVNLLCBmZXAtPmh3cCArIEZFQ19JTUFTSyk7CiAJbmV0aWZfbmFwaV9hZGQobmRldiwgJmZlcC0+bmFwaSwgZmVjX2VuZXRfcnhfbmFwaSwgTkFQSV9QT0xMX1dFSUdIVCk7CiAKLQlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX0hBU19WTEFOKSB7CisJaWYgKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19IQVNfVkxBTikKIAkJLyogZW5hYmxlIGh3IFZMQU4gc3VwcG9ydCAqLwogCQluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKLQkJbmRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7Ci0JfQogCiAJaWYgKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19IQVNfQ1NVTSkgeworCQluZGV2LT5nc29fbWF4X3NlZ3MgPSBGRUNfTUFYX1RTT19TRUdTOworCiAJCS8qIGVuYWJsZSBodyBhY2NlbGVyYXRvciAqLwogCQluZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0KLQkJCQl8IE5FVElGX0ZfUlhDU1VNKTsKLQkJbmRldi0+aHdfZmVhdHVyZXMgfD0gKE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNCi0JCQkJfCBORVRJRl9GX1JYQ1NVTSk7CisJCQkJfCBORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX1RTTyk7CiAJCWZlcC0+Y3N1bV9mbGFncyB8PSBGTEFHX1JYX0NTVU1fRU5BQkxFRDsKIAl9CiAKKwluZGV2LT5od19mZWF0dXJlcyA9IG5kZXYtPmZlYXR1cmVzOworCiAJZmVjX3Jlc3RhcnQobmRldiwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIxMTQsNiArMjUwMSw5IEBACiAJCWZlcC0+cGF1c2VfZmxhZyB8PSBGRUNfUEFVU0VfRkxBR19BVVRPTkVHOwogI2VuZGlmCiAKKwkvKiBTZWxlY3QgZGVmYXVsdCBwaW4gc3RhdGUgKi8KKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKCZwZGV2LT5kZXYpOworCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJZmVwLT5od3AgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CiAJaWYgKElTX0VSUihmZXAtPmh3cCkpIHsKQEAgLTIxNjQsMjYgKzI1NTQsMTAgQEAKIAkJZmVwLT5idWZkZXNjX2V4ID0gMDsKIAl9CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZmVwLT5jbGtfYWhiKTsKKwlyZXQgPSBmZWNfZW5ldF9jbGtfZW5hYmxlKG5kZXYsIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkX2NsazsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShmZXAtPmNsa19pcGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbGVkX2Nsa19pcGc7Ci0KLQlpZiAoZmVwLT5jbGtfZW5ldF9vdXQpIHsKLQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGZlcC0+Y2xrX2VuZXRfb3V0KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZmFpbGVkX2Nsa19lbmV0X291dDsKLQl9Ci0KLQlpZiAoZmVwLT5jbGtfcHRwKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShmZXAtPmNsa19wdHApOwotCQlpZiAocmV0KQotCQkJZ290byBmYWlsZWRfY2xrX3B0cDsKLQl9Ci0KIAlmZXAtPnJlZ19waHkgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInBoeSIpOwogCWlmICghSVNfRVJSKGZlcC0+cmVnX3BoeSkpIHsKIAkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShmZXAtPnJlZ19waHkpOwpAQCAtMjIyNSw2ICsyNTk5LDggQEAKIAogCS8qIENhcnJpZXIgc3RhcnRzIGRvd24sIHBoeWxpYiB3aWxsIGJyaW5nIGl0IHVwICovCiAJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CisJZmVjX2VuZXRfY2xrX2VuYWJsZShuZGV2LCBmYWxzZSk7CisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoJnBkZXYtPmRldik7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJldCkKQEAgLTIyNDQsMTUgKzI2MjAsNyBAQAogCWlmIChmZXAtPnJlZ19waHkpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKGZlcC0+cmVnX3BoeSk7CiBmYWlsZWRfcmVndWxhdG9yOgotCWlmIChmZXAtPmNsa19wdHApCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19wdHApOwotZmFpbGVkX2Nsa19wdHA6Ci0JaWYgKGZlcC0+Y2xrX2VuZXRfb3V0KQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfZW5ldF9vdXQpOwotZmFpbGVkX2Nsa19lbmV0X291dDoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfaXBnKTsKLWZhaWxlZF9jbGtfaXBnOgotCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19haGIpOworCWZlY19lbmV0X2Nsa19lbmFibGUobmRldiwgZmFsc2UpOwogZmFpbGVkX2NsazoKIGZhaWxlZF9pb3JlbWFwOgogCWZyZWVfbmV0ZGV2KG5kZXYpOwpAQCAtMjI3MiwxNCArMjY0MCw5IEBACiAJZGVsX3RpbWVyX3N5bmMoJmZlcC0+dGltZV9rZWVwKTsKIAlpZiAoZmVwLT5yZWdfcGh5KQogCQlyZWd1bGF0b3JfZGlzYWJsZShmZXAtPnJlZ19waHkpOwotCWlmIChmZXAtPmNsa19wdHApCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19wdHApOwogCWlmIChmZXAtPnB0cF9jbG9jaykKIAkJcHRwX2Nsb2NrX3VucmVnaXN0ZXIoZmVwLT5wdHBfY2xvY2spOwotCWlmIChmZXAtPmNsa19lbmV0X291dCkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2VuZXRfb3V0KTsKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfaXBnKTsKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfYWhiKTsKKwlmZWNfZW5ldF9jbGtfZW5hYmxlKG5kZXYsIGZhbHNlKTsKIAlmcmVlX25ldGRldihuZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMjI5NiwxMiArMjY1OSw4IEBACiAJCWZlY19zdG9wKG5kZXYpOwogCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOwogCX0KLQlpZiAoZmVwLT5jbGtfcHRwKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfcHRwKTsKLQlpZiAoZmVwLT5jbGtfZW5ldF9vdXQpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShmZXAtPmNsa19lbmV0X291dCk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2lwZyk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2FoYik7CisJZmVjX2VuZXRfY2xrX2VuYWJsZShuZGV2LCBmYWxzZSk7CisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoJmZlcC0+cGRldi0+ZGV2KTsKIAogCWlmIChmZXAtPnJlZ19waHkpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKGZlcC0+cmVnX3BoeSk7CkBAIC0yMzIyLDI1ICsyNjgxLDEwIEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShmZXAtPmNsa19haGIpOworCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJmZlcC0+cGRldi0+ZGV2KTsKKwlyZXQgPSBmZWNfZW5ldF9jbGtfZW5hYmxlKG5kZXYsIHRydWUpOwogCWlmIChyZXQpCi0JCWdvdG8gZmFpbGVkX2Nsa19haGI7Ci0KLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZmVwLT5jbGtfaXBnKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWxlZF9jbGtfaXBnOwotCi0JaWYgKGZlcC0+Y2xrX2VuZXRfb3V0KSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShmZXAtPmNsa19lbmV0X291dCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGZhaWxlZF9jbGtfZW5ldF9vdXQ7Ci0JfQotCi0JaWYgKGZlcC0+Y2xrX3B0cCkgewotCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZmVwLT5jbGtfcHRwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZmFpbGVkX2Nsa19wdHA7Ci0JfQorCQlnb3RvIGZhaWxlZF9jbGs7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgewogCQlmZWNfcmVzdGFydChuZGV2LCBmZXAtPmZ1bGxfZHVwbGV4KTsKQEAgLTIzNDksMTQgKzI2OTMsNyBAQAogCiAJcmV0dXJuIDA7CiAKLWZhaWxlZF9jbGtfcHRwOgotCWlmIChmZXAtPmNsa19lbmV0X291dCkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2VuZXRfb3V0KTsKLWZhaWxlZF9jbGtfZW5ldF9vdXQ6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGZlcC0+Y2xrX2lwZyk7Ci1mYWlsZWRfY2xrX2lwZzoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZmVwLT5jbGtfYWhiKTsKLWZhaWxlZF9jbGtfYWhiOgorZmFpbGVkX2NsazoKIAlpZiAoZmVwLT5yZWdfcGh5KQogCQlyZWd1bGF0b3JfZGlzYWJsZShmZXAtPnJlZ19waHkpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IGRjODBkYjQuLmNmYWYxN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC03OTIsMTAgKzc5Miw2IEBACiAJcGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3QoZGV2LCBmZXAtPmZwaS0+cGh5X25vZGUsICZmc19hZGp1c3RfbGluaywgMCwKIAkJCQlpZmFjZSk7CiAJaWYgKCFwaHlkZXYpIHsKLQkJcGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayhkZXYsICZmc19hZGp1c3RfbGluaywKLQkJCQkJCSAgIGlmYWNlKTsKLQl9Ci0JaWYgKCFwaHlkZXYpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTEwMjksOSArMTAyNSwxNiBAQAogCWZwaS0+dXNlX25hcGkgPSAxOwogCWZwaS0+bmFwaV93ZWlnaHQgPSAxNzsKIAlmcGktPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShvZmRldi0+ZGV2Lm9mX25vZGUsICJwaHktaGFuZGxlIiwgMCk7Ci0JaWYgKCghZnBpLT5waHlfbm9kZSkgJiYgKCFvZl9nZXRfcHJvcGVydHkob2ZkZXYtPmRldi5vZl9ub2RlLCAiZml4ZWQtbGluayIsCi0JCQkJCQkgIE5VTEwpKSkKLQkJZ290byBvdXRfZnJlZV9mcGk7CisJaWYgKCFmcGktPnBoeV9ub2RlICYmIG9mX3BoeV9pc19maXhlZF9saW5rKG9mZGV2LT5kZXYub2Zfbm9kZSkpIHsKKwkJZXJyID0gb2ZfcGh5X3JlZ2lzdGVyX2ZpeGVkX2xpbmsob2ZkZXYtPmRldi5vZl9ub2RlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2ZyZWVfZnBpOworCisJCS8qIEluIHRoZSBjYXNlIG9mIGEgZml4ZWQgUEhZLCB0aGUgRFQgbm9kZSBhc3NvY2lhdGVkCisJCSAqIHRvIHRoZSBQSFkgaXMgdGhlIEV0aGVybmV0IE1BQyBEVCBub2RlLgorCQkgKi8KKwkJZnBpLT5waHlfbm9kZSA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKKwl9CiAKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUob2ZkZXYtPmRldi5vZl9ub2RlLCAiZnNsLG1wYzUxMjUtZmVjIikpIHsKIAkJcGh5X2Nvbm5lY3Rpb25fdHlwZSA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwppbmRleCBlZTZkZGJkLi5hNmNmNDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKQEAgLTg4OSw2ICs4ODksMTcgQEAKIAogCXByaXYtPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBoeS1oYW5kbGUiLCAwKTsKIAorCS8qIEluIHRoZSBjYXNlIG9mIGEgZml4ZWQgUEhZLCB0aGUgRFQgbm9kZSBhc3NvY2lhdGVkCisJICogdG8gdGhlIFBIWSBpcyB0aGUgRXRoZXJuZXQgTUFDIERUIG5vZGUuCisJICovCisJaWYgKG9mX3BoeV9pc19maXhlZF9saW5rKG5wKSkgeworCQllcnIgPSBvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluayhucCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9ncnBfaW5pdDsKKworCQlwcml2LT5waHlfbm9kZSA9IG5wOworCX0KKwogCS8qIEZpbmQgdGhlIFRCSSBQSFkuICBJZiBpdCdzIG5vdCB0aGVyZSwgd2UgZG9uJ3Qgc3VwcG9ydCBTR01JSSAqLwogCXByaXYtPnRiaV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInRiaS1oYW5kbGUiLCAwKTsKIApAQCAtMTIzMSw3ICsxMjQyLDcgQEAKIAkJZ2Zhcl93cml0ZV9pc3JnKHByaXYpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2Zhcl9pbml0X2FkZHJfaGFzaF90YWJsZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQorc3RhdGljIHZvaWQgZ2Zhcl9pbml0X2FkZHJfaGFzaF90YWJsZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQogewogCXN0cnVjdCBnZmFyIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5nZmFyZ3JwWzBdLnJlZ3M7CiAKQEAgLTEzNzMsNiArMTM4NCw5IEBACiAKIAlnZmFyX2h3X2luaXQocHJpdik7CiAKKwkvKiBDYXJyaWVyIHN0YXJ0cyBkb3duLCBwaHlsaWIgd2lsbCBicmluZyBpdCB1cCAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAogCWlmIChlcnIpIHsKQEAgLTEzODAsOSArMTM5NCw2IEBACiAJCWdvdG8gcmVnaXN0ZXJfZmFpbDsKIAl9CiAKLQkvKiBDYXJyaWVyIHN0YXJ0cyBkb3duLCBwaHlsaWIgd2lsbCBicmluZyBpdCB1cCAqLwotCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0KIAlkZXZpY2VfaW5pdF93YWtldXAoJmRldi0+ZGV2LAogCQkJICAgcHJpdi0+ZGV2aWNlX2ZsYWdzICYKIAkJCSAgIEZTTF9HSUFORkFSX0RFVl9IQVNfTUFHSUNfUEFDS0VUKTsKQEAgLTE2NjAsOSArMTY3MSw2IEBACiAKIAlwcml2LT5waHlkZXYgPSBvZl9waHlfY29ubmVjdChkZXYsIHByaXYtPnBoeV9ub2RlLCAmYWRqdXN0X2xpbmssIDAsCiAJCQkJICAgICAgaW50ZXJmYWNlKTsKLQlpZiAoIXByaXYtPnBoeWRldikKLQkJcHJpdi0+cGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayhkZXYsICZhZGp1c3RfbGluaywKLQkJCQkJCQkgaW50ZXJmYWNlKTsKIAlpZiAoIXByaXYtPnBoeWRldikgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgImNvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCmluZGV4IGM4Mjk5YzMuLmZhYjM5ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCkBAIC0xNzI4LDkgKzE3MjgsNiBAQAogCiAJcGh5ZGV2ID0gb2ZfcGh5X2Nvbm5lY3QoZGV2LCB1Z19pbmZvLT5waHlfbm9kZSwgJmFkanVzdF9saW5rLCAwLAogCQkJCXByaXYtPnBoeV9pbnRlcmZhY2UpOwotCWlmICghcGh5ZGV2KQotCQlwaHlkZXYgPSBvZl9waHlfY29ubmVjdF9maXhlZF9saW5rKGRldiwgJmFkanVzdF9saW5rLAotCQkJCQkJICAgcHJpdi0+cGh5X2ludGVyZmFjZSk7CiAJaWYgKCFwaHlkZXYpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzc5MCw2ICszNzg3LDE3IEBACiAJdWdfaW5mby0+dWZfaW5mby5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAKIAl1Z19pbmZvLT5waHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJwaHktaGFuZGxlIiwgMCk7CisJaWYgKCF1Z19pbmZvLT5waHlfbm9kZSkgeworCQkvKiBJbiB0aGUgY2FzZSBvZiBhIGZpeGVkIFBIWSwgdGhlIERUIG5vZGUgYXNzb2NpYXRlZAorCQkgKiB0byB0aGUgUEhZIGlzIHRoZSBFdGhlcm5ldCBNQUMgRFQgbm9kZS4KKwkJICovCisJCWlmIChvZl9waHlfaXNfZml4ZWRfbGluayhucCkpIHsKKwkJCWVyciA9IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKG5wKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQl1Z19pbmZvLT5waHlfbm9kZSA9IG5wOworCX0KIAogCS8qIEZpbmQgdGhlIFRCSSBQSFkgbm9kZS4gIElmIGl0J3Mgbm90IHRoZXJlLCB3ZSBkb24ndCBzdXBwb3J0IFNHTUlJICovCiAJdWdfaW5mby0+dGJpX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAidGJpLWhhbmRsZSIsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aF9ldGh0b29sLmMKaW5kZXggNDEzMzI5ZS4uY2M4MzM1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoX2V0aHRvb2wuYwpAQCAtNDE3LDUgKzQxNyw1IEBACiAKIHZvaWQgdWVjX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZ1ZWNfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmdWVjX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKaW5kZXggZDQ0OWZjYjkuLjBjOWQ1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYwpAQCAtMTYyLDcgKzE2Miw5IEBACiAKIAkvKiBSZXR1cm4gYWxsIEZzIGlmIG5vdGhpbmcgd2FzIHRoZXJlICovCiAJaWYgKGluX2JlMzIoJnJlZ3MtPm1kaW9fc3RhdCkgJiBNRElPX1NUQVRfUkRfRVIpIHsKLQkJZGV2X2VycigmYnVzLT5kZXYsICJNRElPIHJlYWQgZXJyb3JcbiIpOworCQlkZXZfZXJyKCZidXMtPmRldiwKKwkJCSJFcnJvciB3aGlsZSByZWFkaW5nIFBIWSVkIHJlZyBhdCAlZC4lZFxuIiwKKwkJCXBoeV9pZCwgZGV2X2FkZHIsIHJlZ251bSk7CiAJCXJldHVybiAweGZmZmY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mdWppdHN1L2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Z1aml0c3UvZm12ajE4eF9jcy5jCmluZGV4IDdiZWNhYjEuLmNmZTdhNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Z1aml0c3UvZm12ajE4eF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Z1aml0c3UvZm12ajE4eF9jcy5jCkBAIC0yNTYsNyArMjU2LDcgQEAKICAgICBkZXYtPm5ldGRldl9vcHMgPSAmZmpuX25ldGRldl9vcHM7CiAgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKLSAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKyAgICBkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKIAogICAgIHJldHVybiBmbXZqMTh4X2NvbmZpZyhsaW5rKTsKIH0gLyogZm12ajE4eF9hdHRhY2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0MjE3MzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorIworIyBISVNJTElDT04gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIE5FVF9WRU5ET1JfSElTSUxJQ09OCisJYm9vbCAiSGlzaWxpY29uIGRldmljZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBUk0KKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWQorCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgSGlzaWxpY29uIGRldmljZXMuIElmIHlvdSBzYXkgWSwgeW91IHdpbGwgYmUgYXNrZWQKKwkgIGZvciB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCisKK2lmIE5FVF9WRU5ET1JfSElTSUxJQ09OCisKK2NvbmZpZyBISVg1SEQyX0dNQUMKKwl0cmlzdGF0ZSAiSGlzaWxpY29uIEhJWDVIRDIgRmFtaWx5IE5ldHdvcmsgRGV2aWNlIFN1cHBvcnQiCisJc2VsZWN0IFBIWUxJQgorCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyB0aGUgaGl4NWhkMiBtYWMgZmFtaWx5IG5ldHdvcmsgZGV2aWNlLgorCitlbmRpZiAjIE5FVF9WRU5ET1JfSElTSUxJQ09OCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3NWU4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgSElTSUxJQ09OIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19ISVg1SEQyX0dNQUMpICs9IGhpeDVoZDJfZ21hYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmZGNkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXg1aGQyX2dtYWMuYwpAQCAtMCwwICsxLDEwNjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCBMaW5hcm8gTHRkLgorICogQ29weXJpZ2h0IChjKSAyMDE0IEhpc2lsaWNvbiBMaW1pdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisKKyNkZWZpbmUgU1RBVElPTl9BRERSX0xPVwkJMHgwMDAwCisjZGVmaW5lIFNUQVRJT05fQUREUl9ISUdICQkweDAwMDQKKyNkZWZpbmUgTUFDX0RVUExFWF9IQUxGX0NUUkwJCTB4MDAwOAorI2RlZmluZSBNQVhfRlJNX1NJWkUJCQkweDAwM2MKKyNkZWZpbmUgUE9SVF9NT0RFCQkJMHgwMDQwCisjZGVmaW5lIFBPUlRfRU4JCQkJMHgwMDQ0CisjZGVmaW5lIEJJVFNfVFhfRU4JCQlCSVQoMikKKyNkZWZpbmUgQklUU19SWF9FTgkJCUJJVCgxKQorI2RlZmluZSBSRUNfRklMVF9DT05UUk9MCQkweDAwNjQKKyNkZWZpbmUgQklUX0NSQ19FUlJfUEFTUwkJQklUKDUpCisjZGVmaW5lIEJJVF9QQVVTRV9GUk1fUEFTUwkJQklUKDQpCisjZGVmaW5lIEJJVF9WTEFOX0RST1BfRU4JCUJJVCgzKQorI2RlZmluZSBCSVRfQkNfRFJPUF9FTgkJCUJJVCgyKQorI2RlZmluZSBCSVRfTUNfTUFUQ0hfRU4JCQlCSVQoMSkKKyNkZWZpbmUgQklUX1VDX01BVENIX0VOCQkJQklUKDApCisjZGVmaW5lIFBPUlRfTUNfQUREUl9MT1cJCTB4MDA2OAorI2RlZmluZSBQT1JUX01DX0FERFJfSElHSAkJMHgwMDZDCisjZGVmaW5lIENGX0NSQ19TVFJJUAkJCTB4MDFiMAorI2RlZmluZSBNT0RFX0NIQU5HRV9FTgkJCTB4MDFiNAorI2RlZmluZSBCSVRfTU9ERV9DSEFOR0VfRU4JCUJJVCgwKQorI2RlZmluZSBDT0xfU0xPVF9USU1FCQkJMHgwMWMwCisjZGVmaW5lIFJFQ1ZfQ09OVFJPTAkJCTB4MDFlMAorI2RlZmluZSBCSVRfU1RSSVBfUEFEX0VOCQlCSVQoMykKKyNkZWZpbmUgQklUX1JVTlRfUEtUX0VOCQkJQklUKDQpCisjZGVmaW5lIENPTlRST0xfV09SRAkJCTB4MDIxNAorI2RlZmluZSBNRElPX1NJTkdMRV9DTUQJCQkweDAzYzAKKyNkZWZpbmUgTURJT19TSU5HTEVfREFUQQkJMHgwM2M0CisjZGVmaW5lIE1ESU9fQ1RSTAkJCTB4MDNjYworI2RlZmluZSBNRElPX1JEQVRBX1NUQVRVUwkJMHgwM2QwCisKKyNkZWZpbmUgTURJT19TVEFSVAkJCUJJVCgyMCkKKyNkZWZpbmUgTURJT19SX1ZBTElECQkJQklUKDApCisjZGVmaW5lIE1ESU9fUkVBRAkJCShCSVQoMTcpIHwgTURJT19TVEFSVCkKKyNkZWZpbmUgTURJT19XUklURQkJCShCSVQoMTYpIHwgTURJT19TVEFSVCkKKworI2RlZmluZSBSWF9GUV9TVEFSVF9BRERSCQkweDA1MDAKKyNkZWZpbmUgUlhfRlFfREVQVEgJCQkweDA1MDQKKyNkZWZpbmUgUlhfRlFfV1JfQUREUgkJCTB4MDUwOAorI2RlZmluZSBSWF9GUV9SRF9BRERSCQkJMHgwNTBjCisjZGVmaW5lIFJYX0ZRX1ZMRERFU0NfQ05UCQkweDA1MTAKKyNkZWZpbmUgUlhfRlFfQUxFTVBUWV9USAkJMHgwNTE0CisjZGVmaW5lIFJYX0ZRX1JFR19FTgkJCTB4MDUxOAorI2RlZmluZSBCSVRTX1JYX0ZRX1NUQVJUX0FERFJfRU4JQklUKDIpCisjZGVmaW5lIEJJVFNfUlhfRlFfREVQVEhfRU4JCUJJVCgxKQorI2RlZmluZSBCSVRTX1JYX0ZRX1JEX0FERFJfRU4JCUJJVCgwKQorI2RlZmluZSBSWF9GUV9BTEZVTExfVEgJCQkweDA1MWMKKyNkZWZpbmUgUlhfQlFfU1RBUlRfQUREUgkJMHgwNTIwCisjZGVmaW5lIFJYX0JRX0RFUFRICQkJMHgwNTI0CisjZGVmaW5lIFJYX0JRX1dSX0FERFIJCQkweDA1MjgKKyNkZWZpbmUgUlhfQlFfUkRfQUREUgkJCTB4MDUyYworI2RlZmluZSBSWF9CUV9GUkVFX0RFU0NfQ05UCQkweDA1MzAKKyNkZWZpbmUgUlhfQlFfQUxFTVBUWV9USAkJMHgwNTM0CisjZGVmaW5lIFJYX0JRX1JFR19FTgkJCTB4MDUzOAorI2RlZmluZSBCSVRTX1JYX0JRX1NUQVJUX0FERFJfRU4JQklUKDIpCisjZGVmaW5lIEJJVFNfUlhfQlFfREVQVEhfRU4JCUJJVCgxKQorI2RlZmluZSBCSVRTX1JYX0JRX1dSX0FERFJfRU4JCUJJVCgwKQorI2RlZmluZSBSWF9CUV9BTEZVTExfVEgJCQkweDA1M2MKKyNkZWZpbmUgVFhfQlFfU1RBUlRfQUREUgkJMHgwNTgwCisjZGVmaW5lIFRYX0JRX0RFUFRICQkJMHgwNTg0CisjZGVmaW5lIFRYX0JRX1dSX0FERFIJCQkweDA1ODgKKyNkZWZpbmUgVFhfQlFfUkRfQUREUgkJCTB4MDU4YworI2RlZmluZSBUWF9CUV9WTERERVNDX0NOVAkJMHgwNTkwCisjZGVmaW5lIFRYX0JRX0FMRU1QVFlfVEgJCTB4MDU5NAorI2RlZmluZSBUWF9CUV9SRUdfRU4JCQkweDA1OTgKKyNkZWZpbmUgQklUU19UWF9CUV9TVEFSVF9BRERSX0VOCUJJVCgyKQorI2RlZmluZSBCSVRTX1RYX0JRX0RFUFRIX0VOCQlCSVQoMSkKKyNkZWZpbmUgQklUU19UWF9CUV9SRF9BRERSX0VOCQlCSVQoMCkKKyNkZWZpbmUgVFhfQlFfQUxGVUxMX1RICQkJMHgwNTljCisjZGVmaW5lIFRYX1JRX1NUQVJUX0FERFIJCTB4MDVhMAorI2RlZmluZSBUWF9SUV9ERVBUSAkJCTB4MDVhNAorI2RlZmluZSBUWF9SUV9XUl9BRERSCQkJMHgwNWE4CisjZGVmaW5lIFRYX1JRX1JEX0FERFIJCQkweDA1YWMKKyNkZWZpbmUgVFhfUlFfRlJFRV9ERVNDX0NOVAkJMHgwNWIwCisjZGVmaW5lIFRYX1JRX0FMRU1QVFlfVEgJCTB4MDViNAorI2RlZmluZSBUWF9SUV9SRUdfRU4JCQkweDA1YjgKKyNkZWZpbmUgQklUU19UWF9SUV9TVEFSVF9BRERSX0VOCUJJVCgyKQorI2RlZmluZSBCSVRTX1RYX1JRX0RFUFRIX0VOCQlCSVQoMSkKKyNkZWZpbmUgQklUU19UWF9SUV9XUl9BRERSX0VOCQlCSVQoMCkKKyNkZWZpbmUgVFhfUlFfQUxGVUxMX1RICQkJMHgwNWJjCisjZGVmaW5lIFJBV19QTVVfSU5UCQkJMHgwNWMwCisjZGVmaW5lIEVOQV9QTVVfSU5UCQkJMHgwNWM0CisjZGVmaW5lIFNUQVRVU19QTVVfSU5UCQkJMHgwNWM4CisjZGVmaW5lIE1BQ19GSUZPX0VSUl9JTgkJCUJJVCgzMCkKKyNkZWZpbmUgVFhfUlFfSU5fVElNRU9VVF9JTlQJCUJJVCgyOSkKKyNkZWZpbmUgUlhfQlFfSU5fVElNRU9VVF9JTlQJCUJJVCgyOCkKKyNkZWZpbmUgVFhPVVRDRkZfRlVMTF9JTlQJCUJJVCgyNykKKyNkZWZpbmUgVFhPVVRDRkZfRU1QVFlfSU5UCQlCSVQoMjYpCisjZGVmaW5lIFRYQ0ZGX0ZVTExfSU5UCQkJQklUKDI1KQorI2RlZmluZSBUWENGRl9FTVBUWV9JTlQJCQlCSVQoMjQpCisjZGVmaW5lIFJYT1VUQ0ZGX0ZVTExfSU5UCQlCSVQoMjMpCisjZGVmaW5lIFJYT1VUQ0ZGX0VNUFRZX0lOVAkJQklUKDIyKQorI2RlZmluZSBSWENGRl9GVUxMX0lOVAkJCUJJVCgyMSkKKyNkZWZpbmUgUlhDRkZfRU1QVFlfSU5UCQkJQklUKDIwKQorI2RlZmluZSBUWF9SUV9JTl9JTlQJCQlCSVQoMTkpCisjZGVmaW5lIFRYX0JRX09VVF9JTlQJCQlCSVQoMTgpCisjZGVmaW5lIFJYX0JRX0lOX0lOVAkJCUJJVCgxNykKKyNkZWZpbmUgUlhfRlFfT1VUX0lOVAkJCUJJVCgxNikKKyNkZWZpbmUgVFhfUlFfRU1QVFlfSU5UCQkJQklUKDE1KQorI2RlZmluZSBUWF9SUV9GVUxMX0lOVAkJCUJJVCgxNCkKKyNkZWZpbmUgVFhfUlFfQUxFTVBUWV9JTlQJCUJJVCgxMykKKyNkZWZpbmUgVFhfUlFfQUxGVUxMX0lOVAkJQklUKDEyKQorI2RlZmluZSBUWF9CUV9FTVBUWV9JTlQJCQlCSVQoMTEpCisjZGVmaW5lIFRYX0JRX0ZVTExfSU5UCQkJQklUKDEwKQorI2RlZmluZSBUWF9CUV9BTEVNUFRZX0lOVAkJQklUKDkpCisjZGVmaW5lIFRYX0JRX0FMRlVMTF9JTlQJCUJJVCg4KQorI2RlZmluZSBSWF9CUV9FTVBUWV9JTlQJCQlCSVQoNykKKyNkZWZpbmUgUlhfQlFfRlVMTF9JTlQJCQlCSVQoNikKKyNkZWZpbmUgUlhfQlFfQUxFTVBUWV9JTlQJCUJJVCg1KQorI2RlZmluZSBSWF9CUV9BTEZVTExfSU5UCQlCSVQoNCkKKyNkZWZpbmUgUlhfRlFfRU1QVFlfSU5UCQkJQklUKDMpCisjZGVmaW5lIFJYX0ZRX0ZVTExfSU5UCQkJQklUKDIpCisjZGVmaW5lIFJYX0ZRX0FMRU1QVFlfSU5UCQlCSVQoMSkKKyNkZWZpbmUgUlhfRlFfQUxGVUxMX0lOVAkJQklUKDApCisKKyNkZWZpbmUgREVGX0lOVF9NQVNLCQkJKFJYX0JRX0lOX0lOVCB8IFJYX0JRX0lOX1RJTUVPVVRfSU5UIHwgXAorCQkJCQlUWF9SUV9JTl9JTlQgfCBUWF9SUV9JTl9USU1FT1VUX0lOVCkKKworI2RlZmluZSBERVNDX1dSX1JEX0VOQQkJCTB4MDVjYworI2RlZmluZSBJTl9RVUVVRV9USAkJCTB4MDVkOAorI2RlZmluZSBPVVRfUVVFVUVfVEgJCQkweDA1ZGMKKyNkZWZpbmUgUVVFVUVfVFhfQlFfU0hJRlQJCTE2CisjZGVmaW5lIFJYX0JRX0lOX1RJTUVPVVRfVEgJCTB4MDVlMAorI2RlZmluZSBUWF9SUV9JTl9USU1FT1VUX1RICQkweDA1ZTQKKyNkZWZpbmUgU1RPUF9DTUQJCQkweDA1ZTgKKyNkZWZpbmUgQklUU19UWF9TVE9QCQkJQklUKDEpCisjZGVmaW5lIEJJVFNfUlhfU1RPUAkJCUJJVCgwKQorI2RlZmluZSBGTFVTSF9DTUQJCQkweDA1ZUMKKyNkZWZpbmUgQklUU19UWF9GTFVTSF9DTUQJCUJJVCg1KQorI2RlZmluZSBCSVRTX1JYX0ZMVVNIX0NNRAkJQklUKDQpCisjZGVmaW5lIEJJVFNfVFhfRkxVU0hfRkxBR19ET1dOCQlCSVQoMykKKyNkZWZpbmUgQklUU19UWF9GTFVTSF9GTEFHX1VQCQlCSVQoMikKKyNkZWZpbmUgQklUU19SWF9GTFVTSF9GTEFHX0RPV04JCUJJVCgxKQorI2RlZmluZSBCSVRTX1JYX0ZMVVNIX0ZMQUdfVVAJCUJJVCgwKQorI2RlZmluZSBSWF9DRkZfTlVNX1JFRwkJCTB4MDVmMAorI2RlZmluZSBQTVVfRlNNX1JFRwkJCTB4MDVmOAorI2RlZmluZSBSWF9GSUZPX1BLVF9JTl9OVU0JCTB4MDVmYworI2RlZmluZSBSWF9GSUZPX1BLVF9PVVRfTlVNCQkweDA2MDAKKworI2RlZmluZSBSR01JSV9TUEVFRF8xMDAwCQkweDJjCisjZGVmaW5lIFJHTUlJX1NQRUVEXzEwMAkJCTB4MmYKKyNkZWZpbmUgUkdNSUlfU1BFRURfMTAJCQkweDJkCisjZGVmaW5lIE1JSV9TUEVFRF8xMDAJCQkweDBmCisjZGVmaW5lIE1JSV9TUEVFRF8xMAkJCTB4MGQKKyNkZWZpbmUgR01BQ19TUEVFRF8xMDAwCQkJMHgwNQorI2RlZmluZSBHTUFDX1NQRUVEXzEwMAkJCTB4MDEKKyNkZWZpbmUgR01BQ19TUEVFRF8xMAkJCTB4MDAKKyNkZWZpbmUgR01BQ19GVUxMX0RVUExFWAkJQklUKDQpCisKKyNkZWZpbmUgUlhfQlFfSU5UX1RIUkVTSE9MRAkJMHgwMQorI2RlZmluZSBUWF9SUV9JTlRfVEhSRVNIT0xECQkweDAxCisjZGVmaW5lIFJYX0JRX0lOX1RJTUVPVVQJCTB4MTAwMDAKKyNkZWZpbmUgVFhfUlFfSU5fVElNRU9VVAkJMHg1MDAwMAorCisjZGVmaW5lIE1BQ19NQVhfRlJBTUVfU0laRQkJMTYwMAorI2RlZmluZSBERVNDX1NJWkUJCQkzMgorI2RlZmluZSBSWF9ERVNDX05VTQkJCTEwMjQKKyNkZWZpbmUgVFhfREVTQ19OVU0JCQkxMDI0CisKKyNkZWZpbmUgREVTQ19WTERfRlJFRQkJCTAKKyNkZWZpbmUgREVTQ19WTERfQlVTWQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgREVTQ19GTF9NSUQJCQkwCisjZGVmaW5lIERFU0NfRkxfTEFTVAkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgREVTQ19GTF9GSVJTVAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgREVTQ19GTF9GVUxMCQkJMHg2MDAwMDAwMAorI2RlZmluZSBERVNDX0RBVEFfTEVOX09GRgkJMTYKKyNkZWZpbmUgREVTQ19CVUZGX0xFTl9PRkYJCTAKKyNkZWZpbmUgREVTQ19EQVRBX01BU0sJCQkweDdmZgorCisvKiBETUEgZGVzY3JpcHRvciByaW5nIGhlbHBlcnMgKi8KKyNkZWZpbmUgZG1hX3JpbmdfaW5jcihuLCBzKQkJKCgobikgKyAxKSAmICgocykgLSAxKSkKKyNkZWZpbmUgZG1hX2NudChuKQkJCSgobikgPj4gNSkKKyNkZWZpbmUgZG1hX2J5dGUobikJCQkoKG4pIDw8IDUpCisKK3N0cnVjdCBoaXg1aGQyX2Rlc2MgeworCV9fbGUzMiBidWZmX2FkZHI7CisJX19sZTMyIGNtZDsKK30gX19hbGlnbmVkKDMyKTsKKworc3RydWN0IGhpeDVoZDJfZGVzY19zdyB7CisJc3RydWN0IGhpeDVoZDJfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90CXBoeXNfYWRkcjsKKwl1bnNpZ25lZCBpbnQJY291bnQ7CisJdW5zaWduZWQgaW50CXNpemU7Cit9OworCisjZGVmaW5lIFFVRVVFX05VTVMJNAorc3RydWN0IGhpeDVoZDJfcHJpdiB7CisJc3RydWN0IGhpeDVoZDJfZGVzY19zdyBwb29sW1FVRVVFX05VTVNdOworI2RlZmluZSByeF9mcQkJcG9vbFswXQorI2RlZmluZSByeF9icQkJcG9vbFsxXQorI2RlZmluZSB0eF9icQkJcG9vbFsyXQorI2RlZmluZSB0eF9ycQkJcG9vbFszXQorCisJdm9pZCBfX2lvbWVtICpiYXNlOworCXZvaWQgX19pb21lbSAqY3RybF9iYXNlOworCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYltUWF9ERVNDX05VTV07CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYltSWF9ERVNDX05VTV07CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHk7CisJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbm9kZTsKKwlwaHlfaW50ZXJmYWNlX3QJcGh5X21vZGU7CisKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisJdW5zaWduZWQgaW50IGR1cGxleDsKKworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgbWlpX2J1cyAqYnVzOworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7Cit9OworCitzdGF0aWMgdm9pZCBoaXg1aGQyX2NvbmZpZ19wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzcGVlZCwgdTMyIGR1cGxleCkKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgdmFsOworCisJcHJpdi0+c3BlZWQgPSBzcGVlZDsKKwlwcml2LT5kdXBsZXggPSBkdXBsZXg7CisKKwlzd2l0Y2ggKHByaXYtPnBoeV9tb2RlKSB7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKQorCQkJdmFsID0gUkdNSUlfU1BFRURfMTAwMDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdmFsID0gUkdNSUlfU1BFRURfMTAwOworCQllbHNlCisJCQl2YWwgPSBSR01JSV9TUEVFRF8xMDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfTUlJOgorCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdmFsID0gTUlJX1NQRUVEXzEwMDsKKwkJZWxzZQorCQkJdmFsID0gTUlJX1NQRUVEXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRkZXZfd2FybihkZXYsICJub3Qgc3VwcG9ydGVkIG1vZGVcbiIpOworCQl2YWwgPSBNSUlfU1BFRURfMTA7CisJCWJyZWFrOworCX0KKworCWlmIChkdXBsZXgpCisJCXZhbCB8PSBHTUFDX0ZVTExfRFVQTEVYOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcHJpdi0+Y3RybF9iYXNlKTsKKworCXdyaXRlbF9yZWxheGVkKEJJVF9NT0RFX0NIQU5HRV9FTiwgcHJpdi0+YmFzZSArIE1PREVfQ0hBTkdFX0VOKTsKKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJdmFsID0gR01BQ19TUEVFRF8xMDAwOworCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMCkKKwkJdmFsID0gR01BQ19TUEVFRF8xMDA7CisJZWxzZQorCQl2YWwgPSBHTUFDX1NQRUVEXzEwOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcHJpdi0+YmFzZSArIFBPUlRfTU9ERSk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIE1PREVfQ0hBTkdFX0VOKTsKKwl3cml0ZWxfcmVsYXhlZChkdXBsZXgsIHByaXYtPmJhc2UgKyBNQUNfRFVQTEVYX0hBTEZfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfc2V0X2Rlc2NfZGVwdGgoc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiwgaW50IHJ4LCBpbnQgdHgpCit7CisJd3JpdGVsX3JlbGF4ZWQoQklUU19SWF9GUV9ERVBUSF9FTiwgcHJpdi0+YmFzZSArIFJYX0ZRX1JFR19FTik7CisJd3JpdGVsX3JlbGF4ZWQocnggPDwgMywgcHJpdi0+YmFzZSArIFJYX0ZRX0RFUFRIKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwcml2LT5iYXNlICsgUlhfRlFfUkVHX0VOKTsKKworCXdyaXRlbF9yZWxheGVkKEJJVFNfUlhfQlFfREVQVEhfRU4sIHByaXYtPmJhc2UgKyBSWF9CUV9SRUdfRU4pOworCXdyaXRlbF9yZWxheGVkKHJ4IDw8IDMsIHByaXYtPmJhc2UgKyBSWF9CUV9ERVBUSCk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIFJYX0JRX1JFR19FTik7CisKKwl3cml0ZWxfcmVsYXhlZChCSVRTX1RYX0JRX0RFUFRIX0VOLCBwcml2LT5iYXNlICsgVFhfQlFfUkVHX0VOKTsKKwl3cml0ZWxfcmVsYXhlZCh0eCA8PCAzLCBwcml2LT5iYXNlICsgVFhfQlFfREVQVEgpOworCXdyaXRlbF9yZWxheGVkKDAsIHByaXYtPmJhc2UgKyBUWF9CUV9SRUdfRU4pOworCisJd3JpdGVsX3JlbGF4ZWQoQklUU19UWF9SUV9ERVBUSF9FTiwgcHJpdi0+YmFzZSArIFRYX1JRX1JFR19FTik7CisJd3JpdGVsX3JlbGF4ZWQodHggPDwgMywgcHJpdi0+YmFzZSArIFRYX1JRX0RFUFRIKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwcml2LT5iYXNlICsgVFhfUlFfUkVHX0VOKTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9zZXRfcnhfZnEoc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiwgZG1hX2FkZHJfdCBwaHlfYWRkcikKK3sKKwl3cml0ZWxfcmVsYXhlZChCSVRTX1JYX0ZRX1NUQVJUX0FERFJfRU4sIHByaXYtPmJhc2UgKyBSWF9GUV9SRUdfRU4pOworCXdyaXRlbF9yZWxheGVkKHBoeV9hZGRyLCBwcml2LT5iYXNlICsgUlhfRlFfU1RBUlRfQUREUik7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIFJYX0ZRX1JFR19FTik7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfc2V0X3J4X2JxKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYsIGRtYV9hZGRyX3QgcGh5X2FkZHIpCit7CisJd3JpdGVsX3JlbGF4ZWQoQklUU19SWF9CUV9TVEFSVF9BRERSX0VOLCBwcml2LT5iYXNlICsgUlhfQlFfUkVHX0VOKTsKKwl3cml0ZWxfcmVsYXhlZChwaHlfYWRkciwgcHJpdi0+YmFzZSArIFJYX0JRX1NUQVJUX0FERFIpOworCXdyaXRlbF9yZWxheGVkKDAsIHByaXYtPmJhc2UgKyBSWF9CUV9SRUdfRU4pOworfQorCitzdGF0aWMgdm9pZCBoaXg1aGQyX3NldF90eF9icShzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2LCBkbWFfYWRkcl90IHBoeV9hZGRyKQoreworCXdyaXRlbF9yZWxheGVkKEJJVFNfVFhfQlFfU1RBUlRfQUREUl9FTiwgcHJpdi0+YmFzZSArIFRYX0JRX1JFR19FTik7CisJd3JpdGVsX3JlbGF4ZWQocGh5X2FkZHIsIHByaXYtPmJhc2UgKyBUWF9CUV9TVEFSVF9BRERSKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwcml2LT5iYXNlICsgVFhfQlFfUkVHX0VOKTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9zZXRfdHhfcnEoc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiwgZG1hX2FkZHJfdCBwaHlfYWRkcikKK3sKKwl3cml0ZWxfcmVsYXhlZChCSVRTX1RYX1JRX1NUQVJUX0FERFJfRU4sIHByaXYtPmJhc2UgKyBUWF9SUV9SRUdfRU4pOworCXdyaXRlbF9yZWxheGVkKHBoeV9hZGRyLCBwcml2LT5iYXNlICsgVFhfUlFfU1RBUlRfQUREUik7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIFRYX1JRX1JFR19FTik7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfc2V0X2Rlc2NfYWRkcihzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2KQoreworCWhpeDVoZDJfc2V0X3J4X2ZxKHByaXYsIHByaXYtPnJ4X2ZxLnBoeXNfYWRkcik7CisJaGl4NWhkMl9zZXRfcnhfYnEocHJpdiwgcHJpdi0+cnhfYnEucGh5c19hZGRyKTsKKwloaXg1aGQyX3NldF90eF9ycShwcml2LCBwcml2LT50eF9ycS5waHlzX2FkZHIpOworCWhpeDVoZDJfc2V0X3R4X2JxKHByaXYsIHByaXYtPnR4X2JxLnBoeXNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfaHdfaW5pdChzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2KQoreworCXUzMiB2YWw7CisKKwkvKiBkaXNhYmxlIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCXdyaXRlbF9yZWxheGVkKDAsIHByaXYtPmJhc2UgKyBFTkFfUE1VX0lOVCk7CisJd3JpdGVsX3JlbGF4ZWQofjAsIHByaXYtPmJhc2UgKyBSQVdfUE1VX0lOVCk7CisKKwl3cml0ZWxfcmVsYXhlZChCSVRfQ1JDX0VSUl9QQVNTLCBwcml2LT5iYXNlICsgUkVDX0ZJTFRfQ09OVFJPTCk7CisJd3JpdGVsX3JlbGF4ZWQoTUFDX01BWF9GUkFNRV9TSVpFLCBwcml2LT5iYXNlICsgQ09OVFJPTF9XT1JEKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwcml2LT5iYXNlICsgQ09MX1NMT1RfVElNRSk7CisKKwl2YWwgPSBSWF9CUV9JTlRfVEhSRVNIT0xEIHwgVFhfUlFfSU5UX1RIUkVTSE9MRCA8PCBRVUVVRV9UWF9CUV9TSElGVDsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHByaXYtPmJhc2UgKyBJTl9RVUVVRV9USCk7CisKKwl3cml0ZWxfcmVsYXhlZChSWF9CUV9JTl9USU1FT1VULCBwcml2LT5iYXNlICsgUlhfQlFfSU5fVElNRU9VVF9USCk7CisJd3JpdGVsX3JlbGF4ZWQoVFhfUlFfSU5fVElNRU9VVCwgcHJpdi0+YmFzZSArIFRYX1JRX0lOX1RJTUVPVVRfVEgpOworCisJaGl4NWhkMl9zZXRfZGVzY19kZXB0aChwcml2LCBSWF9ERVNDX05VTSwgVFhfREVTQ19OVU0pOworCWhpeDVoZDJfc2V0X2Rlc2NfYWRkcihwcml2KTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9pcnFfZW5hYmxlKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYpCit7CisJd3JpdGVsX3JlbGF4ZWQoREVGX0lOVF9NQVNLLCBwcml2LT5iYXNlICsgRU5BX1BNVV9JTlQpOworfQorCitzdGF0aWMgdm9pZCBoaXg1aGQyX2lycV9kaXNhYmxlKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYpCit7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIEVOQV9QTVVfSU5UKTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9wb3J0X2VuYWJsZShzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2KQoreworCXdyaXRlbF9yZWxheGVkKDB4ZiwgcHJpdi0+YmFzZSArIERFU0NfV1JfUkRfRU5BKTsKKwl3cml0ZWxfcmVsYXhlZChCSVRTX1JYX0VOIHwgQklUU19UWF9FTiwgcHJpdi0+YmFzZSArIFBPUlRfRU4pOworfQorCitzdGF0aWMgdm9pZCBoaXg1aGQyX3BvcnRfZGlzYWJsZShzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2KQoreworCXdyaXRlbF9yZWxheGVkKH4oQklUU19SWF9FTiB8IEJJVFNfVFhfRU4pLCBwcml2LT5iYXNlICsgUE9SVF9FTik7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcHJpdi0+YmFzZSArIERFU0NfV1JfUkRfRU5BKTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9od19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICptYWMgPSBkZXYtPmRldl9hZGRyOworCXUzMiB2YWw7CisKKwl2YWwgPSBtYWNbMV0gfCAobWFjWzBdIDw8IDgpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcHJpdi0+YmFzZSArIFNUQVRJT05fQUREUl9ISUdIKTsKKworCXZhbCA9IG1hY1s1XSB8IChtYWNbNF0gPDwgOCkgfCAobWFjWzNdIDw8IDE2KSB8IChtYWNbMl0gPDwgMjQpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcHJpdi0+YmFzZSArIFNUQVRJT05fQUREUl9MT1cpOworfQorCitzdGF0aWMgaW50IGhpeDVoZDJfbmV0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCWludCByZXQ7CisKKwlyZXQgPSBldGhfbWFjX2FkZHIoZGV2LCBwKTsKKwlpZiAoIXJldCkKKwkJaGl4NWhkMl9od19zZXRfbWFjX2FkZHIoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gcHJpdi0+cGh5OworCisJaWYgKChwcml2LT5zcGVlZCAhPSBwaHktPnNwZWVkKSB8fCAocHJpdi0+ZHVwbGV4ICE9IHBoeS0+ZHVwbGV4KSkgeworCQloaXg1aGQyX2NvbmZpZ19wb3J0KGRldiwgcGh5LT5zcGVlZCwgcGh5LT5kdXBsZXgpOworCQlwaHlfcHJpbnRfc3RhdHVzKHBoeSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoaXg1aGQyX3J4X3JlZmlsbChzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2KQoreworCXN0cnVjdCBoaXg1aGQyX2Rlc2MgKmRlc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgc3RhcnQsIGVuZCwgbnVtLCBwb3MsIGk7CisJdTMyIGxlbiA9IE1BQ19NQVhfRlJBTUVfU0laRTsKKwlkbWFfYWRkcl90IGFkZHI7CisKKwkvKiBzb2Z0d2FyZSB3cml0ZSBwb2ludGVyICovCisJc3RhcnQgPSBkbWFfY250KHJlYWRsX3JlbGF4ZWQocHJpdi0+YmFzZSArIFJYX0ZRX1dSX0FERFIpKTsKKwkvKiBsb2dpYyByZWFkIHBvaW50ZXIgKi8KKwllbmQgPSBkbWFfY250KHJlYWRsX3JlbGF4ZWQocHJpdi0+YmFzZSArIFJYX0ZRX1JEX0FERFIpKTsKKwludW0gPSBDSVJDX1NQQUNFKHN0YXJ0LCBlbmQsIFJYX0RFU0NfTlVNKTsKKworCWZvciAoaSA9IDAsIHBvcyA9IHN0YXJ0OyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKHByaXYtPnJ4X3NrYltwb3NdKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24ocHJpdi0+bmV0ZGV2LCBsZW4pOworCQkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWFkZHIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5kZXYsIHNrYi0+ZGF0YSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+ZGV2LCBhZGRyKSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVzYyA9IHByaXYtPnJ4X2ZxLmRlc2MgKyBwb3M7CisJCWRlc2MtPmJ1ZmZfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCQlwcml2LT5yeF9za2JbcG9zXSA9IHNrYjsKKwkJZGVzYy0+Y21kID0gY3B1X3RvX2xlMzIoREVTQ19WTERfRlJFRSB8CisJCQkJCShsZW4gLSAxKSA8PCBERVNDX0JVRkZfTEVOX09GRik7CisJCXBvcyA9IGRtYV9yaW5nX2luY3IocG9zLCBSWF9ERVNDX05VTSk7CisJfQorCisJLyogZW5zdXJlIGRlc2MgdXBkYXRlZCAqLworCXdtYigpOworCisJaWYgKHBvcyAhPSBzdGFydCkKKwkJd3JpdGVsX3JlbGF4ZWQoZG1hX2J5dGUocG9zKSwgcHJpdi0+YmFzZSArIFJYX0ZRX1dSX0FERFIpOworfQorCitzdGF0aWMgaW50IGhpeDVoZDJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxpbWl0KQoreworCXN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhpeDVoZDJfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IGFkZHI7CisJdTMyIHN0YXJ0LCBlbmQsIG51bSwgcG9zLCBpLCBsZW47CisKKwkvKiBzb2Z0d2FyZSByZWFkIHBvaW50ZXIgKi8KKwlzdGFydCA9IGRtYV9jbnQocmVhZGxfcmVsYXhlZChwcml2LT5iYXNlICsgUlhfQlFfUkRfQUREUikpOworCS8qIGxvZ2ljIHdyaXRlIHBvaW50ZXIgKi8KKwllbmQgPSBkbWFfY250KHJlYWRsX3JlbGF4ZWQocHJpdi0+YmFzZSArIFJYX0JRX1dSX0FERFIpKTsKKwludW0gPSBDSVJDX0NOVChlbmQsIHN0YXJ0LCBSWF9ERVNDX05VTSk7CisJaWYgKG51bSA+IGxpbWl0KQorCQludW0gPSBsaW1pdDsKKworCS8qIGVuc3VyZSBnZXQgdXBkYXRlZCBkZXNjICovCisJcm1iKCk7CisJZm9yIChpID0gMCwgcG9zID0gc3RhcnQ7IGkgPCBudW07IGkrKykgeworCQlza2IgPSBwcml2LT5yeF9za2JbcG9zXTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQluZXRkZXZfZXJyKGRldiwgImluY29uc2lzdGVudCByeF9za2JcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+cnhfc2tiW3Bvc10gPSBOVUxMOworCisJCWRlc2MgPSBwcml2LT5yeF9icS5kZXNjICsgcG9zOworCQlsZW4gPSAobGUzMl90b19jcHUoZGVzYy0+Y21kKSA+PiBERVNDX0RBVEFfTEVOX09GRikgJgorCQkgICAgICAgREVTQ19EQVRBX01BU0s7CisJCWFkZHIgPSBsZTMyX3RvX2NwdShkZXNjLT5idWZmX2FkZHIpOworCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgYWRkciwgTUFDX01BWF9GUkFNRV9TSVpFLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlpZiAoc2tiLT5sZW4gPiBNQUNfTUFYX0ZSQU1FX1NJWkUpIHsKKwkJCW5ldGRldl9lcnIoZGV2LCAicmN2IGxlbiBlcnIsIGxlbiA9ICVkXG4iLCBza2ItPmxlbik7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmFwaV9ncm9fcmVjZWl2ZSgmcHJpdi0+bmFwaSwgc2tiKTsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CituZXh0OgorCQlwb3MgPSBkbWFfcmluZ19pbmNyKHBvcywgUlhfREVTQ19OVU0pOworCX0KKworCWlmIChwb3MgIT0gc3RhcnQpCisJCXdyaXRlbF9yZWxheGVkKGRtYV9ieXRlKHBvcyksIHByaXYtPmJhc2UgKyBSWF9CUV9SRF9BRERSKTsKKworCWhpeDVoZDJfcnhfcmVmaWxsKHByaXYpOworCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl94bWl0X3JlY2xhaW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBoaXg1aGQyX2Rlc2MgKmRlc2M7CisJc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGJ5dGVzX2NvbXBsID0gMCwgcGt0c19jb21wbCA9IDA7CisJdTMyIHN0YXJ0LCBlbmQsIG51bSwgcG9zLCBpOworCWRtYV9hZGRyX3QgYWRkcjsKKworCW5ldGlmX3R4X2xvY2soZGV2KTsKKworCS8qIHNvZnR3YXJlIHJlYWQgKi8KKwlzdGFydCA9IGRtYV9jbnQocmVhZGxfcmVsYXhlZChwcml2LT5iYXNlICsgVFhfUlFfUkRfQUREUikpOworCS8qIGxvZ2ljIHdyaXRlICovCisJZW5kID0gZG1hX2NudChyZWFkbF9yZWxheGVkKHByaXYtPmJhc2UgKyBUWF9SUV9XUl9BRERSKSk7CisJbnVtID0gQ0lSQ19DTlQoZW5kLCBzdGFydCwgVFhfREVTQ19OVU0pOworCisJZm9yIChpID0gMCwgcG9zID0gc3RhcnQ7IGkgPCBudW07IGkrKykgeworCQlza2IgPSBwcml2LT50eF9za2JbcG9zXTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQluZXRkZXZfZXJyKGRldiwgImluY29uc2lzdGVudCB0eF9za2JcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlwa3RzX2NvbXBsKys7CisJCWJ5dGVzX2NvbXBsICs9IHNrYi0+bGVuOworCQlkZXNjID0gcHJpdi0+dHhfcnEuZGVzYyArIHBvczsKKwkJYWRkciA9IGxlMzJfdG9fY3B1KGRlc2MtPmJ1ZmZfYWRkcik7CisJCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+ZGV2LCBhZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCXByaXYtPnR4X3NrYltwb3NdID0gTlVMTDsKKwkJZGV2X2NvbnN1bWVfc2tiX2FueShza2IpOworCQlwb3MgPSBkbWFfcmluZ19pbmNyKHBvcywgVFhfREVTQ19OVU0pOworCX0KKworCWlmIChwb3MgIT0gc3RhcnQpCisJCXdyaXRlbF9yZWxheGVkKGRtYV9ieXRlKHBvcyksIHByaXYtPmJhc2UgKyBUWF9SUV9SRF9BRERSKTsKKworCW5ldGlmX3R4X3VubG9jayhkZXYpOworCisJaWYgKHBrdHNfY29tcGwgfHwgYnl0ZXNfY29tcGwpCisJCW5ldGRldl9jb21wbGV0ZWRfcXVldWUoZGV2LCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7CisKKwlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRkZXYpKSAmJiBwa3RzX2NvbXBsKQorCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7Cit9CisKK3N0YXRpYyBpbnQgaGl4NWhkMl9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKG5hcGksCisJCQkJc3RydWN0IGhpeDVoZDJfcHJpdiwgbmFwaSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldGRldjsKKwlpbnQgd29ya19kb25lID0gMCwgdGFzayA9IGJ1ZGdldDsKKwlpbnQgaW50cywgbnVtOworCisJZG8geworCQloaXg1aGQyX3htaXRfcmVjbGFpbShkZXYpOworCQludW0gPSBoaXg1aGQyX3J4KGRldiwgdGFzayk7CisJCXdvcmtfZG9uZSArPSBudW07CisJCXRhc2sgLT0gbnVtOworCQlpZiAoKHdvcmtfZG9uZSA+PSBidWRnZXQpIHx8IChudW0gPT0gMCkpCisJCQlicmVhazsKKworCQlpbnRzID0gcmVhZGxfcmVsYXhlZChwcml2LT5iYXNlICsgUkFXX1BNVV9JTlQpOworCQl3cml0ZWxfcmVsYXhlZChpbnRzLCBwcml2LT5iYXNlICsgUkFXX1BNVV9JTlQpOworCX0gd2hpbGUgKGludHMgJiBERUZfSU5UX01BU0spOworCisJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQloaXg1aGQyX2lycV9lbmFibGUocHJpdik7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIGlycXJldHVybl90IGhpeDVoZDJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbnRzID0gcmVhZGxfcmVsYXhlZChwcml2LT5iYXNlICsgUkFXX1BNVV9JTlQpOworCisJd3JpdGVsX3JlbGF4ZWQoaW50cywgcHJpdi0+YmFzZSArIFJBV19QTVVfSU5UKTsKKwlpZiAobGlrZWx5KGludHMgJiBERUZfSU5UX01BU0spKSB7CisJCWhpeDVoZDJfaXJxX2Rpc2FibGUocHJpdik7CisJCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBoaXg1aGQyX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhpeDVoZDJfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IGFkZHI7CisJdTMyIHBvczsKKworCS8qIHNvZnR3YXJlIHdyaXRlIHBvaW50ZXIgKi8KKwlwb3MgPSBkbWFfY250KHJlYWRsX3JlbGF4ZWQocHJpdi0+YmFzZSArIFRYX0JRX1dSX0FERFIpKTsKKwlpZiAodW5saWtlbHkocHJpdi0+dHhfc2tiW3Bvc10pKSB7CisJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWFkZHIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihwcml2LT5kZXYsIGFkZHIpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJZGVzYyA9IHByaXYtPnR4X2JxLmRlc2MgKyBwb3M7CisJZGVzYy0+YnVmZl9hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJcHJpdi0+dHhfc2tiW3Bvc10gPSBza2I7CisJZGVzYy0+Y21kID0gY3B1X3RvX2xlMzIoREVTQ19WTERfQlVTWSB8IERFU0NfRkxfRlVMTCB8CisJCQkJKHNrYi0+bGVuICYgREVTQ19EQVRBX01BU0spIDw8IERFU0NfREFUQV9MRU5fT0ZGIHwKKwkJCQkoc2tiLT5sZW4gJiBERVNDX0RBVEFfTUFTSykgPDwgREVTQ19CVUZGX0xFTl9PRkYpOworCisJLyogZW5zdXJlIGRlc2MgdXBkYXRlZCAqLworCXdtYigpOworCisJcG9zID0gZG1hX3JpbmdfaW5jcihwb3MsIFRYX0RFU0NfTlVNKTsKKwl3cml0ZWxfcmVsYXhlZChkbWFfYnl0ZShwb3MpLCBwcml2LT5iYXNlICsgVFhfQlFfV1JfQUREUik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCW5ldGRldl9zZW50X3F1ZXVlKGRldiwgc2tiLT5sZW4pOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9mcmVlX2RtYV9kZXNjX3JpbmdzKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGhpeDVoZDJfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IGFkZHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfREVTQ19OVU07IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfc2tiW2ldOworCQlpZiAoc2tiID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlkZXNjID0gcHJpdi0+cnhfZnEuZGVzYyArIGk7CisJCWFkZHIgPSBsZTMyX3RvX2NwdShkZXNjLT5idWZmX2FkZHIpOworCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgYWRkciwKKwkJCQkgTUFDX01BWF9GUkFNRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlwcml2LT5yeF9za2JbaV0gPSBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9ERVNDX05VTTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT50eF9za2JbaV07CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWRlc2MgPSBwcml2LT50eF9ycS5kZXNjICsgaTsKKwkJYWRkciA9IGxlMzJfdG9fY3B1KGRlc2MtPmJ1ZmZfYWRkcik7CisJCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+ZGV2LCBhZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXByaXYtPnR4X3NrYltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGhpeDVoZDJfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsayAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcml2LT5waHkgPSBvZl9waHlfY29ubmVjdChkZXYsIHByaXYtPnBoeV9ub2RlLAorCQkJCSAgICZoaXg1aGQyX2FkanVzdF9saW5rLCAwLCBwcml2LT5waHlfbW9kZSk7CisJaWYgKCFwcml2LT5waHkpCisJCXJldHVybiAtRU5PREVWOworCisJcGh5X3N0YXJ0KHByaXYtPnBoeSk7CisJaGl4NWhkMl9od19pbml0KHByaXYpOworCWhpeDVoZDJfcnhfcmVmaWxsKHByaXYpOworCisJbmV0ZGV2X3Jlc2V0X3F1ZXVlKGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwluYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7CisKKwloaXg1aGQyX3BvcnRfZW5hYmxlKHByaXYpOworCWhpeDVoZDJfaXJxX2VuYWJsZShwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpeDVoZDJfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwloaXg1aGQyX3BvcnRfZGlzYWJsZShwcml2KTsKKwloaXg1aGQyX2lycV9kaXNhYmxlKHByaXYpOworCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWhpeDVoZDJfZnJlZV9kbWFfZGVzY19yaW5ncyhwcml2KTsKKworCWlmIChwcml2LT5waHkpIHsKKwkJcGh5X3N0b3AocHJpdi0+cGh5KTsKKwkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5KTsKKwl9CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaXg1aGQyX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdjsKKworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhpeDVoZDJfcHJpdiwgdHhfdGltZW91dF90YXNrKTsKKwloaXg1aGQyX25ldF9jbG9zZShwcml2LT5uZXRkZXYpOworCWhpeDVoZDJfbmV0X29wZW4ocHJpdi0+bmV0ZGV2KTsKK30KKworc3RhdGljIHZvaWQgaGl4NWhkMl9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc2NoZWR1bGVfd29yaygmcHJpdi0+dHhfdGltZW91dF90YXNrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBoaXg1aGQyX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGhpeDVoZDJfbmV0X29wZW4sCisJLm5kb19zdG9wCQk9IGhpeDVoZDJfbmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBoaXg1aGQyX25ldF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBoaXg1aGQyX25ldF90aW1lb3V0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gaGl4NWhkMl9uZXRfc2V0X21hY19hZGRyZXNzLAorfTsKKworc3RhdGljIGludCBoaXg1aGQyX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisKKwlpZiAoIXByaXYtPnBoeSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHksIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgaGl4NWhkMl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGhpeDVoZDJfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCisJaWYgKCFwcml2LT5waHkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5LCBjbWQpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpeDVoZDJfZXRodG9vbHNfb3BzID0geworCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2V0dGluZ3MJCT0gaGl4NWhkMl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBoaXg1aGQyX3NldF9zZXR0aW5ncywKK307CisKK3N0YXRpYyBpbnQgaGl4NWhkMl9tZGlvX3dhaXRfcmVhZHkoc3RydWN0IG1paV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gYnVzLT5wcml2OworCXZvaWQgX19pb21lbSAqYmFzZSA9IHByaXYtPmJhc2U7CisJaW50IGksIHRpbWVvdXQgPSAxMDAwMDsKKworCWZvciAoaSA9IDA7IHJlYWRsX3JlbGF4ZWQoYmFzZSArIE1ESU9fU0lOR0xFX0NNRCkgJiBNRElPX1NUQVJUOyBpKyspIHsKKwkJaWYgKGkgPT0gdGltZW91dCkKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaXg1aGQyX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5LCBpbnQgcmVnKQoreworCXN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYgPSBidXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcHJpdi0+YmFzZTsKKwlpbnQgdmFsLCByZXQ7CisKKwlyZXQgPSBoaXg1aGQyX21kaW9fd2FpdF9yZWFkeShidXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXdyaXRlbF9yZWxheGVkKE1ESU9fUkVBRCB8IHBoeSA8PCA4IHwgcmVnLCBiYXNlICsgTURJT19TSU5HTEVfQ01EKTsKKwlyZXQgPSBoaXg1aGQyX21kaW9fd2FpdF9yZWFkeShidXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIE1ESU9fUkRBVEFfU1RBVFVTKTsKKwlpZiAodmFsICYgTURJT19SX1ZBTElEKSB7CisJCWRldl9lcnIoYnVzLT5wYXJlbnQsICJTTUkgYnVzIHJlYWQgbm90IHZhbGlkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJdmFsID0gcmVhZGxfcmVsYXhlZChwcml2LT5iYXNlICsgTURJT19TSU5HTEVfREFUQSk7CisJcmV0ID0gKHZhbCA+PiAxNikgJiAweEZGRkY7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoaXg1aGQyX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2ID0gYnVzLT5wcml2OworCXZvaWQgX19pb21lbSAqYmFzZSA9IHByaXYtPmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IGhpeDVoZDJfbWRpb193YWl0X3JlYWR5KGJ1cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJd3JpdGVsX3JlbGF4ZWQodmFsLCBiYXNlICsgTURJT19TSU5HTEVfREFUQSk7CisJd3JpdGVsX3JlbGF4ZWQoTURJT19XUklURSB8IHBoeSA8PCA4IHwgcmVnLCBiYXNlICsgTURJT19TSU5HTEVfQ01EKTsKKwlyZXQgPSBoaXg1aGQyX21kaW9fd2FpdF9yZWFkeShidXMpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhpeDVoZDJfZGVzdHJveV9od19kZXNjX3F1ZXVlKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUVVFVUVfTlVNUzsgaSsrKSB7CisJCWlmIChwcml2LT5wb29sW2ldLmRlc2MpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwgcHJpdi0+cG9vbFtpXS5zaXplLAorCQkJCQkgIHByaXYtPnBvb2xbaV0uZGVzYywKKwkJCQkJICBwcml2LT5wb29sW2ldLnBoeXNfYWRkcik7CisJCQlwcml2LT5wb29sW2ldLmRlc2MgPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGhpeDVoZDJfaW5pdF9od19kZXNjX3F1ZXVlKHN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcHJpdi0+ZGV2OworCXN0cnVjdCBoaXg1aGQyX2Rlc2MgKnZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwlpbnQgc2l6ZSwgaTsKKworCXByaXYtPnJ4X2ZxLmNvdW50ID0gUlhfREVTQ19OVU07CisJcHJpdi0+cnhfYnEuY291bnQgPSBSWF9ERVNDX05VTTsKKwlwcml2LT50eF9icS5jb3VudCA9IFRYX0RFU0NfTlVNOworCXByaXYtPnR4X3JxLmNvdW50ID0gVFhfREVTQ19OVU07CisKKwlmb3IgKGkgPSAwOyBpIDwgUVVFVUVfTlVNUzsgaSsrKSB7CisJCXNpemUgPSBwcml2LT5wb29sW2ldLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBoaXg1aGQyX2Rlc2MpOworCQl2aXJ0X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmcGh5c19hZGRyLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICh2aXJ0X2FkZHIgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9wb29sOworCisJCW1lbXNldCh2aXJ0X2FkZHIsIDAsIHNpemUpOworCQlwcml2LT5wb29sW2ldLnNpemUgPSBzaXplOworCQlwcml2LT5wb29sW2ldLmRlc2MgPSB2aXJ0X2FkZHI7CisJCXByaXYtPnBvb2xbaV0ucGh5c19hZGRyID0gcGh5c19hZGRyOworCX0KKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9wb29sOgorCWhpeDVoZDJfZGVzdHJveV9od19kZXNjX3F1ZXVlKHByaXYpOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgaGl4NWhkMl9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgaGl4NWhkMl9wcml2ICpwcml2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBtaWlfYnVzICpidXM7CisJY29uc3QgY2hhciAqbWFjX2FkZHI7CisJaW50IHJldDsKKworCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhpeDVoZDJfcHJpdikpOworCWlmICghbmRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKworCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlwcml2LT5kZXYgPSBkZXY7CisJcHJpdi0+bmV0ZGV2ID0gbmRldjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcHJpdi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihwcml2LT5iYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKHByaXYtPmJhc2UpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCXByaXYtPmN0cmxfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihwcml2LT5jdHJsX2Jhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+Y3RybF9iYXNlKTsKKwkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisJfQorCisJcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgeworCQluZXRkZXZfZXJyKG5kZXYsICJmYWlsZWQgdG8gZ2V0IGNsa1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgImZhaWxlZCB0byBlbmFibGUgY2xrICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwlidXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKGJ1cyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCWJ1cy0+cHJpdiA9IHByaXY7CisJYnVzLT5uYW1lID0gImhpeDVoZDJfbWlpX2J1cyI7CisJYnVzLT5yZWFkID0gaGl4NWhkMl9tZGlvX3JlYWQ7CisJYnVzLT53cml0ZSA9IGhpeDVoZDJfbWRpb193cml0ZTsKKwlidXMtPnBhcmVudCA9ICZwZGV2LT5kZXY7CisJc25wcmludGYoYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXMtbWlpIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCXByaXYtPmJ1cyA9IGJ1czsKKworCXJldCA9IG9mX21kaW9idXNfcmVnaXN0ZXIoYnVzLCBub2RlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX21kaW87CisKKwlwcml2LT5waHlfbW9kZSA9IG9mX2dldF9waHlfbW9kZShub2RlKTsKKwlpZiAocHJpdi0+cGh5X21vZGUgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgIm5vdCBmaW5kIHBoeS1tb2RlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfbWRpb2J1czsKKwl9CisKKwlwcml2LT5waHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgInBoeS1oYW5kbGUiLCAwKTsKKwlpZiAoIXByaXYtPnBoeV9ub2RlKSB7CisJCW5ldGRldl9lcnIobmRldiwgIm5vdCBmaW5kIHBoeS1oYW5kbGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9tZGlvYnVzOworCX0KKworCW5kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKG5kZXYtPmlycSA8PSAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgIk5vIGlycSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3BoeV9ub2RlOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBuZGV2LT5pcnEsIGhpeDVoZDJfaW50ZXJydXB0LAorCQkJICAgICAgIDAsIHBkZXYtPm5hbWUsIG5kZXYpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiZGV2bV9yZXF1ZXN0X2lycSBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9waHlfbm9kZTsKKwl9CisKKwltYWNfYWRkciA9IG9mX2dldF9tYWNfYWRkcmVzcyhub2RlKTsKKwlpZiAobWFjX2FkZHIpCisJCWV0aGVyX2FkZHJfY29weShuZGV2LT5kZXZfYWRkciwgbWFjX2FkZHIpOworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZGV2LT5kZXZfYWRkcikpIHsKKwkJZXRoX2h3X2FkZHJfcmFuZG9tKG5kZXYpOworCQluZXRkZXZfd2FybihuZGV2LCAidXNpbmcgcmFuZG9tIE1BQyBhZGRyZXNzICVwTVxuIiwKKwkJCSAgICBuZGV2LT5kZXZfYWRkcik7CisJfQorCisJSU5JVF9XT1JLKCZwcml2LT50eF90aW1lb3V0X3Rhc2ssIGhpeDVoZDJfdHhfdGltZW91dF90YXNrKTsKKwluZGV2LT53YXRjaGRvZ190aW1lbyA9IDYgKiBIWjsKKwluZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKKwluZGV2LT5uZXRkZXZfb3BzID0gJmhpeDVoZDJfbmV0ZGV2X29wczsKKwluZGV2LT5ldGh0b29sX29wcyA9ICZoaXg1aGQyX2V0aHRvb2xzX29wczsKKwlTRVRfTkVUREVWX0RFVihuZGV2LCBkZXYpOworCisJcmV0ID0gaGl4NWhkMl9pbml0X2h3X2Rlc2NfcXVldWUocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcGh5X25vZGU7CisKKwluZXRpZl9uYXBpX2FkZChuZGV2LCAmcHJpdi0+bmFwaSwgaGl4NWhkMl9wb2xsLCBOQVBJX1BPTExfV0VJR0hUKTsKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIobmRldiwgInJlZ2lzdGVyX25ldGRldiBmYWlsZWQhIik7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfcXVldWU7CisJfQorCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7CisKKwlyZXR1cm4gcmV0OworCitvdXRfZGVzdHJveV9xdWV1ZToKKwluZXRpZl9uYXBpX2RlbCgmcHJpdi0+bmFwaSk7CisJaGl4NWhkMl9kZXN0cm95X2h3X2Rlc2NfcXVldWUocHJpdik7CitvdXRfcGh5X25vZGU6CisJb2Zfbm9kZV9wdXQocHJpdi0+cGh5X25vZGUpOworZXJyX21kaW9idXM6CisJbWRpb2J1c191bnJlZ2lzdGVyKGJ1cyk7CitlcnJfZnJlZV9tZGlvOgorCW1kaW9idXNfZnJlZShidXMpOworb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoaXg1aGQyX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBoaXg1aGQyX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwltZGlvYnVzX3VucmVnaXN0ZXIocHJpdi0+YnVzKTsKKwltZGlvYnVzX2ZyZWUocHJpdi0+YnVzKTsKKworCWhpeDVoZDJfZGVzdHJveV9od19kZXNjX3F1ZXVlKHByaXYpOworCW9mX25vZGVfcHV0KHByaXYtPnBoeV9ub2RlKTsKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT50eF90aW1lb3V0X3Rhc2spOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhpeDVoZDJfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiaGlzaWxpY29uLGhpeDVoZDItZ21hYyIsfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGhpeDVoZDJfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoaXg1aGQyX2Rldl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiaGl4NWhkMi1nbWFjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gaGl4NWhkMl9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IGhpeDVoZDJfZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBoaXg1aGQyX2Rldl9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhpeDVoZDJfZGV2X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiSElTSUxJQ09OIEhJWDVIRDIgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmhpeDVoZDItZ21hYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX2V0aHRvb2wuYwppbmRleCA5NTgzN2I5Li44NWEzODY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX2V0aHRvb2wuYwpAQCAtNjMsOCArNjMsOCBAQAogCQljbWQtPmR1cGxleCA9IHBvcnQtPmZ1bGxfZHVwbGV4ID09IDEgPwogCQkJCQkJICAgICBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCXNwZWVkID0gfjA7Ci0JCWNtZC0+ZHVwbGV4ID0gLTE7CisJCXNwZWVkID0gU1BFRURfVU5LTk9XTjsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgc3BlZWQpOwogCkBAIC0yNzgsNSArMjc4LDUgQEAKIAogdm9pZCBlaGVhX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZlaGVhX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmVoZWFfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDUzODkwM2IuLmEwYjQxOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9laGVhL2VoZWFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9laGVhL2VoZWFfbWFpbi5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KQEAgLTMyNzMsNyArMzI3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZigqYWRhcHRlciksIEdGUF9LRVJORUwpOworCWFkYXB0ZXIgPSBkZXZtX2t6YWxsb2MoJmRldi0+ZGV2LCBzaXplb2YoKmFkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJubyBtZW0gZm9yIGVoZWFfYWRhcHRlclxuIik7CkBAIC0zMzU5LDcgKzMzNjAsNiBAQAogCiBvdXRfZnJlZV9hZDoKIAlsaXN0X2RlbCgmYWRhcHRlci0+bGlzdCk7Ci0Ja2ZyZWUoYWRhcHRlcik7CiAKIG91dDoKIAllaGVhX3VwZGF0ZV9maXJtd2FyZV9oYW5kbGVzKCk7CkBAIC0zMzg2LDcgKzMzODYsNiBAQAogCWVoZWFfZGVzdHJveV9lcShhZGFwdGVyLT5uZXEpOwogCWVoZWFfcmVtb3ZlX2FkYXB0ZXJfbXIoYWRhcHRlcik7CiAJbGlzdF9kZWwoJmFkYXB0ZXItPmxpc3QpOwotCWtmcmVlKGFkYXB0ZXIpOwogCiAJZWhlYV91cGRhdGVfZmlybXdhcmVfaGFuZGxlcygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX3Ftci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9xbXIuYwppbmRleCA5YjAzMDMzYi4uYTA4MjBmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX3Ftci5jCkBAIC0xMDMsMTIgKzEwMywxNCBAQAogCiBzdGF0aWMgdm9pZCBod19xdWV1ZV9kdG9yKHN0cnVjdCBod19xdWV1ZSAqcXVldWUpCiB7Ci0JaW50IHBhZ2VzX3Blcl9rcGFnZSA9IFBBR0VfU0laRSAvIHF1ZXVlLT5wYWdlc2l6ZTsKKwlpbnQgcGFnZXNfcGVyX2twYWdlOwogCWludCBpLCBucl9wYWdlczsKIAogCWlmICghcXVldWUgfHwgIXF1ZXVlLT5xdWV1ZV9wYWdlcykKIAkJcmV0dXJuOwogCisJcGFnZXNfcGVyX2twYWdlID0gUEFHRV9TSVpFIC8gcXVldWUtPnBhZ2VzaXplOworCiAJbnJfcGFnZXMgPSBxdWV1ZS0+cXVldWVfbGVuZ3RoIC8gcXVldWUtPnBhZ2VzaXplOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpICs9IHBhZ2VzX3Blcl9rcGFnZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYwppbmRleCBhZTM0MmZkLi44N2JkOTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCkBAIC0yODc5LDcgKzI4NzksNyBAQAogCQlkZXYtPmNvbW1hYy5vcHMgPSAmZW1hY19jb21tYWNfc2dfb3BzOwogCX0gZWxzZQogCQluZGV2LT5uZXRkZXZfb3BzID0gJmVtYWNfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJmVtYWNfZXRodG9vbF9vcHMpOworCW5kZXYtPmV0aHRvb2xfb3BzID0gJmVtYWNfZXRodG9vbF9vcHM7CiAKIAluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWNwbHVzL2lwZy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWNwbHVzL2lwZy5jCmluZGV4IDI1MDQ1YWUuLjU3Mjc3NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ljcGx1cy9pcGcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pY3BsdXMvaXBnLmMKQEAgLTIyNDUsNyArMjI0NSw3IEBACiAJICovCiAJZGV2LT5uZXRkZXZfb3BzID0gJmlwZ19uZXRkZXZfb3BzOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7Ci0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJmlwZ19ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZpcGdfZXRodG9vbF9vcHM7CiAKIAlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYwppbmRleCBiNTY0NjFjLi45ZDk3OWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCkBAIC0yODU0LDcgKzI4NTQsNyBAQAogCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEFMTDsKIAogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZlMTAwX25ldGRldl9vcHM7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmUxMDBfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmZTEwMF9ldGh0b29sX29wczsKIAluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gRTEwMF9XQVRDSERPR19QRVJJT0Q7CiAJc3RybmNweShuZXRkZXYtPm5hbWUsIHBjaV9uYW1lKHBkZXYpLCBzaXplb2YobmV0ZGV2LT5uYW1lKSAtIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggNzNhOGFlZS4uZDUwZjc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtMTY4LDggKzE2OCw4IEBACiAJCWVsc2UKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWVjbWQtPmF1dG9uZWcgPSAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHx8CkBAIC0xNDYwLDcgKzE0NjAsOCBAQAogCQkJICogZW5vdWdoIHRpbWUgdG8gY29tcGxldGUgdGhlIHJlY2VpdmVzLCBpZiBpdCdzCiAJCQkgKiBleGNlZWRlZCwgYnJlYWsgYW5kIGVycm9yIG9mZgogCQkJICovCi0JCX0gd2hpbGUgKGdvb2RfY250IDwgNjQgJiYgamlmZmllcyA8ICh0aW1lICsgMjApKTsKKwkJfSB3aGlsZSAoZ29vZF9jbnQgPCA2NCAmJiB0aW1lX2FmdGVyKHRpbWUgKyAyMCwgamlmZmllcykpOworCiAJCWlmIChnb29kX2NudCAhPSA2NCkgewogCQkJcmV0X3ZhbCA9IDEzOyAvKiByZXRfdmFsIGlzIHRoZSBzYW1lIGFzIG1pcy1jb21wYXJlICovCiAJCQlicmVhazsKQEAgLTE5MDUsNSArMTkwNiw1IEBACiAKIHZvaWQgZTEwMDBfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmUxMDAwX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmUxMDAwX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX2h3LmMKaW5kZXggYzFkM2ZkYi4uZTliMDdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ody5jCkBAIC00ODc3LDEwICs0ODc3LDEwIEBACiAJICogc2luY2UgdGhlIHRlc3QgZm9yIGEgbXVsdGljYXN0IGZyYW1lIHdpbGwgdGVzdCBwb3NpdGl2ZSBvbgogCSAqIGEgYnJvYWRjYXN0IGZyYW1lLgogCSAqLwotCWlmICgobWFjX2FkZHJbMF0gPT0gKHU4KSAweGZmKSAmJiAobWFjX2FkZHJbMV0gPT0gKHU4KSAweGZmKSkKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWFjX2FkZHIpKQogCQkvKiBCcm9hZGNhc3QgcGFja2V0ICovCiAJCXN0YXRzLT5icHJjKys7Ci0JZWxzZSBpZiAoKm1hY19hZGRyICYgMHgwMSkKKwllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihtYWNfYWRkcikpCiAJCS8qIE11bHRpY2FzdCBwYWNrZXQgKi8KIAkJc3RhdHMtPm1wcmMrKzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IDI3MDU4ZGYuLjY2MDk3MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTMxMDUsMTEgKzMxMDUsNiBAQAogCSAqLwogCXR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nOwogCi0JaWYgKHVubGlrZWx5KHNrYi0+bGVuIDw9IDApKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXJldHVybiBORVRERVZfVFhfT0s7Ci0JfQotCiAJLyogT24gUENJL1BDSS1YIEhXLCBpZiBwYWNrZXQgc2l6ZSBpcyBsZXNzIHRoYW4gRVRIX1pMRU4sCiAJICogcGFja2V0cyBtYXkgZ2V0IGNvcnJ1cHRlZCBkdXJpbmcgcGFkZGluZyBieSBIVy4KIAkgKiBUbyBXQSB0aGlzIGlzc3VlLCBwYWQgYWxsIHNtYWxsIHBhY2tldHMgbWFudWFsbHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvODAwMDNlczJsYW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MDAwM2VzMmxhbi5jCmluZGV4IGE1ZjZiMTEuLjA4ZjIyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MDAwM2VzMmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MDAwM2VzMmxhbi5jCkBAIC0xMzY1LDYgKzEzNjUsNyBAQAogCS5zZXR1cF9sZWQJCT0gZTEwMDBlX3NldHVwX2xlZF9nZW5lcmljLAogCS5jb25maWdfY29sbGlzaW9uX2Rpc3QJPSBlMTAwMGVfY29uZmlnX2NvbGxpc2lvbl9kaXN0X2dlbmVyaWMsCiAJLnJhcl9zZXQJCT0gZTEwMDBlX3Jhcl9zZXRfZ2VuZXJpYywKKwkucmFyX2dldF9jb3VudAkJPSBlMTAwMGVfcmFyX2dldF9jb3VudF9nZW5lcmljLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlMTAwMF9waHlfb3BlcmF0aW9ucyBlczJfcGh5X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MjU3MS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKaW5kZXggZTBhYTdmMS4uMjE4NDgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKQEAgLTE4OTYsNiArMTg5Niw3IEBACiAJLmNvbmZpZ19jb2xsaXNpb25fZGlzdAk9IGUxMDAwZV9jb25maWdfY29sbGlzaW9uX2Rpc3RfZ2VuZXJpYywKIAkucmVhZF9tYWNfYWRkcgkJPSBlMTAwMF9yZWFkX21hY19hZGRyXzgyNTcxLAogCS5yYXJfc2V0CQk9IGUxMDAwZV9yYXJfc2V0X2dlbmVyaWMsCisJLnJhcl9nZXRfY291bnQJCT0gZTEwMDBlX3Jhcl9nZXRfY291bnRfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZTEwMDBfcGh5X29wZXJhdGlvbnMgZTgyX3BoeV9vcHNfaWdwID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaAppbmRleCAxNDcxYzU0Li43Nzg1MjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaApAQCAtMjY1LDEwICsyNjUsMTAgQEAKIAl1MzIgdHhfaHd0c3RhbXBfdGltZW91dHM7CiAKIAkvKiBSeCAqLwotCWJvb2wgKCpjbGVhbl9yeCkgKHN0cnVjdCBlMTAwMF9yaW5nICpyaW5nLCBpbnQgKndvcmtfZG9uZSwKLQkJCSAgaW50IHdvcmtfdG9fZG8pIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci0Jdm9pZCAoKmFsbG9jX3J4X2J1ZikgKHN0cnVjdCBlMTAwMF9yaW5nICpyaW5nLCBpbnQgY2xlYW5lZF9jb3VudCwKLQkJCSAgICAgIGdmcF90IGdmcCk7CisJYm9vbCAoKmNsZWFuX3J4KShzdHJ1Y3QgZTEwMDBfcmluZyAqcmluZywgaW50ICp3b3JrX2RvbmUsCisJCQkgaW50IHdvcmtfdG9fZG8pIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJdm9pZCAoKmFsbG9jX3J4X2J1Zikoc3RydWN0IGUxMDAwX3JpbmcgKnJpbmcsIGludCBjbGVhbmVkX2NvdW50LAorCQkJICAgICBnZnBfdCBnZnApOwogCXN0cnVjdCBlMTAwMF9yaW5nICpyeF9yaW5nOwogCiAJdTMyIHJ4X2ludF9kZWxheTsKQEAgLTM5MSw2ICszOTEsOCBAQAogICogMjVNSHoJNDYtYml0CTJeNDYgLyAxMF45IC8gMzYwMCA9IDE5LjU1IGhvdXJzCiAgKi8KICNkZWZpbmUgRTEwMDBfU1lTVElNX09WRVJGTE9XX1BFUklPRAkoSFogKiA2MCAqIDYwICogNCkKKyNkZWZpbmUgRTEwMDBfTUFYXzgyNTc0X1NZU1RJTV9SRVJFQURTCTUwCisjZGVmaW5lIEUxMDAwXzgyNTc0X1NZU1RJTV9FUFNJTE9OCSgxVUxMIDw8IDM1VUxMKQogCiAvKiBoYXJkd2FyZSBjYXBhYmlsaXR5LCBmZWF0dXJlLCBhbmQgd29ya2Fyb3VuZCBmbGFncyAqLwogI2RlZmluZSBGTEFHX0hBU19BTVQgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKQEAgLTU3MywzNSArNTc1LDggQEAKIAogI2RlZmluZSBlcjMyKHJlZykJX19lcjMyKGh3LCBFMTAwMF8jI3JlZykKIAotLyoqCi0gKiBfX2V3MzJfcHJlcGFyZSAtIHByZXBhcmUgdG8gd3JpdGUgdG8gTUFDIENTUiByZWdpc3RlciBvbiBjZXJ0YWluIHBhcnRzCi0gKiBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQotICoKLSAqIFdoZW4gdXBkYXRpbmcgdGhlIE1BQyBDU1IgcmVnaXN0ZXJzLCB0aGUgTWFuYWdlYWJpbGl0eSBFbmdpbmUgKE1FKSBjb3VsZAotICogYmUgYWNjZXNzaW5nIHRoZSByZWdpc3RlcnMgYXQgdGhlIHNhbWUgdGltZS4gIE5vcm1hbGx5LCB0aGlzIGlzIGhhbmRsZWQgaW4KLSAqIGgvdyBieSBhbiBhcmJpdGVyIGJ1dCBvbiBzb21lIHBhcnRzIHRoZXJlIGlzIGEgYnVnIHRoYXQgYWNrbm93bGVkZ2VzIEhvc3QKLSAqIGFjY2Vzc2VzIGxhdGVyIHRoYW4gaXQgc2hvdWxkIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVnaXN0ZXIgdG8gaGF2ZQotICogYW4gaW5jb3JyZWN0IHZhbHVlLiAgV29ya2Fyb3VuZCB0aGlzIGJ5IGNoZWNraW5nIHRoZSBGV1NNIHJlZ2lzdGVyIHdoaWNoCi0gKiBoYXMgYml0IDI0IHNldCB3aGlsZSBNRSBpcyBhY2Nlc3NpbmcgTUFDIENTUiByZWdpc3RlcnMsIHdhaXQgaWYgaXQgaXMgc2V0Ci0gKiBhbmQgdHJ5IGFnYWluIGEgbnVtYmVyIG9mIHRpbWVzLgotICoqLwotc3RhdGljIGlubGluZSBzMzIgX19ldzMyX3ByZXBhcmUoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLQlzMzIgaSA9IEUxMDAwX0lDSF9GV1NNX1BDSU0yUENJX0NPVU5UOwotCi0Jd2hpbGUgKChlcjMyKEZXU00pICYgRTEwMDBfSUNIX0ZXU01fUENJTTJQQ0kpICYmIC0taSkKLQkJdWRlbGF5KDUwKTsKLQotCXJldHVybiBpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19ldzMyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmVnLCB1MzIgdmFsKQotewotCWlmIChody0+YWRhcHRlci0+ZmxhZ3MyICYgRkxBRzJfUENJTTJQQ0lfQVJCSVRFUl9XQSkKLQkJX19ldzMyX3ByZXBhcmUoaHcpOwotCi0Jd3JpdGVsKHZhbCwgaHctPmh3X2FkZHIgKyByZWcpOwotfQorczMyIF9fZXczMl9wcmVwYXJlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBfX2V3MzIoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyByZWcsIHUzMiB2YWwpOwogCiAjZGVmaW5lIGV3MzIocmVnLCB2YWwpCV9fZXczMihodywgRTEwMDBfIyNyZWcsICh2YWwpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2V0aHRvb2wuYwppbmRleCBjYWQyNTBiLi44MTVlMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ldGh0b29sLmMKQEAgLTE1OSw4ICsxNTksOCBAQAogCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CiAJfQogCi0Jc3BlZWQgPSAtMTsKLQllY21kLT5kdXBsZXggPSAtMTsKKwlzcGVlZCA9IFNQRUVEX1VOS05PV047CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKQEAgLTE2OSw2ICsxNjksNyBAQAogCQl9CiAJfSBlbHNlIGlmICghcG1fcnVudGltZV9zdXNwZW5kZWQobmV0ZGV2LT5kZXYucGFyZW50KSkgewogCQl1MzIgc3RhdHVzID0gZXIzMihTVEFUVVMpOworCiAJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIHsKIAkJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkKIAkJCQlzcGVlZCA9IFNQRUVEXzEwMDA7CkBAIC03ODMsMjUgKzc4NCwyNiBAQAogCQkJICAgICAgcmVnICsgKG9mZnNldCA8PCAyKSwgdmFsLAogCQkJICAgICAgKHRlc3RbcGF0XSAmIHdyaXRlICYgbWFzaykpOwogCQkJKmRhdGEgPSByZWc7Ci0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJfQotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgcmVnX3NldF9hbmRfY2hlY2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCAqZGF0YSwKIAkJCSAgICAgIGludCByZWcsIHUzMiBtYXNrLCB1MzIgd3JpdGUpCiB7CiAJdTMyIHZhbDsKKwogCV9fZXczMigmYWRhcHRlci0+aHcsIHJlZywgd3JpdGUgJiBtYXNrKTsKIAl2YWwgPSBfX2VyMzIoJmFkYXB0ZXItPmh3LCByZWcpOwogCWlmICgod3JpdGUgJiBtYXNrKSAhPSAodmFsICYgbWFzaykpIHsKIAkJZV9lcnIoInNldC9jaGVjayB0ZXN0IGZhaWxlZCAocmVnIDB4JTA1WCk6IGdvdCAweCUwOFggZXhwZWN0ZWQgMHglMDhYXG4iLAogCQkgICAgICByZWcsICh2YWwgJiBtYXNrKSwgKHdyaXRlICYgbWFzaykpOwogCQkqZGF0YSA9IHJlZzsKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKICNkZWZpbmUgUkVHX1BBVFRFUk5fVEVTVF9BUlJBWShyZWcsIG9mZnNldCwgbWFzaywgd3JpdGUpICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNzE3LDYgKzE3MTksNyBAQAogCSpkYXRhID0gMDsKIAlpZiAoaHctPnBoeS5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CiAJCWludCBpID0gMDsKKwogCQlody0+bWFjLnNlcmRlc19oYXNfbGluayA9IGZhbHNlOwogCiAJCS8qIE9uIHNvbWUgYmxhZGUgc2VydmVyIGRlc2lnbnMsIGxpbmsgZXN0YWJsaXNobWVudApAQCAtMjMxNSw1ICsyMzE4LDUgQEAKIAogdm9pZCBlMTAwMGVfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmUxMDAwX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmUxMDAwX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaHcuaAppbmRleCA2YjNkZTVmLi43MmY1NDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaHcuaApAQCAtNDY5LDggKzQ2OSw5IEBACiAJczMyICAoKnNldHVwX2xlZCkoc3RydWN0IGUxMDAwX2h3ICopOwogCXZvaWQgKCp3cml0ZV92ZnRhKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MzIpOwogCXZvaWQgKCpjb25maWdfY29sbGlzaW9uX2Rpc3QpKHN0cnVjdCBlMTAwMF9odyAqKTsKLQl2b2lkICgqcmFyX3NldCkoc3RydWN0IGUxMDAwX2h3ICosIHU4ICosIHUzMik7CisJaW50ICAoKnJhcl9zZXQpKHN0cnVjdCBlMTAwMF9odyAqLCB1OCAqLCB1MzIpOwogCXMzMiAgKCpyZWFkX21hY19hZGRyKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJdTMyICAoKnJhcl9nZXRfY291bnQpKHN0cnVjdCBlMTAwMF9odyAqKTsKIH07CiAKIC8qIFdoZW4gdG8gdXNlIHZhcmlvdXMgUEhZIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYwppbmRleCBmMGJiZDQyLi44ODk0YWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKQEAgLTEzOSw4ICsxMzksOSBAQAogc3RhdGljIHMzMiBlMTAwMF9zZXRfbWRpb19zbG93X21vZGVfaHYoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgYm9vbCBlMTAwMF9jaGVja19tbmdfbW9kZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIGJvb2wgZTEwMDBfY2hlY2tfbW5nX21vZGVfcGNobGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwotc3RhdGljIHZvaWQgZTEwMDBfcmFyX3NldF9wY2gybGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICphZGRyLCB1MzIgaW5kZXgpOwotc3RhdGljIHZvaWQgZTEwMDBfcmFyX3NldF9wY2hfbHB0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICphZGRyLCB1MzIgaW5kZXgpOworc3RhdGljIGludCBlMTAwMF9yYXJfc2V0X3BjaDJsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmFkZHIsIHUzMiBpbmRleCk7CitzdGF0aWMgaW50IGUxMDAwX3Jhcl9zZXRfcGNoX2xwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYWRkciwgdTMyIGluZGV4KTsKK3N0YXRpYyB1MzIgZTEwMDBfcmFyX2dldF9jb3VudF9wY2hfbHB0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9rMV93b3JrYXJvdW5kX2x2KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHZvaWQgZTEwMDBfZ2F0ZV9od19waHlfY29uZmlnX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbCBnYXRlKTsKIHN0YXRpYyBzMzIgZTEwMDBfZGlzYWJsZV91bHBfbHB0X2xwKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgZm9yY2UpOwpAQCAtNzA0LDYgKzcwNSw3IEBACiAJCW1hYy0+b3BzLnJhcl9zZXQgPSBlMTAwMF9yYXJfc2V0X3BjaF9scHQ7CiAJCW1hYy0+b3BzLnNldHVwX3BoeXNpY2FsX2ludGVyZmFjZSA9CiAJCSAgICBlMTAwMF9zZXR1cF9jb3BwZXJfbGlua19wY2hfbHB0OworCQltYWMtPm9wcy5yYXJfZ2V0X2NvdW50ID0gZTEwMDBfcmFyX2dldF9jb3VudF9wY2hfbHB0OwogCX0KIAogCS8qIEVuYWJsZSBQQ1MgTG9jay1sb3NzIHdvcmthcm91bmQgZm9yIElDSDggKi8KQEAgLTEzMzQsNiArMTMzNiw3IEBACiAJaWYgKCgoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaDJsYW4pIHx8CiAJICAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpKSAmJiBsaW5rKSB7CiAJCXUzMiByZWc7CisKIAkJcmVnID0gZXIzMihTVEFUVVMpOwogCQlpZiAoIShyZWcgJiAoRTEwMDBfU1RBVFVTX0ZEIHwgRTEwMDBfU1RBVFVTX1NQRUVEX01BU0spKSkgewogCQkJdTE2IGVtaV9hZGRyOwpAQCAtMTYzNCw5ICsxNjM3LDkgQEAKIAl1MzIgZndzbTsKIAogCWZ3c20gPSBlcjMyKEZXU00pOwotCXJldHVybiAoKGZ3c20gJiBFMTAwMF9JQ0hfRldTTV9GV19WQUxJRCkgJiYKKwlyZXR1cm4gKGZ3c20gJiBFMTAwMF9JQ0hfRldTTV9GV19WQUxJRCkgJiYKIAkJKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spID09Ci0JCSAoRTEwMDBfSUNIX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKSkpOworCQkgKEUxMDAwX0lDSF9NTkdfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkpOwogfQogCiAvKioKQEAgLTE2NjcsNyArMTY3MCw3IEBACiAgKiAgY29udGFpbiB0aGUgTUFDIGFkZHJlc3MgYnV0IFJBUlsxLTZdIGFyZSByZXNlcnZlZCBmb3IgbWFuYWdlYWJpbGl0eSAoTUUpLgogICogIFVzZSBTSFJBWzAtM10gaW4gcGxhY2Ugb2YgdGhvc2UgcmVzZXJ2ZWQgZm9yIE1FLgogICoqLwotc3RhdGljIHZvaWQgZTEwMDBfcmFyX3NldF9wY2gybGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICphZGRyLCB1MzIgaW5kZXgpCitzdGF0aWMgaW50IGUxMDAwX3Jhcl9zZXRfcGNoMmxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYWRkciwgdTMyIGluZGV4KQogewogCXUzMiByYXJfbG93LCByYXJfaGlnaDsKIApAQCAtMTY4OSw3ICsxNjkyLDcgQEAKIAkJZTFlX2ZsdXNoKCk7CiAJCWV3MzIoUkFIKGluZGV4KSwgcmFyX2hpZ2gpOwogCQllMWVfZmx1c2goKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBSQVJbMS02XSBhcmUgb3duZWQgYnkgbWFuYWdlYWJpbGl0eS4gIFNraXAgdGhvc2UgYW5kIHByb2dyYW0gdGhlCkBAIC0xNzEyLDcgKzE3MTUsNyBAQAogCQkvKiB2ZXJpZnkgdGhlIHJlZ2lzdGVyIHVwZGF0ZXMgKi8KIAkJaWYgKChlcjMyKFNIUkFMKGluZGV4IC0gMSkpID09IHJhcl9sb3cpICYmCiAJCSAgICAoZXIzMihTSFJBSChpbmRleCAtIDEpKSA9PSByYXJfaGlnaCkpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAogCQllX2RiZygiU0hSQVslZF0gbWlnaHQgYmUgbG9ja2VkIGJ5IE1FIC0gRldTTT0weCU4Ljh4XG4iLAogCQkgICAgICAoaW5kZXggLSAxKSwgZXIzMihGV1NNKSk7CkBAIC0xNzIwLDYgKzE3MjMsNDMgQEAKIAogb3V0OgogCWVfZGJnKCJGYWlsZWQgdG8gd3JpdGUgcmVjZWl2ZSBhZGRyZXNzIGF0IGluZGV4ICVkXG4iLCBpbmRleCk7CisJcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworfQorCisvKioKKyAqICBlMTAwMF9yYXJfZ2V0X2NvdW50X3BjaF9scHQgLSBHZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgU0hSQQorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIEdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByZWNlaXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBIb3N0IGNhbgorICogIHByb2dyYW0uIFNIUkFbMC0xMF0gYXJlIHRoZSBzaGFyZWQgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycworICogIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBIb3N0IGFuZCBtYW5hZ2VhYmlsaXR5IGVuZ2luZSAoTUUpLgorICogIE1FIGNhbiByZXNlcnZlIGFueSBudW1iZXIgb2YgYWRkcmVzc2VzIGFuZCB0aGUgaG9zdCBuZWVkcyB0byBiZQorICogIGFibGUgdG8gdGVsbCBob3cgbWFueSBhdmFpbGFibGUgcmVnaXN0ZXJzIGl0IGhhcyBhY2Nlc3MgdG8uCisgKiovCitzdGF0aWMgdTMyIGUxMDAwX3Jhcl9nZXRfY291bnRfcGNoX2xwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXUzMiB3bG9ja19tYWM7CisJdTMyIG51bV9lbnRyaWVzOworCisJd2xvY2tfbWFjID0gZXIzMihGV1NNKSAmIEUxMDAwX0ZXU01fV0xPQ0tfTUFDX01BU0s7CisJd2xvY2tfbWFjID4+PSBFMTAwMF9GV1NNX1dMT0NLX01BQ19TSElGVDsKKworCXN3aXRjaCAod2xvY2tfbWFjKSB7CisJY2FzZSAwOgorCQkvKiBBbGwgU0hSQVswLi4xMF0gYW5kIFJBUlswXSBhdmFpbGFibGUgKi8KKwkJbnVtX2VudHJpZXMgPSBody0+bWFjLnJhcl9lbnRyeV9jb3VudDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBPbmx5IFJBUlswXSBhdmFpbGFibGUgKi8KKwkJbnVtX2VudHJpZXMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTSFJBWzAuLih3bG9ja19tYWMgLSAxKV0gYXZhaWxhYmxlICsgUkFSWzBdICovCisJCW51bV9lbnRyaWVzID0gd2xvY2tfbWFjICsgMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG51bV9lbnRyaWVzOwogfQogCiAvKioKQEAgLTE3MzMsNyArMTc3Myw3IEBACiAgKiAgY29udGFpbiB0aGUgTUFDIGFkZHJlc3MuIFNIUkFbMC0xMF0gYXJlIHRoZSBzaGFyZWQgcmVjZWl2ZSBhZGRyZXNzCiAgKiAgcmVnaXN0ZXJzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBIb3N0IGFuZCBtYW5hZ2VhYmlsaXR5IGVuZ2luZSAoTUUpLgogICoqLwotc3RhdGljIHZvaWQgZTEwMDBfcmFyX3NldF9wY2hfbHB0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICphZGRyLCB1MzIgaW5kZXgpCitzdGF0aWMgaW50IGUxMDAwX3Jhcl9zZXRfcGNoX2xwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYWRkciwgdTMyIGluZGV4KQogewogCXUzMiByYXJfbG93LCByYXJfaGlnaDsKIAl1MzIgd2xvY2tfbWFjOwpAQCAtMTc1NSw3ICsxNzk1LDcgQEAKIAkJZTFlX2ZsdXNoKCk7CiAJCWV3MzIoUkFIKGluZGV4KSwgcmFyX2hpZ2gpOwogCQllMWVfZmx1c2goKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBUaGUgbWFuYWdlYWJpbGl0eSBlbmdpbmUgKE1FKSBjYW4gbG9jayBjZXJ0YWluIFNIUkFSIHJlZ2lzdGVycyB0aGF0CkBAIC0xNzg3LDEyICsxODI3LDEzIEBACiAJCQkvKiB2ZXJpZnkgdGhlIHJlZ2lzdGVyIHVwZGF0ZXMgKi8KIAkJCWlmICgoZXIzMihTSFJBTF9QQ0hfTFBUKGluZGV4IC0gMSkpID09IHJhcl9sb3cpICYmCiAJCQkgICAgKGVyMzIoU0hSQUhfUENIX0xQVChpbmRleCAtIDEpKSA9PSByYXJfaGlnaCkpCi0JCQkJcmV0dXJuOworCQkJCXJldHVybiAwOwogCQl9CiAJfQogCiBvdXQ6CiAJZV9kYmcoIkZhaWxlZCB0byB3cml0ZSByZWNlaXZlIGFkZHJlc3MgYXQgaW5kZXggJWRcbiIsIGluZGV4KTsKKwlyZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CiB9CiAKIC8qKgpAQCAtNDk3Niw2ICs1MDE3LDcgQEAKIAkvKiBpZF9sZWRfaW5pdCBkZXBlbmRlbnQgb24gbWFjIHR5cGUgKi8KIAkuY29uZmlnX2NvbGxpc2lvbl9kaXN0CT0gZTEwMDBlX2NvbmZpZ19jb2xsaXNpb25fZGlzdF9nZW5lcmljLAogCS5yYXJfc2V0CQk9IGUxMDAwZV9yYXJfc2V0X2dlbmVyaWMsCisJLnJhcl9nZXRfY291bnQJCT0gZTEwMDBlX3Jhcl9nZXRfY291bnRfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZTEwMDBfcGh5X29wZXJhdGlvbnMgaWNoOF9waHlfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL21hYy5jCmluZGV4IGJhYTBhNDYuLjhjMzg2ZjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL21hYy5jCkBAIC0yMTEsNiArMjExLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3UzMiBlMTAwMGVfcmFyX2dldF9jb3VudF9nZW5lcmljKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJcmV0dXJuIGh3LT5tYWMucmFyX2VudHJ5X2NvdW50OworfQorCiAvKioKICAqICBlMTAwMGVfcmFyX3NldF9nZW5lcmljIC0gU2V0IHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCkBAIC0yMjAsNyArMjI1LDcgQEAKICAqICBTZXRzIHRoZSByZWNlaXZlIGFkZHJlc3MgYXJyYXkgcmVnaXN0ZXIgYXQgaW5kZXggdG8gdGhlIGFkZHJlc3MgcGFzc2VkCiAgKiAgaW4gYnkgYWRkci4KICAqKi8KLXZvaWQgZTEwMDBlX3Jhcl9zZXRfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYWRkciwgdTMyIGluZGV4KQoraW50IGUxMDAwZV9yYXJfc2V0X2dlbmVyaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmFkZHIsIHUzMiBpbmRleCkKIHsKIAl1MzIgcmFyX2xvdywgcmFyX2hpZ2g7CiAKQEAgLTI0NCw2ICsyNDksOCBAQAogCWUxZV9mbHVzaCgpOwogCWV3MzIoUkFIKGluZGV4KSwgcmFyX2hpZ2gpOwogCWUxZV9mbHVzaCgpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL21hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL21hYy5oCmluZGV4IDRlODFjMjguLjA1MTNkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9tYWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbWFjLmgKQEAgLTYxLDcgKzYxLDggQEAKIHZvaWQgZTEwMDBfd3JpdGVfdmZ0YV9nZW5lcmljKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7CiAKIHZvaWQgZTEwMDBfc2V0X2xhbl9pZF9tdWx0aV9wb3J0X3BjaWUoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci12b2lkIGUxMDAwZV9yYXJfc2V0X2dlbmVyaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmFkZHIsIHUzMiBpbmRleCk7Cit1MzIgZTEwMDBlX3Jhcl9nZXRfY291bnRfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludCBlMTAwMGVfcmFyX3NldF9nZW5lcmljKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICphZGRyLCB1MzIgaW5kZXgpOwogdm9pZCBlMTAwMGVfY29uZmlnX2NvbGxpc2lvbl9kaXN0X2dlbmVyaWMoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCmluZGV4IDNlNjkzODZhLi4yMDFjYzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCkBAIC0xMjQsNiArMTI0LDM2IEBACiB9OwogCiAvKioKKyAqIF9fZXczMl9wcmVwYXJlIC0gcHJlcGFyZSB0byB3cml0ZSB0byBNQUMgQ1NSIHJlZ2lzdGVyIG9uIGNlcnRhaW4gcGFydHMKKyAqIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogV2hlbiB1cGRhdGluZyB0aGUgTUFDIENTUiByZWdpc3RlcnMsIHRoZSBNYW5hZ2VhYmlsaXR5IEVuZ2luZSAoTUUpIGNvdWxkCisgKiBiZSBhY2Nlc3NpbmcgdGhlIHJlZ2lzdGVycyBhdCB0aGUgc2FtZSB0aW1lLiAgTm9ybWFsbHksIHRoaXMgaXMgaGFuZGxlZCBpbgorICogaC93IGJ5IGFuIGFyYml0ZXIgYnV0IG9uIHNvbWUgcGFydHMgdGhlcmUgaXMgYSBidWcgdGhhdCBhY2tub3dsZWRnZXMgSG9zdAorICogYWNjZXNzZXMgbGF0ZXIgdGhhbiBpdCBzaG91bGQgd2hpY2ggY291bGQgcmVzdWx0IGluIHRoZSByZWdpc3RlciB0byBoYXZlCisgKiBhbiBpbmNvcnJlY3QgdmFsdWUuICBXb3JrYXJvdW5kIHRoaXMgYnkgY2hlY2tpbmcgdGhlIEZXU00gcmVnaXN0ZXIgd2hpY2gKKyAqIGhhcyBiaXQgMjQgc2V0IHdoaWxlIE1FIGlzIGFjY2Vzc2luZyBNQUMgQ1NSIHJlZ2lzdGVycywgd2FpdCBpZiBpdCBpcyBzZXQKKyAqIGFuZCB0cnkgYWdhaW4gYSBudW1iZXIgb2YgdGltZXMuCisgKiovCitzMzIgX19ldzMyX3ByZXBhcmUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlzMzIgaSA9IEUxMDAwX0lDSF9GV1NNX1BDSU0yUENJX0NPVU5UOworCisJd2hpbGUgKChlcjMyKEZXU00pICYgRTEwMDBfSUNIX0ZXU01fUENJTTJQQ0kpICYmIC0taSkKKwkJdWRlbGF5KDUwKTsKKworCXJldHVybiBpOworfQorCit2b2lkIF9fZXczMihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJlZywgdTMyIHZhbCkKK3sKKwlpZiAoaHctPmFkYXB0ZXItPmZsYWdzMiAmIEZMQUcyX1BDSU0yUENJX0FSQklURVJfV0EpCisJCV9fZXczMl9wcmVwYXJlKGh3KTsKKworCXdyaXRlbCh2YWwsIGh3LT5od19hZGRyICsgcmVnKTsKK30KKworLyoqCiAgKiBlMTAwMF9yZWdkdW1wIC0gcmVnaXN0ZXIgcHJpbnRvdXQgcm91dGluZQogICogQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqIEByZWdpbmZvOiBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBpbmZvIHRhYmxlCkBAIC01OTksNiArNjI5LDcgQEAKIAogCWlmICh1bmxpa2VseSghcmV0X3ZhbCAmJiAoaSAhPSByZWFkbChyeF9yaW5nLT50YWlsKSkpKSB7CiAJCXUzMiByY3RsID0gZXIzMihSQ1RMKTsKKwogCQlldzMyKFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7CiAJCWVfZXJyKCJNRSBmaXJtd2FyZSBjYXVzZWQgaW52YWxpZCBSRFQgLSByZXNldHRpbmdcbiIpOwogCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5yZXNldF90YXNrKTsKQEAgLTYxNSw2ICs2NDYsNyBAQAogCiAJaWYgKHVubGlrZWx5KCFyZXRfdmFsICYmIChpICE9IHJlYWRsKHR4X3JpbmctPnRhaWwpKSkpIHsKIAkJdTMyIHRjdGwgPSBlcjMyKFRDVEwpOworCiAJCWV3MzIoVENUTCwgdGN0bCAmIH5FMTAwMF9UQ1RMX0VOKTsKIAkJZV9lcnIoIk1FIGZpcm13YXJlIGNhdXNlZCBpbnZhbGlkIFREVCAtIHJlc2V0dGluZ1xuIik7CiAJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnJlc2V0X3Rhc2spOwpAQCAtMTE5OCw2ICsxMjMwLDcgQEAKIAl3aGlsZSAoKGVvcF9kZXNjLT51cHBlci5kYXRhICYgY3B1X3RvX2xlMzIoRTEwMDBfVFhEX1NUQVRfREQpKSAmJgogCSAgICAgICAoY291bnQgPCB0eF9yaW5nLT5jb3VudCkpIHsKIAkJYm9vbCBjbGVhbmVkID0gZmFsc2U7CisKIAkJcm1iKCk7CQkvKiByZWFkIGJ1ZmZlcl9pbmZvIGFmdGVyIGVvcF9kZXNjICovCiAJCWZvciAoOyAhY2xlYW5lZDsgY291bnQrKykgewogCQkJdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGkpOwpAQCAtMTc1Myw2ICsxNzg2LDcgQEAKIAkJICAgIGFkYXB0ZXItPmZsYWdzICYgRkxBR19SWF9ORUVEU19SRVNUQVJUKSB7CiAJCQkvKiBkaXNhYmxlIHJlY2VpdmVzICovCiAJCQl1MzIgcmN0bCA9IGVyMzIoUkNUTCk7CisKIAkJCWV3MzIoUkNUTCwgcmN0bCAmIH5FMTAwMF9SQ1RMX0VOKTsKIAkJCWFkYXB0ZXItPmZsYWdzIHw9IEZMQUdfUkVTVEFSVF9OT1c7CiAJCX0KQEAgLTE5NjAsNiArMTk5NCw3IEBACiAJLyogV29ya2Fyb3VuZCBpc3N1ZSB3aXRoIHNwdXJpb3VzIGludGVycnVwdHMgb24gODI1NzQgaW4gTVNJLVggbW9kZSAqLwogCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpIHsKIAkJdTMyIHJmY3RsID0gZXIzMihSRkNUTCk7CisKIAkJcmZjdGwgfD0gRTEwMDBfUkZDVExfQUNLX0RJUzsKIAkJZXczMihSRkNUTCwgcmZjdGwpOwogCX0KQEAgLTIyMDQsNiArMjIzOSw3IEBACiAKIAlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CiAJCWludCBpOworCiAJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdmVjdG9yczsgaSsrKQogCQkJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS52ZWN0b3IpOwogCX0gZWxzZSB7CkBAIC0yOTIxLDYgKzI5NTcsNyBAQAogCiAJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIEZMQUcyX0RNQV9CVVJTVCkgewogCQl1MzIgdHhkY3RsID0gZXIzMihUWERDVEwoMCkpOworCiAJCXR4ZGN0bCAmPSB+KEUxMDAwX1RYRENUTF9QVEhSRVNIIHwgRTEwMDBfVFhEQ1RMX0hUSFJFU0ggfAogCQkJICAgIEUxMDAwX1RYRENUTF9XVEhSRVNIKTsKIAkJLyogc2V0IHVwIHNvbWUgcGVyZm9ybWFuY2UgcmVsYXRlZCBwYXJhbWV0ZXJzIHRvIGVuY291cmFnZSB0aGUKQEAgLTMyMzksNiArMzI3Niw3IEBACiAKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19JU19JQ0gpIHsKIAkJCXUzMiByeGRjdGwgPSBlcjMyKFJYRENUTCgwKSk7CisKIAkJCWV3MzIoUlhEQ1RMKDApLCByeGRjdGwgfCAweDMpOwogCQl9CiAKQEAgLTMzMDMsOSArMzM0MSwxMSBAQAogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXVuc2lnbmVkIGludCByYXJfZW50cmllcyA9IGh3LT5tYWMucmFyX2VudHJ5X2NvdW50OworCXVuc2lnbmVkIGludCByYXJfZW50cmllczsKIAlpbnQgY291bnQgPSAwOwogCisJcmFyX2VudHJpZXMgPSBody0+bWFjLm9wcy5yYXJfZ2V0X2NvdW50KGh3KTsKKwogCS8qIHNhdmUgYSByYXIgZW50cnkgZm9yIG91ciBoYXJkd2FyZSBhZGRyZXNzICovCiAJcmFyX2VudHJpZXMtLTsKIApAQCAtMzMyNCw5ICszMzY0LDEzIEBACiAJCSAqIGNvbWJpbmluZwogCQkgKi8KIAkJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgeworCQkJaW50IHJ2YWw7CisKIAkJCWlmICghcmFyX2VudHJpZXMpCiAJCQkJYnJlYWs7Ci0JCQlody0+bWFjLm9wcy5yYXJfc2V0KGh3LCBoYS0+YWRkciwgcmFyX2VudHJpZXMtLSk7CisJCQlydmFsID0gaHctPm1hYy5vcHMucmFyX3NldChodywgaGEtPmFkZHIsIHJhcl9lbnRyaWVzLS0pOworCQkJaWYgKHJ2YWwgPCAwKQorCQkJCXJldHVybiAtRU5PTUVNOwogCQkJY291bnQrKzsKIAkJfQogCX0KQEAgLTQwODUsMTIgKzQxMjksMzcgQEAKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZihjYywgc3RydWN0IGUxMDAwX2FkYXB0ZXIsCiAJCQkJCQkgICAgIGNjKTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCWN5Y2xlX3Qgc3lzdGltOworCWN5Y2xlX3Qgc3lzdGltLCBzeXN0aW1fbmV4dDsKIAogCS8qIGxhdGNoIFNZU1RJTUggb24gcmVhZCBvZiBTWVNUSU1MICovCiAJc3lzdGltID0gKGN5Y2xlX3QpZXIzMihTWVNUSU1MKTsKIAlzeXN0aW0gfD0gKGN5Y2xlX3QpZXIzMihTWVNUSU1IKSA8PCAzMjsKIAorCWlmICgoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KSB8fCAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTgzKSkgeworCQl1NjQgaW5jdmFsdWUsIHRpbWVfZGVsdGEsIHJlbSwgdGVtcDsKKwkJaW50IGk7CisKKwkJLyogZXJyYXRhIGZvciA4MjU3NC84MjU4MyBwb3NzaWJsZSBiYWQgYml0cyByZWFkIGZyb20gU1lTVElNSC9MCisJCSAqIGNoZWNrIHRvIHNlZSB0aGF0IHRoZSB0aW1lIGlzIGluY3JlbWVudGluZyBhdCBhIHJlYXNvbmFibGUKKwkJICogcmF0ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBpbmN2YWx1ZQorCQkgKi8KKwkJaW5jdmFsdWUgPSBlcjMyKFRJTUlOQ0EpICYgRTEwMDBfVElNSU5DQV9JTkNWQUxVRV9NQVNLOworCQlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTUFYXzgyNTc0X1NZU1RJTV9SRVJFQURTOyBpKyspIHsKKwkJCS8qIGxhdGNoIFNZU1RJTUggb24gcmVhZCBvZiBTWVNUSU1MICovCisJCQlzeXN0aW1fbmV4dCA9IChjeWNsZV90KWVyMzIoU1lTVElNTCk7CisJCQlzeXN0aW1fbmV4dCB8PSAoY3ljbGVfdCllcjMyKFNZU1RJTUgpIDw8IDMyOworCisJCQl0aW1lX2RlbHRhID0gc3lzdGltX25leHQgLSBzeXN0aW07CisJCQl0ZW1wID0gdGltZV9kZWx0YTsKKwkJCXJlbSA9IGRvX2Rpdih0ZW1wLCBpbmN2YWx1ZSk7CisKKwkJCXN5c3RpbSA9IHN5c3RpbV9uZXh0OworCisJCQlpZiAoKHRpbWVfZGVsdGEgPCBFMTAwMF84MjU3NF9TWVNUSU1fRVBTSUxPTikgJiYKKwkJCSAgICAocmVtID09IDApKQorCQkJCWJyZWFrOworCQl9CisJfQogCXJldHVybiBzeXN0aW07CiB9CiAKQEAgLTQ0OTEsNyArNDU2MCw3IEBACiAJZTEwMDBfZ2V0X3BoeV9pbmZvKGh3KTsKIAogCS8qIEVuYWJsZSBFRUUgb24gODI1NzkgYWZ0ZXIgbGluayB1cCAqLwotCWlmIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc5KQorCWlmIChody0+cGh5LnR5cGUgPj0gZTEwMDBfcGh5XzgyNTc5KQogCQllMTAwMF9zZXRfZWVlX3BjaGxhbihodyk7CiB9CiAKQEAgLTQ2OTUsNiArNDc2NCw3IEBACiAJLyogQ29ycmVjdGFibGUgRUNDIEVycm9ycyAqLwogCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgewogCQl1MzIgcGJlY2NzdHMgPSBlcjMyKFBCRUNDU1RTKTsKKwogCQlhZGFwdGVyLT5jb3JyX2Vycm9ycyArPQogCQkgICAgcGJlY2NzdHMgJiBFMTAwMF9QQkVDQ1NUU19DT1JSX0VSUl9DTlRfTUFTSzsKIAkJYWRhcHRlci0+dW5jb3JyX2Vycm9ycyArPQpAQCAtNDgwOCw2ICs0ODc4LDcgQEAKIAkgICAgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19SRVNUQVJUX05PVykpIHsKIAkJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAkJdTMyIHJjdGwgPSBlcjMyKFJDVEwpOworCiAJCWV3MzIoUkNUTCwgcmN0bCB8IEUxMDAwX1JDVExfRU4pOwogCQlhZGFwdGVyLT5mbGFncyAmPSB+RkxBR19SRVNUQVJUX05PVzsKIAl9CkBAIC00OTMwLDYgKzUwMDEsNyBAQAogCQkJaWYgKChhZGFwdGVyLT5mbGFncyAmIEZMQUdfVEFSQ19TUEVFRF9NT0RFX0JJVCkgJiYKIAkJCSAgICAhdHhiMmIpIHsKIAkJCQl1MzIgdGFyYzA7CisKIAkJCQl0YXJjMCA9IGVyMzIoVEFSQygwKSk7CiAJCQkJdGFyYzAgJj0gflNQRUVEX01PREVfQklUOwogCQkJCWV3MzIoVEFSQygwKSwgdGFyYzApOwpAQCAtNTE3MCw3ICs1MjQyLDcgQEAKIAlfX2JlMTYgcHJvdG9jb2w7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QXzgwMjFRKSkKIAkJcHJvdG9jb2wgPSB2bGFuX2V0aF9oZHIoc2tiKS0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKQEAgLTUyMTUsNyArNTI4Nyw3IEBACiAJCWkgPSAwOwogCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKIAotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IGUxMDAwX3R4X21hcChzdHJ1Y3QgZTEwMDBfcmluZyAqdHhfcmluZywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTYyMDksNiArNjI4MSw3IEBACiAJCWUxZV93cGh5KCZhZGFwdGVyLT5odywgQk1fV1VTLCB+MCk7CiAJfSBlbHNlIHsKIAkJdTMyIHd1cyA9IGVyMzIoV1VTKTsKKwogCQlpZiAod3VzKSB7CiAJCQllX2luZm8oIk1BQyBXYWtldXAgY2F1c2UgLSAlc1xuIiwKIAkJCSAgICAgICB3dXMgJiBFMTAwMF9XVVNfRVggPyAiVW5pY2FzdCBQYWNrZXQiIDoKQEAgLTcwMjcsNyArNzEwMCw3IEBACiAJLnJlc3VtZSA9IGUxMDAwX2lvX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShlMTAwMF9wY2lfdGJsKSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlMTAwMF9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEXzgyNTcxRUJfQ09QUEVSKSwgYm9hcmRfODI1NzEgfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUiksIGJvYXJkXzgyNTcxIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVIpLCBib2FyZF84MjU3MSB9LApAQCAtNzE0NCw2ICs3MjE3LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGUxMDAwX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJldDsKKwogCXByX2luZm8oIkludGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgRHJpdmVyIC0gJXNcbiIsCiAJCWUxMDAwZV9kcml2ZXJfdmVyc2lvbik7CiAJcHJfaW5mbygiQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbnZtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbnZtLmMKaW5kZXggYTlhOTc2Zi4uYjFmMjEyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL252bS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9udm0uYwpAQCAtMzk4LDYgKzM5OCw3IEBACiAJCS8qIExvb3AgdG8gYWxsb3cgZm9yIHVwIHRvIHdob2xlIHBhZ2Ugd3JpdGUgb2YgZWVwcm9tICovCiAJCXdoaWxlICh3aWR4IDwgd29yZHMpIHsKIAkJCXUxNiB3b3JkX291dCA9IGRhdGFbd2lkeF07CisKIAkJCXdvcmRfb3V0ID0gKHdvcmRfb3V0ID4+IDgpIHwgKHdvcmRfb3V0IDw8IDgpOwogCQkJZTEwMDBfc2hpZnRfb3V0X2VlY19iaXRzKGh3LCB3b3JkX291dCwgMTYpOwogCQkJd2lkeCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3BhcmFtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGFyYW0uYwppbmRleCBkMGFjMGYzLi5hYTE5MjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGFyYW0uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGFyYW0uYwpAQCAtNDM2LDYgKzQzNiw3IEBACiAKIAkJaWYgKG51bV9JbnRNb2RlID4gYmQpIHsKIAkJCXVuc2lnbmVkIGludCBpbnRfbW9kZSA9IEludE1vZGVbYmRdOworCiAJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmludF9tb2RlLCAmb3B0LCBhZGFwdGVyKTsKIAkJCWFkYXB0ZXItPmludF9tb2RlID0gaW50X21vZGU7CiAJCX0gZWxzZSB7CkBAIC00NTcsNiArNDU4LDcgQEAKIAogCQlpZiAobnVtX1NtYXJ0UG93ZXJEb3duRW5hYmxlID4gYmQpIHsKIAkJCXVuc2lnbmVkIGludCBzcGQgPSBTbWFydFBvd2VyRG93bkVuYWJsZVtiZF07CisKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmc3BkLCAmb3B0LCBhZGFwdGVyKTsKIAkJCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19TTUFSVF9QT1dFUl9ET1dOKSAmJiBzcGQpCiAJCQkJYWRhcHRlci0+ZmxhZ3MgfD0gRkxBR19TTUFSVF9QT1dFUl9ET1dOOwpAQCAtNDczLDYgKzQ3NSw3IEBACiAKIAkJaWYgKG51bV9DcmNTdHJpcHBpbmcgPiBiZCkgewogCQkJdW5zaWduZWQgaW50IGNyY19zdHJpcHBpbmcgPSBDcmNTdHJpcHBpbmdbYmRdOworCiAJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmNyY19zdHJpcHBpbmcsICZvcHQsIGFkYXB0ZXIpOwogCQkJaWYgKGNyY19zdHJpcHBpbmcgPT0gT1BUSU9OX0VOQUJMRUQpIHsKIAkJCQlhZGFwdGVyLT5mbGFnczIgfD0gRkxBRzJfQ1JDX1NUUklQUElORzsKQEAgLTQ5NSw2ICs0OTgsNyBAQAogCiAJCWlmIChudW1fS3VtZXJhbkxvY2tMb3NzID4gYmQpIHsKIAkJCXVuc2lnbmVkIGludCBrbXJuX2xvY2tfbG9zcyA9IEt1bWVyYW5Mb2NrTG9zc1tiZF07CisKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigma21ybl9sb2NrX2xvc3MsICZvcHQsIGFkYXB0ZXIpOwogCQkJZW5hYmxlZCA9IGttcm5fbG9ja19sb3NzOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGh5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGh5LmMKaW5kZXggMDBiM2ZjOS4uYjIwMDVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9waHkuYwpAQCAtMjg5Niw2ICsyODk2LDcgQEAKIAkJICAgIChody0+cGh5LmFkZHIgPT0gMikgJiYKIAkJICAgICEoTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZykgJiYgKGRhdGEgJiAoMSA8PCAxMSkpKSB7CiAJCQl1MTYgZGF0YTIgPSAweDdFRkY7CisKIAkJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X2RlYnVnX3JlZ3NfaHYoaHcsCiAJCQkJCQkJCSAoMSA8PCA2KSB8IDB4MywKIAkJCQkJCQkJICZkYXRhMiwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAppbmRleCBiZWI3YjQzLi42NTk4NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaApAQCAtNzIsNiArNzIsNyBAQAogI2RlZmluZSBJNDBFX01JTl9OVU1fREVTQ1JJUFRPUlMgICAgICA2NAogI2RlZmluZSBJNDBFX01JTl9NU0lYICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIEk0MEVfREVGQVVMVF9OVU1fVk1EUV9WU0kgICAgIDggLyogbWF4IDI1NiBWU0lzICovCisjZGVmaW5lIEk0MEVfTUlOX1ZTSV9BTExPQyAgICAgICAgICAgIDUxIC8qIExBTiwgQVRSLCBGQ09FLCAzMiBWRiwgMTYgVk1EUSAqLwogI2RlZmluZSBJNDBFX0RFRkFVTFRfUVVFVUVTX1BFUl9WTURRICAyIC8qIG1heCAxNiBxcHMgKi8KICNkZWZpbmUgSTQwRV9ERUZBVUxUX1FVRVVFU19QRVJfVkYgICAgNAogI2RlZmluZSBJNDBFX0RFRkFVTFRfUVVFVUVTX1BFUl9UQyAgICAxIC8qIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIgKi8KQEAgLTk3LDEwICs5OCw2IEBACiAjZGVmaW5lIFNUUklOR0lGWShmb28pICAjZm9vCiAjZGVmaW5lIFhTVFJJTkdJRlkoYmFyKSBTVFJJTkdJRlkoYmFyKQogCi0jaWZuZGVmIEFSQ0hfSEFTX1BSRUZFVENICi0jZGVmaW5lIHByZWZldGNoKFgpCi0jZW5kaWYKLQogI2RlZmluZSBJNDBFX1JYX0RFU0MoUiwgaSkJCQlcCiAJKChyaW5nX2lzXzE2Ynl0ZV9kZXNjX2VuYWJsZWQoUikpCVwKIAkJPyAodW5pb24gaTQwZV8zMmJ5dGVfcnhfZGVzYyAqKQlcCkBAIC0xNTcsMTEgKzE1NCwyMyBAQAogI2RlZmluZSBJNDBFX0ZESVJfQlVGRkVSX0ZVTExfTUFSR0lOCTEwCiAjZGVmaW5lIEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NCTIwMAogCitlbnVtIGk0MGVfZmRfc3RhdF9pZHggeworCUk0MEVfRkRfU1RBVF9BVFIsCisJSTQwRV9GRF9TVEFUX1NCLAorCUk0MEVfRkRfU1RBVF9QRl9DT1VOVAorfTsKKyNkZWZpbmUgSTQwRV9GRF9TVEFUX1BGX0lEWChwZl9pZCkgKChwZl9pZCkgKiBJNDBFX0ZEX1NUQVRfUEZfQ09VTlQpCisjZGVmaW5lIEk0MEVfRkRfQVRSX1NUQVRfSURYKHBmX2lkKSBcCisJCQkoSTQwRV9GRF9TVEFUX1BGX0lEWChwZl9pZCkgKyBJNDBFX0ZEX1NUQVRfQVRSKQorI2RlZmluZSBJNDBFX0ZEX1NCX1NUQVRfSURYKHBmX2lkKSAgXAorCQkJKEk0MEVfRkRfU1RBVF9QRl9JRFgocGZfaWQpICsgSTQwRV9GRF9TVEFUX1NCKQorCiBzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciB7CiAJc3RydWN0IGhsaXN0X25vZGUgZmRpcl9ub2RlOwogCS8qIGZpbHRlciBpcG51dCBzZXQgKi8KIAl1OCBmbG93X3R5cGU7CiAJdTggaXA0X3Byb3RvOworCS8qIFRYIHBhY2tldCB2aWV3IG9mIHNyYyBhbmQgZHN0ICovCiAJX19iZTMyIGRzdF9pcFs0XTsKIAlfX2JlMzIgc3JjX2lwWzRdOwogCV9fYmUxNiBzcmNfcG9ydDsKQEAgLTIwNSw3ICsyMTQsNiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBsaW5rX2NoZWNrX3RpbWVvdXQ7CiAJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKLQl1MTYgbnVtX21zaXhfZW50cmllczsKIAlib29sIGZjX2F1dG9uZWdfc3RhdHVzOwogCiAJdTE2IGVlcHJvbV92ZXJzaW9uOwpAQCAtMjIwLDExICsyMjgsMTQgQEAKIAl1MTYgcnNzX3NpemU7ICAgICAgICAgICAgICAvKiBudW0gcXVldWVzIGluIHRoZSBSU1MgYXJyYXkgKi8KIAl1MTYgcnNzX3NpemVfbWF4OyAgICAgICAgICAvKiBIVyBkZWZpbmVkIG1heCBSU1MgcXVldWVzICovCiAJdTE2IGZkaXJfcGZfZmlsdGVyX2NvdW50OyAgLyogbnVtIG9mIGd1YXJhbnRlZWQgZmlsdGVycyBmb3IgdGhpcyBQRiAqLworCXUxNiBudW1fYWxsb2NfdnNpOyAgICAgICAgIC8qIG51bSBWU0lzIHRoaXMgZHJpdmVyIHN1cHBvcnRzICovCiAJdTggYXRyX3NhbXBsZV9yYXRlOwogCWJvb2wgd29sX2VuOwogCiAJc3RydWN0IGhsaXN0X2hlYWQgZmRpcl9maWx0ZXJfbGlzdDsKIAl1MTYgZmRpcl9wZl9hY3RpdmVfZmlsdGVyczsKKwl1MTYgZmRfc2JfY250X2lkeDsKKwl1MTYgZmRfYXRyX2NudF9pZHg7CiAKICNpZmRlZiBDT05GSUdfSTQwRV9WWExBTgogCV9fYmUxNiAgdnhsYW5fcG9ydHNbSTQwRV9NQVhfUEZfVURQX09GRkxPQURfUE9SVFNdOwpAQCAtMjY2LDYgKzI3Nyw3IEBACiAjaWZkZWYgQ09ORklHX0k0MEVfVlhMQU4KICNkZWZpbmUgSTQwRV9GTEFHX1ZYTEFOX0ZJTFRFUl9TWU5DICAgICAgICAgICAgKHU2NCkoMSA8PCAyNykKICNlbmRpZgorI2RlZmluZSBJNDBFX0ZMQUdfRENCX0NBUEFCTEUgICAgICAgICAgICAgICAgICAodTY0KSgxIDw8IDI5KQogCiAJLyogdHJhY2tzIGZlYXR1cmVzIHRoYXQgZ2V0IGF1dG8gZGlzYWJsZWQgYnkgZXJyb3JzICovCiAJdTY0IGF1dG9fZGlzYWJsZV9mbGFnczsKQEAgLTMwMCw3ICszMTIsNiBAQAogCXUxNiBwZl9zZWlkOwogCXUxNiBtYWluX3ZzaV9zZWlkOwogCXUxNiBtYWNfc2VpZDsKLQlzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3N3aXRjaF9jb25maWdfZGF0YSAqc3dfY29uZmlnOwogCXN0cnVjdCBrb2JqZWN0ICpzd2l0Y2hfa29iajsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICppNDBlX2RiZ19wZjsKQEAgLTMyOSw5ICszNDAsNyBAQAogCXN0cnVjdCBwdHBfY2xvY2sgKnB0cF9jbG9jazsKIAlzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gcHRwX2NhcHM7CiAJc3RydWN0IHNrX2J1ZmYgKnB0cF90eF9za2I7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHB0cF90eF93b3JrOwogCXN0cnVjdCBod3RzdGFtcF9jb25maWcgdHN0YW1wX2NvbmZpZzsKLQl1bnNpZ25lZCBsb25nIHB0cF90eF9zdGFydDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHRwX2NoZWNrOwogCXNwaW5sb2NrX3QgdG1yZWdfbG9jazsgLyogVXNlZCB0byBwcm90ZWN0IHRoZSBkZXZpY2UgdGltZSByZWdpc3RlcnMuICovCiAJdTY0IHB0cF9iYXNlX2FkajsKQEAgLTQyMCw2ICs0MjksNyBAQAogCXN0cnVjdCBpNDBlX3FfdmVjdG9yICoqcV92ZWN0b3JzOwogCWludCBudW1fcV92ZWN0b3JzOwogCWludCBiYXNlX3ZlY3RvcjsKKwlib29sIGlycXNfcmVhZHk7CiAKIAl1MTYgc2VpZDsgICAgICAgICAgICAvKiBIVyBpbmRleCBvZiB0aGlzIFZTSSAoYWJzb2x1dGUgaW5kZXgpICovCiAJdTE2IGlkOyAgICAgICAgICAgICAgLyogVlNJIG51bWJlciAqLwpAQCAtNTQwLDYgKzU1MCwxNSBAQAogCQkocXcgPj4gSTQwRV9SWF9QUk9HX1NUQVRVU19ERVNDX0xFTkdUSF9TSElGVCk7CiB9CiAKKy8qKgorICogaTQwZV9nZXRfZmRfY250X2FsbCAtIGdldCB0aGUgdG90YWwgRkQgZmlsdGVyIHNwYWNlIGF2YWlsYWJsZQorICogQHBmOiBwb2ludGVyIHRvIHRoZSBwZiBzdHJ1Y3QKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGk0MGVfZ2V0X2ZkX2NudF9hbGwoc3RydWN0IGk0MGVfcGYgKnBmKQoreworCXJldHVybiBwZi0+aHcuZmRpcl9zaGFyZWRfZmlsdGVyX2NvdW50ICsgcGYtPmZkaXJfcGZfZmlsdGVyX2NvdW50OworfQorCiAvKiBuZWVkZWQgYnkgaTQwZV9ldGh0b29sLmMgKi8KIGludCBpNDBlX3VwKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKIHZvaWQgaTQwZV9kb3duKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuYwppbmRleCBlZDM5MDJiLi43YTAyNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucS5jCkBAIC0zMyw2ICszMywxNiBAQAogc3RhdGljIHZvaWQgaTQwZV9yZXN1bWVfYXEoc3RydWN0IGk0MGVfaHcgKmh3KTsKIAogLyoqCisgKiBpNDBlX2lzX252bV91cGRhdGVfb3AgLSByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIE5WTSB1cGRhdGUgb3BlcmF0aW9uCisgKiBAZGVzYzogQVBJIHJlcXVlc3QgZGVzY3JpcHRvcgorICoqLworc3RhdGljIGlubGluZSBib29sIGk0MGVfaXNfbnZtX3VwZGF0ZV9vcChzdHJ1Y3QgaTQwZV9hcV9kZXNjICpkZXNjKQoreworCXJldHVybiAoZGVzYy0+b3Bjb2RlID09IGk0MGVfYXFjX29wY19udm1fZXJhc2UpIHx8CisJICAgICAgIChkZXNjLT5vcGNvZGUgPT0gaTQwZV9hcWNfb3BjX252bV91cGRhdGUpOworfQorCisvKioKICAqICBpNDBlX2FkbWlucV9pbml0X3JlZ3MgLSBJbml0aWFsaXplIEFkbWluUSByZWdpc3RlcnMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKQEAgLTI4MSw4ICsyOTEsMTEgQEAKICAqCiAgKiAgQ29uZmlndXJlIGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIHJlZ2lzdGVycyBmb3IgdGhlIHRyYW5zbWl0IHF1ZXVlCiAgKiovCi1zdGF0aWMgdm9pZCBpNDBlX2NvbmZpZ19hc3FfcmVncyhzdHJ1Y3QgaTQwZV9odyAqaHcpCitzdGF0aWMgaTQwZV9zdGF0dXMgaTQwZV9jb25maWdfYXNxX3JlZ3Moc3RydWN0IGk0MGVfaHcgKmh3KQogeworCWk0MGVfc3RhdHVzIHJldF9jb2RlID0gMDsKKwl1MzIgcmVnID0gMDsKKwogCWlmIChody0+bWFjLnR5cGUgPT0gSTQwRV9NQUNfVkYpIHsKIAkJLyogY29uZmlndXJlIHRoZSB0cmFuc21pdCBxdWV1ZSAqLwogCQl3cjMyKGh3LCBJNDBFX1ZGX0FUUUJBSDEsCkBAIC0yOTEsNiArMzA0LDcgQEAKIAkJICAgIGxvd2VyXzMyX2JpdHMoaHctPmFxLmFzcS5kZXNjX2J1Zi5wYSkpOwogCQl3cjMyKGh3LCBJNDBFX1ZGX0FUUUxFTjEsIChody0+YXEubnVtX2FzcV9lbnRyaWVzIHwKIAkJCQkJICBJNDBFX1ZGX0FUUUxFTjFfQVRRRU5BQkxFX01BU0spKTsKKwkJcmVnID0gcmQzMihodywgSTQwRV9WRl9BVFFCQUwxKTsKIAl9IGVsc2UgewogCQkvKiBjb25maWd1cmUgdGhlIHRyYW5zbWl0IHF1ZXVlICovCiAJCXdyMzIoaHcsIEk0MEVfUEZfQVRRQkFILApAQCAtMjk5LDcgKzMxMywxNCBAQAogCQkgICAgbG93ZXJfMzJfYml0cyhody0+YXEuYXNxLmRlc2NfYnVmLnBhKSk7CiAJCXdyMzIoaHcsIEk0MEVfUEZfQVRRTEVOLCAoaHctPmFxLm51bV9hc3FfZW50cmllcyB8CiAJCQkJCSAgSTQwRV9QRl9BVFFMRU5fQVRRRU5BQkxFX01BU0spKTsKKwkJcmVnID0gcmQzMihodywgSTQwRV9QRl9BVFFCQUwpOwogCX0KKworCS8qIENoZWNrIG9uZSByZWdpc3RlciB0byB2ZXJpZnkgdGhhdCBjb25maWcgd2FzIGFwcGxpZWQgKi8KKwlpZiAocmVnICE9IGxvd2VyXzMyX2JpdHMoaHctPmFxLmFzcS5kZXNjX2J1Zi5wYSkpCisJCXJldF9jb2RlID0gSTQwRV9FUlJfQURNSU5fUVVFVUVfRVJST1I7CisKKwlyZXR1cm4gcmV0X2NvZGU7CiB9CiAKIC8qKgpAQCAtMzA4LDggKzMyOSwxMSBAQAogICoKICAqIENvbmZpZ3VyZSBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCByZWdpc3RlcnMgZm9yIHRoZSByZWNlaXZlIChldmVudCBxdWV1ZSkKICAqKi8KLXN0YXRpYyB2b2lkIGk0MGVfY29uZmlnX2FycV9yZWdzKHN0cnVjdCBpNDBlX2h3ICpodykKK3N0YXRpYyBpNDBlX3N0YXR1cyBpNDBlX2NvbmZpZ19hcnFfcmVncyhzdHJ1Y3QgaTQwZV9odyAqaHcpCiB7CisJaTQwZV9zdGF0dXMgcmV0X2NvZGUgPSAwOworCXUzMiByZWcgPSAwOworCiAJaWYgKGh3LT5tYWMudHlwZSA9PSBJNDBFX01BQ19WRikgewogCQkvKiBjb25maWd1cmUgdGhlIHJlY2VpdmUgcXVldWUgKi8KIAkJd3IzMihodywgSTQwRV9WRl9BUlFCQUgxLApAQCAtMzE4LDYgKzM0Miw3IEBACiAJCSAgICBsb3dlcl8zMl9iaXRzKGh3LT5hcS5hcnEuZGVzY19idWYucGEpKTsKIAkJd3IzMihodywgSTQwRV9WRl9BUlFMRU4xLCAoaHctPmFxLm51bV9hcnFfZW50cmllcyB8CiAJCQkJCSAgSTQwRV9WRl9BUlFMRU4xX0FSUUVOQUJMRV9NQVNLKSk7CisJCXJlZyA9IHJkMzIoaHcsIEk0MEVfVkZfQVJRQkFMMSk7CiAJfSBlbHNlIHsKIAkJLyogY29uZmlndXJlIHRoZSByZWNlaXZlIHF1ZXVlICovCiAJCXdyMzIoaHcsIEk0MEVfUEZfQVJRQkFILApAQCAtMzI2LDEwICszNTEsMTcgQEAKIAkJICAgIGxvd2VyXzMyX2JpdHMoaHctPmFxLmFycS5kZXNjX2J1Zi5wYSkpOwogCQl3cjMyKGh3LCBJNDBFX1BGX0FSUUxFTiwgKGh3LT5hcS5udW1fYXJxX2VudHJpZXMgfAogCQkJCQkgIEk0MEVfUEZfQVJRTEVOX0FSUUVOQUJMRV9NQVNLKSk7CisJCXJlZyA9IHJkMzIoaHcsIEk0MEVfUEZfQVJRQkFMKTsKIAl9CiAKIAkvKiBVcGRhdGUgdGFpbCBpbiB0aGUgSFcgdG8gcG9zdCBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KIAl3cjMyKGh3LCBody0+YXEuYXJxLnRhaWwsIGh3LT5hcS5udW1fYXJxX2VudHJpZXMgLSAxKTsKKworCS8qIENoZWNrIG9uZSByZWdpc3RlciB0byB2ZXJpZnkgdGhhdCBjb25maWcgd2FzIGFwcGxpZWQgKi8KKwlpZiAocmVnICE9IGxvd2VyXzMyX2JpdHMoaHctPmFxLmFycS5kZXNjX2J1Zi5wYSkpCisJCXJldF9jb2RlID0gSTQwRV9FUlJfQURNSU5fUVVFVUVfRVJST1I7CisKKwlyZXR1cm4gcmV0X2NvZGU7CiB9CiAKIC8qKgpAQCAtMzc3LDcgKzQwOSw5IEBACiAJCWdvdG8gaW5pdF9hZG1pbnFfZnJlZV9yaW5nczsKIAogCS8qIGluaXRpYWxpemUgYmFzZSByZWdpc3RlcnMgKi8KLQlpNDBlX2NvbmZpZ19hc3FfcmVncyhodyk7CisJcmV0X2NvZGUgPSBpNDBlX2NvbmZpZ19hc3FfcmVncyhodyk7CisJaWYgKHJldF9jb2RlKQorCQlnb3RvIGluaXRfYWRtaW5xX2ZyZWVfcmluZ3M7CiAKIAkvKiBzdWNjZXNzISAqLwogCWdvdG8gaW5pdF9hZG1pbnFfZXhpdDsKQEAgLTQzNCw3ICs0NjgsOSBAQAogCQlnb3RvIGluaXRfYWRtaW5xX2ZyZWVfcmluZ3M7CiAKIAkvKiBpbml0aWFsaXplIGJhc2UgcmVnaXN0ZXJzICovCi0JaTQwZV9jb25maWdfYXJxX3JlZ3MoaHcpOworCXJldF9jb2RlID0gaTQwZV9jb25maWdfYXJxX3JlZ3MoaHcpOworCWlmIChyZXRfY29kZSkKKwkJZ290byBpbml0X2FkbWlucV9mcmVlX3JpbmdzOwogCiAJLyogc3VjY2VzcyEgKi8KIAlnb3RvIGluaXRfYWRtaW5xX2V4aXQ7CkBAIC01NzcsMTQgKzYxMywxNCBAQAogCWk0MGVfcmVhZF9udm1fd29yZChodywgSTQwRV9TUl9OVk1fRUVUUkFDS19ISSwgJmVldHJhY2tfaGkpOwogCWh3LT5udm0uZWV0cmFjayA9IChlZXRyYWNrX2hpIDw8IDE2KSB8IGVldHJhY2tfbG87CiAKLQlpZiAoaHctPmFxLmFwaV9tYWpfdmVyICE9IEk0MEVfRldfQVBJX1ZFUlNJT05fTUFKT1IgfHwKLQkgICAgaHctPmFxLmFwaV9taW5fdmVyID4gSTQwRV9GV19BUElfVkVSU0lPTl9NSU5PUikgeworCWlmIChody0+YXEuYXBpX21hal92ZXIgPiBJNDBFX0ZXX0FQSV9WRVJTSU9OX01BSk9SKSB7CiAJCXJldF9jb2RlID0gSTQwRV9FUlJfRklSTVdBUkVfQVBJX1ZFUlNJT047CiAJCWdvdG8gaW5pdF9hZG1pbnFfZnJlZV9hcnE7CiAJfQogCiAJLyogcHJlLWVtcHRpdmUgcmVzb3VyY2UgbG9jayByZWxlYXNlICovCiAJaTQwZV9hcV9yZWxlYXNlX3Jlc291cmNlKGh3LCBJNDBFX05WTV9SRVNPVVJDRV9JRCwgMCwgTlVMTCk7CisJaHctPmFxLm52bV9idXN5ID0gZmFsc2U7CiAKIAlyZXRfY29kZSA9IGk0MGVfYXFfc2V0X2htY19yZXNvdXJjZV9wcm9maWxlKGh3LAogCQkJCQkJICAgIEk0MEVfSE1DX1BST0ZJTEVfREVGQVVMVCwKQEAgLTcwOCw2ICs3NDQsMTIgQEAKIAkJZ290byBhc3Ffc2VuZF9jb21tYW5kX2V4aXQ7CiAJfQogCisJaWYgKGk0MGVfaXNfbnZtX3VwZGF0ZV9vcChkZXNjKSAmJiBody0+YXEubnZtX2J1c3kpIHsKKwkJaTQwZV9kZWJ1ZyhodywgSTQwRV9ERUJVR19BUV9NRVNTQUdFLCAiQVFUWDogTlZNIGJ1c3kuXG4iKTsKKwkJc3RhdHVzID0gSTQwRV9FUlJfTlZNOworCQlnb3RvIGFzcV9zZW5kX2NvbW1hbmRfZXhpdDsKKwl9CisKIAlkZXRhaWxzID0gSTQwRV9BRE1JTlFfREVUQUlMUyhody0+YXEuYXNxLCBody0+YXEuYXNxLm5leHRfdG9fdXNlKTsKIAlpZiAoY21kX2RldGFpbHMpIHsKIAkJKmRldGFpbHMgPSAqY21kX2RldGFpbHM7CkBAIC04MzUsNiArODc3LDkgQEAKIAkJaHctPmFxLmFzcV9sYXN0X3N0YXR1cyA9IChlbnVtIGk0MGVfYWRtaW5fcXVldWVfZXJyKXJldHZhbDsKIAl9CiAKKwlpZiAoaTQwZV9pc19udm1fdXBkYXRlX29wKGRlc2MpKQorCQlody0+YXEubnZtX2J1c3kgPSB0cnVlOworCiAJLyogdXBkYXRlIHRoZSBlcnJvciBpZiB0aW1lIG91dCBvY2N1cnJlZCAqLwogCWlmICgoIWNtZF9jb21wbGV0ZWQpICYmCiAJICAgICghZGV0YWlscy0+YXN5bmMgJiYgIWRldGFpbHMtPnBvc3Rwb25lKSkgewpAQCAtOTI5LDYgKzk3NCw5IEBACiAJCQkgICAgICAgZS0+bXNnX3NpemUpOwogCX0KIAorCWlmIChpNDBlX2lzX252bV91cGRhdGVfb3AoJmUtPmRlc2MpKQorCQlody0+YXEubnZtX2J1c3kgPSBmYWxzZTsKKwogCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRhdGFsZW4gYW5kIGJ1ZmZlciBhZGRyZXNzIGluIHRoZSBkZXNjLAogCSAqIEZXIHVwZGF0ZXMgZGF0YWxlbiB0byBpbmRpY2F0ZSB0aGUgZXZlbnQgbWVzc2FnZQogCSAqIHNpemUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuaAppbmRleCA5OTNmNzY4Li5iMTU1MmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucS5oCkBAIC05MCw2ICs5MCw3IEBACiAJdTE2IGZ3X21pbl92ZXI7ICAgICAgICAgICAgICAgICAvKiBmaXJtd2FyZSBtaW5vciB2ZXJzaW9uICovCiAJdTE2IGFwaV9tYWpfdmVyOyAgICAgICAgICAgICAgICAvKiBhcGkgbWFqb3IgdmVyc2lvbiAqLwogCXUxNiBhcGlfbWluX3ZlcjsgICAgICAgICAgICAgICAgLyogYXBpIG1pbm9yIHZlcnNpb24gKi8KKwlib29sIG52bV9idXN5OwogCiAJc3RydWN0IG11dGV4IGFzcV9tdXRleDsgLyogU2VuZCBxdWV1ZSBsb2NrICovCiAJc3RydWN0IG11dGV4IGFycV9tdXRleDsgLyogUmVjZWl2ZSBxdWV1ZSBsb2NrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xX2NtZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucV9jbWQuaAppbmRleCA3YjYzNzRhLi4xNWYyODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xX2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnFfY21kLmgKQEAgLTM0LDcgKzM0LDcgQEAKICAqLwogCiAjZGVmaW5lIEk0MEVfRldfQVBJX1ZFUlNJT05fTUFKT1IgIDB4MDAwMQotI2RlZmluZSBJNDBFX0ZXX0FQSV9WRVJTSU9OX01JTk9SICAweDAwMDEKKyNkZWZpbmUgSTQwRV9GV19BUElfVkVSU0lPTl9NSU5PUiAgMHgwMDAyCiAKIHN0cnVjdCBpNDBlX2FxX2Rlc2MgewogCV9fbGUxNiBmbGFnczsKQEAgLTEyMyw2ICsxMjMsNyBAQAogCWk0MGVfYXFjX29wY19nZXRfdmVyc2lvbiAgICAgID0gMHgwMDAxLAogCWk0MGVfYXFjX29wY19kcml2ZXJfdmVyc2lvbiAgID0gMHgwMDAyLAogCWk0MGVfYXFjX29wY19xdWV1ZV9zaHV0ZG93biAgID0gMHgwMDAzLAorCWk0MGVfYXFjX29wY19zZXRfcGZfY29udGV4dCAgID0gMHgwMDA0LAogCiAJLyogcmVzb3VyY2Ugb3duZXJzaGlwICovCiAJaTQwZV9hcWNfb3BjX3JlcXVlc3RfcmVzb3VyY2UgPSAweDAwMDgsCkBAIC0xODIsOSArMTgzLDYgQEAKIAlpNDBlX2FxY19vcGNfYWRkX21pcnJvcl9ydWxlICAgID0gMHgwMjYwLAogCWk0MGVfYXFjX29wY19kZWxldGVfbWlycm9yX3J1bGUgPSAweDAyNjEsCiAKLQlpNDBlX2FxY19vcGNfc2V0X3N0b3JtX2NvbnRyb2xfY29uZmlnID0gMHgwMjgwLAotCWk0MGVfYXFjX29wY19nZXRfc3Rvcm1fY29udHJvbF9jb25maWcgPSAweDAyODEsCi0KIAkvKiBEQ0IgY29tbWFuZHMgKi8KIAlpNDBlX2FxY19vcGNfZGNiX2lnbm9yZV9wZmMgPSAweDAzMDEsCiAJaTQwZV9hcWNfb3BjX2RjYl91cGRhdGVkICAgID0gMHgwMzAyLApAQCAtMjA3LDYgKzIwNSw3IEBACiAJaTQwZV9hcWNfb3BjX3F1ZXJ5X3N3aXRjaGluZ19jb21wX2J3X2NvbmZpZyAgICAgICAgPSAweDA0MUEsCiAJaTQwZV9hcWNfb3BjX3N1c3BlbmRfcG9ydF90eCAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MUIsCiAJaTQwZV9hcWNfb3BjX3Jlc3VtZV9wb3J0X3R4ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MUMsCisJaTQwZV9hcWNfb3BjX2NvbmZpZ3VyZV9wYXJ0aXRpb25fYncgICAgICAgICAgICAgICAgPSAweDA0MUQsCiAKIAkvKiBobWMgKi8KIAlpNDBlX2FxY19vcGNfcXVlcnlfaG1jX3Jlc291cmNlX3Byb2ZpbGUgPSAweDA1MDAsCkBAIC0yMjQsMTMgKzIyMywxNSBAQAogCWk0MGVfYXFjX29wY19nZXRfcGFydG5lcl9hZHZ0ICAgID0gMHgwNjE2LAogCWk0MGVfYXFjX29wY19zZXRfbGJfbW9kZXMgICAgICAgID0gMHgwNjE4LAogCWk0MGVfYXFjX29wY19nZXRfcGh5X3dvbF9jYXBzICAgID0gMHgwNjIxLAotCWk0MGVfYXFjX29wY19zZXRfcGh5X3Jlc2V0ICAgICAgID0gMHgwNjIyLAorCWk0MGVfYXFjX29wY19zZXRfcGh5X2RlYnVnCSA9IDB4MDYyMiwKIAlpNDBlX2FxY19vcGNfdXBsb2FkX2V4dF9waHlfZm0gICA9IDB4MDYyNSwKIAogCS8qIE5WTSBjb21tYW5kcyAqLwotCWk0MGVfYXFjX29wY19udm1fcmVhZCAgID0gMHgwNzAxLAotCWk0MGVfYXFjX29wY19udm1fZXJhc2UgID0gMHgwNzAyLAotCWk0MGVfYXFjX29wY19udm1fdXBkYXRlID0gMHgwNzAzLAorCWk0MGVfYXFjX29wY19udm1fcmVhZCAgICAgICAgID0gMHgwNzAxLAorCWk0MGVfYXFjX29wY19udm1fZXJhc2UgICAgICAgID0gMHgwNzAyLAorCWk0MGVfYXFjX29wY19udm1fdXBkYXRlICAgICAgID0gMHgwNzAzLAorCWk0MGVfYXFjX29wY19udm1fY29uZmlnX3JlYWQgID0gMHgwNzA0LAorCWk0MGVfYXFjX29wY19udm1fY29uZmlnX3dyaXRlID0gMHgwNzA1LAogCiAJLyogdmlydHVhbGl6YXRpb24gY29tbWFuZHMgKi8KIAlpNDBlX2FxY19vcGNfc2VuZF9tc2dfdG9fcGYgICA9IDB4MDgwMSwKQEAgLTI3Miw4ICsyNzMsNiBAQAogCWk0MGVfYXFjX29wY19kZWJ1Z19zZXRfbW9kZSAgICAgICAgID0gMHhGRjAxLAogCWk0MGVfYXFjX29wY19kZWJ1Z19yZWFkX3JlZyAgICAgICAgID0gMHhGRjAzLAogCWk0MGVfYXFjX29wY19kZWJ1Z193cml0ZV9yZWcgICAgICAgID0gMHhGRjA0LAotCWk0MGVfYXFjX29wY19kZWJ1Z19yZWFkX3JlZ19zZyAgICAgID0gMHhGRjA1LAotCWk0MGVfYXFjX29wY19kZWJ1Z193cml0ZV9yZWdfc2cgICAgID0gMHhGRjA2LAogCWk0MGVfYXFjX29wY19kZWJ1Z19tb2RpZnlfcmVnICAgICAgID0gMHhGRjA3LAogCWk0MGVfYXFjX29wY19kZWJ1Z19kdW1wX2ludGVybmFscyAgID0gMHhGRjA4LAogCWk0MGVfYXFjX29wY19kZWJ1Z19tb2RpZnlfaW50ZXJuYWxzID0gMHhGRjA5LApAQCAtMzQxLDYgKzM0MCwxNCBAQAogCiBJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfcXVldWVfc2h1dGRvd24pOwogCisvKiBTZXQgUEYgY29udGV4dCAoMHgwMDA0LCBkaXJlY3QpICovCitzdHJ1Y3QgaTQwZV9hcWNfc2V0X3BmX2NvbnRleHQgeworCXU4CXBmX2lkOworCXU4CXJlc2VydmVkWzE1XTsKK307CisKK0k0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxY19zZXRfcGZfY29udGV4dCk7CisKIC8qIFJlcXVlc3QgcmVzb3VyY2Ugb3duZXJzaGlwIChkaXJlY3QgMHgwMDA4KQogICogUmVsZWFzZSByZXNvdXJjZSBvd25lcnNoaXAgKGRpcmVjdCAweDAwMDkpCiAgKi8KQEAgLTEyODksMjcgKzEyOTYsNiBAQAogCiBJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfYWRkX2RlbGV0ZV9taXJyb3JfcnVsZV9jb21wbGV0aW9uKTsKIAotLyogU2V0IFN0b3JtIENvbnRyb2wgQ29uZmlndXJhdGlvbiAoZGlyZWN0IDB4MDI4MCkKLSAqIEdldCBTdG9ybSBDb250cm9sIENvbmZpZ3VyYXRpb24gKGRpcmVjdCAweDAyODEpCi0gKiAgICB0aGUgY29tbWFuZCBhbmQgcmVzcG9uc2UgdXNlIHRoZSBzYW1lIGRlc2NyaXB0b3Igc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBpNDBlX2FxY19zZXRfZ2V0X3N0b3JtX2NvbnRyb2xfY29uZmlnIHsKLQlfX2xlMzIgYnJvYWRjYXN0X3RocmVzaG9sZDsKLQlfX2xlMzIgbXVsdGljYXN0X3RocmVzaG9sZDsKLQlfX2xlMzIgY29udHJvbF9mbGFnczsKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9NRElQVyAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9NRElDVyAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9CRElQVyAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9CRElDVyAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9CSURVICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9JTlRFUlZBTF9TSElGVCAgIDgKLSNkZWZpbmUgSTQwRV9BUUNfU1RPUk1fQ09OVFJPTF9JTlRFUlZBTF9NQVNLICAgICgweDNGRiA8PCBcCi0JCQkJCUk0MEVfQVFDX1NUT1JNX0NPTlRST0xfSU5URVJWQUxfU0hJRlQpCi0JdTggICAgIHJlc2VydmVkWzRdOwotfTsKLQotSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX3NldF9nZXRfc3Rvcm1fY29udHJvbF9jb25maWcpOwotCiAvKiBEQ0IgMHgwM3h4Ki8KIAogLyogUEZDIElnbm9yZSAoZGlyZWN0IDB4MDMwMSkKQEAgLTE0MjcsMTEgKzE0MTMsMTIgQEAKIHN0cnVjdCBpNDBlX2FxY19jb25maWd1cmVfc3dpdGNoaW5nX2NvbXBfZXRzX2RhdGEgewogCXU4ICAgICByZXNlcnZlZFs0XTsKIAl1OCAgICAgdGNfdmFsaWRfYml0czsKLQl1OCAgICAgcmVzZXJ2ZWQxOworCXU4ICAgICBzZWVwYWdlOworI2RlZmluZSBJNDBFX0FRX0VUU19TRUVQQUdFX0VOX01BU0sgICAgIDB4MQogCXU4ICAgICB0Y19zdHJpY3RfcHJpb3JpdHlfZmxhZ3M7Ci0JdTggICAgIHJlc2VydmVkMlsxN107CisJdTggICAgIHJlc2VydmVkMVsxN107CiAJdTggICAgIHRjX2J3X3NoYXJlX2NyZWRpdHNbOF07Ci0JdTggICAgIHJlc2VydmVkM1s5Nl07CisJdTggICAgIHJlc2VydmVkMls5Nl07CiB9OwogCiAvKiBDb25maWd1cmUgU3dpdGNoaW5nIENvbXBvbmVudCBCYW5kd2lkdGggTGltaXRzIHBlciBUYyAoaW5kaXJlY3QgMHgwNDE2KSAqLwpAQCAtMTQ5OSw2ICsxNDg2LDE1IEBACiAgKiAoZGlyZWN0IDB4MDQxQiBhbmQgMHgwNDFDKSB1c2VzIHRoZSBnZW5lcmljIFNFSUQgc3RydWN0CiAgKi8KIAorLyogQ29uZmlndXJlIHBhcnRpdGlvbiBCVworICogKGluZGlyZWN0IDB4MDQxRCkKKyAqLworc3RydWN0IGk0MGVfYXFjX2NvbmZpZ3VyZV9wYXJ0aXRpb25fYndfZGF0YSB7CisJX19sZTE2IHBmX3ZhbGlkX2JpdHM7CisJdTggICAgIG1pbl9id1sxNl07ICAgICAgLyogZ3VhcmFudGVlZCBiYW5kd2lkdGggKi8KKwl1OCAgICAgbWF4X2J3WzE2XTsgICAgICAvKiBiYW5kd2lkdGggbGltaXQgKi8KK307CisKIC8qIEdldCBhbmQgc2V0IHRoZSBhY3RpdmUgSE1DIHJlc291cmNlIHByb2ZpbGUgYW5kIHN0YXR1cy4KICAqIChkaXJlY3QgMHgwNTAwKSBhbmQgKGRpcmVjdCAweDA1MDEpCiAgKi8KQEAgLTE1MzksNiArMTUzNSw4IEBACiAJSTQwRV9QSFlfVFlQRV9YTFBQSQkJCT0gMHg5LAogCUk0MEVfUEhZX1RZUEVfNDBHQkFTRV9DUjRfQ1UJCT0gMHhBLAogCUk0MEVfUEhZX1RZUEVfMTBHQkFTRV9DUjFfQ1UJCT0gMHhCLAorCUk0MEVfUEhZX1RZUEVfMTBHQkFTRV9BT0MJCT0gMHhDLAorCUk0MEVfUEhZX1RZUEVfNDBHQkFTRV9BT0MJCT0gMHhELAogCUk0MEVfUEhZX1RZUEVfMTAwQkFTRV9UWAkJPSAweDExLAogCUk0MEVfUEhZX1RZUEVfMTAwMEJBU0VfVAkJPSAweDEyLAogCUk0MEVfUEhZX1RZUEVfMTBHQkFTRV9UCQkJPSAweDEzLApAQCAtMTU0OSw3ICsxNTQ3LDEwIEBACiAJSTQwRV9QSFlfVFlQRV80MEdCQVNFX0NSNAkJPSAweDE4LAogCUk0MEVfUEhZX1RZUEVfNDBHQkFTRV9TUjQJCT0gMHgxOSwKIAlJNDBFX1BIWV9UWVBFXzQwR0JBU0VfTFI0CQk9IDB4MUEsCi0JSTQwRV9QSFlfVFlQRV8yMEdCQVNFX0tSMgkJPSAweDFCLAorCUk0MEVfUEhZX1RZUEVfMTAwMEJBU0VfU1gJCT0gMHgxQiwKKwlJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX0xYCQk9IDB4MUMsCisJSTQwRV9QSFlfVFlQRV8xMDAwQkFTRV9UX09QVElDQUwJPSAweDFELAorCUk0MEVfUEhZX1RZUEVfMjBHQkFTRV9LUjIJCT0gMHgxRSwKIAlJNDBFX1BIWV9UWVBFX01BWAogfTsKIApAQCAtMTU4MywxMSArMTU4NCw4IEBACiAjZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfUEFVU0VfVFggICAgICAgICAweDAxCiAjZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfUEFVU0VfUlggICAgICAgICAweDAyCiAjZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfTE9XX1BPV0VSICAgICAgICAweDA0Ci0jZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfQU5fU0hJRlQgICAgICAgICAzCi0jZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfQU5fTUFTSyAgICAgICAgICAoMHgzIDw8IEk0MEVfQVFfUEhZX0ZMQUdfQU5fU0hJRlQpCi0jZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfQU5fT0ZGICAgICAgICAgICAweDAwIC8qIGxpbmsgZm9yY2VkIG9uICovCi0jZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfQU5fT0ZGX0xJTktfRE9XTiAweDAxCi0jZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfQU5fT04gICAgICAgICAgICAweDAyCisjZGVmaW5lIEk0MEVfQVFfUEhZX0xJTktfRU5BQkxFRAkJICAweDA4CisjZGVmaW5lIEk0MEVfQVFfUEhZX0FOX0VOQUJMRUQJCQkgIDB4MTAKICNkZWZpbmUgSTQwRV9BUV9QSFlfRkxBR19NT0RVTEVfUVVBTCAgICAgIDB4MjAKIAlfX2xlMTYgZWVlX2NhcGFiaWxpdHk7CiAjZGVmaW5lIEk0MEVfQVFfRUVFXzEwMEJBU0VfVFggICAgICAgMHgwMDAyCkBAIC0xNjk2LDYgKzE2OTQsNyBAQAogI2RlZmluZSBJNDBFX0FRX0xJTktfVFhfQUNUSVZFICAgICAgIDB4MDAKICNkZWZpbmUgSTQwRV9BUV9MSU5LX1RYX0RSQUlORUQgICAgICAweDAxCiAjZGVmaW5lIEk0MEVfQVFfTElOS19UWF9GTFVTSEVEICAgICAgMHgwMworI2RlZmluZSBJNDBFX0FRX0xJTktfRk9SQ0VEXzQwRyAgICAgIDB4MTAKIAl1OCAgICAgbG9vcGJhY2s7ICAgICAgICAgLyogdXNlIGRlZmluZXMgZnJvbSBpNDBlX2FxY19zZXRfbGJfbW9kZSAqLwogCV9fbGUxNiBtYXhfZnJhbWVfc2l6ZTsKIAl1OCAgICAgY29uZmlnOwpAQCAtMTc0NywxNCArMTc0NiwyMSBAQAogCiBJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfc2V0X2xiX21vZGUpOwogCi0vKiBTZXQgUEhZIFJlc2V0IGNvbW1hbmQgKDB4MDYyMikgKi8KLXN0cnVjdCBpNDBlX2FxY19zZXRfcGh5X3Jlc2V0IHsKLQl1OCAgICAgcmVzZXRfZmxhZ3M7Ci0jZGVmaW5lIEk0MEVfQVFfUEhZX1JFU0VUX1JFUVVFU1QgIDB4MDIKKy8qIFNldCBQSFkgRGVidWcgY29tbWFuZCAoMHgwNjIyKSAqLworc3RydWN0IGk0MGVfYXFjX3NldF9waHlfZGVidWcgeworCXU4ICAgICBjb21tYW5kX2ZsYWdzOworI2RlZmluZSBJNDBFX0FRX1BIWV9ERUJVR19SRVNFVF9JTlRFUk5BTAkweDAyCisjZGVmaW5lIEk0MEVfQVFfUEhZX0RFQlVHX1JFU0VUX0VYVEVSTkFMX1NISUZUCTIKKyNkZWZpbmUgSTQwRV9BUV9QSFlfREVCVUdfUkVTRVRfRVhURVJOQUxfTUFTSwkoMHgwMyA8PCBcCisJCQkJCUk0MEVfQVFfUEhZX0RFQlVHX1JFU0VUX0VYVEVSTkFMX1NISUZUKQorI2RlZmluZSBJNDBFX0FRX1BIWV9ERUJVR19SRVNFVF9FWFRFUk5BTF9OT05FCTB4MDAKKyNkZWZpbmUgSTQwRV9BUV9QSFlfREVCVUdfUkVTRVRfRVhURVJOQUxfSEFSRAkweDAxCisjZGVmaW5lIEk0MEVfQVFfUEhZX0RFQlVHX1JFU0VUX0VYVEVSTkFMX1NPRlQJMHgwMgorI2RlZmluZSBJNDBFX0FRX1BIWV9ERUJVR19ESVNBQkxFX0xJTktfRlcJMHgxMAogCXU4ICAgICByZXNlcnZlZFsxNV07CiB9OwogCi1JNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfc2V0X3BoeV9yZXNldCk7CitJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfc2V0X3BoeV9kZWJ1Zyk7CiAKIGVudW0gaTQwZV9hcV9waHlfcmVnX3R5cGUgewogCUk0MEVfQVFDX1BIWV9SRUdfSU5URVJOQUwgICAgICAgICA9IDB4MSwKQEAgLTE3NzksNiArMTc4NSw0NyBAQAogCiBJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfbnZtX3VwZGF0ZSk7CiAKKy8qIE5WTSBDb25maWcgUmVhZCAoaW5kaXJlY3QgMHgwNzA0KSAqLworc3RydWN0IGk0MGVfYXFjX252bV9jb25maWdfcmVhZCB7CisJX19sZTE2IGNtZF9mbGFnczsKKyNkZWZpbmUgQU5WTV9TSU5HTEVfT1JfTVVMVElQTEVfRkVBVFVSRVNfTUFTSwkxCisjZGVmaW5lIEFOVk1fUkVBRF9TSU5HTEVfRkVBVFVSRQkJMAorI2RlZmluZSBBTlZNX1JFQURfTVVMVElQTEVfRkVBVFVSRVMJCTEKKwlfX2xlMTYgZWxlbWVudF9jb3VudDsKKwlfX2xlMTYgZWxlbWVudF9pZDsJCS8qIEZlYXR1cmUvZmllbGQgSUQgKi8KKwl1OCAgICAgcmVzZXJ2ZWRbMl07CisJX19sZTMyIGFkZHJlc3NfaGlnaDsKKwlfX2xlMzIgYWRkcmVzc19sb3c7Cit9OworCitJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfbnZtX2NvbmZpZ19yZWFkKTsKKworLyogTlZNIENvbmZpZyBXcml0ZSAoaW5kaXJlY3QgMHgwNzA1KSAqLworc3RydWN0IGk0MGVfYXFjX252bV9jb25maWdfd3JpdGUgeworCV9fbGUxNiBjbWRfZmxhZ3M7CisJX19sZTE2IGVsZW1lbnRfY291bnQ7CisJdTggICAgIHJlc2VydmVkWzRdOworCV9fbGUzMiBhZGRyZXNzX2hpZ2g7CisJX19sZTMyIGFkZHJlc3NfbG93OworfTsKKworSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX252bV9jb25maWdfd3JpdGUpOworCitzdHJ1Y3QgaTQwZV9hcWNfbnZtX2NvbmZpZ19kYXRhX2ZlYXR1cmUgeworCV9fbGUxNiBmZWF0dXJlX2lkOworCV9fbGUxNiBpbnN0YW5jZV9pZDsKKwlfX2xlMTYgZmVhdHVyZV9vcHRpb25zOworCV9fbGUxNiBmZWF0dXJlX3NlbGVjdGlvbjsKK307CisKK3N0cnVjdCBpNDBlX2FxY19udm1fY29uZmlnX2RhdGFfaW1tZWRpYXRlX2ZpZWxkIHsKKyNkZWZpbmUgQU5WTV9GRUFUVVJFX09SX0lNTUVESUFURV9NQVNLCTB4MgorCV9fbGUxNiBmaWVsZF9pZDsKKwlfX2xlMTYgaW5zdGFuY2VfaWQ7CisJX19sZTE2IGZpZWxkX29wdGlvbnM7CisJX19sZTE2IGZpZWxkX3ZhbHVlOworfTsKKwogLyogU2VuZCB0byBQRiBjb21tYW5kIChpbmRpcmVjdCAweDA4MDEpIGlkIGlzIG9ubHkgdXNlZCBieSBQRgogICogU2VuZCB0byBWRiBjb21tYW5kIChpbmRpcmVjdCAweDA4MDIpIGlkIGlzIG9ubHkgdXNlZCBieSBQRgogICogU2VuZCB0byBQZWVyIFBGIGNvbW1hbmQgKGluZGlyZWN0IDB4MDgwMykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jb21tb24uYwppbmRleCA5MjJjZGNjLi42ZTY1ZjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NvbW1vbi5jCkBAIC00MywxMiArNDMsMTAgQEAKIAlpZiAoaHctPnZlbmRvcl9pZCA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSB7CiAJCXN3aXRjaCAoaHctPmRldmljZV9pZCkgewogCQljYXNlIEk0MEVfREVWX0lEX1NGUF9YTDcxMDoKLQkJY2FzZSBJNDBFX0RFVl9JRF9TRlBfWDcxMDoKIAkJY2FzZSBJNDBFX0RFVl9JRF9RRU1VOgogCQljYXNlIEk0MEVfREVWX0lEX0tYX0E6CiAJCWNhc2UgSTQwRV9ERVZfSURfS1hfQjoKIAkJY2FzZSBJNDBFX0RFVl9JRF9LWF9DOgotCQljYXNlIEk0MEVfREVWX0lEX0tYX0Q6CiAJCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9BOgogCQljYXNlIEk0MEVfREVWX0lEX1FTRlBfQjoKIAkJY2FzZSBJNDBFX0RFVl9JRF9RU0ZQX0M6CkBAIC0xMzMsNyArMTMxLDExIEBACiAgKiovCiBib29sIGk0MGVfY2hlY2tfYXNxX2FsaXZlKHN0cnVjdCBpNDBlX2h3ICpodykKIHsKLQlyZXR1cm4gISEocmQzMihodywgaHctPmFxLmFzcS5sZW4pICYgSTQwRV9QRl9BVFFMRU5fQVRRRU5BQkxFX01BU0spOworCWlmIChody0+YXEuYXNxLmxlbikKKwkJcmV0dXJuICEhKHJkMzIoaHcsIGh3LT5hcS5hc3EubGVuKSAmCisJCQkgIEk0MEVfUEZfQVRRTEVOX0FUUUVOQUJMRV9NQVNLKTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKIH0KIAogLyoqCkBAIC02NTMsNiArNjU1LDM2IEBACiB9CiAKIC8qKgorICogaTQwZV9wcmVfdHhfcXVldWVfY2ZnIC0gcHJlIHR4IHF1ZXVlIGNvbmZpZ3VyZQorICogQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqIEBxdWV1ZTogdGFyZ2V0IHBmIHF1ZXVlIGluZGV4CisgKiBAZW5hYmxlOiBzdGF0ZSBjaGFuZ2UgcmVxdWVzdAorICoKKyAqIEhhbmRsZXMgaHcgcmVxdWlyZW1lbnQgdG8gaW5kaWNhdGUgaW50ZW50aW9uIHRvIGVuYWJsZQorICogb3IgZGlzYWJsZSB0YXJnZXQgcXVldWUuCisgKiovCit2b2lkIGk0MGVfcHJlX3R4X3F1ZXVlX2NmZyhzdHJ1Y3QgaTQwZV9odyAqaHcsIHUzMiBxdWV1ZSwgYm9vbCBlbmFibGUpCit7CisJdTMyIGFic19xdWV1ZV9pZHggPSBody0+ZnVuY19jYXBzLmJhc2VfcXVldWUgKyBxdWV1ZTsKKwl1MzIgcmVnX2Jsb2NrID0gMDsKKwl1MzIgcmVnX3ZhbDsKKworCWlmIChhYnNfcXVldWVfaWR4ID49IDEyOCkKKwkJcmVnX2Jsb2NrID0gYWJzX3F1ZXVlX2lkeCAvIDEyODsKKworCXJlZ192YWwgPSByZDMyKGh3LCBJNDBFX0dMTEFOX1RYUFJFX1FESVMocmVnX2Jsb2NrKSk7CisJcmVnX3ZhbCAmPSB+STQwRV9HTExBTl9UWFBSRV9RRElTX1FJTkRYX01BU0s7CisJcmVnX3ZhbCB8PSAoYWJzX3F1ZXVlX2lkeCA8PCBJNDBFX0dMTEFOX1RYUFJFX1FESVNfUUlORFhfU0hJRlQpOworCisJaWYgKGVuYWJsZSkKKwkJcmVnX3ZhbCB8PSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfQ0xFQVJfUURJU19NQVNLOworCWVsc2UKKwkJcmVnX3ZhbCB8PSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfU0VUX1FESVNfTUFTSzsKKworCXdyMzIoaHcsIEk0MEVfR0xMQU5fVFhQUkVfUURJUyhyZWdfYmxvY2spLCByZWdfdmFsKTsKK30KKworLyoqCiAgKiBpNDBlX2dldF9tZWRpYV90eXBlIC0gR2V0cyBtZWRpYSB0eXBlCiAgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIHN0cnVjdHVyZQogICoqLwpAQCAtNjk5LDcgKzczMSw3IEBACiB9CiAKICNkZWZpbmUgSTQwRV9QRl9SRVNFVF9XQUlUX0NPVU5UX0EwCTIwMAotI2RlZmluZSBJNDBFX1BGX1JFU0VUX1dBSVRfQ09VTlQJMTAKKyNkZWZpbmUgSTQwRV9QRl9SRVNFVF9XQUlUX0NPVU5UCTEwMAogLyoqCiAgKiBpNDBlX3BmX3Jlc2V0IC0gUmVzZXQgdGhlIFBGCiAgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIHN0cnVjdHVyZQpAQCAtNzg5LDYgKzgyMSw5IEBACiB7CiAJdTMyIHJlZzsKIAorCWlmIChpNDBlX2NoZWNrX2FzcV9hbGl2ZShodykpCisJCWk0MGVfYXFfY2xlYXJfcHhlX21vZGUoaHcsIE5VTEwpOworCiAJLyogQ2xlYXIgc2luZ2xlIGRlc2NyaXB0b3IgZmV0Y2gvd3JpdGUtYmFjayBtb2RlICovCiAJcmVnID0gcmQzMihodywgSTQwRV9HTExBTl9SQ1RMXzApOwogCkBAIC05MDcsNiArOTQyLDMzIEBACiAvKiBBZG1pbiBjb21tYW5kIHdyYXBwZXJzICovCiAKIC8qKgorICogaTQwZV9hcV9jbGVhcl9weGVfbW9kZQorICogQGh3OiBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3QKKyAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMgc3RydWN0dXJlIG9yIE5VTEwKKyAqCisgKiBUZWxsIHRoZSBmaXJtd2FyZSB0aGF0IHRoZSBkcml2ZXIgaXMgdGFraW5nIG92ZXIgZnJvbSBQWEUKKyAqKi8KK2k0MGVfc3RhdHVzIGk0MGVfYXFfY2xlYXJfcHhlX21vZGUoc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpCit7CisJaTQwZV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBpNDBlX2FxX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgaTQwZV9hcWNfY2xlYXJfcHhlICpjbWQgPQorCQkoc3RydWN0IGk0MGVfYXFjX2NsZWFyX3B4ZSAqKSZkZXNjLnBhcmFtcy5yYXc7CisKKwlpNDBlX2ZpbGxfZGVmYXVsdF9kaXJlY3RfY21kX2Rlc2MoJmRlc2MsCisJCQkJCSAgaTQwZV9hcWNfb3BjX2NsZWFyX3B4ZV9tb2RlKTsKKworCWNtZC0+cnhfY250ID0gMHgyOworCisJc3RhdHVzID0gaTQwZV9hc3Ffc2VuZF9jb21tYW5kKGh3LCAmZGVzYywgTlVMTCwgMCwgY21kX2RldGFpbHMpOworCisJd3IzMihodywgSTQwRV9HTExBTl9SQ1RMXzAsIDB4MSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKICAqIGk0MGVfYXFfc2V0X2xpbmtfcmVzdGFydF9hbgogICogQGh3OiBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3QKICAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMgc3RydWN0dXJlIG9yIE5VTEwKQEAgLTk3NSw2ICsxMDM3LDEzIEBACiAJaHdfbGlua19pbmZvLT5hbl9pbmZvID0gcmVzcC0+YW5faW5mbzsKIAlod19saW5rX2luZm8tPmV4dF9pbmZvID0gcmVzcC0+ZXh0X2luZm87CiAJaHdfbGlua19pbmZvLT5sb29wYmFjayA9IHJlc3AtPmxvb3BiYWNrOworCWh3X2xpbmtfaW5mby0+bWF4X2ZyYW1lX3NpemUgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfZnJhbWVfc2l6ZSk7CisJaHdfbGlua19pbmZvLT5wYWNpbmcgPSByZXNwLT5jb25maWcgJiBJNDBFX0FRX0NPTkZJR19QQUNJTkdfTUFTSzsKKworCWlmIChyZXNwLT5jb25maWcgJiBJNDBFX0FRX0NPTkZJR19DUkNfRU5BKQorCQlod19saW5rX2luZm8tPmNyY19lbmFibGUgPSB0cnVlOworCWVsc2UKKwkJaHdfbGlua19pbmZvLT5jcmNfZW5hYmxlID0gZmFsc2U7CiAKIAlpZiAocmVzcC0+Y29tbWFuZF9mbGFncyAmIGNwdV90b19sZTE2KEk0MEVfQVFfTFNFX0VOQUJMRSkpCiAJCWh3X2xpbmtfaW5mby0+bHNlX2VuYWJsZSA9IHRydWU7CkBAIC0xMDIxLDggKzEwOTAsNiBAQAogCWNtZC0+dnNpX2ZsYWdzID0gY3B1X3RvX2xlMTYodnNpX2N0eC0+ZmxhZ3MpOwogCiAJZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNigodTE2KShJNDBFX0FRX0ZMQUdfQlVGIHwgSTQwRV9BUV9GTEFHX1JEKSk7Ci0JaWYgKHNpemVvZih2c2lfY3R4LT5pbmZvKSA+IEk0MEVfQVFfTEFSR0VfQlVGKQotCQlkZXNjLmZsYWdzIHw9IGNwdV90b19sZTE2KCh1MTYpSTQwRV9BUV9GTEFHX0xCKTsKIAogCXN0YXR1cyA9IGk0MGVfYXNxX3NlbmRfY29tbWFuZChodywgJmRlc2MsICZ2c2lfY3R4LT5pbmZvLAogCQkJCSAgICBzaXplb2YodnNpX2N0eC0+aW5mbyksIGNtZF9kZXRhaWxzKTsKQEAgLTExNjMsOCArMTIzMCw2IEBACiAJY21kLT51cGxpbmtfc2VpZCA9IGNwdV90b19sZTE2KHZzaV9jdHgtPnNlaWQpOwogCiAJZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNigodTE2KUk0MEVfQVFfRkxBR19CVUYpOwotCWlmIChzaXplb2YodnNpX2N0eC0+aW5mbykgPiBJNDBFX0FRX0xBUkdFX0JVRikKLQkJZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNigodTE2KUk0MEVfQVFfRkxBR19MQik7CiAKIAlzdGF0dXMgPSBpNDBlX2FzcV9zZW5kX2NvbW1hbmQoaHcsICZkZXNjLCAmdnNpX2N0eC0+aW5mbywKIAkJCQkgICAgc2l6ZW9mKHZzaV9jdHgtPmluZm8pLCBOVUxMKTsKQEAgLTEyMDMsOCArMTI2OCw2IEBACiAJY21kLT51cGxpbmtfc2VpZCA9IGNwdV90b19sZTE2KHZzaV9jdHgtPnNlaWQpOwogCiAJZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNigodTE2KShJNDBFX0FRX0ZMQUdfQlVGIHwgSTQwRV9BUV9GTEFHX1JEKSk7Ci0JaWYgKHNpemVvZih2c2lfY3R4LT5pbmZvKSA+IEk0MEVfQVFfTEFSR0VfQlVGKQotCQlkZXNjLmZsYWdzIHw9IGNwdV90b19sZTE2KCh1MTYpSTQwRV9BUV9GTEFHX0xCKTsKIAogCXN0YXR1cyA9IGk0MGVfYXNxX3NlbmRfY29tbWFuZChodywgJmRlc2MsICZ2c2lfY3R4LT5pbmZvLAogCQkJCSAgICBzaXplb2YodnNpX2N0eC0+aW5mbyksIGNtZF9kZXRhaWxzKTsKQEAgLTEzMDAsNiArMTM2Myw3IEBACiAJc3RydWN0IGk0MGVfYXFjX2RyaXZlcl92ZXJzaW9uICpjbWQgPQogCQkoc3RydWN0IGk0MGVfYXFjX2RyaXZlcl92ZXJzaW9uICopJmRlc2MucGFyYW1zLnJhdzsKIAlpNDBlX3N0YXR1cyBzdGF0dXM7CisJdTE2IGxlbjsKIAogCWlmIChkdiA9PSBOVUxMKQogCQlyZXR1cm4gSTQwRV9FUlJfUEFSQU07CkBAIC0xMzExLDcgKzEzNzUsMTQgQEAKIAljbWQtPmRyaXZlcl9taW5vcl92ZXIgPSBkdi0+bWlub3JfdmVyc2lvbjsKIAljbWQtPmRyaXZlcl9idWlsZF92ZXIgPSBkdi0+YnVpbGRfdmVyc2lvbjsKIAljbWQtPmRyaXZlcl9zdWJidWlsZF92ZXIgPSBkdi0+c3ViYnVpbGRfdmVyc2lvbjsKLQlzdGF0dXMgPSBpNDBlX2FzcV9zZW5kX2NvbW1hbmQoaHcsICZkZXNjLCBOVUxMLCAwLCBjbWRfZGV0YWlscyk7CisKKwlsZW4gPSAwOworCXdoaWxlIChsZW4gPCBzaXplb2YoZHYtPmRyaXZlcl9zdHJpbmcpICYmCisJICAgICAgIChkdi0+ZHJpdmVyX3N0cmluZ1tsZW5dIDwgMHg4MCkgJiYKKwkgICAgICAgZHYtPmRyaXZlcl9zdHJpbmdbbGVuXSkKKwkJbGVuKys7CisJc3RhdHVzID0gaTQwZV9hc3Ffc2VuZF9jb21tYW5kKGh3LCAmZGVzYywgZHYtPmRyaXZlcl9zdHJpbmcsCisJCQkJICAgICAgIGxlbiwgY21kX2RldGFpbHMpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE5MDAsNiArMTk3MSwxMiBAQAogCQl9CiAJfQogCisJLyogU29mdHdhcmUgb3ZlcnJpZGUgZW5zdXJpbmcgRkNvRSBpcyBkaXNhYmxlZCBpZiBucGFyIG9yIG1mcAorCSAqIG1vZGUgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZXNlIG1vZGVzLgorCSAqLworCWlmIChwLT5ucGFyX2VuYWJsZSB8fCBwLT5tZnBfbW9kZV8xKQorCQlwLT5mY29lID0gZmFsc2U7CisKIAkvKiBhZGRpdGlvbmFsIEhXIHNwZWNpZmljIGdvb2RpZXMgdGhhdCBtaWdodAogCSAqIHNvbWVkYXkgYmUgSFcgdmVyc2lvbiBzcGVjaWZpYwogCSAqLwpAQCAtMjA5NCw4ICsyMTcxLDggQEAKICAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMgc3RydWN0dXJlIG9yIE5VTEwKICAqKi8KIGk0MGVfc3RhdHVzIGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoc3RydWN0IGk0MGVfaHcgKmh3LAotCQkJCXUxNiB1ZHBfcG9ydCwgdTggaGVhZGVyX2xlbiwKLQkJCQl1OCBwcm90b2NvbF9pbmRleCwgdTggKmZpbHRlcl9pbmRleCwKKwkJCQl1MTYgdWRwX3BvcnQsIHU4IHByb3RvY29sX2luZGV4LAorCQkJCXU4ICpmaWx0ZXJfaW5kZXgsCiAJCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscykKIHsKIAlzdHJ1Y3QgaTQwZV9hcV9kZXNjIGRlc2M7CkBAIC0yMjUzLDYgKzIzMzAsMzUgQEAKIH0KIAogLyoqCisgKiBpNDBlX2FxX2NvbmZpZ192c2lfYndfbGltaXQgLSBDb25maWd1cmUgVlNJIEJXIExpbWl0CisgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIGh3IHN0cnVjdAorICogQHNlaWQ6IFZTSSBzZWlkCisgKiBAY3JlZGl0OiBCVyBsaW1pdCBjcmVkaXRzICgwID0gZGlzYWJsZWQpCisgKiBAbWF4X2NyZWRpdDogTWF4IEJXIGxpbWl0IGNyZWRpdHMKKyAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMgc3RydWN0dXJlIG9yIE5VTEwKKyAqKi8KK2k0MGVfc3RhdHVzIGk0MGVfYXFfY29uZmlnX3ZzaV9id19saW1pdChzdHJ1Y3QgaTQwZV9odyAqaHcsCisJCQkJdTE2IHNlaWQsIHUxNiBjcmVkaXQsIHU4IG1heF9jcmVkaXQsCisJCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscykKK3sKKwlzdHJ1Y3QgaTQwZV9hcV9kZXNjIGRlc2M7CisJc3RydWN0IGk0MGVfYXFjX2NvbmZpZ3VyZV92c2lfYndfbGltaXQgKmNtZCA9CisJCShzdHJ1Y3QgaTQwZV9hcWNfY29uZmlndXJlX3ZzaV9id19saW1pdCAqKSZkZXNjLnBhcmFtcy5yYXc7CisJaTQwZV9zdGF0dXMgc3RhdHVzOworCisJaTQwZV9maWxsX2RlZmF1bHRfZGlyZWN0X2NtZF9kZXNjKCZkZXNjLAorCQkJCQkgIGk0MGVfYXFjX29wY19jb25maWd1cmVfdnNpX2J3X2xpbWl0KTsKKworCWNtZC0+dnNpX3NlaWQgPSBjcHVfdG9fbGUxNihzZWlkKTsKKwljbWQtPmNyZWRpdCA9IGNwdV90b19sZTE2KGNyZWRpdCk7CisJY21kLT5tYXhfY3JlZGl0ID0gbWF4X2NyZWRpdDsKKworCXN0YXR1cyA9IGk0MGVfYXNxX3NlbmRfY29tbWFuZChodywgJmRlc2MsIE5VTEwsIDAsIGNtZF9kZXRhaWxzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgogICogaTQwZV9hcV9jb25maWdfdnNpX3RjX2J3IC0gQ29uZmlnIFZTSSBCVyBBbGxvY2F0aW9uIHBlciBUQwogICogQGh3OiBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3QKICAqIEBzZWlkOiBWU0kgc2VpZApAQCAtMjQwNSw3ICsyNTExLDcgQEAKIHsKIAl1MzIgZmNvZV9jbnR4X3NpemUsIGZjb2VfZmlsdF9zaXplOwogCXUzMiBwZV9jbnR4X3NpemUsIHBlX2ZpbHRfc2l6ZTsKLQl1MzIgZmNvZV9mbWF4LCBwZV9mbWF4OworCXUzMiBmY29lX2ZtYXg7CiAJdTMyIHZhbDsKIAogCS8qIFZhbGlkYXRlIEZDb0Ugc2V0dGluZ3MgcGFzc2VkICovCkBAIC0yNDgwLDEzICsyNTg2LDYgQEAKIAlpZiAoZmNvZV9maWx0X3NpemUgKyBmY29lX2NudHhfc2l6ZSA+ICBmY29lX2ZtYXgpCiAJCXJldHVybiBJNDBFX0VSUl9JTlZBTElEX1NJWkU7CiAKLQkvKiBQRUhTSVpFICsgUEVEU0laRSBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiBQTVBFWEZNQVggKi8KLQl2YWwgPSByZDMyKGh3LCBJNDBFX0dMSE1DX1BFWEZNQVgpOwotCXBlX2ZtYXggPSAodmFsICYgSTQwRV9HTEhNQ19QRVhGTUFYX1BNUEVYRk1BWF9NQVNLKQotCQkgICA+PiBJNDBFX0dMSE1DX1BFWEZNQVhfUE1QRVhGTUFYX1NISUZUOwotCWlmIChwZV9maWx0X3NpemUgKyBwZV9jbnR4X3NpemUgPiAgcGVfZm1heCkKLQkJcmV0dXJuIEk0MEVfRVJSX0lOVkFMSURfU0laRTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGNiX25sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGNiX25sLmMKaW5kZXggNmU4MTAzYS4uMDBiYzBjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RjYl9ubC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kY2JfbmwuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCQkgICAgICBzdHJ1Y3QgaTQwZV9pZWVlX2FwcF9wcmlvcml0eV90YWJsZSAqYXBwKQogewogCWludCB2LCBlcnI7Ci0JZm9yICh2ID0gMDsgdiA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IHYrKykgeworCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCWlmIChwZi0+dnNpW3ZdICYmIHBmLT52c2lbdl0tPm5ldGRldikgewogCQkJZXJyID0gaTQwZV9kY2JubF92c2lfZGVsX2FwcChwZi0+dnNpW3ZdLCBhcHApOwogCQkJaWYgKGVycikKQEAgLTMwMiw4ICszMDIsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2c2ktPm5ldGRldjsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBpNDBlX25ldGRldl90b19wZihkZXYpOwogCi0JLyogRENCIG5vdCBlbmFibGVkICovCi0JaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKSkKKwkvKiBOb3QgRENCIGNhcGFibGUgKi8KKwlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0NBUEFCTEUpKQogCQlyZXR1cm47CiAKIAkvKiBEbyBub3Qgc2V0dXAgRENCIE5MIG9wcyBmb3IgTUZQIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGVidWdmcy5jCmluZGV4IDNjMzczODYuLmNmZmRmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RlYnVnZnMuYwpAQCAtNDUsNyArNDUsNyBAQAogCWlmIChzZWlkIDwgMCkKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIlZDogYmFkIHNlaWRcbiIsIHNlaWQpOwogCWVsc2UKLQkJZm9yIChpID0gMDsgaSA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IHBmLT5udW1fYWxsb2NfdnNpOyBpKyspCiAJCQlpZiAocGYtPnZzaVtpXSAmJiAocGYtPnZzaVtpXS0+c2VpZCA9PSBzZWlkKSkKIAkJCQlyZXR1cm4gcGYtPnZzaVtpXTsKIApAQCAtODQzLDcgKzg0Myw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKQogCQlpZiAocGYtPnZzaVtpXSkKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiZHVtcCB2c2lbJWRdOiAlZFxuIiwKIAkJCQkgaSwgcGYtPnZzaVtpXS0+c2VpZCk7CkBAIC04NjIsMTIgKzg2MiwxMSBAQAogCQkgIiAgICByeF9ieXRlcyA9IFx0JWxsZCBcdHJ4X3VuaWNhc3QgPSBcdFx0JWxsZCBcdHJ4X211bHRpY2FzdCA9IFx0JWxsZFxuIiwKIAkJZXN0YXRzLT5yeF9ieXRlcywgZXN0YXRzLT5yeF91bmljYXN0LCBlc3RhdHMtPnJ4X211bHRpY2FzdCk7CiAJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCSAiICAgIHJ4X2Jyb2FkY2FzdCA9IFx0JWxsZCBcdHJ4X2Rpc2NhcmRzID0gXHRcdCVsbGQgXHRyeF9lcnJvcnMgPSBcdCVsbGRcbiIsCi0JCSBlc3RhdHMtPnJ4X2Jyb2FkY2FzdCwgZXN0YXRzLT5yeF9kaXNjYXJkcywgZXN0YXRzLT5yeF9lcnJvcnMpOworCQkgIiAgICByeF9icm9hZGNhc3QgPSBcdCVsbGQgXHRyeF9kaXNjYXJkcyA9IFx0XHQlbGxkXG4iLAorCQkgZXN0YXRzLT5yeF9icm9hZGNhc3QsIGVzdGF0cy0+cnhfZGlzY2FyZHMpOwogCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkgIiAgICByeF9taXNzZWQgPSBcdCVsbGQgXHRyeF91bmtub3duX3Byb3RvY29sID0gXHQlbGxkIFx0dHhfYnl0ZXMgPSBcdCVsbGRcbiIsCi0JCSBlc3RhdHMtPnJ4X21pc3NlZCwgZXN0YXRzLT5yeF91bmtub3duX3Byb3RvY29sLAotCQkgZXN0YXRzLT50eF9ieXRlcyk7CisJCSAiICAgIHJ4X3Vua25vd25fcHJvdG9jb2wgPSBcdCVsbGQgXHR0eF9ieXRlcyA9IFx0JWxsZFxuIiwKKwkJIGVzdGF0cy0+cnhfdW5rbm93bl9wcm90b2NvbCwgZXN0YXRzLT50eF9ieXRlcyk7CiAJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCiAJCSAiICAgIHR4X3VuaWNhc3QgPSBcdCVsbGQgXHR0eF9tdWx0aWNhc3QgPSBcdFx0JWxsZCBcdHR4X2Jyb2FkY2FzdCA9IFx0JWxsZFxuIiwKIAkJIGVzdGF0cy0+dHhfdW5pY2FzdCwgZXN0YXRzLT50eF9tdWx0aWNhc3QsIGVzdGF0cy0+dHhfYnJvYWRjYXN0KTsKQEAgLTE1MjcsNyArMTUyNiw3IEBACiAJCQljbnQgPSBzc2NhbmYoJmNtZF9idWZbMTVdLCAiJWkiLCAmdnNpX3NlaWQpOwogCQkJaWYgKGNudCA9PSAwKSB7CiAJCQkJaW50IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IGkrKykKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGYtPm51bV9hbGxvY192c2k7IGkrKykKIAkJCQkJaTQwZV92c2lfcmVzZXRfc3RhdHMocGYtPnZzaVtpXSk7CiAJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJ2c2kgY2xlYXIgc3RhdHMgY2FsbGVkIGZvciBhbGwgdnNpJ3NcbiIpOwogCQkJfSBlbHNlIGlmIChjbnQgPT0gMSkgewpAQCAtMTc0NCwxMCArMTc0Myw2IEBACiAJCWk0MGVfZGJnX2NtZF9mZF9jdHJsKHBmLCBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQsIGZhbHNlKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoY21kX2J1ZiwgImZkLWF0ciBvbiIsIDkpID09IDApIHsKIAkJaTQwZV9kYmdfY21kX2ZkX2N0cmwocGYsIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCwgdHJ1ZSk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZF9idWYsICJmZC1zYiBvZmYiLCA5KSA9PSAwKSB7Ci0JCWk0MGVfZGJnX2NtZF9mZF9jdHJsKHBmLCBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCwgZmFsc2UpOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWRfYnVmLCAiZmQtc2Igb24iLCA4KSA9PSAwKSB7Ci0JCWk0MGVfZGJnX2NtZF9mZF9jdHJsKHBmLCBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCwgdHJ1ZSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGNtZF9idWYsICJsbGRwIiwgNCkgPT0gMCkgewogCQlpZiAoc3RybmNtcCgmY21kX2J1Zls1XSwgInN0b3AiLCA0KSA9PSAwKSB7CiAJCQlpbnQgcmV0OwpAQCAtMTk2Nyw4ICsxOTYyLDYgQEAKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIHJlbSBmZF9maWx0ZXIgPGRlc3QgcV9pbmRleD4gPGZsZXhfb2ZmPiA8cGN0eXBlPiA8ZGVzdF92c2k+IDxkZXN0X2N0bD4gPGZkX3N0YXR1cz4gPGNudF9pbmRleD4gPGZkX2lkPiA8cGFja2V0X2xlbj4gPHBhY2tldD5cbiIpOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgZmQtYXRyIG9mZlxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBmZC1hdHIgb25cbiIpOwotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgZmQtc2Igb2ZmXG4iKTsKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGZkLXNiIG9uXG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGxsZHAgc3RhcnRcbiIpOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgbGxkcCBzdG9wXG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGxsZHAgZ2V0IGxvY2FsXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kaWFnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGlhZy5jCmluZGV4IGIyMzgwZGEuLjU2NDM4YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kaWFnLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RpYWcuYwpAQCAtNjcsMTcgKzY3LDI1IEBACiAKIHN0cnVjdCBpNDBlX2RpYWdfcmVnX3Rlc3RfaW5mbyBpNDBlX3JlZ19saXN0W10gPSB7CiAJLyogb2Zmc2V0ICAgICAgICAgICAgICAgbWFzayAgICAgICAgIGVsZW1lbnRzICAgc3RyaWRlICovCi0Je0k0MEVfUVRYX0NUTCgwKSwgICAgICAgMHgwMDAwRkZCRiwgICA0LCBJNDBFX1FUWF9DVEwoMSkgLSBJNDBFX1FUWF9DVEwoMCl9LAotCXtJNDBFX1BGSU5UX0lUUjAoMCksICAgIDB4MDAwMDBGRkYsICAgMywgSTQwRV9QRklOVF9JVFIwKDEpIC0gSTQwRV9QRklOVF9JVFIwKDApfSwKLQl7STQwRV9QRklOVF9JVFJOKDAsIDApLCAweDAwMDAwRkZGLCAgIDgsIEk0MEVfUEZJTlRfSVRSTigwLCAxKSAtIEk0MEVfUEZJTlRfSVRSTigwLCAwKX0sCi0Je0k0MEVfUEZJTlRfSVRSTigxLCAwKSwgMHgwMDAwMEZGRiwgICA4LCBJNDBFX1BGSU5UX0lUUk4oMSwgMSkgLSBJNDBFX1BGSU5UX0lUUk4oMSwgMCl9LAotCXtJNDBFX1BGSU5UX0lUUk4oMiwgMCksIDB4MDAwMDBGRkYsICAgOCwgSTQwRV9QRklOVF9JVFJOKDIsIDEpIC0gSTQwRV9QRklOVF9JVFJOKDIsIDApfSwKLQl7STQwRV9QRklOVF9TVEFUX0NUTDAsICAweDAwMDAwMDBDLCAgIDEsIDB9LAotCXtJNDBFX1BGSU5UX0xOS0xTVDAsICAgIDB4MDAwMDFGRkYsICAgMSwgMH0sCi0Je0k0MEVfUEZJTlRfTE5LTFNUTigwKSwgMHgwMDAwMDdGRiwgIDY0LCBJNDBFX1BGSU5UX0xOS0xTVE4oMSkgLSBJNDBFX1BGSU5UX0xOS0xTVE4oMCl9LAotCXtJNDBFX1FJTlRfVFFDVEwoMCksICAgIDB4MDAwMDAwRkYsICA2NCwgSTQwRV9RSU5UX1RRQ1RMKDEpIC0gSTQwRV9RSU5UX1RRQ1RMKDApfSwKLQl7STQwRV9RSU5UX1JRQ1RMKDApLCAgICAweDAwMDAwMEZGLCAgNjQsIEk0MEVfUUlOVF9SUUNUTCgxKSAtIEk0MEVfUUlOVF9SUUNUTCgwKX0sCi0Je0k0MEVfUEZJTlRfSUNSMF9FTkEsICAgMHhGN0YyMDAwMCwgICAxLCAwfSwKKwl7STQwRV9RVFhfQ1RMKDApLCAgICAgICAweDAwMDBGRkJGLCAxLAorCQlJNDBFX1FUWF9DVEwoMSkgLSBJNDBFX1FUWF9DVEwoMCl9LAorCXtJNDBFX1BGSU5UX0lUUjAoMCksICAgIDB4MDAwMDBGRkYsIDMsCisJCUk0MEVfUEZJTlRfSVRSMCgxKSAtIEk0MEVfUEZJTlRfSVRSMCgwKX0sCisJe0k0MEVfUEZJTlRfSVRSTigwLCAwKSwgMHgwMDAwMEZGRiwgMSwKKwkJSTQwRV9QRklOVF9JVFJOKDAsIDEpIC0gSTQwRV9QRklOVF9JVFJOKDAsIDApfSwKKwl7STQwRV9QRklOVF9JVFJOKDEsIDApLCAweDAwMDAwRkZGLCAxLAorCQlJNDBFX1BGSU5UX0lUUk4oMSwgMSkgLSBJNDBFX1BGSU5UX0lUUk4oMSwgMCl9LAorCXtJNDBFX1BGSU5UX0lUUk4oMiwgMCksIDB4MDAwMDBGRkYsIDEsCisJCUk0MEVfUEZJTlRfSVRSTigyLCAxKSAtIEk0MEVfUEZJTlRfSVRSTigyLCAwKX0sCisJe0k0MEVfUEZJTlRfU1RBVF9DVEwwLCAgMHgwMDAwMDAwQywgMSwgMH0sCisJe0k0MEVfUEZJTlRfTE5LTFNUMCwgICAgMHgwMDAwMUZGRiwgMSwgMH0sCisJe0k0MEVfUEZJTlRfTE5LTFNUTigwKSwgMHgwMDAwMDdGRiwgMSwKKwkJSTQwRV9QRklOVF9MTktMU1ROKDEpIC0gSTQwRV9QRklOVF9MTktMU1ROKDApfSwKKwl7STQwRV9RSU5UX1RRQ1RMKDApLCAgICAweDAwMDAwMEZGLCAxLAorCQlJNDBFX1FJTlRfVFFDVEwoMSkgLSBJNDBFX1FJTlRfVFFDVEwoMCl9LAorCXtJNDBFX1FJTlRfUlFDVEwoMCksICAgIDB4MDAwMDAwRkYsIDEsCisJCUk0MEVfUUlOVF9SUUNUTCgxKSAtIEk0MEVfUUlOVF9SUUNUTCgwKX0sCisJe0k0MEVfUEZJTlRfSUNSMF9FTkEsICAgMHhGN0YyMDAwMCwgMSwgMH0sCiAJeyAwIH0KIH07CiAKQEAgLTkzLDkgKzEwMSwyNSBAQAogCXUzMiByZWcsIG1hc2s7CiAJdTMyIGksIGo7CiAKLQlmb3IgKGkgPSAwOyAoaTQwZV9yZWdfbGlzdFtpXS5vZmZzZXQgIT0gMCkgJiYgIXJldF9jb2RlOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpNDBlX3JlZ19saXN0W2ldLm9mZnNldCAhPSAwICYmCisJCQkJCSAgICAgIXJldF9jb2RlOyBpKyspIHsKKworCQkvKiBzZXQgYWN0dWFsIHJlZyByYW5nZSBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHJlc291cmNlcyAqLworCQlpZiAoaTQwZV9yZWdfbGlzdFtpXS5vZmZzZXQgPT0gSTQwRV9RVFhfQ1RMKDApICYmCisJCSAgICBody0+ZnVuY19jYXBzLm51bV90eF9xcCAhPSAwKQorCQkJaTQwZV9yZWdfbGlzdFtpXS5lbGVtZW50cyA9IGh3LT5mdW5jX2NhcHMubnVtX3R4X3FwOworCQlpZiAoKGk0MGVfcmVnX2xpc3RbaV0ub2Zmc2V0ID09IEk0MEVfUEZJTlRfSVRSTigwLCAwKSB8fAorCQkgICAgIGk0MGVfcmVnX2xpc3RbaV0ub2Zmc2V0ID09IEk0MEVfUEZJTlRfSVRSTigxLCAwKSB8fAorCQkgICAgIGk0MGVfcmVnX2xpc3RbaV0ub2Zmc2V0ID09IEk0MEVfUEZJTlRfSVRSTigyLCAwKSB8fAorCQkgICAgIGk0MGVfcmVnX2xpc3RbaV0ub2Zmc2V0ID09IEk0MEVfUUlOVF9UUUNUTCgwKSB8fAorCQkgICAgIGk0MGVfcmVnX2xpc3RbaV0ub2Zmc2V0ID09IEk0MEVfUUlOVF9SUUNUTCgwKSkgJiYKKwkJICAgIGh3LT5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9ycyAhPSAwKQorCQkJaTQwZV9yZWdfbGlzdFtpXS5lbGVtZW50cyA9CisJCQkJaHctPmZ1bmNfY2Fwcy5udW1fbXNpeF92ZWN0b3JzIC0gMTsKKworCQkvKiB0ZXN0IHJlZ2lzdGVyIGFjY2VzcyAqLwogCQltYXNrID0gaTQwZV9yZWdfbGlzdFtpXS5tYXNrOwotCQlmb3IgKGogPSAwOyAoaiA8IGk0MGVfcmVnX2xpc3RbaV0uZWxlbWVudHMpICYmICFyZXRfY29kZTsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBpNDBlX3JlZ19saXN0W2ldLmVsZW1lbnRzICYmICFyZXRfY29kZTsgaisrKSB7CiAJCQlyZWcgPSBpNDBlX3JlZ19saXN0W2ldLm9mZnNldCArCiAJCQkgICAgICAoaiAqIGk0MGVfcmVnX2xpc3RbaV0uc3RyaWRlKTsKIAkJCXJldF9jb2RlID0gaTQwZV9kaWFnX3JlZ19wYXR0ZXJuX3Rlc3QoaHcsIHJlZywgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2V0aHRvb2wuYwppbmRleCAwM2Q5OWNiLi40YTQ4OGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9ldGh0b29sLmMKQEAgLTQ2LDYgKzQ2LDggQEAKIAkJSTQwRV9TVEFUKHN0cnVjdCBpNDBlX3BmLCBfbmFtZSwgX3N0YXQpCiAjZGVmaW5lIEk0MEVfVlNJX1NUQVQoX25hbWUsIF9zdGF0KSBcCiAJCUk0MEVfU1RBVChzdHJ1Y3QgaTQwZV92c2ksIF9uYW1lLCBfc3RhdCkKKyNkZWZpbmUgSTQwRV9WRUJfU1RBVChfbmFtZSwgX3N0YXQpIFwKKwkJSTQwRV9TVEFUKHN0cnVjdCBpNDBlX3ZlYiwgX25hbWUsIF9zdGF0KQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGk0MGVfc3RhdHMgaTQwZV9nc3RyaW5nc19uZXRfc3RhdHNbXSA9IHsKIAlJNDBFX05FVERFVl9TVEFUKHJ4X3BhY2tldHMpLApAQCAtNTYsMTIgKzU4LDM2IEBACiAJSTQwRV9ORVRERVZfU1RBVCh0eF9lcnJvcnMpLAogCUk0MEVfTkVUREVWX1NUQVQocnhfZHJvcHBlZCksCiAJSTQwRV9ORVRERVZfU1RBVCh0eF9kcm9wcGVkKSwKLQlJNDBFX05FVERFVl9TVEFUKG11bHRpY2FzdCksCiAJSTQwRV9ORVRERVZfU1RBVChjb2xsaXNpb25zKSwKIAlJNDBFX05FVERFVl9TVEFUKHJ4X2xlbmd0aF9lcnJvcnMpLAogCUk0MEVfTkVUREVWX1NUQVQocnhfY3JjX2Vycm9ycyksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGk0MGVfc3RhdHMgaTQwZV9nc3RyaW5nc192ZWJfc3RhdHNbXSA9IHsKKwlJNDBFX1ZFQl9TVEFUKCJyeF9ieXRlcyIsIHN0YXRzLnJ4X2J5dGVzKSwKKwlJNDBFX1ZFQl9TVEFUKCJ0eF9ieXRlcyIsIHN0YXRzLnR4X2J5dGVzKSwKKwlJNDBFX1ZFQl9TVEFUKCJyeF91bmljYXN0Iiwgc3RhdHMucnhfdW5pY2FzdCksCisJSTQwRV9WRUJfU1RBVCgidHhfdW5pY2FzdCIsIHN0YXRzLnR4X3VuaWNhc3QpLAorCUk0MEVfVkVCX1NUQVQoInJ4X211bHRpY2FzdCIsIHN0YXRzLnJ4X211bHRpY2FzdCksCisJSTQwRV9WRUJfU1RBVCgidHhfbXVsdGljYXN0Iiwgc3RhdHMudHhfbXVsdGljYXN0KSwKKwlJNDBFX1ZFQl9TVEFUKCJyeF9icm9hZGNhc3QiLCBzdGF0cy5yeF9icm9hZGNhc3QpLAorCUk0MEVfVkVCX1NUQVQoInR4X2Jyb2FkY2FzdCIsIHN0YXRzLnR4X2Jyb2FkY2FzdCksCisJSTQwRV9WRUJfU1RBVCgicnhfZGlzY2FyZHMiLCBzdGF0cy5yeF9kaXNjYXJkcyksCisJSTQwRV9WRUJfU1RBVCgidHhfZGlzY2FyZHMiLCBzdGF0cy50eF9kaXNjYXJkcyksCisJSTQwRV9WRUJfU1RBVCgidHhfZXJyb3JzIiwgc3RhdHMudHhfZXJyb3JzKSwKKwlJNDBFX1ZFQl9TVEFUKCJyeF91bmtub3duX3Byb3RvY29sIiwgc3RhdHMucnhfdW5rbm93bl9wcm90b2NvbCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGk0MGVfc3RhdHMgaTQwZV9nc3RyaW5nc19taXNjX3N0YXRzW10gPSB7CisJSTQwRV9WU0lfU1RBVCgicnhfdW5pY2FzdCIsIGV0aF9zdGF0cy5yeF91bmljYXN0KSwKKwlJNDBFX1ZTSV9TVEFUKCJ0eF91bmljYXN0IiwgZXRoX3N0YXRzLnR4X3VuaWNhc3QpLAorCUk0MEVfVlNJX1NUQVQoInJ4X211bHRpY2FzdCIsIGV0aF9zdGF0cy5yeF9tdWx0aWNhc3QpLAorCUk0MEVfVlNJX1NUQVQoInR4X211bHRpY2FzdCIsIGV0aF9zdGF0cy50eF9tdWx0aWNhc3QpLAorCUk0MEVfVlNJX1NUQVQoInJ4X2Jyb2FkY2FzdCIsIGV0aF9zdGF0cy5yeF9icm9hZGNhc3QpLAorCUk0MEVfVlNJX1NUQVQoInR4X2Jyb2FkY2FzdCIsIGV0aF9zdGF0cy50eF9icm9hZGNhc3QpLAorCUk0MEVfVlNJX1NUQVQoInJ4X3Vua25vd25fcHJvdG9jb2wiLCBldGhfc3RhdHMucnhfdW5rbm93bl9wcm90b2NvbCksCit9OworCiBzdGF0aWMgaW50IGk0MGVfYWRkX2ZkaXJfZXRodG9vbChzdHJ1Y3QgaTQwZV92c2kgKnZzaSwKIAkJCQkgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCk7CiAKQEAgLTc4LDcgKzEwNCwxMiBAQAogc3RhdGljIHN0cnVjdCBpNDBlX3N0YXRzIGk0MGVfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKIAlJNDBFX1BGX1NUQVQoInJ4X2J5dGVzIiwgc3RhdHMuZXRoLnJ4X2J5dGVzKSwKIAlJNDBFX1BGX1NUQVQoInR4X2J5dGVzIiwgc3RhdHMuZXRoLnR4X2J5dGVzKSwKLQlJNDBFX1BGX1NUQVQoInJ4X2Vycm9ycyIsIHN0YXRzLmV0aC5yeF9lcnJvcnMpLAorCUk0MEVfUEZfU1RBVCgicnhfdW5pY2FzdCIsIHN0YXRzLmV0aC5yeF91bmljYXN0KSwKKwlJNDBFX1BGX1NUQVQoInR4X3VuaWNhc3QiLCBzdGF0cy5ldGgudHhfdW5pY2FzdCksCisJSTQwRV9QRl9TVEFUKCJyeF9tdWx0aWNhc3QiLCBzdGF0cy5ldGgucnhfbXVsdGljYXN0KSwKKwlJNDBFX1BGX1NUQVQoInR4X211bHRpY2FzdCIsIHN0YXRzLmV0aC50eF9tdWx0aWNhc3QpLAorCUk0MEVfUEZfU1RBVCgicnhfYnJvYWRjYXN0Iiwgc3RhdHMuZXRoLnJ4X2Jyb2FkY2FzdCksCisJSTQwRV9QRl9TVEFUKCJ0eF9icm9hZGNhc3QiLCBzdGF0cy5ldGgudHhfYnJvYWRjYXN0KSwKIAlJNDBFX1BGX1NUQVQoInR4X2Vycm9ycyIsIHN0YXRzLmV0aC50eF9lcnJvcnMpLAogCUk0MEVfUEZfU1RBVCgicnhfZHJvcHBlZCIsIHN0YXRzLmV0aC5yeF9kaXNjYXJkcyksCiAJSTQwRV9QRl9TVEFUKCJ0eF9kcm9wcGVkIiwgc3RhdHMuZXRoLnR4X2Rpc2NhcmRzKSwKQEAgLTg4LDYgKzExOSw3IEBACiAJSTQwRV9QRl9TVEFUKCJtYWNfbG9jYWxfZmF1bHRzIiwgc3RhdHMubWFjX2xvY2FsX2ZhdWx0cyksCiAJSTQwRV9QRl9TVEFUKCJtYWNfcmVtb3RlX2ZhdWx0cyIsIHN0YXRzLm1hY19yZW1vdGVfZmF1bHRzKSwKIAlJNDBFX1BGX1NUQVQoInR4X3RpbWVvdXQiLCB0eF90aW1lb3V0X2NvdW50KSwKKwlJNDBFX1BGX1NUQVQoInJ4X2NzdW1fYmFkIiwgaHdfY3N1bV9yeF9lcnJvciksCiAJSTQwRV9QRl9TVEFUKCJyeF9sZW5ndGhfZXJyb3JzIiwgc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyksCiAJSTQwRV9QRl9TVEFUKCJsaW5rX3hvbl9yeCIsIHN0YXRzLmxpbmtfeG9uX3J4KSwKIAlJNDBFX1BGX1NUQVQoImxpbmtfeG9mZl9yeCIsIHN0YXRzLmxpbmtfeG9mZl9yeCksCkBAIC0xMTIsOCArMTQ0LDEwIEBACiAJSTQwRV9QRl9TVEFUKCJyeF9vdmVyc2l6ZSIsIHN0YXRzLnJ4X292ZXJzaXplKSwKIAlJNDBFX1BGX1NUQVQoInJ4X2phYmJlciIsIHN0YXRzLnJ4X2phYmJlciksCiAJSTQwRV9QRl9TVEFUKCJWRl9hZG1pbl9xdWV1ZV9yZXF1ZXN0cyIsIHZmX2FxX3JlcXVlc3RzKSwKLQlJNDBFX1BGX1NUQVQoInR4X2h3dHN0YW1wX3RpbWVvdXRzIiwgdHhfaHd0c3RhbXBfdGltZW91dHMpLAogCUk0MEVfUEZfU1RBVCgicnhfaHd0c3RhbXBfY2xlYXJlZCIsIHJ4X2h3dHN0YW1wX2NsZWFyZWQpLAorCUk0MEVfUEZfU1RBVCgiZmRpcl9hdHJfbWF0Y2giLCBzdGF0cy5mZF9hdHJfbWF0Y2gpLAorCUk0MEVfUEZfU1RBVCgiZmRpcl9zYl9tYXRjaCIsIHN0YXRzLmZkX3NiX21hdGNoKSwKKwogCS8qIExQSSBzdGF0cyAqLwogCUk0MEVfUEZfU1RBVCgidHhfbHBpX3N0YXR1cyIsIHN0YXRzLnR4X2xwaV9zdGF0dXMpLAogCUk0MEVfUEZfU1RBVCgicnhfbHBpX3N0YXR1cyIsIHN0YXRzLnJ4X2xwaV9zdGF0dXMpLApAQCAtMTIyLDExICsxNTYsMTQgQEAKIH07CiAKICNkZWZpbmUgSTQwRV9RVUVVRV9TVEFUU19MRU4obikgXAotICAoKCgoc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKiluZXRkZXZfcHJpdigobikpKS0+dnNpLT5udW1fcXVldWVfcGFpcnMgKyBcCi0gICAgKChzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqKW5ldGRldl9wcml2KChuKSkpLT52c2ktPm51bV9xdWV1ZV9wYWlycykgKiAyKQorCSgoKHN0cnVjdCBpNDBlX25ldGRldl9wcml2ICopbmV0ZGV2X3ByaXYoKG4pKSktPnZzaS0+bnVtX3F1ZXVlX3BhaXJzIFwKKwkgICAgKiAyIC8qIFR4IGFuZCBSeCB0b2dldGhlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICogKHNpemVvZihzdHJ1Y3QgaTQwZV9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSkpCiAjZGVmaW5lIEk0MEVfR0xPQkFMX1NUQVRTX0xFTglBUlJBWV9TSVpFKGk0MGVfZ3N0cmluZ3Nfc3RhdHMpCiAjZGVmaW5lIEk0MEVfTkVUREVWX1NUQVRTX0xFTiAgIEFSUkFZX1NJWkUoaTQwZV9nc3RyaW5nc19uZXRfc3RhdHMpCisjZGVmaW5lIEk0MEVfTUlTQ19TVEFUU19MRU4JQVJSQVlfU0laRShpNDBlX2dzdHJpbmdzX21pc2Nfc3RhdHMpCiAjZGVmaW5lIEk0MEVfVlNJX1NUQVRTX0xFTihuKSAgIChJNDBFX05FVERFVl9TVEFUU19MRU4gKyBcCisJCQkJIEk0MEVfTUlTQ19TVEFUU19MRU4gKyBcCiAJCQkJIEk0MEVfUVVFVUVfU1RBVFNfTEVOKChuKSkpCiAjZGVmaW5lIEk0MEVfUEZDX1NUQVRTX0xFTiAoIFwKIAkJKEZJRUxEX1NJWkVPRihzdHJ1Y3QgaTQwZV9wZiwgc3RhdHMucHJpb3JpdHlfeG9mZl9yeCkgKyBcCkBAIC0xMzUsNiArMTcyLDcgQEAKIAkJIEZJRUxEX1NJWkVPRihzdHJ1Y3QgaTQwZV9wZiwgc3RhdHMucHJpb3JpdHlfeG9uX3R4KSArIFwKIAkJIEZJRUxEX1NJWkVPRihzdHJ1Y3QgaTQwZV9wZiwgc3RhdHMucHJpb3JpdHlfeG9uXzJfeG9mZikpIFwKIAkJIC8gc2l6ZW9mKHU2NCkpCisjZGVmaW5lIEk0MEVfVkVCX1NUQVRTX0xFTglBUlJBWV9TSVpFKGk0MGVfZ3N0cmluZ3NfdmViX3N0YXRzKQogI2RlZmluZSBJNDBFX1BGX1NUQVRTX0xFTihuKQkoSTQwRV9HTE9CQUxfU1RBVFNfTEVOICsgXAogCQkJCSBJNDBFX1BGQ19TVEFUU19MRU4gKyBcCiAJCQkJIEk0MEVfVlNJX1NUQVRTX0xFTigobikpKQpAQCAtNjIwLDEwICs2NTgsMTUgQEAKIAljYXNlIEVUSF9TU19URVNUOgogCQlyZXR1cm4gSTQwRV9URVNUX0xFTjsKIAljYXNlIEVUSF9TU19TVEFUUzoKLQkJaWYgKHZzaSA9PSBwZi0+dnNpW3BmLT5sYW5fdnNpXSkKLQkJCXJldHVybiBJNDBFX1BGX1NUQVRTX0xFTihuZXRkZXYpOwotCQllbHNlCisJCWlmICh2c2kgPT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0pIHsKKwkJCWludCBsZW4gPSBJNDBFX1BGX1NUQVRTX0xFTihuZXRkZXYpOworCisJCQlpZiAocGYtPmxhbl92ZWIgIT0gSTQwRV9OT19WRUIpCisJCQkJbGVuICs9IEk0MEVfVkVCX1NUQVRTX0xFTjsKKwkJCXJldHVybiBsZW47CisJCX0gZWxzZSB7CiAJCQlyZXR1cm4gSTQwRV9WU0lfU1RBVFNfTEVOKG5ldGRldik7CisJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtNjMzLDYgKzY3Niw3IEBACiAJCQkJICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCiB7CiAJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nLCAqcnhfcmluZzsKIAlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IG5wLT52c2k7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCWludCBpID0gMDsKQEAgLTY0OCwxMCArNjkyLDE0IEBACiAJCWRhdGFbaSsrXSA9IChpNDBlX2dzdHJpbmdzX25ldF9zdGF0c1tqXS5zaXplb2Zfc3RhdCA9PQogCQkJc2l6ZW9mKHU2NCkpID8gKih1NjQgKilwIDogKih1MzIgKilwOwogCX0KKwlmb3IgKGogPSAwOyBqIDwgSTQwRV9NSVNDX1NUQVRTX0xFTjsgaisrKSB7CisJCXAgPSAoY2hhciAqKXZzaSArIGk0MGVfZ3N0cmluZ3NfbWlzY19zdGF0c1tqXS5zdGF0X29mZnNldDsKKwkJZGF0YVtpKytdID0gKGk0MGVfZ3N0cmluZ3NfbWlzY19zdGF0c1tqXS5zaXplb2Zfc3RhdCA9PQorCQkJICAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKKwl9CiAJcmN1X3JlYWRfbG9jaygpOwotCWZvciAoaiA9IDA7IGogPCB2c2ktPm51bV9xdWV1ZV9wYWlyczsgaisrLCBpICs9IDQpIHsKLQkJc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZyA9IEFDQ0VTU19PTkNFKHZzaS0+dHhfcmluZ3Nbal0pOwotCQlzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nOworCWZvciAoaiA9IDA7IGogPCB2c2ktPm51bV9xdWV1ZV9wYWlyczsgaisrKSB7CisJCXR4X3JpbmcgPSBBQ0NFU1NfT05DRSh2c2ktPnR4X3JpbmdzW2pdKTsKIAogCQlpZiAoIXR4X3JpbmcpCiAJCQljb250aW51ZTsKQEAgLTY2MiwzMyArNzEwLDQ1IEBACiAJCQlkYXRhW2ldID0gdHhfcmluZy0+c3RhdHMucGFja2V0czsKIAkJCWRhdGFbaSArIDFdID0gdHhfcmluZy0+c3RhdHMuYnl0ZXM7CiAJCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoJnR4X3JpbmctPnN5bmNwLCBzdGFydCkpOworCQlpICs9IDI7CiAKIAkJLyogUnggcmluZyBpcyB0aGUgMm5kIGhhbGYgb2YgdGhlIHF1ZXVlIHBhaXIgKi8KIAkJcnhfcmluZyA9ICZ0eF9yaW5nWzFdOwogCQlkbyB7CiAJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJnJ4X3JpbmctPnN5bmNwKTsKLQkJCWRhdGFbaSArIDJdID0gcnhfcmluZy0+c3RhdHMucGFja2V0czsKLQkJCWRhdGFbaSArIDNdID0gcnhfcmluZy0+c3RhdHMuYnl0ZXM7CisJCQlkYXRhW2ldID0gcnhfcmluZy0+c3RhdHMucGFja2V0czsKKwkJCWRhdGFbaSArIDFdID0gcnhfcmluZy0+c3RhdHMuYnl0ZXM7CiAJCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoJnJ4X3JpbmctPnN5bmNwLCBzdGFydCkpOworCQlpICs9IDI7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwotCWlmICh2c2kgPT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0pIHsKLQkJZm9yIChqID0gMDsgaiA8IEk0MEVfR0xPQkFMX1NUQVRTX0xFTjsgaisrKSB7Ci0JCQlwID0gKGNoYXIgKilwZiArIGk0MGVfZ3N0cmluZ3Nfc3RhdHNbal0uc3RhdF9vZmZzZXQ7Ci0JCQlkYXRhW2krK10gPSAoaTQwZV9nc3RyaW5nc19zdGF0c1tqXS5zaXplb2Zfc3RhdCA9PQotCQkJCSAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKKwlpZiAodnNpICE9IHBmLT52c2lbcGYtPmxhbl92c2ldKQorCQlyZXR1cm47CisKKwlpZiAocGYtPmxhbl92ZWIgIT0gSTQwRV9OT19WRUIpIHsKKwkJc3RydWN0IGk0MGVfdmViICp2ZWIgPSBwZi0+dmViW3BmLT5sYW5fdmViXTsKKwkJZm9yIChqID0gMDsgaiA8IEk0MEVfVkVCX1NUQVRTX0xFTjsgaisrKSB7CisJCQlwID0gKGNoYXIgKil2ZWI7CisJCQlwICs9IGk0MGVfZ3N0cmluZ3NfdmViX3N0YXRzW2pdLnN0YXRfb2Zmc2V0OworCQkJZGF0YVtpKytdID0gKGk0MGVfZ3N0cmluZ3NfdmViX3N0YXRzW2pdLnNpemVvZl9zdGF0ID09CisJCQkJICAgICBzaXplb2YodTY0KSkgPyAqKHU2NCAqKXAgOiAqKHUzMiAqKXA7CiAJCX0KLQkJZm9yIChqID0gMDsgaiA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGorKykgewotCQkJZGF0YVtpKytdID0gcGYtPnN0YXRzLnByaW9yaXR5X3hvbl90eFtqXTsKLQkJCWRhdGFbaSsrXSA9IHBmLT5zdGF0cy5wcmlvcml0eV94b2ZmX3R4W2pdOwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBqKyspIHsKLQkJCWRhdGFbaSsrXSA9IHBmLT5zdGF0cy5wcmlvcml0eV94b25fcnhbal07Ci0JCQlkYXRhW2krK10gPSBwZi0+c3RhdHMucHJpb3JpdHlfeG9mZl9yeFtqXTsKLQkJfQotCQlmb3IgKGogPSAwOyBqIDwgSTQwRV9NQVhfVVNFUl9QUklPUklUWTsgaisrKQotCQkJZGF0YVtpKytdID0gcGYtPnN0YXRzLnByaW9yaXR5X3hvbl8yX3hvZmZbal07CiAJfQorCWZvciAoaiA9IDA7IGogPCBJNDBFX0dMT0JBTF9TVEFUU19MRU47IGorKykgeworCQlwID0gKGNoYXIgKilwZiArIGk0MGVfZ3N0cmluZ3Nfc3RhdHNbal0uc3RhdF9vZmZzZXQ7CisJCWRhdGFbaSsrXSA9IChpNDBlX2dzdHJpbmdzX3N0YXRzW2pdLnNpemVvZl9zdGF0ID09CisJCQkgICAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKKwl9CisJZm9yIChqID0gMDsgaiA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGorKykgeworCQlkYXRhW2krK10gPSBwZi0+c3RhdHMucHJpb3JpdHlfeG9uX3R4W2pdOworCQlkYXRhW2krK10gPSBwZi0+c3RhdHMucHJpb3JpdHlfeG9mZl90eFtqXTsKKwl9CisJZm9yIChqID0gMDsgaiA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGorKykgeworCQlkYXRhW2krK10gPSBwZi0+c3RhdHMucHJpb3JpdHlfeG9uX3J4W2pdOworCQlkYXRhW2krK10gPSBwZi0+c3RhdHMucHJpb3JpdHlfeG9mZl9yeFtqXTsKKwl9CisJZm9yIChqID0gMDsgaiA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGorKykKKwkJZGF0YVtpKytdID0gcGYtPnN0YXRzLnByaW9yaXR5X3hvbl8yX3hvZmZbal07CiB9CiAKIHN0YXRpYyB2b2lkIGk0MGVfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwKQEAgLTcxMyw2ICs3NzMsMTEgQEAKIAkJCQkgaTQwZV9nc3RyaW5nc19uZXRfc3RhdHNbaV0uc3RhdF9zdHJpbmcpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KKwkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUlTQ19TVEFUU19MRU47IGkrKykgeworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAiJXMiLAorCQkJCSBpNDBlX2dzdHJpbmdzX21pc2Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IHZzaS0+bnVtX3F1ZXVlX3BhaXJzOyBpKyspIHsKIAkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwgInR4LSV1LnR4X3BhY2tldHMiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwpAQCAtNzIzLDMzICs3ODgsNDEgQEAKIAkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwgInJ4LSV1LnJ4X2J5dGVzIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJfQotCQlpZiAodnNpID09IHBmLT52c2lbcGYtPmxhbl92c2ldKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKLQkJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJwb3J0LiVzIiwKLQkJCQkJIGk0MGVfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcpOworCQlpZiAodnNpICE9IHBmLT52c2lbcGYtPmxhbl92c2ldKQorCQkJcmV0dXJuOworCisJCWlmIChwZi0+bGFuX3ZlYiAhPSBJNDBFX05PX1ZFQikgeworCQkJZm9yIChpID0gMDsgaSA8IEk0MEVfVkVCX1NUQVRTX0xFTjsgaSsrKSB7CisJCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAidmViLiVzIiwKKwkJCQkJaTQwZV9nc3RyaW5nc192ZWJfc3RhdHNbaV0uc3RhdF9zdHJpbmcpOwogCQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJfQotCQkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgewotCQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkJICJwb3J0LnR4X3ByaW9yaXR5XyV1X3hvbiIsIGkpOwotCQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkJICJwb3J0LnR4X3ByaW9yaXR5XyV1X3hvZmYiLCBpKTsKLQkJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCX0KLQkJCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspIHsKLQkJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJCSAicG9ydC5yeF9wcmlvcml0eV8ldV94b24iLCBpKTsKLQkJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJCSAicG9ydC5yeF9wcmlvcml0eV8ldV94b2ZmIiwgaSk7Ci0JCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQl9Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVVNFUl9QUklPUklUWTsgaSsrKSB7Ci0JCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgInBvcnQucnhfcHJpb3JpdHlfJXVfeG9uXzJfeG9mZiIsIGkpOwotCQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJfQorCQl9CisJCWZvciAoaSA9IDA7IGkgPCBJNDBFX0dMT0JBTF9TVEFUU19MRU47IGkrKykgeworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAicG9ydC4lcyIsCisJCQkJIGk0MGVfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgeworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAicG9ydC50eF9wcmlvcml0eV8ldV94b24iLCBpKTsKKwkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAicG9ydC50eF9wcmlvcml0eV8ldV94b2ZmIiwgaSk7CisJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVVNFUl9QUklPUklUWTsgaSsrKSB7CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCisJCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyV1X3hvbiIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCisJCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyV1X3hvZmYiLCBpKTsKKwkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspIHsKKwkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgInBvcnQucnhfcHJpb3JpdHlfJXVfeG9uXzJfeG9mZiIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJLyogQlVHX09OKHAgLSBkYXRhICE9IEk0MEVfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsgKi8KIAkJYnJlYWs7CkBAIC0xMDA3LDE0ICsxMDgwLDEzIEBACiAJZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IHZzaS0+d29ya19saW1pdDsKIAogCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X2l0cl9zZXR0aW5nKSkKLQkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTsKLQllbHNlCi0JCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IHZzaS0+cnhfaXRyX3NldHRpbmc7CisJCWVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAxOwogCiAJaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfaXRyX3NldHRpbmcpKQotCQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSAxOwotCWVsc2UKLQkJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9pdHJfc2V0dGluZzsKKwkJZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDE7CisKKwllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnJ4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDMzLDM3ICsxMTA1LDI3IEBACiAJaWYgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKIAkJdnNpLT53b3JrX2xpbWl0ID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKIAotCXN3aXRjaCAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKSB7Ci0JY2FzZSAwOgotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMgfAotCQkJCSAgICAgICBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfUlhfREVGKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDwgKEk0MEVfTUlOX0lUUiA8PCAxKSkgfHwKLQkJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPiAoSTQwRV9NQVhfSVRSIDw8IDEpKSkKLQkJCXJldHVybiAtRUlOVkFMOworCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID49IChJNDBFX01JTl9JVFIgPDwgMSkpICYmCisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPD0gKEk0MEVfTUFYX0lUUiA8PCAxKSkpCiAJCXZzaS0+cnhfaXRyX3NldHRpbmcgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0JCWJyZWFrOwotCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoIChlYy0+dHhfY29hbGVzY2VfdXNlY3MpIHsKLQljYXNlIDA6Ci0JCXZzaS0+dHhfaXRyX3NldHRpbmcgPSAwOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXZzaS0+dHhfaXRyX3NldHRpbmcgPSAoSTQwRV9JVFJfRFlOQU1JQyB8Ci0JCQkJICAgICAgIElUUl9SRUdfVE9fVVNFQyhJNDBFX0lUUl9UWF9ERUYpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPCAoSTQwRV9NSU5fSVRSIDw8IDEpKSB8fAotCQkgICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IChJNDBFX01BWF9JVFIgPDwgMSkpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPj0gKEk0MEVfTUlOX0lUUiA8PCAxKSkgJiYKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA8PSAoSTQwRV9NQVhfSVRSIDw8IDEpKSkKIAkJdnNpLT50eF9pdHJfc2V0dGluZyA9IGVjLT50eF9jb2FsZXNjZV91c2VjczsKLQkJYnJlYWs7Ci0JfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKKwkJdnNpLT5yeF9pdHJfc2V0dGluZyB8PSBJNDBFX0lUUl9EWU5BTUlDOworCWVsc2UKKwkJdnNpLT5yeF9pdHJfc2V0dGluZyAmPSB+STQwRV9JVFJfRFlOQU1JQzsKKworCWlmIChlYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlKQorCQl2c2ktPnR4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7CisJZWxzZQorCQl2c2ktPnR4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOwogCiAJdmVjdG9yID0gdnNpLT5iYXNlX3ZlY3RvcjsKIAlmb3IgKGkgPSAwOyBpIDwgdnNpLT5udW1fcV92ZWN0b3JzOyBpKyssIHZlY3RvcisrKSB7CkBAIC0xMTQwLDggKzEyMDIsNyBAQAogCWludCBjbnQgPSAwOwogCiAJLyogcmVwb3J0IHRvdGFsIHJ1bGUgY291bnQgKi8KLQljbWQtPmRhdGEgPSBwZi0+aHcuZmRpcl9zaGFyZWRfZmlsdGVyX2NvdW50ICsKLQkJICAgIHBmLT5mZGlyX3BmX2ZpbHRlcl9jb3VudDsKKwljbWQtPmRhdGEgPSBpNDBlX2dldF9mZF9jbnRfYWxsKHBmKTsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVsZSwgbm9kZTIsCiAJCQkJICAmcGYtPmZkaXJfZmlsdGVyX2xpc3QsIGZkaXJfbm9kZSkgewpAQCAtMTE3NSwxMCArMTIzNiw2IEBACiAJc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKnJ1bGUgPSBOVUxMOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlMjsKIAotCS8qIHJlcG9ydCB0b3RhbCBydWxlIGNvdW50ICovCi0JY21kLT5kYXRhID0gcGYtPmh3LmZkaXJfc2hhcmVkX2ZpbHRlcl9jb3VudCArCi0JCSAgICBwZi0+ZmRpcl9wZl9maWx0ZXJfY291bnQ7Ci0KIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1bGUsIG5vZGUyLAogCQkJCSAgJnBmLT5mZGlyX2ZpbHRlcl9saXN0LCBmZGlyX25vZGUpIHsKIAkJaWYgKGZzcC0+bG9jYXRpb24gPD0gcnVsZS0+ZmRfaWQpCkBAIC0xMTg5LDExICsxMjQ2LDI0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZnNwLT5mbG93X3R5cGUgPSBydWxlLT5mbG93X3R5cGU7Ci0JZnNwLT5oX3UudGNwX2lwNF9zcGVjLnBzcmMgPSBydWxlLT5zcmNfcG9ydDsKLQlmc3AtPmhfdS50Y3BfaXA0X3NwZWMucGRzdCA9IHJ1bGUtPmRzdF9wb3J0OwotCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRzcmMgPSBydWxlLT5zcmNfaXBbMF07Ci0JZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdCA9IHJ1bGUtPmRzdF9pcFswXTsKLQlmc3AtPnJpbmdfY29va2llID0gcnVsZS0+cV9pbmRleDsKKwlpZiAoZnNwLT5mbG93X3R5cGUgPT0gSVBfVVNFUl9GTE9XKSB7CisJCWZzcC0+aF91LnVzcl9pcDRfc3BlYy5pcF92ZXIgPSBFVEhfUlhfTkZDX0lQNDsKKwkJZnNwLT5oX3UudXNyX2lwNF9zcGVjLnByb3RvID0gMDsKKwkJZnNwLT5tX3UudXNyX2lwNF9zcGVjLnByb3RvID0gMDsKKwl9CisKKwkvKiBSZXZlcnNlIHRoZSBzcmMgYW5kIGRlc3Qgbm90aW9uLCBzaW5jZSB0aGUgSFcgdmlld3MgdGhlbSBmcm9tCisJICogVHggcGVyc3BlY3RpdmUgd2hlcmUgYXMgdGhlIHVzZXIgZXhwZWN0cyBpdCBmcm9tIFJ4IGZpbHRlciB2aWV3LgorCSAqLworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5wc3JjID0gcnVsZS0+ZHN0X3BvcnQ7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLnBkc3QgPSBydWxlLT5zcmNfcG9ydDsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0c3JjID0gcnVsZS0+ZHN0X2lwWzBdOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3QgPSBydWxlLT5zcmNfaXBbMF07CisKKwlpZiAocnVsZS0+ZGVzdF9jdGwgPT0gSTQwRV9GSUxURVJfUFJPR1JBTV9ERVNDX0RFU1RfRFJPUF9QQUNLRVQpCisJCWZzcC0+cmluZ19jb29raWUgPSBSWF9DTFNfRkxPV19ESVNDOworCWVsc2UKKwkJZnNwLT5yaW5nX2Nvb2tpZSA9IHJ1bGUtPnFfaW5kZXg7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjMsNiArMTI5Myw4IEBACiAJCWJyZWFrOwogCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKIAkJY21kLT5ydWxlX2NudCA9IHBmLT5mZGlyX3BmX2FjdGl2ZV9maWx0ZXJzOworCQkvKiByZXBvcnQgdG90YWwgcnVsZSBjb3VudCAqLworCQljbWQtPmRhdGEgPSBpNDBlX2dldF9mZF9jbnRfYWxsKHBmKTsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBFVEhUT09MX0dSWENMU1JVTEU6CkBAIC0xMjkxLDE2ICsxMzYzLDEyIEBACiAJY2FzZSBVRFBfVjRfRkxPVzoKIAkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgewogCQljYXNlIDA6Ci0JCQloZW5hICY9Ci0JCQl+KCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY0X1VEUCkgfAotCQkJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNF9VRFApIHwKLQkJCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNCkpOworCQkJaGVuYSAmPSB+KCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFApIHwKKwkJCQkgICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNCkpOwogCQkJYnJlYWs7CiAJCWNhc2UgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMyk6Ci0JCQloZW5hIHw9Ci0JCQkoKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjRfVURQKSAgfAotCQkJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNF9VRFApIHwKLQkJCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNCkpOworCQkJaGVuYSB8PSAoKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUCkgfAorCQkJCSAgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTMwOSwxNiArMTM3NywxMiBAQAogCWNhc2UgVURQX1Y2X0ZMT1c6CiAJCXN3aXRjaCAobmZjLT5kYXRhICYgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMykpIHsKIAkJY2FzZSAwOgotCQkJaGVuYSAmPQotCQkJfigoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNl9VRFApIHwKLQkJCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjZfVURQKSB8Ci0JCQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjYpKTsKKwkJCWhlbmEgJj0gfigoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVURQKSB8CisJCQkJICAoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjYpKTsKIAkJCWJyZWFrOwogCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgotCQkJaGVuYSB8PQotCQkJKCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY2X1VEUCkgIHwKLQkJCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjZfVURQKSB8Ci0JCQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjYpKTsKKwkJCWhlbmEgfD0gKCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFApIHwKKwkJCQkgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY2KSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUwMyw3ICsxNTY3LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGZzcC0+cmluZ19jb29raWUgPj0gdnNpLT5udW1fcXVldWVfcGFpcnMpCisJaWYgKChmc3AtPnJpbmdfY29va2llICE9IFJYX0NMU19GTE9XX0RJU0MpICYmCisJICAgIChmc3AtPnJpbmdfY29va2llID49IHZzaS0+bnVtX3F1ZXVlX3BhaXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpbnB1dCA9IGt6YWxsb2Moc2l6ZW9mKCppbnB1dCksIEdGUF9LRVJORUwpOwpAQCAtMTUyNCwxMyArMTU4OSwxNyBAQAogCWlucHV0LT5wY3R5cGUgPSAwOwogCWlucHV0LT5kZXN0X3ZzaSA9IHZzaS0+aWQ7CiAJaW5wdXQtPmZkX3N0YXR1cyA9IEk0MEVfRklMVEVSX1BST0dSQU1fREVTQ19GRF9TVEFUVVNfRkRfSUQ7Ci0JaW5wdXQtPmNudF9pbmRleCA9IDA7CisJaW5wdXQtPmNudF9pbmRleCAgPSBwZi0+ZmRfc2JfY250X2lkeDsKIAlpbnB1dC0+Zmxvd190eXBlID0gZnNwLT5mbG93X3R5cGU7CiAJaW5wdXQtPmlwNF9wcm90byA9IGZzcC0+aF91LnVzcl9pcDRfc3BlYy5wcm90bzsKLQlpbnB1dC0+c3JjX3BvcnQgPSBmc3AtPmhfdS50Y3BfaXA0X3NwZWMucHNyYzsKLQlpbnB1dC0+ZHN0X3BvcnQgPSBmc3AtPmhfdS50Y3BfaXA0X3NwZWMucGRzdDsKLQlpbnB1dC0+c3JjX2lwWzBdID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNHNyYzsKLQlpbnB1dC0+ZHN0X2lwWzBdID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdDsKKworCS8qIFJldmVyc2UgdGhlIHNyYyBhbmQgZGVzdCBub3Rpb24sIHNpbmNlIHRoZSBIVyBleHBlY3RzIHRoZW0gdG8gYmUgZnJvbQorCSAqIFR4IHBlcnNwZWN0aXZlIHdoZXJlIGFzIHRoZSBpbnB1dCBmcm9tIHVzZXIgaXMgZnJvbSBSeCBmaWx0ZXIgdmlldy4KKwkgKi8KKwlpbnB1dC0+ZHN0X3BvcnQgPSBmc3AtPmhfdS50Y3BfaXA0X3NwZWMucHNyYzsKKwlpbnB1dC0+c3JjX3BvcnQgPSBmc3AtPmhfdS50Y3BfaXA0X3NwZWMucGRzdDsKKwlpbnB1dC0+ZHN0X2lwWzBdID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNHNyYzsKKwlpbnB1dC0+c3JjX2lwWzBdID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdDsKIAogCXJldCA9IGk0MGVfYWRkX2RlbF9mZGlyKHZzaSwgaW5wdXQsIHRydWUpOwogCWlmIChyZXQpCkBAIC0xNjkyLDUgKzE3NjEsNSBAQAogCiB2b2lkIGk0MGVfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmk0MGVfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmaTQwZV9ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9obWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9obWMuYwppbmRleCBiZjJkNGNjLi45Yjk4N2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfaG1jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2htYy5jCkBAIC0yMDEsNyArMjAxLDcgQEAKICAqKi8KIGk0MGVfc3RhdHVzIGk0MGVfcmVtb3ZlX3BkX2JwKHN0cnVjdCBpNDBlX2h3ICpodywKIAkJCQkJc3RydWN0IGk0MGVfaG1jX2luZm8gKmhtY19pbmZvLAotCQkJCQl1MzIgaWR4LCBib29sIGlzX3BmKQorCQkJCQl1MzIgaWR4KQogewogCWk0MGVfc3RhdHVzIHJldF9jb2RlID0gMDsKIAlzdHJ1Y3QgaTQwZV9obWNfcGRfZW50cnkgKnBkX2VudHJ5OwpAQCAtMjM3LDEwICsyMzcsNyBAQAogCXBkX2FkZHIgPSAodTY0ICopcGRfdGFibGUtPnBkX3BhZ2VfYWRkci52YTsKIAlwZF9hZGRyICs9IHJlbF9wZF9pZHg7CiAJbWVtc2V0KHBkX2FkZHIsIDAsIHNpemVvZih1NjQpKTsKLQlpZiAoaXNfcGYpCi0JCUk0MEVfSU5WQUxJREFURV9QRl9ITUNfUEQoaHcsIHNkX2lkeCwgaWR4KTsKLQllbHNlCi0JCUk0MEVfSU5WQUxJREFURV9WRl9ITUNfUEQoaHcsIHNkX2lkeCwgaWR4LCBobWNfaW5mby0+aG1jX2ZuX2lkKTsKKwlJNDBFX0lOVkFMSURBVEVfUEZfSE1DX1BEKGh3LCBzZF9pZHgsIGlkeCk7CiAKIAkvKiBmcmVlIG1lbW9yeSBoZXJlICovCiAJcmV0X2NvZGUgPSBpNDBlX2ZyZWVfZG1hX21lbShodywgJihwZF9lbnRyeS0+YnAuYWRkcikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2htYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2htYy5oCmluZGV4IDBjZDQ3MDEuLmI0NWQ4ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9obWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfaG1jLmgKQEAgLTE2MywxMSArMTYzLDYgQEAKIAkgICAgKCgoc2RfaWR4KSA8PCBJNDBFX1BGSE1DX1BESU5WX1BNU0RJRFhfU0hJRlQpIHwJCVwKIAkgICAgICgocGRfaWR4KSA8PCBJNDBFX1BGSE1DX1BESU5WX1BNUERJRFhfU0hJRlQpKSkKIAotI2RlZmluZSBJNDBFX0lOVkFMSURBVEVfVkZfSE1DX1BEKGh3LCBzZF9pZHgsIHBkX2lkeCwgaG1jX2ZuX2lkKQkgICBcCi0Jd3IzMigoaHcpLCBJNDBFX0dMSE1DX1ZGUERJTlYoKGhtY19mbl9pZCkgLSBJNDBFX0ZJUlNUX1ZGX0ZQTV9JRCksIFwKLQkgICAgICgoKHNkX2lkeCkgPDwgSTQwRV9QRkhNQ19QRElOVl9QTVNESURYX1NISUZUKSB8CQkgICBcCi0JICAgICAgKChwZF9pZHgpIDw8IEk0MEVfUEZITUNfUERJTlZfUE1QRElEWF9TSElGVCkpKQotCiAvKioKICAqIEk0MEVfRklORF9TRF9JTkRFWF9MSU1JVCAtIGZpbmRzIHNlZ21lbnQgZGVzY3JpcHRvciBpbmRleCBsaW1pdAogICogQGhtY19pbmZvOiBwb2ludGVyIHRvIHRoZSBITUMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKQEAgLTIyNiw3ICsyMjEsNyBAQAogCQkJCQkgICAgICB1MzIgcGRfaW5kZXgpOwogaTQwZV9zdGF0dXMgaTQwZV9yZW1vdmVfcGRfYnAoc3RydWN0IGk0MGVfaHcgKmh3LAogCQkJCQlzdHJ1Y3QgaTQwZV9obWNfaW5mbyAqaG1jX2luZm8sCi0JCQkJCXUzMiBpZHgsIGJvb2wgaXNfcGYpOworCQkJCQl1MzIgaWR4KTsKIGk0MGVfc3RhdHVzIGk0MGVfcHJlcF9yZW1vdmVfc2RfYnAoc3RydWN0IGk0MGVfaG1jX2luZm8gKmhtY19pbmZvLAogCQkJCQkgICAgIHUzMiBpZHgpOwogaTQwZV9zdGF0dXMgaTQwZV9yZW1vdmVfc2RfYnBfbmV3KHN0cnVjdCBpNDBlX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9sYW5faG1jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbGFuX2htYy5jCmluZGV4IGQ1ZDk4ZmUuLjg3MGFiMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9sYW5faG1jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2xhbl9obWMuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCQkJLyogcmVtb3ZlIHRoZSBiYWNraW5nIHBhZ2VzIGZyb20gcGRfaWR4MSB0byBpICovCiAJCQkJd2hpbGUgKGkgJiYgKGkgPiBwZF9pZHgxKSkgewogCQkJCQlpNDBlX3JlbW92ZV9wZF9icChodywgaW5mby0+aG1jX2luZm8sCi0JCQkJCQkJICAoaSAtIDEpLCB0cnVlKTsKKwkJCQkJCQkgIChpIC0gMSkpOwogCQkJCQlpLS07CiAJCQkJfQogCQkJfQpAQCAtNDMzLDExICs0MzMsNyBAQAogCQkJCSAgICAgICgoaiAtIDEpICogSTQwRV9ITUNfTUFYX0JQX0NPVU5UKSk7CiAJCQlwZF9sbXQxID0gbWluKHBkX2xtdCwgKGogKiBJNDBFX0hNQ19NQVhfQlBfQ09VTlQpKTsKIAkJCWZvciAoaSA9IHBkX2lkeDE7IGkgPCBwZF9sbXQxOyBpKyspIHsKLQkJCQlpNDBlX3JlbW92ZV9wZF9icCgKLQkJCQkJaHcsCi0JCQkJCWluZm8tPmhtY19pbmZvLAotCQkJCQlpLAotCQkJCQl0cnVlKTsKKwkJCQlpNDBlX3JlbW92ZV9wZF9icChodywgaW5mby0+aG1jX2luZm8sIGkpOwogCQkJfQogCQkJaTQwZV9yZW1vdmVfcGRfcGFnZShodywgaW5mby0+aG1jX2luZm8sIChqIC0gMSkpOwogCQkJYnJlYWs7CkBAIC02MTYsOCArNjEyLDcgQEAKIAkJcGRfdGFibGUgPQogCQkJJmluZm8tPmhtY19pbmZvLT5zZF90YWJsZS5zZF9lbnRyeVtzZF9pZHhdLnUucGRfdGFibGU7CiAJCWlmIChwZF90YWJsZS0+cGRfZW50cnlbcmVsX3BkX2lkeF0udmFsaWQpIHsKLQkJCXJldF9jb2RlID0gaTQwZV9yZW1vdmVfcGRfYnAoaHcsIGluZm8tPmhtY19pbmZvLAotCQkJCQkJICAgICBqLCB0cnVlKTsKKwkJCXJldF9jb2RlID0gaTQwZV9yZW1vdmVfcGRfYnAoaHcsIGluZm8tPmhtY19pbmZvLCBqKTsKIAkJCWlmIChyZXRfY29kZSkKIAkJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTc0Nyw2ICs3NDIsNyBAQAogCXsgSTQwRV9ITUNfU1RPUkUoaTQwZV9obWNfb2JqX3J4cSwgdHBoZGF0YV9lbmEpLCAgMSwJMTk1IH0sCiAJeyBJNDBFX0hNQ19TVE9SRShpNDBlX2htY19vYmpfcnhxLCB0cGhoZWFkX2VuYSksICAxLAkxOTYgfSwKIAl7IEk0MEVfSE1DX1NUT1JFKGk0MGVfaG1jX29ial9yeHEsIGxyeHF0aHJlc2gpLCAgIDMsCTE5OCB9LAorCXsgSTQwRV9ITUNfU1RPUkUoaTQwZV9obWNfb2JqX3J4cSwgcHJlZmVuYSksICAgICAgMSwJMjAxIH0sCiAJeyAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9sYW5faG1jLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbGFuX2htYy5oCmluZGV4IDM0MWRlOTIuLmViNjVmZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9sYW5faG1jLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2xhbl9obWMuaApAQCAtNTYsNiArNTYsNyBAQAogCXU4ICB0cGhkYXRhX2VuYTsKIAl1OCAgdHBoaGVhZF9lbmE7CiAJdTggIGxyeHF0aHJlc2g7CisJdTggIHByZWZlbmE7CS8qIE5PVEU6IG5vcm1hbGx5IG11c3QgYmUgc2V0IHRvIDEgYXQgaW5pdCAqLwogfTsKIAogLyogVHggcXVldWUgY29udGV4dCBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYwppbmRleCAyZTcyNDQ5Li4yNzVjYTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKQEAgLTM4LDggKzM4LDggQEAKICNkZWZpbmUgRFJWX0tFUk4gIi1rIgogCiAjZGVmaW5lIERSVl9WRVJTSU9OX01BSk9SIDAKLSNkZWZpbmUgRFJWX1ZFUlNJT05fTUlOT1IgMwotI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCAzNgorI2RlZmluZSBEUlZfVkVSU0lPTl9NSU5PUiA0CisjZGVmaW5lIERSVl9WRVJTSU9OX0JVSUxEIDEwCiAjZGVmaW5lIERSVl9WRVJTSU9OIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX01BSk9SKSAiLiIgXAogCSAgICAgX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fTUlOT1IpICIuIiBcCiAJICAgICBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9CVUlMRCkgICAgRFJWX0tFUk4KQEAgLTY3LDEyICs2NywxMCBAQAogICovCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaTQwZV9wY2lfdGJsKSA9IHsKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX1NGUF9YTDcxMCksIDB9LAotCXtQQ0lfVkRFVklDRShJTlRFTCwgSTQwRV9ERVZfSURfU0ZQX1g3MTApLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX1FFTVUpLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX0tYX0EpLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX0tYX0IpLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX0tYX0MpLCAwfSwKLQl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX0tYX0QpLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX1FTRlBfQSksIDB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSTQwRV9ERVZfSURfUVNGUF9CKSwgMH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJNDBFX0RFVl9JRF9RU0ZQX0MpLCAwfSwKQEAgLTM1Niw2ICszNTQsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CiAJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nLCAqcnhfcmluZzsKIAlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IG5wLT52c2k7CiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp2c2lfc3RhdHMgPSBpNDBlX2dldF92c2lfc3RhdHNfc3RydWN0KHZzaSk7CiAJaW50IGk7CkBAIC0zNjgsNyArMzY3LDYgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSAwOyBpIDwgdnNpLT5udW1fcXVldWVfcGFpcnM7IGkrKykgewotCQlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nLCAqcnhfcmluZzsKIAkJdTY0IGJ5dGVzLCBwYWNrZXRzOwogCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAKQEAgLTM5Nyw3ICszOTUsNyBAQAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCS8qIGZvbGxvd2luZyBzdGF0cyB1cGRhdGVkIGJ5IGl4Z2JlX3dhdGNoZG9nX3Rhc2soKSAqLworCS8qIGZvbGxvd2luZyBzdGF0cyB1cGRhdGVkIGJ5IGk0MGVfd2F0Y2hkb2dfc3VidGFzaygpICovCiAJc3RhdHMtPm11bHRpY2FzdAk9IHZzaV9zdGF0cy0+bXVsdGljYXN0OwogCXN0YXRzLT50eF9lcnJvcnMJPSB2c2lfc3RhdHMtPnR4X2Vycm9yczsKIAlzdGF0cy0+dHhfZHJvcHBlZAk9IHZzaV9zdGF0cy0+dHhfZHJvcHBlZDsKQEAgLTUzMCw2ICs1MjgsMTIgQEAKIAlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xWX1JEUEMoc3RhdF9pZHgpLAogCQkJICAgdnNpLT5zdGF0X29mZnNldHNfbG9hZGVkLAogCQkJICAgJm9lcy0+cnhfZGlzY2FyZHMsICZlcy0+cnhfZGlzY2FyZHMpOworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFZfUlVQUChzdGF0X2lkeCksCisJCQkgICB2c2ktPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb2VzLT5yeF91bmtub3duX3Byb3RvY29sLCAmZXMtPnJ4X3Vua25vd25fcHJvdG9jb2wpOworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFZfVEVQQyhzdGF0X2lkeCksCisJCQkgICB2c2ktPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb2VzLT50eF9lcnJvcnMsICZlcy0+dHhfZXJyb3JzKTsKIAogCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFZfR09SQ0goc3RhdF9pZHgpLAogCQkJICAgSTQwRV9HTFZfR09SQ0woc3RhdF9pZHgpLApAQCAtNjQ4LDEwICs2NTIsMTAgQEAKIAkJcmV0dXJuOwogCiAJLyogQ2xlYXIgdGhlIF9fSTQwRV9IQU5HX0NIRUNLX0FSTUVEIGJpdCBmb3IgYWxsIFR4IHJpbmdzICovCi0JZm9yICh2ID0gMDsgdiA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IHYrKykgeworCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gcGYtPnZzaVt2XTsKIAotCQlpZiAoIXZzaSkKKwkJaWYgKCF2c2kgfHwgIXZzaS0+dHhfcmluZ3NbMF0pCiAJCQljb250aW51ZTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgdnNpLT5udW1fcXVldWVfcGFpcnM7IGkrKykgewpAQCAtNzAyLDEwICs3MDYsMTAgQEAKIAl9CiAKIAkvKiBDbGVhciB0aGUgX19JNDBFX0hBTkdfQ0hFQ0tfQVJNRUQgYml0IGZvciBUeCByaW5ncyAqLwotCWZvciAodiA9IDA7IHYgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyB2KyspIHsKKwlmb3IgKHYgPSAwOyB2IDwgcGYtPm51bV9hbGxvY192c2k7IHYrKykgewogCQlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHBmLT52c2lbdl07CiAKLQkJaWYgKCF2c2kpCisJCWlmICghdnNpIHx8ICF2c2ktPnR4X3JpbmdzWzBdKQogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IHZzaS0+bnVtX3F1ZXVlX3BhaXJzOyBpKyspIHsKQEAgLTcyMCwxOSArNzI0LDE4IEBACiB9CiAKIC8qKgotICogaTQwZV91cGRhdGVfc3RhdHMgLSBVcGRhdGUgdGhlIGJvYXJkIHN0YXRpc3RpY3MgY291bnRlcnMuCisgKiBpNDBlX3VwZGF0ZV92c2lfc3RhdHMgLSBVcGRhdGUgdGhlIHZzaSBzdGF0aXN0aWNzIGNvdW50ZXJzLgogICogQHZzaTogdGhlIFZTSSB0byBiZSB1cGRhdGVkCiAgKgogICogVGhlcmUgYXJlIGEgZmV3IGluc3RhbmNlcyB3aGVyZSB3ZSBzdG9yZSB0aGUgc2FtZSBzdGF0IGluIGEKICAqIGNvdXBsZSBvZiBkaWZmZXJlbnQgc3RydWN0cy4gIFRoaXMgaXMgcGFydGx5IGJlY2F1c2Ugd2UgaGF2ZQogICogdGhlIG5ldGRldiBzdGF0cyB0aGF0IG5lZWQgdG8gYmUgZmlsbGVkIG91dCwgd2hpY2ggaXMgc2xpZ2h0bHkKICAqIGRpZmZlcmVudCBmcm9tIHRoZSAiZXRoX3N0YXRzIiBkZWZpbmVkIGJ5IHRoZSBjaGlwIGFuZCB1c2VkIGluCi0gKiBWRiBjb21tdW5pY2F0aW9ucy4gIFdlIHNvcnQgaXQgYWxsIG91dCBoZXJlIGluIGEgY2VudHJhbCBwbGFjZS4KKyAqIFZGIGNvbW11bmljYXRpb25zLiAgV2Ugc29ydCBpdCBvdXQgaGVyZS4KICAqKi8KLXZvaWQgaTQwZV91cGRhdGVfc3RhdHMoc3RydWN0IGk0MGVfdnNpICp2c2kpCitzdGF0aWMgdm9pZCBpNDBlX3VwZGF0ZV92c2lfc3RhdHMoc3RydWN0IGk0MGVfdnNpICp2c2kpCiB7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwotCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpvbnM7CiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuczsgICAvKiBuZXRkZXYgc3RhdHMgKi8KIAlzdHJ1Y3QgaTQwZV9ldGhfc3RhdHMgKm9lczsKQEAgLTc0MSw4ICs3NDQsNiBAQAogCXUzMiByeF9wYWdlLCByeF9idWY7CiAJdTY0IHJ4X3AsIHJ4X2I7CiAJdTY0IHR4X3AsIHR4X2I7Ci0JdTMyIHZhbDsKLQlpbnQgaTsKIAl1MTYgcTsKIAogCWlmICh0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnZzaS0+c3RhdGUpIHx8CkBAIC04MDQsMTk2ICs4MDUsMjU2IEBACiAJbnMtPnR4X3BhY2tldHMgPSB0eF9wOwogCW5zLT50eF9ieXRlcyA9IHR4X2I7CiAKLQlpNDBlX3VwZGF0ZV9ldGhfc3RhdHModnNpKTsKIAkvKiB1cGRhdGUgbmV0ZGV2IHN0YXRzIGZyb20gZXRoIHN0YXRzICovCi0Jb25zLT5yeF9lcnJvcnMgPSBvZXMtPnJ4X2Vycm9yczsKLQlucy0+cnhfZXJyb3JzID0gZXMtPnJ4X2Vycm9yczsKKwlpNDBlX3VwZGF0ZV9ldGhfc3RhdHModnNpKTsKIAlvbnMtPnR4X2Vycm9ycyA9IG9lcy0+dHhfZXJyb3JzOwogCW5zLT50eF9lcnJvcnMgPSBlcy0+dHhfZXJyb3JzOwogCW9ucy0+bXVsdGljYXN0ID0gb2VzLT5yeF9tdWx0aWNhc3Q7CiAJbnMtPm11bHRpY2FzdCA9IGVzLT5yeF9tdWx0aWNhc3Q7CisJb25zLT5yeF9kcm9wcGVkID0gb2VzLT5yeF9kaXNjYXJkczsKKwlucy0+cnhfZHJvcHBlZCA9IGVzLT5yeF9kaXNjYXJkczsKIAlvbnMtPnR4X2Ryb3BwZWQgPSBvZXMtPnR4X2Rpc2NhcmRzOwogCW5zLT50eF9kcm9wcGVkID0gZXMtPnR4X2Rpc2NhcmRzOwogCi0JLyogR2V0IHRoZSBwb3J0IGRhdGEgb25seSBpZiB0aGlzIGlzIHRoZSBtYWluIFBGIFZTSSAqLworCS8qIHB1bGwgaW4gYSBjb3VwbGUgUEYgc3RhdHMgaWYgdGhpcyBpcyB0aGUgbWFpbiB2c2kgKi8KIAlpZiAodnNpID09IHBmLT52c2lbcGYtPmxhbl92c2ldKSB7Ci0JCXN0cnVjdCBpNDBlX2h3X3BvcnRfc3RhdHMgKm5zZCA9ICZwZi0+c3RhdHM7Ci0JCXN0cnVjdCBpNDBlX2h3X3BvcnRfc3RhdHMgKm9zZCA9ICZwZi0+c3RhdHNfb2Zmc2V0czsKKwkJbnMtPnJ4X2NyY19lcnJvcnMgPSBwZi0+c3RhdHMuY3JjX2Vycm9yczsKKwkJbnMtPnJ4X2Vycm9ycyA9IHBmLT5zdGF0cy5jcmNfZXJyb3JzICsgcGYtPnN0YXRzLmlsbGVnYWxfYnl0ZXM7CisJCW5zLT5yeF9sZW5ndGhfZXJyb3JzID0gcGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJfQorfQogCi0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9HT1JDSChody0+cG9ydCksCi0JCQkJICAgSTQwRV9HTFBSVF9HT1JDTChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+ZXRoLnJ4X2J5dGVzLCAmbnNkLT5ldGgucnhfYnl0ZXMpOwotCQlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfR09UQ0goaHctPnBvcnQpLAotCQkJCSAgIEk0MEVfR0xQUlRfR09UQ0woaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPmV0aC50eF9ieXRlcywgJm5zZC0+ZXRoLnR4X2J5dGVzKTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX1JEUEMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPmV0aC5yeF9kaXNjYXJkcywKLQkJCQkgICAmbnNkLT5ldGgucnhfZGlzY2FyZHMpOwotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfVERQQyhody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+ZXRoLnR4X2Rpc2NhcmRzLAotCQkJCSAgICZuc2QtPmV0aC50eF9kaXNjYXJkcyk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9NUFJDSChody0+cG9ydCksCi0JCQkJICAgSTQwRV9HTFBSVF9NUFJDTChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+ZXRoLnJ4X211bHRpY2FzdCwKLQkJCQkgICAmbnNkLT5ldGgucnhfbXVsdGljYXN0KTsKKy8qKgorICogaTQwZV91cGRhdGVfcGZfc3RhdHMgLSBVcGRhdGUgdGhlIHBmIHN0YXRpc3RpY3MgY291bnRlcnMuCisgKiBAcGY6IHRoZSBQRiB0byBiZSB1cGRhdGVkCisgKiovCitzdGF0aWMgdm9pZCBpNDBlX3VwZGF0ZV9wZl9zdGF0cyhzdHJ1Y3QgaTQwZV9wZiAqcGYpCit7CisJc3RydWN0IGk0MGVfaHdfcG9ydF9zdGF0cyAqb3NkID0gJnBmLT5zdGF0c19vZmZzZXRzOworCXN0cnVjdCBpNDBlX2h3X3BvcnRfc3RhdHMgKm5zZCA9ICZwZi0+c3RhdHM7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKKwl1MzIgdmFsOworCWludCBpOwogCi0JCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9URE9MRChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfZHJvcHBlZF9saW5rX2Rvd24sCi0JCQkJICAgJm5zZC0+dHhfZHJvcHBlZF9saW5rX2Rvd24pOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9HT1JDSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX0dPUkNMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnJ4X2J5dGVzLCAmbnNkLT5ldGgucnhfYnl0ZXMpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9HT1RDSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX0dPVENMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnR4X2J5dGVzLCAmbnNkLT5ldGgudHhfYnl0ZXMpOworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9SRFBDKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnJ4X2Rpc2NhcmRzLAorCQkJICAgJm5zZC0+ZXRoLnJ4X2Rpc2NhcmRzKTsKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfVERQQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPmV0aC50eF9kaXNjYXJkcywKKwkJCSAgICZuc2QtPmV0aC50eF9kaXNjYXJkcyk7CiAKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0NSQ0VSUlMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPmNyY19lcnJvcnMsICZuc2QtPmNyY19lcnJvcnMpOwotCQlucy0+cnhfY3JjX2Vycm9ycyA9IG5zZC0+Y3JjX2Vycm9yczsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfVVBSQ0goaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9VUFJDTChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPmV0aC5yeF91bmljYXN0LAorCQkJICAgJm5zZC0+ZXRoLnJ4X3VuaWNhc3QpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9NUFJDSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX01QUkNMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnJ4X211bHRpY2FzdCwKKwkJCSAgICZuc2QtPmV0aC5yeF9tdWx0aWNhc3QpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9CUFJDSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX0JQUkNMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnJ4X2Jyb2FkY2FzdCwKKwkJCSAgICZuc2QtPmV0aC5yeF9icm9hZGNhc3QpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9VUFRDSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1VQVENMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZXRoLnR4X3VuaWNhc3QsCisJCQkgICAmbnNkLT5ldGgudHhfdW5pY2FzdCk7CisJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX01QVENIKGh3LT5wb3J0KSwKKwkJCSAgIEk0MEVfR0xQUlRfTVBUQ0woaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5ldGgudHhfbXVsdGljYXN0LAorCQkJICAgJm5zZC0+ZXRoLnR4X211bHRpY2FzdCk7CisJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX0JQVENIKGh3LT5wb3J0KSwKKwkJCSAgIEk0MEVfR0xQUlRfQlBUQ0woaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5ldGgudHhfYnJvYWRjYXN0LAorCQkJICAgJm5zZC0+ZXRoLnR4X2Jyb2FkY2FzdCk7CiAKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0lMTEVSUkMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPmlsbGVnYWxfYnl0ZXMsICZuc2QtPmlsbGVnYWxfYnl0ZXMpOwotCQlucy0+cnhfZXJyb3JzID0gbnNkLT5jcmNfZXJyb3JzCi0JCQkJKyBuc2QtPmlsbGVnYWxfYnl0ZXM7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX1RET0xEKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+dHhfZHJvcHBlZF9saW5rX2Rvd24sCisJCQkgICAmbnNkLT50eF9kcm9wcGVkX2xpbmtfZG93bik7CiAKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX01MRkMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPm1hY19sb2NhbF9mYXVsdHMsCi0JCQkJICAgJm5zZC0+bWFjX2xvY2FsX2ZhdWx0cyk7Ci0JCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9NUkZDKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT5tYWNfcmVtb3RlX2ZhdWx0cywKLQkJCQkgICAmbnNkLT5tYWNfcmVtb3RlX2ZhdWx0cyk7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0NSQ0VSUlMoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5jcmNfZXJyb3JzLCAmbnNkLT5jcmNfZXJyb3JzKTsKIAotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUkxFQyhody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+cnhfbGVuZ3RoX2Vycm9ycywKLQkJCQkgICAmbnNkLT5yeF9sZW5ndGhfZXJyb3JzKTsKLQkJbnMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBuc2QtPnJ4X2xlbmd0aF9lcnJvcnM7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0lMTEVSUkMoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5pbGxlZ2FsX2J5dGVzLCAmbnNkLT5pbGxlZ2FsX2J5dGVzKTsKIAotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfTFhPTlJYQyhody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+bGlua194b25fcngsICZuc2QtPmxpbmtfeG9uX3J4KTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0xYT05UWEMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPmxpbmtfeG9uX3R4LCAmbnNkLT5saW5rX3hvbl90eCk7Ci0JCWk0MGVfdXBkYXRlX3ByaW9feG9mZl9yeChwZik7ICAvKiBoYW5kbGVzIEk0MEVfR0xQUlRfTFhPRkZSWEMgKi8KLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX0xYT0ZGVFhDKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT5saW5rX3hvZmZfdHgsICZuc2QtPmxpbmtfeG9mZl90eCk7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX01MRkMoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5tYWNfbG9jYWxfZmF1bHRzLAorCQkJICAgJm5zZC0+bWFjX2xvY2FsX2ZhdWx0cyk7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX01SRkMoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5tYWNfcmVtb3RlX2ZhdWx0cywKKwkJCSAgICZuc2QtPm1hY19yZW1vdGVfZmF1bHRzKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUFhPTlJYQyhody0+cG9ydCwgaSksCi0JCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCQkgICAmb3NkLT5wcmlvcml0eV94b25fcnhbaV0sCi0JCQkJCSAgICZuc2QtPnByaW9yaXR5X3hvbl9yeFtpXSk7Ci0JCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUFhPTlRYQyhody0+cG9ydCwgaSksCi0JCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCQkgICAmb3NkLT5wcmlvcml0eV94b25fdHhbaV0sCi0JCQkJCSAgICZuc2QtPnByaW9yaXR5X3hvbl90eFtpXSk7Ci0JCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUFhPRkZUWEMoaHctPnBvcnQsIGkpLAotCQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkJICAgJm9zZC0+cHJpb3JpdHlfeG9mZl90eFtpXSwKLQkJCQkJICAgJm5zZC0+cHJpb3JpdHlfeG9mZl90eFtpXSk7Ci0JCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsCi0JCQkJCSAgIEk0MEVfR0xQUlRfUlhPTjJPRkZDTlQoaHctPnBvcnQsIGkpLAotCQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkJICAgJm9zZC0+cHJpb3JpdHlfeG9uXzJfeG9mZltpXSwKLQkJCQkJICAgJm5zZC0+cHJpb3JpdHlfeG9uXzJfeG9mZltpXSk7Ci0JCX0KKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUkxFQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X2xlbmd0aF9lcnJvcnMsCisJCQkgICAmbnNkLT5yeF9sZW5ndGhfZXJyb3JzKTsKIAotCQlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFJDNjRIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BSQzY0TChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+cnhfc2l6ZV82NCwgJm5zZC0+cnhfc2l6ZV82NCk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMxMjdIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BSQzEyN0woaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnJ4X3NpemVfMTI3LCAmbnNkLT5yeF9zaXplXzEyNyk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMyNTVIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BSQzI1NUwoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnJ4X3NpemVfMjU1LCAmbnNkLT5yeF9zaXplXzI1NSk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkM1MTFIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BSQzUxMUwoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnJ4X3NpemVfNTExLCAmbnNkLT5yeF9zaXplXzUxMSk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMxMDIzSChody0+cG9ydCksCi0JCQkJICAgSTQwRV9HTFBSVF9QUkMxMDIzTChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+cnhfc2l6ZV8xMDIzLCAmbnNkLT5yeF9zaXplXzEwMjMpOwotCQlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFJDMTUyMkgoaHctPnBvcnQpLAotCQkJCSAgIEk0MEVfR0xQUlRfUFJDMTUyMkwoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnJ4X3NpemVfMTUyMiwgJm5zZC0+cnhfc2l6ZV8xNTIyKTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BSQzk1MjJIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BSQzk1MjJMKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT5yeF9zaXplX2JpZywgJm5zZC0+cnhfc2l6ZV9iaWcpOworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9MWE9OUlhDKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+bGlua194b25fcngsICZuc2QtPmxpbmtfeG9uX3J4KTsKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfTFhPTlRYQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPmxpbmtfeG9uX3R4LCAmbnNkLT5saW5rX3hvbl90eCk7CisJaTQwZV91cGRhdGVfcHJpb194b2ZmX3J4KHBmKTsgIC8qIGhhbmRsZXMgSTQwRV9HTFBSVF9MWE9GRlJYQyAqLworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9MWE9GRlRYQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPmxpbmtfeG9mZl90eCwgJm5zZC0+bGlua194b2ZmX3R4KTsKIAotCQlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDNjRIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BUQzY0TChody0+cG9ydCksCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUFhPTlJYQyhody0+cG9ydCwgaSksCiAJCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfc2l6ZV82NCwgJm5zZC0+dHhfc2l6ZV82NCk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QVEMxMjdIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BUQzEyN0woaHctPnBvcnQpLAorCQkJCSAgICZvc2QtPnByaW9yaXR5X3hvbl9yeFtpXSwKKwkJCQkgICAmbnNkLT5wcmlvcml0eV94b25fcnhbaV0pOworCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUFhPTlRYQyhody0+cG9ydCwgaSksCiAJCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfc2l6ZV8xMjcsICZuc2QtPnR4X3NpemVfMTI3KTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BUQzI1NUgoaHctPnBvcnQpLAotCQkJCSAgIEk0MEVfR0xQUlRfUFRDMjU1TChody0+cG9ydCksCisJCQkJICAgJm9zZC0+cHJpb3JpdHlfeG9uX3R4W2ldLAorCQkJCSAgICZuc2QtPnByaW9yaXR5X3hvbl90eFtpXSk7CisJCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9QWE9GRlRYQyhody0+cG9ydCwgaSksCiAJCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfc2l6ZV8yNTUsICZuc2QtPnR4X3NpemVfMjU1KTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BUQzUxMUgoaHctPnBvcnQpLAotCQkJCSAgIEk0MEVfR0xQUlRfUFRDNTExTChody0+cG9ydCksCisJCQkJICAgJm9zZC0+cHJpb3JpdHlfeG9mZl90eFtpXSwKKwkJCQkgICAmbnNkLT5wcmlvcml0eV94b2ZmX3R4W2ldKTsKKwkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LAorCQkJCSAgIEk0MEVfR0xQUlRfUlhPTjJPRkZDTlQoaHctPnBvcnQsIGkpLAogCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnR4X3NpemVfNTExLCAmbnNkLT50eF9zaXplXzUxMSk7Ci0JCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QVEMxMDIzSChody0+cG9ydCksCi0JCQkJICAgSTQwRV9HTFBSVF9QVEMxMDIzTChody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfc2l6ZV8xMDIzLCAmbnNkLT50eF9zaXplXzEwMjMpOwotCQlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDMTUyMkgoaHctPnBvcnQpLAotCQkJCSAgIEk0MEVfR0xQUlRfUFRDMTUyMkwoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnR4X3NpemVfMTUyMiwgJm5zZC0+dHhfc2l6ZV8xNTIyKTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BUQzk1MjJIKGh3LT5wb3J0KSwKLQkJCQkgICBJNDBFX0dMUFJUX1BUQzk1MjJMKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT50eF9zaXplX2JpZywgJm5zZC0+dHhfc2l6ZV9iaWcpOwotCi0JCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9SVUMoaHctPnBvcnQpLAotCQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJCSAgICZvc2QtPnJ4X3VuZGVyc2l6ZSwgJm5zZC0+cnhfdW5kZXJzaXplKTsKLQkJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX1JGQyhody0+cG9ydCksCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+cnhfZnJhZ21lbnRzLCAmbnNkLT5yeF9mcmFnbWVudHMpOwotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUk9DKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT5yeF9vdmVyc2l6ZSwgJm5zZC0+cnhfb3ZlcnNpemUpOwotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUkpDKGh3LT5wb3J0KSwKLQkJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKLQkJCQkgICAmb3NkLT5yeF9qYWJiZXIsICZuc2QtPnJ4X2phYmJlcik7Ci0KLQkJdmFsID0gcmQzMihodywgSTQwRV9QUlRQTV9FRUVfU1RBVCk7Ci0JCW5zZC0+dHhfbHBpX3N0YXR1cyA9Ci0JCQkgICAgICAgKHZhbCAmIEk0MEVfUFJUUE1fRUVFX1NUQVRfVFhfTFBJX1NUQVRVU19NQVNLKSA+PgotCQkJCUk0MEVfUFJUUE1fRUVFX1NUQVRfVFhfTFBJX1NUQVRVU19TSElGVDsKLQkJbnNkLT5yeF9scGlfc3RhdHVzID0KLQkJCSAgICAgICAodmFsICYgSTQwRV9QUlRQTV9FRUVfU1RBVF9SWF9MUElfU1RBVFVTX01BU0spID4+Ci0JCQkJSTQwRV9QUlRQTV9FRUVfU1RBVF9SWF9MUElfU1RBVFVTX1NISUZUOwotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfUFJUUE1fVExQSUMsCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+dHhfbHBpX2NvdW50LCAmbnNkLT50eF9scGlfY291bnQpOwotCQlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfUFJUUE1fUkxQSUMsCi0JCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCi0JCQkJICAgJm9zZC0+cnhfbHBpX2NvdW50LCAmbnNkLT5yeF9scGlfY291bnQpOworCQkJCSAgICZvc2QtPnByaW9yaXR5X3hvbl8yX3hvZmZbaV0sCisJCQkJICAgJm5zZC0+cHJpb3JpdHlfeG9uXzJfeG9mZltpXSk7CiAJfQogCisJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BSQzY0SChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BSQzY0TChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X3NpemVfNjQsICZuc2QtPnJ4X3NpemVfNjQpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMxMjdIKGh3LT5wb3J0KSwKKwkJCSAgIEk0MEVfR0xQUlRfUFJDMTI3TChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X3NpemVfMTI3LCAmbnNkLT5yeF9zaXplXzEyNyk7CisJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BSQzI1NUgoaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QUkMyNTVMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+cnhfc2l6ZV8yNTUsICZuc2QtPnJ4X3NpemVfMjU1KTsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFJDNTExSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BSQzUxMUwoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5yeF9zaXplXzUxMSwgJm5zZC0+cnhfc2l6ZV81MTEpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMxMDIzSChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BSQzEwMjNMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+cnhfc2l6ZV8xMDIzLCAmbnNkLT5yeF9zaXplXzEwMjMpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkMxNTIySChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BSQzE1MjJMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+cnhfc2l6ZV8xNTIyLCAmbnNkLT5yeF9zaXplXzE1MjIpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QUkM5NTIySChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BSQzk1MjJMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+cnhfc2l6ZV9iaWcsICZuc2QtPnJ4X3NpemVfYmlnKTsKKworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QVEM2NEgoaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QVEM2NEwoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT50eF9zaXplXzY0LCAmbnNkLT50eF9zaXplXzY0KTsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDMTI3SChody0+cG9ydCksCisJCQkgICBJNDBFX0dMUFJUX1BUQzEyN0woaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT50eF9zaXplXzEyNywgJm5zZC0+dHhfc2l6ZV8xMjcpOworCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9QVEMyNTVIKGh3LT5wb3J0KSwKKwkJCSAgIEk0MEVfR0xQUlRfUFRDMjU1TChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnR4X3NpemVfMjU1LCAmbnNkLT50eF9zaXplXzI1NSk7CisJaTQwZV9zdGF0X3VwZGF0ZTQ4KGh3LCBJNDBFX0dMUFJUX1BUQzUxMUgoaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QVEM1MTFMKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+dHhfc2l6ZV81MTEsICZuc2QtPnR4X3NpemVfNTExKTsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDMTAyM0goaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QVEMxMDIzTChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnR4X3NpemVfMTAyMywgJm5zZC0+dHhfc2l6ZV8xMDIzKTsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDMTUyMkgoaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QVEMxNTIyTChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnR4X3NpemVfMTUyMiwgJm5zZC0+dHhfc2l6ZV8xNTIyKTsKKwlpNDBlX3N0YXRfdXBkYXRlNDgoaHcsIEk0MEVfR0xQUlRfUFRDOTUyMkgoaHctPnBvcnQpLAorCQkJICAgSTQwRV9HTFBSVF9QVEM5NTIyTChody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnR4X3NpemVfYmlnLCAmbnNkLT50eF9zaXplX2JpZyk7CisKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xQUlRfUlVDKGh3LT5wb3J0KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+cnhfdW5kZXJzaXplLCAmbnNkLT5yeF91bmRlcnNpemUpOworCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9SRkMoaHctPnBvcnQpLAorCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCisJCQkgICAmb3NkLT5yeF9mcmFnbWVudHMsICZuc2QtPnJ4X2ZyYWdtZW50cyk7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX1JPQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X292ZXJzaXplLCAmbnNkLT5yeF9vdmVyc2l6ZSk7CisJaTQwZV9zdGF0X3VwZGF0ZTMyKGh3LCBJNDBFX0dMUFJUX1JKQyhody0+cG9ydCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X2phYmJlciwgJm5zZC0+cnhfamFiYmVyKTsKKworCS8qIEZESVIgc3RhdHMgKi8KKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xRRl9QQ05UKHBmLT5mZF9hdHJfY250X2lkeCksCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPmZkX2F0cl9tYXRjaCwgJm5zZC0+ZmRfYXRyX21hdGNoKTsKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfR0xRRl9QQ05UKHBmLT5mZF9zYl9jbnRfaWR4KSwKKwkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAorCQkJICAgJm9zZC0+ZmRfc2JfbWF0Y2gsICZuc2QtPmZkX3NiX21hdGNoKTsKKworCXZhbCA9IHJkMzIoaHcsIEk0MEVfUFJUUE1fRUVFX1NUQVQpOworCW5zZC0+dHhfbHBpX3N0YXR1cyA9CisJCSAgICAgICAodmFsICYgSTQwRV9QUlRQTV9FRUVfU1RBVF9UWF9MUElfU1RBVFVTX01BU0spID4+CisJCQlJNDBFX1BSVFBNX0VFRV9TVEFUX1RYX0xQSV9TVEFUVVNfU0hJRlQ7CisJbnNkLT5yeF9scGlfc3RhdHVzID0KKwkJICAgICAgICh2YWwgJiBJNDBFX1BSVFBNX0VFRV9TVEFUX1JYX0xQSV9TVEFUVVNfTUFTSykgPj4KKwkJCUk0MEVfUFJUUE1fRUVFX1NUQVRfUlhfTFBJX1NUQVRVU19TSElGVDsKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfUFJUUE1fVExQSUMsCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnR4X2xwaV9jb3VudCwgJm5zZC0+dHhfbHBpX2NvdW50KTsKKwlpNDBlX3N0YXRfdXBkYXRlMzIoaHcsIEk0MEVfUFJUUE1fUkxQSUMsCisJCQkgICBwZi0+c3RhdF9vZmZzZXRzX2xvYWRlZCwKKwkJCSAgICZvc2QtPnJ4X2xwaV9jb3VudCwgJm5zZC0+cnhfbHBpX2NvdW50KTsKKwogCXBmLT5zdGF0X29mZnNldHNfbG9hZGVkID0gdHJ1ZTsKIH0KIAogLyoqCisgKiBpNDBlX3VwZGF0ZV9zdGF0cyAtIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0aXN0aWNzIGNvdW50ZXJzLgorICogQHZzaTogdGhlIFZTSSB0byBiZSB1cGRhdGVkCisgKgorICogVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRzIGZvciB0aGlzIFZTSSBhbmQgaXRzIHJlbGF0ZWQgZW50aXRpZXMuCisgKiovCit2b2lkIGk0MGVfdXBkYXRlX3N0YXRzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKQoreworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKworCWlmICh2c2kgPT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0pCisJCWk0MGVfdXBkYXRlX3BmX3N0YXRzKHBmKTsKKworCWk0MGVfdXBkYXRlX3ZzaV9zdGF0cyh2c2kpOworfQorCisvKioKICAqIGk0MGVfZmluZF9maWx0ZXIgLSBTZWFyY2ggVlNJIGZpbHRlciBsaXN0IGZvciBzcGVjaWZpYyBtYWMvdmxhbiBmaWx0ZXIKICAqIEB2c2k6IHRoZSBWU0kgdG8gYmUgc2VhcmNoZWQKICAqIEBtYWNhZGRyOiB0aGUgTUFDIGFkZHJlc3MKQEAgLTExMDEsNiArMTE2MiwzMCBAQAogfQogCiAvKioKKyAqIGk0MGVfcm1fZGVmYXVsdF9tYWNfZmlsdGVyIC0gUmVtb3ZlIHRoZSBkZWZhdWx0IE1BQyBmaWx0ZXIgc2V0IGJ5IE5WTQorICogQHZzaTogdGhlIFBGIE1haW4gVlNJIC0gaW5hcHByb3ByaWF0ZSBmb3IgYW55IG90aGVyIFZTSQorICogQG1hY2FkZHI6IHRoZSBNQUMgYWRkcmVzcworICoqLworc3RhdGljIHZvaWQgaTQwZV9ybV9kZWZhdWx0X21hY19maWx0ZXIoc3RydWN0IGk0MGVfdnNpICp2c2ksIHU4ICptYWNhZGRyKQoreworCXN0cnVjdCBpNDBlX2FxY19yZW1vdmVfbWFjdmxhbl9lbGVtZW50X2RhdGEgZWxlbWVudDsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJaTQwZV9zdGF0dXMgYXFfcmV0OworCisJLyogT25seSBhcHByb3ByaWF0ZSBmb3IgdGhlIFBGIG1haW4gVlNJICovCisJaWYgKHZzaS0+dHlwZSAhPSBJNDBFX1ZTSV9NQUlOKQorCQlyZXR1cm47CisKKwlldGhlcl9hZGRyX2NvcHkoZWxlbWVudC5tYWNfYWRkciwgbWFjYWRkcik7CisJZWxlbWVudC52bGFuX3RhZyA9IDA7CisJZWxlbWVudC5mbGFncyA9IEk0MEVfQVFDX01BQ1ZMQU5fREVMX1BFUkZFQ1RfTUFUQ0ggfAorCQkJSTQwRV9BUUNfTUFDVkxBTl9ERUxfSUdOT1JFX1ZMQU47CisJYXFfcmV0ID0gaTQwZV9hcV9yZW1vdmVfbWFjdmxhbigmcGYtPmh3LCB2c2ktPnNlaWQsICZlbGVtZW50LCAxLCBOVUxMKTsKKwlpZiAoYXFfcmV0KQorCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiQ291bGQgbm90IHJlbW92ZSBkZWZhdWx0IE1BQy1WTEFOXG4iKTsKK30KKworLyoqCiAgKiBpNDBlX2FkZF9maWx0ZXIgLSBBZGQgYSBtYWMvdmxhbiBmaWx0ZXIgdG8gdGhlIFZTSQogICogQHZzaTogdGhlIFZTSSB0byBiZSBzZWFyY2hlZAogICogQG1hY2FkZHI6IHRoZSBNQUMgYWRkcmVzcwpAQCAtMTEyNSw3ICsxMjEwLDcgQEAKIAkJaWYgKCFmKQogCQkJZ290byBhZGRfZmlsdGVyX291dDsKIAotCQltZW1jcHkoZi0+bWFjYWRkciwgbWFjYWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoZi0+bWFjYWRkciwgbWFjYWRkcik7CiAJCWYtPnZsYW4gPSB2bGFuOwogCQlmLT5jaGFuZ2VkID0gdHJ1ZTsKIApAQCAtMTI0OSw3ICsxMzM0LDcgQEAKIAkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAkJfQogCi0JCW1lbWNweSh2c2ktPmJhY2stPmh3Lm1hYy5hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHZzaS0+YmFjay0+aHcubWFjLmFkZHIsIGFkZHItPnNhX2RhdGEpOwogCX0KIAogCS8qIEluIG9yZGVyIHRvIGJlIHN1cmUgdG8gbm90IGRyb3AgYW55IHBhY2tldHMsIGFkZCB0aGUgbmV3IGFkZHJlc3MKQEAgLTEyNjMsNyArMTM0OCw3IEBACiAJaTQwZV9kZWxfZmlsdGVyKHZzaSwgbmV0ZGV2LT5kZXZfYWRkciwgSTQwRV9WTEFOX0FOWSwgZmFsc2UsIGZhbHNlKTsKIAlpNDBlX3N5bmNfdnNpX2ZpbHRlcnModnNpKTsKIAotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMTMsNyArMTM5OCw3IEBACiAJdnNpLT50Y19jb25maWcubnVtdGMgPSBudW10YzsKIAl2c2ktPnRjX2NvbmZpZy5lbmFibGVkX3RjID0gZW5hYmxlZF90YyA/IGVuYWJsZWRfdGMgOiAxOwogCS8qIE51bWJlciBvZiBxdWV1ZXMgcGVyIGVuYWJsZWQgVEMgKi8KLQludW1fdGNfcXBzID0gcm91bmRkb3duX3Bvd19vZl90d28odnNpLT5hbGxvY19xdWV1ZV9wYWlycy9udW10Yyk7CisJbnVtX3RjX3FwcyA9IHZzaS0+YWxsb2NfcXVldWVfcGFpcnMvbnVtdGM7CiAJbnVtX3RjX3FwcyA9IG1pbl90KGludCwgbnVtX3RjX3FwcywgSTQwRV9NQVhfUVVFVUVTX1BFUl9UQyk7CiAKIAkvKiBTZXR1cCBxdWV1ZSBvZmZzZXQvY291bnQgZm9yIGFsbCBUQ3MgZm9yIGdpdmVuIFZTSSAqLwpAQCAtMTUyMCw4ICsxNjA1LDcgQEAKIAkJCWNtZF9mbGFncyA9IDA7CiAKIAkJCS8qIGFkZCB0byBkZWxldGUgbGlzdCAqLwotCQkJbWVtY3B5KGRlbF9saXN0W251bV9kZWxdLm1hY19hZGRyLAotCQkJICAgICAgIGYtPm1hY2FkZHIsIEVUSF9BTEVOKTsKKwkJCWV0aGVyX2FkZHJfY29weShkZWxfbGlzdFtudW1fZGVsXS5tYWNfYWRkciwgZi0+bWFjYWRkcik7CiAJCQlkZWxfbGlzdFtudW1fZGVsXS52bGFuX3RhZyA9CiAJCQkJY3B1X3RvX2xlMTYoKHUxNikoZi0+dmxhbiA9PQogCQkJCQkgICAgSTQwRV9WTEFOX0FOWSA/IDAgOiBmLT52bGFuKSk7CkBAIC0xNTQyLDcgKzE2MjYsOSBAQAogCQkJCW51bV9kZWwgPSAwOwogCQkJCW1lbXNldChkZWxfbGlzdCwgMCwgc2l6ZW9mKCpkZWxfbGlzdCkpOwogCi0JCQkJaWYgKGFxX3JldCkKKwkJCQlpZiAoYXFfcmV0ICYmCisJCQkJICAgIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMgIT0KKwkJCQkJCQkgICAgICBJNDBFX0FRX1JDX0VOT0VOVCkKIAkJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCiAJCQkJCQkgImlnbm9yaW5nIGRlbGV0ZSBtYWN2bGFuIGVycm9yLCBlcnIgJWQsIGFxX2VyciAlZCB3aGlsZSBmbHVzaGluZyBhIGZ1bGwgYnVmZmVyXG4iLAogCQkJCQkJIGFxX3JldCwKQEAgLTE1NTQsNyArMTY0MCw4IEBACiAJCQkJCQkgICAgIGRlbF9saXN0LCBudW1fZGVsLCBOVUxMKTsKIAkJCW51bV9kZWwgPSAwOwogCi0JCQlpZiAoYXFfcmV0KQorCQkJaWYgKGFxX3JldCAmJgorCQkJICAgIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMgIT0gSTQwRV9BUV9SQ19FTk9FTlQpCiAJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCiAJCQkJCSAiaWdub3JpbmcgZGVsZXRlIG1hY3ZsYW4gZXJyb3IsIGVyciAlZCwgYXFfZXJyICVkXG4iLAogCQkJCQkgYXFfcmV0LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKQEAgLTE1ODMsOCArMTY3MCw3IEBACiAJCQljbWRfZmxhZ3MgPSAwOwogCiAJCQkvKiBhZGQgdG8gYWRkIGFycmF5ICovCi0JCQltZW1jcHkoYWRkX2xpc3RbbnVtX2FkZF0ubWFjX2FkZHIsCi0JCQkgICAgICAgZi0+bWFjYWRkciwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KGFkZF9saXN0W251bV9hZGRdLm1hY19hZGRyLCBmLT5tYWNhZGRyKTsKIAkJCWFkZF9saXN0W251bV9hZGRdLnZsYW5fdGFnID0KIAkJCQljcHVfdG9fbGUxNigKIAkJCQkgKHUxNikoZi0+dmxhbiA9PSBJNDBFX1ZMQU5fQU5ZID8gMCA6IGYtPnZsYW4pKTsKQEAgLTE2ODEsNyArMTc2Nyw3IEBACiAJCXJldHVybjsKIAlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GSUxURVJfU1lOQzsKIAotCWZvciAodiA9IDA7IHYgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyB2KyspIHsKKwlmb3IgKHYgPSAwOyB2IDwgcGYtPm51bV9hbGxvY192c2k7IHYrKykgewogCQlpZiAocGYtPnZzaVt2XSAmJgogCQkgICAgKHBmLT52c2lbdl0tPmZsYWdzICYgSTQwRV9WU0lfRkxBR19GSUxURVJfQ0hBTkdFRCkpCiAJCQlpNDBlX3N5bmNfdnNpX2ZpbHRlcnMocGYtPnZzaVt2XSk7CkBAIC0xNjk4LDcgKzE3ODQsNyBAQAogc3RhdGljIGludCBpNDBlX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCiB7CiAJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU47CisJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOICsgVkxBTl9ITEVOOwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKIAogCS8qIE1UVSA8IDY4IGlzIGFuIGVycm9yIGFuZCBjYXVzZXMgcHJvYmxlbXMgb24gc29tZSBrZXJuZWxzICovCkBAIC0yMzEyLDYgKzIzOTgsOCBAQAogCXJ4X2N0eC5jcmNzdHJpcCA9IDE7CiAJcnhfY3R4LmwydHNlbCA9IDE7CiAJcnhfY3R4LnNob3dpdiA9IDE7CisJLyogc2V0IHRoZSBwcmVmZW5hIGZpZWxkIHRvIDEgYmVjYXVzZSB0aGUgbWFudWFsIHNheXMgdG8gKi8KKwlyeF9jdHgucHJlZmVuYSA9IDE7CiAKIAkvKiBjbGVhciB0aGUgY29udGV4dCBpbiB0aGUgSE1DICovCiAJZXJyID0gaTQwZV9jbGVhcl9sYW5fcnhfcXVldWVfY29udGV4dChodywgcGZfcSk7CkBAIC0yNDEzLDYgKzI1MDEsNyBAQAogICoqLwogc3RhdGljIHZvaWQgaTQwZV92c2lfY29uZmlnX2RjYl9yaW5ncyhzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKIHsKKwlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nLCAqcnhfcmluZzsKIAl1MTYgcW9mZnNldCwgcWNvdW50OwogCWludCBpLCBuOwogCkBAIC0yNDI2LDggKzI1MTUsOCBAQAogCQlxb2Zmc2V0ID0gdnNpLT50Y19jb25maWcudGNfaW5mb1tuXS5xb2Zmc2V0OwogCQlxY291bnQgPSB2c2ktPnRjX2NvbmZpZy50Y19pbmZvW25dLnFjb3VudDsKIAkJZm9yIChpID0gcW9mZnNldDsgaSA8IChxb2Zmc2V0ICsgcWNvdW50KTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nID0gdnNpLT5yeF9yaW5nc1tpXTsKLQkJCXN0cnVjdCBpNDBlX3JpbmcgKnR4X3JpbmcgPSB2c2ktPnR4X3JpbmdzW2ldOworCQkJcnhfcmluZyA9IHZzaS0+cnhfcmluZ3NbaV07CisJCQl0eF9yaW5nID0gdnNpLT50eF9yaW5nc1tpXTsKIAkJCXJ4X3JpbmctPmRjYl90YyA9IG47CiAJCQl0eF9yaW5nLT5kY2JfdGMgPSBuOwogCQl9CkBAIC0yNTY1LDcgKzI2NTQsNiBAQAogCSAgICAgIEk0MEVfUEZJTlRfSUNSMF9FTkFfUENJX0VYQ0VQVElPTl9NQVNLIHwKIAkgICAgICBJNDBFX1BGSU5UX0lDUjBfRU5BX0dQSU9fTUFTSyAgICAgICAgICB8CiAJICAgICAgSTQwRV9QRklOVF9JQ1IwX0VOQV9USU1FU1lOQ19NQVNLICAgICAgfAotCSAgICAgIEk0MEVfUEZJTlRfSUNSMF9FTkFfU1RPUk1fREVURUNUX01BU0sgIHwKIAkgICAgICBJNDBFX1BGSU5UX0lDUjBfRU5BX0hNQ19FUlJfTUFTSyAgICAgICB8CiAJICAgICAgSTQwRV9QRklOVF9JQ1IwX0VOQV9WRkxSX01BU0sgICAgICAgICAgfAogCSAgICAgIEk0MEVfUEZJTlRfSUNSMF9FTkFfQURNSU5RX01BU0s7CkBAIC0yNzMzLDYgKzI4MjEsNyBAQAogCQkJCSAgICAgICZxX3ZlY3Rvci0+YWZmaW5pdHlfbWFzayk7CiAJfQogCisJdnNpLT5pcnFzX3JlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIAogZnJlZV9xdWV1ZV9pcnFzOgpAQCAtMzE1Miw2ICszMjQxLDEyIEBACiAKIAlwZl9xID0gdnNpLT5iYXNlX3F1ZXVlOwogCWZvciAoaSA9IDA7IGkgPCB2c2ktPm51bV9xdWV1ZV9wYWlyczsgaSsrLCBwZl9xKyspIHsKKworCQkvKiB3YXJuIHRoZSBUWCB1bml0IG9mIGNvbWluZyBjaGFuZ2VzICovCisJCWk0MGVfcHJlX3R4X3F1ZXVlX2NmZygmcGYtPmh3LCBwZl9xLCBlbmFibGUpOworCQlpZiAoIWVuYWJsZSkKKwkJCXVkZWxheSgxMCk7CisKIAkJZm9yIChqID0gMDsgaiA8IDUwOyBqKyspIHsKIAkJCXR4X3JlZyA9IHJkMzIoaHcsIEk0MEVfUVRYX0VOQShwZl9xKSk7CiAJCQlpZiAoKCh0eF9yZWcgPj4gSTQwRV9RVFhfRU5BX1FFTkFfUkVRX1NISUZUKSAmIDEpID09CkBAIC0zMTYwLDkgKzMyNTUsNyBAQAogCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQl9CiAJCS8qIFNraXAgaWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgaW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSAqLwotCQlpZiAoZW5hYmxlICYmICh0eF9yZWcgJiBJNDBFX1FUWF9FTkFfUUVOQV9TVEFUX01BU0spKQotCQkJY29udGludWU7Ci0JCWlmICghZW5hYmxlICYmICEodHhfcmVnICYgSTQwRV9RVFhfRU5BX1FFTkFfU1RBVF9NQVNLKSkKKwkJaWYgKGVuYWJsZSA9PSAhISh0eF9yZWcgJiBJNDBFX1FUWF9FTkFfUUVOQV9TVEFUX01BU0spKQogCQkJY29udGludWU7CiAKIAkJLyogdHVybiBvbi9vZmYgdGhlIHF1ZXVlICovCkBAIC0zMTc4LDEzICszMjcxLDggQEAKIAkJLyogd2FpdCBmb3IgdGhlIGNoYW5nZSB0byBmaW5pc2ggKi8KIAkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspIHsKIAkJCXR4X3JlZyA9IHJkMzIoaHcsIEk0MEVfUVRYX0VOQShwZl9xKSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJaWYgKCh0eF9yZWcgJiBJNDBFX1FUWF9FTkFfUUVOQV9TVEFUX01BU0spKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEodHhfcmVnICYgSTQwRV9RVFhfRU5BX1FFTkFfU1RBVF9NQVNLKSkKLQkJCQkJYnJlYWs7Ci0JCQl9CisJCQlpZiAoZW5hYmxlID09ICEhKHR4X3JlZyAmIEk0MEVfUVRYX0VOQV9RRU5BX1NUQVRfTUFTSykpCisJCQkJYnJlYWs7CiAKIAkJCXVkZWxheSgxMCk7CiAJCX0KQEAgLTMyMjMsMTUgKzMzMTEsOSBAQAogCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQl9CiAKLQkJaWYgKGVuYWJsZSkgewotCQkJLyogaXMgU1RBVCBzZXQgPyAqLwotCQkJaWYgKChyeF9yZWcgJiBJNDBFX1FSWF9FTkFfUUVOQV9TVEFUX01BU0spKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJLyogaXMgIVNUQVQgc2V0ID8gKi8KLQkJCWlmICghKHJ4X3JlZyAmIEk0MEVfUVJYX0VOQV9RRU5BX1NUQVRfTUFTSykpCi0JCQkJY29udGludWU7Ci0JCX0KKwkJLyogU2tpcCBpZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBpbiB0aGUgcmVxdWVzdGVkIHN0YXRlICovCisJCWlmIChlbmFibGUgPT0gISEocnhfcmVnICYgSTQwRV9RUlhfRU5BX1FFTkFfU1RBVF9NQVNLKSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIHR1cm4gb24vb2ZmIHRoZSBxdWV1ZSAqLwogCQlpZiAoZW5hYmxlKQpAQCAtMzI0NCwxMyArMzMyNiw4IEBACiAJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKSB7CiAJCQlyeF9yZWcgPSByZDMyKGh3LCBJNDBFX1FSWF9FTkEocGZfcSkpOwogCi0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJaWYgKChyeF9yZWcgJiBJNDBFX1FSWF9FTkFfUUVOQV9TVEFUX01BU0spKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEocnhfcmVnICYgSTQwRV9RUlhfRU5BX1FFTkFfU1RBVF9NQVNLKSkKLQkJCQkJYnJlYWs7Ci0JCQl9CisJCQlpZiAoZW5hYmxlID09ICEhKHJ4X3JlZyAmIEk0MEVfUVJYX0VOQV9RRU5BX1NUQVRfTUFTSykpCisJCQkJYnJlYWs7CiAKIAkJCXVkZWxheSgxMCk7CiAJCX0KQEAgLTMzMDQsNiArMzM4MSwxMCBAQAogCQlpZiAoIXZzaS0+cV92ZWN0b3JzKQogCQkJcmV0dXJuOwogCisJCWlmICghdnNpLT5pcnFzX3JlYWR5KQorCQkJcmV0dXJuOworCisJCXZzaS0+aXJxc19yZWFkeSA9IGZhbHNlOwogCQlmb3IgKGkgPSAwOyBpIDwgdnNpLT5udW1fcV92ZWN0b3JzOyBpKyspIHsKIAkJCXUxNiB2ZWN0b3IgPSBpICsgYmFzZTsKIApAQCAtMzQ3Niw3ICszNTU3LDcgQEAKIAlpbnQgaTsKIAogCWk0MGVfcHV0X2x1bXAocGYtPmlycV9waWxlLCAwLCBJNDBFX1BJTEVfVkFMSURfQklULTEpOwotCWZvciAoaSA9IDA7IGkgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHBmLT5udW1fYWxsb2NfdnNpOyBpKyspCiAJCWlmIChwZi0+dnNpW2ldKQogCQkJaTQwZV92c2lfZnJlZV9xX3ZlY3RvcnMocGYtPnZzaVtpXSk7CiAJaTQwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShwZik7CkBAIC0zNTEzLDYgKzM1OTQsMTkgQEAKIH0KIAogLyoqCisgKiBpNDBlX3ZzaV9jbG9zZSAtIFNodXQgZG93biBhIFZTSQorICogQHZzaTogdGhlIHZzaSB0byBiZSBxdWVsbGVkCisgKiovCitzdGF0aWMgdm9pZCBpNDBlX3ZzaV9jbG9zZShzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoX19JNDBFX0RPV04sICZ2c2ktPnN0YXRlKSkKKwkJaTQwZV9kb3duKHZzaSk7CisJaTQwZV92c2lfZnJlZV9pcnEodnNpKTsKKwlpNDBlX3ZzaV9mcmVlX3R4X3Jlc291cmNlcyh2c2kpOworCWk0MGVfdnNpX2ZyZWVfcnhfcmVzb3VyY2VzKHZzaSk7Cit9CisKKy8qKgogICogaTQwZV9xdWllc2NlX3ZzaSAtIFBhdXNlIGEgZ2l2ZW4gVlNJCiAgKiBAdnNpOiB0aGUgVlNJIGJlaW5nIHBhdXNlZAogICoqLwpAQCAtMzUyNSw4ICszNjE5LDcgQEAKIAlpZiAodnNpLT5uZXRkZXYgJiYgbmV0aWZfcnVubmluZyh2c2ktPm5ldGRldikpIHsKIAkJdnNpLT5uZXRkZXYtPm5ldGRldl9vcHMtPm5kb19zdG9wKHZzaS0+bmV0ZGV2KTsKIAl9IGVsc2UgewotCQlzZXRfYml0KF9fSTQwRV9ET1dOLCAmdnNpLT5zdGF0ZSk7Ci0JCWk0MGVfZG93bih2c2kpOworCQlpNDBlX3ZzaV9jbG9zZSh2c2kpOwogCX0KIH0KIApAQCAtMzU0Myw3ICszNjM2LDcgQEAKIAlpZiAodnNpLT5uZXRkZXYgJiYgbmV0aWZfcnVubmluZyh2c2ktPm5ldGRldikpCiAJCXZzaS0+bmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fb3Blbih2c2ktPm5ldGRldik7CiAJZWxzZQotCQlpNDBlX3VwKHZzaSk7ICAgLyogdGhpcyBjbGVhcnMgdGhlIERPV04gYml0ICovCisJCWk0MGVfdnNpX29wZW4odnNpKTsgICAvKiB0aGlzIGNsZWFycyB0aGUgRE9XTiBiaXQgKi8KIH0KIAogLyoqCkBAIC0zNTU0LDcgKzM2NDcsNyBAQAogewogCWludCB2OwogCi0JZm9yICh2ID0gMDsgdiA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IHYrKykgeworCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCWlmIChwZi0+dnNpW3ZdKQogCQkJaTQwZV9xdWllc2NlX3ZzaShwZi0+dnNpW3ZdKTsKIAl9CkBAIC0zNTY4LDcgKzM2NjEsNyBAQAogewogCWludCB2OwogCi0JZm9yICh2ID0gMDsgdiA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IHYrKykgeworCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCWlmIChwZi0+dnNpW3ZdKQogCQkJaTQwZV91bnF1aWVzY2VfdnNpKHBmLT52c2lbdl0pOwogCX0KQEAgLTQwMDksNyArNDEwMiw3IEBACiAJfQogCiAJLyogVXBkYXRlIGVhY2ggVlNJICovCi0JZm9yICh2ID0gMDsgdiA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IHYrKykgeworCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCWlmICghcGYtPnZzaVt2XSkKIAkJCWNvbnRpbnVlOwogCkBAIC00MDI4LDYgKzQxMjEsOCBAQAogCQkJCSBwZi0+dnNpW3ZdLT5zZWlkKTsKIAkJCS8qIFdpbGwgdHJ5IHRvIGNvbmZpZ3VyZSBhcyBtYW55IGNvbXBvbmVudHMgKi8KIAkJfSBlbHNlIHsKKwkJCS8qIFJlLWNvbmZpZ3VyZSBWU0kgdmVjdG9ycyBiYXNlZCBvbiB1cGRhdGVkIFRDIG1hcCAqLworCQkJaTQwZV92c2lfbWFwX3JpbmdzX3RvX3ZlY3RvcnMocGYtPnZzaVt2XSk7CiAJCQlpZiAocGYtPnZzaVt2XS0+bmV0ZGV2KQogCQkJCWk0MGVfZGNibmxfc2V0X2FsbChwZi0+dnNpW3ZdKTsKIAkJfQpAQCAtNDA2NSwxNCArNDE2MCw2OSBAQAogCQkJLyogV2hlbiBzdGF0dXMgaXMgbm90IERJU0FCTEVEIHRoZW4gRENCWCBpbiBGVyAqLwogCQkJcGYtPmRjYnhfY2FwID0gRENCX0NBUF9EQ0JYX0xMRF9NQU5BR0VEIHwKIAkJCQkgICAgICAgRENCX0NBUF9EQ0JYX1ZFUl9JRUVFOwotCQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19EQ0JfRU5BQkxFRDsKKworCQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKKwkJCS8qIEVuYWJsZSBEQ0IgdGFnZ2luZyBvbmx5IHdoZW4gbW9yZSB0aGFuIG9uZSBUQyAqLworCQkJaWYgKGk0MGVfZGNiX2dldF9udW1fdGMoJmh3LT5sb2NhbF9kY2J4X2NvbmZpZykgPiAxKQorCQkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRENCX0VOQUJMRUQ7CiAJCX0KKwl9IGVsc2UgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFRIFF1ZXJ5aW5nIERDQiBjb25maWd1cmF0aW9uIGZhaWxlZDogJWRcbiIsCisJCQkgcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1cyk7CiAJfQogCiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KICNlbmRpZiAvKiBDT05GSUdfSTQwRV9EQ0IgKi8KKyNkZWZpbmUgU1BFRURfU0laRSAxNAorI2RlZmluZSBGQ19TSVpFIDgKKy8qKgorICogaTQwZV9wcmludF9saW5rX21lc3NhZ2UgLSBwcmludCBsaW5rIHVwIG9yIGRvd24KKyAqIEB2c2k6IHRoZSBWU0kgZm9yIHdoaWNoIGxpbmsgbmVlZHMgYSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIGk0MGVfcHJpbnRfbGlua19tZXNzYWdlKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBib29sIGlzdXApCit7CisJY2hhciBzcGVlZFtTUEVFRF9TSVpFXSA9ICJVbmtub3duIjsKKwljaGFyIGZjW0ZDX1NJWkVdID0gIlJYL1RYIjsKKworCWlmICghaXN1cCkgeworCQluZXRkZXZfaW5mbyh2c2ktPm5ldGRldiwgIk5JQyBMaW5rIGlzIERvd25cbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh2c2ktPmJhY2stPmh3LnBoeS5saW5rX2luZm8ubGlua19zcGVlZCkgeworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzQwR0I6CisJCXN0cm5jcHkoc3BlZWQsICI0MCBHYnBzIiwgU1BFRURfU0laRSk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwR0I6CisJCXN0cm5jcHkoc3BlZWQsICIxMCBHYnBzIiwgU1BFRURfU0laRSk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzFHQjoKKwkJc3RybmNweShzcGVlZCwgIjEwMDAgTWJwcyIsIFNQRUVEX1NJWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHZzaS0+YmFjay0+aHcuZmMuY3VycmVudF9tb2RlKSB7CisJY2FzZSBJNDBFX0ZDX0ZVTEw6CisJCXN0cm5jcHkoZmMsICJSWC9UWCIsIEZDX1NJWkUpOworCQlicmVhazsKKwljYXNlIEk0MEVfRkNfVFhfUEFVU0U6CisJCXN0cm5jcHkoZmMsICJUWCIsIEZDX1NJWkUpOworCQlicmVhazsKKwljYXNlIEk0MEVfRkNfUlhfUEFVU0U6CisJCXN0cm5jcHkoZmMsICJSWCIsIEZDX1NJWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHJuY3B5KGZjLCAiTm9uZSIsIEZDX1NJWkUpOworCQlicmVhazsKKwl9CisKKwluZXRkZXZfaW5mbyh2c2ktPm5ldGRldiwgIk5JQyBMaW5rIGlzIFVwICVzIEZ1bGwgRHVwbGV4LCBGbG93IENvbnRyb2w6ICVzXG4iLAorCQkgICAgc3BlZWQsIGZjKTsKK30KIAogLyoqCiAgKiBpNDBlX3VwX2NvbXBsZXRlIC0gRmluaXNoIHRoZSBsYXN0IHN0ZXBzIG9mIGJyaW5naW5nIHVwIGEgY29ubmVjdGlvbgpAQCAtNDA5OSwxMSArNDI0OSwxMSBAQAogCiAJaWYgKChwZi0+aHcucGh5LmxpbmtfaW5mby5saW5rX2luZm8gJiBJNDBFX0FRX0xJTktfVVApICYmCiAJICAgICh2c2ktPm5ldGRldikpIHsKLQkJbmV0ZGV2X2luZm8odnNpLT5uZXRkZXYsICJOSUMgTGluayBpcyBVcFxuIik7CisJCWk0MGVfcHJpbnRfbGlua19tZXNzYWdlKHZzaSwgdHJ1ZSk7CiAJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXModnNpLT5uZXRkZXYpOwogCQluZXRpZl9jYXJyaWVyX29uKHZzaS0+bmV0ZGV2KTsKIAl9IGVsc2UgaWYgKHZzaS0+bmV0ZGV2KSB7Ci0JCW5ldGRldl9pbmZvKHZzaS0+bmV0ZGV2LCAiTklDIExpbmsgaXMgRG93blxuIik7CisJCWk0MGVfcHJpbnRfbGlua19tZXNzYWdlKHZzaSwgZmFsc2UpOwogCX0KIAogCS8qIHJlcGxheSBGRElSIFNCIGZpbHRlcnMgKi8KQEAgLTQzMDksMjQgKzQ0NTksMzIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9zZXR1cF9yeDsKIAotCWlmICghdnNpLT5uZXRkZXYpIHsKLQkJZXJyID0gRUlOVkFMOworCWlmICh2c2ktPm5ldGRldikgeworCQlzbnByaW50ZihpbnRfbmFtZSwgc2l6ZW9mKGludF9uYW1lKSAtIDEsICIlcy0lcyIsCisJCQkgZGV2X2RyaXZlcl9zdHJpbmcoJnBmLT5wZGV2LT5kZXYpLCB2c2ktPm5ldGRldi0+bmFtZSk7CisJCWVyciA9IGk0MGVfdnNpX3JlcXVlc3RfaXJxKHZzaSwgaW50X25hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfc2V0dXBfcng7CisKKwkJLyogTm90aWZ5IHRoZSBzdGFjayBvZiB0aGUgYWN0dWFsIHF1ZXVlIGNvdW50cy4gKi8KKwkJZXJyID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyh2c2ktPm5ldGRldiwKKwkJCQkJCSAgIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3NldF9xdWV1ZXM7CisKKwkJZXJyID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyh2c2ktPm5ldGRldiwKKwkJCQkJCSAgIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3NldF9xdWV1ZXM7CisKKwl9IGVsc2UgaWYgKHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9GRElSKSB7CisJCXNucHJpbnRmKGludF9uYW1lLCBzaXplb2YoaW50X25hbWUpIC0gMSwgIiVzLWZkaXIiLAorCQkJIGRldl9kcml2ZXJfc3RyaW5nKCZwZi0+cGRldi0+ZGV2KSk7CisJCWVyciA9IGk0MGVfdnNpX3JlcXVlc3RfaXJxKHZzaSwgaW50X25hbWUpOworCX0gZWxzZSB7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3NldHVwX3J4OwogCX0KLQlzbnByaW50ZihpbnRfbmFtZSwgc2l6ZW9mKGludF9uYW1lKSAtIDEsICIlcy0lcyIsCi0JCSBkZXZfZHJpdmVyX3N0cmluZygmcGYtPnBkZXYtPmRldiksIHZzaS0+bmV0ZGV2LT5uYW1lKTsKLQllcnIgPSBpNDBlX3ZzaV9yZXF1ZXN0X2lycSh2c2ksIGludF9uYW1lKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZXR1cF9yeDsKLQotCS8qIE5vdGlmeSB0aGUgc3RhY2sgb2YgdGhlIGFjdHVhbCBxdWV1ZSBjb3VudHMuICovCi0JZXJyID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyh2c2ktPm5ldGRldiwgdnNpLT5udW1fcXVldWVfcGFpcnMpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3NldF9xdWV1ZXM7Ci0KLQllcnIgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKHZzaS0+bmV0ZGV2LCB2c2ktPm51bV9xdWV1ZV9wYWlycyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfc2V0X3F1ZXVlczsKIAogCWVyciA9IGk0MGVfdXBfY29tcGxldGUodnNpKTsKIAlpZiAoZXJyKQpAQCAtNDM4MywxNCArNDU0MSw3IEBACiAJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IG5wLT52c2k7CiAKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChfX0k0MEVfRE9XTiwgJnZzaS0+c3RhdGUpKQotCQlyZXR1cm4gMDsKLQotCWk0MGVfZG93bih2c2kpOwotCWk0MGVfdnNpX2ZyZWVfaXJxKHZzaSk7Ci0KLQlpNDBlX3ZzaV9mcmVlX3R4X3Jlc291cmNlcyh2c2kpOwotCWk0MGVfdnNpX2ZyZWVfcnhfcmVzb3VyY2VzKHZzaSk7CisJaTQwZV92c2lfY2xvc2UodnNpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQxMCw2ICs0NTYxLDkgQEAKIAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwogCisJaWYgKGk0MGVfY2hlY2tfYXNxX2FsaXZlKCZwZi0+aHcpKQorCQlpNDBlX3ZjX25vdGlmeV9yZXNldChwZik7CisKIAkvKiBkbyB0aGUgYmlnZ2VzdCByZXNldCBpbmRpY2F0ZWQgKi8KIAlpZiAocmVzZXRfZmxhZ3MgJiAoMSA8PCBfX0k0MEVfR0xPQkFMX1JFU0VUX1JFUVVFU1RFRCkpIHsKIApAQCAtNDQ3NSw3ICs0NjI5LDcgQEAKIAkJLyogRmluZCB0aGUgVlNJKHMpIHRoYXQgcmVxdWVzdGVkIGEgcmUtaW5pdCAqLwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKIAkJCSAiVlNJIHJlaW5pdCByZXF1ZXN0ZWRcbiIpOwotCQlmb3IgKHYgPSAwOyB2IDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgdisrKSB7CisJCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CiAJCQlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHBmLT52c2lbdl07CiAJCQlpZiAodnNpICE9IE5VTEwgJiYKIAkJCSAgICB0ZXN0X2JpdChfX0k0MEVfUkVJTklUX1JFUVVFU1RFRCwgJnZzaS0+c3RhdGUpKSB7CkBAIC00NTY1LDYgKzQ3MTksMTAgQEAKIAlpbnQgcmV0ID0gMDsKIAl1OCB0eXBlOwogCisJLyogTm90IERDQiBjYXBhYmxlIG9yIGNhcGFiaWxpdHkgZGlzYWJsZWQgKi8KKwlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0NBUEFCTEUpKQorCQlyZXR1cm4gcmV0OworCiAJLyogSWdub3JlIGlmIGV2ZW50IGlzIG5vdCBmb3IgTmVhcmVzdCBCcmlkZ2UgKi8KIAl0eXBlID0gKChtaWItPnR5cGUgPj4gSTQwRV9BUV9MTERQX0JSSURHRV9UWVBFX1NISUZUKQogCQkmIEk0MEVfQVFfTExEUF9CUklER0VfVFlQRV9NQVNLKTsKQEAgLTQ2MDYsNiArNDc2NCwxMiBAQAogCWlmICghbmVlZF9yZWNvbmZpZykKIAkJZ290byBleGl0OwogCisJLyogRW5hYmxlIERDQiB0YWdnaW5nIG9ubHkgd2hlbiBtb3JlIHRoYW4gb25lIFRDICovCisJaWYgKGk0MGVfZGNiX2dldF9udW1fdGMoZGNieF9jZmcpID4gMSkKKwkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19EQ0JfRU5BQkxFRDsKKwllbHNlCisJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9FTkFCTEVEOworCiAJLyogUmVjb25maWd1cmF0aW9uIG5lZWRlZCBxdWllc2NlIGFsbCBWU0lzICovCiAJaTQwZV9wZl9xdWllc2NlX2FsbF92c2kocGYpOwogCkBAIC00NzA5LDggKzQ4NzMsNyBAQAogCSAgICAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpKQogCQlyZXR1cm47CiAJZmNudF9wcm9nID0gaTQwZV9nZXRfY3VycmVudF9mZF9jb3VudChwZik7Ci0JZmNudF9hdmFpbCA9IHBmLT5ody5mZGlyX3NoYXJlZF9maWx0ZXJfY291bnQgKwotCQkJCQkgICAgICAgcGYtPmZkaXJfcGZfZmlsdGVyX2NvdW50OworCWZjbnRfYXZhaWwgPSBpNDBlX2dldF9mZF9jbnRfYWxsKHBmKTsKIAlpZiAoZmNudF9wcm9nIDwgKGZjbnRfYXZhaWwgLSBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTSkpIHsKIAkJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgJiYKIAkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpKSB7CkBAIC00ODAzLDcgKzQ5NjYsNyBAQAogCQkJaTQwZV92ZWJfbGlua19ldmVudChwZi0+dmViW2ldLCBsaW5rX3VwKTsKIAogCS8qIC4uLiBub3cgdGhlIGxvY2FsIFZTSXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKQogCQlpZiAocGYtPnZzaVtpXSAmJiAocGYtPnZzaVtpXS0+dXBsaW5rX3NlaWQgPT0gdmViLT5zZWlkKSkKIAkJCWk0MGVfdnNpX2xpbmtfZXZlbnQocGYtPnZzaVtpXSwgbGlua191cCk7CiB9CkBAIC00ODIxLDEwICs0OTg0LDggQEAKIAogCWlmIChuZXdfbGluayA9PSBvbGRfbGluaykKIAkJcmV0dXJuOwotCiAJaWYgKCF0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnBmLT52c2lbcGYtPmxhbl92c2ldLT5zdGF0ZSkpCi0JCW5ldGRldl9pbmZvKHBmLT52c2lbcGYtPmxhbl92c2ldLT5uZXRkZXYsCi0JCQkgICAgIk5JQyBMaW5rIGlzICVzXG4iLCAobmV3X2xpbmsgPyAiVXAiIDogIkRvd24iKSk7CisJCWk0MGVfcHJpbnRfbGlua19tZXNzYWdlKHBmLT52c2lbcGYtPmxhbl92c2ldLCBuZXdfbGluayk7CiAKIAkvKiBOb3RpZnkgdGhlIGJhc2Ugb2YgdGhlIHN3aXRjaCB0cmVlIGNvbm5lY3RlZCB0bwogCSAqIHRoZSBsaW5rLiAgRmxvYXRpbmcgVkVCcyBhcmUgbm90IG5vdGlmaWVkLgpAQCAtNDg2Miw3ICs1MDIzLDcgQEAKIAkgKiAgICAgZm9yIGVhY2ggcV92ZWN0b3IKIAkgKiAgICAgICAgIGZvcmNlIGFuIGludGVycnVwdAogCSAqLwotCWZvciAodiA9IDA7IHYgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyB2KyspIHsKKwlmb3IgKHYgPSAwOyB2IDwgcGYtPm51bV9hbGxvY192c2k7IHYrKykgewogCQlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHBmLT52c2lbdl07CiAJCWludCBhcm1lZCA9IDA7CiAKQEAgLTQ5MTIsNyArNTA3Myw3IEBACiAJLyogVXBkYXRlIHRoZSBzdGF0cyBmb3IgYWN0aXZlIG5ldGRldnMgc28gdGhlIG5ldHdvcmsgc3RhY2sKIAkgKiBjYW4gbG9vayBhdCB1cGRhdGVkIG51bWJlcnMgd2hlbmV2ZXIgaXQgY2FyZXMgdG8KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKQogCQlpZiAocGYtPnZzaVtpXSAmJiBwZi0+dnNpW2ldLT5uZXRkZXYpCiAJCQlpNDBlX3VwZGF0ZV9zdGF0cyhwZi0+dnNpW2ldKTsKIApAQCAtNTAxOCwxMSArNTE3OSw0NyBAQAogCXUxNiBwZW5kaW5nLCBpID0gMDsKIAlpNDBlX3N0YXR1cyByZXQ7CiAJdTE2IG9wY29kZTsKKwl1MzIgb2xkdmFsOwogCXUzMiB2YWw7CiAKIAlpZiAoIXRlc3RfYml0KF9fSTQwRV9BRE1JTlFfRVZFTlRfUEVORElORywgJnBmLT5zdGF0ZSkpCiAJCXJldHVybjsKIAorCS8qIGNoZWNrIGZvciBlcnJvciBpbmRpY2F0aW9ucyAqLworCXZhbCA9IHJkMzIoJnBmLT5odywgcGYtPmh3LmFxLmFycS5sZW4pOworCW9sZHZhbCA9IHZhbDsKKwlpZiAodmFsICYgSTQwRV9QRl9BUlFMRU5fQVJRVkZFX01BU0spIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBUlEgVkYgRXJyb3IgZGV0ZWN0ZWRcbiIpOworCQl2YWwgJj0gfkk0MEVfUEZfQVJRTEVOX0FSUVZGRV9NQVNLOworCX0KKwlpZiAodmFsICYgSTQwRV9QRl9BUlFMRU5fQVJRT1ZGTF9NQVNLKSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVJRIE92ZXJmbG93IEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1BGX0FSUUxFTl9BUlFPVkZMX01BU0s7CisJfQorCWlmICh2YWwgJiBJNDBFX1BGX0FSUUxFTl9BUlFDUklUX01BU0spIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBUlEgQ3JpdGljYWwgRXJyb3IgZGV0ZWN0ZWRcbiIpOworCQl2YWwgJj0gfkk0MEVfUEZfQVJRTEVOX0FSUUNSSVRfTUFTSzsKKwl9CisJaWYgKG9sZHZhbCAhPSB2YWwpCisJCXdyMzIoJnBmLT5odywgcGYtPmh3LmFxLmFycS5sZW4sIHZhbCk7CisKKwl2YWwgPSByZDMyKCZwZi0+aHcsIHBmLT5ody5hcS5hc3EubGVuKTsKKwlvbGR2YWwgPSB2YWw7CisJaWYgKHZhbCAmIEk0MEVfUEZfQVRRTEVOX0FUUVZGRV9NQVNLKSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVNRIFZGIEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1BGX0FUUUxFTl9BVFFWRkVfTUFTSzsKKwl9CisJaWYgKHZhbCAmIEk0MEVfUEZfQVRRTEVOX0FUUU9WRkxfTUFTSykgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFTUSBPdmVyZmxvdyBFcnJvciBkZXRlY3RlZFxuIik7CisJCXZhbCAmPSB+STQwRV9QRl9BVFFMRU5fQVRRT1ZGTF9NQVNLOworCX0KKwlpZiAodmFsICYgSTQwRV9QRl9BVFFMRU5fQVRRQ1JJVF9NQVNLKSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVNRIENyaXRpY2FsIEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1BGX0FUUUxFTl9BVFFDUklUX01BU0s7CisJfQorCWlmIChvbGR2YWwgIT0gdmFsKQorCQl3cjMyKCZwZi0+aHcsIHBmLT5ody5hcS5hc3EubGVuLCB2YWwpOworCiAJZXZlbnQubXNnX3NpemUgPSBJNDBFX01BWF9BUV9CVUZfU0laRTsKIAlldmVudC5tc2dfYnVmID0ga3phbGxvYyhldmVudC5tc2dfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFldmVudC5tc2dfYnVmKQpAQCAtNTEyOCw3ICs1MzI1LDcgQEAKIAlpbnQgcmV0OwogCiAJLyogYnVpbGQgVlNJIHRoYXQgb3ducyB0aGlzIFZFQiwgdGVtcG9yYXJpbHkgYXR0YWNoZWQgdG8gYmFzZSBWRUIgKi8KLQlmb3IgKHYgPSAwOyB2IDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpcyAmJiAhY3RsX3ZzaTsgdisrKSB7CisJZm9yICh2ID0gMDsgdiA8IHBmLT5udW1fYWxsb2NfdnNpICYmICFjdGxfdnNpOyB2KyspIHsKIAkJaWYgKHBmLT52c2lbdl0gJiYKIAkJICAgIHBmLT52c2lbdl0tPnZlYl9pZHggPT0gdmViLT5pZHggJiYKIAkJICAgIHBmLT52c2lbdl0tPmZsYWdzICYgSTQwRV9WU0lfRkxBR19WRUJfT1dORVIpIHsKQEAgLTUxNTgsNyArNTM1NSw3IEBACiAJCWdvdG8gZW5kX3JlY29uc3RpdHV0ZTsKIAogCS8qIGNyZWF0ZSB0aGUgcmVtYWluaW5nIFZTSXMgYXR0YWNoZWQgdG8gdGhpcyBWRUIgKi8KLQlmb3IgKHYgPSAwOyB2IDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgdisrKSB7CisJZm9yICh2ID0gMDsgdiA8IHBmLT5udW1fYWxsb2NfdnNpOyB2KyspIHsKIAkJaWYgKCFwZi0+dnNpW3ZdIHx8IHBmLT52c2lbdl0gPT0gY3RsX3ZzaSkKIAkJCWNvbnRpbnVlOwogCkBAIC01MjI2LDkgKzU0MjMsNiBAQAogCQl9CiAJfSB3aGlsZSAoZXJyKTsKIAotCS8qIGluY3JlbWVudCBNU0ktWCBjb3VudCBiZWNhdXNlIGN1cnJlbnQgRlcgc2tpcHMgb25lICovCi0JcGYtPmh3LmZ1bmNfY2Fwcy5udW1fbXNpeF92ZWN0b3JzKys7Ci0KIAlpZiAoKChwZi0+aHcuYXEuZndfbWFqX3ZlciA9PSAyKSAmJiAocGYtPmh3LmFxLmZ3X21pbl92ZXIgPCAyMikpIHx8CiAJICAgIChwZi0+aHcuYXEuZndfbWFqX3ZlciA8IDIpKSB7CiAJCXBmLT5ody5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9ycysrOwpAQCAtNTI2NywxNSArNTQ2MSwxNCBAQAogc3RhdGljIHZvaWQgaTQwZV9mZGlyX3NiX3NldHVwKHN0cnVjdCBpNDBlX3BmICpwZikKIHsKIAlzdHJ1Y3QgaTQwZV92c2kgKnZzaTsKLQlib29sIG5ld192c2kgPSBmYWxzZTsKLQlpbnQgZXJyLCBpOworCWludCBpOwogCiAJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKIAkvKiBmaW5kIGV4aXN0aW5nIFZTSSBhbmQgc2VlIGlmIGl0IG5lZWRzIGNvbmZpZ3VyaW5nICovCiAJdnNpID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBmLT5udW1fYWxsb2NfdnNpOyBpKyspIHsKIAkJaWYgKHBmLT52c2lbaV0gJiYgcGYtPnZzaVtpXS0+dHlwZSA9PSBJNDBFX1ZTSV9GRElSKSB7CiAJCQl2c2kgPSBwZi0+dnNpW2ldOwogCQkJYnJlYWs7CkBAIC01Mjg4LDQ3ICs1NDgxLDEyIEBACiAJCQkJICAgICBwZi0+dnNpW3BmLT5sYW5fdnNpXS0+c2VpZCwgMCk7CiAJCWlmICghdnNpKSB7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkNvdWxkbid0IGNyZWF0ZSBGRGlyIFZTSVxuIik7Ci0JCQlnb3RvIGVycl92c2k7CisJCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOworCQkJcmV0dXJuOwogCQl9Ci0JCW5ld192c2kgPSB0cnVlOwogCX0KKwogCWk0MGVfdnNpX3NldHVwX2lycWhhbmRsZXIodnNpLCBpNDBlX2ZkaXJfY2xlYW5fcmluZyk7Ci0KLQllcnIgPSBpNDBlX3ZzaV9zZXR1cF90eF9yZXNvdXJjZXModnNpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZXR1cF90eDsKLQllcnIgPSBpNDBlX3ZzaV9zZXR1cF9yeF9yZXNvdXJjZXModnNpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZXR1cF9yeDsKLQotCWlmIChuZXdfdnNpKSB7Ci0JCWNoYXIgaW50X25hbWVbSUZOQU1TSVogKyA5XTsKLQkJZXJyID0gaTQwZV92c2lfY29uZmlndXJlKHZzaSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9zZXR1cF9yeDsKLQkJc25wcmludGYoaW50X25hbWUsIHNpemVvZihpbnRfbmFtZSkgLSAxLCAiJXMtZmRpciIsCi0JCQkgZGV2X2RyaXZlcl9zdHJpbmcoJnBmLT5wZGV2LT5kZXYpKTsKLQkJZXJyID0gaTQwZV92c2lfcmVxdWVzdF9pcnEodnNpLCBpbnRfbmFtZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9zZXR1cF9yeDsKLQkJZXJyID0gaTQwZV91cF9jb21wbGV0ZSh2c2kpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfdXBfY29tcGxldGU7Ci0JCWNsZWFyX2JpdChfX0k0MEVfTkVFRFNfUkVTVEFSVCwgJnZzaS0+c3RhdGUpOwotCX0KLQotCXJldHVybjsKLQotZXJyX3VwX2NvbXBsZXRlOgotCWk0MGVfZG93bih2c2kpOwotCWk0MGVfdnNpX2ZyZWVfaXJxKHZzaSk7Ci1lcnJfc2V0dXBfcng6Ci0JaTQwZV92c2lfZnJlZV9yeF9yZXNvdXJjZXModnNpKTsKLWVycl9zZXR1cF90eDoKLQlpNDBlX3ZzaV9mcmVlX3R4X3Jlc291cmNlcyh2c2kpOwotZXJyX3ZzaToKLQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOwotCWk0MGVfdnNpX2NsZWFyKHZzaSk7CiB9CiAKIC8qKgpAQCAtNTM0MCw3ICs1NDk4LDcgQEAKIAlpbnQgaTsKIAogCWk0MGVfZmRpcl9maWx0ZXJfZXhpdChwZik7Ci0JZm9yIChpID0gMDsgaSA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKSB7CiAJCWlmIChwZi0+dnNpW2ldICYmIHBmLT52c2lbaV0tPnR5cGUgPT0gSTQwRV9WU0lfRkRJUikgewogCQkJaTQwZV92c2lfcmVsZWFzZShwZi0+dnNpW2ldKTsKIAkJCWJyZWFrOwpAQCAtNTM1Nyw3ICs1NTE1LDcgQEAKIHN0YXRpYyBpbnQgaTQwZV9wcmVwX2Zvcl9yZXNldChzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKLQlpNDBlX3N0YXR1cyByZXQ7CisJaTQwZV9zdGF0dXMgcmV0ID0gMDsKIAl1MzIgdjsKIAogCWNsZWFyX2JpdChfX0k0MEVfUkVTRVRfSU5UUl9SRUNFSVZFRCwgJnBmLT5zdGF0ZSk7CkBAIC01MzY2LDEzICs1NTI0LDEwIEBACiAKIAlkZXZfZGJnKCZwZi0+cGRldi0+ZGV2LCAiVGVhcmluZyBkb3duIGludGVybmFsIHN3aXRjaCBmb3IgcmVzZXRcbiIpOwogCi0JaWYgKGk0MGVfY2hlY2tfYXNxX2FsaXZlKGh3KSkKLQkJaTQwZV92Y19ub3RpZnlfcmVzZXQocGYpOwotCiAJLyogcXVpZXNjZSB0aGUgVlNJcyBhbmQgdGhlaXIgcXVldWVzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IERPV04gKi8KIAlpNDBlX3BmX3F1aWVzY2VfYWxsX3ZzaShwZik7CiAKLQlmb3IgKHYgPSAwOyB2IDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgdisrKSB7CisJZm9yICh2ID0gMDsgdiA8IHBmLT5udW1fYWxsb2NfdnNpOyB2KyspIHsKIAkJaWYgKHBmLT52c2lbdl0pCiAJCQlwZi0+dnNpW3ZdLT5zZWlkID0gMDsKIAl9CkBAIC01MzgwLDIyICs1NTM1LDQwIEBACiAJaTQwZV9zaHV0ZG93bl9hZG1pbnEoJnBmLT5odyk7CiAKIAkvKiBjYWxsIHNodXRkb3duIEhNQyAqLwotCXJldCA9IGk0MGVfc2h1dGRvd25fbGFuX2htYyhodyk7Ci0JaWYgKHJldCkgewotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInNodXRkb3duX2xhbl9obWMgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJY2xlYXJfYml0KF9fSTQwRV9SRVNFVF9SRUNPVkVSWV9QRU5ESU5HLCAmcGYtPnN0YXRlKTsKKwlpZiAoaHctPmhtYy5obWNfb2JqKSB7CisJCXJldCA9IGk0MGVfc2h1dGRvd25fbGFuX2htYyhodyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZwZi0+cGRldi0+ZGV2LAorCQkJCSAic2h1dGRvd25fbGFuX2htYyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJY2xlYXJfYml0KF9fSTQwRV9SRVNFVF9SRUNPVkVSWV9QRU5ESU5HLCAmcGYtPnN0YXRlKTsKKwkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKioKKyAqIGk0MGVfc2VuZF92ZXJzaW9uIC0gdXBkYXRlIGZpcm13YXJlIHdpdGggZHJpdmVyIHZlcnNpb24KKyAqIEBwZjogUEYgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGk0MGVfc2VuZF92ZXJzaW9uKHN0cnVjdCBpNDBlX3BmICpwZikKK3sKKwlzdHJ1Y3QgaTQwZV9kcml2ZXJfdmVyc2lvbiBkdjsKKworCWR2Lm1ham9yX3ZlcnNpb24gPSBEUlZfVkVSU0lPTl9NQUpPUjsKKwlkdi5taW5vcl92ZXJzaW9uID0gRFJWX1ZFUlNJT05fTUlOT1I7CisJZHYuYnVpbGRfdmVyc2lvbiA9IERSVl9WRVJTSU9OX0JVSUxEOworCWR2LnN1YmJ1aWxkX3ZlcnNpb24gPSAwOworCXN0cm5jcHkoZHYuZHJpdmVyX3N0cmluZywgRFJWX1ZFUlNJT04sIHNpemVvZihkdi5kcml2ZXJfc3RyaW5nKSk7CisJaTQwZV9hcV9zZW5kX2RyaXZlcl92ZXJzaW9uKCZwZi0+aHcsICZkdiwgTlVMTCk7Cit9CisKKy8qKgogICogaTQwZV9yZXNldF9hbmRfcmVidWlsZCAtIHJlc2V0IGFuZCByZWJ1aWxkIHVzaW5nIGEgc2F2ZWQgY29uZmlnCiAgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiBAcmVpbml0OiBpZiB0aGUgTWFpbiBWU0kgbmVlZHMgdG8gcmUtaW5pdGlhbGl6ZWQuCiAgKiovCiBzdGF0aWMgdm9pZCBpNDBlX3Jlc2V0X2FuZF9yZWJ1aWxkKHN0cnVjdCBpNDBlX3BmICpwZiwgYm9vbCByZWluaXQpCiB7Ci0Jc3RydWN0IGk0MGVfZHJpdmVyX3ZlcnNpb24gZHY7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKIAlpNDBlX3N0YXR1cyByZXQ7CiAJdTMyIHY7CkBAIC01NDA1LDggKzU1NzgsMTAgQEAKIAkgKiBiZWNhdXNlIHRoZSByZXNldCB3aWxsIG1ha2UgdGhlbSBkaXNhcHBlYXIuCiAJICovCiAJcmV0ID0gaTQwZV9wZl9yZXNldChodyk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiUEYgcmVzZXQgZmFpbGVkLCAlZFxuIiwgcmV0KTsKKwkJZ290byBlbmRfY29yZV9yZXNldDsKKwl9CiAJcGYtPnBmcl9jb3VudCsrOwogCiAJaWYgKHRlc3RfYml0KF9fSTQwRV9ET1dOLCAmcGYtPnN0YXRlKSkKQEAgLTU0MjYsNiArNTYwMSw3IEBACiAJCWk0MGVfdmVyaWZ5X2VlcHJvbShwZik7CiAJfQogCisJaTQwZV9jbGVhcl9weGVfbW9kZShodyk7CiAJcmV0ID0gaTQwZV9nZXRfY2FwYWJpbGl0aWVzKHBmKTsKIAlpZiAocmV0KSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiaTQwZV9nZXRfY2FwYWJpbGl0aWVzIGZhaWxlZCwgJWRcbiIsCkBAIC01NTI2LDEzICs1NzAyLDcgQEAKIAl9CiAKIAkvKiB0ZWxsIHRoZSBmaXJtd2FyZSB0aGF0IHdlJ3JlIHN0YXJ0aW5nICovCi0JZHYubWFqb3JfdmVyc2lvbiA9IERSVl9WRVJTSU9OX01BSk9SOwotCWR2Lm1pbm9yX3ZlcnNpb24gPSBEUlZfVkVSU0lPTl9NSU5PUjsKLQlkdi5idWlsZF92ZXJzaW9uID0gRFJWX1ZFUlNJT05fQlVJTEQ7Ci0JZHYuc3ViYnVpbGRfdmVyc2lvbiA9IDA7Ci0JaTQwZV9hcV9zZW5kX2RyaXZlcl92ZXJzaW9uKCZwZi0+aHcsICZkdiwgTlVMTCk7Ci0KLQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInJlc2V0IGNvbXBsZXRlXG4iKTsKKwlpNDBlX3NlbmRfdmVyc2lvbihwZik7CiAKIGVuZF9jb3JlX3Jlc2V0OgogCWNsZWFyX2JpdChfX0k0MEVfUkVTRVRfUkVDT1ZFUllfUEVORElORywgJnBmLT5zdGF0ZSk7CkBAIC01NjQyLDcgKzU4MTIsNiBAQAogICoqLwogc3RhdGljIHZvaWQgaTQwZV9zeW5jX3Z4bGFuX2ZpbHRlcnNfc3VidGFzayhzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7Ci0JY29uc3QgaW50IHZ4bGFuX2hkcl9xd29yZHMgPSA0OwogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CiAJaTQwZV9zdGF0dXMgcmV0OwogCXU4IGZpbHRlcl9pbmRleDsKQEAgLTU2NjAsNyArNTgyOSw2IEBACiAJCQlwb3J0ID0gcGYtPnZ4bGFuX3BvcnRzW2ldOwogCQkJcmV0ID0gcG9ydCA/CiAJCQkgICAgICBpNDBlX2FxX2FkZF91ZHBfdHVubmVsKGh3LCBudG9ocyhwb3J0KSwKLQkJCQkJCSAgICAgdnhsYW5faGRyX3F3b3JkcywKIAkJCQkJCSAgICAgSTQwRV9BUUNfVFVOTkVMX1RZUEVfVlhMQU4sCiAJCQkJCQkgICAgICZmaWx0ZXJfaW5kZXgsIE5VTEwpCiAJCQkgICAgICA6IGk0MGVfYXFfZGVsX3VkcF90dW5uZWwoaHcsIGksIE5VTEwpOwpAQCAtNTgzOSwxNSArNjAwNywxNSBAQAogCSAqIGZpbmQgbmV4dCBlbXB0eSB2c2kgc2xvdCwgbG9vcGluZyBiYWNrIGFyb3VuZCBpZiBuZWNlc3NhcnkKIAkgKi8KIAlpID0gcGYtPm5leHRfdnNpOwotCXdoaWxlIChpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpcyAmJiBwZi0+dnNpW2ldKQorCXdoaWxlIChpIDwgcGYtPm51bV9hbGxvY192c2kgJiYgcGYtPnZzaVtpXSkKIAkJaSsrOwotCWlmIChpID49IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXMpIHsKKwlpZiAoaSA+PSBwZi0+bnVtX2FsbG9jX3ZzaSkgewogCQlpID0gMDsKIAkJd2hpbGUgKGkgPCBwZi0+bmV4dF92c2kgJiYgcGYtPnZzaVtpXSkKIAkJCWkrKzsKIAl9CiAKLQlpZiAoaSA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXMgJiYgIXBmLT52c2lbaV0pIHsKKwlpZiAoaSA8IHBmLT5udW1fYWxsb2NfdnNpICYmICFwZi0+dnNpW2ldKSB7CiAJCXZzaV9pZHggPSBpOyAgICAgICAgICAgICAvKiBGb3VuZCBvbmUhICovCiAJfSBlbHNlIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTU4NzAsNiArNjAzOCw3IEBACiAJdnNpLT5uZXRkZXZfcmVnaXN0ZXJlZCA9IGZhbHNlOwogCXZzaS0+d29ya19saW1pdCA9IEk0MEVfREVGQVVMVF9JUlFfV09SSzsKIAlJTklUX0xJU1RfSEVBRCgmdnNpLT5tYWNfZmlsdGVyX2xpc3QpOworCXZzaS0+aXJxc19yZWFkeSA9IGZhbHNlOwogCiAJcmV0ID0gaTQwZV9zZXRfbnVtX3JpbmdzX2luX3ZzaSh2c2kpOwogCWlmIChyZXQpCkBAIC01OTg3LDE0ICs2MTU2LDEyIEBACiAgKiovCiBzdGF0aWMgaW50IGk0MGVfYWxsb2NfcmluZ3Moc3RydWN0IGk0MGVfdnNpICp2c2kpCiB7CisJc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZywgKnJ4X3Jpbmc7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCWludCBpOwogCiAJLyogU2V0IGJhc2ljIHZhbHVlcyBpbiB0aGUgcmluZ3MgdG8gYmUgdXNlZCBsYXRlciBkdXJpbmcgb3BlbigpICovCiAJZm9yIChpID0gMDsgaSA8IHZzaS0+YWxsb2NfcXVldWVfcGFpcnM7IGkrKykgewotCQlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nOwotCQlzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nOwotCiAJCS8qIGFsbG9jYXRlIHNwYWNlIGZvciBib3RoIFR4IGFuZCBSeCBpbiBvbmUgc2hvdCAqLwogCQl0eF9yaW5nID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGk0MGVfcmluZykgKiAyLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0eF9yaW5nKQpAQCAtNjA1Miw4ICs2MjE5LDYgQEAKIAkJdmVjdG9ycyA9IDA7CiAJfQogCi0JcGYtPm51bV9tc2l4X2VudHJpZXMgPSB2ZWN0b3JzOwotCiAJcmV0dXJuIHZlY3RvcnM7CiB9CiAKQEAgLTYxMDcsNiArNjI3MiwxNiBAQAogCWZvciAoaSA9IDA7IGkgPCB2X2J1ZGdldDsgaSsrKQogCQlwZi0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAl2ZWMgPSBpNDBlX3Jlc2VydmVfbXNpeF92ZWN0b3JzKHBmLCB2X2J1ZGdldCk7CisKKwlpZiAodmVjICE9IHZfYnVkZ2V0KSB7CisJCS8qIElmIHdlIGhhdmUgbGltaXRlZCByZXNvdXJjZXMsIHdlIHdpbGwgc3RhcnQgd2l0aCBubyB2ZWN0b3JzCisJCSAqIGZvciB0aGUgc3BlY2lhbCBmZWF0dXJlcyBhbmQgdGhlbiBhbGxvY2F0ZSB2ZWN0b3JzIHRvIHNvbWUKKwkJICogb2YgdGhlc2UgZmVhdHVyZXMgYmFzZWQgb24gdGhlIHBvbGljeSBhbmQgYXQgdGhlIGVuZCBkaXNhYmxlCisJCSAqIHRoZSBmZWF0dXJlcyB0aGF0IGRpZCBub3QgZ2V0IGFueSB2ZWN0b3JzLgorCQkgKi8KKwkJcGYtPm51bV92bWRxX21zaXggPSAwOworCX0KKwogCWlmICh2ZWMgPCBJNDBFX01JTl9NU0lYKSB7CiAJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX01TSVhfRU5BQkxFRDsKIAkJa2ZyZWUocGYtPm1zaXhfZW50cmllcyk7CkBAIC02MTE1LDI3ICs2MjkwLDI1IEBACiAKIAl9IGVsc2UgaWYgKHZlYyA9PSBJNDBFX01JTl9NU0lYKSB7CiAJCS8qIEFkanVzdCBmb3IgbWluaW1hbCBNU0lYIHVzZSAqLwotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkZlYXR1cmVzIGRpc2FibGVkLCBub3QgZW5vdWdoIE1TSS1YIHZlY3RvcnNcbiIpOwotCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19WTURRX0VOQUJMRUQ7CiAJCXBmLT5udW1fdm1kcV92c2lzID0gMDsKIAkJcGYtPm51bV92bWRxX3FwcyA9IDA7Ci0JCXBmLT5udW1fdm1kcV9tc2l4ID0gMDsKIAkJcGYtPm51bV9sYW5fcXBzID0gMTsKIAkJcGYtPm51bV9sYW5fbXNpeCA9IDE7CiAKIAl9IGVsc2UgaWYgKHZlYyAhPSB2X2J1ZGdldCkgeworCQkvKiByZXNlcnZlIHRoZSBtaXNjIHZlY3RvciAqLworCQl2ZWMtLTsKKwogCQkvKiBTY2FsZSB2ZWN0b3IgdXNhZ2UgZG93biAqLwogCQlwZi0+bnVtX3ZtZHFfbXNpeCA9IDE7ICAgIC8qIGZvcmNlIFZNRHFzIHRvIG9ubHkgb25lIHZlY3RvciAqLwotCQl2ZWMtLTsgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmUgdGhlIG1pc2MgdmVjdG9yICovCisJCXBmLT5udW1fdm1kcV92c2lzID0gMTsKIAogCQkvKiBwYXJ0aXRpb24gb3V0IHRoZSByZW1haW5pbmcgdmVjdG9ycyAqLwogCQlzd2l0Y2ggKHZlYykgewogCQljYXNlIDI6Ci0JCQlwZi0+bnVtX3ZtZHFfdnNpcyA9IDE7CiAJCQlwZi0+bnVtX2xhbl9tc2l4ID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDM6Ci0JCQlwZi0+bnVtX3ZtZHFfdnNpcyA9IDE7CiAJCQlwZi0+bnVtX2xhbl9tc2l4ID0gMjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNjE0Nyw2ICs2MzIwLDExIEBACiAJCX0KIAl9CiAKKwlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19WTURRX0VOQUJMRUQpICYmCisJICAgIChwZi0+bnVtX3ZtZHFfbXNpeCA9PSAwKSkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIlZNRHEgZGlzYWJsZWQsIG5vdCBlbm91Z2ggTVNJLVggdmVjdG9yc1xuIik7CisJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX1ZNRFFfRU5BQkxFRDsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjE3MSw3ICs2MzQ5LDcgQEAKIAljcHVtYXNrX3NldF9jcHUodl9pZHgsICZxX3ZlY3Rvci0+YWZmaW5pdHlfbWFzayk7CiAJaWYgKHZzaS0+bmV0ZGV2KQogCQluZXRpZl9uYXBpX2FkZCh2c2ktPm5ldGRldiwgJnFfdmVjdG9yLT5uYXBpLAotCQkJICAgICAgIGk0MGVfbmFwaV9wb2xsLCB2c2ktPndvcmtfbGltaXQpOworCQkJICAgICAgIGk0MGVfbmFwaV9wb2xsLCBOQVBJX1BPTExfV0VJR0hUKTsKIAogCXFfdmVjdG9yLT5yeC5sYXRlbmN5X3JhbmdlID0gSTQwRV9MT1dfTEFURU5DWTsKIAlxX3ZlY3Rvci0+dHgubGF0ZW5jeV9yYW5nZSA9IEk0MEVfTE9XX0xBVEVOQ1k7CkBAIC02MjMxLDcgKzY0MDksNyBAQAogCQlpZiAoZXJyKSB7CiAJCQlwZi0+ZmxhZ3MgJj0gfihJNDBFX0ZMQUdfTVNJWF9FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX1JTU19FTkFCTEVECXwKLQkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKKwkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9DQVBBQkxFCXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX1NSSU9WX0VOQUJMRUQJfAogCQkJCSAgICAgICBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRAl8CiAJCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRAl8CkBAIC02MzY0LDcgKzY1NDIsNiBAQAogCQlyZXR1cm4gMDsKIAogCXF1ZXVlX2NvdW50ID0gbWluX3QoaW50LCBxdWV1ZV9jb3VudCwgcGYtPnJzc19zaXplX21heCk7Ci0JcXVldWVfY291bnQgPSByb3VuZGRvd25fcG93X29mX3R3byhxdWV1ZV9jb3VudCk7CiAKIAlpZiAocXVldWVfY291bnQgIT0gcGYtPnJzc19zaXplKSB7CiAJCWk0MGVfcHJlcF9mb3JfcmVzZXQocGYpOwpAQCAtNjQwNyw2ICs2NTg0LDEwIEBACiAJCSAgICBJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEICAgIHwKIAkJICAgIEk0MEVfRkxBR19SWF8xQlVGX0VOQUJMRUQ7CiAKKwkvKiBTZXQgZGVmYXVsdCBJVFIgKi8KKwlwZi0+cnhfaXRyX2RlZmF1bHQgPSBJNDBFX0lUUl9EWU5BTUlDIHwgSTQwRV9JVFJfUlhfREVGOworCXBmLT50eF9pdHJfZGVmYXVsdCA9IEk0MEVfSVRSX0RZTkFNSUMgfCBJNDBFX0lUUl9UWF9ERUY7CisKIAkvKiBEZXBlbmRpbmcgb24gUEYgY29uZmlndXJhdGlvbnMsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFJTUwogCSAqIG1heGltdW0gbWlnaHQgZW5kIHVwIGxhcmdlciB0aGFuIHRoZSBhdmFpbGFibGUgcXVldWVzCiAJICovCkBAIC02NDE2LDcgKzY1OTcsNiBAQAogCWlmIChwZi0+aHcuZnVuY19jYXBzLnJzcykgewogCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX1JTU19FTkFCTEVEOwogCQlwZi0+cnNzX3NpemUgPSBtaW5fdChpbnQsIHBmLT5yc3Nfc2l6ZV9tYXgsIG51bV9vbmxpbmVfY3B1cygpKTsKLQkJcGYtPnJzc19zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28ocGYtPnJzc19zaXplKTsKIAl9IGVsc2UgewogCQlwZi0+cnNzX3NpemUgPSAxOwogCX0KQEAgLTY0MzIsOCArNjYxMiwxMiBAQAogCSAgICAocGYtPmh3LmZ1bmNfY2Fwcy5mZF9maWx0ZXJzX2Jlc3RfZWZmb3J0ID4gMCkpIHsKIAkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJcGYtPmF0cl9zYW1wbGVfcmF0ZSA9IEk0MEVfREVGQVVMVF9BVFJfU0FNUExFX1JBVEU7CisJCS8qIFNldHVwIGEgY291bnRlciBmb3IgZmRfYXRyIHBlciBwZiAqLworCQlwZi0+ZmRfYXRyX2NudF9pZHggPSBJNDBFX0ZEX0FUUl9TVEFUX0lEWChwZi0+aHcucGZfaWQpOwogCQlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTUZQX0VOQUJMRUQpKSB7CiAJCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQ7CisJCQkvKiBTZXR1cCBhIGNvdW50ZXIgZm9yIGZkX3NiIHBlciBwZiAqLworCQkJcGYtPmZkX3NiX2NudF9pZHggPSBJNDBFX0ZEX1NCX1NUQVRfSURYKHBmLT5ody5wZl9pZCk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKIAkJCQkgIkZsb3cgRGlyZWN0b3IgU2lkZWJhbmQgbW9kZSBEaXNhYmxlZCBpbiBNRlAgbW9kZVxuIik7CkBAIC02NjQ5LDYgKzY4MzMsOTYgQEAKIH0KIAogI2VuZGlmCisjaWZkZWYgSEFWRV9GREJfT1BTCisjaWZkZWYgVVNFX0NPTlNUX0RFVl9VQ19DSEFSCitzdGF0aWMgaW50IGk0MGVfbmRvX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCisJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJICAgIHUxNiBmbGFncykKKyNlbHNlCitzdGF0aWMgaW50IGk0MGVfbmRvX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sCisJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJICAgIHUxNiBmbGFncykKKyNlbmRpZgoreworCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGk0MGVfcGYgKnBmID0gbnAtPnZzaS0+YmFjazsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19TUklPVl9FTkFCTEVEKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogSGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhZ2luZyBhZGRyZXNzZXMgc28gaWYgYQorCSAqIG5kbV9zdGF0ZSBpcyBnaXZlbiBvbmx5IGFsbG93IHBlcm1hbmVudCBhZGRyZXNzZXMKKwkgKi8KKwlpZiAobmRtLT5uZG1fc3RhdGUgJiYgIShuZG0tPm5kbV9zdGF0ZSAmIE5VRF9QRVJNQU5FTlQpKSB7CisJCW5ldGRldl9pbmZvKGRldiwgIkZEQiBvbmx5IHN1cHBvcnRzIHN0YXRpYyBhZGRyZXNzZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaXNfdW5pY2FzdF9ldGhlcl9hZGRyKGFkZHIpIHx8IGlzX2xpbmtfbG9jYWxfZXRoZXJfYWRkcihhZGRyKSkKKwkJZXJyID0gZGV2X3VjX2FkZF9leGNsKGRldiwgYWRkcik7CisJZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkcikpCisJCWVyciA9IGRldl9tY19hZGRfZXhjbChkZXYsIGFkZHIpOworCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKworCS8qIE9ubHkgcmV0dXJuIGR1cGxpY2F0ZSBlcnJvcnMgaWYgTkxNX0ZfRVhDTCBpcyBzZXQgKi8KKwlpZiAoZXJyID09IC1FRVhJU1QgJiYgIShmbGFncyAmIE5MTV9GX0VYQ0wpKQorCQllcnIgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworI2lmbmRlZiBVU0VfREVGQVVMVF9GREJfREVMX0RVTVAKKyNpZmRlZiBVU0VfQ09OU1RfREVWX1VDX0NIQVIKK3N0YXRpYyBpbnQgaTQwZV9uZG9fZmRiX2RlbChzdHJ1Y3QgbmRtc2cgKm5kbSwKKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCisjZWxzZQorc3RhdGljIGludCBpNDBlX25kb19mZGJfZGVsKHN0cnVjdCBuZG1zZyAqbmRtLAorCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgdW5zaWduZWQgY2hhciAqYWRkcikKKyNlbmRpZgoreworCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGk0MGVfcGYgKnBmID0gbnAtPnZzaS0+YmFjazsKKwlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CisKKwlpZiAobmRtLT5uZG1fc3RhdGUgJiBOVURfUEVSTUFORU5UKSB7CisJCW5ldGRldl9pbmZvKGRldiwgIkZEQiBvbmx5IHN1cHBvcnRzIHN0YXRpYyBhZGRyZXNzZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX1NSSU9WX0VOQUJMRUQpIHsKKwkJaWYgKGlzX3VuaWNhc3RfZXRoZXJfYWRkcihhZGRyKSkKKwkJCWVyciA9IGRldl91Y19kZWwoZGV2LCBhZGRyKTsKKwkJZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkcikpCisJCQllcnIgPSBkZXZfbWNfZGVsKGRldiwgYWRkcik7CisJCWVsc2UKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpNDBlX25kb19mZGJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIGludCBpZHgpCit7CisJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBucC0+dnNpLT5iYWNrOworCisJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19TUklPVl9FTkFCTEVEKQorCQlpZHggPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIGNiLCBkZXYsIGlkeCk7CisKKwlyZXR1cm4gaWR4OworfQorCisjZW5kaWYgLyogVVNFX0RFRkFVTFRfRkRCX0RFTF9EVU1QICovCisjZW5kaWYgLyogSEFWRV9GREJfT1BTICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGk0MGVfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaTQwZV9vcGVuLAogCS5uZG9fc3RvcAkJPSBpNDBlX2Nsb3NlLApAQCAtNjY2OSwxMyArNjk0MywyMSBAQAogCS5uZG9fc2V0X2ZlYXR1cmVzCT0gaTQwZV9zZXRfZmVhdHVyZXMsCiAJLm5kb19zZXRfdmZfbWFjCQk9IGk0MGVfbmRvX3NldF92Zl9tYWMsCiAJLm5kb19zZXRfdmZfdmxhbgk9IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4sCi0JLm5kb19zZXRfdmZfdHhfcmF0ZQk9IGk0MGVfbmRvX3NldF92Zl9idywKKwkubmRvX3NldF92Zl9yYXRlCT0gaTQwZV9uZG9fc2V0X3ZmX2J3LAogCS5uZG9fZ2V0X3ZmX2NvbmZpZwk9IGk0MGVfbmRvX2dldF92Zl9jb25maWcsCiAJLm5kb19zZXRfdmZfbGlua19zdGF0ZQk9IGk0MGVfbmRvX3NldF92Zl9saW5rX3N0YXRlLAorCS5uZG9fc2V0X3ZmX3Nwb29mY2hrCT0gaTQwZV9uZG9fc2V0X3ZmX3Nwb29mY2ssCiAjaWZkZWYgQ09ORklHX0k0MEVfVlhMQU4KIAkubmRvX2FkZF92eGxhbl9wb3J0CT0gaTQwZV9hZGRfdnhsYW5fcG9ydCwKIAkubmRvX2RlbF92eGxhbl9wb3J0CT0gaTQwZV9kZWxfdnhsYW5fcG9ydCwKICNlbmRpZgorI2lmZGVmIEhBVkVfRkRCX09QUworCS5uZG9fZmRiX2FkZAkJPSBpNDBlX25kb19mZGJfYWRkLAorI2lmbmRlZiBVU0VfREVGQVVMVF9GREJfREVMX0RVTVAKKwkubmRvX2ZkYl9kZWwJCT0gaTQwZV9uZG9fZmRiX2RlbCwKKwkubmRvX2ZkYl9kdW1wCQk9IGk0MGVfbmRvX2ZkYl9kdW1wLAorI2VuZGlmCisjZW5kaWYKIH07CiAKIC8qKgpAQCAtNjcyMCwxNiArNzAwMiwyNiBAQAogCQkJICAgTkVUSUZfRl9UU09fRUNOCSAgICAgICB8CiAJCQkgICBORVRJRl9GX1RTTzYJCSAgICAgICB8CiAJCQkgICBORVRJRl9GX1JYQ1NVTQkgICAgICAgfAotCQkJICAgTkVUSUZfRl9OVFVQTEUJICAgICAgIHwKIAkJCSAgIE5FVElGX0ZfUlhIQVNICSAgICAgICB8CiAJCQkgICAwOwogCisJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX01GUF9FTkFCTEVEKSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX05UVVBMRTsKKwogCS8qIGNvcHkgbmV0ZGV2IGZlYXR1cmVzIGludG8gbGlzdCBvZiB1c2VyIHNlbGVjdGFibGUgZmVhdHVyZXMgKi8KIAluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IG5ldGRldi0+ZmVhdHVyZXM7CiAKIAlpZiAodnNpLT50eXBlID09IEk0MEVfVlNJX01BSU4pIHsKIAkJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGYtPnBkZXYtPmRldik7Ci0JCW1lbWNweShtYWNfYWRkciwgaHctPm1hYy5wZXJtX2FkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KG1hY19hZGRyLCBody0+bWFjLnBlcm1fYWRkcik7CisJCS8qIFRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzIGFyZSBuZWNlc3NhcnkgdG8gcHJldmVudCByZWNlcHRpb24KKwkJICogb2YgdGFnZ2VkIHBhY2tldHMgLSBieSBkZWZhdWx0IHRoZSBOVk0gbG9hZHMgYSBNQUMtVkxBTgorCQkgKiBmaWx0ZXIgdGhhdCB3aWxsIGFjY2VwdCBhbnkgdGFnZ2VkIHBhY2tldC4gIFRoaXMgaXMgdG8KKwkJICogcHJldmVudCB0aGF0IGR1cmluZyBub3JtYWwgb3BlcmF0aW9ucyB1bnRpbCBhIHNwZWNpZmljCisJCSAqIFZMQU4gdGFnIGZpbHRlciBoYXMgYmVlbiBzZXQuCisJCSAqLworCQlpNDBlX3JtX2RlZmF1bHRfbWFjX2ZpbHRlcih2c2ksIG1hY19hZGRyKTsKKwkJaTQwZV9hZGRfZmlsdGVyKHZzaSwgbWFjX2FkZHIsIEk0MEVfVkxBTl9BTlksIGZhbHNlLCB0cnVlKTsKIAl9IGVsc2UgewogCQkvKiByZWxhdGUgdGhlIFZTSV9WTURRIG5hbWUgdG8gdGhlIFZTSV9NQUlOIG5hbWUgKi8KIAkJc25wcmludGYobmV0ZGV2LT5uYW1lLCBJRk5BTVNJWiwgIiVzdiUlZCIsCkBAIC02NzM5LDggKzcwMzEsOCBAQAogCX0KIAlpNDBlX2FkZF9maWx0ZXIodnNpLCBicmRjYXN0LCBJNDBFX1ZMQU5fQU5ZLCBmYWxzZSwgZmFsc2UpOwogCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShuZXRkZXYtPmRldl9hZGRyLCBtYWNfYWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+cGVybV9hZGRyLCBtYWNfYWRkcik7CiAJLyogdmxhbiBnZXRzIHNhbWUgZmVhdHVyZXMgKGV4Y2VwdCB2bGFuIG9mZmxvYWQpCiAJICogYWZ0ZXIgYW55IHR3ZWFrcyBmb3Igc3BlY2lmaWMgVlNJIHR5cGVzCiAJICovCkBAIC02NzcyLDcgKzcwNjQsNiBAQAogCQlyZXR1cm47CiAKIAlpNDBlX2FxX2RlbGV0ZV9lbGVtZW50KCZ2c2ktPmJhY2stPmh3LCB2c2ktPnNlaWQsIE5VTEwpOwotCXJldHVybjsKIH0KIAogLyoqCkBAIC02ODk4LDYgKzcxODksMTMgQEAKIAogCQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgfD0gY3B1X3RvX2xlMTYoSTQwRV9BUV9WU0lfUFJPUF9WTEFOX1ZBTElEKTsKIAkJY3R4dC5pbmZvLnBvcnRfdmxhbl9mbGFncyB8PSBJNDBFX0FRX1ZTSV9QVkxBTl9NT0RFX0FMTDsKKwkJaWYgKHBmLT52Zlt2c2ktPnZmX2lkXS5zcG9vZmNoaykgeworCQkJY3R4dC5pbmZvLnZhbGlkX3NlY3Rpb25zIHw9CisJCQkJY3B1X3RvX2xlMTYoSTQwRV9BUV9WU0lfUFJPUF9TRUNVUklUWV9WQUxJRCk7CisJCQljdHh0LmluZm8uc2VjX2ZsYWdzIHw9CisJCQkJKEk0MEVfQVFfVlNJX1NFQ19GTEFHX0VOQUJMRV9WTEFOX0NISyB8CisJCQkJIEk0MEVfQVFfVlNJX1NFQ19GTEFHX0VOQUJMRV9NQUNfQ0hLKTsKKwkJfQogCQkvKiBTZXR1cCB0aGUgVlNJIHR4L3J4IHF1ZXVlIG1hcCBmb3IgVEMwIG9ubHkgZm9yIG5vdyAqLwogCQlpNDBlX3ZzaV9zZXR1cF9xdWV1ZV9tYXAodnNpLCAmY3R4dCwgZW5hYmxlZF90YywgdHJ1ZSk7CiAJCWJyZWFrOwpAQCAtNjk4MiwxMSArNzI4MCw3IEBACiAJCQkJdW5yZWdpc3Rlcl9uZXRkZXYodnNpLT5uZXRkZXYpOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KF9fSTQwRV9ET1dOLCAmdnNpLT5zdGF0ZSkpCi0JCQkJaTQwZV9kb3duKHZzaSk7Ci0JCQlpNDBlX3ZzaV9mcmVlX2lycSh2c2kpOwotCQkJaTQwZV92c2lfZnJlZV90eF9yZXNvdXJjZXModnNpKTsKLQkJCWk0MGVfdnNpX2ZyZWVfcnhfcmVzb3VyY2VzKHZzaSk7CisJCQlpNDBlX3ZzaV9jbG9zZSh2c2kpOwogCQl9CiAJCWk0MGVfdnNpX2Rpc2FibGVfaXJxKHZzaSk7CiAJfQpAQCAtNzAxMyw3ICs3MzA3LDcgQEAKIAkgKiB0aGUgb3JwaGFuIFZFQnMgeWV0LiAgV2UnbGwgd2FpdCBmb3IgYW4gZXhwbGljaXQgcmVtb3ZlIHJlcXVlc3QKIAkgKiBmcm9tIHVwIHRoZSBuZXR3b3JrIHN0YWNrLgogCSAqLwotCWZvciAobiA9IDAsIGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKSB7CisJZm9yIChuID0gMCwgaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKSB7CiAJCWlmIChwZi0+dnNpW2ldICYmCiAJCSAgICBwZi0+dnNpW2ldLT51cGxpbmtfc2VpZCA9PSB1cGxpbmtfc2VpZCAmJgogCQkgICAgKHBmLT52c2lbaV0tPmZsYWdzICYgSTQwRV9WU0lfRkxBR19WRUJfT1dORVIpID09IDApIHsKQEAgLTcxOTIsNyArNzQ4Niw3IEBACiAKIAlpZiAoIXZlYiAmJiB1cGxpbmtfc2VpZCAhPSBwZi0+bWFjX3NlaWQpIHsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKSB7CiAJCQlpZiAocGYtPnZzaVtpXSAmJiBwZi0+dnNpW2ldLT5zZWlkID09IHVwbGlua19zZWlkKSB7CiAJCQkJdnNpID0gcGYtPnZzaVtpXTsKIAkJCQlicmVhazsKQEAgLTc0MzUsNyArNzcyOSw3IEBACiAJICogTk9URTogUmVtb3ZpbmcgdGhlIGxhc3QgVlNJIG9uIGEgVkVCIGhhcyB0aGUgU0lERSBFRkZFQ1Qgb2YgcmVtb3ZpbmcKIAkgKiAgICAgICB0aGUgVkVCIGl0c2VsZiwgc28gZG9uJ3QgdXNlICgqYnJhbmNoKSBhZnRlciB0aGlzIGxvb3AuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IHBmLT5ody5mdW5jX2NhcHMubnVtX3ZzaXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKSB7CiAJCWlmICghcGYtPnZzaVtpXSkKIAkJCWNvbnRpbnVlOwogCQlpZiAocGYtPnZzaVtpXS0+dXBsaW5rX3NlaWQgPT0gYnJhbmNoX3NlaWQgJiYKQEAgLTc0ODcsNyArNzc4MSw3IEBACiAJcGYgPSB2ZWItPnBmOwogCiAJLyogZmluZCB0aGUgcmVtYWluaW5nIFZTSSBhbmQgY2hlY2sgZm9yIGV4dHJhcyAqLwotCWZvciAoaSA9IDA7IGkgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcGYtPm51bV9hbGxvY192c2k7IGkrKykgewogCQlpZiAocGYtPnZzaVtpXSAmJiBwZi0+dnNpW2ldLT51cGxpbmtfc2VpZCA9PSB2ZWItPnNlaWQpIHsKIAkJCW4rKzsKIAkJCXZzaSA9IHBmLT52c2lbaV07CkBAIC03NTE2LDggKzc4MTAsNiBAQAogCiAJaTQwZV9hcV9kZWxldGVfZWxlbWVudCgmcGYtPmh3LCB2ZWItPnNlaWQsIE5VTEwpOwogCWk0MGVfdmViX2NsZWFyKHZlYik7Ci0KLQlyZXR1cm47CiB9CiAKIC8qKgpAQCAtNzYwMSwxMCArNzg5MywxMCBAQAogCX0KIAogCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBzdWNoIGEgdnNpIGFuZCB1cGxpbmsgKi8KLQlmb3IgKHZzaV9pZHggPSAwOyB2c2lfaWR4IDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgdnNpX2lkeCsrKQorCWZvciAodnNpX2lkeCA9IDA7IHZzaV9pZHggPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdnNpX2lkeCsrKQogCQlpZiAocGYtPnZzaVt2c2lfaWR4XSAmJiBwZi0+dnNpW3ZzaV9pZHhdLT5zZWlkID09IHZzaV9zZWlkKQogCQkJYnJlYWs7Ci0JaWYgKHZzaV9pZHggPj0gcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpcyAmJiB2c2lfc2VpZCAhPSAwKSB7CisJaWYgKHZzaV9pZHggPj0gcGYtPm51bV9hbGxvY192c2kgJiYgdnNpX3NlaWQgIT0gMCkgewogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInZzaSBzZWlkICVkIG5vdCBmb3VuZFxuIiwKIAkJCSB2c2lfc2VpZCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNzYzOSw2ICs3OTMxLDggQEAKIAlyZXQgPSBpNDBlX2FkZF92ZWIodmViLCBwZi0+dnNpW3ZzaV9pZHhdKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl92ZWI7CisJaWYgKHZzaV9pZHggPT0gcGYtPmxhbl92c2kpCisJCXBmLT5sYW5fdmViID0gdmViLT5pZHg7CiAKIAlyZXR1cm4gdmViOwogCkBAIC03Nzc0LDE1ICs4MDY4LDYgQEAKIAkJCQkgImhlYWRlcjogJWQgcmVwb3J0ZWQgJWQgdG90YWxcbiIsCiAJCQkJIG51bV9yZXBvcnRlZCwgbnVtX3RvdGFsKTsKIAotCQlpZiAobnVtX3JlcG9ydGVkKSB7Ci0JCQlpbnQgc3ogPSBzaXplb2YoKnN3X2NvbmZpZykgKiBudW1fcmVwb3J0ZWQ7Ci0KLQkJCWtmcmVlKHBmLT5zd19jb25maWcpOwotCQkJcGYtPnN3X2NvbmZpZyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCQkJaWYgKHBmLT5zd19jb25maWcpCi0JCQkJbWVtY3B5KHBmLT5zd19jb25maWcsIHN3X2NvbmZpZywgc3opOwotCQl9Ci0KIAkJZm9yIChpID0gMDsgaSA8IG51bV9yZXBvcnRlZDsgaSsrKSB7CiAJCQlzdHJ1Y3QgaTQwZV9hcWNfc3dpdGNoX2NvbmZpZ19lbGVtZW50X3Jlc3AgKmVsZSA9CiAJCQkJJnN3X2NvbmZpZy0+ZWxlbWVudFtpXTsKQEAgLTc5NDksOSArODIzNCw3IEBACiAJcXVldWVzX2xlZnQgPSBwZi0+aHcuZnVuY19jYXBzLm51bV90eF9xcDsKIAogCWlmICgocXVldWVzX2xlZnQgPT0gMSkgfHwKLQkgICAgIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEKSB8fAotCSAgICAhKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfUlNTX0VOQUJMRUQgfCBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8Ci0JCQkgICBJNDBFX0ZMQUdfRENCX0VOQUJMRUQpKSkgeworCSAgICAhKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NU0lYX0VOQUJMRUQpKSB7CiAJCS8qIG9uZSBxcCBmb3IgUEYsIG5vIHF1ZXVlcyBmb3IgYW55dGhpbmcgZWxzZSAqLwogCQlxdWV1ZXNfbGVmdCA9IDA7CiAJCXBmLT5yc3Nfc2l6ZSA9IHBmLT5udW1fbGFuX3FwcyA9IDE7CkBAIC03OTYwLDE0ICs4MjQzLDI3IEBACiAJCXBmLT5mbGFncyAmPSB+KEk0MEVfRkxBR19SU1NfRU5BQkxFRAl8CiAJCQkgICAgICAgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQJfAogCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRAl8Ci0JCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKKwkJCSAgICAgICBJNDBFX0ZMQUdfRENCX0NBUEFCTEUJfAogCQkJICAgICAgIEk0MEVfRkxBR19TUklPVl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfVk1EUV9FTkFCTEVEKTsKKwl9IGVsc2UgaWYgKCEocGYtPmZsYWdzICYgKEk0MEVfRkxBR19SU1NfRU5BQkxFRCB8CisJCQkJICBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8CisJCQkJICBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQgfAorCQkJCSAgSTQwRV9GTEFHX0RDQl9DQVBBQkxFKSkpIHsKKwkJLyogb25lIHFwIGZvciBQRiAqLworCQlwZi0+cnNzX3NpemUgPSBwZi0+bnVtX2xhbl9xcHMgPSAxOworCQlxdWV1ZXNfbGVmdCAtPSBwZi0+bnVtX2xhbl9xcHM7CisKKwkJcGYtPmZsYWdzICY9IH4oSTQwRV9GTEFHX1JTU19FTkFCTEVECXwKKwkJCSAgICAgICBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRAl8CisJCQkgICAgICAgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVECXwKKwkJCSAgICAgICBJNDBFX0ZMQUdfRENCX0VOQUJMRUQJfAorCQkJICAgICAgIEk0MEVfRkxBR19WTURRX0VOQUJMRUQpOwogCX0gZWxzZSB7CiAJCS8qIE5vdCBlbm91Z2ggcXVldWVzIGZvciBhbGwgVENzICovCi0JCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKSAmJgorCQlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSkgJiYKIAkJICAgIChxdWV1ZXNfbGVmdCA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1MpKSB7Ci0JCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfRU5BQkxFRDsKKwkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9DQVBBQkxFOwogCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJub3QgZW5vdWdoIHF1ZXVlcyBmb3IgRENCLiBEQ0IgaXMgZGlzYWJsZWQuXG4iKTsKIAkJfQogCQlwZi0+bnVtX2xhbl9xcHMgPSBwZi0+cnNzX3NpemVfbWF4OwpAQCAtNzk5OCw3ICs4Mjk0LDYgQEAKIAl9CiAKIAlwZi0+cXVldWVzX2xlZnQgPSBxdWV1ZXNfbGVmdDsKLQlyZXR1cm47CiB9CiAKIC8qKgpAQCAtODA1NSwxMiArODM1MCwxMyBAQAogCiAJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19SU1NfRU5BQkxFRCkKIAkJYnVmICs9IHNwcmludGYoYnVmLCAiUlNTICIpOwotCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkZEaXIgIik7CiAJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkKLQkJYnVmICs9IHNwcmludGYoYnVmLCAiQVRSICIpOwotCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkKKwkJYnVmICs9IHNwcmludGYoYnVmLCAiRkRfQVRSICIpOworCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgeworCQlidWYgKz0gc3ByaW50ZihidWYsICJGRF9TQiAiKTsKIAkJYnVmICs9IHNwcmludGYoYnVmLCAiTlRVUExFICIpOwotCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0VOQUJMRUQpCisJfQorCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0NBUEFCTEUpCiAJCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkRDQiAiKTsKIAlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX1BUUCkKIAkJYnVmICs9IHNwcmludGYoYnVmLCAiUFRQICIpOwpAQCAtODA4MywxMyArODM3OSwxMyBAQAogICoqLwogc3RhdGljIGludCBpNDBlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0cnVjdCBpNDBlX2RyaXZlcl92ZXJzaW9uIGR2OwogCXN0cnVjdCBpNDBlX3BmICpwZjsKIAlzdHJ1Y3QgaTQwZV9odyAqaHc7CiAJc3RhdGljIHUxNiBwZnNfZm91bmQ7CiAJdTE2IGxpbmtfc3RhdHVzOwogCWludCBlcnIgPSAwOwogCXUzMiBsZW47CisJdTMyIGk7CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldik7CiAJaWYgKGVycikKQEAgLTgyMDEsNiArODQ5NywxMCBAQAogCiAJaTQwZV92ZXJpZnlfZWVwcm9tKHBmKTsKIAorCS8qIFJldiAwIGhhcmR3YXJlIHdhcyBuZXZlciBwcm9kdWN0aXplZCAqLworCWlmIChody0+cmV2aXNpb25faWQgPCAxKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiVGhpcyBkZXZpY2UgaXMgYSBwcmUtcHJvZHVjdGlvbiBhZGFwdGVyL0xPTS4gUGxlYXNlIGJlIGF3YXJlIHRoZXJlIG1heSBiZSBpc3N1ZXMgd2l0aCB5b3VyIGhhcmR3YXJlLiBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBwcm9ibGVtcyBwbGVhc2UgY29udGFjdCB5b3VyIEludGVsIG9yIGhhcmR3YXJlIHJlcHJlc2VudGF0aXZlIHdobyBwcm92aWRlZCB5b3Ugd2l0aCB0aGlzIGhhcmR3YXJlLlxuIik7CisKIAlpNDBlX2NsZWFyX3B4ZV9tb2RlKGh3KTsKIAllcnIgPSBpNDBlX2dldF9jYXBhYmlsaXRpZXMocGYpOwogCWlmIChlcnIpCkBAIC04MjM0LDcgKzg1MzQsNyBAQAogCQlnb3RvIGVycl9tYWNfYWRkcjsKIAl9CiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGh3LT5tYWMuYWRkcik7Ci0JbWVtY3B5KGh3LT5tYWMucGVybV9hZGRyLCBody0+bWFjLmFkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoaHctPm1hYy5wZXJtX2FkZHIsIGh3LT5tYWMuYWRkcik7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgcGYpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtODI0Miw4ICs4NTQyLDggQEAKIAllcnIgPSBpNDBlX2luaXRfcGZfZGNiKHBmKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0X3BmX2RjYiBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfRU5BQkxFRDsKLQkJZ290byBlcnJfaW5pdF9kY2I7CisJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9DQVBBQkxFOworCQkvKiBDb250aW51ZSB3aXRob3V0IERDQiBlbmFibGVkICovCiAJfQogI2VuZGlmIC8qIENPTkZJR19JNDBFX0RDQiAqLwogCkBAIC04MjY0LDEwICs4NTY0LDE4IEBACiAJaTQwZV9kZXRlcm1pbmVfcXVldWVfdXNhZ2UocGYpOwogCWk0MGVfaW5pdF9pbnRlcnJ1cHRfc2NoZW1lKHBmKTsKIAotCS8qIFNldCB1cCB0aGUgKnZzaSBzdHJ1Y3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBWU0lzIGluIHRoZSBIVywKLQkgKiBhbmQgc2V0IHVwIG91ciBsb2NhbCB0cmFja2luZyBvZiB0aGUgTUFJTiBQRiB2c2kuCisJLyogVGhlIG51bWJlciBvZiBWU0lzIHJlcG9ydGVkIGJ5IHRoZSBGVyBpcyB0aGUgbWluaW11bSBndWFyYW50ZWVkCisJICogdG8gdXM7IEhXIHN1cHBvcnRzIGZhciBtb3JlIGFuZCB3ZSBzaGFyZSB0aGUgcmVtYWluaW5nIHBvb2wgd2l0aAorCSAqIHRoZSBvdGhlciBQRnMuIFdlIGFsbG9jYXRlIHNwYWNlIGZvciBtb3JlIHRoYW4gdGhlIGd1YXJhbnRlZSB3aXRoCisJICogdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCB3ZSBtaWdodCBub3QgZ2V0IHRoZW0gYWxsIGxhdGVyLgogCSAqLwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaTQwZV92c2kgKikgKiBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOworCWlmIChwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzIDwgSTQwRV9NSU5fVlNJX0FMTE9DKQorCQlwZi0+bnVtX2FsbG9jX3ZzaSA9IEk0MEVfTUlOX1ZTSV9BTExPQzsKKwllbHNlCisJCXBmLT5udW1fYWxsb2NfdnNpID0gcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsKKworCS8qIFNldCB1cCB0aGUgKnZzaSBzdHJ1Y3QgYW5kIG91ciBsb2NhbCB0cmFja2luZyBvZiB0aGUgTUFJTiBQRiB2c2kuICovCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpNDBlX3ZzaSAqKSAqIHBmLT5udW1fYWxsb2NfdnNpOwogCXBmLT52c2kgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZi0+dnNpKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC04Mjc5LDYgKzg1ODcsMTMgQEAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgInNldHVwX3BmX3N3aXRjaCBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQlnb3RvIGVycl92c2lzOwogCX0KKwkvKiBpZiBGRElSIFZTSSB3YXMgc2V0IHVwLCBzdGFydCBpdCBub3cgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGYtPm51bV9hbGxvY192c2k7IGkrKykgeworCQlpZiAocGYtPnZzaVtpXSAmJiBwZi0+dnNpW2ldLT50eXBlID09IEk0MEVfVlNJX0ZESVIpIHsKKwkJCWk0MGVfdnNpX29wZW4ocGYtPnZzaVtpXSk7CisJCQlicmVhazsKKwkJfQorCX0KIAogCS8qIFRoZSBtYWluIGRyaXZlciBpcyAobW9zdGx5KSB1cCBhbmQgaGFwcHkuIFdlIG5lZWQgdG8gc2V0IHRoaXMgc3RhdGUKIAkgKiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgbWlzYyB2ZWN0b3Igb3Igd2UgZ2V0IGEgcmFjZSBhbmQgdGhlIHZlY3RvcgpAQCAtODMwMCw2ICs4NjE1LDcgQEAKIAkJfQogCX0KIAorI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJLyogcHJlcCBmb3IgVkYgc3VwcG9ydCAqLwogCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX1NSSU9WX0VOQUJMRUQpICYmCiAJICAgIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEKSAmJgpAQCAtODMyMiwxNyArODYzOCwxNCBAQAogCQkJCQkgZXJyKTsKIAkJfQogCX0KKyNlbmRpZiAvKiBDT05GSUdfUENJX0lPViAqLwogCiAJcGZzX2ZvdW5kKys7CiAKIAlpNDBlX2RiZ19wZl9pbml0KHBmKTsKIAogCS8qIHRlbGwgdGhlIGZpcm13YXJlIHRoYXQgd2UncmUgc3RhcnRpbmcgKi8KLQlkdi5tYWpvcl92ZXJzaW9uID0gRFJWX1ZFUlNJT05fTUFKT1I7Ci0JZHYubWlub3JfdmVyc2lvbiA9IERSVl9WRVJTSU9OX01JTk9SOwotCWR2LmJ1aWxkX3ZlcnNpb24gPSBEUlZfVkVSU0lPTl9CVUlMRDsKLQlkdi5zdWJidWlsZF92ZXJzaW9uID0gMDsKLQlpNDBlX2FxX3NlbmRfZHJpdmVyX3ZlcnNpb24oJnBmLT5odywgJmR2LCBOVUxMKTsKKwlpNDBlX3NlbmRfdmVyc2lvbihwZik7CiAKIAkvKiBzaW5jZSBldmVyeXRoaW5nJ3MgaGFwcHksIHN0YXJ0IHRoZSBzZXJ2aWNlX3Rhc2sgdGltZXIgKi8KIAltb2RfdGltZXIoJnBmLT5zZXJ2aWNlX3RpbWVyLApAQCAtODM3Myw5ICs4Njg2LDYgQEAKIGVycl9zd2l0Y2hfc2V0dXA6CiAJaTQwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShwZik7CiAJZGVsX3RpbWVyX3N5bmMoJnBmLT5zZXJ2aWNlX3RpbWVyKTsKLSNpZmRlZiBDT05GSUdfSTQwRV9EQ0IKLWVycl9pbml0X2RjYjoKLSNlbmRpZiAvKiBDT05GSUdfSTQwRV9EQ0IgKi8KIGVycl9tYWNfYWRkcjoKIGVycl9jb25maWd1cmVfbGFuX2htYzoKIAkodm9pZClpNDBlX3NodXRkb3duX2xhbl9obWMoaHcpOwpAQCAtODQ1NiwxMCArODc2NiwxMyBAQAogCX0KIAogCS8qIHNodXRkb3duIGFuZCBkZXN0cm95IHRoZSBITUMgKi8KLQlyZXRfY29kZSA9IGk0MGVfc2h1dGRvd25fbGFuX2htYygmcGYtPmh3KTsKLQlpZiAocmV0X2NvZGUpCi0JCWRldl93YXJuKCZwZGV2LT5kZXYsCi0JCQkgIkZhaWxlZCB0byBkZXN0cm95IHRoZSBITUMgcmVzb3VyY2VzOiAlZFxuIiwgcmV0X2NvZGUpOworCWlmIChwZi0+aHcuaG1jLmhtY19vYmopIHsKKwkJcmV0X2NvZGUgPSBpNDBlX3NodXRkb3duX2xhbl9obWMoJnBmLT5odyk7CisJCWlmIChyZXRfY29kZSkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJGYWlsZWQgdG8gZGVzdHJveSB0aGUgSE1DIHJlc291cmNlczogJWRcbiIsCisJCQkJIHJldF9jb2RlKTsKKwl9CiAKIAkvKiBzaHV0ZG93biB0aGUgYWRtaW5xICovCiAJcmV0X2NvZGUgPSBpNDBlX3NodXRkb3duX2FkbWlucSgmcGYtPmh3KTsKQEAgLTg0NzAsNyArODc4Myw3IEBACiAKIAkvKiBDbGVhciBhbGwgZHluYW1pYyBtZW1vcnkgbGlzdHMgb2YgcmluZ3MsIHFfdmVjdG9ycywgYW5kIFZTSXMgKi8KIAlpNDBlX2NsZWFyX2ludGVycnVwdF9zY2hlbWUocGYpOwotCWZvciAoaSA9IDA7IGkgPCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcGYtPm51bV9hbGxvY192c2k7IGkrKykgewogCQlpZiAocGYtPnZzaVtpXSkgewogCQkJaTQwZV92c2lfY2xlYXJfcmluZ3MocGYtPnZzaVtpXSk7CiAJCQlpNDBlX3ZzaV9jbGVhcihwZi0+dnNpW2ldKTsKQEAgLTg0ODUsNyArODc5OCw2IEBACiAKIAlrZnJlZShwZi0+cXBfcGlsZSk7CiAJa2ZyZWUocGYtPmlycV9waWxlKTsKLQlrZnJlZShwZi0+c3dfY29uZmlnKTsKIAlrZnJlZShwZi0+dnNpKTsKIAogCS8qIGZvcmNlIGEgUEYgcmVzZXQgdG8gY2xlYW4gYW55dGhpbmcgbGVmdG92ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wcm90b3R5cGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wcm90b3R5cGUuaAppbmRleCA5Y2Q1N2U2Li5hNDMwNjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHJvdG90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3Byb3RvdHlwZS5oCkBAIC03MCwxMCArNzAsMTIgQEAKIAkJCQl1MTYgKmZ3X21ham9yX3ZlcnNpb24sIHUxNiAqZndfbWlub3JfdmVyc2lvbiwKIAkJCQl1MTYgKmFwaV9tYWpvcl92ZXJzaW9uLCB1MTYgKmFwaV9taW5vcl92ZXJzaW9uLAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwotaTQwZV9zdGF0dXMgaTQwZV9hcV9zZXRfcGh5X3Jlc2V0KHN0cnVjdCBpNDBlX2h3ICpodywKK2k0MGVfc3RhdHVzIGk0MGVfYXFfc2V0X3BoeV9kZWJ1ZyhzdHJ1Y3QgaTQwZV9odyAqaHcsIHU4IGNtZF9mbGFncywKIAkJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKTsKIGk0MGVfc3RhdHVzIGk0MGVfYXFfc2V0X2RlZmF1bHRfdnNpKHN0cnVjdCBpNDBlX2h3ICpodywgdTE2IHZzaV9pZCwKIAkJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKTsKK2k0MGVfc3RhdHVzIGk0MGVfYXFfY2xlYXJfcHhlX21vZGUoc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwogaTQwZV9zdGF0dXMgaTQwZV9hcV9zZXRfbGlua19yZXN0YXJ0X2FuKHN0cnVjdCBpNDBlX2h3ICpodywKIAkJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKTsKIGk0MGVfc3RhdHVzIGk0MGVfYXFfZ2V0X2xpbmtfaW5mbyhzdHJ1Y3QgaTQwZV9odyAqaHcsCkBAIC0xNTcsOCArMTU5LDggQEAKIGk0MGVfc3RhdHVzIGk0MGVfYXFfc3RhcnRfbGxkcChzdHJ1Y3QgaTQwZV9odyAqaHcsCiAJCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscyk7CiBpNDBlX3N0YXR1cyBpNDBlX2FxX2FkZF91ZHBfdHVubmVsKHN0cnVjdCBpNDBlX2h3ICpodywKLQkJCQl1MTYgdWRwX3BvcnQsIHU4IGhlYWRlcl9sZW4sCi0JCQkJdTggcHJvdG9jb2xfaW5kZXgsIHU4ICpmaWx0ZXJfaW5kZXgsCisJCQkJdTE2IHVkcF9wb3J0LCB1OCBwcm90b2NvbF9pbmRleCwKKwkJCQl1OCAqZmlsdGVyX2luZGV4LAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwogaTQwZV9zdGF0dXMgaTQwZV9hcV9kZWxfdWRwX3R1bm5lbChzdHJ1Y3QgaTQwZV9odyAqaHcsIHU4IGluZGV4LAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwpAQCAtMTY3LDYgKzE2OSw5IEBACiBpNDBlX3N0YXR1cyBpNDBlX2FxX21hY19hZGRyZXNzX3dyaXRlKHN0cnVjdCBpNDBlX2h3ICpodywKIAkJCQkgICAgdTE2IGZsYWdzLCB1OCAqbWFjX2FkZHIsCiAJCQkJICAgIHN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOworaTQwZV9zdGF0dXMgaTQwZV9hcV9jb25maWdfdnNpX2J3X2xpbWl0KHN0cnVjdCBpNDBlX2h3ICpodywKKwkJCQl1MTYgc2VpZCwgdTE2IGNyZWRpdCwgdTggbWF4X2NyZWRpdCwKKwkJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKTsKIGk0MGVfc3RhdHVzIGk0MGVfYXFfZGNiX3VwZGF0ZWQoc3RydWN0IGk0MGVfaHcgKmh3LAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwogaTQwZV9zdGF0dXMgaTQwZV9hcV9zZXRfaG1jX3Jlc291cmNlX3Byb2ZpbGUoc3RydWN0IGk0MGVfaHcgKmh3LApAQCAtMjE2LDYgKzIyMSw3IEBACiBpNDBlX3N0YXR1cyBpNDBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgaTQwZV9odyAqaHcsCiAJCQkJCQl1OCAqbWFjX2FkZHIpOwogaTQwZV9zdGF0dXMgaTQwZV92YWxpZGF0ZV9tYWNfYWRkcih1OCAqbWFjX2FkZHIpOwordm9pZCBpNDBlX3ByZV90eF9xdWV1ZV9jZmcoc3RydWN0IGk0MGVfaHcgKmh3LCB1MzIgcXVldWUsIGJvb2wgZW5hYmxlKTsKIC8qIHByb3RvdHlwZSBmb3IgZnVuY3Rpb25zIHVzZWQgZm9yIE5WTSBhY2Nlc3MgKi8KIGk0MGVfc3RhdHVzIGk0MGVfaW5pdF9udm0oc3RydWN0IGk0MGVfaHcgKmh3KTsKIGk0MGVfc3RhdHVzIGk0MGVfYWNxdWlyZV9udm0oc3RydWN0IGk0MGVfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jCmluZGV4IGU2MWU2MzcuLjEwMWY0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKIAkJCQkJSTQwRV9QUlRUU1lOX0NUTDFfVFNZTlRZUEVfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUFJUVFNZTl9DVEwxX1RTWU5UWVBFX1YyICAoMHgyIDw8IFwKIAkJCQkJSTQwRV9QUlRUU1lOX0NUTDFfVFNZTlRZUEVfU0hJRlQpCi0jZGVmaW5lIEk0MEVfUFRQX1RYX1RJTUVPVVQgIChIWiAqIDE1KQogCiAvKioKICAqIGk0MGVfcHRwX3JlYWQgLSBSZWFkIHRoZSBQSEMgdGltZSBmcm9tIHRoZSBkZXZpY2UKQEAgLTIxNyw0MCArMjE2LDYgQEAKIH0KIAogLyoqCi0gKiBpNDBlX3B0cF90eF93b3JrCi0gKiBAd29yazogcG9pbnRlciB0byB3b3JrIHN0cnVjdAotICoKLSAqIFRoaXMgd29yayBmdW5jdGlvbiBwb2xscyB0aGUgUFJUVFNZTl9TVEFUXzAuVFhUSU1FIGJpdCB0byBkZXRlcm1pbmUgd2hlbiBhCi0gKiBUeCB0aW1lc3RhbXAgZXZlbnQgaGFzIG9jY3VycmVkLCBpbiBvcmRlciB0byBwYXNzIHRoZSBUeCB0aW1lc3RhbXAgdmFsdWUgdXAKLSAqIHRoZSBzdGFjayBpbiB0aGUgc2tiLgotICovCi1zdGF0aWMgdm9pZCBpNDBlX3B0cF90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGk0MGVfcGYsCi0JCQkJCSAgcHRwX3R4X3dvcmspOwotCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JdTMyIHBydHRzeW5fc3RhdF8wOwotCi0JaWYgKCFwZi0+cHRwX3R4X3NrYikKLQkJcmV0dXJuOwotCi0JaWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMocGYtPnB0cF90eF9zdGFydCArCi0JCQkJICAgSTQwRV9QVFBfVFhfVElNRU9VVCkpIHsKLQkJZGV2X2tmcmVlX3NrYl9hbnkocGYtPnB0cF90eF9za2IpOwotCQlwZi0+cHRwX3R4X3NrYiA9IE5VTEw7Ci0JCXBmLT50eF9od3RzdGFtcF90aW1lb3V0cysrOwotCQlkZXZfd2FybigmcGYtPnBkZXYtPmRldiwgImNsZWFyaW5nIFR4IHRpbWVzdGFtcCBoYW5nXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXBydHRzeW5fc3RhdF8wID0gcmQzMihodywgSTQwRV9QUlRUU1lOX1NUQVRfMCk7Ci0JaWYgKHBydHRzeW5fc3RhdF8wICYgSTQwRV9QUlRUU1lOX1NUQVRfMF9UWFRJTUVfTUFTSykKLQkJaTQwZV9wdHBfdHhfaHd0c3RhbXAocGYpOwotCWVsc2UKLQkJc2NoZWR1bGVfd29yaygmcGYtPnB0cF90eF93b3JrKTsKLX0KLQotLyoqCiAgKiBpNDBlX3B0cF9lbmFibGUgLSBFbmFibGUvZGlzYWJsZSBhbmNpbGxhcnkgZmVhdHVyZXMgb2YgdGhlIFBIQyBzdWJzeXN0ZW0KICAqIEBwdHA6IFRoZSBQVFAgY2xvY2sgc3RydWN0dXJlCiAgKiBAcnE6IFRoZSByZXF1ZXN0ZWQgZmVhdHVyZSB0byBjaGFuZ2UKQEAgLTYwOCw3ICs1NzMsNiBAQAogCQl1MzIgcmVndmFsOwogCiAJCXNwaW5fbG9ja19pbml0KCZwZi0+dG1yZWdfbG9jayk7Ci0JCUlOSVRfV09SSygmcGYtPnB0cF90eF93b3JrLCBpNDBlX3B0cF90eF93b3JrKTsKIAogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiVzOiBhZGRlZCBQSEMgb24gJXNcbiIsIF9fZnVuY19fLAogCQkJIG5ldGRldi0+bmFtZSk7CkBAIC02NDcsNyArNjExLDYgQEAKIAlwZi0+cHRwX3R4ID0gZmFsc2U7CiAJcGYtPnB0cF9yeCA9IGZhbHNlOwogCi0JY2FuY2VsX3dvcmtfc3luYygmcGYtPnB0cF90eF93b3JrKTsKIAlpZiAocGYtPnB0cF90eF9za2IpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkocGYtPnB0cF90eF9za2IpOwogCQlwZi0+cHRwX3R4X3NrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcmVnaXN0ZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCmluZGV4IDFkNDBmNDIuLjk0N2RlOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCkBAIC0xMzQwLDggKzEzNDAsNiBAQAogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfR1BJT19NQVNLICgweDEgPDwgSTQwRV9QRklOVF9JQ1IwX0dQSU9fU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9USU1FU1lOQ19TSElGVCAyMwogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfVElNRVNZTkNfTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9USU1FU1lOQ19TSElGVCkKLSNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX1NUT1JNX0RFVEVDVF9TSElGVCAyNAotI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfU1RPUk1fREVURUNUX01BU0sgKDB4MSA8PCBJNDBFX1BGSU5UX0lDUjBfU1RPUk1fREVURUNUX1NISUZUKQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfTElOS19TVEFUX0NIQU5HRV9TSElGVCAyNQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfTElOS19TVEFUX0NIQU5HRV9NQVNLICgweDEgPDwgSTQwRV9QRklOVF9JQ1IwX0xJTktfU1RBVF9DSEFOR0VfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9ITUNfRVJSX1NISUZUIDI2CkBAIC0xMzY3LDggKzEzNjUsNiBAQAogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX0dQSU9fTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9FTkFfR1BJT19TSElGVCkKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9USU1FU1lOQ19TSElGVCAyMwogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX1RJTUVTWU5DX01BU0sgKDB4MSA8PCBJNDBFX1BGSU5UX0lDUjBfRU5BX1RJTUVTWU5DX1NISUZUKQotI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX1NUT1JNX0RFVEVDVF9TSElGVCAyNAotI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX1NUT1JNX0RFVEVDVF9NQVNLICgweDEgPDwgSTQwRV9QRklOVF9JQ1IwX0VOQV9TVE9STV9ERVRFQ1RfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9FTkFfTElOS19TVEFUX0NIQU5HRV9TSElGVCAyNQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX0xJTktfU1RBVF9DSEFOR0VfTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9FTkFfTElOS19TVEFUX0NIQU5HRV9TSElGVCkKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9ITUNfRVJSX1NISUZUIDI2CkBAIC0xNTg5LDYgKzE1ODUsMTQgQEAKICNkZWZpbmUgSTQwRV9HTExBTl9UU09NU0tfTSAweDAwMDQ0MkRDCiAjZGVmaW5lIEk0MEVfR0xMQU5fVFNPTVNLX01fVENQTVNLTV9TSElGVCAwCiAjZGVmaW5lIEk0MEVfR0xMQU5fVFNPTVNLX01fVENQTVNLTV9NQVNLICgweEZGRiA8PCBJNDBFX0dMTEFOX1RTT01TS19NX1RDUE1TS01fU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJUyhfaSkgKDB4MDAwRTY1MDAgKyAoKF9pKSAqIDQpKSAvKiBpPTAuLjExICovCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJU19RSU5EWF9TSElGVCAwCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJU19RSU5EWF9NQVNLICgweDdGRiA8PCBJNDBFX0dMTEFOX1RYUFJFX1FESVNfUUlORFhfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJU19TRVRfUURJU19TSElGVCAzMAorI2RlZmluZSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfU0VUX1FESVNfTUFTSyAoMHgxIDw8IEk0MEVfR0xMQU5fVFhQUkVfUURJU19TRVRfUURJU19TSElGVCkKKyNkZWZpbmUgSTQwRV9HTExBTl9UWFBSRV9RRElTX0NMRUFSX1FESVNfU0hJRlQgMzEKKyNkZWZpbmUgSTQwRV9HTExBTl9UWFBSRV9RRElTX0NMRUFSX1FESVNfTUFTSyAoMHgxIDw8IEk0MEVfR0xMQU5fVFhQUkVfUURJU19DTEVBUl9RRElTX1NISUZUKQorCiAjZGVmaW5lIEk0MEVfUEZMQU5fUUFMTE9DIDB4MDAxQzA0MDAKICNkZWZpbmUgSTQwRV9QRkxBTl9RQUxMT0NfRklSU1RRX1NISUZUIDAKICNkZWZpbmUgSTQwRV9QRkxBTl9RQUxMT0NfRklSU1RRX01BU0sgKDB4N0ZGIDw8IEk0MEVfUEZMQU5fUUFMTE9DX0ZJUlNUUV9TSElGVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5jCmluZGV4IDk0NzhkZGMuLmU0OWYzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguYwpAQCAtMjQsNiArMjQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgImk0MGUuaCIKICNpbmNsdWRlICJpNDBlX3Byb3RvdHlwZS5oIgogCkBAIC02MSw3ICs2Miw3IEBACiAKIAkvKiBmaW5kIGV4aXN0aW5nIEZESVIgVlNJICovCiAJdnNpID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgaSsrKQogCQlpZiAocGYtPnZzaVtpXSAmJiBwZi0+dnNpW2ldLT50eXBlID09IEk0MEVfVlNJX0ZESVIpCiAJCQl2c2kgPSBwZi0+dnNpW2ldOwogCWlmICghdnNpKQpAQCAtMTIwLDcgKzEyMSw3IEBACiAJCWRjYyB8PSBJNDBFX1RYRF9GTFRSX1FXMV9DTlRfRU5BX01BU0s7CiAJCWRjYyB8PSAoKHUzMilmZGlyX2RhdGEtPmNudF9pbmRleCA8PAogCQkJSTQwRV9UWERfRkxUUl9RVzFfQ05USU5ERVhfU0hJRlQpICYKLQkJICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX01BU0s7CisJCQlJNDBFX1RYRF9GTFRSX1FXMV9DTlRJTkRFWF9NQVNLOwogCX0KIAogCWZkaXJfZGVzYy0+ZHR5cGVfY21kX2NudGluZGV4ID0gY3B1X3RvX2xlMzIoZGNjKTsKQEAgLTE4Myw3ICsxODQsNiBAQAogCXN0cnVjdCBpcGhkciAqaXA7CiAJYm9vbCBlcnIgPSBmYWxzZTsKIAlpbnQgcmV0OwotCWludCBpOwogCXN0YXRpYyBjaGFyIHBhY2tldFtdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MDgsIDAsCiAJCTB4NDUsIDAsIDAsIDB4MWMsIDAsIDAsIDB4NDAsIDAsIDB4NDAsIDB4MTEsIDAsIDAsIDAsIDAsIDAsIDAsCiAJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwpAQCAtMTk5LDIxICsxOTksMTcgQEAKIAlpcC0+c2FkZHIgPSBmZF9kYXRhLT5zcmNfaXBbMF07CiAJdWRwLT5zb3VyY2UgPSBmZF9kYXRhLT5zcmNfcG9ydDsKIAotCWZvciAoaSA9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNF9VRFA7Ci0JICAgICBpIDw9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVURQOyBpKyspIHsKLQkJZmRfZGF0YS0+cGN0eXBlID0gaTsKLQkJcmV0ID0gaTQwZV9wcm9ncmFtX2ZkaXJfZmlsdGVyKGZkX2RhdGEsIHJhd19wYWNrZXQsIHBmLCBhZGQpOwotCi0JCWlmIChyZXQpIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJCSAiRmlsdGVyIGNvbW1hbmQgc2VuZCBmYWlsZWQgZm9yIFBDVFlQRSAlZCAocmV0ID0gJWQpXG4iLAotCQkJCSBmZF9kYXRhLT5wY3R5cGUsIHJldCk7Ci0JCQllcnIgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCQkJICJGaWx0ZXIgT0sgZm9yIFBDVFlQRSAlZCAocmV0ID0gJWQpXG4iLAotCQkJCSBmZF9kYXRhLT5wY3R5cGUsIHJldCk7Ci0JCX0KKwlmZF9kYXRhLT5wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUDsKKwlyZXQgPSBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIoZmRfZGF0YSwgcmF3X3BhY2tldCwgcGYsIGFkZCk7CisJaWYgKHJldCkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCSAiRmlsdGVyIGNvbW1hbmQgc2VuZCBmYWlsZWQgZm9yIFBDVFlQRSAlZCAocmV0ID0gJWQpXG4iLAorCQkJIGZkX2RhdGEtPnBjdHlwZSwgcmV0KTsKKwkJZXJyID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCSAiRmlsdGVyIE9LIGZvciBQQ1RZUEUgJWQgKHJldCA9ICVkKVxuIiwKKwkJCSBmZF9kYXRhLT5wY3R5cGUsIHJldCk7CiAJfQogCiAJcmV0dXJuIGVyciA/IC1FT1BOT1RTVVBQIDogMDsKQEAgLTI2Miw3ICsyNTgsNyBAQAogCQl9CiAJfQogCi0JZmRfZGF0YS0+cGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOOworCWZkX2RhdGEtPnBjdHlwZSA9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQOwogCXJldCA9IGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlcihmZF9kYXRhLCByYXdfcGFja2V0LCBwZiwgYWRkKTsKIAogCWlmIChyZXQpIHsKQEAgLTQ1NSwyMiArNDUxLDIwIEBACiAKIAkJLyogZmlsdGVyIHByb2dyYW1taW5nIGZhaWxlZCBtb3N0IGxpa2VseSBkdWUgdG8gdGFibGUgZnVsbCAqLwogCQlmY250X3Byb2cgPSBpNDBlX2dldF9jdXJyZW50X2ZkX2NvdW50KHBmKTsKLQkJZmNudF9hdmFpbCA9IHBmLT5ody5mZGlyX3NoYXJlZF9maWx0ZXJfY291bnQgKwotCQkJCQkJICAgICAgIHBmLT5mZGlyX3BmX2ZpbHRlcl9jb3VudDsKLQorCQlmY250X2F2YWlsID0gaTQwZV9nZXRfZmRfY250X2FsbChwZik7CiAJCS8qIElmIEFUUiBpcyBydW5uaW5nIGZjbnRfcHJvZyBjYW4gcXVpY2tseSBjaGFuZ2UsCiAJCSAqIGlmIHdlIGFyZSB2ZXJ5IGNsb3NlIHRvIGZ1bGwsIGl0IG1ha2VzIHNlbnNlIHRvIGRpc2FibGUKIAkJICogRkQgQVRSL1NCIGFuZCB0aGVuIHJlLWVuYWJsZSBpdCB3aGVuIHRoZXJlIGlzIHJvb20uCiAJCSAqLwogCQlpZiAoZmNudF9wcm9nID49IChmY250X2F2YWlsIC0gSTQwRV9GRElSX0JVRkZFUl9GVUxMX01BUkdJTikpIHsKIAkJCS8qIFR1cm4gb2ZmIEFUUiBmaXJzdCAqLwotCQkJaWYgKHBmLT5mbGFncyB8IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgeworCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgewogCQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJGRCBmaWx0ZXIgc3BhY2UgZnVsbCwgQVRSIGZvciBmdXJ0aGVyIGZsb3dzIHdpbGwgYmUgdHVybmVkIG9mZlxuIik7CiAJCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PQogCQkJCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0ZESVJfUkVRVUlSRVNfUkVJTklUOwotCQkJfSBlbHNlIGlmIChwZi0+ZmxhZ3MgfCBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgeworCQkJfSBlbHNlIGlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgewogCQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQ7CiAJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkZEIGZpbHRlciBzcGFjZSBmdWxsLCBuZXcgbnR1cGxlIHJ1bGVzIHdpbGwgbm90IGJlIGFkZGVkXG4iKTsKIAkJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzIHw9CkBAIC0xMTk5LDEwICsxMTkzLDEyIEBACiAJCQkJICAgIHUzMiByeF9lcnJvciwKIAkJCQkgICAgdTE2IHJ4X3B0eXBlKQogeworCXN0cnVjdCBpNDBlX3J4X3B0eXBlX2RlY29kZWQgZGVjb2RlZCA9IGRlY29kZV9yeF9kZXNjX3B0eXBlKHJ4X3B0eXBlKTsKKwlib29sIGlwdjQgPSBmYWxzZSwgaXB2NiA9IGZhbHNlOwogCWJvb2wgaXB2NF90dW5uZWwsIGlwdjZfdHVubmVsOwogCV9fd3N1bSByeF91ZHBfY3N1bTsKLQlfX3N1bTE2IGNzdW07CiAJc3RydWN0IGlwaGRyICppcGg7CisJX19zdW0xNiBjc3VtOwogCiAJaXB2NF90dW5uZWwgPSAocnhfcHR5cGUgPiBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDX1BBWTMpICYmCiAJCSAgICAgIChyeF9wdHlwZSA8IEk0MEVfUlhfUFRZUEVfR1JFTkFUNF9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKQEAgLTEyMTMsMjkgKzEyMDksNTcgQEAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAkvKiBSeCBjc3VtIGVuYWJsZWQgYW5kIGlwIGhlYWRlcnMgZm91bmQ/ICovCi0JaWYgKCEodnNpLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0gJiYKLQkgICAgICByeF9zdGF0dXMgJiAoMSA8PCBJNDBFX1JYX0RFU0NfU1RBVFVTX0wzTDRQX1NISUZUKSkpCisJaWYgKCEodnNpLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pKQogCQlyZXR1cm47CiAKKwkvKiBkaWQgdGhlIGhhcmR3YXJlIGRlY29kZSB0aGUgcGFja2V0IGFuZCBjaGVja3N1bT8gKi8KKwlpZiAoIShyeF9zdGF0dXMgJiAoMSA8PCBJNDBFX1JYX0RFU0NfU1RBVFVTX0wzTDRQX1NISUZUKSkpCisJCXJldHVybjsKKworCS8qIGJvdGgga25vd24gYW5kIG91dGVyX2lwIG11c3QgYmUgc2V0IGZvciB0aGUgYmVsb3cgY29kZSB0byB3b3JrICovCisJaWYgKCEoZGVjb2RlZC5rbm93biAmJiBkZWNvZGVkLm91dGVyX2lwKSkKKwkJcmV0dXJuOworCisJaWYgKGRlY29kZWQub3V0ZXJfaXAgPT0gSTQwRV9SWF9QVFlQRV9PVVRFUl9JUCAmJgorCSAgICBkZWNvZGVkLm91dGVyX2lwX3ZlciA9PSBJNDBFX1JYX1BUWVBFX09VVEVSX0lQVjQpCisJCWlwdjQgPSB0cnVlOworCWVsc2UgaWYgKGRlY29kZWQub3V0ZXJfaXAgPT0gSTQwRV9SWF9QVFlQRV9PVVRFUl9JUCAmJgorCQkgZGVjb2RlZC5vdXRlcl9pcF92ZXIgPT0gSTQwRV9SWF9QVFlQRV9PVVRFUl9JUFY2KQorCQlpcHY2ID0gdHJ1ZTsKKworCWlmIChpcHY0ICYmCisJICAgIChyeF9lcnJvciAmICgoMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfSVBFX1NISUZUKSB8CisJCQkgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0VJUEVfU0hJRlQpKSkpCisJCWdvdG8gY2hlY2tzdW1fZmFpbDsKKwogCS8qIGxpa2VseSBpbmNvcnJlY3QgY3N1bSBpZiBhbHRlcm5hdGUgSVAgZXh0ZW5zaW9uIGhlYWRlcnMgZm91bmQgKi8KLQlpZiAocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19JUFY2RVhBRERfU0hJRlQpKQorCWlmIChpcHY2ICYmCisJICAgIGRlY29kZWQuaW5uZXJfcHJvdCA9PSBJNDBFX1JYX1BUWVBFX0lOTkVSX1BST1RfVENQICYmCisJICAgIHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0w0RV9TSElGVCkgJiYKKwkgICAgcnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19JUFY2RVhBRERfU0hJRlQpKQorCQkvKiBkb24ndCBpbmNyZW1lbnQgY2hlY2tzdW0gZXJyIGhlcmUsIG5vbi1mYXRhbCBlcnIgKi8KIAkJcmV0dXJuOwogCi0JLyogSVAgb3IgTDQgb3Igb3V0bW9zdCBJUCBjaGVja3N1bSBlcnJvciAqLwotCWlmIChyeF9lcnJvciAmICgoMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfSVBFX1NISUZUKSB8Ci0JCQkoMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfTDRFX1NISUZUKSB8Ci0JCQkoMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfRUlQRV9TSElGVCkpKSB7Ci0JCXZzaS0+YmFjay0+aHdfY3N1bV9yeF9lcnJvcisrOwotCQlyZXR1cm47Ci0JfQorCS8qIHRoZXJlIHdhcyBzb21lIEw0IGVycm9yLCBjb3VudCBlcnJvciBhbmQgcHVudCBwYWNrZXQgdG8gdGhlIHN0YWNrICovCisJaWYgKHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0w0RV9TSElGVCkpCisJCWdvdG8gY2hlY2tzdW1fZmFpbDsKIAorCS8qIGhhbmRsZSBwYWNrZXRzIHRoYXQgd2VyZSBub3QgYWJsZSB0byBiZSBjaGVja3N1bW1lZCBkdWUKKwkgKiB0byBhcnJpdmFsIHNwZWVkLCBpbiB0aGlzIGNhc2UgdGhlIHN0YWNrIGNhbiBjb21wdXRlCisJICogdGhlIGNzdW0uCisJICovCisJaWYgKHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX1BQUlNfU0hJRlQpKQorCQlyZXR1cm47CisKKwkvKiBJZiBWWExBTiB0cmFmZmljIGhhcyBhbiBvdXRlciBVRFB2NCBjaGVja3N1bSB3ZSBuZWVkIHRvIGNoZWNrCisJICogaXQgaW4gdGhlIGRyaXZlciwgaGFyZHdhcmUgZG9lcyBub3QgZG8gaXQgZm9yIHVzLgorCSAqIFNpbmNlIEwzTDRQIGJpdCB3YXMgc2V0IHdlIGFzc3VtZSBhIHZhbGlkIElITCB2YWx1ZSAoPj01KQorCSAqIHNvIHRoZSB0b3RhbCBsZW5ndGggb2YgSVB2NCBoZWFkZXIgaXMgSUhMKjQgYnl0ZXMKKwkgKiBUaGUgVURQXzAgYml0ICptYXkqIGJldCBzZXQgaWYgdGhlICppbm5lciogaGVhZGVyIGlzIFVEUAorCSAqLwogCWlmIChpcHY0X3R1bm5lbCAmJgorCSAgICAoZGVjb2RlZC5pbm5lcl9wcm90ICE9IEk0MEVfUlhfUFRZUEVfSU5ORVJfUFJPVF9VRFApICYmCiAJICAgICEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19VRFBfMF9TSElGVCkpKSB7Ci0JCS8qIElmIFZYTEFOIHRyYWZmaWMgaGFzIGFuIG91dGVyIFVEUHY0IGNoZWNrc3VtIHdlIG5lZWQgdG8gY2hlY2sKLQkJICogaXQgaW4gdGhlIGRyaXZlciwgaGFyZHdhcmUgZG9lcyBub3QgZG8gaXQgZm9yIHVzLgotCQkgKiBTaW5jZSBMM0w0UCBiaXQgd2FzIHNldCB3ZSBhc3N1bWUgYSB2YWxpZCBJSEwgdmFsdWUgKD49NSkKLQkJICogc28gdGhlIHRvdGFsIGxlbmd0aCBvZiBJUHY0IGhlYWRlciBpcyBJSEwqNCBieXRlcwotCQkgKi8KIAkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5tYWNfaGVhZGVyICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKIAkJCQkJKGlwX2hkcihza2IpLT5paGwgKiA0KTsKQEAgLTEyNTIsMTMgKzEyNzYsMTYgQEAKIAkJCQkoc2tiLT5sZW4gLSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpKSwKIAkJCQlJUFBST1RPX1VEUCwgcnhfdWRwX2NzdW0pOwogCi0JCWlmICh1ZHBfaGRyKHNrYiktPmNoZWNrICE9IGNzdW0pIHsKLQkJCXZzaS0+YmFjay0+aHdfY3N1bV9yeF9lcnJvcisrOwotCQkJcmV0dXJuOwotCQl9CisJCWlmICh1ZHBfaGRyKHNrYiktPmNoZWNrICE9IGNzdW0pCisJCQlnb3RvIGNoZWNrc3VtX2ZhaWw7CiAJfQogCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCXJldHVybjsKKworY2hlY2tzdW1fZmFpbDoKKwl2c2ktPmJhY2stPmh3X2NzdW1fcnhfZXJyb3IrKzsKIH0KIAogLyoqCkBAIC0xNDM1LDYgKzE0NjIsOSBAQAogCQkvKiBFUlJfTUFTSyB3aWxsIG9ubHkgaGF2ZSB2YWxpZCBiaXRzIGlmIEVPUCBzZXQgKi8KIAkJaWYgKHVubGlrZWx5KHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX1JYRV9TSElGVCkpKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJLyogVE9ETzogc2hvdWxkbid0IHdlIGluY3JlbWVudCBhIGNvdW50ZXIgaW5kaWNhdGluZyB0aGUKKwkJCSAqIGRyb3A/CisJCQkgKi8KIAkJCWdvdG8gbmV4dF9kZXNjOwogCQl9CiAKQEAgLTE2NjUsNiArMTY5NSwxMSBAQAogCWR0eXBlX2NtZCB8PSBJNDBFX0ZJTFRFUl9QUk9HUkFNX0RFU0NfRkRfU1RBVFVTX0ZEX0lEIDw8CiAJCSAgICAgSTQwRV9UWERfRkxUUl9RVzFfRkRfU1RBVFVTX1NISUZUOwogCisJZHR5cGVfY21kIHw9IEk0MEVfVFhEX0ZMVFJfUVcxX0NOVF9FTkFfTUFTSzsKKwlkdHlwZV9jbWQgfD0KKwkJKCh1MzIpcGYtPmZkX2F0cl9jbnRfaWR4IDw8IEk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX1NISUZUKSAmCisJCUk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX01BU0s7CisKIAlmZGlyX2Rlc2MtPnFpbmRleF9mbGV4X3B0eXBlX3ZzaSA9IGNwdV90b19sZTMyKGZsZXhfcHR5cGUpOwogCWZkaXJfZGVzYy0+ZHR5cGVfY21kX2NudGluZGV4ID0gY3B1X3RvX2xlMzIoZHR5cGVfY21kKTsKIH0KQEAgLTE4MjUsOSArMTg2MCw2IEBACiAJKmNkX3R5cGVfY21kX3Rzb19tc3MgfD0gKHU2NClJNDBFX1RYX0NUWF9ERVNDX1RTWU4gPDwKIAkJCQlJNDBFX1RYRF9DVFhfUVcxX0NNRF9TSElGVDsKIAotCXBmLT5wdHBfdHhfc3RhcnQgPSBqaWZmaWVzOwotCXNjaGVkdWxlX3dvcmsoJnBmLT5wdHBfdHhfd29yayk7Ci0KIAlyZXR1cm4gMTsKIH0KIApAQCAtMjE3OSw5ICsyMjExLDcgQEAKIHN0YXRpYyBpbnQgaTQwZV94bWl0X2Rlc2NyaXB0b3JfY291bnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICBzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nKQogewotI2lmIFBBR0VfU0laRSA+IEk0MEVfTUFYX0RBVEFfUEVSX1RYRAogCXVuc2lnbmVkIGludCBmOwotI2VuZGlmCiAJaW50IGNvdW50ID0gMDsKIAogCS8qIG5lZWQ6IDEgZGVzY3JpcHRvciBwZXIgcGFnZSAqIFBBR0VfU0laRS9JNDBFX01BWF9EQVRBX1BFUl9UWEQsCkBAIC0yMTkwLDEyICsyMjIwLDkgQEAKIAkgKiAgICAgICArIDEgZGVzYyBmb3IgY29udGV4dCBkZXNjcmlwdG9yLAogCSAqIG90aGVyd2lzZSB0cnkgbmV4dCB0aW1lCiAJICovCi0jaWYgUEFHRV9TSVpFID4gSTQwRV9NQVhfREFUQV9QRVJfVFhECiAJZm9yIChmID0gMDsgZiA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGYrKykKIAkJY291bnQgKz0gVFhEX1VTRV9DT1VOVChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdLnNpemUpOwotI2Vsc2UKLQljb3VudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwotI2VuZGlmCisKIAljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9oZWFkbGVuKHNrYikpOwogCWlmIChpNDBlX21heWJlX3N0b3BfdHgodHhfcmluZywgY291bnQgKyA0ICsgMSkpIHsKIAkJdHhfcmluZy0+dHhfc3RhdHMudHhfYnVzeSsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmgKaW5kZXggZDUzNDk2OS4uMDI3Nzg5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oCkBAIC0yNyw3ICsyNyw3IEBACiAjaWZuZGVmIF9JNDBFX1RYUlhfSF8KICNkZWZpbmUgX0k0MEVfVFhSWF9IXwogCi0vKiBJbnRlcnJ1cHQgVGhyb3R0bGluZyBhbmQgUmF0ZSBMaW1pdGluZyAoc3Rvcm0gY29udHJvbCkgR29vZGllcyAqLworLyogSW50ZXJydXB0IFRocm90dGxpbmcgYW5kIFJhdGUgTGltaXRpbmcgR29vZGllcyAqLwogCiAjZGVmaW5lIEk0MEVfTUFYX0lUUiAgICAgICAgICAgICAgIDB4MEZGMCAgLyogcmVnIHVzZXMgMiB1c2VjIHJlc29sdXRpb24gKi8KICNkZWZpbmUgSTQwRV9NSU5fSVRSICAgICAgICAgICAgICAgMHgwMDA0ICAvKiByZWcgdXNlcyAyIHVzZWMgcmVzb2x1dGlvbiAqLwpAQCAtNjksMTYgKzY5LDExIEBACiAKIC8qIFN1cHBvcnRlZCBSU1Mgb2ZmbG9hZHMgKi8KICNkZWZpbmUgSTQwRV9ERUZBVUxUX1JTU19IRU5BICggXAotCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY0X1VEUCkgfCBcCi0JKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNF9VRFApIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFApIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9TQ1RQKSB8IFwKLQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQX1NZTikgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUCkgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X09USEVSKSB8IFwKIAkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjQpIHwgXAotCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY2X1VEUCkgfCBcCi0JKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNl9VRFApIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFApIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1BfU1lOKSB8IFwKIAkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQKSB8IFwKQEAgLTEyMiwxMSArMTE3LDExIEBACiAjZGVmaW5lIGk0MGVfcnhfZGVzYyBpNDBlXzMyYnl0ZV9yeF9kZXNjCiAKICNkZWZpbmUgSTQwRV9NSU5fVFhfTEVOCQkxNwotI2RlZmluZSBJNDBFX01BWF9EQVRBX1BFUl9UWEQJMTYzODMJLyogYWthIDE2a0IgLSAxICovCisjZGVmaW5lIEk0MEVfTUFYX0RBVEFfUEVSX1RYRAk4MTkyCiAKIC8qIFR4IERlc2NyaXB0b3JzIG5lZWRlZCwgd29yc3QgY2FzZSAqLwogI2RlZmluZSBUWERfVVNFX0NPVU5UKFMpIERJVl9ST1VORF9VUCgoUyksIEk0MEVfTUFYX0RBVEFfUEVSX1RYRCkKLSNkZWZpbmUgREVTQ19ORUVERUQgKChNQVhfU0tCX0ZSQUdTICogVFhEX1VTRV9DT1VOVChQQUdFX1NJWkUpKSArIDQpCisjZGVmaW5lIERFU0NfTkVFREVEIChNQVhfU0tCX0ZSQUdTICsgNCkKIAogI2RlZmluZSBJNDBFX1RYX0ZMQUdTX0NTVU0JCSh1MzIpKDEpCiAjZGVmaW5lIEk0MEVfVFhfRkxBR1NfSFdfVkxBTgkJKHUzMikoMSA8PCAxKQpAQCAtMTg0LDcgKzE3OSw2IEBACiAJX19JNDBFX1RYX0RFVEVDVF9IQU5HLAogCV9fSTQwRV9IQU5HX0NIRUNLX0FSTUVELAogCV9fSTQwRV9SWF9QU19FTkFCTEVELAotCV9fSTQwRV9SWF9MUk9fRU5BQkxFRCwKIAlfX0k0MEVfUlhfMTZCWVRFX0RFU0NfRU5BQkxFRCwKIH07CiAKQEAgLTIwMCwxMiArMTk0LDYgQEAKIAlzZXRfYml0KF9fSTQwRV9UWF9ERVRFQ1RfSEFORywgJihyaW5nKS0+c3RhdGUpCiAjZGVmaW5lIGNsZWFyX2NoZWNrX2Zvcl90eF9oYW5nKHJpbmcpIFwKIAljbGVhcl9iaXQoX19JNDBFX1RYX0RFVEVDVF9IQU5HLCAmKHJpbmcpLT5zdGF0ZSkKLSNkZWZpbmUgcmluZ19pc19scm9fZW5hYmxlZChyaW5nKSBcCi0JdGVzdF9iaXQoX19JNDBFX1JYX0xST19FTkFCTEVELCAmKHJpbmcpLT5zdGF0ZSkKLSNkZWZpbmUgc2V0X3JpbmdfbHJvX2VuYWJsZWQocmluZykgXAotCXNldF9iaXQoX19JNDBFX1JYX0xST19FTkFCTEVELCAmKHJpbmcpLT5zdGF0ZSkKLSNkZWZpbmUgY2xlYXJfcmluZ19scm9fZW5hYmxlZChyaW5nKSBcCi0JY2xlYXJfYml0KF9fSTQwRV9SWF9MUk9fRU5BQkxFRCwgJihyaW5nKS0+c3RhdGUpCiAjZGVmaW5lIHJpbmdfaXNfMTZieXRlX2Rlc2NfZW5hYmxlZChyaW5nKSBcCiAJdGVzdF9iaXQoX19JNDBFX1JYXzE2QllURV9ERVNDX0VOQUJMRUQsICYocmluZyktPnN0YXRlKQogI2RlZmluZSBzZXRfcmluZ18xNmJ5dGVfZGVzY19lbmFibGVkKHJpbmcpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eXBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHlwZS5oCmluZGV4IDcxYTk2OGYuLjlkMzlmZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R5cGUuaApAQCAtMzYsMTIgKzM2LDEwIEBACiAKIC8qIERldmljZSBJRHMgKi8KICNkZWZpbmUgSTQwRV9ERVZfSURfU0ZQX1hMNzEwCQkweDE1NzIKLSNkZWZpbmUgSTQwRV9ERVZfSURfU0ZQX1g3MTAJCTB4MTU3MwogI2RlZmluZSBJNDBFX0RFVl9JRF9RRU1VCQkweDE1NzQKICNkZWZpbmUgSTQwRV9ERVZfSURfS1hfQQkJMHgxNTdGCiAjZGVmaW5lIEk0MEVfREVWX0lEX0tYX0IJCTB4MTU4MAogI2RlZmluZSBJNDBFX0RFVl9JRF9LWF9DCQkweDE1ODEKLSNkZWZpbmUgSTQwRV9ERVZfSURfS1hfRAkJMHgxNTgyCiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQQkJMHgxNTgzCiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQgkJMHgxNTg0CiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQwkJMHgxNTg1CkBAIC02MCw4ICs1OCw4IEBACiAvKiBNYXggZGVmYXVsdCB0aW1lb3V0IGluIG1zLCAqLwogI2RlZmluZSBJNDBFX01BWF9OVk1fVElNRU9VVAkJMTgwMDAKIAotLyogU3dpdGNoIGZyb20gbWMgdG8gdGhlIDJ1c2VjIGdsb2JhbCB0aW1lICh0aGlzIGlzIHRoZSBHVElNRSByZXNvbHV0aW9uKSAqLwotI2RlZmluZSBJNDBFX01TX1RPX0dUSU1FKHRpbWUpCQkoKCh0aW1lKSAqIDEwMDApIC8gMikKKy8qIFN3aXRjaCBmcm9tIG1zIHRvIHRoZSAxdXNlYyBnbG9iYWwgdGltZSAodGhpcyBpcyB0aGUgR1RJTUUgcmVzb2x1dGlvbikgKi8KKyNkZWZpbmUgSTQwRV9NU19UT19HVElNRSh0aW1lKQkJKCh0aW1lKSAqIDEwMDApCiAKIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KIHN0cnVjdCBpNDBlX2h3OwpAQCAtMTY3LDYgKzE2NSw5IEBACiAJdTggbG9vcGJhY2s7CiAJLyogaXMgTGluayBTdGF0dXMgRXZlbnQgbm90aWZpY2F0aW9uIHRvIFNXIGVuYWJsZWQgKi8KIAlib29sIGxzZV9lbmFibGU7CisJdTE2IG1heF9mcmFtZV9zaXplOworCWJvb2wgY3JjX2VuYWJsZTsKKwl1OCBwYWNpbmc7CiB9OwogCiBzdHJ1Y3QgaTQwZV9waHlfaW5mbyB7CkBAIC00MDksNiArNDEwLDcgQEAKIAl1OCBtaW5vcl92ZXJzaW9uOwogCXU4IGJ1aWxkX3ZlcnNpb247CiAJdTggc3ViYnVpbGRfdmVyc2lvbjsKKwl1OCBkcml2ZXJfc3RyaW5nWzMyXTsKIH07CiAKIC8qIFJYIERlc2NyaXB0b3JzICovCkBAIC00ODgsOSArNDkwLDYgQEAKIAl9IHdiOyAgLyogd3JpdGViYWNrICovCiB9OwogCi0jZGVmaW5lIEk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQJMAotI2RlZmluZSBJNDBFX1JYRF9RVzFfU1RBVFVTX01BU0sJKDB4N0ZGRlVMIDw8IEk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQpCi0KIGVudW0gaTQwZV9yeF9kZXNjX3N0YXR1c19iaXRzIHsKIAkvKiBOb3RlOiBUaGVzZSBhcmUgcHJlZGVmaW5lZCBiaXQgb2Zmc2V0cyAqLwogCUk0MEVfUlhfREVTQ19TVEFUVVNfRERfU0hJRlQJCT0gMCwKQEAgLTUwNyw5ICs1MDYsMTQgQEAKIAlJNDBFX1JYX0RFU0NfU1RBVFVTX0xQQktfU0hJRlQJCT0gMTQsCiAJSTQwRV9SWF9ERVNDX1NUQVRVU19JUFY2RVhBRERfU0hJRlQJPSAxNSwKIAlJNDBFX1JYX0RFU0NfU1RBVFVTX1JFU0VSVkVEX1NISUZUCT0gMTYsIC8qIDIgQklUUyAqLwotCUk0MEVfUlhfREVTQ19TVEFUVVNfVURQXzBfU0hJRlQJCT0gMTgKKwlJNDBFX1JYX0RFU0NfU1RBVFVTX1VEUF8wX1NISUZUCQk9IDE4LAorCUk0MEVfUlhfREVTQ19TVEFUVVNfTEFTVCAvKiB0aGlzIGVudHJ5IG11c3QgYmUgbGFzdCEhISAqLwogfTsKIAorI2RlZmluZSBJNDBFX1JYRF9RVzFfU1RBVFVTX1NISUZUCTAKKyNkZWZpbmUgSTQwRV9SWERfUVcxX1NUQVRVU19NQVNLCSgoKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19MQVNUKSAtIDEpIFwKKwkJCQkJIDw8IEk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQpCisKICNkZWZpbmUgSTQwRV9SWERfUVcxX1NUQVRVU19UU1lOSU5EWF9TSElGVCAgIEk0MEVfUlhfREVTQ19TVEFUVVNfVFNZTklORFhfU0hJRlQKICNkZWZpbmUgSTQwRV9SWERfUVcxX1NUQVRVU19UU1lOSU5EWF9NQVNLCSgweDNVTCA8PCBcCiAJCQkJCSAgICAgSTQwRV9SWERfUVcxX1NUQVRVU19UU1lOSU5EWF9TSElGVCkKQEAgLTUzNyw3ICs1NDEsOCBAQAogCUk0MEVfUlhfREVTQ19FUlJPUl9JUEVfU0hJRlQJCT0gMywKIAlJNDBFX1JYX0RFU0NfRVJST1JfTDRFX1NISUZUCQk9IDQsCiAJSTQwRV9SWF9ERVNDX0VSUk9SX0VJUEVfU0hJRlQJCT0gNSwKLQlJNDBFX1JYX0RFU0NfRVJST1JfT1ZFUlNJWkVfU0hJRlQJPSA2CisJSTQwRV9SWF9ERVNDX0VSUk9SX09WRVJTSVpFX1NISUZUCT0gNiwKKwlJNDBFX1JYX0RFU0NfRVJST1JfUFBSU19TSElGVAkJPSA3CiB9OwogCiBlbnVtIGk0MGVfcnhfZGVzY19lcnJvcl9sM2w0ZV9mY29lX21hc2tzIHsKQEAgLTY1OCw3ICs2NjMsNiBAQAogCUk0MEVfUlhfREVTQ19FWFRfU1RBVFVTX0wyVEFHM1BfU0hJRlQJPSAxLAogCUk0MEVfUlhfREVTQ19FWFRfU1RBVFVTX0ZMRVhCTF9TSElGVAk9IDIsIC8qIDIgQklUUyAqLwogCUk0MEVfUlhfREVTQ19FWFRfU1RBVFVTX0ZMRVhCSF9TSElGVAk9IDQsIC8qIDIgQklUUyAqLwotCUk0MEVfUlhfREVTQ19FWFRfU1RBVFVTX0ZUWVBFX1NISUZUCT0gNiwgLyogMyBCSVRTICovCiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfRkRMT05HQl9TSElGVAk9IDksCiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfRkNPRUxPTkdCX1NISUZUCT0gMTAsCiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfUEVMT05HQl9TSElGVAk9IDExLApAQCAtODYyLDE4ICs4NjYsMTQgQEAKIAogLyogUGFja2V0IENsYXNzaWZpZXIgVHlwZXMgZm9yIGZpbHRlcnMgKi8KIGVudW0gaTQwZV9maWx0ZXJfcGN0eXBlIHsKLQkvKiBOb3RlOiBWYWx1ZXMgMC0yOCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjRfVURQCT0gMjksCi0JSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjRfVURQCT0gMzAsCisJLyogTm90ZTogVmFsdWVzIDAtMzAgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFAJCT0gMzEsCi0JSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOCQk9IDMyLAorCS8qIE5vdGU6IFZhbHVlIDMyIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1AJCT0gMzMsCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9TQ1RQCQk9IDM0LAogCUk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfT1RIRVIJCT0gMzUsCiAJSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNAkJCT0gMzYsCi0JLyogTm90ZTogVmFsdWVzIDM3LTM4IGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCUk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNl9VRFAJPSAzOSwKLQlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNl9VRFAJPSA0MCwKKwkvKiBOb3RlOiBWYWx1ZXMgMzctNDAgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFAJCT0gNDEsCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1BfU1lOCQk9IDQyLAogCUk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQCQk9IDQzLApAQCAtOTU1LDYgKzk1NSwxNiBAQAogCXN0cnVjdCBpNDBlX2FxY192c2lfcHJvcGVydGllc19kYXRhIGluZm87CiB9OwogCitzdHJ1Y3QgaTQwZV92ZWJfY29udGV4dCB7CisJdTE2IHNlaWQ7CisJdTE2IHVwbGlua19zZWlkOworCXUxNiB2ZWJfbnVtYmVyOworCXUxNiB2ZWJzX2FsbG9jYXRlZDsKKwl1MTYgdmVic191bmFsbG9jYXRlZDsKKwl1MTYgZmxhZ3M7CisJc3RydWN0IGk0MGVfYXFjX2dldF92ZWJfcGFyYW1ldGVyc19jb21wbGV0aW9uIGluZm87Cit9OworCiAvKiBTdGF0aXN0aWNzIGNvbGxlY3RlZCBieSBlYWNoIHBvcnQsIFZTSSwgVkVCLCBhbmQgUy1jaGFubmVsICovCiBzdHJ1Y3QgaTQwZV9ldGhfc3RhdHMgewogCXU2NCByeF9ieXRlczsJCQkvKiBnb3JjICovCkBAIC05NjIsOCArOTcyLDYgQEAKIAl1NjQgcnhfbXVsdGljYXN0OwkJLyogbXByYyAqLwogCXU2NCByeF9icm9hZGNhc3Q7CQkvKiBicHJjICovCiAJdTY0IHJ4X2Rpc2NhcmRzOwkJLyogcmRwYyAqLwotCXU2NCByeF9lcnJvcnM7CQkJLyogcmVwYyAqLwotCXU2NCByeF9taXNzZWQ7CQkJLyogcm1wYyAqLwogCXU2NCByeF91bmtub3duX3Byb3RvY29sOwkvKiBydXBwICovCiAJdTY0IHR4X2J5dGVzOwkJCS8qIGdvdGMgKi8KIAl1NjQgdHhfdW5pY2FzdDsJCQkvKiB1cHRjICovCkBAIC0xMDE1LDkgKzEwMjMsMTIgQEAKIAl1NjQgdHhfc2l6ZV9iaWc7CQkvKiBwdGM5NTIyICovCiAJdTY0IG1hY19zaG9ydF9wYWNrZXRfZHJvcHBlZDsJLyogbXNwZGMgKi8KIAl1NjQgY2hlY2tzdW1fZXJyb3I7CQkvKiB4ZWMgKi8KKwkvKiBmbG93IGRpcmVjdG9yIHN0YXRzICovCisJdTY0IGZkX2F0cl9tYXRjaDsKKwl1NjQgZmRfc2JfbWF0Y2g7CiAJLyogRUVFIExQSSAqLwotCWJvb2wgdHhfbHBpX3N0YXR1czsKLQlib29sIHJ4X2xwaV9zdGF0dXM7CisJdTMyIHR4X2xwaV9zdGF0dXM7CisJdTMyIHJ4X2xwaV9zdGF0dXM7CiAJdTY0IHR4X2xwaV9jb3VudDsJCS8qIGV0bHBpYyAqLwogCXU2NCByeF9scGlfY291bnQ7CQkvKiBlcmxwaWMgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCmluZGV4IDIyYTFiNjkuLjcwOTUxZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCkBAIC0zNDEsMTAgKzM0MSw2IEBACiAJaW50IHNldmVyaXR5OwogfTsKIAotLyogVGhlIGZvbGxvd2luZyBhcmUgVEJELCBub3QgbmVjZXNzYXJ5IGZvciBMQU4gZnVuY3Rpb25hbGl0eS4KLSAqIEk0MEVfVklSVENITkxfT1BfRkNPRQotICovCi0KIC8qIFZGIHJlc2V0IHN0YXRlcyAtIHRoZXNlIGFyZSB3cml0dGVuIGludG8gdGhlIFJTVEFUIHJlZ2lzdGVyOgogICogSTQwRV9WRkdFTl9SU1RBVDEgb24gdGhlIFBGCiAgKiBJNDBFX1ZGR0VOX1JTVEFUIG9uIHRoZSBWRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYwppbmRleCAwMmMxMWE3Li5mNWI5ZDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYwpAQCAtMjksNiArMjksMjQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKm1pc2Mgcm91dGluZXMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCisgKiBpNDBlX3ZjX2Rpc2FibGVfdmYKKyAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKgorICogRGlzYWJsZSB0aGUgVkYgdGhyb3VnaCBhIFNXIHJlc2V0CisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgaTQwZV92Y19kaXNhYmxlX3ZmKHN0cnVjdCBpNDBlX3BmICpwZiwgc3RydWN0IGk0MGVfdmYgKnZmKQoreworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CisJdTMyIHJlZzsKKworCXJlZyA9IHJkMzIoaHcsIEk0MEVfVlBHRU5fVkZSVFJJRyh2Zi0+dmZfaWQpKTsKKwlyZWcgfD0gSTQwRV9WUEdFTl9WRlJUUklHX1ZGU1dSX01BU0s7CisJd3IzMihodywgSTQwRV9WUEdFTl9WRlJUUklHKHZmLT52Zl9pZCksIHJlZyk7CisJaTQwZV9mbHVzaChodyk7Cit9CisKKy8qKgogICogaTQwZV92Y19pc3ZhbGlkX3ZzaV9pZAogICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCiAgKiBAdnNpX2lkOiB2ZiByZWxhdGl2ZSB2c2kgaWQKQEAgLTIzMCw5ICsyNDgsOCBAQAogCXR4X2N0eC5xbGVuID0gaW5mby0+cmluZ19sZW47CiAJdHhfY3R4LnJkeWxpc3QgPSBsZTE2X3RvX2NwdShwZi0+dnNpW3ZzaV9pZHhdLT5pbmZvLnFzX2hhbmRsZVswXSk7CiAJdHhfY3R4LnJkeWxpc3RfYWN0ID0gMDsKLQl0eF9jdHguaGVhZF93Yl9lbmEgPSAxOwotCXR4X2N0eC5oZWFkX3diX2FkZHIgPSBpbmZvLT5kbWFfcmluZ19hZGRyICsKLQkJCSAgICAgIChpbmZvLT5yaW5nX2xlbiAqIHNpemVvZihzdHJ1Y3QgaTQwZV90eF9kZXNjKSk7CisJdHhfY3R4LmhlYWRfd2JfZW5hID0gaW5mby0+aGVhZHdiX2VuYWJsZWQ7CisJdHhfY3R4LmhlYWRfd2JfYWRkciA9IGluZm8tPmRtYV9oZWFkd2JfYWRkcjsKIAogCS8qIGNsZWFyIHRoZSBjb250ZXh0IGluIHRoZSBITUMgKi8KIAlyZXQgPSBpNDBlX2NsZWFyX2xhbl90eF9xdWV1ZV9jb250ZXh0KGh3LCBwZl9xdWV1ZV9pZCk7CkBAIC0zMzYsNiArMzUzLDcgQEAKIAlyeF9jdHgudHBoaGVhZF9lbmEgPSAxOwogCXJ4X2N0eC5scnhxdGhyZXNoID0gMjsKIAlyeF9jdHguY3Jjc3RyaXAgPSAxOworCXJ4X2N0eC5wcmVmZW5hID0gMTsKIAogCS8qIGNsZWFyIHRoZSBjb250ZXh0IGluIHRoZSBITUMgKi8KIAlyZXQgPSBpNDBlX2NsZWFyX2xhbl9yeF9xdWV1ZV9jb250ZXh0KGh3LCBwZl9xdWV1ZV9pZCk7CkBAIC00MTYsNiArNDM0LDE1IEBACiAJaWYgKHJldCkKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIlVuYWJsZSB0byBwcm9ncmFtIHVjYXN0IGZpbHRlcnNcbiIpOwogCisJLyogU2V0IFZGIGJhbmR3aWR0aCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAodmYtPnR4X3JhdGUpIHsKKwkJcmV0ID0gaTQwZV9hcV9jb25maWdfdnNpX2J3X2xpbWl0KCZwZi0+aHcsIHZzaS0+c2VpZCwKKwkJCQkJCSAgdmYtPnR4X3JhdGUgLyA1MCwgMCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIHNldCB0eCByYXRlLCBWRiAlZCwgZXJyb3IgY29kZSAlZC5cbiIsCisJCQkJdmYtPnZmX2lkLCByZXQpOworCX0KKwogZXJyb3JfYWxsb2NfdnNpX3JlczoKIAlyZXR1cm4gcmV0OwogfQpAQCAtODE1LDYgKzg0MiwxMCBAQAogCWtmcmVlKHBmLT52Zik7CiAJcGYtPnZmID0gTlVMTDsKIAorCS8qIFRoaXMgY2hlY2sgaXMgZm9yIHdoZW4gdGhlIGRyaXZlciBpcyB1bmxvYWRlZCB3aGlsZSBWRnMgYXJlCisJICogYXNzaWduZWQuIFNldHRpbmcgdGhlIG51bWJlciBvZiBWRnMgdG8gMCB0aHJvdWdoIHN5c2ZzIGlzIGNhdWdodAorCSAqIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGV2ZXIgZ2V0cyBjYWxsZWQuCisJICovCiAJaWYgKCFpNDBlX3Zmc19hcmVfYXNzaWduZWQocGYpKSB7CiAJCXBjaV9kaXNhYmxlX3NyaW92KHBmLT5wZGV2KTsKIAkJLyogQWNrbm93bGVkZ2UgVkZMUiBmb3IgYWxsIFZGUy4gV2l0aG91dCB0aGlzLCBWRnMgd2lsbCBmYWlsIHRvCkBAIC04NjcsNiArODk4LDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfYWxsb2M7CiAJfQorCXBmLT52ZiA9IHZmczsKIAogCS8qIGFwcGx5IGRlZmF1bHQgcHJvZmlsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fYWxsb2NfdmZzOyBpKyspIHsKQEAgLTg3NiwxMyArOTA4LDEzIEBACiAKIAkJLyogYXNzaWduIGRlZmF1bHQgY2FwYWJpbGl0aWVzICovCiAJCXNldF9iaXQoSTQwRV9WSVJUQ0hOTF9WRl9DQVBfTDIsICZ2ZnNbaV0udmZfY2Fwcyk7CisJCXZmc1tpXS5zcG9vZmNoayA9IHRydWU7CiAJCS8qIHZmIHJlc291cmNlcyBnZXQgYWxsb2NhdGVkIGR1cmluZyByZXNldCAqLwogCQlpNDBlX3Jlc2V0X3ZmKCZ2ZnNbaV0sIGZhbHNlKTsKIAogCQkvKiBlbmFibGUgdmYgdnBsYW5fcXRhYmxlIG1hcHBpbmdzICovCiAJCWk0MGVfZW5hYmxlX3ZmX21hcHBpbmdzKCZ2ZnNbaV0pOwogCX0KLQlwZi0+dmYgPSB2ZnM7CiAJcGYtPm51bV9hbGxvY192ZnMgPSBudW1fYWxsb2NfdmZzOwogCiAJaTQwZV9lbmFibGVfcGZfc3dpdGNoX2xiKHBmKTsKQEAgLTk1MSw3ICs5ODMsMTIgQEAKIAlpZiAobnVtX3ZmcykKIAkJcmV0dXJuIGk0MGVfcGNpX3NyaW92X2VuYWJsZShwZGV2LCBudW1fdmZzKTsKIAotCWk0MGVfZnJlZV92ZnMocGYpOworCWlmICghaTQwZV92ZnNfYXJlX2Fzc2lnbmVkKHBmKSkgeworCQlpNDBlX2ZyZWVfdmZzKHBmKTsKKwl9IGVsc2UgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGZyZWUgVkZzIGJlY2F1c2Ugc29tZSBhcmUgYXNzaWduZWQgdG8gVk1zLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjAyMiwxNiArMjA1OSwxNCBAQAogCX0KIAogCS8qIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IG1hYyBhZGRyZXNzICovCi0JaTQwZV9kZWxfZmlsdGVyKHZzaSwgdmYtPmRlZmF1bHRfbGFuX2FkZHIuYWRkciwgMCwgdHJ1ZSwgZmFsc2UpOworCWk0MGVfZGVsX2ZpbHRlcih2c2ksIHZmLT5kZWZhdWx0X2xhbl9hZGRyLmFkZHIsIHZmLT5wb3J0X3ZsYW5faWQsCisJCQl0cnVlLCBmYWxzZSk7CiAKLQkvKiBhZGQgdGhlIG5ldyBtYWMgYWRkcmVzcyAqLwotCWYgPSBpNDBlX2FkZF9maWx0ZXIodnNpLCBtYWMsIDAsIHRydWUsIGZhbHNlKTsKLQlpZiAoIWYpIHsKLQkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwKLQkJCSJVbmFibGUgdG8gYWRkIFZGIHVjYXN0IGZpbHRlclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcGFyYW07Ci0JfQorCS8qIERlbGV0ZSBhbGwgdGhlIGZpbHRlcnMgZm9yIHRoaXMgVlNJIC0gd2UncmUgZ29pbmcgdG8ga2lsbCBpdAorCSAqIGFueXdheS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZ2c2ktPm1hY19maWx0ZXJfbGlzdCwgbGlzdCkKKwkJaTQwZV9kZWxfZmlsdGVyKHZzaSwgZi0+bWFjYWRkciwgZi0+dmxhbiwgdHJ1ZSwgZmFsc2UpOwogCiAJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJTZXR0aW5nIE1BQyAlcE0gb24gVkYgJWRcbiIsIG1hYywgdmZfaWQpOwogCS8qIHByb2dyYW0gbWFjIGZpbHRlciAqLwpAQCAtMjA0MCw3ICsyMDc1LDcgQEAKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnJvcl9wYXJhbTsKIAl9Ci0JbWVtY3B5KHZmLT5kZWZhdWx0X2xhbl9hZGRyLmFkZHIsIG1hYywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weSh2Zi0+ZGVmYXVsdF9sYW5fYWRkci5hZGRyLCBtYWMpOwogCXZmLT5wZl9zZXRfbWFjID0gdHJ1ZTsKIAlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIlJlbG9hZCB0aGUgVkYgZHJpdmVyIHRvIG1ha2UgdGhpcyBjaGFuZ2UgZWZmZWN0aXZlLlxuIik7CiAJcmV0ID0gMDsKQEAgLTIwODgsMTggKzIxMjMsMjggQEAKIAkJZ290byBlcnJvcl9wdmlkOwogCX0KIAotCWlmICh2c2ktPmluZm8ucHZpZCA9PSAwICYmIGk0MGVfaXNfdnNpX2luX3ZsYW4odnNpKSkKKwlpZiAodnNpLT5pbmZvLnB2aWQgPT0gMCAmJiBpNDBlX2lzX3ZzaV9pbl92bGFuKHZzaSkpIHsKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwKIAkJCSJWRiAlZCBoYXMgYWxyZWFkeSBjb25maWd1cmVkIFZMQU4gZmlsdGVycyBhbmQgdGhlIGFkbWluaXN0cmF0b3IgaXMgcmVxdWVzdGluZyBhIHBvcnQgVkxBTiBvdmVycmlkZS5cblBsZWFzZSB1bmxvYWQgYW5kIHJlbG9hZCB0aGUgVkYgZHJpdmVyIGZvciB0aGlzIGNoYW5nZSB0byB0YWtlIGVmZmVjdC5cbiIsCiAJCQl2Zl9pZCk7CisJCS8qIEFkbWluaXN0cmF0b3IgRXJyb3IgLSBrbm9jayB0aGUgVkYgb2ZmbGluZSB1bnRpbCBoZSBkb2VzCisJCSAqIHRoZSByaWdodCB0aGluZyBieSByZWNvbmZpZ3VyaW5nIGhpcyBuZXR3b3JrIGNvcnJlY3RseQorCQkgKiBhbmQgdGhlbiByZWxvYWRpbmcgdGhlIFZGIGRyaXZlci4KKwkJICovCisJCWk0MGVfdmNfZGlzYWJsZV92ZihwZiwgdmYpOworCX0KIAogCS8qIENoZWNrIGZvciBjb25kaXRpb24gd2hlcmUgdGhlcmUgd2FzIGFscmVhZHkgYSBwb3J0IFZMQU4gSUQKIAkgKiBmaWx0ZXIgc2V0IGFuZCBub3cgaXQgaXMgYmVpbmcgZGVsZXRlZCBieSBzZXR0aW5nIGl0IHRvIHplcm8uCisJICogQWRkaXRpb25hbGx5IGNoZWNrIGZvciB0aGUgY29uZGl0aW9uIHdoZXJlIHRoZXJlIHdhcyBhIHBvcnQKKwkgKiBWTEFOIGJ1dCBub3cgdGhlcmUgaXMgYSBuZXcgYW5kIGRpZmZlcmVudCBwb3J0IFZMQU4gYmVpbmcgc2V0LgogCSAqIEJlZm9yZSBkZWxldGluZyBhbGwgdGhlIG9sZCBWTEFOIGZpbHRlcnMgd2UgbXVzdCBhZGQgbmV3IG9uZXMKIAkgKiB3aXRoIC0xIChJNDBFX1ZMQU5fQU5ZKSBvciBvdGhlcndpc2Ugd2UncmUgbGVmdCB3aXRoIGFsbCBvdXIKIAkgKiBNQUMgYWRkcmVzc2VzIGRlbGV0ZWQuCiAJICovCi0JaWYgKCEodmxhbl9pZCB8fCBxb3MpICYmIHZzaS0+aW5mby5wdmlkKQorCWlmICgoISh2bGFuX2lkIHx8IHFvcykgfHwKKwkgICAgKHZsYW5faWQgfCBxb3MpICE9IGxlMTZfdG9fY3B1KHZzaS0+aW5mby5wdmlkKSkgJiYKKwkgICAgdnNpLT5pbmZvLnB2aWQpCiAJCXJldCA9IGk0MGVfdnNpX2FkZF92bGFuKHZzaSwgSTQwRV9WTEFOX0FOWSk7CiAKIAlpZiAodnNpLT5pbmZvLnB2aWQpIHsKQEAgLTIxNTAsNiArMjE5NSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBJNDBFX0JXX0NSRURJVF9ESVZJU09SIDUwICAgICAvKiA1ME1icHMgcGVyIEJXIGNyZWRpdCAqLworI2RlZmluZSBJNDBFX01BWF9CV19JTkFDVElWRV9BQ0NVTSA0ICAvKiBkZXZpY2UgY2FuIGFjY3VtdWxhdGUgNCBjcmVkaXRzIG1heCAqLwogLyoqCiAgKiBpNDBlX25kb19zZXRfdmZfYncKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTIxNTgsOSArMjIwNSw3NiBAQAogICoKICAqIGNvbmZpZ3VyZSB2ZiB0eCByYXRlCiAgKiovCi1pbnQgaTQwZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgaW50IHR4X3JhdGUpCitpbnQgaTQwZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgaW50IG1pbl90eF9yYXRlLAorCQkgICAgICAgaW50IG1heF90eF9yYXRlKQogewotCXJldHVybiAtRU9QTk9UU1VQUDsKKwlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IG5wLT52c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfdnNpICp2c2k7CisJc3RydWN0IGk0MGVfdmYgKnZmOworCWludCBzcGVlZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKiB2YWxpZGF0ZSB0aGUgcmVxdWVzdCAqLworCWlmICh2Zl9pZCA+PSBwZi0+bnVtX2FsbG9jX3ZmcykgeworCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBWRiBJZGVudGlmaWVyICVkLlxuIiwgdmZfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChtaW5fdHhfcmF0ZSkgeworCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtaW4gdHggcmF0ZSAoJWQpIChncmVhdGVyIHRoYW4gMCkgc3BlY2lmaWVkIGZvciB2ZiAlZC5cbiIsCisJCQltaW5fdHhfcmF0ZSwgdmZfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2ZiA9ICYocGYtPnZmW3ZmX2lkXSk7CisJdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pbmRleF07CisJaWYgKCF0ZXN0X2JpdChJNDBFX1ZGX1NUQVRfSU5JVCwgJnZmLT52Zl9zdGF0ZXMpKSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJVbmluaXRpYWxpemVkIFZGICVkLlxuIiwgdmZfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXN3aXRjaCAocGYtPmh3LnBoeS5saW5rX2luZm8ubGlua19zcGVlZCkgeworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzQwR0I6CisJCXNwZWVkID0gNDAwMDA7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwR0I6CisJCXNwZWVkID0gMTAwMDA7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzFHQjoKKwkJc3BlZWQgPSAxMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAobWF4X3R4X3JhdGUgPiBzcGVlZCkgeworCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtYXggdHggcmF0ZSAlZCBzcGVjaWZpZWQgZm9yIHZmICVkLiIsCisJCQltYXhfdHhfcmF0ZSwgdmYtPnZmX2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKG1heF90eF9yYXRlIDwgNTApICYmIChtYXhfdHhfcmF0ZSA+IDApKSB7CisJCWRldl93YXJuKCZwZi0+cGRldi0+ZGV2LCAiU2V0dGluZyBtYXggVHggcmF0ZSB0byBtaW5pbXVtIHVzYWJsZSB2YWx1ZSBvZiA1ME1icHMuXG4iKTsKKwkJbWF4X3R4X3JhdGUgPSA1MDsKKwl9CisKKwkvKiBUeCByYXRlIGNyZWRpdHMgYXJlIGluIHZhbHVlcyBvZiA1ME1icHMsIDAgaXMgZGlzYWJsZWQqLworCXJldCA9IGk0MGVfYXFfY29uZmlnX3ZzaV9id19saW1pdCgmcGYtPmh3LCB2c2ktPnNlaWQsCisJCQkJCSAgbWF4X3R4X3JhdGUgLyBJNDBFX0JXX0NSRURJVF9ESVZJU09SLAorCQkJCQkgIEk0MEVfTUFYX0JXX0lOQUNUSVZFX0FDQ1VNLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IG1heCB0eCByYXRlLCBlcnJvciBjb2RlICVkLlxuIiwKKwkJCXJldCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCXZmLT50eF9yYXRlID0gbWF4X3R4X3JhdGU7CitlcnJvcjoKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTIyMDAsMTAgKzIzMTQsMTggQEAKIAogCW1lbWNweSgmaXZpLT5tYWMsIHZmLT5kZWZhdWx0X2xhbl9hZGRyLmFkZHIsIEVUSF9BTEVOKTsKIAotCWl2aS0+dHhfcmF0ZSA9IDA7CisJaXZpLT5tYXhfdHhfcmF0ZSA9IHZmLT50eF9yYXRlOworCWl2aS0+bWluX3R4X3JhdGUgPSAwOwogCWl2aS0+dmxhbiA9IGxlMTZfdG9fY3B1KHZzaS0+aW5mby5wdmlkKSAmIEk0MEVfVkxBTl9NQVNLOwogCWl2aS0+cW9zID0gKGxlMTZfdG9fY3B1KHZzaS0+aW5mby5wdmlkKSAmIEk0MEVfUFJJT1JJVFlfTUFTSykgPj4KIAkJICAgSTQwRV9WTEFOX1BSSU9SSVRZX1NISUZUOworCWlmICh2Zi0+bGlua19mb3JjZWQgPT0gZmFsc2UpCisJCWl2aS0+bGlua3N0YXRlID0gSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE87CisJZWxzZSBpZiAodmYtPmxpbmtfdXAgPT0gdHJ1ZSkKKwkJaXZpLT5saW5rc3RhdGUgPSBJRkxBX1ZGX0xJTktfU1RBVEVfRU5BQkxFOworCWVsc2UKKwkJaXZpLT5saW5rc3RhdGUgPSBJRkxBX1ZGX0xJTktfU1RBVEVfRElTQUJMRTsKKwlpdmktPnNwb29mY2hrID0gdmYtPnNwb29mY2hrOwogCXJldCA9IDA7CiAKIGVycm9yX3BhcmFtOgpAQCAtMjI3MCwzICsyMzkyLDUwIEBACiBlcnJvcl9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBpNDBlX25kb19zZXRfdmZfc3Bvb2ZjaGsKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB2Zl9pZDogdmYgaWRlbnRpZmllcgorICogQGVuYWJsZTogZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlCisgKgorICogRW5hYmxlIG9yIGRpc2FibGUgVkYgc3Bvb2YgY2hlY2tpbmcKKyAqKi8KK2ludCBpNDBlX25kb19zZXRfdmZfc3Bvb2ZjayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBucC0+dnNpOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKwlzdHJ1Y3QgaTQwZV92c2lfY29udGV4dCBjdHh0OworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CisJc3RydWN0IGk0MGVfdmYgKnZmOworCWludCByZXQgPSAwOworCisJLyogdmFsaWRhdGUgdGhlIHJlcXVlc3QgKi8KKwlpZiAodmZfaWQgPj0gcGYtPm51bV9hbGxvY192ZnMpIHsKKwkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIkludmFsaWQgVkYgSWRlbnRpZmllciAlZFxuIiwgdmZfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl2ZiA9ICYocGYtPnZmW3ZmX2lkXSk7CisKKwlpZiAoZW5hYmxlID09IHZmLT5zcG9vZmNoaykKKwkJZ290byBvdXQ7CisKKwl2Zi0+c3Bvb2ZjaGsgPSBlbmFibGU7CisJbWVtc2V0KCZjdHh0LCAwLCBzaXplb2YoY3R4dCkpOworCWN0eHQuc2VpZCA9IHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdLT5zZWlkOworCWN0eHQucGZfbnVtID0gcGYtPmh3LnBmX2lkOworCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyA9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU0VDVVJJVFlfVkFMSUQpOworCWlmIChlbmFibGUpCisJCWN0eHQuaW5mby5zZWNfZmxhZ3MgfD0gSTQwRV9BUV9WU0lfU0VDX0ZMQUdfRU5BQkxFX01BQ19DSEs7CisJcmV0ID0gaTQwZV9hcV91cGRhdGVfdnNpX3BhcmFtcyhodywgJmN0eHQsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIkVycm9yICVkIHVwZGF0aW5nIFZTSSBwYXJhbWV0ZXJzXG4iLAorCQkJcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmgKaW5kZXggMzg5YzQ3Zi4uNjNlN2UwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmgKQEAgLTk4LDggKzk4LDEwIEBACiAKIAl1bnNpZ25lZCBsb25nIHZmX2NhcHM7CS8qIHZmJ3MgYWR2LiBjYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBsb25nIHZmX3N0YXRlczsJLyogdmYncyBydW50aW1lIHN0YXRlcyAqLworCXVuc2lnbmVkIGludCB0eF9yYXRlOwkvKiBUeCBiYW5kd2lkdGggbGltaXQgaW4gTWJwcyAqLwogCWJvb2wgbGlua19mb3JjZWQ7CiAJYm9vbCBsaW5rX3VwOwkJLyogb25seSB2YWxpZCBpZiB2ZiBsaW5rIGlzIGZvcmNlZCAqLworCWJvb2wgc3Bvb2ZjaGs7CiB9OwogCiB2b2lkIGk0MGVfZnJlZV92ZnMoc3RydWN0IGk0MGVfcGYgKnBmKTsKQEAgLTExNSwxMCArMTE3LDEyIEBACiBpbnQgaTQwZV9uZG9fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIHU4ICptYWMpOwogaW50IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcyk7Ci1pbnQgaTQwZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgaW50IHR4X3JhdGUpOworaW50IGk0MGVfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIGludCBtaW5fdHhfcmF0ZSwKKwkJICAgICAgIGludCBtYXhfdHhfcmF0ZSk7CiBpbnQgaTQwZV9uZG9fZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgaW50IHZmX2lkLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpOwogaW50IGk0MGVfbmRvX3NldF92Zl9saW5rX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgaW50IGxpbmspOworaW50IGk0MGVfbmRvX3NldF92Zl9zcG9vZmNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgYm9vbCBlbmFibGUpOwogCiB2b2lkIGk0MGVfdmNfbm90aWZ5X2xpbmtfc3RhdGUoc3RydWN0IGk0MGVfcGYgKnBmKTsKIHZvaWQgaTQwZV92Y19ub3RpZnlfcmVzZXQoc3RydWN0IGk0MGVfcGYgKnBmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9NYWtlZmlsZQppbmRleCBlMDliZTM3Li4zYTQyMzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKICMgSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIKLSMgQ29weXJpZ2h0KGMpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24uCisjIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICMKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogIyBtb3JlIGRldGFpbHMuCiAjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIwogIyBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogIyB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogIwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnEuYwppbmRleCA1NDcwY2U5Li5lYjY3Y2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTIsNiArMTIsOSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCiAgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KICAqCkBAIC0yOCw2ICszMSwxNiBAQAogI2luY2x1ZGUgImk0MGVfcHJvdG90eXBlLmgiCiAKIC8qKgorICogaTQwZV9pc19udm1fdXBkYXRlX29wIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBOVk0gdXBkYXRlIG9wZXJhdGlvbgorICogQGRlc2M6IEFQSSByZXF1ZXN0IGRlc2NyaXB0b3IKKyAqKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpNDBlX2lzX252bV91cGRhdGVfb3Aoc3RydWN0IGk0MGVfYXFfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gKGRlc2MtPm9wY29kZSA9PSBpNDBlX2FxY19vcGNfbnZtX2VyYXNlKSB8fAorCSAgICAgICAoZGVzYy0+b3Bjb2RlID09IGk0MGVfYXFjX29wY19udm1fdXBkYXRlKTsKK30KKworLyoqCiAgKiAgaTQwZV9hZG1pbnFfaW5pdF9yZWdzIC0gSW5pdGlhbGl6ZSBBZG1pblEgcmVnaXN0ZXJzCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCkBAIC0yNzYsOCArMjg5LDExIEBACiAgKgogICogIENvbmZpZ3VyZSBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCByZWdpc3RlcnMgZm9yIHRoZSB0cmFuc21pdCBxdWV1ZQogICoqLwotc3RhdGljIHZvaWQgaTQwZV9jb25maWdfYXNxX3JlZ3Moc3RydWN0IGk0MGVfaHcgKmh3KQorc3RhdGljIGk0MGVfc3RhdHVzIGk0MGVfY29uZmlnX2FzcV9yZWdzKHN0cnVjdCBpNDBlX2h3ICpodykKIHsKKwlpNDBlX3N0YXR1cyByZXRfY29kZSA9IDA7CisJdTMyIHJlZyA9IDA7CisKIAlpZiAoaHctPm1hYy50eXBlID09IEk0MEVfTUFDX1ZGKSB7CiAJCS8qIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgcXVldWUgKi8KIAkJd3IzMihodywgSTQwRV9WRl9BVFFCQUgxLApAQCAtMjg2LDYgKzMwMiw3IEBACiAJCSAgICBsb3dlcl8zMl9iaXRzKGh3LT5hcS5hc3EuZGVzY19idWYucGEpKTsKIAkJd3IzMihodywgSTQwRV9WRl9BVFFMRU4xLCAoaHctPmFxLm51bV9hc3FfZW50cmllcyB8CiAJCQkJCSAgSTQwRV9WRl9BVFFMRU4xX0FUUUVOQUJMRV9NQVNLKSk7CisJCXJlZyA9IHJkMzIoaHcsIEk0MEVfVkZfQVRRQkFMMSk7CiAJfSBlbHNlIHsKIAkJLyogY29uZmlndXJlIHRoZSB0cmFuc21pdCBxdWV1ZSAqLwogCQl3cjMyKGh3LCBJNDBFX1BGX0FUUUJBSCwKQEAgLTI5NCw3ICszMTEsMTQgQEAKIAkJICAgIGxvd2VyXzMyX2JpdHMoaHctPmFxLmFzcS5kZXNjX2J1Zi5wYSkpOwogCQl3cjMyKGh3LCBJNDBFX1BGX0FUUUxFTiwgKGh3LT5hcS5udW1fYXNxX2VudHJpZXMgfAogCQkJCQkgIEk0MEVfUEZfQVRRTEVOX0FUUUVOQUJMRV9NQVNLKSk7CisJCXJlZyA9IHJkMzIoaHcsIEk0MEVfUEZfQVRRQkFMKTsKIAl9CisKKwkvKiBDaGVjayBvbmUgcmVnaXN0ZXIgdG8gdmVyaWZ5IHRoYXQgY29uZmlnIHdhcyBhcHBsaWVkICovCisJaWYgKHJlZyAhPSBsb3dlcl8zMl9iaXRzKGh3LT5hcS5hc3EuZGVzY19idWYucGEpKQorCQlyZXRfY29kZSA9IEk0MEVfRVJSX0FETUlOX1FVRVVFX0VSUk9SOworCisJcmV0dXJuIHJldF9jb2RlOwogfQogCiAvKioKQEAgLTMwMyw4ICszMjcsMTEgQEAKICAqCiAgKiBDb25maWd1cmUgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggcmVnaXN0ZXJzIGZvciB0aGUgcmVjZWl2ZSAoZXZlbnQgcXVldWUpCiAgKiovCi1zdGF0aWMgdm9pZCBpNDBlX2NvbmZpZ19hcnFfcmVncyhzdHJ1Y3QgaTQwZV9odyAqaHcpCitzdGF0aWMgaTQwZV9zdGF0dXMgaTQwZV9jb25maWdfYXJxX3JlZ3Moc3RydWN0IGk0MGVfaHcgKmh3KQogeworCWk0MGVfc3RhdHVzIHJldF9jb2RlID0gMDsKKwl1MzIgcmVnID0gMDsKKwogCWlmIChody0+bWFjLnR5cGUgPT0gSTQwRV9NQUNfVkYpIHsKIAkJLyogY29uZmlndXJlIHRoZSByZWNlaXZlIHF1ZXVlICovCiAJCXdyMzIoaHcsIEk0MEVfVkZfQVJRQkFIMSwKQEAgLTMxMyw2ICszNDAsNyBAQAogCQkgICAgbG93ZXJfMzJfYml0cyhody0+YXEuYXJxLmRlc2NfYnVmLnBhKSk7CiAJCXdyMzIoaHcsIEk0MEVfVkZfQVJRTEVOMSwgKGh3LT5hcS5udW1fYXJxX2VudHJpZXMgfAogCQkJCQkgIEk0MEVfVkZfQVJRTEVOMV9BUlFFTkFCTEVfTUFTSykpOworCQlyZWcgPSByZDMyKGh3LCBJNDBFX1ZGX0FSUUJBTDEpOwogCX0gZWxzZSB7CiAJCS8qIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZSBxdWV1ZSAqLwogCQl3cjMyKGh3LCBJNDBFX1BGX0FSUUJBSCwKQEAgLTMyMSwxMCArMzQ5LDE3IEBACiAJCSAgICBsb3dlcl8zMl9iaXRzKGh3LT5hcS5hcnEuZGVzY19idWYucGEpKTsKIAkJd3IzMihodywgSTQwRV9QRl9BUlFMRU4sIChody0+YXEubnVtX2FycV9lbnRyaWVzIHwKIAkJCQkJICBJNDBFX1BGX0FSUUxFTl9BUlFFTkFCTEVfTUFTSykpOworCQlyZWcgPSByZDMyKGh3LCBJNDBFX1BGX0FSUUJBTCk7CiAJfQogCiAJLyogVXBkYXRlIHRhaWwgaW4gdGhlIEhXIHRvIHBvc3QgcHJlLWFsbG9jYXRlZCBidWZmZXJzICovCiAJd3IzMihodywgaHctPmFxLmFycS50YWlsLCBody0+YXEubnVtX2FycV9lbnRyaWVzIC0gMSk7CisKKwkvKiBDaGVjayBvbmUgcmVnaXN0ZXIgdG8gdmVyaWZ5IHRoYXQgY29uZmlnIHdhcyBhcHBsaWVkICovCisJaWYgKHJlZyAhPSBsb3dlcl8zMl9iaXRzKGh3LT5hcS5hcnEuZGVzY19idWYucGEpKQorCQlyZXRfY29kZSA9IEk0MEVfRVJSX0FETUlOX1FVRVVFX0VSUk9SOworCisJcmV0dXJuIHJldF9jb2RlOwogfQogCiAvKioKQEAgLTM3Miw3ICs0MDcsOSBAQAogCQlnb3RvIGluaXRfYWRtaW5xX2ZyZWVfcmluZ3M7CiAKIAkvKiBpbml0aWFsaXplIGJhc2UgcmVnaXN0ZXJzICovCi0JaTQwZV9jb25maWdfYXNxX3JlZ3MoaHcpOworCXJldF9jb2RlID0gaTQwZV9jb25maWdfYXNxX3JlZ3MoaHcpOworCWlmIChyZXRfY29kZSkKKwkJZ290byBpbml0X2FkbWlucV9mcmVlX3JpbmdzOwogCiAJLyogc3VjY2VzcyEgKi8KIAlnb3RvIGluaXRfYWRtaW5xX2V4aXQ7CkBAIC00MjksNyArNDY2LDkgQEAKIAkJZ290byBpbml0X2FkbWlucV9mcmVlX3JpbmdzOwogCiAJLyogaW5pdGlhbGl6ZSBiYXNlIHJlZ2lzdGVycyAqLwotCWk0MGVfY29uZmlnX2FycV9yZWdzKGh3KTsKKwlyZXRfY29kZSA9IGk0MGVfY29uZmlnX2FycV9yZWdzKGh3KTsKKwlpZiAocmV0X2NvZGUpCisJCWdvdG8gaW5pdF9hZG1pbnFfZnJlZV9yaW5nczsKIAogCS8qIHN1Y2Nlc3MhICovCiAJZ290byBpbml0X2FkbWlucV9leGl0OwpAQCAtNjU5LDYgKzY5OCwxMiBAQAogCQlnb3RvIGFzcV9zZW5kX2NvbW1hbmRfZXhpdDsKIAl9CiAKKwlpZiAoaTQwZV9pc19udm1fdXBkYXRlX29wKGRlc2MpICYmIGh3LT5hcS5udm1fYnVzeSkgeworCQlpNDBlX2RlYnVnKGh3LCBJNDBFX0RFQlVHX0FRX01FU1NBR0UsICJBUVRYOiBOVk0gYnVzeS5cbiIpOworCQlzdGF0dXMgPSBJNDBFX0VSUl9OVk07CisJCWdvdG8gYXNxX3NlbmRfY29tbWFuZF9leGl0OworCX0KKwogCWRldGFpbHMgPSBJNDBFX0FETUlOUV9ERVRBSUxTKGh3LT5hcS5hc3EsIGh3LT5hcS5hc3EubmV4dF90b191c2UpOwogCWlmIChjbWRfZGV0YWlscykgewogCQkqZGV0YWlscyA9ICpjbWRfZGV0YWlsczsKQEAgLTc4Niw2ICs4MzEsOSBAQAogCQlody0+YXEuYXNxX2xhc3Rfc3RhdHVzID0gKGVudW0gaTQwZV9hZG1pbl9xdWV1ZV9lcnIpcmV0dmFsOwogCX0KIAorCWlmIChpNDBlX2lzX252bV91cGRhdGVfb3AoZGVzYykpCisJCWh3LT5hcS5udm1fYnVzeSA9IHRydWU7CisKIAkvKiB1cGRhdGUgdGhlIGVycm9yIGlmIHRpbWUgb3V0IG9jY3VycmVkICovCiAJaWYgKCghY21kX2NvbXBsZXRlZCkgJiYKIAkgICAgKCFkZXRhaWxzLT5hc3luYyAmJiAhZGV0YWlscy0+cG9zdHBvbmUpKSB7CkBAIC04ODAsNiArOTI4LDkgQEAKIAkJCSAgICAgICBlLT5tc2dfc2l6ZSk7CiAJfQogCisJaWYgKGk0MGVfaXNfbnZtX3VwZGF0ZV9vcCgmZS0+ZGVzYykpCisJCWh3LT5hcS5udm1fYnVzeSA9IGZhbHNlOworCiAJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGF0YWxlbiBhbmQgYnVmZmVyIGFkZHJlc3MgaW4gdGhlIGRlc2MsCiAJICogRlcgdXBkYXRlcyBkYXRhbGVuIHRvIGluZGljYXRlIHRoZSBldmVudCBtZXNzYWdlCiAJICogc2l6ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnEuaAppbmRleCA4ZjcyYzMxZC4uZTM0NzJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtODcsNiArOTAsNyBAQAogCXUxNiBmd19taW5fdmVyOyAgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgbWlub3IgdmVyc2lvbiAqLwogCXUxNiBhcGlfbWFqX3ZlcjsgICAgICAgICAgICAgICAgLyogYXBpIG1ham9yIHZlcnNpb24gKi8KIAl1MTYgYXBpX21pbl92ZXI7ICAgICAgICAgICAgICAgIC8qIGFwaSBtaW5vciB2ZXJzaW9uICovCisJYm9vbCBudm1fYnVzeTsKIAogCXN0cnVjdCBtdXRleCBhc3FfbXV0ZXg7IC8qIFNlbmQgcXVldWUgbG9jayAqLwogCXN0cnVjdCBtdXRleCBhcnFfbXV0ZXg7IC8qIFJlY2VpdmUgcXVldWUgbG9jayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xX2NtZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xX2NtZC5oCmluZGV4IDk3NjYyYjYuLmU2NTZlYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FkbWlucV9jbWQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnFfY21kLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtMzEsNyArMzQsNyBAQAogICovCiAKICNkZWZpbmUgSTQwRV9GV19BUElfVkVSU0lPTl9NQUpPUiAgMHgwMDAxCi0jZGVmaW5lIEk0MEVfRldfQVBJX1ZFUlNJT05fTUlOT1IgIDB4MDAwMQorI2RlZmluZSBJNDBFX0ZXX0FQSV9WRVJTSU9OX01JTk9SICAweDAwMDIKICNkZWZpbmUgSTQwRV9GV19BUElfVkVSU0lPTl9BMF9NSU5PUiAgMHgwMDAwCiAKIHN0cnVjdCBpNDBlX2FxX2Rlc2MgewpAQCAtMTIxLDYgKzEyNCw3IEBACiAJaTQwZV9hcWNfb3BjX2dldF92ZXJzaW9uICAgICAgPSAweDAwMDEsCiAJaTQwZV9hcWNfb3BjX2RyaXZlcl92ZXJzaW9uICAgPSAweDAwMDIsCiAJaTQwZV9hcWNfb3BjX3F1ZXVlX3NodXRkb3duICAgPSAweDAwMDMsCisJaTQwZV9hcWNfb3BjX3NldF9wZl9jb250ZXh0ICAgPSAweDAwMDQsCiAKIAkvKiByZXNvdXJjZSBvd25lcnNoaXAgKi8KIAlpNDBlX2FxY19vcGNfcmVxdWVzdF9yZXNvdXJjZSA9IDB4MDAwOCwKQEAgLTE4MCw5ICsxODQsNiBAQAogCWk0MGVfYXFjX29wY19hZGRfbWlycm9yX3J1bGUgICAgPSAweDAyNjAsCiAJaTQwZV9hcWNfb3BjX2RlbGV0ZV9taXJyb3JfcnVsZSA9IDB4MDI2MSwKIAotCWk0MGVfYXFjX29wY19zZXRfc3Rvcm1fY29udHJvbF9jb25maWcgPSAweDAyODAsCi0JaTQwZV9hcWNfb3BjX2dldF9zdG9ybV9jb250cm9sX2NvbmZpZyA9IDB4MDI4MSwKLQogCS8qIERDQiBjb21tYW5kcyAqLwogCWk0MGVfYXFjX29wY19kY2JfaWdub3JlX3BmYyA9IDB4MDMwMSwKIAlpNDBlX2FxY19vcGNfZGNiX3VwZGF0ZWQgICAgPSAweDAzMDIsCkBAIC0yMDUsNiArMjA2LDcgQEAKIAlpNDBlX2FxY19vcGNfcXVlcnlfc3dpdGNoaW5nX2NvbXBfYndfY29uZmlnICAgICAgICA9IDB4MDQxQSwKIAlpNDBlX2FxY19vcGNfc3VzcGVuZF9wb3J0X3R4ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQxQiwKIAlpNDBlX2FxY19vcGNfcmVzdW1lX3BvcnRfdHggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQxQywKKwlpNDBlX2FxY19vcGNfY29uZmlndXJlX3BhcnRpdGlvbl9idyAgICAgICAgICAgICAgICA9IDB4MDQxRCwKIAogCS8qIGhtYyAqLwogCWk0MGVfYXFjX29wY19xdWVyeV9obWNfcmVzb3VyY2VfcHJvZmlsZSA9IDB4MDUwMCwKQEAgLTIyMiwxMyArMjI0LDE1IEBACiAJaTQwZV9hcWNfb3BjX2dldF9wYXJ0bmVyX2FkdnQgICAgPSAweDA2MTYsCiAJaTQwZV9hcWNfb3BjX3NldF9sYl9tb2RlcyAgICAgICAgPSAweDA2MTgsCiAJaTQwZV9hcWNfb3BjX2dldF9waHlfd29sX2NhcHMgICAgPSAweDA2MjEsCi0JaTQwZV9hcWNfb3BjX3NldF9waHlfcmVzZXQgICAgICAgPSAweDA2MjIsCisJaTQwZV9hcWNfb3BjX3NldF9waHlfZGVidWcJID0gMHgwNjIyLAogCWk0MGVfYXFjX29wY191cGxvYWRfZXh0X3BoeV9mbSAgID0gMHgwNjI1LAogCiAJLyogTlZNIGNvbW1hbmRzICovCi0JaTQwZV9hcWNfb3BjX252bV9yZWFkICAgPSAweDA3MDEsCi0JaTQwZV9hcWNfb3BjX252bV9lcmFzZSAgPSAweDA3MDIsCi0JaTQwZV9hcWNfb3BjX252bV91cGRhdGUgPSAweDA3MDMsCisJaTQwZV9hcWNfb3BjX252bV9yZWFkICAgICAgICAgPSAweDA3MDEsCisJaTQwZV9hcWNfb3BjX252bV9lcmFzZSAgICAgICAgPSAweDA3MDIsCisJaTQwZV9hcWNfb3BjX252bV91cGRhdGUgICAgICAgPSAweDA3MDMsCisJaTQwZV9hcWNfb3BjX252bV9jb25maWdfcmVhZCAgPSAweDA3MDQsCisJaTQwZV9hcWNfb3BjX252bV9jb25maWdfd3JpdGUgPSAweDA3MDUsCiAKIAkvKiB2aXJ0dWFsaXphdGlvbiBjb21tYW5kcyAqLwogCWk0MGVfYXFjX29wY19zZW5kX21zZ190b19wZiAgID0gMHgwODAxLApAQCAtMjcwLDggKzI3NCw2IEBACiAJaTQwZV9hcWNfb3BjX2RlYnVnX3NldF9tb2RlICAgICAgICAgPSAweEZGMDEsCiAJaTQwZV9hcWNfb3BjX2RlYnVnX3JlYWRfcmVnICAgICAgICAgPSAweEZGMDMsCiAJaTQwZV9hcWNfb3BjX2RlYnVnX3dyaXRlX3JlZyAgICAgICAgPSAweEZGMDQsCi0JaTQwZV9hcWNfb3BjX2RlYnVnX3JlYWRfcmVnX3NnICAgICAgPSAweEZGMDUsCi0JaTQwZV9hcWNfb3BjX2RlYnVnX3dyaXRlX3JlZ19zZyAgICAgPSAweEZGMDYsCiAJaTQwZV9hcWNfb3BjX2RlYnVnX21vZGlmeV9yZWcgICAgICAgPSAweEZGMDcsCiAJaTQwZV9hcWNfb3BjX2RlYnVnX2R1bXBfaW50ZXJuYWxzICAgPSAweEZGMDgsCiAJaTQwZV9hcWNfb3BjX2RlYnVnX21vZGlmeV9pbnRlcm5hbHMgPSAweEZGMDksCkBAIC0zMzksNiArMzQxLDE0IEBACiAKIEk0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxY19xdWV1ZV9zaHV0ZG93bik7CiAKKy8qIFNldCBQRiBjb250ZXh0ICgweDAwMDQsIGRpcmVjdCkgKi8KK3N0cnVjdCBpNDBlX2FxY19zZXRfcGZfY29udGV4dCB7CisJdTgJcGZfaWQ7CisJdTgJcmVzZXJ2ZWRbMTVdOworfTsKKworSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX3NldF9wZl9jb250ZXh0KTsKKwogLyogUmVxdWVzdCByZXNvdXJjZSBvd25lcnNoaXAgKGRpcmVjdCAweDAwMDgpCiAgKiBSZWxlYXNlIHJlc291cmNlIG93bmVyc2hpcCAoZGlyZWN0IDB4MDAwOSkKICAqLwpAQCAtNjc4LDcgKzY4OCw2IEBACiAjZGVmaW5lIEk0MEVfQVFfVlNJX1RZUEVfUEYgICAgICAgICAgICAgMHgyCiAjZGVmaW5lIEk0MEVfQVFfVlNJX1RZUEVfRU1QX01ORyAgICAgICAgMHgzCiAjZGVmaW5lIEk0MEVfQVFfVlNJX0ZMQUdfQ0FTQ0FERURfUFYgICAgMHg0Ci0jZGVmaW5lIEk0MEVfQVFfVlNJX0ZMQUdfQ0xPVURfVlNJICAgICAgMHg4CiAJX19sZTMyIGFkZHJfaGlnaDsKIAlfX2xlMzIgYWRkcl9sb3c7CiB9OwpAQCAtMTA0MCw3ICsxMDQ5LDkgQEAKICNkZWZpbmUgSTQwRV9BUUNfU0VUX1ZTSV9QUk9NSVNDX1ZMQU4gICAgICAgIDB4MTAKIAlfX2xlMTYgc2VpZDsKICNkZWZpbmUgSTQwRV9BUUNfVlNJX1BST01fQ01EX1NFSURfTUFTSyAgICAgIDB4M0ZGCi0JdTggICAgIHJlc2VydmVkWzEwXTsKKwlfX2xlMTYgdmxhbl90YWc7CisjZGVmaW5lIEk0MEVfQVFDX1NFVF9WU0lfVkxBTl9WQUxJRCAgICAgICAgICAweDgwMDAKKwl1OCAgICAgcmVzZXJ2ZWRbOF07CiB9OwogCiBJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcWNfc2V0X3ZzaV9wcm9taXNjdW91c19tb2Rlcyk7CkBAIC0xMjg5LDI3ICsxMzAwLDYgQEAKIAogSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX2FkZF9kZWxldGVfbWlycm9yX3J1bGVfY29tcGxldGlvbik7CiAKLS8qIFNldCBTdG9ybSBDb250cm9sIENvbmZpZ3VyYXRpb24gKGRpcmVjdCAweDAyODApCi0gKiBHZXQgU3Rvcm0gQ29udHJvbCBDb25maWd1cmF0aW9uIChkaXJlY3QgMHgwMjgxKQotICogICAgdGhlIGNvbW1hbmQgYW5kIHJlc3BvbnNlIHVzZSB0aGUgc2FtZSBkZXNjcmlwdG9yIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgaTQwZV9hcWNfc2V0X2dldF9zdG9ybV9jb250cm9sX2NvbmZpZyB7Ci0JX19sZTMyIGJyb2FkY2FzdF90aHJlc2hvbGQ7Ci0JX19sZTMyIG11bHRpY2FzdF90aHJlc2hvbGQ7Ci0JX19sZTMyIGNvbnRyb2xfZmxhZ3M7Ci0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfTURJUFcgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfTURJQ1cgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfQkRJUFcgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfQkRJQ1cgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfQklEVSAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfSU5URVJWQUxfU0hJRlQgICA4Ci0jZGVmaW5lIEk0MEVfQVFDX1NUT1JNX0NPTlRST0xfSU5URVJWQUxfTUFTSyAgICAoMHgzRkYgPDwgXAotCQkJCQlJNDBFX0FRQ19TVE9STV9DT05UUk9MX0lOVEVSVkFMX1NISUZUKQotCXU4ICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLUk0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxY19zZXRfZ2V0X3N0b3JtX2NvbnRyb2xfY29uZmlnKTsKLQogLyogRENCIDB4MDN4eCovCiAKIC8qIFBGQyBJZ25vcmUgKGRpcmVjdCAweDAzMDEpCkBAIC0xNDI3LDExICsxNDE3LDEyIEBACiBzdHJ1Y3QgaTQwZV9hcWNfY29uZmlndXJlX3N3aXRjaGluZ19jb21wX2V0c19kYXRhIHsKIAl1OCAgICAgcmVzZXJ2ZWRbNF07CiAJdTggICAgIHRjX3ZhbGlkX2JpdHM7Ci0JdTggICAgIHJlc2VydmVkMTsKKwl1OCAgICAgc2VlcGFnZTsKKyNkZWZpbmUgSTQwRV9BUV9FVFNfU0VFUEFHRV9FTl9NQVNLICAgICAweDEKIAl1OCAgICAgdGNfc3RyaWN0X3ByaW9yaXR5X2ZsYWdzOwotCXU4ICAgICByZXNlcnZlZDJbMTddOworCXU4ICAgICByZXNlcnZlZDFbMTddOwogCXU4ICAgICB0Y19id19zaGFyZV9jcmVkaXRzWzhdOwotCXU4ICAgICByZXNlcnZlZDNbOTZdOworCXU4ICAgICByZXNlcnZlZDJbOTZdOwogfTsKIAogLyogQ29uZmlndXJlIFN3aXRjaGluZyBDb21wb25lbnQgQmFuZHdpZHRoIExpbWl0cyBwZXIgVGMgKGluZGlyZWN0IDB4MDQxNikgKi8KQEAgLTE0OTksNiArMTQ5MCwxNSBAQAogICogKGRpcmVjdCAweDA0MUIgYW5kIDB4MDQxQykgdXNlcyB0aGUgZ2VuZXJpYyBTRUlEIHN0cnVjdAogICovCiAKKy8qIENvbmZpZ3VyZSBwYXJ0aXRpb24gQlcKKyAqIChpbmRpcmVjdCAweDA0MUQpCisgKi8KK3N0cnVjdCBpNDBlX2FxY19jb25maWd1cmVfcGFydGl0aW9uX2J3X2RhdGEgeworCV9fbGUxNiBwZl92YWxpZF9iaXRzOworCXU4ICAgICBtaW5fYndbMTZdOyAgICAgIC8qIGd1YXJhbnRlZWQgYmFuZHdpZHRoICovCisJdTggICAgIG1heF9id1sxNl07ICAgICAgLyogYmFuZHdpZHRoIGxpbWl0ICovCit9OworCiAvKiBHZXQgYW5kIHNldCB0aGUgYWN0aXZlIEhNQyByZXNvdXJjZSBwcm9maWxlIGFuZCBzdGF0dXMuCiAgKiAoZGlyZWN0IDB4MDUwMCkgYW5kIChkaXJlY3QgMHgwNTAxKQogICovCkBAIC0xNTM5LDYgKzE1MzksOCBAQAogCUk0MEVfUEhZX1RZUEVfWExQUEkJCQk9IDB4OSwKIAlJNDBFX1BIWV9UWVBFXzQwR0JBU0VfQ1I0X0NVCQk9IDB4QSwKIAlJNDBFX1BIWV9UWVBFXzEwR0JBU0VfQ1IxX0NVCQk9IDB4QiwKKwlJNDBFX1BIWV9UWVBFXzEwR0JBU0VfQU9DCQk9IDB4QywKKwlJNDBFX1BIWV9UWVBFXzQwR0JBU0VfQU9DCQk9IDB4RCwKIAlJNDBFX1BIWV9UWVBFXzEwMEJBU0VfVFgJCT0gMHgxMSwKIAlJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX1QJCT0gMHgxMiwKIAlJNDBFX1BIWV9UWVBFXzEwR0JBU0VfVAkJCT0gMHgxMywKQEAgLTE1NDksNyArMTU1MSwxMCBAQAogCUk0MEVfUEhZX1RZUEVfNDBHQkFTRV9DUjQJCT0gMHgxOCwKIAlJNDBFX1BIWV9UWVBFXzQwR0JBU0VfU1I0CQk9IDB4MTksCiAJSTQwRV9QSFlfVFlQRV80MEdCQVNFX0xSNAkJPSAweDFBLAotCUk0MEVfUEhZX1RZUEVfMjBHQkFTRV9LUjIJCT0gMHgxQiwKKwlJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX1NYCQk9IDB4MUIsCisJSTQwRV9QSFlfVFlQRV8xMDAwQkFTRV9MWAkJPSAweDFDLAorCUk0MEVfUEhZX1RZUEVfMTAwMEJBU0VfVF9PUFRJQ0FMCT0gMHgxRCwKKwlJNDBFX1BIWV9UWVBFXzIwR0JBU0VfS1IyCQk9IDB4MUUsCiAJSTQwRV9QSFlfVFlQRV9NQVgKIH07CiAKQEAgLTE1ODMsMTEgKzE1ODgsOCBAQAogI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX1BBVVNFX1RYICAgICAgICAgMHgwMQogI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX1BBVVNFX1JYICAgICAgICAgMHgwMgogI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0xPV19QT1dFUiAgICAgICAgMHgwNAotI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0FOX1NISUZUICAgICAgICAgMwotI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0FOX01BU0sgICAgICAgICAgKDB4MyA8PCBJNDBFX0FRX1BIWV9GTEFHX0FOX1NISUZUKQotI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0FOX09GRiAgICAgICAgICAgMHgwMCAvKiBsaW5rIGZvcmNlZCBvbiAqLwotI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0FOX09GRl9MSU5LX0RPV04gMHgwMQotI2RlZmluZSBJNDBFX0FRX1BIWV9GTEFHX0FOX09OICAgICAgICAgICAgMHgwMgorI2RlZmluZSBJNDBFX0FRX1BIWV9MSU5LX0VOQUJMRUQJCSAgMHgwOAorI2RlZmluZSBJNDBFX0FRX1BIWV9BTl9FTkFCTEVECQkJICAweDEwCiAjZGVmaW5lIEk0MEVfQVFfUEhZX0ZMQUdfTU9EVUxFX1FVQUwgICAgICAweDIwCiAJX19sZTE2IGVlZV9jYXBhYmlsaXR5OwogI2RlZmluZSBJNDBFX0FRX0VFRV8xMDBCQVNFX1RYICAgICAgIDB4MDAwMgpAQCAtMTY5Niw2ICsxNjk4LDcgQEAKICNkZWZpbmUgSTQwRV9BUV9MSU5LX1RYX0FDVElWRSAgICAgICAweDAwCiAjZGVmaW5lIEk0MEVfQVFfTElOS19UWF9EUkFJTkVEICAgICAgMHgwMQogI2RlZmluZSBJNDBFX0FRX0xJTktfVFhfRkxVU0hFRCAgICAgIDB4MDMKKyNkZWZpbmUgSTQwRV9BUV9MSU5LX0ZPUkNFRF80MEcgICAgICAweDEwCiAJdTggICAgIGxvb3BiYWNrOyAgICAgICAgIC8qIHVzZSBkZWZpbmVzIGZyb20gaTQwZV9hcWNfc2V0X2xiX21vZGUgKi8KIAlfX2xlMTYgbWF4X2ZyYW1lX3NpemU7CiAJdTggICAgIGNvbmZpZzsKQEAgLTE3NDcsMTQgKzE3NTAsMjEgQEAKIAogSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX3NldF9sYl9tb2RlKTsKIAotLyogU2V0IFBIWSBSZXNldCBjb21tYW5kICgweDA2MjIpICovCi1zdHJ1Y3QgaTQwZV9hcWNfc2V0X3BoeV9yZXNldCB7Ci0JdTggICAgIHJlc2V0X2ZsYWdzOwotI2RlZmluZSBJNDBFX0FRX1BIWV9SRVNFVF9SRVFVRVNUICAweDAyCisvKiBTZXQgUEhZIERlYnVnIGNvbW1hbmQgKDB4MDYyMikgKi8KK3N0cnVjdCBpNDBlX2FxY19zZXRfcGh5X2RlYnVnIHsKKwl1OCAgICAgY29tbWFuZF9mbGFnczsKKyNkZWZpbmUgSTQwRV9BUV9QSFlfREVCVUdfUkVTRVRfSU5URVJOQUwJMHgwMgorI2RlZmluZSBJNDBFX0FRX1BIWV9ERUJVR19SRVNFVF9FWFRFUk5BTF9TSElGVAkyCisjZGVmaW5lIEk0MEVfQVFfUEhZX0RFQlVHX1JFU0VUX0VYVEVSTkFMX01BU0sJKDB4MDMgPDwgXAorCQkJCQlJNDBFX0FRX1BIWV9ERUJVR19SRVNFVF9FWFRFUk5BTF9TSElGVCkKKyNkZWZpbmUgSTQwRV9BUV9QSFlfREVCVUdfUkVTRVRfRVhURVJOQUxfTk9ORQkweDAwCisjZGVmaW5lIEk0MEVfQVFfUEhZX0RFQlVHX1JFU0VUX0VYVEVSTkFMX0hBUkQJMHgwMQorI2RlZmluZSBJNDBFX0FRX1BIWV9ERUJVR19SRVNFVF9FWFRFUk5BTF9TT0ZUCTB4MDIKKyNkZWZpbmUgSTQwRV9BUV9QSFlfREVCVUdfRElTQUJMRV9MSU5LX0ZXCTB4MTAKIAl1OCAgICAgcmVzZXJ2ZWRbMTVdOwogfTsKIAotSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX3NldF9waHlfcmVzZXQpOworSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX3NldF9waHlfZGVidWcpOwogCiBlbnVtIGk0MGVfYXFfcGh5X3JlZ190eXBlIHsKIAlJNDBFX0FRQ19QSFlfUkVHX0lOVEVSTkFMICAgICAgICAgPSAweDEsCkBAIC0xNzc5LDYgKzE3ODksNDcgQEAKIAogSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX252bV91cGRhdGUpOwogCisvKiBOVk0gQ29uZmlnIFJlYWQgKGluZGlyZWN0IDB4MDcwNCkgKi8KK3N0cnVjdCBpNDBlX2FxY19udm1fY29uZmlnX3JlYWQgeworCV9fbGUxNiBjbWRfZmxhZ3M7CisjZGVmaW5lIEFOVk1fU0lOR0xFX09SX01VTFRJUExFX0ZFQVRVUkVTX01BU0sJMQorI2RlZmluZSBBTlZNX1JFQURfU0lOR0xFX0ZFQVRVUkUJCTAKKyNkZWZpbmUgQU5WTV9SRUFEX01VTFRJUExFX0ZFQVRVUkVTCQkxCisJX19sZTE2IGVsZW1lbnRfY291bnQ7CisJX19sZTE2IGVsZW1lbnRfaWQ7CQkvKiBGZWF0dXJlL2ZpZWxkIElEICovCisJdTggICAgIHJlc2VydmVkWzJdOworCV9fbGUzMiBhZGRyZXNzX2hpZ2g7CisJX19sZTMyIGFkZHJlc3NfbG93OworfTsKKworSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFjX252bV9jb25maWdfcmVhZCk7CisKKy8qIE5WTSBDb25maWcgV3JpdGUgKGluZGlyZWN0IDB4MDcwNSkgKi8KK3N0cnVjdCBpNDBlX2FxY19udm1fY29uZmlnX3dyaXRlIHsKKwlfX2xlMTYgY21kX2ZsYWdzOworCV9fbGUxNiBlbGVtZW50X2NvdW50OworCXU4ICAgICByZXNlcnZlZFs0XTsKKwlfX2xlMzIgYWRkcmVzc19oaWdoOworCV9fbGUzMiBhZGRyZXNzX2xvdzsKK307CisKK0k0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxY19udm1fY29uZmlnX3dyaXRlKTsKKworc3RydWN0IGk0MGVfYXFjX252bV9jb25maWdfZGF0YV9mZWF0dXJlIHsKKwlfX2xlMTYgZmVhdHVyZV9pZDsKKwlfX2xlMTYgaW5zdGFuY2VfaWQ7CisJX19sZTE2IGZlYXR1cmVfb3B0aW9uczsKKwlfX2xlMTYgZmVhdHVyZV9zZWxlY3Rpb247Cit9OworCitzdHJ1Y3QgaTQwZV9hcWNfbnZtX2NvbmZpZ19kYXRhX2ltbWVkaWF0ZV9maWVsZCB7CisjZGVmaW5lIEFOVk1fRkVBVFVSRV9PUl9JTU1FRElBVEVfTUFTSwkweDIKKwlfX2xlMTYgZmllbGRfaWQ7CisJX19sZTE2IGluc3RhbmNlX2lkOworCV9fbGUxNiBmaWVsZF9vcHRpb25zOworCV9fbGUxNiBmaWVsZF92YWx1ZTsKK307CisKIC8qIFNlbmQgdG8gUEYgY29tbWFuZCAoaW5kaXJlY3QgMHgwODAxKSBpZCBpcyBvbmx5IHVzZWQgYnkgUEYKICAqIFNlbmQgdG8gVkYgY29tbWFuZCAoaW5kaXJlY3QgMHgwODAyKSBpZCBpcyBvbmx5IHVzZWQgYnkgUEYKICAqIFNlbmQgdG8gUGVlciBQRiBjb21tYW5kIChpbmRpcmVjdCAweDA4MDMpCkBAIC0xOTQ4LDE5ICsxOTk5LDEyIEBACiAvKiBBZGQgVWRwIFR1bm5lbCBjb21tYW5kIGFuZCBjb21wbGV0aW9uIChkaXJlY3QgMHgwQjAwKSAqLwogc3RydWN0IGk0MGVfYXFjX2FkZF91ZHBfdHVubmVsIHsKIAlfX2xlMTYgdWRwX3BvcnQ7Ci0JdTggICAgIGhlYWRlcl9sZW47IC8qIGluIERXb3JkcywgMSB0byAxNSAqLworCXU4ICAgICByZXNlcnZlZDBbM107CiAJdTggICAgIHByb3RvY29sX3R5cGU7Ci0jZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9UWVBFX1RFUkVETwkweDAKLSNkZWZpbmUgSTQwRV9BUUNfVFVOTkVMX1RZUEVfVlhMQU4JMHgyCi0jZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9UWVBFX05HRQkweDMKLQl1OCAgICAgdmFyaWFibGVfdWRwX2xlbmd0aDsKLSNkZWZpbmUgSTQwRV9BUUNfVFVOTkVMX0ZJWEVEX1VEUF9MRU5HVEgJMHgwCi0jZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9WQVJJQUJMRV9VRFBfTEVOR1RICTB4MQotCXU4CQl1ZHBfa2V5X2luZGV4OwotI2RlZmluZSBJNDBFX0FRQ19UVU5ORUxfS0VZX0lOREVYX1ZYTEFOCQkJMHgwCi0jZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9LRVlfSU5ERVhfTkdFCQkJMHgxCi0jZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9LRVlfSU5ERVhfUFJPUFJJRVRBUllfVURQCTB4MgotCXU4CQlyZXNlcnZlZFsxMF07CisjZGVmaW5lIEk0MEVfQVFDX1RVTk5FTF9UWVBFX1ZYTEFOCTB4MDAKKyNkZWZpbmUgSTQwRV9BUUNfVFVOTkVMX1RZUEVfTkdFCTB4MDEKKyNkZWZpbmUgSTQwRV9BUUNfVFVOTkVMX1RZUEVfVEVSRURPCTB4MTAKKwl1OCAgICAgcmVzZXJ2ZWQxWzEwXTsKIH07CiAKIEk0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxY19hZGRfdWRwX3R1bm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hbGxvYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWxsb2MuaAppbmRleCBkODY1NGZiLi44ZTZhNmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hbGxvYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FsbG9jLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwppbmRleCBhZTA4NDM3Li5hNDMxNTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTIsNiArMTIsOSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCiAgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KICAqCkBAIC00MCwxMiArNDMsMTAgQEAKIAlpZiAoaHctPnZlbmRvcl9pZCA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSB7CiAJCXN3aXRjaCAoaHctPmRldmljZV9pZCkgewogCQljYXNlIEk0MEVfREVWX0lEX1NGUF9YTDcxMDoKLQkJY2FzZSBJNDBFX0RFVl9JRF9TRlBfWDcxMDoKIAkJY2FzZSBJNDBFX0RFVl9JRF9RRU1VOgogCQljYXNlIEk0MEVfREVWX0lEX0tYX0E6CiAJCWNhc2UgSTQwRV9ERVZfSURfS1hfQjoKIAkJY2FzZSBJNDBFX0RFVl9JRF9LWF9DOgotCQljYXNlIEk0MEVfREVWX0lEX0tYX0Q6CiAJCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9BOgogCQljYXNlIEk0MEVfREVWX0lEX1FTRlBfQjoKIAkJY2FzZSBJNDBFX0RFVl9JRF9RU0ZQX0M6CkBAIC0xMzAsNyArMTMxLDExIEBACiAgKiovCiBib29sIGk0MGV2Zl9jaGVja19hc3FfYWxpdmUoc3RydWN0IGk0MGVfaHcgKmh3KQogewotCXJldHVybiAhIShyZDMyKGh3LCBody0+YXEuYXNxLmxlbikgJiBJNDBFX1BGX0FUUUxFTl9BVFFFTkFCTEVfTUFTSyk7CisJaWYgKGh3LT5hcS5hc3EubGVuKQorCQlyZXR1cm4gISEocmQzMihodywgaHctPmFxLmFzcS5sZW4pICYKKwkJCSAgSTQwRV9QRl9BVFFMRU5fQVRRRU5BQkxFX01BU0spOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2htYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfaG1jLmgKaW5kZXggY2I5N2IzZS4uYTJhZDlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfaG1jLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfaG1jLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtMTYwLDExICsxNjMsNiBAQAogCSAgICAoKChzZF9pZHgpIDw8IEk0MEVfUEZITUNfUERJTlZfUE1TRElEWF9TSElGVCkgfAkJXAogCSAgICAgKChwZF9pZHgpIDw8IEk0MEVfUEZITUNfUERJTlZfUE1QRElEWF9TSElGVCkpKQogCi0jZGVmaW5lIEk0MEVfSU5WQUxJREFURV9WRl9ITUNfUEQoaHcsIHNkX2lkeCwgcGRfaWR4LCBobWNfZm5faWQpCSAgIFwKLQl3cjMyKChodyksIEk0MEVfR0xITUNfVkZQRElOVigoaG1jX2ZuX2lkKSAtIEk0MEVfRklSU1RfVkZfRlBNX0lEKSwgXAotCSAgICAgKCgoc2RfaWR4KSA8PCBJNDBFX1BGSE1DX1BESU5WX1BNU0RJRFhfU0hJRlQpIHwJCSAgIFwKLQkgICAgICAoKHBkX2lkeCkgPDwgSTQwRV9QRkhNQ19QRElOVl9QTVBESURYX1NISUZUKSkpCi0KIC8qKgogICogSTQwRV9GSU5EX1NEX0lOREVYX0xJTUlUIC0gZmluZHMgc2VnbWVudCBkZXNjcmlwdG9yIGluZGV4IGxpbWl0CiAgKiBAaG1jX2luZm86IHBvaW50ZXIgdG8gdGhlIEhNQyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZQpAQCAtMjIzLDcgKzIyMSw3IEBACiAJCQkJCSAgICAgIHUzMiBwZF9pbmRleCk7CiBpNDBlX3N0YXR1cyBpNDBlX3JlbW92ZV9wZF9icChzdHJ1Y3QgaTQwZV9odyAqaHcsCiAJCQkJCXN0cnVjdCBpNDBlX2htY19pbmZvICpobWNfaW5mbywKLQkJCQkJdTMyIGlkeCwgYm9vbCBpc19wZik7CisJCQkJCXUzMiBpZHgpOwogaTQwZV9zdGF0dXMgaTQwZV9wcmVwX3JlbW92ZV9zZF9icChzdHJ1Y3QgaTQwZV9obWNfaW5mbyAqaG1jX2luZm8sCiAJCQkJCSAgICAgdTMyIGlkeCk7CiBpNDBlX3N0YXR1cyBpNDBlX3JlbW92ZV9zZF9icF9uZXcoc3RydWN0IGk0MGVfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfbGFuX2htYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfbGFuX2htYy5oCmluZGV4IDE3ZTQyY2EuLmQ2Zjc2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2xhbl9obWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9sYW5faG1jLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtNTMsNiArNTYsNyBAQAogCXU4ICB0cGhkYXRhX2VuYTsKIAl1OCAgdHBoaGVhZF9lbmE7CiAJdTggIGxyeHF0aHJlc2g7CisJdTggIHByZWZlbmE7CS8qIE5PVEU6IG5vcm1hbGx5IG11c3QgYmUgc2V0IHRvIDEgYXQgaW5pdCAqLwogfTsKIAogLyogVHggcXVldWUgY29udGV4dCBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9vc2RlcC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfb3NkZXAuaAppbmRleCA2MjJmMzczLi4yMWE5MWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9vc2RlcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX29zZGVwLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcHJvdG90eXBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9wcm90b3R5cGUuaAppbmRleCA5N2FiOGMyLi44NDllZGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9wcm90b3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9wcm90b3R5cGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTIsNiArMTIsOSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCiAgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9yZWdpc3Rlci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcmVnaXN0ZXIuaAppbmRleCAzMGFmOTUzLi4zNjk4Mzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9yZWdpc3Rlci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3JlZ2lzdGVyLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtMTMzNyw4ICsxMzQwLDYgQEAKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0dQSU9fTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9HUElPX1NISUZUKQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfVElNRVNZTkNfU0hJRlQgMjMKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX1RJTUVTWU5DX01BU0sgKDB4MSA8PCBJNDBFX1BGSU5UX0lDUjBfVElNRVNZTkNfU0hJRlQpCi0jZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9TVE9STV9ERVRFQ1RfU0hJRlQgMjQKLSNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX1NUT1JNX0RFVEVDVF9NQVNLICgweDEgPDwgSTQwRV9QRklOVF9JQ1IwX1NUT1JNX0RFVEVDVF9TSElGVCkKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0xJTktfU1RBVF9DSEFOR0VfU0hJRlQgMjUKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0xJTktfU1RBVF9DSEFOR0VfTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9MSU5LX1NUQVRfQ0hBTkdFX1NISUZUKQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfSE1DX0VSUl9TSElGVCAyNgpAQCAtMTM2NCw4ICsxMzY1LDYgQEAKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9HUElPX01BU0sgKDB4MSA8PCBJNDBFX1BGSU5UX0lDUjBfRU5BX0dQSU9fU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9FTkFfVElNRVNZTkNfU0hJRlQgMjMKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9USU1FU1lOQ19NQVNLICgweDEgPDwgSTQwRV9QRklOVF9JQ1IwX0VOQV9USU1FU1lOQ19TSElGVCkKLSNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9TVE9STV9ERVRFQ1RfU0hJRlQgMjQKLSNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9TVE9STV9ERVRFQ1RfTUFTSyAoMHgxIDw8IEk0MEVfUEZJTlRfSUNSMF9FTkFfU1RPUk1fREVURUNUX1NISUZUKQogI2RlZmluZSBJNDBFX1BGSU5UX0lDUjBfRU5BX0xJTktfU1RBVF9DSEFOR0VfU0hJRlQgMjUKICNkZWZpbmUgSTQwRV9QRklOVF9JQ1IwX0VOQV9MSU5LX1NUQVRfQ0hBTkdFX01BU0sgKDB4MSA8PCBJNDBFX1BGSU5UX0lDUjBfRU5BX0xJTktfU1RBVF9DSEFOR0VfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfSUNSMF9FTkFfSE1DX0VSUl9TSElGVCAyNgpAQCAtMTU4Niw2ICsxNTg1LDE0IEBACiAjZGVmaW5lIEk0MEVfR0xMQU5fVFNPTVNLX00gMHgwMDA0NDJEQwogI2RlZmluZSBJNDBFX0dMTEFOX1RTT01TS19NX1RDUE1TS01fU0hJRlQgMAogI2RlZmluZSBJNDBFX0dMTEFOX1RTT01TS19NX1RDUE1TS01fTUFTSyAoMHhGRkYgPDwgSTQwRV9HTExBTl9UU09NU0tfTV9UQ1BNU0tNX1NISUZUKQorI2RlZmluZSBJNDBFX0dMTEFOX1RYUFJFX1FESVMoX2kpICgweDAwMEU2NTAwICsgKChfaSkgKiA0KSkgLyogaT0wLi4xMSAqLworI2RlZmluZSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfUUlORFhfU0hJRlQgMAorI2RlZmluZSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfUUlORFhfTUFTSyAoMHg3RkYgPDwgSTQwRV9HTExBTl9UWFBSRV9RRElTX1FJTkRYX1NISUZUKQorI2RlZmluZSBJNDBFX0dMTEFOX1RYUFJFX1FESVNfU0VUX1FESVNfU0hJRlQgMzAKKyNkZWZpbmUgSTQwRV9HTExBTl9UWFBSRV9RRElTX1NFVF9RRElTX01BU0sgKDB4MSA8PCBJNDBFX0dMTEFOX1RYUFJFX1FESVNfU0VUX1FESVNfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJU19DTEVBUl9RRElTX1NISUZUIDMxCisjZGVmaW5lIEk0MEVfR0xMQU5fVFhQUkVfUURJU19DTEVBUl9RRElTX01BU0sgKDB4MSA8PCBJNDBFX0dMTEFOX1RYUFJFX1FESVNfQ0xFQVJfUURJU19TSElGVCkKKwogI2RlZmluZSBJNDBFX1BGTEFOX1FBTExPQyAweDAwMUMwNDAwCiAjZGVmaW5lIEk0MEVfUEZMQU5fUUFMTE9DX0ZJUlNUUV9TSElGVCAwCiAjZGVmaW5lIEk0MEVfUEZMQU5fUUFMTE9DX0ZJUlNUUV9NQVNLICgweDdGRiA8PCBJNDBFX1BGTEFOX1FBTExPQ19GSVJTVFFfU0hJRlQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9zdGF0dXMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3N0YXR1cy5oCmluZGV4IDdjMDhjYzIuLjdmYTdhNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3N0YXR1cy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3N0YXR1cy5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBWaXJ0dWFsIEZ1bmN0aW9uIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMiw2ICsxMiw5IEBACiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKICAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguYwppbmRleCBiOWY1MGY0Li40OGViYjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5jCkBAIC0xMiw2ICsxMiw5IEBACiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKICAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogICoKQEAgLTcyNSwxMCArNzI4LDEyIEBACiAJCQkJICAgIHUzMiByeF9lcnJvciwKIAkJCQkgICAgdTE2IHJ4X3B0eXBlKQogeworCXN0cnVjdCBpNDBlX3J4X3B0eXBlX2RlY29kZWQgZGVjb2RlZCA9IGRlY29kZV9yeF9kZXNjX3B0eXBlKHJ4X3B0eXBlKTsKKwlib29sIGlwdjQgPSBmYWxzZSwgaXB2NiA9IGZhbHNlOwogCWJvb2wgaXB2NF90dW5uZWwsIGlwdjZfdHVubmVsOwogCV9fd3N1bSByeF91ZHBfY3N1bTsKLQlfX3N1bTE2IGNzdW07CiAJc3RydWN0IGlwaGRyICppcGg7CisJX19zdW0xNiBjc3VtOwogCiAJaXB2NF90dW5uZWwgPSAocnhfcHR5cGUgPiBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDX1BBWTMpICYmCiAJCSAgICAgIChyeF9wdHlwZSA8IEk0MEVfUlhfUFRZUEVfR1JFTkFUNF9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKQEAgLTczOSwyOSArNzQ0LDU3IEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogUnggY3N1bSBlbmFibGVkIGFuZCBpcCBoZWFkZXJzIGZvdW5kPyAqLwotCWlmICghKHZzaS0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNICYmCi0JICAgICAgcnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19MM0w0UF9TSElGVCkpKQorCWlmICghKHZzaS0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSkKIAkJcmV0dXJuOwogCisJLyogZGlkIHRoZSBoYXJkd2FyZSBkZWNvZGUgdGhlIHBhY2tldCBhbmQgY2hlY2tzdW0/ICovCisJaWYgKCEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19MM0w0UF9TSElGVCkpKQorCQlyZXR1cm47CisKKwkvKiBib3RoIGtub3duIGFuZCBvdXRlcl9pcCBtdXN0IGJlIHNldCBmb3IgdGhlIGJlbG93IGNvZGUgdG8gd29yayAqLworCWlmICghKGRlY29kZWQua25vd24gJiYgZGVjb2RlZC5vdXRlcl9pcCkpCisJCXJldHVybjsKKworCWlmIChkZWNvZGVkLm91dGVyX2lwID09IEk0MEVfUlhfUFRZUEVfT1VURVJfSVAgJiYKKwkgICAgZGVjb2RlZC5vdXRlcl9pcF92ZXIgPT0gSTQwRV9SWF9QVFlQRV9PVVRFUl9JUFY0KQorCQlpcHY0ID0gdHJ1ZTsKKwllbHNlIGlmIChkZWNvZGVkLm91dGVyX2lwID09IEk0MEVfUlhfUFRZUEVfT1VURVJfSVAgJiYKKwkJIGRlY29kZWQub3V0ZXJfaXBfdmVyID09IEk0MEVfUlhfUFRZUEVfT1VURVJfSVBWNikKKwkJaXB2NiA9IHRydWU7CisKKwlpZiAoaXB2NCAmJgorCSAgICAocnhfZXJyb3IgJiAoKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0lQRV9TSElGVCkgfAorCQkJICgxIDw8IEk0MEVfUlhfREVTQ19FUlJPUl9FSVBFX1NISUZUKSkpKQorCQlnb3RvIGNoZWNrc3VtX2ZhaWw7CisKIAkvKiBsaWtlbHkgaW5jb3JyZWN0IGNzdW0gaWYgYWx0ZXJuYXRlIElQIGV4dGVuc2lvbiBoZWFkZXJzIGZvdW5kICovCi0JaWYgKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfSVBWNkVYQUREX1NISUZUKSkKKwlpZiAoaXB2NiAmJgorCSAgICBkZWNvZGVkLmlubmVyX3Byb3QgPT0gSTQwRV9SWF9QVFlQRV9JTk5FUl9QUk9UX1RDUCAmJgorCSAgICByeF9lcnJvciAmICgxIDw8IEk0MEVfUlhfREVTQ19FUlJPUl9MNEVfU0hJRlQpICYmCisJICAgIHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfSVBWNkVYQUREX1NISUZUKSkKKwkJLyogZG9uJ3QgaW5jcmVtZW50IGNoZWNrc3VtIGVyciBoZXJlLCBub24tZmF0YWwgZXJyICovCiAJCXJldHVybjsKIAotCS8qIElQIG9yIEw0IG9yIG91dG1vc3QgSVAgY2hlY2tzdW0gZXJyb3IgKi8KLQlpZiAocnhfZXJyb3IgJiAoKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0lQRV9TSElGVCkgfAotCQkJKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0w0RV9TSElGVCkgfAotCQkJKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0VJUEVfU0hJRlQpKSkgewotCQl2c2ktPmJhY2stPmh3X2NzdW1fcnhfZXJyb3IrKzsKLQkJcmV0dXJuOwotCX0KKwkvKiB0aGVyZSB3YXMgc29tZSBMNCBlcnJvciwgY291bnQgZXJyb3IgYW5kIHB1bnQgcGFja2V0IHRvIHRoZSBzdGFjayAqLworCWlmIChyeF9lcnJvciAmICgxIDw8IEk0MEVfUlhfREVTQ19FUlJPUl9MNEVfU0hJRlQpKQorCQlnb3RvIGNoZWNrc3VtX2ZhaWw7CiAKKwkvKiBoYW5kbGUgcGFja2V0cyB0aGF0IHdlcmUgbm90IGFibGUgdG8gYmUgY2hlY2tzdW1tZWQgZHVlCisJICogdG8gYXJyaXZhbCBzcGVlZCwgaW4gdGhpcyBjYXNlIHRoZSBzdGFjayBjYW4gY29tcHV0ZQorCSAqIHRoZSBjc3VtLgorCSAqLworCWlmIChyeF9lcnJvciAmICgxIDw8IEk0MEVfUlhfREVTQ19FUlJPUl9QUFJTX1NISUZUKSkKKwkJcmV0dXJuOworCisJLyogSWYgVlhMQU4gdHJhZmZpYyBoYXMgYW4gb3V0ZXIgVURQdjQgY2hlY2tzdW0gd2UgbmVlZCB0byBjaGVjaworCSAqIGl0IGluIHRoZSBkcml2ZXIsIGhhcmR3YXJlIGRvZXMgbm90IGRvIGl0IGZvciB1cy4KKwkgKiBTaW5jZSBMM0w0UCBiaXQgd2FzIHNldCB3ZSBhc3N1bWUgYSB2YWxpZCBJSEwgdmFsdWUgKD49NSkKKwkgKiBzbyB0aGUgdG90YWwgbGVuZ3RoIG9mIElQdjQgaGVhZGVyIGlzIElITCo0IGJ5dGVzCisJICogVGhlIFVEUF8wIGJpdCAqbWF5KiBiZXQgc2V0IGlmIHRoZSAqaW5uZXIqIGhlYWRlciBpcyBVRFAKKwkgKi8KIAlpZiAoaXB2NF90dW5uZWwgJiYKKwkgICAgKGRlY29kZWQuaW5uZXJfcHJvdCAhPSBJNDBFX1JYX1BUWVBFX0lOTkVSX1BST1RfVURQKSAmJgogCSAgICAhKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfVURQXzBfU0hJRlQpKSkgewotCQkvKiBJZiBWWExBTiB0cmFmZmljIGhhcyBhbiBvdXRlciBVRFB2NCBjaGVja3N1bSB3ZSBuZWVkIHRvIGNoZWNrCi0JCSAqIGl0IGluIHRoZSBkcml2ZXIsIGhhcmR3YXJlIGRvZXMgbm90IGRvIGl0IGZvciB1cy4KLQkJICogU2luY2UgTDNMNFAgYml0IHdhcyBzZXQgd2UgYXNzdW1lIGEgdmFsaWQgSUhMIHZhbHVlICg+PTUpCi0JCSAqIHNvIHRoZSB0b3RhbCBsZW5ndGggb2YgSVB2NCBoZWFkZXIgaXMgSUhMKjQgYnl0ZXMKLQkJICovCiAJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArCiAJCQkJCXNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCiAJCQkJCShpcF9oZHIoc2tiKS0+aWhsICogNCk7CkBAIC03NzgsMTMgKzgxMSwxNiBAQAogCQkJCShza2ItPmxlbiAtIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpLAogCQkJCUlQUFJPVE9fVURQLCByeF91ZHBfY3N1bSk7CiAKLQkJaWYgKHVkcF9oZHIoc2tiKS0+Y2hlY2sgIT0gY3N1bSkgewotCQkJdnNpLT5iYWNrLT5od19jc3VtX3J4X2Vycm9yKys7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHVkcF9oZHIoc2tiKS0+Y2hlY2sgIT0gY3N1bSkKKwkJCWdvdG8gY2hlY2tzdW1fZmFpbDsKIAl9CiAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJcmV0dXJuOworCitjaGVja3N1bV9mYWlsOgorCXZzaS0+YmFjay0+aHdfY3N1bV9yeF9lcnJvcisrOwogfQogCiAvKioKQEAgLTk1Myw2ICs5ODksOSBAQAogCQkvKiBFUlJfTUFTSyB3aWxsIG9ubHkgaGF2ZSB2YWxpZCBiaXRzIGlmIEVPUCBzZXQgKi8KIAkJaWYgKHVubGlrZWx5KHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX1JYRV9TSElGVCkpKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJLyogVE9ETzogc2hvdWxkbid0IHdlIGluY3JlbWVudCBhIGNvdW50ZXIgaW5kaWNhdGluZyB0aGUKKwkJCSAqIGRyb3A/CisJCQkgKi8KIAkJCWdvdG8gbmV4dF9kZXNjOwogCQl9CiAKQEAgLTE1MDgsOSArMTU0Nyw3IEBACiBzdGF0aWMgaW50IGk0MGVfeG1pdF9kZXNjcmlwdG9yX2NvdW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZykKIHsKLSNpZiBQQUdFX1NJWkUgPiBJNDBFX01BWF9EQVRBX1BFUl9UWEQKIAl1bnNpZ25lZCBpbnQgZjsKLSNlbmRpZgogCWludCBjb3VudCA9IDA7CiAKIAkvKiBuZWVkOiAxIGRlc2NyaXB0b3IgcGVyIHBhZ2UgKiBQQUdFX1NJWkUvSTQwRV9NQVhfREFUQV9QRVJfVFhELApAQCAtMTUxOSwxMiArMTU1Niw5IEBACiAJICogICAgICAgKyAxIGRlc2MgZm9yIGNvbnRleHQgZGVzY3JpcHRvciwKIAkgKiBvdGhlcndpc2UgdHJ5IG5leHQgdGltZQogCSAqLwotI2lmIFBBR0VfU0laRSA+IEk0MEVfTUFYX0RBVEFfUEVSX1RYRAogCWZvciAoZiA9IDA7IGYgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmKyspCiAJCWNvdW50ICs9IFRYRF9VU0VfQ09VTlQoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXS5zaXplKTsKLSNlbHNlCi0JY291bnQgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKLSNlbmRpZgorCiAJY291bnQgKz0gVFhEX1VTRV9DT1VOVChza2JfaGVhZGxlbihza2IpKTsKIAlpZiAoaTQwZV9tYXliZV9zdG9wX3R4KHR4X3JpbmcsIGNvdW50ICsgNCArIDEpKSB7CiAJCXR4X3JpbmctPnR4X3N0YXRzLnR4X2J1c3krKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaAppbmRleCAxMGJmNDllLi4zMGQyNDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBWaXJ0dWFsIEZ1bmN0aW9uIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMiw2ICsxMiw5IEBACiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKICAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogICoKQEAgLTI0LDcgKzI3LDcgQEAKICNpZm5kZWYgX0k0MEVfVFhSWF9IXwogI2RlZmluZSBfSTQwRV9UWFJYX0hfCiAKLS8qIEludGVycnVwdCBUaHJvdHRsaW5nIGFuZCBSYXRlIExpbWl0aW5nIChzdG9ybSBjb250cm9sKSBHb29kaWVzICovCisvKiBJbnRlcnJ1cHQgVGhyb3R0bGluZyBhbmQgUmF0ZSBMaW1pdGluZyBHb29kaWVzICovCiAKICNkZWZpbmUgSTQwRV9NQVhfSVRSICAgICAgICAgICAgICAgMHgwRkYwICAvKiByZWcgdXNlcyAyIHVzZWMgcmVzb2x1dGlvbiAqLwogI2RlZmluZSBJNDBFX01JTl9JVFIgICAgICAgICAgICAgICAweDAwMDQgIC8qIHJlZyB1c2VzIDIgdXNlYyByZXNvbHV0aW9uICovCkBAIC02NiwxNiArNjksMTEgQEAKIAogLyogU3VwcG9ydGVkIFJTUyBvZmZsb2FkcyAqLwogI2RlZmluZSBJNDBFX0RFRkFVTFRfUlNTX0hFTkEgKCBcCi0JKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjRfVURQKSB8IFwKLQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY0X1VEUCkgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUCkgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1NDVFApIHwgXAotCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOKSB8IFwKIAkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQKSB8IFwKIAkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfT1RIRVIpIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNCkgfCBcCi0JKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjZfVURQKSB8IFwKLQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY2X1VEUCkgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1VEUCkgfCBcCiAJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUF9TWU4pIHwgXAogCSgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1ApIHwgXApAQCAtMTE5LDExICsxMTcsMTEgQEAKICNkZWZpbmUgaTQwZV9yeF9kZXNjIGk0MGVfMzJieXRlX3J4X2Rlc2MKIAogI2RlZmluZSBJNDBFX01JTl9UWF9MRU4JCTE3Ci0jZGVmaW5lIEk0MEVfTUFYX0RBVEFfUEVSX1RYRAkxNjM4MwkvKiBha2EgMTZrQiAtIDEgKi8KKyNkZWZpbmUgSTQwRV9NQVhfREFUQV9QRVJfVFhECTgxOTIKIAogLyogVHggRGVzY3JpcHRvcnMgbmVlZGVkLCB3b3JzdCBjYXNlICovCiAjZGVmaW5lIFRYRF9VU0VfQ09VTlQoUykgRElWX1JPVU5EX1VQKChTKSwgSTQwRV9NQVhfREFUQV9QRVJfVFhEKQotI2RlZmluZSBERVNDX05FRURFRCAoKE1BWF9TS0JfRlJBR1MgKiBUWERfVVNFX0NPVU5UKFBBR0VfU0laRSkpICsgNCkKKyNkZWZpbmUgREVTQ19ORUVERUQgKE1BWF9TS0JfRlJBR1MgKyA0KQogCiAjZGVmaW5lIEk0MEVfVFhfRkxBR1NfQ1NVTQkJKHUzMikoMSkKICNkZWZpbmUgSTQwRV9UWF9GTEFHU19IV19WTEFOCQkodTMyKSgxIDw8IDEpCkBAIC0xODAsNyArMTc4LDYgQEAKIAlfX0k0MEVfVFhfREVURUNUX0hBTkcsCiAJX19JNDBFX0hBTkdfQ0hFQ0tfQVJNRUQsCiAJX19JNDBFX1JYX1BTX0VOQUJMRUQsCi0JX19JNDBFX1JYX0xST19FTkFCTEVELAogCV9fSTQwRV9SWF8xNkJZVEVfREVTQ19FTkFCTEVELAogfTsKIApAQCAtMTk2LDEyICsxOTMsNiBAQAogCXNldF9iaXQoX19JNDBFX1RYX0RFVEVDVF9IQU5HLCAmKHJpbmcpLT5zdGF0ZSkKICNkZWZpbmUgY2xlYXJfY2hlY2tfZm9yX3R4X2hhbmcocmluZykgXAogCWNsZWFyX2JpdChfX0k0MEVfVFhfREVURUNUX0hBTkcsICYocmluZyktPnN0YXRlKQotI2RlZmluZSByaW5nX2lzX2xyb19lbmFibGVkKHJpbmcpIFwKLQl0ZXN0X2JpdChfX0k0MEVfUlhfTFJPX0VOQUJMRUQsICYocmluZyktPnN0YXRlKQotI2RlZmluZSBzZXRfcmluZ19scm9fZW5hYmxlZChyaW5nKSBcCi0Jc2V0X2JpdChfX0k0MEVfUlhfTFJPX0VOQUJMRUQsICYocmluZyktPnN0YXRlKQotI2RlZmluZSBjbGVhcl9yaW5nX2xyb19lbmFibGVkKHJpbmcpIFwKLQljbGVhcl9iaXQoX19JNDBFX1JYX0xST19FTkFCTEVELCAmKHJpbmcpLT5zdGF0ZSkKICNkZWZpbmUgcmluZ19pc18xNmJ5dGVfZGVzY19lbmFibGVkKHJpbmcpIFwKIAl0ZXN0X2JpdChfX0k0MEVfUlhfMTZCWVRFX0RFU0NfRU5BQkxFRCwgJihyaW5nKS0+c3RhdGUpCiAjZGVmaW5lIHNldF9yaW5nXzE2Ynl0ZV9kZXNjX2VuYWJsZWQocmluZykgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHlwZS5oCmluZGV4IDQ2NzNiMzMuLmQzY2Y1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eXBlLmgKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtMzIsMTMgKzM1LDExIEBACiAjaW5jbHVkZSAiaTQwZV9sYW5faG1jLmgiCiAKIC8qIERldmljZSBJRHMgKi8KLSNkZWZpbmUgSTQwRV9ERVZfSURfU0ZQX1hMNzEwCTB4MTU3MgotI2RlZmluZSBJNDBFX0RFVl9JRF9TRlBfWDcxMAkJMHgxNTczCisjZGVmaW5lIEk0MEVfREVWX0lEX1NGUF9YTDcxMAkJMHgxNTcyCiAjZGVmaW5lIEk0MEVfREVWX0lEX1FFTVUJCTB4MTU3NAogI2RlZmluZSBJNDBFX0RFVl9JRF9LWF9BCQkweDE1N0YKICNkZWZpbmUgSTQwRV9ERVZfSURfS1hfQgkJMHgxNTgwCiAjZGVmaW5lIEk0MEVfREVWX0lEX0tYX0MJCTB4MTU4MQotI2RlZmluZSBJNDBFX0RFVl9JRF9LWF9ECQkweDE1ODIKICNkZWZpbmUgSTQwRV9ERVZfSURfUVNGUF9BCQkweDE1ODMKICNkZWZpbmUgSTQwRV9ERVZfSURfUVNGUF9CCQkweDE1ODQKICNkZWZpbmUgSTQwRV9ERVZfSURfUVNGUF9DCQkweDE1ODUKQEAgLTU3LDggKzU4LDggQEAKIC8qIE1heCBkZWZhdWx0IHRpbWVvdXQgaW4gbXMsICovCiAjZGVmaW5lIEk0MEVfTUFYX05WTV9USU1FT1VUCQkxODAwMAogCi0vKiBTd2l0Y2ggZnJvbSBtYyB0byB0aGUgMnVzZWMgZ2xvYmFsIHRpbWUgKHRoaXMgaXMgdGhlIEdUSU1FIHJlc29sdXRpb24pICovCi0jZGVmaW5lIEk0MEVfTVNfVE9fR1RJTUUodGltZSkJCSgoKHRpbWUpICogMTAwMCkgLyAyKQorLyogU3dpdGNoIGZyb20gbXMgdG8gdGhlIDF1c2VjIGdsb2JhbCB0aW1lICh0aGlzIGlzIHRoZSBHVElNRSByZXNvbHV0aW9uKSAqLworI2RlZmluZSBJNDBFX01TX1RPX0dUSU1FKHRpbWUpCQkoKHRpbWUpICogMTAwMCkKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IGk0MGVfaHc7CkBAIC0xMDEsMTUgKzEwMiw2IEBACiAJSTQwRV9ERUJVR19BTEwJCQk9IDB4RkZGRkZGRkYKIH07CiAKLS8qIFBDSSBCdXMgSW5mbyAqLwotI2RlZmluZSBJNDBFX1BDSV9MSU5LX1dJRFRIXzEJCTB4MTAKLSNkZWZpbmUgSTQwRV9QQ0lfTElOS19XSURUSF8yCQkweDIwCi0jZGVmaW5lIEk0MEVfUENJX0xJTktfV0lEVEhfNAkJMHg0MAotI2RlZmluZSBJNDBFX1BDSV9MSU5LX1dJRFRIXzgJCTB4ODAKLSNkZWZpbmUgSTQwRV9QQ0lfTElOS19TUEVFRF8yNTAwCTB4MQotI2RlZmluZSBJNDBFX1BDSV9MSU5LX1NQRUVEXzUwMDAJMHgyCi0jZGVmaW5lIEk0MEVfUENJX0xJTktfU1BFRURfODAwMAkweDMKLQogLyogVGhlc2UgYXJlIHN0cnVjdHMgZm9yIG1hbmFnaW5nIHRoZSBoYXJkd2FyZSBpbmZvcm1hdGlvbiBhbmQgdGhlIG9wZXJhdGlvbnMuCiAgKiBUaGUgc3RydWN0dXJlcyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgZmlsbGVkIG91dCBhdCBpbml0IHRpbWUgd2hlbiB3ZQogICoga25vdyBmb3Igc3VyZSBleGFjdGx5IHdoaWNoIGhhcmR3YXJlIHdlJ3JlIHdvcmtpbmcgd2l0aC4gIFRoaXMgZ2l2ZXMgdXMgdGhlCkBAIC0xNzMsNiArMTY1LDkgQEAKIAl1OCBsb29wYmFjazsKIAkvKiBpcyBMaW5rIFN0YXR1cyBFdmVudCBub3RpZmljYXRpb24gdG8gU1cgZW5hYmxlZCAqLwogCWJvb2wgbHNlX2VuYWJsZTsKKwl1MTYgbWF4X2ZyYW1lX3NpemU7CisJYm9vbCBjcmNfZW5hYmxlOworCXU4IHBhY2luZzsKIH07CiAKIHN0cnVjdCBpNDBlX3BoeV9pbmZvIHsKQEAgLTQxNSw2ICs0MTAsNyBAQAogCXU4IG1pbm9yX3ZlcnNpb247CiAJdTggYnVpbGRfdmVyc2lvbjsKIAl1OCBzdWJidWlsZF92ZXJzaW9uOworCXU4IGRyaXZlcl9zdHJpbmdbMzJdOwogfTsKIAogLyogUlggRGVzY3JpcHRvcnMgKi8KQEAgLTQ5NCw5ICs0OTAsNiBAQAogCX0gd2I7ICAvKiB3cml0ZWJhY2sgKi8KIH07CiAKLSNkZWZpbmUgSTQwRV9SWERfUVcxX1NUQVRVU19TSElGVAkwCi0jZGVmaW5lIEk0MEVfUlhEX1FXMV9TVEFUVVNfTUFTSwkoMHg3RkZGVUwgPDwgSTQwRV9SWERfUVcxX1NUQVRVU19TSElGVCkKLQogZW51bSBpNDBlX3J4X2Rlc2Nfc3RhdHVzX2JpdHMgewogCS8qIE5vdGU6IFRoZXNlIGFyZSBwcmVkZWZpbmVkIGJpdCBvZmZzZXRzICovCiAJSTQwRV9SWF9ERVNDX1NUQVRVU19ERF9TSElGVAkJPSAwLApAQCAtNTEzLDkgKzUwNiwxNCBAQAogCUk0MEVfUlhfREVTQ19TVEFUVVNfTFBCS19TSElGVAkJPSAxNCwKIAlJNDBFX1JYX0RFU0NfU1RBVFVTX0lQVjZFWEFERF9TSElGVAk9IDE1LAogCUk0MEVfUlhfREVTQ19TVEFUVVNfUkVTRVJWRURfU0hJRlQJPSAxNiwgLyogMiBCSVRTICovCi0JSTQwRV9SWF9ERVNDX1NUQVRVU19VRFBfMF9TSElGVAkJPSAxOAorCUk0MEVfUlhfREVTQ19TVEFUVVNfVURQXzBfU0hJRlQJCT0gMTgsCisJSTQwRV9SWF9ERVNDX1NUQVRVU19MQVNUIC8qIHRoaXMgZW50cnkgbXVzdCBiZSBsYXN0ISEhICovCiB9OwogCisjZGVmaW5lIEk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQJMAorI2RlZmluZSBJNDBFX1JYRF9RVzFfU1RBVFVTX01BU0sJKCgoMSA8PCBJNDBFX1JYX0RFU0NfU1RBVFVTX0xBU1QpIC0gMSkgXAorCQkJCQkgPDwgSTQwRV9SWERfUVcxX1NUQVRVU19TSElGVCkKKwogI2RlZmluZSBJNDBFX1JYRF9RVzFfU1RBVFVTX1RTWU5JTkRYX1NISUZUICAgSTQwRV9SWF9ERVNDX1NUQVRVU19UU1lOSU5EWF9TSElGVAogI2RlZmluZSBJNDBFX1JYRF9RVzFfU1RBVFVTX1RTWU5JTkRYX01BU0sJKDB4M1VMIDw8IFwKIAkJCQkJICAgICBJNDBFX1JYRF9RVzFfU1RBVFVTX1RTWU5JTkRYX1NISUZUKQpAQCAtNTQzLDcgKzU0MSw4IEBACiAJSTQwRV9SWF9ERVNDX0VSUk9SX0lQRV9TSElGVAkJPSAzLAogCUk0MEVfUlhfREVTQ19FUlJPUl9MNEVfU0hJRlQJCT0gNCwKIAlJNDBFX1JYX0RFU0NfRVJST1JfRUlQRV9TSElGVAkJPSA1LAotCUk0MEVfUlhfREVTQ19FUlJPUl9PVkVSU0laRV9TSElGVAk9IDYKKwlJNDBFX1JYX0RFU0NfRVJST1JfT1ZFUlNJWkVfU0hJRlQJPSA2LAorCUk0MEVfUlhfREVTQ19FUlJPUl9QUFJTX1NISUZUCQk9IDcKIH07CiAKIGVudW0gaTQwZV9yeF9kZXNjX2Vycm9yX2wzbDRlX2Zjb2VfbWFza3MgewpAQCAtNjY0LDcgKzY2Myw2IEBACiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfTDJUQUczUF9TSElGVAk9IDEsCiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfRkxFWEJMX1NISUZUCT0gMiwgLyogMiBCSVRTICovCiAJSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfRkxFWEJIX1NISUZUCT0gNCwgLyogMiBCSVRTICovCi0JSTQwRV9SWF9ERVNDX0VYVF9TVEFUVVNfRlRZUEVfU0hJRlQJPSA2LCAvKiAzIEJJVFMgKi8KIAlJNDBFX1JYX0RFU0NfRVhUX1NUQVRVU19GRExPTkdCX1NISUZUCT0gOSwKIAlJNDBFX1JYX0RFU0NfRVhUX1NUQVRVU19GQ09FTE9OR0JfU0hJRlQJPSAxMCwKIAlJNDBFX1JYX0RFU0NfRVhUX1NUQVRVU19QRUxPTkdCX1NISUZUCT0gMTEsCkBAIC04NjgsMTggKzg2NiwxNCBAQAogCiAvKiBQYWNrZXQgQ2xhc3NpZmllciBUeXBlcyBmb3IgZmlsdGVycyAqLwogZW51bSBpNDBlX2ZpbHRlcl9wY3R5cGUgewotCS8qIE5vdGU6IFZhbHVlcyAwLTI4IGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCUk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNF9VRFAJPSAyOSwKLQlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNF9VRFAJPSAzMCwKKwkvKiBOb3RlOiBWYWx1ZXMgMC0zMCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUAkJPSAzMSwKLQlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUF9TWU4JCT0gMzIsCisJLyogTm90ZTogVmFsdWUgMzIgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUAkJPSAzMywKIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1NDVFAJCT0gMzQsCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9PVEhFUgkJPSAzNSwKIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0CQkJPSAzNiwKLQkvKiBOb3RlOiBWYWx1ZXMgMzctMzggYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY2X1VEUAk9IDM5LAotCUk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY2X1VEUAk9IDQwLAorCS8qIE5vdGU6IFZhbHVlcyAzNy00MCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1VEUAkJPSA0MSwKIAlJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUF9TWU4JCT0gNDIsCiAJSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1AJCT0gNDMsCkBAIC05NjEsNiArOTU1LDE2IEBACiAJc3RydWN0IGk0MGVfYXFjX3ZzaV9wcm9wZXJ0aWVzX2RhdGEgaW5mbzsKIH07CiAKK3N0cnVjdCBpNDBlX3ZlYl9jb250ZXh0IHsKKwl1MTYgc2VpZDsKKwl1MTYgdXBsaW5rX3NlaWQ7CisJdTE2IHZlYl9udW1iZXI7CisJdTE2IHZlYnNfYWxsb2NhdGVkOworCXUxNiB2ZWJzX3VuYWxsb2NhdGVkOworCXUxNiBmbGFnczsKKwlzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3ZlYl9wYXJhbWV0ZXJzX2NvbXBsZXRpb24gaW5mbzsKK307CisKIC8qIFN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5IGVhY2ggcG9ydCwgVlNJLCBWRUIsIGFuZCBTLWNoYW5uZWwgKi8KIHN0cnVjdCBpNDBlX2V0aF9zdGF0cyB7CiAJdTY0IHJ4X2J5dGVzOwkJCS8qIGdvcmMgKi8KQEAgLTk2OCw4ICs5NzIsNiBAQAogCXU2NCByeF9tdWx0aWNhc3Q7CQkvKiBtcHJjICovCiAJdTY0IHJ4X2Jyb2FkY2FzdDsJCS8qIGJwcmMgKi8KIAl1NjQgcnhfZGlzY2FyZHM7CQkvKiByZHBjICovCi0JdTY0IHJ4X2Vycm9yczsJCQkvKiByZXBjICovCi0JdTY0IHJ4X21pc3NlZDsJCQkvKiBybXBjICovCiAJdTY0IHJ4X3Vua25vd25fcHJvdG9jb2w7CS8qIHJ1cHAgKi8KIAl1NjQgdHhfYnl0ZXM7CQkJLyogZ290YyAqLwogCXU2NCB0eF91bmljYXN0OwkJCS8qIHVwdGMgKi8KQEAgLTEwMjEsOSArMTAyMywxMiBAQAogCXU2NCB0eF9zaXplX2JpZzsJCS8qIHB0Yzk1MjIgKi8KIAl1NjQgbWFjX3Nob3J0X3BhY2tldF9kcm9wcGVkOwkvKiBtc3BkYyAqLwogCXU2NCBjaGVja3N1bV9lcnJvcjsJCS8qIHhlYyAqLworCS8qIGZsb3cgZGlyZWN0b3Igc3RhdHMgKi8KKwl1NjQgZmRfYXRyX21hdGNoOworCXU2NCBmZF9zYl9tYXRjaDsKIAkvKiBFRUUgTFBJICovCi0JYm9vbCB0eF9scGlfc3RhdHVzOwotCWJvb2wgcnhfbHBpX3N0YXR1czsKKwl1MzIgdHhfbHBpX3N0YXR1czsKKwl1MzIgcnhfbHBpX3N0YXR1czsKIAl1NjQgdHhfbHBpX2NvdW50OwkJLyogZXRscGljICovCiAJdTY0IHJ4X2xwaV9jb3VudDsJCS8qIGVybHBpYyAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3ZpcnRjaG5sLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV92aXJ0Y2hubC5oCmluZGV4IGNjZjQ1ZDAuLmNkMThkNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3ZpcnRjaG5sLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTIsNiArMTIsOSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCiAgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KICAqCkBAIC0zMzgsMTAgKzM0MSw2IEBACiAJaW50IHNldmVyaXR5OwogfTsKIAotLyogVGhlIGZvbGxvd2luZyBhcmUgVEJELCBub3QgbmVjZXNzYXJ5IGZvciBMQU4gZnVuY3Rpb25hbGl0eS4KLSAqIEk0MEVfVklSVENITkxfT1BfRkNPRQotICovCi0KIC8qIFZGIHJlc2V0IHN0YXRlcyAtIHRoZXNlIGFyZSB3cml0dGVuIGludG8gdGhlIFJTVEFUIHJlZ2lzdGVyOgogICogSTQwRV9WRkdFTl9SU1RBVDEgb24gdGhlIFBGCiAgKiBJNDBFX1ZGR0VOX1JTVEFUIG9uIHRoZSBWRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oCmluZGV4IDgwNzgwN2QuLjMwZWY1MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmLmgKQEAgLTEyLDYgKzEyLDkgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgogICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAgKgpAQCAtNzcsNyArODAsNyBAQAogI2RlZmluZSBJNDBFVkZfTUlOX1RYRCAgICAgICA2NAogI2RlZmluZSBJNDBFVkZfTUFYX1JYRCAgICAgICA0MDk2CiAjZGVmaW5lIEk0MEVWRl9NSU5fUlhEICAgICAgIDY0Ci0jZGVmaW5lIEk0MEVWRl9SRVFfREVTQ1JJUFRPUl9NVUxUSVBMRSAgOAorI2RlZmluZSBJNDBFVkZfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUgIDMyCiAKIC8qIFN1cHBvcnRlZCBSeCBCdWZmZXIgU2l6ZXMgKi8KICNkZWZpbmUgSTQwRVZGX1JYQlVGRkVSXzY0ICAgIDY0ICAgICAvKiBVc2VkIGZvciBwYWNrZXQgc3BsaXQgKi8KQEAgLTE5MywxMCArMTk2LDEyIEBACiAJc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZ3NbSTQwRV9NQVhfVlNJX1FQXTsKIAl1MzIgdHhfdGltZW91dF9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hY19maWx0ZXJfbGlzdDsKKwl1MzIgdHhfZGVzY19jb3VudDsKIAogCS8qIFJYICovCiAJc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZ3NbSTQwRV9NQVhfVlNJX1FQXTsKIAl1NjQgaHdfY3N1bV9yeF9lcnJvcjsKKwl1MzIgcnhfZGVzY19jb3VudDsKIAlpbnQgbnVtX21zaXhfdmVjdG9yczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCmluZGV4IDhiMGRiMWMuLjYwNDA3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCkBAIC0xMiw2ICsxMiw5IEBACiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKICAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogICoKQEAgLTQ0LDggKzQ3LDYgQEAKIAlJNDBFVkZfU1RBVCgicnhfbXVsdGljYXN0IiwgY3VycmVudF9zdGF0cy5yeF9tdWx0aWNhc3QpLAogCUk0MEVWRl9TVEFUKCJyeF9icm9hZGNhc3QiLCBjdXJyZW50X3N0YXRzLnJ4X2Jyb2FkY2FzdCksCiAJSTQwRVZGX1NUQVQoInJ4X2Rpc2NhcmRzIiwgY3VycmVudF9zdGF0cy5yeF9kaXNjYXJkcyksCi0JSTQwRVZGX1NUQVQoInJ4X2Vycm9ycyIsIGN1cnJlbnRfc3RhdHMucnhfZXJyb3JzKSwKLQlJNDBFVkZfU1RBVCgicnhfbWlzc2VkIiwgY3VycmVudF9zdGF0cy5yeF9taXNzZWQpLAogCUk0MEVWRl9TVEFUKCJyeF91bmtub3duX3Byb3RvY29sIiwgY3VycmVudF9zdGF0cy5yeF91bmtub3duX3Byb3RvY29sKSwKIAlJNDBFVkZfU1RBVCgidHhfYnl0ZXMiLCBjdXJyZW50X3N0YXRzLnR4X2J5dGVzKSwKIAlJNDBFVkZfU1RBVCgidHhfdW5pY2FzdCIsIGN1cnJlbnRfc3RhdHMudHhfdW5pY2FzdCksCkBAIC01NiwxMCArNTcsMTIgQEAKIH07CiAKICNkZWZpbmUgSTQwRVZGX0dMT0JBTF9TVEFUU19MRU4gQVJSQVlfU0laRShpNDBldmZfZ3N0cmluZ3Nfc3RhdHMpCi0jZGVmaW5lIEk0MEVWRl9RVUVVRV9TVEFUU19MRU4gXAorI2RlZmluZSBJNDBFVkZfUVVFVUVfU1RBVFNfTEVOKF9kZXYpIFwKIAkoKChzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKikgXAotCQluZXRkZXZfcHJpdihuZXRkZXYpKS0+dnNpX3Jlcy0+bnVtX3F1ZXVlX3BhaXJzICogNCkKLSNkZWZpbmUgSTQwRVZGX1NUQVRTX0xFTiAoSTQwRVZGX0dMT0JBTF9TVEFUU19MRU4gKyBJNDBFVkZfUVVFVUVfU1RBVFNfTEVOKQorCQluZXRkZXZfcHJpdihfZGV2KSktPnZzaV9yZXMtPm51bV9xdWV1ZV9wYWlycyBcCisJCSAgKiAyICogKHNpemVvZihzdHJ1Y3QgaTQwZV9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSkpCisjZGVmaW5lIEk0MEVWRl9TVEFUU19MRU4oX2RldikgXAorCShJNDBFVkZfR0xPQkFMX1NUQVRTX0xFTiArIEk0MEVWRl9RVUVVRV9TVEFUU19MRU4oX2RldikpCiAKIC8qKgogICogaTQwZXZmX2dldF9zZXR0aW5ncyAtIEdldCBMaW5rIFNwZWVkIGFuZCBEdXBsZXggc2V0dGluZ3MKQEAgLTc1LDcgKzc4LDcgQEAKIAkvKiBJbiB0aGUgZnV0dXJlIHRoZSBWRiB3aWxsIGJlIGFibGUgdG8gcXVlcnkgdGhlIFBGIGZvcgogCSAqIHNvbWUgaW5mb3JtYXRpb24gLSBmb3Igbm93IHVzZSBhIGR1bW15IHZhbHVlCiAJICovCi0JZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKwllY21kLT5zdXBwb3J0ZWQgPSAwOwogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CiAJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0RVTU1ZMTsKIAllY21kLT5wb3J0ID0gUE9SVF9OT05FOwpAQCAtOTQsOSArOTcsOSBAQAogc3RhdGljIGludCBpNDBldmZfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCiB7CiAJaWYgKHNzZXQgPT0gRVRIX1NTX1NUQVRTKQotCQlyZXR1cm4gSTQwRVZGX1NUQVRTX0xFTjsKKwkJcmV0dXJuIEk0MEVWRl9TVEFUU19MRU4obmV0ZGV2KTsKIAllbHNlCi0JCXJldHVybiAtRU5PVFNVUFA7CisJCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKQEAgLTIxOSwxMyArMjIyLDExIEBACiAJCQkJICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CiAJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ3NbMF07Ci0Jc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZyA9IGFkYXB0ZXItPnJ4X3JpbmdzWzBdOwogCiAJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBJNDBFVkZfTUFYX1JYRDsKIAlyaW5nLT50eF9tYXhfcGVuZGluZyA9IEk0MEVWRl9NQVhfVFhEOwotCXJpbmctPnJ4X3BlbmRpbmcgPSByeF9yaW5nLT5jb3VudDsKLQlyaW5nLT50eF9wZW5kaW5nID0gdHhfcmluZy0+Y291bnQ7CisJcmluZy0+cnhfcGVuZGluZyA9IGFkYXB0ZXItPnJ4X2Rlc2NfY291bnQ7CisJcmluZy0+dHhfcGVuZGluZyA9IGFkYXB0ZXItPnR4X2Rlc2NfY291bnQ7CiB9CiAKIC8qKgpAQCAtMjQxLDcgKzI0Miw2IEBACiB7CiAJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1MzIgbmV3X3J4X2NvdW50LCBuZXdfdHhfY291bnQ7Ci0JaW50IGk7CiAKIAlpZiAoKHJpbmctPnJ4X21pbmlfcGVuZGluZykgfHwgKHJpbmctPnJ4X2p1bWJvX3BlbmRpbmcpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI1NywxNyArMjU3LDE2IEBACiAJbmV3X3J4X2NvdW50ID0gQUxJR04obmV3X3J4X2NvdW50LCBJNDBFVkZfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCiAJLyogaWYgbm90aGluZyB0byBkbyByZXR1cm4gc3VjY2VzcyAqLwotCWlmICgobmV3X3R4X2NvdW50ID09IGFkYXB0ZXItPnR4X3JpbmdzWzBdLT5jb3VudCkgJiYKLQkgICAgKG5ld19yeF9jb3VudCA9PSBhZGFwdGVyLT5yeF9yaW5nc1swXS0+Y291bnQpKQorCWlmICgobmV3X3R4X2NvdW50ID09IGFkYXB0ZXItPnR4X2Rlc2NfY291bnQpICYmCisJICAgIChuZXdfcnhfY291bnQgPT0gYWRhcHRlci0+cnhfZGVzY19jb3VudCkpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnZzaV9yZXMtPm51bV9xdWV1ZV9wYWlyczsgaSsrKSB7Ci0JCWFkYXB0ZXItPnR4X3JpbmdzWzBdLT5jb3VudCA9IG5ld190eF9jb3VudDsKLQkJYWRhcHRlci0+cnhfcmluZ3NbMF0tPmNvdW50ID0gbmV3X3J4X2NvdW50OwotCX0KKwlhZGFwdGVyLT50eF9kZXNjX2NvdW50ID0gbmV3X3R4X2NvdW50OworCWFkYXB0ZXItPnJ4X2Rlc2NfY291bnQgPSBuZXdfcnhfY291bnQ7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlpNDBldmZfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yOTAsMTQgKzI4OSwxMyBAQAogCWVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHZzaS0+d29ya19saW1pdDsKIAogCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X2l0cl9zZXR0aW5nKSkKLQkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTsKLQllbHNlCi0JCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IHZzaS0+cnhfaXRyX3NldHRpbmc7CisJCWVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAxOwogCiAJaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfaXRyX3NldHRpbmcpKQotCQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSAxOwotCWVsc2UKLQkJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9pdHJfc2V0dGluZzsKKwkJZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDE7CisKKwllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnJ4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTgsNDAgKzMxNiwzNCBAQAogCXN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvcjsKIAlpbnQgaTsKIAotCWlmIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgfHwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKQotCQl2c2ktPndvcmtfbGltaXQgPSBlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJaWYgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKKwkJdnNpLT53b3JrX2xpbWl0ID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKIAotCXN3aXRjaCAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKSB7Ci0JY2FzZSAwOgotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMKLQkJCQkgICAgICAgfCBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfUlhfREVGKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDwgKEk0MEVfTUlOX0lUUiA8PCAxKSkgfHwKLQkJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPiAoSTQwRV9NQVhfSVRSIDw8IDEpKSkKLQkJCXJldHVybiAtRUlOVkFMOworCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID49IChJNDBFX01JTl9JVFIgPDwgMSkpICYmCisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPD0gKEk0MEVfTUFYX0lUUiA8PCAxKSkpCiAJCXZzaS0+cnhfaXRyX3NldHRpbmcgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0JCWJyZWFrOwotCX0KIAotCXN3aXRjaCAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzKSB7Ci0JY2FzZSAwOgotCQl2c2ktPnR4X2l0cl9zZXR0aW5nID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl2c2ktPnR4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMKLQkJCQkgICAgICAgfCBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfVFhfREVGKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzIDwgKEk0MEVfTUlOX0lUUiA8PCAxKSkgfHwKLQkJICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPiAoSTQwRV9NQVhfSVRSIDw8IDEpKSkKLQkJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+PSAoSTQwRV9NSU5fSVRSIDw8IDEpKSAmJgorCSAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzIDw9IChJNDBFX01BWF9JVFIgPDwgMSkpKQogCQl2c2ktPnR4X2l0cl9zZXR0aW5nID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOwotCQlicmVhazsKLQl9CisJZWxzZSBpZiAoZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSkKKwkJdnNpLT50eF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKKwkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1JYX0RFRikpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKKwkJdnNpLT5yeF9pdHJfc2V0dGluZyB8PSBJNDBFX0lUUl9EWU5BTUlDOworCWVsc2UKKwkJdnNpLT5yeF9pdHJfc2V0dGluZyAmPSB+STQwRV9JVFJfRFlOQU1JQzsKKworCWlmIChlYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlKQorCQl2c2ktPnR4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7CisJZWxzZQorCQl2c2ktPnR4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOwogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05RX1ZFQ1M7IGkrKykgewogCQlxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yW2ldOwpAQCAtMzY1LDcgKzM1NywzMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBpNDBldmZfZXRodG9vbF9vcHMgPSB7CisvKioKKyAqIGk0MGVfZ2V0X3Jzc19oYXNoX29wdHMgLSBHZXQgUlNTIGhhc2ggSW5wdXQgU2V0IGZvciBlYWNoIGZsb3cgdHlwZQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAY21kOiBldGh0b29sIHJ4bmZjIGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIFN1Y2Nlc3MgaWYgdGhlIGZsb3cgaXMgc3VwcG9ydGVkLCBlbHNlIEludmFsaWQgSW5wdXQuCisgKiovCitzdGF0aWMgaW50IGk0MGV2Zl9nZXRfcnNzX2hhc2hfb3B0cyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXU2NCBoZW5hID0gKHU2NClyZDMyKGh3LCBJNDBFX1ZGUUZfSEVOQSgwKSkgfAorCQkgICAoKHU2NClyZDMyKGh3LCBJNDBFX1ZGUUZfSEVOQSgxKSkgPDwgMzIpOworCisJLyogV2UgYWx3YXlzIGhhc2ggb24gSVAgc3JjIGFuZCBkZXN0IGFkZHJlc3NlcyAqLworCWNtZC0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOworCisJc3dpdGNoIChjbWQtPmZsb3dfdHlwZSkgeworCWNhc2UgVENQX1Y0X0ZMT1c6CisJCWlmIChoZW5hICYgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUCkpCisJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQlicmVhazsKKwljYXNlIFVEUF9WNF9GTE9XOgorCQlpZiAoaGVuYSAmICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFApKQorCQkJY21kLT5kYXRhIHw9IFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfVjRfRkxPVzoKKwljYXNlIEFIX0VTUF9WNF9GTE9XOgorCWNhc2UgQUhfVjRfRkxPVzoKKwljYXNlIEVTUF9WNF9GTE9XOgorCWNhc2UgSVBWNF9GTE9XOgorCQlicmVhazsKKworCWNhc2UgVENQX1Y2X0ZMT1c6CisJCWlmIChoZW5hICYgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUCkpCisJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQlicmVhazsKKwljYXNlIFVEUF9WNl9GTE9XOgorCQlpZiAoaGVuYSAmICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFApKQorCQkJY21kLT5kYXRhIHw9IFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfVjZfRkxPVzoKKwljYXNlIEFIX0VTUF9WNl9GTE9XOgorCWNhc2UgQUhfVjZfRkxPVzoKKwljYXNlIEVTUF9WNl9GTE9XOgorCWNhc2UgSVBWNl9GTE9XOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQljbWQtPmRhdGEgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpNDBldmZfZ2V0X3J4bmZjIC0gY29tbWFuZCB0byBnZXQgUlggZmxvdyBjbGFzc2lmaWNhdGlvbiBydWxlcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGNtZDogZXRodG9vbCByeG5mYyBjb21tYW5kCisgKgorICogUmV0dXJucyBTdWNjZXNzIGlmIHRoZSBjb21tYW5kIGlzIHN1cHBvcnRlZC4KKyAqKi8KK3N0YXRpYyBpbnQgaTQwZXZmX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkgICAgdTMyICpydWxlX2xvY3MpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBFVEhUT09MX0dSWFJJTkdTOgorCQljbWQtPmRhdGEgPSBhZGFwdGVyLT52c2lfcmVzLT5udW1fcXVldWVfcGFpcnM7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhGSDoKKwkJcmV0ID0gaTQwZXZmX2dldF9yc3NfaGFzaF9vcHRzKGFkYXB0ZXIsIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaTQwZXZmX3NldF9yc3NfaGFzaF9vcHQgLSBFbmFibGUvRGlzYWJsZSBmbG93IHR5cGVzIGZvciBSU1MgaGFzaAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAY21kOiBldGh0b29sIHJ4bmZjIGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIFN1Y2Nlc3MgaWYgdGhlIGZsb3cgaW5wdXQgc2V0IGlzIHN1cHBvcnRlZC4KKyAqKi8KK3N0YXRpYyBpbnQgaTQwZXZmX3NldF9yc3NfaGFzaF9vcHQoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpuZmMpCit7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJdTY0IGhlbmEgPSAodTY0KXJkMzIoaHcsIEk0MEVfVkZRRl9IRU5BKDApKSB8CisJCSAgICgodTY0KXJkMzIoaHcsIEk0MEVfVkZRRl9IRU5BKDEpKSA8PCAzMik7CisKKwkvKiBSU1MgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGhhc2hpbmcKKwkgKiB0byBxdWV1ZXMgb24gc3JjIGFuZCBkc3QgSVBzIGFuZCBwb3J0cworCSAqLworCWlmIChuZmMtPmRhdGEgJiB+KFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUIHwKKwkJCSAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBXZSBuZWVkIGF0IGxlYXN0IHRoZSBJUCBTUkMgYW5kIERFU1QgZmllbGRzIGZvciBoYXNoaW5nICovCisJaWYgKCEobmZjLT5kYXRhICYgUlhIX0lQX1NSQykgfHwKKwkgICAgIShuZmMtPmRhdGEgJiBSWEhfSVBfRFNUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG5mYy0+Zmxvd190eXBlKSB7CisJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgeworCQljYXNlIDA6CisJCQloZW5hICY9IH4oKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQKTsKKwkJCWJyZWFrOworCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgorCQkJaGVuYSB8PSAoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUQ1BfVjZfRkxPVzoKKwkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgeworCQljYXNlIDA6CisJCQloZW5hICY9IH4oKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQKTsKKwkJCWJyZWFrOworCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgorCQkJaGVuYSB8PSAoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVRFBfVjRfRkxPVzoKKwkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgeworCQljYXNlIDA6CisJCQloZW5hICY9IH4oKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUCkgfAorCQkJCSAgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KSk7CisJCQlicmVhazsKKwkJY2FzZSAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKToKKwkJCWhlbmEgfD0gKCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFApIHwKKwkJCQkgKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgVURQX1Y2X0ZMT1c6CisJCXN3aXRjaCAobmZjLT5kYXRhICYgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMykpIHsKKwkJY2FzZSAwOgorCQkJaGVuYSAmPSB+KCgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFApIHwKKwkJCQkgICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNikpOworCQkJYnJlYWs7CisJCWNhc2UgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMyk6CisJCQloZW5hIHw9ICgoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVURQKSB8CisJCQkJICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFIX0VTUF9WNF9GTE9XOgorCWNhc2UgQUhfVjRfRkxPVzoKKwljYXNlIEVTUF9WNF9GTE9XOgorCWNhc2UgU0NUUF9WNF9GTE9XOgorCQlpZiAoKG5mYy0+ZGF0YSAmIFJYSF9MNF9CXzBfMSkgfHwKKwkJICAgIChuZmMtPmRhdGEgJiBSWEhfTDRfQl8yXzMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWhlbmEgfD0gKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X09USEVSKTsKKwkJYnJlYWs7CisJY2FzZSBBSF9FU1BfVjZfRkxPVzoKKwljYXNlIEFIX1Y2X0ZMT1c6CisJY2FzZSBFU1BfVjZfRkxPVzoKKwljYXNlIFNDVFBfVjZfRkxPVzoKKwkJaWYgKChuZmMtPmRhdGEgJiBSWEhfTDRfQl8wXzEpIHx8CisJCSAgICAobmZjLT5kYXRhICYgUlhIX0w0X0JfMl8zKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQloZW5hIHw9ICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9PVEhFUik7CisJCWJyZWFrOworCWNhc2UgSVBWNF9GTE9XOgorCQloZW5hIHw9ICgodTY0KTEgPDwgSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9PVEhFUikgfAorCQkJKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KTsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X0ZMT1c6CisJCWhlbmEgfD0gKCh1NjQpMSA8PCBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X09USEVSKSB8CisJCQkoKHU2NCkxIDw8IEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cjMyKGh3LCBJNDBFX1ZGUUZfSEVOQSgwKSwgKHUzMiloZW5hKTsKKwl3cjMyKGh3LCBJNDBFX1ZGUUZfSEVOQSgxKSwgKHUzMikoaGVuYSA+PiAzMikpOworCWk0MGVfZmx1c2goaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaTQwZXZmX3NldF9yeG5mYyAtIGNvbW1hbmQgdG8gc2V0IFJYIGZsb3cgY2xhc3NpZmljYXRpb24gcnVsZXMKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjbWQ6IGV0aHRvb2wgcnhuZmMgY29tbWFuZAorICoKKyAqIFJldHVybnMgU3VjY2VzcyBpZiB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQuCisgKiovCitzdGF0aWMgaW50IGk0MGV2Zl9zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgRVRIVE9PTF9TUlhGSDoKKwkJcmV0ID0gaTQwZXZmX3NldF9yc3NfaGFzaF9vcHQoYWRhcHRlciwgY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpNDBldmZfZ2V0X2NoYW5uZWxzOiBnZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGNoOiBjaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICoKKyAqIEZvciB0aGUgcHVycG9zZXMgb2Ygb3VyIGRldmljZSwgd2Ugb25seSB1c2UgY29tYmluZWQgY2hhbm5lbHMsIGkuZS4gYSB0eC9yeAorICogcXVldWUgcGFpci4gUmVwb3J0IG9uZSBleHRyYSBjaGFubmVsIHRvIG1hdGNoIG91ciAib3RoZXIiIE1TSS1YIHZlY3Rvci4KKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGV2Zl9nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2gpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFJlcG9ydCBtYXhpbXVtIGNoYW5uZWxzICovCisJY2gtPm1heF9jb21iaW5lZCA9IGFkYXB0ZXItPnZzaV9yZXMtPm51bV9xdWV1ZV9wYWlyczsKKworCWNoLT5tYXhfb3RoZXIgPSBOT05RX1ZFQ1M7CisJY2gtPm90aGVyX2NvdW50ID0gTk9OUV9WRUNTOworCisJY2gtPmNvbWJpbmVkX2NvdW50ID0gYWRhcHRlci0+dnNpX3Jlcy0+bnVtX3F1ZXVlX3BhaXJzOworfQorCisvKioKKyAqIGk0MGV2Zl9nZXRfcnhmaF9pbmRpcl9zaXplIC0gZ2V0IHRoZSByeCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUgc2l6ZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIHRhYmxlIHNpemUuCisgKiovCitzdGF0aWMgdTMyIGk0MGV2Zl9nZXRfcnhmaF9pbmRpcl9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIChJNDBFX1ZGUUZfSExVVF9NQVhfSU5ERVggKyAxKSAqIDQ7Cit9CisKKy8qKgorICogaTQwZXZmX2dldF9yeGZoIC0gZ2V0IHRoZSByeCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpbmRpcjogaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBrZXk6IGhhc2gga2V5ICh3aWxsIGJlICVOVUxMIHVudGlsIGdldF9yeGZoX2tleV9zaXplIGlzIGltcGxlbWVudGVkKQorICoKKyAqIFJlYWRzIHRoZSBpbmRpcmVjdGlvbiB0YWJsZSBkaXJlY3RseSBmcm9tIHRoZSBoYXJkd2FyZS4gQWx3YXlzIHJldHVybnMgMC4KKyAqKi8KK3N0YXRpYyBpbnQgaTQwZXZmX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqaW5kaXIsIHU4ICprZXkpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIGhsdXRfdmFsOworCWludCBpLCBqOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBJNDBFX1ZGUUZfSExVVF9NQVhfSU5ERVg7IGkrKykgeworCQlobHV0X3ZhbCA9IHJkMzIoaHcsIEk0MEVfVkZRRl9ITFVUKGkpKTsKKwkJaW5kaXJbaisrXSA9IGhsdXRfdmFsICYgMHhmZjsKKwkJaW5kaXJbaisrXSA9IChobHV0X3ZhbCA+PiA4KSAmIDB4ZmY7CisJCWluZGlyW2orK10gPSAoaGx1dF92YWwgPj4gMTYpICYgMHhmZjsKKwkJaW5kaXJbaisrXSA9IChobHV0X3ZhbCA+PiAyNCkgJiAweGZmOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpNDBldmZfc2V0X3J4ZmggLSBzZXQgdGhlIHJ4IGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGluZGlyOiBpbmRpcmVjdGlvbiB0YWJsZQorICogQGtleTogaGFzaCBrZXkgKHdpbGwgYmUgJU5VTEwgdW50aWwgZ2V0X3J4Zmhfa2V5X3NpemUgaXMgaW1wbGVtZW50ZWQpCisgKgorICogUmV0dXJucyAtRUlOVkFMIGlmIHRoZSB0YWJsZSBzcGVjaWZpZXMgYW4gaW5hdmxpZCBxdWV1ZSBpZCwgb3RoZXJ3aXNlCisgKiByZXR1cm5zIDAgYWZ0ZXIgcHJvZ3JhbW1pbmcgdGhlIHRhYmxlLgorICoqLworc3RhdGljIGludCBpNDBldmZfc2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTMyICppbmRpciwKKwkJCSAgIGNvbnN0IHU4ICprZXkpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIGhsdXRfdmFsOworCWludCBpLCBqOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBJNDBFX1ZGUUZfSExVVF9NQVhfSU5ERVggKyAxOyBpKyspIHsKKwkJaGx1dF92YWwgPSBpbmRpcltqKytdOworCQlobHV0X3ZhbCB8PSBpbmRpcltqKytdIDw8IDg7CisJCWhsdXRfdmFsIHw9IGluZGlyW2orK10gPDwgMTY7CisJCWhsdXRfdmFsIHw9IGluZGlyW2orK10gPDwgMjQ7CisJCXdyMzIoaHcsIEk0MEVfVkZRRl9ITFVUKGkpLCBobHV0X3ZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaTQwZXZmX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gaTQwZXZmX2dldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gaTQwZXZmX2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLApAQCAtMzc4LDYgKzY4MywxMiBAQAogCS5zZXRfbXNnbGV2ZWwJCT0gaTQwZXZmX3NldF9tc2dsZXZlbCwKIAkuZ2V0X2NvYWxlc2NlCQk9IGk0MGV2Zl9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQkJPSBpNDBldmZfc2V0X2NvYWxlc2NlLAorCS5nZXRfcnhuZmMJCT0gaTQwZXZmX2dldF9yeG5mYywKKwkuc2V0X3J4bmZjCQk9IGk0MGV2Zl9zZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUJPSBpNDBldmZfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKKwkuZ2V0X3J4ZmgJCT0gaTQwZXZmX2dldF9yeGZoLAorCS5zZXRfcnhmaAkJPSBpNDBldmZfc2V0X3J4ZmgsCisJLmdldF9jaGFubmVscwkJPSBpNDBldmZfZ2V0X2NoYW5uZWxzLAogfTsKIAogLyoqCkBAIC0zODksNSArNzAwLDUgQEAKICAqKi8KIHZvaWQgaTQwZXZmX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpNDBldmZfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmaTQwZXZmX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYwppbmRleCAyNzk3NTQ4Li43ZmM1ZjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYwpAQCAtMTIsNiArMTIsOSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCiAgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KICAqCkBAIC0yNSwxMyArMjgsMTUgQEAKICNpbmNsdWRlICJpNDBlX3Byb3RvdHlwZS5oIgogc3RhdGljIGludCBpNDBldmZfc2V0dXBfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpNDBldmZfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaTQwZXZmX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpNDBldmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKIGNoYXIgaTQwZXZmX2RyaXZlcl9uYW1lW10gPSAiaTQwZXZmIjsKIHN0YXRpYyBjb25zdCBjaGFyIGk0MGV2Zl9kcml2ZXJfc3RyaW5nW10gPQogCSJJbnRlbChSKSBYTDcxMCBYNzEwIFZpcnR1YWwgRnVuY3Rpb24gTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjkuMTYiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjkuMzQiCiBjb25zdCBjaGFyIGk0MGV2Zl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY29uc3QgY2hhciBpNDBldmZfY29weXJpZ2h0W10gPQogCSJDb3B5cmlnaHQgKGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiI7CkBAIC0xNjcsNyArMTcyLDYgQEAKIAlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJYWRhcHRlci0+dHhfdGltZW91dF9jb3VudCsrOwotCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJUWCB0aW1lb3V0IGRldGVjdGVkLlxuIik7CiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJNDBFVkZfRkxBR19SRVNFVF9QRU5ESU5HKSkgewogCQlhZGFwdGVyLT5mbGFncyB8PSBJNDBFVkZfRkxBR19SRVNFVF9ORUVERUQ7CiAJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnJlc2V0X3Rhc2spOwpAQCAtNjU3LDEyICs2NjEsOSBAQAogCWYgPSBpNDBldmZfZmluZF92bGFuKGFkYXB0ZXIsIHZsYW4pOwogCWlmIChOVUxMID09IGYpIHsKIAkJZiA9IGt6YWxsb2Moc2l6ZW9mKCpmKSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChOVUxMID09IGYpIHsKLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJICIlczogbm8gbWVtb3J5IGZvciBuZXcgVkxBTiBmaWx0ZXJcbiIsCi0JCQkJIF9fZnVuY19fKTsKKwkJaWYgKE5VTEwgPT0gZikKIAkJCXJldHVybiBOVUxMOwotCQl9CisKIAkJZi0+dmxhbiA9IHZsYW47CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmYtPmxpc3QpOwpAQCAtNjg4LDcgKzY4OSw2IEBACiAJCWYtPnJlbW92ZSA9IHRydWU7CiAJCWFkYXB0ZXItPmFxX3JlcXVpcmVkIHw9IEk0MEVWRl9GTEFHX0FRX0RFTF9WTEFOX0ZJTFRFUjsKIAl9Ci0JcmV0dXJuOwogfQogCiAvKioKQEAgLTc2NywxNCArNzY3LDEyIEBACiAJaWYgKE5VTEwgPT0gZikgewogCQlmID0ga3phbGxvYyhzaXplb2YoKmYpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKE5VTEwgPT0gZikgewotCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgIiVzOiBubyBtZW1vcnkgZm9yIG5ldyBmaWx0ZXJcbiIsIF9fZnVuY19fKTsKIAkJCWNsZWFyX2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLAogCQkJCSAgJmFkYXB0ZXItPmNyaXRfc2VjdGlvbik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCW1lbWNweShmLT5tYWNhZGRyLCBtYWNhZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShmLT5tYWNhZGRyLCBtYWNhZGRyKTsKIAogCQlsaXN0X2FkZCgmZi0+bGlzdCwgJmFkYXB0ZXItPm1hY19maWx0ZXJfbGlzdCk7CiAJCWYtPmFkZCA9IHRydWU7CkBAIC04MDcsOSArODA1LDggQEAKIAogCWYgPSBpNDBldmZfYWRkX2ZpbHRlcihhZGFwdGVyLCBhZGRyLT5zYV9kYXRhKTsKIAlpZiAoZikgewotCQltZW1jcHkoaHctPm1hYy5hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKLQkJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLAotCQkgICAgICAgbmV0ZGV2LT5hZGRyX2xlbik7CisJCWV0aGVyX2FkZHJfY29weShody0+bWFjLmFkZHIsIGFkZHItPnNhX2RhdGEpOworCQlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+aHcubWFjLmFkZHIpOwogCX0KIAogCXJldHVybiAoZiA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOwpAQCAtODQxLDcgKzgzOCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIGZ0bXAsICZhZGFwdGVyLT5tYWNfZmlsdGVyX2xpc3QsIGxpc3QpIHsKIAkJYm9vbCBmb3VuZCA9IGZhbHNlOwogCi0JCWlmIChmLT5tYWNhZGRyWzBdICYgMHgwMSkgeworCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZi0+bWFjYWRkcikpIHsKIAkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKG1jYSwgbmV0ZGV2KSB7CiAJCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobWNhLT5hZGRyLCBmLT5tYWNhZGRyKSkgewogCQkJCQlmb3VuZCA9IHRydWU7CkBAIC05NzAsNiArOTY3LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBpNDBldmZfbWFjX2ZpbHRlciAqZjsKIAorCWlmIChhZGFwdGVyLT5zdGF0ZSA9PSBfX0k0MEVWRl9ET1dOKQorCQlyZXR1cm47CisKIAkvKiByZW1vdmUgYWxsIE1BQyBmaWx0ZXJzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmYWRhcHRlci0+bWFjX2ZpbHRlcl9saXN0LCBsaXN0KSB7CiAJCWYtPnJlbW92ZSA9IHRydWU7CkBAIC0xMDI3LDMwICsxMDI3LDIxIEBACiAJICogUmlnaHQgbm93LCB3ZSBzaW1wbHkgY2FyZSBhYm91dCBob3cgbWFueSB3ZSdsbCBnZXQ7IHdlJ2xsCiAJICogc2V0IHRoZW0gdXAgbGF0ZXIgd2hpbGUgcmVxdWVzdGluZyBpcnEncy4KIAkgKi8KLQl3aGlsZSAodmVjdG9ycyA+PSB2ZWN0b3JfdGhyZXNob2xkKSB7Ci0JCWVyciA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5tc2l4X2VudHJpZXMsCi0JCQkJICAgICAgdmVjdG9ycyk7Ci0JCWlmICghZXJyKSAvKiBTdWNjZXNzIGluIGFjcXVpcmluZyBhbGwgcmVxdWVzdGVkIHZlY3RvcnMuICovCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoZXJyIDwgMCkKLQkJCXZlY3RvcnMgPSAwOyAvKiBOYXN0eSBmYWlsdXJlLCBxdWl0IG5vdyAqLwotCQllbHNlIC8qIGVyciA9PSBudW1iZXIgb2YgdmVjdG9ycyB3ZSBzaG91bGQgdHJ5IGFnYWluIHdpdGggKi8KLQkJCXZlY3RvcnMgPSBlcnI7Ci0JfQotCi0JaWYgKHZlY3RvcnMgPCB2ZWN0b3JfdGhyZXNob2xkKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHRzLlxuIik7CisJZXJyID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm1zaXhfZW50cmllcywKKwkJCQkgICAgdmVjdG9yX3RocmVzaG9sZCwgdmVjdG9ycyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSS1YIGludGVycnVwdHNcbiIpOwogCQlrZnJlZShhZGFwdGVyLT5tc2l4X2VudHJpZXMpOwogCQlhZGFwdGVyLT5tc2l4X2VudHJpZXMgPSBOVUxMOwotCQllcnIgPSAtRUlPOwotCX0gZWxzZSB7Ci0JCS8qIEFkanVzdCBmb3Igb25seSB0aGUgdmVjdG9ycyB3ZSdsbCB1c2UsIHdoaWNoIGlzIG1pbmltdW0KLQkJICogb2YgbWF4X21zaXhfcV92ZWN0b3JzICsgTk9OUV9WRUNTLCBvciB0aGUgbnVtYmVyIG9mCi0JCSAqIHZlY3RvcnMgd2Ugd2VyZSBhbGxvY2F0ZWQuCi0JCSAqLwotCQlhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzID0gdmVjdG9yczsKKwkJcmV0dXJuIGVycjsKIAl9Ci0JcmV0dXJuIGVycjsKKworCS8qIEFkanVzdCBmb3Igb25seSB0aGUgdmVjdG9ycyB3ZSdsbCB1c2UsIHdoaWNoIGlzIG1pbmltdW0KKwkgKiBvZiBtYXhfbXNpeF9xX3ZlY3RvcnMgKyBOT05RX1ZFQ1MsIG9yIHRoZSBudW1iZXIgb2YKKwkgKiB2ZWN0b3JzIHdlIHdlcmUgYWxsb2NhdGVkLgorCSAqLworCWFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgPSBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTA5NiwxNCArMTA4NywxNCBAQAogCQl0eF9yaW5nLT5xdWV1ZV9pbmRleCA9IGk7CiAJCXR4X3JpbmctPm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAkJdHhfcmluZy0+ZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKLQkJdHhfcmluZy0+Y291bnQgPSBJNDBFVkZfREVGQVVMVF9UWEQ7CisJCXR4X3JpbmctPmNvdW50ID0gYWRhcHRlci0+dHhfZGVzY19jb3VudDsKIAkJYWRhcHRlci0+dHhfcmluZ3NbaV0gPSB0eF9yaW5nOwogCiAJCXJ4X3JpbmcgPSAmdHhfcmluZ1sxXTsKIAkJcnhfcmluZy0+cXVldWVfaW5kZXggPSBpOwogCQlyeF9yaW5nLT5uZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJCXJ4X3JpbmctPmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7Ci0JCXJ4X3JpbmctPmNvdW50ID0gSTQwRVZGX0RFRkFVTFRfUlhEOworCQlyeF9yaW5nLT5jb3VudCA9IGFkYXB0ZXItPnJ4X2Rlc2NfY291bnQ7CiAJCWFkYXB0ZXItPnJ4X3JpbmdzW2ldID0gcnhfcmluZzsKIAl9CiAKQEAgLTExNDEsOSArMTEzMiw2IEBACiAJdl9idWRnZXQgPSBtaW5fdChpbnQsIHBhaXJzLCAoaW50KShudW1fb25saW5lX2NwdXMoKSAqIDIpKSArIE5PTlFfVkVDUzsKIAl2X2J1ZGdldCA9IG1pbl90KGludCwgdl9idWRnZXQsIChpbnQpYWRhcHRlci0+dmZfcmVzLT5tYXhfdmVjdG9ycyk7CiAKLQkvKiBBIGZhaWx1cmUgaW4gTVNJLVggZW50cnkgYWxsb2NhdGlvbiBpc24ndCBmYXRhbCwgYnV0IGl0IGRvZXMKLQkgKiBtZWFuIHdlIGRpc2FibGUgTVNJLVggY2FwYWJpbGl0aWVzIG9mIHRoZSBhZGFwdGVyLgotCSAqLwogCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IGtjYWxsb2Modl9idWRnZXQsCiAJCQkJCXNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CkBAIC0xMTgzLDcgKzExNzEsNyBAQAogCQlxX3ZlY3Rvci0+dnNpID0gJmFkYXB0ZXItPnZzaTsKIAkJcV92ZWN0b3ItPnZfaWR4ID0gcV9pZHg7CiAJCW5ldGlmX25hcGlfYWRkKGFkYXB0ZXItPm5ldGRldiwgJnFfdmVjdG9yLT5uYXBpLAotCQkJCSAgICAgICBpNDBldmZfbmFwaV9wb2xsLCA2NCk7CisJCQkJICAgICAgIGk0MGV2Zl9uYXBpX3BvbGwsIE5BUElfUE9MTF9XRUlHSFQpOwogCQlhZGFwdGVyLT5xX3ZlY3RvcltxX2lkeF0gPSBxX3ZlY3RvcjsKIAl9CiAKQEAgLTEyMzYsOCArMTIyNCw2IEBACiAJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKIAlrZnJlZShhZGFwdGVyLT5tc2l4X2VudHJpZXMpOwogCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IE5VTEw7Ci0KLQlyZXR1cm47CiB9CiAKIC8qKgpAQCAtMTMwOSw3ICsxMjk1LDYgQEAKIAkJZ290byByZXN0YXJ0X3dhdGNoZG9nOwogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSTQwRVZGX0ZMQUdfUEZfQ09NTVNfRkFJTEVEKSB7Ci0JCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJDaGVja2luZyBmb3IgcmVkZW1wdGlvblxuIik7CiAJCWlmICgocmQzMihodywgSTQwRV9WRkdFTl9SU1RBVCkgJiAweDMpID09IEk0MEVfVkZSX1ZGQUNUSVZFKSB7CiAJCQkvKiBBIGNoYW5jZSBmb3IgcmVkZW1wdGlvbiEgKi8KIAkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkhhcmR3YXJlIGNhbWUgb3V0IG9mIHJlc2V0LiBBdHRlbXB0aW5nIHJlaW5pdC5cbiIpOwpAQCAtMTM0MCw4ICsxMzI1LDcgQEAKIAkgICAgKHJkMzIoaHcsIEk0MEVfVkZHRU5fUlNUQVQpICYgMHgzKSAhPSBJNDBFX1ZGUl9WRkFDVElWRSkgewogCQlhZGFwdGVyLT5zdGF0ZSA9IF9fSTQwRVZGX1JFU0VUVElORzsKIAkJYWRhcHRlci0+ZmxhZ3MgfD0gSTQwRVZGX0ZMQUdfUkVTRVRfUEVORElORzsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiSGFyZHdhcmUgcmVzZXQgZGV0ZWN0ZWQuXG4iKTsKLQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlNjaGVkdWxpbmcgcmVzZXQgdGFza1xuIik7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkhhcmR3YXJlIHJlc2V0IGRldGVjdGVkXG4iKTsKIAkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7CiAJCWFkYXB0ZXItPmFxX3BlbmRpbmcgPSAwOwogCQlhZGFwdGVyLT5hcV9yZXF1aXJlZCA9IDA7CkBAIC0xNDEzLDcgKzEzOTcsNyBAQAogfQogCiAvKioKLSAqIGk0MGV2Zl9jb25maWd1cmVfcnNzIC0gaW5jcmVtZW50IHRvIG5leHQgYXZhaWxhYmxlIHR4IHF1ZXVlCisgKiBuZXh0X3F1ZXVlIC0gaW5jcmVtZW50IHRvIG5leHQgYXZhaWxhYmxlIHR4IHF1ZXVlCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEBqOiBxdWV1ZSBjb3VudGVyCiAgKgpAQCAtMTUwNCwxNSArMTQ4OCwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBJNDBFVkZfUkVTRVRfV0FJVF9DT1VOVDsgaSsrKSB7CiAJCXJzdGF0X3ZhbCA9IHJkMzIoaHcsIEk0MEVfVkZHRU5fUlNUQVQpICYKIAkJCSAgICBJNDBFX1ZGR0VOX1JTVEFUX1ZGUl9TVEFURV9NQVNLOwotCQlpZiAocnN0YXRfdmFsICE9IEk0MEVfVkZSX1ZGQUNUSVZFKSB7Ci0JCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVzZXQgbm93IG9jY3VycmluZ1xuIik7CisJCWlmIChyc3RhdF92YWwgIT0gSTQwRV9WRlJfVkZBQ1RJVkUpCiAJCQlicmVhazsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJbXNsZWVwKEk0MEVWRl9SRVNFVF9XQUlUX01TKTsKLQkJfQogCX0KIAlpZiAoaSA9PSBJNDBFVkZfUkVTRVRfV0FJVF9DT1VOVCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSZXNldCB3YXMgbm90IGRldGVjdGVkXG4iKTsKIAkJYWRhcHRlci0+ZmxhZ3MgJj0gfkk0MEVWRl9GTEFHX1JFU0VUX1BFTkRJTkc7CiAJCWdvdG8gY29udGludWVfcmVzZXQ7IC8qIGFjdCBsaWtlIHRoZSByZXNldCBoYXBwZW5lZCAqLwogCX0KQEAgLTE1MjEsMjIgKzE1MDIsMjQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgSTQwRVZGX1JFU0VUX1dBSVRfQ09VTlQ7IGkrKykgewogCQlyc3RhdF92YWwgPSByZDMyKGh3LCBJNDBFX1ZGR0VOX1JTVEFUKSAmCiAJCQkgICAgSTQwRV9WRkdFTl9SU1RBVF9WRlJfU1RBVEVfTUFTSzsKLQkJaWYgKHJzdGF0X3ZhbCA9PSBJNDBFX1ZGUl9WRkFDVElWRSkgewotCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlJlc2V0IGlzIGNvbXBsZXRlLiBSZWluaXRpYWxpemluZy5cbiIpOworCQlpZiAocnN0YXRfdmFsID09IEk0MEVfVkZSX1ZGQUNUSVZFKQogCQkJYnJlYWs7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCW1zbGVlcChJNDBFVkZfUkVTRVRfV0FJVF9NUyk7Ci0JCX0KIAl9CiAJaWYgKGkgPT0gSTQwRVZGX1JFU0VUX1dBSVRfQ09VTlQpIHsKIAkJLyogcmVzZXQgbmV2ZXIgZmluaXNoZWQgKi8KLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVzZXQgbmV2ZXIgZmluaXNoZWQgKCV4KS4gUEYgZHJpdmVyIGlzIGRlYWQsIGFuZCBzbyBhbSBJLlxuIiwKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVzZXQgbmV2ZXIgZmluaXNoZWQgKCV4KVxuIiwKIAkJCXJzdGF0X3ZhbCk7CiAJCWFkYXB0ZXItPmZsYWdzIHw9IEk0MEVWRl9GTEFHX1BGX0NPTU1TX0ZBSUxFRDsKIAotCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQotCQkJaTQwZXZmX2Nsb3NlKGFkYXB0ZXItPm5ldGRldik7Ci0KKwkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkJc2V0X2JpdChfX0k0MEVfRE9XTiwgJmFkYXB0ZXItPnZzaS5zdGF0ZSk7CisJCQlpNDBldmZfZG93bihhZGFwdGVyKTsKKwkJCWk0MGV2Zl9mcmVlX3RyYWZmaWNfaXJxcyhhZGFwdGVyKTsKKwkJCWk0MGV2Zl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJCQlpNDBldmZfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQl9CiAJCWk0MGV2Zl9mcmVlX21pc2NfaXJxKGFkYXB0ZXIpOwogCQlpNDBldmZfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CiAJCWk0MGV2Zl9mcmVlX3F1ZXVlcyhhZGFwdGVyKTsKQEAgLTE1OTEsNyArMTU3NCw3IEBACiAJfQogCXJldHVybjsKIHJlc2V0X2VycjoKLQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGR1cmluZyByZWluaXQuXG4iKTsKKwlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGR1cmluZyByZWluaXRcbiIpOwogCWk0MGV2Zl9jbG9zZShhZGFwdGVyLT5uZXRkZXYpOwogfQogCkBAIC0xNjA3LDYgKzE1OTAsNyBAQAogCXN0cnVjdCBpNDBlX2FycV9ldmVudF9pbmZvIGV2ZW50OwogCXN0cnVjdCBpNDBlX3ZpcnRjaG5sX21zZyAqdl9tc2c7CiAJaTQwZV9zdGF0dXMgcmV0OworCXUzMiB2YWwsIG9sZHZhbDsKIAl1MTYgcGVuZGluZzsKIAogCWlmIChhZGFwdGVyLT5mbGFncyAmIEk0MEVWRl9GTEFHX1BGX0NPTU1TX0ZBSUxFRCkKQEAgLTE2MTQsMTEgKzE1OTgsOSBAQAogCiAJZXZlbnQubXNnX3NpemUgPSBJNDBFVkZfTUFYX0FRX0JVRl9TSVpFOwogCWV2ZW50Lm1zZ19idWYgPSBremFsbG9jKGV2ZW50Lm1zZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWV2ZW50Lm1zZ19idWYpIHsKLQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBubyBtZW1vcnkgZm9yIEFSUSBjbGVhblxuIiwKLQkJCQkgX19mdW5jX18pOworCWlmICghZXZlbnQubXNnX2J1ZikKIAkJcmV0dXJuOwotCX0KKwogCXZfbXNnID0gKHN0cnVjdCBpNDBlX3ZpcnRjaG5sX21zZyAqKSZldmVudC5kZXNjOwogCWRvIHsKIAkJcmV0ID0gaTQwZXZmX2NsZWFuX2FycV9lbGVtZW50KGh3LCAmZXZlbnQsICZwZW5kaW5nKTsKQEAgLTE2MzYsNiArMTYxOCw0MSBAQAogCQl9CiAJfSB3aGlsZSAocGVuZGluZyk7CiAKKwkvKiBjaGVjayBmb3IgZXJyb3IgaW5kaWNhdGlvbnMgKi8KKwl2YWwgPSByZDMyKGh3LCBody0+YXEuYXJxLmxlbik7CisJb2xkdmFsID0gdmFsOworCWlmICh2YWwgJiBJNDBFX1ZGX0FSUUxFTl9BUlFWRkVfTUFTSykgeworCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiQVJRIFZGIEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1ZGX0FSUUxFTl9BUlFWRkVfTUFTSzsKKwl9CisJaWYgKHZhbCAmIEk0MEVfVkZfQVJRTEVOX0FSUU9WRkxfTUFTSykgeworCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiQVJRIE92ZXJmbG93IEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1ZGX0FSUUxFTl9BUlFPVkZMX01BU0s7CisJfQorCWlmICh2YWwgJiBJNDBFX1ZGX0FSUUxFTl9BUlFDUklUX01BU0spIHsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkFSUSBDcml0aWNhbCBFcnJvciBkZXRlY3RlZFxuIik7CisJCXZhbCAmPSB+STQwRV9WRl9BUlFMRU5fQVJRQ1JJVF9NQVNLOworCX0KKwlpZiAob2xkdmFsICE9IHZhbCkKKwkJd3IzMihodywgaHctPmFxLmFycS5sZW4sIHZhbCk7CisKKwl2YWwgPSByZDMyKGh3LCBody0+YXEuYXNxLmxlbik7CisJb2xkdmFsID0gdmFsOworCWlmICh2YWwgJiBJNDBFX1ZGX0FUUUxFTl9BVFFWRkVfTUFTSykgeworCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiQVNRIFZGIEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1ZGX0FUUUxFTl9BVFFWRkVfTUFTSzsKKwl9CisJaWYgKHZhbCAmIEk0MEVfVkZfQVRRTEVOX0FUUU9WRkxfTUFTSykgeworCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiQVNRIE92ZXJmbG93IEVycm9yIGRldGVjdGVkXG4iKTsKKwkJdmFsICY9IH5JNDBFX1ZGX0FUUUxFTl9BVFFPVkZMX01BU0s7CisJfQorCWlmICh2YWwgJiBJNDBFX1ZGX0FUUUxFTl9BVFFDUklUX01BU0spIHsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkFTUSBDcml0aWNhbCBFcnJvciBkZXRlY3RlZFxuIik7CisJCXZhbCAmPSB+STQwRV9WRl9BVFFMRU5fQVRRQ1JJVF9NQVNLOworCX0KKwlpZiAob2xkdmFsICE9IHZhbCkKKwkJd3IzMihodywgaHctPmFxLmFzcS5sZW4sIHZhbCk7CisKIAkvKiByZS1lbmFibGUgQWRtaW4gcXVldWUgaW50ZXJydXB0IGNhdXNlICovCiAJaTQwZXZmX21pc2NfaXJxX2VuYWJsZShhZGFwdGVyKTsKIApAQCAtMTY3Myw2ICsxNjkwLDcgQEAKIAlpbnQgaSwgZXJyID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT52c2lfcmVzLT5udW1fcXVldWVfcGFpcnM7IGkrKykgeworCQlhZGFwdGVyLT50eF9yaW5nc1tpXS0+Y291bnQgPSBhZGFwdGVyLT50eF9kZXNjX2NvdW50OwogCQllcnIgPSBpNDBldmZfc2V0dXBfdHhfZGVzY3JpcHRvcnMoYWRhcHRlci0+dHhfcmluZ3NbaV0pOwogCQlpZiAoIWVycikKIAkJCWNvbnRpbnVlOwpAQCAtMTcwMCw2ICsxNzE4LDcgQEAKIAlpbnQgaSwgZXJyID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT52c2lfcmVzLT5udW1fcXVldWVfcGFpcnM7IGkrKykgeworCQlhZGFwdGVyLT5yeF9yaW5nc1tpXS0+Y291bnQgPSBhZGFwdGVyLT5yeF9kZXNjX2NvdW50OwogCQllcnIgPSBpNDBldmZfc2V0dXBfcnhfZGVzY3JpcHRvcnMoYWRhcHRlci0+cnhfcmluZ3NbaV0pOwogCQlpZiAoIWVycikKIAkJCWNvbnRpbnVlOwpAQCAtMTgwNCwxMiArMTgyMywxMSBAQAogCWlmIChhZGFwdGVyLT5zdGF0ZSA8PSBfX0k0MEVWRl9ET1dOKQogCQlyZXR1cm4gMDsKIAotCS8qIHNpZ25hbCB0aGF0IHdlIGFyZSBkb3duIHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWFkYXB0ZXItPnN0YXRlID0gX19JNDBFVkZfRE9XTjsKIAogCXNldF9iaXQoX19JNDBFX0RPV04sICZhZGFwdGVyLT52c2kuc3RhdGUpOwogCiAJaTQwZXZmX2Rvd24oYWRhcHRlcik7CisJYWRhcHRlci0+c3RhdGUgPSBfX0k0MEVWRl9ET1dOOwogCWk0MGV2Zl9mcmVlX3RyYWZmaWNfaXJxcyhhZGFwdGVyKTsKIAogCWk0MGV2Zl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CkBAIC0xODQ4LDggKzE4NjYsNiBAQAogCiAJV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7CiAKLQlhZGFwdGVyLT5zdGF0ZSA9IF9fSTQwRVZGX1JFU0VUVElORzsKLQogCWk0MGV2Zl9kb3duKGFkYXB0ZXIpOwogCiAJLyogYWxsb2NhdGUgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KQEAgLTE4NzIsNyArMTg4OCw3IEBACiAJcmV0dXJuOwogCiBlcnJfcmVpbml0OgotCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXNvdXJjZXMgZHVyaW5nIHJlaW5pdC5cbiIpOworCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXNvdXJjZXMgZHVyaW5nIHJlaW5pdFxuIik7CiAJaTQwZXZmX2Nsb3NlKG5ldGRldik7CiB9CiAKQEAgLTE5NjcsNyArMTk4Myw3IEBACiAJCX0KIAkJZXJyID0gaTQwZXZmX2NoZWNrX3Jlc2V0X2NvbXBsZXRlKGh3KTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIGlzIHN0aWxsIGluIHJlc2V0ICglZClcbiIsCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRGV2aWNlIGlzIHN0aWxsIGluIHJlc2V0ICglZCksIHJldHJ5aW5nXG4iLAogCQkJCWVycik7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMTk5MywxNCArMjAwOSwxNCBAQAogCQlicmVhazsKIAljYXNlIF9fSTQwRVZGX0lOSVRfVkVSU0lPTl9DSEVDSzoKIAkJaWYgKCFpNDBldmZfYXNxX2RvbmUoaHcpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBZG1pbiBxdWV1ZSBjb21tYW5kIG5ldmVyIGNvbXBsZXRlZC5cbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWRtaW4gcXVldWUgY29tbWFuZCBuZXZlciBjb21wbGV0ZWRcbiIpOwogCQkJZ290byBlcnI7CiAJCX0KIAogCQkvKiBhcSBtc2cgc2VudCwgYXdhaXRpbmcgcmVwbHkgKi8KIAkJZXJyID0gaTQwZXZmX3ZlcmlmeV9hcGlfdmVyKGFkYXB0ZXIpOwogCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gdmVyaWZ5IEFQSSB2ZXJzaW9uICglZClcbiIsCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHZlcmlmeSBBUEkgdmVyc2lvbiAoJWQpLCByZXRyeWluZ1xuIiwKIAkJCQllcnIpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTIwNzQsMTIgKzIwOTAsMTIgQEAKIAluZXRkZXYtPmh3X2ZlYXR1cmVzICY9IH5ORVRJRl9GX1JYQ1NVTTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGFwdGVyLT5ody5tYWMuYWRkcikpIHsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkludmFsaWQgTUFDIGFkZHJlc3MgJXBNQUMsIHVzaW5nIHJhbmRvbVxuIiwKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkludmFsaWQgTUFDIGFkZHJlc3MgJXBNLCB1c2luZyByYW5kb21cbiIsCiAJCQkgYWRhcHRlci0+aHcubWFjLmFkZHIpOwogCQlyYW5kb21fZXRoZXJfYWRkcihhZGFwdGVyLT5ody5tYWMuYWRkcik7CiAJfQotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5ody5tYWMuYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7Ci0JbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBhZGFwdGVyLT5ody5tYWMuYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5wZXJtX2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyKTsKIAogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5tYWNfZmlsdGVyX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT52bGFuX2ZpbHRlcl9saXN0KTsKQEAgLTIwODcsNyArMjEwMyw3IEBACiAJaWYgKE5VTEwgPT0gZikKIAkJZ290byBlcnJfc3dfaW5pdDsKIAotCW1lbWNweShmLT5tYWNhZGRyLCBhZGFwdGVyLT5ody5tYWMuYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShmLT5tYWNhZGRyLCBhZGFwdGVyLT5ody5tYWMuYWRkcik7CiAJZi0+YWRkID0gdHJ1ZTsKIAlhZGFwdGVyLT5hcV9yZXF1aXJlZCB8PSBJNDBFVkZfRkxBR19BUV9BRERfTUFDX0ZJTFRFUjsKIApAQCAtMjA5OCw2ICsyMTE0LDggQEAKIAlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKIAltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMSk7CiAKKwlhZGFwdGVyLT50eF9kZXNjX2NvdW50ID0gSTQwRVZGX0RFRkFVTFRfVFhEOworCWFkYXB0ZXItPnJ4X2Rlc2NfY291bnQgPSBJNDBFVkZfREVGQVVMVF9SWEQ7CiAJZXJyID0gaTQwZXZmX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9zd19pbml0OwpAQCAtMjExNCw4ICsyMTMyLDEwIEBACiAJYWRhcHRlci0+dnNpLmJhY2sgPSBhZGFwdGVyOwogCWFkYXB0ZXItPnZzaS5iYXNlX3ZlY3RvciA9IDE7CiAJYWRhcHRlci0+dnNpLndvcmtfbGltaXQgPSBJNDBFX0RFRkFVTFRfSVJRX1dPUks7Ci0JYWRhcHRlci0+dnNpLnJ4X2l0cl9zZXR0aW5nID0gSTQwRV9JVFJfRFlOQU1JQzsKLQlhZGFwdGVyLT52c2kudHhfaXRyX3NldHRpbmcgPSBJNDBFX0lUUl9EWU5BTUlDOworCWFkYXB0ZXItPnZzaS5yeF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKKwkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1JYX0RFRikpOworCWFkYXB0ZXItPnZzaS50eF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKKwkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1RYX0RFRikpOwogCWFkYXB0ZXItPnZzaS5uZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKIAlpZiAoIWFkYXB0ZXItPm5ldGRldl9yZWdpc3RlcmVkKSB7CkBAIC0yMTI4LDcgKzIxNDgsNyBAQAogCiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTUFDIGFkZHJlc3M6ICVwTUFDXG4iLCBhZGFwdGVyLT5ody5tYWMuYWRkcik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyKTsKIAlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfR1JPKQogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiR1JPIGlzIGVuYWJsZWRcbiIpOwogCkBAIC0yMTUyLDEyICsyMTcyLDExIEBACiBlcnI6CiAJLyogVGhpbmdzIHdlbnQgaW50byB0aGUgd2VlZHMsIHNvIHRyeSBhZ2FpbiBsYXRlciAqLwogCWlmICgrK2FkYXB0ZXItPmFxX3dhaXRfY291bnQgPiBJNDBFVkZfQVFfTUFYX0VSUikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBQRjsgZ2l2aW5nIHVwLlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBjb21tdW5pY2F0ZSB3aXRoIFBGOyBnaXZpbmcgdXBcbiIpOwogCQlhZGFwdGVyLT5mbGFncyB8PSBJNDBFVkZfRkxBR19QRl9DT01NU19GQUlMRUQ7CiAJCXJldHVybjsgLyogZG8gbm90IHJlc2NoZWR1bGUgKi8KIAl9CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT5pbml0X3Rhc2ssIEhaICogMyk7Ci0JcmV0dXJuOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYwppbmRleCBlMjk0ZjAxLi4yZGMwYmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX3ZpcnRjaG5sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl92aXJ0Y2hubC5jCkBAIC0xMiw2ICsxMiw5IEBACiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKICAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogICoKQEAgLTIxNiwxMSArMjE5LDkgQEAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfdnNpX3F1ZXVlX2NvbmZpZ19pbmZvKSArCiAJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3F1ZXVlX3BhaXJfaW5mbykgKiBwYWlycyk7CiAJdnFjaSA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXZxY2kpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCF2cWNpKQogCQlyZXR1cm47Ci0JfQorCiAJdnFjaS0+dnNpX2lkID0gYWRhcHRlci0+dnNpX3Jlcy0+dnNpX2lkOwogCXZxY2ktPm51bV9xdWV1ZV9wYWlycyA9IHBhaXJzOwogCXZxcGkgPSB2cWNpLT5xcGFpcjsKQEAgLTIzMiw2ICsyMzMsOSBAQAogCQl2cXBpLT50eHEucXVldWVfaWQgPSBpOwogCQl2cXBpLT50eHEucmluZ19sZW4gPSBhZGFwdGVyLT50eF9yaW5nc1tpXS0+Y291bnQ7CiAJCXZxcGktPnR4cS5kbWFfcmluZ19hZGRyID0gYWRhcHRlci0+dHhfcmluZ3NbaV0tPmRtYTsKKwkJdnFwaS0+dHhxLmhlYWR3Yl9lbmFibGVkID0gMTsKKwkJdnFwaS0+dHhxLmRtYV9oZWFkd2JfYWRkciA9IHZxcGktPnR4cS5kbWFfcmluZ19hZGRyICsKKwkJICAgICh2cXBpLT50eHEucmluZ19sZW4gKiBzaXplb2Yoc3RydWN0IGk0MGVfdHhfZGVzYykpOwogCiAJCXZxcGktPnJ4cS52c2lfaWQgPSB2cWNpLT52c2lfaWQ7CiAJCXZxcGktPnJ4cS5xdWV1ZV9pZCA9IGk7CkBAIC0zMjksMTEgKzMzMyw4IEBACiAJICAgICAgKGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgKgogCQlzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfdmVjdG9yX21hcCkpOwogCXZpbWkgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF2aW1pKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAotCQkJX19mdW5jX18pOworCWlmICghdmltaSkKIAkJcmV0dXJuOwotCX0KIAogCXZpbWktPm51bV92ZWN0b3JzID0gYWRhcHRlci0+bnVtX21zaXhfdmVjdG9yczsKIAkvKiBRdWV1ZSB2ZWN0b3JzIGZpcnN0ICovCkBAIC0zOTAsNyArMzkxLDcgQEAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfZXRoZXJfYWRkcl9saXN0KSArCiAJICAgICAgKGNvdW50ICogc2l6ZW9mKHN0cnVjdCBpNDBlX3ZpcnRjaG5sX2V0aGVyX2FkZHIpKTsKIAlpZiAobGVuID4gSTQwRVZGX01BWF9BUV9CVUZfU0laRSkgewotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IFRvbyBtYW55IE1BQyBhZGRyZXNzIGNoYW5nZXMgaW4gb25lIHJlcXVlc3QuXG4iLAorCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IFRvbyBtYW55IE1BQyBhZGRyZXNzIGNoYW5nZXMgaW4gb25lIHJlcXVlc3RcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCWNvdW50ID0gKEk0MEVWRl9NQVhfQVFfQlVGX1NJWkUgLQogCQkJIHNpemVvZihzdHJ1Y3QgaTQwZV92aXJ0Y2hubF9ldGhlcl9hZGRyX2xpc3QpKSAvCkBAIC0zOTksMTYgKzQwMCwxNCBAQAogCX0KIAogCXZlYWwgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF2ZWFsKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAotCQkJX19mdW5jX18pOworCWlmICghdmVhbCkKIAkJcmV0dXJuOwotCX0KKwogCXZlYWwtPnZzaV9pZCA9IGFkYXB0ZXItPnZzaV9yZXMtPnZzaV9pZDsKIAl2ZWFsLT5udW1fZWxlbWVudHMgPSBjb3VudDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZhZGFwdGVyLT5tYWNfZmlsdGVyX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGYtPmFkZCkgewotCQkJbWVtY3B5KHZlYWwtPmxpc3RbaV0uYWRkciwgZi0+bWFjYWRkciwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KHZlYWwtPmxpc3RbaV0uYWRkciwgZi0+bWFjYWRkcik7CiAJCQlpKys7CiAJCQlmLT5hZGQgPSBmYWxzZTsKIAkJfQpAQCAtNDU0LDcgKzQ1Myw3IEBACiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBpNDBlX3ZpcnRjaG5sX2V0aGVyX2FkZHJfbGlzdCkgKwogCSAgICAgIChjb3VudCAqIHNpemVvZihzdHJ1Y3QgaTQwZV92aXJ0Y2hubF9ldGhlcl9hZGRyKSk7CiAJaWYgKGxlbiA+IEk0MEVWRl9NQVhfQVFfQlVGX1NJWkUpIHsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBUb28gbWFueSBNQUMgYWRkcmVzcyBjaGFuZ2VzIGluIG9uZSByZXF1ZXN0LlxuIiwKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBUb28gbWFueSBNQUMgYWRkcmVzcyBjaGFuZ2VzIGluIG9uZSByZXF1ZXN0XG4iLAogCQkJX19mdW5jX18pOwogCQljb3VudCA9IChJNDBFVkZfTUFYX0FRX0JVRl9TSVpFIC0KIAkJCSBzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfZXRoZXJfYWRkcl9saXN0KSkgLwpAQCAtNDYyLDE2ICs0NjEsMTQgQEAKIAkJbGVuID0gSTQwRVZGX01BWF9BUV9CVUZfU0laRTsKIAl9CiAJdmVhbCA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXZlYWwpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCF2ZWFsKQogCQlyZXR1cm47Ci0JfQorCiAJdmVhbC0+dnNpX2lkID0gYWRhcHRlci0+dnNpX3Jlcy0+dnNpX2lkOwogCXZlYWwtPm51bV9lbGVtZW50cyA9IGNvdW50OwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBmdG1wLCAmYWRhcHRlci0+bWFjX2ZpbHRlcl9saXN0LCBsaXN0KSB7CiAJCWlmIChmLT5yZW1vdmUpIHsKLQkJCW1lbWNweSh2ZWFsLT5saXN0W2ldLmFkZHIsIGYtPm1hY2FkZHIsIEVUSF9BTEVOKTsKKwkJCWV0aGVyX2FkZHJfY29weSh2ZWFsLT5saXN0W2ldLmFkZHIsIGYtPm1hY2FkZHIpOwogCQkJaSsrOwogCQkJbGlzdF9kZWwoJmYtPmxpc3QpOwogCQkJa2ZyZWUoZik7CkBAIC01MTgsNyArNTE1LDcgQEAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfdmxhbl9maWx0ZXJfbGlzdCkgKwogCSAgICAgIChjb3VudCAqIHNpemVvZih1MTYpKTsKIAlpZiAobGVuID4gSTQwRVZGX01BWF9BUV9CVUZfU0laRSkgewotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IFRvbyBtYW55IFZMQU4gY2hhbmdlcyBpbiBvbmUgcmVxdWVzdC5cbiIsCisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogVG9vIG1hbnkgVkxBTiBjaGFuZ2VzIGluIG9uZSByZXF1ZXN0XG4iLAogCQkJX19mdW5jX18pOwogCQljb3VudCA9IChJNDBFVkZfTUFYX0FRX0JVRl9TSVpFIC0KIAkJCSBzaXplb2Yoc3RydWN0IGk0MGVfdmlydGNobmxfdmxhbl9maWx0ZXJfbGlzdCkpIC8KQEAgLTUyNiwxMSArNTIzLDkgQEAKIAkJbGVuID0gSTQwRVZGX01BWF9BUV9CVUZfU0laRTsKIAl9CiAJdnZmbCA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXZ2ZmwpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCF2dmZsKQogCQlyZXR1cm47Ci0JfQorCiAJdnZmbC0+dnNpX2lkID0gYWRhcHRlci0+dnNpX3Jlcy0+dnNpX2lkOwogCXZ2ZmwtPm51bV9lbGVtZW50cyA9IGNvdW50OwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmFkYXB0ZXItPnZsYW5fZmlsdGVyX2xpc3QsIGxpc3QpIHsKQEAgLTU4MCw3ICs1NzUsNyBAQAogCWxlbiA9IHNpemVvZihzdHJ1Y3QgaTQwZV92aXJ0Y2hubF92bGFuX2ZpbHRlcl9saXN0KSArCiAJICAgICAgKGNvdW50ICogc2l6ZW9mKHUxNikpOwogCWlmIChsZW4gPiBJNDBFVkZfTUFYX0FRX0JVRl9TSVpFKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogVG9vIG1hbnkgVkxBTiBjaGFuZ2VzIGluIG9uZSByZXF1ZXN0LlxuIiwKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBUb28gbWFueSBWTEFOIGNoYW5nZXMgaW4gb25lIHJlcXVlc3RcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCWNvdW50ID0gKEk0MEVWRl9NQVhfQVFfQlVGX1NJWkUgLQogCQkJIHNpemVvZihzdHJ1Y3QgaTQwZV92aXJ0Y2hubF92bGFuX2ZpbHRlcl9saXN0KSkgLwpAQCAtNTg4LDExICs1ODMsOSBAQAogCQlsZW4gPSBJNDBFVkZfTUFYX0FRX0JVRl9TSVpFOwogCX0KIAl2dmZsID0ga3phbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwotCWlmICghdnZmbCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwKLQkJCV9fZnVuY19fKTsKKwlpZiAoIXZ2ZmwpCiAJCXJldHVybjsKLQl9CisKIAl2dmZsLT52c2lfaWQgPSBhZGFwdGVyLT52c2lfcmVzLT52c2lfaWQ7CiAJdnZmbC0+bnVtX2VsZW1lbnRzID0gY291bnQ7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIGZ0bXAsICZhZGFwdGVyLT52bGFuX2ZpbHRlcl9saXN0LCBsaXN0KSB7CkBAIC03MjEsNyArNzE0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodl9vcGNvZGUgIT0gYWRhcHRlci0+Y3VycmVudF9vcCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogUGVuZGluZyBvcCBpcyAlZCwgcmVjZWl2ZWQgJWQuXG4iLAorCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogUGVuZGluZyBvcCBpcyAlZCwgcmVjZWl2ZWQgJWRcbiIsCiAJCQlfX2Z1bmNfXywgYWRhcHRlci0+Y3VycmVudF9vcCwgdl9vcGNvZGUpOwogCQkvKiBXZSdyZSBwcm9iYWJseSBjb21wbGV0ZWx5IHNjcmV3ZWQgYXQgdGhpcyBwb2ludCwgYnV0IGNsZWFyCiAJCSAqIHRoZSBjdXJyZW50IG9wIGFuZCB0cnkgdG8gY2Fycnkgb24uLi4uCkBAIC03MzAsNyArNzIzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodl9yZXR2YWwpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IFBGIHJldHVybmVkIGVycm9yICVkIHRvIG91ciByZXF1ZXN0ICVkIVxuIiwKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IFBGIHJldHVybmVkIGVycm9yICVkIHRvIG91ciByZXF1ZXN0ICVkXG4iLAogCQkJX19mdW5jX18sIHZfcmV0dmFsLCB2X29wY29kZSk7CiAJfQogCXN3aXRjaCAodl9vcGNvZGUpIHsKQEAgLTc0NSw5ICs3MzgsOCBAQAogCQkJCQkJIHN0YXRzLT50eF9icm9hZGNhc3Q7CiAJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyA9IHN0YXRzLT5yeF9ieXRlczsKIAkJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2J5dGVzID0gc3RhdHMtPnR4X2J5dGVzOwotCQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0gc3RhdHMtPnJ4X2Vycm9yczsKIAkJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IHN0YXRzLT50eF9lcnJvcnM7Ci0JCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkID0gc3RhdHMtPnJ4X21pc3NlZDsKKwkJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQgPSBzdGF0cy0+cnhfZGlzY2FyZHM7CiAJCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9kcm9wcGVkID0gc3RhdHMtPnR4X2Rpc2NhcmRzOwogCQlhZGFwdGVyLT5jdXJyZW50X3N0YXRzID0gKnN0YXRzOwogCQl9CkBAIC03ODEsNyArNzczLDcgQEAKIAkJYWRhcHRlci0+YXFfcGVuZGluZyAmPSB+KEk0MEVWRl9GTEFHX0FRX01BUF9WRUNUT1JTKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBSZWNlaXZlZCB1bmV4cGVjdGVkIG1lc3NhZ2UgJWQgZnJvbSBQRi5cbiIsCisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogUmVjZWl2ZWQgdW5leHBlY3RlZCBtZXNzYWdlICVkIGZyb20gUEZcbiIsCiAJCQlfX2Z1bmNfXywgdl9vcGNvZGUpOwogCQlicmVhazsKIAl9IC8qIHN3aXRjaCB2X29wY29kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuYwppbmRleCBmYTM2ZmUxMi4uYTJkYjM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmMKQEAgLTEsMjggKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KLSAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCiAvKiBlMTAwMF84MjU3NQogICogZTEwMDBfODI1NzYKQEAgLTczLDkgKzcwLDggQEAKIHN0YXRpYyBzMzIgIGlnYl91cGRhdGVfbnZtX2NoZWNrc3VtXzgyNTgwKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBpZ2JfdmFsaWRhdGVfbnZtX2NoZWNrc3VtX2kzNTAoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGlnYl91cGRhdGVfbnZtX2NoZWNrc3VtX2kzNTAoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgY29uc3QgdTE2IGUxMDAwXzgyNTgwX3J4cGJzX3RhYmxlW10gPQotCXsgMzYsIDcyLCAxNDQsIDEsIDIsIDQsIDgsIDE2LAotCSAgMzUsIDcwLCAxNDAgfTsKK3N0YXRpYyBjb25zdCB1MTYgZTEwMDBfODI1ODBfcnhwYnNfdGFibGVbXSA9IHsKKwkzNiwgNzIsIDE0NCwgMSwgMiwgNCwgOCwgMTYsIDM1LCA3MCwgMTQwIH07CiAKIC8qKgogICogIGlnYl9zZ21paV91c2VzX21kaW9fODI1NzUgLSBEZXRlcm1pbmUgaWYgSTJDIHBpbnMgYXJlIGZvciBleHRlcm5hbCBNRElPCkBAIC0xNTksNyArMTU1LDcgQEAKIAkJcmV0X3ZhbCA9IGlnYl9jaGVja19mb3JfbGlua184MjU3NShodyk7CiAJfQogCi0JcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNTI2LDcgKzUyMiw3IEBACiBzdGF0aWMgczMyIGlnYl9nZXRfaW52YXJpYW50c184MjU3NShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXN0cnVjdCBlMTAwMF9tYWNfaW5mbyAqbWFjID0gJmh3LT5tYWM7Ci0Jc3RydWN0IGUxMDAwX2Rldl9zcGVjXzgyNTc1ICogZGV2X3NwZWMgPSAmaHctPmRldl9zcGVjLl84MjU3NTsKKwlzdHJ1Y3QgZTEwMDBfZGV2X3NwZWNfODI1NzUgKmRldl9zcGVjID0gJmh3LT5kZXZfc3BlYy5fODI1NzU7CiAJczMyIHJldF92YWw7CiAJdTMyIGN0cmxfZXh0ID0gMDsKIAl1MzIgbGlua19tb2RlID0gMDsKQEAgLTEwMDgsNyArMTAwNCw2IEBACiBzdGF0aWMgczMyIGlnYl9zZXRfZDBfbHBsdV9zdGF0ZV84MjU4MChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSkKIHsKIAlzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeSA9ICZody0+cGh5OwotCXMzMiByZXRfdmFsID0gMDsKIAl1MTYgZGF0YTsKIAogCWRhdGEgPSByZDMyKEUxMDAwXzgyNTgwX1BIWV9QT1dFUl9NR01UKTsKQEAgLTEwMzIsNyArMTAyNyw3IEBACiAJCQlkYXRhICY9IH5FMTAwMF84MjU4MF9QTV9TUEQ7IH0KIAogCXdyMzIoRTEwMDBfODI1ODBfUEhZX1BPV0VSX01HTVQsIGRhdGEpOwotCXJldHVybiByZXRfdmFsOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwNTIsNyArMTA0Nyw2IEBACiBzdGF0aWMgczMyIGlnYl9zZXRfZDNfbHBsdV9zdGF0ZV84MjU4MChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSkKIHsKIAlzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeSA9ICZody0+cGh5OwotCXMzMiByZXRfdmFsID0gMDsKIAl1MTYgZGF0YTsKIAogCWRhdGEgPSByZDMyKEUxMDAwXzgyNTgwX1BIWV9QT1dFUl9NR01UKTsKQEAgLTEwNzcsNyArMTA3MSw3IEBACiAJfQogCiAJd3IzMihFMTAwMF84MjU4MF9QSFlfUE9XRVJfTUdNVCwgZGF0YSk7Ci0JcmV0dXJuIHJldF92YWw7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTE4MCw4ICsxMTc0LDggQEAKIHsKIAl1MzIgc3dmd19zeW5jOwogCi0Jd2hpbGUgKGlnYl9nZXRfaHdfc2VtYXBob3JlKGh3KSAhPSAwKTsKLQkvKiBFbXB0eSAqLworCXdoaWxlIChpZ2JfZ2V0X2h3X3NlbWFwaG9yZShodykgIT0gMCkKKwkJOyAvKiBFbXB0eSAqLwogCiAJc3dmd19zeW5jID0gcmQzMihFMTAwMF9TV19GV19TWU5DKTsKIAlzd2Z3X3N5bmMgJj0gfm1hc2s7CkBAIC0xMjAzLDcgKzExOTcsNiBAQAogc3RhdGljIHMzMiBpZ2JfZ2V0X2NmZ19kb25lXzgyNTc1KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAJczMyIHRpbWVvdXQgPSBQSFlfQ0ZHX1RJTUVPVVQ7Ci0JczMyIHJldF92YWwgPSAwOwogCXUzMiBtYXNrID0gRTEwMDBfTlZNX0NGR19ET05FX1BPUlRfMDsKIAogCWlmIChody0+YnVzLmZ1bmMgPT0gMSkKQEAgLTEyMTYsNyArMTIwOSw3IEBACiAJd2hpbGUgKHRpbWVvdXQpIHsKIAkJaWYgKHJkMzIoRTEwMDBfRUVNTkdDVEwpICYgbWFzaykKIAkJCWJyZWFrOwotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJdGltZW91dC0tOwogCX0KIAlpZiAoIXRpbWVvdXQpCkBAIC0xMjI3LDcgKzEyMjAsNyBAQAogCSAgICAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZ3BfMykpCiAJCWlnYl9waHlfaW5pdF9zY3JpcHRfaWdwMyhodyk7CiAKLQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMjY5LDcgKzEyNjIsNyBAQAogCiAJaWYgKGh3LT5waHkubWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQlyZXRfdmFsID0gaWdiX2dldF9wY3Nfc3BlZWRfYW5kX2R1cGxleF84MjU3NShodywgJnNwZWVkLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVwbGV4KTsKKwkJCQkJCQkgICAgICZkdXBsZXgpOwogCQkvKiBVc2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSBpZiBsaW5rIG5lZWRzIHRvIGJlIGNoZWNrZWQgb3IKIAkJICogbm90LiAgSWYgIHdlIGhhdmUgbGluayBjbGVhciB0aGUgZmxhZyBzbyB0aGF0IHdlIGRvIG5vdAogCQkgKiBjb250aW51ZSB0byBjaGVjayBmb3IgbGluay4KQEAgLTEzMTYsNyArMTMwOSw3IEBACiAKIAkvKiBmbHVzaCB0aGUgd3JpdGUgdG8gdmVyaWZ5IGNvbXBsZXRpb24gKi8KIAl3cmZsKCk7Ci0JbXNsZWVwKDEpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIH0KIAogLyoqCkBAIC0xNDExLDcgKzE0MDQsNyBAQAogCiAJCS8qIGZsdXNoIHRoZSB3cml0ZSB0byB2ZXJpZnkgY29tcGxldGlvbiAqLwogCQl3cmZsKCk7Ci0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCX0KIH0KIApAQCAtMTQzNiw5ICsxNDI5LDggQEAKIAogCS8qIHNldCB0aGUgY29tcGxldGlvbiB0aW1lb3V0IGZvciBpbnRlcmZhY2UgKi8KIAlyZXRfdmFsID0gaWdiX3NldF9wY2llX2NvbXBsZXRpb25fdGltZW91dChodyk7Ci0JaWYgKHJldF92YWwpIHsKKwlpZiAocmV0X3ZhbCkKIAkJaHdfZGJnKCJQQ0ktRSBTZXQgY29tcGxldGlvbiB0aW1lb3V0IGhhcyBmYWlsZWQuXG4iKTsKLQl9CiAKIAlod19kYmcoIk1hc2tpbmcgb2ZmIGFsbCBpbnRlcnJ1cHRzXG4iKTsKIAl3cjMyKEUxMDAwX0lNQywgMHhmZmZmZmZmZik7CkBAIC0xNDQ3LDcgKzE0MzksNyBAQAogCXdyMzIoRTEwMDBfVENUTCwgRTEwMDBfVENUTF9QU1ApOwogCXdyZmwoKTsKIAotCW1zbGVlcCgxMCk7CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKIAljdHJsID0gcmQzMihFMTAwMF9DVFJMKTsKIApAQCAtMTYyMiw3ICsxNjE0LDcgQEAKIHsKIAl1MzIgY3RybF9leHQsIGN0cmxfcmVnLCByZWcsIGFuYWR2X3JlZzsKIAlib29sIHBjc19hdXRvbmVnOwotCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwlzMzIgcmV0X3ZhbCA9IDA7CiAJdTE2IGRhdGE7CiAKIAlpZiAoKGh3LT5waHkubWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKQEAgLTE2NzYsNyArMTY2OCw3IEBACiAJCSAgICBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzYpIHsKIAkJCXJldF92YWwgPSBody0+bnZtLm9wcy5yZWFkKGh3LCBOVk1fQ09NUEFULCAxLCAmZGF0YSk7CiAJCQlpZiAocmV0X3ZhbCkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJOVk0gUmVhZCBFcnJvclxuXG4iKTsKKwkJCQlod19kYmcoS0VSTl9ERUJVRyAiTlZNIFJlYWQgRXJyb3JcblxuIik7CiAJCQkJcmV0dXJuIHJldF92YWw7CiAJCQl9CiAKQEAgLTE2ODksNyArMTY4MSw3IEBACiAJCSAqIGxpbmsgZWl0aGVyIGF1dG9uZWcgb3IgYmUgZm9yY2VkIHRvIDEwMDAvRnVsbAogCQkgKi8KIAkJY3RybF9yZWcgfD0gRTEwMDBfQ1RSTF9TUERfMTAwMCB8IEUxMDAwX0NUUkxfRlJDU1BEIHwKLQkJICAgICAgICAgICAgRTEwMDBfQ1RSTF9GRCB8IEUxMDAwX0NUUkxfRlJDRFBYOworCQkJCUUxMDAwX0NUUkxfRkQgfCBFMTAwMF9DVFJMX0ZSQ0RQWDsKIAogCQkvKiBzZXQgc3BlZWQgb2YgMTAwMC9GdWxsIGlmIHNwZWVkL2R1cGxleCBpcyBmb3JjZWQgKi8KIAkJcmVnIHw9IEUxMDAwX1BDU19MQ1RMX0ZTVl8xMDAwIHwgRTEwMDBfUENTX0xDVExfRkRWX0ZVTEw7CkBAIC0xOTI1LDcgKzE5MTcsNyBAQAogCX0KIAkvKiBQb2xsIGFsbCBxdWV1ZXMgdG8gdmVyaWZ5IHRoZXkgaGF2ZSBzaHV0IGRvd24gKi8KIAlmb3IgKG1zX3dhaXQgPSAwOyBtc193YWl0IDwgMTA7IG1zX3dhaXQrKykgewotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJcnhfZW5hYmxlZCA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCQlyeF9lbmFibGVkIHw9IHJkMzIoRTEwMDBfUlhEQ1RMKGkpKTsKQEAgLTE5NTMsNyArMTk0NSw3IEBACiAJd3IzMihFMTAwMF9SQ1RMLCB0ZW1wX3JjdGwpOwogCXdyMzIoRTEwMDBfUkNUTCwgdGVtcF9yY3RsIHwgRTEwMDBfUkNUTF9FTik7CiAJd3JmbCgpOwotCW1zbGVlcCgyKTsKKwl1c2xlZXBfcmFuZ2UoMjAwMCwgMzAwMCk7CiAKIAkvKiBFbmFibGUgUlggcXVldWVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGVuYWJsZWQgYW5kIHJlc3RvcmUgb3VyCiAJICogcHJldmlvdXMgc3RhdGUKQEAgLTIwMDUsMTQgKzE5OTcsMTQgQEAKIAkgKiAxNm1zIHRvIDU1bXMKIAkgKi8KIAlyZXRfdmFsID0gaWdiX3JlYWRfcGNpZV9jYXBfcmVnKGh3LCBQQ0lFX0RFVklDRV9DT05UUk9MMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwY2llX2RldmN0bDIpOworCQkJCQkmcGNpZV9kZXZjdGwyKTsKIAlpZiAocmV0X3ZhbCkKIAkJZ290byBvdXQ7CiAKIAlwY2llX2RldmN0bDIgfD0gUENJRV9ERVZJQ0VfQ09OVFJPTDJfMTZtczsKIAogCXJldF92YWwgPSBpZ2Jfd3JpdGVfcGNpZV9jYXBfcmVnKGh3LCBQQ0lFX0RFVklDRV9DT05UUk9MMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGNpZV9kZXZjdGwyKTsKKwkJCQkJICZwY2llX2RldmN0bDIpOwogb3V0OgogCS8qIGRpc2FibGUgY29tcGxldGlvbiB0aW1lb3V0IHJlc2VuZCAqLwogCWdjciAmPSB+RTEwMDBfR0NSX0NNUExfVE1PVVRfUkVTRU5EOwpAQCAtMjI0MSw3ICsyMjMzLDcgQEAKIAl3cjMyKEUxMDAwX1RDVEwsIEUxMDAwX1RDVExfUFNQKTsKIAl3cmZsKCk7CiAKLQltc2xlZXAoMTApOworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwogCiAJLyogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgZ2xvYmFsIGRldiByZXNldCBpcyByZXF1ZXN0ZWQgKi8KIAlpZiAoZ2xvYmFsX2RldmljZV9yZXNldCAmJgpAQCAtMjI1OSw3ICsyMjUxLDcgQEAKIAogCS8qIEFkZCBkZWxheSB0byBpbnN1cmUgREVWX1JTVCBoYXMgdGltZSB0byBjb21wbGV0ZSAqLwogCWlmIChnbG9iYWxfZGV2aWNlX3Jlc2V0KQotCQltc2xlZXAoNSk7CisJCXVzbGVlcF9yYW5nZSg1MDAwLCA2MDAwKTsKIAogCXJldF92YWwgPSBpZ2JfZ2V0X2F1dG9fcmRfZG9uZShodyk7CiAJaWYgKHJldF92YWwpIHsKQEAgLTI0MzYsOCArMjQyOCw3IEBACiAKIAlyZXRfdmFsID0gaHctPm52bS5vcHMucmVhZChodywgTlZNX0NPTVBBVElCSUxJVFlfUkVHXzMsIDEsICZudm1fZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJaHdfZGJnKCJOVk0gUmVhZCBFcnJvciB3aGlsZSB1cGRhdGluZyBjaGVja3N1bSIKLQkJCSIgY29tcGF0aWJpbGl0eSBiaXQuXG4iKTsKKwkJaHdfZGJnKCJOVk0gUmVhZCBFcnJvciB3aGlsZSB1cGRhdGluZyBjaGVja3N1bSBjb21wYXRpYmlsaXR5IGJpdC5cbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI0NDcsOCArMjQzOCw3IEBACiAJCXJldF92YWwgPSBody0+bnZtLm9wcy53cml0ZShodywgTlZNX0NPTVBBVElCSUxJVFlfUkVHXzMsIDEsCiAJCQkJCSZudm1fZGF0YSk7CiAJCWlmIChyZXRfdmFsKSB7Ci0JCQlod19kYmcoIk5WTSBXcml0ZSBFcnJvciB3aGlsZSB1cGRhdGluZyBjaGVja3N1bSIKLQkJCQkiIGNvbXBhdGliaWxpdHkgYml0LlxuIik7CisJCQlod19kYmcoIk5WTSBXcml0ZSBFcnJvciB3aGlsZSB1cGRhdGluZyBjaGVja3N1bSBjb21wYXRpYmlsaXR5IGJpdC5cbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0yNTI1LDcgKzI1MTUsNyBAQAogc3RhdGljIHMzMiBfX2lnYl9hY2Nlc3NfZW1pX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgYWRkcmVzcywKIAkJCQkgIHUxNiAqZGF0YSwgYm9vbCByZWFkKQogewotCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwlzMzIgcmV0X3ZhbCA9IDA7CiAKIAlyZXRfdmFsID0gaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBFMTAwMF9FTUlBREQsIGFkZHJlc3MpOwogCWlmIChyZXRfdmFsKQpAQCAtMjU1OSw3ICsyNTQ5LDYgQEAKICAqKi8KIHMzMiBpZ2Jfc2V0X2VlZV9pMzUwKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0JczMyIHJldF92YWwgPSAwOwogCXUzMiBpcGNuZmcsIGVlZXI7CiAKIAlpZiAoKGh3LT5tYWMudHlwZSA8IGUxMDAwX2kzNTApIHx8CkBAIC0yNTkzLDcgKzI1ODIsNyBAQAogCXJkMzIoRTEwMDBfRUVFUik7CiBvdXQ6CiAKLQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yNzIwLDcgKzI3MDksNiBAQAogICoqLwogc3RhdGljIHMzMiBpZ2JfZ2V0X3RoZXJtYWxfc2Vuc29yX2RhdGFfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotCXMzMiBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOwogCXUxNiBldHNfb2Zmc2V0OwogCXUxNiBldHNfY2ZnOwogCXUxNiBldHNfc2Vuc29yOwpAQCAtMjczOCw3ICsyNzI2LDcgQEAKIAkvKiBSZXR1cm4gdGhlIGludGVybmFsIHNlbnNvciBvbmx5IGlmIEVUUyBpcyB1bnN1cHBvcnRlZCAqLwogCWh3LT5udm0ub3BzLnJlYWQoaHcsIE5WTV9FVFNfQ0ZHLCAxLCAmZXRzX29mZnNldCk7CiAJaWYgKChldHNfb2Zmc2V0ID09IDB4MDAwMCkgfHwgKGV0c19vZmZzZXQgPT0gMHhGRkZGKSkKLQkJcmV0dXJuIHN0YXR1czsKKwkJcmV0dXJuIDA7CiAKIAlody0+bnZtLm9wcy5yZWFkKGh3LCBldHNfb2Zmc2V0LCAxLCAmZXRzX2NmZyk7CiAJaWYgKCgoZXRzX2NmZyAmIE5WTV9FVFNfVFlQRV9NQVNLKSA+PiBOVk1fRVRTX1RZUEVfU0hJRlQpCkBAIC0yNzYyLDcgKzI3NTAsNyBAQAogCQkJCQlFMTAwMF9JMkNfVEhFUk1BTF9TRU5TT1JfQUREUiwKIAkJCQkJJmRhdGEtPnNlbnNvcltpXS50ZW1wKTsKIAl9Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yNzc0LDcgKzI3NjIsNiBAQAogICoqLwogc3RhdGljIHMzMiBpZ2JfaW5pdF90aGVybWFsX3NlbnNvcl90aHJlc2hfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotCXMzMiBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOwogCXUxNiBldHNfb2Zmc2V0OwogCXUxNiBldHNfY2ZnOwogCXUxNiBldHNfc2Vuc29yOwpAQCAtMjgwMCw3ICsyNzg3LDcgQEAKIAkvKiBSZXR1cm4gdGhlIGludGVybmFsIHNlbnNvciBvbmx5IGlmIEVUUyBpcyB1bnN1cHBvcnRlZCAqLwogCWh3LT5udm0ub3BzLnJlYWQoaHcsIE5WTV9FVFNfQ0ZHLCAxLCAmZXRzX29mZnNldCk7CiAJaWYgKChldHNfb2Zmc2V0ID09IDB4MDAwMCkgfHwgKGV0c19vZmZzZXQgPT0gMHhGRkZGKSkKLQkJcmV0dXJuIHN0YXR1czsKKwkJcmV0dXJuIDA7CiAKIAlody0+bnZtLm9wcy5yZWFkKGh3LCBldHNfb2Zmc2V0LCAxLCAmZXRzX2NmZyk7CiAJaWYgKCgoZXRzX2NmZyAmIE5WTV9FVFNfVFlQRV9NQVNLKSA+PiBOVk1fRVRTX1RZUEVfU0hJRlQpCkBAIC0yODMxLDcgKzI4MTgsNyBAQAogCQkJCQkJCWxvd190aHJlc2hfZGVsdGE7CiAJCX0KIAl9Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5oCmluZGV4IDA5ZDc4YmUuLmI0MDdjNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5oCkBAIC0xLDI4ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogI2lmbmRlZiBfRTEwMDBfODI1NzVfSF8KICNkZWZpbmUgX0UxMDAwXzgyNTc1X0hfCkBAIC0zNyw5ICszNCw5IEBACiAJCSAgICAgICB1OCBkYXRhKTsKIAogI2RlZmluZSBJRF9MRURfREVGQVVMVF84MjU3NV9TRVJERVMgKChJRF9MRURfREVGMV9ERUYyIDw8IDEyKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX0RFRjFfREVGMiA8PCAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX0RFRjIgPDwgIDQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfT0ZGMV9PTjIpKQorCQkJCSAgICAgKElEX0xFRF9ERUYxX0RFRjIgPDwgIDgpIHwgXAorCQkJCSAgICAgKElEX0xFRF9ERUYxX0RFRjIgPDwgIDQpIHwgXAorCQkJCSAgICAgKElEX0xFRF9PRkYxX09OMikpCiAKICNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVNfODI1NzUgICAgICAgIDE2CiAjZGVmaW5lIEUxMDAwX1JBUl9FTlRSSUVTXzgyNTc2ICAgICAgICAyNApAQCAtNjcsMTYgKzY0LDE2IEBACiAjZGVmaW5lIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjZfVURQX0VYICAgIDB4MDEwMDAwMDAKIAogI2RlZmluZSBFMTAwMF9FSUNSX1RYX1FVRVVFICggXAotICAgIEUxMDAwX0VJQ1JfVFhfUVVFVUUwIHwgICAgXAotICAgIEUxMDAwX0VJQ1JfVFhfUVVFVUUxIHwgICAgXAotICAgIEUxMDAwX0VJQ1JfVFhfUVVFVUUyIHwgICAgXAotICAgIEUxMDAwX0VJQ1JfVFhfUVVFVUUzKQorCUUxMDAwX0VJQ1JfVFhfUVVFVUUwIHwgICAgXAorCUUxMDAwX0VJQ1JfVFhfUVVFVUUxIHwgICAgXAorCUUxMDAwX0VJQ1JfVFhfUVVFVUUyIHwgICAgXAorCUUxMDAwX0VJQ1JfVFhfUVVFVUUzKQogCiAjZGVmaW5lIEUxMDAwX0VJQ1JfUlhfUVVFVUUgKCBcCi0gICAgRTEwMDBfRUlDUl9SWF9RVUVVRTAgfCAgICBcCi0gICAgRTEwMDBfRUlDUl9SWF9RVUVVRTEgfCAgICBcCi0gICAgRTEwMDBfRUlDUl9SWF9RVUVVRTIgfCAgICBcCi0gICAgRTEwMDBfRUlDUl9SWF9RVUVVRTMpCisJRTEwMDBfRUlDUl9SWF9RVUVVRTAgfCAgICBcCisJRTEwMDBfRUlDUl9SWF9RVUVVRTEgfCAgICBcCisJRTEwMDBfRUlDUl9SWF9RVUVVRTIgfCAgICBcCisJRTEwMDBfRUlDUl9SWF9RVUVVRTMpCiAKIC8qIEltbWVkaWF0ZSBJbnRlcnJ1cHQgUnggKEEuSy5BLiBMb3cgTGF0ZW5jeSBJbnRlcnJ1cHQpICovCiAjZGVmaW5lIEUxMDAwX0lNSVJFWFRfU0laRV9CUCAgICAgMHgwMDAwMTAwMCAgLyogUGFja2V0IHNpemUgYnlwYXNzICovCkBAIC05Miw4ICs4OSw3IEBACiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgewogCQkJCV9fbGUxNiBwa3RfaW5mbzsgICAvKiBSU1MgdHlwZSwgUGFja2V0IHR5cGUgKi8KLQkJCQlfX2xlMTYgaGRyX2luZm87ICAgLyogU3BsaXQgSGVhZGVyLAotCQkJCQkJICAgICogaGVhZGVyIGJ1ZmZlciBsZW5ndGggKi8KKwkJCQlfX2xlMTYgaGRyX2luZm87ICAgLyogU3BsaXQgSGVhZCwgYnVmIGxlbiAqLwogCQkJfSBsb19kd29yZDsKIAkJCXVuaW9uIHsKIAkJCQlfX2xlMzIgcnNzOyAgICAgICAgICAvKiBSU1MgSGFzaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9kZWZpbmVzLmgKaW5kZXggYjA1YmY5MjUuLjJhOGJiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2RlZmluZXMuaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX0RFRklORVNfSF8KICNkZWZpbmUgX0UxMDAwX0RFRklORVNfSF8KQEAgLTEwMSwxMSArOTgsMTEgQEAKIAogLyogU2FtZSBtYXNrLCBidXQgZm9yIGV4dGVuZGVkIGFuZCBwYWNrZXQgc3BsaXQgZGVzY3JpcHRvcnMgKi8KICNkZWZpbmUgRTEwMDBfUlhERVhUX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKLSAgICBFMTAwMF9SWERFWFRfU1RBVEVSUl9DRSAgfCAgICAgICAgICAgIFwKLSAgICBFMTAwMF9SWERFWFRfU1RBVEVSUl9TRSAgfCAgICAgICAgICAgIFwKLSAgICBFMTAwMF9SWERFWFRfU1RBVEVSUl9TRVEgfCAgICAgICAgICAgIFwKLSAgICBFMTAwMF9SWERFWFRfU1RBVEVSUl9DWEUgfCAgICAgICAgICAgIFwKLSAgICBFMTAwMF9SWERFWFRfU1RBVEVSUl9SWEUpCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UgIHwgICAgICAgICAgICBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfU0UgIHwgICAgICAgICAgICBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfU0VRIHwgICAgICAgICAgICBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfQ1hFIHwgICAgICAgICAgICBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFKQogCiAjZGVmaW5lIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjRfVENQICAgICAgICAgIDB4MDAwMTAwMDAKICNkZWZpbmUgRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNCAgICAgICAgICAgICAgMHgwMDAyMDAwMApAQCAtMzA3LDM5ICszMDQsMzQgQEAKICNkZWZpbmUgRTEwMDBfVENUTF9SVExDICAgMHgwMTAwMDAwMCAgICAvKiBSZS10cmFuc21pdCBvbiBsYXRlIGNvbGxpc2lvbiAqLwogCiAvKiBETUEgQ29hbGVzY2luZyByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgRTEwMDBfRE1BQ1JfRE1BQ1dUX01BU0sgICAgICAgICAweDAwMDAzRkZGIC8qIERNQSBDb2FsZXNjaW5nCi0JCQkJCQkJKiBXYXRjaGRvZyBUaW1lciAqLwotI2RlZmluZSBFMTAwMF9ETUFDUl9ETUFDVEhSX01BU0sgICAgICAgIDB4MDBGRjAwMDAgLyogRE1BIENvYWxlc2NpbmcgUmVjZWl2ZQotCQkJCQkJCSogVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0RNQUNSX0RNQUNXVF9NQVNLICAgICAgICAgMHgwMDAwM0ZGRiAvKiBETUEgQ29hbCBXYXRjaGRvZyBUaW1lciAqLworI2RlZmluZSBFMTAwMF9ETUFDUl9ETUFDVEhSX01BU0sgICAgICAgIDB4MDBGRjAwMDAgLyogRE1BIENvYWwgUnggVGhyZXNob2xkICovCiAjZGVmaW5lIEUxMDAwX0RNQUNSX0RNQUNUSFJfU0hJRlQgICAgICAgMTYKLSNkZWZpbmUgRTEwMDBfRE1BQ1JfRE1BQ19MWF9NQVNLICAgICAgICAweDMwMDAwMDAwIC8qIEx4IHdoZW4gbm8gUENJZQotCQkJCQkJCSogdHJhbnNhY3Rpb25zICovCisjZGVmaW5lIEUxMDAwX0RNQUNSX0RNQUNfTFhfTUFTSyAgICAgICAgMHgzMDAwMDAwMCAvKiBMeCB3aGVuIG5vIFBDSWUgdHJhbnMgKi8KICNkZWZpbmUgRTEwMDBfRE1BQ1JfRE1BQ19MWF9TSElGVCAgICAgICAyOAogI2RlZmluZSBFMTAwMF9ETUFDUl9ETUFDX0VOICAgICAgICAgICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIERNQSBDb2FsZXNjaW5nICovCiAvKiBETUEgQ29hbGVzY2luZyBCTUMtdG8tT1MgV2F0Y2hkb2cgRW5hYmxlICovCiAjZGVmaW5lIEUxMDAwX0RNQUNSX0RDX0JNQzJPU1dfRU4JMHgwMDAwODAwMAogCi0jZGVmaW5lIEUxMDAwX0RNQ1RYVEhfRE1DVFRIUl9NQVNLICAgICAgMHgwMDAwMEZGRiAvKiBETUEgQ29hbGVzY2luZyBUcmFuc21pdAotCQkJCQkJCSogVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0RNQ1RYVEhfRE1DVFRIUl9NQVNLICAgICAgMHgwMDAwMEZGRiAvKiBETUEgQ29hbCBUeCBUaHJlc2hvbGQgKi8KIAogI2RlZmluZSBFMTAwMF9ETUNUTFhfVFRMWF9NQVNLICAgICAgICAgIDB4MDAwMDBGRkYgLyogVGltZSB0byBMWCByZXF1ZXN0ICovCiAKLSNkZWZpbmUgRTEwMDBfRE1DUlRSSF9VVFJFU0hfTUFTSyAgICAgICAweDAwMDdGRkZGIC8qIFJlY2VpdmUgVHJhZmZpYyBSYXRlCi0JCQkJCQkJKiBUaHJlc2hvbGQgKi8KLSNkZWZpbmUgRTEwMDBfRE1DUlRSSF9MUlBSQ1cgICAgICAgICAgICAweDgwMDAwMDAwIC8qIFJjdiBwYWNrZXQgcmF0ZSBpbgotCQkJCQkJCSogY3VycmVudCB3aW5kb3cgKi8KKyNkZWZpbmUgRTEwMDBfRE1DUlRSSF9VVFJFU0hfTUFTSyAgICAgICAweDAwMDdGRkZGIC8qIFJ4IFRyYWZmaWMgUmF0ZSBUaHJlc2ggKi8KKyNkZWZpbmUgRTEwMDBfRE1DUlRSSF9MUlBSQ1cgICAgICAgICAgICAweDgwMDAwMDAwIC8qIFJ4IHBrdCByYXRlIGN1cnIgd2luZG93ICovCiAKLSNkZWZpbmUgRTEwMDBfRE1DQ05UX0NDT1VOVF9NQVNLICAgICAgICAweDAxRkZGRkZGIC8qIERNQSBDb2FsIFJjdiBUcmFmZmljCi0JCQkJCQkJKiBDdXJyZW50IENudCAqLworI2RlZmluZSBFMTAwMF9ETUNDTlRfQ0NPVU5UX01BU0sgICAgICAgIDB4MDFGRkZGRkYgLyogRE1BIENvYWwgUnggQ3VycmVudCBDbnQgKi8KIAotI2RlZmluZSBFMTAwMF9GQ1JUQ19SVEhfQ09BTF9NQVNLICAgICAgIDB4MDAwM0ZGRjAgLyogRmxvdyBjdHJsIFJjdiBUaHJlc2hvbGQKLQkJCQkJCQkqIEhpZ2ggdmFsICovCisjZGVmaW5lIEUxMDAwX0ZDUlRDX1JUSF9DT0FMX01BU0sgICAgICAgMHgwMDAzRkZGMCAvKiBGQyBSeCBUaHJlc2ggSGlnaCB2YWwgKi8KICNkZWZpbmUgRTEwMDBfRkNSVENfUlRIX0NPQUxfU0hJRlQgICAgICA0CiAjZGVmaW5lIEUxMDAwX1BDSUVNSVNDX0xYX0RFQ0lTSU9OICAgICAgMHgwMDAwMDA4MCAvKiBMeCBwb3dlciBkZWNpc2lvbiAqLwogCiAvKiBUaW1lc3RhbXAgaW4gUnggYnVmZmVyICovCiAjZGVmaW5lIEUxMDAwX1JYUEJTX0NGR19UU19FTiAgICAgICAgICAgMHg4MDAwMDAwMAogCisjZGVmaW5lIEkyMTBfUlhQQlNJWkVfREVGQVVMVAkJMHgwMDAwMDBBMiAvKiBSWFBCU0laRSBkZWZhdWx0ICovCisjZGVmaW5lIEkyMTBfVFhQQlNJWkVfREVGQVVMVAkJMHgwNDAwMDAxNCAvKiBUWFBCU0laRSBkZWZhdWx0ICovCisKIC8qIFNlckRlcyBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX1NDVExfRElTQUJMRV9TRVJERVNfTE9PUEJBQ0sgMHgwNDAwCiAKQEAgLTQwNiwxMiArMzk4LDEyIEBACiAgKiAgIG8gTFNDICAgID0gTGluayBTdGF0dXMgQ2hhbmdlCiAgKi8KICNkZWZpbmUgSU1TX0VOQUJMRV9NQVNLICggXAotICAgIEUxMDAwX0lNU19SWFQwICAgfCAgICBcCi0gICAgRTEwMDBfSU1TX1RYRFcgICB8ICAgIFwKLSAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgXAotICAgIEUxMDAwX0lNU19SWFNFUSAgfCAgICBcCi0gICAgRTEwMDBfSU1TX0xTQyAgICB8ICAgIFwKLSAgICBFMTAwMF9JTVNfRE9VVFNZTkMpCisJRTEwMDBfSU1TX1JYVDAgICB8ICAgIFwKKwlFMTAwMF9JTVNfVFhEVyAgIHwgICAgXAorCUUxMDAwX0lNU19SWERNVDAgfCAgICBcCisJRTEwMDBfSU1TX1JYU0VRICB8ICAgIFwKKwlFMTAwMF9JTVNfTFNDICAgIHwgICAgXAorCUUxMDAwX0lNU19ET1VUU1lOQykKIAogLyogSW50ZXJydXB0IE1hc2sgU2V0ICovCiAjZGVmaW5lIEUxMDAwX0lNU19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLwpAQCAtNDY3LDcgKzQ1OSw2IEBACiAjZGVmaW5lIEUxMDAwX1JBSF9QT09MXzEgMHgwMDA0MDAwMAogCiAvKiBFcnJvciBDb2RlcyAqLwotI2RlZmluZSBFMTAwMF9TVUNDRVNTICAgICAgMAogI2RlZmluZSBFMTAwMF9FUlJfTlZNICAgICAgMQogI2RlZmluZSBFMTAwMF9FUlJfUEhZICAgICAgMgogI2RlZmluZSBFMTAwMF9FUlJfQ09ORklHICAgMwpAQCAtMTAxMSw4ICsxMDAyLDcgQEAKICNkZWZpbmUgRTEwMDBfVkZUQV9FTlRSWV9CSVRfU0hJRlRfTUFTSyAgICAgIDB4MUYKIAogLyogRE1BIENvYWxlc2NpbmcgcmVnaXN0ZXIgZmllbGRzICovCi0jZGVmaW5lIEUxMDAwX1BDSUVNSVNDX0xYX0RFQ0lTSU9OICAgICAgMHgwMDAwMDA4MCAvKiBMeCBwb3dlciBkZWNpc2lvbiBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gRE1BIGNvYWwgKi8KKyNkZWZpbmUgRTEwMDBfUENJRU1JU0NfTFhfREVDSVNJT04gICAgICAweDAwMDAwMDgwIC8qIEx4IHBvd2VyIG9uIERNQSBjb2FsICovCiAKIC8qIFR4IFJhdGUtU2NoZWR1bGVyIENvbmZpZyBmaWVsZHMgKi8KICNkZWZpbmUgRTEwMDBfUlRUQkNOUkNfUlNfRU5BCQkweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9ody5oCmluZGV4IDEwNzQxZDEuLjg5OTI1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9ody5oCkBAIC0xLDI4ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCiAjaWZuZGVmIF9FMTAwMF9IV19IXwogI2RlZmluZSBfRTEwMDBfSFdfSF8KQEAgLTMyMCwxNSArMzE2LDE1IEBACiAjaW5jbHVkZSAiZTEwMDBfbWJ4LmgiCiAKIHN0cnVjdCBlMTAwMF9tYWNfb3BlcmF0aW9ucyB7Ci0JczMyICAoKmNoZWNrX2Zvcl9saW5rKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKnJlc2V0X2h3KShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKmluaXRfaHcpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCpjaGVja19mb3JfbGluaykoc3RydWN0IGUxMDAwX2h3ICopOworCXMzMiAoKnJlc2V0X2h3KShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqaW5pdF9odykoc3RydWN0IGUxMDAwX2h3ICopOwogCWJvb2wgKCpjaGVja19tbmdfbW9kZSkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCpzZXR1cF9waHlzaWNhbF9pbnRlcmZhY2UpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCpzZXR1cF9waHlzaWNhbF9pbnRlcmZhY2UpKHN0cnVjdCBlMTAwMF9odyAqKTsKIAl2b2lkICgqcmFyX3NldCkoc3RydWN0IGUxMDAwX2h3ICosIHU4ICosIHUzMik7Ci0JczMyICAoKnJlYWRfbWFjX2FkZHIpKHN0cnVjdCBlMTAwMF9odyAqKTsKLQlzMzIgICgqZ2V0X3NwZWVkX2FuZF9kdXBsZXgpKHN0cnVjdCBlMTAwMF9odyAqLCB1MTYgKiwgdTE2ICopOwotCXMzMiAgKCphY3F1aXJlX3N3Zndfc3luYykoc3RydWN0IGUxMDAwX2h3ICosIHUxNik7CisJczMyICgqcmVhZF9tYWNfYWRkcikoc3RydWN0IGUxMDAwX2h3ICopOworCXMzMiAoKmdldF9zcGVlZF9hbmRfZHVwbGV4KShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2ICosIHUxNiAqKTsKKwlzMzIgKCphY3F1aXJlX3N3Zndfc3luYykoc3RydWN0IGUxMDAwX2h3ICosIHUxNik7CiAJdm9pZCAoKnJlbGVhc2Vfc3dmd19zeW5jKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2KTsKICNpZmRlZiBDT05GSUdfSUdCX0hXTU9OCiAJczMyICgqZ2V0X3RoZXJtYWxfc2Vuc29yX2RhdGEpKHN0cnVjdCBlMTAwMF9odyAqKTsKQEAgLTMzOCwzMSArMzM0LDMxIEBACiB9OwogCiBzdHJ1Y3QgZTEwMDBfcGh5X29wZXJhdGlvbnMgewotCXMzMiAgKCphY3F1aXJlKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKmNoZWNrX3BvbGFyaXR5KShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKmNoZWNrX3Jlc2V0X2Jsb2NrKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKmZvcmNlX3NwZWVkX2R1cGxleCkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCpnZXRfY2ZnX2RvbmUpKHN0cnVjdCBlMTAwMF9odyAqaHcpOwotCXMzMiAgKCpnZXRfY2FibGVfbGVuZ3RoKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKmdldF9waHlfaW5mbykoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCpyZWFkX3JlZykoc3RydWN0IGUxMDAwX2h3ICosIHUzMiwgdTE2ICopOworCXMzMiAoKmFjcXVpcmUpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCpjaGVja19wb2xhcml0eSkoc3RydWN0IGUxMDAwX2h3ICopOworCXMzMiAoKmNoZWNrX3Jlc2V0X2Jsb2NrKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqZm9yY2Vfc3BlZWRfZHVwbGV4KShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqZ2V0X2NmZ19kb25lKShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKwlzMzIgKCpnZXRfY2FibGVfbGVuZ3RoKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqZ2V0X3BoeV9pbmZvKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqcmVhZF9yZWcpKHN0cnVjdCBlMTAwMF9odyAqLCB1MzIsIHUxNiAqKTsKIAl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCpyZXNldCkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCpzZXRfZDBfbHBsdV9zdGF0ZSkoc3RydWN0IGUxMDAwX2h3ICosIGJvb2wpOwotCXMzMiAgKCpzZXRfZDNfbHBsdV9zdGF0ZSkoc3RydWN0IGUxMDAwX2h3ICosIGJvb2wpOwotCXMzMiAgKCp3cml0ZV9yZWcpKHN0cnVjdCBlMTAwMF9odyAqLCB1MzIsIHUxNik7CisJczMyICgqcmVzZXQpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCpzZXRfZDBfbHBsdV9zdGF0ZSkoc3RydWN0IGUxMDAwX2h3ICosIGJvb2wpOworCXMzMiAoKnNldF9kM19scGx1X3N0YXRlKShzdHJ1Y3QgZTEwMDBfaHcgKiwgYm9vbCk7CisJczMyICgqd3JpdGVfcmVnKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYpOwogCXMzMiAoKnJlYWRfaTJjX2J5dGUpKHN0cnVjdCBlMTAwMF9odyAqLCB1OCwgdTgsIHU4ICopOwogCXMzMiAoKndyaXRlX2kyY19ieXRlKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTgsIHU4LCB1OCk7CiB9OwogCiBzdHJ1Y3QgZTEwMDBfbnZtX29wZXJhdGlvbnMgewotCXMzMiAgKCphY3F1aXJlKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAoKnJlYWQpKHN0cnVjdCBlMTAwMF9odyAqLCB1MTYsIHUxNiwgdTE2ICopOworCXMzMiAoKmFjcXVpcmUpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCpyZWFkKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2LCB1MTYsIHUxNiAqKTsKIAl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCp3cml0ZSkoc3RydWN0IGUxMDAwX2h3ICosIHUxNiwgdTE2LCB1MTYgKik7Ci0JczMyICAoKnVwZGF0ZSkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCp2YWxpZGF0ZSkoc3RydWN0IGUxMDAwX2h3ICopOwotCXMzMiAgKCp2YWxpZF9sZWRfZGVmYXVsdCkoc3RydWN0IGUxMDAwX2h3ICosIHUxNiAqKTsKKwlzMzIgKCp3cml0ZSkoc3RydWN0IGUxMDAwX2h3ICosIHUxNiwgdTE2LCB1MTYgKik7CisJczMyICgqdXBkYXRlKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyICgqdmFsaWRhdGUpKHN0cnVjdCBlMTAwMF9odyAqKTsKKwlzMzIgKCp2YWxpZF9sZWRfZGVmYXVsdCkoc3RydWN0IGUxMDAwX2h3ICosIHUxNiAqKTsKIH07CiAKICNkZWZpbmUgRTEwMDBfTUFYX1NFTlNPUlMJCTMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9pMjEwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfaTIxMC5jCmluZGV4IGY2N2Y4YTEuLjMzNzE2MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9pMjEwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2kyMTAuYwpAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogLyogZTEwMDBfaTIxMAogICogZTEwMDBfaTIxMQpAQCAtMTAwLDcgKzk3LDcgQEAKIAkJcmV0dXJuIC1FMTAwMF9FUlJfTlZNOwogCX0KIAotCXJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE0Miw3ICsxMzksNyBAQAogCXUzMiBzd2Z3X3N5bmM7CiAJdTMyIHN3bWFzayA9IG1hc2s7CiAJdTMyIGZ3bWFzayA9IG1hc2sgPDwgMTY7Ci0JczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCXMzMiByZXRfdmFsID0gMDsKIAlzMzIgaSA9IDAsIHRpbWVvdXQgPSAyMDA7IC8qIEZJWE1FOiBmaW5kIHJlYWwgdmFsdWUgdG8gdXNlIGhlcmUgKi8KIAogCXdoaWxlIChpIDwgdGltZW91dCkgewpAQCAtMTg3LDcgKzE4NCw3IEBACiB7CiAJdTMyIHN3Zndfc3luYzsKIAotCXdoaWxlIChpZ2JfZ2V0X2h3X3NlbWFwaG9yZV9pMjEwKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQorCXdoaWxlIChpZ2JfZ2V0X2h3X3NlbWFwaG9yZV9pMjEwKGh3KSkKIAkJOyAvKiBFbXB0eSAqLwogCiAJc3dmd19zeW5jID0gcmQzMihFMTAwMF9TV19GV19TWU5DKTsKQEAgLTIxMCw3ICsyMDcsNyBAQAogc3RhdGljIHMzMiBpZ2JfcmVhZF9udm1fc3JyZF9pMjEwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKIAkJCQkgIHUxNiAqZGF0YSkKIHsKLQlzMzIgc3RhdHVzID0gRTEwMDBfU1VDQ0VTUzsKKwlzMzIgc3RhdHVzID0gMDsKIAl1MTYgaSwgY291bnQ7CiAKIAkvKiBXZSBjYW5ub3QgaG9sZCBzeW5jaHJvbml6YXRpb24gc2VtYXBob3JlcyBmb3IgdG9vIGxvbmcsCkBAIC0yMjAsNyArMjE3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkgKz0gRTEwMDBfRUVSRF9FRVdSX01BWF9DT1VOVCkgewogCQljb3VudCA9ICh3b3JkcyAtIGkpIC8gRTEwMDBfRUVSRF9FRVdSX01BWF9DT1VOVCA+IDAgPwogCQkJRTEwMDBfRUVSRF9FRVdSX01BWF9DT1VOVCA6ICh3b3JkcyAtIGkpOwotCQlpZiAoaHctPm52bS5vcHMuYWNxdWlyZShodykgPT0gRTEwMDBfU1VDQ0VTUykgeworCQlpZiAoIShody0+bnZtLm9wcy5hY3F1aXJlKGh3KSkpIHsKIAkJCXN0YXR1cyA9IGlnYl9yZWFkX252bV9lZXJkKGh3LCBvZmZzZXQsIGNvdW50LAogCQkJCQkJICAgICBkYXRhICsgaSk7CiAJCQlody0+bnZtLm9wcy5yZWxlYXNlKGh3KTsKQEAgLTIyOCw3ICsyMjUsNyBAQAogCQkJc3RhdHVzID0gRTEwMDBfRVJSX1NXRldfU1lOQzsKIAkJfQogCi0JCWlmIChzdGF0dXMgIT0gRTEwMDBfU1VDQ0VTUykKKwkJaWYgKHN0YXR1cykKIAkJCWJyZWFrOwogCX0KIApAQCAtMjUzLDcgKzI1MCw3IEBACiAJc3RydWN0IGUxMDAwX252bV9pbmZvICpudm0gPSAmaHctPm52bTsKIAl1MzIgaSwgaywgZWV3ciA9IDA7CiAJdTMyIGF0dGVtcHRzID0gMTAwMDAwOwotCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwlzMzIgcmV0X3ZhbCA9IDA7CiAKIAkvKiBBIGNoZWNrIGZvciBpbnZhbGlkIHZhbHVlczogIG9mZnNldCB0b28gbGFyZ2UsIHRvbyBtYW55IHdvcmRzLAogCSAqIHRvbyBtYW55IHdvcmRzIGZvciB0aGUgb2Zmc2V0LCBhbmQgbm90IGVub3VnaCB3b3Jkcy4KQEAgLTI3NSwxMyArMjcyLDEzIEBACiAJCWZvciAoayA9IDA7IGsgPCBhdHRlbXB0czsgaysrKSB7CiAJCQlpZiAoRTEwMDBfTlZNX1JXX1JFR19ET05FICYKIAkJCSAgICByZDMyKEUxMDAwX1NSV1IpKSB7Ci0JCQkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJCQkJcmV0X3ZhbCA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQl1ZGVsYXkoNSk7CiAJfQogCi0JCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKHJldF92YWwpIHsKIAkJCWh3X2RiZygiU2hhZG93IFJBTSB3cml0ZSBFRVdSIHRpbWVkIG91dFxuIik7CiAJCQlicmVhazsKIAkJfQpAQCAtMzEwLDcgKzMwNyw3IEBACiBzdGF0aWMgczMyIGlnYl93cml0ZV9udm1fc3J3cl9pMjEwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKIAkJCQkgICB1MTYgKmRhdGEpCiB7Ci0JczMyIHN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisJczMyIHN0YXR1cyA9IDA7CiAJdTE2IGksIGNvdW50OwogCiAJLyogV2UgY2Fubm90IGhvbGQgc3luY2hyb25pemF0aW9uIHNlbWFwaG9yZXMgZm9yIHRvbyBsb25nLApAQCAtMzIwLDcgKzMxNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpICs9IEUxMDAwX0VFUkRfRUVXUl9NQVhfQ09VTlQpIHsKIAkJY291bnQgPSAod29yZHMgLSBpKSAvIEUxMDAwX0VFUkRfRUVXUl9NQVhfQ09VTlQgPiAwID8KIAkJCUUxMDAwX0VFUkRfRUVXUl9NQVhfQ09VTlQgOiAod29yZHMgLSBpKTsKLQkJaWYgKGh3LT5udm0ub3BzLmFjcXVpcmUoaHcpID09IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKCEoaHctPm52bS5vcHMuYWNxdWlyZShodykpKSB7CiAJCQlzdGF0dXMgPSBpZ2Jfd3JpdGVfbnZtX3Nyd3IoaHcsIG9mZnNldCwgY291bnQsCiAJCQkJCQkgICAgICBkYXRhICsgaSk7CiAJCQlody0+bnZtLm9wcy5yZWxlYXNlKGh3KTsKQEAgLTMyOCw3ICszMjUsNyBAQAogCQkJc3RhdHVzID0gRTEwMDBfRVJSX1NXRldfU1lOQzsKIAkJfQogCi0JCWlmIChzdGF0dXMgIT0gRTEwMDBfU1VDQ0VTUykKKwkJaWYgKHN0YXR1cykKIAkJCWJyZWFrOwogCX0KIApAQCAtMzY3LDEyICszNjQsMTIgQEAKIAkJCQkqZGF0YSA9IElOVk1fRFdPUkRfVE9fV09SRF9EQVRBKGludm1fZHdvcmQpOwogCQkJCWh3X2RiZygiUmVhZCBJTlZNIFdvcmQgMHglMDJ4ID0gJXhcbiIsCiAJCQkJCSAgYWRkcmVzcywgKmRhdGEpOwotCQkJCXN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisJCQkJc3RhdHVzID0gMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCX0KLQlpZiAoc3RhdHVzICE9IEUxMDAwX1NVQ0NFU1MpCisJaWYgKHN0YXR1cykKIAkJaHdfZGJnKCJSZXF1ZXN0ZWQgd29yZCAweCUwMnggbm90IGZvdW5kIGluIE9UUFxuIiwgYWRkcmVzcyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTM4OCw3ICszODUsNyBAQAogc3RhdGljIHMzMiBpZ2JfcmVhZF9pbnZtX2kyMTAoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwKIAkJCQl1MTYgd29yZHMgX19hbHdheXNfdW51c2VkLCB1MTYgKmRhdGEpCiB7Ci0JczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCXMzMiByZXRfdmFsID0gMDsKIAogCS8qIE9ubHkgdGhlIE1BQyBhZGRyIGlzIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQgaW4gdGhlIGlOVk0gKi8KIAlzd2l0Y2ggKG9mZnNldCkgewpAQCAtMzk4LDQzICszOTUsNDQgQEAKIAkJCQkJCSAgICAgJmRhdGFbMV0pOwogCQlyZXRfdmFsIHw9IGlnYl9yZWFkX2ludm1fd29yZF9pMjEwKGh3LCAodTgpb2Zmc2V0KzIsCiAJCQkJCQkgICAgICZkYXRhWzJdKTsKLQkJaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykKKwkJaWYgKHJldF92YWwpCiAJCQlod19kYmcoIk1BQyBBZGRyIG5vdCBmb3VuZCBpbiBpTlZNXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBOVk1fSU5JVF9DVFJMXzI6CiAJCXJldF92YWwgPSBpZ2JfcmVhZF9pbnZtX3dvcmRfaTIxMChodywgKHU4KW9mZnNldCwgZGF0YSk7Ci0JCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKHJldF92YWwpIHsKIAkJCSpkYXRhID0gTlZNX0lOSVRfQ1RSTF8yX0RFRkFVTFRfSTIxMTsKLQkJCXJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCQkJcmV0X3ZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBOVk1fSU5JVF9DVFJMXzQ6CiAJCXJldF92YWwgPSBpZ2JfcmVhZF9pbnZtX3dvcmRfaTIxMChodywgKHU4KW9mZnNldCwgZGF0YSk7Ci0JCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKHJldF92YWwpIHsKIAkJCSpkYXRhID0gTlZNX0lOSVRfQ1RSTF80X0RFRkFVTFRfSTIxMTsKLQkJCXJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCQkJcmV0X3ZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBOVk1fTEVEXzFfQ0ZHOgogCQlyZXRfdmFsID0gaWdiX3JlYWRfaW52bV93b3JkX2kyMTAoaHcsICh1OClvZmZzZXQsIGRhdGEpOwotCQlpZiAocmV0X3ZhbCAhPSBFMTAwMF9TVUNDRVNTKSB7CisJCWlmIChyZXRfdmFsKSB7CiAJCQkqZGF0YSA9IE5WTV9MRURfMV9DRkdfREVGQVVMVF9JMjExOwotCQkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJCQlyZXRfdmFsID0gMDsKIAkJfQogCQlicmVhazsKIAljYXNlIE5WTV9MRURfMF8yX0NGRzoKIAkJcmV0X3ZhbCA9IGlnYl9yZWFkX2ludm1fd29yZF9pMjEwKGh3LCAodTgpb2Zmc2V0LCBkYXRhKTsKLQkJaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykgeworCQlpZiAocmV0X3ZhbCkgewogCQkJKmRhdGEgPSBOVk1fTEVEXzBfMl9DRkdfREVGQVVMVF9JMjExOwotCQkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJCQlyZXRfdmFsID0gMDsKIAkJfQogCQlicmVhazsKIAljYXNlIE5WTV9JRF9MRURfU0VUVElOR1M6CiAJCXJldF92YWwgPSBpZ2JfcmVhZF9pbnZtX3dvcmRfaTIxMChodywgKHU4KW9mZnNldCwgZGF0YSk7Ci0JCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKHJldF92YWwpIHsKIAkJCSpkYXRhID0gSURfTEVEX1JFU0VSVkVEX0ZGRkY7Ci0JCQlyZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwkJCXJldF92YWwgPSAwOwogCQl9CisJCWJyZWFrOwogCWNhc2UgTlZNX1NVQl9ERVZfSUQ6CiAJCSpkYXRhID0gaHctPnN1YnN5c3RlbV9kZXZpY2VfaWQ7CiAJCWJyZWFrOwpAQCAtNDg4LDE0ICs0ODYsMTQgQEAKIAkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBmaXJzdCB2ZXJzaW9uIGxvY2F0aW9uIHVzZWQgKi8KIAkJaWYgKChpID09IDEpICYmICgoKnJlY29yZCAmIEUxMDAwX0lOVk1fVkVSX0ZJRUxEX09ORSkgPT0gMCkpIHsKIAkJCXZlcnNpb24gPSAwOwotCQkJc3RhdHVzID0gRTEwMDBfU1VDQ0VTUzsKKwkJCXN0YXR1cyA9IDA7CiAJCQlicmVhazsKIAkJfQogCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNlY29uZCB2ZXJzaW9uIGxvY2F0aW9uIHVzZWQgKi8KIAkJZWxzZSBpZiAoKGkgPT0gMSkgJiYKIAkJCSAoKCpyZWNvcmQgJiBFMTAwMF9JTlZNX1ZFUl9GSUVMRF9UV08pID09IDApKSB7CiAJCQl2ZXJzaW9uID0gKCpyZWNvcmQgJiBFMTAwMF9JTlZNX1ZFUl9GSUVMRF9PTkUpID4+IDM7Ci0JCQlzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgb2RkIHZlcnNpb24gbG9jYXRpb24KQEAgLTUwNiw3ICs1MDQsNyBAQAogCQkJIChpICE9IDEpKSkgewogCQkJdmVyc2lvbiA9ICgqbmV4dF9yZWNvcmQgJiBFMTAwMF9JTlZNX1ZFUl9GSUVMRF9UV08pCiAJCQkJICA+PiAxMzsKLQkJCXN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisJCQlzdGF0dXMgPSAwOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBldmVuIHZlcnNpb24gbG9jYXRpb24KQEAgLTUxNSwxMiArNTEzLDEyIEBACiAJCWVsc2UgaWYgKCgoKnJlY29yZCAmIEUxMDAwX0lOVk1fVkVSX0ZJRUxEX1RXTykgPT0gMCkgJiYKIAkJCSAoKCpyZWNvcmQgJiAweDMpID09IDApKSB7CiAJCQl2ZXJzaW9uID0gKCpyZWNvcmQgJiBFMTAwMF9JTlZNX1ZFUl9GSUVMRF9PTkUpID4+IDM7Ci0JCQlzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKHN0YXR1cyA9PSBFMTAwMF9TVUNDRVNTKSB7CisJaWYgKCFzdGF0dXMpIHsKIAkJaW52bV92ZXItPmludm1fbWFqb3IgPSAodmVyc2lvbiAmIEUxMDAwX0lOVk1fTUFKT1JfTUFTSykKIAkJCQkJPj4gRTEwMDBfSU5WTV9NQUpPUl9TSElGVDsKIAkJaW52bV92ZXItPmludm1fbWlub3IgPSB2ZXJzaW9uICYgRTEwMDBfSU5WTV9NSU5PUl9NQVNLOwpAQCAtNTMzLDcgKzUzMSw3IEBACiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgaW1hZ2UgdHlwZSBpbiBmaXJzdCBsb2NhdGlvbiB1c2VkICovCiAJCWlmICgoaSA9PSAxKSAmJiAoKCpyZWNvcmQgJiBFMTAwMF9JTlZNX0lNR1RZUEVfRklFTEQpID09IDApKSB7CiAJCQlpbnZtX3Zlci0+aW52bV9pbWdfdHlwZSA9IDA7Ci0JCQlzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgaW1hZ2UgdHlwZSBpbiBmaXJzdCBsb2NhdGlvbiB1c2VkICovCkBAIC01NDIsNyArNTQwLDcgQEAKIAkJCSAoKCgoKnJlY29yZCAmIDB4MykgIT0gMCkgJiYgKGkgIT0gMSkpKSkgewogCQkJaW52bV92ZXItPmludm1faW1nX3R5cGUgPQogCQkJCSgqbmV4dF9yZWNvcmQgJiBFMTAwMF9JTlZNX0lNR1RZUEVfRklFTEQpID4+IDIzOwotCQkJc3RhdHVzID0gRTEwMDBfU1VDQ0VTUzsKKwkJCXN0YXR1cyA9IDA7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTU1OCwxMCArNTU2LDEwIEBACiAgKiovCiBzdGF0aWMgczMyIGlnYl92YWxpZGF0ZV9udm1fY2hlY2tzdW1faTIxMChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotCXMzMiBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworCXMzMiBzdGF0dXMgPSAwOwogCXMzMiAoKnJlYWRfb3BfcHRyKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2LCB1MTYsIHUxNiAqKTsKIAotCWlmIChody0+bnZtLm9wcy5hY3F1aXJlKGh3KSA9PSBFMTAwMF9TVUNDRVNTKSB7CisJaWYgKCEoaHctPm52bS5vcHMuYWNxdWlyZShodykpKSB7CiAKIAkJLyogUmVwbGFjZSB0aGUgcmVhZCBmdW5jdGlvbiB3aXRoIHNlbWFwaG9yZSBncmFiYmluZyB3aXRoCiAJCSAqIHRoZSBvbmUgdGhhdCBza2lwcyB0aGlzIGZvciBhIHdoaWxlLgpAQCAtNTkzLDcgKzU5MSw3IEBACiAgKiovCiBzdGF0aWMgczMyIGlnYl91cGRhdGVfbnZtX2NoZWNrc3VtX2kyMTAoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLQlzMzIgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJczMyIHJldF92YWwgPSAwOwogCXUxNiBjaGVja3N1bSA9IDA7CiAJdTE2IGksIG52bV9kYXRhOwogCkBAIC02MDIsMTIgKzYwMCwxMiBAQAogCSAqIEVFUFJPTSByZWFkIGZhaWxzCiAJICovCiAJcmV0X3ZhbCA9IGlnYl9yZWFkX252bV9lZXJkKGh3LCAwLCAxLCAmbnZtX2RhdGEpOwotCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwlpZiAocmV0X3ZhbCkgewogCQlod19kYmcoIkVFUFJPTSByZWFkIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChody0+bnZtLm9wcy5hY3F1aXJlKGh3KSA9PSBFMTAwMF9TVUNDRVNTKSB7CisJaWYgKCEoaHctPm52bS5vcHMuYWNxdWlyZShodykpKSB7CiAJCS8qIERvIG5vdCB1c2UgaHctPm52bS5vcHMud3JpdGUsIGh3LT5udm0ub3BzLnJlYWQKIAkJICogYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0byB0YWtlIHRoZSBzeW5jaHJvbml6YXRpb24KIAkJICogc2VtYXBob3JlcyB0d2ljZSBoZXJlLgpAQCAtNjI1LDcgKzYyMyw3IEBACiAJCWNoZWNrc3VtID0gKHUxNikgTlZNX1NVTSAtIGNoZWNrc3VtOwogCQlyZXRfdmFsID0gaWdiX3dyaXRlX252bV9zcndyKGh3LCBOVk1fQ0hFQ0tTVU1fUkVHLCAxLAogCQkJCQkJJmNoZWNrc3VtKTsKLQkJaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykgeworCQlpZiAocmV0X3ZhbCkgewogCQkJaHctPm52bS5vcHMucmVsZWFzZShodyk7CiAJCQlod19kYmcoIk5WTSBXcml0ZSBFcnJvciB3aGlsZSB1cGRhdGluZyBjaGVja3N1bS5cbiIpOwogCQkJZ290byBvdXQ7CkBAIC02NTQsNyArNjUyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfRkxVRE9ORV9BVFRFTVBUUzsgaSsrKSB7CiAJCXJlZyA9IHJkMzIoRTEwMDBfRUVDRCk7CiAJCWlmIChyZWcgJiBFMTAwMF9FRUNEX0ZMVURPTkVfSTIxMCkgewotCQkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJCQlyZXRfdmFsID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJCXVkZWxheSg1KTsKQEAgLTY4Nyw3ICs2ODUsNyBAQAogICoqLwogc3RhdGljIHMzMiBpZ2JfdXBkYXRlX2ZsYXNoX2kyMTAoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLQlzMzIgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJczMyIHJldF92YWwgPSAwOwogCXUzMiBmbHVwOwogCiAJcmV0X3ZhbCA9IGlnYl9wb29sX2ZsYXNoX3VwZGF0ZV9kb25lX2kyMTAoaHcpOwpAQCAtNzAwLDcgKzY5OCw3IEBACiAJd3IzMihFMTAwMF9FRUNELCBmbHVwKTsKIAogCXJldF92YWwgPSBpZ2JfcG9vbF9mbGFzaF91cGRhdGVfZG9uZV9pMjEwKGh3KTsKLQlpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKQorCWlmIChyZXRfdmFsKQogCQlod19kYmcoIkZsYXNoIHVwZGF0ZSBjb21wbGV0ZVxuIik7CiAJZWxzZQogCQlod19kYmcoIkZsYXNoIHVwZGF0ZSB0aW1lIG91dFxuIik7CkBAIC03NTMsNyArNzUxLDcgQEAKIHN0YXRpYyBzMzIgX19pZ2JfYWNjZXNzX3htZGlvX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgYWRkcmVzcywKIAkJCQkgIHU4IGRldl9hZGRyLCB1MTYgKmRhdGEsIGJvb2wgcmVhZCkKIHsKLQlzMzIgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJczMyIHJldF92YWwgPSAwOwogCiAJcmV0X3ZhbCA9IGh3LT5waHkub3BzLndyaXRlX3JlZyhodywgRTEwMDBfTU1EQUMsIGRldl9hZGRyKTsKIAlpZiAocmV0X3ZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9pMjEwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfaTIxMC5oCmluZGV4IDkwN2ZlOTkuLjlmMzQ5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9pMjEwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2kyMTAuaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX0kyMTBfSF8KICNkZWZpbmUgX0UxMDAwX0kyMTBfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9tYWMuYwppbmRleCAxZTBjNDA0Li4yYTg4NTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21hYy5jCkBAIC0xLDI4ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQ0Miw3ICs0MzksNyBAQAogICogIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcGFja2VkIG1jX2FkZHJfbGlzdCBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzLgogICoqLwogdm9pZCBpZ2JfdXBkYXRlX21jX2FkZHJfbGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbWNfYWRkcl9saXN0LCB1MzIgbWNfYWRkcl9jb3VudCkKKwkJCSAgICAgdTggKm1jX2FkZHJfbGlzdCwgdTMyIG1jX2FkZHJfY291bnQpCiB7CiAJdTMyIGhhc2hfdmFsdWUsIGhhc2hfYml0LCBoYXNoX3JlZzsKIAlpbnQgaTsKQEAgLTg2Niw4ICs4NjMsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWYgKCEobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkpIHsKLQkJCWh3X2RiZygiQ29wcGVyIFBIWSBhbmQgQXV0byBOZWcgIgotCQkJCSAiaGFzIG5vdCBjb21wbGV0ZWQuXG4iKTsKKwkJCWh3X2RiZygiQ29wcGVyIFBIWSBhbmQgQXV0byBOZWcgaGFzIG5vdCBjb21wbGV0ZWQuXG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTEyNjUsNyArMTI2MSw3IEBACiAJd2hpbGUgKGkgPCBBVVRPX1JFQURfRE9ORV9USU1FT1VUKSB7CiAJCWlmIChyZDMyKEUxMDAwX0VFQ0QpICYgRTEwMDBfRUVDRF9BVVRPX1JEKQogCQkJYnJlYWs7Ci0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQlpKys7CiAJfQogCkBAIC0xMjk4LDcgKzEyOTQsNyBAQAogCX0KIAogCWlmICgqZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfMDAwMCB8fCAqZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikgewotCQlzd2l0Y2goaHctPnBoeS5tZWRpYV90eXBlKSB7CisJCXN3aXRjaCAoaHctPnBoeS5tZWRpYV90eXBlKSB7CiAJCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXM6CiAJCQkqZGF0YSA9IElEX0xFRF9ERUZBVUxUXzgyNTc1X1NFUkRFUzsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21hYy5oCmluZGV4IDk5Mjk5YmEuLmVhMjQ5NjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21hYy5oCkBAIC0xLDI4ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogI2lmbmRlZiBfRTEwMDBfTUFDX0hfCiAjZGVmaW5lIF9FMTAwMF9NQUNfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9tYnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9tYnguYwppbmRleCBkNWIxMjE3Li4xNjJjYzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbWJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21ieC5jCkBAIC0xLDI4ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogI2luY2x1ZGUgImUxMDAwX21ieC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbWJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbWJ4LmgKaW5kZXggZjUyZjU1MS4uZDIwYWY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX21ieC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9tYnguaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX01CWF9IXwogI2RlZmluZSBfRTEwMDBfTUJYX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbnZtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbnZtLmMKaW5kZXggOWFiZjgyOS4uZTgyODBkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX252bS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9udm0uYwpAQCAtMSwyOCArMSwyNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQ4MCw2ICs0NzYsNyBAQAogCQkvKiBMb29wIHRvIGFsbG93IGZvciB1cCB0byB3aG9sZSBwYWdlIHdyaXRlIG9mIGVlcHJvbSAqLwogCQl3aGlsZSAod2lkeCA8IHdvcmRzKSB7CiAJCQl1MTYgd29yZF9vdXQgPSBkYXRhW3dpZHhdOworCiAJCQl3b3JkX291dCA9ICh3b3JkX291dCA+PiA4KSB8ICh3b3JkX291dCA8PCA4KTsKIAkJCWlnYl9zaGlmdF9vdXRfZWVjX2JpdHMoaHcsIHdvcmRfb3V0LCAxNik7CiAJCQl3aWR4Kys7CkBAIC04MDEsNSArNzk4LDQgQEAKIAkJZndfdmVycy0+ZXRyYWNrX2lkID0gKGVlcHJvbV92ZXJoIDw8IE5WTV9FVFJBQ0tfU0hJRlQpCiAJCQl8IGVlcHJvbV92ZXJsOwogCX0KLQlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbnZtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfbnZtLmgKaW5kZXggNWIxMDExNy4uZmViYzljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX252bS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9udm0uaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX05WTV9IXwogI2RlZmluZSBfRTEwMDBfTlZNX0hfCkBAIC0zMiw3ICsyOSw3IEBACiBzMzIgIGlnYl9yZWFkX21hY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogczMyICBpZ2JfcmVhZF9wYXJ0X251bShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgKnBhcnRfbnVtKTsKIHMzMiAgaWdiX3JlYWRfcGFydF9zdHJpbmcoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKnBhcnRfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcGFydF9udW1fc2l6ZSk7CisJCQkgIHUzMiBwYXJ0X251bV9zaXplKTsKIHMzMiAgaWdiX3JlYWRfbnZtX2VlcmQoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpOwogczMyICBpZ2JfcmVhZF9udm1fc3BpKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKIHMzMiAgaWdiX3dyaXRlX252bV9zcGkoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5jCmluZGV4IDQwMDliYmEuLmMxYmI2NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9waHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmMKQEAgLTEsMjggKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KLSAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtOTI0LDggKzkyMSw3IEBACiAJaWYgKHBoeS0+YXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKSB7CiAJCXJldF92YWwgPSBpZ2Jfd2FpdF9hdXRvbmVnKGh3KTsKIAkJaWYgKHJldF92YWwpIHsKLQkJCWh3X2RiZygiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgIgotCQkJICAgICAgICJhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKKwkJCWh3X2RiZygiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgYXV0b25lZyB0byBjb21wbGV0ZVxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTIyMDgsMTYgKzIyMDQsMTAgQEAKIHZvaWQgaWdiX3Bvd2VyX3VwX3BoeV9jb3BwZXIoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAl1MTYgbWlpX3JlZyA9IDA7Ci0JdTE2IHBvd2VyX3JlZyA9IDA7CiAKIAkvKiBUaGUgUEhZIHdpbGwgcmV0YWluIGl0cyBzZXR0aW5ncyBhY3Jvc3MgYSBwb3dlciBkb3duL3VwIGN5Y2xlICovCiAJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIFBIWV9DT05UUk9MLCAmbWlpX3JlZyk7CiAJbWlpX3JlZyAmPSB+TUlJX0NSX1BPV0VSX0RPV047Ci0JaWYgKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfaTIxMCkgewotCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgR1M0MEdfQ09QUEVSX1NQRUMsICZwb3dlcl9yZWcpOwotCQlwb3dlcl9yZWcgJj0gfkdTNDBHX0NTX1BPV0VSX0RPV047Ci0JCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgR1M0MEdfQ09QUEVSX1NQRUMsIHBvd2VyX3JlZyk7Ci0JfQogCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgUEhZX0NPTlRST0wsIG1paV9yZWcpOwogfQogCkBAIC0yMjMxLDIwICsyMjIxLDEyIEBACiB2b2lkIGlnYl9wb3dlcl9kb3duX3BoeV9jb3BwZXIoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAl1MTYgbWlpX3JlZyA9IDA7Ci0JdTE2IHBvd2VyX3JlZyA9IDA7CiAKIAkvKiBUaGUgUEhZIHdpbGwgcmV0YWluIGl0cyBzZXR0aW5ncyBhY3Jvc3MgYSBwb3dlciBkb3duL3VwIGN5Y2xlICovCiAJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIFBIWV9DT05UUk9MLCAmbWlpX3JlZyk7CiAJbWlpX3JlZyB8PSBNSUlfQ1JfUE9XRVJfRE9XTjsKLQotCS8qIGkyMTAgUGh5IHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgYml0IGZvciBwb3dlciB1cC9kb3duICovCi0JaWYgKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfaTIxMCkgewotCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgR1M0MEdfQ09QUEVSX1NQRUMsICZwb3dlcl9yZWcpOwotCQlwb3dlcl9yZWcgfD0gR1M0MEdfQ1NfUE9XRVJfRE9XTjsKLQkJaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBHUzQwR19DT1BQRVJfU1BFQywgcG93ZXJfcmVnKTsKLQl9CiAJaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBQSFlfQ09OVFJPTCwgbWlpX3JlZyk7Ci0JbXNsZWVwKDEpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmgKaW5kZXggNGMyYzM2Yy4uN2FmNGZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9waHkuaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX1BIWV9IXwogI2RlZmluZSBfRTEwMDBfUEhZX0hfCkBAIC0xNTQsNyArMTUxLDYgQEAKICNkZWZpbmUgR1M0MEdfTUFDX0xCCQkJMHg0MTQwCiAjZGVmaW5lIEdTNDBHX01BQ19TUEVFRF8xRwkJMFgwMDA2CiAjZGVmaW5lIEdTNDBHX0NPUFBFUl9TUEVDCQkweDAwMTAKLSNkZWZpbmUgR1M0MEdfQ1NfUE9XRVJfRE9XTgkJMHgwMDAyCiAjZGVmaW5lIEdTNDBHX0xJTkVfTEIJCQkweDQwMDAKIAogLyogU0ZQIG1vZHVsZXMgSUQgbWVtb3J5IGxvY2F0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9yZWdzLmgKaW5kZXggYmRiMjQ2ZS4uMWNjNGIxYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3JlZ3MuaApAQCAtMSwyOCArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICovCiAKICNpZm5kZWYgX0UxMDAwX1JFR1NfSF8KICNkZWZpbmUgX0UxMDAwX1JFR1NfSF8KQEAgLTE5NSw2ICsxOTIsMTAgQEAKIAkJCQkgICAgOiAoMHgwRTAzOCArICgoX24pICogMHg0MCkpKQogI2RlZmluZSBFMTAwMF9URFdCQUgoX24pICAoKF9uKSA8IDQgPyAoMHgwMzgzQyArICgoX24pICogMHgxMDApKSBcCiAJCQkJICAgIDogKDB4MEUwM0MgKyAoKF9uKSAqIDB4NDApKSkKKworI2RlZmluZSBFMTAwMF9SWFBCUwkweDAyNDA0ICAvKiBSeCBQYWNrZXQgQnVmZmVyIFNpemUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWFBCUwkweDAzNDA0ICAvKiBUeCBQYWNrZXQgQnVmZmVyIFNpemUgLSBSVyAqLworCiAjZGVmaW5lIEUxMDAwX1RERkggICAgIDB4MDM0MTAgIC8qIFRYIERhdGEgRklGTyBIZWFkIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfVERGVCAgICAgMHgwMzQxOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9UREZIUyAgICAweDAzNDIwICAvKiBUWCBEYXRhIEZJRk8gSGVhZCBTYXZlZCAtIFJXICovCkBAIC0zMDEsOSArMzAyLDkgQEAKICNkZWZpbmUgRTEwMDBfUkEyICAgICAgMHgwNTRFMCAgLyogMm5kIGhhbGYgb2YgUnggYWRkcmVzcyBhcnJheSAtIFJXIEFycmF5ICovCiAjZGVmaW5lIEUxMDAwX1BTUlRZUEUoX2kpICAgICAgICgweDA1NDgwICsgKChfaSkgKiA0KSkKICNkZWZpbmUgRTEwMDBfUkFMKF9pKSAgKCgoX2kpIDw9IDE1KSA/ICgweDA1NDAwICsgKChfaSkgKiA4KSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNTRFMCArICgoX2kgLSAxNikgKiA4KSkpCisJCQkJCSgweDA1NEUwICsgKChfaSAtIDE2KSAqIDgpKSkKICNkZWZpbmUgRTEwMDBfUkFIKF9pKSAgKCgoX2kpIDw9IDE1KSA/ICgweDA1NDA0ICsgKChfaSkgKiA4KSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNTRFNCArICgoX2kgLSAxNikgKiA4KSkpCisJCQkJCSgweDA1NEU0ICsgKChfaSAtIDE2KSAqIDgpKSkKICNkZWZpbmUgRTEwMDBfSVA0QVRfUkVHKF9pKSAgICAgKDB4MDU4NDAgKyAoKF9pKSAqIDgpKQogI2RlZmluZSBFMTAwMF9JUDZBVF9SRUcoX2kpICAgICAoMHgwNTg4MCArICgoX2kpICogNCkpCiAjZGVmaW5lIEUxMDAwX1dVUE1fUkVHKF9pKSAgICAgICgweDA1QTAwICsgKChfaSkgKiA0KSkKQEAgLTM1OCw4ICszNTksNyBAQAogI2RlZmluZSBFMTAwMF9WTUJNRU0oX24pICAgICAgICgweDAwODAwICsgKDY0ICogKF9uKSkpCiAjZGVmaW5lIEUxMDAwX1ZNT0xSKF9uKSAgICAgICAgKDB4MDVBRDAgKyAoNCAqIChfbikpKQogI2RlZmluZSBFMTAwMF9EVk1PTFIoX24pICAgICAgICgweDBDMDM4ICsgKDY0ICogKF9uKSkpCi0jZGVmaW5lIEUxMDAwX1ZMVkYoX24pICAgICAgICAgKDB4MDVEMDAgKyAoNCAqIChfbikpKSAvKiBWTEFOIFZpcnR1YWwgTWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRmlsdGVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVkxWRihfbikgICAgICAgICAoMHgwNUQwMCArICg0ICogKF9uKSkpIC8qIFZMQU4gVk0gRmlsdGVyICovCiAjZGVmaW5lIEUxMDAwX1ZNVklSKF9uKSAgICAgICAgKDB4MDM3MDAgKyAoNCAqIChfbikpKQogCiBzdHJ1Y3QgZTEwMDBfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiLmgKaW5kZXggMjcxMzAwNi4uMDYxMDJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2IuaApAQCAtMSwyOSArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogLyogTGludXggUFJPLzEwMDAgRXRoZXJuZXQgRHJpdmVyIG1haW4gaGVhZGVyIGZpbGUgKi8KIApAQCAtMTk4LDYgKzE5NCw3IEBACiAJdW5zaWduZWQgaW50IGJ5dGVjb3VudDsKIAl1MTYgZ3NvX3NlZ3M7CiAJX19iZTE2IHByb3RvY29sOworCiAJREVGSU5FX0RNQV9VTk1BUF9BRERSKGRtYSk7CiAJREVGSU5FX0RNQV9VTk1BUF9MRU4obGVuKTsKIAl1MzIgdHhfZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfZXRodG9vbC5jCmluZGV4IGU1NTcwYWMuLmM3MzdkMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfZXRodG9vbC5jCkBAIC0xLDI4ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMjAwNy0yMDE0IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKi8KIAogLyogZXRodG9vbCBzdXBwb3J0IGZvciBpZ2IgKi8KIApAQCAtMTQ0LDYgKzE0MSw3IEBACiAJc3RydWN0IGUxMDAwX2Rldl9zcGVjXzgyNTc1ICpkZXZfc3BlYyA9ICZody0+ZGV2X3NwZWMuXzgyNTc1OwogCXN0cnVjdCBlMTAwMF9zZnBfZmxhZ3MgKmV0aF9mbGFncyA9ICZkZXZfc3BlYy0+ZXRoX2ZsYWdzOwogCXUzMiBzdGF0dXM7CisJdTMyIHNwZWVkOwogCiAJc3RhdHVzID0gcmQzMihFMTAwMF9TVEFUVVMpOwogCWlmIChody0+cGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKQEAgLTIxOCwxMyArMjE2LDEzIEBACiAJaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgewogCQlpZiAoKHN0YXR1cyAmIEUxMDAwX1NUQVRVU18yUDVfU0tVKSAmJgogCQkgICAgIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfMlA1X1NLVV9PVkVSKSkgewotCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8yNTAwOworCQkJc3BlZWQgPSBTUEVFRF8yNTAwOwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwKSB7Ci0JCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlzcGVlZCA9IFNQRUVEXzEwMDA7CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCkgewotCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCQlzcGVlZCA9IFNQRUVEXzEwMDsKIAkJfSBlbHNlIHsKLQkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCQlzcGVlZCA9IFNQRUVEXzEwOwogCQl9CiAJCWlmICgoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0ZEKSB8fAogCQkgICAgaHctPnBoeS5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQpAQCAtMjMyLDkgKzIzMCwxMCBAQAogCQllbHNlCiAJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKIAl9IGVsc2UgewotCQllY21kLT5zcGVlZCA9IC0xOwotCQllY21kLT5kdXBsZXggPSAtMTsKKwkJc3BlZWQgPSBTUEVFRF9VTktOT1dOOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CisJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIHNwZWVkKTsKIAlpZiAoKGh3LT5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAogCSAgICBody0+bWFjLmF1dG9uZWcpCiAJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKQEAgLTI4Niw3ICsyODUsNyBAQAogCX0KIAogCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSUdCX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAKIAlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlody0+bWFjLmF1dG9uZWcgPSAxOwpAQCAtMzk5LDcgKzM5OCw3IEBACiAJYWRhcHRlci0+ZmNfYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOwogCiAJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JR0JfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKQotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAogCWlmIChhZGFwdGVyLT5mY19hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCWh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSA9IGUxMDAwX2ZjX2RlZmF1bHQ7CkBAIC04ODYsNyArODg1LDcgQEAKIAl9CiAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lHQl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCi0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKIAkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKQEAgLTEwNjAsOCArMTA1OSw4IEBACiAJeyBFMTAwMF9URFQoMCksCSAgIDB4MTAwLCA0LCAgUEFUVEVSTl9URVNULCAweDAwMDBGRkZGLCAweDAwMDBGRkZGIH0sCiAJeyBFMTAwMF9URFQoNCksCSAgIDB4NDAsICA0LCAgUEFUVEVSTl9URVNULCAweDAwMDBGRkZGLCAweDAwMDBGRkZGIH0sCiAJeyBFMTAwMF9SQ1RMLAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAgfSwKLQl7IEUxMDAwX1JDVEwsIAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4MDRDRkIwRkUsIDB4MDAzRkZGRkIgfSwKLQl7IEUxMDAwX1JDVEwsIAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4MDRDRkIwRkUsIDB4RkZGRkZGRkYgfSwKKwl7IEUxMDAwX1JDVEwsCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHgwNENGQjBGRSwgMHgwMDNGRkZGQiB9LAorCXsgRTEwMDBfUkNUTCwJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweDA0Q0ZCMEZFLCAweEZGRkZGRkZGIH0sCiAJeyBFMTAwMF9UQ1RMLAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAgfSwKIAl7IEUxMDAwX1JBLAkgICAwLCAxNiwgVEFCTEU2NF9URVNUX0xPLAogCQkJCQkJMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiB9LApAQCAtMTEwMyw4ICsxMTAyLDggQEAKIAl7IEUxMDAwX1REVCgwKSwJICAgMHgxMDAsIDQsICBQQVRURVJOX1RFU1QsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYgfSwKIAl7IEUxMDAwX1REVCg0KSwJICAgMHg0MCwgIDQsICBQQVRURVJOX1RFU1QsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYgfSwKIAl7IEUxMDAwX1JDVEwsCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCB9LAotCXsgRTEwMDBfUkNUTCwgCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHgwNENGQjBGRSwgMHgwMDNGRkZGQiB9LAotCXsgRTEwMDBfUkNUTCwgCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHgwNENGQjBGRSwgMHhGRkZGRkZGRiB9LAorCXsgRTEwMDBfUkNUTCwJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweDA0Q0ZCMEZFLCAweDAwM0ZGRkZCIH0sCisJeyBFMTAwMF9SQ1RMLAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4MDRDRkIwRkUsIDB4RkZGRkZGRkYgfSwKIAl7IEUxMDAwX1RDVEwsCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCB9LAogCXsgRTEwMDBfUkEsCSAgIDAsIDE2LCBUQUJMRTY0X1RFU1RfTE8sCiAJCQkJCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGIH0sCkBAIC0xMTMyLDggKzExMzEsMTAgQEAKIAl7IEUxMDAwX1JEQkFIKDQpLCAgMHg0MCwgMTIsIFBBVFRFUk5fVEVTVCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiB9LAogCXsgRTEwMDBfUkRMRU4oNCksICAweDQwLCAxMiwgUEFUVEVSTl9URVNULCAweDAwMEZGRkYwLCAweDAwMEZGRkZGIH0sCiAJLyogRW5hYmxlIGFsbCBSWCBxdWV1ZXMgYmVmb3JlIHRlc3RpbmcuICovCi0JeyBFMTAwMF9SWERDVEwoMCksIDB4MTAwLCA0LCAgV1JJVEVfTk9fVEVTVCwgMCwgRTEwMDBfUlhEQ1RMX1FVRVVFX0VOQUJMRSB9LAotCXsgRTEwMDBfUlhEQ1RMKDQpLCAweDQwLCAxMiwgIFdSSVRFX05PX1RFU1QsIDAsIEUxMDAwX1JYRENUTF9RVUVVRV9FTkFCTEUgfSwKKwl7IEUxMDAwX1JYRENUTCgwKSwgMHgxMDAsIDQsIFdSSVRFX05PX1RFU1QsIDAsCisJICBFMTAwMF9SWERDVExfUVVFVUVfRU5BQkxFIH0sCisJeyBFMTAwMF9SWERDVEwoNCksIDB4NDAsIDEyLCBXUklURV9OT19URVNULCAwLAorCSAgRTEwMDBfUlhEQ1RMX1FVRVVFX0VOQUJMRSB9LAogCS8qIFJESCBpcyByZWFkLW9ubHkgZm9yIDgyNTc2LCBvbmx5IHRlc3QgUkRULiAqLwogCXsgRTEwMDBfUkRUKDApLAkgICAweDEwMCwgNCwgIFBBVFRFUk5fVEVTVCwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiB9LAogCXsgRTEwMDBfUkRUKDQpLAkgICAweDQwLCAxMiwgIFBBVFRFUk5fVEVTVCwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiB9LApAQCAtMTE0OSwxNCArMTE1MCwxNCBAQAogCXsgRTEwMDBfVERCQUgoNCksICAweDQwLCAxMiwgIFBBVFRFUk5fVEVTVCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiB9LAogCXsgRTEwMDBfVERMRU4oNCksICAweDQwLCAxMiwgIFBBVFRFUk5fVEVTVCwgMHgwMDBGRkZGMCwgMHgwMDBGRkZGRiB9LAogCXsgRTEwMDBfUkNUTCwJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweEZGRkZGRkZGLCAweDAwMDAwMDAwIH0sCi0JeyBFMTAwMF9SQ1RMLCAJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweDA0Q0ZCMEZFLCAweDAwM0ZGRkZCIH0sCi0JeyBFMTAwMF9SQ1RMLCAJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweDA0Q0ZCMEZFLCAweEZGRkZGRkZGIH0sCisJeyBFMTAwMF9SQ1RMLAkgICAweDEwMCwgMSwgIFNFVF9SRUFEX1RFU1QsIDB4MDRDRkIwRkUsIDB4MDAzRkZGRkIgfSwKKwl7IEUxMDAwX1JDVEwsCSAgIDB4MTAwLCAxLCAgU0VUX1JFQURfVEVTVCwgMHgwNENGQjBGRSwgMHhGRkZGRkZGRiB9LAogCXsgRTEwMDBfVENUTCwJICAgMHgxMDAsIDEsICBTRVRfUkVBRF9URVNULCAweEZGRkZGRkZGLCAweDAwMDAwMDAwIH0sCiAJeyBFMTAwMF9SQSwJICAgMCwgMTYsIFRBQkxFNjRfVEVTVF9MTywgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiB9LAogCXsgRTEwMDBfUkEsCSAgIDAsIDE2LCBUQUJMRTY0X1RFU1RfSEksIDB4ODNGRkZGRkYsIDB4RkZGRkZGRkYgfSwKIAl7IEUxMDAwX1JBMiwJICAgMCwgOCwgVEFCTEU2NF9URVNUX0xPLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGIH0sCiAJeyBFMTAwMF9SQTIsCSAgIDAsIDgsIFRBQkxFNjRfVEVTVF9ISSwgMHg4M0ZGRkZGRiwgMHhGRkZGRkZGRiB9LAotCXsgRTEwMDBfTVRBLAkgICAwLCAxMjgsVEFCTEUzMl9URVNULCAweEZGRkZGRkZGLCAweEZGRkZGRkZGIH0sCisJeyBFMTAwMF9NVEEsCSAgIDAsIDEyOCwgVEFCTEUzMl9URVNULCAweEZGRkZGRkZGLCAweEZGRkZGRkZGIH0sCiAJeyAwLCAwLCAwLCAwIH0KIH07CiAKQEAgLTExNzAsNyArMTE3MSw4IEBACiAJeyBFMTAwMF9SREJBSCgwKSwgIDB4MTAwLCA0LCBQQVRURVJOX1RFU1QsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYgfSwKIAl7IEUxMDAwX1JETEVOKDApLCAgMHgxMDAsIDQsIFBBVFRFUk5fVEVTVCwgMHgwMDBGRkY4MCwgMHgwMDBGRkZGRiB9LAogCS8qIEVuYWJsZSBhbGwgZm91ciBSWCBxdWV1ZXMgYmVmb3JlIHRlc3RpbmcuICovCi0JeyBFMTAwMF9SWERDVEwoMCksIDB4MTAwLCA0LCBXUklURV9OT19URVNULCAwLCBFMTAwMF9SWERDVExfUVVFVUVfRU5BQkxFIH0sCisJeyBFMTAwMF9SWERDVEwoMCksIDB4MTAwLCA0LCBXUklURV9OT19URVNULCAwLAorCSAgRTEwMDBfUlhEQ1RMX1FVRVVFX0VOQUJMRSB9LAogCS8qIFJESCBpcyByZWFkLW9ubHkgZm9yIDgyNTc1LCBvbmx5IHRlc3QgUkRULiAqLwogCXsgRTEwMDBfUkRUKDApLCAgICAweDEwMCwgNCwgUEFUVEVSTl9URVNULCAweDAwMDBGRkZGLCAweDAwMDBGRkZGIH0sCiAJeyBFMTAwMF9SWERDVEwoMCksIDB4MTAwLCA0LCBXUklURV9OT19URVNULCAwLCAwIH0sCkBAIC0xMTk2LDggKzExOTgsOCBAQAogewogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHBhdCwgdmFsOwotCXN0YXRpYyBjb25zdCB1MzIgX3Rlc3RbXSA9Ci0JCXsweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweDAwMDAwMDAwLCAweEZGRkZGRkZGfTsKKwlzdGF0aWMgY29uc3QgdTMyIF90ZXN0W10gPSB7CisJCTB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkZ9OwogCWZvciAocGF0ID0gMDsgcGF0IDwgQVJSQVlfU0laRShfdGVzdCk7IHBhdCsrKSB7CiAJCXdyMzIocmVnLCAoX3Rlc3RbcGF0XSAmIHdyaXRlKSk7CiAJCXZhbCA9IHJkMzIocmVnKSAmIG1hc2s7CkBAIC0xMjA2LDExICsxMjA4LDExIEBACiAJCQkJInBhdHRlcm4gdGVzdCByZWcgJTA0WCBmYWlsZWQ6IGdvdCAweCUwOFggZXhwZWN0ZWQgMHglMDhYXG4iLAogCQkJCXJlZywgdmFsLCAoX3Rlc3RbcGF0XSAmIHdyaXRlICYgbWFzaykpOwogCQkJKmRhdGEgPSByZWc7Ci0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWdfc2V0X2FuZF9jaGVjayhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCAqZGF0YSwKQEAgLTEyMTgsMTcgKzEyMjAsMTggQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiB2YWw7CisKIAl3cjMyKHJlZywgd3JpdGUgJiBtYXNrKTsKIAl2YWwgPSByZDMyKHJlZyk7CiAJaWYgKCh3cml0ZSAmIG1hc2spICE9ICh2YWwgJiBtYXNrKSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwgcmVnLAotCQkJKHZhbCAmIG1hc2spLCAod3JpdGUgJiBtYXNrKSk7CisJCQkic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwKKwkJCXJlZywgKHZhbCAmIG1hc2spLCAod3JpdGUgJiBtYXNrKSk7CiAJCSpkYXRhID0gcmVnOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiAjZGVmaW5lIFJFR19QQVRURVJOX1RFU1QocmVnLCBtYXNrLCB3cml0ZSkgXApAQCAtMTM4NywxNCArMTM5MCwxNCBAQAogCS8qIEhvb2sgdXAgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciBqdXN0IGZvciB0aGlzIHRlc3QgKi8KIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJR0JfRkxBR19IQVNfTVNJWCkgewogCQlpZiAocmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzWzBdLnZlY3RvciwKLQkJICAgICAgICAgICAgICAgIGlnYl90ZXN0X2ludHIsIDAsIG5ldGRldi0+bmFtZSwgYWRhcHRlcikpIHsKKwkJCQlpZ2JfdGVzdF9pbnRyLCAwLCBuZXRkZXYtPm5hbWUsIGFkYXB0ZXIpKSB7CiAJCQkqZGF0YSA9IDE7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9IGVsc2UgaWYgKGFkYXB0ZXItPmZsYWdzICYgSUdCX0ZMQUdfSEFTX01TSSkgewogCQlzaGFyZWRfaW50ID0gZmFsc2U7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsCi0JCSAgICAgICAgICAgICAgICBpZ2JfdGVzdF9pbnRyLCAwLCBuZXRkZXYtPm5hbWUsIGFkYXB0ZXIpKSB7CisJCQkJaWdiX3Rlc3RfaW50ciwgMCwgbmV0ZGV2LT5uYW1lLCBhZGFwdGVyKSkgewogCQkJKmRhdGEgPSAxOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xNDEyLDcgKzE0MTUsNyBAQAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJd3IzMihFMTAwMF9JTUMsIH4wKTsKIAl3cmZsKCk7Ci0JbXNsZWVwKDEwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKIAogCS8qIERlZmluZSBhbGwgd3JpdGFibGUgYml0cyBmb3IgSUNTICovCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKQEAgLTE0NTksNyArMTQ2Miw3IEBACiAJCQl3cjMyKEUxMDAwX0lNQywgbWFzayk7CiAJCQl3cjMyKEUxMDAwX0lDUywgbWFzayk7CiAJCQl3cmZsKCk7Ci0JCQltc2xlZXAoMTApOworCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CiAKIAkJCWlmIChhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spIHsKIAkJCQkqZGF0YSA9IDM7CkBAIC0xNDgxLDcgKzE0ODQsNyBAQAogCQl3cjMyKEUxMDAwX0lNUywgbWFzayk7CiAJCXdyMzIoRTEwMDBfSUNTLCBtYXNrKTsKIAkJd3JmbCgpOwotCQltc2xlZXAoMTApOworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKIAogCQlpZiAoIShhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spKSB7CiAJCQkqZGF0YSA9IDQ7CkBAIC0xNTAzLDcgKzE1MDYsNyBAQAogCQkJd3IzMihFMTAwMF9JTUMsIH5tYXNrKTsKIAkJCXdyMzIoRTEwMDBfSUNTLCB+bWFzayk7CiAJCQl3cmZsKCk7Ci0JCQltc2xlZXAoMTApOworCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CiAKIAkJCWlmIChhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spIHsKIAkJCQkqZGF0YSA9IDU7CkBAIC0xNTE1LDcgKzE1MTgsNyBAQAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJd3IzMihFMTAwMF9JTUMsIH4wKTsKIAl3cmZsKCk7Ci0JbXNsZWVwKDEwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKIAogCS8qIFVuaG9vayB0ZXN0IGludGVycnVwdCBoYW5kbGVyICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSUdCX0ZMQUdfSEFTX01TSVgpCkBAIC0xNjY0LDggKzE2NjcsOCBAQAogCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfU0VSREVTKSB8fAogCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfQkFDS1BMQU5FKSB8fAogCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfU0ZQKSB8fAotCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfSTM1NF9TR01JSSkpIHsKLQorCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfSTM1NF9TR01JSSkgfHwKKwkJKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEX0kzNTRfQkFDS1BMQU5FXzJfNUdCUFMpKSB7CiAJCQkvKiBFbmFibGUgREg4OXh4Q0MgTVBIWSBmb3IgbmVhciBlbmQgbG9vcGJhY2sgKi8KIAkJCXJlZyA9IHJkMzIoRTEwMDBfTVBIWV9BRERSX0NUTCk7CiAJCQlyZWcgPSAocmVnICYgRTEwMDBfTVBIWV9BRERSX0NUTF9PRkZTRVRfTUFTSykgfApAQCAtMTk0OSw2ICsxOTUyLDcgQEAKIAkqZGF0YSA9IDA7CiAJaWYgKGh3LT5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewogCQlpbnQgaSA9IDA7CisKIAkJaHctPm1hYy5zZXJkZXNfaGFzX2xpbmsgPSBmYWxzZTsKIAogCQkvKiBPbiBzb21lIGJsYWRlIHNlcnZlciBkZXNpZ25zLCBsaW5rIGVzdGFibGlzaG1lbnQKQEAgLTI0MTMsOSArMjQxNywxMSBAQAogCXN3aXRjaCAoY21kLT5mbG93X3R5cGUpIHsKIAljYXNlIFRDUF9WNF9GTE9XOgogCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFVEUF9WNF9GTE9XOgogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJR0JfRkxBR19SU1NfRklFTERfSVBWNF9VRFApCiAJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFNDVFBfVjRfRkxPVzoKIAljYXNlIEFIX0VTUF9WNF9GTE9XOgogCWNhc2UgQUhfVjRfRkxPVzoKQEAgLTI0MjUsOSArMjQzMSwxMSBAQAogCQlicmVhazsKIAljYXNlIFRDUF9WNl9GTE9XOgogCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFVEUF9WNl9GTE9XOgogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJR0JfRkxBR19SU1NfRklFTERfSVBWNl9VRFApCiAJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFNDVFBfVjZfRkxPVzoKIAljYXNlIEFIX0VTUF9WNl9GTE9XOgogCWNhc2UgQUhfVjZfRkxPVzoKQEAgLTI3MzAsNyArMjczOCw3IEBACiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworCXUzMiBzdGF0dXMgPSAwOwogCXUxNiBzZmY4NDcyX3JldiwgYWRkcl9tb2RlOwogCWJvb2wgcGFnZV9zd2FwID0gZmFsc2U7CiAKQEAgLTI3NDAsMTIgKzI3NDgsMTIgQEAKIAogCS8qIENoZWNrIHdoZXRoZXIgd2Ugc3VwcG9ydCBTRkYtODQ3MiBvciBub3QgKi8KIAlzdGF0dXMgPSBpZ2JfcmVhZF9waHlfcmVnX2kyYyhodywgSUdCX1NGRl84NDcyX0NPTVAsICZzZmY4NDcyX3Jldik7Ci0JaWYgKHN0YXR1cyAhPSBFMTAwMF9TVUNDRVNTKQorCWlmIChzdGF0dXMpCiAJCXJldHVybiAtRUlPOwogCiAJLyogYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KIAlzdGF0dXMgPSBpZ2JfcmVhZF9waHlfcmVnX2kyYyhodywgSUdCX1NGRl84NDcyX1NXQVAsICZhZGRyX21vZGUpOwotCWlmIChzdGF0dXMgIT0gRTEwMDBfU1VDQ0VTUykKKwlpZiAoc3RhdHVzKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIGFkZHJlc3NpbmcgbW9kZSBpcyBub3Qgc3VwcG9ydGVkICovCkBAIC0yNzcyLDcgKzI3ODAsNyBAQAogewogCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgc3RhdHVzID0gRTEwMDBfU1VDQ0VTUzsKKwl1MzIgc3RhdHVzID0gMDsKIAl1MTYgKmRhdGF3b3JkOwogCXUxNiBmaXJzdF93b3JkLCBsYXN0X3dvcmQ7CiAJaW50IGkgPSAwOwpAQCAtMjc5MSw3ICsyNzk5LDcgQEAKIAkvKiBSZWFkIEVFUFJPTSBibG9jaywgU0ZGLTgwNzkvU0ZGLTg0NzIsIHdvcmQgYXQgYSB0aW1lICovCiAJZm9yIChpID0gMDsgaSA8IGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxOyBpKyspIHsKIAkJc3RhdHVzID0gaWdiX3JlYWRfcGh5X3JlZ19pMmMoaHcsIGZpcnN0X3dvcmQgKyBpLCAmZGF0YXdvcmRbaV0pOwotCQlpZiAoc3RhdHVzICE9IEUxMDAwX1NVQ0NFU1MpIHsKKwkJaWYgKHN0YXR1cykgewogCQkJLyogRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBtb2R1bGUgKi8KIAkJCWtmcmVlKGRhdGF3b3JkKTsKIAkJCXJldHVybiAtRUlPOwpAQCAtMjgyNCw3ICsyODMyLDcgQEAKIAlyZXR1cm4gSUdCX1JFVEFfU0laRTsKIH0KIAotc3RhdGljIGludCBpZ2JfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyICppbmRpcikKK3N0YXRpYyBpbnQgaWdiX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqaW5kaXIsIHU4ICprZXkpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgaTsKQEAgLTI4NzAsNyArMjg3OCw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGlnYl9zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1MzIgKmluZGlyKQorc3RhdGljIGludCBpZ2Jfc2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTMyICppbmRpciwKKwkJCWNvbnN0IHU4ICprZXkpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMzAxOSw4ICszMDI4LDggQEAKIAkuZ2V0X21vZHVsZV9pbmZvCT0gaWdiX2dldF9tb2R1bGVfaW5mbywKIAkuZ2V0X21vZHVsZV9lZXByb20JPSBpZ2JfZ2V0X21vZHVsZV9lZXByb20sCiAJLmdldF9yeGZoX2luZGlyX3NpemUJPSBpZ2JfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKLQkuZ2V0X3J4ZmhfaW5kaXIJCT0gaWdiX2dldF9yeGZoX2luZGlyLAotCS5zZXRfcnhmaF9pbmRpcgkJPSBpZ2Jfc2V0X3J4ZmhfaW5kaXIsCisJLmdldF9yeGZoCQk9IGlnYl9nZXRfcnhmaCwKKwkuc2V0X3J4ZmgJCT0gaWdiX3NldF9yeGZoLAogCS5nZXRfY2hhbm5lbHMJCT0gaWdiX2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzCQk9IGlnYl9zZXRfY2hhbm5lbHMsCiAJLmJlZ2luCQkJPSBpZ2JfZXRodG9vbF9iZWdpbiwKQEAgLTMwMjksNSArMzAzOCw1IEBACiAKIHZvaWQgaWdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpZ2JfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmaWdiX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9od21vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9od21vbi5jCmluZGV4IDgzMzNmNjcuLjQ0YjZhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfaHdtb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2h3bW9uLmMKQEAgLTEsMjggKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KLSAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCiAjaW5jbHVkZSAiaWdiLmgiCiAjaW5jbHVkZSAiZTEwMDBfODI1NzUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKaW5kZXggMTY0MzBhOC4uZjE0NWFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKQEAgLTEsMjggKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KLSAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA3LTIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgKiB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKQEAgLTc1LDcgKzcyLDcgQEAKIAlbYm9hcmRfODI1NzVdID0gJmUxMDAwXzgyNTc1X2luZm8sCiB9OwogCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaWdiX3BjaV90YmwpID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlnYl9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX0kzNTRfQkFDS1BMQU5FXzFHQlBTKSB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9JMzU0X1NHTUlJKSB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9JMzU0X0JBQ0tQTEFORV8yXzVHQlBTKSB9LApAQCAtMTE3LDcgKzExNCw2IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZ2JfcGNpX3RibCk7CiAKLXZvaWQgaWdiX3Jlc2V0KHN0cnVjdCBpZ2JfYWRhcHRlciAqKTsKIHN0YXRpYyBpbnQgaWdiX3NldHVwX2FsbF90eF9yZXNvdXJjZXMoc3RydWN0IGlnYl9hZGFwdGVyICopOwogc3RhdGljIGludCBpZ2Jfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKik7CiBzdGF0aWMgdm9pZCBpZ2JfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKHN0cnVjdCBpZ2JfYWRhcHRlciAqKTsKQEAgLTE0MSw3ICsxMzcsNyBAQAogc3RhdGljIHZvaWQgaWdiX3dhdGNoZG9nX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICopOwogc3RhdGljIG5ldGRldl90eF90IGlnYl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqaWdiX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cyk7CisJCQkJCSAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cyk7CiBzdGF0aWMgaW50IGlnYl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CiBzdGF0aWMgaW50IGlnYl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CiBzdGF0aWMgdm9pZCBpZ2Jfc2V0X3V0YShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMTU5LDcgKzE1NSw4IEBACiBzdGF0aWMgaW50IGlnYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50IGNtZCk7CiBzdGF0aWMgdm9pZCBpZ2JfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIGlnYl9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIGlnYl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOworc3RhdGljIHZvaWQgaWdiX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiBzdGF0aWMgaW50IGlnYl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKiwgX19iZTE2LCB1MTYpOwogc3RhdGljIGludCBpZ2Jfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqLCBfX2JlMTYsIHUxNik7CiBzdGF0aWMgdm9pZCBpZ2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpZ2JfYWRhcHRlciAqKTsKQEAgLTE3Miw3ICsxNjksNyBAQAogc3RhdGljIGludCBpZ2JfbmRvX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1OCAqbWFjKTsKIHN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgICAgIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7Ci1zdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgaW50IHR4X3JhdGUpOworc3RhdGljIGludCBpZ2JfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCwgaW50KTsKIHN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAogCQkJCSAgIGJvb2wgc2V0dGluZyk7CiBzdGF0aWMgaW50IGlnYl9uZG9fZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCkBAIC0yMTUsMTAgKzIxMiw5IEBACiBzdGF0aWMgdm9pZCBpZ2JfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19QQ0lfSU9WCi1zdGF0aWMgdW5zaWduZWQgaW50IG1heF92ZnMgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfdmZzOwogbW9kdWxlX3BhcmFtKG1heF92ZnMsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtYXhfdmZzLCAiTWF4aW11bSBudW1iZXIgb2YgdmlydHVhbCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUgIgotICAgICAgICAgICAgICAgICAicGVyIHBoeXNpY2FsIGZ1bmN0aW9uIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF92ZnMsICJNYXhpbXVtIG51bWJlciBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSBwZXIgcGh5c2ljYWwgZnVuY3Rpb24iKTsKICNlbmRpZiAvKiBDT05GSUdfUENJX0lPViAqLwogCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpZ2JfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKiwKQEAgLTM4NCw4ICszODAsNyBAQAogCS8qIFByaW50IG5ldGRldmljZSBJbmZvICovCiAJaWYgKG5ldGRldikgewogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTmV0IGRldmljZSBJbmZvXG4iKTsKLQkJcHJfaW5mbygiRGV2aWNlIE5hbWUgICAgIHN0YXRlICAgICAgICAgICAgdHJhbnNfc3RhcnQgICAgICAiCi0JCQkibGFzdF9yeFxuIik7CisJCXByX2luZm8oIkRldmljZSBOYW1lICAgICBzdGF0ZSAgICAgICAgICAgIHRyYW5zX3N0YXJ0ICAgICAgbGFzdF9yeFxuIik7CiAJCXByX2luZm8oIiUtMTVzICUwMTZsWCAlMDE2bFggJTAxNmxYXG4iLCBuZXRkZXYtPm5hbWUsCiAJCQluZXRkZXYtPnN0YXRlLCBuZXRkZXYtPnRyYW5zX3N0YXJ0LCBuZXRkZXYtPmxhc3RfcngpOwogCX0KQEAgLTQzOCw5ICs0MzMsNyBAQAogCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCQlwcl9pbmZvKCJUWCBRVUVVRSBJTkRFWCA9ICVkXG4iLCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7CiAJCXByX2luZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JCXByX2luZm8oIlQgW2Rlc2NdICAgICBbYWRkcmVzcyA2MzowICBdIFtQbFBPQ0lTdERETSBMbl0gIgotCQkJIltiaS0+ZG1hICAgICAgIF0gbGVuZyAgbnR3IHRpbWVzdGFtcCAgICAgICAgIgotCQkJImJpLT5za2JcbiIpOworCQlwcl9pbmZvKCJUIFtkZXNjXSAgICAgW2FkZHJlc3MgNjM6MCAgXSBbUGxQT0NJU3RERE0gTG5dIFtiaS0+ZG1hICAgICAgIF0gbGVuZyAgbnR3IHRpbWVzdGFtcCAgICAgICAgYmktPnNrYlxuIik7CiAKIAkJZm9yIChpID0gMDsgdHhfcmluZy0+ZGVzYyAmJiAoaSA8IHR4X3JpbmctPmNvdW50KTsgaSsrKSB7CiAJCQljb25zdCBjaGFyICpuZXh0X2Rlc2M7CkBAIC00NTgsOSArNDUxLDggQEAKIAkJCWVsc2UKIAkJCQluZXh0X2Rlc2MgPSAiIjsKIAotCQkJcHJfaW5mbygiVCBbMHglMDNYXSAgICAlMDE2bGxYICUwMTZsbFggJTAxNmxsWCIKLQkJCQkiICUwNFggICVwICUwMTZsbFggJXAlc1xuIiwgaSwKLQkJCQlsZTY0X3RvX2NwdSh1MC0+YSksCisJCQlwcl9pbmZvKCJUIFsweCUwM1hdICAgICUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICUwNFggICVwICUwMTZsbFggJXAlc1xuIiwKKwkJCQlpLCBsZTY0X3RvX2NwdSh1MC0+YSksCiAJCQkJbGU2NF90b19jcHUodTAtPmIpLAogCQkJCSh1NjQpZG1hX3VubWFwX2FkZHIoYnVmZmVyX2luZm8sIGRtYSksCiAJCQkJZG1hX3VubWFwX2xlbihidWZmZXJfaW5mbywgbGVuKSwKQEAgLTUxOSwxMCArNTExLDggQEAKIAkJcHJfaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJcHJfaW5mbygiUlggUVVFVUUgSU5ERVggPSAlZFxuIiwgcnhfcmluZy0+cXVldWVfaW5kZXgpOwogCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCQlwcl9pbmZvKCJSICBbZGVzY10gICAgICBbIFBrdEJ1ZiAgICAgQTBdIFsgIEhlYWRCdWYgICBERF0gIgotCQkJIltiaS0+ZG1hICAgICAgIF0gW2JpLT5za2JdIDwtLSBBZHYgUnggUmVhZCBmb3JtYXRcbiIpOwotCQlwcl9pbmZvKCJSV0JbZGVzY10gICAgICBbUGNzbUlwU0hsIFB0UnNdIFt2bCBlciBTIGNrcyBsbl0gLS0tLS0iCi0JCQkiLS0tLS0tLS0tLS0gW2JpLT5za2JdIDwtLSBBZHYgUnggV3JpdGUtQmFjayBmb3JtYXRcbiIpOworCQlwcl9pbmZvKCJSICBbZGVzY10gICAgICBbIFBrdEJ1ZiAgICAgQTBdIFsgIEhlYWRCdWYgICBERF0gW2JpLT5kbWEgICAgICAgXSBbYmktPnNrYl0gPC0tIEFkdiBSeCBSZWFkIGZvcm1hdFxuIik7CisJCXByX2luZm8oIlJXQltkZXNjXSAgICAgIFtQY3NtSXBTSGwgUHRSc10gW3ZsIGVyIFMgY2tzIGxuXSAtLS0tLS0tLS0tLS0tLS0tIFtiaS0+c2tiXSA8LS0gQWR2IFJ4IFdyaXRlLUJhY2sgZm9ybWF0XG4iKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgewogCQkJY29uc3QgY2hhciAqbmV4dF9kZXNjOwpAQCAtNTg0LDcgKzU3NCw3IEBACiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzMzIgaTJjY3RsID0gcmQzMihFMTAwMF9JMkNQQVJBTVMpOwogCi0JcmV0dXJuICgoaTJjY3RsICYgRTEwMDBfSTJDX0RBVEFfSU4pICE9IDApOworCXJldHVybiAhIShpMmNjdGwgJiBFMTAwMF9JMkNfREFUQV9JTik7CiB9CiAKIC8qKgpAQCAtNjQ4LDcgKzYzOCw3IEBACiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzMzIgaTJjY3RsID0gcmQzMihFMTAwMF9JMkNQQVJBTVMpOwogCi0JcmV0dXJuICgoaTJjY3RsICYgRTEwMDBfSTJDX0NMS19JTikgIT0gMCk7CisJcmV0dXJuICEhKGkyY2N0bCAmIEUxMDAwX0kyQ19DTEtfSU4pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGlnYl9pMmNfYWxnbyA9IHsKQEAgLTY4MSw5ICs2NzEsOSBAQAogc3RhdGljIGludCBfX2luaXQgaWdiX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJldDsKKwogCXByX2luZm8oIiVzIC0gdmVyc2lvbiAlc1xuIiwKIAkgICAgICAgaWdiX2RyaXZlcl9zdHJpbmcsIGlnYl9kcml2ZXJfdmVyc2lvbik7Ci0KIAlwcl9pbmZvKCIlc1xuIiwgaWdiX2NvcHlyaWdodCk7CiAKICNpZmRlZiBDT05GSUdfSUdCX0RDQQpAQCAtNzM2LDEyICs3MjYsMTQgQEAKIAkJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLT5yZWdfaWR4ID0gcmJhc2Vfb2Zmc2V0ICsKIAkJCQkJCQkgICAgICAgUV9JRFhfODI1NzYoaSk7CiAJCX0KKwkJLyogRmFsbCB0aHJvdWdoICovCiAJY2FzZSBlMTAwMF84MjU3NToKIAljYXNlIGUxMDAwXzgyNTgwOgogCWNhc2UgZTEwMDBfaTM1MDoKIAljYXNlIGUxMDAwX2kzNTQ6CiAJY2FzZSBlMTAwMF9pMjEwOgogCWNhc2UgZTEwMDBfaTIxMToKKwkJLyogRmFsbCB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJZm9yICg7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLT5yZWdfaWR4ID0gcmJhc2Vfb2Zmc2V0ICsgaTsKQEAgLTEyOTIsOCArMTI4NCw3IEBACiAJCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA+PSBlMTAwMF84MjU3NikKIAkJCXNldF9iaXQoSUdCX1JJTkdfRkxBR19SWF9TQ1RQX0NTVU0sICZyaW5nLT5mbGFncyk7CiAKLQkJLyoKLQkJICogT24gaTM1MCwgaTM1NCwgaTIxMCwgYW5kIGkyMTEsIGxvb3BiYWNrIFZMQU4gcGFja2V0cworCQkvKiBPbiBpMzUwLCBpMzU0LCBpMjEwLCBhbmQgaTIxMSwgbG9vcGJhY2sgVkxBTiBwYWNrZXRzCiAJCSAqIGhhdmUgdGhlIHRhZyBieXRlLXN3YXBwZWQuCiAJCSAqLwogCQlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPj0gZTEwMDBfaTM1MCkKQEAgLTEzNDUsNiArMTMzNiw3IEBACiAJZm9yICg7IHZfaWR4IDwgcV92ZWN0b3JzOyB2X2lkeCsrKSB7CiAJCWludCBycXB2ID0gRElWX1JPVU5EX1VQKHJ4cl9yZW1haW5pbmcsIHFfdmVjdG9ycyAtIHZfaWR4KTsKIAkJaW50IHRxcHYgPSBESVZfUk9VTkRfVVAodHhyX3JlbWFpbmluZywgcV92ZWN0b3JzIC0gdl9pZHgpOworCiAJCWVyciA9IGlnYl9hbGxvY19xX3ZlY3RvcihhZGFwdGVyLCBxX3ZlY3RvcnMsIHZfaWR4LAogCQkJCQkgdHFwdiwgdHhyX2lkeCwgcnFwdiwgcnhyX2lkeCk7CiAKQEAgLTE0ODQsNiArMTQ3Niw3IEBACiAJICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSUdCX0ZMQUdfSEFTX01TSVgpIHsKIAkJdTMyIHJlZ3ZhbCA9IHJkMzIoRTEwMDBfRUlBTSk7CisKIAkJd3IzMihFMTAwMF9FSUFNLCByZWd2YWwgJiB+YWRhcHRlci0+ZWltc19lbmFibGVfbWFzayk7CiAJCXdyMzIoRTEwMDBfRUlNQywgYWRhcHRlci0+ZWltc19lbmFibGVfbWFzayk7CiAJCXJlZ3ZhbCA9IHJkMzIoRTEwMDBfRUlBQyk7CkBAIC0xNDk1LDYgKzE0ODgsNyBAQAogCXdyZmwoKTsKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJR0JfRkxBR19IQVNfTVNJWCkgewogCQlpbnQgaTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3FfdmVjdG9yczsgaSsrKQogCQkJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS52ZWN0b3IpOwogCX0gZWxzZSB7CkBAIC0xNTEzLDYgKzE1MDcsNyBAQAogCWlmIChhZGFwdGVyLT5mbGFncyAmIElHQl9GTEFHX0hBU19NU0lYKSB7CiAJCXUzMiBpbXMgPSBFMTAwMF9JTVNfTFNDIHwgRTEwMDBfSU1TX0RPVVRTWU5DIHwgRTEwMDBfSU1TX0RSU1RBOwogCQl1MzIgcmVndmFsID0gcmQzMihFMTAwMF9FSUFDKTsKKwogCQl3cjMyKEUxMDAwX0VJQUMsIHJlZ3ZhbCB8IGFkYXB0ZXItPmVpbXNfZW5hYmxlX21hc2spOwogCQlyZWd2YWwgPSByZDMyKEUxMDAwX0VJQU0pOwogCQl3cjMyKEUxMDAwX0VJQU0sIHJlZ3ZhbCB8IGFkYXB0ZXItPmVpbXNfZW5hYmxlX21hc2spOwpAQCAtMTc0NSw2ICsxNzQwLDcgQEAKIAkvKiBub3RpZnkgVkZzIHRoYXQgcmVzZXQgaGFzIGJlZW4gY29tcGxldGVkICovCiAJaWYgKGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpIHsKIAkJdTMyIHJlZ19kYXRhID0gcmQzMihFMTAwMF9DVFJMX0VYVCk7CisKIAkJcmVnX2RhdGEgfD0gRTEwMDBfQ1RSTF9FWFRfUEZSU1REOwogCQl3cjMyKEUxMDAwX0NUUkxfRVhULCByZWdfZGF0YSk7CiAJfQpAQCAtMTc4Nyw3ICsxNzgzLDcgQEAKIAl3cjMyKEUxMDAwX1RDVEwsIHRjdGwpOwogCS8qIGZsdXNoIGJvdGggZGlzYWJsZXMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZmluaXNoICovCiAJd3JmbCgpOwotCW1zbGVlcCgxMCk7CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CiAKIAlpZ2JfaXJxX2Rpc2FibGUoYWRhcHRlcik7CiAKQEAgLTE4MjcsNyArMTgyMyw3IEBACiB7CiAJV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7CiAJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JR0JfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKQotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAlpZ2JfZG93bihhZGFwdGVyKTsKIAlpZ2JfdXAoYWRhcHRlcik7CiAJY2xlYXJfYml0KF9fSUdCX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKQEAgLTE5NjAsNiArMTk1Niw3IEBACiAJLyogZGlzYWJsZSByZWNlaXZlIGZvciBhbGwgVkZzIGFuZCB3YWl0IG9uZSBzZWNvbmQgKi8KIAlpZiAoYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudCkgewogCQlpbnQgaTsKKwogCQlmb3IgKGkgPSAwIDsgaSA8IGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQ7IGkrKykKIAkJCWFkYXB0ZXItPnZmX2RhdGFbaV0uZmxhZ3MgJj0gSUdCX1ZGX0ZMQUdfUEZfU0VUX01BQzsKIApAQCAtMjA4Nyw3ICsyMDg0LDcgQEAKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBpZ2Jfdmxhbl9yeF9raWxsX3ZpZCwKIAkubmRvX3NldF92Zl9tYWMJCT0gaWdiX25kb19zZXRfdmZfbWFjLAogCS5uZG9fc2V0X3ZmX3ZsYW4JPSBpZ2JfbmRvX3NldF92Zl92bGFuLAotCS5uZG9fc2V0X3ZmX3R4X3JhdGUJPSBpZ2JfbmRvX3NldF92Zl9idywKKwkubmRvX3NldF92Zl9yYXRlCT0gaWdiX25kb19zZXRfdmZfYncsCiAJLm5kb19zZXRfdmZfc3Bvb2ZjaGsJPSBpZ2JfbmRvX3NldF92Zl9zcG9vZmNoaywKIAkubmRvX2dldF92Zl9jb25maWcJPSBpZ2JfbmRvX2dldF92Zl9jb25maWcsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTIxNDIsNyArMjEzOSw2IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCXJldHVybjsKIH0KIAogLyoqCkBAIC0yMjAzLDExICsyMTk5LDExIEBACiAgKiovCiBzdGF0aWMgczMyIGlnYl9pbml0X2kyYyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JczMyIHN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisJczMyIHN0YXR1cyA9IDA7CiAKIAkvKiBJMkMgaW50ZXJmYWNlIHN1cHBvcnRlZCBvbiBpMzUwIGRldmljZXMgKi8KIAlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgIT0gZTEwMDBfaTM1MCkKLQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCXJldHVybiAwOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgaTJjIGJ1cyB3aGljaCBpcyBjb250cm9sbGVkIGJ5IHRoZSByZWdpc3RlcnMuCiAJICogVGhpcyBidXMgd2lsbCB1c2UgdGhlIGkyY19hbGdvX2JpdCBzdHJ1Y3R1ZSB0aGF0IGltcGxlbWVudHMKQEAgLTI0MzcsNiArMjQzMywxMiBAQAogCS8qIGdldCBmaXJtd2FyZSB2ZXJzaW9uIGZvciBldGh0b29sIC1pICovCiAJaWdiX3NldF9md192ZXJzaW9uKGFkYXB0ZXIpOwogCisJLyogY29uZmlndXJlIFJYUEJTSVpFIGFuZCBUWFBCU0laRSAqLworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfaTIxMCkgeworCQl3cjMyKEUxMDAwX1JYUEJTLCBJMjEwX1JYUEJTSVpFX0RFRkFVTFQpOworCQl3cjMyKEUxMDAwX1RYUEJTLCBJMjEwX1RYUEJTSVpFX0RFRkFVTFQpOworCX0KKwogCXNldHVwX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgaWdiX3dhdGNoZG9nLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXIpOwogCXNldHVwX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgaWdiX3VwZGF0ZV9waHlfaW5mbywKQEAgLTI1MjksNyArMjUzMSw4IEBACiAJfQogCiAJLyogbGV0IHRoZSBmL3cga25vdyB0aGF0IHRoZSBoL3cgaXMgbm93IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQotCSAqIGRyaXZlci4gKi8KKwkgKiBkcml2ZXIuCisJICovCiAJaWdiX2dldF9od19jb250cm9sKGFkYXB0ZXIpOwogCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CkBAIC0zMDc3LDYgKzMwODAsNyBAQAogCS8qIG5vdGlmeSBWRnMgdGhhdCByZXNldCBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KIAlpZiAoYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudCkgewogCQl1MzIgcmVnX2RhdGEgPSByZDMyKEUxMDAwX0NUUkxfRVhUKTsKKwogCQlyZWdfZGF0YSB8PSBFMTAwMF9DVFJMX0VYVF9QRlJTVEQ7CiAJCXdyMzIoRTEwMDBfQ1RSTF9FWFQsIHJlZ19kYXRhKTsKIAl9CkBAIC0zMjQ4LDcgKzMyNTIsNyBAQAogICogIENvbmZpZ3VyZSBhIHRyYW5zbWl0IHJpbmcgYWZ0ZXIgYSByZXNldC4KICAqKi8KIHZvaWQgaWdiX2NvbmZpZ3VyZV90eF9yaW5nKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZ2JfcmluZyAqcmluZykKKwkJCSAgIHN0cnVjdCBpZ2JfcmluZyAqcmluZykKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiB0eGRjdGwgPSAwOwpAQCAtMzM4OSw3ICszMzkzLDggQEAKIAogCWlmIChhZGFwdGVyLT5yc3NfaW5kaXJfdGJsX2luaXQgIT0gbnVtX3J4X3F1ZXVlcykgewogCQlmb3IgKGogPSAwOyBqIDwgSUdCX1JFVEFfU0laRTsgaisrKQotCQkJYWRhcHRlci0+cnNzX2luZGlyX3RibFtqXSA9IChqICogbnVtX3J4X3F1ZXVlcykgLyBJR0JfUkVUQV9TSVpFOworCQkJYWRhcHRlci0+cnNzX2luZGlyX3RibFtqXSA9CisJCQkoaiAqIG51bV9yeF9xdWV1ZXMpIC8gSUdCX1JFVEFfU0laRTsKIAkJYWRhcHRlci0+cnNzX2luZGlyX3RibF9pbml0ID0gbnVtX3J4X3F1ZXVlczsKIAl9CiAJaWdiX3dyaXRlX3Jzc19pbmRpcl90YmwoYWRhcHRlcik7CkBAIC0zNDMwLDYgKzM0MzUsNyBAQAogCQlpZiAoaHctPm1hYy50eXBlID4gZTEwMDBfODI1NzUpIHsKIAkJCS8qIFNldCB0aGUgZGVmYXVsdCBwb29sIGZvciB0aGUgUEYncyBmaXJzdCBxdWV1ZSAqLwogCQkJdTMyIHZ0Y3RsID0gcmQzMihFMTAwMF9WVF9DVEwpOworCiAJCQl2dGN0bCAmPSB+KEUxMDAwX1ZUX0NUTF9ERUZBVUxUX1BPT0xfTUFTSyB8CiAJCQkJICAgRTEwMDBfVlRfQ1RMX0RJU0FCTEVfREVGX1BPT0wpOwogCQkJdnRjdGwgfD0gYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudCA8PApAQCAtMzUxMSw3ICszNTE3LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaWdiX3NldF92Zl9ybHBtbChzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmZuKQorCQkJCSAgIGludCB2Zm4pCiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgdm1vbHI7CkBAIC00MDU4LDcgKzQwNjQsOCBAQAogCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU3NjoKIAljYXNlIGUxMDAwX2kzNTA6Ci0JCWlmICghKHd2YnIgPSByZDMyKEUxMDAwX1dWQlIpKSkKKwkJd3ZiciA9IHJkMzIoRTEwMDBfV1ZCUik7CisJCWlmICghd3ZicikKIAkJCXJldHVybjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQwNzcsNyArNDA4NCw3IEBACiAJaWYgKCFhZGFwdGVyLT53dmJyKQogCQlyZXR1cm47CiAKLQlmb3IoaiA9IDA7IGogPCBhZGFwdGVyLT52ZnNfYWxsb2NhdGVkX2NvdW50OyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudDsgaisrKSB7CiAJCWlmIChhZGFwdGVyLT53dmJyICYgKDEgPDwgaikgfHwKIAkJICAgIGFkYXB0ZXItPnd2YnIgJiAoMSA8PCAoaiArIElHQl9TVEFHR0VSRURfUVVFVUVfT0ZGU0VUKSkpIHsKIAkJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCkBAIC00MjA5LDE0ICs0MjE2LDE1IEBACiAKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJCXUzMiBjdHJsOworCiAJCQlody0+bWFjLm9wcy5nZXRfc3BlZWRfYW5kX2R1cGxleChodywKIAkJCQkJCQkgJmFkYXB0ZXItPmxpbmtfc3BlZWQsCiAJCQkJCQkJICZhZGFwdGVyLT5saW5rX2R1cGxleCk7CiAKIAkJCWN0cmwgPSByZDMyKEUxMDAwX0NUUkwpOwogCQkJLyogTGlua3Mgc3RhdHVzIG1lc3NhZ2UgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQgKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImlnYjogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlcyAiCi0JCQkgICAgICAgIkR1cGxleCwgRmxvdyBDb250cm9sOiAlc1xuIiwKKwkJCW5ldGRldl9pbmZvKG5ldGRldiwKKwkJCSAgICAgICAiaWdiOiAlcyBOSUMgTGluayBpcyBVcCAlZCBNYnBzICVzIER1cGxleCwgRmxvdyBDb250cm9sOiAlc1xuIiwKIAkJCSAgICAgICBuZXRkZXYtPm5hbWUsCiAJCQkgICAgICAgYWRhcHRlci0+bGlua19zcGVlZCwKIAkJCSAgICAgICBhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/CkBAIC00MjQyLDExICs0MjUwLDggQEAKIAogCQkJLyogY2hlY2sgZm9yIHRoZXJtYWwgc2Vuc29yIGV2ZW50ICovCiAJCQlpZiAoaWdiX3RoZXJtYWxfc2Vuc29yX2V2ZW50KGh3LAotCQkJICAgIEUxMDAwX1RIU1RBVF9MSU5LX1RIUk9UVExFKSkgewotCQkJCW5ldGRldl9pbmZvKG5ldGRldiwgIlRoZSBuZXR3b3JrIGFkYXB0ZXIgbGluayAiCi0JCQkJCSAgICAic3BlZWQgd2FzIGRvd25zaGlmdGVkIGJlY2F1c2UgaXQgIgotCQkJCQkgICAgIm92ZXJoZWF0ZWRcbiIpOwotCQkJfQorCQkJICAgIEUxMDAwX1RIU1RBVF9MSU5LX1RIUk9UVExFKSkKKwkJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJUaGUgbmV0d29yayBhZGFwdGVyIGxpbmsgc3BlZWQgd2FzIGRvd25zaGlmdGVkIGJlY2F1c2UgaXQgb3ZlcmhlYXRlZFxuIik7CiAKIAkJCS8qIGFkanVzdCB0aW1lb3V0IGZhY3RvciBhY2NvcmRpbmcgdG8gc3BlZWQvZHVwbGV4ICovCiAJCQlhZGFwdGVyLT50eF90aW1lb3V0X2ZhY3RvciA9IDE7CkBAIC00Mjc3LDEyICs0MjgyLDExIEBACiAJCQkvKiBjaGVjayBmb3IgdGhlcm1hbCBzZW5zb3IgZXZlbnQgKi8KIAkJCWlmIChpZ2JfdGhlcm1hbF9zZW5zb3JfZXZlbnQoaHcsCiAJCQkgICAgRTEwMDBfVEhTVEFUX1BXUl9ET1dOKSkgewotCQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiVGhlIG5ldHdvcmsgYWRhcHRlciB3YXMgIgotCQkJCQkgICAic3RvcHBlZCBiZWNhdXNlIGl0IG92ZXJoZWF0ZWRcbiIpOworCQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiVGhlIG5ldHdvcmsgYWRhcHRlciB3YXMgc3RvcHBlZCBiZWNhdXNlIGl0IG92ZXJoZWF0ZWRcbiIpOwogCQkJfQogCiAJCQkvKiBMaW5rcyBzdGF0dXMgbWVzc2FnZSBtdXN0IGZvbGxvdyB0aGlzIGZvcm1hdCAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWdiOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiaWdiOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAogCQkJICAgICAgIG5ldGRldi0+bmFtZSk7CiAJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCkBAIC00MzQ0LDYgKzQzNDgsNyBAQAogCS8qIENhdXNlIHNvZnR3YXJlIGludGVycnVwdCB0byBlbnN1cmUgUnggcmluZyBpcyBjbGVhbmVkICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSUdCX0ZMQUdfSEFTX01TSVgpIHsKIAkJdTMyIGVpY3MgPSAwOworCiAJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcV92ZWN0b3JzOyBpKyspCiAJCQllaWNzIHw9IGFkYXB0ZXItPnFfdmVjdG9yW2ldLT5laW1zX3ZhbHVlOwogCQl3cjMyKEUxMDAwX0VJQ1MsIGVpY3MpOwpAQCAtNDQ4MywxMyArNDQ4OCwxMiBAQAogCWNhc2UgbG93X2xhdGVuY3k6ICAvKiA1MCB1c2VjIGFrYSAyMDAwMCBpbnRzL3MgKi8KIAkJaWYgKGJ5dGVzID4gMTAwMDApIHsKIAkJCS8qIHRoaXMgaWYgaGFuZGxlcyB0aGUgVFNPIGFjY291bnRpbmcgKi8KLQkJCWlmIChieXRlcy9wYWNrZXRzID4gODAwMCkgeworCQkJaWYgKGJ5dGVzL3BhY2tldHMgPiA4MDAwKQogCQkJCWl0cnZhbCA9IGJ1bGtfbGF0ZW5jeTsKLQkJCX0gZWxzZSBpZiAoKHBhY2tldHMgPCAxMCkgfHwgKChieXRlcy9wYWNrZXRzKSA+IDEyMDApKSB7CisJCQllbHNlIGlmICgocGFja2V0cyA8IDEwKSB8fCAoKGJ5dGVzL3BhY2tldHMpID4gMTIwMCkpCiAJCQkJaXRydmFsID0gYnVsa19sYXRlbmN5OwotCQkJfSBlbHNlIGlmICgocGFja2V0cyA+IDM1KSkgeworCQkJZWxzZSBpZiAoKHBhY2tldHMgPiAzNSkpCiAJCQkJaXRydmFsID0gbG93ZXN0X2xhdGVuY3k7Ci0JCQl9CiAJCX0gZWxzZSBpZiAoYnl0ZXMvcGFja2V0cyA+IDIwMDApIHsKIAkJCWl0cnZhbCA9IGJ1bGtfbGF0ZW5jeTsKIAkJfSBlbHNlIGlmIChwYWNrZXRzIDw9IDIgJiYgYnl0ZXMgPCA1MTIpIHsKQEAgLTQ2NzUsNiArNDY3OSw3IEBACiAJCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJdTggbDRfaGRyID0gMDsKKwogCQlzd2l0Y2ggKGZpcnN0LT5wcm90b2NvbCkgewogCQljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJCXZsYW5fbWFjaXBfbGVucyB8PSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CkBAIC00OTYyLDYgKzQ5NjcsNyBAQAogCSAqLwogCWlmIChORVRERVZfRlJBR19QQUdFX01BWF9TSVpFID4gSUdCX01BWF9EQVRBX1BFUl9UWEQpIHsKIAkJdW5zaWduZWQgc2hvcnQgZjsKKwogCQlmb3IgKGYgPSAwOyBmIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZisrKQogCQkJY291bnQgKz0gVFhEX1VTRV9DT1VOVChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdLnNpemUpOwogCX0gZWxzZSB7CkBAIC01MTQwLDcgKzUxNDYsNyBAQAogCQltYXhfZnJhbWUgPSBFVEhfRlJBTUVfTEVOICsgRVRIX0ZDU19MRU47CiAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lHQl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCi0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCiAJLyogaWdiX2Rvd24gaGFzIGEgZGVwZW5kZW5jeSBvbiBtYXhfZnJhbWVfc2l6ZSAqLwogCWFkYXB0ZXItPm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOwpAQCAtNTYyMSw2ICs1NjI3LDcgQEAKIAkJCXZtb2xyIHw9IEUxMDAwX1ZNT0xSX01QTUU7CiAJCX0gZWxzZSBpZiAodmZfZGF0YS0+bnVtX3ZmX21jX2hhc2hlcykgewogCQkJaW50IGo7CisKIAkJCXZtb2xyIHw9IEUxMDAwX1ZNT0xSX1JPTVBFOwogCQkJZm9yIChqID0gMDsgaiA8IHZmX2RhdGEtPm51bV92Zl9tY19oYXNoZXM7IGorKykKIAkJCQlpZ2JfbXRhX3NldChodywgdmZfZGF0YS0+dmZfbWNfaGFzaGVzW2pdKTsKQEAgLTU2NzIsNiArNTY3OSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudDsgaSsrKSB7CiAJCXUzMiB2bW9sciA9IHJkMzIoRTEwMDBfVk1PTFIoaSkpOworCiAJCXZtb2xyICY9IH4oRTEwMDBfVk1PTFJfUk9NUEUgfCBFMTAwMF9WTU9MUl9NUE1FKTsKIAogCQl2Zl9kYXRhID0gJmFkYXB0ZXItPnZmX2RhdGFbaV07CkBAIC01NzcwLDYgKzU3NzgsNyBAQAogCiAJCQlpZiAoIWFkYXB0ZXItPnZmX2RhdGFbdmZdLnZsYW5zX2VuYWJsZWQpIHsKIAkJCQl1MzIgc2l6ZTsKKwogCQkJCXJlZyA9IHJkMzIoRTEwMDBfVk1PTFIodmYpKTsKIAkJCQlzaXplID0gcmVnICYgRTEwMDBfVk1PTFJfUkxQTUxfTUFTSzsKIAkJCQlzaXplICs9IDQ7CkBAIC01Nzk4LDYgKzU4MDcsNyBAQAogCQkJYWRhcHRlci0+dmZfZGF0YVt2Zl0udmxhbnNfZW5hYmxlZC0tOwogCQkJaWYgKCFhZGFwdGVyLT52Zl9kYXRhW3ZmXS52bGFuc19lbmFibGVkKSB7CiAJCQkJdTMyIHNpemU7CisKIAkJCQlyZWcgPSByZDMyKEUxMDAwX1ZNT0xSKHZmKSk7CiAJCQkJc2l6ZSA9IHJlZyAmIEUxMDAwX1ZNT0xSX1JMUE1MX01BU0s7CiAJCQkJc2l6ZSAtPSA0OwpAQCAtNTkwMiw4ICs1OTEyLDggQEAKIAkgKi8KIAlpZiAoIWFkZCAmJiAoYWRhcHRlci0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkgewogCQl1MzIgdmx2ZiwgYml0czsKLQogCQlpbnQgcmVnbmR4ID0gaWdiX2ZpbmRfdmx2Zl9lbnRyeShhZGFwdGVyLCB2aWQpOworCiAJCWlmIChyZWduZHggPCAwKQogCQkJZ290byBvdXQ7CiAJCS8qIFNlZSBpZiBhbnkgb3RoZXIgcG9vbHMgYXJlIHNldCBmb3IgdGhpcyBWTEFOIGZpbHRlcgpAQCAtNjQ5NCw3ICs2NTA0LDcgQEAKIAlyeF9yaW5nLT5uZXh0X3RvX2FsbG9jID0gKG50YSA8IHJ4X3JpbmctPmNvdW50KSA/IG50YSA6IDA7CiAKIAkvKiB0cmFuc2ZlciBwYWdlIGZyb20gb2xkIGJ1ZmZlciB0byBuZXcgYnVmZmVyICovCi0JbWVtY3B5KG5ld19idWZmLCBvbGRfYnVmZiwgc2l6ZW9mKHN0cnVjdCBpZ2JfcnhfYnVmZmVyKSk7CisJKm5ld19idWZmID0gKm9sZF9idWZmOwogCiAJLyogc3luYyB0aGUgYnVmZmVyIGZvciB1c2UgYnkgdGhlIGRldmljZSAqLwogCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHJ4X3JpbmctPmRldiwgb2xkX2J1ZmYtPmRtYSwKQEAgLTY5NjMsNiArNjk3Myw3IEBACiAJaWYgKChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpICYmCiAJICAgIGlnYl90ZXN0X3N0YXRlcnIocnhfZGVzYywgRTEwMDBfUlhEX1NUQVRfVlApKSB7CiAJCXUxNiB2aWQ7CisKIAkJaWYgKGlnYl90ZXN0X3N0YXRlcnIocnhfZGVzYywgRTEwMDBfUlhERVhUX1NUQVRFUlJfTEIpICYmCiAJCSAgICB0ZXN0X2JpdChJR0JfUklOR19GTEFHX1JYX0xCX1ZMQU5fQlNXQVAsICZyeF9yaW5nLT5mbGFncykpCiAJCQl2aWQgPSBiZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci52bGFuKTsKQEAgLTcwNTEsNyArNzA2Miw3IEBACiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWlnYl9hbGxvY19yeF9idWZmZXJzKHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOwogCi0JcmV0dXJuICh0b3RhbF9wYWNrZXRzIDwgYnVkZ2V0KTsKKwlyZXR1cm4gdG90YWxfcGFja2V0cyA8IGJ1ZGdldDsKIH0KIAogc3RhdGljIGJvb2wgaWdiX2FsbG9jX21hcHBlZF9wYWdlKHN0cnVjdCBpZ2JfcmluZyAqcnhfcmluZywKQEAgLTcxNzIsNyArNzE4Myw3IEBACiAJCWJyZWFrOwogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJCWlmIChpZ2JfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSAmIDB4MUYsCi0JCSAgICAgICAgICAgICAgICAgICAgICZkYXRhLT52YWxfb3V0KSkKKwkJCQkgICAgICZkYXRhLT52YWxfb3V0KSkKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFNJT0NTTUlJUkVHOgpAQCAtNzg3Myw3ICs3ODg0LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCBpbnQgdHhfcmF0ZSkKK3N0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAorCQkJICAgICBpbnQgbWluX3R4X3JhdGUsIGludCBtYXhfdHhfcmF0ZSkKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC03ODgyLDE1ICs3ODk0LDE5IEBACiAJaWYgKGh3LT5tYWMudHlwZSAhPSBlMTAwMF84MjU3NikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJaWYgKG1pbl90eF9yYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWFjdHVhbF9saW5rX3NwZWVkID0gaWdiX2xpbmtfbWJwcyhhZGFwdGVyLT5saW5rX3NwZWVkKTsKIAlpZiAoKHZmID49IGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpIHx8CiAJICAgICghKHJkMzIoRTEwMDBfU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpIHx8Ci0JICAgICh0eF9yYXRlIDwgMCkgfHwgKHR4X3JhdGUgPiBhY3R1YWxfbGlua19zcGVlZCkpCisJICAgIChtYXhfdHhfcmF0ZSA8IDApIHx8CisJICAgIChtYXhfdHhfcmF0ZSA+IGFjdHVhbF9saW5rX3NwZWVkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlhZGFwdGVyLT52Zl9yYXRlX2xpbmtfc3BlZWQgPSBhY3R1YWxfbGlua19zcGVlZDsKLQlhZGFwdGVyLT52Zl9kYXRhW3ZmXS50eF9yYXRlID0gKHUxNil0eF9yYXRlOwotCWlnYl9zZXRfdmZfcmF0ZV9saW1pdChodywgdmYsIHR4X3JhdGUsIGFjdHVhbF9saW5rX3NwZWVkKTsKKwlhZGFwdGVyLT52Zl9kYXRhW3ZmXS50eF9yYXRlID0gKHUxNiltYXhfdHhfcmF0ZTsKKwlpZ2Jfc2V0X3ZmX3JhdGVfbGltaXQoaHcsIHZmLCBtYXhfdHhfcmF0ZSwgYWN0dWFsX2xpbmtfc3BlZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03OTE5LDcgKzc5MzUsNyBAQAogCXdyMzIocmVnX29mZnNldCwgcmVnX3ZhbCk7CiAKIAlhZGFwdGVyLT52Zl9kYXRhW3ZmXS5zcG9vZmNoa19lbmFibGVkID0gc2V0dGluZzsKLQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpZ2JfbmRvX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKQEAgLTc5MzAsNyArNzk0Niw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWl2aS0+dmYgPSB2ZjsKIAltZW1jcHkoJml2aS0+bWFjLCBhZGFwdGVyLT52Zl9kYXRhW3ZmXS52Zl9tYWNfYWRkcmVzc2VzLCBFVEhfQUxFTik7Ci0JaXZpLT50eF9yYXRlID0gYWRhcHRlci0+dmZfZGF0YVt2Zl0udHhfcmF0ZTsKKwlpdmktPm1heF90eF9yYXRlID0gYWRhcHRlci0+dmZfZGF0YVt2Zl0udHhfcmF0ZTsKKwlpdmktPm1pbl90eF9yYXRlID0gMDsKIAlpdmktPnZsYW4gPSBhZGFwdGVyLT52Zl9kYXRhW3ZmXS5wZl92bGFuOwogCWl2aS0+cW9zID0gYWRhcHRlci0+dmZfZGF0YVt2Zl0ucGZfcW9zOwogCWl2aS0+c3Bvb2ZjaGsgPSBhZGFwdGVyLT52Zl9kYXRhW3ZmXS5zcG9vZmNoa19lbmFibGVkOwpAQCAtNzk1NSwxMSArNzk3MiwxMyBAQAogCQlyZWcgPSByZDMyKEUxMDAwX0RUWENUTCk7CiAJCXJlZyB8PSBFMTAwMF9EVFhDVExfVkxBTl9BRERFRDsKIAkJd3IzMihFMTAwMF9EVFhDVEwsIHJlZyk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgZTEwMDBfODI1ODA6CiAJCS8qIGVuYWJsZSByZXBsaWNhdGlvbiB2bGFuIHRhZyBzdHJpcHBpbmcgKi8KIAkJcmVnID0gcmQzMihFMTAwMF9SUExPTFIpOwogCQlyZWcgfD0gRTEwMDBfUlBMT0xSX1NUUlZMQU47CiAJCXdyMzIoRTEwMDBfUlBMT0xSLCByZWcpOworCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIGUxMDAwX2kzNTA6CiAJCS8qIG5vbmUgb2YgdGhlIGFib3ZlIHJlZ2lzdGVycyBhcmUgc3VwcG9ydGVkIGJ5IGkzNTAgKi8KIAkJYnJlYWs7CkBAIC04MDQ5LDYgKzgwNjgsNyBAQAogCQl9IC8qIGVuZGlmIGFkYXB0ZXItPmRtYWMgaXMgbm90IGRpc2FibGVkICovCiAJfSBlbHNlIGlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1ODApIHsKIAkJdTMyIHJlZyA9IHJkMzIoRTEwMDBfUENJRU1JU0MpOworCiAJCXdyMzIoRTEwMDBfUENJRU1JU0MsIHJlZyAmIH5FMTAwMF9QQ0lFTUlTQ19MWF9ERUNJU0lPTik7CiAJCXdyMzIoRTEwMDBfRE1BQ1IsIDApOwogCX0KQEAgLTgwNzcsOCArODA5Nyw3IEBACiAKIAlzd2Z3X21hc2sgPSBFMTAwMF9TV0ZXX1BIWTBfU007CiAKLQlpZiAoaHctPm1hYy5vcHMuYWNxdWlyZV9zd2Z3X3N5bmMoaHcsIHN3ZndfbWFzaykKLQkgICAgIT0gRTEwMDBfU1VDQ0VTUykKKwlpZiAoaHctPm1hYy5vcHMuYWNxdWlyZV9zd2Z3X3N5bmMoaHcsIHN3ZndfbWFzaykpCiAJCXJldHVybiBFMTAwMF9FUlJfU1dGV19TWU5DOwogCiAJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHRoaXNfY2xpZW50LCBieXRlX29mZnNldCk7CkBAIC04MDg4LDcgKzgxMDcsNyBAQAogCQlyZXR1cm4gRTEwMDBfRVJSX0kyQzsKIAllbHNlIHsKIAkJKmRhdGEgPSBzdGF0dXM7Ci0JCXJldHVybiBFMTAwMF9TVUNDRVNTOworCQlyZXR1cm4gMDsKIAl9CiB9CiAKQEAgLTgxMTMsNyArODEzMiw3IEBACiAJaWYgKCF0aGlzX2NsaWVudCkKIAkJcmV0dXJuIEUxMDAwX0VSUl9JMkM7CiAKLQlpZiAoaHctPm1hYy5vcHMuYWNxdWlyZV9zd2Z3X3N5bmMoaHcsIHN3ZndfbWFzaykgIT0gRTEwMDBfU1VDQ0VTUykKKwlpZiAoaHctPm1hYy5vcHMuYWNxdWlyZV9zd2Z3X3N5bmMoaHcsIHN3ZndfbWFzaykpCiAJCXJldHVybiBFMTAwMF9FUlJfU1dGV19TWU5DOwogCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEodGhpc19jbGllbnQsIGJ5dGVfb2Zmc2V0LCBkYXRhKTsKIAlody0+bWFjLm9wcy5yZWxlYXNlX3N3Zndfc3luYyhodywgc3dmd19tYXNrKTsKQEAgLTgxMjEsNyArODE0MCw3IEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIEUxMDAwX0VSUl9JMkM7CiAJZWxzZQotCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJcmV0dXJuIDA7CiAKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfcHRwLmMKaW5kZXggYWIyNWU0OS4uNzk0YzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jCkBAIC0zNjAsOCArMzYwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpZ2JfcHRwX2VuYWJsZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpycSwgaW50IG9uKQorc3RhdGljIGludCBpZ2JfcHRwX2ZlYXR1cmVfZW5hYmxlKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLAorCQkJCSAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpycSwgaW50IG9uKQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTU1OSwxMCArNTU5LDExIEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBjb25maWcsIHNpemVvZigqY29uZmlnKSkgPwogCQktRUZBVUxUIDogMDsKIH0KKwogLyoqCi0gKiBpZ2JfcHRwX3NldF90c19jb25maWcgLSBjb250cm9sIGhhcmR3YXJlIHRpbWUgc3RhbXBpbmcKLSAqIEBuZXRkZXY6Ci0gKiBAaWZyZXE6CisgKiBpZ2JfcHRwX3NldF90aW1lc3RhbXBfbW9kZSAtIHNldHVwIGhhcmR3YXJlIGZvciB0aW1lc3RhbXBpbmcKKyAqIEBhZGFwdGVyOiBuZXR3b3JraW5nIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjb25maWc6IGh3dHN0YW1wIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBPdXRnb2luZyB0aW1lIHN0YW1waW5nIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZC4gUGxheSBuaWNlIGFuZAogICogZGlzYWJsZSBpdCB3aGVuIHJlcXVlc3RlZCwgYWx0aG91Z2ggaXQgc2hvdWxkbid0IGNhc2UgYW55IG92ZXJoZWFkCkBAIC01NzUsMTIgKzU3NiwxMSBAQAogICogdHlwZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiBNYXRjaGluZyB0aGUga2luZCBvZiBldmVudCBwYWNrZXQgaXMKICAqIG5vdCBzdXBwb3J0ZWQsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiAiYWxsIFYyIGV2ZW50cyByZWdhcmRsZXNzIG9mCiAgKiBsZXZlbCAyIG9yIDQiLgotICoqLwotaW50IGlnYl9wdHBfc2V0X3RzX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKKyAqLworc3RhdGljIGludCBpZ2JfcHRwX3NldF90aW1lc3RhbXBfbW9kZShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICAgc3RydWN0IGh3dHN0YW1wX2NvbmZpZyAqY29uZmlnKQogewotCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnICpjb25maWcgPSAmYWRhcHRlci0+dHN0YW1wX2NvbmZpZzsKIAl1MzIgdHN5bmNfdHhfY3RsID0gRTEwMDBfVFNZTkNUWENUTF9FTkFCTEVEOwogCXUzMiB0c3luY19yeF9jdGwgPSBFMTAwMF9UU1lOQ1JYQ1RMX0VOQUJMRUQ7CiAJdTMyIHRzeW5jX3J4X2NmZyA9IDA7CkBAIC01ODgsOSArNTg4LDYgQEAKIAlib29sIGlzX2wyID0gZmFsc2U7CiAJdTMyIHJlZ3ZhbDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcihjb25maWcsIGlmci0+aWZyX2RhdGEsIHNpemVvZigqY29uZmlnKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCiAJaWYgKGNvbmZpZy0+ZmxhZ3MpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzI1LDcgKzcyMiwzMyBAQAogCXJlZ3ZhbCA9IHJkMzIoRTEwMDBfUlhTVE1QTCk7CiAJcmVndmFsID0gcmQzMihFMTAwMF9SWFNUTVBIKTsKIAotCXJldHVybiBjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgY29uZmlnLCBzaXplb2YoKmNvbmZpZykpID8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpZ2JfcHRwX3NldF90c19jb25maWcgLSBzZXQgaGFyZHdhcmUgdGltZSBzdGFtcGluZyBjb25maWcKKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKgorICoqLworaW50IGlnYl9wdHBfc2V0X3RzX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBod3RzdGFtcF9jb25maWcgY29uZmlnOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGlnYl9wdHBfc2V0X3RpbWVzdGFtcF9tb2RlKGFkYXB0ZXIsICZjb25maWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBzYXZlIHRoZXNlIHNldHRpbmdzIGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisJbWVtY3B5KCZhZGFwdGVyLT50c3RhbXBfY29uZmlnLCAmY29uZmlnLAorCSAgICAgICBzaXplb2YoYWRhcHRlci0+dHN0YW1wX2NvbmZpZykpOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkgPwogCQktRUZBVUxUIDogMDsKIH0KIApAQCAtNzQ1LDcgKzc2OCw3IEBACiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkanRpbWUgPSBpZ2JfcHRwX2FkanRpbWVfODI1NzY7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpZ2JfcHRwX2dldHRpbWVfODI1NzY7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWUgPSBpZ2JfcHRwX3NldHRpbWVfODI1NzY7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLmVuYWJsZSA9IGlnYl9wdHBfZW5hYmxlOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpZ2JfcHRwX2ZlYXR1cmVfZW5hYmxlOwogCQlhZGFwdGVyLT5jYy5yZWFkID0gaWdiX3B0cF9yZWFkXzgyNTc2OwogCQlhZGFwdGVyLT5jYy5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCk7CiAJCWFkYXB0ZXItPmNjLm11bHQgPSAxOwpAQCAtNzY1LDcgKzc4OCw3IEBACiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkanRpbWUgPSBpZ2JfcHRwX2FkanRpbWVfODI1NzY7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpZ2JfcHRwX2dldHRpbWVfODI1NzY7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWUgPSBpZ2JfcHRwX3NldHRpbWVfODI1NzY7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLmVuYWJsZSA9IGlnYl9wdHBfZW5hYmxlOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpZ2JfcHRwX2ZlYXR1cmVfZW5hYmxlOwogCQlhZGFwdGVyLT5jYy5yZWFkID0gaWdiX3B0cF9yZWFkXzgyNTgwOwogCQlhZGFwdGVyLT5jYy5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSyhJR0JfTkJJVFNfODI1ODApOwogCQlhZGFwdGVyLT5jYy5tdWx0ID0gMTsKQEAgLTc4NCw3ICs4MDcsNyBAQAogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGp0aW1lID0gaWdiX3B0cF9hZGp0aW1lX2kyMTA7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpZ2JfcHRwX2dldHRpbWVfaTIxMDsKIAkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZSA9IGlnYl9wdHBfc2V0dGltZV9pMjEwOwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpZ2JfcHRwX2VuYWJsZTsKKwkJYWRhcHRlci0+cHRwX2NhcHMuZW5hYmxlID0gaWdiX3B0cF9mZWF0dXJlX2VuYWJsZTsKIAkJLyogRW5hYmxlIHRoZSB0aW1lciBmdW5jdGlvbnMgYnkgY2xlYXJpbmcgYml0IDMxLiAqLwogCQl3cjMyKEUxMDAwX1RTQVVYQywgMHgwKTsKIAkJYnJlYWs7CkBAIC04MjAsNiArODQzLDkgQEAKIAkJd3IzMihFMTAwMF9JTVMsIEUxMDAwX0lNU19UUyk7CiAJfQogCisJYWRhcHRlci0+dHN0YW1wX2NvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfTk9ORTsKKwlhZGFwdGVyLT50c3RhbXBfY29uZmlnLnR4X3R5cGUgPSBIV1RTVEFNUF9UWF9PRkY7CisKIAlhZGFwdGVyLT5wdHBfY2xvY2sgPSBwdHBfY2xvY2tfcmVnaXN0ZXIoJmFkYXB0ZXItPnB0cF9jYXBzLAogCQkJCQkJJmFkYXB0ZXItPnBkZXYtPmRldik7CiAJaWYgKElTX0VSUihhZGFwdGVyLT5wdHBfY2xvY2spKSB7CkBAIC04ODQsNyArOTEwLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogcmVzZXQgdGhlIHRzdGFtcF9jb25maWcgKi8KLQltZW1zZXQoJmFkYXB0ZXItPnRzdGFtcF9jb25maWcsIDAsIHNpemVvZihhZGFwdGVyLT50c3RhbXBfY29uZmlnKSk7CisJaWdiX3B0cF9zZXRfdGltZXN0YW1wX21vZGUoYWRhcHRlciwgJmFkYXB0ZXItPnRzdGFtcF9jb25maWcpOwogCiAJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewogCWNhc2UgZTEwMDBfODI1NzY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9ldGh0b29sLmMKaW5kZXggOTBlZWYwNy4uMjE3OGY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2V0aHRvb2wuYwpAQCAtMTAxLDggKzEwMSw4IEBACiAJCWVsc2UKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CkBAIC0xMTksNyArMTE5LDYgQEAKIHN0YXRpYyB2b2lkIGlnYnZmX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgaWdidmZfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKQEAgLTQ3Niw1ICs0NzUsNSBAQAogCiB2b2lkIGlnYnZmX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpZ2J2Zl9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZpZ2J2Zl9ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2IvaXhnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfZXRodG9vbC5jCmluZGV4IGRiYjdkZDIuLmIzMTFlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2IvaXhnYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYi9peGdiX2V0aHRvb2wuYwpAQCAtMTA3LDggKzEwNyw4IEBACiAJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDAwMCk7CiAJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CkBAIC02NTYsNSArNjU2LDUgQEAKIAogdm9pZCBpeGdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpeGdiX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJml4Z2JfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAppbmRleCBjNmM0Y2E3Li5hYzlmMjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKQEAgLTE1NSw3ICsxNTUsNiBAQAogc3RydWN0IHZmX21hY3ZsYW5zIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGw7CiAJaW50IHZmOwotCWludCByYXJfZW50cnk7CiAJYm9vbCBmcmVlOwogCWJvb2wgaXNfbWFjdmxhbjsKIAl1OCB2Zl9tYWN2bGFuW0VUSF9BTEVOXTsKQEAgLTM2Myw3ICszNjIsNyBAQAogCWZvciAocG9zID0gKGhlYWQpLnJpbmc7IHBvcyAhPSBOVUxMOyBwb3MgPSBwb3MtPm5leHQpCiAKICNkZWZpbmUgTUFYX1JYX1BBQ0tFVF9CVUZGRVJTICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDggOiAxKQorCQkJICAgICAgPyA4IDogMSkKICNkZWZpbmUgTUFYX1RYX1BBQ0tFVF9CVUZGRVJTIE1BWF9SWF9QQUNLRVRfQlVGRkVSUwogCiAvKiBNQVhfUV9WRUNUT1JTIG9mIHRoZXNlIGFyZSBhbGxvY2F0ZWQsCkBAIC02MTMsNiArNjEyLDE1IEBACiAjZGVmaW5lIE1BWF9NU0lYX1ZFQ1RPUlNfODI1OTggMTgKICNkZWZpbmUgTUFYX1FfVkVDVE9SU184MjU5OCAxNgogCitzdHJ1Y3QgaXhnYmVfbWFjX2FkZHIgeworCXU4IGFkZHJbRVRIX0FMRU5dOworCXUxNiBxdWV1ZTsKKwl1MTYgc3RhdGU7IC8qIGJpdG1hc2sgKi8KK307CisjZGVmaW5lIElYR0JFX01BQ19TVEFURV9ERUZBVUxUCQkweDEKKyNkZWZpbmUgSVhHQkVfTUFDX1NUQVRFX01PRElGSUVECTB4MgorI2RlZmluZSBJWEdCRV9NQUNfU1RBVEVfSU5fVVNFCQkweDQKKwogI2RlZmluZSBNQVhfUV9WRUNUT1JTIE1BWF9RX1ZFQ1RPUlNfODI1OTkKICNkZWZpbmUgTUFYX01TSVhfQ09VTlQgTUFYX01TSVhfVkVDVE9SU184MjU5OQogCkBAIC03ODUsNiArNzkzLDcgQEAKIAogCXUzMiB0aW1lcl9ldmVudF9hY2N1bXVsYXRvcjsKIAl1MzIgdmZlcnJfcmVmY291bnQ7CisJc3RydWN0IGl4Z2JlX21hY19hZGRyICptYWNfdGFibGU7CiAJc3RydWN0IGtvYmplY3QgKmluZm9fa29iajsKICNpZmRlZiBDT05GSUdfSVhHQkVfSFdNT04KIAlzdHJ1Y3QgaHdtb25fYnVmZiAqaXhnYmVfaHdtb25fYnVmZjsKQEAgLTg2Myw2ICs4NzIsMTMgQEAKIGludCBpeGdiZV9pbml0X2ludGVycnVwdF9zY2hlbWUoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGl4Z2JlX3dvbF9zdXBwb3J0ZWQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBkZXZpY2VfaWQsCiAJCQkgICAgICAgdTE2IHN1YmRldmljZV9pZCk7CisjaWZkZWYgQ09ORklHX1BDSV9JT1YKK3ZvaWQgaXhnYmVfZnVsbF9zeW5jX21hY190YWJsZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CisjZW5kaWYKK2ludCBpeGdiZV9hZGRfbWFjX2ZpbHRlcihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCSB1OCAqYWRkciwgdTE2IHF1ZXVlKTsKK2ludCBpeGdiZV9kZWxfbWFjX2ZpbHRlcihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCSB1OCAqYWRkciwgdTE2IHF1ZXVlKTsKIHZvaWQgaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBuZXRkZXZfdHhfdCBpeGdiZV94bWl0X2ZyYW1lX3Jpbmcoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKiwKIAkJCQkgIHN0cnVjdCBpeGdiZV9yaW5nICopOwpAQCAtOTQxLDYgKzk1Nyw3IEBACiB9CiAKIHZvaWQgaXhnYmVfcHRwX2luaXQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBpeGdiZV9wdHBfc3VzcGVuZChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGl4Z2JlX3B0cF9zdG9wKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgaXhnYmVfcHRwX292ZXJmbG93X2NoZWNrKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgaXhnYmVfcHRwX3J4X2hhbmcoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk4LmMKaW5kZXggNGM3OGVhOC4uMTU2MDkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OC5jCkBAIC00MSwxMCArNDEsMTAgQEAKICNkZWZpbmUgSVhHQkVfODI1OThfUlhfUEJfU0laRQkgNTEyCiAKIHN0YXRpYyBzMzIgaXhnYmVfc2V0dXBfY29wcGVyX2xpbmtfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOworCQkJCQkgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKKwkJCQkJIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKIHN0YXRpYyBzMzIgaXhnYmVfcmVhZF9pMmNfZWVwcm9tXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IGJ5dGVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmVlcHJvbV9kYXRhKTsKKwkJCQkgICAgICAgdTggKmVlcHJvbV9kYXRhKTsKIAogLyoqCiAgKiAgaXhnYmVfc2V0X3BjaWVfY29tcGxldGlvbl90aW1lb3V0IC0gc2V0IHBjaS1lIGNvbXBsZXRpb24gdGltZW91dApAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXBoeS0+b3BzLnNldHVwX2xpbmsgPSAmaXhnYmVfc2V0dXBfcGh5X2xpbmtfdG54OwogCQlwaHktPm9wcy5jaGVja19saW5rID0gJml4Z2JlX2NoZWNrX3BoeV9saW5rX3RueDsKIAkJcGh5LT5vcHMuZ2V0X2Zpcm13YXJlX3ZlcnNpb24gPQotCQkgICAgICAgICAgICAgJml4Z2JlX2dldF9waHlfZmlybXdhcmVfdmVyc2lvbl90bng7CisJCQkgICAgICZpeGdiZV9nZXRfcGh5X2Zpcm13YXJlX3ZlcnNpb25fdG54OwogCQlicmVhazsKIAljYXNlIGl4Z2JlX3BoeV9ubDoKIAkJcGh5LT5vcHMucmVzZXQgPSAmaXhnYmVfcmVzZXRfcGh5X25sOwpAQCAtMTU2LDggKzE1Niw4IEBACiAKIAkJLyogQ2hlY2sgdG8gc2VlIGlmIFNGUCsgbW9kdWxlIGlzIHN1cHBvcnRlZCAqLwogCQlyZXRfdmFsID0gaXhnYmVfZ2V0X3NmcF9pbml0X3NlcXVlbmNlX29mZnNldHMoaHcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpc3Rfb2Zmc2V0LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX29mZnNldCk7CisJCQkJCQkJICAgICZsaXN0X29mZnNldCwKKwkJCQkJCQkgICAgJmRhdGFfb2Zmc2V0KTsKIAkJaWYgKHJldF92YWwgIT0gMCkgewogCQkJcmV0X3ZhbCA9IElYR0JFX0VSUl9TRlBfTk9UX1NVUFBPUlRFRDsKIAkJCWdvdG8gb3V0OwpAQCAtMjE5LDggKzIxOSw4IEBACiAgKiAgRGV0ZXJtaW5lcyB0aGUgbGluayBjYXBhYmlsaXRpZXMgYnkgcmVhZGluZyB0aGUgQVVUT0MgcmVnaXN0ZXIuCiAgKiovCiBzdGF0aWMgczMyIGl4Z2JlX2dldF9saW5rX2NhcGFiaWxpdGllc184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICphdXRvbmVnKQorCQkJCQkgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAorCQkJCQkgICAgIGJvb2wgKmF1dG9uZWcpCiB7CiAJczMyIHN0YXR1cyA9IDA7CiAJdTMyIGF1dG9jID0gMDsKQEAgLTMzNywxOSArMzM3LDI1IEBACiAJaW50IGk7CiAJYm9vbCBsaW5rX3VwOwogCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgd2F0ZXIgbWFyayBjb25maWd1cmF0aW9uIGZvciBwYWNrZXQgYnVmZmVyIDAuICBaZXJvCi0JICogd2F0ZXIgbWFya3MgaW5kaWNhdGUgdGhhdCB0aGUgcGFja2V0IGJ1ZmZlciB3YXMgbm90IGNvbmZpZ3VyZWQKLQkgKiBhbmQgdGhlIHdhdGVybWFya3MgZm9yIHBhY2tldCBidWZmZXIgMCBzaG91bGQgYWx3YXlzIGJlIGNvbmZpZ3VyZWQuCi0JICovCi0JaWYgKCFody0+ZmMubG93X3dhdGVyIHx8Ci0JICAgICFody0+ZmMuaGlnaF93YXRlclswXSB8fAotCSAgICAhaHctPmZjLnBhdXNlX3RpbWUpIHsKLQkJaHdfZGJnKGh3LCAiSW52YWxpZCB3YXRlciBtYXJrIGNvbmZpZ3VyYXRpb25cbiIpOworCS8qIFZhbGlkYXRlIHRoZSB3YXRlciBtYXJrIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoIWh3LT5mYy5wYXVzZV90aW1lKSB7CiAJCXJldF92YWwgPSBJWEdCRV9FUlJfSU5WQUxJRF9MSU5LX1NFVFRJTkdTOwogCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBMb3cgd2F0ZXIgbWFyayBvZiB6ZXJvIGNhdXNlcyBYT0ZGIGZsb29kcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFJBRkZJQ19DTEFTUzsgaSsrKSB7CisJCWlmICgoaHctPmZjLmN1cnJlbnRfbW9kZSAmIGl4Z2JlX2ZjX3R4X3BhdXNlKSAmJgorCQkgICAgaHctPmZjLmhpZ2hfd2F0ZXJbaV0pIHsKKwkJCWlmICghaHctPmZjLmxvd193YXRlcltpXSB8fAorCQkJICAgIGh3LT5mYy5sb3dfd2F0ZXJbaV0gPj0gaHctPmZjLmhpZ2hfd2F0ZXJbaV0pIHsKKwkJCQlod19kYmcoaHcsICJJbnZhbGlkIHdhdGVyIG1hcmsgY29uZmlndXJhdGlvblxuIik7CisJCQkJcmV0X3ZhbCA9IElYR0JFX0VSUl9JTlZBTElEX0xJTktfU0VUVElOR1M7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKIAkvKgogCSAqIE9uIDgyNTk4IGhhdmluZyBSeCBGQyBvbiBjYXVzZXMgcmVzZXRzIHdoaWxlIGRvaW5nIDFHCiAJICogc28gaWYgaXQncyBvbiB0dXJuIGl0IG9mZiBvbmNlIHdlIGtub3cgbGlua19zcGVlZC4gRm9yCkBAIC00MzIsMTIgKzQzOCwxMSBAQAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNUUkwsIGZjdHJsX3JlZyk7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9STUNTLCBybWNzX3JlZyk7CiAKLQlmY3J0bCA9IChody0+ZmMubG93X3dhdGVyIDw8IDEwKSB8IElYR0JFX0ZDUlRMX1hPTkU7Ci0KIAkvKiBTZXQgdXAgYW5kIGVuYWJsZSBSeCBoaWdoL2xvdyB3YXRlciBtYXJrIHRocmVzaG9sZHMsIGVuYWJsZSBYT04uICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKIAkJaWYgKChody0+ZmMuY3VycmVudF9tb2RlICYgaXhnYmVfZmNfdHhfcGF1c2UpICYmCiAJCSAgICBody0+ZmMuaGlnaF93YXRlcltpXSkgeworCQkJZmNydGwgPSAoaHctPmZjLmxvd193YXRlcltpXSA8PCAxMCkgfCBJWEdCRV9GQ1JUTF9YT05FOwogCQkJZmNydGggPSAoaHctPmZjLmhpZ2hfd2F0ZXJbaV0gPDwgMTApIHwgSVhHQkVfRkNSVEhfRkNFTjsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNSVEwoaSksIGZjcnRsKTsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNSVEgoaSksIGZjcnRoKTsKQEAgLTQ2OCw3ICs0NzMsNyBAQAogICogIFJlc3RhcnRzIHRoZSBsaW5rLiAgUGVyZm9ybXMgYXV0b25lZ290aWF0aW9uIGlmIG5lZWRlZC4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfc3RhcnRfbWFjX2xpbmtfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCisJCQkJICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJdTMyIGF1dG9jX3JlZzsKIAl1MzIgbGlua3NfcmVnOwpAQCAtNTUwLDggKzU1NSw4IEBACiAgKiAgUmVhZHMgdGhlIGxpbmtzIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiBsaW5rIGlzIHVwIGFuZCB0aGUgY3VycmVudCBzcGVlZAogICoqLwogc3RhdGljIHMzMiBpeGdiZV9jaGVja19tYWNfbGlua184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9saW5rX3NwZWVkICpzcGVlZCwgYm9vbCAqbGlua191cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5rX3VwX3dhaXRfdG9fY29tcGxldGUpCisJCQkJICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsIGJvb2wgKmxpbmtfdXAsCisJCQkJICAgICAgYm9vbCBsaW5rX3VwX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJdTMyIGxpbmtzX3JlZzsKIAl1MzIgaTsKQEAgLTU2Nyw3ICs1NzIsNyBAQAogCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgMHhDNzlGLCBNRElPX01NRF9QTUFQTUQsICZsaW5rX3JlZyk7CiAJCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCAweEM3OUYsIE1ESU9fTU1EX1BNQVBNRCwgJmxpbmtfcmVnKTsKIAkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIDB4QzAwQywgTURJT19NTURfUE1BUE1ELAotCQkgICAgICAgICAgICAgICAgICAgICAmYWRhcHRfY29tcF9yZWcpOworCQkJCSAgICAgJmFkYXB0X2NvbXBfcmVnKTsKIAkJaWYgKGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZSkgewogCQkJZm9yIChpID0gMDsgaSA8IElYR0JFX0xJTktfVVBfVElNRTsgaSsrKSB7CiAJCQkJaWYgKChsaW5rX3JlZyAmIDEpICYmCkBAIC01NzksMTEgKzU4NCwxMSBAQAogCQkJCX0KIAkJCQltc2xlZXAoMTAwKTsKIAkJCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgMHhDNzlGLAotCQkJCSAgICAgICAgICAgICAgICAgICAgIE1ESU9fTU1EX1BNQVBNRCwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAmbGlua19yZWcpOworCQkJCQkJICAgICBNRElPX01NRF9QTUFQTUQsCisJCQkJCQkgICAgICZsaW5rX3JlZyk7CiAJCQkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIDB4QzAwQywKLQkJCQkgICAgICAgICAgICAgICAgICAgICBNRElPX01NRF9QTUFQTUQsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgJmFkYXB0X2NvbXBfcmVnKTsKKwkJCQkJCSAgICAgTURJT19NTURfUE1BUE1ELAorCQkJCQkJICAgICAmYWRhcHRfY29tcF9yZWcpOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKChsaW5rX3JlZyAmIDEpICYmICgoYWRhcHRfY29tcF9yZWcgJiAxKSA9PSAwKSkKQEAgLTY1Niw3ICs2NjEsNyBAQAogCiAJLyogU2V0IEtYNC9LWCBzdXBwb3J0IGFjY29yZGluZyB0byBzcGVlZCByZXF1ZXN0ZWQgKi8KIAllbHNlIGlmIChsaW5rX21vZGUgPT0gSVhHQkVfQVVUT0NfTE1TX0tYNF9BTiB8fAotCSAgICAgICAgIGxpbmtfbW9kZSA9PSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOXzFHX0FOKSB7CisJCSBsaW5rX21vZGUgPT0gSVhHQkVfQVVUT0NfTE1TX0tYNF9BTl8xR19BTikgewogCQlhdXRvYyAmPSB+SVhHQkVfQVVUT0NfS1g0X0tYX1NVUFBfTUFTSzsKIAkJaWYgKHNwZWVkICYgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwpCiAJCQlhdXRvYyB8PSBJWEdCRV9BVVRPQ19LWDRfU1VQUDsKQEAgLTY4OSwxNCArNjk0LDE0IEBACiAgKiAgU2V0cyB0aGUgbGluayBzcGVlZCBpbiB0aGUgQVVUT0MgcmVnaXN0ZXIgaW4gdGhlIE1BQyBhbmQgcmVzdGFydHMgbGluay4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfc2V0dXBfY29wcGVyX2xpbmtfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCisJCQkJCSAgICAgICBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLAorCQkJCQkgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJczMyIHN0YXR1czsKIAogCS8qIFNldHVwIHRoZSBQSFkgYWNjb3JkaW5nIHRvIGlucHV0IHNwZWVkICovCiAJc3RhdHVzID0gaHctPnBoeS5vcHMuc2V0dXBfbGlua19zcGVlZChodywgc3BlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOworCQkJCQkgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOwogCS8qIFNldCB1cCBNQUMgKi8KIAlpeGdiZV9zdGFydF9tYWNfbGlua184MjU5OChodywgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKIApAQCAtNzM1LDI4ICs3NDAsMjggQEAKIAlpZiAoYW5hbG9nX3ZhbCAmIElYR0JFX0FUTEFTX1BETl9UWF9SRUdfRU4pIHsKIAkJLyogRW5hYmxlIFR4IEF0bGFzIHNvIHBhY2tldHMgY2FuIGJlIHRyYW5zbWl0dGVkIGFnYWluICovCiAJCWh3LT5tYWMub3BzLnJlYWRfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl9MUEJLLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmFsb2dfdmFsKTsKKwkJCQkJICAgICAmYW5hbG9nX3ZhbCk7CiAJCWFuYWxvZ192YWwgJj0gfklYR0JFX0FUTEFTX1BETl9UWF9SRUdfRU47CiAJCWh3LT5tYWMub3BzLndyaXRlX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fTFBCSywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbG9nX3ZhbCk7CisJCQkJCSAgICAgIGFuYWxvZ192YWwpOwogCiAJCWh3LT5tYWMub3BzLnJlYWRfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl8xMEcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWxvZ192YWwpOworCQkJCQkgICAgICZhbmFsb2dfdmFsKTsKIAkJYW5hbG9nX3ZhbCAmPSB+SVhHQkVfQVRMQVNfUEROX1RYXzEwR19RTF9BTEw7CiAJCWh3LT5tYWMub3BzLndyaXRlX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fMTBHLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFsb2dfdmFsKTsKKwkJCQkJICAgICAgYW5hbG9nX3ZhbCk7CiAKIAkJaHctPm1hYy5vcHMucmVhZF9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROXzFHLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmFsb2dfdmFsKTsKKwkJCQkJICAgICAmYW5hbG9nX3ZhbCk7CiAJCWFuYWxvZ192YWwgJj0gfklYR0JFX0FUTEFTX1BETl9UWF8xR19RTF9BTEw7CiAJCWh3LT5tYWMub3BzLndyaXRlX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fMUcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWxvZ192YWwpOworCQkJCQkgICAgICBhbmFsb2dfdmFsKTsKIAogCQlody0+bWFjLm9wcy5yZWFkX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fQU4sCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWxvZ192YWwpOworCQkJCQkgICAgICZhbmFsb2dfdmFsKTsKIAkJYW5hbG9nX3ZhbCAmPSB+SVhHQkVfQVRMQVNfUEROX1RYX0FOX1FMX0FMTDsKIAkJaHctPm1hYy5vcHMud3JpdGVfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl9BTiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbG9nX3ZhbCk7CisJCQkJCSAgICAgIGFuYWxvZ192YWwpOwogCX0KIAogCS8qIFJlc2V0IFBIWSAqLwpAQCAtOTU1LDcgKzk2MCw3IEBACiAJZm9yICh2bGFuYnl0ZSA9IDA7IHZsYW5ieXRlIDwgNDsgdmxhbmJ5dGUrKykKIAkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBody0+bWFjLnZmdF9zaXplOyBvZmZzZXQrKykKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkZUQVZJTkQodmxhbmJ5dGUsIG9mZnNldCksCi0JCQkgICAgICAgICAgICAgICAgMCk7CisJCQkJCTApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NzMsNyArOTc4LDcgQEAKIAl1MzIgIGF0bGFzX2N0bDsKIAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfQVRMQVNDVEwsCi0JICAgICAgICAgICAgICAgIElYR0JFX0FUTEFTQ1RMX1dSSVRFX0NNRCB8IChyZWcgPDwgOCkpOworCQkJSVhHQkVfQVRMQVNDVExfV1JJVEVfQ01EIHwgKHJlZyA8PCA4KSk7CiAJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCXVkZWxheSgxMCk7CiAJYXRsYXNfY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0FUTEFTQ1RMKTsKQEAgLTEyNzMsOCArMTI3OCw2IEBACiAJLyogU2V0dXAgVHggcGFja2V0IGJ1ZmZlciBzaXplcyAqLwogCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9NQVhfUEFDS0VUX0JVRkZFUlM7IGkrKykKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCU0laRShpKSwgSVhHQkVfVFhQQlNJWkVfNDBLQik7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc184MjU5OCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OS5jCmluZGV4IGYzMmIzZGQuLmJjN2M5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTkuYwpAQCAtNDgsMTcgKzQ4LDE3IEBACiAJCQkJCQkgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKIAkJCQkJCSBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiBzdGF0aWMgczMyIGl4Z2JlX3NldHVwX21hY19saW5rX3NtYXJ0c3BlZWQoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKKwkJCQkJICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKKwkJCQkJICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOwogc3RhdGljIHZvaWQgaXhnYmVfc3RvcF9tYWNfbGlua19vbl9kM184MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHN0YXRpYyBzMzIgaXhnYmVfc3RhcnRfbWFjX2xpbmtfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywKIAkJCQkgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiBzdGF0aWMgczMyIGl4Z2JlX3NldHVwX21hY19saW5rXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CisJCQkgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKKwkJCSAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiBzdGF0aWMgczMyIGl4Z2JlX3NldHVwX2NvcHBlcl9saW5rXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKKwkJCQkJIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCisJCQkJCSBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiBzdGF0aWMgczMyIGl4Z2JlX3ZlcmlmeV9md192ZXJzaW9uXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcpOwogc3RhdGljIHMzMiBpeGdiZV9yZWFkX2kyY19ieXRlXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IGJ5dGVfb2Zmc2V0LAogCQkJCSAgICAgdTggZGV2X2FkZHIsIHU4ICpkYXRhKTsKQEAgLTk2LDkgKzk2LDkgQEAKIAlpZiAoKG1hYy0+b3BzLmdldF9tZWRpYV90eXBlKGh3KSA9PSBpeGdiZV9tZWRpYV90eXBlX2ZpYmVyKSAmJgogCSAgICAhaXhnYmVfbW5nX2VuYWJsZWQoaHcpKSB7CiAJCW1hYy0+b3BzLmRpc2FibGVfdHhfbGFzZXIgPQotCQkgICAgICAgICAgICAgICAgICAgICAgICZpeGdiZV9kaXNhYmxlX3R4X2xhc2VyX211bHRpc3BlZWRfZmliZXI7CisJCQkJICAgICAgICZpeGdiZV9kaXNhYmxlX3R4X2xhc2VyX211bHRpc3BlZWRfZmliZXI7CiAJCW1hYy0+b3BzLmVuYWJsZV90eF9sYXNlciA9Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICZpeGdiZV9lbmFibGVfdHhfbGFzZXJfbXVsdGlzcGVlZF9maWJlcjsKKwkJCQkJJml4Z2JlX2VuYWJsZV90eF9sYXNlcl9tdWx0aXNwZWVkX2ZpYmVyOwogCQltYWMtPm9wcy5mbGFwX3R4X2xhc2VyID0gJml4Z2JlX2ZsYXBfdHhfbGFzZXJfbXVsdGlzcGVlZF9maWJlcjsKIAl9IGVsc2UgewogCQltYWMtPm9wcy5kaXNhYmxlX3R4X2xhc2VyID0gTlVMTDsKQEAgLTEzMiwxMyArMTMyLDEzIEBACiAJCWh3LT5waHkub3BzLnJlc2V0ID0gTlVMTDsKIAogCQlyZXRfdmFsID0gaXhnYmVfZ2V0X3NmcF9pbml0X3NlcXVlbmNlX29mZnNldHMoaHcsICZsaXN0X29mZnNldCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX29mZnNldCk7CisJCQkJCQkJICAgICAgJmRhdGFfb2Zmc2V0KTsKIAkJaWYgKHJldF92YWwgIT0gMCkKIAkJCWdvdG8gc2V0dXBfc2ZwX291dDsKIAogCQkvKiBQSFkgY29uZmlnIHdpbGwgZmluaXNoIGJlZm9yZSByZWxlYXNpbmcgdGhlIHNlbWFwaG9yZSAqLwogCQlyZXRfdmFsID0gaHctPm1hYy5vcHMuYWNxdWlyZV9zd2Z3X3N5bmMoaHcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9HU1NSX01BQ19DU1JfU00pOworCQkJCQkJCUlYR0JFX0dTU1JfTUFDX0NTUl9TTSk7CiAJCWlmIChyZXRfdmFsICE9IDApIHsKIAkJCXJldF92YWwgPSBJWEdCRV9FUlJfU1dGV19TWU5DOwogCQkJZ290byBzZXR1cF9zZnBfb3V0OwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJCXBoeS0+b3BzLmNoZWNrX2xpbmsgPSAmaXhnYmVfY2hlY2tfcGh5X2xpbmtfdG54OwogCQlwaHktPm9wcy5zZXR1cF9saW5rID0gJml4Z2JlX3NldHVwX3BoeV9saW5rX3RueDsKIAkJcGh5LT5vcHMuZ2V0X2Zpcm13YXJlX3ZlcnNpb24gPQotCQkgICAgICAgICAgICAgJml4Z2JlX2dldF9waHlfZmlybXdhcmVfdmVyc2lvbl90bng7CisJCQkgICAgICZpeGdiZV9nZXRfcGh5X2Zpcm13YXJlX3ZlcnNpb25fdG54OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTM1Miw3ICszNTIsNyBAQAogICogIERldGVybWluZXMgdGhlIGxpbmsgY2FwYWJpbGl0aWVzIGJ5IHJlYWRpbmcgdGhlIEFVVE9DIHJlZ2lzdGVyLgogICoqLwogc3RhdGljIHMzMiBpeGdiZV9nZXRfbGlua19jYXBhYmlsaXRpZXNfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAorCQkJCQkgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAogCQkJCQkgICAgIGJvb2wgKmF1dG9uZWcpCiB7CiAJczMyIHN0YXR1cyA9IDA7CkBAIC01NDMsNyArNTQzLDcgQEAKICAqICBSZXN0YXJ0cyB0aGUgbGluay4gIFBlcmZvcm1zIGF1dG9uZWdvdGlhdGlvbiBpZiBuZWVkZWQuCiAgKiovCiBzdGF0aWMgczMyIGl4Z2JlX3N0YXJ0X21hY19saW5rXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCisJCQkgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJdTMyIGF1dG9jX3JlZzsKIAl1MzIgbGlua3NfcmVnOwpAQCAtNjcyLDggKzY3Miw4IEBACiAgKiAgU2V0IHRoZSBsaW5rIHNwZWVkIGluIHRoZSBBVVRPQyByZWdpc3RlciBhbmQgcmVzdGFydHMgbGluay4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfc2V0dXBfbWFjX2xpbmtfbXVsdGlzcGVlZF9maWJlcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKQorCQkJCQkgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCisJCQkJCSAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJczMyIHN0YXR1cyA9IDA7CiAJaXhnYmVfbGlua19zcGVlZCBsaW5rX3NwZWVkID0gSVhHQkVfTElOS19TUEVFRF9VTktOT1dOOwpAQCAtODIwLDggKzgyMCw4IEBACiAJICovCiAJaWYgKHNwZWVkY250ID4gMSkKIAkJc3RhdHVzID0gaXhnYmVfc2V0dXBfbWFjX2xpbmtfbXVsdGlzcGVlZF9maWJlcihodywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0X2xpbmtfc3BlZWQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKKwkJCQkJCQkgICAgICAgaGlnaGVzdF9saW5rX3NwZWVkLAorCQkJCQkJCSAgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOwogCiBvdXQ6CiAJLyogU2V0IGF1dG9uZWdfYWR2ZXJ0aXNlZCB2YWx1ZSBiYXNlZCBvbiBpbnB1dCBsaW5rIHNwZWVkICovCkBAIC0xMDA5LDggKzEwMDksOCBAQAogCQlpZiAoc3BlZWQgJiBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKQogCQkJYXV0b2MgfD0gSVhHQkVfQVVUT0NfS1hfU1VQUDsKIAl9IGVsc2UgaWYgKChwbWFfcG1kXzFnID09IElYR0JFX0FVVE9DXzFHX1NGSSkgJiYKLQkgICAgICAgICAgIChsaW5rX21vZGUgPT0gSVhHQkVfQVVUT0NfTE1TXzFHX0xJTktfTk9fQU4gfHwKLQkgICAgICAgICAgICBsaW5rX21vZGUgPT0gSVhHQkVfQVVUT0NfTE1TXzFHX0FOKSkgeworCQkgICAobGlua19tb2RlID09IElYR0JFX0FVVE9DX0xNU18xR19MSU5LX05PX0FOIHx8CisJCSAgICBsaW5rX21vZGUgPT0gSVhHQkVfQVVUT0NfTE1TXzFHX0FOKSkgewogCQkvKiBTd2l0Y2ggZnJvbSAxRyBTRkkgdG8gMTBHIFNGSSBpZiByZXF1ZXN0ZWQgKi8KIAkJaWYgKChzcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCkgJiYKIAkJICAgIChwbWFfcG1kXzEwZ19zZXJpYWwgPT0gSVhHQkVfQVVUT0MyXzEwR19TRkkpKSB7CkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCQkJYXV0b2MgfD0gSVhHQkVfQVVUT0NfTE1TXzEwR19TRVJJQUw7CiAJCX0KIAl9IGVsc2UgaWYgKChwbWFfcG1kXzEwZ19zZXJpYWwgPT0gSVhHQkVfQVVUT0MyXzEwR19TRkkpICYmCi0JICAgICAgICAgICAobGlua19tb2RlID09IElYR0JFX0FVVE9DX0xNU18xMEdfU0VSSUFMKSkgeworCQkgICAobGlua19tb2RlID09IElYR0JFX0FVVE9DX0xNU18xMEdfU0VSSUFMKSkgewogCQkvKiBTd2l0Y2ggZnJvbSAxMEcgU0ZJIHRvIDFHIFNGSSBpZiByZXF1ZXN0ZWQgKi8KIAkJaWYgKChzcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKSAmJgogCQkgICAgKHBtYV9wbWRfMWcgPT0gSVhHQkVfQVVUT0NfMUdfU0ZJKSkgewpAQCAtMTA1MSw3ICsxMDUxLDcgQEAKIAkJCQl9CiAJCQkJaWYgKCEobGlua3NfcmVnICYgSVhHQkVfTElOS1NfS1hfQU5fQ09NUCkpIHsKIAkJCQkJc3RhdHVzID0KLQkJCQkJICAgICAgICBJWEdCRV9FUlJfQVVUT05FR19OT1RfQ09NUExFVEU7CisJCQkJCQlJWEdCRV9FUlJfQVVUT05FR19OT1RfQ09NUExFVEU7CiAJCQkJCWh3X2RiZyhodywgIkF1dG9uZWcgZGlkIG5vdCBjb21wbGV0ZS5cbiIpOwogCQkJCX0KIAkJCX0KQEAgLTEwNzQsMTQgKzEwNzQsMTQgQEAKICAqICBSZXN0YXJ0cyBsaW5rIG9uIFBIWSBhbmQgTUFDIGJhc2VkIG9uIHNldHRpbmdzIHBhc3NlZCBpbi4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfc2V0dXBfY29wcGVyX2xpbmtfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCisJCQkJCSBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLAorCQkJCQkgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJczMyIHN0YXR1czsKIAogCS8qIFNldHVwIHRoZSBQSFkgYWNjb3JkaW5nIHRvIGlucHV0IHNwZWVkICovCiAJc3RhdHVzID0gaHctPnBoeS5vcHMuc2V0dXBfbGlua19zcGVlZChodywgc3BlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOworCQkJCQkgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOwogCS8qIFNldCB1cCBNQUMgKi8KIAlpeGdiZV9zdGFydF9tYWNfbGlua184MjU5OShodywgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKIApAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAkJICAgIChody0+bWFjLm9yaWdfYXV0b2MyICYgSVhHQkVfQVVUT0MyX1VQUEVSX01BU0spKSB7CiAJCQlhdXRvYzIgJj0gfklYR0JFX0FVVE9DMl9VUFBFUl9NQVNLOwogCQkJYXV0b2MyIHw9IChody0+bWFjLm9yaWdfYXV0b2MyICYKLQkJCSAgICAgICAgICAgSVhHQkVfQVVUT0MyX1VQUEVSX01BU0spOworCQkJCSAgIElYR0JFX0FVVE9DMl9VUFBFUl9NQVNLKTsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfQVVUT0MyLCBhdXRvYzIpOwogCQl9CiAJfQpAQCAtMTI0Niw3ICsxMjQ2LDcgQEAKIAkvKiBBZGQgdGhlIFNBTiBNQUMgYWRkcmVzcyB0byB0aGUgUkFSIG9ubHkgaWYgaXQncyBhIHZhbGlkIGFkZHJlc3MgKi8KIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihody0+bWFjLnNhbl9hZGRyKSkgewogCQlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCBody0+bWFjLm51bV9yYXJfZW50cmllcyAtIDEsCi0JCSAgICAgICAgICAgICAgICAgICAgaHctPm1hYy5zYW5fYWRkciwgMCwgSVhHQkVfUkFIX0FWKTsKKwkJCQkgICAgaHctPm1hYy5zYW5fYWRkciwgMCwgSVhHQkVfUkFIX0FWKTsKIAogCQkvKiBTYXZlIHRoZSBTQU4gTUFDIFJBUiBpbmRleCAqLwogCQlody0+bWFjLnNhbl9tYWNfcmFyX2luZGV4ID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXMgLSAxOwpAQCAtMTI1Nyw3ICsxMjU3LDcgQEAKIAogCS8qIFN0b3JlIHRoZSBhbHRlcm5hdGl2ZSBXV05OL1dXUE4gcHJlZml4ICovCiAJaHctPm1hYy5vcHMuZ2V0X3d3bl9wcmVmaXgoaHcsICZody0+bWFjLnd3bm5fcHJlZml4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHctPm1hYy53d3BuX3ByZWZpeCk7CisJCQkJICAgICAgICZody0+bWFjLnd3cG5fcHJlZml4KTsKIAogcmVzZXRfaHdfb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC0xMjcxLDYgKzEyNzEsNyBAQAogewogCWludCBpOwogCXUzMiBmZGlyY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9GRElSQ1RSTCk7CisKIAlmZGlyY3RybCAmPSB+SVhHQkVfRkRJUkNUUkxfSU5JVF9ET05FOwogCiAJLyoKQEAgLTEyODQsOCArMTI4NSw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCWlmIChpID49IElYR0JFX0ZESVJDTURfQ01EX1BPTEwpIHsKLQkJaHdfZGJnKGh3LCAiRmxvdyBEaXJlY3RvciBwcmV2aW91cyBjb21tYW5kIGlzbid0IGNvbXBsZXRlLCAiCi0JCSAgICAgICAiYWJvcnRpbmcgdGFibGUgcmUtaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJaHdfZGJnKGh3LCAiRmxvdyBEaXJlY3RvciBwcmV2aW91cyBjb21tYW5kIGlzbid0IGNvbXBsZXRlLCBhYm9ydGluZyB0YWJsZSByZS1pbml0aWFsaXphdGlvbi5cbiIpOwogCQlyZXR1cm4gSVhHQkVfRVJSX0ZESVJfUkVJTklUX0ZBSUxFRDsKIAl9CiAKQEAgLTEyOTksMTIgKzEyOTksMTIgQEAKIAkgKiAtIHdyaXRlIDAgdG8gYml0IDggb2YgRkRJUkNNRCByZWdpc3RlcgogCSAqLwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkNNRCwKLQkgICAgICAgICAgICAgICAgKElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9GRElSQ01EKSB8Ci0JICAgICAgICAgICAgICAgICBJWEdCRV9GRElSQ01EX0NMRUFSSFQpKTsKKwkJCShJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkRJUkNNRCkgfAorCQkJIElYR0JFX0ZESVJDTURfQ0xFQVJIVCkpOwogCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZESVJDTUQsCi0JICAgICAgICAgICAgICAgIChJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkRJUkNNRCkgJgotCSAgICAgICAgICAgICAgICAgfklYR0JFX0ZESVJDTURfQ0xFQVJIVCkpOworCQkJKElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9GRElSQ01EKSAmCisJCQkgfklYR0JFX0ZESVJDTURfQ0xFQVJIVCkpOwogCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAkvKgogCSAqIENsZWFyIEZESVIgSGFzaCByZWdpc3RlciB0byBjbGVhciBhbnkgbGVmdG92ZXIgaGFzaGVzCkBAIC0xMzE5LDcgKzEzMTksNyBAQAogCS8qIFBvbGwgaW5pdC1kb25lIGFmdGVyIHdlIHdyaXRlIEZESVJDVFJMIHJlZ2lzdGVyICovCiAJZm9yIChpID0gMDsgaSA8IElYR0JFX0ZESVJfSU5JVF9ET05FX1BPTEw7IGkrKykgewogCQlpZiAoSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0ZESVJDVFJMKSAmCi0JCSAgICAgICAgICAgICAgICAgICBJWEdCRV9GRElSQ1RSTF9JTklUX0RPTkUpCisJCQkJICAgSVhHQkVfRkRJUkNUUkxfSU5JVF9ET05FKQogCQkJYnJlYWs7CiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAl9CkBAIC0xMzY4LDcgKzEzNjgsNyBAQAogCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfRkRJUl9JTklUX0RPTkVfUE9MTDsgaSsrKSB7CiAJCWlmIChJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkRJUkNUUkwpICYKLQkJICAgICAgICAgICAgICAgICAgIElYR0JFX0ZESVJDVFJMX0lOSVRfRE9ORSkKKwkJCQkgICBJWEdCRV9GRElSQ1RSTF9JTklUX0RPTkUpCiAJCQlicmVhazsKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCX0KQEAgLTE0NTMsNyArMTQ1Myw3IEBACiAJCWJ1Y2tldF9oYXNoIF49IGhpX2hhc2hfZHdvcmQgPj4gbjsgXAogCWVsc2UgaWYgKElYR0JFX0FUUl9TSUdOQVRVUkVfSEFTSF9LRVkgJiAoMHgwMSA8PCAobiArIDE2KSkpIFwKIAkJc2lnX2hhc2ggXj0gaGlfaGFzaF9kd29yZCA8PCAoMTYgLSBuKTsgXAotfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKQogCiAvKioKICAqICBpeGdiZV9hdHJfY29tcHV0ZV9zaWdfaGFzaF84MjU5OSAtIENvbXB1dGUgdGhlIHNpZ25hdHVyZSBoYXNoCkBAIC0xNTI5LDkgKzE1MjksOSBAQAogICogIEBxdWV1ZTogcXVldWUgaW5kZXggdG8gZGlyZWN0IHRyYWZmaWMgdG8KICAqKi8KIHMzMiBpeGdiZV9mZGlyX2FkZF9zaWduYXR1cmVfZmlsdGVyXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpeGdiZV9hdHJfaGFzaF9kd29yZCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl4Z2JlX2F0cl9oYXNoX2R3b3JkIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHF1ZXVlKQorCQkJCQkgIHVuaW9uIGl4Z2JlX2F0cl9oYXNoX2R3b3JkIGlucHV0LAorCQkJCQkgIHVuaW9uIGl4Z2JlX2F0cl9oYXNoX2R3b3JkIGNvbW1vbiwKKwkJCQkJICB1OCBxdWV1ZSkKIHsKIAl1NjQgIGZkaXJoYXNoY21kOwogCXUzMiAgZmRpcmNtZDsKQEAgLTE1NTUsNyArMTU1NSw3IEBACiAKIAkvKiBjb25maWd1cmUgRkRJUkNNRCByZWdpc3RlciAqLwogCWZkaXJjbWQgPSBJWEdCRV9GRElSQ01EX0NNRF9BRERfRkxPVyB8IElYR0JFX0ZESVJDTURfRklMVEVSX1VQREFURSB8Ci0JICAgICAgICAgIElYR0JFX0ZESVJDTURfTEFTVCB8IElYR0JFX0ZESVJDTURfUVVFVUVfRU47CisJCSAgSVhHQkVfRkRJUkNNRF9MQVNUIHwgSVhHQkVfRkRJUkNNRF9RVUVVRV9FTjsKIAlmZGlyY21kIHw9IGlucHV0LmZvcm1hdHRlZC5mbG93X3R5cGUgPDwgSVhHQkVfRkRJUkNNRF9GTE9XX1RZUEVfU0hJRlQ7CiAJZmRpcmNtZCB8PSAodTMyKXF1ZXVlIDw8IElYR0JFX0ZESVJDTURfUlhfUVVFVUVfU0hJRlQ7CiAKQEAgLTE1NzksNyArMTU3OSw3IEBACiAJCWJ1Y2tldF9oYXNoIF49IGxvX2hhc2hfZHdvcmQgPj4gbjsgXAogCWlmIChJWEdCRV9BVFJfQlVDS0VUX0hBU0hfS0VZICYgKDB4MDEgPDwgKG4gKyAxNikpKSBcCiAJCWJ1Y2tldF9oYXNoIF49IGhpX2hhc2hfZHdvcmQgPj4gbjsgXAotfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKQogCiAvKioKICAqICBpeGdiZV9hdHJfY29tcHV0ZV9wZXJmZWN0X2hhc2hfODI1OTkgLSBDb21wdXRlIHRoZSBwZXJmZWN0IGZpbHRlciBoYXNoCkBAIC0xNjUxLDYgKzE2NTEsNyBAQAogc3RhdGljIHUzMiBpeGdiZV9nZXRfZmRpcnRjcG1fODI1OTkodW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dF9tYXNrKQogewogCXUzMiBtYXNrID0gbnRvaHMoaW5wdXRfbWFzay0+Zm9ybWF0dGVkLmRzdF9wb3J0KTsKKwogCW1hc2sgPDw9IElYR0JFX0ZESVJUQ1BNX0RQT1JUTV9TSElGVDsKIAltYXNrIHw9IG50b2hzKGlucHV0X21hc2stPmZvcm1hdHRlZC5zcmNfcG9ydCk7CiAJbWFzayA9ICgobWFzayAmIDB4NTU1NTU1NTUpIDw8IDEpIHwgKChtYXNrICYgMHhBQUFBQUFBQSkgPj4gMSk7CkBAIC0xODg1LDcgKzE4ODYsNyBAQAogCXUzMiAgY29yZV9jdGw7CiAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0NPUkVDVEwsIElYR0JFX0NPUkVDVExfV1JJVEVfQ01EIHwKLQkgICAgICAgICAgICAgICAgKHJlZyA8PCA4KSk7CisJCQkocmVnIDw8IDgpKTsKIAlJWEdCRV9XUklURV9GTFVTSChodyk7CiAJdWRlbGF5KDEwKTsKIAljb3JlX2N0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9DT1JFQ1RMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggOTgxYjhhNy4uNGU1Mzg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyBzMzIgaXhnYmVfcmVhZHlfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogc3RhdGljIHZvaWQgaXhnYmVfc3RhbmRieV9lZXByb20oc3RydWN0IGl4Z2JlX2h3ICpodyk7CiBzdGF0aWMgdm9pZCBpeGdiZV9zaGlmdF9vdXRfZWVwcm9tX2JpdHMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTE2IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNvdW50KTsKKwkJCQkJdTE2IGNvdW50KTsKIHN0YXRpYyB1MTYgaXhnYmVfc2hpZnRfaW5fZWVwcm9tX2JpdHMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTE2IGNvdW50KTsKIHN0YXRpYyB2b2lkIGl4Z2JlX3JhaXNlX2VlcHJvbV9jbGsoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICplZWMpOwogc3RhdGljIHZvaWQgaXhnYmVfbG93ZXJfZWVwcm9tX2NsayhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKmVlYyk7CkBAIC0yNzEsNiArMjcxLDcgQEAKICAqKi8KIHMzMiBpeGdiZV9zdGFydF9od19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7CisJczMyIHJldF92YWw7CiAJdTMyIGN0cmxfZXh0OwogCiAJLyogU2V0IHRoZSBtZWRpYSB0eXBlICovCkBAIC0yOTIsMTIgKzI5MywxNSBAQAogCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAogCS8qIFNldHVwIGZsb3cgY29udHJvbCAqLwotCWl4Z2JlX3NldHVwX2ZjKGh3KTsKKwlyZXRfdmFsID0gaXhnYmVfc2V0dXBfZmMoaHcpOworCWlmICghcmV0X3ZhbCkKKwkJZ290byBvdXQ7CiAKIAkvKiBDbGVhciBhZGFwdGVyIHN0b3BwZWQgZmxhZyAqLwogCWh3LT5hZGFwdGVyX3N0b3BwZWQgPSBmYWxzZTsKIAotCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKQEAgLTQ4MSw3ICs0ODUsNyBAQAogICogIFJlYWRzIHRoZSBwYXJ0IG51bWJlciBzdHJpbmcgZnJvbSB0aGUgRUVQUk9NLgogICoqLwogczMyIGl4Z2JlX3JlYWRfcGJhX3N0cmluZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICpwYmFfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBwYmFfbnVtX3NpemUpCisJCQkJICB1MzIgcGJhX251bV9zaXplKQogewogCXMzMiByZXRfdmFsOwogCXUxNiBkYXRhOwpAQCAtODE0LDkgKzgxOCw4IEBACiAJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OwogCQllbHNlCiAJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDg7Ci0JCWh3X2RiZyhodywgIkVlcHJvbSBwYXJhbXM6IHR5cGUgPSAlZCwgc2l6ZSA9ICVkLCBhZGRyZXNzIGJpdHM6ICIKLQkJCSAgIiVkXG4iLCBlZXByb20tPnR5cGUsIGVlcHJvbS0+d29yZF9zaXplLAotCQkJICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisJCWh3X2RiZyhodywgIkVlcHJvbSBwYXJhbXM6IHR5cGUgPSAlZCwgc2l6ZSA9ICVkLCBhZGRyZXNzIGJpdHM6ICVkXG4iLAorCQkgICAgICAgZWVwcm9tLT50eXBlLCBlZXByb20tPndvcmRfc2l6ZSwgZWVwcm9tLT5hZGRyZXNzX2JpdHMpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTM4OCw4ICsxMzkxLDcgQEAKIAl9CiAKIAlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCWh3X2RiZyhodywgIkRyaXZlciBjYW4ndCBhY2Nlc3MgdGhlIEVlcHJvbSAtIFNNQkkgU2VtYXBob3JlICIKLQkJICAgICAgICJub3QgZ3JhbnRlZC5cbiIpOworCQlod19kYmcoaHcsICJEcml2ZXIgY2FuJ3QgYWNjZXNzIHRoZSBFZXByb20gLSBTTUJJIFNlbWFwaG9yZSBub3QgZ3JhbnRlZC5cbiIpOwogCQkvKgogCQkgKiB0aGlzIHJlbGVhc2UgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBiZWNhdXNlIG91ciBhdHRlbXB0cwogCQkgKiBhYm92ZSB0byBnZXQgdGhlIHNlbWFwaG9yZSBtYXkgaGF2ZSBzdWNjZWVkZWQsIGFuZCBpZiB0aGVyZQpAQCAtMTQzNCwxNCArMTQzNiwxMiBAQAogCQkgKiB3YXMgbm90IGdyYW50ZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgRUVQUk9NCiAJCSAqLwogCQlpZiAoaSA+PSB0aW1lb3V0KSB7Ci0JCQlod19kYmcoaHcsICJTV0VTTUJJIFNvZnR3YXJlIEVFUFJPTSBzZW1hcGhvcmUgIgotCQkJICAgICAgICJub3QgZ3JhbnRlZC5cbiIpOworCQkJaHdfZGJnKGh3LCAiU1dFU01CSSBTb2Z0d2FyZSBFRVBST00gc2VtYXBob3JlIG5vdCBncmFudGVkLlxuIik7CiAJCQlpeGdiZV9yZWxlYXNlX2VlcHJvbV9zZW1hcGhvcmUoaHcpOwogCQkJc3RhdHVzID0gSVhHQkVfRVJSX0VFUFJPTTsKIAkJfQogCX0gZWxzZSB7Ci0JCWh3X2RiZyhodywgIlNvZnR3YXJlIHNlbWFwaG9yZSBTTUJJIGJldHdlZW4gZGV2aWNlIGRyaXZlcnMgIgotCQkgICAgICAgIm5vdCBncmFudGVkLlxuIik7CisJCWh3X2RiZyhodywgIlNvZnR3YXJlIHNlbWFwaG9yZSBTTUJJIGJldHdlZW4gZGV2aWNlIGRyaXZlcnMgbm90IGdyYW50ZWQuXG4iKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTQ4Myw3ICsxNDgzLDcgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfRUVQUk9NX01BWF9SRVRSWV9TUEk7IGkgKz0gNSkgewogCQlpeGdiZV9zaGlmdF9vdXRfZWVwcm9tX2JpdHMoaHcsIElYR0JFX0VFUFJPTV9SRFNSX09QQ09ERV9TUEksCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9FRVBST01fT1BDT0RFX0JJVFMpOworCQkJCQkgICAgSVhHQkVfRUVQUk9NX09QQ09ERV9CSVRTKTsKIAkJc3BpX3N0YXRfcmVnID0gKHU4KWl4Z2JlX3NoaWZ0X2luX2VlcHJvbV9iaXRzKGh3LCA4KTsKIAkJaWYgKCEoc3BpX3N0YXRfcmVnICYgSVhHQkVfRUVQUk9NX1NUQVRVU19SRFlfU1BJKSkKIAkJCWJyZWFrOwpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKICAqICBAY291bnQ6IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IG91dAogICoqLwogc3RhdGljIHZvaWQgaXhnYmVfc2hpZnRfb3V0X2VlcHJvbV9iaXRzKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjb3VudCkKKwkJCQkJdTE2IGNvdW50KQogewogCXUzMiBlZWM7CiAJdTMyIG1hc2s7CkBAIC0xNzM2LDcgKzE3MzYsNyBAQAogICogIGNhbGxlciBkb2VzIG5vdCBuZWVkIGNoZWNrc3VtX3ZhbCwgdGhlIHZhbHVlIGNhbiBiZSBOVUxMLgogICoqLwogczMyIGl4Z2JlX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpjaGVja3N1bV92YWwpCisJCQkJCSAgIHUxNiAqY2hlY2tzdW1fdmFsKQogewogCXMzMiBzdGF0dXM7CiAJdTE2IGNoZWNrc3VtOwpAQCAtMTgwOSw3ICsxODA5LDcgQEAKICAqICBQdXRzIGFuIGV0aGVybmV0IGFkZHJlc3MgaW50byBhIHJlY2VpdmUgYWRkcmVzcyByZWdpc3Rlci4KICAqKi8KIHMzMiBpeGdiZV9zZXRfcmFyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4LCB1OCAqYWRkciwgdTMyIHZtZHEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBlbmFibGVfYWRkcikKKwkJCSAgdTMyIGVuYWJsZV9hZGRyKQogewogCXUzMiByYXJfbG93LCByYXJfaGlnaDsKIAl1MzIgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllczsKQEAgLTIwNTMsNyArMjA1Myw3IEBACiAKIAlpZiAoaHctPmFkZHJfY3RybC5tdGFfaW5fdXNlID4gMCkKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NQ1NUQ1RSTCwKLQkJICAgICAgICAgICAgICAgIElYR0JFX01DU1RDVFJMX01GRSB8IGh3LT5tYWMubWNfZmlsdGVyX3R5cGUpOworCQkJCUlYR0JFX01DU1RDVFJMX01GRSB8IGh3LT5tYWMubWNfZmlsdGVyX3R5cGUpOwogCiAJaHdfZGJnKGh3LCAiaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdF9nZW5lcmljIENvbXBsZXRlXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIwNzEsNyArMjA3MSw3IEBACiAKIAlpZiAoYS0+bXRhX2luX3VzZSA+IDApCiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTUNTVENUUkwsIElYR0JFX01DU1RDVFJMX01GRSB8Ci0JCSAgICAgICAgICAgICAgICBody0+bWFjLm1jX2ZpbHRlcl90eXBlKTsKKwkJCQlody0+bWFjLm1jX2ZpbHRlcl90eXBlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjEwNiwxOSArMjEwNiwyNSBAQAogCXUzMiBmY3J0bCwgZmNydGg7CiAJaW50IGk7CiAKLQkvKgotCSAqIFZhbGlkYXRlIHRoZSB3YXRlciBtYXJrIGNvbmZpZ3VyYXRpb24gZm9yIHBhY2tldCBidWZmZXIgMC4gIFplcm8KLQkgKiB3YXRlciBtYXJrcyBpbmRpY2F0ZSB0aGF0IHRoZSBwYWNrZXQgYnVmZmVyIHdhcyBub3QgY29uZmlndXJlZAotCSAqIGFuZCB0aGUgd2F0ZXJtYXJrcyBmb3IgcGFja2V0IGJ1ZmZlciAwIHNob3VsZCBhbHdheXMgYmUgY29uZmlndXJlZC4KLQkgKi8KLQlpZiAoIWh3LT5mYy5sb3dfd2F0ZXIgfHwKLQkgICAgIWh3LT5mYy5oaWdoX3dhdGVyWzBdIHx8Ci0JICAgICFody0+ZmMucGF1c2VfdGltZSkgewotCQlod19kYmcoaHcsICJJbnZhbGlkIHdhdGVyIG1hcmsgY29uZmlndXJhdGlvblxuIik7CisJLyogVmFsaWRhdGUgdGhlIHdhdGVyIG1hcmsgY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIWh3LT5mYy5wYXVzZV90aW1lKSB7CiAJCXJldF92YWwgPSBJWEdCRV9FUlJfSU5WQUxJRF9MSU5LX1NFVFRJTkdTOwogCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBMb3cgd2F0ZXIgbWFyayBvZiB6ZXJvIGNhdXNlcyBYT0ZGIGZsb29kcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFJBRkZJQ19DTEFTUzsgaSsrKSB7CisJCWlmICgoaHctPmZjLmN1cnJlbnRfbW9kZSAmIGl4Z2JlX2ZjX3R4X3BhdXNlKSAmJgorCQkgICAgaHctPmZjLmhpZ2hfd2F0ZXJbaV0pIHsKKwkJCWlmICghaHctPmZjLmxvd193YXRlcltpXSB8fAorCQkJICAgIGh3LT5mYy5sb3dfd2F0ZXJbaV0gPj0gaHctPmZjLmhpZ2hfd2F0ZXJbaV0pIHsKKwkJCQlod19kYmcoaHcsICJJbnZhbGlkIHdhdGVyIG1hcmsgY29uZmlndXJhdGlvblxuIik7CisJCQkJcmV0X3ZhbCA9IElYR0JFX0VSUl9JTlZBTElEX0xJTktfU0VUVElOR1M7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKIAkvKiBOZWdvdGlhdGUgdGhlIGZjIG1vZGUgdG8gdXNlICovCiAJaXhnYmVfZmNfYXV0b25lZyhodyk7CiAKQEAgLTIxODEsMTIgKzIxODcsMTEgQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01GTENOLCBtZmxjbl9yZWcpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNDRkcsIGZjY2ZnX3JlZyk7CiAKLQlmY3J0bCA9IChody0+ZmMubG93X3dhdGVyIDw8IDEwKSB8IElYR0JFX0ZDUlRMX1hPTkU7Ci0KIAkvKiBTZXQgdXAgYW5kIGVuYWJsZSBSeCBoaWdoL2xvdyB3YXRlciBtYXJrIHRocmVzaG9sZHMsIGVuYWJsZSBYT04uICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKIAkJaWYgKChody0+ZmMuY3VycmVudF9tb2RlICYgaXhnYmVfZmNfdHhfcGF1c2UpICYmCiAJCSAgICBody0+ZmMuaGlnaF93YXRlcltpXSkgeworCQkJZmNydGwgPSAoaHctPmZjLmxvd193YXRlcltpXSA8PCAxMCkgfCBJWEdCRV9GQ1JUTF9YT05FOwogCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUTF84MjU5OShpKSwgZmNydGwpOwogCQkJZmNydGggPSAoaHctPmZjLmhpZ2hfd2F0ZXJbaV0gPDwgMTApIHwgSVhHQkVfRkNSVEhfRkNFTjsKIAkJfSBlbHNlIHsKQEAgLTI2NTQsOCArMjY1OSw3IEBACiAKIAkvKiBGb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5ICovCiAJaWYgKGkgPj0gSVhHQkVfTUFYX1NFQ1JYX1BPTEwpCi0JCWh3X2RiZyhodywgIlJ4IHVuaXQgYmVpbmcgZW5hYmxlZCBiZWZvcmUgc2VjdXJpdHkgIgotCQkgICAgICAgInBhdGggZnVsbHkgZGlzYWJsZWQuICBDb250aW51aW5nIHdpdGggaW5pdC5cbiIpOworCQlod19kYmcoaHcsICJSeCB1bml0IGJlaW5nIGVuYWJsZWQgYmVmb3JlIHNlY3VyaXR5IHBhdGggZnVsbHkgZGlzYWJsZWQuIENvbnRpbnVpbmcgd2l0aCBpbml0LlxuIik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjc4Miw3ICsyNzg2LDcgQEAKICAqICBnZXQgYW5kIHNldCBtYWNfYWRkciByb3V0aW5lcy4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfZ2V0X3Nhbl9tYWNfYWRkcl9vZmZzZXQoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKnNhbl9tYWNfb2Zmc2V0KQorCQkJCQl1MTYgKnNhbl9tYWNfb2Zmc2V0KQogewogCXMzMiByZXRfdmFsOwogCkBAIC0yODI4LDcgKzI4MzIsNyBAQAogCWh3LT5tYWMub3BzLnNldF9sYW5faWQoaHcpOwogCS8qIGFwcGx5IHRoZSBwb3J0IG9mZnNldCB0byB0aGUgYWRkcmVzcyBvZmZzZXQgKi8KIAkoaHctPmJ1cy5mdW5jKSA/IChzYW5fbWFjX29mZnNldCArPSBJWEdCRV9TQU5fTUFDX0FERFJfUE9SVDFfT0ZGU0VUKSA6Ci0JICAgICAgICAgICAgICAgICAoc2FuX21hY19vZmZzZXQgKz0gSVhHQkVfU0FOX01BQ19BRERSX1BPUlQwX09GRlNFVCk7CisJCQkgKHNhbl9tYWNfb2Zmc2V0ICs9IElYR0JFX1NBTl9NQUNfQUREUl9QT1JUMF9PRkZTRVQpOwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0X3ZhbCA9IGh3LT5lZXByb20ub3BzLnJlYWQoaHcsIHNhbl9tYWNfb2Zmc2V0LAogCQkJCQkgICAgICAmc2FuX21hY19kYXRhKTsKQEAgLTMwNjgsNyArMzA3Miw3IEBACiAgKiAgVHVybiBvbi9vZmYgc3BlY2lmaWVkIFZMQU4gaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgogICoqLwogczMyIGl4Z2JlX3NldF92ZnRhX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHZsYW4sIHUzMiB2aW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2bGFuX29uKQorCQkJICAgYm9vbCB2bGFuX29uKQogewogCXMzMiByZWdpbmRleDsKIAl1MzIgYml0aW5kZXg7CkBAIC0zMTkwLDkgKzMxOTQsOSBAQAogCQkJCSAqIElnbm9yZSBpdC4gKi8KIAkJCQl2ZnRhX2NoYW5nZWQgPSBmYWxzZTsKIAkJCX0KLQkJfQotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZMVkYodmx2Zl9pbmRleCksIDApOworCQl9CiAJfQogCiAJaWYgKHZmdGFfY2hhbmdlZCkKQEAgLTMyOTIsNyArMzI5Niw3IEBACiAgKiAgYmxvY2sgdG8gY2hlY2sgdGhlIHN1cHBvcnQgZm9yIHRoZSBhbHRlcm5hdGl2ZSBXV05OL1dXUE4gcHJlZml4IHN1cHBvcnQuCiAgKiovCiBzMzIgaXhnYmVfZ2V0X3d3bl9wcmVmaXhfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgKnd3bm5fcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqd3dwbl9wcmVmaXgpCisJCQkJCXUxNiAqd3dwbl9wcmVmaXgpCiB7CiAJdTE2IG9mZnNldCwgY2FwczsKIAl1MTYgYWx0X3Nhbl9tYWNfYmxrX29mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKaW5kZXggZjEyYzQwZi4uMmFlNWQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKQEAgLTM5LDcgKzM5LDcgQEAKIHMzMiBpeGdiZV9zdGFydF9od19nZW4yKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX2NsZWFyX2h3X2NudHJzX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CiBzMzIgaXhnYmVfcmVhZF9wYmFfc3RyaW5nX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKnBiYV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHBiYV9udW1fc2l6ZSk7CisJCQkJICB1MzIgcGJhX251bV9zaXplKTsKIHMzMiBpeGdiZV9nZXRfbWFjX2FkZHJfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWFjX2FkZHIpOwogZW51bSBpeGdiZV9idXNfd2lkdGggaXhnYmVfY29udmVydF9idXNfd2lkdGgodTE2IGxpbmtfc3RhdHVzKTsKIGVudW0gaXhnYmVfYnVzX3NwZWVkIGl4Z2JlX2NvbnZlcnRfYnVzX3NwZWVkKHUxNiBsaW5rX3N0YXR1cyk7CkBAIC02MSwxNiArNjEsMTYgQEAKIHMzMiBpeGdiZV93cml0ZV9lZXdyX2J1ZmZlcl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBvZmZzZXQsCiAJCQkJICAgIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKIHMzMiBpeGdiZV9yZWFkX2VlcHJvbV9iaXRfYmFuZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmRhdGEpOworCQkJCSAgICAgICB1MTYgKmRhdGEpOwogczMyIGl4Z2JlX3JlYWRfZWVwcm9tX2J1ZmZlcl9iaXRfYmFuZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBvZmZzZXQsCiAJCQkJCSAgICAgIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKIHUxNiBpeGdiZV9jYWxjX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpjaGVja3N1bV92YWwpOworCQkJCQkgICB1MTYgKmNoZWNrc3VtX3ZhbCk7CiBzMzIgaXhnYmVfdXBkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogCiBzMzIgaXhnYmVfc2V0X3Jhcl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCwgdTggKmFkZHIsIHUzMiB2bWRxLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZW5hYmxlX2FkZHIpOworCQkJICB1MzIgZW5hYmxlX2FkZHIpOwogczMyIGl4Z2JlX2NsZWFyX3Jhcl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCk7CiBzMzIgaXhnYmVfaW5pdF9yeF9hZGRyc19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX3VwZGF0ZV9tY19hZGRyX2xpc3RfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LApAQCAtOTIsMTMgKzkyLDEzIEBACiBzMzIgaXhnYmVfY2xlYXJfdm1kcV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByYXIsIHUzMiB2bWRxKTsKIHMzMiBpeGdiZV9pbml0X3V0YV90YWJsZXNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9zZXRfdmZ0YV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiB2bGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHZpbmQsIGJvb2wgdmxhbl9vbik7CisJCQkgICB1MzIgdmluZCwgYm9vbCB2bGFuX29uKTsKIHMzMiBpeGdiZV9jbGVhcl92ZnRhX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CiBzMzIgaXhnYmVfY2hlY2tfbWFjX2xpbmtfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpsaW5rX3VwLCBib29sIGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZSk7CisJCQkJIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAorCQkJCSBib29sICpsaW5rX3VwLCBib29sIGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZSk7CiBzMzIgaXhnYmVfZ2V0X3d3bl9wcmVmaXhfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgKnd3bm5fcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICp3d3BuX3ByZWZpeCk7CisJCQkJIHUxNiAqd3dwbl9wcmVmaXgpOwogCiBzMzIgcHJvdF9hdXRvY19yZWFkX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgYm9vbCAqLCB1MzIgKnJlZ192YWwpOwogczMyIHByb3RfYXV0b2Nfd3JpdGVfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX3ZhbCwgYm9vbCBsb2NrZWQpOwpAQCAtMTQxLDggKzE0MSw2IEBACiAJcmV0dXJuIHVubGlrZWx5KCFhZGRyKTsKIH0KIAotdm9pZCBpeGdiZV9jaGVja19yZW1vdmUoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpeGdiZV93cml0ZV9yZWcoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZywgdTMyIHZhbHVlKQogewogCXU4IF9faW9tZW0gKnJlZ19hZGRyID0gQUNDRVNTX09OQ0UoaHctPmh3X2FkZHIpOwpAQCAtMTcyLDE4ICsxNzAsNyBAQAogfQogI2RlZmluZSBJWEdCRV9XUklURV9SRUc2NChhLCByZWcsIHZhbHVlKSBpeGdiZV93cml0ZV9yZWc2NCgoYSksIChyZWcpLCAodmFsdWUpKQogCi1zdGF0aWMgaW5saW5lIHUzMiBpeGdiZV9yZWFkX3JlZyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnKQotewotCXU4IF9faW9tZW0gKnJlZ19hZGRyID0gQUNDRVNTX09OQ0UoaHctPmh3X2FkZHIpOwotCXUzMiB2YWx1ZTsKLQotCWlmIChpeGdiZV9yZW1vdmVkKHJlZ19hZGRyKSkKLQkJcmV0dXJuIElYR0JFX0ZBSUxFRF9SRUFEX1JFRzsKLQl2YWx1ZSA9IHJlYWRsKHJlZ19hZGRyICsgcmVnKTsKLQlpZiAodW5saWtlbHkodmFsdWUgPT0gSVhHQkVfRkFJTEVEX1JFQURfUkVHKSkKLQkJaXhnYmVfY2hlY2tfcmVtb3ZlKGh3LCByZWcpOwotCXJldHVybiB2YWx1ZTsKLX0KK3UzMiBpeGdiZV9yZWFkX3JlZyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnKTsKICNkZWZpbmUgSVhHQkVfUkVBRF9SRUcoYSwgcmVnKSBpeGdiZV9yZWFkX3JlZygoYSksIChyZWcpKQogCiAjZGVmaW5lIElYR0JFX1dSSVRFX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCwgdmFsdWUpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiLmMKaW5kZXggZTA1NWUwMC4uYTY4OWVlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICogQ29uZmlndXJlIGRjYiBzZXR0aW5ncyBhbmQgZW5hYmxlIGRjYiBtb2RlLgogICovCiBzMzIgaXhnYmVfZGNiX2h3X2NvbmZpZyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX2RjYl9jb25maWcgKmRjYl9jb25maWcpCisJCQlzdHJ1Y3QgaXhnYmVfZGNiX2NvbmZpZyAqZGNiX2NvbmZpZykKIHsKIAlzMzIgcmV0ID0gMDsKIAl1OCBwZmNfZW47CkBAIC0zODksNyArMzg5LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykKIAkJbWFwW2ldID0gSVhHQkVfUlRSVVAyVENfVVBfTUFTSyAmCiAJCQkocmVnID4+IChpICogSVhHQkVfUlRSVVAyVENfVVBfU0hJRlQpKTsKLQlyZXR1cm47CiB9CiAKIHZvaWQgaXhnYmVfZGNiX3JlYWRfcnRydXAydGMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKm1hcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl84MjU5OC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiXzgyNTk4LmMKaW5kZXggN2E3N2YzNy4uZDNiYTYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiXzgyNTk4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiXzgyNTk4LmMKQEAgLTIwOCw3ICsyMDgsNiBAQAogCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1RSTCwgcmVnKTsKIAotCWZjcnRsID0gKGh3LT5mYy5sb3dfd2F0ZXIgPDwgMTApIHwgSVhHQkVfRkNSVExfWE9ORTsKIAkvKiBDb25maWd1cmUgUEZDIFR4IHRocmVzaG9sZHMgcGVyIFRDICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKIAkJaWYgKCEocGZjX2VuICYgKDEgPDwgaSkpKSB7CkBAIC0yMTcsNiArMjE2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJZmNydGwgPSAoaHctPmZjLmxvd193YXRlcltpXSA8PCAxMCkgfCBJWEdCRV9GQ1JUTF9YT05FOwogCQlyZWcgPSAoaHctPmZjLmhpZ2hfd2F0ZXJbaV0gPDwgMTApIHwgSVhHQkVfRkNSVEhfRkNFTjsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUTChpKSwgZmNydGwpOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDUlRIKGkpLCByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfODI1OTkuYwppbmRleCBiZGI5OWIzLi4zYjkzMmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfODI1OTkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfODI1OTkuYwpAQCAtMjQyLDcgKzI0Miw2IEBACiAJCQltYXhfdGMgPSBwcmlvX3RjW2ldOwogCX0KIAotCWZjcnRsID0gKGh3LT5mYy5sb3dfd2F0ZXIgPDwgMTApIHwgSVhHQkVfRkNSVExfWE9ORTsKIAogCS8qIENvbmZpZ3VyZSBQRkMgVHggdGhyZXNob2xkcyBwZXIgVEMgKi8KIAlmb3IgKGkgPSAwOyBpIDw9IG1heF90YzsgaSsrKSB7CkBAIC0yNTcsNiArMjU2LDcgQEAKIAogCQlpZiAoZW5hYmxlZCkgewogCQkJcmVnID0gKGh3LT5mYy5oaWdoX3dhdGVyW2ldIDw8IDEwKSB8IElYR0JFX0ZDUlRIX0ZDRU47CisJCQlmY3J0bCA9IChody0+ZmMubG93X3dhdGVyW2ldIDw8IDEwKSB8IElYR0JFX0ZDUlRMX1hPTkU7CiAJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDUlRMXzgyNTk5KGkpLCBmY3J0bCk7CiAJCX0gZWxzZSB7CiAJCQlyZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhQQlNJWkUoaSkpIC0gMzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfODI1OTkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl84MjU5OS5oCmluZGV4IGQ1YTFlM2QuLjkwYzM3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl84MjU5OS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl84MjU5OS5oCkBAIC0zMSwxNyArMzEsMTcgQEAKIAogLyogRENCIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIElYR0JFX1JUVERDU19URFBBQyAgICAgIDB4MDAwMDAwMDEgLyogMCBSb3VuZCBSb2JpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxIFdTUCAtIFdlaWdodGVkIFN0cmljdCBQcmlvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJCQkgICAgKiAxIFdTUCAtIFdlaWdodGVkIFN0cmljdCBQcmlvcml0eQorCQkJCQkgICAgKi8KICNkZWZpbmUgSVhHQkVfUlRURENTX1ZNUEFDICAgICAgMHgwMDAwMDAwMiAvKiAwIFJvdW5kIFJvYmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDEgV1JSIC0gV2VpZ2h0ZWQgUm91bmQgUm9iaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJICAgICogMSBXUlIgLSBXZWlnaHRlZCBSb3VuZCBSb2JpbgorCQkJCQkgICAgKi8KICNkZWZpbmUgSVhHQkVfUlRURENTX1REUk0gICAgICAgMHgwMDAwMDAxMCAvKiBUcmFuc21pdCBSZWN5Y2xlIE1vZGUgKi8KICNkZWZpbmUgSVhHQkVfUlRURENTX0FSQkRJUyAgICAgMHgwMDAwMDA0MCAvKiBEQ0IgYXJiaXRlciBkaXNhYmxlICovCiAjZGVmaW5lIElYR0JFX1JUVERDU19CRFBNICAgICAgIDB4MDA0MDAwMDAgLyogQnlwYXNzIERhdGEgUGlwZSAtIG11c3QgY2xlYXIhICovCiAjZGVmaW5lIElYR0JFX1JUVERDU19CUEJGU00gICAgIDB4MDA4MDAwMDAgLyogQnlwYXNzIFBCIEZyZWUgU3BhY2UgLSBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNsZWFyIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJICAgICAqIGNsZWFyIQorCQkJCQkgICAgICovCiAjZGVmaW5lIElYR0JFX1JUVERDU19TUEVFRF9DSEcgIDB4ODAwMDAwMDAgLyogTGluayBzcGVlZCBjaGFuZ2UgKi8KIAogLyogUmVjZWl2ZSBVUDJUQyBtYXBwaW5nICovCkBAIC01NiwxMSArNTYsMTEgQEAKICNkZWZpbmUgSVhHQkVfUlRSUFQ0Q19MU1AgICAgICAgMHg4MDAwMDAwMCAvKiBMU1AgZW5hYmxlIGJpdCAqLwogCiAjZGVmaW5lIElYR0JFX1JEUlhDVExfTVBCRU4gICAgIDB4MDAwMDAwMTAgLyogRE1BIGNvbmZpZyBmb3IgbXVsdGlwbGUgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyBlbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJICAgICogYnVmZmVycyBlbmFibGUKKwkJCQkJICAgICovCiAjZGVmaW5lIElYR0JFX1JEUlhDVExfTUNFTiAgICAgIDB4MDAwMDAwNDAgLyogRE1BIGNvbmZpZyBmb3IgbXVsdGlwbGUgY29yZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoUlNTKSBlbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJICAgICogKFJTUykgZW5hYmxlCisJCQkJCSAgICAqLwogCiAvKiBSVFJQQ1MgQml0IE1hc2tzICovCiAjZGVmaW5lIElYR0JFX1JUUlBDU19SUk0gICAgICAgIDB4MDAwMDAwMDIgLyogUmVjZWl2ZSBSZWN5Y2xlIE1vZGUgZW5hYmxlICovCkBAIC04MSw4ICs4MSw4IEBACiAKIC8qIFJUVFBDUyBCaXQgTWFza3MgKi8KICNkZWZpbmUgSVhHQkVfUlRUUENTX1RQUEFDICAgICAgMHgwMDAwMDAyMCAvKiAwIFJvdW5kIFJvYmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDEgU1AgLSBTdHJpY3QgUHJpb3JpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJICAgICogMSBTUCAtIFN0cmljdCBQcmlvcml0eQorCQkJCQkgICAgKi8KICNkZWZpbmUgSVhHQkVfUlRUUENTX0FSQkRJUyAgICAgMHgwMDAwMDA0MCAvKiBBcmJpdGVyIGRpc2FibGUgKi8KICNkZWZpbmUgSVhHQkVfUlRUUENTX1RQUk0gICAgICAgMHgwMDAwMDEwMCAvKiBUcmFuc21pdCBSZWN5Y2xlIE1vZGUgZW5hYmxlICovCiAjZGVmaW5lIElYR0JFX1JUVFBDU19BUkJEX1NISUZUIDIyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCmluZGV4IGVkZDg5YTEuLjUxNzJiNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCkBAIC0xOTIsOCArMTkyLDggQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZGNibmxfc2V0X3BnX3RjX2NmZ190eChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHByaW8sIHU4IGJ3Z19pZCwgdTggYndfcGN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCB1cF9tYXApCisJCQkJCSB1OCBwcmlvLCB1OCBid2dfaWQsIHU4IGJ3X3BjdCwKKwkJCQkJIHU4IHVwX21hcCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTIxMCw3ICsyMTAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9zZXRfcGdfYndnX2NmZ190eChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYndnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggYndfcGN0KQorCQkJCQkgIHU4IGJ3X3BjdCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTIxOCw4ICsyMTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9zZXRfcGdfdGNfY2ZnX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggcHJpbywgdTggYndnX2lkLCB1OCBid19wY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHVwX21hcCkKKwkJCQkJIHU4IHByaW8sIHU4IGJ3Z19pZCwgdTggYndfcGN0LAorCQkJCQkgdTggdXBfbWFwKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjM2LDcgKzIzNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX3NldF9wZ19id2dfY2ZnX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBid2dfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBid19wY3QpCisJCQkJCSAgdTggYndfcGN0KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjQ0LDggKzI0NCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX2dldF9wZ190Y19jZmdfdHgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcHJpbywgdTggKmJ3Z19pZCwgdTggKmJ3X3BjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnVwX21hcCkKKwkJCQkJIHU4ICpwcmlvLCB1OCAqYndnX2lkLCB1OCAqYndfcGN0LAorCQkJCQkgdTggKnVwX21hcCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9nZXRfcGdfYndnX2NmZ190eChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYndnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmJ3X3BjdCkKKwkJCQkJICB1OCAqYndfcGN0KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjY0LDggKzI2NCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX2dldF9wZ190Y19jZmdfcngoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcHJpbywgdTggKmJ3Z19pZCwgdTggKmJ3X3BjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnVwX21hcCkKKwkJCQkJIHU4ICpwcmlvLCB1OCAqYndnX2lkLCB1OCAqYndfcGN0LAorCQkJCQkgdTggKnVwX21hcCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTI3Niw3ICsyNzYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9nZXRfcGdfYndnX2NmZ19yeChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYndnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmJ3X3BjdCkKKwkJCQkJICB1OCAqYndfcGN0KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjg0LDcgKzI4NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX3NldF9wZmNfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHNldHRpbmcpCisJCQkJICAgIHU4IHNldHRpbmcpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC0yOTUsNyArMjk1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZGNibmxfZ2V0X3BmY19jZmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnNldHRpbmcpCisJCQkJICAgIHU4ICpzZXR0aW5nKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGVidWdmcy5jCmluZGV4IDQ3MmIwZjQuLjVlMmMxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kZWJ1Z2ZzLmMKQEAgLTI1Myw4ICsyNTMsNyBAQAogICoqLwogdm9pZCBpeGdiZV9kYmdfYWRhcHRlcl9leGl0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChhZGFwdGVyLT5peGdiZV9kYmdfYWRhcHRlcikKLQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGFkYXB0ZXItPml4Z2JlX2RiZ19hZGFwdGVyKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYWRhcHRlci0+aXhnYmVfZGJnX2FkYXB0ZXIpOwogCWFkYXB0ZXItPml4Z2JlX2RiZ19hZGFwdGVyID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCmluZGV4IDZjNTVjMTQuLmE0NTI3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKQEAgLTE0MSw4ICsxNDEsOCBAQAogCQkJIHNpemVvZigoKHN0cnVjdCBpeGdiZV9hZGFwdGVyICopMCktPnN0YXRzLnB4b2ZmdHhjKSkgXAogCQkJLyBzaXplb2YodTY0KSkKICNkZWZpbmUgSVhHQkVfU1RBVFNfTEVOIChJWEdCRV9HTE9CQUxfU1RBVFNfTEVOICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1BCX1NUQVRTX0xFTiArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9RVUVVRV9TVEFUU19MRU4pCisJCQkgSVhHQkVfUEJfU1RBVFNfTEVOICsgXAorCQkJIElYR0JFX1FVRVVFX1NUQVRTX0xFTikKIAogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmVfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CiAJIlJlZ2lzdGVyIHRlc3QgIChvZmZsaW5lKSIsICJFZXByb20gdGVzdCAgICAob2ZmbGluZSkiLApAQCAtMTUyLDcgKzE1Miw3IEBACiAjZGVmaW5lIElYR0JFX1RFU1RfTEVOIHNpemVvZihpeGdiZV9nc3RyaW5nc190ZXN0KSAvIEVUSF9HU1RSSU5HX0xFTgogCiBzdGF0aWMgaW50IGl4Z2JlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMTYxLDEzICsxNjEsNiBAQAogCWJvb2wgYXV0b25lZyA9IGZhbHNlOwogCWJvb2wgbGlua191cDsKIAotCS8qIFNGUCB0eXBlIGlzIG5lZWRlZCBmb3IgZ2V0X2xpbmtfY2FwYWJpbGl0aWVzICovCi0JaWYgKGh3LT5waHkubWVkaWFfdHlwZSAmIChpeGdiZV9tZWRpYV90eXBlX2ZpYmVyIHwKLQkJCQkgIGl4Z2JlX21lZGlhX3R5cGVfZmliZXJfcXNmcCkpIHsKLQkJaWYgKGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfbm90X3ByZXNlbnQpCi0JCQkJaHctPnBoeS5vcHMuaWRlbnRpZnlfc2ZwKGh3KTsKLQl9Ci0KIAlody0+bWFjLm9wcy5nZXRfbGlua19jYXBhYmlsaXRpZXMoaHcsICZzdXBwb3J0ZWRfbGluaywgJmF1dG9uZWcpOwogCiAJLyogc2V0IHRoZSBzdXBwb3J0ZWQgbGluayBzcGVlZHMgKi8KQEAgLTMwMywxNSArMjk2LDE1IEBACiAJCX0KIAkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIC0xKTsKLQkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF9VTktOT1dOKTsKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC0zNjgsNyArMzYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQorCQkJCSBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTM5MCw3ICszODMsNyBAQAogfQogCiBzdGF0aWMgaW50IGl4Z2JlX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQorCQkJCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtNDUwLDcgKzQ0Myw3IEBACiAjZGVmaW5lIElYR0JFX0dFVF9TVEFUKF9BXywgX1JfKSBfQV8tPnN0YXRzLl9SXwogCiBzdGF0aWMgdm9pZCBpeGdiZV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKKwkJCSAgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC04MTIsNyArODA1LDcgQEAKIH0KIAogc3RhdGljIGludCBpeGdiZV9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpieXRlcykKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmJ5dGVzKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtOTE4LDcgKzkxMSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTMyIG52bV90cmFja19pZDsKQEAgLTk0MCw3ICs5MzMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKKwkJCQlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ1swXTsKQEAgLTk1Myw3ICs5NDYsNyBAQAogfQogCiBzdGF0aWMgaW50IGl4Z2JlX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfcmluZyAqdGVtcF9yaW5nOwpAQCAtMTA4Miw3ICsxMDc1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQorCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IHRlbXA7CkBAIC0xMTEwLDcgKzExMDMsNyBAQAogCQl9CiAKIAkJZGF0YVtpXSA9IChpeGdiZV9nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PQotCQkgICAgICAgICAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKKwkJCSAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKIAl9CiAJZm9yIChqID0gMDsgaiA8IG5ldGRldi0+bnVtX3R4X3F1ZXVlczsgaisrKSB7CiAJCXJpbmcgPSBhZGFwdGVyLT50eF9yaW5nW2pdOwpAQCAtMTE4MCw3ICsxMTczLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhKQorCQkJICAgICAgdTggKmRhdGEpCiB7CiAJY2hhciAqcCA9IChjaGFyICopZGF0YTsKIAlpbnQgaTsKQEAgLTEzNTcsOCArMTM1MCw3IEBACiAJCWl4Z2JlX3dyaXRlX3JlZygmYWRhcHRlci0+aHcsIHJlZywgdGVzdF9wYXR0ZXJuW3BhdF0gJiB3cml0ZSk7CiAJCXZhbCA9IGl4Z2JlX3JlYWRfcmVnKCZhZGFwdGVyLT5odywgcmVnKTsKIAkJaWYgKHZhbCAhPSAodGVzdF9wYXR0ZXJuW3BhdF0gJiB3cml0ZSAmIG1hc2spKSB7Ci0JCQllX2VycihkcnYsICJwYXR0ZXJuIHRlc3QgcmVnICUwNFggZmFpbGVkOiBnb3QgIgotCQkJICAgICAgIjB4JTA4WCBleHBlY3RlZCAweCUwOFhcbiIsCisJCQllX2VycihkcnYsICJwYXR0ZXJuIHRlc3QgcmVnICUwNFggZmFpbGVkOiBnb3QgMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwKIAkJCSAgICAgIHJlZywgdmFsLCAodGVzdF9wYXR0ZXJuW3BhdF0gJiB3cml0ZSAmIG1hc2spKTsKIAkJCSpkYXRhID0gcmVnOwogCQkJaXhnYmVfd3JpdGVfcmVnKCZhZGFwdGVyLT5odywgcmVnLCBiZWZvcmUpOwpAQCAtMTM4Miw4ICsxMzc0LDggQEAKIAlpeGdiZV93cml0ZV9yZWcoJmFkYXB0ZXItPmh3LCByZWcsIHdyaXRlICYgbWFzayk7CiAJdmFsID0gaXhnYmVfcmVhZF9yZWcoJmFkYXB0ZXItPmh3LCByZWcpOwogCWlmICgod3JpdGUgJiBtYXNrKSAhPSAodmFsICYgbWFzaykpIHsKLQkJZV9lcnIoZHJ2LCAic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYICIKLQkJICAgICAgImV4cGVjdGVkIDB4JTA4WFxuIiwgcmVnLCAodmFsICYgbWFzayksICh3cml0ZSAmIG1hc2spKTsKKwkJZV9lcnIoZHJ2LCAic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwKKwkJICAgICAgcmVnLCAodmFsICYgbWFzayksICh3cml0ZSAmIG1hc2spKTsKIAkJKmRhdGEgPSByZWc7CiAJCWl4Z2JlX3dyaXRlX3JlZygmYWRhcHRlci0+aHcsIHJlZywgYmVmb3JlKTsKIAkJcmV0dXJuIHRydWU7CkBAIC0xNDMwLDggKzE0MjIsOCBAQAogCWl4Z2JlX3dyaXRlX3JlZygmYWRhcHRlci0+aHcsIElYR0JFX1NUQVRVUywgdG9nZ2xlKTsKIAlhZnRlciA9IGl4Z2JlX3JlYWRfcmVnKCZhZGFwdGVyLT5odywgSVhHQkVfU1RBVFVTKSAmIHRvZ2dsZTsKIAlpZiAodmFsdWUgIT0gYWZ0ZXIpIHsKLQkJZV9lcnIoZHJ2LCAiZmFpbGVkIFNUQVRVUyByZWdpc3RlciB0ZXN0IGdvdDogMHglMDhYICIKLQkJICAgICAgImV4cGVjdGVkOiAweCUwOFhcbiIsIGFmdGVyLCB2YWx1ZSk7CisJCWVfZXJyKGRydiwgImZhaWxlZCBTVEFUVVMgcmVnaXN0ZXIgdGVzdCBnb3Q6IDB4JTA4WCBleHBlY3RlZDogMHglMDhYXG4iLAorCQkgICAgICBhZnRlciwgdmFsdWUpOwogCQkqZGF0YSA9IDE7CiAJCXJldHVybiAxOwogCX0KQEAgLTE1MzMsMTAgKzE1MjUsMTAgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gZWxzZSBpZiAoIXJlcXVlc3RfaXJxKGlycSwgaXhnYmVfdGVzdF9pbnRyLCBJUlFGX1BST0JFX1NIQVJFRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKKwkJCQluZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKIAkJc2hhcmVkX2ludCA9IGZhbHNlOwogCX0gZWxzZSBpZiAocmVxdWVzdF9pcnEoaXJxLCBpeGdiZV90ZXN0X2ludHIsIElSUUZfU0hBUkVELAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSB7CisJCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSB7CiAJCSpkYXRhID0gMTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTE1NjMsOSArMTU1NSw5IEBACiAJCQkgKi8KIAkJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKIAkJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJTUMsCi0JCQkgICAgICAgICAgICAgICAgfm1hc2sgJiAweDAwMDA3RkZGKTsKKwkJCQkJfm1hc2sgJiAweDAwMDA3RkZGKTsKIAkJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsCi0JCQkgICAgICAgICAgICAgICAgfm1hc2sgJiAweDAwMDA3RkZGKTsKKwkJCQkJfm1hc2sgJiAweDAwMDA3RkZGKTsKIAkJCUlYR0JFX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CiAJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIApAQCAtMTU4Nyw3ICsxNTc5LDcgQEAKIAkJSVhHQkVfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKIAkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKLQkJaWYgKCEoYWRhcHRlci0+dGVzdF9pY3IgJm1hc2spKSB7CisJCWlmICghKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykpIHsKIAkJCSpkYXRhID0gNDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjAyLDkgKzE1OTQsOSBAQAogCQkJICovCiAJCQlhZGFwdGVyLT50ZXN0X2ljciA9IDA7CiAJCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSU1DLAotCQkJICAgICAgICAgICAgICAgIH5tYXNrICYgMHgwMDAwN0ZGRik7CisJCQkJCX5tYXNrICYgMHgwMDAwN0ZGRik7CiAJCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSUNTLAotCQkJICAgICAgICAgICAgICAgIH5tYXNrICYgMHgwMDAwN0ZGRik7CisJCQkJCX5tYXNrICYgMHgwMDAwN0ZGRik7CiAJCQlJWEdCRV9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKQEAgLTE5NjQsNyArMTk1Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2RpYWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1NjQgKmRhdGEpCisJCQkgICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYm9vbCBpZl9ydW5uaW5nID0gbmV0aWZfcnVubmluZyhuZXRkZXYpOwpAQCAtMTk4NywxMCArMTk3OSw3IEBACiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdmZzOyBpKyspIHsKIAkJCQlpZiAoYWRhcHRlci0+dmZpbmZvW2ldLmNsZWFyX3RvX3NlbmQpIHsKLQkJCQkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAiJXMiLAotCQkJCQkJICAgICJvZmZsaW5lIGRpYWdub3N0aWMgaXMgbm90ICIKLQkJCQkJCSAgICAic3VwcG9ydGVkIHdoZW4gVkZzIGFyZSAiCi0JCQkJCQkgICAgInByZXNlbnRcbiIpOworCQkJCQluZXRkZXZfd2FybihuZXRkZXYsICJvZmZsaW5lIGRpYWdub3N0aWMgaXMgbm90IHN1cHBvcnRlZCB3aGVuIFZGcyBhcmUgcHJlc2VudFxuIik7CiAJCQkJCWRhdGFbMF0gPSAxOwogCQkJCQlkYXRhWzFdID0gMTsKIAkJCQkJZGF0YVsyXSA9IDE7CkBAIC0yMDM3LDggKzIwMjYsNyBAQAogCQkgKiBsb29wYmFjayBkaWFnbm9zdGljLiAqLwogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiAoSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEIHwKIAkJCQkgICAgICBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkpIHsKLQkJCWVfaW5mbyhodywgIlNraXAgTUFDIGxvb3BiYWNrIGRpYWdub3N0aWMgaW4gVlQgIgotCQkJICAgICAgICJtb2RlXG4iKTsKKwkJCWVfaW5mbyhodywgIlNraXAgTUFDIGxvb3BiYWNrIGRpYWdub3N0aWMgaW4gVlQgbW9kZVxuIik7CiAJCQlkYXRhWzNdID0gMDsKIAkJCWdvdG8gc2tpcF9sb29wYmFjazsKIAkJfQpAQCAtMjA3OCw3ICsyMDY2LDcgQEAKIH0KIAogc3RhdGljIGludCBpeGdiZV93b2xfZXhjbHVzaW9uKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTIwOTQsMTIgKzIwODIsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCisJCQkgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwKLQkgICAgICAgICAgICAgICAgIFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDOworCQkJIFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDOwogCXdvbC0+d29sb3B0cyA9IDA7CiAKIAlpZiAoaXhnYmVfd29sX2V4Y2x1c2lvbihhZGFwdGVyLCB3b2wpIHx8CkBAIC0yMTgxLDcgKzIxNjksNyBAQAogfQogCiBzdGF0aWMgaW50IGl4Z2JlX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjIyMiw4ICsyMjEwLDcgQEAKIAkgICAgYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgPiBJWEdCRV9NSU5fUlNDX0lUUikgewogCQlpZiAoIShhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRCkpIHsKIAkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRDsKLQkJCWVfaW5mbyhwcm9iZSwgInJ4LXVzZWNzIHZhbHVlIGhpZ2ggZW5vdWdoICIKLQkJCQkgICAgICAidG8gcmUtZW5hYmxlIFJTQ1xuIik7CisJCQllX2luZm8ocHJvYmUsICJyeC11c2VjcyB2YWx1ZSBoaWdoIGVub3VnaCB0byByZS1lbmFibGUgUlNDXG4iKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJLyogaWYgaW50ZXJydXB0IHJhdGUgaXMgdG9vIGhpZ2ggdGhlbiBkaXNhYmxlIFJTQyAqLwpAQCAtMjIzNiw3ICsyMjIzLDcgQEAKIH0KIAogc3RhdGljIGludCBpeGdiZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvcjsKQEAgLTI0MjEsOSArMjQwOCwxMSBAQAogCXN3aXRjaCAoY21kLT5mbG93X3R5cGUpIHsKIAljYXNlIFRDUF9WNF9GTE9XOgogCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgVURQX1Y0X0ZMT1c6CiAJCWlmIChhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9SU1NfRklFTERfSVBWNF9VRFApCiAJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgU0NUUF9WNF9GTE9XOgogCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CiAJY2FzZSBBSF9WNF9GTE9XOgpAQCAtMjQzMyw5ICsyNDIyLDExIEBACiAJCWJyZWFrOwogCWNhc2UgVENQX1Y2X0ZMT1c6CiAJCWNtZC0+ZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBVRFBfVjZfRkxPVzoKIAkJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY2X1VEUCkKIAkJCWNtZC0+ZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBTQ1RQX1Y2X0ZMT1c6CiAJY2FzZSBBSF9FU1BfVjZfRkxPVzoKIAljYXNlIEFIX1Y2X0ZMT1c6CkBAIC0yNzg3LDggKzI3NzgsNyBAQAogCiAJCWlmICgoZmxhZ3MyICYgVURQX1JTU19GTEFHUykgJiYKIAkJICAgICEoYWRhcHRlci0+ZmxhZ3MyICYgVURQX1JTU19GTEFHUykpCi0JCQllX3dhcm4oZHJ2LCAiZW5hYmxpbmcgVURQIFJTUzogZnJhZ21lbnRlZCBwYWNrZXRzIgotCQkJICAgICAgICIgbWF5IGFycml2ZSBvdXQgb2Ygb3JkZXIgdG8gdGhlIHN0YWNrIGFib3ZlXG4iKTsKKwkJCWVfd2FybihkcnYsICJlbmFibGluZyBVRFAgUlNTOiBmcmFnbWVudGVkIHBhY2tldHMgbWF5IGFycml2ZSBvdXQgb2Ygb3JkZXIgdG8gdGhlIHN0YWNrIGFib3ZlXG4iKTsKIAogCQlhZGFwdGVyLT5mbGFnczIgPSBmbGFnczI7CiAKQEAgLTMwOTksNSArMzA4OSw1IEBACiAKIHZvaWQgaXhnYmVfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJml4Z2JlX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJml4Z2JlX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5oCmluZGV4IGIxNmNjNzguLjA3NzJiNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2Zjb2UuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9mY29lLmgKQEAgLTgxLDkgKzgxLDcgQEAKIAl2b2lkICpleHRyYV9kZHBfYnVmZmVyOwogCWRtYV9hZGRyX3QgZXh0cmFfZGRwX2J1ZmZlcl9kbWE7CiAJdW5zaWduZWQgbG9uZyBtb2RlOwotI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAl1OCB1cDsKLSNlbmRpZgogfTsKIAogI2VuZGlmIC8qIF9JWEdCRV9GQ09FX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2xpYi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbGliLmMKaW5kZXggMjA2N2QzOS4uMmQ5NDUxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbGliLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbGliLmMKQEAgLTExMTMsOCArMTExMyw4IEBACiAJZXJyID0gcGNpX2VuYWJsZV9tc2koYWRhcHRlci0+cGRldik7CiAJaWYgKGVycikgewogCQluZXRpZl9wcmludGsoYWRhcHRlciwgaHcsIEtFUk5fREVCVUcsIGFkYXB0ZXItPm5ldGRldiwKLQkJCSAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0kgaW50ZXJydXB0LCAiCi0JCQkgICAgICJmYWxsaW5nIGJhY2sgdG8gbGVnYWN5LiAgRXJyb3I6ICVkXG4iLCBlcnIpOworCQkJICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQsIGZhbGxpbmcgYmFjayB0byBsZWdhY3kuICBFcnJvcjogJWRcbiIsCisJCQkgICAgIGVycik7CiAJCXJldHVybjsKIAl9CiAJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19NU0lfRU5BQkxFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCBjMDQ3YzNlLi5mNWFhMzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJaXhnYmVfc2VydmljZV9ldmVudF9zY2hlZHVsZShhZGFwdGVyKTsKIH0KIAotdm9pZCBpeGdiZV9jaGVja19yZW1vdmUoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZykKK3N0YXRpYyB2b2lkIGl4Z2JlX2NoZWNrX3JlbW92ZShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnKQogewogCXUzMiB2YWx1ZTsKIApAQCAtMzIwLDYgKzMyMCwzMiBAQAogCQlpeGdiZV9yZW1vdmVfYWRhcHRlcihodyk7CiB9CiAKKy8qKgorICogaXhnYmVfcmVhZF9yZWcgLSBSZWFkIGZyb20gZGV2aWNlIHJlZ2lzdGVyCisgKiBAaHc6IGh3IHNwZWNpZmljIGRldGFpbHMKKyAqIEByZWc6IG9mZnNldCBvZiByZWdpc3RlciB0byByZWFkCisgKgorICogUmV0dXJucyA6IHZhbHVlIHJlYWQgb3IgSVhHQkVfRkFJTEVEX1JFQURfUkVHIGlmIHJlbW92ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkZXZpY2UgcmVnaXN0ZXJzLiBJdCBjaGVja3MgZm9yIGRldmljZQorICogcmVtb3ZhbCBieSBjb25maXJtaW5nIGFueSByZWFkIHRoYXQgcmV0dXJucyBhbGwgb25lcyBieSBjaGVja2luZyB0aGUKKyAqIHN0YXR1cyByZWdpc3RlciB2YWx1ZSBmb3IgYWxsIG9uZXMuIFRoaXMgZnVuY3Rpb24gYXZvaWRzIHJlYWRpbmcgZnJvbQorICogdGhlIGhhcmR3YXJlIGlmIGEgcmVtb3ZhbCB3YXMgcHJldmlvdXNseSBkZXRlY3RlZCBpbiB3aGljaCBjYXNlIGl0CisgKiByZXR1cm5zIElYR0JFX0ZBSUxFRF9SRUFEX1JFRyAoYWxsIG9uZXMpLgorICovCit1MzIgaXhnYmVfcmVhZF9yZWcoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZykKK3sKKwl1OCBfX2lvbWVtICpyZWdfYWRkciA9IEFDQ0VTU19PTkNFKGh3LT5od19hZGRyKTsKKwl1MzIgdmFsdWU7CisKKwlpZiAoaXhnYmVfcmVtb3ZlZChyZWdfYWRkcikpCisJCXJldHVybiBJWEdCRV9GQUlMRURfUkVBRF9SRUc7CisJdmFsdWUgPSByZWFkbChyZWdfYWRkciArIHJlZyk7CisJaWYgKHVubGlrZWx5KHZhbHVlID09IElYR0JFX0ZBSUxFRF9SRUFEX1JFRykpCisJCWl4Z2JlX2NoZWNrX3JlbW92ZShodywgcmVnKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKIHN0YXRpYyBib29sIGl4Z2JlX2NoZWNrX2NmZ19yZW1vdmUoc3RydWN0IGl4Z2JlX2h3ICpodywgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTE2IHZhbHVlOwpAQCAtMzc0MywzNSArMzc2OSw2IEBACiB9CiAKIC8qKgotICogaXhnYmVfdmxhbl9maWx0ZXJfZGlzYWJsZSAtIGhlbHBlciB0byBkaXNhYmxlIGh3IHZsYW4gZmlsdGVyaW5nCi0gKiBAYWRhcHRlcjogZHJpdmVyIGRhdGEKLSAqLwotc3RhdGljIHZvaWQgaXhnYmVfdmxhbl9maWx0ZXJfZGlzYWJsZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiB2bG5jdHJsOwotCi0JdmxuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WTE5DVFJMKTsKLQl2bG5jdHJsICY9IH4oSVhHQkVfVkxOQ1RSTF9WRkUgfCBJWEdCRV9WTE5DVFJMX0NGSUVOKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZMTkNUUkwsIHZsbmN0cmwpOwotfQotCi0vKioKLSAqIGl4Z2JlX3ZsYW5fZmlsdGVyX2VuYWJsZSAtIGhlbHBlciB0byBlbmFibGUgaHcgdmxhbiBmaWx0ZXJpbmcKLSAqIEBhZGFwdGVyOiBkcml2ZXIgZGF0YQotICovCi1zdGF0aWMgdm9pZCBpeGdiZV92bGFuX2ZpbHRlcl9lbmFibGUoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgdmxuY3RybDsKLQotCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7Ci0JdmxuY3RybCB8PSBJWEdCRV9WTE5DVFJMX1ZGRTsKLQl2bG5jdHJsICY9IH5JWEdCRV9WTE5DVFJMX0NGSUVOOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7Ci19Ci0KLS8qKgogICogaXhnYmVfdmxhbl9zdHJpcF9kaXNhYmxlIC0gaGVscGVyIHRvIGRpc2FibGUgaHcgdmxhbiBzdHJpcHBpbmcKICAqIEBhZGFwdGVyOiBkcml2ZXIgZGF0YQogICovCkBAIC0zODUwLDYgKzM4NDcsMTU4IEBACiB9CiAKIC8qKgorICogaXhnYmVfd3JpdGVfbWNfYWRkcl9saXN0IC0gd3JpdGUgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBNVEEKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBXcml0ZXMgbXVsdGljYXN0IGFkZHJlc3MgbGlzdCB0byB0aGUgTVRBIGhhc2ggdGFibGUuCisgKiBSZXR1cm5zOiAtRU5PTUVNIG9uIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgIDAgb24gbm8gYWRkcmVzc2VzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgIFggb24gd3JpdGluZyBYIGFkZHJlc3NlcyB0byBNVEEKKyAqKi8KK3N0YXRpYyBpbnQgaXhnYmVfd3JpdGVfbWNfYWRkcl9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHctPm1hYy5vcHMudXBkYXRlX21jX2FkZHJfbGlzdCkKKwkJaHctPm1hYy5vcHMudXBkYXRlX21jX2FkZHJfbGlzdChodywgbmV0ZGV2KTsKKwllbHNlCisJCXJldHVybiAtRU5PTUVNOworCisjaWZkZWYgQ09ORklHX1BDSV9JT1YKKwlpeGdiZV9yZXN0b3JlX3ZmX211bHRpY2FzdHMoYWRhcHRlcik7CisjZW5kaWYKKworCXJldHVybiBuZXRkZXZfbWNfY291bnQobmV0ZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QQ0lfSU9WCit2b2lkIGl4Z2JlX2Z1bGxfc3luY19tYWNfdGFibGUoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm1hYy5udW1fcmFyX2VudHJpZXM7IGkrKykgeworCQlpZiAoYWRhcHRlci0+bWFjX3RhYmxlW2ldLnN0YXRlICYgSVhHQkVfTUFDX1NUQVRFX0lOX1VTRSkKKwkJCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIGksIGFkYXB0ZXItPm1hY190YWJsZVtpXS5hZGRyLAorCQkJCQkgICAgYWRhcHRlci0+bWFjX3RhYmxlW2ldLnF1ZXVlLAorCQkJCQkgICAgSVhHQkVfUkFIX0FWKTsKKwkJZWxzZQorCQkJaHctPm1hYy5vcHMuY2xlYXJfcmFyKGh3LCBpKTsKKworCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJj0gfihJWEdCRV9NQUNfU1RBVEVfTU9ESUZJRUQpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpeGdiZV9zeW5jX21hY190YWJsZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm51bV9yYXJfZW50cmllczsgaSsrKSB7CisJCWlmIChhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJiBJWEdCRV9NQUNfU1RBVEVfTU9ESUZJRUQpIHsKKwkJCWlmIChhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJgorCQkJICAgIElYR0JFX01BQ19TVEFURV9JTl9VU0UpCisJCQkJaHctPm1hYy5vcHMuc2V0X3JhcihodywgaSwKKwkJCQkJCWFkYXB0ZXItPm1hY190YWJsZVtpXS5hZGRyLAorCQkJCQkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnF1ZXVlLAorCQkJCQkJSVhHQkVfUkFIX0FWKTsKKwkJCWVsc2UKKwkJCQlody0+bWFjLm9wcy5jbGVhcl9yYXIoaHcsIGkpOworCisJCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJj0KKwkJCQkJCX4oSVhHQkVfTUFDX1NUQVRFX01PRElGSUVEKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXhnYmVfZmx1c2hfc3dfbWFjX3RhYmxlKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm1hYy5udW1fcmFyX2VudHJpZXM7IGkrKykgeworCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgfD0gSVhHQkVfTUFDX1NUQVRFX01PRElGSUVEOworCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJj0gfklYR0JFX01BQ19TVEFURV9JTl9VU0U7CisJCW1lbXNldChhZGFwdGVyLT5tYWNfdGFibGVbaV0uYWRkciwgMCwgRVRIX0FMRU4pOworCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0ucXVldWUgPSAwOworCX0KKwlpeGdiZV9zeW5jX21hY190YWJsZShhZGFwdGVyKTsKK30KKworc3RhdGljIGludCBpeGdiZV9hdmFpbGFibGVfcmFycyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCWludCBpLCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm1hYy5udW1fcmFyX2VudHJpZXM7IGkrKykgeworCQlpZiAoYWRhcHRlci0+bWFjX3RhYmxlW2ldLnN0YXRlID09IDApCisJCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gZGVzdHJveXMgdGhlIGZpcnN0IFJBUiBlbnRyeSAqLworc3RhdGljIHZvaWQgaXhnYmVfbWFjX3NldF9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJIHU4ICphZGRyKQoreworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwltZW1jcHkoJmFkYXB0ZXItPm1hY190YWJsZVswXS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJYWRhcHRlci0+bWFjX3RhYmxlWzBdLnF1ZXVlID0gVk1EUV9QKDApOworCWFkYXB0ZXItPm1hY190YWJsZVswXS5zdGF0ZSA9IChJWEdCRV9NQUNfU1RBVEVfREVGQVVMVCB8CisJCQkJICAgICAgIElYR0JFX01BQ19TVEFURV9JTl9VU0UpOworCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIDAsIGFkYXB0ZXItPm1hY190YWJsZVswXS5hZGRyLAorCQkJICAgIGFkYXB0ZXItPm1hY190YWJsZVswXS5xdWV1ZSwKKwkJCSAgICBJWEdCRV9SQUhfQVYpOworfQorCitpbnQgaXhnYmVfYWRkX21hY19maWx0ZXIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICphZGRyLCB1MTYgcXVldWUpCit7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlpbnQgaTsKKworCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPm1hY190YWJsZVtpXS5zdGF0ZSAmIElYR0JFX01BQ19TVEFURV9JTl9VU0UpCisJCQljb250aW51ZTsKKwkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnN0YXRlIHw9IChJWEdCRV9NQUNfU1RBVEVfTU9ESUZJRUQgfAorCQkJCQkJSVhHQkVfTUFDX1NUQVRFX0lOX1VTRSk7CisJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tYWNfdGFibGVbaV0uYWRkciwgYWRkcik7CisJCWFkYXB0ZXItPm1hY190YWJsZVtpXS5xdWV1ZSA9IHF1ZXVlOworCQlpeGdiZV9zeW5jX21hY190YWJsZShhZGFwdGVyKTsKKwkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCitpbnQgaXhnYmVfZGVsX21hY19maWx0ZXIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICphZGRyLCB1MTYgcXVldWUpCit7CisJLyogc2VhcmNoIHRhYmxlIGZvciBhZGRyLCBpZiBmb3VuZCwgc2V0IHRvIDAgYW5kIHN5bmMgKi8KKwlpbnQgaTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm1hYy5udW1fcmFyX2VudHJpZXM7IGkrKykgeworCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChhZGRyLCBhZGFwdGVyLT5tYWNfdGFibGVbaV0uYWRkcikgJiYKKwkJICAgIGFkYXB0ZXItPm1hY190YWJsZVtpXS5xdWV1ZSA9PSBxdWV1ZSkgeworCQkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnN0YXRlIHw9IElYR0JFX01BQ19TVEFURV9NT0RJRklFRDsKKwkJCWFkYXB0ZXItPm1hY190YWJsZVtpXS5zdGF0ZSAmPSB+SVhHQkVfTUFDX1NUQVRFX0lOX1VTRTsKKwkJCW1lbXNldChhZGFwdGVyLT5tYWNfdGFibGVbaV0uYWRkciwgMCwgRVRIX0FMRU4pOworCQkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnF1ZXVlID0gMDsKKwkJCWl4Z2JlX3N5bmNfbWFjX3RhYmxlKGFkYXB0ZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisvKioKICAqIGl4Z2JlX3dyaXRlX3VjX2FkZHJfbGlzdCAtIHdyaXRlIHVuaWNhc3QgYWRkcmVzc2VzIHRvIFJBUiB0YWJsZQogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICoKQEAgLTM4NTgsMzkgKzQwMDcsMjMgQEAKICAqICAgICAgICAgICAgICAgIDAgb24gbm8gYWRkcmVzc2VzIHdyaXR0ZW4KICAqICAgICAgICAgICAgICAgIFggb24gd3JpdGluZyBYIGFkZHJlc3NlcyB0byB0aGUgUkFSIHRhYmxlCiAgKiovCi1zdGF0aWMgaW50IGl4Z2JlX3dyaXRlX3VjX2FkZHJfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGludCBpeGdiZV93cml0ZV91Y19hZGRyX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmbikKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1bnNpZ25lZCBpbnQgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllcyAtIDE7CiAJaW50IGNvdW50ID0gMDsKIAotCS8qIEluIFNSLUlPVi9WTURRIG1vZGVzIHNpZ25pZmljYW50bHkgbGVzcyBSQVIgZW50cmllcyBhcmUgYXZhaWxhYmxlICovCi0JaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKQotCQlyYXJfZW50cmllcyA9IElYR0JFX01BWF9QRl9NQUNWTEFOUyAtIDE7Ci0KIAkvKiByZXR1cm4gRU5PTUVNIGluZGljYXRpbmcgaW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgYWRkcmVzc2VzICovCi0JaWYgKG5ldGRldl91Y19jb3VudChuZXRkZXYpID4gcmFyX2VudHJpZXMpCisJaWYgKG5ldGRldl91Y19jb3VudChuZXRkZXYpID4gaXhnYmVfYXZhaWxhYmxlX3JhcnMoYWRhcHRlcikpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFuZXRkZXZfdWNfZW1wdHkobmV0ZGV2KSkgewogCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCQkvKiByZXR1cm4gZXJyb3IgaWYgd2UgZG8gbm90IHN1cHBvcnQgd3JpdGluZyB0byBSQVIgdGFibGUgKi8KLQkJaWYgKCFody0+bWFjLm9wcy5zZXRfcmFyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgewotCQkJaWYgKCFyYXJfZW50cmllcykKLQkJCQlicmVhazsKLQkJCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIHJhcl9lbnRyaWVzLS0sIGhhLT5hZGRyLAotCQkJCQkgICAgVk1EUV9QKDApLCBJWEdCRV9SQUhfQVYpOworCQkJaXhnYmVfZGVsX21hY19maWx0ZXIoYWRhcHRlciwgaGEtPmFkZHIsIHZmbik7CisJCQlpeGdiZV9hZGRfbWFjX2ZpbHRlcihhZGFwdGVyLCBoYS0+YWRkciwgdmZuKTsKIAkJCWNvdW50Kys7CiAJCX0KIAl9Ci0JLyogd3JpdGUgdGhlIGFkZHJlc3NlcyBpbiByZXZlcnNlIG9yZGVyIHRvIGF2b2lkIHdyaXRlIGNvbWJpbmluZyAqLwotCWZvciAoOyByYXJfZW50cmllcyA+IDAgOyByYXJfZW50cmllcy0tKQotCQlody0+bWFjLm9wcy5jbGVhcl9yYXIoaHcsIHJhcl9lbnRyaWVzKTsKLQogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzkwOCwxMSArNDA0MSwxMiBAQAogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBmY3RybCwgdm1vbHIgPSBJWEdCRV9WTU9MUl9CQU0gfCBJWEdCRV9WTU9MUl9BVVBFOworCXUzMiB2bG5jdHJsOwogCWludCBjb3VudDsKIAogCS8qIENoZWNrIGZvciBQcm9taXNjdW91cyBhbmQgQWxsIE11bHRpY2FzdCBtb2RlcyAqLwotCiAJZmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNUUkwpOworCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7CiAKIAkvKiBzZXQgYWxsIGJpdHMgdGhhdCB3ZSBleHBlY3QgdG8gYWx3YXlzIGJlIHNldCAqLwogCWZjdHJsICY9IH5JWEdCRV9GQ1RSTF9TQlA7IC8qIGRpc2FibGUgc3RvcmUtYmFkLXBhY2tldHMgKi8KQEAgLTM5MjIsMjYgKzQwNTYsMjQgQEAKIAogCS8qIGNsZWFyIHRoZSBiaXRzIHdlIGFyZSBjaGFuZ2luZyB0aGUgc3RhdHVzIG9mICovCiAJZmN0cmwgJj0gfihJWEdCRV9GQ1RSTF9VUEUgfCBJWEdCRV9GQ1RSTF9NUEUpOwotCisJdmxuY3RybCAmPSB+KElYR0JFX1ZMTkNUUkxfVkZFIHwgSVhHQkVfVkxOQ1RSTF9DRklFTik7CiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewogCQlody0+YWRkcl9jdHJsLnVzZXJfc2V0X3Byb21pc2MgPSB0cnVlOwogCQlmY3RybCB8PSAoSVhHQkVfRkNUUkxfVVBFIHwgSVhHQkVfRkNUUkxfTVBFKTsKLQkJdm1vbHIgfD0gKElYR0JFX1ZNT0xSX1JPUEUgfCBJWEdCRV9WTU9MUl9NUEUpOworCQl2bW9sciB8PSBJWEdCRV9WTU9MUl9NUEU7CiAJCS8qIE9ubHkgZGlzYWJsZSBoYXJkd2FyZSBmaWx0ZXIgdmxhbnMgaW4gcHJvbWlzY3VvdXMgbW9kZQogCQkgKiBpZiBTUi1JT1YgYW5kIFZNRFEgYXJlIGRpc2FibGVkIC0gb3RoZXJ3aXNlIGVuc3VyZQogCQkgKiB0aGF0IGhhcmR3YXJlIFZMQU4gZmlsdGVycyByZW1haW4gZW5hYmxlZC4KIAkJICovCiAJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgKElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEIHwKIAkJCQkJSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSkpCi0JCQlpeGdiZV92bGFuX2ZpbHRlcl9kaXNhYmxlKGFkYXB0ZXIpOwotCQllbHNlCi0JCQlpeGdiZV92bGFuX2ZpbHRlcl9lbmFibGUoYWRhcHRlcik7CisJCQl2bG5jdHJsIHw9IChJWEdCRV9WTE5DVFJMX1ZGRSB8IElYR0JFX1ZMTkNUUkxfQ0ZJRU4pOwogCX0gZWxzZSB7CiAJCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CiAJCQlmY3RybCB8PSBJWEdCRV9GQ1RSTF9NUEU7CiAJCQl2bW9sciB8PSBJWEdCRV9WTU9MUl9NUEU7CiAJCX0KLQkJaXhnYmVfdmxhbl9maWx0ZXJfZW5hYmxlKGFkYXB0ZXIpOworCQl2bG5jdHJsIHw9IElYR0JFX1ZMTkNUUkxfVkZFOwogCQlody0+YWRkcl9jdHJsLnVzZXJfc2V0X3Byb21pc2MgPSBmYWxzZTsKIAl9CiAKQEAgLTM5NTAsNyArNDA4Miw3IEBACiAJICogc3VmZmljaWVudCBzcGFjZSB0byBzdG9yZSBhbGwgdGhlIGFkZHJlc3NlcyB0aGVuIGVuYWJsZQogCSAqIHVuaWNhc3QgcHJvbWlzY3VvdXMgbW9kZQogCSAqLwotCWNvdW50ID0gaXhnYmVfd3JpdGVfdWNfYWRkcl9saXN0KG5ldGRldik7CisJY291bnQgPSBpeGdiZV93cml0ZV91Y19hZGRyX2xpc3QobmV0ZGV2LCBWTURRX1AoMCkpOwogCWlmIChjb3VudCA8IDApIHsKIAkJZmN0cmwgfD0gSVhHQkVfRkNUUkxfVVBFOwogCQl2bW9sciB8PSBJWEdCRV9WTU9MUl9ST1BFOwpAQCAtMzk2MCwxMSArNDA5MiwxMyBAQAogCSAqIHRoZW4gd2Ugc2hvdWxkIGp1c3QgdHVybiBvbiBwcm9taXNjdW91cyBtb2RlIHNvCiAJICogdGhhdCB3ZSBjYW4gYXQgbGVhc3QgcmVjZWl2ZSBtdWx0aWNhc3QgdHJhZmZpYwogCSAqLwotCWh3LT5tYWMub3BzLnVwZGF0ZV9tY19hZGRyX2xpc3QoaHcsIG5ldGRldik7Ci0Jdm1vbHIgfD0gSVhHQkVfVk1PTFJfUk9NUEU7Ci0KLQlpZiAoYWRhcHRlci0+bnVtX3ZmcykKLQkJaXhnYmVfcmVzdG9yZV92Zl9tdWx0aWNhc3RzKGFkYXB0ZXIpOworCWNvdW50ID0gaXhnYmVfd3JpdGVfbWNfYWRkcl9saXN0KG5ldGRldik7CisJaWYgKGNvdW50IDwgMCkgeworCQlmY3RybCB8PSBJWEdCRV9GQ1RSTF9NUEU7CisJCXZtb2xyIHw9IElYR0JFX1ZNT0xSX01QRTsKKwl9IGVsc2UgaWYgKGNvdW50KSB7CisJCXZtb2xyIHw9IElYR0JFX1ZNT0xSX1JPTVBFOworCX0KIAogCWlmIChody0+bWFjLnR5cGUgIT0gaXhnYmVfbWFjXzgyNTk4RUIpIHsKIAkJdm1vbHIgfD0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZNT0xSKFZNRFFfUCgwKSkpICYKQEAgLTM5ODUsNiArNDExOSw3IEBACiAJCS8qIE5PVEU6ICBWTEFOIGZpbHRlcmluZyBpcyBkaXNhYmxlZCBieSBzZXR0aW5nIFBST01JU0MgKi8KIAl9CiAKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZMTkNUUkwsIHZsbmN0cmwpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNUUkwsIGZjdHJsKTsKIAogCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpCkBAIC00MTAxLDggKzQyMzYsOCBAQAogCSAgICAodGMgPCBJWEdCRV9GQ09FX0pVTUJPX0ZSQU1FX1NJWkUpICYmCiAJICAgIChwYiA9PSBpeGdiZV9mY29lX2dldF90YyhhZGFwdGVyKSkpCiAJCXRjID0gSVhHQkVfRkNPRV9KVU1CT19GUkFNRV9TSVpFOwotCiAjZW5kaWYKKwogCS8qIENhbGN1bGF0ZSBkZWxheSB2YWx1ZSBmb3IgZGV2aWNlICovCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKIAljYXNlIGl4Z2JlX21hY19YNTQwOgpAQCAtNDE0Myw3ICs0Mjc4LDcgQEAKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZSB0byBjYWxjdWxhdGUgZm9yCiAgKiBAcGI6IHBhY2tldCBidWZmZXIgdG8gY2FsY3VsYXRlCiAgKi8KLXN0YXRpYyBpbnQgaXhnYmVfbHBidGhyZXNoKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBpeGdiZV9scGJ0aHJlc2goc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwYikKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CkBAIC00MTUzLDYgKzQyODgsMTQgQEAKIAkvKiBDYWxjdWxhdGUgbWF4IExBTiBmcmFtZSBzaXplICovCiAJdGMgPSBkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU47CiAKKyNpZmRlZiBJWEdCRV9GQ09FCisJLyogRkNvRSB0cmFmZmljIGNsYXNzIHVzZXMgRkNPRSBqdW1ibyBmcmFtZXMgKi8KKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZDT0VfTVRVKSAmJgorCSAgICAodGMgPCBJWEdCRV9GQ09FX0pVTUJPX0ZSQU1FX1NJWkUpICYmCisJICAgIChwYiA9PSBuZXRkZXZfZ2V0X3ByaW9fdGNfbWFwKGRldiwgYWRhcHRlci0+ZmNvZS51cCkpKQorCQl0YyA9IElYR0JFX0ZDT0VfSlVNQk9fRlJBTUVfU0laRTsKKyNlbmRpZgorCiAJLyogQ2FsY3VsYXRlIGRlbGF5IHZhbHVlIGZvciBkZXZpY2UgKi8KIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgaXhnYmVfbWFjX1g1NDA6CkBAIC00MTc5LDE1ICs0MzIyLDE3IEBACiAJaWYgKCFudW1fdGMpCiAJCW51bV90YyA9IDE7CiAKLQlody0+ZmMubG93X3dhdGVyID0gaXhnYmVfbHBidGhyZXNoKGFkYXB0ZXIpOwotCiAJZm9yIChpID0gMDsgaSA8IG51bV90YzsgaSsrKSB7CiAJCWh3LT5mYy5oaWdoX3dhdGVyW2ldID0gaXhnYmVfaHBidGhyZXNoKGFkYXB0ZXIsIGkpOworCQlody0+ZmMubG93X3dhdGVyW2ldID0gaXhnYmVfbHBidGhyZXNoKGFkYXB0ZXIsIGkpOwogCiAJCS8qIExvdyB3YXRlciBtYXJrcyBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBoaWdoIHdhdGVyIG1hcmtzICovCi0JCWlmIChody0+ZmMubG93X3dhdGVyID4gaHctPmZjLmhpZ2hfd2F0ZXJbaV0pCi0JCQlody0+ZmMubG93X3dhdGVyID0gMDsKKwkJaWYgKGh3LT5mYy5sb3dfd2F0ZXJbaV0gPiBody0+ZmMuaGlnaF93YXRlcltpXSkKKwkJCWh3LT5mYy5sb3dfd2F0ZXJbaV0gPSAwOwogCX0KKworCWZvciAoOyBpIDwgTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykKKwkJaHctPmZjLmhpZ2hfd2F0ZXJbaV0gPSAwOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9jb25maWd1cmVfcGIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00MjQ5LDIwICs0Mzk0LDEwIEBACiAJCXZtb2xyIHw9IElYR0JFX1ZNT0xSX1JPTVBFOwogCQlody0+bWFjLm9wcy51cGRhdGVfbWNfYWRkcl9saXN0KGh3LCBkZXYpOwogCX0KLQlpeGdiZV93cml0ZV91Y19hZGRyX2xpc3QoYWRhcHRlci0+bmV0ZGV2KTsKKwlpeGdiZV93cml0ZV91Y19hZGRyX2xpc3QoYWRhcHRlci0+bmV0ZGV2LCBwb29sKTsKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZNT0xSKHBvb2wpLCB2bW9scik7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX2FkZF9tYWNfZmlsdGVyKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSB1OCAqYWRkciwgdTE2IHBvb2wpCi17Ci0Jc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1bnNpZ25lZCBpbnQgZW50cnk7Ci0KLQllbnRyeSA9IGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzIC0gcG9vbDsKLQlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCBlbnRyeSwgYWRkciwgVk1EUV9QKHBvb2wpLCBJWEdCRV9SQUhfQVYpOwotfQotCiBzdGF0aWMgdm9pZCBpeGdiZV9md2RfcHNydHlwZShzdHJ1Y3QgaXhnYmVfZndkX2FkYXB0ZXIgKnZhZGFwdGVyKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gdmFkYXB0ZXItPnJlYWxfYWRhcHRlcjsKQEAgLTQ1MjEsNiArNDY1Niw4IEBACiAJY2FzZSBpeGdiZV9waHlfcXNmcF9hY3RpdmVfdW5rbm93bjoKIAljYXNlIGl4Z2JlX3BoeV9xc2ZwX2ludGVsOgogCWNhc2UgaXhnYmVfcGh5X3FzZnBfdW5rbm93bjoKKwkvKiBpeGdiZV9waHlfbm9uZSBpcyBzZXQgd2hlbiBubyBTRlAgbW9kdWxlIGlzIHByZXNlbnQgKi8KKwljYXNlIGl4Z2JlX3BoeV9ub25lOgogCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIGl4Z2JlX3BoeV9ubDoKIAkJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKQEAgLTQ3NDIsNyArNDg3OSw5IEBACiB2b2lkIGl4Z2JlX3Jlc2V0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlpbnQgZXJyOworCXU4IG9sZF9hZGRyW0VUSF9BTEVOXTsKIAogCWlmIChpeGdiZV9yZW1vdmVkKGh3LT5od19hZGRyKSkKIAkJcmV0dXJuOwpAQCAtNDc3OCw5ICs0OTE3LDEwIEBACiAJfQogCiAJY2xlYXJfYml0KF9fSVhHQkVfSU5fU0ZQX0lOSVQsICZhZGFwdGVyLT5zdGF0ZSk7Ci0KLQkvKiByZXByb2dyYW0gdGhlIFJBUlswXSBpbiBjYXNlIHVzZXIgY2hhbmdlZCBpdC4gKi8KLQlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCAwLCBody0+bWFjLmFkZHIsIFZNRFFfUCgwKSwgSVhHQkVfUkFIX0FWKTsKKwkvKiBkbyBub3QgZmx1c2ggdXNlciBzZXQgYWRkcmVzc2VzICovCisJbWVtY3B5KG9sZF9hZGRyLCAmYWRhcHRlci0+bWFjX3RhYmxlWzBdLmFkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCWl4Z2JlX2ZsdXNoX3N3X21hY190YWJsZShhZGFwdGVyKTsKKwlpeGdiZV9tYWNfc2V0X2RlZmF1bHRfZmlsdGVyKGFkYXB0ZXIsIG9sZF9hZGRyKTsKIAogCS8qIHVwZGF0ZSBTQU4gTUFDIHZtZHEgcG9vbCBzZWxlY3Rpb24gKi8KIAlpZiAoaHctPm1hYy5zYW5fbWFjX3Jhcl9pbmRleCkKQEAgLTUwMjYsNiArNTE2NiwxMCBAQAogI2VuZGlmIC8qIENPTkZJR19JWEdCRV9EQ0IgKi8KICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCiAKKwlhZGFwdGVyLT5tYWNfdGFibGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXhnYmVfbWFjX2FkZHIpICoKKwkJCQkgICAgIGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzLAorCQkJCSAgICAgR0ZQX0FUT01JQyk7CisKIAkvKiBTZXQgTUFDIHNwZWNpZmljIGNhcGFiaWxpdHkgZmxhZ3MgYW5kIGV4Y2VwdGlvbnMgKi8KIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6CkBAIC01NTE3LDYgKzU2NjEsMTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBpeGdiZV9jbG9zZV9zdXNwZW5kKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWl4Z2JlX3B0cF9zdXNwZW5kKGFkYXB0ZXIpOworCisJaXhnYmVfZG93bihhZGFwdGVyKTsKKwlpeGdiZV9mcmVlX2lycShhZGFwdGVyKTsKKworCWl4Z2JlX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpeGdiZV9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7Cit9CisKIC8qKgogICogaXhnYmVfY2xvc2UgLSBEaXNhYmxlcyBhIG5ldHdvcmsgaW50ZXJmYWNlCiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCkBAIC01NTM0LDE0ICs1Njg5LDEwIEBACiAKIAlpeGdiZV9wdHBfc3RvcChhZGFwdGVyKTsKIAotCWl4Z2JlX2Rvd24oYWRhcHRlcik7Ci0JaXhnYmVfZnJlZV9pcnEoYWRhcHRlcik7CisJaXhnYmVfY2xvc2Vfc3VzcGVuZChhZGFwdGVyKTsKIAogCWl4Z2JlX2ZkaXJfZmlsdGVyX2V4aXQoYWRhcHRlcik7CiAKLQlpeGdiZV9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7Ci0JaXhnYmVfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwotCiAJaXhnYmVfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CkBAIC01NjA4LDEyICs1NzU5LDggQEAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CiAKIAlydG5sX2xvY2soKTsKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCWl4Z2JlX2Rvd24oYWRhcHRlcik7Ci0JCWl4Z2JlX2ZyZWVfaXJxKGFkYXB0ZXIpOwotCQlpeGdiZV9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7Ci0JCWl4Z2JlX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKLQl9CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJaXhnYmVfY2xvc2Vfc3VzcGVuZChhZGFwdGVyKTsKIAlydG5sX3VubG9jaygpOwogCiAJaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKQEAgLTU5NDUsNyArNjA5Miw3IEBACiAJaWYgKGl4Z2JlX3JlaW5pdF9mZGlyX3RhYmxlc184MjU5OShodykgPT0gMCkgewogCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaSsrKQogCQkJc2V0X2JpdChfX0lYR0JFX1RYX0ZESVJfSU5JVF9ET05FLAotCQkJICAgICAgICAmKGFkYXB0ZXItPnR4X3JpbmdbaV0tPnN0YXRlKSk7CisJCQkJJihhZGFwdGVyLT50eF9yaW5nW2ldLT5zdGF0ZSkpOwogCQkvKiByZS1lbmFibGUgZmxvdyBkaXJlY3RvciBpbnRlcnJ1cHRzICovCiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlNUywgSVhHQkVfRUlNU19GTE9XX0RJUik7CiAJfSBlbHNlIHsKQEAgLTcxNzIsMTYgKzczMTksMTcgQEAKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCWludCByZXQ7CiAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAorCWl4Z2JlX2RlbF9tYWNfZmlsdGVyKGFkYXB0ZXIsIGh3LT5tYWMuYWRkciwgVk1EUV9QKDApKTsKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CiAJbWVtY3B5KGh3LT5tYWMuYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CiAKLQlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCAwLCBody0+bWFjLmFkZHIsIFZNRFFfUCgwKSwgSVhHQkVfUkFIX0FWKTsKLQotCXJldHVybiAwOworCXJldCA9IGl4Z2JlX2FkZF9tYWNfZmlsdGVyKGFkYXB0ZXIsIGh3LT5tYWMuYWRkciwgVk1EUV9QKDApKTsKKwlyZXR1cm4gcmV0ID4gMCA/IDAgOiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTc3ODMsNyArNzkzMSw3IEBACiAJLm5kb19kb19pb2N0bAkJPSBpeGdiZV9pb2N0bCwKIAkubmRvX3NldF92Zl9tYWMJCT0gaXhnYmVfbmRvX3NldF92Zl9tYWMsCiAJLm5kb19zZXRfdmZfdmxhbgk9IGl4Z2JlX25kb19zZXRfdmZfdmxhbiwKLQkubmRvX3NldF92Zl90eF9yYXRlCT0gaXhnYmVfbmRvX3NldF92Zl9idywKKwkubmRvX3NldF92Zl9yYXRlCT0gaXhnYmVfbmRvX3NldF92Zl9idywKIAkubmRvX3NldF92Zl9zcG9vZmNoawk9IGl4Z2JlX25kb19zZXRfdmZfc3Bvb2ZjaGssCiAJLm5kb19nZXRfdmZfY29uZmlnCT0gaXhnYmVfbmRvX2dldF92Zl9jb25maWcsCiAJLm5kb19nZXRfc3RhdHM2NAk9IGl4Z2JlX2dldF9zdGF0czY0LApAQCAtODE4Nyw2ICs4MzM1LDggQEAKIAkJZ290byBlcnJfc3dfaW5pdDsKIAl9CiAKKwlpeGdiZV9tYWNfc2V0X2RlZmF1bHRfZmlsdGVyKGFkYXB0ZXIsIGh3LT5tYWMucGVybV9hZGRyKTsKKwogCXNldHVwX3RpbWVyKCZhZGFwdGVyLT5zZXJ2aWNlX3RpbWVyLCAmaXhnYmVfc2VydmljZV90aW1lciwKIAkJICAgICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyKTsKIApAQCAtODI0Miw3ICs4MzkyLDcgQEAKIAlpZiAoaXhnYmVfaXNfc2ZwKGh3KSAmJiBody0+cGh5LnNmcF90eXBlICE9IGl4Z2JlX3NmcF90eXBlX25vdF9wcmVzZW50KQogCQllX2Rldl9pbmZvKCJNQUM6ICVkLCBQSFk6ICVkLCBTRlArOiAlZCwgUEJBIE5vOiAlc1xuIiwKIAkJCSAgIGh3LT5tYWMudHlwZSwgaHctPnBoeS50eXBlLCBody0+cGh5LnNmcF90eXBlLAotCQkgICAgICAgICAgIHBhcnRfc3RyKTsKKwkJCSAgIHBhcnRfc3RyKTsKIAllbHNlCiAJCWVfZGV2X2luZm8oIk1BQzogJWQsIFBIWTogJWQsIFBCQSBObzogJXNcbiIsCiAJCQkgICBody0+bWFjLnR5cGUsIGh3LT5waHkudHlwZSwgcGFydF9zdHIpOwpAQCAtODMwNCw4ICs4NDU0LDggQEAKIAogCWl4Z2JlX2RiZ19hZGFwdGVyX2luaXQoYWRhcHRlcik7CiAKLQkvKiBOZWVkIGxpbmsgc2V0dXAgZm9yIE1ORyBGVywgZWxzZSB3YWl0IGZvciBJWEdCRV9VUCAqLwotCWlmIChpeGdiZV9tbmdfZW5hYmxlZChodykgJiYgaHctPm1hYy5vcHMuc2V0dXBfbGluaykKKwkvKiBzZXR1cCBsaW5rIGZvciBTRlAgZGV2aWNlcyB3aXRoIE1ORyBGVywgZWxzZSB3YWl0IGZvciBJWEdCRV9VUCAqLworCWlmIChpeGdiZV9tbmdfZW5hYmxlZChodykgJiYgaXhnYmVfaXNfc2ZwKGh3KSAmJiBody0+bWFjLm9wcy5zZXR1cF9saW5rKQogCQlody0+bWFjLm9wcy5zZXR1cF9saW5rKGh3LAogCQkJSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwgfCBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMLAogCQkJdHJ1ZSk7CkBAIC04MzE5LDYgKzg0NjksNyBAQAogCWl4Z2JlX2Rpc2FibGVfc3Jpb3YoYWRhcHRlcik7CiAJYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9TRUFSQ0hfRk9SX1NGUDsKIAlpb3VubWFwKGFkYXB0ZXItPmlvX2FkZHIpOworCWtmcmVlKGFkYXB0ZXItPm1hY190YWJsZSk7CiBlcnJfaW9yZW1hcDoKIAlmcmVlX25ldGRldihuZXRkZXYpOwogZXJyX2FsbG9jX2V0aGVyZGV2OgpAQCAtODM5Miw2ICs4NTQzLDcgQEAKIAogCWVfZGV2X2luZm8oImNvbXBsZXRlXG4iKTsKIAorCWtmcmVlKGFkYXB0ZXItPm1hY190YWJsZSk7CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAogCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguYwppbmRleCBmNWM2YWYyLi4xOTE4ZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgKiAgcmVjZWl2ZWQgYW4gYWNrIHRvIHRoYXQgbWVzc2FnZSB3aXRoaW4gZGVsYXkgKiB0aW1lb3V0IHBlcmlvZAogICoqLwogc3RhdGljIHMzMiBpeGdiZV93cml0ZV9wb3N0ZWRfbWJ4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqbXNnLCB1MTYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBtYnhfaWQpCisJCQkgICB1MTYgbWJ4X2lkKQogewogCXN0cnVjdCBpeGdiZV9tYnhfaW5mbyAqbWJ4ID0gJmh3LT5tYng7CiAJczMyIHJldF92YWwgPSBJWEdCRV9FUlJfTUJYOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJdTMyIHZmX2JpdCA9IHZmX251bWJlciAlIDE2OwogCiAJaWYgKCFpeGdiZV9jaGVja19mb3JfYml0X3BmKGh3LCBJWEdCRV9NQlZGSUNSX1ZGUkVRX1ZGMSA8PCB2Zl9iaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSkgeworCQkJCSAgICBpbmRleCkpIHsKIAkJcmV0X3ZhbCA9IDA7CiAJCWh3LT5tYnguc3RhdHMucmVxcysrOwogCX0KQEAgLTI5MSw3ICsyOTEsNyBAQAogCXUzMiB2Zl9iaXQgPSB2Zl9udW1iZXIgJSAxNjsKIAogCWlmICghaXhnYmVfY2hlY2tfZm9yX2JpdF9wZihodywgSVhHQkVfTUJWRklDUl9WRkFDS19WRjEgPDwgdmZfYml0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkpIHsKKwkJCQkgICAgaW5kZXgpKSB7CiAJCXJldF92YWwgPSAwOwogCQlody0+bWJ4LnN0YXRzLmFja3MrKzsKIAl9CkBAIC0zNjYsNyArMzY2LDcgQEAKICAqICByZXR1cm5zIFNVQ0NFU1MgaWYgaXQgc3VjY2Vzc2Z1bGx5IGNvcGllZCBtZXNzYWdlIGludG8gdGhlIGJ1ZmZlcgogICoqLwogc3RhdGljIHMzMiBpeGdiZV93cml0ZV9tYnhfcGYoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICptc2csIHUxNiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHZmX251bWJlcikKKwkJCSAgICAgIHUxNiB2Zl9udW1iZXIpCiB7CiAJczMyIHJldF92YWw7CiAJdTE2IGk7CkBAIC00MDcsNyArNDA3LDcgQEAKICAqICBhIG1lc3NhZ2UgZHVlIHRvIGEgVkYgcmVxdWVzdCBzbyBubyBwb2xsaW5nIGZvciBtZXNzYWdlIGlzIG5lZWRlZC4KICAqKi8KIHN0YXRpYyBzMzIgaXhnYmVfcmVhZF9tYnhfcGYoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICptc2csIHUxNiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmZfbnVtYmVyKQorCQkJICAgICB1MTYgdmZfbnVtYmVyKQogewogCXMzMiByZXRfdmFsOwogCXUxNiBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguaAppbmRleCBhOWI5YWQ2Li5hNWNiNzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYnguaApAQCAtNTQsMTEgKzU0LDExIEBACiAgKiBNZXNzYWdlIEFDSydzIGFyZSB0aGUgdmFsdWUgb3InZCB3aXRoIDB4RjAwMDAwMDAKICAqLwogI2RlZmluZSBJWEdCRV9WVF9NU0dUWVBFX0FDSyAgICAgIDB4ODAwMDAwMDAgIC8qIE1lc3NhZ2VzIGJlbG93IG9yJ2Qgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYXJlIHRoZSBBQ0sgKi8KKwkJCQkJICAgICAgICogdGhpcyBhcmUgdGhlIEFDSyAqLwogI2RlZmluZSBJWEdCRV9WVF9NU0dUWVBFX05BQ0sgICAgIDB4NDAwMDAwMDAgIC8qIE1lc3NhZ2VzIGJlbG93IG9yJ2Qgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYXJlIHRoZSBOQUNLICovCisJCQkJCSAgICAgICAqIHRoaXMgYXJlIHRoZSBOQUNLICovCiAjZGVmaW5lIElYR0JFX1ZUX01TR1RZUEVfQ1RTICAgICAgMHgyMDAwMDAwMCAgLyogSW5kaWNhdGVzIHRoYXQgVkYgaXMgc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhciB0byBzZW5kIHJlcXVlc3RzICovCisJCQkJCQkgY2xlYXIgdG8gc2VuZCByZXF1ZXN0cyAqLwogI2RlZmluZSBJWEdCRV9WVF9NU0dJTkZPX1NISUZUICAgIDE2CiAvKiBiaXRzIDIzOjE2IGFyZSB1c2VkIGZvciBleHJhIGluZm8gZm9yIGNlcnRhaW4gbWVzc2FnZXMgKi8KICNkZWZpbmUgSVhHQkVfVlRfTVNHSU5GT19NQVNLICAgICAoMHhGRiA8PCBJWEdCRV9WVF9NU0dJTkZPX1NISUZUKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuYwppbmRleCBhNzZhZjhlMi4uZmY2OGI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAkJCWlmIChtZGlvNDVfcHJvYmUoJmh3LT5waHkubWRpbywgcGh5X2FkZHIpID09IDApIHsKIAkJCQlpeGdiZV9nZXRfcGh5X2lkKGh3KTsKIAkJCQlody0+cGh5LnR5cGUgPQotCQkJCSAgICAgICAgaXhnYmVfZ2V0X3BoeV90eXBlX2Zyb21faWQoaHctPnBoeS5pZCk7CisJCQkJCWl4Z2JlX2dldF9waHlfdHlwZV9mcm9tX2lkKGh3LT5waHkuaWQpOwogCiAJCQkJaWYgKGh3LT5waHkudHlwZSA9PSBpeGdiZV9waHlfdW5rbm93bikgewogCQkJCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywKQEAgLTEzNiwxMiArMTM2LDEyIEBACiAJdTE2IHBoeV9pZF9sb3cgPSAwOwogCiAJc3RhdHVzID0gaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIE1ESU9fREVWSUQxLCBNRElPX01NRF9QTUFQTUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9pZF9oaWdoKTsKKwkJCQkgICAgICAmcGh5X2lkX2hpZ2gpOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCWh3LT5waHkuaWQgPSAodTMyKShwaHlfaWRfaGlnaCA8PCAxNik7CiAJCXN0YXR1cyA9IGh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBNRElPX0RFVklEMiwgTURJT19NTURfUE1BUE1ELAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2lkX2xvdyk7CisJCQkJCSAgICAgICZwaHlfaWRfbG93KTsKIAkJaHctPnBoeS5pZCB8PSAodTMyKShwaHlfaWRfbG93ICYgSVhHQkVfUEhZX1JFVklTSU9OX01BU0spOwogCQlody0+cGh5LnJldmlzaW9uID0gKHUzMikocGh5X2lkX2xvdyAmIH5JWEdCRV9QSFlfUkVWSVNJT05fTUFTSyk7CiAJfQpAQCAtMzE4LDcgKzMxOCw3IEBACiAgKiAgQHBoeV9kYXRhOiBQb2ludGVyIHRvIHJlYWQgZGF0YSBmcm9tIFBIWSByZWdpc3RlcgogICoqLwogczMyIGl4Z2JlX3JlYWRfcGh5X3JlZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGV2aWNlX3R5cGUsIHUxNiAqcGh5X2RhdGEpCisJCQkgICAgICAgdTMyIGRldmljZV90eXBlLCB1MTYgKnBoeV9kYXRhKQogewogCXMzMiBzdGF0dXM7CiAJdTE2IGdzc3I7CkBAIC00MjEsNyArNDIxLDcgQEAKICAqICBAcGh5X2RhdGE6IERhdGEgdG8gd3JpdGUgdG8gdGhlIFBIWSByZWdpc3RlcgogICoqLwogczMyIGl4Z2JlX3dyaXRlX3BoeV9yZWdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKQorCQkJCXUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKQogewogCXMzMiBzdGF0dXM7CiAJdTE2IGdzc3I7CkBAIC01NDgsOCArNTQ4LDggQEAKICAqICBAc3BlZWQ6IG5ldyBsaW5rIHNwZWVkCiAgKiovCiBzMzIgaXhnYmVfc2V0dXBfcGh5X2xpbmtfc3BlZWRfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKQorCQkJCSAgICAgICBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLAorCQkJCSAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSkKIHsKIAogCS8qCkBAIC01ODIsOCArNTgyLDggQEAKICAqIERldGVybWluZXMgdGhlIGxpbmsgY2FwYWJpbGl0aWVzIGJ5IHJlYWRpbmcgdGhlIEFVVE9DIHJlZ2lzdGVyLgogICovCiBzMzIgaXhnYmVfZ2V0X2NvcHBlcl9saW5rX2NhcGFiaWxpdGllc19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICphdXRvbmVnKQorCQkJCQkgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCisJCQkJCSAgICAgICBib29sICphdXRvbmVnKQogewogCXMzMiBzdGF0dXMgPSBJWEdCRV9FUlJfTElOS19TRVRVUDsKIAl1MTYgc3BlZWRfYWJpbGl0eTsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCSphdXRvbmVnID0gdHJ1ZTsKIAogCXN0YXR1cyA9IGh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBNRElPX1NQRUVELCBNRElPX01NRF9QTUFQTUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwZWVkX2FiaWxpdHkpOworCQkJCSAgICAgICZzcGVlZF9hYmlsaXR5KTsKIAogCWlmIChzdGF0dXMgPT0gMCkgewogCQlpZiAoc3BlZWRfYWJpbGl0eSAmIE1ESU9fU1BFRURfMTBHKQpAQCAtODA2LDExICs4MDYsMTEgQEAKIAogCS8qIHJlc2V0IHRoZSBQSFkgYW5kIHBvbGwgZm9yIGNvbXBsZXRpb24gKi8KIAlody0+cGh5Lm9wcy53cml0ZV9yZWcoaHcsIE1ESU9fQ1RSTDEsIE1ESU9fTU1EX1BIWVhTLAotCSAgICAgICAgICAgICAgICAgICAgICAocGh5X2RhdGEgfCBNRElPX0NUUkwxX1JFU0VUKSk7CisJCQkgICAgICAocGh5X2RhdGEgfCBNRElPX0NUUkwxX1JFU0VUKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIE1ESU9fQ1RSTDEsIE1ESU9fTU1EX1BIWVhTLAotCQkgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworCQkJCSAgICAgJnBoeV9kYXRhKTsKIAkJaWYgKChwaHlfZGF0YSAmIE1ESU9fQ1RSTDFfUkVTRVQpID09IDApCiAJCQlicmVhazsKIAkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CkBAIC04MjQsNyArODI0LDcgQEAKIAogCS8qIEdldCBpbml0IG9mZnNldHMgKi8KIAlyZXRfdmFsID0gaXhnYmVfZ2V0X3NmcF9pbml0X3NlcXVlbmNlX29mZnNldHMoaHcsICZsaXN0X29mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfb2Zmc2V0KTsKKwkJCQkJCSAgICAgICZkYXRhX29mZnNldCk7CiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBvdXQ7CiAKQEAgLTgzOCw3ICs4MzgsNyBAQAogCQlpZiAocmV0X3ZhbCkKIAkJCWdvdG8gZXJyX2VlcHJvbTsKIAkJY29udHJvbCA9IChld29yZCAmIElYR0JFX0NPTlRST0xfTUFTS19OTCkgPj4KLQkJICAgICAgICAgICBJWEdCRV9DT05UUk9MX1NISUZUX05MOworCQkJICAgSVhHQkVfQ09OVFJPTF9TSElGVF9OTDsKIAkJZWRhdGEgPSBld29yZCAmIElYR0JFX0RBVEFfTUFTS19OTDsKIAkJc3dpdGNoIChjb250cm9sKSB7CiAJCWNhc2UgSVhHQkVfREVMQVlfTkw6CkBAIC04NTksNyArODU5LDcgQEAKIAkJCQlpZiAocmV0X3ZhbCkKIAkJCQkJZ290byBlcnJfZWVwcm9tOwogCQkJCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgcGh5X29mZnNldCwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgTURJT19NTURfUE1BUE1ELCBld29yZCk7CisJCQkJCQkgICAgICBNRElPX01NRF9QTUFQTUQsIGV3b3JkKTsKIAkJCQlod19kYmcoaHcsICJXcm90ZSAlNC40eCB0byAlNC40eFxuIiwgZXdvcmQsCiAJCQkJICAgICAgIHBoeV9vZmZzZXQpOwogCQkJCWRhdGFfb2Zmc2V0Kys7CkBAIC0xMDEwLDEwICsxMDEwLDEwIEBACiAJCQlpZiAoY2FibGVfdGVjaCAmIElYR0JFX1NGRl9EQV9QQVNTSVZFX0NBQkxFKSB7CiAJCQkJaWYgKGh3LT5idXMubGFuX2lkID09IDApCiAJCQkJCWh3LT5waHkuc2ZwX3R5cGUgPQotCQkJCQkgICAgICAgICAgICAgaXhnYmVfc2ZwX3R5cGVfZGFfY3VfY29yZTA7CisJCQkJCQkgICAgIGl4Z2JlX3NmcF90eXBlX2RhX2N1X2NvcmUwOwogCQkJCWVsc2UKIAkJCQkJaHctPnBoeS5zZnBfdHlwZSA9Ci0JCQkJCSAgICAgICAgICAgICBpeGdiZV9zZnBfdHlwZV9kYV9jdV9jb3JlMTsKKwkJCQkJCSAgICAgaXhnYmVfc2ZwX3R5cGVfZGFfY3VfY29yZTE7CiAJCQl9IGVsc2UgaWYgKGNhYmxlX3RlY2ggJiBJWEdCRV9TRkZfREFfQUNUSVZFX0NBQkxFKSB7CiAJCQkJaHctPnBoeS5vcHMucmVhZF9pMmNfZWVwcm9tKAogCQkJCQkJaHcsIElYR0JFX1NGRl9DQUJMRV9TUEVDX0NPTVAsCkBAIC0xMDM1LDEwICsxMDM1LDEwIEBACiAJCQkJICAgIElYR0JFX1NGRl8xMEdCQVNFTFJfQ0FQQUJMRSkpIHsKIAkJCQlpZiAoaHctPmJ1cy5sYW5faWQgPT0gMCkKIAkJCQkJaHctPnBoeS5zZnBfdHlwZSA9Ci0JCQkJCSAgICAgICAgICAgICAgaXhnYmVfc2ZwX3R5cGVfc3Jscl9jb3JlMDsKKwkJCQkJCSAgICAgIGl4Z2JlX3NmcF90eXBlX3NybHJfY29yZTA7CiAJCQkJZWxzZQogCQkJCQlody0+cGh5LnNmcF90eXBlID0KLQkJCQkJICAgICAgICAgICAgICBpeGdiZV9zZnBfdHlwZV9zcmxyX2NvcmUxOworCQkJCQkJICAgICAgaXhnYmVfc2ZwX3R5cGVfc3Jscl9jb3JlMTsKIAkJCX0gZWxzZSBpZiAoY29tcF9jb2Rlc18xZyAmIElYR0JFX1NGRl8xR0JBU0VUX0NBUEFCTEUpIHsKIAkJCQlpZiAoaHctPmJ1cy5sYW5faWQgPT0gMCkKIAkJCQkJaHctPnBoeS5zZnBfdHlwZSA9CkBAIC0xMDg3LDE1ICsxMDg3LDE1IEBACiAJCQkJZ290byBlcnJfcmVhZF9pMmNfZWVwcm9tOwogCiAJCQlzdGF0dXMgPSBody0+cGh5Lm9wcy5yZWFkX2kyY19lZXByb20oaHcsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfU0ZGX1ZFTkRPUl9PVUlfQllURTEsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91aV9ieXRlc1sxXSk7CisJCQkJCQkgICAgSVhHQkVfU0ZGX1ZFTkRPUl9PVUlfQllURTEsCisJCQkJCQkgICAgJm91aV9ieXRlc1sxXSk7CiAKIAkJCWlmIChzdGF0dXMgIT0gMCkKIAkJCQlnb3RvIGVycl9yZWFkX2kyY19lZXByb207CiAKIAkJCXN0YXR1cyA9IGh3LT5waHkub3BzLnJlYWRfaTJjX2VlcHJvbShodywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9TRkZfVkVORE9SX09VSV9CWVRFMiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VpX2J5dGVzWzJdKTsKKwkJCQkJCSAgICBJWEdCRV9TRkZfVkVORE9SX09VSV9CWVRFMiwKKwkJCQkJCSAgICAmb3VpX2J5dGVzWzJdKTsKIAogCQkJaWYgKHN0YXR1cyAhPSAwKQogCQkJCWdvdG8gZXJyX3JlYWRfaTJjX2VlcHJvbTsKQEAgLTE0MDMsOCArMTQwMyw4IEBACiAgKiAgc28gaXQgcmV0dXJucyB0aGUgb2Zmc2V0cyB0byB0aGUgcGh5IGluaXQgc2VxdWVuY2UgYmxvY2suCiAgKiovCiBzMzIgaXhnYmVfZ2V0X3NmcF9pbml0X3NlcXVlbmNlX29mZnNldHMoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmxpc3Rfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YV9vZmZzZXQpCisJCQkJCXUxNiAqbGlzdF9vZmZzZXQsCisJCQkJCXUxNiAqZGF0YV9vZmZzZXQpCiB7CiAJdTE2IHNmcF9pZDsKIAl1MTYgc2ZwX3R5cGUgPSBody0+cGh5LnNmcF90eXBlOwpAQCAtMTQ5MywxMSArMTQ5MywxMSBAQAogICogIFBlcmZvcm1zIGJ5dGUgcmVhZCBvcGVyYXRpb24gdG8gU0ZQIG1vZHVsZSdzIEVFUFJPTSBvdmVyIEkyQyBpbnRlcmZhY2UuCiAgKiovCiBzMzIgaXhnYmVfcmVhZF9pMmNfZWVwcm9tX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggYnl0ZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmVlcHJvbV9kYXRhKQorCQkJCSAgdTggKmVlcHJvbV9kYXRhKQogewogCXJldHVybiBody0+cGh5Lm9wcy5yZWFkX2kyY19ieXRlKGh3LCBieXRlX29mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9JMkNfRUVQUk9NX0RFVl9BRERSLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbV9kYXRhKTsKKwkJCQkJIElYR0JFX0kyQ19FRVBST01fREVWX0FERFIsCisJCQkJCSBlZXByb21fZGF0YSk7CiB9CiAKIC8qKgpAQCAtMTUyNSwxMSArMTUyNSwxMSBAQAogICogIFBlcmZvcm1zIGJ5dGUgd3JpdGUgb3BlcmF0aW9uIHRvIFNGUCBtb2R1bGUncyBFRVBST00gb3ZlciBJMkMgaW50ZXJmYWNlLgogICoqLwogczMyIGl4Z2JlX3dyaXRlX2kyY19lZXByb21fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCBieXRlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZWVwcm9tX2RhdGEpCisJCQkJICAgdTggZWVwcm9tX2RhdGEpCiB7CiAJcmV0dXJuIGh3LT5waHkub3BzLndyaXRlX2kyY19ieXRlKGh3LCBieXRlX29mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfSTJDX0VFUFJPTV9ERVZfQUREUiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tX2RhdGEpOworCQkJCQkgIElYR0JFX0kyQ19FRVBST01fREVWX0FERFIsCisJCQkJCSAgZWVwcm9tX2RhdGEpOwogfQogCiAvKioKQEAgLTE1NDIsNyArMTU0Miw3IEBACiAgKiAgYSBzcGVjaWZpZWQgZGV2aWNlIGFkZHJlc3MuCiAgKiovCiBzMzIgaXhnYmVfcmVhZF9pMmNfYnl0ZV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IGJ5dGVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBkZXZfYWRkciwgdTggKmRhdGEpCisJCQkJdTggZGV2X2FkZHIsIHU4ICpkYXRhKQogewogCXMzMiBzdGF0dXMgPSAwOwogCXUzMiBtYXhfcmV0cnkgPSAxMDsKQEAgLTE2MzEsNyArMTYzMSw3IEBACiAgKiAgYSBzcGVjaWZpZWQgZGV2aWNlIGFkZHJlc3MuCiAgKiovCiBzMzIgaXhnYmVfd3JpdGVfaTJjX2J5dGVfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCBieXRlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGRldl9hZGRyLCB1OCBkYXRhKQorCQkJCSB1OCBkZXZfYWRkciwgdTggZGF0YSkKIHsKIAlzMzIgc3RhdHVzID0gMDsKIAl1MzIgbWF4X3JldHJ5ID0gMTsKQEAgLTIwNDYsNyArMjA0Niw3IEBACiAKIAkvKiBDaGVjayB0aGF0IHRoZSBMQVNJIHRlbXAgYWxhcm0gc3RhdHVzIHdhcyB0cmlnZ2VyZWQgKi8KIAlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfVE5fTEFTSV9TVEFUVVNfUkVHLAotCSAgICAgICAgICAgICAgICAgICAgIE1ESU9fTU1EX1BNQVBNRCwgJnBoeV9kYXRhKTsKKwkJCSAgICAgTURJT19NTURfUE1BUE1ELCAmcGh5X2RhdGEpOwogCiAJaWYgKCEocGh5X2RhdGEgJiBJWEdCRV9UTl9MQVNJX1NUQVRVU19URU1QX0FMQVJNKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5oCmluZGV4IDBiYjA0N2YuLjU0MDcxZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5oCkBAIC0xMTQsNDcgKzExNCw0NyBAQAogczMyIGl4Z2JlX2lkZW50aWZ5X3BoeV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX3Jlc2V0X3BoeV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX3JlYWRfcGh5X3JlZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGV2aWNlX3R5cGUsIHUxNiAqcGh5X2RhdGEpOworCQkJICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2ICpwaHlfZGF0YSk7CiBzMzIgaXhnYmVfd3JpdGVfcGh5X3JlZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGRldmljZV90eXBlLCB1MTYgcGh5X2RhdGEpOworCQkJCXUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKTsKIHMzMiBpeGdiZV9yZWFkX3BoeV9yZWdfbWRpKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKIAkJCSAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2ICpwaHlfZGF0YSk7CiBzMzIgaXhnYmVfd3JpdGVfcGh5X3JlZ19tZGkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZ19hZGRyLAogCQkJICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKTsKIHMzMiBpeGdiZV9zZXR1cF9waHlfbGlua19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rX3NwZWVkX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CisJCQkJICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCisJCQkJICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKIHMzMiBpeGdiZV9nZXRfY29wcGVyX2xpbmtfY2FwYWJpbGl0aWVzX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmF1dG9uZWcpOworCQkJCQkgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCisJCQkJCSAgICAgICBib29sICphdXRvbmVnKTsKIGJvb2wgaXhnYmVfY2hlY2tfcmVzZXRfYmxvY2tlZChzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIAogLyogUEhZIHNwZWNpZmljICovCiBzMzIgaXhnYmVfY2hlY2tfcGh5X2xpbmtfdG54KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpsaW5rX3VwKTsKKwkJCSAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCisJCQkgICAgIGJvb2wgKmxpbmtfdXApOwogczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rX3RueChzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9nZXRfcGh5X2Zpcm13YXJlX3ZlcnNpb25fdG54KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmZpcm13YXJlX3ZlcnNpb24pOworCQkJCSAgICAgICB1MTYgKmZpcm13YXJlX3ZlcnNpb24pOwogczMyIGl4Z2JlX2dldF9waHlfZmlybXdhcmVfdmVyc2lvbl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpmaXJtd2FyZV92ZXJzaW9uKTsKKwkJCQkJICAgdTE2ICpmaXJtd2FyZV92ZXJzaW9uKTsKIAogczMyIGl4Z2JlX3Jlc2V0X3BoeV9ubChzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9pZGVudGlmeV9tb2R1bGVfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9pZGVudGlmeV9zZnBfbW9kdWxlX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CiBzMzIgaXhnYmVfZ2V0X3NmcF9pbml0X3NlcXVlbmNlX29mZnNldHMoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmxpc3Rfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YV9vZmZzZXQpOworCQkJCQl1MTYgKmxpc3Rfb2Zmc2V0LAorCQkJCQl1MTYgKmRhdGFfb2Zmc2V0KTsKIHMzMiBpeGdiZV90bl9jaGVja19vdmVydGVtcChzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9yZWFkX2kyY19ieXRlX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggYnl0ZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGRldl9hZGRyLCB1OCAqZGF0YSk7CisJCQkJdTggZGV2X2FkZHIsIHU4ICpkYXRhKTsKIHMzMiBpeGdiZV93cml0ZV9pMmNfYnl0ZV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IGJ5dGVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZGV2X2FkZHIsIHU4IGRhdGEpOworCQkJCSB1OCBkZXZfYWRkciwgdTggZGF0YSk7CiBzMzIgaXhnYmVfcmVhZF9pMmNfZWVwcm9tX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggYnl0ZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmVlcHJvbV9kYXRhKTsKKwkJCQkgIHU4ICplZXByb21fZGF0YSk7CiBzMzIgaXhnYmVfcmVhZF9pMmNfc2ZmODQ3Ml9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IGJ5dGVfb2Zmc2V0LAogCQkJCSAgIHU4ICpzZmY4NDcyX2RhdGEpOwogczMyIGl4Z2JlX3dyaXRlX2kyY19lZXByb21fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCBieXRlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZWVwcm9tX2RhdGEpOworCQkJCSAgIHU4IGVlcHJvbV9kYXRhKTsKICNlbmRpZiAvKiBfSVhHQkVfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCmluZGV4IDg5MDJhZTYuLjY4Zjg3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiaXhnYmUuaCIKLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wdHBfY2xhc3NpZnkuaD4KIAogLyoKQEAgLTMzNCw3ICszMzMsNyBAQAogfQogCiAvKioKLSAqIGl4Z2JlX3B0cF9lbmFibGUKKyAqIGl4Z2JlX3B0cF9mZWF0dXJlX2VuYWJsZQogICogQHB0cDogdGhlIHB0cCBjbG9jayBzdHJ1Y3R1cmUKICAqIEBycTogdGhlIHJlcXVlc3RlZCBmZWF0dXJlIHRvIGNoYW5nZQogICogQG9uOiB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBmZWF0dXJlCkBAIC0zNDIsOCArMzQxLDggQEAKICAqIGVuYWJsZSAob3IgZGlzYWJsZSkgYW5jaWxsYXJ5IGZlYXR1cmVzIG9mIHRoZSBwaGMgc3Vic3lzdGVtLgogICogb3VyIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBQUFMgZmVhdHVyZSBvbiB0aGUgWDU0MAogICovCi1zdGF0aWMgaW50IGl4Z2JlX3B0cF9lbmFibGUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpycSwgaW50IG9uKQorc3RhdGljIGludCBpeGdiZV9wdHBfZmVhdHVyZV9lbmFibGUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCisJCQkJICAgIHN0cnVjdCBwdHBfY2xvY2tfcmVxdWVzdCAqcnEsIGludCBvbikKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9CiAJCWNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBpeGdiZV9hZGFwdGVyLCBwdHBfY2Fwcyk7CkBAIC01NzAsOSArNTY5LDkgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9wdHBfc2V0X3RzX2NvbmZpZyAtIGNvbnRyb2wgaGFyZHdhcmUgdGltZSBzdGFtcGluZwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3QKLSAqIEBpZnJlcTogaW9jdGwgZGF0YQorICogaXhnYmVfcHRwX3NldF90aW1lc3RhbXBfbW9kZSAtIHNldHVwIHRoZSBoYXJkd2FyZSBmb3IgdGhlIHJlcXVlc3RlZCBtb2RlCisgKiBAYWRhcHRlcjogdGhlIHByaXZhdGUgaXhnYmUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBjb25maWc6IHRoZSBod3RzdGFtcCBjb25maWd1cmF0aW9uIHJlcXVlc3RlZAogICoKICAqIE91dGdvaW5nIHRpbWUgc3RhbXBpbmcgY2FuIGJlIGVuYWJsZWQgYW5kIGRpc2FibGVkLiBQbGF5IG5pY2UgYW5kCiAgKiBkaXNhYmxlIGl0IHdoZW4gcmVxdWVzdGVkLCBhbHRob3VnaCBpdCBzaG91bGRuJ3QgY2F1c2UgYW55IG92ZXJoZWFkCkBAIC01OTAsMjUgKzU4OSwyNSBAQAogICogcGFja2V0cywgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIHJlZ2lzdGVyLCBvbmx5IHVzZSBWMgogICogRXZlbnQgbW9kZS4gVGhpcyBtb3JlIGFjY3VyYXRlbHkgdGVsbHMgdGhlIHVzZXIgd2hhdCB0aGUgaGFyZHdhcmUgaXMgZ29pbmcKICAqIHRvIGRvIGFueXdheXMuCisgKgorICogTm90ZTogdGhpcyBtYXkgbW9kaWZ5IHRoZSBod3RzdGFtcCBjb25maWd1cmF0aW9uIHRvd2FyZHMgYSBtb3JlIGdlbmVyYWwKKyAqIG1vZGUsIGlmIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgbW9kZS4KICAqLwotaW50IGl4Z2JlX3B0cF9zZXRfdHNfY29uZmlnKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3N0YXRpYyBpbnQgaXhnYmVfcHRwX3NldF90aW1lc3RhbXBfbW9kZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgc3RydWN0IGh3dHN0YW1wX2NvbmZpZyAqY29uZmlnKQogewogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IGh3dHN0YW1wX2NvbmZpZyBjb25maWc7CiAJdTMyIHRzeW5jX3R4X2N0bCA9IElYR0JFX1RTWU5DVFhDVExfRU5BQkxFRDsKIAl1MzIgdHN5bmNfcnhfY3RsID0gSVhHQkVfVFNZTkNSWENUTF9FTkFCTEVEOwogCXUzMiB0c3luY19yeF9tdHJsID0gUFRQX0VWX1BPUlQgPDwgMTY7CiAJYm9vbCBpc19sMiA9IGZhbHNlOwogCXUzMiByZWd2YWw7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGNvbmZpZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwotCWlmIChjb25maWcuZmxhZ3MpCisJaWYgKGNvbmZpZy0+ZmxhZ3MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoIChjb25maWcudHhfdHlwZSkgeworCXN3aXRjaCAoY29uZmlnLT50eF90eXBlKSB7CiAJY2FzZSBIV1RTVEFNUF9UWF9PRkY6CiAJCXRzeW5jX3R4X2N0bCA9IDA7CiAJY2FzZSBIV1RTVEFNUF9UWF9PTjoKQEAgLTYxNyw3ICs2MTYsNyBAQAogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKLQlzd2l0Y2ggKGNvbmZpZy5yeF9maWx0ZXIpIHsKKwlzd2l0Y2ggKGNvbmZpZy0+cnhfZmlsdGVyKSB7CiAJY2FzZSBIV1RTVEFNUF9GSUxURVJfTk9ORToKIAkJdHN5bmNfcnhfY3RsID0gMDsKIAkJdHN5bmNfcnhfbXRybCA9IDA7CkBAIC02NDEsNyArNjQwLDcgQEAKIAljYXNlIEhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDRfREVMQVlfUkVROgogCQl0c3luY19yeF9jdGwgfD0gSVhHQkVfVFNZTkNSWENUTF9UWVBFX0VWRU5UX1YyOwogCQlpc19sMiA9IHRydWU7Ci0JCWNvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0VWRU5UOworCQljb25maWctPnJ4X2ZpbHRlciA9IEhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfRVZFTlQ7CiAJCWJyZWFrOwogCWNhc2UgSFdUU1RBTVBfRklMVEVSX1BUUF9WMV9MNF9FVkVOVDoKIAljYXNlIEhXVFNUQU1QX0ZJTFRFUl9BTEw6CkBAIC02NTIsNyArNjUxLDcgQEAKIAkJICogRGVsYXlfUmVxIG1lc3NhZ2VzIGFuZCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0CiAJCSAqIHRpbWVzdGFtcGluZyBhbGwgcGFja2V0cyA9PiByZXR1cm4gZXJyb3IKIAkJICovCi0JCWNvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfTk9ORTsKKwkJY29uZmlnLT5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfTk9ORTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCkBAIC02NzEsNyArNjcwLDYgQEAKIAllbHNlCiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRVRRRihJWEdCRV9FVFFGX0ZJTFRFUl8xNTg4KSwgMCk7CiAKLQogCS8qIGVuYWJsZS9kaXNhYmxlIFRYICovCiAJcmVndmFsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1RTWU5DVFhDVEwpOwogCXJlZ3ZhbCAmPSB+SVhHQkVfVFNZTkNUWENUTF9FTkFCTEVEOwpAQCAtNjkzLDYgKzY5MSwyOSBAQAogCXJlZ3ZhbCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9UWFNUTVBIKTsKIAlyZWd2YWwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhTVE1QSCk7CiAKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpeGdiZV9wdHBfc2V0X3RzX2NvbmZpZyAtIHVzZXIgZW50cnkgcG9pbnQgZm9yIHRpbWVzdGFtcCBtb2RlCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdAorICogQGlmcmVxOiBpb2N0bCBkYXRhCisgKgorICogU2V0IGhhcmR3YXJlIHRvIHJlcXVlc3RlZCBtb2RlLiBJZiB1bnN1cHBvcnRlZCwgcmV0dXJuIGFuIGVycm9yIHdpdGggbm8KKyAqIGNoYW5nZXMuIE90aGVyd2lzZSwgc3RvcmUgdGhlIG1vZGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisgKi8KK2ludCBpeGdiZV9wdHBfc2V0X3RzX2NvbmZpZyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGlmcmVxICppZnIpCit7CisJc3RydWN0IGh3dHN0YW1wX2NvbmZpZyBjb25maWc7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gaXhnYmVfcHRwX3NldF90aW1lc3RhbXBfbW9kZShhZGFwdGVyLCAmY29uZmlnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJLyogc2F2ZSB0aGVzZSBzZXR0aW5ncyBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLwogCW1lbWNweSgmYWRhcHRlci0+dHN0YW1wX2NvbmZpZywgJmNvbmZpZywKIAkgICAgICAgc2l6ZW9mKGFkYXB0ZXItPnRzdGFtcF9jb25maWcpKTsKQEAgLTc5MCw5ICs4MTEsMTMgQEAKICAqIGl4Z2JlX3B0cF9yZXNldAogICogQGFkYXB0ZXI6IHRoZSBpeGdiZSBwcml2YXRlIGJvYXJkIHN0cnVjdHVyZQogICoKLSAqIFdoZW4gdGhlIE1BQyByZXNldHMsIGFsbCB0aW1lc3luYyBmZWF0dXJlcyBhcmUgcmVzZXQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlCi0gKiBjYWxsZWQgdG8gcmUtZW5hYmxlIHRoZSBQVFAgY2xvY2sgc3RydWN0dXJlLiBJdCB3aWxsIHJlLWluaXQgdGhlIHRpbWVjb3VudGVyCi0gKiBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIGtlcm5lbCB0aW1lIGFzIHdlbGwgYXMgc2V0dXAgdGhlIGN5Y2xlIGNvdW50ZXIgZGF0YS4KKyAqIFdoZW4gdGhlIE1BQyByZXNldHMsIGFsbCB0aGUgaGFyZHdhcmUgYml0cyBmb3IgdGltZXN5bmMgYXJlIHJlc2V0LiBUaGlzCisgKiBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlLWVuYWJsZSB0aGUgZGV2aWNlIGZvciBQVFAgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncy4KKyAqIFdlIGRvIGxvc2UgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSwgc28ganVzdCByZXNldCB0aGUgY3ljbGVjb3VudGVyIHRvIHRoZQorICogc3lzdGVtIHJlYWwgY2xvY2sgdGltZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWFpbnRhaW4gaHd0c3RhbXBfY29uZmlnIHNldHRpbmdzLCBhbmQgcmVzZXRzIHRoZSBTRFAKKyAqIG91dHB1dCBpZiBpdCB3YXMgZW5hYmxlZC4KICAqLwogdm9pZCBpeGdiZV9wdHBfcmVzZXQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC04MDQsOCArODI5LDggQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1NZU1RJTUgsIDB4MDAwMDAwMDApOwogCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAotCS8qIFJlc2V0IHRoZSBzYXZlZCB0c3RhbXBfY29uZmlnICovCi0JbWVtc2V0KCZhZGFwdGVyLT50c3RhbXBfY29uZmlnLCAwLCBzaXplb2YoYWRhcHRlci0+dHN0YW1wX2NvbmZpZykpOworCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSB0aW1lc3RhbXBpbmcgbW9kZSAqLworCWl4Z2JlX3B0cF9zZXRfdGltZXN0YW1wX21vZGUoYWRhcHRlciwgJmFkYXB0ZXItPnRzdGFtcF9jb25maWcpOwogCiAJaXhnYmVfcHRwX3N0YXJ0X2N5Y2xlY291bnRlcihhZGFwdGVyKTsKIApAQCAtODI1LDE2ICs4NTAsMjMgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9wdHBfaW5pdAorICogaXhnYmVfcHRwX2NyZWF0ZV9jbG9jawogICogQGFkYXB0ZXI6IHRoZSBpeGdiZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGVuYWJsaW5nIHB0cAotICogc3VwcG9ydC4gSWYgcHRwIHN1cHBvcnQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgaXQgc2ltcGx5IGNhbGxzIHRoZQotICogY3ljbGVjb3VudGVyIGluaXQgcm91dGluZSBhbmQgZXhpdHMuCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHNldHVwIG9mIHRoZSB1c2VyIGVudHJ5IHBvaW50IGZ1bmN0aW9uIHRhYmxlIGFuZAorICogaW5pdGlhbGl6ZXMgdGhlIFBUUCBjbG9jayBkZXZpY2UsIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBjbG9jay1saWtlCisgKiBmZWF0dXJlcyBvZiB0aGUgUFRQIGNvcmUuIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IGl4Z2JlX3B0cF9pbml0LCBvbmx5IGlmCisgKiB0aGVyZSBpc24ndCBhbHJlYWR5IGEgY2xvY2sgZGV2aWNlIChzdWNoIGFzIGFmdGVyIGEgc3VzcGVuZC9yZXN1bWUgY3ljbGUsCisgKiB3aGVyZSB0aGUgY2xvY2sgZGV2aWNlIHdhc24ndCBkZXN0cm95ZWQpLgogICovCi12b2lkIGl4Z2JlX3B0cF9pbml0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBpeGdiZV9wdHBfY3JlYXRlX2Nsb2NrKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJbG9uZyBlcnI7CisKKwkvKiBkbyBub3RoaW5nIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNsb2NrIGRldmljZSAqLworCWlmICghSVNfRVJSX09SX05VTEwoYWRhcHRlci0+cHRwX2Nsb2NrKSkKKwkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hYy50eXBlKSB7CiAJY2FzZSBpeGdiZV9tYWNfWDU0MDoKQEAgLTg1MSw3ICs4ODMsNyBAQAogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGp0aW1lID0gaXhnYmVfcHRwX2FkanRpbWU7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpeGdiZV9wdHBfZ2V0dGltZTsKIAkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZSA9IGl4Z2JlX3B0cF9zZXR0aW1lOwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpeGdiZV9wdHBfZW5hYmxlOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpeGdiZV9wdHBfZmVhdHVyZV9lbmFibGU7CiAJCWJyZWFrOwogCWNhc2UgaXhnYmVfbWFjXzgyNTk5RUI6CiAJCXNucHJpbnRmKGFkYXB0ZXItPnB0cF9jYXBzLm5hbWUsCkBAIC04NjcsMjQgKzg5OSw1NyBAQAogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGp0aW1lID0gaXhnYmVfcHRwX2FkanRpbWU7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpeGdiZV9wdHBfZ2V0dGltZTsKIAkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZSA9IGl4Z2JlX3B0cF9zZXR0aW1lOwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpeGdiZV9wdHBfZW5hYmxlOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpeGdiZV9wdHBfZmVhdHVyZV9lbmFibGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWFkYXB0ZXItPnB0cF9jbG9jayA9IE5VTEw7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50bXJlZ19sb2NrKTsKLQlJTklUX1dPUksoJmFkYXB0ZXItPnB0cF90eF93b3JrLCBpeGdiZV9wdHBfdHhfaHd0c3RhbXBfd29yayk7Ci0KIAlhZGFwdGVyLT5wdHBfY2xvY2sgPSBwdHBfY2xvY2tfcmVnaXN0ZXIoJmFkYXB0ZXItPnB0cF9jYXBzLAogCQkJCQkJJmFkYXB0ZXItPnBkZXYtPmRldik7CiAJaWYgKElTX0VSUihhZGFwdGVyLT5wdHBfY2xvY2spKSB7CisJCWVyciA9IFBUUl9FUlIoYWRhcHRlci0+cHRwX2Nsb2NrKTsKIAkJYWRhcHRlci0+cHRwX2Nsb2NrID0gTlVMTDsKIAkJZV9kZXZfZXJyKCJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKIAl9IGVsc2UKIAkJZV9kZXZfaW5mbygicmVnaXN0ZXJlZCBQSEMgZGV2aWNlIG9uICVzXG4iLCBuZXRkZXYtPm5hbWUpOwogCisJLyogc2V0IGRlZmF1bHQgdGltZXN0YW1wIG1vZGUgdG8gZGlzYWJsZWQgaGVyZS4gV2UgZG8gdGhpcyBpbgorCSAqIGNyZWF0ZV9jbG9jayBpbnN0ZWFkIG9mIGluaXQsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSB0aGUKKwkgKiBwcmV2aW91cyBzZXR0aW5ncyBkdXJpbmcgYSByZXN1bWUgY3ljbGUuCisJICovCisJYWRhcHRlci0+dHN0YW1wX2NvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfTk9ORTsKKwlhZGFwdGVyLT50c3RhbXBfY29uZmlnLnR4X3R5cGUgPSBIV1RTVEFNUF9UWF9PRkY7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpeGdiZV9wdHBfaW5pdAorICogQGFkYXB0ZXI6IHRoZSBpeGdiZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGVuYWJsaW5nIFBUUAorICogc3VwcG9ydC4gSWYgUFRQIHN1cHBvcnQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgaXQgc2ltcGx5IGNhbGxzIHRoZQorICogY3ljbGVjb3VudGVyIGluaXQgcm91dGluZSBhbmQgZXhpdHMuCisgKi8KK3ZvaWQgaXhnYmVfcHRwX2luaXQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogaW5pdGlhbGl6ZSB0aGUgc3BpbiBsb2NrIGZpcnN0IHNpbmNlIHdlIGNhbid0IGNvbnRyb2wgd2hlbiBhIHVzZXIKKwkgKiB3aWxsIGNhbGwgdGhlIGVudHJ5IGZ1bmN0aW9ucyBvbmNlIHdlIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIGNsb2NrCisJICogZGV2aWNlCisJICovCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRtcmVnX2xvY2spOworCisJLyogb2J0YWluIGEgUFRQIGRldmljZSwgb3IgcmUtdXNlIGFuIGV4aXN0aW5nIGRldmljZSAqLworCWlmIChpeGdiZV9wdHBfY3JlYXRlX2Nsb2NrKGFkYXB0ZXIpKQorCQlyZXR1cm47CisKKwkvKiB3ZSBoYXZlIGEgY2xvY2sgc28gd2UgY2FuIGluaXRpYWxpemUgd29yayBub3cgKi8KKwlJTklUX1dPUksoJmFkYXB0ZXItPnB0cF90eF93b3JrLCBpeGdiZV9wdHBfdHhfaHd0c3RhbXBfd29yayk7CisKKwkvKiByZXNldCB0aGUgUFRQIHJlbGF0ZWQgaGFyZHdhcmUgYml0cyAqLwogCWl4Z2JlX3B0cF9yZXNldChhZGFwdGVyKTsKIAogCS8qIGVudGVyIHRoZSBJWEdCRV9QVFBfUlVOTklORyBzdGF0ZSAqLwpAQCAtODk0LDI4ICs5NTksNDUgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9wdHBfc3RvcCAtIGRpc2FibGUgcHRwIGRldmljZSBhbmQgc3RvcCB0aGUgb3ZlcmZsb3cgY2hlY2sKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0CisgKiBpeGdiZV9wdHBfc3VzcGVuZCAtIHN0b3AgUFRQIHdvcmsgaXRlbXMKKyAqIEAgYWRhcHRlcjogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdAogICoKLSAqIHRoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIHB0cCBzdXBwb3J0LCBhbmQgY2FuY2VscyB0aGUgZGVsYXllZCB3b3JrLgorICogdGhpcyBmdW5jdGlvbiBzdXNwZW5kcyBQVFAgYWN0aXZpdHksIGFuZCBwcmV2ZW50cyBtb3JlIFBUUCB3b3JrIGZyb20gYmVpbmcKKyAqIGdlbmVyYXRlZCwgYnV0IGRvZXMgbm90IGRlc3Ryb3kgdGhlIFBUUCBjbG9jayBkZXZpY2UuCiAgKi8KLXZvaWQgaXhnYmVfcHRwX3N0b3Aoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit2b2lkIGl4Z2JlX3B0cF9zdXNwZW5kKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewogCS8qIExlYXZlIHRoZSBJWEdCRV9QVFBfUlVOTklORyBzdGF0ZS4gKi8KIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChfX0lYR0JFX1BUUF9SVU5OSU5HLCAmYWRhcHRlci0+c3RhdGUpKQogCQlyZXR1cm47CiAKLQkvKiBzdG9wIHRoZSBQUFMgc2lnbmFsICovCi0JYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9QVFBfUFBTX0VOQUJMRUQ7Ci0JaXhnYmVfcHRwX3NldHVwX3NkcChhZGFwdGVyKTsKKwkvKiBzaW5jZSB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBpbiBzdXNwZW5kLCB3ZSBkb24ndCBjbGVhciB0aGUgc3RhdGUsCisJICogYnV0IHNpbXBseSByZXNldCB0aGUgYXV4aWxpYXJ5IFBQUyBzaWduYWwgY29udHJvbCByZWdpc3RlcgorCSAqLworCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1RTQVVYQywgMHgwKTsKIAorCS8qIGVuc3VyZSB0aGF0IHdlIGNhbmNlbCBhbnkgcGVuZGluZyBQVFAgVHggd29yayBpdGVtIGluIHByb2dyZXNzICovCiAJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+cHRwX3R4X3dvcmspOwogCWlmIChhZGFwdGVyLT5wdHBfdHhfc2tiKSB7CiAJCWRldl9rZnJlZV9za2JfYW55KGFkYXB0ZXItPnB0cF90eF9za2IpOwogCQlhZGFwdGVyLT5wdHBfdHhfc2tiID0gTlVMTDsKIAkJY2xlYXJfYml0X3VubG9jayhfX0lYR0JFX1BUUF9UWF9JTl9QUk9HUkVTUywgJmFkYXB0ZXItPnN0YXRlKTsKIAl9Cit9CiAKKy8qKgorICogaXhnYmVfcHRwX3N0b3AgLSBjbG9zZSB0aGUgUFRQIGRldmljZQorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3QKKyAqCisgKiBjb21wbGV0ZWx5IGRlc3Ryb3kgdGhlIFBUUCBkZXZpY2UsIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMKKyAqIGJlaW5nIGZ1bGx5IGNsb3NlZC4KKyAqLwordm9pZCBpeGdiZV9wdHBfc3RvcChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBmaXJzdCwgc3VzcGVuZCBQVFAgYWN0aXZpdHkgKi8KKwlpeGdiZV9wdHBfc3VzcGVuZChhZGFwdGVyKTsKKworCS8qIGRpc2FibGUgdGhlIFBUUCBjbG9jayBkZXZpY2UgKi8KIAlpZiAoYWRhcHRlci0+cHRwX2Nsb2NrKSB7CiAJCXB0cF9jbG9ja191bnJlZ2lzdGVyKGFkYXB0ZXItPnB0cF9jbG9jayk7CiAJCWFkYXB0ZXItPnB0cF9jbG9jayA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwppbmRleCBlNmM2OGQzLi4xNmIzYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKQEAgLTcyLDggKzcyLDYgQEAKIAkJZm9yIChpID0gMDsgaSA8IG51bV92Zl9tYWN2bGFuczsgaSsrKSB7CiAJCQltdl9saXN0LT52ZiA9IC0xOwogCQkJbXZfbGlzdC0+ZnJlZSA9IHRydWU7Ci0JCQltdl9saXN0LT5yYXJfZW50cnkgPSBody0+bWFjLm51bV9yYXJfZW50cmllcyAtCi0JCQkJKGkgKyBhZGFwdGVyLT5udW1fdmZzICsgMSk7CiAJCQlsaXN0X2FkZCgmbXZfbGlzdC0+bCwgJmFkYXB0ZXItPnZmX212cy5sKTsKIAkJCW12X2xpc3QrKzsKIAkJfQpAQCAtMzI3LDYgKzMyNSw3IEBACiAJdTMyIHZlY3Rvcl9iaXQ7CiAJdTMyIHZlY3Rvcl9yZWc7CiAJdTMyIG10YV9yZWc7CisJdTMyIHZtb2xyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZNT0xSKHZmKSk7CiAKIAkvKiBvbmx5IHNvIG1hbnkgaGFzaCB2YWx1ZXMgc3VwcG9ydGVkICovCiAJZW50cmllcyA9IG1pbihlbnRyaWVzLCBJWEdCRV9NQVhfVkZfTUNfRU5UUklFUyk7CkBAIC0zNTMsMjUgKzM1MiwxMyBAQAogCQltdGFfcmVnIHw9ICgxIDw8IHZlY3Rvcl9iaXQpOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UQSh2ZWN0b3JfcmVnKSwgbXRhX3JlZyk7CiAJfQorCXZtb2xyIHw9IElYR0JFX1ZNT0xSX1JPTVBFOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVk1PTFIodmYpLCB2bW9scik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaXhnYmVfcmVzdG9yZV92Zl9tYWN2bGFucyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlzdHJ1Y3QgdmZfbWFjdmxhbnMgKmVudHJ5OwotCi0JbGlzdF9mb3JfZWFjaChwb3MsICZhZGFwdGVyLT52Zl9tdnMubCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdmZfbWFjdmxhbnMsIGwpOwotCQlpZiAoIWVudHJ5LT5mcmVlKQotCQkJaHctPm1hYy5vcHMuc2V0X3JhcihodywgZW50cnktPnJhcl9lbnRyeSwKLQkJCQkJICAgIGVudHJ5LT52Zl9tYWN2bGFuLAotCQkJCQkgICAgZW50cnktPnZmLCBJWEdCRV9SQUhfQVYpOwotCX0KLX0KLQorI2lmZGVmIENPTkZJR19QQ0lfSU9WCiB2b2lkIGl4Z2JlX3Jlc3RvcmVfdmZfbXVsdGljYXN0cyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMzgyLDYgKzM2OSw3IEBACiAJdTMyIG10YV9yZWc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsgaSsrKSB7CisJCXUzMiB2bW9sciA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WTU9MUihpKSk7CiAJCXZmaW5mbyA9ICZhZGFwdGVyLT52ZmluZm9baV07CiAJCWZvciAoaiA9IDA7IGogPCB2ZmluZm8tPm51bV92Zl9tY19oYXNoZXM7IGorKykgewogCQkJaHctPmFkZHJfY3RybC5tdGFfaW5fdXNlKys7CkBAIC0zOTEsMTEgKzM3OSwxOCBAQAogCQkJbXRhX3JlZyB8PSAoMSA8PCB2ZWN0b3JfYml0KTsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVRBKHZlY3Rvcl9yZWcpLCBtdGFfcmVnKTsKIAkJfQorCisJCWlmICh2ZmluZm8tPm51bV92Zl9tY19oYXNoZXMpCisJCQl2bW9sciB8PSBJWEdCRV9WTU9MUl9ST01QRTsKKwkJZWxzZQorCQkJdm1vbHIgJj0gfklYR0JFX1ZNT0xSX1JPTVBFOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZNT0xSKGkpLCB2bW9scik7CiAJfQogCiAJLyogUmVzdG9yZSBhbnkgVkYgbWFjdmxhbnMgKi8KLQlpeGdiZV9yZXN0b3JlX3ZmX21hY3ZsYW5zKGFkYXB0ZXIpOworCWl4Z2JlX2Z1bGxfc3luY19tYWNfdGFibGUoYWRhcHRlcik7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBpeGdiZV9zZXRfdmZfdmxhbihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZCwgaW50IHZpZCwKIAkJCSAgICAgdTMyIHZmKQpAQCAtNDk1LDggKzQ5MCw3IEBACiBzdGF0aWMgdm9pZCBpeGdiZV9zZXRfdm1vbHIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHZmLCBib29sIGF1cGUpCiB7CiAJdTMyIHZtb2xyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZNT0xSKHZmKSk7Ci0Jdm1vbHIgfD0gKElYR0JFX1ZNT0xSX1JPTVBFIHwKLQkJICBJWEdCRV9WTU9MUl9CQU0pOworCXZtb2xyIHw9IElYR0JFX1ZNT0xSX0JBTTsKIAlpZiAoYXVwZSkKIAkJdm1vbHIgfD0gSVhHQkVfVk1PTFJfQVVQRTsKIAllbHNlCkBAIC01MTQsNyArNTA4LDYgQEAKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCB2Zl9kYXRhX3N0b3JhZ2UgKnZmaW5mbyA9ICZhZGFwdGVyLT52ZmluZm9bdmZdOwotCWludCByYXJfZW50cnkgPSBody0+bWFjLm51bV9yYXJfZW50cmllcyAtICh2ZiArIDEpOwogCXU4IG51bV90Y3MgPSBuZXRkZXZfZ2V0X251bV90YyhhZGFwdGVyLT5uZXRkZXYpOwogCiAJLyogYWRkIFBGIGFzc2lnbmVkIFZMQU4gb3IgVkxBTiAwICovCkBAIC01NDQsNyArNTM3LDcgQEAKIAkvKiBGbHVzaCBhbmQgcmVzZXQgdGhlIG10YSB3aXRoIHRoZSBuZXcgdmFsdWVzICovCiAJaXhnYmVfc2V0X3J4X21vZGUoYWRhcHRlci0+bmV0ZGV2KTsKIAotCWh3LT5tYWMub3BzLmNsZWFyX3JhcihodywgcmFyX2VudHJ5KTsKKwlpeGdiZV9kZWxfbWFjX2ZpbHRlcihhZGFwdGVyLCBhZGFwdGVyLT52ZmluZm9bdmZdLnZmX21hY19hZGRyZXNzZXMsIHZmKTsKIAogCS8qIHJlc2V0IFZGIGFwaSBiYWNrIHRvIHVua25vd24gKi8KIAlhZGFwdGVyLT52ZmluZm9bdmZdLnZmX2FwaSA9IGl4Z2JlX21ib3hfYXBpXzEwOwpAQCAtNTUzLDExICs1NDYsOSBAQAogc3RhdGljIGludCBpeGdiZV9zZXRfdmZfbWFjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgIGludCB2ZiwgdW5zaWduZWQgY2hhciAqbWFjX2FkZHIpCiB7Ci0Jc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlpbnQgcmFyX2VudHJ5ID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXMgLSAodmYgKyAxKTsKLQorCWl4Z2JlX2RlbF9tYWNfZmlsdGVyKGFkYXB0ZXIsIGFkYXB0ZXItPnZmaW5mb1t2Zl0udmZfbWFjX2FkZHJlc3NlcywgdmYpOwogCW1lbWNweShhZGFwdGVyLT52ZmluZm9bdmZdLnZmX21hY19hZGRyZXNzZXMsIG1hY19hZGRyLCBFVEhfQUxFTik7Ci0JaHctPm1hYy5vcHMuc2V0X3JhcihodywgcmFyX2VudHJ5LCBtYWNfYWRkciwgdmYsIElYR0JFX1JBSF9BVik7CisJaXhnYmVfYWRkX21hY19maWx0ZXIoYWRhcHRlciwgYWRhcHRlci0+dmZpbmZvW3ZmXS52Zl9tYWNfYWRkcmVzc2VzLCB2Zik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU2NSw3ICs1NTYsNiBAQAogc3RhdGljIGludCBpeGdiZV9zZXRfdmZfbWFjdmxhbihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCQlpbnQgdmYsIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqbWFjX2FkZHIpCiB7Ci0Jc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IHZmX21hY3ZsYW5zICplbnRyeTsKIApAQCAtNTc2LDcgKzU2Niw4IEBACiAJCQkJZW50cnktPnZmID0gLTE7CiAJCQkJZW50cnktPmZyZWUgPSB0cnVlOwogCQkJCWVudHJ5LT5pc19tYWN2bGFuID0gZmFsc2U7Ci0JCQkJaHctPm1hYy5vcHMuY2xlYXJfcmFyKGh3LCBlbnRyeS0+cmFyX2VudHJ5KTsKKwkJCQlpeGdiZV9kZWxfbWFjX2ZpbHRlcihhZGFwdGVyLAorCQkJCQkJICAgICBlbnRyeS0+dmZfbWFjdmxhbiwgdmYpOwogCQkJfQogCQl9CiAJfQpAQCAtNjEyLDcgKzYwMyw3IEBACiAJZW50cnktPnZmID0gdmY7CiAJbWVtY3B5KGVudHJ5LT52Zl9tYWN2bGFuLCBtYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JaHctPm1hYy5vcHMuc2V0X3JhcihodywgZW50cnktPnJhcl9lbnRyeSwgbWFjX2FkZHIsIHZmLCBJWEdCRV9SQUhfQVYpOworCWl4Z2JlX2FkZF9tYWNfZmlsdGVyKGFkYXB0ZXIsIG1hY19hZGRyLCB2Zik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMzgsOSArMTEyOSw5IEBACiAJCQlhZGFwdGVyLT52ZmluZm9bdmZdLnZsYW5fY291bnQtLTsKIAkJYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl92bGFuID0gMDsKIAkJYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl9xb3MgPSAwOwotICAgICAgIH0KKwl9CiBvdXQ6Ci0gICAgICAgcmV0dXJuIGVycjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGl4Z2JlX2xpbmtfbWJwcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTEyMzEsNyArMTIyMiw4IEBACiAJfQogfQogCi1pbnQgaXhnYmVfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIGludCB0eF9yYXRlKQoraW50IGl4Z2JlX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCisJCQlpbnQgbWF4X3R4X3JhdGUpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBsaW5rX3NwZWVkOwpAQCAtMTI0OSwxMyArMTI0MSwxNiBAQAogCWlmIChsaW5rX3NwZWVkICE9IDEwMDAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChtaW5fdHhfcmF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiByYXRlIGxpbWl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gMTBNYnMgb3IgZ3JlYXRlciB0aGFuIGxpbmsgc3BlZWQgKi8KLQlpZiAodHhfcmF0ZSAmJiAoKHR4X3JhdGUgPD0gMTApIHx8ICh0eF9yYXRlID4gbGlua19zcGVlZCkpKQorCWlmIChtYXhfdHhfcmF0ZSAmJiAoKG1heF90eF9yYXRlIDw9IDEwKSB8fCAobWF4X3R4X3JhdGUgPiBsaW5rX3NwZWVkKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc3RvcmUgdmFsdWVzICovCiAJYWRhcHRlci0+dmZfcmF0ZV9saW5rX3NwZWVkID0gbGlua19zcGVlZDsKLQlhZGFwdGVyLT52ZmluZm9bdmZdLnR4X3JhdGUgPSB0eF9yYXRlOworCWFkYXB0ZXItPnZmaW5mb1t2Zl0udHhfcmF0ZSA9IG1heF90eF9yYXRlOwogCiAJLyogdXBkYXRlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KIAlpeGdiZV9zZXRfdmZfcmF0ZV9saW1pdChhZGFwdGVyLCB2Zik7CkBAIC0xMjk3LDcgKzEyOTIsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpdmktPnZmID0gdmY7CiAJbWVtY3B5KCZpdmktPm1hYywgYWRhcHRlci0+dmZpbmZvW3ZmXS52Zl9tYWNfYWRkcmVzc2VzLCBFVEhfQUxFTik7Ci0JaXZpLT50eF9yYXRlID0gYWRhcHRlci0+dmZpbmZvW3ZmXS50eF9yYXRlOworCWl2aS0+bWF4X3R4X3JhdGUgPSBhZGFwdGVyLT52ZmluZm9bdmZdLnR4X3JhdGU7CisJaXZpLT5taW5fdHhfcmF0ZSA9IDA7CiAJaXZpLT52bGFuID0gYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl92bGFuOwogCWl2aS0+cW9zID0gYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl9xb3M7CiAJaXZpLT5zcG9vZmNoayA9IGFkYXB0ZXItPnZmaW5mb1t2Zl0uc3Bvb2ZjaGtfZW5hYmxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCmluZGV4IDEzOWVhZGQuLjMyYzI2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaApAQCAtMzQsNyArMzQsOSBAQAogICovCiAjZGVmaW5lIElYR0JFX01BWF9WRlNfRFJWX0xJTUlUICAoSVhHQkVfTUFYX1ZGX0ZVTkNUSU9OUyAtIDEpCiAKKyNpZmRlZiBDT05GSUdfUENJX0lPVgogdm9pZCBpeGdiZV9yZXN0b3JlX3ZmX211bHRpY2FzdHMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOworI2VuZGlmCiB2b2lkIGl4Z2JlX21zZ190YXNrKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBpeGdiZV92Zl9jb25maWd1cmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgZXZlbnRfbWFzayk7CiB2b2lkIGl4Z2JlX2Rpc2FibGVfdHhfcngoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtNDIsNyArNDQsOCBAQAogaW50IGl4Z2JlX25kb19zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTggKm1hYyk7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTE2IHZsYW4sCiAJCQkgICB1OCBxb3MpOwotaW50IGl4Z2JlX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCBpbnQgdHhfcmF0ZSk7CitpbnQgaXhnYmVfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKKwkJCWludCBtYXhfdHhfcmF0ZSk7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIGJvb2wgc2V0dGluZyk7CiBpbnQgaXhnYmVfbmRvX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICBpbnQgdmYsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKaW5kZXggOGE2ZmYyNC4uOWE4OWY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaApAQCAtMTYwLDcgKzE2MCw3IEBACiAjZGVmaW5lIElYR0JFX01BWF9FSVRSICAgICAweDAwMDAwRkY4CiAjZGVmaW5lIElYR0JFX01JTl9FSVRSICAgICA4CiAjZGVmaW5lIElYR0JFX0VJVFIoX2kpICAoKChfaSkgPD0gMjMpID8gKDB4MDA4MjAgKyAoKF9pKSAqIDQpKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMTIzMDAgKyAoKChfaSkgLSAyNCkgKiA0KSkpCisJCQkgKDB4MDEyMzAwICsgKCgoX2kpIC0gMjQpICogNCkpKQogI2RlZmluZSBJWEdCRV9FSVRSX0lUUl9JTlRfTUFTSyAweDAwMDAwRkY4CiAjZGVmaW5lIElYR0JFX0VJVFJfTExJX01PRCAgICAgIDB4MDAwMDgwMDAKICNkZWZpbmUgSVhHQkVfRUlUUl9DTlRfV0RJUyAgICAgMHg4MDAwMDAwMApAQCAtMjEzLDcgKzIxMyw3IEBACiAgKiA2NC0xMjc6IDB4MEQwMTQgKyAobi02NCkqMHg0MAogICovCiAjZGVmaW5lIElYR0JFX1NSUkNUTChfaSkgKCgoX2kpIDw9IDE1KSA/ICgweDAyMTAwICsgKChfaSkgKiA0KSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9pKSA8IDY0KSA/ICgweDAxMDE0ICsgKChfaSkgKiAweDQwKSkgOiBcCisJCQkgICgoKF9pKSA8IDY0KSA/ICgweDAxMDE0ICsgKChfaSkgKiAweDQwKSkgOiBcCiAJCQkgICgweDBEMDE0ICsgKCgoX2kpIC0gNjQpICogMHg0MCkpKSkKIC8qCiAgKiBSeCBEQ0EgQ29udHJvbCBSZWdpc3RlcjoKQEAgLTIyMiwxMSArMjIyLDExIEBACiAgKiA2NC0xMjc6IDB4MEQwMEMgKyAobi02NCkqMHg0MAogICovCiAjZGVmaW5lIElYR0JFX0RDQV9SWENUUkwoX2kpICAgICgoKF9pKSA8PSAxNSkgPyAoMHgwMjIwMCArICgoX2kpICogNCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX2kpIDwgNjQpID8gKDB4MDEwMEMgKyAoKF9pKSAqIDB4NDApKSA6IFwKKwkJCQkgKCgoX2kpIDwgNjQpID8gKDB4MDEwMEMgKyAoKF9pKSAqIDB4NDApKSA6IFwKIAkJCQkgKDB4MEQwMEMgKyAoKChfaSkgLSA2NCkgKiAweDQwKSkpKQogI2RlZmluZSBJWEdCRV9SRFJYQ1RMICAgICAgICAgICAweDAyRjAwCiAjZGVmaW5lIElYR0JFX1JYUEJTSVpFKF9pKSAgICAgICgweDAzQzAwICsgKChfaSkgKiA0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggb2YgdGhlc2UgMHgwM0MwMCAtIDB4MDNDMUMgKi8KKwkJCQkJICAgICAvKiA4IG9mIHRoZXNlIDB4MDNDMDAgLSAweDAzQzFDICovCiAjZGVmaW5lIElYR0JFX1JYQ1RSTCAgICAweDAzMDAwCiAjZGVmaW5lIElYR0JFX0RST1BFTiAgICAweDAzRDA0CiAjZGVmaW5lIElYR0JFX1JYUEJTSVpFX1NISUZUIDEwCkBAIC0yMzksMTQgKzIzOSwxNCBAQAogLyogTXVsdGljYXN0IFRhYmxlIEFycmF5IC0gMTI4IGVudHJpZXMgKi8KICNkZWZpbmUgSVhHQkVfTVRBKF9pKSAgICgweDA1MjAwICsgKChfaSkgKiA0KSkKICNkZWZpbmUgSVhHQkVfUkFMKF9pKSAgICgoKF9pKSA8PSAxNSkgPyAoMHgwNTQwMCArICgoX2kpICogOCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICgweDBBMjAwICsgKChfaSkgKiA4KSkpCisJCQkgKDB4MEEyMDAgKyAoKF9pKSAqIDgpKSkKICNkZWZpbmUgSVhHQkVfUkFIKF9pKSAgICgoKF9pKSA8PSAxNSkgPyAoMHgwNTQwNCArICgoX2kpICogOCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICgweDBBMjA0ICsgKChfaSkgKiA4KSkpCisJCQkgKDB4MEEyMDQgKyAoKF9pKSAqIDgpKSkKICNkZWZpbmUgSVhHQkVfTVBTQVJfTE8oX2kpICgweDBBNjAwICsgKChfaSkgKiA4KSkKICNkZWZpbmUgSVhHQkVfTVBTQVJfSEkoX2kpICgweDBBNjA0ICsgKChfaSkgKiA4KSkKIC8qIFBhY2tldCBzcGxpdCByZWNlaXZlIHR5cGUgKi8KICNkZWZpbmUgSVhHQkVfUFNSVFlQRShfaSkgICAgKCgoX2kpIDw9IDE1KSA/ICgweDA1NDgwICsgKChfaSkgKiA0KSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRUEwMCArICgoX2kpICogNCkpKQorCQkJICAgICAgKDB4MEVBMDAgKyAoKF9pKSAqIDQpKSkKIC8qIGFycmF5IG9mIDQwOTYgMS1iaXQgdmxhbiBmaWx0ZXJzICovCiAjZGVmaW5lIElYR0JFX1ZGVEEoX2kpICAoMHgwQTAwMCArICgoX2kpICogNCkpCiAvKmFycmF5IG9mIDQwOTYgNC1iaXQgdmxhbiB2bWRxIGluZGljZXMgKi8KQEAgLTY5Niw3ICs2OTYsNyBAQAogCiAjZGVmaW5lIElYR0JFX1JRU01SKF9pKSAoMHgwMjMwMCArICgoX2kpICogNCkpCiAjZGVmaW5lIElYR0JFX1RRU01SKF9pKSAoKChfaSkgPD0gNykgPyAoMHgwNzMwMCArICgoX2kpICogNCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICgweDA4NjAwICsgKChfaSkgKiA0KSkpCisJCQkgKDB4MDg2MDAgKyAoKF9pKSAqIDQpKSkKICNkZWZpbmUgSVhHQkVfVFFTTShfaSkgICgweDA4NjAwICsgKChfaSkgKiA0KSkKIAogI2RlZmluZSBJWEdCRV9RUFJDKF9pKSAoMHgwMTAzMCArICgoX2kpICogMHg0MCkpIC8qIDE2IG9mIHRoZXNlICovCkBAIC04MjAsNyArODIwLDcgQEAKICNkZWZpbmUgSVhHQkVfR0NSX0VYVF9WVF9NT0RFXzMyICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIElYR0JFX0dDUl9FWFRfVlRfTU9ERV82NCAgICAgICAgMHgwMDAwMDAwMwogI2RlZmluZSBJWEdCRV9HQ1JfRVhUX1NSSU9WICAgICAgICAgICAgIChJWEdCRV9HQ1JfRVhUX01TSVhfRU4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0dDUl9FWFRfVlRfTU9ERV82NCkKKwkJCQkJIElYR0JFX0dDUl9FWFRfVlRfTU9ERV82NCkKIAogLyogVGltZSBTeW5jIFJlZ2lzdGVycyAqLwogI2RlZmluZSBJWEdCRV9UU1lOQ1JYQ1RMIDB4MDUxODggLyogUnggVGltZSBTeW5jIENvbnRyb2wgcmVnaXN0ZXIgLSBSVyAqLwpAQCAtMTM5NiwxMCArMTM5NiwxMCBAQAogI2RlZmluZSBJWEdCRV9FSU1DX09USEVSICAgICAgICBJWEdCRV9FSUNSX09USEVSICAgICAvKiBJTlQgQ2F1c2UgQWN0aXZlICovCiAKICNkZWZpbmUgSVhHQkVfRUlNU19FTkFCTEVfTUFTSyAoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfRUlNU19SVFhfUVVFVUUgICAgICAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0VJTVNfTFNDICAgICAgICAgICAgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9FSU1TX1RDUF9USU1FUiAgICAgICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfRUlNU19PVEhFUikKKwkJCQlJWEdCRV9FSU1TX1JUWF9RVUVVRSAgICAgICB8IFwKKwkJCQlJWEdCRV9FSU1TX0xTQyAgICAgICAgICAgICB8IFwKKwkJCQlJWEdCRV9FSU1TX1RDUF9USU1FUiAgICAgICB8IFwKKwkJCQlJWEdCRV9FSU1TX09USEVSKQogCiAvKiBJbW1lZGlhdGUgSW50ZXJydXB0IFJ4IChBLksuQS4gTG93IExhdGVuY3kgSW50ZXJydXB0KSAqLwogI2RlZmluZSBJWEdCRV9JTUlSX1BPUlRfSU1fRU4gICAgIDB4MDAwMTAwMDAgIC8qIFRDUCBwb3J0IGVuYWJsZSAqLwpAQCAtMjE2MSwxOCArMjE2MSwxOCBAQAogCiAvKiBNYXNrcyB0byBkZXRlcm1pbmUgaWYgcGFja2V0cyBzaG91bGQgYmUgZHJvcHBlZCBkdWUgdG8gZnJhbWUgZXJyb3JzICovCiAjZGVmaW5lIElYR0JFX1JYRF9FUlJfRlJBTUVfRVJSX01BU0sgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYRF9FUlJfQ0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYRF9FUlJfTEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYRF9FUlJfUEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYRF9FUlJfT1NFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9SWERfRVJSX1VTRSkKKwkJCQkgICAgICBJWEdCRV9SWERfRVJSX0NFIHwgXAorCQkJCSAgICAgIElYR0JFX1JYRF9FUlJfTEUgfCBcCisJCQkJICAgICAgSVhHQkVfUlhEX0VSUl9QRSB8IFwKKwkJCQkgICAgICBJWEdCRV9SWERfRVJSX09TRSB8IFwKKwkJCQkgICAgICBJWEdCRV9SWERfRVJSX1VTRSkKIAogI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX0ZSQU1FX0VSUl9NQVNLICggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9SWERBRFZfRVJSX0NFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9SWERBRFZfRVJSX0xFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9SWERBRFZfRVJSX1BFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9SWERBRFZfRVJSX09TRSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEQURWX0VSUl9VU0UpCisJCQkJICAgICAgSVhHQkVfUlhEQURWX0VSUl9DRSB8IFwKKwkJCQkgICAgICBJWEdCRV9SWERBRFZfRVJSX0xFIHwgXAorCQkJCSAgICAgIElYR0JFX1JYREFEVl9FUlJfUEUgfCBcCisJCQkJICAgICAgSVhHQkVfUlhEQURWX0VSUl9PU0UgfCBcCisJCQkJICAgICAgSVhHQkVfUlhEQURWX0VSUl9VU0UpCiAKIC8qIE11bHRpY2FzdCBiaXQgbWFzayAqLwogI2RlZmluZSBJWEdCRV9NQ1NUQ1RSTF9NRkUgICAgICAweDQKQEAgLTIzOTMsOSArMjM5Myw5IEBACiAjZGVmaW5lIElYR0JFX0FEVlRYRF9DQyAgICAgICAgIDB4MDAwMDAwODAgLyogQ2hlY2sgQ29udGV4dCAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQgICAgICA4ICAvKiBBZHYgZGVzYyBQT1BUUyBzaGlmdCAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVhTTSAoSVhHQkVfVFhEX1BPUFRTX0lYU00gPDwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfQURWVFhEX1BPUFRTX1NISUZUKQorCQkJCSBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19UWFNNIChJWEdCRV9UWERfUE9QVFNfVFhTTSA8PCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCisJCQkJIElYR0JFX0FEVlRYRF9QT1BUU19TSElGVCkKICNkZWZpbmUgSVhHQkVfQURWVFhEX1BPUFRTX0lTQ09fMVNUICAweDAwMDAwMDAwIC8qIDFzdCBUU08gb2YgaVNDU0kgUERVICovCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19JU0NPX01ETCAgMHgwMDAwMDgwMCAvKiBNaWRkbGUgVFNPIG9mIGlTQ1NJIFBEVSAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVNDT19MQVNUIDB4MDAwMDEwMDAgLyogTGFzdCBUU08gb2YgaVNDU0kgUERVICovCkBAIC0yNDM1LDEwICsyNDM1LDEwIEBACiAjZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwgIDB4MDAyMAogI2RlZmluZSBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCAweDAwODAKICNkZWZpbmUgSVhHQkVfTElOS19TUEVFRF84MjU5OF9BVVRPTkVHIChJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMKQorCQkJCQlJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCkKICNkZWZpbmUgSVhHQkVfTElOS19TUEVFRF84MjU5OV9BVVRPTkVHIChJWEdCRV9MSU5LX1NQRUVEXzEwMF9GVUxMIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwpCisJCQkJCUlYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwgfCBcCisJCQkJCUlYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMKQogCiAKIC8qIFBoeXNpY2FsIGxheWVyIHR5cGUgKi8KQEAgLTI3NDYsNyArMjc0Niw3IEBACiAvKiBGbG93IGNvbnRyb2wgcGFyYW1ldGVycyAqLwogc3RydWN0IGl4Z2JlX2ZjX2luZm8gewogCXUzMiBoaWdoX3dhdGVyW01BWF9UUkFGRklDX0NMQVNTXTsgLyogRmxvdyBDb250cm9sIEhpZ2gtd2F0ZXIgKi8KLQl1MzIgbG93X3dhdGVyOyAvKiBGbG93IENvbnRyb2wgTG93LXdhdGVyICovCisJdTMyIGxvd193YXRlcltNQVhfVFJBRkZJQ19DTEFTU107IC8qIEZsb3cgQ29udHJvbCBMb3ctd2F0ZXIgKi8KIAl1MTYgcGF1c2VfdGltZTsgLyogRmxvdyBDb250cm9sIFBhdXNlIHRpbWVyICovCiAJYm9vbCBzZW5kX3hvbjsgLyogRmxvdyBjb250cm9sIHNlbmQgWE9OICovCiAJYm9vbCBzdHJpY3RfaWVlZTsgLyogU3RyaWN0IElFRUUgbW9kZSAqLwpAQCAtMjg0MCw3ICsyODQwLDcgQEAKIAogLyogaXRlcmF0b3IgdHlwZSBmb3Igd2Fsa2luZyBtdWx0aWNhc3QgYWRkcmVzcyBsaXN0cyAqLwogdHlwZWRlZiB1OCogKCppeGdiZV9tY19hZGRyX2l0cikgKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICoqbWNfYWRkcl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICp2bWRxKTsKKwkJCQkgIHUzMiAqdm1kcSk7CiAKIC8qIEZ1bmN0aW9uIHBvaW50ZXIgdGFibGUgKi8KIHN0cnVjdCBpeGdiZV9lZXByb21fb3BlcmF0aW9ucyB7CkBAIC0yODg3LDcgKzI4ODcsNyBAQAogCXMzMiAoKnNldHVwX2xpbmspKHN0cnVjdCBpeGdiZV9odyAqLCBpeGdiZV9saW5rX3NwZWVkLCBib29sKTsKIAlzMzIgKCpjaGVja19saW5rKShzdHJ1Y3QgaXhnYmVfaHcgKiwgaXhnYmVfbGlua19zcGVlZCAqLCBib29sICosIGJvb2wpOwogCXMzMiAoKmdldF9saW5rX2NhcGFiaWxpdGllcykoc3RydWN0IGl4Z2JlX2h3ICosIGl4Z2JlX2xpbmtfc3BlZWQgKiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKik7CisJCQkJICAgICBib29sICopOwogCiAJLyogUGFja2V0IEJ1ZmZlciBNYW5pcHVsYXRpb24gKi8KIAl2b2lkICgqc2V0X3J4cGJhKShzdHJ1Y3QgaXhnYmVfaHcgKiwgaW50LCB1MzIsIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTQwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTQwLmMKaW5kZXggMTg4YTU5Ny4uNDBkZDc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU0MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NDAuYwpAQCAtODEsNyArODEsNyBAQAogCQkJCSAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJcmV0dXJuIGh3LT5waHkub3BzLnNldHVwX2xpbmtfc3BlZWQoaHcsIHNwZWVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CisJCQkJCSAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpOwogfQogCiAvKioKQEAgLTE1NSw3ICsxNTUsNyBAQAogCS8qIEFkZCB0aGUgU0FOIE1BQyBhZGRyZXNzIHRvIHRoZSBSQVIgb25seSBpZiBpdCdzIGEgdmFsaWQgYWRkcmVzcyAqLwogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGh3LT5tYWMuc2FuX2FkZHIpKSB7CiAJCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzIC0gMSwKLQkJICAgICAgICAgICAgICAgICAgICBody0+bWFjLnNhbl9hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOworCQkJCSAgICBody0+bWFjLnNhbl9hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOwogCiAJCS8qIFNhdmUgdGhlIFNBTiBNQUMgUkFSIGluZGV4ICovCiAJCWh3LT5tYWMuc2FuX21hY19yYXJfaW5kZXggPSBody0+bWFjLm51bV9yYXJfZW50cmllcyAtIDE7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCS8qIFN0b3JlIHRoZSBhbHRlcm5hdGl2ZSBXV05OL1dXUE4gcHJlZml4ICovCiAJaHctPm1hYy5vcHMuZ2V0X3d3bl9wcmVmaXgoaHcsICZody0+bWFjLnd3bm5fcHJlZml4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZody0+bWFjLnd3cG5fcHJlZml4KTsKKwkJCQkgICAmaHctPm1hYy53d3BuX3ByZWZpeCk7CiAKIHJlc2V0X2h3X291dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjM3LDkgKzIzNyw5IEBACiAKIAkJZWVjID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VFQyk7CiAJCWVlcHJvbV9zaXplID0gKHUxNikoKGVlYyAmIElYR0JFX0VFQ19TSVpFKSA+PgotCQkgICAgICAgICAgICAgICAgICAgIElYR0JFX0VFQ19TSVpFX1NISUZUKTsKKwkJCQkgICAgSVhHQkVfRUVDX1NJWkVfU0hJRlQpOwogCQllZXByb20tPndvcmRfc2l6ZSA9IDEgPDwgKGVlcHJvbV9zaXplICsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9FRVBST01fV09SRF9TSVpFX1NISUZUKTsKKwkJCQkJICBJWEdCRV9FRVBST01fV09SRF9TSVpFX1NISUZUKTsKIAogCQlod19kYmcoaHcsICJFZXByb20gcGFyYW1zOiB0eXBlID0gJWQsIHNpemUgPSAlZFxuIiwKIAkJICAgICAgIGVlcHJvbS0+dHlwZSwgZWVwcm9tLT53b3JkX3NpemUpOwpAQCAtNzEyLDggKzcxMiw3IEBACiAJCQl1ZGVsYXkoNTApOwogCQl9CiAJfSBlbHNlIHsKLQkJaHdfZGJnKGh3LCAiU29mdHdhcmUgc2VtYXBob3JlIFNNQkkgYmV0d2VlbiBkZXZpY2UgZHJpdmVycyAiCi0JCSAgICAgICAgICAgIm5vdCBncmFudGVkLlxuIik7CisJCWh3X2RiZyhodywgIlNvZnR3YXJlIHNlbWFwaG9yZSBTTUJJIGJldHdlZW4gZGV2aWNlIGRyaXZlcnMgbm90IGdyYW50ZWQuXG4iKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtODEzLDcgKzgxMiw3IEBACiAJLmNsZWFyX2h3X2NudHJzICAgICAgICAgPSAmaXhnYmVfY2xlYXJfaHdfY250cnNfZ2VuZXJpYywKIAkuZ2V0X21lZGlhX3R5cGUgICAgICAgICA9ICZpeGdiZV9nZXRfbWVkaWFfdHlwZV9YNTQwLAogCS5nZXRfc3VwcG9ydGVkX3BoeXNpY2FsX2xheWVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXhnYmVfZ2V0X3N1cHBvcnRlZF9waHlzaWNhbF9sYXllcl9YNTQwLAorCQkJCSAgJml4Z2JlX2dldF9zdXBwb3J0ZWRfcGh5c2ljYWxfbGF5ZXJfWDU0MCwKIAkuZW5hYmxlX3J4X2RtYSAgICAgICAgICA9ICZpeGdiZV9lbmFibGVfcnhfZG1hX2dlbmVyaWMsCiAJLmdldF9tYWNfYWRkciAgICAgICAgICAgPSAmaXhnYmVfZ2V0X21hY19hZGRyX2dlbmVyaWMsCiAJLmdldF9zYW5fbWFjX2FkZHIgICAgICAgPSAmaXhnYmVfZ2V0X3Nhbl9tYWNfYWRkcl9nZW5lcmljLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2V0aHRvb2wuYwppbmRleCAxYmFlY2I2Li5kNDIwZjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2V0aHRvb2wuYwpAQCAtMTM1LDggKzEzNSw4IEBACiAJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBzcGVlZCk7CiAJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCXJldHVybiAwOwpAQCAtODEzLDUgKzgxMyw1IEBACiAKIHZvaWQgaXhnYmV2Zl9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmaXhnYmV2Zl9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZpeGdiZXZmX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKaW5kZXggZGUyNzkzYi4uNzU0NjdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCkBAIC04NSw3ICs4NSw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXhnYmV2Zl9wY2lfdGJsKTsKIAogTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24sIDxsaW51eC5uaWNzQGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwoUikgODI1OTkgVmlydHVhbCBGdW5jdGlvbiBEcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwoUikgMTAgR2lnYWJpdCBWaXJ0dWFsIEZ1bmN0aW9uIE5ldHdvcmsgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXY2NDN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXY2NDN4eF9ldGguYwppbmRleCBiN2I4ZDc0Li5iMTUxYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdjY0M3h4X2V0aC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Rzby5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0xNzksMTAgKzE4MCwxOCBAQAogICogTWlzYyBkZWZpbml0aW9ucy4KICAqLwogI2RlZmluZSBERUZBVUxUX1JYX1FVRVVFX1NJWkUJMTI4Ci0jZGVmaW5lIERFRkFVTFRfVFhfUVVFVUVfU0laRQkyNTYKKyNkZWZpbmUgREVGQVVMVF9UWF9RVUVVRV9TSVpFCTUxMgogI2RlZmluZSBTS0JfRE1BX1JFQUxJR04JCSgoUEFHRV9TSVpFIC0gTkVUX1NLQl9QQUQpICUgU01QX0NBQ0hFX0JZVEVTKQogCisjZGVmaW5lIFRTT19IRUFERVJfU0laRQkJMTI4CiAKKy8qIE1heCBudW1iZXIgb2YgYWxsb3dlZCBUQ1Agc2VnbWVudHMgZm9yIHNvZnR3YXJlIFRTTyAqLworI2RlZmluZSBNVjY0M1hYX01BWF9UU09fU0VHUyAxMDAKKyNkZWZpbmUgTVY2NDNYWF9NQVhfU0tCX0RFU0NTIChNVjY0M1hYX01BWF9UU09fU0VHUyAqIDIgKyBNQVhfU0tCX0ZSQUdTKQorCisjZGVmaW5lIElTX1RTT19IRUFERVIodHhxLCBhZGRyKSBcCisJKChhZGRyID49IHR4cS0+dHNvX2hkcnNfZG1hKSAmJiBcCisJIChhZGRyIDwgdHhxLT50c29faGRyc19kbWEgKyB0eHEtPnR4X3Jpbmdfc2l6ZSAqIFRTT19IRUFERVJfU0laRSkpCiAvKgogICogUlgvVFggZGVzY3JpcHRvcnMuCiAgKi8KQEAgLTI1MCw2ICsyNTksNyBAQAogI2RlZmluZSBHRU5fVENQX1VEUF9DSEVDS1NVTQkJMHgwMDAyMDAwMAogI2RlZmluZSBVRFBfRlJBTUUJCQkweDAwMDEwMDAwCiAjZGVmaW5lIE1BQ19IRFJfRVhUUkFfNF9CWVRFUwkJMHgwMDAwODAwMAorI2RlZmluZSBHRU5fVENQX1VEUF9DSEtfRlVMTAkJMHgwMDAwMDQwMAogI2RlZmluZSBNQUNfSERSX0VYVFJBXzhfQllURVMJCTB4MDAwMDAyMDAKIAogI2RlZmluZSBUWF9JSExfU0hJRlQJCQkxMQpAQCAtMzQ1LDYgKzM1NSwxMiBAQAogCWludCB0eF9jdXJyX2Rlc2M7CiAJaW50IHR4X3VzZWRfZGVzYzsKIAorCWludCB0eF9zdG9wX3RocmVzaG9sZDsKKwlpbnQgdHhfd2FrZV90aHJlc2hvbGQ7CisKKwljaGFyICp0c29faGRyczsKKwlkbWFfYWRkcl90IHRzb19oZHJzX2RtYTsKKwogCXN0cnVjdCB0eF9kZXNjICp0eF9kZXNjX2FyZWE7CiAJZG1hX2FkZHJfdCB0eF9kZXNjX2RtYTsKIAlpbnQgdHhfZGVzY19hcmVhX3NpemU7CkBAIC00OTEsNyArNTA3LDcgQEAKIAogCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5xKSkgewogCQlfX25ldGlmX3R4X2xvY2sobnEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCWlmICh0eHEtPnR4X3Jpbmdfc2l6ZSAtIHR4cS0+dHhfZGVzY19jb3VudCA+PSBNQVhfU0tCX0ZSQUdTICsgMSkKKwkJaWYgKHR4cS0+dHhfZGVzY19jb3VudCA8PSB0eHEtPnR4X3dha2VfdGhyZXNob2xkKQogCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZShucSk7CiAJCV9fbmV0aWZfdHhfdW5sb2NrKG5xKTsKIAl9CkBAIC02NjEsNiArNjc3LDE5OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIF9fYmUxNiBzdW0xNl9hc19iZShfX3N1bTE2IHN1bSkKK3sKKwlyZXR1cm4gKF9fZm9yY2UgX19iZTE2KXN1bTsKK30KKworc3RhdGljIGludCBza2JfdHhfY3N1bShzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICB1MTYgKmw0aV9jaGssIHUzMiAqY29tbWFuZCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0OworCXUzMiBjbWQgPSAwOworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJaW50IGhkcl9sZW47CisJCWludCB0YWdfYnl0ZXM7CisKKwkJQlVHX09OKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApICYmCisJCSAgICAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSk7CisKKwkJaGRyX2xlbiA9ICh2b2lkICopaXBfaGRyKHNrYikgLSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJdGFnX2J5dGVzID0gaGRyX2xlbiAtIEVUSF9ITEVOOworCisJCWlmIChsZW5ndGggLSBoZHJfbGVuID4gbXAtPnNoYXJlZC0+dHhfY3N1bV9saW1pdCB8fAorCQkgICAgdW5saWtlbHkodGFnX2J5dGVzICYgfjEyKSkgeworCQkJcmV0ID0gc2tiX2NoZWNrc3VtX2hlbHAoc2tiKTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gbm9fY3N1bTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAodGFnX2J5dGVzICYgNCkKKwkJCWNtZCB8PSBNQUNfSERSX0VYVFJBXzRfQllURVM7CisJCWlmICh0YWdfYnl0ZXMgJiA4KQorCQkJY21kIHw9IE1BQ19IRFJfRVhUUkFfOF9CWVRFUzsKKworCQljbWQgfD0gR0VOX1RDUF9VRFBfQ0hFQ0tTVU0gfCBHRU5fVENQX1VEUF9DSEtfRlVMTCB8CisJCQkgICBHRU5fSVBfVjRfQ0hFQ0tTVU0gICB8CisJCQkgICBpcF9oZHIoc2tiKS0+aWhsIDw8IFRYX0lITF9TSElGVDsKKworCQkvKiBUT0RPOiBSZXZpc2l0IHRoaXMuIFdpdGggdGhlIHVzYWdlIG9mIEdFTl9UQ1BfVURQX0NIS19GVUxMCisJCSAqIGl0IHNlZW1zIHdlIGRvbid0IG5lZWQgdG8gcGFzcyB0aGUgaW5pdGlhbCBjaGVja3N1bS4gKi8KKwkJc3dpdGNoIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCWNtZCB8PSBVRFBfRlJBTUU7CisJCQkqbDRpX2NoayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCSpsNGlfY2hrID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV0FSTigxLCAicHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworCQl9CisJfSBlbHNlIHsKK25vX2NzdW06CisJCS8qIEVycmF0YSBCVFMgIzUwLCBJSEwgbXVzdCBiZSA1IGlmIG5vIEhXIGNoZWNrc3VtICovCisJCWNtZCB8PSA1IDw8IFRYX0lITF9TSElGVDsKKwl9CisJKmNvbW1hbmQgPSBjbWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eHFfcHV0X2RhdGFfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0eF9xdWV1ZSAqdHhxLAorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwKKwkJIGJvb2wgbGFzdF90Y3AsIGJvb2wgaXNfbGFzdCkKK3sKKwlpbnQgdHhfaW5kZXg7CisJdTMyIGNtZF9zdHM7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisKKwl0eF9pbmRleCA9IHR4cS0+dHhfY3Vycl9kZXNjKys7CisJaWYgKHR4cS0+dHhfY3Vycl9kZXNjID09IHR4cS0+dHhfcmluZ19zaXplKQorCQl0eHEtPnR4X2N1cnJfZGVzYyA9IDA7CisJZGVzYyA9ICZ0eHEtPnR4X2Rlc2NfYXJlYVt0eF9pbmRleF07CisKKwlkZXNjLT5sNGlfY2hrID0gMDsKKwlkZXNjLT5ieXRlX2NudCA9IGxlbmd0aDsKKwlkZXNjLT5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYucGFyZW50LCBkYXRhLAorCQkJCSAgICAgICBsZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihkZXYtPmRldi5wYXJlbnQsIGRlc2MtPmJ1Zl9wdHIpKSkgeworCQlXQVJOKDEsICJkbWFfbWFwX3NpbmdsZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY21kX3N0cyA9IEJVRkZFUl9PV05FRF9CWV9ETUE7CisJaWYgKGxhc3RfdGNwKSB7CisJCS8qIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgVENQIHBhY2tldCAqLworCQljbWRfc3RzIHw9IFpFUk9fUEFERElORyB8IFRYX0xBU1RfREVTQzsKKwkJLyogbGFzdCBkZXNjcmlwdG9yIGluIFNLQiAqLworCQlpZiAoaXNfbGFzdCkKKwkJCWNtZF9zdHMgfD0gVFhfRU5BQkxFX0lOVEVSUlVQVDsKKwl9CisJZGVzYy0+Y21kX3N0cyA9IGNtZF9zdHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHhxX3B1dF9oZHJfdHNvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0eF9xdWV1ZSAqdHhxLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IHR4cV90b19tcCh0eHEpOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKwlpbnQgdHhfaW5kZXg7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJaW50IHJldDsKKwl1MzIgY21kX2NzdW0gPSAwOworCXUxNiBsNGlfY2hrID0gMDsKKworCXR4X2luZGV4ID0gdHhxLT50eF9jdXJyX2Rlc2M7CisJZGVzYyA9ICZ0eHEtPnR4X2Rlc2NfYXJlYVt0eF9pbmRleF07CisKKwlyZXQgPSBza2JfdHhfY3N1bShtcCwgc2tiLCAmbDRpX2NoaywgJmNtZF9jc3VtLCBsZW5ndGgpOworCWlmIChyZXQpCisJCVdBUk4oMSwgImZhaWxlZCB0byBwcmVwYXJlIGNoZWNrc3VtISIpOworCisJLyogU2hvdWxkIHdlIHNldCB0aGlzPyBDYW4ndCB1c2UgdGhlIHZhbHVlIGZyb20gc2tiX3R4X2NzdW0oKQorCSAqIGFzIGl0J3Mgbm90IHRoZSBjb3JyZWN0IGluaXRpYWwgTDQgY2hlY2tzdW0gdG8gdXNlLiAqLworCWRlc2MtPmw0aV9jaGsgPSAwOworCisJZGVzYy0+Ynl0ZV9jbnQgPSBoZHJfbGVuOworCWRlc2MtPmJ1Zl9wdHIgPSB0eHEtPnRzb19oZHJzX2RtYSArCisJCQl0eHEtPnR4X2N1cnJfZGVzYyAqIFRTT19IRUFERVJfU0laRTsKKwlkZXNjLT5jbWRfc3RzID0gY21kX2NzdW0gfCBCVUZGRVJfT1dORURfQllfRE1BICB8IFRYX0ZJUlNUX0RFU0MgfAorCQkJCSAgIEdFTl9DUkM7CisKKwl0eHEtPnR4X2N1cnJfZGVzYysrOworCWlmICh0eHEtPnR4X2N1cnJfZGVzYyA9PSB0eHEtPnR4X3Jpbmdfc2l6ZSkKKwkJdHhxLT50eF9jdXJyX2Rlc2MgPSAwOworfQorCitzdGF0aWMgaW50IHR4cV9zdWJtaXRfdHNvKHN0cnVjdCB0eF9xdWV1ZSAqdHhxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IHR4cV90b19tcCh0eHEpOworCWludCB0b3RhbF9sZW4sIGRhdGFfbGVmdCwgcmV0OworCWludCBkZXNjX2NvdW50ID0gMDsKKwlzdHJ1Y3QgdHNvX3QgdHNvOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKworCS8qIENvdW50IG5lZWRlZCBkZXNjcmlwdG9ycyAqLworCWlmICgodHhxLT50eF9kZXNjX2NvdW50ICsgdHNvX2NvdW50X2Rlc2NzKHNrYikpID49IHR4cS0+dHhfcmluZ19zaXplKSB7CisJCW5ldGRldl9kYmcoZGV2LCAibm90IGVub3VnaCBkZXNjcmlwdG9ycyBmb3IgVFNPIVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgVFNPIGhhbmRsZXIsIGFuZCBwcmVwYXJlIHRoZSBmaXJzdCBwYXlsb2FkICovCisJdHNvX3N0YXJ0KHNrYiwgJnRzbyk7CisKKwl0b3RhbF9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJd2hpbGUgKHRvdGFsX2xlbiA+IDApIHsKKwkJY2hhciAqaGRyOworCisJCWRhdGFfbGVmdCA9IG1pbl90KGludCwgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSwgdG90YWxfbGVuKTsKKwkJdG90YWxfbGVuIC09IGRhdGFfbGVmdDsKKwkJZGVzY19jb3VudCsrOworCisJCS8qIHByZXBhcmUgcGFja2V0IGhlYWRlcnM6IE1BQyArIElQICsgVENQICovCisJCWhkciA9IHR4cS0+dHNvX2hkcnMgKyB0eHEtPnR4X2N1cnJfZGVzYyAqIFRTT19IRUFERVJfU0laRTsKKwkJdHNvX2J1aWxkX2hkcihza2IsIGhkciwgJnRzbywgZGF0YV9sZWZ0LCB0b3RhbF9sZW4gPT0gMCk7CisJCXR4cV9wdXRfaGRyX3Rzbyhza2IsIHR4cSwgZGF0YV9sZWZ0KTsKKworCQl3aGlsZSAoZGF0YV9sZWZ0ID4gMCkgeworCQkJaW50IHNpemU7CisJCQlkZXNjX2NvdW50Kys7CisKKwkJCXNpemUgPSBtaW5fdChpbnQsIHRzby5zaXplLCBkYXRhX2xlZnQpOworCQkJcmV0ID0gdHhxX3B1dF9kYXRhX3RzbyhkZXYsIHR4cSwgc2tiLCB0c28uZGF0YSwgc2l6ZSwKKwkJCQkJICAgICAgIHNpemUgPT0gZGF0YV9sZWZ0LAorCQkJCQkgICAgICAgdG90YWxfbGVuID09IDApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycl9yZWxlYXNlOworCQkJZGF0YV9sZWZ0IC09IHNpemU7CisJCQl0c29fYnVpbGRfZGF0YShza2IsICZ0c28sIHNpemUpOworCQl9CisJfQorCisJX19za2JfcXVldWVfdGFpbCgmdHhxLT50eF9za2IsIHNrYik7CisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCisJLyogY2xlYXIgVFhfRU5EIHN0YXR1cyAqLworCW1wLT53b3JrX3R4X2VuZCAmPSB+KDEgPDwgdHhxLT5pbmRleCk7CisKKwkvKiBlbnN1cmUgYWxsIGRlc2NyaXB0b3JzIGFyZSB3cml0dGVuIGJlZm9yZSBwb2tpbmcgaGFyZHdhcmUgKi8KKwl3bWIoKTsKKwl0eHFfZW5hYmxlKHR4cSk7CisJdHhxLT50eF9kZXNjX2NvdW50ICs9IGRlc2NfY291bnQ7CisJcmV0dXJuIDA7CitlcnJfcmVsZWFzZToKKwkvKiBUT0RPOiBSZWxlYXNlIGFsbCB1c2VkIGRhdGEgZGVzY3JpcHRvcnM7IGhlYWRlciBkZXNjcmlwdG9ycyBtdXN0IG5vdAorCSAqIGJlIERNQS11bm1hcHBlZC4KKwkgKi8KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCB0eHFfc3VibWl0X2ZyYWdfc2tiKHN0cnVjdCB0eF9xdWV1ZSAqdHhxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IHR4cV90b19tcCh0eHEpOwpAQCAtNjcxLDggKzg3OSwxMCBAQAogCQlza2JfZnJhZ190ICp0aGlzX2ZyYWc7CiAJCWludCB0eF9pbmRleDsKIAkJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJCXZvaWQgKmFkZHI7CiAKIAkJdGhpc19mcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ107CisJCWFkZHIgPSBwYWdlX2FkZHJlc3ModGhpc19mcmFnLT5wYWdlLnApICsgdGhpc19mcmFnLT5wYWdlX29mZnNldDsKIAkJdHhfaW5kZXggPSB0eHEtPnR4X2N1cnJfZGVzYysrOwogCQlpZiAodHhxLT50eF9jdXJyX2Rlc2MgPT0gdHhxLT50eF9yaW5nX3NpemUpCiAJCQl0eHEtPnR4X2N1cnJfZGVzYyA9IDA7CkBAIC02OTIsMTkgKzkwMiwxMyBAQAogCiAJCWRlc2MtPmw0aV9jaGsgPSAwOwogCQlkZXNjLT5ieXRlX2NudCA9IHNrYl9mcmFnX3NpemUodGhpc19mcmFnKTsKLQkJZGVzYy0+YnVmX3B0ciA9IHNrYl9mcmFnX2RtYV9tYXAobXAtPmRldi0+ZGV2LnBhcmVudCwKLQkJCQkJCSB0aGlzX2ZyYWcsIDAsCi0JCQkJCQkgc2tiX2ZyYWdfc2l6ZSh0aGlzX2ZyYWcpLAotCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlkZXNjLT5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUobXAtPmRldi0+ZGV2LnBhcmVudCwgYWRkciwKKwkJCQkJICAgICAgIGRlc2MtPmJ5dGVfY250LCBETUFfVE9fREVWSUNFKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTE2IHN1bTE2X2FzX2JlKF9fc3VtMTYgc3VtKQotewotCXJldHVybiAoX19mb3JjZSBfX2JlMTYpc3VtOwotfQotCi1zdGF0aWMgaW50IHR4cV9zdWJtaXRfc2tiKHN0cnVjdCB0eF9xdWV1ZSAqdHhxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCB0eHFfc3VibWl0X3NrYihzdHJ1Y3QgdHhfcXVldWUgKnR4cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSB0eHFfdG9fbXAodHhxKTsKIAlpbnQgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwpAQCAtNzEyLDU0ICs5MTYsMjIgQEAKIAlzdHJ1Y3QgdHhfZGVzYyAqZGVzYzsKIAl1MzIgY21kX3N0czsKIAl1MTYgbDRpX2NoazsKLQlpbnQgbGVuZ3RoOworCWludCBsZW5ndGgsIHJldDsKIAotCWNtZF9zdHMgPSBUWF9GSVJTVF9ERVNDIHwgR0VOX0NSQyB8IEJVRkZFUl9PV05FRF9CWV9ETUE7CisJY21kX3N0cyA9IDA7CiAJbDRpX2NoayA9IDA7CiAKLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQlpbnQgaGRyX2xlbjsKLQkJaW50IHRhZ19ieXRlczsKLQotCQlCVUdfT04oc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkgJiYKLQkJICAgICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpKTsKLQotCQloZHJfbGVuID0gKHZvaWQgKilpcF9oZHIoc2tiKSAtICh2b2lkICopc2tiLT5kYXRhOwotCQl0YWdfYnl0ZXMgPSBoZHJfbGVuIC0gRVRIX0hMRU47Ci0JCWlmIChza2ItPmxlbiAtIGhkcl9sZW4gPiBtcC0+c2hhcmVkLT50eF9jc3VtX2xpbWl0IHx8Ci0JCSAgICB1bmxpa2VseSh0YWdfYnl0ZXMgJiB+MTIpKSB7Ci0JCQlpZiAoc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSA9PSAwKQotCQkJCWdvdG8gbm9fY3N1bTsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWlmICh0YWdfYnl0ZXMgJiA0KQotCQkJY21kX3N0cyB8PSBNQUNfSERSX0VYVFJBXzRfQllURVM7Ci0JCWlmICh0YWdfYnl0ZXMgJiA4KQotCQkJY21kX3N0cyB8PSBNQUNfSERSX0VYVFJBXzhfQllURVM7Ci0KLQkJY21kX3N0cyB8PSBHRU5fVENQX1VEUF9DSEVDS1NVTSB8Ci0JCQkgICBHRU5fSVBfVjRfQ0hFQ0tTVU0gICB8Ci0JCQkgICBpcF9oZHIoc2tiKS0+aWhsIDw8IFRYX0lITF9TSElGVDsKLQotCQlzd2l0Y2ggKGlwX2hkcihza2IpLT5wcm90b2NvbCkgewotCQljYXNlIElQUFJPVE9fVURQOgotCQkJY21kX3N0cyB8PSBVRFBfRlJBTUU7Ci0JCQlsNGlfY2hrID0gbnRvaHMoc3VtMTZfYXNfYmUodWRwX2hkcihza2IpLT5jaGVjaykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQlsNGlfY2hrID0gbnRvaHMoc3VtMTZfYXNfYmUodGNwX2hkcihza2IpLT5jaGVjaykpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJfQotCX0gZWxzZSB7Ci1ub19jc3VtOgotCQkvKiBFcnJhdGEgQlRTICM1MCwgSUhMIG11c3QgYmUgNSBpZiBubyBIVyBjaGVja3N1bSAqLwotCQljbWRfc3RzIHw9IDUgPDwgVFhfSUhMX1NISUZUOworCWlmICh0eHEtPnR4X3Jpbmdfc2l6ZSAtIHR4cS0+dHhfZGVzY19jb3VudCA8IE1BWF9TS0JfRlJBR1MgKyAxKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQluZXRkZXZfZXJyKGRldiwgInR4IHF1ZXVlIGZ1bGw/IVxuIik7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCisJcmV0ID0gc2tiX3R4X2NzdW0obXAsIHNrYiwgJmw0aV9jaGssICZjbWRfc3RzLCBza2ItPmxlbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwljbWRfc3RzIHw9IFRYX0ZJUlNUX0RFU0MgfCBHRU5fQ1JDIHwgQlVGRkVSX09XTkVEX0JZX0RNQTsKKwogCXR4X2luZGV4ID0gdHhxLT50eF9jdXJyX2Rlc2MrKzsKIAlpZiAodHhxLT50eF9jdXJyX2Rlc2MgPT0gdHhxLT50eF9yaW5nX3NpemUpCiAJCXR4cS0+dHhfY3Vycl9kZXNjID0gMDsKQEAgLTgwMSw3ICs5NzMsNyBAQAogc3RhdGljIG5ldGRldl90eF90IG12NjQzeHhfZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW5ndGgsIHF1ZXVlOworCWludCBsZW5ndGgsIHF1ZXVlLCByZXQ7CiAJc3RydWN0IHR4X3F1ZXVlICp0eHE7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqbnE7CiAKQEAgLTgxMCwzMCArOTgyLDI2IEBACiAJbnEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgcXVldWUpOwogCiAJaWYgKGhhc190aW55X3VuYWxpZ25lZF9mcmFncyhza2IpICYmIF9fc2tiX2xpbmVhcml6ZShza2IpKSB7Ci0JCXR4cS0+dHhfZHJvcHBlZCsrOwogCQluZXRkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwKIAkJCSAgICAgICJmYWlsZWQgdG8gbGluZWFyaXplIHNrYiB3aXRoIHRpbnkgdW5hbGlnbmVkIGZyYWdtZW50XG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAotCWlmICh0eHEtPnR4X3Jpbmdfc2l6ZSAtIHR4cS0+dHhfZGVzY19jb3VudCA8IE1BWF9TS0JfRlJBR1MgKyAxKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQluZXRkZXZfZXJyKGRldiwgInR4IHF1ZXVlIGZ1bGw/IVxuIik7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXJldHVybiBORVRERVZfVFhfT0s7Ci0JfQotCiAJbGVuZ3RoID0gc2tiLT5sZW47CiAKLQlpZiAoIXR4cV9zdWJtaXRfc2tiKHR4cSwgc2tiKSkgewotCQlpbnQgZW50cmllc19sZWZ0OwotCisJaWYgKHNrYl9pc19nc28oc2tiKSkKKwkJcmV0ID0gdHhxX3N1Ym1pdF90c28odHhxLCBza2IsIGRldik7CisJZWxzZQorCQlyZXQgPSB0eHFfc3VibWl0X3NrYih0eHEsIHNrYiwgZGV2KTsKKwlpZiAoIXJldCkgewogCQl0eHEtPnR4X2J5dGVzICs9IGxlbmd0aDsKIAkJdHhxLT50eF9wYWNrZXRzKys7CiAKLQkJZW50cmllc19sZWZ0ID0gdHhxLT50eF9yaW5nX3NpemUgLSB0eHEtPnR4X2Rlc2NfY291bnQ7Ci0JCWlmIChlbnRyaWVzX2xlZnQgPCBNQVhfU0tCX0ZSQUdTICsgMSkKKwkJaWYgKHR4cS0+dHhfZGVzY19jb3VudCA+PSB0eHEtPnR4X3N0b3BfdGhyZXNob2xkKQogCQkJbmV0aWZfdHhfc3RvcF9xdWV1ZShucSk7CisJfSBlbHNlIHsKKwkJdHhxLT50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTkwNywxNCArMTA3NSw5IEBACiAJCQltcC0+ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJfQogCi0JCWlmIChjbWRfc3RzICYgVFhfRklSU1RfREVTQykgeworCQlpZiAoIUlTX1RTT19IRUFERVIodHhxLCBkZXNjLT5idWZfcHRyKSkKIAkJCWRtYV91bm1hcF9zaW5nbGUobXAtPmRldi0+ZGV2LnBhcmVudCwgZGVzYy0+YnVmX3B0ciwKIAkJCQkJIGRlc2MtPmJ5dGVfY250LCBETUFfVE9fREVWSUNFKTsKLQkJfSBlbHNlIHsKLQkJCWRtYV91bm1hcF9wYWdlKG1wLT5kZXYtPmRldi5wYXJlbnQsIGRlc2MtPmJ1Zl9wdHIsCi0JCQkJICAgICAgIGRlc2MtPmJ5dGVfY250LCBETUFfVE9fREVWSUNFKTsKLQkJfQotCiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAl9CiAKQEAgLTEwMTAsOCArMTE3Myw5IEBACiAKIAogLyogbWlpIG1hbmFnZW1lbnQgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBtdjY0M3h4X2FkanVzdF9wc2NyKHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCkKK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgcHNjciA9IHJkbHAobXAsIFBPUlRfU0VSSUFMX0NPTlRST0wpOwogCXUzMiBhdXRvbmVnX2Rpc2FibGUgPSBGT1JDRV9MSU5LX1BBU1MgfAogCSAgICAgICAgICAgICBESVNBQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkgfApAQCAtMTM4Nyw3ICsxNTUxLDcgQEAKIAogCXJldCA9IHBoeV9ldGh0b29sX3NzZXQobXAtPnBoeSwgY21kKTsKIAlpZiAoIXJldCkKLQkJbXY2NDN4eF9hZGp1c3RfcHNjcihtcCk7CisJCW12NjQzeHhfZXRoX2FkanVzdF9saW5rKGRldik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ1Niw3ICsxNjIwLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXAtPnJ4X3Jpbmdfc2l6ZSA9IGVyLT5yeF9wZW5kaW5nIDwgNDA5NiA/IGVyLT5yeF9wZW5kaW5nIDogNDA5NjsKLQltcC0+dHhfcmluZ19zaXplID0gZXItPnR4X3BlbmRpbmcgPCA0MDk2ID8gZXItPnR4X3BlbmRpbmcgOiA0MDk2OworCW1wLT50eF9yaW5nX3NpemUgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgZXItPnR4X3BlbmRpbmcsCisJCQkJICAgTVY2NDNYWF9NQVhfU0tCX0RFU0NTICogMiwgNDA5Nik7CisJaWYgKG1wLT50eF9yaW5nX3NpemUgIT0gZXItPnR4X3BlbmRpbmcpCisJCW5ldGRldl93YXJuKGRldiwgIlRYIHF1ZXVlIHNpemUgc2V0IHRvICV1IChyZXF1ZXN0ZWQgJXUpXG4iLAorCQkJICAgIG1wLT50eF9yaW5nX3NpemUsIGVyLT50eF9wZW5kaW5nKTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJbXY2NDN4eF9ldGhfc3RvcChkZXYpOwpAQCAtMTgzMiw2ICsyMDAwLDEzIEBACiAKIAl0eHEtPnR4X3Jpbmdfc2l6ZSA9IG1wLT50eF9yaW5nX3NpemU7CiAKKwkvKiBBIHF1ZXVlIG11c3QgYWx3YXlzIGhhdmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHNrYi4KKwkgKiBUaGVyZWZvcmUsIHN0b3AgdGhlIHF1ZXVlIHdoZW4gdGhlIGZyZWUgZW50cmllcyByZWFjaGVzCisJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHBlciBza2IuCisJICovCisJdHhxLT50eF9zdG9wX3RocmVzaG9sZCA9IHR4cS0+dHhfcmluZ19zaXplIC0gTVY2NDNYWF9NQVhfU0tCX0RFU0NTOworCXR4cS0+dHhfd2FrZV90aHJlc2hvbGQgPSB0eHEtPnR4X3N0b3BfdGhyZXNob2xkIC8gMjsKKwogCXR4cS0+dHhfZGVzY19jb3VudCA9IDA7CiAJdHhxLT50eF9jdXJyX2Rlc2MgPSAwOwogCXR4cS0+dHhfdXNlZF9kZXNjID0gMDsKQEAgLTE4NzEsNiArMjA0NiwxNSBAQAogCQkJCQluZXh0aSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CiAJfQogCisJLyogQWxsb2NhdGUgRE1BIGJ1ZmZlcnMgZm9yIFRTTyBNQUMvSVAvVENQIGhlYWRlcnMgKi8KKwl0eHEtPnRzb19oZHJzID0gZG1hX2FsbG9jX2NvaGVyZW50KG1wLT5kZXYtPmRldi5wYXJlbnQsCisJCQkJCSAgIHR4cS0+dHhfcmluZ19zaXplICogVFNPX0hFQURFUl9TSVpFLAorCQkJCQkgICAmdHhxLT50c29faGRyc19kbWEsIEdGUF9LRVJORUwpOworCWlmICh0eHEtPnRzb19oZHJzID09IE5VTEwpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQobXAtPmRldi0+ZGV2LnBhcmVudCwgdHhxLT50eF9kZXNjX2FyZWFfc2l6ZSwKKwkJCQkgIHR4cS0+dHhfZGVzY19hcmVhLCB0eHEtPnR4X2Rlc2NfZG1hKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnR4cS0+dHhfc2tiKTsKIAogCXJldHVybiAwOwpAQCAtMTg5MSw2ICsyMDc1LDEwIEBACiAJZWxzZQogCQlkbWFfZnJlZV9jb2hlcmVudChtcC0+ZGV2LT5kZXYucGFyZW50LCB0eHEtPnR4X2Rlc2NfYXJlYV9zaXplLAogCQkJCSAgdHhxLT50eF9kZXNjX2FyZWEsIHR4cS0+dHhfZGVzY19kbWEpOworCWlmICh0eHEtPnRzb19oZHJzKQorCQlkbWFfZnJlZV9jb2hlcmVudChtcC0+ZGV2LT5kZXYucGFyZW50LAorCQkJCSAgdHhxLT50eF9yaW5nX3NpemUgKiBUU09fSEVBREVSX1NJWkUsCisJCQkJICB0eHEtPnRzb19oZHJzLCB0eHEtPnRzb19oZHJzX2RtYSk7CiB9CiAKIApAQCAtMjMwMyw3ICsyNDkxLDcgQEAKIAogCXJldCA9IHBoeV9taWlfaW9jdGwobXAtPnBoeSwgaWZyLCBjbWQpOwogCWlmICghcmV0KQotCQltdjY0M3h4X2FkanVzdF9wc2NyKG1wKTsKKwkJbXY2NDN4eF9ldGhfYWRqdXN0X2xpbmsoZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNjc4LDYgKzI4NjYsNyBAQAogCQkgICAgICAgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKnBkKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtcC0+ZGV2OworCXVuc2lnbmVkIGludCB0eF9yaW5nX3NpemU7CiAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihwZC0+bWFjX2FkZHIpKQogCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGQtPm1hY19hZGRyLCBFVEhfQUxFTik7CkBAIC0yNjkyLDIyICsyODgxLDIyIEBACiAKIAltcC0+cnhxX2NvdW50ID0gcGQtPnJ4X3F1ZXVlX2NvdW50ID8gOiAxOwogCi0JbXAtPnR4X3Jpbmdfc2l6ZSA9IERFRkFVTFRfVFhfUVVFVUVfU0laRTsKKwl0eF9yaW5nX3NpemUgPSBERUZBVUxUX1RYX1FVRVVFX1NJWkU7CiAJaWYgKHBkLT50eF9xdWV1ZV9zaXplKQotCQltcC0+dHhfcmluZ19zaXplID0gcGQtPnR4X3F1ZXVlX3NpemU7CisJCXR4X3Jpbmdfc2l6ZSA9IHBkLT50eF9xdWV1ZV9zaXplOworCisJbXAtPnR4X3Jpbmdfc2l6ZSA9IGNsYW1wX3QodW5zaWduZWQgaW50LCB0eF9yaW5nX3NpemUsCisJCQkJICAgTVY2NDNYWF9NQVhfU0tCX0RFU0NTICogMiwgNDA5Nik7CisJaWYgKG1wLT50eF9yaW5nX3NpemUgIT0gdHhfcmluZ19zaXplKQorCQluZXRkZXZfd2FybihkZXYsICJUWCBxdWV1ZSBzaXplIHNldCB0byAldSAocmVxdWVzdGVkICV1KVxuIiwKKwkJCSAgICBtcC0+dHhfcmluZ19zaXplLCB0eF9yaW5nX3NpemUpOworCiAJbXAtPnR4X2Rlc2Nfc3JhbV9hZGRyID0gcGQtPnR4X3NyYW1fYWRkcjsKIAltcC0+dHhfZGVzY19zcmFtX3NpemUgPSBwZC0+dHhfc3JhbV9zaXplOwogCiAJbXAtPnR4cV9jb3VudCA9IHBkLT50eF9xdWV1ZV9jb3VudCA/IDogMTsKIH0KIAotc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JbXY2NDN4eF9hZGp1c3RfcHNjcihtcCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X3NjYW4oc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wLAogCQkJCSAgIGludCBwaHlfYWRkcikKIHsKQEAgLTI4ODksNyArMzA3OCw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbXY2NDN4eF9ldGhfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbXY2NDN4eF9ldGhfZXRodG9vbF9vcHM7CiAKIAlpbml0X3BzY3IobXAsIHBkLT5zcGVlZCwgcGQtPmR1cGxleCk7CiAKQEAgLTI5MjEsMTEgKzMxMTAsMTQgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gMiAqIEhaOwogCWRldi0+YmFzZV9hZGRyID0gMDsKIAotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9SWENTVU07Ci0JZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1JYQ1NVTTsKLQlkZXYtPnZsYW5fZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU087CisJZGV2LT52bGFuX2ZlYXR1cmVzID0gZGV2LT5mZWF0dXJlczsKKworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9SWENTVU07CisJZGV2LT5od19mZWF0dXJlcyA9IGRldi0+ZmVhdHVyZXM7CiAKIAlkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX1VOSUNBU1RfRkxUOworCWRldi0+Z3NvX21heF9zZWdzID0gTVY2NDNYWF9NQVhfVFNPX1NFR1M7CiAKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm1kaW8uYwppbmRleCA5ZDVjZWQyLi5mYzJmYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZtZGlvLmMKQEAgLTE5NSwxMSArMTk1LDEwIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWJ1cyA9IG1kaW9idXNfYWxsb2Nfc2l6ZShzaXplb2Yoc3RydWN0IG9yaW9uX21kaW9fZGV2KSk7Ci0JaWYgKCFidXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIE1ESU8gYnVzXG4iKTsKKwlidXMgPSBkZXZtX21kaW9idXNfYWxsb2Nfc2l6ZSgmcGRldi0+ZGV2LAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgb3Jpb25fbWRpb19kZXYpKTsKKwlpZiAoIWJ1cykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJYnVzLT5uYW1lID0gIm9yaW9uX21kaW9fYnVzIjsKIAlidXMtPnJlYWQgPSBvcmlvbl9tZGlvX3JlYWQ7CkBAIC0yMDgsMTEgKzIwNywxMCBAQAogCQkgZGV2X25hbWUoJnBkZXYtPmRldikpOwogCWJ1cy0+cGFyZW50ID0gJnBkZXYtPmRldjsKIAotCWJ1cy0+aXJxID0ga21hbGxvYyhzaXplb2YoaW50KSAqIFBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidXMtPmlycSkgewotCQltZGlvYnVzX2ZyZWUoYnVzKTsKKwlidXMtPmlycSA9IGRldm1fa21hbGxvY19hcnJheSgmcGRldi0+ZGV2LCBQSFlfTUFYX0FERFIsIHNpemVvZihpbnQpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghYnVzLT5pcnEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykKIAkJYnVzLT5pcnFbaV0gPSBQSFlfUE9MTDsKQEAgLTI2NCw4ICsyNjIsNiBAQAogb3V0X21kaW86CiAJaWYgKCFJU19FUlIoZGV2LT5jbGspKQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGV2LT5jbGspOwotCWtmcmVlKGJ1cy0+aXJxKTsKLQltZGlvYnVzX2ZyZWUoYnVzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzYsOCArMjcyLDYgQEAKIAogCXdyaXRlbCgwLCBkZXYtPnJlZ3MgKyBNVk1ESU9fRVJSX0lOVF9NQVNLKTsKIAltZGlvYnVzX3VucmVnaXN0ZXIoYnVzKTsKLQlrZnJlZShidXMtPmlycSk7Ci0JbWRpb2J1c19mcmVlKGJ1cyk7CiAJaWYgKCFJU19FUlIoZGV2LT5jbGspKQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGV2LT5jbGspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYwppbmRleCAxNDc4NmM4Li40NWJlY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bmV0L3Rzby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgpAQCAtMjE4LDkgKzIxOSw2IEBACiAjZGVmaW5lIE1WTkVUQV9SWF9DT0FMX1BLVFMJCTMyCiAjZGVmaW5lIE1WTkVUQV9SWF9DT0FMX1VTRUMJCTEwMAogCi0vKiBOYXBpIHBvbGxpbmcgd2VpZ2h0ICovCi0jZGVmaW5lIE1WTkVUQV9SWF9QT0xMX1dFSUdIVAkJNjQKLQogLyogVGhlIHR3byBieXRlcyBNYXJ2ZWxsIGhlYWRlci4gRWl0aGVyIGNvbnRhaW5zIGEgc3BlY2lhbCB2YWx1ZSB1c2VkCiAgKiBieSBNYXJ2ZWxsIHN3aXRjaGVzIHdoZW4gYSBzcGVjaWZpYyBoYXJkd2FyZSBtb2RlIGlzIGVuYWJsZWQgKG5vdAogICogc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyKSBvciBpcyBmaWxsZWQgYXV0b21hdGljYWxseSBieSB6ZXJvZXMgb24KQEAgLTI0NCwxMiArMjQyLDIwIEBACiAKICNkZWZpbmUgTVZORVRBX1RYX01UVV9NQVgJCTB4M2ZmZmYKIAorLyogVFNPIGhlYWRlciBzaXplICovCisjZGVmaW5lIFRTT19IRUFERVJfU0laRSAxMjgKKwogLyogTWF4IG51bWJlciBvZiBSeCBkZXNjcmlwdG9ycyAqLwogI2RlZmluZSBNVk5FVEFfTUFYX1JYRCAxMjgKIAogLyogTWF4IG51bWJlciBvZiBUeCBkZXNjcmlwdG9ycyAqLwogI2RlZmluZSBNVk5FVEFfTUFYX1RYRCA1MzIKIAorLyogTWF4IG51bWJlciBvZiBhbGxvd2VkIFRDUCBzZWdtZW50cyBmb3Igc29mdHdhcmUgVFNPICovCisjZGVmaW5lIE1WTkVUQV9NQVhfVFNPX1NFR1MgMTAwCisKKyNkZWZpbmUgTVZORVRBX01BWF9TS0JfREVTQ1MgKE1WTkVUQV9NQVhfVFNPX1NFR1MgKiAyICsgTUFYX1NLQl9GUkFHUykKKwogLyogZGVzY3JpcHRvciBhbGlnbmVkIHNpemUgKi8KICNkZWZpbmUgTVZORVRBX0RFU0NfQUxJR05FRF9TSVpFCTMyCiAKQEAgLTI1OCw2ICsyNjQsMTAgQEAKIAkgICAgICBFVEhfSExFTiArIEVUSF9GQ1NfTEVOLAkJCSAgICAgXAogCSAgICAgIE1WTkVUQV9DUFVfRF9DQUNIRV9MSU5FX1NJWkUpCiAKKyNkZWZpbmUgSVNfVFNPX0hFQURFUih0eHEsIGFkZHIpIFwKKwkoKGFkZHIgPj0gdHhxLT50c29faGRyc19waHlzKSAmJiBcCisJIChhZGRyIDwgdHhxLT50c29faGRyc19waHlzICsgdHhxLT5zaXplICogVFNPX0hFQURFUl9TSVpFKSkKKwogI2RlZmluZSBNVk5FVEFfUlhfQlVGX1NJWkUocGt0X3NpemUpICAgKChwa3Rfc2l6ZSkgKyBORVRfU0tCX1BBRCkKIAogc3RydWN0IG12bmV0YV9wY3B1X3N0YXRzIHsKQEAgLTI3OSw5ICsyODksNiBAQAogCXUzMiBjYXVzZV9yeF90eDsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKIAotCS8qIE5hcGkgd2VpZ2h0ICovCi0JaW50IHdlaWdodDsKLQogCS8qIENvcmUgY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdTggbWNhc3RfY291bnRbMjU2XTsKQEAgLTM5MCw2ICszOTcsOCBAQAogCSAqIGRlc2NyaXB0b3IgcmluZwogCSAqLwogCWludCBjb3VudDsKKwlpbnQgdHhfc3RvcF90aHJlc2hvbGQ7CisJaW50IHR4X3dha2VfdGhyZXNob2xkOwogCiAJLyogQXJyYXkgb2YgdHJhbnNtaXR0ZWQgc2tiICovCiAJc3RydWN0IHNrX2J1ZmYgKip0eF9za2I7CkBAIC00MTMsNiArNDIyLDEyIEBACiAKIAkvKiBJbmRleCBvZiB0aGUgbmV4dCBUWCBETUEgZGVzY3JpcHRvciB0byBwcm9jZXNzICovCiAJaW50IG5leHRfZGVzY190b19wcm9jOworCisJLyogRE1BIGJ1ZmZlcnMgZm9yIFRTTyBoZWFkZXJzICovCisJY2hhciAqdHNvX2hkcnM7CisKKwkvKiBETUEgYWRkcmVzcyBvZiBUU08gaGVhZGVycyAqLworCWRtYV9hZGRyX3QgdHNvX2hkcnNfcGh5czsKIH07CiAKIHN0cnVjdCBtdm5ldGFfcnhfcXVldWUgewpAQCAtNDQxLDcgKzQ1NiwxMCBAQAogCWludCBuZXh0X2Rlc2NfdG9fcHJvYzsKIH07CiAKLXN0YXRpYyBpbnQgcnhxX251bWJlciA9IDg7CisvKiBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgZWlnaHQgKDgpIHJ4IHF1ZXVlcywgYnV0IHdlIGFyZSBvbmx5IGFsbG93aW5nCisgKiB0aGUgZmlyc3Qgb25lIHRvIGJlIHVzZWQuIFRoZXJlZm9yZSwgbGV0J3MganVzdCBhbGxvY2F0ZSBvbmUgcXVldWUuCisgKi8KK3N0YXRpYyBpbnQgcnhxX251bWJlciA9IDE7CiBzdGF0aWMgaW50IHR4cV9udW1iZXIgPSA4OwogCiBzdGF0aWMgaW50IHJ4cV9kZWY7CkBAIC0xMjc3LDExICsxMjk1LDEyIEBACiAKIAkJbXZuZXRhX3R4cV9pbmNfZ2V0KHR4cSk7CiAKKwkJaWYgKCFJU19UU09fSEVBREVSKHR4cSwgdHhfZGVzYy0+YnVmX3BoeXNfYWRkcikpCisJCQlkbWFfdW5tYXBfc2luZ2xlKHBwLT5kZXYtPmRldi5wYXJlbnQsCisJCQkJCSB0eF9kZXNjLT5idWZfcGh5c19hZGRyLAorCQkJCQkgdHhfZGVzYy0+ZGF0YV9zaXplLCBETUFfVE9fREVWSUNFKTsKIAkJaWYgKCFza2IpCiAJCQljb250aW51ZTsKLQotCQlkbWFfdW5tYXBfc2luZ2xlKHBwLT5kZXYtPmRldi5wYXJlbnQsIHR4X2Rlc2MtPmJ1Zl9waHlzX2FkZHIsCi0JCQkJIHR4X2Rlc2MtPmRhdGFfc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogfQpAQCAtMTMwMiw3ICsxMzIxLDcgQEAKIAl0eHEtPmNvdW50IC09IHR4X2RvbmU7CiAKIAlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChucSkpIHsKLQkJaWYgKHR4cS0+c2l6ZSAtIHR4cS0+Y291bnQgPj0gTUFYX1NLQl9GUkFHUyArIDEpCisJCWlmICh0eHEtPmNvdW50IDw9IHR4cS0+dHhfd2FrZV90aHJlc2hvbGQpCiAJCQluZXRpZl90eF93YWtlX3F1ZXVlKG5xKTsKIAl9CiB9CkBAIC0xNTE5LDE0ICsxNTM4LDEzNCBAQAogCXJldHVybiByeF9kb25lOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQKK212bmV0YV90c29fcHV0X2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwLCBzdHJ1Y3QgbXZuZXRhX3R4X3F1ZXVlICp0eHEpCit7CisJc3RydWN0IG12bmV0YV90eF9kZXNjICp0eF9kZXNjOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKworCXR4cS0+dHhfc2tiW3R4cS0+dHhxX3B1dF9pbmRleF0gPSBOVUxMOworCXR4X2Rlc2MgPSBtdm5ldGFfdHhxX25leHRfZGVzY19nZXQodHhxKTsKKwl0eF9kZXNjLT5kYXRhX3NpemUgPSBoZHJfbGVuOworCXR4X2Rlc2MtPmNvbW1hbmQgPSBtdm5ldGFfc2tiX3R4X2NzdW0ocHAsIHNrYik7CisJdHhfZGVzYy0+Y29tbWFuZCB8PSBNVk5FVEFfVFhEX0ZfREVTQzsKKwl0eF9kZXNjLT5idWZfcGh5c19hZGRyID0gdHhxLT50c29faGRyc19waHlzICsKKwkJCQkgdHhxLT50eHFfcHV0X2luZGV4ICogVFNPX0hFQURFUl9TSVpFOworCW12bmV0YV90eHFfaW5jX3B1dCh0eHEpOworfQorCitzdGF0aWMgaW5saW5lIGludAorbXZuZXRhX3Rzb19wdXRfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbXZuZXRhX3R4X3F1ZXVlICp0eHEsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSwKKwkJICAgIGJvb2wgbGFzdF90Y3AsIGJvb2wgaXNfbGFzdCkKK3sKKwlzdHJ1Y3QgbXZuZXRhX3R4X2Rlc2MgKnR4X2Rlc2M7CisKKwl0eF9kZXNjID0gbXZuZXRhX3R4cV9uZXh0X2Rlc2NfZ2V0KHR4cSk7CisJdHhfZGVzYy0+ZGF0YV9zaXplID0gc2l6ZTsKKwl0eF9kZXNjLT5idWZfcGh5c19hZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYucGFyZW50LCBkYXRhLAorCQkJCQkJc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKGRldi0+ZGV2LnBhcmVudCwKKwkJICAgICB0eF9kZXNjLT5idWZfcGh5c19hZGRyKSkpIHsKKwkJbXZuZXRhX3R4cV9kZXNjX3B1dCh0eHEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0eF9kZXNjLT5jb21tYW5kID0gMDsKKwl0eHEtPnR4X3NrYlt0eHEtPnR4cV9wdXRfaW5kZXhdID0gTlVMTDsKKworCWlmIChsYXN0X3RjcCkgeworCQkvKiBsYXN0IGRlc2NyaXB0b3IgaW4gdGhlIFRDUCBwYWNrZXQgKi8KKwkJdHhfZGVzYy0+Y29tbWFuZCA9IE1WTkVUQV9UWERfTF9ERVNDOworCisJCS8qIGxhc3QgZGVzY3JpcHRvciBpbiBTS0IgKi8KKwkJaWYgKGlzX2xhc3QpCisJCQl0eHEtPnR4X3NrYlt0eHEtPnR4cV9wdXRfaW5kZXhdID0gc2tiOworCX0KKwltdm5ldGFfdHhxX2luY19wdXQodHhxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdm5ldGFfdHhfdHNvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IG12bmV0YV90eF9xdWV1ZSAqdHhxKQoreworCWludCB0b3RhbF9sZW4sIGRhdGFfbGVmdDsKKwlpbnQgZGVzY19jb3VudCA9IDA7CisJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRzb190IHRzbzsKKwlpbnQgaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CisJaW50IGk7CisKKwkvKiBDb3VudCBuZWVkZWQgZGVzY3JpcHRvcnMgKi8KKwlpZiAoKHR4cS0+Y291bnQgKyB0c29fY291bnRfZGVzY3Moc2tiKSkgPj0gdHhxLT5zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChza2JfaGVhZGxlbihza2IpIDwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYikpKSB7CisJCXByX2luZm8oIioqKiBJcyB0aGlzIGV2ZW4gIHBvc3NpYmxlPz8/IT8hP1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIFRTTyBoYW5kbGVyLCBhbmQgcHJlcGFyZSB0aGUgZmlyc3QgcGF5bG9hZCAqLworCXRzb19zdGFydChza2IsICZ0c28pOworCisJdG90YWxfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXdoaWxlICh0b3RhbF9sZW4gPiAwKSB7CisJCWNoYXIgKmhkcjsKKworCQlkYXRhX2xlZnQgPSBtaW5fdChpbnQsIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUsIHRvdGFsX2xlbik7CisJCXRvdGFsX2xlbiAtPSBkYXRhX2xlZnQ7CisJCWRlc2NfY291bnQrKzsKKworCQkvKiBwcmVwYXJlIHBhY2tldCBoZWFkZXJzOiBNQUMgKyBJUCArIFRDUCAqLworCQloZHIgPSB0eHEtPnRzb19oZHJzICsgdHhxLT50eHFfcHV0X2luZGV4ICogVFNPX0hFQURFUl9TSVpFOworCQl0c29fYnVpbGRfaGRyKHNrYiwgaGRyLCAmdHNvLCBkYXRhX2xlZnQsIHRvdGFsX2xlbiA9PSAwKTsKKworCQltdm5ldGFfdHNvX3B1dF9oZHIoc2tiLCBwcCwgdHhxKTsKKworCQl3aGlsZSAoZGF0YV9sZWZ0ID4gMCkgeworCQkJaW50IHNpemU7CisJCQlkZXNjX2NvdW50Kys7CisKKwkJCXNpemUgPSBtaW5fdChpbnQsIHRzby5zaXplLCBkYXRhX2xlZnQpOworCisJCQlpZiAobXZuZXRhX3Rzb19wdXRfZGF0YShkZXYsIHR4cSwgc2tiLAorCQkJCQkJIHRzby5kYXRhLCBzaXplLAorCQkJCQkJIHNpemUgPT0gZGF0YV9sZWZ0LAorCQkJCQkJIHRvdGFsX2xlbiA9PSAwKSkKKwkJCQlnb3RvIGVycl9yZWxlYXNlOworCQkJZGF0YV9sZWZ0IC09IHNpemU7CisKKwkJCXRzb19idWlsZF9kYXRhKHNrYiwgJnRzbywgc2l6ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gZGVzY19jb3VudDsKKworZXJyX3JlbGVhc2U6CisJLyogUmVsZWFzZSBhbGwgdXNlZCBkYXRhIGRlc2NyaXB0b3JzOyBoZWFkZXIgZGVzY3JpcHRvcnMgbXVzdCBub3QKKwkgKiBiZSBETUEtdW5tYXBwZWQuCisJICovCisJZm9yIChpID0gZGVzY19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCXN0cnVjdCBtdm5ldGFfdHhfZGVzYyAqdHhfZGVzYyA9IHR4cS0+ZGVzY3MgKyBpOworCQlpZiAoIUlTX1RTT19IRUFERVIodHhxLCB0eF9kZXNjLT5idWZfcGh5c19hZGRyKSkKKwkJCWRtYV91bm1hcF9zaW5nbGUocHAtPmRldi0+ZGV2LnBhcmVudCwKKwkJCQkJIHR4X2Rlc2MtPmJ1Zl9waHlzX2FkZHIsCisJCQkJCSB0eF9kZXNjLT5kYXRhX3NpemUsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJbXZuZXRhX3R4cV9kZXNjX3B1dCh0eHEpOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyogSGFuZGxlIHR4IGZyYWdtZW50YXRpb24gcHJvY2Vzc2luZyAqLwogc3RhdGljIGludCBtdm5ldGFfdHhfZnJhZ19wcm9jZXNzKHN0cnVjdCBtdm5ldGFfcG9ydCAqcHAsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBzdHJ1Y3QgbXZuZXRhX3R4X3F1ZXVlICp0eHEpCiB7CiAJc3RydWN0IG12bmV0YV90eF9kZXNjICp0eF9kZXNjOwotCWludCBpOworCWludCBpLCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKIAkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCQl2b2lkICphZGRyID0gcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UucCkgKyBmcmFnLT5wYWdlX29mZnNldDsKIApAQCAtMTU0MywyMCArMTY4MiwxNiBAQAogCQkJZ290byBlcnJvcjsKIAkJfQogCi0JCWlmIChpID09IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSkpIHsKKwkJaWYgKGkgPT0gbnJfZnJhZ3MgLSAxKSB7CiAJCQkvKiBMYXN0IGRlc2NyaXB0b3IgKi8KIAkJCXR4X2Rlc2MtPmNvbW1hbmQgPSBNVk5FVEFfVFhEX0xfREVTQyB8IE1WTkVUQV9UWERfWl9QQUQ7Ci0KIAkJCXR4cS0+dHhfc2tiW3R4cS0+dHhxX3B1dF9pbmRleF0gPSBza2I7Ci0KLQkJCW12bmV0YV90eHFfaW5jX3B1dCh0eHEpOwogCQl9IGVsc2UgewogCQkJLyogRGVzY3JpcHRvciBpbiB0aGUgbWlkZGxlOiBOb3QgRmlyc3QsIE5vdCBMYXN0ICovCiAJCQl0eF9kZXNjLT5jb21tYW5kID0gMDsKLQogCQkJdHhxLT50eF9za2JbdHhxLT50eHFfcHV0X2luZGV4XSA9IE5VTEw7Ci0JCQltdm5ldGFfdHhxX2luY19wdXQodHhxKTsKIAkJfQorCQltdm5ldGFfdHhxX2luY19wdXQodHhxKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE1ODQsMTUgKzE3MTksMTggQEAKIAl1MTYgdHhxX2lkID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CiAJc3RydWN0IG12bmV0YV90eF9xdWV1ZSAqdHhxID0gJnBwLT50eHFzW3R4cV9pZF07CiAJc3RydWN0IG12bmV0YV90eF9kZXNjICp0eF9kZXNjOwotCXN0cnVjdCBuZXRkZXZfcXVldWUgKm5xOwogCWludCBmcmFncyA9IDA7CiAJdTMyIHR4X2NtZDsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlnb3RvIG91dDsKIAorCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJZnJhZ3MgPSBtdm5ldGFfdHhfdHNvKHNrYiwgZGV2LCB0eHEpOworCQlnb3RvIG91dDsKKwl9CisKIAlmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOwotCW5xICAgID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHR4cV9pZCk7CiAKIAkvKiBHZXQgYSBkZXNjcmlwdG9yIGZvciB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGFja2V0ICovCiAJdHhfZGVzYyA9IG12bmV0YV90eHFfbmV4dF9kZXNjX2dldCh0eHEpOwpAQCAtMTYzNSwxNSArMTc3MywxNiBAQAogCQl9CiAJfQogCi0JdHhxLT5jb3VudCArPSBmcmFnczsKLQltdm5ldGFfdHhxX3BlbmRfZGVzY19hZGQocHAsIHR4cSwgZnJhZ3MpOwotCi0JaWYgKHR4cS0+c2l6ZSAtIHR4cS0+Y291bnQgPCBNQVhfU0tCX0ZSQUdTICsgMSkKLQkJbmV0aWZfdHhfc3RvcF9xdWV1ZShucSk7Ci0KIG91dDoKIAlpZiAoZnJhZ3MgPiAwKSB7CiAJCXN0cnVjdCBtdm5ldGFfcGNwdV9zdGF0cyAqc3RhdHMgPSB0aGlzX2NwdV9wdHIocHAtPnN0YXRzKTsKKwkJc3RydWN0IG5ldGRldl9xdWV1ZSAqbnEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgdHhxX2lkKTsKKworCQl0eHEtPmNvdW50ICs9IGZyYWdzOworCQltdm5ldGFfdHhxX3BlbmRfZGVzY19hZGQocHAsIHR4cSwgZnJhZ3MpOworCisJCWlmICh0eHEtPmNvdW50ID49IHR4cS0+dHhfc3RvcF90aHJlc2hvbGQpCisJCQluZXRpZl90eF9zdG9wX3F1ZXVlKG5xKTsKIAogCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOwogCQlzdGF0cy0+dHhfcGFja2V0cysrOwpAQCAtMjAwMyw3ICsyMTQyLDcgQEAKIHsKIAlpbnQgcXVldWU7CiAKLQkvKiBmcmVlIHRoZSBza2IncyBpbiB0aGUgaGFsIHR4IHJpbmcgKi8KKwkvKiBmcmVlIHRoZSBza2IncyBpbiB0aGUgdHggcmluZyAqLwogCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IHR4cV9udW1iZXI7IHF1ZXVlKyspCiAJCW12bmV0YV90eHFfZG9uZV9mb3JjZShwcCwgJnBwLT50eHFzW3F1ZXVlXSk7CiAKQEAgLTIwODEsNiArMjIyMCwxNCBAQAogewogCXR4cS0+c2l6ZSA9IHBwLT50eF9yaW5nX3NpemU7CiAKKwkvKiBBIHF1ZXVlIG11c3QgYWx3YXlzIGhhdmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHNrYi4KKwkgKiBUaGVyZWZvcmUsIHN0b3AgdGhlIHF1ZXVlIHdoZW4gdGhlIGZyZWUgZW50cmllcyByZWFjaGVzCisJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHBlciBza2IuCisJICovCisJdHhxLT50eF9zdG9wX3RocmVzaG9sZCA9IHR4cS0+c2l6ZSAtIE1WTkVUQV9NQVhfU0tCX0RFU0NTOworCXR4cS0+dHhfd2FrZV90aHJlc2hvbGQgPSB0eHEtPnR4X3N0b3BfdGhyZXNob2xkIC8gMjsKKworCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBUWCBkZXNjcmlwdG9ycyAqLwogCXR4cS0+ZGVzY3MgPSBkbWFfYWxsb2NfY29oZXJlbnQocHAtPmRldi0+ZGV2LnBhcmVudCwKIAkJCQkJdHhxLT5zaXplICogTVZORVRBX0RFU0NfQUxJR05FRF9TSVpFLApAQCAtMjEwOSw2ICsyMjU2LDE4IEBACiAJCQkJICB0eHEtPmRlc2NzLCB0eHEtPmRlc2NzX3BoeXMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwkvKiBBbGxvY2F0ZSBETUEgYnVmZmVycyBmb3IgVFNPIE1BQy9JUC9UQ1AgaGVhZGVycyAqLworCXR4cS0+dHNvX2hkcnMgPSBkbWFfYWxsb2NfY29oZXJlbnQocHAtPmRldi0+ZGV2LnBhcmVudCwKKwkJCQkJICAgdHhxLT5zaXplICogVFNPX0hFQURFUl9TSVpFLAorCQkJCQkgICAmdHhxLT50c29faGRyc19waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAodHhxLT50c29faGRycyA9PSBOVUxMKSB7CisJCWtmcmVlKHR4cS0+dHhfc2tiKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHAtPmRldi0+ZGV2LnBhcmVudCwKKwkJCQkgIHR4cS0+c2l6ZSAqIE1WTkVUQV9ERVNDX0FMSUdORURfU0laRSwKKwkJCQkgIHR4cS0+ZGVzY3MsIHR4cS0+ZGVzY3NfcGh5cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAltdm5ldGFfdHhfZG9uZV9wa3RzX2NvYWxfc2V0KHBwLCB0eHEsIHR4cS0+ZG9uZV9wa3RzX2NvYWwpOwogCiAJcmV0dXJuIDA7CkBAIC0yMTIwLDYgKzIyNzksMTAgQEAKIHsKIAlrZnJlZSh0eHEtPnR4X3NrYik7CiAKKwlpZiAodHhxLT50c29faGRycykKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHAtPmRldi0+ZGV2LnBhcmVudCwKKwkJCQkgIHR4cS0+c2l6ZSAqIFRTT19IRUFERVJfU0laRSwKKwkJCQkgIHR4cS0+dHNvX2hkcnMsIHR4cS0+dHNvX2hkcnNfcGh5cyk7CiAJaWYgKHR4cS0+ZGVzY3MpCiAJCWRtYV9mcmVlX2NvaGVyZW50KHBwLT5kZXYtPmRldi5wYXJlbnQsCiAJCQkJICB0eHEtPnNpemUgKiBNVk5FVEFfREVTQ19BTElHTkVEX1NJWkUsCkBAIC0yMjc5LDI0ICsyNDQyLDI4IEBACiAJCXJldHVybiAwOwogCiAJLyogVGhlIGludGVyZmFjZSBpcyBydW5uaW5nLCBzbyB3ZSBoYXZlIHRvIGZvcmNlIGEKLQkgKiByZWFsbG9jYXRpb24gb2YgdGhlIFJYUXMKKwkgKiByZWFsbG9jYXRpb24gb2YgdGhlIHF1ZXVlcwogCSAqLwogCW12bmV0YV9zdG9wX2RldihwcCk7CiAKIAltdm5ldGFfY2xlYW51cF90eHFzKHBwKTsKIAltdm5ldGFfY2xlYW51cF9yeHFzKHBwKTsKIAotCXBwLT5wa3Rfc2l6ZSA9IE1WTkVUQV9SWF9QS1RfU0laRShwcC0+ZGV2LT5tdHUpOworCXBwLT5wa3Rfc2l6ZSA9IE1WTkVUQV9SWF9QS1RfU0laRShkZXYtPm10dSk7CiAJcHAtPmZyYWdfc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKE1WTkVUQV9SWF9CVUZfU0laRShwcC0+cGt0X3NpemUpKSArCiAJICAgICAgICAgICAgICAgIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CiAKIAlyZXQgPSBtdm5ldGFfc2V0dXBfcnhxcyhwcCk7CiAJaWYgKHJldCkgewotCQluZXRkZXZfZXJyKHBwLT5kZXYsICJ1bmFibGUgdG8gc2V0dXAgcnhxcyBhZnRlciBNVFUgY2hhbmdlXG4iKTsKKwkJbmV0ZGV2X2VycihkZXYsICJ1bmFibGUgdG8gc2V0dXAgcnhxcyBhZnRlciBNVFUgY2hhbmdlXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQltdm5ldGFfc2V0dXBfdHhxcyhwcCk7CisJcmV0ID0gbXZuZXRhX3NldHVwX3R4cXMocHApOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJ1bmFibGUgdG8gc2V0dXAgdHhxcyBhZnRlciBNVFUgY2hhbmdlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAltdm5ldGFfc3RhcnRfZGV2KHBwKTsKIAltdm5ldGFfcG9ydF91cChwcCk7CkBAIC0yMzIzLDIyICsyNDkwLDE5IEBACiBzdGF0aWMgaW50IG12bmV0YV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1OCAqbWFjID0gYWRkciArIDI7Ci0JaW50IGk7CisJc3RydWN0IHNvY2thZGRyICpzb2NrYWRkciA9IGFkZHI7CisJaW50IHJldDsKIAotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwlyZXQgPSBldGhfcHJlcGFyZV9tYWNfYWRkcl9jaGFuZ2UoZGV2LCBhZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAkvKiBSZW1vdmUgcHJldmlvdXMgYWRkcmVzcyB0YWJsZSBlbnRyeSAqLwogCW12bmV0YV9tYWNfYWRkcl9zZXQocHAsIGRldi0+ZGV2X2FkZHIsIC0xKTsKIAogCS8qIFNldCBuZXcgYWRkciBpbiBodyAqLwotCW12bmV0YV9tYWNfYWRkcl9zZXQocHAsIG1hYywgcnhxX2RlZik7CisJbXZuZXRhX21hY19hZGRyX3NldChwcCwgc29ja2FkZHItPnNhX2RhdGEsIHJ4cV9kZWYpOwogCi0JLyogU2V0IGFkZHIgaW4gdGhlIGRldmljZSAqLwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQlkZXYtPmRldl9hZGRyW2ldID0gbWFjW2ldOwotCisJZXRoX2NvbW1pdF9tYWNfYWRkcl9jaGFuZ2UoZGV2LCBhZGRyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQzMyw4ICsyNTk3LDYgQEAKIAlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JbXZuZXRhX21hY19hZGRyX3NldChwcCwgZGV2LT5kZXZfYWRkciwgcnhxX2RlZik7Ci0KIAlwcC0+cGt0X3NpemUgPSBNVk5FVEFfUlhfUEtUX1NJWkUocHAtPmRldi0+bXR1KTsKIAlwcC0+ZnJhZ19zaXplID0gU0tCX0RBVEFfQUxJR04oTVZORVRBX1JYX0JVRl9TSVpFKHBwLT5wa3Rfc2l6ZSkpICsKIAkgICAgICAgICAgICAgICAgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKQEAgLTI2MDAsOCArMjc2MiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlwcC0+cnhfcmluZ19zaXplID0gcmluZy0+cnhfcGVuZGluZyA8IE1WTkVUQV9NQVhfUlhEID8KIAkJcmluZy0+cnhfcGVuZGluZyA6IE1WTkVUQV9NQVhfUlhEOwotCXBwLT50eF9yaW5nX3NpemUgPSByaW5nLT50eF9wZW5kaW5nIDwgTVZORVRBX01BWF9UWEQgPwotCQlyaW5nLT50eF9wZW5kaW5nIDogTVZORVRBX01BWF9UWEQ7CisKKwlwcC0+dHhfcmluZ19zaXplID0gY2xhbXBfdCh1MTYsIHJpbmctPnR4X3BlbmRpbmcsCisJCQkJICAgTVZORVRBX01BWF9TS0JfREVTQ1MgKiAyLCBNVk5FVEFfTUFYX1RYRCk7CisJaWYgKHBwLT50eF9yaW5nX3NpemUgIT0gcmluZy0+dHhfcGVuZGluZykKKwkJbmV0ZGV2X3dhcm4oZGV2LCAiVFggcXVldWUgc2l6ZSBzZXQgdG8gJXUgKHJlcXVlc3RlZCAldSlcbiIsCisJCQkgICAgcHAtPnR4X3Jpbmdfc2l6ZSwgcmluZy0+dHhfcGVuZGluZyk7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCW12bmV0YV9zdG9wKGRldik7CkBAIC0yNjM4LDcgKzI4MDQsNyBAQAogfTsKIAogLyogSW5pdGlhbGl6ZSBodyAqLwotc3RhdGljIGludCBtdm5ldGFfaW5pdChzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwLCBpbnQgcGh5X2FkZHIpCitzdGF0aWMgaW50IG12bmV0YV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKIHsKIAlpbnQgcXVldWU7CiAKQEAgLTI2NDgsOCArMjgxNCw4IEBACiAJLyogU2V0IHBvcnQgZGVmYXVsdCB2YWx1ZXMgKi8KIAltdm5ldGFfZGVmYXVsdHNfc2V0KHBwKTsKIAotCXBwLT50eHFzID0ga3phbGxvYyh0eHFfbnVtYmVyICogc2l6ZW9mKHN0cnVjdCBtdm5ldGFfdHhfcXVldWUpLAotCQkJICAgR0ZQX0tFUk5FTCk7CisJcHAtPnR4cXMgPSBkZXZtX2tjYWxsb2MoZGV2LCB0eHFfbnVtYmVyLCBzaXplb2Yoc3RydWN0IG12bmV0YV90eF9xdWV1ZSksCisJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcC0+dHhxcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI2NjEsMTIgKzI4MjcsMTAgQEAKIAkJdHhxLT5kb25lX3BrdHNfY29hbCA9IE1WTkVUQV9UWERPTkVfQ09BTF9QS1RTOwogCX0KIAotCXBwLT5yeHFzID0ga3phbGxvYyhyeHFfbnVtYmVyICogc2l6ZW9mKHN0cnVjdCBtdm5ldGFfcnhfcXVldWUpLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcC0+cnhxcykgewotCQlrZnJlZShwcC0+dHhxcyk7CisJcHAtPnJ4cXMgPSBkZXZtX2tjYWxsb2MoZGV2LCByeHFfbnVtYmVyLCBzaXplb2Yoc3RydWN0IG12bmV0YV9yeF9xdWV1ZSksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcC0+cnhxcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogQ3JlYXRlIFJ4IGRlc2NyaXB0b3IgcmluZ3MgKi8KIAlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCByeHFfbnVtYmVyOyBxdWV1ZSsrKSB7CkBAIC0yNjgwLDEyICsyODQ0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXZuZXRhX2RlaW5pdChzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwKQotewotCWtmcmVlKHBwLT50eHFzKTsKLQlrZnJlZShwcC0+cnhxcyk7Ci19Ci0KIC8qIHBsYXRmb3JtIGdsdWUgOiBpbml0aWFsaXplIGRlY29kaW5nIHdpbmRvd3MgKi8KIHN0YXRpYyB2b2lkIG12bmV0YV9jb25mX21idXNfd2luZG93cyhzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyAqZHJhbSkKQEAgLTI3NjgsNyArMjkyNiw2IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7Ci0JdTMyIHBoeV9hZGRyOwogCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAljb25zdCBjaGFyICpkdF9tYWNfYWRkcjsKQEAgLTI3OTcsOSArMjk1NCwyMiBAQAogCiAJcGh5X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRuLCAicGh5IiwgMCk7CiAJaWYgKCFwaHlfbm9kZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBhc3NvY2lhdGVkIFBIWVxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2ZyZWVfaXJxOworCQlpZiAoIW9mX3BoeV9pc19maXhlZF9saW5rKGRuKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gUEhZIHNwZWNpZmllZFxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBlcnJfZnJlZV9pcnE7CisJCX0KKworCQllcnIgPSBvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluayhkbik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgZml4ZWQgUEhZXG4iKTsKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxOworCQl9CisKKwkJLyogSW4gdGhlIGNhc2Ugb2YgYSBmaXhlZCBQSFksIHRoZSBEVCBub2RlIGFzc29jaWF0ZWQKKwkJICogdG8gdGhlIFBIWSBpcyB0aGUgRXRoZXJuZXQgTUFDIERUIG5vZGUuCisJCSAqLworCQlwaHlfbm9kZSA9IGRuOwogCX0KIAogCXBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKGRuKTsKQEAgLTI4MTMsMTEgKzI5ODMsOSBAQAogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CiAJZGV2LT5uZXRkZXZfb3BzID0gJm12bmV0YV9uZXRkZXZfb3BzOwogCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJm12bmV0YV9ldGhfdG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbXZuZXRhX2V0aF90b29sX29wczsKIAogCXBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXBwLT53ZWlnaHQgPSBNVk5FVEFfUlhfUE9MTF9XRUlHSFQ7CiAJcHAtPnBoeV9ub2RlID0gcGh5X25vZGU7CiAJcHAtPnBoeV9pbnRlcmZhY2UgPSBwaHlfbW9kZTsKIApAQCAtMjg2NCwzMyArMzAzMiwzMiBAQAogCXBwLT5kZXYgPSBkZXY7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAotCWVyciA9IG12bmV0YV9pbml0KHBwLCBwaHlfYWRkcik7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgaW5pdCBldGggaGFsXG4iKTsKKwllcnIgPSBtdm5ldGFfaW5pdCgmcGRldi0+ZGV2LCBwcCk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX2ZyZWVfc3RhdHM7Ci0JfQogCiAJZXJyID0gbXZuZXRhX3BvcnRfcG93ZXJfdXAocHAsIHBoeV9tb2RlKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBwb3dlciB1cCBwb3J0XG4iKTsKLQkJZ290byBlcnJfZGVpbml0OworCQlnb3RvIGVycl9mcmVlX3N0YXRzOwogCX0KIAogCWRyYW1fdGFyZ2V0X2luZm8gPSBtdl9tYnVzX2RyYW1faW5mbygpOwogCWlmIChkcmFtX3RhcmdldF9pbmZvKQogCQltdm5ldGFfY29uZl9tYnVzX3dpbmRvd3MocHAsIGRyYW1fdGFyZ2V0X2luZm8pOwogCi0JbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHAtPm5hcGksIG12bmV0YV9wb2xsLCBwcC0+d2VpZ2h0KTsKKwluZXRpZl9uYXBpX2FkZChkZXYsICZwcC0+bmFwaSwgbXZuZXRhX3BvbGwsIE5BUElfUE9MTF9XRUlHSFQpOwogCi0JZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07Ci0JZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOwotCWRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU087CisJZGV2LT5od19mZWF0dXJlcyB8PSBkZXYtPmZlYXR1cmVzOworCWRldi0+dmxhbl9mZWF0dXJlcyB8PSBkZXYtPmZlYXR1cmVzOwogCWRldi0+cHJpdl9mbGFncyB8PSBJRkZfVU5JQ0FTVF9GTFQ7CisJZGV2LT5nc29fbWF4X3NlZ3MgPSBNVk5FVEFfTUFYX1RTT19TRUdTOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyXG4iKTsKLQkJZ290byBlcnJfZGVpbml0OworCQlnb3RvIGVycl9mcmVlX3N0YXRzOwogCX0KIAogCW5ldGRldl9pbmZvKGRldiwgIlVzaW5nICVzIG1hYyBhZGRyZXNzICVwTVxuIiwgbWFjX2Zyb20sCkBAIC0yOTAwLDggKzMwNjcsNiBAQAogCiAJcmV0dXJuIDA7CiAKLWVycl9kZWluaXQ6Ci0JbXZuZXRhX2RlaW5pdChwcCk7CiBlcnJfZnJlZV9zdGF0czoKIAlmcmVlX3BlcmNwdShwcC0+c3RhdHMpOwogZXJyX2NsazoKQEAgLTI5MjAsNyArMzA4NSw2IEBACiAJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCW12bmV0YV9kZWluaXQocHApOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcC0+Y2xrKTsKIAlmcmVlX3BlcmNwdShwcC0+c3RhdHMpOwogCWlycV9kaXNwb3NlX21hcHBpbmcoZGV2LT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9weGExNjhfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3B4YTE2OF9ldGguYwppbmRleCBiMzU4YzJmLi44ZjVhYTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3B4YTE2OF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3B4YTE2OF9ldGguYwpAQCAtMTQ4OCw3ICsxNDg4LDcgQEAKIAlkZXYtPm5ldGRldl9vcHMgPSAmcHhhMTY4X2V0aF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7CiAJZGV2LT5iYXNlX2FkZHIgPSAwOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZweGExNjhfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmcHhhMTY4X2V0aHRvb2xfb3BzOwogCiAJSU5JVF9XT1JLKCZwZXAtPnR4X3RpbWVvdXRfdGFzaywgcHhhMTY4X2V0aF90eF90aW1lb3V0X3Rhc2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCmluZGV4IGI4MTEwNjQuLjY5NjkzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCkBAIC00NzYwLDcgKzQ3NjAsNyBAQAogCiAJU0VUX05FVERFVl9ERVYoZGV2LCAmaHctPnBkZXYtPmRldik7CiAJZGV2LT5pcnEgPSBody0+cGRldi0+aXJxOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZza3kyX2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnNreTJfZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1dBVENIRE9HOwogCWRldi0+bmV0ZGV2X29wcyA9ICZza3kyX25ldGRldl9vcHNbcG9ydF07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCmluZGV4IDI5YjYxNjkuLjVkOTQwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYwpAQCAtMjEyLDggKzIxMiw3IEBACiAKIAkvKiBGaXJzdCwgdmVyaWZ5IHRoYXQgdGhlIG1hc3RlciByZXBvcnRzIGNvcnJlY3Qgc3RhdHVzICovCiAJaWYgKGNvbW1fcGVuZGluZyhkZXYpKSB7Ci0JCW1seDRfd2FybihkZXYsICJDb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgbm90IGlkbGUuIgotCQkJICAibXkgdG9nZ2xlIGlzICVkIChjbWQ6MHgleClcbiIsCisJCW1seDRfd2FybihkZXYsICJDb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgbm90IGlkbGUgLSBteSB0b2dnbGUgaXMgJWQgKGNtZDoweCV4KVxuIiwKIAkJCSAgcHJpdi0+Y21kLmNvbW1fdG9nZ2xlLCBjbWQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC00MjIsOSArNDIxLDggQEAKIAkJCQkJKm91dF9wYXJhbSA9CiAJCQkJCQliZTY0X3RvX2NwdSh2aGNyLT5vdXRfcGFyYW0pOwogCQkJCWVsc2UgewotCQkJCQltbHg0X2VycihkZXYsICJyZXNwb25zZSBleHBlY3RlZCB3aGlsZSIKLQkJCQkJCSAib3V0cHV0IG1haWxib3ggaXMgTlVMTCBmb3IgIgotCQkJCQkJICJjb21tYW5kIDB4JXhcbiIsIG9wKTsKKwkJCQkJbWx4NF9lcnIoZGV2LCAicmVzcG9uc2UgZXhwZWN0ZWQgd2hpbGUgb3V0cHV0IG1haWxib3ggaXMgTlVMTCBmb3IgY29tbWFuZCAweCV4XG4iLAorCQkJCQkJIG9wKTsKIAkJCQkJdmhjci0+c3RhdHVzID0gQ01EX1NUQVRfQkFEX1BBUkFNOwogCQkJCX0KIAkJCX0KQEAgLTQzOSwxNiArNDM3LDE1IEBACiAJCQkJCSpvdXRfcGFyYW0gPQogCQkJCQkJYmU2NF90b19jcHUodmhjci0+b3V0X3BhcmFtKTsKIAkJCQllbHNlIHsKLQkJCQkJbWx4NF9lcnIoZGV2LCAicmVzcG9uc2UgZXhwZWN0ZWQgd2hpbGUiCi0JCQkJCQkgIm91dHB1dCBtYWlsYm94IGlzIE5VTEwgZm9yICIKLQkJCQkJCSAiY29tbWFuZCAweCV4XG4iLCBvcCk7CisJCQkJCW1seDRfZXJyKGRldiwgInJlc3BvbnNlIGV4cGVjdGVkIHdoaWxlIG91dHB1dCBtYWlsYm94IGlzIE5VTEwgZm9yIGNvbW1hbmQgMHgleFxuIiwKKwkJCQkJCSBvcCk7CiAJCQkJCXZoY3ItPnN0YXR1cyA9IENNRF9TVEFUX0JBRF9QQVJBTTsKIAkJCQl9CiAJCQl9CiAJCQlyZXQgPSBtbHg0X3N0YXR1c190b19lcnJubyh2aGNyLT5zdGF0dXMpOwogCQl9IGVsc2UKLQkJCW1seDRfZXJyKGRldiwgImZhaWxlZCBleGVjdXRpb24gb2YgVkhDUl9QT1NUIGNvbW1hbmQiCi0JCQkJICJvcGNvZGUgMHgleFxuIiwgb3ApOworCQkJbWx4NF9lcnIoZGV2LCAiZmFpbGVkIGV4ZWN1dGlvbiBvZiBWSENSX1BPU1QgY29tbWFuZCBvcGNvZGUgMHgleFxuIiwKKwkJCQkgb3ApOwogCX0KIAogCW11dGV4X3VubG9jaygmcHJpdi0+Y21kLnNsYXZlX2NtZF9tdXRleCk7CkBAIC00NzYsNiArNDczLDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChvdXRfaXNfaW1tICYmICFvdXRfcGFyYW0pIHsKKwkJbWx4NF9lcnIoZGV2LCAicmVzcG9uc2UgZXhwZWN0ZWQgd2hpbGUgb3V0cHV0IG1haWxib3ggaXMgTlVMTCBmb3IgY29tbWFuZCAweCV4XG4iLAorCQkJIG9wKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJZXJyID0gbWx4NF9jbWRfcG9zdChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0gPyAqb3V0X3BhcmFtIDogMCwKIAkJCSAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsIG9wLCBDTURfUE9MTF9UT0tFTiwgMCk7CiAJaWYgKGVycikKQEAgLTU1NCw2ICs1NTgsMTMgQEAKIAljbWQtPmZyZWVfaGVhZCA9IGNvbnRleHQtPm5leHQ7CiAJc3Bpbl91bmxvY2soJmNtZC0+Y29udGV4dF9sb2NrKTsKIAorCWlmIChvdXRfaXNfaW1tICYmICFvdXRfcGFyYW0pIHsKKwkJbWx4NF9lcnIoZGV2LCAicmVzcG9uc2UgZXhwZWN0ZWQgd2hpbGUgb3V0cHV0IG1haWxib3ggaXMgTlVMTCBmb3IgY29tbWFuZCAweCV4XG4iLAorCQkJIG9wKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LT5kb25lKTsKIAogCW1seDRfY21kX3Bvc3QoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtID8gKm91dF9wYXJhbSA6IDAsCkBAIC02MjUsOSArNjM2LDggQEAKIAogCWlmICgoc2xhdmVfYWRkciAmIDB4ZmZmKSB8IChtYXN0ZXJfYWRkciAmIDB4ZmZmKSB8CiAJICAgIChzbGF2ZSAmIH4weDdmKSB8IChzaXplICYgMHhmZikpIHsKLQkJbWx4NF9lcnIoZGV2LCAiQmFkIGFjY2VzcyBtZW0gcGFyYW1zIC0gc2xhdmVfYWRkcjoweCVsbHggIgotCQkJICAgICAgIm1hc3Rlcl9hZGRyOjB4JWxseCBzbGF2ZV9pZDolZCBzaXplOiVkXG4iLAotCQkJICAgICAgc2xhdmVfYWRkciwgbWFzdGVyX2FkZHIsIHNsYXZlLCBzaXplKTsKKwkJbWx4NF9lcnIoZGV2LCAiQmFkIGFjY2VzcyBtZW0gcGFyYW1zIC0gc2xhdmVfYWRkcjoweCVsbHggbWFzdGVyX2FkZHI6MHglbGx4IHNsYXZlX2lkOiVkIHNpemU6JWRcbiIsCisJCQkgc2xhdmVfYWRkciwgbWFzdGVyX2FkZHIsIHNsYXZlLCBzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDIyLDggKzE0MzIsOCBAQAogCQkJCSAgICAgIEFMSUdOKHNpemVvZihzdHJ1Y3QgbWx4NF92aGNyX2NtZCksCiAJCQkJCSAgICBNTFg0X0FDQ0VTU19NRU1fQUxJR04pLCAxKTsKIAkJaWYgKHJldCkgewotCQkJbWx4NF9lcnIoZGV2LCAiJXM6RmFpbGVkIHJlYWRpbmcgdmhjciIKLQkJCQkgInJldDogMHgleFxuIiwgX19mdW5jX18sIHJldCk7CisJCQltbHg0X2VycihkZXYsICIlczogRmFpbGVkIHJlYWRpbmcgdmhjciByZXQ6IDB4JXhcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOwogCQkJa2ZyZWUodmhjcik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC0xNDc0LDkgKzE0ODQsOCBAQAogCiAJLyogQXBwbHkgcGVybWlzc2lvbiBhbmQgYm91bmQgY2hlY2tzIGlmIGFwcGxpY2FibGUgKi8KIAlpZiAoY21kLT52ZXJpZnkgJiYgY21kLT52ZXJpZnkoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gpKSB7Ci0JCW1seDRfd2FybihkZXYsICJDb21tYW5kOjB4JXggZnJvbSBzbGF2ZTogJWQgZmFpbGVkIHByb3RlY3Rpb24gIgotCQkJICAiY2hlY2tzIGZvciByZXNvdXJjZV9pZDolZFxuIiwgdmhjci0+b3AsIHNsYXZlLAotCQkJICB2aGNyLT5pbl9tb2RpZmllcik7CisJCW1seDRfd2FybihkZXYsICJDb21tYW5kOjB4JXggZnJvbSBzbGF2ZTogJWQgZmFpbGVkIHByb3RlY3Rpb24gY2hlY2tzIGZvciByZXNvdXJjZV9pZDolZFxuIiwKKwkJCSAgdmhjci0+b3AsIHNsYXZlLCB2aGNyLT5pbl9tb2RpZmllcik7CiAJCXZoY3JfY21kLT5zdGF0dXMgPSBDTURfU1RBVF9CQURfT1A7CiAJCWdvdG8gb3V0X3N0YXR1czsKIAl9CkBAIC0xNTE1LDggKzE1MjQsNyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJbWx4NF93YXJuKGRldiwgInZoY3IgY29tbWFuZDoweCV4IHNsYXZlOiVkIGZhaWxlZCB3aXRoIgotCQkJICAiIGVycm9yOiVkLCBzdGF0dXMgJWRcbiIsCisJCW1seDRfd2FybihkZXYsICJ2aGNyIGNvbW1hbmQ6MHgleCBzbGF2ZTolZCBmYWlsZWQgd2l0aCBlcnJvcjolZCwgc3RhdHVzICVkXG4iLAogCQkJICB2aGNyLT5vcCwgc2xhdmUsIHZoY3ItPmVycm5vLCBlcnIpOwogCQl2aGNyX2NtZC0+c3RhdHVzID0gbWx4NF9lcnJub190b19zdGF0dXMoZXJyKTsKIAkJZ290byBvdXRfc3RhdHVzOwpAQCAtMTU1MCw4ICsxNTU4LDggQEAKIAkJCQkgX19mdW5jX18pOwogCQllbHNlIGlmICh2aGNyLT5lX2JpdCAmJgogCQkJIG1seDRfR0VOX0VRRShkZXYsIHNsYXZlLCAmcHJpdi0+bWZ1bmMubWFzdGVyLmNtZF9lcWUpKQotCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZ2VuZXJhdGUgY29tbWFuZCBjb21wbGV0aW9uICIKLQkJCQkJICAiZXFlIGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZ2VuZXJhdGUgY29tbWFuZCBjb21wbGV0aW9uIGVxZSBmb3Igc2xhdmUgJWRcbiIsCisJCQkJCSAgc2xhdmUpOwogCX0KIAogb3V0OgpAQCAtMTU5MCw4ICsxNTk4LDkgQEAKIAogCW1seDRfZGJnKGRldiwgInVwZGF0aW5nIGltbWVkaWF0ZWx5IGFkbWluIHBhcmFtcyBzbGF2ZSAlZCBwb3J0ICVkXG4iLAogCQkgc2xhdmUsIHBvcnQpOwotCW1seDRfZGJnKGRldiwgInZsYW4gJWQgUW9TICVkIGxpbmsgZG93biAlZFxuIiwgdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiwKLQkJIHZwX2FkbWluLT5kZWZhdWx0X3FvcywgdnBfYWRtaW4tPmxpbmtfc3RhdGUpOworCW1seDRfZGJnKGRldiwgInZsYW4gJWQgUW9TICVkIGxpbmsgZG93biAlZFxuIiwKKwkJIHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4sIHZwX2FkbWluLT5kZWZhdWx0X3FvcywKKwkJIHZwX2FkbWluLT5saW5rX3N0YXRlKTsKIAogCXdvcmsgPSBremFsbG9jKHNpemVvZigqd29yayksIEdGUF9LRVJORUwpOwogCWlmICghd29yaykKQEAgLTE2MDQsNyArMTYxMyw3IEBACiAJCQkJCQkgICAmYWRtaW5fdmxhbl9peCk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJa2ZyZWUod29yayk7Ci0JCQkJbWx4NF93YXJuKCgmcHJpdi0+ZGV2KSwKKwkJCQltbHg0X3dhcm4oJnByaXYtPmRldiwKIAkJCQkJICAiTm8gdmxhbiByZXNvdXJjZXMgc2xhdmUgJWQsIHBvcnQgJWRcbiIsCiAJCQkJCSAgc2xhdmUsIHBvcnQpOwogCQkJCXJldHVybiBlcnI7CkBAIC0xNjEzLDcgKzE2MjIsNyBAQAogCQkJYWRtaW5fdmxhbl9peCA9IE5PX0lORFg7CiAJCX0KIAkJd29yay0+ZmxhZ3MgfD0gTUxYNF9WRl9JTU1FRF9WTEFOX0ZMQUdfVkxBTjsKLQkJbWx4NF9kYmcoKCYocHJpdi0+ZGV2KSksCisJCW1seDRfZGJnKCZwcml2LT5kZXYsCiAJCQkgImFsbG9jIHZsYW4gJWQgaWR4ICAlZCBzbGF2ZSAlZCBwb3J0ICVkXG4iLAogCQkJIChpbnQpKHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4pLAogCQkJIGFkbWluX3ZsYW5faXgsIHNsYXZlLCBwb3J0KTsKQEAgLTE2NzYsMTIgKzE2ODUsMTIgQEAKIAkJCQkJCSAgIHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4sICYodnBfb3Blci0+dmxhbl9pZHgpKTsKIAkJCWlmIChlcnIpIHsKIAkJCQl2cF9vcGVyLT52bGFuX2lkeCA9IE5PX0lORFg7Ci0JCQkJbWx4NF93YXJuKCgmcHJpdi0+ZGV2KSwKKwkJCQltbHg0X3dhcm4oJnByaXYtPmRldiwKIAkJCQkJICAiTm8gdmxhbiByZXNvcmNlcyBzbGF2ZSAlZCwgcG9ydCAlZFxuIiwKIAkJCQkJICBzbGF2ZSwgcG9ydCk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KLQkJCW1seDRfZGJnKCgmKHByaXYtPmRldikpLCAiYWxsb2MgdmxhbiAlZCBpZHggICVkIHNsYXZlICVkIHBvcnQgJWRcbiIsCisJCQltbHg0X2RiZygmcHJpdi0+ZGV2LCAiYWxsb2MgdmxhbiAlZCBpZHggICVkIHNsYXZlICVkIHBvcnQgJWRcbiIsCiAJCQkJIChpbnQpKHZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbiksCiAJCQkJIHZwX29wZXItPnZsYW5faWR4LCBzbGF2ZSwgcG9ydCk7CiAJCX0KQEAgLTE2OTIsMTIgKzE3MDEsMTIgQEAKIAkJCWlmICgwID4gdnBfb3Blci0+bWFjX2lkeCkgewogCQkJCWVyciA9IHZwX29wZXItPm1hY19pZHg7CiAJCQkJdnBfb3Blci0+bWFjX2lkeCA9IE5PX0lORFg7Ci0JCQkJbWx4NF93YXJuKCgmcHJpdi0+ZGV2KSwKKwkJCQltbHg0X3dhcm4oJnByaXYtPmRldiwKIAkJCQkJICAiTm8gbWFjIHJlc29yY2VzIHNsYXZlICVkLCBwb3J0ICVkXG4iLAogCQkJCQkgIHNsYXZlLCBwb3J0KTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQotCQkJbWx4NF9kYmcoKCYocHJpdi0+ZGV2KSksICJhbGxvYyBtYWMgJWxseCBpZHggICVkIHNsYXZlICVkIHBvcnQgJWRcbiIsCisJCQltbHg0X2RiZygmcHJpdi0+ZGV2LCAiYWxsb2MgbWFjICVsbHggaWR4ICAlZCBzbGF2ZSAlZCBwb3J0ICVkXG4iLAogCQkJCSB2cF9vcGVyLT5zdGF0ZS5tYWMsIHZwX29wZXItPm1hY19pZHgsIHNsYXZlLCBwb3J0KTsKIAkJfQogCX0KQEAgLTE3NDgsOCArMTc1Nyw4IEBACiAJc2xhdmVfc3RhdGVbc2xhdmVdLmNvbW1fdG9nZ2xlIF49IDE7CiAJcmVwbHkgPSAodTMyKSBzbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUgPDwgMzE7CiAJaWYgKHRvZ2dsZSAhPSBzbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUpIHsKLQkJbWx4NF93YXJuKGRldiwgIkluY29ycmVjdCB0b2dnbGUgJWQgZnJvbSBzbGF2ZSAlZC4gKioqIE1BU1RFUiIKLQkJCSAgIlNUQVRFIENPTVBST01JU0lFRCAqKipcbiIsIHRvZ2dsZSwgc2xhdmUpOworCQltbHg0X3dhcm4oZGV2LCAiSW5jb3JyZWN0IHRvZ2dsZSAlZCBmcm9tIHNsYXZlICVkLiAqKiogTUFTVEVSIFNUQVRFIENPTVBST01JU0VEICoqKlxuIiwKKwkJCSAgdG9nZ2xlLCBzbGF2ZSk7CiAJCWdvdG8gcmVzZXRfc2xhdmU7CiAJfQogCWlmIChjbWQgPT0gTUxYNF9DT01NX0NNRF9SRVNFVCkgewpAQCAtMTc3Niw4ICsxNzg1LDggQEAKIAkvKmNvbW1hbmQgZnJvbSBzbGF2ZSBpbiB0aGUgbWlkZGxlIG9mIEZMUiovCiAJaWYgKGNtZCAhPSBNTFg0X0NPTU1fQ01EX1JFU0VUICYmCiAJICAgIE1MWDRfQ09NTV9DTURfRkxSID09IHNsYXZlX3N0YXRlW3NsYXZlXS5sYXN0X2NtZCkgewotCQltbHg0X3dhcm4oZGV2LCAic2xhdmU6JWQgaXMgVHJ5aW5nIHRvIHJ1biBjbWQoMHgleCkgIgotCQkJICAiaW4gdGhlIG1pZGRsZSBvZiBGTFJcbiIsIHNsYXZlLCBjbWQpOworCQltbHg0X3dhcm4oZGV2LCAic2xhdmU6JWQgaXMgVHJ5aW5nIHRvIHJ1biBjbWQoMHgleCkgaW4gdGhlIG1pZGRsZSBvZiBGTFJcbiIsCisJCQkgIHNsYXZlLCBjbWQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xODE1LDggKzE4MjQsOCBAQAogCiAJCW11dGV4X2xvY2soJnByaXYtPmNtZC5zbGF2ZV9jbWRfbXV0ZXgpOwogCQlpZiAobWx4NF9tYXN0ZXJfcHJvY2Vzc192aGNyKGRldiwgc2xhdmUsIE5VTEwpKSB7Ci0JCQltbHg0X2VycihkZXYsICJGYWlsZWQgcHJvY2Vzc2luZyB2aGNyIGZvciBzbGF2ZTolZCwiCi0JCQkJICIgcmVzZXR0aW5nIHNsYXZlLlxuIiwgc2xhdmUpOworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHByb2Nlc3NpbmcgdmhjciBmb3Igc2xhdmU6JWQsIHJlc2V0dGluZyBzbGF2ZVxuIiwKKwkJCQkgc2xhdmUpOwogCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jbWQuc2xhdmVfY21kX211dGV4KTsKIAkJCWdvdG8gcmVzZXRfc2xhdmU7CiAJCX0KQEAgLTE4MzMsOCArMTg0Miw3IEBACiAJCWlzX2dvaW5nX2Rvd24gPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJaWYgKGlzX2dvaW5nX2Rvd24pIHsKLQkJbWx4NF93YXJuKGRldiwgIlNsYXZlIGlzIGdvaW5nIGRvd24gYWJvcnRpbmcgY29tbWFuZCglZCkiCi0JCQkgICIgZXhlY3V0aW5nIGZyb20gc2xhdmU6JWRcbiIsCisJCW1seDRfd2FybihkZXYsICJTbGF2ZSBpcyBnb2luZyBkb3duIGFib3J0aW5nIGNvbW1hbmQoJWQpIGV4ZWN1dGluZyBmcm9tIHNsYXZlOiVkXG4iLAogCQkJICBjbWQsIHNsYXZlKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE4OTcsMTAgKzE5MDUsOSBAQAogCQkJaWYgKHRvZ2dsZSAhPSBzbHQpIHsKIAkJCQlpZiAobWFzdGVyLT5zbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUKIAkJCQkgICAgIT0gc2x0KSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gInNsYXZlICVkIG91dCBvZiBzeW5jLiIKLQkJCQkJICAgICAgICIgcmVhZCB0b2dnbGUgJWQsIHN0YXRlIHRvZ2dsZSAlZC4gIgotCQkJCQkgICAgICAgIlJlc3luY2hpbmcuXG4iLCBzbGF2ZSwgc2x0LAotCQkJCQkgICAgICAgbWFzdGVyLT5zbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUpOworCQkJCQlwcl9pbmZvKCJzbGF2ZSAlZCBvdXQgb2Ygc3luYy4gcmVhZCB0b2dnbGUgJWQsIHN0YXRlIHRvZ2dsZSAlZC4gUmVzeW5jaGluZy5cbiIsCisJCQkJCQlzbGF2ZSwgc2x0LAorCQkJCQkJbWFzdGVyLT5zbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUpOwogCQkJCQltYXN0ZXItPnNsYXZlX3N0YXRlW3NsYXZlXS5jb21tX3RvZ2dsZSA9CiAJCQkJCQlzbHQ7CiAJCQkJfQpAQCAtMTkxMyw4ICsxOTIwLDcgQEAKIAl9CiAKIAlpZiAocmVwb3J0ZWQgJiYgcmVwb3J0ZWQgIT0gc2VydmVkKQotCQltbHg0X3dhcm4oZGV2LCAiR290IGNvbW1hbmQgZXZlbnQgd2l0aCBiaXRtYXNrIGZyb20gJWQgc2xhdmVzIgotCQkJICAiIGJ1dCAlZCB3ZXJlIHNlcnZlZFxuIiwKKwkJbWx4NF93YXJuKGRldiwgIkdvdCBjb21tYW5kIGV2ZW50IHdpdGggYml0bWFzayBmcm9tICVkIHNsYXZlcyBidXQgJWQgd2VyZSBzZXJ2ZWRcbiIsCiAJCQkgIHJlcG9ydGVkLCBzZXJ2ZWQpOwogCiAJaWYgKG1seDRfQVJNX0NPTU1fQ0hBTk5FTChkZXYpKQpAQCAtMTk3MCw3ICsxOTc2LDcgQEAKIAkJaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAyKSArCiAJCQlNTFg0X1NMQVZFX0NPTU1fQkFTRSwgTUxYNF9DT01NX1BBR0VTSVpFKTsKIAlpZiAoIXByaXYtPm1mdW5jLmNvbW0pIHsKLQkJbWx4NF9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIGNvbW11bmljYXRpb24gdmVjdG9yLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBjb21tdW5pY2F0aW9uIHZlY3RvclxuIik7CiAJCWdvdG8gZXJyX3ZoY3I7CiAJfQogCkBAIC0yMDk3LDcgKzIxMDMsNyBAQAogCQlwcml2LT5jbWQuaGNyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArCiAJCQkJCU1MWDRfSENSX0JBU0UsIE1MWDRfSENSX1NJWkUpOwogCQlpZiAoIXByaXYtPmNtZC5oY3IpIHsKLQkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBjb21tYW5kIHJlZ2lzdGVyLlxuIik7CisJCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAgY29tbWFuZCByZWdpc3RlclxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTI0OTgsMTEgKzI1MDQsMTIgQEAKIAlpdmYtPm1hY1s0XSA9ICgoc19pbmZvLT5tYWMgPj4gKDEqOCkpICYgMHhmZik7CiAJaXZmLT5tYWNbNV0gPSAoKHNfaW5mby0+bWFjKSAgJiAweGZmKTsKIAotCWl2Zi0+dmxhbgk9IHNfaW5mby0+ZGVmYXVsdF92bGFuOwotCWl2Zi0+cW9zCT0gc19pbmZvLT5kZWZhdWx0X3FvczsKLQlpdmYtPnR4X3JhdGUJPSBzX2luZm8tPnR4X3JhdGU7Ci0JaXZmLT5zcG9vZmNoawk9IHNfaW5mby0+c3Bvb2ZjaGs7Ci0JaXZmLT5saW5rc3RhdGUJPSBzX2luZm8tPmxpbmtfc3RhdGU7CisJaXZmLT52bGFuCQk9IHNfaW5mby0+ZGVmYXVsdF92bGFuOworCWl2Zi0+cW9zCQk9IHNfaW5mby0+ZGVmYXVsdF9xb3M7CisJaXZmLT5tYXhfdHhfcmF0ZQk9IHNfaW5mby0+dHhfcmF0ZTsKKwlpdmYtPm1pbl90eF9yYXRlCT0gMDsKKwlpdmYtPnNwb29mY2hrCQk9IHNfaW5mby0+c3Bvb2ZjaGs7CisJaXZmLT5saW5rc3RhdGUJCT0gc19pbmZvLT5saW5rX3N0YXRlOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMKaW5kZXggYzkwY2RlNS4uODBmNzI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYwpAQCAtMjkzLDYgKzI5Myw5IEBACiAJYXRvbWljX3NldCgmY3EtPnJlZmNvdW50LCAxKTsKIAlpbml0X2NvbXBsZXRpb24oJmNxLT5mcmVlKTsKIAorCWNxLT5pcnEgPSBwcml2LT5lcV90YWJsZS5lcVtjcS0+dmVjdG9yXS5pcnE7CisJY3EtPmlycV9hZmZpbml0eV9jaGFuZ2UgPSBmYWxzZTsKKwogCXJldHVybiAwOwogCiBlcnJfcmFkaXg6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2NxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2NxLmMKaW5kZXggYzJjZDhkMy4uNGIyMTMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY3EuYwpAQCAtMTI1LDggKzEyNSw3IEBACiAJCQkJCQkgICAmY3EtPnZlY3RvcikpIHsKIAkJCQkJY3EtPnZlY3RvciA9IChjcS0+cmluZyArIDEgKyBwcml2LT5wb3J0KQogCQkJCQkgICAgJSBtZGV2LT5kZXYtPmNhcHMubnVtX2NvbXBfdmVjdG9yczsKLQkJCQkJbWx4NF93YXJuKG1kZXYsICJGYWlsZWQgQXNzaWduaW5nIGFuIEVRIHRvICIKLQkJCQkJCSAgIiVzICxGYWxsaW5nIGJhY2sgdG8gbGVnYWN5IEVRJ3NcbiIsCisJCQkJCW1seDRfd2FybihtZGV2LCAiRmFpbGVkIGFzc2lnbmluZyBhbiBFUSB0byAlcywgZmFsbGluZyBiYWNrIHRvIGxlZ2FjeSBFUSdzXG4iLAogCQkJCQkJICBuYW1lKTsKIAkJCQl9CiAJCQl9CkBAIC0xNjQsNiArMTYzLDEzIEBACiAJCW5ldGlmX25hcGlfYWRkKGNxLT5kZXYsICZjcS0+bmFwaSwgbWx4NF9lbl9wb2xsX3R4X2NxLAogCQkJICAgICAgIE5BUElfUE9MTF9XRUlHSFQpOwogCX0gZWxzZSB7CisJCXN0cnVjdCBtbHg0X2VuX3J4X3JpbmcgKnJpbmcgPSBwcml2LT5yeF9yaW5nW2NxLT5yaW5nXTsKKworCQllcnIgPSBpcnFfc2V0X2FmZmluaXR5X2hpbnQoY3EtPm1jcS5pcnEsCisJCQkJCSAgICByaW5nLT5hZmZpbml0eV9tYXNrKTsKKwkJaWYgKGVycikKKwkJCW1seDRfd2FybihtZGV2LCAiRmFpbGVkIHNldHRpbmcgYWZmaW5pdHkgaGludFxuIik7CisKIAkJbmV0aWZfbmFwaV9hZGQoY3EtPmRldiwgJmNxLT5uYXBpLCBtbHg0X2VuX3BvbGxfcnhfY3EsIDY0KTsKIAkJbmFwaV9oYXNoX2FkZCgmY3EtPm5hcGkpOwogCX0KQEAgLTE4MCw4ICsxODYsMTEgQEAKIAogCW1seDRfZW5fdW5tYXBfYnVmZmVyKCZjcS0+d3FyZXMuYnVmKTsKIAltbHg0X2ZyZWVfaHdxX3JlcyhtZGV2LT5kZXYsICZjcS0+d3FyZXMsIGNxLT5idWZfc2l6ZSk7Ci0JaWYgKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5jb21wX3Bvb2wgJiYgY3EtPnZlY3RvcikKKwlpZiAocHJpdi0+bWRldi0+ZGV2LT5jYXBzLmNvbXBfcG9vbCAmJiBjcS0+dmVjdG9yKSB7CisJCWlmICghY3EtPmlzX3R4KQorCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KGNxLT5tY3EuaXJxLCBOVUxMKTsKIAkJbWx4NF9yZWxlYXNlX2VxKHByaXYtPm1kZXYtPmRldiwgY3EtPnZlY3Rvcik7CisJfQogCWNxLT52ZWN0b3IgPSAwOwogCWNxLT5idWZfc2l6ZSA9IDA7CiAJY3EtPmJ1ZiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZXRodG9vbC5jCmluZGV4IDNlOGQzMzYuLmZhMWEwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZXRodG9vbC5jCkBAIC0zNzgsOCArMzc4LDggQEAKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgcHJpdi0+cG9ydF9zdGF0ZS5saW5rX3NwZWVkKTsKIAkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAl9IGVsc2UgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAtMSk7Ci0JCWNtZC0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEX1VOS05PV04pOworCQljbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAogCWlmICh0cmFuc190eXBlID4gMCAmJiB0cmFuc190eXBlIDw9IDB4QykgewpAQCAtNTY0LDcgKzU2NCw3IEBACiAJcmV0dXJuIHByaXYtPnJ4X3JpbmdfbnVtOwogfQogCi1zdGF0aWMgaW50IG1seDRfZW5fZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpyaW5nX2luZGV4KQorc3RhdGljIGludCBtbHg0X2VuX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqcmluZ19pbmRleCwgdTggKmtleSkKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4NF9lbl9yc3NfbWFwICpyc3NfbWFwID0gJnByaXYtPnJzc19tYXA7CkBAIC01ODIsOCArNTgyLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG1seDRfZW5fc2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJY29uc3QgdTMyICpyaW5nX2luZGV4KQorc3RhdGljIGludCBtbHg0X2VuX3NldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHUzMiAqcmluZ19pbmRleCwKKwkJCSAgICBjb25zdCB1OCAqa2V5KQogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CkBAIC05MjUsMTMgKzkyNSwxMyBAQAogCQlxcG4gPSBjbWQtPmZzLnJpbmdfY29va2llICYgKEVOX0VUSFRPT0xfUVBfQVRUQUNIIC0gMSk7CiAJfSBlbHNlIHsKIAkJaWYgKGNtZC0+ZnMucmluZ19jb29raWUgPj0gcHJpdi0+cnhfcmluZ19udW0pIHsKLQkJCWVuX3dhcm4ocHJpdiwgInJ4bmZjOiBSWCByaW5nICglbGx1KSBkb2Vzbid0IGV4aXN0LlxuIiwKKwkJCWVuX3dhcm4ocHJpdiwgInJ4bmZjOiBSWCByaW5nICglbGx1KSBkb2Vzbid0IGV4aXN0XG4iLAogCQkJCWNtZC0+ZnMucmluZ19jb29raWUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJcXBuID0gcHJpdi0+cnNzX21hcC5xcHNbY21kLT5mcy5yaW5nX2Nvb2tpZV0ucXBuOwogCQlpZiAoIXFwbikgewotCQkJZW5fd2Fybihwcml2LCAicnhuZmM6IFJYIHJpbmcgKCVsbHUpIGlzIGluYWN0aXZlLlxuIiwKKwkJCWVuX3dhcm4ocHJpdiwgInJ4bmZjOiBSWCByaW5nICglbGx1KSBpcyBpbmFjdGl2ZVxuIiwKIAkJCQljbWQtPmZzLnJpbmdfY29va2llKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC05NTYsNyArOTU2LDcgQEAKIAl9CiAJZXJyID0gbWx4NF9mbG93X2F0dGFjaChwcml2LT5tZGV2LT5kZXYsICZydWxlLCAmcmVnX2lkKTsKIAlpZiAoZXJyKSB7Ci0JCWVuX2Vycihwcml2LCAiRmFpbCB0byBhdHRhY2ggbmV0d29yayBydWxlIGF0IGxvY2F0aW9uICVkLlxuIiwKKwkJZW5fZXJyKHByaXYsICJGYWlsIHRvIGF0dGFjaCBuZXR3b3JrIHJ1bGUgYXQgbG9jYXRpb24gJWRcbiIsCiAJCSAgICAgICBjbWQtPmZzLmxvY2F0aW9uKTsKIAkJZ290byBvdXRfZnJlZV9saXN0OwogCX0KQEAgLTExMjEsNyArMTEyMSw3IEBACiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKLQlpbnQgcG9ydF91cDsKKwlpbnQgcG9ydF91cCA9IDA7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAoY2hhbm5lbC0+b3RoZXJfY291bnQgfHwgY2hhbm5lbC0+Y29tYmluZWRfY291bnQgfHwKQEAgLTExNTEsNyArMTE1MSw4IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhkZXYsIHByaXYtPnR4X3JpbmdfbnVtKTsKIAluZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKGRldiwgcHJpdi0+cnhfcmluZ19udW0pOwogCi0JbWx4NF9lbl9zZXR1cF90YyhkZXYsIE1MWDRfRU5fTlVNX1VQKTsKKwlpZiAoZGV2LT5udW1fdGMpCisJCW1seDRfZW5fc2V0dXBfdGMoZGV2LCBNTFg0X0VOX05VTV9VUCk7CiAKIAllbl93YXJuKHByaXYsICJVc2luZyAlZCBUWCByaW5nc1xuIiwgcHJpdi0+dHhfcmluZ19udW0pOwogCWVuX3dhcm4ocHJpdiwgIlVzaW5nICVkIFJYIHJpbmdzXG4iLCBwcml2LT5yeF9yaW5nX251bSk7CkBAIC0xMjIzLDggKzEyMjQsOCBAQAogCS5nZXRfcnhuZmMgPSBtbHg0X2VuX2dldF9yeG5mYywKIAkuc2V0X3J4bmZjID0gbWx4NF9lbl9zZXRfcnhuZmMsCiAJLmdldF9yeGZoX2luZGlyX3NpemUgPSBtbHg0X2VuX2dldF9yeGZoX2luZGlyX3NpemUsCi0JLmdldF9yeGZoX2luZGlyID0gbWx4NF9lbl9nZXRfcnhmaF9pbmRpciwKLQkuc2V0X3J4ZmhfaW5kaXIgPSBtbHg0X2VuX3NldF9yeGZoX2luZGlyLAorCS5nZXRfcnhmaCA9IG1seDRfZW5fZ2V0X3J4ZmgsCisJLnNldF9yeGZoID0gbWx4NF9lbl9zZXRfcnhmaCwKIAkuZ2V0X2NoYW5uZWxzID0gbWx4NF9lbl9nZXRfY2hhbm5lbHMsCiAJLnNldF9jaGFubmVscyA9IG1seDRfZW5fc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbyA9IG1seDRfZW5fZ2V0X3RzX2luZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbWFpbi5jCmluZGV4IDBjNTlkNGYuLmY5NTNjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbWFpbi5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCU1MWDRfRU5fTUFYX1RYX1JJTkdfUF9VUCk7CiAJaWYgKHBhcmFtcy0+dWRwX3JzcyAmJiAhKG1kZXYtPmRldi0+Y2Fwcy5mbGFncwogCQkJCQkmIE1MWDRfREVWX0NBUF9GTEFHX1VEUF9SU1MpKSB7Ci0JCW1seDRfd2FybihtZGV2LCAiVURQIFJTUyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLlxuIik7CisJCW1seDRfd2FybihtZGV2LCAiVURQIFJTUyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlXG4iKTsKIAkJcGFyYW1zLT51ZHBfcnNzID0gMDsKIAl9CiAJZm9yIChpID0gMTsgaSA8PSBNTFg0X01BWF9QT1JUUzsgaSsrKSB7CkBAIC0yNTEsOCArMjUxLDcgQEAKIAogCW1kZXYtPkxTT19zdXBwb3J0ID0gISEoZGV2LT5jYXBzLmZsYWdzICYgKDEgPDwgMTUpKTsKIAlpZiAoIW1kZXYtPkxTT19zdXBwb3J0KQotCQltbHg0X3dhcm4obWRldiwgIkxTTyBub3Qgc3VwcG9ydGVkLCBwbGVhc2UgdXBncmFkZSB0byBsYXRlciAiCi0JCQkJIkZXIHZlcnNpb24gdG8gZW5hYmxlIExTT1xuIik7CisJCW1seDRfd2FybihtZGV2LCAiTFNPIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSB1cGdyYWRlIHRvIGxhdGVyIEZXIHZlcnNpb24gdG8gZW5hYmxlIExTT1xuIik7CiAKIAlpZiAobWx4NF9tcl9hbGxvYyhtZGV2LT5kZXYsIG1kZXYtPnByaXZfcGRuLCAwLCB+MHVsbCwKIAkJCSBNTFg0X1BFUk1fTE9DQUxfV1JJVEUgfCAgTUxYNF9QRVJNX0xPQ0FMX1JFQUQsCkBAIC0yNjgsNyArMjY3LDcgQEAKIAkvKiBCdWlsZCBkZXZpY2UgcHJvZmlsZSBhY2NvcmRpbmcgdG8gc3VwcGxpZWQgbW9kdWxlIHBhcmFtZXRlcnMgKi8KIAllcnIgPSBtbHg0X2VuX2dldF9wcm9maWxlKG1kZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIobWRldiwgIkJhZCBtb2R1bGUgcGFyYW1ldGVycywgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIobWRldiwgIkJhZCBtb2R1bGUgcGFyYW1ldGVycywgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9tcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jCmluZGV4IDdlNGIxNzIuLjdkNGZiN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJY2FzZSBJUFBST1RPX1RDUDoKIAkJcmV0dXJuIE1MWDRfTkVUX1RSQU5TX1JVTEVfSURfVENQOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCQlyZXR1cm4gTUxYNF9ORVRfVFJBTlNfUlVMRV9OVU07CiAJfQogfTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJaW50IHJjOwogCV9fYmU2NCBtYWNfbWFzayA9IGNwdV90b19iZTY0KE1MWDRfTUFDX01BU0sgPDwgMTYpOwogCi0JaWYgKHNwZWNfdGNwX3VkcC5pZCA8IDApIHsKKwlpZiAoc3BlY190Y3BfdWRwLmlkID49IE1MWDRfTkVUX1RSQU5TX1JVTEVfTlVNKSB7CiAJCWVuX3dhcm4ocHJpdiwgIlJGUzogaWdub3JpbmcgdW5zdXBwb3J0ZWQgaXAgcHJvdG9jb2wgKCVkKVxuIiwKIAkJCWZpbHRlci0+aXBfcHJvdG8pOwogCQlnb3RvIGlnbm9yZTsKQEAgLTc3MCwxMSArNzcwLDEyIEBACiAJCQkJCSAgcHJpdi0+ZGV2LT5kZXZfYWRkciwgcHJpdi0+cHJldl9tYWMpOwogCQlpZiAoZXJyKQogCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgY2hhbmdpbmcgSFcgTUFDIGFkZHJlc3NcbiIpOwotCQltZW1jcHkocHJpdi0+cHJldl9tYWMsIHByaXYtPmRldi0+ZGV2X2FkZHIsCi0JCSAgICAgICBzaXplb2YocHJpdi0+cHJldl9tYWMpKTsKIAl9IGVsc2UKIAkJZW5fZGJnKEhXLCBwcml2LCAiUG9ydCBpcyBkb3duIHdoaWxlIHJlZ2lzdGVyaW5nIG1hYywgZXhpdGluZy4uLlxuIik7CiAKKwltZW1jcHkocHJpdi0+cHJldl9tYWMsIHByaXYtPmRldi0+ZGV2X2FkZHIsCisJICAgICAgIHNpemVvZihwcml2LT5wcmV2X21hYykpOworCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzg4LDkgKzc4OSw4IEBACiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0KIAltdXRleF9sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAllcnIgPSBtbHg0X2VuX2RvX3NldF9tYWMocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKIApAQCAtMTUyNiw2ICsxNTI2LDI3IEBACiAJbXV0ZXhfdW5sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKIH0KIAorc3RhdGljIGludCBtbHg0X2VuX2luaXRfYWZmaW5pdHlfaGludChzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2LCBpbnQgcmluZ19pZHgpCit7CisJc3RydWN0IG1seDRfZW5fcnhfcmluZyAqcmluZyA9IHByaXYtPnJ4X3JpbmdbcmluZ19pZHhdOworCWludCBudW1hX25vZGUgPSBwcml2LT5tZGV2LT5kZXYtPm51bWFfbm9kZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZyaW5nLT5hZmZpbml0eV9tYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjcHVtYXNrX3NldF9jcHVfbG9jYWxfZmlyc3QocmluZ19pZHgsIG51bWFfbm9kZSwKKwkJCQkJICByaW5nLT5hZmZpbml0eV9tYXNrKTsKKwlpZiAocmV0KQorCQlmcmVlX2NwdW1hc2tfdmFyKHJpbmctPmFmZmluaXR5X21hc2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWx4NF9lbl9mcmVlX2FmZmluaXR5X2hpbnQoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiwgaW50IHJpbmdfaWR4KQoreworCWZyZWVfY3B1bWFza192YXIocHJpdi0+cnhfcmluZ1tyaW5nX2lkeF0tPmFmZmluaXR5X21hc2spOworfQogCiBpbnQgbWx4NF9lbl9zdGFydF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0xNTY3LDE3ICsxNTg4LDI1IEBACiAKIAkJbWx4NF9lbl9jcV9pbml0X2xvY2soY3EpOwogCisJCWVyciA9IG1seDRfZW5faW5pdF9hZmZpbml0eV9oaW50KHByaXYsIGkpOworCQlpZiAoZXJyKSB7CisJCQllbl9lcnIocHJpdiwgIkZhaWxlZCBwcmVwYXJpbmcgSVJRIGFmZmluaXR5IGhpbnRcbiIpOworCQkJZ290byBjcV9lcnI7CisJCX0KKwogCQllcnIgPSBtbHg0X2VuX2FjdGl2YXRlX2NxKHByaXYsIGNxLCBpKTsKIAkJaWYgKGVycikgewogCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgYWN0aXZhdGluZyBSeCBDUVxuIik7CisJCQltbHg0X2VuX2ZyZWVfYWZmaW5pdHlfaGludChwcml2LCBpKTsKIAkJCWdvdG8gY3FfZXJyOwogCQl9CiAJCWZvciAoaiA9IDA7IGogPCBjcS0+c2l6ZTsgaisrKQogCQkJY3EtPmJ1ZltqXS5vd25lcl9zcl9vcGNvZGUgPSBNTFg0X0NRRV9PV05FUl9NQVNLOwogCQllcnIgPSBtbHg0X2VuX3NldF9jcV9tb2Rlcihwcml2LCBjcSk7CiAJCWlmIChlcnIpIHsKLQkJCWVuX2Vycihwcml2LCAiRmFpbGVkIHNldHRpbmcgY3EgbW9kZXJhdGlvbiBwYXJhbWV0ZXJzIik7CisJCQllbl9lcnIocHJpdiwgIkZhaWxlZCBzZXR0aW5nIGNxIG1vZGVyYXRpb24gcGFyYW1ldGVyc1xuIik7CiAJCQltbHg0X2VuX2RlYWN0aXZhdGVfY3EocHJpdiwgY3EpOworCQkJbWx4NF9lbl9mcmVlX2FmZmluaXR5X2hpbnQocHJpdiwgaSk7CiAJCQlnb3RvIGNxX2VycjsKIAkJfQogCQltbHg0X2VuX2FybV9jcShwcml2LCBjcSk7CkBAIC0xNjE1LDcgKzE2NDQsNyBAQAogCQl9CiAJCWVyciA9IG1seDRfZW5fc2V0X2NxX21vZGVyKHByaXYsIGNxKTsKIAkJaWYgKGVycikgewotCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgc2V0dGluZyBjcSBtb2RlcmF0aW9uIHBhcmFtZXRlcnMiKTsKKwkJCWVuX2Vycihwcml2LCAiRmFpbGVkIHNldHRpbmcgY3EgbW9kZXJhdGlvbiBwYXJhbWV0ZXJzXG4iKTsKIAkJCW1seDRfZW5fZGVhY3RpdmF0ZV9jcShwcml2LCBjcSk7CiAJCQlnb3RvIHR4X2VycjsKIAkJfQpAQCAtMTcxNSw4ICsxNzQ0LDEwIEBACiBtYWNfZXJyOgogCW1seDRfZW5fcHV0X3FwKHByaXYpOwogY3FfZXJyOgotCXdoaWxlIChyeF9pbmRleC0tKQorCXdoaWxlIChyeF9pbmRleC0tKSB7CiAJCW1seDRfZW5fZGVhY3RpdmF0ZV9jcShwcml2LCBwcml2LT5yeF9jcVtyeF9pbmRleF0pOworCQltbHg0X2VuX2ZyZWVfYWZmaW5pdHlfaGludChwcml2LCBpKTsKKwl9CiAJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4X3JpbmdfbnVtOyBpKyspCiAJCW1seDRfZW5fZGVhY3RpdmF0ZV9yeF9yaW5nKHByaXYsIHByaXYtPnJ4X3JpbmdbaV0pOwogCkBAIC0xODQ3LDYgKzE4NzgsOCBAQAogCQkJbXNsZWVwKDEpOwogCQltbHg0X2VuX2RlYWN0aXZhdGVfcnhfcmluZyhwcml2LCBwcml2LT5yeF9yaW5nW2ldKTsKIAkJbWx4NF9lbl9kZWFjdGl2YXRlX2NxKHByaXYsIGNxKTsKKworCQltbHg0X2VuX2ZyZWVfYWZmaW5pdHlfaGludChwcml2LCBpKTsKIAl9CiB9CiAKQEAgLTI1MzksNyArMjU3Miw3IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhkZXYsIHByaXYtPnR4X3JpbmdfbnVtKTsKIAluZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKGRldiwgcHJpdi0+cnhfcmluZ19udW0pOwogCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJm1seDRfZW5fZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbWx4NF9lbl9ldGh0b29sX29wczsKIAogCS8qCiAJICogU2V0IGRyaXZlciBmZWF0dXJlcwpAQCAtMjU5NCw4ICsyNjI3LDggQEAKIAkJCQkgICAgcHJvZi0+dHhfcGF1c2UsIHByb2YtPnR4X3BwcCwKIAkJCQkgICAgcHJvZi0+cnhfcGF1c2UsIHByb2YtPnJ4X3BwcCk7CiAJaWYgKGVycikgewotCQllbl9lcnIocHJpdiwgIkZhaWxlZCBzZXR0aW5nIHBvcnQgZ2VuZXJhbCBjb25maWd1cmF0aW9ucyAiCi0JCSAgICAgICAiZm9yIHBvcnQgJWQsIHdpdGggZXJyb3IgJWRcbiIsIHByaXYtPnBvcnQsIGVycik7CisJCWVuX2Vycihwcml2LCAiRmFpbGVkIHNldHRpbmcgcG9ydCBnZW5lcmFsIGNvbmZpZ3VyYXRpb25zIGZvciBwb3J0ICVkLCB3aXRoIGVycm9yICVkXG4iLAorCQkgICAgICAgcHJpdi0+cG9ydCwgZXJyKTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKaW5kZXggODc4NTdhNi4uZDJkNDE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYwpAQCAtMjcwLDEzICsyNzAsMTEgQEAKIAkJCQkJCSAgICByaW5nLT5hY3R1YWxfc2l6ZSwKIAkJCQkJCSAgICBHRlBfS0VSTkVMKSkgewogCQkJCWlmIChyaW5nLT5hY3R1YWxfc2l6ZSA8IE1MWDRfRU5fTUlOX1JYX1NJWkUpIHsKLQkJCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgIgotCQkJCQkJICAgICAiZW5vdWdoIHJ4IGJ1ZmZlcnNcbiIpOworCQkJCQllbl9lcnIocHJpdiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggcnggYnVmZmVyc1xuIik7CiAJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCX0gZWxzZSB7CiAJCQkJCW5ld19zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28ocmluZy0+YWN0dWFsX3NpemUpOwotCQkJCQllbl93YXJuKHByaXYsICJPbmx5ICVkIGJ1ZmZlcnMgYWxsb2NhdGVkICIKLQkJCQkJCSAgICAgICJyZWR1Y2luZyByaW5nIHNpemUgdG8gJWQiLAorCQkJCQllbl93YXJuKHByaXYsICJPbmx5ICVkIGJ1ZmZlcnMgYWxsb2NhdGVkIHJlZHVjaW5nIHJpbmcgc2l6ZSB0byAlZFxuIiwKIAkJCQkJCXJpbmctPmFjdHVhbF9zaXplLCBuZXdfc2l6ZSk7CiAJCQkJCWdvdG8gcmVkdWNlX3JpbmdzOwogCQkJCX0KQEAgLTY4NSwxMCArNjgzLDkgQEAKIAkJLyogRHJvcCBwYWNrZXQgb24gYmFkIHJlY2VpdmUgb3IgYmFkIGNoZWNrc3VtICovCiAJCWlmICh1bmxpa2VseSgoY3FlLT5vd25lcl9zcl9vcGNvZGUgJiBNTFg0X0NRRV9PUENPREVfTUFTSykgPT0KIAkJCQkJCU1MWDRfQ1FFX09QQ09ERV9FUlJPUikpIHsKLQkJCWVuX2Vycihwcml2LCAiQ1FFIGNvbXBsZXRlZCBpbiBlcnJvciAtIHZlbmRvciAiCi0JCQkJICAic3luZHJvbTolZCBzeW5kcm9tOiVkXG4iLAotCQkJCSAgKChzdHJ1Y3QgbWx4NF9lcnJfY3FlICopIGNxZSktPnZlbmRvcl9lcnJfc3luZHJvbWUsCi0JCQkJICAoKHN0cnVjdCBtbHg0X2Vycl9jcWUgKikgY3FlKS0+c3luZHJvbWUpOworCQkJZW5fZXJyKHByaXYsICJDUUUgY29tcGxldGVkIGluIGVycm9yIC0gdmVuZG9yIHN5bmRyb206JWQgc3luZHJvbTolZFxuIiwKKwkJCSAgICAgICAoKHN0cnVjdCBtbHg0X2Vycl9jcWUgKiljcWUpLT52ZW5kb3JfZXJyX3N5bmRyb21lLAorCQkJICAgICAgICgoc3RydWN0IG1seDRfZXJyX2NxZSAqKWNxZSktPnN5bmRyb21lKTsKIAkJCWdvdG8gbmV4dDsKIAkJfQogCQlpZiAodW5saWtlbHkoY3FlLT5iYWRmY3NfZW5jICYgTUxYNF9DUUVfQkFEX0ZDUykpIHsKQEAgLTg5OCwxMCArODk1LDE3IEBACiAJbWx4NF9lbl9jcV91bmxvY2tfbmFwaShjcSk7CiAKIAkvKiBJZiB3ZSB1c2VkIHVwIGFsbCB0aGUgcXVvdGEgLSB3ZSdyZSBwcm9iYWJseSBub3QgZG9uZSB5ZXQuLi4gKi8KLQlpZiAoZG9uZSA9PSBidWRnZXQpCisJaWYgKGRvbmUgPT0gYnVkZ2V0KSB7CiAJCUlOQ19QRVJGX0NPVU5URVIocHJpdi0+cHN0YXRzLm5hcGlfcXVvdGEpOwotCWVsc2UgeworCQlpZiAodW5saWtlbHkoY3EtPm1jcS5pcnFfYWZmaW5pdHlfY2hhbmdlKSkgeworCQkJY3EtPm1jcS5pcnFfYWZmaW5pdHlfY2hhbmdlID0gZmFsc2U7CisJCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkJbWx4NF9lbl9hcm1fY3EocHJpdiwgY3EpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgewogCQkvKiBEb25lIGZvciBub3cgKi8KKwkJY3EtPm1jcS5pcnFfYWZmaW5pdHlfY2hhbmdlID0gZmFsc2U7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7CiAJCW1seDRfZW5fYXJtX2NxKHByaXYsIGNxKTsKIAl9CkBAIC05NDQsOCArOTQ4LDggQEAKIAlwcml2LT5yeF9za2Jfc2l6ZSA9IGVmZl9tdHU7CiAJcHJpdi0+bG9nX3J4X2luZm8gPSBST1VORFVQX0xPRzIoaSAqIHNpemVvZihzdHJ1Y3QgbWx4NF9lbl9yeF9hbGxvYykpOwogCi0JZW5fZGJnKERSViwgcHJpdiwgIlJ4IGJ1ZmZlciBzY2F0dGVyLWxpc3QgKGVmZmVjdGl2ZS1tdHU6JWQgIgotCQkgICJudW1fZnJhZ3M6JWQpOlxuIiwgZWZmX210dSwgcHJpdi0+bnVtX2ZyYWdzKTsKKwllbl9kYmcoRFJWLCBwcml2LCAiUnggYnVmZmVyIHNjYXR0ZXItbGlzdCAoZWZmZWN0aXZlLW10dTolZCBudW1fZnJhZ3M6JWQpOlxuIiwKKwkgICAgICAgZWZmX210dSwgcHJpdi0+bnVtX2ZyYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX2ZyYWdzOyBpKyspIHsKIAkJZW5fZXJyKHByaXYsCiAJCSAgICAgICAiICBmcmFnOiVkIC0gc2l6ZTolZCBwcmVmaXg6JWQgYWxpZ246JWQgc3RyaWRlOiVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCmluZGV4IGJjMGNjMWUuLjhiZTc0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogCiAJcmluZy0+YnVmID0gcmluZy0+d3FyZXMuYnVmLmRpcmVjdC5idWY7CiAKLQllbl9kYmcoRFJWLCBwcml2LCAiQWxsb2NhdGVkIFRYIHJpbmcgKGFkZHI6JXApIC0gYnVmOiVwIHNpemU6JWQgIgotCSAgICAgICAiYnVmX3NpemU6JWQgZG1hOiVsbHhcbiIsIHJpbmcsIHJpbmctPmJ1ZiwgcmluZy0+c2l6ZSwKLQkgICAgICAgcmluZy0+YnVmX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpIHJpbmctPndxcmVzLmJ1Zi5kaXJlY3QubWFwKTsKKwllbl9kYmcoRFJWLCBwcml2LCAiQWxsb2NhdGVkIFRYIHJpbmcgKGFkZHI6JXApIC0gYnVmOiVwIHNpemU6JWQgYnVmX3NpemU6JWQgZG1hOiVsbHhcbiIsCisJICAgICAgIHJpbmcsIHJpbmctPmJ1ZiwgcmluZy0+c2l6ZSwgcmluZy0+YnVmX3NpemUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJpbmctPndxcmVzLmJ1Zi5kaXJlY3QubWFwKTsKIAogCXJpbmctPnFwbiA9IHFwbjsKIAllcnIgPSBtbHg0X3FwX2FsbG9jKG1kZXYtPmRldiwgcmluZy0+cXBuLCAmcmluZy0+cXAsIEdGUF9LRVJORUwpOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAllcnIgPSBtbHg0X2JmX2FsbG9jKG1kZXYtPmRldiwgJnJpbmctPmJmLCBub2RlKTsKIAlpZiAoZXJyKSB7Ci0JCWVuX2RiZyhEUlYsIHByaXYsICJ3b3JraW5nIHdpdGhvdXQgYmx1ZWZsYW1lICglZCkiLCBlcnIpOworCQllbl9kYmcoRFJWLCBwcml2LCAid29ya2luZyB3aXRob3V0IGJsdWVmbGFtZSAoJWQpXG4iLCBlcnIpOwogCQlyaW5nLT5iZi51YXIgPSAmbWRldi0+cHJpdl91YXI7CiAJCXJpbmctPmJmLnVhci0+bWFwID0gbWRldi0+dWFyX21hcDsKIAkJcmluZy0+YmZfZW5hYmxlZCA9IGZhbHNlOwpAQCAtNDc0LDkgKzQ3NCwxNSBAQAogCS8qIElmIHdlIHVzZWQgdXAgYWxsIHRoZSBxdW90YSAtIHdlJ3JlIHByb2JhYmx5IG5vdCBkb25lIHlldC4uLiAqLwogCWlmIChkb25lIDwgYnVkZ2V0KSB7CiAJCS8qIERvbmUgZm9yIG5vdyAqLworCQljcS0+bWNxLmlycV9hZmZpbml0eV9jaGFuZ2UgPSBmYWxzZTsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJbWx4NF9lbl9hcm1fY3EocHJpdiwgY3EpOwogCQlyZXR1cm4gZG9uZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGNxLT5tY3EuaXJxX2FmZmluaXR5X2NoYW5nZSkpIHsKKwkJY3EtPm1jcS5pcnFfYWZmaW5pdHlfY2hhbmdlID0gZmFsc2U7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisJCW1seDRfZW5fYXJtX2NxKHByaXYsIGNxKTsKKwkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBidWRnZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKaW5kZXggZDUwMWEyYi4uZDk1NGVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwpAQCAtNTMsNiArNTMsMTEgQEAKIAlNTFg0X0VRX0VOVFJZX1NJWkUJPSAweDIwCiB9OwogCitzdHJ1Y3QgbWx4NF9pcnFfbm90aWZ5IHsKKwl2b2lkICphcmc7CisJc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgbm90aWZ5OworfTsKKwogI2RlZmluZSBNTFg0X0VRX1NUQVRVU19PSwkgICAoIDAgPDwgMjgpCiAjZGVmaW5lIE1MWDRfRVFfU1RBVFVTX1dSSVRFX0ZBSUwgICgxMCA8PCAyOCkKICNkZWZpbmUgTUxYNF9FUV9PV05FUl9TVwkgICAoIDAgPDwgMjQpCkBAIC0xNTIsMTQgKzE1NywxMyBAQAogCQkJCWlmIChpICE9IGRldi0+Y2Fwcy5mdW5jdGlvbiAmJgogCQkJCSAgICBtYXN0ZXItPnNsYXZlX3N0YXRlW2ldLmFjdGl2ZSkKIAkJCQkJaWYgKG1seDRfR0VOX0VRRShkZXYsIGksIGVxZSkpCi0JCQkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvICIKLQkJCQkJCQkgICIgZ2VuZXJhdGUgZXZlbnQgIgotCQkJCQkJCSAgImZvciBzbGF2ZSAlZFxuIiwgaSk7CisJCQkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGdlbmVyYXRlIGV2ZW50IGZvciBzbGF2ZSAlZFxuIiwKKwkJCQkJCQkgIGkpOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKG1seDRfR0VOX0VRRShkZXYsIHNsYXZlLCBlcWUpKQotCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZ2VuZXJhdGUgZXZlbnQgIgotCQkJCQkgICAgICAgImZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZ2VuZXJhdGUgZXZlbnQgZm9yIHNsYXZlICVkXG4iLAorCQkJCQkgIHNsYXZlKTsKIAkJfQogCQkrK3NsYXZlX2VxLT5jb25zOwogCX0KQEAgLTE3Nyw4ICsxODEsOCBAQAogCXNfZXFlID0gJnNsYXZlX2VxLT5ldmVudF9lcWVbc2xhdmVfZXEtPnByb2QgJiAoU0xBVkVfRVZFTlRfRVFfU0laRSAtIDEpXTsKIAlpZiAoKCEhKHNfZXFlLT5vd25lciAmIDB4ODApKSBeCiAJICAgICghIShzbGF2ZV9lcS0+cHJvZCAmIFNMQVZFX0VWRU5UX0VRX1NJWkUpKSkgewotCQltbHg0X3dhcm4oZGV2LCAiTWFzdGVyIGZhaWxlZCB0byBnZW5lcmF0ZSBhbiBFUUUgZm9yIHNsYXZlOiAlZC4gIgotCQkJICAiTm8gZnJlZSBFUUUgb24gc2xhdmUgZXZlbnRzIHF1ZXVlXG4iLCBzbGF2ZSk7CisJCW1seDRfd2FybihkZXYsICJNYXN0ZXIgZmFpbGVkIHRvIGdlbmVyYXRlIGFuIEVRRSBmb3Igc2xhdmU6ICVkLiBObyBmcmVlIEVRRSBvbiBzbGF2ZSBldmVudHMgcXVldWVcbiIsCisJCQkgIHNsYXZlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xhdmVfZXEtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM3NSw5ICszNzksOSBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEJVRyEhISBVTktOT1dOIHN0YXRlOiAiCi0JCSAgICAgICAic2xhdmU6JWQsIHBvcnQ6JWRcbiIsIF9fZnVuY19fLCBzbGF2ZSwgcG9ydCk7Ci0JCQlnb3RvIG91dDsKKwkJcHJfZXJyKCIlczogQlVHISEhIFVOS05PV04gc3RhdGU6IHNsYXZlOiVkLCBwb3J0OiVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHNsYXZlLCBwb3J0KTsKKwkJZ290byBvdXQ7CiAJfQogCXJldCA9IG1seDRfZ2V0X3NsYXZlX3BvcnRfc3RhdGUoZGV2LCBzbGF2ZSwgcG9ydCk7CiAKQEAgLTQyNSw4ICs0MjksOCBAQAogCWZvciAoaSA9IDAgOyBpIDwgZGV2LT5udW1fc2xhdmVzOyBpKyspIHsKIAogCQlpZiAoTUxYNF9DT01NX0NNRF9GTFIgPT0gc2xhdmVfc3RhdGVbaV0ubGFzdF9jbWQpIHsKLQkJCW1seDRfZGJnKGRldiwgIm1seDRfaGFuZGxlX3NsYXZlX2ZscjogIgotCQkJCSAiY2xlYW4gc2xhdmU6ICVkXG4iLCBpKTsKKwkJCW1seDRfZGJnKGRldiwgIm1seDRfaGFuZGxlX3NsYXZlX2ZscjogY2xlYW4gc2xhdmU6ICVkXG4iLAorCQkJCSBpKTsKIAogCQkJbWx4NF9kZWxldGVfYWxsX3Jlc291cmNlc19mb3Jfc2xhdmUoZGV2LCBpKTsKIAkJCS8qcmV0dXJuIHRoZSBzbGF2ZSB0byBydW5uaW5nIG1vZGUqLwpAQCAtNDM4LDggKzQ0Miw4IEBACiAJCQllcnIgPSBtbHg0X2NtZChkZXYsIDAsIGksIDAsIE1MWDRfQ01EX0lORk9STV9GTFJfRE9ORSwKIAkJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKIAkJCWlmIChlcnIpCi0JCQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBub3RpZnkgRlcgb24gIgotCQkJCQkgICJGTFIgZG9uZSAoc2xhdmU6JWQpXG4iLCBpKTsKKwkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIG5vdGlmeSBGVyBvbiBGTFIgZG9uZSAoc2xhdmU6JWQpXG4iLAorCQkJCQkgIGkpOwogCQl9CiAJfQogfQpAQCAtNDkwLDkgKzQ5NCw3IEBACiAJCQkJCQliZTMyX3RvX2NwdShlcWUtPmV2ZW50LnFwLnFwbikKIAkJCQkJCSYgMHhmZmZmZmYsICZzbGF2ZSk7CiAJCQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0VOVCkgewotCQkJCQltbHg0X2RiZyhkZXYsICJRUCBldmVudCAlMDJ4KCUwMngpIG9uICIKLQkJCQkJCSAiRVEgJWQgYXQgaW5kZXggJXU6IGNvdWxkICIKLQkJCQkJCSAibm90IGdldCBzbGF2ZSBpZCAoJWQpXG4iLAorCQkJCQltbHg0X2RiZyhkZXYsICJRUCBldmVudCAlMDJ4KCUwMngpIG9uIEVRICVkIGF0IGluZGV4ICV1OiBjb3VsZCBub3QgZ2V0IHNsYXZlIGlkICglZClcbiIsCiAJCQkJCQkgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsCiAJCQkJCQkgZXEtPmVxbiwgZXEtPmNvbnNfaW5kZXgsIHJldCk7CiAJCQkJCWJyZWFrOwpAQCAtNTIwLDIzICs1MjIsMTkgQEAKIAkJCQkJCSYgMHhmZmZmZmYsCiAJCQkJCQkmc2xhdmUpOwogCQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9FTlQpIHsKLQkJCQkJbWx4NF93YXJuKGRldiwgIlNSUSBldmVudCAlMDJ4KCUwMngpICIKLQkJCQkJCSAgIm9uIEVRICVkIGF0IGluZGV4ICV1OiBjb3VsZCIKLQkJCQkJCSAgIiBub3QgZ2V0IHNsYXZlIGlkICglZClcbiIsCisJCQkJCW1seDRfd2FybihkZXYsICJTUlEgZXZlbnQgJTAyeCglMDJ4KSBvbiBFUSAlZCBhdCBpbmRleCAldTogY291bGQgbm90IGdldCBzbGF2ZSBpZCAoJWQpXG4iLAogCQkJCQkJICBlcWUtPnR5cGUsIGVxZS0+c3VidHlwZSwKIAkJCQkJCSAgZXEtPmVxbiwgZXEtPmNvbnNfaW5kZXgsIHJldCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQltbHg0X3dhcm4oZGV2LCAiJXM6IHNsYXZlOiVkLCBzcnFfbm86MHgleCwiCi0JCQkJCSAgIiBldmVudDogJTAyeCglMDJ4KVxuIiwgX19mdW5jX18sCi0JCQkJCSAgc2xhdmUsCisJCQkJbWx4NF93YXJuKGRldiwgIiVzOiBzbGF2ZTolZCwgc3JxX25vOjB4JXgsIGV2ZW50OiAlMDJ4KCUwMngpXG4iLAorCQkJCQkgIF9fZnVuY19fLCBzbGF2ZSwKIAkJCQkJICBiZTMyX3RvX2NwdShlcWUtPmV2ZW50LnNycS5zcnFuKSwKIAkJCQkJICBlcWUtPnR5cGUsIGVxZS0+c3VidHlwZSk7CiAKIAkJCQlpZiAoIXJldCAmJiBzbGF2ZSAhPSBkZXYtPmNhcHMuZnVuY3Rpb24pIHsKLQkJCQkJbWx4NF93YXJuKGRldiwgIiVzOiBzZW5kaW5nIGV2ZW50ICIKLQkJCQkJCSAgIiUwMngoJTAyeCkgdG8gc2xhdmU6JWRcbiIsCi0JCQkJCQkgICBfX2Z1bmNfXywgZXFlLT50eXBlLAorCQkJCQltbHg0X3dhcm4oZGV2LCAiJXM6IHNlbmRpbmcgZXZlbnQgJTAyeCglMDJ4KSB0byBzbGF2ZTolZFxuIiwKKwkJCQkJCSAgX19mdW5jX18sIGVxZS0+dHlwZSwKIAkJCQkJCSAgZXFlLT5zdWJ0eXBlLCBzbGF2ZSk7CiAJCQkJCW1seDRfc2xhdmVfZXZlbnQoZGV2LCBzbGF2ZSwgZXFlKTsKIAkJCQkJYnJlYWs7CkBAIC01NjksOCArNTY3LDcgQEAKIAkJCQkJaWYgKGRldi0+Y2Fwcy5wb3J0X3R5cGVbcG9ydF0gPT0gTUxYNF9QT1JUX1RZUEVfRVRIKSB7CiAJCQkJCQlpZiAoaSA9PSBtbHg0X21hc3Rlcl9mdW5jX251bShkZXYpKQogCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJbWx4NF9kYmcoZGV2LCAiJXM6IFNlbmRpbmcgTUxYNF9QT1JUX0NIQU5HRV9TVUJUWVBFX0RPV04iCi0JCQkJCQkJICIgdG8gc2xhdmU6ICVkLCBwb3J0OiVkXG4iLAorCQkJCQkJbWx4NF9kYmcoZGV2LCAiJXM6IFNlbmRpbmcgTUxYNF9QT1JUX0NIQU5HRV9TVUJUWVBFX0RPV04gdG8gc2xhdmU6ICVkLCBwb3J0OiVkXG4iLAogCQkJCQkJCSBfX2Z1bmNfXywgaSwgcG9ydCk7CiAJCQkJCQlzX2luZm8gPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbc2xhdmVdLnZwb3J0W3BvcnRdLnN0YXRlOwogCQkJCQkJaWYgKElGTEFfVkZfTElOS19TVEFURV9BVVRPID09IHNfaW5mby0+bGlua19zdGF0ZSkgewpAQCAtNjM0LDExICs2MzEsOSBAQAogCQkJCQliZTMyX3RvX2NwdShlcWUtPmV2ZW50LmNxX2Vyci5jcW4pCiAJCQkJCSYgMHhmZmZmZmYsICZzbGF2ZSk7CiAJCQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0VOVCkgewotCQkJCQltbHg0X2RiZyhkZXYsICJDUSBldmVudCAlMDJ4KCUwMngpIG9uICIKLQkJCQkJCSAiRVEgJWQgYXQgaW5kZXggJXU6IGNvdWxkICIKLQkJCQkJCSAgIm5vdCBnZXQgc2xhdmUgaWQgKCVkKVxuIiwKLQkJCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsCi0JCQkJCQkgIGVxLT5lcW4sIGVxLT5jb25zX2luZGV4LCByZXQpOworCQkJCQltbHg0X2RiZyhkZXYsICJDUSBldmVudCAlMDJ4KCUwMngpIG9uIEVRICVkIGF0IGluZGV4ICV1OiBjb3VsZCBub3QgZ2V0IHNsYXZlIGlkICglZClcbiIsCisJCQkJCQkgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsCisJCQkJCQkgZXEtPmVxbiwgZXEtPmNvbnNfaW5kZXgsIHJldCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtNjY3LDggKzY2Miw3IEBACiAKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfQ09NTV9DSEFOTkVMOgogCQkJaWYgKCFtbHg0X2lzX21hc3RlcihkZXYpKSB7Ci0JCQkJbWx4NF93YXJuKGRldiwgIlJlY2VpdmVkIGNvbW0gY2hhbm5lbCBldmVudCAiCi0JCQkJCSAgICAgICAiZm9yIG5vbiBtYXN0ZXIgZGV2aWNlXG4iKTsKKwkJCQltbHg0X3dhcm4oZGV2LCAiUmVjZWl2ZWQgY29tbSBjaGFubmVsIGV2ZW50IGZvciBub24gbWFzdGVyIGRldmljZVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQltZW1jcHkoJnByaXYtPm1mdW5jLm1hc3Rlci5jb21tX2FybV9iaXRfdmVjdG9yLApAQCAtNjgxLDggKzY3NSw3IEBACiAJCWNhc2UgTUxYNF9FVkVOVF9UWVBFX0ZMUl9FVkVOVDoKIAkJCWZscl9zbGF2ZSA9IGJlMzJfdG9fY3B1KGVxZS0+ZXZlbnQuZmxyX2V2ZW50LnNsYXZlX2lkKTsKIAkJCWlmICghbWx4NF9pc19tYXN0ZXIoZGV2KSkgewotCQkJCW1seDRfd2FybihkZXYsICJOb24tbWFzdGVyIGZ1bmN0aW9uIHJlY2VpdmVkIgotCQkJCQkgICAgICAgIkZMUiBldmVudFxuIik7CisJCQkJbWx4NF93YXJuKGRldiwgIk5vbi1tYXN0ZXIgZnVuY3Rpb24gcmVjZWl2ZWQgRkxSIGV2ZW50XG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNzExLDIyICs3MDQsMTcgQEAKIAkJCWlmIChlcWUtPnN1YnR5cGUgPT0gTUxYNF9GQVRBTF9XQVJOSU5HX1NVQlRZUEVfV0FSTUlORykgewogCQkJCWlmIChtbHg0X2lzX21hc3RlcihkZXYpKQogCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fc2xhdmVzOyBpKyspIHsKLQkJCQkJCW1seDRfZGJnKGRldiwgIiVzOiBTZW5kaW5nICIKLQkJCQkJCQkiTUxYNF9GQVRBTF9XQVJOSU5HX1NVQlRZUEVfV0FSTUlORyIKLQkJCQkJCQkiIHRvIHNsYXZlOiAlZFxuIiwgX19mdW5jX18sIGkpOworCQkJCQkJbWx4NF9kYmcoZGV2LCAiJXM6IFNlbmRpbmcgTUxYNF9GQVRBTF9XQVJOSU5HX1NVQlRZUEVfV0FSTUlORyB0byBzbGF2ZTogJWRcbiIsCisJCQkJCQkJIF9fZnVuY19fLCBpKTsKIAkJCQkJCWlmIChpID09IGRldi0+Y2Fwcy5mdW5jdGlvbikKIAkJCQkJCQljb250aW51ZTsKIAkJCQkJCW1seDRfc2xhdmVfZXZlbnQoZGV2LCBpLCBlcWUpOwogCQkJCQl9Ci0JCQkJbWx4NF9lcnIoZGV2LCAiVGVtcGVyYXR1cmUgVGhyZXNob2xkIHdhcyByZWFjaGVkISAiCi0JCQkJCSJUaHJlc2hvbGQ6ICVkIGNlbHNpdXMgZGVncmVlczsgIgotCQkJCQkiQ3VycmVudCBUZW1wZXJhdHVyZTogJWRcbiIsCi0JCQkJCWJlMTZfdG9fY3B1KGVxZS0+ZXZlbnQud2FybWluZy53YXJuaW5nX3RocmVzaG9sZCksCi0JCQkJCWJlMTZfdG9fY3B1KGVxZS0+ZXZlbnQud2FybWluZy5jdXJyZW50X3RlbXBlcmF0dXJlKSk7CisJCQkJbWx4NF9lcnIoZGV2LCAiVGVtcGVyYXR1cmUgVGhyZXNob2xkIHdhcyByZWFjaGVkISBUaHJlc2hvbGQ6ICVkIGNlbHNpdXMgZGVncmVlczsgQ3VycmVudCBUZW1wZXJhdHVyZTogJWRcbiIsCisJCQkJCSBiZTE2X3RvX2NwdShlcWUtPmV2ZW50Lndhcm1pbmcud2FybmluZ190aHJlc2hvbGQpLAorCQkJCQkgYmUxNl90b19jcHUoZXFlLT5ldmVudC53YXJtaW5nLmN1cnJlbnRfdGVtcGVyYXR1cmUpKTsKIAkJCX0gZWxzZQotCQkJCW1seDRfd2FybihkZXYsICJVbmhhbmRsZWQgZXZlbnQgRkFUQUwgV0FSTklORyAoJTAyeCksICIKLQkJCQkJICAic3VidHlwZSAlMDJ4IG9uIEVRICVkIGF0IGluZGV4ICV1LiBvd25lcj0leCwgIgotCQkJCQkgICJuZW50PTB4JXgsIHNsYXZlPSV4LCBvd25lcnNoaXA9JXNcbiIsCisJCQkJbWx4NF93YXJuKGRldiwgIlVuaGFuZGxlZCBldmVudCBGQVRBTCBXQVJOSU5HICglMDJ4KSwgc3VidHlwZSAlMDJ4IG9uIEVRICVkIGF0IGluZGV4ICV1LiBvd25lcj0leCwgbmVudD0weCV4LCBzbGF2ZT0leCwgb3duZXJzaGlwPSVzXG4iLAogCQkJCQkgIGVxZS0+dHlwZSwgZXFlLT5zdWJ0eXBlLCBlcS0+ZXFuLAogCQkJCQkgIGVxLT5jb25zX2luZGV4LCBlcWUtPm93bmVyLCBlcS0+bmVudCwKIAkJCQkJICBlcWUtPnNsYXZlX2lkLApAQCAtNzQzLDkgKzczMSw3IEBACiAJCWNhc2UgTUxYNF9FVkVOVF9UWVBFX0VFQ19DQVRBU19FUlJPUjoKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfRUNDX0RFVEVDVDoKIAkJZGVmYXVsdDoKLQkJCW1seDRfd2FybihkZXYsICJVbmhhbmRsZWQgZXZlbnQgJTAyeCglMDJ4KSBvbiBFUSAlZCBhdCAiCi0JCQkJICAiaW5kZXggJXUuIG93bmVyPSV4LCBuZW50PTB4JXgsIHNsYXZlPSV4LCAiCi0JCQkJICAib3duZXJzaGlwPSVzXG4iLAorCQkJbWx4NF93YXJuKGRldiwgIlVuaGFuZGxlZCBldmVudCAlMDJ4KCUwMngpIG9uIEVRICVkIGF0IGluZGV4ICV1LiBvd25lcj0leCwgbmVudD0weCV4LCBzbGF2ZT0leCwgb3duZXJzaGlwPSVzXG4iLAogCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsIGVxLT5lcW4sCiAJCQkJICBlcS0+Y29uc19pbmRleCwgZXFlLT5vd25lciwgZXEtPm5lbnQsCiAJCQkJICBlcWUtPnNsYXZlX2lkLApAQCAtMTA4OCw3ICsxMDc0LDcgQEAKIAlwcml2LT5jbHJfYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcHJpdi0+ZncuY2xyX2ludF9iYXIpICsKIAkJCQkgcHJpdi0+ZncuY2xyX2ludF9iYXNlLCBNTFg0X0NMUl9JTlRfU0laRSk7CiAJaWYgKCFwcml2LT5jbHJfYmFzZSkgewotCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyLCBhYm9ydGluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTEwMiw2ICsxMDg4LDU3IEBACiAJaW91bm1hcChwcml2LT5jbHJfYmFzZSk7CiB9CiAKK3N0YXRpYyB2b2lkIG1seDRfaXJxX25vdGlmaWVyX25vdGlmeShzdHJ1Y3QgaXJxX2FmZmluaXR5X25vdGlmeSAqbm90aWZ5LAorCQkJCSAgICAgY29uc3QgY3B1bWFza190ICptYXNrKQoreworCXN0cnVjdCBtbHg0X2lycV9ub3RpZnkgKm4gPSBjb250YWluZXJfb2Yobm90aWZ5LAorCQkJCQkJIHN0cnVjdCBtbHg0X2lycV9ub3RpZnksCisJCQkJCQkgbm90aWZ5KTsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gKHN0cnVjdCBtbHg0X3ByaXYgKiluLT5hcmc7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgKipzbG90OworCisJcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KHNsb3QsICZwcml2LT5jcV90YWJsZS50cmVlLCAmaXRlciwgMCkgeworCQlzdHJ1Y3QgbWx4NF9jcSAqY3EgPSAoc3RydWN0IG1seDRfY3EgKikoKnNsb3QpOworCisJCWlmIChjcS0+aXJxID09IG5vdGlmeS0+aXJxKQorCQkJY3EtPmlycV9hZmZpbml0eV9jaGFuZ2UgPSB0cnVlOworCX0KK30KKworc3RhdGljIHZvaWQgbWx4NF9yZWxlYXNlX2lycV9ub3RpZmllcihzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBtbHg0X2lycV9ub3RpZnkgKm4gPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgbWx4NF9pcnFfbm90aWZ5LAorCQkJCQkJIG5vdGlmeS5rcmVmKTsKKwlrZnJlZShuKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9hc3NpZ25faXJxX25vdGlmaWVyKHN0cnVjdCBtbHg0X3ByaXYgKnByaXYsCisJCQkJICAgICBzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbWx4NF9pcnFfbm90aWZ5ICppcnFfbm90aWZpZXIgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJaXJxX25vdGlmaWVyID0ga3phbGxvYyhzaXplb2YoKmlycV9ub3RpZmllciksIEdGUF9LRVJORUwpOworCWlmICghaXJxX25vdGlmaWVyKSB7CisJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaXJxIG5vdGlmaWVyLiBpcnEgJWRcbiIsCisJCQkgIGlycSk7CisJCXJldHVybjsKKwl9CisKKwlpcnFfbm90aWZpZXItPm5vdGlmeS5pcnEgPSBpcnE7CisJaXJxX25vdGlmaWVyLT5ub3RpZnkubm90aWZ5ID0gbWx4NF9pcnFfbm90aWZpZXJfbm90aWZ5OworCWlycV9ub3RpZmllci0+bm90aWZ5LnJlbGVhc2UgPSBtbHg0X3JlbGVhc2VfaXJxX25vdGlmaWVyOworCWlycV9ub3RpZmllci0+YXJnID0gcHJpdjsKKwllcnIgPSBpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKGlycSwgJmlycV9ub3RpZmllci0+bm90aWZ5KTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGlycV9ub3RpZmllcik7CisJCWlycV9ub3RpZmllciA9IE5VTEw7CisJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gc2V0IGlycSBub3RpZmllci4gaXJxICVkXG4iLCBpcnEpOworCX0KK30KKworCiBpbnQgbWx4NF9hbGxvY19lcV90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CkBAIC0xMzcyLDYgKzE0MDksOSBAQAogCQkJCWNvbnRpbnVlOwogCQkJCS8qd2UgZG9udCB3YW50IHRvIGJyZWFrIGhlcmUqLwogCQkJfQorCQkJbWx4NF9hc3NpZ25faXJxX25vdGlmaWVyKHByaXYsIGRldiwKKwkJCQkJCSBwcml2LT5lcV90YWJsZS5lcVt2ZWNdLmlycSk7CisKIAkJCWVxX3NldF9jaSgmcHJpdi0+ZXFfdGFibGUuZXFbdmVjXSwgMSk7CiAJCX0KIAl9CkBAIC0xMzk4LDYgKzE0MzgsOSBAQAogCQkgIEJlbG9uZ2luZyB0byBhIGxlZ2FjeSBFUSovCiAJCW11dGV4X2xvY2soJnByaXYtPm1zaXhfY3RsLnBvb2xfbG9jayk7CiAJCWlmIChwcml2LT5tc2l4X2N0bC5wb29sX2JtICYgMVVMTCA8PCBpKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKAorCQkJCXByaXYtPmVxX3RhYmxlLmVxW3ZlY10uaXJxLAorCQkJCU5VTEwpOwogCQkJZnJlZV9pcnEocHJpdi0+ZXFfdGFibGUuZXFbdmVjXS5pcnEsCiAJCQkJICZwcml2LT5lcV90YWJsZS5lcVt2ZWNdKTsKIAkJCXByaXYtPm1zaXhfY3RsLnBvb2xfYm0gJj0gfigxVUxMIDw8IGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCmluZGV4IDAxZTZkZDYuLjY4OGUxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKQEAgLTQzNyw4ICs0MzcsNyBAQAogCX0gZWxzZSBpZiAoZGV2LT5jYXBzLnBvcnRfdHlwZVtnZW5fb3JfcG9ydF0gPT0gTUxYNF9QT1JUX1RZUEVfSUIpIHsKIAkJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfRkxBR1MwX09GRlNFVCk7CiAJCWlmIChmaWVsZCAmIFFVRVJZX0ZVTkNfQ0FQX0ZMQUdTMF9GT1JDRV9QSFlfV1FFX0dJRCkgewotCQkJbWx4NF9lcnIoZGV2LCAicGh5X3dxZV9naWQgaXMgIgotCQkJCSAiZW5mb3JjZWQgb24gdGhpcyBpYiBwb3J0XG4iKTsKKwkJCW1seDRfZXJyKGRldiwgInBoeV93cWVfZ2lkIGlzIGVuZm9yY2VkIG9uIHRoaXMgaWIgcG9ydFxuIik7CiAJCQllcnIgPSAtRVBST1RPTk9TVVBQT1JUOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTEwNzAsMTAgKzEwNjksMTAgQEAKIAkJICovCiAJCWxnID0gZmZzKG1seDRfaWNtX2FkZHIoJml0ZXIpIHwgbWx4NF9pY21fc2l6ZSgmaXRlcikpIC0gMTsKIAkJaWYgKGxnIDwgTUxYNF9JQ01fUEFHRV9TSElGVCkgewotCQkJbWx4NF93YXJuKGRldiwgIkdvdCBGVyBhcmVhIG5vdCBhbGlnbmVkIHRvICVkICglbGx4LyVseCkuXG4iLAotCQkJCSAgIE1MWDRfSUNNX1BBR0VfU0laRSwKLQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBtbHg0X2ljbV9hZGRyKCZpdGVyKSwKLQkJCQkgICBtbHg0X2ljbV9zaXplKCZpdGVyKSk7CisJCQltbHg0X3dhcm4oZGV2LCAiR290IEZXIGFyZWEgbm90IGFsaWduZWQgdG8gJWQgKCVsbHgvJWx4KVxuIiwKKwkJCQkgIE1MWDRfSUNNX1BBR0VfU0laRSwKKwkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1seDRfaWNtX2FkZHIoJml0ZXIpLAorCQkJCSAgbWx4NF9pY21fc2l6ZSgmaXRlcikpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMTA5LDE0ICsxMTA4LDE0IEBACiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBNTFg0X0NNRF9NQVBfRkE6Ci0JCW1seDRfZGJnKGRldiwgIk1hcHBlZCAlZCBjaHVua3MvJWQgS0IgZm9yIEZXLlxuIiwgdGMsIHRzKTsKKwkJbWx4NF9kYmcoZGV2LCAiTWFwcGVkICVkIGNodW5rcy8lZCBLQiBmb3IgRldcbiIsIHRjLCB0cyk7CiAJCWJyZWFrOwogCWNhc2UgTUxYNF9DTURfTUFQX0lDTV9BVVg6Ci0JCW1seDRfZGJnKGRldiwgIk1hcHBlZCAlZCBjaHVua3MvJWQgS0IgZm9yIElDTSBhdXguXG4iLCB0YywgdHMpOworCQltbHg0X2RiZyhkZXYsICJNYXBwZWQgJWQgY2h1bmtzLyVkIEtCIGZvciBJQ00gYXV4XG4iLCB0YywgdHMpOwogCQlicmVhazsKIAljYXNlIE1MWDRfQ01EX01BUF9JQ006Ci0JCW1seDRfZGJnKGRldiwgIk1hcHBlZCAlZCBjaHVua3MvJWQgS0IgYXQgJWxseCBmb3IgSUNNLlxuIiwKLQkJCSAgdGMsIHRzLCAodW5zaWduZWQgbG9uZyBsb25nKSB2aXJ0IC0gKHRzIDw8IDEwKSk7CisJCW1seDRfZGJnKGRldiwgIk1hcHBlZCAlZCBjaHVua3MvJWQgS0IgYXQgJWxseCBmb3IgSUNNXG4iLAorCQkJIHRjLCB0cywgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmlydCAtICh0cyA8PCAxMCkpOwogCQlicmVhazsKIAl9CiAKQEAgLTEyMDIsMTQgKzEyMDEsMTMgQEAKIAlNTFg0X0dFVChjbWRfaWZfcmV2LCBvdXRib3gsIFFVRVJZX0ZXX0NNRF9JRl9SRVZfT0ZGU0VUKTsKIAlpZiAoY21kX2lmX3JldiA8IE1MWDRfQ09NTUFORF9JTlRFUkZBQ0VfTUlOX1JFViB8fAogCSAgICBjbWRfaWZfcmV2ID4gTUxYNF9DT01NQU5EX0lOVEVSRkFDRV9NQVhfUkVWKSB7Ci0JCW1seDRfZXJyKGRldiwgIkluc3RhbGxlZCBGVyBoYXMgdW5zdXBwb3J0ZWQgIgotCQkJICJjb21tYW5kIGludGVyZmFjZSByZXZpc2lvbiAlZC5cbiIsCisJCW1seDRfZXJyKGRldiwgIkluc3RhbGxlZCBGVyBoYXMgdW5zdXBwb3J0ZWQgY29tbWFuZCBpbnRlcmZhY2UgcmV2aXNpb24gJWRcbiIsCiAJCQkgY21kX2lmX3Jldik7CiAJCW1seDRfZXJyKGRldiwgIihJbnN0YWxsZWQgRlcgdmVyc2lvbiBpcyAlZC4lZC4lMDNkKVxuIiwKIAkJCSAoaW50KSAoZGV2LT5jYXBzLmZ3X3ZlciA+PiAzMiksCiAJCQkgKGludCkgKGRldi0+Y2Fwcy5md192ZXIgPj4gMTYpICYgMHhmZmZmLAogCQkJIChpbnQpIGRldi0+Y2Fwcy5md192ZXIgJiAweGZmZmYpOwotCQltbHg0X2VycihkZXYsICJUaGlzIGRyaXZlciB2ZXJzaW9uIHN1cHBvcnRzIG9ubHkgcmV2aXNpb25zICVkIHRvICVkLlxuIiwKKwkJbWx4NF9lcnIoZGV2LCAiVGhpcyBkcml2ZXIgdmVyc2lvbiBzdXBwb3J0cyBvbmx5IHJldmlzaW9ucyAlZCB0byAlZFxuIiwKIAkJCSBNTFg0X0NPTU1BTkRfSU5URVJGQUNFX01JTl9SRVYsIE1MWDRfQ09NTUFORF9JTlRFUkZBQ0VfTUFYX1JFVik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwppbmRleCAyNjE2OWIzLi41ZjQyZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwpAQCAtMTA0LDggKzEwNCw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV82NGJfY3FlX2VxZSwKIAkJICJFbmFibGUgNjQgYnl0ZSBDUUVzL0VRRXMgd2hlbiB0aGUgRlcgc3VwcG9ydHMgdGhpcyAoZGVmYXVsdDogVHJ1ZSkiKTsKIAotI2RlZmluZSBIQ0FfR0xPQkFMX0NBUF9NQVNLICAgICAgICAgICAgMAotCiAjZGVmaW5lIFBGX0NPTlRFWFRfQkVIQVZJT1VSX01BU0sJTUxYNF9GVU5DX0NBUF82NEJfRVFFX0NRRQogCiBzdGF0aWMgY2hhciBtbHg0X3ZlcnNpb25bXSA9CkBAIC0xMzQsOCArMTMyLDcgQEAKIAogc3RhdGljIGJvb2wgdXNlX3ByaW87CiBtb2R1bGVfcGFyYW1fbmFtZWQodXNlX3ByaW8sIHVzZV9wcmlvLCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModXNlX3ByaW8sICJFbmFibGUgc3RlZXJpbmcgYnkgVkxBTiBwcmlvcml0eSBvbiBFVEggcG9ydHMgIgotCQkgICIoMC8xLCBkZWZhdWx0IDApIik7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9wcmlvLCAiRW5hYmxlIHN0ZWVyaW5nIGJ5IFZMQU4gcHJpb3JpdHkgb24gRVRIIHBvcnRzIChkZXByZWNhdGVkKSIpOwogCiBpbnQgbG9nX210dHNfcGVyX3NlZyA9IGlsb2cyKE1MWDRfTVRUX0VOVFJZX1BFUl9TRUcpOwogbW9kdWxlX3BhcmFtX25hbWVkKGxvZ19tdHRzX3Blcl9zZWcsIGxvZ19tdHRzX3Blcl9zZWcsIGludCwgMDQ0NCk7CkBAIC0xNjMsOCArMTYwLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5jYXBzLm51bV9wb3J0cyAtIDE7IGkrKykgewogCQlpZiAocG9ydF90eXBlW2ldICE9IHBvcnRfdHlwZVtpICsgMV0pIHsKIAkJCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX0RQRFApKSB7Ci0JCQkJbWx4NF9lcnIoZGV2LCAiT25seSBzYW1lIHBvcnQgdHlwZXMgc3VwcG9ydGVkICIKLQkJCQkJICJvbiB0aGlzIEhDQSwgYWJvcnRpbmcuXG4iKTsKKwkJCQltbHg0X2VycihkZXYsICJPbmx5IHNhbWUgcG9ydCB0eXBlcyBzdXBwb3J0ZWQgb24gdGhpcyBIQ0EsIGFib3J0aW5nXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpAQCAtMTcyLDggKzE2OCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5jYXBzLm51bV9wb3J0czsgaSsrKSB7CiAJCWlmICghKHBvcnRfdHlwZVtpXSAmIGRldi0+Y2Fwcy5zdXBwb3J0ZWRfdHlwZVtpKzFdKSkgewotCQkJbWx4NF9lcnIoZGV2LCAiUmVxdWVzdGVkIHBvcnQgdHlwZSBmb3IgcG9ydCAlZCBpcyBub3QgIgotCQkJCSAgICAgICJzdXBwb3J0ZWQgb24gdGhpcyBIQ0FcbiIsIGkgKyAxKTsKKwkJCW1seDRfZXJyKGRldiwgIlJlcXVlc3RlZCBwb3J0IHR5cGUgZm9yIHBvcnQgJWQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIEhDQVxuIiwKKwkJCQkgaSArIDEpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0xOTUsMjYgKzE5MSwyMyBAQAogCiAJZXJyID0gbWx4NF9RVUVSWV9ERVZfQ0FQKGRldiwgZGV2X2NhcCk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJRVUVSWV9ERVZfQ0FQIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJRVUVSWV9ERVZfQ0FQIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGRldl9jYXAtPm1pbl9wYWdlX3N6ID4gUEFHRV9TSVpFKSB7Ci0JCW1seDRfZXJyKGRldiwgIkhDQSBtaW5pbXVtIHBhZ2Ugc2l6ZSBvZiAlZCBiaWdnZXIgdGhhbiAiCi0JCQkgImtlcm5lbCBQQUdFX1NJWkUgb2YgJWxkLCBhYm9ydGluZy5cbiIsCisJCW1seDRfZXJyKGRldiwgIkhDQSBtaW5pbXVtIHBhZ2Ugc2l6ZSBvZiAlZCBiaWdnZXIgdGhhbiBrZXJuZWwgUEFHRV9TSVpFIG9mICVsZCwgYWJvcnRpbmdcbiIsCiAJCQkgZGV2X2NhcC0+bWluX3BhZ2Vfc3osIFBBR0VfU0laRSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoZGV2X2NhcC0+bnVtX3BvcnRzID4gTUxYNF9NQVhfUE9SVFMpIHsKLQkJbWx4NF9lcnIoZGV2LCAiSENBIGhhcyAlZCBwb3J0cywgYnV0IHdlIG9ubHkgc3VwcG9ydCAlZCwgIgotCQkJICJhYm9ydGluZy5cbiIsCisJCW1seDRfZXJyKGRldiwgIkhDQSBoYXMgJWQgcG9ydHMsIGJ1dCB3ZSBvbmx5IHN1cHBvcnQgJWQsIGFib3J0aW5nXG4iLAogCQkJIGRldl9jYXAtPm51bV9wb3J0cywgTUxYNF9NQVhfUE9SVFMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoZGV2X2NhcC0+dWFyX3NpemUgPiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMikpIHsKLQkJbWx4NF9lcnIoZGV2LCAiSENBIHJlcG9ydGVkIFVBUiBzaXplIG9mIDB4JXggYmlnZ2VyIHRoYW4gIgotCQkJICJQQ0kgcmVzb3VyY2UgMiBzaXplIG9mIDB4JWxseCwgYWJvcnRpbmcuXG4iLAorCQltbHg0X2VycihkZXYsICJIQ0EgcmVwb3J0ZWQgVUFSIHNpemUgb2YgMHgleCBiaWdnZXIgdGhhbiBQQ0kgcmVzb3VyY2UgMiBzaXplIG9mIDB4JWxseCwgYWJvcnRpbmdcbiIsCiAJCQkgZGV2X2NhcC0+dWFyX3NpemUsCiAJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDIpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yOTYsNyArMjg5LDYgQEAKIAogCWRldi0+Y2Fwcy5sb2dfbnVtX21hY3MgID0gbG9nX251bV9tYWM7CiAJZGV2LT5jYXBzLmxvZ19udW1fdmxhbnMgPSBNTFg0X0xPR19OVU1fVkxBTlM7Ci0JZGV2LT5jYXBzLmxvZ19udW1fcHJpb3MgPSB1c2VfcHJpbyA/IDMgOiAwOwogCiAJZm9yIChpID0gMTsgaSA8PSBkZXYtPmNhcHMubnVtX3BvcnRzOyArK2kpIHsKIAkJZGV2LT5jYXBzLnBvcnRfdHlwZVtpXSA9IE1MWDRfUE9SVF9UWVBFX05PTkU7CkBAIC0zNDcsMTQgKzMzOSwxMiBAQAogCiAJCWlmIChkZXYtPmNhcHMubG9nX251bV9tYWNzID4gZGV2X2NhcC0+bG9nX21heF9tYWNzW2ldKSB7CiAJCQlkZXYtPmNhcHMubG9nX251bV9tYWNzID0gZGV2X2NhcC0+bG9nX21heF9tYWNzW2ldOwotCQkJbWx4NF93YXJuKGRldiwgIlJlcXVlc3RlZCBudW1iZXIgb2YgTUFDcyBpcyB0b28gbXVjaCAiCi0JCQkJICAiZm9yIHBvcnQgJWQsIHJlZHVjaW5nIHRvICVkLlxuIiwKKwkJCW1seDRfd2FybihkZXYsICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIE1BQ3MgaXMgdG9vIG11Y2ggZm9yIHBvcnQgJWQsIHJlZHVjaW5nIHRvICVkXG4iLAogCQkJCSAgaSwgMSA8PCBkZXYtPmNhcHMubG9nX251bV9tYWNzKTsKIAkJfQogCQlpZiAoZGV2LT5jYXBzLmxvZ19udW1fdmxhbnMgPiBkZXZfY2FwLT5sb2dfbWF4X3ZsYW5zW2ldKSB7CiAJCQlkZXYtPmNhcHMubG9nX251bV92bGFucyA9IGRldl9jYXAtPmxvZ19tYXhfdmxhbnNbaV07Ci0JCQltbHg0X3dhcm4oZGV2LCAiUmVxdWVzdGVkIG51bWJlciBvZiBWTEFOcyBpcyB0b28gbXVjaCAiCi0JCQkJICAiZm9yIHBvcnQgJWQsIHJlZHVjaW5nIHRvICVkLlxuIiwKKwkJCW1seDRfd2FybihkZXYsICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIFZMQU5zIGlzIHRvbyBtdWNoIGZvciBwb3J0ICVkLCByZWR1Y2luZyB0byAlZFxuIiwKIAkJCQkgIGksIDEgPDwgZGV2LT5jYXBzLmxvZ19udW1fdmxhbnMpOwogCQl9CiAJfQpAQCAtMzY2LDcgKzM1Niw2IEBACiAJCWRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX0ZDX0FERFJdID0KIAkJKDEgPDwgZGV2LT5jYXBzLmxvZ19udW1fbWFjcykgKgogCQkoMSA8PCBkZXYtPmNhcHMubG9nX251bV92bGFucykgKgotCQkoMSA8PCBkZXYtPmNhcHMubG9nX251bV9wcmlvcykgKgogCQlkZXYtPmNhcHMubnVtX3BvcnRzOwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX0ZDX0VYQ0hdID0gTUxYNF9OVU1fRkVYQ0g7CiAKQEAgLTU4NCwxMyArNTczLDE0IEBACiAJbWVtc2V0KCZoY2FfcGFyYW0sIDAsIHNpemVvZihoY2FfcGFyYW0pKTsKIAllcnIgPSBtbHg0X1FVRVJZX0hDQShkZXYsICZoY2FfcGFyYW0pOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfSENBIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJRVUVSWV9IQ0EgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQkvKmZhaWwgaWYgdGhlIGhjYSBoYXMgYW4gdW5rbm93biBjYXBhYmlsaXR5ICovCi0JaWYgKChoY2FfcGFyYW0uZ2xvYmFsX2NhcHMgfCBIQ0FfR0xPQkFMX0NBUF9NQVNLKSAhPQotCSAgICBIQ0FfR0xPQkFMX0NBUF9NQVNLKSB7CisJLyogZmFpbCBpZiB0aGUgaGNhIGhhcyBhbiB1bmtub3duIGdsb2JhbCBjYXBhYmlsaXR5CisJICogYXQgdGhpcyB0aW1lIGdsb2JhbF9jYXBzIHNob3VsZCBiZSBhbHdheXMgemVyb2VkCisJICovCisJaWYgKGhjYV9wYXJhbS5nbG9iYWxfY2FwcykgewogCQltbHg0X2VycihkZXYsICJVbmtub3duIGhjYSBnbG9iYWwgY2FwYWJpbGl0aWVzXG4iKTsKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQpAQCAtNjAzLDE5ICs1OTMsMTggQEAKIAlkZXYtPmNhcHMubWF4X3FwX2Rlc3RfcmRtYSA9IDEgPDwgaGNhX3BhcmFtLmxvZ19yZF9wZXJfcXA7CiAJZXJyID0gbWx4NF9kZXZfY2FwKGRldiwgJmRldl9jYXApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfREVWX0NBUCBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiUVVFUllfREVWX0NBUCBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IG1seDRfUVVFUllfRlcoZGV2KTsKIAlpZiAoZXJyKQotCQltbHg0X2VycihkZXYsICJRVUVSWV9GVyBjb21tYW5kIGZhaWxlZDogY291bGQgbm90IGdldCBGVyB2ZXJzaW9uLlxuIik7CisJCW1seDRfZXJyKGRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgZmFpbGVkOiBjb3VsZCBub3QgZ2V0IEZXIHZlcnNpb25cbiIpOwogCiAJcGFnZV9zaXplID0gfmRldi0+Y2Fwcy5wYWdlX3NpemVfY2FwICsgMTsKIAltbHg0X3dhcm4oZGV2LCAiSENBIG1pbmltdW0gcGFnZSBzaXplOiVkXG4iLCBwYWdlX3NpemUpOwogCWlmIChwYWdlX3NpemUgPiBQQUdFX1NJWkUpIHsKLQkJbWx4NF9lcnIoZGV2LCAiSENBIG1pbmltdW0gcGFnZSBzaXplIG9mICVkIGJpZ2dlciB0aGFuICIKLQkJCSAia2VybmVsIFBBR0VfU0laRSBvZiAlbGQsIGFib3J0aW5nLlxuIiwKKwkJbWx4NF9lcnIoZGV2LCAiSENBIG1pbmltdW0gcGFnZSBzaXplIG9mICVkIGJpZ2dlciB0aGFuIGtlcm5lbCBQQUdFX1NJWkUgb2YgJWxkLCBhYm9ydGluZ1xuIiwKIAkJCSBwYWdlX3NpemUsIFBBR0VfU0laRSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTYzMyw4ICs2MjIsOCBAQAogCW1lbXNldCgmZnVuY19jYXAsIDAsIHNpemVvZihmdW5jX2NhcCkpOwogCWVyciA9IG1seDRfUVVFUllfRlVOQ19DQVAoZGV2LCAwLCAmZnVuY19jYXApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfRlVOQ19DQVAgZ2VuZXJhbCBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcgKCVkKS5cbiIsCi0JCQkgIGVycik7CisJCW1seDRfZXJyKGRldiwgIlFVRVJZX0ZVTkNfQ0FQIGdlbmVyYWwgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nICglZClcbiIsCisJCQkgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTY2MSw4ICs2NTAsOCBAQAogCWRldi0+Y2Fwcy5udW1fYW1nbXMgICAgICAgICAgICAgPSAwOwogCiAJaWYgKGRldi0+Y2Fwcy5udW1fcG9ydHMgPiBNTFg0X01BWF9QT1JUUykgewotCQltbHg0X2VycihkZXYsICJIQ0EgaGFzICVkIHBvcnRzLCBidXQgd2Ugb25seSBzdXBwb3J0ICVkLCAiCi0JCQkgImFib3J0aW5nLlxuIiwgZGV2LT5jYXBzLm51bV9wb3J0cywgTUxYNF9NQVhfUE9SVFMpOworCQltbHg0X2VycihkZXYsICJIQ0EgaGFzICVkIHBvcnRzLCBidXQgd2Ugb25seSBzdXBwb3J0ICVkLCBhYm9ydGluZ1xuIiwKKwkJCSBkZXYtPmNhcHMubnVtX3BvcnRzLCBNTFg0X01BWF9QT1JUUyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNjgyLDggKzY3MSw4IEBACiAJZm9yIChpID0gMTsgaSA8PSBkZXYtPmNhcHMubnVtX3BvcnRzOyArK2kpIHsKIAkJZXJyID0gbWx4NF9RVUVSWV9GVU5DX0NBUChkZXYsICh1MzIpIGksICZmdW5jX2NhcCk7CiAJCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKGRldiwgIlFVRVJZX0ZVTkNfQ0FQIHBvcnQgY29tbWFuZCBmYWlsZWQgZm9yIgotCQkJCSAiIHBvcnQgJWQsIGFib3J0aW5nICglZCkuXG4iLCBpLCBlcnIpOworCQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfRlVOQ19DQVAgcG9ydCBjb21tYW5kIGZhaWxlZCBmb3IgcG9ydCAlZCwgYWJvcnRpbmcgKCVkKVxuIiwKKwkJCQkgaSwgZXJyKTsKIAkJCWdvdG8gZXJyX21lbTsKIAkJfQogCQlkZXYtPmNhcHMucXAwX3FrZXlbaSAtIDFdID0gZnVuY19jYXAucXAwX3FrZXk7CkBAIC03MDIsOCArNjkxLDcgQEAKIAlpZiAoZGV2LT5jYXBzLnVhcl9wYWdlX3NpemUgKiAoZGV2LT5jYXBzLm51bV91YXJzIC0KIAkJCQkgICAgICAgZGV2LT5jYXBzLnJlc2VydmVkX3VhcnMpID4KIAkJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDIpKSB7Ci0JCW1seDRfZXJyKGRldiwgIkhDQSByZXBvcnRlZCBVQVIgcmVnaW9uIHNpemUgb2YgMHgleCBiaWdnZXIgdGhhbiAiCi0JCQkgIlBDSSByZXNvdXJjZSAyIHNpemUgb2YgMHglbGx4LCBhYm9ydGluZy5cbiIsCisJCW1seDRfZXJyKGRldiwgIkhDQSByZXBvcnRlZCBVQVIgcmVnaW9uIHNpemUgb2YgMHgleCBiaWdnZXIgdGhhbiBQQ0kgcmVzb3VyY2UgMiBzaXplIG9mIDB4JWxseCwgYWJvcnRpbmdcbiIsCiAJCQkgZGV2LT5jYXBzLnVhcl9wYWdlX3NpemUgKiBkZXYtPmNhcHMubnVtX3VhcnMsCiAJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDIpKTsKIAkJZ290byBlcnJfbWVtOwpAQCAtNzI1LDcgKzcxMyw3IEBACiAJfQogCiAJZGV2LT5jYXBzLmZsYWdzMiAmPSB+TUxYNF9ERVZfQ0FQX0ZMQUcyX1RTOwotCW1seDRfd2FybihkZXYsICJUaW1lc3RhbXBpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiBzbGF2ZSBtb2RlLlxuIik7CisJbWx4NF93YXJuKGRldiwgIlRpbWVzdGFtcGluZyBpcyBub3Qgc3VwcG9ydGVkIGluIHNsYXZlIG1vZGVcbiIpOwogCiAJc2xhdmVfYWRqdXN0X3N0ZWVyaW5nX21vZGUoZGV2LCAmZGV2X2NhcCwgJmhjYV9wYXJhbSk7CiAKQEAgLTc5MSw4ICs3NzksOCBAQAogCQkJZGV2LT5jYXBzLnBvcnRfdHlwZVtwb3J0XSA9IHBvcnRfdHlwZXNbcG9ydCAtIDFdOwogCQkJZXJyID0gbWx4NF9TRVRfUE9SVChkZXYsIHBvcnQsIC0xKTsKIAkJCWlmIChlcnIpIHsKLQkJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IHBvcnQgJWQsICIKLQkJCQkJICAgICAgImFib3J0aW5nXG4iLCBwb3J0KTsKKwkJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IHBvcnQgJWQsIGFib3J0aW5nXG4iLAorCQkJCQkgcG9ydCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTg3NSw5ICs4NjMsNyBAQAogCQl9CiAJfQogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIobWRldiwgIkF1dG8gc2Vuc2luZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgSENBLiAiCi0JCQkgICAgICAgIlNldCBvbmx5ICdldGgnIG9yICdpYicgZm9yIGJvdGggcG9ydHMgIgotCQkJICAgICAgICIoc2hvdWxkIGJlIHRoZSBzYW1lKVxuIik7CisJCW1seDRfZXJyKG1kZXYsICJBdXRvIHNlbnNpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIEhDQS4gU2V0IG9ubHkgJ2V0aCcgb3IgJ2liJyBmb3IgYm90aCBwb3J0cyAoc2hvdWxkIGJlIHRoZSBzYW1lKVxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtOTgyLDggKzk2OCw4IEBACiAJCW1seDRfQ0xPU0VfUE9SVChtZGV2LCBwb3J0KTsKIAkJZXJyID0gbWx4NF9TRVRfUE9SVChtZGV2LCBwb3J0LCAtMSk7CiAJCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKG1kZXYsICJGYWlsZWQgdG8gc2V0IHBvcnQgJWQsICIKLQkJCQkgICAgICAiYWJvcnRpbmdcbiIsIHBvcnQpOworCQkJbWx4NF9lcnIobWRldiwgIkZhaWxlZCB0byBzZXQgcG9ydCAlZCwgYWJvcnRpbmdcbiIsCisJCQkJIHBvcnQpOwogCQkJZ290byBlcnJfc2V0X3BvcnQ7CiAJCX0KIAl9CkBAIC0xMDAyLDE5ICs5ODgsMTkgQEAKIAlwcml2LT5mdy5md19pY20gPSBtbHg0X2FsbG9jX2ljbShkZXYsIHByaXYtPmZ3LmZ3X3BhZ2VzLAogCQkJCQkgR0ZQX0hJR0hVU0VSIHwgX19HRlBfTk9XQVJOLCAwKTsKIAlpZiAoIXByaXYtPmZ3LmZ3X2ljbSkgewotCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBGVyBhcmVhLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBGVyBhcmVhLCBhYm9ydGluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWVyciA9IG1seDRfTUFQX0ZBKGRldiwgcHJpdi0+ZncuZndfaWNtKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIk1BUF9GQSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiTUFQX0ZBIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJZXJyID0gbWx4NF9SVU5fRlcoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIlJVTl9GVyBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiUlVOX0ZXIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX3VubWFwX2ZhOwogCX0KIApAQCAtMTA5OCwzMCArMTA4NCwzMCBAQAogCiAJZXJyID0gbWx4NF9TRVRfSUNNX1NJWkUoZGV2LCBpY21fc2l6ZSwgJmF1eF9wYWdlcyk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJTRVRfSUNNX1NJWkUgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIlNFVF9JQ01fU0laRSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCW1seDRfZGJnKGRldiwgIiVsbGQgS0Igb2YgSENBIGNvbnRleHQgcmVxdWlyZXMgJWxsZCBLQiBhdXggbWVtb3J5LlxuIiwKKwltbHg0X2RiZyhkZXYsICIlbGxkIEtCIG9mIEhDQSBjb250ZXh0IHJlcXVpcmVzICVsbGQgS0IgYXV4IG1lbW9yeVxuIiwKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGljbV9zaXplID4+IDEwLAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXV4X3BhZ2VzIDw8IDIpOwogCiAJcHJpdi0+ZncuYXV4X2ljbSA9IG1seDRfYWxsb2NfaWNtKGRldiwgYXV4X3BhZ2VzLAogCQkJCQkgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX05PV0FSTiwgMCk7CiAJaWYgKCFwcml2LT5mdy5hdXhfaWNtKSB7Ci0JCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGF1eCBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGF1eCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJZXJyID0gbWx4NF9NQVBfSUNNX0FVWChkZXYsIHByaXYtPmZ3LmF1eF9pY20pOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiTUFQX0lDTV9BVVggY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIk1BUF9JQ01fQVVYIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2ZyZWVfYXV4OwogCX0KIAogCWVyciA9IG1seDRfaW5pdF9jbXB0X3RhYmxlKGRldiwgaW5pdF9oY2EtPmNtcHRfYmFzZSwgZGV2X2NhcC0+Y21wdF9lbnRyeV9zeik7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIGNNUFQgY29udGV4dCBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgY01QVCBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl91bm1hcF9hdXg7CiAJfQogCkBAIC0xMTMyLDcgKzExMTgsNyBAQAogCQkJCSAgaW5pdF9oY2EtPmVxY19iYXNlLCBkZXZfY2FwLT5lcWNfZW50cnlfc3osCiAJCQkJICBudW1fZXFzLCBudW1fZXFzLCAwLCAwKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgRVEgY29udGV4dCBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgRVEgY29udGV4dCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfdW5tYXBfY21wdDsKIAl9CiAKQEAgLTExNTMsNyArMTEzOSw3IEBACiAJCQkJICBkZXYtPmNhcHMubnVtX210dHMsCiAJCQkJICBkZXYtPmNhcHMucmVzZXJ2ZWRfbXR0cywgMSwgMCk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIE1UVCBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBNVFQgY29udGV4dCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfdW5tYXBfZXE7CiAJfQogCkBAIC0xMTYzLDcgKzExNDksNyBAQAogCQkJCSAgZGV2LT5jYXBzLm51bV9tcHRzLAogCQkJCSAgZGV2LT5jYXBzLnJlc2VydmVkX21yd3MsIDEsIDEpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBkTVBUIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIGRNUFQgY29udGV4dCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfdW5tYXBfbXR0OwogCX0KIApAQCAtMTE3NCw3ICsxMTYwLDcgQEAKIAkJCQkgIGRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX0ZXXSwKIAkJCQkgIDAsIDApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBRUCBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBRUCBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl91bm1hcF9kbXB0OwogCX0KIApAQCAtMTE4NSw3ICsxMTcxLDcgQEAKIAkJCQkgIGRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX0ZXXSwKIAkJCQkgIDAsIDApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBBVVhDIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIEFVWEMgY29udGV4dCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfdW5tYXBfcXA7CiAJfQogCkBAIC0xMTk2LDcgKzExODIsNyBAQAogCQkJCSAgZGV2LT5jYXBzLnJlc2VydmVkX3Fwc19jbnRbTUxYNF9RUF9SRUdJT05fRlddLAogCQkJCSAgMCwgMCk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIEFMVEMgY29udGV4dCBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgQUxUQyBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl91bm1hcF9hdXhjOwogCX0KIApAQCAtMTIxNyw3ICsxMjAzLDcgQEAKIAkJCQkgIGRldi0+Y2Fwcy5udW1fY3FzLAogCQkJCSAgZGV2LT5jYXBzLnJlc2VydmVkX2NxcywgMCwgMCk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIENRIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIENRIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX3VubWFwX3JkbWFyYzsKIAl9CiAKQEAgLTEyMjcsNyArMTIxMyw3IEBACiAJCQkJICBkZXYtPmNhcHMubnVtX3NycXMsCiAJCQkJICBkZXYtPmNhcHMucmVzZXJ2ZWRfc3JxcywgMCwgMCk7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIFNSUSBjb250ZXh0IG1lbW9yeSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBTUlEgY29udGV4dCBtZW1vcnksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfdW5tYXBfY3E7CiAJfQogCkBAIC0xMjQ1LDcgKzEyMzEsNyBAQAogCQkJCSAgZGV2LT5jYXBzLm51bV9tZ21zICsgZGV2LT5jYXBzLm51bV9hbWdtcywKIAkJCQkgIDAsIDApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBNQ0cgY29udGV4dCBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgTUNHIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX3VubWFwX3NycTsKIAl9CiAKQEAgLTEzMjIsNyArMTMwOCw3IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5jbWQuc2xhdmVfY21kX211dGV4KTsKIAlpZiAobWx4NF9jb21tX2NtZChkZXYsIE1MWDRfQ09NTV9DTURfUkVTRVQsIDAsIE1MWDRfQ09NTV9USU1FKSkKLQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBjbG9zZSBzbGF2ZSBmdW5jdGlvbi5cbiIpOworCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGNsb3NlIHNsYXZlIGZ1bmN0aW9uXG4iKTsKIAltdXRleF91bmxvY2soJnByaXYtPmNtZC5zbGF2ZV9jbWRfbXV0ZXgpOwogfQogCkBAIC0xNDIwLDcgKzE0MDYsNyBAQAogCXUzMiBjbWRfY2hhbm5lbF92ZXI7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnBmX2xvYWRpbmcpKSB7Ci0JCW1seDRfd2FybihkZXYsICJQRiBpcyBub3QgcmVhZHkuIERlZmVycmluZyBwcm9iZVxuIik7CisJCW1seDRfd2FybihkZXYsICJQRiBpcyBub3QgcmVhZHkgLSBEZWZlcnJpbmcgcHJvYmVcbiIpOwogCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAl9CiAKQEAgLTE0MzMsOCArMTQxOSw3IEBACiAJICogTlVNX09GX1JFU0VUX1JFVFJJRVMgdGltZXMgYmVmb3JlIGxlYXZpbmcuKi8KIAlpZiAocmV0X2Zyb21fcmVzZXQpIHsKIAkJaWYgKE1MWDRfREVMQVlfUkVTRVRfU0xBVkUgPT0gcmV0X2Zyb21fcmVzZXQpIHsKLQkJCW1seDRfd2FybihkZXYsICJzbGF2ZSBpcyBjdXJyZW50bHkgaW4gdGhlICIKLQkJCQkgICJtaWRkbGUgb2YgRkxSLiBEZWZlcnJpbmcgcHJvYmUuXG4iKTsKKwkJCW1seDRfd2FybihkZXYsICJzbGF2ZSBpcyBjdXJyZW50bHkgaW4gdGhlIG1pZGRsZSBvZiBGTFIgLSBEZWZlcnJpbmcgcHJvYmVcbiIpOwogCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jbWQuc2xhdmVfY21kX211dGV4KTsKIAkJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCQl9IGVsc2UKQEAgLTE0NDgsOCArMTQzMyw3IEBACiAKIAlpZiAoTUxYNF9DT01NX0dFVF9JRl9SRVYoY21kX2NoYW5uZWxfdmVyKSAhPQogCQlNTFg0X0NPTU1fR0VUX0lGX1JFVihzbGF2ZV9yZWFkKSkgewotCQltbHg0X2VycihkZXYsICJzbGF2ZSBkcml2ZXIgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIgotCQkJICIgYnkgdGhlIG1hc3RlclxuIik7CisJCW1seDRfZXJyKGRldiwgInNsYXZlIGRyaXZlciB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hc3RlclxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTUyNyw4ICsxNTExLDcgQEAKIAogCQkJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUiB8fAogCQkJICAgIGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikKLQkJCQltbHg0X3dhcm4oZGV2LCAiTXVzdCBoYXZlIGJvdGggVUNfU1RFRVIgYW5kIE1DX1NURUVSIGZsYWdzICIKLQkJCQkJICAic2V0IHRvIHVzZSBCMCBzdGVlcmluZy4gRmFsbGluZyBiYWNrIHRvIEEwIHN0ZWVyaW5nIG1vZGUuXG4iKTsKKwkJCQltbHg0X3dhcm4oZGV2LCAiTXVzdCBoYXZlIGJvdGggVUNfU1RFRVIgYW5kIE1DX1NURUVSIGZsYWdzIHNldCB0byB1c2UgQjAgc3RlZXJpbmcgLSBmYWxsaW5nIGJhY2sgdG8gQTAgc3RlZXJpbmcgbW9kZVxuIik7CiAJCX0KIAkJZGV2LT5vcGVyX2xvZ19tZ21fZW50cnlfc2l6ZSA9CiAJCQltbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUgPiAwID8KQEAgLTE1MzYsOCArMTUxOSw3IEBACiAJCQlNTFg0X0RFRkFVTFRfTUdNX0xPR19FTlRSWV9TSVpFOwogCQlkZXYtPmNhcHMubnVtX3FwX3Blcl9tZ20gPSBtbHg0X2dldF9xcF9wZXJfbWdtKGRldik7CiAJfQotCW1seDRfZGJnKGRldiwgIlN0ZWVyaW5nIG1vZGUgaXM6ICVzLCBvcGVyX2xvZ19tZ21fZW50cnlfc2l6ZSA9ICVkLCAiCi0JCSAibW9kcGFyYW0gbG9nX251bV9tZ21fZW50cnlfc2l6ZSA9ICVkXG4iLAorCW1seDRfZGJnKGRldiwgIlN0ZWVyaW5nIG1vZGUgaXM6ICVzLCBvcGVyX2xvZ19tZ21fZW50cnlfc2l6ZSA9ICVkLCBtb2RwYXJhbSBsb2dfbnVtX21nbV9lbnRyeV9zaXplID0gJWRcbiIsCiAJCSBtbHg0X3N0ZWVyaW5nX21vZGVfc3RyKGRldi0+Y2Fwcy5zdGVlcmluZ19tb2RlKSwKIAkJIGRldi0+b3Blcl9sb2dfbWdtX2VudHJ5X3NpemUsCiAJCSBtbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUpOwpAQCAtMTU3MSwxNSArMTU1MywxNSBAQAogCQllcnIgPSBtbHg0X1FVRVJZX0ZXKGRldik7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgPT0gLUVBQ0NFUykKLQkJCQltbHg0X2luZm8oZGV2LCAibm9uLXByaW1hcnkgcGh5c2ljYWwgZnVuY3Rpb24sIHNraXBwaW5nLlxuIik7CisJCQkJbWx4NF9pbmZvKGRldiwgIm5vbi1wcmltYXJ5IHBoeXNpY2FsIGZ1bmN0aW9uLCBza2lwcGluZ1xuIik7CiAJCQllbHNlCi0JCQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfRlcgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfRlcgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAogCQllcnIgPSBtbHg0X2xvYWRfZncoZGV2KTsKIAkJaWYgKGVycikgewotCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEZXLCBhYm9ydGluZy5cbiIpOworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEZXLCBhYm9ydGluZ1xuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTE1OTEsNyArMTU3Myw3IEBACiAKIAkJZXJyID0gbWx4NF9kZXZfY2FwKGRldiwgJmRldl9jYXApOwogCQlpZiAoZXJyKSB7Ci0JCQltbHg0X2VycihkZXYsICJRVUVSWV9ERVZfQ0FQIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQkJbWx4NF9lcnIoZGV2LCAiUVVFUllfREVWX0NBUCBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQkJZ290byBlcnJfc3RvcF9mdzsKIAkJfQogCkBAIC0xNjMyLDcgKzE2MTQsNyBAQAogCiAJCWVyciA9IG1seDRfSU5JVF9IQ0EoZGV2LCAmaW5pdF9oY2EpOwogCQlpZiAoZXJyKSB7Ci0JCQltbHg0X2VycihkZXYsICJJTklUX0hDQSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJCW1seDRfZXJyKGRldiwgIklOSVRfSENBIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCQlnb3RvIGVycl9mcmVlX2ljbTsKIAkJfQogCQkvKgpAQCAtMTY0Myw3ICsxNjI1LDcgQEAKIAkJCW1lbXNldCgmaW5pdF9oY2EsIDAsIHNpemVvZihpbml0X2hjYSkpOwogCQkJZXJyID0gbWx4NF9RVUVSWV9IQ0EoZGV2LCAmaW5pdF9oY2EpOwogCQkJaWYgKGVycikgewotCQkJCW1seDRfZXJyKGRldiwgIlFVRVJZX0hDQSBjb21tYW5kIGZhaWxlZCwgZGlzYWJsZSB0aW1lc3RhbXAuXG4iKTsKKwkJCQltbHg0X2VycihkZXYsICJRVUVSWV9IQ0EgY29tbWFuZCBmYWlsZWQsIGRpc2FibGUgdGltZXN0YW1wXG4iKTsKIAkJCQlkZXYtPmNhcHMuZmxhZ3MyICY9IH5NTFg0X0RFVl9DQVBfRkxBRzJfVFM7CiAJCQl9IGVsc2UgewogCQkJCWRldi0+Y2Fwcy5oY2FfY29yZV9jbG9jayA9CkBAIC0xNjU2LDE0ICsxNjM4LDE0IEBACiAJCQlpZiAoIWRldi0+Y2Fwcy5oY2FfY29yZV9jbG9jaykgewogCQkJCWRldi0+Y2Fwcy5mbGFnczIgJj0gfk1MWDRfREVWX0NBUF9GTEFHMl9UUzsKIAkJCQltbHg0X2VycihkZXYsCi0JCQkJCSAiSENBIGZyZXF1ZW5jeSBpcyAwLiBUaW1lc3RhbXBpbmcgaXMgbm90IHN1cHBvcnRlZC4iKTsKKwkJCQkJICJIQ0EgZnJlcXVlbmN5IGlzIDAgLSB0aW1lc3RhbXBpbmcgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCQl9IGVsc2UgaWYgKG1hcF9pbnRlcm5hbF9jbG9jayhkZXYpKSB7CiAJCQkJLyoKIAkJCQkgKiBNYXAgaW50ZXJuYWwgY2xvY2ssCiAJCQkJICogaW4gY2FzZSBvZiBmYWlsdXJlIGRpc2FibGUgdGltZXN0YW1waW5nCiAJCQkJICovCiAJCQkJZGV2LT5jYXBzLmZsYWdzMiAmPSB+TUxYNF9ERVZfQ0FQX0ZMQUcyX1RTOwotCQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgaW50ZXJuYWwgY2xvY2suIFRpbWVzdGFtcGluZyBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBpbnRlcm5hbCBjbG9jay4gVGltZXN0YW1waW5nIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKQEAgLTE2OTAsNyArMTY3Miw3IEBACiAKIAllcnIgPSBtbHg0X1FVRVJZX0FEQVBURVIoZGV2LCAmYWRhcHRlcik7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJRVUVSWV9BREFQVEVSIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJRVUVSWV9BREFQVEVSIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gdW5tYXBfYmY7CiAJfQogCkBAIC0xODA4LDc5ICsxNzkwLDY5IEBACiAKIAllcnIgPSBtbHg0X2luaXRfdWFyX3RhYmxlKGRldik7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgInVzZXIgYWNjZXNzIHJlZ2lvbiB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgdXNlciBhY2Nlc3MgcmVnaW9uIHRhYmxlLCBhYm9ydGluZ1xuIik7CisJCSByZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IG1seDRfdWFyX2FsbG9jKGRldiwgJnByaXYtPmRyaXZlcl91YXIpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRyaXZlciBhY2Nlc3MgcmVnaW9uLCAiCi0JCQkgImFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgYWNjZXNzIHJlZ2lvbiwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl91YXJfdGFibGVfZnJlZTsKIAl9CiAKIAlwcml2LT5rYXIgPSBpb3JlbWFwKChwaHlzX2FkZHJfdCkgcHJpdi0+ZHJpdmVyX3Vhci5wZm4gPDwgUEFHRV9TSElGVCwgUEFHRV9TSVpFKTsKIAlpZiAoIXByaXYtPmthcikgewotCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAga2VybmVsIGFjY2VzcyByZWdpb24sICIKLQkJCSAiYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIGtlcm5lbCBhY2Nlc3MgcmVnaW9uLCBhYm9ydGluZ1xuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3Vhcl9mcmVlOwogCX0KIAogCWVyciA9IG1seDRfaW5pdF9wZF90YWJsZShkZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgIgotCQkJICJwcm90ZWN0aW9uIGRvbWFpbiB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvdGVjdGlvbiBkb21haW4gdGFibGUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfa2FyX3VubWFwOwogCX0KIAogCWVyciA9IG1seDRfaW5pdF94cmNkX3RhYmxlKGRldik7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgInJlbGlhYmxlIGNvbm5lY3Rpb24gZG9tYWluIHRhYmxlLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWxpYWJsZSBjb25uZWN0aW9uIGRvbWFpbiB0YWJsZSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9wZF90YWJsZV9mcmVlOwogCX0KIAogCWVyciA9IG1seDRfaW5pdF9tcl90YWJsZShkZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgIgotCQkJICJtZW1vcnkgcmVnaW9uIHRhYmxlLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtZW1vcnkgcmVnaW9uIHRhYmxlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX3hyY2RfdGFibGVfZnJlZTsKIAl9CiAKIAlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkgewogCQllcnIgPSBtbHg0X2luaXRfbWNnX3RhYmxlKGRldik7CiAJCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIG11bHRpY2FzdCBncm91cCB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIG11bHRpY2FzdCBncm91cCB0YWJsZSwgYWJvcnRpbmdcbiIpOwogCQkJZ290byBlcnJfbXJfdGFibGVfZnJlZTsKIAkJfQogCX0KIAogCWVyciA9IG1seDRfaW5pdF9lcV90YWJsZShkZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgIgotCQkJICJldmVudCBxdWV1ZSB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZXZlbnQgcXVldWUgdGFibGUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfbWNnX3RhYmxlX2ZyZWU7CiAJfQogCiAJZXJyID0gbWx4NF9jbWRfdXNlX2V2ZW50cyhkZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHN3aXRjaCB0byBldmVudC1kcml2ZW4gIgotCQkJICJmaXJtd2FyZSBjb21tYW5kcywgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHN3aXRjaCB0byBldmVudC1kcml2ZW4gZmlybXdhcmUgY29tbWFuZHMsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfZXFfdGFibGVfZnJlZTsKIAl9CiAKIAllcnIgPSBtbHg0X05PUChkZXYpOwogCWlmIChlcnIpIHsKIAkJaWYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfTVNJX1gpIHsKLQkJCW1seDRfd2FybihkZXYsICJOT1AgY29tbWFuZCBmYWlsZWQgdG8gZ2VuZXJhdGUgTVNJLVggIgotCQkJCSAgImludGVycnVwdCBJUlEgJWQpLlxuIiwKKwkJCW1seDRfd2FybihkZXYsICJOT1AgY29tbWFuZCBmYWlsZWQgdG8gZ2VuZXJhdGUgTVNJLVggaW50ZXJydXB0IElSUSAlZClcbiIsCiAJCQkJICBwcml2LT5lcV90YWJsZS5lcVtkZXYtPmNhcHMubnVtX2NvbXBfdmVjdG9yc10uaXJxKTsKLQkJCW1seDRfd2FybihkZXYsICJUcnlpbmcgYWdhaW4gd2l0aG91dCBNU0ktWC5cbiIpOworCQkJbWx4NF93YXJuKGRldiwgIlRyeWluZyBhZ2FpbiB3aXRob3V0IE1TSS1YXG4iKTsKIAkJfSBlbHNlIHsKLQkJCW1seDRfZXJyKGRldiwgIk5PUCBjb21tYW5kIGZhaWxlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQgIgotCQkJCSAiKElSUSAlZCksIGFib3J0aW5nLlxuIiwKKwkJCW1seDRfZXJyKGRldiwgIk5PUCBjb21tYW5kIGZhaWxlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQgKElSUSAlZCksIGFib3J0aW5nXG4iLAogCQkJCSBwcml2LT5lcV90YWJsZS5lcVtkZXYtPmNhcHMubnVtX2NvbXBfdmVjdG9yc10uaXJxKTsKIAkJCW1seDRfZXJyKGRldiwgIkJJT1Mgb3IgQUNQSSBpbnRlcnJ1cHQgcm91dGluZyBwcm9ibGVtP1xuIik7CiAJCX0KQEAgLTE4OTIsMjggKzE4NjQsMjUgQEAKIAogCWVyciA9IG1seDRfaW5pdF9jcV90YWJsZShkZXYpOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgIgotCQkJICJjb21wbGV0aW9uIHF1ZXVlIHRhYmxlLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wbGV0aW9uIHF1ZXVlIHRhYmxlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2NtZF9wb2xsOwogCX0KIAogCWVyciA9IG1seDRfaW5pdF9zcnFfdGFibGUoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplICIKLQkJCSAic2hhcmVkIHJlY2VpdmUgcXVldWUgdGFibGUsIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHNoYXJlZCByZWNlaXZlIHF1ZXVlIHRhYmxlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2NxX3RhYmxlX2ZyZWU7CiAJfQogCiAJZXJyID0gbWx4NF9pbml0X3FwX3RhYmxlKGRldik7CiAJaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgInF1ZXVlIHBhaXIgdGFibGUsIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHF1ZXVlIHBhaXIgdGFibGUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfc3JxX3RhYmxlX2ZyZWU7CiAJfQogCiAJZXJyID0gbWx4NF9pbml0X2NvdW50ZXJzX3RhYmxlKGRldik7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0VOVCkgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb3VudGVycyB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgY291bnRlcnMgdGFibGUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfcXBfdGFibGVfZnJlZTsKIAl9CiAKQEAgLTE5MjMsOSArMTg5Miw4IEBACiAJCQllcnIgPSBtbHg0X2dldF9wb3J0X2liX2NhcHMoZGV2LCBwb3J0LAogCQkJCQkJICAgICZpYl9wb3J0X2RlZmF1bHRfY2Fwcyk7CiAJCQlpZiAoZXJyKQotCQkJCW1seDRfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvcnQgJWQgZGVmYXVsdCAiCi0JCQkJCSAgImliIGNhcGFiaWxpdGllcyAoJWQpLiBDb250aW51aW5nICIKLQkJCQkJICAid2l0aCBjYXBzID0gMFxuIiwgcG9ydCwgZXJyKTsKKwkJCQltbHg0X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGdldCBwb3J0ICVkIGRlZmF1bHQgaWIgY2FwYWJpbGl0aWVzICglZCkuIENvbnRpbnVpbmcgd2l0aCBjYXBzID0gMFxuIiwKKwkJCQkJICBwb3J0LCBlcnIpOwogCQkJZGV2LT5jYXBzLmliX3BvcnRfZGVmX2NhcFtwb3J0XSA9IGliX3BvcnRfZGVmYXVsdF9jYXBzOwogCiAJCQkvKiBpbml0aWFsaXplIHBlci1zbGF2ZSBkZWZhdWx0IGliIHBvcnQgY2FwYWJpbGl0aWVzICovCkBAIC0xOTM1LDcgKzE5MDMsNyBAQAogCQkJCQlpZiAoaSA9PSBtbHg0X21hc3Rlcl9mdW5jX251bShkZXYpKQogCQkJCQkJY29udGludWU7CiAJCQkJCXByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtpXS5pYl9jYXBfbWFza1twb3J0XSA9Ci0JCQkJCQkJaWJfcG9ydF9kZWZhdWx0X2NhcHM7CisJCQkJCQlpYl9wb3J0X2RlZmF1bHRfY2FwczsKIAkJCQl9CiAJCQl9CiAKQEAgLTE5NDgsNyArMTkxNiw3IEBACiAJCQkJCSAgICBkZXYtPmNhcHMucGtleV90YWJsZV9sZW5bcG9ydF0gOiAtMSk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBwb3J0ICVkLCBhYm9ydGluZ1xuIiwKLQkJCQkJcG9ydCk7CisJCQkJCSBwb3J0KTsKIAkJCQlnb3RvIGVycl9jb3VudGVyc190YWJsZV9mcmVlOwogCQkJfQogCQl9CkBAIC0yMDI0LDcgKzE5OTIsNyBAQAogCQkJa2ZyZWUoZW50cmllcyk7CiAJCQlnb3RvIG5vX21zaTsKIAkJfSBlbHNlIGlmIChucmVxIDwgTVNJWF9MRUdBQ1lfU1ogKwotCQkJCSAgZGV2LT5jYXBzLm51bV9wb3J0cyAqIE1JTl9NU0lYX1BfUE9SVCkgeworCQkJICAgZGV2LT5jYXBzLm51bV9wb3J0cyAqIE1JTl9NU0lYX1BfUE9SVCkgewogCQkJLypXb3JraW5nIGluIGxlZ2FjeSBtb2RlICwgYWxsIEVRJ3Mgc2hhcmVkKi8KIAkJCWRldi0+Y2Fwcy5jb21wX3Bvb2wgICAgICAgICAgID0gMDsKIAkJCWRldi0+Y2Fwcy5udW1fY29tcF92ZWN0b3JzID0gbnJlcSAtIDE7CkBAIC0yMjI1LDggKzIxOTMsNyBAQAogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UsICIKLQkJCSJhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTIyNzMsMTQgKzIyNDAsMTMgQEAKIAkgKi8KIAlpZiAoIShwY2lfZGV2X2RhdGEgJiBNTFg0X1BDSV9ERVZfSVNfVkYpICYmCiAJICAgICEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgRENTLCBhYm9ydGluZy4iCi0JCQkiKGRyaXZlcl9kYXRhOiAweCV4LCBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCk6MHglbHgpXG4iLAorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIERDUywgYWJvcnRpbmcgKGRyaXZlcl9kYXRhOiAweCV4LCBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCk6MHglbHgpXG4iLAogCQkJcGNpX2Rldl9kYXRhLCBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CiAJfQogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIFVBUiwgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBVQVIsIGFib3J0aW5nXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfZGlzYWJsZV9wZGV2OwogCX0KQEAgLTIyOTUsMjEgKzIyNjEsMTkgQEAKIAogCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJaWYgKGVycikgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiV2FybmluZzogY291bGRuJ3Qgc2V0IDY0LWJpdCBQQ0kgRE1BIG1hc2suXG4iKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIldhcm5pbmc6IGNvdWxkbid0IHNldCA2NC1iaXQgUENJIERNQSBtYXNrXG4iKTsKIAkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3Qgc2V0IFBDSSBETUEgbWFzaywgYWJvcnRpbmcuXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHNldCBQQ0kgRE1BIG1hc2ssIGFib3J0aW5nXG4iKTsKIAkJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uczsKIAkJfQogCX0KIAllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJaWYgKGVycikgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiV2FybmluZzogY291bGRuJ3Qgc2V0IDY0LWJpdCAiCi0JCQkgImNvbnNpc3RlbnQgUENJIERNQSBtYXNrLlxuIik7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJXYXJuaW5nOiBjb3VsZG4ndCBzZXQgNjQtYml0IGNvbnNpc3RlbnQgUENJIERNQSBtYXNrXG4iKTsKIAkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBzZXQgY29uc2lzdGVudCBQQ0kgRE1BIG1hc2ssICIKLQkJCQkiYWJvcnRpbmcuXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHNldCBjb25zaXN0ZW50IFBDSSBETUEgbWFzaywgYWJvcnRpbmdcbiIpOwogCQkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOwogCQl9CiAJfQpAQCAtMjM0MCw3ICsyMzA0LDcgQEAKIAkJaWYgKHRvdGFsX3ZmcykgewogCQkJdW5zaWduZWQgdmZzX29mZnNldCA9IDA7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG52ZnMpL3NpemVvZihudmZzWzBdKSAmJgotCQkJICAgICB2ZnNfb2Zmc2V0ICsgbnZmc1tpXSA8IGV4dGVuZGVkX2Z1bmNfbnVtKHBkZXYpOworCQkJCSAgICAgdmZzX29mZnNldCArIG52ZnNbaV0gPCBleHRlbmRlZF9mdW5jX251bShwZGV2KTsKIAkJCSAgICAgdmZzX29mZnNldCArPSBudmZzW2ldLCBpKyspCiAJCQkJOwogCQkJaWYgKGkgPT0gc2l6ZW9mKG52ZnMpL3NpemVvZihudmZzWzBdKSkgewpAQCAtMjM2Niw4ICsyMzMwLDcgQEAKIAkJCWlmIChlcnIgPCAwKQogCQkJCWdvdG8gZXJyX2ZyZWVfZGV2OwogCQkJZWxzZSB7Ci0JCQkJbWx4NF93YXJuKGRldiwgIk11bHRpcGxlIFBGcyBub3QgeWV0IHN1cHBvcnRlZC4iCi0JCQkJCSAgIiBTa2lwcGluZyBQRi5cbiIpOworCQkJCW1seDRfd2FybihkZXYsICJNdWx0aXBsZSBQRnMgbm90IHlldCBzdXBwb3J0ZWQgLSBTa2lwcGluZyBQRlxuIik7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIGVycl9mcmVlX2RldjsKIAkJCX0KQEAgLTIzNzcsOCArMjM0MCw4IEBACiAJCQltbHg0X3dhcm4oZGV2LCAiRW5hYmxpbmcgU1ItSU9WIHdpdGggJWQgVkZzXG4iLAogCQkJCSAgdG90YWxfdmZzKTsKIAkJCWRldi0+ZGV2X3ZmcyA9IGt6YWxsb2MoCi0JCQkJCXRvdGFsX3ZmcyAqIHNpemVvZigqZGV2LT5kZXZfdmZzKSwKLQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJdG90YWxfdmZzICogc2l6ZW9mKCpkZXYtPmRldl92ZnMpLAorCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKE5VTEwgPT0gZGV2LT5kZXZfdmZzKSB7CiAJCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVkZzXG4iKTsKIAkJCQllcnIgPSAwOwpAQCAtMjM4NiwxNCArMjM0OSwxNCBAQAogCQkJCWF0b21pY19pbmMoJnBmX2xvYWRpbmcpOwogCQkJCWVyciA9IHBjaV9lbmFibGVfc3Jpb3YocGRldiwgdG90YWxfdmZzKTsKIAkJCQlpZiAoZXJyKSB7Ci0JCQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgU1ItSU9WLCBjb250aW51aW5nIHdpdGhvdXQgU1ItSU9WIChlcnIgPSAlZCkuXG4iLAorCQkJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFNSLUlPViwgY29udGludWluZyB3aXRob3V0IFNSLUlPViAoZXJyID0gJWQpXG4iLAogCQkJCQkJIGVycik7CiAJCQkJCWF0b21pY19kZWMoJnBmX2xvYWRpbmcpOwogCQkJCQllcnIgPSAwOwogCQkJCX0gZWxzZSB7CiAJCQkJCW1seDRfd2FybihkZXYsICJSdW5uaW5nIGluIG1hc3RlciBtb2RlXG4iKTsKIAkJCQkJZGV2LT5mbGFncyB8PSBNTFg0X0ZMQUdfU1JJT1YgfAotCQkJCQkJICAgICAgTUxYNF9GTEFHX01BU1RFUjsKKwkJCQkJCU1MWDRfRkxBR19NQVNURVI7CiAJCQkJCWRldi0+bnVtX3ZmcyA9IHRvdGFsX3ZmczsKIAkJCQkJc3Jpb3ZfaW5pdGlhbGl6ZWQgPSAxOwogCQkJCX0KQEAgLTI0MTAsNyArMjM3Myw3IEBACiAJCSAqLwogCQllcnIgPSBtbHg0X3Jlc2V0KGRldik7CiAJCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byByZXNldCBIQ0EsIGFib3J0aW5nLlxuIik7CisJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gcmVzZXQgSENBLCBhYm9ydGluZ1xuIik7CiAJCQlnb3RvIGVycl9yZWxfb3duOwogCQl9CiAJfQpAQCAtMjQxOCw3ICsyMzgxLDcgQEAKIHNsYXZlX3N0YXJ0OgogCWVyciA9IG1seDRfY21kX2luaXQoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0IGNvbW1hbmQgaW50ZXJmYWNlLCBhYm9ydGluZy5cbiIpOworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdCBjb21tYW5kIGludGVyZmFjZSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9zcmlvdjsKIAl9CiAKQEAgLTI0MzIsOCArMjM5NSw3IEBACiAJCQlkZXYtPm51bV9zbGF2ZXMgPSAwOwogCQkJZXJyID0gbWx4NF9tdWx0aV9mdW5jX2luaXQoZGV2KTsKIAkJCWlmIChlcnIpIHsKLQkJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdCBzbGF2ZSBtZnVuYyIKLQkJCQkJICIgaW50ZXJmYWNlLCBhYm9ydGluZy5cbiIpOworCQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0IHNsYXZlIG1mdW5jIGludGVyZmFjZSwgYWJvcnRpbmdcbiIpOwogCQkJCWdvdG8gZXJyX2NtZDsKIAkJCX0KIAkJfQpAQCAtMjQ2NSw4ICsyNDI3LDcgQEAKIAkJdW5zaWduZWQgc3VtID0gMDsKIAkJZXJyID0gbWx4NF9tdWx0aV9mdW5jX2luaXQoZGV2KTsKIAkJaWYgKGVycikgewotCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXQgbWFzdGVyIG1mdW5jIgotCQkJCSAiaW50ZXJmYWNlLCBhYm9ydGluZy5cbiIpOworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXQgbWFzdGVyIG1mdW5jIGludGVyZmFjZSwgYWJvcnRpbmdcbiIpOwogCQkJZ290byBlcnJfY2xvc2U7CiAJCX0KIAkJaWYgKHNyaW92X2luaXRpYWxpemVkKSB7CkBAIC0yNDc3LDEwICsyNDM4LDcgQEAKIAkJCWlmIChpYl9wb3J0cyAmJgogCQkJICAgIChudW1fdmZzX2FyZ2MgPiAxIHx8IHByb2JlX3Zmc19hcmdjID4gMSkpIHsKIAkJCQltbHg0X2VycihkZXYsCi0JCQkJCSAiSW52YWxpZCBzeW50YXggb2YgbnVtX3Zmcy9wcm9iZV92ZnMgIgotCQkJCQkgIndpdGggSUIgcG9ydC4gU2luZ2xlIHBvcnQgVkZzIHN5bnRheCIKLQkJCQkJICIgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBhbGwgcG9ydHMgIgotCQkJCQkgImFyZSBjb25maWd1cmVkIGFzIGV0aGVybmV0XG4iKTsKKwkJCQkJICJJbnZhbGlkIHN5bnRheCBvZiBudW1fdmZzL3Byb2JlX3ZmcyB3aXRoIElCIHBvcnQgLSBzaW5nbGUgcG9ydCBWRnMgc3ludGF4IGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gYWxsIHBvcnRzIGFyZSBjb25maWd1cmVkIGFzIGV0aGVybmV0XG4iKTsKIAkJCQlnb3RvIGVycl9jbG9zZTsKIAkJCX0KIAkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobnZmcykvc2l6ZW9mKG52ZnNbMF0pOyBpKyspIHsKQEAgLTI1MDYsOCArMjQ2NCw3IEBACiAJaWYgKChtbHg0X2lzX21mdW5jKGRldikpICYmCiAJICAgICEoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19NU0lfWCkpIHsKIAkJZXJyID0gLUVOT1NZUzsKLQkJbWx4NF9lcnIoZGV2LCAiSU5UeCBpcyBub3Qgc3VwcG9ydGVkIGluIG11bHRpLWZ1bmN0aW9uIG1vZGUuIgotCQkJICIgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiSU5UeCBpcyBub3Qgc3VwcG9ydGVkIGluIG11bHRpLWZ1bmN0aW9uIG1vZGUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfZnJlZV9lcTsKIAl9CiAKQEAgLTI2NjAsNyArMjYxNyw3IEBACiAJLyogaW4gU1JJT1YgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5sb2FkIHRoZSBwZidzCiAJICogZHJpdmVyIHdoaWxlIHRoZXJlIGFyZSBhbGl2ZSB2ZidzICovCiAJaWYgKG1seDRfaXNfbWFzdGVyKGRldikgJiYgbWx4NF9ob3dfbWFueV9saXZlc192ZihkZXYpKQotCQlwcmludGsoS0VSTl9FUlIgIlJlbW92aW5nIFBGIHdoZW4gdGhlcmUgYXJlIGFzc2lnbmVkIFZGJ3MgISEhXG4iKTsKKwkJcHJfd2FybigiUmVtb3ZpbmcgUEYgd2hlbiB0aGVyZSBhcmUgYXNzaWduZWQgVkYncyAhISFcbiIpOwogCW1seDRfc3RvcF9zZW5zZShkZXYpOwogCW1seDRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKIApAQCAtMjgyNCw3ICsyNzgxLDcgQEAKIAkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBtbHg0X3BjaV90YWJsZSwKIAkucHJvYmUJCT0gbWx4NF9pbml0X29uZSwKLQkuc2h1dGRvd24JPSBtbHg0X3JlbW92ZV9vbmUsCisJLnNodXRkb3duCT0gX19tbHg0X3JlbW92ZV9vbmUsCiAJLnJlbW92ZQkJPSBtbHg0X3JlbW92ZV9vbmUsCiAJLmVycl9oYW5kbGVyICAgID0gJm1seDRfZXJyX2hhbmRsZXIsCiB9OwpAQCAtMjgzMiwzMyArMjc4OSwzNiBAQAogc3RhdGljIGludCBfX2luaXQgbWx4NF92ZXJpZnlfcGFyYW1zKHZvaWQpCiB7CiAJaWYgKChsb2dfbnVtX21hYyA8IDApIHx8IChsb2dfbnVtX21hYyA+IDcpKSB7Ci0JCXByX3dhcm5pbmcoIm1seDRfY29yZTogYmFkIG51bV9tYWM6ICVkXG4iLCBsb2dfbnVtX21hYyk7CisJCXByX3dhcm4oIm1seDRfY29yZTogYmFkIG51bV9tYWM6ICVkXG4iLCBsb2dfbnVtX21hYyk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAobG9nX251bV92bGFuICE9IDApCi0JCXByX3dhcm5pbmcoIm1seDRfY29yZTogbG9nX251bV92bGFuIC0gb2Jzb2xldGUgbW9kdWxlIHBhcmFtLCB1c2luZyAlZFxuIiwKLQkJCSAgIE1MWDRfTE9HX05VTV9WTEFOUyk7CisJCXByX3dhcm4oIm1seDRfY29yZTogbG9nX251bV92bGFuIC0gb2Jzb2xldGUgbW9kdWxlIHBhcmFtLCB1c2luZyAlZFxuIiwKKwkJCU1MWDRfTE9HX05VTV9WTEFOUyk7CisKKwlpZiAodXNlX3ByaW8gIT0gMCkKKwkJcHJfd2FybigibWx4NF9jb3JlOiB1c2VfcHJpbyAtIG9ic29sZXRlIG1vZHVsZSBwYXJhbSwgaWdub3JlZFxuIik7CiAKIAlpZiAoKGxvZ19tdHRzX3Blcl9zZWcgPCAxKSB8fCAobG9nX210dHNfcGVyX3NlZyA+IDcpKSB7Ci0JCXByX3dhcm5pbmcoIm1seDRfY29yZTogYmFkIGxvZ19tdHRzX3Blcl9zZWc6ICVkXG4iLCBsb2dfbXR0c19wZXJfc2VnKTsKKwkJcHJfd2FybigibWx4NF9jb3JlOiBiYWQgbG9nX210dHNfcGVyX3NlZzogJWRcbiIsCisJCQlsb2dfbXR0c19wZXJfc2VnKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENoZWNrIGlmIG1vZHVsZSBwYXJhbSBmb3IgcG9ydHMgdHlwZSBoYXMgbGVnYWwgY29tYmluYXRpb24gKi8KIAlpZiAocG9ydF90eXBlX2FycmF5WzBdID09IGZhbHNlICYmIHBvcnRfdHlwZV9hcnJheVsxXSA9PSB0cnVlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1vZHVsZSBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBFVEgvSUIgaXMgbm90IHN1cHBvcnRlZC4gU3dpdGNoaW5nIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBJQi9JQlxuIik7CisJCXByX3dhcm4oIk1vZHVsZSBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBFVEgvSUIgaXMgbm90IHN1cHBvcnRlZC4gU3dpdGNoaW5nIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBJQi9JQlxuIik7CiAJCXBvcnRfdHlwZV9hcnJheVswXSA9IHRydWU7CiAJfQogCiAJaWYgKG1seDRfbG9nX251bV9tZ21fZW50cnlfc2l6ZSAhPSAtMSAmJgogCSAgICAobWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplIDwgTUxYNF9NSU5fTUdNX0xPR19FTlRSWV9TSVpFIHx8CiAJICAgICBtbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUgPiBNTFg0X01BWF9NR01fTE9HX0VOVFJZX1NJWkUpKSB7Ci0JCXByX3dhcm5pbmcoIm1seDRfY29yZTogbWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplICglZCkgbm90ICIKLQkJCSAgICJpbiBsZWdhbCByYW5nZSAoLTEgb3IgJWQuLiVkKVxuIiwKLQkJCSAgIG1seDRfbG9nX251bV9tZ21fZW50cnlfc2l6ZSwKLQkJCSAgIE1MWDRfTUlOX01HTV9MT0dfRU5UUllfU0laRSwKLQkJCSAgIE1MWDRfTUFYX01HTV9MT0dfRU5UUllfU0laRSk7CisJCXByX3dhcm4oIm1seDRfY29yZTogbWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplICglZCkgbm90IGluIGxlZ2FsIHJhbmdlICgtMSBvciAlZC4uJWQpXG4iLAorCQkJbWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplLAorCQkJTUxYNF9NSU5fTUdNX0xPR19FTlRSWV9TSVpFLAorCQkJTUxYNF9NQVhfTUdNX0xPR19FTlRSWV9TSVpFKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWNnLmMKaW5kZXggODBjY2I0ZS4uNGMzNmRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21jZy5jCkBAIC02MzgsNyArNjM4LDcgQEAKIAogCQlpZiAoIShiZTMyX3RvX2NwdShtZ20tPm1lbWJlcnNfY291bnQpICYgMHhmZmZmZmYpKSB7CiAJCQlpZiAoKmluZGV4ICE9IGhhc2gpIHsKLQkJCQltbHg0X2VycihkZXYsICJGb3VuZCB6ZXJvIE1HSUQgaW4gQU1HTS5cbiIpOworCQkJCW1seDRfZXJyKGRldiwgIkZvdW5kIHplcm8gTUdJRCBpbiBBTUdNXG4iKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJfQogCQkJcmV0dXJuIGVycjsKQEAgLTg3NCw3ICs4NzQsNyBAQAogCW1seDRfZXJyKGRldiwgIiVzIiwgYnVmKTsKIAogCWlmIChsZW4gPj0gQlVGX1NJWkUpCi0JCW1seDRfZXJyKGRldiwgIk5ldHdvcmsgcnVsZSBlcnJvciBtZXNzYWdlIHdhcyB0cnVuY2F0ZWQsIHByaW50IGJ1ZmZlciBpcyB0b28gc21hbGwuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiTmV0d29yayBydWxlIGVycm9yIG1lc3NhZ2Ugd2FzIHRydW5jYXRlZCwgcHJpbnQgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CiB9CiAKIGludCBtbHg0X2Zsb3dfYXR0YWNoKHN0cnVjdCBtbHg0X2RldiAqZGV2LApAQCAtODk3LDcgKzg5Nyw3IEBACiAJCXJldCA9IHBhcnNlX3RyYW5zX3J1bGUoZGV2LCBjdXIsIG1haWxib3gtPmJ1ZiArIHNpemUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAkJc2l6ZSArPSByZXQ7CiAJfQpAQCAtOTA1LDEwICs5MDUsMTAgQEAKIAlyZXQgPSBtbHg0X1FQX0ZMT1dfU1RFRVJJTkdfQVRUQUNIKGRldiwgbWFpbGJveCwgc2l6ZSA+PiAyLCByZWdfaWQpOwogCWlmIChyZXQgPT0gLUVOT01FTSkKIAkJbWx4NF9lcnJfcnVsZShkZXYsCi0JCQkgICAgICAibWNnIHRhYmxlIGlzIGZ1bGwuIEZhaWwgdG8gcmVnaXN0ZXIgbmV0d29yayBydWxlLlxuIiwKKwkJCSAgICAgICJtY2cgdGFibGUgaXMgZnVsbC4gRmFpbCB0byByZWdpc3RlciBuZXR3b3JrIHJ1bGVcbiIsCiAJCQkgICAgICBydWxlKTsKIAllbHNlIGlmIChyZXQpCi0JCW1seDRfZXJyX3J1bGUoZGV2LCAiRmFpbCB0byByZWdpc3RlciBuZXR3b3JrIHJ1bGUuXG4iLCBydWxlKTsKKwkJbWx4NF9lcnJfcnVsZShkZXYsICJGYWlsIHRvIHJlZ2lzdGVyIG5ldHdvcmsgcnVsZVxuIiwgcnVsZSk7CiAKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIApAQCAtOTk0LDcgKzk5NCw3IEBACiAKIAltZW1iZXJzX2NvdW50ID0gYmUzMl90b19jcHUobWdtLT5tZW1iZXJzX2NvdW50KSAmIDB4ZmZmZmZmOwogCWlmIChtZW1iZXJzX2NvdW50ID09IGRldi0+Y2Fwcy5udW1fcXBfcGVyX21nbSkgewotCQltbHg0X2VycihkZXYsICJNR00gYXQgaW5kZXggJXggaXMgZnVsbC5cbiIsIGluZGV4KTsKKwkJbWx4NF9lcnIoZGV2LCAiTUdNIGF0IGluZGV4ICV4IGlzIGZ1bGxcbiIsIGluZGV4KTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA0Miw3ICsxMDQyLDcgQEAKIAl9CiAJaWYgKGVyciAmJiBsaW5rICYmIGluZGV4ICE9IC0xKSB7CiAJCWlmIChpbmRleCA8IGRldi0+Y2Fwcy5udW1fbWdtcykKLQkJCW1seDRfd2FybihkZXYsICJHb3QgQU1HTSBpbmRleCAlZCA8ICVkIiwKKwkJCW1seDRfd2FybihkZXYsICJHb3QgQU1HTSBpbmRleCAlZCA8ICVkXG4iLAogCQkJCSAgaW5kZXgsIGRldi0+Y2Fwcy5udW1fbWdtcyk7CiAJCWVsc2UKIAkJCW1seDRfYml0bWFwX2ZyZWUoJnByaXYtPm1jZ190YWJsZS5iaXRtYXAsCkBAIC0xMTMzLDcgKzExMzMsNyBAQAogCiAJCWlmIChhbWdtX2luZGV4KSB7CiAJCQlpZiAoYW1nbV9pbmRleCA8IGRldi0+Y2Fwcy5udW1fbWdtcykKLQkJCQltbHg0X3dhcm4oZGV2LCAiTUdNIGVudHJ5ICVkIGhhZCBBTUdNIGluZGV4ICVkIDwgJWQiLAorCQkJCW1seDRfd2FybihkZXYsICJNR00gZW50cnkgJWQgaGFkIEFNR00gaW5kZXggJWQgPCAlZFxuIiwKIAkJCQkJICBpbmRleCwgYW1nbV9pbmRleCwgZGV2LT5jYXBzLm51bV9tZ21zKTsKIAkJCWVsc2UKIAkJCQltbHg0X2JpdG1hcF9mcmVlKCZwcml2LT5tY2dfdGFibGUuYml0bWFwLApAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWlmIChpbmRleCA8IGRldi0+Y2Fwcy5udW1fbWdtcykKLQkJCW1seDRfd2FybihkZXYsICJlbnRyeSAlZCBoYWQgbmV4dCBBTUdNIGluZGV4ICVkIDwgJWQiLAorCQkJbWx4NF93YXJuKGRldiwgImVudHJ5ICVkIGhhZCBuZXh0IEFNR00gaW5kZXggJWQgPCAlZFxuIiwKIAkJCQkgIHByZXYsIGluZGV4LCBkZXYtPmNhcHMubnVtX21nbXMpOwogCQllbHNlCiAJCQltbHg0X2JpdG1hcF9mcmVlKCZwcml2LT5tY2dfdGFibGUuYml0bWFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaAppbmRleCA3YTA2NjViLi4xZDhhZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaApAQCAtMjIxLDE4ICsyMjEsMTkgQEAKICNkZWZpbmUgbWx4NF9kZWJ1Z19sZXZlbAkoMCkKICNlbmRpZiAvKiBDT05GSUdfTUxYNF9ERUJVRyAqLwogCi0jZGVmaW5lIG1seDRfZGJnKG1kZXYsIGZvcm1hdCwgYXJnLi4uKQkJCQkJXAorI2RlZmluZSBtbHg0X2RiZyhtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKG1seDRfZGVidWdfbGV2ZWwpCQkJCQkJXAotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpOyBcCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJihtZGV2KS0+cGRldi0+ZGV2LCBmb3JtYXQsCVwKKwkJCSAgICMjX19WQV9BUkdTX18pOwkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIG1seDRfZXJyKG1kZXYsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZGV2X2VycigmbWRldi0+cGRldi0+ZGV2LCBmb3JtYXQsICMjYXJnKQotI2RlZmluZSBtbHg0X2luZm8obWRldiwgZm9ybWF0LCBhcmcuLi4pIFwKLQlkZXZfaW5mbygmbWRldi0+cGRldi0+ZGV2LCBmb3JtYXQsICMjYXJnKQotI2RlZmluZSBtbHg0X3dhcm4obWRldiwgZm9ybWF0LCBhcmcuLi4pIFwKLQlkZXZfd2FybigmbWRldi0+cGRldi0+ZGV2LCBmb3JtYXQsICMjYXJnKQorI2RlZmluZSBtbHg0X2VycihtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlkZXZfZXJyKCYobWRldiktPnBkZXYtPmRldiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBtbHg0X2luZm8obWRldiwgZm9ybWF0LCAuLi4pCQkJCQlcCisJZGV2X2luZm8oJihtZGV2KS0+cGRldi0+ZGV2LCBmb3JtYXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIG1seDRfd2FybihtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlkZXZfd2FybigmKG1kZXYpLT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNfX1ZBX0FSR1NfXykKIAogZXh0ZXJuIGludCBtbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemU7CiBleHRlcm4gaW50IGxvZ19tdHRzX3Blcl9zZWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCmluZGV4IDA0ZDliNmZlLi4wZTE1Mjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaApAQCAtMzEzLDYgKzMxMyw3IEBACiAJdW5zaWduZWQgbG9uZyBjc3VtX29rOwogCXVuc2lnbmVkIGxvbmcgY3N1bV9ub25lOwogCWludCBod3RzdGFtcF9yeF9maWx0ZXI7CisJY3B1bWFza192YXJfdCBhZmZpbml0eV9tYXNrOwogfTsKIAogc3RydWN0IG1seDRfZW5fY3EgewpAQCAtODMwLDI2ICs4MzEsMjYgQEAKIGludCBlbl9wcmludChjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiwKIAkgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAotI2RlZmluZSBlbl9kYmcobWxldmVsLCBwcml2LCBmb3JtYXQsIGFyZy4uLikJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKE5FVElGX01TR18jI21sZXZlbCAmIHByaXYtPm1zZ19lbmFibGUpCQlcCi0JCWVuX3ByaW50KEtFUk5fREVCVUcsIHByaXYsIGZvcm1hdCwgIyNhcmcpOwlcCisjZGVmaW5lIGVuX2RiZyhtbGV2ZWwsIHByaXYsIGZvcm1hdCwgLi4uKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChORVRJRl9NU0dfIyNtbGV2ZWwgJiAocHJpdiktPm1zZ19lbmFibGUpCQkJXAorCQllbl9wcmludChLRVJOX0RFQlVHLCBwcml2LCBmb3JtYXQsICMjX19WQV9BUkdTX18pOwlcCiB9IHdoaWxlICgwKQotI2RlZmluZSBlbl93YXJuKHByaXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKLQllbl9wcmludChLRVJOX1dBUk5JTkcsIHByaXYsIGZvcm1hdCwgIyNhcmcpCi0jZGVmaW5lIGVuX2Vycihwcml2LCBmb3JtYXQsIGFyZy4uLikJCQlcCi0JZW5fcHJpbnQoS0VSTl9FUlIsIHByaXYsIGZvcm1hdCwgIyNhcmcpCi0jZGVmaW5lIGVuX2luZm8ocHJpdiwgZm9ybWF0LCBhcmcuLi4pCQkJXAotCWVuX3ByaW50KEtFUk5fSU5GTywgcHJpdiwgZm9ybWF0LCAjIyBhcmcpCisjZGVmaW5lIGVuX3dhcm4ocHJpdiwgZm9ybWF0LCAuLi4pCQkJCQlcCisJZW5fcHJpbnQoS0VSTl9XQVJOSU5HLCBwcml2LCBmb3JtYXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGVuX2Vycihwcml2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwllbl9wcmludChLRVJOX0VSUiwgcHJpdiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlbl9pbmZvKHByaXYsIGZvcm1hdCwgLi4uKQkJCQkJXAorCWVuX3ByaW50KEtFUk5fSU5GTywgcHJpdiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKQogCi0jZGVmaW5lIG1seDRfZXJyKG1kZXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKLQlwcl9lcnIoIiVzICVzOiAiIGZvcm1hdCwgRFJWX05BTUUsCQlcCi0JICAgICAgIGRldl9uYW1lKCZtZGV2LT5wZGV2LT5kZXYpLCAjI2FyZykKLSNkZWZpbmUgbWx4NF9pbmZvKG1kZXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKLQlwcl9pbmZvKCIlcyAlczogIiBmb3JtYXQsIERSVl9OQU1FLAkJXAotCQlkZXZfbmFtZSgmbWRldi0+cGRldi0+ZGV2KSwgIyNhcmcpCi0jZGVmaW5lIG1seDRfd2FybihtZGV2LCBmb3JtYXQsIGFyZy4uLikJCQlcCi0JcHJfd2FybmluZygiJXMgJXM6ICIgZm9ybWF0LCBEUlZfTkFNRSwJCVwKLQkJICAgZGV2X25hbWUoJm1kZXYtPnBkZXYtPmRldiksICMjYXJnKQorI2RlZmluZSBtbHg0X2VycihtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlwcl9lcnIoRFJWX05BTUUgIiAlczogIiBmb3JtYXQsCQkJCQlcCisJICAgICAgIGRldl9uYW1lKCYobWRldiktPnBkZXYtPmRldiksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIG1seDRfaW5mbyhtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlwcl9pbmZvKERSVl9OQU1FICIgJXM6ICIgZm9ybWF0LAkJCQlcCisJCWRldl9uYW1lKCYobWRldiktPnBkZXYtPmRldiksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIG1seDRfd2FybihtZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlwcl93YXJuKERSVl9OQU1FICIgJXM6ICIgZm9ybWF0LAkJCQlcCisJCWRldl9uYW1lKCYobWRldiktPnBkZXYtPmRldiksICMjX19WQV9BUkdTX18pCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jCmluZGV4IDRjNzFkYWYuLjI4MzlhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21yLmMKQEAgLTI1MCw4ICsyNTAsOCBAQAogCQkJCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKIAkJCQkJCSAgICAgICBNTFg0X0NNRF9XUkFQUEVEKTsKIAkJaWYgKGVycikKLQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZnJlZSBtdHQgcmFuZ2UgYXQ6IgotCQkJCSAgIiVkIG9yZGVyOiVkXG4iLCBvZmZzZXQsIG9yZGVyKTsKKwkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZnJlZSBtdHQgcmFuZ2UgYXQ6JWQgb3JkZXI6JWRcbiIsCisJCQkJICBvZmZzZXQsIG9yZGVyKTsKIAkJcmV0dXJuOwogCX0KIAkgX19tbHg0X2ZyZWVfbXR0X3JhbmdlKGRldiwgb2Zmc2V0LCBvcmRlcik7CkBAIC00MzYsOCArNDM2LDggQEAKIAkJCQkgICAgIGtleV90b19od19pbmRleChtci0+a2V5KSAmCiAJCQkJICAgICAoZGV2LT5jYXBzLm51bV9tcHRzIC0gMSkpOwogCQlpZiAoZXJyKSB7Ci0JCQltbHg0X3dhcm4oZGV2LCAiSFcyU1dfTVBUIGZhaWxlZCAoJWQpLCIsIGVycik7Ci0JCQltbHg0X3dhcm4oZGV2LCAiTVIgaGFzIE1XcyBib3VuZCB0byBpdC5cbiIpOworCQkJbWx4NF93YXJuKGRldiwgIkhXMlNXX01QVCBmYWlsZWQgKCVkKSwgTVIgaGFzIE1XcyBib3VuZCB0byBpdFxuIiwKKwkJCQkgIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTc3NCw3ICs3NzQsNyBAQAogCQkJbWx4NF9hbGxvY19tdHRfcmFuZ2UoZGV2LAogCQkJCQkgICAgIGZscyhkZXYtPmNhcHMucmVzZXJ2ZWRfbXR0cyAtIDEpKTsKIAkJaWYgKHByaXYtPnJlc2VydmVkX210dHMgPCAwKSB7Ci0JCQltbHg0X3dhcm4oZGV2LCAiTVRUIHRhYmxlIG9mIG9yZGVyICV1IGlzIHRvbyBzbWFsbC5cbiIsCisJCQltbHg0X3dhcm4oZGV2LCAiTVRUIHRhYmxlIG9mIG9yZGVyICV1IGlzIHRvbyBzbWFsbFxuIiwKIAkJCQkgIG1yX3RhYmxlLT5tdHRfYnVkZHkubWF4X29yZGVyKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9yZXNlcnZlX210dHM7CkBAIC05NTUsOCArOTU1LDcgQEAKIAltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOwogCWlmIChJU19FUlIobWFpbGJveCkpIHsKIAkJZXJyID0gUFRSX0VSUihtYWlsYm94KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWx4NF9pYjogbWx4NF9hbGxvY19jbWRfbWFpbGJveCIKLQkJICAgICAgICIgZmFpbGVkICglZClcbiIsIGVycik7CisJCXByX3dhcm4oIm1seDRfaWI6IG1seDRfYWxsb2NfY21kX21haWxib3ggZmFpbGVkICglZClcbiIsIGVycik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk2NSw4ICs5NjQsNyBAQAogCQkJICAgICAoZGV2LT5jYXBzLm51bV9tcHRzIC0gMSkpOwogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWx4NF9pYjogbWx4NF9IVzJTV19NUFQgZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl93YXJuKCJtbHg0X2liOiBtbHg0X0hXMlNXX01QVCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuOwogCX0KIAlmbXItPm1yLmVuYWJsZWQgPSBNTFg0X01QVF9FTl9TVzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKaW5kZXggNWVjNmYyMC4uN2FiOTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKQEAgLTI1NCw4ICsyNTQsOCBAQAogCWlmICh2YWxpZGF0ZV9pbmRleChkZXYsIHRhYmxlLCBpbmRleCkpCiAJCWdvdG8gb3V0OwogCWlmICgtLXRhYmxlLT5yZWZzW2luZGV4XSkgewotCQltbHg0X2RiZyhkZXYsICJIYXZlIG1vcmUgcmVmZXJlbmNlcyBmb3IgaW5kZXggJWQsIgotCQkJICJubyBuZWVkIHRvIG1vZGlmeSBtYWMgdGFibGVcbiIsIGluZGV4KTsKKwkJbWx4NF9kYmcoZGV2LCAiSGF2ZSBtb3JlIHJlZmVyZW5jZXMgZm9yIGluZGV4ICVkLCBubyBuZWVkIHRvIG1vZGlmeSBtYWMgdGFibGVcbiIsCisJCQkgaW5kZXgpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ1Myw5ICs0NTMsOCBAQAogCX0KIAogCWlmICgtLXRhYmxlLT5yZWZzW2luZGV4XSkgewotCQltbHg0X2RiZyhkZXYsICJIYXZlICVkIG1vcmUgcmVmZXJlbmNlcyBmb3IgaW5kZXggJWQsIgotCQkJICJubyBuZWVkIHRvIG1vZGlmeSB2bGFuIHRhYmxlXG4iLCB0YWJsZS0+cmVmc1tpbmRleF0sCi0JCQkgaW5kZXgpOworCQltbHg0X2RiZyhkZXYsICJIYXZlICVkIG1vcmUgcmVmZXJlbmNlcyBmb3IgaW5kZXggJWQsIG5vIG5lZWQgdG8gbW9kaWZ5IHZsYW4gdGFibGVcbiIsCisJCQkgdGFibGUtPnJlZnNbaW5kZXhdLCBpbmRleCk7CiAJCWdvdG8gb3V0OwogCX0KIAl0YWJsZS0+ZW50cmllc1tpbmRleF0gPSAwOwpAQCAtNzk2LDggKzc5NSw3IEBACiAJCQkJCWlmICghbWVtY21wKGdpZF9lbnRyeV9tYm94LT5yYXcsIGdpZF9lbnRyeV90YmwtPnJhdywKIAkJCQkJCSAgICBzaXplb2YoZ2lkX2VudHJ5X3RibC0+cmF3KSkpIHsKIAkJCQkJCS8qIGZvdW5kIGR1cGxpY2F0ZSAqLwotCQkJCQkJbWx4NF93YXJuKGRldiwgInJlcXVlc3RlZCBnaWQgZW50cnkgZm9yIHNsYXZlOiVkICIKLQkJCQkJCQkgICJpcyBhIGR1cGxpY2F0ZSBvZiBnaWQgYXQgaW5kZXggJWRcbiIsCisJCQkJCQltbHg0X3dhcm4oZGV2LCAicmVxdWVzdGVkIGdpZCBlbnRyeSBmb3Igc2xhdmU6JWQgaXMgYSBkdXBsaWNhdGUgb2YgZ2lkIGF0IGluZGV4ICVkXG4iLAogCQkJCQkJCSAgc2xhdmUsIGkpOwogCQkJCQkJbXV0ZXhfdW5sb2NrKCYocHJpdi0+cG9ydFtwb3J0XS5naWRfdGFibGUubXV0ZXgpKTsKIAkJCQkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wcm9maWxlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Byb2ZpbGUuYwppbmRleCA4ZTBjM2NjLi4xNDA4OWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Byb2ZpbGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Byb2ZpbGUuYwpAQCAtMTY0LDE4ICsxNjQsMTcgQEAKIAkJfQogCiAJCWlmICh0b3RhbF9zaXplID4gZGV2X2NhcC0+bWF4X2ljbV9zeikgewotCQkJbWx4NF9lcnIoZGV2LCAiUHJvZmlsZSByZXF1aXJlcyAweCVsbHggYnl0ZXM7ICIKLQkJCQkgICJ3b24ndCBmaXQgaW4gMHglbGx4IGJ5dGVzIG9mIGNvbnRleHQgbWVtb3J5LlxuIiwKLQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvdGFsX3NpemUsCi0JCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkZXZfY2FwLT5tYXhfaWNtX3N6KTsKKwkJCW1seDRfZXJyKGRldiwgIlByb2ZpbGUgcmVxdWlyZXMgMHglbGx4IGJ5dGVzOyB3b24ndCBmaXQgaW4gMHglbGx4IGJ5dGVzIG9mIGNvbnRleHQgbWVtb3J5XG4iLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSB0b3RhbF9zaXplLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBkZXZfY2FwLT5tYXhfaWNtX3N6KTsKIAkJCWtmcmVlKHByb2ZpbGUpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQlpZiAocHJvZmlsZVtpXS5zaXplKQotCQkJbWx4NF9kYmcoZGV2LCAiICBwcm9maWxlWyUyZF0gKCU2cyk6IDJeJTAyZCBlbnRyaWVzIEAgMHglMTBsbHgsICIKLQkJCQkgICJzaXplIDB4JTEwbGx4XG4iLAotCQkJCSBpLCByZXNfbmFtZVtwcm9maWxlW2ldLnR5cGVdLCBwcm9maWxlW2ldLmxvZ19udW0sCisJCQltbHg0X2RiZyhkZXYsICIgIHByb2ZpbGVbJTJkXSAoJTZzKTogMl4lMDJkIGVudHJpZXMgQCAweCUxMGxseCwgc2l6ZSAweCUxMGxseFxuIiwKKwkJCQkgaSwgcmVzX25hbWVbcHJvZmlsZVtpXS50eXBlXSwKKwkJCQkgcHJvZmlsZVtpXS5sb2dfbnVtLAogCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBwcm9maWxlW2ldLnN0YXJ0LAogCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBwcm9maWxlW2ldLnNpemUpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYwppbmRleCA0MGFmNjE5Li4wZGMzMWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9xcC5jCkBAIC0yNjQsOCArMjY0LDggQEAKIAkJCSAgICAgICBNTFg0X0NNRF9GUkVFX1JFUywKIAkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOwogCQlpZiAoZXJyKSB7Ci0JCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHJlbGVhc2UgcXAgcmFuZ2UiCi0JCQkJICAiIGJhc2U6JWQgY250OiVkXG4iLCBiYXNlX3FwbiwgY250KTsKKwkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gcmVsZWFzZSBxcCByYW5nZSBiYXNlOiVkIGNudDolZFxuIiwKKwkJCQkgIGJhc2VfcXBuLCBjbnQpOwogCQl9CiAJfSBlbHNlCiAJCSBfX21seDRfcXBfcmVsZWFzZV9yYW5nZShkZXYsIGJhc2VfcXBuLCBjbnQpOwpAQCAtNjEyLDggKzYxMiw3IEBACiAJCWVyciA9IG1seDRfcXBfbW9kaWZ5KGRldiwgbXR0LCBzdGF0ZXNbaV0sIHN0YXRlc1tpICsgMV0sCiAJCQkJICAgICBjb250ZXh0LCAwLCAwLCBxcCk7CiAJCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBicmluZyBRUCB0byBzdGF0ZTogIgotCQkJCSAiJWQgd2l0aCBlcnJvcjogJWRcbiIsCisJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gYnJpbmcgUVAgdG8gc3RhdGU6ICVkIHdpdGggZXJyb3I6ICVkXG4iLAogCQkJCSBzdGF0ZXNbaSArIDFdLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNldC5jCmluZGV4IGRkMWI1MDkuLmVhMWM2ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc2V0LmMKQEAgLTcyLDggKzcyLDcgQEAKIAloY2FfaGVhZGVyID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOwogCWlmICghaGNhX2hlYWRlcikgewogCQllcnIgPSAtRU5PTUVNOwotCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gc2F2ZSBIQ0EgIgotCQkJICAiUENJIGhlYWRlciwgYWJvcnRpbmcuXG4iKTsKKwkJbWx4NF9lcnIoZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IHRvIHNhdmUgSENBIFBDSSBoZWFkZXIsIGFib3J0aW5nXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC04NCw4ICs4Myw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYtPnBkZXYsIGkgKiA0LCBoY2FfaGVhZGVyICsgaSkpIHsKIAkJCWVyciA9IC1FTk9ERVY7Ci0JCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBzYXZlIEhDQSAiCi0JCQkJICAiUENJIGhlYWRlciwgYWJvcnRpbmcuXG4iKTsKKwkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHNhdmUgSENBIFBDSSBoZWFkZXIsIGFib3J0aW5nXG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtOTQsNyArOTIsNyBAQAogCQkJTUxYNF9SRVNFVF9TSVpFKTsKIAlpZiAoIXJlc2V0KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBIQ0EgcmVzZXQgcmVnaXN0ZXIsIGFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBIQ0EgcmVzZXQgcmVnaXN0ZXIsIGFib3J0aW5nXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMzMsOCArMTMxLDcgQEAKIAogCWlmICh2ZW5kb3IgPT0gMHhmZmZmKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCW1seDRfZXJyKGRldiwgIlBDSSBkZXZpY2UgZGlkIG5vdCBjb21lIGJhY2sgYWZ0ZXIgcmVzZXQsICIKLQkJCSAgImFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIlBDSSBkZXZpY2UgZGlkIG5vdCBjb21lIGJhY2sgYWZ0ZXIgcmVzZXQsIGFib3J0aW5nXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xNDQsMTYgKzE0MSwxNCBAQAogCQlpZiAocGNpZV9jYXBhYmlsaXR5X3dyaXRlX3dvcmQoZGV2LT5wZGV2LCBQQ0lfRVhQX0RFVkNUTCwKIAkJCQkJICAgICAgIGRldmN0bCkpIHsKIAkJCWVyciA9IC1FTk9ERVY7Ci0JCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCByZXN0b3JlIEhDQSBQQ0kgRXhwcmVzcyAiCi0JCQkJICJEZXZpY2UgQ29udHJvbCByZWdpc3RlciwgYWJvcnRpbmcuXG4iKTsKKwkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIFBDSSBFeHByZXNzIERldmljZSBDb250cm9sIHJlZ2lzdGVyLCBhYm9ydGluZ1xuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlsaW5rY3RsID0gaGNhX2hlYWRlclsocGNpZV9jYXAgKyBQQ0lfRVhQX0xOS0NUTCkgLyA0XTsKIAkJaWYgKHBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKGRldi0+cGRldiwgUENJX0VYUF9MTktDVEwsCiAJCQkJCSAgICAgICBsaW5rY3RsKSkgewogCQkJZXJyID0gLUVOT0RFVjsKLQkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIFBDSSBFeHByZXNzICIKLQkJCQkgIkxpbmsgY29udHJvbCByZWdpc3RlciwgYWJvcnRpbmcuXG4iKTsKKwkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIFBDSSBFeHByZXNzIExpbmsgY29udHJvbCByZWdpc3RlciwgYWJvcnRpbmdcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0xNjQsOCArMTU5LDggQEAKIAogCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYtPnBkZXYsIGkgKiA0LCBoY2FfaGVhZGVyW2ldKSkgewogCQkJZXJyID0gLUVOT0RFVjsKLQkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIHJlZyAleCwgIgotCQkJCSAgImFib3J0aW5nLlxuIiwgaSk7CisJCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCByZXN0b3JlIEhDQSByZWcgJXgsIGFib3J0aW5nXG4iLAorCQkJCSBpKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtMTczLDggKzE2OCw3IEBACiAJaWYgKHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LT5wZGV2LCBQQ0lfQ09NTUFORCwKIAkJCQkgICBoY2FfaGVhZGVyW1BDSV9DT01NQU5EIC8gNF0pKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIENPTU1BTkQsICIKLQkJCSAgImFib3J0aW5nLlxuIik7CisJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IHJlc3RvcmUgSENBIENPTU1BTkQsIGFib3J0aW5nXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCmluZGV4IDJiYTNiNzYuLjBlZmMxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCkBAIC0yNzksNyArMjc5LDcgQEAKIH07CiAKIC8qIEZvciBEZWJ1ZyB1c2VzICovCi1zdGF0aWMgY29uc3QgY2hhciAqUmVzb3VyY2VUeXBlKGVudW0gbWx4NF9yZXNvdXJjZSBydCkKK3N0YXRpYyBjb25zdCBjaGFyICpyZXNvdXJjZV9zdHIoZW51bSBtbHg0X3Jlc291cmNlIHJ0KQogewogCXN3aXRjaCAocnQpIHsKIAljYXNlIFJFU19RUDogcmV0dXJuICJSRVNfUVAiOwpAQCAtMzA3LDYgKzMwNyw3IEBACiAJCSZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIucmVzX2FsbG9jW3Jlc190eXBlXTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlpbnQgYWxsb2NhdGVkLCBmcmVlLCByZXNlcnZlZCwgZ3VhcmFudGVlZCwgZnJvbV9mcmVlOworCWludCBmcm9tX3JzdmQ7CiAKIAlpZiAoc2xhdmUgPiBkZXYtPm51bV92ZnMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzIxLDExICszMjIsMTYgQEAKIAkJcmVzX2FsbG9jLT5yZXNfcmVzZXJ2ZWQ7CiAJZ3VhcmFudGVlZCA9IHJlc19hbGxvYy0+Z3VhcmFudGVlZFtzbGF2ZV07CiAKLQlpZiAoYWxsb2NhdGVkICsgY291bnQgPiByZXNfYWxsb2MtPnF1b3RhW3NsYXZlXSkKKwlpZiAoYWxsb2NhdGVkICsgY291bnQgPiByZXNfYWxsb2MtPnF1b3RhW3NsYXZlXSkgeworCQltbHg0X3dhcm4oZGV2LCAiVkYgJWQgcG9ydCAlZCByZXMgJXM6IHF1b3RhIGV4Y2VlZGVkLCBjb3VudCAlZCBhbGxvYyAlZCBxdW90YSAlZFxuIiwKKwkJCSAgc2xhdmUsIHBvcnQsIHJlc291cmNlX3N0cihyZXNfdHlwZSksIGNvdW50LAorCQkJICBhbGxvY2F0ZWQsIHJlc19hbGxvYy0+cXVvdGFbc2xhdmVdKTsKIAkJZ290byBvdXQ7CisJfQogCiAJaWYgKGFsbG9jYXRlZCArIGNvdW50IDw9IGd1YXJhbnRlZWQpIHsKIAkJZXJyID0gMDsKKwkJZnJvbV9yc3ZkID0gY291bnQ7CiAJfSBlbHNlIHsKIAkJLyogcG9ydGlvbiBtYXkgbmVlZCB0byBiZSBvYnRhaW5lZCBmcm9tIGZyZWUgYXJlYSAqLwogCQlpZiAoZ3VhcmFudGVlZCAtIGFsbG9jYXRlZCA+IDApCkBAIC0zMzMsOCArMzM5LDE0IEBACiAJCWVsc2UKIAkJCWZyb21fZnJlZSA9IGNvdW50OwogCi0JCWlmIChmcmVlIC0gZnJvbV9mcmVlID4gcmVzZXJ2ZWQpCisJCWZyb21fcnN2ZCA9IGNvdW50IC0gZnJvbV9mcmVlOworCisJCWlmIChmcmVlIC0gZnJvbV9mcmVlID49IHJlc2VydmVkKQogCQkJZXJyID0gMDsKKwkJZWxzZQorCQkJbWx4NF93YXJuKGRldiwgIlZGICVkIHBvcnQgJWQgcmVzICVzOiBmcmVlIHBvb2wgZW1wdHksIGZyZWUgJWQgZnJvbV9mcmVlICVkIHJzdmQgJWRcbiIsCisJCQkJICBzbGF2ZSwgcG9ydCwgcmVzb3VyY2Vfc3RyKHJlc190eXBlKSwgZnJlZSwKKwkJCQkgIGZyb21fZnJlZSwgcmVzZXJ2ZWQpOwogCX0KIAogCWlmICghZXJyKSB7CkBAIC0zNDIsOSArMzU0LDExIEBACiAJCWlmIChwb3J0ID4gMCkgewogCQkJcmVzX2FsbG9jLT5hbGxvY2F0ZWRbKHBvcnQgLSAxKSAqIChkZXYtPm51bV92ZnMgKyAxKSArIHNsYXZlXSArPSBjb3VudDsKIAkJCXJlc19hbGxvYy0+cmVzX3BvcnRfZnJlZVtwb3J0IC0gMV0gLT0gY291bnQ7CisJCQlyZXNfYWxsb2MtPnJlc19wb3J0X3JzdmRbcG9ydCAtIDFdIC09IGZyb21fcnN2ZDsKIAkJfSBlbHNlIHsKIAkJCXJlc19hbGxvYy0+YWxsb2NhdGVkW3NsYXZlXSArPSBjb3VudDsKIAkJCXJlc19hbGxvYy0+cmVzX2ZyZWUgLT0gY291bnQ7CisJCQlyZXNfYWxsb2MtPnJlc19yZXNlcnZlZCAtPSBmcm9tX3JzdmQ7CiAJCX0KIAl9CiAKQEAgLTM2MCwxNyArMzc0LDM2IEBACiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXN0cnVjdCByZXNvdXJjZV9hbGxvY2F0b3IgKnJlc19hbGxvYyA9CiAJCSZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIucmVzX2FsbG9jW3Jlc190eXBlXTsKKwlpbnQgYWxsb2NhdGVkLCBndWFyYW50ZWVkLCBmcm9tX3JzdmQ7CiAKIAlpZiAoc2xhdmUgPiBkZXYtPm51bV92ZnMpCiAJCXJldHVybjsKIAogCXNwaW5fbG9jaygmcmVzX2FsbG9jLT5hbGxvY19sb2NrKTsKKworCWFsbG9jYXRlZCA9IChwb3J0ID4gMCkgPworCQlyZXNfYWxsb2MtPmFsbG9jYXRlZFsocG9ydCAtIDEpICogKGRldi0+bnVtX3ZmcyArIDEpICsgc2xhdmVdIDoKKwkJcmVzX2FsbG9jLT5hbGxvY2F0ZWRbc2xhdmVdOworCWd1YXJhbnRlZWQgPSByZXNfYWxsb2MtPmd1YXJhbnRlZWRbc2xhdmVdOworCisJaWYgKGFsbG9jYXRlZCAtIGNvdW50ID49IGd1YXJhbnRlZWQpIHsKKwkJZnJvbV9yc3ZkID0gMDsKKwl9IGVsc2UgeworCQkvKiBwb3J0aW9uIG1heSBuZWVkIHRvIGJlIHJldHVybmVkIHRvIHJlc2VydmVkIGFyZWEgKi8KKwkJaWYgKGFsbG9jYXRlZCAtIGd1YXJhbnRlZWQgPiAwKQorCQkJZnJvbV9yc3ZkID0gY291bnQgLSAoYWxsb2NhdGVkIC0gZ3VhcmFudGVlZCk7CisJCWVsc2UKKwkJCWZyb21fcnN2ZCA9IGNvdW50OworCX0KKwogCWlmIChwb3J0ID4gMCkgewogCQlyZXNfYWxsb2MtPmFsbG9jYXRlZFsocG9ydCAtIDEpICogKGRldi0+bnVtX3ZmcyArIDEpICsgc2xhdmVdIC09IGNvdW50OwogCQlyZXNfYWxsb2MtPnJlc19wb3J0X2ZyZWVbcG9ydCAtIDFdICs9IGNvdW50OworCQlyZXNfYWxsb2MtPnJlc19wb3J0X3JzdmRbcG9ydCAtIDFdICs9IGZyb21fcnN2ZDsKIAl9IGVsc2UgewogCQlyZXNfYWxsb2MtPmFsbG9jYXRlZFtzbGF2ZV0gLT0gY291bnQ7CiAJCXJlc19hbGxvYy0+cmVzX2ZyZWUgKz0gY291bnQ7CisJCXJlc19hbGxvYy0+cmVzX3Jlc2VydmVkICs9IGZyb21fcnN2ZDsKIAl9CiAKIAlzcGluX3VubG9jaygmcmVzX2FsbG9jLT5hbGxvY19sb2NrKTsKQEAgLTk2Myw3ICs5OTYsNyBAQAogCQlyZXQgPSBhbGxvY19zcnFfdHIoaWQpOwogCQlicmVhazsKIAljYXNlIFJFU19NQUM6Ci0JCXByaW50ayhLRVJOX0VSUiAiaW1wbGVtZW50YXRpb24gbWlzc2luZ1xuIik7CisJCXByX2VycigiaW1wbGVtZW50YXRpb24gbWlzc2luZ1xuIik7CiAJCXJldHVybiBOVUxMOwogCWNhc2UgUkVTX0NPVU5URVI6CiAJCXJldCA9IGFsbG9jX2NvdW50ZXJfdHIoaWQpOwpAQCAtMTA1NywxMCArMTA5MCwxMCBAQAogewogCWlmIChyZXMtPmNvbS5zdGF0ZSA9PSBSRVNfTVRUX0JVU1kgfHwKIAkgICAgYXRvbWljX3JlYWQoJnJlcy0+cmVmX2NvdW50KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMtJWQ6IHN0YXRlICVzLCByZWZfY291bnQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSAgICAgICBtdHRfc3RhdGVzX3N0cihyZXMtPmNvbS5zdGF0ZSksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmcmVzLT5yZWZfY291bnQpKTsKKwkJcHJfZGV2ZWwoIiVzLSVkOiBzdGF0ZSAlcywgcmVmX2NvdW50ICVkXG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSBtdHRfc3RhdGVzX3N0cihyZXMtPmNvbS5zdGF0ZSksCisJCQkgYXRvbWljX3JlYWQoJnJlcy0+cmVmX2NvdW50KSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfSBlbHNlIGlmIChyZXMtPmNvbS5zdGF0ZSAhPSBSRVNfTVRUX0FMTE9DQVRFRCkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTM4OTcsNyArMzkzMCw3IEBACiAJCX0KIAl9CiAJaWYgKCFiZV9tYWMpIHsKLQkJcHJfZXJyKCJGYWlsZWQgYWRkaW5nIGV0aCBoZWFkZXIgdG8gRlMgcnVsZSwgQ2FuJ3QgZmluZCBtYXRjaGluZyBNQUMgZm9yIHBvcnQgJWQgLlxuIiwKKwkJcHJfZXJyKCJGYWlsZWQgYWRkaW5nIGV0aCBoZWFkZXIgdG8gRlMgcnVsZSwgQ2FuJ3QgZmluZCBtYXRjaGluZyBNQUMgZm9yIHBvcnQgJWRcbiIsCiAJCSAgICAgICBwb3J0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzk5NCw3ICs0MDI3LDcgQEAKIAlxcG4gPSBiZTMyX3RvX2NwdShjdHJsLT5xcG4pICYgMHhmZmZmZmY7CiAJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUCwgJnJxcCk7CiAJaWYgKGVycikgewotCQlwcl9lcnIoIlN0ZWVyaW5nIHJ1bGUgd2l0aCBxcG4gMHgleCByZWplY3RlZC5cbiIsIHFwbik7CisJCXByX2VycigiU3RlZXJpbmcgcnVsZSB3aXRoIHFwbiAweCV4IHJlamVjdGVkXG4iLCBxcG4pOwogCQlyZXR1cm4gZXJyOwogCX0KIAlydWxlX2hlYWRlciA9IChzdHJ1Y3QgX3J1bGVfaHcgKikoY3RybCArIDEpOwpAQCAtNDAxMiw3ICs0MDQ1LDcgQEAKIAljYXNlIE1MWDRfTkVUX1RSQU5TX1JVTEVfSURfSVBWNDoKIAljYXNlIE1MWDRfTkVUX1RSQU5TX1JVTEVfSURfVENQOgogCWNhc2UgTUxYNF9ORVRfVFJBTlNfUlVMRV9JRF9VRFA6Ci0JCXByX3dhcm4oIkNhbid0IGF0dGFjaCBGUyBydWxlIHdpdGhvdXQgTDIgaGVhZGVycywgYWRkaW5nIEwyIGhlYWRlci5cbiIpOworCQlwcl93YXJuKCJDYW4ndCBhdHRhY2ggRlMgcnVsZSB3aXRob3V0IEwyIGhlYWRlcnMsIGFkZGluZyBMMiBoZWFkZXJcbiIpOwogCQlpZiAoYWRkX2V0aF9oZWFkZXIoZGV2LCBzbGF2ZSwgaW5ib3gsIHJsaXN0LCBoZWFkZXJfaWQpKSB7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfcHV0OwpAQCAtNDAyMSw3ICs0MDU0LDcgQEAKIAkJCXNpemVvZihzdHJ1Y3QgbWx4NF9uZXRfdHJhbnNfcnVsZV9od19ldGgpID4+IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigiQ29ycnVwdGVkIG1haWxib3guXG4iKTsKKwkJcHJfZXJyKCJDb3JydXB0ZWQgbWFpbGJveFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3B1dDsKIAl9CkBAIC00MDM1LDcgKzQwNjgsNyBAQAogCiAJZXJyID0gYWRkX3Jlc19yYW5nZShkZXYsIHNsYXZlLCB2aGNyLT5vdXRfcGFyYW0sIDEsIFJFU19GU19SVUxFLCBxcG4pOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbCB0byBhZGQgZmxvdyBzdGVlcmluZyByZXNvdXJjZXMuXG4gIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWwgdG8gYWRkIGZsb3cgc3RlZXJpbmcgcmVzb3VyY2VzXG4iKTsKIAkJLyogZGV0YWNoIHJ1bGUqLwogCQltbHg0X2NtZChkZXYsIHZoY3ItPm91dF9wYXJhbSwgMCwgMCwKIAkJCSBNTFg0X1FQX0ZMT1dfU1RFRVJJTkdfREVUQUNILCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCkBAIC00MDczLDcgKzQxMDYsNyBAQAogCiAJZXJyID0gcmVtX3Jlc19yYW5nZShkZXYsIHNsYXZlLCB2aGNyLT5pbl9wYXJhbSwgMSwgUkVTX0ZTX1JVTEUsIDApOwogCWlmIChlcnIpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbCB0byByZW1vdmUgZmxvdyBzdGVlcmluZyByZXNvdXJjZXMuXG4gIik7CisJCW1seDRfZXJyKGRldiwgIkZhaWwgdG8gcmVtb3ZlIGZsb3cgc3RlZXJpbmcgcmVzb3VyY2VzXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00MTUxLDcgKzQxODQsNyBAQAogCQkJCQlpZiAocHJpbnQpCiAJCQkJCQltbHg0X2RiZyhkZXYsCiAJCQkJCQkJICIlcyBpZCAweCVsbHggaXMgYnVzeVxuIiwKLQkJCQkJCQkgIFJlc291cmNlVHlwZSh0eXBlKSwKKwkJCQkJCQkgIHJlc291cmNlX3N0cih0eXBlKSwKIAkJCQkJCQkgIHItPnJlc19pZCk7CiAJCQkJCSsrYnVzeTsKIAkJCQl9IGVsc2UgewpAQCAtNDIwMiw4ICs0MjM1LDggQEAKIAogCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX1FQKTsKIAlpZiAoZXJyKQotCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX3FwczogQ291bGQgbm90IG1vdmUgYWxsIHFwcyB0byBidXN5IgotCQkJICAiZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisJCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfcXBzOiBDb3VsZCBub3QgbW92ZSBhbGwgcXBzIHRvIGJ1c3kgZm9yIHNsYXZlICVkXG4iLAorCQkJICBzbGF2ZSk7CiAKIAlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsIHFwX2xpc3QsIGNvbS5saXN0KSB7CkBAIC00MjQxLDEwICs0Mjc0LDggQEAKIAkJCQkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCiAJCQkJCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKIAkJCQkJaWYgKGVycikKLQkJCQkJCW1seDRfZGJnKGRldiwgInJlbV9zbGF2ZV9xcHM6IGZhaWxlZCIKLQkJCQkJCQkgIiB0byBtb3ZlIHNsYXZlICVkIHFwbiAlZCB0byIKLQkJCQkJCQkgIiByZXNldFxuIiwgc2xhdmUsCi0JCQkJCQkJIHFwLT5sb2NhbF9xcG4pOworCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX3FwczogZmFpbGVkIHRvIG1vdmUgc2xhdmUgJWQgcXBuICVkIHRvIHJlc2V0XG4iLAorCQkJCQkJCSBzbGF2ZSwgcXAtPmxvY2FsX3Fwbik7CiAJCQkJCWF0b21pY19kZWMoJnFwLT5yY3EtPnJlZl9jb3VudCk7CiAJCQkJCWF0b21pY19kZWMoJnFwLT5zY3EtPnJlZl9jb3VudCk7CiAJCQkJCWF0b21pY19kZWMoJnFwLT5tdHQtPnJlZl9jb3VudCk7CkBAIC00Mjc4LDggKzQzMDksOCBAQAogCiAJZXJyID0gbW92ZV9hbGxfYnVzeShkZXYsIHNsYXZlLCBSRVNfU1JRKTsKIAlpZiAoZXJyKQotCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX3NycXM6IENvdWxkIG5vdCBtb3ZlIGFsbCBzcnFzIHRvICIKLQkJCSAgImJ1c3kgZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisJCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfc3JxczogQ291bGQgbm90IG1vdmUgYWxsIHNycXMgLSB0b28gYnVzeSBmb3Igc2xhdmUgJWRcbiIsCisJCQkgIHNsYXZlKTsKIAogCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3JxLCB0bXAsIHNycV9saXN0LCBjb20ubGlzdCkgewpAQCAtNDMwOSw5ICs0MzQwLDcgQEAKIAkJCQkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCiAJCQkJCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKIAkJCQkJaWYgKGVycikKLQkJCQkJCW1seDRfZGJnKGRldiwgInJlbV9zbGF2ZV9zcnFzOiBmYWlsZWQiCi0JCQkJCQkJICIgdG8gbW92ZSBzbGF2ZSAlZCBzcnEgJWQgdG8iCi0JCQkJCQkJICIgU1cgb3duZXJzaGlwXG4iLAorCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX3NycXM6IGZhaWxlZCB0byBtb3ZlIHNsYXZlICVkIHNycSAlZCB0byBTVyBvd25lcnNoaXBcbiIsCiAJCQkJCQkJIHNsYXZlLCBzcnFuKTsKIAogCQkJCQlhdG9taWNfZGVjKCZzcnEtPm10dC0+cmVmX2NvdW50KTsKQEAgLTQzNDYsOCArNDM3NSw4IEBACiAKIAllcnIgPSBtb3ZlX2FsbF9idXN5KGRldiwgc2xhdmUsIFJFU19DUSk7CiAJaWYgKGVycikKLQkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9jcXM6IENvdWxkIG5vdCBtb3ZlIGFsbCBjcXMgdG8gIgotCQkJICAiYnVzeSBmb3Igc2xhdmUgJWRcbiIsIHNsYXZlKTsKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9jcXM6IENvdWxkIG5vdCBtb3ZlIGFsbCBjcXMgLSB0b28gYnVzeSBmb3Igc2xhdmUgJWRcbiIsCisJCQkgIHNsYXZlKTsKIAogCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3EsIHRtcCwgY3FfbGlzdCwgY29tLmxpc3QpIHsKQEAgLTQzNzcsOSArNDQwNiw3IEBACiAJCQkJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLAogCQkJCQkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CiAJCQkJCWlmIChlcnIpCi0JCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfY3FzOiBmYWlsZWQiCi0JCQkJCQkJICIgdG8gbW92ZSBzbGF2ZSAlZCBjcSAlZCB0byIKLQkJCQkJCQkgIiBTVyBvd25lcnNoaXBcbiIsCisJCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfY3FzOiBmYWlsZWQgdG8gbW92ZSBzbGF2ZSAlZCBjcSAlZCB0byBTVyBvd25lcnNoaXBcbiIsCiAJCQkJCQkJIHNsYXZlLCBjcW4pOwogCQkJCQlhdG9taWNfZGVjKCZjcS0+bXR0LT5yZWZfY291bnQpOwogCQkJCQlzdGF0ZSA9IFJFU19DUV9BTExPQ0FURUQ7CkBAIC00NDExLDggKzQ0MzgsOCBAQAogCiAJZXJyID0gbW92ZV9hbGxfYnVzeShkZXYsIHNsYXZlLCBSRVNfTVBUKTsKIAlpZiAoZXJyKQotCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX21yczogQ291bGQgbm90IG1vdmUgYWxsIG1wdHMgdG8gIgotCQkJICAiYnVzeSBmb3Igc2xhdmUgJWRcbiIsIHNsYXZlKTsKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9tcnM6IENvdWxkIG5vdCBtb3ZlIGFsbCBtcHRzIC0gdG9vIGJ1c3kgZm9yIHNsYXZlICVkXG4iLAorCQkJICBzbGF2ZSk7CiAKIAlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1wdCwgdG1wLCBtcHRfbGlzdCwgY29tLmxpc3QpIHsKQEAgLTQ0NDcsOSArNDQ3NCw3IEBACiAJCQkJCQkgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKIAkJCQkJCSAgICAgTUxYNF9DTURfTkFUSVZFKTsKIAkJCQkJaWYgKGVycikKLQkJCQkJCW1seDRfZGJnKGRldiwgInJlbV9zbGF2ZV9tcnM6IGZhaWxlZCIKLQkJCQkJCQkgIiB0byBtb3ZlIHNsYXZlICVkIG1wdCAlZCB0byIKLQkJCQkJCQkgIiBTVyBvd25lcnNoaXBcbiIsCisJCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfbXJzOiBmYWlsZWQgdG8gbW92ZSBzbGF2ZSAlZCBtcHQgJWQgdG8gU1cgb3duZXJzaGlwXG4iLAogCQkJCQkJCSBzbGF2ZSwgbXB0bik7CiAJCQkJCWlmIChtcHQtPm10dCkKIAkJCQkJCWF0b21pY19kZWMoJm1wdC0+bXR0LT5yZWZfY291bnQpOwpAQCAtNDQ4MSw4ICs0NTA2LDggQEAKIAogCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX01UVCk7CiAJaWYgKGVycikKLQkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9tdHRzOiBDb3VsZCBub3QgbW92ZSBhbGwgbXR0cyB0byAiCi0JCQkgICJidXN5IGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX210dHM6IENvdWxkIG5vdCBtb3ZlIGFsbCBtdHRzICAtIHRvbyBidXN5IGZvciBzbGF2ZSAlZFxuIiwKKwkJCSAgc2xhdmUpOwogCiAJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtdHQsIHRtcCwgbXR0X2xpc3QsIGNvbS5saXN0KSB7CkBAIC00NTg0LDggKzQ2MDksOCBAQAogCiAJZXJyID0gbW92ZV9hbGxfYnVzeShkZXYsIHNsYXZlLCBSRVNfRVEpOwogCWlmIChlcnIpCi0JCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfZXFzOiBDb3VsZCBub3QgbW92ZSBhbGwgZXFzIHRvICIKLQkJCSAgImJ1c3kgZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisJCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfZXFzOiBDb3VsZCBub3QgbW92ZSBhbGwgZXFzIC0gdG9vIGJ1c3kgZm9yIHNsYXZlICVkXG4iLAorCQkJICBzbGF2ZSk7CiAKIAlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVxLCB0bXAsIGVxX2xpc3QsIGNvbS5saXN0KSB7CkBAIC00NjE3LDkgKzQ2NDIsOCBAQAogCQkJCQkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKIAkJCQkJCQkgICBNTFg0X0NNRF9OQVRJVkUpOwogCQkJCQlpZiAoZXJyKQotCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX2VxczogZmFpbGVkIgotCQkJCQkJCSAiIHRvIG1vdmUgc2xhdmUgJWQgZXFzICVkIHRvIgotCQkJCQkJCSAiIFNXIG93bmVyc2hpcFxuIiwgc2xhdmUsIGVxbik7CisJCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfZXFzOiBmYWlsZWQgdG8gbW92ZSBzbGF2ZSAlZCBlcXMgJWQgdG8gU1cgb3duZXJzaGlwXG4iLAorCQkJCQkJCSBzbGF2ZSwgZXFuKTsKIAkJCQkJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJCQkJCWF0b21pY19kZWMoJmVxLT5tdHQtPnJlZl9jb3VudCk7CiAJCQkJCXN0YXRlID0gUkVTX0VRX1JFU0VSVkVEOwpAQCAtNDY0OCw4ICs0NjcyLDggQEAKIAogCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX0NPVU5URVIpOwogCWlmIChlcnIpCi0JCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfY291bnRlcnM6IENvdWxkIG5vdCBtb3ZlIGFsbCBjb3VudGVycyB0byAiCi0JCQkgICJidXN5IGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX2NvdW50ZXJzOiBDb3VsZCBub3QgbW92ZSBhbGwgY291bnRlcnMgLSB0b28gYnVzeSBmb3Igc2xhdmUgJWRcbiIsCisJCQkgIHNsYXZlKTsKIAogCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY291bnRlciwgdG1wLCBjb3VudGVyX2xpc3QsIGNvbS5saXN0KSB7CkBAIC00Njc5LDggKzQ3MDMsOCBAQAogCiAJZXJyID0gbW92ZV9hbGxfYnVzeShkZXYsIHNsYXZlLCBSRVNfWFJDRCk7CiAJaWYgKGVycikKLQkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV94cmNkbnM6IENvdWxkIG5vdCBtb3ZlIGFsbCB4cmNkbnMgdG8gIgotCQkJICAiYnVzeSBmb3Igc2xhdmUgJWRcbiIsIHNsYXZlKTsKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV94cmNkbnM6IENvdWxkIG5vdCBtb3ZlIGFsbCB4cmNkbnMgLSB0b28gYnVzeSBmb3Igc2xhdmUgJWRcbiIsCisJCQkgIHNsYXZlKTsKIAogCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoeHJjZCwgdG1wLCB4cmNkbl9saXN0LCBjb20ubGlzdCkgewpAQCAtNDgyNSwxMCArNDg0OSw4IEBACiAJCQkJICAgICAgIDAsIE1MWDRfQ01EX1VQREFURV9RUCwKIAkJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19DLCBNTFg0X0NNRF9OQVRJVkUpOwogCQkJaWYgKGVycikgewotCQkJCW1seDRfaW5mbyhkZXYsICJVUERBVEVfUVAgZmFpbGVkIGZvciBzbGF2ZSAlZCwgIgotCQkJCQkgICJwb3J0ICVkLCBxcG4gJWQgKCVkKVxuIiwKLQkJCQkJICB3b3JrLT5zbGF2ZSwgcG9ydCwgcXAtPmxvY2FsX3FwbiwKLQkJCQkJICBlcnIpOworCQkJCW1seDRfaW5mbyhkZXYsICJVUERBVEVfUVAgZmFpbGVkIGZvciBzbGF2ZSAlZCwgcG9ydCAlZCwgcXBuICVkICglZClcbiIsCisJCQkJCSAgd29yay0+c2xhdmUsIHBvcnQsIHFwLT5sb2NhbF9xcG4sIGVycik7CiAJCQkJZXJyb3JzKys7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYwppbmRleCA0MDVjNGZiLi44N2QxYjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jCkBAIC02MjAsOCArNjIwLDggQEAKIAkJCSAgICAgICBtbHg1X2NvbW1hbmRfc3RyKG1zZ190b19vcGNvZGUoZW50LT5pbikpLAogCQkJICAgICAgIG1zZ190b19vcGNvZGUoZW50LT5pbikpOwogCX0KLQltbHg1X2NvcmVfZGJnKGRldiwgImVyciAlZCwgZGVsaXZlcnkgc3RhdHVzICVzKCVkKVxuIiwgZXJyLAotCQkgICAgICBkZWxpdl9zdGF0dXNfdG9fc3RyKGVudC0+c3RhdHVzKSwgZW50LT5zdGF0dXMpOworCW1seDVfY29yZV9kYmcoZGV2LCAiZXJyICVkLCBkZWxpdmVyeSBzdGF0dXMgJXMoJWQpXG4iLAorCQkgICAgICBlcnIsIGRlbGl2X3N0YXR1c190b19zdHIoZW50LT5zdGF0dXMpLCBlbnQtPnN0YXR1cyk7CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwppbmRleCA2NGE2MWIyLi43ZjM5ZWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwpAQCAtMjA4LDcgKzIwOCw4IEBACiAJCSAqLwogCQlybWIoKTsKIAotCQltbHg1X2NvcmVfZGJnKGVxLT5kZXYsICJlcW4gJWQsIGVxZSB0eXBlICVzXG4iLCBlcS0+ZXFuLCBlcWVfdHlwZV9zdHIoZXFlLT50eXBlKSk7CisJCW1seDVfY29yZV9kYmcoZXEtPmRldiwgImVxbiAlZCwgZXFlIHR5cGUgJXNcbiIsCisJCQkgICAgICBlcS0+ZXFuLCBlcWVfdHlwZV9zdHIoZXFlLT50eXBlKSk7CiAJCXN3aXRjaCAoZXFlLT50eXBlKSB7CiAJCWNhc2UgTUxYNV9FVkVOVF9UWVBFX0NPTVA6CiAJCQljcW4gPSBiZTMyX3RvX2NwdShlcWUtPmRhdGEuY29tcC5jcW4pICYgMHhmZmZmZmY7CkBAIC0yNzAsMTQgKzI3MSwxNiBAQAogCQkJCXUxNiBmdW5jX2lkID0gYmUxNl90b19jcHUoZXFlLT5kYXRhLnJlcV9wYWdlcy5mdW5jX2lkKTsKIAkJCQlzMzIgbnBhZ2VzID0gYmUzMl90b19jcHUoZXFlLT5kYXRhLnJlcV9wYWdlcy5udW1fcGFnZXMpOwogCi0JCQkJbWx4NV9jb3JlX2RiZyhkZXYsICJwYWdlIHJlcXVlc3QgZm9yIGZ1bmMgMHgleCwgbmFwZ2VzICVkXG4iLCBmdW5jX2lkLCBucGFnZXMpOworCQkJCW1seDVfY29yZV9kYmcoZGV2LCAicGFnZSByZXF1ZXN0IGZvciBmdW5jIDB4JXgsIG5wYWdlcyAlZFxuIiwKKwkJCQkJICAgICAgZnVuY19pZCwgbnBhZ2VzKTsKIAkJCQltbHg1X2NvcmVfcmVxX3BhZ2VzX2hhbmRsZXIoZGV2LCBmdW5jX2lkLCBucGFnZXMpOwogCQkJfQogCQkJYnJlYWs7CiAKIAogCQlkZWZhdWx0OgotCQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiVW5oYW5kbGVkIGV2ZW50IDB4JXggb24gRVEgMHgleFxuIiwgZXFlLT50eXBlLCBlcS0+ZXFuKTsKKwkJCW1seDVfY29yZV93YXJuKGRldiwgIlVuaGFuZGxlZCBldmVudCAweCV4IG9uIEVRIDB4JXhcbiIsCisJCQkJICAgICAgIGVxZS0+dHlwZSwgZXEtPmVxbik7CiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21haW4uYwppbmRleCBjM2VlZTVmLi5lZTI0ZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMKQEAgLTY2LDEwICs2NiwxMCBAQAogCiAJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJXYXJuaW5nOiBjb3VsZG4ndCBzZXQgNjQtYml0IFBDSSBETUEgbWFzay5cbiIpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiV2FybmluZzogY291bGRuJ3Qgc2V0IDY0LWJpdCBQQ0kgRE1BIG1hc2tcbiIpOwogCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBzZXQgUENJIERNQSBtYXNrLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3Qgc2V0IFBDSSBETUEgbWFzaywgYWJvcnRpbmdcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTc3LDExICs3NywxMSBAQAogCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKIAlpZiAoZXJyKSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsCi0JCQkgIldhcm5pbmc6IGNvdWxkbid0IHNldCA2NC1iaXQgY29uc2lzdGVudCBQQ0kgRE1BIG1hc2suXG4iKTsKKwkJCSAiV2FybmluZzogY291bGRuJ3Qgc2V0IDY0LWJpdCBjb25zaXN0ZW50IFBDSSBETUEgbWFza1xuIik7CiAJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJaWYgKGVycikgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSJDYW4ndCBzZXQgY29uc2lzdGVudCBQQ0kgRE1BIG1hc2ssIGFib3J0aW5nLlxuIik7CisJCQkJIkNhbid0IHNldCBjb25zaXN0ZW50IFBDSSBETUEgbWFzaywgYWJvcnRpbmdcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTk1LDcgKzk1LDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIHJlZ2lzdGVycyBCQVIsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgcmVnaXN0ZXJzIEJBUiwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTMxOSwxMyArMzE5LDEzIEBACiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2RiZzsKIAl9CiAKIAllcnIgPSByZXF1ZXN0X2JhcihwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yIHJlcXVlc3RpbmcgQkFScywgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBCQVJzLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmgKaW5kZXggNjhiNzRlMS4uZjBjOWY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21seDVfY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tbHg1X2NvcmUuaApAQCAtMzksMjQgKzM5LDI2IEBACiAKIGV4dGVybiBpbnQgbWx4NV9jb3JlX2RlYnVnX21hc2s7CiAKLSNkZWZpbmUgbWx4NV9jb3JlX2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJCQkgICAgICAgXAotcHJfZGVidWcoIiVzOiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwgKGRldiktPnByaXYubmFtZSwgX19mdW5jX18sIF9fTElORV9fLCAgIFwKLQkgY3VycmVudC0+cGlkLCAjI2FyZykKKyNkZWZpbmUgbWx4NV9jb3JlX2RiZyhkZXYsIGZvcm1hdCwgLi4uKQkJCQkJXAorCXByX2RlYnVnKCIlczolczolZDoocGlkICVkKTogIiBmb3JtYXQsCQkJCVwKKwkJIChkZXYpLT5wcml2Lm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXywgY3VycmVudC0+cGlkLAlcCisJCSAjI19fVkFfQVJHU19fKQogCi0jZGVmaW5lIG1seDVfY29yZV9kYmdfbWFzayhkZXYsIG1hc2ssIGZvcm1hdCwgYXJnLi4uKQkJCSAgICAgICBcCi1kbyB7CQkJCQkJCQkJICAgICAgIFwKLQlpZiAoKG1hc2spICYgbWx4NV9jb3JlX2RlYnVnX21hc2spCQkJCSAgICAgICBcCi0JCXByX2RlYnVnKCIlczolczolZDoocGlkICVkKTogIiBmb3JtYXQsIChkZXYpLT5wcml2Lm5hbWUsICAgICAgIFwKLQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCwgIyNhcmcpOwkgICAgICAgXAorI2RlZmluZSBtbHg1X2NvcmVfZGJnX21hc2soZGV2LCBtYXNrLCBmb3JtYXQsIC4uLikJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICgobWFzaykgJiBtbHg1X2NvcmVfZGVidWdfbWFzaykJCQkJXAorCQltbHg1X2NvcmVfZGJnKGRldiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKTsJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgbWx4NV9jb3JlX2VycihkZXYsIGZvcm1hdCwgYXJnLi4uKSBcCi1wcl9lcnIoIiVzOiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwgKGRldiktPnByaXYubmFtZSwgX19mdW5jX18sIF9fTElORV9fLCAgICAgXAotCWN1cnJlbnQtPnBpZCwgIyNhcmcpCisjZGVmaW5lIG1seDVfY29yZV9lcnIoZGV2LCBmb3JtYXQsIC4uLikJCQkJCVwKKwlwcl9lcnIoIiVzOiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwJCQkJXAorCSAgICAgICAoZGV2KS0+cHJpdi5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCwJXAorCSAgICAgICAjI19fVkFfQVJHU19fKQogCi0jZGVmaW5lIG1seDVfY29yZV93YXJuKGRldiwgZm9ybWF0LCBhcmcuLi4pIFwKLXByX3dhcm4oIiVzOiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwgKGRldiktPnByaXYubmFtZSwgX19mdW5jX18sIF9fTElORV9fLCAgICBcCi0JY3VycmVudC0+cGlkLCAjI2FyZykKKyNkZWZpbmUgbWx4NV9jb3JlX3dhcm4oZGV2LCBmb3JtYXQsIC4uLikJCQkJXAorCXByX3dhcm4oIiVzOiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwJCQkJXAorCQkoZGV2KS0+cHJpdi5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCwJXAorCQkjI19fVkFfQVJHU19fKQogCiBlbnVtIHsKIAlNTFg1X0NNRF9EQVRBLCAvKiBwcmludCBjb21tYW5kIHBheWxvYWQgb25seSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbXIuYwppbmRleCBhYzUyYTBmLi5iYTA0MDFkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMKQEAgLTczLDcgKzczLDcgQEAKIAl9CiAKIAlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV9kYmcoZGV2LCAiY21kIGV4ZWMgZmFpbGUgJWRcbiIsIGVycik7CisJCW1seDVfY29yZV9kYmcoZGV2LCAiY21kIGV4ZWMgZmFpbGVkICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTk1LDcgKzE5NSw4IEBACiAJfQogCiAJaWYgKG91dC5oZHIuc3RhdHVzKSB7Ci0JCW1seDVfY29yZV9lcnIoZGV2LCAiY3JlYXRlX3BzdiBiYWQgc3RhdHVzICVkXG4iLCBvdXQuaGRyLnN0YXR1cyk7CisJCW1seDVfY29yZV9lcnIoZGV2LCAiY3JlYXRlX3BzdiBiYWQgc3RhdHVzICVkXG4iLAorCQkJICAgICAgb3V0Lmhkci5zdGF0dXMpOwogCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7CiAJfQogCkBAIC0yMjQsNyArMjI1LDggQEAKIAl9CiAKIAlpZiAob3V0Lmhkci5zdGF0dXMpIHsKLQkJbWx4NV9jb3JlX2VycihkZXYsICJkZXN0cm95X3BzdiBiYWQgc3RhdHVzICVkXG4iLCBvdXQuaGRyLnN0YXR1cyk7CisJCW1seDVfY29yZV9lcnIoZGV2LCAiZGVzdHJveV9wc3YgYmFkIHN0YXR1cyAlZFxuIiwKKwkJCSAgICAgIG91dC5oZHIuc3RhdHVzKTsKIAkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYwppbmRleCBkNTk3OTBhLi5jMmE5NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGFnZWFsbG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BhZ2VhbGxvYy5jCkBAIC0zMTEsNyArMzExLDggQEAKIAlpbi0+bnVtX2VudHJpZXMgPSBjcHVfdG9fYmUzMihucGFnZXMpOwogCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV93YXJuKGRldiwgImZ1bmNfaWQgMHgleCwgbnBhZ2VzICVkLCBlcnIgJWRcbiIsIGZ1bmNfaWQsIG5wYWdlcywgZXJyKTsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZnVuY19pZCAweCV4LCBucGFnZXMgJWQsIGVyciAlZFxuIiwKKwkJCSAgICAgICBmdW5jX2lkLCBucGFnZXMsIGVycik7CiAJCWdvdG8gb3V0X2FsbG9jOwogCX0KIAlkZXYtPnByaXYuZndfcGFnZXMgKz0gbnBhZ2VzOwpAQCAtMzE5LDcgKzMyMCw4IEBACiAJaWYgKG91dC5oZHIuc3RhdHVzKSB7CiAJCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwogCQlpZiAoZXJyKSB7Ci0JCQltbHg1X2NvcmVfd2FybihkZXYsICJmdW5jX2lkIDB4JXgsIG5wYWdlcyAlZCwgc3RhdHVzICVkXG4iLCBmdW5jX2lkLCBucGFnZXMsIG91dC5oZHIuc3RhdHVzKTsKKwkJCW1seDVfY29yZV93YXJuKGRldiwgImZ1bmNfaWQgMHgleCwgbnBhZ2VzICVkLCBzdGF0dXMgJWRcbiIsCisJCQkJICAgICAgIGZ1bmNfaWQsIG5wYWdlcywgb3V0Lmhkci5zdGF0dXMpOwogCQkJZ290byBvdXRfYWxsb2M7CiAJCX0KIAl9CkBAIC0zNzgsNyArMzgwLDcgQEAKIAltbHg1X2NvcmVfZGJnKGRldiwgIm5wYWdlcyAlZCwgb3V0bGVuICVkXG4iLCBucGFnZXMsIG91dGxlbik7CiAJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX2VycihkZXYsICJmYWlsZWQgcmVjbGlhbWluZyBwYWdlc1xuIik7CisJCW1seDVfY29yZV9lcnIoZGV2LCAiZmFpbGVkIHJlY2xhaW1pbmcgcGFnZXNcbiIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAlkZXYtPnByaXYuZndfcGFnZXMgLT0gbnBhZ2VzOwpAQCAtNDE0LDggKzQxNiw4IEBACiAJCWVyciA9IGdpdmVfcGFnZXMoZGV2LCByZXEtPmZ1bmNfaWQsIHJlcS0+bnBhZ2VzLCAxKTsKIAogCWlmIChlcnIpCi0JCW1seDVfY29yZV93YXJuKGRldiwgIiVzIGZhaWwgJWRcbiIsIHJlcS0+bnBhZ2VzIDwgMCA/Ci0JCQkgICAgICAgInJlY2xhaW0iIDogImdpdmUiLCBlcnIpOworCQltbHg1X2NvcmVfd2FybihkZXYsICIlcyBmYWlsICVkXG4iLAorCQkJICAgICAgIHJlcS0+bnBhZ2VzIDwgMCA/ICJyZWNsYWltIiA6ICJnaXZlIiwgZXJyKTsKIAogCWtmcmVlKHJlcSk7CiB9CkBAIC00ODcsNyArNDg5LDggQEAKIAkJCQkJICAgIG9wdGltYWxfcmVjbGFpbWVkX3BhZ2VzKCksCiAJCQkJCSAgICAmbmNsYWltZWQpOwogCQkJaWYgKGVycikgewotCQkJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCByZWNsYWltaW5nIHBhZ2VzICglZClcbiIsIGVycik7CisJCQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHJlY2xhaW1pbmcgcGFnZXMgKCVkKVxuIiwKKwkJCQkJICAgICAgIGVycik7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJCWlmIChuY2xhaW1lZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKaW5kZXggNTEwNTc2Mi4uODE0NWI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAogCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV93YXJuKGRldiwgInJldCAlZCIsIGVycik7CisJCW1seDVfY29yZV93YXJuKGRldiwgInJldCAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTk2LDcgKzk2LDcgQEAKIAllcnIgPSByYWRpeF90cmVlX2luc2VydCgmdGFibGUtPnRyZWUsIHFwLT5xcG4sIHFwKTsKIAlzcGluX3VubG9ja19pcnEoJnRhYmxlLT5sb2NrKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV93YXJuKGRldiwgImVyciAlZCIsIGVycik7CisJCW1seDVfY29yZV93YXJuKGRldiwgImVyciAlZFxuIiwgZXJyKTsKIAkJZ290byBlcnJfY21kOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODY5NW5ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODY5NW5ldC5jCmluZGV4IDE2NDM1YjMuLjZjN2M3OGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4Njk1bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODY5NW5ldC5jCkBAIC0xNTA0LDE1ICsxNTA0LDE1IEBACiAJaWYgKGtzcC0+cGh5aWZhY2VfcmVncyAmJiBrc3AtPmxpbmtfaXJxID09IC0xKSB7CiAJCWtzODY5NV9pbml0X3N3aXRjaChrc3ApOwogCQlrc3AtPmR0eXBlID0gS1M4Njk1X0RUWVBFX0xBTjsKLQkJU0VUX0VUSFRPT0xfT1BTKG5kZXYsICZrczg2OTVfZXRodG9vbF9vcHMpOworCQluZGV2LT5ldGh0b29sX29wcyA9ICZrczg2OTVfZXRodG9vbF9vcHM7CiAJfSBlbHNlIGlmIChrc3AtPnBoeWlmYWNlX3JlZ3MgJiYga3NwLT5saW5rX2lycSAhPSAtMSkgewogCQlrczg2OTVfaW5pdF93YW5fcGh5KGtzcCk7CiAJCWtzcC0+ZHR5cGUgPSBLUzg2OTVfRFRZUEVfV0FOOwotCQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJmtzODY5NV93YW5fZXRodG9vbF9vcHMpOworCQluZGV2LT5ldGh0b29sX29wcyA9ICZrczg2OTVfd2FuX2V0aHRvb2xfb3BzOwogCX0gZWxzZSB7CiAJCS8qIE5vIGluaXRpYWxpc2F0aW9uIHNpbmNlIEhQTkEgZG9lcyBub3QgaGF2ZSBhIFBIWSAqLwogCQlrc3AtPmR0eXBlID0gS1M4Njk1X0RUWVBFX0hQTkE7Ci0JCVNFVF9FVEhUT09MX09QUyhuZGV2LCAma3M4Njk1X2V0aHRvb2xfb3BzKTsKKwkJbmRldi0+ZXRodG9vbF9vcHMgPSAma3M4Njk1X2V0aHRvb2xfb3BzOwogCX0KIAogCS8qIEFuZCBicmluZyB1cCB0aGUgbmV0X2RldmljZSB3aXRoIHRoZSBuZXQgY29yZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jCmluZGV4IGUwYzkyZTAuLjY2ZDRhYjcwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NTEuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAKICNpbmNsdWRlICJrczg4NTEuaCIKIApAQCAtODUsNiArODcsOCBAQAogICogQGVlcHJvbV9zaXplOiBDb21wYW5pb24gZWVwcm9tIHNpemUgaW4gQnl0ZXMsIDAgaWYgbm8gZWVwcm9tCiAgKiBAZWVwcm9tOiA5M0NYNiBFRVBST00gc3RhdGUgZm9yIGFjY2Vzc2luZyBvbi1ib2FyZCBFRVBST00uCiAgKiBAdmRkX3JlZzoJT3B0aW9uYWwgcmVndWxhdG9yIHN1cHBseWluZyB0aGUgY2hpcAorICogQHZkZF9pbzogT3B0aW9uYWwgZGlnaXRhbCBwb3dlciBzdXBwbHkgZm9yIElPCisgKiBAZ3BpbzogT3B0aW9uYWwgcmVzZXRfbiBncGlvCiAgKgogICogVGhlIEBsb2NrIGVuc3VyZXMgdGhhdCB0aGUgY2hpcCBpcyBwcm90ZWN0ZWQgd2hlbiBjZXJ0YWluIG9wZXJhdGlvbnMgYXJlCiAgKiBpbiBwcm9ncmVzcy4gV2hlbiB0aGUgcmVhZCBvciB3cml0ZSBwYWNrZXQgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MsIG1vc3QKQEAgLTEzMyw2ICsxMzcsOCBAQAogCiAJc3RydWN0IGVlcHJvbV85M2N4NgllZXByb207CiAJc3RydWN0IHJlZ3VsYXRvcgkqdmRkX3JlZzsKKwlzdHJ1Y3QgcmVndWxhdG9yCSp2ZGRfaW87CisJaW50CQkJZ3BpbzsKIH07CiAKIHN0YXRpYyBpbnQgbXNnX2VuYWJsZTsKQEAgLTE0MDQsNiArMTQxMCw3IEBACiAJc3RydWN0IGtzODg1MV9uZXQgKmtzOwogCWludCByZXQ7CiAJdW5zaWduZWQgY2lkZXI7CisJaW50IGdwaW87CiAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBrczg4NTFfbmV0KSk7CiAJaWYgKCFuZGV2KQpAQCAtMTQxNywyMCArMTQyNCw1MyBAQAogCWtzLT5zcGlkZXYgPSBzcGk7CiAJa3MtPnR4X3NwYWNlID0gNjE0NDsKIAotCWtzLT52ZGRfcmVnID0gcmVndWxhdG9yX2dldF9vcHRpb25hbCgmc3BpLT5kZXYsICJ2ZGQiKTsKLQlpZiAoSVNfRVJSKGtzLT52ZGRfcmVnKSkgewotCQlyZXQgPSBQVFJfRVJSKGtzLT52ZGRfcmVnKTsKLQkJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQotCQkJZ290byBlcnJfcmVnOwotCX0gZWxzZSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoa3MtPnZkZF9yZWcpOworCWdwaW8gPSBvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyhzcGktPmRldi5vZl9ub2RlLCAicmVzZXQtZ3Bpb3MiLAorCQkJCSAgICAgICAwLCBOVUxMKTsKKwlpZiAoZ3BpbyA9PSAtRVBST0JFX0RFRkVSKSB7CisJCXJldCA9IGdwaW87CisJCWdvdG8gZXJyX2dwaW87CisJfQorCisJa3MtPmdwaW8gPSBncGlvOworCWlmIChncGlvX2lzX3ZhbGlkKGdwaW8pKSB7CisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIGdwaW8sCisJCQkJCSAgICBHUElPRl9PVVRfSU5JVF9MT1csICJrczg4NTFfcnN0X24iKTsKIAkJaWYgKHJldCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJyZWd1bGF0b3IgZW5hYmxlIGZhaWw6ICVkXG4iLAotCQkJCXJldCk7Ci0JCQlnb3RvIGVycl9yZWdfZW47CisJCQlkZXZfZXJyKCZzcGktPmRldiwgInJlc2V0IGdwaW8gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJZ290byBlcnJfZ3BpbzsKIAkJfQogCX0KIAorCWtzLT52ZGRfaW8gPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmRkLWlvIik7CisJaWYgKElTX0VSUihrcy0+dmRkX2lvKSkgeworCQlyZXQgPSBQVFJfRVJSKGtzLT52ZGRfaW8pOworCQlnb3RvIGVycl9yZWdfaW87CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShrcy0+dmRkX2lvKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAicmVndWxhdG9yIHZkZF9pbyBlbmFibGUgZmFpbDogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9yZWdfaW87CisJfQorCisJa3MtPnZkZF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmRkIik7CisJaWYgKElTX0VSUihrcy0+dmRkX3JlZykpIHsKKwkJcmV0ID0gUFRSX0VSUihrcy0+dmRkX3JlZyk7CisJCWdvdG8gZXJyX3JlZzsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGtzLT52ZGRfcmVnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAicmVndWxhdG9yIHZkZCBlbmFibGUgZmFpbDogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIDEpOworCX0KIAogCW11dGV4X2luaXQoJmtzLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgma3MtPnN0YXRlbG9jayk7CkBAIC0xNDcxLDcgKzE1MTEsNyBAQAogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgma3MtPnR4cSk7CiAKLQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJmtzODg1MV9ldGh0b29sX29wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAma3M4ODUxX2V0aHRvb2xfb3BzOwogCVNFVF9ORVRERVZfREVWKG5kZXYsICZzcGktPmRldik7CiAKIAlzcGlfc2V0X2RydmRhdGEoc3BpLCBrcyk7CkBAIC0xNTI3LDEzICsxNTY3LDE0IEBACiAJZnJlZV9pcnEobmRldi0+aXJxLCBrcyk7CiAKIGVycl9pcnE6CisJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIDApOwogZXJyX2lkOgotCWlmICghSVNfRVJSKGtzLT52ZGRfcmVnKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUoa3MtPnZkZF9yZWcpOwotZXJyX3JlZ19lbjoKLQlpZiAoIUlTX0VSUihrcy0+dmRkX3JlZykpCi0JCXJlZ3VsYXRvcl9wdXQoa3MtPnZkZF9yZWcpOworCXJlZ3VsYXRvcl9kaXNhYmxlKGtzLT52ZGRfcmVnKTsKIGVycl9yZWc6CisJcmVndWxhdG9yX2Rpc2FibGUoa3MtPnZkZF9pbyk7CitlcnJfcmVnX2lvOgorZXJyX2dwaW86CiAJZnJlZV9uZXRkZXYobmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1NDcsMTggKzE1ODgsMjQgQEAKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldGRldik7CiAJZnJlZV9pcnEoc3BpLT5pcnEsIHByaXYpOwotCWlmICghSVNfRVJSKHByaXYtPnZkZF9yZWcpKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXYtPnZkZF9yZWcpOwotCQlyZWd1bGF0b3JfcHV0KHByaXYtPnZkZF9yZWcpOwotCX0KKwlpZiAoZ3Bpb19pc192YWxpZChwcml2LT5ncGlvKSkKKwkJZ3Bpb19zZXRfdmFsdWUocHJpdi0+Z3BpbywgMCk7CisJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+dmRkX3JlZyk7CisJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+dmRkX2lvKTsKIAlmcmVlX25ldGRldihwcml2LT5uZXRkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGtzODg1MV9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWljcmVsLGtzODg1MSIgfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBrczg4NTFfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImtzODg1MSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGtzODg1MV9tYXRjaF90YWJsZSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5wbSA9ICZrczg4NTFfcG1fb3BzLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3N6ODg0eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzejg4NHguYwppbmRleCAxNGFjMGUyLi4wNjRhNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3N6ODg0eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rc3o4ODR4LmMKQEAgLTQ5MzAsNyArNDkzMCw3IEBACiAJCSAqIE9ubHkgcmVzZXQgdGhlIGhhcmR3YXJlIGlmIHRpbWUgYmV0d2VlbiBjYWxscyBpcyBsb25nCiAJCSAqIGVub3VnaC4KIAkJICovCi0JCWlmIChqaWZmaWVzIC0gbGFzdF9yZXNldCA8PSBkZXYtPndhdGNoZG9nX3RpbWVvKQorCQlpZiAodGltZV9iZWZvcmVfZXEoamlmZmllcywgbGFzdF9yZXNldCArIGRldi0+d2F0Y2hkb2dfdGltZW8pKQogCQkJaHdfcHJpdiA9IE5VTEw7CiAJfQogCkBAIC03MDcyLDYgKzcwNzIsNyBAQAogCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGRldl9wcml2KSk7CiAJCWlmICghZGV2KQogCQkJZ290byBwY2lkZXZfaW5pdF9yZWdfZXJyOworCQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCQlpbmZvLT5uZXRkZXZbaV0gPSBkZXY7CiAKIAkJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC03MTA2LDcgKzcxMDcsNyBAQAogCQl9CiAKIAkJZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHM7Ci0JCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCQlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKIAkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQogCQkJZ290byBwY2lkZXZfaW5pdF9yZWdfZXJyOwogCQlwb3J0X3NldF9wb3dlcl9zYXZpbmcocG9ydCwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyb2NoaXAvZW5jMjhqNjAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JvY2hpcC9lbmMyOGo2MC5jCmluZGV4IGM3YjQwYWEuLmIxYjVmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JvY2hpcC9lbmMyOGo2MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JvY2hpcC9lbmMyOGo2MC5jCkBAIC0xNTkzLDcgKzE1OTMsNyBAQAogCWRldi0+aXJxID0gc3BpLT5pcnE7CiAJZGV2LT5uZXRkZXZfb3BzID0gJmVuYzI4ajYwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJmVuYzI4ajYwX2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmVuYzI4ajYwX2V0aHRvb2xfb3BzOwogCiAJZW5jMjhqNjBfbG93cG93ZXIocHJpdiwgdHJ1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L215cmljb20vbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L215cmljb20vbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCAxMzBmNmIyLi5mM2Q1ZDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9teXJpY29tL215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbXlyaWNvbS9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC00MTEyLDcgKzQxMTIsNyBAQAogCXNldHVwX3RpbWVyKCZtZ3AtPndhdGNoZG9nX3RpbWVyLCBteXJpMTBnZV93YXRjaGRvZ190aW1lciwKIAkJICAgICh1bnNpZ25lZCBsb25nKW1ncCk7CiAKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmbXlyaTEwZ2VfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmbXlyaTEwZ2VfZXRodG9vbF9vcHM7CiAJSU5JVF9XT1JLKCZtZ3AtPndhdGNoZG9nX3dvcmssIG15cmkxMGdlX3dhdGNoZG9nKTsKIAlzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlpZiAoc3RhdHVzICE9IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbmF0c2VtaS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uYXRzZW1pLmMKaW5kZXggNjRlYzJhNDMuLjI5MWZiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbmF0c2VtaS5jCkBAIC05MjcsNyArOTI3LDcgQEAKIAlkZXYtPm5ldGRldl9vcHMgPSAmbmF0c2VtaV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmV0aHRvb2xfb3BzOwogCiAJaWYgKG10dSkKIAkJZGV2LT5tdHUgPSBtdHU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCmluZGV4IGRiY2NmMWQuLjE5YmI4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCkBAIC0yMDMwLDcgKzIwMzAsNyBAQAogCQlwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJm9wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOwogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vczJpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vczJpby5jCmluZGV4IGEyODQ0ZmYuLmJlNTg3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi9zMmlvLmMKQEAgLTUzNCwxNSArNTM0LDYgQEAKIAluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHNwLT5kZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgczJpb19zdGFydF90eF9xdWV1ZShzdHJ1Y3QgczJpb19uaWMgKnNwLCBpbnQgZmlmb19ubykKLXsKLQlpZiAoIXNwLT5jb25maWcubXVsdGlxKQotCQlzcC0+bWFjX2NvbnRyb2wuZmlmb3NbZmlmb19ub10ucXVldWVfc3RhdGUgPQotCQkJRklGT19RVUVVRV9TVEFSVDsKLQotCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoc3AtPmRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzMmlvX3dha2VfYWxsX3R4X3F1ZXVlKHN0cnVjdCBzMmlvX25pYyAqc3ApCiB7CiAJaWYgKCFzcC0+Y29uZmlnLm11bHRpcSkgewpAQCAtNTM2OSw4ICs1MzYwLDggQEAKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGluZm8sIFNQRUVEXzEwMDAwKTsKIAkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGluZm8sIC0xKTsKLQkJaW5mby0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChpbmZvLCBTUEVFRF9VTktOT1dOKTsKKwkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCiAJaW5mby0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKQEAgLTc5MTksNyArNzkxMCw3IEBACiAKIAkvKiAgRHJpdmVyIGVudHJ5IHBvaW50cyAqLwogCWRldi0+bmV0ZGV2X29wcyA9ICZzMmlvX25ldGRldl9vcHM7Ci0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfAogCQlORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNiB8CiAJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9MUk87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtY29uZmlnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtY29uZmlnLmMKaW5kZXggMDg5YjcxMy4uMmJiZDAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLWNvbmZpZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1jb25maWcuYwpAQCAtMTIwLDcgKzEyMCw2IEBACiB7CiAJdTY0IHZhbDY0OwogCXUzMiBpID0gMDsKLQllbnVtIHZ4Z2VfaHdfc3RhdHVzIHJldCA9IFZYR0VfSFdfRkFJTDsKIAogCXVkZWxheSgxMCk7CiAKQEAgLTEzOSw3ICsxMzgsNyBAQAogCQltZGVsYXkoMSk7CiAJfSB3aGlsZSAoKytpIDw9IG1heF9taWxsaXMpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gVlhHRV9IV19GQUlMOwogfQogCiBzdGF0aWMgaW5saW5lIGVudW0gdnhnZV9od19zdGF0dXMKQEAgLTE2ODIsMTIgKzE2ODEsMTAgQEAKIAkJCXN0cnVjdCBfX3Z4Z2VfaHdfZGV2aWNlICpobGRldiwKIAkJCXN0cnVjdCB2eGdlX2h3X2RldmljZV9zdGF0c19zd19pbmZvICpzd19zdGF0cykKIHsKLQllbnVtIHZ4Z2VfaHdfc3RhdHVzIHN0YXR1cyA9IFZYR0VfSFdfT0s7Ci0KIAltZW1jcHkoc3dfc3RhdHMsICZobGRldi0+c3RhdHMuc3dfZGV2X2luZm9fc3RhdHMsCiAJCXNpemVvZihzdHJ1Y3QgdnhnZV9od19kZXZpY2Vfc3RhdHNfc3dfaW5mbykpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gVlhHRV9IV19PSzsKIH0KIAogLyoKQEAgLTMyMjgsNyArMzIyNSw2IEBACiB2eGdlX2h3X3ZwYXRoX3N0cmlwX2Zjc19jaGVjayhzdHJ1Y3QgX192eGdlX2h3X2RldmljZSAqaGxkZXYsIHU2NCB2cGF0aF9tYXNrKQogewogCXN0cnVjdCB2eGdlX2h3X3ZwbWdtdF9yZWcgICAgICAgX19pb21lbSAqdnBtZ210X3JlZzsKLQllbnVtIHZ4Z2VfaHdfc3RhdHVzIHN0YXR1cyA9IFZYR0VfSFdfT0s7CiAJaW50IGkgPSAwLCBqID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBWWEdFX0hXX01BWF9WSVJUVUFMX1BBVEhTOyBpKyspIHsKQEAgLTMyNDEsNyArMzIzNyw3IEBACiAJCQkJcmV0dXJuIFZYR0VfSFdfRkFJTDsKIAkJfQogCX0KLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBWWEdFX0hXX09LOwogfQogLyoKICAqIHZ4Z2VfaHdfbWdtdF9yZWdfV3JpdGUgLSBXcml0ZSBUaXRhbiByZWdpc3Rlci4KQEAgLTM5NzksNyArMzk3NSw2IEBACiB7CiAJdTMyIGksIG10dSA9IDAsIG1heF9weWxkID0gMDsKIAl1NjQgdmFsNjQ7Ci0JZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOwogCiAJZm9yIChpID0gMDsgaSA8IFZYR0VfSFdfTUFDX01BWF9NQUNfUE9SVF9JRDsgaSsrKSB7CiAKQEAgLTQwMDksNyArNDAwNCw3IEBACiAJZWxzZQogCQlWWEdFX0hXX0RFVklDRV9MSU5LX1NUQVRFX1NFVCh2cGF0aC0+aGxkZXYsIFZYR0VfSFdfTElOS19ET1dOKTsKIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIFZYR0VfSFdfT0s7CiB9CiAKIC8qCkBAIC00MDM5LDE0ICs0MDM0LDEzIEBACiBfX3Z4Z2VfaHdfdnBhdGhfcmVzZXQoc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmhsZGV2LCB1MzIgdnBfaWQpCiB7CiAJdTY0IHZhbDY0OwotCWVudW0gdnhnZV9od19zdGF0dXMgc3RhdHVzID0gVlhHRV9IV19PSzsKIAogCXZhbDY0ID0gVlhHRV9IV19DTU5fUlNUSERMUl9DRkcwX1NXX1JFU0VUX1ZQQVRIKDEgPDwgKDE2IC0gdnBfaWQpKTsKIAogCV9fdnhnZV9od19waW9fbWVtX3dyaXRlMzJfdXBwZXIoKHUzMil2eGdlX2JWQUxuKHZhbDY0LCAwLCAzMiksCiAJCQkJJmhsZGV2LT5jb21tb25fcmVnLT5jbW5fcnN0aGRscl9jZmcwKTsKIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIFZYR0VfSFdfT0s7CiB9CiAKIC8qCkBAIC00MjI3LDcgKzQyMjEsNiBAQAogX192eGdlX2h3X3ZwYXRoX21hY19jb25maWd1cmUoc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmhsZGV2LCB1MzIgdnBfaWQpCiB7CiAJdTY0IHZhbDY0OwotCWVudW0gdnhnZV9od19zdGF0dXMgc3RhdHVzID0gVlhHRV9IV19PSzsKIAlzdHJ1Y3QgX192eGdlX2h3X3ZpcnR1YWxwYXRoICp2cGF0aDsKIAlzdHJ1Y3QgdnhnZV9od192cF9jb25maWcgKnZwX2NvbmZpZzsKIAlzdHJ1Y3QgdnhnZV9od192cGF0aF9yZWcgX19pb21lbSAqdnBfcmVnOwpAQCAtNDI4Myw3ICs0Mjc2LDcgQEAKIAogCQl3cml0ZXEodmFsNjQsICZ2cF9yZWctPnJ4bWFjX3ZjZmcxKTsKIAl9Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gVlhHRV9IV19PSzsKIH0KIAogLyoKQEAgLTQyOTUsNyArNDI4OCw2IEBACiBfX3Z4Z2VfaHdfdnBhdGhfdGltX2NvbmZpZ3VyZShzdHJ1Y3QgX192eGdlX2h3X2RldmljZSAqaGxkZXYsIHUzMiB2cF9pZCkKIHsKIAl1NjQgdmFsNjQ7Ci0JZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOwogCXN0cnVjdCBfX3Z4Z2VfaHdfdmlydHVhbHBhdGggKnZwYXRoOwogCXN0cnVjdCB2eGdlX2h3X3ZwYXRoX3JlZyBfX2lvbWVtICp2cF9yZWc7CiAJc3RydWN0IHZ4Z2VfaHdfdnBfY29uZmlnICpjb25maWc7CkBAIC00NTQ1LDcgKzQ1MzcsNyBAQAogCXZhbDY0IHw9IFZYR0VfSFdfVElNX1dSS0xEX0NMQ19DTlRfUlhfVFgoMyk7CiAJd3JpdGVxKHZhbDY0LCAmdnBfcmVnLT50aW1fd3JrbGRfY2xjKTsKIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIFZYR0VfSFdfT0s7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLWV0aHRvb2wuYwppbmRleCBmOGYwNzM4Li5iMDdkNTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1ldGh0b29sLmMKQEAgLTYyLDggKzYyLDggQEAKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGluZm8sIFNQRUVEXzEwMDAwKTsKIAkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGluZm8sIC0xKTsKLQkJaW5mby0+ZHVwbGV4ID0gLTE7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChpbmZvLCBTUEVFRF9VTktOT1dOKTsKKwkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCiAJaW5mby0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKQEAgLTExMjgsNSArMTEyOCw1IEBACiAKIHZvaWQgdnhnZV9pbml0aWFsaXplX2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmdnhnZV9ldGh0b29sX29wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmdnhnZV9ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtbWFpbi5jCmluZGV4IGQxMDdiY2IuLjdhMGRlYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYwpAQCAtMjEyMiw3ICsyMTIyLDcgQEAKIHN0YXRpYyB2b2lkIGFkYXB0aXZlX2NvYWxlc2NlX3R4X2ludGVycnVwdHMoc3RydWN0IHZ4Z2VfZmlmbyAqZmlmbykKIHsKIAlmaWZvLT5pbnRlcnJ1cHRfY291bnQrKzsKLQlpZiAoamlmZmllcyA+IGZpZm8tPmppZmZpZXMgKyBIWiAvIDEwMCkgeworCWlmICh0aW1lX2JlZm9yZShmaWZvLT5qaWZmaWVzICsgSFogLyAxMDAsIGppZmZpZXMpKSB7CiAJCXN0cnVjdCBfX3Z4Z2VfaHdfZmlmbyAqaHdfZmlmbyA9IGZpZm8tPmhhbmRsZTsKIAogCQlmaWZvLT5qaWZmaWVzID0gamlmZmllczsKQEAgLTIxNTAsNyArMjE1MCw3IEBACiBzdGF0aWMgdm9pZCBhZGFwdGl2ZV9jb2FsZXNjZV9yeF9pbnRlcnJ1cHRzKHN0cnVjdCB2eGdlX3JpbmcgKnJpbmcpCiB7CiAJcmluZy0+aW50ZXJydXB0X2NvdW50Kys7Ci0JaWYgKGppZmZpZXMgPiByaW5nLT5qaWZmaWVzICsgSFogLyAxMDApIHsKKwlpZiAodGltZV9iZWZvcmUocmluZy0+amlmZmllcyArIEhaIC8gMTAwLCBqaWZmaWVzKSkgewogCQlzdHJ1Y3QgX192eGdlX2h3X3JpbmcgKmh3X3JpbmcgPSByaW5nLT5oYW5kbGU7CiAKIAkJcmluZy0+amlmZmllcyA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMKaW5kZXggZmRkYjQ2NC4uOWFmYzUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnZpZGlhL2ZvcmNlZGV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L252aWRpYS9mb3JjZWRldGguYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAKICNkZWZpbmUgTlZfUlhfREVTQ1JJUFRPUlZBTElECSgxPDwxNikKICNkZWZpbmUgTlZfUlhfTUlTU0VERlJBTUUJKDE8PDE3KQotI2RlZmluZSBOVl9SWF9TVUJTVFJBQ1QxCSgxPDwxOCkKKyNkZWZpbmUgTlZfUlhfU1VCVFJBQ1QxCQkoMTw8MTgpCiAjZGVmaW5lIE5WX1JYX0VSUk9SMQkJKDE8PDIzKQogI2RlZmluZSBOVl9SWF9FUlJPUjIJCSgxPDwyNCkKICNkZWZpbmUgTlZfUlhfRVJST1IzCQkoMTw8MjUpCkBAIC00MjMsNyArNDIzLDcgQEAKICNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNX0lQX1RDUAkoMHgxNDAwMDAwMCkKICNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNX0lQX1VEUAkoMHgxODAwMDAwMCkKICNkZWZpbmUgTlZfUlgyX0RFU0NSSVBUT1JWQUxJRAkoMTw8MjkpCi0jZGVmaW5lIE5WX1JYMl9TVUJTVFJBQ1QxCSgxPDwyNSkKKyNkZWZpbmUgTlZfUlgyX1NVQlRSQUNUMQkoMTw8MjUpCiAjZGVmaW5lIE5WX1JYMl9FUlJPUjEJCSgxPDwxOCkKICNkZWZpbmUgTlZfUlgyX0VSUk9SMgkJKDE8PDE5KQogI2RlZmluZSBOVl9SWDJfRVJST1IzCQkoMTw8MjApCkBAIC0yODMyLDcgKzI4MzIsNyBAQAogCQkJCQl9CiAJCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycyAqLwogCQkJCQllbHNlIGlmICgoZmxhZ3MgJiBOVl9SWF9FUlJPUl9NQVNLKSA9PSBOVl9SWF9GUkFNSU5HRVJSKSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9TVUJTVFJBQ1QxKQorCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfU1VCVFJBQ1QxKQogCQkJCQkJCWxlbi0tOwogCQkJCQl9CiAJCQkJCS8qIHRoZSByZXN0IGFyZSBoYXJkIGVycm9ycyAqLwpAQCAtMjg2Myw3ICsyODYzLDcgQEAKIAkJCQkJfQogCQkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMgKi8KIAkJCQkJZWxzZSBpZiAoKGZsYWdzICYgTlZfUlgyX0VSUk9SX01BU0spID09IE5WX1JYMl9GUkFNSU5HRVJSKSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfU1VCU1RSQUNUMSkKKwkJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9TVUJUUkFDVDEpCiAJCQkJCQkJbGVuLS07CiAJCQkJCX0KIAkJCQkJLyogdGhlIHJlc3QgYXJlIGhhcmQgZXJyb3JzICovCkBAIC0yOTM3LDcgKzI5MzcsNyBAQAogCQkJCX0KIAkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMgKi8KIAkJCQllbHNlIGlmICgoZmxhZ3MgJiBOVl9SWDJfRVJST1JfTUFTSykgPT0gTlZfUlgyX0ZSQU1JTkdFUlIpIHsKLQkJCQkJaWYgKGZsYWdzICYgTlZfUlgyX1NVQlNUUkFDVDEpCisJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9TVUJUUkFDVDEpCiAJCQkJCQlsZW4tLTsKIAkJCQl9CiAJCQkJLyogdGhlIHJlc3QgYXJlIGhhcmQgZXJyb3JzICovCkBAIC00Mjg1LDggKzQyODUsOCBAQAogCQlpZiAobnAtPmR1cGxleCkKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCX0gZWxzZSB7Ci0JCXNwZWVkID0gLTE7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlzcGVlZCA9IFNQRUVEX1VOS05PV047CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgc3BlZWQpOwogCWVjbWQtPmF1dG9uZWcgPSBucC0+YXV0b25lZzsKQEAgLTU3NjYsNyArNTc2Niw3IEBACiAJCWRldi0+bmV0ZGV2X29wcyA9ICZudl9uZXRkZXZfb3BzX29wdGltaXplZDsKIAogCW5ldGlmX25hcGlfYWRkKGRldiwgJm5wLT5uYXBpLCBudl9uYXBpX3BvbGwsIFJYX1dPUktfUEVSX0xPT1ApOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBOVl9XQVRDSERPR19USU1FTzsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnhwL2xwY19ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L254cC9scGNfZXRoLmMKaW5kZXggNDIyZDliNS4uODcwNmMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnhwL2xwY19ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ueHAvbHBjX2V0aC5jCkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCV9fbHBjX2V0aF9jbG9ja19lbmFibGUocGxkYXQsIHRydWUpOwogCiAJLyogTWFwIElPIHNwYWNlICovCi0JcGxkYXQtPm5ldF9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlwbGRhdC0+bmV0X2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFwbGRhdC0+bmV0X2Jhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQxNywxMCArMTQxNyw4IEBACiAJfQogCXBsZGF0LT5kbWFfYnVmZl9iYXNlX3AgPSBkbWFfaGFuZGxlOwogCi0JbmV0ZGV2X2RiZyhuZGV2LCAiSU8gYWRkcmVzcyBzdGFydCAgICAgOjB4JTA4eFxuIiwKLQkJCXJlcy0+c3RhcnQpOwotCW5ldGRldl9kYmcobmRldiwgIklPIGFkZHJlc3Mgc2l6ZSAgICAgIDolZFxuIiwKLQkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCW5ldGRldl9kYmcobmRldiwgIklPIGFkZHJlc3Mgc3BhY2UgICAgIDolcFJcbiIsIHJlcyk7CisJbmV0ZGV2X2RiZyhuZGV2LCAiSU8gYWRkcmVzcyBzaXplICAgICAgOiVkXG4iLCByZXNvdXJjZV9zaXplKHJlcykpOwogCW5ldGRldl9kYmcobmRldiwgIklPIGFkZHJlc3MgKG1hcHBlZCkgIDoweCVwXG4iLAogCQkJcGxkYXQtPm5ldF9iYXNlKTsKIAluZXRkZXZfZGJnKG5kZXYsICJJUlEgbnVtYmVyICAgICAgICAgICA6JWRcbiIsIG5kZXYtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL0tjb25maWcKaW5kZXggYTU4OGZmZC4uNDRjOGJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogY29uZmlnIFBDSF9HQkUKIAl0cmlzdGF0ZSAiT0tJIFNFTUlDT05EVUNUT1IgSU9IKE1MNzIyMy9NTDc4MzEpIEdiRSIKLQlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2IHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAlzZWxlY3QgTUlJCiAJc2VsZWN0IFBUUF8xNTg4X0NMT0NLX1BDSAogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfZXRodG9vbC5jCmluZGV4IDgyNmYwY2MuLjRmZThlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX2V0aHRvb2wuYwpAQCAtOTEsNyArOTEsNyBAQAogCWVjbWQtPmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF9UUCB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpOwogCiAJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGFkYXB0ZXItPm5ldGRldikpCi0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF9VTktOT1dOKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MDgsNSArNTA4LDUgQEAKIAogdm9pZCBwY2hfZ2JlX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZwY2hfZ2JlX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnBjaF9nYmVfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYWNrZXRlbmdpbmVzL2hhbWFjaGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3BhY2tldGVuZ2luZXMvaGFtYWNoaS5jCmluZGV4IGI2YmRlYjMuLjlhOTk3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3BhY2tldGVuZ2luZXMvaGFtYWNoaS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3BhY2tldGVuZ2luZXMvaGFtYWNoaS5jCkBAIC03MjQsMTAgKzcyNCw4IEBACiAKIAkvKiBUaGUgSGFtYWNoaS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCWRldi0+bmV0ZGV2X29wcyA9ICZoYW1hY2hpX25ldGRldl9vcHM7Ci0JaWYgKGNoaXBfdGJsW2htcC0+Y2hpcF9pZF0uZmxhZ3MgJiBDYW5IYXZlTUlJKQotCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOwotCWVsc2UKLQkJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzX25vX21paSk7CisJZGV2LT5ldGh0b29sX29wcyA9IChjaGlwX3RibFtobXAtPmNoaXBfaWRdLmZsYWdzICYgQ2FuSGF2ZU1JSSkgPworCQkmZXRodG9vbF9vcHMgOiAmZXRodG9vbF9vcHNfbm9fbWlpOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCWlmIChtdHUpCiAJCWRldi0+bXR1ID0gbXR1OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcGFja2V0ZW5naW5lcy95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3BhY2tldGVuZ2luZXMveWVsbG93ZmluLmMKaW5kZXggOWE2Y2I0OC4uNjlhOGRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcGFja2V0ZW5naW5lcy95ZWxsb3dmaW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYWNrZXRlbmdpbmVzL3llbGxvd2Zpbi5jCkBAIC00NzIsNyArNDcyLDcgQEAKIAogCS8qIFRoZSBZZWxsb3dmaW4tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAlpZiAobXR1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZwppbmRleCBjMTRiZDMxLi5kNDljYmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZwpAQCAtNjYsNiArNjYsMTcgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGhhcmR3YXJlIG9mZmxvYWQgc3VwcG9ydCBmb3IKIAkgIFZpcnR1YWwgZVh0ZW5zaWJsZSBMb2NhbCBBcmVhIE5ldHdvcmsgKFZYTEFOKSBpbiB0aGUgZHJpdmVyLgogCitjb25maWcgUUxDTklDX0hXTU9OCisJYm9vbCAiUUxPR0lDIFFMQ05JQyA4MlhYIGFuZCA4M1hYIGZhbWlseSBIV01PTiBzdXBwb3J0IgorCWRlcGVuZHMgb24gUUxDTklDICYmIEhXTU9OICYmICEoUUxDTklDPXkgJiYgSFdNT049bSkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlCisJICBib2FyZCB0ZW1wZXJhdHVyZSBpbiBDb252ZXJnZWQgRXRoZXJuZXQgZGV2aWNlcworCSAgc3VwcG9ydGVkIGJ5IHFsY25pYy4KKworCSAgVGhpcyBkYXRhIGlzIGF2YWlsYWJsZSB2aWEgdGhlIGh3bW9uIHN5c2ZzIGludGVyZmFjZS4KKwogY29uZmlnIFFMR0UKIAl0cmlzdGF0ZSAiUUxvZ2ljIFFMR0UgMTBHYiBFdGhlcm5ldCBEcml2ZXIgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggZjA5YzM1ZC4uNWJmMDU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL25ldHhlbi9uZXR4ZW5fbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC0xMzczLDcgKzEzNzMsNyBAQAogCiAJbmV0eGVuX25pY19jaGFuZ2VfbXR1KG5ldGRldiwgbmV0ZGV2LT5tdHUpOwogCi0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJm5ldHhlbl9uaWNfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmbmV0eGVuX25pY19ldGh0b29sX29wczsKIAogCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU08gfAogCSAgICAgICAgICAgICAgICAgICAgICBORVRJRl9GX1JYQ1NVTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGEzeHh4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxhM3h4eC5jCmluZGV4IDJlYWJkNDQuLmI1ZDZiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGEzeHh4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsYTN4eHguYwpAQCAtMzgzOCw3ICszODM4LDcgQEAKIAogCS8qIFNldCBkcml2ZXIgZW50cnkgcG9pbnRzICovCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZxbDN4eHhfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJnFsM3h4eF9ldGh0b29sX29wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmcWwzeHh4X2V0aHRvb2xfb3BzOwogCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOwogCiAJbmV0aWZfbmFwaV9hZGQobmRldiwgJnFkZXYtPm5hcGksIHFsX3BvbGwsIDY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pYy5oCmluZGV4IGY3ODVkMDEuLmJlNjE4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWMuaApAQCAtMzksOCArMzksOCBAQAogCiAjZGVmaW5lIF9RTENOSUNfTElOVVhfTUFKT1IgNQogI2RlZmluZSBfUUxDTklDX0xJTlVYX01JTk9SIDMKLSNkZWZpbmUgX1FMQ05JQ19MSU5VWF9TVUJWRVJTSU9OIDU3Ci0jZGVmaW5lIFFMQ05JQ19MSU5VWF9WRVJTSU9OSUQgICI1LjMuNTciCisjZGVmaW5lIF9RTENOSUNfTElOVVhfU1VCVkVSU0lPTiA2MAorI2RlZmluZSBRTENOSUNfTElOVVhfVkVSU0lPTklEICAiNS4zLjYwIgogI2RlZmluZSBRTENOSUNfRFJWX0lEQ19WRVIgIDB4MDEKICNkZWZpbmUgUUxDTklDX0RSSVZFUl9WRVJTSU9OICAoKF9RTENOSUNfTElOVVhfTUFKT1IgPDwgMTYpIHxcCiAJCSAoX1FMQ05JQ19MSU5VWF9NSU5PUiA8PCA4KSB8IChfUUxDTklDX0xJTlVYX1NVQlZFUlNJT04pKQpAQCAtNDQxLDYgKzQ0MSw4IEBACiAJdTMyCXJzdmQxWzBdOwogfTsKIAorI2RlZmluZSBRTENfUEVYX0RNQV9SRUFEX1NJWkUJKFBBR0VfU0laRSAqIDE2KQorCiBzdHJ1Y3QgcWxjbmljX2Z3X2R1bXAgewogCXU4CWNscjsJLyogZmxhZyB0byBpbmRpY2F0ZSBpZiBkdW1wIGlzIGNsZWFyZWQgKi8KIAlib29sCWVuYWJsZTsgLyogZW5hYmxlL2Rpc2FibGUgZHVtcCAqLwpAQCAtNTM3LDYgKzUzOSw3IEBACiAJdTggcGh5c19wb3J0X2lkW0VUSF9BTEVOXTsKIAl1OCBsYl9tb2RlOwogCXUxNiB2eGxhbl9wb3J0OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIH07CiAKIHN0cnVjdCBxbGNuaWNfYWRhcHRlcl9zdGF0cyB7CkBAIC0xMDE4LDYgKzEwMjEsOCBAQAogI2RlZmluZSBRTENOSUNfREVMX1ZYTEFOX1BPUlQJCTB4MjAwMDAwCiAjZW5kaWYKIAorI2RlZmluZSBRTENOSUNfVkxBTl9GSUxURVJJTkcJCTB4ODAwMDAwCisKICNkZWZpbmUgUUxDTklDX0lTX01TSV9GQU1JTFkoYWRhcHRlcikgXAogCSgoYWRhcHRlciktPmZsYWdzICYgKFFMQ05JQ19NU0lfRU5BQkxFRCB8IFFMQ05JQ19NU0lYX0VOQUJMRUQpKQogI2RlZmluZSBRTENOSUNfSVNfVFNPX0NBUEFCTEUoYWRhcHRlcikgIFwKQEAgLTEzMTYsNiArMTMyMSw3IEBACiAjZGVmaW5lIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNCS0xCiAKICNkZWZpbmUgTUFYX0JXCQkJMTAwCS8qICUgb2YgbGluayBzcGVlZCAqLworI2RlZmluZSBNSU5fQlcJCQkxCS8qICUgb2YgbGluayBzcGVlZCAqLwogI2RlZmluZSBNQVhfVkxBTl9JRAkJNDA5NQogI2RlZmluZSBNSU5fVkxBTl9JRAkJMgogI2RlZmluZSBERUZBVUxUX01BQ19MRUFSTgkxCkBAIC0xNjkyLDcgKzE2OTgsNyBAQAogaW50IHFsY25pY19zZXR1cF9uZXRkZXYoc3RydWN0IHFsY25pY19hZGFwdGVyICosIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CiB2b2lkIHFsY25pY19zZXRfbmV0ZGV2X2ZlYXR1cmVzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLAogCQkJCXN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnICopOwotdm9pZCBxbGNuaWNfc3Jpb3ZfdmZfc2NoZWR1bGVfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHFsY25pY19zcmlvdl92Zl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBpbnQgcWxjbmljX2lzX3ZhbGlkX25pY19mdW5jKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCk7CiBpbnQgcWxjbmljX2dldF9wY2lfZnVuY190eXBlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1MTYsIHUxNiAqLCB1MTYgKiwKIAkJCSAgICAgdTE2ICopOwpAQCAtMjMzOCw2ICsyMzQ0LDE2IEBACiAJcmV0dXJuIChkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfVkZfUUxFODM0WCkgPyB0cnVlIDogZmFsc2U7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBxbGNuaWNfc3Jpb3ZfY2hlY2soc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCWJvb2wgc3RhdHVzOworCisJc3RhdHVzID0gKHFsY25pY19zcmlvdl9wZl9jaGVjayhhZGFwdGVyKSB8fAorCQkgIHFsY25pY19zcmlvdl92Zl9jaGVjayhhZGFwdGVyKSkgPyB0cnVlIDogZmFsc2U7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBxbGNuaWNfZ2V0X3ZuaWNfZnVuY19jb3VudChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKHFsY25pY184NHh4X2NoZWNrKGFkYXB0ZXIpKQpAQCAtMjM0NSw0ICsyMzYxLDE4IEBACiAJZWxzZQogCQlyZXR1cm4gUUxDX0RFRkFVTFRfVk5JQ19DT1VOVDsKIH0KKworI2lmZGVmIENPTkZJR19RTENOSUNfSFdNT04KK3ZvaWQgcWxjbmljX3JlZ2lzdGVyX2h3bW9uX2RldihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKik7Cit2b2lkIHFsY25pY191bnJlZ2lzdGVyX2h3bW9uX2RldihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHFsY25pY19yZWdpc3Rlcl9od21vbl9kZXYoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBxbGNuaWNfdW5yZWdpc3Rlcl9od21vbl9kZXYoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybjsKK30KKyNlbmRpZgogI2VuZGlmCQkJCS8qIF9fUUxDTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2h3LmMKaW5kZXggYjdjZmZiNC4uYTRhNGVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfODN4eF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaHcuYwpAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBSU1NfSEFTSFRZUEVfSVBfVENQCQkweDMKICNkZWZpbmUgUUxDXzgzWFhfRldfTUJYX0NNRAkJMAogI2RlZmluZSBRTENfU0tJUF9JTkFDVElWRV9QQ0lfUkVHUwk3CisjZGVmaW5lIFFMQ19NQVhfTEVHQUNZX0ZVTkNfU1VQUAk4CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcWxjbmljX21haWxib3hfbWV0YWRhdGEgcWxjbmljXzgzeHhfbWJ4X3RibFtdID0gewogCXtRTENOSUNfQ01EX0NPTkZJR1VSRV9JUF9BRERSLCA2LCAxfSwKQEAgLTM1Nyw4ICszNTgsMTUgQEAKIAlpZiAoIWFody0+aW50cl90YmwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfTVNJWF9FTkFCTEVEKSkKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19NU0lYX0VOQUJMRUQpKSB7CisJCWlmIChhZGFwdGVyLT5haHctPnBjaV9mdW5jID49IFFMQ19NQVhfTEVHQUNZX0ZVTkNfU1VQUCkgeworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUENJIGZ1bmN0aW9uIG51bWJlciA4IGFuZCBoaWdoZXIgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBsZWdhY3kgaW50ZXJydXB0LCBmdW5jIDB4JXhcbiIsCisJCQkJYWh3LT5wY2lfZnVuYyk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwogCQlxbGNuaWNfODN4eF9lbmFibGVfbGVnYWN5KGFkYXB0ZXIpOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBudW1fbXNpeDsgaSsrKSB7CiAJCWlmIChhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19NU0lYX0VOQUJMRUQpCkBAIC04NzksNiArODg3LDkgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQorCisJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IEludmFsaWQgbWFpbGJveCBjb21tYW5kIG9wY29kZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgdHlwZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTMwMjYsMTkgKzMwMzcsMTggQEAKIAlRTENSRFgoYWRhcHRlci0+YWh3LCBRTENfODNYWF9EUlZfVU5MT0NLKTsKIH0KIAotaW50IHFsY25pY184M3h4X21zX21lbV93cml0ZTEyOChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBhZGRyLAoraW50IHFsY25pY19tc19tZW1fd3JpdGUxMjgoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1NjQgYWRkciwKIAkJCQl1MzIgKmRhdGEsIHUzMiBjb3VudCkKIHsKIAlpbnQgaSwgaiwgcmV0ID0gMDsKIAl1MzIgdGVtcDsKLQlpbnQgZXJyID0gMDsKIAogCS8qIENoZWNrIGFsaWdubWVudCAqLwogCWlmIChhZGRyICYgMHhGKQogCQlyZXR1cm4gLUVJTzsKIAogCW11dGV4X2xvY2soJmFkYXB0ZXItPmFody0+bWVtX2xvY2spOwotCXFsY25pY184M3h4X3dydF9yZWdfaW5kaXJlY3QoYWRhcHRlciwgUUxDTklDX01TX0FERFJfSEksIDApOworCXFsY25pY19pbmRfd3IoYWRhcHRlciwgUUxDTklDX01TX0FERFJfSEksIDApOwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gMTYpIHsKIAkJaWYgKCEoKEFERFJfSU5fUkFOR0UoYWRkciwgUUxDTklDX0FERFJfUURSX05FVCwKQEAgLTMwNDksMjYgKzMwNTksMTYgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJcWxjbmljXzgzeHhfd3J0X3JlZ19pbmRpcmVjdChhZGFwdGVyLCBRTENOSUNfTVNfQUREUl9MTywgYWRkcik7Ci0JCXFsY25pY184M3h4X3dydF9yZWdfaW5kaXJlY3QoYWRhcHRlciwgUUxDTklDX01TX1dSVERBVEFfTE8sCi0JCQkJCSAgICAgKmRhdGErKyk7Ci0JCXFsY25pY184M3h4X3dydF9yZWdfaW5kaXJlY3QoYWRhcHRlciwgUUxDTklDX01TX1dSVERBVEFfSEksCi0JCQkJCSAgICAgKmRhdGErKyk7Ci0JCXFsY25pY184M3h4X3dydF9yZWdfaW5kaXJlY3QoYWRhcHRlciwgUUxDTklDX01TX1dSVERBVEFfVUxPLAotCQkJCQkgICAgICpkYXRhKyspOwotCQlxbGNuaWNfODN4eF93cnRfcmVnX2luZGlyZWN0KGFkYXB0ZXIsIFFMQ05JQ19NU19XUlREQVRBX1VISSwKLQkJCQkJICAgICAqZGF0YSsrKTsKLQkJcWxjbmljXzgzeHhfd3J0X3JlZ19pbmRpcmVjdChhZGFwdGVyLCBRTENOSUNfTVNfQ1RSTCwKLQkJCQkJICAgICBRTENOSUNfVEFfV1JJVEVfRU5BQkxFKTsKLQkJcWxjbmljXzgzeHhfd3J0X3JlZ19pbmRpcmVjdChhZGFwdGVyLCBRTENOSUNfTVNfQ1RSTCwKLQkJCQkJICAgICBRTENOSUNfVEFfV1JJVEVfU1RBUlQpOworCQlxbGNuaWNfaW5kX3dyKGFkYXB0ZXIsIFFMQ05JQ19NU19BRERSX0xPLCBhZGRyKTsKKwkJcWxjbmljX2luZF93cihhZGFwdGVyLCBRTENOSUNfTVNfV1JUREFUQV9MTywgKmRhdGErKyk7CisJCXFsY25pY19pbmRfd3IoYWRhcHRlciwgUUxDTklDX01TX1dSVERBVEFfSEksICpkYXRhKyspOworCQlxbGNuaWNfaW5kX3dyKGFkYXB0ZXIsIFFMQ05JQ19NU19XUlREQVRBX1VMTywgKmRhdGErKyk7CisJCXFsY25pY19pbmRfd3IoYWRhcHRlciwgUUxDTklDX01TX1dSVERBVEFfVUhJLCAqZGF0YSsrKTsKKwkJcWxjbmljX2luZF93cihhZGFwdGVyLCBRTENOSUNfTVNfQ1RSTCwgUUxDTklDX1RBX1dSSVRFX0VOQUJMRSk7CisJCXFsY25pY19pbmRfd3IoYWRhcHRlciwgUUxDTklDX01TX0NUUkwsIFFMQ05JQ19UQV9XUklURV9TVEFSVCk7CiAKIAkJZm9yIChqID0gMDsgaiA8IE1BWF9DVExfQ0hFQ0s7IGorKykgewotCQkJdGVtcCA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX01TX0NUUkwsICZlcnIpOwotCQkJaWYgKGVyciA9PSAtRUlPKSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5haHctPm1lbV9sb2NrKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQorCQkJdGVtcCA9IHFsY25pY19pbmRfcmQoYWRhcHRlciwgUUxDTklDX01TX0NUUkwpOwogCiAJCQlpZiAoKHRlbXAgJiBUQV9DVExfQlVTWSkgPT0gMCkKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaHcuaAppbmRleCA4OGQ4MDljLi4yYmYxMDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfODN4eF9ody5oCkBAIC00MTgsNyArNDE4LDYgQEAKICNkZWZpbmUgUUxDXzgzWFhfR0VUX0ZVTkNfTU9ERV9GUk9NX05QQVJfSU5GTyh2YWwpCSh2YWwgJiAweDgwMDAwMDAwKQogI2RlZmluZSBRTENfODNYWF9HRVRfTFJPX0NBUEFCSUxJVFkodmFsKQkJKHZhbCAmIDB4MjApCiAjZGVmaW5lIFFMQ184M1hYX0dFVF9MU09fQ0FQQUJJTElUWSh2YWwpCQkodmFsICYgMHg0MCkKLSNkZWZpbmUgUUxDXzgzWFhfR0VUX0xTT19DQVBBQklMSVRZKHZhbCkJCSh2YWwgJiAweDQwKQogI2RlZmluZSBRTENfODNYWF9HRVRfSFdfTFJPX0NBUEFCSUxJVFkodmFsKQkJKHZhbCAmIDB4NDAwKQogI2RlZmluZSBRTENfODNYWF9HRVRfVkxBTl9BTElHTl9DQVBBQklMSVRZKHZhbCkJKHZhbCAmIDB4NDAwMCkKICNkZWZpbmUgUUxDXzgzWFhfR0VUX0ZXX0xST19NU1NfQ0FQQUJJTElUWSh2YWwpCSh2YWwgJiAweDIwMDAwKQpAQCAtNTYwLDcgKzU1OSw3IEBACiB2b2lkIHFsY25pY184M3h4X25hcGlfZW5hYmxlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIHZvaWQgcWxjbmljXzgzeHhfbmFwaV9kaXNhYmxlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIGludCBxbGNuaWNfODN4eF9jb25maWdfbGVkKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1MzIsIHUzMik7Ci12b2lkIHFsY25pY19pbmRfd3Ioc3RydWN0IHFsY25pY19hZGFwdGVyICosIHUzMiwgdTMyKTsKK2ludCBxbGNuaWNfaW5kX3dyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1MzIsIHUzMik7CiBpbnQgcWxjbmljX2luZF9yZChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTMyKTsKIGludCBxbGNuaWNfODN4eF9jcmVhdGVfcnhfY3R4KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIGludCBxbGNuaWNfODN4eF9jcmVhdGVfdHhfY3R4KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLApAQCAtNjE3LDcgKzYxNiw2IEBACiBpbnQgcWxjbmljXzgzeHhfbG9ja19kcml2ZXIoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwogdm9pZCBxbGNuaWNfODN4eF91bmxvY2tfZHJpdmVyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIGludCBxbGNuaWNfODN4eF9zZXRfZGVmYXVsdF9vZmZsb2FkX3NldHRpbmdzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKLWludCBxbGNuaWNfODN4eF9tc19tZW1fd3JpdGUxMjgoc3RydWN0IHFsY25pY19hZGFwdGVyICosIHU2NCwgdTMyICosIHUzMik7CiBpbnQgcWxjbmljXzgzeHhfaWRjX3ZuaWNfcGZfZW50cnkoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwogaW50IHFsY25pY184M3h4X2Rpc2FibGVfdm5pY19tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCBpbnQpOwogaW50IHFsY25pY184M3h4X2NvbmZpZ192bmljX29wbW9kZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKik7CkBAIC02NTksNCArNjU3LDUgQEAKIHUzMiBxbGNuaWNfODN4eF9nZXRfY2FwX3NpemUodm9pZCAqLCBpbnQpOwogdm9pZCBxbGNuaWNfODN4eF9zZXRfc3lzX2luZm8odm9pZCAqLCBpbnQsIHUzMik7CiB2b2lkIHFsY25pY184M3h4X3N0b3JlX2NhcF9tYXNrKHZvaWQgKiwgdTMyKTsKK2ludCBxbGNuaWNfbXNfbWVtX3dyaXRlMTI4KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1NjQsIHUzMiAqLCB1MzIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2luaXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCmluZGV4IGJhMjBjNzIuLmYzMzU1OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCkBAIC0xMzYzLDggKzEzNjMsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiAxNiBieXRlIHdyaXRlIHRvIE1TIG1lbW9yeSAqLwotCXJldCA9IHFsY25pY184M3h4X21zX21lbV93cml0ZTEyOChhZGFwdGVyLCBkZXN0LCAodTMyICopcF9jYWNoZSwKLQkJCQkJICBzaXplIC8gMTYpOworCXJldCA9IHFsY25pY19tc19tZW1fd3JpdGUxMjgoYWRhcHRlciwgZGVzdCwgKHUzMiAqKXBfY2FjaGUsCisJCQkJICAgICBzaXplIC8gMTYpOwogCWlmIChyZXQpIHsKIAkJdmZyZWUocF9jYWNoZSk7CiAJCXJldHVybiByZXQ7CkBAIC0xMzg5LDggKzEzODksOCBAQAogCXBfY2FjaGUgPSAodTMyICopZnctPmRhdGE7CiAJYWRkciA9ICh1NjQpZGVzdDsKIAotCXJldCA9IHFsY25pY184M3h4X21zX21lbV93cml0ZTEyOChhZGFwdGVyLCBhZGRyLAotCQkJCQkgIHBfY2FjaGUsIHNpemUgLyAxNik7CisJcmV0ID0gcWxjbmljX21zX21lbV93cml0ZTEyOChhZGFwdGVyLCBhZGRyLAorCQkJCSAgICAgcF9jYWNoZSwgc2l6ZSAvIDE2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIk1TIG1lbW9yeSB3cml0ZSBmYWlsZWRcbiIpOwogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKQEAgLTE0MDUsOCArMTQwNSw4IEBACiAJCQlkYXRhW2ldID0gZnctPmRhdGFbc2l6ZSArIGldOwogCQlmb3IgKDsgaSA8IDE2OyBpKyspCiAJCQlkYXRhW2ldID0gMDsKLQkJcmV0ID0gcWxjbmljXzgzeHhfbXNfbWVtX3dyaXRlMTI4KGFkYXB0ZXIsIGFkZHIsCi0JCQkJCQkgICh1MzIgKilkYXRhLCAxKTsKKwkJcmV0ID0gcWxjbmljX21zX21lbV93cml0ZTEyOChhZGFwdGVyLCBhZGRyLAorCQkJCQkgICAgICh1MzIgKilkYXRhLCAxKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJNUyBtZW1vcnkgd3JpdGUgZmFpbGVkXG4iKTsKQEAgLTIxODEsNiArMjE4MSw4IEBACiAJCW1heF9zZHNfcmluZ3MgPSBRTENOSUNfTUFYX1NEU19SSU5HUzsKIAkJbWF4X3R4X3JpbmdzID0gUUxDTklDX01BWF9UWF9SSU5HUzsKIAl9IGVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogSW52YWxpZCBvcG1vZGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19jdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2N0eC5jCmluZGV4IGMxZTExZjUuLjMwNGUyNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2N0eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2N0eC5jCkBAIC0xMDI3LDggKzEwMjcsMTEgQEAKIAl1MzIgYXJnMTsKIAogCWlmIChhZGFwdGVyLT5haHctPm9wX21vZGUgIT0gUUxDTklDX01HTVRfRlVOQyB8fAotCSAgICAhKGFkYXB0ZXItPmVzd2l0Y2hbaWRdLmZsYWdzICYgUUxDTklDX1NXSVRDSF9FTkFCTEUpKQorCSAgICAhKGFkYXB0ZXItPmVzd2l0Y2hbaWRdLmZsYWdzICYgUUxDTklDX1NXSVRDSF9FTkFCTEUpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBOb3QgYSBtYW5hZ2VtZW50IGZ1bmN0aW9uXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gZXJyOworCX0KIAogCWFyZzEgPSBpZCB8IChlbmFibGVfbWlycm9yaW5nID8gQklUXzQgOiAwKTsKIAlhcmcxIHw9IHBjaV9mdW5jIDw8IDg7CkBAIC0xMzE4LDggKzEzMjEsMTIgQEAKIAl1MzIgYXJnMSwgYXJnMiA9IDA7CiAJdTggcGNpX2Z1bmM7CiAKLQlpZiAoYWRhcHRlci0+YWh3LT5vcF9tb2RlICE9IFFMQ05JQ19NR01UX0ZVTkMpCisJaWYgKGFkYXB0ZXItPmFody0+b3BfbW9kZSAhPSBRTENOSUNfTUdNVF9GVU5DKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBOb3QgYSBtYW5hZ2VtZW50IGZ1bmN0aW9uXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gZXJyOworCX0KKwogCXBjaV9mdW5jID0gZXN3X2NmZy0+cGNpX2Z1bmM7CiAJaW5kZXggPSBxbGNuaWNfaXNfdmFsaWRfbmljX2Z1bmMoYWRhcHRlciwgcGNpX2Z1bmMpOwogCWlmIChpbmRleCA8IDApCkBAIC0xMzYzLDYgKzEzNzAsOCBAQAogCQkJYXJnMSAmPSB+KDB4MGZmZmYgPDwgMTYpOwogCQkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IEludmFsaWQgb3Btb2RlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgZXN3X2NmZy0+b3BfbW9kZSk7CiAJCXJldHVybiBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ldGh0b29sLmMKaW5kZXggNWJhY2Y1Mi4uMWI3ZjNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYwpAQCAtNzI2LDYgKzcyNiwxMSBAQAogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVycjsKIAorCWlmICghKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX01TSVhfRU5BQkxFRCkpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJObyBSU1MvVFNTIHN1cHBvcnQgaW4gbm9uIE1TSS1YIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoY2hhbm5lbC0+b3RoZXJfY291bnQgfHwgY2hhbm5lbC0+Y29tYmluZWRfY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03MzQsNyArNzM5LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGNoYW5uZWwtPnJ4X2NvdW50KSB7CisJaWYgKGFkYXB0ZXItPmRydl9zZHNfcmluZ3MgIT0gY2hhbm5lbC0+cnhfY291bnQpIHsKIAkJZXJyID0gcWxjbmljX3ZhbGlkYXRlX3JpbmdzKGFkYXB0ZXIsIGNoYW5uZWwtPnJ4X2NvdW50LAogCQkJCQkgICAgUUxDTklDX1JYX1FVRVVFKTsKIAkJaWYgKGVycikgewpAQCAtNzQ1LDcgKzc1MCw3IEBACiAJCWFkYXB0ZXItPmRydl9yc3NfcmluZ3MgPSBjaGFubmVsLT5yeF9jb3VudDsKIAl9CiAKLQlpZiAoY2hhbm5lbC0+dHhfY291bnQpIHsKKwlpZiAoYWRhcHRlci0+ZHJ2X3R4X3JpbmdzICE9IGNoYW5uZWwtPnR4X2NvdW50KSB7CiAJCWVyciA9IHFsY25pY192YWxpZGF0ZV9yaW5ncyhhZGFwdGVyLCBjaGFubmVsLT50eF9jb3VudCwKIAkJCQkJICAgIFFMQ05JQ19UWF9RVUVVRSk7CiAJCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ody5jCmluZGV4IDlmM2FkZjQuLjg1MWNiNGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2h3LmMKQEAgLTM3MywxMiArMzczLDE2IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXZvaWQgcWxjbmljX2luZF93cihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgZGF0YSkKK2ludCBxbGNuaWNfaW5kX3dyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBkYXRhKQogeworCWludCByZXQgPSAwOworCiAJaWYgKHFsY25pY184Mnh4X2NoZWNrKGFkYXB0ZXIpKQogCQlxbGNuaWNfd3JpdGVfd2luZG93X3JlZyhhZGRyLCBhZGFwdGVyLT5haHctPnBjaV9iYXNlMCwgZGF0YSk7CiAJZWxzZQotCQlxbGNuaWNfODN4eF93cnRfcmVnX2luZGlyZWN0KGFkYXB0ZXIsIGFkZHIsIGRhdGEpOworCQlyZXQgPSBxbGNuaWNfODN4eF93cnRfcmVnX2luZGlyZWN0KGFkYXB0ZXIsIGFkZHIsIGRhdGEpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludApAQCAtNTY3LDI4ICs1NzEsMTQgQEAKIHZvaWQgcWxjbmljX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHFsY25pY19tYWNfdmxhbl9saXN0ICpjdXI7Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQlzaXplX3QgdGVtcDsKIAogCWlmICghdGVzdF9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKLQlpZiAocWxjbmljX3NyaW92X3ZmX2NoZWNrKGFkYXB0ZXIpKSB7Ci0JCWlmICghbmV0ZGV2X21jX2VtcHR5KG5ldGRldikpIHsKLQkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpIHsKLQkJCQl0ZW1wID0gc2l6ZW9mKHN0cnVjdCBxbGNuaWNfbWFjX3ZsYW5fbGlzdCk7Ci0JCQkJY3VyID0ga3phbGxvYyh0ZW1wLCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAoY3VyID09IE5VTEwpCi0JCQkJCWJyZWFrOwotCQkJCW1lbWNweShjdXItPm1hY19hZGRyLAotCQkJCSAgICAgICBoYS0+YWRkciwgRVRIX0FMRU4pOwotCQkJCWxpc3RfYWRkX3RhaWwoJmN1ci0+bGlzdCwgJmFkYXB0ZXItPnZmX21jX2xpc3QpOwotCQkJfQotCQl9Ci0JCXFsY25pY19zcmlvdl92Zl9zY2hlZHVsZV9tdWx0aShhZGFwdGVyLT5uZXRkZXYpOwotCQlyZXR1cm47Ci0JfQotCV9fcWxjbmljX3NldF9tdWx0aShuZXRkZXYsIDApOworCisJaWYgKHFsY25pY19zcmlvdl92Zl9jaGVjayhhZGFwdGVyKSkKKwkJcWxjbmljX3NyaW92X3ZmX3NldF9tdWx0aShuZXRkZXYpOworCWVsc2UKKwkJX19xbGNuaWNfc2V0X211bHRpKG5ldGRldiwgMCk7CiB9CiAKIGludCBxbGNuaWNfODJ4eF9uaWNfc2V0X3Byb21pc2Moc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgbW9kZSkKQEAgLTYzMCw3ICs2MjAsNyBAQAogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCWludCBpOwotCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CiAJdTggY21kOwogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmZoYXNoLmZidWNrZXRfc2l6ZTsgaSsrKSB7CkBAIC02MzgsOCArNjI4LDggQEAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBfZmlsLCBuLCBoZWFkLCBmbm9kZSkgewogCQkJY21kID0gIHRtcF9maWwtPnZsYW5faWQgPyBRTENOSUNfTUFDX1ZMQU5fREVMIDoKIAkJCQkJCSAgUUxDTklDX01BQ19ERUw7Ci0JCQl0aW1lID0gdG1wX2ZpbC0+ZnRpbWU7Ci0JCQlpZiAoamlmZmllcyA+IChRTENOSUNfRklMVEVSX0FHRSAqIEhaICsgdGltZSkpIHsKKwkJCWV4cGlyZXMgPSB0bXBfZmlsLT5mdGltZSArIFFMQ05JQ19GSUxURVJfQUdFICogSFo7CisJCQlpZiAodGltZV9iZWZvcmUoZXhwaXJlcywgamlmZmllcykpIHsKIAkJCQlxbGNuaWNfc3JlX21hY2FkZHJfY2hhbmdlKGFkYXB0ZXIsCiAJCQkJCQkJICB0bXBfZmlsLT5mYWRkciwKIAkJCQkJCQkgIHRtcF9maWwtPnZsYW5faWQsCkBAIC02NTcsOCArNjQ3LDggQEAKIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9maWwsIG4sIGhlYWQsIGZub2RlKQogCQl7Ci0JCQl0aW1lID0gdG1wX2ZpbC0+ZnRpbWU7Ci0JCQlpZiAoamlmZmllcyA+IChRTENOSUNfRklMVEVSX0FHRSAqIEhaICsgdGltZSkpIHsKKwkJCWV4cGlyZXMgPSB0bXBfZmlsLT5mdGltZSArIFFMQ05JQ19GSUxURVJfQUdFICogSFo7CisJCQlpZiAodGltZV9iZWZvcmUoZXhwaXJlcywgamlmZmllcykpIHsKIAkJCQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnJ4X21hY19sZWFybl9sb2NrKTsKIAkJCQlhZGFwdGVyLT5yeF9maGFzaC5mbnVtLS07CiAJCQkJaGxpc3RfZGVsKCZ0bXBfZmlsLT5mbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19pby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYwppbmRleCAxNzNiM2QxLi5lNDViZjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19pby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2lvLmMKQEAgLTMwNSw3ICszMDUsNiBAQAogewogCXN0cnVjdCB2bGFuX2V0aGhkciAqdmggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopKHNrYi0+ZGF0YSk7CiAJc3RydWN0IGV0aGhkciAqcGhkciA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAl1MTYgcHJvdG9jb2wgPSBudG9ocyhza2ItPnByb3RvY29sKTsKIAlzdHJ1Y3QgcWxjbmljX2ZpbHRlciAqZmlsLCAqdG1wX2ZpbDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTMxNCwyNyArMzEzLDE2IEBACiAJdTE2IHZsYW5faWQgPSAwOwogCXU4IGhpbmRleCwgaHZhbDsKIAotCWlmICghcWxjbmljX3NyaW92X3BmX2NoZWNrKGFkYXB0ZXIpKSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBoZHItPmhfc291cmNlLCBhZGFwdGVyLT5tYWNfYWRkcikpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKKwlpZiAoZXRoZXJfYWRkcl9lcXVhbChwaGRyLT5oX3NvdXJjZSwgYWRhcHRlci0+bWFjX2FkZHIpKQorCQlyZXR1cm47CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfVkxBTl9GSUxURVJJTkcpIHsKIAkJaWYgKHByb3RvY29sID09IEVUSF9QXzgwMjFRKSB7CiAJCQl2aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7CiAJCQl2bGFuX2lkID0gbnRvaHModmgtPmhfdmxhbl9UQ0kpOwogCQl9IGVsc2UgaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewogCQkJdmxhbl9pZCA9IHZsYW5fdHhfdGFnX2dldChza2IpOwogCQl9Ci0KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGhkci0+aF9zb3VyY2UsIGFkYXB0ZXItPm1hY19hZGRyKSAmJgotCQkgICAgIXZsYW5faWQpCi0JCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFkYXB0ZXItPmZoYXNoLmZudW0gPj0gYWRhcHRlci0+Zmhhc2guZm1heCkgewotCQlhZGFwdGVyLT5zdGF0cy5tYWNfZmlsdGVyX2xpbWl0X292ZXJydW4rKzsKLQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiQ2FuIG5vdCBhZGQgbW9yZSB0aGFuICVkIG1hYy12bGFuIGZpbHRlcnMsIGNvbmZpZ3VyZWQgJWRcbiIsCi0JCQkgICAgYWRhcHRlci0+Zmhhc2guZm1heCwgYWRhcHRlci0+Zmhhc2guZm51bSk7Ci0JCXJldHVybjsKIAl9CiAKIAltZW1jcHkoJnNyY19hZGRyLCBwaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOwpAQCAtMzUzLDYgKzM0MSwxMSBAQAogCQl9CiAJfQogCisJaWYgKHVubGlrZWx5KGFkYXB0ZXItPmZoYXNoLmZudW0gPj0gYWRhcHRlci0+Zmhhc2guZm1heCkpIHsKKwkJYWRhcHRlci0+c3RhdHMubWFjX2ZpbHRlcl9saW1pdF9vdmVycnVuKys7CisJCXJldHVybjsKKwl9CisKIAlmaWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWxjbmljX2ZpbHRlciksIEdGUF9BVE9NSUMpOwogCWlmICghZmlsKQogCQlyZXR1cm47CkBAIC0xMjE2LDggKzEyMDksNyBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gYnVmZmVyOwogCi0JaWYgKGFkYXB0ZXItPmRydl9tYWNfbGVhcm4gJiYKLQkgICAgKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkpIHsKKwlpZiAoYWRhcHRlci0+cnhfbWFjX2xlYXJuKSB7CiAJCXRfdmlkID0gMDsKIAkJaXNfbGJfcGt0ID0gcWxjbmljXzgyeHhfaXNfbGJfcGt0KHN0c19kYXRhMCk7CiAJCXFsY25pY19hZGRfbGJfZmlsdGVyKGFkYXB0ZXIsIHNrYiwgaXNfbGJfcGt0LCB0X3ZpZCk7CkBAIC0xMjkzLDggKzEyODUsNyBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gYnVmZmVyOwogCi0JaWYgKGFkYXB0ZXItPmRydl9tYWNfbGVhcm4gJiYKLQkgICAgKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkpIHsKKwlpZiAoYWRhcHRlci0+cnhfbWFjX2xlYXJuKSB7CiAJCXRfdmlkID0gMDsKIAkJaXNfbGJfcGt0ID0gcWxjbmljXzgyeHhfaXNfbGJfcGt0KHN0c19kYXRhMCk7CiAJCXFsY25pY19hZGRfbGJfZmlsdGVyKGFkYXB0ZXIsIHNrYiwgaXNfbGJfcGt0LCB0X3ZpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKaW5kZXggN2U1NWU4OC4uNGZjMTg2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwpAQCAtMzc4LDcgKzM3OCw4IEBACiAJaWYgKCFhZGFwdGVyLT5mZGJfbWFjX2xlYXJuKQogCQlyZXR1cm4gbmRvX2RmbHRfZmRiX2RlbChuZG0sIHRiLCBuZXRkZXYsIGFkZHIpOwogCi0JaWYgKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgeworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRVNXSVRDSF9FTkFCTEVEKSB8fAorCSAgICBxbGNuaWNfc3Jpb3ZfY2hlY2soYWRhcHRlcikpIHsKIAkJaWYgKGlzX3VuaWNhc3RfZXRoZXJfYWRkcihhZGRyKSkgewogCQkJZXJyID0gZGV2X3VjX2RlbChuZXRkZXYsIGFkZHIpOwogCQkJaWYgKCFlcnIpCkBAIC00MDIsNyArNDAzLDggQEAKIAlpZiAoIWFkYXB0ZXItPmZkYl9tYWNfbGVhcm4pCiAJCXJldHVybiBuZG9fZGZsdF9mZGJfYWRkKG5kbSwgdGIsIG5ldGRldiwgYWRkciwgZmxhZ3MpOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRVNXSVRDSF9FTkFCTEVEKSkgeworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgJiYKKwkgICAgIXFsY25pY19zcmlvdl9jaGVjayhhZGFwdGVyKSkgewogCQlwcl9pbmZvKCIlczogRkRCIGUtc3dpdGNoIGlzIG5vdCBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC00MzIsNyArNDM0LDggQEAKIAlpZiAoIWFkYXB0ZXItPmZkYl9tYWNfbGVhcm4pCiAJCXJldHVybiBuZG9fZGZsdF9mZGJfZHVtcChza2IsIG5jYiwgbmV0ZGV2LCBpZHgpOwogCi0JaWYgKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgfHwKKwkgICAgcWxjbmljX3NyaW92X2NoZWNrKGFkYXB0ZXIpKQogCQlpZHggPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIG5jYiwgbmV0ZGV2LCBpZHgpOwogCiAJcmV0dXJuIGlkeDsKQEAgLTUyMiw3ICs1MjUsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1FMQ05JQ19TUklPVgogCS5uZG9fc2V0X3ZmX21hYwkJPSBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX21hYywKLQkubmRvX3NldF92Zl90eF9yYXRlCT0gcWxjbmljX3NyaW92X3NldF92Zl90eF9yYXRlLAorCS5uZG9fc2V0X3ZmX3JhdGUJPSBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3R4X3JhdGUsCiAJLm5kb19nZXRfdmZfY29uZmlnCT0gcWxjbmljX3NyaW92X2dldF92Zl9jb25maWcsCiAJLm5kb19zZXRfdmZfdmxhbgk9IHFsY25pY19zcmlvdl9zZXRfdmZfdmxhbiwKIAkubmRvX3NldF92Zl9zcG9vZmNoawk9IHFsY25pY19zcmlvdl9zZXRfdmZfc3Bvb2ZjaGssCkBAIC02OTAsMTAgKzY5MywxMCBAQAogCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbdmVjdG9yXS5lbnRyeSA9IHZlY3RvcjsKIAogcmVzdG9yZToKLQllcnIgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgYWRhcHRlci0+bXNpeF9lbnRyaWVzLCBudW1fbXNpeCk7Ci0JaWYgKGVyciA+IDApIHsKKwllcnIgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QocGRldiwgYWRhcHRlci0+bXNpeF9lbnRyaWVzLCBudW1fbXNpeCk7CisJaWYgKGVyciA9PSAtRU5PU1BDKSB7CiAJCWlmICghYWRhcHRlci0+ZHJ2X3Rzc19yaW5ncyAmJiAhYWRhcHRlci0+ZHJ2X3Jzc19yaW5ncykKLQkJCXJldHVybiAtRU5PU1BDOworCQkJcmV0dXJuIGVycjsKIAogCQluZXRkZXZfaW5mbyhhZGFwdGVyLT5uZXRkZXYsCiAJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBNU0ktWCB2ZWN0b3JzLCBBdmFpbGFibGUgdmVjdG9ycyAlZFxuIiwKQEAgLTEwMTQsNiArMTAxNyw4IEBACiAKIAkJaWYgKHBmbiA+PSBhaHctPm1heF92bmljX2Z1bmMpIHsKIAkJCXJldCA9IFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IEludmFsaWQgZnVuY3Rpb24gMHgleCwgbWF4IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBmbiwgYWh3LT5tYXhfdm5pY19mdW5jKTsKIAkJCWdvdG8gZXJyX2Vzd2l0Y2g7CiAJCX0KIApAQCAtMTkxNSw4ICsxOTIwLDYgQEAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChfX1FMQ05JQ19ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWlmIChxbGNuaWNfc3Jpb3ZfdmZfY2hlY2soYWRhcHRlcikpCi0JCXFsY25pY19zcmlvdl9jbGVhbnVwX2FzeW5jX2xpc3QoJmFkYXB0ZXItPmFody0+c3Jpb3YtPmJjKTsKIAlzbXBfbWIoKTsKIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCWFkYXB0ZXItPmFody0+bGlua3VwID0gMDsKQEAgLTE5MjgsNiArMTkzMSw4IEBACiAJCXFsY25pY19kZWxldGVfbGJfZmlsdGVycyhhZGFwdGVyKTsKIAogCXFsY25pY19uaWNfc2V0X3Byb21pc2MoYWRhcHRlciwgUUxDTklDX05JVV9OT05fUFJPTUlTQ19NT0RFKTsKKwlpZiAocWxjbmljX3NyaW92X3ZmX2NoZWNrKGFkYXB0ZXIpKQorCQlxbGNuaWNfc3Jpb3ZfY2xlYW51cF9hc3luY19saXN0KCZhZGFwdGVyLT5haHctPnNyaW92LT5iYyk7CiAKIAlxbGNuaWNfbmFwaV9kaXNhYmxlKGFkYXB0ZXIpOwogCkBAIC0yMDUyLDYgKzIwNTcsNyBAQAogCiBzdGF0aWMgaW50IHFsY25pY19hbGxvY19hZGFwdGVyX3Jlc291cmNlcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IHFsY25pY19oYXJkd2FyZV9jb250ZXh0ICphaHcgPSBhZGFwdGVyLT5haHc7CiAJaW50IGVyciA9IDA7CiAKIAlhZGFwdGVyLT5yZWN2X2N0eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGNuaWNfcmVjdl9jb250ZXh0KSwKQEAgLTIwNjEsNiArMjA2NywxOCBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKHFsY25pY184M3h4X2NoZWNrKGFkYXB0ZXIpKSB7CisJCWFody0+Y29hbC50eXBlID0gUUxDTklDX0lOVFJfQ09BTF9UWVBFX1JYX1RYOworCQlhaHctPmNvYWwudHhfdGltZV91cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9UWF9USU1FX1VTOworCQlhaHctPmNvYWwudHhfcGFja2V0cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9UWF9QQUNLRVRTOworCQlhaHctPmNvYWwucnhfdGltZV91cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9SWF9USU1FX1VTOworCQlhaHctPmNvYWwucnhfcGFja2V0cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9SWF9QQUNLRVRTOworCX0gZWxzZSB7CisJCWFody0+Y29hbC50eXBlID0gUUxDTklDX0lOVFJfQ09BTF9UWVBFX1JYOworCQlhaHctPmNvYWwucnhfdGltZV91cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9SWF9USU1FX1VTOworCQlhaHctPmNvYWwucnhfcGFja2V0cyA9IFFMQ05JQ19ERUZfSU5UUl9DT0FMRVNDRV9SWF9QQUNLRVRTOworCX0KKwogCS8qIGNsZWFyIHN0YXRzICovCiAJbWVtc2V0KCZhZGFwdGVyLT5zdGF0cywgMCwgc2l6ZW9mKGFkYXB0ZXItPnN0YXRzKSk7CiBlcnJfb3V0OgpAQCAtMjA2OSwxMiArMjA4NywyMCBAQAogCiBzdGF0aWMgdm9pZCBxbGNuaWNfZnJlZV9hZGFwdGVyX3Jlc291cmNlcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IHFsY25pY19md19kdW1wICpmd19kdW1wID0gJmFkYXB0ZXItPmFody0+ZndfZHVtcDsKKwogCWtmcmVlKGFkYXB0ZXItPnJlY3ZfY3R4KTsKIAlhZGFwdGVyLT5yZWN2X2N0eCA9IE5VTEw7CiAKLQlpZiAoYWRhcHRlci0+YWh3LT5md19kdW1wLnRtcGxfaGRyKSB7Ci0JCXZmcmVlKGFkYXB0ZXItPmFody0+ZndfZHVtcC50bXBsX2hkcik7Ci0JCWFkYXB0ZXItPmFody0+ZndfZHVtcC50bXBsX2hkciA9IE5VTEw7CisJaWYgKGZ3X2R1bXAtPnRtcGxfaGRyKSB7CisJCXZmcmVlKGZ3X2R1bXAtPnRtcGxfaGRyKTsKKwkJZndfZHVtcC0+dG1wbF9oZHIgPSBOVUxMOworCX0KKworCWlmIChmd19kdW1wLT5kbWFfYnVmZmVyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIFFMQ19QRVhfRE1BX1JFQURfU0laRSwKKwkJCQkgIGZ3X2R1bXAtPmRtYV9idWZmZXIsIGZ3X2R1bXAtPnBoeXNfYWRkcik7CisJCWZ3X2R1bXAtPmRtYV9idWZmZXIgPSBOVUxMOwogCX0KIAogCWtmcmVlKGFkYXB0ZXItPmFody0+cmVzZXQuYnVmZik7CkBAIC0yMjQ3LDEwICsyMjczLDggQEAKIAogCXFsY25pY19jaGFuZ2VfbXR1KG5ldGRldiwgbmV0ZGV2LT5tdHUpOwogCi0JaWYgKHFsY25pY19zcmlvdl92Zl9jaGVjayhhZGFwdGVyKSkKLQkJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnFsY25pY19zcmlvdl92Zl9ldGh0b29sX29wcyk7Ci0JZWxzZQotCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmcWxjbmljX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gKHFsY25pY19zcmlvdl92Zl9jaGVjayhhZGFwdGVyKSkgPworCQkmcWxjbmljX3NyaW92X3ZmX2V0aHRvb2xfb3BzIDogJnFsY25pY19ldGh0b29sX29wczsKIAogCW5ldGRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1JYQ1NVTSB8CiAJCQkgICAgIE5FVElGX0ZfSVBWNl9DU1VNIHwgTkVUSUZfRl9HUk8gfApAQCAtMjQxNyw5ICsyNDQxLDYgQEAKIAlpbnQgZXJyLCBwY2lfdXNpbmdfZGFjID0gLTE7CiAJY2hhciBib2FyZF9uYW1lW1FMQ05JQ19NQVhfQk9BUkRfTkFNRV9MRU4gKyAxOV07IC8qIE1BQyArICI6ICIgKyBuYW1lICovCiAKLQlpZiAocGRldi0+aXNfdmlydGZuKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0yNTUyLDkgKzI1NzMsMTEgQEAKIAkJCWNhc2UgLUVOT01FTToKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBZGFwdGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZC4gUGxlYXNlIHJlYm9vdFxuIik7CiAJCQkJZ290byBlcnJfb3V0X2ZyZWVfaHc7CisJCQljYXNlIC1FT1BOT1RTVVBQOgorCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycl9vdXRfZnJlZV9odzsKIAkJCWRlZmF1bHQ6Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWRhcHRlciBpbml0aWFsaXphdGlvbiBmYWlsZWQuIEEgcmVib290IG1heSBiZSByZXF1aXJlZCB0byByZWNvdmVyIGZyb20gdGhpcyBmYWlsdXJlXG4iKTsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJZiByZWJvb3QgZG9lcyBub3QgaGVscCB0byByZWNvdmVyIGZyb20gdGhpcyBmYWlsdXJlLCB0cnkgYSBmbGFzaCB1cGRhdGUgb2YgdGhlIGFkYXB0ZXJcbiIpOworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBEcml2ZXIgd2lsbCBsb2FkIGluIG1haW50ZW5hbmNlIG1vZGUgdG8gcmVjb3ZlciB0aGUgYWRhcHRlciB1c2luZyB0aGUgYXBwbGljYXRpb25cbiIpOwogCQkJCWdvdG8gZXJyX291dF9tYWludGVuYW5jZV9tb2RlOwogCQkJfQogCQl9CkBAIC0yNjI4LDcgKzI2NTEsNyBAQAogCQlxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oYWRhcHRlcik7CiAKIAlxbGNuaWNfYWRkX3N5c2ZzKGFkYXB0ZXIpOwotCisJcWxjbmljX3JlZ2lzdGVyX2h3bW9uX2RldihhZGFwdGVyKTsKIAlyZXR1cm4gMDsKIAogZXJyX291dF9kaXNhYmxlX21ieF9pbnRyOgpAQCAtMjY2NSw3ICsyNjg4LDcgQEAKIGVycl9vdXRfbWFpbnRlbmFuY2VfbW9kZToKIAlzZXRfYml0KF9fUUxDTklDX01BSU5URU5BTkNFX01PREUsICZhZGFwdGVyLT5zdGF0ZSk7CiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJnFsY25pY19uZXRkZXZfZmFpbGVkX29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmcWxjbmljX2V0aHRvb2xfZmFpbGVkX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZxbGNuaWNfZXRodG9vbF9mYWlsZWRfb3BzOwogCWFody0+cG9ydF90eXBlID0gUUxDTklDX1hHQkU7CiAKIAlpZiAocWxjbmljXzgzeHhfY2hlY2soYWRhcHRlcikpCkBAIC0yNjk4LDkgKzI3MjEsOSBAQAogCQlyZXR1cm47CiAKIAluZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JcWxjbmljX3NyaW92X3BmX2Rpc2FibGUoYWRhcHRlcik7CiAKIAlxbGNuaWNfY2FuY2VsX2lkY193b3JrKGFkYXB0ZXIpOworCXFsY25pY19zcmlvdl9wZl9kaXNhYmxlKGFkYXB0ZXIpOwogCWFodyA9IGFkYXB0ZXItPmFodzsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CkBAIC0yNzM1LDYgKzI3NTgsOCBAQAogCiAJcWxjbmljX3JlbW92ZV9zeXNmcyhhZGFwdGVyKTsKIAorCXFsY25pY191bnJlZ2lzdGVyX2h3bW9uX2RldihhZGFwdGVyKTsKKwogCXFsY25pY19jbGVhbnVwX3BjaV9tYXAoYWRhcHRlci0+YWh3KTsKIAogCXFsY25pY19yZWxlYXNlX2Zpcm13YXJlKGFkYXB0ZXIpOwpAQCAtMjgyOCw2ICsyODUzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBRTENOSUNfVkZfTEJfQlVDS0VUX1NJWkUgMQorCiB2b2lkIHFsY25pY19hbGxvY19sYl9maWx0ZXJzX21lbShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdm9pZCAqaGVhZDsKQEAgLTI4NDMsNyArMjg3MCwxMCBAQAogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tYWNfbGVhcm5fbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnJ4X21hY19sZWFybl9sb2NrKTsKIAotCWlmIChxbGNuaWNfODJ4eF9jaGVjayhhZGFwdGVyKSkgeworCWlmIChxbGNuaWNfc3Jpb3ZfdmZfY2hlY2soYWRhcHRlcikpIHsKKwkJZmlsdGVyX3NpemUgPSBRTENOSUNfODNYWF9TUklPVl9WRl9NQVhfTUFDIC0gMTsKKwkJYWRhcHRlci0+Zmhhc2guZmJ1Y2tldF9zaXplID0gUUxDTklDX1ZGX0xCX0JVQ0tFVF9TSVpFOworCX0gZWxzZSBpZiAocWxjbmljXzgyeHhfY2hlY2soYWRhcHRlcikpIHsKIAkJZmlsdGVyX3NpemUgPSBRTENOSUNfTEJfTUFYX0ZJTFRFUlM7CiAJCWFkYXB0ZXItPmZoYXNoLmZidWNrZXRfc2l6ZSA9IFFMQ05JQ19MQl9CVUNLRVRfU0laRTsKIAl9IGVsc2UgewpAQCAtMzk3MywxNiArNDAwMyw2IEBACiAJCXN0cmNweShidWYsICJUeCIpOwogCX0KIAotCWlmICghUUxDTklDX0lTX01TSV9GQU1JTFkoYWRhcHRlcikpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBSU1MvVFNTIHN1cHBvcnQgaW4gSU5ULXggbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19NU0lfRU5BQkxFRCkgewotCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIFJTUy9UU1Mgc3VwcG9ydCBpbiBNU0kgbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmICghaXNfcG93ZXJfb2ZfMihyaW5nX2NudCkpIHsKIAkJbmV0ZGV2X2VycihuZXRkZXYsICIlcyByaW5ncyB2YWx1ZSBzaG91bGQgYmUgYSBwb3dlciBvZiAyXG4iLAogCQkJICAgYnVmKTsKQEAgLTQxMjIsNyArNDE0Miw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIGFkYXB0ZXItPnZsYW5zLCBWTEFOX05fVklEKSB7Ci0JCWRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKG5ldGRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOworCQlkZXYgPSBfX3ZsYW5fZmluZF9kZXZfZGVlcF9yY3UobmV0ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIHZpZCk7CiAJCWlmICghZGV2KQogCQkJY29udGludWU7CiAJCXFsY25pY19jb25maWdfaW5kZXZfYWRkcihhZGFwdGVyLCBkZXYsIGV2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21pbmlkdW1wLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19taW5pZHVtcC5jCmluZGV4IDM3Yjk3OWIuLmU0NmZjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21pbmlkdW1wLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWluaWR1bXAuYwpAQCAtMjM4LDYgKzIzOCw4IEBACiAKIAloZHItPmRydl9jYXBfbWFzayA9IGhkci0+Y2FwX21hc2s7CiAJZndfZHVtcC0+Y2FwX21hc2sgPSBoZHItPmNhcF9tYXNrOworCisJZndfZHVtcC0+dXNlX3BleF9kbWEgPSAoaGRyLT5jYXBhYmlsaXRpZXMgJiBCSVRfMCkgPyB0cnVlIDogZmFsc2U7CiB9CiAKIGlubGluZSB1MzIgcWxjbmljXzgyeHhfZ2V0X2NhcF9zaXplKHZvaWQgKnRfaGRyLCBpbnQgaW5kZXgpCkBAIC0yNzYsNiArMjc4LDggQEAKIAloZHItPnNhdmVkX3N0YXRlW2luZGV4XSA9IHZhbHVlOwogfQogCisjZGVmaW5lIFFMQ05JQ19URU1QTEFURV9WRVJTSU9OICgweDIwMDAxKQorCiB2b2lkIHFsY25pY184M3h4X2NhY2hlX3RtcGxfaGRyX3ZhbHVlcyhzdHJ1Y3QgcWxjbmljX2Z3X2R1bXAgKmZ3X2R1bXApCiB7CiAJc3RydWN0IHFsY25pY184M3h4X2R1bXBfdGVtcGxhdGVfaGRyICpoZHI7CkBAIC0yODgsNiArMjkyLDkgQEAKIAogCWhkci0+ZHJ2X2NhcF9tYXNrID0gaGRyLT5jYXBfbWFzazsKIAlmd19kdW1wLT5jYXBfbWFzayA9IGhkci0+Y2FwX21hc2s7CisKKwlmd19kdW1wLT51c2VfcGV4X2RtYSA9IChmd19kdW1wLT52ZXJzaW9uICYgMHhmZmZmZikgPj0KKwkJCSAgICAgICBRTENOSUNfVEVNUExBVEVfVkVSU0lPTjsKIH0KIAogaW5saW5lIHUzMiBxbGNuaWNfODN4eF9nZXRfY2FwX3NpemUodm9pZCAqdF9oZHIsIGludCBpbmRleCkKQEAgLTY1MywzNCArNjYwLDMxIEBACiAjZGVmaW5lIFFMQ19ETUFfQ01EX0JVRkZfQUREUl9ISQk0CiAjZGVmaW5lIFFMQ19ETUFfQ01EX1NUQVRVU19DVFJMCQk4CiAKLSNkZWZpbmUgUUxDX1BFWF9ETUFfUkVBRF9TSVpFCQkoUEFHRV9TSVpFICogMTYpCi0KIHN0YXRpYyBpbnQgcWxjbmljX3N0YXJ0X3BleF9kbWEoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAogCQkJCXN0cnVjdCBfX21lbSAqbWVtKQogewotCXN0cnVjdCBxbGNuaWNfODN4eF9kdW1wX3RlbXBsYXRlX2hkciAqdG1wbF9oZHI7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKIAl1MzIgZG1hX25vLCBkbWFfYmFzZV9hZGRyLCB0ZW1wX2FkZHI7CiAJaW50IGksIHJldCwgZG1hX3N0czsKKwl2b2lkICp0bXBsX2hkcjsKIAogCXRtcGxfaGRyID0gYWRhcHRlci0+YWh3LT5md19kdW1wLnRtcGxfaGRyOwotCWRtYV9ubyA9IHRtcGxfaGRyLT5zYXZlZF9zdGF0ZVtRTENfODNYWF9ETUFfRU5HSU5FX0lOREVYXTsKKwlkbWFfbm8gPSBxbGNuaWNfZ2V0X3NhdmVkX3N0YXRlKGFkYXB0ZXIsIHRtcGxfaGRyLAorCQkJCQlRTENfODNYWF9ETUFfRU5HSU5FX0lOREVYKTsKIAlkbWFfYmFzZV9hZGRyID0gUUxDX0RNQV9SRUdfQkFTRV9BRERSKGRtYV9ubyk7CiAKIAl0ZW1wX2FkZHIgPSBkbWFfYmFzZV9hZGRyICsgUUxDX0RNQV9DTURfQlVGRl9BRERSX0xPVzsKLQlyZXQgPSBxbGNuaWNfODN4eF93cnRfcmVnX2luZGlyZWN0KGFkYXB0ZXIsIHRlbXBfYWRkciwKLQkJCQkJICAgbWVtLT5kZXNjX2NhcmRfYWRkcik7CisJcmV0ID0gcWxjbmljX2luZF93cihhZGFwdGVyLCB0ZW1wX2FkZHIsIG1lbS0+ZGVzY19jYXJkX2FkZHIpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAl0ZW1wX2FkZHIgPSBkbWFfYmFzZV9hZGRyICsgUUxDX0RNQV9DTURfQlVGRl9BRERSX0hJOwotCXJldCA9IHFsY25pY184M3h4X3dydF9yZWdfaW5kaXJlY3QoYWRhcHRlciwgdGVtcF9hZGRyLCAwKTsKKwlyZXQgPSBxbGNuaWNfaW5kX3dyKGFkYXB0ZXIsIHRlbXBfYWRkciwgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXRlbXBfYWRkciA9IGRtYV9iYXNlX2FkZHIgKyBRTENfRE1BX0NNRF9TVEFUVVNfQ1RSTDsKLQlyZXQgPSBxbGNuaWNfODN4eF93cnRfcmVnX2luZGlyZWN0KGFkYXB0ZXIsIHRlbXBfYWRkciwKLQkJCQkJICAgbWVtLT5zdGFydF9kbWFfY21kKTsKKwlyZXQgPSBxbGNuaWNfaW5kX3dyKGFkYXB0ZXIsIHRlbXBfYWRkciwgbWVtLT5zdGFydF9kbWFfY21kKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC03MTAsMTUgKzcxNCwxNiBAQAogCXN0cnVjdCBxbGNuaWNfZndfZHVtcCAqZndfZHVtcCA9ICZhZGFwdGVyLT5haHctPmZ3X2R1bXA7CiAJdTMyIHRlbXAsIGRtYV9iYXNlX2FkZHIsIHNpemUgPSAwLCByZWFkX3NpemUgPSAwOwogCXN0cnVjdCBxbGNuaWNfcGV4X2RtYV9kZXNjcmlwdG9yICpkbWFfZGVzY3I7Ci0Jc3RydWN0IHFsY25pY184M3h4X2R1bXBfdGVtcGxhdGVfaGRyICp0bXBsX2hkcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCWRtYV9hZGRyX3QgZG1hX3BoeXNfYWRkcjsKIAl2b2lkICpkbWFfYnVmZmVyOworCXZvaWQgKnRtcGxfaGRyOwogCiAJdG1wbF9oZHIgPSBmd19kdW1wLT50bXBsX2hkcjsKIAogCS8qIENoZWNrIGlmIERNQSBlbmdpbmUgaXMgYXZhaWxhYmxlICovCi0JdGVtcCA9IHRtcGxfaGRyLT5zYXZlZF9zdGF0ZVtRTENfODNYWF9ETUFfRU5HSU5FX0lOREVYXTsKKwl0ZW1wID0gcWxjbmljX2dldF9zYXZlZF9zdGF0ZShhZGFwdGVyLCB0bXBsX2hkciwKKwkJCQkgICAgICBRTENfODNYWF9ETUFfRU5HSU5FX0lOREVYKTsKIAlkbWFfYmFzZV9hZGRyID0gUUxDX0RNQV9SRUdfQkFTRV9BRERSKHRlbXApOwogCXRlbXAgPSBxbGNuaWNfaW5kX3JkKGFkYXB0ZXIsCiAJCQkgICAgIGRtYV9iYXNlX2FkZHIgKyBRTENfRE1BX0NNRF9TVEFUVVNfQ1RSTCk7CkBAIC03NjQsOCArNzY5LDggQEAKIAogCQkvKiBXcml0ZSBETUEgZGVzY3JpcHRvciB0byBNUyBtZW1vcnkqLwogCQl0ZW1wID0gc2l6ZW9mKHN0cnVjdCBxbGNuaWNfcGV4X2RtYV9kZXNjcmlwdG9yKSAvIDE2OwotCQkqcmV0ID0gcWxjbmljXzgzeHhfbXNfbWVtX3dyaXRlMTI4KGFkYXB0ZXIsIG1lbS0+ZGVzY19jYXJkX2FkZHIsCi0JCQkJCQkgICAodTMyICopZG1hX2Rlc2NyLCB0ZW1wKTsKKwkJKnJldCA9IHFsY25pY19tc19tZW1fd3JpdGUxMjgoYWRhcHRlciwgbWVtLT5kZXNjX2NhcmRfYWRkciwKKwkJCQkJICAgICAgKHUzMiAqKWRtYV9kZXNjciwgdGVtcCk7CiAJCWlmICgqcmV0KSB7CiAJCQlkZXZfaW5mbyhkZXYsICJGYWlsZWQgdG8gd3JpdGUgRE1BIGRlc2NyaXB0b3IgdG8gTVMgbWVtb3J5IGF0IGFkZHJlc3MgMHgleFxuIiwKIAkJCQkgbWVtLT5kZXNjX2NhcmRfYWRkcik7CkBAIC0xMTQxLDggKzExNDYsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNkZWZpbmUgUUxDTklDX1RFTVBMQVRFX1ZFUlNJT04gKDB4MjAwMDEpCi0KIGludCBxbGNuaWNfZndfY21kX2dldF9taW5pZHVtcF90ZW1wKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcWxjbmljX2hhcmR3YXJlX2NvbnRleHQgKmFodzsKQEAgLTExNTAsNiArMTE1Myw3IEBACiAJdTMyIHZlcnNpb24sIGNzdW0sICp0bXBfYnVmOwogCXU4IHVzZV9mbGFzaF90ZW1wID0gMDsKIAl1MzIgdGVtcF9zaXplID0gMDsKKwl2b2lkICp0ZW1wX2J1ZmZlcjsKIAlpbnQgZXJyOwogCiAJYWh3ID0gYWRhcHRlci0+YWh3OwpAQCAtMTE5OSwxNiArMTIwMywyMyBAQAogCiAJcWxjbmljX2NhY2hlX3RtcGxfaGRyX3ZhbHVlcyhhZGFwdGVyLCBmd19kdW1wKTsKIAorCWlmIChmd19kdW1wLT51c2VfcGV4X2RtYSkgeworCQlmd19kdW1wLT5kbWFfYnVmZmVyID0gTlVMTDsKKwkJdGVtcF9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJCSBRTENfUEVYX0RNQV9SRUFEX1NJWkUsCisJCQkJCQkgJmZ3X2R1bXAtPnBoeXNfYWRkciwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wX2J1ZmZlcikKKwkJCWZ3X2R1bXAtPnVzZV9wZXhfZG1hID0gZmFsc2U7CisJCWVsc2UKKwkJCWZ3X2R1bXAtPmRtYV9idWZmZXIgPSB0ZW1wX2J1ZmZlcjsKKwl9CisKKwogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCSAiRGVmYXVsdCBtaW5pZHVtcCBjYXB0dXJlIG1hc2sgMHgleFxuIiwKIAkJIGZ3X2R1bXAtPmNhcF9tYXNrKTsKIAotCWlmIChxbGNuaWNfODN4eF9jaGVjayhhZGFwdGVyKSAmJgotCSAgICAoZndfZHVtcC0+dmVyc2lvbiAmIDB4ZmZmZmYpID49IFFMQ05JQ19URU1QTEFURV9WRVJTSU9OKQotCQlmd19kdW1wLT51c2VfcGV4X2RtYSA9IHRydWU7Ci0JZWxzZQotCQlmd19kdW1wLT51c2VfcGV4X2RtYSA9IGZhbHNlOwotCiAJcWxjbmljX2VuYWJsZV9md19kdW1wX3N0YXRlKGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CkBAIC0xMjI0LDcgKzEyMzUsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJc3RydWN0IHFsY25pY19oYXJkd2FyZV9jb250ZXh0ICphaHc7CiAJc3RydWN0IHFsY25pY19kdW1wX2VudHJ5ICplbnRyeTsKLQl2b2lkICp0ZW1wX2J1ZmZlciwgKnRtcGxfaGRyOworCXZvaWQgKnRtcGxfaGRyOwogCXUzMiBvY21fd2luZG93OwogCV9fbGUzMiAqYnVmZmVyOwogCWNoYXIgbWVzZ1s2NF07CkBAIC0xMjY4LDE2ICsxMjc5LDYgQEAKIAlxbGNuaWNfc2V0X3N5c19pbmZvKGFkYXB0ZXIsIHRtcGxfaGRyLCAwLCBRTENOSUNfRFJJVkVSX1ZFUlNJT04pOwogCXFsY25pY19zZXRfc3lzX2luZm8oYWRhcHRlciwgdG1wbF9oZHIsIDEsIGFkYXB0ZXItPmZ3X3ZlcnNpb24pOwogCi0JaWYgKGZ3X2R1bXAtPnVzZV9wZXhfZG1hKSB7Ci0JCXRlbXBfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgUUxDX1BFWF9ETUFfUkVBRF9TSVpFLAotCQkJCQkJICZmd19kdW1wLT5waHlzX2FkZHIsCi0JCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF9idWZmZXIpCi0JCQlmd19kdW1wLT51c2VfcGV4X2RtYSA9IGZhbHNlOwotCQllbHNlCi0JCQlmd19kdW1wLT5kbWFfYnVmZmVyID0gdGVtcF9idWZmZXI7Ci0JfQotCiAJaWYgKHFsY25pY184Mnh4X2NoZWNrKGFkYXB0ZXIpKSB7CiAJCW9wc19jbnQgPSBBUlJBWV9TSVpFKHFsY25pY19md19kdW1wX29wcyk7CiAJCWZ3X2R1bXBfb3BzID0gcWxjbmljX2Z3X2R1bXBfb3BzOwpAQCAtMTMzNSwxMCArMTMzNiw2IEBACiAJLyogU2VuZCBhIHVkZXYgZXZlbnQgdG8gbm90aWZ5IGF2YWlsYWJpbGl0eSBvZiBGVyBkdW1wICovCiAJa29iamVjdF91ZXZlbnRfZW52KCZkZXYtPmtvYmosIEtPQkpfQ0hBTkdFLCBtc2cpOwogCi0JaWYgKGZ3X2R1bXAtPnVzZV9wZXhfZG1hKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIFFMQ19QRVhfRE1BX1JFQURfU0laRSwKLQkJCQkgIGZ3X2R1bXAtPmRtYV9idWZmZXIsIGZ3X2R1bXAtPnBoeXNfYWRkcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92LmgKaW5kZXggMzk2YmQxZi4uNDY3N2IyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdi5oCkBAIC01Miw2ICs1Miw3IEBACiAJUUxDTklDX0JDX0NNRF9DRkdfR1VFU1RfVkxBTiA9IDB4MywKIH07CiAKKyNkZWZpbmUgUUxDTklDXzgzWFhfU1JJT1ZfVkZfTUFYX01BQyAyCiAjZGVmaW5lIFFMQ19CQ19DTUQgMQogCiBzdHJ1Y3QgcWxjbmljX3RyYW5zX2xpc3QgewpAQCAtMTUxLDEzICsxNTIsMTQgQEAKIAlzdHJ1Y3QgcWxjbmljX3RyYW5zX2xpc3QJcmN2X3BlbmQ7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyCQkqYWRhcHRlcjsKIAlzdHJ1Y3QgcWxjbmljX3Zwb3J0CQkqdnA7Ci0Jc3RydWN0IG11dGV4CQkJdmxhbl9saXN0X2xvY2s7CS8qIExvY2sgZm9yIFZMQU4gbGlzdCAqLworCXNwaW5sb2NrX3QJCQl2bGFuX2xpc3RfbG9jazsJLyogTG9jayBmb3IgVkxBTiBsaXN0ICovCiB9OwogCiBzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXZvaWQJCQkqcHRyOworCXN0cnVjdCBxbGNuaWNfY21kX2FyZ3MJKmNtZDsKIH07CiAKIHN0cnVjdCBxbGNuaWNfYmFja19jaGFubmVsIHsKQEAgLTIzMSw3ICsyMzMsNyBAQAogdm9pZCBxbGNuaWNfc3Jpb3ZfcGZfcmVzZXQoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwogaW50IHFsY25pY19zcmlvdl9wZl9yZWluaXQoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwogaW50IHFsY25pY19zcmlvdl9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTggKik7Ci1pbnQgcWxjbmljX3NyaW92X3NldF92Zl90eF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50KTsKK2ludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3R4X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQsIGludCk7CiBpbnQgcWxjbmljX3NyaW92X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50ICwKIAkJCSAgICAgICBzdHJ1Y3QgaWZsYV92Zl9pbmZvICopOwogaW50IHFsY25pY19zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiwgdTgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYwppbmRleCA2YWZlOWMxLi4xNjU5YzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYwpAQCAtMzksNiArMzksOCBAQAogc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X3Byb2Nlc3NfYmNfY21kKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIHN0YXRpYyBpbnQgcWxjbmljX3NyaW92X3ZmX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICopOwogc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfdmZfcmVzdW1lKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKK3N0YXRpYyBpbnQgcWxjbmljX3NyaW92X2FzeW5jX2lzc3VlX2NtZChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwKKwkJCQkJc3RydWN0IHFsY25pY19jbWRfYXJncyAqKTsKIAogc3RhdGljIHN0cnVjdCBxbGNuaWNfaGFyZHdhcmVfb3BzIHFsY25pY19zcmlvdl92Zl9od19vcHMgPSB7CiAJLnJlYWRfY3JiCQkJPSBxbGNuaWNfODN4eF9yZWFkX2NyYiwKQEAgLTE4MSw3ICsxODMsNyBAQAogCQl2Zi0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJCXZmLT5wY2lfZnVuYyA9IHFsY25pY19zcmlvdl92aXJ0aWRfZm4oYWRhcHRlciwgaSk7CiAJCW11dGV4X2luaXQoJnZmLT5zZW5kX2NtZF9sb2NrKTsKLQkJbXV0ZXhfaW5pdCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnZmLT52bGFuX2xpc3RfbG9jayk7CiAJCUlOSVRfTElTVF9IRUFEKCZ2Zi0+cmN2X2FjdC53YWl0X2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmdmYtPnJjdl9wZW5kLndhaXRfbGlzdCk7CiAJCXNwaW5fbG9ja19pbml0KCZ2Zi0+cmN2X2FjdC5sb2NrKTsKQEAgLTE5Nyw4ICsxOTksMTAgQEAKIAkJCQlnb3RvIHFsY25pY19kZXN0cm95X2FzeW5jX3dxOwogCQkJfQogCQkJc3Jpb3YtPnZmX2luZm9baV0udnAgPSB2cDsKKwkJCXZwLT52bGFuX21vZGUgPSBRTENfR1VFU1RfVkxBTl9NT0RFOwogCQkJdnAtPm1heF90eF9idyA9IE1BWF9CVzsKLQkJCXZwLT5zcG9vZmNoayA9IHRydWU7CisJCQl2cC0+bWluX3R4X2J3ID0gTUlOX0JXOworCQkJdnAtPnNwb29mY2hrID0gZmFsc2U7CiAJCQlyYW5kb21fZXRoZXJfYWRkcih2cC0+bWFjKTsKIAkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJICJNQUMgQWRkcmVzcyAlcE0gaXMgY29uZmlndXJlZCBmb3IgVkYgJWRcbiIsCkBAIC00NTQsNiArNDU4LDcgQEAKIAlzdHJ1Y3QgcWxjbmljX2NtZF9hcmdzIGNtZDsKIAlpbnQgcmV0ID0gMDsKIAorCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAJcmV0ID0gcWxjbmljX3NyaW92X2FsbG9jX2JjX21ieF9hcmdzKCZjbWQsIFFMQ05JQ19CQ19DTURfR0VUX0FDTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTUxNSw2ICs1MjAsOCBAQAogewogCWludCBlcnI7CiAKKwlhZGFwdGVyLT5mbGFncyB8PSBRTENOSUNfVkxBTl9GSUxURVJJTkc7CisJYWRhcHRlci0+YWh3LT50b3RhbF9uaWNfZnVuYyA9IDE7CiAJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnZmX21jX2xpc3QpOwogCWlmICghcWxjbmljX3VzZV9tc2lfeCAmJiAhIXFsY25pY191c2VfbXNpKQogCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LApAQCAtNzcwLDYgKzc3Nyw3IEBACiAJCWNtZC0+cmVxLmFyZyA9ICh1MzIgKil0cmFucy0+cmVxX3BheTsKIAkJY21kLT5yc3AuYXJnID0gKHUzMiAqKXRyYW5zLT5yc3BfcGF5OwogCQljbWRfb3AgPSBjbWQtPnJlcS5hcmdbMF0gJiAweGZmOworCQljbWQtPmNtZF9vcCA9IGNtZF9vcDsKIAkJcmVtYWluZGVyID0gKHRyYW5zLT5yc3BfcGF5X3NpemUpICUgKGJjX3BheV9zeik7CiAJCW51bV9mcmFncyA9ICh0cmFucy0+cnNwX3BheV9zaXplKSAvIChiY19wYXlfc3opOwogCQlpZiAocmVtYWluZGVyKQpAQCAtMTM1Niw3ICsxMzY0LDcgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfaXNzdWVfY21kKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKK3N0YXRpYyBpbnQgX19xbGNuaWNfc3Jpb3ZfaXNzdWVfY21kKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkgIHN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgcWxjbmljX2hhcmR3YXJlX2NvbnRleHQgKmFodyA9IGFkYXB0ZXItPmFodzsKQEAgLTE0MDgsMTIgKzE0MTYsMTcgQEAKIAkgICAgKG1ieF9lcnJfY29kZSA9PSBRTENOSUNfTUJYX1BPUlRfUlNQX09LKSkgewogCQlyc3AgPSBRTENOSUNfUkNPREVfU1VDQ0VTUzsKIAl9IGVsc2UgewotCQlyc3AgPSBtYnhfZXJyX2NvZGU7Ci0JCWlmICghcnNwKQotCQkJcnNwID0gMTsKLQkJZGV2X2VycihkZXYsCi0JCQkiTUJYIGNvbW1hbmQgMHgleCBmYWlsZWQgd2l0aCBlcnI6MHgleCBmb3IgVkYgJWRcbiIsCi0JCQlvcGNvZGUsIG1ieF9lcnJfY29kZSwgZnVuYyk7CisJCWlmIChjbWQtPnR5cGUgPT0gUUxDXzgzWFhfTUJYX0NNRF9OT19XQUlUKSB7CisJCQlyc3AgPSBRTENOSUNfUkNPREVfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXJzcCA9IG1ieF9lcnJfY29kZTsKKwkJCWlmICghcnNwKQorCQkJCXJzcCA9IDE7CisKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJNQlggY29tbWFuZCAweCV4IGZhaWxlZCB3aXRoIGVycjoweCV4IGZvciBWRiAlZFxuIiwKKwkJCQlvcGNvZGUsIG1ieF9lcnJfY29kZSwgZnVuYyk7CisJCX0KIAl9CiAKIGVycl9vdXQ6CkBAIC0xNDM1LDEyICsxNDQ4LDIzIEBACiAJcmV0dXJuIHJzcDsKIH0KIAorCitzdGF0aWMgaW50IHFsY25pY19zcmlvdl9pc3N1ZV9jbWQoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgc3RydWN0IHFsY25pY19jbWRfYXJncyAqY21kKQoreworCWlmIChjbWQtPnR5cGUgPT0gUUxDXzgzWFhfTUJYX0NNRF9OT19XQUlUKQorCQlyZXR1cm4gcWxjbmljX3NyaW92X2FzeW5jX2lzc3VlX2NtZChhZGFwdGVyLCBjbWQpOworCWVsc2UKKwkJcmV0dXJuIF9fcWxjbmljX3NyaW92X2lzc3VlX2NtZChhZGFwdGVyLCBjbWQpOworfQorCiBzdGF0aWMgaW50IHFsY25pY19zcmlvdl9jaGFubmVsX2NmZ19jbWQoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1OCBjbWRfb3ApCiB7CiAJc3RydWN0IHFsY25pY19jbWRfYXJncyBjbWQ7CiAJc3RydWN0IHFsY25pY192Zl9pbmZvICp2ZiA9ICZhZGFwdGVyLT5haHctPnNyaW92LT52Zl9pbmZvWzBdOwogCWludCByZXQ7CiAKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCWlmIChxbGNuaWNfc3Jpb3ZfYWxsb2NfYmNfbWJ4X2FyZ3MoJmNtZCwgY21kX29wKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0NjUsNTggKzE0ODksMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBxbGNuaWNfdmZfYWRkX21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyB2b2lkIHFsY25pY192Zl9hZGRfbWNfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1OCAqbWFjKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHFsY25pY19zcmlvdiAqc3Jpb3YgPSBhZGFwdGVyLT5haHctPnNyaW92OwotCXN0cnVjdCBxbGNuaWNfbWFjX3ZsYW5fbGlzdCAqY3VyOwotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHRtcF9saXN0OwogCXN0cnVjdCBxbGNuaWNfdmZfaW5mbyAqdmY7CiAJdTE2IHZsYW5faWQ7CiAJaW50IGk7CiAKLQlzdGF0aWMgY29uc3QgdTggYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7Ci0JCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLQl9OwotCiAJdmYgPSAmYWRhcHRlci0+YWh3LT5zcmlvdi0+dmZfaW5mb1swXTsKLQlJTklUX0xJU1RfSEVBRCgmdG1wX2xpc3QpOwotCWhlYWQgPSAmYWRhcHRlci0+dmZfbWNfbGlzdDsKLQluZXRpZl9hZGRyX2xvY2tfYmgobmV0ZGV2KTsKIAotCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewotCQljdXIgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBxbGNuaWNfbWFjX3ZsYW5fbGlzdCwgbGlzdCk7Ci0JCWxpc3RfbW92ZSgmY3VyLT5saXN0LCAmdG1wX2xpc3QpOwotCX0KLQotCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcF9saXN0KSkgewotCQljdXIgPSBsaXN0X2VudHJ5KCgmdG1wX2xpc3QpLT5uZXh0LAotCQkJCSBzdHJ1Y3QgcWxjbmljX21hY192bGFuX2xpc3QsIGxpc3QpOwotCQlpZiAoIXFsY25pY19zcmlvdl9jaGVja19hbnlfdmxhbih2ZikpIHsKLQkJCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBiY2FzdF9hZGRyLCAwKTsKLQkJCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBjdXItPm1hY19hZGRyLCAwKTsKLQkJfSBlbHNlIHsKLQkJCW11dGV4X2xvY2soJnZmLT52bGFuX2xpc3RfbG9jayk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc3Jpb3YtPm51bV9hbGxvd2VkX3ZsYW5zOyBpKyspIHsKLQkJCQl2bGFuX2lkID0gdmYtPnNyaW92X3ZsYW5zW2ldOwotCQkJCWlmICh2bGFuX2lkKSB7Ci0JCQkJCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBiY2FzdF9hZGRyLAotCQkJCQkJCSAgIHZsYW5faWQpOwotCQkJCQlxbGNuaWNfbmljX2FkZF9tYWMoYWRhcHRlciwKLQkJCQkJCQkgICBjdXItPm1hY19hZGRyLAotCQkJCQkJCSAgIHZsYW5faWQpOwotCQkJCX0KLQkJCX0KLQkJCW11dGV4X3VubG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKLQkJCWlmIChxbGNuaWNfODR4eF9jaGVjayhhZGFwdGVyKSkgewotCQkJCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBiY2FzdF9hZGRyLCAwKTsKLQkJCQlxbGNuaWNfbmljX2FkZF9tYWMoYWRhcHRlciwgY3VyLT5tYWNfYWRkciwgMCk7Ci0JCQl9CisJaWYgKCFxbGNuaWNfc3Jpb3ZfY2hlY2tfYW55X3ZsYW4odmYpKSB7CisJCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBtYWMsIDApOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IHNyaW92LT5udW1fYWxsb3dlZF92bGFuczsgaSsrKSB7CisJCQl2bGFuX2lkID0gdmYtPnNyaW92X3ZsYW5zW2ldOworCQkJaWYgKHZsYW5faWQpCisJCQkJcWxjbmljX25pY19hZGRfbWFjKGFkYXB0ZXIsIG1hYywgdmxhbl9pZCk7CiAJCX0KLQkJbGlzdF9kZWwoJmN1ci0+bGlzdCk7Ci0JCWtmcmVlKGN1cik7CisJCXNwaW5fdW5sb2NrKCZ2Zi0+dmxhbl9saXN0X2xvY2spOworCQlpZiAocWxjbmljXzg0eHhfY2hlY2soYWRhcHRlcikpCisJCQlxbGNuaWNfbmljX2FkZF9tYWMoYWRhcHRlciwgbWFjLCAwKTsKIAl9CiB9CiAKQEAgLTE1MjUsNiArMTUxOSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZiYy0+YXN5bmNfbGlzdDsKIAlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnk7CiAKKwlmbHVzaF93b3JrcXVldWUoYmMtPmJjX2FzeW5jX3dxKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0LAogCQkJCSAgIGxpc3QpOwpAQCAtMTUzNCwxMCArMTUyOSwxNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X3ZmX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQordm9pZCBxbGNuaWNfc3Jpb3ZfdmZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgcWxjbmljX2hhcmR3YXJlX2NvbnRleHQgKmFodyA9IGFkYXB0ZXItPmFodzsKKwlzdGF0aWMgY29uc3QgdTggYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7CisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKKwl9OworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAJdTMyIG1vZGUgPSBWUE9SVF9NSVNTX01PREVfRFJPUDsKIAogCWlmICghdGVzdF9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpCkBAIC0xNTQ5LDIzICsxNTQ4LDQ5IEBACiAJfSBlbHNlIGlmICgobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKIAkJICAgKG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gYWh3LT5tYXhfbWNfY291bnQpKSB7CiAJCW1vZGUgPSBWUE9SVF9NSVNTX01PREVfQUNDRVBUX01VTFRJOworCX0gZWxzZSB7CisJCXFsY25pY192Zl9hZGRfbWNfbGlzdChuZXRkZXYsIGJjYXN0X2FkZHIpOworCQlpZiAoIW5ldGRldl9tY19lbXB0eShuZXRkZXYpKSB7CisJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmV0ZGV2KQorCQkJCXFsY25pY192Zl9hZGRfbWNfbGlzdChuZXRkZXYsIGhhLT5hZGRyKTsKKwkJfQogCX0KIAotCWlmIChxbGNuaWNfc3Jpb3ZfdmZfY2hlY2soYWRhcHRlcikpCi0JCXFsY25pY192Zl9hZGRfbWNfbGlzdChuZXRkZXYpOworCS8qIGNvbmZpZ3VyZSB1bmljYXN0IE1BQyBhZGRyZXNzLCBpZiB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBzcGFjZQorCSAqIHRvIHN0b3JlIGFsbCB0aGUgdW5pY2FzdCBhZGRyZXNzZXMgdGhlbiBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZQorCSAqLworCWlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSA+IGFody0+bWF4X3VjX2NvdW50KSB7CisJCW1vZGUgPSBWUE9SVF9NSVNTX01PREVfQUNDRVBUX0FMTDsKKwl9IGVsc2UgaWYgKCFuZXRkZXZfdWNfZW1wdHkobmV0ZGV2KSkgeworCQluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgbmV0ZGV2KQorCQkJcWxjbmljX3ZmX2FkZF9tY19saXN0KG5ldGRldiwgaGEtPmFkZHIpOworCX0KKworCWlmIChhZGFwdGVyLT5wZGV2LT5pc192aXJ0Zm4pIHsKKwkJaWYgKG1vZGUgPT0gVlBPUlRfTUlTU19NT0RFX0FDQ0VQVF9BTEwgJiYKKwkJICAgICFhZGFwdGVyLT5mZGJfbWFjX2xlYXJuKSB7CisJCQlxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oYWRhcHRlcik7CisJCQlhZGFwdGVyLT5kcnZfbWFjX2xlYXJuID0gMTsKKwkJCWFkYXB0ZXItPnJ4X21hY19sZWFybiA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5kcnZfbWFjX2xlYXJuID0gMDsKKwkJCWFkYXB0ZXItPnJ4X21hY19sZWFybiA9IGZhbHNlOworCQl9CisJfQogCiAJcWxjbmljX25pY19zZXRfcHJvbWlzYyhhZGFwdGVyLCBtb2RlKTsKIH0KIAotc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X2hhbmRsZV9hc3luY19tdWx0aShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBxbGNuaWNfc3Jpb3ZfaGFuZGxlX2FzeW5jX2lzc3VlX2NtZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHFsY25pY19hc3luY193b3JrX2xpc3QgKmVudHJ5OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZDsKIAogCWVudHJ5ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0LCB3b3JrKTsKLQluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKillbnRyeS0+cHRyOwotCi0JcWxjbmljX3NyaW92X3ZmX3NldF9tdWx0aShuZXRkZXYpOworCWFkYXB0ZXIgPSBlbnRyeS0+cHRyOworCWNtZCA9IGVudHJ5LT5jbWQ7CisJX19xbGNuaWNfc3Jpb3ZfaXNzdWVfY21kKGFkYXB0ZXIsIGNtZCk7CiAJcmV0dXJuOwogfQogCkBAIC0xNTk1LDggKzE2MjAsOSBAQAogCXJldHVybiBlbnRyeTsKIH0KIAotc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X3NjaGVkdWxlX2JjX2FzeW5jX3dvcmsoc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjLAotCQkJCQkJd29ya19mdW5jX3QgZnVuYywgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHFsY25pY19zcmlvdl9zY2hlZHVsZV9hc3luY19jbWQoc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjLAorCQkJCQkgICAgd29ya19mdW5jX3QgZnVuYywgdm9pZCAqZGF0YSwKKwkJCQkJICAgIHN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnkgPSBOVUxMOwogCkBAIC0xNjA1LDIxICsxNjMxLDIzIEBACiAJCXJldHVybjsKIAogCWVudHJ5LT5wdHIgPSBkYXRhOworCWVudHJ5LT5jbWQgPSBjbWQ7CiAJSU5JVF9XT1JLKCZlbnRyeS0+d29yaywgZnVuYyk7CiAJcXVldWVfd29yayhiYy0+YmNfYXN5bmNfd3EsICZlbnRyeS0+d29yayk7CiB9CiAKLXZvaWQgcWxjbmljX3NyaW92X3ZmX3NjaGVkdWxlX211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgaW50IHFsY25pY19zcmlvdl9hc3luY19pc3N1ZV9jbWQoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgcWxjbmljX2NtZF9hcmdzICpjbWQpCiB7CiAKLQlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBxbGNuaWNfYmFja19jaGFubmVsICpiYyA9ICZhZGFwdGVyLT5haHctPnNyaW92LT5iYzsKIAogCWlmIChhZGFwdGVyLT5uZWVkX2Z3X3Jlc2V0KQotCQlyZXR1cm47CisJCXJldHVybiAtRUlPOwogCi0JcWxjbmljX3NyaW92X3NjaGVkdWxlX2JjX2FzeW5jX3dvcmsoYmMsIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfbXVsdGksCi0JCQkJCSAgICBuZXRkZXYpOworCXFsY25pY19zcmlvdl9zY2hlZHVsZV9hc3luY19jbWQoYmMsIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfaXNzdWVfY21kLAorCQkJCQlhZGFwdGVyLCBjbWQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHFsY25pY19zcmlvdl92Zl9yZWluaXRfZHJpdmVyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKQEAgLTE4NDMsNiArMTg3MSwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBxbGNuaWNfc3Jpb3ZfdmZfcGVyaW9kaWNfdGFza3Moc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5maGFzaC5mbnVtKQorCQlxbGNuaWNfcHJ1bmVfbGJfZmlsdGVycyhhZGFwdGVyKTsKK30KKwogc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X3ZmX3BvbGxfZGV2X3N0YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXI7CkBAIC0xODc0LDYgKzE5MDgsOCBAQAogCX0KIAogCWlkYy0+cHJldl9zdGF0ZSA9IGlkYy0+Y3Vycl9zdGF0ZTsKKwlxbGNuaWNfc3Jpb3ZfdmZfcGVyaW9kaWNfdGFza3MoYWRhcHRlcik7CisKIAlpZiAoIXJldCAmJiB0ZXN0X2JpdChRTENfODNYWF9NT0RVTEVfTE9BREVELCAmaWRjLT5zdGF0dXMpKQogCQlxbGNuaWNfc2NoZWR1bGVfd29yayhhZGFwdGVyLCBxbGNuaWNfc3Jpb3ZfdmZfcG9sbF9kZXZfc3RhdGUsCiAJCQkJICAgICBpZGMtPmRlbGF5KTsKQEAgLTE4OTcsNyArMTkzMyw3IEBACiAJaWYgKCF2Zi0+c3Jpb3ZfdmxhbnMpCiAJCXJldHVybiBlcnI7CiAKLQltdXRleF9sb2NrKCZ2Zi0+dmxhbl9saXN0X2xvY2spOworCXNwaW5fbG9ja19iaCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzcmlvdi0+bnVtX2FsbG93ZWRfdmxhbnM7IGkrKykgewogCQlpZiAodmYtPnNyaW92X3ZsYW5zW2ldID09IHZsYW5faWQpIHsKQEAgLTE5MDYsNyArMTk0Miw3IEBACiAJCX0KIAl9CiAKLQltdXRleF91bmxvY2soJnZmLT52bGFuX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnZmLT52bGFuX2xpc3RfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTkxNSwxMiArMTk1MSwxMiBAQAogewogCWludCBlcnIgPSAwOwogCi0JbXV0ZXhfbG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnZmLT52bGFuX2xpc3RfbG9jayk7CiAKIAlpZiAodmYtPm51bV92bGFuID49IHNyaW92LT5udW1fYWxsb3dlZF92bGFucykKIAkJZXJyID0gLUVJTlZBTDsKIAotCW11dGV4X3VubG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xOTczLDcgKzIwMDksNyBAQAogCWlmICghdmYtPnNyaW92X3ZsYW5zKQogCQlyZXR1cm47CiAKLQltdXRleF9sb2NrKCZ2Zi0+dmxhbl9saXN0X2xvY2spOworCXNwaW5fbG9ja19iaCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKIAogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBRTENfVkxBTl9BREQ6CkBAIC0xOTg2LDcgKzIwMjIsNyBAQAogCQluZXRkZXZfZXJyKGFkYXB0ZXItPm5ldGRldiwgIkludmFsaWQgVkxBTiBvcGVyYXRpb25cbiIpOwogCX0KIAotCW11dGV4X3VubG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE5OTQsMTAgKzIwMzAsMTIgQEAKIAkJCQkgICB1MTYgdmlkLCB1OCBlbmFibGUpCiB7CiAJc3RydWN0IHFsY25pY19zcmlvdiAqc3Jpb3YgPSBhZGFwdGVyLT5haHctPnNyaW92OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IHFsY25pY192Zl9pbmZvICp2ZjsKIAlzdHJ1Y3QgcWxjbmljX2NtZF9hcmdzIGNtZDsKIAlpbnQgcmV0OwogCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAlpZiAodmlkID09IDApCiAJCXJldHVybiAwOwogCkBAIC0yMDE5LDE0ICsyMDU3LDE4IEBACiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJGYWlsZWQgdG8gY29uZmlndXJlIGd1ZXN0IFZMQU4sIGVycj0lZFxuIiwgcmV0KTsKIAl9IGVsc2UgeworCQluZXRpZl9hZGRyX2xvY2tfYmgobmV0ZGV2KTsKIAkJcWxjbmljX2ZyZWVfbWFjX2xpc3QoYWRhcHRlcik7CisJCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CiAKIAkJaWYgKGVuYWJsZSkKIAkJCXFsY25pY19zcmlvdl92bGFuX29wZXJhdGlvbih2ZiwgdmlkLCBRTENfVkxBTl9BREQpOwogCQllbHNlCiAJCQlxbGNuaWNfc3Jpb3Zfdmxhbl9vcGVyYXRpb24odmYsIHZpZCwgUUxDX1ZMQU5fREVMRVRFKTsKIAotCQlxbGNuaWNfc2V0X211bHRpKGFkYXB0ZXItPm5ldGRldik7CisJCW5ldGlmX2FkZHJfbG9ja19iaChuZXRkZXYpOworCQlxbGNuaWNfc2V0X211bHRpKG5ldGRldik7CisJCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CiAJfQogCiAJcWxjbmljX2ZyZWVfbWJ4X2FyZ3MoJmNtZCk7CkBAIC0yMTU3LDExICsyMTk5LDExIEBACiB7CiAJYm9vbCBlcnIgPSBmYWxzZTsKIAotCW11dGV4X2xvY2soJnZmLT52bGFuX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZ2Zi0+dmxhbl9saXN0X2xvY2spOwogCiAJaWYgKHZmLT5udW1fdmxhbikKIAkJZXJyID0gdHJ1ZTsKIAotCW11dGV4X3VubG9jaygmdmYtPnZsYW5fbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdmYtPnZsYW5fbGlzdF9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X3BmLmMKaW5kZXggMjgwMTM3OS4uYTI5NTM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9wZi5jCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIFFMQ19WRl9GTE9PRF9CSVQJQklUXzE2CiAjZGVmaW5lIFFMQ19GTE9PRF9NT0RFCQkweDUKICNkZWZpbmUgUUxDX1NSSU9WX0FMTE9XX1ZMQU4wCUJJVF8xOQorI2RlZmluZSBRTENfSU5UUl9DT0FMX1RZUEVfTUFTSwkweDcKIAogc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfcGZfZ2V0X3Zwb3J0X2hhbmRsZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTgpOwogCkBAIC04Myw3ICs4NCw3IEBACiAJaW5mby0+bWF4X3R4X3F1ZXMgPSByZXMtPm51bV90eF9xdWV1ZXMgLyBtYXg7CiAKIAlpZiAocWxjbmljXzgzeHhfcGZfY2hlY2soYWRhcHRlcikpCi0JCW51bV9tYWNzID0gMTsKKwkJbnVtX21hY3MgPSBRTENOSUNfODNYWF9TUklPVl9WRl9NQVhfTUFDOwogCiAJaW5mby0+bWF4X3J4X21jYXN0X21hY19maWx0ZXJzID0gcmVzLT5udW1fcnhfbWNhc3RfbWFjX2ZpbHRlcnM7CiAKQEAgLTMzNyw5ICszMzgsMTIgQEAKIAogCWNtZC5yZXEuYXJnWzFdID0gMHg0OwogCWlmIChlbmFibGUpIHsKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gUUxDTklDX1ZMQU5fRklMVEVSSU5HOwogCQljbWQucmVxLmFyZ1sxXSB8PSBCSVRfMTY7CiAJCWlmIChxbGNuaWNfODR4eF9jaGVjayhhZGFwdGVyKSkKIAkJCWNtZC5yZXEuYXJnWzFdIHw9IFFMQ19TUklPVl9BTExPV19WTEFOMDsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5mbGFncyAmPSB+UUxDTklDX1ZMQU5fRklMVEVSSU5HOwogCX0KIAogCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwgJmNtZCk7CkBAIC00NzEsMTIgKzQ3NSwxMiBAQAogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAorCXFsY25pY19zcmlvdl9wZl9kaXNhYmxlKGFkYXB0ZXIpOworCiAJcnRubF9sb2NrKCk7CiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJX19xbGNuaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOwogCi0JcWxjbmljX3NyaW92X3BmX2Rpc2FibGUoYWRhcHRlcik7Ci0KIAlxbGNuaWNfc3Jpb3ZfZnJlZV92bGFucyhhZGFwdGVyKTsKIAogCXFsY25pY19zcmlvdl9wZl9jbGVhbnVwKGFkYXB0ZXIpOwpAQCAtNTk1LDcgKzU5OSw2IEBACiAKIAlxbGNuaWNfc3Jpb3ZfYWxsb2NfdmxhbnMoYWRhcHRlcik7CiAKLQllcnIgPSBxbGNuaWNfc3Jpb3ZfcGZfZW5hYmxlKGFkYXB0ZXIsIG51bV92ZnMpOwogCXJldHVybiBlcnI7CiAKIGRlbF9mbHJfcXVldWU6CkBAIC02MjYsMjUgKzYyOSwzNiBAQAogCQlfX3FsY25pY19kb3duKGFkYXB0ZXIsIG5ldGRldik7CiAKIAllcnIgPSBfX3FsY25pY19wY2lfc3Jpb3ZfZW5hYmxlKGFkYXB0ZXIsIG51bV92ZnMpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBTUi1JT1Ygb24gcG9ydCAlZFxuIiwKLQkJCSAgICBhZGFwdGVyLT5wb3J0bnVtKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOwogCi0JCWVyciA9IC1FSU87Ci0JCWlmIChxbGNuaWNfODN4eF9jb25maWd1cmVfb3Btb2RlKGFkYXB0ZXIpKQotCQkJZ290byBlcnJvcjsKLQl9IGVsc2UgeworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCV9fcWxjbmljX3VwKGFkYXB0ZXIsIG5ldGRldik7CisKKwlydG5sX3VubG9jaygpOworCWVyciA9IHFsY25pY19zcmlvdl9wZl9lbmFibGUoYWRhcHRlciwgbnVtX3Zmcyk7CisJaWYgKCFlcnIpIHsKIAkJbmV0ZGV2X2luZm8obmV0ZGV2LAogCQkJICAgICJTUi1JT1YgaXMgZW5hYmxlZCBzdWNjZXNzZnVsbHkgb24gcG9ydCAlZFxuIiwKIAkJCSAgICBhZGFwdGVyLT5wb3J0bnVtKTsKIAkJLyogUmV0dXJuIG51bWJlciBvZiB2ZnMgZW5hYmxlZCAqLwotCQllcnIgPSBudW1fdmZzOworCQlyZXR1cm4gbnVtX3ZmczsKIAl9CisKKwlydG5sX2xvY2soKTsKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQlfX3FsY25pY191cChhZGFwdGVyLCBuZXRkZXYpOworCQlfX3FsY25pY19kb3duKGFkYXB0ZXIsIG5ldGRldik7CiAKIGVycm9yOgorCWlmICghcWxjbmljXzgzeHhfY29uZmlndXJlX29wbW9kZShhZGFwdGVyKSkgeworCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQkJX19xbGNuaWNfdXAoYWRhcHRlciwgbmV0ZGV2KTsKKwl9CisKIAlydG5sX3VubG9jaygpOworCW5ldGRldl9pbmZvKG5ldGRldiwgIkZhaWxlZCB0byBlbmFibGUgU1ItSU9WIG9uIHBvcnQgJWRcbiIsCisJCSAgICBhZGFwdGVyLT5wb3J0bnVtKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTc3Myw3ICs3ODcsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgcWxjbmljX3ZmX2luZm8gKnZmLAogCQkJCSAgICAgICB1MTYgdmxhbiwgdTggb3ApCiB7Ci0Jc3RydWN0IHFsY25pY19jbWRfYXJncyBjbWQ7CisJc3RydWN0IHFsY25pY19jbWRfYXJncyAqY21kOwogCXN0cnVjdCBxbGNuaWNfbWFjdmxhbl9tYnggbXY7CiAJc3RydWN0IHFsY25pY192cG9ydCAqdnA7CiAJdTggKmFkZHI7CkBAIC03ODMsMjEgKzc5NywyNyBAQAogCiAJdnAgPSB2Zi0+dnA7CiAKLQlpZiAocWxjbmljX2FsbG9jX21ieF9hcmdzKCZjbWQsIGFkYXB0ZXIsIFFMQ05JQ19DTURfQ09ORklHX01BQ19WTEFOKSkKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZXJyID0gcWxjbmljX2FsbG9jX21ieF9hcmdzKGNtZCwgYWRhcHRlciwgUUxDTklDX0NNRF9DT05GSUdfTUFDX1ZMQU4pOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9jbWQ7CisKKwljbWQtPnR5cGUgPSBRTENfODNYWF9NQlhfQ01EX05PX1dBSVQ7CiAJdnBpZCA9IHFsY25pY19zcmlvdl9wZl9nZXRfdnBvcnRfaGFuZGxlKGFkYXB0ZXIsIHZmLT5wY2lfZnVuYyk7CiAJaWYgKHZwaWQgPCAwKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGZyZWVfYXJnczsKIAl9CiAKIAlpZiAodmxhbikKIAkJb3AgPSAoKG9wID09IFFMQ05JQ19NQUNfQUREIHx8IG9wID09IFFMQ05JQ19NQUNfVkxBTl9BREQpID8KIAkJICAgICAgUUxDTklDX01BQ19WTEFOX0FERCA6IFFMQ05JQ19NQUNfVkxBTl9ERUwpOwogCi0JY21kLnJlcS5hcmdbMV0gPSBvcCB8ICgxIDw8IDgpIHwgKDMgPDwgNik7Ci0JY21kLnJlcS5hcmdbMV0gfD0gKCh2cGlkICYgMHhmZmZmKSA8PCAxNikgfCBCSVRfMzE7CisJY21kLT5yZXEuYXJnWzFdID0gb3AgfCAoMSA8PCA4KSB8ICgzIDw8IDYpOworCWNtZC0+cmVxLmFyZ1sxXSB8PSAoKHZwaWQgJiAweGZmZmYpIDw8IDE2KSB8IEJJVF8zMTsKIAogCWFkZHIgPSB2cC0+bWFjOwogCW12LnZsYW4gPSB2bGFuOwpAQCAtODA3LDE4ICs4MjcsMTggQEAKIAltdi5tYWNfYWRkcjMgPSBhZGRyWzNdOwogCW12Lm1hY19hZGRyNCA9IGFkZHJbNF07CiAJbXYubWFjX2FkZHI1ID0gYWRkcls1XTsKLQlidWYgPSAmY21kLnJlcS5hcmdbMl07CisJYnVmID0gJmNtZC0+cmVxLmFyZ1syXTsKIAltZW1jcHkoYnVmLCAmbXYsIHNpemVvZihzdHJ1Y3QgcWxjbmljX21hY3ZsYW5fbWJ4KSk7CiAKLQllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsICZjbWQpOworCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwgY21kKTsKIAotCWlmIChlcnIpCi0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJNQUMtVkxBTiAlcyB0byBDQU0gZmFpbGVkLCBlcnI9JWQuXG4iLAotCQkJKChvcCA9PSAxKSA/ICJhZGQgIiA6ICJkZWxldGUgIiksIGVycik7CisJaWYgKCFlcnIpCisJCXJldHVybiBlcnI7CiAKLW91dDoKLQlxbGNuaWNfZnJlZV9tYnhfYXJncygmY21kKTsKK2ZyZWVfYXJnczoKKwlxbGNuaWNfZnJlZV9tYnhfYXJncyhjbWQpOworZnJlZV9jbWQ6CisJa2ZyZWUoY21kKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04NDAsNyArODYwLDcgQEAKIAogCXNyaW92ID0gYWRhcHRlci0+YWh3LT5zcmlvdjsKIAotCW11dGV4X2xvY2soJnZmLT52bGFuX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZ2Zi0+dmxhbl9saXN0X2xvY2spOwogCWlmICh2Zi0+bnVtX3ZsYW4pIHsKIAkJZm9yIChpID0gMDsgaSA8IHNyaW92LT5udW1fYWxsb3dlZF92bGFuczsgaSsrKSB7CiAJCQl2bGFuID0gdmYtPnNyaW92X3ZsYW5zW2ldOwpAQCAtODQ5LDcgKzg2OSw3IEBACiAJCQkJCQkJICAgIG9wY29kZSk7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ2Zi0+dmxhbl9saXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZ2Zi0+dmxhbl9saXN0X2xvY2spOwogCiAJaWYgKHZmLT52cC0+dmxhbl9tb2RlICE9IFFMQ19QVklEX01PREUpIHsKIAkJaWYgKHFsY25pY184M3h4X3BmX2NoZWNrKGFkYXB0ZXIpICYmCkBAIC0xMTc4LDE5ICsxMTk4LDQxIEBACiB7CiAJc3RydWN0IHFsY25pY19uaWNfaW50cl9jb2FsZXNjZSAqY29hbCA9ICZhZGFwdGVyLT5haHctPmNvYWw7CiAJdTE2IGN0eF9pZCwgcGt0cywgdGltZTsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwl1OCB0eXBlOwogCisJdHlwZSA9IGNtZC0+cmVxLmFyZ1sxXSAmIFFMQ19JTlRSX0NPQUxfVFlQRV9NQVNLOwogCWN0eF9pZCA9IGNtZC0+cmVxLmFyZ1sxXSA+PiAxNjsKIAlwa3RzID0gY21kLT5yZXEuYXJnWzJdICYgMHhmZmZmOwogCXRpbWUgPSBjbWQtPnJlcS5hcmdbMl0gPj4gMTY7CiAKLQlpZiAoY3R4X2lkICE9IHZmLT5yeF9jdHhfaWQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChwa3RzID4gY29hbC0+cnhfcGFja2V0cykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHRpbWUgPCBjb2FsLT5yeF90aW1lX3VzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFFMQ05JQ19JTlRSX0NPQUxfVFlQRV9SWDoKKwkJaWYgKGN0eF9pZCAhPSB2Zi0+cnhfY3R4X2lkIHx8IHBrdHMgPiBjb2FsLT5yeF9wYWNrZXRzIHx8CisJCSAgICB0aW1lIDwgY29hbC0+cnhfdGltZV91cykKKwkJCWdvdG8gZXJyX2xhYmVsOworCQlicmVhazsKKwljYXNlIFFMQ05JQ19JTlRSX0NPQUxfVFlQRV9UWDoKKwkJaWYgKGN0eF9pZCAhPSB2Zi0+dHhfY3R4X2lkIHx8IHBrdHMgPiBjb2FsLT50eF9wYWNrZXRzIHx8CisJCSAgICB0aW1lIDwgY29hbC0+dHhfdGltZV91cykKKwkJCWdvdG8gZXJyX2xhYmVsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRkZXZfZXJyKGFkYXB0ZXItPm5ldGRldiwgIkludmFsaWQgY29hbGVzY2luZyB0eXBlIDB4JXggcmVjZWl2ZWRcbiIsCisJCQkgICB0eXBlKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKKworZXJyX2xhYmVsOgorCW5ldGRldl9lcnIoYWRhcHRlci0+bmV0ZGV2LCAiRXhwZWN0ZWQ6IHJ4X2N0eF9pZCAweCV4IHJ4X3BhY2tldHMgMHgleCByeF90aW1lX3VzIDB4JXggdHhfY3R4X2lkIDB4JXggdHhfcGFja2V0cyAweCV4IHR4X3RpbWVfdXMgMHgleFxuIiwKKwkJICAgdmYtPnJ4X2N0eF9pZCwgY29hbC0+cnhfcGFja2V0cywgY29hbC0+cnhfdGltZV91cywKKwkJICAgdmYtPnR4X2N0eF9pZCwgY29hbC0+dHhfcGFja2V0cywgY29hbC0+dHhfdGltZV91cyk7CisJbmV0ZGV2X2VycihhZGFwdGVyLT5uZXRkZXYsICJSZWNlaXZlZDogY3R4X2lkIDB4JXggcGFja2V0cyAweCV4IHRpbWVfdXMgMHgleCB0eXBlIDB4JXhcbiIsCisJCSAgIGN0eF9pZCwgcGt0cywgdGltZSwgdHlwZSk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHFsY25pY19zcmlvdl9wZl9jZmdfaW50cmNvYWxfY21kKHN0cnVjdCBxbGNuaWNfYmNfdHJhbnMgKnRyYW4sCkBAIC0xMjE0LDcgKzEyNTYsNiBAQAogCQkJCQkgICAgIHN0cnVjdCBxbGNuaWNfdmZfaW5mbyAqdmYsCiAJCQkJCSAgICAgc3RydWN0IHFsY25pY19jbWRfYXJncyAqY21kKQogewotCXN0cnVjdCBxbGNuaWNfbWFjdmxhbl9tYnggKm1hY3ZsYW47CiAJc3RydWN0IHFsY25pY192cG9ydCAqdnAgPSB2Zi0+dnA7CiAJdTggb3AsIG5ld19vcDsKIApAQCAtMTIyNCwxNCArMTI2NSw2IEBACiAJY21kLT5yZXEuYXJnWzFdIHw9ICh2Zi0+dnAtPmhhbmRsZSA8PCAxNik7CiAJY21kLT5yZXEuYXJnWzFdIHw9IEJJVF8zMTsKIAotCW1hY3ZsYW4gPSAoc3RydWN0IHFsY25pY19tYWN2bGFuX21ieCAqKSZjbWQtPnJlcS5hcmdbMl07Ci0JaWYgKCEobWFjdmxhbi0+bWFjX2FkZHIwICYgQklUXzApKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJNQUMgYWRkcmVzcyBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgZnJvbSBWRiAlZCIsCi0JCQl2Zi0+cGNpX2Z1bmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAodnAtPnZsYW5fbW9kZSA9PSBRTENfUFZJRF9NT0RFKSB7CiAJCW9wID0gY21kLT5yZXEuYXJnWzFdICYgMHg3OwogCQljbWQtPnJlcS5hcmdbMV0gJj0gfjB4NzsKQEAgLTE4MTUsNyArMTg0OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3R4X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCBpbnQgdHhfcmF0ZSkKK2ludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3R4X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAorCQkJCWludCBtaW5fdHhfcmF0ZSwgaW50IG1heF90eF9yYXRlKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHFsY25pY19zcmlvdiAqc3Jpb3YgPSBhZGFwdGVyLT5haHctPnNyaW92OwpAQCAtMTgzMCwzNSArMTg2NCw1MiBAQAogCWlmICh2ZiA+PSBzcmlvdi0+bnVtX3ZmcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAodHhfcmF0ZSA+PSAxMDAwMCB8fCB0eF9yYXRlIDwgMTAwKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LAotCQkJICAgIkludmFsaWQgVHggcmF0ZSwgYWxsb3dlZCByYW5nZSBpcyBbJWQgLSAlZF0iLAotCQkJICAgUUxDX1ZGX01JTl9UWF9SQVRFLCBRTENfVkZfTUFYX1RYX1JBVEUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodHhfcmF0ZSA9PSAwKQotCQl0eF9yYXRlID0gMTAwMDA7Ci0KIAl2Zl9pbmZvID0gJnNyaW92LT52Zl9pbmZvW3ZmXTsKIAl2cCA9IHZmX2luZm8tPnZwOwogCXZwaWQgPSB2cC0+aGFuZGxlOwogCisJaWYgKCFtaW5fdHhfcmF0ZSkKKwkJbWluX3R4X3JhdGUgPSBRTENfVkZfTUlOX1RYX1JBVEU7CisKKwlpZiAobWF4X3R4X3JhdGUgJiYKKwkgICAgKG1heF90eF9yYXRlID49IDEwMDAwIHx8IG1heF90eF9yYXRlIDwgbWluX3R4X3JhdGUpKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJICAgIkludmFsaWQgbWF4IFR4IHJhdGUsIGFsbG93ZWQgcmFuZ2UgaXMgWyVkIC0gJWRdIiwKKwkJCSAgIG1pbl90eF9yYXRlLCBRTENfVkZfTUFYX1RYX1JBVEUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIW1heF90eF9yYXRlKQorCQltYXhfdHhfcmF0ZSA9IDEwMDAwOworCisJaWYgKG1pbl90eF9yYXRlICYmCisJICAgIChtaW5fdHhfcmF0ZSA+IG1heF90eF9yYXRlIHx8IG1pbl90eF9yYXRlIDwgUUxDX1ZGX01JTl9UWF9SQVRFKSkgeworCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCSAgICJJbnZhbGlkIG1pbiBUeCByYXRlLCBhbGxvd2VkIHJhbmdlIGlzIFslZCAtICVkXSIsCisJCQkgICBRTENfVkZfTUlOX1RYX1JBVEUsIG1heF90eF9yYXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHRlc3RfYml0KFFMQ19CQ19WRl9TVEFURSwgJnZmX2luZm8tPnN0YXRlKSkgewogCQlpZiAocWxjbmljX3NyaW92X2dldF92Zl92cG9ydF9pbmZvKGFkYXB0ZXIsICZuaWNfaW5mbywgdnBpZCkpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQluaWNfaW5mby5tYXhfdHhfYncgPSB0eF9yYXRlIC8gMTAwOworCQluaWNfaW5mby5tYXhfdHhfYncgPSBtYXhfdHhfcmF0ZSAvIDEwMDsKKwkJbmljX2luZm8ubWluX3R4X2J3ID0gbWluX3R4X3JhdGUgLyAxMDA7CiAJCW5pY19pbmZvLmJpdF9vZmZzZXRzID0gQklUXzA7CiAKIAkJaWYgKHFsY25pY19zcmlvdl9wZl9zZXRfdnBvcnRfaW5mbyhhZGFwdGVyLCAmbmljX2luZm8sIHZwaWQpKQogCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JdnAtPm1heF90eF9idyA9IHR4X3JhdGUgLyAxMDA7CisJdnAtPm1heF90eF9idyA9IG1heF90eF9yYXRlIC8gMTAwOwogCW5ldGRldl9pbmZvKG5ldGRldiwKLQkJICAgICJTZXR0aW5nIFR4IHJhdGUgJWQgKE1icHMpLCAlZCAlJSBvZiBQRiBiYW5kd2lkdGgsIGZvciBWRiAlZFxuIiwKLQkJICAgIHR4X3JhdGUsIHZwLT5tYXhfdHhfYncsIHZmKTsKKwkJICAgICJTZXR0aW5nIE1heCBUeCByYXRlICVkIChNYnBzKSwgJWQgJSUgb2YgUEYgYmFuZHdpZHRoLCBmb3IgVkYgJWRcbiIsCisJCSAgICBtYXhfdHhfcmF0ZSwgdnAtPm1heF90eF9idywgdmYpOworCXZwLT5taW5fdHhfYncgPSBtaW5fdHhfcmF0ZSAvIDEwMDsKKwluZXRkZXZfaW5mbyhuZXRkZXYsCisJCSAgICAiU2V0dGluZyBNaW4gVHggcmF0ZSAlZCAoTWJwcyksICVkICUlIG9mIFBGIGJhbmR3aWR0aCwgZm9yIFZGICVkXG4iLAorCQkgICAgbWluX3R4X3JhdGUsIHZwLT5taW5fdHhfYncsIHZmKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk1Nyw5ICsyMDA4LDEzIEBACiAJaXZpLT5xb3MgPSB2cC0+cW9zOwogCWl2aS0+c3Bvb2ZjaGsgPSB2cC0+c3Bvb2ZjaGs7CiAJaWYgKHZwLT5tYXhfdHhfYncgPT0gTUFYX0JXKQotCQlpdmktPnR4X3JhdGUgPSAwOworCQlpdmktPm1heF90eF9yYXRlID0gMDsKIAllbHNlCi0JCWl2aS0+dHhfcmF0ZSA9IHZwLT5tYXhfdHhfYncgKiAxMDA7CisJCWl2aS0+bWF4X3R4X3JhdGUgPSB2cC0+bWF4X3R4X2J3ICogMTAwOworCWlmICh2cC0+bWluX3R4X2J3ID09IE1JTl9CVykKKwkJaXZpLT5taW5fdHhfcmF0ZSA9IDA7CisJZWxzZQorCQlpdmktPm1pbl90eF9yYXRlID0gdnAtPm1pbl90eF9idyAqIDEwMDsKIAogCWl2aS0+dmYgPSB2ZjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zeXNmcy5jCmluZGV4IGNkMzQ2ZTI3Li5mNTc4NmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3N5c2ZzLmMKQEAgLTE5LDYgKzE5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9hZXIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaWZkZWYgQ09ORklHX1FMQ05JQ19IV01PTgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNlbmRpZgogCiAjZGVmaW5lIFFMQ19TVEFUVVNfVU5TVVBQT1JURURfQ01ECS0yCiAKQEAgLTM1OCw2ICszNjIsOCBAQAogCQlpZiAoYWRhcHRlci0+bnBhcnNbaV0ucGNpX2Z1bmMgPT0gcGNpX2Z1bmMpCiAJCQlyZXR1cm4gaTsKIAl9CisKKwlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogSW52YWxpZCBuaWMgZnVuY3Rpb25cbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMTI0Myw2ICsxMjQ5LDY4IEBACiAJLndyaXRlID0gcWxjbmljXzgzeHhfc3lzZnNfZmxhc2hfd3JpdGVfaGFuZGxlciwKIH07CiAKKyNpZmRlZiBDT05GSUdfUUxDTklDX0hXTU9OCisKK3N0YXRpYyBzc2l6ZV90IHFsY25pY19od21vbl9zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRlbXBlcmF0dXJlID0gMCwgdmFsdWUgPSAwOworCisJaWYgKHFsY25pY184M3h4X2NoZWNrKGFkYXB0ZXIpKQorCQl2YWx1ZSA9IFFMQ1JEWChhZGFwdGVyLT5haHcsIFFMQ184M1hYX0FTSUNfVEVNUCk7CisJZWxzZSBpZiAocWxjbmljXzgyeHhfY2hlY2soYWRhcHRlcikpCisJCXZhbHVlID0gUUxDX1NIQVJFRF9SRUdfUkQzMihhZGFwdGVyLCBRTENOSUNfQVNJQ19URU1QKTsKKworCXRlbXBlcmF0dXJlID0gcWxjbmljX2dldF90ZW1wX3ZhbCh2YWx1ZSk7CisJLyogZGlzcGxheSBtaWxsaWRlZ3JlZSBjZWxjaXVzICovCisJdGVtcGVyYXR1cmUgKj0gMTAwMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdGVtcGVyYXR1cmUpOworfQorCisvKiBod21vbi1zeXNmcyBhdHRyaWJ1dGVzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLAorCQkJICBxbGNuaWNfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAxKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnFsY25pY19od21vbl9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKHFsY25pY19od21vbik7CisKK3ZvaWQgcWxjbmljX3JlZ2lzdGVyX2h3bW9uX2RldihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisKKwkvKiBTa2lwIGh3bW9uIHJlZ2lzdHJhdGlvbiBmb3IgYSBWRiBkZXZpY2UgKi8KKwlpZiAocWxjbmljX3NyaW92X3ZmX2NoZWNrKGFkYXB0ZXIpKSB7CisJCWFkYXB0ZXItPmFody0+aHdtb25fZGV2ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlod21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBxbGNuaWNfZHJpdmVyX25hbWUsCisJCQkJCQkgICAgICBhZGFwdGVyLAorCQkJCQkJICAgICAgcWxjbmljX2h3bW9uX2dyb3Vwcyk7CisJaWYgKElTX0VSUihod21vbl9kZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIHdpdGggaHdtb24sIGVycj0lbGRcbiIsCisJCQlQVFJfRVJSKGh3bW9uX2RldikpOworCQlod21vbl9kZXYgPSBOVUxMOworCX0KKwlhZGFwdGVyLT5haHctPmh3bW9uX2RldiA9IGh3bW9uX2RldjsKK30KKwordm9pZCBxbGNuaWNfdW5yZWdpc3Rlcl9od21vbl9kZXYoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldiA9IGFkYXB0ZXItPmFody0+aHdtb25fZGV2OworCWlmIChod21vbl9kZXYpIHsKKwkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoaHdtb25fZGV2KTsKKwkJYWRhcHRlci0+YWh3LT5od21vbl9kZXYgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCiB2b2lkIHFsY25pY19jcmVhdGVfc3lzZnNfZW50cmllcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggMGExZDc2YWMuLmI0MDA1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCkBAIC0zNTk1LDcgKzM1OTUsNyBAQAogCX0KIAlyZXR1cm4gc3RhdHVzOwogZXJyX2lycToKLQluZXRpZl9lcnIocWRldiwgaWZ1cCwgcWRldi0+bmRldiwgIkZhaWxlZCB0byBnZXQgdGhlIGludGVycnVwdHMhISEvbiIpOworCW5ldGlmX2VycihxZGV2LCBpZnVwLCBxZGV2LT5uZGV2LCAiRmFpbGVkIHRvIGdldCB0aGUgaW50ZXJydXB0cyEhIVxuIik7CiAJcWxfZnJlZV9pcnEocWRldik7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ3NzAsNyArNDc3MCw3IEBACiAJbmRldi0+aXJxID0gcGRldi0+aXJxOwogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZxbGdlX25ldGRldl9vcHM7Ci0JU0VUX0VUSFRPT0xfT1BTKG5kZXYsICZxbGdlX2V0aHRvb2xfb3BzKTsKKwluZGV2LT5ldGh0b29sX29wcyA9ICZxbGdlX2V0aHRvb2xfb3BzOwogCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gMTAgKiBIWjsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYwppbmRleCBhYTFjMDc5Li5iZTQyNWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9yODE2OS5jCkBAIC03MTI1LDcgKzcxMjUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQlkZXYtPmRldl9hZGRyW2ldID0gUlRMX1I4KE1BQzAgKyBpKTsKIAotCVNFVF9FVEhUT09MX09QUyhkZXYsICZydGw4MTY5X2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnJ0bDgxNjlfZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFJUTDgxNjlfVFhfVElNRU9VVDsKIAogCW5ldGlmX25hcGlfYWRkKGRldiwgJnRwLT5uYXBpLCBydGw4MTY5X3BvbGwsIFI4MTY5X05BUElfV0VJR0hUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCmluZGV4IDZhOTUwOWMuLjc2MjIyMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYwpAQCAtMzA3LDYgKzMwNywyNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBzaF9ldGhfb2Zmc2V0X2Zhc3Rfc2gzX3NoMltTSF9FVEhfTUFYX1JFR0lTVEVSX09GRlNFVF0gPSB7CisJW0VETVJdCQk9IDB4MDAwMCwKKwlbRURUUlJdCQk9IDB4MDAwNCwKKwlbRURSUlJdCQk9IDB4MDAwOCwKKwlbVERMQVJdCQk9IDB4MDAwYywKKwlbUkRMQVJdCQk9IDB4MDAxMCwKKwlbRUVTUl0JCT0gMHgwMDE0LAorCVtFRVNJUFJdCT0gMHgwMDE4LAorCVtUUlNDRVJdCT0gMHgwMDFjLAorCVtSTUZDUl0JCT0gMHgwMDIwLAorCVtURlRSXQkJPSAweDAwMjQsCisJW0ZEUl0JCT0gMHgwMDI4LAorCVtSTUNSXQkJPSAweDAwMmMsCisJW0VET0NSXQkJPSAweDAwMzAsCisJW0ZDRlRSXQkJPSAweDAwMzQsCisJW1JQQURJUl0JPSAweDAwMzgsCisJW1RSSU1EXQkJPSAweDAwM2MsCisJW1JCV0FSXQkJPSAweDAwNDAsCisJW1JERkFSXQkJPSAweDAwNDQsCisJW1RCUkFSXQkJPSAweDAwNGMsCisJW1RERkFSXQkJPSAweDAwNTAsCisKIAlbRUNNUl0JCT0gMHgwMTYwLAogCVtFQ1NSXQkJPSAweDAxNjQsCiAJW0VDU0lQUl0JPSAweDAxNjgsCkBAIC01NDYsNyArNTY3LDYgQEAKIAkucmVnaXN0ZXJfdHlwZQk9IFNIX0VUSF9SRUdfRkFTVF9TSDQsCiAKIAkuZWVzaXByX3ZhbHVlCT0gRE1BQ19NX1JGUk1FUiB8IERNQUNfTV9FQ0kgfCAweDAwM2ZmZmZmLAotCS5ybWNyX3ZhbHVlCT0gUk1DUl9STkMsCiAKIAkudHhfY2hlY2sJPSBFRVNSX0ZUQyB8IEVFU1JfQ05EIHwgRUVTUl9ETEMgfCBFRVNSX0NEIHwgRUVTUl9SVE8sCiAJLmVlc3JfZXJyX2NoZWNrCT0gRUVTUl9UV0IgfCBFRVNSX1RBQlQgfCBFRVNSX1JBQlQgfCBFRVNSX1JGRSB8CkBAIC02MjQsNyArNjQ0LDYgQEAKIAkJCSAgRUVTUl9SRkUgfCBFRVNSX1JERSB8IEVFU1JfUkZSTUVSIHwgRUVTUl9URkUgfAogCQkJICBFRVNSX1RERSB8IEVFU1JfRUNJLAogCS5mZHJfdmFsdWUJPSAweDAwMDAwNzJmLAotCS5ybWNyX3ZhbHVlCT0gUk1DUl9STkMsCiAKIAkuaXJxX2ZsYWdzCT0gSVJRRl9TSEFSRUQsCiAJLmFwcgkJPSAxLApAQCAtNzUyLDcgKzc3MSw2IEBACiAJCQkgIEVFU1JfUkZFIHwgRUVTUl9SREUgfCBFRVNSX1JGUk1FUiB8IEVFU1JfVEZFIHwKIAkJCSAgRUVTUl9UREUgfCBFRVNSX0VDSSwKIAkuZmRyX3ZhbHVlCT0gMHgwMDAwMDcwZiwKLQkucm1jcl92YWx1ZQk9IFJNQ1JfUk5DLAogCiAJLmFwcgkJPSAxLAogCS5tcHIJCT0gMSwKQEAgLTc4NCw3ICs4MDIsNiBAQAogCQkJICBFRVNSX1JGRSB8IEVFU1JfUkRFIHwgRUVTUl9SRlJNRVIgfCBFRVNSX1RGRSB8CiAJCQkgIEVFU1JfVERFIHwgRUVTUl9FQ0ksCiAJLmZkcl92YWx1ZQk9IDB4MDAwMDA3MGYsCi0JLnJtY3JfdmFsdWUJPSBSTUNSX1JOQywKIAogCS5ub19wc3IJCT0gMSwKIAkuYXByCQk9IDEsCkBAIC04MzMsOSArODUwLDYgQEAKIAlpZiAoIWNkLT5mZHJfdmFsdWUpCiAJCWNkLT5mZHJfdmFsdWUgPSBERUZBVUxUX0ZEUl9JTklUOwogCi0JaWYgKCFjZC0+cm1jcl92YWx1ZSkKLQkJY2QtPnJtY3JfdmFsdWUgPSBERUZBVUxUX1JNQ1JfVkFMVUU7Ci0KIAlpZiAoIWNkLT50eF9jaGVjaykKIAkJY2QtPnR4X2NoZWNrID0gREVGQVVMVF9UWF9DSEVDSzsKIApAQCAtMTI4Nyw4ICsxMzAxLDggQEAKIAlzaF9ldGhfd3JpdGUobmRldiwgbWRwLT5jZC0+ZmRyX3ZhbHVlLCBGRFIpOwogCXNoX2V0aF93cml0ZShuZGV2LCAwLCBURlRSKTsKIAotCS8qIEZyYW1lIHJlY3YgY29udHJvbCAqLwotCXNoX2V0aF93cml0ZShuZGV2LCBtZHAtPmNkLT5ybWNyX3ZhbHVlLCBSTUNSKTsKKwkvKiBGcmFtZSByZWN2IGNvbnRyb2wgKGVuYWJsZSBtdWx0aXBsZS1wYWNrZXRzIHBlciByeCBpcnEpICovCisJc2hfZXRoX3dyaXRlKG5kZXYsIFJNQ1JfUk5DLCBSTUNSKTsKIAogCXNoX2V0aF93cml0ZShuZGV2LCBERVNDX0lfUklOVDggfCBERVNDX0lfUklOVDUgfCBERVNDX0lfVElOVDIsIFRSU0NFUik7CiAKQEAgLTEzODUsNyArMTM5OSw2IEBACiAJaW50IGVudHJ5ID0gbWRwLT5jdXJfcnggJSBtZHAtPm51bV9yeF9yaW5nOwogCWludCBib2d1c2NudCA9IChtZHAtPmRpcnR5X3J4ICsgbWRwLT5udW1fcnhfcmluZykgLSBtZHAtPmN1cl9yeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBleGNlZWRlZCA9IDA7CiAJdTE2IHBrdF9sZW4gPSAwOwogCXUzMiBkZXNjX3N0YXR1czsKIApAQCAtMTM5NywxMCArMTQxMCw5IEBACiAJCWlmICgtLWJvZ3VzY250IDwgMCkKIAkJCWJyZWFrOwogCi0JCWlmICgqcXVvdGEgPD0gMCkgewotCQkJZXhjZWVkZWQgPSAxOworCQlpZiAoKnF1b3RhIDw9IDApCiAJCQlicmVhazsKLQkJfQorCiAJCSgqcXVvdGEpLS07CiAKIAkJaWYgKCEoZGVzY19zdGF0dXMgJiBSREZFTkQpKQpAQCAtMTQ0OCw3ICsxNDYwLDYgQEAKIAkJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CiAJCX0KLQkJcnhkZXNjLT5zdGF0dXMgfD0gY3B1X3RvX2VkbWFjKG1kcCwgUkRfUkFDVCk7CiAJCWVudHJ5ID0gKCsrbWRwLT5jdXJfcngpICUgbWRwLT5udW1fcnhfcmluZzsKIAkJcnhkZXNjID0gJm1kcC0+cnhfcmluZ1tlbnRyeV07CiAJfQpAQCAtMTQ5NCw3ICsxNTA1LDcgQEAKIAkJc2hfZXRoX3dyaXRlKG5kZXYsIEVEUlJSX1IsIEVEUlJSKTsKIAl9CiAKLQlyZXR1cm4gZXhjZWVkZWQ7CisJcmV0dXJuICpxdW90YSA8PSAwOwogfQogCiBzdGF0aWMgdm9pZCBzaF9ldGhfcmN2X3NuZF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpAQCAtMjYyNyw4ICsyNjM4LDggQEAKIAkJIHBkZXYtPm5hbWUsIHBkZXYtPmlkKTsKIAogCS8qIFBIWSBJUlEgKi8KLQltZHAtPm1paV9idXMtPmlycSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihpbnQpICogUEhZX01BWF9BRERSLAotCQkJCQkgR0ZQX0tFUk5FTCk7CisJbWRwLT5taWlfYnVzLT5pcnEgPSBkZXZtX2ttYWxsb2NfYXJyYXkoZGV2LCBQSFlfTUFYX0FERFIsIHNpemVvZihpbnQpLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZHAtPm1paV9idXMtPmlycSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9mcmVlX2J1czsKQEAgLTI4NDMsNyArMjg1NCw3IEBACiAJCW5kZXYtPm5ldGRldl9vcHMgPSAmc2hfZXRoX25ldGRldl9vcHNfdHN1OwogCWVsc2UKIAkJbmRldi0+bmV0ZGV2X29wcyA9ICZzaF9ldGhfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmRldiwgJnNoX2V0aF9ldGh0b29sX29wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmc2hfZXRoX2V0aHRvb2xfb3BzOwogCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCS8qIGRlYnVnIG1lc3NhZ2UgbGV2ZWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oCmluZGV4IGQ1NWUzN2MuLmIzN2M0MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaApAQCAtMzE5LDcgKzMxOSw2IEBACiBlbnVtIFJNQ1JfQklUIHsKIAlSTUNSX1JOQyA9IDB4MDAwMDAwMDEsCiB9OwotI2RlZmluZSBERUZBVUxUX1JNQ1JfVkFMVUUJMHgwMDAwMDAwMAogCiAvKiBFQ01SICovCiBlbnVtIEZFTElDX01PREVfQklUIHsKQEAgLTQ2Niw3ICs0NjUsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmRyX3ZhbHVlOwogCXVuc2lnbmVkIGxvbmcgZmNmdHJfdmFsdWU7CiAJdW5zaWduZWQgbG9uZyBycGFkaXJfdmFsdWU7Ci0JdW5zaWduZWQgbG9uZyBybWNyX3ZhbHVlOwogCiAJLyogaW50ZXJydXB0IGNoZWNraW5nIG1hc2sgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2NoZWNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2Ftc3VuZy9zeGdiZS9zeGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX2V0aHRvb2wuYwppbmRleCAwNDE1ZmE1Li5jMDk4MWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX2V0aHRvb2wuYwpAQCAtNTIwLDUgKzUyMCw1IEBACiAKIHZvaWQgc3hnYmVfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnN4Z2JlX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnN4Z2JlX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2Ftc3VuZy9zeGdiZS9zeGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX21haW4uYwppbmRleCA4MmE5YTk4Li42OTg0OTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX21haW4uYwpAQCAtNDI1LDggKzQyNSw4IEBACiAgKiBAcnhfcnNpemU6IHJpbmcgc2l6ZQogICogRGVzY3JpcHRpb246ICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBETUEgUlggZGVzY3JpcHRvcgogICovCi12b2lkIGZyZWVfcnhfcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzeGdiZV9yeF9xdWV1ZSAqcnhfcmluZywKLQkJICBpbnQgcnhfcnNpemUpCitzdGF0aWMgdm9pZCBmcmVlX3J4X3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3hnYmVfcnhfcXVldWUgKnJ4X3JpbmcsCisJCQkgaW50IHJ4X3JzaXplKQogewogCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgcnhfcnNpemUgKiBzaXplb2Yoc3RydWN0IHN4Z2JlX3J4X25vcm1fZGVzYyksCiAJCQkgIHJ4X3JpbmctPmRtYV9yeCwgcnhfcmluZy0+ZG1hX3J4X3BoeSk7CkBAIC01MTksOCArNTE5LDggQEAKICAqIEB0eF9yc2l6ZTogcmluZyBzaXplCiAgKiBEZXNjcmlwdGlvbjogIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIERNQSBUWCBkZXNjcmlwdG9yCiAgKi8KLXZvaWQgZnJlZV90eF9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHN4Z2JlX3R4X3F1ZXVlICp0eF9yaW5nLAotCQkgIGludCB0eF9yc2l6ZSkKK3N0YXRpYyB2b2lkIGZyZWVfdHhfcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzeGdiZV90eF9xdWV1ZSAqdHhfcmluZywKKwkJCSBpbnQgdHhfcnNpemUpCiB7CiAJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCB0eF9yc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc3hnYmVfdHhfbm9ybV9kZXNjKSwKIAkJCSAgdHhfcmluZy0+ZG1hX3R4LCB0eF9yaW5nLT5kbWFfdHhfcGh5KTsKQEAgLTEyMjEsMTEgKzEyMjEsMTAgQEAKIAogCXJldHVybiAwOwogfQotCiAvKiBQcmVwYXJlIGZpcnN0IFR4IGRlc2NyaXB0b3IgZm9yIGRvaW5nIFRTTyBvcGVyYXRpb24gKi8KLXZvaWQgc3hnYmVfdHNvX3ByZXBhcmUoc3RydWN0IHN4Z2JlX3ByaXZfZGF0YSAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCBzeGdiZV90eF9ub3JtX2Rlc2MgKmZpcnN0X2Rlc2MsCi0JCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgc3hnYmVfdHNvX3ByZXBhcmUoc3RydWN0IHN4Z2JlX3ByaXZfZGF0YSAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBzeGdiZV90eF9ub3JtX2Rlc2MgKmZpcnN0X2Rlc2MsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGludCB0b3RhbF9oZHJfbGVuLCB0Y3BfaGRyX2xlbjsKIApAQCAtMTkxNCw0MCArMTkxMyw2IEBACiAJCSAgIHJlYWRsKGlvYWRkciArIFNYR0JFX0hBU0hfTE9XKSk7CiB9CiAKLS8qKgotICogc3hnYmVfY29uZmlnIC0gZW50cnkgcG9pbnQgZm9yIGNoYW5naW5nIGNvbmZpZ3VyYXRpb24gbW9kZSBwYXNzZWQgb24gYnkKLSAqIGlmY29uZmlnCi0gKiBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQG1hcCA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBtYXBwaW5nIHN0cnVjdHVyZQotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgZHJpdmVyIGVudHJ5IHBvaW50IHdoaWNoIGdldHMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwKLSAqIHdoZW5ldmVyIHNvbWUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4KLSAqIFJldHVybiB2YWx1ZToKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHN1Y2Nlc3MgYW5kIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGludCBzeGdiZV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCi17Ci0Jc3RydWN0IHN4Z2JlX3ByaXZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkvKiBDYW4ndCBhY3Qgb24gYSBydW5uaW5nIGludGVyZmFjZSAqLwotCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIEkvTyBhZGRyZXNzICovCi0JaWYgKG1hcC0+YmFzZV9hZGRyICE9ICh1bnNpZ25lZCBsb25nKXByaXYtPmlvYWRkcikgewotCQluZXRkZXZfd2FybihkZXYsICJjYW4ndCBjaGFuZ2UgSS9PIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIElSUSAqLwotCWlmIChtYXAtPmlycSAhPSBwcml2LT5pcnEpIHsKLQkJbmV0ZGV2X3dhcm4oZGV2LCAibm90IGNoYW5nZSBJUlEgbnVtYmVyICVkXG4iLCBwcml2LT5pcnEpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogLyoqCiAgKiBzeGdiZV9wb2xsX2NvbnRyb2xsZXIgLSBlbnRyeSBwb2ludCBmb3IgcG9sbGluZyByZWNlaXZlIGJ5IGRldmljZQpAQCAtMjAwOSw3ICsxOTc0LDYgQEAKIAkubmRvX3NldF9yeF9tb2RlCT0gc3hnYmVfc2V0X3J4X21vZGUsCiAJLm5kb190eF90aW1lb3V0CQk9IHN4Z2JlX3R4X3RpbWVvdXQsCiAJLm5kb19kb19pb2N0bAkJPSBzeGdiZV9pb2N0bCwKLQkubmRvX3NldF9jb25maWcJCT0gc3hnYmVfY29uZmlnLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBzeGdiZV9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NhbXN1bmcvc3hnYmUvc3hnYmVfcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zYW1zdW5nL3N4Z2JlL3N4Z2JlX3JlZy5oCmluZGV4IDU2ZjhiZjUuLjgxNDM3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NhbXN1bmcvc3hnYmUvc3hnYmVfcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2Ftc3VuZy9zeGdiZS9zeGdiZV9yZWcuaApAQCAtMTg4LDcgKzE4OCw2IEBACiAKIC8qIEwzL0w0IGZ1bmN0aW9uIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTWEdCRV9DT1JFX0wzNF9BRERDVExfUkVHCTB4MEMwMAotI2RlZmluZSBTWEdCRV9DT1JFX0wzNF9BRERDVExfUkVHCTB4MEMwMAogI2RlZmluZSBTWEdCRV9DT1JFX0wzNF9EQVRBX1JFRwkJMHgwQzA0CiAKIC8qIEFSUCByZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwppbmRleCA2M2Q1OTVmLi4xZTI3NDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCkBAIC0yMjQ4LDcgKzIyNDgsNyBAQAogCX0gZWxzZSB7CiAJCW5ldF9kZXYtPm5ldGRldl9vcHMgPSAmZWZ4X2ZhcmNoX25ldGRldl9vcHM7CiAJfQotCVNFVF9FVEhUT09MX09QUyhuZXRfZGV2LCAmZWZ4X2V0aHRvb2xfb3BzKTsKKwluZXRfZGV2LT5ldGh0b29sX29wcyA9ICZlZnhfZXRodG9vbF9vcHM7CiAJbmV0X2Rldi0+Z3NvX21heF9zZWdzID0gRUZYX1RTT19NQVhfU0VHUzsKIAogCXJ0bmxfbG9jaygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9ldGh0b29sLmMKaW5kZXggMGRlOGIwNy4uNzQ3MzljNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZXRodG9vbC5jCkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogCQkwIDogQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKSk7CiB9CiAKLXN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiAqaW5kaXIpCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1MzIgKmluZGlyLCB1OCAqa2V5KQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIApAQCAtMTA0MSw4ICsxMDQxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKLQkJCQkgICAgICBjb25zdCB1MzIgKmluZGlyKQorc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQljb25zdCB1MzIgKmluZGlyLCBjb25zdCB1OCAqa2V5KQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIApAQCAtMTEyNSw4ICsxMTI1LDggQEAKIAkuZ2V0X3J4bmZjCQk9IGVmeF9ldGh0b29sX2dldF9yeG5mYywKIAkuc2V0X3J4bmZjCQk9IGVmeF9ldGh0b29sX3NldF9yeG5mYywKIAkuZ2V0X3J4ZmhfaW5kaXJfc2l6ZQk9IGVmeF9ldGh0b29sX2dldF9yeGZoX2luZGlyX3NpemUsCi0JLmdldF9yeGZoX2luZGlyCQk9IGVmeF9ldGh0b29sX2dldF9yeGZoX2luZGlyLAotCS5zZXRfcnhmaF9pbmRpcgkJPSBlZnhfZXRodG9vbF9zZXRfcnhmaF9pbmRpciwKKwkuZ2V0X3J4ZmgJCT0gZWZ4X2V0aHRvb2xfZ2V0X3J4ZmgsCisJLnNldF9yeGZoCQk9IGVmeF9ldGh0b29sX3NldF9yeGZoLAogCS5nZXRfdHNfaW5mbwkJPSBlZnhfZXRodG9vbF9nZXRfdHNfaW5mbywKIAkuZ2V0X21vZHVsZV9pbmZvCT0gZWZ4X2V0aHRvb2xfZ2V0X21vZHVsZV9pbmZvLAogCS5nZXRfbW9kdWxlX2VlcHJvbQk9IGVmeF9ldGh0b29sX2dldF9tb2R1bGVfZWVwcm9tLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2lvLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvaW8uaAppbmRleCA0ZDNmMTE5Li5hZmI5NGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvaW8uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvaW8uaApAQCAtNjYsMTAgKzY2LDE3IEBACiAjZGVmaW5lIEVGWF9VU0VfUVdPUkRfSU8gMQogI2VuZGlmCiAKKy8qIEhhcmR3YXJlIGlzc3VlIHJlcXVpcmVzIHRoYXQgb25seSA2NC1iaXQgbmF0dXJhbGx5IGFsaWduZWQgd3JpdGVzCisgKiBhcmUgc2VlbiBieSBoYXJkd2FyZS4gSXRzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8gcmVzdHJpY3QgdG8KKyAqIHg4Nl82NCBhcmNoLCBidXQgZG9uZSBmb3Igc2FmZXR5IHNpbmNlIHVudXN1YWwgd3JpdGUgY29tYmluaW5nIGJlaGF2aW91cgorICogY2FuIGJyZWFrIFBJTy4KKyAqLworI2lmZGVmIENPTkZJR19YODZfNjQKIC8qIFBJTyBpcyBhIHdpbiBvbmx5IGlmIHdyaXRlLWNvbWJpbmluZyBpcyBwb3NzaWJsZSAqLwogI2lmZGVmIEFSQ0hfSEFTX0lPUkVNQVBfV0MKICNkZWZpbmUgRUZYX1VTRV9QSU8gMQogI2VuZGlmCisjZW5kaWYKIAogI2lmZGVmIEVGWF9VU0VfUVdPUkRfSU8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfZWZ4X3dyaXRlcShzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBfX2xlNjQgdmFsdWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmFfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCmluZGV4IDlhOTIwNWUuLjQzZDJlNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCkBAIC0xNjMzLDcgKzE2MzMsOCBAQAogCiAJaXZpLT52ZiA9IHZmX2k7CiAJZXRoZXJfYWRkcl9jb3B5KGl2aS0+bWFjLCB2Zi0+YWRkci5tYWNfYWRkcik7Ci0JaXZpLT50eF9yYXRlID0gMDsKKwlpdmktPm1heF90eF9yYXRlID0gMDsKKwlpdmktPm1pbl90eF9yYXRlID0gMDsKIAl0Y2kgPSBudG9ocyh2Zi0+YWRkci50Y2kpOwogCWl2aS0+dmxhbiA9IHRjaSAmIFZMQU5fVklEX01BU0s7CiAJaXZpLT5xb3MgPSAodGNpID4+IFZMQU5fUFJJT19TSElGVCkgJiAweDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy90eC5jCmluZGV4IGZhOTQ3NTMuLmVkZThkY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy90eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy90eC5jCkBAIC0xODksNiArMTg5LDE4IEBACiAJdTggYnVmW0wxX0NBQ0hFX0JZVEVTXTsKIH07CiAKKy8qIENvcHkgaW4gZXhwbGljaXQgNjQtYml0IHdyaXRlcy4gKi8KK3N0YXRpYyB2b2lkIGVmeF9tZW1jcHlfNjQodm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCit7CisJdTY0ICpzcmM2NCA9IHNyYzsKKwl1NjQgX19pb21lbSAqZGVzdDY0ID0gZGVzdDsKKwlzaXplX3QgbDY0ID0gbGVuIC8gODsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsNjQ7IGkrKykKKwkJd3JpdGVxKHNyYzY0W2ldLCAmZGVzdDY0W2ldKTsKK30KKwogLyogQ29weSB0byBQSU8sIHJlc3BlY3RpbmcgdGhhdCB3cml0ZXMgdG8gUElPIGJ1ZmZlcnMgbXVzdCBiZSBkd29yZCBhbGlnbmVkLgogICogQWR2YW5jZXMgcGlvYnVmIHBvaW50ZXIuIExlYXZlcyBhZGRpdGlvbmFsIGRhdGEgaW4gdGhlIGNvcHkgYnVmZmVyLgogICovCkBAIC0xOTgsNyArMjEwLDcgQEAKIHsKIAlpbnQgYmxvY2tfbGVuID0gbGVuICYgfihzaXplb2YoY29weV9idWYtPmJ1ZikgLSAxKTsKIAotCW1lbWNweV90b2lvKCpwaW9idWYsIGRhdGEsIGJsb2NrX2xlbik7CisJZWZ4X21lbWNweV82NCgqcGlvYnVmLCBkYXRhLCBibG9ja19sZW4pOwogCSpwaW9idWYgKz0gYmxvY2tfbGVuOwogCWxlbiAtPSBibG9ja19sZW47CiAKQEAgLTIzMCw3ICsyNDIsNyBAQAogCQlpZiAoY29weV9idWYtPnVzZWQgPCBzaXplb2YoY29weV9idWYtPmJ1ZikpCiAJCQlyZXR1cm47CiAKLQkJbWVtY3B5X3RvaW8oKnBpb2J1ZiwgY29weV9idWYtPmJ1Ziwgc2l6ZW9mKGNvcHlfYnVmLT5idWYpKTsKKwkJZWZ4X21lbWNweV82NCgqcGlvYnVmLCBjb3B5X2J1Zi0+YnVmLCBzaXplb2YoY29weV9idWYtPmJ1ZikpOwogCQkqcGlvYnVmICs9IHNpemVvZihjb3B5X2J1Zi0+YnVmKTsKIAkJZGF0YSArPSBjb3B5X3RvX2J1ZjsKIAkJbGVuIC09IGNvcHlfdG9fYnVmOwpAQCAtMjQ1LDcgKzI1Nyw3IEBACiB7CiAJLyogaWYgdGhlcmUncyBhbnl0aGluZyBpbiBpdCwgd3JpdGUgdGhlIHdob2xlIGJ1ZmZlciwgaW5jbHVkaW5nIGp1bmsgKi8KIAlpZiAoY29weV9idWYtPnVzZWQpCi0JCW1lbWNweV90b2lvKHBpb2J1ZiwgY29weV9idWYtPmJ1Ziwgc2l6ZW9mKGNvcHlfYnVmLT5idWYpKTsKKwkJZWZ4X21lbWNweV82NChwaW9idWYsIGNvcHlfYnVmLT5idWYsIHNpemVvZihjb3B5X2J1Zi0+YnVmKSk7CiB9CiAKIC8qIFRyYXZlcnNlIHNrYiBzdHJ1Y3R1cmUgYW5kIGNvcHkgZnJhZ21lbnRzIGluIHRvIFBJTyBidWZmZXIuCkBAIC0zMDQsOCArMzE2LDggQEAKIAkJICovCiAJCUJVSUxEX0JVR19PTihMMV9DQUNIRV9CWVRFUyA+CiAJCQkgICAgIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSkpOwotCQltZW1jcHlfdG9pbyh0eF9xdWV1ZS0+cGlvYnVmLCBza2ItPmRhdGEsCi0JCQkgICAgQUxJR04oc2tiLT5sZW4sIEwxX0NBQ0hFX0JZVEVTKSk7CisJCWVmeF9tZW1jcHlfNjQodHhfcXVldWUtPnBpb2J1Ziwgc2tiLT5kYXRhLAorCQkJICAgICAgQUxJR04oc2tiLT5sZW4sIEwxX0NBQ0hFX0JZVEVTKSk7CiAJfQogCiAJRUZYX1BPUFVMQVRFX1FXT1JEXzUoYnVmZmVyLT5vcHRpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzMTkwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzMTkwLmMKaW5kZXggYWNiYmU0OC4uYTg2MzM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczE5MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXMxOTAuYwpAQCAtMTg3Nyw3ICsxODc3LDcgQEAKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZzaXMxOTBfbmV0ZGV2X29wczsKIAotCVNFVF9FVEhUT09MX09QUyhkZXYsICZzaXMxOTBfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmc2lzMTkwX2V0aHRvb2xfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBTSVMxOTBfVFhfVElNRU9VVDsKIAogCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxYzkyX2NzLmMKaW5kZXggYzdhNDg2OC4uNmIzMzEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTFjOTJfY3MuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiAKICAgICAvKiBUaGUgU01DOTFjOTItc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KICAgICBkZXYtPm5ldGRldl9vcHMgPSAmc21jX25ldGRldl9vcHM7Ci0gICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKyAgICBkZXYtPmV0aHRvb2xfb3BzID0gJmV0aHRvb2xfb3BzOwogICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAgICAgc21jLT5taWlfaWYuZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCmluZGV4IGEwZmMxNTEuLjVlMTNmYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKQEAgLTI0NzcsNiArMjQ3Nyw4IEBACiAJCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOwogCX0KIAorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKIAlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciAlaSByZWdpc3RlcmluZyBkZXZpY2UiLCByZXR2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19ldGh0b29sLmMKaW5kZXggYzVmOWNiOC4uYzYyZTY3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfZXRodG9vbC5jCkBAIC0zMjIsOSArMzIyLDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJcmMgPSBwaHlfZXRodG9vbF9nc2V0KHBoeSwgY21kKTsKLQlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtNDMxLDggKzQyOSw2IEBACiAJaWYgKHByaXYtPnBjcykJLyogRklYTUUgKi8KIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQogCXBhdXNlLT5yeF9wYXVzZSA9IDA7CiAJcGF1c2UtPnR4X3BhdXNlID0gMDsKIAlwYXVzZS0+YXV0b25lZyA9IHByaXYtPnBoeWRldi0+YXV0b25lZzsKQEAgLTQ0Miw3ICs0MzgsNiBAQAogCWlmIChwcml2LT5mbG93X2N0cmwgJiBGTE9XX1RYKQogCQlwYXVzZS0+dHhfcGF1c2UgPSAxOwogCi0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogfQogCiBzdGF0aWMgaW50CkBAIC00NTcsOCArNDUyLDYgQEAKIAlpZiAocHJpdi0+cGNzKQkvKiBGSVhNRSAqLwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCiAJaWYgKHBhdXNlLT5yeF9wYXVzZSkKIAkJbmV3X3BhdXNlIHw9IEZMT1dfUlg7CiAJaWYgKHBhdXNlLT50eF9wYXVzZSkKQEAgLTQ3Myw3ICs0NjYsNiBAQAogCX0gZWxzZQogCQlwcml2LT5ody0+bWFjLT5mbG93X2N0cmwocHJpdi0+aW9hZGRyLCBwaHktPmR1cGxleCwKIAkJCQkJIHByaXYtPmZsb3dfY3RybCwgcHJpdi0+cGF1c2UpOwotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03ODQsNSArNzc2LDUgQEAKIAogdm9pZCBzdG1tYWNfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnN0bW1hY19ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZzdG1tYWNfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYwppbmRleCAwZjQ4NDFkLi4wNTdhMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tYWluLmMKQEAgLTE3NTMsNyArMTc1Myw3IEBACiAJfQogCiAJLyogUmVxdWVzdCB0aGUgSVJRIGxpbmVzICovCi0JaWYgKHByaXYtPmxwaV9pcnEgIT0gLUVOWElPKSB7CisJaWYgKHByaXYtPmxwaV9pcnEgPiAwKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPmxwaV9pcnEsIHN0bW1hY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJCSAgZGV2LT5uYW1lLCBkZXYpOwogCQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKQEAgLTE4MTMsNyArMTgxMyw3IEBACiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJaWYgKHByaXYtPndvbF9pcnEgIT0gZGV2LT5pcnEpCiAJCWZyZWVfaXJxKHByaXYtPndvbF9pcnEsIGRldik7Ci0JaWYgKHByaXYtPmxwaV9pcnEgIT0gLUVOWElPKQorCWlmIChwcml2LT5scGlfaXJxID4gMCkKIAkJZnJlZV9pcnEocHJpdi0+bHBpX2lycSwgZGV2KTsKIAogCS8qIFN0b3AgVFgvUlggRE1BIGFuZCBjbGVhciB0aGUgZGVzY3JpcHRvcnMgKi8KQEAgLTIyMTIsMjcgKzIyMTIsNiBAQAogCXN0bW1hY190eF9lcnIocHJpdik7CiB9CiAKLS8qIENvbmZpZ3VyYXRpb24gY2hhbmdlcyAocGFzc2VkIG9uIGJ5IGlmY29uZmlnKSAqLwotc3RhdGljIGludCBzdG1tYWNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQotewotCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQkvKiBjYW4ndCBhY3Qgb24gYSBydW5uaW5nIGludGVyZmFjZSAqLwotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIEkvTyBhZGRyZXNzICovCi0JaWYgKG1hcC0+YmFzZV9hZGRyICE9IGRldi0+YmFzZV9hZGRyKSB7Ci0JCXByX3dhcm4oIiVzOiBjYW4ndCBjaGFuZ2UgSS9PIGFkZHJlc3NcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQkvKiBEb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgSVJRICovCi0JaWYgKG1hcC0+aXJxICE9IGRldi0+aXJxKSB7Ci0JCXByX3dhcm4oIiVzOiBub3QgY2hhbmdlIElSUSBudW1iZXIgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qKgogICogIHN0bW1hY19zZXRfcnhfbW9kZSAtIGVudHJ5IHBvaW50IGZvciBtdWx0aWNhc3QgYWRkcmVzc2luZwogICogIEBkZXYgOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlCkBAIC0yNTk4LDcgKzI1NzcsNiBAQAogCS5uZG9fc2V0X3J4X21vZGUgPSBzdG1tYWNfc2V0X3J4X21vZGUsCiAJLm5kb190eF90aW1lb3V0ID0gc3RtbWFjX3R4X3RpbWVvdXQsCiAJLm5kb19kb19pb2N0bCA9IHN0bW1hY19pb2N0bCwKLQkubmRvX3NldF9jb25maWcgPSBzdG1tYWNfY29uZmlnLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIgPSBzdG1tYWNfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21kaW8uYwppbmRleCBhNDY4ZWIxLi5hNWIxZTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tZGlvLmMKQEAgLTIwNSwxMCArMjA1LDEzIEBACiAJaWYgKG5ld19idXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAobWRpb19idXNfZGF0YS0+aXJxcykKKwlpZiAobWRpb19idXNfZGF0YS0+aXJxcykgewogCQlpcnFsaXN0ID0gbWRpb19idXNfZGF0YS0+aXJxczsKLQllbHNlCisJfSBlbHNlIHsKKwkJZm9yIChhZGRyID0gMDsgYWRkciA8IFBIWV9NQVhfQUREUjsgYWRkcisrKQorCQkJcHJpdi0+bWlpX2lycVthZGRyXSA9IFBIWV9QT0xMOwogCQlpcnFsaXN0ID0gcHJpdi0+bWlpX2lycTsKKwl9CiAKICNpZmRlZiBDT05GSUdfT0YKIAlpZiAocHJpdi0+ZGV2aWNlLT5vZl9ub2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGxhdGZvcm0uYwppbmRleCA0NmFlZjUxMC4uZWE3YTY1YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCkBAIC0yMzcsMTAgKzIzNywxMiBAQAogCiAJLyogR2V0IHRoZSBNQUMgaW5mb3JtYXRpb24gKi8KIAlwcml2LT5kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJtYWNpcnEiKTsKLQlpZiAocHJpdi0+ZGV2LT5pcnEgPT0gLUVOWElPKSB7Ci0JCXByX2VycigiJXM6IEVSUk9SOiBNQUMgSVJRIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImluZm9ybWF0aW9uIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOWElPOworCWlmIChwcml2LT5kZXYtPmlycSA8IDApIHsKKwkJaWYgKHByaXYtPmRldi0+aXJxICE9IC1FUFJPQkVfREVGRVIpIHsKKwkJCW5ldGRldl9lcnIocHJpdi0+ZGV2LAorCQkJCSAgICJNQUMgSVJRIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbm90IGZvdW5kXG4iKTsKKwkJfQorCQlyZXR1cm4gcHJpdi0+ZGV2LT5pcnE7CiAJfQogCiAJLyoKQEAgLTI1MiwxMCArMjU0LDE1IEBACiAJICogc28gdGhlIGRyaXZlciB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgbWFjIGlycSAobmRldi0+aXJxKQogCSAqLwogCXByaXYtPndvbF9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZXRoX3dha2VfaXJxIik7Ci0JaWYgKHByaXYtPndvbF9pcnEgPT0gLUVOWElPKQorCWlmIChwcml2LT53b2xfaXJxIDwgMCkgeworCQlpZiAocHJpdi0+d29sX2lycSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJCXByaXYtPndvbF9pcnEgPSBwcml2LT5kZXYtPmlycTsKKwl9CiAKIAlwcml2LT5scGlfaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImV0aF9scGkiKTsKKwlpZiAocHJpdi0+bHBpX2lycSA9PSAtRVBST0JFX0RFRkVSKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYwppbmRleCAyZWFkODc3Li4zOGRhNzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jCkBAIC0yNDEzLDcgKzI0MTMsNyBAQAogCQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBiZHhfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJfTsKIAotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZiZHhfZXRodG9vbF9vcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYmR4X2V0aHRvb2xfb3BzOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcG1hYy5jCmluZGV4IDczZjc0ZjMuLjczOTlhNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYwpAQCAtMzEzLDE5ICszMTMsNiBAQAogCiBzdGF0aWMgc3RydWN0IG1paV9idXMgKmNwbWFjX21paTsKIAotc3RhdGljIGludCBjcG1hY19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCi17Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKiBEb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgSS9PIGFkZHJlc3MgKi8KLQlpZiAobWFwLT5iYXNlX2FkZHIgIT0gZGV2LT5iYXNlX2FkZHIpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIGlnbm9yZSBvdGhlciBmaWVsZHMgKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgY3BtYWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKQEAgLTExMDAsNyArMTA4Nyw2IEBACiAJLm5kb190eF90aW1lb3V0CQk9IGNwbWFjX3R4X3RpbWVvdXQsCiAJLm5kb19zZXRfcnhfbW9kZQk9IGNwbWFjX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2RvX2lvY3RsCQk9IGNwbWFjX2lvY3RsLAotCS5uZG9fc2V0X2NvbmZpZwkJPSBjcG1hY19jb25maWcsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy1waHktc2VsLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LXBoeS1zZWwuYwppbmRleCAxNDhkYTlhLi5hYThiZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LXBoeS1zZWwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LXBoeS1zZWwuYwpAQCAtMjksNiArMjksOCBAQAogI2RlZmluZSBBTTMzWFhfR01JSV9TRUxfUk1JSTJfSU9fQ0xLX0VOCUJJVCg3KQogI2RlZmluZSBBTTMzWFhfR01JSV9TRUxfUk1JSTFfSU9fQ0xLX0VOCUJJVCg2KQogCisjZGVmaW5lIEdNSUlfU0VMX01PREVfTUFTSwkJMHgzCisKIHN0cnVjdCBjcHN3X3BoeV9zZWxfcHJpdiB7CiAJc3RydWN0IGRldmljZQkqZGV2OwogCXUzMiBfX2lvbWVtCSpnbWlpX3NlbDsKQEAgLTY1LDcgKzY3LDcgQEAKIAkJYnJlYWs7CiAJfTsKIAotCW1hc2sgPSAweDMgPDwgKHNsYXZlICogMikgfCBCSVQoc2xhdmUgKyA2KTsKKwltYXNrID0gR01JSV9TRUxfTU9ERV9NQVNLIDw8IChzbGF2ZSAqIDIpIHwgQklUKHNsYXZlICsgNik7CiAJbW9kZSA8PD0gc2xhdmUgKiAyOwogCiAJaWYgKHByaXYtPnJtaWlfY2xvY2tfZXh0ZXJuYWwpIHsKQEAgLTgxLDYgKzgzLDU1IEBACiAJd3JpdGVsKHJlZywgcHJpdi0+Z21paV9zZWwpOwogfQogCitzdGF0aWMgdm9pZCBjcHN3X2dtaWlfc2VsX2RyYTd4eChzdHJ1Y3QgY3Bzd19waHlfc2VsX3ByaXYgKnByaXYsCisJCQkJIHBoeV9pbnRlcmZhY2VfdCBwaHlfbW9kZSwgaW50IHNsYXZlKQoreworCXUzMiByZWc7CisJdTMyIG1hc2s7CisJdTMyIG1vZGUgPSAwOworCisJcmVnID0gcmVhZGwocHJpdi0+Z21paV9zZWwpOworCisJc3dpdGNoIChwaHlfbW9kZSkgeworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUk6CisJCW1vZGUgPSBBTTMzWFhfR01JSV9TRUxfTU9ERV9STUlJOworCQlicmVhazsKKworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgorCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lEOgorCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1JYSUQ6CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRDoKKwkJbW9kZSA9IEFNMzNYWF9HTUlJX1NFTF9NT0RFX1JHTUlJOworCQlicmVhazsKKworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX01JSToKKwlkZWZhdWx0OgorCQltb2RlID0gQU0zM1hYX0dNSUlfU0VMX01PREVfTUlJOworCQlicmVhazsKKwl9OworCisJc3dpdGNoIChzbGF2ZSkgeworCWNhc2UgMDoKKwkJbWFzayA9IEdNSUlfU0VMX01PREVfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltYXNrID0gR01JSV9TRUxfTU9ERV9NQVNLIDw8IDQ7CisJCW1vZGUgPDw9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiaW52YWxpZCBzbGF2ZSBudW1iZXIuLi5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHByaXYtPnJtaWlfY2xvY2tfZXh0ZXJuYWwpCisJCWRldl9lcnIocHJpdi0+ZGV2LCAiUk1JSSBFeHRlcm5hbCBjbG9jayBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKworCXJlZyAmPSB+bWFzazsKKwlyZWcgfD0gbW9kZTsKKworCXdyaXRlbChyZWcsIHByaXYtPmdtaWlfc2VsKTsKK30KKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3Bzd19waHlfc2VsX2RyaXZlcjsKIHN0YXRpYyBpbnQgbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpAQCAtMTEyLDYgKzE2MywxNCBAQAogCQkuY29tcGF0aWJsZQk9ICJ0aSxhbTMzNTItY3Bzdy1waHktc2VsIiwKIAkJLmRhdGEJCT0gJmNwc3dfZ21paV9zZWxfYW0zMzUyLAogCX0sCisJeworCQkuY29tcGF0aWJsZQk9ICJ0aSxkcmE3eHgtY3Bzdy1waHktc2VsIiwKKwkJLmRhdGEJCT0gJmNwc3dfZ21paV9zZWxfZHJhN3h4LAorCX0sCisJeworCQkuY29tcGF0aWJsZQk9ICJ0aSxhbTQzeHgtY3Bzdy1waHktc2VsIiwKKwkJLmRhdGEJCT0gJmNwc3dfZ21paV9zZWxfYW0zMzUyLAorCX0sCiAJe30KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBjcHN3X3BoeV9zZWxfaWRfdGFibGUpOwpAQCAtMTMyLDYgKzE5MSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXByaXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJcHJpdi0+Y3Bzd19waHlfc2VsID0gb2ZfaWQtPmRhdGE7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiZ21paS1zZWwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwppbmRleCBjMzMxYjdlLi5mZjM4MGRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwpAQCAtMTQzLDEzICsxNDMsMTMgQEAKIAkJdTMyIGk7CQlcCiAJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1faXJxczsgaSsrKSBcCiAJCQllbmFibGVfaXJxKHByaXYtPmlycXNfdGFibGVbaV0pOyBcCi0JfSB3aGlsZSAoMCk7CisJfSB3aGlsZSAoMCkKICNkZWZpbmUgY3Bzd19kaXNhYmxlX2lycShwcml2KQlcCiAJZG8gewkJCVwKIAkJdTMyIGk7CQlcCiAJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1faXJxczsgaSsrKSBcCiAJCQlkaXNhYmxlX2lycV9ub3N5bmMocHJpdi0+aXJxc190YWJsZVtpXSk7IFwKLQl9IHdoaWxlICgwKTsKKwl9IHdoaWxlICgwKQogCiAjZGVmaW5lIGNwc3dfc2xhdmVfaW5kZXgocHJpdikJCQkJXAogCQkoKHByaXYtPmRhdGEuZHVhbF9lbWFjKSA/IHByaXYtPmVtYWNfcG9ydCA6CVwKQEAgLTI0OCwyMCArMjQ4LDMxIEBACiAjZGVmaW5lIFRTXzEzMSAgICAgICAgICAgICAgKDE8PDExKSAvKiBUaW1lIFN5bmMgRGVzdCBJUCBBZGRyIDEzMSBlbmFibGUgKi8KICNkZWZpbmUgVFNfMTMwICAgICAgICAgICAgICAoMTw8MTApIC8qIFRpbWUgU3luYyBEZXN0IElQIEFkZHIgMTMwIGVuYWJsZSAqLwogI2RlZmluZSBUU18xMjkgICAgICAgICAgICAgICgxPDw5KSAgLyogVGltZSBTeW5jIERlc3QgSVAgQWRkciAxMjkgZW5hYmxlICovCi0jZGVmaW5lIFRTX0JJVDggICAgICAgICAgICAgKDE8PDgpICAvKiB0c190dGxfbm9uemVybz8gKi8KKyNkZWZpbmUgVFNfVFRMX05PTlpFUk8gICAgICAoMTw8OCkgIC8qIFRpbWUgU3luYyBUaW1lIFRvIExpdmUgTm9uLXplcm8gZW5hYmxlICovCisjZGVmaW5lIFRTX0FOTkVYX0ZfRU4gICAgICAgKDE8PDYpICAvKiBUaW1lIFN5bmMgQW5uZXggRiBlbmFibGUgKi8KICNkZWZpbmUgVFNfQU5ORVhfRF9FTiAgICAgICAoMTw8NCkgIC8qIFRpbWUgU3luYyBBbm5leCBEIGVuYWJsZSAqLwogI2RlZmluZSBUU19MVFlQRTJfRU4gICAgICAgICgxPDwzKSAgLyogVGltZSBTeW5jIExUWVBFIDIgZW5hYmxlICovCiAjZGVmaW5lIFRTX0xUWVBFMV9FTiAgICAgICAgKDE8PDIpICAvKiBUaW1lIFN5bmMgTFRZUEUgMSBlbmFibGUgKi8KICNkZWZpbmUgVFNfVFhfRU4gICAgICAgICAgICAoMTw8MSkgIC8qIFRpbWUgU3luYyBUcmFuc21pdCBFbmFibGUgKi8KICNkZWZpbmUgVFNfUlhfRU4gICAgICAgICAgICAoMTw8MCkgIC8qIFRpbWUgU3luYyBSZWNlaXZlIEVuYWJsZSAqLwogCi0jZGVmaW5lIENUUkxfVFNfQklUUyBcCi0JKFRTXzMyMCB8IFRTXzMxOSB8IFRTXzEzMiB8IFRTXzEzMSB8IFRTXzEzMCB8IFRTXzEyOSB8IFRTX0JJVDggfCBcCi0JIFRTX0FOTkVYX0RfRU4gfCBUU19MVFlQRTFfRU4pCisjZGVmaW5lIENUUkxfVjJfVFNfQklUUyBcCisJKFRTXzMyMCB8IFRTXzMxOSB8IFRTXzEzMiB8IFRTXzEzMSB8IFRTXzEzMCB8IFRTXzEyOSB8XAorCSBUU19UVExfTk9OWkVSTyAgfCBUU19BTk5FWF9EX0VOIHwgVFNfTFRZUEUxX0VOKQogCi0jZGVmaW5lIENUUkxfQUxMX1RTX01BU0sgKENUUkxfVFNfQklUUyB8IFRTX1RYX0VOIHwgVFNfUlhfRU4pCi0jZGVmaW5lIENUUkxfVFhfVFNfQklUUyAgKENUUkxfVFNfQklUUyB8IFRTX1RYX0VOKQotI2RlZmluZSBDVFJMX1JYX1RTX0JJVFMgIChDVFJMX1RTX0JJVFMgfCBUU19SWF9FTikKKyNkZWZpbmUgQ1RSTF9WMl9BTExfVFNfTUFTSyAoQ1RSTF9WMl9UU19CSVRTIHwgVFNfVFhfRU4gfCBUU19SWF9FTikKKyNkZWZpbmUgQ1RSTF9WMl9UWF9UU19CSVRTICAoQ1RSTF9WMl9UU19CSVRTIHwgVFNfVFhfRU4pCisjZGVmaW5lIENUUkxfVjJfUlhfVFNfQklUUyAgKENUUkxfVjJfVFNfQklUUyB8IFRTX1JYX0VOKQorCisKKyNkZWZpbmUgQ1RSTF9WM19UU19CSVRTIFwKKwkoVFNfMzIwIHwgVFNfMzE5IHwgVFNfMTMyIHwgVFNfMTMxIHwgVFNfMTMwIHwgVFNfMTI5IHxcCisJIFRTX1RUTF9OT05aRVJPIHwgVFNfQU5ORVhfRl9FTiB8IFRTX0FOTkVYX0RfRU4gfFwKKwkgVFNfTFRZUEUxX0VOKQorCisjZGVmaW5lIENUUkxfVjNfQUxMX1RTX01BU0sgKENUUkxfVjNfVFNfQklUUyB8IFRTX1RYX0VOIHwgVFNfUlhfRU4pCisjZGVmaW5lIENUUkxfVjNfVFhfVFNfQklUUyAgKENUUkxfVjNfVFNfQklUUyB8IFRTX1RYX0VOKQorI2RlZmluZSBDVFJMX1YzX1JYX1RTX0JJVFMgIChDVFJMX1YzX1RTX0JJVFMgfCBUU19SWF9FTikKIAogLyogQml0IGRlZmluaXRpb25zIGZvciB0aGUgQ1BTVzJfVFNfU0VRX01UWVBFIHJlZ2lzdGVyICovCiAjZGVmaW5lIFRTX1NFUV9JRF9PRkZTRVRfU0hJRlQgICAoMTYpICAgIC8qIFRpbWUgU3luYyBTZXF1ZW5jZSBJRCBPZmZzZXQgKi8KQEAgLTEzNzYsMTMgKzEzODcsMjcgQEAKIAkJc2xhdmUgPSAmcHJpdi0+c2xhdmVzW3ByaXYtPmRhdGEuYWN0aXZlX3NsYXZlXTsKIAogCWN0cmwgPSBzbGF2ZV9yZWFkKHNsYXZlLCBDUFNXMl9DT05UUk9MKTsKLQljdHJsICY9IH5DVFJMX0FMTF9UU19NQVNLOworCXN3aXRjaCAocHJpdi0+dmVyc2lvbikgeworCWNhc2UgQ1BTV19WRVJTSU9OXzI6CisJCWN0cmwgJj0gfkNUUkxfVjJfQUxMX1RTX01BU0s7CiAKLQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQotCQljdHJsIHw9IENUUkxfVFhfVFNfQklUUzsKKwkJaWYgKHByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwkJCWN0cmwgfD0gQ1RSTF9WMl9UWF9UU19CSVRTOwogCi0JaWYgKHByaXYtPmNwdHMtPnJ4X2VuYWJsZSkKLQkJY3RybCB8PSBDVFJMX1JYX1RTX0JJVFM7CisJCWlmIChwcml2LT5jcHRzLT5yeF9lbmFibGUpCisJCQljdHJsIHw9IENUUkxfVjJfUlhfVFNfQklUUzsKKwlicmVhazsKKwljYXNlIENQU1dfVkVSU0lPTl8zOgorCWRlZmF1bHQ6CisJCWN0cmwgJj0gfkNUUkxfVjNfQUxMX1RTX01BU0s7CisKKwkJaWYgKHByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwkJCWN0cmwgfD0gQ1RSTF9WM19UWF9UU19CSVRTOworCisJCWlmIChwcml2LT5jcHRzLT5yeF9lbmFibGUpCisJCQljdHJsIHw9IENUUkxfVjNfUlhfVFNfQklUUzsKKwlicmVhazsKKwl9CiAKIAltdHlwZSA9ICgzMCA8PCBUU19TRVFfSURfT0ZGU0VUX1NISUZUKSB8IEVWRU5UX01TR19CSVRTOwogCkBAIC0xMzk4LDcgKzE0MjMsOCBAQAogCXN0cnVjdCBod3RzdGFtcF9jb25maWcgY2ZnOwogCiAJaWYgKHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzEgJiYKLQkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMikKKwkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMiAmJgorCSAgICBwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8zKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGNmZykpKQpAQCAtMTQ0Myw2ICsxNDY5LDcgQEAKIAkJY3Bzd19od3RzdGFtcF92MShwcml2KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMjoKKwljYXNlIENQU1dfVkVSU0lPTl8zOgogCQljcHN3X2h3dHN0YW1wX3YyKHByaXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTQ1OSw3ICsxNDg2LDggQEAKIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIGNmZzsKIAogCWlmIChwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8xICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIpCisJICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIgJiYKKwkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJY2ZnLmZsYWdzID0gMDsKQEAgLTE3ODAsMjUgKzE4MDgsMjUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInNsYXZlcyIsICZwcm9wKSkgewotCQlwcl9lcnIoIk1pc3Npbmcgc2xhdmVzIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIHNsYXZlcyBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPnNsYXZlcyA9IHByb3A7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImFjdGl2ZV9zbGF2ZSIsICZwcm9wKSkgewotCQlwcl9lcnIoIk1pc3NpbmcgYWN0aXZlX3NsYXZlIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIGFjdGl2ZV9zbGF2ZSBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmFjdGl2ZV9zbGF2ZSA9IHByb3A7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNwdHNfY2xvY2tfbXVsdCIsICZwcm9wKSkgewotCQlwcl9lcnIoIk1pc3NpbmcgY3B0c19jbG9ja19tdWx0IHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIGNwdHNfY2xvY2tfbXVsdCBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmNwdHNfY2xvY2tfbXVsdCA9IHByb3A7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNwdHNfY2xvY2tfc2hpZnQiLCAmcHJvcCkpIHsKLQkJcHJfZXJyKCJNaXNzaW5nIGNwdHNfY2xvY2tfc2hpZnQgcHJvcGVydHkgaW4gdGhlIERULlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgY3B0c19jbG9ja19zaGlmdCBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmNwdHNfY2xvY2tfc2hpZnQgPSBwcm9wOwpAQCAtMTgxMCwzMSArMTgzOCwzMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY3BkbWFfY2hhbm5lbHMiLCAmcHJvcCkpIHsKLQkJcHJfZXJyKCJNaXNzaW5nIGNwZG1hX2NoYW5uZWxzIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIGNwZG1hX2NoYW5uZWxzIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YS0+Y2hhbm5lbHMgPSBwcm9wOwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJhbGVfZW50cmllcyIsICZwcm9wKSkgewotCQlwcl9lcnIoIk1pc3NpbmcgYWxlX2VudHJpZXMgcHJvcGVydHkgaW4gdGhlIERULlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgYWxlX2VudHJpZXMgcHJvcGVydHkgaW4gdGhlIERULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkYXRhLT5hbGVfZW50cmllcyA9IHByb3A7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImJkX3JhbV9zaXplIiwgJnByb3ApKSB7Ci0JCXByX2VycigiTWlzc2luZyBiZF9yYW1fc2l6ZSBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBiZF9yYW1fc2l6ZSBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmJkX3JhbV9zaXplID0gcHJvcDsKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicnhfZGVzY3MiLCAmcHJvcCkpIHsKLQkJcHJfZXJyKCJNaXNzaW5nIHJ4X2Rlc2NzIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIHJ4X2Rlc2NzIHByb3BlcnR5IGluIHRoZSBEVC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YS0+cnhfZGVzY3MgPSBwcm9wOwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJtYWNfY29udHJvbCIsICZwcm9wKSkgewotCQlwcl9lcnIoIk1pc3NpbmcgbWFjX2NvbnRyb2wgcHJvcGVydHkgaW4gdGhlIERULlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgbWFjX2NvbnRyb2wgcHJvcGVydHkgaW4gdGhlIERULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkYXRhLT5tYWNfY29udHJvbCA9IHByb3A7CkBAIC0xODQ4LDcgKzE4NzYsNyBAQAogCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKG5vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOwogCS8qIFdlIGRvIG5vdCB3YW50IHRvIGZvcmNlIHRoaXMsIGFzIGluIHNvbWUgY2FzZXMgbWF5IG5vdCBoYXZlIGNoaWxkICovCiAJaWYgKHJldCkKLQkJcHJfd2FybigiRG9lc24ndCBoYXZlIGFueSBjaGlsZCBub2RlXG4iKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGQgbm9kZVxuIik7CiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIHNsYXZlX25vZGUpIHsKIAkJc3RydWN0IGNwc3dfc2xhdmVfZGF0YSAqc2xhdmVfZGF0YSA9IGRhdGEtPnNsYXZlX2RhdGEgKyBpOwpAQCAtMTg2NSw3ICsxODkzLDcgQEAKIAogCQlwYXJwID0gb2ZfZ2V0X3Byb3BlcnR5KHNsYXZlX25vZGUsICJwaHlfaWQiLCAmbGVucCk7CiAJCWlmICgocGFycCA9PSBOVUxMKSB8fCAobGVucCAhPSAoc2l6ZW9mKHZvaWQgKikgKiAyKSkpIHsKLQkJCXByX2VycigiTWlzc2luZyBzbGF2ZVslZF0gcGh5X2lkIHByb3BlcnR5XG4iLCBpKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3Npbmcgc2xhdmVbJWRdIHBoeV9pZCBwcm9wZXJ0eVxuIiwgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQltZGlvX25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShiZTMyX3RvX2NwdXAocGFycCkpOwpAQCAtMTg4NSwxOCArMTkxMywxOCBAQAogCiAJCXNsYXZlX2RhdGEtPnBoeV9pZiA9IG9mX2dldF9waHlfbW9kZShzbGF2ZV9ub2RlKTsKIAkJaWYgKHNsYXZlX2RhdGEtPnBoeV9pZiA8IDApIHsKLQkJCXByX2VycigiTWlzc2luZyBvciBtYWxmb3JtZWQgc2xhdmVbJWRdIHBoeS1tb2RlIHByb3BlcnR5XG4iLAotCQkJICAgICAgIGkpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBvciBtYWxmb3JtZWQgc2xhdmVbJWRdIHBoeS1tb2RlIHByb3BlcnR5XG4iLAorCQkJCWkpOwogCQkJcmV0dXJuIHNsYXZlX2RhdGEtPnBoeV9pZjsKIAkJfQogCiAJCWlmIChkYXRhLT5kdWFsX2VtYWMpIHsKIAkJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihzbGF2ZV9ub2RlLCAiZHVhbF9lbWFjX3Jlc192bGFuIiwKIAkJCQkJCSAmcHJvcCkpIHsKLQkJCQlwcl9lcnIoIk1pc3NpbmcgZHVhbF9lbWFjX3Jlc192bGFuIGluIERULlxuIik7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBkdWFsX2VtYWNfcmVzX3ZsYW4gaW4gRFQuXG4iKTsKIAkJCQlzbGF2ZV9kYXRhLT5kdWFsX2VtYWNfcmVzX3ZsYW4gPSBpKzE7Ci0JCQkJcHJfZXJyKCJVc2luZyAlZCBhcyBSZXNlcnZlZCBWTEFOIGZvciAlZCBzbGF2ZVxuIiwKLQkJCQkgICAgICAgc2xhdmVfZGF0YS0+ZHVhbF9lbWFjX3Jlc192bGFuLCBpKTsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVc2luZyAlZCBhcyBSZXNlcnZlZCBWTEFOIGZvciAlZCBzbGF2ZVxuIiwKKwkJCQkJc2xhdmVfZGF0YS0+ZHVhbF9lbWFjX3Jlc192bGFuLCBpKTsKIAkJCX0gZWxzZSB7CiAJCQkJc2xhdmVfZGF0YS0+ZHVhbF9lbWFjX3Jlc192bGFuID0gcHJvcDsKIAkJCX0KQEAgLTE5MjAsNyArMTk0OCw3IEBACiAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBjcHN3X3ByaXYpKTsKIAlpZiAoIW5kZXYpIHsKLQkJcHJfZXJyKCJjcHN3OiBlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjcHN3OiBlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE5MzYsMTAgKzE5NjQsMTAgQEAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyKSkgewogCQltZW1jcHkocHJpdl9zbDItPm1hY19hZGRyLCBkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyLAogCQkJRVRIX0FMRU4pOwotCQlwcl9pbmZvKCJjcHN3OiBEZXRlY3RlZCBNQUNJRCA9ICVwTVxuIiwgcHJpdl9zbDItPm1hY19hZGRyKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNwc3c6IERldGVjdGVkIE1BQ0lEID0gJXBNXG4iLCBwcml2X3NsMi0+bWFjX2FkZHIpOwogCX0gZWxzZSB7CiAJCXJhbmRvbV9ldGhlcl9hZGRyKHByaXZfc2wyLT5tYWNfYWRkcik7Ci0JCXByX2luZm8oImNwc3c6IFJhbmRvbSBNQUNJRCA9ICVwTVxuIiwgcHJpdl9zbDItPm1hY19hZGRyKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNwc3c6IFJhbmRvbSBNQUNJRCA9ICVwTVxuIiwgcHJpdl9zbDItPm1hY19hZGRyKTsKIAl9CiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBwcml2X3NsMi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIApAQCAtMTk3MCwxNCArMTk5OCwxNCBAQAogCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmY3Bzd19uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmY3Bzd19ldGh0b29sX29wcyk7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmY3Bzd19ldGh0b29sX29wczsKIAluZXRpZl9uYXBpX2FkZChuZGV2LCAmcHJpdl9zbDItPm5hcGksIGNwc3dfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CiAKIAkvKiByZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgKi8KIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJldCkgewotCQlwcl9lcnIoImNwc3c6IGVycm9yIHJlZ2lzdGVyaW5nIG5ldCBkZXZpY2VcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjcHN3OiBlcnJvciByZWdpc3RlcmluZyBuZXQgZGV2aWNlXG4iKTsKIAkJZnJlZV9uZXRkZXYobmRldik7CiAJCXJldCA9IC1FTk9ERVY7CiAJfQpAQCAtMTk5OSw3ICsyMDI3LDcgQEAKIAogCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGNwc3dfcHJpdikpOwogCWlmICghbmRldikgewotCQlwcl9lcnIoImVycm9yIGFsbG9jYXRpbmcgbmV0X2RldmljZVxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yIGFsbG9jYXRpbmcgbmV0X2RldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjAxNCw3ICsyMDQyLDcgQEAKIAlwcml2LT5jcHRzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3B0cyksIEdGUF9LRVJORUwpOwogCXByaXYtPmlycV9lbmFibGVkID0gdHJ1ZTsKIAlpZiAoIXByaXYtPmNwdHMpIHsKLQkJcHJfZXJyKCJlcnJvciBhbGxvY2F0aW5nIGNwdHNcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBhbGxvY2F0aW5nIGNwdHNcbiIpOwogCQlnb3RvIGNsZWFuX25kZXZfcmV0OwogCX0KIApAQCAtMjAyNyw3ICsyMDU1LDcgQEAKIAlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKCZwZGV2LT5kZXYpOwogCiAJaWYgKGNwc3dfcHJvYmVfZHQoJnByaXYtPmRhdGEsIHBkZXYpKSB7Ci0JCXByX2VycigiY3BzdzogcGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogcGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KQEAgLTIwMzUsMTAgKzIwNjMsMTAgQEAKIAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGRhdGEtPnNsYXZlX2RhdGFbMF0ubWFjX2FkZHIpKSB7CiAJCW1lbWNweShwcml2LT5tYWNfYWRkciwgZGF0YS0+c2xhdmVfZGF0YVswXS5tYWNfYWRkciwgRVRIX0FMRU4pOwotCQlwcl9pbmZvKCJEZXRlY3RlZCBNQUNJRCA9ICVwTVxuIiwgcHJpdi0+bWFjX2FkZHIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgTUFDSUQgPSAlcE1cbiIsIHByaXYtPm1hY19hZGRyKTsKIAl9IGVsc2UgewogCQlldGhfcmFuZG9tX2FkZHIocHJpdi0+bWFjX2FkZHIpOwotCQlwcl9pbmZvKCJSYW5kb20gTUFDSUQgPSAlcE1cbiIsIHByaXYtPm1hY19hZGRyKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJhbmRvbSBNQUNJRCA9ICVwTVxuIiwgcHJpdi0+bWFjX2FkZHIpOwogCX0KIAogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKQEAgLTIxOTksNyArMjIyNyw3IEBACiAJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOwogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZjcHN3X25ldGRldl9vcHM7Ci0JU0VUX0VUSFRPT0xfT1BTKG5kZXYsICZjcHN3X2V0aHRvb2xfb3BzKTsKKwluZGV2LT5ldGh0b29sX29wcyA9ICZjcHN3X2V0aHRvb2xfb3BzOwogCW5ldGlmX25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpLCBjcHN3X3BvbGwsIENQU1dfUE9MTF9XRUlHSFQpOwogCiAJLyogcmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHRzLmMKaW5kZXggMjQzNTEzOS4uNmI1NmY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3B0cy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwdHMuYwpAQCAtMjM2LDEzICsyMzYsMTEgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNwdHMtPm92ZXJmbG93X3dvcmssIENQVFNfT1ZFUkZMT1dfUEVSSU9EKTsKIH0KIAotI2RlZmluZSBDUFRTX1JFRl9DTE9DS19OQU1FICJjcHN3X2NwdHNfcmZ0X2NsayIKLQotc3RhdGljIHZvaWQgY3B0c19jbGtfaW5pdChzdHJ1Y3QgY3B0cyAqY3B0cykKK3N0YXRpYyB2b2lkIGNwdHNfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY3B0cyAqY3B0cykKIHsKLQljcHRzLT5yZWZjbGsgPSBjbGtfZ2V0KE5VTEwsIENQVFNfUkVGX0NMT0NLX05BTUUpOworCWNwdHMtPnJlZmNsayA9IGRldm1fY2xrX2dldChkZXYsICJjcHRzIik7CiAJaWYgKElTX0VSUihjcHRzLT5yZWZjbGspKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGNsa19nZXQgJXNcbiIsIENQVFNfUkVGX0NMT0NLX05BTUUpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgY3B0cyByZWZjbGtcbiIpOwogCQljcHRzLT5yZWZjbGsgPSBOVUxMOwogCQlyZXR1cm47CiAJfQpAQCAtMjUyLDcgKzI1MCw2IEBACiBzdGF0aWMgdm9pZCBjcHRzX2Nsa19yZWxlYXNlKHN0cnVjdCBjcHRzICpjcHRzKQogewogCWNsa19kaXNhYmxlKGNwdHMtPnJlZmNsayk7Ci0JY2xrX3B1dChjcHRzLT5yZWZjbGspOwogfQogCiBzdGF0aWMgaW50IGNwdHNfbWF0Y2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHB0cF9jbGFzcywKQEAgLTM5MCw3ICszODcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBDUFRTX01BWF9FVkVOVFM7IGkrKykKIAkJbGlzdF9hZGQoJmNwdHMtPnBvb2xfZGF0YVtpXS5saXN0LCAmY3B0cy0+cG9vbCk7CiAKLQljcHRzX2Nsa19pbml0KGNwdHMpOworCWNwdHNfY2xrX2luaXQoZGV2LCBjcHRzKTsKIAljcHRzX3dyaXRlMzIoY3B0cywgQ1BUU19FTiwgY29udHJvbCk7CiAJY3B0c193cml0ZTMyKGNwdHMsIFRTX1BFTkRfRU4sIGludF9lbmFibGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKaW5kZXggODhlZjI3MC4uNGEwMDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYwpAQCAtMTU4LDkgKzE1OCw5IEBACiAJaW50IGJpdG1hcF9zaXplOwogCXN0cnVjdCBjcGRtYV9kZXNjX3Bvb2wgKnBvb2w7CiAKLQlwb29sID0ga3phbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKKwlwb29sID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb29sKQotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBmYWlsOwogCiAJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOwogCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlwb29sLT5udW1fZGVzYwk9IHNpemUgLyBwb29sLT5kZXNjX3NpemU7CiAKIAliaXRtYXBfc2l6ZSAgPSAocG9vbC0+bnVtX2Rlc2MgLyBCSVRTX1BFUl9MT05HKSAqIHNpemVvZihsb25nKTsKLQlwb29sLT5iaXRtYXAgPSBremFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlwb29sLT5iaXRtYXAgPSBkZXZtX2t6YWxsb2MoZGV2LCBiaXRtYXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb29sLT5iaXRtYXApCiAJCWdvdG8gZmFpbDsKIApAQCAtMTg3LDEwICsxODcsNyBAQAogCiAJaWYgKHBvb2wtPmlvbWFwKQogCQlyZXR1cm4gcG9vbDsKLQogZmFpbDoKLQlrZnJlZShwb29sLT5iaXRtYXApOwotCWtmcmVlKHBvb2wpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yMDMsNyArMjAwLDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CiAJV0FSTl9PTihwb29sLT51c2VkX2Rlc2MpOwotCWtmcmVlKHBvb2wtPmJpdG1hcCk7CiAJaWYgKHBvb2wtPmNwdW1hcCkgewogCQlkbWFfZnJlZV9jb2hlcmVudChwb29sLT5kZXYsIHBvb2wtPm1lbV9zaXplLCBwb29sLT5jcHVtYXAsCiAJCQkJICBwb29sLT5waHlzKTsKQEAgLTIxMSw3ICsyMDcsNiBAQAogCQlpb3VubWFwKHBvb2wtPmlvbWFwKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwotCWtmcmVlKHBvb2wpOwogfQogCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZGVzY19waHlzKHN0cnVjdCBjcGRtYV9kZXNjX3Bvb2wgKnBvb2wsCkBAIC0yNzYsNyArMjcxLDcgQEAKIHsKIAlzdHJ1Y3QgY3BkbWFfY3RsciAqY3RscjsKIAotCWN0bHIgPSBremFsbG9jKHNpemVvZigqY3RsciksIEdGUF9LRVJORUwpOworCWN0bHIgPSBkZXZtX2t6YWxsb2MocGFyYW1zLT5kZXYsIHNpemVvZigqY3RsciksIEdGUF9LRVJORUwpOwogCWlmICghY3RscikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTI5MCwxMCArMjg1LDggQEAKIAkJCQkJICAgIGN0bHItPnBhcmFtcy5kZXNjX2h3X2FkZHIsCiAJCQkJCSAgICBjdGxyLT5wYXJhbXMuZGVzY19tZW1fc2l6ZSwKIAkJCQkJICAgIGN0bHItPnBhcmFtcy5kZXNjX2FsaWduKTsKLQlpZiAoIWN0bHItPnBvb2wpIHsKLQkJa2ZyZWUoY3Rscik7CisJaWYgKCFjdGxyLT5wb29sKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlpZiAoV0FSTl9PTihjdGxyLT5udW1fY2hhbiA+IENQRE1BX01BWF9DSEFOTkVMUykpCiAJCWN0bHItPm51bV9jaGFuID0gQ1BETUFfTUFYX0NIQU5ORUxTOwpAQCAtNDY4LDcgKzQ2MSw2IEBACiAKIAljcGRtYV9kZXNjX3Bvb2xfZGVzdHJveShjdGxyLT5wb29sKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUoY3Rscik7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2N0bHJfZGVzdHJveSk7CkBAIC01MDcsMjEgKzQ5OSwyMiBAQAogCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyKQogewogCXN0cnVjdCBjcGRtYV9jaGFuICpjaGFuOwotCWludCByZXQsIG9mZnNldCA9IChjaGFuX251bSAlIENQRE1BX01BWF9DSEFOTkVMUykgKiA0OworCWludCBvZmZzZXQgPSAoY2hhbl9udW0gJSBDUERNQV9NQVhfQ0hBTk5FTFMpICogNDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKF9fY2hhbl9saW5lYXIoY2hhbl9udW0pID49IGN0bHItPm51bV9jaGFuKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldCA9IC1FTk9NRU07Ci0JY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFuKSwgR0ZQX0tFUk5FTCk7CisJY2hhbiA9IGRldm1fa3phbGxvYyhjdGxyLT5kZXYsIHNpemVvZigqY2hhbiksIEdGUF9LRVJORUwpOwogCWlmICghY2hhbikKLQkJZ290byBlcnJfY2hhbl9hbGxvYzsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwotCXJldCA9IC1FQlVTWTsKLQlpZiAoY3Rsci0+Y2hhbm5lbHNbY2hhbl9udW1dKQotCQlnb3RvIGVycl9jaGFuX2J1c3k7CisJaWYgKGN0bHItPmNoYW5uZWxzW2NoYW5fbnVtXSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7CisJCWRldm1fa2ZyZWUoY3Rsci0+ZGV2LCBjaGFuKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CiAKIAljaGFuLT5jdGxyCT0gY3RscjsKIAljaGFuLT5zdGF0ZQk9IENQRE1BX1NUQVRFX0lETEU7CkBAIC01NTEsMTIgKzU0NCw2IEBACiAJY3Rsci0+Y2hhbm5lbHNbY2hhbl9udW1dID0gY2hhbjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNoYW47Ci0KLWVycl9jaGFuX2J1c3k6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwotCWtmcmVlKGNoYW4pOwotZXJyX2NoYW5fYWxsb2M6Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2NoYW5fY3JlYXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwppbmRleCA4ZjBlNjljLi4zNWExMzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwpAQCAtMTU2Nyw3ICsxNTY3LDYgQEAKIAl3aGlsZSAoKHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwcml2LT5wZGV2LCBJT1JFU09VUkNFX0lSUSwKIAkJCQkJICAgIHJlc19udW0pKSkgewogCQlmb3IgKGlycV9udW0gPSByZXMtPnN0YXJ0OyBpcnFfbnVtIDw9IHJlcy0+ZW5kOyBpcnFfbnVtKyspIHsKLQkJCWRldl9lcnIoZW1hY19kZXYsICJSZXF1ZXN0IElSUSAlZFxuIiwgaXJxX251bSk7CiAJCQlpZiAocmVxdWVzdF9pcnEoaXJxX251bSwgZW1hY19pcnEsIDAsIG5kZXYtPm5hbWUsCiAJCQkJCW5kZXYpKSB7CiAJCQkJZGV2X2VycihlbWFjX2RldiwKQEAgLTE4NjUsNyArMTg2NCw2IEBACiAJc3RydWN0IGVtYWNfcHJpdiAqcHJpdjsKIAl1bnNpZ25lZCBsb25nIGh3X3JhbV9hZGRyOwogCXN0cnVjdCBlbWFjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2OwogCXN0cnVjdCBjcGRtYV9wYXJhbXMgZG1hX3BhcmFtczsKIAlzdHJ1Y3QgY2xrICplbWFjX2NsazsKIAl1bnNpZ25lZCBsb25nIGVtYWNfYnVzX2ZyZXF1ZW5jeTsKQEAgLTE5MTEsNyArMTkwOSw2IEBACiAJcHJpdi0+Y29hbF9pbnR2bCA9IDA7CiAJcHJpdi0+YnVzX2ZyZXFfbWh6ID0gKHUzMikoZW1hY19idXNfZnJlcXVlbmN5IC8gMTAwMDAwMCk7CiAKLQllbWFjX2RldiA9ICZuZGV2LT5kZXY7CiAJLyogR2V0IEVNQUMgcGxhdGZvcm0gZGF0YSAqLwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcHJpdi0+ZW1hY19iYXNlX3BoeXMgPSByZXMtPnN0YXJ0ICsgcGRhdGEtPmN0cmxfcmVnX29mZnNldDsKQEAgLTE5MzAsNyArMTkyNyw3IEBACiAJCWh3X3JhbV9hZGRyID0gKHUzMiBfX2ZvcmNlKXJlcy0+c3RhcnQgKyBwZGF0YS0+Y3RybF9yYW1fb2Zmc2V0OwogCiAJbWVtc2V0KCZkbWFfcGFyYW1zLCAwLCBzaXplb2YoZG1hX3BhcmFtcykpOwotCWRtYV9wYXJhbXMuZGV2CQkJPSBlbWFjX2RldjsKKwlkbWFfcGFyYW1zLmRldgkJCT0gJnBkZXYtPmRldjsKIAlkbWFfcGFyYW1zLmRtYXJlZ3MJCT0gcHJpdi0+ZW1hY19iYXNlOwogCWRtYV9wYXJhbXMucnh0aHJlc2gJCT0gcHJpdi0+ZW1hY19iYXNlICsgMHgxMjA7CiAJZG1hX3BhcmFtcy5yeGZyZWUJCT0gcHJpdi0+ZW1hY19iYXNlICsgMHgxNDA7CkBAIC0xOTgwLDcgKzE5NzcsNyBAQAogCX0KIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmZW1hY19uZXRkZXZfb3BzOwotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmZXRodG9vbF9vcHMpOworCW5kZXYtPmV0aHRvb2xfb3BzID0gJmV0aHRvb2xfb3BzOwogCW5ldGlmX25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpLCBlbWFjX3BvbGwsIEVNQUNfUE9MTF9XRUlHSFQpOwogCiAJLyogcmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlICovCkBAIC0xOTk0LDcgKzE5OTEsNyBAQAogCiAKIAlpZiAobmV0aWZfbXNnX3Byb2JlKHByaXYpKSB7Ci0JCWRldl9ub3RpY2UoZW1hY19kZXYsICJEYVZpbmNpIEVNQUMgUHJvYmUgZm91bmQgZGV2aWNlICJcCisJCWRldl9ub3RpY2UoJnBkZXYtPmRldiwgIkRhVmluY2kgRU1BQyBQcm9iZSBmb3VuZCBkZXZpY2UgIgogCQkJICAgIihyZWdzOiAlcCwgaXJxOiAlZClcbiIsCiAJCQkgICAodm9pZCAqKXByaXYtPmVtYWNfYmFzZV9waHlzLCBuZGV2LT5pcnEpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9tZGlvLmMKaW5kZXggMGNjYTlkZS4uNzM1ZGM1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfbWRpby5jCkBAIC0zMDMsNyArMzAzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImJ1c19mcmVxIiwgJnByb3ApKSB7Ci0JCXByX2VycigiTWlzc2luZyBidXNfZnJlcSBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBidXNfZnJlcSBwcm9wZXJ0eSBpbiB0aGUgRFQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmJ1c19mcmVxID0gcHJvcDsKQEAgLTMyMSwxNSArMzIxLDE0IEBACiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeTsKIAlpbnQgcmV0LCBhZGRyOwogCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkYXRhLT5idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJZGF0YS0+YnVzID0gZGV2bV9tZGlvYnVzX2FsbG9jKGRldik7CiAJaWYgKCFkYXRhLT5idXMpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2MgbWlpIGJ1c1xuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gYmFpbF9vdXQ7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlmIChkZXYtPm9mX25vZGUpIHsKQEAgLTM0OSwxMiArMzQ4LDkgQEAKIAlkYXRhLT5idXMtPnBhcmVudAk9IGRldjsKIAlkYXRhLT5idXMtPnByaXYJCT0gZGF0YTsKIAotCS8qIFNlbGVjdCBkZWZhdWx0IHBpbiBzdGF0ZSAqLwotCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJnBkZXYtPmRldik7Ci0KIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwotCWRhdGEtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJmY2siKTsKIAlpZiAoSVNfRVJSKGRhdGEtPmNsaykpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBjbG9ja1xuIik7CiAJCXJldCA9IFBUUl9FUlIoZGF0YS0+Y2xrKTsKQEAgLTM2NywyNCArMzYzLDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGF0YS0+bG9jayk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGZpbmQgcmVnaXN0ZXIgbWFwIHJlc291cmNlXG4iKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBiYWlsX291dDsKLQl9Ci0KLQlyZXMgPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbihkZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkJICAgIGRldl9uYW1lKGRldikpOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIG1hcCByZXNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBiYWlsX291dDsKLQl9Ci0KLQlkYXRhLT5yZWdzID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghZGF0YS0+cmVncykgewotCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBtYXAgbWRpbyByZWdpc3RlcnNcbiIpOwotCQlyZXQgPSAtRU5PTUVNOworCWRhdGEtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoZGF0YS0+cmVncykpIHsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT5yZWdzKTsKIAkJZ290byBiYWlsX291dDsKIAl9CiAKQEAgLTQwNiwxNiArMzg3LDkgQEAKIAlyZXR1cm4gMDsKIAogYmFpbF9vdXQ6Ci0JaWYgKGRhdGEtPmJ1cykKLQkJbWRpb2J1c19mcmVlKGRhdGEtPmJ1cyk7Ci0KLQlpZiAoZGF0YS0+Y2xrKQotCQljbGtfcHV0KGRhdGEtPmNsayk7CiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKLQlrZnJlZShkYXRhKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyMywxOCArMzk3LDEyIEBACiB7CiAJc3RydWN0IGRhdmluY2lfbWRpb19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAoZGF0YS0+YnVzKSB7CisJaWYgKGRhdGEtPmJ1cykKIAkJbWRpb2J1c191bnJlZ2lzdGVyKGRhdGEtPmJ1cyk7Ci0JCW1kaW9idXNfZnJlZShkYXRhLT5idXMpOwotCX0KIAotCWlmIChkYXRhLT5jbGspCi0JCWNsa19wdXQoZGF0YS0+Y2xrKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAotCWtmcmVlKGRhdGEpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZWd4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aWxlL3RpbGVneC5jCmluZGV4IDQ0OTAxMWIuLjE0Mzg5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZWd4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGlsZS90aWxlZ3guYwpAQCAtMjE5Miw3ICsyMTkyLDYgQEAKIHsKIAlpbnQgcmV0OwogCWludCBpOwotCWludCBuel9hZGRyID0gMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCB0aWxlX25ldF9wcml2ICpwcml2OwogCkBAIC0yMjEyLDcgKzIyMTEsNiBAQAogCiAJLyogSW5pdGlhbGl6ZSAicHJpdiIuICovCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOwogCXByaXYtPmRldiA9IGRldjsKIAlwcml2LT5jaGFubmVsID0gLTE7CiAJcHJpdi0+bG9vcGlmeV9jaGFubmVsID0gLTE7CkBAIC0yMjIzLDE1ICsyMjIxLDEwIEBACiAJICogYmUgZG9uZSBiZWZvcmUgdGhlIGRldmljZSBpcyBvcGVuZWQuICBJZiB0aGUgTUFDIGlzIGFsbCB6ZXJvZXMsCiAJICogd2UgdXNlIGEgcmFuZG9tIGFkZHJlc3MsIHNpbmNlIHdlJ3JlIHByb2JhYmx5IG9uIHRoZSBzaW11bGF0b3IuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJbnpfYWRkciB8PSBtYWNbaV07Ci0KLQlpZiAobnpfYWRkcikgewotCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTik7Ci0JCWRldi0+YWRkcl9sZW4gPSA2OwotCX0gZWxzZSB7CisJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIobWFjKSkKKwkJZXRoZXJfYWRkcl9jb3B5KGRldi0+ZGV2X2FkZHIsIG1hYyk7CisJZWxzZQogCQlldGhfaHdfYWRkcl9yYW5kb20oZGV2KTsKLQl9CiAKIAkvKiBSZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UuICovCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCmluZGV4IGQ4OTlkMDAuLmJiNzk5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCkBAIC0xNTYxLDcgKzE1NjEsNyBAQAogCSAqIGFsbG9jIG5ldGRldgogCSAqLwogCSpuZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGdlbGljX3BvcnQpKTsKLQlpZiAoIW5ldGRldikgeworCWlmICghKm5ldGRldikgewogCQlrZnJlZShjYXJkLT51bmFsaWduKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvS2NvbmZpZwppbmRleCA4YTA0OWEyLi5mNjZkZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvS2NvbmZpZwpAQCAtMTksNyArMTksNyBAQAogCiBjb25maWcgVklBX1JISU5FCiAJdHJpc3RhdGUgIlZJQSBSaGluZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiAoUENJIHx8IFVTRV9PRikKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jCmluZGV4IGY2MWRjMmIuLjJkNzJmOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtcmhpbmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMKQEAgLTk0LDYgKzk0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTExNiwxMyArMTIwLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CiAJInYxLjEwLUxLIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXIiOwogCi0vKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiB0byB1c2UgUENJIG1lbW9yeSBzcGFjZS4gU29tZSBlYXJseSB2ZXJzaW9ucwotICAgb2YgdGhlIFJoaW5lIG1heSBvbmx5IHdvcmsgY29ycmVjdGx5IHdpdGggSS9PIHNwYWNlIGFjY2Vzc2VzLiAqLwotI2lmZGVmIENPTkZJR19WSUFfUkhJTkVfTU1JTwotI2RlZmluZSBVU0VfTU1JTwotI2Vsc2UKLSNlbmRpZgotCiBNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgUmhpbmUgUENJIEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yNjAsNiArMjU3LDEyIEBACiAJcnE2cGF0dGVybnMJPSAweDAwNDAsCS8qIDYgaW5zdGVhZCBvZiA0IHBhdHRlcm5zIGZvciBXT0wgKi8KIAlycVN0YXR1c1dCUmFjZQk9IDB4MDA4MCwJLyogVHggU3RhdHVzIFdyaXRlYmFjayBFcnJvciBwb3NzaWJsZSAqLwogCXJxUmhpbmVJCT0gMHgwMTAwLAkvKiBTZWUgY29tbWVudCBiZWxvdyAqLworCXJxSW50UEhZCT0gMHgwMjAwLAkvKiBJbnRlZ3JhdGVkIFBIWSAqLworCXJxTWdtdAkJPSAweDA0MDAsCS8qIE1hbmFnZW1lbnQgYWRhcHRlciAqLworCXJxTmVlZEVuTU1JTwk9IDB4MDgwMCwJLyogV2hldGhlciB0aGUgY29yZSBuZWVkcyB0byBiZQorCQkJCQkgKiBzd2l0Y2hlZCBmcm9tIFBJTyBtb2RlIHRvIE1NSU8KKwkJCQkJICogKG9ubHkgYXBwbGllcyB0byBQQ0kpCisJCQkJCSAqLwogfTsKIC8qCiAgKiBycVJoaW5lSTogVlQ4NkMxMDBBIChha2EgUmhpbmUtSSkgdXNlcyBkaWZmZXJlbnQgYml0cyB0byBlbmFibGUKQEAgLTI3OSw2ICsyODIsMTUgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcmhpbmVfcGNpX3RibCk7CiAKKy8qIE9wZW5GaXJtd2FyZSBpZGVudGlmaWVycyBmb3IgcGxhdGZvcm0tYnVzIGRldmljZXMKKyAqIFRoZSAuZGF0YSBmaWVsZCBpcyBjdXJyZW50bHkgb25seSB1c2VkIHRvIHN0b3JlIHF1aXJrcworICovCitzdGF0aWMgdTMyIHZ0ODUwMF9xdWlya3MgPSBycVdPTCB8IHJxRm9yY2VSZXNldCB8IHJxNnBhdHRlcm5zOworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcmhpbmVfb2ZfdGJsW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ2aWEsdnQ4NTAwLXJoaW5lIiwgLmRhdGEgPSAmdnQ4NTAwX3F1aXJrcyB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJoaW5lX29mX3RibCk7CiAKIC8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuICovCiBlbnVtIHJlZ2lzdGVyX29mZnNldHMgewpAQCAtMzM4LDEzICszNTAsMTEgQEAKIAlCQ1IxX01FRDE9MHg4MCwJCS8qIGZvciBWVDYxMDIgKi8KIH07CiAKLSNpZmRlZiBVU0VfTU1JTwogLyogUmVnaXN0ZXJzIHdlIGNoZWNrIHRoYXQgbW1pbyBhbmQgcmVnIGFyZSB0aGUgc2FtZS4gKi8KIHN0YXRpYyBjb25zdCBpbnQgbW1pb192ZXJpZnlfcmVnaXN0ZXJzW10gPSB7CiAJUnhDb25maWcsIFR4Q29uZmlnLCBJbnRyRW5hYmxlLCBDb25maWdBLCBDb25maWdCLCBDb25maWdDLCBDb25maWdELAogCTAKIH07Ci0jZW5kaWYKIAogLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KIGVudW0gaW50cl9zdGF0dXNfYml0cyB7CkBAIC00NDYsNyArNDU2LDcgQEAKIAl1bnNpZ25lZCBjaGFyICp0eF9idWZzOwogCWRtYV9hZGRyX3QgdHhfYnVmc19kbWE7CiAKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgaXJxOwogCWxvbmcgcGlvYWRkcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwpAQCAtNjQ5LDIwICs2NTksNDYgQEAKIAkJICAgImZhaWxlZCIgOiAic3VjY2VlZGVkIik7CiB9CiAKLSNpZmRlZiBVU0VfTU1JTwogc3RhdGljIHZvaWQgZW5hYmxlX21taW8obG9uZyBwaW9hZGRyLCB1MzIgcXVpcmtzKQogewogCWludCBuOwotCWlmIChxdWlya3MgJiBycVJoaW5lSSkgewotCQkvKiBNb3JlIHJlY2VudCBkb2NzIHNheSB0aGF0IHRoaXMgYml0IGlzIHJlc2VydmVkIC4uLiAqLwotCQluID0gaW5iKHBpb2FkZHIgKyBDb25maWdBKSB8IDB4MjA7Ci0JCW91dGIobiwgcGlvYWRkciArIENvbmZpZ0EpOwotCX0gZWxzZSB7Ci0JCW4gPSBpbmIocGlvYWRkciArIENvbmZpZ0QpIHwgMHg4MDsKLQkJb3V0YihuLCBwaW9hZGRyICsgQ29uZmlnRCk7CisKKwlpZiAocXVpcmtzICYgcnFOZWVkRW5NTUlPKSB7CisJCWlmIChxdWlya3MgJiBycVJoaW5lSSkgeworCQkJLyogTW9yZSByZWNlbnQgZG9jcyBzYXkgdGhhdCB0aGlzIGJpdCBpcyByZXNlcnZlZCAqLworCQkJbiA9IGluYihwaW9hZGRyICsgQ29uZmlnQSkgfCAweDIwOworCQkJb3V0YihuLCBwaW9hZGRyICsgQ29uZmlnQSk7CisJCX0gZWxzZSB7CisJCQluID0gaW5iKHBpb2FkZHIgKyBDb25maWdEKSB8IDB4ODA7CisJCQlvdXRiKG4sIHBpb2FkZHIgKyBDb25maWdEKTsKKwkJfQogCX0KIH0KLSNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfbW1pbyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCSAgICAgIGxvbmcgcGlvYWRkciwKKwkJCSAgICAgIHZvaWQgX19pb21lbSAqaW9hZGRyLAorCQkJICAgICAgdTMyIHF1aXJrcykKK3sKKwlpZiAocXVpcmtzICYgcnFOZWVkRW5NTUlPKSB7CisJCWludCBpID0gMDsKKworCQkvKiBDaGVjayB0aGF0IHNlbGVjdGVkIE1NSU8gcmVnaXN0ZXJzIG1hdGNoIHRoZSBQSU8gb25lcyAqLworCQl3aGlsZSAobW1pb192ZXJpZnlfcmVnaXN0ZXJzW2ldKSB7CisJCQlpbnQgcmVnID0gbW1pb192ZXJpZnlfcmVnaXN0ZXJzW2krK107CisJCQl1bnNpZ25lZCBjaGFyIGEgPSBpbmIocGlvYWRkcityZWcpOworCQkJdW5zaWduZWQgY2hhciBiID0gcmVhZGIoaW9hZGRyK3JlZyk7CisKKwkJCWlmIChhICE9IGIpIHsKKwkJCQlkZXZfZXJyKGh3ZGV2LAorCQkJCQkiTU1JTyBkbyBub3QgbWF0Y2ggUElPIFslMDJ4XSAoJTAyeCAhPSAlMDJ4KVxuIiwKKwkJCQkJcmVnLCBhLCBiKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIExvYWRzIGJ5dGVzIDB4MDAtMHgwNSwgMHg2RS0weDZGLCAweDc4LTB4N0IgZnJvbSBFRVBST00KQEAgLTY4MiwxNCArNzE4LDEyIEBACiAJaWYgKGkgPiA1MTIpCiAJCXByX2luZm8oIiU0ZCBjeWNsZXMgdXNlZCBAICVzOiVkXG4iLCBpLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0jaWZkZWYgVVNFX01NSU8KIAkvKgogCSAqIFJlbG9hZGluZyBmcm9tIEVFUFJPTSBvdmVyd3JpdGVzIENvbmZpZ0EtRCwgc28gd2UgbXVzdCByZS1lbmFibGUKIAkgKiBNTUlPLiBJZiByZWxvYWRpbmcgRUVQUk9NIHdhcyBkb25lIGZpcnN0IHRoaXMgY291bGQgYmUgYXZvaWRlZCwgYnV0CiAJICogaXQgaXMgbm90IGtub3duIGlmIHRoYXQgc3RpbGwgd29ya3Mgd2l0aCB0aGUgIndpbjk4LXJlYm9vdCIgcHJvYmxlbS4KIAkgKi8KIAllbmFibGVfbW1pbyhwaW9hZGRyLCBycC0+cXVpcmtzKTsKLSNlbmRpZgogCiAJLyogVHVybiBvZmYgRUVQUk9NLWNvbnRyb2xsZWQgd2FrZS11cCAobWFnaWMgcGFja2V0KSAqLwogCWlmIChycC0+cXVpcmtzICYgcnFXT0wpCkBAIC03MDEsNyArNzM1LDcgQEAKIHN0YXRpYyB2b2lkIHJoaW5lX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWNvbnN0IGludCBpcnEgPSBycC0+cGRldi0+aXJxOworCWNvbnN0IGludCBpcnEgPSBycC0+aXJxOwogCiAJZGlzYWJsZV9pcnEoaXJxKTsKIAlyaGluZV9pbnRlcnJ1cHQoaXJxLCBkZXYpOwpAQCAtODQ2LDcgKzg4MCw4IEBACiAJCW1zbGVlcCg1KTsKIAogCS8qIFJlbG9hZCBFRVBST00gY29udHJvbGxlZCBieXRlcyBjbGVhcmVkIGJ5IHNvZnQgcmVzZXQgKi8KLQlyaGluZV9yZWxvYWRfZWVwcm9tKHBpb2FkZHIsIGRldik7CisJaWYgKGRldl9pc19wY2koZGV2LT5kZXYucGFyZW50KSkKKwkJcmhpbmVfcmVsb2FkX2VlcHJvbShwaW9hZGRyLCBkZXYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJoaW5lX25ldGRldl9vcHMgPSB7CkBAIC04NjcsMTI1ICs5MDIsMzcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCByaGluZV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3N0YXRpYyBpbnQgcmhpbmVfaW5pdF9vbmVfY29tbW9uKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1MzIgcXVpcmtzLAorCQkJCSBsb25nIHBpb2FkZHIsIHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgaXJxKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwOwotCWludCBpLCByYzsKLQl1MzIgcXVpcmtzOwotCWxvbmcgcGlvYWRkcjsKLQlsb25nIG1lbWFkZHI7Ci0Jdm9pZCBfX2lvbWVtICppb2FkZHI7Ci0JaW50IGlvX3NpemUsIHBoeV9pZDsKKwlpbnQgaSwgcmMsIHBoeV9pZDsKIAljb25zdCBjaGFyICpuYW1lOwotI2lmZGVmIFVTRV9NTUlPCi0JaW50IGJhciA9IDE7Ci0jZWxzZQotCWludCBiYXIgPSAwOwotI2VuZGlmCi0KLS8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCi0jaWZuZGVmIE1PRFVMRQotCXByX2luZm9fb25jZSgiJXNcbiIsIHZlcnNpb24pOwotI2VuZGlmCi0KLQlpb19zaXplID0gMjU2OwotCXBoeV9pZCA9IDA7Ci0JcXVpcmtzID0gMDsKLQluYW1lID0gIlJoaW5lIjsKLQlpZiAocGRldi0+cmV2aXNpb24gPCBWVHVua25vd24wKSB7Ci0JCXF1aXJrcyA9IHJxUmhpbmVJOwotCQlpb19zaXplID0gMTI4OwotCX0KLQllbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA+PSBWVDYxMDIpIHsKLQkJcXVpcmtzID0gcnFXT0wgfCBycUZvcmNlUmVzZXQ7Ci0JCWlmIChwZGV2LT5yZXZpc2lvbiA8IFZUNjEwNSkgewotCQkJbmFtZSA9ICJSaGluZSBJSSI7Ci0JCQlxdWlya3MgfD0gcnFTdGF0dXNXQlJhY2U7CS8qIFJoaW5lLUlJIGV4Y2x1c2l2ZSAqLwotCQl9Ci0JCWVsc2UgewotCQkJcGh5X2lkID0gMTsJLyogSW50ZWdyYXRlZCBQSFksIHBoeV9pZCBmaXhlZCB0byAxICovCi0JCQlpZiAocGRldi0+cmV2aXNpb24gPj0gVlQ2MTA1X0IwKQotCQkJCXF1aXJrcyB8PSBycTZwYXR0ZXJuczsKLQkJCWlmIChwZGV2LT5yZXZpc2lvbiA8IFZUNjEwNU0pCi0JCQkJbmFtZSA9ICJSaGluZSBJSUkiOwotCQkJZWxzZQotCQkJCW5hbWUgPSAiUmhpbmUgSUlJIChNYW5hZ2VtZW50IEFkYXB0ZXIpIjsKLQkJfQotCX0KLQotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXQ7CiAKIAkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgc3VwcG9ydGVkICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCXJjID0gZG1hX3NldF9tYXNrKGh3ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkIT9cbiIpOwotCQlnb3RvIGVycl9vdXRfcGNpX2Rpc2FibGU7CisJCWRldl9lcnIoaHdkZXYsICIzMi1iaXQgRE1BIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkIT9cbiIpOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgaW9fc2l6ZSkgfHwKLQkgICAgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBpb19zaXplKSkgewotCQlyYyA9IC1FSU87Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkluc3VmZmljaWVudCBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7Ci0JCWdvdG8gZXJyX291dF9wY2lfZGlzYWJsZTsKLQl9Ci0KLQlwaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCW1lbWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSkpOwogCWlmICghZGV2KSB7CiAJCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0X3BjaV9kaXNhYmxlOworCQlnb3RvIGVycl9vdXQ7CiAJfQotCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBod2Rldik7CiAKIAlycCA9IG5ldGRldl9wcml2KGRldik7CiAJcnAtPmRldiA9IGRldjsKIAlycC0+cXVpcmtzID0gcXVpcmtzOwogCXJwLT5waW9hZGRyID0gcGlvYWRkcjsKLQlycC0+cGRldiA9IHBkZXY7CisJcnAtPmJhc2UgPSBpb2FkZHI7CisJcnAtPmlycSA9IGlycTsKIAlycC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBSSElORV9NU0dfREVGQVVMVCk7CiAKLQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChyYykKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCi0JaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgaW9fc2l6ZSk7Ci0JaWYgKCFpb2FkZHIpIHsKLQkJcmMgPSAtRUlPOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JVggQCAweCVsWFxuIiwKLQkJCXBjaV9uYW1lKHBkZXYpLCBpb19zaXplLCBtZW1hZGRyKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwotCX0KLQotI2lmZGVmIFVTRV9NTUlPCi0JZW5hYmxlX21taW8ocGlvYWRkciwgcXVpcmtzKTsKLQotCS8qIENoZWNrIHRoYXQgc2VsZWN0ZWQgTU1JTyByZWdpc3RlcnMgbWF0Y2ggdGhlIFBJTyBvbmVzICovCi0JaSA9IDA7Ci0Jd2hpbGUgKG1taW9fdmVyaWZ5X3JlZ2lzdGVyc1tpXSkgewotCQlpbnQgcmVnID0gbW1pb192ZXJpZnlfcmVnaXN0ZXJzW2krK107Ci0JCXVuc2lnbmVkIGNoYXIgYSA9IGluYihwaW9hZGRyK3JlZyk7Ci0JCXVuc2lnbmVkIGNoYXIgYiA9IHJlYWRiKGlvYWRkcityZWcpOwotCQlpZiAoYSAhPSBiKSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIk1NSU8gZG8gbm90IG1hdGNoIFBJTyBbJTAyeF0gKCUwMnggIT0gJTAyeClcbiIsCi0JCQkJcmVnLCBhLCBiKTsKLQkJCWdvdG8gZXJyX291dF91bm1hcDsKLQkJfQotCX0KLSNlbmRpZiAvKiBVU0VfTU1JTyAqLwotCi0JcnAtPmJhc2UgPSBpb2FkZHI7CisJcGh5X2lkID0gcnAtPnF1aXJrcyAmIHJxSW50UEhZID8gMSA6IDA7CiAKIAl1NjRfc3RhdHNfaW5pdCgmcnAtPnR4X3N0YXRzLnN5bmNwKTsKIAl1NjRfc3RhdHNfaW5pdCgmcnAtPnJ4X3N0YXRzLnN5bmNwKTsKQEAgLTEwMzAsNyArOTc3LDcgQEAKIAlpZiAocnAtPnF1aXJrcyAmIHJxUmhpbmVJKQogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0d8TkVUSUZfRl9IV19DU1VNOwogCi0JaWYgKHBkZXYtPnJldmlzaW9uID49IFZUNjEwNU0pCisJaWYgKHJwLT5xdWlya3MgJiBycU1nbXQpCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAogCQkJCSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CiAJCQkJIE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKQEAgLTEwMzgsMTggKzk4NSwyMSBAQAogCS8qIGRldi0+bmFtZSBub3QgZGVmaW5lZCBiZWZvcmUgcmVnaXN0ZXJfbmV0ZGV2KCkhICovCiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmMpCi0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkKKwkJbmFtZSA9ICJSaGluZSI7CisJZWxzZSBpZiAocnAtPnF1aXJrcyAmIHJxU3RhdHVzV0JSYWNlKQorCQluYW1lID0gIlJoaW5lIElJIjsKKwllbHNlIGlmIChycC0+cXVpcmtzICYgcnFNZ210KQorCQluYW1lID0gIlJoaW5lIElJSSAoTWFuYWdlbWVudCBBZGFwdGVyKSI7CisJZWxzZQorCQluYW1lID0gIlJoaW5lIElJSSI7CiAKIAluZXRkZXZfaW5mbyhkZXYsICJWSUEgJXMgYXQgMHglbHgsICVwTSwgSVJRICVkXG4iLAotCQkgICAgbmFtZSwKLSNpZmRlZiBVU0VfTU1JTwotCQkgICAgbWVtYWRkciwKLSNlbHNlCi0JCSAgICAobG9uZylpb2FkZHIsCi0jZW5kaWYKLQkJICAgIGRldi0+ZGV2X2FkZHIsIHBkZXYtPmlycSk7CisJCSAgICBuYW1lLCAobG9uZylpb2FkZHIsIGRldi0+ZGV2X2FkZHIsIHJwLT5pcnEpOwogCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2X3NldF9kcnZkYXRhKGh3ZGV2LCBkZXYpOwogCiAJewogCQl1MTYgbWlpX2NtZDsKQEAgLTEwNzgsNDEgKzEwMjgsMTU4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcmhpbmVfaW5pdF9vbmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpod2RldiA9ICZwZGV2LT5kZXY7CisJaW50IHJjOworCWxvbmcgcGlvYWRkciwgbWVtYWRkcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaW9fc2l6ZSA9IHBkZXYtPnJldmlzaW9uIDwgVlR1bmtub3duMCA/IDEyOCA6IDI1NjsKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UuIFNvbWUgZWFybHkgdmVyc2lvbnMKKyAqIG9mIHRoZSBSaGluZSBtYXkgb25seSB3b3JrIGNvcnJlY3RseSB3aXRoIEkvTyBzcGFjZSBhY2Nlc3Nlcy4KKyAqIFRPRE86IGRldGVybWluZSBmb3Igd2hpY2ggcmV2aXNpb25zIHRoaXMgaXMgdHJ1ZSBhbmQgYXNzaWduIHRoZSBmbGFnCisgKgkgaW4gY29kZSBhcyBvcHBvc2VkIHRvIHRoaXMgS2NvbmZpZyBvcHRpb24gKD8/PykKKyAqLworI2lmZGVmIENPTkZJR19WSUFfUkhJTkVfTU1JTworCXUzMiBxdWlya3MgPSBycU5lZWRFbk1NSU87CisjZWxzZQorCXUzMiBxdWlya3MgPSAwOworI2VuZGlmCisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXByX2luZm9fb25jZSgiJXNcbiIsIHZlcnNpb24pOworI2VuZGlmCisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJaWYgKHBkZXYtPnJldmlzaW9uIDwgVlR1bmtub3duMCkgeworCQlxdWlya3MgfD0gcnFSaGluZUk7CisJfSBlbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA+PSBWVDYxMDIpIHsKKwkJcXVpcmtzIHw9IHJxV09MIHwgcnFGb3JjZVJlc2V0OworCQlpZiAocGRldi0+cmV2aXNpb24gPCBWVDYxMDUpIHsKKwkJCXF1aXJrcyB8PSBycVN0YXR1c1dCUmFjZTsKKwkJfSBlbHNlIHsKKwkJCXF1aXJrcyB8PSBycUludFBIWTsKKwkJCWlmIChwZGV2LT5yZXZpc2lvbiA+PSBWVDYxMDVfQjApCisJCQkJcXVpcmtzIHw9IHJxNnBhdHRlcm5zOworCQkJaWYgKHBkZXYtPnJldmlzaW9uID49IFZUNjEwNU0pCisJCQkJcXVpcmtzIHw9IHJxTWdtdDsKKwkJfQorCX0KKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICgocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSA8IGlvX3NpemUpIHx8CisJICAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgaW9fc2l6ZSkpIHsKKwkJcmMgPSAtRUlPOworCQlkZXZfZXJyKGh3ZGV2LCAiSW5zdWZmaWNpZW50IFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJfb3V0X3BjaV9kaXNhYmxlOworCX0KKworCXBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9wY2lfZGlzYWJsZTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCAocXVpcmtzICYgcnFOZWVkRW5NTUlPID8gMSA6IDApLCBpb19zaXplKTsKKwlpZiAoIWlvYWRkcikgeworCQlyYyA9IC1FSU87CisJCWRldl9lcnIoaHdkZXYsCisJCQkiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JVggQCAweCVsWFxuIiwKKwkJCWRldl9uYW1lKGh3ZGV2KSwgaW9fc2l6ZSwgbWVtYWRkcik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwllbmFibGVfbW1pbyhwaW9hZGRyLCBxdWlya3MpOworCisJcmMgPSB2ZXJpZnlfbW1pbyhod2RldiwgcGlvYWRkciwgaW9hZGRyLCBxdWlya3MpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3VubWFwOworCisJcmMgPSByaGluZV9pbml0X29uZV9jb21tb24oJnBkZXYtPmRldiwgcXVpcmtzLAorCQkJCSAgIHBpb2FkZHIsIGlvYWRkciwgcGRldi0+aXJxKTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gMDsKKwogZXJyX291dF91bm1hcDoKIAlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOwogZXJyX291dF9mcmVlX3JlczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotZXJyX291dF9mcmVlX25ldGRldjoKLQlmcmVlX25ldGRldihkZXYpOwogZXJyX291dF9wY2lfZGlzYWJsZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBlcnJfb3V0OgogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCByaGluZV9pbml0X29uZV9wbGF0Zm9ybShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCWNvbnN0IHUzMiAqcXVpcmtzOworCWludCBpcnE7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShyaGluZV9vZl90YmwsICZwZGV2LT5kZXYpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb2FkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGlvYWRkcikpCisJCXJldHVybiBQVFJfRVJSKGlvYWRkcik7CisKKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwZGV2LT5kZXYub2Zfbm9kZSwgMCk7CisJaWYgKCFpcnEpCisJCXJldHVybiAtRUlOVkFMOworCisJcXVpcmtzID0gbWF0Y2gtPmRhdGE7CisJaWYgKCFxdWlya3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJoaW5lX2luaXRfb25lX2NvbW1vbigmcGRldi0+ZGV2LCAqcXVpcmtzLAorCQkJCSAgICAgKGxvbmcpaW9hZGRyLCBpb2FkZHIsIGlycSk7Cit9CisKIHN0YXRpYyBpbnQgYWxsb2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAJdm9pZCAqcmluZzsKIAlkbWFfYWRkcl90IHJpbmdfZG1hOwogCi0JcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAotCQkJCSAgICBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsKLQkJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKLQkJCQkgICAgJnJpbmdfZG1hKTsKKwlyaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KGh3ZGV2LAorCQkJCSAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArCisJCQkJICBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpLAorCQkJCSAgJnJpbmdfZG1hLAorCQkJCSAgR0ZQX0FUT01JQyk7CiAJaWYgKCFyaW5nKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIERNQSBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgewotCQlycC0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAotCQkJCQkJICAgUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSwKLQkJCQkJCSAgICZycC0+dHhfYnVmc19kbWEpOworCQlycC0+dHhfYnVmcyA9IGRtYV9hbGxvY19jb2hlcmVudChod2RldiwKKwkJCQkJCSBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFLAorCQkJCQkJICZycC0+dHhfYnVmc19kbWEsCisJCQkJCQkgR0ZQX0FUT01JQyk7CiAJCWlmIChycC0+dHhfYnVmcyA9PSBOVUxMKSB7Ci0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LAotCQkJCSAgICBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsKLQkJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKLQkJCQkgICAgcmluZywgcmluZ19kbWEpOworCQkJZG1hX2ZyZWVfY29oZXJlbnQoaHdkZXYsCisJCQkJCSAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArCisJCQkJCSAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCQkJICByaW5nLCByaW5nX2RtYSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTExMjgsMTYgKzExOTUsMTcgQEAKIHN0YXRpYyB2b2lkIGZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LAotCQkJICAgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKwotCQkJICAgIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCi0JCQkgICAgcnAtPnJ4X3JpbmcsIHJwLT5yeF9yaW5nX2RtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoaHdkZXYsCisJCQkgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKworCQkJICBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpLAorCQkJICBycC0+cnhfcmluZywgcnAtPnJ4X3JpbmdfZG1hKTsKIAlycC0+dHhfcmluZyA9IE5VTEw7CiAKIAlpZiAocnAtPnR4X2J1ZnMpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocnAtPnBkZXYsIFBLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkUsCi0JCQkJICAgIHJwLT50eF9idWZzLCBycC0+dHhfYnVmc19kbWEpOworCQlkbWFfZnJlZV9jb2hlcmVudChod2RldiwgUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSwKKwkJCQkgIHJwLT50eF9idWZzLCBycC0+dHhfYnVmc19kbWEpOwogCiAJcnAtPnR4X2J1ZnMgPSBOVUxMOwogCkBAIC0xMTQ2LDYgKzEyMTQsNyBAQAogc3RhdGljIHZvaWQgYWxsb2NfcmJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2UgKmh3ZGV2ID0gZGV2LT5kZXYucGFyZW50OwogCWRtYV9hZGRyX3QgbmV4dDsKIAlpbnQgaTsKIApAQCAtMTE3NCw5ICsxMjQzLDkgQEAKIAkJCWJyZWFrOwogCiAJCXJwLT5yeF9za2J1ZmZfZG1hW2ldID0KLQkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPmRhdGEsIHJwLT5yeF9idWZfc3osCi0JCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcigmcnAtPnBkZXYtPmRldiwgcnAtPnJ4X3NrYnVmZl9kbWFbaV0pKSB7CisJCQlkbWFfbWFwX3NpbmdsZShod2Rldiwgc2tiLT5kYXRhLCBycC0+cnhfYnVmX3N6LAorCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaHdkZXYsIHJwLT5yeF9za2J1ZmZfZG1hW2ldKSkgewogCQkJcnAtPnJ4X3NrYnVmZl9kbWFbaV0gPSAwOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJYnJlYWs7CkBAIC0xMTkwLDYgKzEyNTksNyBAQAogc3RhdGljIHZvaWQgZnJlZV9yYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAJaW50IGk7CiAKIAkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCkBAIC0xMTk3LDkgKzEyNjcsOSBAQAogCQlycC0+cnhfcmluZ1tpXS5yeF9zdGF0dXMgPSAwOwogCQlycC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KIAkJaWYgKHJwLT5yeF9za2J1ZmZbaV0pIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQlkbWFfdW5tYXBfc2luZ2xlKGh3ZGV2LAogCQkJCQkgcnAtPnJ4X3NrYnVmZl9kbWFbaV0sCi0JCQkJCSBycC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQkgcnAtPnJ4X2J1Zl9zeiwgRE1BX0ZST01fREVWSUNFKTsKIAkJCWRldl9rZnJlZV9za2IocnAtPnJ4X3NrYnVmZltpXSk7CiAJCX0KIAkJcnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CkBAIC0xMjMwLDYgKzEzMDAsNyBAQAogc3RhdGljIHZvaWQgZnJlZV90YnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKQEAgLTEyMzgsMTAgKzEzMDksMTAgQEAKIAkJcnAtPnR4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKDB4QkFERjAwRDApOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCiAJCWlmIChycC0+dHhfc2tidWZmW2ldKSB7CiAJCQlpZiAocnAtPnR4X3NrYnVmZl9kbWFbaV0pIHsKLQkJCQlwY2lfdW5tYXBfc2luZ2xlKHJwLT5wZGV2LAorCQkJCWRtYV91bm1hcF9zaW5nbGUoaHdkZXYsCiAJCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbaV0sCiAJCQkJCQkgcnAtPnR4X3NrYnVmZltpXS0+bGVuLAotCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkJIERNQV9UT19ERVZJQ0UpOwogCQkJfQogCQkJZGV2X2tmcmVlX3NrYihycC0+dHhfc2tidWZmW2ldKTsKIAkJfQpAQCAtMTI3OCw4ICsxMzQ5LDkgQEAKIAkJLyogYXV0b25lZyBpcyBvZmY6IExpbmsgaXMgYWx3YXlzIGFzc3VtZWQgdG8gYmUgdXAgKi8KIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCQluZXRpZl9jYXJyaWVyX29uKGRldik7Ci0JfSBlbHNlCS8qIExldCBNTUkgbGlicmFyeSB1cGRhdGUgY2FycmllciBzdGF0dXMgKi8KLQkJcmhpbmVfY2hlY2tfbWVkaWEoZGV2LCAwKTsKKwl9CisKKwlyaGluZV9jaGVja19tZWRpYShkZXYsIDApOwogCiAJbmV0aWZfaW5mbyhycCwgbGluaywgZGV2LCAiZm9yY2VfbWVkaWEgJWQsIGNhcnJpZXIgJWRcbiIsCiAJCSAgIG1paS0+Zm9yY2VfbWVkaWEsIG5ldGlmX2NhcnJpZXJfb2soZGV2KSk7CkBAIC0xNDY5LDcgKzE1NDEsNyBAQAogCiAJcmhpbmVfc2V0X3J4X21vZGUoZGV2KTsKIAotCWlmIChycC0+cGRldi0+cmV2aXNpb24gPj0gVlQ2MTA1TSkKKwlpZiAocnAtPnF1aXJrcyAmIHJxTWdtdCkKIAkJcmhpbmVfaW5pdF9jYW1fZmlsdGVyKGRldik7CiAKIAluYXBpX2VuYWJsZSgmcnAtPm5hcGkpOwpAQCAtMTU4MSwxNiArMTY1MywxNSBAQAogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CiAJaW50IHJjOwogCi0JcmMgPSByZXF1ZXN0X2lycShycC0+cGRldi0+aXJxLCByaGluZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsCi0JCQlkZXYpOworCXJjID0gcmVxdWVzdF9pcnEocnAtPmlycSwgcmhpbmVfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JbmV0aWZfZGJnKHJwLCBpZnVwLCBkZXYsICIlcygpIGlycSAlZFxuIiwgX19mdW5jX18sIHJwLT5wZGV2LT5pcnEpOworCW5ldGlmX2RiZyhycCwgaWZ1cCwgZGV2LCAiJXMoKSBpcnEgJWRcbiIsIF9fZnVuY19fLCBycC0+aXJxKTsKIAogCXJjID0gYWxsb2NfcmluZyhkZXYpOwogCWlmIChyYykgewotCQlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCQlmcmVlX2lycShycC0+aXJxLCBkZXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCWFsbG9jX3JidWZzKGRldik7CkBAIC0xNjU5LDYgKzE3MzAsNyBAQAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2UgKmh3ZGV2ID0gZGV2LT5kZXYucGFyZW50OwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CiAJdW5zaWduZWQgZW50cnk7CiAKQEAgLTE2OTUsOSArMTc2Nyw5IEBACiAJCQkJCQkgICAgICAgcnAtPnR4X2J1ZnMpKTsKIAl9IGVsc2UgewogCQlycC0+dHhfc2tidWZmX2RtYVtlbnRyeV0gPQotCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnJwLT5wZGV2LT5kZXYsIHJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSkpIHsKKwkJCWRtYV9tYXBfc2luZ2xlKGh3ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGh3ZGV2LCBycC0+dHhfc2tidWZmX2RtYVtlbnRyeV0pKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldID0gMDsKIAkJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwpAQCAtMTc4OCw2ICsxODYwLDcgQEAKIHN0YXRpYyB2b2lkIHJoaW5lX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpod2RldiA9IGRldi0+ZGV2LnBhcmVudDsKIAlpbnQgdHhzdGF0dXMgPSAwLCBlbnRyeSA9IHJwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKIAogCS8qIGZpbmQgYW5kIGNsZWFudXAgZGlydHkgdHggZGVzY3JpcHRvcnMgKi8KQEAgLTE4MzEsMTAgKzE5MDQsMTAgQEAKIAkJfQogCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCiAJCWlmIChycC0+dHhfc2tidWZmX2RtYVtlbnRyeV0pIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQlkbWFfdW5tYXBfc2luZ2xlKGh3ZGV2LAogCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldLAogCQkJCQkgcnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKLQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkgRE1BX1RPX0RFVklDRSk7CiAJCX0KIAkJZGV2X2NvbnN1bWVfc2tiX2FueShycC0+dHhfc2tidWZmW2VudHJ5XSk7CiAJCXJwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKQEAgLTE4NjMsNiArMTkzNiw3IEBACiBzdGF0aWMgaW50IHJoaW5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsaW1pdCkKIHsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2UgKmh3ZGV2ID0gZGV2LT5kZXYucGFyZW50OwogCWludCBjb3VudDsKIAlpbnQgZW50cnkgPSBycC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOwogCkBAIC0xOTI0LDE5ICsxOTk4LDE5IEBACiAJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhaykKIAkJCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKGRldiwgcGt0X2xlbik7CiAJCQlpZiAoc2tiKSB7Ci0JCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHJwLT5wZGV2LAotCQkJCQkJCSAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCi0JCQkJCQkJICAgIHJwLT5yeF9idWZfc3osCi0JCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaHdkZXYsCisJCQkJCQkJcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCXJwLT5yeF9idWZfc3osCisJCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKIAogCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKIAkJCQkJCSBycC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKIAkJCQkJCSBwa3RfbGVuKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7Ci0JCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJwLT5wZGV2LAotCQkJCQkJCSAgICAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCi0JCQkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCi0JCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaHdkZXYsCisJCQkJCQkJICAgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCSAgIHJwLT5yeF9idWZfc3osCisJCQkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKIAkJCX0gZWxzZSB7CiAJCQkJc2tiID0gcnAtPnJ4X3NrYnVmZltlbnRyeV07CiAJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CkBAIC0xOTQ1LDEwICsyMDE5LDEwIEBACiAJCQkJfQogCQkJCXJwLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7Ci0JCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGh3ZGV2LAogCQkJCQkJIHJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSwKIAkJCQkJCSBycC0+cnhfYnVmX3N6LAotCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKIAkJCX0KIAogCQkJaWYgKHVubGlrZWx5KGRlc2NfbGVuZ3RoICYgRGVzY1RhZykpCkBAIC0xOTc5LDEwICsyMDUzLDExIEBACiAJCQlpZiAoc2tiID09IE5VTEwpCiAJCQkJYnJlYWs7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCiAJCQlycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0gPQotCQkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJZG1hX21hcF9zaW5nbGUoaHdkZXYsIHNrYi0+ZGF0YSwKIAkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCi0JCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZycC0+cGRldi0+ZGV2LCBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0pKSB7CisJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGh3ZGV2LAorCQkJCQkgICAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0pKSB7CiAJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCXJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSA9IDA7CiAJCQkJYnJlYWs7CkBAIC0yMTAzLDcgKzIxNzgsNyBAQAogCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLwogCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CiAJCWlvd3JpdGUzMigweGZmZmZmZmZmLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKLQl9IGVsc2UgaWYgKHJwLT5wZGV2LT5yZXZpc2lvbiA+PSBWVDYxMDVNKSB7CisJfSBlbHNlIGlmIChycC0+cXVpcmtzICYgcnFNZ210KSB7CiAJCWludCBpID0gMDsKIAkJdTMyIG1DQU1tYXNrID0gMDsJLyogMzIgbUNBTXMgKDYxMDVNIGFuZCBiZXR0ZXIpICovCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKQEAgLTIxMjUsNyArMjIwMCw3IEBACiAJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjEpOwogCX0KIAkvKiBlbmFibGUvZGlzYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCi0JaWYgKHJwLT5wZGV2LT5yZXZpc2lvbiA+PSBWVDYxMDVNKSB7CisJaWYgKHJwLT5xdWlya3MgJiBycU1nbXQpIHsKIAkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJCUJZVEVfUkVHX0JJVFNfT0ZGKEJDUjFfVklERlIsIGlvYWRkciArIFBDSUJ1c0NvbmZpZzEpOwogCQllbHNlCkBAIC0yMTM2LDExICsyMjExLDExIEBACiAKIHN0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHJwLT5wZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgZGV2X25hbWUoaHdkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQpAQCAtMjI3Nyw3ICsyMzUyLDcgQEAKIAkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KIAlpb3dyaXRlMTYoQ21kU3RvcCwgaW9hZGRyICsgQ2hpcENtZCk7CiAKLQlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCWZyZWVfaXJxKHJwLT5pcnEsIGRldik7CiAJZnJlZV9yYnVmcyhkZXYpOwogCWZyZWVfdGJ1ZnMoZGV2KTsKIAlmcmVlX3JpbmcoZGV2KTsKQEAgLTIyODYsNyArMjM2MSw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgcmhpbmVfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHJoaW5lX3JlbW92ZV9vbmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTIzMDAsNyArMjM3NSwyMSBAQAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgcmhpbmVfc2h1dGRvd24gKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCByaGluZV9yZW1vdmVfb25lX3BsYXRmb3JtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJaW91bm1hcChycC0+YmFzZSk7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yMzU0LDggKzI0NDMsNyBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCByaGluZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCkBAIC0yMzY3LDIzICsyNDU1LDIxIEBACiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAKLQlyaGluZV9zaHV0ZG93bihwZGV2KTsKKwlpZiAoZGV2X2lzX3BjaShkZXZpY2UpKQorCQlyaGluZV9zaHV0ZG93bl9wY2kodG9fcGNpX2RldihkZXZpY2UpKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJoaW5lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIFVTRV9NTUlPCiAJZW5hYmxlX21taW8ocnAtPnBpb2FkZHIsIHJwLT5xdWlya3MpOwotI2VuZGlmCiAJcmhpbmVfcG93ZXJfaW5pdChkZXYpOwogCWZyZWVfdGJ1ZnMoZGV2KTsKIAlmcmVlX3JidWZzKGRldik7CkBAIC0yNDA4LDE1ICsyNDk0LDI2IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciByaGluZV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcmhpbmVfZHJpdmVyX3BjaSA9IHsKIAkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSByaGluZV9wY2lfdGJsLAotCS5wcm9iZQkJPSByaGluZV9pbml0X29uZSwKLQkucmVtb3ZlCQk9IHJoaW5lX3JlbW92ZV9vbmUsCi0JLnNodXRkb3duCT0gcmhpbmVfc2h1dGRvd24sCisJLnByb2JlCQk9IHJoaW5lX2luaXRfb25lX3BjaSwKKwkucmVtb3ZlCQk9IHJoaW5lX3JlbW92ZV9vbmVfcGNpLAorCS5zaHV0ZG93bgk9IHJoaW5lX3NodXRkb3duX3BjaSwKIAkuZHJpdmVyLnBtCT0gUkhJTkVfUE1fT1BTLAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmhpbmVfZHJpdmVyX3BsYXRmb3JtID0geworCS5wcm9iZQkJPSByaGluZV9pbml0X29uZV9wbGF0Zm9ybSwKKwkucmVtb3ZlCQk9IHJoaW5lX3JlbW92ZV9vbmVfcGxhdGZvcm0sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHJoaW5lX29mX3RibCwKKwkJLnBtCQk9IFJISU5FX1BNX09QUywKKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgcmhpbmVfZG1pX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKIAl7CiAJCS5pZGVudCA9ICJFUElBLU0iLApAQCAtMjQzNyw2ICsyNTM0LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgcmhpbmVfaW5pdCh2b2lkKQogeworCWludCByZXRfcGNpLCByZXRfcGxhdGZvcm07CisKIC8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLwogI2lmZGVmIE1PRFVMRQogCXByX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKQEAgLTI0NDksMTMgKzI1NDgsMTkgQEAKIAllbHNlIGlmIChhdm9pZF9EMykKIAkJcHJfaW5mbygiYXZvaWRfRDMgc2V0XG4iKTsKIAotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZyaGluZV9kcml2ZXIpOworCXJldF9wY2kgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZyaGluZV9kcml2ZXJfcGNpKTsKKwlyZXRfcGxhdGZvcm0gPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJoaW5lX2RyaXZlcl9wbGF0Zm9ybSk7CisJaWYgKChyZXRfcGNpIDwgMCkgJiYgKHJldF9wbGF0Zm9ybSA8IDApKQorCQlyZXR1cm4gcmV0X3BjaTsKKworCXJldHVybiAwOwogfQogCiAKIHN0YXRpYyB2b2lkIF9fZXhpdCByaGluZV9jbGVhbnVwKHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZyaGluZV9kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyaGluZV9kcml2ZXJfcGxhdGZvcm0pOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcmhpbmVfZHJpdmVyX3BjaSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMKaW5kZXggZmExOTNjNC4uNGVmODE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jCkBAIC03NSw3ICs3NSw3IEBACiAJbG9uZyBlbmQgPSBqaWZmaWVzICsgMjsKIAogCXdoaWxlICghKHRlbWFjX2lvcihscCwgWFRFX1JEWTBfT0ZGU0VUKSAmIFhURV9SRFkwX0hBUkRfQUNTX1JEWV9NQVNLKSkgewotCQlpZiAoZW5kIC0gamlmZmllcyA8PSAwKSB7CisJCWlmICh0aW1lX2JlZm9yZV9lcShlbmQsIGppZmZpZXMpKSB7CiAJCQlXQVJOX09OKDEpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWRpby5jCmluZGV4IDY0YjQ2MzkuLmQ0YWJmNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21kaW8uYwpAQCAtMjIsNyArMjIsNyBAQAogCWxvbmcgZW5kID0gamlmZmllcyArIDI7CiAJd2hpbGUgKCEoYXhpZW5ldF9pb3IobHAsIFhBRV9NRElPX01DUl9PRkZTRVQpICYKIAkJIFhBRV9NRElPX01DUl9SRUFEWV9NQVNLKSkgewotCQlpZiAoZW5kIC0gamlmZmllcyA8PSAwKSB7CisJCWlmICh0aW1lX2JlZm9yZV9lcShlbmQsIGppZmZpZXMpKSB7CiAJCQlXQVJOX09OKDEpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYwppbmRleCAwZDg3YzY3Li44YzRhZWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCkBAIC03MDIsNyArNzAyLDcgQEAKIAkqLwogCXdoaWxlIChfX3Jhd19yZWFkbChscC0+YmFzZV9hZGRyICsgWEVMX01ESU9DVFJMX09GRlNFVCkgJgogCQkJWEVMX01ESU9DVFJMX01ESU9TVFNfTUFTSykgewotCQlpZiAoZW5kIC0gamlmZmllcyA8PSAwKSB7CisJCWlmICh0aW1lX2JlZm9yZV9lcShlbmQsIGppZmZpZXMpKSB7CiAJCQlXQVJOX09OKDEpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmggYi9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCmluZGV4IGQxOGY3MTFkLi42Y2MzN2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKQEAgLTI4LDUwICsyOCwxMTkgQEAKICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KICNpbmNsdWRlIDxsaW51eC9ybmRpcy5oPgogCi0vKiBGd2QgZGVjbGFyYXRpb24gKi8KLXN0cnVjdCBodl9uZXR2c2NfcGFja2V0Owotc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm87CisvKiBSU1MgcmVsYXRlZCAqLworI2RlZmluZSBPSURfR0VOX1JFQ0VJVkVfU0NBTEVfQ0FQQUJJTElUSUVTIDB4MDAwMTAyMDMgIC8qIHF1ZXJ5IG9ubHkgKi8KKyNkZWZpbmUgT0lEX0dFTl9SRUNFSVZFX1NDQUxFX1BBUkFNRVRFUlMgMHgwMDAxMDIwNCAgLyogcXVlcnkgYW5kIHNldCAqLwogCi0vKiBSZXByZXNlbnQgdGhlIHhmZXIgcGFnZSBwYWNrZXQgd2hpY2ggY29udGFpbnMgMSBvciBtb3JlIG5ldHZzYyBwYWNrZXQgKi8KLXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnQ7Ci0JdTMyIHN0YXR1czsKKyNkZWZpbmUgTkRJU19PQkpFQ1RfVFlQRV9SU1NfQ0FQQUJJTElUSUVTIDB4ODgKKyNkZWZpbmUgTkRJU19PQkpFQ1RfVFlQRV9SU1NfUEFSQU1FVEVSUyAweDg5CiAKLQkvKiAjIG9mIG5ldHZzYyBwYWNrZXRzIHRoaXMgeGZlciBwYWNrZXQgY29udGFpbnMgKi8KLQl1MzIgY291bnQ7CisjZGVmaW5lIE5ESVNfUkVDRUlWRV9TQ0FMRV9DQVBBQklMSVRJRVNfUkVWSVNJT05fMiAyCisjZGVmaW5lIE5ESVNfUkVDRUlWRV9TQ0FMRV9QQVJBTUVURVJTX1JFVklTSU9OXzIgMgorCitzdHJ1Y3QgbmRpc19vYmpfaGVhZGVyIHsKKwl1OCB0eXBlOworCXU4IHJldjsKKwl1MTYgc2l6ZTsKK30gX19wYWNrZWQ7CisKKy8qIG5kaXNfcmVjdl9zY2FsZV9jYXAvY2FwX2ZsYWcgKi8KKyNkZWZpbmUgTkRJU19SU1NfQ0FQU19NRVNTQUdFX1NJR05BTEVEX0lOVEVSUlVQVFMgMHgwMTAwMDAwMAorI2RlZmluZSBORElTX1JTU19DQVBTX0NMQVNTSUZJQ0FUSU9OX0FUX0lTUiAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIE5ESVNfUlNTX0NBUFNfQ0xBU1NJRklDQVRJT05fQVRfRFBDICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgTkRJU19SU1NfQ0FQU19VU0lOR19NU0lfWCAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBORElTX1JTU19DQVBTX1JTU19BVkFJTEFCTEVfT05fUE9SVFMgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIE5ESVNfUlNTX0NBUFNfU1VQUE9SVFNfTVNJX1ggICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgTkRJU19SU1NfQ0FQU19IQVNIX1RZUEVfVENQX0lQVjQgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBORElTX1JTU19DQVBTX0hBU0hfVFlQRV9UQ1BfSVBWNiAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE5ESVNfUlNTX0NBUFNfSEFTSF9UWVBFX1RDUF9JUFY2X0VYICAgICAgIDB4MDAwMDA0MDAKKworc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9jYXAgeyAvKiBORElTX1JFQ0VJVkVfU0NBTEVfQ0FQQUJJTElUSUVTICovCisJc3RydWN0IG5kaXNfb2JqX2hlYWRlciBoZHI7CisJdTMyIGNhcF9mbGFnOworCXUzMiBudW1faW50X21zZzsKKwl1MzIgbnVtX3JlY3ZfcXVlOworCXUxNiBudW1faW5kaXJlY3RfdGFiZW50OworfSBfX3BhY2tlZDsKKworCisvKiBuZGlzX3JlY3Zfc2NhbGVfcGFyYW0gZmxhZ3MgKi8KKyNkZWZpbmUgTkRJU19SU1NfUEFSQU1fRkxBR19CQVNFX0NQVV9VTkNIQU5HRUQgICAgIDB4MDAwMQorI2RlZmluZSBORElTX1JTU19QQVJBTV9GTEFHX0hBU0hfSU5GT19VTkNIQU5HRUQgICAgMHgwMDAyCisjZGVmaW5lIE5ESVNfUlNTX1BBUkFNX0ZMQUdfSVRBQkxFX1VOQ0hBTkdFRCAgICAgICAweDAwMDQKKyNkZWZpbmUgTkRJU19SU1NfUEFSQU1fRkxBR19IQVNIX0tFWV9VTkNIQU5HRUQgICAgIDB4MDAwOAorI2RlZmluZSBORElTX1JTU19QQVJBTV9GTEFHX0RJU0FCTEVfUlNTICAgICAgICAgICAgMHgwMDEwCisKKy8qIEhhc2ggaW5mbyBiaXRzICovCisjZGVmaW5lIE5ESVNfSEFTSF9GVU5DX1RPRVBMSVRaIDB4MDAwMDAwMDEKKyNkZWZpbmUgTkRJU19IQVNIX0lQVjQgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBORElTX0hBU0hfVENQX0lQVjQgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE5ESVNfSEFTSF9JUFY2ICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTkRJU19IQVNIX0lQVjZfRVggICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBORElTX0hBU0hfVENQX0lQVjYgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE5ESVNfSEFTSF9UQ1BfSVBWNl9FWCAgIDB4MDAwMDIwMDAKKworI2RlZmluZSBORElTX1JTU19JTkRJUkVDVElPTl9UQUJMRV9NQVhfU0laRV9SRVZJU0lPTl8yICgxMjggKiA0KQorI2RlZmluZSBORElTX1JTU19IQVNIX1NFQ1JFVF9LRVlfTUFYX1NJWkVfUkVWSVNJT05fMiAgIDQwCisKKyNkZWZpbmUgSVRBQl9OVU0gMTI4CisjZGVmaW5lIEhBU0hfS0VZTEVOIE5ESVNfUlNTX0hBU0hfU0VDUkVUX0tFWV9NQVhfU0laRV9SRVZJU0lPTl8yCitleHRlcm4gdTggbmV0dnNjX2hhc2hfa2V5W107CisKK3N0cnVjdCBuZGlzX3JlY3Zfc2NhbGVfcGFyYW0geyAvKiBORElTX1JFQ0VJVkVfU0NBTEVfUEFSQU1FVEVSUyAqLworCXN0cnVjdCBuZGlzX29ial9oZWFkZXIgaGRyOworCisJLyogUXVhbGlmaWVzIHRoZSByZXN0IG9mIHRoZSBpbmZvcm1hdGlvbiAqLworCXUxNiBmbGFnOworCisJLyogVGhlIGJhc2UgQ1BVIG51bWJlciB0byBkbyByZWNlaXZlIHByb2Nlc3NpbmcuIG5vdCB1c2VkICovCisJdTE2IGJhc2VfY3B1X251bWJlcjsKKworCS8qIFRoaXMgZGVzY3JpYmVzIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCB0eXBlIGJlaW5nIGVuYWJsZWQgKi8KKwl1MzIgaGFzaGluZm87CisKKwkvKiBUaGUgc2l6ZSBvZiBpbmRpcmVjdGlvbiB0YWJsZSBhcnJheSAqLworCXUxNiBpbmRpcmVjdF90YWJzaXplOworCisJLyogVGhlIG9mZnNldCBvZiB0aGUgaW5kaXJlY3Rpb24gdGFibGUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKKwkgKiBzdHJ1Y3R1cmUKKwkgKi8KKwl1MzIgaW5kaXJlY3RfdGFib2Zmc2V0OworCisJLyogVGhlIHNpemUgb2YgdGhlIGhhc2ggc2VjcmV0IGtleSAqLworCXUxNiBoYXNoa2V5X3NpemU7CisKKwkvKiBUaGUgb2Zmc2V0IG9mIHRoZSBzZWNyZXQga2V5IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBrYXNoa2V5X29mZnNldDsKKworCXUzMiBwcm9jZXNzb3JfbWFza3Nfb2Zmc2V0OworCXUzMiBudW1fcHJvY2Vzc29yX21hc2tzOworCXUzMiBwcm9jZXNzb3JfbWFza3NfZW50cnlfc2l6ZTsKIH07CiAKKy8qIEZ3ZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm87CisKIC8qCiAgKiBSZXByZXNlbnQgbmV0dnNjIHBhY2tldCB3aGljaCBjb250YWlucyAxIFJORElTIGFuZCAxIGV0aGVybmV0IGZyYW1lCiAgKiB3aXRoaW4gdGhlIFJORElTCiAgKi8KIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0IHsKIAkvKiBCb29ra2VlcGluZyBzdHVmZiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnQ7CiAJdTMyIHN0YXR1czsKIAogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKIAlib29sIGlzX2RhdGFfcGt0OwogCXUxNiB2bGFuX3RjaTsKIAotCS8qCi0JICogVmFsaWQgb25seSBmb3IgcmVjZWl2ZXMgd2hlbiB3ZSBicmVhayBhIHhmZXIgcGFnZSBwYWNrZXQKLQkgKiBpbnRvIG11bHRpcGxlIG5ldHZzYyBwYWNrZXRzCi0JICovCi0Jc3RydWN0IHhmZXJwYWdlX3BhY2tldCAqeGZlcl9wYWdlX3BrdDsKKwl1MTYgcV9pZHg7CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7CiAKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1NjQgcmVjdl9jb21wbGV0aW9uX3RpZDsKLQkJCXZvaWQgKnJlY3ZfY29tcGxldGlvbl9jdHg7Ci0JCQl2b2lkICgqcmVjdl9jb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKLQkJfSByZWN2OwotCQlzdHJ1Y3QgewotCQkJdTY0IHNlbmRfY29tcGxldGlvbl90aWQ7Ci0JCQl2b2lkICpzZW5kX2NvbXBsZXRpb25fY3R4OwotCQkJdm9pZCAoKnNlbmRfY29tcGxldGlvbikodm9pZCAqY29udGV4dCk7Ci0JCX0gc2VuZDsKLQl9IGNvbXBsZXRpb247CisJdTY0IHNlbmRfY29tcGxldGlvbl90aWQ7CisJdm9pZCAqc2VuZF9jb21wbGV0aW9uX2N0eDsKKwl2b2lkICgqc2VuZF9jb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKKworCXUzMiBzZW5kX2J1Zl9pbmRleDsKIAogCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBtZW1vcnkgYWZ0ZXIgcGFnZV9idWYgKi8KIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwpAQCAtMTIwLDYgKzE4OSw3IEBACiBpbnQgbmV0dnNjX3JlY3ZfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiwKIAkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQsCiAJCQlzdHJ1Y3QgbmRpc190Y3BfaXBfY2hlY2tzdW1faW5mbyAqY3N1bV9pbmZvKTsKK3ZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCk7CiBpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIGludCBybmRpc19maWx0ZXJfY2xvc2Uoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIGludCBybmRpc19maWx0ZXJfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCkBAIC01MTQsMTQgKzU4NCwxNiBAQAogCiAjZGVmaW5lIE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFCQkoMTAyNCoxMDI0KjE2KQkvKiAxNk1CICovCiAjZGVmaW5lIE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFX0xFR0FDWQkoMTAyNCoxMDI0KjE1KSAgLyogMTVNQiAqLworI2RlZmluZSBORVRWU0NfU0VORF9CVUZGRVJfU0laRQkJCSgxMDI0ICogMTAyNCkgICAvKiAxTUIgKi8KKyNkZWZpbmUgTkVUVlNDX0lOVkFMSURfSU5ERVgJCQktMQorCiAKICNkZWZpbmUgTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lECQkweGNhZmUKIAotLyogUHJlYWxsb2NhdGVkIHJlY2VpdmUgcGFja2V0cyAqLwotI2RlZmluZSBORVRWU0NfUkVDRUlWRV9QQUNLRVRMSVNUX0NPVU5UCQkyNTYKLQogI2RlZmluZSBORVRWU0NfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMjA0OAogCisjZGVmaW5lIFZSU1NfU0VORF9UQUJfU0laRSAxNgorCiAvKiBQZXIgbmV0dnNjIGNoYW5uZWwtc3BlY2lmaWMgKi8KIHN0cnVjdCBuZXR2c2NfZGV2aWNlIHsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXY7CkBAIC01MzIsMTIgKzYwNCw2IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9kcmFpbjsKIAlib29sIHN0YXJ0X3JlbW92ZTsKIAlib29sIGRlc3Ryb3k7Ci0JLyoKLQkgKiBMaXN0IG9mIGZyZWUgcHJlYWxsb2NhdGVkIGh2X25ldHZzY19wYWNrZXQgdG8gcmVwcmVzZW50IHJlY2VpdmUKLQkgKiBwYWNrZXQKLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJlY3ZfcGt0X2xpc3Q7Ci0Jc3BpbmxvY2tfdCByZWN2X3BrdF9saXN0X2xvY2s7CiAKIAkvKiBSZWNlaXZlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdXMgYnV0IG1hbmFnZXMgYnkgTmV0VlNQICovCiAJdm9pZCAqcmVjdl9idWY7CkBAIC01NDYsNiArNjEyLDE1IEBACiAJdTMyIHJlY3Zfc2VjdGlvbl9jbnQ7CiAJc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uICpyZWN2X3NlY3Rpb247CiAKKwkvKiBTZW5kIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdXMgKi8KKwl2b2lkICpzZW5kX2J1ZjsKKwl1MzIgc2VuZF9idWZfc2l6ZTsKKwl1MzIgc2VuZF9idWZfZ3BhZGxfaGFuZGxlOworCXUzMiBzZW5kX3NlY3Rpb25fY250OworCXUzMiBzZW5kX3NlY3Rpb25fc2l6ZTsKKwl1bnNpZ25lZCBsb25nICpzZW5kX3NlY3Rpb25fbWFwOworCWludCBtYXBfd29yZHM7CisKIAkvKiBVc2VkIGZvciBOZXRWU1AgaW5pdGlhbGl6YXRpb24gcHJvdG9jb2wgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbiBjaGFubmVsX2luaXRfd2FpdDsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIGNoYW5uZWxfaW5pdF9wa3Q7CkBAIC01NTUsMTAgKzYzMCwyMCBAQAogCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2huX3RhYmxlW05SX0NQVVNdOworCXUzMiBzZW5kX3RhYmxlW1ZSU1NfU0VORF9UQUJfU0laRV07CisJdTMyIG51bV9jaG47CisJYXRvbWljX3QgcXVldWVfc2VuZHNbTlJfQ1BVU107CisKIAkvKiBIb2xkcyBybmRpcyBkZXZpY2UgaW5mbyAqLwogCXZvaWQgKmV4dGVuc2lvbjsKLQkvKiBUaGUgcmVjaXZlIGJ1ZmZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKworCWludCByaW5nX3NpemU7CisKKwkvKiBUaGUgcHJpbWFyeSBjaGFubmVsIGNhbGxiYWNrIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGNoYXIgY2JfYnVmZmVyW05FVFZTQ19QQUNLRVRfU0laRV07CisJLyogVGhlIHN1YiBjaGFubmVsIGNhbGxiYWNrIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKnN1Yl9jYl9idWY7CiB9OwogCiAvKiBOZGlzSW5pdGlhbGl6ZSBtZXNzYWdlICovCkBAIC03MDYsNiArNzkxLDcgQEAKIAlJRUVFXzgwMjFRX0lORk8sCiAJT1JJR0lOQUxfUEtUSU5GTywKIAlQQUNLRVRfQ0FOQ0VMX0lELAorCU5CTF9IQVNIX1ZBTFVFID0gUEFDS0VUX0NBTkNFTF9JRCwKIAlPUklHSU5BTF9ORVRfQlVGTElTVCwKIAlDQUNIRURfTkVUX0JVRkxJU1QsCiAJU0hPUlRfUEtUX1BBRElORk8sCkBAIC04NTIsNiArOTM4LDkgQEAKICNkZWZpbmUgTkRJU19MU09fUFBJX1NJWkUgKHNpemVvZihzdHJ1Y3Qgcm5kaXNfcGVyX3BhY2tldF9pbmZvKSArIFwKIAkJc2l6ZW9mKHN0cnVjdCBuZGlzX3RjcF9sc29faW5mbykpCiAKKyNkZWZpbmUgTkRJU19IQVNIX1BQSV9TSVpFIChzaXplb2Yoc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbykgKyBcCisJCXNpemVvZih1MzIpKQorCiAvKiBGb3JtYXQgb2YgSW5mb3JtYXRpb24gYnVmZmVyIHBhc3NlZCBpbiBhIFNldFJlcXVlc3QgZm9yIHRoZSBPSUQgKi8KIC8qIE9JRF9HRU5fUk5ESVNfQ09ORklHX1BBUkFNRVRFUi4gKi8KIHN0cnVjdCBybmRpc19jb25maWdfcGFyYW1ldGVyX2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCmluZGV4IGY3NjI5ZWMuLmMwNDFmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYworKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxhc20vc3luY19iaXRvcHMuaD4KIAogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIApAQCAtODAsNyArODEsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgbmV0dnNjX2Rlc3Ryb3lfcmVjdl9idWYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VfcGFja2V0OwogCWludCByZXQgPSAwOwpAQCAtMTQ2LDEwICsxNDcsNjIgQEAKIAkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uID0gTlVMTDsKIAl9CiAKKwkvKiBEZWFsIHdpdGggdGhlIHNlbmQgYnVmZmVyIHdlIG1heSBoYXZlIHNldHVwLgorCSAqIElmIHdlIGdvdCBhICBzZW5kIHNlY3Rpb24gc2l6ZSwgaXQgbWVhbnMgd2UgcmVjZWl2ZWQgYQorCSAqIFNlbmRzZW5kQnVmZmVyQ29tcGxldGUgbXNnIChpZSBzZW50CisJICogTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyIG1zZykgdGhlcmVmb3JlLCB3ZSBuZWVkCisJICogdG8gc2VuZCBhIHJldm9rZSBtc2cgaGVyZQorCSAqLworCWlmIChuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSkgeworCQkvKiBTZW5kIHRoZSByZXZva2UgcmVjZWl2ZSBidWZmZXIgKi8KKwkJcmV2b2tlX3BhY2tldCA9ICZuZXRfZGV2aWNlLT5yZXZva2VfcGFja2V0OworCQltZW1zZXQocmV2b2tlX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKworCQlyZXZva2VfcGFja2V0LT5oZHIubXNnX3R5cGUgPQorCQkJTlZTUF9NU0cxX1RZUEVfUkVWT0tFX1NFTkRfQlVGOworCQlyZXZva2VfcGFja2V0LT5tc2cudjFfbXNnLnJldm9rZV9yZWN2X2J1Zi5pZCA9IDA7CisKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChuZXRfZGV2aWNlLT5kZXYtPmNoYW5uZWwsCisJCQkJICAgICAgIHJldm9rZV9wYWNrZXQsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmV2b2tlX3BhY2tldCwKKwkJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKKwkJLyogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZAorCQkgKiBoYXZlIGEgbGVhayByYXRoZXIgdGhhbiBjb250aW51ZSBhbmQgYSBidWdjaGsKKwkJICovCisJCWlmIChyZXQgIT0gMCkgeworCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgIgorCQkJCSAgICJyZXZva2Ugc2VuZCBidWZmZXIgdG8gbmV0dnNwXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJLyogVGVhcmRvd24gdGhlIGdwYWRsIG9uIHRoZSB2c3AgZW5kICovCisJaWYgKG5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZSkgeworCQlyZXQgPSB2bWJ1c190ZWFyZG93bl9ncGFkbChuZXRfZGV2aWNlLT5kZXYtPmNoYW5uZWwsCisJCQkJCSAgIG5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZSk7CisKKwkJLyogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZCBoYXZlIGEgbGVhaworCQkgKiByYXRoZXIgdGhhbiBjb250aW51ZSBhbmQgYSBidWdjaGsKKwkJICovCisJCWlmIChyZXQgIT0gMCkgeworCQkJbmV0ZGV2X2VycihuZGV2LAorCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gc2VuZCBidWZmZXIncyBncGFkbFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZSA9IDA7CisJfQorCWlmIChuZXRfZGV2aWNlLT5zZW5kX2J1ZikgeworCQkvKiBGcmVlIHVwIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW5ldF9kZXZpY2UtPnNlbmRfYnVmLAorCQkJICAgZ2V0X29yZGVyKG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUpKTsKKwkJbmV0X2RldmljZS0+c2VuZF9idWYgPSBOVUxMOworCX0KKwlrZnJlZShuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwKTsKKwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbmV0dnNjX2luaXRfcmVjdl9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfaW5pdF9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCWludCByZXQgPSAwOwogCWludCB0OwpAQCAtMjQ4LDEwICszMDEsOTAgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAorCS8qIE5vdyBzZXR1cCB0aGUgc2VuZCBidWZmZXIuCisJICovCisJbmV0X2RldmljZS0+c2VuZF9idWYgPQorCQkodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAorCQkJCQkgZ2V0X29yZGVyKG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUpKTsKKwlpZiAoIW5ldF9kZXZpY2UtPnNlbmRfYnVmKSB7CisJCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBzZW5kICIKKwkJCSAgICJidWZmZXIgb2Ygc2l6ZSAlZFxuIiwgbmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBFc3RhYmxpc2ggdGhlIGdwYWRsIGhhbmRsZSBmb3IgdGhpcyBidWZmZXIgb24gdGhpcworCSAqIGNoYW5uZWwuICBOb3RlOiBUaGlzIGNhbGwgdXNlcyB0aGUgdm1idXMgY29ubmVjdGlvbiByYXRoZXIKKwkgKiB0aGFuIHRoZSBjaGFubmVsIHRvIGVzdGFibGlzaCB0aGUgZ3BhZGwgaGFuZGxlLgorCSAqLworCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPnNlbmRfYnVmLAorCQkJCSAgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplLAorCQkJCSAgICAmbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJbmV0ZGV2X2VycihuZGV2LAorCQkJICAgInVuYWJsZSB0byBlc3RhYmxpc2ggc2VuZCBidWZmZXIncyBncGFkbFxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCisJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKKwltZW1zZXQoaW5pdF9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJaW5pdF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9IE5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUY7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuc2VuZF9yZWN2X2J1Zi5ncGFkbF9oYW5kbGUgPQorCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGU7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuc2VuZF9yZWN2X2J1Zi5pZCA9IDA7CisKKwkvKiBTZW5kIHRoZSBncGFkbCBub3RpZmljYXRpb24gcmVxdWVzdCAqLworCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBpbml0X3BhY2tldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdF9wYWNrZXQsCisJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAorCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOworCWlmIChyZXQgIT0gMCkgeworCQluZXRkZXZfZXJyKG5kZXYsCisJCQkgICAidW5hYmxlIHRvIHNlbmQgc2VuZCBidWZmZXIncyBncGFkbCB0byBuZXR2c3BcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3dhaXQsIDUqSFopOworCUJVR19PTih0ID09IDApOworCisJLyogQ2hlY2sgdGhlIHJlc3BvbnNlICovCisJaWYgKGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCSAgICBzZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnN0YXR1cyAhPSBOVlNQX1NUQVRfU1VDQ0VTUykgeworCQluZXRkZXZfZXJyKG5kZXYsICJVbmFibGUgdG8gY29tcGxldGUgc2VuZCBidWZmZXIgIgorCQkJICAgImluaXRpYWxpemF0aW9uIHdpdGggTmV0VnNwIC0gc3RhdHVzICVkXG4iLAorCQkJICAgaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCQkgICBzZW5kX3JlY3ZfYnVmX2NvbXBsZXRlLnN0YXR1cyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBQYXJzZSB0aGUgcmVzcG9uc2UgKi8KKwluZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSA9IGluaXRfcGFja2V0LT5tc2cuCisJCQkJdjFfbXNnLnNlbmRfc2VuZF9idWZfY29tcGxldGUuc2VjdGlvbl9zaXplOworCisJLyogU2VjdGlvbiBjb3VudCBpcyBzaW1wbHkgdGhlIHNpemUgZGl2aWRlZCBieSB0aGUgc2VjdGlvbiBzaXplLgorCSAqLworCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQgPQorCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplL25ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplOworCisJZGV2X2luZm8oJmRldmljZS0+ZGV2aWNlLCAiU2VuZCBzZWN0aW9uIHNpemU6ICVkLCBTZWN0aW9uIGNvdW50OiVkXG4iLAorCQkgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUsIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQpOworCisJLyogU2V0dXAgc3RhdGUgZm9yIG1hbmFnaW5nIHRoZSBzZW5kIGJ1ZmZlci4gKi8KKwluZXRfZGV2aWNlLT5tYXBfd29yZHMgPSBESVZfUk9VTkRfVVAobmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudCwKKwkJCQkJICAgICBCSVRTX1BFUl9MT05HKTsKKworCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXAgPQorCQlremFsbG9jKG5ldF9kZXZpY2UtPm1hcF93b3JkcyAqIHNpemVvZih1bG9uZyksIEdGUF9LRVJORUwpOworCWlmIChuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwID09IE5VTEwpCisJCWdvdG8gY2xlYW51cDsKKwogCWdvdG8gZXhpdDsKIAogY2xlYW51cDoKLQluZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihuZXRfZGV2aWNlKTsKKwluZXR2c2NfZGVzdHJveV9idWYobmV0X2RldmljZSk7CiAKIGV4aXQ6CiAJcmV0dXJuIHJldDsKQEAgLTM2OSw4ICs1MDIsOSBAQAogCQluZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplID0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX1NJWkVfTEVHQUNZOwogCWVsc2UKIAkJbmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFOworCW5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPSBORVRWU0NfU0VORF9CVUZGRVJfU0laRTsKIAotCXJldCA9IG5ldHZzY19pbml0X3JlY3ZfYnVmKGRldmljZSk7CisJcmV0ID0gbmV0dnNjX2luaXRfYnVmKGRldmljZSk7CiAKIGNsZWFudXA6CiAJcmV0dXJuIHJldDsKQEAgLTM3OCw3ICs1MTIsNyBAQAogCiBzdGF0aWMgdm9pZCBuZXR2c2NfZGlzY29ubmVjdF92c3Aoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpCiB7Ci0JbmV0dnNjX2Rlc3Ryb3lfcmVjdl9idWYobmV0X2RldmljZSk7CisJbmV0dnNjX2Rlc3Ryb3lfYnVmKG5ldF9kZXZpY2UpOwogfQogCiAvKgpAQCAtMzg3LDcgKzUyMSw2IEBACiBpbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NfcGFja2V0LCAqcG9zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKQEAgLTQxNiwxMSArNTQ5LDggQEAKIAl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwogCiAJLyogUmVsZWFzZSBhbGwgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5ldHZzY19wYWNrZXQsIHBvcywKLQkJCQkgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QsIGxpc3RfZW50KSB7Ci0JCWxpc3RfZGVsKCZuZXR2c2NfcGFja2V0LT5saXN0X2VudCk7Ci0JCWtmcmVlKG5ldHZzY19wYWNrZXQpOwotCX0KKwlpZiAobmV0X2RldmljZS0+c3ViX2NiX2J1ZikKKwkJdmZyZWUobmV0X2RldmljZS0+c3ViX2NiX2J1Zik7CiAKIAlrZnJlZShuZXRfZGV2aWNlKTsKIAlyZXR1cm4gMDsKQEAgLTQ0NCw2ICs1NzQsMTIgQEAKIAlyZXR1cm4gYXZhaWxfd3JpdGUgKiAxMDAgLyByaW5nX2luZm8tPnJpbmdfZGF0YXNpemU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR2c2NfZnJlZV9zZW5kX3Nsb3Qoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCisJCQkJCSB1MzIgaW5kZXgpCit7CisJc3luY19jaGFuZ2VfYml0KGluZGV4LCBuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwKTsKK30KKwogc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfY29tcGxldGlvbihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCQkgICBzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKQEAgLTQ1MSw2ICs1ODcsNyBAQAogCXN0cnVjdCBudnNwX21lc3NhZ2UgKm52c3BfcGFja2V0OwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwl1MzIgc2VuZF9pbmRleDsKIAogCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCkBAIC00NjEsNyArNTk4LDkgQEAKIAkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KIAkgICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUkVDVl9CVUZfQ09NUExFVEUpIHx8CiAJICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JICAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1NFTkRfQlVGX0NPTVBMRVRFKSkgeworCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSkgfHwKKwkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KKwkgICAgIE5WU1BfTVNHNV9UWVBFX1NVQkNIQU5ORUwpKSB7CiAJCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KIAkJbWVtY3B5KCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0LCBudnNwX3BhY2tldCwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CkBAIC00NjksMjggKzYwOCwzOSBAQAogCX0gZWxzZSBpZiAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQogCQkgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURSkgewogCQlpbnQgbnVtX291dHN0YW5kaW5nX3NlbmRzOworCQl1MTYgcV9pZHggPSAwOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGRldmljZS0+Y2hhbm5lbDsKKwkJaW50IHF1ZXVlX3NlbmRzOwogCiAJCS8qIEdldCB0aGUgc2VuZCBjb250ZXh0ICovCiAJCW52c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopKHVuc2lnbmVkIGxvbmcpCiAJCQlwYWNrZXQtPnRyYW5zX2lkOwogCiAJCS8qIE5vdGlmeSB0aGUgbGF5ZXIgYWJvdmUgdXMgKi8KLQkJaWYgKG52c2NfcGFja2V0KQotCQkJbnZzY19wYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb24oCi0JCQkJbnZzY19wYWNrZXQtPmNvbXBsZXRpb24uc2VuZC4KLQkJCQlzZW5kX2NvbXBsZXRpb25fY3R4KTsKKwkJaWYgKG52c2NfcGFja2V0KSB7CisJCQlzZW5kX2luZGV4ID0gbnZzY19wYWNrZXQtPnNlbmRfYnVmX2luZGV4OworCQkJaWYgKHNlbmRfaW5kZXggIT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpCisJCQkJbmV0dnNjX2ZyZWVfc2VuZF9zbG90KG5ldF9kZXZpY2UsIHNlbmRfaW5kZXgpOworCQkJcV9pZHggPSBudnNjX3BhY2tldC0+cV9pZHg7CisJCQljaGFubmVsID0gbnZzY19wYWNrZXQtPmNoYW5uZWw7CisJCQludnNjX3BhY2tldC0+c2VuZF9jb21wbGV0aW9uKG52c2NfcGFja2V0LT4KKwkJCQkJCSAgICAgc2VuZF9jb21wbGV0aW9uX2N0eCk7CisJCX0KIAogCQludW1fb3V0c3RhbmRpbmdfc2VuZHMgPQogCQkJYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CisJCXF1ZXVlX3NlbmRzID0gYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPgorCQkJCQkJcXVldWVfc2VuZHNbcV9pZHhdKTsKIAogCQlpZiAobmV0X2RldmljZS0+ZGVzdHJveSAmJiBudW1fb3V0c3RhbmRpbmdfc2VuZHMgPT0gMCkKIAkJCXdha2VfdXAoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOwogCi0JCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpICYmICFuZXRfZGV2aWNlLT5zdGFydF9yZW1vdmUgJiYKLQkJCShodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmRldmljZS0+Y2hhbm5lbC0+b3V0Ym91bmQpCi0JCQk+IFJJTkdfQVZBSUxfUEVSQ0VOVF9ISVdBVEVSIHx8Ci0JCQludW1fb3V0c3RhbmRpbmdfc2VuZHMgPCAxKSkKLQkJCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHFfaWR4KSkgJiYKKwkJICAgICFuZXRfZGV2aWNlLT5zdGFydF9yZW1vdmUgJiYKKwkJICAgIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmNoYW5uZWwtPm91dGJvdW5kKSA+CisJCSAgICAgUklOR19BVkFJTF9QRVJDRU5UX0hJV0FURVIgfHwgcXVldWVfc2VuZHMgPCAxKSkKKwkJCQluZXRpZl90eF93YWtlX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoCisJCQkJCQkgICAgbmRldiwgcV9pZHgpKTsKIAl9IGVsc2UgewogCQluZXRkZXZfZXJyKG5kZXYsICJVbmtub3duIHNlbmQgY29tcGxldGlvbiBwYWNrZXQgdHlwZS0gIgogCQkJICAgIiVkIHJlY2VpdmVkISFcbiIsIG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUpOwpAQCAtNDk4LDYgKzY0OCw1MiBAQAogCiB9CiAKK3N0YXRpYyB1MzIgbmV0dnNjX2dldF9uZXh0X3NlbmRfc2VjdGlvbihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXUzMiBtYXhfd29yZHMgPSBuZXRfZGV2aWNlLT5tYXBfd29yZHM7CisJdW5zaWduZWQgbG9uZyAqbWFwX2FkZHIgPSAodW5zaWduZWQgbG9uZyAqKW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXA7CisJdTMyIHNlY3Rpb25fY250ID0gbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudDsKKwlpbnQgcmV0X3ZhbCA9IE5FVFZTQ19JTlZBTElEX0lOREVYOworCWludCBpOworCWludCBwcmV2X3ZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfd29yZHM7IGkrKykgeworCQlpZiAoIX4obWFwX2FkZHJbaV0pKQorCQkJY29udGludWU7CisJCWluZGV4ID0gZmZ6KG1hcF9hZGRyW2ldKTsKKwkJcHJldl92YWwgPSBzeW5jX3Rlc3RfYW5kX3NldF9iaXQoaW5kZXgsICZtYXBfYWRkcltpXSk7CisJCWlmIChwcmV2X3ZhbCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGluZGV4ICsgKGkgKiBCSVRTX1BFUl9MT05HKSkgPj0gc2VjdGlvbl9jbnQpCisJCQlicmVhazsKKwkJcmV0X3ZhbCA9IChpbmRleCArIChpICogQklUU19QRVJfTE9ORykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3UzMiBuZXR2c2NfY29weV90b19zZW5kX2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleCwKKwkJCSAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KQoreworCWNoYXIgKnN0YXJ0ID0gbmV0X2RldmljZS0+c2VuZF9idWY7CisJY2hhciAqZGVzdCA9IChzdGFydCArIChzZWN0aW9uX2luZGV4ICogbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUpKTsKKwlpbnQgaTsKKwl1MzIgbXNnX3NpemUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+cGFnZV9idWZfY250OyBpKyspIHsKKwkJY2hhciAqc3JjID0gcGh5c190b192aXJ0KHBhY2tldC0+cGFnZV9idWZbaV0ucGZuIDw8IFBBR0VfU0hJRlQpOworCQl1MzIgb2Zmc2V0ID0gcGFja2V0LT5wYWdlX2J1ZltpXS5vZmZzZXQ7CisJCXUzMiBsZW4gPSBwYWNrZXQtPnBhZ2VfYnVmW2ldLmxlbjsKKworCQltZW1jcHkoZGVzdCwgKHNyYyArIG9mZnNldCksIGxlbik7CisJCW1zZ19zaXplICs9IGxlbjsKKwkJZGVzdCArPSBsZW47CisJfQorCXJldHVybiBtc2dfc2l6ZTsKK30KKwogaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKIAkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpCiB7CkBAIC01MDUsNyArNzAxLDEyIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG52c3BfbWVzc2FnZSBzZW5kTWVzc2FnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqb3V0X2NoYW5uZWwgPSBOVUxMOwogCXU2NCByZXFfaWQ7CisJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXggPSBORVRWU0NfSU5WQUxJRF9JTkRFWDsKKwl1MzIgbXNnX3NpemUgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisKIAogCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwogCWlmICghbmV0X2RldmljZSkKQEAgLTUyMSwyNSArNzIyLDQ2IEBACiAJCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3QuY2hhbm5lbF90eXBlID0gMTsKIAl9CiAKLQkvKiBOb3QgdXNpbmcgc2VuZCBidWZmZXIgc2VjdGlvbiAqLwotCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3Quc2VuZF9idWZfc2VjdGlvbl9pbmRleCA9Ci0JCTB4RkZGRkZGRkY7Ci0Jc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX3NpemUgPSAwOworCS8qIEF0dGVtcHQgdG8gc2VuZCB2aWEgc2VuZGJ1ZiAqLworCWlmIChwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuIDwgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUpIHsKKwkJc2VjdGlvbl9pbmRleCA9IG5ldHZzY19nZXRfbmV4dF9zZW5kX3NlY3Rpb24obmV0X2RldmljZSk7CisJCWlmIChzZWN0aW9uX2luZGV4ICE9IE5FVFZTQ19JTlZBTElEX0lOREVYKSB7CisJCQltc2dfc2l6ZSA9IG5ldHZzY19jb3B5X3RvX3NlbmRfYnVmKG5ldF9kZXZpY2UsCisJCQkJCQkJICAgc2VjdGlvbl9pbmRleCwKKwkJCQkJCQkgICBwYWNrZXQpOworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopCisJCQkgICAgICAodW5zaWduZWQgbG9uZylwYWNrZXQtPnNlbmRfY29tcGxldGlvbl90aWQ7CisJCQlpZiAoc2tiKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlwYWNrZXQtPnBhZ2VfYnVmX2NudCA9IDA7CisJCX0KKwl9CisJcGFja2V0LT5zZW5kX2J1Zl9pbmRleCA9IHNlY3Rpb25faW5kZXg7CiAKLQlpZiAocGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uKQorCisJc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX2luZGV4ID0KKwkJc2VjdGlvbl9pbmRleDsKKwlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LnNlbmRfYnVmX3NlY3Rpb25fc2l6ZSA9IG1zZ19zaXplOworCisJaWYgKHBhY2tldC0+c2VuZF9jb21wbGV0aW9uKQogCQlyZXFfaWQgPSAodWxvbmcpcGFja2V0OwogCWVsc2UKIAkJcmVxX2lkID0gMDsKIAorCW91dF9jaGFubmVsID0gbmV0X2RldmljZS0+Y2huX3RhYmxlW3BhY2tldC0+cV9pZHhdOworCWlmIChvdXRfY2hhbm5lbCA9PSBOVUxMKQorCQlvdXRfY2hhbm5lbCA9IGRldmljZS0+Y2hhbm5lbDsKKwlwYWNrZXQtPmNoYW5uZWwgPSBvdXRfY2hhbm5lbDsKKwogCWlmIChwYWNrZXQtPnBhZ2VfYnVmX2NudCkgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIoZGV2aWNlLT5jaGFubmVsLAorCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIob3V0X2NoYW5uZWwsCiAJCQkJCQkgIHBhY2tldC0+cGFnZV9idWYsCiAJCQkJCQkgIHBhY2tldC0+cGFnZV9idWZfY250LAogCQkJCQkJICAmc2VuZE1lc3NhZ2UsCiAJCQkJCQkgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKIAkJCQkJCSAgcmVxX2lkKTsKIAl9IGVsc2UgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgJnNlbmRNZXNzYWdlLAorCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KG91dF9jaGFubmVsLCAmc2VuZE1lc3NhZ2UsCiAJCQkJc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAogCQkJCXJlcV9pZCwKIAkJCQlWTV9QS1RfREFUQV9JTkJBTkQsCkBAIC01NDgsMTcgKzc3MCwyNCBAQAogCiAJaWYgKHJldCA9PSAwKSB7CiAJCWF0b21pY19pbmMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7Ci0JCWlmIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmRldmljZS0+Y2hhbm5lbC0+b3V0Ym91bmQpIDwKKwkJYXRvbWljX2luYygmbmV0X2RldmljZS0+cXVldWVfc2VuZHNbcGFja2V0LT5xX2lkeF0pOworCisJCWlmIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJm91dF9jaGFubmVsLT5vdXRib3VuZCkgPAogCQkJUklOR19BVkFJTF9QRVJDRU5UX0xPV0FURVIpIHsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCQluZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoCisJCQkJCSAgICBuZGV2LCBwYWNrZXQtPnFfaWR4KSk7CisKIAkJCWlmIChhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+Ci0JCQkJbnVtX291dHN0YW5kaW5nX3NlbmRzKSA8IDEpCi0JCQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJCQlxdWV1ZV9zZW5kc1twYWNrZXQtPnFfaWR4XSkgPCAxKQorCQkJCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSgKKwkJCQkJCSAgICBuZGV2LCBwYWNrZXQtPnFfaWR4KSk7CiAJCX0KIAl9IGVsc2UgaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUobmRldik7Ci0JCWlmIChhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSA8IDEpIHsKLQkJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJCW5ldGlmX3R4X3N0b3BfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSgKKwkJCQkgICAgbmRldiwgcGFja2V0LT5xX2lkeCkpOworCQlpZiAoYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPnF1ZXVlX3NlbmRzW3BhY2tldC0+cV9pZHhdKSA8IDEpIHsKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSgKKwkJCQkJICAgIG5kZXYsIHBhY2tldC0+cV9pZHgpKTsKIAkJCXJldCA9IC1FTk9TUEM7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTcwLDYgKzc5OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAogCQkJCQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkLCB1MzIgc3RhdHVzKQogewpAQCAtNTg3LDcgKzgxNyw3IEBACiAKIHJldHJ5X3NlbmRfY21wbHQ6CiAJLyogU2VuZCB0aGUgY29tcGxldGlvbiAqLwotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCAmcmVjdmNvbXBNZXNzYWdlLAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgJnJlY3Zjb21wTWVzc2FnZSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksIHRyYW5zYWN0aW9uX2lkLAogCQkJICAgICAgIFZNX1BLVF9DT01QLCAwKTsKIAlpZiAocmV0ID09IDApIHsKQEAgLTYxMyw3NiArODQzLDIwIEBACiAJfQogfQogCi0vKiBTZW5kIGEgcmVjZWl2ZSBjb21wbGV0aW9uIHBhY2tldCB0byBSTkRJUyBkZXZpY2UgKGllIE5ldFZzcCkgKi8KLXN0YXRpYyB2b2lkIG5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24odm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0ID0gY29udGV4dDsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSBwYWNrZXQtPmRldmljZTsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKLQl1NjQgdHJhbnNhY3Rpb25faWQgPSAwOwotCWJvb2wgZnNlbmRfcmVjZWl2ZV9jb21wID0gZmFsc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQl1MzIgc3RhdHVzID0gTlZTUF9TVEFUX05PTkU7Ci0KLQkvKgotCSAqIEV2ZW4gdGhvdWdoIGl0IHNlZW1zIGxvZ2ljYWwgdG8gZG8gYSBHZXRPdXRib3VuZE5ldERldmljZSgpIGhlcmUgdG8KLQkgKiBzZW5kIG91dCByZWNlaXZlIGNvbXBsZXRpb24sIHdlIGFyZSB1c2luZyBHZXRJbmJvdW5kTmV0RGV2aWNlKCkKLQkgKiBzaW5jZSB3ZSBtYXkgaGF2ZSBkaXNhYmxlIG91dGJvdW5kIHRyYWZmaWMgYWxyZWFkeS4KLQkgKi8KLQluZXRfZGV2aWNlID0gZ2V0X2luYm91bmRfbmV0X2RldmljZShkZXZpY2UpOwotCWlmICghbmV0X2RldmljZSkKLQkJcmV0dXJuOwotCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwotCi0JLyogT3ZlcmxvYWRpbmcgdXNlIG9mIHRoZSBsb2NrLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChwYWNrZXQtPnN0YXR1cyAhPSBOVlNQX1NUQVRfU1VDQ0VTUykKLQkJcGFja2V0LT54ZmVyX3BhZ2VfcGt0LT5zdGF0dXMgPSBOVlNQX1NUQVRfRkFJTDsKLQotCXBhY2tldC0+eGZlcl9wYWdlX3BrdC0+Y291bnQtLTsKLQotCS8qCi0JICogTGFzdCBvbmUgaW4gdGhlIGxpbmUgdGhhdCByZXByZXNlbnQgMSB4ZmVyIHBhZ2UgcGFja2V0LgotCSAqIFJldHVybiB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYgdG8gdGhlIGZyZWVsaXN0Ci0JICovCi0JaWYgKHBhY2tldC0+eGZlcl9wYWdlX3BrdC0+Y291bnQgPT0gMCkgewotCQlmc2VuZF9yZWNlaXZlX2NvbXAgPSB0cnVlOwotCQl0cmFuc2FjdGlvbl9pZCA9IHBhY2tldC0+Y29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbl90aWQ7Ci0JCXN0YXR1cyA9IHBhY2tldC0+eGZlcl9wYWdlX3BrdC0+c3RhdHVzOwotCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmxpc3RfZW50LAotCQkJICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwotCi0JfQotCi0JLyogUHV0IHRoZSBwYWNrZXQgYmFjayAqLwotCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdF9lbnQsICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCS8qIFNlbmQgYSByZWNlaXZlIGNvbXBsZXRpb24gZm9yIHRoZSB4ZmVyIHBhZ2UgcGFja2V0ICovCi0JaWYgKGZzZW5kX3JlY2VpdmVfY29tcCkKLQkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwgbmV0X2RldmljZSwgdHJhbnNhY3Rpb25faWQsCi0JCQkJCXN0YXR1cyk7Ci0KLX0KLQogc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCisJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwKIAkJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKIAkJCXN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpCiB7CiAJc3RydWN0IHZtdHJhbnNmZXJfcGFnZV9wYWNrZXRfaGVhZGVyICp2bXhmZXJwYWdlX3BhY2tldDsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwX3BhY2tldDsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjX3BhY2tldCA9IE5VTEw7Ci0JLyogc3RydWN0IG5ldHZzY19kcml2ZXIgKm5ldHZzY0RyaXZlcjsgKi8KLQlzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICp4ZmVycGFnZV9wYWNrZXQgPSBOVUxMOworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0IG52X3BrdDsKKwlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjX3BhY2tldCA9ICZudl9wa3Q7CisJdTMyIHN0YXR1cyA9IE5WU1BfU1RBVF9TVUNDRVNTOwogCWludCBpOwogCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAotCUxJU1RfSEVBRChsaXN0SGVhZCk7Ci0KIAluZGV2ID0gbmV0X2RldmljZS0+bmRldjsKIAogCS8qCkBAIC03MTUsNzcgKzg4OSwxNCBAQAogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBHcmFiIGZyZWUgcGFja2V0cyAocmFuZ2UgY291bnQgKyAxKSB0byByZXByZXNlbnQgdGhpcyB4ZmVyCi0JICogcGFnZSBwYWNrZXQuICsxIHRvIHJlcHJlc2VudCB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYuCi0JICogV2UgZ3JhYiBpdCBoZXJlIHNvIHRoYXQgd2Uga25vdyBleGFjdGx5IGhvdyBtYW55IHdlIGNhbgotCSAqIGZ1bGZpbAotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpKSB7Ci0JCWxpc3RfbW92ZV90YWlsKG5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QubmV4dCwgJmxpc3RIZWFkKTsKLQkJaWYgKCsrY291bnQgPT0gdm14ZmVycGFnZV9wYWNrZXQtPnJhbmdlX2NudCArIDEpCi0JCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFdlIG5lZWQgYXQgbGVhc3QgMiBuZXR2c2MgcGt0cyAoMSB0byByZXByZXNlbnQgdGhlIHhmZXIKLQkgKiBwYWdlIGFuZCBhdCBsZWFzdCAxIGZvciB0aGUgcmFuZ2UpIGkuZS4gd2UgY2FuIGhhbmRsZWQKLQkgKiBzb21lIG9mIHRoZSB4ZmVyIHBhZ2UgcGFja2V0IHJhbmdlcy4uLgotCSAqLwotCWlmIChjb3VudCA8IDIpIHsKLQkJbmV0ZGV2X2VycihuZGV2LCAiR290IG9ubHkgJWQgbmV0dnNjIHBrdC4uLm5lZWRlZCAiCi0JCQkiJWQgcGt0cy4gRHJvcHBpbmcgdGhpcyB4ZmVyIHBhZ2UgcGFja2V0IGNvbXBsZXRlbHkhXG4iLAotCQkJY291bnQsIHZteGZlcnBhZ2VfcGFja2V0LT5yYW5nZV9jbnQgKyAxKTsKLQotCQkvKiBSZXR1cm4gaXQgdG8gdGhlIGZyZWVsaXN0ICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKLQkJZm9yIChpID0gY291bnQ7IGkgIT0gMDsgaS0tKSB7Ci0JCQlsaXN0X21vdmVfdGFpbChsaXN0SGVhZC5uZXh0LAotCQkJCSAgICAgICAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLAotCQkJCSAgICAgICBmbGFncyk7Ci0KLQkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwgbmV0X2RldmljZSwKLQkJCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkLAotCQkJCQkgICAgTlZTUF9TVEFUX0ZBSUwpOwotCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBSZW1vdmUgdGhlIDFzdCBwYWNrZXQgdG8gcmVwcmVzZW50IHRoZSB4ZmVyIHBhZ2UgcGFja2V0IGl0c2VsZiAqLwotCXhmZXJwYWdlX3BhY2tldCA9IChzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQlsaXN0X2RlbCgmeGZlcnBhZ2VfcGFja2V0LT5saXN0X2VudCk7Ci0JeGZlcnBhZ2VfcGFja2V0LT5zdGF0dXMgPSBOVlNQX1NUQVRfU1VDQ0VTUzsKLQotCS8qIFRoaXMgaXMgaG93IG11Y2ggd2UgY2FuIHNhdGlzZnkgKi8KLQl4ZmVycGFnZV9wYWNrZXQtPmNvdW50ID0gY291bnQgLSAxOwotCi0JaWYgKHhmZXJwYWdlX3BhY2tldC0+Y291bnQgIT0gdm14ZmVycGFnZV9wYWNrZXQtPnJhbmdlX2NudCkgewotCQluZXRkZXZfZXJyKG5kZXYsICJOZWVkZWQgJWQgbmV0dnNjIHBrdHMgdG8gc2F0aXNmeSAiCi0JCQkidGhpcyB4ZmVyIHBhZ2UuLi5nb3QgJWRcbiIsCi0JCQl2bXhmZXJwYWdlX3BhY2tldC0+cmFuZ2VfY250LCB4ZmVycGFnZV9wYWNrZXQtPmNvdW50KTsKLQl9CisJY291bnQgPSB2bXhmZXJwYWdlX3BhY2tldC0+cmFuZ2VfY250OworCW5ldHZzY19wYWNrZXQtPmRldmljZSA9IGRldmljZTsKKwluZXR2c2NfcGFja2V0LT5jaGFubmVsID0gY2hhbm5lbDsKIAogCS8qIEVhY2ggcmFuZ2UgcmVwcmVzZW50cyAxIFJORElTIHBrdCB0aGF0IGNvbnRhaW5zIDEgZXRoZXJuZXQgZnJhbWUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKGNvdW50IC0gMSk7IGkrKykgewotCQluZXR2c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQkJbGlzdF9kZWwoJm5ldHZzY19wYWNrZXQtPmxpc3RfZW50KTsKLQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCS8qIEluaXRpYWxpemUgdGhlIG5ldHZzYyBwYWNrZXQgKi8KIAkJbmV0dnNjX3BhY2tldC0+c3RhdHVzID0gTlZTUF9TVEFUX1NVQ0NFU1M7Ci0JCW5ldHZzY19wYWNrZXQtPnhmZXJfcGFnZV9wa3QgPSB4ZmVycGFnZV9wYWNrZXQ7Ci0JCW5ldHZzY19wYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb24gPQotCQkJCQluZXR2c2NfcmVjZWl2ZV9jb21wbGV0aW9uOwotCQluZXR2c2NfcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX2N0eCA9Ci0JCQkJCW5ldHZzY19wYWNrZXQ7Ci0JCW5ldHZzY19wYWNrZXQtPmRldmljZSA9IGRldmljZTsKLQkJLyogU2F2ZSB0aGlzIHNvIHRoYXQgd2UgY2FuIHNlbmQgaXQgYmFjayAqLwotCQluZXR2c2NfcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX3RpZCA9Ci0JCQkJCXZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkOwotCiAJCW5ldHZzY19wYWNrZXQtPmRhdGEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyluZXRfZGV2aWNlLT4KIAkJCXJlY3ZfYnVmICsgdm14ZmVycGFnZV9wYWNrZXQtPnJhbmdlc1tpXS5ieXRlX29mZnNldCk7CiAJCW5ldHZzY19wYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0KQEAgLTc5NCwxNiArOTA1LDUzIEBACiAJCS8qIFBhc3MgaXQgdG8gdGhlIHVwcGVyIGxheWVyICovCiAJCXJuZGlzX2ZpbHRlcl9yZWNlaXZlKGRldmljZSwgbmV0dnNjX3BhY2tldCk7CiAKLQkJbmV0dnNjX3JlY2VpdmVfY29tcGxldGlvbihuZXR2c2NfcGFja2V0LT4KLQkJCQljb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX2N0eCk7CisJCWlmIChuZXR2c2NfcGFja2V0LT5zdGF0dXMgIT0gTlZTUF9TVEFUX1NVQ0NFU1MpCisJCQlzdGF0dXMgPSBOVlNQX1NUQVRfRkFJTDsKIAl9CiAKKwluZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oZGV2aWNlLCBjaGFubmVsLCBuZXRfZGV2aWNlLAorCQkJCSAgICB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCwgc3RhdHVzKTsKIH0KIAotc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCkKKworc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfdGFibGUoc3RydWN0IGh2X2RldmljZSAqaGRldiwKKwkJCSAgICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICp2bXBrdCkKK3sKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZzY2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZzsKKwlpbnQgaTsKKwl1MzIgY291bnQsICp0YWI7CisKKwludnNjZGV2ID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoaGRldik7CisJaWYgKCFudnNjZGV2KQorCQlyZXR1cm47CisJbmRldiA9IG52c2NkZXYtPm5kZXY7CisKKwludm1zZyA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKXZtcGt0ICsKKwkJCQkJKHZtcGt0LT5vZmZzZXQ4IDw8IDMpKTsKKworCWlmIChudm1zZy0+aGRyLm1zZ190eXBlICE9IE5WU1BfTVNHNV9UWVBFX1NFTkRfSU5ESVJFQ1RJT05fVEFCTEUpCisJCXJldHVybjsKKworCWNvdW50ID0gbnZtc2ctPm1zZy52NV9tc2cuc2VuZF90YWJsZS5jb3VudDsKKwlpZiAoY291bnQgIT0gVlJTU19TRU5EX1RBQl9TSVpFKSB7CisJCW5ldGRldl9lcnIobmRldiwgIlJlY2VpdmVkIHdyb25nIHNlbmQtdGFibGUgc2l6ZToldVxuIiwgY291bnQpOworCQlyZXR1cm47CisJfQorCisJdGFiID0gKHUzMiAqKSgodW5zaWduZWQgbG9uZykmbnZtc2ctPm1zZy52NV9tc2cuc2VuZF90YWJsZSArCisJCSAgICAgIG52bXNnLT5tc2cudjVfbXNnLnNlbmRfdGFibGUub2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQludnNjZGV2LT5zZW5kX3RhYmxlW2ldID0gdGFiW2ldOworfQorCit2b2lkIG5ldHZzY19jaGFubmVsX2NiKHZvaWQgKmNvbnRleHQpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSBjb250ZXh0OworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsICopY29udGV4dDsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJdTMyIGJ5dGVzX3JlY3ZkOwogCXU2NCByZXF1ZXN0X2lkOwpAQCAtODEyLDE0ICs5NjAsMTkgQEAKIAlpbnQgYnVmZmVybGVuID0gTkVUVlNDX1BBQ0tFVF9TSVpFOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCisJaWYgKGNoYW5uZWwtPnByaW1hcnlfY2hhbm5lbCAhPSBOVUxMKQorCQlkZXZpY2UgPSBjaGFubmVsLT5wcmltYXJ5X2NoYW5uZWwtPmRldmljZV9vYmo7CisJZWxzZQorCQlkZXZpY2UgPSBjaGFubmVsLT5kZXZpY2Vfb2JqOworCiAJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAlpZiAoIW5ldF9kZXZpY2UpCiAJCXJldHVybjsKIAluZGV2ID0gbmV0X2RldmljZS0+bmRldjsKLQlidWZmZXIgPSBuZXRfZGV2aWNlLT5jYl9idWZmZXI7CisJYnVmZmVyID0gZ2V0X3Blcl9jaGFubmVsX3N0YXRlKGNoYW5uZWwpOwogCiAJZG8gewotCQlyZXQgPSB2bWJ1c19yZWN2cGFja2V0X3JhdyhkZXZpY2UtPmNoYW5uZWwsIGJ1ZmZlciwgYnVmZmVybGVuLAorCQlyZXQgPSB2bWJ1c19yZWN2cGFja2V0X3JhdyhjaGFubmVsLCBidWZmZXIsIGJ1ZmZlcmxlbiwKIAkJCQkJICAgJmJ5dGVzX3JlY3ZkLCAmcmVxdWVzdF9pZCk7CiAJCWlmIChyZXQgPT0gMCkgewogCQkJaWYgKGJ5dGVzX3JlY3ZkID4gMCkgewpAQCAtODMxLDggKzk4NCwxMiBAQAogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgVk1fUEtUX0RBVEFfVVNJTkdfWEZFUl9QQUdFUzoKLQkJCQkJbmV0dnNjX3JlY2VpdmUobmV0X2RldmljZSwKLQkJCQkJCQlkZXZpY2UsIGRlc2MpOworCQkJCQluZXR2c2NfcmVjZWl2ZShuZXRfZGV2aWNlLCBjaGFubmVsLAorCQkJCQkJICAgICAgIGRldmljZSwgZGVzYyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBWTV9QS1RfREFUQV9JTkJBTkQ6CisJCQkJCW5ldHZzY19zZW5kX3RhYmxlKGRldmljZSwgZGVzYyk7CiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKQEAgLTg4MCwxMSArMTAzNyw5IEBACiBpbnQgbmV0dnNjX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLCB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldCA9IDA7Ci0JaW50IGk7CiAJaW50IHJpbmdfc2l6ZSA9CiAJKChzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvICopYWRkaXRpb25hbF9pbmZvKS0+cmluZ19zaXplOwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQsICpwb3M7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAluZXRfZGV2aWNlID0gYWxsb2NfbmV0X2RldmljZShkZXZpY2UpOwpAQCAtODkzLDYgKzEwNDgsOCBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCisJbmV0X2RldmljZS0+cmluZ19zaXplID0gcmluZ19zaXplOworCiAJLyoKIAkgKiBDb21pbmcgaW50byB0aGlzIGZ1bmN0aW9uLCBzdHJ1Y3QgbmV0X2RldmljZSAqIGlzCiAJICogcmVnaXN0ZXJlZCBhcyB0aGUgZHJpdmVyIHByaXZhdGUgZGF0YS4KQEAgLTkwMywyNCArMTA2MCwxNCBAQAogCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTmV0VlNDIGNoYW5uZWwgZXh0ZW5zaW9uICovCi0Jc3Bpbl9sb2NrX2luaXQoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTkVUVlNDX1JFQ0VJVkVfUEFDS0VUTElTVF9DT1VOVDsgaSsrKSB7Ci0JCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFja2V0KQotCQkJYnJlYWs7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0X2VudCwKLQkJCSAgICAgICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0KTsKLQl9CiAJaW5pdF9jb21wbGV0aW9uKCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfd2FpdCk7CiAKKwlzZXRfcGVyX2NoYW5uZWxfc3RhdGUoZGV2aWNlLT5jaGFubmVsLCBuZXRfZGV2aWNlLT5jYl9idWZmZXIpOworCiAJLyogT3BlbiB0aGUgY2hhbm5lbCAqLwogCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLCByaW5nX3NpemUgKiBQQUdFX1NJWkUsCiAJCQkgcmluZ19zaXplICogUEFHRV9TSVpFLCBOVUxMLCAwLAotCQkJIG5ldHZzY19jaGFubmVsX2NiLCBkZXZpY2UpOworCQkJIG5ldHZzY19jaGFubmVsX2NiLCBkZXZpY2UtPmNoYW5uZWwpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBvcGVuIGNoYW5uZWw6ICVkXG4iLCByZXQpOwpAQCAtOTMwLDYgKzEwNzcsOCBAQAogCS8qIENoYW5uZWwgaXMgb3BlbmVkICovCiAJcHJfaW5mbygiaHZfbmV0dnNjIGNoYW5uZWwgb3BlbmVkIHN1Y2Nlc3NmdWxseVxuIik7CiAKKwluZXRfZGV2aWNlLT5jaG5fdGFibGVbMF0gPSBkZXZpY2UtPmNoYW5uZWw7CisKIAkvKiBDb25uZWN0IHdpdGggdGhlIE5ldFZzcCAqLwogCXJldCA9IG5ldHZzY19jb25uZWN0X3ZzcChkZXZpY2UpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtOTQ2LDE2ICsxMDk1LDggQEAKIAogY2xlYW51cDoKIAotCWlmIChuZXRfZGV2aWNlKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHBvcywKLQkJCQkJICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0LAotCQkJCQkgbGlzdF9lbnQpIHsKLQkJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3RfZW50KTsKLQkJCWtmcmVlKHBhY2tldCk7Ci0JCX0KLQorCWlmIChuZXRfZGV2aWNlKQogCQlrZnJlZShuZXRfZGV2aWNlKTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKaW5kZXggNzkxOGQ1MS4uNGZkNzFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYworKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQluZXRpZl9zdGFydF9xdWV1ZShuZXQpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMobmV0KTsKIAogCW52ZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlX29iaik7CiAJcmRldiA9IG52ZGV2LT5leHRlbnNpb247CkBAIC0xNDksMTUgKzE0OSwxMDAgQEAKIAlyZXR1cm4gcHBpOwogfQogCit1bmlvbiBzdWJfa2V5IHsKKwl1NjQgazsKKwlzdHJ1Y3QgeworCQl1OCBwYWRbM107CisJCXU4IGtiOworCQl1MzIga2E7CisJfTsKK307CisKKy8qIFRvZXBsaXR6IGhhc2ggZnVuY3Rpb24KKyAqIGRhdGE6IG5ldHdvcmsgYnl0ZSBvcmRlcgorICogcmV0dXJuOiBob3N0IGJ5dGUgb3JkZXIKKyAqLworc3RhdGljIHUzMiBjb21wX2hhc2godTggKmtleSwgaW50IGtsZW4sIHU4ICpkYXRhLCBpbnQgZGxlbikKK3sKKwl1bmlvbiBzdWJfa2V5IHN1Yms7CisJaW50IGtfbmV4dCA9IDQ7CisJdTggZHQ7CisJaW50IGksIGo7CisJdTMyIHJldCA9IDA7CisKKwlzdWJrLmsgPSAwOworCXN1Ymsua2EgPSBudG9obCgqKHUzMiAqKWtleSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGxlbjsgaSsrKSB7CisJCXN1Ymsua2IgPSBrZXlba19uZXh0XTsKKwkJa19uZXh0ID0gKGtfbmV4dCArIDEpICUga2xlbjsKKwkJZHQgPSBkYXRhW2ldOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQlpZiAoZHQgJiAweDgwKQorCQkJCXJldCBePSBzdWJrLmthOworCQkJZHQgPDw9IDE7CisJCQlzdWJrLmsgPDw9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBuZXR2c2Nfc2V0X2hhc2godTMyICpoYXNoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoZHI7CisJaW50IGRhdGFfbGVuOworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaXBoZHIgPSBpcF9oZHIoc2tiKTsKKworCWlmIChpcGhkci0+dmVyc2lvbiA9PSA0KSB7CisJCWlmIChpcGhkci0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQlkYXRhX2xlbiA9IDEyOworCQllbHNlCisJCQlkYXRhX2xlbiA9IDg7CisJCSpoYXNoID0gY29tcF9oYXNoKG5ldHZzY19oYXNoX2tleSwgSEFTSF9LRVlMRU4sCisJCQkJICAodTggKikmaXBoZHItPnNhZGRyLCBkYXRhX2xlbik7CisJCXJldCA9IHRydWU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUxNiBuZXR2c2Nfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJdm9pZCAqYWNjZWxfcHJpdiwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2spCit7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpoZGV2ID0gIG5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpudnNjX2RldiA9IGh2X2dldF9kcnZkYXRhKGhkZXYpOworCXUzMiBoYXNoOworCXUxNiBxX2lkeCA9IDA7CisKKwlpZiAobnZzY19kZXYgPT0gTlVMTCB8fCBuZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPD0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0dnNjX3NldF9oYXNoKCZoYXNoLCBza2IpKSB7CisJCXFfaWR4ID0gbnZzY19kZXYtPnNlbmRfdGFibGVbaGFzaCAlIFZSU1NfU0VORF9UQUJfU0laRV0gJQorCQkJbmRldi0+cmVhbF9udW1fdHhfcXVldWVzOworCQlza2Jfc2V0X2hhc2goc2tiLCBoYXNoLCBQS1RfSEFTSF9UWVBFX0wzKTsKKwl9CisKKwlyZXR1cm4gcV9pZHg7Cit9CisKIHN0YXRpYyB2b2lkIG5ldHZzY194bWl0X2NvbXBsZXRpb24odm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopY29udGV4dDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopCi0JCSh1bnNpZ25lZCBsb25nKXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl90aWQ7CisJCSh1bnNpZ25lZCBsb25nKXBhY2tldC0+c2VuZF9jb21wbGV0aW9uX3RpZDsKKwl1MzIgaW5kZXggPSBwYWNrZXQtPnNlbmRfYnVmX2luZGV4OwogCiAJa2ZyZWUocGFja2V0KTsKIAotCWlmIChza2IpCisJaWYgKHNrYiAmJiAoaW5kZXggPT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpKQogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogfQogCkBAIC0zMDEsNiArMzg2LDcgQEAKIAlzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKmxzb19pbmZvOwogCWludCAgaGRyX29mZnNldDsKIAl1MzIgbmV0X3RyYW5zX2luZm87CisJdTMyIGhhc2g7CiAKIAogCS8qIFdlIHdpbGwgYXRtb3N0IG5lZWQgdHdvIHBhZ2VzIHRvIGRlc2NyaWJlIHRoZSBybmRpcwpAQCAtMzE5LDkgKzQwNSw4IEBACiAJcGFja2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGh2X25ldHZzY19wYWNrZXQpICsKIAkJCSAobnVtX2RhdGFfcGdzICogc2l6ZW9mKHN0cnVjdCBodl9wYWdlX2J1ZmZlcikpICsKIAkJCSBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpICsKLQkJCSBORElTX1ZMQU5fUFBJX1NJWkUgKwotCQkJIE5ESVNfQ1NVTV9QUElfU0laRSArCi0JCQkgTkRJU19MU09fUFBJX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJIE5ESVNfVkxBTl9QUElfU0laRSArIE5ESVNfQ1NVTV9QUElfU0laRSArCisJCQkgTkRJU19MU09fUFBJX1NJWkUgKyBORElTX0hBU0hfUFBJX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghcGFja2V0KSB7CiAJCS8qIG91dCBvZiBtZW1vcnksIGRyb3AgcGFja2V0ICovCiAJCW5ldGRldl9lcnIobmV0LCAidW5hYmxlIHRvIGFsbG9jYXRlIGh2X25ldHZzY19wYWNrZXRcbiIpOwpAQCAtMzMzLDYgKzQxOCw4IEBACiAKIAlwYWNrZXQtPnZsYW5fdGNpID0gc2tiLT52bGFuX3RjaTsKIAorCXBhY2tldC0+cV9pZHggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwogCXBhY2tldC0+aXNfZGF0YV9wa3QgPSB0cnVlOwogCXBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gPSBza2ItPmxlbjsKIApAQCAtMzQxLDkgKzQyOCw5IEBACiAJCQkJKG51bV9kYXRhX3BncyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKSk7CiAKIAkvKiBTZXQgdGhlIGNvbXBsZXRpb24gcm91dGluZSAqLwotCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247Ci0JcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCA9IHBhY2tldDsKLQlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOworCXBhY2tldC0+c2VuZF9jb21wbGV0aW9uID0gbmV0dnNjX3htaXRfY29tcGxldGlvbjsKKwlwYWNrZXQtPnNlbmRfY29tcGxldGlvbl9jdHggPSBwYWNrZXQ7CisJcGFja2V0LT5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOwogCiAJaXN2bGFuID0gcGFja2V0LT52bGFuX3RjaSAmIFZMQU5fVEFHX1BSRVNFTlQ7CiAKQEAgLTM1OCw2ICs0NDUsMTQgQEAKIAogCXJuZGlzX21zZ19zaXplID0gUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19wYWNrZXQpOwogCisJaGFzaCA9IHNrYl9nZXRfaGFzaF9yYXcoc2tiKTsKKwlpZiAoaGFzaCAhPSAwICYmIG5ldC0+cmVhbF9udW1fdHhfcXVldWVzID4gMSkgeworCQlybmRpc19tc2dfc2l6ZSArPSBORElTX0hBU0hfUFBJX1NJWkU7CisJCXBwaSA9IGluaXRfcHBpX2RhdGEocm5kaXNfbXNnLCBORElTX0hBU0hfUFBJX1NJWkUsCisJCQkJICAgIE5CTF9IQVNIX1ZBTFVFKTsKKwkJKih1MzIgKikoKHZvaWQgKilwcGkgKyBwcGktPnBwaV9vZmZzZXQpID0gaGFzaDsKKwl9CisKIAlpZiAoaXN2bGFuKSB7CiAJCXN0cnVjdCBuZGlzX3BrdF84MDIxcV9pbmZvICp2bGFuOwogCkBAIC01NTgsNiArNjUzLDkgQEAKIAkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGh0b25zKEVUSF9QXzgwMjFRKSwKIAkJCQkgICAgICAgcGFja2V0LT52bGFuX3RjaSk7CiAKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcGFja2V0LT5jaGFubmVsLT4KKwkJCSAgICBvZmZlcm1zZy5vZmZlci5zdWJfY2hhbm5lbF9pbmRleCk7CisKIAluZXQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAluZXQtPnN0YXRzLnJ4X2J5dGVzICs9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW47CiAKQEAgLTYwNiw3ICs3MDQsNyBAQAogCWh2X3NldF9kcnZkYXRhKGhkZXYsIG5kZXYpOwogCWRldmljZV9pbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKIAlybmRpc19maWx0ZXJfZGV2aWNlX2FkZChoZGV2LCAmZGV2aWNlX2luZm8pOwotCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG5kZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTIsNiArNzUwLDcgQEAKIAkubmRvX2NoYW5nZV9tdHUgPQkJbmV0dnNjX2NoYW5nZV9tdHUsCiAJLm5kb192YWxpZGF0ZV9hZGRyID0JCWV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzID0JCW5ldHZzY19zZXRfbWFjX2FkZHIsCisJLm5kb19zZWxlY3RfcXVldWUgPQkJbmV0dnNjX3NlbGVjdF9xdWV1ZSwKIH07CiAKIC8qCkBAIC02OTgsOSArNzk3LDExIEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IE5VTEw7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CiAJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXY7CiAJaW50IHJldDsKIAotCW5ldCA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0KSk7CisJbmV0ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQpLAorCQkJCW51bV9vbmxpbmVfY3B1cygpKTsKIAlpZiAoIW5ldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTcxOSw3ICs4MjAsNyBAQAogCW5ldC0+ZmVhdHVyZXMgPSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX1JYQ1NVTSB8CiAJCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1RTTzsKIAotCVNFVF9FVEhUT09MX09QUyhuZXQsICZldGh0b29sX29wcyk7CisJbmV0LT5ldGh0b29sX29wcyA9ICZldGh0b29sX29wczsKIAlTRVRfTkVUREVWX0RFVihuZXQsICZkZXYtPmRldmljZSk7CiAKIAkvKiBOb3RpZnkgdGhlIG5ldHZzYyBkcml2ZXIgb2YgdGhlIG5ldyBkZXZpY2UgKi8KQEAgLTczMyw2ICs4MzQsMTAgQEAKIAl9CiAJbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIGRldmljZV9pbmZvLm1hY19hZHIsIEVUSF9BTEVOKTsKIAorCW52ZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKKwluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKG5ldCwgbnZkZXYtPm51bV9jaG4pOworCW5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0LCBudmRldi0+bnVtX2Nobik7CisKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgbmV0ZGV2LlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMgYi9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMKaW5kZXggMTQzYTk4Yy4uOTljNTI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIAogCi0jZGVmaW5lIFJORElTX0VYVF9MRU4gMTAwCisjZGVmaW5lIFJORElTX0VYVF9MRU4gUEFHRV9TSVpFCiBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudDsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgd2FpdF9ldmVudDsKQEAgLTk0LDYgKzk0LDggQEAKIAlybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUgPSBtc2dfdHlwZTsKIAlybmRpc19tc2ctPm1zZ19sZW4gPSBtc2dfbGVuOwogCisJcmVxdWVzdC0+cGt0LnFfaWR4ID0gMDsKKwogCS8qCiAJICogU2V0IHRoZSByZXF1ZXN0IGlkLiBUaGlzIGZpZWxkIGlzIGFsd2F5cyBhZnRlciB0aGUgcm5kaXMgaGVhZGVyIGZvcgogCSAqIHJlcXVlc3QvcmVzcG9uc2UgcGFja2V0IHR5cGVzIHNvIHdlIGp1c3QgdXNlZCB0aGUgU2V0UmVxdWVzdCBhcyBhCkBAIC0yMzQsNyArMjM2LDcgQEAKIAkJCXBhY2tldC0+cGFnZV9idWZbMF0ubGVuOwogCX0KIAotCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9IE5VTEw7CisJcGFja2V0LT5zZW5kX2NvbXBsZXRpb24gPSBOVUxMOwogCiAJcmV0ID0gbmV0dnNjX3NlbmQoZGV2LT5uZXRfZGV2LT5kZXYsIHBhY2tldCk7CiAJcmV0dXJuIHJldDsKQEAgLTM5OSw4ICs0MDEsNiBAQAogCXBrdC0+dG90YWxfZGF0YV9idWZsZW4gPSBybmRpc19wa3QtPmRhdGFfbGVuOwogCXBrdC0+ZGF0YSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXBrdC0+ZGF0YSArIGRhdGFfb2Zmc2V0KTsKIAotCXBrdC0+aXNfZGF0YV9wa3QgPSB0cnVlOwotCiAJdmxhbiA9IHJuZGlzX2dldF9wcGkocm5kaXNfcGt0LCBJRUVFXzgwMjFRX0lORk8pOwogCWlmICh2bGFuKSB7CiAJCXBrdC0+dmxhbl90Y2kgPSBWTEFOX1RBR19QUkVTRU5UIHwgdmxhbi0+dmxhbmlkIHwKQEAgLTUwOSw2ICs1MDksMTkgQEAKIAlxdWVyeS0+aW5mb19idWZsZW4gPSAwOwogCXF1ZXJ5LT5kZXZfdmNfaGFuZGxlID0gMDsKIAorCWlmIChvaWQgPT0gT0lEX0dFTl9SRUNFSVZFX1NDQUxFX0NBUEFCSUxJVElFUykgeworCQlzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX2NhcCAqY2FwOworCisJCXJlcXVlc3QtPnJlcXVlc3RfbXNnLm1zZ19sZW4gKz0KKwkJCXNpemVvZihzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX2NhcCk7CisJCXF1ZXJ5LT5pbmZvX2J1ZmxlbiA9IHNpemVvZihzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX2NhcCk7CisJCWNhcCA9IChzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX2NhcCAqKSgodW5zaWduZWQgbG9uZylxdWVyeSArCisJCQkJCQkgICAgIHF1ZXJ5LT5pbmZvX2J1Zl9vZmZzZXQpOworCQljYXAtPmhkci50eXBlID0gTkRJU19PQkpFQ1RfVFlQRV9SU1NfQ0FQQUJJTElUSUVTOworCQljYXAtPmhkci5yZXYgPSBORElTX1JFQ0VJVkVfU0NBTEVfQ0FQQUJJTElUSUVTX1JFVklTSU9OXzI7CisJCWNhcC0+aGRyLnNpemUgPSBzaXplb2Yoc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9jYXApOworCX0KKwogCXJldCA9IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cDsKQEAgLTY5NSw2ICs3MDgsODkgQEAKIAlyZXR1cm4gcmV0OwogfQogCit1OCBuZXR2c2NfaGFzaF9rZXlbSEFTSF9LRVlMRU5dID0geworCTB4NmQsIDB4NWEsIDB4NTYsIDB4ZGEsIDB4MjUsIDB4NWIsIDB4MGUsIDB4YzIsCisJMHg0MSwgMHg2NywgMHgyNSwgMHgzZCwgMHg0MywgMHhhMywgMHg4ZiwgMHhiMCwKKwkweGQwLCAweGNhLCAweDJiLCAweGNiLCAweGFlLCAweDdiLCAweDMwLCAweGI0LAorCTB4NzcsIDB4Y2IsIDB4MmQsIDB4YTMsIDB4ODAsIDB4MzAsIDB4ZjIsIDB4MGMsCisJMHg2YSwgMHg0MiwgMHhiNywgMHgzYiwgMHhiZSwgMHhhYywgMHgwMSwgMHhmYQorfTsKKworaW50IHJuZGlzX2ZpbHRlcl9zZXRfcnNzX3BhcmFtKHN0cnVjdCBybmRpc19kZXZpY2UgKnJkZXYsIGludCBudW1fcXVldWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSByZGV2LT5uZXRfZGV2LT5uZGV2OworCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCAqc2V0OworCXN0cnVjdCBybmRpc19zZXRfY29tcGxldGUgKnNldF9jb21wbGV0ZTsKKwl1MzIgZXh0bGVuID0gc2l6ZW9mKHN0cnVjdCBuZGlzX3JlY3Zfc2NhbGVfcGFyYW0pICsKKwkJICAgICA0KklUQUJfTlVNICsgSEFTSF9LRVlMRU47CisJc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9wYXJhbSAqcnNzcDsKKwl1MzIgKml0YWI7CisJdTggKmtleXA7CisJaW50IGksIHQsIHJldDsKKworCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdCgKKwkJCXJkZXYsIFJORElTX01TR19TRVQsCisJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KSArIGV4dGxlbik7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNldCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuc2V0X3JlcTsKKwlzZXQtPm9pZCA9IE9JRF9HRU5fUkVDRUlWRV9TQ0FMRV9QQVJBTUVURVJTOworCXNldC0+aW5mb19idWZsZW4gPSBleHRsZW47CisJc2V0LT5pbmZvX2J1Zl9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KTsKKwlzZXQtPmRldl92Y19oYW5kbGUgPSAwOworCisJcnNzcCA9IChzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX3BhcmFtICopKHNldCArIDEpOworCXJzc3AtPmhkci50eXBlID0gTkRJU19PQkpFQ1RfVFlQRV9SU1NfUEFSQU1FVEVSUzsKKwlyc3NwLT5oZHIucmV2ID0gTkRJU19SRUNFSVZFX1NDQUxFX1BBUkFNRVRFUlNfUkVWSVNJT05fMjsKKwlyc3NwLT5oZHIuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX3BhcmFtKTsKKwlyc3NwLT5mbGFnID0gMDsKKwlyc3NwLT5oYXNoaW5mbyA9IE5ESVNfSEFTSF9GVU5DX1RPRVBMSVRaIHwgTkRJU19IQVNIX0lQVjQgfAorCQkJIE5ESVNfSEFTSF9UQ1BfSVBWNDsKKwlyc3NwLT5pbmRpcmVjdF90YWJzaXplID0gNCpJVEFCX05VTTsKKwlyc3NwLT5pbmRpcmVjdF90YWJvZmZzZXQgPSBzaXplb2Yoc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9wYXJhbSk7CisJcnNzcC0+aGFzaGtleV9zaXplID0gSEFTSF9LRVlMRU47CisJcnNzcC0+a2FzaGtleV9vZmZzZXQgPSByc3NwLT5pbmRpcmVjdF90YWJvZmZzZXQgKworCQkJICAgICAgIHJzc3AtPmluZGlyZWN0X3RhYnNpemU7CisKKwkvKiBTZXQgaW5kaXJlY3Rpb24gdGFibGUgZW50cmllcyAqLworCWl0YWIgPSAodTMyICopKHJzc3AgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgSVRBQl9OVU07IGkrKykKKwkJaXRhYltpXSA9IGkgJSBudW1fcXVldWU7CisKKwkvKiBTZXQgaGFzayBrZXkgdmFsdWVzICovCisJa2V5cCA9ICh1OCAqKSgodW5zaWduZWQgbG9uZylyc3NwICsgcnNzcC0+a2FzaGtleV9vZmZzZXQpOworCWZvciAoaSA9IDA7IGkgPCBIQVNIX0tFWUxFTjsgaSsrKQorCQlrZXlwW2ldID0gbmV0dnNjX2hhc2hfa2V5W2ldOworCisKKwlyZXQgPSBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KHJkZXYsIHJlcXVlc3QpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7CisJaWYgKHQgPT0gMCkgeworCQluZXRkZXZfZXJyKG5kZXYsICJ0aW1lb3V0IGJlZm9yZSB3ZSBnb3QgYSBzZXQgcmVzcG9uc2UuLi5cbiIpOworCQkvKiBjYW4ndCBwdXRfcm5kaXNfcmVxdWVzdCwgc2luY2Ugd2UgbWF5IHN0aWxsIHJlY2VpdmUgYQorCQkgKiBzZW5kLWNvbXBsZXRpb24uCisJCSAqLworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9IGVsc2UgeworCQlzZXRfY29tcGxldGUgPSAmcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5zZXRfY29tcGxldGU7CisJCWlmIChzZXRfY29tcGxldGUtPnN0YXR1cyAhPSBSTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJbmV0ZGV2X2VycihuZGV2LCAiRmFpbCB0byBzZXQgUlNTIHBhcmFtZXRlcnM6MHgleFxuIiwKKwkJCQkgICBzZXRfY29tcGxldGUtPnN0YXR1cyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCitjbGVhbnVwOgorCXB1dF9ybmRpc19yZXF1ZXN0KHJkZXYsIHJlcXVlc3QpOworCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIGludCBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlX2xpbmtfc3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAl1MzIgc2l6ZSA9IHNpemVvZih1MzIpOwpAQCAtODg2LDYgKzk4MiwyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldHZzY19zY19vcGVuKHN0cnVjdCB2bWJ1c19jaGFubmVsICpuZXdfc2MpCit7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm52c2NkZXY7CisJdTE2IGNobl9pbmRleCA9IG5ld19zYy0+b2ZmZXJtc2cub2ZmZXIuc3ViX2NoYW5uZWxfaW5kZXg7CisJaW50IHJldDsKKworCW52c2NkZXYgPSBodl9nZXRfZHJ2ZGF0YShuZXdfc2MtPnByaW1hcnlfY2hhbm5lbC0+ZGV2aWNlX29iaik7CisKKwlpZiAoY2huX2luZGV4ID49IG52c2NkZXYtPm51bV9jaG4pCisJCXJldHVybjsKKworCXNldF9wZXJfY2hhbm5lbF9zdGF0ZShuZXdfc2MsIG52c2NkZXYtPnN1Yl9jYl9idWYgKyAoY2huX2luZGV4IC0gMSkgKgorCQkJICAgICAgTkVUVlNDX1BBQ0tFVF9TSVpFKTsKKworCXJldCA9IHZtYnVzX29wZW4obmV3X3NjLCBudnNjZGV2LT5yaW5nX3NpemUgKiBQQUdFX1NJWkUsCisJCQkgbnZzY2Rldi0+cmluZ19zaXplICogUEFHRV9TSVpFLCBOVUxMLCAwLAorCQkJIG5ldHZzY19jaGFubmVsX2NiLCBuZXdfc2MpOworCisJaWYgKHJldCA9PSAwKQorCQludnNjZGV2LT5jaG5fdGFibGVbY2huX2luZGV4XSA9IG5ld19zYzsKK30KKwogaW50IHJuZGlzX2ZpbHRlcl9kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKIAkJCQkgIHZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKQEAgLTg5NCw2ICsxMDEyLDEwIEBACiAJc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNfZGV2aWNlOwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gYWRkaXRpb25hbF9pbmZvOwogCXN0cnVjdCBuZGlzX29mZmxvYWRfcGFyYW1zIG9mZmxvYWRzOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRfcGFja2V0OworCWludCB0OworCXN0cnVjdCBuZGlzX3JlY3Zfc2NhbGVfY2FwIHJzc2NhcDsKKwl1MzIgcnNzY2FwX3NpemUgPSBzaXplb2Yoc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9jYXApOwogCiAJcm5kaXNfZGV2aWNlID0gZ2V0X3JuZGlzX2RldmljZSgpOwogCWlmICghcm5kaXNfZGV2aWNlKQpAQCAtOTEzLDYgKzEwMzUsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcm5kaXMgZGV2aWNlICovCiAJbmV0X2RldmljZSA9IGh2X2dldF9kcnZkYXRhKGRldik7CisJbmV0X2RldmljZS0+bnVtX2NobiA9IDE7CiAKIAluZXRfZGV2aWNlLT5leHRlbnNpb24gPSBybmRpc19kZXZpY2U7CiAJcm5kaXNfZGV2aWNlLT5uZXRfZGV2ID0gbmV0X2RldmljZTsKQEAgLTk1Miw3ICsxMDc1LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kZXZfcmVtdjsKIAotCiAJcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhybmRpc19kZXZpY2UpOwogCiAJZGV2aWNlX2luZm8tPmxpbmtfc3RhdGUgPSBybmRpc19kZXZpY2UtPmxpbmtfc3RhdGU7CkBAIC05NjEsNyArMTA4Myw2NiBAQAogCQkgcm5kaXNfZGV2aWNlLT5od19tYWNfYWRyLAogCQkgZGV2aWNlX2luZm8tPmxpbmtfc3RhdGUgPyAiZG93biIgOiAidXAiKTsKIAotCXJldHVybiByZXQ7CisJaWYgKG5ldF9kZXZpY2UtPm52c3BfdmVyc2lvbiA8IE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81KQorCQlyZXR1cm4gMDsKKworCS8qIHZSU1Mgc2V0dXAgKi8KKwltZW1zZXQoJnJzc2NhcCwgMCwgcnNzY2FwX3NpemUpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2Uocm5kaXNfZGV2aWNlLAorCQkJCQlPSURfR0VOX1JFQ0VJVkVfU0NBTEVfQ0FQQUJJTElUSUVTLAorCQkJCQkmcnNzY2FwLCAmcnNzY2FwX3NpemUpOworCWlmIChyZXQgfHwgcnNzY2FwLm51bV9yZWN2X3F1ZSA8IDIpCisJCWdvdG8gb3V0OworCisJbmV0X2RldmljZS0+bnVtX2NobiA9IChudW1fb25saW5lX2NwdXMoKSA8IHJzc2NhcC5udW1fcmVjdl9xdWUpID8KKwkJCSAgICAgICBudW1fb25saW5lX2NwdXMoKSA6IHJzc2NhcC5udW1fcmVjdl9xdWU7CisJaWYgKG5ldF9kZXZpY2UtPm51bV9jaG4gPT0gMSkKKwkJZ290byBvdXQ7CisKKwluZXRfZGV2aWNlLT5zdWJfY2JfYnVmID0gdnphbGxvYygobmV0X2RldmljZS0+bnVtX2NobiAtIDEpICoKKwkJCQkJIE5FVFZTQ19QQUNLRVRfU0laRSk7CisJaWYgKCFuZXRfZGV2aWNlLT5zdWJfY2JfYnVmKSB7CisJCW5ldF9kZXZpY2UtPm51bV9jaG4gPSAxOworCQlkZXZfaW5mbygmZGV2LT5kZXZpY2UsICJObyBtZW1vcnkgZm9yIHN1YmNoYW5uZWxzLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXZtYnVzX3NldF9zY19jcmVhdGVfY2FsbGJhY2soZGV2LT5jaGFubmVsLCBuZXR2c2Nfc2Nfb3Blbik7CisKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OworCW1lbXNldChpbml0X3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwlpbml0X3BhY2tldC0+aGRyLm1zZ190eXBlID0gTlZTUF9NU0c1X1RZUEVfU1VCQ0hBTk5FTDsKKwlpbml0X3BhY2tldC0+bXNnLnY1X21zZy5zdWJjaG5fcmVxLm9wID0gTlZTUF9TVUJDSEFOTkVMX0FMTE9DQVRFOworCWluaXRfcGFja2V0LT5tc2cudjVfbXNnLnN1YmNobl9yZXEubnVtX3N1YmNoYW5uZWxzID0KKwkJCQkJCW5ldF9kZXZpY2UtPm51bV9jaG4gLSAxOworCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2LT5jaGFubmVsLCBpbml0X3BhY2tldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdF9wYWNrZXQsCisJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAorCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF93YWl0LCA1KkhaKTsKKwlpZiAodCA9PSAwKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy52NV9tc2cuc3ViY2huX2NvbXAuc3RhdHVzICE9CisJICAgIE5WU1BfU1RBVF9TVUNDRVNTKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwluZXRfZGV2aWNlLT5udW1fY2huID0gMSArCisJCWluaXRfcGFja2V0LT5tc2cudjVfbXNnLnN1YmNobl9jb21wLm51bV9zdWJjaGFubmVsczsKKworCXZtYnVzX2FyZV9zdWJjaGFubmVsc19wcmVzZW50KGRldi0+Y2hhbm5lbCk7CisKKwlyZXQgPSBybmRpc19maWx0ZXJfc2V0X3Jzc19wYXJhbShybmRpc19kZXZpY2UsIG5ldF9kZXZpY2UtPm51bV9jaG4pOworCitvdXQ6CisJaWYgKHJldCkKKwkJbmV0X2RldmljZS0+bnVtX2NobiA9IDE7CisJcmV0dXJuIDA7IC8qIHJldHVybiAwIGJlY2F1c2UgcHJpbWFyeSBjaGFubmVsIGNhbiBiZSB1c2VkIGFsb25lICovCiAKIGVycl9kZXZfcmVtdjoKIAlybmRpc19maWx0ZXJfZGV2aWNlX3JlbW92ZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9hdDg2cmYyMzAuYyBiL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvYXQ4NnJmMjMwLmMKaW5kZXggZTM2ZjE5NC4uNDUxN2IxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9hdDg2cmYyMzAuYworKysgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTY5MiwxMCArNjkzLDcgQEAKIAlpZiAocmMgPCAwKQogCQlnb3RvIGVycl9yeDsKIAotCXJjID0gYXQ4NnJmMjMwX3N0YXJ0KGRldik7Ci0KLQlyZXR1cm4gcmM7Ci0KKwlyZXR1cm4gYXQ4NnJmMjMwX3N0YXJ0KGRldik7CiBlcnJfcng6CiAJYXQ4NnJmMjMwX3N0YXJ0KGRldik7CiBlcnI6CkBAIC05NjMsMzMgKzk2MSwyNCBAQAogCXJldHVybiBhdDg2cmYyMzBfaXNyKGlycSwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgYXQ4NnJmMjMwX2lycV9wb2xhcml0eShzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCwgaW50IHBvbCkKLXsKLQlyZXR1cm4gYXQ4NnJmMjMwX3dyaXRlX3N1YnJlZyhscCwgU1JfSVJRX1BPTEFSSVRZLCBwb2wpOwotfQotCiBzdGF0aWMgaW50IGF0ODZyZjIzMF9od19pbml0KHN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwKQogewotCXN0cnVjdCBhdDg2cmYyMzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBscC0+c3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpbnQgcmMsIGlycV9wb2w7Ci0JdTggc3RhdHVzOworCWludCByYywgaXJxX3BvbCwgaXJxX3R5cGU7CisJdTggZHZkZDsKIAl1OCBjc21hX3NlZWRbMl07CiAKLQlyYyA9IGF0ODZyZjIzMF9yZWFkX3N1YnJlZyhscCwgU1JfVFJYX1NUQVRVUywgJnN0YXR1cyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KIAlyYyA9IGF0ODZyZjIzMF93cml0ZV9zdWJyZWcobHAsIFNSX1RSWF9DTUQsIFNUQVRFX0ZPUkNFX1RSWF9PRkYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJaXJxX3R5cGUgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShscC0+c3BpLT5pcnEpOwogCS8qIGNvbmZpZ3VyZSBpcnEgcG9sYXJpdHksIGRlZmF1bHRzIHRvIGhpZ2ggYWN0aXZlICovCi0JaWYgKHBkYXRhLT5pcnFfdHlwZSAmIChJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9MT1cpKQorCWlmIChpcnFfdHlwZSAmIChJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9MT1cpKQogCQlpcnFfcG9sID0gSVJRX0FDVElWRV9MT1c7CiAJZWxzZQogCQlpcnFfcG9sID0gSVJRX0FDVElWRV9ISUdIOwogCi0JcmMgPSBhdDg2cmYyMzBfaXJxX3BvbGFyaXR5KGxwLCBpcnFfcG9sKTsKKwlyYyA9IGF0ODZyZjIzMF93cml0ZV9zdWJyZWcobHAsIFNSX0lSUV9QT0xBUklUWSwgaXJxX3BvbCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTEwMTcsMTAgKzEwMDYsMTAgQEAKIAkvKiBXYWl0IHRoZSBuZXh0IFNMRUVQIGN5Y2xlICovCiAJbXNsZWVwKDEwMCk7CiAKLQlyYyA9IGF0ODZyZjIzMF9yZWFkX3N1YnJlZyhscCwgU1JfRFZERF9PSywgJnN0YXR1cyk7CisJcmMgPSBhdDg2cmYyMzBfcmVhZF9zdWJyZWcobHAsIFNSX0RWRERfT0ssICZkdmRkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlpZiAoIXN0YXR1cykgeworCWlmICghZHZkZCkgewogCQlkZXZfZXJyKCZscC0+c3BpLT5kZXYsICJEVkREIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTAzMiw3ICsxMDIxLDYgQEAKIGF0ODZyZjIzMF9nZXRfcGRhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXQ4NnJmMjMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCWNvbnN0IGNoYXIgKmlycV90eXBlOwogCiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIXNwaS0+ZGV2Lm9mX25vZGUpCiAJCXJldHVybiBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtMTA0NCwxOSArMTAzMiw2IEBACiAJcGRhdGEtPnJzdG4gPSBvZl9nZXRfbmFtZWRfZ3BpbyhzcGktPmRldi5vZl9ub2RlLCAicmVzZXQtZ3BpbyIsIDApOwogCXBkYXRhLT5zbHBfdHIgPSBvZl9nZXRfbmFtZWRfZ3BpbyhzcGktPmRldi5vZl9ub2RlLCAic2xlZXAtZ3BpbyIsIDApOwogCi0JcGRhdGEtPmlycV90eXBlID0gSVJRRl9UUklHR0VSX1JJU0lORzsKLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzcGktPmRldi5vZl9ub2RlLCAiaXJxLXR5cGUiLCAmaXJxX3R5cGUpOwotCWlmICghc3RyY21wKGlycV90eXBlLCAibGV2ZWwtaGlnaCIpKQotCQlwZGF0YS0+aXJxX3R5cGUgPSBJUlFGX1RSSUdHRVJfSElHSDsKLQllbHNlIGlmICghc3RyY21wKGlycV90eXBlLCAibGV2ZWwtbG93IikpCi0JCXBkYXRhLT5pcnFfdHlwZSA9IElSUUZfVFJJR0dFUl9MT1c7Ci0JZWxzZSBpZiAoIXN0cmNtcChpcnFfdHlwZSwgImVkZ2UtcmlzaW5nIikpCi0JCXBkYXRhLT5pcnFfdHlwZSA9IElSUUZfVFJJR0dFUl9SSVNJTkc7Ci0JZWxzZSBpZiAoIXN0cmNtcChpcnFfdHlwZSwgImVkZ2UtZmFsbGluZyIpKQotCQlwZGF0YS0+aXJxX3R5cGUgPSBJUlFGX1RSSUdHRVJfRkFMTElORzsKLQllbHNlCi0JCWRldl93YXJuKCZzcGktPmRldiwgIndyb25nIGlycS10eXBlIHNwZWNpZmllZCB1c2luZyBlZGdlLXJpc2luZ1xuIik7Ci0KIAlzcGktPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiBkb25lOgogCXJldHVybiBwZGF0YTsKQEAgLTEwNzEsNyArMTA0Niw3IEBACiAJdTggcGFydCA9IDAsIHZlcnNpb24gPSAwLCBzdGF0dXM7CiAJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcjsKIAl3b3JrX2Z1bmNfdCBpcnFfd29ya2VyOwotCWludCByYzsKKwlpbnQgcmMsIGlycV90eXBlOwogCWNvbnN0IGNoYXIgKmNoaXA7CiAJc3RydWN0IGllZWU4MDIxNTRfb3BzICpvcHMgPSBOVUxMOwogCkBAIC0xMDg3LDI3ICsxMDYyLDE3IEBACiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnJzdG4pKSB7Ci0JCXJjID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5yc3RuLCAicnN0biIpOworCQlyYyA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT5yc3RuLAorCQkJCQkgICBHUElPRl9PVVRfSU5JVF9ISUdILCAicnN0biIpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnNscF90cikpIHsKLQkJcmMgPSBncGlvX3JlcXVlc3QocGRhdGEtPnNscF90ciwgInNscF90ciIpOworCQlyYyA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT5zbHBfdHIsCisJCQkJCSAgIEdQSU9GX09VVF9JTklUX0xPVywgInNscF90ciIpOwogCQlpZiAocmMpCi0JCQlnb3RvIGVycl9zbHBfdHI7Ci0JfQotCi0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnJzdG4pKSB7Ci0JCXJjID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5yc3RuLCAxKTsKLQkJaWYgKHJjKQotCQkJZ290byBlcnJfZ3Bpb19kaXI7Ci0JfQotCi0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnNscF90cikpIHsKLQkJcmMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnNscF90ciwgMCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyX2dwaW9fZGlyOworCQkJcmV0dXJuIHJjOwogCX0KIAogCS8qIFJlc2V0ICovCkBAIC0xMTIxLDEzICsxMDg2LDEyIEBACiAKIAlyYyA9IF9fYXQ4NnJmMjMwX2RldGVjdF9kZXZpY2Uoc3BpLCAmbWFuX2lkLCAmcGFydCwgJnZlcnNpb24pOwogCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyX2dwaW9fZGlyOworCQlyZXR1cm4gcmM7CiAKIAlpZiAobWFuX2lkICE9IDB4MDAxZikgewogCQlkZXZfZXJyKCZzcGktPmRldiwgIk5vbi1BdG1lbCBkZXYgZm91bmQgKE1BTl9JRCAlMDJ4ICUwMngpXG4iLAogCQkJbWFuX2lkID4+IDgsIG1hbl9pZCAmIDB4RkYpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2dwaW9fZGlyOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzd2l0Y2ggKHBhcnQpIHsKQEAgLTExNTQsMTYgKzExMTgsMTIgQEAKIAl9CiAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICJEZXRlY3RlZCAlcyBjaGlwIHZlcnNpb24gJWRcbiIsIGNoaXAsIHZlcnNpb24pOwotCWlmICghb3BzKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIGVycl9ncGlvX2RpcjsKLQl9CisJaWYgKCFvcHMpCisJCXJldHVybiAtRU5PVFNVUFA7CiAKIAlkZXYgPSBpZWVlODAyMTU0X2FsbG9jX2RldmljZShzaXplb2YoKmxwKSwgb3BzKTsKLQlpZiAoIWRldikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2dwaW9fZGlyOwotCX0KKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlscCA9IGRldi0+cHJpdjsKIAlscC0+ZGV2ID0gZGV2OwpAQCAtMTE3Niw3ICsxMTM2LDggQEAKIAlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gMDsKIAlkZXYtPmZsYWdzID0gSUVFRTgwMjE1NF9IV19PTUlUX0NLU1VNIHwgSUVFRTgwMjE1NF9IV19BQUNLOwogCi0JaWYgKHBkYXRhLT5pcnFfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJaXJxX3R5cGUgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShzcGktPmlycSk7CisJaWYgKGlycV90eXBlICYgKElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORykpIHsKIAkJaXJxX3dvcmtlciA9IGF0ODZyZjIzMF9pcnF3b3JrOwogCQlpcnFfaGFuZGxlciA9IGF0ODZyZjIzMF9pc3I7CiAJfSBlbHNlIHsKQEAgLTEyMDIsNzUgKzExNjMsNjUgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyX2h3X2luaXQ7CiAKLQlyYyA9IHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBpcnFfaGFuZGxlciwKLQkJCSBJUlFGX1NIQVJFRCB8IHBkYXRhLT5pcnFfdHlwZSwKLQkJCSBkZXZfbmFtZSgmc3BpLT5kZXYpLCBscCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9od19pbml0OwotCiAJLyogUmVhZCBpcnEgc3RhdHVzIHJlZ2lzdGVyIHRvIHJlc2V0IGlycSBsaW5lICovCiAJcmMgPSBhdDg2cmYyMzBfcmVhZF9zdWJyZWcobHAsIFJHX0lSUV9TVEFUVVMsIDB4ZmYsIDAsICZzdGF0dXMpOwogCWlmIChyYykKLQkJZ290byBlcnJfaXJxOworCQlnb3RvIGVycl9od19pbml0OworCisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZzcGktPmRldiwgc3BpLT5pcnEsIGlycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCSAgICAgIGRldl9uYW1lKCZzcGktPmRldiksIGxwKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2h3X2luaXQ7CiAKIAlyYyA9IGllZWU4MDIxNTRfcmVnaXN0ZXJfZGV2aWNlKGxwLT5kZXYpOwogCWlmIChyYykKLQkJZ290byBlcnJfaXJxOworCQlnb3RvIGVycl9od19pbml0OwogCiAJcmV0dXJuIHJjOwogCi1lcnJfaXJxOgotCWZyZWVfaXJxKHNwaS0+aXJxLCBscCk7CiBlcnJfaHdfaW5pdDoKIAlmbHVzaF93b3JrKCZscC0+aXJxd29yayk7Ci0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgTlVMTCk7CiAJbXV0ZXhfZGVzdHJveSgmbHAtPmJtdXgpOwogCWllZWU4MDIxNTRfZnJlZV9kZXZpY2UobHAtPmRldik7CiAKLWVycl9ncGlvX2RpcjoKLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+c2xwX3RyKSkKLQkJZ3Bpb19mcmVlKHBkYXRhLT5zbHBfdHIpOwotZXJyX3NscF90cjoKLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+cnN0bikpCi0JCWdwaW9fZnJlZShwZGF0YS0+cnN0bik7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGF0ODZyZjIzMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBhdDg2cmYyMzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJLyogbWFzayBhbGwgYXQ4NnJmMjMwIGlycSdzICovCiAJYXQ4NnJmMjMwX3dyaXRlX3N1YnJlZyhscCwgU1JfSVJRX01BU0ssIDApOwogCWllZWU4MDIxNTRfdW5yZWdpc3Rlcl9kZXZpY2UobHAtPmRldik7Ci0KLQlmcmVlX2lycShzcGktPmlycSwgbHApOwogCWZsdXNoX3dvcmsoJmxwLT5pcnF3b3JrKTsKLQotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5zbHBfdHIpKQotCQlncGlvX2ZyZWUocGRhdGEtPnNscF90cik7Ci0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnJzdG4pKQotCQlncGlvX2ZyZWUocGRhdGEtPnJzdG4pOwotCiAJbXV0ZXhfZGVzdHJveSgmbHAtPmJtdXgpOwogCWllZWU4MDIxNTRfZnJlZV9kZXZpY2UobHAtPmRldik7Ci0KIAlkZXZfZGJnKCZzcGktPmRldiwgInVucmVnaXN0ZXJlZCBhdDg2cmYyMzBcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19PRikKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0ODZyZjIzMF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXQ4NnJmMjMwX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDg2cmYyMzAiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ4NnJmMjMxIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0ODZyZjIzMyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDg2cmYyMTIiLCB9LAogCXsgfSwKIH07Ci0jZW5kaWYKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGF0ODZyZjIzMF9vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhdDg2cmYyMzBfZGV2aWNlX2lkW10gPSB7CisJeyAubmFtZSA9ICJhdDg2cmYyMzAiLCB9LAorCXsgLm5hbWUgPSAiYXQ4NnJmMjMxIiwgfSwKKwl7IC5uYW1lID0gImF0ODZyZjIzMyIsIH0sCisJeyAubmFtZSA9ICJhdDg2cmYyMTIiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYXQ4NnJmMjMwX2RldmljZV9pZCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhdDg2cmYyMzBfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGF0ODZyZjIzMF9kZXZpY2VfaWQsCiAJLmRyaXZlciA9IHsKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGF0ODZyZjIzMF9vZl9tYXRjaCksCiAJCS5uYW1lCT0gImF0ODZyZjIzMCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2Zha2VsYi5jIGIvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9mYWtlbGIuYwppbmRleCBiOGQyMjE3Li4yN2Q4MzIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9mYWtlbGIuYworKysgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2Zha2VsYi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxNTQuaD4KICNpbmNsdWRlIDxuZXQvd3Bhbi1waHkuaD4KQEAgLTIyOCw3ICsyMjksOCBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCWludCBpOwogCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmYWtlbGJfcHJpdiksIEdGUF9LRVJORUwpOworCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmYWtlbGJfcHJpdiksCisJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQogCQlnb3RvIGVycl9hbGxvYzsKIApAQCAtMjQ4LDcgKzI1MCw2IEBACiBlcnJfc2xhdmU6CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkcCwgJnByaXYtPmxpc3QsIGxpc3QpCiAJCWZha2VsYl9kZWwoZHApOwotCWtmcmVlKHByaXYpOwogZXJyX2FsbG9jOgogCXJldHVybiBlcnI7CiB9CkBAIC0yNjAsNyArMjYxLDYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkcCwgdGVtcCwgJnByaXYtPmxpc3QsIGxpc3QpCiAJCWZha2VsYl9kZWwoZHApOwotCWtmcmVlKHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZWVlODAyMTU0L21yZjI0ajQwLmMgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L21yZjI0ajQwLmMKaW5kZXggNzhhNjU1Mi4uNDA0ODA2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9tcmYyNGo0MC5jCisrKyBiL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvbXJmMjRqNDAuYwpAQCAtNjE4LDEyICs2MTgsMTIgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIm1yZjI0ajQwOiBwcm9iZSgpLiBJUlE6ICVkXG4iLCBzcGktPmlycSk7CiAKLQlkZXZyZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXJmMjRqNDApLCBHRlBfS0VSTkVMKTsKKwlkZXZyZWMgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IG1yZjI0ajQwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZyZWMpCi0JCWdvdG8gZXJyX2RldnJlYzsKLQlkZXZyZWMtPmJ1ZiA9IGt6YWxsb2MoMywgR0ZQX0tFUk5FTCk7CisJCWdvdG8gZXJyX3JldDsKKwlkZXZyZWMtPmJ1ZiA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIDMsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cmVjLT5idWYpCi0JCWdvdG8gZXJyX2J1ZjsKKwkJZ290byBlcnJfcmV0OwogCiAJc3BpLT5tb2RlID0gU1BJX01PREVfMDsgLyogVE9ETzogSXMgdGhpcyBhcHByb3ByaWF0ZSBmb3IgcmlnaHQgaGVyZT8gKi8KIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiBNQVhfU1BJX1NQRUVEX0haKQpAQCAtNjM4LDcgKzYzOCw3IEBACiAKIAlkZXZyZWMtPmRldiA9IGllZWU4MDIxNTRfYWxsb2NfZGV2aWNlKDAsICZtcmYyNGo0MF9vcHMpOwogCWlmICghZGV2cmVjLT5kZXYpCi0JCWdvdG8gZXJyX2FsbG9jX2RldjsKKwkJZ290byBlcnJfcmV0OwogCiAJZGV2cmVjLT5kZXYtPnByaXYgPSBkZXZyZWM7CiAJZGV2cmVjLT5kZXYtPnBhcmVudCA9ICZkZXZyZWMtPnNwaS0+ZGV2OwpAQCAtNjc2LDEyICs2NzYsMTMgQEAKIAl2YWwgJj0gfjB4MzsgLyogQ2xlYXIgUlggbW9kZSAobm9ybWFsKSAqLwogCXdyaXRlX3Nob3J0X3JlZyhkZXZyZWMsIFJFR19SWE1DUiwgdmFsKTsKIAotCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHNwaS0+aXJxLAotCQkJCSAgIE5VTEwsCi0JCQkJICAgbXJmMjRqNDBfaXNyLAotCQkJCSAgIElSUUZfVFJJR0dFUl9MT1d8SVJRRl9PTkVTSE9ULAotCQkJCSAgIGRldl9uYW1lKCZzcGktPmRldiksCi0JCQkJICAgZGV2cmVjKTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZzcGktPmRldiwKKwkJCQkJc3BpLT5pcnEsCisJCQkJCU5VTEwsCisJCQkJCW1yZjI0ajQwX2lzciwKKwkJCQkJSVJRRl9UUklHR0VSX0xPV3xJUlFGX09ORVNIT1QsCisJCQkJCWRldl9uYW1lKCZzcGktPmRldiksCisJCQkJCWRldnJlYyk7CiAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocHJpbnRkZXYoZGV2cmVjKSwgIlVuYWJsZSB0byBnZXQgSVJRIik7CkBAIC02OTUsMTEgKzY5Niw3IEBACiAJaWVlZTgwMjE1NF91bnJlZ2lzdGVyX2RldmljZShkZXZyZWMtPmRldik7CiBlcnJfcmVnaXN0ZXJfZGV2aWNlOgogCWllZWU4MDIxNTRfZnJlZV9kZXZpY2UoZGV2cmVjLT5kZXYpOwotZXJyX2FsbG9jX2RldjoKLQlrZnJlZShkZXZyZWMtPmJ1Zik7Ci1lcnJfYnVmOgotCWtmcmVlKGRldnJlYyk7Ci1lcnJfZGV2cmVjOgorZXJyX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03MDksMTUgKzcwNiwxMSBAQAogCiAJZGV2X2RiZyhwcmludGRldihkZXZyZWMpLCAicmVtb3ZlXG4iKTsKIAotCWZyZWVfaXJxKHNwaS0+aXJxLCBkZXZyZWMpOwogCWllZWU4MDIxNTRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2cmVjLT5kZXYpOwogCWllZWU4MDIxNTRfZnJlZV9kZXZpY2UoZGV2cmVjLT5kZXYpOwogCS8qIFRPRE86IFdpbGwgaWVlZTgwMjE1NF9mcmVlX2RldmljZSgpIHdhaXQgdW50aWwgLT54bWl0KCkgaXMKIAkgKiBjb21wbGV0ZT8gKi8KIAotCS8qIENsZWFuIHVwIHRoZSBTUEkgc3R1ZmYuICovCi0Ja2ZyZWUoZGV2cmVjLT5idWYpOwotCWtmcmVlKGRldnJlYyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZwppbmRleCAzZGE0NGQ1Li44ZDEwMWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCkBAIC0zOTYsNyArMzk2LDggQEAKIAogY29uZmlnIFNIX0lSREEKIAl0cmlzdGF0ZSAiU3VwZXJIIElyREEgZHJpdmVyIgotCWRlcGVuZHMgb24gSVJEQSAmJiBBUkNIX1NITU9CSUxFCisJZGVwZW5kcyBvbiBJUkRBCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91ciB3YW50IHRvIGVuYWJsZSBTdXBlckggSXJEQSBkZXZpY2VzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKaW5kZXggMjkwMGFmMC4uOTk4YmI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwpAQCAtNTEwLDEwICs1MTAsOCBAQAogICovCiBzdGF0aWMgaW50IHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGludCBpb2Jhc2UpCiB7Ci0JaW50IGRvbmdsZV9pZCA9IDk7CS8qIERlZmF1bHQgdG8gSUJNICovCi0KIAlJUkRBX0VSUk9SKCJ2aWEtaXJjYzogZG9uZ2xlIHByb2Jpbmcgbm90IHN1cHBvcnRlZCwgcGxlYXNlIHNwZWNpZnkgZG9uZ2xlX2lkIG1vZHVsZSBwYXJhbWV0ZXIuXG4iKTsKLQlyZXR1cm4gZG9uZ2xlX2lkOworCXJldHVybiA5OwkvKiBEZWZhdWx0IHRvIElCTSAqLwogfQogCiAvKgpAQCAtOTI2LDcgKzkyNCw2IEBACiBzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKIHsKIAlpbnQgaW9iYXNlOwotCWludCByZXQgPSBUUlVFOwogCXU4IFR4X3N0YXR1czsKIAogCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fZnVuY19fKTsKQEAgLTk4Myw3ICs5ODAsNyBAQAogCS8vIFRlbGwgdGhlIG5ldHdvcmsgbGF5ZXIsIHRoYXQgd2UgY2FuIGFjY2VwdCBtb3JlIGZyYW1lcyAKIAluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CiAvL0YwMSAgIH0KLQlyZXR1cm4gcmV0OworCXJldHVybiBUUlVFOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCmluZGV4IGU2NDFiYjIuLjExZGJkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKQEAgLTYyLDEwICs2Miw2IEBACiAjaW5jbHVkZSAidzgzOTc3YWYuaCIKICNpbmNsdWRlICJ3ODM5NzdhZl9pci5oIgogCi0jaWZkZWYgIENPTkZJR19BUkNIX05FVFdJTkRFUiAgICAgICAgICAgIC8qIEFkanVzdCB0byBOZXRXaW5kZXIgZGlmZmVyZW5jZXMgKi8KLSN1bmRlZiAgQ09ORklHX05FVFdJTkRFUl9UWF9ETUFfUFJPQkxFTVMgLyogTm90IG5lZWRlZCAqLwotI2RlZmluZSBDT05GSUdfTkVUV0lOREVSX1JYX0RNQV9QUk9CTEVNUyAvKiBNdXN0IGhhdmUgdGhpcyBvbmUhICovCi0jZW5kaWYKICNkZWZpbmUgQ09ORklHX1VTRV9XOTc3X1BOUCAgICAgICAgLyogQ3VycmVudGx5IG5lZWRlZCAqLwogI2RlZmluZSBQSU9fTUFYX1NQRUVEICAgICAgIDExNTIwMCAKIApAQCAtMzMyLDcgKzMyOCw3IEBACiAgCQl3OTc3X3dyaXRlX3JlZygweDc0LCBkbWErMSwgZWZiYXNlW2ldKTsKICNlbHNlCiAgCQl3OTc3X3dyaXRlX3JlZygweDc0LCBkbWEsIGVmYmFzZVtpXSk7ICAgCi0jZW5kaWYgLypDT05GSUdfQVJDSF9ORVRXSU5ERVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9ORVRXSU5ERVIgKi8KICAJCXc5Nzdfd3JpdGVfcmVnKDB4NzUsIDB4MDQsIGVmYmFzZVtpXSk7ICAvKiBEaXNhYmxlIFR4IERNQSAqLwogICAJCiAgCQkvKiBTZXQgYXBwZW5kIGhhcmR3YXJlIENSQywgZW5hYmxlIElSIGJhbmsgc2VsZWN0aW9uICovCQpAQCAtNTYzLDEwICs1NTksNiBAQAogc3RhdGljIHZvaWQgdzgzOTc3YWZfZG1hX3dyaXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgaW50IGlvYmFzZSkKIHsKIAlfX3U4IHNldDsKLSNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1RYX0RNQV9QUk9CTEVNUwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX191OCBoY3I7Ci0jZW5kaWYKICAgICAgICAgSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSVkXG4iLCBfX2Z1bmNfXyAsIHNlbGYtPnR4X2J1ZmYubGVuKTsKIAogCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KQEAgLTU3OSwzMCArNTcxLDEzIEBACiAJLyogQ2hvb3NlIHRyYW5zbWl0IERNQSBjaGFubmVsICAqLyAKIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOwogCW91dGIoQURDUjFfRF9DSFNXfC8qQURDUjFfRE1BX0Z8Ki9BRENSMV9BRFZfU0wsIGlvYmFzZStBRENSMSk7Ci0jaWZkZWYgQ09ORklHX05FVFdJTkRFUl9UWF9ETUFfUFJPQkxFTVMKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwotCi0JZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKLQljbGVhcl9kbWFfZmYoc2VsZi0+aW8uZG1hKTsKLQlzZXRfZG1hX21vZGUoc2VsZi0+aW8uZG1hLCBETUFfTU9ERV9SRUFEKTsKLQlzZXRfZG1hX2FkZHIoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmX2RtYSk7Ci0Jc2V0X2RtYV9jb3VudChzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmYubGVuKTsKLSNlbHNlCiAJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmX2RtYSwgc2VsZi0+dHhfYnVmZi5sZW4sCiAJCSAgICAgICBETUFfTU9ERV9XUklURSk7CQotI2VuZGlmCiAJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKIAkKIAkvKiBFbmFibGUgRE1BICovCiAgCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7Ci0jaWZkZWYgQ09ORklHX05FVFdJTkRFUl9UWF9ETUFfUFJPQkxFTVMKLQloY3IgPSBpbmIoaW9iYXNlK0hDUik7Ci0Jb3V0YihoY3IgfCBIQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKLQllbmFibGVfZG1hKHNlbGYtPmlvLmRtYSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwotI2Vsc2UJCiAJb3V0YihpbmIoaW9iYXNlK0hDUikgfCBIQ1JfRU5fRE1BIHwgSENSX1RYX1dULCBpb2Jhc2UrSENSKTsKLSNlbmRpZgogCiAJLyogUmVzdG9yZSBzZXQgcmVnaXN0ZXIgKi8KIAlvdXRiKHNldCwgaW9iYXNlK1NTUik7CkBAIC03MTEsNyArNjg2LDcgQEAKIHsKIAlpbnQgaW9iYXNlOwogCV9fdTggc2V0OwotI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfUlhfRE1BX1BST0JMRU1TCisjaWZkZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlfX3U4IGhjcjsKICNlbmRpZgpAQCAtNzM2LDcgKzcxMSw3IEBACiAJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKIAlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CiAKLSNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1JYX0RNQV9QUk9CTEVNUworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgogCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CiAKIAlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOwpAQCAtNzU5LDcgKzczNCw3IEBACiAJCiAJLyogRW5hYmxlIERNQSAqLwogCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7Ci0jaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKIAloY3IgPSBpbmIoaW9iYXNlK0hDUik7CiAJb3V0YihoY3IgfCBIQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKIAllbmFibGVfZG1hKHNlbGYtPmlvLmRtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggZDUzZTI5OS4uOTU4ZGYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtMzAsOCArMzAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfbWFjdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAKICNkZWZpbmUgTUFDVkxBTl9IQVNIX1NJWkUJKDEgPDwgQklUU19QRVJfQllURSkKIApAQCAtNDAsMTAgKzQyLDE5IEBACiAJc3RydWN0IGhsaXN0X2hlYWQJdmxhbl9oYXNoW01BQ1ZMQU5fSEFTSF9TSVpFXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXZsYW5zOwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OworCXN0cnVjdCBza19idWZmX2hlYWQJYmNfcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CWJjX3dvcms7CiAJYm9vbCAJCQlwYXNzdGhydTsKLQlpbnQJCQljb3VudDsKIH07CiAKKyNkZWZpbmUgTUFDVkxBTl9QT1JUX0lTX0VNUFRZKHBvcnQpICAgIGxpc3RfZW1wdHkoJnBvcnQtPnZsYW5zKQorCitzdHJ1Y3QgbWFjdmxhbl9za2JfY2IgeworCWNvbnN0IHN0cnVjdCBtYWN2bGFuX2RldiAqc3JjOworfTsKKworI2RlZmluZSBNQUNWTEFOX1NLQl9DQihfX3NrYikgKChzdHJ1Y3QgbWFjdmxhbl9za2JfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKwogc3RhdGljIHZvaWQgbWFjdmxhbl9wb3J0X2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIHN0YXRpYyBzdHJ1Y3QgbWFjdmxhbl9wb3J0ICptYWN2bGFuX3BvcnRfZ2V0X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTIwLDcgKzEzMSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZsYW4tPmRldjsKIAogCWlmIChsb2NhbCkKLQkJcmV0dXJuIGRldl9mb3J3YXJkX3NrYihkZXYsIHNrYik7CisJCXJldHVybiBfX2Rldl9mb3J3YXJkX3NrYihkZXYsIHNrYik7CiAKIAlza2ItPmRldiA9IGRldjsKIAlpZiAoZXRoZXJfYWRkcl9lcXVhbF82NGJpdHMoZXRoLT5oX2Rlc3QsIGRldi0+YnJvYWRjYXN0KSkKQEAgLTEyOCw3ICsxMzksNyBAQAogCWVsc2UKIAkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9NVUxUSUNBU1Q7CiAKLQlyZXR1cm4gbmV0aWZfcngoc2tiKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHUzMiBtYWN2bGFuX2hhc2hfbWl4KGNvbnN0IHN0cnVjdCBtYWN2bGFuX2RldiAqdmxhbikKQEAgLTE3NSwxMyArMTg2LDg3IEBACiAJCQlpZiAobGlrZWx5KG5za2IpKQogCQkJCWVyciA9IG1hY3ZsYW5fYnJvYWRjYXN0X29uZSgKIAkJCQkJbnNrYiwgdmxhbiwgZXRoLAotCQkJCQltb2RlID09IE1BQ1ZMQU5fTU9ERV9CUklER0UpOworCQkJCQltb2RlID09IE1BQ1ZMQU5fTU9ERV9CUklER0UpID86CisJCQkJICAgICAgbmV0aWZfcnhfbmkobnNrYik7CiAJCQltYWN2bGFuX2NvdW50X3J4KHZsYW4sIHNrYi0+bGVuICsgRVRIX0hMRU4sCiAJCQkJCSBlcnIgPT0gTkVUX1JYX1NVQ0NFU1MsIDEpOwogCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCBtYWN2bGFuX3Byb2Nlc3NfYnJvYWRjYXN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3sKKwlzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBtYWN2bGFuX3BvcnQsCisJCQkJCQkgYmNfd29yayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGxpc3Q7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsaXN0KTsKKworCXNwaW5fbG9ja19iaCgmcG9ydC0+YmNfcXVldWUubG9jayk7CisJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJnBvcnQtPmJjX3F1ZXVlLCAmbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnBvcnQtPmJjX3F1ZXVlLmxvY2spOworCisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZsaXN0KSkpIHsKKwkJY29uc3Qgc3RydWN0IG1hY3ZsYW5fZGV2ICpzcmMgPSBNQUNWTEFOX1NLQl9DQihza2IpLT5zcmM7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCisJCWlmICghc3JjKQorCQkJLyogZnJhbWUgY29tZXMgZnJvbSBhbiBleHRlcm5hbCBhZGRyZXNzICovCisJCQltYWN2bGFuX2Jyb2FkY2FzdChza2IsIHBvcnQsIE5VTEwsCisJCQkJCSAgTUFDVkxBTl9NT0RFX1BSSVZBVEUgfAorCQkJCQkgIE1BQ1ZMQU5fTU9ERV9WRVBBICAgIHwKKwkJCQkJICBNQUNWTEFOX01PREVfUEFTU1RIUlV8CisJCQkJCSAgTUFDVkxBTl9NT0RFX0JSSURHRSk7CisJCWVsc2UgaWYgKHNyYy0+bW9kZSA9PSBNQUNWTEFOX01PREVfVkVQQSkKKwkJCS8qIGZsb29kIHRvIGV2ZXJ5b25lIGV4Y2VwdCBzb3VyY2UgKi8KKwkJCW1hY3ZsYW5fYnJvYWRjYXN0KHNrYiwgcG9ydCwgc3JjLT5kZXYsCisJCQkJCSAgTUFDVkxBTl9NT0RFX1ZFUEEgfAorCQkJCQkgIE1BQ1ZMQU5fTU9ERV9CUklER0UpOworCQllbHNlCisJCQkvKgorCQkJICogZmxvb2Qgb25seSB0byBWRVBBIHBvcnRzLCBicmlkZ2UgcG9ydHMKKwkJCSAqIGFscmVhZHkgc2F3IHRoZSBmcmFtZSBvbiB0aGUgd2F5IG91dC4KKwkJCSAqLworCQkJbWFjdmxhbl9icm9hZGNhc3Qoc2tiLCBwb3J0LCBzcmMtPmRldiwKKwkJCQkJICBNQUNWTEFOX01PREVfVkVQQSk7CisKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtYWN2bGFuX2Jyb2FkY2FzdF9lbnF1ZXVlKHN0cnVjdCBtYWN2bGFuX3BvcnQgKnBvcnQsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCW5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5za2IpCisJCWdvdG8gZXJyOworCisJc3Bpbl9sb2NrKCZwb3J0LT5iY19xdWV1ZS5sb2NrKTsKKwlpZiAoc2tiX3F1ZXVlX2xlbigmcG9ydC0+YmNfcXVldWUpIDwgc2tiLT5kZXYtPnR4X3F1ZXVlX2xlbikgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZwb3J0LT5iY19xdWV1ZSwgbnNrYik7CisJCWVyciA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZwb3J0LT5iY19xdWV1ZS5sb2NrKTsKKworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9uc2tiOworCisJc2NoZWR1bGVfd29yaygmcG9ydC0+YmNfd29yayk7CisJcmV0dXJuOworCitmcmVlX25za2I6CisJa2ZyZWVfc2tiKG5za2IpOworZXJyOgorCWF0b21pY19sb25nX2luYygmc2tiLT5kZXYtPnJ4X2Ryb3BwZWQpOworfQorCiAvKiBjYWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jaygpIGZyb20gbmV0aWZfcmVjZWl2ZV9za2IgKi8KIHN0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IG1hY3ZsYW5faGFuZGxlX2ZyYW1lKHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKQEAgLTIwMSwzMiArMjg2LDE4IEBACiAJCQlyZXR1cm4gUlhfSEFORExFUl9DT05TVU1FRDsKIAkJZXRoID0gZXRoX2hkcihza2IpOwogCQlzcmMgPSBtYWN2bGFuX2hhc2hfbG9va3VwKHBvcnQsIGV0aC0+aF9zb3VyY2UpOwotCQlpZiAoIXNyYykKLQkJCS8qIGZyYW1lIGNvbWVzIGZyb20gYW4gZXh0ZXJuYWwgYWRkcmVzcyAqLwotCQkJbWFjdmxhbl9icm9hZGNhc3Qoc2tiLCBwb3J0LCBOVUxMLAotCQkJCQkgIE1BQ1ZMQU5fTU9ERV9QUklWQVRFIHwKLQkJCQkJICBNQUNWTEFOX01PREVfVkVQQSAgICB8Ci0JCQkJCSAgTUFDVkxBTl9NT0RFX1BBU1NUSFJVfAotCQkJCQkgIE1BQ1ZMQU5fTU9ERV9CUklER0UpOwotCQllbHNlIGlmIChzcmMtPm1vZGUgPT0gTUFDVkxBTl9NT0RFX1ZFUEEpCi0JCQkvKiBmbG9vZCB0byBldmVyeW9uZSBleGNlcHQgc291cmNlICovCi0JCQltYWN2bGFuX2Jyb2FkY2FzdChza2IsIHBvcnQsIHNyYy0+ZGV2LAotCQkJCQkgIE1BQ1ZMQU5fTU9ERV9WRVBBIHwKLQkJCQkJICBNQUNWTEFOX01PREVfQlJJREdFKTsKLQkJZWxzZSBpZiAoc3JjLT5tb2RlID09IE1BQ1ZMQU5fTU9ERV9CUklER0UpCi0JCQkvKgotCQkJICogZmxvb2Qgb25seSB0byBWRVBBIHBvcnRzLCBicmlkZ2UgcG9ydHMKLQkJCSAqIGFscmVhZHkgc2F3IHRoZSBmcmFtZSBvbiB0aGUgd2F5IG91dC4KLQkJCSAqLwotCQkJbWFjdmxhbl9icm9hZGNhc3Qoc2tiLCBwb3J0LCBzcmMtPmRldiwKLQkJCQkJICBNQUNWTEFOX01PREVfVkVQQSk7Ci0JCWVsc2UgeworCQlpZiAoc3JjICYmIHNyYy0+bW9kZSAhPSBNQUNWTEFOX01PREVfVkVQQSAmJgorCQkgICAgc3JjLT5tb2RlICE9IE1BQ1ZMQU5fTU9ERV9CUklER0UpIHsKIAkJCS8qIGZvcndhcmQgdG8gb3JpZ2luYWwgcG9ydC4gKi8KIAkJCXZsYW4gPSBzcmM7Ci0JCQlyZXQgPSBtYWN2bGFuX2Jyb2FkY2FzdF9vbmUoc2tiLCB2bGFuLCBldGgsIDApOworCQkJcmV0ID0gbWFjdmxhbl9icm9hZGNhc3Rfb25lKHNrYiwgdmxhbiwgZXRoLCAwKSA/OgorCQkJICAgICAgbmV0aWZfcngoc2tiKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJTUFDVkxBTl9TS0JfQ0Ioc2tiKS0+c3JjID0gc3JjOworCQltYWN2bGFuX2Jyb2FkY2FzdF9lbnF1ZXVlKHBvcnQsIHNrYik7CisKIAkJcmV0dXJuIFJYX0hBTkRMRVJfUEFTUzsKIAl9CiAKQEAgLTI4NywxMiArMzU4LDI2IEBACiAJcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgbmV0ZGV2X3R4X3QgbWFjdmxhbl9uZXRwb2xsX3NlbmRfc2tiKHN0cnVjdCBtYWN2bGFuX2RldiAqdmxhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWlmICh2bGFuLT5uZXRwb2xsKQorCQluZXRwb2xsX3NlbmRfc2tiKHZsYW4tPm5ldHBvbGwsIHNrYik7CisjZWxzZQorCUJVRygpOworI2VuZGlmCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKwogc3RhdGljIG5ldGRldl90eF90IG1hY3ZsYW5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOwogCWludCByZXQ7Ci0JY29uc3Qgc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWFjdmxhbl9kZXYgKnZsYW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhkZXYpKSkKKwkJcmV0dXJuIG1hY3ZsYW5fbmV0cG9sbF9zZW5kX3NrYih2bGFuLCBza2IpOwogCiAJaWYgKHZsYW4tPmZ3ZF9wcml2KSB7CiAJCXNrYi0+ZGV2ID0gdmxhbi0+bG93ZXJkZXY7CkBAIC00MjQsMzMgKzUwOSw0NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1hY3ZsYW5fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCitzdGF0aWMgaW50IG1hY3ZsYW5fc3luY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCiB7CiAJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJkZXYgPSB2bGFuLT5sb3dlcmRldjsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwogCWludCBlcnI7CiAKKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkvKiBKdXN0IGNvcHkgaW4gdGhlIG5ldyBhZGRyZXNzICovCisJCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCBhZGRyKTsKKwl9IGVsc2UgeworCQkvKiBSZWhhc2ggYW5kIHVwZGF0ZSB0aGUgZGV2aWNlIGZpbHRlcnMgKi8KKwkJaWYgKG1hY3ZsYW5fYWRkcl9idXN5KHZsYW4tPnBvcnQsIGFkZHIpKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoIXZsYW4tPnBvcnQtPnBhc3N0aHJ1KSB7CisJCQllcnIgPSBkZXZfdWNfYWRkKGxvd2VyZGV2LCBhZGRyKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJZGV2X3VjX2RlbChsb3dlcmRldiwgZGV2LT5kZXZfYWRkcik7CisJCX0KKworCQltYWN2bGFuX2hhc2hfY2hhbmdlX2FkZHIodmxhbiwgYWRkcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY3ZsYW5fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAKLQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQkvKiBKdXN0IGNvcHkgaW4gdGhlIG5ldyBhZGRyZXNzICovCi0JCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0JfSBlbHNlIHsKLQkJLyogUmVoYXNoIGFuZCB1cGRhdGUgdGhlIGRldmljZSBmaWx0ZXJzICovCi0JCWlmIChtYWN2bGFuX2FkZHJfYnVzeSh2bGFuLT5wb3J0LCBhZGRyLT5zYV9kYXRhKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJZXJyID0gZGV2X3VjX2FkZChsb3dlcmRldiwgYWRkci0+c2FfZGF0YSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWRldl91Y19kZWwobG93ZXJkZXYsIGRldi0+ZGV2X2FkZHIpOwotCi0JCW1hY3ZsYW5faGFzaF9jaGFuZ2VfYWRkcih2bGFuLCBhZGRyLT5zYV9kYXRhKTsKKwlpZiAodmxhbi0+bW9kZSA9PSBNQUNWTEFOX01PREVfUEFTU1RIUlUpIHsKKwkJZGV2X3NldF9tYWNfYWRkcmVzcyh2bGFuLT5sb3dlcmRldiwgYWRkcik7CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gMDsKKworCXJldHVybiBtYWN2bGFuX3N5bmNfYWRkcmVzcyhkZXYsIGFkZHItPnNhX2RhdGEpOwogfQogCiBzdGF0aWMgdm9pZCBtYWN2bGFuX2NoYW5nZV9yeF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbmdlKQpAQCAtNTY3LDggKzY2Niw3IEBACiAKIAlmcmVlX3BlcmNwdSh2bGFuLT5wY3B1X3N0YXRzKTsKIAotCXBvcnQtPmNvdW50IC09IDE7Ci0JaWYgKCFwb3J0LT5jb3VudCkKKwlpZiAoTUFDVkxBTl9QT1JUX0lTX0VNUFRZKHBvcnQpKQogCQltYWN2bGFuX3BvcnRfZGVzdHJveShwb3J0LT5kZXYpOwogfQogCkBAIC03MDUsNiArODAzLDUwIEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIG1hY3ZsYW5fZGV2X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBtYWN2bGFuX2Rldl9uZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRwb2xsX2luZm8gKm5waW5mbykKK3sKKwlzdHJ1Y3QgbWFjdmxhbl9kZXYgKnZsYW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW4tPmxvd2VyZGV2OworCXN0cnVjdCBuZXRwb2xsICpuZXRwb2xsOworCWludCBlcnIgPSAwOworCisJbmV0cG9sbCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXRwb2xsKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIW5ldHBvbGwpCisJCWdvdG8gb3V0OworCisJZXJyID0gX19uZXRwb2xsX3NldHVwKG5ldHBvbGwsIHJlYWxfZGV2KTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG5ldHBvbGwpOworCQlnb3RvIG91dDsKKwl9CisKKwl2bGFuLT5uZXRwb2xsID0gbmV0cG9sbDsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG1hY3ZsYW5fZGV2X25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWN2bGFuX2RldiAqdmxhbiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHBvbGwgKm5ldHBvbGwgPSB2bGFuLT5uZXRwb2xsOworCisJaWYgKCFuZXRwb2xsKQorCQlyZXR1cm47CisKKwl2bGFuLT5uZXRwb2xsID0gTlVMTDsKKworCV9fbmV0cG9sbF9mcmVlX2FzeW5jKG5ldHBvbGwpOworfQorI2VuZGlmCS8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbWFjdmxhbl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3NldHRpbmdzCQk9IG1hY3ZsYW5fZXRodG9vbF9nZXRfc2V0dGluZ3MsCkBAIC03MzAsNiArODcyLDExIEBACiAJLm5kb19mZGJfZGVsCQk9IG1hY3ZsYW5fZmRiX2RlbCwKIAkubmRvX2ZkYl9kdW1wCQk9IG5kb19kZmx0X2ZkYl9kdW1wLAogCS5uZG9fZ2V0X2xvY2tfc3ViY2xhc3MgID0gbWFjdmxhbl9nZXRfbmVzdF9sZXZlbCwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gbWFjdmxhbl9kZXZfcG9sbF9jb250cm9sbGVyLAorCS5uZG9fbmV0cG9sbF9zZXR1cAk9IG1hY3ZsYW5fZGV2X25ldHBvbGxfc2V0dXAsCisJLm5kb19uZXRwb2xsX2NsZWFudXAJPSBtYWN2bGFuX2Rldl9uZXRwb2xsX2NsZWFudXAsCisjZW5kaWYKIH07CiAKIHZvaWQgbWFjdmxhbl9jb21tb25fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTc3MCw2ICs5MTcsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBNQUNWTEFOX0hBU0hfU0laRTsgaSsrKQogCQlJTklUX0hMSVNUX0hFQUQoJnBvcnQtPnZsYW5faGFzaFtpXSk7CiAKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwb3J0LT5iY19xdWV1ZSk7CisJSU5JVF9XT1JLKCZwb3J0LT5iY193b3JrLCBtYWN2bGFuX3Byb2Nlc3NfYnJvYWRjYXN0KTsKKwogCWVyciA9IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKGRldiwgbWFjdmxhbl9oYW5kbGVfZnJhbWUsIHBvcnQpOwogCWlmIChlcnIpCiAJCWtmcmVlKHBvcnQpOwpAQCAtNzgyLDYgKzkzMiw3IEBACiB7CiAJc3RydWN0IG1hY3ZsYW5fcG9ydCAqcG9ydCA9IG1hY3ZsYW5fcG9ydF9nZXRfcnRubChkZXYpOwogCisJY2FuY2VsX3dvcmtfc3luYygmcG9ydC0+YmNfd29yayk7CiAJZGV2LT5wcml2X2ZsYWdzICY9IH5JRkZfTUFDVkxBTl9QT1JUOwogCW5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIoZGV2KTsKIAlrZnJlZV9yY3UocG9ydCwgcmN1KTsKQEAgLTg2OCwxMyArMTAxOSwxMiBAQAogCQl2bGFuLT5mbGFncyA9IG5sYV9nZXRfdTE2KGRhdGFbSUZMQV9NQUNWTEFOX0ZMQUdTXSk7CiAKIAlpZiAodmxhbi0+bW9kZSA9PSBNQUNWTEFOX01PREVfUEFTU1RIUlUpIHsKLQkJaWYgKHBvcnQtPmNvdW50KQorCQlpZiAoIU1BQ1ZMQU5fUE9SVF9JU19FTVBUWShwb3J0KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlwb3J0LT5wYXNzdGhydSA9IHRydWU7CiAJCWV0aF9od19hZGRyX2luaGVyaXQoZGV2LCBsb3dlcmRldik7CiAJfQogCi0JcG9ydC0+Y291bnQgKz0gMTsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBkZXN0cm95X3BvcnQ7CkBAIC04OTIsOCArMTA0Miw3IEBACiB1bnJlZ2lzdGVyX25ldGRldjoKIAl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOwogZGVzdHJveV9wb3J0OgotCXBvcnQtPmNvdW50IC09IDE7Ci0JaWYgKCFwb3J0LT5jb3VudCkKKwlpZiAoTUFDVkxBTl9QT1JUX0lTX0VNUFRZKHBvcnQpKQogCQltYWN2bGFuX3BvcnRfZGVzdHJveShsb3dlcmRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTAyOCw2ICsxMTc3LDI1IEBACiAJCQluZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKHZsYW4tPmRldik7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZwb3J0LT52bGFucywgbGlzdCkgeworCQkJaWYgKHZsYW4tPmRldi0+bXR1IDw9IGRldi0+bXR1KQorCQkJCWNvbnRpbnVlOworCQkJZGV2X3NldF9tdHUodmxhbi0+ZGV2LCBkZXYtPm10dSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJaWYgKCFwb3J0LT5wYXNzdGhydSkKKwkJCXJldHVybiBOT1RJRllfRE9ORTsKKworCQl2bGFuID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZwb3J0LT52bGFucywKKwkJCQkJCXN0cnVjdCBtYWN2bGFuX2RldiwKKwkJCQkJCWxpc3QpOworCisJCWlmIChtYWN2bGFuX3N5bmNfYWRkcmVzcyh2bGFuLT5kZXYsIGRldi0+ZGV2X2FkZHIpKQorCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJYnJlYWs7CiAJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKIAkJLyogdHdpZGRsZSB0aHVtYnMgb24gbmV0bnMgZGV2aWNlIG1vdmVzICovCiAJCWlmIChkZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfVU5SRUdJU1RFUklORykKQEAgLTEwMzYsMTEgKzEyMDQsMTcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW4sIG5leHQsICZwb3J0LT52bGFucywgbGlzdCkKIAkJCXZsYW4tPmRldi0+cnRubF9saW5rX29wcy0+ZGVsbGluayh2bGFuLT5kZXYsICZsaXN0X2tpbGwpOwogCQl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZsaXN0X2tpbGwpOwotCQlsaXN0X2RlbCgmbGlzdF9raWxsKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfUFJFX1RZUEVfQ0hBTkdFOgogCQkvKiBGb3JiaWQgdW5kZXJsYXlpbmcgZGV2aWNlIHRvIGNoYW5nZSBpdHMgdHlwZS4gKi8KIAkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwljYXNlIE5FVERFVl9OT1RJRllfUEVFUlM6CisJY2FzZSBORVRERVZfQk9ORElOR19GQUlMT1ZFUjoKKwljYXNlIE5FVERFVl9SRVNFTkRfSUdNUDoKKwkJLyogUHJvcGFnYXRlIHRvIGFsbCB2bGFucyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZwb3J0LT52bGFucywgbGlzdCkKKwkJCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhldmVudCwgdmxhbi0+ZGV2KTsKIAl9CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnRiX25ldGRldi5jIGIvZHJpdmVycy9uZXQvbnRiX25ldGRldi5jCmluZGV4IDYzYWE5ZDkuLjVhN2U2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L250Yl9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9udGJfbmV0ZGV2LmMKQEAgLTI5OCw3ICsyOTgsNiBAQAogewogCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0JhY2twbGFuZTsKIAljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9CYWNrcGxhbmU7Ci0JY21kLT5zcGVlZCA9IFNQRUVEX1VOS05PV047CiAJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfVU5LTk9XTik7CiAJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAljbWQtPnBvcnQgPSBQT1JUX09USEVSOwpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBuZGV2LT5wZXJtX2FkZHIsIG5kZXYtPmFkZHJfbGVuKTsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmbnRiX25ldGRldl9vcHM7Ci0JU0VUX0VUSFRPT0xfT1BTKG5kZXYsICZudGJfZXRodG9vbF9vcHMpOworCW5kZXYtPmV0aHRvb2xfb3BzID0gJm50Yl9ldGh0b29sX29wczsKIAogCWRldi0+cXAgPSBudGJfdHJhbnNwb3J0X2NyZWF0ZV9xdWV1ZShuZGV2LCBwZGV2LCAmbnRiX25ldGRldl9oYW5kbGVycyk7CiAJaWYgKCFkZXYtPnFwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCmluZGV4IDZhMTdmOTIuLjY1ZGUwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCkBAIC0yNCw2ICsyNCwxMiBAQAogCS0tLWhlbHAtLS0KIAkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgYW03OWM4NzQKIAorY29uZmlnIEFNRF9YR0JFX1BIWQorCXRyaXN0YXRlICJEcml2ZXIgZm9yIHRoZSBBTUQgMTBHYkUgKGFtZC14Z2JlKSBQSFlzIgorCWRlcGVuZHMgb24gT0YKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFNRCAxMEdiRSBQSFkKKwogY29uZmlnIE1BUlZFTExfUEhZCiAJdHJpc3RhdGUgIkRyaXZlcnMgZm9yIE1hcnZlbGwgUEhZcyIKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKaW5kZXggMDdkMjQwMi4uN2RjM2Q1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQpAQCAtMzMsMyArMzMsNCBAQAogb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9NTUlPUkVHKSArPSBtZGlvLW11eC1tbWlvcmVnLm8KIG9iai0kKENPTkZJR19NRElPX1NVTjRJKQkrPSBtZGlvLXN1bjRpLm8KIG9iai0kKENPTkZJR19NRElPX01PWEFSVCkJKz0gbWRpby1tb3hhcnQubworb2JqLSQoQ09ORklHX0FNRF9YR0JFX1BIWSkJKz0gYW1kLXhnYmUtcGh5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9hbWQteGdiZS1waHkuYyBiL2RyaXZlcnMvbmV0L3BoeS9hbWQteGdiZS1waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdjMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGh5L2FtZC14Z2JlLXBoeS5jCkBAIC0wLDAgKzEsMTM1NyBAQAorLyoKKyAqIEFNRCAxMEdiIEV0aGVybmV0IFBIWSBkcml2ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgZm9sbG93aW5nIHR3bworICogbGljZW5zZXM6CisgKgorICogTGljZW5zZSAxOiBHUEx2MgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgY29weSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqCisgKiBMaWNlbnNlIDI6IE1vZGlmaWVkIEJTRAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKworTU9EVUxFX0FVVEhPUigiVG9tIExlbmRhY2t5IDx0aG9tYXMubGVuZGFja3lAYW1kLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAuMC1hIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFNRCAxMEdiRSAoYW1kLXhnYmUpIFBIWSBkcml2ZXIiKTsKKworI2RlZmluZSBYR0JFX1BIWV9JRAkweDAwMDE2MmQwCisjZGVmaW5lIFhHQkVfUEhZX01BU0sJMHhmZmZmZmZmMAorCisjZGVmaW5lIFhHQkVfQU5fSU5UX0NNUExUCQkweDAxCisjZGVmaW5lIFhHQkVfQU5fSU5DX0xJTksJCTB4MDIKKyNkZWZpbmUgWEdCRV9BTl9QR19SQ1YJCQkweDA0CisKKyNkZWZpbmUgWE5QX01DRl9OVUxMX01FU1NBR0UJCTB4MDAxCisjZGVmaW5lIFhOUF9BQ0tfUFJPQ0VTU0VECQkoMSA8PCAxMikKKyNkZWZpbmUgWE5QX01QX0ZPUk1BVFRFRAkJKDEgPDwgMTMpCisjZGVmaW5lIFhOUF9OUF9FWENIQU5HRQkJCSgxIDw8IDE1KQorCisjaWZuZGVmIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMCisjZGVmaW5lIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMCQkweDAwOTYKKyNlbmRpZgorI2lmbmRlZiBNRElPX1BNQV8xMEdCUl9GRUNfQ1RSTAorI2RlZmluZSBNRElPX1BNQV8xMEdCUl9GRUNfQ1RSTAkJMHgwMGFiCisjZW5kaWYKKyNpZm5kZWYgTURJT19BTl9YTlAKKyNkZWZpbmUgTURJT19BTl9YTlAJCQkweDAwMTYKKyNlbmRpZgorCisjaWZuZGVmIE1ESU9fQU5fSU5UTUFTSworI2RlZmluZSBNRElPX0FOX0lOVE1BU0sJCQkweDgwMDEKKyNlbmRpZgorI2lmbmRlZiBNRElPX0FOX0lOVAorI2RlZmluZSBNRElPX0FOX0lOVAkJCTB4ODAwMgorI2VuZGlmCisKKyNpZm5kZWYgTURJT19DVFJMMV9TUEVFRDFHCisjZGVmaW5lIE1ESU9fQ1RSTDFfU1BFRUQxRwkJKE1ESU9fQ1RSTDFfU1BFRUQxMEcgJiB+Qk1DUl9TUEVFRDEwMCkKKyNlbmRpZgorCisvKiBTZXJEZXMgaW50ZWdyYXRpb24gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBTSVIwX1NUQVRVUwkJCTB4MDA0MAorI2RlZmluZSBTSVIxX1NQRUVECQkJMHgwMDAwCisKKy8qIFNlckRlcyBpbnRlZ3JhdGlvbiByZWdpc3RlciBlbnRyeSBiaXQgcG9zaXRpb25zIGFuZCBzaXplcyAqLworI2RlZmluZSBTSVIwX1NUQVRVU19SWF9SRUFEWV9JTkRFWAkwCisjZGVmaW5lIFNJUjBfU1RBVFVTX1JYX1JFQURZX1dJRFRICTEKKyNkZWZpbmUgU0lSMF9TVEFUVVNfVFhfUkVBRFlfSU5ERVgJOAorI2RlZmluZSBTSVIwX1NUQVRVU19UWF9SRUFEWV9XSURUSAkxCisjZGVmaW5lIFNJUjFfU1BFRURfREFUQVJBVEVfSU5ERVgJNAorI2RlZmluZSBTSVIxX1NQRUVEX0RBVEFSQVRFX1dJRFRICTIKKyNkZWZpbmUgU0lSMV9TUEVFRF9QSV9TUERfU0VMX0lOREVYCTEyCisjZGVmaW5lIFNJUjFfU1BFRURfUElfU1BEX1NFTF9XSURUSAk0CisjZGVmaW5lIFNJUjFfU1BFRURfUExMU0VMX0lOREVYCQkzCisjZGVmaW5lIFNJUjFfU1BFRURfUExMU0VMX1dJRFRICQkxCisjZGVmaW5lIFNJUjFfU1BFRURfUkFURUNIQU5HRV9JTkRFWAk2CisjZGVmaW5lIFNJUjFfU1BFRURfUkFURUNIQU5HRV9XSURUSAkxCisjZGVmaW5lIFNJUjFfU1BFRURfVFhBTVBfSU5ERVgJCTgKKyNkZWZpbmUgU0lSMV9TUEVFRF9UWEFNUF9XSURUSAkJNAorI2RlZmluZSBTSVIxX1NQRUVEX1dPUkRNT0RFX0lOREVYCTAKKyNkZWZpbmUgU0lSMV9TUEVFRF9XT1JETU9ERV9XSURUSAkzCisKKyNkZWZpbmUgU1BFRURfMTAwMDBfQ0RSCQkJMHg3CisjZGVmaW5lIFNQRUVEXzEwMDAwX1BMTAkJCTB4MQorI2RlZmluZSBTUEVFRF8xMDAwMF9SQVRFCQkweDAKKyNkZWZpbmUgU1BFRURfMTAwMDBfVFhBTVAJCTB4YQorI2RlZmluZSBTUEVFRF8xMDAwMF9XT1JECQkweDcKKworI2RlZmluZSBTUEVFRF8yNTAwX0NEUgkJCTB4MgorI2RlZmluZSBTUEVFRF8yNTAwX1BMTAkJCTB4MAorI2RlZmluZSBTUEVFRF8yNTAwX1JBVEUJCQkweDIKKyNkZWZpbmUgU1BFRURfMjUwMF9UWEFNUAkJMHhmCisjZGVmaW5lIFNQRUVEXzI1MDBfV09SRAkJCTB4MQorCisjZGVmaW5lIFNQRUVEXzEwMDBfQ0RSCQkJMHgyCisjZGVmaW5lIFNQRUVEXzEwMDBfUExMCQkJMHgwCisjZGVmaW5lIFNQRUVEXzEwMDBfUkFURQkJCTB4MworI2RlZmluZSBTUEVFRF8xMDAwX1RYQU1QCQkweGYKKyNkZWZpbmUgU1BFRURfMTAwMF9XT1JECQkJMHgxCisKKworLyogU2VyRGVzIFJ4VHggcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBSWFRYX1JFRzIwCQkJMHgwMDUwCisjZGVmaW5lIFJYVFhfUkVHMTE0CQkJMHgwMWM4CisKKy8qIFNlckRlcyBSeFR4IHJlZ2lzdGVyIGVudHJ5IGJpdCBwb3NpdGlvbnMgYW5kIHNpemVzICovCisjZGVmaW5lIFJYVFhfUkVHMjBfQkxXQ19FTkFfSU5ERVgJMgorI2RlZmluZSBSWFRYX1JFRzIwX0JMV0NfRU5BX1dJRFRICTEKKyNkZWZpbmUgUlhUWF9SRUcxMTRfUFFfUkVHX0lOREVYCTkKKyNkZWZpbmUgUlhUWF9SRUcxMTRfUFFfUkVHX1dJRFRICTcKKworI2RlZmluZSBSWFRYXzEwMDAwX0JMV0MJCQkwCisjZGVmaW5lIFJYVFhfMTAwMDBfUFEJCQkweDFlCisKKyNkZWZpbmUgUlhUWF8yNTAwX0JMV0MJCQkxCisjZGVmaW5lIFJYVFhfMjUwMF9QUQkJCTB4YQorCisjZGVmaW5lIFJYVFhfMTAwMF9CTFdDCQkJMQorI2RlZmluZSBSWFRYXzEwMDBfUFEJCQkweGEKKworLyogQml0IHNldHRpbmcgYW5kIGdldHRpbmcgbWFjcm9zCisgKiAgVGhlIGdldCBtYWNybyB3aWxsIGV4dHJhY3QgdGhlIGN1cnJlbnQgYml0IGZpZWxkIHZhbHVlIGZyb20gd2l0aGluCisgKiAgdGhlIHZhcmlhYmxlCisgKgorICogIFRoZSBzZXQgbWFjcm8gd2lsbCBjbGVhciB0aGUgY3VycmVudCBiaXQgZmllbGQgdmFsdWUgd2l0aGluIHRoZQorICogIHZhcmlhYmxlIGFuZCB0aGVuIHNldCB0aGUgYml0IGZpZWxkIG9mIHRoZSB2YXJpYWJsZSB0byB0aGUKKyAqICBzcGVjaWZpZWQgdmFsdWUKKyAqLworI2RlZmluZSBHRVRfQklUUyhfdmFyLCBfaW5kZXgsIF93aWR0aCkJCQkJCVwKKwkoKChfdmFyKSA+PiAoX2luZGV4KSkgJiAoKDB4MSA8PCAoX3dpZHRoKSkgLSAxKSkKKworI2RlZmluZSBTRVRfQklUUyhfdmFyLCBfaW5kZXgsIF93aWR0aCwgX3ZhbCkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwkoX3ZhcikgJj0gfigoKDB4MSA8PCAoX3dpZHRoKSkgLSAxKSA8PCAoX2luZGV4KSk7CQlcCisJKF92YXIpIHw9ICgoKF92YWwpICYgKCgweDEgPDwgKF93aWR0aCkpIC0gMSkpIDw8IChfaW5kZXgpKTsJXAorfSB3aGlsZSAoMCkKKworLyogTWFjcm9zIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgU2VyRGVzIGludGVncmF0aW9uIHJlZ2lzdGVycworICogIFRoZSBpb3JlYWQgbWFjcm9zIHdpbGwgZ2V0IGJpdCBmaWVsZHMgb3IgZnVsbCB2YWx1ZXMgdXNpbmcgdGhlCisgKiAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9ybWVkIHVzaW5nIHRoZSBpbnB1dCBuYW1lcworICoKKyAqICBUaGUgaW93cml0ZSBtYWNyb3Mgd2lsbCBzZXQgYml0IGZpZWxkcyBvciBmdWxsIHZhbHVlcyB1c2luZyB0aGUKKyAqICByZWdpc3RlciBkZWZpbml0aW9ucyBmb3JtZWQgdXNpbmcgdGhlIGlucHV0IG5hbWVzCisgKi8KKyNkZWZpbmUgWFNJUjBfSU9SRUFEKF9wcml2LCBfcmVnKQkJCQkJXAorCWlvcmVhZDE2KChfcHJpdiktPnNpcjBfcmVncyArIF9yZWcpCisKKyNkZWZpbmUgWFNJUjBfSU9SRUFEX0JJVFMoX3ByaXYsIF9yZWcsIF9maWVsZCkJCQkJXAorCUdFVF9CSVRTKFhTSVIwX0lPUkVBRCgoX3ByaXYpLCBfcmVnKSwJCQkJXAorCQkgX3JlZyMjXyMjX2ZpZWxkIyNfSU5ERVgsCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX1dJRFRIKQorCisjZGVmaW5lIFhTSVIwX0lPV1JJVEUoX3ByaXYsIF9yZWcsIF92YWwpCQkJCVwKKwlpb3dyaXRlMTYoKF92YWwpLCAoX3ByaXYpLT5zaXIwX3JlZ3MgKyBfcmVnKQorCisjZGVmaW5lIFhTSVIwX0lPV1JJVEVfQklUUyhfcHJpdiwgX3JlZywgX2ZpZWxkLCBfdmFsKQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdTE2IHJlZ192YWwgPSBYU0lSMF9JT1JFQUQoKF9wcml2KSwgX3JlZyk7CQkJXAorCVNFVF9CSVRTKHJlZ192YWwsCQkJCQkJXAorCQkgX3JlZyMjXyMjX2ZpZWxkIyNfSU5ERVgsCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX1dJRFRILCAoX3ZhbCkpOwkJCVwKKwlYU0lSMF9JT1dSSVRFKChfcHJpdiksIF9yZWcsIHJlZ192YWwpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFhTSVIxX0lPUkVBRChfcHJpdiwgX3JlZykJCQkJCVwKKwlpb3JlYWQxNigoX3ByaXYpLT5zaXIxX3JlZ3MgKyBfcmVnKQorCisjZGVmaW5lIFhTSVIxX0lPUkVBRF9CSVRTKF9wcml2LCBfcmVnLCBfZmllbGQpCQkJCVwKKwlHRVRfQklUUyhYU0lSMV9JT1JFQUQoKF9wcml2KSwgX3JlZyksCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCkKKworI2RlZmluZSBYU0lSMV9JT1dSSVRFKF9wcml2LCBfcmVnLCBfdmFsKQkJCQlcCisJaW93cml0ZTE2KChfdmFsKSwgKF9wcml2KS0+c2lyMV9yZWdzICsgX3JlZykKKworI2RlZmluZSBYU0lSMV9JT1dSSVRFX0JJVFMoX3ByaXYsIF9yZWcsIF9maWVsZCwgX3ZhbCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXUxNiByZWdfdmFsID0gWFNJUjFfSU9SRUFEKChfcHJpdiksIF9yZWcpOwkJCVwKKwlTRVRfQklUUyhyZWdfdmFsLAkJCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCwgKF92YWwpKTsJCQlcCisJWFNJUjFfSU9XUklURSgoX3ByaXYpLCBfcmVnLCByZWdfdmFsKTsJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKiBNYWNyb3MgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBTZXJEZXMgUnhUeCByZWdpc3RlcnMKKyAqICBUaGUgaW9yZWFkIG1hY3JvcyB3aWxsIGdldCBiaXQgZmllbGRzIG9yIGZ1bGwgdmFsdWVzIHVzaW5nIHRoZQorICogIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvcm1lZCB1c2luZyB0aGUgaW5wdXQgbmFtZXMKKyAqCisgKiAgVGhlIGlvd3JpdGUgbWFjcm9zIHdpbGwgc2V0IGJpdCBmaWVsZHMgb3IgZnVsbCB2YWx1ZXMgdXNpbmcgdGhlCisgKiAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9ybWVkIHVzaW5nIHRoZSBpbnB1dCBuYW1lcworICovCisjZGVmaW5lIFhSWFRYX0lPUkVBRChfcHJpdiwgX3JlZykJCQkJCVwKKwlpb3JlYWQxNigoX3ByaXYpLT5yeHR4X3JlZ3MgKyBfcmVnKQorCisjZGVmaW5lIFhSWFRYX0lPUkVBRF9CSVRTKF9wcml2LCBfcmVnLCBfZmllbGQpCQkJCVwKKwlHRVRfQklUUyhYUlhUWF9JT1JFQUQoKF9wcml2KSwgX3JlZyksCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCkKKworI2RlZmluZSBYUlhUWF9JT1dSSVRFKF9wcml2LCBfcmVnLCBfdmFsKQkJCQlcCisJaW93cml0ZTE2KChfdmFsKSwgKF9wcml2KS0+cnh0eF9yZWdzICsgX3JlZykKKworI2RlZmluZSBYUlhUWF9JT1dSSVRFX0JJVFMoX3ByaXYsIF9yZWcsIF9maWVsZCwgX3ZhbCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXUxNiByZWdfdmFsID0gWFJYVFhfSU9SRUFEKChfcHJpdiksIF9yZWcpOwkJCVwKKwlTRVRfQklUUyhyZWdfdmFsLAkJCQkJCVwKKwkJIF9yZWcjI18jI19maWVsZCMjX0lOREVYLAkJCQlcCisJCSBfcmVnIyNfIyNfZmllbGQjI19XSURUSCwgKF92YWwpKTsJCQlcCisJWFJYVFhfSU9XUklURSgoX3ByaXYpLCBfcmVnLCByZWdfdmFsKTsJCQkJXAorfSB3aGlsZSAoMCkKKworCitlbnVtIGFtZF94Z2JlX3BoeV9hbiB7CisJQU1EX1hHQkVfQU5fUkVBRFkgPSAwLAorCUFNRF9YR0JFX0FOX1NUQVJULAorCUFNRF9YR0JFX0FOX0VWRU5ULAorCUFNRF9YR0JFX0FOX1BBR0VfUkVDRUlWRUQsCisJQU1EX1hHQkVfQU5fSU5DT01QQVRfTElOSywKKwlBTURfWEdCRV9BTl9DT01QTEVURSwKKwlBTURfWEdCRV9BTl9OT19MSU5LLAorCUFNRF9YR0JFX0FOX0VYSVQsCisJQU1EX1hHQkVfQU5fRVJST1IsCit9OworCitlbnVtIGFtZF94Z2JlX3BoeV9yeCB7CisJQU1EX1hHQkVfUlhfUkVBRFkgPSAwLAorCUFNRF9YR0JFX1JYX0JQQSwKKwlBTURfWEdCRV9SWF9YTlAsCisJQU1EX1hHQkVfUlhfQ09NUExFVEUsCit9OworCitlbnVtIGFtZF94Z2JlX3BoeV9tb2RlIHsKKwlBTURfWEdCRV9NT0RFX0tSLAorCUFNRF9YR0JFX01PREVfS1gsCit9OworCitzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKworCS8qIFNlckRlcyByZWxhdGVkIG1taW8gcmVzb3VyY2VzICovCisJc3RydWN0IHJlc291cmNlICpyeHR4X3JlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnNpcjBfcmVzOworCXN0cnVjdCByZXNvdXJjZSAqc2lyMV9yZXM7CisKKwkvKiBTZXJEZXMgcmVsYXRlZCBtbWlvIHJlZ2lzdGVycyAqLworCXZvaWQgX19pb21lbSAqcnh0eF9yZWdzOwkvKiBTZXJEZXMgUngvVHggQ1NScyAqLworCXZvaWQgX19pb21lbSAqc2lyMF9yZWdzOwkvKiBTZXJEZXMgaW50ZWdyYXRpb24gcmVnaXN0ZXJzICgxLzIpICovCisJdm9pZCBfX2lvbWVtICpzaXIxX3JlZ3M7CS8qIFNlckRlcyBpbnRlZ3JhdGlvbiByZWdpc3RlcnMgKDIvMikgKi8KKworCS8qIE1haW50YWluIGxpbmsgc3RhdHVzIGZvciByZS1zdGFydGluZyBhdXRvLW5lZ290aWF0aW9uICovCisJdW5zaWduZWQgaW50IGxpbms7CisJZW51bSBhbWRfeGdiZV9waHlfbW9kZSBtb2RlOworCisJLyogQXV0by1uZWdvdGlhdGlvbiBzdGF0ZSBtYWNoaW5lIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgbXV0ZXggYW5fbXV0ZXg7CisJZW51bSBhbWRfeGdiZV9waHlfYW4gYW5fcmVzdWx0OworCWVudW0gYW1kX3hnYmVfcGh5X2FuIGFuX3N0YXRlOworCWVudW0gYW1kX3hnYmVfcGh5X3J4IGtyX3N0YXRlOworCWVudW0gYW1kX3hnYmVfcGh5X3J4IGt4X3N0YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhbl93b3JrOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphbl93b3JrcXVldWU7Cit9OworCitzdGF0aWMgaW50IGFtZF94Z2JlX2FuX2VuYWJsZV9rcl90cmFpbmluZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCB8PSAweDAyOworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfYW5fZGlzYWJsZV9rcl90cmFpbmluZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAmPSB+MHgwMjsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUE1BUE1ELCBNRElPX1BNQV8xMEdCUl9QTURfQ1RSTCwgcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF94Z2JlX3BoeV9wY3NfcG93ZXJfY3ljbGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCB8PSBNRElPX0NUUkwxX0xQT1dFUjsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJdXNsZWVwX3JhbmdlKDc1LCAxMDApOworCisJcmV0ICY9IH5NRElPX0NUUkwxX0xQT1dFUjsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF94Z2JlX3BoeV9zZXJkZXNfc3RhcnRfcmF0ZWNoYW5nZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKworCS8qIEFzc2VydCBSeCBhbmQgVHggcmF0ZWNoYW5nZSAqLworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBSQVRFQ0hBTkdFLCAxKTsKK30KKworc3RhdGljIHZvaWQgYW1kX3hnYmVfcGh5X3NlcmRlc19jb21wbGV0ZV9yYXRlY2hhbmdlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGFtZF94Z2JlX3BoeV9wcml2ICpwcml2ID0gcGh5ZGV2LT5wcml2OworCisJLyogUmVsZWFzZSBSeCBhbmQgVHggcmF0ZWNoYW5nZSAqLworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBSQVRFQ0hBTkdFLCAwKTsKKworCS8qIFdhaXQgZm9yIFJ4IGFuZCBUeCByZWFkeSAqLworCXdoaWxlICghWFNJUjBfSU9SRUFEX0JJVFMocHJpdiwgU0lSMF9TVEFUVVMsIFJYX1JFQURZKSAmJgorCSAgICAgICAhWFNJUjBfSU9SRUFEX0JJVFMocHJpdiwgU0lSMF9TVEFUVVMsIFRYX1JFQURZKSkKKwkJdXNsZWVwX3JhbmdlKDEwLCAyMCk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfcGh5X3hnbWlpX21vZGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJaW50IHJldDsKKworCS8qIEVuYWJsZSBLUiB0cmFpbmluZyAqLworCXJldCA9IGFtZF94Z2JlX2FuX2VuYWJsZV9rcl90cmFpbmluZyhwaHlkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFBDUyB0byBLUi8xMEcgc3BlZWQgKi8KKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ICY9IH5NRElPX1BDU19DVFJMMl9UWVBFOworCXJldCB8PSBNRElPX1BDU19DVFJMMl8xMEdCUjsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwyLCByZXQpOworCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAmPSB+TURJT19DVFJMMV9TUEVFRFNFTDsKKwlyZXQgfD0gTURJT19DVFJMMV9TUEVFRDEwRzsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJcmV0ID0gYW1kX3hnYmVfcGh5X3Bjc19wb3dlcl9jeWNsZShwaHlkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFNlckRlcyB0byAxMEcgc3BlZWQgKi8KKwlhbWRfeGdiZV9waHlfc2VyZGVzX3N0YXJ0X3JhdGVjaGFuZ2UocGh5ZGV2KTsKKworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBEQVRBUkFURSwgU1BFRURfMTAwMDBfUkFURSk7CisJWFNJUjFfSU9XUklURV9CSVRTKHByaXYsIFNJUjFfU1BFRUQsIFdPUkRNT0RFLCBTUEVFRF8xMDAwMF9XT1JEKTsKKwlYU0lSMV9JT1dSSVRFX0JJVFMocHJpdiwgU0lSMV9TUEVFRCwgVFhBTVAsIFNQRUVEXzEwMDAwX1RYQU1QKTsKKwlYU0lSMV9JT1dSSVRFX0JJVFMocHJpdiwgU0lSMV9TUEVFRCwgUExMU0VMLCBTUEVFRF8xMDAwMF9QTEwpOworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBQSV9TUERfU0VMLCBTUEVFRF8xMDAwMF9DRFIpOworCisJWFJYVFhfSU9XUklURV9CSVRTKHByaXYsIFJYVFhfUkVHMjAsIEJMV0NfRU5BLCBSWFRYXzEwMDAwX0JMV0MpOworCVhSWFRYX0lPV1JJVEVfQklUUyhwcml2LCBSWFRYX1JFRzExNCwgUFFfUkVHLCBSWFRYXzEwMDAwX1BRKTsKKworCWFtZF94Z2JlX3BoeV9zZXJkZXNfY29tcGxldGVfcmF0ZWNoYW5nZShwaHlkZXYpOworCisJcHJpdi0+bW9kZSA9IEFNRF9YR0JFX01PREVfS1I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfZ21paV8yNTAwX21vZGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgS1IgdHJhaW5pbmcgKi8KKwlyZXQgPSBhbWRfeGdiZV9hbl9kaXNhYmxlX2tyX3RyYWluaW5nKHBoeWRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgUENTIHRvIEtYLzFHIHNwZWVkICovCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAmPSB+TURJT19QQ1NfQ1RSTDJfVFlQRTsKKwlyZXQgfD0gTURJT19QQ1NfQ1RSTDJfMTBHQlg7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMiwgcmV0KTsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgJj0gfk1ESU9fQ1RSTDFfU1BFRURTRUw7CisJcmV0IHw9IE1ESU9fQ1RSTDFfU1BFRUQxRzsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJcmV0ID0gYW1kX3hnYmVfcGh5X3Bjc19wb3dlcl9jeWNsZShwaHlkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFNlckRlcyB0byAyLjVHIHNwZWVkICovCisJYW1kX3hnYmVfcGh5X3NlcmRlc19zdGFydF9yYXRlY2hhbmdlKHBoeWRldik7CisKKwlYU0lSMV9JT1dSSVRFX0JJVFMocHJpdiwgU0lSMV9TUEVFRCwgREFUQVJBVEUsIFNQRUVEXzI1MDBfUkFURSk7CisJWFNJUjFfSU9XUklURV9CSVRTKHByaXYsIFNJUjFfU1BFRUQsIFdPUkRNT0RFLCBTUEVFRF8yNTAwX1dPUkQpOworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBUWEFNUCwgU1BFRURfMjUwMF9UWEFNUCk7CisJWFNJUjFfSU9XUklURV9CSVRTKHByaXYsIFNJUjFfU1BFRUQsIFBMTFNFTCwgU1BFRURfMjUwMF9QTEwpOworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBQSV9TUERfU0VMLCBTUEVFRF8yNTAwX0NEUik7CisKKwlYUlhUWF9JT1dSSVRFX0JJVFMocHJpdiwgUlhUWF9SRUcyMCwgQkxXQ19FTkEsIFJYVFhfMjUwMF9CTFdDKTsKKwlYUlhUWF9JT1dSSVRFX0JJVFMocHJpdiwgUlhUWF9SRUcxMTQsIFBRX1JFRywgUlhUWF8yNTAwX1BRKTsKKworCWFtZF94Z2JlX3BoeV9zZXJkZXNfY29tcGxldGVfcmF0ZWNoYW5nZShwaHlkZXYpOworCisJcHJpdi0+bW9kZSA9IEFNRF9YR0JFX01PREVfS1g7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfZ21paV9tb2RlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGFtZF94Z2JlX3BoeV9wcml2ICpwcml2ID0gcGh5ZGV2LT5wcml2OworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIEtSIHRyYWluaW5nICovCisJcmV0ID0gYW1kX3hnYmVfYW5fZGlzYWJsZV9rcl90cmFpbmluZyhwaHlkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFBDUyB0byBLWC8xRyBzcGVlZCAqLworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgJj0gfk1ESU9fUENTX0NUUkwyX1RZUEU7CisJcmV0IHw9IE1ESU9fUENTX0NUUkwyXzEwR0JYOworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDIsIHJldCk7CisKKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ICY9IH5NRElPX0NUUkwxX1NQRUVEU0VMOworCXJldCB8PSBNRElPX0NUUkwxX1NQRUVEMUc7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSwgcmV0KTsKKworCXJldCA9IGFtZF94Z2JlX3BoeV9wY3NfcG93ZXJfY3ljbGUocGh5ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCBTZXJEZXMgdG8gMUcgc3BlZWQgKi8KKwlhbWRfeGdiZV9waHlfc2VyZGVzX3N0YXJ0X3JhdGVjaGFuZ2UocGh5ZGV2KTsKKworCVhTSVIxX0lPV1JJVEVfQklUUyhwcml2LCBTSVIxX1NQRUVELCBEQVRBUkFURSwgU1BFRURfMTAwMF9SQVRFKTsKKwlYU0lSMV9JT1dSSVRFX0JJVFMocHJpdiwgU0lSMV9TUEVFRCwgV09SRE1PREUsIFNQRUVEXzEwMDBfV09SRCk7CisJWFNJUjFfSU9XUklURV9CSVRTKHByaXYsIFNJUjFfU1BFRUQsIFRYQU1QLCBTUEVFRF8xMDAwX1RYQU1QKTsKKwlYU0lSMV9JT1dSSVRFX0JJVFMocHJpdiwgU0lSMV9TUEVFRCwgUExMU0VMLCBTUEVFRF8xMDAwX1BMTCk7CisJWFNJUjFfSU9XUklURV9CSVRTKHByaXYsIFNJUjFfU1BFRUQsIFBJX1NQRF9TRUwsIFNQRUVEXzEwMDBfQ0RSKTsKKworCVhSWFRYX0lPV1JJVEVfQklUUyhwcml2LCBSWFRYX1JFRzIwLCBCTFdDX0VOQSwgUlhUWF8xMDAwX0JMV0MpOworCVhSWFRYX0lPV1JJVEVfQklUUyhwcml2LCBSWFRYX1JFRzExNCwgUFFfUkVHLCBSWFRYXzEwMDBfUFEpOworCisJYW1kX3hnYmVfcGh5X3NlcmRlc19jb21wbGV0ZV9yYXRlY2hhbmdlKHBoeWRldik7CisKKwlwcml2LT5tb2RlID0gQU1EX1hHQkVfTU9ERV9LWDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF94Z2JlX3BoeV9zd2l0Y2hfbW9kZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJLyogSWYgd2UgYXJlIGluIEtSIHN3aXRjaCB0byBLWCwgYW5kIHZpY2UtdmVyc2EgKi8KKwlpZiAocHJpdi0+bW9kZSA9PSBBTURfWEdCRV9NT0RFX0tSKQorCQlyZXQgPSBhbWRfeGdiZV9waHlfZ21paV9tb2RlKHBoeWRldik7CisJZWxzZQorCQlyZXQgPSBhbWRfeGdiZV9waHlfeGdtaWlfbW9kZShwaHlkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gYW1kX3hnYmVfcGh5X2FuIGFtZF94Z2JlX2FuX3N3aXRjaF9tb2RlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGFtZF94Z2JlX3BoeV9zd2l0Y2hfbW9kZShwaHlkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gQU1EX1hHQkVfQU5fRVJST1I7CisKKwlyZXR1cm4gQU1EX1hHQkVfQU5fU1RBUlQ7Cit9CisKK3N0YXRpYyBlbnVtIGFtZF94Z2JlX3BoeV9hbiBhbWRfeGdiZV9hbl90eF90cmFpbmluZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAorCQkJCQkJICAgIGVudW0gYW1kX3hnYmVfcGh5X3J4ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJaW50IGFkX3JlZywgbHBfcmVnLCByZXQ7CisKKwkqc3RhdGUgPSBBTURfWEdCRV9SWF9DT01QTEVURTsKKworCS8qIElmIHdlJ3JlIGluIEtYIG1vZGUgdGhlbiB3ZSdyZSBkb25lICovCisJaWYgKHByaXYtPm1vZGUgPT0gQU1EX1hHQkVfTU9ERV9LWCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VWRU5UOworCisJLyogRW5hYmxlL0Rpc2FibGUgRkVDICovCisJYWRfcmVnID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fQURWRVJUSVNFICsgMik7CisJaWYgKGFkX3JlZyA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCWxwX3JlZyA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0xQQSArIDIpOworCWlmIChscF9yZWcgPCAwKQorCQlyZXR1cm4gQU1EX1hHQkVfQU5fRVJST1I7CisKKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX0ZFQ19DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJaWYgKChhZF9yZWcgJiAweGMwMDApICYmIChscF9yZWcgJiAweGMwMDApKQorCQlyZXQgfD0gMHgwMTsKKwllbHNlCisJCXJldCAmPSB+MHgwMTsKKworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX0ZFQ19DVFJMLCByZXQpOworCisJLyogU3RhcnQgS1IgdHJhaW5pbmcgKi8KKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QTUFQTUQsIE1ESU9fUE1BXzEwR0JSX1BNRF9DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJcmV0IHw9IDB4MDE7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX1BNQVBNRCwgTURJT19QTUFfMTBHQlJfUE1EX0NUUkwsIHJldCk7CisKKwlyZXR1cm4gQU1EX1hHQkVfQU5fRVZFTlQ7Cit9CisKK3N0YXRpYyBlbnVtIGFtZF94Z2JlX3BoeV9hbiBhbWRfeGdiZV9hbl90eF94bnAoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkJICAgICAgIGVudW0gYW1kX3hnYmVfcGh5X3J4ICpzdGF0ZSkKK3sKKwl1MTYgbXNnOworCisJKnN0YXRlID0gQU1EX1hHQkVfUlhfWE5QOworCisJbXNnID0gWE5QX01DRl9OVUxMX01FU1NBR0U7CisJbXNnIHw9IFhOUF9NUF9GT1JNQVRURUQ7CisKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fWE5QICsgMiwgMCk7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX1hOUCArIDEsIDApOworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9YTlAsIG1zZyk7CisKKwlyZXR1cm4gQU1EX1hHQkVfQU5fRVZFTlQ7Cit9CisKK3N0YXRpYyBlbnVtIGFtZF94Z2JlX3BoeV9hbiBhbWRfeGdiZV9hbl9yeF9icGEoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkJICAgICAgIGVudW0gYW1kX3hnYmVfcGh5X3J4ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGxpbmtfc3VwcG9ydDsKKwlpbnQgcmV0LCBhZF9yZWcsIGxwX3JlZzsKKworCS8qIFJlYWQgQmFzZSBBYmlsaXR5IHJlZ2lzdGVyIDIgZmlyc3QgKi8KKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9MUEEgKyAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJLyogQ2hlY2sgZm9yIGEgc3VwcG9ydGVkIG1vZGUsIG90aGVyd2lzZSByZXN0YXJ0IGluIGEgZGlmZmVyZW50IG9uZSAqLworCWxpbmtfc3VwcG9ydCA9IChwcml2LT5tb2RlID09IEFNRF9YR0JFX01PREVfS1IpID8gMHg4MCA6IDB4MjA7CisJaWYgKCEocmV0ICYgbGlua19zdXBwb3J0KSkKKwkJcmV0dXJuIGFtZF94Z2JlX2FuX3N3aXRjaF9tb2RlKHBoeWRldik7CisKKwkvKiBDaGVjayBFeHRlbmRlZCBOZXh0IFBhZ2Ugc3VwcG9ydCAqLworCWFkX3JlZyA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0FEVkVSVElTRSk7CisJaWYgKGFkX3JlZyA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCWxwX3JlZyA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0xQQSk7CisJaWYgKGxwX3JlZyA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCXJldHVybiAoKGFkX3JlZyAmIFhOUF9OUF9FWENIQU5HRSkgfHwgKGxwX3JlZyAmIFhOUF9OUF9FWENIQU5HRSkpID8KKwkgICAgICAgYW1kX3hnYmVfYW5fdHhfeG5wKHBoeWRldiwgc3RhdGUpIDoKKwkgICAgICAgYW1kX3hnYmVfYW5fdHhfdHJhaW5pbmcocGh5ZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGFtZF94Z2JlX3BoeV9hbiBhbWRfeGdiZV9hbl9yeF94bnAoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkJICAgICAgIGVudW0gYW1kX3hnYmVfcGh5X3J4ICpzdGF0ZSkKK3sKKwlpbnQgYWRfcmVnLCBscF9yZWc7CisKKwkvKiBDaGVjayBFeHRlbmRlZCBOZXh0IFBhZ2Ugc3VwcG9ydCAqLworCWFkX3JlZyA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0FEVkVSVElTRSk7CisJaWYgKGFkX3JlZyA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCWxwX3JlZyA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0xQQSk7CisJaWYgKGxwX3JlZyA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCXJldHVybiAoKGFkX3JlZyAmIFhOUF9OUF9FWENIQU5HRSkgfHwgKGxwX3JlZyAmIFhOUF9OUF9FWENIQU5HRSkpID8KKwkgICAgICAgYW1kX3hnYmVfYW5fdHhfeG5wKHBoeWRldiwgc3RhdGUpIDoKKwkgICAgICAgYW1kX3hnYmVfYW5fdHhfdHJhaW5pbmcocGh5ZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGFtZF94Z2JlX3BoeV9hbiBhbWRfeGdiZV9hbl9zdGFydChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJLyogQmUgc3VyZSB3ZSBhcmVuJ3QgbG9vcGluZyB0cnlpbmcgdG8gbmVnb3RpYXRlICovCisJaWYgKHByaXYtPm1vZGUgPT0gQU1EX1hHQkVfTU9ERV9LUikgeworCQlpZiAocHJpdi0+a3Jfc3RhdGUgIT0gQU1EX1hHQkVfUlhfUkVBRFkpCisJCQlyZXR1cm4gQU1EX1hHQkVfQU5fTk9fTElOSzsKKwkJcHJpdi0+a3Jfc3RhdGUgPSBBTURfWEdCRV9SWF9CUEE7CisJfSBlbHNlIHsKKwkJaWYgKHByaXYtPmt4X3N0YXRlICE9IEFNRF9YR0JFX1JYX1JFQURZKQorCQkJcmV0dXJuIEFNRF9YR0JFX0FOX05PX0xJTks7CisJCXByaXYtPmt4X3N0YXRlID0gQU1EX1hHQkVfUlhfQlBBOworCX0KKworCS8qIFNldCB1cCBBZHZlcnRpc2VtZW50IHJlZ2lzdGVyIDMgZmlyc3QgKi8KKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9BRFZFUlRJU0UgKyAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZVJfRkVDKQorCQlyZXQgfD0gMHhjMDAwOworCWVsc2UKKwkJcmV0ICY9IH4weGMwMDA7CisKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fQURWRVJUSVNFICsgMiwgcmV0KTsKKworCS8qIFNldCB1cCBBZHZlcnRpc2VtZW50IHJlZ2lzdGVyIDIgbmV4dCAqLworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0FEVkVSVElTRSArIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gQU1EX1hHQkVfQU5fRVJST1I7CisKKwlpZiAocGh5ZGV2LT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbCkKKwkJcmV0IHw9IDB4ODA7CisJZWxzZQorCQlyZXQgJj0gfjB4ODA7CisKKwlpZiAocGh5ZGV2LT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsKQorCQlyZXQgfD0gMHgyMDsKKwllbHNlCisJCXJldCAmPSB+MHgyMDsKKworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9BRFZFUlRJU0UgKyAxLCByZXQpOworCisJLyogU2V0IHVwIEFkdmVydGlzZW1lbnQgcmVnaXN0ZXIgMSBsYXN0ICovCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fQURWRVJUSVNFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1BhdXNlKQorCQlyZXQgfD0gMHg0MDA7CisJZWxzZQorCQlyZXQgJj0gfjB4NDAwOworCisJaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0FzeW1fUGF1c2UpCisJCXJldCB8PSAweDgwMDsKKwllbHNlCisJCXJldCAmPSB+MHg4MDA7CisKKwkvKiBXZSBkb24ndCBpbnRlbmQgdG8gcGVyZm9ybSBYTlAgKi8KKwlyZXQgJj0gflhOUF9OUF9FWENIQU5HRTsKKworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9BRFZFUlRJU0UsIHJldCk7CisKKwkvKiBFbmFibGUgYW5kIHN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fSU5ULCAwKTsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEFNRF9YR0JFX0FOX0VSUk9SOworCisJcmV0IHw9IE1ESU9fQU5fQ1RSTDFfRU5BQkxFOworCXJldCB8PSBNRElPX0FOX0NUUkwxX1JFU1RBUlQ7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0NUUkwxLCByZXQpOworCisJcmV0dXJuIEFNRF9YR0JFX0FOX0VWRU5UOworfQorCitzdGF0aWMgZW51bSBhbWRfeGdiZV9waHlfYW4gYW1kX3hnYmVfYW5fZXZlbnQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwllbnVtIGFtZF94Z2JlX3BoeV9hbiBuZXdfc3RhdGU7CisJaW50IHJldDsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0lOVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBBTURfWEdCRV9BTl9FUlJPUjsKKworCW5ld19zdGF0ZSA9IEFNRF9YR0JFX0FOX0VWRU5UOworCWlmIChyZXQgJiBYR0JFX0FOX1BHX1JDVikKKwkJbmV3X3N0YXRlID0gQU1EX1hHQkVfQU5fUEFHRV9SRUNFSVZFRDsKKwllbHNlIGlmIChyZXQgJiBYR0JFX0FOX0lOQ19MSU5LKQorCQluZXdfc3RhdGUgPSBBTURfWEdCRV9BTl9JTkNPTVBBVF9MSU5LOworCWVsc2UgaWYgKHJldCAmIFhHQkVfQU5fSU5UX0NNUExUKQorCQluZXdfc3RhdGUgPSBBTURfWEdCRV9BTl9DT01QTEVURTsKKworCWlmIChuZXdfc3RhdGUgIT0gQU1EX1hHQkVfQU5fRVZFTlQpCisJCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9JTlQsIDApOworCisJcmV0dXJuIG5ld19zdGF0ZTsKK30KKworc3RhdGljIGVudW0gYW1kX3hnYmVfcGh5X2FuIGFtZF94Z2JlX2FuX3BhZ2VfcmVjZWl2ZWQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJZW51bSBhbWRfeGdiZV9waHlfcnggKnN0YXRlOworCWludCByZXQ7CisKKwlzdGF0ZSA9IChwcml2LT5tb2RlID09IEFNRF9YR0JFX01PREVfS1IpID8gJnByaXYtPmtyX3N0YXRlCisJCQkJCQkgOiAmcHJpdi0+a3hfc3RhdGU7CisKKwlzd2l0Y2ggKCpzdGF0ZSkgeworCWNhc2UgQU1EX1hHQkVfUlhfQlBBOgorCQlyZXQgPSBhbWRfeGdiZV9hbl9yeF9icGEocGh5ZGV2LCBzdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBBTURfWEdCRV9SWF9YTlA6CisJCXJldCA9IGFtZF94Z2JlX2FuX3J4X3hucChwaHlkZXYsIHN0YXRlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBBTURfWEdCRV9BTl9FUlJPUjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBhbWRfeGdiZV9waHlfYW4gYW1kX3hnYmVfYW5faW5jb21wYXRfbGluayhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXJldHVybiBhbWRfeGdiZV9hbl9zd2l0Y2hfbW9kZShwaHlkZXYpOworfQorCitzdGF0aWMgdm9pZCBhbWRfeGdiZV9hbl9zdGF0ZV9tYWNoaW5lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgICAgIHN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiwKKwkJCQkJCSAgICAgIGFuX3dvcmspOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcml2LT5waHlkZXY7CisJZW51bSBhbWRfeGdiZV9waHlfYW4gY3VyX3N0YXRlOworCWludCBzbGVlcDsKKworCXdoaWxlICgxKSB7CisJCW11dGV4X2xvY2soJnByaXYtPmFuX211dGV4KTsKKworCQljdXJfc3RhdGUgPSBwcml2LT5hbl9zdGF0ZTsKKworCQlzd2l0Y2ggKHByaXYtPmFuX3N0YXRlKSB7CisJCWNhc2UgQU1EX1hHQkVfQU5fU1RBUlQ6CisJCQlwcml2LT5hbl9zdGF0ZSA9IGFtZF94Z2JlX2FuX3N0YXJ0KHBoeWRldik7CisJCQlicmVhazsKKworCQljYXNlIEFNRF9YR0JFX0FOX0VWRU5UOgorCQkJcHJpdi0+YW5fc3RhdGUgPSBhbWRfeGdiZV9hbl9ldmVudChwaHlkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTURfWEdCRV9BTl9QQUdFX1JFQ0VJVkVEOgorCQkJcHJpdi0+YW5fc3RhdGUgPSBhbWRfeGdiZV9hbl9wYWdlX3JlY2VpdmVkKHBoeWRldik7CisJCQlicmVhazsKKworCQljYXNlIEFNRF9YR0JFX0FOX0lOQ09NUEFUX0xJTks6CisJCQlwcml2LT5hbl9zdGF0ZSA9IGFtZF94Z2JlX2FuX2luY29tcGF0X2xpbmsocGh5ZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1EX1hHQkVfQU5fQ09NUExFVEU6CisJCWNhc2UgQU1EX1hHQkVfQU5fTk9fTElOSzoKKwkJY2FzZSBBTURfWEdCRV9BTl9FWElUOgorCQkJZ290byBleGl0X3VubG9jazsKKworCQlkZWZhdWx0OgorCQkJcHJpdi0+YW5fc3RhdGUgPSBBTURfWEdCRV9BTl9FUlJPUjsKKwkJfQorCisJCWlmIChwcml2LT5hbl9zdGF0ZSA9PSBBTURfWEdCRV9BTl9FUlJPUikgeworCQkJbmV0ZGV2X2VycihwaHlkZXYtPmF0dGFjaGVkX2RldiwKKwkJCQkgICAiZXJyb3IgZHVyaW5nIGF1dG8tbmVnb3RpYXRpb24sIHN0YXRlPSV1XG4iLAorCQkJCSAgIGN1cl9zdGF0ZSk7CisJCQlnb3RvIGV4aXRfdW5sb2NrOworCQl9CisKKwkJc2xlZXAgPSAocHJpdi0+YW5fc3RhdGUgPT0gQU1EX1hHQkVfQU5fRVZFTlQpID8gMSA6IDA7CisKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5hbl9tdXRleCk7CisKKwkJaWYgKHNsZWVwKQorCQkJdXNsZWVwX3JhbmdlKDIwLCA1MCk7CisJfQorCitleGl0X3VubG9jazoKKwlwcml2LT5hbl9yZXN1bHQgPSBwcml2LT5hbl9zdGF0ZTsKKwlwcml2LT5hbl9zdGF0ZSA9IEFNRF9YR0JFX0FOX1JFQURZOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5hbl9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfcGh5X3NvZnRfcmVzZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgY291bnQsIHJldDsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgfD0gTURJT19DVFJMMV9SRVNFVDsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJY291bnQgPSA1MDsKKwlkbyB7CisJCW1zbGVlcCgyMCk7CisJCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IHdoaWxlICgocmV0ICYgTURJT19DVFJMMV9SRVNFVCkgJiYgLS1jb3VudCk7CisKKwlpZiAocmV0ICYgTURJT19DVFJMMV9SRVNFVCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwkvKiBJbml0aWFsaXplIHN1cHBvcnRlZCBmZWF0dXJlcyAqLworCXBoeWRldi0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0F1dG9uZWc7CisJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1BhdXNlIHwgU1VQUE9SVEVEX0FzeW1fUGF1c2U7CisJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0JhY2twbGFuZTsKKwlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsOworCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZVJfRkVDOworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKKworCS8qIFR1cm4gb2ZmIGFuZCBjbGVhciBpbnRlcnJ1cHRzICovCisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0lOVE1BU0ssIDApOworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9JTlQsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfcGh5X3NldHVwX2ZvcmNlZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIGF1dG8tbmVnb3RpYXRpb24gKi8KKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgJj0gfk1ESU9fQU5fQ1RSTDFfRU5BQkxFOworCXBoeV93cml0ZV9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19DVFJMMSwgcmV0KTsKKworCS8qIFZhbGlkYXRlL1NldCBzcGVjaWZpZWQgc3BlZWQgKi8KKwlzd2l0Y2ggKHBoeWRldi0+c3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwMDAwOgorCQlyZXQgPSBhbWRfeGdiZV9waHlfeGdtaWlfbW9kZShwaHlkZXYpOworCQlicmVhazsKKworCWNhc2UgU1BFRURfMjUwMDoKKwkJcmV0ID0gYW1kX3hnYmVfcGh5X2dtaWlfMjUwMF9tb2RlKHBoeWRldik7CisJCWJyZWFrOworCisJY2FzZSBTUEVFRF8xMDAwOgorCQlyZXQgPSBhbWRfeGdiZV9waHlfZ21paV9tb2RlKHBoeWRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFZhbGlkYXRlIGR1cGxleCBtb2RlICovCisJaWYgKHBoeWRldi0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBoeWRldi0+cGF1c2UgPSAwOworCXBoeWRldi0+YXN5bV9wYXVzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfY29uZmlnX2FuZWcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CisJdTMyIG1tZF9tYXNrID0gcGh5ZGV2LT5jNDVfaWRzLmRldmljZXNfaW5fcGFja2FnZTsKKwlpbnQgcmV0OworCisJaWYgKHBoeWRldi0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIGFtZF94Z2JlX3BoeV9zZXR1cF9mb3JjZWQocGh5ZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBBTiBNTUQgcHJlc2VudCAqLworCWlmICghKG1tZF9tYXNrICYgTURJT19ERVZTX0FOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc3BlZWQgbW9kZSAqLworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTdGFydC9SZXN0YXJ0IHRoZSBhdXRvLW5lZ290aWF0aW9uIHN0YXRlIG1hY2hpbmUgKi8KKwltdXRleF9sb2NrKCZwcml2LT5hbl9tdXRleCk7CisJcHJpdi0+YW5fcmVzdWx0ID0gQU1EX1hHQkVfQU5fUkVBRFk7CisJcHJpdi0+YW5fc3RhdGUgPSBBTURfWEdCRV9BTl9TVEFSVDsKKwlwcml2LT5rcl9zdGF0ZSA9IEFNRF9YR0JFX1JYX1JFQURZOworCXByaXYtPmt4X3N0YXRlID0gQU1EX1hHQkVfUlhfUkVBRFk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5hbl9tdXRleCk7CisKKwlxdWV1ZV93b3JrKHByaXYtPmFuX3dvcmtxdWV1ZSwgJnByaXYtPmFuX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfcGh5X2FuZWdfZG9uZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKwllbnVtIGFtZF94Z2JlX3BoeV9hbiBzdGF0ZTsKKworCW11dGV4X2xvY2soJnByaXYtPmFuX211dGV4KTsKKwlzdGF0ZSA9IHByaXYtPmFuX3Jlc3VsdDsKKwltdXRleF91bmxvY2soJnByaXYtPmFuX211dGV4KTsKKworCXJldHVybiAoc3RhdGUgPT0gQU1EX1hHQkVfQU5fQ09NUExFVEUpOworfQorCitzdGF0aWMgaW50IGFtZF94Z2JlX3BoeV91cGRhdGVfbGluayhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBhbWRfeGdiZV9waHlfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKwllbnVtIGFtZF94Z2JlX3BoeV9hbiBzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfYWdhaW4sIGF1dG9uZWc7CisJaW50IHJldDsKKworCS8qIElmIHdlJ3JlIGRvaW5nIGF1dG8tbmVnb3RpYXRpb24gZG9uJ3QgcmVwb3J0IGxpbmsgZG93biAqLworCW11dGV4X2xvY2soJnByaXYtPmFuX211dGV4KTsKKwlzdGF0ZSA9IHByaXYtPmFuX3N0YXRlOworCW11dGV4X3VubG9jaygmcHJpdi0+YW5fbXV0ZXgpOworCisJaWYgKHN0YXRlICE9IEFNRF9YR0JFX0FOX1JFQURZKSB7CisJCXBoeWRldi0+bGluayA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qIFNpbmNlIHRoZSBkZXZpY2UgY2FuIGJlIGluIHRoZSB3cm9uZyBtb2RlIHdoZW4gYSBsaW5rIGlzCisJICogKHJlLSllc3RhYmxpc2hlZCAoY2FibGUgY29ubmVjdGVkIGFmdGVyIHRoZSBpbnRlcmZhY2UgaXMKKwkgKiB1cCwgZXRjLiksIHRoZSBsaW5rIHN0YXR1cyBtYXkgcmVwb3J0IG5vIGxpbmsuIElmIHRoZXJlCisJICogaXMgbm8gbGluaywgdHJ5IHN3aXRjaGluZyBtb2RlcyBhbmQgY2hlY2tpbmcgdGhlIHN0YXR1cworCSAqIGFnYWluLgorCSAqLworCWNoZWNrX2FnYWluID0gMTsKK2FnYWluOgorCS8qIExpbmsgc3RhdHVzIGlzIGxhdGNoZWQgbG93LCBzbyByZWFkIG9uY2UgdG8gY2xlYXIKKwkgKiBhbmQgdGhlbiByZWFkIGFnYWluIHRvIGdldCBjdXJyZW50IHN0YXRlCisJICovCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX1NUQVQxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19TVEFUMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwaHlkZXYtPmxpbmsgPSAocmV0ICYgTURJT19TVEFUMV9MU1RBVFVTKSA/IDEgOiAwOworCisJaWYgKCFwaHlkZXYtPmxpbmspIHsKKwkJcmV0ID0gYW1kX3hnYmVfcGh5X3N3aXRjaF9tb2RlKHBoeWRldik7CisJCWlmIChjaGVja19hZ2FpbikgeworCQkJY2hlY2tfYWdhaW4gPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCWF1dG9uZWcgPSAocGh5ZGV2LT5saW5rICYmICFwcml2LT5saW5rKSA/IDEgOiAwOworCXByaXYtPmxpbmsgPSBwaHlkZXYtPmxpbms7CisJaWYgKGF1dG9uZWcpIHsKKwkJLyogTGluayBpcyAoYmFjaykgdXAsIHJlLXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwkJcmV0ID0gYW1kX3hnYmVfcGh5X2NvbmZpZ19hbmVnKHBoeWRldik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfcmVhZF9zdGF0dXMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwl1MzIgbW1kX21hc2sgPSBwaHlkZXYtPmM0NV9pZHMuZGV2aWNlc19pbl9wYWNrYWdlOworCWludCByZXQsIG1vZGUsIGFkX3JldCwgbHBfcmV0OworCisJcmV0ID0gYW1kX3hnYmVfcGh5X3VwZGF0ZV9saW5rKHBoeWRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1vZGUgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDIpOworCWlmIChtb2RlIDwgMCkKKwkJcmV0dXJuIG1vZGU7CisJbW9kZSAmPSBNRElPX1BDU19DVFJMMl9UWVBFOworCisJaWYgKHBoeWRldi0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoIShtbWRfbWFzayAmIE1ESU9fREVWU19BTikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoIWFtZF94Z2JlX3BoeV9hbmVnX2RvbmUocGh5ZGV2KSkKKwkJCXJldHVybiAwOworCisJCS8qIENvbXBhcmUgQWR2ZXJ0aXNlbWVudCBhbmQgTGluayBQYXJ0bmVyIHJlZ2lzdGVyIDEgKi8KKwkJYWRfcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fQURWRVJUSVNFKTsKKwkJaWYgKGFkX3JldCA8IDApCisJCQlyZXR1cm4gYWRfcmV0OworCQlscF9yZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9MUEEpOworCQlpZiAobHBfcmV0IDwgMCkKKwkJCXJldHVybiBscF9yZXQ7CisKKwkJYWRfcmV0ICY9IGxwX3JldDsKKwkJcGh5ZGV2LT5wYXVzZSA9IChhZF9yZXQgJiAweDQwMCkgPyAxIDogMDsKKwkJcGh5ZGV2LT5hc3ltX3BhdXNlID0gKGFkX3JldCAmIDB4ODAwKSA/IDEgOiAwOworCisJCS8qIENvbXBhcmUgQWR2ZXJ0aXNlbWVudCBhbmQgTGluayBQYXJ0bmVyIHJlZ2lzdGVyIDIgKi8KKwkJYWRfcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfQU4sCisJCQkJICAgICAgTURJT19BTl9BRFZFUlRJU0UgKyAxKTsKKwkJaWYgKGFkX3JldCA8IDApCisJCQlyZXR1cm4gYWRfcmV0OworCQlscF9yZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9BTiwgTURJT19BTl9MUEEgKyAxKTsKKwkJaWYgKGxwX3JldCA8IDApCisJCQlyZXR1cm4gbHBfcmV0OworCisJCWFkX3JldCAmPSBscF9yZXQ7CisJCWlmIChhZF9yZXQgJiAweDgwKSB7CisJCQlwaHlkZXYtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJCQlpZiAobW9kZSAhPSBNRElPX1BDU19DVFJMMl8xMEdCUikgeworCQkJCXJldCA9IGFtZF94Z2JlX3BoeV94Z21paV9tb2RlKHBoeWRldik7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwaHlkZXYtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCWlmIChtb2RlID09IE1ESU9fUENTX0NUUkwyXzEwR0JSKSB7CisJCQkJcmV0ID0gYW1kX3hnYmVfcGh5X2dtaWlfbW9kZShwaHlkZXYpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisKKwkJcGh5ZGV2LT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQlwaHlkZXYtPnNwZWVkID0gKG1vZGUgPT0gTURJT19QQ1NfQ1RSTDJfMTBHQlIpID8gU1BFRURfMTAwMDAKKwkJCQkJCQkgICAgICAgOiBTUEVFRF8xMDAwOworCQlwaHlkZXYtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQlwaHlkZXYtPnBhdXNlID0gMDsKKwkJcGh5ZGV2LT5hc3ltX3BhdXNlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfeGdiZV9waHlfc3VzcGVuZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOworCisJcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwlyZXQgfD0gTURJT19DVFJMMV9MUE9XRVI7CisJcGh5X3dyaXRlX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSwgcmV0KTsKKworCXJldCA9IDA7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtZF94Z2JlX3BoeV9yZXN1bWUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5sb2NrOworCisJcmV0ICY9IH5NRElPX0NUUkwxX0xQT1dFUjsKKwlwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCByZXQpOworCisJcmV0ID0gMDsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfcGh5X3Byb2JlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGFtZF94Z2JlX3BoeV9wcml2ICpwcml2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNoYXIgKndxX25hbWU7CisJaW50IHJldDsKKworCWlmICghcGh5ZGV2LT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwaHlkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWRldiA9ICZwZGV2LT5kZXY7CisKKwl3cV9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy1hbWQteGdiZS1waHkiLCBwaHlkZXYtPmJ1cy0+bmFtZSk7CisJaWYgKCF3cV9uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3BkZXY7CisJfQorCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9uYW1lOworCX0KKworCXByaXYtPnBkZXYgPSBwZGV2OworCXByaXYtPmRldiA9IGRldjsKKwlwcml2LT5waHlkZXYgPSBwaHlkZXY7CisKKwkvKiBHZXQgdGhlIGRldmljZSBtbWlvIGFyZWFzICovCisJcHJpdi0+cnh0eF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXByaXYtPnJ4dHhfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHByaXYtPnJ4dHhfcmVzKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4dHhfcmVncykpIHsKKwkJZGV2X2VycihkZXYsICJyeHR4IGlvcmVtYXAgZmFpbGVkXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT5yeHR4X3JlZ3MpOworCQlnb3RvIGVycl9wcml2OworCX0KKworCXByaXYtPnNpcjBfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlwcml2LT5zaXIwX3JlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBwcml2LT5zaXIwX3Jlcyk7CisJaWYgKElTX0VSUihwcml2LT5zaXIwX3JlZ3MpKSB7CisJCWRldl9lcnIoZGV2LCAic2lyMCBpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+c2lyMF9yZWdzKTsKKwkJZ290byBlcnJfcnh0eDsKKwl9CisKKwlwcml2LT5zaXIxX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJcHJpdi0+c2lyMV9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcHJpdi0+c2lyMV9yZXMpOworCWlmIChJU19FUlIocHJpdi0+c2lyMV9yZWdzKSkgeworCQlkZXZfZXJyKGRldiwgInNpcjEgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSBQVFJfRVJSKHByaXYtPnNpcjFfcmVncyk7CisJCWdvdG8gZXJyX3NpcjA7CisJfQorCisJcHJpdi0+bGluayA9IDE7CisKKwlyZXQgPSBwaHlfcmVhZF9tbWQocGh5ZGV2LCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9zaXIxOworCWlmICgocmV0ICYgTURJT19QQ1NfQ1RSTDJfVFlQRSkgPT0gTURJT19QQ1NfQ1RSTDJfMTBHQlIpCisJCXByaXYtPm1vZGUgPSBBTURfWEdCRV9NT0RFX0tSOworCWVsc2UKKwkJcHJpdi0+bW9kZSA9IEFNRF9YR0JFX01PREVfS1g7CisKKwltdXRleF9pbml0KCZwcml2LT5hbl9tdXRleCk7CisJSU5JVF9XT1JLKCZwcml2LT5hbl93b3JrLCBhbWRfeGdiZV9hbl9zdGF0ZV9tYWNoaW5lKTsKKwlwcml2LT5hbl93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSh3cV9uYW1lKTsKKwlpZiAoIXByaXYtPmFuX3dvcmtxdWV1ZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9zaXIxOworCX0KKworCXBoeWRldi0+cHJpdiA9IHByaXY7CisKKwlrZnJlZSh3cV9uYW1lKTsKKwlvZl9kZXZfcHV0KHBkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9zaXIxOgorCWRldm1faW91bm1hcChkZXYsIHByaXYtPnNpcjFfcmVncyk7CisJZGV2bV9yZWxlYXNlX21lbV9yZWdpb24oZGV2LCBwcml2LT5zaXIxX3Jlcy0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShwcml2LT5zaXIxX3JlcykpOworCitlcnJfc2lyMDoKKwlkZXZtX2lvdW5tYXAoZGV2LCBwcml2LT5zaXIwX3JlZ3MpOworCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKGRldiwgcHJpdi0+c2lyMF9yZXMtPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUocHJpdi0+c2lyMF9yZXMpKTsKKworZXJyX3J4dHg6CisJZGV2bV9pb3VubWFwKGRldiwgcHJpdi0+cnh0eF9yZWdzKTsKKwlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihkZXYsIHByaXYtPnJ4dHhfcmVzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHByaXYtPnJ4dHhfcmVzKSk7CisKK2Vycl9wcml2OgorCWRldm1fa2ZyZWUoZGV2LCBwcml2KTsKKworZXJyX25hbWU6CisJa2ZyZWUod3FfbmFtZSk7CisKK2Vycl9wZGV2OgorCW9mX2Rldl9wdXQocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhbWRfeGdiZV9waHlfcmVtb3ZlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGFtZF94Z2JlX3BoeV9wcml2ICpwcml2ID0gcGh5ZGV2LT5wcml2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHByaXYtPmRldjsKKworCS8qIFN0b3AgYW55IGluIHByb2Nlc3MgYXV0by1uZWdvdGlhdGlvbiAqLworCW11dGV4X2xvY2soJnByaXYtPmFuX211dGV4KTsKKwlwcml2LT5hbl9zdGF0ZSA9IEFNRF9YR0JFX0FOX0VYSVQ7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5hbl9tdXRleCk7CisKKwlmbHVzaF93b3JrcXVldWUocHJpdi0+YW5fd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5hbl93b3JrcXVldWUpOworCisJLyogUmVsZWFzZSByZXNvdXJjZXMgKi8KKwlkZXZtX2lvdW5tYXAoZGV2LCBwcml2LT5zaXIxX3JlZ3MpOworCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKGRldiwgcHJpdi0+c2lyMV9yZXMtPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUocHJpdi0+c2lyMV9yZXMpKTsKKworCWRldm1faW91bm1hcChkZXYsIHByaXYtPnNpcjBfcmVncyk7CisJZGV2bV9yZWxlYXNlX21lbV9yZWdpb24oZGV2LCBwcml2LT5zaXIwX3Jlcy0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShwcml2LT5zaXIwX3JlcykpOworCisJZGV2bV9pb3VubWFwKGRldiwgcHJpdi0+cnh0eF9yZWdzKTsKKwlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihkZXYsIHByaXYtPnJ4dHhfcmVzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHByaXYtPnJ4dHhfcmVzKSk7CisKKwlkZXZtX2tmcmVlKGRldiwgcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3hnYmVfbWF0Y2hfcGh5X2RldmljZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXJldHVybiBwaHlkZXYtPmM0NV9pZHMuZGV2aWNlX2lkc1tNRElPX01NRF9QQ1NdID09IFhHQkVfUEhZX0lEOworfQorCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYW1kX3hnYmVfcGh5X2RyaXZlcltdID0geworCXsKKwkJLnBoeV9pZAkJCT0gWEdCRV9QSFlfSUQsCisJCS5waHlfaWRfbWFzawkJPSBYR0JFX1BIWV9NQVNLLAorCQkubmFtZQkJCT0gIkFNRCBYR0JFIFBIWSIsCisJCS5mZWF0dXJlcwkJPSAwLAorCQkucHJvYmUJCQk9IGFtZF94Z2JlX3BoeV9wcm9iZSwKKwkJLnJlbW92ZQkJCT0gYW1kX3hnYmVfcGh5X3JlbW92ZSwKKwkJLnNvZnRfcmVzZXQJCT0gYW1kX3hnYmVfcGh5X3NvZnRfcmVzZXQsCisJCS5jb25maWdfaW5pdAkJPSBhbWRfeGdiZV9waHlfY29uZmlnX2luaXQsCisJCS5zdXNwZW5kCQk9IGFtZF94Z2JlX3BoeV9zdXNwZW5kLAorCQkucmVzdW1lCQkJPSBhbWRfeGdiZV9waHlfcmVzdW1lLAorCQkuY29uZmlnX2FuZWcJCT0gYW1kX3hnYmVfcGh5X2NvbmZpZ19hbmVnLAorCQkuYW5lZ19kb25lCQk9IGFtZF94Z2JlX3BoeV9hbmVnX2RvbmUsCisJCS5yZWFkX3N0YXR1cwkJPSBhbWRfeGdiZV9waHlfcmVhZF9zdGF0dXMsCisJCS5tYXRjaF9waHlfZGV2aWNlCT0gYW1kX3hnYmVfbWF0Y2hfcGh5X2RldmljZSwKKwkJLmRyaXZlcgkJCT0geworCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZF94Z2JlX3BoeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBoeV9kcml2ZXJzX3JlZ2lzdGVyKGFtZF94Z2JlX3BoeV9kcml2ZXIsCisJCQkJICAgIEFSUkFZX1NJWkUoYW1kX3hnYmVfcGh5X2RyaXZlcikpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1kX3hnYmVfcGh5X2V4aXQodm9pZCkKK3sKKwlwaHlfZHJpdmVyc191bnJlZ2lzdGVyKGFtZF94Z2JlX3BoeV9kcml2ZXIsCisJCQkgICAgICAgQVJSQVlfU0laRShhbWRfeGdiZV9waHlfZHJpdmVyKSk7Cit9CisKK21vZHVsZV9pbml0KGFtZF94Z2JlX3BoeV9pbml0KTsKK21vZHVsZV9leGl0KGFtZF94Z2JlX3BoeV9leGl0KTsKKworc3RhdGljIHN0cnVjdCBtZGlvX2RldmljZV9pZCBfX21heWJlX3VudXNlZCBhbWRfeGdiZV9waHlfaWRzW10gPSB7CisJeyBYR0JFX1BIWV9JRCwgWEdCRV9QSFlfTUFTSyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUobWRpbywgYW1kX3hnYmVfcGh5X2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYXQ4MDN4LmMgYi9kcml2ZXJzL25ldC9waHkvYXQ4MDN4LmMKaW5kZXggNjQzNDY0ZC4uNmM2MjJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2F0ODAzeC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9hdDgwM3guYwpAQCAtMTQ0LDQxICsxNDQsMTEgQEAKIAogc3RhdGljIGludCBhdDgwM3hfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlpbnQgdmFsOwogCWludCByZXQ7Ci0JdTMyIGZlYXR1cmVzOwogCi0JZmVhdHVyZXMgPSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfTUlJIHwgU1VQUE9SVEVEX0FVSSB8Ci0JCSAgIFNVUFBPUlRFRF9GSUJSRSB8IFNVUFBPUlRFRF9CTkM7Ci0KLQl2YWwgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9CTVNSKTsKLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQotCWlmICh2YWwgJiBCTVNSX0FORUdDQVBBQkxFKQotCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfQXV0b25lZzsKLQlpZiAodmFsICYgQk1TUl8xMDBGVUxMKQotCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKLQlpZiAodmFsICYgQk1TUl8xMDBIQUxGKQotCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZjsKLQlpZiAodmFsICYgQk1TUl8xMEZVTEwpCi0JCWZlYXR1cmVzIHw9IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGw7Ci0JaWYgKHZhbCAmIEJNU1JfMTBIQUxGKQotCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfMTBiYXNlVF9IYWxmOwotCi0JaWYgKHZhbCAmIEJNU1JfRVNUQVRFTikgewotCQl2YWwgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9FU1RBVFVTKTsKLQkJaWYgKHZhbCA8IDApCi0JCQlyZXR1cm4gdmFsOwotCi0JCWlmICh2YWwgJiBFU1RBVFVTXzEwMDBfVEZVTEwpCi0JCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7Ci0JCWlmICh2YWwgJiBFU1RBVFVTXzEwMDBfVEhBTEYpCi0JCQlmZWF0dXJlcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGY7Ci0JfQotCi0JcGh5ZGV2LT5zdXBwb3J0ZWQgPSBmZWF0dXJlczsKLQlwaHlkZXYtPmFkdmVydGlzaW5nID0gZmVhdHVyZXM7CisJcmV0ID0gZ2VucGh5X2NvbmZpZ19pbml0KHBoeWRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpZiAocGh5ZGV2LT5pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1RYSUQpIHsKIAkJcmV0ID0gcGh5X3dyaXRlKHBoeWRldiwgQVQ4MDNYX0RFQlVHX0FERFIsCkBAIC0yODMsOCArMjUzLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGF0aGVyb3NfZXhpdCh2b2lkKQogewotCXJldHVybiBwaHlfZHJpdmVyc191bnJlZ2lzdGVyKGF0ODAzeF9kcml2ZXIsCi0JCQkJICAgICAgQVJSQVlfU0laRShhdDgwM3hfZHJpdmVyKSk7CisJcGh5X2RyaXZlcnNfdW5yZWdpc3RlcihhdDgwM3hfZHJpdmVyLCBBUlJBWV9TSVpFKGF0ODAzeF9kcml2ZXIpKTsKIH0KIAogbW9kdWxlX2luaXQoYXRoZXJvc19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKaW5kZXggYmE1NWFkZi4uZDYwZDg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9waHlfZml4ZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2RlZmluZSBNSUlfUkVHU19OVU0gMjkKIApAQCAtMzEsNyArMzIsNyBAQAogfTsKIAogc3RydWN0IGZpeGVkX3BoeSB7Ci0JaW50IGlkOworCWludCBhZGRyOwogCXUxNiByZWdzW01JSV9SRUdTX05VTV07CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAlzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyBzdGF0dXM7CkBAIC0xMDQsOCArMTA1LDggQEAKIAlpZiAoZnAtPnN0YXR1cy5hc3ltX3BhdXNlKQogCQlscGEgfD0gTFBBX1BBVVNFX0FTWU07CiAKLQlmcC0+cmVnc1tNSUlfUEhZU0lEMV0gPSBmcC0+aWQgPj4gMTY7Ci0JZnAtPnJlZ3NbTUlJX1BIWVNJRDJdID0gZnAtPmlkOworCWZwLT5yZWdzW01JSV9QSFlTSUQxXSA9IDA7CisJZnAtPnJlZ3NbTUlJX1BIWVNJRDJdID0gMDsKIAogCWZwLT5yZWdzW01JSV9CTVNSXSA9IGJtc3I7CiAJZnAtPnJlZ3NbTUlJX0JNQ1JdID0gYm1jcjsKQEAgLTExNSw3ICsxMTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpeGVkX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKK3N0YXRpYyBpbnQgZml4ZWRfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ19udW0pCiB7CiAJc3RydWN0IGZpeGVkX21kaW9fYnVzICpmbWIgPSBidXMtPnByaXY7CiAJc3RydWN0IGZpeGVkX3BoeSAqZnA7CkBAIC0xMjQsNyArMTI1LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmcCwgJmZtYi0+cGh5cywgbm9kZSkgewotCQlpZiAoZnAtPmlkID09IHBoeV9pZCkgeworCQlpZiAoZnAtPmFkZHIgPT0gcGh5X2FkZHIpIHsKIAkJCS8qIElzc3VlIGNhbGxiYWNrIGlmIHVzZXIgcmVnaXN0ZXJlZCBpdC4gKi8KIAkJCWlmIChmcC0+bGlua191cGRhdGUpIHsKIAkJCQlmcC0+bGlua191cGRhdGUoZnAtPnBoeWRldi0+YXR0YWNoZWRfZGV2LApAQCAtMTM4LDcgKzEzOSw3IEBACiAJcmV0dXJuIDB4RkZGRjsKIH0KIAotc3RhdGljIGludCBmaXhlZF9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfaWQsIGludCByZWdfbnVtLAorc3RhdGljIGludCBmaXhlZF9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ19udW0sCiAJCQkgICAgdTE2IHZhbCkKIHsKIAlyZXR1cm4gMDsKQEAgLTE2MCw3ICsxNjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZnAsICZmbWItPnBoeXMsIG5vZGUpIHsKLQkJaWYgKGZwLT5pZCA9PSBwaHlkZXYtPnBoeV9pZCkgeworCQlpZiAoZnAtPmFkZHIgPT0gcGh5ZGV2LT5hZGRyKSB7CiAJCQlmcC0+bGlua191cGRhdGUgPSBsaW5rX3VwZGF0ZTsKIAkJCWZwLT5waHlkZXYgPSBwaHlkZXY7CiAJCQlyZXR1cm4gMDsKQEAgLTE3MSw3ICsxNzIsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZml4ZWRfcGh5X3NldF9saW5rX3VwZGF0ZSk7CiAKLWludCBmaXhlZF9waHlfYWRkKHVuc2lnbmVkIGludCBpcnEsIGludCBwaHlfaWQsCitpbnQgZml4ZWRfcGh5X2FkZCh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgcGh5X2FkZHIsCiAJCSAgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cykKIHsKIAlpbnQgcmV0OwpAQCAtMTg0LDkgKzE4NSw5IEBACiAKIAltZW1zZXQoZnAtPnJlZ3MsIDB4RkYsICBzaXplb2YoZnAtPnJlZ3NbMF0pICogTUlJX1JFR1NfTlVNKTsKIAotCWZtYi0+aXJxc1twaHlfaWRdID0gaXJxOworCWZtYi0+aXJxc1twaHlfYWRkcl0gPSBpcnE7CiAKLQlmcC0+aWQgPSBwaHlfaWQ7CisJZnAtPmFkZHIgPSBwaHlfYWRkcjsKIAlmcC0+c3RhdHVzID0gKnN0YXR1czsKIAogCXJldCA9IGZpeGVkX3BoeV91cGRhdGVfcmVncyhmcCk7CkBAIC0yMDMsNiArMjA0LDY2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmaXhlZF9waHlfYWRkKTsKIAordm9pZCBmaXhlZF9waHlfZGVsKGludCBwaHlfYWRkcikKK3sKKwlzdHJ1Y3QgZml4ZWRfbWRpb19idXMgKmZtYiA9ICZwbGF0Zm9ybV9mbWI7CisJc3RydWN0IGZpeGVkX3BoeSAqZnAsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZnAsIHRtcCwgJmZtYi0+cGh5cywgbm9kZSkgeworCQlpZiAoZnAtPmFkZHIgPT0gcGh5X2FkZHIpIHsKKwkJCWxpc3RfZGVsKCZmcC0+bm9kZSk7CisJCQlrZnJlZShmcCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmaXhlZF9waHlfZGVsKTsKKworc3RhdGljIGludCBwaHlfZml4ZWRfYWRkcjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGh5X2ZpeGVkX2FkZHJfbG9jayk7CisKK2ludCBmaXhlZF9waHlfcmVnaXN0ZXIodW5zaWduZWQgaW50IGlycSwKKwkJICAgICAgIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBmaXhlZF9tZGlvX2J1cyAqZm1iID0gJnBsYXRmb3JtX2ZtYjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5OworCWludCBwaHlfYWRkcjsKKwlpbnQgcmV0OworCisJLyogR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBQSFkgYWRkcmVzcywgdXAgdG8gUEhZX01BWF9BRERSICovCisJc3Bpbl9sb2NrKCZwaHlfZml4ZWRfYWRkcl9sb2NrKTsKKwlpZiAocGh5X2ZpeGVkX2FkZHIgPT0gUEhZX01BWF9BRERSKSB7CisJCXNwaW5fdW5sb2NrKCZwaHlfZml4ZWRfYWRkcl9sb2NrKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCXBoeV9hZGRyID0gcGh5X2ZpeGVkX2FkZHIrKzsKKwlzcGluX3VubG9jaygmcGh5X2ZpeGVkX2FkZHJfbG9jayk7CisKKwlyZXQgPSBmaXhlZF9waHlfYWRkKFBIWV9QT0xMLCBwaHlfYWRkciwgc3RhdHVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBoeSA9IGdldF9waHlfZGV2aWNlKGZtYi0+bWlpX2J1cywgcGh5X2FkZHIsIGZhbHNlKTsKKwlpZiAoIXBoeSB8fCBJU19FUlIocGh5KSkgeworCQlmaXhlZF9waHlfZGVsKHBoeV9hZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2Zfbm9kZV9nZXQobnApOworCXBoeS0+ZGV2Lm9mX25vZGUgPSBucDsKKworCXJldCA9IHBoeV9kZXZpY2VfcmVnaXN0ZXIocGh5KTsKKwlpZiAocmV0KSB7CisJCXBoeV9kZXZpY2VfZnJlZShwaHkpOworCQlvZl9ub2RlX3B1dChucCk7CisJCWZpeGVkX3BoeV9kZWwocGh5X2FkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBmaXhlZF9tZGlvX2J1c19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGZpeGVkX21kaW9fYnVzICpmbWIgPSAmcGxhdGZvcm1fZm1iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwppbmRleCA3NmY1NGIzLi4yZTU4YWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwpAQCAtNjksNiArNjksNzMgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWRpb2J1c19hbGxvY19zaXplKTsKIAorc3RhdGljIHZvaWQgX2Rldm1fbWRpb2J1c19mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzKQoreworCW1kaW9idXNfZnJlZSgqKHN0cnVjdCBtaWlfYnVzICoqKXJlcyk7Cit9CisKK3N0YXRpYyBpbnQgZGV2bV9tZGlvYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtaWlfYnVzICoqciA9IHJlczsKKworCWlmIChXQVJOX09OKCFyIHx8ICEqcikpCisJCXJldHVybiAwOworCisJcmV0dXJuICpyID09IGRhdGE7Cit9CisKKy8qKgorICogZGV2bV9tZGlvYnVzX2FsbG9jX3NpemUgLSBSZXNvdXJjZS1tYW5hZ2VkIG1kaW9idXNfYWxsb2Nfc2l6ZSgpCisgKiBAZGV2OgkJRGV2aWNlIHRvIGFsbG9jYXRlIG1paV9idXMgZm9yCisgKiBAc2l6ZW9mX3ByaXY6CVNwYWNlIHRvIGFsbG9jYXRlIGZvciBwcml2YXRlIHN0cnVjdHVyZS4KKyAqCisgKiBNYW5hZ2VkIG1kaW9idXNfYWxsb2Nfc2l6ZS4gbWlpX2J1cyBhbGxvY2F0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBhdXRvbWF0aWNhbGx5IGZyZWVkIG9uIGRyaXZlciBkZXRhY2guCisgKgorICogSWYgYW4gbWlpX2J1cyBhbGxvY2F0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGZyZWVkIHNlcGFyYXRlbHksCisgKiBkZXZtX21kaW9idXNfZnJlZSgpIG11c3QgYmUgdXNlZC4KKyAqCisgKiBSRVRVUk5TOgorICogUG9pbnRlciB0byBhbGxvY2F0ZWQgbWlpX2J1cyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBtaWlfYnVzICpkZXZtX21kaW9idXNfYWxsb2Nfc2l6ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgbWlpX2J1cyAqKnB0ciwgKmJ1czsKKworCXB0ciA9IGRldnJlc19hbGxvYyhfZGV2bV9tZGlvYnVzX2ZyZWUsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiBOVUxMOworCisJLyogdXNlIHJhdyBhbGxvY19kciBmb3Iga21hbGxvYyBjYWxsZXIgdHJhY2luZyAqLworCWJ1cyA9IG1kaW9idXNfYWxsb2Nfc2l6ZShzaXplb2ZfcHJpdik7CisJaWYgKGJ1cykgeworCQkqcHRyID0gYnVzOworCQlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwl9IGVsc2UgeworCQlkZXZyZXNfZnJlZShwdHIpOworCX0KKworCXJldHVybiBidXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX21kaW9idXNfYWxsb2Nfc2l6ZSk7CisKKy8qKgorICogZGV2bV9tZGlvYnVzX2ZyZWUgLSBSZXNvdXJjZS1tYW5hZ2VkIG1kaW9idXNfZnJlZSgpCisgKiBAZGV2OgkJRGV2aWNlIHRoaXMgbWlpX2J1cyBiZWxvbmdzIHRvCisgKiBAYnVzOgkJdGhlIG1paV9idXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBGcmVlIG1paV9idXMgYWxsb2NhdGVkIHdpdGggZGV2bV9tZGlvYnVzX2FsbG9jX3NpemUoKS4KKyAqLwordm9pZCBkZXZtX21kaW9idXNfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJaW50IHJjOworCisJcmMgPSBkZXZyZXNfcmVsZWFzZShkZXYsIF9kZXZtX21kaW9idXNfZnJlZSwKKwkJCSAgICBkZXZtX21kaW9idXNfbWF0Y2gsIGJ1cyk7CisJV0FSTl9PTihyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX21kaW9idXNfZnJlZSk7CisKIC8qKgogICogbWRpb2J1c19yZWxlYXNlIC0gbWlpX2J1cyBkZXZpY2UgcmVsZWFzZSBjYWxsYmFjawogICogQGQ6IHRoZSB0YXJnZXQgc3RydWN0IGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBtaWlfYnVzCkBAIC0yMzMsNiArMzAwLDEyIEBACiAJaWYgKElTX0VSUihwaHlkZXYpIHx8IHBoeWRldiA9PSBOVUxMKQogCQlyZXR1cm4gcGh5ZGV2OwogCisJLyoKKwkgKiBGb3IgRFQsIHNlZSBpZiB0aGUgYXV0by1wcm9iZWQgcGh5IGhhcyBhIGNvcnJlc3BvZGluZyBjaGlsZAorCSAqIGluIHRoZSBidXMgbm9kZSwgYW5kIHNldCB0aGUgb2Zfbm9kZSBwb2ludGVyIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlvZl9tZGlvYnVzX2xpbmtfcGh5ZGV2KGJ1cywgcGh5ZGV2KTsKKwogCWVyciA9IHBoeV9kZXZpY2VfcmVnaXN0ZXIocGh5ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXBoeV9kZXZpY2VfZnJlZShwaHlkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jIGIvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jCmluZGV4IGQ4NDk2ODQuLmJjN2M3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9taWNyZWwuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMKQEAgLTI4Myw2ICsyODMsMTEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgTUlJX0tTWjkwMzFSTl9NTURfQ1RSTF9SRUcJMHgwZAorI2RlZmluZSBNSUlfS1NaOTAzMVJOX01NRF9SRUdEQVRBX1JFRwkweDBlCisjZGVmaW5lIE9QX0RBVEEJCQkJMQorI2RlZmluZSBLU1o5MDMxX1BTX1RPX1JFRwkJNjAKKworLyogRXh0ZW5kZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fQ09OVFJPTF9QQURfU0tFVwk0CisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fUlhfREFUQV9QQURfU0tFVwk1CisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fVFhfREFUQV9QQURfU0tFVwk2CisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fQ0xLX1BBRF9TS0VXCTgKKworc3RhdGljIGludCBrc3o5MDMxX2V4dGVuZGVkX3dyaXRlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJCQkJICB1OCBtb2RlLCB1MzIgZGV2X2FkZHIsIHUzMiByZWdudW0sIHUxNiB2YWwpCit7CisJcGh5X3dyaXRlKHBoeWRldiwgTUlJX0tTWjkwMzFSTl9NTURfQ1RSTF9SRUcsIGRldl9hZGRyKTsKKwlwaHlfd3JpdGUocGh5ZGV2LCBNSUlfS1NaOTAzMVJOX01NRF9SRUdEQVRBX1JFRywgcmVnbnVtKTsKKwlwaHlfd3JpdGUocGh5ZGV2LCBNSUlfS1NaOTAzMVJOX01NRF9DVFJMX1JFRywgKG1vZGUgPDwgMTQpIHwgZGV2X2FkZHIpOworCXJldHVybiBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfS1NaOTAzMVJOX01NRF9SRUdEQVRBX1JFRywgdmFsKTsKK30KKworc3RhdGljIGludCBrc3o5MDMxX2V4dGVuZGVkX3JlYWQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkgdTggbW9kZSwgdTMyIGRldl9hZGRyLCB1MzIgcmVnbnVtKQoreworCXBoeV93cml0ZShwaHlkZXYsIE1JSV9LU1o5MDMxUk5fTU1EX0NUUkxfUkVHLCBkZXZfYWRkcik7CisJcGh5X3dyaXRlKHBoeWRldiwgTUlJX0tTWjkwMzFSTl9NTURfUkVHREFUQV9SRUcsIHJlZ251bSk7CisJcGh5X3dyaXRlKHBoeWRldiwgTUlJX0tTWjkwMzFSTl9NTURfQ1RSTF9SRUcsIChtb2RlIDw8IDE0KSB8IGRldl9hZGRyKTsKKwlyZXR1cm4gcGh5X3JlYWQocGh5ZGV2LCBNSUlfS1NaOTAzMVJOX01NRF9SRUdEQVRBX1JFRyk7Cit9CisKK3N0YXRpYyBpbnQga3N6OTAzMV9vZl9sb2FkX3NrZXdfdmFsdWVzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKKwkJCQkgICAgICAgdTE2IHJlZywgc2l6ZV90IGZpZWxkX3N6LAorCQkJCSAgICAgICBjaGFyICpmaWVsZFtdLCB1OCBudW1maWVsZHMpCit7CisJaW50IHZhbFs0XSA9IHstMSwgLTIsIC0zLCAtNH07CisJaW50IG1hdGNoZXMgPSAwOworCXUxNiBtYXNrOworCXUxNiBtYXh2YWw7CisJdTE2IG5ld3ZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1maWVsZHM7IGkrKykKKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCBmaWVsZFtpXSwgdmFsICsgaSkpCisJCQltYXRjaGVzKys7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJaWYgKG1hdGNoZXMgPCBudW1maWVsZHMpCisJCW5ld3ZhbCA9IGtzejkwMzFfZXh0ZW5kZWRfcmVhZChwaHlkZXYsIE9QX0RBVEEsIDIsIHJlZyk7CisJZWxzZQorCQluZXd2YWwgPSAwOworCisJbWF4dmFsID0gKGZpZWxkX3N6ID09IDQpID8gMHhmIDogMHgxZjsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtZmllbGRzOyBpKyspCisJCWlmICh2YWxbaV0gIT0gLShpICsgMSkpIHsKKwkJCW1hc2sgPSAweGZmZmY7CisJCQltYXNrIF49IG1heHZhbCA8PCAoZmllbGRfc3ogKiBpKTsKKwkJCW5ld3ZhbCA9IChuZXd2YWwgJiBtYXNrKSB8CisJCQkJKCgodmFsW2ldIC8gS1NaOTAzMV9QU19UT19SRUcpICYgbWF4dmFsKQorCQkJCQk8PCAoZmllbGRfc3ogKiBpKSk7CisJCX0KKworCXJldHVybiBrc3o5MDMxX2V4dGVuZGVkX3dyaXRlKHBoeWRldiwgT1BfREFUQSwgMiwgcmVnLCBuZXd2YWwpOworfQorCitzdGF0aWMgaW50IGtzejkwMzFfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGh5ZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gZGV2LT5vZl9ub2RlOworCWNoYXIgKmNsa19za2V3c1syXSA9IHsicnhjLXNrZXctcHMiLCAidHhjLXNrZXctcHMifTsKKwljaGFyICpyeF9kYXRhX3NrZXdzWzRdID0geworCQkicnhkMC1za2V3LXBzIiwgInJ4ZDEtc2tldy1wcyIsCisJCSJyeGQyLXNrZXctcHMiLCAicnhkMy1za2V3LXBzIgorCX07CisJY2hhciAqdHhfZGF0YV9za2V3c1s0XSA9IHsKKwkJInR4ZDAtc2tldy1wcyIsICJ0eGQxLXNrZXctcHMiLAorCQkidHhkMi1za2V3LXBzIiwgInR4ZDMtc2tldy1wcyIKKwl9OworCWNoYXIgKmNvbnRyb2xfc2tld3NbMl0gPSB7InR4ZW4tc2tldy1wcyIsICJyeGR2LXNrZXctcHMifTsKKworCWlmICghb2Zfbm9kZSAmJiBkZXYtPnBhcmVudC0+b2Zfbm9kZSkKKwkJb2Zfbm9kZSA9IGRldi0+cGFyZW50LT5vZl9ub2RlOworCisJaWYgKG9mX25vZGUpIHsKKwkJa3N6OTAzMV9vZl9sb2FkX3NrZXdfdmFsdWVzKHBoeWRldiwgb2Zfbm9kZSwKKwkJCQlNSUlfS1NaOTAzMVJOX0NMS19QQURfU0tFVywgNSwKKwkJCQljbGtfc2tld3MsIDIpOworCisJCWtzejkwMzFfb2ZfbG9hZF9za2V3X3ZhbHVlcyhwaHlkZXYsIG9mX25vZGUsCisJCQkJTUlJX0tTWjkwMzFSTl9DT05UUk9MX1BBRF9TS0VXLCA0LAorCQkJCWNvbnRyb2xfc2tld3MsIDIpOworCisJCWtzejkwMzFfb2ZfbG9hZF9za2V3X3ZhbHVlcyhwaHlkZXYsIG9mX25vZGUsCisJCQkJTUlJX0tTWjkwMzFSTl9SWF9EQVRBX1BBRF9TS0VXLCA0LAorCQkJCXJ4X2RhdGFfc2tld3MsIDQpOworCisJCWtzejkwMzFfb2ZfbG9hZF9za2V3X3ZhbHVlcyhwaHlkZXYsIG9mX25vZGUsCisJCQkJTUlJX0tTWjkwMzFSTl9UWF9EQVRBX1BBRF9TS0VXLCA0LAorCQkJCXR4X2RhdGFfc2tld3MsIDQpOworCX0KKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBLU1o4ODczTUxMX0dMT0JBTF9DT05UUk9MXzQJMHgwNgogI2RlZmluZSBLU1o4ODczTUxMX0dMT0JBTF9DT05UUk9MXzRfRFVQTEVYCSgxIDw8IDYpCiAjZGVmaW5lIEtTWjg4NzNNTExfR0xPQkFMX0NPTlRST0xfNF9TUEVFRAkoMSA8PCA0KQpAQCAtNDY5LDcgKzU3Myw3IEBACiAJLmZlYXR1cmVzCT0gKFBIWV9HQklUX0ZFQVRVUkVTIHwgU1VQUE9SVEVEX1BhdXNlCiAJCQkJfCBTVVBQT1JURURfQXN5bV9QYXVzZSksCiAJLmZsYWdzCQk9IFBIWV9IQVNfTUFHSUNBTkVHIHwgUEhZX0hBU19JTlRFUlJVUFQsCi0JLmNvbmZpZ19pbml0CT0ga3N6cGh5X2NvbmZpZ19pbml0LAorCS5jb25maWdfaW5pdAk9IGtzejkwMzFfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKIAkuYWNrX2ludGVycnVwdAk9IGtzenBoeV9hY2tfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggNDk4N2ExYy4uMzVkNzUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbWRpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKQEAgLTEwNjcsMTQgKzEwNjgsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZ2VucGh5X3NvZnRfcmVzZXQpOwogCi1zdGF0aWMgaW50IGdlbnBoeV9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoraW50IGdlbnBoeV9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCB2YWw7CiAJdTMyIGZlYXR1cmVzOwogCi0JLyogRm9yIG5vdywgSSdsbCBjbGFpbSB0aGF0IHRoZSBnZW5lcmljIGRyaXZlciBzdXBwb3J0cwotCSAqIGFsbCBwb3NzaWJsZSBwb3J0IHR5cGVzCi0JICovCiAJZmVhdHVyZXMgPSAoU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSQogCQkJfCBTVVBQT1JURURfQVVJIHwgU1VQUE9SVEVEX0ZJQlJFIHwKIAkJCVNVUFBPUlRFRF9CTkMpOwpAQCAtMTEwNyw4ICsxMTA1LDggQEAKIAkJCWZlYXR1cmVzIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZjsKIAl9CiAKLQlwaHlkZXYtPnN1cHBvcnRlZCA9IGZlYXR1cmVzOwotCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBmZWF0dXJlczsKKwlwaHlkZXYtPnN1cHBvcnRlZCAmPSBmZWF0dXJlczsKKwlwaHlkZXYtPmFkdmVydGlzaW5nICY9IGZlYXR1cmVzOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTE4LDYgKzExMTYsNyBAQAogCS8qIERvIG5vdGhpbmcgZm9yIG5vdyAqLwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChnZW5waHlfY29uZmlnX2luaXQpOwogCiBzdGF0aWMgaW50IGdlbjEwZ19jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewpAQCAtMTE2OCw2ICsxMTY3LDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG9mX3NldF9waHlfc3VwcG9ydGVkKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGh5ZGV2LT5kZXYub2Zfbm9kZTsKKwl1MzIgbWF4X3NwZWVkOworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRl9NRElPKSkKKwkJcmV0dXJuOworCisJaWYgKCFub2RlKQorCQlyZXR1cm47CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJtYXgtc3BlZWQiLCAmbWF4X3NwZWVkKSkgeworCQkvKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBoeWRldi0+c3VwcG9ydGVkIGFyZSBwcm92aWRlZCBieSB0aGUgUEhZCisJCSAqIGRyaXZlciAiZmVhdHVyZXMiIG1lbWJlciwgd2Ugd2FudCB0byByZXNldCB0byBzYW5lIGRlZmF1bHRzIGZpc3QKKwkJICogYmVmb3JlIHN1cHBvcnRpbmcgaGlnaGVyIHNwZWVkcy4KKwkJICovCisJCXBoeWRldi0+c3VwcG9ydGVkICY9IFBIWV9ERUZBVUxUX0ZFQVRVUkVTOworCisJCXN3aXRjaCAobWF4X3NwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gUEhZXzEwMDBCVF9GRUFUVVJFUzsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBQSFlfMTAwQlRfRkVBVFVSRVM7CisJCWNhc2UgU1BFRURfMTA6CisJCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBQSFlfMTBCVF9GRUFUVVJFUzsKKwkJfQorCX0KK30KKwogLyoqCiAgKiBwaHlfcHJvYmUgLSBwcm9iZSBhbmQgaW5pdCBhIFBIWSBkZXZpY2UKICAqIEBkZXY6IGRldmljZSB0byBwcm9iZSBhbmQgaW5pdApAQCAtMTIwMiw3ICsxMjMzLDggQEAKIAkgKiBvciBib3RoIG9mIHRoZXNlIHZhbHVlcwogCSAqLwogCXBoeWRldi0+c3VwcG9ydGVkID0gcGh5ZHJ2LT5mZWF0dXJlczsKLQlwaHlkZXYtPmFkdmVydGlzaW5nID0gcGh5ZHJ2LT5mZWF0dXJlczsKKwlvZl9zZXRfcGh5X3N1cHBvcnRlZChwaHlkZXYpOworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAogCS8qIFNldCB0aGUgc3RhdGUgdG8gUkVBRFkgYnkgZGVmYXVsdCAqLwogCXBoeWRldi0+c3RhdGUgPSBQSFlfUkVBRFk7CkBAIC0xMjk1LDcgKzEzMjcsOSBAQAogCS5uYW1lCQk9ICJHZW5lcmljIFBIWSIsCiAJLnNvZnRfcmVzZXQJPSBnZW5waHlfc29mdF9yZXNldCwKIAkuY29uZmlnX2luaXQJPSBnZW5waHlfY29uZmlnX2luaXQsCi0JLmZlYXR1cmVzCT0gMCwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9NSUkgfAorCQkJICBTVVBQT1JURURfQVVJIHwgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCSAgU1VQUE9SVEVEX0JOQywKIAkuY29uZmlnX2FuZWcJPSBnZW5waHlfY29uZmlnX2FuZWcsCiAJLmFuZWdfZG9uZQk9IGdlbnBoeV9hbmVnX2RvbmUsCiAJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3JlYWx0ZWsuYyBiL2RyaXZlcnMvbmV0L3BoeS9yZWFsdGVrLmMKaW5kZXggZmExZDY5YS4uNDU0ODNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3JlYWx0ZWsuYworKysgYi9kcml2ZXJzL25ldC9waHkvcmVhbHRlay5jCkBAIC02NCw2NSArNjQsNTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBSVEw4MjAxQ1AgKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBydGw4MjAxY3BfZHJpdmVyID0gewotCS5waHlfaWQgICAgICAgICA9IDB4MDAwMDgyMDEsCi0JLm5hbWUgICAgICAgICAgID0gIlJUTDgyMDFDUCBFdGhlcm5ldCIsCi0JLnBoeV9pZF9tYXNrICAgID0gMHgwMDAwZmZmZiwKLQkuZmVhdHVyZXMgICAgICAgPSBQSFlfQkFTSUNfRkVBVFVSRVMsCi0JLmZsYWdzICAgICAgICAgID0gUEhZX0hBU19JTlRFUlJVUFQsCi0JLmNvbmZpZ19hbmVnICAgID0gJmdlbnBoeV9jb25maWdfYW5lZywKLQkucmVhZF9zdGF0dXMgICAgPSAmZ2VucGh5X3JlYWRfc3RhdHVzLAotCS5kcml2ZXIgICAgICAgICA9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKLX07Ci0KLS8qIFJUTDgyMTFCICovCi1zdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgcnRsODIxMWJfZHJpdmVyID0gewotCS5waHlfaWQJCT0gMHgwMDFjYzkxMiwKLQkubmFtZQkJPSAiUlRMODIxMUIgR2lnYWJpdCBFdGhlcm5ldCIsCi0JLnBoeV9pZF9tYXNrCT0gMHgwMDFmZmZmZiwKLQkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKLQkuZmxhZ3MJCT0gUEhZX0hBU19JTlRFUlJVUFQsCi0JLmNvbmZpZ19hbmVnCT0gJmdlbnBoeV9jb25maWdfYW5lZywKLQkucmVhZF9zdGF0dXMJPSAmZ2VucGh5X3JlYWRfc3RhdHVzLAotCS5hY2tfaW50ZXJydXB0CT0gJnJ0bDgyMXhfYWNrX2ludGVycnVwdCwKLQkuY29uZmlnX2ludHIJPSAmcnRsODIxMWJfY29uZmlnX2ludHIsCi0JLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLH0sCi19OwotCi0vKiBSVEw4MjExRSAqLwotc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIHJ0bDgyMTFlX2RyaXZlciA9IHsKLQkucGh5X2lkCQk9IDB4MDAxY2M5MTUsCi0JLm5hbWUJCT0gIlJUTDgyMTFFIEdpZ2FiaXQgRXRoZXJuZXQiLAotCS5waHlfaWRfbWFzawk9IDB4MDAxZmZmZmYsCi0JLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCi0JLmZsYWdzCQk9IFBIWV9IQVNfSU5URVJSVVBULAotCS5jb25maWdfYW5lZwk9ICZnZW5waHlfY29uZmlnX2FuZWcsCi0JLnJlYWRfc3RhdHVzCT0gJmdlbnBoeV9yZWFkX3N0YXR1cywKLQkuYWNrX2ludGVycnVwdAk9ICZydGw4MjF4X2Fja19pbnRlcnJ1cHQsCi0JLmNvbmZpZ19pbnRyCT0gJnJ0bDgyMTFlX2NvbmZpZ19pbnRyLAotCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBnZW5waHlfcmVzdW1lLAotCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAorc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIHJlYWx0ZWtfZHJ2c1tdID0geworCXsKKwkJLnBoeV9pZCAgICAgICAgID0gMHgwMDAwODIwMSwKKwkJLm5hbWUgICAgICAgICAgID0gIlJUTDgyMDFDUCBFdGhlcm5ldCIsCisJCS5waHlfaWRfbWFzayAgICA9IDB4MDAwMGZmZmYsCisJCS5mZWF0dXJlcyAgICAgICA9IFBIWV9CQVNJQ19GRUFUVVJFUywKKwkJLmZsYWdzICAgICAgICAgID0gUEhZX0hBU19JTlRFUlJVUFQsCisJCS5jb25maWdfYW5lZyAgICA9ICZnZW5waHlfY29uZmlnX2FuZWcsCisJCS5yZWFkX3N0YXR1cyAgICA9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJCS5kcml2ZXIgICAgICAgICA9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKKwl9LCB7CisJCS5waHlfaWQJCT0gMHgwMDFjYzkxMiwKKwkJLm5hbWUJCT0gIlJUTDgyMTFCIEdpZ2FiaXQgRXRoZXJuZXQiLAorCQkucGh5X2lkX21hc2sJPSAweDAwMWZmZmZmLAorCQkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkJLmZsYWdzCQk9IFBIWV9IQVNfSU5URVJSVVBULAorCQkuY29uZmlnX2FuZWcJPSAmZ2VucGh5X2NvbmZpZ19hbmVnLAorCQkucmVhZF9zdGF0dXMJPSAmZ2VucGh5X3JlYWRfc3RhdHVzLAorCQkuYWNrX2ludGVycnVwdAk9ICZydGw4MjF4X2Fja19pbnRlcnJ1cHQsCisJCS5jb25maWdfaW50cgk9ICZydGw4MjExYl9jb25maWdfaW50ciwKKwkJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLH0sCisJfSwgeworCQkucGh5X2lkCQk9IDB4MDAxY2M5MTUsCisJCS5uYW1lCQk9ICJSVEw4MjExRSBHaWdhYml0IEV0aGVybmV0IiwKKwkJLnBoeV9pZF9tYXNrCT0gMHgwMDFmZmZmZiwKKwkJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJCS5mbGFncwkJPSBQSFlfSEFTX0lOVEVSUlVQVCwKKwkJLmNvbmZpZ19hbmVnCT0gJmdlbnBoeV9jb25maWdfYW5lZywKKwkJLnJlYWRfc3RhdHVzCT0gJmdlbnBoeV9yZWFkX3N0YXR1cywKKwkJLmFja19pbnRlcnJ1cHQJPSAmcnRsODIxeF9hY2tfaW50ZXJydXB0LAorCQkuY29uZmlnX2ludHIJPSAmcnRsODIxMWVfY29uZmlnX2ludHIsCisJCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZ2VucGh5X3Jlc3VtZSwKKwkJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLH0sCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlYWx0ZWtfaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZydGw4MjAxY3BfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3RlcigmcnRsODIxMWJfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIHBoeV9kcml2ZXJfcmVnaXN0ZXIoJnJ0bDgyMTFlX2RyaXZlcik7CisJcmV0dXJuIHBoeV9kcml2ZXJzX3JlZ2lzdGVyKHJlYWx0ZWtfZHJ2cywgQVJSQVlfU0laRShyZWFsdGVrX2RydnMpKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHJlYWx0ZWtfZXhpdCh2b2lkKQogewotCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmcnRsODIxMWJfZHJpdmVyKTsKLQlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJnJ0bDgyMTFlX2RyaXZlcik7CisJcGh5X2RyaXZlcnNfdW5yZWdpc3RlcihyZWFsdGVrX2RydnMsIEFSUkFZX1NJWkUocmVhbHRla19kcnZzKSk7CiB9CiAKIG1vZHVsZV9pbml0KHJlYWx0ZWtfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvc21zYy5jIGIvZHJpdmVycy9uZXQvcGh5L3Ntc2MuYwppbmRleCAxMWYzNDgxLi4xODBjNDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvc21zYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9zbXNjLmMKQEAgLTI0OSw4ICsyNDksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc21zY19leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHBoeV9kcml2ZXJzX3VucmVnaXN0ZXIoc21zY19waHlfZHJpdmVyLAotCQlBUlJBWV9TSVpFKHNtc2NfcGh5X2RyaXZlcikpOworCXBoeV9kcml2ZXJzX3VucmVnaXN0ZXIoc21zY19waHlfZHJpdmVyLCBBUlJBWV9TSVpFKHNtc2NfcGh5X2RyaXZlcikpOwogfQogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgUEhZIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYyBiL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKaW5kZXggMTQzNzJjNi4uNWRjMDkzNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYwpAQCAtMzE5LDggKzMxOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2c2M4Mnh4X2V4aXQodm9pZCkKIHsKLQlyZXR1cm4gcGh5X2RyaXZlcnNfdW5yZWdpc3Rlcih2c2M4Mnh4X2RyaXZlciwKLQkJQVJSQVlfU0laRSh2c2M4Mnh4X2RyaXZlcikpOworCXBoeV9kcml2ZXJzX3VucmVnaXN0ZXIodnNjODJ4eF9kcml2ZXIsIEFSUkFZX1NJWkUodnNjODJ4eF9kcml2ZXIpKTsKIH0KIAogbW9kdWxlX2luaXQodnNjODJ4eF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKaW5kZXggZTM5MjNlYi4uOTFkNmMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKQEAgLTc1Nyw3ICs3NTcsNyBAQAogCiAJCWVyciA9IGdldF9maWx0ZXIoYXJncCwgJmNvZGUpOwogCQlpZiAoZXJyID49IDApIHsKLQkJCXN0cnVjdCBzb2NrX2Zwcm9nIGZwcm9nID0geworCQkJc3RydWN0IHNvY2tfZnByb2dfa2VybiBmcHJvZyA9IHsKIAkJCQkubGVuID0gZXJyLAogCQkJCS5maWx0ZXIgPSBjb2RlLAogCQkJfTsKQEAgLTc3OCw3ICs3NzgsNyBAQAogCiAJCWVyciA9IGdldF9maWx0ZXIoYXJncCwgJmNvZGUpOwogCQlpZiAoZXJyID49IDApIHsKLQkJCXN0cnVjdCBzb2NrX2Zwcm9nIGZwcm9nID0geworCQkJc3RydWN0IHNvY2tfZnByb2dfa2VybiBmcHJvZyA9IHsKIAkJCQkubGVuID0gZXJyLAogCQkJCS5maWx0ZXIgPSBjb2RlLAogCQkJfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMgYi9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCmluZGV4IDAxODA1MzEuLjFhZmY5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwdHAuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJbmZfcmVzZXQoc2tiKTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQlpcF9zZWxlY3RfaWRlbnQoc2tiLCAmcnQtPmRzdCwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KHNrYiwgTlVMTCk7CiAJaXBfc2VuZF9jaGVjayhpcGgpOwogCiAJaXBfbG9jYWxfb3V0KHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yaW9uZXQuYyBiL2RyaXZlcnMvbmV0L3Jpb25ldC5jCmluZGV4IGE4NDk3MTguLmRhYzdhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Jpb25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3Jpb25ldC5jCkBAIC00OTQsNyArNDk0LDcgQEAKIAluZGV2LT5tdHUgPSBSSU9fTUFYX01TR19TSVpFIC0gMTQ7CiAJbmRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0xMVFg7CiAJU0VUX05FVERFVl9ERVYobmRldiwgJm1wb3J0LT5kZXYpOwotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmcmlvbmV0X2V0aHRvb2xfb3BzKTsKKwluZGV2LT5ldGh0b29sX29wcyA9ICZyaW9uZXRfZXRodG9vbF9vcHM7CiAKIAlzcGluX2xvY2tfaW5pdCgmcm5ldC0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJuZXQtPnR4X2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVhbS90ZWFtLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW0uYwppbmRleCBjZTQ5ODliLi5iNDk1OGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWFtL3RlYW0uYworKysgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW0uYwpAQCAtOTY4LDcgKzk2OCw3IEBACiBzdGF0aWMgdm9pZCBfX3RlYW1fY29tcHV0ZV9mZWF0dXJlcyhzdHJ1Y3QgdGVhbSAqdGVhbSkKIHsKIAlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OwotCXUzMiB2bGFuX2ZlYXR1cmVzID0gVEVBTV9WTEFOX0ZFQVRVUkVTOworCXUzMiB2bGFuX2ZlYXR1cmVzID0gVEVBTV9WTEFOX0ZFQVRVUkVTICYgTkVUSUZfRl9BTExfRk9SX0FMTDsKIAl1bnNpZ25lZCBzaG9ydCBtYXhfaGFyZF9oZWFkZXJfbGVuID0gRVRIX0hMRU47CiAJdW5zaWduZWQgaW50IGZsYWdzLCBkc3RfcmVsZWFzZV9mbGFnID0gSUZGX1hNSVRfRFNUX1JFTEVBU0U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9sb2FkYmFsYW5jZS5jCmluZGV4IGRiZGUzNDEuLmE1OGRmZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfbG9hZGJhbGFuY2UuYwpAQCAtNDksNyArNDksNyBAQAogc3RydWN0IGxiX3ByaXZfZXggewogCXN0cnVjdCB0ZWFtICp0ZWFtOwogCXN0cnVjdCBsYl9wb3J0X21hcHBpbmcgdHhfaGFzaF90b19wb3J0X21hcHBpbmdbTEJfVFhfSEFTSFRBQkxFX1NJWkVdOwotCXN0cnVjdCBzb2NrX2Zwcm9nICpvcmlnX2Zwcm9nOworCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gKm9yaWdfZnByb2c7CiAJc3RydWN0IHsKIAkJdW5zaWduZWQgaW50IHJlZnJlc2hfaW50ZXJ2YWw7IC8qIGluIHRlbnRocyBvZiBzZWNvbmQgKi8KIAkJc3RydWN0IGRlbGF5ZWRfd29yayByZWZyZXNoX2R3OwpAQCAtMjQxLDE1ICsyNDEsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2Zwcm9nX2NyZWF0ZShzdHJ1Y3Qgc29ja19mcHJvZyAqKnBmcHJvZywgdTMyIGRhdGFfbGVuLAorc3RhdGljIGludCBfX2Zwcm9nX2NyZWF0ZShzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuICoqcGZwcm9nLCB1MzIgZGF0YV9sZW4sCiAJCQkgIGNvbnN0IHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHNvY2tfZnByb2cgKmZwcm9nOworCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gKmZwcm9nOwogCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciAqKSBkYXRhOwogCiAJaWYgKGRhdGFfbGVuICUgc2l6ZW9mKHN0cnVjdCBzb2NrX2ZpbHRlcikpCiAJCXJldHVybiAtRUlOVkFMOwotCWZwcm9nID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2tfZnByb2cpLCBHRlBfS0VSTkVMKTsKKwlmcHJvZyA9IGttYWxsb2Moc2l6ZW9mKCpmcHJvZyksIEdGUF9LRVJORUwpOwogCWlmICghZnByb2cpCiAJCXJldHVybiAtRU5PTUVNOwogCWZwcm9nLT5maWx0ZXIgPSBrbWVtZHVwKGZpbHRlciwgZGF0YV9sZW4sIEdGUF9LRVJORUwpOwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZnByb2dfZGVzdHJveShzdHJ1Y3Qgc29ja19mcHJvZyAqZnByb2cpCitzdGF0aWMgdm9pZCBfX2Zwcm9nX2Rlc3Ryb3koc3RydWN0IHNvY2tfZnByb2dfa2VybiAqZnByb2cpCiB7CiAJa2ZyZWUoZnByb2ctPmZpbHRlcik7CiAJa2ZyZWUoZnByb2cpOwpAQCAtMjczLDcgKzI3Myw3IEBACiAJc3RydWN0IGxiX3ByaXYgKmxiX3ByaXYgPSBnZXRfbGJfcHJpdih0ZWFtKTsKIAlzdHJ1Y3Qgc2tfZmlsdGVyICpmcCA9IE5VTEw7CiAJc3RydWN0IHNrX2ZpbHRlciAqb3JpZ19mcDsKLQlzdHJ1Y3Qgc29ja19mcHJvZyAqZnByb2cgPSBOVUxMOworCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gKmZwcm9nID0gTlVMTDsKIAlpbnQgZXJyOwogCiAJaWYgKGN0eC0+ZGF0YS5iaW5fdmFsLmxlbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCBlZTMyOGJhLi45OGJhZDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtNDk4LDEyICs0OTgsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCXRmaWxlID0gcnRubF9kZXJlZmVyZW5jZSh0dW4tPnRmaWxlc1tpXSk7CiAJCUJVR19PTighdGZpbGUpOwotCQl3YWtlX3VwX2FsbCgmdGZpbGUtPndxLndhaXQpOworCQl0ZmlsZS0+c29ja2V0LnNrLT5za19kYXRhX3JlYWR5KHRmaWxlLT5zb2NrZXQuc2spOwogCQlSQ1VfSU5JVF9QT0lOVEVSKHRmaWxlLT50dW4sIE5VTEwpOwogCQktLXR1bi0+bnVtcXVldWVzOwogCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRmaWxlLCAmdHVuLT5kaXNhYmxlZCwgbmV4dCkgewotCQl3YWtlX3VwX2FsbCgmdGZpbGUtPndxLndhaXQpOworCQl0ZmlsZS0+c29ja2V0LnNrLT5za19kYXRhX3JlYWR5KHRmaWxlLT5zb2NrZXQuc2spOwogCQlSQ1VfSU5JVF9QT0lOVEVSKHRmaWxlLT50dW4sIE5VTEwpOwogCX0KIAlCVUdfT04odHVuLT5udW1xdWV1ZXMgIT0gMCk7CkBAIC04MDcsOCArODA3LDcgQEAKIAkvKiBOb3RpZnkgYW5kIHdha2UgdXAgcmVhZGVyIHByb2Nlc3MgKi8KIAlpZiAodGZpbGUtPmZsYWdzICYgVFVOX0ZBU1lOQykKIAkJa2lsbF9mYXN5bmMoJnRmaWxlLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbCgmdGZpbGUtPndxLndhaXQsIFBPTExJTiB8Ci0JCQkJICAgUE9MTFJETk9STSB8IFBPTExSREJBTkQpOworCXRmaWxlLT5zb2NrZXQuc2stPnNrX2RhdGFfcmVhZHkodGZpbGUtPnNvY2tldC5zayk7CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtOTY1LDcgKzk2NCw3IEBACiAKIAl0dW5fZGVidWcoS0VSTl9JTkZPLCB0dW4sICJ0dW5fY2hyX3BvbGxcbiIpOwogCi0JcG9sbF93YWl0KGZpbGUsICZ0ZmlsZS0+d3Eud2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsIHNrX3NsZWVwKHNrKSwgd2FpdCk7CiAKIAlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CkBAIC0xMzMwLDQ3ICsxMzI5LDI2IEBACiBzdGF0aWMgc3NpemVfdCB0dW5fZG9fcmVhZChzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLAogCQkJICAgY29uc3Qgc3RydWN0IGlvdmVjICppdiwgc3NpemVfdCBsZW4sIGludCBub2Jsb2NrKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3NpemVfdCByZXQgPSAwOworCWludCBwZWVrZWQsIGVyciwgb2ZmID0gMDsKIAogCXR1bl9kZWJ1ZyhLRVJOX0lORk8sIHR1biwgInR1bl9kb19yZWFkXG4iKTsKIAotCWlmICh1bmxpa2VseSghbm9ibG9jaykpCi0JCWFkZF93YWl0X3F1ZXVlKCZ0ZmlsZS0+d3Eud2FpdCwgJndhaXQpOwotCXdoaWxlIChsZW4pIHsKLQkJaWYgKHVubGlrZWx5KCFub2Jsb2NrKSkKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCWlmICghbGVuKQorCQlyZXR1cm4gcmV0OwogCi0JCS8qIFJlYWQgZnJhbWVzIGZyb20gdGhlIHF1ZXVlICovCi0JCWlmICghKHNrYiA9IHNrYl9kZXF1ZXVlKCZ0ZmlsZS0+c29ja2V0LnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKLQkJCWlmIChub2Jsb2NrKSB7Ci0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh0dW4tPmRldi0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKSB7Ci0JCQkJcmV0ID0gLUVJTzsKLQkJCQlicmVhazsKLQkJCX0KKwlpZiAodHVuLT5kZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVHSVNURVJFRCkKKwkJcmV0dXJuIC1FSU87CiAKLQkJCS8qIE5vdGhpbmcgdG8gcmVhZCwgbGV0J3Mgc2xlZXAgKi8KLQkJCXNjaGVkdWxlKCk7Ci0JCQljb250aW51ZTsKLQkJfQotCisJLyogUmVhZCBmcmFtZXMgZnJvbSBxdWV1ZSAqLworCXNrYiA9IF9fc2tiX3JlY3ZfZGF0YWdyYW0odGZpbGUtPnNvY2tldC5zaywgbm9ibG9jayA/IE1TR19ET05UV0FJVCA6IDAsCisJCQkJICAmcGVla2VkLCAmb2ZmLCAmZXJyKTsKKwlpZiAoc2tiKSB7CiAJCXJldCA9IHR1bl9wdXRfdXNlcih0dW4sIHRmaWxlLCBza2IsIGl2LCBsZW4pOwogCQlrZnJlZV9za2Ioc2tiKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFub2Jsb2NrKSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJnRmaWxlLT53cS53YWl0LCAmd2FpdCk7Ci0JfQorCX0gZWxzZQorCQlyZXQgPSBlcnI7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjE5OSw4ICsyMTc3LDggQEAKIAl0ZmlsZS0+ZmxhZ3MgPSAwOwogCXRmaWxlLT5pZmluZGV4ID0gMDsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcih0ZmlsZS0+c29ja2V0LndxLCAmdGZpbGUtPndxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0ZmlsZS0+d3Eud2FpdCk7CisJUkNVX0lOSVRfUE9JTlRFUih0ZmlsZS0+c29ja2V0LndxLCAmdGZpbGUtPndxKTsKIAogCXRmaWxlLT5zb2NrZXQuZmlsZSA9IGZpbGU7CiAJdGZpbGUtPnNvY2tldC5vcHMgPSAmdHVuX3NvY2tldF9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2F0Yy5jIGIvZHJpdmVycy9uZXQvdXNiL2NhdGMuYwppbmRleCA2MzBjYWY0Li44Y2ZjM2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2F0Yy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmNhdGNfbmV0ZGV2X29wczsKIAluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJm9wczsKIAogCWNhdGMtPnVzYmRldiA9IHVzYmRldjsKIAljYXRjLT5uZXRkZXYgPSBuZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX21iaW0uYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCmluZGV4IDJlMDI1ZGQuLjVlZTdhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCkBAIC0yNCwxMyArMjQsMjEgQEAKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogCisvKiBhbHRlcm5hdGl2ZSBWTEFOIGZvciBJUCBzZXNzaW9uIDAgaWYgbm90IHVudGFnZ2VkICovCisjZGVmaW5lIE1CSU1fSVBTMF9WSUQJNDA5NAorCiAvKiBkcml2ZXIgc3BlY2lmaWMgZGF0YSAtIG11c3QgbWF0Y2ggY2RjX25jbSB1c2FnZSAqLwogc3RydWN0IGNkY19tYmltX3N0YXRlIHsKIAlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eDsKIAlhdG9taWNfdCBwbWNvdW50OwogCXN0cnVjdCB1c2JfZHJpdmVyICpzdWJkcml2ZXI7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmNvbnRyb2w7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBfdW51c2VkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9OworCisvKiBmbGFncyBmb3IgdGhlIGNkY19tYmltX3N0YXRlLmZsYWdzIGZpZWxkICovCitlbnVtIGNkY19tYmltX2ZsYWdzIHsKKwlGTEFHX0lQUzBfVkxBTiA9IDEgPDwgMCwJLyogSVAgc2Vzc2lvbiAwIGlzIHRhZ2dlZCAgKi8KIH07CiAKIC8qIHVzaW5nIGEgY291bnRlciB0byBtZXJnZSBzdWJkcml2ZXIgcmVxdWVzdHMgd2l0aCBvdXIgb3duIGludG8gYSBjb21iaW5lZCBzdGF0ZSAqLwpAQCAtNjIsMTYgKzcwLDkxIEBACiAJcmV0dXJuIGNkY19tYmltX21hbmFnZV9wb3dlcihkZXYsIHN0YXR1cyk7CiB9CiAKK3N0YXRpYyBpbnQgY2RjX21iaW1fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgY2RjX21iaW1fc3RhdGUgKmluZm8gPSAodm9pZCAqKSZkZXYtPmRhdGE7CisKKwkvKiBjcmVhdGlvbiBvZiB0aGlzIFZMQU4gaXMgYSByZXF1ZXN0IHRvIHRhZyBJUCBzZXNzaW9uIDAgKi8KKwlpZiAodmlkID09IE1CSU1fSVBTMF9WSUQpCisJCWluZm8tPmZsYWdzIHw9IEZMQUdfSVBTMF9WTEFOOworCWVsc2UKKwkJaWYgKHZpZCA+PSA1MTIpCS8qIHdlIGRvbid0IG1hcCB0aGVzZSB0byBNQklNIHNlc3Npb24gKi8KKwkJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkY19tYmltX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIF9fYmUxNiBwcm90bywgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBjZGNfbWJpbV9zdGF0ZSAqaW5mbyA9ICh2b2lkICopJmRldi0+ZGF0YTsKKworCS8qIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBhbiB1bnRhZ2dlZCBJUCBzZXNzaW9uIDAgKi8KKwlpZiAodmlkID09IE1CSU1fSVBTMF9WSUQpCisJCWluZm8tPmZsYWdzICY9IH5GTEFHX0lQUzBfVkxBTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjZGNfbWJpbV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgICA9IHVzYm5ldF9vcGVuLAorCS5uZG9fc3RvcCAgICAgICAgICAgICA9IHVzYm5ldF9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdCAgICAgICA9IHVzYm5ldF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCAgICAgICA9IHVzYm5ldF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dSAgICAgICA9IHVzYm5ldF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzICA9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICAgPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZCAgPSBjZGNfbWJpbV9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZCA9IGNkY19tYmltX3J4X2tpbGxfdmlkLAorfTsKKworLyogQ2hhbmdlIHRoZSBjb250cm9sIGludGVyZmFjZSBhbHRzZXR0aW5nIGFuZCB1cGRhdGUgdGhlIC5kcml2ZXJfaW5mbworICogcG9pbnRlciBpZiB0aGUgbWF0Y2hpbmcgZW50cnkgYWZ0ZXIgY2hhbmdpbmcgY2xhc3MgY29kZXMgcG9pbnRzIHRvCisgKiBhIGRpZmZlcmVudCBzdHJ1Y3QKKyAqLworc3RhdGljIGludCBjZGNfbWJpbV9zZXRfY3RybGFsdChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1OCBhbHQpCit7CisJc3RydWN0IHVzYl9kcml2ZXIgKmRyaXZlciA9IHRvX3VzYl9kcml2ZXIoaW50Zi0+ZGV2LmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBkcml2ZXJfaW5mbyAqaW5mbzsKKwlpbnQgcmV0OworCisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LAorCQkJCWludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJYWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvID0gKHN0cnVjdCBkcml2ZXJfaW5mbyAqKWlkLT5kcml2ZXJfaW5mbzsKKwlpZiAoaW5mbyAhPSBkZXYtPmRyaXZlcl9pbmZvKSB7CisJCWRldl9kYmcoJmludGYtPmRldiwgImRyaXZlcl9pbmZvIHVwZGF0ZWQgdG8gJyVzJ1xuIiwKKwkJCWluZm8tPmRlc2NyaXB0aW9uKTsKKwkJZGV2LT5kcml2ZXJfaW5mbyA9IGluZm87CisJfQorCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IGNkY19tYmltX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eDsKIAlzdHJ1Y3QgdXNiX2RyaXZlciAqc3ViZHJpdmVyID0gRVJSX1BUUigtRU5PREVWKTsKIAlpbnQgcmV0ID0gLUVOT0RFVjsKLQl1OCBkYXRhX2FsdHNldHRpbmcgPSBjZGNfbmNtX3NlbGVjdF9hbHRzZXR0aW5nKGRldiwgaW50Zik7CisJdTggZGF0YV9hbHRzZXR0aW5nID0gMTsKIAlzdHJ1Y3QgY2RjX21iaW1fc3RhdGUgKmluZm8gPSAodm9pZCAqKSZkZXYtPmRhdGE7CiAKLQkvKiBQcm9iYWJseSBOQ00sIGRlZmVyIGZvciBjZGNfbmNtX2JpbmQgKi8KKwkvKiBzaG91bGQgd2UgY2hhbmdlIGNvbnRyb2wgYWx0c2V0dGluZyBvbiBhIE5DTS9NQklNIGZ1bmN0aW9uPyAqLworCWlmIChjZGNfbmNtX3NlbGVjdF9hbHRzZXR0aW5nKGludGYpID09IENEQ19OQ01fQ09NTV9BTFRTRVRUSU5HX01CSU0pIHsKKwkJZGF0YV9hbHRzZXR0aW5nID0gQ0RDX05DTV9EQVRBX0FMVFNFVFRJTkdfTUJJTTsKKwkJcmV0ID0gY2RjX21iaW1fc2V0X2N0cmxhbHQoZGV2LCBpbnRmLCBDRENfTkNNX0NPTU1fQUxUU0VUVElOR19NQklNKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCQlyZXQgPSAtRU5PREVWOworCX0KKworCS8qIHdlIHdpbGwgaGl0IHRoaXMgZm9yIE5DTS9NQklNIGZ1bmN0aW9ucyBpZiBwcmVmZXJfbWJpbSBpcyBmYWxzZSAqLwogCWlmICghY2RjX25jbV9jb21tX2ludGZfaXNfbWJpbShpbnRmLT5jdXJfYWx0c2V0dGluZykpCiAJCWdvdG8gZXJyOwogCkBAIC0xMDEsNyArMTg0LDEwIEBACiAJZGV2LT5uZXQtPmZsYWdzIHw9IElGRl9OT0FSUDsKIAogCS8qIG5vIG5lZWQgdG8gcHV0IHRoZSBWTEFOIHRjaSBpbiB0aGUgcGFja2V0IGhlYWRlcnMgKi8KLQlkZXYtPm5ldC0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7CisJZGV2LT5uZXQtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOworCisJLyogbW9uaXRvciBWTEFOIGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMgKi8KKwlkZXYtPm5ldC0+bmV0ZGV2X29wcyA9ICZjZGNfbWJpbV9uZXRkZXZfb3BzOwogZXJyOgogCXJldHVybiByZXQ7CiB9CkBAIC0xNjQsMTIgKzI1MCwyNCBAQAogCQkJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAJCX0KIAorCQkvKiBJcyBJUCBzZXNzaW9uIDwwPiB0YWdnZWQgdG9vPyAqLworCQlpZiAoaW5mby0+ZmxhZ3MgJiBGTEFHX0lQUzBfVkxBTikgeworCQkJLyogZHJvcCBhbGwgdW50YWdnZWQgcGFja2V0cyAqLworCQkJaWYgKCF0Y2kpCisJCQkJZ290byBlcnJvcjsKKwkJCS8qIG1hcCBNQklNX0lQUzBfVklEIHRvIElQUzwwPiAqLworCQkJaWYgKHRjaSA9PSBNQklNX0lQUzBfVklEKQorCQkJCXRjaSA9IDA7CisJCX0KKwogCQkvKiBtYXBwaW5nIFZMQU5zIHRvIE1CSU0gc2Vzc2lvbnM6Ci0JCSAqICAgbm8gdGFnICAgICA9PiBJUFMgc2Vzc2lvbiA8MD4KKwkJICogICBubyB0YWcgICAgID0+IElQUyBzZXNzaW9uIDwwPiBpZiAhRkxBR19JUFMwX1ZMQU4KIAkJICogICAxIC0gMjU1ICAgID0+IElQUyBzZXNzaW9uIDx2bGFuaWQ+CiAJCSAqICAgMjU2IC0gNTExICA9PiBEU1Mgc2Vzc2lvbiA8dmxhbmlkIC0gMjU2PgotCQkgKiAgIDUxMiAtIDQwOTUgPT4gdW5zdXBwb3J0ZWQsIGRyb3AKKwkJICogICA1MTIgLSA0MDkzID0+IHVuc3VwcG9ydGVkLCBkcm9wCisJCSAqICAgNDA5NCAgICAgICA9PiBJUFMgc2Vzc2lvbiA8MD4gaWYgRkxBR19JUFMwX1ZMQU4KIAkJICovCisKIAkJc3dpdGNoICh0Y2kgJiAweDBmMDApIHsKIAkJY2FzZSAweDAwMDA6IC8qIFZMQU4gSUQgMCAtIDI1NSAqLwogCQkJaWYgKCFpc19pcCkKQEAgLTE3OCw2ICsyNzYsOCBAQAogCQkJY1szXSA9IHRjaTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDEwMDogLyogVkxBTiBJRCAyNTYgLSA1MTEgKi8KKwkJCWlmIChpc19pcCkKKwkJCQlnb3RvIGVycm9yOwogCQkJc2lnbiA9IGNwdV90b19sZTMyKFVTQl9DRENfTUJJTV9ORFAxNl9EU1NfU0lHTik7CiAJCQljID0gKHU4ICopJnNpZ247CiAJCQljWzNdID0gdGNpOwpAQCAtMjIzLDggKzMyMyw4IEBACiAJLyogbmVlZCB0byBzZW5kIHRoZSBOQSBvbiB0aGUgVkxBTiBkZXYsIGlmIGFueSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAodGNpKSB7Ci0JCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGRldi0+bmV0LCBodG9ucyhFVEhfUF84MDIxUSksCi0JCQkJCSAgICAgIHRjaSk7CisJCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShkZXYtPm5ldCwgaHRvbnMoRVRIX1BfODAyMVEpLAorCQkJCQkJICB0Y2kpOwogCQlpZiAoIW5ldGRldikgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm47CkBAIC0yNjgsNyArMzY4LDcgQEAKIAlfX2JlMTYgcHJvdG8gPSBodG9ucyhFVEhfUF84MDJfMyk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAKLQlpZiAodGNpIDwgMjU2KSB7IC8qIElQUyBzZXNzaW9uPyAqLworCWlmICh0Y2kgPCAyNTYgfHwgdGNpID09IE1CSU1fSVBTMF9WSUQpIHsgLyogSVBTIHNlc3Npb24/ICovCiAJCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKIAkJCWdvdG8gZXJyOwogCkBAIC0zMjAsNiArNDIwLDcgQEAKIAlzdHJ1Y3QgdXNiX2NkY19uY21fZHBlMTYgKmRwZTE2OwogCWludCBuZHBvZmZzZXQ7CiAJaW50IGxvb3Bjb3VudCA9IDUwOyAvKiBhcmJpdHJhcnkgbWF4IHByZXZlbnRpbmcgaW5maW5pdGUgbG9vcCAqLworCXUzMiBwYXlsb2FkID0gMDsKIAl1OCAqYzsKIAl1MTYgdGNpOwogCkBAIC0zMzgsNiArNDM5LDkgQEAKIAljYXNlIGNwdV90b19sZTMyKFVTQl9DRENfTUJJTV9ORFAxNl9JUFNfU0lHTik6CiAJCWMgPSAodTggKikmbmRwMTYtPmR3U2lnbmF0dXJlOwogCQl0Y2kgPSBjWzNdOworCQkvKiB0YWcgSVBTPDA+IHBhY2tldHMgdG9vIGlmIE1CSU1fSVBTMF9WSUQgZXhpc3RzICovCisJCWlmICghdGNpICYmIGluZm8tPmZsYWdzICYgRkxBR19JUFMwX1ZMQU4pCisJCQl0Y2kgPSBNQklNX0lQUzBfVklEOwogCQlicmVhazsKIAljYXNlIGNwdV90b19sZTMyKFVTQl9DRENfTUJJTV9ORFAxNl9EU1NfU0lHTik6CiAJCWMgPSAodTggKikmbmRwMTYtPmR3U2lnbmF0dXJlOwpAQCAtMzc5LDYgKzQ4Myw3IEBACiAJCQlpZiAoIXNrYikKIAkJCQlnb3RvIGVycm9yOwogCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBza2IpOworCQkJcGF5bG9hZCArPSBsZW47CS8qIGNvdW50IHBheWxvYWQgYnl0ZXMgaW4gdGhpcyBOVEIgKi8KIAkJfQogCX0KIGVycl9uZHA6CkBAIC0zODcsNiArNDkyLDEwIEBACiAJaWYgKG5kcG9mZnNldCAmJiBsb29wY291bnQtLSkKIAkJZ290byBuZXh0X25kcDsKIAorCS8qIHVwZGF0ZSBzdGF0cyAqLworCWN0eC0+cnhfb3ZlcmhlYWQgKz0gc2tiX2luLT5sZW4gLSBwYXlsb2FkOworCWN0eC0+cnhfbnRicysrOworCiAJcmV0dXJuIDE7CiBlcnJvcjoKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCmluZGV4IDlhMmJkMTEuLjgwYTg0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwpAQCAtNjUsMTkgKzY1LDM4NCBAQAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGNkY19uY21fdHhfdGltZXJfY2Ioc3RydWN0IGhydGltZXIgKmhyX3RpbWVyKTsKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjZGNfbmNtX2RyaXZlcjsKIAotc3RhdGljIGludCBjZGNfbmNtX3NldHVwKHN0cnVjdCB1c2JuZXQgKmRldikKK3N0cnVjdCBjZGNfbmNtX3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgQ0RDX05DTV9TVEFUKHN0ciwgbSkgeyBcCisJCS5zdGF0X3N0cmluZyA9IHN0ciwgXAorCQkuc2l6ZW9mX3N0YXQgPSBzaXplb2YoKChzdHJ1Y3QgY2RjX25jbV9jdHggKikwKS0+bSksIFwKKwkJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGNkY19uY21fY3R4LCBtKSB9CisjZGVmaW5lIENEQ19OQ01fU0lNUExFX1NUQVQobSkJQ0RDX05DTV9TVEFUKF9fc3RyaW5naWZ5KG0pLCBtKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNkY19uY21fc3RhdHMgY2RjX25jbV9nc3RyaW5nc19zdGF0c1tdID0geworCUNEQ19OQ01fU0lNUExFX1NUQVQodHhfcmVhc29uX250Yl9mdWxsKSwKKwlDRENfTkNNX1NJTVBMRV9TVEFUKHR4X3JlYXNvbl9uZHBfZnVsbCksCisJQ0RDX05DTV9TSU1QTEVfU1RBVCh0eF9yZWFzb25fdGltZW91dCksCisJQ0RDX05DTV9TSU1QTEVfU1RBVCh0eF9yZWFzb25fbWF4X2RhdGFncmFtKSwKKwlDRENfTkNNX1NJTVBMRV9TVEFUKHR4X292ZXJoZWFkKSwKKwlDRENfTkNNX1NJTVBMRV9TVEFUKHR4X250YnMpLAorCUNEQ19OQ01fU0lNUExFX1NUQVQocnhfb3ZlcmhlYWQpLAorCUNEQ19OQ01fU0lNUExFX1NUQVQocnhfbnRicyksCit9OworCitzdGF0aWMgaW50IGNkY19uY21fZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgX19hbHdheXNfdW51c2VkICpuZXRkZXYsIGludCBzc2V0KQoreworCXN3aXRjaCAoc3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gQVJSQVlfU0laRShjZGNfbmNtX2dzdHJpbmdzX3N0YXRzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjZGNfbmNtX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX3N0YXRzIF9fYWx3YXlzX3VudXNlZCAqc3RhdHMsCisJCQkJICAgIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKKwlpbnQgaTsKKwljaGFyICpwID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNkY19uY21fZ3N0cmluZ3Nfc3RhdHMpOyBpKyspIHsKKwkJcCA9IChjaGFyICopY3R4ICsgY2RjX25jbV9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJZGF0YVtpXSA9IChjZGNfbmNtX2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09IHNpemVvZih1NjQpKSA/ICoodTY0ICopcCA6ICoodTMyICopcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNkY19uY21fZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgX19hbHdheXNfdW51c2VkICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCXU4ICpwID0gZGF0YTsKKwlpbnQgaTsKKworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNkY19uY21fZ3N0cmluZ3Nfc3RhdHMpOyBpKyspIHsKKwkJCW1lbWNweShwLCBjZGNfbmNtX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfc3RyaW5nLCBFVEhfR1NUUklOR19MRU4pOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNkY19uY21fdXBkYXRlX3J4dHhfbWF4KHN0cnVjdCB1c2JuZXQgKmRldiwgdTMyIG5ld19yeCwgdTMyIG5ld190eCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY2RjX25jbV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzICAgICAgPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgICAgICA9IHVzYm5ldF9zZXRfc2V0dGluZ3MsCisJLmdldF9saW5rICAgICAgICAgID0gdXNibmV0X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0ICAgICAgICA9IHVzYm5ldF9ud2F5X3Jlc2V0LAorCS5nZXRfZHJ2aW5mbyAgICAgICA9IHVzYm5ldF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsICAgICAgPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgICAgICA9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCisJLmdldF90c19pbmZvICAgICAgID0gZXRodG9vbF9vcF9nZXRfdHNfaW5mbywKKwkuZ2V0X3NzZXRfY291bnQgICAgPSBjZGNfbmNtX2dldF9zc2V0X2NvdW50LAorCS5nZXRfc3RyaW5ncyAgICAgICA9IGNkY19uY21fZ2V0X3N0cmluZ3MsCisJLmdldF9ldGh0b29sX3N0YXRzID0gY2RjX25jbV9nZXRfZXRodG9vbF9zdGF0cywKK307CisKK3N0YXRpYyB1MzIgY2RjX25jbV9jaGVja19yeF9tYXgoc3RydWN0IHVzYm5ldCAqZGV2LCB1MzIgbmV3X3J4KQogewogCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKLQl1MzIgdmFsOwotCXU4IGZsYWdzOwotCXU4IGlmYWNlX25vOwotCWludCBlcnI7Ci0JaW50IGV0aF9obGVuOwotCXUxNiBtYmltX210dTsKLQl1MTYgbnRiX2ZtdF9zdXBwb3J0ZWQ7Ci0JX19sZTE2IG1heF9kYXRhZ3JhbV9zaXplOworCXUzMiB2YWwsIG1heCwgbWluOwogCi0JaWZhY2Vfbm8gPSBjdHgtPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJLyogY2xhbXAgbmV3X3J4IHRvIHNhbmUgdmFsdWVzICovCisJbWluID0gVVNCX0NEQ19OQ01fTlRCX01JTl9JTl9TSVpFOworCW1heCA9IG1pbl90KHUzMiwgQ0RDX05DTV9OVEJfTUFYX1NJWkVfUlgsIGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpKTsKKworCS8qIGR3TnRiSW5NYXhTaXplIHNwZWMgdmlvbGF0aW9uPyBVc2UgTUlOIHNpemUgZm9yIGJvdGggbGltaXRzICovCisJaWYgKG1heCA8IG1pbikgeworCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJkd050YkluTWF4U2l6ZT0ldSBpcyB0b28gc21hbGwuIFVzaW5nICV1XG4iLAorCQkJIGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpLCBtaW4pOworCQltYXggPSBtaW47CisJfQorCisJdmFsID0gY2xhbXBfdCh1MzIsIG5ld19yeCwgbWluLCBtYXgpOworCWlmICh2YWwgIT0gbmV3X3J4KQorCQlkZXZfZGJnKCZkZXYtPmludGYtPmRldiwgInJ4X21heCBtdXN0IGJlIGluIHRoZSBbJXUsICV1XSByYW5nZVxuIiwgbWluLCBtYXgpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHUzMiBjZGNfbmNtX2NoZWNrX3R4X21heChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUzMiBuZXdfdHgpCit7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCXUzMiB2YWwsIG1heCwgbWluOworCisJLyogY2xhbXAgbmV3X3R4IHRvIHNhbmUgdmFsdWVzICovCisJbWluID0gY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSArIGN0eC0+bWF4X25kcF9zaXplICsgc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25jbV9udGgxNik7CisJbWF4ID0gbWluX3QodTMyLCBDRENfTkNNX05UQl9NQVhfU0laRV9UWCwgbGUzMl90b19jcHUoY3R4LT5uY21fcGFybS5kd050Yk91dE1heFNpemUpKTsKKworCS8qIHNvbWUgZGV2aWNlcyBzZXQgZHdOdGJPdXRNYXhTaXplIHRvbyBsb3cgZm9yIHRoZSBhYm92ZSBkZWZhdWx0ICovCisJbWluID0gbWluKG1pbiwgbWF4KTsKKworCXZhbCA9IGNsYW1wX3QodTMyLCBuZXdfdHgsIG1pbiwgbWF4KTsKKwlpZiAodmFsICE9IG5ld190eCkKKwkJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsICJ0eF9tYXggbXVzdCBiZSBpbiB0aGUgWyV1LCAldV0gcmFuZ2VcbiIsIG1pbiwgbWF4KTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNkY19uY21fc2hvd19taW5fdHhfcGt0KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGN0eC0+bWluX3R4X3BrdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNkY19uY21fc2hvd19yeF9tYXgoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGQpKTsKKwlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY3R4LT5yeF9tYXgpOworfQorCitzdGF0aWMgc3NpemVfdCBjZGNfbmNtX3Nob3dfdHhfbWF4KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGN0eC0+dHhfbWF4KTsKK30KKworc3RhdGljIHNzaXplX3QgY2RjX25jbV9zaG93X3R4X3RpbWVyX3VzZWNzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGN0eC0+dGltZXJfaW50ZXJ2YWwgLyAodTMyKU5TRUNfUEVSX1VTRUMpOworfQorCitzdGF0aWMgc3NpemVfdCBjZGNfbmNtX3N0b3JlX21pbl90eF9wa3Qoc3RydWN0IGRldmljZSAqZCwgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJLyogbm8gbmVlZCB0byByZXN0cmljdCB2YWx1ZXMgLSBhbnl0aGluZyBmcm9tIDAgdG8gaW5maW5pdHkgaXMgT0sgKi8KKwlpZiAoa3N0cnRvdWwoYnVmLCAwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdHgtPm1pbl90eF9wa3QgPSB2YWw7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY2RjX25jbV9zdG9yZV9yeF9tYXgoc3RydWN0IGRldmljZSAqZCwgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgfHwgY2RjX25jbV9jaGVja19yeF9tYXgoZGV2LCB2YWwpICE9IHZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGNfbmNtX3VwZGF0ZV9yeHR4X21heChkZXYsIHZhbCwgY3R4LT50eF9tYXgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNkY19uY21fc3RvcmVfdHhfbWF4KHN0cnVjdCBkZXZpY2UgKmQsICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZCkpOworCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChrc3RydG91bChidWYsIDAsICZ2YWwpIHx8IGNkY19uY21fY2hlY2tfdHhfbWF4KGRldiwgdmFsKSAhPSB2YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2RjX25jbV91cGRhdGVfcnh0eF9tYXgoZGV2LCBjdHgtPnJ4X21heCwgdmFsKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBjZGNfbmNtX3N0b3JlX3R4X3RpbWVyX3VzZWNzKHN0cnVjdCBkZXZpY2UgKmQsICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZCkpOworCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsICYmICh2YWwgPCBDRENfTkNNX1RJTUVSX0lOVEVSVkFMX01JTiB8fCB2YWwgPiBDRENfTkNNX1RJTUVSX0lOVEVSVkFMX01BWCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2JoKCZjdHgtPm10eCk7CisJY3R4LT50aW1lcl9pbnRlcnZhbCA9IHZhbCAqIE5TRUNfUEVSX1VTRUM7CisJaWYgKCFjdHgtPnRpbWVyX2ludGVydmFsKQorCQljdHgtPnR4X3RpbWVyX3BlbmRpbmcgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZjdHgtPm10eCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG1pbl90eF9wa3QsIFNfSVJVR08gfCBTX0lXVVNSLCBjZGNfbmNtX3Nob3dfbWluX3R4X3BrdCwgY2RjX25jbV9zdG9yZV9taW5fdHhfcGt0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyeF9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBjZGNfbmNtX3Nob3dfcnhfbWF4LCBjZGNfbmNtX3N0b3JlX3J4X21heCk7CitzdGF0aWMgREVWSUNFX0FUVFIodHhfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgY2RjX25jbV9zaG93X3R4X21heCwgY2RjX25jbV9zdG9yZV90eF9tYXgpOworc3RhdGljIERFVklDRV9BVFRSKHR4X3RpbWVyX3VzZWNzLCBTX0lSVUdPIHwgU19JV1VTUiwgY2RjX25jbV9zaG93X3R4X3RpbWVyX3VzZWNzLCBjZGNfbmNtX3N0b3JlX3R4X3RpbWVyX3VzZWNzKTsKKworI2RlZmluZSBOQ01fUEFSTV9BVFRSKG5hbWUsIGZvcm1hdCwgdG9jcHUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGNkY19uY21fc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkKSk7IFwKKwlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdCAiXG4iLCB0b2NwdShjdHgtPm5jbV9wYXJtLm5hbWUpKTsJXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgY2RjX25jbV9zaG93XyMjbmFtZSwgTlVMTCkKKworTkNNX1BBUk1fQVRUUihibU50YkZvcm1hdHNTdXBwb3J0ZWQsICIweCUwNHgiLCBsZTE2X3RvX2NwdSk7CitOQ01fUEFSTV9BVFRSKGR3TnRiSW5NYXhTaXplLCAiJXUiLCBsZTMyX3RvX2NwdSk7CitOQ01fUEFSTV9BVFRSKHdOZHBJbkRpdmlzb3IsICIldSIsIGxlMTZfdG9fY3B1KTsKK05DTV9QQVJNX0FUVFIod05kcEluUGF5bG9hZFJlbWFpbmRlciwgIiV1IiwgbGUxNl90b19jcHUpOworTkNNX1BBUk1fQVRUUih3TmRwSW5BbGlnbm1lbnQsICIldSIsIGxlMTZfdG9fY3B1KTsKK05DTV9QQVJNX0FUVFIoZHdOdGJPdXRNYXhTaXplLCAiJXUiLCBsZTMyX3RvX2NwdSk7CitOQ01fUEFSTV9BVFRSKHdOZHBPdXREaXZpc29yLCAiJXUiLCBsZTE2X3RvX2NwdSk7CitOQ01fUEFSTV9BVFRSKHdOZHBPdXRQYXlsb2FkUmVtYWluZGVyLCAiJXUiLCBsZTE2X3RvX2NwdSk7CitOQ01fUEFSTV9BVFRSKHdOZHBPdXRBbGlnbm1lbnQsICIldSIsIGxlMTZfdG9fY3B1KTsKK05DTV9QQVJNX0FUVFIod050Yk91dE1heERhdGFncmFtcywgIiV1IiwgbGUxNl90b19jcHUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2RjX25jbV9zeXNmc19hdHRyc1tdID0geworCSZkZXZfYXR0cl9taW5fdHhfcGt0LmF0dHIsCisJJmRldl9hdHRyX3J4X21heC5hdHRyLAorCSZkZXZfYXR0cl90eF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfdHhfdGltZXJfdXNlY3MuYXR0ciwKKwkmZGV2X2F0dHJfYm1OdGJGb3JtYXRzU3VwcG9ydGVkLmF0dHIsCisJJmRldl9hdHRyX2R3TnRiSW5NYXhTaXplLmF0dHIsCisJJmRldl9hdHRyX3dOZHBJbkRpdmlzb3IuYXR0ciwKKwkmZGV2X2F0dHJfd05kcEluUGF5bG9hZFJlbWFpbmRlci5hdHRyLAorCSZkZXZfYXR0cl93TmRwSW5BbGlnbm1lbnQuYXR0ciwKKwkmZGV2X2F0dHJfZHdOdGJPdXRNYXhTaXplLmF0dHIsCisJJmRldl9hdHRyX3dOZHBPdXREaXZpc29yLmF0dHIsCisJJmRldl9hdHRyX3dOZHBPdXRQYXlsb2FkUmVtYWluZGVyLmF0dHIsCisJJmRldl9hdHRyX3dOZHBPdXRBbGlnbm1lbnQuYXR0ciwKKwkmZGV2X2F0dHJfd050Yk91dE1heERhdGFncmFtcy5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjZGNfbmNtX3N5c2ZzX2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUgPSAiY2RjX25jbSIsCisJLmF0dHJzID0gY2RjX25jbV9zeXNmc19hdHRycywKK307CisKKy8qIGhhbmRsZSByeF9tYXggYW5kIHR4X21heCBjaGFuZ2VzICovCitzdGF0aWMgdm9pZCBjZGNfbmNtX3VwZGF0ZV9yeHR4X21heChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUzMiBuZXdfcngsIHUzMiBuZXdfdHgpCit7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCXU4IGlmYWNlX25vID0gY3R4LT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCXUzMiB2YWw7CisKKwl2YWwgPSBjZGNfbmNtX2NoZWNrX3J4X21heChkZXYsIG5ld19yeCk7CisKKwkvKiBpbmZvcm0gZGV2aWNlIGFib3V0IE5UQiBpbnB1dCBzaXplIGNoYW5nZXMgKi8KKwlpZiAodmFsICE9IGN0eC0+cnhfbWF4KSB7CisJCV9fbGUzMiBkd050YkluTWF4U2l6ZSA9IGNwdV90b19sZTMyKHZhbCk7CisKKwkJZGV2X2luZm8oJmRldi0+aW50Zi0+ZGV2LCAic2V0dGluZyByeF9tYXggPSAldVxuIiwgdmFsKTsKKworCQkvKiB0ZWxsIGRldmljZSB0byB1c2UgbmV3IHNpemUgKi8KKwkJaWYgKHVzYm5ldF93cml0ZV9jbWQoZGV2LCBVU0JfQ0RDX1NFVF9OVEJfSU5QVVRfU0laRSwKKwkJCQkgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQKKwkJCQkgICAgIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgICAgIDAsIGlmYWNlX25vLCAmZHdOdGJJbk1heFNpemUsIDQpIDwgMCkKKwkJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiU2V0dGluZyBOVEIgSW5wdXQgU2l6ZSBmYWlsZWRcbiIpOworCQllbHNlCisJCQljdHgtPnJ4X21heCA9IHZhbDsKKwl9CisKKwkvKiB1c2JuZXQgdXNlIHRoZXNlIHZhbHVlcyBmb3Igc2l6aW5nIHJ4IHF1ZXVlcyAqLworCWlmIChkZXYtPnJ4X3VyYl9zaXplICE9IGN0eC0+cnhfbWF4KSB7CisJCWRldi0+cnhfdXJiX3NpemUgPSBjdHgtPnJ4X21heDsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2LT5uZXQpKQorCQkJdXNibmV0X3VubGlua19yeF91cmJzKGRldik7CisJfQorCisJdmFsID0gY2RjX25jbV9jaGVja190eF9tYXgoZGV2LCBuZXdfdHgpOworCWlmICh2YWwgIT0gY3R4LT50eF9tYXgpCisJCWRldl9pbmZvKCZkZXYtPmludGYtPmRldiwgInNldHRpbmcgdHhfbWF4ID0gJXVcbiIsIHZhbCk7CisKKwkvKiBBZGRpbmcgYSBwYWQgYnl0ZSBoZXJlIGlmIG5lY2Vzc2FyeSBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZworCSAqIGluIGNkY19uY21fZmlsbF90eF9mcmFtZSwgbWFraW5nIHR4X21heCBhbHdheXMgcmVwcmVzZW50CisJICogdGhlIHJlYWwgc2tiIG1heCBzaXplLgorCSAqCisJICogV2UgY2Fubm90IHVzZSBkZXYtPm1heHBhY2tldCBoZXJlIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgZnJvbQorCSAqIC5iaW5kIHdoaWNoIGlzIGNhbGxlZCBiZWZvcmUgdXNibmV0IHNldHMgdXAgZGV2LT5tYXhwYWNrZXQKKwkgKi8KKwlpZiAodmFsICE9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJPdXRNYXhTaXplKSAmJgorCSAgICB2YWwgJSB1c2JfbWF4cGFja2V0KGRldi0+dWRldiwgZGV2LT5vdXQsIDEpID09IDApCisJCXZhbCsrOworCisJLyogd2UgbWlnaHQgbmVlZCB0byBmbHVzaCBhbnkgcGVuZGluZyB0eCBidWZmZXJzIGlmIHJ1bm5pbmcgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYtPm5ldCkgJiYgdmFsID4gY3R4LT50eF9tYXgpIHsKKwkJbmV0aWZfdHhfbG9ja19iaChkZXYtPm5ldCk7CisJCXVzYm5ldF9zdGFydF94bWl0KE5VTEwsIGRldi0+bmV0KTsKKwkJLyogbWFrZSBzdXJlIHR4X2N1cnJfc2tiIGlzIHJlYWxsb2NhdGVkIGlmIGl0IHdhcyBlbXB0eSAqLworCQlpZiAoY3R4LT50eF9jdXJyX3NrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoY3R4LT50eF9jdXJyX3NrYik7CisJCQljdHgtPnR4X2N1cnJfc2tiID0gTlVMTDsKKwkJfQorCQljdHgtPnR4X21heCA9IHZhbDsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldi0+bmV0KTsKKwl9IGVsc2UgeworCQljdHgtPnR4X21heCA9IHZhbDsKKwl9CisKKwlkZXYtPmhhcmRfbXR1ID0gY3R4LT50eF9tYXg7CisKKwkvKiBtYXggcWxlbiBkZXBlbmQgb24gaGFyZF9tdHUgYW5kIHJ4X3VyYl9zaXplICovCisJdXNibmV0X3VwZGF0ZV9tYXhfcWxlbihkZXYpOworCisJLyogbmV2ZXIgcGFkIG1vcmUgdGhhbiAzIGZ1bGwgVVNCIHBhY2tldHMgcGVyIHRyYW5zZmVyICovCisJY3R4LT5taW5fdHhfcGt0ID0gY2xhbXBfdCh1MTYsIGN0eC0+dHhfbWF4IC0gMyAqIHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBkZXYtPm91dCwgMSksCisJCQkJICBDRENfTkNNX01JTl9UWF9QS1QsIGN0eC0+dHhfbWF4KTsKK30KKworLyogaGVscGVycyBmb3IgTkNNIGFuZCBNQklNIGRpZmZlcmVuY2VzICovCitzdGF0aWMgdTggY2RjX25jbV9mbGFncyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOworCisJaWYgKGNkY19uY21fY29tbV9pbnRmX2lzX21iaW0oZGV2LT5pbnRmLT5jdXJfYWx0c2V0dGluZykgJiYgY3R4LT5tYmltX2Rlc2MpCisJCXJldHVybiBjdHgtPm1iaW1fZGVzYy0+Ym1OZXR3b3JrQ2FwYWJpbGl0aWVzOworCWlmIChjdHgtPmZ1bmNfZGVzYykKKwkJcmV0dXJuIGN0eC0+ZnVuY19kZXNjLT5ibU5ldHdvcmtDYXBhYmlsaXRpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2RjX25jbV9ldGhfaGxlbihzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaWYgKGNkY19uY21fY29tbV9pbnRmX2lzX21iaW0oZGV2LT5pbnRmLT5jdXJfYWx0c2V0dGluZykpCisJCXJldHVybiAwOworCXJldHVybiBFVEhfSExFTjsKK30KKworc3RhdGljIHUzMiBjZGNfbmNtX21pbl9kZ3JhbV9zaXplKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpZiAoY2RjX25jbV9jb21tX2ludGZfaXNfbWJpbShkZXYtPmludGYtPmN1cl9hbHRzZXR0aW5nKSkKKwkJcmV0dXJuIENEQ19NQklNX01JTl9EQVRBR1JBTV9TSVpFOworCXJldHVybiBDRENfTkNNX01JTl9EQVRBR1JBTV9TSVpFOworfQorCitzdGF0aWMgdTMyIGNkY19uY21fbWF4X2RncmFtX3NpemUoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKKworCWlmIChjZGNfbmNtX2NvbW1faW50Zl9pc19tYmltKGRldi0+aW50Zi0+Y3VyX2FsdHNldHRpbmcpICYmIGN0eC0+bWJpbV9kZXNjKQorCQlyZXR1cm4gbGUxNl90b19jcHUoY3R4LT5tYmltX2Rlc2MtPndNYXhTZWdtZW50U2l6ZSk7CisJaWYgKGN0eC0+ZXRoZXJfZGVzYykKKwkJcmV0dXJuIGxlMTZfdG9fY3B1KGN0eC0+ZXRoZXJfZGVzYy0+d01heFNlZ21lbnRTaXplKTsKKwlyZXR1cm4gQ0RDX05DTV9NQVhfREFUQUdSQU1fU0laRTsKK30KKworLyogaW5pdGlhbCBvbmUtdGltZSBkZXZpY2Ugc2V0dXAuICBNVVNUIGJlIGNhbGxlZCB3aXRoIHRoZSBkYXRhIGludGVyZmFjZQorICogaW4gYWx0c2V0dGluZyAwCisgKi8KK3N0YXRpYyBpbnQgY2RjX25jbV9pbml0KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07CisJdTggaWZhY2Vfbm8gPSBjdHgtPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJaW50IGVycjsKIAogCWVyciA9IHVzYm5ldF9yZWFkX2NtZChkZXYsIFVTQl9DRENfR0VUX05UQl9QQVJBTUVURVJTLAogCQkJICAgICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOCkBAIC04OSw3ICs0NTQsMzYgQEAKIAkJcmV0dXJuIGVycjsgLyogR0VUX05UQl9QQVJBTUVURVJTIGlzIHJlcXVpcmVkICovCiAJfQogCi0JLyogcmVhZCBjb3JyZWN0IHNldCBvZiBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBkZXZpY2UgbW9kZSAqLworCS8qIHNldCBDUkMgTW9kZSAqLworCWlmIChjZGNfbmNtX2ZsYWdzKGRldikgJiBVU0JfQ0RDX05DTV9OQ0FQX0NSQ19NT0RFKSB7CisJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiU2V0dGluZyBDUkMgbW9kZSBvZmZcbiIpOworCQllcnIgPSB1c2JuZXRfd3JpdGVfY21kKGRldiwgVVNCX0NEQ19TRVRfQ1JDX01PREUsCisJCQkJICAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQKKwkJCQkgICAgICAgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSAgICAgICBVU0JfQ0RDX05DTV9DUkNfTk9UX0FQUEVOREVELAorCQkJCSAgICAgICBpZmFjZV9ubywgTlVMTCwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2VycigmZGV2LT5pbnRmLT5kZXYsICJTRVRfQ1JDX01PREUgZmFpbGVkXG4iKTsKKwl9CisKKwkvKiBzZXQgTlRCIGZvcm1hdCwgaWYgYm90aCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisJICoKKwkgKiAiVGhlIGhvc3Qgc2hhbGwgb25seSBzZW5kIHRoaXMgY29tbWFuZCB3aGlsZSB0aGUgTkNNIERhdGEKKwkgKiAgSW50ZXJmYWNlIGlzIGluIGFsdGVybmF0ZSBzZXR0aW5nIDAuIgorCSAqLworCWlmIChsZTE2X3RvX2NwdShjdHgtPm5jbV9wYXJtLmJtTnRiRm9ybWF0c1N1cHBvcnRlZCkgJgorCQkJCQkJVVNCX0NEQ19OQ01fTlRCMzJfU1VQUE9SVEVEKSB7CisJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiU2V0dGluZyBOVEIgZm9ybWF0IHRvIDE2LWJpdFxuIik7CisJCWVyciA9IHVzYm5ldF93cml0ZV9jbWQoZGV2LCBVU0JfQ0RDX1NFVF9OVEJfRk9STUFULAorCQkJCSAgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VUCisJCQkJICAgICAgIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgICAgICAgVVNCX0NEQ19OQ01fTlRCMTZfRk9STUFULAorCQkJCSAgICAgICBpZmFjZV9ubywgTlVMTCwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2VycigmZGV2LT5pbnRmLT5kZXYsICJTRVRfTlRCX0ZPUk1BVCBmYWlsZWRcbiIpOworCX0KKworCS8qIHNldCBpbml0aWFsIGRldmljZSB2YWx1ZXMgKi8KIAljdHgtPnJ4X21heCA9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpOwogCWN0eC0+dHhfbWF4ID0gbGUzMl90b19jcHUoY3R4LT5uY21fcGFybS5kd050Yk91dE1heFNpemUpOwogCWN0eC0+dHhfcmVtYWluZGVyID0gbGUxNl90b19jcHUoY3R4LT5uY21fcGFybS53TmRwT3V0UGF5bG9hZFJlbWFpbmRlcik7CkBAIC05Nyw3MiArNDkxLDc5IEBACiAJY3R4LT50eF9uZHBfbW9kdWx1cyA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0ud05kcE91dEFsaWdubWVudCk7CiAJLyogZGV2aWNlcyBwcmlvciB0byBOQ00gRXJyYXRhIHNoYWxsIHNldCB0aGlzIGZpZWxkIHRvIHplcm8gKi8KIAljdHgtPnR4X21heF9kYXRhZ3JhbXMgPSBsZTE2X3RvX2NwdShjdHgtPm5jbV9wYXJtLndOdGJPdXRNYXhEYXRhZ3JhbXMpOwotCW50Yl9mbXRfc3VwcG9ydGVkID0gbGUxNl90b19jcHUoY3R4LT5uY21fcGFybS5ibU50YkZvcm1hdHNTdXBwb3J0ZWQpOwotCi0JLyogdGhlcmUgYXJlIHNvbWUgbWlub3IgZGlmZmVyZW5jZXMgaW4gTkNNIGFuZCBNQklNIGRlZmF1bHRzICovCi0JaWYgKGNkY19uY21fY29tbV9pbnRmX2lzX21iaW0oY3R4LT5jb250cm9sLT5jdXJfYWx0c2V0dGluZykpIHsKLQkJaWYgKCFjdHgtPm1iaW1fZGVzYykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlldGhfaGxlbiA9IDA7Ci0JCWZsYWdzID0gY3R4LT5tYmltX2Rlc2MtPmJtTmV0d29ya0NhcGFiaWxpdGllczsKLQkJY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSA9IGxlMTZfdG9fY3B1KGN0eC0+bWJpbV9kZXNjLT53TWF4U2VnbWVudFNpemUpOwotCQlpZiAoY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSA8IENEQ19NQklNX01JTl9EQVRBR1JBTV9TSVpFKQotCQkJY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSA9IENEQ19NQklNX01JTl9EQVRBR1JBTV9TSVpFOwotCX0gZWxzZSB7Ci0JCWlmICghY3R4LT5mdW5jX2Rlc2MpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZXRoX2hsZW4gPSBFVEhfSExFTjsKLQkJZmxhZ3MgPSBjdHgtPmZ1bmNfZGVzYy0+Ym1OZXR3b3JrQ2FwYWJpbGl0aWVzOwotCQljdHgtPm1heF9kYXRhZ3JhbV9zaXplID0gbGUxNl90b19jcHUoY3R4LT5ldGhlcl9kZXNjLT53TWF4U2VnbWVudFNpemUpOwotCQlpZiAoY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSA8IENEQ19OQ01fTUlOX0RBVEFHUkFNX1NJWkUpCi0JCQljdHgtPm1heF9kYXRhZ3JhbV9zaXplID0gQ0RDX05DTV9NSU5fREFUQUdSQU1fU0laRTsKLQl9Ci0KLQkvKiBjb21tb24gYWJzb2x1dGUgbWF4IGZvciBOQ00gYW5kIE1CSU0gKi8KLQlpZiAoY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSA+IENEQ19OQ01fTUFYX0RBVEFHUkFNX1NJWkUpCi0JCWN0eC0+bWF4X2RhdGFncmFtX3NpemUgPSBDRENfTkNNX01BWF9EQVRBR1JBTV9TSVpFOwogCiAJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsCiAJCSJkd050YkluTWF4U2l6ZT0ldSBkd050Yk91dE1heFNpemU9JXUgd05kcE91dFBheWxvYWRSZW1haW5kZXI9JXUgd05kcE91dERpdmlzb3I9JXUgd05kcE91dEFsaWdubWVudD0ldSB3TnRiT3V0TWF4RGF0YWdyYW1zPSV1IGZsYWdzPTB4JXhcbiIsCiAJCWN0eC0+cnhfbWF4LCBjdHgtPnR4X21heCwgY3R4LT50eF9yZW1haW5kZXIsIGN0eC0+dHhfbW9kdWx1cywKLQkJY3R4LT50eF9uZHBfbW9kdWx1cywgY3R4LT50eF9tYXhfZGF0YWdyYW1zLCBmbGFncyk7CisJCWN0eC0+dHhfbmRwX21vZHVsdXMsIGN0eC0+dHhfbWF4X2RhdGFncmFtcywgY2RjX25jbV9mbGFncyhkZXYpKTsKIAogCS8qIG1heCBjb3VudCBvZiB0eCBkYXRhZ3JhbXMgKi8KIAlpZiAoKGN0eC0+dHhfbWF4X2RhdGFncmFtcyA9PSAwKSB8fAogCQkJKGN0eC0+dHhfbWF4X2RhdGFncmFtcyA+IENEQ19OQ01fRFBUX0RBVEFHUkFNU19NQVgpKQogCQljdHgtPnR4X21heF9kYXRhZ3JhbXMgPSBDRENfTkNNX0RQVF9EQVRBR1JBTVNfTUFYOwogCi0JLyogdmVyaWZ5IG1heGltdW0gc2l6ZSBvZiByZWNlaXZlZCBOVEIgaW4gYnl0ZXMgKi8KLQlpZiAoY3R4LT5yeF9tYXggPCBVU0JfQ0RDX05DTV9OVEJfTUlOX0lOX1NJWkUpIHsKLQkJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsICJVc2luZyBtaW4gcmVjZWl2ZSBsZW5ndGg9JWRcbiIsCi0JCQlVU0JfQ0RDX05DTV9OVEJfTUlOX0lOX1NJWkUpOwotCQljdHgtPnJ4X21heCA9IFVTQl9DRENfTkNNX05UQl9NSU5fSU5fU0laRTsKKwkvKiBzZXQgdXAgbWF4aW11bSBORFAgc2l6ZSAqLworCWN0eC0+bWF4X25kcF9zaXplID0gc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25jbV9uZHAxNikgKyAoY3R4LT50eF9tYXhfZGF0YWdyYW1zICsgMSkgKiBzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX2RwZTE2KTsKKworCS8qIGluaXRpYWwgY29hbGVzY2luZyB0aW1lciBpbnRlcnZhbCAqLworCWN0eC0+dGltZXJfaW50ZXJ2YWwgPSBDRENfTkNNX1RJTUVSX0lOVEVSVkFMX1VTRUMgKiBOU0VDX1BFUl9VU0VDOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBhIG5ldyBtYXggZGF0YWdyYW0gc2l6ZSAqLworc3RhdGljIHZvaWQgY2RjX25jbV9zZXRfZGdyYW1fc2l6ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBuZXdfc2l6ZSkKK3sKKwlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07CisJdTggaWZhY2Vfbm8gPSBjdHgtPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJX19sZTE2IG1heF9kYXRhZ3JhbV9zaXplOworCXUxNiBtYmltX210dTsKKwlpbnQgZXJyOworCisJLyogc2V0IGRlZmF1bHQgYmFzZWQgb24gZGVzY3JpcHRvcnMgKi8KKwljdHgtPm1heF9kYXRhZ3JhbV9zaXplID0gY2xhbXBfdCh1MzIsIG5ld19zaXplLAorCQkJCQkgY2RjX25jbV9taW5fZGdyYW1fc2l6ZShkZXYpLAorCQkJCQkgQ0RDX05DTV9NQVhfREFUQUdSQU1fU0laRSk7CisKKwkvKiBpbmZvcm0gdGhlIGRldmljZSBhYm91dCB0aGUgc2VsZWN0ZWQgTWF4IERhdGFncmFtIFNpemU/ICovCisJaWYgKCEoY2RjX25jbV9mbGFncyhkZXYpICYgVVNCX0NEQ19OQ01fTkNBUF9NQVhfREFUQUdSQU1fU0laRSkpCisJCWdvdG8gb3V0OworCisJLyogcmVhZCBjdXJyZW50IG10dSB2YWx1ZSBmcm9tIGRldmljZSAqLworCWVyciA9IHVzYm5ldF9yZWFkX2NtZChkZXYsIFVTQl9DRENfR0VUX01BWF9EQVRBR1JBTV9TSVpFLAorCQkJICAgICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCSAgICAgIDAsIGlmYWNlX25vLCAmbWF4X2RhdGFncmFtX3NpemUsIDIpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiR0VUX01BWF9EQVRBR1JBTV9TSVpFIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OwogCX0KIAotCWlmIChjdHgtPnJ4X21heCA+IENEQ19OQ01fTlRCX01BWF9TSVpFX1JYKSB7Ci0JCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiVXNpbmcgZGVmYXVsdCBtYXhpbXVtIHJlY2VpdmUgbGVuZ3RoPSVkXG4iLAotCQkJQ0RDX05DTV9OVEJfTUFYX1NJWkVfUlgpOwotCQljdHgtPnJ4X21heCA9IENEQ19OQ01fTlRCX01BWF9TSVpFX1JYOwotCX0KKwlpZiAobGUxNl90b19jcHUobWF4X2RhdGFncmFtX3NpemUpID09IGN0eC0+bWF4X2RhdGFncmFtX3NpemUpCisJCWdvdG8gb3V0OwogCi0JLyogaW5mb3JtIGRldmljZSBhYm91dCBOVEIgaW5wdXQgc2l6ZSBjaGFuZ2VzICovCi0JaWYgKGN0eC0+cnhfbWF4ICE9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJJbk1heFNpemUpKSB7Ci0JCV9fbGUzMiBkd050YkluTWF4U2l6ZSA9IGNwdV90b19sZTMyKGN0eC0+cnhfbWF4KTsKKwltYXhfZGF0YWdyYW1fc2l6ZSA9IGNwdV90b19sZTE2KGN0eC0+bWF4X2RhdGFncmFtX3NpemUpOworCWVyciA9IHVzYm5ldF93cml0ZV9jbWQoZGV2LCBVU0JfQ0RDX1NFVF9NQVhfREFUQUdSQU1fU0laRSwKKwkJCSAgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCSAgICAgICAwLCBpZmFjZV9ubywgJm1heF9kYXRhZ3JhbV9zaXplLCAyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsICJTRVRfTUFYX0RBVEFHUkFNX1NJWkUgZmFpbGVkXG4iKTsKIAotCQllcnIgPSB1c2JuZXRfd3JpdGVfY21kKGRldiwgVVNCX0NEQ19TRVRfTlRCX0lOUFVUX1NJWkUsCi0JCQkJICAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQKLQkJCQkgICAgICAgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJCSAgICAgICAwLCBpZmFjZV9ubywgJmR3TnRiSW5NYXhTaXplLCA0KTsKLQkJaWYgKGVyciA8IDApCi0JCQlkZXZfZGJnKCZkZXYtPmludGYtPmRldiwgIlNldHRpbmcgTlRCIElucHV0IFNpemUgZmFpbGVkXG4iKTsKLQl9CitvdXQ6CisJLyogc2V0IE1UVSB0byBtYXggc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaWYgbmVjZXNzYXJ5ICovCisJZGV2LT5uZXQtPm10dSA9IG1pbl90KGludCwgZGV2LT5uZXQtPm10dSwgY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSAtIGNkY19uY21fZXRoX2hsZW4oZGV2KSk7CiAKLQkvKiB2ZXJpZnkgbWF4aW11bSBzaXplIG9mIHRyYW5zbWl0dGVkIE5UQiBpbiBieXRlcyAqLwotCWlmIChjdHgtPnR4X21heCA+IENEQ19OQ01fTlRCX01BWF9TSVpFX1RYKSB7Ci0JCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiVXNpbmcgZGVmYXVsdCBtYXhpbXVtIHRyYW5zbWl0IGxlbmd0aD0lZFxuIiwKLQkJCUNEQ19OQ01fTlRCX01BWF9TSVpFX1RYKTsKLQkJY3R4LT50eF9tYXggPSBDRENfTkNNX05UQl9NQVhfU0laRV9UWDsKKwkvKiBkbyBub3QgZXhjZWVkIG9wZXJhdGVyIHByZWZlcnJlZCBNVFUgKi8KKwlpZiAoY3R4LT5tYmltX2V4dGVuZGVkX2Rlc2MpIHsKKwkJbWJpbV9tdHUgPSBsZTE2X3RvX2NwdShjdHgtPm1iaW1fZXh0ZW5kZWRfZGVzYy0+d01UVSk7CisJCWlmIChtYmltX210dSAhPSAwICYmIG1iaW1fbXR1IDwgZGV2LT5uZXQtPm10dSkKKwkJCWRldi0+bmV0LT5tdHUgPSBtYmltX210dTsKIAl9Cit9CisKK3N0YXRpYyB2b2lkIGNkY19uY21fZml4X21vZHVsdXMoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKWRldi0+ZGF0YVswXTsKKwl1MzIgdmFsOwogCiAJLyoKIAkgKiB2ZXJpZnkgdGhhdCB0aGUgc3RydWN0dXJlIGFsaWdubWVudCBpczoKQEAgLTE5OSw2OCArNjAwLDMxIEBACiAJfQogCiAJLyogYWRqdXN0IFRYLXJlbWFpbmRlciBhY2NvcmRpbmcgdG8gTkNNIHNwZWNpZmljYXRpb24uICovCi0JY3R4LT50eF9yZW1haW5kZXIgPSAoKGN0eC0+dHhfcmVtYWluZGVyIC0gZXRoX2hsZW4pICYKKwljdHgtPnR4X3JlbWFpbmRlciA9ICgoY3R4LT50eF9yZW1haW5kZXIgLSBjZGNfbmNtX2V0aF9obGVuKGRldikpICYKIAkJCSAgICAgKGN0eC0+dHhfbW9kdWx1cyAtIDEpKTsKK30KIAotCS8qIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBjZGNfbmNtX3NldHVwKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07CisJdTMyIGRlZl9yeCwgZGVmX3R4OwogCi0JLyogc2V0IENSQyBNb2RlICovCi0JaWYgKGZsYWdzICYgVVNCX0NEQ19OQ01fTkNBUF9DUkNfTU9ERSkgewotCQllcnIgPSB1c2JuZXRfd3JpdGVfY21kKGRldiwgVVNCX0NEQ19TRVRfQ1JDX01PREUsCi0JCQkJICAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQKLQkJCQkgICAgICAgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJCSAgICAgICBVU0JfQ0RDX05DTV9DUkNfTk9UX0FQUEVOREVELAotCQkJCSAgICAgICBpZmFjZV9ubywgTlVMTCwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsICJTZXR0aW5nIENSQyBtb2RlIG9mZiBmYWlsZWRcbiIpOwotCX0KKwkvKiBiZSBjb25zZXJ2YXRpdmUgd2hlbiBzZWxlY3RpbmcgaW50aWFsIGJ1ZmZlciBzaXplIHRvCisJICogaW5jcmVhc2UgdGhlIG51bWJlciBvZiBob3N0cyB0aGlzIHdpbGwgd29yayBmb3IKKwkgKi8KKwlkZWZfcnggPSBtaW5fdCh1MzIsIENEQ19OQ01fTlRCX0RFRl9TSVpFX1JYLAorCQkgICAgICAgbGUzMl90b19jcHUoY3R4LT5uY21fcGFybS5kd050YkluTWF4U2l6ZSkpOworCWRlZl90eCA9IG1pbl90KHUzMiwgQ0RDX05DTV9OVEJfREVGX1NJWkVfVFgsCisJCSAgICAgICBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiT3V0TWF4U2l6ZSkpOwogCi0JLyogc2V0IE5UQiBmb3JtYXQsIGlmIGJvdGggZm9ybWF0cyBhcmUgc3VwcG9ydGVkICovCi0JaWYgKG50Yl9mbXRfc3VwcG9ydGVkICYgVVNCX0NEQ19OQ01fTlRIMzJfU0lHTikgewotCQllcnIgPSB1c2JuZXRfd3JpdGVfY21kKGRldiwgVVNCX0NEQ19TRVRfTlRCX0ZPUk1BVCwKLQkJCQkgICAgICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX09VVAotCQkJCSAgICAgICB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCi0JCQkJICAgICAgIFVTQl9DRENfTkNNX05UQjE2X0ZPUk1BVCwKLQkJCQkgICAgICAgaWZhY2Vfbm8sIE5VTEwsIDApOwotCQlpZiAoZXJyIDwgMCkKLQkJCWRldl9kYmcoJmRldi0+aW50Zi0+ZGV2LCAiU2V0dGluZyBOVEIgZm9ybWF0IHRvIDE2LWJpdCBmYWlsZWRcbiIpOwotCX0KKwkvKiBjbGFtcCByeF9tYXggYW5kIHR4X21heCBhbmQgaW5mb3JtIGRldmljZSAqLworCWNkY19uY21fdXBkYXRlX3J4dHhfbWF4KGRldiwgZGVmX3J4LCBkZWZfdHgpOwogCi0JLyogaW5mb3JtIHRoZSBkZXZpY2UgYWJvdXQgdGhlIHNlbGVjdGVkIE1heCBEYXRhZ3JhbSBTaXplICovCi0JaWYgKCEoZmxhZ3MgJiBVU0JfQ0RDX05DTV9OQ0FQX01BWF9EQVRBR1JBTV9TSVpFKSkKLQkJZ290byBvdXQ7CisJLyogc2FuaXRpemUgdGhlIG1vZHVsdXMgYW5kIHJlbWFpbmRlciB2YWx1ZXMgKi8KKwljZGNfbmNtX2ZpeF9tb2R1bHVzKGRldik7CiAKLQkvKiByZWFkIGN1cnJlbnQgbXR1IHZhbHVlIGZyb20gZGV2aWNlICovCi0JZXJyID0gdXNibmV0X3JlYWRfY21kKGRldiwgVVNCX0NEQ19HRVRfTUFYX0RBVEFHUkFNX1NJWkUsCi0JCQkgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfSU4gfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJICAgICAgMCwgaWZhY2Vfbm8sICZtYXhfZGF0YWdyYW1fc2l6ZSwgMik7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2RiZygmZGV2LT5pbnRmLT5kZXYsICJHRVRfTUFYX0RBVEFHUkFNX1NJWkUgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGxlMTZfdG9fY3B1KG1heF9kYXRhZ3JhbV9zaXplKSA9PSBjdHgtPm1heF9kYXRhZ3JhbV9zaXplKQotCQlnb3RvIG91dDsKLQotCW1heF9kYXRhZ3JhbV9zaXplID0gY3B1X3RvX2xlMTYoY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSk7Ci0JZXJyID0gdXNibmV0X3dyaXRlX2NtZChkZXYsIFVTQl9DRENfU0VUX01BWF9EQVRBR1JBTV9TSVpFLAotCQkJICAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJICAgICAgIDAsIGlmYWNlX25vLCAmbWF4X2RhdGFncmFtX3NpemUsIDIpOwotCWlmIChlcnIgPCAwKQotCQlkZXZfZGJnKCZkZXYtPmludGYtPmRldiwgIlNFVF9NQVhfREFUQUdSQU1fU0laRSBmYWlsZWRcbiIpOwotCi1vdXQ6Ci0JLyogc2V0IE1UVSB0byBtYXggc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKGRldi0+bmV0LT5tdHUgPiBjdHgtPm1heF9kYXRhZ3JhbV9zaXplIC0gZXRoX2hsZW4pCi0JCWRldi0+bmV0LT5tdHUgPSBjdHgtPm1heF9kYXRhZ3JhbV9zaXplIC0gZXRoX2hsZW47Ci0KLQkvKiBkbyBub3QgZXhjZWVkIG9wZXJhdGVyIHByZWZlcnJlZCBNVFUgKi8KLQlpZiAoY3R4LT5tYmltX2V4dGVuZGVkX2Rlc2MpIHsKLQkJbWJpbV9tdHUgPSBsZTE2X3RvX2NwdShjdHgtPm1iaW1fZXh0ZW5kZWRfZGVzYy0+d01UVSk7Ci0JCWlmIChtYmltX210dSAhPSAwICYmIG1iaW1fbXR1IDwgZGV2LT5uZXQtPm10dSkKLQkJCWRldi0+bmV0LT5tdHUgPSBtYmltX210dTsKLQl9Ci0KKwkvKiBzZXQgbWF4IGRhdGFncmFtIHNpemUgKi8KKwljZGNfbmNtX3NldF9kZ3JhbV9zaXplKGRldiwgY2RjX25jbV9tYXhfZGdyYW1fc2l6ZShkZXYpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI0LDEwICs3ODgsMjEgQEAKIAl9CiAKIAkvKiBjaGVjayBpZiB3ZSBnb3QgZXZlcnl0aGluZyAqLwotCWlmICghY3R4LT5kYXRhIHx8ICghY3R4LT5tYmltX2Rlc2MgJiYgIWN0eC0+ZXRoZXJfZGVzYykpIHsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiQ0RDIGRlc2NyaXB0b3JzIG1pc3NpbmdcbiIpOworCWlmICghY3R4LT5kYXRhKSB7CisJCWRldl9kYmcoJmludGYtPmRldiwgIkNEQyBVbmlvbiBtaXNzaW5nIGFuZCBubyBJQUQgZm91bmRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KKwlpZiAoY2RjX25jbV9jb21tX2ludGZfaXNfbWJpbShpbnRmLT5jdXJfYWx0c2V0dGluZykpIHsKKwkJaWYgKCFjdHgtPm1iaW1fZGVzYykgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTUJJTSBmdW5jdGlvbmFsIGRlc2NyaXB0b3IgbWlzc2luZ1xuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFjdHgtPmV0aGVyX2Rlc2MgfHwgIWN0eC0+ZnVuY19kZXNjKSB7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJOQ00gb3IgRUNNIGZ1bmN0aW9uYWwgZGVzY3JpcHRvcnMgbWlzc2luZ1xuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQogCiAJLyogY2xhaW0gZGF0YSBpbnRlcmZhY2UsIGlmIGRpZmZlcmVudCBmcm9tIGNvbnRyb2wgKi8KIAlpZiAoY3R4LT5kYXRhICE9IGN0eC0+Y29udHJvbCkgewpAQCAtNDQ3LDggKzgyMiw4IEBACiAJCWdvdG8gZXJyb3IyOwogCX0KIAotCS8qIGluaXRpYWxpemUgZGF0YSBpbnRlcmZhY2UgKi8KLQlpZiAoY2RjX25jbV9zZXR1cChkZXYpKQorCS8qIGluaXRpYWxpemUgYmFzaWMgZGV2aWNlIHNldHRpbmdzICovCisJaWYgKGNkY19uY21faW5pdChkZXYpKQogCQlnb3RvIGVycm9yMjsKIAogCS8qIGNvbmZpZ3VyZSBkYXRhIGludGVyZmFjZSAqLwpAQCAtNDc3LDE4ICs4NTIsMTQgQEAKIAkJZGV2X2luZm8oJmludGYtPmRldiwgIk1BQy1BZGRyZXNzOiAlcE1cbiIsIGRldi0+bmV0LT5kZXZfYWRkcik7CiAJfQogCi0JLyogdXNibmV0IHVzZSB0aGVzZSB2YWx1ZXMgZm9yIHNpemluZyB0eC9yeCBxdWV1ZXMgKi8KLQlkZXYtPmhhcmRfbXR1ID0gY3R4LT50eF9tYXg7Ci0JZGV2LT5yeF91cmJfc2l6ZSA9IGN0eC0+cnhfbWF4OworCS8qIGZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZXZpY2Ugc3BlY2lmaWMgZGF0YSAqLworCWNkY19uY21fc2V0dXAoZGV2KTsKIAotCS8qIGNkY19uY21fc2V0dXAgd2lsbCBvdmVycmlkZSBkd050Yk91dE1heFNpemUgaWYgaXQgaXMKLQkgKiBvdXRzaWRlIHRoZSBzYW5lIHJhbmdlLiBBZGRpbmcgYSBwYWQgYnl0ZSBoZXJlIGlmIG5lY2Vzc2FyeQotCSAqIHNpbXBsaWZpZXMgdGhlIGhhbmRsaW5nIGluIGNkY19uY21fZmlsbF90eF9mcmFtZSwgbWFraW5nCi0JICogdHhfbWF4IGFsd2F5cyByZXByZXNlbnQgdGhlIHJlYWwgc2tiIG1heCBzaXplLgotCSAqLwotCWlmIChjdHgtPnR4X21heCAhPSBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiT3V0TWF4U2l6ZSkgJiYKLQkgICAgY3R4LT50eF9tYXggJSB1c2JfbWF4cGFja2V0KGRldi0+dWRldiwgZGV2LT5vdXQsIDEpID09IDApCi0JCWN0eC0+dHhfbWF4Kys7CisJLyogb3ZlcnJpZGUgZXRodG9vbF9vcHMgKi8KKwlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmY2RjX25jbV9ldGh0b29sX29wczsKKworCS8qIGFkZCBvdXIgc3lzZnMgYXR0cnMgKi8KKwlkZXYtPm5ldC0+c3lzZnNfZ3JvdXBzWzBdID0gJmNkY19uY21fc3lzZnNfYXR0cl9ncm91cDsKIAogCXJldHVybiAwOwogCkBAIC01NDEsMTAgKzkxMiwxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2RjX25jbV91bmJpbmQpOwogCi0vKiBTZWxlY3QgdGhlIE1CSU0gYWx0c2V0dGluZyBpZmYgaXQgaXMgcHJlZmVycmVkIGFuZCBhdmFpbGFibGUsCi0gKiByZXR1cm5pbmcgdGhlIG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGludGVyZmFjZSBhbHRzZXR0aW5nCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgTUJJTSBjb250cm9sIGludGVyZmFjZSBhbHRzZXR0aW5nIGlmZiBpdAorICogaXMgcHJlZmVycmVkIGFuZCBhdmFpbGFibGUsCiAgKi8KLXU4IGNkY19uY21fc2VsZWN0X2FsdHNldHRpbmcoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3U4IGNkY19uY21fc2VsZWN0X2FsdHNldHRpbmcoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCkBAIC01NjMsMTUgKzkzNCwxNSBAQAogCSAqICAgdGhlIHJ1bGVzIGdpdmVuIGluIHNlY3Rpb24gNiAoVVNCIERldmljZSBNb2RlbCkgb2YgdGhpcwogCSAqICAgc3BlY2lmaWNhdGlvbi4iCiAJICovCi0JaWYgKHByZWZlcl9tYmltICYmIGludGYtPm51bV9hbHRzZXR0aW5nID09IDIpIHsKKwlpZiAoaW50Zi0+bnVtX2FsdHNldHRpbmcgPCAyKQorCQlyZXR1cm4gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkFsdGVybmF0ZVNldHRpbmc7CisKKwlpZiAocHJlZmVyX21iaW0pIHsKIAkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIENEQ19OQ01fQ09NTV9BTFRTRVRUSU5HX01CSU0pOwotCQlpZiAoYWx0ICYmIGNkY19uY21fY29tbV9pbnRmX2lzX21iaW0oYWx0KSAmJgotCQkgICAgIXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwKLQkJCQkgICAgICAgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJCQkgICAgICAgQ0RDX05DTV9DT01NX0FMVFNFVFRJTkdfTUJJTSkpCi0JCQlyZXR1cm4gQ0RDX05DTV9EQVRBX0FMVFNFVFRJTkdfTUJJTTsKKwkJaWYgKGFsdCAmJiBjZGNfbmNtX2NvbW1faW50Zl9pc19tYmltKGFsdCkpCisJCQlyZXR1cm4gQ0RDX05DTV9DT01NX0FMVFNFVFRJTkdfTUJJTTsKIAl9Ci0JcmV0dXJuIENEQ19OQ01fREFUQV9BTFRTRVRUSU5HX05DTTsKKwlyZXR1cm4gQ0RDX05DTV9DT01NX0FMVFNFVFRJTkdfTkNNOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2RjX25jbV9zZWxlY3RfYWx0c2V0dGluZyk7CiAKQEAgLTU4MCwxMiArOTUxLDExIEBACiAJaW50IHJldDsKIAogCS8qIE1CSU0gYmFja3dhcmRzIGNvbXBhdGlibGUgZnVuY3Rpb24/ICovCi0JY2RjX25jbV9zZWxlY3RfYWx0c2V0dGluZyhkZXYsIGludGYpOwotCWlmIChjZGNfbmNtX2NvbW1faW50Zl9pc19tYmltKGludGYtPmN1cl9hbHRzZXR0aW5nKSkKKwlpZiAoY2RjX25jbV9zZWxlY3RfYWx0c2V0dGluZyhpbnRmKSAhPSBDRENfTkNNX0NPTU1fQUxUU0VUVElOR19OQ00pCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogTkNNIGRhdGEgYWx0c2V0dGluZyBpcyBhbHdheXMgMSAqLwotCXJldCA9IGNkY19uY21fYmluZF9jb21tb24oZGV2LCBpbnRmLCAxKTsKKwkvKiBUaGUgTkNNIGRhdGEgYWx0c2V0dGluZyBpcyBmaXhlZCAqLworCXJldCA9IGNkY19uY21fYmluZF9jb21tb24oZGV2LCBpbnRmLCBDRENfTkNNX0RBVEFfQUxUU0VUVElOR19OQ00pOwogCiAJLyoKIAkgKiBXZSBzaG91bGQgZ2V0IGFuIGV2ZW50IHdoZW4gbmV0d29yayBjb25uZWN0aW9uIGlzICJjb25uZWN0ZWQiIG9yCkBAIC02MjgsNyArOTk4LDcgQEAKIAljZGNfbmNtX2FsaWduX3RhaWwoc2tiLCBjdHgtPnR4X25kcF9tb2R1bHVzLCAwLCBjdHgtPnR4X21heCk7CiAKIAkvKiB2ZXJpZnkgdGhhdCB0aGVyZSBpcyByb29tIGZvciB0aGUgTkRQIGFuZCB0aGUgZGF0YWdyYW0gKHJlc2VydmUpICovCi0JaWYgKChjdHgtPnR4X21heCAtIHNrYi0+bGVuIC0gcmVzZXJ2ZSkgPCBDRENfTkNNX05EUF9TSVpFKQorCWlmICgoY3R4LT50eF9tYXggLSBza2ItPmxlbiAtIHJlc2VydmUpIDwgY3R4LT5tYXhfbmRwX3NpemUpCiAJCXJldHVybiBOVUxMOwogCiAJLyogbGluayB0byBpdCAqLwpAQCAtNjM4LDcgKzEwMDgsNyBAQAogCQludGgxNi0+d05kcEluZGV4ID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOwogCiAJLyogcHVzaCBhIG5ldyBlbXB0eSBORFAgKi8KLQluZHAxNiA9IChzdHJ1Y3QgdXNiX2NkY19uY21fbmRwMTYgKiltZW1zZXQoc2tiX3B1dChza2IsIENEQ19OQ01fTkRQX1NJWkUpLCAwLCBDRENfTkNNX05EUF9TSVpFKTsKKwluZHAxNiA9IChzdHJ1Y3QgdXNiX2NkY19uY21fbmRwMTYgKiltZW1zZXQoc2tiX3B1dChza2IsIGN0eC0+bWF4X25kcF9zaXplKSwgMCwgY3R4LT5tYXhfbmRwX3NpemUpOwogCW5kcDE2LT5kd1NpZ25hdHVyZSA9IHNpZ247CiAJbmRwMTYtPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX25kcDE2KSArIHNpemVvZihzdHJ1Y3QgdXNiX2NkY19uY21fZHBlMTYpKTsKIAlyZXR1cm4gbmRwMTY7CkBAIC02ODMsNiArMTA1Myw5IEBACiAKIAkJLyogY291bnQgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGlzIE5UQiAqLwogCQljdHgtPnR4X2N1cnJfZnJhbWVfbnVtID0gMDsKKworCQkvKiByZWNlbnQgcGF5bG9hZCBjb3VudGVyIGZvciB0aGlzIHNrYl9vdXQgKi8KKwkJY3R4LT50eF9jdXJyX2ZyYW1lX3BheWxvYWQgPSAwOwogCX0KIAogCWZvciAobiA9IGN0eC0+dHhfY3Vycl9mcmFtZV9udW07IG4gPCBjdHgtPnR4X21heF9kYXRhZ3JhbXM7IG4rKykgewpAQCAtNzIwLDYgKzEwOTMsNyBAQAogCQkJCWN0eC0+dHhfcmVtX3NpZ24gPSBzaWduOwogCQkJCXNrYiA9IE5VTEw7CiAJCQkJcmVhZHkyc2VuZCA9IDE7CisJCQkJY3R4LT50eF9yZWFzb25fbnRiX2Z1bGwrKzsJLyogY291bnQgcmVhc29uIGZvciB0cmFuc21pdHRpbmcgKi8KIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC03MzMsMTIgKzExMDcsMTQgQEAKIAkJbmRwMTYtPmRwZTE2W2luZGV4XS53RGF0YWdyYW1JbmRleCA9IGNwdV90b19sZTE2KHNrYl9vdXQtPmxlbik7CiAJCW5kcDE2LT53TGVuZ3RoID0gY3B1X3RvX2xlMTYobmRwbGVuICsgc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25jbV9kcGUxNikpOwogCQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljdHgtPnR4X2N1cnJfZnJhbWVfcGF5bG9hZCArPSBza2ItPmxlbjsJLyogY291bnQgcmVhbCB0eCBwYXlsb2FkIGRhdGEgKi8KIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJc2tiID0gTlVMTDsKIAogCQkvKiBzZW5kIG5vdyBpZiB0aGlzIE5EUCBpcyBmdWxsICovCiAJCWlmIChpbmRleCA+PSBDRENfTkNNX0RQVF9EQVRBR1JBTVNfTUFYKSB7CiAJCQlyZWFkeTJzZW5kID0gMTsKKwkJCWN0eC0+dHhfcmVhc29uX25kcF9mdWxsKys7CS8qIGNvdW50IHJlYXNvbiBmb3IgdHJhbnNtaXR0aW5nICovCiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTc1OCw3ICsxMTM0LDcgQEAKIAkJY3R4LT50eF9jdXJyX3NrYiA9IHNrYl9vdXQ7CiAJCWdvdG8gZXhpdF9ub19za2I7CiAKLQl9IGVsc2UgaWYgKChuIDwgY3R4LT50eF9tYXhfZGF0YWdyYW1zKSAmJiAocmVhZHkyc2VuZCA9PSAwKSkgeworCX0gZWxzZSBpZiAoKG4gPCBjdHgtPnR4X21heF9kYXRhZ3JhbXMpICYmIChyZWFkeTJzZW5kID09IDApICYmIChjdHgtPnRpbWVyX2ludGVydmFsID4gMCkpIHsKIAkJLyogd2FpdCBmb3IgbW9yZSBmcmFtZXMgKi8KIAkJLyogcHVzaCB2YXJpYWJsZXMgKi8KIAkJY3R4LT50eF9jdXJyX3NrYiA9IHNrYl9vdXQ7CkBAIC03NjgsMTEgKzExNDQsMTMgQEAKIAkJZ290byBleGl0X25vX3NrYjsKIAogCX0gZWxzZSB7CisJCWlmIChuID09IGN0eC0+dHhfbWF4X2RhdGFncmFtcykKKwkJCWN0eC0+dHhfcmVhc29uX21heF9kYXRhZ3JhbSsrOwkvKiBjb3VudCByZWFzb24gZm9yIHRyYW5zbWl0dGluZyAqLwogCQkvKiBmcmFtZSBnb2VzIG91dCAqLwogCQkvKiB2YXJpYWJsZXMgd2lsbCBiZSByZXNldCBhdCBuZXh0IGNhbGwgKi8KIAl9CiAKLQkvKiBJZiBjb2xsZWN0ZWQgZGF0YSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgQ0RDX05DTV9NSU5fVFhfUEtUCisJLyogSWYgY29sbGVjdGVkIGRhdGEgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIGN0eC0+bWluX3R4X3BrdAogCSAqIGJ5dGVzLCB3ZSBzZW5kIGJ1ZmZlcnMgYXMgaXQgaXMuIElmIHdlIGdldCBtb3JlIGRhdGEsIGl0CiAJICogd291bGQgYmUgbW9yZSBlZmZpY2llbnQgZm9yIFVTQiBIUyBtb2JpbGUgZGV2aWNlIHdpdGggRE1BCiAJICogZW5naW5lIHRvIHJlY2VpdmUgYSBmdWxsIHNpemUgTlRCLCB0aGFuIGNhbmNlbGluZyBETUEKQEAgLTc4Miw3ICsxMTYwLDcgQEAKIAkgKiBhIFpMUCBhZnRlciBmdWxsIHNpemVkIE5UQnMuCiAJICovCiAJaWYgKCEoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MgJiBGTEFHX1NFTkRfWkxQKSAmJgotCSAgICBza2Jfb3V0LT5sZW4gPiBDRENfTkNNX01JTl9UWF9QS1QpCisJICAgIHNrYl9vdXQtPmxlbiA+IGN0eC0+bWluX3R4X3BrdCkKIAkJbWVtc2V0KHNrYl9wdXQoc2tiX291dCwgY3R4LT50eF9tYXggLSBza2Jfb3V0LT5sZW4pLCAwLAogCQkgICAgICAgY3R4LT50eF9tYXggLSBza2Jfb3V0LT5sZW4pOwogCWVsc2UgaWYgKHNrYl9vdXQtPmxlbiA8IGN0eC0+dHhfbWF4ICYmIChza2Jfb3V0LT5sZW4gJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKQEAgLTc5NSwxMSArMTE3MywyMiBAQAogCS8qIHJldHVybiBza2IgKi8KIAljdHgtPnR4X2N1cnJfc2tiID0gTlVMTDsKIAlkZXYtPm5ldC0+c3RhdHMudHhfcGFja2V0cyArPSBjdHgtPnR4X2N1cnJfZnJhbWVfbnVtOworCisJLyoga2VlcCBwcml2YXRlIHN0YXRzOiBmcmFtaW5nIG92ZXJoZWFkIGFuZCBudW1iZXIgb2YgTlRCcyAqLworCWN0eC0+dHhfb3ZlcmhlYWQgKz0gc2tiX291dC0+bGVuIC0gY3R4LT50eF9jdXJyX2ZyYW1lX3BheWxvYWQ7CisJY3R4LT50eF9udGJzKys7CisKKwkvKiB1c2JuZXQgaGFzIGFscmVhZHkgY291bnRlZCBhbGwgdGhlIGZyYW1pbmcgb3ZlcmhlYWQuCisJICogQWRqdXN0IHRoZSBzdGF0cyBzbyB0aGF0IHRoZSB0eF9ieXRlcyBjb3VudGVyIHNob3cgcmVhbAorCSAqIHBheWxvYWQgZGF0YSBpbnN0ZWFkLgorCSAqLworCWRldi0+bmV0LT5zdGF0cy50eF9ieXRlcyAtPSBza2Jfb3V0LT5sZW4gLSBjdHgtPnR4X2N1cnJfZnJhbWVfcGF5bG9hZDsKKwogCXJldHVybiBza2Jfb3V0OwogCiBleGl0X25vX3NrYjoKLQkvKiBTdGFydCB0aW1lciwgaWYgdGhlcmUgaXMgYSByZW1haW5pbmcgc2tiICovCi0JaWYgKGN0eC0+dHhfY3Vycl9za2IgIT0gTlVMTCkKKwkvKiBTdGFydCB0aW1lciwgaWYgdGhlcmUgaXMgYSByZW1haW5pbmcgbm9uLWVtcHR5IHNrYiAqLworCWlmIChjdHgtPnR4X2N1cnJfc2tiICE9IE5VTEwgJiYgbiA+IDApCiAJCWNkY19uY21fdHhfdGltZW91dF9zdGFydChjdHgpOwogCXJldHVybiBOVUxMOwogfQpAQCAtODEwLDcgKzExOTksNyBAQAogCS8qIHN0YXJ0IHRpbWVyLCBpZiBub3QgYWxyZWFkeSBzdGFydGVkICovCiAJaWYgKCEoaHJ0aW1lcl9hY3RpdmUoJmN0eC0+dHhfdGltZXIpIHx8IGF0b21pY19yZWFkKCZjdHgtPnN0b3ApKSkKIAkJaHJ0aW1lcl9zdGFydCgmY3R4LT50eF90aW1lciwKLQkJCQlrdGltZV9zZXQoMCwgQ0RDX05DTV9USU1FUl9JTlRFUlZBTCksCisJCQkJa3RpbWVfc2V0KDAsIGN0eC0+dGltZXJfaW50ZXJ2YWwpLAogCQkJCUhSVElNRVJfTU9ERV9SRUwpOwogfQogCkBAIC04MzUsNiArMTIyNCw3IEBACiAJCWNkY19uY21fdHhfdGltZW91dF9zdGFydChjdHgpOwogCQlzcGluX3VubG9ja19iaCgmY3R4LT5tdHgpOwogCX0gZWxzZSBpZiAoZGV2LT5uZXQgIT0gTlVMTCkgeworCQljdHgtPnR4X3JlYXNvbl90aW1lb3V0Kys7CS8qIGNvdW50IHJlYXNvbiBmb3IgdHJhbnNtaXR0aW5nICovCiAJCXNwaW5fdW5sb2NrX2JoKCZjdHgtPm10eCk7CiAJCW5ldGlmX3R4X2xvY2tfYmgoZGV2LT5uZXQpOwogCQl1c2JuZXRfc3RhcnRfeG1pdChOVUxMLCBkZXYtPm5ldCk7CkBAIC05NzAsNiArMTM2MCw3IEBACiAJc3RydWN0IHVzYl9jZGNfbmNtX2RwZTE2ICpkcGUxNjsKIAlpbnQgbmRwb2Zmc2V0OwogCWludCBsb29wY291bnQgPSA1MDsgLyogYXJiaXRyYXJ5IG1heCBwcmV2ZW50aW5nIGluZmluaXRlIGxvb3AgKi8KKwl1MzIgcGF5bG9hZCA9IDA7CiAKIAluZHBvZmZzZXQgPSBjZGNfbmNtX3J4X3ZlcmlmeV9udGgxNihjdHgsIHNrYl9pbik7CiAJaWYgKG5kcG9mZnNldCA8IDApCkBAIC0xMDE1LDEzICsxNDA2LDEzIEBACiAJCQlicmVhazsKIAogCQl9IGVsc2UgewotCQkJc2tiID0gc2tiX2Nsb25lKHNrYl9pbiwgR0ZQX0FUT01JQyk7CisJCQkvKiBjcmVhdGUgYSBmcmVzaCBjb3B5IHRvIHJlZHVjZSB0cnVlc2l6ZSAqLworCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihkZXYtPm5ldCwgIGxlbik7CiAJCQlpZiAoIXNrYikKIAkJCQlnb3RvIGVycm9yOwotCQkJc2tiLT5sZW4gPSBsZW47Ci0JCQlza2ItPmRhdGEgPSAoKHU4ICopc2tiX2luLT5kYXRhKSArIG9mZnNldDsKLQkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgc2tiX2luLT5kYXRhICsgb2Zmc2V0LCBsZW4pOwogCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBza2IpOworCQkJcGF5bG9hZCArPSBsZW47CS8qIGNvdW50IHBheWxvYWQgYnl0ZXMgaW4gdGhpcyBOVEIgKi8KIAkJfQogCX0KIGVycl9uZHA6CkBAIC0xMDMwLDYgKzE0MjEsMTAgQEAKIAlpZiAobmRwb2Zmc2V0ICYmIGxvb3Bjb3VudC0tKQogCQlnb3RvIG5leHRfbmRwOwogCisJLyogdXBkYXRlIHN0YXRzICovCisJY3R4LT5yeF9vdmVyaGVhZCArPSBza2JfaW4tPmxlbiAtIHBheWxvYWQ7CisJY3R4LT5yeF9udGJzKys7CisKIAlyZXR1cm4gMTsKIGVycm9yOgogCXJldHVybiAwOwpAQCAtMTA0OSwxNCArMTQ0NCwxNCBAQAogCSAqLwogCWlmICgodHhfc3BlZWQgPiAxMDAwMDAwKSAmJiAocnhfc3BlZWQgPiAxMDAwMDAwKSkgewogCQluZXRpZl9pbmZvKGRldiwgbGluaywgZGV2LT5uZXQsCi0JCSAgICAgICAiJXUgbWJpdC9zIGRvd25saW5rICV1IG1iaXQvcyB1cGxpbmtcbiIsCi0JCSAgICAgICAodW5zaWduZWQgaW50KShyeF9zcGVlZCAvIDEwMDAwMDBVKSwKLQkJICAgICAgICh1bnNpZ25lZCBpbnQpKHR4X3NwZWVkIC8gMTAwMDAwMFUpKTsKKwkJCSAgICIldSBtYml0L3MgZG93bmxpbmsgJXUgbWJpdC9zIHVwbGlua1xuIiwKKwkJCSAgICh1bnNpZ25lZCBpbnQpKHJ4X3NwZWVkIC8gMTAwMDAwMFUpLAorCQkJICAgKHVuc2lnbmVkIGludCkodHhfc3BlZWQgLyAxMDAwMDAwVSkpOwogCX0gZWxzZSB7CiAJCW5ldGlmX2luZm8oZGV2LCBsaW5rLCBkZXYtPm5ldCwKLQkJICAgICAgICIldSBrYml0L3MgZG93bmxpbmsgJXUga2JpdC9zIHVwbGlua1xuIiwKLQkJICAgICAgICh1bnNpZ25lZCBpbnQpKHJ4X3NwZWVkIC8gMTAwMFUpLAotCQkgICAgICAgKHVuc2lnbmVkIGludCkodHhfc3BlZWQgLyAxMDAwVSkpOworCQkJICAgIiV1IGtiaXQvcyBkb3dubGluayAldSBrYml0L3MgdXBsaW5rXG4iLAorCQkJICAgKHVuc2lnbmVkIGludCkocnhfc3BlZWQgLyAxMDAwVSksCisJCQkgICAodW5zaWduZWQgaW50KSh0eF9zcGVlZCAvIDEwMDBVKSk7CiAJfQogfQogCkBAIC0xMDg2LDExICsxNDgxLDEwIEBACiAJCSAqIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTiBub3RpZmljYXRpb24gc2hhbGwgYmUKIAkJICogc2VudCBieSBkZXZpY2UgYWZ0ZXIgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFLgogCQkgKi8KLQkJY3R4LT5jb25uZWN0ZWQgPSBsZTE2X3RvX2NwdShldmVudC0+d1ZhbHVlKTsKIAkJbmV0aWZfaW5mbyhkZXYsIGxpbmssIGRldi0+bmV0LAogCQkJICAgIm5ldHdvcmsgY29ubmVjdGlvbjogJXNjb25uZWN0ZWRcbiIsCi0JCQkgICBjdHgtPmNvbm5lY3RlZCA/ICIiIDogImRpcyIpOwotCQl1c2JuZXRfbGlua19jaGFuZ2UoZGV2LCBjdHgtPmNvbm5lY3RlZCwgMCk7CisJCQkgICAhIWV2ZW50LT53VmFsdWUgPyAiIiA6ICJkaXMiKTsKKwkJdXNibmV0X2xpbmtfY2hhbmdlKGRldiwgISFldmVudC0+d1ZhbHVlLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9DRENfTk9USUZZX1NQRUVEX0NIQU5HRToKQEAgLTExMTAsMjMgKzE1MDQsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2RjX25jbV9jaGVja19jb25uZWN0KHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlzdHJ1Y3QgY2RjX25jbV9jdHggKmN0eDsKLQotCWN0eCA9IChzdHJ1Y3QgY2RjX25jbV9jdHggKilkZXYtPmRhdGFbMF07Ci0JaWYgKGN0eCA9PSBOVUxMKQotCQlyZXR1cm4gMTsJLyogZGlzY29ubmVjdGVkICovCi0KLQlyZXR1cm4gIWN0eC0+Y29ubmVjdGVkOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGNkY19uY21faW5mbyA9IHsKIAkuZGVzY3JpcHRpb24gPSAiQ0RDIE5DTSIsCiAJLmZsYWdzID0gRkxBR19QT0lOVFRPUE9JTlQgfCBGTEFHX05PX1NFVElOVCB8IEZMQUdfTVVMVElfUEFDS0VULAogCS5iaW5kID0gY2RjX25jbV9iaW5kLAogCS51bmJpbmQgPSBjZGNfbmNtX3VuYmluZCwKLQkuY2hlY2tfY29ubmVjdCA9IGNkY19uY21fY2hlY2tfY29ubmVjdCwKIAkubWFuYWdlX3Bvd2VyID0gdXNibmV0X21hbmFnZV9wb3dlciwKIAkuc3RhdHVzID0gY2RjX25jbV9zdGF0dXMsCiAJLnJ4X2ZpeHVwID0gY2RjX25jbV9yeF9maXh1cCwKQEAgLTExNDAsNyArMTUyMiw2IEBACiAJCQl8IEZMQUdfV1dBTiwKIAkuYmluZCA9IGNkY19uY21fYmluZCwKIAkudW5iaW5kID0gY2RjX25jbV91bmJpbmQsCi0JLmNoZWNrX2Nvbm5lY3QgPSBjZGNfbmNtX2NoZWNrX2Nvbm5lY3QsCiAJLm1hbmFnZV9wb3dlciA9IHVzYm5ldF9tYW5hZ2VfcG93ZXIsCiAJLnN0YXR1cyA9IGNkY19uY21fc3RhdHVzLAogCS5yeF9maXh1cCA9IGNkY19uY21fcnhfZml4dXAsCkBAIC0xMTU0LDcgKzE1MzUsNiBAQAogCQkJfCBGTEFHX1dXQU4gfCBGTEFHX05PQVJQLAogCS5iaW5kID0gY2RjX25jbV9iaW5kLAogCS51bmJpbmQgPSBjZGNfbmNtX3VuYmluZCwKLQkuY2hlY2tfY29ubmVjdCA9IGNkY19uY21fY2hlY2tfY29ubmVjdCwKIAkubWFuYWdlX3Bvd2VyID0gdXNibmV0X21hbmFnZV9wb3dlciwKIAkuc3RhdHVzID0gY2RjX25jbV9zdGF0dXMsCiAJLnJ4X2ZpeHVwID0gY2RjX25jbV9yeF9maXh1cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwppbmRleCA2NjBiZDVlLi5hM2EwNTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaHNvLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCkBAIC0yNDI1LDcgKzI0MjUsNyBAQAogCW5ldC0+dHlwZSA9IEFSUEhSRF9OT05FOwogCW5ldC0+bXR1ID0gREVGQVVMVF9NVFUgLSAxNDsKIAluZXQtPnR4X3F1ZXVlX2xlbiA9IDEwOwotCVNFVF9FVEhUT09MX09QUyhuZXQsICZvcHMpOworCW5ldC0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCiAJLyogYW5kIGluaXRpYWxpemUgdGhlIHNlbWFwaG9yZSAqLwogCXNwaW5fbG9ja19pbml0KCZoc29fbmV0LT5uZXRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHVhd2VpX2NkY19uY20uYyBiL2RyaXZlcnMvbmV0L3VzYi9odWF3ZWlfY2RjX25jbS5jCmluZGV4IDMxMjE3OGQuLmY5ODIyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9odWF3ZWlfY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9odWF3ZWlfY2RjX25jbS5jCkBAIC0xNzIsMjQgKzE3MiwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaHVhd2VpX2NkY19uY21fY2hlY2tfY29ubmVjdChzdHJ1Y3QgdXNibmV0ICp1c2JuZXRfZGV2KQotewotCXN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4OwotCi0JY3R4ID0gKHN0cnVjdCBjZGNfbmNtX2N0eCAqKXVzYm5ldF9kZXYtPmRhdGFbMF07Ci0KLQlpZiAoY3R4ID09IE5VTEwpCi0JCXJldHVybiAxOyAvKiBkaXNjb25uZWN0ZWQgKi8KLQotCXJldHVybiAhY3R4LT5jb25uZWN0ZWQ7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gaHVhd2VpX2NkY19uY21faW5mbyA9IHsKIAkuZGVzY3JpcHRpb24gPSAiSHVhd2VpIENEQyBOQ00gZGV2aWNlIiwKIAkuZmxhZ3MgPSBGTEFHX05PX1NFVElOVCB8IEZMQUdfTVVMVElfUEFDS0VUIHwgRkxBR19XV0FOLAogCS5iaW5kID0gaHVhd2VpX2NkY19uY21fYmluZCwKIAkudW5iaW5kID0gaHVhd2VpX2NkY19uY21fdW5iaW5kLAotCS5jaGVja19jb25uZWN0ID0gaHVhd2VpX2NkY19uY21fY2hlY2tfY29ubmVjdCwKIAkubWFuYWdlX3Bvd2VyID0gaHVhd2VpX2NkY19uY21fbWFuYWdlX3Bvd2VyLAogCS5yeF9maXh1cCA9IGNkY19uY21fcnhfZml4dXAsCiAJLnR4X2ZpeHVwID0gY2RjX25jbV90eF9maXh1cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYyBiL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYwppbmRleCA5NzMyNzVmLi43NjQ2NWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaXBoZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2lwaGV0aC5jCkBAIC01MzQsNyArNTM0LDcgQEAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CiAKIAlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZpbnRmLT5kZXYpOwotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZvcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCiAJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJaWYgKHJldHZhbCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCmluZGV4IGEzNTlkM2IuLmRjYjZkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYworKysgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKQEAgLTExNzEsNyArMTE3MSw3IEBACiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmthd2V0aF9uZXRkZXZfb3BzOwogCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBLQVdFVEhfVFhfVElNRU9VVDsKIAluZXRkZXYtPm10dSA9IGxlMTZfdG9fY3B1KGthd2V0aC0+Y29uZmlndXJhdGlvbi5zZWdtZW50X3NpemUpOwotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZvcHMpOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmb3BzOwogCiAJLyoga2F3ZXRoIGlzIHplcm9lZCBhcyBwYXJ0IG9mIGFsbG9jX25ldGRldiAqLwogCUlOSVRfREVMQVlFRF9XT1JLKCZrYXdldGgtPmxvd21lbV93b3JrLCBrYXdldGhfcmVzdWJtaXRfdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKaW5kZXggMDNlOGExNWQuLmY4NDA4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKIAogCW5ldC0+d2F0Y2hkb2dfdGltZW8gPSBQRUdBU1VTX1RYX1RJTUVPVVQ7CiAJbmV0LT5uZXRkZXZfb3BzID0gJnBlZ2FzdXNfbmV0ZGV2X29wczsKLQlTRVRfRVRIVE9PTF9PUFMobmV0LCAmb3BzKTsKKwluZXQtPmV0aHRvb2xfb3BzID0gJm9wczsKIAlwZWdhc3VzLT5taWkuZGV2ID0gbmV0OwogCXBlZ2FzdXMtPm1paS5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CiAJcGVnYXN1cy0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwppbmRleCBkYzRiZjA2Li5jZjYyZDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYworKysgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwpAQCAtNzYzLDcgKzc2MywxMiBAQAogCXtRTUlfRklYRURfSU5URigweDIzNTcsIDB4OTAwMCwgNCl9LAkvKiBUUC1MSU5LIE1BMjYwICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MWJjNywgMHgxMjAwLCA1KX0sCS8qIFRlbGl0IExFOTIwICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MWJjNywgMHgxMjAxLCAyKX0sCS8qIFRlbGl0IExFOTIwICovCi0Je1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDA1LCA2KX0sICAgIC8qIE9saXZldHRpIE9saWNhcmQgMjAwICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDAwLCA0KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMTAwICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDAxLCA0KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMTIwICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDAyLCA0KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMTQwICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDA0LCA2KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMTU1ICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDA1LCA2KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMjAwICovCisJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDBhLCA2KX0sCS8qIE9saXZldHRpIE9saWNhcmQgMTYwICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MGIzYywgMHhjMDBiLCA0KX0sCS8qIE9saXZldHRpIE9saWNhcmQgNTAwICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MWUyZCwgMHgwMDYwLCA0KX0sCS8qIENpbnRlcmlvbiBQTHh4ICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MWUyZCwgMHgwMDUzLCA0KX0sCS8qIENpbnRlcmlvbiBQSHh4LFBYeHggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jIGIvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMKaW5kZXggM2ZiZmIwOC4uMjU0MzE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMKQEAgLTYzMCwxMiArNjMwLDEwIEBACiAJaW50IHJldDsKIAl2b2lkICp0bXA7CiAKLQl0bXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXRtcCA9IGttZW1kdXAoZGF0YSwgc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KHRtcCwgZGF0YSwgc2l6ZSk7Ci0KIAlyZXQgPSB1c2JfY29udHJvbF9tc2codHAtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSh0cC0+dWRldiwgMCksCiAJCQkgICAgICAgUlRMODE1Ml9SRVFfU0VUX1JFR1MsIFJUTDgxNTJfUkVRVF9XUklURSwKIAkJCSAgICAgICB2YWx1ZSwgaW5kZXgsIHRtcCwgc2l6ZSwgNTAwKTsKQEAgLTM0NTIsNyArMzQ1MCw3IEBACiAJCQkgICAgICBORVRJRl9GX1RTTyB8IE5FVElGX0ZfRlJBR0xJU1QgfAogCQkJICAgICAgTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1RTTzY7CiAKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJm9wczsKIAluZXRpZl9zZXRfZ3NvX21heF9zaXplKG5ldGRldiwgUlRMX0xJTUlURURfVFNPX1NJWkUpOwogCiAJdHAtPm1paS5kZXYgPSBuZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcnRsODE1MC5jIGIvZHJpdmVycy9uZXQvdXNiL3J0bDgxNTAuYwppbmRleCBkYTJjNDU4Li42ZTg3ZTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcnRsODE1MC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9ydGw4MTUwLmMKQEAgLTg3OCw3ICs4NzgsNyBAQAogCWRldi0+bmV0ZGV2ID0gbmV0ZGV2OwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZydGw4MTUwX25ldGRldl9vcHM7CiAJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IFJUTDgxNTBfVFhfVElNRU9VVDsKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJm9wczsKIAlkZXYtPmludHJfaW50ZXJ2YWwgPSAxMDA7CS8qIDEwMG1zICovCiAKIAlpZiAoIWFsbG9jX2FsbF91cmJzKGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCA4YTg1MmI1Li43ZDlmODRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC0xNjQ2LDcgKzE2NDYsNyBAQAogCWRldi0+bmV0ZGV2X29wcyA9ICZ2aXJ0bmV0X25ldGRldjsKIAlkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9ISUdIRE1BOwogCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJnZpcnRuZXRfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmdmlydG5ldF9ldGh0b29sX29wczsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZ2ZGV2LT5kZXYpOwogCiAJLyogRG8gd2Ugc3VwcG9ydCAiaGFyZHdhcmUiIGNoZWNrc3Vtcz8gKi8KQEAgLTE3MjQsNiArMTcyNCwxMyBAQAogCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX05FVF9GX0NUUkxfVlEpKQogCQl2aS0+aGFzX2N2cSA9IHRydWU7CiAKKwlpZiAodmktPmFueV9oZWFkZXJfc2cpIHsKKwkJaWYgKHZpLT5tZXJnZWFibGVfcnhfYnVmcykKKwkJCWRldi0+bmVlZGVkX2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpOworCQllbHNlCisJCQlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpOworCX0KKwogCS8qIFVzZSBzaW5nbGUgdHgvcnggcXVldWUgcGFpciBhcyBkZWZhdWx0ICovCiAJdmktPmN1cnJfcXVldWVfcGFpcnMgPSAxOwogCXZpLT5tYXhfcXVldWVfcGFpcnMgPSBtYXhfcXVldWVfcGFpcnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYwppbmRleCA2MDBhYjU2Li40MGMxYzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMKQEAgLTQzMSw4ICs0MzEsOCBAQAogCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgYWRhcHRlci0+bGlua19zcGVlZCk7CiAJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCAtMSk7Ci0JCWVjbWQtPmR1cGxleCA9IC0xOworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTU3OSw3ICs1NzksNyBAQAogfQogCiBzdGF0aWMgaW50Ci12bXhuZXQzX2dldF9yc3NfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyICpwKQordm14bmV0M19nZXRfcnNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqcCwgdTggKmtleSkKIHsKIAlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgVVBUMV9SU1NDb25mICpyc3NDb25mID0gYWRhcHRlci0+cnNzX2NvbmY7CkBAIC01OTIsNyArNTkyLDcgQEAKIH0KIAogc3RhdGljIGludAotdm14bmV0M19zZXRfcnNzX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHUzMiAqcCkKK3ZteG5ldDNfc2V0X3JzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1MzIgKnAsIGNvbnN0IHU4ICprZXkpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYyOCwxMiArNjI4LDEyIEBACiAJLmdldF9yeG5mYyAgICAgICAgID0gdm14bmV0M19nZXRfcnhuZmMsCiAjaWZkZWYgVk1YTkVUM19SU1MKIAkuZ2V0X3J4ZmhfaW5kaXJfc2l6ZSA9IHZteG5ldDNfZ2V0X3Jzc19pbmRpcl9zaXplLAotCS5nZXRfcnhmaF9pbmRpciAgICA9IHZteG5ldDNfZ2V0X3Jzc19pbmRpciwKLQkuc2V0X3J4ZmhfaW5kaXIgICAgPSB2bXhuZXQzX3NldF9yc3NfaW5kaXIsCisJLmdldF9yeGZoICAgICAgICAgID0gdm14bmV0M19nZXRfcnNzLAorCS5zZXRfcnhmaCAgICAgICAgICA9IHZteG5ldDNfc2V0X3JzcywKICNlbmRpZgogfTsKIAogdm9pZCB2bXhuZXQzX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZ2bXhuZXQzX2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnZteG5ldDNfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92eGxhbi5jIGIvZHJpdmVycy9uZXQvdnhsYW4uYwppbmRleCA0ZGJiMmVkLi4xNjEwZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3Z4bGFuLmMKQEAgLTEyNyw2ICsxMjcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgIG5leHQ7CQkvKiB2eGxhbidzIHBlciBuYW1lc3BhY2UgbGlzdCAqLwogCXN0cnVjdCB2eGxhbl9zb2NrICp2bl9zb2NrOwkvKiBsaXN0ZW5pbmcgc29ja2V0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0CSAgKm5ldDsJCS8qIG5ldG5zIGZvciBwYWNrZXQgaS9vICovCiAJc3RydWN0IHZ4bGFuX3Jkc3QgZGVmYXVsdF9kc3Q7CS8qIGRlZmF1bHQgZGVzdGluYXRpb24gKi8KIAl1bmlvbiB2eGxhbl9hZGRyICBzYWRkcjsJLyogc291cmNlIGFkZHJlc3MgKi8KIAlfX2JlMTYJCSAgZHN0X3BvcnQ7CkBAIC0xMzQsNyArMTM1LDcgQEAKIAlfX3UxNgkJICBwb3J0X21heDsKIAlfX3U4CQkgIHRvczsJCS8qIFRPUyBvdmVycmlkZSAqLwogCV9fdTgJCSAgdHRsOwotCXUzMgkJICBmbGFnczsJLyogVlhMQU5fRl8qIGJlbG93ICovCisJdTMyCQkgIGZsYWdzOwkvKiBWWExBTl9GXyogaW4gdnhsYW4uaCAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0IHNvY2tfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaWdtcF9qb2luOwpAQCAtMTQ5LDEzICsxNTAsNiBAQAogCXN0cnVjdCBobGlzdF9oZWFkIGZkYl9oZWFkW0ZEQl9IQVNIX1NJWkVdOwogfTsKIAotI2RlZmluZSBWWExBTl9GX0xFQVJOCTB4MDEKLSNkZWZpbmUgVlhMQU5fRl9QUk9YWQkweDAyCi0jZGVmaW5lIFZYTEFOX0ZfUlNDCTB4MDQKLSNkZWZpbmUgVlhMQU5fRl9MMk1JU1MJMHgwOAotI2RlZmluZSBWWExBTl9GX0wzTUlTUwkweDEwCi0jZGVmaW5lIFZYTEFOX0ZfSVBWNgkweDIwIC8qIGludGVybmFsIGZsYWcgKi8KLQogLyogc2FsdCBmb3IgaGFzaCB0YWJsZSAqLwogc3RhdGljIHUzMiB2eGxhbl9zYWx0IF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnZ4bGFuX3dxOwpAQCAtNTcxLDYgKzU2NSw3IEBACiAJCQlnb3RvIG91dDsKIAl9CiAJc2tiX2dyb19wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB2eGxhbmhkcikpOyAvKiBwdWxsIHZ4bGFuIGhlYWRlciAqLworCXNrYl9ncm9fcG9zdHB1bGxfcmNzdW0oc2tiLCB2aCwgc2l6ZW9mKHN0cnVjdCB2eGxhbmhkcikpOwogCiAJb2ZmX2V0aCA9IHNrYl9ncm9fb2Zmc2V0KHNrYik7CiAJaGxlbiA9IG9mZl9ldGggKyBzaXplb2YoKmVoKTsKQEAgLTYwNSw2ICs2MDAsNyBAQAogCX0KIAogCXNrYl9ncm9fcHVsbChza2IsIHNpemVvZigqZWgpKTsgLyogcHVsbCBpbm5lciBldGggaGVhZGVyICovCisJc2tiX2dyb19wb3N0cHVsbF9yY3N1bShza2IsIGVoLCBzaXplb2YoKmVoKSk7CiAJcHAgPSBwdHlwZS0+Y2FsbGJhY2tzLmdyb19yZWNlaXZlKGhlYWQsIHNrYik7CiAKIG91dF91bmxvY2s6CkBAIC0xMjAzLDYgKzExOTksNyBAQAogCiAJcmVtb3RlX2lwID0gJnZ4bGFuLT5kZWZhdWx0X2RzdC5yZW1vdGVfaXA7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2Jfc2NydWJfcGFja2V0KHNrYiwgIW5ldF9lcSh2eGxhbi0+bmV0LCBkZXZfbmV0KHZ4bGFuLT5kZXYpKSk7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdnhsYW4tPmRldik7CiAKIAkvKiBJZ25vcmUgcGFja2V0IGxvb3BzIChhbmQgbXVsdGljYXN0IGVjaG8pICovCkBAIC0xNTk5LDE4ICsxNTk2LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2eGxhbl9zcmNfcG9ydCk7CiAKLXN0YXRpYyBpbnQgaGFuZGxlX29mZmxvYWRzKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICp2eGxhbl9oYW5kbGVfb2ZmbG9hZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgICBib29sIHVkcF9jc3VtKQogewotCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKLQkJaW50IGVyciA9IHNrYl91bmNsb25lKHNrYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQotCQkJcmV0dXJuIGVycjsKLQotCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlIHw9IFNLQl9HU09fVURQX1RVTk5FTDsKLQl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCi0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQotCXJldHVybiAwOworCWludCB0eXBlID0gdWRwX2NzdW0gPyBTS0JfR1NPX1VEUF9UVU5ORUxfQ1NVTSA6IFNLQl9HU09fVURQX1RVTk5FTDsKKwlyZXR1cm4gaXB0dW5uZWxfaGFuZGxlX29mZmxvYWRzKHNrYiwgdWRwX2NzdW0sIHR5cGUpOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKQEAgLTE2MTgsNyArMTYwOCw4IEBACiAJCQkgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX191OCBwcmlvLCBfX3U4IHR0bCwKLQkJCSAgIF9fYmUxNiBzcmNfcG9ydCwgX19iZTE2IGRzdF9wb3J0LCBfX2JlMzIgdm5pKQorCQkJICAgX19iZTE2IHNyY19wb3J0LCBfX2JlMTYgZHN0X3BvcnQsIF9fYmUzMiB2bmksCisJCQkgICBib29sIHhuZXQpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwNmg7CiAJc3RydWN0IHZ4bGFuaGRyICp2eGg7CkBAIC0xNjI2LDEyICsxNjE3LDExIEBACiAJaW50IG1pbl9oZWFkcm9vbTsKIAlpbnQgZXJyOwogCi0JaWYgKCFza2ItPmVuY2Fwc3VsYXRpb24pIHsKLQkJc2tiX3Jlc2V0X2lubmVyX2hlYWRlcnMoc2tiKTsKLQkJc2tiLT5lbmNhcHN1bGF0aW9uID0gMTsKLQl9CisJc2tiID0gdnhsYW5faGFuZGxlX29mZmxvYWRzKHNrYiwgIXVkcF9nZXRfbm9fY2hlY2s2X3R4KHZzLT5zb2NrLT5zaykpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlza2Jfc2NydWJfcGFja2V0KHNrYiwgZmFsc2UpOworCXNrYl9zY3J1Yl9wYWNrZXQoc2tiLCB4bmV0KTsKIAogCW1pbl9oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFKGRzdC0+ZGV2KSArIGRzdC0+aGVhZGVyX2xlbgogCQkJKyBWWExBTl9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKQpAQCAtMTY2MywyNyArMTY1MywxNCBAQAogCXVoLT5zb3VyY2UgPSBzcmNfcG9ydDsKIAogCXVoLT5sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JdWgtPmNoZWNrID0gMDsKIAogCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7CiAJSVBDQihza2IpLT5mbGFncyAmPSB+KElQU0tCX1hGUk1fVFVOTkVMX1NJWkUgfCBJUFNLQl9YRlJNX1RSQU5TRk9STUVEIHwKIAkJCSAgICAgIElQU0tCX1JFUk9VVEVEKTsKIAlza2JfZHN0X3NldChza2IsIGRzdCk7CiAKLQlpZiAoIXNrYl9pc19nc28oc2tiKSAmJiAhKGRzdC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBWNl9DU1VNKSkgewotCQlfX3dzdW0gY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCAwKTsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJdWgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgc2tiLT5sZW4sCi0JCQkJCSAgICBJUFBST1RPX1VEUCwgY3N1bSk7Ci0JCWlmICh1aC0+Y2hlY2sgPT0gMCkKLQkJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwotCX0gZWxzZSB7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKLQkJc2tiLT5jc3VtX3N0YXJ0ID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZDsKLQkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKLQkJdWgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsCi0JCQkJCSAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQLCAwKTsKLQl9CisJdWRwNl9zZXRfY3N1bSh1ZHBfZ2V0X25vX2NoZWNrNl90eCh2cy0+c29jay0+c2spLCBza2IsCisJCSAgICAgIHNhZGRyLCBkYWRkciwgc2tiLT5sZW4pOwogCiAJX19za2JfcHVzaChza2IsIHNpemVvZigqaXA2aCkpOwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwpAQCAtMTY5OSwxMCArMTY3Niw2IEBACiAJaXA2aC0+ZGFkZHIJICA9ICpkYWRkcjsKIAlpcDZoLT5zYWRkcgkgID0gKnNhZGRyOwogCi0JZXJyID0gaGFuZGxlX29mZmxvYWRzKHNrYik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWlwNnR1bm5lbF94bWl0KHNrYiwgZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MTEsMTcgKzE2ODQsMTYgQEAKIGludCB2eGxhbl94bWl0X3NrYihzdHJ1Y3QgdnhsYW5fc29jayAqdnMsCiAJCSAgIHN0cnVjdCBydGFibGUgKnJ0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBfX3U4IHRvcywgX191OCB0dGwsIF9fYmUxNiBkZiwKLQkJICAgX19iZTE2IHNyY19wb3J0LCBfX2JlMTYgZHN0X3BvcnQsIF9fYmUzMiB2bmkpCisJCSAgIF9fYmUxNiBzcmNfcG9ydCwgX19iZTE2IGRzdF9wb3J0LCBfX2JlMzIgdm5pLCBib29sIHhuZXQpCiB7CiAJc3RydWN0IHZ4bGFuaGRyICp2eGg7CiAJc3RydWN0IHVkcGhkciAqdWg7CiAJaW50IG1pbl9oZWFkcm9vbTsKIAlpbnQgZXJyOwogCi0JaWYgKCFza2ItPmVuY2Fwc3VsYXRpb24pIHsKLQkJc2tiX3Jlc2V0X2lubmVyX2hlYWRlcnMoc2tiKTsKLQkJc2tiLT5lbmNhcHN1bGF0aW9uID0gMTsKLQl9CisJc2tiID0gdnhsYW5faGFuZGxlX29mZmxvYWRzKHNrYiwgIXZzLT5zb2NrLT5zay0+c2tfbm9fY2hlY2tfdHgpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltaW5faGVhZHJvb20gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikgKyBydC0+ZHN0LmhlYWRlcl9sZW4KIAkJCSsgVlhMQU5fSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpCkBAIC0xNzUzLDE0ICsxNzI1LDEyIEBACiAJdWgtPnNvdXJjZSA9IHNyY19wb3J0OwogCiAJdWgtPmxlbiA9IGh0b25zKHNrYi0+bGVuKTsKLQl1aC0+Y2hlY2sgPSAwOwogCi0JZXJyID0gaGFuZGxlX29mZmxvYWRzKHNrYik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwl1ZHBfc2V0X2NzdW0odnMtPnNvY2stPnNrLT5za19ub19jaGVja190eCwgc2tiLAorCQkgICAgIHNyYywgZHN0LCBza2ItPmxlbik7CiAKIAlyZXR1cm4gaXB0dW5uZWxfeG1pdCh2cy0+c29jay0+c2ssIHJ0LCBza2IsIHNyYywgZHN0LCBJUFBST1RPX1VEUCwKLQkJCSAgICAgdG9zLCB0dGwsIGRmLCBmYWxzZSk7CisJCQkgICAgIHRvcywgdHRsLCBkZiwgeG5ldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2eGxhbl94bWl0X3NrYik7CiAKQEAgLTE4NTMsNyArMTgyMyw3IEBACiAJCWZsNC5kYWRkciA9IGRzdC0+c2luLnNpbl9hZGRyLnNfYWRkcjsKIAkJZmw0LnNhZGRyID0gdnhsYW4tPnNhZGRyLnNpbi5zaW5fYWRkci5zX2FkZHI7CiAKLQkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoZGV2KSwgJmZsNCk7CisJCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleSh2eGxhbi0+bmV0LCAmZmw0KTsKIAkJaWYgKElTX0VSUihydCkpIHsKIAkJCW5ldGRldl9kYmcoZGV2LCAibm8gcm91dGUgdG8gJXBJNFxuIiwKIAkJCQkgICAmZHN0LT5zaW4uc2luX2FkZHIuc19hZGRyKTsKQEAgLTE4NzQsNyArMTg0NCw3IEBACiAJCQlzdHJ1Y3QgdnhsYW5fZGV2ICpkc3RfdnhsYW47CiAKIAkJCWlwX3J0X3B1dChydCk7Ci0JCQlkc3RfdnhsYW4gPSB2eGxhbl9maW5kX3ZuaShkZXZfbmV0KGRldiksIHZuaSwgZHN0X3BvcnQpOworCQkJZHN0X3Z4bGFuID0gdnhsYW5fZmluZF92bmkodnhsYW4tPm5ldCwgdm5pLCBkc3RfcG9ydCk7CiAJCQlpZiAoIWRzdF92eGxhbikKIAkJCQlnb3RvIHR4X2Vycm9yOwogCQkJdnhsYW5fZW5jYXBfYnlwYXNzKHNrYiwgdnhsYW4sIGRzdF92eGxhbik7CkBAIC0xODg3LDcgKzE4NTcsOCBAQAogCQllcnIgPSB2eGxhbl94bWl0X3NrYih2eGxhbi0+dm5fc29jaywgcnQsIHNrYiwKIAkJCQkgICAgIGZsNC5zYWRkciwgZHN0LT5zaW4uc2luX2FkZHIuc19hZGRyLAogCQkJCSAgICAgdG9zLCB0dGwsIGRmLCBzcmNfcG9ydCwgZHN0X3BvcnQsCi0JCQkJICAgICBodG9ubCh2bmkgPDwgOCkpOworCQkJCSAgICAgaHRvbmwodm5pIDw8IDgpLAorCQkJCSAgICAgIW5ldF9lcSh2eGxhbi0+bmV0LCBkZXZfbmV0KHZ4bGFuLT5kZXYpKSk7CiAKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIHJ0X3R4X2Vycm9yOwpAQCAtMTkyNyw3ICsxODk4LDcgQEAKIAkJCXN0cnVjdCB2eGxhbl9kZXYgKmRzdF92eGxhbjsKIAogCQkJZHN0X3JlbGVhc2UobmRzdCk7Ci0JCQlkc3RfdnhsYW4gPSB2eGxhbl9maW5kX3ZuaShkZXZfbmV0KGRldiksIHZuaSwgZHN0X3BvcnQpOworCQkJZHN0X3Z4bGFuID0gdnhsYW5fZmluZF92bmkodnhsYW4tPm5ldCwgdm5pLCBkc3RfcG9ydCk7CiAJCQlpZiAoIWRzdF92eGxhbikKIAkJCQlnb3RvIHR4X2Vycm9yOwogCQkJdnhsYW5fZW5jYXBfYnlwYXNzKHNrYiwgdnhsYW4sIGRzdF92eGxhbik7CkBAIC0xOTM4LDcgKzE5MDksOCBAQAogCiAJCWVyciA9IHZ4bGFuNl94bWl0X3NrYih2eGxhbi0+dm5fc29jaywgbmRzdCwgc2tiLAogCQkJCSAgICAgIGRldiwgJmZsNi5zYWRkciwgJmZsNi5kYWRkciwgMCwgdHRsLAotCQkJCSAgICAgIHNyY19wb3J0LCBkc3RfcG9ydCwgaHRvbmwodm5pIDw8IDgpKTsKKwkJCQkgICAgICBzcmNfcG9ydCwgZHN0X3BvcnQsIGh0b25sKHZuaSA8PCA4KSwKKwkJCQkgICAgICAhbmV0X2VxKHZ4bGFuLT5uZXQsIGRldl9uZXQodnhsYW4tPmRldikpKTsKICNlbmRpZgogCX0KIApAQCAtMjA4Miw3ICsyMDU0LDcgQEAKIHN0YXRpYyBpbnQgdnhsYW5faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKGRldl9uZXQoZGV2KSwgdnhsYW5fbmV0X2lkKTsKKwlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKHZ4bGFuLT5uZXQsIHZ4bGFuX25ldF9pZCk7CiAJc3RydWN0IHZ4bGFuX3NvY2sgKnZzOwogCiAJZGV2LT50c3RhdHMgPSBuZXRkZXZfYWxsb2NfcGNwdV9zdGF0cyhzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyk7CkBAIC0yMDkwLDcgKzIwNjIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9jaygmdm4tPnNvY2tfbG9jayk7Ci0JdnMgPSB2eGxhbl9maW5kX3NvY2soZGV2X25ldChkZXYpLCB2eGxhbi0+ZHN0X3BvcnQpOworCXZzID0gdnhsYW5fZmluZF9zb2NrKHZ4bGFuLT5uZXQsIHZ4bGFuLT5kc3RfcG9ydCk7CiAJaWYgKHZzKSB7CiAJCS8qIElmIHdlIGhhdmUgYSBzb2NrZXQgd2l0aCBzYW1lIHBvcnQgYWxyZWFkeSwgcmV1c2UgaXQgKi8KIAkJYXRvbWljX2luYygmdnMtPnJlZmNudCk7CkBAIC0yMTcyLDggKzIxNDQsOCBAQAogLyogQ2xlYW51cCB0aW1lciBhbmQgZm9yd2FyZGluZyB0YWJsZSBvbiBzaHV0ZG93biAqLwogc3RhdGljIGludCB2eGxhbl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHZ4bGFuX25ldCAqdm4gPSBuZXRfZ2VuZXJpYyhkZXZfbmV0KGRldiksIHZ4bGFuX25ldF9pZCk7CiAJc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB2eGxhbl9uZXQgKnZuID0gbmV0X2dlbmVyaWModnhsYW4tPm5ldCwgdnhsYW5fbmV0X2lkKTsKIAlzdHJ1Y3QgdnhsYW5fc29jayAqdnMgPSB2eGxhbi0+dm5fc29jazsKIAogCWlmICh2cyAmJiB2eGxhbl9hZGRyX211bHRpY2FzdCgmdnhsYW4tPmRlZmF1bHRfZHN0LnJlbW90ZV9pcCkgJiYKQEAgLTIyMDIsNyArMjE3NCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyZGV2OwogCWludCBtYXhfbXR1OwogCi0JbG93ZXJkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoZGV2X25ldChkZXYpLCBkc3QtPnJlbW90ZV9pZmluZGV4KTsKKwlsb3dlcmRldiA9IF9fZGV2X2dldF9ieV9pbmRleCh2eGxhbi0+bmV0LCBkc3QtPnJlbW90ZV9pZmluZGV4KTsKIAlpZiAobG93ZXJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIGV0aF9jaGFuZ2VfbXR1KGRldiwgbmV3X210dSk7CiAKQEAgLTIyODUsNyArMjI1Nyw2IEBACiAKIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CiAJZGV2LT5mZWF0dXJlcwl8PSBORVRJRl9GX0xMVFg7Ci0JZGV2LT5mZWF0dXJlcwl8PSBORVRJRl9GX05FVE5TX0xPQ0FMOwogCWRldi0+ZmVhdHVyZXMJfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTTsKIAlkZXYtPmZlYXR1cmVzICAgfD0gTkVUSUZfRl9SWENTVU07CiAJZGV2LT5mZWF0dXJlcyAgIHw9IE5FVElGX0ZfR1NPX1NPRlRXQVJFOwpAQCAtMjQwMSw3ICsyMzcyLDcgQEAKICAqIGNvdWxkIGJlIHVzZWQgZm9yIGJvdGggSVB2NCBhbmQgSVB2NiBjb21tdW5pY2F0aW9ucywgYnV0CiAgKiB1c2VycyBtYXkgc2V0IGJpbmR2Nm9ubHk9MS4KICAqLwotc3RhdGljIHN0cnVjdCBzb2NrZXQgKmNyZWF0ZV92Nl9zb2NrKHN0cnVjdCBuZXQgKm5ldCwgX19iZTE2IHBvcnQpCitzdGF0aWMgc3RydWN0IHNvY2tldCAqY3JlYXRlX3Y2X3NvY2soc3RydWN0IG5ldCAqbmV0LCBfX2JlMTYgcG9ydCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwpAQCAtMjQzOCwxOCArMjQwOSwyNSBAQAogCiAJLyogRGlzYWJsZSBtdWx0aWNhc3QgbG9vcGJhY2sgKi8KIAlpbmV0X3NrKHNrKS0+bWNfbG9vcCA9IDA7CisKKwlpZiAoZmxhZ3MgJiBWWExBTl9GX1VEUF9aRVJPX0NTVU02X1RYKQorCQl1ZHBfc2V0X25vX2NoZWNrNl90eChzaywgdHJ1ZSk7CisKKwlpZiAoZmxhZ3MgJiBWWExBTl9GX1VEUF9aRVJPX0NTVU02X1JYKQorCQl1ZHBfc2V0X25vX2NoZWNrNl9yeChzaywgdHJ1ZSk7CisKIAlyZXR1cm4gc29jazsKIH0KIAogI2Vsc2UKIAotc3RhdGljIHN0cnVjdCBzb2NrZXQgKmNyZWF0ZV92Nl9zb2NrKHN0cnVjdCBuZXQgKm5ldCwgX19iZTE2IHBvcnQpCitzdGF0aWMgc3RydWN0IHNvY2tldCAqY3JlYXRlX3Y2X3NvY2soc3RydWN0IG5ldCAqbmV0LCBfX2JlMTYgcG9ydCwgdTMyIGZsYWdzKQogewogCQlyZXR1cm4gRVJSX1BUUigtRVBGTk9TVVBQT1JUKTsKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNvY2tldCAqY3JlYXRlX3Y0X3NvY2soc3RydWN0IG5ldCAqbmV0LCBfX2JlMTYgcG9ydCkKK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICpjcmVhdGVfdjRfc29jayhzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUxNiBwb3J0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC0yNDgyLDE4ICsyNDYwLDI0IEBACiAKIAkvKiBEaXNhYmxlIG11bHRpY2FzdCBsb29wYmFjayAqLwogCWluZXRfc2soc2spLT5tY19sb29wID0gMDsKKworCWlmICghKGZsYWdzICYgVlhMQU5fRl9VRFBfQ1NVTSkpCisJCXNvY2stPnNrLT5za19ub19jaGVja190eCA9IDE7CisKIAlyZXR1cm4gc29jazsKIH0KIAogLyogQ3JlYXRlIG5ldyBsaXN0ZW4gc29ja2V0IGlmIG5lZWRlZCAqLwogc3RhdGljIHN0cnVjdCB2eGxhbl9zb2NrICp2eGxhbl9zb2NrZXRfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgX19iZTE2IHBvcnQsCi0JCQkJCSAgICAgIHZ4bGFuX3Jjdl90ICpyY3YsIHZvaWQgKmRhdGEsIGJvb2wgaXB2NikKKwkJCQkJICAgICAgdnhsYW5fcmN2X3QgKnJjdiwgdm9pZCAqZGF0YSwKKwkJCQkJICAgICAgdTMyIGZsYWdzKQogewogCXN0cnVjdCB2eGxhbl9uZXQgKnZuID0gbmV0X2dlbmVyaWMobmV0LCB2eGxhbl9uZXRfaWQpOwogCXN0cnVjdCB2eGxhbl9zb2NrICp2czsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwogCXN0cnVjdCBzb2NrICpzazsKIAl1bnNpZ25lZCBpbnQgaDsKKwlib29sIGlwdjYgPSAhIShmbGFncyAmIFZYTEFOX0ZfSVBWNik7CiAKIAl2cyA9IGt6YWxsb2Moc2l6ZW9mKCp2cyksIEdGUF9LRVJORUwpOwogCWlmICghdnMpCkBAIC0yNTA1LDkgKzI0ODksOSBAQAogCUlOSVRfV09SSygmdnMtPmRlbF93b3JrLCB2eGxhbl9kZWxfd29yayk7CiAKIAlpZiAoaXB2NikKLQkJc29jayA9IGNyZWF0ZV92Nl9zb2NrKG5ldCwgcG9ydCk7CisJCXNvY2sgPSBjcmVhdGVfdjZfc29jayhuZXQsIHBvcnQsIGZsYWdzKTsKIAllbHNlCi0JCXNvY2sgPSBjcmVhdGVfdjRfc29jayhuZXQsIHBvcnQpOworCQlzb2NrID0gY3JlYXRlX3Y0X3NvY2sobmV0LCBwb3J0LCBmbGFncyk7CiAJaWYgKElTX0VSUihzb2NrKSkgewogCQlrZnJlZSh2cyk7CiAJCXJldHVybiBFUlJfQ0FTVChzb2NrKTsKQEAgLTI1NDUsMTIgKzI1MjksMTIgQEAKIAogc3RydWN0IHZ4bGFuX3NvY2sgKnZ4bGFuX3NvY2tfYWRkKHN0cnVjdCBuZXQgKm5ldCwgX19iZTE2IHBvcnQsCiAJCQkJICB2eGxhbl9yY3ZfdCAqcmN2LCB2b2lkICpkYXRhLAotCQkJCSAgYm9vbCBub19zaGFyZSwgYm9vbCBpcHY2KQorCQkJCSAgYm9vbCBub19zaGFyZSwgdTMyIGZsYWdzKQogewogCXN0cnVjdCB2eGxhbl9uZXQgKnZuID0gbmV0X2dlbmVyaWMobmV0LCB2eGxhbl9uZXRfaWQpOwogCXN0cnVjdCB2eGxhbl9zb2NrICp2czsKIAotCXZzID0gdnhsYW5fc29ja2V0X2NyZWF0ZShuZXQsIHBvcnQsIHJjdiwgZGF0YSwgaXB2Nik7CisJdnMgPSB2eGxhbl9zb2NrZXRfY3JlYXRlKG5ldCwgcG9ydCwgcmN2LCBkYXRhLCBmbGFncyk7CiAJaWYgKCFJU19FUlIodnMpKQogCQlyZXR1cm4gdnM7CiAKQEAgLTI1NzgsMTIgKzI1NjIsMTIgQEAKIHN0YXRpYyB2b2lkIHZ4bGFuX3NvY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZ4bGFuX2Rldiwgc29ja193b3JrKTsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHZ4bGFuLT5kZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IHZ4bGFuLT5uZXQ7CiAJc3RydWN0IHZ4bGFuX25ldCAqdm4gPSBuZXRfZ2VuZXJpYyhuZXQsIHZ4bGFuX25ldF9pZCk7CiAJX19iZTE2IHBvcnQgPSB2eGxhbi0+ZHN0X3BvcnQ7CiAJc3RydWN0IHZ4bGFuX3NvY2sgKm52czsKIAotCW52cyA9IHZ4bGFuX3NvY2tfYWRkKG5ldCwgcG9ydCwgdnhsYW5fcmN2LCBOVUxMLCBmYWxzZSwgdnhsYW4tPmZsYWdzICYgVlhMQU5fRl9JUFY2KTsKKwludnMgPSB2eGxhbl9zb2NrX2FkZChuZXQsIHBvcnQsIHZ4bGFuX3JjdiwgTlVMTCwgZmFsc2UsIHZ4bGFuLT5mbGFncyk7CiAJc3Bpbl9sb2NrKCZ2bi0+c29ja19sb2NrKTsKIAlpZiAoIUlTX0VSUihudnMpKQogCQl2eGxhbl92c19hZGRfZGV2KG52cywgdnhsYW4pOwpAQCAtMjYwNSw2ICsyNTg5LDggQEAKIAlpZiAoIWRhdGFbSUZMQV9WWExBTl9JRF0pCiAJCXJldHVybiAtRUlOVkFMOwogCisJdnhsYW4tPm5ldCA9IGRldl9uZXQoZGV2KTsKKwogCXZuaSA9IG5sYV9nZXRfdTMyKGRhdGFbSUZMQV9WWExBTl9JRF0pOwogCWRzdC0+cmVtb3RlX3ZuaSA9IHZuaTsKIApAQCAtMjcwNSwxMiArMjY5MSwyMyBAQAogCWlmIChkYXRhW0lGTEFfVlhMQU5fUE9SVF0pCiAJCXZ4bGFuLT5kc3RfcG9ydCA9IG5sYV9nZXRfYmUxNihkYXRhW0lGTEFfVlhMQU5fUE9SVF0pOwogCisJaWYgKGRhdGFbSUZMQV9WWExBTl9VRFBfQ1NVTV0gJiYgbmxhX2dldF91OChkYXRhW0lGTEFfVlhMQU5fVURQX0NTVU1dKSkKKwkJdnhsYW4tPmZsYWdzIHw9IFZYTEFOX0ZfVURQX0NTVU07CisKKwlpZiAoZGF0YVtJRkxBX1ZYTEFOX1VEUF9aRVJPX0NTVU02X1RYXSAmJgorCSAgICBubGFfZ2V0X3U4KGRhdGFbSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9UWF0pKQorCQl2eGxhbi0+ZmxhZ3MgfD0gVlhMQU5fRl9VRFBfWkVST19DU1VNNl9UWDsKKworCWlmIChkYXRhW0lGTEFfVlhMQU5fVURQX1pFUk9fQ1NVTTZfUlhdICYmCisJICAgIG5sYV9nZXRfdTgoZGF0YVtJRkxBX1ZYTEFOX1VEUF9aRVJPX0NTVU02X1JYXSkpCisJCXZ4bGFuLT5mbGFncyB8PSBWWExBTl9GX1VEUF9aRVJPX0NTVU02X1JYOworCiAJaWYgKHZ4bGFuX2ZpbmRfdm5pKG5ldCwgdm5pLCB2eGxhbi0+ZHN0X3BvcnQpKSB7CiAJCXByX2luZm8oImR1cGxpY2F0ZSBWTkkgJXVcbiIsIHZuaSk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCVNFVF9FVEhUT09MX09QUyhkZXYsICZ2eGxhbl9ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZ2eGxhbl9ldGh0b29sX29wczsKIAogCS8qIGNyZWF0ZSBhbiBmZGIgZW50cnkgZm9yIGEgdmFsaWQgZGVmYXVsdCBkZXN0aW5hdGlvbiAqLwogCWlmICghdnhsYW5fYWRkcl9hbnkoJnZ4bGFuLT5kZWZhdWx0X2RzdC5yZW1vdGVfaXApKSB7CkBAIC0yNzM5LDggKzI3MzYsOCBAQAogCiBzdGF0aWMgdm9pZCB2eGxhbl9kZWxsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3RydWN0IHZ4bGFuX25ldCAqdm4gPSBuZXRfZ2VuZXJpYyhkZXZfbmV0KGRldiksIHZ4bGFuX25ldF9pZCk7CiAJc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB2eGxhbl9uZXQgKnZuID0gbmV0X2dlbmVyaWModnhsYW4tPm5ldCwgdnhsYW5fbmV0X2lkKTsKIAogCXNwaW5fbG9jaygmdm4tPnNvY2tfbG9jayk7CiAJaWYgKCFobGlzdF91bmhhc2hlZCgmdnhsYW4tPmhsaXN0KSkKQEAgLTI3NjgsNyArMjc2NSwxMCBAQAogCQlubGFfdG90YWxfc2l6ZShzaXplb2YoX191MzIpKSArCS8qIElGTEFfVlhMQU5fQUdFSU5HICovCiAJCW5sYV90b3RhbF9zaXplKHNpemVvZihfX3UzMikpICsJLyogSUZMQV9WWExBTl9MSU1JVCAqLwogCQlubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdnhsYW5fcG9ydF9yYW5nZSkpICsKLQkJbmxhX3RvdGFsX3NpemUoc2l6ZW9mKF9fYmUxNikpKyAvKiBJRkxBX1ZYTEFOX1BPUlQgKi8KKwkJbmxhX3RvdGFsX3NpemUoc2l6ZW9mKF9fYmUxNikpICsgLyogSUZMQV9WWExBTl9QT1JUICovCisJCW5sYV90b3RhbF9zaXplKHNpemVvZihfX3U4KSkgKyAvKiBJRkxBX1ZYTEFOX1VEUF9DU1VNICovCisJCW5sYV90b3RhbF9zaXplKHNpemVvZihfX3U4KSkgKyAvKiBJRkxBX1ZYTEFOX1VEUF9aRVJPX0NTVU02X1RYICovCisJCW5sYV90b3RhbF9zaXplKHNpemVvZihfX3U4KSkgKyAvKiBJRkxBX1ZYTEFOX1VEUF9aRVJPX0NTVU02X1JYICovCiAJCTA7CiB9CiAKQEAgLTI4MjgsNyArMjgyOCwxMyBAQAogCQkJISEodnhsYW4tPmZsYWdzICYgVlhMQU5fRl9MM01JU1MpKSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfVlhMQU5fQUdFSU5HLCB2eGxhbi0+YWdlX2ludGVydmFsKSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfVlhMQU5fTElNSVQsIHZ4bGFuLT5hZGRybWF4KSB8fAotCSAgICBubGFfcHV0X2JlMTYoc2tiLCBJRkxBX1ZYTEFOX1BPUlQsIHZ4bGFuLT5kc3RfcG9ydCkpCisJICAgIG5sYV9wdXRfYmUxNihza2IsIElGTEFfVlhMQU5fUE9SVCwgdnhsYW4tPmRzdF9wb3J0KSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9WWExBTl9VRFBfQ1NVTSwKKwkJCSEhKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfVURQX0NTVU0pKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9UWCwKKwkJCSEhKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfVURQX1pFUk9fQ1NVTTZfVFgpKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWCwKKwkJCSEhKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfVURQX1pFUk9fQ1NVTTZfUlgpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlpZiAobmxhX3B1dChza2IsIElGTEFfVlhMQU5fUE9SVF9SQU5HRSwgc2l6ZW9mKHBvcnRzKSwgJnBvcnRzKSkKQEAgLTI5MDUsOCArMjkxMSwzMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX25ldF9leGl0IHZ4bGFuX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKG5ldCwgdnhsYW5fbmV0X2lkKTsKKwlzdHJ1Y3QgdnhsYW5fZGV2ICp2eGxhbiwgKm5leHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgKmF1eDsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwlydG5sX2xvY2soKTsKKwlmb3JfZWFjaF9uZXRkZXZfc2FmZShuZXQsIGRldiwgYXV4KQorCQlpZiAoZGV2LT5ydG5sX2xpbmtfb3BzID09ICZ2eGxhbl9saW5rX29wcykKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgJmxpc3QpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZ4bGFuLCBuZXh0LCAmdm4tPnZ4bGFuX2xpc3QsIG5leHQpIHsKKwkJLyogSWYgdnhsYW4tPmRldiBpcyBpbiB0aGUgc2FtZSBuZXRucywgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAorCQkgKiB0byB0aGUgbGlzdCBieSB0aGUgcHJldmlvdXMgbG9vcC4KKwkJICovCisJCWlmICghbmV0X2VxKGRldl9uZXQodnhsYW4tPmRldiksIG5ldCkpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZShkZXYsICZsaXN0KTsKKwl9CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZsaXN0KTsKKwlydG5sX3VubG9jaygpOworfQorCiBzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIHZ4bGFuX25ldF9vcHMgPSB7CiAJLmluaXQgPSB2eGxhbl9pbml0X25ldCwKKwkuZXhpdCA9IHZ4bGFuX2V4aXRfbmV0LAogCS5pZCAgID0gJnZ4bGFuX25ldF9pZCwKIAkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdnhsYW5fbmV0KSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwppbmRleCBiY2ZmZjBkLi45M2FjZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTY3OCw3ICs2NzksNiBAQAogZnN0X2NwdXJlc2V0KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQogewogCXVuc2lnbmVkIGNoYXIgaW50ZXJydXB0X2xpbmVfcmVnaXN0ZXI7Ci0JdW5zaWduZWQgbG9uZyBqID0gamlmZmllcyArIDE7CiAJdW5zaWduZWQgaW50IHJlZ3ZhbDsKIAogCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKQEAgLTY5NiwxNiArNjk2LDEyIEBACiAJCS8qCiAJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93IHRoZSA5MDU0IHRvIHJlc2V0IGl0c2VsZgogCQkgKi8KLQkJaiA9IGppZmZpZXMgKyAxOwotCQl3aGlsZSAoamlmZmllcyA8IGopCi0JCQkvKiBEbyBub3RoaW5nICovIDsKKwkJdXNsZWVwX3JhbmdlKDEwLCAyMCk7CiAJCW91dHcoMHgyNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKIAkJLyoKIAkJICogV2UgYXJlIGRlbGF5aW5nIGhlcmUgdG8gYWxsb3cgdGhlIDkwNTQgdG8gcmVsb2FkIGl0cyBlZXByb20KIAkJICovCi0JCWogPSBqaWZmaWVzICsgMTsKLQkJd2hpbGUgKGppZmZpZXMgPCBqKQotCQkJLyogRG8gbm90aGluZyAqLyA7CisJCXVzbGVlcF9yYW5nZSgxMCwgMjApOwogCQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CiAKIAkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZQpAQCAtODg2LDIwICs4ODIsMTggQEAKICAqICAgICAgUmVjZWl2ZSBhIGZyYW1lIHRocm91Z2ggdGhlIERNQQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWZzdF9yeF9kbWEoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIGRtYV9hZGRyX3Qgc2tiLAotCSAgIGRtYV9hZGRyX3QgbWVtLCBpbnQgbGVuKQorZnN0X3J4X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgZG1hX2FkZHJfdCBkbWEsIHUzMiBtZW0sIGludCBsZW4pCiB7CiAJLyoKIAkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgRE1BIGFuZCBzdGFydCBpdAogCSAqLwogCi0JZGJnKERCR19SWCwgIkluIGZzdF9yeF9kbWEgJWx4ICVseCAlZFxuIiwKLQkgICAgKHVuc2lnbmVkIGxvbmcpIHNrYiwgKHVuc2lnbmVkIGxvbmcpIG1lbSwgbGVuKTsKKwlkYmcoREJHX1JYLCAiSW4gZnN0X3J4X2RtYSAleCAleCAlZFxuIiwgKHUzMilkbWEsIG1lbSwgbGVuKTsKIAlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MpIHsKIAkJZGJnKERCR19BU1MsICJJbiBmc3RfcnhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVzc1xuIik7CiAJfQogCi0Jb3V0bChza2IsIGNhcmQtPnBjaV9jb25mICsgRE1BUEFEUjApOwkvKiBDb3B5IHRvIGhlcmUgKi8KKwlvdXRsKGRtYSwgY2FyZC0+cGNpX2NvbmYgKyBETUFQQURSMCk7CS8qIENvcHkgdG8gaGVyZSAqLwogCW91dGwobWVtLCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIwKTsJLyogZnJvbSBoZXJlICovCiAJb3V0bChsZW4sIGNhcmQtPnBjaV9jb25mICsgRE1BU0laMCk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLwogCW91dGwoMHgwMDAwMDAwMGMsIGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMCk7CS8qIEluIHRoaXMgZGlyZWN0aW9uICovCkBAIC05MTUsMjAgKzkwOSwxOSBAQAogICogICAgICBTZW5kIGEgZnJhbWUgdGhyb3VnaCB0aGUgRE1BCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotZnN0X3R4X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgdW5zaWduZWQgY2hhciAqc2tiLAotCSAgIHVuc2lnbmVkIGNoYXIgKm1lbSwgaW50IGxlbikKK2ZzdF90eF9kbWEoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIGRtYV9hZGRyX3QgZG1hLCB1MzIgbWVtLCBpbnQgbGVuKQogewogCS8qCiAJICogVGhpcyByb3V0aW5lIHdpbGwgc2V0dXAgdGhlIERNQSBhbmQgc3RhcnQgaXQuCiAJICovCiAKLQlkYmcoREJHX1RYLCAiSW4gZnN0X3R4X2RtYSAlcCAlcCAlZFxuIiwgc2tiLCBtZW0sIGxlbik7CisJZGJnKERCR19UWCwgIkluIGZzdF90eF9kbWEgJXggJXggJWRcbiIsICh1MzIpZG1hLCBtZW0sIGxlbik7CiAJaWYgKGNhcmQtPmRtYXR4X2luX3Byb2dyZXNzKSB7CiAJCWRiZyhEQkdfQVNTLCAiSW4gZnN0X3R4X2RtYSB3aGlsZSBkbWEgaW4gcHJvZ3Jlc3NcbiIpOwogCX0KIAotCW91dGwoKHVuc2lnbmVkIGxvbmcpIHNrYiwgY2FyZC0+cGNpX2NvbmYgKyBETUFQQURSMSk7CS8qIENvcHkgZnJvbSBoZXJlICovCi0Jb3V0bCgodW5zaWduZWQgbG9uZykgbWVtLCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIxKTsJLyogdG8gaGVyZSAqLworCW91dGwoZG1hLCBjYXJkLT5wY2lfY29uZiArIERNQVBBRFIxKTsJLyogQ29weSBmcm9tIGhlcmUgKi8KKwlvdXRsKG1lbSwgY2FyZC0+cGNpX2NvbmYgKyBETUFMQURSMSk7CS8qIHRvIGhlcmUgKi8KIAlvdXRsKGxlbiwgY2FyZC0+cGNpX2NvbmYgKyBETUFTSVoxKTsJLyogZm9yIHRoaXMgbGVuZ3RoICovCiAJb3V0bCgweDAwMDAwMDAwNCwgY2FyZC0+cGNpX2NvbmYgKyBETUFEUFIxKTsJLyogSW4gdGhpcyBkaXJlY3Rpb24gKi8KIApAQCAtMTQwNSw5ICsxMzk4LDcgQEAKIAkJCQkJY2FyZC0+ZG1hX2xlbl90eCA9IHNrYi0+bGVuOwogCQkJCQljYXJkLT5kbWFfdHhwb3MgPSBwb3J0LT50eHBvczsKIAkJCQkJZnN0X3R4X2RtYShjYXJkLAotCQkJCQkJICAgKGNoYXIgKikgY2FyZC0+Ci0JCQkJCQkgICB0eF9kbWFfaGFuZGxlX2NhcmQsCi0JCQkJCQkgICAoY2hhciAqKQorCQkJCQkJICAgY2FyZC0+dHhfZG1hX2hhbmRsZV9jYXJkLAogCQkJCQkJICAgQlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KIAkJCQkJCQkgICAgICBbcG9ydC0+dHhwb3NdWzBdKSwKIAkJCQkJCSAgIHNrYi0+bGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCmluZGV4IGRlM2JiZjQuLmNkZDQ1ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwpAQCAtMTMyMiwxMCArMTMyMiw2IEBACiAKIHN0YXRpYyBpbnQgc2RsYV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewotCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7Ci0KLQlmbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKaW5kZXggNGEwMWU1Yy4uNGM0MTc5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogCQlnb3RvIGVycm9yX2JhZF9tYWpvcjsKIAl9CiAJcmVzdWx0ID0gMDsKLQlpZiAobWlub3IgPCBJMjQwME1fSERJdl9NSU5PUl8yICYmIG1pbm9yID4gSTI0MDBNX0hESXZfTUlOT1IpCisJaWYgKG1pbm9yID4gSTI0MDBNX0hESXZfTUlOT1JfMiB8fCBtaW5vciA8IEkyNDAwTV9IREl2X01JTk9SKQogCQlkZXZfd2FybihkZXYsICJ1bnRlc3RlZCBtaW5vciBmdyB2ZXJzaW9uICV1LiV1LiV1XG4iLAogCQkJIG1ham9yLCBtaW5vciwgYnJhbmNoKTsKIAkvKiBZZXMsIHdlIGlnbm9yZSB0aGUgYnJhbmNoIC0tIHdlIGRvbid0IGhhdmUgdG8gdHJhY2sgaXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYwppbmRleCA5YzM0ZDJmLi45Yzc4MDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jCkBAIC01MDAsMjYgKzUwMCwyMyBAQAogICovCiBpbnQgaTI0MDBtX3ByZV9yZXNldChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCiB7Ci0JaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CiAKIAlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CiAJZF9wcmludGYoMSwgZGV2LCAicHJlLXJlc2V0IHNodXQgZG93blxuIik7CiAKLQlyZXN1bHQgPSAwOwogCW11dGV4X2xvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CiAJaWYgKGkyNDAwbS0+dXBkb3duKSB7CiAJCW5ldGlmX3R4X2Rpc2FibGUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CiAJCV9faTI0MDBtX2Rldl9zdG9wKGkyNDAwbSk7Ci0JCXJlc3VsdCA9IDA7CiAJCS8qIGRvd24ndCBzZXQgdXBkb3duIHRvIHplcm8gLS0gdGhpcyB3YXkKIAkJICogcG9zdF9yZXNldCBjYW4gcmVzdG9yZSBwcm9wZXJseSAqLwogCX0KIAltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CiAJaWYgKGkyNDAwbS0+YnVzX3JlbGVhc2UpCiAJCWkyNDAwbS0+YnVzX3JlbGVhc2UoaTI0MDBtKTsKLQlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAwXG4iLCBpMjQwMG0pOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3ByZV9yZXNldCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKaW5kZXggOTliM2JmYS4uZDQ4Nzc2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKQEAgLTM2NSwxNSArMzY1LDE1IEBACiBzdGF0aWMgaW50IGF0NzZfdXNiZGZ1X2Rvd25sb2FkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCAqYnVmLCB1MzIgc2l6ZSwKIAkJCQlpbnQgbWFuaWZlc3Rfc3luY190aW1lb3V0KQogewotCXU4ICpibG9jazsKLQlzdHJ1Y3QgZGZ1X3N0YXR1cyBkZnVfc3RhdF9idWY7CiAJaW50IHJldCA9IDA7CiAJaW50IG5lZWRfZGZ1X3N0YXRlID0gMTsKIAlpbnQgaXNfZG9uZSA9IDA7Ci0JdTggZGZ1X3N0YXRlID0gMDsKIAl1MzIgZGZ1X3RpbWVvdXQgPSAwOwogCWludCBic2l6ZSA9IDA7CiAJaW50IGJsb2Nrbm8gPSAwOworCXN0cnVjdCBkZnVfc3RhdHVzICpkZnVfc3RhdF9idWYgPSBOVUxMOworCXU4ICpkZnVfc3RhdGUgPSBOVUxMOworCXU4ICpibG9jayA9IE5VTEw7CiAKIAlhdDc2X2RiZyhEQkdfREZVLCAiJXMoICVwLCAldSwgJWQpIiwgX19mdW5jX18sIGJ1Ziwgc2l6ZSwKIAkJIG1hbmlmZXN0X3N5bmNfdGltZW91dCk7CkBAIC0zODMsMTMgKzM4MywyOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlkZnVfc3RhdF9idWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGZ1X3N0YXR1cyksIEdGUF9LRVJORUwpOworCWlmICghZGZ1X3N0YXRfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKIAlibG9jayA9IGttYWxsb2MoRldfQkxPQ0tfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFibG9jaykKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFibG9jaykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGZ1X3N0YXRlID0ga21hbGxvYyhzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRmdV9zdGF0ZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCSpkZnVfc3RhdGUgPSAwOwogCiAJZG8gewogCQlpZiAobmVlZF9kZnVfc3RhdGUpIHsKLQkJCXJldCA9IGF0NzZfZGZ1X2dldF9zdGF0ZSh1ZGV2LCAmZGZ1X3N0YXRlKTsKKwkJCXJldCA9IGF0NzZfZGZ1X2dldF9zdGF0ZSh1ZGV2LCBkZnVfc3RhdGUpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCiAJCQkJCSJjYW5ub3QgZ2V0IERGVSBzdGF0ZTogJWRcbiIsIHJldCk7CkBAIC0zOTgsMTMgKzQxMywxMyBAQAogCQkJbmVlZF9kZnVfc3RhdGUgPSAwOwogCQl9CiAKLQkJc3dpdGNoIChkZnVfc3RhdGUpIHsKKwkJc3dpdGNoICgqZGZ1X3N0YXRlKSB7CiAJCWNhc2UgU1RBVEVfREZVX0RPV05MT0FEX1NZTkM6CiAJCQlhdDc2X2RiZyhEQkdfREZVLCAiU1RBVEVfREZVX0RPV05MT0FEX1NZTkMiKTsKLQkJCXJldCA9IGF0NzZfZGZ1X2dldF9zdGF0dXModWRldiwgJmRmdV9zdGF0X2J1Zik7CisJCQlyZXQgPSBhdDc2X2RmdV9nZXRfc3RhdHVzKHVkZXYsIGRmdV9zdGF0X2J1Zik7CiAJCQlpZiAocmV0ID49IDApIHsKLQkJCQlkZnVfc3RhdGUgPSBkZnVfc3RhdF9idWYuc3RhdGU7Ci0JCQkJZGZ1X3RpbWVvdXQgPSBhdDc2X2dldF90aW1lb3V0KCZkZnVfc3RhdF9idWYpOworCQkJCSpkZnVfc3RhdGUgPSBkZnVfc3RhdF9idWYtPnN0YXRlOworCQkJCWRmdV90aW1lb3V0ID0gYXQ3Nl9nZXRfdGltZW91dChkZnVfc3RhdF9idWYpOwogCQkJCW5lZWRfZGZ1X3N0YXRlID0gMDsKIAkJCX0gZWxzZQogCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKQEAgLTQ0NywxMiArNDYyLDEyIEBACiAJCWNhc2UgU1RBVEVfREZVX01BTklGRVNUX1NZTkM6CiAJCQlhdDc2X2RiZyhEQkdfREZVLCAiU1RBVEVfREZVX01BTklGRVNUX1NZTkMiKTsKIAotCQkJcmV0ID0gYXQ3Nl9kZnVfZ2V0X3N0YXR1cyh1ZGV2LCAmZGZ1X3N0YXRfYnVmKTsKKwkJCXJldCA9IGF0NzZfZGZ1X2dldF9zdGF0dXModWRldiwgZGZ1X3N0YXRfYnVmKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWJyZWFrOwogCi0JCQlkZnVfc3RhdGUgPSBkZnVfc3RhdF9idWYuc3RhdGU7Ci0JCQlkZnVfdGltZW91dCA9IGF0NzZfZ2V0X3RpbWVvdXQoJmRmdV9zdGF0X2J1Zik7CisJCQkqZGZ1X3N0YXRlID0gZGZ1X3N0YXRfYnVmLT5zdGF0ZTsKKwkJCWRmdV90aW1lb3V0ID0gYXQ3Nl9nZXRfdGltZW91dChkZnVfc3RhdF9idWYpOwogCQkJbmVlZF9kZnVfc3RhdGUgPSAwOwogCiAJCQkvKiBvdmVycmlkZSB0aGUgdGltZW91dCBmcm9tIHRoZSBzdGF0dXMgcmVzcG9uc2UsCkBAIC00ODQsMTQgKzQ5OSwxNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWF0NzZfZGJnKERCR19ERlUsICJERlUgVU5LTk9XTiBTVEFURSAoJWQpIiwgZGZ1X3N0YXRlKTsKKwkJCWF0NzZfZGJnKERCR19ERlUsICJERlUgVU5LTk9XTiBTVEFURSAoJWQpIiwgKmRmdV9zdGF0ZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlICghaXNfZG9uZSAmJiAocmV0ID49IDApKTsKIAogZXhpdDoKKwlrZnJlZShkZnVfc3RhdGUpOwogCWtmcmVlKGJsb2NrKTsKKwlrZnJlZShkZnVfc3RhdF9idWYpOworCiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSAwOwogCkBAIC0xMjc3LDYgKzEyOTUsNyBAQAogCQkJZGV2X2VycigmdWRldi0+ZGV2LAogCQkJCSJsb2FkaW5nICVkdGggZmlybXdhcmUgYmxvY2sgZmFpbGVkOiAlZFxuIiwKIAkJCQlibG9ja25vLCByZXQpOworCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCQlidWYgKz0gYnNpemU7CkBAIC0xNDEwLDYgKzE0MjksOCBAQAogCS8qIHJlbW92ZSBCU1NJRCBmcm9tIHByZXZpb3VzIHJ1biAqLwogCW1lbXNldChwcml2LT5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCisJcHJpdi0+c2Nhbm5pbmcgPSBmYWxzZTsKKwogCWlmIChhdDc2X3NldF9yYWRpbyhwcml2LCAxKSA9PSAxKQogCQlhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfUkFESU9fT04pOwogCkBAIC0xNDgzLDYgKzE1MDQsNTIgQEAKIAltdXRleF91bmxvY2soJnByaXYtPm10eCk7CiB9CiAKKy8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIG1ha2Ugc2NhbiB3b3JraW5nOgorICogY3VycmVudGx5IG1hYzgwMjExIGRvZXMgbm90IHByb2Nlc3MgZnJhbWVzIHdpdGggbm8gZnJlcXVlbmN5CisgKiBpbmZvcm1hdGlvbi4KKyAqIEhvd2V2ZXIgZHVyaW5nIHNjYW4gdGhlIEhXIHBlcmZvcm1zIGEgc3dlZXAgYnkgaXRzZWxmLCBhbmQgd2UKKyAqIGFyZSB1bmFibGUgdG8ga25vdyB3aGVyZSB0aGUgcmFkaW8gaXMgYWN0dWFsbHkgdHVuZWQuCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGRvIGl0cyBiZXN0IHRvIGd1ZXNzIHRoaXMgaW5mb3JtYXRpb24uLgorICogRHVyaW5nIHNjYW4sIElmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGEgYmVhY29uIG9yIGEgcHJvYmUgcmVzcG9uc2UsCisgKiB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgZnJvbSBpdC4KKyAqIFdoZW4gbm90IHNjYW5uaW5nLCBmb3Igb3RoZXIgZnJhbWVzLCBvciBpZiBpdCBoYXBwZW5zIHRoYXQgZm9yCisgKiB3aGF0ZXZlciByZWFzb24gd2UgZmFpbCB0byBwYXJzZSBiZWFjb25zIGFuZCBwcm9iZSByZXNwb25zZXMsIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByaXYtPmNoYW5uZWwgaW5mb3JtYXRpb24sIHRoYXQgc2hvdWxkIGJlIGNvcnJlY3QKKyAqIGF0IGxlYXN0IHdoZW4gd2UgYXJlIG5vdCBzY2FubmluZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9ndWVzc19mcmVxKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJc2l6ZV90IGVsX29mZjsKKwljb25zdCB1OCAqZWw7CisJaW50IGNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCWludCBsZW4gPSBwcml2LT5yeF9za2ItPmxlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilwcml2LT5yeF9za2ItPmRhdGE7CisKKwlpZiAoIXByaXYtPnNjYW5uaW5nKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAobGVuIDwgMjQpCisJCWdvdG8gZXhpdDsKKworCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCWVsX29mZiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5wcm9iZV9yZXNwLnZhcmlhYmxlKTsKKwkJZWwgPSAoKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWhkciktPnUucHJvYmVfcmVzcC52YXJpYWJsZTsKKwl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQllbF9vZmYgPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKKwkJZWwgPSAoKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWhkciktPnUuYmVhY29uLnZhcmlhYmxlOworCX0gZWxzZSB7CisJCWdvdG8gZXhpdDsKKwl9CisJbGVuIC09IGVsX29mZjsKKworCWVsID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9EU19QQVJBTVMsIGVsLCBsZW4pOworCWlmIChlbCAmJiBlbFsxXSA+IDApCisJCWNoYW5uZWwgPSBlbFsyXTsKKworZXhpdDoKKwlyZXR1cm4gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsIElFRUU4MDIxMV9CQU5EXzJHSFopOworfQorCiBzdGF0aWMgdm9pZCBhdDc2X3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKXBhcmFtOwpAQCAtMTUyMyw2ICsxNTkwLDggQEAKIAlyeF9zdGF0dXMuc2lnbmFsID0gYnVmLT5yc3NpOwogCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOwogCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQ7CisJcnhfc3RhdHVzLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOworCXJ4X3N0YXR1cy5mcmVxID0gYXQ3Nl9ndWVzc19mcmVxKHByaXYpOwogCiAJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiY2FsbGluZyBpZWVlODAyMTFfcnhfaXJxc2FmZSgpOiAlZC8lZCIsCiAJCSBwcml2LT5yeF9za2ItPmxlbiwgcHJpdi0+cnhfc2tiLT5kYXRhX2xlbik7CkBAIC0xODc1LDYgKzE5NDQsOCBAQAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkKIAkJYXQ3Nl9qb2luKHByaXYpOwogCisJcHJpdi0+c2Nhbm5pbmcgPSBmYWxzZTsKKwogCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKIAogCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChwcml2LT5odywgZmFsc2UpOwpAQCAtMTkyOSw2ICsyMDAwLDcgQEAKIAkJZ290byBleGl0OwogCX0KIAorCXByaXYtPnNjYW5uaW5nID0gdHJ1ZTsKIAlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LCAmcHJpdi0+ZHdvcmtfaHdfc2NhbiwKIAkJCQkgICAgIFNDQU5fUE9MTF9JTlRFUlZBTCk7CiAKQEAgLTIwMjAsNiArMjA5Miw0NCBAQAogCWllZWU4MDIxMV9xdWV1ZV93b3JrKGh3LCAmcHJpdi0+d29ya19zZXRfcHJvbWlzYyk7CiB9CiAKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfd2VwKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1pYl9tYWNfd2VwICptaWJfZGF0YSA9ICZwcml2LT5taWJfYnVmLmRhdGEud2VwX21pYjsKKworCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfV0VQOworCXByaXYtPm1pYl9idWYuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWliX21hY193ZXApOworCXByaXYtPm1pYl9idWYuaW5kZXggPSAwOworCisJbWVtc2V0KG1pYl9kYXRhLCAwLCBzaXplb2YoKm1pYl9kYXRhKSk7CisKKwlpZiAocHJpdi0+d2VwX2VuYWJsZWQpIHsKKwkJaWYgKHByaXYtPndlcF9rZXlzX2xlbltwcml2LT53ZXBfa2V5X2lkXSA+IFdFUF9TTUFMTF9LRVlfTEVOKQorCQkJbWliX2RhdGEtPmVuY3J5cHRpb25fbGV2ZWwgPSAyOworCQllbHNlCisJCQltaWJfZGF0YS0+ZW5jcnlwdGlvbl9sZXZlbCA9IDE7CisKKwkJLyogYWx3YXlzIGV4Y2x1ZGUgdW5lbmNyeXB0ZWQgaWYgV0VQIGlzIGFjdGl2ZSAqLworCQltaWJfZGF0YS0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CisJfSBlbHNlIHsKKwkJbWliX2RhdGEtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAwOworCQltaWJfZGF0YS0+ZW5jcnlwdGlvbl9sZXZlbCA9IDA7CisJfQorCisJbWliX2RhdGEtPnByaXZhY3lfaW52b2tlZCA9IHByaXYtPndlcF9lbmFibGVkOworCW1pYl9kYXRhLT53ZXBfZGVmYXVsdF9rZXlfaWQgPSBwcml2LT53ZXBfa2V5X2lkOworCW1lbWNweShtaWJfZGF0YS0+d2VwX2RlZmF1bHRfa2V5dmFsdWUsIHByaXYtPndlcF9rZXlzLAorCSAgICAgICBzaXplb2YocHJpdi0+d2VwX2tleXMpKTsKKworCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisKKwlpZiAocmV0IDwgMCkKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgInNldF9taWIgKHdlcCkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgYXQ3Nl9zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKIAkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCkBAIC0yMDYyLDcgKzIxNzIsNyBAQAogCQkJcHJpdi0+d2VwX2VuYWJsZWQgPSAxOwogCX0KIAotCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7CisJYXQ3Nl9zZXRfd2VwKHByaXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwogCkBAIC0yMzMwLDE2ICsyNDQwLDIyIEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJaW50IG9wX21vZGU7CiAJaW50IG5lZWRfZXh0X2Z3ID0gMDsKLQlzdHJ1Y3QgbWliX2Z3X3ZlcnNpb24gZnd2OworCXN0cnVjdCBtaWJfZndfdmVyc2lvbiAqZnd2ID0gTlVMTDsKIAlpbnQgYm9hcmRfdHlwZSA9IChpbnQpaWQtPmRyaXZlcl9pbmZvOwogCiAJdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CiAKKwlmd3YgPSBrbWFsbG9jKHNpemVvZigqZnd2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd3YpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwogCS8qIExvYWQgZmlybXdhcmUgaW50byBrZXJuZWwgbWVtb3J5ICovCiAJZndlID0gYXQ3Nl9sb2FkX2Zpcm13YXJlKHVkZXYsIGJvYXJkX3R5cGUpOwogCWlmICghZndlKSB7CiAJCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAlvcF9tb2RlID0gYXQ3Nl9nZXRfb3BfbW9kZSh1ZGV2KTsKQEAgLTIzNTMsNyArMjQ2OSw3IEBACiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAogCQkJImNhbm5vdCBoYW5kbGUgYSBkZXZpY2UgaW4gSFdfQ09ORklHX01PREVcbiIpOwogCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAob3BfbW9kZSAhPSBPUE1PREVfTk9STUFMX05JQ19XSVRIX0ZMQVNICkBAIC0yMzY2LDEwICsyNDgyLDEwIEBACiAJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKIAkJCQkiZXJyb3IgJWQgZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIsCiAJCQkJcmV0KTsKLQkJCWdvdG8gZXJyb3I7CisJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJdXNiX3B1dF9kZXYodWRldik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAkvKiBJbnRlcm5hbCBmaXJtd2FyZSBhbHJlYWR5IGluc2lkZSB0aGUgZGV2aWNlLiAgR2V0IGZpcm13YXJlCkBAIC0yMzgyLDggKzI0OTgsOCBAQAogCSAqIHF1ZXJ5IHRoZSBkZXZpY2UgZm9yIHRoZSBmdyB2ZXJzaW9uICovCiAJaWYgKChmd2UtPmZ3X3ZlcnNpb24ubWFqb3IgPiAwIHx8IGZ3ZS0+ZndfdmVyc2lvbi5taW5vciA+PSAxMDApCiAJICAgIHx8IChvcF9tb2RlID09IE9QTU9ERV9OT1JNQUxfTklDX1dJVEhfRkxBU0gpKSB7Ci0JCXJldCA9IGF0NzZfZ2V0X21pYih1ZGV2LCBNSUJfRldfVkVSU0lPTiwgJmZ3diwgc2l6ZW9mKGZ3dikpOwotCQlpZiAocmV0IDwgMCB8fCAoZnd2Lm1ham9yIHwgZnd2Lm1pbm9yKSA9PSAwKQorCQlyZXQgPSBhdDc2X2dldF9taWIodWRldiwgTUlCX0ZXX1ZFUlNJT04sIGZ3diwgc2l6ZW9mKCpmd3YpKTsKKwkJaWYgKHJldCA8IDAgfHwgKGZ3di0+bWFqb3IgfCBmd3YtPm1pbm9yKSA9PSAwKQogCQkJbmVlZF9leHRfZncgPSAxOwogCX0gZWxzZQogCQkvKiBObyB3YXkgdG8gY2hlY2sgZmlybXdhcmUgdmVyc2lvbiwgcmVsb2FkIHRvIGJlIHN1cmUgKi8KQEAgLTIzOTQsMzcgKzI1MTAsMzcgQEAKIAkJCSAgICJkb3dubG9hZGluZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CiAKIAkJcmV0ID0gYXQ3Nl9sb2FkX2V4dGVybmFsX2Z3KHVkZXYsIGZ3ZSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXhpdDsKIAogCQkvKiBSZS1jaGVjayBmaXJtd2FyZSB2ZXJzaW9uICovCi0JCXJldCA9IGF0NzZfZ2V0X21pYih1ZGV2LCBNSUJfRldfVkVSU0lPTiwgJmZ3diwgc2l6ZW9mKGZ3dikpOworCQlyZXQgPSBhdDc2X2dldF9taWIodWRldiwgTUlCX0ZXX1ZFUlNJT04sIGZ3diwgc2l6ZW9mKCpmd3YpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAogCQkJCSJlcnJvciAlZCBnZXR0aW5nIGZpcm13YXJlIHZlcnNpb25cbiIsIHJldCk7Ci0JCQlnb3RvIGVycm9yOworCQkJZ290byBleGl0OwogCQl9CiAJfQogCiAJcHJpdiA9IGF0NzZfYWxsb2NfbmV3X2RldmljZSh1ZGV2KTsKIAlpZiAoIXByaXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBleGl0OwogCX0KIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBwcml2KTsKIAotCW1lbWNweSgmcHJpdi0+ZndfdmVyc2lvbiwgJmZ3diwgc2l6ZW9mKHN0cnVjdCBtaWJfZndfdmVyc2lvbikpOworCW1lbWNweSgmcHJpdi0+ZndfdmVyc2lvbiwgZnd2LCBzaXplb2Yoc3RydWN0IG1pYl9md192ZXJzaW9uKSk7CiAJcHJpdi0+Ym9hcmRfdHlwZSA9IGJvYXJkX3R5cGU7CiAKIAlyZXQgPSBhdDc2X2luaXRfbmV3X2RldmljZShwcml2LCBpbnRlcmZhY2UpOwogCWlmIChyZXQgPCAwKQogCQlhdDc2X2RlbGV0ZV9kZXZpY2UocHJpdik7CiAKLQlyZXR1cm4gcmV0OwotCi1lcnJvcjoKLQl1c2JfcHV0X2Rldih1ZGV2KTsKK2V4aXQ6CisJa2ZyZWUoZnd2KTsKKwlpZiAocmV0IDwgMCkKKwkJdXNiX3B1dF9kZXYodWRldik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuaAppbmRleCBmMTRhNjU0Li41NTA5MGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuaApAQCAtMjE5LDE4ICsyMTksNiBAQAogCXU4IHJlc2VydmVkOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IHNldF9taWJfYnVmZmVyIHsKLQl1OCB0eXBlOwotCXU4IHNpemU7Ci0JdTggaW5kZXg7Ci0JdTggcmVzZXJ2ZWQ7Ci0JdW5pb24gewotCQl1OCBieXRlOwotCQlfX2xlMTYgd29yZDsKLQkJdTggYWRkcltFVEhfQUxFTl07Ci0JfSBkYXRhOwotfSBfX3BhY2tlZDsKLQogc3RydWN0IG1pYl9sb2NhbCB7CiAJdTE2IHJlc2VydmVkMDsKIAl1OCBiZWFjb25fZW5hYmxlOwpAQCAtMzM0LDYgKzMyMiwxOSBAQAogCXU4IGNoYW5uZWxfbGlzdFsxNF07CS8qIDAgZm9yIGludmFsaWQgY2hhbm5lbHMgKi8KIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBzZXRfbWliX2J1ZmZlciB7CisJdTggdHlwZTsKKwl1OCBzaXplOworCXU4IGluZGV4OworCXU4IHJlc2VydmVkOworCXVuaW9uIHsKKwkJdTggYnl0ZTsKKwkJX19sZTE2IHdvcmQ7CisJCXU4IGFkZHJbRVRIX0FMRU5dOworCQlzdHJ1Y3QgbWliX21hY193ZXAgd2VwX21pYjsKKwl9IGRhdGE7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgYXQ3Nl9md19oZWFkZXIgewogCV9fbGUzMiBjcmM7CQkvKiBDUkMzMiBvZiB0aGUgd2hvbGUgaW1hZ2UgKi8KIAlfX2xlMzIgYm9hcmRfdHlwZTsJLyogZmlybXdhcmUgY29tcGF0aWJpbGl0eSBjb2RlICovCkBAIC00MTcsNiArNDE4LDcgQEAKIAlpbnQgc2Nhbl9tYXhfdGltZTsJLyogc2NhbiBtYXggY2hhbm5lbCB0aW1lICovCiAJaW50IHNjYW5fbW9kZTsJCS8qIFNDQU5fVFlQRV9BQ1RJVkUsIFNDQU5fVFlQRV9QQVNTSVZFICovCiAJaW50IHNjYW5fbmVlZF9hbnk7CS8qIGlmIHNldCwgbmVlZCB0byBzY2FuIGZvciBhbnkgRVNTSUQgKi8KKwlib29sIHNjYW5uaW5nOwkJLyogaWYgc2V0LCB0aGUgc2NhbiBpcyBydW5uaW5nICovCiAKIAl1MTYgYXNzb2NfaWQ7CQkvKiBjdXJyZW50IGFzc29jaWF0aW9uIElELCBpZiBhc3NvY2lhdGVkICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCmluZGV4IDUwN2Q5YTkuLmY5MjA1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYwpAQCAtMTA5MCw3ICsxMDkwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhcjU1MjNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIGFyNTUyM19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJc3RydWN0IGFyNTUyMyAqYXIgPSBody0+cHJpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmMKaW5kZXggYTFmMDk5Ni4uMTdkMjIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDEwa19ibWlfZXhlY3V0ZShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIGFkZHJlc3MsIHUzMiAqcGFyYW0pCitpbnQgYXRoMTBrX2JtaV9leGVjdXRlKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgYWRkcmVzcywgdTMyIHBhcmFtLCB1MzIgKnJlc3VsdCkKIHsKIAlzdHJ1Y3QgYm1pX2NtZCBjbWQ7CiAJdW5pb24gYm1pX3Jlc3AgcmVzcDsKQEAgLTE4NCw3ICsxODQsNyBAQAogCWludCByZXQ7CiAKIAlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk1JLCAiYm1pIGV4ZWN1dGUgYWRkcmVzcyAweCV4IHBhcmFtIDB4JXhcbiIsCi0JCSAgIGFkZHJlc3MsICpwYXJhbSk7CisJCSAgIGFkZHJlc3MsIHBhcmFtKTsKIAogCWlmIChhci0+Ym1pLmRvbmVfc2VudCkgewogCQlhdGgxMGtfd2FybigiY29tbWFuZCBkaXNhbGxvd2VkXG4iKTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJY21kLmlkICAgICAgICAgICAgPSBfX2NwdV90b19sZTMyKEJNSV9FWEVDVVRFKTsKIAljbWQuZXhlY3V0ZS5hZGRyICA9IF9fY3B1X3RvX2xlMzIoYWRkcmVzcyk7Ci0JY21kLmV4ZWN1dGUucGFyYW0gPSBfX2NwdV90b19sZTMyKCpwYXJhbSk7CisJY21kLmV4ZWN1dGUucGFyYW0gPSBfX2NwdV90b19sZTMyKHBhcmFtKTsKIAogCXJldCA9IGF0aDEwa19oaWZfZXhjaGFuZ2VfYm1pX21zZyhhciwgJmNtZCwgY21kbGVuLCAmcmVzcCwgJnJlc3BsZW4pOwogCWlmIChyZXQpIHsKQEAgLTIwNCwxMCArMjA0LDEzIEBACiAJaWYgKHJlc3BsZW4gPCBzaXplb2YocmVzcC5leGVjdXRlKSkgewogCQlhdGgxMGtfd2FybigiaW52YWxpZCBleGVjdXRlIHJlc3BvbnNlIGxlbmd0aCAoJWQpXG4iLAogCQkJICAgIHJlc3BsZW4pOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkqcGFyYW0gPSBfX2xlMzJfdG9fY3B1KHJlc3AuZXhlY3V0ZS5yZXN1bHQpOworCSpyZXN1bHQgPSBfX2xlMzJfdG9fY3B1KHJlc3AuZXhlY3V0ZS5yZXN1bHQpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JNSSwgImJtaSBleGVjdXRlIHJlc3VsdCAweCV4XG4iLCAqcmVzdWx0KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuaAppbmRleCA4ZDgxY2UxLi4xMTFhYjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmgKQEAgLTIwMSw3ICsyMDEsOCBAQAogCQkJCQkJCQkJXAogCQlhZGRyID0gaG9zdF9pbnRlcmVzdF9pdGVtX2FkZHJlc3MoSElfSVRFTShpdGVtKSk7CVwKIAkJcmV0ID0gYXRoMTBrX2JtaV9yZWFkX21lbW9yeShhciwgYWRkciwgKHU4ICopJnRtcCwgNCk7IFwKLQkJKnZhbCA9IF9fbGUzMl90b19jcHUodG1wKTsJCQkJXAorCQlpZiAoIXJldCkJCQkJCQlcCisJCQkqdmFsID0gX19sZTMyX3RvX2NwdSh0bXApOwkJCVwKIAkJcmV0OwkJCQkJCQlcCiAJIH0pCiAKQEAgLTIxNyw3ICsyMTgsNyBAQAogCQlyZXQ7CQkJCQkJCVwKIAl9KQogCi1pbnQgYXRoMTBrX2JtaV9leGVjdXRlKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgYWRkcmVzcywgdTMyICpwYXJhbSk7CitpbnQgYXRoMTBrX2JtaV9leGVjdXRlKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgYWRkcmVzcywgdTMyIHBhcmFtLCB1MzIgKnJlc3VsdCk7CiBpbnQgYXRoMTBrX2JtaV9sel9zdHJlYW1fc3RhcnQoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBhZGRyZXNzKTsKIGludCBhdGgxMGtfYm1pX2x6X2RhdGEoc3RydWN0IGF0aDEwayAqYXIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgdTMyIGxlbmd0aCk7CiBpbnQgYXRoMTBrX2JtaV9mYXN0X2Rvd25sb2FkKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgYWRkcmVzcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYwppbmRleCBhNzk0OTljLi5kMTg1ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5jCkBAIC0zMjksNiArMzI5LDMzIEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBfX2F0aDEwa19jZV9zZW5kX3JldmVydChzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKnBpcGUpCit7CisJc3RydWN0IGF0aDEwayAqYXIgPSBwaXBlLT5hcjsKKwlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKKwlzdHJ1Y3QgYXRoMTBrX2NlX3JpbmcgKnNyY19yaW5nID0gcGlwZS0+c3JjX3Jpbmc7CisJdTMyIGN0cmxfYWRkciA9IHBpcGUtPmN0cmxfYWRkcjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyX3BjaS0+Y2VfbG9jayk7CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlCisJICogc2NhdHRlci1nYXRoZXIgdHJhbnNmZXIgKGJlZm9yZSBpbmRleCByZWdpc3RlciBpcyB1cGRhdGVkKQorCSAqIHRoYXQgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4KKwkgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKHNyY19yaW5nLT53cml0ZV9pbmRleCA9PSBzcmNfcmluZy0+c3dfaW5kZXgpKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTl9PTkNFKHNyY19yaW5nLT53cml0ZV9pbmRleCA9PQorCQkJIGF0aDEwa19jZV9zcmNfcmluZ193cml0ZV9pbmRleF9nZXQoYXIsIGN0cmxfYWRkcikpKQorCQlyZXR1cm47CisKKwlzcmNfcmluZy0+d3JpdGVfaW5kZXgtLTsKKwlzcmNfcmluZy0+d3JpdGVfaW5kZXggJj0gc3JjX3JpbmctPm5lbnRyaWVzX21hc2s7CisKKwlzcmNfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHRbc3JjX3JpbmctPndyaXRlX2luZGV4XSA9IE5VTEw7Cit9CisKIGludCBhdGgxMGtfY2Vfc2VuZChzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlLAogCQkgICB2b2lkICpwZXJfdHJhbnNmZXJfY29udGV4dCwKIAkJICAgdTMyIGJ1ZmZlciwKQEAgLTg0MCwzNSArODY3LDE3IEBACiAKIHN0YXRpYyBpbnQgYXRoMTBrX2NlX2luaXRfc3JjX3Jpbmcoc3RydWN0IGF0aDEwayAqYXIsCiAJCQkJICAgdW5zaWduZWQgaW50IGNlX2lkLAotCQkJCSAgIHN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2Vfc3RhdGUsCiAJCQkJICAgY29uc3Qgc3RydWN0IGNlX2F0dHIgKmF0dHIpCiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7Ci0Jc3RydWN0IGF0aDEwa19jZV9yaW5nICpzcmNfcmluZzsKLQl1bnNpZ25lZCBpbnQgbmVudHJpZXMgPSBhdHRyLT5zcmNfbmVudHJpZXM7Ci0JdW5zaWduZWQgaW50IGNlX25ieXRlczsKLQl1MzIgY3RybF9hZGRyID0gYXRoMTBrX2NlX2Jhc2VfYWRkcmVzcyhjZV9pZCk7Ci0JZG1hX2FkZHJfdCBiYXNlX2FkZHI7Ci0JY2hhciAqcHRyOworCXN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2Vfc3RhdGUgPSAmYXJfcGNpLT5jZV9zdGF0ZXNbY2VfaWRdOworCXN0cnVjdCBhdGgxMGtfY2VfcmluZyAqc3JjX3JpbmcgPSBjZV9zdGF0ZS0+c3JjX3Jpbmc7CisJdTMyIG5lbnRyaWVzLCBjdHJsX2FkZHIgPSBhdGgxMGtfY2VfYmFzZV9hZGRyZXNzKGNlX2lkKTsKIAotCW5lbnRyaWVzID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5lbnRyaWVzKTsKKwluZW50cmllcyA9IHJvdW5kdXBfcG93X29mX3R3byhhdHRyLT5zcmNfbmVudHJpZXMpOwogCi0JaWYgKGNlX3N0YXRlLT5zcmNfcmluZykgewotCQlXQVJOX09OKGNlX3N0YXRlLT5zcmNfcmluZy0+bmVudHJpZXMgIT0gbmVudHJpZXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljZV9uYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGF0aDEwa19jZV9yaW5nKSArIChuZW50cmllcyAqIHNpemVvZih2b2lkICopKTsKLQlwdHIgPSBremFsbG9jKGNlX25ieXRlcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNlX3N0YXRlLT5zcmNfcmluZyA9IChzdHJ1Y3QgYXRoMTBrX2NlX3JpbmcgKilwdHI7Ci0Jc3JjX3JpbmcgPSBjZV9zdGF0ZS0+c3JjX3Jpbmc7Ci0KLQlwdHIgKz0gc2l6ZW9mKHN0cnVjdCBhdGgxMGtfY2VfcmluZyk7Ci0Jc3JjX3JpbmctPm5lbnRyaWVzID0gbmVudHJpZXM7Ci0Jc3JjX3JpbmctPm5lbnRyaWVzX21hc2sgPSBuZW50cmllcyAtIDE7CisJbWVtc2V0KHNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dCwgMCwKKwkgICAgICAgbmVudHJpZXMgKiBzaXplb2YoKnNyY19yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dCkpOwogCiAJc3JjX3JpbmctPnN3X2luZGV4ID0gYXRoMTBrX2NlX3NyY19yaW5nX3JlYWRfaW5kZXhfZ2V0KGFyLCBjdHJsX2FkZHIpOwogCXNyY19yaW5nLT5zd19pbmRleCAmPSBzcmNfcmluZy0+bmVudHJpZXNfbWFzazsKQEAgLTg3OCwyMSArODg3LDg3IEBACiAJCWF0aDEwa19jZV9zcmNfcmluZ193cml0ZV9pbmRleF9nZXQoYXIsIGN0cmxfYWRkcik7CiAJc3JjX3JpbmctPndyaXRlX2luZGV4ICY9IHNyY19yaW5nLT5uZW50cmllc19tYXNrOwogCi0Jc3JjX3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0ID0gKHZvaWQgKiopcHRyOworCWF0aDEwa19jZV9zcmNfcmluZ19iYXNlX2FkZHJfc2V0KGFyLCBjdHJsX2FkZHIsCisJCQkJCSBzcmNfcmluZy0+YmFzZV9hZGRyX2NlX3NwYWNlKTsKKwlhdGgxMGtfY2Vfc3JjX3Jpbmdfc2l6ZV9zZXQoYXIsIGN0cmxfYWRkciwgbmVudHJpZXMpOworCWF0aDEwa19jZV9zcmNfcmluZ19kbWF4X3NldChhciwgY3RybF9hZGRyLCBhdHRyLT5zcmNfc3pfbWF4KTsKKwlhdGgxMGtfY2Vfc3JjX3JpbmdfYnl0ZV9zd2FwX3NldChhciwgY3RybF9hZGRyLCAwKTsKKwlhdGgxMGtfY2Vfc3JjX3JpbmdfbG93bWFya19zZXQoYXIsIGN0cmxfYWRkciwgMCk7CisJYXRoMTBrX2NlX3NyY19yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7CisKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwKKwkJICAgImJvb3QgaW5pdCBjZSBzcmMgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcFxuIiwKKwkJICAgY2VfaWQsIG5lbnRyaWVzLCBzcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDEwa19jZV9pbml0X2Rlc3RfcmluZyhzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNlX2lkLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKKwlzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlID0gJmFyX3BjaS0+Y2Vfc3RhdGVzW2NlX2lkXTsKKwlzdHJ1Y3QgYXRoMTBrX2NlX3JpbmcgKmRlc3RfcmluZyA9IGNlX3N0YXRlLT5kZXN0X3Jpbmc7CisJdTMyIG5lbnRyaWVzLCBjdHJsX2FkZHIgPSBhdGgxMGtfY2VfYmFzZV9hZGRyZXNzKGNlX2lkKTsKKworCW5lbnRyaWVzID0gcm91bmR1cF9wb3dfb2ZfdHdvKGF0dHItPmRlc3RfbmVudHJpZXMpOworCisJbWVtc2V0KGRlc3RfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHQsIDAsCisJICAgICAgIG5lbnRyaWVzICogc2l6ZW9mKCpkZXN0X3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0KSk7CisKKwlkZXN0X3JpbmctPnN3X2luZGV4ID0gYXRoMTBrX2NlX2Rlc3RfcmluZ19yZWFkX2luZGV4X2dldChhciwgY3RybF9hZGRyKTsKKwlkZXN0X3JpbmctPnN3X2luZGV4ICY9IGRlc3RfcmluZy0+bmVudHJpZXNfbWFzazsKKwlkZXN0X3JpbmctPndyaXRlX2luZGV4ID0KKwkJYXRoMTBrX2NlX2Rlc3RfcmluZ193cml0ZV9pbmRleF9nZXQoYXIsIGN0cmxfYWRkcik7CisJZGVzdF9yaW5nLT53cml0ZV9pbmRleCAmPSBkZXN0X3JpbmctPm5lbnRyaWVzX21hc2s7CisKKwlhdGgxMGtfY2VfZGVzdF9yaW5nX2Jhc2VfYWRkcl9zZXQoYXIsIGN0cmxfYWRkciwKKwkJCQkJICBkZXN0X3JpbmctPmJhc2VfYWRkcl9jZV9zcGFjZSk7CisJYXRoMTBrX2NlX2Rlc3RfcmluZ19zaXplX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7CisJYXRoMTBrX2NlX2Rlc3RfcmluZ19ieXRlX3N3YXBfc2V0KGFyLCBjdHJsX2FkZHIsIDApOworCWF0aDEwa19jZV9kZXN0X3JpbmdfbG93bWFya19zZXQoYXIsIGN0cmxfYWRkciwgMCk7CisJYXRoMTBrX2NlX2Rlc3RfcmluZ19oaWdobWFya19zZXQoYXIsIGN0cmxfYWRkciwgbmVudHJpZXMpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsCisJCSAgICJib290IGNlIGRlc3QgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcFxuIiwKKwkJICAgY2VfaWQsIG5lbnRyaWVzLCBkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhdGgxMGtfY2VfcmluZyAqCithdGgxMGtfY2VfYWxsb2Nfc3JjX3Jpbmcoc3RydWN0IGF0aDEwayAqYXIsIHVuc2lnbmVkIGludCBjZV9pZCwKKwkJCSBjb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgYXRoMTBrX2NlX3JpbmcgKnNyY19yaW5nOworCXUzMiBuZW50cmllcyA9IGF0dHItPnNyY19uZW50cmllczsKKwlkbWFfYWRkcl90IGJhc2VfYWRkcjsKKworCW5lbnRyaWVzID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5lbnRyaWVzKTsKKworCXNyY19yaW5nID0ga3phbGxvYyhzaXplb2YoKnNyY19yaW5nKSArCisJCQkgICAobmVudHJpZXMgKgorCQkJICAgIHNpemVvZigqc3JjX3JpbmctPnBlcl90cmFuc2Zlcl9jb250ZXh0KSksCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoc3JjX3JpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcmNfcmluZy0+bmVudHJpZXMgPSBuZW50cmllczsKKwlzcmNfcmluZy0+bmVudHJpZXNfbWFzayA9IG5lbnRyaWVzIC0gMTsKIAogCS8qCiAJICogTGVnYWN5IHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNhY2hlCiAJICogY29oZXJlbnQgRE1BIGFyZSB1bnN1cHBvcnRlZAogCSAqLwogCXNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkID0KLQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoYXJfcGNpLT5wZGV2LAotCQkJCSAgICAgKG5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBjZV9kZXNjKSArCi0JCQkJICAgICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKLQkJCQkgICAgICZiYXNlX2FkZHIpOworCQlkbWFfYWxsb2NfY29oZXJlbnQoYXItPmRldiwKKwkJCQkgICAobmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGNlX2Rlc2MpICsKKwkJCQkgICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKKwkJCQkgICAmYmFzZV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkKSB7Ci0JCWtmcmVlKGNlX3N0YXRlLT5zcmNfcmluZyk7Ci0JCWNlX3N0YXRlLT5zcmNfcmluZyA9IE5VTEw7Ci0JCXJldHVybiAtRU5PTUVNOworCQlrZnJlZShzcmNfcmluZyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCXNyY19yaW5nLT5iYXNlX2FkZHJfY2Vfc3BhY2VfdW5hbGlnbmVkID0gYmFzZV9hZGRyOwpAQCAtOTEyLDg4ICs5ODcsNTQgQEAKIAkJa21hbGxvYygobmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGNlX2Rlc2MpICsKIAkJCSBDRV9ERVNDX1JJTkdfQUxJR04pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNyY19yaW5nLT5zaGFkb3dfYmFzZV91bmFsaWduZWQpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhcl9wY2ktPnBkZXYsCi0JCQkJICAgIChuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgY2VfZGVzYykgKwotCQkJCSAgICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKLQkJCQkgICAgc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSwKLQkJCQkgICAgc3JjX3JpbmctPmJhc2VfYWRkcl9jZV9zcGFjZSk7Ci0JCWtmcmVlKGNlX3N0YXRlLT5zcmNfcmluZyk7Ci0JCWNlX3N0YXRlLT5zcmNfcmluZyA9IE5VTEw7Ci0JCXJldHVybiAtRU5PTUVNOworCQlkbWFfZnJlZV9jb2hlcmVudChhci0+ZGV2LAorCQkJCSAgKG5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBjZV9kZXNjKSArCisJCQkJICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKKwkJCQkgIHNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UsCisJCQkJICBzcmNfcmluZy0+YmFzZV9hZGRyX2NlX3NwYWNlKTsKKwkJa2ZyZWUoc3JjX3JpbmcpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKIAlzcmNfcmluZy0+c2hhZG93X2Jhc2UgPSBQVFJfQUxJR04oCiAJCQlzcmNfcmluZy0+c2hhZG93X2Jhc2VfdW5hbGlnbmVkLAogCQkJQ0VfREVTQ19SSU5HX0FMSUdOKTsKIAotCWF0aDEwa19jZV9zcmNfcmluZ19iYXNlX2FkZHJfc2V0KGFyLCBjdHJsX2FkZHIsCi0JCQkJCSBzcmNfcmluZy0+YmFzZV9hZGRyX2NlX3NwYWNlKTsKLQlhdGgxMGtfY2Vfc3JjX3Jpbmdfc2l6ZV9zZXQoYXIsIGN0cmxfYWRkciwgbmVudHJpZXMpOwotCWF0aDEwa19jZV9zcmNfcmluZ19kbWF4X3NldChhciwgY3RybF9hZGRyLCBhdHRyLT5zcmNfc3pfbWF4KTsKLQlhdGgxMGtfY2Vfc3JjX3JpbmdfYnl0ZV9zd2FwX3NldChhciwgY3RybF9hZGRyLCAwKTsKLQlhdGgxMGtfY2Vfc3JjX3JpbmdfbG93bWFya19zZXQoYXIsIGN0cmxfYWRkciwgMCk7Ci0JYXRoMTBrX2NlX3NyY19yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7Ci0KLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgY2Ugc3JjIHJpbmcgaWQgJWQgZW50cmllcyAlZCBiYXNlX2FkZHIgJXBcbiIsCi0JCSAgIGNlX2lkLCBuZW50cmllcywgc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3JjX3Jpbmc7CiB9CiAKLXN0YXRpYyBpbnQgYXRoMTBrX2NlX2luaXRfZGVzdF9yaW5nKHN0cnVjdCBhdGgxMGsgKmFyLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY2VfaWQsCi0JCQkJICAgIHN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2Vfc3RhdGUsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBjZV9hdHRyICphdHRyKQorc3RhdGljIHN0cnVjdCBhdGgxMGtfY2VfcmluZyAqCithdGgxMGtfY2VfYWxsb2NfZGVzdF9yaW5nKHN0cnVjdCBhdGgxMGsgKmFyLCB1bnNpZ25lZCBpbnQgY2VfaWQsCisJCQkgIGNvbnN0IHN0cnVjdCBjZV9hdHRyICphdHRyKQogewotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCXN0cnVjdCBhdGgxMGtfY2VfcmluZyAqZGVzdF9yaW5nOwotCXVuc2lnbmVkIGludCBuZW50cmllcyA9IGF0dHItPmRlc3RfbmVudHJpZXM7Ci0JdW5zaWduZWQgaW50IGNlX25ieXRlczsKLQl1MzIgY3RybF9hZGRyID0gYXRoMTBrX2NlX2Jhc2VfYWRkcmVzcyhjZV9pZCk7CisJdTMyIG5lbnRyaWVzOwogCWRtYV9hZGRyX3QgYmFzZV9hZGRyOwotCWNoYXIgKnB0cjsKIAotCW5lbnRyaWVzID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5lbnRyaWVzKTsKKwluZW50cmllcyA9IHJvdW5kdXBfcG93X29mX3R3byhhdHRyLT5kZXN0X25lbnRyaWVzKTsKIAotCWlmIChjZV9zdGF0ZS0+ZGVzdF9yaW5nKSB7Ci0JCVdBUk5fT04oY2Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXMgIT0gbmVudHJpZXMpOwotCQlyZXR1cm4gMDsKLQl9CisJZGVzdF9yaW5nID0ga3phbGxvYyhzaXplb2YoKmRlc3RfcmluZykgKworCQkJICAgIChuZW50cmllcyAqCisJCQkgICAgIHNpemVvZigqZGVzdF9yaW5nLT5wZXJfdHJhbnNmZXJfY29udGV4dCkpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmIChkZXN0X3JpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQljZV9uYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGF0aDEwa19jZV9yaW5nKSArIChuZW50cmllcyAqIHNpemVvZih2b2lkICopKTsKLQlwdHIgPSBremFsbG9jKGNlX25ieXRlcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNlX3N0YXRlLT5kZXN0X3JpbmcgPSAoc3RydWN0IGF0aDEwa19jZV9yaW5nICopcHRyOwotCWRlc3RfcmluZyA9IGNlX3N0YXRlLT5kZXN0X3Jpbmc7Ci0KLQlwdHIgKz0gc2l6ZW9mKHN0cnVjdCBhdGgxMGtfY2VfcmluZyk7CiAJZGVzdF9yaW5nLT5uZW50cmllcyA9IG5lbnRyaWVzOwogCWRlc3RfcmluZy0+bmVudHJpZXNfbWFzayA9IG5lbnRyaWVzIC0gMTsKIAotCWRlc3RfcmluZy0+c3dfaW5kZXggPSBhdGgxMGtfY2VfZGVzdF9yaW5nX3JlYWRfaW5kZXhfZ2V0KGFyLCBjdHJsX2FkZHIpOwotCWRlc3RfcmluZy0+c3dfaW5kZXggJj0gZGVzdF9yaW5nLT5uZW50cmllc19tYXNrOwotCWRlc3RfcmluZy0+d3JpdGVfaW5kZXggPQotCQlhdGgxMGtfY2VfZGVzdF9yaW5nX3dyaXRlX2luZGV4X2dldChhciwgY3RybF9hZGRyKTsKLQlkZXN0X3JpbmctPndyaXRlX2luZGV4ICY9IGRlc3RfcmluZy0+bmVudHJpZXNfbWFzazsKLQotCWRlc3RfcmluZy0+cGVyX3RyYW5zZmVyX2NvbnRleHQgPSAodm9pZCAqKilwdHI7Ci0KIAkvKgogCSAqIExlZ2FjeSBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBjYWNoZQogCSAqIGNvaGVyZW50IERNQSBhcmUgdW5zdXBwb3J0ZWQKIAkgKi8KIAlkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZV91bmFsaWduZWQgPQotCQlwY2lfYWxsb2NfY29uc2lzdGVudChhcl9wY2ktPnBkZXYsCi0JCQkJICAgICAobmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGNlX2Rlc2MpICsKLQkJCQkgICAgICBDRV9ERVNDX1JJTkdfQUxJR04pLAotCQkJCSAgICAgJmJhc2VfYWRkcik7CisJCWRtYV9hbGxvY19jb2hlcmVudChhci0+ZGV2LAorCQkJCSAgIChuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgY2VfZGVzYykgKworCQkJCSAgICBDRV9ERVNDX1JJTkdfQUxJR04pLAorCQkJCSAgICZiYXNlX2FkZHIsIEdGUF9LRVJORUwpOwogCWlmICghZGVzdF9yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2VfdW5hbGlnbmVkKSB7Ci0JCWtmcmVlKGNlX3N0YXRlLT5kZXN0X3JpbmcpOwotCQljZV9zdGF0ZS0+ZGVzdF9yaW5nID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWtmcmVlKGRlc3RfcmluZyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCWRlc3RfcmluZy0+YmFzZV9hZGRyX2NlX3NwYWNlX3VuYWxpZ25lZCA9IGJhc2VfYWRkcjsKQEAgLTEwMTIsMzkgKzEwNTMsNyBAQAogCQkJZGVzdF9yaW5nLT5iYXNlX2FkZHJfY2Vfc3BhY2VfdW5hbGlnbmVkLAogCQkJQ0VfREVTQ19SSU5HX0FMSUdOKTsKIAotCWF0aDEwa19jZV9kZXN0X3JpbmdfYmFzZV9hZGRyX3NldChhciwgY3RybF9hZGRyLAotCQkJCQkgIGRlc3RfcmluZy0+YmFzZV9hZGRyX2NlX3NwYWNlKTsKLQlhdGgxMGtfY2VfZGVzdF9yaW5nX3NpemVfc2V0KGFyLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKLQlhdGgxMGtfY2VfZGVzdF9yaW5nX2J5dGVfc3dhcF9zZXQoYXIsIGN0cmxfYWRkciwgMCk7Ci0JYXRoMTBrX2NlX2Rlc3RfcmluZ19sb3dtYXJrX3NldChhciwgY3RybF9hZGRyLCAwKTsKLQlhdGgxMGtfY2VfZGVzdF9yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7Ci0KLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgY2UgZGVzdCByaW5nIGlkICVkIGVudHJpZXMgJWQgYmFzZV9hZGRyICVwXG4iLAotCQkgICBjZV9pZCwgbmVudHJpZXMsIGRlc3RfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGF0aDEwa19jZV9waXBlICphdGgxMGtfY2VfaW5pdF9zdGF0ZShzdHJ1Y3QgYXRoMTBrICphciwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2VfaWQsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGNlX2F0dHIgKmF0dHIpCi17Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7Ci0Jc3RydWN0IGF0aDEwa19jZV9waXBlICpjZV9zdGF0ZSA9ICZhcl9wY2ktPmNlX3N0YXRlc1tjZV9pZF07Ci0JdTMyIGN0cmxfYWRkciA9IGF0aDEwa19jZV9iYXNlX2FkZHJlc3MoY2VfaWQpOwotCi0Jc3Bpbl9sb2NrX2JoKCZhcl9wY2ktPmNlX2xvY2spOwotCi0JY2Vfc3RhdGUtPmFyID0gYXI7Ci0JY2Vfc3RhdGUtPmlkID0gY2VfaWQ7Ci0JY2Vfc3RhdGUtPmN0cmxfYWRkciA9IGN0cmxfYWRkcjsKLQljZV9zdGF0ZS0+YXR0cl9mbGFncyA9IGF0dHItPmZsYWdzOwotCWNlX3N0YXRlLT5zcmNfc3pfbWF4ID0gYXR0ci0+c3JjX3N6X21heDsKLQotCXNwaW5fdW5sb2NrX2JoKCZhcl9wY2ktPmNlX2xvY2spOwotCi0JcmV0dXJuIGNlX3N0YXRlOworCXJldHVybiBkZXN0X3Jpbmc7CiB9CiAKIC8qCkBAIC0xMDU0LDExICsxMDYzLDExIEBACiAgKiBpbml0aWFsaXphdGlvbi4gSXQgbWF5IGJlIHRoYXQgb25seSBvbmUgc2lkZSBvciB0aGUgb3RoZXIgaXMKICAqIGluaXRpYWxpemVkIGJ5IHNvZnR3YXJlL2Zpcm13YXJlLgogICovCi1zdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmF0aDEwa19jZV9pbml0KHN0cnVjdCBhdGgxMGsgKmFyLAotCQkJCXVuc2lnbmVkIGludCBjZV9pZCwKLQkJCQljb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cikKK2ludCBhdGgxMGtfY2VfaW5pdF9waXBlKHN0cnVjdCBhdGgxMGsgKmFyLCB1bnNpZ25lZCBpbnQgY2VfaWQsCisJCQljb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cikKIHsKLQlzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlOworCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOworCXN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2Vfc3RhdGUgPSAmYXJfcGNpLT5jZV9zdGF0ZXNbY2VfaWRdOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMTA3NCw2NCArMTA4MywxMjggQEAKIAogCXJldCA9IGF0aDEwa19wY2lfd2FrZShhcik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiByZXQ7CiAKLQljZV9zdGF0ZSA9IGF0aDEwa19jZV9pbml0X3N0YXRlKGFyLCBjZV9pZCwgYXR0cik7Ci0JaWYgKCFjZV9zdGF0ZSkgewotCQlhdGgxMGtfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBDRSBzdGF0ZSBmb3IgSUQ6ICVkXG4iLCBjZV9pZCk7Ci0JCWdvdG8gb3V0OwotCX0KKwlzcGluX2xvY2tfYmgoJmFyX3BjaS0+Y2VfbG9jayk7CisJY2Vfc3RhdGUtPmFyID0gYXI7CisJY2Vfc3RhdGUtPmlkID0gY2VfaWQ7CisJY2Vfc3RhdGUtPmN0cmxfYWRkciA9IGF0aDEwa19jZV9iYXNlX2FkZHJlc3MoY2VfaWQpOworCWNlX3N0YXRlLT5hdHRyX2ZsYWdzID0gYXR0ci0+ZmxhZ3M7CisJY2Vfc3RhdGUtPnNyY19zel9tYXggPSBhdHRyLT5zcmNfc3pfbWF4OworCXNwaW5fdW5sb2NrX2JoKCZhcl9wY2ktPmNlX2xvY2spOwogCiAJaWYgKGF0dHItPnNyY19uZW50cmllcykgewotCQlyZXQgPSBhdGgxMGtfY2VfaW5pdF9zcmNfcmluZyhhciwgY2VfaWQsIGNlX3N0YXRlLCBhdHRyKTsKKwkJcmV0ID0gYXRoMTBrX2NlX2luaXRfc3JjX3JpbmcoYXIsIGNlX2lkLCBhdHRyKTsKIAkJaWYgKHJldCkgewogCQkJYXRoMTBrX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgQ0Ugc3JjIHJpbmcgZm9yIElEOiAlZCAoJWQpXG4iLAogCQkJCSAgIGNlX2lkLCByZXQpOwotCQkJYXRoMTBrX2NlX2RlaW5pdChjZV9zdGF0ZSk7Ci0JCQljZV9zdGF0ZSA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAogCWlmIChhdHRyLT5kZXN0X25lbnRyaWVzKSB7Ci0JCXJldCA9IGF0aDEwa19jZV9pbml0X2Rlc3RfcmluZyhhciwgY2VfaWQsIGNlX3N0YXRlLCBhdHRyKTsKKwkJcmV0ID0gYXRoMTBrX2NlX2luaXRfZGVzdF9yaW5nKGFyLCBjZV9pZCwgYXR0cik7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDEwa19lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIENFIGRlc3QgcmluZyBmb3IgSUQ6ICVkICglZClcbiIsCiAJCQkJICAgY2VfaWQsIHJldCk7Ci0JCQlhdGgxMGtfY2VfZGVpbml0KGNlX3N0YXRlKTsKLQkJCWNlX3N0YXRlID0gTlVMTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCiBvdXQ6CiAJYXRoMTBrX3BjaV9zbGVlcChhcik7Ci0JcmV0dXJuIGNlX3N0YXRlOworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYXRoMTBrX2NlX2RlaW5pdChzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlKQorc3RhdGljIHZvaWQgYXRoMTBrX2NlX2RlaW5pdF9zcmNfcmluZyhzdHJ1Y3QgYXRoMTBrICphciwgdW5zaWduZWQgaW50IGNlX2lkKQogewotCXN0cnVjdCBhdGgxMGsgKmFyID0gY2Vfc3RhdGUtPmFyOworCXUzMiBjdHJsX2FkZHIgPSBhdGgxMGtfY2VfYmFzZV9hZGRyZXNzKGNlX2lkKTsKKworCWF0aDEwa19jZV9zcmNfcmluZ19iYXNlX2FkZHJfc2V0KGFyLCBjdHJsX2FkZHIsIDApOworCWF0aDEwa19jZV9zcmNfcmluZ19zaXplX3NldChhciwgY3RybF9hZGRyLCAwKTsKKwlhdGgxMGtfY2Vfc3JjX3JpbmdfZG1heF9zZXQoYXIsIGN0cmxfYWRkciwgMCk7CisJYXRoMTBrX2NlX3NyY19yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCAwKTsKK30KKworc3RhdGljIHZvaWQgYXRoMTBrX2NlX2RlaW5pdF9kZXN0X3Jpbmcoc3RydWN0IGF0aDEwayAqYXIsIHVuc2lnbmVkIGludCBjZV9pZCkKK3sKKwl1MzIgY3RybF9hZGRyID0gYXRoMTBrX2NlX2Jhc2VfYWRkcmVzcyhjZV9pZCk7CisKKwlhdGgxMGtfY2VfZGVzdF9yaW5nX2Jhc2VfYWRkcl9zZXQoYXIsIGN0cmxfYWRkciwgMCk7CisJYXRoMTBrX2NlX2Rlc3RfcmluZ19zaXplX3NldChhciwgY3RybF9hZGRyLCAwKTsKKwlhdGgxMGtfY2VfZGVzdF9yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCAwKTsKK30KKwordm9pZCBhdGgxMGtfY2VfZGVpbml0X3BpcGUoc3RydWN0IGF0aDEwayAqYXIsIHVuc2lnbmVkIGludCBjZV9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYXRoMTBrX3BjaV93YWtlKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwlhdGgxMGtfY2VfZGVpbml0X3NyY19yaW5nKGFyLCBjZV9pZCk7CisJYXRoMTBrX2NlX2RlaW5pdF9kZXN0X3JpbmcoYXIsIGNlX2lkKTsKKworCWF0aDEwa19wY2lfc2xlZXAoYXIpOworfQorCitpbnQgYXRoMTBrX2NlX2FsbG9jX3BpcGUoc3RydWN0IGF0aDEwayAqYXIsIGludCBjZV9pZCwKKwkJCSBjb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cikKK3sKIAlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKKwlzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlID0gJmFyX3BjaS0+Y2Vfc3RhdGVzW2NlX2lkXTsKKwlpbnQgcmV0OworCisJaWYgKGF0dHItPnNyY19uZW50cmllcykgeworCQljZV9zdGF0ZS0+c3JjX3JpbmcgPSBhdGgxMGtfY2VfYWxsb2Nfc3JjX3JpbmcoYXIsIGNlX2lkLCBhdHRyKTsKKwkJaWYgKElTX0VSUihjZV9zdGF0ZS0+c3JjX3JpbmcpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNlX3N0YXRlLT5zcmNfcmluZyk7CisJCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gYWxsb2NhdGUgY29weSBlbmdpbmUgc291cmNlIHJpbmcgJWQ6ICVkXG4iLAorCQkJCSAgIGNlX2lkLCByZXQpOworCQkJY2Vfc3RhdGUtPnNyY19yaW5nID0gTlVMTDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoYXR0ci0+ZGVzdF9uZW50cmllcykgeworCQljZV9zdGF0ZS0+ZGVzdF9yaW5nID0gYXRoMTBrX2NlX2FsbG9jX2Rlc3RfcmluZyhhciwgY2VfaWQsCisJCQkJCQkJCWF0dHIpOworCQlpZiAoSVNfRVJSKGNlX3N0YXRlLT5kZXN0X3JpbmcpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNlX3N0YXRlLT5kZXN0X3JpbmcpOworCQkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIGNvcHkgZW5naW5lIGRlc3RpbmF0aW9uIHJpbmcgJWQ6ICVkXG4iLAorCQkJCSAgIGNlX2lkLCByZXQpOworCQkJY2Vfc3RhdGUtPmRlc3RfcmluZyA9IE5VTEw7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXRoMTBrX2NlX2ZyZWVfcGlwZShzdHJ1Y3QgYXRoMTBrICphciwgaW50IGNlX2lkKQoreworCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOworCXN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2Vfc3RhdGUgPSAmYXJfcGNpLT5jZV9zdGF0ZXNbY2VfaWRdOwogCiAJaWYgKGNlX3N0YXRlLT5zcmNfcmluZykgewogCQlrZnJlZShjZV9zdGF0ZS0+c3JjX3JpbmctPnNoYWRvd19iYXNlX3VuYWxpZ25lZCk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXJfcGNpLT5wZGV2LAotCQkJCSAgICAoY2Vfc3RhdGUtPnNyY19yaW5nLT5uZW50cmllcyAqCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGNlX2Rlc2MpICsKLQkJCQkgICAgIENFX0RFU0NfUklOR19BTElHTiksCi0JCQkJICAgIGNlX3N0YXRlLT5zcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlLAotCQkJCSAgICBjZV9zdGF0ZS0+c3JjX3JpbmctPmJhc2VfYWRkcl9jZV9zcGFjZSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFyLT5kZXYsCisJCQkJICAoY2Vfc3RhdGUtPnNyY19yaW5nLT5uZW50cmllcyAqCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBjZV9kZXNjKSArCisJCQkJICAgQ0VfREVTQ19SSU5HX0FMSUdOKSwKKwkJCQkgIGNlX3N0YXRlLT5zcmNfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlLAorCQkJCSAgY2Vfc3RhdGUtPnNyY19yaW5nLT5iYXNlX2FkZHJfY2Vfc3BhY2UpOwogCQlrZnJlZShjZV9zdGF0ZS0+c3JjX3JpbmcpOwogCX0KIAogCWlmIChjZV9zdGF0ZS0+ZGVzdF9yaW5nKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXJfcGNpLT5wZGV2LAotCQkJCSAgICAoY2Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXMgKgotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZV9kZXNjKSArCi0JCQkJICAgICBDRV9ERVNDX1JJTkdfQUxJR04pLAotCQkJCSAgICBjZV9zdGF0ZS0+ZGVzdF9yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UsCi0JCQkJICAgIGNlX3N0YXRlLT5kZXN0X3JpbmctPmJhc2VfYWRkcl9jZV9zcGFjZSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFyLT5kZXYsCisJCQkJICAoY2Vfc3RhdGUtPmRlc3RfcmluZy0+bmVudHJpZXMgKgorCQkJCSAgIHNpemVvZihzdHJ1Y3QgY2VfZGVzYykgKworCQkJCSAgIENFX0RFU0NfUklOR19BTElHTiksCisJCQkJICBjZV9zdGF0ZS0+ZGVzdF9yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UsCisJCQkJICBjZV9zdGF0ZS0+ZGVzdF9yaW5nLT5iYXNlX2FkZHJfY2Vfc3BhY2UpOwogCQlrZnJlZShjZV9zdGF0ZS0+ZGVzdF9yaW5nKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuaAppbmRleCA4ZWI3Zjk5Li43YTVhMzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5oCkBAIC0xMDQsNyArMTA0LDggQEAKIAl2b2lkICpzaGFkb3dfYmFzZV91bmFsaWduZWQ7CiAJc3RydWN0IGNlX2Rlc2MgKnNoYWRvd19iYXNlOwogCi0Jdm9pZCAqKnBlcl90cmFuc2Zlcl9jb250ZXh0OworCS8qIGtlZXAgbGFzdCAqLworCXZvaWQgKnBlcl90cmFuc2Zlcl9jb250ZXh0WzBdOwogfTsKIAogc3RydWN0IGF0aDEwa19jZV9waXBlIHsKQEAgLTE1OSw2ICsxNjAsOCBAQAogCQkJICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfaWQsCiAJCQkgIHVuc2lnbmVkIGludCBmbGFncyk7CiAKK3ZvaWQgX19hdGgxMGtfY2Vfc2VuZF9yZXZlcnQoc3RydWN0IGF0aDEwa19jZV9waXBlICpwaXBlKTsKKwogdm9pZCBhdGgxMGtfY2Vfc2VuZF9jYl9yZWdpc3RlcihzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX3N0YXRlLAogCQkJCXZvaWQgKCpzZW5kX2NiKShzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKiksCiAJCQkJaW50IGRpc2FibGVfaW50ZXJydXB0cyk7CkBAIC0yMTAsMTAgKzIxMywxMiBAQAogCiAvKj09PT09PT09PT09PT09PT09PUNFIEVuZ2luZSBJbml0aWFsaXphdGlvbj09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotLyogSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhIENFICovCi1zdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmF0aDEwa19jZV9pbml0KHN0cnVjdCBhdGgxMGsgKmFyLAotCQkJCXVuc2lnbmVkIGludCBjZV9pZCwKLQkJCQljb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cik7CitpbnQgYXRoMTBrX2NlX2luaXRfcGlwZShzdHJ1Y3QgYXRoMTBrICphciwgdW5zaWduZWQgaW50IGNlX2lkLAorCQkJY29uc3Qgc3RydWN0IGNlX2F0dHIgKmF0dHIpOwordm9pZCBhdGgxMGtfY2VfZGVpbml0X3BpcGUoc3RydWN0IGF0aDEwayAqYXIsIHVuc2lnbmVkIGludCBjZV9pZCk7CitpbnQgYXRoMTBrX2NlX2FsbG9jX3BpcGUoc3RydWN0IGF0aDEwayAqYXIsIGludCBjZV9pZCwKKwkJCSAgY29uc3Qgc3RydWN0IGNlX2F0dHIgKmF0dHIpOwordm9pZCBhdGgxMGtfY2VfZnJlZV9waXBlKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgY2VfaWQpOwogCiAvKj09PT09PT09PT09PT09PT09PUNFIEVuZ2luZSBTaHV0ZG93bj09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qCkBAIC0yMzYsOCArMjQxLDYgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgKm5ieXRlc3AsCiAJCQkgICAgICAgdW5zaWduZWQgaW50ICp0cmFuc2Zlcl9pZHApOwogCi12b2lkIGF0aDEwa19jZV9kZWluaXQoc3RydWN0IGF0aDEwa19jZV9waXBlICpjZV9zdGF0ZSk7Ci0KIC8qPT09PT09PT09PT09PT09PT09Q0UgSW50ZXJydXB0IEhhbmRsZXJzPT09PT09PT09PT09PT09PT09PT0qLwogdm9pZCBhdGgxMGtfY2VfcGVyX2VuZ2luZV9zZXJ2aWNlX2FueShzdHJ1Y3QgYXRoMTBrICphcik7CiB2b2lkIGF0aDEwa19jZV9wZXJfZW5naW5lX3NlcnZpY2Uoc3RydWN0IGF0aDEwayAqYXIsIHVuc2lnbmVkIGludCBjZV9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCmluZGV4IGViYzVmYzIuLjgyMDE3ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCkBAIC01OCwzNiArNTgsNiBAQAogCWNvbXBsZXRlKCZhci0+dGFyZ2V0X3N1c3BlbmQpOwogfQogCi1zdGF0aWMgaW50IGF0aDEwa19pbml0X2Nvbm5lY3RfaHRjKHN0cnVjdCBhdGgxMGsgKmFyKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBhdGgxMGtfd21pX2Nvbm5lY3RfaHRjX3NlcnZpY2UoYXIpOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gY29ubl9mYWlsOwotCi0JLyogU3RhcnQgSFRDICovCi0Jc3RhdHVzID0gYXRoMTBrX2h0Y19zdGFydCgmYXItPmh0Yyk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBjb25uX2ZhaWw7Ci0KLQkvKiBXYWl0IGZvciBXTUkgZXZlbnQgdG8gYmUgcmVhZHkgKi8KLQlzdGF0dXMgPSBhdGgxMGtfd21pX3dhaXRfZm9yX3NlcnZpY2VfcmVhZHkoYXIpOwotCWlmIChzdGF0dXMgPD0gMCkgewotCQlhdGgxMGtfd2Fybigid21pIHNlcnZpY2UgcmVhZHkgZXZlbnQgbm90IHJlY2VpdmVkIik7Ci0JCXN0YXR1cyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gdGltZW91dDsKLQl9Ci0KLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgImJvb3Qgd21pIHJlYWR5XG4iKTsKLQlyZXR1cm4gMDsKLQotdGltZW91dDoKLQlhdGgxMGtfaHRjX3N0b3AoJmFyLT5odGMpOwotY29ubl9mYWlsOgotCXJldHVybiBzdGF0dXM7Ci19Ci0KIHN0YXRpYyBpbnQgYXRoMTBrX2luaXRfY29uZmlndXJlX3RhcmdldChzdHJ1Y3QgYXRoMTBrICphcikKIHsKIAl1MzIgcGFyYW1faG9zdDsKQEAgLTI0OSwzMCArMjE5LDQwIEBACiAKIHN0YXRpYyBpbnQgYXRoMTBrX2Rvd25sb2FkX2FuZF9ydW5fb3RwKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCXUzMiBhZGRyZXNzID0gYXItPmh3X3BhcmFtcy5wYXRjaF9sb2FkX2FkZHI7Ci0JdTMyIGV4ZWNfcGFyYW07CisJdTMyIHJlc3VsdCwgYWRkcmVzcyA9IGFyLT5od19wYXJhbXMucGF0Y2hfbG9hZF9hZGRyOwogCWludCByZXQ7CiAKIAkvKiBPVFAgaXMgb3B0aW9uYWwgKi8KIAotCWlmICghYXItPm90cF9kYXRhIHx8ICFhci0+b3RwX2xlbikKKwlpZiAoIWFyLT5vdHBfZGF0YSB8fCAhYXItPm90cF9sZW4pIHsKKwkJYXRoMTBrX3dhcm4oIk5vdCBydW5uaW5nIG90cCwgY2FsaWJyYXRpb24gd2lsbCBiZSBpbmNvcnJlY3QgKG90cC1kYXRhICVwIG90cF9sZW4gJXpkKSFcbiIsCisJCQkgICAgYXItPm90cF9kYXRhLCBhci0+b3RwX2xlbik7CiAJCXJldHVybiAwOworCX0KKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAiYm9vdCB1cGxvYWQgb3RwIHRvIDB4JXggbGVuICV6ZFxuIiwKKwkJICAgYWRkcmVzcywgYXItPm90cF9sZW4pOwogCiAJcmV0ID0gYXRoMTBrX2JtaV9mYXN0X2Rvd25sb2FkKGFyLCBhZGRyZXNzLCBhci0+b3RwX2RhdGEsIGFyLT5vdHBfbGVuKTsKIAlpZiAocmV0KSB7CiAJCWF0aDEwa19lcnIoImNvdWxkIG5vdCB3cml0ZSBvdHAgKCVkKVxuIiwgcmV0KTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gcmV0OwogCX0KIAotCWV4ZWNfcGFyYW0gPSAwOwotCXJldCA9IGF0aDEwa19ibWlfZXhlY3V0ZShhciwgYWRkcmVzcywgJmV4ZWNfcGFyYW0pOworCXJldCA9IGF0aDEwa19ibWlfZXhlY3V0ZShhciwgYWRkcmVzcywgMCwgJnJlc3VsdCk7CiAJaWYgKHJldCkgewogCQlhdGgxMGtfZXJyKCJjb3VsZCBub3QgZXhlY3V0ZSBvdHAgKCVkKVxuIiwgcmV0KTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gcmV0OwogCX0KIAotZXhpdDoKLQlyZXR1cm4gcmV0OworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAiYm9vdCBvdHAgZXhlY3V0ZSByZXN1bHQgJWRcbiIsIHJlc3VsdCk7CisKKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJYXRoMTBrX2Vycigib3RwIGNhbGlicmF0aW9uIGZhaWxlZDogJWQiLCByZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfZG93bmxvYWRfZncoc3RydWN0IGF0aDEwayAqYXIpCkBAIC0zODksOCArMzY5LDggQEAKIAkvKiBmaXJzdCBmZXRjaCB0aGUgZmlybXdhcmUgZmlsZSAoZmlybXdhcmUtKi5iaW4pICovCiAJYXItPmZpcm13YXJlID0gYXRoMTBrX2ZldGNoX2Z3X2ZpbGUoYXIsIGFyLT5od19wYXJhbXMuZncuZGlyLCBuYW1lKTsKIAlpZiAoSVNfRVJSKGFyLT5maXJtd2FyZSkpIHsKLQkJYXRoMTBrX2VycigiQ291bGQgbm90IGZldGNoIGZpcm13YXJlIGZpbGUgJyVzJzogJWxkXG4iLAotCQkJICAgbmFtZSwgUFRSX0VSUihhci0+ZmlybXdhcmUpKTsKKwkJYXRoMTBrX2VycigiY291bGQgbm90IGZldGNoIGZpcm13YXJlIGZpbGUgJyVzLyVzJzogJWxkXG4iLAorCQkJICAgYXItPmh3X3BhcmFtcy5mdy5kaXIsIG5hbWUsIFBUUl9FUlIoYXItPmZpcm13YXJlKSk7CiAJCXJldHVybiBQVFJfRVJSKGFyLT5maXJtd2FyZSk7CiAJfQogCkBAIC00MDEsMTQgKzM4MSwxNCBAQAogCW1hZ2ljX2xlbiA9IHN0cmxlbihBVEgxMEtfRklSTVdBUkVfTUFHSUMpICsgMTsKIAogCWlmIChsZW4gPCBtYWdpY19sZW4pIHsKLQkJYXRoMTBrX2VycigiZmlybXdhcmUgaW1hZ2UgdG9vIHNtYWxsIHRvIGNvbnRhaW4gbWFnaWM6ICV6dVxuIiwKLQkJCSAgIGxlbik7CisJCWF0aDEwa19lcnIoImZpcm13YXJlIGZpbGUgJyVzLyVzJyB0b28gc21hbGwgdG8gY29udGFpbiBtYWdpYzogJXp1XG4iLAorCQkJICAgYXItPmh3X3BhcmFtcy5mdy5kaXIsIG5hbWUsIGxlbik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyOwogCX0KIAogCWlmIChtZW1jbXAoZGF0YSwgQVRIMTBLX0ZJUk1XQVJFX01BR0lDLCBtYWdpY19sZW4pICE9IDApIHsKLQkJYXRoMTBrX2VycigiSW52YWxpZCBmaXJtd2FyZSBtYWdpY1xuIik7CisJCWF0aDEwa19lcnIoImludmFsaWQgZmlybXdhcmUgbWFnaWNcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC00MzAsNyArNDEwLDcgQEAKIAkJZGF0YSArPSBzaXplb2YoKmhkcik7CiAKIAkJaWYgKGxlbiA8IGllX2xlbikgewotCQkJYXRoMTBrX2VycigiSW52YWxpZCBsZW5ndGggZm9yIEZXIElFICVkICglenUgPCAlenUpXG4iLAorCQkJYXRoMTBrX2VycigiaW52YWxpZCBsZW5ndGggZm9yIEZXIElFICVkICglenUgPCAlenUpXG4iLAogCQkJCSAgIGllX2lkLCBsZW4sIGllX2xlbik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnI7CkBAIC01MTMsOCArNDkzLDggQEAKIAl9CiAKIAlpZiAoIWFyLT5maXJtd2FyZV9kYXRhIHx8ICFhci0+ZmlybXdhcmVfbGVuKSB7Ci0JCWF0aDEwa193YXJuKCJObyBBVEgxMEtfRldfSUVfRldfSU1BR0UgZm91bmQgZnJvbSAlcywgc2tpcHBpbmdcbiIsCi0JCQkgICAgbmFtZSk7CisJCWF0aDEwa193YXJuKCJObyBBVEgxMEtfRldfSUVfRldfSU1BR0UgZm91bmQgZnJvbSAnJXMvJXMnLCBza2lwcGluZ1xuIiwKKwkJCSAgICBhci0+aHdfcGFyYW1zLmZ3LmRpciwgbmFtZSk7CiAJCXJldCA9IC1FTk9NRURJVU07CiAJCWdvdG8gZXJyOwogCX0KQEAgLTUzMSw3ICs1MTEsOSBAQAogCQkJCQkgYXItPmh3X3BhcmFtcy5mdy5ib2FyZCk7CiAJaWYgKElTX0VSUihhci0+Ym9hcmQpKSB7CiAJCXJldCA9IFBUUl9FUlIoYXItPmJvYXJkKTsKLQkJYXRoMTBrX2VycigiY291bGQgbm90IGZldGNoIGJvYXJkIGRhdGEgKCVkKVxuIiwgcmV0KTsKKwkJYXRoMTBrX2VycigiY291bGQgbm90IGZldGNoIGJvYXJkIGRhdGEgJyVzLyVzJyAoJWQpXG4iLAorCQkJICAgYXItPmh3X3BhcmFtcy5mdy5kaXIsIGFyLT5od19wYXJhbXMuZncuYm9hcmQsCisJCQkgICByZXQpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTU0OSwxOSArNTMxLDIxIEBACiB7CiAJaW50IHJldDsKIAorCWFyLT5md19hcGkgPSAyOworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAidHJ5aW5nIGZ3IGFwaSAlZFxuIiwgYXItPmZ3X2FwaSk7CisKIAlyZXQgPSBhdGgxMGtfY29yZV9mZXRjaF9maXJtd2FyZV9hcGlfbihhciwgQVRIMTBLX0ZXX0FQSTJfRklMRSk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWFyLT5md19hcGkgPSAyOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIHN1Y2Nlc3M7CisKKwlhci0+ZndfYXBpID0gMTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgInRyeWluZyBmdyBhcGkgJWRcbiIsIGFyLT5md19hcGkpOwogCiAJcmV0ID0gYXRoMTBrX2NvcmVfZmV0Y2hfZmlybXdhcmVfYXBpXzEoYXIpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlhci0+ZndfYXBpID0gMTsKLQotb3V0Ogorc3VjY2VzczoKIAlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgInVzaW5nIGZ3IGFwaSAlZFxuIiwgYXItPmZ3X2FwaSk7CiAKIAlyZXR1cm4gMDsKQEAgLTU3MiwxNiArNTU2LDIyIEBACiAJaW50IHJldDsKIAogCXJldCA9IGF0aDEwa19kb3dubG9hZF9ib2FyZF9kYXRhKGFyKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGRvd25sb2FkIGJvYXJkIGRhdGE6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXJldCA9IGF0aDEwa19kb3dubG9hZF9hbmRfcnVuX290cChhcik7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byBydW4gb3RwOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBhdGgxMGtfZG93bmxvYWRfZncoYXIpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gZG93bmxvYWQgZmlybXdhcmU6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC02NjAsOCArNjUwLDkgQEAKIAogCXN3aXRjaCAoYXItPnN0YXRlKSB7CiAJY2FzZSBBVEgxMEtfU1RBVEVfT046Ci0JCWF0aDEwa19oYWx0KGFyKTsKIAkJYXItPnN0YXRlID0gQVRIMTBLX1NUQVRFX1JFU1RBUlRJTkc7CisJCWRlbF90aW1lcl9zeW5jKCZhci0+c2Nhbi50aW1lb3V0KTsKKwkJYXRoMTBrX3Jlc2V0X3NjYW4oKHVuc2lnbmVkIGxvbmcpYXIpOwogCQlpZWVlODAyMTFfcmVzdGFydF9odyhhci0+aHcpOwogCQlicmVhazsKIAljYXNlIEFUSDEwS19TVEFURV9PRkY6CkBAIC02NzAsNiArNjYxLDggQEAKIAkJYXRoMTBrX3dhcm4oImNhbm5vdCByZXN0YXJ0IGEgZGV2aWNlIHRoYXQgaGFzbid0IGJlZW4gc3RhcnRlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgQVRIMTBLX1NUQVRFX1JFU1RBUlRJTkc6CisJCS8qIGh3IHJlc3RhcnQgbWlnaHQgYmUgcmVxdWVzdGVkIGZyb20gbXVsdGlwbGUgcGxhY2VzICovCisJCWJyZWFrOwogCWNhc2UgQVRIMTBLX1NUQVRFX1JFU1RBUlRFRDoKIAkJYXItPnN0YXRlID0gQVRIMTBLX1NUQVRFX1dFREdFRDsKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC02ODEsNzAgKzY3NCw2IEBACiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiB9CiAKLXN0cnVjdCBhdGgxMGsgKmF0aDEwa19jb3JlX2NyZWF0ZSh2b2lkICpoaWZfcHJpdiwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgY29uc3Qgc3RydWN0IGF0aDEwa19oaWZfb3BzICpoaWZfb3BzKQotewotCXN0cnVjdCBhdGgxMGsgKmFyOwotCi0JYXIgPSBhdGgxMGtfbWFjX2NyZWF0ZSgpOwotCWlmICghYXIpCi0JCXJldHVybiBOVUxMOwotCi0JYXItPmF0aF9jb21tb24ucHJpdiA9IGFyOwotCWFyLT5hdGhfY29tbW9uLmh3ID0gYXItPmh3OwotCi0JYXItPnAycCA9ICEhYXRoMTBrX3AycDsKLQlhci0+ZGV2ID0gZGV2OwotCi0JYXItPmhpZi5wcml2ID0gaGlmX3ByaXY7Ci0JYXItPmhpZi5vcHMgPSBoaWZfb3BzOwotCi0JaW5pdF9jb21wbGV0aW9uKCZhci0+c2Nhbi5zdGFydGVkKTsKLQlpbml0X2NvbXBsZXRpb24oJmFyLT5zY2FuLmNvbXBsZXRlZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZhci0+c2Nhbi5vbl9jaGFubmVsKTsKLQlpbml0X2NvbXBsZXRpb24oJmFyLT50YXJnZXRfc3VzcGVuZCk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmFyLT5pbnN0YWxsX2tleV9kb25lKTsKLQlpbml0X2NvbXBsZXRpb24oJmFyLT52ZGV2X3NldHVwX2RvbmUpOwotCi0Jc2V0dXBfdGltZXIoJmFyLT5zY2FuLnRpbWVvdXQsIGF0aDEwa19yZXNldF9zY2FuLCAodW5zaWduZWQgbG9uZylhcik7Ci0KLQlhci0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDEwa193cSIpOwotCWlmICghYXItPndvcmtxdWV1ZSkKLQkJZ290byBlcnJfd3E7Ci0KLQltdXRleF9pbml0KCZhci0+Y29uZl9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFyLT5kYXRhX2xvY2spOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFyLT5wZWVycyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPnBlZXJfbWFwcGluZ193cSk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7Ci0JSU5JVF9XT1JLKCZhci0+b2ZmY2hhbl90eF93b3JrLCBhdGgxMGtfb2ZmY2hhbl90eF93b3JrKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+b2ZmY2hhbl90eF9xdWV1ZSk7Ci0KLQlJTklUX1dPUksoJmFyLT53bWlfbWdtdF90eF93b3JrLCBhdGgxMGtfbWdtdF9vdmVyX3dtaV90eF93b3JrKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+d21pX21nbXRfdHhfcXVldWUpOwotCi0JSU5JVF9XT1JLKCZhci0+cmVzdGFydF93b3JrLCBhdGgxMGtfY29yZV9yZXN0YXJ0KTsKLQotCXJldHVybiBhcjsKLQotZXJyX3dxOgotCWF0aDEwa19tYWNfZGVzdHJveShhcik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGF0aDEwa19jb3JlX2NyZWF0ZSk7Ci0KLXZvaWQgYXRoMTBrX2NvcmVfZGVzdHJveShzdHJ1Y3QgYXRoMTBrICphcikKLXsKLQlmbHVzaF93b3JrcXVldWUoYXItPndvcmtxdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUoYXItPndvcmtxdWV1ZSk7Ci0KLQlhdGgxMGtfbWFjX2Rlc3Ryb3koYXIpOwotfQotRVhQT1JUX1NZTUJPTChhdGgxMGtfY29yZV9kZXN0cm95KTsKLQogaW50IGF0aDEwa19jb3JlX3N0YXJ0KHN0cnVjdCBhdGgxMGsgKmFyKQogewogCWludCBzdGF0dXM7CkBAIC03ODUsMTAgKzcxNCwyOCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlzdGF0dXMgPSBhdGgxMGtfaHR0X2luaXQoYXIpOworCWlmIChzdGF0dXMpIHsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGluaXQgaHR0OiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnJfd21pX2RldGFjaDsKKwl9CisKKwlzdGF0dXMgPSBhdGgxMGtfaHR0X3R4X2FsbG9jKCZhci0+aHR0KTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byBhbGxvYyBodHQgdHg6ICVkXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl93bWlfZGV0YWNoOworCX0KKworCXN0YXR1cyA9IGF0aDEwa19odHRfcnhfYWxsb2MoJmFyLT5odHQpOworCWlmIChzdGF0dXMpIHsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGFsbG9jIGh0dCByeDogJWRcbiIsIHN0YXR1cyk7CisJCWdvdG8gZXJyX2h0dF90eF9kZXRhY2g7CisJfQorCiAJc3RhdHVzID0gYXRoMTBrX2hpZl9zdGFydChhcik7CiAJaWYgKHN0YXR1cykgewogCQlhdGgxMGtfZXJyKCJjb3VsZCBub3Qgc3RhcnQgSElGOiAlZFxuIiwgc3RhdHVzKTsKLQkJZ290byBlcnJfd21pX2RldGFjaDsKKwkJZ290byBlcnJfaHR0X3J4X2RldGFjaDsKIAl9CiAKIAlzdGF0dXMgPSBhdGgxMGtfaHRjX3dhaXRfdGFyZ2V0KCZhci0+aHRjKTsKQEAgLTc5NywxNSArNzQ0LDMwIEBACiAJCWdvdG8gZXJyX2hpZl9zdG9wOwogCX0KIAotCXN0YXR1cyA9IGF0aDEwa19odHRfYXR0YWNoKGFyKTsKKwlzdGF0dXMgPSBhdGgxMGtfaHR0X2Nvbm5lY3QoJmFyLT5odHQpOwogCWlmIChzdGF0dXMpIHsKLQkJYXRoMTBrX2VycigiY291bGQgbm90IGF0dGFjaCBodHQgKCVkKVxuIiwgc3RhdHVzKTsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGNvbm5lY3QgaHR0ICglZClcbiIsIHN0YXR1cyk7CiAJCWdvdG8gZXJyX2hpZl9zdG9wOwogCX0KIAotCXN0YXR1cyA9IGF0aDEwa19pbml0X2Nvbm5lY3RfaHRjKGFyKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIGVycl9odHRfZGV0YWNoOworCXN0YXR1cyA9IGF0aDEwa193bWlfY29ubmVjdChhcik7CisJaWYgKHN0YXR1cykgeworCQlhdGgxMGtfZXJyKCJjb3VsZCBub3QgY29ubmVjdCB3bWk6ICVkXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9oaWZfc3RvcDsKKwl9CisKKwlzdGF0dXMgPSBhdGgxMGtfaHRjX3N0YXJ0KCZhci0+aHRjKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byBzdGFydCBodGM6ICVkXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9oaWZfc3RvcDsKKwl9CisKKwlzdGF0dXMgPSBhdGgxMGtfd21pX3dhaXRfZm9yX3NlcnZpY2VfcmVhZHkoYXIpOworCWlmIChzdGF0dXMgPD0gMCkgeworCQlhdGgxMGtfd2Fybigid21pIHNlcnZpY2UgcmVhZHkgZXZlbnQgbm90IHJlY2VpdmVkIik7CisJCXN0YXR1cyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZXJyX2h0Y19zdG9wOworCX0KIAogCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAiZmlybXdhcmUgJXMgYm9vdGVkXG4iLAogCQkgICBhci0+aHctPndpcGh5LT5md192ZXJzaW9uKTsKQEAgLTgxMywzMSArNzc1LDM2IEBACiAJc3RhdHVzID0gYXRoMTBrX3dtaV9jbWRfaW5pdChhcik7CiAJaWYgKHN0YXR1cykgewogCQlhdGgxMGtfZXJyKCJjb3VsZCBub3Qgc2VuZCBXTUkgaW5pdCBjb21tYW5kICglZClcbiIsIHN0YXR1cyk7Ci0JCWdvdG8gZXJyX2Rpc2Nvbm5lY3RfaHRjOworCQlnb3RvIGVycl9odGNfc3RvcDsKIAl9CiAKIAlzdGF0dXMgPSBhdGgxMGtfd21pX3dhaXRfZm9yX3VuaWZpZWRfcmVhZHkoYXIpOwogCWlmIChzdGF0dXMgPD0gMCkgewogCQlhdGgxMGtfZXJyKCJ3bWkgdW5pZmllZCByZWFkeSBldmVudCBub3QgcmVjZWl2ZWRcbiIpOwogCQlzdGF0dXMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGVycl9kaXNjb25uZWN0X2h0YzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CiAJfQogCi0Jc3RhdHVzID0gYXRoMTBrX2h0dF9hdHRhY2hfdGFyZ2V0KCZhci0+aHR0KTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIGVycl9kaXNjb25uZWN0X2h0YzsKKwlzdGF0dXMgPSBhdGgxMGtfaHR0X3NldHVwKCZhci0+aHR0KTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byBzZXR1cCBodHQ6ICVkXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9odGNfc3RvcDsKKwl9CiAKIAlzdGF0dXMgPSBhdGgxMGtfZGVidWdfc3RhcnQoYXIpOwogCWlmIChzdGF0dXMpCi0JCWdvdG8gZXJyX2Rpc2Nvbm5lY3RfaHRjOworCQlnb3RvIGVycl9odGNfc3RvcDsKIAogCWFyLT5mcmVlX3ZkZXZfbWFwID0gKDEgPDwgVEFSR0VUX05VTV9WREVWUykgLSAxOwogCUlOSVRfTElTVF9IRUFEKCZhci0+YXJ2aWZzKTsKIAogCWlmICghdGVzdF9iaXQoQVRIMTBLX0ZMQUdfRklSU1RfQk9PVF9ET05FLCAmYXItPmRldl9mbGFncykpCi0JCWF0aDEwa19pbmZvKCIlcyAoMHgleCkgZncgJXMgYXBpICVkIGh0dCAlZC4lZFxuIiwKLQkJCSAgICBhci0+aHdfcGFyYW1zLm5hbWUsIGFyLT50YXJnZXRfdmVyc2lvbiwKLQkJCSAgICBhci0+aHctPndpcGh5LT5md192ZXJzaW9uLCBhci0+ZndfYXBpLAorCQlhdGgxMGtfaW5mbygiJXMgKDB4JTA4eCwgMHglMDh4KSBmdyAlcyBhcGkgJWQgaHR0ICVkLiVkXG4iLAorCQkJICAgIGFyLT5od19wYXJhbXMubmFtZSwKKwkJCSAgICBhci0+dGFyZ2V0X3ZlcnNpb24sCisJCQkgICAgYXItPmNoaXBfaWQsCisJCQkgICAgYXItPmh3LT53aXBoeS0+ZndfdmVyc2lvbiwKKwkJCSAgICBhci0+ZndfYXBpLAogCQkJICAgIGFyLT5odHQudGFyZ2V0X3ZlcnNpb25fbWFqb3IsCiAJCQkgICAgYXItPmh0dC50YXJnZXRfdmVyc2lvbl9taW5vcik7CiAKQEAgLTg0NSwxMiArODEyLDE0IEBACiAKIAlyZXR1cm4gMDsKIAotZXJyX2Rpc2Nvbm5lY3RfaHRjOgorZXJyX2h0Y19zdG9wOgogCWF0aDEwa19odGNfc3RvcCgmYXItPmh0Yyk7Ci1lcnJfaHR0X2RldGFjaDoKLQlhdGgxMGtfaHR0X2RldGFjaCgmYXItPmh0dCk7CiBlcnJfaGlmX3N0b3A6CiAJYXRoMTBrX2hpZl9zdG9wKGFyKTsKK2Vycl9odHRfcnhfZGV0YWNoOgorCWF0aDEwa19odHRfcnhfZnJlZSgmYXItPmh0dCk7CitlcnJfaHR0X3R4X2RldGFjaDoKKwlhdGgxMGtfaHR0X3R4X2ZyZWUoJmFyLT5odHQpOwogZXJyX3dtaV9kZXRhY2g6CiAJYXRoMTBrX3dtaV9kZXRhY2goYXIpOwogZXJyOgpAQCAtODg1LDEwICs4NTQsMTQgQEAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CiAKIAkvKiB0cnkgdG8gc3VzcGVuZCB0YXJnZXQgKi8KLQlhdGgxMGtfd2FpdF9mb3Jfc3VzcGVuZChhciwgV01JX1BERVZfU1VTUEVORF9BTkRfRElTQUJMRV9JTlRSKTsKKwlpZiAoYXItPnN0YXRlICE9IEFUSDEwS19TVEFURV9SRVNUQVJUSU5HKQorCQlhdGgxMGtfd2FpdF9mb3Jfc3VzcGVuZChhciwgV01JX1BERVZfU1VTUEVORF9BTkRfRElTQUJMRV9JTlRSKTsKKwogCWF0aDEwa19kZWJ1Z19zdG9wKGFyKTsKIAlhdGgxMGtfaHRjX3N0b3AoJmFyLT5odGMpOwotCWF0aDEwa19odHRfZGV0YWNoKCZhci0+aHR0KTsKKwlhdGgxMGtfaGlmX3N0b3AoYXIpOworCWF0aDEwa19odHRfdHhfZnJlZSgmYXItPmh0dCk7CisJYXRoMTBrX2h0dF9yeF9mcmVlKCZhci0+aHR0KTsKIAlhdGgxMGtfd21pX2RldGFjaChhcik7CiB9CiBFWFBPUlRfU1lNQk9MKGF0aDEwa19jb3JlX3N0b3ApOwpAQCAtOTgwLDIyICs5NTMsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDEwa19jb3JlX3JlZ2lzdGVyKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgY2hpcF9pZCkKK3N0YXRpYyB2b2lkIGF0aDEwa19jb3JlX3JlZ2lzdGVyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhdGgxMGsgKmFyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGgxMGssIHJlZ2lzdGVyX3dvcmspOwogCWludCBzdGF0dXM7CiAKLQlhci0+Y2hpcF9pZCA9IGNoaXBfaWQ7Ci0KLQlzdGF0dXMgPSBhdGgxMGtfY29yZV9jaGVja19jaGlwX2lkKGFyKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCWF0aDEwa19lcnIoIlVuc3VwcG9ydGVkIGNoaXAgaWQgMHglMDh4XG4iLCBhci0+Y2hpcF9pZCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCiAJc3RhdHVzID0gYXRoMTBrX2NvcmVfcHJvYmVfZncoYXIpOwogCWlmIChzdGF0dXMpIHsKIAkJYXRoMTBrX2VycigiY291bGQgbm90IHByb2JlIGZ3ICglZClcbiIsIHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gZXJyOwogCX0KIAogCXN0YXR1cyA9IGF0aDEwa19tYWNfcmVnaXN0ZXIoYXIpOwpAQCAtMTAxMCwxOCArOTc2LDQzIEBACiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfbWFjOwogCX0KIAotCXJldHVybiAwOworCXNldF9iaXQoQVRIMTBLX0ZMQUdfQ09SRV9SRUdJU1RFUkVELCAmYXItPmRldl9mbGFncyk7CisJcmV0dXJuOwogCiBlcnJfdW5yZWdpc3Rlcl9tYWM6CiAJYXRoMTBrX21hY191bnJlZ2lzdGVyKGFyKTsKIGVycl9yZWxlYXNlX2Z3OgogCWF0aDEwa19jb3JlX2ZyZWVfZmlybXdhcmVfZmlsZXMoYXIpOwotCXJldHVybiBzdGF0dXM7CitlcnI6CisJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGFyLT5kZXYpOworCXJldHVybjsKK30KKworaW50IGF0aDEwa19jb3JlX3JlZ2lzdGVyKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgY2hpcF9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJYXItPmNoaXBfaWQgPSBjaGlwX2lkOworCisJc3RhdHVzID0gYXRoMTBrX2NvcmVfY2hlY2tfY2hpcF9pZChhcik7CisJaWYgKHN0YXR1cykgeworCQlhdGgxMGtfZXJyKCJVbnN1cHBvcnRlZCBjaGlwIGlkIDB4JTA4eFxuIiwgYXItPmNoaXBfaWQpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXF1ZXVlX3dvcmsoYXItPndvcmtxdWV1ZSwgJmFyLT5yZWdpc3Rlcl93b3JrKTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChhdGgxMGtfY29yZV9yZWdpc3Rlcik7CiAKIHZvaWQgYXRoMTBrX2NvcmVfdW5yZWdpc3RlcihzdHJ1Y3QgYXRoMTBrICphcikKIHsKKwljYW5jZWxfd29ya19zeW5jKCZhci0+cmVnaXN0ZXJfd29yayk7CisKKwlpZiAoIXRlc3RfYml0KEFUSDEwS19GTEFHX0NPUkVfUkVHSVNURVJFRCwgJmFyLT5kZXZfZmxhZ3MpKQorCQlyZXR1cm47CisKIAkvKiBXZSBtdXN0IHVucmVnaXN0ZXIgZnJvbSBtYWM4MDIxMSBiZWZvcmUgd2Ugc3RvcCBIVEMgYW5kIEhJRi4KIAkgKiBPdGhlcndpc2Ugd2Ugd2lsbCBmYWlsIHRvIHN1Ym1pdCBjb21tYW5kcyB0byBGVyBhbmQgbWFjODAyMTEgd2lsbCBiZQogCSAqIHVuaGFwcHkgYWJvdXQgY2FsbGJhY2sgZmFpbHVyZXMuICovCkBAIC0xMDMzLDYgKzEwMjQsNzEgQEAKIH0KIEVYUE9SVF9TWU1CT0woYXRoMTBrX2NvcmVfdW5yZWdpc3Rlcik7CiAKK3N0cnVjdCBhdGgxMGsgKmF0aDEwa19jb3JlX2NyZWF0ZSh2b2lkICpoaWZfcHJpdiwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IGF0aDEwa19oaWZfb3BzICpoaWZfb3BzKQoreworCXN0cnVjdCBhdGgxMGsgKmFyOworCisJYXIgPSBhdGgxMGtfbWFjX2NyZWF0ZSgpOworCWlmICghYXIpCisJCXJldHVybiBOVUxMOworCisJYXItPmF0aF9jb21tb24ucHJpdiA9IGFyOworCWFyLT5hdGhfY29tbW9uLmh3ID0gYXItPmh3OworCisJYXItPnAycCA9ICEhYXRoMTBrX3AycDsKKwlhci0+ZGV2ID0gZGV2OworCisJYXItPmhpZi5wcml2ID0gaGlmX3ByaXY7CisJYXItPmhpZi5vcHMgPSBoaWZfb3BzOworCisJaW5pdF9jb21wbGV0aW9uKCZhci0+c2Nhbi5zdGFydGVkKTsKKwlpbml0X2NvbXBsZXRpb24oJmFyLT5zY2FuLmNvbXBsZXRlZCk7CisJaW5pdF9jb21wbGV0aW9uKCZhci0+c2Nhbi5vbl9jaGFubmVsKTsKKwlpbml0X2NvbXBsZXRpb24oJmFyLT50YXJnZXRfc3VzcGVuZCk7CisKKwlpbml0X2NvbXBsZXRpb24oJmFyLT5pbnN0YWxsX2tleV9kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJmFyLT52ZGV2X3NldHVwX2RvbmUpOworCisJc2V0dXBfdGltZXIoJmFyLT5zY2FuLnRpbWVvdXQsIGF0aDEwa19yZXNldF9zY2FuLCAodW5zaWduZWQgbG9uZylhcik7CisKKwlhci0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDEwa193cSIpOworCWlmICghYXItPndvcmtxdWV1ZSkKKwkJZ290byBlcnJfd3E7CisKKwltdXRleF9pbml0KCZhci0+Y29uZl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmFyLT5kYXRhX2xvY2spOworCisJSU5JVF9MSVNUX0hFQUQoJmFyLT5wZWVycyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPnBlZXJfbWFwcGluZ193cSk7CisKKwlpbml0X2NvbXBsZXRpb24oJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7CisJSU5JVF9XT1JLKCZhci0+b2ZmY2hhbl90eF93b3JrLCBhdGgxMGtfb2ZmY2hhbl90eF93b3JrKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+b2ZmY2hhbl90eF9xdWV1ZSk7CisKKwlJTklUX1dPUksoJmFyLT53bWlfbWdtdF90eF93b3JrLCBhdGgxMGtfbWdtdF9vdmVyX3dtaV90eF93b3JrKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+d21pX21nbXRfdHhfcXVldWUpOworCisJSU5JVF9XT1JLKCZhci0+cmVnaXN0ZXJfd29yaywgYXRoMTBrX2NvcmVfcmVnaXN0ZXJfd29yayk7CisJSU5JVF9XT1JLKCZhci0+cmVzdGFydF93b3JrLCBhdGgxMGtfY29yZV9yZXN0YXJ0KTsKKworCXJldHVybiBhcjsKKworZXJyX3dxOgorCWF0aDEwa19tYWNfZGVzdHJveShhcik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGF0aDEwa19jb3JlX2NyZWF0ZSk7CisKK3ZvaWQgYXRoMTBrX2NvcmVfZGVzdHJveShzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlmbHVzaF93b3JrcXVldWUoYXItPndvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUoYXItPndvcmtxdWV1ZSk7CisKKwlhdGgxMGtfbWFjX2Rlc3Ryb3koYXIpOworfQorRVhQT1JUX1NZTUJPTChhdGgxMGtfY29yZV9kZXN0cm95KTsKKwogTU9EVUxFX0FVVEhPUigiUXVhbGNvbW0gQXRoZXJvcyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JlIG1vZHVsZSBmb3IgUUNBOTg4WCBQQ0llIGRldmljZXMuIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5oCmluZGV4IDBlNzE5NzkuLjY4Y2VlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5oCkBAIC0xMTksNiArMTE5LDcgQEAKIAl1OCBwZWVyX21hY2FkZHJbRVRIX0FMRU5dOwogCXUzMiBwZWVyX3Jzc2k7CiAJdTMyIHBlZXJfdHhfcmF0ZTsKKwl1MzIgcGVlcl9yeF9yYXRlOyAvKiAxMHggb25seSAqLwogfTsKIAogc3RydWN0IGF0aDEwa190YXJnZXRfc3RhdHMgewpAQCAtMTMwLDYgKzEzMSwxMiBAQAogCXUzMiBjeWNsZV9jb3VudDsKIAl1MzIgcGh5X2Vycl9jb3VudDsKIAl1MzIgY2hhbl90eF9wb3dlcjsKKwl1MzIgYWNrX3J4X2JhZDsKKwl1MzIgcnRzX2JhZDsKKwl1MzIgcnRzX2dvb2Q7CisJdTMyIGZjc19iYWQ7CisJdTMyIG5vX2JlYWNvbnM7CisJdTMyIG1pYl9pbnRfY291bnQ7CiAKIAkvKiBQREVWIFRYIHN0YXRzICovCiAJczMyIGNvbXBfcXVldWVkOwpAQCAtMjYwLDYgKzI2Nyw4IEBACiAJdTggZml4ZWRfcmF0ZTsKIAl1OCBmaXhlZF9uc3M7CiAJdTggZm9yY2Vfc2dpOworCWJvb2wgdXNlX2N0c19wcm90OworCWludCBudW1fbGVnYWN5X3N0YXRpb25zOwogfTsKIAogc3RydWN0IGF0aDEwa192aWZfaXRlciB7CkBAIC0zMjYsNiArMzM1LDcgQEAKIAkvKiBJbmRpY2F0ZXMgdGhhdCBhdGgxMGsgZGV2aWNlIGlzIGR1cmluZyBDQUMgcGhhc2Ugb2YgREZTICovCiAJQVRIMTBLX0NBQ19SVU5OSU5HLAogCUFUSDEwS19GTEFHX0ZJUlNUX0JPT1RfRE9ORSwKKwlBVEgxMEtfRkxBR19DT1JFX1JFR0lTVEVSRUQsCiB9OwogCiBzdHJ1Y3QgYXRoMTBrIHsKQEAgLTQxOSwxMyArNDI5LDI0IEBACiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAKIAlpbnQgZnJlZV92ZGV2X21hcDsKKwlib29sIHByb21pc2M7CisJYm9vbCBtb25pdG9yOwogCWludCBtb25pdG9yX3ZkZXZfaWQ7Ci0JYm9vbCBtb25pdG9yX2VuYWJsZWQ7Ci0JYm9vbCBtb25pdG9yX3ByZXNlbnQ7CisJYm9vbCBtb25pdG9yX3N0YXJ0ZWQ7CiAJdW5zaWduZWQgaW50IGZpbHRlcl9mbGFnczsKIAl1bnNpZ25lZCBsb25nIGRldl9mbGFnczsKIAl1MzIgZGZzX2Jsb2NrX3JhZGFyX2V2ZW50czsKIAorCS8qIHByb3RlY3RlZCBieSBjb25mX211dGV4ICovCisJYm9vbCByYWRhcl9lbmFibGVkOworCWludCBudW1fc3RhcnRlZF92ZGV2czsKKworCS8qIFByb3RlY3RlZCBieSBjb25mLW11dGV4ICovCisJdTggc3VwcF90eF9jaGFpbm1hc2s7CisJdTggc3VwcF9yeF9jaGFpbm1hc2s7CisJdTggY2ZnX3R4X2NoYWlubWFzazsKKwl1OCBjZmdfcnhfY2hhaW5tYXNrOworCiAJc3RydWN0IHdtaV9wZGV2X3NldF93bW1fcGFyYW1zX2FyZyB3bW1fcGFyYW1zOwogCXN0cnVjdCBjb21wbGV0aW9uIGluc3RhbGxfa2V5X2RvbmU7CiAKQEAgLTQ1Niw2ICs0NzcsNyBAQAogCiAJZW51bSBhdGgxMGtfc3RhdGUgc3RhdGU7CiAKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVnaXN0ZXJfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdGFydF93b3JrOwogCiAJLyogY3ljbGUgY291bnQgaXMgcmVwb3J0ZWQgdHdpY2UgZm9yIGVhY2ggdmlzaXRlZCBjaGFubmVsIGR1cmluZyBzY2FuLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCmluZGV4IDZkZWJkMjguLjFiN2ZmNGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAl1OCAqdG1wID0gZXYtPmRhdGE7CiAJc3RydWN0IGF0aDEwa190YXJnZXRfc3RhdHMgKnN0YXRzOwogCWludCBudW1fcGRldl9zdGF0cywgbnVtX3ZkZXZfc3RhdHMsIG51bV9wZWVyX3N0YXRzOwotCXN0cnVjdCB3bWlfcGRldl9zdGF0cyAqcHM7CisJc3RydWN0IHdtaV9wZGV2X3N0YXRzXzEweCAqcHM7CiAJaW50IGk7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJbnVtX3BlZXJfc3RhdHMgPSBfX2xlMzJfdG9fY3B1KGV2LT5udW1fcGVlcl9zdGF0cyk7IC8qIDAgb3IgbWF4IHBlZXJzICovCiAKIAlpZiAobnVtX3BkZXZfc3RhdHMpIHsKLQkJcHMgPSAoc3RydWN0IHdtaV9wZGV2X3N0YXRzICopdG1wOworCQlwcyA9IChzdHJ1Y3Qgd21pX3BkZXZfc3RhdHNfMTB4ICopdG1wOwogCiAJCXN0YXRzLT5jaF9ub2lzZV9mbG9vciA9IF9fbGUzMl90b19jcHUocHMtPmNoYW5fbmYpOwogCQlzdGF0cy0+dHhfZnJhbWVfY291bnQgPSBfX2xlMzJfdG9fY3B1KHBzLT50eF9mcmFtZV9jb3VudCk7CkBAIC0yMjgsNyArMjI4LDE4IEBACiAJCXN0YXRzLT5waHlfZXJyX2Ryb3AgPSBfX2xlMzJfdG9fY3B1KHBzLT53YWwucngucGh5X2Vycl9kcm9wKTsKIAkJc3RhdHMtPm1wZHVfZXJycyA9IF9fbGUzMl90b19jcHUocHMtPndhbC5yeC5tcGR1X2VycnMpOwogCi0JCXRtcCArPSBzaXplb2Yoc3RydWN0IHdtaV9wZGV2X3N0YXRzKTsKKwkJaWYgKHRlc3RfYml0KEFUSDEwS19GV19GRUFUVVJFX1dNSV8xMFgsCisJCQkgICAgIGFyLT5md19mZWF0dXJlcykpIHsKKwkJCXN0YXRzLT5hY2tfcnhfYmFkID0gX19sZTMyX3RvX2NwdShwcy0+YWNrX3J4X2JhZCk7CisJCQlzdGF0cy0+cnRzX2JhZCA9IF9fbGUzMl90b19jcHUocHMtPnJ0c19iYWQpOworCQkJc3RhdHMtPnJ0c19nb29kID0gX19sZTMyX3RvX2NwdShwcy0+cnRzX2dvb2QpOworCQkJc3RhdHMtPmZjc19iYWQgPSBfX2xlMzJfdG9fY3B1KHBzLT5mY3NfYmFkKTsKKwkJCXN0YXRzLT5ub19iZWFjb25zID0gX19sZTMyX3RvX2NwdShwcy0+bm9fYmVhY29ucyk7CisJCQlzdGF0cy0+bWliX2ludF9jb3VudCA9IF9fbGUzMl90b19jcHUocHMtPm1pYl9pbnRfY291bnQpOworCQkJdG1wICs9IHNpemVvZihzdHJ1Y3Qgd21pX3BkZXZfc3RhdHNfMTB4KTsKKwkJfSBlbHNlIHsKKwkJCXRtcCArPSBzaXplb2Yoc3RydWN0IHdtaV9wZGV2X3N0YXRzX29sZCk7CisJCX0KIAl9CiAKIAkvKiAwIG9yIG1heCB2ZGV2cyAqLwpAQCAtMjQzLDIyICsyNTQsMjkgQEAKIAl9CiAKIAlpZiAobnVtX3BlZXJfc3RhdHMpIHsKLQkJc3RydWN0IHdtaV9wZWVyX3N0YXRzICpwZWVyX3N0YXRzOworCQlzdHJ1Y3Qgd21pX3BlZXJfc3RhdHNfMTB4ICpwZWVyX3N0YXRzOwogCQlzdHJ1Y3QgYXRoMTBrX3BlZXJfc3RhdCAqczsKIAogCQlzdGF0cy0+cGVlcnMgPSBudW1fcGVlcl9zdGF0czsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BlZXJfc3RhdHM7IGkrKykgewotCQkJcGVlcl9zdGF0cyA9IChzdHJ1Y3Qgd21pX3BlZXJfc3RhdHMgKil0bXA7CisJCQlwZWVyX3N0YXRzID0gKHN0cnVjdCB3bWlfcGVlcl9zdGF0c18xMHggKil0bXA7CiAJCQlzID0gJnN0YXRzLT5wZWVyX3N0YXRbaV07CiAKLQkJCVdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKCZwZWVyX3N0YXRzLT5wZWVyX21hY2FkZHIsCi0JCQkJCQkgICBzLT5wZWVyX21hY2FkZHIpOworCQkJbWVtY3B5KHMtPnBlZXJfbWFjYWRkciwgJnBlZXJfc3RhdHMtPnBlZXJfbWFjYWRkci5hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCXMtPnBlZXJfcnNzaSA9IF9fbGUzMl90b19jcHUocGVlcl9zdGF0cy0+cGVlcl9yc3NpKTsKIAkJCXMtPnBlZXJfdHhfcmF0ZSA9CiAJCQkJX19sZTMyX3RvX2NwdShwZWVyX3N0YXRzLT5wZWVyX3R4X3JhdGUpOworCQkJaWYgKHRlc3RfYml0KEFUSDEwS19GV19GRUFUVVJFX1dNSV8xMFgsCisJCQkJICAgICBhci0+ZndfZmVhdHVyZXMpKSB7CisJCQkJcy0+cGVlcl9yeF9yYXRlID0KKwkJCQkJX19sZTMyX3RvX2NwdShwZWVyX3N0YXRzLT5wZWVyX3J4X3JhdGUpOworCQkJCXRtcCArPSBzaXplb2Yoc3RydWN0IHdtaV9wZWVyX3N0YXRzXzEweCk7CiAKLQkJCXRtcCArPSBzaXplb2Yoc3RydWN0IHdtaV9wZWVyX3N0YXRzKTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wICs9IHNpemVvZihzdHJ1Y3Qgd21pX3BlZXJfc3RhdHNfb2xkKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMjcyLDcgKzI5MCw3IEBACiAJc3RydWN0IGF0aDEwayAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGF0aDEwa190YXJnZXRfc3RhdHMgKmZ3X3N0YXRzOwogCWNoYXIgKmJ1ZiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGxlbiA9IDAsIGJ1Zl9sZW4gPSAyNTAwOworCXVuc2lnbmVkIGludCBsZW4gPSAwLCBidWZfbGVuID0gODAwMDsKIAlzc2l6ZV90IHJldF9jbnQgPSAwOwogCWxvbmcgbGVmdDsKIAlpbnQgaTsKQEAgLTMyMCw2ICszMzgsMTYgQEAKIAkJCSAiQ3ljbGUgY291bnQiLCBmd19zdGF0cy0+Y3ljbGVfY291bnQpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAlMTB1XG4iLAogCQkJICJQSFkgZXJyb3IgY291bnQiLCBmd19zdGF0cy0+cGh5X2Vycl9jb3VudCk7CisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMzBzICUxMHVcbiIsCisJCQkgIlJUUyBiYWQgY291bnQiLCBmd19zdGF0cy0+cnRzX2JhZCk7CisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMzBzICUxMHVcbiIsCisJCQkgIlJUUyBnb29kIGNvdW50IiwgZndfc3RhdHMtPnJ0c19nb29kKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgJTEwdVxuIiwKKwkJCSAiRkNTIGJhZCBjb3VudCIsIGZ3X3N0YXRzLT5mY3NfYmFkKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgJTEwdVxuIiwKKwkJCSAiTm8gYmVhY29uIGNvdW50IiwgZndfc3RhdHMtPm5vX2JlYWNvbnMpOworCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAlMTB1XG4iLAorCQkJICJNSUIgaW50IGNvdW50IiwgZndfc3RhdHMtPm1pYl9pbnRfY291bnQpOwogCiAJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICJcbiIpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwc1xuIiwKQEAgLTQxMSw4ICs0MzksOCBAQAogCQkJICJNUERVIGVycm9ycyAoRkNTLCBNSUMsIEVOQykiLCBmd19zdGF0cy0+bXBkdV9lcnJzKTsKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHNcbiIsCi0JCQkgImF0aDEwayBQRUVSIHN0YXRzIik7CisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMzBzICglZClcbiIsCisJCQkgImF0aDEwayBQRUVSIHN0YXRzIiwgZndfc3RhdHMtPnBlZXJzKTsKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHNcblxuIiwKIAkJCQkgIj09PT09PT09PT09PT09PT09Iik7CiAKQEAgLTQyNSw2ICs0NTMsOSBAQAogCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgJXVcbiIsCiAJCQkJICJQZWVyIFRYIHJhdGUiLAogCQkJCSBmd19zdGF0cy0+cGVlcl9zdGF0W2ldLnBlZXJfdHhfcmF0ZSk7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgIlBlZXIgUlggcmF0ZSIsCisJCQkJIGZ3X3N0YXRzLT5wZWVyX3N0YXRbaV0ucGVlcl9yeF9yYXRlKTsKIAkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICJcbiIpOwogCX0KIAlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CkBAIC00NTEsMjcgKzQ4MiwzNyBAQAogCQkJCQkgICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQljb25zdCBjaGFyIGJ1ZltdID0gIlRvIHNpbXVsYXRlIGZpcm13YXJlIGNyYXNoIHdyaXRlIHRoZSBrZXl3b3JkIgotCQkJICAgIiBgY3Jhc2hgIHRvIHRoaXMgZmlsZS5cblRoaXMgd2lsbCBmb3JjZSBmaXJtd2FyZSIKLQkJCSAgICIgdG8gcmVwb3J0IGEgY3Jhc2ggdG8gdGhlIGhvc3Qgc3lzdGVtLlxuIjsKKwljb25zdCBjaGFyIGJ1ZltdID0gIlRvIHNpbXVsYXRlIGZpcm13YXJlIGNyYXNoIHdyaXRlIG9uZSBvZiB0aGUiCisJCQkgICAiIGtleXdvcmRzIHRvIHRoaXMgZmlsZTpcbiBgc29mdGAgLSB0aGlzIHdpbGwgc2VuZCIKKwkJCSAgICIgV01JX0ZPUkNFX0ZXX0hBTkdfQVNTRVJUIHRvIGZpcm13YXJlIGlmIEZXIgorCQkJICAgIiBzdXBwb3J0cyB0aGF0IGNvbW1hbmQuXG4gYGhhcmRgIC0gdGhpcyB3aWxsIHNlbmQiCisJCQkgICAiIHRvIGZpcm13YXJlIGNvbW1hbmQgd2l0aCBpbGxlZ2FsIHBhcmFtZXRlcnMiCisJCQkgICAiIGNhdXNpbmcgZmlybXdhcmUgY3Jhc2guXG4iOworCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBzdHJsZW4oYnVmKSk7CiB9CiAKKy8qIFNpbXVsYXRlIGZpcm13YXJlIGNyYXNoOgorICogJ3NvZnQnOiBDYWxsIHdtaSBjb21tYW5kIGNhdXNpbmcgZmlybXdhcmUgaGFuZy4gVGhpcyBmaXJtd2FyZSBoYW5nIGlzCisgKiByZWNvdmVyYWJsZSBieSB3YXJtIGZpcm13YXJlIHJlc2V0LgorICogJ2hhcmQnOiBGb3JjZSBmaXJtd2FyZSBjcmFzaCBieSBzZXR0aW5nIGFueSB2ZGV2IHBhcmFtZXRlciBmb3Igbm90IGFsbG93ZWQKKyAqIHZkZXYgaWQuIFRoaXMgaXMgaGFyZCBmaXJtd2FyZSBjcmFzaCBiZWNhdXNlIGl0IGlzIHJlY292ZXJhYmxlIG9ubHkgYnkgY29sZAorICogZmlybXdhcmUgcmVzZXQuCisgKi8KIHN0YXRpYyBzc2l6ZV90IGF0aDEwa193cml0ZV9zaW11bGF0ZV9md19jcmFzaChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1ZlszMl0gPSB7fTsKKwljaGFyIGJ1ZlszMl07CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKIAogCXNpbXBsZV93cml0ZV90b19idWZmZXIoYnVmLCBzaXplb2YoYnVmKSAtIDEsIHBwb3MsIHVzZXJfYnVmLCBjb3VudCk7Ci0JaWYgKHN0cmNtcChidWYsICJjcmFzaCIpICYmIHN0cmNtcChidWYsICJjcmFzaFxuIikpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KKworCS8qIG1ha2Ugc3VyZSB0aGF0IGJ1ZiBpcyBudWxsIHRlcm1pbmF0ZWQgKi8KKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CiAKIAlpZiAoYXItPnN0YXRlICE9IEFUSDEwS19TVEFURV9PTiAmJgogCSAgICBhci0+c3RhdGUgIT0gQVRIMTBLX1NUQVRFX1JFU1RBUlRFRCkgewpAQCAtNDc5LDE0ICs1MjAsMzAgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWF0aDEwa19pbmZvKCJzaW11bGF0aW5nIGZpcm13YXJlIGNyYXNoXG4iKTsKKwkvKiBkcm9wIHRoZSBwb3NzaWJsZSAnXG4nIGZyb20gdGhlIGVuZCAqLworCWlmIChidWZbY291bnQgLSAxXSA9PSAnXG4nKSB7CisJCWJ1Zltjb3VudCAtIDFdID0gMDsKKwkJY291bnQtLTsKKwl9CiAKLQlyZXQgPSBhdGgxMGtfd21pX2ZvcmNlX2Z3X2hhbmcoYXIsIFdNSV9GT1JDRV9GV19IQU5HX0FTU0VSVCwgMCk7Ci0JaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBmb3JjZSBmdyBoYW5nICglZClcbiIsIHJldCk7CisJaWYgKCFzdHJjbXAoYnVmLCAic29mdCIpKSB7CisJCWF0aDEwa19pbmZvKCJzaW11bGF0aW5nIHNvZnQgZmlybXdhcmUgY3Jhc2hcbiIpOworCQlyZXQgPSBhdGgxMGtfd21pX2ZvcmNlX2Z3X2hhbmcoYXIsIFdNSV9GT1JDRV9GV19IQU5HX0FTU0VSVCwgMCk7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImhhcmQiKSkgeworCQlhdGgxMGtfaW5mbygic2ltdWxhdGluZyBoYXJkIGZpcm13YXJlIGNyYXNoXG4iKTsKKwkJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3NldF9wYXJhbShhciwgVEFSR0VUX05VTV9WREVWUyArIDEsCisJCQkJCWFyLT53bWkudmRldl9wYXJhbS0+cnRzX3RocmVzaG9sZCwgMCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KIAotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gY291bnQ7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNpbXVsYXRlIGZpcm13YXJlIGNyYXNoOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCXJldCA9IGNvdW50OwogCiBleGl0OgogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHRjLmMKaW5kZXggN2YxYmNjZC4uZTQ5M2RiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0Yy5jCkBAIC0xNTcsNiArMTU3LDkgQEAKIAkJCWdvdG8gZXJyX3B1bGw7CiAJCX0KIAkJZXAtPnR4X2NyZWRpdHMgLT0gY3JlZGl0czsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUQywKKwkJCSAgICJodGMgZXAgJWQgY29uc3VtZWQgJWQgY3JlZGl0cyAodG90YWwgJWQpXG4iLAorCQkJICAgZWlkLCBjcmVkaXRzLCBlcC0+dHhfY3JlZGl0cyk7CiAJCXNwaW5fdW5sb2NrX2JoKCZodGMtPnR4X2xvY2spOwogCX0KIApAQCAtMTg1LDYgKzE4OCw5IEBACiAJaWYgKGVwLT50eF9jcmVkaXRfZmxvd19lbmFibGVkKSB7CiAJCXNwaW5fbG9ja19iaCgmaHRjLT50eF9sb2NrKTsKIAkJZXAtPnR4X2NyZWRpdHMgKz0gY3JlZGl0czsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUQywKKwkJCSAgICJodGMgZXAgJWQgcmV2ZXJ0ZWQgJWQgY3JlZGl0cyBiYWNrICh0b3RhbCAlZClcbiIsCisJCQkgICBlaWQsIGNyZWRpdHMsIGVwLT50eF9jcmVkaXRzKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmh0Yy0+dHhfbG9jayk7CiAKIAkJaWYgKGVwLT5lcF9vcHMuZXBfdHhfY3JlZGl0cykKQEAgLTIzNCwxMiArMjQwLDEyIEBACiAJCWlmIChyZXBvcnQtPmVpZCA+PSBBVEgxMEtfSFRDX0VQX0NPVU5UKQogCQkJYnJlYWs7CiAKLQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUQywgImVwICVkIGdvdCAlZCBjcmVkaXRzXG4iLAotCQkJICAgcmVwb3J0LT5laWQsIHJlcG9ydC0+Y3JlZGl0cyk7Ci0KIAkJZXAgPSAmaHRjLT5lbmRwb2ludFtyZXBvcnQtPmVpZF07CiAJCWVwLT50eF9jcmVkaXRzICs9IHJlcG9ydC0+Y3JlZGl0czsKIAorCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfSFRDLCAiaHRjIGVwICVkIGdvdCAlZCBjcmVkaXRzICh0b3RhbCAlZClcbiIsCisJCQkgICByZXBvcnQtPmVpZCwgcmVwb3J0LT5jcmVkaXRzLCBlcC0+dHhfY3JlZGl0cyk7CisKIAkJaWYgKGVwLT5lcF9vcHMuZXBfdHhfY3JlZGl0cykgewogCQkJc3Bpbl91bmxvY2tfYmgoJmh0Yy0+dHhfbG9jayk7CiAJCQllcC0+ZXBfb3BzLmVwX3R4X2NyZWRpdHMoaHRjLT5hcik7CkBAIC04MjQsMTcgKzgzMCwxMSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogc3RvcCBIVEMgY29tbXVuaWNhdGlvbnMsIGkuZS4gc3RvcCBpbnRlcnJ1cHQgcmVjZXB0aW9uLCBhbmQgZmx1c2ggYWxsCi0gKiBxdWV1ZWQgYnVmZmVycwotICovCiB2b2lkIGF0aDEwa19odGNfc3RvcChzdHJ1Y3QgYXRoMTBrX2h0YyAqaHRjKQogewogCXNwaW5fbG9ja19iaCgmaHRjLT50eF9sb2NrKTsKIAlodGMtPnN0b3BwZWQgPSB0cnVlOwogCXNwaW5fdW5sb2NrX2JoKCZodGMtPnR4X2xvY2spOwotCi0JYXRoMTBrX2hpZl9zdG9wKGh0Yy0+YXIpOwogfQogCiAvKiByZWdpc3RlcmVkIHRhcmdldCBhcnJpdmFsIGNhbGxiYWNrIGZyb20gdGhlIEhJRiBsYXllciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmMKaW5kZXggNjk2OTdhZjUuLjE5YzEyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1zdGF0aWMgaW50IGF0aDEwa19odHRfaHRjX2F0dGFjaChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQoraW50IGF0aDEwa19odHRfY29ubmVjdChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQogewogCXN0cnVjdCBhdGgxMGtfaHRjX3N2Y19jb25uX3JlcSBjb25uX3JlcTsKIAlzdHJ1Y3QgYXRoMTBrX2h0Y19zdmNfY29ubl9yZXNwIGNvbm5fcmVzcDsKQEAgLTQ4LDM5ICs0OCwxNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoMTBrX2h0dF9hdHRhY2goc3RydWN0IGF0aDEwayAqYXIpCitpbnQgYXRoMTBrX2h0dF9pbml0KHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKLQlpbnQgcmV0OwogCiAJaHR0LT5hciA9IGFyOwogCWh0dC0+bWF4X3Rocm91Z2hwdXRfbWJwcyA9IDgwMDsKIAogCS8qCi0JICogQ29ubmVjdCB0byBIVEMgc2VydmljZS4KLQkgKiBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIGF0aDEwa19odHRfcnhfYXR0YWNoLAotCSAqIHNpbmNlIGF0aDEwa19odHRfcnhfYXR0YWNoIGludm9sdmVzIHNlbmRpbmcgYSByeCByaW5nIGNvbmZpZ3VyZQotCSAqIG1lc3NhZ2UgdG8gdGhlIHRhcmdldC4KLQkgKi8KLQlyZXQgPSBhdGgxMGtfaHR0X2h0Y19hdHRhY2goaHR0KTsKLQlpZiAocmV0KSB7Ci0JCWF0aDEwa19lcnIoImNvdWxkIG5vdCBhdHRhY2ggaHR0IGh0YyAoJWQpXG4iLCByZXQpOwotCQlnb3RvIGVycl9odGNfYXR0YWNoOwotCX0KLQotCXJldCA9IGF0aDEwa19odHRfdHhfYXR0YWNoKGh0dCk7Ci0JaWYgKHJldCkgewotCQlhdGgxMGtfZXJyKCJjb3VsZCBub3QgYXR0YWNoIGh0dCB0eCAoJWQpXG4iLCByZXQpOwotCQlnb3RvIGVycl9odGNfYXR0YWNoOwotCX0KLQotCXJldCA9IGF0aDEwa19odHRfcnhfYXR0YWNoKGh0dCk7Ci0JaWYgKHJldCkgewotCQlhdGgxMGtfZXJyKCJjb3VsZCBub3QgYXR0YWNoIGh0dCByeCAoJWQpXG4iLCByZXQpOwotCQlnb3RvIGVycl9yeF9hdHRhY2g7Ci0JfQotCi0JLyoKIAkgKiBQcmVmZXRjaCBlbm91Z2ggZGF0YSB0byBzYXRpc2Z5IHRhcmdldAogCSAqIGNsYXNzaWZpY2F0aW9uIGVuZ2luZS4KIAkgKiBUaGlzIGlzIGZvciBMTCBjaGlwcy4gSEwgY2hpcHMgd2lsbCBwcm9iYWJseQpAQCAtOTMsMTEgKzY4LDYgQEAKIAkJMjsgLyogaXA0IGRzY3Agb3IgaXA2IHByaW9yaXR5ICovCiAKIAlyZXR1cm4gMDsKLQotZXJyX3J4X2F0dGFjaDoKLQlhdGgxMGtfaHR0X3R4X2RldGFjaChodHQpOwotZXJyX2h0Y19hdHRhY2g6Ci0JcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBIVFRfVEFSR0VUX1ZFUlNJT05fVElNRU9VVF9IWiAoMypIWikKQEAgLTExNyw3ICs4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGgxMGtfaHR0X2F0dGFjaF90YXJnZXQoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKK2ludCBhdGgxMGtfaHR0X3NldHVwKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJaW50IHN0YXR1czsKIApAQCAtMTQwLDkgKzExMCwzIEBACiAKIAlyZXR1cm4gYXRoMTBrX2h0dF9zZW5kX3J4X3JpbmdfY2ZnX2xsKGh0dCk7CiB9Ci0KLXZvaWQgYXRoMTBrX2h0dF9kZXRhY2goc3RydWN0IGF0aDEwa19odHQgKmh0dCkKLXsKLQlhdGgxMGtfaHR0X3J4X2RldGFjaChodHQpOwotCWF0aDEwa19odHRfdHhfZGV0YWNoKGh0dCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuaAppbmRleCA2NTQ4NjdmLi45YTI2MzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJodGMuaCIKICNpbmNsdWRlICJyeF9kZXNjLmgiCkBAIC0xMTcyLDIzICsxMTczLDYgQEAKIAl1MTYgcGVlcl9pZDsKIH07CiAKLXN0cnVjdCBodHRfcnhfaW5mbyB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQllbnVtIGh0dF9yeF9tcGR1X3N0YXR1cyBzdGF0dXM7Ci0JZW51bSBodHRfcnhfbXBkdV9lbmNyeXB0X3R5cGUgZW5jcnlwdF90eXBlOwotCXM4IHNpZ25hbDsKLQlzdHJ1Y3QgewotCQl1OCBpbmZvMDsKLQkJdTMyIGluZm8xOwotCQl1MzIgaW5mbzI7Ci0JfSByYXRlOwotCi0JdTMyIHRzZjsKLQlib29sIGZjc19lcnI7Ci0JYm9vbCBhbXNkdV9tb3JlOwotCWJvb2wgbWljX2VycjsKLX07Ci0KIHN0cnVjdCBhdGgxMGtfaHR0X3R4YnVmIHsKIAlzdHJ1Y3QgaHR0X2RhdGFfdHhfZGVzY19mcmFnIGZyYWdzWzJdOwogCXN0cnVjdCBhdGgxMGtfaHRjX2hkciBodGNfaGRyOwpAQCAtMTI4OSw2ICsxMjczLDkgQEAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhyeF9jb21wbF90YXNrOwogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfY29tcGxfcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2NvbXBsX3E7CisKKwkvKiByeF9zdGF0dXMgdGVtcGxhdGUgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CiB9OwogCiAjZGVmaW5lIFJYX0hUVF9IRFJfU1RBVFVTX0xFTiA2NApAQCAtMTM0MSwxNCArMTMyOCwxNiBAQAogI2RlZmluZSBIVFRfTE9HMl9NQVhfQ0FDSEVfTElORV9TSVpFIDcJLyogMl43ID0gMTI4ICovCiAjZGVmaW5lIEhUVF9NQVhfQ0FDSEVfTElORV9TSVpFX01BU0sgKCgxIDw8IEhUVF9MT0cyX01BWF9DQUNIRV9MSU5FX1NJWkUpIC0gMSkKIAotaW50IGF0aDEwa19odHRfYXR0YWNoKHN0cnVjdCBhdGgxMGsgKmFyKTsKLWludCBhdGgxMGtfaHR0X2F0dGFjaF90YXJnZXQoc3RydWN0IGF0aDEwa19odHQgKmh0dCk7Ci12b2lkIGF0aDEwa19odHRfZGV0YWNoKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpOworaW50IGF0aDEwa19odHRfY29ubmVjdChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KTsKK2ludCBhdGgxMGtfaHR0X2luaXQoc3RydWN0IGF0aDEwayAqYXIpOworaW50IGF0aDEwa19odHRfc2V0dXAoc3RydWN0IGF0aDEwa19odHQgKmh0dCk7CiAKLWludCBhdGgxMGtfaHR0X3R4X2F0dGFjaChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KTsKLXZvaWQgYXRoMTBrX2h0dF90eF9kZXRhY2goc3RydWN0IGF0aDEwa19odHQgKmh0dCk7Ci1pbnQgYXRoMTBrX2h0dF9yeF9hdHRhY2goc3RydWN0IGF0aDEwa19odHQgKmh0dCk7Ci12b2lkIGF0aDEwa19odHRfcnhfZGV0YWNoKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpOworaW50IGF0aDEwa19odHRfdHhfYWxsb2Moc3RydWN0IGF0aDEwa19odHQgKmh0dCk7Cit2b2lkIGF0aDEwa19odHRfdHhfZnJlZShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KTsKKworaW50IGF0aDEwa19odHRfcnhfYWxsb2Moc3RydWN0IGF0aDEwa19odHQgKmh0dCk7Cit2b2lkIGF0aDEwa19odHRfcnhfZnJlZShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KTsKKwogdm9pZCBhdGgxMGtfaHR0X2h0Y190eF9jb21wbGV0ZShzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGF0aDEwa19odHRfdDJoX21zZ19oYW5kbGVyKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBhdGgxMGtfaHR0X2gydF92ZXJfcmVxX21zZyhzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jCmluZGV4IGNkY2JlMmQuLjZjMTAyYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYwpAQCAtMjI1LDEwICsyMjUsMjYgQEAKIAlhdGgxMGtfaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0KTsKIH0KIAotdm9pZCBhdGgxMGtfaHR0X3J4X2RldGFjaChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQorc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF9yaW5nX2NsZWFuX3VwKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7Ci0JaW50IHN3X3JkX2lkeCA9IGh0dC0+cnhfcmluZy5zd19yZF9pZHgubXNkdV9wYXlsZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOwogCisJZm9yIChpID0gMDsgaSA8IGh0dC0+cnhfcmluZy5zaXplOyBpKyspIHsKKwkJc2tiID0gaHR0LT5yeF9yaW5nLm5ldGJ1ZnNfcmluZ1tpXTsKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKGh0dC0+YXItPmRldiwgQVRIMTBLX1NLQl9DQihza2IpLT5wYWRkciwKKwkJCQkgc2tiLT5sZW4gKyBza2JfdGFpbHJvb20oc2tiKSwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaHR0LT5yeF9yaW5nLm5ldGJ1ZnNfcmluZ1tpXSA9IE5VTEw7CisJfQorfQorCit2b2lkIGF0aDEwa19odHRfcnhfZnJlZShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQorewogCWRlbF90aW1lcl9zeW5jKCZodHQtPnJ4X3JpbmcucmVmaWxsX3JldHJ5X3RpbWVyKTsKIAl0YXNrbGV0X2tpbGwoJmh0dC0+cnhfcmVwbGVuaXNoX3Rhc2spOwogCXRhc2tsZXRfa2lsbCgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwpAQCAtMjM2LDE4ICsyNTIsNyBAQAogCXNrYl9xdWV1ZV9wdXJnZSgmaHR0LT50eF9jb21wbF9xKTsKIAlza2JfcXVldWVfcHVyZ2UoJmh0dC0+cnhfY29tcGxfcSk7CiAKLQl3aGlsZSAoc3dfcmRfaWR4ICE9IF9fbGUzMl90b19jcHUoKihodHQtPnJ4X3JpbmcuYWxsb2NfaWR4LnZhZGRyKSkpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9Ci0JCQkJaHR0LT5yeF9yaW5nLm5ldGJ1ZnNfcmluZ1tzd19yZF9pZHhdOwotCQlzdHJ1Y3QgYXRoMTBrX3NrYl9jYiAqY2IgPSBBVEgxMEtfU0tCX0NCKHNrYik7Ci0KLQkJZG1hX3VubWFwX3NpbmdsZShodHQtPmFyLT5kZXYsIGNiLT5wYWRkciwKLQkJCQkgc2tiLT5sZW4gKyBza2JfdGFpbHJvb20oc2tiKSwKLQkJCQkgRE1BX0ZST01fREVWSUNFKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoaHR0LT5yeF9yaW5nLm5ldGJ1ZnNfcmluZ1tzd19yZF9pZHhdKTsKLQkJc3dfcmRfaWR4Kys7Ci0JCXN3X3JkX2lkeCAmPSBodHQtPnJ4X3Jpbmcuc2l6ZV9tYXNrOwotCX0KKwlhdGgxMGtfaHR0X3J4X3JpbmdfY2xlYW5fdXAoaHR0KTsKIAogCWRtYV9mcmVlX2NvaGVyZW50KGh0dC0+YXItPmRldiwKIAkJCSAgKGh0dC0+cnhfcmluZy5zaXplICoKQEAgLTI3Nyw2ICsyODIsNyBAQAogCiAJaWR4ID0gaHR0LT5yeF9yaW5nLnN3X3JkX2lkeC5tc2R1X3BheWxkOwogCW1zZHUgPSBodHQtPnJ4X3JpbmcubmV0YnVmc19yaW5nW2lkeF07CisJaHR0LT5yeF9yaW5nLm5ldGJ1ZnNfcmluZ1tpZHhdID0gTlVMTDsKIAogCWlkeCsrOwogCWlkeCAmPSBodHQtPnJ4X3Jpbmcuc2l6ZV9tYXNrOwpAQCAtMjk3LDYgKzMwMyw3IEBACiAJfQogfQogCisvKiByZXR1cm46IDwgMCBmYXRhbCBlcnJvciwgMCAtIG5vbiBjaGFpbmVkIG1zZHUsIDEgY2hhaW5lZCBtc2R1ICovCiBzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfYW1zZHVfcG9wKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsCiAJCQkJICAgdTggKipmd19kZXNjLCBpbnQgKmZ3X2Rlc2NfbGVuLAogCQkJCSAgIHN0cnVjdCBza19idWZmICoqaGVhZF9tc2R1LApAQCAtMzA1LDEyICszMTIsMTMgQEAKIAlpbnQgbXNkdV9sZW4sIG1zZHVfY2hhaW5pbmcgPSAwOwogCXN0cnVjdCBza19idWZmICptc2R1OwogCXN0cnVjdCBodHRfcnhfZGVzYyAqcnhfZGVzYzsKKwlib29sIGNvcnJ1cHRlZCA9IGZhbHNlOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaHR0LT5yeF9yaW5nLmxvY2spOwogCiAJaWYgKGh0dC0+cnhfY29uZnVzZWQpIHsKIAkJYXRoMTBrX3dhcm4oImh0dCBpcyBjb25mdXNlZC4gcmVmdXNpbmcgcnhcbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCX0KIAogCW1zZHUgPSAqaGVhZF9tc2R1ID0gYXRoMTBrX2h0dF9yeF9uZXRidWZfcG9wKGh0dCk7CkBAIC0zOTgsNyArNDA2LDYgQEAKIAkJbXNkdV9sZW4gPSBNUyhfX2xlMzJfdG9fY3B1KHJ4X2Rlc2MtPm1zZHVfc3RhcnQuaW5mbzApLAogCQkJICAgICAgUlhfTVNEVV9TVEFSVF9JTkZPMF9NU0RVX0xFTkdUSCk7CiAJCW1zZHVfY2hhaW5lZCA9IHJ4X2Rlc2MtPmZyYWdfaW5mby5yaW5nMl9tb3JlX2NvdW50OwotCQltc2R1X2NoYWluaW5nID0gbXNkdV9jaGFpbmVkOwogCiAJCWlmIChtc2R1X2xlbl9pbnZhbGlkKQogCQkJbXNkdV9sZW4gPSAwOwpAQCAtNDI2LDExICs0MzMsMTUgQEAKIAogCQkJbXNkdS0+bmV4dCA9IG5leHQ7CiAJCQltc2R1ID0gbmV4dDsKKwkJCW1zZHVfY2hhaW5pbmcgPSAxOwogCQl9CiAKIAkJbGFzdF9tc2R1ID0gX19sZTMyX3RvX2NwdShyeF9kZXNjLT5tc2R1X2VuZC5pbmZvMCkgJgogCQkJCVJYX01TRFVfRU5EX0lORk8wX0xBU1RfTVNEVTsKIAorCQlpZiAobXNkdV9jaGFpbmluZyAmJiAhbGFzdF9tc2R1KQorCQkJY29ycnVwdGVkID0gdHJ1ZTsKKwogCQlpZiAobGFzdF9tc2R1KSB7CiAJCQltc2R1LT5uZXh0ID0gTlVMTDsKIAkJCWJyZWFrOwpAQCAtNDQyLDYgKzQ1MywyMyBAQAogCX0KIAkqdGFpbF9tc2R1ID0gbXNkdTsKIAorCWlmICgqaGVhZF9tc2R1ID09IE5VTEwpCisJCW1zZHVfY2hhaW5pbmcgPSAtMTsKKworCS8qCisJICogQXBwYXJlbnRseSBGVyBzb21ldGltZXMgcmVwb3J0cyB3ZWlyZCBjaGFpbmVkIE1TRFUgc2VxdWVuY2VzIHdpdGgKKwkgKiBtb3JlIHRoYW4gb25lIHJ4IGRlc2NyaXB0b3IuIFRoaXMgc2VlbXMgbGlrZSBhIGJ1ZyBidXQgbmVlZHMgbW9yZQorCSAqIGFuYWx5emluZy4gRm9yIHRoZSB0aW1lIGJlaW5nIGZpeCBpdCBieSBkcm9wcGluZyBzdWNoIHNlcXVlbmNlcyB0bworCSAqIGF2b2lkIGJsb3dpbmcgdXAgdGhlIGhvc3Qgc3lzdGVtLgorCSAqLworCWlmIChjb3JydXB0ZWQpIHsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBwb3AgY2hhaW5lZCBtc2R1cywgZHJvcHBpbmdcbiIpOworCQlhdGgxMGtfaHR0X3J4X2ZyZWVfbXNkdV9jaGFpbigqaGVhZF9tc2R1KTsKKwkJKmhlYWRfbXNkdSA9IE5VTEw7CisJCSp0YWlsX21zZHUgPSBOVUxMOworCQltc2R1X2NoYWluaW5nID0gLUVJTlZBTDsKKwl9CisKIAkvKgogCSAqIERvbid0IHJlZmlsbCB0aGUgcmluZyB5ZXQuCiAJICoKQEAgLTQ2NCw3ICs0OTIsNyBAQAogCWF0aDEwa19odHRfcnhfbXNkdV9idWZmX3JlcGxlbmlzaChodHQpOwogfQogCi1pbnQgYXRoMTBrX2h0dF9yeF9hdHRhY2goc3RydWN0IGF0aDEwa19odHQgKmh0dCkKK2ludCBhdGgxMGtfaHR0X3J4X2FsbG9jKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJZG1hX2FkZHJfdCBwYWRkcjsKIAl2b2lkICp2YWRkcjsKQEAgLTQ5MCw3ICs1MTgsNyBAQAogCWh0dC0+cnhfcmluZy5maWxsX2xldmVsID0gYXRoMTBrX2h0dF9yeF9yaW5nX2ZpbGxfbGV2ZWwoaHR0KTsKIAogCWh0dC0+cnhfcmluZy5uZXRidWZzX3JpbmcgPQotCQlrbWFsbG9jKGh0dC0+cnhfcmluZy5zaXplICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopLAorCQlremFsbG9jKGh0dC0+cnhfcmluZy5zaXplICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFodHQtPnJ4X3JpbmcubmV0YnVmc19yaW5nKQogCQlnb3RvIGVycl9uZXRidWY7CkBAIC02MzYsNiArNjY0LDIwMyBAQAogCV9fYmUxNiBsZW47CiB9IF9fcGFja2VkOwogCitzdGF0aWMgY29uc3QgdTggcnhfbGVnYWN5X3JhdGVfaWR4W10gPSB7CisJMywJLyogMHgwMCAgLSAxMU1icHMgICovCisJMiwJLyogMHgwMSAgLSA1LjVNYnBzICovCisJMSwJLyogMHgwMiAgLSAyTWJwcyAgICovCisJMCwJLyogMHgwMyAgLSAxTWJwcyAgICovCisJMywJLyogMHgwNCAgLSAxMU1icHMgICovCisJMiwJLyogMHgwNSAgLSA1LjVNYnBzICovCisJMSwJLyogMHgwNiAgLSAyTWJwcyAgICovCisJMCwJLyogMHgwNyAgLSAxTWJwcyAgICovCisJMTAsCS8qIDB4MDggIC0gNDhNYnBzICAqLworCTgsCS8qIDB4MDkgIC0gMjRNYnBzICAqLworCTYsCS8qIDB4MEEgIC0gMTJNYnBzICAqLworCTQsCS8qIDB4MEIgIC0gNk1icHMgICAqLworCTExLAkvKiAweDBDICAtIDU0TWJwcyAgKi8KKwk5LAkvKiAweDBEICAtIDM2TWJwcyAgKi8KKwk3LAkvKiAweDBFICAtIDE4TWJwcyAgKi8KKwk1LAkvKiAweDBGICAtIDlNYnBzICAgKi8KK307CisKK3N0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfaF9yYXRlcyhzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCQkgIHU4IGluZm8wLCB1MzIgaW5mbzEsIHUzMiBpbmZvMiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMpCit7CisJdTggY2NrLCByYXRlLCByYXRlX2lkeCwgYncsIHNnaSwgbWNzLCBuc3M7CisJdTggcHJlYW1ibGUgPSAwOworCisJLyogQ2hlY2sgaWYgdmFsaWQgZmllbGRzICovCisJaWYgKCEoaW5mbzAgJiBIVFRfUlhfSU5ESUNBVElPTl9JTkZPMF9TVEFSVF9WQUxJRCkpCisJCXJldHVybjsKKworCXByZWFtYmxlID0gTVMoaW5mbzEsIEhUVF9SWF9JTkRJQ0FUSU9OX0lORk8xX1BSRUFNQkxFX1RZUEUpOworCisJc3dpdGNoIChwcmVhbWJsZSkgeworCWNhc2UgSFRUX1JYX0xFR0FDWToKKwkJY2NrID0gaW5mbzAgJiBIVFRfUlhfSU5ESUNBVElPTl9JTkZPMF9MRUdBQ1lfUkFURV9DQ0s7CisJCXJhdGUgPSBNUyhpbmZvMCwgSFRUX1JYX0lORElDQVRJT05fSU5GTzBfTEVHQUNZX1JBVEUpOworCQlyYXRlX2lkeCA9IDA7CisKKwkJaWYgKHJhdGUgPCAweDA4IHx8IHJhdGUgPiAweDBGKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChiYW5kKSB7CisJCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJCWlmIChjY2spCisJCQkJcmF0ZSAmPSB+QklUKDMpOworCQkJcmF0ZV9pZHggPSByeF9sZWdhY3lfcmF0ZV9pZHhbcmF0ZV07CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQkJcmF0ZV9pZHggPSByeF9sZWdhY3lfcmF0ZV9pZHhbcmF0ZV07CisJCQkvKiBXZSBhcmUgdXNpbmcgc2FtZSByYXRlIHRhYmxlIHJlZ2lzdGVyaW5nCisJCQkgICBIVyAtIGF0aDEwa19yYXRlc1tdLiBJbiBjYXNlIG9mIDVHSHogc2tpcAorCQkJICAgQ0NLIHJhdGVzLCBzbyAtNCBoZXJlICovCisJCQlyYXRlX2lkeCAtPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCXN0YXR1cy0+cmF0ZV9pZHggPSByYXRlX2lkeDsKKwkJYnJlYWs7CisJY2FzZSBIVFRfUlhfSFQ6CisJY2FzZSBIVFRfUlhfSFRfV0lUSF9UWEJGOgorCQkvKiBIVC1TSUcgLSBUYWJsZSAyMC0xMSBpbiBpbmZvMSBhbmQgaW5mbzIgKi8KKwkJbWNzID0gaW5mbzEgJiAweDFGOworCQluc3MgPSBtY3MgPj4gMzsKKwkJYncgPSAoaW5mbzEgPj4gNykgJiAxOworCQlzZ2kgPSAoaW5mbzIgPj4gNykgJiAxOworCisJCXN0YXR1cy0+cmF0ZV9pZHggPSBtY3M7CisJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOworCQlpZiAoc2dpKQorCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRfR0k7CisJCWlmIChidykKKwkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOworCQlicmVhazsKKwljYXNlIEhUVF9SWF9WSFQ6CisJY2FzZSBIVFRfUlhfVkhUX1dJVEhfVFhCRjoKKwkJLyogVkhULVNJRy1BMSBpbiBpbmZvIDEsIFZIVC1TSUctQTIgaW4gaW5mbzIKKwkJICAgVE9ETyBjaGVjayB0aGlzICovCisJCW1jcyA9IChpbmZvMiA+PiA0KSAmIDB4MEY7CisJCW5zcyA9ICgoaW5mbzEgPj4gMTApICYgMHgwNykgKyAxOworCQlidyA9IGluZm8xICYgMzsKKwkJc2dpID0gaW5mbzIgJiAxOworCisJCXN0YXR1cy0+cmF0ZV9pZHggPSBtY3M7CisJCXN0YXR1cy0+dmh0X25zcyA9IG5zczsKKworCQlpZiAoc2dpKQorCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRfR0k7CisKKwkJc3dpdGNoIChidykgeworCQkvKiAyME1IWiAqLworCQljYXNlIDA6CisJCQlicmVhazsKKwkJLyogNDBNSFogKi8KKwkJY2FzZSAxOgorCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfNDBNSFo7CisJCQlicmVhazsKKwkJLyogODBNSFogKi8KKwkJY2FzZSAyOgorCQkJc3RhdHVzLT52aHRfZmxhZyB8PSBSWF9WSFRfRkxBR184ME1IWjsKKwkJfQorCisJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1ZIVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2hfcHJvdGVjdGVkKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIGVudW0gaHR0X3J4X21wZHVfZW5jcnlwdF90eXBlIGVuY3R5cGUsCisJCQkJICAgICAgZW51bSByeF9tc2R1X2RlY2FwX2Zvcm1hdCBmbXQsCisJCQkJICAgICAgYm9vbCBkb3QxMWZyYWcpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKworCXJ4X3N0YXR1cy0+ZmxhZyAmPSB+KFJYX0ZMQUdfREVDUllQVEVEIHwKKwkJCSAgICAgUlhfRkxBR19JVl9TVFJJUFBFRCB8CisJCQkgICAgIFJYX0ZMQUdfTU1JQ19TVFJJUFBFRCk7CisKKwlpZiAoZW5jdHlwZSA9PSBIVFRfUlhfTVBEVV9FTkNSWVBUX05PTkUpCisJCXJldHVybjsKKworCS8qCisJICogVGhlcmUncyBubyBleHBsaWNpdCByeCBkZXNjcmlwdG9yIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBhIGdpdmVuCisJICogZnJhbWUgaGFzIGJlZW4gZGVjcnlwdGVkIG9yIG5vdC4gV2UncmUgZm9yY2VkIHRvIHVzZSB0aGUgZGVjYXAKKwkgKiBmb3JtYXQgYXMgYW4gaW1wbGljaXQgaW5kaWNhdGlvbi4gSG93ZXZlciBmcmFnbWVudGF0aW9uIHJ4IGlzIGFsd2F5cworCSAqIHJhdyBhbmQgaXQgcHJvYmFibHkgbmV2ZXIgcmVwb3J0cyB1bmRlY3J5cHRlZCByYXdzLgorCSAqCisJICogVGhpcyBtYWtlcyBzdXJlIHNuaWZmZWQgZnJhbWVzIGFyZSByZXBvcnRlZCBhcy1pcyB3aXRob3V0IHN0cmlwcGluZworCSAqIHRoZSBwcm90ZWN0ZWQgZmxhZy4KKwkgKi8KKwlpZiAoZm10ID09IFJYX01TRFVfREVDQVBfUkFXICYmICFkb3QxMWZyYWcpCisJCXJldHVybjsKKworCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRCB8CisJCQkgICBSWF9GTEFHX0lWX1NUUklQUEVEIHwKKwkJCSAgIFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsKKwloZHItPmZyYW1lX2NvbnRyb2wgPSBfX2NwdV90b19sZTE2KF9fbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmCisJCQkJCSAgIH5JRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOworfQorCitzdGF0aWMgYm9vbCBhdGgxMGtfaHR0X3J4X2hfY2hhbm5lbChzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoOworCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwljaCA9IGFyLT5zY2FuX2NoYW5uZWw7CisJaWYgKCFjaCkKKwkJY2ggPSBhci0+cnhfY2hhbm5lbDsKKwlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwlpZiAoIWNoKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGF0dXMtPmJhbmQgPSBjaC0+YmFuZDsKKwlzdGF0dXMtPmZyZXEgPSBjaC0+Y2VudGVyX2ZyZXE7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXRoMTBrX3Byb2Nlc3Nfcngoc3RydWN0IGF0aDEwayAqYXIsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzOworCisJc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CisJKnN0YXR1cyA9ICpyeF9zdGF0dXM7CisKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfREFUQSwKKwkJICAgInJ4IHNrYiAlcCBsZW4gJXUgJXMlcyVzJXMlcyAlc3JhdGVfaWR4ICV1IHZodF9uc3MgJXUgZnJlcSAldSBiYW5kICV1IGZsYWcgMHgleCBmY3MtZXJyICVpbWljLWVyciAlaVxuIiwKKwkJICAgc2tiLAorCQkgICBza2ItPmxlbiwKKwkJICAgc3RhdHVzLT5mbGFnID09IDAgPyAibGVnYWN5IiA6ICIiLAorCQkgICBzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0hUID8gImh0IiA6ICIiLAorCQkgICBzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX1ZIVCA/ICJ2aHQiIDogIiIsCisJCSAgIHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfNDBNSFogPyAiNDAiIDogIiIsCisJCSAgIHN0YXR1cy0+dmh0X2ZsYWcgJiBSWF9WSFRfRkxBR184ME1IWiA/ICI4MCIgOiAiIiwKKwkJICAgc3RhdHVzLT5mbGFnICYgUlhfRkxBR19TSE9SVF9HSSA/ICJzZ2kgIiA6ICIiLAorCQkgICBzdGF0dXMtPnJhdGVfaWR4LAorCQkgICBzdGF0dXMtPnZodF9uc3MsCisJCSAgIHN0YXR1cy0+ZnJlcSwKKwkJICAgc3RhdHVzLT5iYW5kLCBzdGF0dXMtPmZsYWcsCisJCSAgICEhKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkMpLAorCQkgICAhIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX01NSUNfRVJST1IpKTsKKwlhdGgxMGtfZGJnX2R1bXAoQVRIMTBLX0RCR19IVFRfRFVNUCwgTlVMTCwgInJ4IHNrYjogIiwKKwkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJaWVlZTgwMjExX3J4KGFyLT5odywgc2tiKTsKK30KKwogc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X253aWZpX2hkcmxlbihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQogewogCS8qIG53aWZpIGhlYWRlciBpcyBwYWRkZWQgdG8gNCBieXRlcy4gdGhpcyBmaXhlcyA0YWRkciByeCAqLwpAQCAtNjQzLDExICs4NjgsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF9hbXNkdShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0LAotCQkJCXN0cnVjdCBodHRfcnhfaW5mbyAqaW5mbykKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAorCQkJCXN0cnVjdCBza19idWZmICpza2JfaW4pCiB7CiAJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9pbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZmlyc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGluZm8tPnNrYjsKIAllbnVtIHJ4X21zZHVfZGVjYXBfZm9ybWF0IGZtdDsKIAllbnVtIGh0dF9yeF9tcGR1X2VuY3J5cHRfdHlwZSBlbmN0eXBlOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CkBAIC03MjgsMjQgKzk1NCwyOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpbmZvLT5za2IgPSBza2I7Ci0JCWluZm8tPmVuY3J5cHRfdHlwZSA9IGVuY3R5cGU7CisJCXNrYl9pbiA9IHNrYjsKKwkJYXRoMTBrX2h0dF9yeF9oX3Byb3RlY3RlZChodHQsIHJ4X3N0YXR1cywgc2tiX2luLCBlbmN0eXBlLCBmbXQsCisJCQkJCSAgZmFsc2UpOwogCQlza2IgPSBza2ItPm5leHQ7Ci0JCWluZm8tPnNrYi0+bmV4dCA9IE5VTEw7CisJCXNrYl9pbi0+bmV4dCA9IE5VTEw7CiAKIAkJaWYgKHNrYikKLQkJCWluZm8tPmFtc2R1X21vcmUgPSB0cnVlOworCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfQU1TRFVfTU9SRTsKKwkJZWxzZQorCQkJcnhfc3RhdHVzLT5mbGFnICY9IH5SWF9GTEFHX0FNU0RVX01PUkU7CiAKLQkJYXRoMTBrX3Byb2Nlc3NfcngoaHR0LT5hciwgaW5mbyk7CisJCWF0aDEwa19wcm9jZXNzX3J4KGh0dC0+YXIsIHJ4X3N0YXR1cywgc2tiX2luKTsKIAl9CiAKIAkvKiBGSVhNRTogSXQgbWlnaHQgYmUgbmljZSB0byByZS1hc3NlbWJsZSB0aGUgQS1NU0RVIHdoZW4gdGhlcmUncyBhCiAJICogbW9uaXRvciBpbnRlcmZhY2UgYWN0aXZlIGZvciBzbmlmZmluZyBwdXJwb3Nlcy4gKi8KIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF9tc2R1KHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsIHN0cnVjdCBodHRfcnhfaW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfbXNkdShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaW5mby0+c2tiOwogCXN0cnVjdCBodHRfcnhfZGVzYyAqcnhkOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJZW51bSByeF9tc2R1X2RlY2FwX2Zvcm1hdCBmbXQ7CkBAIC04MDgsNjYgKzEwMzgsOSBAQAogCQlicmVhazsKIAl9CiAKLQlpbmZvLT5za2IgPSBza2I7Ci0JaW5mby0+ZW5jcnlwdF90eXBlID0gZW5jdHlwZTsKKwlhdGgxMGtfaHR0X3J4X2hfcHJvdGVjdGVkKGh0dCwgcnhfc3RhdHVzLCBza2IsIGVuY3R5cGUsIGZtdCwgZmFsc2UpOwogCi0JYXRoMTBrX3Byb2Nlc3NfcngoaHR0LT5hciwgaW5mbyk7Ci19Ci0KLXN0YXRpYyBib29sIGF0aDEwa19odHRfcnhfaGFzX2RlY3J5cHRfZXJyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7Ci0JdTMyIGZsYWdzOwotCi0JcnhkID0gKHZvaWQgKilza2ItPmRhdGEgLSBzaXplb2YoKnJ4ZCk7Ci0JZmxhZ3MgPSBfX2xlMzJfdG9fY3B1KHJ4ZC0+YXR0ZW50aW9uLmZsYWdzKTsKLQotCWlmIChmbGFncyAmIFJYX0FUVEVOVElPTl9GTEFHU19ERUNSWVBUX0VSUikKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGF0aDEwa19odHRfcnhfaGFzX2Zjc19lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKLQl1MzIgZmxhZ3M7Ci0KLQlyeGQgPSAodm9pZCAqKXNrYi0+ZGF0YSAtIHNpemVvZigqcnhkKTsKLQlmbGFncyA9IF9fbGUzMl90b19jcHUocnhkLT5hdHRlbnRpb24uZmxhZ3MpOwotCi0JaWYgKGZsYWdzICYgUlhfQVRURU5USU9OX0ZMQUdTX0ZDU19FUlIpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBhdGgxMGtfaHR0X3J4X2hhc19taWNfZXJyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7Ci0JdTMyIGZsYWdzOwotCi0JcnhkID0gKHZvaWQgKilza2ItPmRhdGEgLSBzaXplb2YoKnJ4ZCk7Ci0JZmxhZ3MgPSBfX2xlMzJfdG9fY3B1KHJ4ZC0+YXR0ZW50aW9uLmZsYWdzKTsKLQotCWlmIChmbGFncyAmIFJYX0FUVEVOVElPTl9GTEFHU19US0lQX01JQ19FUlIpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBhdGgxMGtfaHR0X3J4X2lzX21nbXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKLQl1MzIgZmxhZ3M7Ci0KLQlyeGQgPSAodm9pZCAqKXNrYi0+ZGF0YSAtIHNpemVvZigqcnhkKTsKLQlmbGFncyA9IF9fbGUzMl90b19jcHUocnhkLT5hdHRlbnRpb24uZmxhZ3MpOwotCi0JaWYgKGZsYWdzICYgUlhfQVRURU5USU9OX0ZMQUdTX01HTVRfVFlQRSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7CisJYXRoMTBrX3Byb2Nlc3NfcngoaHR0LT5hciwgcnhfc3RhdHVzLCBza2IpOwogfQogCiBzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfZ2V0X2NzdW1fc3RhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTk1MiwyMSArMTEyNSw3MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBhdGgxMGtfaHR0X3J4X2Ftc2R1X2FsbG93ZWQoc3RydWN0IGF0aDEwa19odHQgKmh0dCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKmhlYWQsCisJCQkJCWVudW0gaHR0X3J4X21wZHVfc3RhdHVzIHN0YXR1cywKKwkJCQkJYm9vbCBjaGFubmVsX3NldCwKKwkJCQkJdTMyIGF0dGVudGlvbikKK3sKKwlpZiAoaGVhZC0+bGVuID09IDApIHsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUVCwKKwkJCSAgICJodHQgcnggZHJvcHBpbmcgZHVlIHRvIHplcm8tbGVuXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChhdHRlbnRpb24gJiBSWF9BVFRFTlRJT05fRkxBR1NfREVDUllQVF9FUlIpIHsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUVCwKKwkJCSAgICJodHQgcnggZHJvcHBpbmcgZHVlIHRvIGRlY3J5cHQtZXJyXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghY2hhbm5lbF9zZXQpIHsKKwkJYXRoMTBrX3dhcm4oIm5vIGNoYW5uZWwgY29uZmlndXJlZDsgaWdub3JpbmcgZnJhbWUhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIFNraXAgbWdtdCBmcmFtZXMgd2hpbGUgd2UgaGFuZGxlIHRoaXMgaW4gV01JICovCisJaWYgKHN0YXR1cyA9PSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX01HTVRfQ1RSTCB8fAorCSAgICBhdHRlbnRpb24gJiBSWF9BVFRFTlRJT05fRkxBR1NfTUdNVF9UWVBFKSB7CisJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsICJodHQgcnggbWdtdCBjdHJsXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChzdGF0dXMgIT0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19PSyAmJgorCSAgICBzdGF0dXMgIT0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19US0lQX01JQ19FUlIgJiYKKwkgICAgc3RhdHVzICE9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX0lOVl9QRUVSICYmCisJICAgICFodHQtPmFyLT5tb25pdG9yX3N0YXJ0ZWQpIHsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUVCwKKwkJCSAgICJodHQgcnggaWdub3JpbmcgZnJhbWUgdy8gc3RhdHVzICVkXG4iLAorCQkJICAgc3RhdHVzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICh0ZXN0X2JpdChBVEgxMEtfQ0FDX1JVTk5JTkcsICZodHQtPmFyLT5kZXZfZmxhZ3MpKSB7CisJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCisJCQkgICAiaHR0IHJ4IENBQyBydW5uaW5nXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2hhbmRsZXIoc3RydWN0IGF0aDEwa19odHQgKmh0dCwKIAkJCQkgIHN0cnVjdCBodHRfcnhfaW5kaWNhdGlvbiAqcngpCiB7Ci0Jc3RydWN0IGh0dF9yeF9pbmZvIGluZm87CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyA9ICZodHQtPnJ4X3N0YXR1czsKIAlzdHJ1Y3QgaHR0X3J4X2luZGljYXRpb25fbXBkdV9yYW5nZSAqbXBkdV9yYW5nZXM7CisJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7CisJZW51bSBodHRfcnhfbXBkdV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJaW50IG51bV9tcGR1X3JhbmdlczsKKwl1MzIgYXR0ZW50aW9uOwogCWludCBmd19kZXNjX2xlbjsKIAl1OCAqZndfZGVzYzsKKwlib29sIGNoYW5uZWxfc2V0OwogCWludCBpLCBqOworCWludCByZXQ7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZodHQtPnJ4X3JpbmcubG9jayk7CiAKLQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0KIAlmd19kZXNjX2xlbiA9IF9fbGUxNl90b19jcHUocngtPnByZWZpeC5md19yeF9kZXNjX2J5dGVzKTsKIAlmd19kZXNjID0gKHU4ICopJnJ4LT5md19kZXNjOwogCkBAIC05NzQsMTA2ICsxMTk5LDkwIEBACiAJCQkgICAgIEhUVF9SWF9JTkRJQ0FUSU9OX0lORk8xX05VTV9NUERVX1JBTkdFUyk7CiAJbXBkdV9yYW5nZXMgPSBodHRfcnhfaW5kX2dldF9tcGR1X3JhbmdlcyhyeCk7CiAKKwkvKiBGaWxsIHRoaXMgb25jZSwgd2hpbGUgdGhpcyBpcyBwZXItcHBkdSAqLworCWlmIChyeC0+cHBkdS5pbmZvMCAmIEhUVF9SWF9JTkRJQ0FUSU9OX0lORk8wX1NUQVJUX1ZBTElEKSB7CisJCW1lbXNldChyeF9zdGF0dXMsIDAsIHNpemVvZigqcnhfc3RhdHVzKSk7CisJCXJ4X3N0YXR1cy0+c2lnbmFsICA9IEFUSDEwS19ERUZBVUxUX05PSVNFX0ZMT09SICsKKwkJCQkgICAgIHJ4LT5wcGR1LmNvbWJpbmVkX3Jzc2k7CisJfQorCisJaWYgKHJ4LT5wcGR1LmluZm8wICYgSFRUX1JYX0lORElDQVRJT05fSU5GTzBfRU5EX1ZBTElEKSB7CisJCS8qIFRTRiBhdmFpbGFibGUgb25seSBpbiAzMi1iaXQgKi8KKwkJcnhfc3RhdHVzLT5tYWN0aW1lID0gX19sZTMyX3RvX2NwdShyeC0+cHBkdS50c2YpICYgMHhmZmZmZmZmZjsKKwkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfTUFDVElNRV9FTkQ7CisJfQorCisJY2hhbm5lbF9zZXQgPSBhdGgxMGtfaHR0X3J4X2hfY2hhbm5lbChodHQtPmFyLCByeF9zdGF0dXMpOworCisJaWYgKGNoYW5uZWxfc2V0KSB7CisJCWF0aDEwa19odHRfcnhfaF9yYXRlcyhodHQtPmFyLCByeF9zdGF0dXMtPmJhbmQsCisJCQkJICAgICAgcngtPnBwZHUuaW5mbzAsCisJCQkJICAgICAgX19sZTMyX3RvX2NwdShyeC0+cHBkdS5pbmZvMSksCisJCQkJICAgICAgX19sZTMyX3RvX2NwdShyeC0+cHBkdS5pbmZvMiksCisJCQkJICAgICAgcnhfc3RhdHVzKTsKKwl9CisKIAlhdGgxMGtfZGJnX2R1bXAoQVRIMTBLX0RCR19IVFRfRFVNUCwgTlVMTCwgImh0dCByeCBpbmQ6ICIsCiAJCQlyeCwgc2l6ZW9mKCpyeCkgKwogCQkJKHNpemVvZihzdHJ1Y3QgaHR0X3J4X2luZGljYXRpb25fbXBkdV9yYW5nZSkgKgogCQkJCW51bV9tcGR1X3JhbmdlcykpOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9tcGR1X3JhbmdlczsgaSsrKSB7Ci0JCWluZm8uc3RhdHVzID0gbXBkdV9yYW5nZXNbaV0ubXBkdV9yYW5nZV9zdGF0dXM7CisJCXN0YXR1cyA9IG1wZHVfcmFuZ2VzW2ldLm1wZHVfcmFuZ2Vfc3RhdHVzOwogCiAJCWZvciAoaiA9IDA7IGogPCBtcGR1X3Jhbmdlc1tpXS5tcGR1X2NvdW50OyBqKyspIHsKIAkJCXN0cnVjdCBza19idWZmICptc2R1X2hlYWQsICptc2R1X3RhaWw7Ci0JCQllbnVtIGh0dF9yeF9tcGR1X3N0YXR1cyBzdGF0dXM7Ci0JCQlpbnQgbXNkdV9jaGFpbmluZzsKIAogCQkJbXNkdV9oZWFkID0gTlVMTDsKIAkJCW1zZHVfdGFpbCA9IE5VTEw7Ci0JCQltc2R1X2NoYWluaW5nID0gYXRoMTBrX2h0dF9yeF9hbXNkdV9wb3AoaHR0LAotCQkJCQkJCSAmZndfZGVzYywKLQkJCQkJCQkgJmZ3X2Rlc2NfbGVuLAotCQkJCQkJCSAmbXNkdV9oZWFkLAotCQkJCQkJCSAmbXNkdV90YWlsKTsKKwkJCXJldCA9IGF0aDEwa19odHRfcnhfYW1zZHVfcG9wKGh0dCwKKwkJCQkJCSAgICAgICZmd19kZXNjLAorCQkJCQkJICAgICAgJmZ3X2Rlc2NfbGVuLAorCQkJCQkJICAgICAgJm1zZHVfaGVhZCwKKwkJCQkJCSAgICAgICZtc2R1X3RhaWwpOwogCi0JCQlpZiAoIW1zZHVfaGVhZCkgewotCQkJCWF0aDEwa193YXJuKCJodHQgcnggbm8gZGF0YSFcbiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobXNkdV9oZWFkLT5sZW4gPT0gMCkgewotCQkJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCi0JCQkJCSAgICJodHQgcnggZHJvcHBpbmcgZHVlIHRvIHplcm8tbGVuXG4iKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBwb3AgYW1zZHUgZnJvbSBodHQgcnggcmluZyAlZFxuIiwKKwkJCQkJICAgIHJldCk7CiAJCQkJYXRoMTBrX2h0dF9yeF9mcmVlX21zZHVfY2hhaW4obXNkdV9oZWFkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKGF0aDEwa19odHRfcnhfaGFzX2RlY3J5cHRfZXJyKG1zZHVfaGVhZCkpIHsKLQkJCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfSFRULAotCQkJCQkgICAiaHR0IHJ4IGRyb3BwaW5nIGR1ZSB0byBkZWNyeXB0LWVyclxuIik7CisJCQlyeGQgPSBjb250YWluZXJfb2YoKHZvaWQgKiltc2R1X2hlYWQtPmRhdGEsCisJCQkJCSAgIHN0cnVjdCBodHRfcnhfZGVzYywKKwkJCQkJICAgbXNkdV9wYXlsb2FkKTsKKwkJCWF0dGVudGlvbiA9IF9fbGUzMl90b19jcHUocnhkLT5hdHRlbnRpb24uZmxhZ3MpOworCisJCQlpZiAoIWF0aDEwa19odHRfcnhfYW1zZHVfYWxsb3dlZChodHQsIG1zZHVfaGVhZCwKKwkJCQkJCQkgc3RhdHVzLAorCQkJCQkJCSBjaGFubmVsX3NldCwKKwkJCQkJCQkgYXR0ZW50aW9uKSkgewogCQkJCWF0aDEwa19odHRfcnhfZnJlZV9tc2R1X2NoYWluKG1zZHVfaGVhZCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IGluZm8uc3RhdHVzOwotCi0JCQkvKiBTa2lwIG1nbXQgZnJhbWVzIHdoaWxlIHdlIGhhbmRsZSB0aGlzIGluIFdNSSAqLwotCQkJaWYgKHN0YXR1cyA9PSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX01HTVRfQ1RSTCB8fAotCQkJICAgIGF0aDEwa19odHRfcnhfaXNfbWdtdChtc2R1X2hlYWQpKSB7Ci0JCQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0hUVCwgImh0dCByeCBtZ210IGN0cmxcbiIpOworCQkJaWYgKHJldCA+IDAgJiYKKwkJCSAgICBhdGgxMGtfdW5jaGFpbl9tc2R1KG1zZHVfaGVhZCkgPCAwKSB7CiAJCQkJYXRoMTBrX2h0dF9yeF9mcmVlX21zZHVfY2hhaW4obXNkdV9oZWFkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKHN0YXR1cyAhPSBIVFRfUlhfSU5EX01QRFVfU1RBVFVTX09LICYmCi0JCQkgICAgc3RhdHVzICE9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVEtJUF9NSUNfRVJSICYmCi0JCQkgICAgc3RhdHVzICE9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfRVJSX0lOVl9QRUVSICYmCi0JCQkgICAgIWh0dC0+YXItPm1vbml0b3JfZW5hYmxlZCkgewotCQkJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCi0JCQkJCSAgICJodHQgcnggaWdub3JpbmcgZnJhbWUgdy8gc3RhdHVzICVkXG4iLAotCQkJCQkgICBzdGF0dXMpOwotCQkJCWF0aDEwa19odHRfcnhfZnJlZV9tc2R1X2NoYWluKG1zZHVfaGVhZCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CisJCQlpZiAoYXR0ZW50aW9uICYgUlhfQVRURU5USU9OX0ZMQUdTX0ZDU19FUlIpCisJCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CisJCQllbHNlCisJCQkJcnhfc3RhdHVzLT5mbGFnICY9IH5SWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDOwogCi0JCQlpZiAodGVzdF9iaXQoQVRIMTBLX0NBQ19SVU5OSU5HLCAmaHR0LT5hci0+ZGV2X2ZsYWdzKSkgewotCQkJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCi0JCQkJCSAgICJodHQgcnggQ0FDIHJ1bm5pbmdcbiIpOwotCQkJCWF0aDEwa19odHRfcnhfZnJlZV9tc2R1X2NoYWluKG1zZHVfaGVhZCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChtc2R1X2NoYWluaW5nICYmCi0JCQkgICAgKGF0aDEwa191bmNoYWluX21zZHUobXNkdV9oZWFkKSA8IDApKSB7Ci0JCQkJYXRoMTBrX2h0dF9yeF9mcmVlX21zZHVfY2hhaW4obXNkdV9oZWFkKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaW5mby5za2IgICAgID0gbXNkdV9oZWFkOwotCQkJaW5mby5mY3NfZXJyID0gYXRoMTBrX2h0dF9yeF9oYXNfZmNzX2Vycihtc2R1X2hlYWQpOwotCQkJaW5mby5taWNfZXJyID0gYXRoMTBrX2h0dF9yeF9oYXNfbWljX2Vycihtc2R1X2hlYWQpOwotCi0JCQlpZiAoaW5mby5mY3NfZXJyKQotCQkJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCi0JCQkJCSAgICJodHQgcnggaGFzIEZDUyBlcnJcbiIpOwotCi0JCQlpZiAoaW5mby5taWNfZXJyKQotCQkJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19IVFQsCi0JCQkJCSAgICJodHQgcnggaGFzIE1JQyBlcnJcbiIpOwotCi0JCQlpbmZvLnNpZ25hbCAgPSBBVEgxMEtfREVGQVVMVF9OT0lTRV9GTE9PUjsKLQkJCWluZm8uc2lnbmFsICs9IHJ4LT5wcGR1LmNvbWJpbmVkX3Jzc2k7Ci0KLQkJCWluZm8ucmF0ZS5pbmZvMCA9IHJ4LT5wcGR1LmluZm8wOwotCQkJaW5mby5yYXRlLmluZm8xID0gX19sZTMyX3RvX2NwdShyeC0+cHBkdS5pbmZvMSk7Ci0JCQlpbmZvLnJhdGUuaW5mbzIgPSBfX2xlMzJfdG9fY3B1KHJ4LT5wcGR1LmluZm8yKTsKLQkJCWluZm8udHNmID0gX19sZTMyX3RvX2NwdShyeC0+cHBkdS50c2YpOworCQkJaWYgKGF0dGVudGlvbiAmIFJYX0FUVEVOVElPTl9GTEFHU19US0lQX01JQ19FUlIpCisJCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfTU1JQ19FUlJPUjsKKwkJCWVsc2UKKwkJCQlyeF9zdGF0dXMtPmZsYWcgJj0gflJYX0ZMQUdfTU1JQ19FUlJPUjsKIAogCQkJaGRyID0gYXRoMTBrX2h0dF9yeF9za2JfZ2V0X2hkcihtc2R1X2hlYWQpOwogCiAJCQlpZiAoYXRoMTBrX2h0dF9yeF9oZHJfaXNfYW1zZHUoaGRyKSkKLQkJCQlhdGgxMGtfaHR0X3J4X2Ftc2R1KGh0dCwgJmluZm8pOworCQkJCWF0aDEwa19odHRfcnhfYW1zZHUoaHR0LCByeF9zdGF0dXMsIG1zZHVfaGVhZCk7CiAJCQllbHNlCi0JCQkJYXRoMTBrX2h0dF9yeF9tc2R1KGh0dCwgJmluZm8pOworCQkJCWF0aDEwa19odHRfcnhfbXNkdShodHQsIHJ4X3N0YXR1cywgbXNkdV9oZWFkKTsKIAkJfQogCX0KIApAQCAtMTA4NCwxMSArMTI5MywxMiBAQAogCQkJCXN0cnVjdCBodHRfcnhfZnJhZ21lbnRfaW5kaWNhdGlvbiAqZnJhZykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNkdV9oZWFkLCAqbXNkdV90YWlsOworCWVudW0gaHR0X3J4X21wZHVfZW5jcnlwdF90eXBlIGVuY3R5cGU7CiAJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7CiAJZW51bSByeF9tc2R1X2RlY2FwX2Zvcm1hdCBmbXQ7Ci0Jc3RydWN0IGh0dF9yeF9pbmZvIGluZm8gPSB7fTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzID0gJmh0dC0+cnhfc3RhdHVzOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0JaW50IG1zZHVfY2hhaW5pbmc7CisJaW50IHJldDsKIAlib29sIHRraXBfbWljX2VycjsKIAlib29sIGRlY3J5cHRfZXJyOwogCXU4ICpmd19kZXNjOwpAQCAtMTEwMiwyNCArMTMxMiwyMSBAQAogCW1zZHVfdGFpbCA9IE5VTEw7CiAKIAlzcGluX2xvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKLQltc2R1X2NoYWluaW5nID0gYXRoMTBrX2h0dF9yeF9hbXNkdV9wb3AoaHR0LCAmZndfZGVzYywgJmZ3X2Rlc2NfbGVuLAotCQkJCQkJJm1zZHVfaGVhZCwgJm1zZHVfdGFpbCk7CisJcmV0ID0gYXRoMTBrX2h0dF9yeF9hbXNkdV9wb3AoaHR0LCAmZndfZGVzYywgJmZ3X2Rlc2NfbGVuLAorCQkJCSAgICAgICZtc2R1X2hlYWQsICZtc2R1X3RhaWwpOwogCXNwaW5fdW5sb2NrX2JoKCZodHQtPnJ4X3JpbmcubG9jayk7CiAKIAlhdGgxMGtfZGJnKEFUSDEwS19EQkdfSFRUX0RVTVAsICJodHQgcnggZnJhZyBhaGVhZFxuIik7CiAKLQlpZiAoIW1zZHVfaGVhZCkgewotCQlhdGgxMGtfd2FybigiaHR0IHJ4IGZyYWcgbm8gZGF0YVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobXNkdV9jaGFpbmluZyB8fCBtc2R1X2hlYWQgIT0gbXNkdV90YWlsKSB7Ci0JCWF0aDEwa193YXJuKCJhZ2dyZWdhdGlvbiB3aXRoIGZyYWdtZW50YXRpb24/IVxuIik7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHBvcCBhbXNkdSBmcm9tIGh0dHIgcnggcmluZyBmb3IgZnJhZ21lbnRlZCByeCAlZFxuIiwKKwkJCSAgICByZXQpOwogCQlhdGgxMGtfaHR0X3J4X2ZyZWVfbXNkdV9jaGFpbihtc2R1X2hlYWQpOwogCQlyZXR1cm47CiAJfQogCiAJLyogRklYTUU6IGltcGxlbWVudCBzaWduYWwgc3RyZW5ndGggKi8KKwlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19OT19TSUdOQUxfVkFMOwogCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopbXNkdV9oZWFkLT5kYXRhOwogCXJ4ZCA9ICh2b2lkICopbXNkdV9oZWFkLT5kYXRhIC0gc2l6ZW9mKCpyeGQpOwpAQCAtMTEzNiw1NyArMTM0Myw1NSBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLQlpbmZvLnNrYiA9IG1zZHVfaGVhZDsKLQlpbmZvLnN0YXR1cyA9IEhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfT0s7Ci0JaW5mby5lbmNyeXB0X3R5cGUgPSBNUyhfX2xlMzJfdG9fY3B1KHJ4ZC0+bXBkdV9zdGFydC5pbmZvMCksCi0JCQkJUlhfTVBEVV9TVEFSVF9JTkZPMF9FTkNSWVBUX1RZUEUpOwotCWluZm8uc2tiLT5pcF9zdW1tZWQgPSBhdGgxMGtfaHR0X3J4X2dldF9jc3VtX3N0YXRlKGluZm8uc2tiKTsKKwllbmN0eXBlID0gTVMoX19sZTMyX3RvX2NwdShyeGQtPm1wZHVfc3RhcnQuaW5mbzApLAorCQkgICAgIFJYX01QRFVfU1RBUlRfSU5GTzBfRU5DUllQVF9UWVBFKTsKKwlhdGgxMGtfaHR0X3J4X2hfcHJvdGVjdGVkKGh0dCwgcnhfc3RhdHVzLCBtc2R1X2hlYWQsIGVuY3R5cGUsIGZtdCwKKwkJCQkgIHRydWUpOworCW1zZHVfaGVhZC0+aXBfc3VtbWVkID0gYXRoMTBrX2h0dF9yeF9nZXRfY3N1bV9zdGF0ZShtc2R1X2hlYWQpOwogCi0JaWYgKHRraXBfbWljX2VycikgeworCWlmICh0a2lwX21pY19lcnIpCiAJCWF0aDEwa193YXJuKCJ0a2lwIG1pYyBlcnJvclxuIik7Ci0JCWluZm8uc3RhdHVzID0gSFRUX1JYX0lORF9NUERVX1NUQVRVU19US0lQX01JQ19FUlI7Ci0JfQogCiAJaWYgKGRlY3J5cHRfZXJyKSB7CiAJCWF0aDEwa193YXJuKCJkZWNyeXB0aW9uIGVyciBpbiBmcmFnbWVudGVkIHJ4XG4iKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoaW5mby5za2IpOworCQlkZXZfa2ZyZWVfc2tiX2FueShtc2R1X2hlYWQpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlpZiAoaW5mby5lbmNyeXB0X3R5cGUgIT0gSFRUX1JYX01QRFVfRU5DUllQVF9OT05FKSB7CisJaWYgKGVuY3R5cGUgIT0gSFRUX1JYX01QRFVfRU5DUllQVF9OT05FKSB7CiAJCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKLQkJcGFyYW1sZW4gPSBhdGgxMGtfaHR0X3J4X2NyeXB0b19wYXJhbV9sZW4oaW5mby5lbmNyeXB0X3R5cGUpOworCQlwYXJhbWxlbiA9IGF0aDEwa19odHRfcnhfY3J5cHRvX3BhcmFtX2xlbihlbmN0eXBlKTsKIAogCQkvKiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBtb3ZlIHRoZSBoZWFkZXIgdGhhbiB0aGUgcGF5bG9hZCAqLwotCQltZW1tb3ZlKCh2b2lkICopaW5mby5za2ItPmRhdGEgKyBwYXJhbWxlbiwKLQkJCSh2b2lkICopaW5mby5za2ItPmRhdGEsCisJCW1lbW1vdmUoKHZvaWQgKiltc2R1X2hlYWQtPmRhdGEgKyBwYXJhbWxlbiwKKwkJCSh2b2lkICopbXNkdV9oZWFkLT5kYXRhLAogCQkJaGRybGVuKTsKLQkJc2tiX3B1bGwoaW5mby5za2IsIHBhcmFtbGVuKTsKLQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaW5mby5za2ItPmRhdGE7CisJCXNrYl9wdWxsKG1zZHVfaGVhZCwgcGFyYW1sZW4pOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKiltc2R1X2hlYWQtPmRhdGE7CiAJfQogCiAJLyogcmVtb3ZlIHRyYWlsaW5nIEZDUyAqLwogCXRyaW0gID0gNDsKIAogCS8qIHJlbW92ZSBjcnlwdG8gdHJhaWxlciAqLwotCXRyaW0gKz0gYXRoMTBrX2h0dF9yeF9jcnlwdG9fdGFpbF9sZW4oaW5mby5lbmNyeXB0X3R5cGUpOworCXRyaW0gKz0gYXRoMTBrX2h0dF9yeF9jcnlwdG9fdGFpbF9sZW4oZW5jdHlwZSk7CiAKIAkvKiBsYXN0IGZyYWdtZW50IG9mIFRLSVAgZnJhZ3MgaGFzIE1JQyAqLwogCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCSAgICBpbmZvLmVuY3J5cHRfdHlwZSA9PSBIVFRfUlhfTVBEVV9FTkNSWVBUX1RLSVBfV1BBKQorCSAgICBlbmN0eXBlID09IEhUVF9SWF9NUERVX0VOQ1JZUFRfVEtJUF9XUEEpCiAJCXRyaW0gKz0gODsKIAotCWlmICh0cmltID4gaW5mby5za2ItPmxlbikgeworCWlmICh0cmltID4gbXNkdV9oZWFkLT5sZW4pIHsKIAkJYXRoMTBrX3dhcm4oImh0dCByeCBmcmFnbWVudDogdHJhaWxlciBsb25nZXIgdGhhbiB0aGUgZnJhbWUgaXRzZWxmPyBkcm9wXG4iKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoaW5mby5za2IpOworCQlkZXZfa2ZyZWVfc2tiX2FueShtc2R1X2hlYWQpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlza2JfdHJpbShpbmZvLnNrYiwgaW5mby5za2ItPmxlbiAtIHRyaW0pOworCXNrYl90cmltKG1zZHVfaGVhZCwgbXNkdV9oZWFkLT5sZW4gLSB0cmltKTsKIAogCWF0aDEwa19kYmdfZHVtcChBVEgxMEtfREJHX0hUVF9EVU1QLCBOVUxMLCAiaHR0IHJ4IGZyYWcgbXBkdTogIiwKLQkJCWluZm8uc2tiLT5kYXRhLCBpbmZvLnNrYi0+bGVuKTsKLQlhdGgxMGtfcHJvY2Vzc19yeChodHQtPmFyLCAmaW5mbyk7CisJCQltc2R1X2hlYWQtPmRhdGEsIG1zZHVfaGVhZC0+bGVuKTsKKwlhdGgxMGtfcHJvY2Vzc19yeChodHQtPmFyLCByeF9zdGF0dXMsIG1zZHVfaGVhZCk7CiAKIGVuZDoKIAlpZiAoZndfZGVzY19sZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfdHguYwppbmRleCA3YTNlMmU0Li43MDY0MzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3R4LmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlfX2NsZWFyX2JpdChtc2R1X2lkLCBodHQtPnVzZWRfbXNkdV9pZHMpOwogfQogCi1pbnQgYXRoMTBrX2h0dF90eF9hdHRhY2goc3RydWN0IGF0aDEwa19odHQgKmh0dCkKK2ludCBhdGgxMGtfaHR0X3R4X2FsbG9jKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJmh0dC0+dHhfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaHR0LT5lbXB0eV90eF93cSk7CkBAIC0xMjAsNyArMTIwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX2h0dF90eF9jbGVhbnVwX3BlbmRpbmcoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKK3N0YXRpYyB2b2lkIGF0aDEwa19odHRfdHhfZnJlZV9wZW5kaW5nKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJc3RydWN0IGh0dF90eF9kb25lIHR4X2RvbmUgPSB7MH07CiAJaW50IG1zZHVfaWQ7CkBAIC0xNDEsOSArMTQxLDkgQEAKIAlzcGluX3VubG9ja19iaCgmaHR0LT50eF9sb2NrKTsKIH0KIAotdm9pZCBhdGgxMGtfaHR0X3R4X2RldGFjaChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQordm9pZCBhdGgxMGtfaHR0X3R4X2ZyZWUoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKIHsKLQlhdGgxMGtfaHR0X3R4X2NsZWFudXBfcGVuZGluZyhodHQpOworCWF0aDEwa19odHRfdHhfZnJlZV9wZW5kaW5nKGh0dCk7CiAJa2ZyZWUoaHR0LT5wZW5kaW5nX3R4KTsKIAlrZnJlZShodHQtPnVzZWRfbXNkdV9pZHMpOwogCWRtYV9wb29sX2Rlc3Ryb3koaHR0LT50eF9wb29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaAppbmRleCAzNWZjNDRlLi4wMDdlODU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIFFDQTk4OFhfSFdfMl8wX0NISVBfSURfUkVWCTB4MgogI2RlZmluZSBRQ0E5ODhYX0hXXzJfMF9GV19ESVIJCSJhdGgxMGsvUUNBOTg4WC9odzIuMCIKICNkZWZpbmUgUUNBOTg4WF9IV18yXzBfRldfRklMRQkJImZpcm13YXJlLmJpbiIKKyNkZWZpbmUgUUNBOTg4WF9IV18yXzBfRldfMl9GSUxFCSJmaXJtd2FyZS0yLmJpbiIKICNkZWZpbmUgUUNBOTg4WF9IV18yXzBfT1RQX0ZJTEUJCSJvdHAuYmluIgogI2RlZmluZSBRQ0E5ODhYX0hXXzJfMF9CT0FSRF9EQVRBX0ZJTEUJImJvYXJkLmJpbiIKICNkZWZpbmUgUUNBOTg4WF9IV18yXzBfUEFUQ0hfTE9BRF9BRERSCTB4MTIzNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMKaW5kZXggNTExYTJmOC4uYTIxMDgwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jCkBAIC01NCw3ICs1NCwxMCBAQAogCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWFyZy5rZXlfY2lwaGVyID0gV01JX0NJUEhFUl9BRVNfQ0NNOwotCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RYOworCQlpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQKQorCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVZfTUdNVDsKKwkJZWxzZQorCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfU1dfTUdNVF9UWDsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgogCQlhcmcua2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfVEtJUDsKQEAgLTE2NSw3ICsxNjgsNyBAQAogCQkJZmlyc3RfZXJybm8gPSByZXQ7CiAKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJjb3VsZCBub3QgcmVtb3ZlIHBlZXIgd2VwIGtleSAlZCAoJWQpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byByZW1vdmUgcGVlciB3ZXAga2V5ICVkOiAlZFxuIiwKIAkJCQkgICAgaSwgcmV0KTsKIAogCQlwZWVyLT5rZXlzW2ldID0gTlVMTDsKQEAgLTIxMyw3ICsyMTYsOCBAQAogCQkJZmlyc3RfZXJybm8gPSByZXQ7CiAKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJjb3VsZCBub3QgcmVtb3ZlIGtleSBmb3IgJXBNXG4iLCBhZGRyKTsKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcmVtb3ZlIGtleSBmb3IgJXBNOiAlZFxuIiwKKwkJCQkgICAgYWRkciwgcmV0KTsKIAl9CiAKIAlyZXR1cm4gZmlyc3RfZXJybm87CkBAIC0zMjMsMTQgKzMyNywxNCBAQAogCiAJcmV0ID0gYXRoMTBrX3dtaV9wZWVyX2NyZWF0ZShhciwgdmRldl9pZCwgYWRkcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIGNyZWF0ZSB3bWkgcGVlciAlcE0gb24gdmRldiAlaTogJWlcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gY3JlYXRlIHdtaSBwZWVyICVwTSBvbiB2ZGV2ICVpOiAlaVxuIiwKIAkJCSAgICBhZGRyLCB2ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGF0aDEwa193YWl0X2Zvcl9wZWVyX2NyZWF0ZWQoYXIsIHZkZXZfaWQsIGFkZHIpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byB3YWl0IGZvciBjcmVhdGVkIHdtaSBwZWVyICVwTSBvbiB2ZGV2ICVpOiAlaVxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byB3YWl0IGZvciBjcmVhdGVkIHdtaSBwZWVyICVwTSBvbiB2ZGV2ICVpOiAlaVxuIiwKIAkJCSAgICBhZGRyLCB2ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTM1MSw3ICszNTUsNyBAQAogCXJldCA9IGF0aDEwa193bWlfcGRldl9zZXRfcGFyYW0oYXIsIHBhcmFtLAogCQkJCQlBVEgxMEtfS0lDS09VVF9USFJFU0hPTEQpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQga2lja291dCB0aHJlc2hvbGQgb24gdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGtpY2tvdXQgdGhyZXNob2xkIG9uIHZkZXYgJWk6ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTM2MCw3ICszNjQsNyBAQAogCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCBwYXJhbSwKIAkJCQkJQVRIMTBLX0tFRVBBTElWRV9NSU5fSURMRSk7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIHNldCBrZWVwYWxpdmUgbWluaW11bSBpZGxlIHRpbWUgb24gdmRldiAlaSA6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBrZWVwYWxpdmUgbWluaW11bSBpZGxlIHRpbWUgb24gdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMzY5LDcgKzM3Myw3IEBACiAJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3NldF9wYXJhbShhciwgYXJ2aWYtPnZkZXZfaWQsIHBhcmFtLAogCQkJCQlBVEgxMEtfS0VFUEFMSVZFX01BWF9JRExFKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IGtlZXBhbGl2ZSBtYXhpbXVtIGlkbGUgdGltZSBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQga2VlcGFsaXZlIG1heGltdW0gaWRsZSB0aW1lIG9uIHZkZXYgJWk6ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTM3OCw3ICszODIsNyBAQAogCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCBwYXJhbSwKIAkJCQkJQVRIMTBLX0tFRVBBTElWRV9NQVhfVU5SRVNQT05TSVZFKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IGtlZXBhbGl2ZSBtYXhpbXVtIHVucmVzcG9uc2l2ZSB0aW1lIG9uIHZkZXYgJWk6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBrZWVwYWxpdmUgbWF4aW11bSB1bnJlc3BvbnNpdmUgdGltZSBvbiB2ZGV2ICVpOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC00ODgsNiArNDkyLDMxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBhdGgxMGtfbW9uaXRvcl9pc19lbmFibGVkKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsCisJCSAgICJtYWMgbW9uaXRvciByZWZzOiBwcm9taXNjICVkIG1vbml0b3IgJWQgY2FjICVkXG4iLAorCQkgICBhci0+cHJvbWlzYywgYXItPm1vbml0b3IsCisJCSAgIHRlc3RfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpKTsKKworCXJldHVybiBhci0+cHJvbWlzYyB8fCBhci0+bW9uaXRvciB8fAorCSAgICAgICB0ZXN0X2JpdChBVEgxMEtfQ0FDX1JVTk5JTkcsICZhci0+ZGV2X2ZsYWdzKTsKK30KKworc3RhdGljIGludCBhdGgxMGtfbW9uaXRvcl92ZGV2X3N0YXJ0KHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgdmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYgPSAmYXItPmNoYW5kZWY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY2hhbmRlZi0+Y2hhbjsKKwlzdHJ1Y3Qgd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9hcmcgYXJnID0ge307CisJaW50IHJldCA9IDA7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlhcmcudmRldl9pZCA9IHZkZXZfaWQ7CisJYXJnLmNoYW5uZWwuZnJlcSA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOworCWFyZy5jaGFubmVsLmJhbmRfY2VudGVyX2ZyZXExID0gY2hhbmRlZi0+Y2VudGVyX2ZyZXExOworCisJLyogVE9ETyBzZXR1cCB0aGlzIGR5bmFtaWNhbGx5LCB3aGF0IGluIGNhc2Ugd2UKKwkgICBkb24ndCBoYXZlIGFueSB2aWZzPyAqLworCWFyZy5jaGFubmVsLm1vZGUgPSBjaGFuX3RvX3BoeW1vZGUoY2hhbmRlZik7CisJYXJnLmNoYW5uZWwuY2hhbl9yYWRhciA9CisJCQkhIShjaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKTsKKworCWFyZy5jaGFubmVsLm1pbl9wb3dlciA9IDA7CisJYXJnLmNoYW5uZWwubWF4X3Bvd2VyID0gY2hhbm5lbC0+bWF4X3Bvd2VyICogMjsKKwlhcmcuY2hhbm5lbC5tYXhfcmVnX3Bvd2VyID0gY2hhbm5lbC0+bWF4X3JlZ19wb3dlciAqIDI7CisJYXJnLmNoYW5uZWwubWF4X2FudGVubmFfZ2FpbiA9IGNoYW5uZWwtPm1heF9hbnRlbm5hX2dhaW4gKiAyOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3N0YXJ0KGFyLCAmYXJnKTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcmVxdWVzdCBtb25pdG9yIHZkZXYgJWkgc3RhcnQ6ICVkXG4iLAorCQkJICAgIHZkZXZfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTBrX3ZkZXZfc2V0dXBfc3luYyhhcik7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN5bmNocm9uaXplIHNldHVwIGZvciBtb25pdG9yIHZkZXYgJWk6ICVkXG4iLAorCQkJICAgIHZkZXZfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3VwKGFyLCB2ZGV2X2lkLCAwLCBhci0+bWFjX2FkZHIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBwdXQgdXAgbW9uaXRvciB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICB2ZGV2X2lkLCByZXQpOworCQlnb3RvIHZkZXZfc3RvcDsKKwl9CisKKwlhci0+bW9uaXRvcl92ZGV2X2lkID0gdmRldl9pZDsKKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgbW9uaXRvciB2ZGV2ICVpIHN0YXJ0ZWRcbiIsCisJCSAgIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCXJldHVybiAwOworCit2ZGV2X3N0b3A6CisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3N0b3AoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCWlmIChyZXQpCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3RvcCBtb25pdG9yIHZkZXYgJWkgYWZ0ZXIgc3RhcnQgZmFpbHVyZTogJWRcbiIsCisJCQkgICAgYXItPm1vbml0b3JfdmRldl9pZCwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTBrX21vbml0b3JfdmRldl9zdG9wKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2Rvd24oYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCWlmIChyZXQpCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcHV0IGRvd24gbW9uaXRvciB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3N0b3AoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCWlmIChyZXQpCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gdG8gcmVxdWVzdCBtb25pdG9yIHZkZXYgJWkgc3RvcDogJWRcbiIsCisJCQkgICAgYXItPm1vbml0b3JfdmRldl9pZCwgcmV0KTsKKworCXJldCA9IGF0aDEwa192ZGV2X3NldHVwX3N5bmMoYXIpOworCWlmIChyZXQpCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3luY2hyb25pc2UgbW9uaXRvciB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yIHZkZXYgJWkgc3RvcHBlZFxuIiwKKwkJICAgYXItPm1vbml0b3JfdmRldl9pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGgxMGtfbW9uaXRvcl92ZGV2X2NyZWF0ZShzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgYml0LCByZXQgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJYml0ID0gZmZzKGFyLT5mcmVlX3ZkZXZfbWFwKTsKKwlpZiAoYml0ID09IDApIHsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBmaW5kIGZyZWUgdmRldiBpZCBmb3IgbW9uaXRvciB2ZGV2XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXItPm1vbml0b3JfdmRldl9pZCA9IGJpdCAtIDE7CisJYXItPmZyZWVfdmRldl9tYXAgJj0gfigxIDw8IGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2NyZWF0ZShhciwgYXItPm1vbml0b3JfdmRldl9pZCwKKwkJCQkgICAgIFdNSV9WREVWX1RZUEVfTU9OSVRPUiwKKwkJCQkgICAgIDAsIGFyLT5tYWNfYWRkcik7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlcXVlc3QgbW9uaXRvciB2ZGV2ICVpIGNyZWF0aW9uOiAlZFxuIiwKKwkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCQlnb3RvIHZkZXZfZmFpbDsKKwl9CisKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIG1vbml0b3IgdmRldiAlZCBjcmVhdGVkXG4iLAorCQkgICBhci0+bW9uaXRvcl92ZGV2X2lkKTsKKworCXJldHVybiAwOworCit2ZGV2X2ZhaWw6CisJLyoKKwkgKiBSZXN0b3JlIHRoZSBJRCB0byB0aGUgZ2xvYmFsIG1hcC4KKwkgKi8KKwlhci0+ZnJlZV92ZGV2X21hcCB8PSAxIDw8IChhci0+bW9uaXRvcl92ZGV2X2lkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDEwa19tb25pdG9yX3ZkZXZfZGVsZXRlKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2RlbGV0ZShhciwgYXItPm1vbml0b3JfdmRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlcXVlc3Qgd21pIG1vbml0b3IgdmRldiAlaSByZW1vdmFsOiAlZFxuIiwKKwkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWFyLT5mcmVlX3ZkZXZfbWFwIHw9IDEgPDwgKGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yIHZkZXYgJWQgZGVsZXRlZFxuIiwKKwkJICAgYXItPm1vbml0b3JfdmRldl9pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGgxMGtfbW9uaXRvcl9zdGFydChzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKCFhdGgxMGtfbW9uaXRvcl9pc19lbmFibGVkKGFyKSkgeworCQlhdGgxMGtfd2FybigidHJ5aW5nIHRvIHN0YXJ0IG1vbml0b3Igd2l0aCBubyByZWZlcmVuY2VzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyLT5tb25pdG9yX3N0YXJ0ZWQpIHsKKwkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yIGFscmVhZHkgc3RhcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGF0aDEwa19tb25pdG9yX3ZkZXZfY3JlYXRlKGFyKTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gY3JlYXRlIG1vbml0b3IgdmRldjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTBrX21vbml0b3JfdmRldl9zdGFydChhciwgYXItPm1vbml0b3JfdmRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN0YXJ0IG1vbml0b3IgdmRldjogJWRcbiIsIHJldCk7CisJCWF0aDEwa19tb25pdG9yX3ZkZXZfZGVsZXRlKGFyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+bW9uaXRvcl9zdGFydGVkID0gdHJ1ZTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIG1vbml0b3Igc3RhcnRlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRoMTBrX21vbml0b3Jfc3RvcChzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKGF0aDEwa19tb25pdG9yX2lzX2VuYWJsZWQoYXIpKSB7CisJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsCisJCQkgICAibWFjIG1vbml0b3Igd2lsbCBiZSBzdG9wcGVkIGxhdGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghYXItPm1vbml0b3Jfc3RhcnRlZCkgeworCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLAorCQkJICAgIm1hYyBtb25pdG9yIHByb2JhYmx5IGZhaWxlZCB0byBzdGFydCBlYXJsaWVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGF0aDEwa19tb25pdG9yX3ZkZXZfc3RvcChhcik7CisJaWYgKHJldCkKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdG9wIG1vbml0b3IgdmRldjogJWRcbiIsIHJldCk7CisKKwlyZXQgPSBhdGgxMGtfbW9uaXRvcl92ZGV2X2RlbGV0ZShhcik7CisJaWYgKHJldCkKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBkZWxldGUgbW9uaXRvciB2ZGV2OiAlZFxuIiwgcmV0KTsKKworCWFyLT5tb25pdG9yX3N0YXJ0ZWQgPSBmYWxzZTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIG1vbml0b3Igc3RvcHBlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTBrX3JlY2FsY19ydHNjdHNfcHJvdChzdHJ1Y3QgYXRoMTBrX3ZpZiAqYXJ2aWYpCit7CisJc3RydWN0IGF0aDEwayAqYXIgPSBhcnZpZi0+YXI7CisJdTMyIHZkZXZfcGFyYW0sIHJ0c19jdHMgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJdmRldl9wYXJhbSA9IGFyLT53bWkudmRldl9wYXJhbS0+ZW5hYmxlX3J0c2N0czsKKworCWlmIChhcnZpZi0+dXNlX2N0c19wcm90IHx8IGFydmlmLT5udW1fbGVnYWN5X3N0YXRpb25zID4gMCkKKwkJcnRzX2N0cyB8PSBTTShXTUlfUlRTQ1RTX0VOQUJMRUQsIFdNSV9SVFNDVFNfU0VUKTsKKworCWlmIChhcnZpZi0+bnVtX2xlZ2FjeV9zdGF0aW9ucyA+IDApCisJCXJ0c19jdHMgfD0gU00oV01JX1JUU0NUU19BQ1JPU1NfU1dfUkVUUklFUywKKwkJCSAgICAgIFdNSV9SVFNDVFNfUFJPRklMRSk7CisKKwlyZXR1cm4gYXRoMTBrX3dtaV92ZGV2X3NldF9wYXJhbShhciwgYXJ2aWYtPnZkZXZfaWQsIHZkZXZfcGFyYW0sCisJCQkJCSBydHNfY3RzKTsKK30KKworc3RhdGljIGludCBhdGgxMGtfc3RhcnRfY2FjKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlzZXRfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpOworCisJcmV0ID0gYXRoMTBrX21vbml0b3Jfc3RhcnQoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdGFydCBtb25pdG9yIChjYWMpOiAlZFxuIiwgcmV0KTsKKwkJY2xlYXJfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgY2FjIHN0YXJ0IG1vbml0b3IgdmRldiAlZFxuIiwKKwkJICAgYXItPm1vbml0b3JfdmRldl9pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMGtfc3RvcF9jYWMoc3RydWN0IGF0aDEwayAqYXIpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJLyogQ0FDIGlzIG5vdCBydW5uaW5nIC0gZG8gbm90aGluZyAqLworCWlmICghdGVzdF9iaXQoQVRIMTBLX0NBQ19SVU5OSU5HLCAmYXItPmRldl9mbGFncykpCisJCXJldHVybiAwOworCisJY2xlYXJfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpOworCWF0aDEwa19tb25pdG9yX3N0b3AoYXIpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBjYWMgZmluaXNoZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEwa19yZWNhbGNfcmFkYXJfZGV0ZWN0aW9uKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlhdGgxMGtfc3RvcF9jYWMoYXIpOworCisJaWYgKCFhci0+cmFkYXJfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKGFyLT5udW1fc3RhcnRlZF92ZGV2cyA+IDApCisJCXJldHVybjsKKworCXJldCA9IGF0aDEwa19zdGFydF9jYWMoYXIpOworCWlmIChyZXQpIHsKKwkJLyoKKwkJICogTm90IHBvc3NpYmxlIHRvIHN0YXJ0IENBQyBvbiBjdXJyZW50IGNoYW5uZWwgc28gc3RhcnRpbmcKKwkJICogcmFkaWF0aW9uIGlzIG5vdCBhbGxvd2VkLCBtYWtlIHRoaXMgY2hhbm5lbCBERlNfVU5BVkFJTEFCTEUKKwkJICogYnkgaW5kaWNhdGluZyB0aGF0IHJhZGFyIHdhcyBkZXRlY3RlZC4KKwkJICovCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3RhcnQgQ0FDOiAlZFxuIiwgcmV0KTsKKwkJaWVlZTgwMjExX3JhZGFyX2RldGVjdGVkKGFyLT5odyk7CisJfQorfQorCiBzdGF0aWMgaW50IGF0aDEwa192ZGV2X3N0YXJ0KHN0cnVjdCBhdGgxMGtfdmlmICphcnZpZikKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGFydmlmLT5hcjsKQEAgLTUzMiwxOCArODQwLDIxIEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfc3RhcnQoYXIsICZhcmcpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIldNSSB2ZGV2ICVpIHN0YXJ0IGZhaWxlZDogcmV0ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN0YXJ0IFdNSSB2ZGV2ICVpOiAlZFxuIiwKIAkJCSAgICBhcmcudmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBhdGgxMGtfdmRldl9zZXR1cF9zeW5jKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJ2ZGV2ICVpIHNldHVwIGZhaWxlZCAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzeW5jaHJvbmlzZSBzZXR1cCBmb3IgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJnLnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCisJYXItPm51bV9zdGFydGVkX3ZkZXZzKys7CisJYXRoMTBrX3JlY2FsY19yYWRhcl9kZXRlY3Rpb24oYXIpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTU4LDI4OCArODY5LDI4IEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfc3RvcChhciwgYXJ2aWYtPnZkZXZfaWQpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIldNSSB2ZGV2ICVpIHN0b3AgZmFpbGVkOiByZXQgJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3RvcCBXTUkgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gYXRoMTBrX3ZkZXZfc2V0dXBfc3luYyhhcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigidmRldiAlaSBzZXR1cCBzeW5jIGZhaWxlZCAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzeW5jcm9uaXNlIHNldHVwIGZvciB2ZGV2ICVpOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gcmV0OwotfQorCVdBUk5fT04oYXItPm51bV9zdGFydGVkX3ZkZXZzID09IDApOwogCi1zdGF0aWMgaW50IGF0aDEwa19tb25pdG9yX3N0YXJ0KHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgdmRldl9pZCkKLXsKLQlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYgPSAmYXItPmNoYW5kZWY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY2hhbmRlZi0+Y2hhbjsKLQlzdHJ1Y3Qgd21pX3ZkZXZfc3RhcnRfcmVxdWVzdF9hcmcgYXJnID0ge307Ci0JaW50IHJldCA9IDA7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7Ci0KLQlpZiAoIWFyLT5tb25pdG9yX3ByZXNlbnQpIHsKLQkJYXRoMTBrX3dhcm4oIm1hYyBtb250b3Igc3RvcCAtLSBtb25pdG9yIGlzIG5vdCBwcmVzZW50XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGFyLT5udW1fc3RhcnRlZF92ZGV2cyAhPSAwKSB7CisJCWFyLT5udW1fc3RhcnRlZF92ZGV2cy0tOworCQlhdGgxMGtfcmVjYWxjX3JhZGFyX2RldGVjdGlvbihhcik7CiAJfQogCi0JYXJnLnZkZXZfaWQgPSB2ZGV2X2lkOwotCWFyZy5jaGFubmVsLmZyZXEgPSBjaGFubmVsLT5jZW50ZXJfZnJlcTsKLQlhcmcuY2hhbm5lbC5iYW5kX2NlbnRlcl9mcmVxMSA9IGNoYW5kZWYtPmNlbnRlcl9mcmVxMTsKLQotCS8qIFRPRE8gc2V0dXAgdGhpcyBkeW5hbWljYWxseSwgd2hhdCBpbiBjYXNlIHdlCi0JICAgZG9uJ3QgaGF2ZSBhbnkgdmlmcz8gKi8KLQlhcmcuY2hhbm5lbC5tb2RlID0gY2hhbl90b19waHltb2RlKGNoYW5kZWYpOwotCWFyZy5jaGFubmVsLmNoYW5fcmFkYXIgPQotCQkJISEoY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUik7Ci0KLQlhcmcuY2hhbm5lbC5taW5fcG93ZXIgPSAwOwotCWFyZy5jaGFubmVsLm1heF9wb3dlciA9IGNoYW5uZWwtPm1heF9wb3dlciAqIDI7Ci0JYXJnLmNoYW5uZWwubWF4X3JlZ19wb3dlciA9IGNoYW5uZWwtPm1heF9yZWdfcG93ZXIgKiAyOwotCWFyZy5jaGFubmVsLm1heF9hbnRlbm5hX2dhaW4gPSBjaGFubmVsLT5tYXhfYW50ZW5uYV9nYWluICogMjsKLQotCXJldCA9IGF0aDEwa193bWlfdmRldl9zdGFydChhciwgJmFyZyk7Ci0JaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiTW9uaXRvciB2ZGV2ICVpIHN0YXJ0IGZhaWxlZDogcmV0ICVkXG4iLAotCQkJICAgIHZkZXZfaWQsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXRoMTBrX3ZkZXZfc2V0dXBfc3luYyhhcik7Ci0JaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiTW9uaXRvciB2ZGV2ICVpIHNldHVwIGZhaWxlZCAlZFxuIiwKLQkJCSAgICB2ZGV2X2lkLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IGF0aDEwa193bWlfdmRldl91cChhciwgdmRldl9pZCwgMCwgYXItPm1hY19hZGRyKTsKLQlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJNb25pdG9yIHZkZXYgJWkgdXAgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICB2ZGV2X2lkLCByZXQpOwotCQlnb3RvIHZkZXZfc3RvcDsKLQl9Ci0KLQlhci0+bW9uaXRvcl92ZGV2X2lkID0gdmRldl9pZDsKLQlhci0+bW9uaXRvcl9lbmFibGVkID0gdHJ1ZTsKLQotCXJldHVybiAwOwotCi12ZGV2X3N0b3A6Ci0JcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3N0b3AoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJNb25pdG9yIHZkZXYgJWkgc3RvcCBmYWlsZWQ6ICVkXG4iLAotCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIHJldCk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDEwa19tb25pdG9yX3N0b3Aoc3RydWN0IGF0aDEwayAqYXIpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7Ci0KLQlpZiAoIWFyLT5tb25pdG9yX3ByZXNlbnQpIHsKLQkJYXRoMTBrX3dhcm4oIm1hYyBtb250b3Igc3RvcCAtLSBtb25pdG9yIGlzIG5vdCBwcmVzZW50XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFhci0+bW9uaXRvcl9lbmFibGVkKSB7Ci0JCWF0aDEwa193YXJuKCJtYWMgbW9udG9yIHN0b3AgLS0gbW9uaXRvciBpcyBub3QgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGF0aDEwa193bWlfdmRldl9kb3duKGFyLCBhci0+bW9uaXRvcl92ZGV2X2lkKTsKLQlpZiAocmV0KQotCQlhdGgxMGtfd2FybigiTW9uaXRvciB2ZGV2ICVpIGRvd24gZmFpbGVkOiAlZFxuIiwKLQkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOwotCi0JcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3N0b3AoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJNb25pdG9yIHZkZXYgJWkgc3RvcCBmYWlsZWQ6ICVkXG4iLAotCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIHJldCk7Ci0KLQlyZXQgPSBhdGgxMGtfdmRldl9zZXR1cF9zeW5jKGFyKTsKLQlpZiAocmV0KQotCQlhdGgxMGtfd2FybigiTW9uaXRvcl9kb3duIHN5bmMgZmFpbGVkLCB2ZGV2ICVpOiAlZFxuIiwKLQkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOwotCi0JYXItPm1vbml0b3JfZW5hYmxlZCA9IGZhbHNlOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoMTBrX21vbml0b3JfY3JlYXRlKHN0cnVjdCBhdGgxMGsgKmFyKQotewotCWludCBiaXQsIHJldCA9IDA7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7Ci0KLQlpZiAoYXItPm1vbml0b3JfcHJlc2VudCkgewotCQlhdGgxMGtfd2FybigiTW9uaXRvciBtb2RlIGFscmVhZHkgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWJpdCA9IGZmcyhhci0+ZnJlZV92ZGV2X21hcCk7Ci0JaWYgKGJpdCA9PSAwKSB7Ci0JCWF0aDEwa193YXJuKCJObyBmcmVlIFZERVYgc2xvdHNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhci0+bW9uaXRvcl92ZGV2X2lkID0gYml0IC0gMTsKLQlhci0+ZnJlZV92ZGV2X21hcCAmPSB+KDEgPDwgYXItPm1vbml0b3JfdmRldl9pZCk7Ci0KLQlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfY3JlYXRlKGFyLCBhci0+bW9uaXRvcl92ZGV2X2lkLAotCQkJCSAgICAgV01JX1ZERVZfVFlQRV9NT05JVE9SLAotCQkJCSAgICAgMCwgYXItPm1hY19hZGRyKTsKLQlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJXTUkgdmRldiAlaSBtb25pdG9yIGNyZWF0ZSBmYWlsZWQ6IHJldCAlZFxuIiwKLQkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOwotCQlnb3RvIHZkZXZfZmFpbDsKLQl9Ci0KLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIG1vbml0b3IgdmRldiAlZCBjcmVhdGVkXG4iLAotCQkgICBhci0+bW9uaXRvcl92ZGV2X2lkKTsKLQotCWFyLT5tb25pdG9yX3ByZXNlbnQgPSB0cnVlOwotCXJldHVybiAwOwotCi12ZGV2X2ZhaWw6Ci0JLyoKLQkgKiBSZXN0b3JlIHRoZSBJRCB0byB0aGUgZ2xvYmFsIG1hcC4KLQkgKi8KLQlhci0+ZnJlZV92ZGV2X21hcCB8PSAxIDw8IChhci0+bW9uaXRvcl92ZGV2X2lkKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0aDEwa19tb25pdG9yX2Rlc3Ryb3koc3RydWN0IGF0aDEwayAqYXIpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7Ci0KLQlpZiAoIWFyLT5tb25pdG9yX3ByZXNlbnQpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2RlbGV0ZShhciwgYXItPm1vbml0b3JfdmRldl9pZCk7Ci0JaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiV01JIHZkZXYgJWkgbW9uaXRvciBkZWxldGUgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWFyLT5mcmVlX3ZkZXZfbWFwIHw9IDEgPDwgKGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCWFyLT5tb25pdG9yX3ByZXNlbnQgPSBmYWxzZTsKLQotCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgbW9uaXRvciB2ZGV2ICVkIGRlbGV0ZWRcbiIsCi0JCSAgIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoMTBrX3N0YXJ0X2NhYyhzdHJ1Y3QgYXRoMTBrICphcikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOwotCi0Jc2V0X2JpdChBVEgxMEtfQ0FDX1JVTk5JTkcsICZhci0+ZGV2X2ZsYWdzKTsKLQotCXJldCA9IGF0aDEwa19tb25pdG9yX2NyZWF0ZShhcik7Ci0JaWYgKHJldCkgewotCQljbGVhcl9iaXQoQVRIMTBLX0NBQ19SVU5OSU5HLCAmYXItPmRldl9mbGFncyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXRoMTBrX21vbml0b3Jfc3RhcnQoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCWlmIChyZXQpIHsKLQkJY2xlYXJfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpOwotCQlhdGgxMGtfbW9uaXRvcl9kZXN0cm95KGFyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIGNhYyBzdGFydCBtb25pdG9yIHZkZXYgJWRcbiIsCi0JCSAgIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoMTBrX3N0b3BfY2FjKHN0cnVjdCBhdGgxMGsgKmFyKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKLQotCS8qIENBQyBpcyBub3QgcnVubmluZyAtIGRvIG5vdGhpbmcgKi8KLQlpZiAoIXRlc3RfYml0KEFUSDEwS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpKQotCQlyZXR1cm4gMDsKLQotCWF0aDEwa19tb25pdG9yX3N0b3AoYXIpOwotCWF0aDEwa19tb25pdG9yX2Rlc3Ryb3koYXIpOwotCWNsZWFyX2JpdChBVEgxMEtfQ0FDX1JVTk5JTkcsICZhci0+ZGV2X2ZsYWdzKTsKLQotCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgY2FjIGZpbmlzaGVkXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYXRoMTBrX2Rmc19zdGF0ZShlbnVtIG5sODAyMTFfZGZzX3N0YXRlIGRmc19zdGF0ZSkKLXsKLQlzd2l0Y2ggKGRmc19zdGF0ZSkgewotCWNhc2UgTkw4MDIxMV9ERlNfVVNBQkxFOgotCQlyZXR1cm4gIlVTQUJMRSI7Ci0JY2FzZSBOTDgwMjExX0RGU19VTkFWQUlMQUJMRToKLQkJcmV0dXJuICJVTkFWQUlMQUJMRSI7Ci0JY2FzZSBOTDgwMjExX0RGU19BVkFJTEFCTEU6Ci0JCXJldHVybiAiQVZBSUxBQkxFIjsKLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gImJ1ZyI7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdGgxMGtfY29uZmlnX3JhZGFyX2RldGVjdGlvbihzdHJ1Y3QgYXRoMTBrICphcikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBhci0+aHctPmNvbmYuY2hhbmRlZi5jaGFuOwotCWJvb2wgcmFkYXIgPSBhci0+aHctPmNvbmYucmFkYXJfZW5hYmxlZDsKLQlib29sIGNoYW5fcmFkYXIgPSAhIShjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKTsKLQllbnVtIG5sODAyMTFfZGZzX3N0YXRlIGRmc19zdGF0ZSA9IGNoYW4tPmRmc19zdGF0ZTsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOwotCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyByYWRhciBjb25maWcgdXBkYXRlOiBjaGFuICVkTUh6IHJhZGFyICVkIGNoYW4gcmFkYXIgJWQgY2hhbiBzdGF0ZSAlc1xuIiwKLQkJICAgY2hhbi0+Y2VudGVyX2ZyZXEsIHJhZGFyLCBjaGFuX3JhZGFyLAotCQkgICBhdGgxMGtfZGZzX3N0YXRlKGRmc19zdGF0ZSkpOwotCi0JLyoKLQkgKiBJdCdzIHNhZmUgdG8gY2FsbCBpdCBldmVuIGlmIENBQyBpcyBub3Qgc3RhcnRlZC4KLQkgKiBUaGlzIGNhbGwgaGVyZSBndWFyYW50ZWVzIGNoYW5naW5nIGNoYW5uZWwsIGV0Yy4gd2lsbCBzdG9wIENBQy4KLQkgKi8KLQlhdGgxMGtfc3RvcF9jYWMoYXIpOwotCi0JaWYgKCFyYWRhcikKLQkJcmV0dXJuOwotCi0JaWYgKCFjaGFuX3JhZGFyKQotCQlyZXR1cm47Ci0KLQlpZiAoZGZzX3N0YXRlICE9IE5MODAyMTFfREZTX1VTQUJMRSkKLQkJcmV0dXJuOwotCi0JcmV0ID0gYXRoMTBrX3N0YXJ0X2NhYyhhcik7Ci0JaWYgKHJldCkgewotCQkvKgotCQkgKiBOb3QgcG9zc2libGUgdG8gc3RhcnQgQ0FDIG9uIGN1cnJlbnQgY2hhbm5lbCBzbyBzdGFydGluZwotCQkgKiByYWRpYXRpb24gaXMgbm90IGFsbG93ZWQsIG1ha2UgdGhpcyBjaGFubmVsIERGU19VTkFWQUlMQUJMRQotCQkgKiBieSBpbmRpY2F0aW5nIHRoYXQgcmFkYXIgd2FzIGRldGVjdGVkLgotCQkgKi8KLQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdGFydCBDQUMgKCVkKVxuIiwgcmV0KTsKLQkJaWVlZTgwMjExX3JhZGFyX2RldGVjdGVkKGFyLT5odyk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBhdGgxMGtfY29udHJvbF9iZWFjb25pbmcoc3RydWN0IGF0aDEwa192aWYgKmFydmlmLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8pCiB7CkBAIC04ODAsNyArOTMxLDcgQEAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfdXAoYXJ2aWYtPmFyLCBhcnZpZi0+dmRldl9pZCwgYXJ2aWYtPmFpZCwKIAkJCQkgYXJ2aWYtPmJzc2lkKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gYnJpbmcgdXAgdmRldiAlZDogJWlcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gYnJpbmcgdXAgdmRldiAlZDogJWlcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCWF0aDEwa192ZGV2X3N0b3AoYXJ2aWYpOwogCQlyZXR1cm47CkBAIC05MDQsNyArOTU1LDcgQEAKIAlpZiAoIWluZm8tPmlic3Nfam9pbmVkKSB7CiAJCXJldCA9IGF0aDEwa19wZWVyX2RlbGV0ZShhcnZpZi0+YXIsIGFydmlmLT52ZGV2X2lkLCBzZWxmX3BlZXIpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBkZWxldGUgSUJTUyBzZWxmIHBlZXI6JXBNIGZvciBWREVWOiVkIHJldDolZFxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gZGVsZXRlIElCU1Mgc2VsZiBwZWVyICVwTSBmb3IgdmRldiAlZDogJWRcbiIsCiAJCQkJICAgIHNlbGZfcGVlciwgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKIAkJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhcnZpZi0+YnNzaWQpKQpAQCAtOTEzLDcgKzk2NCw3IEBACiAJCXJldCA9IGF0aDEwa19wZWVyX2RlbGV0ZShhcnZpZi0+YXIsIGFydmlmLT52ZGV2X2lkLAogCQkJCQkgYXJ2aWYtPmJzc2lkKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBkZWxldGUgSUJTUyBCU1NJRCBwZWVyOiVwTSBmb3IgVkRFVjolZCByZXQ6JWRcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGRlbGV0ZSBJQlNTIEJTU0lEIHBlZXIgJXBNIGZvciB2ZGV2ICVkOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPmJzc2lkLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJCXJldHVybjsKIAkJfQpAQCAtOTI1LDcgKzk3Niw3IEBACiAKIAlyZXQgPSBhdGgxMGtfcGVlcl9jcmVhdGUoYXJ2aWYtPmFyLCBhcnZpZi0+dmRldl9pZCwgc2VsZl9wZWVyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gY3JlYXRlIElCU1Mgc2VsZiBwZWVyOiVwTSBmb3IgVkRFVjolZCByZXQ6JWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gY3JlYXRlIElCU1Mgc2VsZiBwZWVyICVwTSBmb3IgdmRldiAlZDogJWRcbiIsCiAJCQkgICAgc2VsZl9wZWVyLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTkzNCw3ICs5ODUsNyBAQAogCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXJ2aWYtPmFyLCBhcnZpZi0+dmRldl9pZCwgdmRldl9wYXJhbSwKIAkJCQkJQVRIMTBLX0RFRkFVTFRfQVRJTSk7CiAJaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgSUJTUyBBVElNIGZvciBWREVWOiVkIHJldDolZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgSUJTUyBBVElNIGZvciB2ZGV2ICVkOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIH0KIApAQCAtOTYxLDcgKzEwMTIsNyBAQAogCQlyZXQgPSBhdGgxMGtfd21pX3NldF9zdGFfcHNfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCBwYXJhbSwKIAkJCQkJCSAgY29uZi0+ZHluYW1pY19wc190aW1lb3V0KTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgaW5hY3Rpdml0eSB0aW1lIGZvciB2ZGV2ICVkOiAlaVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGluYWN0aXZpdHkgdGltZSBmb3IgdmRldiAlZDogJWlcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtOTc0LDggKzEwMjUsOCBAQAogCiAJcmV0ID0gYXRoMTBrX3dtaV9zZXRfcHNtb2RlKGFyLCBhcnZpZi0+dmRldl9pZCwgcHNtb2RlKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IFBTIE1vZGU6ICVkIGZvciBWREVWOiAlZFxuIiwKLQkJCSAgICBwc21vZGUsIGFydmlmLT52ZGV2X2lkKTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgUFMgTW9kZSAlZCBmb3IgdmRldiAlZDogJWRcbiIsCisJCQkgICAgcHNtb2RlLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE0MjksNyArMTQ4MCw3IEBACiAKIAlhcF9zdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCBic3NfY29uZi0+YnNzaWQpOwogCWlmICghYXBfc3RhKSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gZmluZCBzdGF0aW9uIGVudHJ5IGZvciAlcE0sIHZkZXYgJWlcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gZmluZCBzdGF0aW9uIGVudHJ5IGZvciBic3MgJXBNIHZkZXYgJWlcbiIsCiAJCQkgICAgYnNzX2NvbmYtPmJzc2lkLCBhcnZpZi0+dmRldl9pZCk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm47CkBAIC0xNDQyLDcgKzE0OTMsNyBAQAogCXJldCA9IGF0aDEwa19wZWVyX2Fzc29jX3ByZXBhcmUoYXIsIGFydmlmLCBhcF9zdGEsCiAJCQkJCWJzc19jb25mLCAmcGVlcl9hcmcpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIlBlZXIgYXNzb2MgcHJlcGFyZSBmYWlsZWQgZm9yICVwTSB2ZGV2ICVpXG46ICVkIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBwcmVwYXJlIHBlZXIgYXNzb2MgZm9yICVwTSB2ZGV2ICVpOiAlZFxuIiwKIAkJCSAgICBic3NfY29uZi0+YnNzaWQsIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwpAQCAtMTQ1Miw3ICsxNTAzLDcgQEAKIAogCXJldCA9IGF0aDEwa193bWlfcGVlcl9hc3NvYyhhciwgJnBlZXJfYXJnKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJQZWVyIGFzc29jIGZhaWxlZCBmb3IgJXBNIHZkZXYgJWlcbjogJWQiLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJ1biBwZWVyIGFzc29jIGZvciAlcE0gdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYnNzX2NvbmYtPmJzc2lkLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTE0NzMsNyArMTUyNCw3IEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfdXAoYXIsIGFydmlmLT52ZGV2X2lkLCBhcnZpZi0+YWlkLCBhcnZpZi0+YnNzaWQpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIlZERVY6ICVkIHVwIGZhaWxlZDogcmV0ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB2ZGV2ICVkIHVwOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MjQsNyArMTU3NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX3N0YXRpb25fYXNzb2Moc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBhdGgxMGtfdmlmICphcnZpZiwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgcmVhc3NvYykKIHsKIAlzdHJ1Y3Qgd21pX3BlZXJfYXNzb2NfY29tcGxldGVfYXJnIHBlZXJfYXJnOwogCWludCByZXQgPSAwOwpAQCAtMTUzMywzNCArMTU4NCw0NiBAQAogCiAJcmV0ID0gYXRoMTBrX3BlZXJfYXNzb2NfcHJlcGFyZShhciwgYXJ2aWYsIHN0YSwgTlVMTCwgJnBlZXJfYXJnKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJXTUkgcGVlciBhc3NvYyBwcmVwYXJlIGZhaWxlZCBmb3IgJXBNIHZkZXYgJWk6ICVpXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHByZXBhcmUgV01JIHBlZXIgYXNzb2MgZm9yICVwTSB2ZGV2ICVpOiAlaVxuIiwKIAkJCSAgICBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCXBlZXJfYXJnLnBlZXJfcmVhc3NvYyA9IHJlYXNzb2M7CiAJcmV0ID0gYXRoMTBrX3dtaV9wZWVyX2Fzc29jKGFyLCAmcGVlcl9hcmcpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIlBlZXIgYXNzb2MgZmFpbGVkIGZvciBTVEEgJXBNIHZkZXYgJWk6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJ1biBwZWVyIGFzc29jIGZvciBTVEEgJXBNIHZkZXYgJWk6ICVkXG4iLAogCQkJICAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gYXRoMTBrX3NldHVwX3BlZXJfc21wcyhhciwgYXJ2aWYsIHN0YS0+YWRkciwgJnN0YS0+aHRfY2FwKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0dXAgcGVlciBTTVBTIGZvciB2ZGV2OiAlZFxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXR1cCBwZWVyIFNNUFMgZm9yIHZkZXYgJWQ6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmICghc3RhLT53bWUpIHsKKwkJYXJ2aWYtPm51bV9sZWdhY3lfc3RhdGlvbnMrKzsKKwkJcmV0ICA9IGF0aDEwa19yZWNhbGNfcnRzY3RzX3Byb3QoYXJ2aWYpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlY2FsY3VsYXRlIHJ0cy9jdHMgcHJvdCBmb3IgdmRldiAlZDogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwogCXJldCA9IGF0aDEwa19pbnN0YWxsX3BlZXJfd2VwX2tleXMoYXJ2aWYsIHN0YS0+YWRkcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IGluc3RhbGwgcGVlciB3ZXAga2V5cyBmb3IgdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gaW5zdGFsbCBwZWVyIHdlcCBrZXlzIGZvciB2ZGV2ICVpOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBhdGgxMGtfcGVlcl9hc3NvY19xb3NfYXAoYXIsIGFydmlmLCBzdGEpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgcW9zIHBhcmFtcyBmb3IgU1RBICVwTSBmb3IgdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IHFvcyBwYXJhbXMgZm9yIFNUQSAlcE0gZm9yIHZkZXYgJWk6ICVkXG4iLAogCQkJICAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTU3NSw5ICsxNjM4LDE5IEBACiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CiAKKwlpZiAoIXN0YS0+d21lKSB7CisJCWFydmlmLT5udW1fbGVnYWN5X3N0YXRpb25zLS07CisJCXJldCA9IGF0aDEwa19yZWNhbGNfcnRzY3RzX3Byb3QoYXJ2aWYpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlY2FsY3VsYXRlIHJ0cy9jdHMgcHJvdCBmb3IgdmRldiAlZDogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwogCXJldCA9IGF0aDEwa19jbGVhcl9wZWVyX2tleXMoYXJ2aWYsIHN0YS0+YWRkcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IGNsZWFyIGFsbCBwZWVyIHdlcCBrZXlzIGZvciB2ZGV2ICVpOiAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBjbGVhciBhbGwgcGVlciB3ZXAga2V5cyBmb3IgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTY4NSwxOSArMTc1OCw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBlbnVtIHdtaV9kZnNfcmVnaW9uCithdGgxMGtfbWFjX2dldF9kZnNfcmVnaW9uKGVudW0gbmw4MDIxMV9kZnNfcmVnaW9ucyBkZnNfcmVnaW9uKQoreworCXN3aXRjaCAoZGZzX3JlZ2lvbikgeworCWNhc2UgTkw4MDIxMV9ERlNfVU5TRVQ6CisJCXJldHVybiBXTUlfVU5JTklUX0RGU19ET01BSU47CisJY2FzZSBOTDgwMjExX0RGU19GQ0M6CisJCXJldHVybiBXTUlfRkNDX0RGU19ET01BSU47CisJY2FzZSBOTDgwMjExX0RGU19FVFNJOgorCQlyZXR1cm4gV01JX0VUU0lfREZTX0RPTUFJTjsKKwljYXNlIE5MODAyMTFfREZTX0pQOgorCQlyZXR1cm4gV01JX01LSzRfREZTX0RPTUFJTjsKKwl9CisJcmV0dXJuIFdNSV9VTklOSVRfREZTX0RPTUFJTjsKK30KKwogc3RhdGljIHZvaWQgYXRoMTBrX3JlZ2RfdXBkYXRlKHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCByZWdfZG1uX3BhaXJfbWFwcGluZyAqcmVncGFpcjsKIAlpbnQgcmV0OworCWVudW0gd21pX2Rmc19yZWdpb24gd21pX2Rmc19yZWc7CisJZW51bSBubDgwMjExX2Rmc19yZWdpb25zIG5sX2Rmc19yZWc7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CiAKIAlyZXQgPSBhdGgxMGtfdXBkYXRlX2NoYW5uZWxfbGlzdChhcik7CiAJaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCB1cGRhdGUgY2hhbm5lbCBsaXN0ICglZClcbiIsIHJldCk7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gdXBkYXRlIGNoYW5uZWwgbGlzdDogJWRcbiIsIHJldCk7CiAKIAlyZWdwYWlyID0gYXItPmF0aF9jb21tb24ucmVndWxhdG9yeS5yZWdwYWlyOwogCisJaWYgKGNvbmZpZ19lbmFibGVkKENPTkZJR19BVEgxMEtfREZTX0NFUlRJRklFRCkgJiYgYXItPmRmc19kZXRlY3RvcikgeworCQlubF9kZnNfcmVnID0gYXItPmRmc19kZXRlY3Rvci0+cmVnaW9uOworCQl3bWlfZGZzX3JlZyA9IGF0aDEwa19tYWNfZ2V0X2Rmc19yZWdpb24obmxfZGZzX3JlZyk7CisJfSBlbHNlIHsKKwkJd21pX2Rmc19yZWcgPSBXTUlfVU5JTklUX0RGU19ET01BSU47CisJfQorCiAJLyogVGFyZ2V0IGFsbG93cyBzZXR0aW5nIHVwIHBlci1iYW5kIHJlZ2RvbWFpbiBidXQgYXRoX2NvbW1vbiBwcm92aWRlcwogCSAqIGEgY29tYmluZWQgb25lIG9ubHkgKi8KIAlyZXQgPSBhdGgxMGtfd21pX3BkZXZfc2V0X3JlZ2RvbWFpbihhciwKQEAgLTE3MDUsOSArMTgwMywxMCBAQAogCQkJCQkgICAgcmVncGFpci0+cmVnX2RvbWFpbiwgLyogMmdoeiAqLwogCQkJCQkgICAgcmVncGFpci0+cmVnX2RvbWFpbiwgLyogNWdoeiAqLwogCQkJCQkgICAgcmVncGFpci0+cmVnXzJnaHpfY3RsLAotCQkJCQkgICAgcmVncGFpci0+cmVnXzVnaHpfY3RsKTsKKwkJCQkJICAgIHJlZ3BhaXItPnJlZ181Z2h6X2N0bCwKKwkJCQkJICAgIHdtaV9kZnNfcmVnKTsKIAlpZiAocmV0KQotCQlhdGgxMGtfd2FybigiY291bGQgbm90IHNldCBwZGV2IHJlZ2RvbWFpbiAoJWQpXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBwZGV2IHJlZ2RvbWFpbjogJWRcbiIsIHJldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKQEAgLTE3MjUsNyArMTgyNCw3IEBACiAJCXJlc3VsdCA9IGFyLT5kZnNfZGV0ZWN0b3ItPnNldF9kZnNfZG9tYWluKGFyLT5kZnNfZGV0ZWN0b3IsCiAJCQkJCQkJICByZXF1ZXN0LT5kZnNfcmVnaW9uKTsKIAkJaWYgKCFyZXN1bHQpCi0JCQlhdGgxMGtfd2FybigiZGZzIHJlZ2lvbiAweCVYIG5vdCBzdXBwb3J0ZWQsIHdpbGwgdHJpZ2dlciByYWRhciBmb3IgZXZlcnkgcHVsc2VcbiIsCisJCQlhdGgxMGtfd2FybigiREZTIHJlZ2lvbiAweCVYIG5vdCBzdXBwb3J0ZWQsIHdpbGwgdHJpZ2dlciByYWRhciBmb3IgZXZlcnkgcHVsc2VcbiIsCiAJCQkJICAgIHJlcXVlc3QtPmRmc19yZWdpb24pOwogCX0KIApAQCAtMTc1OSwxMCArMTg1OCwxMCBAQAogCWlmIChpbmZvLT5jb250cm9sLnZpZikKIAkJcmV0dXJuIGF0aDEwa192aWZfdG9fYXJ2aWYoaW5mby0+Y29udHJvbC52aWYpLT52ZGV2X2lkOwogCi0JaWYgKGFyLT5tb25pdG9yX2VuYWJsZWQpCisJaWYgKGFyLT5tb25pdG9yX3N0YXJ0ZWQpCiAJCXJldHVybiBhci0+bW9uaXRvcl92ZGV2X2lkOwogCi0JYXRoMTBrX3dhcm4oImNvdWxkIG5vdCByZXNvbHZlIHZkZXYgaWRcbiIpOworCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcmVzb2x2ZSB2ZGV2IGlkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5Miw4ICsxODkxLDEzIEBACiAJCQkJCQl3ZXBfa2V5X3dvcmspOwogCWludCByZXQsIGtleWlkeCA9IGFydmlmLT5kZWZfd2VwX2tleV9uZXdpZHg7CiAKKwltdXRleF9sb2NrKCZhcnZpZi0+YXItPmNvbmZfbXV0ZXgpOworCisJaWYgKGFydmlmLT5hci0+c3RhdGUgIT0gQVRIMTBLX1NUQVRFX09OKQorCQlnb3RvIHVubG9jazsKKwogCWlmIChhcnZpZi0+ZGVmX3dlcF9rZXlfaWR4ID09IGtleWlkeCkKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAogCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgdmRldiAlZCBzZXQga2V5aWR4ICVkXG4iLAogCQkgICBhcnZpZi0+dmRldl9pZCwga2V5aWR4KTsKQEAgLTE4MDMsMTEgKzE5MDcsMTYgQEAKIAkJCQkJYXJ2aWYtPmFyLT53bWkudmRldl9wYXJhbS0+ZGVmX2tleWlkLAogCQkJCQlrZXlpZHgpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCB1cGRhdGUgd2VwIGtleWlkeCAoJWQpXG4iLCByZXQpOwotCQlyZXR1cm47CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gdXBkYXRlIHdlcCBrZXkgaW5kZXggZm9yIHZkZXYgJWQ6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2X2lkLAorCQkJICAgIHJldCk7CisJCWdvdG8gdW5sb2NrOwogCX0KIAogCWFydmlmLT5kZWZfd2VwX2tleV9pZHggPSBrZXlpZHg7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmFydmlmLT5hci0+Y29uZl9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa190eF9oX3VwZGF0ZV93ZXBfa2V5KHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xODc5LDcgKzE5ODgsNyBAQAogCQkJICAgICBhci0+ZndfZmVhdHVyZXMpKSB7CiAJCQlpZiAoc2tiX3F1ZXVlX2xlbigmYXItPndtaV9tZ210X3R4X3F1ZXVlKSA+PQogCQkJICAgIEFUSDEwS19NQVhfTlVNX01HTVRfUEVORElORykgewotCQkJCWF0aDEwa193YXJuKCJ3bWkgbWdtdF90eCBxdWV1ZSBsaW1pdCByZWFjaGVkXG4iKTsKKwkJCQlhdGgxMGtfd2FybigicmVhY2hlZCBXTUkgbWFuYWdlbWVudCB0cmFubWlzdCBxdWV1ZSBsaW1pdFxuIik7CiAJCQkJcmV0ID0gLUVCVVNZOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KQEAgLTE5MDMsNyArMjAxMiw3IEBACiAKIGV4aXQ6CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigidHggZmFpbGVkICglZCkuIGRyb3BwaW5nIHBhY2tldC5cbiIsIHJldCk7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0LCBkcm9wcGluZzogJWRcbiIsIHJldCk7CiAJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKIAl9CiB9CkBAIC0xOTY0LDcgKzIwNzMsNyBAQAogCQlpZiAoIXBlZXIpIHsKIAkJCXJldCA9IGF0aDEwa19wZWVyX2NyZWF0ZShhciwgdmRldl9pZCwgcGVlcl9hZGRyKTsKIAkJCWlmIChyZXQpCi0JCQkJYXRoMTBrX3dhcm4oInBlZXIgJXBNIG9uIHZkZXYgJWQgbm90IGNyZWF0ZWQgKCVkKVxuIiwKKwkJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBwZWVyICVwTSBvbiB2ZGV2ICVkOiAlZFxuIiwKIAkJCQkJICAgIHBlZXJfYWRkciwgdmRldl9pZCwgcmV0KTsKIAkJfQogCkBAIC0xOTg0LDcgKzIwOTMsNyBAQAogCQlpZiAoIXBlZXIpIHsKIAkJCXJldCA9IGF0aDEwa19wZWVyX2RlbGV0ZShhciwgdmRldl9pZCwgcGVlcl9hZGRyKTsKIAkJCWlmIChyZXQpCi0JCQkJYXRoMTBrX3dhcm4oInBlZXIgJXBNIG9uIHZkZXYgJWQgbm90IGRlbGV0ZWQgKCVkKVxuIiwKKwkJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGRlbGV0ZSBwZWVyICVwTSBvbiB2ZGV2ICVkOiAlZFxuIiwKIAkJCQkJICAgIHBlZXJfYWRkciwgdmRldl9pZCwgcmV0KTsKIAkJfQogCkBAIC0yMDE4LDcgKzIxMjcsOCBAQAogCiAJCXJldCA9IGF0aDEwa193bWlfbWdtdF90eChhciwgc2tiKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIndtaSBtZ210X3R4IGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byB0cmFuc21pdCBtYW5hZ2VtZW50IGZyYW1lIHZpYSBXTUk6ICVkXG4iLAorCQkJCSAgICByZXQpOwogCQkJaWVlZTgwMjExX2ZyZWVfdHhza2IoYXItPmh3LCBza2IpOwogCQl9CiAJfQpAQCAtMjA0Myw3ICsyMTUzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWF0aDEwa193YXJuKCJzY2FuIHRpbWVvdXQuIHJlc2V0dGluZy4gZncgaXNzdWU/XG4iKTsKKwlhdGgxMGtfd2Fybigic2NhbiB0aW1lZCBvdXQsIGZpcm13YXJlIHByb2JsZW0/XG4iKTsKIAogCWlmIChhci0+c2Nhbi5pc19yb2MpCiAJCWllZWU4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKGFyLT5odyk7CkBAIC0yMDc5LDcgKzIxODksNyBAQAogCiAJcmV0ID0gYXRoMTBrX3dtaV9zdG9wX3NjYW4oYXIsICZhcmcpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzdWJtaXQgd21pIHN0b3Agc2NhbiAoJWQpXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN0b3Agd21pIHNjYW46ICVkXG4iLCByZXQpOwogCQlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCQlhci0+c2Nhbi5pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQlhdGgxMGtfb2ZmY2hhbl90eF9wdXJnZShhcik7CkBAIC0yMDk5LDcgKzIyMDksNyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAlpZiAoYXItPnNjYW4uaW5fcHJvZ3Jlc3MpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzdG9wIHNjYW4uIGl0cyBzdGlsbCBpbiBwcm9ncmVzc1xuIik7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3RvcCBzY2FuLCBpdCdzIHN0aWxsIGluIHByb2dyZXNzXG4iKTsKIAkJYXItPnNjYW4uaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJYXRoMTBrX29mZmNoYW5fdHhfcHVyZ2UoYXIpOwogCQlyZXQgPSAtRVRJTUVET1VUOwpAQCAtMjE4Nyw3MiArMjI5NywxNzEgQEAKIAlhdGgxMGtfdHhfaHR0KGFyLCBza2IpOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSB2YXJpb3VzIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhdWxlcy4KLSAqLwotdm9pZCBhdGgxMGtfaGFsdChzdHJ1Y3QgYXRoMTBrICphcikKKy8qIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGNvbmZfbXV0ZXggaGVsZCBhcyB3b3JrZXJzIGNhbiB1c2UgdGhhdCBhbHNvLiAqLworc3RhdGljIHZvaWQgYXRoMTBrX2RyYWluX3R4KHN0cnVjdCBhdGgxMGsgKmFyKQogewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKwkvKiBtYWtlIHN1cmUgcmN1LXByb3RlY3RlZCBtYWM4MDIxMSB0eCBwYXRoIGl0c2VsZiBpcyBkcmFpbmVkICovCisJc3luY2hyb25pemVfbmV0KCk7CiAKLQlhdGgxMGtfc3RvcF9jYWMoYXIpOwotCWRlbF90aW1lcl9zeW5jKCZhci0+c2Nhbi50aW1lb3V0KTsKIAlhdGgxMGtfb2ZmY2hhbl90eF9wdXJnZShhcik7CiAJYXRoMTBrX21nbXRfb3Zlcl93bWlfdHhfcHVyZ2UoYXIpOworCisJY2FuY2VsX3dvcmtfc3luYygmYXItPm9mZmNoYW5fdHhfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmYXItPndtaV9tZ210X3R4X3dvcmspOworfQorCit2b2lkIGF0aDEwa19oYWx0KHN0cnVjdCBhdGgxMGsgKmFyKQoreworCXN0cnVjdCBhdGgxMGtfdmlmICphcnZpZjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmIChhdGgxMGtfbW9uaXRvcl9pc19lbmFibGVkKGFyKSkgeworCQljbGVhcl9iaXQoQVRIMTBLX0NBQ19SVU5OSU5HLCAmYXItPmRldl9mbGFncyk7CisJCWFyLT5wcm9taXNjID0gZmFsc2U7CisJCWFyLT5tb25pdG9yID0gZmFsc2U7CisJCWF0aDEwa19tb25pdG9yX3N0b3AoYXIpOworCX0KKworCWRlbF90aW1lcl9zeW5jKCZhci0+c2Nhbi50aW1lb3V0KTsKKwlhdGgxMGtfcmVzZXRfc2NhbigodW5zaWduZWQgbG9uZylhcik7CiAJYXRoMTBrX3BlZXJfY2xlYW51cF9hbGwoYXIpOwogCWF0aDEwa19jb3JlX3N0b3AoYXIpOwogCWF0aDEwa19oaWZfcG93ZXJfZG93bihhcik7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwotCWlmIChhci0+c2Nhbi5pbl9wcm9ncmVzcykgewotCQlkZWxfdGltZXIoJmFyLT5zY2FuLnRpbWVvdXQpOwotCQlhci0+c2Nhbi5pbl9wcm9ncmVzcyA9IGZhbHNlOwotCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoYXItPmh3LCB0cnVlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFydmlmLCAmYXItPmFydmlmcywgbGlzdCkgeworCQlpZiAoIWFydmlmLT5iZWFjb24pCisJCQljb250aW51ZTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKGFydmlmLT5hci0+ZGV2LAorCQkJCSBBVEgxMEtfU0tCX0NCKGFydmlmLT5iZWFjb24pLT5wYWRkciwKKwkJCQkgYXJ2aWYtPmJlYWNvbi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYXJ2aWYtPmJlYWNvbik7CisJCWFydmlmLT5iZWFjb24gPSBOVUxMOwogCX0KIAlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX2dldF9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgKnR4X2FudCwgdTMyICpyeF9hbnQpCit7CisJc3RydWN0IGF0aDEwayAqYXIgPSBody0+cHJpdjsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCWlmIChhci0+Y2ZnX3R4X2NoYWlubWFzaykgeworCQkqdHhfYW50ID0gYXItPmNmZ190eF9jaGFpbm1hc2s7CisJCSpyeF9hbnQgPSBhci0+Y2ZnX3J4X2NoYWlubWFzazsKKwl9IGVsc2UgeworCQkqdHhfYW50ID0gYXItPnN1cHBfdHhfY2hhaW5tYXNrOworCQkqcnhfYW50ID0gYXItPnN1cHBfcnhfY2hhaW5tYXNrOworCX0KKworCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19hdGgxMGtfc2V0X2FudGVubmEoc3RydWN0IGF0aDEwayAqYXIsIHUzMiB0eF9hbnQsIHUzMiByeF9hbnQpCit7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWFyLT5jZmdfdHhfY2hhaW5tYXNrID0gdHhfYW50OworCWFyLT5jZmdfcnhfY2hhaW5tYXNrID0gcnhfYW50OworCisJaWYgKChhci0+c3RhdGUgIT0gQVRIMTBLX1NUQVRFX09OKSAmJgorCSAgICAoYXItPnN0YXRlICE9IEFUSDEwS19TVEFURV9SRVNUQVJURUQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGF0aDEwa193bWlfcGRldl9zZXRfcGFyYW0oYXIsIGFyLT53bWkucGRldl9wYXJhbS0+dHhfY2hhaW5fbWFzaywKKwkJCQkJdHhfYW50KTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IHR4LWNoYWlubWFzazogJWQsIHJlcSAweCV4XG4iLAorCQkJICAgIHJldCwgdHhfYW50KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBhdGgxMGtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBhci0+d21pLnBkZXZfcGFyYW0tPnJ4X2NoYWluX21hc2ssCisJCQkJCXJ4X2FudCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCByeC1jaGFpbm1hc2s6ICVkLCByZXEgMHgleFxuIiwKKwkJCSAgICByZXQsIHJ4X2FudCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTBrX3NldF9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdHhfYW50LCB1MzIgcnhfYW50KQoreworCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKwlyZXQgPSBfX2F0aDEwa19zZXRfYW50ZW5uYShhciwgdHhfYW50LCByeF9hbnQpOworCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgYXRoMTBrX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAJaW50IHJldCA9IDA7CiAKKwkvKgorCSAqIFRoaXMgbWFrZXMgc2Vuc2Ugb25seSB3aGVuIHJlc3RhcnRpbmcgaHcuIEl0IGlzIGhhcm1sZXNzIHRvIGNhbGwKKwkgKiB1bmNvZGl0aW9uYWxseS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIG5vIEhUVC9XTUkgdHgKKwkgKiBjb21tYW5kcyB3aWxsIGJlIHN1Ym1pdHRlZCB3aGlsZSByZXN0YXJ0aW5nLgorCSAqLworCWF0aDEwa19kcmFpbl90eChhcik7CisKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAKLQlpZiAoYXItPnN0YXRlICE9IEFUSDEwS19TVEFURV9PRkYgJiYKLQkgICAgYXItPnN0YXRlICE9IEFUSDEwS19TVEFURV9SRVNUQVJUSU5HKSB7CisJc3dpdGNoIChhci0+c3RhdGUpIHsKKwljYXNlIEFUSDEwS19TVEFURV9PRkY6CisJCWFyLT5zdGF0ZSA9IEFUSDEwS19TVEFURV9PTjsKKwkJYnJlYWs7CisJY2FzZSBBVEgxMEtfU1RBVEVfUkVTVEFSVElORzoKKwkJYXRoMTBrX2hhbHQoYXIpOworCQlhci0+c3RhdGUgPSBBVEgxMEtfU1RBVEVfUkVTVEFSVEVEOworCQlicmVhazsKKwljYXNlIEFUSDEwS19TVEFURV9PTjoKKwljYXNlIEFUSDEwS19TVEFURV9SRVNUQVJURUQ6CisJY2FzZSBBVEgxMEtfU1RBVEVfV0VER0VEOgorCQlXQVJOX09OKDEpOwogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IGF0aDEwa19oaWZfcG93ZXJfdXAoYXIpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX2VycigiY291bGQgbm90IGluaXQgaGlmICglZClcbiIsIHJldCk7Ci0JCWFyLT5zdGF0ZSA9IEFUSDEwS19TVEFURV9PRkY7Ci0JCWdvdG8gZXhpdDsKKwkJYXRoMTBrX2VycigiQ291bGQgbm90IGluaXQgaGlmOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfb2ZmOwogCX0KIAogCXJldCA9IGF0aDEwa19jb3JlX3N0YXJ0KGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa19lcnIoImNvdWxkIG5vdCBpbml0IGNvcmUgKCVkKVxuIiwgcmV0KTsKLQkJYXRoMTBrX2hpZl9wb3dlcl9kb3duKGFyKTsKLQkJYXItPnN0YXRlID0gQVRIMTBLX1NUQVRFX09GRjsKLQkJZ290byBleGl0OworCQlhdGgxMGtfZXJyKCJDb3VsZCBub3QgaW5pdCBjb3JlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcG93ZXJfZG93bjsKIAl9CiAKLQlpZiAoYXItPnN0YXRlID09IEFUSDEwS19TVEFURV9PRkYpCi0JCWFyLT5zdGF0ZSA9IEFUSDEwS19TVEFURV9PTjsKLQllbHNlIGlmIChhci0+c3RhdGUgPT0gQVRIMTBLX1NUQVRFX1JFU1RBUlRJTkcpCi0JCWFyLT5zdGF0ZSA9IEFUSDEwS19TVEFURV9SRVNUQVJURUQ7Ci0KIAlyZXQgPSBhdGgxMGtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBhci0+d21pLnBkZXZfcGFyYW0tPnBtZl9xb3MsIDEpOwotCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJjb3VsZCBub3QgZW5hYmxlIFdNSV9QREVWX1BBUkFNX1BNRl9RT1MgKCVkKVxuIiwKLQkJCSAgICByZXQpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBlbmFibGUgUE1GIFFPUzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2NvcmVfc3RvcDsKKwl9CiAKIAlyZXQgPSBhdGgxMGtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBhci0+d21pLnBkZXZfcGFyYW0tPmR5bmFtaWNfYncsIDEpOwotCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJjb3VsZCBub3QgaW5pdCBXTUlfUERFVl9QQVJBTV9EWU5BTUlDX0JXICglZClcbiIsCi0JCQkgICAgcmV0KTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gZW5hYmxlIGR5bmFtaWMgQlc6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jb3JlX3N0b3A7CisJfQorCisJaWYgKGFyLT5jZmdfdHhfY2hhaW5tYXNrKQorCQlfX2F0aDEwa19zZXRfYW50ZW5uYShhciwgYXItPmNmZ190eF9jaGFpbm1hc2ssCisJCQkJICAgICBhci0+Y2ZnX3J4X2NoYWlubWFzayk7CiAKIAkvKgogCSAqIEJ5IGRlZmF1bHQgRlcgc2V0IEFSUCBmcmFtZXMgYWMgdG8gdm9pY2UgKDYpLiBJbiB0aGF0IGNhc2UgQVJQCkBAIC0yMjY2LDE1ICsyNDc1LDI3IEBACiAJcmV0ID0gYXRoMTBrX3dtaV9wZGV2X3NldF9wYXJhbShhciwKIAkJCQkJYXItPndtaS5wZGV2X3BhcmFtLT5hcnBfYWNfb3ZlcnJpZGUsIDApOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgYXJwIGFjIG92ZXJyaWRlIHBhcmFtZXRlcjogJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGFycCBhYyBvdmVycmlkZSBwYXJhbWV0ZXI6ICVkXG4iLAogCQkJICAgIHJldCk7Ci0JCWdvdG8gZXhpdDsKKwkJZ290byBlcnJfY29yZV9zdG9wOwogCX0KIAorCWFyLT5udW1fc3RhcnRlZF92ZGV2cyA9IDA7CiAJYXRoMTBrX3JlZ2RfdXBkYXRlKGFyKTsKLQlyZXQgPSAwOwogCi1leGl0OgorCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOworCXJldHVybiAwOworCitlcnJfY29yZV9zdG9wOgorCWF0aDEwa19jb3JlX3N0b3AoYXIpOworCitlcnJfcG93ZXJfZG93bjoKKwlhdGgxMGtfaGlmX3Bvd2VyX2Rvd24oYXIpOworCitlcnJfb2ZmOgorCWFyLT5zdGF0ZSA9IEFUSDEwS19TVEFURV9PRkY7CisKK2VycjoKIAltdXRleF91bmxvY2soJmFyLT5jb25mX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI4MywxOSArMjUwNCwxNSBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAKLQltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7Ci0JaWYgKGFyLT5zdGF0ZSA9PSBBVEgxMEtfU1RBVEVfT04gfHwKLQkgICAgYXItPnN0YXRlID09IEFUSDEwS19TVEFURV9SRVNUQVJURUQgfHwKLQkgICAgYXItPnN0YXRlID09IEFUSDEwS19TVEFURV9XRURHRUQpCi0JCWF0aDEwa19oYWx0KGFyKTsKKwlhdGgxMGtfZHJhaW5fdHgoYXIpOwogCi0JYXItPnN0YXRlID0gQVRIMTBLX1NUQVRFX09GRjsKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisJaWYgKGFyLT5zdGF0ZSAhPSBBVEgxMEtfU1RBVEVfT0ZGKSB7CisJCWF0aDEwa19oYWx0KGFyKTsKKwkJYXItPnN0YXRlID0gQVRIMTBLX1NUQVRFX09GRjsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAKLQlhdGgxMGtfbWdtdF9vdmVyX3dtaV90eF9wdXJnZShhcik7Ci0KLQljYW5jZWxfd29ya19zeW5jKCZhci0+b2ZmY2hhbl90eF93b3JrKTsKLQljYW5jZWxfd29ya19zeW5jKCZhci0+d21pX21nbXRfdHhfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmYXItPnJlc3RhcnRfd29yayk7CiB9CiAKQEAgLTIzMDksNyArMjUyNiw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhcnZpZiwgJmFyLT5hcnZpZnMsIGxpc3QpIHsKIAkJcmV0ID0gYXRoMTBrX21hY192aWZfc2V0dXBfcHMoYXJ2aWYpOwogCQlpZiAocmV0KSB7Ci0JCQlhdGgxMGtfd2FybigiY291bGQgbm90IHNldHVwIHBvd2Vyc2F2ZSAoJWQpXG4iLCByZXQpOworCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXR1cCBwb3dlcnNhdmU6ICVkXG4iLCByZXQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yMzQzLDcgKzI1NjAsNiBAQAogc3RhdGljIHZvaWQgYXRoMTBrX2NvbmZpZ19jaGFuKHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfdmlmICphcnZpZjsKLQlib29sIG1vbml0b3Jfd2FzX2VuYWJsZWQ7CiAJaW50IHJldDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKQEAgLTIzNTcsMTAgKzI1NzMsOCBAQAogCiAJLyogRmlyc3Qgc3RvcCBtb25pdG9yIGludGVyZmFjZS4gU29tZSBGVyB2ZXJzaW9ucyBjcmFzaCBpZiB0aGVyZSdzIGEKIAkgKiBsb25lIG1vbml0b3IgaW50ZXJmYWNlLiAqLwotCW1vbml0b3Jfd2FzX2VuYWJsZWQgPSBhci0+bW9uaXRvcl9lbmFibGVkOwotCi0JaWYgKGFyLT5tb25pdG9yX2VuYWJsZWQpCi0JCWF0aDEwa19tb25pdG9yX3N0b3AoYXIpOworCWlmIChhci0+bW9uaXRvcl9zdGFydGVkKQorCQlhdGgxMGtfbW9uaXRvcl92ZGV2X3N0b3AoYXIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhcnZpZiwgJmFyLT5hcnZpZnMsIGxpc3QpIHsKIAkJaWYgKCFhcnZpZi0+aXNfc3RhcnRlZCkKQEAgLTIzNzEsNyArMjU4NSw3IEBACiAKIAkJcmV0ID0gYXRoMTBrX3ZkZXZfc3RvcChhcnZpZik7CiAJCWlmIChyZXQpIHsKLQkJCWF0aDEwa193YXJuKCJjb3VsZCBub3Qgc3RvcCB2ZGV2ICVkICglZClcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN0b3AgdmRldiAlZDogJWRcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTIzODgsNyArMjYwMiw3IEBACiAKIAkJcmV0ID0gYXRoMTBrX3ZkZXZfc3RhcnQoYXJ2aWYpOwogCQlpZiAocmV0KSB7Ci0JCQlhdGgxMGtfd2FybigiY291bGQgbm90IHN0YXJ0IHZkZXYgJWQgKCVkKVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3RhcnQgdmRldiAlZDogJWRcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTIzOTksMTQgKzI2MTMsMTQgQEAKIAkJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3VwKGFydmlmLT5hciwgYXJ2aWYtPnZkZXZfaWQsIGFydmlmLT5haWQsCiAJCQkJCSBhcnZpZi0+YnNzaWQpOwogCQlpZiAocmV0KSB7Ci0JCQlhdGgxMGtfd2FybigiY291bGQgbm90IGJyaW5nIHZkZXYgdXAgJWQgKCVkKVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gYnJpbmcgdmRldiB1cCAlZDogJWRcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQkJY29udGludWU7CiAJCX0KIAl9CiAKLQlpZiAobW9uaXRvcl93YXNfZW5hYmxlZCkKLQkJYXRoMTBrX21vbml0b3Jfc3RhcnQoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCWlmIChhdGgxMGtfbW9uaXRvcl9pc19lbmFibGVkKGFyKSkKKwkJYXRoMTBrX21vbml0b3JfdmRldl9zdGFydChhciwgYXItPm1vbml0b3JfdmRldl9pZCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCkBAIC0yNDIwLDE1ICsyNjM0LDE3IEBACiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSB7CiAJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsCi0JCQkgICAibWFjIGNvbmZpZyBjaGFubmVsICVkIG1oeiBmbGFncyAweCV4XG4iLAorCQkJICAgIm1hYyBjb25maWcgY2hhbm5lbCAlZE1IeiBmbGFncyAweCV4IHJhZGFyICVkXG4iLAogCQkJICAgY29uZi0+Y2hhbmRlZi5jaGFuLT5jZW50ZXJfZnJlcSwKLQkJCSAgIGNvbmYtPmNoYW5kZWYuY2hhbi0+ZmxhZ3MpOworCQkJICAgY29uZi0+Y2hhbmRlZi5jaGFuLT5mbGFncywKKwkJCSAgIGNvbmYtPnJhZGFyX2VuYWJsZWQpOwogCiAJCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAJCWFyLT5yeF9jaGFubmVsID0gY29uZi0+Y2hhbmRlZi5jaGFuOwogCQlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAKLQkJYXRoMTBrX2NvbmZpZ19yYWRhcl9kZXRlY3Rpb24oYXIpOworCQlhci0+cmFkYXJfZW5hYmxlZCA9IGNvbmYtPnJhZGFyX2VuYWJsZWQ7CisJCWF0aDEwa19yZWNhbGNfcmFkYXJfZGV0ZWN0aW9uKGFyKTsKIAogCQlpZiAoIWNmZzgwMjExX2NoYW5kZWZfaWRlbnRpY2FsKCZhci0+Y2hhbmRlZiwgJmNvbmYtPmNoYW5kZWYpKSB7CiAJCQlhci0+Y2hhbmRlZiA9IGNvbmYtPmNoYW5kZWY7CkBAIC0yNDQ0LDE0ICsyNjYwLDE0IEBACiAJCXJldCA9IGF0aDEwa193bWlfcGRldl9zZXRfcGFyYW0oYXIsIHBhcmFtLAogCQkJCQkJaHctPmNvbmYucG93ZXJfbGV2ZWwgKiAyKTsKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJtYWMgZmFpbGVkIHRvIHNldCAyZyB0eHBvd2VyICVkICglZClcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCAyZyB0eHBvd2VyICVkOiAlZFxuIiwKIAkJCQkgICAgaHctPmNvbmYucG93ZXJfbGV2ZWwsIHJldCk7CiAKIAkJcGFyYW0gPSBhci0+d21pLnBkZXZfcGFyYW0tPnR4cG93ZXJfbGltaXQ1ZzsKIAkJcmV0ID0gYXRoMTBrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgcGFyYW0sCiAJCQkJCQlody0+Y29uZi5wb3dlcl9sZXZlbCAqIDIpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIm1hYyBmYWlsZWQgdG8gc2V0IDVnIHR4cG93ZXIgJWQgKCVkKVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IDVnIHR4cG93ZXIgJWQ6ICVkXG4iLAogCQkJCSAgICBody0+Y29uZi5wb3dlcl9sZXZlbCwgcmV0KTsKIAl9CiAKQEAgLTI0NTksMTAgKzI2NzUsMTkgQEAKIAkJYXRoMTBrX2NvbmZpZ19wcyhhcik7CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9NT05JVE9SKSB7Ci0JCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX01PTklUT1IpCi0JCQlyZXQgPSBhdGgxMGtfbW9uaXRvcl9jcmVhdGUoYXIpOwotCQllbHNlCi0JCQlyZXQgPSBhdGgxMGtfbW9uaXRvcl9kZXN0cm95KGFyKTsKKwkJaWYgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfTU9OSVRPUiAmJiAhYXItPm1vbml0b3IpIHsKKwkJCWFyLT5tb25pdG9yID0gdHJ1ZTsKKwkJCXJldCA9IGF0aDEwa19tb25pdG9yX3N0YXJ0KGFyKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHN0YXJ0IG1vbml0b3IgKGNvbmZpZyk6ICVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCQlhci0+bW9uaXRvciA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgaWYgKCEoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9NT05JVE9SKSAmJgorCQkJICAgYXItPm1vbml0b3IpIHsKKwkJCWFyLT5tb25pdG9yID0gZmFsc2U7CisJCQlhdGgxMGtfbW9uaXRvcl9zdG9wKGFyKTsKKwkJfQogCX0KIAogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtMjQ5NywxMiArMjcyMiw2IEBACiAJSU5JVF9XT1JLKCZhcnZpZi0+d2VwX2tleV93b3JrLCBhdGgxMGtfdHhfd2VwX2tleV93b3JrKTsKIAlJTklUX0xJU1RfSEVBRCgmYXJ2aWYtPmxpc3QpOwogCi0JaWYgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgJiYgYXItPm1vbml0b3JfcHJlc2VudCkgewotCQlhdGgxMGtfd2FybigiT25seSBvbmUgbW9uaXRvciBpbnRlcmZhY2UgYWxsb3dlZFxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnI7Ci0JfQotCiAJYml0ID0gZmZzKGFyLT5mcmVlX3ZkZXZfbWFwKTsKIAlpZiAoYml0ID09IDApIHsKIAkJcmV0ID0gLUVCVVNZOwpAQCAtMjU0NSw3ICsyNzY0LDcgQEAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfY3JlYXRlKGFyLCBhcnZpZi0+dmRldl9pZCwgYXJ2aWYtPnZkZXZfdHlwZSwKIAkJCQkgICAgIGFydmlmLT52ZGV2X3N1YnR5cGUsIHZpZi0+YWRkcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiV01JIHZkZXYgJWkgY3JlYXRlIGZhaWxlZDogcmV0ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBXTUkgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTI1NTcsNyArMjc3Niw3IEBACiAJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3NldF9wYXJhbShhciwgMCwgdmRldl9wYXJhbSwKIAkJCQkJYXJ2aWYtPmRlZl93ZXBfa2V5X2lkeCk7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIHNldCB2ZGV2ICVpIGRlZmF1bHQga2V5aWQ6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB2ZGV2ICVpIGRlZmF1bHQga2V5IGlkOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJZ290byBlcnJfdmRldl9kZWxldGU7CiAJfQpAQCAtMjU2Nyw3ICsyNzg2LDcgQEAKIAkJCQkJQVRIMTBLX0hXX1RYUlhfTkFUSVZFX1dJRkkpOwogCS8qIDEwLlggZmlybXdhcmUgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIFZERVYgcGFyYW1ldGVyLiBEbyBub3Qgd2FybiAqLwogCWlmIChyZXQgJiYgcmV0ICE9IC1FT1BOT1RTVVBQKSB7Ci0JCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IHZkZXYgJWkgVFggZW5jYXA6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB2ZGV2ICVpIFRYIGVuY2Fwc3VsYXRpb246ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlnb3RvIGVycl92ZGV2X2RlbGV0ZTsKIAl9CkBAIC0yNTc1LDE0ICsyNzk0LDE0IEBACiAJaWYgKGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkgewogCQlyZXQgPSBhdGgxMGtfcGVlcl9jcmVhdGUoYXIsIGFydmlmLT52ZGV2X2lkLCB2aWYtPmFkZHIpOwogCQlpZiAocmV0KSB7Ci0JCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIGNyZWF0ZSB2ZGV2ICVpIHBlZXIgZm9yIEFQOiAlZFxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gY3JlYXRlIHZkZXYgJWkgcGVlciBmb3IgQVA6ICVkXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJCWdvdG8gZXJyX3ZkZXZfZGVsZXRlOwogCQl9CiAKIAkJcmV0ID0gYXRoMTBrX21hY19zZXRfa2lja291dChhcnZpZik7CiAJCWlmIChyZXQpIHsKLQkJCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IHZkZXYgJWkga2lja291dCBwYXJhbWV0ZXJzOiAlZFxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IHZkZXYgJWkga2lja291dCBwYXJhbWV0ZXJzOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCQlnb3RvIGVycl9wZWVyX2RlbGV0ZTsKIAkJfQpAQCAtMjU5NCw3ICsyODEzLDcgQEAKIAkJcmV0ID0gYXRoMTBrX3dtaV9zZXRfc3RhX3BzX3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKIAkJCQkJCSAgcGFyYW0sIHZhbHVlKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgdmRldiAlaSBSWCB3YWtlIHBvbGljeTogJWRcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB2ZGV2ICVpIFJYIHdha2UgcG9saWN5OiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCQlnb3RvIGVycl9wZWVyX2RlbGV0ZTsKIAkJfQpAQCAtMjYwNCw3ICsyODIzLDcgQEAKIAkJcmV0ID0gYXRoMTBrX3dtaV9zZXRfc3RhX3BzX3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKIAkJCQkJCSAgcGFyYW0sIHZhbHVlKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgdmRldiAlaSBUWCB3YWtlIHRocmVzaDogJWRcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB2ZGV2ICVpIFRYIHdha2UgdGhyZXNoOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCQlnb3RvIGVycl9wZWVyX2RlbGV0ZTsKIAkJfQpAQCAtMjYxNCw3ICsyODMzLDcgQEAKIAkJcmV0ID0gYXRoMTBrX3dtaV9zZXRfc3RhX3BzX3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKIAkJCQkJCSAgcGFyYW0sIHZhbHVlKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgdmRldiAlaSBQU1BPTEwgY291bnQ6ICVkXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgdmRldiAlaSBQU1BPTEwgY291bnQ6ICVkXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJCWdvdG8gZXJyX3BlZXJfZGVsZXRlOwogCQl9CkBAIC0yNjIyLDIxICsyODQxLDE4IEBACiAKIAlyZXQgPSBhdGgxMGtfbWFjX3NldF9ydHMoYXJ2aWYsIGFyLT5ody0+d2lwaHktPnJ0c190aHJlc2hvbGQpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgcnRzIHRocmVzaG9sZCBmb3IgdmRldiAlZCAoJWQpXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBydHMgdGhyZXNob2xkIGZvciB2ZGV2ICVkOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAkJZ290byBlcnJfcGVlcl9kZWxldGU7CiAJfQogCiAJcmV0ID0gYXRoMTBrX21hY19zZXRfZnJhZyhhcnZpZiwgYXItPmh3LT53aXBoeS0+ZnJhZ190aHJlc2hvbGQpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgZnJhZyB0aHJlc2hvbGQgZm9yIHZkZXYgJWQgKCVkKVxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgZnJhZyB0aHJlc2hvbGQgZm9yIHZkZXYgJWQ6ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlnb3RvIGVycl9wZWVyX2RlbGV0ZTsKIAl9CiAKLQlpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX01PTklUT1IpCi0JCWFyLT5tb25pdG9yX3ByZXNlbnQgPSB0cnVlOwotCiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAJcmV0dXJuIDA7CiAKQEAgLTI2NjgsNiArMjg4NCw5IEBACiAKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCWlmIChhcnZpZi0+YmVhY29uKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoYXJ2aWYtPmFyLT5kZXYsCisJCQkJIEFUSDEwS19TS0JfQ0IoYXJ2aWYtPmJlYWNvbiktPnBhZGRyLAorCQkJCSBhcnZpZi0+YmVhY29uLT5sZW4sIERNQV9UT19ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShhcnZpZi0+YmVhY29uKTsKIAkJYXJ2aWYtPmJlYWNvbiA9IE5VTEw7CiAJfQpAQCAtMjY3OSw3ICsyODk4LDcgQEAKIAlpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQKSB7CiAJCXJldCA9IGF0aDEwa19wZWVyX2RlbGV0ZShhcnZpZi0+YXIsIGFydmlmLT52ZGV2X2lkLCB2aWYtPmFkZHIpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byByZW1vdmUgcGVlciBmb3IgQVAgdmRldiAlaTogJWRcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlbW92ZSBwZWVyIGZvciBBUCB2ZGV2ICVpOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKIAkJa2ZyZWUoYXJ2aWYtPnUuYXAubm9hX2RhdGEpOwpAQCAtMjY5MCwxMiArMjkwOSw5IEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfZGVsZXRlKGFyLCBhcnZpZi0+dmRldl9pZCk7CiAJaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oIldNSSB2ZGV2ICVpIGRlbGV0ZSBmYWlsZWQ6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGRlbGV0ZSBXTUkgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKLQlpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX01PTklUT1IpCi0JCWFyLT5tb25pdG9yX3ByZXNlbnQgPSBmYWxzZTsKLQogCWF0aDEwa19wZWVyX2NsZWFudXAoYXIsIGFydmlmLT52ZGV2X2lkKTsKIAogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtMjcyOCwyOCArMjk0NCwxNyBAQAogCSp0b3RhbF9mbGFncyAmPSBTVVBQT1JURURfRklMVEVSUzsKIAlhci0+ZmlsdGVyX2ZsYWdzID0gKnRvdGFsX2ZsYWdzOwogCi0JLyogTW9uaXRvciBtdXN0IG5vdCBiZSBzdGFydGVkIGlmIGl0IHdhc24ndCBjcmVhdGVkIGZpcnN0LgotCSAqIFByb21pc2N1b3VzIG1vZGUgbWF5IGJlIHN0YXJ0ZWQgb24gYSBub24tbW9uaXRvciBpbnRlcmZhY2UgLSBpbgotCSAqIHN1Y2ggY2FzZSB0aGUgbW9uaXRvciB2ZGV2IGlzIG5vdCBjcmVhdGVkIHNvIHN0YXJ0aW5nIHRoZQotCSAqIG1vbml0b3IgbWFrZXMgbm8gc2Vuc2UuIFNpbmNlIGF0aDEwayB1c2VzIG5vIHNwZWNpYWwgUlggZmlsdGVycwotCSAqIChvbmx5IEJTUyBmaWx0ZXIgaW4gU1RBIG1vZGUpIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYW55IHNwZWNpYWwKLQkgKiBhY3Rpb24gaGVyZS4gKi8KLQlpZiAoKGFyLT5maWx0ZXJfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpICYmCi0JICAgICFhci0+bW9uaXRvcl9lbmFibGVkICYmIGFyLT5tb25pdG9yX3ByZXNlbnQpIHsKLQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yICVkIHN0YXJ0XG4iLAotCQkJICAgYXItPm1vbml0b3JfdmRldl9pZCk7Ci0KLQkJcmV0ID0gYXRoMTBrX21vbml0b3Jfc3RhcnQoYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOwotCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIlVuYWJsZSB0byBzdGFydCBtb25pdG9yIG1vZGVcbiIpOwotCX0gZWxzZSBpZiAoIShhci0+ZmlsdGVyX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKSAmJgotCQkgICBhci0+bW9uaXRvcl9lbmFibGVkICYmIGFyLT5tb25pdG9yX3ByZXNlbnQpIHsKLQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yICVkIHN0b3BcbiIsCi0JCQkgICBhci0+bW9uaXRvcl92ZGV2X2lkKTsKLQotCQlyZXQgPSBhdGgxMGtfbW9uaXRvcl9zdG9wKGFyKTsKLQkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJVbmFibGUgdG8gc3RvcCBtb25pdG9yIG1vZGVcbiIpOworCWlmIChhci0+ZmlsdGVyX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTICYmICFhci0+cHJvbWlzYykgeworCQlhci0+cHJvbWlzYyA9IHRydWU7CisJCXJldCA9IGF0aDEwa19tb25pdG9yX3N0YXJ0KGFyKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdGFydCBtb25pdG9yIChwcm9taXNjKTogJWRcbiIsCisJCQkJICAgIHJldCk7CisJCQlhci0+cHJvbWlzYyA9IGZhbHNlOworCQl9CisJfSBlbHNlIGlmICghKGFyLT5maWx0ZXJfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpICYmIGFyLT5wcm9taXNjKSB7CisJCWFyLT5wcm9taXNjID0gZmFsc2U7CisJCWF0aDEwa19tb25pdG9yX3N0b3AoYXIpOwogCX0KIAogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtMjc4MCw3ICsyOTg1LDcgQEAKIAkJCSAgIGFydmlmLT52ZGV2X2lkLCBhcnZpZi0+YmVhY29uX2ludGVydmFsKTsKIAogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgYmVhY29uIGludGVydmFsIGZvciB2ZGV2ICVkOiAlaVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGJlYWNvbiBpbnRlcnZhbCBmb3IgdmRldiAlZDogJWlcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCX0KIApAQCAtMjc5Myw3ICsyOTk4LDcgQEAKIAkJcmV0ID0gYXRoMTBrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgcGRldl9wYXJhbSwKIAkJCQkJCVdNSV9CRUFDT05fU1RBR0dFUkVEX01PREUpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgYmVhY29uIG1vZGUgZm9yIHZkZXYgJWQ6ICVpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgYmVhY29uIG1vZGUgZm9yIHZkZXYgJWQ6ICVpXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAl9CiAKQEAgLTI4MDgsNyArMzAxMyw3IEBACiAJCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCB2ZGV2X3BhcmFtLAogCQkJCQkJYXJ2aWYtPmR0aW1fcGVyaW9kKTsKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gc2V0IGR0aW0gcGVyaW9kIGZvciB2ZGV2ICVkOiAlaVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGR0aW0gcGVyaW9kIGZvciB2ZGV2ICVkOiAlaVxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJfQogCkBAIC0yODIwLDcgKzMwMjUsMTIgQEAKIAkJYXJ2aWYtPnUuYXAuaGlkZGVuX3NzaWQgPSBpbmZvLT5oaWRkZW5fc3NpZDsKIAl9CiAKLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSB7CisJLyoKKwkgKiBGaXJtd2FyZSBtYW5hZ2VzIEFQIHNlbGYtcGVlciBpbnRlcm5hbGx5IHNvIG1ha2Ugc3VyZSB0byBub3QgY3JlYXRlCisJICogaXQgaW4gZHJpdmVyLiBPdGhlcndpc2UgQVAgc2VsZi1wZWVyIGRlbGV0aW9uIG1heSB0aW1lb3V0IGxhdGVyLgorCSAqLworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQgJiYKKwkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGluZm8tPmJzc2lkKSkgewogCQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01BQywKIAkJCQkgICAibWFjIHZkZXYgJWQgY3JlYXRlIHBlZXIgJXBNXG4iLApAQCAtMjgyOSw3ICszMDM5LDcgQEAKIAkJCXJldCA9IGF0aDEwa19wZWVyX2NyZWF0ZShhciwgYXJ2aWYtPnZkZXZfaWQsCiAJCQkJCQkgaW5mby0+YnNzaWQpOwogCQkJaWYgKHJldCkKLQkJCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIGFkZCBwZWVyICVwTSBmb3IgdmRldiAlZCB3aGVuIGNoYW5naW5nIGJzc2lkOiAlaVxuIiwKKwkJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGFkZCBwZWVyICVwTSBmb3IgdmRldiAlZCB3aGVuIGNoYW5naW5nIGJzc2lkOiAlaVxuIiwKIAkJCQkJICAgIGluZm8tPmJzc2lkLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAogCQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CkBAIC0yODY4LDIwICszMDc4LDEzIEBACiAJCWF0aDEwa19jb250cm9sX2JlYWNvbmluZyhhcnZpZiwgaW5mbyk7CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVCkgewotCQl1MzIgY3RzX3Byb3Q7Ci0JCWlmIChpbmZvLT51c2VfY3RzX3Byb3QpCi0JCQljdHNfcHJvdCA9IDE7Ci0JCWVsc2UKLQkJCWN0c19wcm90ID0gMDsKLQorCQlhcnZpZi0+dXNlX2N0c19wcm90ID0gaW5mby0+dXNlX2N0c19wcm90OwogCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIHZkZXYgJWQgY3RzX3Byb3QgJWRcbiIsCi0JCQkgICBhcnZpZi0+dmRldl9pZCwgY3RzX3Byb3QpOworCQkJICAgYXJ2aWYtPnZkZXZfaWQsIGluZm8tPnVzZV9jdHNfcHJvdCk7CiAKLQkJdmRldl9wYXJhbSA9IGFyLT53bWkudmRldl9wYXJhbS0+ZW5hYmxlX3J0c2N0czsKLQkJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X3NldF9wYXJhbShhciwgYXJ2aWYtPnZkZXZfaWQsIHZkZXZfcGFyYW0sCi0JCQkJCQljdHNfcHJvdCk7CisJCXJldCA9IGF0aDEwa19yZWNhbGNfcnRzY3RzX3Byb3QoYXJ2aWYpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgQ1RTIHByb3QgZm9yIHZkZXYgJWQ6ICVkXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byByZWNhbGN1bGF0ZSBydHMvY3RzIHByb3QgZm9yIHZkZXYgJWQ6ICVkXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAl9CiAKQEAgLTI5MDAsNyArMzEwMyw3IEBACiAJCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCB2ZGV2X3BhcmFtLAogCQkJCQkJc2xvdHRpbWUpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgZXJwIHNsb3QgZm9yIHZkZXYgJWQ6ICVpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgZXJwIHNsb3QgZm9yIHZkZXYgJWQ6ICVpXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAl9CiAKQEAgLTI5MTksNyArMzEyMiw3IEBACiAJCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCB2ZGV2X3BhcmFtLAogCQkJCQkJcHJlYW1ibGUpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBzZXQgcHJlYW1ibGUgZm9yIHZkZXYgJWQ6ICVpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgcHJlYW1ibGUgZm9yIHZkZXYgJWQ6ICVpXG4iLAogCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAl9CiAKQEAgLTI5OTAsNyArMzE5Myw3IEBACiAKIAlyZXQgPSBhdGgxMGtfc3RhcnRfc2NhbihhciwgJmFyZyk7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IHN0YXJ0IGh3IHNjYW4gKCVkKVxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdGFydCBodyBzY2FuOiAlZFxuIiwgcmV0KTsKIAkJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAkJYXItPnNjYW4uaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwpAQCAtMzAxMCw4ICszMjEzLDcgQEAKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAJcmV0ID0gYXRoMTBrX2Fib3J0X3NjYW4oYXIpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkbid0IGFib3J0IHNjYW4gKCVkKS4gZm9yY2VmdWxseSBzZW5kaW5nIHNjYW4gY29tcGxldGlvbiB0byBtYWM4MDIxMVxuIiwKLQkJCSAgICByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGFib3J0IHNjYW46ICVkXG4iLCByZXQpOwogCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoaHcsIDEgLyogYWJvcnRlZCAqLyk7CiAJfQogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtMzA4OSw3ICszMjkxLDcgQEAKIAogCWlmICghcGVlcikgewogCQlpZiAoY21kID09IFNFVF9LRVkpIHsKLQkJCWF0aDEwa193YXJuKCJjYW5ub3QgaW5zdGFsbCBrZXkgZm9yIG5vbi1leGlzdGVudCBwZWVyICVwTVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gaW5zdGFsbCBrZXkgZm9yIG5vbi1leGlzdGVudCBwZWVyICVwTVxuIiwKIAkJCQkgICAgcGVlcl9hZGRyKTsKIAkJCXJldCA9IC1FT1BOT1RTVVBQOwogCQkJZ290byBleGl0OwpAQCAtMzExMiw3ICszMzE0LDcgQEAKIAogCXJldCA9IGF0aDEwa19pbnN0YWxsX2tleShhcnZpZiwga2V5LCBjbWQsIHBlZXJfYWRkcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2Fybigia2V5IGluc3RhbGxhdGlvbiBmYWlsZWQgZm9yIHZkZXYgJWkgcGVlciAlcE06ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGluc3RhbGwga2V5IGZvciB2ZGV2ICVpIHBlZXIgJXBNOiAlZFxuIiwKIAkJCSAgICBhcnZpZi0+dmRldl9pZCwgcGVlcl9hZGRyLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzEyNyw3ICszMzI5LDcgQEAKIAkJcGVlci0+a2V5c1trZXktPmtleWlkeF0gPSBOVUxMOwogCWVsc2UgaWYgKHBlZXIgPT0gTlVMTCkKIAkJLyogaW1wb3NzaWJsZSB1bmxlc3MgRlcgZ29lcyBjcmF6eSAqLwotCQlhdGgxMGtfd2FybigicGVlciAlcE0gZGlzYXBwZWFyZWQhXG4iLCBwZWVyX2FkZHIpOworCQlhdGgxMGtfd2FybigiUGVlciAlcE0gZGlzYXBwZWFyZWQhXG4iLCBwZWVyX2FkZHIpOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAogZXhpdDoKQEAgLTMxOTUsNiArMzM5NywxNiBAQAogCQkJCSAgICBzdGEtPmFkZHIsIHNtcHMsIGVycik7CiAJfQogCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfUkNfU1VQUF9SQVRFU19DSEFOR0VEKSB7CisJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19NQUMsICJtYWMgdXBkYXRlIHN0YSAlcE0gc3VwcCByYXRlc1xuIiwKKwkJCSAgIHN0YS0+YWRkcik7CisKKwkJZXJyID0gYXRoMTBrX3N0YXRpb25fYXNzb2MoYXIsIGFydmlmLCBzdGEsIHRydWUpOworCQlpZiAoZXJyKQorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byByZWFzc29jaWF0ZSBzdGF0aW9uOiAlcE1cbiIsCisJCQkJICAgIHN0YS0+YWRkcik7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiB9CiAKQEAgLTMyMzYsNyArMzQ0OCw3IEBACiAJCQltYXhfbnVtX3BlZXJzID0gVEFSR0VUX05VTV9QRUVSUzsKIAogCQlpZiAoYXItPm51bV9wZWVycyA+PSBtYXhfbnVtX3BlZXJzKSB7Ci0JCQlhdGgxMGtfd2FybigiTnVtYmVyIG9mIHBlZXJzIGV4Y2VlZGVkOiBwZWVycyBudW1iZXIgJWQgKG1heCBwZWVycyAlZClcbiIsCisJCQlhdGgxMGtfd2FybigibnVtYmVyIG9mIHBlZXJzIGV4Y2VlZGVkOiBwZWVycyBudW1iZXIgJWQgKG1heCBwZWVycyAlZClcbiIsCiAJCQkJICAgIGFyLT5udW1fcGVlcnMsIG1heF9udW1fcGVlcnMpOwogCQkJcmV0ID0gLUVOT0JVRlM7CiAJCQlnb3RvIGV4aXQ7CkBAIC0zMjQ4LDcgKzM0NjAsNyBAQAogCiAJCXJldCA9IGF0aDEwa19wZWVyX2NyZWF0ZShhciwgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CiAJCWlmIChyZXQpCi0JCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIGFkZCBwZWVyICVwTSBmb3IgdmRldiAlZCB3aGVuIGFkZGluZyBhIG5ldyBzdGE6ICVpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBhZGQgcGVlciAlcE0gZm9yIHZkZXYgJWQgd2hlbiBhZGRpbmcgYSBuZXcgc3RhOiAlaVxuIiwKIAkJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAl9IGVsc2UgaWYgKChvbGRfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT05FICYmCiAJCSAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RFWElTVCkpIHsKQEAgLTMyNjAsNyArMzQ3Miw3IEBACiAJCQkgICBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKIAkJcmV0ID0gYXRoMTBrX3BlZXJfZGVsZXRlKGFyLCBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKCJGYWlsZWQgdG8gZGVsZXRlIHBlZXIgJXBNIGZvciB2ZGV2ICVkOiAlaVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gZGVsZXRlIHBlZXIgJXBNIGZvciB2ZGV2ICVkOiAlaVxuIiwKIAkJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKIAogCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCkBAIC0zMjc1LDkgKzM0ODcsOSBAQAogCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLCAibWFjIHN0YSAlcE0gYXNzb2NpYXRlZFxuIiwKIAkJCSAgIHN0YS0+YWRkcik7CiAKLQkJcmV0ID0gYXRoMTBrX3N0YXRpb25fYXNzb2MoYXIsIGFydmlmLCBzdGEpOworCQlyZXQgPSBhdGgxMGtfc3RhdGlvbl9hc3NvYyhhciwgYXJ2aWYsIHN0YSwgZmFsc2UpOwogCQlpZiAocmV0KQotCQkJYXRoMTBrX3dhcm4oIkZhaWxlZCB0byBhc3NvY2lhdGUgc3RhdGlvbiAlcE0gZm9yIHZkZXYgJWk6ICVpXG4iLAorCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBhc3NvY2lhdGUgc3RhdGlvbiAlcE0gZm9yIHZkZXYgJWk6ICVpXG4iLAogCQkJCSAgICBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MgJiYKIAkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCAmJgpAQCAtMzI5MSw3ICszNTAzLDcgQEAKIAogCQlyZXQgPSBhdGgxMGtfc3RhdGlvbl9kaXNhc3NvYyhhciwgYXJ2aWYsIHN0YSk7CiAJCWlmIChyZXQpCi0JCQlhdGgxMGtfd2FybigiRmFpbGVkIHRvIGRpc2Fzc29jaWF0ZSBzdGF0aW9uOiAlcE0gdmRldiAlaSByZXQgJWlcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGRpc2Fzc29jaWF0ZSBzdGF0aW9uOiAlcE0gdmRldiAlaTogJWlcbiIsCiAJCQkJICAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJfQogZXhpdDoKQEAgLTMzMzksNyArMzU1MSw3IEBACiAJCQkJCSAgV01JX1NUQV9QU19QQVJBTV9VQVBTRCwKIAkJCQkJICBhcnZpZi0+dS5zdGEudWFwc2QpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgdWFwc2QgcGFyYW1zICVkXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCB1YXBzZCBwYXJhbXM6ICVkXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0zMzUyLDcgKzM1NjQsNyBAQAogCQkJCQkgIFdNSV9TVEFfUFNfUEFSQU1fUlhfV0FLRV9QT0xJQ1ksCiAJCQkJCSAgdmFsdWUpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJjb3VsZCBub3Qgc2V0IHJ4IHdha2UgcGFyYW0gJWRcbiIsIHJldCk7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IHJ4IHdha2UgcGFyYW06ICVkXG4iLCByZXQpOwogCiBleGl0OgogCXJldHVybiByZXQ7CkBAIC0zNDAyLDEzICszNjE0LDEzIEBACiAJLyogRklYTUU6IEZXIGFjY2VwdHMgd21tIHBhcmFtcyBwZXIgaHcsIG5vdCBwZXIgdmlmICovCiAJcmV0ID0gYXRoMTBrX3dtaV9wZGV2X3NldF93bW1fcGFyYW1zKGFyLCAmYXItPndtbV9wYXJhbXMpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgd21tIHBhcmFtcyAlZFxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgd21tIHBhcmFtczogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXQgPSBhdGgxMGtfY29uZl90eF91YXBzZChhciwgdmlmLCBhYywgcGFyYW1zLT51YXBzZCk7CiAJaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgc3RhIHVhcHNkICVkXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBzdGEgdWFwc2Q6ICVkXG4iLCByZXQpOwogCiBleGl0OgogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtMzQ2MSw3ICszNjczLDcgQEAKIAogCXJldCA9IGF0aDEwa19zdGFydF9zY2FuKGFyLCAmYXJnKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJjb3VsZCBub3Qgc3RhcnQgcm9jIHNjYW4gKCVkKVxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzdGFydCByb2Mgc2NhbjogJWRcbiIsIHJldCk7CiAJCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAJCWFyLT5zY2FuLmluX3Byb2dyZXNzID0gZmFsc2U7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKQEAgLTM0NzAsNyArMzY4Miw3IEBACiAKIAlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFyLT5zY2FuLm9uX2NoYW5uZWwsIDMqSFopOwogCWlmIChyZXQgPT0gMCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IHN3aXRjaCB0byBjaGFubmVsIGZvciByb2Mgc2NhblxuIik7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3dpdGNoIHRvIGNoYW5uZWwgZm9yIHJvYyBzY2FuXG4iKTsKIAkJYXRoMTBrX2Fib3J0X3NjYW4oYXIpOwogCQlyZXQgPSAtRVRJTUVET1VUOwogCQlnb3RvIGV4aXQ7CkBAIC0zNTExLDcgKzM3MjMsNyBAQAogCiAJCXJldCA9IGF0aDEwa19tYWNfc2V0X3J0cyhhcnZpZiwgdmFsdWUpOwogCQlpZiAocmV0KSB7Ci0JCQlhdGgxMGtfd2FybigiY291bGQgbm90IHNldCBydHMgdGhyZXNob2xkIGZvciB2ZGV2ICVkICglZClcbiIsCisJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBydHMgdGhyZXNob2xkIGZvciB2ZGV2ICVkOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzUzNCw3ICszNzQ2LDcgQEAKIAogCQlyZXQgPSBhdGgxMGtfbWFjX3NldF9ydHMoYXJ2aWYsIHZhbHVlKTsKIAkJaWYgKHJldCkgewotCQkJYXRoMTBrX3dhcm4oImNvdWxkIG5vdCBzZXQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgZm9yIHZkZXYgJWQgKCVkKVxuIiwKKwkJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGZvciB2ZGV2ICVkOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzU0NCw3ICszNzU2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhdGgxMGtfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIGF0aDEwa19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBody0+cHJpdjsKIAlib29sIHNraXA7CkBAIC0zNTczLDcgKzM3ODYsNyBAQAogCQl9KSwgQVRIMTBLX0ZMVVNIX1RJTUVPVVRfSFopOwogCiAJaWYgKHJldCA8PSAwIHx8IHNraXApCi0JCWF0aDEwa193YXJuKCJ0eCBub3QgZmx1c2hlZCAoc2tpcCAlaSBhci1zdGF0ZSAlaSk6ICVpXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIGZsdXNoIHRyYW5zbWl0IHF1ZXVlIChza2lwICVpIGFyLXN0YXRlICVpKTogJWlcbiIsCiAJCQkgICAgc2tpcCwgYXItPnN0YXRlLCByZXQpOwogCiBza2lwOgpAQCAtMzYwOCw3ICszODIxLDcgQEAKIAogCXJldCA9IGF0aDEwa19oaWZfc3VzcGVuZChhcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IHN1c3BlbmQgaGlmICglZClcbiIsIHJldCk7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc3VzcGVuZCBoaWY6ICVkXG4iLCByZXQpOwogCQlnb3RvIHJlc3VtZTsKIAl9CiAKQEAgLTM2MTcsNyArMzgzMCw3IEBACiByZXN1bWU6CiAJcmV0ID0gYXRoMTBrX3dtaV9wZGV2X3Jlc3VtZV90YXJnZXQoYXIpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKCJjb3VsZCBub3QgcmVzdW1lIHRhcmdldCAoJWQpXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlc3VtZSB0YXJnZXQ6ICVkXG4iLCByZXQpOwogCiAJcmV0ID0gMTsKIGV4aXQ6CkBAIC0zNjM0LDE0ICszODQ3LDE0IEBACiAKIAlyZXQgPSBhdGgxMGtfaGlmX3Jlc3VtZShhcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiY291bGQgbm90IHJlc3VtZSBoaWYgKCVkKVxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byByZXN1bWUgaGlmOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gMTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldCA9IGF0aDEwa193bWlfcGRldl9yZXN1bWVfdGFyZ2V0KGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJjb3VsZCBub3QgcmVzdW1lIHRhcmdldCAoJWQpXG4iLCByZXQpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHJlc3VtZSB0YXJnZXQ6ICVkXG4iLCByZXQpOwogCQlyZXQgPSAxOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzk2NCw3ICs0MTc3LDcgQEAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfc2V0X3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKIAkJCQkJdmRldl9wYXJhbSwgZml4ZWRfcmF0ZSk7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiQ291bGQgbm90IHNldCBmaXhlZF9yYXRlIHBhcmFtIDB4JTAyeDogJWRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gc2V0IGZpeGVkIHJhdGUgcGFyYW0gMHglMDJ4OiAlZFxuIiwKIAkJCSAgICBmaXhlZF9yYXRlLCByZXQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CkBAIC0zOTc3LDcgKzQxOTAsNyBAQAogCQkJCQl2ZGV2X3BhcmFtLCBmaXhlZF9uc3MpOwogCiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybigiQ291bGQgbm90IHNldCBmaXhlZF9uc3MgcGFyYW0gJWQ6ICVkXG4iLAorCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHNldCBmaXhlZCBuc3MgcGFyYW0gJWQ6ICVkXG4iLAogCQkJICAgIGZpeGVkX25zcywgcmV0KTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwpAQCAtMzk5MCw3ICs0MjAzLDcgQEAKIAkJCQkJZm9yY2Vfc2dpKTsKIAogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oIkNvdWxkIG5vdCBzZXQgc2dpIHBhcmFtICVkOiAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBzZXQgc2dpIHBhcmFtICVkOiAlZFxuIiwKIAkJCSAgICBmb3JjZV9zZ2ksIHJldCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKQEAgLTQwMjYsNyArNDIzOSw3IEBACiAJfQogCiAJaWYgKGZpeGVkX3JhdGUgPT0gV01JX0ZJWEVEX1JBVEVfTk9ORSAmJiBmb3JjZV9zZ2kpIHsKLQkJYXRoMTBrX3dhcm4oIkNvdWxkIG5vdCBmb3JjZSBTR0kgdXNhZ2UgZm9yIGRlZmF1bHQgcmF0ZSBzZXR0aW5nc1xuIik7CisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gZm9yY2UgU0dJIHVzYWdlIGZvciBkZWZhdWx0IHJhdGUgc2V0dGluZ3NcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQwMzQsMTQgKzQyNDcsNiBAQAogCQkJCQkgICBmaXhlZF9uc3MsIGZvcmNlX3NnaSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19jaGFubmVsX3N3aXRjaF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQkgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKQotewotCS8qIHRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLiB2aWYtPmNzYV9hY3RpdmUgaXMgZW5vdWdoICovCi0JcmV0dXJuOwotfQotCiBzdGF0aWMgdm9pZCBhdGgxMGtfc3RhX3JjX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKQEAgLTQwNzIsOCArNDI3Nyw4IEBACiAJCQlidyA9IFdNSV9QRUVSX0NIV0lEVEhfODBNSFo7CiAJCQlicmVhazsKIAkJY2FzZSBJRUVFODAyMTFfU1RBX1JYX0JXXzE2MDoKLQkJCWF0aDEwa193YXJuKCJtYWMgc3RhIHJjIHVwZGF0ZSBmb3IgJXBNOiBpbnZhbGlkIGJ3ICVkXG4iLAotCQkJCSAgICBzdGEtPmFkZHIsIHN0YS0+YmFuZHdpZHRoKTsKKwkJCWF0aDEwa193YXJuKCJJbnZhbGlkIGJhbmR3aXRoICVkIGluIHJjIHVwZGF0ZSBmb3IgJXBNXG4iLAorCQkJCSAgICBzdGEtPmJhbmR3aWR0aCwgc3RhLT5hZGRyKTsKIAkJCWJ3ID0gV01JX1BFRVJfQ0hXSURUSF8yME1IWjsKIAkJCWJyZWFrOwogCQl9CkBAIC00MDk5LDggKzQzMDQsOCBAQAogCQkJc21wcyA9IFdNSV9QRUVSX1NNUFNfRFlOQU1JQzsKIAkJCWJyZWFrOwogCQljYXNlIElFRUU4MDIxMV9TTVBTX05VTV9NT0RFUzoKLQkJCWF0aDEwa193YXJuKCJtYWMgc3RhIHJjIHVwZGF0ZSBmb3IgJXBNOiBpbnZhbGlkIHNtcHM6ICVkXG4iLAotCQkJCSAgICBzdGEtPmFkZHIsIHN0YS0+c21wc19tb2RlKTsKKwkJCWF0aDEwa193YXJuKCJJbnZhbGlkIHNtcHMgJWQgaW4gc3RhIHJjIHVwZGF0ZSBmb3IgJXBNXG4iLAorCQkJCSAgICBzdGEtPnNtcHNfbW9kZSwgc3RhLT5hZGRyKTsKIAkJCXNtcHMgPSBXTUlfUEVFUl9TTVBTX1BTX05PTkU7CiAJCQlicmVhazsKIAkJfQpAQCAtNDEwOCwxNSArNDMxMyw2IEBACiAJCWFyc3RhLT5zbXBzID0gc21wczsKIAl9CiAKLQlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9SQ19TVVBQX1JBVEVTX0NIQU5HRUQpIHsKLQkJLyogRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gUHJvYmFibHkgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdvdWxkCi0JCSAqIGJlIHRvIHJlLWFzc29jIHRoZSBwZWVyLiAqLwotCQljaGFuZ2VkICY9IH5JRUVFODAyMTFfUkNfU1VQUF9SQVRFU19DSEFOR0VEOwotCQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUFDLAotCQkJICAgIm1hYyBzdGEgcmMgdXBkYXRlIGZvciAlcE06IGNoYW5naW5nIHN1cHBvcnRlZCByYXRlcyBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCQkgICBzdGEtPmFkZHIpOwotCX0KLQogCWFyc3RhLT5jaGFuZ2VkIHw9IGNoYW5nZWQ7CiAKIAlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CkBAIC00MTU0LDEwICs0MzUwLDExIEBACiAJLnNldF9mcmFnX3RocmVzaG9sZAkJPSBhdGgxMGtfc2V0X2ZyYWdfdGhyZXNob2xkLAogCS5mbHVzaAkJCQk9IGF0aDEwa19mbHVzaCwKIAkudHhfbGFzdF9iZWFjb24JCQk9IGF0aDEwa190eF9sYXN0X2JlYWNvbiwKKwkuc2V0X2FudGVubmEJCQk9IGF0aDEwa19zZXRfYW50ZW5uYSwKKwkuZ2V0X2FudGVubmEJCQk9IGF0aDEwa19nZXRfYW50ZW5uYSwKIAkucmVzdGFydF9jb21wbGV0ZQkJPSBhdGgxMGtfcmVzdGFydF9jb21wbGV0ZSwKIAkuZ2V0X3N1cnZleQkJCT0gYXRoMTBrX2dldF9zdXJ2ZXksCiAJLnNldF9iaXRyYXRlX21hc2sJCT0gYXRoMTBrX3NldF9iaXRyYXRlX21hc2ssCi0JLmNoYW5uZWxfc3dpdGNoX2JlYWNvbgkJPSBhdGgxMGtfY2hhbm5lbF9zd2l0Y2hfYmVhY29uLAogCS5zdGFfcmNfdXBkYXRlCQkJPSBhdGgxMGtfc3RhX3JjX3VwZGF0ZSwKIAkuZ2V0X3RzZgkJCT0gYXRoMTBrX2dldF90c2YsCiAjaWZkZWYgQ09ORklHX1BNCkBAIC00NTAzLDYgKzQ3MDAsMTggQEAKIAkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CiAJCUJJVChOTDgwMjExX0lGVFlQRV9BUCk7CiAKKwlpZiAodGVzdF9iaXQoQVRIMTBLX0ZXX0ZFQVRVUkVfV01JXzEwWCwgYXItPmZ3X2ZlYXR1cmVzKSkgeworCQkvKiBUT0RPOiAgSGF2ZSB0byBkZWFsIHdpdGggMngyIGNoaXBzIGlmL3doZW4gdGhlIGNvbWUgb3V0LiAqLworCQlhci0+c3VwcF90eF9jaGFpbm1hc2sgPSBUQVJHRVRfMTBYX1RYX0NIQUlOX01BU0s7CisJCWFyLT5zdXBwX3J4X2NoYWlubWFzayA9IFRBUkdFVF8xMFhfUlhfQ0hBSU5fTUFTSzsKKwl9IGVsc2UgeworCQlhci0+c3VwcF90eF9jaGFpbm1hc2sgPSBUQVJHRVRfVFhfQ0hBSU5fTUFTSzsKKwkJYXItPnN1cHBfcnhfY2hhaW5tYXNrID0gVEFSR0VUX1JYX0NIQUlOX01BU0s7CisJfQorCisJYXItPmh3LT53aXBoeS0+YXZhaWxhYmxlX2FudGVubmFzX3J4ID0gYXItPnN1cHBfcnhfY2hhaW5tYXNrOworCWFyLT5ody0+d2lwaHktPmF2YWlsYWJsZV9hbnRlbm5hc190eCA9IGFyLT5zdXBwX3R4X2NoYWlubWFzazsKKwogCWlmICghdGVzdF9iaXQoQVRIMTBLX0ZXX0ZFQVRVUkVfTk9fUDJQLCBhci0+ZndfZmVhdHVyZXMpKQogCQlhci0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0KIAkJCUJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSB8CkBAIC00NTE2LDcgKzQ3MjUsNiBAQAogCQkJSUVFRTgwMjExX0hXX1JFUE9SVFNfVFhfQUNLX1NUQVRVUyB8CiAJCQlJRUVFODAyMTFfSFdfSEFTX1JBVEVfQ09OVFJPTCB8CiAJCQlJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFMgfAotCQkJSUVFRTgwMjExX0hXX1dBTlRfTU9OSVRPUl9WSUYgfAogCQkJSUVFRTgwMjExX0hXX0FQX0xJTktfUFMgfAogCQkJSUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQ7CiAKQEAgLTQ1NzAsMTkgKzQ3NzgsMTkgQEAKIAkJCQkJCQkgICAgIE5MODAyMTFfREZTX1VOU0VUKTsKIAogCQlpZiAoIWFyLT5kZnNfZGV0ZWN0b3IpCi0JCQlhdGgxMGtfd2FybigiZGZzIHBhdHRlcm4gZGV0ZWN0b3IgaW5pdCBmYWlsZWRcbiIpOworCQkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byBpbml0aWFsaXNlIERGUyBwYXR0ZXJuIGRldGVjdG9yXG4iKTsKIAl9CiAKIAlyZXQgPSBhdGhfcmVnZF9pbml0KCZhci0+YXRoX2NvbW1vbi5yZWd1bGF0b3J5LCBhci0+aHctPndpcGh5LAogCQkJICAgIGF0aDEwa19yZWdfbm90aWZpZXIpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX2VycigiUmVndWxhdG9yeSBpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICVpXG4iLCByZXQpOworCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGlzZSByZWd1bGF0b3J5OiAlaVxuIiwgcmV0KTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoYXItPmh3KTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa19lcnIoImllZWU4MDIxMSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGllZWU4MDIxMTogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYwppbmRleCA5ZDI0MmQ4Li5kMDAwNGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMKQEAgLTM5LDE1ICszOSwyOCBAQAogCUFUSDEwS19QQ0lfSVJRX01TSSA9IDIsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGF0aDEwa190YXJnZXRfcHM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGF0aDEwa19wY2lfaXJxX21vZGUgPSBBVEgxMEtfUENJX0lSUV9BVVRPOworZW51bSBhdGgxMGtfcGNpX3Jlc2V0X21vZGUgeworCUFUSDEwS19QQ0lfUkVTRVRfQVVUTyA9IDAsCisJQVRIMTBLX1BDSV9SRVNFVF9XQVJNX09OTFkgPSAxLAorfTsKIAotbW9kdWxlX3BhcmFtKGF0aDEwa190YXJnZXRfcHMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhhdGgxMGtfdGFyZ2V0X3BzLCAiRW5hYmxlIGF0aDEwayBUYXJnZXQgKFNvQykgUFMgb3B0aW9uIik7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0aDEwa19wY2lfdGFyZ2V0X3BzOworc3RhdGljIHVuc2lnbmVkIGludCBhdGgxMGtfcGNpX2lycV9tb2RlID0gQVRIMTBLX1BDSV9JUlFfQVVUTzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRoMTBrX3BjaV9yZXNldF9tb2RlID0gQVRIMTBLX1BDSV9SRVNFVF9BVVRPOworCittb2R1bGVfcGFyYW1fbmFtZWQodGFyZ2V0X3BzLCBhdGgxMGtfcGNpX3RhcmdldF9wcywgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHRhcmdldF9wcywgIkVuYWJsZSBhdGgxMGsgVGFyZ2V0IChTb0MpIFBTIG9wdGlvbiIpOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQoaXJxX21vZGUsIGF0aDEwa19wY2lfaXJxX21vZGUsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpcnFfbW9kZSwgIjA6IGF1dG8sIDE6IGxlZ2FjeSwgMjogbXNpIChkZWZhdWx0OiAwKSIpOwogCittb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRfbW9kZSwgYXRoMTBrX3BjaV9yZXNldF9tb2RlLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXRfbW9kZSwgIjA6IGF1dG8sIDE6IHdhcm0gb25seSAoZGVmYXVsdDogMCkiKTsKKworLyogaG93IGxvbmcgd2FpdCB0byB3YWl0IGZvciB0YXJnZXQgdG8gaW5pdGlhbGlzZSwgaW4gbXMgKi8KKyNkZWZpbmUgQVRIMTBLX1BDSV9UQVJHRVRfV0FJVCAzMDAwCisjZGVmaW5lIEFUSDEwS19QQ0lfTlVNX1dBUk1fUkVTRVRfQVRURU1QVFMgMworCiAjZGVmaW5lIFFDQTk4OFhfMl8wX0RFVklDRV9JRAkoMHgwMDNjKQogCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYXRoMTBrX3BjaV9pZF90YWJsZSkgPSB7CkBAIC0zNDYsOSArMzU5LDEwIEBACiAJICogICAyKSBCdWZmZXIgaW4gRE1BLWFibGUgc3BhY2UKIAkgKi8KIAlvcmlnX25ieXRlcyA9IG5ieXRlczsKLQlkYXRhX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoYXJfcGNpLT5wZGV2LAotCQkJCQkJCSBvcmlnX25ieXRlcywKLQkJCQkJCQkgJmNlX2RhdGFfYmFzZSk7CisJZGF0YV9idWYgPSAodW5zaWduZWQgY2hhciAqKWRtYV9hbGxvY19jb2hlcmVudChhci0+ZGV2LAorCQkJCQkJICAgICAgIG9yaWdfbmJ5dGVzLAorCQkJCQkJICAgICAgICZjZV9kYXRhX2Jhc2UsCisJCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIWRhdGFfYnVmKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC00NDIsMTIgKzQ1NiwxMiBAQAogCQkJCV9fbGUzMl90b19jcHUoKChfX2xlMzIgKilkYXRhX2J1ZilbaV0pOwogCQl9CiAJfSBlbHNlCi0JCWF0aDEwa19kYmcoQVRIMTBLX0RCR19QQ0ksICIlcyBmYWlsdXJlICgweCV4KVxuIiwKLQkJCSAgIF9fZnVuY19fLCBhZGRyZXNzKTsKKwkJYXRoMTBrX3dhcm4oImZhaWxlZCB0byByZWFkIGRpYWcgdmFsdWUgYXQgMHgleDogJWRcbiIsCisJCQkgICAgYWRkcmVzcywgcmV0KTsKIAogCWlmIChkYXRhX2J1ZikKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhcl9wY2ktPnBkZXYsIG9yaWdfbmJ5dGVzLAotCQkJCSAgICBkYXRhX2J1ZiwgY2VfZGF0YV9iYXNlKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYXItPmRldiwgb3JpZ19uYnl0ZXMsIGRhdGFfYnVmLAorCQkJCSAgY2VfZGF0YV9iYXNlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00OTAsOSArNTA0LDEwIEBACiAJICogICAyKSBCdWZmZXIgaW4gRE1BLWFibGUgc3BhY2UKIAkgKi8KIAlvcmlnX25ieXRlcyA9IG5ieXRlczsKLQlkYXRhX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoYXJfcGNpLT5wZGV2LAotCQkJCQkJCSBvcmlnX25ieXRlcywKLQkJCQkJCQkgJmNlX2RhdGFfYmFzZSk7CisJZGF0YV9idWYgPSAodW5zaWduZWQgY2hhciAqKWRtYV9hbGxvY19jb2hlcmVudChhci0+ZGV2LAorCQkJCQkJICAgICAgIG9yaWdfbmJ5dGVzLAorCQkJCQkJICAgICAgICZjZV9kYXRhX2Jhc2UsCisJCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CiAJaWYgKCFkYXRhX2J1ZikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmU7CkBAIC01ODgsMTMgKzYwMywxMyBAQAogCiBkb25lOgogCWlmIChkYXRhX2J1ZikgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFyX3BjaS0+cGRldiwgb3JpZ19uYnl0ZXMsIGRhdGFfYnVmLAotCQkJCSAgICBjZV9kYXRhX2Jhc2UpOworCQlkbWFfZnJlZV9jb2hlcmVudChhci0+ZGV2LCBvcmlnX25ieXRlcywgZGF0YV9idWYsCisJCQkJICBjZV9kYXRhX2Jhc2UpOwogCX0KIAogCWlmIChyZXQgIT0gMCkKLQkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX1BDSSwgIiVzIGZhaWx1cmUgKDB4JXgpXG4iLCBfX2Z1bmNfXywKLQkJCSAgIGFkZHJlc3MpOworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHdyaXRlIGRpYWcgdmFsdWUgYXQgMHgleDogJWRcbiIsCisJCQkgICAgYWRkcmVzcywgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NDcsMTcgKzc2MiwyMSBAQAogCXN0cnVjdCBhdGgxMGtfcGNpX3BpcGUgKnBjaV9waXBlID0gJmFyX3BjaS0+cGlwZV9pbmZvW3BpcGVfaWRdOwogCXN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2VfcGlwZSA9IHBjaV9waXBlLT5jZV9oZGw7CiAJc3RydWN0IGF0aDEwa19jZV9yaW5nICpzcmNfcmluZyA9IGNlX3BpcGUtPnNyY19yaW5nOwotCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrID0gc3JjX3JpbmctPm5lbnRyaWVzX21hc2s7Ci0JdW5zaWduZWQgaW50IHN3X2luZGV4ID0gc3JjX3JpbmctPnN3X2luZGV4OwotCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleCA9IHNyY19yaW5nLT53cml0ZV9pbmRleDsKLQlpbnQgZXJyLCBpOworCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrOworCXVuc2lnbmVkIGludCBzd19pbmRleDsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfaW5kZXg7CisJaW50IGVyciwgaSA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJmFyX3BjaS0+Y2VfbG9jayk7CiAKKwluZW50cmllc19tYXNrID0gc3JjX3JpbmctPm5lbnRyaWVzX21hc2s7CisJc3dfaW5kZXggPSBzcmNfcmluZy0+c3dfaW5kZXg7CisJd3JpdGVfaW5kZXggPSBzcmNfcmluZy0+d3JpdGVfaW5kZXg7CisKIAlpZiAodW5saWtlbHkoQ0VfUklOR19ERUxUQShuZW50cmllc19tYXNrLAogCQkJCSAgIHdyaXRlX2luZGV4LCBzd19pbmRleCAtIDEpIDwgbl9pdGVtcykpIHsKIAkJZXJyID0gLUVOT0JVRlM7Ci0JCWdvdG8gdW5sb2NrOworCQlnb3RvIGVycjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbl9pdGVtcyAtIDE7IGkrKykgewpAQCAtNzc0LDcgKzc5Myw3IEBACiAJCQkJCSAgICBpdGVtc1tpXS50cmFuc2Zlcl9pZCwKIAkJCQkJICAgIENFX1NFTkRfRkxBR19HQVRIRVIpOwogCQlpZiAoZXJyKQotCQkJZ290byB1bmxvY2s7CisJCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBgaWAgaXMgZXF1YWwgdG8gYG5faXRlbXMgLTFgIGFmdGVyIGZvcigpICovCkBAIC03OTIsMTAgKzgxMSwxNSBAQAogCQkJCSAgICBpdGVtc1tpXS50cmFuc2Zlcl9pZCwKIAkJCQkgICAgMCk7CiAJaWYgKGVycikKLQkJZ290byB1bmxvY2s7CisJCWdvdG8gZXJyOwogCi0JZXJyID0gMDsKLXVubG9jazoKKwlzcGluX3VubG9ja19iaCgmYXJfcGNpLT5jZV9sb2NrKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWZvciAoOyBpID4gMDsgaS0tKQorCQlfX2F0aDEwa19jZV9zZW5kX3JldmVydChjZV9waXBlKTsKKwogCXNwaW5fdW5sb2NrX2JoKCZhcl9wY2ktPmNlX2xvY2spOwogCXJldHVybiBlcnI7CiB9CkBAIC04MDMsNiArODI3LDkgQEAKIHN0YXRpYyB1MTYgYXRoMTBrX3BjaV9oaWZfZ2V0X2ZyZWVfcXVldWVfbnVtYmVyKHN0cnVjdCBhdGgxMGsgKmFyLCB1OCBwaXBlKQogewogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOworCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX1BDSSwgInBjaSBoaWYgZ2V0IGZyZWUgcXVldWUgbnVtYmVyXG4iKTsKKwogCXJldHVybiBhdGgxMGtfY2VfbnVtX2ZyZWVfc3JjX2VudHJpZXMoYXJfcGNpLT5waXBlX2luZm9bcGlwZV0uY2VfaGRsKTsKIH0KIApAQCAtODU0LDYgKzg4MSw4IEBACiBzdGF0aWMgdm9pZCBhdGgxMGtfcGNpX2hpZl9zZW5kX2NvbXBsZXRlX2NoZWNrKHN0cnVjdCBhdGgxMGsgKmFyLCB1OCBwaXBlLAogCQkJCQkgICAgICAgaW50IGZvcmNlKQogeworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19QQ0ksICJwY2kgaGlmIHNlbmQgY29tcGxldGUgY2hlY2tcbiIpOworCiAJaWYgKCFmb3JjZSkgewogCQlpbnQgcmVzb3VyY2VzOwogCQkvKgpAQCAtODgwLDcgKzkwOSw3IEBACiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAKLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfUENJLCAiJXNcbiIsIF9fZnVuY19fKTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfUENJLCAicGNpIGhpZiBzZXQgY2FsbGJhY2tzXG4iKTsKIAogCW1lbWNweSgmYXJfcGNpLT5tc2dfY2FsbGJhY2tzX2N1cnJlbnQsIGNhbGxiYWNrcywKIAkgICAgICAgc2l6ZW9mKGFyX3BjaS0+bXNnX2NhbGxiYWNrc19jdXJyZW50KSk7CkBAIC05MzgsNiArOTY3LDggQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAorCWF0aDEwa19kYmcoQVRIMTBLX0RCR19QQ0ksICJwY2kgaGlmIG1hcCBzZXJ2aWNlXG4iKTsKKwogCS8qIHBvbGxpbmcgZm9yIHJlY2VpdmVkIG1lc3NhZ2VzIG5vdCBzdXBwb3J0ZWQgKi8KIAkqZGxfaXNfcG9sbGVkID0gMDsKIApAQCAtOTk3LDYgKzEwMjgsOCBAQAogewogCWludCB1bF9pc19wb2xsZWQsIGRsX2lzX3BvbGxlZDsKIAorCWF0aDEwa19kYmcoQVRIMTBLX0RCR19QQ0ksICJwY2kgaGlmIGdldCBkZWZhdWx0IHBpcGVcbiIpOworCiAJKHZvaWQpYXRoMTBrX3BjaV9oaWZfbWFwX3NlcnZpY2VfdG9fcGlwZShhciwKIAkJCQkJCSBBVEgxMEtfSFRDX1NWQ19JRF9SU1ZEX0NUUkwsCiAJCQkJCQkgdWxfcGlwZSwKQEAgLTEwOTgsNiArMTEzMSw4IEBACiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAJaW50IHJldCwgcmV0X2Vhcmx5OwogCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IGhpZiBzdGFydFxuIik7CisKIAlhdGgxMGtfcGNpX2ZyZWVfZWFybHlfaXJxKGFyKTsKIAlhdGgxMGtfcGNpX2tpbGxfdGFza2xldChhcik7CiAKQEAgLTEyMzMsMTggKzEyNjgsMTAgQEAKIAogc3RhdGljIHZvaWQgYXRoMTBrX3BjaV9jZV9kZWluaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7Ci0Jc3RydWN0IGF0aDEwa19wY2lfcGlwZSAqcGlwZV9pbmZvOwotCWludCBwaXBlX251bTsKKwlpbnQgaTsKIAotCWZvciAocGlwZV9udW0gPSAwOyBwaXBlX251bSA8IENFX0NPVU5UOyBwaXBlX251bSsrKSB7Ci0JCXBpcGVfaW5mbyA9ICZhcl9wY2ktPnBpcGVfaW5mb1twaXBlX251bV07Ci0JCWlmIChwaXBlX2luZm8tPmNlX2hkbCkgewotCQkJYXRoMTBrX2NlX2RlaW5pdChwaXBlX2luZm8tPmNlX2hkbCk7Ci0JCQlwaXBlX2luZm8tPmNlX2hkbCA9IE5VTEw7Ci0JCQlwaXBlX2luZm8tPmJ1Zl9zeiA9IDA7Ci0JCX0KLQl9CisJZm9yIChpID0gMDsgaSA8IENFX0NPVU5UOyBpKyspCisJCWF0aDEwa19jZV9kZWluaXRfcGlwZShhciwgaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19wY2lfaGlmX3N0b3Aoc3RydWN0IGF0aDEwayAqYXIpCkBAIC0xMjUyLDcgKzEyNzksMTAgQEAKIAlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKIAlpbnQgcmV0OwogCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX1BDSSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IGhpZiBzdG9wXG4iKTsKKworCWlmIChXQVJOX09OKCFhcl9wY2ktPnN0YXJ0ZWQpKQorCQlyZXR1cm47CiAKIAlyZXQgPSBhdGgxMGtfY2VfZGlzYWJsZV9pbnRlcnJ1cHRzKGFyKTsKIAlpZiAocmV0KQpAQCAtMTY5NywzMCArMTcyNyw0OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0aDEwa19wY2lfYWxsb2NfY2Uoc3RydWN0IGF0aDEwayAqYXIpCit7CisJaW50IGksIHJldDsKIAorCWZvciAoaSA9IDA7IGkgPCBDRV9DT1VOVDsgaSsrKSB7CisJCXJldCA9IGF0aDEwa19jZV9hbGxvY19waXBlKGFyLCBpLCAmaG9zdF9jZV9jb25maWdfd2xhbltpXSk7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEwa19lcnIoImZhaWxlZCB0byBhbGxvY2F0ZSBjb3B5IGVuZ2luZSBwaXBlICVkOiAlZFxuIiwKKwkJCQkgICBpLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGgxMGtfcGNpX2ZyZWVfY2Uoc3RydWN0IGF0aDEwayAqYXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0VfQ09VTlQ7IGkrKykKKwkJYXRoMTBrX2NlX2ZyZWVfcGlwZShhciwgaSk7Cit9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX3BjaV9jZV9pbml0KHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCXN0cnVjdCBhdGgxMGtfcGNpX3BpcGUgKnBpcGVfaW5mbzsKIAljb25zdCBzdHJ1Y3QgY2VfYXR0ciAqYXR0cjsKLQlpbnQgcGlwZV9udW07CisJaW50IHBpcGVfbnVtLCByZXQ7CiAKIAlmb3IgKHBpcGVfbnVtID0gMDsgcGlwZV9udW0gPCBDRV9DT1VOVDsgcGlwZV9udW0rKykgewogCQlwaXBlX2luZm8gPSAmYXJfcGNpLT5waXBlX2luZm9bcGlwZV9udW1dOworCQlwaXBlX2luZm8tPmNlX2hkbCA9ICZhcl9wY2ktPmNlX3N0YXRlc1twaXBlX251bV07CiAJCXBpcGVfaW5mby0+cGlwZV9udW0gPSBwaXBlX251bTsKIAkJcGlwZV9pbmZvLT5oaWZfY2Vfc3RhdGUgPSBhcjsKIAkJYXR0ciA9ICZob3N0X2NlX2NvbmZpZ193bGFuW3BpcGVfbnVtXTsKIAotCQlwaXBlX2luZm8tPmNlX2hkbCA9IGF0aDEwa19jZV9pbml0KGFyLCBwaXBlX251bSwgYXR0cik7Ci0JCWlmIChwaXBlX2luZm8tPmNlX2hkbCA9PSBOVUxMKSB7Ci0JCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBDRSBmb3IgcGlwZTogJWRcbiIsCi0JCQkJICAgcGlwZV9udW0pOwotCi0JCQkvKiBJdCBpcyBzYWZlIHRvIGNhbGwgaXQgaGVyZS4gSXQgY2hlY2tzIGlmIGNlX2hkbCBpcwotCQkJICogdmFsaWQgZm9yIGVhY2ggcGlwZSAqLwotCQkJYXRoMTBrX3BjaV9jZV9kZWluaXQoYXIpOwotCQkJcmV0dXJuIC0xOworCQlyZXQgPSBhdGgxMGtfY2VfaW5pdF9waXBlKGFyLCBwaXBlX251bSwgYXR0cik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEwa19lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIGNvcHkgZW5naW5lIHBpcGUgJWQ6ICVkXG4iLAorCQkJCSAgIHBpcGVfbnVtLCByZXQpOworCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCWlmIChwaXBlX251bSA9PSBDRV9DT1VOVCAtIDEpIHsKQEAgLTE3NDEsMTYgKzE3OTAsMTUgQEAKIHN0YXRpYyB2b2lkIGF0aDEwa19wY2lfZndfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7Ci0JdTMyIGZ3X2luZGljYXRvcl9hZGRyZXNzLCBmd19pbmRpY2F0b3I7CisJdTMyIGZ3X2luZGljYXRvcjsKIAogCWF0aDEwa19wY2lfd2FrZShhcik7CiAKLQlmd19pbmRpY2F0b3JfYWRkcmVzcyA9IGFyX3BjaS0+ZndfaW5kaWNhdG9yX2FkZHJlc3M7Ci0JZndfaW5kaWNhdG9yID0gYXRoMTBrX3BjaV9yZWFkMzIoYXIsIGZ3X2luZGljYXRvcl9hZGRyZXNzKTsKKwlmd19pbmRpY2F0b3IgPSBhdGgxMGtfcGNpX3JlYWQzMihhciwgRldfSU5ESUNBVE9SX0FERFJFU1MpOwogCiAJaWYgKGZ3X2luZGljYXRvciAmIEZXX0lORF9FVkVOVF9QRU5ESU5HKSB7CiAJCS8qIEFDSzogY2xlYXIgVGFyZ2V0LXNpZGUgcGVuZGluZyBldmVudCAqLwotCQlhdGgxMGtfcGNpX3dyaXRlMzIoYXIsIGZ3X2luZGljYXRvcl9hZGRyZXNzLAorCQlhdGgxMGtfcGNpX3dyaXRlMzIoYXIsIEZXX0lORElDQVRPUl9BRERSRVNTLAogCQkJCSAgIGZ3X2luZGljYXRvciAmIH5GV19JTkRfRVZFTlRfUEVORElORyk7CiAKIAkJaWYgKGFyX3BjaS0+c3RhcnRlZCkgewpAQCAtMTc2NywxMyArMTgxNSwzMiBAQAogCWF0aDEwa19wY2lfc2xlZXAoYXIpOwogfQogCisvKiB0aGlzIGZ1bmN0aW9uIGVmZmVjdGl2ZWx5IGNsZWFycyB0YXJnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYXNzZXJ0IGxpbmUgKi8KK3N0YXRpYyB2b2lkIGF0aDEwa19wY2lfd2FybV9yZXNldF9zaTAoc3RydWN0IGF0aDEwayAqYXIpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IGF0aDEwa19wY2lfc29jX3JlYWQzMihhciwgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyk7CisJYXRoMTBrX3BjaV9zb2Nfd3JpdGUzMihhciwgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUywKKwkJCSAgICAgICB2YWwgfCBTT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0spOworCXZhbCA9IGF0aDEwa19wY2lfc29jX3JlYWQzMihhciwgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyk7CisKKwltc2xlZXAoMTApOworCisJdmFsID0gYXRoMTBrX3BjaV9zb2NfcmVhZDMyKGFyLCBTT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTKTsKKwlhdGgxMGtfcGNpX3NvY193cml0ZTMyKGFyLCBTT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTLAorCQkJICAgICAgIHZhbCAmIH5TT0NfUkVTRVRfQ09OVFJPTF9TSTBfUlNUX01BU0spOworCXZhbCA9IGF0aDEwa19wY2lfc29jX3JlYWQzMihhciwgU09DX1JFU0VUX0NPTlRST0xfQUREUkVTUyk7CisKKwltc2xlZXAoMTApOworfQorCiBzdGF0aWMgaW50IGF0aDEwa19wY2lfd2FybV9yZXNldChzdHJ1Y3QgYXRoMTBrICphcikKIHsKLQlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKIAlpbnQgcmV0ID0gMDsKIAl1MzIgdmFsOwogCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IHBlcmZvcm1pbmcgd2FybSBjaGlwIHJlc2V0XG4iKTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgImJvb3Qgd2FybSByZXNldFxuIik7CiAKIAlyZXQgPSBhdGgxMGtfZG9fcGNpX3dha2UoYXIpOwogCWlmIChyZXQpIHsKQEAgLTE4MDEsNyArMTg2OCw3IEBACiAJbXNsZWVwKDEwMCk7CiAKIAkvKiBjbGVhciBmdyBpbmRpY2F0b3IgKi8KLQlhdGgxMGtfcGNpX3dyaXRlMzIoYXIsIGFyX3BjaS0+ZndfaW5kaWNhdG9yX2FkZHJlc3MsIDApOworCWF0aDEwa19wY2lfd3JpdGUzMihhciwgRldfSU5ESUNBVE9SX0FERFJFU1MsIDApOwogCiAJLyogY2xlYXIgdGFyZ2V0IExGIHRpbWVyIGludGVycnVwdHMgKi8KIAl2YWwgPSBhdGgxMGtfcGNpX3JlYWQzMihhciwgUlRDX1NPQ19CQVNFX0FERFJFU1MgKwpAQCAtMTgyNiw2ICsxODkzLDggQEAKIAkJCQlTT0NfUkVTRVRfQ09OVFJPTF9BRERSRVNTKTsKIAltc2xlZXAoMTApOwogCisJYXRoMTBrX3BjaV93YXJtX3Jlc2V0X3NpMChhcik7CisKIAkvKiBkZWJ1ZyAqLwogCXZhbCA9IGF0aDEwa19wY2lfcmVhZDMyKGFyLCBTT0NfQ09SRV9CQVNFX0FERFJFU1MgKwogCQkJCVBDSUVfSU5UUl9DQVVTRV9BRERSRVNTKTsKQEAgLTE5MzQsNyArMjAwMyw5IEBACiAJCWlycV9tb2RlID0gImxlZ2FjeSI7CiAKIAlpZiAoIXRlc3RfYml0KEFUSDEwS19GTEFHX0ZJUlNUX0JPT1RfRE9ORSwgJmFyLT5kZXZfZmxhZ3MpKQotCQlhdGgxMGtfaW5mbygicGNpIGlycSAlc1xuIiwgaXJxX21vZGUpOworCQlhdGgxMGtfaW5mbygicGNpIGlycSAlcyBpcnFfbW9kZSAlZCByZXNldF9tb2RlICVkXG4iLAorCQkJICAgIGlycV9tb2RlLCBhdGgxMGtfcGNpX2lycV9tb2RlLAorCQkJICAgIGF0aDEwa19wY2lfcmVzZXRfbW9kZSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTk1MiwyMyArMjAyMyw1MiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX3BjaV9oaWZfcG93ZXJfdXBfd2FybShzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgaSwgcmV0OworCisJLyoKKwkgKiBTb21ldGltZSB3YXJtIHJlc2V0IHN1Y2NlZWRzIGFmdGVyIHJldHJpZXMuCisJICoKKwkgKiBGSVhNRTogSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gdHVuZSBhdGgxMGtfcGNpX3dhcm1fcmVzZXQoKSB0byB3b3JrCisJICogYXQgZmlyc3QgdHJ5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBVEgxMEtfUENJX05VTV9XQVJNX1JFU0VUX0FUVEVNUFRTOyBpKyspIHsKKwkJcmV0ID0gX19hdGgxMGtfcGNpX2hpZl9wb3dlcl91cChhciwgZmFsc2UpOworCQlpZiAocmV0ID09IDApCisJCQlicmVhazsKKworCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIHdhcm0gcmVzZXQgKGF0dGVtcHQgJWQgb3V0IG9mICVkKTogJWRcbiIsCisJCQkgICAgaSArIDEsIEFUSDEwS19QQ0lfTlVNX1dBUk1fUkVTRVRfQVRURU1QVFMsIHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhdGgxMGtfcGNpX2hpZl9wb3dlcl91cChzdHJ1Y3QgYXRoMTBrICphcikKIHsKIAlpbnQgcmV0OwogCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IGhpZiBwb3dlciB1cFxuIik7CisKIAkvKgogCSAqIEhhcmR3YXJlIENVUzIzMiB2ZXJzaW9uIDIgaGFzIHNvbWUgaXNzdWVzIHdpdGggY29sZCByZXNldCBhbmQgdGhlCiAJICogcHJlZmVycmVkIChhbmQgc2FmZXIpIHdheSB0byBwZXJmb3JtIGEgZGV2aWNlIHJlc2V0IGlzIHRocm91Z2ggYQogCSAqIHdhcm0gcmVzZXQuCiAJICoKLQkgKiBXYXJtIHJlc2V0IGRvZXNuJ3QgYWx3YXlzIHdvcmsgdGhvdWdoIChub3RhYmx5IGFmdGVyIGEgZmlybXdhcmUKLQkgKiBjcmFzaCkgc28gZmFsbCBiYWNrIHRvIGNvbGQgcmVzZXQgaWYgbmVjZXNzYXJ5LgorCSAqIFdhcm0gcmVzZXQgZG9lc24ndCBhbHdheXMgd29yayB0aG91Z2ggc28gZmFsbCBiYWNrIHRvIGNvbGQgcmVzZXQgbWF5CisJICogYmUgbmVjZXNzYXJ5LgogCSAqLwotCXJldCA9IF9fYXRoMTBrX3BjaV9oaWZfcG93ZXJfdXAoYXIsIGZhbHNlKTsKKwlyZXQgPSBhdGgxMGtfcGNpX2hpZl9wb3dlcl91cF93YXJtKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcG93ZXIgdXAgdGFyZ2V0IHVzaW5nIHdhcm0gcmVzZXQgKCVkKSwgdHJ5aW5nIGNvbGQgcmVzZXRcbiIsCisJCWF0aDEwa193YXJuKCJmYWlsZWQgdG8gcG93ZXIgdXAgdGFyZ2V0IHVzaW5nIHdhcm0gcmVzZXQ6ICVkXG4iLAogCQkJICAgIHJldCk7CiAKKwkJaWYgKGF0aDEwa19wY2lfcmVzZXRfbW9kZSA9PSBBVEgxMEtfUENJX1JFU0VUX1dBUk1fT05MWSkKKwkJCXJldHVybiByZXQ7CisKKwkJYXRoMTBrX3dhcm4oInRyeWluZyBjb2xkIHJlc2V0XG4iKTsKKwogCQlyZXQgPSBfX2F0aDEwa19wY2lfaGlmX3Bvd2VyX3VwKGFyLCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJYXRoMTBrX2VycigiZmFpbGVkIHRvIHBvd2VyIHVwIHRhcmdldCB1c2luZyBjb2xkIHJlc2V0IHRvbyAoJWQpXG4iLApAQCAtMTk4NCwxMiArMjA4NCwxNCBAQAogewogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IGhpZiBwb3dlciBkb3duXG4iKTsKKwogCWF0aDEwa19wY2lfZnJlZV9lYXJseV9pcnEoYXIpOwogCWF0aDEwa19wY2lfa2lsbF90YXNrbGV0KGFyKTsKIAlhdGgxMGtfcGNpX2RlaW5pdF9pcnEoYXIpOworCWF0aDEwa19wY2lfY2VfZGVpbml0KGFyKTsKIAlhdGgxMGtfcGNpX3dhcm1fcmVzZXQoYXIpOwogCi0JYXRoMTBrX3BjaV9jZV9kZWluaXQoYXIpOwogCWlmICghdGVzdF9iaXQoQVRIMTBLX1BDSV9GRUFUVVJFX1NPQ19QT1dFUl9TQVZFLCBhcl9wY2ktPmZlYXR1cmVzKSkKIAkJYXRoMTBrX2RvX3BjaV9zbGVlcChhcik7CiB9CkBAIC0yMTM3LDcgKzIyMzksNiBAQAogc3RhdGljIHZvaWQgYXRoMTBrX3BjaV9lYXJseV9pcnFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSAoc3RydWN0IGF0aDEwayAqKWRhdGE7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAJdTMyIGZ3X2luZDsKIAlpbnQgcmV0OwogCkBAIC0yMTQ4LDE0ICsyMjQ5LDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlmd19pbmQgPSBhdGgxMGtfcGNpX3JlYWQzMihhciwgYXJfcGNpLT5md19pbmRpY2F0b3JfYWRkcmVzcyk7CisJZndfaW5kID0gYXRoMTBrX3BjaV9yZWFkMzIoYXIsIEZXX0lORElDQVRPUl9BRERSRVNTKTsKIAlpZiAoZndfaW5kICYgRldfSU5EX0VWRU5UX1BFTkRJTkcpIHsKLQkJYXRoMTBrX3BjaV93cml0ZTMyKGFyLCBhcl9wY2ktPmZ3X2luZGljYXRvcl9hZGRyZXNzLAorCQlhdGgxMGtfcGNpX3dyaXRlMzIoYXIsIEZXX0lORElDQVRPUl9BRERSRVNTLAogCQkJCSAgIGZ3X2luZCAmIH5GV19JTkRfRVZFTlRfUEVORElORyk7Ci0KLQkJLyogU29tZSBzdHJ1Y3R1cmVzIGFyZSB1bmF2YWlsYWJsZSBkdXJpbmcgZWFybHkgYm9vdCBvciBhdAotCQkgKiBkcml2ZXIgdGVhcmRvd24gc28ganVzdCBwcmludCB0aGF0IHRoZSBkZXZpY2UgaGFzIGNyYXNoZWQuICovCi0JCWF0aDEwa193YXJuKCJkZXZpY2UgY3Jhc2hlZCAtIG5vIGRpYWdub3N0aWNzIGF2YWlsYWJsZVxuIik7CisJCWF0aDEwa19wY2lfaGlmX2R1bXBfYXJlYShhcik7CiAJfQogCiAJYXRoMTBrX3BjaV9zbGVlcChhcik7CkBAIC0yMzg1LDMzICsyNDgzLDY5IEBACiBzdGF0aWMgaW50IGF0aDEwa19wY2lfd2FpdF9mb3JfdGFyZ2V0X2luaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7Ci0JaW50IHdhaXRfbGltaXQgPSAzMDA7IC8qIDMgc2VjICovCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCByZXQ7CisJdTMyIHZhbDsKKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAiYm9vdCB3YWl0aW5nIHRhcmdldCB0byBpbml0aWFsaXNlXG4iKTsKIAogCXJldCA9IGF0aDEwa19wY2lfd2FrZShhcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gd2FrZSB1cCB0YXJnZXQ6ICVkXG4iLCByZXQpOworCQlhdGgxMGtfZXJyKCJmYWlsZWQgdG8gd2FrZSB1cCB0YXJnZXQgZm9yIGluaXQ6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXdoaWxlICh3YWl0X2xpbWl0LS0gJiYKLQkgICAgICAgIShpb3JlYWQzMihhcl9wY2ktPm1lbSArIEZXX0lORElDQVRPUl9BRERSRVNTKSAmCi0JCSBGV19JTkRfSU5JVElBTElaRUQpKSB7CisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEFUSDEwS19QQ0lfVEFSR0VUX1dBSVQpOworCisJZG8geworCQl2YWwgPSBhdGgxMGtfcGNpX3JlYWQzMihhciwgRldfSU5ESUNBVE9SX0FERFJFU1MpOworCisJCWF0aDEwa19kYmcoQVRIMTBLX0RCR19CT09ULCAiYm9vdCB0YXJnZXQgaW5kaWNhdG9yICV4XG4iLCB2YWwpOworCisJCS8qIHRhcmdldCBzaG91bGQgbmV2ZXIgcmV0dXJuIHRoaXMgKi8KKwkJaWYgKHZhbCA9PSAweGZmZmZmZmZmKQorCQkJY29udGludWU7CisKKwkJLyogdGhlIGRldmljZSBoYXMgY3Jhc2hlZCBzbyBkb24ndCBib3RoZXIgdHJ5aW5nIGFueW1vcmUgKi8KKwkJaWYgKHZhbCAmIEZXX0lORF9FVkVOVF9QRU5ESU5HKQorCQkJYnJlYWs7CisKKwkJaWYgKHZhbCAmIEZXX0lORF9JTklUSUFMSVpFRCkKKwkJCWJyZWFrOworCiAJCWlmIChhcl9wY2ktPm51bV9tc2lfaW50cnMgPT0gMCkKIAkJCS8qIEZpeCBwb3RlbnRpYWwgcmFjZSBieSByZXBlYXRpbmcgQ09SRV9CQVNFIHdyaXRlcyAqLwotCQkJaW93cml0ZTMyKFBDSUVfSU5UUl9GSVJNV0FSRV9NQVNLIHwKLQkJCQkgIFBDSUVfSU5UUl9DRV9NQVNLX0FMTCwKLQkJCQkgIGFyX3BjaS0+bWVtICsgKFNPQ19DT1JFX0JBU0VfQUREUkVTUyB8Ci0JCQkJCQkgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTKSk7Ci0JCW1kZWxheSgxMCk7Ci0JfQorCQkJYXRoMTBrX3BjaV9zb2Nfd3JpdGUzMihhciwgUENJRV9JTlRSX0VOQUJMRV9BRERSRVNTLAorCQkJCQkgICAgICAgUENJRV9JTlRSX0ZJUk1XQVJFX01BU0sgfAorCQkJCQkgICAgICAgUENJRV9JTlRSX0NFX01BU0tfQUxMKTsKIAotCWlmICh3YWl0X2xpbWl0IDwgMCkgewotCQlhdGgxMGtfZXJyKCJ0YXJnZXQgc3RhbGxlZFxuIik7CisJCW1kZWxheSgxMCk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCisJaWYgKHZhbCA9PSAweGZmZmZmZmZmKSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byByZWFkIGRldmljZSByZWdpc3RlciwgZGV2aWNlIGlzIGdvbmVcbiIpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAodmFsICYgRldfSU5EX0VWRU5UX1BFTkRJTkcpIHsKKwkJYXRoMTBrX3dhcm4oImRldmljZSBoYXMgY3Jhc2hlZCBkdXJpbmcgaW5pdFxuIik7CisJCWF0aDEwa19wY2lfd3JpdGUzMihhciwgRldfSU5ESUNBVE9SX0FERFJFU1MsCisJCQkJICAgdmFsICYgfkZXX0lORF9FVkVOVF9QRU5ESU5HKTsKKwkJYXRoMTBrX3BjaV9oaWZfZHVtcF9hcmVhKGFyKTsKKwkJcmV0ID0gLUVDT01NOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoISh2YWwgJiBGV19JTkRfSU5JVElBTElaRUQpKSB7CisJCWF0aDEwa19lcnIoImZhaWxlZCB0byByZWNlaXZlIGluaXRpYWxpemVkIGV2ZW50IGZyb20gdGFyZ2V0OiAlMDh4XG4iLAorCQkJICAgdmFsKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IHRhcmdldCBpbml0aWFsaXNlZFxuIik7CisKIG91dDoKIAlhdGgxMGtfcGNpX3NsZWVwKGFyKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjQyMiw2ICsyNTU2LDggQEAKIAlpbnQgaSwgcmV0OwogCXUzMiB2YWw7CiAKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgImJvb3QgY29sZCByZXNldFxuIik7CisKIAlyZXQgPSBhdGgxMGtfZG9fcGNpX3dha2UoYXIpOwogCWlmIChyZXQpIHsKIAkJYXRoMTBrX2VycigiZmFpbGVkIHRvIHdha2UgdXAgdGFyZ2V0OiAlZFxuIiwKQEAgLTI0NTMsNiArMjU4OSw5IEBACiAJfQogCiAJYXRoMTBrX2RvX3BjaV9zbGVlcChhcik7CisKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfQk9PVCwgImJvb3QgY29sZCByZXNldCBjb21wbGV0ZVxuIik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ4NCw3ICsyNjIzLDcgQEAKIAlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpOwogCXUzMiBsY3JfdmFsLCBjaGlwX2lkOwogCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX1BDSSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJYXRoMTBrX2RiZyhBVEgxMEtfREJHX1BDSSwgInBjaSBwcm9iZVxuIik7CiAKIAlhcl9wY2kgPSBremFsbG9jKHNpemVvZigqYXJfcGNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFyX3BjaSA9PSBOVUxMKQpAQCAtMjUwMyw3ICsyNjQyLDcgQEAKIAkJZ290byBlcnJfYXJfcGNpOwogCX0KIAotCWlmIChhdGgxMGtfdGFyZ2V0X3BzKQorCWlmIChhdGgxMGtfcGNpX3RhcmdldF9wcykKIAkJc2V0X2JpdChBVEgxMEtfUENJX0ZFQVRVUkVfU09DX1BPV0VSX1NBVkUsIGFyX3BjaS0+ZmVhdHVyZXMpOwogCiAJYXRoMTBrX3BjaV9kdW1wX2ZlYXR1cmVzKGFyX3BjaSk7CkBAIC0yNTE2LDIzICsyNjU1LDEwIEBACiAJfQogCiAJYXJfcGNpLT5hciA9IGFyOwotCWFyX3BjaS0+ZndfaW5kaWNhdG9yX2FkZHJlc3MgPSBGV19JTkRJQ0FUT1JfQUREUkVTUzsKIAlhdG9taWNfc2V0KCZhcl9wY2ktPmtlZXBfYXdha2VfY291bnQsIDApOwogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFyKTsKIAotCS8qCi0JICogV2l0aG91dCBhbnkga25vd2xlZGdlIG9mIHRoZSBIb3N0LCB0aGUgVGFyZ2V0IG1heSBoYXZlIGJlZW4gcmVzZXQgb3IKLQkgKiBwb3dlciBjeWNsZWQgYW5kIGl0cyBDb25maWcgU3BhY2UgbWF5IG5vIGxvbmdlciByZWZsZWN0IHRoZSBQQ0kKLQkgKiBhZGRyZXNzIHNwYWNlIHRoYXQgd2FzIGFzc2lnbmVkIGVhcmxpZXIgYnkgdGhlIFBDSSBpbmZyYXN0cnVjdHVyZS4KLQkgKiBSZWZyZXNoIGl0IG5vdy4KLQkgKi8KLQlyZXQgPSBwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsIEJBUl9OVU0pOwotCWlmIChyZXQpIHsKLQkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGFzc2lnbiBQQ0kgc3BhY2U6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9hcjsKLQl9Ci0KIAlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmV0KSB7CiAJCWF0aDEwa19lcnIoImZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZTogJWRcbiIsIHJldCk7CkBAIC0yNTk0LDE2ICsyNzIwLDI0IEBACiAKIAlhdGgxMGtfZG9fcGNpX3NsZWVwKGFyKTsKIAorCXJldCA9IGF0aDEwa19wY2lfYWxsb2NfY2UoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIGNvcHkgZW5naW5lIHBpcGVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfaW9tYXA7CisJfQorCiAJYXRoMTBrX2RiZyhBVEgxMEtfREJHX0JPT1QsICJib290IHBjaV9tZW0gMHglcFxuIiwgYXJfcGNpLT5tZW0pOwogCiAJcmV0ID0gYXRoMTBrX2NvcmVfcmVnaXN0ZXIoYXIsIGNoaXBfaWQpOwogCWlmIChyZXQpIHsKIAkJYXRoMTBrX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGRyaXZlciBjb3JlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfaW9tYXA7CisJCWdvdG8gZXJyX2ZyZWVfY2U7CiAJfQogCiAJcmV0dXJuIDA7CiAKK2Vycl9mcmVlX2NlOgorCWF0aDEwa19wY2lfZnJlZV9jZShhcik7CiBlcnJfaW9tYXA6CiAJcGNpX2lvdW5tYXAocGRldiwgbWVtKTsKIGVycl9tYXN0ZXI6CkBAIC0yNjI2LDcgKzI3NjAsNyBAQAogCXN0cnVjdCBhdGgxMGsgKmFyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2k7CiAKLQlhdGgxMGtfZGJnKEFUSDEwS19EQkdfUENJLCAiJXNcbiIsIF9fZnVuY19fKTsKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfUENJLCAicGNpIHJlbW92ZVxuIik7CiAKIAlpZiAoIWFyKQogCQlyZXR1cm47CkBAIC0yNjM2LDkgKzI3NzAsOCBAQAogCWlmICghYXJfcGNpKQogCQlyZXR1cm47CiAKLQl0YXNrbGV0X2tpbGwoJmFyX3BjaS0+bXNpX2Z3X2Vycik7Ci0KIAlhdGgxMGtfY29yZV91bnJlZ2lzdGVyKGFyKTsKKwlhdGgxMGtfcGNpX2ZyZWVfY2UoYXIpOwogCiAJcGNpX2lvdW5tYXAocGRldiwgYXJfcGNpLT5tZW0pOwogCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBCQVJfTlVNKTsKQEAgLTI2ODAsNiArMjgxMyw1IEBACiBNT0RVTEVfQVVUSE9SKCJRdWFsY29tbSBBdGhlcm9zIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBzdXBwb3J0IGZvciBBdGhlcm9zIFFDQTk4OFggUENJZSBkZXZpY2VzIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ci1NT0RVTEVfRklSTVdBUkUoUUNBOTg4WF9IV18yXzBfRldfRElSICIvIiBRQ0E5ODhYX0hXXzJfMF9GV19GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShRQ0E5ODhYX0hXXzJfMF9GV19ESVIgIi8iIFFDQTk4OFhfSFdfMl8wX09UUF9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShRQ0E5ODhYX0hXXzJfMF9GV19ESVIgIi8iIFFDQTk4OFhfSFdfMl8wX0ZXXzJfRklMRSk7CiBNT0RVTEVfRklSTVdBUkUoUUNBOTg4WF9IV18yXzBfRldfRElSICIvIiBRQ0E5ODhYX0hXXzJfMF9CT0FSRF9EQVRBX0ZJTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmgKaW5kZXggYjQzZmRiNC4uZGZkZWJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5oCkBAIC0xODksOSArMTg5LDYgQEAKIAogCXN0cnVjdCBhdGgxMGtfaGlmX2NiIG1zZ19jYWxsYmFja3NfY3VycmVudDsKIAotCS8qIFRhcmdldCBhZGRyZXNzIHVzZWQgdG8gc2lnbmFsIGEgcGVuZGluZyBmaXJtd2FyZSBldmVudCAqLwotCXUzMiBmd19pbmRpY2F0b3JfYWRkcmVzczsKLQogCS8qIENvcHkgRW5naW5lIHVzZWQgZm9yIERpYWdub3N0aWMgQWNjZXNzZXMgKi8KIAlzdHJ1Y3QgYXRoMTBrX2NlX3BpcGUgKmNlX2RpYWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90eHJ4LmMKaW5kZXggMDU0MWRkOS4uODI2NjlhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90eHJ4LmMKQEAgLTEwMCwxODkgKzEwMCw2IEBACiAJCXdha2VfdXAoJmh0dC0+ZW1wdHlfdHhfd3EpOwogfQogCi1zdGF0aWMgY29uc3QgdTggcnhfbGVnYWN5X3JhdGVfaWR4W10gPSB7Ci0JMywJLyogMHgwMCAgLSAxMU1icHMgICovCi0JMiwJLyogMHgwMSAgLSA1LjVNYnBzICovCi0JMSwJLyogMHgwMiAgLSAyTWJwcyAgICovCi0JMCwJLyogMHgwMyAgLSAxTWJwcyAgICovCi0JMywJLyogMHgwNCAgLSAxMU1icHMgICovCi0JMiwJLyogMHgwNSAgLSA1LjVNYnBzICovCi0JMSwJLyogMHgwNiAgLSAyTWJwcyAgICovCi0JMCwJLyogMHgwNyAgLSAxTWJwcyAgICovCi0JMTAsCS8qIDB4MDggIC0gNDhNYnBzICAqLwotCTgsCS8qIDB4MDkgIC0gMjRNYnBzICAqLwotCTYsCS8qIDB4MEEgIC0gMTJNYnBzICAqLwotCTQsCS8qIDB4MEIgIC0gNk1icHMgICAqLwotCTExLAkvKiAweDBDICAtIDU0TWJwcyAgKi8KLQk5LAkvKiAweDBEICAtIDM2TWJwcyAgKi8KLQk3LAkvKiAweDBFICAtIDE4TWJwcyAgKi8KLQk1LAkvKiAweDBGICAtIDlNYnBzICAgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfcnhfcmF0ZXMoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBodHRfcnhfaW5mbyAqaW5mbywKLQkJCSAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzKQotewotCXU4IGNjaywgcmF0ZSwgcmF0ZV9pZHgsIGJ3LCBzZ2ksIG1jcywgbnNzOwotCXU4IGluZm8wID0gaW5mby0+cmF0ZS5pbmZvMDsKLQl1MzIgaW5mbzEgPSBpbmZvLT5yYXRlLmluZm8xOwotCXUzMiBpbmZvMiA9IGluZm8tPnJhdGUuaW5mbzI7Ci0JdTggcHJlYW1ibGUgPSAwOwotCi0JLyogQ2hlY2sgaWYgdmFsaWQgZmllbGRzICovCi0JaWYgKCEoaW5mbzAgJiBIVFRfUlhfSU5ESUNBVElPTl9JTkZPMF9TVEFSVF9WQUxJRCkpCi0JCXJldHVybjsKLQotCXByZWFtYmxlID0gTVMoaW5mbzEsIEhUVF9SWF9JTkRJQ0FUSU9OX0lORk8xX1BSRUFNQkxFX1RZUEUpOwotCi0Jc3dpdGNoIChwcmVhbWJsZSkgewotCWNhc2UgSFRUX1JYX0xFR0FDWToKLQkJY2NrID0gaW5mbzAgJiBIVFRfUlhfSU5ESUNBVElPTl9JTkZPMF9MRUdBQ1lfUkFURV9DQ0s7Ci0JCXJhdGUgPSBNUyhpbmZvMCwgSFRUX1JYX0lORElDQVRJT05fSU5GTzBfTEVHQUNZX1JBVEUpOwotCQlyYXRlX2lkeCA9IDA7Ci0KLQkJaWYgKHJhdGUgPCAweDA4IHx8IHJhdGUgPiAweDBGKQotCQkJYnJlYWs7Ci0KLQkJc3dpdGNoIChiYW5kKSB7Ci0JCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJCWlmIChjY2spCi0JCQkJcmF0ZSAmPSB+QklUKDMpOwotCQkJcmF0ZV9pZHggPSByeF9sZWdhY3lfcmF0ZV9pZHhbcmF0ZV07Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQkJcmF0ZV9pZHggPSByeF9sZWdhY3lfcmF0ZV9pZHhbcmF0ZV07Ci0JCQkvKiBXZSBhcmUgdXNpbmcgc2FtZSByYXRlIHRhYmxlIHJlZ2lzdGVyaW5nCi0JCQkgICBIVyAtIGF0aDEwa19yYXRlc1tdLiBJbiBjYXNlIG9mIDVHSHogc2tpcAotCQkJICAgQ0NLIHJhdGVzLCBzbyAtNCBoZXJlICovCi0JCQlyYXRlX2lkeCAtPSA0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCXN0YXR1cy0+cmF0ZV9pZHggPSByYXRlX2lkeDsKLQkJYnJlYWs7Ci0JY2FzZSBIVFRfUlhfSFQ6Ci0JY2FzZSBIVFRfUlhfSFRfV0lUSF9UWEJGOgotCQkvKiBIVC1TSUcgLSBUYWJsZSAyMC0xMSBpbiBpbmZvMSBhbmQgaW5mbzIgKi8KLQkJbWNzID0gaW5mbzEgJiAweDFGOwotCQluc3MgPSBtY3MgPj4gMzsKLQkJYncgPSAoaW5mbzEgPj4gNykgJiAxOwotCQlzZ2kgPSAoaW5mbzIgPj4gNykgJiAxOwotCi0JCXN0YXR1cy0+cmF0ZV9pZHggPSBtY3M7Ci0JCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOwotCQlpZiAoc2dpKQotCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRfR0k7Ci0JCWlmIChidykKLQkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOwotCQlicmVhazsKLQljYXNlIEhUVF9SWF9WSFQ6Ci0JY2FzZSBIVFRfUlhfVkhUX1dJVEhfVFhCRjoKLQkJLyogVkhULVNJRy1BMSBpbiBpbmZvIDEsIFZIVC1TSUctQTIgaW4gaW5mbzIKLQkJICAgVE9ETyBjaGVjayB0aGlzICovCi0JCW1jcyA9IChpbmZvMiA+PiA0KSAmIDB4MEY7Ci0JCW5zcyA9ICgoaW5mbzEgPj4gMTApICYgMHgwNykgKyAxOwotCQlidyA9IGluZm8xICYgMzsKLQkJc2dpID0gaW5mbzIgJiAxOwotCi0JCXN0YXR1cy0+cmF0ZV9pZHggPSBtY3M7Ci0JCXN0YXR1cy0+dmh0X25zcyA9IG5zczsKLQotCQlpZiAoc2dpKQotCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRfR0k7Ci0KLQkJc3dpdGNoIChidykgewotCQkvKiAyME1IWiAqLwotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJLyogNDBNSFogKi8KLQkJY2FzZSAxOgotCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfNDBNSFo7Ci0JCQlicmVhazsKLQkJLyogODBNSFogKi8KLQkJY2FzZSAyOgotCQkJc3RhdHVzLT52aHRfZmxhZyB8PSBSWF9WSFRfRkxBR184ME1IWjsKLQkJfQotCi0JCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1ZIVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIGF0aDEwa19wcm9jZXNzX3J4KHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3QgaHR0X3J4X2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1czsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilpbmZvLT5za2ItPmRhdGE7Ci0KLQlzdGF0dXMgPSBJRUVFODAyMTFfU0tCX1JYQ0IoaW5mby0+c2tiKTsKLQltZW1zZXQoc3RhdHVzLCAwLCBzaXplb2YoKnN0YXR1cykpOwotCi0JaWYgKGluZm8tPmVuY3J5cHRfdHlwZSAhPSBIVFRfUlhfTVBEVV9FTkNSWVBUX05PTkUpIHsKLQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEIHwgUlhfRkxBR19JVl9TVFJJUFBFRCB8Ci0JCQkJUlhfRkxBR19NTUlDX1NUUklQUEVEOwotCQloZHItPmZyYW1lX2NvbnRyb2wgPSBfX2NwdV90b19sZTE2KAotCQkJCV9fbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmCi0JCQkJfklFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0JfQotCi0JaWYgKGluZm8tPm1pY19lcnIpCi0JCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX01NSUNfRVJST1I7Ci0KLQlpZiAoaW5mby0+ZmNzX2VycikKLQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7Ci0KLQlpZiAoaW5mby0+YW1zZHVfbW9yZSkKLQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfQU1TRFVfTU9SRTsKLQotCXN0YXR1cy0+c2lnbmFsID0gaW5mby0+c2lnbmFsOwotCi0Jc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKLQljaCA9IGFyLT5zY2FuX2NoYW5uZWw7Ci0JaWYgKCFjaCkKLQkJY2ggPSBhci0+cnhfY2hhbm5lbDsKLQlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7Ci0KLQlpZiAoIWNoKSB7Ci0JCWF0aDEwa193YXJuKCJubyBjaGFubmVsIGNvbmZpZ3VyZWQ7IGlnbm9yaW5nIGZyYW1lIVxuIik7Ci0JCWRldl9rZnJlZV9za2JfYW55KGluZm8tPnNrYik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm9jZXNzX3J4X3JhdGVzKGFyLCBpbmZvLCBjaC0+YmFuZCwgc3RhdHVzKTsKLQlzdGF0dXMtPmJhbmQgPSBjaC0+YmFuZDsKLQlzdGF0dXMtPmZyZXEgPSBjaC0+Y2VudGVyX2ZyZXE7Ci0KLQlpZiAoaW5mby0+cmF0ZS5pbmZvMCAmIEhUVF9SWF9JTkRJQ0FUSU9OX0lORk8wX0VORF9WQUxJRCkgewotCQkvKiBUU0YgYXZhaWxhYmxlIG9ubHkgaW4gMzItYml0ICovCi0JCXN0YXR1cy0+bWFjdGltZSA9IGluZm8tPnRzZiAmIDB4ZmZmZmZmZmY7Ci0JCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfRU5EOwotCX0KLQotCWF0aDEwa19kYmcoQVRIMTBLX0RCR19EQVRBLAotCQkgICAicnggc2tiICVwIGxlbiAldSAlcyVzJXMlcyVzICVzcmF0ZV9pZHggJXUgdmh0X25zcyAldSBmcmVxICV1IGJhbmQgJXUgZmxhZyAweCV4IGZjcy1lcnIgJWlcbiIsCi0JCSAgIGluZm8tPnNrYiwKLQkJICAgaW5mby0+c2tiLT5sZW4sCi0JCSAgIHN0YXR1cy0+ZmxhZyA9PSAwID8gImxlZ2FjeSIgOiAiIiwKLQkJICAgc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCA/ICJodCIgOiAiIiwKLQkJICAgc3RhdHVzLT5mbGFnICYgUlhfRkxBR19WSFQgPyAidmh0IiA6ICIiLAotCQkgICBzdGF0dXMtPmZsYWcgJiBSWF9GTEFHXzQwTUhaID8gIjQwIiA6ICIiLAotCQkgICBzdGF0dXMtPnZodF9mbGFnICYgUlhfVkhUX0ZMQUdfODBNSFogPyAiODAiIDogIiIsCi0JCSAgIHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfU0hPUlRfR0kgPyAic2dpICIgOiAiIiwKLQkJICAgc3RhdHVzLT5yYXRlX2lkeCwKLQkJICAgc3RhdHVzLT52aHRfbnNzLAotCQkgICBzdGF0dXMtPmZyZXEsCi0JCSAgIHN0YXR1cy0+YmFuZCwgc3RhdHVzLT5mbGFnLCBpbmZvLT5mY3NfZXJyKTsKLQlhdGgxMGtfZGJnX2R1bXAoQVRIMTBLX0RCR19IVFRfRFVNUCwgTlVMTCwgInJ4IHNrYjogIiwKLQkJCWluZm8tPnNrYi0+ZGF0YSwgaW5mby0+c2tiLT5sZW4pOwotCi0JaWVlZTgwMjExX3J4KGFyLT5odywgaW5mby0+c2tiKTsKLX0KLQogc3RydWN0IGF0aDEwa19wZWVyICphdGgxMGtfcGVlcl9maW5kKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgdmRldl9pZCwKIAkJCQkgICAgIGNvbnN0IHU4ICphZGRyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90eHJ4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguaAppbmRleCAzNTZkYzljLi5hZWUzZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguaApAQCAtMjEsNyArMjEsNiBAQAogCiB2b2lkIGF0aDEwa190eHJ4X3R4X3VucmVmKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsCiAJCQkgIGNvbnN0IHN0cnVjdCBodHRfdHhfZG9uZSAqdHhfZG9uZSk7Ci12b2lkIGF0aDEwa19wcm9jZXNzX3J4KHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3QgaHR0X3J4X2luZm8gKmluZm8pOwogCiBzdHJ1Y3QgYXRoMTBrX3BlZXIgKmF0aDEwa19wZWVyX2ZpbmQoc3RydWN0IGF0aDEwayAqYXIsIGludCB2ZGV2X2lkLAogCQkJCSAgICAgY29uc3QgdTggKmFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMKaW5kZXggY2IxZjdiNS4uNGI3NzgyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jCkBAIC02MzksNiArNjM5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqd21pX3NrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJaW50IGxlbjsKKwl1MzIgYnVmX2xlbiA9IHNrYi0+bGVuOwogCXUxNiBmYzsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKQEAgLTY0OCw2ICs2NDksMTUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsZW4gPSBzaXplb2YoY21kLT5oZHIpICsgc2tiLT5sZW47CisKKwlpZiAoKGllZWU4MDIxMV9pc19hY3Rpb24oaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAgaWVlZTgwMjExX2lzX2RlYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpIHx8CisJICAgICBpZWVlODAyMTFfaXNfZGlzYXNzb2MoaGRyLT5mcmFtZV9jb250cm9sKSkgJiYKKwkgICAgIGllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJbGVuICs9IElFRUU4MDIxMV9DQ01QX01JQ19MRU47CisJCWJ1Zl9sZW4gKz0gSUVFRTgwMjExX0NDTVBfTUlDX0xFTjsKKwl9CisKIAlsZW4gPSByb3VuZF91cChsZW4sIDQpOwogCiAJd21pX3NrYiA9IGF0aDEwa193bWlfYWxsb2Nfc2tiKGxlbik7CkBAIC02NTksNyArNjY5LDcgQEAKIAljbWQtPmhkci52ZGV2X2lkID0gX19jcHVfdG9fbGUzMihBVEgxMEtfU0tCX0NCKHNrYiktPnZkZXZfaWQpOwogCWNtZC0+aGRyLnR4X3JhdGUgPSAwOwogCWNtZC0+aGRyLnR4X3Bvd2VyID0gMDsKLQljbWQtPmhkci5idWZfbGVuID0gX19jcHVfdG9fbGUzMigodTMyKShza2ItPmxlbikpOworCWNtZC0+aGRyLmJ1Zl9sZW4gPSBfX2NwdV90b19sZTMyKGJ1Zl9sZW4pOwogCiAJbWVtY3B5KGNtZC0+aGRyLnBlZXJfbWFjYWRkci5hZGRyLCBpZWVlODAyMTFfZ2V0X0RBKGhkciksIEVUSF9BTEVOKTsKIAltZW1jcHkoY21kLT5idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtOTU3LDEwICs5NjcsMTYgQEAKIAkgKiBmcmFtZXMgd2l0aCBQcm90ZWN0ZWQgQml0IHNldC4gKi8KIAlpZiAoaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICAhaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQgfCBSWF9GTEFHX0lWX1NUUklQUEVEIHwKLQkJCQlSWF9GTEFHX01NSUNfU1RSSVBQRUQ7Ci0JCWhkci0+ZnJhbWVfY29udHJvbCA9IF9fY3B1X3RvX2xlMTYoZmMgJgorCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CisKKwkJaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkJICAgICFpZWVlODAyMTFfaXNfZGVhdXRoKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkJICAgICFpZWVlODAyMTFfaXNfZGlzYXNzb2MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQgfAorCQkJCQlSWF9GTEFHX01NSUNfU1RSSVBQRUQ7CisJCQloZHItPmZyYW1lX2NvbnRyb2wgPSBfX2NwdV90b19sZTE2KGZjICYKIAkJCQkJfklFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7CisJCX0KIAl9CiAKIAlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUdNVCwKQEAgLTEzNjIsMTMgKzEzNzgsMTAgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqYmNuOwogCWludCByZXQsIHZkZXZfaWQgPSAwOwogCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX01HTVQsICJXTUlfSE9TVF9TV0JBX0VWRU5USURcbiIpOwotCiAJZXYgPSAoc3RydWN0IHdtaV9ob3N0X3N3YmFfZXZlbnQgKilza2ItPmRhdGE7CiAJbWFwID0gX19sZTMyX3RvX2NwdShldi0+dmRldl9tYXApOwogCi0JYXRoMTBrX2RiZyhBVEgxMEtfREJHX01HTVQsICJob3N0IHN3YmE6XG4iCi0JCSAgICItdmRldiBtYXAgMHgleFxuIiwKKwlhdGgxMGtfZGJnKEFUSDEwS19EQkdfTUdNVCwgIm1nbXQgc3diYSB2ZGV2X21hcCAweCV4XG4iLAogCQkgICBldi0+dmRldl9tYXApOwogCiAJZm9yICg7IG1hcDsgbWFwID4+PSAxLCB2ZGV2X2lkKyspIHsKQEAgLTEzODUsMTIgKzEzOTgsNyBAQAogCQliY25faW5mbyA9ICZldi0+YmNuX2luZm9baV07CiAKIAkJYXRoMTBrX2RiZyhBVEgxMEtfREJHX01HTVQsCi0JCQkgICAiLWJjbl9pbmZvWyVkXTpcbiIKLQkJCSAgICItLXRpbV9sZW4gJWRcbiIKLQkJCSAgICItLXRpbV9tY2FzdCAlZFxuIgotCQkJICAgIi0tdGltX2NoYW5nZWQgJWRcbiIKLQkJCSAgICItLXRpbV9udW1fcHNfcGVuZGluZyAlZFxuIgotCQkJICAgIi0tdGltX2JpdG1hcCAweCUwOHglMDh4JTA4eCUwOHhcbiIsCisJCQkgICAibWdtdCBldmVudCBiY25faW5mbyAlZCB0aW1fbGVuICVkIG1jYXN0ICVkIGNoYW5nZWQgJWQgbnVtX3BzX3BlbmRpbmcgJWQgYml0bWFwIDB4JTA4eCUwOHglMDh4JTA4eFxuIiwKIAkJCSAgIGksCiAJCQkgICBfX2xlMzJfdG9fY3B1KGJjbl9pbmZvLT50aW1faW5mby50aW1fbGVuKSwKIAkJCSAgIF9fbGUzMl90b19jcHUoYmNuX2luZm8tPnRpbV9pbmZvLnRpbV9tY2FzdCksCkBAIC0xNDM5LDYgKzE0NDcsNyBAQAogCQkJCQkgQVRIMTBLX1NLQl9DQihhcnZpZi0+YmVhY29uKS0+cGFkZHIsCiAJCQkJCSBhcnZpZi0+YmVhY29uLT5sZW4sIERNQV9UT19ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoYXJ2aWYtPmJlYWNvbik7CisJCQlhcnZpZi0+YmVhY29uID0gTlVMTDsKIAkJfQogCiAJCUFUSDEwS19TS0JfQ0IoYmNuKS0+cGFkZHIgPSBkbWFfbWFwX3NpbmdsZShhcnZpZi0+YXItPmRldiwKQEAgLTE0NDgsNiArMTQ1Nyw3IEBACiAJCQkJCUFUSDEwS19TS0JfQ0IoYmNuKS0+cGFkZHIpOwogCQlpZiAocmV0KSB7CiAJCQlhdGgxMGtfd2FybigiZmFpbGVkIHRvIG1hcCBiZWFjb246ICVkXG4iLCByZXQpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYmNuKTsKIAkJCWdvdG8gc2tpcDsKIAkJfQogCkBAIC0yMzY1LDcgKzIzNzUsNyBAQAogCWFyLT53bWkubnVtX21lbV9jaHVua3MgPSAwOwogfQogCi1pbnQgYXRoMTBrX3dtaV9jb25uZWN0X2h0Y19zZXJ2aWNlKHN0cnVjdCBhdGgxMGsgKmFyKQoraW50IGF0aDEwa193bWlfY29ubmVjdChzdHJ1Y3QgYXRoMTBrICphcikKIHsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBhdGgxMGtfaHRjX3N2Y19jb25uX3JlcSBjb25uX3JlcTsKQEAgLTIzOTMsOCArMjQwMyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGgxMGtfd21pX3BkZXZfc2V0X3JlZ2RvbWFpbihzdHJ1Y3QgYXRoMTBrICphciwgdTE2IHJkLCB1MTYgcmQyZywKLQkJCQkgIHUxNiByZDVnLCB1MTYgY3RsMmcsIHUxNiBjdGw1ZykKK3N0YXRpYyBpbnQgYXRoMTBrX3dtaV9tYWluX3BkZXZfc2V0X3JlZ2RvbWFpbihzdHJ1Y3QgYXRoMTBrICphciwgdTE2IHJkLAorCQkJCQkgICAgICB1MTYgcmQyZywgdTE2IHJkNWcsIHUxNiBjdGwyZywKKwkJCQkJICAgICAgdTE2IGN0bDVnKQogewogCXN0cnVjdCB3bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZCAqY21kOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yNDE4LDYgKzI0MjksNDYgQEAKIAkJCQkgICBhci0+d21pLmNtZC0+cGRldl9zZXRfcmVnZG9tYWluX2NtZGlkKTsKIH0KIAorc3RhdGljIGludCBhdGgxMGtfd21pXzEweF9wZGV2X3NldF9yZWdkb21haW4oc3RydWN0IGF0aDEwayAqYXIsIHUxNiByZCwKKwkJCQkJICAgICB1MTYgcmQyZywgdTE2IHJkNWcsCisJCQkJCSAgICAgdTE2IGN0bDJnLCB1MTYgY3RsNWcsCisJCQkJCSAgICAgZW51bSB3bWlfZGZzX3JlZ2lvbiBkZnNfcmVnKQoreworCXN0cnVjdCB3bWlfcGRldl9zZXRfcmVnZG9tYWluX2NtZF8xMHggKmNtZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYXRoMTBrX3dtaV9hbGxvY19za2Ioc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWQgPSAoc3RydWN0IHdtaV9wZGV2X3NldF9yZWdkb21haW5fY21kXzEweCAqKXNrYi0+ZGF0YTsKKwljbWQtPnJlZ19kb21haW4gPSBfX2NwdV90b19sZTMyKHJkKTsKKwljbWQtPnJlZ19kb21haW5fMkcgPSBfX2NwdV90b19sZTMyKHJkMmcpOworCWNtZC0+cmVnX2RvbWFpbl81RyA9IF9fY3B1X3RvX2xlMzIocmQ1Zyk7CisJY21kLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0XzJHID0gX19jcHVfdG9fbGUzMihjdGwyZyk7CisJY21kLT5jb25mb3JtYW5jZV90ZXN0X2xpbWl0XzVHID0gX19jcHVfdG9fbGUzMihjdGw1Zyk7CisJY21kLT5kZnNfZG9tYWluID0gX19jcHVfdG9fbGUzMihkZnNfcmVnKTsKKworCWF0aDEwa19kYmcoQVRIMTBLX0RCR19XTUksCisJCSAgICJ3bWkgcGRldiByZWdkb21haW4gcmQgJXggcmQyZyAleCByZDVnICV4IGN0bDJnICV4IGN0bDVnICV4IGRmc19yZWdpb24gJXhcbiIsCisJCSAgIHJkLCByZDJnLCByZDVnLCBjdGwyZywgY3RsNWcsIGRmc19yZWcpOworCisJcmV0dXJuIGF0aDEwa193bWlfY21kX3NlbmQoYXIsIHNrYiwKKwkJCQkgICBhci0+d21pLmNtZC0+cGRldl9zZXRfcmVnZG9tYWluX2NtZGlkKTsKK30KKworaW50IGF0aDEwa193bWlfcGRldl9zZXRfcmVnZG9tYWluKHN0cnVjdCBhdGgxMGsgKmFyLCB1MTYgcmQsIHUxNiByZDJnLAorCQkJCSAgdTE2IHJkNWcsIHUxNiBjdGwyZywgdTE2IGN0bDVnLAorCQkJCSAgZW51bSB3bWlfZGZzX3JlZ2lvbiBkZnNfcmVnKQoreworCWlmICh0ZXN0X2JpdChBVEgxMEtfRldfRkVBVFVSRV9XTUlfMTBYLCBhci0+ZndfZmVhdHVyZXMpKQorCQlyZXR1cm4gYXRoMTBrX3dtaV8xMHhfcGRldl9zZXRfcmVnZG9tYWluKGFyLCByZCwgcmQyZywgcmQ1ZywKKwkJCQkJCQljdGwyZywgY3RsNWcsIGRmc19yZWcpOworCWVsc2UKKwkJcmV0dXJuIGF0aDEwa193bWlfbWFpbl9wZGV2X3NldF9yZWdkb21haW4oYXIsIHJkLCByZDJnLCByZDVnLAorCQkJCQkJCSBjdGwyZywgY3RsNWcpOworfQorCiBpbnQgYXRoMTBrX3dtaV9wZGV2X3NldF9jaGFubmVsKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCWNvbnN0IHN0cnVjdCB3bWlfY2hhbm5lbF9hcmcgKmFyZykKIHsKQEAgLTM0NTYsOCArMzUwNyw5IEBACiAJCV9fY3B1X3RvX2xlMzIoYXJnLT5wZWVyX3ZodF9yYXRlcy50eF9tY3Nfc2V0KTsKIAogCWF0aDEwa19kYmcoQVRIMTBLX0RCR19XTUksCi0JCSAgICJ3bWkgcGVlciBhc3NvYyB2ZGV2ICVkIGFkZHIgJXBNXG4iLAotCQkgICBhcmctPnZkZXZfaWQsIGFyZy0+YWRkcik7CisJCSAgICJ3bWkgcGVlciBhc3NvYyB2ZGV2ICVkIGFkZHIgJXBNICglcylcbiIsCisJCSAgIGFyZy0+dmRldl9pZCwgYXJnLT5hZGRyLAorCQkgICBhcmctPnBlZXJfcmVhc3NvYyA/ICJyZWFzc29jaWF0ZSIgOiAibmV3Iik7CiAJcmV0dXJuIGF0aDEwa193bWlfY21kX3NlbmQoYXIsIHNrYiwgYXItPndtaS5jbWQtPnBlZXJfYXNzb2NfY21kaWQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuaAppbmRleCBmNTFkNWNhLi5lOTNkZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmgKQEAgLTE5OCwxNiArMTk4LDYgQEAKIAl9IF9fcGFja2VkOwogfSBfX3BhY2tlZDsKIAotLyogbWFjcm8gdG8gY29udmVydCBNQUMgYWRkcmVzcyBmcm9tIFdNSSB3b3JkIGZvcm1hdCB0byBjaGFyIGFycmF5ICovCi0jZGVmaW5lIFdNSV9NQUNfQUREUl9UT19DSEFSX0FSUkFZKHB3bWlfbWFjX2FkZHIsIGNfbWFjYWRkcikgZG8geyBcCi0JKGNfbWFjYWRkcilbMF0gPSAgKChwd21pX21hY19hZGRyKS0+d29yZDApICYgMHhmZjsgXAotCShjX21hY2FkZHIpWzFdID0gKCgocHdtaV9tYWNfYWRkciktPndvcmQwKSA+PiA4KSAmIDB4ZmY7IFwKLQkoY19tYWNhZGRyKVsyXSA9ICgoKHB3bWlfbWFjX2FkZHIpLT53b3JkMCkgPj4gMTYpICYgMHhmZjsgXAotCShjX21hY2FkZHIpWzNdID0gKCgocHdtaV9tYWNfYWRkciktPndvcmQwKSA+PiAyNCkgJiAweGZmOyBcCi0JKGNfbWFjYWRkcilbNF0gPSAgKChwd21pX21hY19hZGRyKS0+d29yZDEpICYgMHhmZjsgXAotCShjX21hY2FkZHIpWzVdID0gKCgocHdtaV9tYWNfYWRkciktPndvcmQxKSA+PiA4KSAmIDB4ZmY7IFwKLQl9IHdoaWxlICgwKQotCiBzdHJ1Y3Qgd21pX2NtZF9tYXAgewogCXUzMiBpbml0X2NtZGlkOwogCXUzMiBzdGFydF9zY2FuX2NtZGlkOwpAQCAtMjE4NSw2ICsyMTc1LDMxIEBACiAJX19sZTMyIGNvbmZvcm1hbmNlX3Rlc3RfbGltaXRfNUc7CiB9IF9fcGFja2VkOwogCitlbnVtIHdtaV9kZnNfcmVnaW9uIHsKKwkvKiBVbmluaXRpYWxpemVkIGRmcyBkb21haW4gKi8KKwlXTUlfVU5JTklUX0RGU19ET01BSU4gPSAwLAorCisJLyogRkNDMyBkZnMgZG9tYWluICovCisJV01JX0ZDQ19ERlNfRE9NQUlOID0gMSwKKworCS8qIEVUU0kgZGZzIGRvbWFpbiAqLworCVdNSV9FVFNJX0RGU19ET01BSU4gPSAyLAorCisJLypKYXBhbiBkZnMgZG9tYWluICovCisJV01JX01LSzRfREZTX0RPTUFJTiA9IDMsCit9OworCitzdHJ1Y3Qgd21pX3BkZXZfc2V0X3JlZ2RvbWFpbl9jbWRfMTB4IHsKKwlfX2xlMzIgcmVnX2RvbWFpbjsKKwlfX2xlMzIgcmVnX2RvbWFpbl8yRzsKKwlfX2xlMzIgcmVnX2RvbWFpbl81RzsKKwlfX2xlMzIgY29uZm9ybWFuY2VfdGVzdF9saW1pdF8yRzsKKwlfX2xlMzIgY29uZm9ybWFuY2VfdGVzdF9saW1pdF81RzsKKworCS8qIGRmcyBkb21haW4gZnJvbSB3bWlfZGZzX3JlZ2lvbiAqLworCV9fbGUzMiBkZnNfZG9tYWluOworfSBfX3BhY2tlZDsKKwogLyogQ29tbWFuZCB0byBzZXQvdW5zZXQgY2hpcCBpbiBxdWlldCBtb2RlICovCiBzdHJ1Y3Qgd21pX3BkZXZfc2V0X3F1aWV0X2NtZCB7CiAJLyogcGVyaW9kIGluIFRVcyAqLwpAQCAtMjIxMCw2ICsyMjI1LDE5IEBACiAJQVRIMTBLX1BST1RfUlRTQ1RTICAgPSAyLCAgICAvKiBSVFMtQ1RTICovCiB9OwogCitlbnVtIHdtaV9ydHNjdHNfcHJvZmlsZSB7CisJV01JX1JUU0NUU19GT1JfTk9fUkFURVNFUklFUyA9IDAsCisJV01JX1JUU0NUU19GT1JfU0VDT05EX1JBVEVTRVJJRVMsCisJV01JX1JUU0NUU19BQ1JPU1NfU1dfUkVUUklFUworfTsKKworI2RlZmluZSBXTUlfUlRTQ1RTX0VOQUJMRUQJCTEKKyNkZWZpbmUgV01JX1JUU0NUU19TRVRfTUFTSwkJMHgwZgorI2RlZmluZSBXTUlfUlRTQ1RTX1NFVF9MU0IJCTAKKworI2RlZmluZSBXTUlfUlRTQ1RTX1BST0ZJTEVfTUFTSwkJMHhmMAorI2RlZmluZSBXTUlfUlRTQ1RTX1BST0ZJTEVfTFNCCQk0CisKIGVudW0gd21pX2JlYWNvbl9nZW5fbW9kZSB7CiAJV01JX0JFQUNPTl9TVEFHR0VSRURfTU9ERSA9IDAsCiAJV01JX0JFQUNPTl9CVVJTVF9NT0RFID0gMQpAQCAtMjI5NSw5ICsyMzIzLDkgQEAKICNkZWZpbmUgV01JX1BERVZfUEFSQU1fVU5TVVBQT1JURUQgMAogCiBlbnVtIHdtaV9wZGV2X3BhcmFtIHsKLQkvKiBUWCBjaGlhbiBtYXNrICovCisJLyogVFggY2hhaW4gbWFzayAqLwogCVdNSV9QREVWX1BBUkFNX1RYX0NIQUlOX01BU0sgPSAweDEsCi0JLyogUlggY2hpYW4gbWFzayAqLworCS8qIFJYIGNoYWluIG1hc2sgKi8KIAlXTUlfUERFVl9QQVJBTV9SWF9DSEFJTl9NQVNLLAogCS8qIFRYIHBvd2VyIGxpbWl0IGZvciAyRyBSYWRpbyAqLwogCVdNSV9QREVWX1BBUkFNX1RYUE9XRVJfTElNSVQyRywKQEAgLTI2ODIsNiArMjcxMCw5IEBACiAJLyogd2FsIHBkZXYgcmVzZXRzICAqLwogCV9fbGUzMiBwZGV2X3Jlc2V0czsKIAorCS8qIGZyYW1lcyBkcm9wcGVkIGR1ZSB0byBub24tYXZhaWxhYmlsaXR5IG9mIHN0YXRlbGVzcyBUSURzICovCisJX19sZTMyIHN0YXRlbGVzc190aWRfYWxsb2NfZmFpbHVyZTsKKwogCV9fbGUzMiBwaHlfdW5kZXJydW47CiAKIAkvKiBNUERVIGlzIG1vcmUgdGhhbiB0eG9wIGxpbWl0ICovCkBAIC0yNzM4LDEzICsyNzY5LDIxIEBACiAJV01JX1JFUVVFU1RfQVBfU1RBVAk9IDB4MDIKIH07CiAKK3N0cnVjdCB3bGFuX2luc3RfcnNzaV9hcmdzIHsKKwlfX2xlMTYgY2ZnX3JldHJ5X2NvdW50OworCV9fbGUxNiByZXRyeV9jb3VudDsKK307CisKIHN0cnVjdCB3bWlfcmVxdWVzdF9zdGF0c19jbWQgewogCV9fbGUzMiBzdGF0c19pZDsKIAotCS8qCi0JICogU3BhY2UgdG8gYWRkIHBhcmFtZXRlcnMgbGlrZQotCSAqIHBlZXIgbWFjIGFkZHIKLQkgKi8KKwlfX2xlMzIgdmRldl9pZDsKKworCS8qIHBlZXIgTUFDIGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKworCS8qIEluc3RhbnRhbmVvdXMgUlNTSSBhcmd1bWVudHMgKi8KKwlzdHJ1Y3Qgd2xhbl9pbnN0X3Jzc2lfYXJncyBpbnN0X3Jzc2lfYXJnczsKIH0gX19wYWNrZWQ7CiAKIC8qIFN1c3BlbmQgb3B0aW9uICovCkBAIC0yNzk1LDcgKzI4MzQsNyBAQAogICogUERFViBzdGF0aXN0aWNzCiAgKiBUT0RPOiBhZGQgYWxsIFBERVYgc3RhdHMgaGVyZQogICovCi1zdHJ1Y3Qgd21pX3BkZXZfc3RhdHMgeworc3RydWN0IHdtaV9wZGV2X3N0YXRzX29sZCB7CiAJX19sZTMyIGNoYW5fbmY7ICAgICAgICAvKiBDaGFubmVsIG5vaXNlIGZsb29yICovCiAJX19sZTMyIHR4X2ZyYW1lX2NvdW50OyAvKiBUWCBmcmFtZSBjb3VudCAqLwogCV9fbGUzMiByeF9mcmFtZV9jb3VudDsgLyogUlggZnJhbWUgY291bnQgKi8KQEAgLTI4MDYsNiArMjg0NSwyMyBAQAogCXN0cnVjdCB3YWxfZGJnX3N0YXRzIHdhbDsgLyogV0FMIGRiZyBzdGF0cyAqLwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHdtaV9wZGV2X3N0YXRzXzEweCB7CisJX19sZTMyIGNoYW5fbmY7ICAgICAgICAvKiBDaGFubmVsIG5vaXNlIGZsb29yICovCisJX19sZTMyIHR4X2ZyYW1lX2NvdW50OyAvKiBUWCBmcmFtZSBjb3VudCAqLworCV9fbGUzMiByeF9mcmFtZV9jb3VudDsgLyogUlggZnJhbWUgY291bnQgKi8KKwlfX2xlMzIgcnhfY2xlYXJfY291bnQ7IC8qIHJ4IGNsZWFyIGNvdW50ICovCisJX19sZTMyIGN5Y2xlX2NvdW50OyAgICAvKiBjeWNsZSBjb3VudCAqLworCV9fbGUzMiBwaHlfZXJyX2NvdW50OyAgLyogUGh5IGVycm9yIGNvdW50ICovCisJX19sZTMyIGNoYW5fdHhfcHdyOyAgICAvKiBjaGFubmVsIHR4IHBvd2VyICovCisJc3RydWN0IHdhbF9kYmdfc3RhdHMgd2FsOyAvKiBXQUwgZGJnIHN0YXRzICovCisJX19sZTMyIGFja19yeF9iYWQ7CisJX19sZTMyIHJ0c19iYWQ7CisJX19sZTMyIHJ0c19nb29kOworCV9fbGUzMiBmY3NfYmFkOworCV9fbGUzMiBub19iZWFjb25zOworCV9fbGUzMiBtaWJfaW50X2NvdW50OworfSBfX3BhY2tlZDsKKwogLyoKICAqIFZERVYgc3RhdGlzdGljcwogICogVE9ETzogYWRkIGFsbCBWREVWIHN0YXRzIGhlcmUKQEAgLTI4MTgsMTIgKzI4NzQsMTkgQEAKICAqIHBlZXIgc3RhdGlzdGljcy4KICAqIFRPRE86IGFkZCBtb3JlIHN0YXRzCiAgKi8KLXN0cnVjdCB3bWlfcGVlcl9zdGF0cyB7CitzdHJ1Y3Qgd21pX3BlZXJfc3RhdHNfb2xkIHsKIAlzdHJ1Y3Qgd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKIAlfX2xlMzIgcGVlcl9yc3NpOwogCV9fbGUzMiBwZWVyX3R4X3JhdGU7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3Qgd21pX3BlZXJfc3RhdHNfMTB4IHsKKwlzdHJ1Y3Qgd21pX21hY19hZGRyIHBlZXJfbWFjYWRkcjsKKwlfX2xlMzIgcGVlcl9yc3NpOworCV9fbGUzMiBwZWVyX3R4X3JhdGU7CisJX19sZTMyIHBlZXJfcnhfcmF0ZTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCB3bWlfdmRldl9jcmVhdGVfY21kIHsKIAlfX2xlMzIgdmRldl9pZDsKIAlfX2xlMzIgdmRldl90eXBlOwpAQCAtNDE5NiwxMyArNDI1OSwxNCBAQAogaW50IGF0aDEwa193bWlfd2FpdF9mb3Jfc2VydmljZV9yZWFkeShzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3dtaV93YWl0X2Zvcl91bmlmaWVkX3JlYWR5KHN0cnVjdCBhdGgxMGsgKmFyKTsKIAotaW50IGF0aDEwa193bWlfY29ubmVjdF9odGNfc2VydmljZShzdHJ1Y3QgYXRoMTBrICphcik7CitpbnQgYXRoMTBrX3dtaV9jb25uZWN0KHN0cnVjdCBhdGgxMGsgKmFyKTsKIGludCBhdGgxMGtfd21pX3BkZXZfc2V0X2NoYW5uZWwoc3RydWN0IGF0aDEwayAqYXIsCiAJCQkJY29uc3Qgc3RydWN0IHdtaV9jaGFubmVsX2FyZyAqKTsKIGludCBhdGgxMGtfd21pX3BkZXZfc3VzcGVuZF90YXJnZXQoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBzdXNwZW5kX29wdCk7CiBpbnQgYXRoMTBrX3dtaV9wZGV2X3Jlc3VtZV90YXJnZXQoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa193bWlfcGRldl9zZXRfcmVnZG9tYWluKHN0cnVjdCBhdGgxMGsgKmFyLCB1MTYgcmQsIHUxNiByZDJnLAotCQkJCSAgdTE2IHJkNWcsIHUxNiBjdGwyZywgdTE2IGN0bDVnKTsKKwkJCQkgIHUxNiByZDVnLCB1MTYgY3RsMmcsIHUxNiBjdGw1ZywKKwkJCQkgIGVudW0gd21pX2Rmc19yZWdpb24gZGZzX3JlZyk7CiBpbnQgYXRoMTBrX3dtaV9wZGV2X3NldF9wYXJhbShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIGlkLCB1MzIgdmFsdWUpOwogaW50IGF0aDEwa193bWlfY21kX2luaXQoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa193bWlfc3RhcnRfc2NhbihzdHJ1Y3QgYXRoMTBrICphciwgY29uc3Qgc3RydWN0IHdtaV9zdGFydF9zY2FuX2FyZyAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYwppbmRleCAxYTI5NzNiLi4wZmNlMWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCkBAIC0zNzA5LDggKzM3MDksOCBAQAogCQkJQVI1S19SRUdfTVMoQVI1S19UVU5FX01BWF9UWFBPV0VSLCBBUjVLX1RQQ19DSElSUCksCiAJCQlBUjVLX1RQQyk7CiAJfSBlbHNlIHsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9UWFBPV0VSX1JBVEVfTUFYIHwKLQkJCUFSNUtfVFVORV9NQVhfVFhQT1dFUiwgQVI1S19QSFlfVFhQT1dFUl9SQVRFX01BWCk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19UVU5FX01BWF9UWFBPV0VSLAorCQkJQVI1S19QSFlfVFhQT1dFUl9SQVRFX01BWCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL0tjb25maWcKaW5kZXggZTM5ZTU4Ni4uOWMxMjVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvS2NvbmZpZwpAQCAtMSwxMSArMSwxOSBAQAogY29uZmlnIEFUSDZLTAogCXRyaXN0YXRlICJBdGhlcm9zIG1vYmlsZSBjaGlwc2V0cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ0ZHODAyMTEKKyAgICAgICAgLS0taGVscC0tLQorCSAgVGhpcyBtb2R1bGUgYWRkcyBjb3JlIHN1cHBvcnQgZm9yIHdpcmVsZXNzIGFkYXB0ZXJzIGJhc2VkIG9uCisJICBBdGhlcm9zIEFSNjAwMyBhbmQgQVI2MDA0IGNoaXBzZXRzLiBZb3Ugc3RpbGwgbmVlZCBzZXBhcmF0ZQorCSAgYnVzIGRyaXZlcnMgZm9yIFVTQiBhbmQgU0RJTyB0byBiZSBhYmxlIHRvIHVzZSByZWFsIGRldmljZXMuCisKKwkgIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgaXQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkCisJICBhdGg2a2xfY29yZS4gUGxlYXNlIG5vdGUgdGhhdCBBUjYwMDIgYW5kIEFSNjAwMSBhcmUgbm90CisJICBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCiAKIGNvbmZpZyBBVEg2S0xfU0RJTwogCXRyaXN0YXRlICJBdGhlcm9zIGF0aDZrbCBTRElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEg2S0wKIAlkZXBlbmRzIG9uIE1NQwotCWRlcGVuZHMgb24gQ0ZHODAyMTEKIAktLS1oZWxwLS0tCiAJICBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIHdpcmVsZXNzIGFkYXB0ZXJzIGJhc2VkIG9uCiAJICBBdGhlcm9zIEFSNjAwMyBhbmQgQVI2MDA0IGNoaXBzZXRzIHJ1bm5pbmcgb3ZlciBTRElPLiBJZiB5b3UKQEAgLTE3LDI1ICsyNSwzMSBAQAogCXRyaXN0YXRlICJBdGhlcm9zIGF0aDZrbCBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFUSDZLTAogCWRlcGVuZHMgb24gVVNCCi0JZGVwZW5kcyBvbiBDRkc4MDIxMQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3Igd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24KLQkgIEF0aGVyb3MgQVI2MDA0IGNoaXBzZXQgcnVubmluZyBvdmVyIFVTQi4gVGhpcyBpcyBzdGlsbCB1bmRlcgotCSAgaW1wbGVtZW50YXRpb24gYW5kIGl0IGlzbid0IGZ1bmN0aW9uYWwuIElmIHlvdSBjaG9vc2UgdG8KLQkgIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdGg2a2xfdXNiLgorCSAgQXRoZXJvcyBBUjYwMDQgY2hpcHNldCBhbmQgY2hpcHNldHMgYmFzZWQgb24gaXQgcnVubmluZyBvdmVyCisJICBVU0IuIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgaXQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUKKwkgIGNhbGxlZCBhdGg2a2xfdXNiLgogCiBjb25maWcgQVRINktMX0RFQlVHCiAJYm9vbCAiQXRoZXJvcyBhdGg2a2wgZGVidWdnaW5nIgogCWRlcGVuZHMgb24gQVRINktMCiAJLS0taGVscC0tLQotCSAgRW5hYmxlcyBkZWJ1ZyBzdXBwb3J0CisJICBFbmFibGVzIGF0aDZrbCBkZWJ1ZyBzdXBwb3J0LCBpbmNsdWRpbmcgZGVidWcgbWVzc2FnZXMKKwkgIGVuYWJsZWQgd2l0aCBkZWJ1Z19tYXNrIG1vZHVsZSBwYXJhbWV0ZXIgYW5kIGRlYnVnZnMKKwkgIGludGVyZmFjZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWSB0byBtYWtlIGl0IGVhc2llciB0byBkZWJ1ZyBwcm9ibGVtcy4KIAogY29uZmlnIEFUSDZLTF9UUkFDSU5HCiAJYm9vbCAiQXRoZXJvcyBhdGg2a2wgdHJhY2luZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVRINktMCiAJZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HCiAJLS0taGVscC0tLQotCSAgU2VsZWN0IHRoaXMgdG8gYXRoNmtsIHVzZSB0cmFjaW5nIGluZnJhc3RydWN0dXJlLgorCSAgU2VsZWN0IHRoaXMgdG8gYXRoNmtsIHVzZSB0cmFjaW5nIGluZnJhc3RydWN0dXJlIHdoaWNoLCBmb3IKKwkgIGV4YW1wbGUsIGNhbiBiZSBlbmFibGVkIHdpdGggaGVscCBvZiB0cmFjZS1jbWQuIEFsbCBkZWJ1ZworCSAgbWVzc2FnZXMgYW5kIGNvbW1hbmRzIGFyZSBkZWxpdmVyZWQgdG8gdXNpbmcgaW5kaXZpZHVhbGx5CisJICBlbmFibGFibGUgdHJhY2UgcG9pbnRzLgogCiAJICBJZiB1bnN1cmUsIHNheSBZIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlYnVnIHByb2JsZW1zLgogCkBAIC00NywzICs2MSw1IEBACiAJICBFbmFibGluZyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgcmVnZG9tYWluIGluCiAJICB0aGUgZmlybXdhcmUuIFRoaXMgY2FuIGJlIG9ubHkgZW5hYmxlZCBpZiByZWd1bGF0b3J5IHJlcXVpcmVtZW50cwogCSAgYXJlIHRha2VuIGludG8gYWNjb3VudC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwppbmRleCBjMmM2ZjQ2Li4wZTI2ZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCkBAIC03MjQsOCArNzI0LDkgQEAKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiYWRkZWQgYnNzICVwTSB0byBjZmc4MDIxMVxuIiwgYnNzaWQpOwogCQlrZnJlZShpZSk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiY2ZnODAyMTEgYWxyZWFkeSBoYXMgYSBic3NcbiIpOworCX0KIAogCXJldHVybiBic3M7CiB9CkBAIC05NzAsNyArOTcxLDYgQEAKIAkJCQkJICBzc2lkX2xpc3RbaV0uZmxhZywKIAkJCQkJICBzc2lkX2xpc3RbaV0uc3NpZC5zc2lkX2xlbiwKIAkJCQkJICBzc2lkX2xpc3RbaV0uc3NpZC5zc2lkKTsKLQogCX0KIAogCS8qIE1ha2Ugc3VyZSBubyBvbGQgZW50cmllcyBhcmUgbGVmdCBiZWhpbmQgKi8KQEAgLTE3NTksNyArMTc1OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKKwkJCSAgICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE4OTcsNyArMTg5Nyw2IEBACiAKIAkvKiBDb25maWd1cmUgdGhlIHBhdHRlcm5zIHRoYXQgd2UgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlci4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgd293LT5uX3BhdHRlcm5zOyBpKyspIHsKLQogCQkvKgogCQkgKiBDb252ZXJ0IGdpdmVuIG5sODAyMTEgc3BlY2lmaWMgbWFzayB2YWx1ZSB0byBlcXVpdmFsZW50CiAJCSAqIGRyaXZlciBzcGVjaWZpYyBtYXNrIHZhbHVlIGFuZCBzZW5kIGl0IHRvIHRoZSBjaGlwIGFsb25nCkBAIC0yODUwLDggKzI4NDksOSBAQAogCWlmIChwLnByd2lzZV9jcnlwdG9fdHlwZSA9PSAwKSB7CiAJCXAucHJ3aXNlX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKIAkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCAwLCB0cnVlKTsKLQl9IGVsc2UgaWYgKGluZm8tPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UgPT0gMSkKKwl9IGVsc2UgaWYgKGluZm8tPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UgPT0gMSkgewogCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIGluZm8tPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdLCB0cnVlKTsKKwl9CiAKIAlzd2l0Y2ggKGluZm8tPmNyeXB0by5jaXBoZXJfZ3JvdXApIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgpAQCAtMjg5Nyw3ICsyODk3LDYgQEAKIAl9CiAKIAlpZiAoaW5mby0+aW5hY3Rpdml0eV90aW1lb3V0KSB7Ci0KIAkJaW5hY3Rpdml0eV90aW1lb3V0ID0gaW5mby0+aW5hY3Rpdml0eV90aW1lb3V0OwogCiAJCWlmIChhci0+aHcuZmxhZ3MgJiBBVEg2S0xfSFdfQVBfSU5BQ1RJVklUWV9NSU5TKQpAQCAtMjk3NSw3ICsyOTc0LDcgQEAKIHN0YXRpYyBjb25zdCB1OCBiY2FzdF9hZGRyW0VUSF9BTEVOXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwogCiBzdGF0aWMgaW50IGF0aDZrbF9kZWxfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgdTggKm1hYykKKwkJCSAgICAgIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwogCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjk4Niw3ICsyOTg1LDggQEAKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2hhbmdlX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgdTggKm1hYywgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorCQkJCSBjb25zdCB1OCAqbWFjLAorCQkJCSBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwogCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuYwppbmRleCA0YjQ2YWRiLi5iMGI2NTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuYwpAQCAtNDUsOSArNDUsOSBAQAogbW9kdWxlX3BhcmFtKHJlY292ZXJ5X2VuYWJsZSwgdWludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oaGVhcnRfYmVhdF9wb2xsLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVjb3ZlcnlfZW5hYmxlLCAiRW5hYmxlIHJlY292ZXJ5IGZyb20gZmlybXdhcmUgZXJyb3IiKTsKLU1PRFVMRV9QQVJNX0RFU0MoaGVhcnRfYmVhdF9wb2xsLCAiRW5hYmxlIGZ3IGVycm9yIGRldGVjdGlvbiBwZXJpb2RpYyIgICBcCi0JCSAicG9sbGluZy4gVGhpcyBhbHNvIHNwZWNpZmllcyB0aGUgcG9sbGluZyBpbnRlcnZhbCBpbiIgIFwKLQkJICJtc2Vjcy4gU2V0IHJlb2N2ZXJ5X2VuYWJsZSBmb3IgdGhpcyB0byBiZSBlZmZlY3RpdmUiKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRfYmVhdF9wb2xsLAorCQkgIkVuYWJsZSBmdyBlcnJvciBkZXRlY3Rpb24gcGVyaW9kaWMgcG9sbGluZyBpbiBtc2VjcyAtIEFsc28gc2V0IHJlY292ZXJ5X2VuYWJsZSBmb3IgdGhpcyB0byBiZSBlZmZlY3RpdmUiKTsKKwogCiB2b2lkIGF0aDZrbF9jb3JlX3R4X2NvbXBsZXRlKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jCmluZGV4IGRiZmQxN2QuLjU1YzQwNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jCkBAIC0xNzIsNyArMTcyLDYgQEAKIAkJCSAgIHN0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzICppcnFfcHJvY19yZWcsCiAJCQkgICBzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnICppcnFfZW5hYmxlX3JlZykKIHsKLQogCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICgiPC0tLS0tLS0gUmVnaXN0ZXIgVGFibGUgLS0tLS0tLS0+XG4iKSk7CiAKIAlpZiAoaXJxX3Byb2NfcmVnICE9IE5VTEwpIHsKQEAgLTIxOSw3ICsyMTgsNiBAQAogCQkJCSAgICJHTUJPWCBsb29rYWhlYWQgYWxpYXMgMTogICAweCV4XG4iLAogCQkJCSAgIGlycV9wcm9jX3JlZy0+cnhfZ21ib3hfbGthaGRfYWxpYXNbMV0pOwogCQl9Ci0KIAl9CiAKIAlpZiAoaXJxX2VuYWJsZV9yZWcgIT0gTlVMTCkgewpAQCAtMTM5Niw3ICsxMzk0LDYgQEAKIAkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCiAJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAljaGFyIGJ1ZlsyMDBdOwpAQCAtMTU3NSw3ICsxNTcyLDYgQEAKIAkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0KIAlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCWNoYXIgYnVmWzEwMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmgKaW5kZXggY2E5YmEwMC4uZTE5NGMxMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmgKQEAgLTk3LDggKzk3LDggQEAKIAkJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgKmlycV9wcm9jX3JlZywKIAkJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyAqaXJxX2VuX3JlZykKIHsKLQogfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9jcmVkX2Rpc3Rfc3RhdHMoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCkKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5jCmluZGV4IGZlYTc3MDkuLjE4YzA3MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYwpAQCAtMzcsNyArMzcsNiBAQAogCWJ1ZiA9IHJlcS0+dmlydF9kbWFfYnVmOwogCiAJZm9yIChpID0gMDsgaSA8IHJlcS0+c2NhdF9lbnRyaWVzOyBpKyspIHsKLQogCQlpZiAoZnJvbV9kbWEpCiAJCQltZW1jcHkocmVxLT5zY2F0X2xpc3RbaV0uYnVmLCBidWYsCiAJCQkgICAgICAgcmVxLT5zY2F0X2xpc3RbaV0ubGVuKTsKQEAgLTExNiw3ICsxMTUsNiBAQAogCQkJICAgIGxlMzJfdG9fY3B1KHJlZ2R1bXBfdmFsW2kgKyAyXSksCiAJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaSArIDNdKSk7CiAJfQotCiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2hpZl9wcm9jX2RiZ19pbnRyKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCkBAIC03MDEsNSArNjk5LDQgQEAKIAogZmFpbF9zZXR1cDoKIAlyZXR1cm4gc3RhdHVzOwotCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaAppbmRleCA2MWY2YjIxLi5kYzZiZDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmgKQEAgLTE5Nyw5ICsxOTcsOSBAQAogCS8qIGJvdW5jZSBidWZmZXIgZm9yIHVwcGVyIGxheWVycyB0byBjb3B5IHRvL2Zyb20gKi8KIAl1OCAqdmlydF9kbWFfYnVmOwogCi0Jc3RydWN0IGhpZl9zY2F0dGVyX2l0ZW0gc2NhdF9saXN0WzFdOwotCiAJdTMyIHNjYXRfcV9kZXB0aDsKKworCXN0cnVjdCBoaWZfc2NhdHRlcl9pdGVtIHNjYXRfbGlzdFswXTsKIH07CiAKIHN0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX21ib3guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX21ib3guYwppbmRleCA2NWU1YjcxOTAuLmU0ODFmMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX21ib3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19tYm94LmMKQEAgLTExMiw5ICsxMTIsOSBAQAogCQlpZiAoY3VyX2VwX2Rpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCiAJCQljb250aW51ZTsKIAotCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpCisJCWlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykgewogCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIEZvciB0aGUgcmVtYWluaW5nIGRhdGEgZW5kcG9pbnRzLCB3ZSBhc3N1bWUgdGhhdAogCQkJICogZWFjaCBjcmVkX3Blcl9tc2cgYXJlIHRoZSBzYW1lLiBXZSB1c2UgYSBzaW1wbGUKQEAgLTEyOSw3ICsxMjksNiBAQAogCQkJY291bnQgPSAoY291bnQgKiAzKSA+PiAyOwogCQkJY291bnQgPSBtYXgoY291bnQsIGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2cpOwogCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGNvdW50OwotCiAJCX0KIAogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULApAQCAtNTQ5LDcgKzU0OCw2IEBACiAJCQkgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVpZCwgdW5zaWduZWQgaW50IGxlbiwKIAkJCSAgICAgaW50ICpyZXFfY3JlZCkKIHsKLQogCSpyZXFfY3JlZCA9IChsZW4gPiB0YXJnZXQtPnRndF9jcmVkX3N6KSA/CiAJCSAgICAgRElWX1JPVU5EX1VQKGxlbiwgdGFyZ2V0LT50Z3RfY3JlZF9zeikgOiAxOwogCkBAIC02MDgsNyArNjA2LDYgQEAKIAl1bnNpZ25lZCBpbnQgbGVuOwogCiAJd2hpbGUgKHRydWUpIHsKLQogCQlmbGFncyA9IDA7CiAKIAkJaWYgKGxpc3RfZW1wdHkoJmVuZHBvaW50LT50eHEpKQpAQCAtODg5LDcgKzg4Niw2IEBACiAJCWFjID0gdGFyZ2V0LT5kZXYtPmFyLT5lcDJhY19tYXBbZW5kcG9pbnQtPmVpZF07CiAKIAl3aGlsZSAodHJ1ZSkgewotCiAJCWlmIChsaXN0X2VtcHR5KCZlbmRwb2ludC0+dHhxKSkKIAkJCWJyZWFrOwogCkBAIC0xMTkwLDcgKzExODYsNiBAQAogCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZjb250YWluZXIpOwogCQlodGNfdHhfY29tcGxldGUoZW5kcG9pbnQsICZjb250YWluZXIpOwogCX0KLQogfQogCiBzdGF0aWMgdm9pZCBhdGg2a2xfaHRjX2ZsdXNoX3R4ZXBfYWxsKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpCkBAIC0xMzk0LDcgKzEzODksNiBAQAogCiAJZXBfY2IgPSBlcC0+ZXBfY2I7CiAJZm9yIChqID0gMDsgaiA8IG5fbXNnOyBqKyspIHsKLQogCQkvKgogCQkgKiBSZXNldCBmbGFnLCBhbnkgcGFja2V0cyBhbGxvY2F0ZWQgdXNpbmcgdGhlCiAJCSAqIHJ4X2FsbG9jKCkgQVBJIGNhbm5vdCBiZSByZWN5Y2xlZCBvbgpAQCAtMTQyNCw5ICsxNDE4LDkgQEAKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChsaXN0X2VtcHR5KCZlcC0+cnhfYnVmcSkpCisJCQlpZiAobGlzdF9lbXB0eSgmZXAtPnJ4X2J1ZnEpKSB7CiAJCQkJcGFja2V0ID0gTlVMTDsKLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQlwYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlcC0+cnhfYnVmcSwKIAkJCQkJCXN0cnVjdCBodGNfcGFja2V0LCBsaXN0KTsKIAkJCQlsaXN0X2RlbCgmcGFja2V0LT5saXN0KTsKQEAgLTE0ODcsNyArMTQ4MSw2IEBACiAJc3Bpbl9sb2NrX2JoKCZ0YXJnZXQtPnJ4X2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IG1zZzsgaSsrKSB7Ci0KIAkJaHRjX2hkciA9IChzdHJ1Y3QgaHRjX2ZyYW1lX2hkciAqKSZsa19haGRzW2ldOwogCiAJCWlmIChodGNfaGRyLT5laWQgPj0gRU5EUE9JTlRfTUFYKSB7CkBAIC0xNzA4LDcgKzE3MDEsNiBAQAogCQlsa19haGQgPSAoc3RydWN0IGh0Y19sb29rYWhlYWRfcmVwb3J0ICopIHJlY29yZF9idWY7CiAJCWlmICgobGtfYWhkLT5wcmVfdmFsaWQgPT0gKCh+bGtfYWhkLT5wb3N0X3ZhbGlkKSAmIDB4RkYpKSAmJgogCQkgICAgbmV4dF9sa19haGRzKSB7Ci0KIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCiAJCQkJICAgImh0YyByeCBsa19haGQgZm91bmQgcHJlX3ZhbGlkIDB4JXggcG9zdF92YWxpZCAweCV4XG4iLAogCQkJCSAgIGxrX2FoZC0+cHJlX3ZhbGlkLCBsa19haGQtPnBvc3RfdmFsaWQpOwpAQCAtMTc1NSw3ICsxNzQ3LDYgQEAKIAl9CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaW50IGh0Y19wcm9jX3RyYWlsZXIoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKQEAgLTE3NzYsNyArMTc2Nyw2IEBACiAJc3RhdHVzID0gMDsKIAogCXdoaWxlIChsZW4gPiAwKSB7Ci0KIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaHRjX3JlY29yZF9oZHIpKSB7CiAJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJYnJlYWs7CkBAIC0yMDk4LDcgKzIwODgsNiBAQAogCQl9CiAKIAkJaWYgKCFmZXRjaGVkX3BrdHMpIHsKLQogCQkJcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeShyeF9wa3RxLCBzdHJ1Y3QgaHRjX3BhY2tldCwKIAkJCQkJCSAgIGxpc3QpOwogCkBAIC0yMTczLDcgKzIxNjIsNiBAQAogCWxvb2tfYWhlYWRzWzBdID0gbXNnX2xvb2tfYWhlYWQ7CiAKIAl3aGlsZSAodHJ1ZSkgewotCiAJCS8qCiAJCSAqIEZpcnN0IGxvb2thaGVhZCBzZXRzIHRoZSBleHBlY3RlZCBlbmRwb2ludCBJRHMgZm9yIGFsbAogCQkgKiBwYWNrZXRzIGluIGEgYnVuZGxlLgpAQCAtMjgyNSw4ICsyODEzLDkgQEAKIAkJCXBhY2tldC0+YnVmID0gcGFja2V0LT5idWZfc3RhcnQ7CiAJCQlwYWNrZXQtPmVuZHBvaW50ID0gRU5EUE9JTlRfMDsKIAkJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRhcmdldC0+ZnJlZV9jdHJsX3J4YnVmKTsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CiAJCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZ0YXJnZXQtPmZyZWVfY3RybF90eGJ1Zik7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX3BpcGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX3BpcGUuYwppbmRleCA2N2FhOTI0Li43NTZmZTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19waXBlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfcGlwZS5jCkBAIC0xMzcsNyArMTM3LDYgQEAKIAkJCWNyZWRpdHNfcmVxdWlyZWQgPSAwOwogCiAJCX0gZWxzZSB7Ci0KIAkJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCBjcmVkaXRzX3JlcXVpcmVkKQogCQkJCWJyZWFrOwogCkBAIC0xNjksNyArMTY4LDYgQEAKIAkJLyogcXVldWUgdGhpcyBwYWNrZXQgaW50byB0aGUgY2FsbGVyJ3MgcXVldWUgKi8KIAkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCBxdWV1ZSk7CiAJfQotCiB9CiAKIHN0YXRpYyB2b2lkIGdldF9odGNfcGFja2V0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCkBAIC0yNzksNyArMjc3LDYgQEAKIAkJCWxpc3RfYWRkKCZwYWNrZXQtPmxpc3QsIHBrdF9xdWV1ZSk7CiAJCQlicmVhazsKIAkJfQotCiAJfQogCiAJaWYgKHN0YXR1cyAhPSAwKSB7CkBAIC0zODUsNyArMzgyLDYgQEAKIAkJCSAqLwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwKIAkJCQkJCSB0eHEsIGxpc3QpIHsKLQogCQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCiAJCQkJCSAgICIlczogSW5kaWNhdCBvdmVyZmxvd2VkIFRYIHBrdHM6ICVwXG4iLAogCQkJCQkgICBfX2Z1bmNfXywgcGFja2V0KTsKQEAgLTQwMyw3ICszOTksNiBAQAogCQkJCQlsaXN0X21vdmVfdGFpbCgmcGFja2V0LT5saXN0LAogCQkJCQkJICAgICAgICZzZW5kX3F1ZXVlKTsKIAkJCQl9Ci0KIAkJCX0KIAogCQkJaWYgKGxpc3RfZW1wdHkoJnNlbmRfcXVldWUpKSB7CkBAIC00NTQsNyArNDQ5LDYgQEAKIAkgKiBlbm91Z2ggdHJhbnNtaXQgcmVzb3VyY2VzLgogCSAqLwogCXdoaWxlICh0cnVlKSB7Ci0KIAkJaWYgKGdldF9xdWV1ZV9kZXB0aCgmZXAtPnR4cSkgPT0gMCkKIAkJCWJyZWFrOwogCkBAIC00OTUsOCArNDg5LDggQEAKIAkJfQogCiAJCXNwaW5fbG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKLQogCX0KKwogCS8qIGRvbmUgd2l0aCB0aGlzIGVuZHBvaW50LCB3ZSBjYW4gY2xlYXIgdGhlIGNvdW50ICovCiAJZXAtPnR4X3Byb2NfY250ID0gMDsKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKQEAgLTExMDYsNyArMTEwMCw2IEBACiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJcmV0dXJuIHN0YXR1czsKLQogfQogCiBzdGF0aWMgdm9pZCBodGNfZmx1c2hfcnhfcXVldWUoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKQEAgLTEyNTgsNyArMTI1MSw2IEBACiAJCXR4X2FsbG9jID0gMDsKIAogCX0gZWxzZSB7Ci0KIAkJdHhfYWxsb2MgPSBodGNfZ2V0X2NyZWRpdF9hbGxvYyh0YXJnZXQsIGNvbm5fcmVxLT5zdmNfaWQpOwogCQlpZiAodHhfYWxsb2MgPT0gMCkgewogCQkJc3RhdHVzID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9pbml0LmMKaW5kZXggNGYzMTZiZC4uZDVlZjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9pbml0LmMKQEAgLTExOTIsNyArMTE5Miw2IEBACiAKIAlpZiAoYm9hcmRfZXh0X2FkZHJlc3MgJiYKIAkgICAgYXItPmZ3X2JvYXJkX2xlbiA9PSAoYm9hcmRfZGF0YV9zaXplICsgYm9hcmRfZXh0X2RhdGFfc2l6ZSkpIHsKLQogCQkvKiB3cml0ZSBleHRlbmRlZCBib2FyZCBkYXRhICovCiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAogCQkJICAgIndyaXRpbmcgZXh0ZW5kZWQgYm9hcmQgZGF0YSB0byAweCV4ICglZCBCKVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKaW5kZXggNTgzOWZjMi4uZDU2NTU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKQEAgLTU3MSw3ICs1NzEsNiBAQAogCiBzdGF0aWMgaW50IGF0aDZrbF9jb21taXRfY2hfc3dpdGNoKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUxNiBjaGFubmVsKQogewotCiAJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJdmlmLT5wcm9maWxlLmNoID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CkBAIC02MDAsNyArNTk5LDYgQEAKIAogc3RhdGljIHZvaWQgYXRoNmtsX2NoZWNrX2NoX3N3aXRjaChzdHJ1Y3QgYXRoNmtsICphciwgdTE2IGNoYW5uZWwpCiB7Ci0KIAlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCWludCByZXMgPSAwOwogCkBAIC02OTIsOSArNjkwLDkgQEAKIAkJY2ZnODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZSh2aWYtPm5kZXYsIHN0YS0+bWFjLAogCQkJCQkgICAgIE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSwga2V5aWQsCiAJCQkJCSAgICAgdHNjLCBHRlBfS0VSTkVMKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQodmlmLCBrZXlpZCwgaXNtY2FzdCk7Ci0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDZrbF91cGRhdGVfdGFyZ2V0X3N0YXRzKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4ICpwdHIsIHUzMiBsZW4pCkBAIC0xMDkzLDggKzEwOTEsOSBAQAogCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTE0Niw3ICsxMTQ1LDYgQEAKIAkJCWRldi0+ZmVhdHVyZXMgPSBmZWF0dXJlcyB8IE5FVElGX0ZfUlhDU1VNOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCiAJfQogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKaW5kZXggNzEyNmJkZC4uMzM5ZDg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCWludCBpLCBzY2F0X3JlcV9zeiwgc2NhdF9saXN0X3N6LCBzaXplOwogCXU4ICp2aXJ0X2J1ZjsKIAotCXNjYXRfbGlzdF9zeiA9IChuX3NjYXRfZW50cnkgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaGlmX3NjYXR0ZXJfaXRlbSk7CisJc2NhdF9saXN0X3N6ID0gbl9zY2F0X2VudHJ5ICogc2l6ZW9mKHN0cnVjdCBoaWZfc2NhdHRlcl9pdGVtKTsKIAlzY2F0X3JlcV9zeiA9IHNpemVvZigqc19yZXEpICsgc2NhdF9saXN0X3N6OwogCiAJaWYgKCF2aXJ0X3NjYXQpCkBAIC00MjUsOCArNDI1LDkgQEAKIAkJCW1lbWNweSh0YnVmLCBidWYsIGxlbik7CiAKIAkJYm91bmNlZCA9IHRydWU7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJdGJ1ZiA9IGJ1ZjsKKwl9CiAKIAlyZXQgPSBhdGg2a2xfc2Rpb19pbyhhcl9zZGlvLT5mdW5jLCByZXF1ZXN0LCBhZGRyLCB0YnVmLCBsZW4pOwogCWlmICgocmVxdWVzdCAmIEhJRl9SRUFEKSAmJiBib3VuY2VkKQpAQCAtNDQxLDkgKzQ0Miw5IEBACiBzdGF0aWMgdm9pZCBfX2F0aDZrbF9zZGlvX3dyaXRlX2FzeW5jKHN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbywKIAkJCQkgICAgICBzdHJ1Y3QgYnVzX3JlcXVlc3QgKnJlcSkKIHsKLQlpZiAocmVxLT5zY2F0X3JlcSkKKwlpZiAocmVxLT5zY2F0X3JlcSkgewogCQlhdGg2a2xfc2Rpb19zY2F0X3J3KGFyX3NkaW8sIHJlcSk7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJdm9pZCAqY29udGV4dDsKIAkJaW50IHN0YXR1czsKIApAQCAtNjU2LDcgKzY1Nyw2IEBACiAJbGlzdF9hZGRfdGFpbCgmc19yZXEtPmxpc3QsICZhcl9zZGlvLT5zY2F0X3JlcSk7CiAKIAlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKLQogfQogCiAvKiBzY2F0dGVyIGdhdGhlciByZWFkIHdyaXRlIHJlcXVlc3QgKi8KQEAgLTY3NCw5ICs2NzQsOSBAQAogCQkgICAiaGlmLXNjYXR0ZXI6IHRvdGFsIGxlbjogJWQgc2NhdHRlciBlbnRyaWVzOiAlZFxuIiwKIAkJICAgc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKLQlpZiAocmVxdWVzdCAmIEhJRl9TWU5DSFJPTk9VUykKKwlpZiAocmVxdWVzdCAmIEhJRl9TWU5DSFJPTk9VUykgewogCQlzdGF0dXMgPSBhdGg2a2xfc2Rpb19zY2F0X3J3KGFyX3NkaW8sIHNjYXRfcmVxLT5idXNyZXF1ZXN0KTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlsaXN0X2FkZF90YWlsKCZzY2F0X3JlcS0+YnVzcmVxdWVzdC0+bGlzdCwgJmFyX3NkaW8tPndyX2FzeW5jcSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKQEAgLTg1Niw3ICs4NTYsNiBAQAogCiAJaWYgKGFyLT5zdXNwZW5kX21vZGUgPT0gV0xBTl9QT1dFUl9TVEFURV9XT1cgfHwKIAkgICAgKCFhci0+c3VzcGVuZF9tb2RlICYmIHdvdykpIHsKLQogCQlyZXQgPSBhdGg2a2xfc2V0X3NkaW9fcG1fY2Fwcyhhcik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGN1dF9wd3I7CkBAIC04NzgsNyArODc3LDYgQEAKIAogCWlmIChhci0+c3VzcGVuZF9tb2RlID09IFdMQU5fUE9XRVJfU1RBVEVfREVFUF9TTEVFUCB8fAogCSAgICAhYXItPnN1c3BlbmRfbW9kZSB8fCB0cnlfZGVlcHNsZWVwKSB7Ci0KIAkJZmxhZ3MgPSBzZGlvX2dldF9ob3N0X3BtX2NhcHMoZnVuYyk7CiAJCWlmICghKGZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKQogCQkJZ290byBjdXRfcHdyOwpAQCAtMTA2MSw3ICsxMDU5LDYgQEAKIAogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCTUlfQ09NTVVOSUNBVElPTl9USU1FT1VUKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIWFyLT5ibWkuY21kX2NyZWRpdHMpIHsKLQogCQkvKgogCQkgKiBIaXQgdGhlIGNyZWRpdCBjb3VudGVyIHdpdGggYSA0LWJ5dGUgYWNjZXNzLCB0aGUgZmlyc3QgYnl0ZQogCQkgKiByZWFkIHdpbGwgaGl0IHRoZSBjb3VudGVyIGFuZCBjYXVzZSBhIGRlY3JlbWVudCwgd2hpbGUgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90YXJnZXQuaAppbmRleCBhNTgwYTYyLi5kNWVlZWFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90YXJnZXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oCkBAIC0yODksNyArMjg5LDcgQEAKIAl1MzIgaGlfaHBfcnhfdHJhZmZpY19yYXRpbzsgICAgICAgICAgICAgICAgICAgIC8qIDB4ZDggKi8KIAogCS8qIHRlc3QgYXBwbGljYXRpb25zIGZsYWdzICovCi0JdTMyIGhpX3Rlc3RfYXBwc19yZWxhdGVkICAgIDsgICAgICAgICAgICAgICAgICAvKiAweGRjICovCisJdTMyIGhpX3Rlc3RfYXBwc19yZWxhdGVkOyAgICAgICAgICAgICAgICAgICAgICAvKiAweGRjICovCiAJLyogbG9jYXRpb24gb2YgdGVzdCBzY3JpcHQgKi8KIAl1MzIgaGlfb3RhX3Rlc3RzY3JpcHQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4ZTAgKi8KIAkvKiBsb2NhdGlvbiBvZiBDQUwgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYwppbmRleCBlYmIyNDA0Li40MDQzMmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYwpAQCAtMTI1LDggKzEyNSw5IEBACiAJCSpmbGFncyB8PSBXTUlfREFUQV9IRFJfRkxBR1NfVUFQU0Q7CiAJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CiAJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKCFjb25uLT5hcHNkX2luZm8pCisJfSBlbHNlIGlmICghY29ubi0+YXBzZF9pbmZvKSB7CiAJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlpZiAodGVzdF9iaXQoV01NX0VOQUJMRUQsICZ2aWYtPmZsYWdzKSkgewogCQlldGhlcl90eXBlID0gYmUxNl90b19jcHUoZGF0YXAtPmhfcHJvdG8pOwpAQCAtMzE2LDggKzMxNyw5IEBACiAJCWNvb2tpZSA9IE5VTEw7CiAJCWF0aDZrbF9lcnIoIndtaSBjdHJsIGVwIGZ1bGwsIGRyb3BwaW5nIHBrdCA6IDB4JXAsIGxlbjolZFxuIiwKIAkJCSAgIHNrYiwgc2tiLT5sZW4pOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWNvb2tpZSA9IGF0aDZrbF9hbGxvY19jb29raWUoYXIpOworCX0KIAogCWlmIChjb29raWUgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOwpAQCAtMzU5LDcgKzM2MSw3IEBACiAJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIG1hcF9ubyA9IDA7CiAJdTE2IGh0Y190YWcgPSBBVEg2S0xfREFUQV9QS1RfVEFHOwotCXU4IGFjID0gOTkgOyAvKiBpbml0aWFsaXplIHRvIHVubWFwcGVkIGFjICovCisJdTggYWMgPSA5OTsgLyogaW5pdGlhbGl6ZSB0byB1bm1hcHBlZCBhYyAqLwogCWJvb2wgY2hrX2FkaG9jX3BzX21hcHBpbmcgPSBmYWxzZTsKIAlpbnQgcmV0OwogCXN0cnVjdCB3bWlfdHhfbWV0YV92MiBtZXRhX3YyOwpAQCAtNDQ5LDggKzQ1MSw5IEBACiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZmFpbF90eDsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWdvdG8gZmFpbF90eDsKKwl9CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5sb2NrKTsKIApAQCAtNzAyLDcgKzcwNSw2IEBACiAKIAkvKiByZWFwIGNvbXBsZXRlZCBwYWNrZXRzICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KHBhY2tldF9xdWV1ZSkpIHsKLQogCQlwYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KHBhY2tldF9xdWV1ZSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCSAgbGlzdCk7CiAJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwpAQCAtMTA4OSw4ICsxMDkxLDkgQEAKIAkJCWVsc2UKIAkJCQlza2JfcXVldWVfdGFpbCgmcnh0aWQtPnEsIG5vZGUtPnNrYik7CiAJCQlub2RlLT5za2IgPSBOVUxMOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXN0YXRzLT5udW1faG9sZSsrOworCQl9CiAKIAkJcnh0aWQtPnNlcV9uZXh0ID0gQVRINktMX05FWFRfU0VRX05PKHJ4dGlkLT5zZXFfbmV4dCk7CiAJCWlkeCA9IEFHR1JfV0lOX0lEWChyeHRpZC0+c2VxX25leHQsIHJ4dGlkLT5ob2xkX3Ffc3opOwpAQCAtMTIxMSw3ICsxMjE0LDcgQEAKIAkJcmV0dXJuIGlzX3F1ZXVlZDsKIAogCXNwaW5fbG9ja19iaCgmcnh0aWQtPmxvY2spOwotCWZvciAoaWR4ID0gMCA7IGlkeCA8IHJ4dGlkLT5ob2xkX3Ffc3o7IGlkeCsrKSB7CisJZm9yIChpZHggPSAwOyBpZHggPCByeHRpZC0+aG9sZF9xX3N6OyBpZHgrKykgewogCQlpZiAocnh0aWQtPmhvbGRfcVtpZHhdLnNrYikgewogCQkJLyoKIAkJCSAqIFRoZXJlIGlzIGEgZnJhbWUgaW4gdGhlIHF1ZXVlIGFuZCBubwpAQCAtMTI2NSw3ICsxMjY4LDYgQEAKIAlpc19hcHNkcV9lbXB0eV9hdF9zdGFydCA9IGlzX2Fwc2RxX2VtcHR5OwogCiAJd2hpbGUgKCghaXNfYXBzZHFfZW1wdHkpICYmIChudW1fZnJhbWVzX3RvX2RlbGl2ZXIpKSB7Ci0KIAkJc3Bpbl9sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5hcHNkcSk7CiAJCWlzX2Fwc2RxX2VtcHR5ID0gc2tiX3F1ZXVlX2VtcHR5KCZjb25uLT5hcHNkcSk7CkBAIC0xNjA2LDE2ICsxNjA4LDE4IEBACiAJCQlpZiAoIWNvbm4pCiAJCQkJcmV0dXJuOwogCQkJYWdncl9jb25uID0gY29ubi0+YWdncl9jb25uOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCWFnZ3JfY29ubiA9IHZpZi0+YWdncl9jbnR4dC0+YWdncl9jb25uOworCQl9CiAKIAkJaWYgKGFnZ3JfcHJvY2Vzc19yZWN2X2ZybShhZ2dyX2Nvbm4sIHRpZCwgc2VxX25vLAogCQkJCQkgIGlzX2Ftc2R1LCBza2IpKSB7CiAJCQkvKiBhZ2dyZWdhdGlvbiBjb2RlIHdpbGwgaGFuZGxlIHRoZSBza2IgKi8KIAkJCXJldHVybjsKIAkJfQotCX0gZWxzZSBpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRhdGFwLT5oX2Rlc3QpKQorCX0gZWxzZSBpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRhdGFwLT5oX2Rlc3QpKSB7CiAJCXZpZi0+bmV0X3N0YXRzLm11bHRpY2FzdCsrOworCX0KIAogCWF0aDZrbF9kZWxpdmVyX2ZyYW1lc190b19ud19zdGFjayh2aWYtPm5kZXYsIHNrYik7CiB9CkBAIC0xNzEwLDggKzE3MTQsOSBAQAogCQlzdGEgPSBhdGg2a2xfZmluZF9zdGFfYnlfYWlkKHZpZi0+YXIsIGFpZCk7CiAJCWlmIChzdGEpCiAJCQlhZ2dyX2Nvbm4gPSBzdGEtPmFnZ3JfY29ubjsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlhZ2dyX2Nvbm4gPSB2aWYtPmFnZ3JfY250eHQtPmFnZ3JfY29ubjsKKwl9CiAKIAlpZiAoIWFnZ3JfY29ubikKIAkJcmV0dXJuOwpAQCAtMTc2Niw3ICsxNzcxLDYgQEAKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcnh0aWQtPnEpOwogCQlzcGluX2xvY2tfaW5pdCgmcnh0aWQtPmxvY2spOwogCX0KLQogfQogCiBzdHJ1Y3QgYWdncl9pbmZvICphZ2dyX2luaXQoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKQEAgLTE4MDYsOCArMTgxMCw5IEBACiAJCXN0YSA9IGF0aDZrbF9maW5kX3N0YV9ieV9haWQodmlmLT5hciwgYWlkKTsKIAkJaWYgKHN0YSkKIAkJCWFnZ3JfY29ubiA9IHN0YS0+YWdncl9jb25uOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWFnZ3JfY29ubiA9IHZpZi0+YWdncl9jbnR4dC0+YWdncl9jb25uOworCX0KIAogCWlmICghYWdncl9jb25uKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC91c2IuYwppbmRleCA1NmMzZmQ1Li4zYWZjNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdXNiLmMKQEAgLTIzNiw3ICsyMzYsNiBAQAogCQkJYnJlYWs7CiAJCWtmcmVlKHVyYl9jb250ZXh0KTsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3VzYl9jbGVhbnVwX3BpcGVfcmVzb3VyY2VzKHN0cnVjdCBhdGg2a2xfdXNiICphcl91c2IpCkBAIC0yNDUsNyArMjQ0LDYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBBVEg2S0xfVVNCX1BJUEVfTUFYOyBpKyspCiAJCWF0aDZrbF91c2JfZnJlZV9waXBlX3Jlc291cmNlcygmYXJfdXNiLT5waXBlc1tpXSk7Ci0KIH0KIAogc3RhdGljIHU4IGF0aDZrbF91c2JfZ2V0X2xvZ2ljYWxfcGlwZV9udW0oc3RydWN0IGF0aDZrbF91c2IgKmFyX3VzYiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCmluZGV4IDhiNGNlMjguLjRkN2Y5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYwpAQCAtMjg5LDggKzI4OSw5IEBACiAJCQkgICBhdGg2a2xfd21pX2RldGVybWluZV91c2VyX3ByaW9yaXR5KCgodTggKikgbGxjX2hkcikgKwogCQkJCQlzaXplb2Yoc3RydWN0IGF0aDZrbF9sbGNfc25hcF9oZHIpLAogCQkJCQlsYXllcjJfcHJpb3JpdHkpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXVzcl9wcmkgPSBsYXllcjJfcHJpb3JpdHkgJiAweDc7CisJCX0KIAogCQkvKgogCQkgKiBRdWV1ZSB0aGUgRUFQT0wgZnJhbWVzIGluIHRoZSBzYW1lIFdNTV9BQ19WTyBxdWV1ZQpAQCAtMzU5LDggKzM2MCw5IEBACiAJCWhkcl9zaXplID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSwKIAkJCQkgICBzaXplb2YodTMyKSk7CiAJCXNrYl9wdWxsKHNrYiwgaGRyX3NpemUpOwotCX0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RBVEEpKQorCX0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RBVEEpKSB7CiAJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJfQogCiAJZGF0YXAgPSBza2ItPmRhdGE7CiAJbGxjX2hkciA9IChzdHJ1Y3QgYXRoNmtsX2xsY19zbmFwX2hkciAqKShkYXRhcCk7CkBAIC05MzYsNyArOTM4LDYgQEAKIAogc3RhdGljIHZvaWQgYXRoNmtsX3dtaV9yZWdkb21haW5fZXZlbnQoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCiB7Ci0KIAlzdHJ1Y3QgYXRoNmtsX3dtaV9yZWdkb21haW4gKmV2OwogCXN0cnVjdCBjb3VudHJ5X2NvZGVfdG9fZW51bV9yZCAqY291bnRyeSA9IE5VTEw7CiAJc3RydWN0IHJlZ19kbW5fcGFpcl9tYXBwaW5nICpyZWdwYWlyID0gTlVMTDsKQEAgLTk0NiwxMCArOTQ3LDkgQEAKIAlldiA9IChzdHJ1Y3QgYXRoNmtsX3dtaV9yZWdkb21haW4gKikgZGF0YXA7CiAJcmVnX2NvZGUgPSBsZTMyX3RvX2NwdShldi0+cmVnX2NvZGUpOwogCi0JaWYgKChyZWdfY29kZSA+PiBBVEg2S0xfQ09VTlRSWV9SRF9TSElGVCkgJiBDT1VOVFJZX0VSRF9GTEFHKQorCWlmICgocmVnX2NvZGUgPj4gQVRINktMX0NPVU5UUllfUkRfU0hJRlQpICYgQ09VTlRSWV9FUkRfRkxBRykgewogCQljb3VudHJ5ID0gYXRoNmtsX3JlZ2RfZmluZF9jb3VudHJ5KCh1MTYpIHJlZ19jb2RlKTsKLQllbHNlIGlmICghKCgodTE2KSByZWdfY29kZSAmIFdPUkxEX1NLVV9NQVNLKSA9PSBXT1JMRF9TS1VfUFJFRklYKSkgewotCisJfSBlbHNlIGlmICghKCgodTE2KSByZWdfY29kZSAmIFdPUkxEX1NLVV9NQVNLKSA9PSBXT1JMRF9TS1VfUFJFRklYKSkgewogCQlyZWdwYWlyID0gYXRoNmtsX2dldF9yZWdwYWlyKCh1MTYpIHJlZ19jb2RlKTsKIAkJY291bnRyeSA9IGF0aDZrbF9yZWdkX2ZpbmRfY291bnRyeV9ieV9yZCgodTE2KSByZWdfY29kZSk7CiAJCWlmIChyZWdwYWlyKQpAQCAtMTQ5OSw3ICsxNDk5LDYgQEAKIAogCWlmICgocmVwbHktPmNhY19pbmRpY2F0aW9uID09IENBQ19JTkRJQ0FUSU9OX0FETUlTU0lPTl9SRVNQKSAmJgogCSAgICAocmVwbHktPnN0YXR1c19jb2RlICE9IElFRUU4MDIxMV9UU1BFQ19TVEFUVVNfQURNSVNTX0FDQ0VQVEVEKSkgewotCiAJCXRzID0gKHN0cnVjdCBpZWVlODAyMTFfdHNwZWNfaWUgKikgJihyZXBseS0+dHNwZWNfc3VnZ2VzdGlvbik7CiAJCXRzaW5mbyA9IGxlMTZfdG9fY3B1KHRzLT50c2luZm8pOwogCQl0c2lkID0gKHRzaW5mbyA+PiBJRUVFODAyMTFfV01NX0lFX1RTUEVDX1RJRF9TSElGVCkgJgpAQCAtMTUzMCw3ICsxNTI5LDYgQEAKIAkgKiBmb3IgZGVsZXRlIHFvcyBzdHJlYW0gZnJvbSBBUAogCSAqLwogCWVsc2UgaWYgKHJlcGx5LT5jYWNfaW5kaWNhdGlvbiA9PSBDQUNfSU5ESUNBVElPTl9ERUxFVEUpIHsKLQogCQl0cyA9IChzdHJ1Y3QgaWVlZTgwMjExX3RzcGVjX2llICopICYocmVwbHktPnRzcGVjX3N1Z2dlc3Rpb24pOwogCQl0c2luZm8gPSBsZTE2X3RvX2NwdSh0cy0+dHNpbmZvKTsKIAkJdHNfaWQgPSAoKHRzaW5mbyA+PiBJRUVFODAyMTFfV01NX0lFX1RTUEVDX1RJRF9TSElGVCkgJgpAQCAtMjMyMiw3ICsyMzIwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggKmtyaykKK2ludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBjb25zdCB1OCAqa3JrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9hZGRfa3JrX2NtZCAqY21kOwpAQCAtMjQ3OSw3ICsyNDc3LDYgQEAKIAkJZ290byBmcmVlX2RhdGFfc2tiOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtX3ByaV9zdHJlYW1zOyBpbmRleCsrKSB7Ci0KIAkJaWYgKFdBUk5fT04oIWRhdGFfc3luY19idWZzW2luZGV4XS5za2IpKQogCQkJZ290byBmcmVlX2RhdGFfc2tiOwogCkBAIC0yNzA0LDcgKzI3MDEsNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IFdNTV9OVU1fQUM7IGkrKykgewogCQlpZiAoc3RyZWFtX2V4aXN0ICYgKDEgPDwgaSkpIHsKLQogCQkJLyoKIAkJCSAqIEZJWE1FOiBJcyB0aGlzIGxvY2sgJiB1bmxvY2sgaW5zaWRlCiAJCQkgKiBmb3IgbG9vcCBjb3JyZWN0PyBtYXkgbmVlZCByZXdvcmsuCkBAIC0yODcwLDggKzI4NjYsOSBAQAogCWlmIChob3N0X21vZGUgPT0gQVRINktMX0hPU1RfTU9ERV9BU0xFRVApIHsKIAkJYXRoNmtsX3dtaV9yZWxpbnF1aXNoX2ltcGxpY2l0X3BzdHJlYW1fY3JlZGl0cyh3bWkpOwogCQljbWQtPmFzbGVlcCA9IGNwdV90b19sZTMyKDEpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWNtZC0+YXdha2UgPSBjcHVfdG9fbGUzMigxKTsKKwl9CiAKIAlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsCiAJCQkJICBXTUlfU0VUX0hPU1RfU0xFRVBfTU9ERV9DTURJRCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5oCmluZGV4IDVjNzAyYWUuLmJiMjNmYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaApAQCAtODk4LDcgKzg5OCw2IEBACiAgKiAgZmxhZ3MgaGVyZQogICovCiBlbnVtIHdtaV9zY2FuX2N0cmxfZmxhZ3NfYml0cyB7Ci0KIAkvKiBzZXQgaWYgY2FuIHNjYW4gaW4gdGhlIGNvbm5lY3QgY21kICovCiAJQ09OTkVDVF9TQ0FOX0NUUkxfRkxBR1MgPSAweDAxLAogCkBAIC0yNjE3LDcgKzI2MTYsNyBAQAogCQkJICB1OCAqa2V5X21hdGVyaWFsLAogCQkJICB1OCBrZXlfb3BfY3RybCwgdTggKm1hY19hZGRyLAogCQkJICBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKTsKLWludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqa3JrKTsKK2ludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBjb25zdCB1OCAqa3JrKTsKIGludCBhdGg2a2xfd21pX2RlbGV0ZWtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCk7CiBpbnQgYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgICBjb25zdCB1OCAqcG1raWQsIGJvb2wgc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQppbmRleCA4ZTFjN2IwLi44ZmNkNTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCkBAIC01Myw3ICs1Myw4IEBACiBvYmotJChDT05GSUdfQVRIOUtfQ09NTU9OKSArPSBhdGg5a19jb21tb24ubwogYXRoOWtfY29tbW9uLXk6PQljb21tb24ubyBcCiAJCQljb21tb24taW5pdC5vIFwKLQkJCWNvbW1vbi1iZWFjb24ubworCQkJY29tbW9uLWJlYWNvbi5vIFwKKwkJCWNvbW1vbi1kZWJ1Zy5vCiAKIGF0aDlrX2h0Yy15ICs9CWh0Y19oc3QubyBcCiAJCWhpZl91c2IubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzXzJwMl9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDJfaW5pdHZhbHMuaAppbmRleCAwYTYxNjNlLi5jMzgzOTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzXzJwMl9pbml0dmFscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfMnAyX2luaXR2YWxzLmgKQEAgLTQxMCw3ICs0MTAsNyBAQAogCXsweDAwMDA5ZTMwLCAweDA2MzM2Zjc3fSwKIAl7MHgwMDAwOWUzNCwgMHg2YWY2NTMyZn0sCiAJezB4MDAwMDllMzgsIDB4MGNjODBjMDB9LAotCXsweDAwMDA5ZTQwLCAweDBkMjYxODIwfSwKKwl7MHgwMDAwOWU0MCwgMHgwZDI2MTgwMH0sCiAJezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAogCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKIAl7MHgwMDAwOWU1NCwgMHgwMDAwMDAwMH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMV9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTMzMF8xcDFfaW5pdHZhbHMuaAppbmRleCBmNzYxMzliLi4yYzQyZmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMV9pbml0dmFscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkzMzBfMXAxX2luaXR2YWxzLmgKQEAgLTU5Miw3ICs1OTIsNyBAQAogCXsweDAwMDA5ZTMwLCAweDA2MzM2Zjc3fSwKIAl7MHgwMDAwOWUzNCwgMHg2YWY2NTMyZn0sCiAJezB4MDAwMDllMzgsIDB4MGNjODBjMDB9LAotCXsweDAwMDA5ZTQwLCAweDBkMjYxODIwfSwKKwl7MHgwMDAwOWU0MCwgMHgwZDI2MTgwMH0sCiAJezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAogCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKIAl7MHgwMDAwOWZjMCwgMHg4MDNlNDc4OH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMl9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTMzMF8xcDJfaW5pdHZhbHMuaAppbmRleCAwYWM4YmU5Li4yMTU0ZWZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTMzMF8xcDJfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMl9pbml0dmFscy5oCkBAIC0yMzEsNyArMjMxLDcgQEAKIAl7MHgwMDAwOWUzMCwgMHgwNjMzNmY3N30sCiAJezB4MDAwMDllMzQsIDB4NmFmNjUzMmZ9LAogCXsweDAwMDA5ZTM4LCAweDBjYzgwYzAwfSwKLQl7MHgwMDAwOWU0MCwgMHgwZDI2MTgyMH0sCisJezB4MDAwMDllNDAsIDB4MGQyNjE4MDB9LAogCXsweDAwMDA5ZTRjLCAweDAwMDAxMDA0fSwKIAl7MHgwMDAwOWU1MCwgMHgwMGZmMDNmMX0sCiAJezB4MDAwMDlmYzAsIDB4ODAzZTQ3ODh9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTM0MF9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTM0MF9pbml0dmFscy5oCmluZGV4IGEwMWYwZWQuLmI5OTVmZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkzNDBfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzQwX2luaXR2YWxzLmgKQEAgLTMxOCw3ICszMTgsNyBAQAogCXsweDAwMDA5ZTMwLCAweDA2MzM2Zjc3fSwKIAl7MHgwMDAwOWUzNCwgMHg2YWY2NTMyZn0sCiAJezB4MDAwMDllMzgsIDB4MGNjODBjMDB9LAotCXsweDAwMDA5ZTQwLCAweDBkMjYxODIwfSwKKwl7MHgwMDAwOWU0MCwgMHgwZDI2MTgwMH0sCiAJezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAogCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKIAl7MHgwMDAwOWU1NCwgMHgwMDAwMDAwMH0sCkBAIC0zNDgsOSArMzQ4LDkgQEAKIAl7MHgwMDAwYTM3MCwgMHgwMDAwMDAwMH0sCiAJezB4MDAwMGEzOTAsIDB4MDAwMDAwMDF9LAogCXsweDAwMDBhMzk0LCAweDAwMDAwNDQ0fSwKLQl7MHgwMDAwYTM5OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEzOWMsIDB4MjEwZDA0MDF9LAotCXsweDAwMDBhM2EwLCAweGFiOWE3MTQ0fSwKKwl7MHgwMDAwYTM5OCwgMHgwMDFmMGUwZn0sCisJezB4MDAwMGEzOWMsIDB4MDA3NTM5M2Z9LAorCXsweDAwMDBhM2EwLCAweGI3OWY2NDI3fSwKIAl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCiAJezB4MDAwMGEzYTgsIDB4YWFhYWFhYWF9LAogCXsweDAwMDBhM2FjLCAweDNjNDY2NDc4fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk1M3hfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk1M3hfaW5pdHZhbHMuaAppbmRleCAzYzkxMTNkLi44ZTVjM2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5NTN4X2luaXR2YWxzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTUzeF9pbml0dmFscy5oCkBAIC0yNTcsOSArMjU3LDkgQEAKIAl7MHgwMDAwYTM3MCwgMHgwMDAwMDAwMH0sCiAJezB4MDAwMGEzOTAsIDB4MDAwMDAwMDF9LAogCXsweDAwMDBhMzk0LCAweDAwMDAwNDQ0fSwKLQl7MHgwMDAwYTM5OCwgMHgxZjAyMDUwM30sCi0JezB4MDAwMGEzOWMsIDB4MjkxODBjMDN9LAotCXsweDAwMDBhM2EwLCAweDlhOGI2ODQ0fSwKKwl7MHgwMDAwYTM5OCwgMHgwMDFmMGUwZn0sCisJezB4MDAwMGEzOWMsIDB4MDA3NTM5M2Z9LAorCXsweDAwMDBhM2EwLCAweGI3OWY2NDI3fSwKIAl7MHgwMDAwYTNhNCwgMHgwMDAwMDBmZn0sCiAJezB4MDAwMGEzYTgsIDB4NmE2YTZhNmF9LAogCXsweDAwMDBhM2FjLCAweDZhNmE2YTZhfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk1ODBfMXAwX2luaXR2YWxzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5NTgwXzFwMF9pbml0dmFscy5oCmluZGV4IGU2YWVjMmMuLmE1Y2E2NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk1ODBfMXAwX2luaXR2YWxzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTU4MF8xcDBfaW5pdHZhbHMuaApAQCAtOTAsNyArOTAsNyBAQAogCXsweDAwMDA5ZTMwLCAweDA2MzM2Zjc3fSwKIAl7MHgwMDAwOWUzNCwgMHg2YWY2NTMyZn0sCiAJezB4MDAwMDllMzgsIDB4MGNjODBjMDB9LAotCXsweDAwMDA5ZTQwLCAweDBkMjYxODIwfSwKKwl7MHgwMDAwOWU0MCwgMHgwZDI2MTgwMH0sCiAJezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAogCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKIAl7MHgwMDAwOWU1NCwgMHgwMDAwMDAwMH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCmluZGV4IDNiYTAzZGQuLjJjYThmN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAotI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJtY2kuaCIKICNpbmNsdWRlICJkZnMuaCIKICNpbmNsdWRlICJzcGVjdHJhbC5oIgpAQCAtMTE0LDYgKzExNCw5IEBACiAjZGVmaW5lIEFUSF9UWEZJRk9fREVQVEggICAgICAgICAgIDgKICNkZWZpbmUgQVRIX1RYX0VSUk9SICAgICAgICAgICAgICAgMHgwMQogCisvKiBTdG9wIHR4IHRyYWZmaWMgMW1zIGJlZm9yZSB0aGUgR08gZ29lcyBhd2F5ICovCisjZGVmaW5lIEFUSF9QMlBfUFNfU1RPUF9USU1FICAgICAgIDEwMDAKKwogI2RlZmluZSBJRUVFODAyMTFfU0VRX1NFUV9TSElGVCAgICA0CiAjZGVmaW5lIElFRUU4MDIxMV9TRVFfTUFYICAgICAgICAgIDQwOTYKICNkZWZpbmUgSUVFRTgwMjExX1dFUF9JVkxFTiAgICAgICAgMwpAQCAtMjcxLDYgKzI3NCw3IEBACiAjaWZkZWYgQ09ORklHX0FUSDlLX1NUQVRJT05fU1RBVElTVElDUwogCXN0cnVjdCBhdGhfcnhfcmF0ZV9zdGF0cyByeF9yYXRlX3N0YXRzOwogI2VuZGlmCisJdTgga2V5X2lkeFs0XTsKIH07CiAKIHN0cnVjdCBhdGhfdHhfY29udHJvbCB7CkBAIC0zNjYsMTEgKzM3MCwxNSBAQAogLyoqKioqKioqLwogCiBzdHJ1Y3QgYXRoX3ZpZiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKIAlzdHJ1Y3QgYXRoX25vZGUgbWNhc3Rfbm9kZTsKIAlpbnQgYXZfYnNsb3Q7CiAJYm9vbCBwcmltYXJ5X3N0YV92aWY7CiAJX19sZTY0IHRzZl9hZGp1c3Q7IC8qIFRTRiBhZGp1c3RtZW50IGZvciBzdGFnZ2VyZWQgYmVhY29ucyAqLwogCXN0cnVjdCBhdGhfYnVmICphdl9iY2J1ZjsKKworCS8qIFAyUCBDbGllbnQgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25vYV9kYXRhIG5vYTsKIH07CiAKIHN0cnVjdCBhdGg5a192aWZfaXRlcl9kYXRhIHsKQEAgLTQ2Myw2ICs0NzEsOCBAQAogdm9pZCBhdGhfdXBkYXRlX3N1cnZleV9uZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGNoYW5uZWwpOwogdm9pZCBhdGg5a19xdWV1ZV9yZXNldChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgZW51bSBhdGhfcmVzZXRfdHlwZSB0eXBlKTsKIHZvaWQgYXRoX3BzX2Z1bGxfc2xlZXAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgYXRoOWtfcDJwX3BzX3RpbWVyKHZvaWQgKnByaXYpOwordm9pZCBhdGg5a191cGRhdGVfcDJwX3BzKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAogLyoqKioqKioqKiovCiAvKiBCVENPRVggKi8KQEAgLTcxMyw2ICs3MjMsOSBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHBhcHJkX2NvbXBsZXRlOwogCXdhaXRfcXVldWVfaGVhZF90IHR4X3dhaXQ7CiAKKwlzdHJ1Y3QgYXRoX2dlbl90aW1lciAqcDJwX3BzX3RpbWVyOworCXN0cnVjdCBhdGhfdmlmICpwMnBfcHNfdmlmOworCiAJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YTsKIAogCXU4IGd0dF9jbnQ7CkBAIC03NTcsNiArNzcwLDcgQEAKIAlzdHJ1Y3QgYXRoX2FudF9jb21iIGFudF9jb21iOwogCXU4IGFudF90eCwgYW50X3J4OwogCXN0cnVjdCBkZnNfcGF0dGVybl9kZXRlY3RvciAqZGZzX2RldGVjdG9yOworCXU2NCBkZnNfcHJldl9wdWxzZV90czsKIAl1MzIgd293X2VuYWJsZWQ7CiAJLyogcmVsYXkoZnMpIGNoYW5uZWwgZm9yIHNwZWN0cmFsIHNjYW4gKi8KIAlzdHJ1Y3QgcmNoYW4gKnJmc19jaGFuX3NwZWNfc2NhbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYwppbmRleCBiZDllNjM0Li5lMzg3ZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jCkBAIC01MzcsOCArNTM3LDYgQEAKIAljdXJfY29uZi0+ZHRpbV9wZXJpb2QgPSBic3NfY29uZi0+ZHRpbV9wZXJpb2Q7CiAJY3VyX2NvbmYtPmR0aW1fY291bnQgPSAxOwogCWN1cl9jb25mLT5pYnNzX2NyZWF0b3IgPSBic3NfY29uZi0+aWJzc19jcmVhdG9yOwotCWN1cl9jb25mLT5ibWlzc190aW1lb3V0ID0KLQkJQVRIX0RFRkFVTFRfQk1JU1NfTElNSVQgKiBjdXJfY29uZi0+YmVhY29uX2ludGVydmFsOwogCiAJLyoKIAkgKiBJdCBsb29rcyBsaWtlIG1hYzgwMjExIG1heSBlbmQgdXAgdXNpbmcgYmVhY29uIGludGVydmFsIG9mIHplcm8gaW4KQEAgLTU0OSw2ICs1NDcsOSBAQAogCWlmIChjdXJfY29uZi0+YmVhY29uX2ludGVydmFsID09IDApCiAJCWN1cl9jb25mLT5iZWFjb25faW50ZXJ2YWwgPSAxMDA7CiAKKwljdXJfY29uZi0+Ym1pc3NfdGltZW91dCA9CisJCUFUSF9ERUZBVUxUX0JNSVNTX0xJTUlUICogY3VyX2NvbmYtPmJlYWNvbl9pbnRlcnZhbDsKKwogCS8qCiAJICogV2UgZG9uJ3QgcGFyc2UgZHRpbSBwZXJpb2QgZnJvbSBtYWM4MDIxMSBkdXJpbmcgdGhlIGRyaXZlcgogCSAqIGluaXRpYWxpemF0aW9uIGFzIGl0IGJyZWFrcyBhc3NvY2lhdGlvbiB3aXRoIGhpZGRlbi1zc2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLWRlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyODlmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24tZGVidWcuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX21vZGFsX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBsZW4gPSAwLCBzaXplID0gNjAwMDsKKwljaGFyICpidWY7CisJc2l6ZV90IHJldHZhbDsKKworCWJ1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGFoLT5lZXBfb3BzLT5kdW1wX2VlcHJvbShhaCwgZmFsc2UsIGJ1ZiwgbGVuLCBzaXplKTsKKworCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX21vZGFsX2VlcHJvbSA9IHsKKwkucmVhZCA9IHJlYWRfZmlsZV9tb2RhbF9lZXByb20sCisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCisKK3ZvaWQgYXRoOWtfY21uX2RlYnVnX21vZGFsX2VlcHJvbShzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeSwKKwkJCQkgIHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1vZGFsX2VlcHJvbSIsIFNfSVJVU1IsIGRlYnVnZnNfcGh5LCBhaCwKKwkJCSAgICAmZm9wc19tb2RhbF9lZXByb20pOworfQorRVhQT1JUX1NZTUJPTChhdGg5a19jbW5fZGVidWdfbW9kYWxfZWVwcm9tKTsKKworc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX2Jhc2VfZWVwcm9tKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgbGVuID0gMCwgc2l6ZSA9IDE1MDA7CisJc3NpemVfdCByZXR2YWwgPSAwOworCWNoYXIgKmJ1ZjsKKworCWJ1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gYWgtPmVlcF9vcHMtPmR1bXBfZWVwcm9tKGFoLCB0cnVlLCBidWYsIGxlbiwgc2l6ZSk7CisKKwlyZXR2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19iYXNlX2VlcHJvbSA9IHsKKwkucmVhZCA9IHJlYWRfZmlsZV9iYXNlX2VlcHJvbSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoOWtfY21uX2RlYnVnX2Jhc2VfZWVwcm9tKHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGh5LAorCQkJCSBzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJiYXNlX2VlcHJvbSIsIFNfSVJVU1IsIGRlYnVnZnNfcGh5LCBhaCwKKwkJCSAgICAmZm9wc19iYXNlX2VlcHJvbSk7Cit9CitFWFBPUlRfU1lNQk9MKGF0aDlrX2Ntbl9kZWJ1Z19iYXNlX2VlcHJvbSk7CisKK3ZvaWQgYXRoOWtfY21uX2RlYnVnX3N0YXRfcngoc3RydWN0IGF0aF9yeF9zdGF0cyAqcnhzdGF0cywKKwkJCSAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJzKQoreworI2RlZmluZSBSWF9QSFlfRVJSX0lOQyhjKSByeHN0YXRzLT5waHlfZXJyX3N0YXRzW2NdKysKKyNkZWZpbmUgUlhfQ01OX1NUQVRfSU5DKGMpIChyeHN0YXRzLT5jKyspCisKKwlSWF9DTU5fU1RBVF9JTkMocnhfcGt0c19hbGwpOworCXJ4c3RhdHMtPnJ4X2J5dGVzX2FsbCArPSBycy0+cnNfZGF0YWxlbjsKKworCWlmIChycy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfQ1JDKQorCQlSWF9DTU5fU1RBVF9JTkMoY3JjX2Vycik7CisJaWYgKHJzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9ERUNSWVBUKQorCQlSWF9DTU5fU1RBVF9JTkMoZGVjcnlwdF9jcmNfZXJyKTsKKwlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYRVJSX01JQykKKwkJUlhfQ01OX1NUQVRfSU5DKG1pY19lcnIpOworCWlmIChycy0+cnNfc3RhdHVzICYgQVRIOUtfUlhfREVMSU1fQ1JDX1BSRSkKKwkJUlhfQ01OX1NUQVRfSU5DKHByZV9kZWxpbV9jcmNfZXJyKTsKKwlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYX0RFTElNX0NSQ19QT1NUKQorCQlSWF9DTU5fU1RBVF9JTkMocG9zdF9kZWxpbV9jcmNfZXJyKTsKKwlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYX0RFQ1JZUFRfQlVTWSkKKwkJUlhfQ01OX1NUQVRfSU5DKGRlY3J5cHRfYnVzeV9lcnIpOworCisJaWYgKHJzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9QSFkpIHsKKwkJUlhfQ01OX1NUQVRfSU5DKHBoeV9lcnIpOworCQlpZiAocnMtPnJzX3BoeWVyciA8IEFUSDlLX1BIWUVSUl9NQVgpCisJCQlSWF9QSFlfRVJSX0lOQyhycy0+cnNfcGh5ZXJyKTsKKwl9CisKKyN1bmRlZiBSWF9DTU5fU1RBVF9JTkMKKyN1bmRlZiBSWF9QSFlfRVJSX0lOQworfQorRVhQT1JUX1NZTUJPTChhdGg5a19jbW5fZGVidWdfc3RhdF9yeCk7CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9yZWN2KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyNkZWZpbmUgUlhTX0VSUihzLCBlKQkJCQkJXAorCWRvIHsJCQkJCQlcCisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAlcCisJCQkJICIlMThzIDogJTEwdVxuIiwgcywJXAorCQkJCSByeHN0YXRzLT5lKTsJCVwKKwl9IHdoaWxlICgwKQorCisJc3RydWN0IGF0aF9yeF9zdGF0cyAqcnhzdGF0cyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJdW5zaWduZWQgaW50IGxlbiA9IDAsIHNpemUgPSAxNjAwOworCXNzaXplX3QgcmV0dmFsID0gMDsKKworCWJ1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVJYU19FUlIoIlBLVFMtQUxMIiwgcnhfcGt0c19hbGwpOworCVJYU19FUlIoIkJZVEVTLUFMTCIsIHJ4X2J5dGVzX2FsbCk7CisJUlhTX0VSUigiQkVBQ09OUyIsIHJ4X2JlYWNvbnMpOworCVJYU19FUlIoIkZSQUdTIiwgcnhfZnJhZ3MpOworCVJYU19FUlIoIlNQRUNUUkFMIiwgcnhfc3BlY3RyYWwpOworCisJUlhTX0VSUigiQ1JDIEVSUiIsIGNyY19lcnIpOworCVJYU19FUlIoIkRFQ1JZUFQgQ1JDIEVSUiIsIGRlY3J5cHRfY3JjX2Vycik7CisJUlhTX0VSUigiUEhZIEVSUiIsIHBoeV9lcnIpOworCVJYU19FUlIoIk1JQyBFUlIiLCBtaWNfZXJyKTsKKwlSWFNfRVJSKCJQUkUtREVMSU0gQ1JDIEVSUiIsIHByZV9kZWxpbV9jcmNfZXJyKTsKKwlSWFNfRVJSKCJQT1NULURFTElNIENSQyBFUlIiLCBwb3N0X2RlbGltX2NyY19lcnIpOworCVJYU19FUlIoIkRFQ1JZUFQgQlVTWSBFUlIiLCBkZWNyeXB0X2J1c3lfZXJyKTsKKwlSWFNfRVJSKCJMRU5HVEgtRVJSIiwgcnhfbGVuX2Vycik7CisJUlhTX0VSUigiT09NLUVSUiIsIHJ4X29vbV9lcnIpOworCVJYU19FUlIoIlJBVEUtRVJSIiwgcnhfcmF0ZV9lcnIpOworCVJYU19FUlIoIlRPTy1NQU5ZLUZSQUdTIiwgcnhfdG9vX21hbnlfZnJhZ3NfZXJyKTsKKworCWlmIChsZW4gPiBzaXplKQorCQlsZW4gPSBzaXplOworCisJcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXR2YWw7CisKKyN1bmRlZiBSWFNfRVJSCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcmVjdiA9IHsKKwkucmVhZCA9IHJlYWRfZmlsZV9yZWN2LAorCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwordm9pZCBhdGg5a19jbW5fZGVidWdfcmVjdihzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeSwKKwkJCSAgc3RydWN0IGF0aF9yeF9zdGF0cyAqcnhzdGF0cykKK3sKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWN2IiwgU19JUlVTUiwgZGVidWdmc19waHksIHJ4c3RhdHMsCisJCQkgICAgJmZvcHNfcmVjdik7Cit9CitFWFBPUlRfU1lNQk9MKGF0aDlrX2Ntbl9kZWJ1Z19yZWN2KTsKKworc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX3BoeV9lcnIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisjZGVmaW5lIFBIWV9FUlIocywgcCkgXAorCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTIycyA6ICUxMHVcbiIsIHMsIFwKKwkJCSByeHN0YXRzLT5waHlfZXJyX3N0YXRzW3BdKTsKKworCXN0cnVjdCBhdGhfcnhfc3RhdHMgKnJ4c3RhdHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMTYwMDsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisKKwlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlQSFlfRVJSKCJVTkRFUlJVTiBFUlIiLCBBVEg5S19QSFlFUlJfVU5ERVJSVU4pOworCVBIWV9FUlIoIlRJTUlORyBFUlIiLCBBVEg5S19QSFlFUlJfVElNSU5HKTsKKwlQSFlfRVJSKCJQQVJJVFkgRVJSIiwgQVRIOUtfUEhZRVJSX1BBUklUWSk7CisJUEhZX0VSUigiUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfUkFURSk7CisJUEhZX0VSUigiTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9MRU5HVEgpOworCVBIWV9FUlIoIlJBREFSIEVSUiIsIEFUSDlLX1BIWUVSUl9SQURBUik7CisJUEhZX0VSUigiU0VSVklDRSBFUlIiLCBBVEg5S19QSFlFUlJfU0VSVklDRSk7CisJUEhZX0VSUigiVE9SIEVSUiIsIEFUSDlLX1BIWUVSUl9UT1IpOworCVBIWV9FUlIoIk9GRE0tVElNSU5HIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1RJTUlORyk7CisJUEhZX0VSUigiT0ZETS1TSUdOQUwtUEFSSVRZIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1NJR05BTF9QQVJJVFkpOworCVBIWV9FUlIoIk9GRE0tUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfT0ZETV9SQVRFX0lMTEVHQUwpOworCVBIWV9FUlIoIk9GRE0tTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX0xFTkdUSF9JTExFR0FMKTsKKwlQSFlfRVJSKCJPRkRNLVBPV0VSLURST1AgRVJSIiwgQVRIOUtfUEhZRVJSX09GRE1fUE9XRVJfRFJPUCk7CisJUEhZX0VSUigiT0ZETS1TRVJWSUNFIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1NFUlZJQ0UpOworCVBIWV9FUlIoIk9GRE0tUkVTVEFSVCBFUlIiLCBBVEg5S19QSFlFUlJfT0ZETV9SRVNUQVJUKTsKKwlQSFlfRVJSKCJGQUxTRS1SQURBUi1FWFQgRVJSIiwgQVRIOUtfUEhZRVJSX0ZBTFNFX1JBREFSX0VYVCk7CisJUEhZX0VSUigiQ0NLLVRJTUlORyBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1RJTUlORyk7CisJUEhZX0VSUigiQ0NLLUhFQURFUi1DUkMgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19IRUFERVJfQ1JDKTsKKwlQSFlfRVJSKCJDQ0stUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1JBVEVfSUxMRUdBTCk7CisJUEhZX0VSUigiQ0NLLVNFUlZJQ0UgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19TRVJWSUNFKTsKKwlQSFlfRVJSKCJDQ0stUkVTVEFSVCBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1JFU1RBUlQpOworCVBIWV9FUlIoIkNDSy1MRU5HVEggRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19MRU5HVEhfSUxMRUdBTCk7CisJUEhZX0VSUigiQ0NLLVBPV0VSLURST1AgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19QT1dFUl9EUk9QKTsKKwlQSFlfRVJSKCJIVC1DUkMgRVJSIiwgQVRIOUtfUEhZRVJSX0hUX0NSQ19FUlJPUik7CisJUEhZX0VSUigiSFQtTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9IVF9MRU5HVEhfSUxMRUdBTCk7CisJUEhZX0VSUigiSFQtUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfSFRfUkFURV9JTExFR0FMKTsKKworCWlmIChsZW4gPiBzaXplKQorCQlsZW4gPSBzaXplOworCisJcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXR2YWw7CisKKyN1bmRlZiBQSFlfRVJSCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcGh5X2VyciA9IHsKKwkucmVhZCA9IHJlYWRfZmlsZV9waHlfZXJyLAorCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwordm9pZCBhdGg5a19jbW5fZGVidWdfcGh5X2VycihzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeSwKKwkJCSAgICAgc3RydWN0IGF0aF9yeF9zdGF0cyAqcnhzdGF0cykKK3sKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwaHlfZXJyIiwgU19JUlVTUiwgZGVidWdmc19waHksIHJ4c3RhdHMsCisJCQkgICAgJmZvcHNfcGh5X2Vycik7Cit9CitFWFBPUlRfU1lNQk9MKGF0aDlrX2Ntbl9kZWJ1Z19waHlfZXJyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24tZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24tZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk3ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi1kZWJ1Zy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKworLyoqCisgKiBzdHJ1Y3QgYXRoX3J4X3N0YXRzIC0gUlggU3RhdGlzdGljcworICogQHJ4X3BrdHNfYWxsOiAgTm8uIG9mIHRvdGFsIGZyYW1lcyByZWNlaXZlZCwgaW5jbHVkaW5nIG9uZXMgdGhhdAorCW1heSBoYXZlIGhhZCBlcnJvcnMuCisgKiBAcnhfYnl0ZXNfYWxsOiAgTm8uIG9mIHRvdGFsIGJ5dGVzIHJlY2VpdmVkLCBpbmNsdWRpbmcgb25lcyB0aGF0CisJbWF5IGhhdmUgaGFkIGVycm9ycy4KKyAqIEBjcmNfZXJyOiBOby4gb2YgZnJhbWVzIHdpdGggaW5jb3JyZWN0IENSQyB2YWx1ZQorICogQGRlY3J5cHRfY3JjX2VycjogTm8uIG9mIGZyYW1lcyB3aG9zZSBDUkMgY2hlY2sgZmFpbGVkIGFmdGVyCisJZGVjcnlwdGlvbiBwcm9jZXNzIGNvbXBsZXRlZAorICogQHBoeV9lcnI6IE5vLiBvZiBmcmFtZXMgd2hvc2UgcmVjZXB0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBQSFkKKwllbmNvdW50ZXJlZCBhbiBlcnJvcgorICogQG1pY19lcnI6IE5vLiBvZiBmcmFtZXMgd2l0aCBpbmNvcnJlY3QgVEtJUCBNSUMgdmVyaWZpY2F0aW9uIGZhaWx1cmUKKyAqIEBwcmVfZGVsaW1fY3JjX2VycjogUHJlLUZyYW1lIGRlbGltaXRlciBDUkMgZXJyb3IgZGV0ZWN0aW9ucworICogQHBvc3RfZGVsaW1fY3JjX2VycjogUG9zdC1GcmFtZSBkZWxpbWl0ZXIgQ1JDIGVycm9yIGRldGVjdGlvbnMKKyAqIEBkZWNyeXB0X2J1c3lfZXJyOiBEZWNyeXB0aW9uIGludGVycnVwdGlvbnMgY291bnRlcgorICogQHBoeV9lcnJfc3RhdHM6IEluZGl2aWR1YWwgUEhZIGVycm9yIHN0YXRpc3RpY3MKKyAqIEByeF9sZW5fZXJyOiAgTm8uIG9mIGZyYW1lcyBkaXNjYXJkZWQgZHVlIHRvIGJhZCBsZW5ndGguCisgKiBAcnhfb29tX2VycjogIE5vLiBvZiBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gT09NIGlzc3Vlcy4KKyAqIEByeF9yYXRlX2VycjogIE5vLiBvZiBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gcmF0ZSBlcnJvcnMuCisgKiBAcnhfdG9vX21hbnlfZnJhZ3NfZXJyOiAgRnJhbWVzIGRyb3BwZWQgZHVlIHRvIHRvby1tYW55LWZyYWdzIHJlY2VpdmVkLgorICogQHJ4X2JlYWNvbnM6ICBOby4gb2YgYmVhY29ucyByZWNlaXZlZC4KKyAqIEByeF9mcmFnczogIE5vLiBvZiByeC1mcmFnZW1lbnRzIHJlY2VpdmVkLgorICogQHJ4X3NwZWN0cmFsOiBObyBvZiBzcGVjdHJhbCBwYWNrZXRzIHJlY2VpdmVkLgorICovCitzdHJ1Y3QgYXRoX3J4X3N0YXRzIHsKKwl1MzIgcnhfcGt0c19hbGw7CisJdTMyIHJ4X2J5dGVzX2FsbDsKKwl1MzIgY3JjX2VycjsKKwl1MzIgZGVjcnlwdF9jcmNfZXJyOworCXUzMiBwaHlfZXJyOworCXUzMiBtaWNfZXJyOworCXUzMiBwcmVfZGVsaW1fY3JjX2VycjsKKwl1MzIgcG9zdF9kZWxpbV9jcmNfZXJyOworCXUzMiBkZWNyeXB0X2J1c3lfZXJyOworCXUzMiBwaHlfZXJyX3N0YXRzW0FUSDlLX1BIWUVSUl9NQVhdOworCXUzMiByeF9sZW5fZXJyOworCXUzMiByeF9vb21fZXJyOworCXUzMiByeF9yYXRlX2VycjsKKwl1MzIgcnhfdG9vX21hbnlfZnJhZ3NfZXJyOworCXUzMiByeF9iZWFjb25zOworCXUzMiByeF9mcmFnczsKKwl1MzIgcnhfc3BlY3RyYWw7Cit9OworCit2b2lkIGF0aDlrX2Ntbl9kZWJ1Z19tb2RhbF9lZXByb20oc3RydWN0IGRlbnRyeSAqZGVidWdmc19waHksCisJCQkJICBzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGF0aDlrX2Ntbl9kZWJ1Z19iYXNlX2VlcHJvbShzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeSwKKwkJCQkgc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhdGg5a19jbW5fZGVidWdfc3RhdF9yeChzdHJ1Y3QgYXRoX3J4X3N0YXRzICpyeHN0YXRzLAorCQkJICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMpOwordm9pZCBhdGg5a19jbW5fZGVidWdfcmVjdihzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeSwKKwkJCSAgc3RydWN0IGF0aF9yeF9zdGF0cyAqcnhzdGF0cyk7Cit2b2lkIGF0aDlrX2Ntbl9kZWJ1Z19waHlfZXJyKHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGh5LAorCQkJICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXRzICpyeHN0YXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24uaAppbmRleCBjYTM4MTE2Li5mZmM0NTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJjb21tb24taW5pdC5oIgogI2luY2x1ZGUgImNvbW1vbi1iZWFjb24uaCIKKyNpbmNsdWRlICJjb21tb24tZGVidWcuaCIKIAogLyogQ29tbW9uIGhlYWRlciBmb3IgQXRoZXJvcyA4MDIuMTFuIGJhc2UgZHJpdmVyIGNvcmVzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKaW5kZXggNzgwZmYxYi4uNmNjNDJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKQEAgLTk0OCwxNTEgKzk0OCwxMSBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9yZWN2KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSNkZWZpbmUgUlhTX0VSUihzLCBlKQkJCQkJICAgIFwKLQlkbyB7CQkJCQkJICAgIFwKLQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCSAgICBcCi0JCQkJICIlMThzIDogJTEwdVxuIiwgcywJICAgIFwKLQkJCQkgc2MtPmRlYnVnLnN0YXRzLnJ4c3RhdHMuZSk7XAotCX0gd2hpbGUgKDApCi0KLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpidWY7Ci0JdW5zaWduZWQgaW50IGxlbiA9IDAsIHNpemUgPSAxNjAwOwotCXNzaXplX3QgcmV0dmFsID0gMDsKLQotCWJ1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCVJYU19FUlIoIlBLVFMtQUxMIiwgcnhfcGt0c19hbGwpOwotCVJYU19FUlIoIkJZVEVTLUFMTCIsIHJ4X2J5dGVzX2FsbCk7Ci0JUlhTX0VSUigiQkVBQ09OUyIsIHJ4X2JlYWNvbnMpOwotCVJYU19FUlIoIkZSQUdTIiwgcnhfZnJhZ3MpOwotCVJYU19FUlIoIlNQRUNUUkFMIiwgcnhfc3BlY3RyYWwpOwotCi0JUlhTX0VSUigiQ1JDIEVSUiIsIGNyY19lcnIpOwotCVJYU19FUlIoIkRFQ1JZUFQgQ1JDIEVSUiIsIGRlY3J5cHRfY3JjX2Vycik7Ci0JUlhTX0VSUigiUEhZIEVSUiIsIHBoeV9lcnIpOwotCVJYU19FUlIoIk1JQyBFUlIiLCBtaWNfZXJyKTsKLQlSWFNfRVJSKCJQUkUtREVMSU0gQ1JDIEVSUiIsIHByZV9kZWxpbV9jcmNfZXJyKTsKLQlSWFNfRVJSKCJQT1NULURFTElNIENSQyBFUlIiLCBwb3N0X2RlbGltX2NyY19lcnIpOwotCVJYU19FUlIoIkRFQ1JZUFQgQlVTWSBFUlIiLCBkZWNyeXB0X2J1c3lfZXJyKTsKLQlSWFNfRVJSKCJMRU5HVEgtRVJSIiwgcnhfbGVuX2Vycik7Ci0JUlhTX0VSUigiT09NLUVSUiIsIHJ4X29vbV9lcnIpOwotCVJYU19FUlIoIlJBVEUtRVJSIiwgcnhfcmF0ZV9lcnIpOwotCVJYU19FUlIoIlRPTy1NQU5ZLUZSQUdTIiwgcnhfdG9vX21hbnlfZnJhZ3NfZXJyKTsKLQotCWlmIChsZW4gPiBzaXplKQotCQlsZW4gPSBzaXplOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci0KLSN1bmRlZiBSWFNfRVJSCi19Ci0KIHZvaWQgYXRoX2RlYnVnX3N0YXRfcngoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfcnhfc3RhdHVzICpycykKIHsKLSNkZWZpbmUgUlhfUEhZX0VSUl9JTkMoYykgc2MtPmRlYnVnLnN0YXRzLnJ4c3RhdHMucGh5X2Vycl9zdGF0c1tjXSsrCi0KLQlSWF9TVEFUX0lOQyhyeF9wa3RzX2FsbCk7Ci0Jc2MtPmRlYnVnLnN0YXRzLnJ4c3RhdHMucnhfYnl0ZXNfYWxsICs9IHJzLT5yc19kYXRhbGVuOwotCi0JaWYgKHJzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9DUkMpCi0JCVJYX1NUQVRfSU5DKGNyY19lcnIpOwotCWlmIChycy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfREVDUllQVCkKLQkJUlhfU1RBVF9JTkMoZGVjcnlwdF9jcmNfZXJyKTsKLQlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYRVJSX01JQykKLQkJUlhfU1RBVF9JTkMobWljX2Vycik7Ci0JaWYgKHJzLT5yc19zdGF0dXMgJiBBVEg5S19SWF9ERUxJTV9DUkNfUFJFKQotCQlSWF9TVEFUX0lOQyhwcmVfZGVsaW1fY3JjX2Vycik7Ci0JaWYgKHJzLT5yc19zdGF0dXMgJiBBVEg5S19SWF9ERUxJTV9DUkNfUE9TVCkKLQkJUlhfU1RBVF9JTkMocG9zdF9kZWxpbV9jcmNfZXJyKTsKLQlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYX0RFQ1JZUFRfQlVTWSkKLQkJUlhfU1RBVF9JTkMoZGVjcnlwdF9idXN5X2Vycik7Ci0KLQlpZiAocnMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYRVJSX1BIWSkgewotCQlSWF9TVEFUX0lOQyhwaHlfZXJyKTsKLQkJaWYgKHJzLT5yc19waHllcnIgPCBBVEg5S19QSFlFUlJfTUFYKQotCQkJUlhfUEhZX0VSUl9JTkMocnMtPnJzX3BoeWVycik7Ci0JfQotCi0jdW5kZWYgUlhfUEhZX0VSUl9JTkMKKwlhdGg5a19jbW5fZGVidWdfc3RhdF9yeCgmc2MtPmRlYnVnLnN0YXRzLnJ4c3RhdHMsIHJzKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19yZWN2ID0gewotCS5yZWFkID0gcmVhZF9maWxlX3JlY3YsCi0JLm9wZW4gPSBzaW1wbGVfb3BlbiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfcGh5X2VycihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSNkZWZpbmUgUEhZX0VSUihzLCBwKSBcCi0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlMjJzIDogJTEwdVxuIiwgcywgXAotCQkJIHNjLT5kZWJ1Zy5zdGF0cy5yeHN0YXRzLnBoeV9lcnJfc3RhdHNbcF0pOwotCi0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqYnVmOwotCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMTYwMDsKLQlzc2l6ZV90IHJldHZhbCA9IDA7Ci0KLQlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlQSFlfRVJSKCJVTkRFUlJVTiBFUlIiLCBBVEg5S19QSFlFUlJfVU5ERVJSVU4pOwotCVBIWV9FUlIoIlRJTUlORyBFUlIiLCBBVEg5S19QSFlFUlJfVElNSU5HKTsKLQlQSFlfRVJSKCJQQVJJVFkgRVJSIiwgQVRIOUtfUEhZRVJSX1BBUklUWSk7Ci0JUEhZX0VSUigiUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfUkFURSk7Ci0JUEhZX0VSUigiTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9MRU5HVEgpOwotCVBIWV9FUlIoIlJBREFSIEVSUiIsIEFUSDlLX1BIWUVSUl9SQURBUik7Ci0JUEhZX0VSUigiU0VSVklDRSBFUlIiLCBBVEg5S19QSFlFUlJfU0VSVklDRSk7Ci0JUEhZX0VSUigiVE9SIEVSUiIsIEFUSDlLX1BIWUVSUl9UT1IpOwotCVBIWV9FUlIoIk9GRE0tVElNSU5HIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1RJTUlORyk7Ci0JUEhZX0VSUigiT0ZETS1TSUdOQUwtUEFSSVRZIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1NJR05BTF9QQVJJVFkpOwotCVBIWV9FUlIoIk9GRE0tUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfT0ZETV9SQVRFX0lMTEVHQUwpOwotCVBIWV9FUlIoIk9GRE0tTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX0xFTkdUSF9JTExFR0FMKTsKLQlQSFlfRVJSKCJPRkRNLVBPV0VSLURST1AgRVJSIiwgQVRIOUtfUEhZRVJSX09GRE1fUE9XRVJfRFJPUCk7Ci0JUEhZX0VSUigiT0ZETS1TRVJWSUNFIEVSUiIsIEFUSDlLX1BIWUVSUl9PRkRNX1NFUlZJQ0UpOwotCVBIWV9FUlIoIk9GRE0tUkVTVEFSVCBFUlIiLCBBVEg5S19QSFlFUlJfT0ZETV9SRVNUQVJUKTsKLQlQSFlfRVJSKCJGQUxTRS1SQURBUi1FWFQgRVJSIiwgQVRIOUtfUEhZRVJSX0ZBTFNFX1JBREFSX0VYVCk7Ci0JUEhZX0VSUigiQ0NLLVRJTUlORyBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1RJTUlORyk7Ci0JUEhZX0VSUigiQ0NLLUhFQURFUi1DUkMgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19IRUFERVJfQ1JDKTsKLQlQSFlfRVJSKCJDQ0stUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1JBVEVfSUxMRUdBTCk7Ci0JUEhZX0VSUigiQ0NLLVNFUlZJQ0UgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19TRVJWSUNFKTsKLQlQSFlfRVJSKCJDQ0stUkVTVEFSVCBFUlIiLCBBVEg5S19QSFlFUlJfQ0NLX1JFU1RBUlQpOwotCVBIWV9FUlIoIkNDSy1MRU5HVEggRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19MRU5HVEhfSUxMRUdBTCk7Ci0JUEhZX0VSUigiQ0NLLVBPV0VSLURST1AgRVJSIiwgQVRIOUtfUEhZRVJSX0NDS19QT1dFUl9EUk9QKTsKLQlQSFlfRVJSKCJIVC1DUkMgRVJSIiwgQVRIOUtfUEhZRVJSX0hUX0NSQ19FUlJPUik7Ci0JUEhZX0VSUigiSFQtTEVOR1RIIEVSUiIsIEFUSDlLX1BIWUVSUl9IVF9MRU5HVEhfSUxMRUdBTCk7Ci0JUEhZX0VSUigiSFQtUkFURSBFUlIiLCBBVEg5S19QSFlFUlJfSFRfUkFURV9JTExFR0FMKTsKLQotCWlmIChsZW4gPiBzaXplKQotCQlsZW4gPSBzaXplOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci0KLSN1bmRlZiBQSFlfRVJSCi19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcGh5X2VyciA9IHsKLQkucmVhZCA9IHJlYWRfZmlsZV9waHlfZXJyLAotCS5vcGVuID0gc2ltcGxlX29wZW4sCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX3JlZ2lkeChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTEyNjgsNjIgKzExMjgsNiBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9iYXNlX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7Ci0JdTMyIGxlbiA9IDAsIHNpemUgPSAxNTAwOwotCXNzaXplX3QgcmV0dmFsID0gMDsKLQljaGFyICpidWY7Ci0KLQlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxlbiA9IGFoLT5lZXBfb3BzLT5kdW1wX2VlcHJvbShhaCwgdHJ1ZSwgYnVmLCBsZW4sIHNpemUpOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfYmFzZV9lZXByb20gPSB7Ci0JLnJlYWQgPSByZWFkX2ZpbGVfYmFzZV9lZXByb20sCi0JLm9wZW4gPSBzaW1wbGVfb3BlbiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfbW9kYWxfZWVwcm9tKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7Ci0JdTMyIGxlbiA9IDAsIHNpemUgPSA2MDAwOwotCWNoYXIgKmJ1ZjsKLQlzaXplX3QgcmV0dmFsOwotCi0JYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbGVuID0gYWgtPmVlcF9vcHMtPmR1bXBfZWVwcm9tKGFoLCBmYWxzZSwgYnVmLCBsZW4sIHNpemUpOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfbW9kYWxfZWVwcm9tID0gewotCS5yZWFkID0gcmVhZF9maWxlX21vZGFsX2VlcHJvbSwKLQkub3BlbiA9IHNpbXBsZV9vcGVuLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KICNpZmRlZiBDT05GSUdfQVRIOUtfQlRDT0VYX1NVUFBPUlQKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9idGNvZXgoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE1MjQsMTAgKzEzMjgsMTAgQEAKIAkJCSAgICAmZm9wc19taXNjKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZXNldCIsIFNfSVJVU1IsIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsCiAJCQkgICAgJmZvcHNfcmVzZXQpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlY3YiLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLAotCQkJICAgICZmb3BzX3JlY3YpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInBoeV9lcnIiLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLAotCQkJICAgICZmb3BzX3BoeV9lcnIpOworCisJYXRoOWtfY21uX2RlYnVnX3JlY3Yoc2MtPmRlYnVnLmRlYnVnZnNfcGh5LCAmc2MtPmRlYnVnLnN0YXRzLnJ4c3RhdHMpOworCWF0aDlrX2Ntbl9kZWJ1Z19waHlfZXJyKHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgJnNjLT5kZWJ1Zy5zdGF0cy5yeHN0YXRzKTsKKwogCWRlYnVnZnNfY3JlYXRlX3U4KCJyeF9jaGFpbm1hc2siLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksCiAJCQkgICZhaC0+cnhjaGFpbm1hc2spOwogCWRlYnVnZnNfY3JlYXRlX3U4KCJ0eF9jaGFpbm1hc2siLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksCkBAIC0xNTQ3LDEwICsxMzUxLDEwIEBACiAJCQkgICAgJmZvcHNfcmVnZHVtcCk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZHVtcF9uZmNhbCIsIFNfSVJVU1IsIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsCiAJCQkgICAgJmZvcHNfZHVtcF9uZmNhbCk7Ci0JZGVidWdmc19jcmVhdGVfZmlsZSgiYmFzZV9lZXByb20iLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLAotCQkJICAgICZmb3BzX2Jhc2VfZWVwcm9tKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtb2RhbF9lZXByb20iLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLAotCQkJICAgICZmb3BzX21vZGFsX2VlcHJvbSk7CisKKwlhdGg5a19jbW5fZGVidWdfYmFzZV9lZXByb20oc2MtPmRlYnVnLmRlYnVnZnNfcGh5LCBzYy0+c2NfYWgpOworCWF0aDlrX2Ntbl9kZWJ1Z19tb2RhbF9lZXByb20oc2MtPmRlYnVnLmRlYnVnZnNfcGh5LCBzYy0+c2NfYWgpOworCiAJZGVidWdmc19jcmVhdGVfdTMyKCJncGlvX21hc2siLCBTX0lSVVNSIHwgU19JV1VTUiwKIAkJCSAgIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgJnNjLT5zY19haC0+Z3Bpb19tYXNrKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV91MzIoImdwaW9fdmFsIiwgU19JUlVTUiB8IFNfSVdVU1IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5oCmluZGV4IDU1OWE2OGMuLjUzYWUxNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5oCkBAIC0yMjEsNTAgKzIyMSw2IEBACiAJfSBjY2tfc3RhdHNbNF07CiB9OwogCi0vKioKLSAqIHN0cnVjdCBhdGhfcnhfc3RhdHMgLSBSWCBTdGF0aXN0aWNzCi0gKiBAcnhfcGt0c19hbGw6ICBOby4gb2YgdG90YWwgZnJhbWVzIHJlY2VpdmVkLCBpbmNsdWRpbmcgb25lcyB0aGF0Ci0JbWF5IGhhdmUgaGFkIGVycm9ycy4KLSAqIEByeF9ieXRlc19hbGw6ICBOby4gb2YgdG90YWwgYnl0ZXMgcmVjZWl2ZWQsIGluY2x1ZGluZyBvbmVzIHRoYXQKLQltYXkgaGF2ZSBoYWQgZXJyb3JzLgotICogQGNyY19lcnI6IE5vLiBvZiBmcmFtZXMgd2l0aCBpbmNvcnJlY3QgQ1JDIHZhbHVlCi0gKiBAZGVjcnlwdF9jcmNfZXJyOiBOby4gb2YgZnJhbWVzIHdob3NlIENSQyBjaGVjayBmYWlsZWQgYWZ0ZXIKLQlkZWNyeXB0aW9uIHByb2Nlc3MgY29tcGxldGVkCi0gKiBAcGh5X2VycjogTm8uIG9mIGZyYW1lcyB3aG9zZSByZWNlcHRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIFBIWQotCWVuY291bnRlcmVkIGFuIGVycm9yCi0gKiBAbWljX2VycjogTm8uIG9mIGZyYW1lcyB3aXRoIGluY29ycmVjdCBUS0lQIE1JQyB2ZXJpZmljYXRpb24gZmFpbHVyZQotICogQHByZV9kZWxpbV9jcmNfZXJyOiBQcmUtRnJhbWUgZGVsaW1pdGVyIENSQyBlcnJvciBkZXRlY3Rpb25zCi0gKiBAcG9zdF9kZWxpbV9jcmNfZXJyOiBQb3N0LUZyYW1lIGRlbGltaXRlciBDUkMgZXJyb3IgZGV0ZWN0aW9ucwotICogQGRlY3J5cHRfYnVzeV9lcnI6IERlY3J5cHRpb24gaW50ZXJydXB0aW9ucyBjb3VudGVyCi0gKiBAcGh5X2Vycl9zdGF0czogSW5kaXZpZHVhbCBQSFkgZXJyb3Igc3RhdGlzdGljcwotICogQHJ4X2xlbl9lcnI6ICBOby4gb2YgZnJhbWVzIGRpc2NhcmRlZCBkdWUgdG8gYmFkIGxlbmd0aC4KLSAqIEByeF9vb21fZXJyOiAgTm8uIG9mIGZyYW1lcyBkcm9wcGVkIGR1ZSB0byBPT00gaXNzdWVzLgotICogQHJ4X3JhdGVfZXJyOiAgTm8uIG9mIGZyYW1lcyBkcm9wcGVkIGR1ZSB0byByYXRlIGVycm9ycy4KLSAqIEByeF90b29fbWFueV9mcmFnc19lcnI6ICBGcmFtZXMgZHJvcHBlZCBkdWUgdG8gdG9vLW1hbnktZnJhZ3MgcmVjZWl2ZWQuCi0gKiBAcnhfYmVhY29uczogIE5vLiBvZiBiZWFjb25zIHJlY2VpdmVkLgotICogQHJ4X2ZyYWdzOiAgTm8uIG9mIHJ4LWZyYWdlbWVudHMgcmVjZWl2ZWQuCi0gKiBAcnhfc3BlY3RyYWw6IE5vIG9mIHNwZWN0cmFsIHBhY2tldHMgcmVjZWl2ZWQuCi0gKi8KLXN0cnVjdCBhdGhfcnhfc3RhdHMgewotCXUzMiByeF9wa3RzX2FsbDsKLQl1MzIgcnhfYnl0ZXNfYWxsOwotCXUzMiBjcmNfZXJyOwotCXUzMiBkZWNyeXB0X2NyY19lcnI7Ci0JdTMyIHBoeV9lcnI7Ci0JdTMyIG1pY19lcnI7Ci0JdTMyIHByZV9kZWxpbV9jcmNfZXJyOwotCXUzMiBwb3N0X2RlbGltX2NyY19lcnI7Ci0JdTMyIGRlY3J5cHRfYnVzeV9lcnI7Ci0JdTMyIHBoeV9lcnJfc3RhdHNbQVRIOUtfUEhZRVJSX01BWF07Ci0JdTMyIHJ4X2xlbl9lcnI7Ci0JdTMyIHJ4X29vbV9lcnI7Ci0JdTMyIHJ4X3JhdGVfZXJyOwotCXUzMiByeF90b29fbWFueV9mcmFnc19lcnI7Ci0JdTMyIHJ4X2JlYWNvbnM7Ci0JdTMyIHJ4X2ZyYWdzOwotCXUzMiByeF9zcGVjdHJhbDsKLX07Ci0KICNkZWZpbmUgQU5UX01BSU4gMAogI2RlZmluZSBBTlRfQUxUICAxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYwppbmRleCA4NTdiYjI4Li43MjYyNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5jCkBAIC0xNzgsMTIgKzE3OCwxMiBAQAogCXBlLnRzID0gbWFjdGltZTsKIAlpZiAoYXRoOWtfcG9zdHByb2Nlc3NfcmFkYXJfZXZlbnQoc2MsICZhcmQsICZwZSkpIHsKIAkJc3RydWN0IGRmc19wYXR0ZXJuX2RldGVjdG9yICpwZCA9IHNjLT5kZnNfZGV0ZWN0b3I7Ci0JCXN0YXRpYyB1NjQgbGFzdF90czsKIAkJYXRoX2RiZyhjb21tb24sIERGUywKIAkJCSJhdGg5a19kZnNfcHJvY2Vzc19waHllcnI6IGNoYW5uZWw9JWQsIHRzPSVsbHUsICIKIAkJCSJ3aWR0aD0lZCwgcnNzaT0lZCwgZGVsdGFfdHM9JWxsdVxuIiwKLQkJCXBlLmZyZXEsIHBlLnRzLCBwZS53aWR0aCwgcGUucnNzaSwgcGUudHMtbGFzdF90cyk7Ci0JCWxhc3RfdHMgPSBwZS50czsKKwkJCXBlLmZyZXEsIHBlLnRzLCBwZS53aWR0aCwgcGUucnNzaSwKKwkJCXBlLnRzIC0gc2MtPmRmc19wcmV2X3B1bHNlX3RzKTsKKwkJc2MtPmRmc19wcmV2X3B1bHNlX3RzID0gcGUudHM7CiAJCURGU19TVEFUX0lOQyhzYywgcHVsc2VzX3Byb2Nlc3NlZCk7CiAJCWlmIChwZCAhPSBOVUxMICYmIHBkLT5hZGRfcHVsc2UocGQsICZwZSkpIHsKIAkJCURGU19TVEFUX0lOQyhzYywgcmFkYXJfZGV0ZWN0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oCmluZGV4IGRhYjFmMGMuLjA5YTVkNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjLmgKQEAgLTMyNSwxNCArMzI1LDE0IEBACiAKICNkZWZpbmUgVFhfU1RBVF9JTkMoYykgKGhpZl9kZXYtPmh0Y19oYW5kbGUtPmRydl9wcml2LT5kZWJ1Zy50eF9zdGF0cy5jKyspCiAjZGVmaW5lIFRYX1NUQVRfQUREKGMsIGEpIChoaWZfZGV2LT5odGNfaGFuZGxlLT5kcnZfcHJpdi0+ZGVidWcudHhfc3RhdHMuYyArPSBhKQotI2RlZmluZSBSWF9TVEFUX0lOQyhjKSAoaGlmX2Rldi0+aHRjX2hhbmRsZS0+ZHJ2X3ByaXYtPmRlYnVnLnJ4X3N0YXRzLmMrKykKLSNkZWZpbmUgUlhfU1RBVF9BREQoYywgYSkgKGhpZl9kZXYtPmh0Y19oYW5kbGUtPmRydl9wcml2LT5kZWJ1Zy5yeF9zdGF0cy5jICs9IGEpCisjZGVmaW5lIFJYX1NUQVRfSU5DKGMpIChoaWZfZGV2LT5odGNfaGFuZGxlLT5kcnZfcHJpdi0+ZGVidWcuc2ticnhfc3RhdHMuYysrKQorI2RlZmluZSBSWF9TVEFUX0FERChjLCBhKSAoaGlmX2Rldi0+aHRjX2hhbmRsZS0+ZHJ2X3ByaXYtPmRlYnVnLnNrYnJ4X3N0YXRzLmMgKz0gYSkKICNkZWZpbmUgQ0FCX1NUQVRfSU5DICAgcHJpdi0+ZGVidWcudHhfc3RhdHMuY2FiX3F1ZXVlZCsrCiAKICNkZWZpbmUgVFhfUVNUQVRfSU5DKHEpIChwcml2LT5kZWJ1Zy50eF9zdGF0cy5xdWV1ZV9zdGF0c1txXSsrKQogCiB2b2lkIGF0aDlrX2h0Y19lcnJfc3RhdF9yeChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsCi0JCQkgICBzdHJ1Y3QgYXRoX2h0Y19yeF9zdGF0dXMgKnJ4cyk7CisJCQkgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMpOwogCiBzdHJ1Y3QgYXRoX3R4X3N0YXRzIHsKIAl1MzIgYnVmX3F1ZXVlZDsKQEAgLTM0NSwyNSArMzQ1LDE4IEBACiAJdTMyIHF1ZXVlX3N0YXRzW0lFRUU4MDIxMV9OVU1fQUNTXTsKIH07CiAKLXN0cnVjdCBhdGhfcnhfc3RhdHMgeworc3RydWN0IGF0aF9za2JyeF9zdGF0cyB7CiAJdTMyIHNrYl9hbGxvY2F0ZWQ7CiAJdTMyIHNrYl9jb21wbGV0ZWQ7CiAJdTMyIHNrYl9jb21wbGV0ZWRfYnl0ZXM7CiAJdTMyIHNrYl9kcm9wcGVkOwotCXUzMiBlcnJfY3JjOwotCXUzMiBlcnJfZGVjcnlwdF9jcmM7Ci0JdTMyIGVycl9taWM7Ci0JdTMyIGVycl9wcmVfZGVsaW07Ci0JdTMyIGVycl9wb3N0X2RlbGltOwotCXUzMiBlcnJfZGVjcnlwdF9idXN5OwotCXUzMiBlcnJfcGh5OwotCXUzMiBlcnJfcGh5X3N0YXRzW0FUSDlLX1BIWUVSUl9NQVhdOwogfTsKIAogc3RydWN0IGF0aDlrX2RlYnVnIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BoeTsKIAlzdHJ1Y3QgYXRoX3R4X3N0YXRzIHR4X3N0YXRzOwogCXN0cnVjdCBhdGhfcnhfc3RhdHMgcnhfc3RhdHM7CisJc3RydWN0IGF0aF9za2JyeF9zdGF0cyBza2JyeF9zdGF0czsKIH07CiAKIHZvaWQgYXRoOWtfaHRjX2dldF9ldF9zdHJpbmdzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMzg1LDcgKzM3OCw3IEBACiAjZGVmaW5lIFRYX1FTVEFUX0lOQyhjKSBkbyB7IH0gd2hpbGUgKDApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19odGNfZXJyX3N0YXRfcngoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IGF0aF9odGNfcnhfc3RhdHVzICpyeHMpCisJCQkJCSBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9kZWJ1Zy5jCmluZGV4IGZiMDcxZWUuLjhiNTI5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZGVidWcuYwpAQCAtMjQzLDM5ICsyNDMsMTQgQEAKIH07CiAKIHZvaWQgYXRoOWtfaHRjX2Vycl9zdGF0X3J4KHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBhdGhfaHRjX3J4X3N0YXR1cyAqcnhzKQorCQkJICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMpCiB7Ci0jZGVmaW5lIFJYX1BIWV9FUlJfSU5DKGMpIHByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9waHlfc3RhdHNbY10rKwotCi0JaWYgKHJ4cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfQ1JDKQotCQlwcml2LT5kZWJ1Zy5yeF9zdGF0cy5lcnJfY3JjKys7Ci0JaWYgKHJ4cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfREVDUllQVCkKLQkJcHJpdi0+ZGVidWcucnhfc3RhdHMuZXJyX2RlY3J5cHRfY3JjKys7Ci0JaWYgKHJ4cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfTUlDKQotCQlwcml2LT5kZWJ1Zy5yeF9zdGF0cy5lcnJfbWljKys7Ci0JaWYgKHJ4cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhfREVMSU1fQ1JDX1BSRSkKLQkJcHJpdi0+ZGVidWcucnhfc3RhdHMuZXJyX3ByZV9kZWxpbSsrOwotCWlmIChyeHMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYX0RFTElNX0NSQ19QT1NUKQotCQlwcml2LT5kZWJ1Zy5yeF9zdGF0cy5lcnJfcG9zdF9kZWxpbSsrOwotCWlmIChyeHMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYX0RFQ1JZUFRfQlVTWSkKLQkJcHJpdi0+ZGVidWcucnhfc3RhdHMuZXJyX2RlY3J5cHRfYnVzeSsrOwotCi0JaWYgKHJ4cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfUEhZKSB7Ci0JCXByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9waHkrKzsKLQkJaWYgKHJ4cy0+cnNfcGh5ZXJyIDwgQVRIOUtfUEhZRVJSX01BWCkKLQkJCVJYX1BIWV9FUlJfSU5DKHJ4cy0+cnNfcGh5ZXJyKTsKLQl9Ci0KLSN1bmRlZiBSWF9QSFlfRVJSX0lOQworCWF0aDlrX2Ntbl9kZWJ1Z19zdGF0X3J4KCZwcml2LT5kZWJ1Zy5yeF9zdGF0cywgcnMpOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfcmVjdihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX3NrYl9yeChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0jZGVmaW5lIFBIWV9FUlIocywgcCkJCQkJCQkJXAotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTIwcyA6ICUxMHVcbiIsIHMsCVwKLQkJCSBwcml2LT5kZWJ1Zy5yeF9zdGF0cy5lcnJfcGh5X3N0YXRzW3BdKTsKLQogCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyICpidWY7CiAJdW5zaWduZWQgaW50IGxlbiA9IDAsIHNpemUgPSAxNTAwOwpAQCAtMjg3LDYzICsyNjIsMTMgQEAKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAogCQkJICIlMjBzIDogJTEwdVxuIiwgIlNLQnMgYWxsb2NhdGVkIiwKLQkJCSBwcml2LT5kZWJ1Zy5yeF9zdGF0cy5za2JfYWxsb2NhdGVkKTsKKwkJCSBwcml2LT5kZWJ1Zy5za2JyeF9zdGF0cy5za2JfYWxsb2NhdGVkKTsKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKIAkJCSAiJTIwcyA6ICUxMHVcbiIsICJTS0JzIGNvbXBsZXRlZCIsCi0JCQkgcHJpdi0+ZGVidWcucnhfc3RhdHMuc2tiX2NvbXBsZXRlZCk7CisJCQkgcHJpdi0+ZGVidWcuc2ticnhfc3RhdHMuc2tiX2NvbXBsZXRlZCk7CiAJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCiAJCQkgIiUyMHMgOiAlMTB1XG4iLCAiU0tCcyBEcm9wcGVkIiwKLQkJCSBwcml2LT5kZWJ1Zy5yeF9zdGF0cy5za2JfZHJvcHBlZCk7Ci0KLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCSAiJTIwcyA6ICUxMHVcbiIsICJDUkMgRVJSIiwKLQkJCSBwcml2LT5kZWJ1Zy5yeF9zdGF0cy5lcnJfY3JjKTsKLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCSAiJTIwcyA6ICUxMHVcbiIsICJERUNSWVBUIENSQyBFUlIiLAotCQkJIHByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9kZWNyeXB0X2NyYyk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTB1XG4iLCAiTUlDIEVSUiIsCi0JCQkgcHJpdi0+ZGVidWcucnhfc3RhdHMuZXJyX21pYyk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTB1XG4iLCAiUFJFLURFTElNIENSQyBFUlIiLAotCQkJIHByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9wcmVfZGVsaW0pOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwdVxuIiwgIlBPU1QtREVMSU0gQ1JDIEVSUiIsCi0JCQkgcHJpdi0+ZGVidWcucnhfc3RhdHMuZXJyX3Bvc3RfZGVsaW0pOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwdVxuIiwgIkRFQ1JZUFQgQlVTWSBFUlIiLAotCQkJIHByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9kZWNyeXB0X2J1c3kpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwdVxuIiwgIlRPVEFMIFBIWSBFUlIiLAotCQkJIHByaXYtPmRlYnVnLnJ4X3N0YXRzLmVycl9waHkpOwotCi0KLQlQSFlfRVJSKCJVTkRFUlJVTiIsIEFUSDlLX1BIWUVSUl9VTkRFUlJVTik7Ci0JUEhZX0VSUigiVElNSU5HIiwgQVRIOUtfUEhZRVJSX1RJTUlORyk7Ci0JUEhZX0VSUigiUEFSSVRZIiwgQVRIOUtfUEhZRVJSX1BBUklUWSk7Ci0JUEhZX0VSUigiUkFURSIsIEFUSDlLX1BIWUVSUl9SQVRFKTsKLQlQSFlfRVJSKCJMRU5HVEgiLCBBVEg5S19QSFlFUlJfTEVOR1RIKTsKLQlQSFlfRVJSKCJSQURBUiIsIEFUSDlLX1BIWUVSUl9SQURBUik7Ci0JUEhZX0VSUigiU0VSVklDRSIsIEFUSDlLX1BIWUVSUl9TRVJWSUNFKTsKLQlQSFlfRVJSKCJUT1IiLCBBVEg5S19QSFlFUlJfVE9SKTsKLQlQSFlfRVJSKCJPRkRNLVRJTUlORyIsIEFUSDlLX1BIWUVSUl9PRkRNX1RJTUlORyk7Ci0JUEhZX0VSUigiT0ZETS1TSUdOQUwtUEFSSVRZIiwgQVRIOUtfUEhZRVJSX09GRE1fU0lHTkFMX1BBUklUWSk7Ci0JUEhZX0VSUigiT0ZETS1SQVRFIiwgQVRIOUtfUEhZRVJSX09GRE1fUkFURV9JTExFR0FMKTsKLQlQSFlfRVJSKCJPRkRNLUxFTkdUSCIsIEFUSDlLX1BIWUVSUl9PRkRNX0xFTkdUSF9JTExFR0FMKTsKLQlQSFlfRVJSKCJPRkRNLVBPV0VSLURST1AiLCBBVEg5S19QSFlFUlJfT0ZETV9QT1dFUl9EUk9QKTsKLQlQSFlfRVJSKCJPRkRNLVNFUlZJQ0UiLCBBVEg5S19QSFlFUlJfT0ZETV9TRVJWSUNFKTsKLQlQSFlfRVJSKCJPRkRNLVJFU1RBUlQiLCBBVEg5S19QSFlFUlJfT0ZETV9SRVNUQVJUKTsKLQlQSFlfRVJSKCJGQUxTRS1SQURBUi1FWFQiLCBBVEg5S19QSFlFUlJfRkFMU0VfUkFEQVJfRVhUKTsKLQlQSFlfRVJSKCJDQ0stVElNSU5HIiwgQVRIOUtfUEhZRVJSX0NDS19USU1JTkcpOwotCVBIWV9FUlIoIkNDSy1IRUFERVItQ1JDIiwgQVRIOUtfUEhZRVJSX0NDS19IRUFERVJfQ1JDKTsKLQlQSFlfRVJSKCJDQ0stUkFURSIsIEFUSDlLX1BIWUVSUl9DQ0tfUkFURV9JTExFR0FMKTsKLQlQSFlfRVJSKCJDQ0stU0VSVklDRSIsIEFUSDlLX1BIWUVSUl9DQ0tfU0VSVklDRSk7Ci0JUEhZX0VSUigiQ0NLLVJFU1RBUlQiLCBBVEg5S19QSFlFUlJfQ0NLX1JFU1RBUlQpOwotCVBIWV9FUlIoIkNDSy1MRU5HVEgiLCBBVEg5S19QSFlFUlJfQ0NLX0xFTkdUSF9JTExFR0FMKTsKLQlQSFlfRVJSKCJDQ0stUE9XRVItRFJPUCIsIEFUSDlLX1BIWUVSUl9DQ0tfUE9XRVJfRFJPUCk7Ci0JUEhZX0VSUigiSFQtQ1JDIiwgQVRIOUtfUEhZRVJSX0hUX0NSQ19FUlJPUik7Ci0JUEhZX0VSUigiSFQtTEVOR1RIIiwgQVRIOUtfUEhZRVJSX0hUX0xFTkdUSF9JTExFR0FMKTsKLQlQSFlfRVJSKCJIVC1SQVRFIiwgQVRIOUtfUEhZRVJSX0hUX1JBVEVfSUxMRUdBTCk7CisJCQkgcHJpdi0+ZGVidWcuc2ticnhfc3RhdHMuc2tiX2Ryb3BwZWQpOwogCiAJaWYgKGxlbiA+IHNpemUpCiAJCWxlbiA9IHNpemU7CkBAIC0zNTIsMTIgKzI3NywxMCBAQAogCWtmcmVlKGJ1Zik7CiAKIAlyZXR1cm4gcmV0dmFsOwotCi0jdW5kZWYgUEhZX0VSUgogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX3JlY3YgPSB7Ci0JLnJlYWQgPSByZWFkX2ZpbGVfcmVjdiwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfc2tiX3J4ID0geworCS5yZWFkID0gcmVhZF9maWxlX3NrYl9yeCwKIAkub3BlbiA9IHNpbXBsZV9vcGVuLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKQEAgLTQ4Niw0MjMgKzQwOSw2IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAotc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX2Jhc2VfZWVwcm9tKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCk7Ci0Jc3RydWN0IGJhc2VfZWVwX2hlYWRlciAqcEJhc2UgPSBOVUxMOwotCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMTUwMDsKLQlzc2l6ZV90IHJldHZhbCA9IDA7Ci0JY2hhciAqYnVmOwotCi0JcEJhc2UgPSBhdGg5a19odGNfZ2V0X2VlcHJvbV9iYXNlKHByaXYpOwotCi0JaWYgKHBCYXNlID09IE5VTEwpIHsKLQkJYXRoX2Vycihjb21tb24sICJVbmtub3duIEVFUFJPTSB0eXBlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLCAiTWFqb3IgVmVyc2lvbiIsCi0JCQkgcEJhc2UtPnZlcnNpb24gPj4gMTIpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwgIk1pbm9yIFZlcnNpb24iLAotCQkJIHBCYXNlLT52ZXJzaW9uICYgMHhGRkYpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwgIkNoZWNrc3VtIiwKLQkJCSBwQmFzZS0+Y2hlY2tzdW0pOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwgIkxlbmd0aCIsCi0JCQkgcEJhc2UtPmxlbmd0aCk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLCAiUmVnRG9tYWluMSIsCi0JCQkgcEJhc2UtPnJlZ0RtblswXSk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLCAiUmVnRG9tYWluMiIsCi0JCQkgcEJhc2UtPnJlZ0RtblsxXSk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLAotCQkJICJUWCBNYXNrIiwgcEJhc2UtPnR4TWFzayk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLAotCQkJICJSWCBNYXNrIiwgcEJhc2UtPnJ4TWFzayk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLAotCQkJICJBbGxvdyA1R0h6IiwKLQkJCSAhIShwQmFzZS0+b3BDYXBGbGFncyAmIEFSNTQxNl9PUEZMQUdTXzExQSkpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwKLQkJCSAiQWxsb3cgMkdIeiIsCi0JCQkgISEocEJhc2UtPm9wQ2FwRmxhZ3MgJiBBUjU0MTZfT1BGTEFHU18xMUcpKTsKLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCSAiJTIwcyA6ICUxMGRcbiIsCi0JCQkgIkRpc2FibGUgMkdIeiBIVDIwIiwKLQkJCSAhIShwQmFzZS0+b3BDYXBGbGFncyAmIEFSNTQxNl9PUEZMQUdTX05fMkdfSFQyMCkpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwKLQkJCSAiRGlzYWJsZSAyR0h6IEhUNDAiLAotCQkJICEhKHBCYXNlLT5vcENhcEZsYWdzICYgQVI1NDE2X09QRkxBR1NfTl8yR19IVDQwKSk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLAotCQkJICJEaXNhYmxlIDVHaHogSFQyMCIsCi0JCQkgISEocEJhc2UtPm9wQ2FwRmxhZ3MgJiBBUjU0MTZfT1BGTEFHU19OXzVHX0hUMjApKTsKLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCSAiJTIwcyA6ICUxMGRcbiIsCi0JCQkgIkRpc2FibGUgNUdoeiBIVDQwIiwKLQkJCSAhIShwQmFzZS0+b3BDYXBGbGFncyAmIEFSNTQxNl9PUEZMQUdTX05fNUdfSFQ0MCkpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwKLQkJCSAiQmlnIEVuZGlhbiIsCi0JCQkgISEocEJhc2UtPmVlcE1pc2MgJiAweDAxKSk7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUyMHMgOiAlMTBkXG4iLAotCQkJICJDYWwgQmluIE1ham9yIFZlciIsCi0JCQkgKHBCYXNlLT5iaW5CdWlsZE51bWJlciA+PiAyNCkgJiAweEZGKTsKLQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCSAiJTIwcyA6ICUxMGRcbiIsCi0JCQkgIkNhbCBCaW4gTWlub3IgVmVyIiwKLQkJCSAocEJhc2UtPmJpbkJ1aWxkTnVtYmVyID4+IDE2KSAmIDB4RkYpOwotCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJICIlMjBzIDogJTEwZFxuIiwKLQkJCSAiQ2FsIEJpbiBCdWlsZCIsCi0JCQkgKHBCYXNlLT5iaW5CdWlsZE51bWJlciA+PiA4KSAmIDB4RkYpOwotCi0JLyoKLQkgKiBVQjkxIHNwZWNpZmljIGRhdGEuCi0JICovCi0JaWYgKEFSX1NSRVZfOTI3MShwcml2LT5haCkpIHsKLQkJc3RydWN0IGJhc2VfZWVwX2hlYWRlcl80ayAqcEJhc2U0ayA9Ci0JCQkmcHJpdi0+YWgtPmVlcHJvbS5tYXA0ay5iYXNlRWVwSGVhZGVyOwotCi0JCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJCSAiJTIwcyA6ICUxMGRcbiIsCi0JCQkJICJUWCBHYWluIHR5cGUiLAotCQkJCSBwQmFzZTRrLT50eEdhaW5UeXBlKTsKLQl9Ci0KLQkvKgotCSAqIFVCOTUgc3BlY2lmaWMgZGF0YS4KLQkgKi8KLQlpZiAocHJpdi0+YWgtPmh3X3ZlcnNpb24udXNiZGV2ID09IEFSOTI4N19VU0IpIHsKLQkJc3RydWN0IGJhc2VfZWVwX2FyOTI4N19oZWFkZXIgKnBCYXNlOTI4NyA9Ci0JCQkmcHJpdi0+YWgtPmVlcHJvbS5tYXA5Mjg3LmJhc2VFZXBIZWFkZXI7Ci0KLQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkJICIlMjBzIDogJTEwZGRCXG4iLAotCQkJCSAiUG93ZXIgVGFibGUgT2Zmc2V0IiwKLQkJCQkgcEJhc2U5Mjg3LT5wd3JUYWJsZU9mZnNldCk7Ci0KLQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkJICIlMjBzIDogJTEwZFxuIiwKLQkJCQkgIk9wZW5Mb29wIFBvd2VyIEN0cmwiLAotCQkJCSBwQmFzZTkyODctPm9wZW5Mb29wUHdyQ250bCk7Ci0JfQotCi0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlMjBzIDogJXBNXG4iLCAiTWFjQWRkcmVzcyIsCi0JCQkgcEJhc2UtPm1hY0FkZHIpOwotCWlmIChsZW4gPiBzaXplKQotCQlsZW4gPSBzaXplOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfYmFzZV9lZXByb20gPSB7Ci0JLnJlYWQgPSByZWFkX2ZpbGVfYmFzZV9lZXByb20sCi0JLm9wZW4gPSBzaW1wbGVfb3BlbiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgc3NpemVfdCByZWFkXzRrX21vZGFsX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSNkZWZpbmUgUFJfRUVQKF9zLCBfdmFsKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTIwcyA6ICUxMGRcbiIsXAotCQkJCSBfcywgKF92YWwpKTsJCQkJXAotCX0gd2hpbGUgKDApCi0KLQlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1vZGFsX2VlcF80a19oZWFkZXIgKnBNb2RhbCA9ICZwcml2LT5haC0+ZWVwcm9tLm1hcDRrLm1vZGFsSGVhZGVyOwotCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMjA0ODsKLQlzc2l6ZV90IHJldHZhbCA9IDA7Ci0JY2hhciAqYnVmOwotCi0JYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JUFJfRUVQKCJDaGFpbjAgQW50LiBDb250cm9sIiwgcE1vZGFsLT5hbnRDdHJsQ2hhaW5bMF0pOwotCVBSX0VFUCgiQW50LiBDb21tb24gQ29udHJvbCIsIHBNb2RhbC0+YW50Q3RybENvbW1vbik7Ci0JUFJfRUVQKCJDaGFpbjAgQW50LiBHYWluIiwgcE1vZGFsLT5hbnRlbm5hR2FpbkNoWzBdKTsKLQlQUl9FRVAoIlN3aXRjaCBTZXR0bGUiLCBwTW9kYWwtPnN3aXRjaFNldHRsaW5nKTsKLQlQUl9FRVAoIkNoYWluMCBUeFJ4QXR0ZW4iLCBwTW9kYWwtPnR4UnhBdHRlbkNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMCBSeFR4TWFyZ2luIiwgcE1vZGFsLT5yeFR4TWFyZ2luQ2hbMF0pOwotCVBSX0VFUCgiQURDIERlc2lyZWQgc2l6ZSIsIHBNb2RhbC0+YWRjRGVzaXJlZFNpemUpOwotCVBSX0VFUCgiUEdBIERlc2lyZWQgc2l6ZSIsIHBNb2RhbC0+cGdhRGVzaXJlZFNpemUpOwotCVBSX0VFUCgiQ2hhaW4wIHhsbmEgR2FpbiIsIHBNb2RhbC0+eGxuYUdhaW5DaFswXSk7Ci0JUFJfRUVQKCJ0eEVuZFRvWHBhT2ZmIiwgcE1vZGFsLT50eEVuZFRvWHBhT2ZmKTsKLQlQUl9FRVAoInR4RW5kVG9SeE9uIiwgcE1vZGFsLT50eEVuZFRvUnhPbik7Ci0JUFJfRUVQKCJ0eEZyYW1lVG9YcGFPbiIsIHBNb2RhbC0+dHhGcmFtZVRvWHBhT24pOwotCVBSX0VFUCgiQ0NBIFRocmVzaG9sZCkiLCBwTW9kYWwtPnRocmVzaDYyKTsKLQlQUl9FRVAoIkNoYWluMCBORiBUaHJlc2hvbGQiLCBwTW9kYWwtPm5vaXNlRmxvb3JUaHJlc2hDaFswXSk7Ci0JUFJfRUVQKCJ4cGRHYWluIiwgcE1vZGFsLT54cGRHYWluKTsKLQlQUl9FRVAoIkV4dGVybmFsIFBEIiwgcE1vZGFsLT54cGQpOwotCVBSX0VFUCgiQ2hhaW4wIEkgQ29lZmZpY2llbnQiLCBwTW9kYWwtPmlxQ2FsSUNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMCBRIENvZWZmaWNpZW50IiwgcE1vZGFsLT5pcUNhbFFDaFswXSk7Ci0JUFJfRUVQKCJwZEdhaW5PdmVybGFwIiwgcE1vZGFsLT5wZEdhaW5PdmVybGFwKTsKLQlQUl9FRVAoIk8vRCBCaWFzIFZlcnNpb24iLCBwTW9kYWwtPnZlcnNpb24pOwotCVBSX0VFUCgiQ0NLIE91dHB1dEJpYXMiLCBwTW9kYWwtPm9iXzApOwotCVBSX0VFUCgiQlBTSyBPdXRwdXRCaWFzIiwgcE1vZGFsLT5vYl8xKTsKLQlQUl9FRVAoIlFQU0sgT3V0cHV0QmlhcyIsIHBNb2RhbC0+b2JfMik7Ci0JUFJfRUVQKCIxNlFBTSBPdXRwdXRCaWFzIiwgcE1vZGFsLT5vYl8zKTsKLQlQUl9FRVAoIjY0UUFNIE91dHB1dEJpYXMiLCBwTW9kYWwtPm9iXzQpOwotCVBSX0VFUCgiQ0NLIERyaXZlcjFfQmlhcyIsIHBNb2RhbC0+ZGIxXzApOwotCVBSX0VFUCgiQlBTSyBEcml2ZXIxX0JpYXMiLCBwTW9kYWwtPmRiMV8xKTsKLQlQUl9FRVAoIlFQU0sgRHJpdmVyMV9CaWFzIiwgcE1vZGFsLT5kYjFfMik7Ci0JUFJfRUVQKCIxNlFBTSBEcml2ZXIxX0JpYXMiLCBwTW9kYWwtPmRiMV8zKTsKLQlQUl9FRVAoIjY0UUFNIERyaXZlcjFfQmlhcyIsIHBNb2RhbC0+ZGIxXzQpOwotCVBSX0VFUCgiQ0NLIERyaXZlcjJfQmlhcyIsIHBNb2RhbC0+ZGIyXzApOwotCVBSX0VFUCgiQlBTSyBEcml2ZXIyX0JpYXMiLCBwTW9kYWwtPmRiMl8xKTsKLQlQUl9FRVAoIlFQU0sgRHJpdmVyMl9CaWFzIiwgcE1vZGFsLT5kYjJfMik7Ci0JUFJfRUVQKCIxNlFBTSBEcml2ZXIyX0JpYXMiLCBwTW9kYWwtPmRiMl8zKTsKLQlQUl9FRVAoIjY0UUFNIERyaXZlcjJfQmlhcyIsIHBNb2RhbC0+ZGIyXzQpOwotCVBSX0VFUCgieFBBIEJpYXMgTGV2ZWwiLCBwTW9kYWwtPnhwYUJpYXNMdmwpOwotCVBSX0VFUCgidHhGcmFtZVRvRGF0YVN0YXJ0IiwgcE1vZGFsLT50eEZyYW1lVG9EYXRhU3RhcnQpOwotCVBSX0VFUCgidHhGcmFtZVRvUGFPbiIsIHBNb2RhbC0+dHhGcmFtZVRvUGFPbik7Ci0JUFJfRUVQKCJIVDQwIFBvd2VyIEluYy4iLCBwTW9kYWwtPmh0NDBQb3dlckluY0ZvclBkYWRjKTsKLQlQUl9FRVAoIkNoYWluMCBic3dBdHRlbiIsIHBNb2RhbC0+YnN3QXR0ZW5bMF0pOwotCVBSX0VFUCgiQ2hhaW4wIGJzd01hcmdpbiIsIHBNb2RhbC0+YnN3TWFyZ2luWzBdKTsKLQlQUl9FRVAoIkhUNDAgU3dpdGNoIFNldHRsZSIsIHBNb2RhbC0+c3dTZXR0bGVIdDQwKTsKLQlQUl9FRVAoIkNoYWluMCB4YXR0ZW4yRGIiLCBwTW9kYWwtPnhhdHRlbjJEYlswXSk7Ci0JUFJfRUVQKCJDaGFpbjAgeGF0dGVuMk1hcmdpbiIsIHBNb2RhbC0+eGF0dGVuMk1hcmdpblswXSk7Ci0JUFJfRUVQKCJBbnQuIERpdmVyc2l0eSBjdGwxIiwgcE1vZGFsLT5hbnRkaXZfY3RsMSk7Ci0JUFJfRUVQKCJBbnQuIERpdmVyc2l0eSBjdGwyIiwgcE1vZGFsLT5hbnRkaXZfY3RsMik7Ci0JUFJfRUVQKCJUWCBEaXZlcnNpdHkiLCBwTW9kYWwtPnR4X2RpdmVyc2l0eSk7Ci0KLQlpZiAobGVuID4gc2l6ZSkKLQkJbGVuID0gc2l6ZTsKLQotCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwotCWtmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotCi0jdW5kZWYgUFJfRUVQCi19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlYWRfZGVmX21vZGFsX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotI2RlZmluZSBQUl9FRVAoX3MsIF92YWwpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKHBCYXNlLT5vcENhcEZsYWdzICYgQVI1NDE2X09QRkxBR1NfMTFHKSB7CQlcCi0JCQlwTW9kYWwgPSAmcHJpdi0+YWgtPmVlcHJvbS5kZWYubW9kYWxIZWFkZXJbMV07CVwKLQkJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTIwcyA6ICU4ZCU3cyIsIFwKLQkJCQkJIF9zLCAoX3ZhbCksICJ8Iik7CQlcCi0JCX0JCQkJCQkJXAotCQlpZiAocEJhc2UtPm9wQ2FwRmxhZ3MgJiBBUjU0MTZfT1BGTEFHU18xMUEpIHsJCVwKLQkJCXBNb2RhbCA9ICZwcml2LT5haC0+ZWVwcm9tLmRlZi5tb2RhbEhlYWRlclswXTsJXAotCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlOWRcbiIsXAotCQkJCQkoX3ZhbCkpOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmFzZV9lZXBfaGVhZGVyICpwQmFzZSA9ICZwcml2LT5haC0+ZWVwcm9tLmRlZi5iYXNlRWVwSGVhZGVyOwotCXN0cnVjdCBtb2RhbF9lZXBfaGVhZGVyICpwTW9kYWwgPSBOVUxMOwotCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMzUwMDsKLQlzc2l6ZV90IHJldHZhbCA9IDA7Ci0JY2hhciAqYnVmOwotCi0JYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUzMXMgJTE1c1xuIiwgIjJHIiwgIjVHIik7Ci0JbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkgIiUzMnMgJTE2c1xuIiwgIj09PT0iLCAiPT09PVxuIik7Ci0KLQlQUl9FRVAoIkNoYWluMCBBbnQuIENvbnRyb2wiLCBwTW9kYWwtPmFudEN0cmxDaGFpblswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgQW50LiBDb250cm9sIiwgcE1vZGFsLT5hbnRDdHJsQ2hhaW5bMV0pOwotCVBSX0VFUCgiQ2hhaW4yIEFudC4gQ29udHJvbCIsIHBNb2RhbC0+YW50Q3RybENoYWluWzJdKTsKLQlQUl9FRVAoIkFudC4gQ29tbW9uIENvbnRyb2wiLCBwTW9kYWwtPmFudEN0cmxDb21tb24pOwotCVBSX0VFUCgiQ2hhaW4wIEFudC4gR2FpbiIsIHBNb2RhbC0+YW50ZW5uYUdhaW5DaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgQW50LiBHYWluIiwgcE1vZGFsLT5hbnRlbm5hR2FpbkNoWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBBbnQuIEdhaW4iLCBwTW9kYWwtPmFudGVubmFHYWluQ2hbMl0pOwotCVBSX0VFUCgiU3dpdGNoIFNldHRsZSIsIHBNb2RhbC0+c3dpdGNoU2V0dGxpbmcpOwotCVBSX0VFUCgiQ2hhaW4wIFR4UnhBdHRlbiIsIHBNb2RhbC0+dHhSeEF0dGVuQ2hbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIFR4UnhBdHRlbiIsIHBNb2RhbC0+dHhSeEF0dGVuQ2hbMV0pOwotCVBSX0VFUCgiQ2hhaW4yIFR4UnhBdHRlbiIsIHBNb2RhbC0+dHhSeEF0dGVuQ2hbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIFJ4VHhNYXJnaW4iLCBwTW9kYWwtPnJ4VHhNYXJnaW5DaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgUnhUeE1hcmdpbiIsIHBNb2RhbC0+cnhUeE1hcmdpbkNoWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBSeFR4TWFyZ2luIiwgcE1vZGFsLT5yeFR4TWFyZ2luQ2hbMl0pOwotCVBSX0VFUCgiQURDIERlc2lyZWQgc2l6ZSIsIHBNb2RhbC0+YWRjRGVzaXJlZFNpemUpOwotCVBSX0VFUCgiUEdBIERlc2lyZWQgc2l6ZSIsIHBNb2RhbC0+cGdhRGVzaXJlZFNpemUpOwotCVBSX0VFUCgiQ2hhaW4wIHhsbmEgR2FpbiIsIHBNb2RhbC0+eGxuYUdhaW5DaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgeGxuYSBHYWluIiwgcE1vZGFsLT54bG5hR2FpbkNoWzFdKTsKLQlQUl9FRVAoIkNoYWluMiB4bG5hIEdhaW4iLCBwTW9kYWwtPnhsbmFHYWluQ2hbMl0pOwotCVBSX0VFUCgidHhFbmRUb1hwYU9mZiIsIHBNb2RhbC0+dHhFbmRUb1hwYU9mZik7Ci0JUFJfRUVQKCJ0eEVuZFRvUnhPbiIsIHBNb2RhbC0+dHhFbmRUb1J4T24pOwotCVBSX0VFUCgidHhGcmFtZVRvWHBhT24iLCBwTW9kYWwtPnR4RnJhbWVUb1hwYU9uKTsKLQlQUl9FRVAoIkNDQSBUaHJlc2hvbGQpIiwgcE1vZGFsLT50aHJlc2g2Mik7Ci0JUFJfRUVQKCJDaGFpbjAgTkYgVGhyZXNob2xkIiwgcE1vZGFsLT5ub2lzZUZsb29yVGhyZXNoQ2hbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIE5GIFRocmVzaG9sZCIsIHBNb2RhbC0+bm9pc2VGbG9vclRocmVzaENoWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBORiBUaHJlc2hvbGQiLCBwTW9kYWwtPm5vaXNlRmxvb3JUaHJlc2hDaFsyXSk7Ci0JUFJfRUVQKCJ4cGRHYWluIiwgcE1vZGFsLT54cGRHYWluKTsKLQlQUl9FRVAoIkV4dGVybmFsIFBEIiwgcE1vZGFsLT54cGQpOwotCVBSX0VFUCgiQ2hhaW4wIEkgQ29lZmZpY2llbnQiLCBwTW9kYWwtPmlxQ2FsSUNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBJIENvZWZmaWNpZW50IiwgcE1vZGFsLT5pcUNhbElDaFsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgSSBDb2VmZmljaWVudCIsIHBNb2RhbC0+aXFDYWxJQ2hbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIFEgQ29lZmZpY2llbnQiLCBwTW9kYWwtPmlxQ2FsUUNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBRIENvZWZmaWNpZW50IiwgcE1vZGFsLT5pcUNhbFFDaFsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgUSBDb2VmZmljaWVudCIsIHBNb2RhbC0+aXFDYWxRQ2hbMl0pOwotCVBSX0VFUCgicGRHYWluT3ZlcmxhcCIsIHBNb2RhbC0+cGRHYWluT3ZlcmxhcCk7Ci0JUFJfRUVQKCJDaGFpbjAgT3V0cHV0QmlhcyIsIHBNb2RhbC0+b2IpOwotCVBSX0VFUCgiQ2hhaW4wIERyaXZlckJpYXMiLCBwTW9kYWwtPmRiKTsKLQlQUl9FRVAoInhQQSBCaWFzIExldmVsIiwgcE1vZGFsLT54cGFCaWFzTHZsKTsKLQlQUl9FRVAoIjJjaGFpbiBwd3IgZGVjcmVhc2UiLCBwTW9kYWwtPnB3ckRlY3JlYXNlRm9yMkNoYWluKTsKLQlQUl9FRVAoIjNjaGFpbiBwd3IgZGVjcmVhc2UiLCBwTW9kYWwtPnB3ckRlY3JlYXNlRm9yM0NoYWluKTsKLQlQUl9FRVAoInR4RnJhbWVUb0RhdGFTdGFydCIsIHBNb2RhbC0+dHhGcmFtZVRvRGF0YVN0YXJ0KTsKLQlQUl9FRVAoInR4RnJhbWVUb1BhT24iLCBwTW9kYWwtPnR4RnJhbWVUb1BhT24pOwotCVBSX0VFUCgiSFQ0MCBQb3dlciBJbmMuIiwgcE1vZGFsLT5odDQwUG93ZXJJbmNGb3JQZGFkYyk7Ci0JUFJfRUVQKCJDaGFpbjAgYnN3QXR0ZW4iLCBwTW9kYWwtPmJzd0F0dGVuWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBic3dBdHRlbiIsIHBNb2RhbC0+YnN3QXR0ZW5bMV0pOwotCVBSX0VFUCgiQ2hhaW4yIGJzd0F0dGVuIiwgcE1vZGFsLT5ic3dBdHRlblsyXSk7Ci0JUFJfRUVQKCJDaGFpbjAgYnN3TWFyZ2luIiwgcE1vZGFsLT5ic3dNYXJnaW5bMF0pOwotCVBSX0VFUCgiQ2hhaW4xIGJzd01hcmdpbiIsIHBNb2RhbC0+YnN3TWFyZ2luWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBic3dNYXJnaW4iLCBwTW9kYWwtPmJzd01hcmdpblsyXSk7Ci0JUFJfRUVQKCJIVDQwIFN3aXRjaCBTZXR0bGUiLCBwTW9kYWwtPnN3U2V0dGxlSHQ0MCk7Ci0JUFJfRUVQKCJDaGFpbjAgeGF0dGVuMkRiIiwgcE1vZGFsLT54YXR0ZW4yRGJbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIHhhdHRlbjJEYiIsIHBNb2RhbC0+eGF0dGVuMkRiWzFdKTsKLQlQUl9FRVAoIkNoYWluMiB4YXR0ZW4yRGIiLCBwTW9kYWwtPnhhdHRlbjJEYlsyXSk7Ci0JUFJfRUVQKCJDaGFpbjAgeGF0dGVuMk1hcmdpbiIsIHBNb2RhbC0+eGF0dGVuMk1hcmdpblswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgeGF0dGVuMk1hcmdpbiIsIHBNb2RhbC0+eGF0dGVuMk1hcmdpblsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgeGF0dGVuMk1hcmdpbiIsIHBNb2RhbC0+eGF0dGVuMk1hcmdpblsyXSk7Ci0JUFJfRUVQKCJDaGFpbjEgT3V0cHV0QmlhcyIsIHBNb2RhbC0+b2JfY2gxKTsKLQlQUl9FRVAoIkNoYWluMSBEcml2ZXJCaWFzIiwgcE1vZGFsLT5kYl9jaDEpOwotCVBSX0VFUCgiTE5BIENvbnRyb2wiLCBwTW9kYWwtPmxuYV9jdGwpOwotCVBSX0VFUCgiWFBBIEJpYXMgRnJlcTAiLCBwTW9kYWwtPnhwYUJpYXNMdmxGcmVxWzBdKTsKLQlQUl9FRVAoIlhQQSBCaWFzIEZyZXExIiwgcE1vZGFsLT54cGFCaWFzTHZsRnJlcVsxXSk7Ci0JUFJfRUVQKCJYUEEgQmlhcyBGcmVxMiIsIHBNb2RhbC0+eHBhQmlhc0x2bEZyZXFbMl0pOwotCi0JaWYgKGxlbiA+IHNpemUpCi0JCWxlbiA9IHNpemU7Ci0KLQlyZXR2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKLQlrZnJlZShidWYpOwotCi0JcmV0dXJuIHJldHZhbDsKLQotI3VuZGVmIFBSX0VFUAotfQotCi1zdGF0aWMgc3NpemVfdCByZWFkXzkyODdfbW9kYWxfZWVwcm9tKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSNkZWZpbmUgUFJfRUVQKF9zLCBfdmFsKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTIwcyA6ICUxMGRcbiIsXAotCQkJCSBfcywgKF92YWwpKTsJCQkJXAotCX0gd2hpbGUgKDApCi0KLQlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1vZGFsX2VlcF9hcjkyODdfaGVhZGVyICpwTW9kYWwgPSAmcHJpdi0+YWgtPmVlcHJvbS5tYXA5Mjg3Lm1vZGFsSGVhZGVyOwotCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gMzAwMDsKLQlzc2l6ZV90IHJldHZhbCA9IDA7Ci0JY2hhciAqYnVmOwotCi0JYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JUFJfRUVQKCJDaGFpbjAgQW50LiBDb250cm9sIiwgcE1vZGFsLT5hbnRDdHJsQ2hhaW5bMF0pOwotCVBSX0VFUCgiQ2hhaW4xIEFudC4gQ29udHJvbCIsIHBNb2RhbC0+YW50Q3RybENoYWluWzFdKTsKLQlQUl9FRVAoIkFudC4gQ29tbW9uIENvbnRyb2wiLCBwTW9kYWwtPmFudEN0cmxDb21tb24pOwotCVBSX0VFUCgiQ2hhaW4wIEFudC4gR2FpbiIsIHBNb2RhbC0+YW50ZW5uYUdhaW5DaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgQW50LiBHYWluIiwgcE1vZGFsLT5hbnRlbm5hR2FpbkNoWzFdKTsKLQlQUl9FRVAoIlN3aXRjaCBTZXR0bGUiLCBwTW9kYWwtPnN3aXRjaFNldHRsaW5nKTsKLQlQUl9FRVAoIkNoYWluMCBUeFJ4QXR0ZW4iLCBwTW9kYWwtPnR4UnhBdHRlbkNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBUeFJ4QXR0ZW4iLCBwTW9kYWwtPnR4UnhBdHRlbkNoWzFdKTsKLQlQUl9FRVAoIkNoYWluMCBSeFR4TWFyZ2luIiwgcE1vZGFsLT5yeFR4TWFyZ2luQ2hbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIFJ4VHhNYXJnaW4iLCBwTW9kYWwtPnJ4VHhNYXJnaW5DaFsxXSk7Ci0JUFJfRUVQKCJBREMgRGVzaXJlZCBzaXplIiwgcE1vZGFsLT5hZGNEZXNpcmVkU2l6ZSk7Ci0JUFJfRUVQKCJ0eEVuZFRvWHBhT2ZmIiwgcE1vZGFsLT50eEVuZFRvWHBhT2ZmKTsKLQlQUl9FRVAoInR4RW5kVG9SeE9uIiwgcE1vZGFsLT50eEVuZFRvUnhPbik7Ci0JUFJfRUVQKCJ0eEZyYW1lVG9YcGFPbiIsIHBNb2RhbC0+dHhGcmFtZVRvWHBhT24pOwotCVBSX0VFUCgiQ0NBIFRocmVzaG9sZCkiLCBwTW9kYWwtPnRocmVzaDYyKTsKLQlQUl9FRVAoIkNoYWluMCBORiBUaHJlc2hvbGQiLCBwTW9kYWwtPm5vaXNlRmxvb3JUaHJlc2hDaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgTkYgVGhyZXNob2xkIiwgcE1vZGFsLT5ub2lzZUZsb29yVGhyZXNoQ2hbMV0pOwotCVBSX0VFUCgieHBkR2FpbiIsIHBNb2RhbC0+eHBkR2Fpbik7Ci0JUFJfRUVQKCJFeHRlcm5hbCBQRCIsIHBNb2RhbC0+eHBkKTsKLQlQUl9FRVAoIkNoYWluMCBJIENvZWZmaWNpZW50IiwgcE1vZGFsLT5pcUNhbElDaFswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgSSBDb2VmZmljaWVudCIsIHBNb2RhbC0+aXFDYWxJQ2hbMV0pOwotCVBSX0VFUCgiQ2hhaW4wIFEgQ29lZmZpY2llbnQiLCBwTW9kYWwtPmlxQ2FsUUNoWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBRIENvZWZmaWNpZW50IiwgcE1vZGFsLT5pcUNhbFFDaFsxXSk7Ci0JUFJfRUVQKCJwZEdhaW5PdmVybGFwIiwgcE1vZGFsLT5wZEdhaW5PdmVybGFwKTsKLQlQUl9FRVAoInhQQSBCaWFzIExldmVsIiwgcE1vZGFsLT54cGFCaWFzTHZsKTsKLQlQUl9FRVAoInR4RnJhbWVUb0RhdGFTdGFydCIsIHBNb2RhbC0+dHhGcmFtZVRvRGF0YVN0YXJ0KTsKLQlQUl9FRVAoInR4RnJhbWVUb1BhT24iLCBwTW9kYWwtPnR4RnJhbWVUb1BhT24pOwotCVBSX0VFUCgiSFQ0MCBQb3dlciBJbmMuIiwgcE1vZGFsLT5odDQwUG93ZXJJbmNGb3JQZGFkYyk7Ci0JUFJfRUVQKCJDaGFpbjAgYnN3QXR0ZW4iLCBwTW9kYWwtPmJzd0F0dGVuWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBic3dBdHRlbiIsIHBNb2RhbC0+YnN3QXR0ZW5bMV0pOwotCVBSX0VFUCgiQ2hhaW4wIGJzd01hcmdpbiIsIHBNb2RhbC0+YnN3TWFyZ2luWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBic3dNYXJnaW4iLCBwTW9kYWwtPmJzd01hcmdpblsxXSk7Ci0JUFJfRUVQKCJIVDQwIFN3aXRjaCBTZXR0bGUiLCBwTW9kYWwtPnN3U2V0dGxlSHQ0MCk7Ci0JUFJfRUVQKCJBUjkyeDcgVmVyc2lvbiIsIHBNb2RhbC0+dmVyc2lvbik7Ci0JUFJfRUVQKCJEcml2ZXJCaWFzMSIsIHBNb2RhbC0+ZGIxKTsKLQlQUl9FRVAoIkRyaXZlckJpYXMyIiwgcE1vZGFsLT5kYjEpOwotCVBSX0VFUCgiQ0NLIE91dHB1dEJpYXMiLCBwTW9kYWwtPm9iX2Njayk7Ci0JUFJfRUVQKCJQU0sgT3V0cHV0QmlhcyIsIHBNb2RhbC0+b2JfcHNrKTsKLQlQUl9FRVAoIlFBTSBPdXRwdXRCaWFzIiwgcE1vZGFsLT5vYl9xYW0pOwotCVBSX0VFUCgiUEFMX09GRiBPdXRwdXRCaWFzIiwgcE1vZGFsLT5vYl9wYWxfb2ZmKTsKLQotCWlmIChsZW4gPiBzaXplKQotCQlsZW4gPSBzaXplOwotCi0JcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXR2YWw7Ci0KLSN1bmRlZiBQUl9FRVAKLX0KLQotc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX21vZGFsX2VlcHJvbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChBUl9TUkVWXzkyNzEocHJpdi0+YWgpKQotCQlyZXR1cm4gcmVhZF80a19tb2RhbF9lZXByb20oZmlsZSwgdXNlcl9idWYsIGNvdW50LCBwcG9zKTsKLQllbHNlIGlmIChwcml2LT5haC0+aHdfdmVyc2lvbi51c2JkZXYgPT0gQVI5MjgwX1VTQikKLQkJcmV0dXJuIHJlYWRfZGVmX21vZGFsX2VlcHJvbShmaWxlLCB1c2VyX2J1ZiwgY291bnQsIHBwb3MpOwotCWVsc2UgaWYgKHByaXYtPmFoLT5od192ZXJzaW9uLnVzYmRldiA9PSBBUjkyODdfVVNCKQotCQlyZXR1cm4gcmVhZF85Mjg3X21vZGFsX2VlcHJvbShmaWxlLCB1c2VyX2J1ZiwgY291bnQsIHBwb3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfbW9kYWxfZWVwcm9tID0gewotCS5yZWFkID0gcmVhZF9maWxlX21vZGFsX2VlcHJvbSwKLQkub3BlbiA9IHNpbXBsZV9vcGVuLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KLQogLyogRXRodG9vbCBzdXBwb3J0IGZvciBnZXQtc3RhdHMgKi8KICNkZWZpbmUgQU1LU1RSKG5tKSAjbm0gIl9CRSIsICNubSAiX0JLIiwgI25tICJfVkkiLCAjbm0gIl9WTyIKIHN0YXRpYyBjb25zdCBjaGFyIGF0aDlrX2h0Y19nc3RyaW5nc19zdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CkBAIC05NDcsNiArNDUzLDggQEAKIAogI2RlZmluZSBTVFhCQVNFIHByaXYtPmRlYnVnLnR4X3N0YXRzCiAjZGVmaW5lIFNSWEJBU0UgcHJpdi0+ZGVidWcucnhfc3RhdHMKKyNkZWZpbmUgU0tCVFhCQVNFIHByaXYtPmRlYnVnLnR4X3N0YXRzCisjZGVmaW5lIFNLQlJYQkFTRSBwcml2LT5kZWJ1Zy5za2JyeF9zdGF0cwogI2RlZmluZSBBU1RYUShhKQkJCQkJXAogCWRhdGFbaSsrXSA9IFNUWEJBU0UuYVtJRUVFODAyMTFfQUNfQkVdOwkJXAogCWRhdGFbaSsrXSA9IFNUWEJBU0UuYVtJRUVFODAyMTFfQUNfQktdOwkJXApAQCAtOTYwLDI0ICs0NjgsMjQgQEAKIAlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlpbnQgaSA9IDA7CiAKLQlkYXRhW2krK10gPSBTVFhCQVNFLnNrYl9zdWNjZXNzOwotCWRhdGFbaSsrXSA9IFNUWEJBU0Uuc2tiX3N1Y2Nlc3NfYnl0ZXM7Ci0JZGF0YVtpKytdID0gU1JYQkFTRS5za2JfY29tcGxldGVkOwotCWRhdGFbaSsrXSA9IFNSWEJBU0Uuc2tiX2NvbXBsZXRlZF9ieXRlczsKKwlkYXRhW2krK10gPSBTS0JUWEJBU0Uuc2tiX3N1Y2Nlc3M7CisJZGF0YVtpKytdID0gU0tCVFhCQVNFLnNrYl9zdWNjZXNzX2J5dGVzOworCWRhdGFbaSsrXSA9IFNLQlJYQkFTRS5za2JfY29tcGxldGVkOworCWRhdGFbaSsrXSA9IFNLQlJYQkFTRS5za2JfY29tcGxldGVkX2J5dGVzOwogCiAJQVNUWFEocXVldWVfc3RhdHMpOwogCi0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfY3JjOwotCWRhdGFbaSsrXSA9IFNSWEJBU0UuZXJyX2RlY3J5cHRfY3JjOwotCWRhdGFbaSsrXSA9IFNSWEJBU0UuZXJyX3BoeTsKLQlkYXRhW2krK10gPSBTUlhCQVNFLmVycl9taWM7Ci0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfcHJlX2RlbGltOwotCWRhdGFbaSsrXSA9IFNSWEJBU0UuZXJyX3Bvc3RfZGVsaW07Ci0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfZGVjcnlwdF9idXN5OworCWRhdGFbaSsrXSA9IFNSWEJBU0UuY3JjX2VycjsKKwlkYXRhW2krK10gPSBTUlhCQVNFLmRlY3J5cHRfY3JjX2VycjsKKwlkYXRhW2krK10gPSBTUlhCQVNFLnBoeV9lcnI7CisJZGF0YVtpKytdID0gU1JYQkFTRS5taWNfZXJyOworCWRhdGFbaSsrXSA9IFNSWEJBU0UucHJlX2RlbGltX2NyY19lcnI7CisJZGF0YVtpKytdID0gU1JYQkFTRS5wb3N0X2RlbGltX2NyY19lcnI7CisJZGF0YVtpKytdID0gU1JYQkFTRS5kZWNyeXB0X2J1c3lfZXJyOwogCi0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfcGh5X3N0YXRzW0FUSDlLX1BIWUVSUl9SQURBUl07Ci0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfcGh5X3N0YXRzW0FUSDlLX1BIWUVSUl9PRkRNX1RJTUlOR107Ci0JZGF0YVtpKytdID0gU1JYQkFTRS5lcnJfcGh5X3N0YXRzW0FUSDlLX1BIWUVSUl9DQ0tfVElNSU5HXTsKKwlkYXRhW2krK10gPSBTUlhCQVNFLnBoeV9lcnJfc3RhdHNbQVRIOUtfUEhZRVJSX1JBREFSXTsKKwlkYXRhW2krK10gPSBTUlhCQVNFLnBoeV9lcnJfc3RhdHNbQVRIOUtfUEhZRVJSX09GRE1fVElNSU5HXTsKKwlkYXRhW2krK10gPSBTUlhCQVNFLnBoeV9lcnJfc3RhdHNbQVRIOUtfUEhZRVJSX0NDS19USU1JTkddOwogCiAJV0FSTl9PTihpICE9IEFUSDlLX0hUQ19TU1RBVFNfTEVOKTsKIH0KQEAgLTEwMDEsMTggKzUwOSwyMSBAQAogCQkJICAgIHByaXYsICZmb3BzX3RndF9yeF9zdGF0cyk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgieG1pdCIsIFNfSVJVU1IsIHByaXYtPmRlYnVnLmRlYnVnZnNfcGh5LAogCQkJICAgIHByaXYsICZmb3BzX3htaXQpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlY3YiLCBTX0lSVVNSLCBwcml2LT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwKLQkJCSAgICBwcml2LCAmZm9wc19yZWN2KTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJza2JfcngiLCBTX0lSVVNSLCBwcml2LT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwKKwkJCSAgICBwcml2LCAmZm9wc19za2JfcngpOworCisJYXRoOWtfY21uX2RlYnVnX3JlY3YocHJpdi0+ZGVidWcuZGVidWdmc19waHksICZwcml2LT5kZWJ1Zy5yeF9zdGF0cyk7CisJYXRoOWtfY21uX2RlYnVnX3BoeV9lcnIocHJpdi0+ZGVidWcuZGVidWdmc19waHksICZwcml2LT5kZWJ1Zy5yeF9zdGF0cyk7CisKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzbG90IiwgU19JUlVTUiwgcHJpdi0+ZGVidWcuZGVidWdmc19waHksCiAJCQkgICAgcHJpdiwgJmZvcHNfc2xvdCk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgicXVldWUiLCBTX0lSVVNSLCBwcml2LT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwKIAkJCSAgICBwcml2LCAmZm9wc19xdWV1ZSk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCBTX0lSVVNSIHwgU19JV1VTUiwgcHJpdi0+ZGVidWcuZGVidWdmc19waHksCiAJCQkgICAgcHJpdiwgJmZvcHNfZGVidWcpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImJhc2VfZWVwcm9tIiwgU19JUlVTUiwgcHJpdi0+ZGVidWcuZGVidWdmc19waHksCi0JCQkgICAgcHJpdiwgJmZvcHNfYmFzZV9lZXByb20pOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1vZGFsX2VlcHJvbSIsIFNfSVJVU1IsIHByaXYtPmRlYnVnLmRlYnVnZnNfcGh5LAotCQkJICAgIHByaXYsICZmb3BzX21vZGFsX2VlcHJvbSk7CisKKwlhdGg5a19jbW5fZGVidWdfYmFzZV9lZXByb20ocHJpdi0+ZGVidWcuZGVidWdmc19waHksIHByaXYtPmFoKTsKKwlhdGg5a19jbW5fZGVidWdfbW9kYWxfZWVwcm9tKHByaXYtPmRlYnVnLmRlYnVnZnNfcGh5LCBwcml2LT5haCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X3R4cnguYwppbmRleCAyODlmM2Q4Li5iYjg2ZWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfdHhyeC5jCkBAIC05OTYsOCArOTk2LDYgQEAKIAkJZ290byByeF9uZXh0OwogCX0KIAotCWF0aDlrX2h0Y19lcnJfc3RhdF9yeChwcml2LCByeHN0YXR1cyk7Ci0KIAkvKiBHZXQgdGhlIFJYIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwogCiAJbWVtc2V0KHJ4X3N0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzKSk7CkBAIC0xMDA1LDYgKzEwMDMsNyBAQAogCS8qIENvcHkgZXZlcnl0aGluZyBmcm9tIGF0aF9odGNfcnhfc3RhdHVzIChIVENfUlhfRlJBTUVfSEVBREVSKS4KIAkgKiBBZnRlciB0aGlzLCB3ZSBjYW4gZHJvcCB0aGlzIHBhcnQgb2Ygc2tiLiAqLwogCXJ4X3N0YXR1c19odGNfdG9fYXRoKCZyeF9zdGF0cywgcnhzdGF0dXMpOworCWF0aDlrX2h0Y19lcnJfc3RhdF9yeChwcml2LCAmcnhfc3RhdHMpOwogCXJ4X3N0YXR1cy0+bWFjdGltZSA9IGJlNjRfdG9fY3B1KHJ4c3RhdHVzLT5yc190c3RhbXApOwogCXNrYl9wdWxsKHNrYiwgSFRDX1JYX0ZSQU1FX0hFQURFUl9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCBjOGE5ZGZhLi4yYThlZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgImFyOTAwM19tYWMuaCIKICNpbmNsdWRlICJhcjkwMDNfbWNpLmgiCiAjaW5jbHVkZSAiYXI5MDAzX3BoeS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiYXRoOWsuaCIKIAogc3RhdGljIGJvb2wgYXRoOWtfaHdfc2V0X3Jlc2V0X3JlZyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHR5cGUpOwpAQCAtMjQ2LDYgKzI0NSw4IEBACiAJCXJldHVybjsKIAljYXNlIEFSOTMwMF9ERVZJRF9BUjk1M1g6CiAJCWFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPSBBUl9TUkVWX1ZFUlNJT05fOTUzMTsKKwkJaWYgKGFoLT5nZXRfbWFjX3JldmlzaW9uKQorCQkJYWgtPmh3X3ZlcnNpb24ubWFjUmV2ID0gYWgtPmdldF9tYWNfcmV2aXNpb24oKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKaW5kZXggMzZhZTY0OS4uMDI0NmI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCkBAIC02MSw2ICs2MSwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHBzX2VuYWJsZSwgYXRoOWtfcHNfZW5hYmxlLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwc19lbmFibGUsICJFbmFibGUgV0xBTiBQb3dlclNhdmUiKTsKIAorc3RhdGljIGludCBhdGg5a191c2VfY2hhbmN0eDsKK21vZHVsZV9wYXJhbV9uYW1lZCh1c2VfY2hhbmN0eCwgYXRoOWtfdXNlX2NoYW5jdHgsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9jaGFuY3R4LCAiRW5hYmxlIGNoYW5uZWwgY29udGV4dCBmb3IgY29uY3VycmVuY3kiKTsKKwogYm9vbCBpc19hdGg5a191bmxvYWRlZDsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURTCkBAIC01MDgsNyArNTEyLDcgQEAKIAlzYy0+dHg5OV9wb3dlciA9IE1BWF9SQVRFX1BPV0VSICsgMTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYy0+dHhfd2FpdCk7CiAKLQlpZiAoIXBkYXRhKSB7CisJaWYgKCFwZGF0YSB8fCBwZGF0YS0+dXNlX2VlcHJvbSkgewogCQlhaC0+YWhfZmxhZ3MgfD0gQUhfVVNFX0VFUFJPTTsKIAkJc2MtPnNjX2FoLT5sZWRfcGluID0gLTE7CiAJfSBlbHNlIHsKQEAgLTU4OSw2ICs1OTMsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2J0Y29leDsKIAorCXNjLT5wMnBfcHNfdGltZXIgPSBhdGhfZ2VuX3RpbWVyX2FsbG9jKHNjLT5zY19haCwgYXRoOWtfcDJwX3BzX3RpbWVyLAorCQlOVUxMLCBzYywgQVJfRklSU1RfTkRQX1RJTUVSKTsKKwogCWF0aDlrX2Ntbl9pbml0X2NyeXB0byhzYy0+c2NfYWgpOwogCWF0aDlrX2luaXRfbWlzYyhzYyk7CiAJYXRoX2ZpbGxfbGVkX3BpbihzYyk7CkBAIC02NDMsMTcgKzY1MCwyMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpZl9saW1pdHNbXSA9IHsKLQl7IC5tYXggPSAyMDQ4LAkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAotCQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgfAotCQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfV0RTKSB9LAorCXsgLm1heCA9IDIwNDgsCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB9LAogCXsgLm1heCA9IDgsCS50eXBlcyA9CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIAkJCQkgQklUKE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHwKICNlbmRpZgotCQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApIHwKKwkJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FQKSB9LAorCXsgLm1heCA9IDEsCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSB8CiAJCQkJIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCB3ZHNfbGltaXRzW10gPSB7CisJeyAubWF4ID0gMjA0OCwJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1dEUykgfSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGlmX2Rmc19saW1pdHNbXSA9IHsKIAl7IC5tYXggPSAxLAkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApIHwKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSApAQCAtNjcwLDYgKzY4MCwxMyBAQAogCQkubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCiAJCS5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKIAl9LAorCXsKKwkJLmxpbWl0cyA9IHdkc19saW1pdHMsCisJCS5uX2xpbWl0cyA9IEFSUkFZX1NJWkUod2RzX2xpbWl0cyksCisJCS5tYXhfaW50ZXJmYWNlcyA9IDIwNDgsCisJCS5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkJLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAorCX0sCiAjaWZkZWYgQ09ORklHX0FUSDlLX0RGU19DRVJUSUZJRUQKIAl7CiAJCS5saW1pdHMgPSBpZl9kZnNfbGltaXRzLApAQCAtNzExLDE5ICs3MjgsMjMgQEAKIAlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKHNjLT5zY19haCkgfHwgYXRoOWtfbW9kcGFyYW1fbm9od2NyeXB0KQogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOwogCi0JaHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfQUNUSVZFX01PTklUT1I7CisJaHctPndpcGh5LT5mZWF0dXJlcyB8PSAoTkw4MDIxMV9GRUFUVVJFX0FDVElWRV9NT05JVE9SIHwKKwkJCQlOTDgwMjExX0ZFQVRVUkVfQVBfTU9ERV9DSEFOX1dJRFRIX0NIQU5HRSk7CiAKIAlpZiAoIWNvbmZpZ19lbmFibGVkKENPTkZJR19BVEg5S19UWDk5KSkgewogCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CiAJCQlCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8CiAJCQlCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgfAogCQkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8Ci0JCQlCSVQoTkw4MDIxMV9JRlRZUEVfV0RTKSB8CiAJCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAogCQkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CiAJCQlCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCk7CiAJCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gaWZfY29tYjsKLQkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9IEFSUkFZX1NJWkUoaWZfY29tYik7CisJCWlmICghYXRoOWtfdXNlX2NoYW5jdHgpIHsKKwkJCWh3LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPSBBUlJBWV9TSVpFKGlmX2NvbWIpOworCQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX1dEUyk7CisJCX0gZWxzZQorCQkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9IDE7CiAJfQogCiAJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwpAQCAtODU1LDYgKzg3Niw5IEBACiB7CiAJaW50IGkgPSAwOwogCisJaWYgKHNjLT5wMnBfcHNfdGltZXIpCisJCWF0aF9nZW5fdGltZXJfZnJlZShzYy0+c2NfYWgsIHNjLT5wMnBfcHNfdGltZXIpOworCiAJYXRoOWtfZGVpbml0X2J0Y29leChzYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVRIOUtfTlVNX1RYX1FVRVVFUzsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCmluZGV4IDUxY2UzNmYuLjI3NTIwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKQEAgLTk1OCwzICs5NTgsMjUgQEAKIAlyZXR1cm47CiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKTsKKworI2RlZmluZSBBVEg5S19IV19NQVhfRENVICAgICAgIDEwCisjZGVmaW5lIEFUSDlLX0hXX1NMSUNFX1BFUl9EQ1UgMTYKKyNkZWZpbmUgQVRIOUtfSFdfQklUX0lOX1NMSUNFICAxNgordm9pZCBhdGg5a19od19zZXRfdHhfZmlsdGVyKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBkZXN0aWR4LCBib29sIHNldCkKK3sKKwlpbnQgZGN1X2lkeDsKKwl1MzIgZmlsdGVyOworCisJZm9yIChkY3VfaWR4ID0gMDsgZGN1X2lkeCA8IDEwOyBkY3VfaWR4KyspIHsKKwkJZmlsdGVyID0gU00oc2V0LCBBUl9EX1RYQkxLX1dSSVRFX0NPTU1BTkQpOworCQlmaWx0ZXIgfD0gU00oZGN1X2lkeCwgQVJfRF9UWEJMS19XUklURV9EQ1UpOworCQlmaWx0ZXIgfD0gU00oKGRlc3RpZHggLyBBVEg5S19IV19TTElDRV9QRVJfRENVKSwKKwkJCSAgICAgQVJfRF9UWEJMS19XUklURV9TTElDRSk7CisJCWZpbHRlciB8PSBCSVQoZGVzdGlkeCAlIEFUSDlLX0hXX0JJVF9JTl9TTElDRSk7CisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgUFMsCisJCQkiRENVJWQgc3RhaWQgJWQgc2V0ICVkIHR4ZmlsdGVyICUwOHhcbiIsCisJCQlkY3VfaWR4LCBkZXN0aWR4LCBzZXQsIGZpbHRlcik7CisJCVJFR19XUklURShhaCwgQVJfRF9UWEJMS19CQVNFLCBmaWx0ZXIpOworCX0KK30KK0VYUE9SVF9TWU1CT0woYXRoOWtfaHdfc2V0X3R4X2ZpbHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmgKaW5kZXggODlkZjYzNC4uZGE3Njg2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuaApAQCAtNzI5LDYgKzcyOSw3IEBACiB2b2lkIGF0aDlrX2h3X2Fib3J0cGN1cmVjdihzdHJ1Y3QgYXRoX2h3ICphaCk7CiBib29sIGF0aDlrX2h3X3N0b3BkbWFyZWN2KHN0cnVjdCBhdGhfaHcgKmFoLCBib29sICpyZXNldCk7CiBpbnQgYXRoOWtfaHdfYmVhY29ucV9zZXR1cChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGF0aDlrX2h3X3NldF90eF9maWx0ZXIoc3RydWN0IGF0aF9odyAqYWgsIHU4IGRlc3RpZHgsIGJvb2wgc2V0KTsKIAogLyogSW50ZXJydXB0IEhhbmRsaW5nICovCiBib29sIGF0aDlrX2h3X2ludHJwZW5kKHN0cnVjdCBhdGhfaHcgKmFoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCmluZGV4IGQ2OTg1M2IuLjYyYWM5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwpAQCAtMjYxLDYgKzI2MSw4IEBACiAJc2MtPmd0dF9jbnQgPSAwOwogCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhzYy0+aHcpOwogCisJYXRoOWtfcDJwX3BzX3RpbWVyKHNjKTsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC00MTksNiArNDIxLDcgQEAKIAlhbi0+c2MgPSBzYzsKIAlhbi0+c3RhID0gc3RhOwogCWFuLT52aWYgPSB2aWY7CisJbWVtc2V0KCZhbi0+a2V5X2lkeCwgMCwgc2l6ZW9mKGFuLT5rZXlfaWR4KSk7CiAKIAlhdGhfdHhfbm9kZV9pbml0KHNjLCBhbik7CiB9CkBAIC0xMTE5LDYgKzExMjIsOCBAQAogCWlmIChhdGg5a191c2VzX2JlYWNvbnModmlmLT50eXBlKSkKIAkJYXRoOWtfYmVhY29uX2Fzc2lnbl9zbG90KHNjLCB2aWYpOwogCisJYXZwLT52aWYgPSB2aWY7CisKIAlhbi0+c2MgPSBzYzsKIAlhbi0+c3RhID0gTlVMTDsKIAlhbi0+dmlmID0gdmlmOwpAQCAtMTE2Myw2ICsxMTY4LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCithdGg5a191cGRhdGVfcDJwX3BzX3RpbWVyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3ZpZiAqYXZwKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXMzMiB0c2YsIHRhcmdldF90c2Y7CisKKwlpZiAoIWF2cCB8fCAhYXZwLT5ub2EuaGFzX25leHRfdHNmKQorCQlyZXR1cm47CisKKwlhdGg5a19od19nZW5fdGltZXJfc3RvcChhaCwgc2MtPnAycF9wc190aW1lcik7CisKKwl0c2YgPSBhdGg5a19od19nZXR0c2YzMihzYy0+c2NfYWgpOworCisJdGFyZ2V0X3RzZiA9IGF2cC0+bm9hLm5leHRfdHNmOworCWlmICghYXZwLT5ub2EuYWJzZW50KQorCQl0YXJnZXRfdHNmIC09IEFUSF9QMlBfUFNfU1RPUF9USU1FOworCisJaWYgKHRhcmdldF90c2YgLSB0c2YgPCBBVEhfUDJQX1BTX1NUT1BfVElNRSkKKwkJdGFyZ2V0X3RzZiA9IHRzZiArIEFUSF9QMlBfUFNfU1RPUF9USU1FOworCisJYXRoOWtfaHdfZ2VuX3RpbWVyX3N0YXJ0KGFoLCBzYy0+cDJwX3BzX3RpbWVyLCAodTMyKSB0YXJnZXRfdHNmLCAxMDAwMDAwKTsKK30KKwogc3RhdGljIHZvaWQgYXRoOWtfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtMTE3NCw2ICsxMjAyLDEzIEBACiAKIAltdXRleF9sb2NrKCZzYy0+bXV0ZXgpOwogCisJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCWlmIChhdnAgPT0gc2MtPnAycF9wc192aWYpIHsKKwkJc2MtPnAycF9wc192aWYgPSBOVUxMOworCQlhdGg5a191cGRhdGVfcDJwX3BzX3RpbWVyKHNjLCBOVUxMKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CisKIAlzYy0+bnZpZnMtLTsKIAlzYy0+dHg5OV92aWYgPSBOVUxMOwogCkBAIC0xNDI3LDggKzE0NjIsMTAgQEAKIAkJcmV0dXJuIDA7CiAKIAlrZXkgPSBhdGhfa2V5X2NvbmZpZyhjb21tb24sIHZpZiwgc3RhLCAmcHNfa2V5KTsKLQlpZiAoa2V5ID4gMCkKKwlpZiAoa2V5ID4gMCkgewogCQlhbi0+cHNfa2V5ID0ga2V5OworCQlhbi0+a2V5X2lkeFswXSA9IGtleTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDYsNiArMTQ4Myw3IEBACiAKIAlhdGhfa2V5X2RlbGV0ZShjb21tb24sICZwc19rZXkpOwogCWFuLT5wc19rZXkgPSAwOworCWFuLT5rZXlfaWR4WzBdID0gMDsKIH0KIAogc3RhdGljIGludCBhdGg5a19zdGFfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTQ2MCw2ICsxNDk4LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX3N0YV9zZXRfdHhfZmlsdGVyKHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCSAgICBzdHJ1Y3QgYXRoX25vZGUgKmFuLAorCQkJCSAgICBib29sIHNldCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFuLT5rZXlfaWR4KTsgaSsrKSB7CisJCWlmICghYW4tPmtleV9pZHhbaV0pCisJCQljb250aW51ZTsKKwkJYXRoOWtfaHdfc2V0X3R4X2ZpbHRlcihhaCwgYW4tPmtleV9pZHhbaV0sIHNldCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBhdGg5a19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCkBAIC0xNDcyLDggKzE1MjMsMTAgQEAKIAljYXNlIFNUQV9OT1RJRllfU0xFRVA6CiAJCWFuLT5zbGVlcGluZyA9IHRydWU7CiAJCWF0aF90eF9hZ2dyX3NsZWVwKHN0YSwgc2MsIGFuKTsKKwkJYXRoOWtfc3RhX3NldF90eF9maWx0ZXIoc2MtPnNjX2FoLCBhbiwgdHJ1ZSk7CiAJCWJyZWFrOwogCWNhc2UgU1RBX05PVElGWV9BV0FLRToKKwkJYXRoOWtfc3RhX3NldF90eF9maWx0ZXIoc2MtPnNjX2FoLCBhbiwgZmFsc2UpOwogCQlhbi0+c2xlZXBpbmcgPSBmYWxzZTsKIAkJYXRoX3R4X2FnZ3Jfd2FrZXVwKHNjLCBhbik7CiAJCWJyZWFrOwpAQCAtMTUyOSw3ICsxNTgyLDggQEAKIHsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gTlVMTDsKKwlpbnQgcmV0ID0gMCwgaTsKIAogCWlmIChhdGg5a19tb2RwYXJhbV9ub2h3Y3J5cHQpCiAJCXJldHVybiAtRU5PU1BDOwpAQCAtMTU1MSwxMyArMTYwNSwxNiBAQAogCiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIAlhdGg5a19wc193YWtldXAoc2MpOwotCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJTZXQgSFcgS2V5XG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiU2V0IEhXIEtleSAlZFxuIiwgY21kKTsKKwlpZiAoc3RhKQorCQlhbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNFVF9LRVk6CiAJCWlmIChzdGEpCiAJCQlhdGg5a19kZWxfcHNfa2V5KHNjLCB2aWYsIHN0YSk7CiAKKwkJa2V5LT5od19rZXlfaWR4ID0gMDsKIAkJcmV0ID0gYXRoX2tleV9jb25maWcoY29tbW9uLCB2aWYsIHN0YSwga2V5KTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQlrZXktPmh3X2tleV9pZHggPSByZXQ7CkBAIC0xNTcwLDkgKzE2MjcsMjcgQEAKIAkJCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RYOwogCQkJcmV0ID0gMDsKIAkJfQorCQlpZiAoYW4gJiYga2V5LT5od19rZXlfaWR4KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbi0+a2V5X2lkeCk7IGkrKykgeworCQkJCWlmIChhbi0+a2V5X2lkeFtpXSkKKwkJCQkJY29udGludWU7CisJCQkJYW4tPmtleV9pZHhbaV0gPSBrZXktPmh3X2tleV9pZHg7CisJCQkJYnJlYWs7CisJCQl9CisJCQlXQVJOX09OKGkgPT0gQVJSQVlfU0laRShhbi0+a2V5X2lkeCkpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgRElTQUJMRV9LRVk6CiAJCWF0aF9rZXlfZGVsZXRlKGNvbW1vbiwga2V5KTsKKwkJaWYgKGFuKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbi0+a2V5X2lkeCk7IGkrKykgeworCQkJCWlmIChhbi0+a2V5X2lkeFtpXSAhPSBrZXktPmh3X2tleV9pZHgpCisJCQkJCWNvbnRpbnVlOworCQkJCWFuLT5rZXlfaWR4W2ldID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlrZXktPmh3X2tleV9pZHggPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTYzNiw2ICsxNzExLDY2IEBACiAJCWF0aDlrX3NldF9hc3NvY19zdGF0ZShzYywgdmlmKTsKIH0KIAordm9pZCBhdGg5a19wMnBfcHNfdGltZXIodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IHByaXY7CisJc3RydWN0IGF0aF92aWYgKmF2cCA9IHNjLT5wMnBfcHNfdmlmOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgYXRoX25vZGUgKmFuOworCXUzMiB0c2Y7CisKKwlpZiAoIWF2cCkKKwkJcmV0dXJuOworCisJdHNmID0gYXRoOWtfaHdfZ2V0dHNmMzIoc2MtPnNjX2FoKTsKKwlpZiAoIWF2cC0+bm9hLmFic2VudCkKKwkJdHNmICs9IEFUSF9QMlBfUFNfU1RPUF9USU1FOworCisJaWYgKCFhdnAtPm5vYS5oYXNfbmV4dF90c2YgfHwKKwkgICAgYXZwLT5ub2EubmV4dF90c2YgLSB0c2YgPiBCSVQoMzEpKQorCQlpZWVlODAyMTFfdXBkYXRlX3AycF9ub2EoJmF2cC0+bm9hLCB0c2YpOworCisJYXRoOWtfdXBkYXRlX3AycF9wc190aW1lcihzYywgYXZwKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXZpZiA9IGF2cC0+dmlmOworCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIHZpZi0+YnNzX2NvbmYuYnNzaWQpOworCWlmICghc3RhKQorCQlnb3RvIG91dDsKKworCWFuID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKKwlpZiAoYW4tPnNsZWVwaW5nID09ICEhYXZwLT5ub2EuYWJzZW50KQorCQlnb3RvIG91dDsKKworCWFuLT5zbGVlcGluZyA9IGF2cC0+bm9hLmFic2VudDsKKwlpZiAoYW4tPnNsZWVwaW5nKQorCQlhdGhfdHhfYWdncl9zbGVlcChzdGEsIHNjLCBhbik7CisJZWxzZQorCQlhdGhfdHhfYWdncl93YWtldXAoc2MsIGFuKTsKKworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworfQorCit2b2lkIGF0aDlrX3VwZGF0ZV9wMnBfcHMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGF0aF92aWYgKmF2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwl1MzIgdHNmOworCisJaWYgKCFzYy0+cDJwX3BzX3RpbWVyKQorCQlyZXR1cm47CisKKwlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwgIXZpZi0+cDJwKQorCQlyZXR1cm47CisKKwlzYy0+cDJwX3BzX3ZpZiA9IGF2cDsKKwl0c2YgPSBhdGg5a19od19nZXR0c2YzMihzYy0+c2NfYWgpOworCWllZWU4MDIxMV9wYXJzZV9wMnBfbm9hKCZ2aWYtPmJzc19jb25mLnAycF9ub2FfYXR0ciwgJmF2cC0+bm9hLCB0c2YpOworCWF0aDlrX3VwZGF0ZV9wMnBfcHNfdGltZXIoc2MsIGF2cCk7Cit9CisKIHN0YXRpYyB2b2lkIGF0aDlrX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKQEAgLTE2NTAsNiArMTc4NSw3IEBACiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGF0aF92aWYgKmF2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzbG90dGltZTsKIAogCWF0aDlrX3BzX3dha2V1cChzYyk7CkBAIC0xNzEwLDYgKzE4NDYsMTUgQEAKIAkJfQogCX0KIAorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfUDJQX1BTKSB7CisJCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zY19wbV9sb2NrLCBmbGFncyk7CisJCWlmICghKHNjLT5wc19mbGFncyAmIFBTX0JFQUNPTl9TWU5DKSkKKwkJCWF0aDlrX3VwZGF0ZV9wMnBfcHMoc2MsIHZpZik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zY19wbV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCX0KKwogCWlmIChjaGFuZ2VkICYgQ0hFQ0tfQU5JKQogCQlhdGhfY2hlY2tfYW5pKHNjKTsKIApAQCAtMTg4Myw3ICsyMDI4LDggQEAKIAlyZXR1cm4gISFucGVuZDsKIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIGF0aDlrX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQogewogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CkBAIC0yMDg0LDE0ICsyMjMwLDYgQEAKIAljbGVhcl9iaXQoQVRIX09QX1NDQU5OSU5HLCAmY29tbW9uLT5vcF9mbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDlrX2NoYW5uZWxfc3dpdGNoX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKQotewotCS8qIGRlcGVuZCBvbiB2aWYtPmNzYV9hY3RpdmUgb25seSAqLwotCXJldHVybjsKLX0KLQogc3RydWN0IGllZWU4MDIxMV9vcHMgYXRoOWtfb3BzID0gewogCS50eCAJCSAgICA9IGF0aDlrX3R4LAogCS5zdGFydCAJCSAgICA9IGF0aDlrX3N0YXJ0LApAQCAtMjEzOSw1ICsyMjc3LDQgQEAKICNlbmRpZgogCS5zd19zY2FuX3N0YXJ0CSAgICA9IGF0aDlrX3N3X3NjYW5fc3RhcnQsCiAJLnN3X3NjYW5fY29tcGxldGUgICA9IGF0aDlrX3N3X3NjYW5fY29tcGxldGUsCi0JLmNoYW5uZWxfc3dpdGNoX2JlYWNvbiAgICAgPSBhdGg5a19jaGFubmVsX3N3aXRjaF9iZWFjb24sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCmluZGV4IDkxNGRiYzYuLjRkZWMwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKQEAgLTY4Niw3ICs2ODYsNyBAQAogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gKHN0cnVjdCBhdGhfc29mdGMgKikgY29tbW9uLT5wcml2OwogCXN0cnVjdCBhdGg5a19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQlpZiAocGRhdGEpIHsKKwlpZiAocGRhdGEgJiYgIXBkYXRhLT51c2VfZWVwcm9tKSB7CiAJCWlmIChvZmYgPj0gKEFSUkFZX1NJWkUocGRhdGEtPmVlcHJvbV9kYXRhKSkpIHsKIAkJCWF0aF9lcnIoY29tbW9uLAogCQkJCSIlczogZWVwcm9tIHJlYWQgZmFpbGVkLCBvZmZzZXQgJTA4eCBpcyBvdXQgb2YgcmFuZ2VcbiIsCkBAIC05MTQsNiArOTE0LDcgQEAKIAkgKi8KIAlhdGg5a19zdG9wX2J0Y29leChzYyk7CiAJYXRoOWtfaHdfZGlzYWJsZShzYy0+c2NfYWgpOworCWRlbF90aW1lcl9zeW5jKCZzYy0+c2xlZXBfdGltZXIpOwogCWF0aDlrX2h3X3NldHBvd2VyKHNjLT5zY19haCwgQVRIOUtfUE1fRlVMTF9TTEVFUCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCmluZGV4IDE5ZGY5NjkuLjkxMDVhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYwpAQCAtMzQsNyArMzQsOCBAQAogICogYnVmZmVyIChvciByeCBmaWZvKS4gVGhpcyBjYW4gaW5jb3JyZWN0bHkgYWNrbm93bGVkZ2UgcGFja2V0cwogICogdG8gYSBzZW5kZXIgaWYgbGFzdCBkZXNjIGlzIHNlbGYtbGlua2VkLgogICovCi1zdGF0aWMgdm9pZCBhdGhfcnhfYnVmX2xpbmsoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfcnhidWYgKmJmKQorc3RhdGljIHZvaWQgYXRoX3J4X2J1Zl9saW5rKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3J4YnVmICpiZiwKKwkJCSAgICBib29sIGZsdXNoKQogewogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwpAQCAtNTksMTggKzYwLDE5IEBACiAJCQkgICAgIGNvbW1vbi0+cnhfYnVmc2l6ZSwKIAkJCSAgICAgMCk7CiAKLQlpZiAoc2MtPnJ4LnJ4bGluayA9PSBOVUxMKQotCQlhdGg5a19od19wdXRyeGJ1ZihhaCwgYmYtPmJmX2RhZGRyKTsKLQllbHNlCisJaWYgKHNjLT5yeC5yeGxpbmspCiAJCSpzYy0+cngucnhsaW5rID0gYmYtPmJmX2RhZGRyOworCWVsc2UgaWYgKCFmbHVzaCkKKwkJYXRoOWtfaHdfcHV0cnhidWYoYWgsIGJmLT5iZl9kYWRkcik7CiAKIAlzYy0+cngucnhsaW5rID0gJmRzLT5kc19saW5rOwogfQogCi1zdGF0aWMgdm9pZCBhdGhfcnhfYnVmX3JlbGluayhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9yeGJ1ZiAqYmYpCitzdGF0aWMgdm9pZCBhdGhfcnhfYnVmX3JlbGluayhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9yeGJ1ZiAqYmYsCisJCQkgICAgICBib29sIGZsdXNoKQogewogCWlmIChzYy0+cnguYnVmX2hvbGQpCi0JCWF0aF9yeF9idWZfbGluayhzYywgc2MtPnJ4LmJ1Zl9ob2xkKTsKKwkJYXRoX3J4X2J1Zl9saW5rKHNjLCBzYy0+cnguYnVmX2hvbGQsIGZsdXNoKTsKIAogCXNjLT5yeC5idWZfaG9sZCA9IGJmOwogfQpAQCAtNDQyLDcgKzQ0NCw3IEBACiAJc2MtPnJ4LmJ1Zl9ob2xkID0gTlVMTDsKIAlzYy0+cngucnhsaW5rID0gTlVMTDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmYsIHRiZiwgJnNjLT5yeC5yeGJ1ZiwgbGlzdCkgewotCQlhdGhfcnhfYnVmX2xpbmsoc2MsIGJmKTsKKwkJYXRoX3J4X2J1Zl9saW5rKHNjLCBiZiwgZmFsc2UpOwogCX0KIAogCS8qIFdlIGNvdWxkIGhhdmUgZGVsZXRlZCBlbGVtZW50cyBzbyB0aGUgbGlzdCBtYXkgYmUgZW1wdHkgbm93ICovCkBAIC01MzgsNyArNTQwLDEwIEBACiAJCXNjLT5wc19mbGFncyAmPSB+UFNfQkVBQ09OX1NZTkM7CiAJCWF0aF9kYmcoY29tbW9uLCBQUywKIAkJCSJSZWNvbmZpZ3VyZSBiZWFjb24gdGltZXJzIGJhc2VkIG9uIHN5bmNocm9uaXplZCB0aW1lc3RhbXBcbiIpOwotCQlhdGg5a19zZXRfYmVhY29uKHNjKTsKKwkJaWYgKCEoV0FSTl9PTl9PTkNFKHNjLT5jdXJfYmVhY29uX2NvbmYuYmVhY29uX2ludGVydmFsID09IDApKSkKKwkJCWF0aDlrX3NldF9iZWFjb24oc2MpOworCQlpZiAoc2MtPnAycF9wc192aWYpCisJCQlhdGg5a191cGRhdGVfcDJwX3BzKHNjLCBzYy0+cDJwX3BzX3ZpZi0+dmlmKTsKIAl9CiAKIAlpZiAoYXRoX2JlYWNvbl9kdGltX3BlbmRpbmdfY2FiKHNrYikpIHsKQEAgLTExMTUsMTIgKzExMjAsMTIgQEAKIHJlcXVldWU6CiAJCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmc2MtPnJ4LnJ4YnVmKTsKIAotCQlpZiAoZWRtYSkgewotCQkJYXRoX3J4X2VkbWFfYnVmX2xpbmsoc2MsIHF0eXBlKTsKLQkJfSBlbHNlIHsKLQkJCWF0aF9yeF9idWZfcmVsaW5rKHNjLCBiZik7CisJCWlmICghZWRtYSkgeworCQkJYXRoX3J4X2J1Zl9yZWxpbmsoc2MsIGJmLCBmbHVzaCk7CiAJCQlpZiAoIWZsdXNoKQogCQkJCWF0aDlrX2h3X3J4ZW5hKGFoKTsKKwkJfSBlbHNlIGlmICghZmx1c2gpIHsKKwkJCWF0aF9yeF9lZG1hX2J1Zl9saW5rKHNjLCBxdHlwZSk7CiAJCX0KIAogCQlpZiAoIWJ1ZGdldC0tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCmluZGV4IGIxZmQzZmEuLmYxYmJjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKQEAgLTUwNSw5ICs1MDUsNiBAQAogI2RlZmluZSBBUl9EX1FDVU1BU0sgICAgICAgICAweDAwMDAwM0ZGCiAjZGVmaW5lIEFSX0RfUUNVTUFTS19SRVNWMCAgIDB4RkZGRkZDMDAKIAotI2RlZmluZSBBUl9EX1RYQkxLX0NNRCAgMHgxMDM4Ci0jZGVmaW5lIEFSX0RfVFhCTEtfREFUQShpKSAoQVJfRF9UWEJMS19DTUQrKGkpKQotCiAjZGVmaW5lIEFSX0QwX0xDTF9JRlMgICAgIDB4MTA0MAogI2RlZmluZSBBUl9EMV9MQ0xfSUZTICAgICAweDEwNDQKICNkZWZpbmUgQVJfRDJfTENMX0lGUyAgICAgMHgxMDQ4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL21haW4uYwppbmRleCA0YzhjZGIwLi5mOGRlZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWluLmMKQEAgLTE3MDcsNyArMTcwNyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNhcmw5MTcwX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcXVldWVzLCBib29sIGRyb3ApCitzdGF0aWMgdm9pZCBjYXJsOTE3MF9vcF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJc3RydWN0IGFyOTE3MCAqYXIgPSBody0+cHJpdjsKIAl1bnNpZ25lZCBpbnQgdmlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCmluZGV4IGNhMTE1ZjMuLmYzNWM3ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKQEAgLTEwNzYsOCArMTA3NiwxNCBAQAogCiAJY2FybDkxNzBfc2V0X3N0YXRlKGFyLCBDQVJMOTE3MF9TVE9QUEVEKTsKIAotCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgQ0FSTDkxNzBGV19OQU1FLAorCWVyciA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBDQVJMOTE3MEZXX05BTUUsCiAJCSZhci0+dWRldi0+ZGV2LCBHRlBfS0VSTkVMLCBhciwgY2FybDkxNzBfdXNiX2Zpcm13YXJlX3N0ZXAyKTsKKwlpZiAoZXJyKSB7CisJCXVzYl9wdXRfZGV2KHVkZXYpOworCQl1c2JfcHV0X2Rldih1ZGV2KTsKKwkJY2FybDkxNzBfZnJlZShhcik7CisJfQorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGNhcmw5MTcwX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwppbmRleCBhMWE2OWM1Li42NTBiZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwpAQCAtNzMsOSArNzMsNTIgQEAKIAkucmFkYXJfdHlwZXMJCT0gZXRzaV9yYWRhcl9yZWZfdHlwZXNfdjE1LAogfTsKIAotLyogZm9yIG5vdywgd2Ugc3VwcG9ydCBFVFNJIHJhZGFyIHR5cGVzLCBGQ0MgYW5kIEpQIGFyZSBUT0RPICovCisjZGVmaW5lIEZDQ19QQVRURVJOKElELCBXTUlOLCBXTUFYLCBQTUlOLCBQTUFYLCBQUkYsIFBQQikJXAorewkJCQkJCQkJXAorCUlELCBXSURUSF9MT1dFUihXTUlOKSwgV0lEVEhfVVBQRVIoV01BWCksCQlcCisJUE1JTiAtIFBSSV9UT0xFUkFOQ0UsCQkJCQlcCisJUE1BWCAqIFBSRiArIFBSSV9UT0xFUkFOQ0UsIFBSRiwgUFBCICogUFJGLAkJXAorCVBQQl9USFJFU0goUFBCKSwgUFJJX1RPTEVSQU5DRSwJCQkJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhZGFyX2RldGVjdG9yX3NwZWNzIGZjY19yYWRhcl9yZWZfdHlwZXNbXSA9IHsKKwlGQ0NfUEFUVEVSTigwLCAwLCAxLCAxNDI4LCAxNDI4LCAxLCAxOCksCisJRkNDX1BBVFRFUk4oMSwgMCwgNSwgMTUwLCAyMzAsIDEsIDIzKSwKKwlGQ0NfUEFUVEVSTigyLCA2LCAxMCwgMjAwLCA1MDAsIDEsIDE2KSwKKwlGQ0NfUEFUVEVSTigzLCAxMSwgMjAsIDIwMCwgNTAwLCAxLCAxMiksCisJRkNDX1BBVFRFUk4oNCwgNTAsIDEwMCwgMTAwMCwgMjAwMCwgMjAsIDEpLAorCUZDQ19QQVRURVJOKDUsIDAsIDEsIDMzMywgMzMzLCAxLCA5KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmFkYXJfdHlwZXMgZmNjX3JhZGFyX3R5cGVzID0geworCS5yZWdpb24JCQk9IE5MODAyMTFfREZTX0ZDQywKKwkubnVtX3JhZGFyX3R5cGVzCT0gQVJSQVlfU0laRShmY2NfcmFkYXJfcmVmX3R5cGVzKSwKKwkucmFkYXJfdHlwZXMJCT0gZmNjX3JhZGFyX3JlZl90eXBlcywKK307CisKKyNkZWZpbmUgSlBfUEFUVEVSTiBGQ0NfUEFUVEVSTgorc3RhdGljIGNvbnN0IHN0cnVjdCByYWRhcl9kZXRlY3Rvcl9zcGVjcyBqcF9yYWRhcl9yZWZfdHlwZXNbXSA9IHsKKwlKUF9QQVRURVJOKDAsIDAsIDEsIDE0MjgsIDE0MjgsIDEsIDE4KSwKKwlKUF9QQVRURVJOKDEsIDIsIDMsIDM4NDYsIDM4NDYsIDEsIDE4KSwKKwlKUF9QQVRURVJOKDIsIDAsIDEsIDEzODgsIDEzODgsIDEsIDE4KSwKKwlKUF9QQVRURVJOKDMsIDEsIDIsIDQwMDAsIDQwMDAsIDEsIDE4KSwKKwlKUF9QQVRURVJOKDQsIDAsIDUsIDE1MCwgMjMwLCAxLCAyMyksCisJSlBfUEFUVEVSTig1LCA2LCAxMCwgMjAwLCA1MDAsIDEsIDE2KSwKKwlKUF9QQVRURVJOKDYsIDExLCAyMCwgMjAwLCA1MDAsIDEsIDEyKSwKKwlKUF9QQVRURVJOKDcsIDUwLCAxMDAsIDEwMDAsIDIwMDAsIDIwLCAxKSwKKwlKUF9QQVRURVJOKDUsIDAsIDEsIDMzMywgMzMzLCAxLCA5KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmFkYXJfdHlwZXMganBfcmFkYXJfdHlwZXMgPSB7CisJLnJlZ2lvbgkJCT0gTkw4MDIxMV9ERlNfSlAsCisJLm51bV9yYWRhcl90eXBlcwk9IEFSUkFZX1NJWkUoanBfcmFkYXJfcmVmX3R5cGVzKSwKKwkucmFkYXJfdHlwZXMJCT0ganBfcmFkYXJfcmVmX3R5cGVzLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByYWRhcl90eXBlcyAqZGZzX2RvbWFpbnNbXSA9IHsKIAkmZXRzaV9yYWRhcl90eXBlc192MTUsCisJJmZjY19yYWRhcl90eXBlcywKKwkmanBfcmFkYXJfdHlwZXMsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93Y24zNnh4L3NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3djbjM2eHgvc21kLmMKaW5kZXggN2JmMGVmOC4uNjM5ODY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3djbjM2eHgvc21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3djbjM2eHgvc21kLmMKQEAgLTIwNjgsNyArMjA2OCw3IEBACiAJCWlmICghbXNnX2luZCkKIAkJCWdvdG8gbm9tZW07CiAJCW1zZ19pbmQtPm1zZ19sZW4gPSBsZW47Ci0JCW1zZ19pbmQtPm1zZyA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJbXNnX2luZC0+bXNnID0ga21lbWR1cChidWYsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbXNnX2luZC0+bXNnKSB7CiAJCQlrZnJlZShtc2dfaW5kKTsKIG5vbWVtOgpAQCAtMjA4MCw3ICsyMDgwLDYgQEAKIAkJCQkgICAgbXNnX2hlYWRlci0+bXNnX3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KLQkJbWVtY3B5KG1zZ19pbmQtPm1zZywgYnVmLCBsZW4pOwogCQltdXRleF9sb2NrKCZ3Y24tPmhhbF9pbmRfbXV0ZXgpOwogCQlsaXN0X2FkZF90YWlsKCZtc2dfaW5kLT5saXN0LCAmd2NuLT5oYWxfaW5kX3F1ZXVlKTsKIAkJcXVldWVfd29yayh3Y24tPmhhbF9pbmRfd3EsICZ3Y24tPmhhbF9pbmRfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYwppbmRleCA0ODA2YTQ5Li44MjBkNGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiBzdGF0aWMgaW50IHdpbF9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisJCQkJICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHdpcGh5X3RvX3dpbCh3aXBoeSk7CiAJaW50IHJjOwpAQCAtMjg4LDYgKzI4OCw3IEBACiAJfQogCiAJd2lsLT5zY2FuX3JlcXVlc3QgPSByZXF1ZXN0OworCW1vZF90aW1lcigmd2lsLT5zY2FuX3RpbWVyLCBqaWZmaWVzICsgV0lMNjIxMF9TQ0FOX1RPKTsKIAogCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAJY21kLmNtZC5udW1fY2hhbm5lbHMgPSAwOwpAQCAtNjcxLDcgKzY3Miw3IEBACiB9CiAKIHN0YXRpYyBpbnQgd2lsX2NmZzgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWMpCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCmluZGV4IGVjZGFiZTQuLjhkNGJjNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAl2b2lkIF9faW9tZW0gKnggPSB3bWlfYWRkcih3aWwsIHZyaW5nLT5od3RhaWwpOwogCiAJc2VxX3ByaW50ZihzLCAiVlJJTkcgJXMgPSB7XG4iLCBuYW1lKTsKLQlzZXFfcHJpbnRmKHMsICIgIHBhICAgICA9IDB4JTAxNmxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2cmluZy0+cGEpOworCXNlcV9wcmludGYocywgIiAgcGEgICAgID0gJXBhZFxuIiwgJnZyaW5nLT5wYSk7CiAJc2VxX3ByaW50ZihzLCAiICB2YSAgICAgPSAweCVwXG4iLCB2cmluZy0+dmEpOwogCXNlcV9wcmludGYocywgIiAgc2l6ZSAgID0gJWRcbiIsIHZyaW5nLT5zaXplKTsKIAlzZXFfcHJpbnRmKHMsICIgIHN3dGFpbCA9ICVkXG4iLCB2cmluZy0+c3d0YWlsKTsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQkJICAgdVswXSwgdVsxXSwgdVsyXSwgdVszXSk7CiAJCXNlcV9wcmludGYocywgIiAgRE1BID0gMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAogCQkJICAgdVs0XSwgdVs1XSwgdVs2XSwgdVs3XSk7Ci0JCXNlcV9wcmludGYocywgIiAgU0tCID0gJXBcbiIsIHNrYik7CisJCXNlcV9wcmludGYocywgIiAgU0tCID0gMHglcFxuIiwgc2tiKTsKIAogCQlpZiAoc2tiKSB7CiAJCQlza2JfZ2V0KHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCmluZGV4IDU4MjRjZDQuLjczNTkzYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAl9CiAKIAlpZiAoaXNyKQotCQl3aWxfZXJyKHdpbCwgInVuLWhhbmRsZWQgTUlTQyBJU1IgYml0cyAweCUwOHhcbiIsIGlzcik7CisJCXdpbF9kYmdfaXJxKHdpbCwgInVuLWhhbmRsZWQgTUlTQyBJU1IgYml0cyAweCUwOHhcbiIsIGlzcik7CiAKIAl3aWwtPmlzcl9taXNjID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCmluZGV4IDk1ZjRlZmUuLjExZTZkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAltZW1zZXQoJnN0YS0+c3RhdHMsIDAsIHNpemVvZihzdGEtPnN0YXRzKSk7CiB9CiAKLXN0YXRpYyB2b2lkIF93aWw2MjEwX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCB2b2lkICpic3NpZCkKK3N0YXRpYyB2b2lkIF93aWw2MjEwX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB1OCAqYnNzaWQpCiB7CiAJaW50IGNpZCA9IC1FTk9FTlQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3aWxfdG9fbmRldih3aWwpOwpAQCAtMTUwLDYgKzE1MCwxNSBAQAogCXNjaGVkdWxlX3dvcmsoJndpbC0+ZGlzY29ubmVjdF93b3JrZXIpOwogfQogCitzdGF0aWMgdm9pZCB3aWxfc2Nhbl90aW1lcl9mbih1bG9uZyB4KQoreworCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9ICh2b2lkICopeDsKKworCWNsZWFyX2JpdCh3aWxfc3RhdHVzX2Z3cmVhZHksICZ3aWwtPnN0YXR1cyk7CisJd2lsX2Vycih3aWwsICJTY2FuIHRpbWVvdXQgZGV0ZWN0ZWQsIHN0YXJ0IGZ3IGVycm9yIHJlY292ZXJ5XG4iKTsKKwlzY2hlZHVsZV93b3JrKCZ3aWwtPmZ3X2Vycm9yX3dvcmtlcik7Cit9CisKIHN0YXRpYyB2b2lkIHdpbF9md19lcnJvcl93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IGNvbnRhaW5lcl9vZih3b3JrLApAQCAtMTYxLDEyICsxNzAsMzAgQEAKIAlpZiAobm9fZndfcmVjb3ZlcnkpCiAJCXJldHVybjsKIAorCS8qIGluY3JlbWVudCBAcmVjb3ZlcnlfY291bnQgaWYgbGVzcyB0aGVuIFdJTDYyMTBfRldfUkVDT1ZFUllfVE8KKwkgKiBwYXNzZWQgc2luY2UgbGFzdCByZWNvdmVyeSBhdHRlbXB0CisJICovCisJaWYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh3aWwtPmxhc3RfZndfcmVjb3ZlcnkgKworCQkJCSAgV0lMNjIxMF9GV19SRUNPVkVSWV9UTykpCisJCXdpbC0+cmVjb3ZlcnlfY291bnQrKzsKKwllbHNlCisJCXdpbC0+cmVjb3ZlcnlfY291bnQgPSAxOyAvKiBmdyB3YXMgYWxpdmUgZm9yIGEgbG9uZyB0aW1lICovCisKKwlpZiAod2lsLT5yZWNvdmVyeV9jb3VudCA+IFdJTDYyMTBfRldfUkVDT1ZFUllfUkVUUklFUykgeworCQl3aWxfZXJyKHdpbCwgInRvbyBtYW55IHJlY292ZXJ5IGF0dGVtcHRzICglZCksIGdpdmluZyB1cFxuIiwKKwkJCXdpbC0+cmVjb3ZlcnlfY291bnQpOworCQlyZXR1cm47CisJfQorCisJd2lsLT5sYXN0X2Z3X3JlY292ZXJ5ID0gamlmZmllczsKKwogCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwogCXN3aXRjaCAod2Rldi0+aWZ0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCXdpbF9pbmZvKHdpbCwgImZ3IGVycm9yIHJlY292ZXJ5IHN0YXJ0ZWQuLi5cbiIpOworCQl3aWxfaW5mbyh3aWwsICJmdyBlcnJvciByZWNvdmVyeSBzdGFydGVkICh0cnkgJWQpLi4uXG4iLAorCQkJIHdpbC0+cmVjb3ZlcnlfY291bnQpOwogCQl3aWxfcmVzZXQod2lsKTsKIAogCQkvKiBuZWVkIHRvIHJlLWFsbG9jYXRlIFJ4IHJpbmcgYWZ0ZXIgcmVzZXQgKi8KQEAgLTIzMCw2ICsyNTcsNyBAQAogCiAJd2lsLT5wZW5kaW5nX2Nvbm5lY3RfY2lkID0gLTE7CiAJc2V0dXBfdGltZXIoJndpbC0+Y29ubmVjdF90aW1lciwgd2lsX2Nvbm5lY3RfdGltZXJfZm4sICh1bG9uZyl3aWwpOworCXNldHVwX3RpbWVyKCZ3aWwtPnNjYW5fdGltZXIsIHdpbF9zY2FuX3RpbWVyX2ZuLCAodWxvbmcpd2lsKTsKIAogCUlOSVRfV09SSygmd2lsLT5jb25uZWN0X3dvcmtlciwgd2lsX2Nvbm5lY3Rfd29ya2VyKTsKIAlJTklUX1dPUksoJndpbC0+ZGlzY29ubmVjdF93b3JrZXIsIHdpbF9kaXNjb25uZWN0X3dvcmtlcik7CkBAIC0yNDksMTAgKzI3NywxMiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKKwl3aWwtPmxhc3RfZndfcmVjb3ZlcnkgPSBqaWZmaWVzOworCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgd2lsNjIxMF9kaXNjb25uZWN0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgdm9pZCAqYnNzaWQpCit2b2lkIHdpbDYyMTBfZGlzY29ubmVjdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHU4ICpic3NpZCkKIHsKIAlkZWxfdGltZXJfc3luYygmd2lsLT5jb25uZWN0X3RpbWVyKTsKIAlfd2lsNjIxMF9kaXNjb25uZWN0KHdpbCwgYnNzaWQpOwpAQCAtMjYwLDYgKzI5MCw3IEBACiAKIHZvaWQgd2lsX3ByaXZfZGVpbml0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKKwlkZWxfdGltZXJfc3luYygmd2lsLT5zY2FuX3RpbWVyKTsKIAljYW5jZWxfd29ya19zeW5jKCZ3aWwtPmRpc2Nvbm5lY3Rfd29ya2VyKTsKIAljYW5jZWxfd29ya19zeW5jKCZ3aWwtPmZ3X2Vycm9yX3dvcmtlcik7CiAJbXV0ZXhfbG9jaygmd2lsLT5tdXRleCk7CkBAIC0zNjMsOCArMzk0LDggQEAKIAkJd2lsX2Vycih3aWwsICJGaXJtd2FyZSBub3QgcmVhZHlcbiIpOwogCQlyZXR1cm4gLUVUSU1FOwogCX0gZWxzZSB7Ci0JCXdpbF9kYmdfbWlzYyh3aWwsICJGVyByZWFkeSBhZnRlciAlZCBtc1xuIiwKLQkJCSAgICAgamlmZmllc190b19tc2Vjcyh0by1sZWZ0KSk7CisJCXdpbF9pbmZvKHdpbCwgIkZXIHJlYWR5IGFmdGVyICVkIG1zLiBIVyB2ZXJzaW9uIDB4JTA4eFxuIiwKKwkJCSBqaWZmaWVzX3RvX21zZWNzKHRvLWxlZnQpLCB3aWwtPmh3X3ZlcnNpb24pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM5MSw2ICs0MjIsNyBAQAogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQl3aWxfZGJnX21pc2Mod2lsLCAiQWJvcnQgc2Nhbl9yZXF1ZXN0IDB4JXBcbiIsCiAJCQkgICAgIHdpbC0+c2Nhbl9yZXF1ZXN0KTsKKwkJZGVsX3RpbWVyX3N5bmMoJndpbC0+c2Nhbl90aW1lcik7CiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgdHJ1ZSk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9CkBAIC01MjAsNiArNTUyLDcgQEAKIAluYXBpX2Rpc2FibGUoJndpbC0+bmFwaV90eCk7CiAKIAlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJndpbC0+c2Nhbl90aW1lcik7CiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgdHJ1ZSk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCmluZGV4IGZkY2FlYjguLjEwNmI2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCkBAIC0zMiwxMiArMzIsMjYgQEAKIAlyZXR1cm4gd2lsX2Rvd24od2lsKTsKIH0KIAorc3RhdGljIGludCB3aWxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gbmRldl90b193aWwobmRldik7CisKKwlpZiAobmV3X210dSA8IDY4IHx8IG5ld19tdHUgPiBJRUVFODAyMTFfTUFYX0RBVEFfTEVOX0RNRykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aWxfZGJnX21pc2Mod2lsLCAiY2hhbmdlIE1UVSAlZCAtPiAlZFxuIiwgbmRldi0+bXR1LCBuZXdfbXR1KTsKKwluZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgd2lsX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IHdpbF9vcGVuLAogCS5uZG9fc3RvcAkJPSB3aWxfc3RvcCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gd2lsX3N0YXJ0X3htaXQsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHdpbF9jaGFuZ2VfbXR1LAogfTsKIAogc3RhdGljIGludCB3aWw2MjEwX25ldGRldl9wb2xsX3J4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCmluZGV4IGYxZTFiYjMuLjFlMmUwN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYwpAQCAtNzQsOCArNzQsNiBAQAogCWlmIChyYykKIAkJZ290byByZWxlYXNlX2lycTsKIAotCXdpbF9pbmZvKHdpbCwgIkhXIHZlcnNpb246IDB4JTA4eFxuIiwgd2lsLT5od192ZXJzaW9uKTsKLQogCXJldHVybiAwOwogCiAgcmVsZWFzZV9pcnE6CkBAIC0xNDAsNyArMTM4LDcgQEAKIAkJZ290byBlcnJfcmVsZWFzZV9yZWc7CiAJfQogCS8qIHJvbGxiYWNrIHRvIGVycl9pb3VubWFwICovCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIkNTUiBhdCAlcFIgLT4gJXBcbiIsICZwZGV2LT5yZXNvdXJjZVswXSwgY3NyKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ1NSIGF0ICVwUiAtPiAweCVwXG4iLCAmcGRldi0+cmVzb3VyY2VbMF0sIGNzcik7CiAKIAl3aWwgPSB3aWxfaWZfYWxsb2MoZGV2LCBjc3IpOwogCWlmIChJU19FUlIod2lsKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcnhfcmVvcmRlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcnhfcmVvcmRlci5jCmluZGV4IGQwNDYyOWYuLjc0N2FlMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3J4X3Jlb3JkZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9yeF9yZW9yZGVyLmMKQEAgLTQ5LDEwICs0OSwxNyBAQAogewogCWludCBpbmRleDsKIAotCXdoaWxlIChzZXFfbGVzcyhyLT5oZWFkX3NlcV9udW0sIGhzZXEpKSB7CisJLyogbm90ZTogdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgd2l0aAorCSAqIGhzZXEgcHJlY2VkaW5nIHItPmhlYWRfc2VxX251bSwgaS5lIGl0IGlzIGFsd2F5cyB0cnVlCisJICogIXNlcV9sZXNzKGhzZXEsIHItPmhlYWRfc2VxX251bSkKKwkgKiBhbmQgdGh1cyBvbiBsb29wIGV4aXQgaXQgc2hvdWxkIGJlCisJICogci0+aGVhZF9zZXFfbnVtID09IGhzZXEKKwkgKi8KKwl3aGlsZSAoc2VxX2xlc3Moci0+aGVhZF9zZXFfbnVtLCBoc2VxKSAmJiByLT5zdG9yZWRfbXBkdV9udW0pIHsKIAkJaW5kZXggPSByZW9yZGVyX2luZGV4KHIsIHItPmhlYWRfc2VxX251bSk7CiAJCXdpbF9yZWxlYXNlX3Jlb3JkZXJfZnJhbWUod2lsLCByLCBpbmRleCk7CiAJfQorCXItPmhlYWRfc2VxX251bSA9IGhzZXE7CiB9CiAKIHN0YXRpYyB2b2lkIHdpbF9yZW9yZGVyX3JlbGVhc2Uoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLApAQCAtOTEsNiArOTgsMjIgQEAKIAogCXNwaW5fbG9jaygmci0+cmVvcmRlcl9sb2NrKTsKIAorCS8qKiBEdWUgdG8gdGhlIHJhY2UgYmV0d2VlbiBXTUkgZXZlbnRzLCB3aGVyZSBCQUNLIGVzdGFibGlzaG1lbnQKKwkgKiByZXBvcnRlZCwgYW5kIGRhdGEgUngsIGZldyBwYWNrZXRzIG1heSBiZSBwYXNzIHVwIGJlZm9yZSByZW9yZGVyCisJICogYnVmZmVyIGdldCBhbGxvY2F0ZWQuIENhdGNoIHVwIGJ5IHByZXRlbmRpbmcgU1NOIGlzIHdoYXQgd2UKKwkgKiBzZWUgaW4gdGhlIDEtc3QgUnggcGFja2V0CisJICovCisJaWYgKHItPmZpcnN0X3RpbWUpIHsKKwkJci0+Zmlyc3RfdGltZSA9IGZhbHNlOworCQlpZiAoc2VxICE9IHItPmhlYWRfc2VxX251bSkgeworCQkJd2lsX2Vycih3aWwsICJFcnJvcjogMS1zdCBmcmFtZSB3aXRoIHdyb25nIHNlcXVlbmNlIgorCQkJCSIgJWQsIHNob3VsZCBiZSAlZC4gRml4aW5nLi4uXG4iLCBzZXEsCisJCQkJci0+aGVhZF9zZXFfbnVtKTsKKwkJCXItPmhlYWRfc2VxX251bSA9IHNlcTsKKwkJCXItPnNzbiA9IHNlcTsKKwkJfQorCX0KKwogCS8qIGZyYW1lIHdpdGggb3V0IG9mIGRhdGUgc2VxdWVuY2UgbnVtYmVyICovCiAJaWYgKHNlcV9sZXNzKHNlcSwgci0+aGVhZF9zZXFfbnVtKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xNjIsNiArMTg1LDcgQEAKIAlyLT5oZWFkX3NlcV9udW0gPSBzc247CiAJci0+YnVmX3NpemUgPSBzaXplOwogCXItPnN0b3JlZF9tcGR1X251bSA9IDA7CisJci0+Zmlyc3RfdGltZSA9IHRydWU7CiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwppbmRleCBjOGM1NDc0Li4wNzg0ZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCkBAIC02NCw2ICs2NCwyMiBAQAogCXJldHVybiB2cmluZy0+c2l6ZSAtIHVzZWQgLSAxOwogfQogCisvKioKKyAqIHdpbF92cmluZ193bWFya19sb3cgLSBsb3cgd2F0ZXJtYXJrIGZvciBhdmFpbGFibGUgZGVzY3JpcHRvciBzcGFjZQorICovCitzdGF0aWMgaW5saW5lIGludCB3aWxfdnJpbmdfd21hcmtfbG93KHN0cnVjdCB2cmluZyAqdnJpbmcpCit7CisJcmV0dXJuIHZyaW5nLT5zaXplLzg7Cit9CisKKy8qKgorICogd2lsX3ZyaW5nX3dtYXJrX2hpZ2ggLSBoaWdoIHdhdGVybWFyayBmb3IgYXZhaWxhYmxlIGRlc2NyaXB0b3Igc3BhY2UKKyAqLworc3RhdGljIGlubGluZSBpbnQgd2lsX3ZyaW5nX3dtYXJrX2hpZ2goc3RydWN0IHZyaW5nICp2cmluZykKK3sKKwlyZXR1cm4gdnJpbmctPnNpemUvNDsKK30KKwogc3RhdGljIGludCB3aWxfdnJpbmdfYWxsb2Moc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBzdHJ1Y3QgdnJpbmcgKnZyaW5nKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbF90b19kZXYod2lsKTsKQEAgLTk4LDggKzExNCw4IEBACiAJCV9kLT5kbWEuc3RhdHVzID0gVFhfRE1BX1NUQVRVU19EVTsKIAl9CiAKLQl3aWxfZGJnX21pc2Mod2lsLCAidnJpbmdbJWRdIDB4JXA6MHglMDE2bGx4IDB4JXBcbiIsIHZyaW5nLT5zaXplLAotCQkgICAgIHZyaW5nLT52YSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2cmluZy0+cGEsIHZyaW5nLT5jdHgpOworCXdpbF9kYmdfbWlzYyh3aWwsICJ2cmluZ1slZF0gMHglcDolcGFkIDB4JXBcbiIsIHZyaW5nLT5zaXplLAorCQkgICAgIHZyaW5nLT52YSwgJnZyaW5nLT5wYSwgdnJpbmctPmN0eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg4MCw4ICs4OTYsOCBAQAogCXBhID0gZG1hX21hcF9zaW5nbGUoZGV2LCBza2ItPmRhdGEsCiAJCQlza2JfaGVhZGxlbihza2IpLCBETUFfVE9fREVWSUNFKTsKIAotCXdpbF9kYmdfdHhyeCh3aWwsICJUeCBza2IgJWQgYnl0ZXMgJXAgLT4gJSMwOGxseFxuIiwgc2tiX2hlYWRsZW4oc2tiKSwKLQkJICAgICBza2ItPmRhdGEsICh1bnNpZ25lZCBsb25nIGxvbmcpcGEpOworCXdpbF9kYmdfdHhyeCh3aWwsICJUeCBza2IgJWQgYnl0ZXMgMHglcCAtPiAlcGFkXG4iLCBza2JfaGVhZGxlbihza2IpLAorCQkgICAgIHNrYi0+ZGF0YSwgJnBhKTsKIAl3aWxfaGV4X2R1bXBfdHhyeCgiVHggIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKIAkJCSAgc2tiLT5kYXRhLCBza2JfaGVhZGxlbihza2IpLCBmYWxzZSk7CiAKQEAgLTEwMDcsNyArMTAyMyw3IEBACiAJcmMgPSB3aWxfdHhfdnJpbmcod2lsLCB2cmluZywgc2tiKTsKIAogCS8qIGRvIHdlIHN0aWxsIGhhdmUgZW5vdWdoIHJvb20gaW4gdGhlIHZyaW5nPyAqLwotCWlmICh3aWxfdnJpbmdfYXZhaWxfdHgodnJpbmcpIDwgdnJpbmctPnNpemUvOCkKKwlpZiAod2lsX3ZyaW5nX2F2YWlsX3R4KHZyaW5nKSA8IHdpbF92cmluZ193bWFya19sb3codnJpbmcpKQogCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMod2lsX3RvX25kZXYod2lsKSk7CiAKIAlzd2l0Y2ggKHJjKSB7CkBAIC0xMTE2LDcgKzExMzIsNyBAQAogCQkJZG9uZSsrOwogCQl9CiAJfQotCWlmICh3aWxfdnJpbmdfYXZhaWxfdHgodnJpbmcpID4gdnJpbmctPnNpemUvNCkKKwlpZiAod2lsX3ZyaW5nX2F2YWlsX3R4KHZyaW5nKSA+IHdpbF92cmluZ193bWFya19oaWdoKHZyaW5nKSkKIAkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHdpbF90b19uZGV2KHdpbCkpOwogCiAJcmV0dXJuIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKaW5kZXggMmEyZGVjNy4uZTI1ZWRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaApAQCAtMzUsMTEgKzM1LDE0IEBACiAjZGVmaW5lIFdJTDYyMTBfTUVNX1NJWkUgKDIqMTAyNCoxMDI0VUwpCiAKICNkZWZpbmUgV0lMNjIxMF9SWF9SSU5HX1NJWkUJKDEyOCkKLSNkZWZpbmUgV0lMNjIxMF9UWF9SSU5HX1NJWkUJKDEyOCkKKyNkZWZpbmUgV0lMNjIxMF9UWF9SSU5HX1NJWkUJKDUxMikKICNkZWZpbmUgV0lMNjIxMF9NQVhfVFhfUklOR1MJKDI0KSAvKiBIVyBsaW1pdCAqLwogI2RlZmluZSBXSUw2MjEwX01BWF9DSUQJCSg4KSAvKiBIVyBsaW1pdCAqLwogI2RlZmluZSBXSUw2MjEwX05BUElfQlVER0VUCSgxNikgLyogYXJiaXRyYXJ5ICovCiAjZGVmaW5lIFdJTDYyMTBfSVRSX1RSU0gJKDEwMDAwKSAvKiBhcmJpdHJhcnkgLSBhYm91dCAxNSBJUlFzL21zZWMgKi8KKyNkZWZpbmUgV0lMNjIxMF9GV19SRUNPVkVSWV9SRVRSSUVTCSg1KSAvKiB0cnkgdG8gcmVjb3ZlciB0aGlzIG1hbnkgdGltZXMgKi8KKyNkZWZpbmUgV0lMNjIxMF9GV19SRUNPVkVSWV9UTwltc2Vjc190b19qaWZmaWVzKDUwMDApCisjZGVmaW5lIFdJTDYyMTBfU0NBTl9UTwkJbXNlY3NfdG9famlmZmllcygxMDAwMCkKIAogLyogSGFyZHdhcmUgZGVmaW5pdGlvbnMgYmVnaW4gKi8KIApAQCAtMzAxLDYgKzMwNCw3IEBACiAJdTE2IGJ1Zl9zaXplOwogCXUxNiB0aW1lb3V0OwogCXU4IGRpYWxvZ190b2tlbjsKKwlib29sIGZpcnN0X3RpbWU7IC8qIGlzIGl0IDEtc3QgdGltZSB0aGlzIGJ1ZmZlciB1c2VkPyAqLwogfTsKIAogc3RydWN0IHdpbDYyMTBfc3RhdHMgewpAQCAtMzYwLDYgKzM2NCw4IEBACiAJdTMyIGZ3X3ZlcnNpb247CiAJdTMyIGh3X3ZlcnNpb247CiAJdTggbl9taWRzOyAvKiBudW1iZXIgb2YgYWRkaXRpb25hbCBNSURzIGFzIHJlcG9ydGVkIGJ5IEZXICovCisJaW50IHJlY292ZXJ5X2NvdW50OyAvKiBudW0gb2YgRlcgcmVjb3ZlcnkgYXR0ZW1wdHMgaW4gYSBzaG9ydCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2Z3X3JlY292ZXJ5OyAvKiBqaWZmaWVzIG9mIGxhc3QgZncgcmVjb3ZlcnkgKi8KIAkvKiBwcm9maWxlICovCiAJdTMyIG1vbml0b3JfZmxhZ3M7CiAJdTMyIHNlY3VyZV9wY3A7IC8qIGNyZWF0ZSBzZWN1cmUgUENQPyAqLwpAQCAtMzgxLDYgKzM4Nyw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGRpc2Nvbm5lY3Rfd29ya2VyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBmd19lcnJvcl93b3JrZXI7CS8qIGZvciBGVyBlcnJvciByZWNvdmVyeSAqLwogCXN0cnVjdCB0aW1lcl9saXN0IGNvbm5lY3RfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsgLyogZGV0ZWN0IHNjYW4gdGltZW91dCAqLwogCWludCBwZW5kaW5nX2Nvbm5lY3RfY2lkOwogCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZ193bWlfZXY7CiAJLyoKQEAgLTUwNyw3ICs1MTQsNyBAQAogaW50IHdtaV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCB2b2lkICphZGRyKTsKIGludCB3bWlfcGNwX3N0YXJ0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgaW50IGJpLCB1OCB3bWlfbmV0dHlwZSwgdTggY2hhbik7CiBpbnQgd21pX3BjcF9zdG9wKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7Ci12b2lkIHdpbDYyMTBfZGlzY29ubmVjdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHZvaWQgKmJzc2lkKTsKK3ZvaWQgd2lsNjIxMF9kaXNjb25uZWN0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgdTggKmJzc2lkKTsKIAogaW50IHdpbF9yeF9pbml0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiB2b2lkIHdpbF9yeF9maW5pKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCmluZGV4IDJiYTU2ZWUuLjZjYzBlMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAltaWdodF9zbGVlcCgpOwogCiAJaWYgKCF0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3cmVhZHksICZ3aWwtPnN0YXR1cykpIHsKLQkJd2lsX2Vycih3aWwsICJGVyBub3QgcmVhZHlcbiIpOworCQl3aWxfZXJyKHdpbCwgIldNSTogY2Fubm90IHNlbmQgY29tbWFuZCB3aGlsZSBGVyBub3QgcmVhZHlcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTI3Niw4ICsyNzYsOCBAQAogCXdpbC0+ZndfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGV2dC0+c3dfdmVyc2lvbik7CiAJd2lsLT5uX21pZHMgPSBldnQtPm51bW9mX2FkZGl0aW9uYWxfbWlkczsKIAotCXdpbF9kYmdfd21pKHdpbCwgIkZXIHZlci4gJWQ7IE1BQyAlcE07ICVkIE1JRCdzXG4iLCB3aWwtPmZ3X3ZlcnNpb24sCi0JCSAgICBldnQtPm1hYywgd2lsLT5uX21pZHMpOworCXdpbF9pbmZvKHdpbCwgIkZXIHZlci4gJWQ7IE1BQyAlcE07ICVkIE1JRCdzXG4iLCB3aWwtPmZ3X3ZlcnNpb24sCisJCSBldnQtPm1hYywgd2lsLT5uX21pZHMpOwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5kZXYtPmRldl9hZGRyKSkgewogCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGV2dC0+bWFjLCBFVEhfQUxFTik7CkBAIC0yOTAsNyArMjkwLDcgQEAKIHN0YXRpYyB2b2lkIHdtaV9ldnRfZndfcmVhZHkoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsIHZvaWQgKmQsCiAJCQkgICAgIGludCBsZW4pCiB7Ci0Jd2lsX2RiZ193bWkod2lsLCAiV01JOiBGVyByZWFkeVxuIik7CisJd2lsX2RiZ193bWkod2lsLCAiV01JOiBnb3QgRlcgcmVhZHkgZXZlbnRcbiIpOwogCiAJc2V0X2JpdCh3aWxfc3RhdHVzX2Z3cmVhZHksICZ3aWwtPnN0YXR1cyk7CiAJLyogcmV1c2Ugd21pX3JlYWR5IGZvciB0aGUgZmlybXdhcmUgcmVhZHkgaW5kaWNhdGlvbiAqLwpAQCAtMzQ4LDkgKzM0OCwxMCBAQAogewogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQlzdHJ1Y3Qgd21pX3NjYW5fY29tcGxldGVfZXZlbnQgKmRhdGEgPSBkOwotCQlib29sIGFib3J0ZWQgPSAoZGF0YS0+c3RhdHVzICE9IDApOworCQlib29sIGFib3J0ZWQgPSAoZGF0YS0+c3RhdHVzICE9IFdNSV9TQ0FOX1NVQ0NFU1MpOwogCiAJCXdpbF9kYmdfd21pKHdpbCwgIlNDQU5fQ09NUExFVEUoMHglMDh4KVxuIiwgZGF0YS0+c3RhdHVzKTsKKwkJZGVsX3RpbWVyX3N5bmMoJndpbC0+c2Nhbl90aW1lcik7CiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgYWJvcnRlZCk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9IGVsc2UgewpAQCAtNjU4LDIxICs2NTksMjcgQEAKIAl1OCAqY21kOwogCXZvaWQgX19pb21lbSAqc3JjOwogCXVsb25nIGZsYWdzOworCXVuc2lnbmVkIG47CiAKIAlpZiAoIXRlc3RfYml0KHdpbF9zdGF0dXNfcmVzZXRfZG9uZSwgJndpbC0+c3RhdHVzKSkgewogCQl3aWxfZXJyKHdpbCwgIlJlc2V0IG5vdCBjb21wbGV0ZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JZm9yICg7OykgeworCWZvciAobiA9IDA7OyBuKyspIHsKIAkJdTE2IGxlbjsKIAogCQlyLT5oZWFkID0gaW9yZWFkMzIod2lsLT5jc3IgKyBIT1NUX01CT1ggKwogCQkJCSAgIG9mZnNldG9mKHN0cnVjdCB3aWw2MjEwX21ib3hfY3RsLCByeC5oZWFkKSk7Ci0JCWlmIChyLT50YWlsID09IHItPmhlYWQpCisJCWlmIChyLT50YWlsID09IHItPmhlYWQpIHsKKwkJCWlmIChuID09IDApCisJCQkJd2lsX2RiZ193bWkod2lsLCAiTm8gZXZlbnRzP1xuIik7CiAJCQlyZXR1cm47CisJCX0KIAotCQkvKiByZWFkIGNtZCBmcm9tIHRhaWwgKi8KKwkJd2lsX2RiZ193bWkod2lsLCAiTWJveCBoZWFkICUwOHggdGFpbCAlMDh4XG4iLAorCQkJICAgIHItPmhlYWQsIHItPnRhaWwpOworCQkvKiByZWFkIGNtZCBkZXNjcmlwdG9yIGZyb20gdGFpbCAqLwogCQl3aWxfbWVtY3B5X2Zyb21pb18zMigmZF90YWlsLCB3aWwtPmNzciArIEhPU1RBRERSKHItPnRhaWwpLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB3aWw2MjEwX21ib3hfcmluZ19kZXNjKSk7CiAJCWlmIChkX3RhaWwuc3luYyA9PSAwKSB7CkBAIC02ODAsMTMgKzY4NywxOCBAQAogCQkJcmV0dXJuOwogCQl9CiAKKwkJLyogcmVhZCBjbWQgaGVhZGVyIGZyb20gZGVzY3JpcHRvciAqLwogCQlpZiAoMCAhPSB3bWlfcmVhZF9oZHIod2lsLCBkX3RhaWwuYWRkciwgJmhkcikpIHsKIAkJCXdpbF9lcnIod2lsLCAiTWJveCBldnQgYXQgMHglMDh4P1xuIiwKIAkJCQlsZTMyX3RvX2NwdShkX3RhaWwuYWRkcikpOwogCQkJcmV0dXJuOwogCQl9Ci0KIAkJbGVuID0gbGUxNl90b19jcHUoaGRyLmxlbik7CisJCXdpbF9kYmdfd21pKHdpbCwgIk1ib3ggZXZ0ICUwNHggJTA0eCAlMDR4ICUwMnhcbiIsCisJCQkgICAgbGUxNl90b19jcHUoaGRyLnNlcSksIGxlbiwgbGUxNl90b19jcHUoaGRyLnR5cGUpLAorCQkJICAgIGhkci5mbGFncyk7CisKKwkJLyogcmVhZCBjbWQgYnVmZmVyIGZyb20gZGVzY3JpcHRvciAqLwogCQlzcmMgPSB3bWlfYnVmZmVyKHdpbCwgZF90YWlsLmFkZHIpICsKIAkJICAgICAgc2l6ZW9mKHN0cnVjdCB3aWw2MjEwX21ib3hfaGRyKTsKIAkJZXZ0ID0ga21hbGxvYyhBTElHTihvZmZzZXRvZihzdHJ1Y3QgcGVuZGluZ193bWlfZXZlbnQsCkBAIC03MDIsOSArNzE0LDYgQEAKIAkJaW93cml0ZTMyKDAsIHdpbC0+Y3NyICsgSE9TVEFERFIoci0+dGFpbCkgKwogCQkJICBvZmZzZXRvZihzdHJ1Y3Qgd2lsNjIxMF9tYm94X3JpbmdfZGVzYywgc3luYykpOwogCQkvKiBpbmRpY2F0ZSAqLwotCQl3aWxfZGJnX3dtaSh3aWwsICJNYm94IGV2dCAlMDR4ICUwNHggJTA0eCAlMDJ4XG4iLAotCQkJICAgIGxlMTZfdG9fY3B1KGhkci5zZXEpLCBsZW4sIGxlMTZfdG9fY3B1KGhkci50eXBlKSwKLQkJCSAgICBoZHIuZmxhZ3MpOwogCQlpZiAoKGhkci50eXBlID09IFdJTF9NQk9YX0hEUl9UWVBFX1dNSSkgJiYKIAkJICAgIChsZW4gPj0gc2l6ZW9mKHN0cnVjdCB3aWw2MjEwX21ib3hfaGRyX3dtaSkpKSB7CiAJCQlzdHJ1Y3Qgd2lsNjIxMF9tYm94X2hkcl93bWkgKndtaSA9ICZldnQtPmV2ZW50LndtaTsKQEAgLTczNCw2ICs3NDMsOCBAQAogCQkJd2lsX2RiZ193bWkod2lsLCAicXVldWVfd29yayAtPiAlZFxuIiwgcSk7CiAJCX0KIAl9CisJaWYgKG4gPiAxKQorCQl3aWxfZGJnX3dtaSh3aWwsICIlcyAtPiAlZCBldmVudHMgcHJvY2Vzc2VkXG4iLCBfX2Z1bmNfXywgbik7CiB9CiAKIGludCB3bWlfY2FsbChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHUxNiBjbWRpZCwgdm9pZCAqYnVmLCB1MTYgbGVuLApAQCAtODAyLDYgKzgxMyw3IEBACiAJCS5uZXR3b3JrX3R5cGUgPSB3bWlfbmV0dHlwZSwKIAkJLmRpc2FibGVfc2VjX29mZmxvYWQgPSAxLAogCQkuY2hhbm5lbCA9IGNoYW4gLSAxLAorCQkucGNwX21heF9hc3NvY19zdGEgPSBXSUw2MjEwX01BWF9DSUQsCiAJfTsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3Qgd2lsNjIxMF9tYm94X2hkcl93bWkgd21pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaAppbmRleCA1MGI4NTI4Li4xNzMzNGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaApAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBfX1dJTE9DSVRZX1dNSV9IX18KIAogLyogR2VuZXJhbCAqLwotCisjZGVmaW5lIFdJTE9DSVRZX01BWF9BU1NPQ19TVEEgKDgpCiAjZGVmaW5lIFdNSV9NQUNfTEVOCQkoNikKICNkZWZpbmUgV01JX1BST1hfUkFOR0VfTlVNCSgzKQogCkBAIC0yMTksMTUgKzIxOSw2IEBACiAJX19sZTE2IGRpc2Nvbm5lY3RfcmVhc29uOwogfSBfX3BhY2tlZDsKIAotLyoKLSAqIFdNSV9SRUNPTk5FQ1RfQ01ESUQKLSAqLwotc3RydWN0IHdtaV9yZWNvbm5lY3RfY21kIHsKLQl1OCBjaGFubmVsOwkJCS8qIGhpbnQgKi8KLQl1OCByZXNlcnZlZDsKLQl1OCBic3NpZFtXTUlfTUFDX0xFTl07CQkvKiBtYW5kYXRvcnkgaWYgc2V0ICovCi19IF9fcGFja2VkOwotCiAKIC8qCiAgKiBXTUlfU0VUX1BNS19DTURJRApAQCAtMjk2LDExICsyODcsMTMgQEAKIAlXTUlfTE9OR19TQ0FOCQk9IDAsCiAJV01JX1NIT1JUX1NDQU4JCT0gMSwKIAlXTUlfUEJDX1NDQU4JCT0gMiwKKwlXTUlfQUNUSVZFX1NDQU4JCT0gMywKKwlXTUlfRElSRUNUX1NDQU4JCT0gNCwKIH07CiAKIHN0cnVjdCB3bWlfc3RhcnRfc2Nhbl9jbWQgewotCXU4IHJlc2VydmVkWzhdOwotCisJdTggZGlyZWN0X3NjYW5fbWFjX2FkZHJbNl07CisJdTggcmVzZXJ2ZWRbMl07CiAJX19sZTMyIGhvbWVfZHdlbGxfdGltZTsJLyogTWF4IGR1cmF0aW9uIGluIHRoZSBob21lIGNoYW5uZWwobXMpICovCiAJX19sZTMyIGZvcmNlX3NjYW5faW50ZXJ2YWw7CS8qIFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiBzY2FucyAobXMpKi8KIAl1OCBzY2FuX3R5cGU7CQkvKiB3bWlfc2Nhbl90eXBlICovCkBAIC0zMzIsNiArMzI1LDcgQEAKIAl1OCBzc2lkW1dNSV9NQVhfU1NJRF9MRU5dOwogfSBfX3BhY2tlZDsKIAorCiAvKgogICogV01JX1NFVF9BUFBJRV9DTURJRAogICogQWRkIEFwcGxpY2F0aW9uIHNwZWNpZmllZCBJRSB0byBhIG1hbmFnZW1lbnQgZnJhbWUKQEAgLTQyNyw3ICs0MjEsNyBAQAogCV9fbGUxNiBmcmFnX251bTsKIAlfX2xlNjQgc3NfbWFzazsKIAl1OCBuZXR3b3JrX3R5cGU7Ci0JdTggcmVzZXJ2ZWQ7CisJdTggcGNwX21heF9hc3NvY19zdGE7CiAJdTggZGlzYWJsZV9zZWNfb2ZmbG9hZDsKIAl1OCBkaXNhYmxlX3NlYzsKIH0gX19wYWNrZWQ7CkBAIC00NTAsNyArNDQ0LDcgQEAKIHN0cnVjdCB3bWlfcG9ydF9hbGxvY2F0ZV9jbWQgewogCXU4IG1hY1tXTUlfTUFDX0xFTl07CiAJdTggcG9ydF9yb2xlOwotCXU4IG1pZGlkOworCXU4IG1pZDsKIH0gX19wYWNrZWQ7CiAKIC8qCkBAIC00NjcsNiArNDYxLDcgQEAKIGVudW0gd21pX2Rpc2NvdmVyeV9tb2RlIHsKIAlXTUlfRElTQ09WRVJZX01PREVfTk9OX09GRkxPQUQJPSAwLAogCVdNSV9ESVNDT1ZFUllfTU9ERV9PRkZMT0FECT0gMSwKKwlXTUlfRElTQ09WRVJZX01PREVfUEVFUjJQRUVSCT0gMiwKIH07CiAKIHN0cnVjdCB3bWlfcDJwX2NmZ19jbWQgewpAQCAtNDkzLDcgKzQ4OCw4IEBACiAgKi8KIHN0cnVjdCB3bWlfcGNwX3N0YXJ0X2NtZCB7CiAJX19sZTE2IGJjb25faW50ZXJ2YWw7Ci0JdTggcmVzZXJ2ZWQwWzEwXTsKKwl1OCBwY3BfbWF4X2Fzc29jX3N0YTsKKwl1OCByZXNlcnZlZDBbOV07CiAJdTggbmV0d29ya190eXBlOwogCXU4IGNoYW5uZWw7CiAJdTggZGlzYWJsZV9zZWNfb2ZmbG9hZDsKQEAgLTg1Nyw2ICs4NTMsNyBAQAogCVdNSV9SRl9NR01UX1NUQVRVU19FVkVOVElECQk9IDB4MTg1MywKIAlXTUlfQkZfU01fTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODM4LAogCVdNSV9SWF9NR01UX1BBQ0tFVF9FVkVOVElECQk9IDB4MTg0MCwKKwlXTUlfVFhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJPSAweDE4NDEsCiAKIAkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGV2ZW50cyAqLwogCVdNSV9EQVRBX1BPUlRfT1BFTl9FVkVOVElECQk9IDB4MTg2MCwKQEAgLTEwNDAsMTYgKzEwMzcsMjMgQEAKIHN0cnVjdCB3bWlfZGlzY29ubmVjdF9ldmVudCB7CiAJX19sZTE2IHByb3RvY29sX3JlYXNvbl9zdGF0dXM7CS8qIHJlYXNvbiBjb2RlLCBzZWUgODAyLjExIHNwZWMuICovCiAJdTggYnNzaWRbV01JX01BQ19MRU5dOwkJLyogc2V0IGlmIGtub3duICovCi0JdTggZGlzY29ubmVjdF9yZWFzb247CQkvKiBzZWUgd21pX2Rpc2Nvbm5lY3RfcmVhc29uX2UgKi8KLQl1OCBhc3NvY19yZXNwX2xlbjsKLQl1OCBhc3NvY19pbmZvWzBdOworCXU4IGRpc2Nvbm5lY3RfcmVhc29uOwkJLyogc2VlIHdtaV9kaXNjb25uZWN0X3JlYXNvbiAqLworCXU4IGFzc29jX3Jlc3BfbGVuOwkJLyogbm90IGluIHVzZSAqLworCXU4IGFzc29jX2luZm9bMF07CQkvKiBub3QgaW4gdXNlICovCiB9IF9fcGFja2VkOwogCiAvKgogICogV01JX1NDQU5fQ09NUExFVEVfRVZFTlRJRAogICovCitlbnVtIHNjYW5fc3RhdHVzIHsKKwlXTUlfU0NBTl9TVUNDRVNTCT0gMCwKKwlXTUlfU0NBTl9GQUlMRUQJCT0gMSwKKwlXTUlfU0NBTl9BQk9SVEVECT0gMiwKKwlXTUlfU0NBTl9SRUpFQ1RFRAk9IDMsCit9OworCiBzdHJ1Y3Qgd21pX3NjYW5fY29tcGxldGVfZXZlbnQgewotCV9fbGUzMiBzdGF0dXM7CisJX19sZTMyIHN0YXR1czsJLyogc2Nhbl9zdGF0dXMgKi8KIH0gX19wYWNrZWQ7CiAKIC8qCkBAIC0xMjU2LDYgKzEyNjAsMTQgQEAKIAl1OCBjaGFubmVsOwkvKiBGcm9tIFJhZGlvIE1OR1IgKi8KIH0gX19wYWNrZWQ7CiAKKworLyoKKyAqIFdNSV9UWF9NR01UX1BBQ0tFVF9FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfdHhfbWdtdF9wYWNrZXRfZXZlbnQgeworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCiBzdHJ1Y3Qgd21pX3J4X21nbXRfcGFja2V0X2V2ZW50IHsKIAlzdHJ1Y3Qgd21pX3J4X21nbXRfaW5mbyBpbmZvOwogCXU4IHBheWxvYWRbMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCmluZGV4IDA4OGQ1NDQuLmUzZjY3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCkBAIC0xLDcgKzEsOCBAQAogY29uZmlnIEI0MwogCXRyaXN0YXRlICJCcm9hZGNvbSA0M3h4IHdpcmVsZXNzIHN1cHBvcnQgKG1hYzgwMjExIHN0YWNrKSIKLQlkZXBlbmRzIG9uIFNTQl9QT1NTSUJMRSAmJiBNQUM4MDIxMSAmJiBIQVNfRE1BCi0Jc2VsZWN0IFNTQgorCWRlcGVuZHMgb24gKEJDTUFfUE9TU0lCTEUgfHwgU1NCX1BPU1NJQkxFKSAmJiBNQUM4MDIxMSAmJiBIQVNfRE1BCisJc2VsZWN0IEJDTUEgaWYgQjQzX0JDTUEKKwlzZWxlY3QgU1NCIGlmIEI0M19TU0IKIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQogCSAgYjQzIGlzIGEgZHJpdmVyIGZvciB0aGUgQnJvYWRjb20gNDN4eCBzZXJpZXMgd2lyZWxlc3MgZGV2aWNlcy4KQEAgLTI3LDE0ICsyOCwzMyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTS4KIAogY29uZmlnIEI0M19CQ01BCi0JYm9vbCAiU3VwcG9ydCBmb3IgQkNNQSBidXMiCi0JZGVwZW5kcyBvbiBCNDMgJiYgKEJDTUEgPSB5IHx8IEJDTUEgPSBCNDMpCi0JZGVmYXVsdCB5CisJYm9vbAogCiBjb25maWcgQjQzX1NTQgogCWJvb2wKLQlkZXBlbmRzIG9uIEI0MyAmJiAoU1NCID0geSB8fCBTU0IgPSBCNDMpCi0JZGVmYXVsdCB5CisKK2Nob2ljZQorCXByb21wdCAiU3VwcG9ydGVkIGJ1cyB0eXBlcyIKKwlkZXBlbmRzIG9uIEI0MworCWRlZmF1bHQgQjQzX0JDTUFfQU5EX1NTQgorCitjb25maWcgQjQzX0JVU0VTX0JDTUFfQU5EX1NTQgorCWJvb2wgIkJDTUEgYW5kIFNTQiIKKwlkZXBlbmRzIG9uIEJDTUFfUE9TU0lCTEUgJiYgU1NCX1BPU1NJQkxFCisJc2VsZWN0IEI0M19CQ01BCisJc2VsZWN0IEI0M19TU0IKKworY29uZmlnIEI0M19CVVNFU19CQ01BCisJYm9vbCAiQkNNQSBvbmx5IgorCWRlcGVuZHMgb24gQkNNQV9QT1NTSUJMRQorCXNlbGVjdCBCNDNfQkNNQQorCitjb25maWcgQjQzX0JVU0VTX1NTQgorCWJvb2wgIlNTQiBvbmx5IgorCWRlcGVuZHMgb24gU1NCX1BPU1NJQkxFCisJc2VsZWN0IEI0M19TU0IKKworZW5kY2hvaWNlCiAKICMgQXV0by1zZWxlY3QgU1NCIFBDSS1IT1NUIHN1cHBvcnQsIGlmIHBvc3NpYmxlCiBjb25maWcgQjQzX1BDSV9BVVRPU0VMRUNUCkBAIC01Myw3ICs3Myw3IEBACiAKIGNvbmZpZyBCNDNfUENNQ0lBCiAJYm9vbCAiQnJvYWRjb20gNDN4eCBQQ01DSUEgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCNDMgJiYgU1NCX1BDTUNJQUhPU1RfUE9TU0lCTEUKKwlkZXBlbmRzIG9uIEI0MyAmJiBCNDNfU1NCICYmIFNTQl9QQ01DSUFIT1NUX1BPU1NJQkxFCiAJc2VsZWN0IFNTQl9QQ01DSUFIT1NUCiAJLS0taGVscC0tLQogCSAgQnJvYWRjb20gNDN4eCBQQ01DSUEgZGV2aWNlIHN1cHBvcnQuCkBAIC03Myw3ICs5Myw3IEBACiAKIGNvbmZpZyBCNDNfU0RJTwogCWJvb2wgIkJyb2FkY29tIDQzeHggU0RJTyBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEI0MyAmJiBTU0JfU0RJT0hPU1RfUE9TU0lCTEUKKwlkZXBlbmRzIG9uIEI0MyAmJiBCNDNfU1NCICYmIFNTQl9TRElPSE9TVF9QT1NTSUJMRQogCXNlbGVjdCBTU0JfU0RJT0hPU1QKIAktLS1oZWxwLS0tCiAJICBCcm9hZGNvbSA0M3h4IGRldmljZSBzdXBwb3J0IGZvciBTb2Z0LU1BQyBTRElPIGRldmljZXMuCkBAIC05OCw3ICsxMTgsNyBAQAogCiBjb25maWcgQjQzX1BJTwogCWJvb2wKLQlkZXBlbmRzIG9uIEI0MworCWRlcGVuZHMgb24gQjQzICYmIEI0M19TU0IKIAlzZWxlY3QgU1NCX0JMT0NLSU8KIAlkZWZhdWx0IHkKIApAQCAtMTE2LDcgKzEzNiw3IEBACiAKIGNvbmZpZyBCNDNfUEhZX0xQCiAJYm9vbCAiU3VwcG9ydCBmb3IgbG93LXBvd2VyIChMUC1QSFkpIGRldmljZXMiCi0JZGVwZW5kcyBvbiBCNDMKKwlkZXBlbmRzIG9uIEI0MyAmJiBCNDNfU1NCCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIExQLVBIWS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaAppbmRleCA1NDM3NmZkLi40MTEzYjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCkBAIC05MTUsMTAgKzkxNSw2IEBACiAJY2hhciBybmdfbmFtZVszMCArIDFdOwogI2VuZGlmIC8qIENPTkZJR19CNDNfSFdSTkcgKi8KIAotCS8qIExpc3Qgb2YgYWxsIHdpcmVsZXNzIGRldmljZXMgb24gdGhpcyBjaGlwICovCi0Jc3RydWN0IGxpc3RfaGVhZCBkZXZsaXN0OwotCXU4IG5yX2RldnM7Ci0KIAlib29sIHJhZGlvdGFwX2VuYWJsZWQ7CiAJYm9vbCByYWRpb19lbmFibGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYnVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYnVzLmgKaW5kZXggMTg0Yzk1Ni4uZjMyMDVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2J1cy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9idXMuaApAQCAtNSw3ICs1LDkgQEAKICNpZmRlZiBDT05GSUdfQjQzX0JDTUEKIAlCNDNfQlVTX0JDTUEsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgogCUI0M19CVVNfU1NCLAorI2VuZGlmCiB9OwogCiBzdHJ1Y3QgYjQzX2J1c19kZXYgewpAQCAtNTIsMTMgKzU0LDIxIEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBiNDNfYnVzX2hvc3RfaXNfcGNtY2lhKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQogeworI2lmZGVmIENPTkZJR19CNDNfU1NCCiAJcmV0dXJuIChkZXYtPmJ1c190eXBlID09IEI0M19CVVNfU1NCICYmCiAJCWRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDTUNJQSk7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgogfQogc3RhdGljIGlubGluZSBib29sIGI0M19idXNfaG9zdF9pc19zZGlvKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQogeworI2lmZGVmIENPTkZJR19CNDNfU1NCCiAJcmV0dXJuIChkZXYtPmJ1c190eXBlID09IEI0M19CVVNfU1NCICYmCiAJCWRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1NESU8pOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKIH0KIAogc3RydWN0IGI0M19idXNfZGV2ICpiNDNfYnVzX2Rldl9iY21hX2luaXQoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDY5ZmMzZDYuLjMyNTM4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAjZGVmaW5lIGI0M19nX3JhdGV0YWJsZQkJKF9fYjQzX3JhdGV0YWJsZSArIDApCiAjZGVmaW5lIGI0M19nX3JhdGV0YWJsZV9zaXplCTEyCiAKLSNkZWZpbmUgQ0hBTjRHKF9jaGFubmVsLCBfZnJlcSwgX2ZsYWdzKSB7CQkJXAorI2RlZmluZSBDSEFOMkcoX2NoYW5uZWwsIF9mcmVxLCBfZmxhZ3MpIHsJCQlcCiAJLmJhbmQJCQk9IElFRUU4MDIxMV9CQU5EXzJHSFosCQlcCiAJLmNlbnRlcl9mcmVxCQk9IChfZnJlcSksCQkJXAogCS5od192YWx1ZQkJPSAoX2NoYW5uZWwpLAkJCVwKQEAgLTE5MSwyMyArMTkxLDMxIEBACiAJLm1heF9wb3dlcgkJPSAzMCwJCQkJXAogfQogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBiNDNfMmdoel9jaGFudGFibGVbXSA9IHsKLQlDSEFONEcoMSwgMjQxMiwgMCksCi0JQ0hBTjRHKDIsIDI0MTcsIDApLAotCUNIQU40RygzLCAyNDIyLCAwKSwKLQlDSEFONEcoNCwgMjQyNywgMCksCi0JQ0hBTjRHKDUsIDI0MzIsIDApLAotCUNIQU40Ryg2LCAyNDM3LCAwKSwKLQlDSEFONEcoNywgMjQ0MiwgMCksCi0JQ0hBTjRHKDgsIDI0NDcsIDApLAotCUNIQU40Ryg5LCAyNDUyLCAwKSwKLQlDSEFONEcoMTAsIDI0NTcsIDApLAotCUNIQU40RygxMSwgMjQ2MiwgMCksCi0JQ0hBTjRHKDEyLCAyNDY3LCAwKSwKLQlDSEFONEcoMTMsIDI0NzIsIDApLAotCUNIQU40RygxNCwgMjQ4NCwgMCksCisJQ0hBTjJHKDEsIDI0MTIsIDApLAorCUNIQU4yRygyLCAyNDE3LCAwKSwKKwlDSEFOMkcoMywgMjQyMiwgMCksCisJQ0hBTjJHKDQsIDI0MjcsIDApLAorCUNIQU4yRyg1LCAyNDMyLCAwKSwKKwlDSEFOMkcoNiwgMjQzNywgMCksCisJQ0hBTjJHKDcsIDI0NDIsIDApLAorCUNIQU4yRyg4LCAyNDQ3LCAwKSwKKwlDSEFOMkcoOSwgMjQ1MiwgMCksCisJQ0hBTjJHKDEwLCAyNDU3LCAwKSwKKwlDSEFOMkcoMTEsIDI0NjIsIDApLAorCUNIQU4yRygxMiwgMjQ2NywgMCksCisJQ0hBTjJHKDEzLCAyNDcyLCAwKSwKKwlDSEFOMkcoMTQsIDI0ODQsIDApLAogfTsKLSN1bmRlZiBDSEFONEcKKyN1bmRlZiBDSEFOMkcKIAorI2RlZmluZSBDSEFONEcoX2NoYW5uZWwsIF9mbGFncykgewkJCQlcCisJLmJhbmQJCQk9IElFRUU4MDIxMV9CQU5EXzVHSFosCQlcCisJLmNlbnRlcl9mcmVxCQk9IDQwMDAgKyAoNSAqIChfY2hhbm5lbCkpLAlcCisJLmh3X3ZhbHVlCQk9IChfY2hhbm5lbCksCQkJXAorCS5mbGFncwkJCT0gKF9mbGFncyksCQkJXAorCS5tYXhfYW50ZW5uYV9nYWluCT0gMCwJCQkJXAorCS5tYXhfcG93ZXIJCT0gMzAsCQkJCVwKK30KICNkZWZpbmUgQ0hBTjVHKF9jaGFubmVsLCBfZmxhZ3MpIHsJCQkJXAogCS5iYW5kCQkJPSBJRUVFODAyMTFfQkFORF81R0haLAkJXAogCS5jZW50ZXJfZnJlcQkJPSA1MDAwICsgKDUgKiAoX2NoYW5uZWwpKSwJXApAQCAtMjE3LDYgKzIyNSwxOCBAQAogCS5tYXhfcG93ZXIJCT0gMzAsCQkJCVwKIH0KIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYjQzXzVnaHpfbnBoeV9jaGFudGFibGVbXSA9IHsKKwlDSEFONEcoMTg0LCAwKSwJCUNIQU40RygxODYsIDApLAorCUNIQU40RygxODgsIDApLAkJQ0hBTjRHKDE5MCwgMCksCisJQ0hBTjRHKDE5MiwgMCksCQlDSEFONEcoMTk0LCAwKSwKKwlDSEFONEcoMTk2LCAwKSwJCUNIQU40RygxOTgsIDApLAorCUNIQU40RygyMDAsIDApLAkJQ0hBTjRHKDIwMiwgMCksCisJQ0hBTjRHKDIwNCwgMCksCQlDSEFONEcoMjA2LCAwKSwKKwlDSEFONEcoMjA4LCAwKSwJCUNIQU40RygyMTAsIDApLAorCUNIQU40RygyMTIsIDApLAkJQ0hBTjRHKDIxNCwgMCksCisJQ0hBTjRHKDIxNiwgMCksCQlDSEFONEcoMjE4LCAwKSwKKwlDSEFONEcoMjIwLCAwKSwJCUNIQU40RygyMjIsIDApLAorCUNIQU40RygyMjQsIDApLAkJQ0hBTjRHKDIyNiwgMCksCisJQ0hBTjRHKDIyOCwgMCksCiAJQ0hBTjVHKDMyLCAwKSwJCUNIQU41RygzNCwgMCksCiAJQ0hBTjVHKDM2LCAwKSwJCUNIQU41RygzOCwgMCksCiAJQ0hBTjVHKDQwLCAwKSwJCUNIQU41Ryg0MiwgMCksCkBAIC0yNjAsMTggKzI4MCw3IEBACiAJQ0hBTjVHKDE3MCwgMCksCQlDSEFONUcoMTcyLCAwKSwKIAlDSEFONUcoMTc0LCAwKSwJCUNIQU41RygxNzYsIDApLAogCUNIQU41RygxNzgsIDApLAkJQ0hBTjVHKDE4MCwgMCksCi0JQ0hBTjVHKDE4MiwgMCksCQlDSEFONUcoMTg0LCAwKSwKLQlDSEFONUcoMTg2LCAwKSwJCUNIQU41RygxODgsIDApLAotCUNIQU41RygxOTAsIDApLAkJQ0hBTjVHKDE5MiwgMCksCi0JQ0hBTjVHKDE5NCwgMCksCQlDSEFONUcoMTk2LCAwKSwKLQlDSEFONUcoMTk4LCAwKSwJCUNIQU41RygyMDAsIDApLAotCUNIQU41RygyMDIsIDApLAkJQ0hBTjVHKDIwNCwgMCksCi0JQ0hBTjVHKDIwNiwgMCksCQlDSEFONUcoMjA4LCAwKSwKLQlDSEFONUcoMjEwLCAwKSwJCUNIQU41RygyMTIsIDApLAotCUNIQU41RygyMTQsIDApLAkJQ0hBTjVHKDIxNiwgMCksCi0JQ0hBTjVHKDIxOCwgMCksCQlDSEFONUcoMjIwLCAwKSwKLQlDSEFONUcoMjIyLCAwKSwJCUNIQU41RygyMjQsIDApLAotCUNIQU41RygyMjYsIDApLAkJQ0hBTjVHKDIyOCwgMCksCisJQ0hBTjVHKDE4MiwgMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGI0M181Z2h6X2FwaHlfY2hhbnRhYmxlW10gPSB7CkBAIC0yOTUsNiArMzA0LDcgQEAKIAlDSEFONUcoMjA4LCAwKSwJCUNIQU41RygyMTIsIDApLAogCUNIQU41RygyMTYsIDApLAogfTsKKyN1bmRlZiBDSEFONEcKICN1bmRlZiBDSEFONUcKIAogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYjQzX2JhbmRfNUdIel9ucGh5ID0gewpAQCAtMTE3NSwxOCArMTE4NSw3IEBACiAJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgZmxhZ3MpOwogCXVkZWxheSgyKTsKIAotCS8qIFRha2UgUEhZIG91dCBvZiByZXNldCAqLwotCWZsYWdzID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMKTsKLQlmbGFncyAmPSB+QjQzX0JDTUFfSU9DVExfUEhZX1JFU0VUOwotCWZsYWdzIHw9IEJDTUFfSU9DVExfRkdDOwotCWJjbWFfYXdyaXRlMzIoZGV2LT5kZXYtPmJkZXYsIEJDTUFfSU9DVEwsIGZsYWdzKTsKLQl1ZGVsYXkoMSk7Ci0KLQkvKiBEbyBub3QgZm9yY2UgY2xvY2sgYW55bW9yZSAqLwotCWZsYWdzID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMKTsKLQlmbGFncyAmPSB+QkNNQV9JT0NUTF9GR0M7Ci0JYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgZmxhZ3MpOwotCXVkZWxheSgxKTsKKwliNDNfcGh5X3Rha2Vfb3V0X29mX3Jlc2V0KGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGI0M19iY21hX3dpcmVsZXNzX2NvcmVfcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdtb2RlKQpAQCAtMTE5NSwxOCArMTE5NCwyMiBAQAogCQkgIEI0M19CQ01BX0NMS0NUTFNUX1BIWV9QTExfUkVROwogCXUzMiBzdGF0dXMgPSBCNDNfQkNNQV9DTEtDVExTVF84MDIxMV9QTExfU1QgfAogCQkgICAgIEI0M19CQ01BX0NMS0NUTFNUX1BIWV9QTExfU1Q7CisJdTMyIGZsYWdzOwogCi0JYjQzX2RldmljZV9lbmFibGUoZGV2LCBCNDNfQkNNQV9JT0NUTF9QSFlfQ0xLRU4pOworCWZsYWdzID0gQjQzX0JDTUFfSU9DVExfUEhZX0NMS0VOOworCWlmIChnbW9kZSkKKwkJZmxhZ3MgfD0gQjQzX0JDTUFfSU9DVExfR01PREU7CisJYjQzX2RldmljZV9lbmFibGUoZGV2LCBmbGFncyk7CisKIAliY21hX2NvcmVfc2V0X2Nsb2NrbW9kZShkZXYtPmRldi0+YmRldiwgQkNNQV9DTEtNT0RFX0ZBU1QpOwogCWI0M19iY21hX3BoeV9yZXNldChkZXYpOwogCWJjbWFfY29yZV9wbGxfY3RsKGRldi0+ZGV2LT5iZGV2LCByZXEsIHN0YXR1cywgdHJ1ZSk7CiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19CNDNfU1NCCiBzdGF0aWMgdm9pZCBiNDNfc3NiX3dpcmVsZXNzX2NvcmVfcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdtb2RlKQogewotCXN0cnVjdCBzc2JfZGV2aWNlICpzZGV2ID0gZGV2LT5kZXYtPnNkZXY7Ci0JdTMyIHRtc2xvdzsKIAl1MzIgZmxhZ3MgPSAwOwogCiAJaWYgKGdtb2RlKQpAQCAtMTIxOCwxOCArMTIyMSw5IEBACiAJYjQzX2RldmljZV9lbmFibGUoZGV2LCBmbGFncyk7CiAJbXNsZWVwKDIpOwkJLyogV2FpdCBmb3IgdGhlIFBMTCB0byB0dXJuIG9uLiAqLwogCi0JLyogTm93IHRha2UgdGhlIFBIWSBvdXQgb2YgUmVzZXQgYWdhaW4gKi8KLQl0bXNsb3cgPSBzc2JfcmVhZDMyKHNkZXYsIFNTQl9UTVNMT1cpOwotCXRtc2xvdyB8PSBTU0JfVE1TTE9XX0ZHQzsKLQl0bXNsb3cgJj0gfkI0M19UTVNMT1dfUEhZUkVTRVQ7Ci0Jc3NiX3dyaXRlMzIoc2RldiwgU1NCX1RNU0xPVywgdG1zbG93KTsKLQlzc2JfcmVhZDMyKHNkZXYsIFNTQl9UTVNMT1cpOwkvKiBmbHVzaCAqLwotCW1zbGVlcCgxKTsKLQl0bXNsb3cgJj0gflNTQl9UTVNMT1dfRkdDOwotCXNzYl93cml0ZTMyKHNkZXYsIFNTQl9UTVNMT1csIHRtc2xvdyk7Ci0Jc3NiX3JlYWQzMihzZGV2LCBTU0JfVE1TTE9XKTsJLyogZmx1c2ggKi8KLQltc2xlZXAoMSk7CisJYjQzX3BoeV90YWtlX291dF9vZl9yZXNldChkZXYpOwogfQorI2VuZGlmCiAKIHZvaWQgYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdtb2RlKQogewpAQCAtMjcwNCwzMiArMjY5OCwzNyBAQAogCXN0cnVjdCBiNDNfZmlybXdhcmUgKmZ3ID0gJmRldi0+Znc7CiAJY29uc3Qgc3RydWN0IGI0M19pdiAqaXZhbHM7CiAJc2l6ZV90IGNvdW50OwotCWludCBlcnI7CiAKIAloZHIgPSAoY29uc3Qgc3RydWN0IGI0M19md19oZWFkZXIgKikoZnctPmluaXR2YWxzLmRhdGEtPmRhdGEpOwogCWl2YWxzID0gKGNvbnN0IHN0cnVjdCBiNDNfaXYgKikoZnctPmluaXR2YWxzLmRhdGEtPmRhdGEgKyBoZHJfbGVuKTsKIAljb3VudCA9IGJlMzJfdG9fY3B1KGhkci0+c2l6ZSk7Ci0JZXJyID0gYjQzX3dyaXRlX2luaXR2YWxzKGRldiwgaXZhbHMsIGNvdW50LAorCXJldHVybiBiNDNfd3JpdGVfaW5pdHZhbHMoZGV2LCBpdmFscywgY291bnQsCiAJCQkJIGZ3LT5pbml0dmFscy5kYXRhLT5zaXplIC0gaGRyX2xlbik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0JaWYgKGZ3LT5pbml0dmFsc19iYW5kLmRhdGEpIHsKLQkJaGRyID0gKGNvbnN0IHN0cnVjdCBiNDNfZndfaGVhZGVyICopKGZ3LT5pbml0dmFsc19iYW5kLmRhdGEtPmRhdGEpOwotCQlpdmFscyA9IChjb25zdCBzdHJ1Y3QgYjQzX2l2ICopKGZ3LT5pbml0dmFsc19iYW5kLmRhdGEtPmRhdGEgKyBoZHJfbGVuKTsKLQkJY291bnQgPSBiZTMyX3RvX2NwdShoZHItPnNpemUpOwotCQllcnIgPSBiNDNfd3JpdGVfaW5pdHZhbHMoZGV2LCBpdmFscywgY291bnQsCi0JCQkJCSBmdy0+aW5pdHZhbHNfYmFuZC5kYXRhLT5zaXplIC0gaGRyX2xlbik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQl9Ci1vdXQ6Cit9CiAKLQlyZXR1cm4gZXJyOworc3RhdGljIGludCBiNDNfdXBsb2FkX2luaXR2YWxzX2JhbmQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWNvbnN0IHNpemVfdCBoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBiNDNfZndfaGVhZGVyKTsKKwljb25zdCBzdHJ1Y3QgYjQzX2Z3X2hlYWRlciAqaGRyOworCXN0cnVjdCBiNDNfZmlybXdhcmUgKmZ3ID0gJmRldi0+Znc7CisJY29uc3Qgc3RydWN0IGI0M19pdiAqaXZhbHM7CisJc2l6ZV90IGNvdW50OworCisJaWYgKCFmdy0+aW5pdHZhbHNfYmFuZC5kYXRhKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChjb25zdCBzdHJ1Y3QgYjQzX2Z3X2hlYWRlciAqKShmdy0+aW5pdHZhbHNfYmFuZC5kYXRhLT5kYXRhKTsKKwlpdmFscyA9IChjb25zdCBzdHJ1Y3QgYjQzX2l2ICopKGZ3LT5pbml0dmFsc19iYW5kLmRhdGEtPmRhdGEgKyBoZHJfbGVuKTsKKwljb3VudCA9IGJlMzJfdG9fY3B1KGhkci0+c2l6ZSk7CisJcmV0dXJuIGI0M193cml0ZV9pbml0dmFscyhkZXYsIGl2YWxzLCBjb3VudCwKKwkJCQkgIGZ3LT5pbml0dmFsc19iYW5kLmRhdGEtPnNpemUgLSBoZHJfbGVuKTsKIH0KIAogLyogSW5pdGlhbGl6ZSB0aGUgR1BJT3MKICAqIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9HUElPCiAgKi8KKworI2lmZGVmIENPTkZJR19CNDNfU1NCCiBzdGF0aWMgc3RydWN0IHNzYl9kZXZpY2UgKmI0M19zc2JfZ3Bpb19kZXYoc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+c2Rldi0+YnVzOwpAQCAtMjc0MCwxMCArMjczOSwxMyBAQAogCXJldHVybiBidXMtPmNoaXBjby5kZXY7CiAjZW5kaWYKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGI0M19ncGlvX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogeworI2lmZGVmIENPTkZJR19CNDNfU1NCCiAJc3RydWN0IHNzYl9kZXZpY2UgKmdwaW9kZXY7CisjZW5kaWYKIAl1MzIgbWFzaywgc2V0OwogCiAJYjQzX21hc2tzZXQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwgfkI0M19NQUNDVExfR1BPVVRTTVNLLCAwKTsKQEAgLTI4MDIsNyArMjgwNCw5IEBACiAvKiBUdXJuIG9mZiBhbGwgR1BJTyBzdHVmZi4gQ2FsbCB0aGlzIG9uIG1vZHVsZSB1bmxvYWQsIGZvciBleGFtcGxlLiAqLwogc3RhdGljIHZvaWQgYjQzX2dwaW9fY2xlYW51cChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CisjaWZkZWYgQ09ORklHX0I0M19TU0IKIAlzdHJ1Y3Qgc3NiX2RldmljZSAqZ3Bpb2RldjsKKyNlbmRpZgogCiAJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKICNpZmRlZiBDT05GSUdfQjQzX0JDTUEKQEAgLTMwODYsNiArMzA5MCwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2dwaW9fY2xlYW47CiAKKwllcnIgPSBiNDNfdXBsb2FkX2luaXR2YWxzX2JhbmQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9ncGlvX2NsZWFuOworCiAJLyogVHVybiB0aGUgQW5hbG9nIG9uIGFuZCBpbml0aWFsaXplIHRoZSBQSFkuICovCiAJcGh5LT5vcHMtPnN3aXRjaF9hbmFsb2coZGV2LCAxKTsKIAllcnIgPSBiNDNfcGh5X2luaXQoZGV2KTsKQEAgLTM2ODUsMzcgKzM2OTMsNiBAQAogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgYjQzX3B1dF9waHlfaW50b19yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JdTMyIHRtcDsKLQotCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7Ci0jaWZkZWYgQ09ORklHX0I0M19CQ01BCi0JY2FzZSBCNDNfQlVTX0JDTUE6Ci0JCWI0M2VycihkZXYtPndsLAotCQkgICAgICAgIlB1dHRpbmcgUEhZIGludG8gcmVzZXQgbm90IHN1cHBvcnRlZCBvbiBCQ01BXG4iKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQjQzX1NTQgotCWNhc2UgQjQzX0JVU19TU0I6Ci0JCXRtcCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1cpOwotCQl0bXAgJj0gfkI0M19UTVNMT1dfR01PREU7Ci0JCXRtcCB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOwotCQl0bXAgfD0gU1NCX1RNU0xPV19GR0M7Ci0JCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOwotCQltc2xlZXAoMSk7Ci0KLQkJdG1wID0gc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVyk7Ci0JCXRtcCAmPSB+U1NCX1RNU0xPV19GR0M7Ci0JCXRtcCB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOwotCQlzc2Jfd3JpdGUzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1wKTsKLQkJbXNsZWVwKDEpOwotCi0JCWJyZWFrOwotI2VuZGlmCi0JfQotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqYmFuZF90b19zdHJpbmcoZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQogewogCXN3aXRjaCAoYmFuZCkgewpAQCAtMzczMSw5NCArMzcwOCw3NSBAQAogfQogCiAvKiBFeHBlY3RzIHdsLT5tdXRleCBsb2NrZWQgKi8KLXN0YXRpYyBpbnQgYjQzX3N3aXRjaF9iYW5kKHN0cnVjdCBiNDNfd2wgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pCitzdGF0aWMgaW50IGI0M19zd2l0Y2hfYmFuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pCiB7Ci0Jc3RydWN0IGI0M193bGRldiAqdXBfZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgYjQzX3dsZGV2ICpkb3duX2RldjsKLQlzdHJ1Y3QgYjQzX3dsZGV2ICpkOwotCWludCBlcnI7Ci0JYm9vbCB1bmluaXRpYWxpemVkX3ZhcihnbW9kZSk7Ci0JaW50IHByZXZfc3RhdHVzOworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJYm9vbCBnbW9kZTsKKwl1MzIgdG1wOwogCi0JLyogRmluZCBhIGRldmljZSBhbmQgUEhZIHdoaWNoIHN1cHBvcnRzIHRoZSBiYW5kLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJndsLT5kZXZsaXN0LCBsaXN0KSB7Ci0JCXN3aXRjaCAoY2hhbi0+YmFuZCkgewotCQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCQlpZiAoZC0+cGh5LnN1cHBvcnRzXzVnaHopIHsKLQkJCQl1cF9kZXYgPSBkOwotCQkJCWdtb2RlID0gZmFsc2U7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQkJaWYgKGQtPnBoeS5zdXBwb3J0c18yZ2h6KSB7Ci0JCQkJdXBfZGV2ID0gZDsKLQkJCQlnbW9kZSA9IHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUI0M19XQVJOX09OKDEpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHVwX2RldikKLQkJCWJyZWFrOworCXN3aXRjaCAoY2hhbi0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJZ21vZGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlnbW9kZSA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUI0M19XQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCF1cF9kZXYpIHsKLQkJYjQzZXJyKHdsLCAiQ291bGQgbm90IGZpbmQgYSBkZXZpY2UgZm9yICVzLUdIeiBiYW5kIG9wZXJhdGlvblxuIiwKKworCWlmICghKChnbW9kZSAmJiBwaHktPnN1cHBvcnRzXzJnaHopIHx8CisJICAgICAgKCFnbW9kZSAmJiBwaHktPnN1cHBvcnRzXzVnaHopKSkgeworCQliNDNlcnIoZGV2LT53bCwgIlRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCAlcy1HSHogYmFuZFxuIiwKIAkJICAgICAgIGJhbmRfdG9fc3RyaW5nKGNoYW4tPmJhbmQpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmICgodXBfZGV2ID09IHdsLT5jdXJyZW50X2RldikgJiYKLQkgICAgKCEhd2wtPmN1cnJlbnRfZGV2LT5waHkuZ21vZGUgPT0gISFnbW9kZSkpIHsKKworCWlmICghIXBoeS0+Z21vZGUgPT0gISFnbW9kZSkgewogCQkvKiBUaGlzIGRldmljZSBpcyBhbHJlYWR5IHJ1bm5pbmcuICovCiAJCXJldHVybiAwOwogCX0KLQliNDNkYmcod2wsICJTd2l0Y2hpbmcgdG8gJXMtR0h6IGJhbmRcbiIsCisKKwliNDNkYmcoZGV2LT53bCwgIlN3aXRjaGluZyB0byAlcyBHSHogYmFuZFxuIiwKIAkgICAgICAgYmFuZF90b19zdHJpbmcoY2hhbi0+YmFuZCkpOwotCWRvd25fZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwogCi0JcHJldl9zdGF0dXMgPSBiNDNfc3RhdHVzKGRvd25fZGV2KTsKLQkvKiBTaHV0ZG93biB0aGUgY3VycmVudGx5IHJ1bm5pbmcgY29yZS4gKi8KLQlpZiAocHJldl9zdGF0dXMgPj0gQjQzX1NUQVRfU1RBUlRFRCkKLQkJZG93bl9kZXYgPSBiNDNfd2lyZWxlc3NfY29yZV9zdG9wKGRvd25fZGV2KTsKLQlpZiAocHJldl9zdGF0dXMgPj0gQjQzX1NUQVRfSU5JVElBTElaRUQpCi0JCWI0M193aXJlbGVzc19jb3JlX2V4aXQoZG93bl9kZXYpOworCS8qIFNvbWUgbmV3IGRldmljZXMgZG9uJ3QgbmVlZCBkaXNhYmxpbmcgcmFkaW8gZm9yIGJhbmQgc3dpdGNoaW5nICovCisJaWYgKCEocGh5LT50eXBlID09IEI0M19QSFlUWVBFX04gJiYgcGh5LT5yZXYgPj0gMykpCisJCWI0M19zb2Z0d2FyZV9yZmtpbGwoZGV2LCB0cnVlKTsKIAotCWlmIChkb3duX2RldiAhPSB1cF9kZXYpIHsKLQkJLyogV2Ugc3dpdGNoIHRvIGEgZGlmZmVyZW50IGNvcmUsIHNvIHdlIHB1dCBQSFkgaW50bwotCQkgKiBSRVNFVCBvbiB0aGUgb2xkIGNvcmUuICovCi0JCWI0M19wdXRfcGh5X2ludG9fcmVzZXQoZG93bl9kZXYpOworCXBoeS0+Z21vZGUgPSBnbW9kZTsKKwliNDNfcGh5X3B1dF9pbnRvX3Jlc2V0KGRldik7CisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJdG1wID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMKTsKKwkJaWYgKGdtb2RlKQorCQkJdG1wIHw9IEI0M19CQ01BX0lPQ1RMX0dNT0RFOworCQllbHNlCisJCQl0bXAgJj0gfkI0M19CQ01BX0lPQ1RMX0dNT0RFOworCQliY21hX2F3cml0ZTMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMLCB0bXApOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJdG1wID0gc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVyk7CisJCWlmIChnbW9kZSkKKwkJCXRtcCB8PSBCNDNfVE1TTE9XX0dNT0RFOworCQllbHNlCisJCQl0bXAgJj0gfkI0M19UTVNMT1dfR01PREU7CisJCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOworCQlicmVhazsKKyNlbmRpZgogCX0KKwliNDNfcGh5X3Rha2Vfb3V0X29mX3Jlc2V0KGRldik7CiAKLQkvKiBOb3cgc3RhcnQgdGhlIG5ldyBjb3JlLiAqLwotCXVwX2Rldi0+cGh5Lmdtb2RlID0gZ21vZGU7Ci0JaWYgKHByZXZfc3RhdHVzID49IEI0M19TVEFUX0lOSVRJQUxJWkVEKSB7Ci0JCWVyciA9IGI0M193aXJlbGVzc19jb3JlX2luaXQodXBfZGV2KTsKLQkJaWYgKGVycikgewotCQkJYjQzZXJyKHdsLCAiRmF0YWw6IENvdWxkIG5vdCBpbml0aWFsaXplIGRldmljZSBmb3IgIgotCQkJICAgICAgICJzZWxlY3RlZCAlcy1HSHogYmFuZFxuIiwKLQkJCSAgICAgICBiYW5kX3RvX3N0cmluZyhjaGFuLT5iYW5kKSk7Ci0JCQlnb3RvIGluaXRfZmFpbHVyZTsKLQkJfQotCX0KLQlpZiAocHJldl9zdGF0dXMgPj0gQjQzX1NUQVRfU1RBUlRFRCkgewotCQllcnIgPSBiNDNfd2lyZWxlc3NfY29yZV9zdGFydCh1cF9kZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQliNDNlcnIod2wsICJGYXRhbDogQ291bGQgbm90IHN0YXJ0IGRldmljZSBmb3IgIgotCQkJICAgICAgICJzZWxlY3RlZCAlcy1HSHogYmFuZFxuIiwKLQkJCSAgICAgICBiYW5kX3RvX3N0cmluZyhjaGFuLT5iYW5kKSk7Ci0JCQliNDNfd2lyZWxlc3NfY29yZV9leGl0KHVwX2Rldik7Ci0JCQlnb3RvIGluaXRfZmFpbHVyZTsKLQkJfQotCX0KLQlCNDNfV0FSTl9PTihiNDNfc3RhdHVzKHVwX2RldikgIT0gcHJldl9zdGF0dXMpOworCWI0M191cGxvYWRfaW5pdHZhbHNfYmFuZChkZXYpOwogCi0Jd2wtPmN1cnJlbnRfZGV2ID0gdXBfZGV2OworCWI0M19waHlfaW5pdChkZXYpOwogCiAJcmV0dXJuIDA7Ci1pbml0X2ZhaWx1cmU6Ci0JLyogV2hvb3BzLCBmYWlsZWQgdG8gaW5pdCB0aGUgbmV3IGNvcmUuIE5vIGNvcmUgaXMgb3BlcmF0aW5nIG5vdy4gKi8KLQl3bC0+Y3VycmVudF9kZXYgPSBOVUxMOwotCXJldHVybiBlcnI7CiB9CiAKIC8qIFdyaXRlIHRoZSBzaG9ydCBhbmQgbG9uZyBmcmFtZSByZXRyeSBsaW1pdCB2YWx1ZXMuICovCkBAIC0zODUxLDggKzM4MDksMTAgQEAKIAogCWRldiA9IHdsLT5jdXJyZW50X2RldjsKIAorCWI0M19tYWNfc3VzcGVuZChkZXYpOworCiAJLyogU3dpdGNoIHRoZSBiYW5kIChpZiBuZWNlc3NhcnkpLiBUaGlzIG1pZ2h0IGNoYW5nZSB0aGUgYWN0aXZlIGNvcmUuICovCi0JZXJyID0gYjQzX3N3aXRjaF9iYW5kKHdsLCBjb25mLT5jaGFuZGVmLmNoYW4pOworCWVyciA9IGI0M19zd2l0Y2hfYmFuZChkZXYsIGNvbmYtPmNoYW5kZWYuY2hhbik7CiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5sb2NrX211dGV4OwogCkBAIC0zODcxLDggKzM4MzEsNiBAQAogCWVsc2UKIAkJcGh5LT5pc180MG1oeiA9IGZhbHNlOwogCi0JYjQzX21hY19zdXNwZW5kKGRldik7Ci0KIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9SRVRSWV9MSU1JVFMpCiAJCWI0M19zZXRfcmV0cnlfbGltaXRzKGRldiwgY29uZi0+c2hvcnRfZnJhbWVfbWF4X3R4X2NvdW50LAogCQkJCQkgIGNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KTsKQEAgLTQ1ODIsOCArNDU0MCwxMiBAQAogCXN0cnVjdCBzc2JfYnVzICpidXM7CiAJdTMyIHRtcDsKIAorI2lmZGVmIENPTkZJR19CNDNfU1NCCiAJaWYgKGRldi0+ZGV2LT5idXNfdHlwZSAhPSBCNDNfQlVTX1NTQikKIAkJcmV0dXJuOworI2Vsc2UKKwlyZXR1cm47CisjZW5kaWYKIAogCWJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CiAKQEAgLTQ3MzgsNyArNDcwMCw3IEBACiAJfQogCWlmIChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfWFRBTF9OT1NMT1cpCiAJCWhmIHw9IEI0M19IRl9EU0NSUTsgLyogRGlzYWJsZSBzbG93Y2xvY2sgcmVxdWVzdHMgZnJvbSB1Y29kZS4gKi8KLSNpZmRlZiBDT05GSUdfU1NCX0RSSVZFUl9QQ0lDT1JFCisjaWYgZGVmaW5lZChDT05GSUdfQjQzX1NTQikgJiYgZGVmaW5lZChDT05GSUdfU1NCX0RSSVZFUl9QQ0lDT1JFKQogCWlmIChkZXYtPmRldi0+YnVzX3R5cGUgPT0gQjQzX0JVU19TU0IgJiYKIAkgICAgZGV2LT5kZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9QQ0kgJiYKIAkgICAgZGV2LT5kZXYtPnNkZXYtPmJ1cy0+cGNpY29yZS5kZXYtPmlkLnJldmlzaW9uIDw9IDEwKQpAQCAtNTEyOSwxMCArNTA5MSw4MiBAQAogCWI0M19waHlfZnJlZShkZXYpOwogfQogCitzdGF0aWMgdm9pZCBiNDNfc3VwcG9ydGVkX2JhbmRzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCAqaGF2ZV8yZ2h6X3BoeSwKKwkJCQlib29sICpoYXZlXzVnaHpfcGh5KQoreworCXUxNiBkZXZfaWQgPSAwOworCisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJaWYgKGRldi0+ZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX0JDTUEgJiYKKwkgICAgZGV2LT5kZXYtPmJkZXYtPmJ1cy0+aG9zdHR5cGUgPT0gQkNNQV9IT1NUVFlQRV9QQ0kpCisJCWRldl9pZCA9IGRldi0+ZGV2LT5iZGV2LT5idXMtPmhvc3RfcGNpLT5kZXZpY2U7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWlmIChkZXYtPmRldi0+YnVzX3R5cGUgPT0gQjQzX0JVU19TU0IgJiYKKwkgICAgZGV2LT5kZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9QQ0kpCisJCWRldl9pZCA9IGRldi0+ZGV2LT5zZGV2LT5idXMtPmhvc3RfcGNpLT5kZXZpY2U7CisjZW5kaWYKKwkvKiBPdmVycmlkZSB3aXRoIFNQUk9NIHZhbHVlIGlmIGF2YWlsYWJsZSAqLworCWlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT5kZXZfaWQpCisJCWRldl9pZCA9IGRldi0+ZGV2LT5idXNfc3Byb20tPmRldl9pZDsKKworCS8qIE5vdGU6IGJlbG93IElEcyBjYW4gYmUgInZpcnR1YWwiIChub3QgbWFjaGluZyBlLmcuIHJlYWwgUENJIElEKSAqLworCXN3aXRjaCAoZGV2X2lkKSB7CisJY2FzZSAweDQzMjQ6IC8qIEJDTTQzMDYgKi8KKwljYXNlIDB4NDMxMjogLyogQkNNNDMxMSAqLworCWNhc2UgMHg0MzE5OiAvKiBCQ000MzE4ICovCisJY2FzZSAweDQzMjg6IC8qIEJDTTQzMjEgKi8KKwljYXNlIDB4NDMyYjogLyogQkNNNDMyMiAqLworCWNhc2UgMHg0MzUwOiAvKiBCQ000MzIyMiAqLworCWNhc2UgMHg0MzUzOiAvKiBCQ000MzIyNCAqLworCWNhc2UgMHgwNTc2OiAvKiBCQ000MzIyNCAqLworCWNhc2UgMHg0MzVmOiAvKiBCQ002MzYyICovCisJY2FzZSAweDQzMzE6IC8qIEJDTTQzMzEgKi8KKwljYXNlIDB4NDM1OTogLyogQkNNNDMyMjggKi8KKwljYXNlIDB4NDNhMDogLyogQkNNNDM2MCAqLworCWNhc2UgMHg0M2IxOiAvKiBCQ000MzUyICovCisJCS8qIER1YWwgYmFuZCBkZXZpY2VzICovCisJCSpoYXZlXzJnaHpfcGh5ID0gdHJ1ZTsKKwkJKmhhdmVfNWdoel9waHkgPSB0cnVlOworCQlyZXR1cm47CisJY2FzZSAweDQzMjE6IC8qIEJDTTQzMDYgKi8KKwljYXNlIDB4NDMxMzogLyogQkNNNDMxMSAqLworCWNhc2UgMHg0MzFhOiAvKiBCQ000MzE4ICovCisJY2FzZSAweDQzMmE6IC8qIEJDTTQzMjEgKi8KKwljYXNlIDB4NDMyZDogLyogQkNNNDMyMiAqLworCWNhc2UgMHg0MzUyOiAvKiBCQ000MzIyMiAqLworCWNhc2UgMHg0MzMzOiAvKiBCQ000MzMxICovCisJY2FzZSAweDQzYTI6IC8qIEJDTTQzNjAgKi8KKwljYXNlIDB4NDNiMzogLyogQkNNNDM1MiAqLworCQkvKiA1IEdIeiBvbmx5IGRldmljZXMgKi8KKwkJKmhhdmVfMmdoel9waHkgPSBmYWxzZTsKKwkJKmhhdmVfNWdoel9waHkgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJLyogQXMgYSBmYWxsYmFjaywgdHJ5IHRvIGd1ZXNzIHVzaW5nIFBIWSB0eXBlICovCisJc3dpdGNoIChkZXYtPnBoeS50eXBlKSB7CisJY2FzZSBCNDNfUEhZVFlQRV9BOgorCQkqaGF2ZV8yZ2h6X3BoeSA9IGZhbHNlOworCQkqaGF2ZV81Z2h6X3BoeSA9IHRydWU7CisJCXJldHVybjsKKwljYXNlIEI0M19QSFlUWVBFX0c6CisJY2FzZSBCNDNfUEhZVFlQRV9OOgorCWNhc2UgQjQzX1BIWVRZUEVfTFA6CisJY2FzZSBCNDNfUEhZVFlQRV9IVDoKKwljYXNlIEI0M19QSFlUWVBFX0xDTjoKKwkJKmhhdmVfMmdoel9waHkgPSB0cnVlOworCQkqaGF2ZV81Z2h6X3BoeSA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJQjQzX1dBUk5fT04oMSk7Cit9CisKIHN0YXRpYyBpbnQgYjQzX3dpcmVsZXNzX2NvcmVfYXR0YWNoKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3dsICp3bCA9IGRldi0+d2w7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJaW50IGVycjsKIAl1MzIgdG1wOwogCWJvb2wgaGF2ZV8yZ2h6X3BoeSA9IGZhbHNlLCBoYXZlXzVnaHpfcGh5ID0gZmFsc2U7CkBAIC01MTQ0LDE5ICs1MTc4LDE1IEBACiAJICogdGhhdCBpbiBjb3JlX2luaXQoKSwgdG9vLgogCSAqLwogCi0jaWZkZWYgQ09ORklHX0I0M19TU0IKLQlpZiAoZGV2LT5kZXYtPmJ1c190eXBlID09IEI0M19CVVNfU1NCICYmCi0JICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENJKQotCQlwZGV2ID0gZGV2LT5kZXYtPnNkZXYtPmJ1cy0+aG9zdF9wY2k7Ci0jZW5kaWYKLQogCWVyciA9IGI0M19idXNfcG93ZXJ1cChkZXYsIDApOwogCWlmIChlcnIpIHsKIAkJYjQzZXJyKHdsLCAiQnVzIHBvd2VydXAgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JLyogR2V0IHRoZSBQSFkgdHlwZS4gKi8KKwlwaHktPmRvX2Z1bGxfaW5pdCA9IHRydWU7CisKKwkvKiBUcnkgdG8gZ3Vlc3Mgc3VwcG9ydGVkIGJhbmRzIGZvciB0aGUgZmlyc3QgaW5pdCBuZWVkcyAqLwogCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CiAjaWZkZWYgQ09ORklHX0I0M19CQ01BCiAJY2FzZSBCNDNfQlVTX0JDTUE6CkBAIC01MTc4LDUxICs1MjA4LDMxIEBACiAJfQogCiAJZGV2LT5waHkuZ21vZGUgPSBoYXZlXzJnaHpfcGh5OwotCWRldi0+cGh5LnJhZGlvX29uID0gdHJ1ZTsKIAliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIGRldi0+cGh5Lmdtb2RlKTsKIAorCS8qIEdldCB0aGUgUEhZIHR5cGUuICovCiAJZXJyID0gYjQzX3BoeV92ZXJzaW9uaW5nKGRldik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcG93ZXJkb3duOwotCS8qIENoZWNrIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIG11bHRpYmFuZC4gKi8KLQlpZiAoIXBkZXYgfHwKLQkgICAgKHBkZXYtPmRldmljZSAhPSAweDQzMTIgJiYKLQkgICAgIHBkZXYtPmRldmljZSAhPSAweDQzMTkgJiYgcGRldi0+ZGV2aWNlICE9IDB4NDMyNCkpIHsKLQkJLyogTm8gbXVsdGliYW5kIHN1cHBvcnQuICovCi0JCWhhdmVfMmdoel9waHkgPSBmYWxzZTsKKworCS8qIEdldCByZWFsIGluZm8gYWJvdXQgc3VwcG9ydGVkIGJhbmRzICovCisJYjQzX3N1cHBvcnRlZF9iYW5kcyhkZXYsICZoYXZlXzJnaHpfcGh5LCAmaGF2ZV81Z2h6X3BoeSk7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IDUgR0h6IG9uIHNvbWUgUEhZcyB5ZXQgKi8KKwlzd2l0Y2ggKGRldi0+cGh5LnR5cGUpIHsKKwljYXNlIEI0M19QSFlUWVBFX0E6CisJY2FzZSBCNDNfUEhZVFlQRV9OOgorCWNhc2UgQjQzX1BIWVRZUEVfTFA6CisJY2FzZSBCNDNfUEhZVFlQRV9IVDoKKwkJYjQzd2Fybih3bCwgIjUgR0h6IGJhbmQgaXMgdW5zdXBwb3J0ZWQgb24gdGhpcyBQSFlcbiIpOwogCQloYXZlXzVnaHpfcGh5ID0gZmFsc2U7Ci0JCXN3aXRjaCAoZGV2LT5waHkudHlwZSkgewotCQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCQloYXZlXzVnaHpfcGh5ID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlIEI0M19QSFlUWVBFX0xQOiAvL0ZJWE1FIG5vdCBhbHdheXMhCi0jaWYgMCAvL0ZJWE1FIGVuYWJsaW5nIDVHSHogY2F1c2VzIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlCi0JCQloYXZlXzVnaHpfcGh5ID0gMTsKLSNlbmRpZgotCQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWNhc2UgQjQzX1BIWVRZUEVfTjoKLQkJY2FzZSBCNDNfUEhZVFlQRV9IVDoKLQkJY2FzZSBCNDNfUEhZVFlQRV9MQ046Ci0JCQloYXZlXzJnaHpfcGh5ID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQjQzX1dBUk5fT04oMSk7Ci0JCX0KIAl9Ci0JaWYgKGRldi0+cGh5LnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkgewotCQkvKiBGSVhNRSAqLwotCQliNDNlcnIod2wsICJJRUVFIDgwMi4xMWEgZGV2aWNlcyBhcmUgdW5zdXBwb3J0ZWRcbiIpOworCisJaWYgKCFoYXZlXzJnaHpfcGh5ICYmICFoYXZlXzVnaHpfcGh5KSB7CisJCWI0M2Vycih3bCwgImI0MyBjYW4ndCBzdXBwb3J0IGFueSBiYW5kIG9uIHRoaXMgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZXJyX3Bvd2VyZG93bjsKIAl9Ci0JaWYgKDEgLyogZGlzYWJsZSBBLVBIWSAqLykgewotCQkvKiBGSVhNRTogRm9yIG5vdyB3ZSBkaXNhYmxlIHRoZSBBLVBIWSBvbiBtdWx0aS1QSFkgZGV2aWNlcy4gKi8KLQkJaWYgKGRldi0+cGh5LnR5cGUgIT0gQjQzX1BIWVRZUEVfTiAmJgotCQkgICAgZGV2LT5waHkudHlwZSAhPSBCNDNfUEhZVFlQRV9MUCkgewotCQkJaGF2ZV8yZ2h6X3BoeSA9IHRydWU7Ci0JCQloYXZlXzVnaHpfcGh5ID0gZmFsc2U7Ci0JCX0KLQl9CiAKIAllcnIgPSBiNDNfcGh5X2FsbG9jYXRlKGRldik7CiAJaWYgKGVycikKQEAgLTUyNzAsNyArNTI4MCw2IEBACiAJYjQzX2RlYnVnZnNfcmVtb3ZlX2RldmljZSh3bGRldik7CiAJYjQzX3dpcmVsZXNzX2NvcmVfZGV0YWNoKHdsZGV2KTsKIAlsaXN0X2RlbCgmd2xkZXYtPmxpc3QpOwotCXdsLT5ucl9kZXZzLS07CiAJYjQzX2J1c19zZXRfd2xkZXYoZGV2LCBOVUxMKTsKIAlrZnJlZSh3bGRldik7CiB9CkBAIC01Mjk1LDggKzUzMDQsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2tmcmVlX3dsZGV2OwogCi0JbGlzdF9hZGQoJndsZGV2LT5saXN0LCAmd2wtPmRldmxpc3QpOwotCXdsLT5ucl9kZXZzKys7CiAJYjQzX2J1c19zZXRfd2xkZXYoZGV2LCB3bGRldik7CiAJYjQzX2RlYnVnZnNfYWRkX2RldmljZSh3bGRldik7CiAKQEAgLTUzMTQsNiArNTMyMSw3IEBACiAJKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF8jI19zdWJ2ZW5kb3IpICYmCVwKIAkocGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBfc3ViZGV2aWNlKQkJCQkpCiAKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgogc3RhdGljIHZvaWQgYjQzX3Nwcm9tX2ZpeHVwKHN0cnVjdCBzc2JfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC01MzQ1LDYgKzUzNTMsNyBAQAogCXNzYl9zZXRfZGV2dHlwZWRhdGEoZGV2LT5zZGV2LCBOVUxMKTsKIAlpZWVlODAyMTFfZnJlZV9odyhodyk7CiB9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBiNDNfd2wgKmI0M193aXJlbGVzc19pbml0KHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQogewpAQCAtNTM4Niw3ICs1Mzk1LDYgQEAKIAl3bC0+aHcgPSBodzsKIAltdXRleF9pbml0KCZ3bC0+bXV0ZXgpOwogCXNwaW5fbG9ja19pbml0KCZ3bC0+aGFyZGlycV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmd2wtPmRldmxpc3QpOwogCUlOSVRfV09SSygmd2wtPmJlYWNvbl91cGRhdGVfdHJpZ2dlciwgYjQzX2JlYWNvbl91cGRhdGVfdHJpZ2dlcl93b3JrKTsKIAlJTklUX1dPUksoJndsLT50eHBvd2VyX2FkanVzdF93b3JrLCBiNDNfcGh5X3R4cG93ZXJfYWRqdXN0X3dvcmspOwogCUlOSVRfV09SSygmd2wtPnR4X3dvcmssIGI0M190eF93b3JrKTsKQEAgLTU0ODYsMzkgKzU0OTQsNDIgQEAKIAlzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldjsKIAlzdHJ1Y3QgYjQzX3dsICp3bDsKIAlpbnQgZXJyOwotCWludCBmaXJzdCA9IDA7CiAKIAlkZXYgPSBiNDNfYnVzX2Rldl9zc2JfaW5pdChzZGV2KTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3bCA9IHNzYl9nZXRfZGV2dHlwZWRhdGEoc2Rldik7Ci0JaWYgKCF3bCkgewotCQkvKiBQcm9iaW5nIHRoZSBmaXJzdCBjb3JlLiBNdXN0IHNldHVwIGNvbW1vbiBzdHJ1Y3QgYjQzX3dsICovCi0JCWZpcnN0ID0gMTsKLQkJYjQzX3Nwcm9tX2ZpeHVwKHNkZXYtPmJ1cyk7Ci0JCXdsID0gYjQzX3dpcmVsZXNzX2luaXQoZGV2KTsKLQkJaWYgKElTX0VSUih3bCkpIHsKLQkJCWVyciA9IFBUUl9FUlIod2wpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJc3NiX3NldF9kZXZ0eXBlZGF0YShzZGV2LCB3bCk7Ci0JCUI0M19XQVJOX09OKHNzYl9nZXRfZGV2dHlwZWRhdGEoc2RldikgIT0gd2wpOworCWlmICh3bCkgeworCQliNDNlcnIoTlVMTCwgIkR1YWwtY29yZSBkZXZpY2VzIGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZXJyID0gLUVOT1RTVVBQOworCQlnb3RvIGVycl9zc2Jfa2ZyZWVfZGV2OwogCX0KKworCWI0M19zcHJvbV9maXh1cChzZGV2LT5idXMpOworCisJd2wgPSBiNDNfd2lyZWxlc3NfaW5pdChkZXYpOworCWlmIChJU19FUlIod2wpKSB7CisJCWVyciA9IFBUUl9FUlIod2wpOworCQlnb3RvIGVycl9zc2Jfa2ZyZWVfZGV2OworCX0KKwlzc2Jfc2V0X2RldnR5cGVkYXRhKHNkZXYsIHdsKTsKKwlCNDNfV0FSTl9PTihzc2JfZ2V0X2RldnR5cGVkYXRhKHNkZXYpICE9IHdsKTsKKwogCWVyciA9IGI0M19vbmVfY29yZV9hdHRhY2goZGV2LCB3bCk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfd2lyZWxlc3NfZXhpdDsKKwkJZ290byBlcnJfc3NiX3dpcmVsZXNzX2V4aXQ7CiAKIAkvKiBzZXR1cCBhbmQgc3RhcnQgd29yayB0byBsb2FkIGZpcm13YXJlICovCiAJSU5JVF9XT1JLKCZ3bC0+ZmlybXdhcmVfbG9hZCwgYjQzX3JlcXVlc3RfZmlybXdhcmUpOwogCXNjaGVkdWxlX3dvcmsoJndsLT5maXJtd2FyZV9sb2FkKTsKIAotICAgICAgb3V0OgogCXJldHVybiBlcnI7CiAKLSAgICAgIGVycl93aXJlbGVzc19leGl0OgotCWlmIChmaXJzdCkKLQkJYjQzX3dpcmVsZXNzX2V4aXQoZGV2LCB3bCk7CitlcnJfc3NiX3dpcmVsZXNzX2V4aXQ6CisJYjQzX3dpcmVsZXNzX2V4aXQoZGV2LCB3bCk7CitlcnJfc3NiX2tmcmVlX2RldjoKKwlrZnJlZShkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU1NDYsMTMgKzU1NTcsOCBAQAogCS8qIFVucmVnaXN0ZXIgSFcgUk5HIGRyaXZlciAqLwogCWI0M19ybmdfZXhpdCh3bCk7CiAKLQlpZiAobGlzdF9lbXB0eSgmd2wtPmRldmxpc3QpKSB7Ci0JCWI0M19sZWRzX3VucmVnaXN0ZXIod2wpOwotCQkvKiBMYXN0IGNvcmUgb24gdGhlIGNoaXAgdW5yZWdpc3RlcmVkLgotCQkgKiBXZSBjYW4gZGVzdHJveSBjb21tb24gc3RydWN0IGI0M193bC4KLQkJICovCi0JCWI0M193aXJlbGVzc19leGl0KGRldiwgd2wpOwotCX0KKwliNDNfbGVkc191bnJlZ2lzdGVyKHdsKTsKKwliNDNfd2lyZWxlc3NfZXhpdChkZXYsIHdsKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzc2JfZHJpdmVyIGI0M19zc2JfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmMKaW5kZXggZGJhYTUxOC4uMDgyNDRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5jCkBAIC05NiwxMiArOTYsMTYgQEAKIAogCXBoeS0+Y2hhbm5lbCA9IG9wcy0+Z2V0X2RlZmF1bHRfY2hhbihkZXYpOwogCi0Jb3BzLT5zb2Z0d2FyZV9yZmtpbGwoZGV2LCBmYWxzZSk7CisJcGh5LT5vcHMtPnN3aXRjaF9hbmFsb2coZGV2LCB0cnVlKTsKKwliNDNfc29mdHdhcmVfcmZraWxsKGRldiwgZmFsc2UpOworCiAJZXJyID0gb3BzLT5pbml0KGRldik7CiAJaWYgKGVycikgewogCQliNDNlcnIoZGV2LT53bCwgIlBIWSBpbml0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2Jsb2NrX3JmOwogCX0KKwlwaHktPmRvX2Z1bGxfaW5pdCA9IGZhbHNlOworCiAJLyogTWFrZSBzdXJlIHRvIHN3aXRjaCBoYXJkd2FyZSBhbmQgZmlybXdhcmUgKFNITSkgdG8KIAkgKiB0aGUgZGVmYXVsdCBjaGFubmVsLiAqLwogCWVyciA9IGI0M19zd2l0Y2hfY2hhbm5lbChkZXYsIG9wcy0+Z2V0X2RlZmF1bHRfY2hhbihkZXYpKTsKQEAgLTExMywxMCArMTE3LDExIEBACiAJcmV0dXJuIDA7CiAKIGVycl9waHlfZXhpdDoKKwlwaHktPmRvX2Z1bGxfaW5pdCA9IHRydWU7CiAJaWYgKG9wcy0+ZXhpdCkKIAkJb3BzLT5leGl0KGRldik7CiBlcnJfYmxvY2tfcmY6Ci0Jb3BzLT5zb2Z0d2FyZV9yZmtpbGwoZGV2LCB0cnVlKTsKKwliNDNfc29mdHdhcmVfcmZraWxsKGRldiwgdHJ1ZSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTI1LDcgKzEzMCw4IEBACiB7CiAJY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyAqb3BzID0gZGV2LT5waHkub3BzOwogCi0Jb3BzLT5zb2Z0d2FyZV9yZmtpbGwoZGV2LCB0cnVlKTsKKwliNDNfc29mdHdhcmVfcmZraWxsKGRldiwgdHJ1ZSk7CisJZGV2LT5waHkuZG9fZnVsbF9pbml0ID0gdHJ1ZTsKIAlpZiAob3BzLT5leGl0KQogCQlvcHMtPmV4aXQoZGV2KTsKIH0KQEAgLTMxMiw2ICszMTgsOTAgQEAKIAl9CiB9CiAKK3ZvaWQgYjQzX3BoeV9wdXRfaW50b19yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTMyIHRtcDsKKworCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJY2FzZSBCNDNfQlVTX0JDTUE6CisJCXRtcCA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJCXRtcCAmPSB+QjQzX0JDTUFfSU9DVExfR01PREU7CisJCXRtcCB8PSBCNDNfQkNNQV9JT0NUTF9QSFlfUkVTRVQ7CisJCXRtcCB8PSBCQ01BX0lPQ1RMX0ZHQzsKKwkJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgdG1wKTsKKwkJdWRlbGF5KDEpOworCisJCXRtcCA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJCXRtcCAmPSB+QkNNQV9JT0NUTF9GR0M7CisJCWJjbWFfYXdyaXRlMzIoZGV2LT5kZXYtPmJkZXYsIEJDTUFfSU9DVEwsIHRtcCk7CisJCXVkZWxheSgxKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCXRtcCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1cpOworCQl0bXAgJj0gfkI0M19UTVNMT1dfR01PREU7CisJCXRtcCB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOworCQl0bXAgfD0gU1NCX1RNU0xPV19GR0M7CisJCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKKwkJdG1wID0gc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVyk7CisJCXRtcCAmPSB+U1NCX1RNU0xPV19GR0M7CisJCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKK3ZvaWQgYjQzX3BoeV90YWtlX291dF9vZl9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTMyIHRtcDsKKworCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJY2FzZSBCNDNfQlVTX0JDTUE6CisJCS8qIFVuc2V0IHJlc2V0IGJpdCAod2l0aCBmb3JjaW5nIGNsb2NrKSAqLworCQl0bXAgPSBiY21hX2FyZWFkMzIoZGV2LT5kZXYtPmJkZXYsIEJDTUFfSU9DVEwpOworCQl0bXAgJj0gfkI0M19CQ01BX0lPQ1RMX1BIWV9SRVNFVDsKKwkJdG1wICY9IH5CNDNfQkNNQV9JT0NUTF9QSFlfQ0xLRU47CisJCXRtcCB8PSBCQ01BX0lPQ1RMX0ZHQzsKKwkJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgdG1wKTsKKwkJdWRlbGF5KDEpOworCisJCS8qIERvIG5vdCBmb3JjZSBjbG9jayBhbnltb3JlICovCisJCXRtcCA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJCXRtcCAmPSB+QkNNQV9JT0NUTF9GR0M7CisJCXRtcCB8PSBCNDNfQkNNQV9JT0NUTF9QSFlfQ0xLRU47CisJCWJjbWFfYXdyaXRlMzIoZGV2LT5kZXYtPmJkZXYsIEJDTUFfSU9DVEwsIHRtcCk7CisJCXVkZWxheSgxKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCS8qIFVuc2V0IHJlc2V0IGJpdCAod2l0aCBmb3JjaW5nIGNsb2NrKSAqLworCQl0bXAgPSBzc2JfcmVhZDMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XKTsKKwkJdG1wICY9IH5CNDNfVE1TTE9XX1BIWVJFU0VUOworCQl0bXAgJj0gfkI0M19UTVNMT1dfUEhZQ0xLRU47CisJCXRtcCB8PSBTU0JfVE1TTE9XX0ZHQzsKKwkJc3NiX3dyaXRlMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1csIHRtcCk7CisJCXNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1cpOyAvKiBmbHVzaCAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKKwkJdG1wID0gc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVyk7CisJCXRtcCAmPSB+U1NCX1RNU0xPV19GR0M7CisJCXRtcCB8PSBCNDNfVE1TTE9XX1BIWUNMS0VOOworCQlzc2Jfd3JpdGUzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1wKTsKKwkJc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVyk7IC8qIGZsdXNoICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKIGludCBiNDNfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LCB1bnNpZ25lZCBpbnQgbmV3X2NoYW5uZWwpCiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICYoZGV2LT5waHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmgKaW5kZXggZjFiOTk5My4uNGFkNjI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5oCkBAIC0yMzEsOSArMjMxLDEyIEBACiAJLyogSFQgaW5mbyAqLwogCWJvb2wgaXNfNDBtaHo7CiAKLQkvKiBHTU9ERSBiaXQgZW5hYmxlZD8gKi8KKwkvKiBJcyBHTU9ERSAoMiBHSHogbW9kZSkgYml0IGVuYWJsZWQ/ICovCiAJYm9vbCBnbW9kZTsKIAorCS8qIEFmdGVyIHBvd2VyIHJlc2V0IGZ1bGwgaW5pdCBoYXMgdG8gYmUgcGVyZm9ybWVkICovCisJYm9vbCBkb19mdWxsX2luaXQ7CisKIAkvKiBBbmFsb2cgVHlwZSAqLwogCXU4IGFuYWxvZzsKIAkvKiBCNDNfUEhZVFlQRV8gKi8KQEAgLTM5MCw2ICszOTMsOSBAQAogICovCiB2b2lkIGI0M19waHlfdW5sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CiAKK3ZvaWQgYjQzX3BoeV9wdXRfaW50b19yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwordm9pZCBiNDNfcGh5X3Rha2Vfb3V0X29mX3Jlc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisKIC8qKgogICogYjQzX3N3aXRjaF9jaGFubmVsIC0gU3dpdGNoIHRvIGFub3RoZXIgY2hhbm5lbAogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCmluZGV4IDEyZjQ2N2IuLjhmNWMxNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCkBAIC0xNTg3LDYgKzE1ODcsNyBAQAogCWI0M193cml0ZTE2KGRldiwgMHgwM0U0LCAoYjQzX3JlYWQxNihkZXYsIDB4MDNFNCkgJiAweEZGQzApIHwgMHgwMDA0KTsKIH0KIAorLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvSW5pdC9CNiAqLwogc3RhdGljIHZvaWQgYjQzX3BoeV9pbml0YjYoc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CkBAIC0xNjcwLDcgKzE2NzEsNyBAQAogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTAsIDB4MjApOwogCX0KIAlpZiAocGh5LT5yYWRpb19yZXYgPD0gMikgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4N0MsIDB4MjApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTAsIDB4MjApOwogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUEsIDB4NzApOwogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUIsIDB4N0IpOwogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUMsIDB4QjApOwpAQCAtMTY4Niw5ICsxNjg3LDggQEAKIAkJYjQzX3BoeV93cml0ZShkZXYsIDB4MkEsIDB4OEFDMCk7CiAJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzOCwgMHgwNjY4KTsKIAliNDNfc2V0X3R4cG93ZXJfZyhkZXYsICZncGh5LT5iYmF0dCwgJmdwaHktPnJmYXR0LCBncGh5LT50eF9jb250cm9sKTsKLQlpZiAocGh5LT5yYWRpb19yZXYgPD0gNSkgeworCWlmIChwaHktPnJhZGlvX3JldiA9PSA0IHx8IHBoeS0+cmFkaW9fcmV2ID09IDUpCiAJCWI0M19waHlfbWFza3NldChkZXYsIDB4NUQsIDB4RkY4MCwgMHgwMDAzKTsKLQl9CiAJaWYgKHBoeS0+cmFkaW9fcmV2IDw9IDIpCiAJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVELCAweDAwMEQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCmluZGV4IDI0Y2NiZTkuLjg2NTY5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCkBAIC0yNTcsNiArMjU3LDcyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9yZl9jdGxfaW50Y19vdmVycmlkZV9yZXY3KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkJICAgICAgIGVudW0gbl9pbnRjX292ZXJyaWRlIGludGNfb3ZlcnJpZGUsCisJCQkJCSAgICAgICB1MTYgdmFsdWUsIHU4IGNvcmVfc2VsKQoreworCXUxNiByZWcsIHRtcCwgdG1wMiwgdmFsOworCWludCBjb3JlOworCisJZm9yIChjb3JlID0gMDsgY29yZSA8IDI7IGNvcmUrKykgeworCQlpZiAoKGNvcmVfc2VsID09IDEgJiYgY29yZSAhPSAwKSB8fAorCQkgICAgKGNvcmVfc2VsID09IDIgJiYgY29yZSAhPSAxKSkKKwkJCWNvbnRpbnVlOworCisJCXJlZyA9IChjb3JlID09IDApID8gQjQzX05QSFlfUkZDVExfSU5UQzEgOiBCNDNfTlBIWV9SRkNUTF9JTlRDMjsKKworCQlzd2l0Y2ggKGludGNfb3ZlcnJpZGUpIHsKKwkJY2FzZSBOX0lOVENfT1ZFUlJJREVfT0ZGOgorCQkJYjQzX3BoeV93cml0ZShkZXYsIHJlZywgMCk7CisJCQliNDNfbnBoeV9mb3JjZV9yZl9zZXF1ZW5jZShkZXYsIEI0M19SRlNFUV9SRVNFVDJSWCk7CisJCQlicmVhazsKKwkJY2FzZSBOX0lOVENfT1ZFUlJJREVfVFJTVzoKKwkJCWI0M19waHlfbWFza3NldChkZXYsIHJlZywgfjB4QzAsIHZhbHVlIDw8IDYpOworCQkJYjQzX3BoeV9zZXQoZGV2LCByZWcsIDB4NDAwKTsKKworCQkJYjQzX3BoeV9tYXNrKGRldiwgMHgyZmYsIH4weEMwMDAgJiAweEZGRkYpOworCQkJYjQzX3BoeV9zZXQoZGV2LCAweDJmZiwgMHgyMDAwKTsKKwkJCWI0M19waHlfc2V0KGRldiwgMHgyZmYsIDB4MDAwMSk7CisJCQlicmVhazsKKwkJY2FzZSBOX0lOVENfT1ZFUlJJREVfUEE6CisJCQl0bXAgPSAweDAwMzA7CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJCXZhbCA9IHZhbHVlIDw8IDU7CisJCQllbHNlCisJCQkJdmFsID0gdmFsdWUgPDwgNDsKKwkJCWI0M19waHlfbWFza3NldChkZXYsIHJlZywgfnRtcCwgdmFsKTsKKwkJCWI0M19waHlfc2V0KGRldiwgcmVnLCAweDEwMDApOworCQkJYnJlYWs7CisJCWNhc2UgTl9JTlRDX09WRVJSSURFX0VYVF9MTkFfUFU6CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQkJdG1wID0gMHgwMDAxOworCQkJCXRtcDIgPSAweDAwMDQ7CisJCQkJdmFsID0gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXRtcCA9IDB4MDAwNDsKKwkJCQl0bXAyID0gMHgwMDAxOworCQkJCXZhbCA9IHZhbHVlIDw8IDI7CisJCQl9CisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIH50bXAsIHZhbCk7CisJCQliNDNfcGh5X21hc2soZGV2LCByZWcsIH50bXAyKTsKKwkJCWJyZWFrOworCQljYXNlIE5fSU5UQ19PVkVSUklERV9FWFRfTE5BX0dBSU46CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQkJdG1wID0gMHgwMDAyOworCQkJCXRtcDIgPSAweDAwMDg7CisJCQkJdmFsID0gdmFsdWUgPDwgMTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wID0gMHgwMDA4OworCQkJCXRtcDIgPSAweDAwMDI7CisJCQkJdmFsID0gdmFsdWUgPDwgMzsKKwkJCX0KKwkJCWI0M19waHlfbWFza3NldChkZXYsIHJlZywgfnRtcCwgdmFsKTsKKwkJCWI0M19waHlfbWFzayhkZXYsIHJlZywgfnRtcDIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUkZDdHJsSW50Y092ZXJyaWRlICovCiBzdGF0aWMgdm9pZCBiNDNfbnBoeV9yZl9jdGxfaW50Y19vdmVycmlkZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCiAJCQkJCSAgZW51bSBuX2ludGNfb3ZlcnJpZGUgaW50Y19vdmVycmlkZSwKQEAgLTI2NSw2ICszMzEsMTIgQEAKIAl1OCBpLCBqOwogCXUxNiByZWcsIHRtcCwgdmFsOwogCisJaWYgKGRldi0+cGh5LnJldiA+PSA3KSB7CisJCWI0M19ucGh5X3JmX2N0bF9pbnRjX292ZXJyaWRlX3JldjcoZGV2LCBpbnRjX292ZXJyaWRlLCB2YWx1ZSwKKwkJCQkJCSAgIGNvcmUpOworCQlyZXR1cm47CisJfQorCiAJQjQzX1dBUk5fT04oZGV2LT5waHkucmV2IDwgMyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CkBAIC00MTksNyArNDkxLDggQEAKIAkJc3RhdGljIGNvbnN0IHUxNiBjbGlwW10gPSB7IDB4RkZGRiwgMHhGRkZGIH07CiAJCWlmIChucGh5LT5kZWFmX2NvdW50KysgPT0gMCkgewogCQkJbnBoeS0+Y2xhc3NpZmllcl9zdGF0ZSA9IGI0M19ucGh5X2NsYXNzaWZpZXIoZGV2LCAwLCAwKTsKLQkJCWI0M19ucGh5X2NsYXNzaWZpZXIoZGV2LCAweDcsIDApOworCQkJYjQzX25waHlfY2xhc3NpZmllcihkZXYsIDB4NywKKwkJCQkJICAgIEI0M19OUEhZX0NMQVNTQ1RMX1dBSVRFREVOKTsKIAkJCWI0M19ucGh5X3JlYWRfY2xpcF9kZXRlY3Rpb24oZGV2LCBucGh5LT5jbGlwX3N0YXRlKTsKIAkJCWI0M19ucGh5X3dyaXRlX2NsaXBfZGV0ZWN0aW9uKGRldiwgY2xpcCk7CiAJCX0KQEAgLTYyNywxMyArNzAwLDExIEBACiAJYjQzX3JhZGlvX21hc2soZGV2LCBSMjA1N19SRlBMTF9NSVNDX0NBTF9SRVNFVE4sIH4weDc4KTsKIAliNDNfcmFkaW9fbWFzayhkZXYsIFIyMDU3X1hUQUxfQ09ORklHMiwgfjB4ODApOwogCi0JaWYgKGRldi0+cGh5Lm4tPmluaXRfcG9yKSB7CisJaWYgKGRldi0+cGh5LmRvX2Z1bGxfaW5pdCkgewogCQliNDNfcmFkaW9fMjA1N19yY2FsKGRldik7CiAJCWI0M19yYWRpb18yMDU3X3JjY2FsKGRldik7CiAJfQogCWI0M19yYWRpb19tYXNrKGRldiwgUjIwNTdfUkZQTExfTUFTVEVSLCB+MHg4KTsKLQotCWRldi0+cGh5Lm4tPmluaXRfcG9yID0gZmFsc2U7CiB9CiAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUmFkaW8vMjA1Ny9Jbml0ICovCkBAIC03MzQsOSArODA1LDE2IEBACiAJdTE2IGJpYXMsIGNiaWFzOwogCXUxNiBwYWdfYm9vc3QsIHBhZGdfYm9vc3QsIHBnYWdfYm9vc3QsIG1peGdfYm9vc3Q7CiAJdTE2IHBhYV9ib29zdCwgcGFkYV9ib29zdCwgcGdhYV9ib29zdCwgbWl4YV9ib29zdDsKKwlib29sIGlzX3BrZ19mYWJfc21pYzsKIAogCUI0M19XQVJOX09OKGRldi0+cGh5LnJldiA8IDMpOwogCisJaXNfcGtnX2ZhYl9zbWljID0KKwkJKChkZXYtPmRldi0+Y2hpcF9pZCA9PSBCQ01BX0NISVBfSURfQkNNNDMyMjQgfHwKKwkJICBkZXYtPmRldi0+Y2hpcF9pZCA9PSBCQ01BX0NISVBfSURfQkNNNDMyMjUgfHwKKwkJICBkZXYtPmRldi0+Y2hpcF9pZCA9PSBCQ01BX0NISVBfSURfQkNNNDM0MjEpICYmCisJCSBkZXYtPmRldi0+Y2hpcF9wa2cgPT0gQkNNQV9QS0dfSURfQkNNNDMyMjRfRkFCX1NNSUMpOworCiAJYjQzX2NoYW50YWJfcmFkaW9fMjA1Nl91cGxvYWQoZGV2LCBlKTsKIAliMjA1Nl91cGxvYWRfc3luX3BsbF9jcDIoZGV2LCBiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopOwogCkBAIC03NDQsNyArODIyLDggQEAKIAkgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CiAJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjEsIDB4MUYpOwogCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyLCAweDFGKTsKLQkJaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDcxNikgeworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MTYgfHwKKwkJICAgIGRldi0+ZGV2LT5jaGlwX2lkID09IEJDTUFfQ0hJUF9JRF9CQ000NzE2MikgewogCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSNCwgMHgxNCk7CiAJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0NQMiwgMCk7CiAJCX0gZWxzZSB7CkBAIC03NTIsNiArODMxLDEzIEBACiAJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0NQMiwgMHgxNCk7CiAJCX0KIAl9CisJaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9oaSAmIEI0M19CRkgyX0dQTExfV0FSMiAmJgorCSAgICBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMSwgMHgxZik7CisJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjIsIDB4MWYpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0LCAweDBiKTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9DUDIsIDB4MjApOworCX0KIAlpZiAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfQVBMTF9XQVIgJiYKIAkgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CiAJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjEsIDB4MUYpOwpAQCAtNzY3LDcgKzg1Myw4IEBACiAJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKIAkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfUEFER19JREFDLCAweGNjKTsKIAotCQkJCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQ3MTYpIHsKKwkJCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MTYgfHwKKwkJCQkgICAgZGV2LT5kZXYtPmNoaXBfaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MTYyKSB7CiAJCQkJCWJpYXMgPSAweDQwOwogCQkJCQljYmlhcyA9IDB4NDU7CiAJCQkJCXBhZ19ib29zdCA9IDB4NTsKQEAgLTc3Niw2ICs4NjMsMTAgQEAKIAkJCQl9IGVsc2UgewogCQkJCQliaWFzID0gMHgyNTsKIAkJCQkJY2JpYXMgPSAweDIwOworCQkJCQlpZiAoaXNfcGtnX2ZhYl9zbWljKSB7CisJCQkJCQliaWFzID0gMHgyYTsKKwkJCQkJCWNiaWFzID0gMHgzODsKKwkJCQkJfQogCQkJCQlwYWdfYm9vc3QgPSAweDQ7CiAJCQkJCXBnYWdfYm9vc3QgPSAweDAzOwogCQkJCQltaXhnX2Jvb3N0ID0gMHg2NTsKQEAgLTg0NCw2ICs5MzUsOCBAQAogCQkJbWl4YV9ib29zdCA9IDB4RjsKIAkJfQogCisJCWNiaWFzID0gaXNfcGtnX2ZhYl9zbWljID8gMHgzNSA6IDB4MzA7CisKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQkJb2Zmc2V0ID0gaSA/IEIyMDU2X1RYMSA6IEIyMDU2X1RYMDsKIApAQCAtODYyLDExICs5NTUsMTEgQEAKIAkJCWI0M19yYWRpb193cml0ZShkZXYsCiAJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfUEFEQV9DQVNDQklBUywgMHgwMyk7CiAJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAotCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBQV9JQVVYX1NUQVQsIDB4NTApOworCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBQV9JQVVYX1NUQVQsIDB4MzApOwogCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKLQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUFfSU1BSU5fU1RBVCwgMHg1MCk7CisJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfSU5UUEFBX0lNQUlOX1NUQVQsIDB4MzApOwogCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKLQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUFfQ0FTQ0JJQVMsIDB4MzApOworCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBQV9DQVNDQklBUywgY2JpYXMpOwogCQl9CiAJfQogCkBAIC05MzMsNyArMTAyNiw3IEBACiAJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1Nl9TWU5fQ09NX1JFU0VULCB+MHgyKTsKIAliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU2X1NZTl9QTExfTUFTVDIsIH4weEZDKTsKIAliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU2X1NZTl9SQ0NBTF9DVFJMMCwgfjB4MSk7Ci0JaWYgKGRldi0+cGh5Lm4tPmluaXRfcG9yKQorCWlmIChkZXYtPnBoeS5kb19mdWxsX2luaXQpCiAJCWI0M19yYWRpb18yMDU2X3JjYWwoZGV2KTsKIH0KIApAQCAtOTQ2LDggKzEwMzksNiBAQAogCWI0M19yYWRpb19pbml0MjA1Nl9wcmUoZGV2KTsKIAliMjA1Nl91cGxvYWRfaW5pdHRhYnMoZGV2LCAwLCAwKTsKIAliNDNfcmFkaW9faW5pdDIwNTZfcG9zdChkZXYpOwotCi0JZGV2LT5waHkubi0+aW5pdF9wb3IgPSBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTY0LDIzICsxMjU1LDIwIEBACiAJdTE2IHNlcV9tb2RlOwogCXUzMiB0bXA7CiAKLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIHRydWUpOworCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCB0cnVlKTsKIAogCWlmICgobnBoeS0+YmJfbXVsdF9zYXZlICYgMHg4MDAwMDAwMCkgPT0gMCkgewogCQl0bXAgPSBiNDNfbnRhYl9yZWFkKGRldiwgQjQzX05UQUIxNigxNSwgODcpKTsKIAkJbnBoeS0+YmJfbXVsdF9zYXZlID0gKHRtcCAmIDB4RkZGRikgfCAweDgwMDAwMDAwOwogCX0KIAorCS8qIFRPRE86IGFkZCBtb2RpZnlfYmJtdWx0IGFyZ3VtZW50ICovCiAJaWYgKCFkZXYtPnBoeS5pc180MG1oeikKIAkJdG1wID0gMHg2NDY0OwogCWVsc2UKIAkJdG1wID0gMHg0NzQ3OwogCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNigxNSwgODcpLCB0bXApOwogCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCBmYWxzZSk7Ci0KIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfU0FNUF9ERVBDTlQsIChzYW1wcyAtIDEpKTsKIAogCWlmIChsb29wcyAhPSAweEZGRkYpCkBAIC0xMjEzLDYgKzEzMDEsOCBAQAogCQliNDNlcnIoZGV2LT53bCwgInJ1biBzYW1wbGVzIHRpbWVvdXRcbiIpOwogCiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwgc2VxX21vZGUpOworCisJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIGZhbHNlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTg4LDggKzE2NzgsOCBAQAogCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOwogCiAJdTE2IHNhdmVkX3JlZ3NfcGh5X3JmY3RsWzJdOwotCXUxNiBzYXZlZF9yZWdzX3BoeVsxM107Ci0JdTE2IHJlZ3NfdG9fc3RvcmVbXSA9IHsKKwl1MTYgc2F2ZWRfcmVnc19waHlbMjJdOworCXUxNiByZWdzX3RvX3N0b3JlX3JldjNbXSA9IHsKIAkJQjQzX05QSFlfQUZFQ1RMX09WRVIxLCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwKIAkJQjQzX05QSFlfQUZFQ1RMX0MxLCBCNDNfTlBIWV9BRkVDVExfQzIsCiAJCUI0M19OUEhZX1RYRl80MENPX0IxUzEsIEI0M19OUEhZX1JGQ1RMX09WRVIsCkBAIC0xNTk4LDYgKzE2ODgsMjAgQEAKIAkJQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAxLCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDIsCiAJCUI0M19OUEhZX1JGQ1RMX1JTU0lPMSwgQjQzX05QSFlfUkZDVExfUlNTSU8yCiAJfTsKKwl1MTYgcmVnc190b19zdG9yZV9yZXY3W10gPSB7CisJCUI0M19OUEhZX0FGRUNUTF9PVkVSMSwgQjQzX05QSFlfQUZFQ1RMX09WRVIsCisJCUI0M19OUEhZX0FGRUNUTF9DMSwgQjQzX05QSFlfQUZFQ1RMX0MyLAorCQlCNDNfTlBIWV9UWEZfNDBDT19CMVMxLCBCNDNfTlBIWV9SRkNUTF9PVkVSLAorCQkweDM0MiwgMHgzNDMsIDB4MzQ2LCAweDM0NywKKwkJMHgyZmYsCisJCUI0M19OUEhZX1RYRl80MENPX0IxUzAsIEI0M19OUEhZX1RYRl80MENPX0IzMlMxLAorCQlCNDNfTlBIWV9SRkNUTF9DTUQsCisJCUI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMSwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLAorCQkweDM0MCwgMHgzNDEsIDB4MzQ0LCAweDM0NSwKKwkJQjQzX05QSFlfUkZDVExfUlNTSU8xLCBCNDNfTlBIWV9SRkNUTF9SU1NJTzIKKwl9OworCXUxNiAqcmVnc190b19zdG9yZTsKKwlpbnQgcmVnc19hbW91bnQ7CiAKIAl1MTYgY2xhc3M7CiAKQEAgLTE2MTcsNiArMTcyMSwxNSBAQAogCXU4IHJ4X2NvcmVfc3RhdGU7CiAJaW50IGNvcmUsIGksIGosIHZjbTsKIAorCWlmIChkZXYtPnBoeS5yZXYgPj0gNykgeworCQlyZWdzX3RvX3N0b3JlID0gcmVnc190b19zdG9yZV9yZXY3OworCQlyZWdzX2Ftb3VudCA9IEFSUkFZX1NJWkUocmVnc190b19zdG9yZV9yZXY3KTsKKwl9IGVsc2UgeworCQlyZWdzX3RvX3N0b3JlID0gcmVnc190b19zdG9yZV9yZXYzOworCQlyZWdzX2Ftb3VudCA9IEFSUkFZX1NJWkUocmVnc190b19zdG9yZV9yZXYzKTsKKwl9CisJQlVHX09OKHJlZ3NfYW1vdW50ID4gQVJSQVlfU0laRShzYXZlZF9yZWdzX3BoeSkpOworCiAJY2xhc3MgPSBiNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMCwgMCk7CiAJYjQzX25waHlfY2xhc3NpZmllcihkZXYsIDcsIDQpOwogCWI0M19ucGh5X3JlYWRfY2xpcF9kZXRlY3Rpb24oZGV2LCBjbGlwX3N0YXRlKTsKQEAgLTE2MjQsMjIgKzE3MzcsMjkgQEAKIAogCXNhdmVkX3JlZ3NfcGh5X3JmY3RsWzBdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfSU5UQzEpOwogCXNhdmVkX3JlZ3NfcGh5X3JmY3RsWzFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfSU5UQzIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3NfdG9fc3RvcmUpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHJlZ3NfYW1vdW50OyBpKyspCiAJCXNhdmVkX3JlZ3NfcGh5W2ldID0gYjQzX3BoeV9yZWFkKGRldiwgcmVnc190b19zdG9yZVtpXSk7CiAKIAliNDNfbnBoeV9yZl9jdGxfaW50Y19vdmVycmlkZShkZXYsIE5fSU5UQ19PVkVSUklERV9PRkYsIDAsIDcpOwogCWI0M19ucGh5X3JmX2N0bF9pbnRjX292ZXJyaWRlKGRldiwgTl9JTlRDX09WRVJSSURFX1RSU1csIDEsIDcpOwotCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4MSwgMCwgMCwgZmFsc2UpOwotCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4MiwgMSwgMCwgZmFsc2UpOwotCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4ODAsIDEsIDAsIGZhbHNlKTsKLQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDQwLCAxLCAwLCBmYWxzZSk7CiAKLQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4MjAsIDAsIDAsIGZhbHNlKTsKLQkJYjQzX25waHlfcmZfY3RsX292ZXJyaWRlKGRldiwgMHgxMCwgMSwgMCwgZmFsc2UpOworCWlmIChkZXYtPnBoeS5yZXYgPj0gNykgeworCQkvKiBUT0RPICovCisJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJfSBlbHNlIHsKKwkJfQogCX0gZWxzZSB7Ci0JCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4MTAsIDAsIDAsIGZhbHNlKTsKLQkJYjQzX25waHlfcmZfY3RsX292ZXJyaWRlKGRldiwgMHgyMCwgMSwgMCwgZmFsc2UpOworCQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDEsIDAsIDAsIGZhbHNlKTsKKwkJYjQzX25waHlfcmZfY3RsX292ZXJyaWRlKGRldiwgMHgyLCAxLCAwLCBmYWxzZSk7CisJCWI0M19ucGh5X3JmX2N0bF9vdmVycmlkZShkZXYsIDB4ODAsIDEsIDAsIGZhbHNlKTsKKwkJYjQzX25waHlfcmZfY3RsX292ZXJyaWRlKGRldiwgMHg0MCwgMSwgMCwgZmFsc2UpOworCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDIwLCAwLCAwLCBmYWxzZSk7CisJCQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDEwLCAxLCAwLCBmYWxzZSk7CisJCX0gZWxzZSB7CisJCQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDEwLCAwLCAwLCBmYWxzZSk7CisJCQliNDNfbnBoeV9yZl9jdGxfb3ZlcnJpZGUoZGV2LCAweDIwLCAxLCAwLCBmYWxzZSk7CisJCX0KIAl9CiAKIAlyeF9jb3JlX3N0YXRlID0gYjQzX25waHlfZ2V0X3J4X2NvcmVfc3RhdGUoZGV2KTsKQEAgLTE2NTQsOCArMTc3NCwxMSBAQAogCiAJCS8qIEdyYWIgUlNTSSByZXN1bHRzIGZvciBldmVyeSBwb3NzaWJsZSBWQ00gKi8KIAkJZm9yICh2Y20gPSAwOyB2Y20gPCA4OyB2Y20rKykgewotCQkJYjQzX3JhZGlvX21hc2tzZXQoZGV2LCByIHwgQjIwNTZfUlhfUlNTSV9NSVNDLCAweEUzLAotCQkJCQl2Y20gPDwgMik7CisJCQlpZiAoZGV2LT5waHkucmV2ID49IDcpCisJCQkJOworCQkJZWxzZQorCQkJCWI0M19yYWRpb19tYXNrc2V0KGRldiwgciB8IEIyMDU2X1JYX1JTU0lfTUlTQywKKwkJCQkJCSAgMHhFMywgdmNtIDw8IDIpOwogCQkJYjQzX25waHlfcG9sbF9yc3NpKGRldiwgTl9SU1NJX05CLCByZXN1bHRzW3ZjbV0sIDgpOwogCQl9CiAKQEAgLTE2ODIsOCArMTgwNSwxMSBAQAogCQl9CiAKIAkJLyogU2VsZWN0IHRoZSBiZXN0IFZDTSAqLwotCQliNDNfcmFkaW9fbWFza3NldChkZXYsIHIgfCBCMjA1Nl9SWF9SU1NJX01JU0MsIDB4RTMsCi0JCQkJICB2Y21fZmluYWwgPDwgMik7CisJCWlmIChkZXYtPnBoeS5yZXYgPj0gNykKKwkJCTsKKwkJZWxzZQorCQkJYjQzX3JhZGlvX21hc2tzZXQoZGV2LCByIHwgQjIwNTZfUlhfUlNTSV9NSVNDLAorCQkJCQkgIDB4RTMsIHZjbV9maW5hbCA8PCAyKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQlpZiAoY29yZSAhPSBpIC8gMikKQEAgLTE3MzYsOSArMTg2Miw5IEBACiAKIAliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIDB4MSk7CiAJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsIEI0M19OUEhZX1JGQ1RMX0NNRF9SWFRYKTsKLQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9UWEZfNDBDT19CMVMxLCB+MHgxKTsKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCB+MHgxKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3NfdG9fc3RvcmUpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHJlZ3NfYW1vdW50OyBpKyspCiAJCWI0M19waHlfd3JpdGUoZGV2LCByZWdzX3RvX3N0b3JlW2ldLCBzYXZlZF9yZWdzX3BoeVtpXSk7CiAKIAkvKiBTdG9yZSBmb3IgZnV0dXJlIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTI0OTQsOCArMjYyMCw4IEBACiAJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCiAJLyogVFggdG8gUlggKi8KLQl1OCB0eDJyeF9ldmVudHNbOF0gPSB7IDB4NCwgMHgzLCAweDYsIDB4NSwgMHgyLCAweDEsIDB4OCwgMHgxRiB9OwotCXU4IHR4MnJ4X2RlbGF5c1s4XSA9IHsgOCwgNCwgMiwgMiwgNCwgNCwgNiwgMSB9OworCXU4IHR4MnJ4X2V2ZW50c1s3XSA9IHsgMHg0LCAweDMsIDB4NSwgMHgyLCAweDEsIDB4OCwgMHgxRiB9OworCXU4IHR4MnJ4X2RlbGF5c1s3XSA9IHsgOCwgNCwgNCwgNCwgNCwgNiwgMSB9OwogCS8qIFJYIHRvIFRYICovCiAJdTggcngydHhfZXZlbnRzX2lwYVs5XSA9IHsgMHgwLCAweDEsIDB4MiwgMHg4LCAweDUsIDB4NiwgMHhGLCAweDMsCiAJCQkJCTB4MUYgfTsKQEAgLTI1MDMsNiArMjYyOSwyMyBAQAogCXU4IHJ4MnR4X2V2ZW50c1s5XSA9IHsgMHgwLCAweDEsIDB4MiwgMHg4LCAweDUsIDB4NiwgMHgzLCAweDQsIDB4MUYgfTsKIAl1OCByeDJ0eF9kZWxheXNbOV0gPSB7IDgsIDYsIDYsIDQsIDQsIDE4LCA0MiwgMSwgMSB9OwogCisJdTE2IHZtaWRzWzVdWzRdID0geworCQl7IDB4YTIsIDB4YjQsIDB4YjQsIDB4ODksIH0sIC8qIDAgKi8KKwkJeyAweGI0LCAweGI0LCAweGI0LCAweDI0LCB9LCAvKiAxICovCisJCXsgMHhhMiwgMHhiNCwgMHhiNCwgMHg3NCwgfSwgLyogMiAqLworCQl7IDB4YTIsIDB4YjQsIDB4YjQsIDB4MjcwLCB9LCAvKiAzICovCisJCXsgMHhhMiwgMHhiNCwgMHhiNCwgMHgwMCwgfSwgLyogNCBhbmQgNSAqLworCX07CisJdTE2IGdhaW5zWzVdWzRdID0geworCQl7IDB4MDIsIDB4MDIsIDB4MDIsIDB4MDAsIH0sIC8qIDAgKi8KKwkJeyAweDAyLCAweDAyLCAweDAyLCAweDAyLCB9LCAvKiAxICovCisJCXsgMHgwMiwgMHgwMiwgMHgwMiwgMHgwNCwgfSwgLyogMiAqLworCQl7IDB4MDIsIDB4MDIsIDB4MDIsIDB4MDAsIH0sIC8qIDMgKi8KKwkJeyAweDAyLCAweDAyLCAweDAyLCAweDAwLCB9LCAvKiA0IGFuZCA1ICovCisJfTsKKwl1MTYgKnZtaWQsICpnYWluOworCisJdTggcGRldF9yYW5nZTsKIAl1MTYgdG1wMTY7CiAJdTMyIHRtcDMyOwogCkBAIC0yNTYxLDcgKzI3MDQsNzEgQEAKIAliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMCksIDIpOwogCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAxNiksIDIpOwogCi0JLyogVE9ETyAqLworCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCXBkZXRfcmFuZ2UgPSBzcHJvbS0+ZmVtLmdoejIucGRldF9yYW5nZTsKKwllbHNlCisJCXBkZXRfcmFuZ2UgPSBzcHJvbS0+ZmVtLmdoejUucGRldF9yYW5nZTsKKwl2bWlkID0gdm1pZHNbbWluX3QodTE2LCBwZGV0X3JhbmdlLCA0KV07CisJZ2FpbiA9IGdhaW5zW21pbl90KHUxNiwgcGRldF9yYW5nZSwgNCldOworCXN3aXRjaCAocGRldF9yYW5nZSkgeworCWNhc2UgMzoKKwkJaWYgKCEoZGV2LT5waHkucmV2ID49IDQgJiYKKwkJICAgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSkKKwkJCWJyZWFrOworCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwljYXNlIDA6CisJY2FzZSAxOgorCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNig4LCAweDA4KSwgNCwgdm1pZCk7CisJCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTgpLCA0LCB2bWlkKTsKKwkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoOCwgMHgwYyksIDQsIGdhaW4pOworCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNig4LCAweDFjKSwgNCwgZ2Fpbik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKGRldi0+cGh5LnJldiA+PSA2KSB7CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQkJCXZtaWRbM10gPSAweDk0OworCQkJZWxzZQorCQkJCXZtaWRbM10gPSAweDhlOworCQkJZ2FpblszXSA9IDM7CisJCX0gZWxzZSBpZiAoZGV2LT5waHkucmV2ID09IDUpIHsKKwkJCXZtaWRbM10gPSAweDg0OworCQkJZ2FpblszXSA9IDI7CisJCX0KKwkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoOCwgMHgwOCksIDQsIHZtaWQpOworCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNig4LCAweDE4KSwgNCwgdm1pZCk7CisJCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MGMpLCA0LCBnYWluKTsKKwkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoOCwgMHgxYyksIDQsIGdhaW4pOworCQlicmVhazsKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSAhPSBJRUVFODAyMTFfQkFORF8yR0haKSB7CisJCQlpZiAocGRldF9yYW5nZSA9PSA0KSB7CisJCQkJdm1pZFszXSA9IDB4OGU7CisJCQkJdG1wMTYgPSAweDk2OworCQkJCWdhaW5bM10gPSAweDI7CisJCQl9IGVsc2UgeworCQkJCXZtaWRbM10gPSAweDg5OworCQkJCXRtcDE2ID0gMHg4OTsKKwkJCQlnYWluWzNdID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwZGV0X3JhbmdlID09IDQpIHsKKwkJCQl2bWlkWzNdID0gMHg4OTsKKwkJCQl0bXAxNiA9IDB4OGI7CisJCQkJZ2FpblszXSA9IDB4MjsKKwkJCX0gZWxzZSB7CisJCQkJdm1pZFszXSA9IDB4NzQ7CisJCQkJdG1wMTYgPSAweDcwOworCQkJCWdhaW5bM10gPSAwOworCQkJfQorCQl9CisJCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDgpLCA0LCB2bWlkKTsKKwkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoOCwgMHgwYyksIDQsIGdhaW4pOworCQl2bWlkWzNdID0gdG1wMTY7CisJCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTgpLCA0LCB2bWlkKTsKKwkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoOCwgMHgxYyksIDQsIGdhaW4pOworCQlicmVhazsKKwl9CiAKIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX01BU1RfQklBUywgMHgwMCk7CiAJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTUlYQV9NQVNUX0JJQVMsIDB4MDApOwpAQCAtMjYwMCw3ICsyODA3LDcgQEAKIAkvKiBEcm9wcGVkIHByb2JhYmx5LWFsd2F5cy10cnVlIGNvbmRpdGlvbiAqLwogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9FRF9DUlM0MEFTU0VSVFRIUkVTSDAsIDB4MDNlYik7CiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0VEX0NSUzQwQVNTRVJUVEhSRVNIMSwgMHgwM2ViKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRURfQ1JTNDBERUFTU0VSVFRIUkVTSDEsIDB4MDM0MSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0VEX0NSUzQwREVBU1NFUlRUSFJFU0gwLCAweDAzNDEpOwogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9FRF9DUlM0MERFQVNTRVJUVEhSRVNIMSwgMHgwMzQxKTsKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRURfQ1JTMjBMQVNTRVJUVEhSRVNIMCwgMHgwNDJiKTsKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRURfQ1JTMjBMQVNTRVJUVEhSRVNIMSwgMHgwNDJiKTsKQEAgLTMyMTEsNiArMzQxOCwyMCBAQAogCXU4IGlkeCwgZGVsdGE7CiAJdTggaSwgc3RmX21vZGU7CiAKKwkvKiBBcnJheSBhZGpfcHdyX3RibCBjb3JyZXNwb25kcyB0byB0aGUgaGFyZHdhcmUgdGFibGUuIEl0IGNvbnNpc3RzIG9mCisJICogMjEgZ3JvdXBzLCBlYWNoIGNvbnRhaW5pbmcgNCBlbnRyaWVzLgorCSAqCisJICogRmlyc3QgZ3JvdXAgaGFzIGVudHJpZXMgZm9yIENDSyBtb2R1bGF0aW9uLgorCSAqIFRoZSByZXN0IG9mIGdyb3VwcyBoYXMgMSBlbnRyeSBwZXIgbW9kdWxhdGlvbiAoU0lTTywgQ0RELCBTVEJDLCBTRE0pLgorCSAqCisJICogR3JvdXAgMCBpcyBmb3IgQ0NLCisJICogR3JvdXBzIDEuLjQgdXNlIEJQU0sgKGdyb3VwIHBlciBjb2RpbmcgcmF0ZSkKKwkgKiBHcm91cHMgNS4uOCB1c2UgUVBTSyAoZ3JvdXAgcGVyIGNvZGluZyByYXRlKQorCSAqIEdyb3VwcyA5Li4xMiB1c2UgMTYtUUFNIChncm91cCBwZXIgY29kaW5nIHJhdGUpCisJICogR3JvdXBzIDEzLi4xNiB1c2UgNjQtUUFNIChncm91cCBwZXIgY29kaW5nIHJhdGUpCisJICogR3JvdXBzIDE3Li4yMCBhcmUgdW5rbm93bgorCSAqLworCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJbnBoeS0+YWRqX3B3cl90YmxbaV0gPSBucGh5LT50eF9wb3dlcl9vZmZzZXRbaV07CiAKQEAgLTM0MDksMTAgKzM2MzAsOCBAQAogCX0KIAogCWI0M19ucGh5X3R4X3ByZXBhcmVfYWRqdXN0ZWRfcG93ZXJfdGFibGUoZGV2KTsKLQkvKgogCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KDI2LCA2NCksIDg0LCBucGh5LT5hZGpfcHdyX3RibCk7CiAJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoMjcsIDY0KSwgODQsIG5waHktPmFkal9wd3JfdGJsKTsKLQkqLwogCiAJaWYgKG5waHktPmhhbmdfYXZvaWQpCiAJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCBmYWxzZSk7CkBAIC01MTI0LDcgKzUzNDMsNyBAQAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWE1BQ0lGX0hPTERPRkYsIDB4MDAxNSk7CiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYTUFDREVMQVksIDB4MDMyMCk7CiAJaWYgKHBoeS0+cmV2ID49IDMgJiYgcGh5LT5yZXYgPD0gNikKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BMT0FEX0NTRU5TRV9FWFRMRU4sIDB4MDAxNCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QTE9BRF9DU0VOU0VfRVhUTEVOLCAweDAwMzIpOwogCWI0M19ucGh5X3R4X2xwX2ZidyhkZXYpOwogCWlmIChwaHktPnJldiA+PSAzKQogCQliNDNfbnBoeV9zcHVyX3dvcmthcm91bmQoZGV2KTsKQEAgLTUzMzgsNyArNTU1Nyw2IEBACiAJbnBoeS0+aGFuZ19hdm9pZCA9IChwaHktPnJldiA9PSAzIHx8IHBoeS0+cmV2ID09IDQpOwogCW5waHktPnNwdXJfYXZvaWQgPSAocGh5LT5yZXYgPj0gMykgPwogCQkJCUI0M19TUFVSX0FWT0lEX0FVVE8gOiBCNDNfU1BVUl9BVk9JRF9ESVNBQkxFOwotCW5waHktPmluaXRfcG9yID0gdHJ1ZTsKIAlucGh5LT5nYWluX2Jvb3N0ID0gdHJ1ZTsgLyogdGhpcyB3YXkgd2UgZm9sbG93IHdsLCBhc3N1bWUgaXQgaXMgdHJ1ZSAqLwogCW5waHktPnR4cnhfY2hhaW4gPSAyOyAvKiBzdGggZGlmZmVyZW50IHRoYW4gMCBhbmQgMSBmb3Igbm93ICovCiAJbnBoeS0+cGh5cnhjaGFpbiA9IDM7IC8qIHRvIGF2b2lkIGI0M19ucGh5X3NldF9yeF9jb3JlX3N0YXRlIGxpa2Ugd2wgKi8KQEAgLTUzNzksOCArNTU5Nyw2IEBACiAJCW5waHktPmlwYTJnX29uID0gc3Byb20tPmZlbS5naHoyLmV4dHBhX2dhaW4gPT0gMjsKIAkJbnBoeS0+aXBhNWdfb24gPSBzcHJvbS0+ZmVtLmdoejUuZXh0cGFfZ2FpbiA9PSAyOwogCX0KLQotCW5waHktPmluaXRfcG9yID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX25waHlfb3BfZnJlZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCkBAIC01NDQxLDggKzU2NTcsMTEgQEAKIHsKIAkvKiBSZWdpc3RlciAxIGlzIGEgMzItYml0IHJlZ2lzdGVyLiAqLwogCUI0M19XQVJOX09OKHJlZyA9PSAxKTsKLQkvKiBOLVBIWSBuZWVkcyAweDEwMCBmb3IgcmVhZCBhY2Nlc3MgKi8KLQlyZWcgfD0gMHgxMDA7CisKKwlpZiAoZGV2LT5waHkucmV2ID49IDcpCisJCXJlZyB8PSAweDIwMDsgLyogUmFkaW8gMHgyMDU3ICovCisJZWxzZQorCQlyZWcgfD0gMHgxMDA7CiAKIAliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsIHJlZyk7CiAJcmV0dXJuIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0xPVyk7CkBAIC01NDg4LDEwICs1NzA3LDEyIEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAoZGV2LT5waHkucmV2ID49IDcpIHsKLQkJCWI0M19yYWRpb18yMDU3X2luaXQoZGV2KTsKKwkJCWlmICghZGV2LT5waHkucmFkaW9fb24pCisJCQkJYjQzX3JhZGlvXzIwNTdfaW5pdChkZXYpOwogCQkJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgZGV2LT5waHkuY2hhbm5lbCk7CiAJCX0gZWxzZSBpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWI0M19yYWRpb19pbml0MjA1NihkZXYpOworCQkJaWYgKCFkZXYtPnBoeS5yYWRpb19vbikKKwkJCQliNDNfcmFkaW9faW5pdDIwNTYoZGV2KTsKIAkJCWI0M19zd2l0Y2hfY2hhbm5lbChkZXYsIGRldi0+cGh5LmNoYW5uZWwpOwogCQl9IGVsc2UgewogCQkJYjQzX3JhZGlvX2luaXQyMDU1KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCmluZGV4IDlhNWI2YmMuLmVjZmJmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCkBAIC05MzEsNyArOTMxLDYgQEAKIAl1MTYgcGFwZF9lcHNpbG9uX29mZnNldFsyXTsKIAlzMzIgcHJlYW1ibGVfb3ZlcnJpZGU7CiAJdTMyIGJiX211bHRfc2F2ZTsKLQlib29sIGluaXRfcG9yOwogCiAJYm9vbCBnYWluX2Jvb3N0OwogCWJvb2wgZWxuYV9nYWluX2NvbmZpZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5jCmluZGV4IGI0ZmQ5MzQuLjJjZTI1NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuYwpAQCAtNDgsNyArNDgsNyBAQAogCXVuc2lnbmVkIGludCByeF9sZW5ndGg7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXYzX3N5bltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcGh5X3JldjNfc3luW10gPSB7CiAJW0IyMDU2X1NZTl9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9SRVNFUlZFRF9BRERSM10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9SRVNFUlZFRF9BRERSNF0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCkBAIC0yMzIsNyArMjMyLDcgQEAKIAlbQjIwNTZfU1lOX0xPR0VOX1RYX0NNT1NfVkFMSURdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2M190eFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcGh5X3JldjNfdHhbXSA9IHsKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSM10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFI0XQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKQEAgLTM4MCw3ICszODAsNyBAQAogCVtCMjA1Nl9UWF9TVEFUVVNfVFhMUEZfUkNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2M19yeFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcGh5X3JldjNfcnhbXSA9IHsKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSM10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFI0XQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKQEAgLTUzMCw3ICs1MzAsNyBAQAogCVtCMjA1Nl9SWF9TVEFUVVNfSFBDX1JDXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSBiMjA1Nl9pbml0dGFiX3JldjRfc3luW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9waHlfcmV2NF9zeW5bXSA9IHsKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFIyXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFI0XQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKQEAgLTcxNCw3ICs3MTQsNyBAQAogCVtCMjA1Nl9TWU5fTE9HRU5fVFhfQ01PU19WQUxJRF0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXY0X3R4W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9waHlfcmV2NF90eFtdID0gewogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtODYyLDcgKzg2Miw3IEBACiAJW0IyMDU2X1RYX1NUQVRVU19UWExQRl9SQ10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXY0X3J4W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9waHlfcmV2NF9yeFtdID0gewogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIAlbQjIwNTZfUlhfU1RBVFVTX0hQQ19SQ10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXY1X3N5bltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2NV9zeW5bXSA9IHsKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFIyXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1JFU0VSVkVEX0FERFI0XQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKQEAgLTExOTYsNyArMTE5Niw3IEBACiAJW0IyMDU2X1NZTl9MT0dFTl9UWF9DTU9TX1ZBTElEXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSBiMjA1Nl9pbml0dGFiX3JldjVfdHhbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSBiMjA1Nl9pbml0dGFiX3JhZGlvX3JldjVfdHhbXSA9IHsKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSM10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFI0XQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKQEAgLTEzNTIsNyArMTM1Miw3IEBACiAJW0IyMDU2X1RYX0dNQkJfSURBQzddCQk9IHsgLmdoejUgPSAweDAwNzUsIC5naHoyID0gMHgwMDc1LCBVUExPQUQsIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXY1X3J4W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yYWRpb19yZXY1X3J4W10gPSB7CiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFIyXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSNF0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCkBAIC0xNTAyLDcgKzE1MDIsNyBAQAogCVtCMjA1Nl9SWF9TVEFUVVNfSFBDX1JDXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSBiMjA1Nl9pbml0dGFiX3JldjZfc3luW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yYWRpb19yZXY2X3N5bltdID0gewogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMTY4Niw3ICsxNjg2LDcgQEAKIAlbQjIwNTZfU1lOX0xPR0VOX1RYX0NNT1NfVkFMSURdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2Nl90eFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2Nl90eFtdID0gewogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMTg0Miw3ICsxODQyLDcgQEAKIAlbQjIwNTZfVFhfR01CQl9JREFDN10JCT0geyAuZ2h6NSA9IDB4MDA3MCwgLmdoejIgPSAweDAwNzAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2Nl9yeFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2Nl9yeFtdID0gewogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMTk5Miw3ICsxOTkyLDcgQEAKIAlbQjIwNTZfUlhfU1RBVFVTX0hQQ19SQ10JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yZXY3X3N5bltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2N185X3N5bltdID0gewogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMjE3Niw3ICsyMTc2LDcgQEAKIAlbQjIwNTZfU1lOX0xPR0VOX1RYX0NNT1NfVkFMSURdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2N190eFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2N185X3R4W10gPSB7CiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFIyXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSNF0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCkBAIC0yMzMyLDcgKzIzMzIsNyBAQAogCVtCMjA1Nl9UWF9HTUJCX0lEQUM3XQkJPSB7IC5naHo1ID0gMHgwMDc1LCAuZ2h6MiA9IDB4MDA3NSwgVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2N19yeFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2N185X3J4W10gPSB7CiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFIyXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSNF0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCkBAIC0yNDgyLDcgKzI0ODIsNyBAQAogCVtCMjA1Nl9SWF9TVEFUVVNfSFBDX1JDXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSBiMjA1Nl9pbml0dGFiX3Jldjhfc3luW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yYWRpb19yZXY4X3N5bltdID0gewogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjJdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjNdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMjY2Niw3ICsyNjY2LDcgQEAKIAlbQjIwNTZfU1lOX0xPR0VOX1RYX0NNT1NfVkFMSURdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2OF90eFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2OF90eFtdID0gewogCVtCMjA1Nl9UWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1RYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfVFhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMjgyMiw3ICsyODIyLDcgQEAKIAlbQjIwNTZfVFhfR01CQl9JREFDN10JCT0geyAuZ2h6NSA9IDB4MDA3MCwgLmdoejIgPSAweDAwNzAsIE5PVVBMT0FELCB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmV2OF9yeFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2OF9yeFtdID0gewogCVtCMjA1Nl9SWF9SRVNFUlZFRF9BRERSMl0JPSB7IC5naHo1ID0gMHgwMDAwLCAuZ2h6MiA9IDB4MDAwMCwgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1JYX1JFU0VSVkVEX0FERFIzXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfUlhfUkVTRVJWRURfQUREUjRdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIE5PVVBMT0FELCB9LApAQCAtMjk3MiwyNCArMjk3Miw2OSBAQAogCVtCMjA1Nl9SWF9TVEFUVVNfSFBDX1JDXQk9IHsgLmdoejUgPSAweDAwMDAsIC5naHoyID0gMHgwMDAwLCBOT1VQTE9BRCwgfSwKIH07CiAKLSNkZWZpbmUgSU5JVFRBQlNQVFMocHJlZml4KSBcCi0JLnN5bgkJPSBwcmVmaXgjI19zeW4sCQkJXAotCS5zeW5fbGVuZ3RoCT0gQVJSQVlfU0laRShwcmVmaXgjI19zeW4pLAlcCi0JLnR4CQk9IHByZWZpeCMjX3R4LAkJCVwKLQkudHhfbGVuZ3RoCT0gQVJSQVlfU0laRShwcmVmaXgjI190eCksCVwKLQkucngJCT0gcHJlZml4IyNfcngsCQkJXAotCS5yeF9sZW5ndGgJPSBBUlJBWV9TSVpFKHByZWZpeCMjX3J4KQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJzX3B0cyBiMjA1Nl9pbml0dGFic1tdID0gewotCVszXSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXYzKSB9LAotCVs0XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY0KSB9LAotCVs1XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY1KSB9LAotCVs2XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY2KSB9LAotCVs3XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY3KSB9LAotCVs4XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY4KSB9LAotCVs5XSA9IHsgSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yZXY3KSB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5IGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2MTFfc3luW10gPSB7CisJW0IyMDU2X1NZTl9QTExfUEZEXQkJPSB7IC5naHo1ID0gMHgwMDA2LCAuZ2h6MiA9IDB4MDAwNiwgVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0NQMl0JCT0geyAuZ2h6NSA9IDB4MDAzZiwgLmdoejIgPSAweDAwM2YsIFVQTE9BRCwgfSwKKwlbQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMV0JPSB7IC5naHo1ID0gMHgwMDA2LCAuZ2h6MiA9IDB4MDAwNiwgVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyXQk9IHsgLmdoejUgPSAweDAwMDYsIC5naHoyID0gMHgwMDA2LCBVUExPQUQsIH0sCisJW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjRdCT0geyAuZ2h6NSA9IDB4MDAyYiwgLmdoejIgPSAweDAwMmIsIFVQTE9BRCwgfSwKKwlbQjIwNTZfU1lOX1BMTF9WQ08yXQkJPSB7IC5naHo1ID0gMHgwMGY3LCAuZ2h6MiA9IDB4MDBmNywgVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX1ZDT0NBTDEyXQk9IHsgLmdoejUgPSAweDAwMDcsIC5naHoyID0gMHgwMDA3LCBVUExPQUQsIH0sCisJW0IyMDU2X1NZTl9MT0dFTkJVRjJdCQk9IHsgLmdoejUgPSAweDAwOGYsIC5naHoyID0gMHgwMDhmLCBVUExPQUQsIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yYWRpb19yZXYxMV90eFtdID0geworCVtCMjA1Nl9UWF9QQV9TUEFSRTJdCQk9IHsgLmdoejUgPSAweDAwZWUsIC5naHoyID0gMHgwMGVlLCBVUExPQUQsIH0sCisJW0IyMDU2X1RYX0lOVFBBQV9JQVVYX1NUQVRdCT0geyAuZ2h6NSA9IDB4MDA1MCwgLmdoejIgPSAweDAwNTAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfVFhfSU5UUEFBX0lNQUlOX1NUQVRdCT0geyAuZ2h6NSA9IDB4MDA1MCwgLmdoejIgPSAweDAwNTAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfVFhfSU5UUEFBX1BBU0xPUEVdCT0geyAuZ2h6NSA9IDB4MDBmMCwgLmdoejIgPSAweDAwZjAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfVFhfSU5UUEFHX1BBU0xPUEVdCT0geyAuZ2h6NSA9IDB4MDBmMCwgLmdoejIgPSAweDAwZjAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfVFhfUEFEQV9JREFDXQkJPSB7IC5naHo1ID0gMHgwMGZmLCAuZ2h6MiA9IDB4MDBmZiwgVVBMT0FELCB9LAorCVtCMjA1Nl9UWF9QQURBX1NMT1BFXQkJPSB7IC5naHo1ID0gMHgwMDcwLCAuZ2h6MiA9IDB4MDA3MCwgVVBMT0FELCB9LAorCVtCMjA1Nl9UWF9QQURHX1NMT1BFXQkJPSB7IC5naHo1ID0gMHgwMDcwLCAuZ2h6MiA9IDB4MDA3MCwgVVBMT0FELCB9LAorCVtCMjA1Nl9UWF9QR0FBX0lEQUNdCQk9IHsgLmdoejUgPSAweDAwZmYsIC5naHoyID0gMHgwMGZmLCBVUExPQUQsIH0sCisJW0IyMDU2X1RYX1BHQUFfU0xPUEVdCQk9IHsgLmdoejUgPSAweDAwNzcsIC5naHoyID0gMHgwMDc3LCBVUExPQUQsIH0sCisJW0IyMDU2X1RYX1BHQUdfU0xPUEVdCQk9IHsgLmdoejUgPSAweDAwNzcsIC5naHoyID0gMHgwMDc3LCBVUExPQUQsIH0sCisJW0IyMDU2X1RYX0dNQkJfSURBQ10JCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfVFhfVFhTUEFSRTFdCQk9IHsgLmdoejUgPSAweDAwMzAsIC5naHoyID0gMHgwMDMwLCBVUExPQUQsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJfZW50cnkgYjIwNTZfaW5pdHRhYl9yYWRpb19yZXYxMV9yeFtdID0geworCVtCMjA1Nl9SWF9CSUFTUE9MRV9MTkFBMV9JREFDXQk9IHsgLmdoejUgPSAweDAwMTcsIC5naHoyID0gMHgwMDE3LCBVUExPQUQsIH0sCisJW0IyMDU2X1JYX0xOQUEyX0lEQUNdCQk9IHsgLmdoejUgPSAweDAwZmYsIC5naHoyID0gMHgwMGZmLCBVUExPQUQsIH0sCisJW0IyMDU2X1JYX0JJQVNQT0xFX0xOQUcxX0lEQUNdCT0geyAuZ2h6NSA9IDB4MDAxNywgLmdoejIgPSAweDAwMTcsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfTE5BRzJfSURBQ10JCT0geyAuZ2h6NSA9IDB4MDBmMCwgLmdoejIgPSAweDAwZjAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfTUlYQV9WQ01dCQk9IHsgLmdoejUgPSAweDAwNTUsIC5naHoyID0gMHgwMDU1LCBVUExPQUQsIH0sCisJW0IyMDU2X1JYX01JWEFfTE9CX0JJQVNdCT0geyAuZ2h6NSA9IDB4MDA4OCwgLmdoejIgPSAweDAwODgsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfTUlYQV9CSUFTX0FVWF0JPSB7IC5naHo1ID0gMHgwMDA3LCAuZ2h6MiA9IDB4MDAwNywgVVBMT0FELCB9LAorCVtCMjA1Nl9SWF9NSVhHX1ZDTV0JCT0geyAuZ2h6NSA9IDB4MDA1NSwgLmdoejIgPSAweDAwNTUsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfVElBX0lPUEFNUF0JCT0geyAuZ2h6NSA9IDB4MDAyNiwgLmdoejIgPSAweDAwMjYsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfVElBX1FPUEFNUF0JCT0geyAuZ2h6NSA9IDB4MDAyNiwgLmdoejIgPSAweDAwMjYsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfVElBX0lNSVNDXQkJPSB7IC5naHo1ID0gMHgwMDBmLCAuZ2h6MiA9IDB4MDAwZiwgVVBMT0FELCB9LAorCVtCMjA1Nl9SWF9USUFfUU1JU0NdCQk9IHsgLmdoejUgPSAweDAwMGYsIC5naHoyID0gMHgwMDBmLCBVUExPQUQsIH0sCisJW0IyMDU2X1JYX1JYTFBGX09VVFZDTV0JCT0geyAuZ2h6NSA9IDB4MDAwNCwgLmdoejIgPSAweDAwMDQsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfVkdBX0JJQVNfRENDQU5DRUxdCT0geyAuZ2h6NSA9IDB4MDAwMCwgLmdoejIgPSAweDAwMDAsIFVQTE9BRCwgfSwKKwlbQjIwNTZfUlhfUlhTUEFSRTNdCQk9IHsgLmdoejUgPSAweDAwMDUsIC5naHoyID0gMHgwMDA1LCBVUExPQUQsIH0sCit9OworCisjZGVmaW5lIElOSVRUQUJTUFRTKHByZWZpeCkgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYnNfcHRzIHByZWZpeCA9IHsJXAorCQkuc3luCQk9IHByZWZpeCMjX3N5biwJCQlcCisJCS5zeW5fbGVuZ3RoCT0gQVJSQVlfU0laRShwcmVmaXgjI19zeW4pLAlcCisJCS50eAkJPSBwcmVmaXgjI190eCwJCQlcCisJCS50eF9sZW5ndGgJPSBBUlJBWV9TSVpFKHByZWZpeCMjX3R4KSwJXAorCQkucngJCT0gcHJlZml4IyNfcngsCQkJXAorCQkucnhfbGVuZ3RoCT0gQVJSQVlfU0laRShwcmVmaXgjI19yeCksCVwKKwl9CisKK0lOSVRUQUJTUFRTKGIyMDU2X2luaXR0YWJfcGh5X3JldjMpOworSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9waHlfcmV2NCk7CitJTklUVEFCU1BUUyhiMjA1Nl9pbml0dGFiX3JhZGlvX3JldjUpOworSU5JVFRBQlNQVFMoYjIwNTZfaW5pdHRhYl9yYWRpb19yZXY2KTsKK0lOSVRUQUJTUFRTKGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2N185KTsKK0lOSVRUQUJTUFRTKGIyMDU2X2luaXR0YWJfcmFkaW9fcmV2OCk7CitJTklUVEFCU1BUUyhiMjA1Nl9pbml0dGFiX3JhZGlvX3JldjExKTsKKwogI2RlZmluZSBSQURJT1JFR1MzKHIwMCwgcjAxLCByMDIsIHIwMywgcjA0LCByMDUsIHIwNiwgcjA3LCByMDgsIHIwOSwgXAogCQkgICByMTAsIHIxMSwgcjEyLCByMTMsIHIxNCwgcjE1LCByMTYsIHIxNywgcjE4LCByMTksIFwKIAkJICAgcjIwLCByMjEsIHIyMiwgcjIzLCByMjQsIHIyNSwgcjI2LCByMjcsIHIyOCwgcjI5LCBcCkBAIC0zMDQxLDcgKzMwODYsNyBAQAogCS5waHlfcmVncy5waHlfYnc2CT0gcjUKIAogLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9SYWRpby8yMDU2L0NoYW5uZWxUYWJsZSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgYjQzX25waHlfY2hhbm5lbHRhYl9yZXYzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyBiNDNfbnBoeV9jaGFubmVsdGFiX3BoeV9yZXYzW10gPSB7CiAgIHsJLmZyZXEJCQk9IDQ5MjAsCiAJUkFESU9SRUdTMygweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVjLCAweDA1LCAweDA1LCAweDA0LAogCQkgICAweDBjLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLApAQCAtNDAzNiw3ICs0MDgxLDcgQEAKICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzIGI0M19ucGh5X2NoYW5uZWx0YWJfcmV2NFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgYjQzX25waHlfY2hhbm5lbHRhYl9waHlfcmV2NFtdID0gewogICB7CS5mcmVxCQkJPSA0OTIwLAogCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwKIAkJICAgMHgwYywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwKQEAgLTUwMzEsNyArNTA3Niw3IEBACiAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyBiNDNfbnBoeV9jaGFubmVsdGFiX3JldjVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzIGI0M19ucGh5X2NoYW5uZWx0YWJfcmFkaW9fcmV2NVtdID0gewogICB7CS5mcmVxCQkJPSA0OTIwLAogCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwKIAkJICAgMHgwYywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwKQEAgLTYwMjYsNyArNjA3MSw3IEBACiAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyBiNDNfbnBoeV9jaGFubmVsdGFiX3JldjZbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzIGI0M19ucGh5X2NoYW5uZWx0YWJfcmFkaW9fcmV2NltdID0gewogICB7CS5mcmVxCQkJPSA0OTIwLAogCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwKIAkJICAgMHgwYywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwKQEAgLTcwMjEsNyArNzA2Niw3IEBACiAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyBiNDNfbnBoeV9jaGFubmVsdGFiX3JldjdfOVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXY3XzlbXSA9IHsKICAgewkuZnJlcQkJCT0gNDkyMCwKIAlSQURJT1JFR1MzKDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWMsIDB4MDUsIDB4MDUsIDB4MDQsCiAJCSAgIDB4MGMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsCkBAIC04MDE2LDcgKzgwNjEsNyBAQAogICB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgYjQzX25waHlfY2hhbm5lbHRhYl9yZXY4W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyBiNDNfbnBoeV9jaGFubmVsdGFiX3JhZGlvX3JldjhbXSA9IHsKICAgewkuZnJlcQkJCT0gNDkyMCwKIAlSQURJT1JFR1MzKDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWMsIDB4MDUsIDB4MDUsIDB4MDQsCiAJCSAgIDB4MGMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsCkBAIC05MDExLDYgKzkwNTYsMTE1NCBAQAogICB9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXYxMVtdID0geworCXsKKwkJLmZyZXEJCQk9IDQ5MjAsCisJCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdiNCwgMHgwN2IwLCAweDA3YWMsIDB4MDIxNCwgMHgwMjE1LCAweDAyMTYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNDkzMCwKKwkJUkFESU9SRUdTMygweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVkLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLCAweDAyMTQsIDB4MDIxNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA0OTQwLAorCQlSQURJT1JFR1MzKDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWUsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3YmMsIDB4MDdiOCwgMHgwN2I0LCAweDAyMTIsIDB4MDIxMywgMHgwMjE0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDQ5NTAsCisJCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdjMCwgMHgwN2JjLCAweDA3YjgsIDB4MDIxMSwgMHgwMjEyLCAweDAyMTMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNDk2MCwKKwkJUkFESU9SRUdTMygweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYwLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLCAweDAyMTEsIDB4MDIxMiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA0OTcwLAorCQlSQURJT1JFR1MzKDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3YzgsIDB4MDdjNCwgMHgwN2MwLCAweDAyMGUsIDB4MDIwZiwgMHgwMjExKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDQ5ODAsCisJCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdjYywgMHgwN2M4LCAweDA3YzQsIDB4MDIwZCwgMHgwMjBlLCAweDAyMGYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNDk5MCwKKwkJUkFESU9SRUdTMygweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYzLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLCAweDAyMGQsIDB4MDIwZSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MDAwLAorCQlSQURJT1JFR1MzKDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3ZDQsIDB4MDdkMCwgMHgwN2NjLCAweDAyMGIsIDB4MDIwYywgMHgwMjBkKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUwMTAsCisJCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdkOCwgMHgwN2Q0LCAweDA3ZDAsIDB4MDIwYSwgMHgwMjBiLCAweDAyMGMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTAyMCwKKwkJUkFESU9SRUdTMygweGY3LCAweDAxLCAweDAxLCAweDAxLCAweGY2LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LCAweDAyMGEsIDB4MDIwYiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MDMwLAorCQlSQURJT1JFR1MzKDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjcsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3ZTAsIDB4MDdkYywgMHgwN2Q4LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBhKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUwNDAsCisJCVJBRElPUkVHUzMoMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdlNCwgMHgwN2UwLCAweDA3ZGMsIDB4MDIwNywgMHgwMjA4LCAweDAyMDkpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTA1MCwKKwkJUkFESU9SRUdTMygweGVmLCAweDAxLCAweDAxLCAweDAxLCAweGY5LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LCAweDAyMDcsIDB4MDIwOCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MDYwLAorCQlSQURJT1JFR1MzKDB4ZTYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3ZWMsIDB4MDdlOCwgMHgwN2U0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUwNzAsCisJCVJBRElPUkVHUzMoMHhlNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdmMCwgMHgwN2VjLCAweDA3ZTgsIDB4MDIwNCwgMHgwMjA1LCAweDAyMDYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTA4MCwKKwkJUkFESU9SRUdTMygweGRlLCAweDAxLCAweDAxLCAweDAxLCAweGZjLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLCAweDAyMDQsIDB4MDIwNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MDkwLAorCQlSQURJT1JFR1MzKDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA3ZjgsIDB4MDdmNCwgMHgwN2YwLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUxMDAsCisJCVJBRElPUkVHUzMoMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZkLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDdmYywgMHgwN2Y4LCAweDA3ZjQsIDB4MDIwMSwgMHgwMjAyLCAweDAyMDMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTExMCwKKwkJUkFESU9SRUdTMygweGQ2LCAweDAxLCAweDAxLCAweDAxLCAweGZmLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLCAweDAyMDEsIDB4MDIwMiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MTIwLAorCQlSQURJT1JFR1MzKDB4Y2UsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4MDQsIDB4MDgwMCwgMHgwN2ZjLCAweDAxZmYsIDB4MDIwMCwgMHgwMjAxKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUxMzAsCisJCVJBRElPUkVHUzMoMHhjZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDgwOCwgMHgwODA0LCAweDA4MDAsIDB4MDFmZSwgMHgwMWZmLCAweDAyMDApLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTE0MCwKKwkJUkFESU9SRUdTMygweGM2LCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGZiLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLCAweDAxZmUsIDB4MDFmZiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MTYwLAorCQlSQURJT1JFR1MzKDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwZSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBlLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4MTQsIDB4MDgxMCwgMHgwODBjLCAweDAxZmIsIDB4MDFmYywgMHgwMWZkKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUxNzAsCisJCVJBRElPUkVHUzMoMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGZhLCAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDBlLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwgMHgwMWZiLCAweDAxZmMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTE4MCwKKwkJUkFESU9SRUdTMygweGI2LCAweDAxLCAweDAxLCAweDAyLCAweDA2LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGY5LCAweDAwLCAweDA2LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LCAweDAxZmEsIDB4MDFmYiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MTkwLAorCQlSQURJT1JFR1MzKDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDcsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLAorCQkJICAgMHhmZiwgMHhmOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBkLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4MjAsIDB4MDgxYywgMHgwODE4LCAweDAxZjgsIDB4MDFmOSwgMHgwMWZhKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUyMDAsCisJCVJBRElPUkVHUzMoMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsCisJCQkgICAweGZmLCAweGY5LCAweDAwLCAweDA1LCAweDAwLCAweDc3LCAweDAwLCAweDBkLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywgMHgwMWY4LCAweDAxZjkpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTIxMCwKKwkJUkFESU9SRUdTMygweGFmLCAweDAxLCAweDAxLCAweDAyLCAweDA5LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGY5LCAweDAwLCAweDA1LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LCAweDAxZjcsIDB4MDFmOCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MjIwLAorCQlSQURJT1JFR1MzKDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDhlLCAweDBmLCAweDAwLAorCQkJICAgMHhmZSwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBkLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4MmMsIDB4MDgyOCwgMHgwODI0LCAweDAxZjUsIDB4MDFmNiwgMHgwMWY3KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUyMzAsCisJCVJBRElPUkVHUzMoMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsCisJCQkgICAweGVlLCAweGQ4LCAweDAwLCAweDA1LCAweDAwLCAweDc3LCAweDAwLCAweDBkLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwgMHgwMWY1LCAweDAxZjYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTI0MCwKKwkJUkFESU9SRUdTMygweGEwLCAweDAxLCAweDAxLCAweDAyLCAweDBjLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwKKwkJCSAgIDB4ZWUsIDB4YzgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGM4LCAweDAwLCAweDA1LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLCAweDAxZjQsIDB4MDFmNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MjUwLAorCQlSQURJT1JFR1MzKDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDhlLCAweDBmLCAweDAwLAorCQkJICAgMHhlZCwgMHhjNywgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBkLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4MzgsIDB4MDgzNCwgMHgwODMwLCAweDAxZjIsIDB4MDFmMywgMHgwMWY0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUyNjAsCisJCVJBRElPUkVHUzMoMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGUsIDB4MDAsCisJCQkgICAweGVkLCAweGM3LCAweDAwLCAweDA0LCAweDAwLCAweDc3LCAweDAwLCAweDBkLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhjNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwgMHgwMWYyLCAweDAxZjMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTI3MCwKKwkJUkFESU9SRUdTMygweDk4LCAweDAxLCAweDAxLCAweDAyLCAweDBmLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4ZSwgMHgwZSwgMHgwMCwKKwkJCSAgIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGM3LCAweDAwLCAweDA0LCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLCAweDAxZjEsIDB4MDFmMiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MjgwLAorCQlSQURJT1JFR1MzKDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhkLCAweDBlLCAweDAwLAorCQkJICAgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBjLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4NDQsIDB4MDg0MCwgMHgwODNjLCAweDAxZjAsIDB4MDFmMCwgMHgwMWYxKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUyOTAsCisJCVJBRElPUkVHUzMoMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsCisJCQkgICAweGRjLCAweGI3LCAweDAwLCAweDAzLCAweDAwLCAweDc3LCAweDAwLCAweDBjLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwgMHgwMWYwLCAweDAxZjApLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTMwMCwKKwkJUkFESU9SRUdTMygweDhhLCAweDAxLCAweDAxLCAweDAyLCAweDEyLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwKKwkJCSAgIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGI3LCAweDAwLCAweDAzLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLCAweDAxZWYsIDB4MDFmMCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MzEwLAorCQlSQURJT1JFR1MzKDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhkLCAweDBlLCAweDAwLAorCQkJICAgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBjLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4NTAsIDB4MDg0YywgMHgwODQ4LCAweDAxZWQsIDB4MDFlZSwgMHgwMWVmKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUzMjAsCisJCVJBRElPUkVHUzMoMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsCisJCQkgICAweGRiLCAweGI3LCAweDAwLCAweDAzLCAweDAwLCAweDc3LCAweDAwLCAweDBjLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywgMHgwMWVkLCAweDAxZWUpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTMzMCwKKwkJUkFESU9SRUdTMygweDgzLCAweDAxLCAweDAxLCAweDAyLCAweDE1LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwKKwkJCSAgIDB4Y2IsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweGE2LCAweDAwLCAweDAzLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLCAweDAxZWMsIDB4MDFlZCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MzQwLAorCQlSQURJT1JFR1MzKDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTYsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhkLCAweDBkLCAweDAwLAorCQkJICAgMHhjYSwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBiLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4NWMsIDB4MDg1OCwgMHgwODU0LCAweDAxZWEsIDB4MDFlYiwgMHgwMWVjKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUzNTAsCisJCVJBRElPUkVHUzMoMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsCisJCQkgICAweGNhLCAweGE2LCAweDAwLCAweDAzLCAweDAwLCAweDc3LCAweDAwLCAweDBiLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwgMHgwMWVhLCAweDAxZWIpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTM2MCwKKwkJUkFESU9SRUdTMygweDc1LCAweDAxLCAweDAxLCAweDAyLCAweDE4LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwKKwkJCSAgIDB4YzksIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDk1LCAweDAwLCAweDAzLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LCAweDAxZTksIDB4MDFlYSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1MzcwLAorCQlSQURJT1JFR1MzKDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTksIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhjLCAweDBkLCAweDAwLAorCQkJICAgMHhjOSwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBhLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4NjgsIDB4MDg2NCwgMHgwODYwLCAweDAxZTcsIDB4MDFlOCwgMHgwMWU5KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDUzODAsCisJCVJBRElPUkVHUzMoMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsCisJCQkgICAweGI4LCAweDk1LCAweDAwLCAweDAzLCAweDAwLCAweDc3LCAweDAwLCAweDBhLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwgMHgwMWU3LCAweDAxZTgpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTM5MCwKKwkJUkFESU9SRUdTMygweDZlLCAweDAxLCAweDAxLCAweDAyLCAweDFiLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwKKwkJCSAgIDB4YjgsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDg0LCAweDAwLCAweDAzLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LCAweDAxZTYsIDB4MDFlNyksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NDAwLAorCQlSQURJT1JFR1MzKDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWMsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhjLCAweDBjLCAweDAwLAorCQkJICAgMHhiOCwgMHg4NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBhLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4NzQsIDB4MDg3MCwgMHgwODZjLCAweDAxZTUsIDB4MDFlNSwgMHgwMWU2KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU0MTAsCisJCVJBRElPUkVHUzMoMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsCisJCQkgICAweGI3LCAweDg0LCAweDAwLCAweDAyLCAweDAwLCAweDc3LCAweDAwLCAweDBhLAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTUpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTQyMCwKKwkJUkFESU9SRUdTMygweDYxLCAweDAxLCAweDAxLCAweDAyLCAweDFlLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwKKwkJCSAgIDB4YTcsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDg0LCAweDAwLCAweDAyLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLCAweDAxZTQsIDB4MDFlNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NDMwLAorCQlSQURJT1JFR1MzKDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDhjLCAweDBiLCAweDAwLAorCQkJICAgMHhhNiwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDBhLCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ODAsIDB4MDg3YywgMHgwODc4LCAweDAxZTIsIDB4MDFlMywgMHgwMWU0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU0NDAsCisJCVJBRElPUkVHUzMoMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsCisJCQkgICAweGE2LCAweDg0LCAweDAwLCAweDAyLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwgMHgwMWUyLCAweDAxZTMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTQ1MCwKKwkJUkFESU9SRUdTMygweDVhLCAweDAxLCAweDAxLCAweDAyLCAweDIxLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwKKwkJCSAgIDB4OTUsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDg0LCAweDAwLCAweDAxLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLCAweDAxZTEsIDB4MDFlMiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NDYwLAorCQlSQURJT1JFR1MzKDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjIsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDhiLCAweDBiLCAweDAwLAorCQkJICAgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4OGMsIDB4MDg4OCwgMHgwODg0LCAweDAxZGYsIDB4MDFlMCwgMHgwMWUxKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU0NzAsCisJCVJBRElPUkVHUzMoMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsCisJCQkgICAweDk0LCAweDczLCAweDAwLCAweDAxLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwgMHgwMWRmLCAweDAxZTApLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTQ4MCwKKwkJUkFESU9SRUdTMygweDRkLCAweDAxLCAweDAxLCAweDAyLCAweDI0LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwKKwkJCSAgIDB4ODQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLCAweDAxZGUsIDB4MDFkZiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NDkwLAorCQlSQURJT1JFR1MzKDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjUsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLAorCQkJICAgMHg4MywgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4OTgsIDB4MDg5NCwgMHgwODkwLCAweDAxZGQsIDB4MDFkZCwgMHgwMWRlKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU1MDAsCisJCVJBRElPUkVHUzMoMHg0NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsCisJCQkgICAweDgyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDg5YywgMHgwODk4LCAweDA4OTQsIDB4MDFkYywgMHgwMWRkLCAweDAxZGQpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTUxMCwKKwkJUkFESU9SRUdTMygweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI3LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwKKwkJCSAgIDB4ODIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGEwLCAweDA4OWMsIDB4MDg5OCwgMHgwMWRiLCAweDAxZGMsIDB4MDFkZCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NTIwLAorCQlSQURJT1JFR1MzKDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjgsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLAorCQkJICAgMHg3MiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4YTQsIDB4MDhhMCwgMHgwODljLCAweDAxZGEsIDB4MDFkYiwgMHgwMWRjKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU1MzAsCisJCVJBRElPUkVHUzMoMHg0MCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyOSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MDksIDB4MDAsCisJCQkgICAweDcyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhhOCwgMHgwOGE0LCAweDA4YTAsIDB4MDFkOSwgMHgwMWRhLCAweDAxZGIpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTU0MCwKKwkJUkFESU9SRUdTMygweDNhLCAweDAxLCAweDAxLCAweDAyLCAweDJhLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwOSwgMHgwMCwKKwkJCSAgIDB4NzEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGFjLCAweDA4YTgsIDB4MDhhNCwgMHgwMWQ4LCAweDAxZDksIDB4MDFkYSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NTUwLAorCQlSQURJT1JFR1MzKDB4M2EsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmIsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA5LCAweDAwLAorCQkJICAgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4YjAsIDB4MDhhYywgMHgwOGE4LCAweDAxZDcsIDB4MDFkOCwgMHgwMWQ5KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU1NjAsCisJCVJBRElPUkVHUzMoMHgzNCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDksIDB4MDAsCisJCQkgICAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhiNCwgMHgwOGIwLCAweDA4YWMsIDB4MDFkNywgMHgwMWQ3LCAweDAxZDgpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTU3MCwKKwkJUkFESU9SRUdTMygweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJkLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOSwgMHgwMCwKKwkJCSAgIDB4NjEsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGI4LCAweDA4YjQsIDB4MDhiMCwgMHgwMWQ2LCAweDAxZDcsIDB4MDFkNyksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NTgwLAorCQlSQURJT1JFR1MzKDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmUsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA4LCAweDAwLAorCQkJICAgMHg2MCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA4LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4YmMsIDB4MDhiOCwgMHgwOGI0LCAweDAxZDUsIDB4MDFkNiwgMHgwMWQ3KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU1OTAsCisJCVJBRElPUkVHUzMoMHgyZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDgsIDB4MDAsCisJCQkgICAweDUwLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA4LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhjMCwgMHgwOGJjLCAweDA4YjgsIDB4MDFkNCwgMHgwMWQ1LCAweDAxZDYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTYwMCwKKwkJUkFESU9SRUdTMygweDI4LCAweDAxLCAweDAxLCAweDAyLCAweDMwLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OSwgMHgwOCwgMHgwMCwKKwkJCSAgIDB4NTAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwOCwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGM0LCAweDA4YzAsIDB4MDhiYywgMHgwMWQzLCAweDAxZDQsIDB4MDFkNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NjEwLAorCQlSQURJT1JFR1MzKDB4MjgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg5LCAweDA4LCAweDAwLAorCQkJICAgMHg1MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA4LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4YzgsIDB4MDhjNCwgMHgwOGMwLCAweDAxZDIsIDB4MDFkMywgMHgwMWQ0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU2MjAsCisJCVJBRElPUkVHUzMoMHgyMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODksIDB4MDgsIDB4MDAsCisJCQkgICAweDUwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhjYywgMHgwOGM4LCAweDA4YzQsIDB4MDFkMiwgMHgwMWQyLCAweDAxZDMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTYzMCwKKwkJUkFESU9SRUdTMygweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMzLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwKKwkJCSAgIDB4NTAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDcsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNywgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGQwLCAweDA4Y2MsIDB4MDhjOCwgMHgwMWQxLCAweDAxZDIsIDB4MDFkMiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NjQwLAorCQlSQURJT1JFR1MzKDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLAorCQkJICAgMHg0MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNywKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ZDQsIDB4MDhkMCwgMHgwOGNjLCAweDAxZDAsIDB4MDFkMSwgMHgwMWQyKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU2NTAsCisJCVJBRElPUkVHUzMoMHgxYywgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsCisJCQkgICAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhkOCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDFjZiwgMHgwMWQwLCAweDAxZDEpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTY2MCwKKwkJUkFESU9SRUdTMygweDE2LCAweDAxLCAweDAxLCAweDAyLCAweDM2LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwKKwkJCSAgIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGRjLCAweDA4ZDgsIDB4MDhkNCwgMHgwMWNlLCAweDAxY2YsIDB4MDFkMCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NjcwLAorCQlSQURJT1JFR1MzKDB4MTYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzcsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLAorCQkJICAgMHg0MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKKwkJCSAgIDB4MDAsIDB4NmYsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA2LCAweDAwLCAweDZmLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ZTAsIDB4MDhkYywgMHgwOGQ4LCAweDAxY2UsIDB4MDFjZSwgMHgwMWNmKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU2ODAsCisJCVJBRElPUkVHUzMoMHgxMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzOCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsCisJCQkgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAorCQkJICAgMHgwMCwgMHg2ZiwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmYsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhlNCwgMHgwOGUwLCAweDA4ZGMsIDB4MDFjZCwgMHgwMWNlLCAweDAxY2UpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTY5MCwKKwkJUkFESU9SRUdTMygweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM5LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwKKwkJCSAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCisJCQkgICAweDAwLCAweDZmLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGU4LCAweDA4ZTQsIDB4MDhlMCwgMHgwMWNjLCAweDAxY2QsIDB4MDFjZSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NzAwLAorCQlSQURJT1JFR1MzKDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2EsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLAorCQkJICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKKwkJCSAgIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ZWMsIDB4MDhlOCwgMHgwOGU0LCAweDAxY2IsIDB4MDFjYywgMHgwMWNkKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3MTAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsCisJCQkgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAorCQkJICAgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhmMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDFjYSwgMHgwMWNiLCAweDAxY2MpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTcyMCwKKwkJUkFESU9SRUdTMygweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNjLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwKKwkJCSAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCisJCQkgICAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZSwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGY0LCAweDA4ZjAsIDB4MDhlYywgMHgwMWM5LCAweDAxY2EsIDB4MDFjYiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NzI1LAorCQlSQURJT1JFR1MzKDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4NzksIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDE1LCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLAorCQkJICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKKwkJCSAgIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ZjYsIDB4MDhmMiwgMHgwOGVlLCAweDAxYzksIDB4MDFjYSwgMHgwMWNiKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3MzAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsCisJCQkgICAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAorCQkJICAgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhmOCwgMHgwOGY0LCAweDA4ZjAsIDB4MDFjOSwgMHgwMWM5LCAweDAxY2EpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTczNSwKKwkJUkFESU9SRUdTMygweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDdiLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgxNSwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwKKwkJCSAgIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCisJCQkgICAweDAwLCAweDZkLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZCwgMHgwMCksCisJCVBIWVJFR1MoMHgwOGZhLCAweDA4ZjYsIDB4MDhmMiwgMHgwMWM4LCAweDAxYzksIDB4MDFjYSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NzQwLAorCQlSQURJT1JFR1MzKDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2UsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLAorCQkJICAgMHgyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKKwkJCSAgIDB4MDAsIDB4NmQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA2LCAweDAwLCAweDZkLCAweDAwKSwKKwkJUEhZUkVHUygweDA4ZmMsIDB4MDhmOCwgMHgwOGY0LCAweDAxYzgsIDB4MDFjOSwgMHgwMWM5KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3NDUsCisJCVJBRElPUkVHUzMoMHhmZSwgMHgwMCwgMHgwMiwgMHgwNCwgMHg3ZCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MTUsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsCisJCQkgICAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAorCQkJICAgMHgwMCwgMHg2ZCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmQsIDB4MDApLAorCQlQSFlSRUdTKDB4MDhmZSwgMHgwOGZhLCAweDA4ZjYsIDB4MDFjOCwgMHgwMWM4LCAweDAxYzkpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTc1MCwKKwkJUkFESU9SRUdTMygweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNmLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwKKwkJCSAgIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDZkLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2ZCwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NzU1LAorCQlSQURJT1JFR1MzKDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2YsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDE1LCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLAorCQkJICAgMHgxMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NmMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDZjLCAweDAwKSwKKwkJUEhZUkVHUygweDA5MDIsIDB4MDhmZSwgMHgwOGZhLCAweDAxYzcsIDB4MDFjOCwgMHgwMWM4KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3NjAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDUsIDB4MDAsCisJCQkgICAweDEwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAorCQkJICAgMHgwMCwgMHg2YywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmMsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkwNCwgMHgwOTAwLCAweDA4ZmMsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzgpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTc2NSwKKwkJUkFESU9SRUdTMygweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgxLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgxNSwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNSwgMHgwMCwKKwkJCSAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDZjLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YywgMHgwMCksCisJCVBIWVJFR1MoMHgwOTA2LCAweDA5MDIsIDB4MDhmZSwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1NzcwLAorCQlSQURJT1JFR1MzKDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA0LCAweDAwLAorCQkJICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwKSwKKwkJUEhZUkVHUygweDA5MDgsIDB4MDkwNCwgMHgwOTAwLCAweDAxYzYsIDB4MDFjNiwgMHgwMWM3KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3NzUsCisJCVJBRElPUkVHUzMoMHhmOCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4MywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MTUsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDQsIDB4MDAsCisJCQkgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAorCQkJICAgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkwYSwgMHgwOTA2LCAweDA5MDIsIDB4MDFjNSwgMHgwMWM2LCAweDAxYzcpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTc4MCwKKwkJUkFESU9SRUdTMygweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQyLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNCwgMHgwMCwKKwkJCSAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTBjLCAweDA5MDgsIDB4MDkwNCwgMHgwMWM1LCAweDAxYzYsIDB4MDFjNiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1Nzg1LAorCQlSQURJT1JFR1MzKDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODUsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDE1LCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLAorCQkJICAgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwKSwKKwkJUEhZUkVHUygweDA5MGUsIDB4MDkwYSwgMHgwOTA2LCAweDAxYzQsIDB4MDFjNSwgMHgwMWM2KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU3OTAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MywgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsCisJCQkgICAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAorCQkJICAgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkxMCwgMHgwOTBjLCAweDA5MDgsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTc5NSwKKwkJUkFESU9SRUdTMygweGYyLCAweDAwLCAweDAyLCAweDA0LCAweDg3LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgxNSwgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTEyLCAweDA5MGUsIDB4MDkwYSwgMHgwMWM0LCAweDAxYzQsIDB4MDFjNSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1ODAwLAorCQlSQURJT1JFR1MzKDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwKSwKKwkJUEhZUkVHUygweDA5MTQsIDB4MDkxMCwgMHgwOTBjLCAweDAxYzMsIDB4MDFjNCwgMHgwMWM1KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU4MDUsCisJCVJBRElPUkVHUzMoMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4OSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MTUsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAorCQkJICAgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkxNiwgMHgwOTEyLCAweDA5MGUsIDB4MDFjMywgMHgwMWM0LCAweDAxYzQpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTgxMCwKKwkJUkFESU9SRUdTMygweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ1LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YSwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTE4LCAweDA5MTQsIDB4MDkxMCwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1ODE1LAorCQlSQURJT1JFR1MzKDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4OGIsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDE1LCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwKSwKKwkJUEhZUkVHUygweDA5MWEsIDB4MDkxNiwgMHgwOTEyLCAweDAxYzIsIDB4MDFjMywgMHgwMWM0KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU4MjAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAorCQkJICAgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkxYywgMHgwOTE4LCAweDA5MTQsIDB4MDFjMiwgMHgwMWMyLCAweDAxYzMpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTgyNSwKKwkJUkFESU9SRUdTMygweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDhkLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgxNSwgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCisJCQkgICAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNSwgMHgwMCwgMHg2OSwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTFlLCAweDA5MWEsIDB4MDkxNiwgMHgwMWMxLCAweDAxYzIsIDB4MDFjMyksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1ODMwLAorCQlSQURJT1JFR1MzKDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDcsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKKwkJCSAgIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA1LCAweDAwLCAweDY5LCAweDAwKSwKKwkJUEhZUkVHUygweDA5MjAsIDB4MDkxYywgMHgwOTE4LCAweDAxYzEsIDB4MDFjMiwgMHgwMWMyKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU4NDAsCisJCVJBRElPUkVHUzMoMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0OCwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAorCQkJICAgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjksIDB4MDApLAorCQlQSFlSRUdTKDB4MDkyNCwgMHgwOTIwLCAweDA5MWMsIDB4MDFjMCwgMHgwMWMxLCAweDAxYzIpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTg1MCwKKwkJUkFESU9SRUdTMygweGUwLCAweDAwLCAweDAxLCAweDAyLCAweDQ5LCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCisJCQkgICAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OSwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTI4LCAweDA5MjQsIDB4MDkyMCwgMHgwMWJmLCAweDAxYzAsIDB4MDFjMSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1ODYwLAorCQlSQURJT1JFR1MzKDB4ZGUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGEsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKKwkJCSAgIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA0LCAweDAwLCAweDY5LCAweDAwKSwKKwkJUEhZUkVHUygweDA5MmMsIDB4MDkyOCwgMHgwOTI0LCAweDAxYmYsIDB4MDFiZiwgMHgwMWMwKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU4NzAsCisJCVJBRElPUkVHUzMoMHhkYiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YiwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAorCQkJICAgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkzMCwgMHgwOTJjLCAweDA5MjgsIDB4MDFiZSwgMHgwMWJmLCAweDAxYmYpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTg4MCwKKwkJUkFESU9SRUdTMygweGQ4LCAweDAwLCAweDAxLCAweDAyLCAweDRjLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCisJCQkgICAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTM0LCAweDA5MzAsIDB4MDkyYywgMHgwMWJkLCAweDAxYmUsIDB4MDFiZiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSA1ODkwLAorCQlSQURJT1JFR1MzKDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGQsIDB4MDUsIDB4MDUsIDB4MDIsCisJCQkgICAweDBjLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKKwkJCSAgIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCisJCQkgICAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwKSwKKwkJUEhZUkVHUygweDA5MzgsIDB4MDkzNCwgMHgwOTMwLCAweDAxYmMsIDB4MDFiZCwgMHgwMWJlKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDU5MDAsCisJCVJBRElPUkVHUzMoMHhkMywgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZSwgMHgwNSwgMHgwNSwgMHgwMiwKKwkJCSAgIDB4MGMsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAorCQkJICAgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKKwkJCSAgIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDApLAorCQlQSFlSRUdTKDB4MDkzYywgMHgwOTM4LCAweDA5MzQsIDB4MDFiYywgMHgwMWJjLCAweDAxYmQpLAorCX0sCisJeworCQkuZnJlcQkJCT0gNTkxMCwKKwkJUkFESU9SRUdTMygweGQ2LCAweDAwLCAweDAxLCAweDAyLCAweDRmLCAweDA1LCAweDA1LCAweDAyLAorCQkJICAgMHgwYywgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCisJCQkgICAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAorCQkJICAgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCksCisJCVBIWVJFR1MoMHgwOTQwLCAweDA5M2MsIDB4MDkzOCwgMHgwMWJiLCAweDAxYmMsIDB4MDFiYyksCisJfSwKKwl7CisJCS5mcmVxCQkJPSAyNDEyLAorCQlSQURJT1JFR1MzKDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NmMsIDB4MDYsIDB4MDYsIDB4MDQsCisJCQkgICAweDJiLCAweDAxLCAweDA0LCAweDA0LCAweDA0LCAweDhmLCAweDMwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHg3OCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKKwkJCSAgIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDMsIDB4MDAsCisJCQkgICAweDcwLCAweDAwLCAweDBiLCAweDAwLCAweDBhKSwKKwkJUEhZUkVHUygweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDI0MTcsCisJCVJBRElPUkVHUzMoMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3MSwgMHgwNiwgMHgwNiwgMHgwNCwKKwkJCSAgIDB4MmIsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDc4LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAorCQkJICAgMHgwYiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMywgMHgwMCwKKwkJCSAgIDB4NzAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4MGEpLAorCQlQSFlSRUdTKDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwgMHgwNDNkLCAweDA0NDEpLAorCX0sCisJeworCQkuZnJlcQkJCT0gMjQyMiwKKwkJUkFESU9SRUdTMygweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDc2LCAweDA2LCAweDA2LCAweDA0LAorCQkJICAgMHgyYiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4NjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCisJCQkgICAweDBiLCAweDAwLCAweDBhLCAweDAwLCAweDg5LCAweDAwLCAweDAzLCAweDAwLAorCQkJICAgMHg3MCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwYSksCisJCVBIWVJFR1MoMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LCAweDA0M2EsIDB4MDQzZiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSAyNDI3LAorCQlSQURJT1JFR1MzKDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4N2IsIDB4MDYsIDB4MDYsIDB4MDQsCisJCQkgICAweDJiLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHg1NywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKKwkJCSAgIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsCisJCQkgICAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhKSwKKwkJUEhZUkVHUygweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDI0MzIsCisJCVJBRElPUkVHUzMoMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4MCwgMHgwNiwgMHgwNiwgMHgwNCwKKwkJCSAgIDB4MmIsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDU2LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAorCQkJICAgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwMywgMHgwMCwKKwkJCSAgIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGEpLAorCQlQSFlSRUdTKDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwgMHgwNDM2LCAweDA0M2EpLAorCX0sCisJeworCQkuZnJlcQkJCT0gMjQzNywKKwkJUkFESU9SRUdTMygweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDg1LCAweDA2LCAweDA2LCAweDA0LAorCQkJICAgMHgyYiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4NDYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCisJCQkgICAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDc2LCAweDAwLCAweDAzLCAweDAwLAorCQkJICAgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwYSksCisJCVBIWVJFR1MoMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLCAweDA0MzQsIDB4MDQzOCksCisJfSwKKwl7CisJCS5mcmVxCQkJPSAyNDQyLAorCQlSQURJT1JFR1MzKDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGEsIDB4MDYsIDB4MDYsIDB4MDQsCisJCQkgICAweDJiLCAweDAxLCAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHg0NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKKwkJCSAgIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDIsIDB4MDAsCisJCQkgICAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhKSwKKwkJUEhZUkVHUygweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDI0NDcsCisJCVJBRElPUkVHUzMoMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4ZiwgMHgwNiwgMHgwNiwgMHgwNCwKKwkJCSAgIDB4MmIsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAorCQkJICAgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkJCSAgIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDkpLAorCQlQSFlSRUdTKDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwgMHgwNDJmLCAweDA0MzQpLAorCX0sCisJeworCQkuZnJlcQkJCT0gMjQ1MiwKKwkJUkFESU9SRUdTMygweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk0LCAweDA2LCAweDA2LCAweDA0LAorCQkJICAgMHgyYiwgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCisJCQkgICAweDBhLCAweDAwLCAweDA5LCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLAorCQkJICAgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSksCisJCVBIWVJFR1MoMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LCAweDA0MmQsIDB4MDQzMSksCisJfSwKKwl7CisJCS5mcmVxCQkJPSAyNDU3LAorCQlSQURJT1JFR1MzKDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OTksIDB4MDYsIDB4MDYsIDB4MDQsCisJCQkgICAweDJiLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKKwkJCSAgIDB4MGEsIDB4MDAsIDB4MDksIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDIsIDB4MDAsCisJCQkgICAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDA5KSwKKwkJUEhZUkVHUygweDAzZGIsIDB4MDNkNywgMHgwM2QzLCAweDA0MjcsIDB4MDQyYiwgMHgwNDJmKSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDI0NjIsCisJCVJBRElPUkVHUzMoMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5ZSwgMHgwNiwgMHgwNiwgMHgwNCwKKwkJCSAgIDB4MmIsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAorCQkJICAgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgzMywgMHgwMCwgMHgwMiwgMHgwMCwKKwkJCSAgIDB4NzAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDkpLAorCQlQSFlSRUdTKDB4MDNkZCwgMHgwM2Q5LCAweDAzZDUsIDB4MDQyNCwgMHgwNDI5LCAweDA0MmQpLAorCX0sCisJeworCQkuZnJlcQkJCT0gMjQ2NywKKwkJUkFESU9SRUdTMygweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGEzLCAweDA2LCAweDA2LCAweDA0LAorCQkJICAgMHgyYiwgMHgwMSwgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwKKwkJCSAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCisJCQkgICAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDIyLCAweDAwLCAweDAyLCAweDAwLAorCQkJICAgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSksCisJCVBIWVJFR1MoMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLCAweDA0MjcsIDB4MDQyYiksCisJfSwKKwl7CisJCS5mcmVxCQkJPSAyNDcyLAorCQlSQURJT1JFR1MzKDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4YTgsIDB4MDYsIDB4MDYsIDB4MDQsCisJCQkgICAweDJiLCAweDAxLCAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDMwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKKwkJCSAgIDB4MDksIDB4MDAsIDB4MDksIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsCisJCQkgICAweDcwLCAweDAwLCAweDA5LCAweDAwLCAweDA5KSwKKwkJUEhZUkVHUygweDAzZTEsIDB4MDNkZCwgMHgwM2Q5LCAweDA0MjAsIDB4MDQyNCwgMHgwNDI5KSwKKwl9LAorCXsKKwkJLmZyZXEJCQk9IDI0ODQsCisJCVJBRElPUkVHUzMoMHhmZiwgMHgwMSwgMHgwMywgMHgwOSwgMHhiNCwgMHgwNiwgMHgwNiwgMHgwNCwKKwkJCSAgIDB4MmIsIDB4MDEsIDB4MDcsIDB4MDcsIDB4MDcsIDB4OGYsIDB4MjAsIDB4MDAsCisJCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAorCQkJICAgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkJCSAgIDB4NzAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDkpLAorCQlQSFlSRUdTKDB4MDNlNiwgMHgwM2UyLCAweDAzZGUsIDB4MDQxYiwgMHgwNDFmLCAweDA0MjQpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJzX3B0cworKmI0M19ucGh5X2dldF9pbml0dGFic19yZXYzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJc3dpdGNoIChkZXYtPnBoeS5yZXYpIHsKKwljYXNlIDM6CisJCXJldHVybiAmYjIwNTZfaW5pdHRhYl9waHlfcmV2MzsKKwljYXNlIDQ6CisJCXJldHVybiAmYjIwNTZfaW5pdHRhYl9waHlfcmV2NDsKKwlkZWZhdWx0OgorCQlzd2l0Y2ggKHBoeS0+cmFkaW9fcmV2KSB7CisJCWNhc2UgNToKKwkJCXJldHVybiAmYjIwNTZfaW5pdHRhYl9yYWRpb19yZXY1OworCQljYXNlIDY6CisJCQlyZXR1cm4gJmIyMDU2X2luaXR0YWJfcmFkaW9fcmV2NjsKKwkJY2FzZSA3OgorCQljYXNlIDk6CisJCQlyZXR1cm4gJmIyMDU2X2luaXR0YWJfcmFkaW9fcmV2N185OworCQljYXNlIDg6CisJCQlyZXR1cm4gJmIyMDU2X2luaXR0YWJfcmFkaW9fcmV2ODsKKwkJY2FzZSAxMToKKwkJCXJldHVybiAmYjIwNTZfaW5pdHRhYl9yYWRpb19yZXYxMTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgdm9pZCBiMjA1Nl91cGxvYWRfaW5pdHRhYihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZ2h6NSwKIAkJCQkgYm9vbCBpZ25vcmVfdXBsb2FkZmxhZywgdTE2IHJvdXRpbmcsCiAJCQkJIGNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5ICplLApAQCAtOTAzNywxMSArMTAyMzAsMTEgQEAKIHsKIAljb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYnNfcHRzICpwdHM7CiAKLQlpZiAoZGV2LT5waHkucmV2ID49IEFSUkFZX1NJWkUoYjIwNTZfaW5pdHRhYnMpKSB7CisJcHRzID0gYjQzX25waHlfZ2V0X2luaXR0YWJzX3JldjMoZGV2KTsKKwlpZiAoIXB0cykgewogCQlCNDNfV0FSTl9PTigxKTsKIAkJcmV0dXJuOwogCX0KLQlwdHMgPSAmYjIwNTZfaW5pdHRhYnNbZGV2LT5waHkucmV2XTsKIAogCWIyMDU2X3VwbG9hZF9pbml0dGFiKGRldiwgZ2h6NSwgaWdub3JlX3VwbG9hZGZsYWcsCiAJCQkJQjIwNTZfU1lOLCBwdHMtPnN5biwgcHRzLT5zeW5fbGVuZ3RoKTsKQEAgLTkwNjAsMTEgKzEwMjUzLDEyIEBACiAJY29uc3Qgc3RydWN0IGIyMDU2X2luaXR0YWJzX3B0cyAqcHRzOwogCWNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5ICplOwogCi0JaWYgKGRldi0+cGh5LnJldiA+PSBBUlJBWV9TSVpFKGIyMDU2X2luaXR0YWJzKSkgeworCXB0cyA9IGI0M19ucGh5X2dldF9pbml0dGFic19yZXYzKGRldik7CisJaWYgKCFwdHMpIHsKIAkJQjQzX1dBUk5fT04oMSk7CiAJCXJldHVybjsKIAl9Ci0JcHRzID0gJmIyMDU2X2luaXR0YWJzW2Rldi0+cGh5LnJldl07CisKIAllID0gJnB0cy0+c3luW0IyMDU2X1NZTl9QTExfQ1AyXTsKIAogCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfQ1AyLCBnaHo1ID8gZS0+Z2h6NSA6IGUtPmdoejIpOwpAQCAtOTA3MywzOCArMTAyNjcsNDYgQEAKIGNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgKgogYjQzX25waHlfZ2V0X2NoYW50YWJlbnRfcmV2MyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBmcmVxKQogeworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyAqZTsKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpOwogCi0Jc3dpdGNoIChkZXYtPnBoeS5yZXYpIHsKKwlzd2l0Y2ggKHBoeS0+cmV2KSB7CiAJY2FzZSAzOgotCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yZXYzOwotCQlsZW5ndGggPSBBUlJBWV9TSVpFKGI0M19ucGh5X2NoYW5uZWx0YWJfcmV2Myk7CisJCWUgPSBiNDNfbnBoeV9jaGFubmVsdGFiX3BoeV9yZXYzOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGI0M19ucGh5X2NoYW5uZWx0YWJfcGh5X3JldjMpOwogCQlicmVhazsKIAljYXNlIDQ6Ci0JCWUgPSBiNDNfbnBoeV9jaGFubmVsdGFiX3JldjQ7Ci0JCWxlbmd0aCA9IEFSUkFZX1NJWkUoYjQzX25waHlfY2hhbm5lbHRhYl9yZXY0KTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yZXY1OwotCQlsZW5ndGggPSBBUlJBWV9TSVpFKGI0M19ucGh5X2NoYW5uZWx0YWJfcmV2NSk7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJZSA9IGI0M19ucGh5X2NoYW5uZWx0YWJfcmV2NjsKLQkJbGVuZ3RoID0gQVJSQVlfU0laRShiNDNfbnBoeV9jaGFubmVsdGFiX3JldjYpOwotCQlicmVhazsKLQljYXNlIDc6Ci0JY2FzZSA5OgotCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yZXY3Xzk7Ci0JCWxlbmd0aCA9IEFSUkFZX1NJWkUoYjQzX25waHlfY2hhbm5lbHRhYl9yZXY3XzkpOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCWUgPSBiNDNfbnBoeV9jaGFubmVsdGFiX3Jldjg7Ci0JCWxlbmd0aCA9IEFSUkFZX1NJWkUoYjQzX25waHlfY2hhbm5lbHRhYl9yZXY4KTsKKwkJZSA9IGI0M19ucGh5X2NoYW5uZWx0YWJfcGh5X3JldjQ7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoYjQzX25waHlfY2hhbm5lbHRhYl9waHlfcmV2NCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCQlyZXR1cm4gTlVMTDsKKwkJc3dpdGNoIChwaHktPnJhZGlvX3JldikgeworCQljYXNlIDU6CisJCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXY1OworCQkJbGVuZ3RoID0gQVJSQVlfU0laRShiNDNfbnBoeV9jaGFubmVsdGFiX3JhZGlvX3JldjUpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWUgPSBiNDNfbnBoeV9jaGFubmVsdGFiX3JhZGlvX3JldjY7CisJCQlsZW5ndGggPSBBUlJBWV9TSVpFKGI0M19ucGh5X2NoYW5uZWx0YWJfcmFkaW9fcmV2Nik7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQljYXNlIDk6CisJCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXY3Xzk7CisJCQlsZW5ndGggPSBBUlJBWV9TSVpFKGI0M19ucGh5X2NoYW5uZWx0YWJfcmFkaW9fcmV2N185KTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXY4OworCQkJbGVuZ3RoID0gQVJSQVlfU0laRShiNDNfbnBoeV9jaGFubmVsdGFiX3JhZGlvX3JldjgpOworCQkJYnJlYWs7CisJCWNhc2UgMTE6CisJCQllID0gYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXYxMTsKKwkJCWxlbmd0aCA9IEFSUkFZX1NJWkUoYjQzX25waHlfY2hhbm5lbHRhYl9yYWRpb19yZXYxMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUI0M19XQVJOX09OKDEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyssIGUrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYwppbmRleCA5NGM3NTVmLi40MDQ3YzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYwpAQCAtMTYyNyw3NCArMTYyNyw3IEBACiAJMHhmYTU4ZmMwMCwgMHgwYjY0ZmM3ZSwgMHgwODAwZjdiNiwgMHgwMGYwMDZiZSwKIH07CiAKLXN0YXRpYyBjb25zdCB1MzIgYjQzX250YWJfbm9pc2V2YXIwX3IzW10gPSB7Ci0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYjQzX250YWJfbm9pc2V2YXIxX3IzW10gPSB7CitzdGF0aWMgY29uc3QgdTMyIGI0M19udGFiX25vaXNldmFyX3IzW10gPSB7CiAJMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwgMHgwMjExMDIxMSwgMHgwMDAwMDE0ZCwKIAkweDAyMTEwMjExLCAweDAwMDAwMTRkLCAweDAyMTEwMjExLCAweDAwMDAwMTRkLAogCTB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsIDB4MDIxMTAyMTEsIDB4MDAwMDAxNGQsCkBAIC0zMTA5LDMxICszMDQyLDMyIEBACiAJCWFudHN3bHV0ID0gc3Byb20tPmZlbS5naHoyLmFudHN3bHV0OwogCiAJLyogU3RhdGljIHRhYmxlcyAqLwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVTVFJVQ1RfUjMsIGI0M19udGFiX2ZyYW1lc3RydWN0X3IzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1BJTE9UX1IzLCBiNDNfbnRhYl9waWxvdF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UTUFQX1IzLCBiNDNfbnRhYl90bWFwX3IzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0lOVExFVkVMX1IzLCBiNDNfbnRhYl9pbnRsZXZlbF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9URFRSTl9SMywgYjQzX250YWJfdGR0cm5fcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTk9JU0VWQVIwX1IzLCBiNDNfbnRhYl9ub2lzZXZhcjBfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTk9JU0VWQVIxX1IzLCBiNDNfbnRhYl9ub2lzZXZhcjFfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTUNTX1IzLCBiNDNfbnRhYl9tY3NfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJMjBBMF9SMywgYjQzX250YWJfdGRpMjBhMF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UREkyMEExX1IzLCBiNDNfbnRhYl90ZGkyMGExX3IzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTQwQTBfUjMsIGI0M19udGFiX3RkaTQwYTBfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMV9SMywgYjQzX250YWJfdGRpNDBhMV9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9QSUxPVExUX1IzLCBiNDNfbnRhYl9waWxvdGx0X3IzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0NIQU5FU1RfUjMsIGI0M19udGFiX2NoYW5uZWxlc3RfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVMVF9SMywgYjQzX250YWJfZnJhbWVsb29rdXBfcjMpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfRVNUUExUX1IzLCBiNDNfbnRhYl9lc3RpbWF0ZXBvd2VybHQwX3IzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MxX0VTVFBMVF9SMywgYjQzX250YWJfZXN0aW1hdGVwb3dlcmx0MV9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9BREpQTFRfUjMsIGI0M19udGFiX2FkanVzdHBvd2VyMF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9BREpQTFRfUjMsIGI0M19udGFiX2FkanVzdHBvd2VyMV9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9HQUlOQ1RMX1IzLCBiNDNfbnRhYl9nYWluY3RsMF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9HQUlOQ1RMX1IzLCBiNDNfbnRhYl9nYWluY3RsMV9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9JUUxUX1IzLCBiNDNfbnRhYl9pcWx0MF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9JUUxUX1IzLCBiNDNfbnRhYl9pcWx0MV9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9MT0ZFRURUSF9SMywgYjQzX250YWJfbG9mdGx0MF9yMyk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9MT0ZFRURUSF9SMywgYjQzX250YWJfbG9mdGx0MV9yMyk7CisJaWYgKGRldi0+cGh5LmRvX2Z1bGxfaW5pdCkgeworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0ZSQU1FU1RSVUNUX1IzLCBiNDNfbnRhYl9mcmFtZXN0cnVjdF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfUElMT1RfUjMsIGI0M19udGFiX3BpbG90X3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UTUFQX1IzLCBiNDNfbnRhYl90bWFwX3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9JTlRMRVZFTF9SMywgYjQzX250YWJfaW50bGV2ZWxfcjMpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1REVFJOX1IzLCBiNDNfbnRhYl90ZHRybl9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTk9JU0VWQVJfUjMsIGI0M19udGFiX25vaXNldmFyX3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9NQ1NfUjMsIGI0M19udGFiX21jc19yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJMjBBMF9SMywgYjQzX250YWJfdGRpMjBhMF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJMjBBMV9SMywgYjQzX250YWJfdGRpMjBhMV9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMF9SMywgYjQzX250YWJfdGRpNDBhMF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMV9SMywgYjQzX250YWJfdGRpNDBhMV9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfUElMT1RMVF9SMywgYjQzX250YWJfcGlsb3RsdF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQ0hBTkVTVF9SMywgYjQzX250YWJfY2hhbm5lbGVzdF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVMVF9SMywgYjQzX250YWJfZnJhbWVsb29rdXBfcjMpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MwX0VTVFBMVF9SMywgYjQzX250YWJfZXN0aW1hdGVwb3dlcmx0MF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfRVNUUExUX1IzLCBiNDNfbnRhYl9lc3RpbWF0ZXBvd2VybHQxX3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9BREpQTFRfUjMsIGI0M19udGFiX2FkanVzdHBvd2VyMF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfQURKUExUX1IzLCBiNDNfbnRhYl9hZGp1c3Rwb3dlcjFfcjMpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MwX0dBSU5DVExfUjMsIGI0M19udGFiX2dhaW5jdGwwX3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9HQUlOQ1RMX1IzLCBiNDNfbnRhYl9nYWluY3RsMV9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfSVFMVF9SMywgYjQzX250YWJfaXFsdDBfcjMpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MxX0lRTFRfUjMsIGI0M19udGFiX2lxbHQxX3IzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9MT0ZFRURUSF9SMywgYjQzX250YWJfbG9mdGx0MF9yMyk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfTE9GRUVEVEhfUjMsIGI0M19udGFiX2xvZnRsdDFfcjMpOworCX0KIAogCS8qIFZvbGF0aWxlIHRhYmxlcyAqLwogCWlmIChhbnRzd2x1dCA8IEFSUkFZX1NJWkUoYjQzX250YWJfYW50c3djdGxfcjMpKQpAQCAtMzE0NiwyMCArMzA4MCwyMiBAQAogc3RhdGljIHZvaWQgYjQzX25waHlfdGFibGVzX2luaXRfcmV2MChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJLyogU3RhdGljIHRhYmxlcyAqLwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVTVFJVQ1QsIGI0M19udGFiX2ZyYW1lc3RydWN0KTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0ZSQU1FTFQsIGI0M19udGFiX2ZyYW1lbG9va3VwKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RNQVAsIGI0M19udGFiX3RtYXApOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERUUk4sIGI0M19udGFiX3RkdHJuKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0lOVExFVkVMLCBiNDNfbnRhYl9pbnRsZXZlbCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9QSUxPVCwgYjQzX250YWJfcGlsb3QpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJMjBBMCwgYjQzX250YWJfdGRpMjBhMCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UREkyMEExLCBiNDNfbnRhYl90ZGkyMGExKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTQwQTAsIGI0M19udGFiX3RkaTQwYTApOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMSwgYjQzX250YWJfdGRpNDBhMSk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DSEFORVNULCBiNDNfbnRhYl9jaGFubmVsZXN0KTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX01DUywgYjQzX250YWJfbWNzKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX05PSVNFVkFSMTAsIGI0M19udGFiX25vaXNldmFyMTApOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTk9JU0VWQVIxMSwgYjQzX250YWJfbm9pc2V2YXIxMSk7CisJaWYgKGRldi0+cGh5LmRvX2Z1bGxfaW5pdCkgeworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0ZSQU1FU1RSVUNULCBiNDNfbnRhYl9mcmFtZXN0cnVjdCk7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVMVCwgYjQzX250YWJfZnJhbWVsb29rdXApOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RNQVAsIGI0M19udGFiX3RtYXApOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1REVFJOLCBiNDNfbnRhYl90ZHRybik7CisJCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfSU5UTEVWRUwsIGI0M19udGFiX2ludGxldmVsKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9QSUxPVCwgYjQzX250YWJfcGlsb3QpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTIwQTAsIGI0M19udGFiX3RkaTIwYTApOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTIwQTEsIGI0M19udGFiX3RkaTIwYTEpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTQwQTAsIGI0M19udGFiX3RkaTQwYTApOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTQwQTEsIGI0M19udGFiX3RkaTQwYTEpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0NIQU5FU1QsIGI0M19udGFiX2NoYW5uZWxlc3QpOworCQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX01DUywgYjQzX250YWJfbWNzKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9OT0lTRVZBUjEwLCBiNDNfbnRhYl9ub2lzZXZhcjEwKTsKKwkJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9OT0lTRVZBUjExLCBiNDNfbnRhYl9ub2lzZXZhcjExKTsKKwl9CiAKIAkvKiBWb2xhdGlsZSB0YWJsZXMgKi8KIAludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0JESSwgYjQzX250YWJfYmRpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmgKaW5kZXggOWZmMzNhZC4uM2E1OGFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmgKQEAgLTE0Myw4ICsxNDMsNyBAQAogI2RlZmluZSBCNDNfTlRBQl9UTUFQX1IzCQlCNDNfTlRBQjMyKDEyLCAgIDApIC8qIFRNIEFQICAqLwogI2RlZmluZSBCNDNfTlRBQl9JTlRMRVZFTF9SMwkJQjQzX05UQUIzMigxMywgICAwKSAvKiBJTlQgTFYgICovCiAjZGVmaW5lIEI0M19OVEFCX1REVFJOX1IzCQlCNDNfTlRBQjMyKDE0LCAgIDApIC8qIFREIFRSTiAgKi8KLSNkZWZpbmUgQjQzX05UQUJfTk9JU0VWQVIwX1IzCQlCNDNfTlRBQjMyKDE2LCAgIDApIC8qIG5vaXNlIHZhcmlhbmNlIDAgICovCi0jZGVmaW5lIEI0M19OVEFCX05PSVNFVkFSMV9SMwkJQjQzX05UQUIzMigxNiwgMTI4KSAvKiBub2lzZSB2YXJpYW5jZSAxICAqLworI2RlZmluZSBCNDNfTlRBQl9OT0lTRVZBUl9SMwkJQjQzX05UQUIzMigxNiwgICAwKSAvKiBub2lzZSB2YXJpYW5jZSAqLwogI2RlZmluZSBCNDNfTlRBQl9NQ1NfUjMJCQlCNDNfTlRBQjE2KDE4LCAgIDApIC8qIE1DUyAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJMjBBMF9SMwkJQjQzX05UQUIzMigxOSwgMTI4KSAvKiBUREkgMjAvMCAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJMjBBMV9SMwkJQjQzX05UQUIzMigxOSwgMjU2KSAvKiBUREkgMjAvMSAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My93YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKaW5kZXggOWIxYTAzOC4uYzIxOGMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzdGF0aWMgdm9pZCBiNDNfd2FfdHJfbHRvdihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpIC8qIFRSIExvb2t1cCBUYWJsZSBPcmlnaW5hbCBWYWx1ZXMgKi8KIHsKLQliNDNfZ3RhYl93cml0ZShkZXYsIEI0M19HVEFCX09SSUdUUiwgMCwgMHhDNDgwKTsKKwliNDNfZ3RhYl93cml0ZShkZXYsIEI0M19HVEFCX09SSUdUUiwgMCwgMHg3NjU0KTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX3dhX2NwbGxfbm9ucGlsb3Qoc3RydWN0IGI0M193bGRldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMKaW5kZXggMzFhZGI4Yy4uNGYzOGYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5jCkBAIC00MDgsNyArNDA4LDcgQEAKIAkJbWFjX2N0bCB8PSBCNDNfVFhIX01BQ19IV1NFUTsKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UKQogCQltYWNfY3RsIHw9IEI0M19UWEhfTUFDX1NUTVNEVTsKLQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0EpCisJaWYgKCFwaHktPmdtb2RlKQogCQltYWNfY3RsIHw9IEI0M19UWEhfTUFDXzVHSFo7CiAKIAkvKiBPdmVyd3JpdGUgcmF0ZXNbMF0uY291bnQgdG8gbWFrZSB0aGUgcmV0cnkgY2FsY3VsYXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9NYWtlZmlsZQppbmRleCAxZDJjZWFjLi45OGU2N2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL01ha2VmaWxlCkBAIC0zMyw3ICszMyw3IEBACiAJCWJjZGMubyBcCiAJCWRoZF9jb21tb24ubyBcCiAJCWRoZF9saW51eC5vIFwKLQkJbnZyYW0ubyBcCisJCWZpcm13YXJlLm8gXAogCQlidGNvZXgubwogYnJjbWZtYWMtJChDT05GSUdfQlJDTUZNQUNfU0RJTykgKz0gXAogCQlkaGRfc2Rpby5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaAppbmRleCA5MzlkNmIxLi4xNmY5YWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCkBAIC0xODYsNyArMTg2LDcgQEAKIHZvaWQgYnJjbWZfdHhmbG93YmxvY2tfaWYoc3RydWN0IGJyY21mX2lmICppZnAsCiAJCQkgIGVudW0gYnJjbWZfbmV0aWZfc3RvcF9yZWFzb24gcmVhc29uLCBib29sIHN0YXRlKTsKIHUzMiBicmNtZl9nZXRfY2hpcF9pbmZvKHN0cnVjdCBicmNtZl9pZiAqaWZwKTsKLXZvaWQgYnJjbWZfdHhmaW5hbGl6ZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwLAordm9pZCBicmNtZl90eGZpbmFsaXplKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBza19idWZmICp0eHAsIHU4IGlmaWR4LAogCQkgICAgICBib29sIHN1Y2Nlc3MpOwogCiAvKiBTZXRzIGRvbmdsZSBtZWRpYSBpbmZvIChkcnZfdmVyc2lvbiwgbWFjIGFkZHJlc3MpLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKaW5kZXggYzQ1MzU2MS4uNzczNTMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCkBAIC02Myw3ICs2Myw2IEBACiAgKi8KIHN0cnVjdCBicmNtZl9idXNfb3BzIHsKIAlpbnQgKCpwcmVpbml0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqdHhkYXRhKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCWludCAoKnR4Y3RsKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBsZW4pOwpAQCAtOTksNiArOTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgdHhfcmVhbGxvYzsKIAl1MzIgY2hpcDsKIAl1MzIgY2hpcHJldjsKKwlib29sIGFsd2F5c191c2VfZndzX3F1ZXVlOwogCiAJc3RydWN0IGJyY21mX2J1c19vcHMgKm9wczsKIH07CkBAIC0xMTMsMTEgKzExMyw2IEBACiAJcmV0dXJuIGJ1cy0+b3BzLT5wcmVpbml0KGJ1cy0+ZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYnJjbWZfYnVzX2luaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCXJldHVybiBidXMtPm9wcy0+aW5pdChidXMtPmRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBicmNtZl9idXNfc3RvcChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCiB7CiAJYnVzLT5vcHMtPnN0b3AoYnVzLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKaW5kZXggNmE4OTgzYS4uZWQzZTMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jCkBAIC0zMiw2ICszMiw5IEBACiAjZGVmaW5lIEJSQ01GX0RFRkFVTFRfU0NBTl9VTkFTU09DX1RJTUUJNDAKICNkZWZpbmUgQlJDTUZfREVGQVVMVF9QQUNLRVRfRklMVEVSCSIxMDAgMCAwIDAgMHgwMSAweDAwIgogCisvKiBib29zdCB2YWx1ZSBmb3IgUlNTSV9ERUxUQSBpbiBwcmVmZXJyZWQgam9pbiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgQlJDTUZfSk9JTl9QUkVGX1JTU0lfQk9PU1QJOAorCiAKIGJvb2wgYnJjbWZfY19wcmVjX2VucShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwa3RxICpxLAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYykKQEAgLTI0Niw2ICsyNDksNyBAQAogewogCXM4IGV2ZW50bWFza1tCUkNNRl9FVkVOVElOR19NQVNLX0xFTl07CiAJdTggYnVmW0JSQ01GX0RDTURfU01MRU5dOworCXN0cnVjdCBicmNtZl9qb2luX3ByZWZfcGFyYW1zIGpvaW5fcHJlZl9wYXJhbXNbMl07CiAJY2hhciAqcHRyOwogCXMzMiBlcnI7CiAKQEAgLTI5OCw2ICszMDIsMjAgQEAKIAkJZ290byBkb25lOwogCX0KIAorCS8qIFNldHVwIGpvaW5fcHJlZiB0byBzZWxlY3QgdGFyZ2V0IGJ5IFJTU0kod2l0aCBib29zdCBvbiA1R0h6KSAqLworCWpvaW5fcHJlZl9wYXJhbXNbMF0udHlwZSA9IEJSQ01GX0pPSU5fUFJFRl9SU1NJX0RFTFRBOworCWpvaW5fcHJlZl9wYXJhbXNbMF0ubGVuID0gMjsKKwlqb2luX3ByZWZfcGFyYW1zWzBdLnJzc2lfZ2FpbiA9IEJSQ01GX0pPSU5fUFJFRl9SU1NJX0JPT1NUOworCWpvaW5fcHJlZl9wYXJhbXNbMF0uYmFuZCA9IFdMQ19CQU5EXzVHOworCWpvaW5fcHJlZl9wYXJhbXNbMV0udHlwZSA9IEJSQ01GX0pPSU5fUFJFRl9SU1NJOworCWpvaW5fcHJlZl9wYXJhbXNbMV0ubGVuID0gMjsKKwlqb2luX3ByZWZfcGFyYW1zWzFdLnJzc2lfZ2FpbiA9IDA7CisJam9pbl9wcmVmX3BhcmFtc1sxXS5iYW5kID0gMDsKKwllcnIgPSBicmNtZl9maWxfaW92YXJfZGF0YV9zZXQoaWZwLCAiam9pbl9wcmVmIiwgam9pbl9wcmVmX3BhcmFtcywKKwkJCQkgICAgICAgc2l6ZW9mKGpvaW5fcHJlZl9wYXJhbXMpKTsKKwlpZiAoZXJyKQorCQlicmNtZl9lcnIoIlNldCBqb2luX3ByZWYgZXJyb3IgKCVkKVxuIiwgZXJyKTsKKwogCS8qIFNldHVwIGV2ZW50X21zZ3MsIGVuYWJsZSBFX0lGICovCiAJZXJyID0gYnJjbWZfZmlsX2lvdmFyX2RhdGFfZ2V0KGlmcCwgImV2ZW50X21zZ3MiLCBldmVudG1hc2ssCiAJCQkJICAgICAgIEJSQ01GX0VWRU5USU5HX01BU0tfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwppbmRleCA3ZDI4Y2QzLi4wOWRkOGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGlmcC0+ZHJ2cjsKLQlzdHJ1Y3QgZXRoaGRyICplaDsKKwlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSk7CiAKIAlicmNtZl9kYmcoREFUQSwgIkVudGVyLCBpZHg9JWRcbiIsIGlmcC0+YnNzaWR4KTsKIApAQCAtMjM2LDYgKzIzNiw5IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwlpZiAoZWgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfUEFFKSkKKwkJYXRvbWljX2luYygmaWZwLT5wZW5kXzgwMjF4X2NudCk7CisKIAlyZXQgPSBicmNtZl9md3NfcHJvY2Vzc19za2IoaWZwLCBza2IpOwogCiBkb25lOgpAQCAtNTM4LDMxICs1NDEsMjYgQEAKIAkJYnJjbWZfbmV0aWZfcngoaWZwLCBza2IpOwogfQogCi12b2lkIGJyY21mX3R4ZmluYWxpemUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgc3RydWN0IHNrX2J1ZmYgKnR4cCwKK3ZvaWQgYnJjbWZfdHhmaW5hbGl6ZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwLCB1OCBpZmlkeCwKIAkJICAgICAgYm9vbCBzdWNjZXNzKQogewogCXN0cnVjdCBicmNtZl9pZiAqaWZwOwogCXN0cnVjdCBldGhoZHIgKmVoOwotCXU4IGlmaWR4OwogCXUxNiB0eXBlOwotCWludCByZXM7Ci0KLQlyZXMgPSBicmNtZl9wcm90b19oZHJwdWxsKGRydnIsIGZhbHNlLCAmaWZpZHgsIHR4cCk7CiAKIAlpZnAgPSBkcnZyLT5pZmxpc3RbaWZpZHhdOwogCWlmICghaWZwKQogCQlnb3RvIGRvbmU7CiAKLQlpZiAocmVzID09IDApIHsKLQkJZWggPSAoc3RydWN0IGV0aGhkciAqKSh0eHAtPmRhdGEpOwotCQl0eXBlID0gbnRvaHMoZWgtPmhfcHJvdG8pOworCWVoID0gKHN0cnVjdCBldGhoZHIgKikodHhwLT5kYXRhKTsKKwl0eXBlID0gbnRvaHMoZWgtPmhfcHJvdG8pOwogCi0JCWlmICh0eXBlID09IEVUSF9QX1BBRSkgewotCQkJYXRvbWljX2RlYygmaWZwLT5wZW5kXzgwMjF4X2NudCk7Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmaWZwLT5wZW5kXzgwMjF4X3dhaXQpKQotCQkJCXdha2VfdXAoJmlmcC0+cGVuZF84MDIxeF93YWl0KTsKLQkJfQorCWlmICh0eXBlID09IEVUSF9QX1BBRSkgeworCQlhdG9taWNfZGVjKCZpZnAtPnBlbmRfODAyMXhfY250KTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmlmcC0+cGVuZF84MDIxeF93YWl0KSkKKwkJCXdha2VfdXAoJmlmcC0+cGVuZF84MDIxeF93YWl0KTsKIAl9CisKIAlpZiAoIXN1Y2Nlc3MpCiAJCWlmcC0+c3RhdHMudHhfZXJyb3JzKys7CiBkb25lOgpAQCAtNTczLDEzICs1NzEsMTcgQEAKIHsKIAlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOworCXU4IGlmaWR4OwogCiAJLyogYXdhaXQgdHhzdGF0dXMgc2lnbmFsIGZvciBmaXJtd2FyZSBpZiBhY3RpdmUgKi8KIAlpZiAoYnJjbWZfZndzX2ZjX2FjdGl2ZShkcnZyLT5md3MpKSB7CiAJCWlmICghc3VjY2VzcykKIAkJCWJyY21mX2Z3c19idXN0eGZhaWwoZHJ2ci0+ZndzLCB0eHApOwogCX0gZWxzZSB7Ci0JCWJyY21mX3R4ZmluYWxpemUoZHJ2ciwgdHhwLCBzdWNjZXNzKTsKKwkJaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoZHJ2ciwgZmFsc2UsICZpZmlkeCwgdHhwKSkKKwkJCWJyY211X3BrdF9idWZfZnJlZV9za2IodHhwKTsKKwkJZWxzZQorCQkJYnJjbWZfdHhmaW5hbGl6ZShkcnZyLCB0eHAsIGlmaWR4LCBzdWNjZXNzKTsKIAl9CiB9CiAKQEAgLTkxNCwxMyArOTE2LDYgQEAKIAogCWJyY21mX2RiZyhUUkFDRSwgIlxuIik7CiAKLQkvKiBCcmluZyB1cCB0aGUgYnVzICovCi0JcmV0ID0gYnJjbWZfYnVzX2luaXQoYnVzX2lmKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJYnJjbWZfZXJyKCJicmNtZl9zZGJyY21fYnVzX2luaXQgZmFpbGVkICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIGFkZCBwcmltYXJ5IG5ldHdvcmtpbmcgaW50ZXJmYWNlICovCiAJaWZwID0gYnJjbWZfYWRkX2lmKGRydnIsIDAsIDAsICJ3bGFuJWQiLCBOVUxMKTsKIAlpZiAoSVNfRVJSKGlmcCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmluZGV4IDEzYzg5YTAuLjhmYTBkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8c29jLmg+CiAjaW5jbHVkZSAic2Rpb19ob3N0LmgiCiAjaW5jbHVkZSAiY2hpcC5oIgotI2luY2x1ZGUgIm52cmFtLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKIAogI2RlZmluZSBEQ01EX1JFU1BfVElNRU9VVCAgMjAwMAkvKiBJbiBtaWxsaSBzZWNvbmQgKi8KIApAQCAtNjMyLDQzICs2MzIsMjggQEAKIAl7IEJDTTQzNTRfQ0hJUF9JRCwgMHhGRkZGRkZGRiwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDM1NCkgfQogfTsKIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlICpicmNtZl9zZGlvX2dldF9mdyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLAotCQkJCQkJICBlbnVtIGJyY21mX2Zpcm13YXJlX3R5cGUgdHlwZSkKK3N0YXRpYyBjb25zdCBjaGFyICpicmNtZl9zZGlvX2dldF9md25hbWUoc3RydWN0IGJyY21mX2NoaXAgKmNpLAorCQkJCQkgZW51bSBicmNtZl9maXJtd2FyZV90eXBlIHR5cGUpCiB7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCBlcnIsIGk7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicmNtZl9md25hbWVfZGF0YSk7IGkrKykgewotCQlpZiAoYnJjbWZfZnduYW1lX2RhdGFbaV0uY2hpcGlkID09IGJ1cy0+Y2ktPmNoaXAgJiYKLQkJICAgIGJyY21mX2Z3bmFtZV9kYXRhW2ldLnJldm1zayAmIEJJVChidXMtPmNpLT5jaGlwcmV2KSkgeworCQlpZiAoYnJjbWZfZnduYW1lX2RhdGFbaV0uY2hpcGlkID09IGNpLT5jaGlwICYmCisJCSAgICBicmNtZl9md25hbWVfZGF0YVtpXS5yZXZtc2sgJiBCSVQoY2ktPmNoaXByZXYpKSB7CiAJCQlzd2l0Y2ggKHR5cGUpIHsKIAkJCWNhc2UgQlJDTUZfRklSTVdBUkVfQklOOgotCQkJCW5hbWUgPSBicmNtZl9md25hbWVfZGF0YVtpXS5iaW47Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIGJyY21mX2Z3bmFtZV9kYXRhW2ldLmJpbjsKIAkJCWNhc2UgQlJDTUZfRklSTVdBUkVfTlZSQU06Ci0JCQkJbmFtZSA9IGJyY21mX2Z3bmFtZV9kYXRhW2ldLm52OwotCQkJCWJyZWFrOworCQkJCXJldHVybiBicmNtZl9md25hbWVfZGF0YVtpXS5udjsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJjbWZfZXJyKCJpbnZhbGlkIGZpcm13YXJlIHR5cGUgKCVkKVxuIiwgdHlwZSk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9Ci0JCQlnb3RvIGZvdW5kOwogCQl9CiAJfQogCWJyY21mX2VycigiVW5rbm93biBjaGlwaWQgJWQgWyVkXVxuIiwKLQkJICBidXMtPmNpLT5jaGlwLCBidXMtPmNpLT5jaGlwcmV2KTsKKwkJICBjaS0+Y2hpcCwgY2ktPmNoaXByZXYpOwogCXJldHVybiBOVUxMOwotCi1mb3VuZDoKLQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgJmJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+ZGV2KTsKLQlpZiAoKGVycikgfHwgKCFmdykpIHsKLQkJYnJjbWZfZXJyKCJmYWlsIHRvIHJlcXVlc3QgZmlybXdhcmUgJXMgKCVkKVxuIiwgbmFtZSwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGZ3OwogfQogCiBzdGF0aWMgdm9pZCBwa3RfYWxpZ24oc3RydWN0IHNrX2J1ZmYgKnAsIGludCBsZW4sIGludCBhbGlnbikKQEAgLTMyNzgsMjAgKzMyNjMsMTMgQEAKIH0KIAogc3RhdGljIGludCBicmNtZl9zZGlvX2Rvd25sb2FkX252cmFtKHN0cnVjdCBicmNtZl9zZGlvICpidXMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm52KQorCQkJCSAgICAgdm9pZCAqdmFycywgdTMyIHZhcnN6KQogewotCXZvaWQgKnZhcnM7Ci0JdTMyIHZhcnN6OwogCWludCBhZGRyZXNzOwogCWludCBlcnI7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQl2YXJzID0gYnJjbWZfbnZyYW1fc3RyaXAobnYsICZ2YXJzeik7Ci0KLQlpZiAodmFycyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWFkZHJlc3MgPSBidXMtPmNpLT5yYW1zaXplIC0gdmFyc3ogKyBidXMtPmNpLT5yYW1iYXNlOwogCWVyciA9IGJyY21mX3NkaW9kX3JhbXJ3KGJ1cy0+c2Rpb2RldiwgdHJ1ZSwgYWRkcmVzcywgdmFycywgdmFyc3opOwogCWlmIChlcnIpCkBAIC0zMzAwLDE1ICszMjc4LDE0IEBACiAJZWxzZSBpZiAoIWJyY21mX3NkaW9fdmVyaWZ5bWVtb3J5KGJ1cy0+c2Rpb2RldiwgYWRkcmVzcywgdmFycywgdmFyc3opKQogCQllcnIgPSAtRUlPOwogCi0JYnJjbWZfbnZyYW1fZnJlZSh2YXJzKTsKLQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2Rpb19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBicmNtZl9zZGlvICpidXMsCisJCQkJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkJCXZvaWQgKm52cmFtLCB1MzIgbnZsZW4pCiB7CiAJaW50IGJjbWVycm9yID0gLUVGQVVMVDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCXUzMiByc3R2ZWM7CiAKIAlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKQEAgLTMzMTcsMTIgKzMyOTQsNiBAQAogCS8qIEtlZXAgYXJtIGluIHJlc2V0ICovCiAJYnJjbWZfY2hpcF9lbnRlcl9kb3dubG9hZChidXMtPmNpKTsKIAotCWZ3ID0gYnJjbWZfc2Rpb19nZXRfZncoYnVzLCBCUkNNRl9GSVJNV0FSRV9CSU4pOwotCWlmIChmdyA9PSBOVUxMKSB7Ci0JCWJjbWVycm9yID0gLUVOT0VOVDsKLQkJZ290byBlcnI7Ci0JfQotCiAJcnN0dmVjID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGZ3LT5kYXRhKTsKIAlicmNtZl9kYmcoU0RJTywgImZpcm13YXJlIHJzdHZlYzogJXhcbiIsIHJzdHZlYyk7CiAKQEAgLTMzMzAsMTcgKzMzMDEsMTIgQEAKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlpZiAoYmNtZXJyb3IpIHsKIAkJYnJjbWZfZXJyKCJkb25nbGUgaW1hZ2UgZmlsZSBkb3dubG9hZCBmYWlsZWRcbiIpOworCQlicmNtZl9md19udnJhbV9mcmVlKG52cmFtKTsKIAkJZ290byBlcnI7CiAJfQogCi0JZncgPSBicmNtZl9zZGlvX2dldF9mdyhidXMsIEJSQ01GX0ZJUk1XQVJFX05WUkFNKTsKLQlpZiAoZncgPT0gTlVMTCkgewotCQliY21lcnJvciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJjbWVycm9yID0gYnJjbWZfc2Rpb19kb3dubG9hZF9udnJhbShidXMsIGZ3KTsKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwliY21lcnJvciA9IGJyY21mX3NkaW9fZG93bmxvYWRfbnZyYW0oYnVzLCBudnJhbSwgbnZsZW4pOworCWJyY21mX2Z3X252cmFtX2ZyZWUobnZyYW0pOwogCWlmIChiY21lcnJvcikgewogCQlicmNtZl9lcnIoImRvbmdsZSBudnJhbSBmaWxlIGRvd25sb2FkIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwpAQCAtMzQ5MCw5NyArMzQ1Niw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGlvX2J1c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2LnNkaW87Ci0Jc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKLQlpbnQgZXJyLCByZXQgPSAwOwotCXU4IHNhdmVjbGs7Ci0KLQlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7Ci0KLQkvKiB0cnkgdG8gZG93bmxvYWQgaW1hZ2UgYW5kIG52cmFtIHRvIHRoZSBkb25nbGUgKi8KLQlpZiAoYnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgewotCQlidXMtPmFscF9vbmx5ID0gdHJ1ZTsKLQkJZXJyID0gYnJjbWZfc2Rpb19kb3dubG9hZF9maXJtd2FyZShidXMpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJYnVzLT5hbHBfb25seSA9IGZhbHNlOwotCX0KLQotCWlmICghYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRydnIpCi0JCXJldHVybiAwOwotCi0JLyogU3RhcnQgdGhlIHdhdGNoZG9nIHRpbWVyICovCi0JYnVzLT5zZGNudC50aWNrY250ID0gMDsKLQlicmNtZl9zZGlvX3dkX3RpbWVyKGJ1cywgQlJDTUZfV0RfUE9MTF9NUyk7Ci0KLQlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKLQotCS8qIE1ha2Ugc3VyZSBiYWNrcGxhbmUgY2xvY2sgaXMgb24sIG5lZWRlZCB0byBnZW5lcmF0ZSBGMiBpbnRlcnJ1cHQgKi8KLQlicmNtZl9zZGlvX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCWlmIChidXMtPmNsa3N0YXRlICE9IENMS19BVkFJTCkKLQkJZ290byBleGl0OwotCi0JLyogRm9yY2UgY2xvY2tzIG9uIGJhY2twbGFuZSB0byBiZSBzdXJlIEYyIGludGVycnVwdCBwcm9wYWdhdGVzICovCi0Jc2F2ZWNsayA9IGJyY21mX3NkaW9kX3JlZ3JiKGJ1cy0+c2Rpb2RldiwKLQkJCQkgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsICZlcnIpOwotCWlmICghZXJyKSB7Ci0JCWJyY21mX3NkaW9kX3JlZ3diKGJ1cy0+c2Rpb2RldiwgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQkJICAoc2F2ZWNsayB8IFNCU0RJT19GT1JDRV9IVCksICZlcnIpOwotCX0KLQlpZiAoZXJyKSB7Ci0JCWJyY21mX2VycigiRmFpbGVkIHRvIGZvcmNlIGNsb2NrIGZvciBGMjogZXJyICVkXG4iLCBlcnIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogRW5hYmxlIGZ1bmN0aW9uIDIgKGZyYW1lIHRyYW5zZmVycykgKi8KLQl3X3NkcmVnMzIoYnVzLCBTRFBDTV9QUk9UX1ZFUlNJT04gPDwgU01CX0RBVEFfVkVSU0lPTl9TSElGVCwKLQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIHRvc2JtYWlsYm94ZGF0YSkpOwotCWVyciA9IHNkaW9fZW5hYmxlX2Z1bmMoYnVzLT5zZGlvZGV2LT5mdW5jW1NESU9fRlVOQ18yXSk7Ci0KLQotCWJyY21mX2RiZyhJTkZPLCAiZW5hYmxlIEYyOiBlcnI9JWRcbiIsIGVycik7Ci0KLQkvKiBJZiBGMiBzdWNjZXNzZnVsbHkgZW5hYmxlZCwgc2V0IGNvcmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JaWYgKCFlcnIpIHsKLQkJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgbWFzayBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KLQkJYnVzLT5ob3N0aW50bWFzayA9IEhPU1RJTlRNQVNLOwotCQl3X3NkcmVnMzIoYnVzLCBidXMtPmhvc3RpbnRtYXNrLAotCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGhvc3RpbnRtYXNrKSk7Ci0KLQkJYnJjbWZfc2Rpb2RfcmVnd2IoYnVzLT5zZGlvZGV2LCBTQlNESU9fV0FURVJNQVJLLCA4LCAmZXJyKTsKLQl9IGVsc2UgewotCQkvKiBEaXNhYmxlIEYyIGFnYWluICovCi0JCXNkaW9fZGlzYWJsZV9mdW5jKGJ1cy0+c2Rpb2Rldi0+ZnVuY1tTRElPX0ZVTkNfMl0pOwotCQlyZXQgPSAtRU5PREVWOwotCX0KLQotCWlmIChicmNtZl9jaGlwX3NyX2NhcGFibGUoYnVzLT5jaSkpIHsKLQkJYnJjbWZfc2Rpb19zcl9pbml0KGJ1cyk7Ci0JfSBlbHNlIHsKLQkJLyogUmVzdG9yZSBwcmV2aW91cyBjbG9jayBzZXR0aW5nICovCi0JCWJyY21mX3NkaW9kX3JlZ3diKGJ1cy0+c2Rpb2RldiwgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQkJICBzYXZlY2xrLCAmZXJyKTsKLQl9Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gYnJjbWZfc2Rpb2RfaW50cl9yZWdpc3RlcihidXMtPnNkaW9kZXYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlicmNtZl9lcnIoImludHIgcmVnaXN0ZXIgZmFpbGVkOiVkXG4iLCByZXQpOwotCX0KLQotCS8qIElmIHdlIGRpZG4ndCBjb21lIHVwLCB0dXJuIG9mZiBiYWNrcGxhbmUgY2xvY2sgKi8KLQlpZiAocmV0ICE9IDApCi0JCWJyY21mX3NkaW9fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKLQotZXhpdDoKLQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQogdm9pZCBicmNtZl9zZGlvX2lzcihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKQEAgLTQwMjAsMTMgKzM4OTUsMTE0IEBACiBzdGF0aWMgc3RydWN0IGJyY21mX2J1c19vcHMgYnJjbWZfc2Rpb19idXNfb3BzID0gewogCS5zdG9wID0gYnJjbWZfc2Rpb19idXNfc3RvcCwKIAkucHJlaW5pdCA9IGJyY21mX3NkaW9fYnVzX3ByZWluaXQsCi0JLmluaXQgPSBicmNtZl9zZGlvX2J1c19pbml0LAogCS50eGRhdGEgPSBicmNtZl9zZGlvX2J1c190eGRhdGEsCiAJLnR4Y3RsID0gYnJjbWZfc2Rpb19idXNfdHhjdGwsCiAJLnJ4Y3RsID0gYnJjbWZfc2Rpb19idXNfcnhjdGwsCiAJLmdldHR4cSA9IGJyY21mX3NkaW9fYnVzX2dldHR4cSwKIH07CiAKK3N0YXRpYyB2b2lkIGJyY21mX3NkaW9fZmlybXdhcmVfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgY29uc3Qgc3RydWN0IGZpcm13YXJlICpjb2RlLAorCQkJCQkgdm9pZCAqbnZyYW0sIHUzMiBudnJhbV9sZW4pCit7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdi5zZGlvOworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CisJaW50IGVyciA9IDA7CisJdTggc2F2ZWNsazsKKworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyOiBkZXY9JXNcbiIsIGRldl9uYW1lKGRldikpOworCisJLyogdHJ5IHRvIGRvd25sb2FkIGltYWdlIGFuZCBudnJhbSB0byB0aGUgZG9uZ2xlICovCisJaWYgKGJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKKwkJYnVzLT5hbHBfb25seSA9IHRydWU7CisJCWVyciA9IGJyY21mX3NkaW9fZG93bmxvYWRfZmlybXdhcmUoYnVzLCBjb2RlLCBudnJhbSwgbnZyYW1fbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJYnVzLT5hbHBfb25seSA9IGZhbHNlOworCX0KKworCWlmICghYnVzX2lmLT5kcnZyKQorCQlyZXR1cm47CisKKwkvKiBTdGFydCB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKwlidXMtPnNkY250LnRpY2tjbnQgPSAwOworCWJyY21mX3NkaW9fd2RfdGltZXIoYnVzLCBCUkNNRl9XRF9QT0xMX01TKTsKKworCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jWzFdKTsKKworCS8qIE1ha2Ugc3VyZSBiYWNrcGxhbmUgY2xvY2sgaXMgb24sIG5lZWRlZCB0byBnZW5lcmF0ZSBGMiBpbnRlcnJ1cHQgKi8KKwlicmNtZl9zZGlvX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOworCWlmIChidXMtPmNsa3N0YXRlICE9IENMS19BVkFJTCkKKwkJZ290byByZWxlYXNlOworCisJLyogRm9yY2UgY2xvY2tzIG9uIGJhY2twbGFuZSB0byBiZSBzdXJlIEYyIGludGVycnVwdCBwcm9wYWdhdGVzICovCisJc2F2ZWNsayA9IGJyY21mX3NkaW9kX3JlZ3JiKHNkaW9kZXYsIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAmZXJyKTsKKwlpZiAoIWVycikgeworCQlicmNtZl9zZGlvZF9yZWd3YihzZGlvZGV2LCBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKKwkJCQkgIChzYXZlY2xrIHwgU0JTRElPX0ZPUkNFX0hUKSwgJmVycik7CisJfQorCWlmIChlcnIpIHsKKwkJYnJjbWZfZXJyKCJGYWlsZWQgdG8gZm9yY2UgY2xvY2sgZm9yIEYyOiBlcnIgJWRcbiIsIGVycik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKiBFbmFibGUgZnVuY3Rpb24gMiAoZnJhbWUgdHJhbnNmZXJzKSAqLworCXdfc2RyZWczMihidXMsIFNEUENNX1BST1RfVkVSU0lPTiA8PCBTTUJfREFUQV9WRVJTSU9OX1NISUZULAorCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgdG9zYm1haWxib3hkYXRhKSk7CisJZXJyID0gc2Rpb19lbmFibGVfZnVuYyhzZGlvZGV2LT5mdW5jW1NESU9fRlVOQ18yXSk7CisKKworCWJyY21mX2RiZyhJTkZPLCAiZW5hYmxlIEYyOiBlcnI9JWRcbiIsIGVycik7CisKKwkvKiBJZiBGMiBzdWNjZXNzZnVsbHkgZW5hYmxlZCwgc2V0IGNvcmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJaWYgKCFlcnIpIHsKKwkJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgbWFzayBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KKwkJYnVzLT5ob3N0aW50bWFzayA9IEhPU1RJTlRNQVNLOworCQl3X3NkcmVnMzIoYnVzLCBidXMtPmhvc3RpbnRtYXNrLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGhvc3RpbnRtYXNrKSk7CisKKwkJYnJjbWZfc2Rpb2RfcmVnd2Ioc2Rpb2RldiwgU0JTRElPX1dBVEVSTUFSSywgOCwgJmVycik7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBGMiBhZ2FpbiAqLworCQlzZGlvX2Rpc2FibGVfZnVuYyhzZGlvZGV2LT5mdW5jW1NESU9fRlVOQ18yXSk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlpZiAoYnJjbWZfY2hpcF9zcl9jYXBhYmxlKGJ1cy0+Y2kpKSB7CisJCWJyY21mX3NkaW9fc3JfaW5pdChidXMpOworCX0gZWxzZSB7CisJCS8qIFJlc3RvcmUgcHJldmlvdXMgY2xvY2sgc2V0dGluZyAqLworCQlicmNtZl9zZGlvZF9yZWd3YihzZGlvZGV2LCBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKKwkJCQkgIHNhdmVjbGssICZlcnIpOworCX0KKworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSBicmNtZl9zZGlvZF9pbnRyX3JlZ2lzdGVyKHNkaW9kZXYpOworCQlpZiAoZXJyICE9IDApCisJCQlicmNtZl9lcnIoImludHIgcmVnaXN0ZXIgZmFpbGVkOiVkXG4iLCBlcnIpOworCX0KKworCS8qIElmIHdlIGRpZG4ndCBjb21lIHVwLCB0dXJuIG9mZiBiYWNrcGxhbmUgY2xvY2sgKi8KKwlpZiAoZXJyICE9IDApCisJCWJyY21mX3NkaW9fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKKworCXNkaW9fcmVsZWFzZV9ob3N0KHNkaW9kZXYtPmZ1bmNbMV0pOworCisJZXJyID0gYnJjbWZfYnVzX3N0YXJ0KGRldik7CisJaWYgKGVyciAhPSAwKSB7CisJCWJyY21mX2VycigiZG9uZ2xlIGlzIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm47CisKK3JlbGVhc2U6CisJc2Rpb19yZWxlYXNlX2hvc3Qoc2Rpb2Rldi0+ZnVuY1sxXSk7CitmYWlsOgorCWJyY21mX2RiZyhUUkFDRSwgImZhaWxlZDogZGV2PSVzLCBlcnI9JWRcbiIsIGRldl9uYW1lKGRldiksIGVycik7CisJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7Cit9CisKIHN0cnVjdCBicmNtZl9zZGlvICpicmNtZl9zZGlvX3Byb2JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKIHsKIAlpbnQgcmV0OwpAQCAtNDExMCw4ICs0MDg2LDEzIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwkvKiBRdWVyeSB0aGUgRjIgYmxvY2sgc2l6ZSwgc2V0IHJvdW5kdXAgYWNjb3JkaW5nbHkgKi8KKwlidXMtPmJsb2Nrc2l6ZSA9IGJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+Y3VyX2Jsa3NpemU7CisJYnVzLT5yb3VuZHVwID0gbWluKG1heF9yb3VuZHVwLCBidXMtPmJsb2Nrc2l6ZSk7CisKIAkvKiBBbGxvY2F0ZSBidWZmZXJzICovCiAJaWYgKGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5tYXhjdGwpIHsKKwkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPm1heGN0bCArPSBidXMtPnJvdW5kdXA7CiAJCWJ1cy0+cnhibGVuID0KIAkJICAgIHJvdW5kdXAoKGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5tYXhjdGwgKyBTRFBDTV9IRFJMRU4pLAogCQkJICAgIEFMSUdOTUVOVCkgKyBidXMtPmhlYWRfYWxpZ247CkBAIC00MTM5LDEwICs0MTIwLDYgQEAKIAlidXMtPmlkbGV0aW1lID0gQlJDTUZfSURMRV9JTlRFUlZBTDsKIAlidXMtPmlkbGVjbG9jayA9IEJSQ01GX0lETEVfQUNUSVZFOwogCi0JLyogUXVlcnkgdGhlIEYyIGJsb2NrIHNpemUsIHNldCByb3VuZHVwIGFjY29yZGluZ2x5ICovCi0JYnVzLT5ibG9ja3NpemUgPSBidXMtPnNkaW9kZXYtPmZ1bmNbMl0tPmN1cl9ibGtzaXplOwotCWJ1cy0+cm91bmR1cCA9IG1pbihtYXhfcm91bmR1cCwgYnVzLT5ibG9ja3NpemUpOwotCiAJLyogU1Igc3RhdGUgKi8KIAlidXMtPnNsZWVwaW5nID0gZmFsc2U7CiAJYnVzLT5zcl9lbmFibGVkID0gZmFsc2U7CkBAIC00MTUwLDEwICs0MTI3LDE0IEBACiAJYnJjbWZfc2Rpb19kZWJ1Z2ZzX2NyZWF0ZShidXMpOwogCWJyY21mX2RiZyhJTkZPLCAiY29tcGxldGVkISFcbiIpOwogCi0JLyogaWYgZmlybXdhcmUgcGF0aCBwcmVzZW50IHRyeSB0byBkb3dubG9hZCBhbmQgYnJpbmcgdXAgYnVzICovCi0JcmV0ID0gYnJjbWZfYnVzX3N0YXJ0KGJ1cy0+c2Rpb2Rldi0+ZGV2KTsKKwlyZXQgPSBicmNtZl9md19nZXRfZmlybXdhcmVzKHNkaW9kZXYtPmRldiwgQlJDTUZfRldfUkVRVUVTVF9OVlJBTSwKKwkJCQkgICAgIGJyY21mX3NkaW9fZ2V0X2Z3bmFtZShidXMtPmNpLAorCQkJCQkJCSAgIEJSQ01GX0ZJUk1XQVJFX0JJTiksCisJCQkJICAgICBicmNtZl9zZGlvX2dldF9md25hbWUoYnVzLT5jaSwKKwkJCQkJCQkgICBCUkNNRl9GSVJNV0FSRV9OVlJBTSksCisJCQkJICAgICBicmNtZl9zZGlvX2Zpcm13YXJlX2NhbGxiYWNrKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJYnJjbWZfZXJyKCJkb25nbGUgaXMgbm90IHJlc3BvbmRpbmdcbiIpOworCQlicmNtZl9lcnIoImFzeW5jIGZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtNDE3Myw5ICs0MTU0LDcgQEAKIAkJLyogRGUtcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAkJYnJjbWZfc2Rpb2RfaW50cl91bnJlZ2lzdGVyKGJ1cy0+c2Rpb2Rldik7CiAKLQkJaWYgKGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kcnZyKSB7Ci0JCQlicmNtZl9kZXRhY2goYnVzLT5zZGlvZGV2LT5kZXYpOwotCQl9CisJCWJyY21mX2RldGFjaChidXMtPnNkaW9kZXYtPmRldik7CiAKIAkJY2FuY2VsX3dvcmtfc3luYygmYnVzLT5kYXRhd29yayk7CiAJCWlmIChidXMtPmJyY21mX3dxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Zpcm13YXJlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdkMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Zpcm13YXJlLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJkaGRfZGJnLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKworZW51bSBudnJhbV9wYXJzZXJfc3RhdGUgeworCUlETEUsCisJS0VZLAorCVZBTFVFLAorCUNPTU1FTlQsCisJRU5ECit9OworCisvKioKKyAqIHN0cnVjdCBudnJhbV9wYXJzZXIgLSBpbnRlcm5hbCBpbmZvIGZvciBwYXJzZXIuCisgKgorICogQHN0YXRlOiBjdXJyZW50IHBhcnNlciBzdGF0ZS4KKyAqIEBmd252OiBpbnB1dCBidWZmZXIgYmVpbmcgcGFyc2VkLgorICogQG52cmFtOiBvdXRwdXQgYnVmZmVyIHdpdGggcGFyc2UgcmVzdWx0LgorICogQG52cmFtX2xlbjogbGVuZ2h0IG9mIHBhcnNlIHJlc3VsdC4KKyAqIEBsaW5lOiBjdXJyZW50IGxpbmUuCisgKiBAY29sdW1uOiBjdXJyZW50IGNvbHVtbiBpbiBsaW5lLgorICogQHBvczogYnl0ZSBvZmZzZXQgaW4gaW5wdXQgYnVmZmVyLgorICogQGVudHJ5OiBzdGFydCBwb3NpdGlvbiBvZiBrZXksdmFsdWUgZW50cnkuCisgKi8KK3N0cnVjdCBudnJhbV9wYXJzZXIgeworCWVudW0gbnZyYW1fcGFyc2VyX3N0YXRlIHN0YXRlOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndudjsKKwl1OCAqbnZyYW07CisJdTMyIG52cmFtX2xlbjsKKwl1MzIgbGluZTsKKwl1MzIgY29sdW1uOworCXUzMiBwb3M7CisJdTMyIGVudHJ5OworfTsKKworc3RhdGljIGJvb2wgaXNfbnZyYW1fY2hhcihjaGFyIGMpCit7CisJLyogY29tbWVudCBtYXJrZXIgZXhjbHVkZWQgKi8KKwlpZiAoYyA9PSAnIycpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGtleSBhbmQgdmFsdWUgbWF5IGhhdmUgYW55IG90aGVyIHJlYWRhYmxlIGNoYXJhY3RlciAqLworCXJldHVybiAoYyA+IDB4MjAgJiYgYyA8IDB4N2YpOworfQorCitzdGF0aWMgYm9vbCBpc193aGl0ZXNwYWNlKGNoYXIgYykKK3sKKwlyZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHQnKTsKK30KKworc3RhdGljIGVudW0gbnZyYW1fcGFyc2VyX3N0YXRlIGJyY21mX252cmFtX2hhbmRsZV9pZGxlKHN0cnVjdCBudnJhbV9wYXJzZXIgKm52cCkKK3sKKwljaGFyIGM7CisKKwljID0gbnZwLT5md252LT5kYXRhW252cC0+cG9zXTsKKwlpZiAoYyA9PSAnXG4nKQorCQlyZXR1cm4gQ09NTUVOVDsKKwlpZiAoaXNfd2hpdGVzcGFjZShjKSkKKwkJZ290byBwcm9jZWVkOworCWlmIChjID09ICcjJykKKwkJcmV0dXJuIENPTU1FTlQ7CisJaWYgKGlzX252cmFtX2NoYXIoYykpIHsKKwkJbnZwLT5lbnRyeSA9IG52cC0+cG9zOworCQlyZXR1cm4gS0VZOworCX0KKwlicmNtZl9kYmcoSU5GTywgIndhcm5pbmc6IGxuPSVkOmNvbD0lZDogaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXJcbiIsCisJCSAgbnZwLT5saW5lLCBudnAtPmNvbHVtbik7Citwcm9jZWVkOgorCW52cC0+Y29sdW1uKys7CisJbnZwLT5wb3MrKzsKKwlyZXR1cm4gSURMRTsKK30KKworc3RhdGljIGVudW0gbnZyYW1fcGFyc2VyX3N0YXRlIGJyY21mX252cmFtX2hhbmRsZV9rZXkoc3RydWN0IG52cmFtX3BhcnNlciAqbnZwKQoreworCWVudW0gbnZyYW1fcGFyc2VyX3N0YXRlIHN0ID0gbnZwLT5zdGF0ZTsKKwljaGFyIGM7CisKKwljID0gbnZwLT5md252LT5kYXRhW252cC0+cG9zXTsKKwlpZiAoYyA9PSAnPScpIHsKKwkJc3QgPSBWQUxVRTsKKwl9IGVsc2UgaWYgKCFpc19udnJhbV9jaGFyKGMpKSB7CisJCWJyY21mX2RiZyhJTkZPLCAid2FybmluZzogbG49JWQ6Y29sPSVkOiAnPScgZXhwZWN0ZWQsIHNraXAgaW52YWxpZCBrZXkgZW50cnlcbiIsCisJCQkgIG52cC0+bGluZSwgbnZwLT5jb2x1bW4pOworCQlyZXR1cm4gQ09NTUVOVDsKKwl9CisKKwludnAtPmNvbHVtbisrOworCW52cC0+cG9zKys7CisJcmV0dXJuIHN0OworfQorCitzdGF0aWMgZW51bSBudnJhbV9wYXJzZXJfc3RhdGUKK2JyY21mX252cmFtX2hhbmRsZV92YWx1ZShzdHJ1Y3QgbnZyYW1fcGFyc2VyICpudnApCit7CisJY2hhciBjOworCWNoYXIgKnNrdjsKKwljaGFyICpla3Y7CisJdTMyIGNwbGVuOworCisJYyA9IG52cC0+Zndudi0+ZGF0YVtudnAtPnBvc107CisJaWYgKCFpc19udnJhbV9jaGFyKGMpKSB7CisJCS8qIGtleSx2YWx1ZSBwYWlyIGNvbXBsZXRlICovCisJCWVrdiA9ICh1OCAqKSZudnAtPmZ3bnYtPmRhdGFbbnZwLT5wb3NdOworCQlza3YgPSAodTggKikmbnZwLT5md252LT5kYXRhW252cC0+ZW50cnldOworCQljcGxlbiA9IGVrdiAtIHNrdjsKKwkJLyogY29weSB0byBvdXRwdXQgYnVmZmVyICovCisJCW1lbWNweSgmbnZwLT5udnJhbVtudnAtPm52cmFtX2xlbl0sIHNrdiwgY3BsZW4pOworCQludnAtPm52cmFtX2xlbiArPSBjcGxlbjsKKwkJbnZwLT5udnJhbVtudnAtPm52cmFtX2xlbl0gPSAnXDAnOworCQludnAtPm52cmFtX2xlbisrOworCQlyZXR1cm4gSURMRTsKKwl9CisJbnZwLT5wb3MrKzsKKwludnAtPmNvbHVtbisrOworCXJldHVybiBWQUxVRTsKK30KKworc3RhdGljIGVudW0gbnZyYW1fcGFyc2VyX3N0YXRlCiticmNtZl9udnJhbV9oYW5kbGVfY29tbWVudChzdHJ1Y3QgbnZyYW1fcGFyc2VyICpudnApCit7CisJY2hhciAqZW9sLCAqc29sOworCisJc29sID0gKGNoYXIgKikmbnZwLT5md252LT5kYXRhW252cC0+cG9zXTsKKwllb2wgPSBzdHJjaHIoc29sLCAnXG4nKTsKKwlpZiAoZW9sID09IE5VTEwpCisJCXJldHVybiBFTkQ7CisKKwkvKiBlYXQgYWxsIG1vdmluZyB0byBuZXh0IGxpbmUgKi8KKwludnAtPmxpbmUrKzsKKwludnAtPmNvbHVtbiA9IDE7CisJbnZwLT5wb3MgKz0gKGVvbCAtIHNvbCkgKyAxOworCXJldHVybiBJRExFOworfQorCitzdGF0aWMgZW51bSBudnJhbV9wYXJzZXJfc3RhdGUgYnJjbWZfbnZyYW1faGFuZGxlX2VuZChzdHJ1Y3QgbnZyYW1fcGFyc2VyICpudnApCit7CisJLyogZmluYWwgc3RhdGUgKi8KKwlyZXR1cm4gRU5EOworfQorCitzdGF0aWMgZW51bSBudnJhbV9wYXJzZXJfc3RhdGUKKygqbnZfcGFyc2VyX3N0YXRlc1tdKShzdHJ1Y3QgbnZyYW1fcGFyc2VyICpudnApID0geworCWJyY21mX252cmFtX2hhbmRsZV9pZGxlLAorCWJyY21mX252cmFtX2hhbmRsZV9rZXksCisJYnJjbWZfbnZyYW1faGFuZGxlX3ZhbHVlLAorCWJyY21mX252cmFtX2hhbmRsZV9jb21tZW50LAorCWJyY21mX252cmFtX2hhbmRsZV9lbmQKK307CisKK3N0YXRpYyBpbnQgYnJjbWZfaW5pdF9udnJhbV9wYXJzZXIoc3RydWN0IG52cmFtX3BhcnNlciAqbnZwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbnYpCit7CisJbWVtc2V0KG52cCwgMCwgc2l6ZW9mKCpudnApKTsKKwludnAtPmZ3bnYgPSBudjsKKwkvKiBBbGxvYyBmb3IgZXh0cmEgMCBieXRlICsgcm91bmR1cCBieSA0ICsgbGVuZ3RoIGZpZWxkICovCisJbnZwLT5udnJhbSA9IGt6YWxsb2MobnYtPnNpemUgKyAxICsgMyArIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52cC0+bnZyYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJbnZwLT5saW5lID0gMTsKKwludnAtPmNvbHVtbiA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIGJyY21mX252cmFtX3N0cmlwIDpUYWtlcyBhIGJ1ZmZlciBvZiAiPHZhcj49PHZhbHVlPlxuIiBsaW5lcyByZWFkIGZyb20gYSBmaWwKKyAqIGFuZCBlbmRpbmcgaW4gYSBOVUwuIFJlbW92ZXMgY2FycmlhZ2UgcmV0dXJucywgZW1wdHkgbGluZXMsIGNvbW1lbnQgbGluZXMsCisgKiBhbmQgY29udmVydHMgbmV3bGluZXMgdG8gTlVMcy4gU2hvcnRlbnMgYnVmZmVyIGFzIG5lZWRlZCBhbmQgcGFkcyB3aXRoIE5VTHMuCisgKiBFbmQgb2YgYnVmZmVyIGlzIGNvbXBsZXRlZCB3aXRoIHRva2VuIGlkZW50aWZ5aW5nIGxlbmd0aCBvZiBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkICpicmNtZl9md19udnJhbV9zdHJpcChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm52LCB1MzIgKm5ld19sZW5ndGgpCit7CisJc3RydWN0IG52cmFtX3BhcnNlciBudnA7CisJdTMyIHBhZDsKKwl1MzIgdG9rZW47CisJX19sZTMyIHRva2VuX2xlOworCisJaWYgKGJyY21mX2luaXRfbnZyYW1fcGFyc2VyKCZudnAsIG52KSA8IDApCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKG52cC5wb3MgPCBudi0+c2l6ZSkgeworCQludnAuc3RhdGUgPSBudl9wYXJzZXJfc3RhdGVzW252cC5zdGF0ZV0oJm52cCk7CisJCWlmIChudnAuc3RhdGUgPT0gRU5EKQorCQkJYnJlYWs7CisJfQorCXBhZCA9IG52cC5udnJhbV9sZW47CisJKm5ld19sZW5ndGggPSByb3VuZHVwKG52cC5udnJhbV9sZW4gKyAxLCA0KTsKKwl3aGlsZSAocGFkICE9ICpuZXdfbGVuZ3RoKSB7CisJCW52cC5udnJhbVtwYWRdID0gMDsKKwkJcGFkKys7CisJfQorCisJdG9rZW4gPSAqbmV3X2xlbmd0aCAvIDQ7CisJdG9rZW4gPSAofnRva2VuIDw8IDE2KSB8ICh0b2tlbiAmIDB4MDAwMEZGRkYpOworCXRva2VuX2xlID0gY3B1X3RvX2xlMzIodG9rZW4pOworCisJbWVtY3B5KCZudnAubnZyYW1bKm5ld19sZW5ndGhdLCAmdG9rZW5fbGUsIHNpemVvZih0b2tlbl9sZSkpOworCSpuZXdfbGVuZ3RoICs9IHNpemVvZih0b2tlbl9sZSk7CisKKwlyZXR1cm4gbnZwLm52cmFtOworfQorCit2b2lkIGJyY21mX2Z3X252cmFtX2ZyZWUodm9pZCAqbnZyYW0pCit7CisJa2ZyZWUobnZyYW0pOworfQorCitzdHJ1Y3QgYnJjbWZfZncgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1MTYgZmxhZ3M7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpjb2RlOworCWNvbnN0IGNoYXIgKm52cmFtX25hbWU7CisJdm9pZCAoKmRvbmUpKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJICAgICB2b2lkICpudnJhbV9pbWFnZSwgdTMyIG52cmFtX2xlbik7Cit9OworCitzdGF0aWMgdm9pZCBicmNtZl9md19yZXF1ZXN0X252cmFtX2RvbmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY3R4KQoreworCXN0cnVjdCBicmNtZl9mdyAqZndjdHggPSBjdHg7CisJdTMyIG52cmFtX2xlbmd0aCA9IDA7CisJdm9pZCAqbnZyYW0gPSBOVUxMOworCisJYnJjbWZfZGJnKFRSQUNFLCAiZW50ZXI6IGRldj0lc1xuIiwgZGV2X25hbWUoZndjdHgtPmRldikpOworCWlmICghZncgJiYgIShmd2N0eC0+ZmxhZ3MgJiBCUkNNRl9GV19SRVFfTlZfT1BUSU9OQUwpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoZncpIHsKKwkJbnZyYW0gPSBicmNtZl9md19udnJhbV9zdHJpcChmdywgJm52cmFtX2xlbmd0aCk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlpZiAoIW52cmFtICYmICEoZndjdHgtPmZsYWdzICYgQlJDTUZfRldfUkVRX05WX09QVElPTkFMKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlmd2N0eC0+ZG9uZShmd2N0eC0+ZGV2LCBmd2N0eC0+Y29kZSwgbnZyYW0sIG52cmFtX2xlbmd0aCk7CisJa2ZyZWUoZndjdHgpOworCXJldHVybjsKKworZmFpbDoKKwlicmNtZl9kYmcoVFJBQ0UsICJmYWlsZWQ6IGRldj0lc1xuIiwgZGV2X25hbWUoZndjdHgtPmRldikpOworCWlmIChmd2N0eC0+Y29kZSkKKwkJcmVsZWFzZV9maXJtd2FyZShmd2N0eC0+Y29kZSk7CisJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGZ3Y3R4LT5kZXYpOworCWtmcmVlKGZ3Y3R4KTsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfZndfcmVxdWVzdF9jb2RlX2RvbmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY3R4KQoreworCXN0cnVjdCBicmNtZl9mdyAqZndjdHggPSBjdHg7CisJaW50IHJldDsKKworCWJyY21mX2RiZyhUUkFDRSwgImVudGVyOiBkZXY9JXNcbiIsIGRldl9uYW1lKGZ3Y3R4LT5kZXYpKTsKKwlpZiAoIWZ3KQorCQlnb3RvIGZhaWw7CisKKwkvKiBvbmx5IHJlcXVlc3RlZCBjb2RlIHNvIGRvbmUgaGVyZSAqLworCWlmICghKGZ3Y3R4LT5mbGFncyAmIEJSQ01GX0ZXX1JFUVVFU1RfTlZSQU0pKSB7CisJCWZ3Y3R4LT5kb25lKGZ3Y3R4LT5kZXYsIGZ3LCBOVUxMLCAwKTsKKwkJa2ZyZWUoZndjdHgpOworCQlyZXR1cm47CisJfQorCWZ3Y3R4LT5jb2RlID0gZnc7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIGZ3Y3R4LT5udnJhbV9uYW1lLAorCQkJCSAgICAgIGZ3Y3R4LT5kZXYsIEdGUF9LRVJORUwsIGZ3Y3R4LAorCQkJCSAgICAgIGJyY21mX2Z3X3JlcXVlc3RfbnZyYW1fZG9uZSk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuOworCisJLyogd2hlbiBudnJhbSBpcyBvcHRpb25hbCBjYWxsIC5kb25lKCkgY2FsbGJhY2sgaGVyZSAqLworCWlmIChmd2N0eC0+ZmxhZ3MgJiBCUkNNRl9GV19SRVFfTlZfT1BUSU9OQUwpIHsKKwkJZndjdHgtPmRvbmUoZndjdHgtPmRldiwgZncsIE5VTEwsIDApOworCQlrZnJlZShmd2N0eCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBmYWlsZWQgbnZyYW0gcmVxdWVzdCAqLworCXJlbGVhc2VfZmlybXdhcmUoZncpOworZmFpbDoKKwlicmNtZl9kYmcoVFJBQ0UsICJmYWlsZWQ6IGRldj0lc1xuIiwgZGV2X25hbWUoZndjdHgtPmRldikpOworCWRldmljZV9yZWxlYXNlX2RyaXZlcihmd2N0eC0+ZGV2KTsKKwlrZnJlZShmd2N0eCk7Cit9CisKK2ludCBicmNtZl9md19nZXRfZmlybXdhcmVzKHN0cnVjdCBkZXZpY2UgKmRldiwgdTE2IGZsYWdzLAorCQkJICAgY29uc3QgY2hhciAqY29kZSwgY29uc3QgY2hhciAqbnZyYW0sCisJCQkgICB2b2lkICgqZndfY2IpKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkJCSB2b2lkICpudnJhbV9pbWFnZSwgdTMyIG52cmFtX2xlbikpCit7CisJc3RydWN0IGJyY21mX2Z3ICpmd2N0eDsKKworCWJyY21mX2RiZyhUUkFDRSwgImVudGVyOiBkZXY9JXNcbiIsIGRldl9uYW1lKGRldikpOworCWlmICghZndfY2IgfHwgIWNvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChmbGFncyAmIEJSQ01GX0ZXX1JFUVVFU1RfTlZSQU0pICYmICFudnJhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmd2N0eCA9IGt6YWxsb2Moc2l6ZW9mKCpmd2N0eCksIEdGUF9LRVJORUwpOworCWlmICghZndjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJZndjdHgtPmRldiA9IGRldjsKKwlmd2N0eC0+ZmxhZ3MgPSBmbGFnczsKKwlmd2N0eC0+ZG9uZSA9IGZ3X2NiOworCWlmIChmbGFncyAmIEJSQ01GX0ZXX1JFUVVFU1RfTlZSQU0pCisJCWZ3Y3R4LT5udnJhbV9uYW1lID0gbnZyYW07CisKKwlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIGNvZGUsIGRldiwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCwgZndjdHgsCisJCQkJICAgICAgIGJyY21mX2Z3X3JlcXVlc3RfY29kZV9kb25lKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMWJmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9maXJtd2FyZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBCUkNNRk1BQ19GSVJNV0FSRV9ICisjZGVmaW5lIEJSQ01GTUFDX0ZJUk1XQVJFX0gKKworI2RlZmluZSBCUkNNRl9GV19SRVFVRVNUCQkweDAwMEYKKyNkZWZpbmUgIEJSQ01GX0ZXX1JFUVVFU1RfTlZSQU0JCTB4MDAwMQorI2RlZmluZSBCUkNNRl9GV19SRVFfRkxBR1MJCTB4MDBGMAorI2RlZmluZSAgQlJDTUZfRldfUkVRX05WX09QVElPTkFMCTB4MDAxMAorCit2b2lkIGJyY21mX2Z3X252cmFtX2ZyZWUodm9pZCAqbnZyYW0pOworLyoKKyAqIFJlcXVlc3QgZmlybXdhcmUocykgYXN5bmNocm9ub3VzbHkuIFdoZW4gdGhlIGFzeW5jaHJvbm91cyByZXF1ZXN0CisgKiBmYWlscyBpdCB3aWxsIG5vdCB1c2UgdGhlIGNhbGxiYWNrLCBidXQgY2FsbCBkZXZpY2VfcmVsZWFzZV9kcml2ZXIoKQorICogaW5zdGVhZCB3aGljaCB3aWxsIGNhbGwgdGhlIGRyaXZlciAucmVtb3ZlKCkgY2FsbGJhY2suCisgKi8KK2ludCBicmNtZl9md19nZXRfZmlybXdhcmVzKHN0cnVjdCBkZXZpY2UgKmRldiwgdTE2IGZsYWdzLAorCQkJICAgY29uc3QgY2hhciAqY29kZSwgY29uc3QgY2hhciAqbnZyYW0sCisJCQkgICB2b2lkICgqZndfY2IpKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkJCSB2b2lkICpudnJhbV9pbWFnZSwgdTMyIG52cmFtX2xlbikpOworCisjZW5kaWYgLyogQlJDTUZNQUNfRklSTVdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Z3aWxfdHlwZXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9md2lsX3R5cGVzLmgKaW5kZXggNjE0ZTQ4OC4uMmJjNjhhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Z3aWxfdHlwZXMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZndpbF90eXBlcy5oCkBAIC01Myw2ICs1MywxNCBAQAogI2RlZmluZSBCUkNNRl9PQlNTX0NPRVhfT0ZGCQkwCiAjZGVmaW5lIEJSQ01GX09CU1NfQ09FWF9PTgkJMQogCisvKiBqb2luIHByZWZlcmVuY2UgdHlwZXMgZm9yIGpvaW5fcHJlZiBpb3ZhciAqLworZW51bSBicmNtZl9qb2luX3ByZWZfdHlwZXMgeworCUJSQ01GX0pPSU5fUFJFRl9SU1NJID0gMSwKKwlCUkNNRl9KT0lOX1BSRUZfV1BBLAorCUJSQ01GX0pPSU5fUFJFRl9CQU5ELAorCUJSQ01GX0pPSU5fUFJFRl9SU1NJX0RFTFRBLAorfTsKKwogZW51bSBicmNtZl9maWxfcDJwX2lmX3R5cGVzIHsKIAlCUkNNRl9GSUxfUDJQX0lGX0NMSUVOVCwKIAlCUkNNRl9GSUxfUDJQX0lGX0dPLApAQCAtMjgyLDYgKzI5MCwyMiBAQAogCV9fbGUxNiBjaGFuc3BlY19saXN0WzFdOwogfTsKIAorLyoqCisgKiBzdHJ1Y3Qgam9pbl9wcmVmIHBhcmFtcyAtIHBhcmFtZXRlcnMgZm9yIHByZWZlcnJlZCBqb2luIHNlbGVjdGlvbi4KKyAqCisgKiBAdHlwZTogcHJlZmVyZW5jZSB0eXBlIChzZWUgZW51bSBicmNtZl9qb2luX3ByZWZfdHlwZXMpLgorICogQGxlbjogbGVuZ3RoIG9mIGJ5dGVzIGZvbGxvd2luZyAoY3VycmVudGx5IGFsd2F5cyAyKS4KKyAqIEByc3NpX2dhaW46IHNpZ25hbCBnYWluIGZvciBzZWxlY3Rpb24gKG9ubHkgd2hlbiBAdHlwZSBpcyBSU1NJX0RFTFRBKS4KKyAqIEBiYW5kOiBiYW5kIHRvIHdoaWNoIHNlbGVjdGlvbiBwcmVmZXJlbmNlIGFwcGxpZXMuCisgKglUaGlzIGlzIHVzZWQgaWYgQHR5cGUgaXMgQkFORCBvciBSU1NJX0RFTFRBLgorICovCitzdHJ1Y3QgYnJjbWZfam9pbl9wcmVmX3BhcmFtcyB7CisJdTggdHlwZTsKKwl1OCBsZW47CisJdTggcnNzaV9nYWluOworCXU4IGJhbmQ7Cit9OworCiAvKiB1c2VkIGZvciBqb2luIHdpdGggb3Igd2l0aG91dCBhIHNwZWNpZmljIGJzc2lkIGFuZCBjaGFubmVsIGxpc3QgKi8KIHN0cnVjdCBicmNtZl9qb2luX3BhcmFtcyB7CiAJc3RydWN0IGJyY21mX3NzaWRfbGUgc3NpZF9sZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKaW5kZXggYzNlN2Q3Ni4uNjk5OTA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKQEAgLTQ3Niw2ICs0NzYsNyBAQAogCWJvb2wgYnVzX2Zsb3dfYmxvY2tlZDsKIAlib29sIGNyZWRpdG1hcF9yZWNlaXZlZDsKIAl1OCBtb2RlOworCWJvb2wgYXZvaWRfcXVldWVpbmc7CiB9OwogCiAvKgpAQCAtMTM2OSwxMyArMTM3MCwxMiBAQAogfQogCiBzdGF0aWMgaW50IGJyY21mX2Z3c190eHN0YXR1c19zdXBwcmVzc2VkKHN0cnVjdCBicmNtZl9md3NfaW5mbyAqZndzLCBpbnQgZmlmbywKLQkJCQkJIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBnZW5iaXQsCi0JCQkJCSB1MTYgc2VxKQorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaWZpZHgsCisJCQkJCSB1MzIgZ2VuYml0LCB1MTYgc2VxKQogewogCXN0cnVjdCBicmNtZl9md3NfbWFjX2Rlc2NyaXB0b3IgKmVudHJ5ID0gYnJjbWZfc2tiY2Ioc2tiKS0+bWFjOwogCXUzMiBoc2xvdDsKIAlpbnQgcmV0OwotCXU4IGlmaWR4OwogCiAJaHNsb3QgPSBicmNtZl9za2JfaHRvZF90YWdfZ2V0X2ZpZWxkKHNrYiwgSFNMT1QpOwogCkBAIC0xMzg5LDI5ICsxMzg5LDIxIEBACiAKIAllbnRyeS0+Z2VuZXJhdGlvbiA9IGdlbmJpdDsKIAotCXJldCA9IGJyY21mX3Byb3RvX2hkcnB1bGwoZndzLT5kcnZyLCBmYWxzZSwgJmlmaWR4LCBza2IpOwotCWlmIChyZXQgPT0gMCkgewotCQlicmNtZl9za2JfaHRvZF90YWdfc2V0X2ZpZWxkKHNrYiwgR0VORVJBVElPTiwgZ2VuYml0KTsKLQkJYnJjbWZfc2tiY2Ioc2tiKS0+aHRvZF9zZXEgPSBzZXE7Ci0JCWlmIChicmNtZl9za2JfaHRvZF9zZXFfZ2V0X2ZpZWxkKHNrYiwgRlJPTUZXKSkgewotCQkJYnJjbWZfc2tiX2h0b2Rfc2VxX3NldF9maWVsZChza2IsIEZST01EUlYsIDEpOwotCQkJYnJjbWZfc2tiX2h0b2Rfc2VxX3NldF9maWVsZChza2IsIEZST01GVywgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlicmNtZl9za2JfaHRvZF9zZXFfc2V0X2ZpZWxkKHNrYiwgRlJPTURSViwgMCk7Ci0JCX0KLQkJcmV0ID0gYnJjbWZfZndzX2VucShmd3MsIEJSQ01GX0ZXU19TS0JTVEFURV9TVVBQUkVTU0VELCBmaWZvLAotCQkJCSAgICBza2IpOworCWJyY21mX3NrYl9odG9kX3RhZ19zZXRfZmllbGQoc2tiLCBHRU5FUkFUSU9OLCBnZW5iaXQpOworCWJyY21mX3NrYmNiKHNrYiktPmh0b2Rfc2VxID0gc2VxOworCWlmIChicmNtZl9za2JfaHRvZF9zZXFfZ2V0X2ZpZWxkKHNrYiwgRlJPTUZXKSkgeworCQlicmNtZl9za2JfaHRvZF9zZXFfc2V0X2ZpZWxkKHNrYiwgRlJPTURSViwgMSk7CisJCWJyY21mX3NrYl9odG9kX3NlcV9zZXRfZmllbGQoc2tiLCBGUk9NRlcsIDApOworCX0gZWxzZSB7CisJCWJyY21mX3NrYl9odG9kX3NlcV9zZXRfZmllbGQoc2tiLCBGUk9NRFJWLCAwKTsKIAl9CisJcmV0ID0gYnJjbWZfZndzX2VucShmd3MsIEJSQ01GX0ZXU19TS0JTVEFURV9TVVBQUkVTU0VELCBmaWZvLCBza2IpOwogCiAJaWYgKHJldCAhPSAwKSB7Ci0JCS8qIHN1cHByZXNzIHEgaXMgZnVsbCBvciBoZHJwdWxsIGZhaWxlZCwgZHJvcCB0aGlzIHBhY2tldCAqLwotCQlicmNtZl9md3NfaGFuZ2VyX3BvcHBrdCgmZndzLT5oYW5nZXIsIGhzbG90LCAmc2tiLAotCQkJCQl0cnVlKTsKKwkJLyogc3VwcHJlc3MgcSBpcyBmdWxsIGRyb3AgdGhpcyBwYWNrZXQgKi8KKwkJYnJjbWZfZndzX2hhbmdlcl9wb3Bwa3QoJmZ3cy0+aGFuZ2VyLCBoc2xvdCwgJnNrYiwgdHJ1ZSk7CiAJfSBlbHNlIHsKLQkJLyoKLQkJICogTWFyayBzdXBwcmVzc2VkIHRvIGF2b2lkIGEgZG91YmxlIGZyZWUgZHVyaW5nCi0JCSAqIHdsZmMgY2xlYW51cAotCQkgKi8KKwkJLyogTWFyayBzdXBwcmVzc2VkIHRvIGF2b2lkIGEgZG91YmxlIGZyZWUgZHVyaW5nIHdsZmMgY2xlYW51cCAqLwogCQlicmNtZl9md3NfaGFuZ2VyX21hcmtfc3VwcHJlc3NlZCgmZndzLT5oYW5nZXIsIGhzbG90KTsKIAl9CiAKQEAgLTE0MjgsNiArMTQyMCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgYnJjbWZfc2tidWZmX2NiICpza2NiOwogCXN0cnVjdCBicmNtZl9md3NfbWFjX2Rlc2NyaXB0b3IgKmVudHJ5ID0gTlVMTDsKKwl1OCBpZmlkeDsKIAogCWJyY21mX2RiZyhEQVRBLCAiZmxhZ3MgJWRcbiIsIGZsYWdzKTsKIApAQCAtMTQ3NiwxMiArMTQ2OSwxNSBAQAogCX0KIAlicmNtZl9md3NfbWFjZGVzY19yZXR1cm5fcmVxX2NyZWRpdChza2IpOwogCisJaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoZndzLT5kcnZyLCBmYWxzZSwgJmlmaWR4LCBza2IpKSB7CisJCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmICghcmVtb3ZlX2Zyb21faGFuZ2VyKQotCQlyZXQgPSBicmNtZl9md3NfdHhzdGF0dXNfc3VwcHJlc3NlZChmd3MsIGZpZm8sIHNrYiwgZ2VuYml0LAotCQkJCQkJICAgIHNlcSk7Ci0KKwkJcmV0ID0gYnJjbWZfZndzX3R4c3RhdHVzX3N1cHByZXNzZWQoZndzLCBmaWZvLCBza2IsIGlmaWR4LAorCQkJCQkJICAgIGdlbmJpdCwgc2VxKTsKIAlpZiAocmVtb3ZlX2Zyb21faGFuZ2VyIHx8IHJldCkKLQkJYnJjbWZfdHhmaW5hbGl6ZShmd3MtPmRydnIsIHNrYiwgdHJ1ZSk7CisJCWJyY21mX3R4ZmluYWxpemUoZndzLT5kcnZyLCBza2IsIGlmaWR4LCB0cnVlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTg2OCw3ICsxODY0LDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSk7CiAJaW50IGZpZm8gPSBCUkNNRl9GV1NfRklGT19CQ01DOwogCWJvb2wgbXVsdGljYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZWgtPmhfZGVzdCk7Ci0JYm9vbCBwYWUgPSBlaC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9QQUUpOworCWludCByYyA9IDA7CiAKIAlicmNtZl9kYmcoREFUQSwgInR4IHByb3RvPTB4JVhcbiIsIG50b2hzKGVoLT5oX3Byb3RvKSk7CiAJLyogZGV0ZXJtaW5lIHRoZSBwcmlvcml0eSAqLwpAQCAtMTg3Niw4ICsxODcyLDEzIEBACiAJCXNrYi0+cHJpb3JpdHkgPSBjZmc4MDIxMV9jbGFzc2lmeTgwMjFkKHNrYiwgTlVMTCk7CiAKIAlkcnZyLT50eF9tdWx0aWNhc3QgKz0gISFtdWx0aWNhc3Q7Ci0JaWYgKHBhZSkKLQkJYXRvbWljX2luYygmaWZwLT5wZW5kXzgwMjF4X2NudCk7CisKKwlpZiAoZndzLT5hdm9pZF9xdWV1ZWluZykgeworCQlyYyA9IGJyY21mX3Byb3RvX3R4ZGF0YShkcnZyLCBpZnAtPmlmaWR4LCAwLCBza2IpOworCQlpZiAocmMgPCAwKQorCQkJYnJjbWZfdHhmaW5hbGl6ZShkcnZyLCBza2IsIGlmcC0+aWZpZHgsIGZhbHNlKTsKKwkJcmV0dXJuIHJjOworCX0KIAogCS8qIHNldCBjb250cm9sIGJ1ZmZlciBpbmZvcm1hdGlvbiAqLwogCXNrY2ItPmlmX2ZsYWdzID0gMDsKQEAgLTE4OTksMTUgKzE5MDAsMTIgQEAKIAkJYnJjbWZfZndzX3NjaGVkdWxlX2RlcShmd3MpOwogCX0gZWxzZSB7CiAJCWJyY21mX2VycigiZHJvcCBza2I6IG5vIGhhbmdlciBzbG90XG4iKTsKLQkJaWYgKHBhZSkgewotCQkJYXRvbWljX2RlYygmaWZwLT5wZW5kXzgwMjF4X2NudCk7Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmaWZwLT5wZW5kXzgwMjF4X3dhaXQpKQotCQkJCXdha2VfdXAoJmlmcC0+cGVuZF84MDIxeF93YWl0KTsKLQkJfQotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHNrYik7CisJCWJyY21mX3R4ZmluYWxpemUoZHJ2ciwgc2tiLCBpZnAtPmlmaWR4LCBmYWxzZSk7CisJCXJjID0gLUVOT01FTTsKIAl9CiAJYnJjbWZfZndzX3VubG9jayhmd3MpOwotCXJldHVybiAwOworCisJcmV0dXJuIHJjOwogfQogCiB2b2lkIGJyY21mX2Z3c19yZXNldF9pbnRlcmZhY2Uoc3RydWN0IGJyY21mX2lmICppZnApCkBAIC0xOTgyLDcgKzE5ODAsOCBAQAogCQkJCXJldCA9IGJyY21mX3Byb3RvX3R4ZGF0YShkcnZyLCBpZmlkeCwgMCwgc2tiKTsKIAkJCQlicmNtZl9md3NfbG9jayhmd3MpOwogCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmNtZl90eGZpbmFsaXplKGRydnIsIHNrYiwgZmFsc2UpOworCQkJCQlicmNtZl90eGZpbmFsaXplKGRydnIsIHNrYiwgaWZpZHgsCisJCQkJCQkJIGZhbHNlKTsKIAkJCQlpZiAoZndzLT5idXNfZmxvd19ibG9ja2VkKQogCQkJCQlicmVhazsKIAkJCX0KQEAgLTIwMzksNiArMjAzOCwxMyBAQAogCWZ3cy0+ZHJ2ciA9IGRydnI7CiAJZndzLT5mY21vZGUgPSBmY21vZGU7CiAKKwlpZiAoKGRydnItPmJ1c19pZi0+YWx3YXlzX3VzZV9md3NfcXVldWUgPT0gZmFsc2UpICYmCisJICAgIChmY21vZGUgPT0gQlJDTUZfRldTX0ZDTU9ERV9OT05FKSkgeworCQlmd3MtPmF2b2lkX3F1ZXVlaW5nID0gdHJ1ZTsKKwkJYnJjbWZfZGJnKElORk8sICJGV1MgcXVldWVpbmcgd2lsbCBiZSBhdm9pZGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJZndzLT5md3Nfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYnJjbWZfZndzX3dxIik7CiAJaWYgKGZ3cy0+ZndzX3dxID09IE5VTEwpIHsKIAkJYnJjbWZfZXJyKCJ3b3JrcXVldWUgY3JlYXRpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9udnJhbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL252cmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZWY4NmRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9udnJhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLQotI2luY2x1ZGUgIm52cmFtLmgiCi0KLS8qIGJyY21mX252cmFtX3N0cmlwIDpUYWtlcyBhIGJ1ZmZlciBvZiAiPHZhcj49PHZhbHVlPlxuIiBsaW5lcyByZWFkIGZyb20gYSBmaWxlCi0gKiBhbmQgZW5kaW5nIGluIGEgTlVMLiBSZW1vdmVzIGNhcnJpYWdlIHJldHVybnMsIGVtcHR5IGxpbmVzLCBjb21tZW50IGxpbmVzLAotICogYW5kIGNvbnZlcnRzIG5ld2xpbmVzIHRvIE5VTHMuIFNob3J0ZW5zIGJ1ZmZlciBhcyBuZWVkZWQgYW5kIHBhZHMgd2l0aCBOVUxzLgotICogRW5kIG9mIGJ1ZmZlciBpcyBjb21wbGV0ZWQgd2l0aCB0b2tlbiBpZGVudGlmeWluZyBsZW5ndGggb2YgYnVmZmVyLgotICovCi12b2lkICpicmNtZl9udnJhbV9zdHJpcChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm52LCB1MzIgKm5ld19sZW5ndGgpCi17Ci0JdTggKm52cmFtOwotCXUzMiBpOwotCXUzMiBsZW47Ci0JdTMyIGNvbHVtbjsKLQl1OCB2YWw7Ci0JYm9vbCBjb21tZW50OwotCXUzMiB0b2tlbjsKLQlfX2xlMzIgdG9rZW5fbGU7Ci0KLQkvKiBBbGxvYyBmb3IgZXh0cmEgMCBieXRlICsgcm91bmR1cCBieSA0ICsgbGVuZ3RoIGZpZWxkICovCi0JbnZyYW0gPSBrbWFsbG9jKG52LT5zaXplICsgMSArIDMgKyBzaXplb2YodG9rZW5fbGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW52cmFtKQotCQlyZXR1cm4gTlVMTDsKLQotCWxlbiA9IDA7Ci0JY29sdW1uID0gMDsKLQljb21tZW50ID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IG52LT5zaXplOyBpKyspIHsKLQkJdmFsID0gbnYtPmRhdGFbaV07Ci0JCWlmICh2YWwgPT0gMCkKLQkJCWJyZWFrOwotCQlpZiAodmFsID09ICdccicpCi0JCQljb250aW51ZTsKLQkJaWYgKGNvbW1lbnQgJiYgKHZhbCAhPSAnXG4nKSkKLQkJCWNvbnRpbnVlOwotCQljb21tZW50ID0gZmFsc2U7Ci0JCWlmICh2YWwgPT0gJyMnKSB7Ci0JCQljb21tZW50ID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh2YWwgPT0gJ1xuJykgewotCQkJaWYgKGNvbHVtbiA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJbnZyYW1bbGVuXSA9IDA7Ci0JCQlsZW4rKzsKLQkJCWNvbHVtbiA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQludnJhbVtsZW5dID0gdmFsOwotCQlsZW4rKzsKLQkJY29sdW1uKys7Ci0JfQotCWNvbHVtbiA9IGxlbjsKLQkqbmV3X2xlbmd0aCA9IHJvdW5kdXAobGVuICsgMSwgNCk7Ci0Jd2hpbGUgKGNvbHVtbiAhPSAqbmV3X2xlbmd0aCkgewotCQludnJhbVtjb2x1bW5dID0gMDsKLQkJY29sdW1uKys7Ci0JfQotCi0JdG9rZW4gPSAqbmV3X2xlbmd0aCAvIDQ7Ci0JdG9rZW4gPSAofnRva2VuIDw8IDE2KSB8ICh0b2tlbiAmIDB4MDAwMEZGRkYpOwotCXRva2VuX2xlID0gY3B1X3RvX2xlMzIodG9rZW4pOwotCi0JbWVtY3B5KCZudnJhbVsqbmV3X2xlbmd0aF0sICZ0b2tlbl9sZSwgc2l6ZW9mKHRva2VuX2xlKSk7Ci0JKm5ld19sZW5ndGggKz0gc2l6ZW9mKHRva2VuX2xlKTsKLQotCXJldHVybiBudnJhbTsKLX0KLQotdm9pZCBicmNtZl9udnJhbV9mcmVlKHZvaWQgKm52cmFtKQotewotCWtmcmVlKG52cmFtKTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvbnZyYW0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9udnJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU0NTgwOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvbnZyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2lmbmRlZiBCUkNNRk1BQ19OVlJBTV9ICi0jZGVmaW5lIEJSQ01GTUFDX05WUkFNX0gKLQotCi12b2lkICpicmNtZl9udnJhbV9zdHJpcChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm52LCB1MzIgKm5ld19sZW5ndGgpOwotdm9pZCBicmNtZl9udnJhbV9mcmVlKHZvaWQgKm52cmFtKTsKLQotCi0jZW5kaWYgLyogQlJDTUZNQUNfTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jCmluZGV4IDI0ZjY1Y2Q1Li42ZGI1MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8ZGhkX2J1cy5oPgogI2luY2x1ZGUgPGRoZF9kYmcuaD4KIAorI2luY2x1ZGUgImZpcm13YXJlLmgiCiAjaW5jbHVkZSAidXNiX3JkbC5oIgogI2luY2x1ZGUgInVzYi5oIgogCkBAIC02MSwxMiArNjIsNiBAQAogCXU4ICppbWFnZTsKIAlpbnQgaW1hZ2VfbGVuOwogfTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGZ3X2ltYWdlX2xpc3Q7Ci0KLXN0cnVjdCBpbnRyX3RyYW5zZmVyX2J1ZiB7Ci0JdTMyIG5vdGlmaWNhdGlvbjsKLQl1MzIgcmVzZXJ2ZWQ7Ci19OwogCiBzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gewogCXN0cnVjdCBicmNtZl91c2JkZXYgYnVzX3B1YjsgLyogTVVTVCBCRSBGSVJTVCAqLwpAQCAtNzUsNyArNzAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcnhfcG9zdHE7CiAJc3RydWN0IGxpc3RfaGVhZCB0eF9mcmVlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHR4X3Bvc3RxOwotCXVpbnQgcnhfcGlwZSwgdHhfcGlwZSwgaW50cl9waXBlLCByeF9waXBlMjsKKwl1aW50IHJ4X3BpcGUsIHR4X3BpcGUsIHJ4X3BpcGUyOwogCiAJaW50IHJ4X2xvd193YXRlcm1hcms7CiAJaW50IHR4X2xvd193YXRlcm1hcms7CkBAIC04Nyw3ICs4Miw3IEBACiAJc3RydWN0IGJyY21mX3VzYnJlcSAqdHhfcmVxczsKIAlzdHJ1Y3QgYnJjbWZfdXNicmVxICpyeF9yZXFzOwogCi0JdTggKmltYWdlOwkvKiBidWZmZXIgZm9yIGNvbWJpbmUgZncgYW5kIG52cmFtICovCisJY29uc3QgdTggKmltYWdlOwkvKiBidWZmZXIgZm9yIGNvbWJpbmUgZncgYW5kIG52cmFtICovCiAJaW50IGltYWdlX2xlbjsKIAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CkBAIC0xMDQsMTAgKzk5LDYgQEAKIAl1bG9uZyBjdGxfb3A7CiAKIAlzdHJ1Y3QgdXJiICpidWxrX3VyYjsgLyogdXNlZCBmb3IgRlcgZG93bmxvYWQgKi8KLQlzdHJ1Y3QgdXJiICppbnRyX3VyYjsgLyogVVJCIGZvciBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KLQlpbnQgaW50cl9zaXplOyAgICAgICAgICAvKiBTaXplIG9mIGludGVycnVwdCBtZXNzYWdlICovCi0JaW50IGludGVydmFsOyAgICAgICAgICAgLyogSW50ZXJydXB0IHBvbGxpbmcgaW50ZXJ2YWwgKi8KLQlzdHJ1Y3QgaW50cl90cmFuc2Zlcl9idWYgaW50cjsgLyogRGF0YSBidWZmZXIgZm9yIGludGVycnVwdCBlbmRwb2ludCAqLwogfTsKIAogc3RhdGljIHZvaWQgYnJjbWZfdXNiX3J4X3JlZmlsbChzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gKmRldmluZm8sCkBAIC01MzEsMzkgKzUyMiw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotYnJjbWZfdXNiX2ludHJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBicmNtZl91c2JkZXZfaW5mbyAqZGV2aW5mbyA9Ci0JCQkoc3RydWN0IGJyY21mX3VzYmRldl9pbmZvICopdXJiLT5jb250ZXh0OwotCWludCBlcnI7Ci0KLQlicmNtZl9kYmcoVVNCLCAiRW50ZXIsIHVyYi0+c3RhdHVzPSVkXG4iLCB1cmItPnN0YXR1cyk7Ci0KLQlpZiAoZGV2aW5mbyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMpKSB7Ci0JCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8Ci0JCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOIHx8Ci0JCSAgICB1cmItPnN0YXR1cyA9PSAtRU5PREVWKSB7Ci0JCQlicmNtZl91c2Jfc3RhdGVfY2hhbmdlKGRldmluZm8sCi0JCQkJCSAgICAgICBCUkNNRk1BQ19VU0JfU1RBVEVfRE9XTik7Ci0JCX0KLQl9Ci0KLQlpZiAoZGV2aW5mby0+YnVzX3B1Yi5zdGF0ZSA9PSBCUkNNRk1BQ19VU0JfU1RBVEVfRE9XTikgewotCQlicmNtZl9lcnIoImludHIgY2Igd2hlbiBEQlVTIGRvd24sIGlnbm9yaW5nXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChkZXZpbmZvLT5idXNfcHViLnN0YXRlID09IEJSQ01GTUFDX1VTQl9TVEFURV9VUCkgewotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihkZXZpbmZvLT5pbnRyX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChlcnIpCi0JCQlicmNtZl9lcnIoInVzYl9zdWJtaXRfdXJiLCBlcnI9JWRcbiIsIGVycik7Ci0JfQotfQotCiBzdGF0aWMgaW50IGJyY21mX3VzYl90eChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGJyY21mX3VzYmRldl9pbmZvICpkZXZpbmZvID0gYnJjbWZfdXNiX2dldF9idXNpbmZvKGRldik7CkBAIC02MTksNyArNTc3LDYgQEAKIHsKIAlzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gKmRldmluZm8gPSBicmNtZl91c2JfZ2V0X2J1c2luZm8oZGV2KTsKIAl1MTYgaWZudW07Ci0JaW50IHJldDsKIAogCWJyY21mX2RiZyhVU0IsICJFbnRlclxuIik7CiAJaWYgKGRldmluZm8tPmJ1c19wdWIuc3RhdGUgPT0gQlJDTUZNQUNfVVNCX1NUQVRFX1VQKQpAQCAtNjI4LDIzICs1ODUsNiBAQAogCS8qIFN1Y2Nlc3MsIGluZGljYXRlIGRldmluZm8gaXMgZnVsbHkgdXAgKi8KIAlicmNtZl91c2Jfc3RhdGVfY2hhbmdlKGRldmluZm8sIEJSQ01GTUFDX1VTQl9TVEFURV9VUCk7CiAKLQlpZiAoZGV2aW5mby0+aW50cl91cmIpIHsKLQkJdXNiX2ZpbGxfaW50X3VyYihkZXZpbmZvLT5pbnRyX3VyYiwgZGV2aW5mby0+dXNiZGV2LAotCQkJZGV2aW5mby0+aW50cl9waXBlLAotCQkJJmRldmluZm8tPmludHIsCi0JCQlkZXZpbmZvLT5pbnRyX3NpemUsCi0JCQkodXNiX2NvbXBsZXRlX3QpYnJjbWZfdXNiX2ludHJfY29tcGxldGUsCi0JCQlkZXZpbmZvLAotCQkJZGV2aW5mby0+aW50ZXJ2YWwpOwotCi0JCXJldCA9IHVzYl9zdWJtaXRfdXJiKGRldmluZm8tPmludHJfdXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHJldCkgewotCQkJYnJjbWZfZXJyKCJVU0JfU1VCTUlUX1VSQiBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsCi0JCQkJICByZXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KIAlpZiAoZGV2aW5mby0+Y3RsX3VyYikgewogCQlkZXZpbmZvLT5jdGxfaW5fcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXZpbmZvLT51c2JkZXYsIDApOwogCQlkZXZpbmZvLT5jdGxfb3V0X3BpcGUgPSB1c2Jfc25kY3RybHBpcGUoZGV2aW5mby0+dXNiZGV2LCAwKTsKQEAgLTY4MSw4ICs2MjEsNiBAQAogCQlyZXR1cm47CiAKIAlicmNtZl91c2Jfc3RhdGVfY2hhbmdlKGRldmluZm8sIEJSQ01GTUFDX1VTQl9TVEFURV9ET1dOKTsKLQlpZiAoZGV2aW5mby0+aW50cl91cmIpCi0JCXVzYl9raWxsX3VyYihkZXZpbmZvLT5pbnRyX3VyYik7CiAKIAlpZiAoZGV2aW5mby0+Y3RsX3VyYikKIAkJdXNiX2tpbGxfdXJiKGRldmluZm8tPmN0bF91cmIpOwpAQCAtMTAyMSw3ICs5NTksNyBAQAogCX0KIAogCWVyciA9IGJyY21mX3VzYl9kbHN0YXJ0KGRldmluZm8sCi0JCWRldmluZm8tPmltYWdlLCBkZXZpbmZvLT5pbWFnZV9sZW4pOworCQkodTggKilkZXZpbmZvLT5pbWFnZSwgZGV2aW5mby0+aW1hZ2VfbGVuKTsKIAlpZiAoZXJyID09IDApCiAJCWVyciA9IGJyY21mX3VzYl9kbHJ1bihkZXZpbmZvKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTAzNiw3ICs5NzQsNiBAQAogCWJyY21mX3VzYl9mcmVlX3EoJmRldmluZm8tPnJ4X2ZyZWVxLCBmYWxzZSk7CiAJYnJjbWZfdXNiX2ZyZWVfcSgmZGV2aW5mby0+dHhfZnJlZXEsIGZhbHNlKTsKIAotCXVzYl9mcmVlX3VyYihkZXZpbmZvLT5pbnRyX3VyYik7CiAJdXNiX2ZyZWVfdXJiKGRldmluZm8tPmN0bF91cmIpOwogCXVzYl9mcmVlX3VyYihkZXZpbmZvLT5idWxrX3VyYik7CiAKQEAgLTEwODAsNjggKzEwMTcsMjAgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfdXNiX2dldF9mdyhzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gKmRldmluZm8pCitzdGF0aWMgY29uc3QgY2hhciAqYnJjbWZfdXNiX2dldF9md25hbWUoc3RydWN0IGJyY21mX3VzYmRldl9pbmZvICpkZXZpbmZvKQogewotCXM4ICpmd25hbWU7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQlzdHJ1Y3QgYnJjbWZfdXNiX2ltYWdlICpmd19pbWFnZTsKLQlpbnQgZXJyOwotCi0JYnJjbWZfZGJnKFVTQiwgIkVudGVyXG4iKTsKIAlzd2l0Y2ggKGRldmluZm8tPmJ1c19wdWIuZGV2aWQpIHsKIAljYXNlIDQzMTQzOgotCQlmd25hbWUgPSBCUkNNRl9VU0JfNDMxNDNfRldfTkFNRTsKLQkJYnJlYWs7CisJCXJldHVybiBCUkNNRl9VU0JfNDMxNDNfRldfTkFNRTsKIAljYXNlIDQzMjM1OgogCWNhc2UgNDMyMzY6CiAJY2FzZSA0MzIzODoKLQkJZnduYW1lID0gQlJDTUZfVVNCXzQzMjM2X0ZXX05BTUU7Ci0JCWJyZWFrOworCQlyZXR1cm4gQlJDTUZfVVNCXzQzMjM2X0ZXX05BTUU7CiAJY2FzZSA0MzI0MjoKLQkJZnduYW1lID0gQlJDTUZfVVNCXzQzMjQyX0ZXX05BTUU7Ci0JCWJyZWFrOworCQlyZXR1cm4gQlJDTUZfVVNCXzQzMjQyX0ZXX05BTUU7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOworCQlyZXR1cm4gTlVMTDsKIAl9Ci0JYnJjbWZfZGJnKFVTQiwgIkxvYWRpbmcgRlcgJXNcbiIsIGZ3bmFtZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShmd19pbWFnZSwgJmZ3X2ltYWdlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGZ3X2ltYWdlLT5md25hbWUgPT0gZnduYW1lKSB7Ci0JCQlkZXZpbmZvLT5pbWFnZSA9IGZ3X2ltYWdlLT5pbWFnZTsKLQkJCWRldmluZm8tPmltYWdlX2xlbiA9IGZ3X2ltYWdlLT5pbWFnZV9sZW47Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkvKiBmdyBpbWFnZSBub3QgeWV0IGxvYWRlZC4gTG9hZCBpdCBub3cgYW5kIGFkZCB0byBsaXN0ICovCi0JZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3bmFtZSwgZGV2aW5mby0+ZGV2KTsKLQlpZiAoIWZ3KSB7Ci0JCWJyY21mX2VycigiZmFpbCB0byByZXF1ZXN0IGZpcm13YXJlICVzXG4iLCBmd25hbWUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoY2hlY2tfZmlsZShmdy0+ZGF0YSkgPCAwKSB7Ci0JCWJyY21mX2VycigiaW52YWxpZCBmaXJtd2FyZSAlc1xuIiwgZnduYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZndfaW1hZ2UgPSBremFsbG9jKHNpemVvZigqZndfaW1hZ2UpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWZ3X2ltYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKLQlJTklUX0xJU1RfSEVBRCgmZndfaW1hZ2UtPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJmZ3X2ltYWdlLT5saXN0LCAmZndfaW1hZ2VfbGlzdCk7Ci0JZndfaW1hZ2UtPmZ3bmFtZSA9IGZ3bmFtZTsKLQlmd19pbWFnZS0+aW1hZ2UgPSB2bWFsbG9jKGZ3LT5zaXplKTsKLQlpZiAoIWZ3X2ltYWdlLT5pbWFnZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1jcHkoZndfaW1hZ2UtPmltYWdlLCBmdy0+ZGF0YSwgZnctPnNpemUpOwotCWZ3X2ltYWdlLT5pbWFnZV9sZW4gPSBmdy0+c2l6ZTsKLQotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCi0JZGV2aW5mby0+aW1hZ2UgPSBmd19pbWFnZS0+aW1hZ2U7Ci0JZGV2aW5mby0+aW1hZ2VfbGVuID0gZndfaW1hZ2UtPmltYWdlX2xlbjsKLQotCXJldHVybiAwOwogfQogCiAKQEAgLTExODYsMTEgKzEwNzUsNiBAQAogCQlnb3RvIGVycm9yOwogCWRldmluZm8tPnR4X2ZyZWVjb3VudCA9IG50eHE7CiAKLQlkZXZpbmZvLT5pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkZXZpbmZvLT5pbnRyX3VyYikgewotCQlicmNtZl9lcnIoInVzYl9hbGxvY191cmIgKGludHIpIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQogCWRldmluZm8tPmN0bF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCWlmICghZGV2aW5mby0+Y3RsX3VyYikgewogCQlicmNtZl9lcnIoInVzYl9hbGxvY191cmIgKGN0bCkgZmFpbGVkXG4iKTsKQEAgLTEyMDIsMTYgKzEwODYsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWlmICghYnJjbWZfdXNiX2RsbmVlZGVkKGRldmluZm8pKQotCQlyZXR1cm4gJmRldmluZm8tPmJ1c19wdWI7Ci0KLQlicmNtZl9kYmcoVVNCLCAiU3RhcnQgZncgZG93bmxvYWRpbmdcbiIpOwotCWlmIChicmNtZl91c2JfZ2V0X2Z3KGRldmluZm8pKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGJyY21mX3VzYl9md19kb3dubG9hZChkZXZpbmZvKSkKLQkJZ290byBlcnJvcjsKLQogCXJldHVybiAmZGV2aW5mby0+YnVzX3B1YjsKIAogZXJyb3I6CkBAIC0xMjIyLDE4ICsxMDk2LDc3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYnJjbWZfYnVzX29wcyBicmNtZl91c2JfYnVzX29wcyA9IHsKIAkudHhkYXRhID0gYnJjbWZfdXNiX3R4LAotCS5pbml0ID0gYnJjbWZfdXNiX3VwLAogCS5zdG9wID0gYnJjbWZfdXNiX2Rvd24sCiAJLnR4Y3RsID0gYnJjbWZfdXNiX3R4X2N0bHBrdCwKIAkucnhjdGwgPSBicmNtZl91c2JfcnhfY3RscGt0LAogfTsKIAorc3RhdGljIGludCBicmNtZl91c2JfYnVzX3NldHVwKHN0cnVjdCBicmNtZl91c2JkZXZfaW5mbyAqZGV2aW5mbykKK3sKKwlpbnQgcmV0OworCisJLyogQXR0YWNoIHRvIHRoZSBjb21tb24gZHJpdmVyIGludGVyZmFjZSAqLworCXJldCA9IGJyY21mX2F0dGFjaChkZXZpbmZvLT5kZXYpOworCWlmIChyZXQpIHsKKwkJYnJjbWZfZXJyKCJicmNtZl9hdHRhY2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBicmNtZl91c2JfdXAoZGV2aW5mby0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBicmNtZl9idXNfc3RhcnQoZGV2aW5mby0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJYnJjbWZfZGV0YWNoKGRldmluZm8tPmRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfdXNiX3Byb2JlX3BoYXNlMihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQkgICB2b2lkICpudnJhbSwgdTMyIG52bGVuKQoreworCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl91c2JkZXZfaW5mbyAqZGV2aW5mbzsKKwlpbnQgcmV0OworCisJYnJjbWZfZGJnKFVTQiwgIlN0YXJ0IGZ3IGRvd25sb2FkaW5nXG4iKTsKKwlyZXQgPSBjaGVja19maWxlKGZ3LT5kYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQlicmNtZl9lcnIoImludmFsaWQgZmlybXdhcmVcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXZpbmZvID0gYnVzLT5idXNfcHJpdi51c2ItPmRldmluZm87CisJZGV2aW5mby0+aW1hZ2UgPSBmdy0+ZGF0YTsKKwlkZXZpbmZvLT5pbWFnZV9sZW4gPSBmdy0+c2l6ZTsKKworCXJldCA9IGJyY21mX3VzYl9md19kb3dubG9hZChkZXZpbmZvKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gYnJjbWZfdXNiX2J1c19zZXR1cChkZXZpbmZvKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuOworZXJyb3I6CisJYnJjbWZfZGJnKFRSQUNFLCAiZmFpbGVkOiBkZXY9JXMsIGVycj0lZFxuIiwgZGV2X25hbWUoZGV2KSwgcmV0KTsKKwlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKK30KKwogc3RhdGljIGludCBicmNtZl91c2JfcHJvYmVfY2Ioc3RydWN0IGJyY21mX3VzYmRldl9pbmZvICpkZXZpbmZvKQogewogCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IE5VTEw7CiAJc3RydWN0IGJyY21mX3VzYmRldiAqYnVzX3B1YiA9IE5VTEw7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZpbmZvLT5kZXY7CisJaW50IHJldDsKIAogCWJyY21mX2RiZyhVU0IsICJFbnRlclxuIik7CiAJYnVzX3B1YiA9IGJyY21mX3VzYl9hdHRhY2goZGV2aW5mbywgQlJDTUZfVVNCX05SWFEsIEJSQ01GX1VTQl9OVFhRKTsKQEAgLTEyNTQsMjIgKzExODcsMTggQEAKIAlidXMtPmNoaXAgPSBidXNfcHViLT5kZXZpZDsKIAlidXMtPmNoaXByZXYgPSBidXNfcHViLT5jaGlwcmV2OwogCWJ1cy0+cHJvdG9fdHlwZSA9IEJSQ01GX1BST1RPX0JDREM7CisJYnVzLT5hbHdheXNfdXNlX2Z3c19xdWV1ZSA9IHRydWU7CiAKLQkvKiBBdHRhY2ggdG8gdGhlIGNvbW1vbiBkcml2ZXIgaW50ZXJmYWNlICovCi0JcmV0ID0gYnJjbWZfYXR0YWNoKGRldik7Ci0JaWYgKHJldCkgewotCQlicmNtZl9lcnIoImJyY21mX2F0dGFjaCBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWw7CisJaWYgKCFicmNtZl91c2JfZGxuZWVkZWQoZGV2aW5mbykpIHsKKwkJcmV0ID0gYnJjbWZfdXNiX2J1c19zZXR1cChkZXZpbmZvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKIAl9Ci0KLQlyZXQgPSBicmNtZl9idXNfc3RhcnQoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWJyY21mX2VycigiZG9uZ2xlIGlzIG5vdCByZXNwb25kaW5nXG4iKTsKLQkJYnJjbWZfZGV0YWNoKGRldik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KKwkvKiByZXF1ZXN0IGZpcm13YXJlIGhlcmUgKi8KKwlicmNtZl9md19nZXRfZmlybXdhcmVzKGRldiwgMCwgYnJjbWZfdXNiX2dldF9md25hbWUoZGV2aW5mbyksIE5VTEwsCisJCQkgICAgICAgYnJjbWZfdXNiX3Byb2JlX3BoYXNlMik7CiAJcmV0dXJuIDA7CisKIGZhaWw6CiAJLyogUmVsZWFzZSByZXNvdXJjZXMgaW4gcmV2ZXJzZSBvcmRlciAqLwogCWtmcmVlKGJ1cyk7CkBAIC0xMzU3LDkgKzEyODYsNiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JZW5kcG9pbnRfbnVtID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JZGV2aW5mby0+aW50cl9waXBlID0gdXNiX3JjdmludHBpcGUodXNiLCBlbmRwb2ludF9udW0pOwotCiAJZGV2aW5mby0+cnhfcGlwZSA9IDA7CiAJZGV2aW5mby0+cnhfcGlwZTIgPSAwOwogCWRldmluZm8tPnR4X3BpcGUgPSAwOwpAQCAtMTM5MSwxNiArMTMxNyw5IEBACiAJCX0KIAl9CiAKLQkvKiBBbGxvY2F0ZSBpbnRlcnJ1cHQgVVJCIGFuZCBkYXRhIGJ1ZmZlciAqLwotCS8qIFJORElTIHNheXMgOC1ieXRlIGludHIsIG91ciBvbGQgZHJpdmVycyB1c2VkIDQtYnl0ZSAqLwotCWlmIChJRkVQREVTQyh1c2IsIENPTlRST0xfSUYsIDApLndNYXhQYWNrZXRTaXplID09IGNwdV90b19sZTE2KDE2KSkKLQkJZGV2aW5mby0+aW50cl9zaXplID0gODsKLQllbHNlCi0JCWRldmluZm8tPmludHJfc2l6ZSA9IDQ7Ci0KLQlkZXZpbmZvLT5pbnRlcnZhbCA9IElGRVBERVNDKHVzYiwgQ09OVFJPTF9JRiwgMCkuYkludGVydmFsOwotCi0JaWYgKHVzYi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJaWYgKHVzYi0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQorCQlicmNtZl9kYmcoVVNCLCAiQnJvYWRjb20gc3VwZXIgc3BlZWQgVVNCIHdpcmVsZXNzIGRldmljZSBkZXRlY3RlZFxuIik7CisJZWxzZSBpZiAodXNiLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJYnJjbWZfZGJnKFVTQiwgIkJyb2FkY29tIGhpZ2ggc3BlZWQgVVNCIHdpcmVsZXNzIGRldmljZSBkZXRlY3RlZFxuIik7CiAJZWxzZQogCQlicmNtZl9kYmcoVVNCLCAiQnJvYWRjb20gZnVsbCBzcGVlZCBVU0Igd2lyZWxlc3MgZGV2aWNlIGRldGVjdGVkXG4iKTsKQEAgLTE0NTUsMjMgKzEzNzQsMTggQEAKIAlzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gKmRldmluZm8gPSBicmNtZl91c2JfZ2V0X2J1c2luZm8oJnVzYi0+ZGV2KTsKIAogCWJyY21mX2RiZyhVU0IsICJFbnRlclxuIik7Ci0JaWYgKCFicmNtZl9hdHRhY2goZGV2aW5mby0+ZGV2KSkKLQkJcmV0dXJuIGJyY21mX2J1c19zdGFydCgmdXNiLT5kZXYpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGJyY21mX3VzYl9idXNfc2V0dXAoZGV2aW5mbyk7CiB9CiAKIHN0YXRpYyBpbnQgYnJjbWZfdXNiX3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgYnJjbWZfdXNiZGV2X2luZm8gKmRldmluZm8gPSBicmNtZl91c2JfZ2V0X2J1c2luZm8oJnVzYi0+ZGV2KTsKLQogCWJyY21mX2RiZyhVU0IsICJFbnRlclxuIik7CiAKLQlpZiAoIWJyY21mX3VzYl9md19kb3dubG9hZChkZXZpbmZvKSkKLQkJcmV0dXJuIGJyY21mX3VzYl9yZXN1bWUoaW50Zik7Ci0KLQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gYnJjbWZfZndfZ2V0X2Zpcm13YXJlcygmdXNiLT5kZXYsIDAsCisJCQkJICAgICAgYnJjbWZfdXNiX2dldF9md25hbWUoZGV2aW5mbyksIE5VTEwsCisJCQkJICAgICAgYnJjbWZfdXNiX3Byb2JlX3BoYXNlMik7CiB9CiAKICNkZWZpbmUgQlJDTUZfVVNCX1ZFTkRPUl9JRF9CUk9BRENPTQkweDBhNWMKQEAgLTE1MDYsMTYgKzE0MjAsNiBAQAogCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKIH07CiAKLXN0YXRpYyB2b2lkIGJyY21mX3JlbGVhc2VfZncoc3RydWN0IGxpc3RfaGVhZCAqcSkKLXsKLQlzdHJ1Y3QgYnJjbWZfdXNiX2ltYWdlICpmd19pbWFnZSwgKm5leHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZndfaW1hZ2UsIG5leHQsIHEsIGxpc3QpIHsKLQkJdmZyZWUoZndfaW1hZ2UtPmltYWdlKTsKLQkJbGlzdF9kZWxfaW5pdCgmZndfaW1hZ2UtPmxpc3QpOwotCX0KLX0KLQogc3RhdGljIGludCBicmNtZl91c2JfcmVzZXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqbm90dXNlZCkKIHsKIAkvKiBkZXZpY2UgcGFzdCBpcyB0aGUgdXNiIGludGVyZmFjZSBzbyB3ZQpAQCAtMTUzNCwxMiArMTQzOCwxMCBAQAogCXJldCA9IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoZHJ2LCBOVUxMLCBOVUxMLAogCQkJCSAgICAgYnJjbWZfdXNiX3Jlc2V0X2RldmljZSk7CiAJdXNiX2RlcmVnaXN0ZXIoJmJyY21mX3VzYmRydnIpOwotCWJyY21mX3JlbGVhc2VfZncoJmZ3X2ltYWdlX2xpc3QpOwogfQogCiB2b2lkIGJyY21mX3VzYl9yZWdpc3Rlcih2b2lkKQogewogCWJyY21mX2RiZyhVU0IsICJFbnRlclxuIik7Ci0JSU5JVF9MSVNUX0hFQUQoJmZ3X2ltYWdlX2xpc3QpOwogCXVzYl9yZWdpc3RlcigmYnJjbWZfdXNiZHJ2cik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCmluZGV4IGJlMTk4NTI5Li5kOGZhMjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwpAQCAtMjIxLDkgKzIyMSw5IEBACiAJCSAqLwogCQlSRUdfUlVMRSgyNDg0LTEwLCAyNDg0KzEwLCAyMCwgNiwgMjAsIDApLAogCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgMzYuLjY0ICovCi0JCVJFR19SVUxFKDUxNTAtMTAsIDUzNTArMTAsIDQwLCA2LCAyMCwgMCksCisJCVJFR19SVUxFKDUxNTAtMTAsIDUzNTArMTAsIDgwLCA2LCAyMCwgMCksCiAJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCAxMDAuLjE2NSAqLwotCQlSRUdfUlVMRSg1NDcwLTEwLCA1ODUwKzEwLCA0MCwgNiwgMjAsIDApLCB9CisJCVJFR19SVUxFKDU0NzAtMTAsIDU4NTArMTAsIDgwLCA2LCAyMCwgMCksIH0KIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgX193bF9jaXBoZXJfc3VpdGVzW10gPSB7CkBAIC0zNDEsNiArMzQxLDYwIEBACiAJcmV0dXJuIHFkYm07CiB9CiAKK3N0YXRpYyB1MTYgY2hhbmRlZl90b19jaGFuc3BlYyhzdHJ1Y3QgYnJjbXVfZDExaW5mICpkMTFpbmYsCisJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaCkKK3sKKwlzdHJ1Y3QgYnJjbXVfY2hhbiBjaF9pbmY7CisJczMyIHByaW1hcnlfb2Zmc2V0OworCisJYnJjbWZfZGJnKFRSQUNFLCAiY2hhbmRlZjogY29udHJvbCAlZCBjZW50ZXIgJWQgd2lkdGggJWRcbiIsCisJCSAgY2gtPmNoYW4tPmNlbnRlcl9mcmVxLCBjaC0+Y2VudGVyX2ZyZXExLCBjaC0+d2lkdGgpOworCWNoX2luZi5jaG51bSA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaC0+Y2VudGVyX2ZyZXExKTsKKwlwcmltYXJ5X29mZnNldCA9IGNoLT5jZW50ZXJfZnJlcTEgLSBjaC0+Y2hhbi0+Y2VudGVyX2ZyZXE7CisJc3dpdGNoIChjaC0+d2lkdGgpIHsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8yMDoKKwkJY2hfaW5mLmJ3ID0gQlJDTVVfQ0hBTl9CV18yMDsKKwkJV0FSTl9PTihwcmltYXJ5X29mZnNldCAhPSAwKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfNDA6CisJCWNoX2luZi5idyA9IEJSQ01VX0NIQU5fQldfNDA7CisJCWlmIChwcmltYXJ5X29mZnNldCA8IDApCisJCQljaF9pbmYuc2IgPSBCUkNNVV9DSEFOX1NCX1U7CisJCWVsc2UKKwkJCWNoX2luZi5zYiA9IEJSQ01VX0NIQU5fU0JfTDsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfODA6CisJCWNoX2luZi5idyA9IEJSQ01VX0NIQU5fQldfODA7CisJCWlmIChwcmltYXJ5X29mZnNldCA8IDApIHsKKwkJCWlmIChwcmltYXJ5X29mZnNldCA8IC1DSF8xME1IWl9BUEFSVCkKKwkJCQljaF9pbmYuc2IgPSBCUkNNVV9DSEFOX1NCX1VVOworCQkJZWxzZQorCQkJCWNoX2luZi5zYiA9IEJSQ01VX0NIQU5fU0JfVUw7CisJCX0gZWxzZSB7CisJCQlpZiAocHJpbWFyeV9vZmZzZXQgPiBDSF8xME1IWl9BUEFSVCkKKwkJCQljaF9pbmYuc2IgPSBCUkNNVV9DSEFOX1NCX0xMOworCQkJZWxzZQorCQkJCWNoX2luZi5zYiA9IEJSQ01VX0NIQU5fU0JfTFU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKDEpOworCX0KKwlzd2l0Y2ggKGNoLT5jaGFuLT5iYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQljaF9pbmYuYmFuZCA9IEJSQ01VX0NIQU5fQkFORF8yRzsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQljaF9pbmYuYmFuZCA9IEJSQ01VX0NIQU5fQkFORF81RzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKDEpOworCX0KKwlkMTFpbmYtPmVuY2Noc3BlYygmY2hfaW5mKTsKKworCXJldHVybiBjaF9pbmYuY2hzcGVjOworfQorCiB1MTYgY2hhbm5lbF90b19jaGFuc3BlYyhzdHJ1Y3QgYnJjbXVfZDExaW5mICpkMTFpbmYsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoKQogewpAQCAtNTg2LDYgKzY0MCw5IEBACiAJCWlmIChlcnIpCiAJCQlicmNtZl9lcnIoIlNjYW4gYWJvcnQgIGZhaWxlZFxuIik7CiAJfQorCisJYnJjbWZfc2V0X21wYyhpZnAsIDEpOworCiAJLyoKIAkgKiBlLXNjYW4gY2FuIGJlIGluaXRpYXRlZCBieSBzY2hlZHVsZWQgc2NhbgogCSAqIHdoaWNoIHRha2VzIHByZWNlZGVuY2UuCkBAIC01OTUsMTIgKzY1MiwxMCBAQAogCQljZmctPnNjaGVkX2VzY2FuID0gZmFsc2U7CiAJCWlmICghYWJvcnRlZCkKIAkJCWNmZzgwMjExX3NjaGVkX3NjYW5fcmVzdWx0cyhjZmdfdG9fd2lwaHkoY2ZnKSk7Ci0JCWJyY21mX3NldF9tcGMoaWZwLCAxKTsKIAl9IGVsc2UgaWYgKHNjYW5fcmVxdWVzdCkgewogCQlicmNtZl9kYmcoU0NBTiwgIkVTQ0FOIENvbXBsZXRlZCBzY2FuOiAlc1xuIiwKIAkJCSAgYWJvcnRlZCA/ICJBYm9ydGVkIiA6ICJEb25lIik7CiAJCWNmZzgwMjExX3NjYW5fZG9uZShzY2FuX3JlcXVlc3QsIGFib3J0ZWQpOwotCQlicmNtZl9zZXRfbXBjKGlmcCwgMSk7CiAJfQogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEJSQ01GX1NDQU5fU1RBVFVTX0JVU1ksICZjZmctPnNjYW5fc3RhdHVzKSkKIAkJYnJjbWZfZGJnKFNDQU4sICJTY2FuIGNvbXBsZXRlLCBwcm9iYWJseSBQMlAgc2NhblxuIik7CkBAIC0xMjM2LDggKzEyOTEsOCBAQAogCQkJCXBhcmFtcy0+Y2hhbmRlZi5jaGFuLT5jZW50ZXJfZnJlcSk7CiAJCWlmIChwYXJhbXMtPmNoYW5uZWxfZml4ZWQpIHsKIAkJCS8qIGFkZGluZyBjaGFuc3BlYyAqLwotCQkJY2hhbnNwZWMgPSBjaGFubmVsX3RvX2NoYW5zcGVjKCZjZmctPmQxMWluZiwKLQkJCQkJCSAgICAgICBwYXJhbXMtPmNoYW5kZWYuY2hhbik7CisJCQljaGFuc3BlYyA9IGNoYW5kZWZfdG9fY2hhbnNwZWMoJmNmZy0+ZDExaW5mLAorCQkJCQkJICAgICAgICZwYXJhbXMtPmNoYW5kZWYpOwogCQkJam9pbl9wYXJhbXMucGFyYW1zX2xlLmNoYW5zcGVjX2xpc3RbMF0gPQogCQkJCWNwdV90b19sZTE2KGNoYW5zcGVjKTsKIAkJCWpvaW5fcGFyYW1zLnBhcmFtc19sZS5jaGFuc3BlY19udW0gPSBjcHVfdG9fbGUzMigxKTsKQEAgLTIxODIsNyArMjIzNyw3IEBACiAKIHN0YXRpYyBzMzIKIGJyY21mX2NmZzgwMjExX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisJCQkgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcm9maWxlICpwcm9maWxlID0gJmlmcC0+dmlmLT5wcm9maWxlOwpAQCAtMzEyNCw3ICszMTc5LDcgQEAKIAl9CiAKIAlpZiAoIXJlcXVlc3QtPm5fc3NpZHMgfHwgIXJlcXVlc3QtPm5fbWF0Y2hfc2V0cykgewotCQlicmNtZl9lcnIoIkludmFsaWQgc2NoZWQgc2NhbiByZXEhISBuX3NzaWRzOiVkXG4iLAorCQlicmNtZl9kYmcoU0NBTiwgIkludmFsaWQgc2NoZWQgc2NhbiByZXEhISBuX3NzaWRzOiVkXG4iLAogCQkJICByZXF1ZXN0LT5uX3NzaWRzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzczNCwyMyArMzc4OSw2IEBACiB9CiAKIHN0YXRpYyBzMzIKLWJyY21mX2NmZzgwMjExX3NldF9jaGFubmVsKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcsCi0JCQkgICBzdHJ1Y3QgYnJjbWZfaWYgKmlmcCwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKLXsKLQl1MTYgY2hhbnNwZWM7Ci0JczMyIGVycjsKLQotCWJyY21mX2RiZyhUUkFDRSwgImJhbmQ9JWQsIGNlbnRlcl9mcmVxPSVkXG4iLCBjaGFubmVsLT5iYW5kLAotCQkgIGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKLQotCWNoYW5zcGVjID0gY2hhbm5lbF90b19jaGFuc3BlYygmY2ZnLT5kMTFpbmYsIGNoYW5uZWwpOwotCWVyciA9IGJyY21mX2ZpbF9pb3Zhcl9pbnRfc2V0KGlmcCwgImNoYW5zcGVjIiwgY2hhbnNwZWMpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgogYnJjbWZfY2ZnODAyMTFfc3RhcnRfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQlzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgKnNldHRpbmdzKQogewpAQCAtMzc2NSwxMSArMzgwMywxMiBAQAogCXN0cnVjdCBicmNtZl9qb2luX3BhcmFtcyBqb2luX3BhcmFtczsKIAllbnVtIG5sODAyMTFfaWZ0eXBlIGRldl9yb2xlOwogCXN0cnVjdCBicmNtZl9maWxfYnNzX2VuYWJsZV9sZSBic3NfZW5hYmxlOworCXUxNiBjaGFuc3BlYzsKIAotCWJyY21mX2RiZyhUUkFDRSwgImNoYW5uZWxfdHlwZT0lZCwgYmVhY29uX2ludGVydmFsPSVkLCBkdGltX3BlcmlvZD0lZCxcbiIsCi0JCSAgY2ZnODAyMTFfZ2V0X2NoYW5kZWZfdHlwZSgmc2V0dGluZ3MtPmNoYW5kZWYpLAotCQkgIHNldHRpbmdzLT5iZWFjb25faW50ZXJ2YWwsCi0JCSAgc2V0dGluZ3MtPmR0aW1fcGVyaW9kKTsKKwlicmNtZl9kYmcoVFJBQ0UsICJjdHJsY2huPSVkLCBjZW50ZXI9JWQsIGJ3PSVkLCBiZWFjb25faW50ZXJ2YWw9JWQsIGR0aW1fcGVyaW9kPSVkLFxuIiwKKwkJICBzZXR0aW5ncy0+Y2hhbmRlZi5jaGFuLT5od192YWx1ZSwKKwkJICBzZXR0aW5ncy0+Y2hhbmRlZi5jZW50ZXJfZnJlcTEsIHNldHRpbmdzLT5jaGFuZGVmLndpZHRoLAorCQkgIHNldHRpbmdzLT5iZWFjb25faW50ZXJ2YWwsIHNldHRpbmdzLT5kdGltX3BlcmlvZCk7CiAJYnJjbWZfZGJnKFRSQUNFLCAic3NpZD0lcyglenUpLCBhdXRoX3R5cGU9JWQsIGluYWN0aXZpdHlfdGltZW91dD0lZFxuIiwKIAkJICBzZXR0aW5ncy0+c3NpZCwgc2V0dGluZ3MtPnNzaWRfbGVuLCBzZXR0aW5ncy0+YXV0aF90eXBlLAogCQkgIHNldHRpbmdzLT5pbmFjdGl2aXR5X3RpbWVvdXQpOwpAQCAtMzgyNiw5ICszODY1LDEwIEBACiAKIAlicmNtZl9jb25maWdfYXBfbWdtdF9pZShpZnAtPnZpZiwgJnNldHRpbmdzLT5iZWFjb24pOwogCi0JZXJyID0gYnJjbWZfY2ZnODAyMTFfc2V0X2NoYW5uZWwoY2ZnLCBpZnAsIHNldHRpbmdzLT5jaGFuZGVmLmNoYW4pOworCWNoYW5zcGVjID0gY2hhbmRlZl90b19jaGFuc3BlYygmY2ZnLT5kMTFpbmYsICZzZXR0aW5ncy0+Y2hhbmRlZik7CisJZXJyID0gYnJjbWZfZmlsX2lvdmFyX2ludF9zZXQoaWZwLCAiY2hhbnNwZWMiLCBjaGFuc3BlYyk7CiAJaWYgKGVyciA8IDApIHsKLQkJYnJjbWZfZXJyKCJTZXQgQ2hhbm5lbCBmYWlsZWQsICVkXG4iLCBlcnIpOworCQlicmNtZl9lcnIoIlNldCBDaGFubmVsIGZhaWxlZDogY2hzcGVjPSVkLCAlZFxuIiwgY2hhbnNwZWMsIGVycik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM5NzUsNyArNDAxNSw3IEBACiAKIHN0YXRpYyBpbnQKIGJyY21mX2NmZzgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJICAgdTggKm1hYykKKwkJCSAgIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IGJyY21mX2NmZzgwMjExX2luZm8gKmNmZyA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7CiAJc3RydWN0IGJyY21mX3NjYl92YWxfbGUgc2NidmFsOwpAQCAtNDIwMyw3ICs0MjQzLDcgQEAKIH0KIAogc3RhdGljIGludCBicmNtZl9jZmc4MDIxMV90ZGxzX29wZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHU4ICpwZWVyLAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3QgdTggKnBlZXIsCiAJCQkJICAgIGVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKQogewogCXN0cnVjdCBicmNtZl9pZiAqaWZwOwpAQCAtNDM2NCw2ICs0NDA0LDggQEAKIAkJCVdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCB8CiAJCQlXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCB8CiAJCQlXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFM7CisJaWYgKCFicmNtZl9yb2Ftb2ZmKQorCQl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19GV19ST0FNOwogCXdpcGh5LT5tZ210X3N0eXBlcyA9IGJyY21mX3R4cnhfc3R5cGVzOwogCXdpcGh5LT5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24gPSA1MDAwOwogCWJyY21mX3dpcGh5X3Bub19wYXJhbXMod2lwaHkpOwpAQCAtNDY4NSw3ICs0NzI3LDYgQEAKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJvZmlsZSAqcHJvZmlsZSA9ICZpZnAtPnZpZi0+cHJvZmlsZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJczMyIGVyciA9IDA7Ci0JdTE2IHJlYXNvbjsKIAogCWlmIChicmNtZl9pc19hcG1vZGUoaWZwLT52aWYpKSB7CiAJCWVyciA9IGJyY21mX25vdGlmeV9jb25uZWN0X3N0YXR1c19hcChjZmcsIG5kZXYsIGUsIGRhdGEpOwpAQCAtNDcwNiwxNiArNDc0Nyw2IEBACiAJCWJyY21mX2RiZyhDT05OLCAiTGlua2Rvd25cbiIpOwogCQlpZiAoIWJyY21mX2lzX2lic3Ntb2RlKGlmcC0+dmlmKSkgewogCQkJYnJjbWZfYnNzX2Nvbm5lY3RfZG9uZShjZmcsIG5kZXYsIGUsIGZhbHNlKTsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQlJDTUZfVklGX1NUQVRVU19DT05ORUNURUQsCi0JCQkJCSAgICAgICAmaWZwLT52aWYtPnNtZV9zdGF0ZSkpIHsKLQkJCQlyZWFzb24gPSAwOwotCQkJCWlmICgoKGUtPmV2ZW50X2NvZGUgPT0gQlJDTUZfRV9ERUFVVEhfSU5EKSB8fAotCQkJCSAgICAgKGUtPmV2ZW50X2NvZGUgPT0gQlJDTUZfRV9ESVNBU1NPQ19JTkQpKSAmJgotCQkJCSAgICAoZS0+cmVhc29uICE9IFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEKSkKLQkJCQkJcmVhc29uID0gZS0+cmVhc29uOwotCQkJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChuZGV2LCByZWFzb24sIE5VTEwsIDAsCi0JCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQkJCX0KIAkJfQogCQlicmNtZl9saW5rX2Rvd24oaWZwLT52aWYpOwogCQlicmNtZl9pbml0X3Byb2YobmRldl90b19wcm9mKG5kZXYpKTsKQEAgLTUyMTUsNiArNTI0Niw5IEBACiAJCWlmICghKGJ3X2NhcFtiYW5kXSAmIFdMQ19CV180ME1IWl9CSVQpICYmCiAJCSAgICBjaC5idyA9PSBCUkNNVV9DSEFOX0JXXzQwKQogCQkJY29udGludWU7CisJCWlmICghKGJ3X2NhcFtiYW5kXSAmIFdMQ19CV184ME1IWl9CSVQpICYmCisJCSAgICBjaC5idyA9PSBCUkNNVV9DSEFOX0JXXzgwKQorCQkJY29udGludWU7CiAJCXVwZGF0ZSA9IGZhbHNlOwogCQlmb3IgKGogPSAwOyAoaiA8ICpuX2NudCAmJiAoKm5fY250IDwgYXJyYXlfc2l6ZSkpOyBqKyspIHsKIAkJCWlmIChiYW5kX2NoYW5fYXJyW2pdLmh3X3ZhbHVlID09IGNoLmNobnVtKSB7CkBAIC01MjMxLDEwICs1MjY1LDEzIEBACiAJCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoLmNobnVtLCBiYW5kKTsKIAkJCWJhbmRfY2hhbl9hcnJbaW5kZXhdLmh3X3ZhbHVlID0gY2guY2hudW07CiAKLQkJCWlmIChjaC5idyA9PSBCUkNNVV9DSEFOX0JXXzQwKSB7Ci0JCQkJLyogYXNzdW1pbmcgdGhlIG9yZGVyIGlzIEhUMjAsIEhUNDAgVXBwZXIsCi0JCQkJICogSFQ0MCBsb3dlciBmcm9tIGNoYW5zcGVjcwotCQkJCSAqLworCQkJLyogYXNzdW1pbmcgdGhlIGNoYW5zcGVjcyBvcmRlciBpcyBIVDIwLAorCQkJICogSFQ0MCB1cHBlciwgSFQ0MCBsb3dlciwgYW5kIFZIVDgwLgorCQkJICovCisJCQlpZiAoY2guYncgPT0gQlJDTVVfQ0hBTl9CV184MCkgeworCQkJCWJhbmRfY2hhbl9hcnJbaW5kZXhdLmZsYWdzICY9CisJCQkJCX5JRUVFODAyMTFfQ0hBTl9OT184ME1IWjsKKwkJCX0gZWxzZSBpZiAoY2guYncgPT0gQlJDTVVfQ0hBTl9CV180MCkgewogCQkJCWh0NDBfZmxhZyA9IGJhbmRfY2hhbl9hcnJbaW5kZXhdLmZsYWdzICYKIAkJCQkJICAgIElFRUU4MDIxMV9DSEFOX05PX0hUNDA7CiAJCQkJaWYgKGNoLnNiID09IEJSQ01VX0NIQU5fU0JfVSkgewpAQCAtNTI1NSw4ICs1MjkyLDEzIEBACiAJCQkJCQkgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTOwogCQkJCX0KIAkJCX0gZWxzZSB7CisJCQkJLyogZGlzYWJsZSBvdGhlciBiYW5kd2lkdGhzIGZvciBub3cgYXMgbWVudGlvbmVkCisJCQkJICogb3JkZXIgYXNzdXJlIHRoZXkgYXJlIGVuYWJsZWQgZm9yIHN1YnNlcXVlbnQKKwkJCQkgKiBjaGFuc3BlY3MuCisJCQkJICovCiAJCQkJYmFuZF9jaGFuX2FycltpbmRleF0uZmxhZ3MgPQotCQkJCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDA7CisJCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwIHwKKwkJCQkJCUlFRUU4MDIxMV9DSEFOX05PXzgwTUhaOwogCQkJCWNoLmJ3ID0gQlJDTVVfQ0hBTl9CV18yMDsKIAkJCQljZmctPmQxMWluZi5lbmNjaHNwZWMoJmNoKTsKIAkJCQljaGFubmVsID0gY2guY2hzcGVjOwpAQCAtNTMyMywxMyArNTM2NSw2MyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgYnJjbWZfdXBkYXRlX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kLAorCQkJCXUzMiBid19jYXBbMl0sIHUzMiBuY2hhaW4pCit7CisJYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7CisJaWYgKGJ3X2NhcFtiYW5kLT5iYW5kXSAmIFdMQ19CV180ME1IWl9CSVQpIHsKKwkJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsKKwkJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKKwl9CisJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKKwliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwOworCWJhbmQtPmh0X2NhcC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKKwliYW5kLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTY7CisJbWVtc2V0KGJhbmQtPmh0X2NhcC5tY3MucnhfbWFzaywgMHhmZiwgbmNoYWluKTsKKwliYW5kLT5odF9jYXAubWNzLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRDsKK30KKworc3RhdGljIF9fbGUxNiBicmNtZl9nZXRfbWNzX21hcCh1MzIgbmNoYWluLCBlbnVtIGllZWU4MDIxMV92aHRfbWNzX3N1cHBvcnQgc3VwcCkKK3sKKwl1MTYgbWNzX21hcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAsIG1jc19tYXAgPSAweEZGRkY7IGkgPCBuY2hhaW47IGkrKykKKwkJbWNzX21hcCA9IChtY3NfbWFwIDw8IDIpIHwgc3VwcDsKKworCXJldHVybiBjcHVfdG9fbGUxNihtY3NfbWFwKTsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfdXBkYXRlX3ZodF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZCwKKwkJCQkgdTMyIGJ3X2NhcFsyXSwgdTMyIG5jaGFpbikKK3sKKwlfX2xlMTYgbWNzX21hcDsKKworCS8qIG5vdCBhbGxvd2VkIGluIDIuNEcgYmFuZCAqLworCWlmIChiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCXJldHVybjsKKworCWJhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCA9IHRydWU7CisJLyogODBNSHogaXMgbWFuZGF0b3J5ICovCisJYmFuZC0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfU0hPUlRfR0lfODA7CisJaWYgKGJ3X2NhcFtiYW5kLT5iYW5kXSAmIFdMQ19CV18xNjBNSFpfQklUKSB7CisJCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX1NVUFBfQ0hBTl9XSURUSF8xNjBNSFo7CisJCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX1NIT1JUX0dJXzE2MDsKKwl9CisJLyogYWxsIHN1cHBvcnQgMjU2LVFBTSAqLworCW1jc19tYXAgPSBicmNtZl9nZXRfbWNzX21hcChuY2hhaW4sIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF85KTsKKwliYW5kLT52aHRfY2FwLnZodF9tY3MucnhfbWNzX21hcCA9IG1jc19tYXA7CisJYmFuZC0+dmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXAgPSBtY3NfbWFwOworfQorCiBzdGF0aWMgczMyIGJyY21mX3VwZGF0ZV93aXBoeWJhbmRzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcpCiB7CiAJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihjZmdfdG9fbmRldihjZmcpKTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5OwogCXMzMiBwaHlfbGlzdDsKIAl1MzIgYmFuZF9saXN0WzNdOwotCXUzMiBubW9kZTsKKwl1MzIgbm1vZGUgPSAwOworCXUzMiB2aHRtb2RlID0gMDsKIAl1MzIgYndfY2FwWzJdID0geyAwLCAwIH07CiAJdTMyIHJ4Y2hhaW47CiAJdTMyIG5jaGFpbjsKQEAgLTUzNjAsMTQgKzU0NTIsMTYgQEAKIAlicmNtZl9kYmcoSU5GTywgIkJSQ01GX0NfR0VUX0JBTkRMSVNUIHJlcG9ydGVkOiAweCUwOHggMHglMDh4IDB4JTA4eCBwaHlcbiIsCiAJCSAgYmFuZF9saXN0WzBdLCBiYW5kX2xpc3RbMV0sIGJhbmRfbGlzdFsyXSk7CiAKKwkodm9pZClicmNtZl9maWxfaW92YXJfaW50X2dldChpZnAsICJ2aHRtb2RlIiwgJnZodG1vZGUpOwogCWVyciA9IGJyY21mX2ZpbF9pb3Zhcl9pbnRfZ2V0KGlmcCwgIm5tb2RlIiwgJm5tb2RlKTsKIAlpZiAoZXJyKSB7CiAJCWJyY21mX2Vycigibm1vZGUgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAl9IGVsc2UgewogCQlicmNtZl9nZXRfYndjYXAoaWZwLCBid19jYXApOwogCX0KLQlicmNtZl9kYmcoSU5GTywgIm5tb2RlPSVkLCBid19jYXA9KCVkLCAlZClcbiIsIG5tb2RlLAotCQkgIGJ3X2NhcFtJRUVFODAyMTFfQkFORF8yR0haXSwgYndfY2FwW0lFRUU4MDIxMV9CQU5EXzVHSFpdKTsKKwlicmNtZl9kYmcoSU5GTywgIm5tb2RlPSVkLCB2aHRtb2RlPSVkLCBid19jYXA9KCVkLCAlZClcbiIsCisJCSAgbm1vZGUsIHZodG1vZGUsIGJ3X2NhcFtJRUVFODAyMTFfQkFORF8yR0haXSwKKwkJICBid19jYXBbSUVFRTgwMjExX0JBTkRfNUdIWl0pOwogCiAJZXJyID0gYnJjbWZfZmlsX2lvdmFyX2ludF9nZXQoaWZwLCAicnhjaGFpbiIsICZyeGNoYWluKTsKIAlpZiAoZXJyKSB7CkBAIC01Mzk4LDE3ICs1NDkyLDEwIEBACiAJCWVsc2UKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChid19jYXBbYmFuZC0+YmFuZF0gJiBXTENfQldfNDBNSFpfQklUKSB7Ci0JCQliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOwotCQkJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKLQkJfQotCQliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwotCQliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwOwotCQliYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkID0gdHJ1ZTsKLQkJYmFuZC0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOwotCQliYW5kLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTY7Ci0JCW1lbXNldChiYW5kLT5odF9jYXAubWNzLnJ4X21hc2ssIDB4ZmYsIG5jaGFpbik7Ci0JCWJhbmQtPmh0X2NhcC5tY3MudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEOworCQlpZiAobm1vZGUpCisJCQlicmNtZl91cGRhdGVfaHRfY2FwKGJhbmQsIGJ3X2NhcCwgbmNoYWluKTsKKwkJaWYgKHZodG1vZGUpCisJCQlicmNtZl91cGRhdGVfdmh0X2NhcChiYW5kLCBid19jYXAsIG5jaGFpbik7CiAJCWJhbmRzW2JhbmQtPmJhbmRdID0gYmFuZDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKaW5kZXggOGM1ZmE0ZS4uNDNjNzFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKQEAgLTg5Nyw3ICs4OTcsOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21zX29wc19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQorc3RhdGljIHZvaWQgYnJjbXNfb3BzX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKIHsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMKaW5kZXggOTQxN2NiNS4uYWY4YmE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCkBAIC00ODcwLDE0ICs0ODcwLDExIEBACiAvKgogICogbG93IGxldmVsIGRldGFjaAogICovCi1zdGF0aWMgaW50IGJyY21zX2JfZGV0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKK3N0YXRpYyB2b2lkIGJyY21zX2JfZGV0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAl1aW50IGk7CiAJc3RydWN0IGJyY21zX2h3X2JhbmQgKmJhbmQ7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWludCBjYWxsYmFja3M7Ci0KLQljYWxsYmFja3MgPSAwOwogCiAJYnJjbXNfYl9kZXRhY2hfZG1hcGlvKHdsY19odyk7CiAKQEAgLTQ5MDAsOSArNDg5Nyw2IEBACiAJCWFpX2RldGFjaCh3bGNfaHctPnNpaCk7CiAJCXdsY19ody0+c2loID0gTlVMTDsKIAl9Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotCiB9CiAKIC8qCkBAIC00OTE3LDE0ICs0OTExLDE1IEBACiAgKi8KIHVpbnQgYnJjbXNfY19kZXRhY2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewotCXVpbnQgY2FsbGJhY2tzID0gMDsKKwl1aW50IGNhbGxiYWNrczsKIAogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQljYWxsYmFja3MgKz0gYnJjbXNfYl9kZXRhY2god2xjKTsKKwlicmNtc19iX2RldGFjaCh3bGMpOwogCiAJLyogZGVsZXRlIHNvZnR3YXJlIHRpbWVycyAqLworCWNhbGxiYWNrcyA9IDA7CiAJaWYgKCFicmNtc19jX3JhZGlvX21vbml0b3Jfc3RvcCh3bGMpKQogCQljYWxsYmFja3MrKzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL2QxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL2QxMS5jCmluZGV4IDMwZTU0ZTIuLjJiMjUyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtdXRpbC9kMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXV0aWwvZDExLmMKQEAgLTIxLDE5ICsyMSw0NiBAQAogI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KICNpbmNsdWRlIDxicmNtdV9kMTEuaD4KIAorc3RhdGljIHUxNiBkMTFuX3NiKGVudW0gYnJjbXVfY2hhbl9zYiBzYikKK3sKKwlzd2l0Y2ggKHNiKSB7CisJY2FzZSBCUkNNVV9DSEFOX1NCX05PTkU6CisJCXJldHVybiBCUkNNVV9DSFNQRUNfRDExTl9TQl9OOworCWNhc2UgQlJDTVVfQ0hBTl9TQl9MOgorCQlyZXR1cm4gQlJDTVVfQ0hTUEVDX0QxMU5fU0JfTDsKKwljYXNlIEJSQ01VX0NIQU5fU0JfVToKKwkJcmV0dXJuIEJSQ01VX0NIU1BFQ19EMTFOX1NCX1U7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MTYgZDExbl9idyhlbnVtIGJyY211X2NoYW5fYncgYncpCit7CisJc3dpdGNoIChidykgeworCWNhc2UgQlJDTVVfQ0hBTl9CV18yMDoKKwkJcmV0dXJuIEJSQ01VX0NIU1BFQ19EMTFOX0JXXzIwOworCWNhc2UgQlJDTVVfQ0hBTl9CV180MDoKKwkJcmV0dXJuIEJSQ01VX0NIU1BFQ19EMTFOX0JXXzQwOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBicmNtdV9kMTFuX2VuY2Noc3BlYyhzdHJ1Y3QgYnJjbXVfY2hhbiAqY2gpCiB7Ci0JY2gtPmNoc3BlYyA9IGNoLT5jaG51bSAmIEJSQ01VX0NIU1BFQ19DSF9NQVNLOworCWlmIChjaC0+YncgPT0gQlJDTVVfQ0hBTl9CV18yMCkKKwkJY2gtPnNiID0gQlJDTVVfQ0hBTl9TQl9OT05FOwogCi0Jc3dpdGNoIChjaC0+YncpIHsKLQljYXNlIEJSQ01VX0NIQU5fQldfMjA6Ci0JCWNoLT5jaHNwZWMgfD0gQlJDTVVfQ0hTUEVDX0QxMU5fQldfMjAgfCBCUkNNVV9DSFNQRUNfRDExTl9TQl9OOwotCQlicmVhazsKLQljYXNlIEJSQ01VX0NIQU5fQldfNDA6Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTl9PTkNFKDEpOwotCQlicmVhazsKLQl9CisJY2gtPmNoc3BlYyA9IDA7CisJYnJjbXVfbWFza3NldDE2KCZjaC0+Y2hzcGVjLCBCUkNNVV9DSFNQRUNfQ0hfTUFTSywKKwkJCUJSQ01VX0NIU1BFQ19DSF9TSElGVCwgY2gtPmNobnVtKTsKKwlicmNtdV9tYXNrc2V0MTYoJmNoLT5jaHNwZWMsIEJSQ01VX0NIU1BFQ19EMTFOX1NCX01BU0ssCisJCQkwLCBkMTFuX3NiKGNoLT5zYikpOworCWJyY211X21hc2tzZXQxNigmY2gtPmNoc3BlYywgQlJDTVVfQ0hTUEVDX0QxMU5fQldfTUFTSywKKwkJCTAsIGQxMW5fYncoY2gtPmJ3KSk7CiAKIAlpZiAoY2gtPmNobnVtIDw9IENIX01BWF8yR19DSEFOTkVMKQogCQljaC0+Y2hzcGVjIHw9IEJSQ01VX0NIU1BFQ19EMTFOX0JORF8yRzsKQEAgLTQxLDIzICs2OCwzNCBAQAogCQljaC0+Y2hzcGVjIHw9IEJSQ01VX0NIU1BFQ19EMTFOX0JORF81RzsKIH0KIAorc3RhdGljIHUxNiBkMTFhY19idyhlbnVtIGJyY211X2NoYW5fYncgYncpCit7CisJc3dpdGNoIChidykgeworCWNhc2UgQlJDTVVfQ0hBTl9CV18yMDoKKwkJcmV0dXJuIEJSQ01VX0NIU1BFQ19EMTFBQ19CV18yMDsKKwljYXNlIEJSQ01VX0NIQU5fQldfNDA6CisJCXJldHVybiBCUkNNVV9DSFNQRUNfRDExQUNfQldfNDA7CisJY2FzZSBCUkNNVV9DSEFOX0JXXzgwOgorCQlyZXR1cm4gQlJDTVVfQ0hTUEVDX0QxMUFDX0JXXzgwOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBicmNtdV9kMTFhY19lbmNjaHNwZWMoc3RydWN0IGJyY211X2NoYW4gKmNoKQogewotCWNoLT5jaHNwZWMgPSBjaC0+Y2hudW0gJiBCUkNNVV9DSFNQRUNfQ0hfTUFTSzsKKwlpZiAoY2gtPmJ3ID09IEJSQ01VX0NIQU5fQldfMjAgfHwgY2gtPnNiID09IEJSQ01VX0NIQU5fU0JfTk9ORSkKKwkJY2gtPnNiID0gQlJDTVVfQ0hBTl9TQl9MOwogCi0Jc3dpdGNoIChjaC0+YncpIHsKLQljYXNlIEJSQ01VX0NIQU5fQldfMjA6Ci0JCWNoLT5jaHNwZWMgfD0gQlJDTVVfQ0hTUEVDX0QxMUFDX0JXXzIwOwotCQlicmVhazsKLQljYXNlIEJSQ01VX0NIQU5fQldfNDA6Ci0JY2FzZSBCUkNNVV9DSEFOX0JXXzgwOgotCWNhc2UgQlJDTVVfQ0hBTl9CV184MFA4MDoKLQljYXNlIEJSQ01VX0NIQU5fQldfMTYwOgotCWRlZmF1bHQ6Ci0JCVdBUk5fT05fT05DRSgxKTsKLQkJYnJlYWs7Ci0JfQorCWJyY211X21hc2tzZXQxNigmY2gtPmNoc3BlYywgQlJDTVVfQ0hTUEVDX0NIX01BU0ssCisJCQlCUkNNVV9DSFNQRUNfQ0hfU0hJRlQsIGNoLT5jaG51bSk7CisJYnJjbXVfbWFza3NldDE2KCZjaC0+Y2hzcGVjLCBCUkNNVV9DSFNQRUNfRDExQUNfU0JfTUFTSywKKwkJCUJSQ01VX0NIU1BFQ19EMTFBQ19TQl9TSElGVCwgY2gtPnNiKTsKKwlicmNtdV9tYXNrc2V0MTYoJmNoLT5jaHNwZWMsIEJSQ01VX0NIU1BFQ19EMTFBQ19CV19NQVNLLAorCQkJMCwgZDExYWNfYncoY2gtPmJ3KSk7CiAKKwljaC0+Y2hzcGVjICY9IH5CUkNNVV9DSFNQRUNfRDExQUNfQk5EX01BU0s7CiAJaWYgKGNoLT5jaG51bSA8PSBDSF9NQVhfMkdfQ0hBTk5FTCkKIAkJY2gtPmNoc3BlYyB8PSBCUkNNVV9DSFNQRUNfRDExQUNfQk5EXzJHOwogCWVsc2UKQEAgLTczLDYgKzExMSw3IEBACiAJc3dpdGNoIChjaC0+Y2hzcGVjICYgQlJDTVVfQ0hTUEVDX0QxMU5fQldfTUFTSykgewogCWNhc2UgQlJDTVVfQ0hTUEVDX0QxMU5fQldfMjA6CiAJCWNoLT5idyA9IEJSQ01VX0NIQU5fQldfMjA7CisJCWNoLT5zYiA9IEJSQ01VX0NIQU5fU0JfTk9ORTsKIAkJYnJlYWs7CiAJY2FzZSBCUkNNVV9DSFNQRUNfRDExTl9CV180MDoKIAkJY2gtPmJ3ID0gQlJDTVVfQ0hBTl9CV180MDsKQEAgLTExMiw2ICsxNTEsNyBAQAogCXN3aXRjaCAoY2gtPmNoc3BlYyAmIEJSQ01VX0NIU1BFQ19EMTFBQ19CV19NQVNLKSB7CiAJY2FzZSBCUkNNVV9DSFNQRUNfRDExQUNfQldfMjA6CiAJCWNoLT5idyA9IEJSQ01VX0NIQU5fQldfMjA7CisJCWNoLT5zYiA9IEJSQ01VX0NIQU5fU0JfTk9ORTsKIAkJYnJlYWs7CiAJY2FzZSBCUkNNVV9DSFNQRUNfRDExQUNfQldfNDA6CiAJCWNoLT5idyA9IEJSQ01VX0NIQU5fQldfNDA7CkBAIC0xMjgsNiArMTY4LDI1IEBACiAJCWJyZWFrOwogCWNhc2UgQlJDTVVfQ0hTUEVDX0QxMUFDX0JXXzgwOgogCQljaC0+YncgPSBCUkNNVV9DSEFOX0JXXzgwOworCQljaC0+c2IgPSBicmNtdV9tYXNrZ2V0MTYoY2gtPmNoc3BlYywgQlJDTVVfQ0hTUEVDX0QxMUFDX1NCX01BU0ssCisJCQkJCSBCUkNNVV9DSFNQRUNfRDExQUNfU0JfU0hJRlQpOworCQlzd2l0Y2ggKGNoLT5zYikgeworCQljYXNlIEJSQ01VX0NIQU5fU0JfTEw6CisJCQljaC0+Y2hudW0gLT0gQ0hfMzBNSFpfQVBBUlQ7CisJCQlicmVhazsKKwkJY2FzZSBCUkNNVV9DSEFOX1NCX0xVOgorCQkJY2gtPmNobnVtIC09IENIXzEwTUhaX0FQQVJUOworCQkJYnJlYWs7CisJCWNhc2UgQlJDTVVfQ0hBTl9TQl9VTDoKKwkJCWNoLT5jaG51bSArPSBDSF8xME1IWl9BUEFSVDsKKwkJCWJyZWFrOworCQljYXNlIEJSQ01VX0NIQU5fU0JfVVU6CisJCQljaC0+Y2hudW0gKz0gQ0hfMzBNSFpfQVBBUlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQlJDTVVfQ0hTUEVDX0QxMUFDX0JXXzgwODA6CiAJY2FzZSBCUkNNVV9DSFNQRUNfRDExQUNfQldfMTYwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfZDExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV9kMTEuaAppbmRleCA4NjYwYTJjLi5mOTc0NWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV9kMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV9kMTEuaApAQCAtMTA4LDEzICsxMDgsNyBAQAogfTsKIAogZW51bSBicmNtdV9jaGFuX3NiIHsKLQlCUkNNVV9DSEFOX1NCX05PTkUgPSAwLAotCUJSQ01VX0NIQU5fU0JfTCwKLQlCUkNNVV9DSEFOX1NCX1UsCi0JQlJDTVVfQ0hBTl9TQl9MTCwKLQlCUkNNVV9DSEFOX1NCX0xVLAotCUJSQ01VX0NIQU5fU0JfVUwsCi0JQlJDTVVfQ0hBTl9TQl9VVSwKKwlCUkNNVV9DSEFOX1NCX05PTkUgPSAtMSwKIAlCUkNNVV9DSEFOX1NCX0xMTCwKIAlCUkNNVV9DSEFOX1NCX0xMVSwKIAlCUkNNVV9DSEFOX1NCX0xVTCwKQEAgLTEyMyw2ICsxMTcsMTIgQEAKIAlCUkNNVV9DSEFOX1NCX1VMVSwKIAlCUkNNVV9DSEFOX1NCX1VVTCwKIAlCUkNNVV9DSEFOX1NCX1VVVSwKKwlCUkNNVV9DSEFOX1NCX0wgPSBCUkNNVV9DSEFOX1NCX0xMTCwKKwlCUkNNVV9DSEFOX1NCX1UgPSBCUkNNVV9DSEFOX1NCX0xMVSwKKwlCUkNNVV9DSEFOX1NCX0xMID0gQlJDTVVfQ0hBTl9TQl9MTEwsCisJQlJDTVVfQ0hBTl9TQl9MVSA9IEJSQ01VX0NIQU5fU0JfTExVLAorCUJSQ01VX0NIQU5fU0JfVUwgPSBCUkNNVV9DSEFOX1NCX0xVTCwKKwlCUkNNVV9DSEFOX1NCX1VVID0gQlJDTVVfQ0hBTl9TQl9MVVUsCiB9OwogCiBzdHJ1Y3QgYnJjbXVfY2hhbiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV93aWZpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV93aWZpLmgKaW5kZXggNzQ0MTlkNC4uNzZiNWQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfd2lmaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3dpZmkuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBDSF9VUFBFUl9TQgkJCTB4MDEKICNkZWZpbmUgQ0hfTE9XRVJfU0IJCQkweDAyCiAjZGVmaW5lIENIX0VXQV9WQUxJRAkJCTB4MDQKKyNkZWZpbmUgQ0hfMzBNSFpfQVBBUlQJCQk2CiAjZGVmaW5lIENIXzIwTUhaX0FQQVJUCQkJNAogI2RlZmluZSBDSF8xME1IWl9BUEFSVAkJCTIKICNkZWZpbmUgQ0hfNU1IWl9BUEFSVAkJCTEgLyogMkcgYmFuZCBjaGFubmVscyBhcmUgNSBNaHogYXBhcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuYwppbmRleCAxMDNmN2JjLi5jZDBjYWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9jdzEyMDAvc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL3N0YS5jCkBAIC05MzYsNyArOTM2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGN3MTIwMF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQordm9pZCBjdzEyMDBfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQogewogCXN0cnVjdCBjdzEyMDBfY29tbW9uICpwcml2ID0gaHctPnByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuaAppbmRleCAzNWJhYmI2Li5iN2UzODZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9jdzEyMDAvc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL3N0YS5oCkBAIC00MCw3ICs0MCw4IEBACiAKIGludCBjdzEyMDBfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSk7CiAKLXZvaWQgY3cxMjAwX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcXVldWVzLCBib29sIGRyb3ApOwordm9pZCBjdzEyMDBfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKTsKIAogdTY0IGN3MTIwMF9wcmVwYXJlX211bHRpY2FzdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICAgc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKm1jX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYwppbmRleCA2N2RiMzRlLi41MjkxOWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYwpAQCAtODgyLDcgKzg4Miw3IEBACiAJZGV2LT5tdHUgPSBsb2NhbC0+bXR1OwogCiAKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmcHJpc20yX2V0aHRvb2xfb3BzKTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnByaXNtMl9ldGh0b29sX29wczsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmMKaW5kZXggZDM3YTZmZC4uYjU5OGUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuYwpAQCAtNTczLDcgKzU3Myw3IEBACiAJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CiAKIAlpZiAoKHVubGlrZWx5KHJ4X3N0YXRzLT5waHlfY291bnQgPiAyMCkpKSB7Ci0JCURfRFJPUCgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogJWQvbiIsCisJCURfRFJPUCgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogJWRcbiIsCiAJCSAgICAgICByeF9zdGF0cy0+cGh5X2NvdW50KTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LW1hYy5jCmluZGV4IDg4OGFkNWMuLmMxNTljMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1tYWMuYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJfQogCiAJaWYgKCh1bmxpa2VseShwaHlfcmVzLT5jZmdfcGh5X2NudCA+IDIwKSkpIHsKLQkJRF9EUk9QKCJkc3Agc2l6ZSBvdXQgb2YgcmFuZ2UgWzAsMjBdOiAlZC9uIiwKKwkJRF9EUk9QKCJkc3Agc2l6ZSBvdXQgb2YgcmFuZ2UgWzAsMjBdOiAlZFxuIiwKIAkJICAgICAgIHBoeV9yZXMtPmNmZ19waHlfY250KTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMKaW5kZXggNGY0MjE3NC4uZWNjNjc0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMKQEAgLTQ3NTUsNyArNDc1NSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlsX21hY19jaGFuZ2VfaW50ZXJmYWNlKTsKIAotdm9pZCBpbF9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3ZvaWQgaWxfbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKIHsKIAlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaAppbmRleCBkZmIxM2M3Li5lYTVjMGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaApAQCAtMTcyMyw3ICsxNzIzLDggQEAKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiBpbnQgaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCk7Ci12b2lkIGlsX21hY19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKTsKK3ZvaWQgaWxfbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCk7CiBpbnQgaWxfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwogdm9pZCBpbF9mcmVlX3R4cV9tZW0oc3RydWN0IGlsX3ByaXYgKmlsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnCmluZGV4IDc0YjNiNGQuLjdmZDUwNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcKQEAgLTIsMTAgKzIsNiBAQAogCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaUZpIE5leHQgR2VuIEFHTiAtIFdpcmVsZXNzLU4vQWR2YW5jZWQtTi9VbHRpbWF0ZS1OIChpd2x3aWZpKSAiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgTUFDODAyMTEgJiYgSEFTX0lPTUVNCiAJc2VsZWN0IEZXX0xPQURFUgotCXNlbGVjdCBORVdfTEVEUwotCXNlbGVjdCBMRURTX0NMQVNTCi0Jc2VsZWN0IExFRFNfVFJJR0dFUlMKLQlzZWxlY3QgTUFDODAyMTFfTEVEUwogCS0tLWhlbHAtLS0KIAkgIFNlbGVjdCB0byBidWlsZCB0aGUgZHJpdmVyIHN1cHBvcnRpbmcgdGhlOgogCkBAIC00Myw2ICszOSwxNCBAQAogCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uICBUaGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpd2x3aWZpLgogCitjb25maWcgSVdMV0lGSV9MRURTCisJYm9vbAorCWRlcGVuZHMgb24gSVdMV0lGSQorCWRlcGVuZHMgb24gTEVEU19DTEFTUz15IHx8IExFRFNfQ0xBU1M9SVdMV0lGSQorCXNlbGVjdCBMRURTX1RSSUdHRVJTCisJc2VsZWN0IE1BQzgwMjExX0xFRFMKKwlkZWZhdWx0IHkKKwogY29uZmlnIElXTERWTQogCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaUZpIERWTSBGaXJtd2FyZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVdMV0lGSQpAQCAtMTI0LDcgKzEyOCw2IEBACiAJICBFbmFibGUgdXNlIG9mIGV4cGVyaW1lbnRhbCB1Y29kZSBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgogCiBjb25maWcgSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORwotCiAJYm9vbCAiaXdsd2lmaSBkZXZpY2UgYWNjZXNzIHRyYWNpbmciCiAJZGVwZW5kcyBvbiBJV0xXSUZJCiAJZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL01ha2VmaWxlCmluZGV4IGRjZTdhYjIuLjRkMTk2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL01ha2VmaWxlCkBAIC00LDkgKzQsMTAgQEAKIGl3bGR2bS1vYmpzCQkrPSBsaWIubyBjYWxpYi5vIHR0Lm8gc3RhLm8gcngubwogCiBpd2xkdm0tb2JqcwkJKz0gcG93ZXIubwotaXdsZHZtLW9ianMJCSs9IHNjYW4ubyBsZWQubworaXdsZHZtLW9ianMJCSs9IHNjYW4ubwogaXdsZHZtLW9ianMJCSs9IHJ4b24ubyBkZXZpY2VzLm8KIAoraXdsZHZtLSQoQ09ORklHX0lXTFdJRklfTEVEUykgKz0gbGVkLm8KIGl3bGR2bS0kKENPTkZJR19JV0xXSUZJX0RFQlVHRlMpICs9IGRlYnVnZnMubwogCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fIC1JJChzcmMpLy4uLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2NhbGliLmMKaW5kZXggYmUxMDg2Yy4uMjBlNmFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9jYWxpYi5jCkBAIC05NCw3ICs5NCw2IEBACiB7CiAJc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0gewogCQkuaWQgPSBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2RlYnVnZnMuYwppbmRleCBkMmZlMjU5Li4wZmZiNmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vZGVidWdmcy5jCkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogCiAJLyogbWFrZSByZXF1ZXN0IHRvIHVDb2RlIHRvIHJldHJpZXZlIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24gKi8KIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0ID0gaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHByaXYsIENNRF9TWU5DLCBmYWxzZSk7CisJcmV0ID0gaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHByaXYsIDAsIGZhbHNlKTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIAogCWlmIChyZXQpCkBAIC0xODY4LDcgKzE4NjgsNyBAQAogCiAJLyogbWFrZSByZXF1ZXN0IHRvIHVDb2RlIHRvIHJldHJpZXZlIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24gKi8KIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHByaXYsIENNRF9TWU5DLCB0cnVlKTsKKwlpd2xfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgMCwgdHJ1ZSk7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0yMTg4LDcgKzIxODgsNiBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9FQ0hPLAogCQkubGVuID0geyAwIH0sCi0JCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAKIAlyZXQgPSBpd2xfZHZtX3NlbmRfY21kKHByaXYsICZjbWQpOwpAQCAtMjMyMCw3ICsyMzE5LDcgQEAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKIAkvKiB0YWtlIHRoZSByZXR1cm4gdmFsdWUgdG8gbWFrZSBjb21waWxlciBoYXBweSAtIGl0IHdpbGwgZmFpbCBhbnl3YXkgKi8KLQlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9FUlJPUiwgQ01EX1NZTkMsIDAsIE5VTEwpOworCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0VSUk9SLCAwLCAwLCBOVUxMKTsKIAogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2Rldi5oCmluZGV4IDM0NDFmNzAuLmE2ZjIyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2Rldi5oCkBAIC04ODgsOSArODg4LDExIEBACiAKIAlzdHJ1Y3QgaXdsX2V2ZW50X2xvZyBldmVudF9sb2c7CiAKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRURTCiAJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CiAJdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOwogCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7CisjZW5kaWYKIAogCS8qIFdvV0xBTiBHVEsgcmVrZXkgZGF0YSAqLwogCXU4IGtja1tOTDgwMjExX0tDS19MRU5dLCBrZWtbTkw4MDIxMV9LRUtfTEVOXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2RldmljZXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2RldmljZXMuYwppbmRleCA3NThjNTRlLi4zNGI0MWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vZGV2aWNlcy5jCkBAIC00MTcsNyArNDE3LDYgQEAKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7CiAJCS5pZCA9IFJFUExZX0NIQU5ORUxfU1dJVENILAogCQkubGVuID0geyBzaXplb2YoY21kKSwgfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJCS5kYXRhID0geyAmY21kLCB9LAogCX07CiAKQEAgLTU3OSw3ICs1NzgsNiBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsCiAJCS5sZW4gPSB7IHNpemVvZigqY21kKSwgfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAogCX07CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2xlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbGVkLmgKaW5kZXggNmEwODE3ZC4uMWM2YjIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbGVkLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbGVkLmgKQEAgLTM2LDggKzM2LDIwIEBACiAjZGVmaW5lIElXTF9MRURfQUNUSVZJVFkgICAgICAgKDA8PDEpCiAjZGVmaW5lIElXTF9MRURfTElOSyAgICAgICAgICAgKDE8PDEpCiAKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRURTCiB2b2lkIGl3bGFnbl9sZWRfZW5hYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9sZWRzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX2xlZHNfZXhpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBpd2xhZ25fbGVkX2VuYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZHNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZHNfZXhpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7Cit9CisjZW5kaWYKIAogI2VuZGlmIC8qIF9faXdsX2xlZHNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9saWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2xpYi5jCmluZGV4IDU3NmY3ZWUuLjIxOTE2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2xpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2xpYi5jCkBAIC04MSw3ICs4MSw3IEBACiAJZWxzZQogCQl0eF9hbnRfY2ZnX2NtZCA9IFJFUExZX1RYX1BPV0VSX0RCTV9DTUQ7CiAKLQlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgdHhfYW50X2NmZ19jbWQsIENNRF9TWU5DLAorCXJldHVybiBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCB0eF9hbnRfY2ZnX2NtZCwgMCwKIAkJCXNpemVvZih0eF9wb3dlcl9jbWQpLCAmdHhfcG93ZXJfY21kKTsKIH0KIApAQCAtMTQxLDcgKzE0MSw2IEBACiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IFJFUExZX1RYRklGT19GTFVTSCwKIAkJLmxlbiA9IHsgc2l6ZW9mKHN0cnVjdCBpd2xfdHhmaWZvX2ZsdXNoX2NtZCksIH0sCi0JCS5mbGFncyA9IENNRF9TWU5DLAogCQkuZGF0YSA9IHsgJmZsdXNoX2NtZCwgfSwKIAl9OwogCkBAIC0xODAsNyArMTc5LDcgQEAKIAkJZ290byBkb25lOwogCX0KIAlJV0xfREVCVUdfSU5GTyhwcml2LCAid2FpdCB0cmFuc21pdC9mbHVzaCBhbGwgZnJhbWVzXG4iKTsKLQlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eShwcml2LT50cmFucyk7CisJaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkocHJpdi0+dHJhbnMsIDB4ZmZmZmZmZmYpOwogZG9uZToKIAlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtMzMzLDEyICszMzIsMTIgQEAKIAkJbWVtY3B5KCZidF9jbWRfdjIuYmFzaWMsICZiYXNpYywKIAkJCXNpemVvZihiYXNpYykpOwogCQlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9CVF9DT05GSUcsCi0JCQlDTURfU1lOQywgc2l6ZW9mKGJ0X2NtZF92MiksICZidF9jbWRfdjIpOworCQkJMCwgc2l6ZW9mKGJ0X2NtZF92MiksICZidF9jbWRfdjIpOwogCX0gZWxzZSB7CiAJCW1lbWNweSgmYnRfY21kX3YxLmJhc2ljLCAmYmFzaWMsCiAJCQlzaXplb2YoYmFzaWMpKTsKIAkJcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQlRfQ09ORklHLAotCQkJQ01EX1NZTkMsIHNpemVvZihidF9jbWRfdjEpLCAmYnRfY21kX3YxKTsKKwkJCTAsIHNpemVvZihidF9jbWRfdjEpLCAmYnRfY21kX3YxKTsKIAl9CiAJaWYgKHJldCkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOwpAQCAtMTA0NCw3ICsxMDQzLDYgQEAKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfV09XTEFOX1BBVFRFUk5TLAogCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJfTsKIAlpbnQgaSwgZXJyOwogCkBAIC0xMjAxLDcgKzExOTksNiBAQAogCQlpZiAoa2V5X2RhdGEudXNlX3JzY190c2MpIHsKIAkJCXN0cnVjdCBpd2xfaG9zdF9jbWQgcnNjX3RzY19jbWQgPSB7CiAJCQkJLmlkID0gUkVQTFlfV09XTEFOX1RTQ19SU0NfUEFSQU1TLAotCQkJCS5mbGFncyA9IENNRF9TWU5DLAogCQkJCS5kYXRhWzBdID0ga2V5X2RhdGEucnNjX3RzYywKIAkJCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKIAkJCQkubGVuWzBdID0gc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwKQEAgLTEyMTUsNyArMTIxMiw3IEBACiAJCWlmIChrZXlfZGF0YS51c2VfdGtpcCkgewogCQkJcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwKIAkJCQkJCSBSRVBMWV9XT1dMQU5fVEtJUF9QQVJBTVMsCi0JCQkJCQkgQ01EX1NZTkMsIHNpemVvZih0a2lwX2NtZCksCisJCQkJCQkgMCwgc2l6ZW9mKHRraXBfY21kKSwKIAkJCQkJCSAmdGtpcF9jbWQpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDsKQEAgLTEyMzEsMjAgKzEyMjgsMjAgQEAKIAogCQkJcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwKIAkJCQkJCSBSRVBMWV9XT1dMQU5fS0VLX0tDS19NQVRFUklBTCwKLQkJCQkJCSBDTURfU1lOQywgc2l6ZW9mKGtla19rY2tfY21kKSwKKwkJCQkJCSAwLCBzaXplb2Yoa2VrX2tja19jbWQpLAogCQkJCQkJICZrZWtfa2NrX2NtZCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfRDNfQ09ORklHLCBDTURfU1lOQywKKwlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9EM19DT05GSUcsIDAsCiAJCQkJICAgICBzaXplb2YoZDNfY2ZnX2NtZCksICZkM19jZmdfY21kKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAogCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1dPV0xBTl9XQUtFVVBfRklMVEVSLAotCQkJCSBDTURfU1lOQywgc2l6ZW9mKHdha2V1cF9maWx0ZXJfY21kKSwKKwkJCQkgMCwgc2l6ZW9mKHdha2V1cF9maWx0ZXJfY21kKSwKIAkJCQkgJndha2V1cF9maWx0ZXJfY21kKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL21hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWM4MDIxMS5jCmluZGV4IGRkNTVjOWMuLjI5YWY3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL21hYzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbWFjODAyMTEuYwpAQCAtMTA5MSw3ICsxMDkxLDggQEAKIAkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBJV0xfTUFDODAyMTFfR0VUX0RWTShodyk7CiAKQEAgLTExMTksNyArMTEyMCw3IEBACiAJCX0KIAl9CiAJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJ3YWl0IHRyYW5zbWl0L2ZsdXNoIGFsbCBmcmFtZXNcbiIpOwotCWl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KHByaXYtPnRyYW5zKTsKKwlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eShwcml2LT50cmFucywgMHhmZmZmZmZmZik7CiBkb25lOgogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbWFpbi5jCmluZGV4IDZhNmRmNzEuLjBiN2Y0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWluLmMKQEAgLTEyOCw3ICsxMjgsNiBAQAogCXN0cnVjdCBpd2xfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZDsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfVFhfQkVBQ09OLAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKIAl1MzIgZnJhbWVfc2l6ZTsKQEAgLTMxMSw4ICszMTAsNyBAQAogCQkJCQlzaXplb2Yoc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCksCiAJCQkJCSZzdGF0aXN0aWNzX2NtZCk7CiAJZWxzZQotCQlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfU1RBVElTVElDU19DTUQsCi0JCQkJCUNNRF9TWU5DLAorCQlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfU1RBVElTVElDU19DTUQsIDAsCiAJCQkJCXNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kKSwKIAkJCQkJJnN0YXRpc3RpY3NfY21kKTsKIH0KQEAgLTYyMiw3ICs2MjAsNyBAQAogCiAJCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsCiAJCQkJICAgICAgIFJFUExZX0NUX0tJTExfQ09ORklHX0NNRCwKLQkJCQkgICAgICAgQ01EX1NZTkMsIHNpemVvZihhZHZfY21kKSwgJmFkdl9jbWQpOworCQkJCSAgICAgICAwLCBzaXplb2YoYWR2X2NtZCksICZhZHZfY21kKTsKIAkJaWYgKHJldCkKIAkJCUlXTF9FUlIocHJpdiwgIlJFUExZX0NUX0tJTExfQ09ORklHX0NNRCBmYWlsZWRcbiIpOwogCQllbHNlCkBAIC02MzcsNyArNjM1LDcgQEAKIAogCQlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LAogCQkJCSAgICAgICBSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQsCi0JCQkJICAgICAgIENNRF9TWU5DLCBzaXplb2YoY21kKSwgJmNtZCk7CisJCQkJICAgICAgIDAsIHNpemVvZihjbWQpLCAmY21kKTsKIAkJaWYgKHJldCkKIAkJCUlXTF9FUlIocHJpdiwgIlJFUExZX0NUX0tJTExfQ09ORklHX0NNRCBmYWlsZWRcbiIpOwogCQllbHNlCkBAIC02NzMsOSArNjcxLDcgQEAKIAogCWlmIChJV0xfVUNPREVfQVBJKHByaXYtPmZ3LT51Y29kZV92ZXIpID4gMSkgewogCQlJV0xfREVCVUdfSEMocHJpdiwgInNlbGVjdCB2YWxpZCB0eCBhbnQ6ICV1XG4iLCB2YWxpZF90eF9hbnQpOwotCQlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwKLQkJCQkJVFhfQU5UX0NPTkZJR1VSQVRJT05fQ01ELAotCQkJCQlDTURfU1lOQywKKwkJcmV0dXJuIGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsIFRYX0FOVF9DT05GSUdVUkFUSU9OX0NNRCwgMCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfdHhfYW50X2NvbmZpZ19jbWQpLAogCQkJCQkmdHhfYW50X2NtZCk7CiAJfSBlbHNlIHsKQEAgLTcwMyw3ICs2OTksNyBAQAogCQkoYnRfY21kLmZsYWdzID09IEJUX0NPRVhfRElTQUJMRSkgPyAiZGlzYWJsZSIgOiAiYWN0aXZlIik7CiAKIAlpZiAoaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQlRfQ09ORklHLAotCQkJICAgICBDTURfU1lOQywgc2l6ZW9mKHN0cnVjdCBpd2xfYnRfY21kKSwgJmJ0X2NtZCkpCisJCQkgICAgIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2J0X2NtZCksICZidF9jbWQpKQogCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gc2VuZCBCVCBDb2V4IENvbmZpZ1xuIik7CiB9CiAKQEAgLTk4Nyw3ICs5ODMsNyBAQAogCQkJaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOwogCQllbHNlCiAJCQlJV0xfRVJSKHByaXYsCi0JCQkJIkNhbm5vdCByZXF1ZXN0IHJlc3RhcnQgYmVmb3JlIHJlZ2lzdHJhdGluZyB3aXRoIG1hYzgwMjExIik7CisJCQkJIkNhbm5vdCByZXF1ZXN0IHJlc3RhcnQgYmVmb3JlIHJlZ2lzdHJhdGluZyB3aXRoIG1hYzgwMjExXG4iKTsKIAl9IGVsc2UgewogCQlXQVJOX09OKDEpOwogCX0KQEAgLTExMjcsNyArMTEyMyw2IEBACiBzdGF0aWMgaW50IGl3bF9lZXByb21faW5pdF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCXN0cnVjdCBpd2xfbnZtX2RhdGEgKmRhdGEgPSBwcml2LT5udm1fZGF0YTsKLQljaGFyICpkZWJ1Z19tc2c7CiAKIAlpZiAoZGF0YS0+c2t1X2NhcF8xMW5fZW5hYmxlICYmCiAJICAgICFwcml2LT5jZmctPmh0X3BhcmFtcykgewpAQCAtMTE0MSw4ICsxMTM2LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGVidWdfbXNnID0gIkRldmljZSBTS1U6IDI0R0h6ICVzICVzLCA1MkdIeiAlcyAlcywgMTEubiAlcyAlc1xuIjsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCBkZWJ1Z19tc2csCisJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJICAgICAgICJEZXZpY2UgU0tVOiAyNEdIeiAlcyAlcywgNTJHSHogJXMgJXMsIDExLm4gJXMgJXNcbiIsCiAJCSAgICAgICBkYXRhLT5za3VfY2FwX2JhbmRfMjRHSHpfZW5hYmxlID8gIiIgOiAiTk9UIiwgImVuYWJsZWQiLAogCQkgICAgICAgZGF0YS0+c2t1X2NhcF9iYW5kXzUyR0h6X2VuYWJsZSA/ICIiIDogIk5PVCIsICJlbmFibGVkIiwKIAkJICAgICAgIGRhdGEtPnNrdV9jYXBfMTFuX2VuYWJsZSA/ICIiIDogIk5PVCIsICJlbmFibGVkIik7CkBAIC0xMzUwLDcgKzEzNDUsNyBAQAogCWl3bF9zZXRfaHdfcGFyYW1zKHByaXYpOwogCiAJaWYgKCEocHJpdi0+bnZtX2RhdGEtPnNrdV9jYXBfaXBhbl9lbmFibGUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJZb3VyIEVFUFJPTSBkaXNhYmxlZCBQQU4iKTsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIllvdXIgRUVQUk9NIGRpc2FibGVkIFBBTlxuIik7CiAJCXVjb2RlX2ZsYWdzICY9IH5JV0xfVUNPREVfVExWX0ZMQUdTX1BBTjsKIAkJLyoKIAkJICogaWYgbm90IFBBTiwgdGhlbiBkb24ndCBzdXBwb3J0IFAyUCAtLSBtaWdodCBiZSBhIHVDb2RlCkBAIC0yMDE5LDEwICsyMDE0LDEwIEBACiAKIAlmb3IgKG1xID0gMDsgbXEgPCBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUU7IG1xKyspIHsKIAkJaWYgKCF0ZXN0X2JpdChtcSwgJnByaXYtPnRyYW5zcG9ydF9xdWV1ZV9zdG9wKSkgewotCQkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiV2FrZSBxdWV1ZSAlZCIsIG1xKTsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwgIldha2UgcXVldWUgJWRcbiIsIG1xKTsKIAkJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmh3LCBtcSk7CiAJCX0gZWxzZSB7Ci0JCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJEb24ndCB3YWtlIHF1ZXVlICVkIiwgbXEpOworCQkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiRG9uJ3Qgd2FrZSBxdWV1ZSAlZFxuIiwgbXEpOwogCQl9CiAJfQogCkBAIC0yMDUzLDYgKzIwNDgsMTcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9uYXBpX2FkZChzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUsCisJCQkgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuYXBpX2RldiwKKwkJCSBpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KSwKKwkJCSBpbnQgd2VpZ2h0KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IElXTF9PUF9NT0RFX0dFVF9EVk0ob3BfbW9kZSk7CisKKwlpZWVlODAyMTFfbmFwaV9hZGQocHJpdi0+aHcsIG5hcGksIG5hcGlfZGV2LCBwb2xsLCB3ZWlnaHQpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcF9tb2RlX29wcyBpd2xfZHZtX29wcyA9IHsKIAkuc3RhcnQgPSBpd2xfb3BfbW9kZV9kdm1fc3RhcnQsCiAJLnN0b3AgPSBpd2xfb3BfbW9kZV9kdm1fc3RvcCwKQEAgLTIwNjUsNiArMjA3MSw3IEBACiAJLmNtZF9xdWV1ZV9mdWxsID0gaXdsX2NtZF9xdWV1ZV9mdWxsLAogCS5uaWNfY29uZmlnID0gaXdsX25pY19jb25maWcsCiAJLndpbWF4X2FjdGl2ZSA9IGl3bF93aW1heF9hY3RpdmUsCisJLm5hcGlfYWRkID0gaXdsX25hcGlfYWRkLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcG93ZXIuYwppbmRleCBiNGU2MTQxLi5mMmMxNDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9wb3dlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3Bvd2VyLmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFszXSksCiAJCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzRdKSk7CiAKLQlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUE9XRVJfVEFCTEVfQ01ELCBDTURfU1lOQywKKwlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgUE9XRVJfVEFCTEVfQ01ELCAwLAogCQkJCXNpemVvZihzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kKSwgY21kKTsKIH0KIApAQCAtMzYxLDcgKzM2MSw3IEBACiAKIAkJbWVtY3B5KCZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZCwgY21kLCBzaXplb2YoKmNtZCkpOwogCX0gZWxzZQotCQlJV0xfRVJSKHByaXYsICJzZXQgcG93ZXIgZmFpbCwgcmV0ID0gJWQiLCByZXQpOworCQlJV0xfRVJSKHByaXYsICJzZXQgcG93ZXIgZmFpbCwgcmV0ID0gJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3JzLmMKaW5kZXggYWE3NzNhMi4uMzJiNzhhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9ycy5jCkBAIC0xNDUzLDcgKzE0NTMsNyBAQAogCQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIEJUIGxvYWQgJWQiLCBwcml2LT5idF90cmFmZmljX2xvYWQpOworCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIEJUIGxvYWQgJWRcbiIsIHByaXYtPmJ0X3RyYWZmaWNfbG9hZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTYyOCw3ICsxNjI4LDcgQEAKIAkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIEJUIGxvYWQgJWQiLCBwcml2LT5idF90cmFmZmljX2xvYWQpOworCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIEJUIGxvYWQgJWRcbiIsIHByaXYtPmJ0X3RyYWZmaWNfbG9hZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTc5OSw3ICsxNzk5LDcgQEAKIAkJCXRibC0+YWN0aW9uID0gSVdMX01JTU8yX1NXSVRDSF9TSVNPX0E7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgQlQgbG9hZCAlZCIsIHByaXYtPmJ0X3RyYWZmaWNfbG9hZCk7CisJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgQlQgbG9hZCAlZFxuIiwgcHJpdi0+YnRfdHJhZmZpY19sb2FkKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xOTY5LDcgKzE5NjksNyBAQAogCQkJdGJsLT5hY3Rpb24gPSBJV0xfTUlNTzNfU1dJVENIX1NJU09fQTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBCVCBsb2FkICVkIiwgcHJpdi0+YnRfdHJhZmZpY19sb2FkKTsKKwkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBCVCBsb2FkICVkXG4iLCBwcml2LT5idF90cmFmZmljX2xvYWQpOwogCQlicmVhazsKIAl9CiAKQEAgLTI3MDksNyArMjcwOSw3IEBACiAJcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7CiAJcnNfZmlsbF9saW5rX2NtZChOVUxMLCBscV9zdGEsIHJhdGUpOwogCXByaXYtPnN0YXRpb25zW2xxX3N0YS0+bHEuc3RhX2lkXS5scSA9ICZscV9zdGEtPmxxOwotCWl3bF9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7CisJaXdsX3NlbmRfbHFfY21kKHByaXYsIGN0eCwgJmxxX3N0YS0+bHEsIDAsIHRydWUpOwogfQogCiBzdGF0aWMgdm9pZCByc19nZXRfcmF0ZSh2b2lkICpwcml2X3IsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3J4LmMKaW5kZXggY2Q4Mzc3My4uZGViZWM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9yeC5jCkBAIC03ODYsNyArNzg2LDcgQEAKIAogCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgc3RhdHMsIHNpemVvZigqc3RhdHMpKTsKIAotCWllZWU4MDIxMV9yeF9uaShwcml2LT5odywgc2tiKTsKKwlpZWVlODAyMTFfcngocHJpdi0+aHcsIHNrYik7CiB9CiAKIHN0YXRpYyB1MzIgaXdsYWduX3RyYW5zbGF0ZV9yeF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgZGVjcnlwdF9pbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3J4b24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3J4b24uYwppbmRleCA1MDNhODFlLi5lZDUwZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9yeG9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnhvbi5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogCXNlbmQtPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsIGN0eC0+cnhvbl9jbWQsCi0JCQkJQ01EX1NZTkMsIHNpemVvZigqc2VuZCksIHNlbmQpOworCQkJCTAsIHNpemVvZigqc2VuZCksIHNlbmQpOwogCiAJc2VuZC0+ZmlsdGVyX2ZsYWdzID0gb2xkX2ZpbHRlcjsKIApAQCAtMTM0LDcgKzEzNCw3IEBACiAJc2VuZC0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CiAJc2VuZC0+ZGV2X3R5cGUgPSBSWE9OX0RFVl9UWVBFX1AyUDsKIAlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLAotCQkJCUNNRF9TWU5DLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKKwkJCQkwLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKIAogCXNlbmQtPmZpbHRlcl9mbGFncyA9IG9sZF9maWx0ZXI7CiAJc2VuZC0+ZGV2X3R5cGUgPSBvbGRfZGV2X3R5cGU7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAlpbnQgcmV0OwogCiAJc2VuZC0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwgQ01EX1NZTkMsCisJcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwgMCwKIAkJCQlzaXplb2YoKnNlbmQpLCBzZW5kKTsKIAogCXNlbmQtPmZpbHRlcl9mbGFncyA9IG9sZF9maWx0ZXI7CkBAIC0xODksNyArMTg5LDcgQEAKIAkJICAgICAgY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlLAogCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MpOwogCi0JcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5xb3NfY21kLCBDTURfU1lOQywKKwlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnFvc19jbWQsIDAsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcW9zcGFyYW1fY21kKSwKIAkJCSAgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0pOwogCWlmIChyZXQpCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmF0aW1fd2luZG93KSk7CiAKIAlyZXR1cm4gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX3RpbWluZ19jbWQsCi0JCQkJQ01EX1NZTkMsIHNpemVvZihjdHgtPnRpbWluZyksICZjdHgtPnRpbWluZyk7CisJCQkJMCwgc2l6ZW9mKGN0eC0+dGltaW5nKSwgJmN0eC0+dGltaW5nKTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fcnhvbl9kaXNjb25uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTQ5NSw3ICs0OTUsNyBAQAogCSAqIEFzc29jaWF0ZWQgUlhPTiBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAogCSAqIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBzdGF0aW9ucyBldGMuIGFmdGVyIHRoaXMuCiAJICovCi0JcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwgQ01EX1NZTkMsCisJcmV0ID0gaXdsX2R2bV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwgMCwKIAkJICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcnhvbl9jbWQpLCAmY3R4LT5zdGFnaW5nKTsKIAlpZiAocmV0KSB7CiAJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgbmV3IFJYT04gKCVkKVxuIiwgcmV0KTsKQEAgLTYxMCw3ICs2MTAsNyBAQAogCWNtZC5zbG90c1swXS53aWR0aCA9IGNwdV90b19sZTE2KHNsb3QwKTsKIAljbWQuc2xvdHNbMV0ud2lkdGggPSBjcHVfdG9fbGUxNihzbG90MSk7CiAKLQlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9XSVBBTl9QQVJBTVMsIENNRF9TWU5DLAorCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1dJUEFOX1BBUkFNUywgMCwKIAkJCXNpemVvZihjbWQpLCAmY21kKTsKIAlpZiAocmV0KQogCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIFBBTiBwYXJhbWV0ZXJzICglZClcbiIsIHJldCk7CkBAIC04MjMsNyArODIzLDcgQEAKIAogCWlmICgocnhvbi0+ZmxhZ3MgJiAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSykpCiAJCQk9PSAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkNDSyBhbmQgYXV0byBkZXRlY3QiKTsKKwkJSVdMX1dBUk4ocHJpdiwgIkNDSyBhbmQgYXV0byBkZXRlY3RcbiIpOwogCQllcnJvcnMgfD0gQklUKDgpOwogCX0KIApAQCAtMTM5NSw3ICsxMzk1LDcgQEAKIAkJCXByaXYtPnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQpOwogCQlyZXQgPSBpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LAogCQkJCQlSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkJCQlDTURfU1lOQywgc2l6ZW9mKGNtZCksICZjbWQpOworCQkJCQkwLCBzaXplb2YoY21kKSwgJmNtZCk7CiAJCWlmIChyZXQpCiAJCQlJV0xfRVJSKHByaXYsCiAJCQkJIkNvdWxkIG5vdCBzZW5kIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTURcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vc2Nhbi5jCmluZGV4IGJlOThiOTEuLjQzYmVmOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9zY2FuLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9TQ0FOX0FCT1JUX0NNRCwKLQkJLmZsYWdzID0gQ01EX1NZTkMgfCBDTURfV0FOVF9TS0IsCisJCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKIAl9OwogCV9fbGUzMiAqc3RhdHVzOwogCkBAIC02MzksNyArNjM5LDYgQEAKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfU0NBTl9DTUQsCiAJCS5sZW4gPSB7IHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY21kKSwgfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJfTsKIAlzdHJ1Y3QgaXdsX3NjYW5fY21kICpzY2FuOwogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3N0YS5jCmluZGV4IDljZGQ5MWMuLjZlYzg2YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3N0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3N0YS5jCkBAIC0zOSw3ICszOSw3IEBACiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c3RhX2xvY2spOwogCiAJaWYgKHN0YV9pZCA+PSBJV0xBR05fU1RBVElPTl9DT1VOVCkgewotCQlJV0xfRVJSKHByaXYsICJpbnZhbGlkIHN0YV9pZCAldSIsIHN0YV9pZCk7CisJCUlXTF9FUlIocHJpdiwgImludmFsaWQgc3RhX2lkICV1XG4iLCBzdGFfaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCEocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9EUklWRVJfQUNUSVZFKSkKQEAgLTE2NSw3ICsxNjUsNyBAQAogCWl3bF9mcmVlX3Jlc3AoJmNtZCk7CiAKIAlpZiAoY21kLmhhbmRsZXJfc3RhdHVzKQotCQlJV0xfRVJSKHByaXYsICIlcyAtIGVycm9yIGluIHRoZSBDTUQgcmVzcG9uc2UgJWQiLCBfX2Z1bmNfXywKKwkJSVdMX0VSUihwcml2LCAiJXMgLSBlcnJvciBpbiB0aGUgQ01EIHJlc3BvbnNlICVkXG4iLCBfX2Z1bmNfXywKIAkJCWNtZC5oYW5kbGVyX3N0YXR1cyk7CiAKIAlyZXR1cm4gY21kLmhhbmRsZXJfc3RhdHVzOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJY21kLnN0YXRpb25fZmxhZ3MgPSBmbGFnczsKIAljbWQuc3RhLnN0YV9pZCA9IHN0YV9pZDsKIAotCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZjbWQsIENNRF9TWU5DKTsKKwlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmY21kLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgaXdsX3NldF9odF9hZGRfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGluZGV4LApAQCAtNDEzLDcgKzQxMyw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsKIAogCS8qIEFkZCBzdGF0aW9uIHRvIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KLQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CisJcmV0ID0gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgMCk7CiAJaWYgKHJldCkgewogCQlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsKIAkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCkBAIC00NTYsNyArNDU2LDYgQEAKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfUkVNT1ZFX1NUQSwKIAkJLmxlbiA9IHsgc2l6ZW9mKHN0cnVjdCBpd2xfcmVtX3N0YV9jbWQpLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAkJLmRhdGEgPSB7ICZybV9zdGFfY21kLCB9LAogCX07CiAKQEAgLTc0MCw3ICs3MzksNyBAQAogCQkJCQlzZW5kX2xxID0gdHJ1ZTsKIAkJCX0KIAkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7Ci0JCQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CisJCQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCAwKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsKIAkJCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKQEAgLTc1Niw4ICs3NTUsNyBAQAogCQkJICogY3VycmVudCBMUSBjb21tYW5kCiAJCQkgKi8KIAkJCWlmIChzZW5kX2xxKQotCQkJCWl3bF9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscSwKLQkJCQkJCUNNRF9TWU5DLCB0cnVlKTsKKwkJCQlpd2xfc2VuZF9scV9jbWQocHJpdiwgY3R4LCAmbHEsIDAsIHRydWUpOwogCQkJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7CiAJCQlwcml2LT5zdGF0aW9uc1tpXS51c2VkICY9IH5JV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CiAJCX0KQEAgLTk2OCw3ICs5NjYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSBpd2xfc2VuZF9scV9jbWQocHJpdiwgY3R4LCBsaW5rX2NtZCwgQ01EX1NZTkMsIHRydWUpOworCXJldCA9IGl3bF9zZW5kX2xxX2NtZChwcml2LCBjdHgsIGxpbmtfY21kLCAwLCB0cnVlKTsKIAlpZiAocmV0KQogCQlJV0xfRVJSKHByaXYsICJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIApAQCAtOTk5LDcgKzk5Nyw2IEBACiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IGN0eC0+d2VwX2tleV9jbWQsCiAJCS5kYXRhID0geyB3ZXBfY21kLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCiAJbWlnaHRfc2xlZXAoKTsKQEAgLTEyNDgsNyArMTI0NSw3IEBACiAJc3RhX2NtZC5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwogCXN0YV9jbWQubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CiAKLQlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCAwKTsKIH0KIAogaW50IGl3bF9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtMTI4NCwxMyArMTI4MSwxMyBAQAogCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5Y29uZiwgMCwgJnNlcSk7CiAJCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5Y29uZiwgYWRkciwgc2VxLnRraXAuaXYzMiwgcDFrKTsKIAkJcmV0ID0gaXdsYWduX3NlbmRfc3RhX2tleShwcml2LCBrZXljb25mLCBzdGFfaWQsCi0JCQkJCSAgc2VxLnRraXAuaXYzMiwgcDFrLCBDTURfU1lOQyk7CisJCQkJCSAgc2VxLnRraXAuaXYzMiwgcDFrLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCXJldCA9IGl3bGFnbl9zZW5kX3N0YV9rZXkocHJpdiwga2V5Y29uZiwgc3RhX2lkLAotCQkJCQkgIDAsIE5VTEwsIENNRF9TWU5DKTsKKwkJCQkJICAwLCBOVUxMLCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJSVdMX0VSUihwcml2LCAiVW5rbm93biBjaXBoZXIgJXhcbiIsIGtleWNvbmYtPmNpcGhlcik7CkBAIC0xNDA5LDcgKzE0MDYsNyBAQAogCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKSk7CiAJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsKIAotCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CisJcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIDApOwogfQogCiBpbnQgaXdsX3N0YV9yeF9hZ2dfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLApAQCAtMTQzMyw3ICsxNDMwLDcgQEAKIAltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwogCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCAwKTsKIH0KIAogaW50IGl3bF9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLApAQCAtMTQ1OCw3ICsxNDU1LDcgQEAKIAltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwogCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCAwKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS90dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdHQuYwppbmRleCAwNThjNTg5Li5hY2I5ODFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS90dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3R0LmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogewogCUlXTF9ERUJVR19URU1QKHByaXYsICJQcmVwYXJlIHRvIGVudGVyIElXTF9USV9DVF9LSUxMXG4iKTsKIAkvKiBtYWtlIHJlcXVlc3QgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBpbmZvcm1hdGlvbiAqLwotCWl3bF9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfU1lOQywgZmFsc2UpOworCWl3bF9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCAwLCBmYWxzZSk7CiAJLyogUmVzY2hlZHVsZSB0aGUgY3Rfa2lsbCB3YWl0IHRpbWVyICovCiAJbW9kX3RpbWVyKCZwcml2LT50aGVybWFsX3Rocm90dGxlLmN0X2tpbGxfd2FpdGluZ190bSwKIAkJIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKENUX0tJTExfV0FJVElOR19EVVJBVElPTikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3R4LmMKaW5kZXggMzk4ZGQwOS4uMzI1NWExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS90eC5jCkBAIC00MDIsMTAgKzQwMiwxMCBAQAogCQkvKiBhZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGhpcyA8c3RhLHRpZD4gKi8KIAkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSAmJgogCQkgICAgdGlkX2RhdGEtPmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09OKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUWF9DVExfQU1QRFUgd2hpbGUgbm90IGluIEFHRzoiCi0JCQkJIiBUeCBmbGFncyA9IDB4JTA4eCwgYWdnLnN0YXRlID0gJWQiLAorCQkJSVdMX0VSUihwcml2LAorCQkJCSJUWF9DVExfQU1QRFUgd2hpbGUgbm90IGluIEFHRzogVHggZmxhZ3MgPSAweCUwOHgsIGFnZy5zdGF0ZSA9ICVkXG4iLAogCQkJCWluZm8tPmZsYWdzLCB0aWRfZGF0YS0+YWdnLnN0YXRlKTsKLQkJCUlXTF9FUlIocHJpdiwgInN0YV9pZCA9ICVkLCB0aWQgPSAlZCBzZXFfbnVtID0gJWQiLAorCQkJSVdMX0VSUihwcml2LCAic3RhX2lkID0gJWQsIHRpZCA9ICVkIHNlcV9udW0gPSAlZFxuIiwKIAkJCQlzdGFfaWQsIHRpZCwKIAkJCQlJRUVFODAyMTFfU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKSk7CiAJCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKQEAgLTQxNiw3ICs0MTYsNyBAQAogCQkgKi8KIAkJaWYgKFdBUk5fT05DRSh0aWRfZGF0YS0+YWdnLnN0YXRlICE9IElXTF9BR0dfT04gJiYKIAkJCSAgICAgIHRpZF9kYXRhLT5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PRkYsCi0JCSAgICAiVHggd2hpbGUgYWdnLnN0YXRlID0gJWQiLCB0aWRfZGF0YS0+YWdnLnN0YXRlKSkKKwkJCSAgICAgICJUeCB3aGlsZSBhZ2cuc3RhdGUgPSAlZFxuIiwgdGlkX2RhdGEtPmFnZy5zdGF0ZSkpCiAJCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKIAogCQlzZXFfbnVtYmVyID0gdGlkX2RhdGEtPnNlcV9udW1iZXI7CkBAIC03NzgsOCArNzc4LDggQEAKIAkJLyogVGhlcmUgYXJlIG5vIHBhY2tldHMgZm9yIHRoaXMgUkEgLyBUSUQgaW4gdGhlIEhXIGFueSBtb3JlICovCiAJCWlmICh0aWRfZGF0YS0+YWdnLnNzbiA9PSB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpIHsKIAkJCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwKLQkJCQkiQ2FuIGNvbnRpbnVlIERFTEJBIGZsb3cgc3NuID0gbmV4dF9yZWNsID0iCi0JCQkJIiAlZCIsIHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7CisJCQkJIkNhbiBjb250aW51ZSBERUxCQSBmbG93IHNzbiA9IG5leHRfcmVjbCA9ICVkXG4iLAorCQkJCXRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7CiAJCQlpd2xfdHJhbnNfdHhxX2Rpc2FibGUocHJpdi0+dHJhbnMsCiAJCQkJCSAgICAgIHRpZF9kYXRhLT5hZ2cudHhxX2lkKTsKIAkJCWl3bGFnbl9kZWFsbG9jX2FnZ190eHEocHJpdiwgdGlkX2RhdGEtPmFnZy50eHFfaWQpOwpAQCAtNzkxLDggKzc5MSw4IEBACiAJCS8qIFRoZXJlIGFyZSBubyBwYWNrZXRzIGZvciB0aGlzIFJBIC8gVElEIGluIHRoZSBIVyBhbnkgbW9yZSAqLwogCQlpZiAodGlkX2RhdGEtPmFnZy5zc24gPT0gdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKSB7CiAJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsCi0JCQkJIkNhbiBjb250aW51ZSBBRERCQSBmbG93IHNzbiA9IG5leHRfcmVjbCA9IgotCQkJCSIgJWQiLCB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOworCQkJCSJDYW4gY29udGludWUgQUREQkEgZmxvdyBzc24gPSBuZXh0X3JlY2wgPSAlZFxuIiwKKwkJCQl0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOwogCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfU1RBUlRJTkc7CiAJCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7CiAJCX0KQEAgLTEyMTYsOCArMTIxNiw4IEBACiAJCQkgICAgY3R4LT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogCQkJCS8qIGJsb2NrIGFuZCBzdG9wIGFsbCBxdWV1ZXMgKi8KIAkJCQlwcml2LT5wYXNzaXZlX25vX3J4ID0gdHJ1ZTsKLQkJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJzdG9wIGFsbCBxdWV1ZXM6ICIKLQkJCQkJCSAgICAicGFzc2l2ZSBjaGFubmVsIik7CisJCQkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LAorCQkJCQkic3RvcCBhbGwgcXVldWVzOiBwYXNzaXZlIGNoYW5uZWxcbiIpOwogCQkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CiAKIAkJCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKQEAgLTEyNzEsNyArMTI3MSw3IEBACiAKIAl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2ticykpIHsKIAkJc2tiID0gX19za2JfZGVxdWV1ZSgmc2ticyk7Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfbmkocHJpdi0+aHcsIHNrYik7CisJCWllZWU4MDIxMV90eF9zdGF0dXMocHJpdi0+aHcsIHNrYik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNDExLDcgKzE0MTEsNyBAQAogCiAJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnJlY2xhaW1lZF9za2JzKSkgewogCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZyZWNsYWltZWRfc2ticyk7Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfbmkocHJpdi0+aHcsIHNrYik7CisJCWllZWU4MDIxMV90eF9zdGF0dXMocHJpdi0+aHcsIHNrYik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS91Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdWNvZGUuYwppbmRleCBjZjAzZWY1Li5kNWNlZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS91Y29kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3Vjb2RlLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCW1lbXNldCgmY29leF9jbWQsIDAsIHNpemVvZihjb2V4X2NtZCkpOwogCiAJcmV0dXJuIGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsCi0JCQkJQ09FWF9QUklPUklUWV9UQUJMRV9DTUQsIENNRF9TWU5DLAorCQkJCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01ELCAwLAogCQkJCXNpemVvZihjb2V4X2NtZCksICZjb2V4X2NtZCk7CiB9CiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogCW1lbWNweShwcmlvX3RibF9jbWQucHJpb190YmwsIGl3bF9idF9wcmlvX3RibCwKIAkJc2l6ZW9mKGl3bF9idF9wcmlvX3RibCkpOwogCWlmIChpd2xfZHZtX3NlbmRfY21kX3BkdShwcml2LAotCQkJCVJFUExZX0JUX0NPRVhfUFJJT19UQUJMRSwgQ01EX1NZTkMsCisJCQkJUkVQTFlfQlRfQ09FWF9QUklPX1RBQkxFLCAwLAogCQkJCXNpemVvZihwcmlvX3RibF9jbWQpLCAmcHJpb190YmxfY21kKSkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgcHJpbyB0YmwgY29tbWFuZFxuIik7CiB9CkBAIC0yMTgsNyArMjE4LDcgQEAKIAllbnZfY21kLmFjdGlvbiA9IGFjdGlvbjsKIAllbnZfY21kLnR5cGUgPSB0eXBlOwogCXJldCA9IGl3bF9kdm1fc2VuZF9jbWRfcGR1KHByaXYsCi0JCQkgICAgICAgUkVQTFlfQlRfQ09FWF9QUk9UX0VOViwgQ01EX1NZTkMsCisJCQkgICAgICAgUkVQTFlfQlRfQ09FWF9QUk9UX0VOViwgMCwKIAkJCSAgICAgICBzaXplb2YoZW52X2NtZCksICZlbnZfY21kKTsKIAlpZiAocmV0KQogCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gc2VuZCBCVCBlbnYgY29tbWFuZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKaW5kZXggODU0YmE4NC4uYzM4MTdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwpAQCAtNjIsNiArNjIsNyBAQAogCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCiAJLndkX3RpbWVvdXQgPSBJV0xfV0FUQ0hET0dfRElTQUJMRUQsCiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDEyOCwKKwkuc2NkX2NoYWluX2V4dF93YSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsMTAwMF9odF9wYXJhbXMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggM2U2MzMyMy4uMjFlNWQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtNzUsNiArNzUsNyBAQAogCS53ZF90aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VULAogCS5tYXhfZXZlbnRfbG9nX3NpemUgPSA1MTIsCiAJLnNoYWRvd19yZWdfZW5hYmxlID0gZmFsc2UsIC8qIFRPRE86IGZpeCBidWdzIHVzaW5nIHRoaXMgZmVhdHVyZSAqLworCS5zY2RfY2hhaW5fZXh0X3dhID0gdHJ1ZSwKIH07CiAKIApAQCAtODgsNiArODksNyBAQAogCS53ZF90aW1lb3V0ID0gSVdMX0xPTkdfV0RfVElNRU9VVCwKIAkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAogCS5zaGFkb3dfcmVnX2VuYWJsZSA9IGZhbHNlLCAvKiBUT0RPOiBmaXggYnVncyB1c2luZyB0aGlzIGZlYXR1cmUgKi8KKwkuc2NkX2NoYWluX2V4dF93YSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsMjAwMF9odF9wYXJhbXMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKaW5kZXggNjY3NGYyYy4uMzMyYmJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwpAQCAtNjEsNiArNjEsNyBAQAogCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCiAJLndkX3RpbWVvdXQgPSBJV0xfV0FUQ0hET0dfRElTQUJMRUQsCiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKKwkuc2NkX2NoYWluX2V4dF93YSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsNTAwMF9odF9wYXJhbXMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKaW5kZXggODA0OGRlOS4uOGYyYzNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwpAQCAtODUsNiArODUsNyBAQAogCS53ZF90aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VULAogCS5tYXhfZXZlbnRfbG9nX3NpemUgPSA1MTIsCiAJLnNoYWRvd19yZWdfZW5hYmxlID0gZmFsc2UsIC8qIFRPRE86IGZpeCBidWdzIHVzaW5nIHRoaXMgZmVhdHVyZSAqLworCS5zY2RfY2hhaW5fZXh0X3dhID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDYwNTBfYmFzZV9wYXJhbXMgPSB7CkBAIC05Nyw2ICs5OCw3IEBACiAJLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDEwMjQsCiAJLnNoYWRvd19yZWdfZW5hYmxlID0gZmFsc2UsIC8qIFRPRE86IGZpeCBidWdzIHVzaW5nIHRoaXMgZmVhdHVyZSAqLworCS5zY2RfY2hhaW5fZXh0X3dhID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDYwMDBfZzJfYmFzZV9wYXJhbXMgPSB7CkBAIC0xMDksNiArMTExLDcgQEAKIAkud2RfdGltZW91dCA9IElXTF9MT05HX1dEX1RJTUVPVVQsCiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKIAkuc2hhZG93X3JlZ19lbmFibGUgPSBmYWxzZSwgLyogVE9ETzogZml4IGJ1Z3MgdXNpbmcgdGhpcyBmZWF0dXJlICovCisJLnNjZF9jaGFpbl9leHRfd2EgPSB0cnVlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDYwMDBfaHRfcGFyYW1zID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNzAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNzAwMC5jCmluZGV4IDRjMmQ0ZWYuLjQ4NzMwMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTcwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC03MDAwLmMKQEAgLTcxLDEyICs3MSwxMiBAQAogI2RlZmluZSBJV0wzMTYwX1VDT0RFX0FQSV9NQVgJOQogCiAvKiBPbGRlc3QgdmVyc2lvbiB3ZSB3b24ndCB3YXJuIGFib3V0ICovCi0jZGVmaW5lIElXTDcyNjBfVUNPREVfQVBJX09LCTgKLSNkZWZpbmUgSVdMMzE2MF9VQ09ERV9BUElfT0sJOAorI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9PSwk5CisjZGVmaW5lIElXTDMxNjBfVUNPREVfQVBJX09LCTkKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JNwotI2RlZmluZSBJV0wzMTYwX1VDT0RFX0FQSV9NSU4JNworI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JOAorI2RlZmluZSBJV0wzMTYwX1VDT0RFX0FQSV9NSU4JOAogCiAvKiBOVk0gdmVyc2lvbnMgKi8KICNkZWZpbmUgSVdMNzI2MF9OVk1fVkVSU0lPTgkJMHgwYTFkCkBAIC05OCw3ICs5OCw3IEBACiAjZGVmaW5lIE5WTV9IV19TRUNUSU9OX05VTV9GQU1JTFlfNzAwMAkJMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9iYXNlX3BhcmFtcyBpd2w3MDAwX2Jhc2VfcGFyYW1zID0gewotCS5lZXByb21fc2l6ZSA9IE9UUF9MT1dfSU1BR0VfU0laRSwKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkVfRkFNSUxZXzcwMDAsCiAJLm51bV9vZl9xdWV1ZXMgPSBJV0xBR05fTlVNX1FVRVVFUywKIAkucGxsX2NmZ192YWwgPSAwLAogCS5zaGFkb3dfcmFtX3N1cHBvcnQgPSB0cnVlLApAQCAtMTA3LDYgKzEwNyw3IEBACiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKIAkuc2hhZG93X3JlZ19lbmFibGUgPSB0cnVlLAogCS5wY2llX2wxX2FsbG93ZWQgPSB0cnVlLAorCS5hcG1nX3dha2VfdXBfd2EgPSB0cnVlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDcwMDBfaHRfcGFyYW1zID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtODAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtODAwMC5jCmluZGV4IGY1YmQ4MmIuLjUxYzQxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTgwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC04MDAwLmMKQEAgLTgzLDkgKzgzLDEwIEBACiAjZGVmaW5lIElXTDgwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMODAwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIE5WTV9IV19TRUNUSU9OX05VTV9GQU1JTFlfODAwMAkJMTAKKyNkZWZpbmUgREVGQVVMVF9OVk1fRklMRV9GQU1JTFlfODAwMAkJIml3bF9udm1fODAwMC5iaW4iCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDgwMDBfYmFzZV9wYXJhbXMgPSB7Ci0JLmVlcHJvbV9zaXplID0gT1RQX0xPV19JTUFHRV9TSVpFLAorCS5lZXByb21fc2l6ZSA9IE9UUF9MT1dfSU1BR0VfU0laRV9GQU1JTFlfODAwMCwKIAkubnVtX29mX3F1ZXVlcyA9IElXTEFHTl9OVU1fUVVFVUVTLAogCS5wbGxfY2ZnX3ZhbCA9IDAsCiAJLnNoYWRvd19yYW1fc3VwcG9ydCA9IHRydWUsCkBAIC0xMTgsNiArMTE5LDcgQEAKIAkuaHRfcGFyYW1zID0gJml3bDgwMDBfaHRfcGFyYW1zLAogCS5udm1fdmVyID0gSVdMODAwMF9OVk1fVkVSU0lPTiwKIAkubnZtX2NhbGliX3ZlciA9IElXTDgwMDBfVFhfUE9XRVJfVkVSU0lPTiwKKwkuZGVmYXVsdF9udm1fZmlsZSA9IERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDAsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4MjYwX25fY2ZnID0gewpAQCAtMTI3LDYgKzEyOSw3IEBACiAJLmh0X3BhcmFtcyA9ICZpd2w4MDAwX2h0X3BhcmFtcywKIAkubnZtX3ZlciA9IElXTDgwMDBfTlZNX1ZFUlNJT04sCiAJLm52bV9jYWxpYl92ZXIgPSBJV0w4MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLmRlZmF1bHRfbnZtX2ZpbGUgPSBERUZBVUxUX05WTV9GSUxFX0ZBTUlMWV84MDAwLAogfTsKIAogTU9EVUxFX0ZJUk1XQVJFKElXTDgwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDgwMDBfVUNPREVfQVBJX09LKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ody5oCmluZGV4IDdmMzdmYjguLjA0YTQ4M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ody5oCkBAIC0xMDIsOSArMTAyLDcgQEAKIAogLyogRUVQUk9NICovCiAjZGVmaW5lIElXTEFHTl9FRVBST01fSU1HX1NJWkUJCTIwNDgKLS8qIE9UUCAqLwotLyogbG93ZXIgYmxvY2tzIGNvbnRhaW4gRUVQUk9NIGltYWdlIGFuZCBjYWxpYnJhdGlvbiBkYXRhICovCi0jZGVmaW5lIE9UUF9MT1dfSU1BR0VfU0laRQkJKDIgKiA1MTIgKiBzaXplb2YodTE2KSkgLyogMiBLQiAqLworCiAvKiBoaWdoIGJsb2NrcyBjb250YWluIFBBUEQgZGF0YSAqLwogI2RlZmluZSBPVFBfSElHSF9JTUFHRV9TSVpFXzZ4MDAgICAgICAgICg2ICogNTEyICogc2l6ZW9mKHUxNikpIC8qIDYgS0IgKi8KICNkZWZpbmUgT1RQX0hJR0hfSU1BR0VfU0laRV8xMDAwICAgICAgICAoMHgyMDAgKiBzaXplb2YodTE2KSkgLyogMTAyNCBieXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb25maWcuaAppbmRleCAzZjE3ZGMzLi5iNzA0NzkwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmgKQEAgLTE0Niw2ICsxNDYsOSBAQAogICogQHdkX3RpbWVvdXQ6IFRYIHF1ZXVlcyB3YXRjaGRvZyB0aW1lb3V0CiAgKiBAbWF4X2V2ZW50X2xvZ19zaXplOiBzaXplIG9mIGV2ZW50IGxvZyBidWZmZXIgc2l6ZSBmb3IgdWNvZGUgZXZlbnQgbG9nZ2luZwogICogQHNoYWRvd19yZWdfZW5hYmxlOiBIVyBzaGFkb3cgcmVnaXN0ZXIgc3VwcG9ydAorICogQGFwbWdfd2FrZV91cF93YTogc2hvdWxkIHRoZSBNQUMgYWNjZXNzIFJFUSBiZSBhc3NlcnRlZCB3aGVuIGEgY29tbWFuZAorICoJaXMgaW4gZmxpZ2h0LiBUaGlzIGlzIGR1ZSB0byBhIEhXIGJ1ZyBpbiA3MjYwLCAzMTYwIGFuZCA3MjY1LgorICogQHNjZF9jaGFpbl9leHRfd2E6IHNob3VsZCB0aGUgY2hhaW4gZXh0ZW5zaW9uIGZlYXR1cmUgaW4gU0NEIGJlIGRpc2FibGVkLgogICovCiBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIHsKIAlpbnQgZWVwcm9tX3NpemU7CkBAIC0xNjAsNiArMTYzLDggQEAKIAl1MzIgbWF4X2V2ZW50X2xvZ19zaXplOwogCWNvbnN0IGJvb2wgc2hhZG93X3JlZ19lbmFibGU7CiAJY29uc3QgYm9vbCBwY2llX2wxX2FsbG93ZWQ7CisJY29uc3QgYm9vbCBhcG1nX3dha2VfdXBfd2E7CisJY29uc3QgYm9vbCBzY2RfY2hhaW5fZXh0X3dhOwogfTsKIAogLyoKQEAgLTE4OCw2ICsxOTMsMTEgQEAKICNkZWZpbmUgRUVQUk9NXzYwMDBfUkVHX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUwkweDgwCiAjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MAkJMAogCisvKiBsb3dlciBibG9ja3MgY29udGFpbiBFRVBST00gaW1hZ2UgYW5kIGNhbGlicmF0aW9uIGRhdGEgKi8KKyNkZWZpbmUgT1RQX0xPV19JTUFHRV9TSVpFCQkoMiAqIDUxMiAqIHNpemVvZih1MTYpKSAvKiAyIEtCICovCisjZGVmaW5lIE9UUF9MT1dfSU1BR0VfU0laRV9GQU1JTFlfNzAwMAkoMTYgKiA1MTIgKiBzaXplb2YodTE2KSkgLyogMTYgS0IgKi8KKyNkZWZpbmUgT1RQX0xPV19JTUFHRV9TSVpFX0ZBTUlMWV84MDAwCSgzMiAqIDUxMiAqIHNpemVvZih1MTYpKSAvKiAzMiBLQiAqLworCiBzdHJ1Y3QgaXdsX2VlcHJvbV9wYXJhbXMgewogCWNvbnN0IHU4IHJlZ3VsYXRvcnlfYmFuZHNbN107CiAJYm9vbCBlbmhhbmNlZF90eHBvd2VyOwpAQCAtMjY0LDYgKzI3NCw4IEBACiAJdTggICBudm1faHdfc2VjdGlvbl9udW07CiAJYm9vbCBscF94dGFsX3dvcmthcm91bmQ7CiAJY29uc3Qgc3RydWN0IGl3bF9wd3JfdHhfYmFja29mZiAqcHdyX3R4X2JhY2tvZmZzOworCWJvb2wgbm9fcG93ZXJfdXBfbmljX2luX2luaXQ7CisJY29uc3QgY2hhciAqZGVmYXVsdF9udm1fZmlsZTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuYwppbmRleCA4YTQ0ZjU5Li4wOWZlZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmMKQEAgLTYxLDggKzYxLDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgREVCVUcKLQogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgpAQCAtMTI4LDggKzEyNiw4IEBACiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKIAlpZiAoaXdsX2hhdmVfZGVidWdfbGV2ZWwobGV2ZWwpICYmCiAJICAgICghbGltaXQgfHwgbmV0X3JhdGVsaW1pdCgpKSkKLQkJZGV2X2RiZyhkZXYsICIlYyAlcyAlcFYiLCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywKLQkJCWZ1bmN0aW9uLCAmdmFmKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsICIlYyAlcyAlcFYiLAorCQkJICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIGZ1bmN0aW9uLCAmdmFmKTsKICNlbmRpZgogCXRyYWNlX2l3bHdpZmlfZGJnKGxldmVsLCBpbl9pbnRlcnJ1cHQoKSwgZnVuY3Rpb24sICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCmluZGV4IGM4Y2JkYmUuLjI5NTA4MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaApAQCAtNDcsMTIgKzQ3LDMyIEBACiB2b2lkIF9faXdsX2luZm8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19wcmludGYoMiwgMyk7CiB2b2lkIF9faXdsX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19wcmludGYoMiwgMyk7CiAKKy8qIG5vdCBhbGwgY29tcGlsZXJzIGNhbiBldmFsdWF0ZSBzdHJsZW4oKSBhdCBjb21waWxlIHRpbWUsIHNvIHVzZSBzaXplb2YoKSAqLworI2RlZmluZSBDSEVDS19GT1JfTkVXTElORShmKSBCVUlMRF9CVUdfT04oZltzaXplb2YoZikgLSAyXSAhPSAnXG4nKQorCiAvKiBObyBtYXR0ZXIgd2hhdCBpcyBtIChwcml2LCBidXMsIHRyYW5zKSwgdGhpcyB3aWxsIHdvcmsgKi8KLSNkZWZpbmUgSVdMX0VSUihtLCBmLCBhLi4uKSBfX2l3bF9lcnIoKG0pLT5kZXYsIGZhbHNlLCBmYWxzZSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0VSUl9ERVYoZCwgZiwgYS4uLikgX19pd2xfZXJyKChkKSwgZmFsc2UsIGZhbHNlLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfV0FSTihtLCBmLCBhLi4uKSBfX2l3bF93YXJuKChtKS0+ZGV2LCBmLCAjIyBhKQotI2RlZmluZSBJV0xfSU5GTyhtLCBmLCBhLi4uKSBfX2l3bF9pbmZvKChtKS0+ZGV2LCBmLCAjIyBhKQotI2RlZmluZSBJV0xfQ1JJVChtLCBmLCBhLi4uKSBfX2l3bF9jcml0KChtKS0+ZGV2LCBmLCAjIyBhKQorI2RlZmluZSBJV0xfRVJSX0RFVihkLCBmLCBhLi4uKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUNIRUNLX0ZPUl9ORVdMSU5FKGYpOwkJCQkJXAorCQlfX2l3bF9lcnIoKGQpLCBmYWxzZSwgZmFsc2UsIGYsICMjIGEpOwkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBJV0xfRVJSKG0sIGYsIGEuLi4pCQkJCQkJXAorCUlXTF9FUlJfREVWKChtKS0+ZGV2LCBmLCAjIyBhKQorI2RlZmluZSBJV0xfV0FSTihtLCBmLCBhLi4uKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCUNIRUNLX0ZPUl9ORVdMSU5FKGYpOwkJCQkJXAorCQlfX2l3bF93YXJuKChtKS0+ZGV2LCBmLCAjIyBhKTsJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIElXTF9JTkZPKG0sIGYsIGEuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJQ0hFQ0tfRk9SX05FV0xJTkUoZik7CQkJCQlcCisJCV9faXdsX2luZm8oKG0pLT5kZXYsIGYsICMjIGEpOwkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSVdMX0NSSVQobSwgZiwgYS4uLikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlDSEVDS19GT1JfTkVXTElORShmKTsJCQkJCVwKKwkJX19pd2xfY3JpdCgobSktPmRldiwgZiwgIyMgYSk7CQkJCVwKKwl9IHdoaWxlICgwKQogCiAjaWYgZGVmaW5lZChDT05GSUdfSVdMV0lGSV9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORykKIHZvaWQgX19pd2xfZGJnKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTcyLDEyICs5MiwxNyBAQAogCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJCVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgX19JV0xfREVCVUdfREVWKGRldiwgbGV2ZWwsIGxpbWl0LCBmbXQsIGFyZ3MuLi4pCQlcCisJZG8gewkJCQkJCQkJXAorCQlDSEVDS19GT1JfTkVXTElORShmbXQpOwkJCQkJXAorCQlfX2l3bF9kYmcoZGV2LCBsZXZlbCwgbGltaXQsIF9fZnVuY19fLCBmbXQsICMjYXJncyk7CVwKKwl9IHdoaWxlICgwKQogI2RlZmluZSBJV0xfREVCVUcobSwgbGV2ZWwsIGZtdCwgYXJncy4uLikJCQkJXAotCV9faXdsX2RiZygobSktPmRldiwgbGV2ZWwsIGZhbHNlLCBfX2Z1bmNfXywgZm10LCAjI2FyZ3MpCisJX19JV0xfREVCVUdfREVWKChtKS0+ZGV2LCBsZXZlbCwgZmFsc2UsIGZtdCwgIyNhcmdzKQogI2RlZmluZSBJV0xfREVCVUdfREVWKGRldiwgbGV2ZWwsIGZtdCwgYXJncy4uLikJCQkJXAotCV9faXdsX2RiZygoZGV2KSwgbGV2ZWwsIGZhbHNlLCBfX2Z1bmNfXywgZm10LCAjI2FyZ3MpCisJX19JV0xfREVCVUdfREVWKGRldiwgbGV2ZWwsIGZhbHNlLCBmbXQsICMjYXJncykKICNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKG0sIGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCVwKLQlfX2l3bF9kYmcoKG0pLT5kZXYsIGxldmVsLCB0cnVlLCBfX2Z1bmNfXywgZm10LCAjI2FyZ3MpCisJX19JV0xfREVCVUdfREVWKChtKS0+ZGV2LCBsZXZlbCwgdHJ1ZSwgZm10LCAjI2FyZ3MpCiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwogI2RlZmluZSBpd2xfcHJpbnRfaGV4X2R1bXAobSwgbGV2ZWwsIHAsIGxlbikJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZHJ2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kcnYuYwppbmRleCAwYTNlODQxLi5mMmE1YzEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZHJ2LmMKQEAgLTEyNDMsNiArMTI0Myw3IEBACiAJLmJ0X2NvZXhfYWN0aXZlID0gdHJ1ZSwKIAkucG93ZXJfbGV2ZWwgPSBJV0xfUE9XRVJfSU5ERVhfMSwKIAkud2RfZGlzYWJsZSA9IHRydWUsCisJLnVhcHNkX2Rpc2FibGUgPSBmYWxzZSwKIAkvKiB0aGUgcmVzdCBhcmUgMCBieSBkZWZhdWx0ICovCiB9OwogSVdMX0VYUE9SVF9TWU1CT0woaXdsd2lmaV9tb2RfcGFyYW1zKTsKQEAgLTEzNTYsNiArMTM1NywxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG52bV9maWxlLCBpd2x3aWZpX21vZF9wYXJhbXMubnZtX2ZpbGUsIGNoYXJwLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobnZtX2ZpbGUsICJOVk0gZmlsZSBuYW1lIik7CiAKK21vZHVsZV9wYXJhbV9uYW1lZCh1YXBzZF9kaXNhYmxlLCBpd2x3aWZpX21vZF9wYXJhbXMudWFwc2RfZGlzYWJsZSwKKwkJICAgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHVhcHNkX2Rpc2FibGUsICJkaXNhYmxlIFUtQVBTRCBmdW5jdGlvbmFsaXR5IChkZWZhdWx0OiBOKSIpOworCiAvKgogICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgogICogZXZlcnkgdGltZSB0aGUgcHJpb3JpdHkgbGluZSBpcyBhc3NlcnRlZCAoQlQgaXMgc2VuZGluZyBzaWduYWxzIG9uIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctZXJyb3ItZHVtcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZnctZXJyb3ItZHVtcC5oCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWVycm9yLWR1bXAuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZnctZXJyb3ItZHVtcC5oCmluZGV4IDU4Yzg5NDEuLjI5NTNmZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWVycm9yLWR1bXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy1lcnJvci1kdW1wLmgKQEAgLTcxLDEwICs3MSwxNSBAQAogICogZW51bSBpd2xfZndfZXJyb3JfZHVtcF90eXBlIC0gdHlwZXMgb2YgZGF0YSBpbiB0aGUgZHVtcCBmaWxlCiAgKiBASVdMX0ZXX0VSUk9SX0RVTVBfU1JBTToKICAqIEBJV0xfRldfRVJST1JfRFVNUF9SRUc6CisgKiBASVdMX0ZXX0VSUk9SX0RVTVBfUlhGOgorICogQElXTF9GV19FUlJPUl9EVU1QX1RYQ01EOiBsYXN0IFRYIGNvbW1hbmQgZGF0YSwgc3RydWN0dXJlZCBhcworICoJJnN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF90eGNtZCBwYWNrZXRzCiAgKi8KIGVudW0gaXdsX2Z3X2Vycm9yX2R1bXBfdHlwZSB7CiAJSVdMX0ZXX0VSUk9SX0RVTVBfU1JBTSA9IDAsCiAJSVdMX0ZXX0VSUk9SX0RVTVBfUkVHID0gMSwKKwlJV0xfRldfRVJST1JfRFVNUF9SWEYgPSAyLAorCUlXTF9GV19FUlJPUl9EVU1QX1RYQ01EID0gMywKIAogCUlXTF9GV19FUlJPUl9EVU1QX01BWCwKIH07CkBAIC04OSw3ICs5NCw3IEBACiAJX19sZTMyIHR5cGU7CiAJX19sZTMyIGxlbjsKIAlfX3U4IGRhdGFbXTsKLX0gX19wYWNrZWQgX19hbGlnbmVkKDQpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfZmlsZSAtIHRoZSBsYXlvdXQgb2YgdGhlIGhlYWRlciBvZiB0aGUgZmlsZQpAQCAtMTAxLDYgKzEwNiwyOSBAQAogCV9fbGUzMiBiYXJrZXI7CiAJX19sZTMyIGZpbGVfbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX3R4Y21kIC0gVFggY29tbWFuZCBkYXRhCisgKiBAY21kbGVuOiBvcmlnaW5hbCBsZW5ndGggb2YgY29tbWFuZAorICogQGNhcGxlbjogY2FwdHVyZWQgbGVuZ3RoIG9mIGNvbW1hbmQgKG1heSBiZSBsZXNzKQorICogQGRhdGE6IGNhcHR1cmVkIGNvbW1hbmQgZGF0YSwgQGNhcGxlbiBieXRlcworICovCitzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfdHhjbWQgeworCV9fbGUzMiBjbWRsZW47CisJX19sZTMyIGNhcGxlbjsKKwl1OCBkYXRhW107Cit9IF9fcGFja2VkOworCisvKioKKyAqIGl3bF9tdm1fZndfZXJyb3JfbmV4dF9kYXRhIC0gYWR2YW5jZSBmdyBlcnJvciBkdW1wIGRhdGEgcG9pbnRlcgorICogQGRhdGE6IHByZXZpb3VzIGRhdGEgYmxvY2sKKyAqIFJldHVybnM6IG5leHQgZGF0YSBibG9jaworICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF9kYXRhICoKK2l3bF9tdm1fZndfZXJyb3JfbmV4dF9kYXRhKHN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF9kYXRhICpkYXRhKQoreworCXJldHVybiAodm9pZCAqKShkYXRhLT5kYXRhICsgbGUzMl90b19jcHUoZGF0YS0+bGVuKSk7Cit9CiAKICNlbmRpZiAvKiBfX2Z3X2Vycm9yX2R1bXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZncuaAppbmRleCBkMTRmMTkzLi4wYWE3YzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZ3LmgKQEAgLTc0LDI5ICs3NCwyNCBAQAogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQOiBUaGlzIHVDb2RlIGltYWdlIHN1cHBvcnRzIE1GUCAoODAyLjExdykuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlA6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgUDJQLgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEU6IFRoZSBTQ0QgYnl0ZSBjb3VudCB0YWJsZSBpcyBpbiBEV09SRFMKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1VBUFNEOiBUaGlzIHVDb2RlIGltYWdlIHN1cHBvcnRzIHVBUFNECisgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19VQVBTRF9TVVBQT1JUOiBUaGlzIHVDb2RlIGltYWdlIHN1cHBvcnRzIHVBUFNECiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19TSE9SVF9CTDogMTYgZW50cmllcyBvZiBibGFjayBsaXN0IGluc3RlYWQgb2YgNjQgaW4gc2NhbgogICoJb2ZmbG9hZCBwcm9maWxlIGNvbmZpZyBjb21tYW5kLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUlhfRU5FUkdZX0FQSTogc3VwcG9ydHMgcnggc2lnbmFsIHN0cmVuZ3RoIGFwaQotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfVElNRV9FVkVOVF9BUElfVjI6IHVzaW5nIHRoZSBuZXcgdGltZSBldmVudCBBUEkuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19EM182X0lQVjZfQUREUlM6IEQzIGltYWdlIHN1cHBvcnRzIHVwIHRvIHNpeAogICoJKHJhdGhlciB0aGFuIHR3bykgSVB2NiBhZGRyZXNzZXMKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0JGX1VQREFURUQ6IG5ldyBiZWFjb24gZmlsdGVyaW5nIEFQSQogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTk9fQkFTSUNfU1NJRDogbm90IHNlbmRpbmcgYSBwcm9iZSB3aXRoIHRoZSBTU0lEIGVsZW1lbnQKICAqCWZyb20gdGhlIHByb2JlIHJlcXVlc3QgdGVtcGxhdGUuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19EM19DT05USU5VSVRZX0FQSTogbW9kaWZpZWQgRDMgQVBJIHRvIGFsbG93IGtlZXBpbmcKLSAqCWNvbm5lY3Rpb24gd2hlbiBnb2luZyBiYWNrIHRvIEQwCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX1NNQUxMOiBuZXcgTlMgb2ZmbG9hZCAoc21hbGwgdmVyc2lvbikKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX05FV19OU09GRkxfTEFSR0U6IG5ldyBOUyBvZmZsb2FkIChsYXJnZSB2ZXJzaW9uKQotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfU0NIRURfU0NBTjogdGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyBzY2hlZHVsZWQgc2Nhbi4KLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1NUQV9LRVlfQ01EOiBuZXcgQUREX1NUQSBhbmQgQUREX1NUQV9LRVkgY29tbWFuZCBBUEkKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0RFVklDRV9QU19DTUQ6IHN1cHBvcnQgZGV2aWNlIHdpZGUgcG93ZXIgY29tbWFuZAotICoJY29udGFpbmluZyBDQU0gKENvbnRpbnVvdXMgQWN0aXZlIE1vZGUpIGluZGljYXRpb24uCisgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE06IFAyUCBjbGllbnQgc3VwcG9ydHMgUE0gYXMgYSBzdGFuZCBhbG9uZSBNQUMKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9CU1NfUFNfRENNOiBzdXBwb3J0IHBvd2VyIHNhdmUgb24gQlNTIHN0YXRpb24gYW5kCiAgKglQMlAgY2xpZW50IGludGVyZmFjZXMgc2ltdWx0YW5lb3VzbHkgaWYgdGhleSBhcmUgaW4gZGlmZmVyZW50IGJpbmRpbmdzLgorICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX0JTU19QU19TQ006IHN1cHBvcnQgcG93ZXIgc2F2ZSBvbiBCU1Mgc3RhdGlvbiBhbmQKKyAqCVAyUCBjbGllbnQgaW50ZXJmYWNlcyBzaW11bHRhbmVvdXNseSBpZiB0aGV5IGFyZSBpbiBzYW1lIGJpbmRpbmdzLgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BTX1VBUFNEOiBQMlAgY2xpZW50IHN1cHBvcnRzIHVBUFNEIHBvd2VyIHNhdmUKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0JDQVNUX0ZJTFRFUklORzogdUNvZGUgc3VwcG9ydHMgYnJvYWRjYXN0IGZpbHRlcmluZy4KICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0dPX1VBUFNEOiBBUC9HTyBpbnRlcmZhY2VzIHN1cHBvcnQgdUFQU0QgY2xpZW50cworICogQElXTF9VQ09ERV9UTFZfRkxBR1NfRUJTX1NVUFBPUlQ6IHRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgRUJTLgogICovCiBlbnVtIGl3bF91Y29kZV90bHZfZmxhZyB7CiAJSVdMX1VDT0RFX1RMVl9GTEFHU19QQU4JCQk9IEJJVCgwKSwKQEAgLTEwNCwyMiArOTksMTYgQEAKIAlJV0xfVUNPREVfVExWX0ZMQUdTX01GUAkJCT0gQklUKDIpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfUDJQCQkJPSBCSVQoMyksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19EV19CQ19UQUJMRQkJPSBCSVQoNCksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdCVF9DT0VYCQk9IEJJVCg1KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1BNX0NNRF9TVVBQT1JUCT0gQklUKDYpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfU0hPUlRfQkwJCT0gQklUKDcpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfUlhfRU5FUkdZX0FQSQk9IEJJVCg4KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1RJTUVfRVZFTlRfQVBJX1YyCT0gQklUKDkpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfRDNfNl9JUFY2X0FERFJTCT0gQklUKDEwKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX0JGX1VQREFURUQJCT0gQklUKDExKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX05PX0JBU0lDX1NTSUQJPSBCSVQoMTIpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfRDNfQ09OVElOVUlUWV9BUEkJPSBCSVQoMTQpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9TTUFMTAk9IEJJVCgxNSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX0xBUkdFCT0gQklUKDE2KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1NDSEVEX1NDQU4JCT0gQklUKDE3KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1NUQV9LRVlfQ01ECQk9IEJJVCgxOSksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19ERVZJQ0VfUFNfQ01ECT0gQklUKDIwKSwKKwlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTQkJPSBCSVQoMjEpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00JPSBCSVQoMjIpLAorCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19TQ00JPSBCSVQoMjMpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVAk9IEJJVCgyNCksCisJSVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVAkJPSBCSVQoMjUpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BTX1VBUFNECT0gQklUKDI2KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX0JDQVNUX0ZJTFRFUklORwk9IEJJVCgyOSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19HT19VQVBTRAkJPSBCSVQoMzApLApAQCAtMTI4LDkgKzExNywxMSBAQAogLyoqCiAgKiBlbnVtIGl3bF91Y29kZV90bHZfYXBpIC0gdWNvZGUgYXBpCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfV09XTEFOX0NPTkZJR19USUQ6IHdvd2xhbiBjb25maWcgaW5jbHVkZXMgdGlkIGZpZWxkLgorICogQElXTF9VQ09ERV9UTFZfQVBJX0NTQV9GTE9XOiB1Y29kZSBjYW4gZG8gdW5iaW5kLWJpbmQgZmxvdyBmb3IgQ1NBLgogICovCiBlbnVtIGl3bF91Y29kZV90bHZfYXBpIHsKIAlJV0xfVUNPREVfVExWX0FQSV9XT1dMQU5fQ09ORklHX1RJRAk9IEJJVCgwKSwKKwlJV0xfVUNPREVfVExWX0FQSV9DU0FfRkxPVwkJPSBCSVQoNCksCiB9OwogCiAvKioKQEAgLTE4Myw2ICsxNzQsNyBAQAogI2RlZmluZSBJV0xfVUNPREVfU0VDVElPTl9NQVggMTIKICNkZWZpbmUgSVdMX0FQSV9BUlJBWV9TSVpFCTEKICNkZWZpbmUgSVdMX0NBUEFCSUxJVElFU19BUlJBWV9TSVpFCTEKKyNkZWZpbmUgQ1BVMV9DUFUyX1NFUEFSQVRPUl9TRUNUSU9OCTB4RkZGRkNDQ0MKIAogc3RydWN0IGl3bF91Y29kZV9jYXBhYmlsaXRpZXMgewogCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOwpAQCAtMjA1LDYgKzE5NywxMSBAQAogCWJvb2wgaXNfZHVhbF9jcHVzOwogfTsKIAorc3RydWN0IGl3bF9zZl9yZWdpb24geworCXUzMiBhZGRyOworCXUzMiBzaXplOworfTsKKwogLyogdUNvZGUgdmVyc2lvbiBjb250YWlucyA0IHZhbHVlczogTWFqb3IvTWlub3IvQVBJL1NlcmlhbCAqLwogI2RlZmluZSBJV0xfVUNPREVfTUFKT1IodmVyKQkoKCh2ZXIpICYgMHhGRjAwMDAwMCkgPj4gMjQpCiAjZGVmaW5lIElXTF9VQ09ERV9NSU5PUih2ZXIpCSgoKHZlcikgJiAweDAwRkYwMDAwKSA+PiAxNikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jCmluZGV4IDQ0Y2MzY2YuLjVlZWY0YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgIml3bC1pby5oIgogI2luY2x1ZGUgIml3bC1jc3IuaCIKICNpbmNsdWRlICJpd2wtZGVidWcuaCIKKyNpbmNsdWRlICJpd2wtcHJwaC5oIgogI2luY2x1ZGUgIml3bC1maC5oIgogCiAjZGVmaW5lIElXTF9QT0xMX0lOVEVSVkFMIDEwCS8qIG1pY3Jvc2Vjb25kcyAqLwpAQCAtMTgzLDYgKzE4NCwyMyBAQAogfQogSVdMX0VYUE9SVF9TWU1CT0woaXdsX2NsZWFyX2JpdHNfcHJwaCk7CiAKK3ZvaWQgaXdsX2ZvcmNlX25taShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwkvKgorCSAqIEluIEhXIHByZXZpb3VzIHRvIHRoZSA4MDAwIEhXIGZhbWlseSwgYW5kIGluIHRoZSA4MDAwIEhXIGZhbWlseQorCSAqIGl0c2VsZiB3aGVuIHRoZSByZXZpc2lvbiBzdGVwPT0wLCB0aGUgREVWSUNFX1NFVF9OTUlfUkVHIGlzIHVzZWQKKwkgKiB0byBmb3JjZSBhbiBOTUkuIE90aGVyd2lzZSwgYSBkaWZmZXJlbnQgcmVnaXN0ZXIgLQorCSAqIERFVklDRV9TRVRfTk1JXzgwMDBCX1JFRyAtIGlzIHVzZWQuCisJICovCisJaWYgKCh0cmFucy0+Y2ZnLT5kZXZpY2VfZmFtaWx5ICE9IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApIHx8CisJICAgICgodHJhbnMtPmh3X3JldiAmIDB4YykgPT0gMHgwKSkKKwkJaXdsX3dyaXRlX3BycGgodHJhbnMsIERFVklDRV9TRVRfTk1JX1JFRywgREVWSUNFX1NFVF9OTUlfVkFMKTsKKwllbHNlCisJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBERVZJQ0VfU0VUX05NSV84MDAwQl9SRUcsCisJCQkgICAgICAgREVWSUNFX1NFVF9OTUlfODAwMEJfVkFMKTsKK30KK0lXTF9FWFBPUlRfU1lNQk9MKGl3bF9mb3JjZV9ubWkpOworCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2ZoX3N0cmluZyhpbnQgY21kKQogewogI2RlZmluZSBJV0xfQ01EKHgpIGNhc2UgeDogcmV0dXJuICN4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaAppbmRleCA2NjVkZGQ5Li43MDVkMTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmgKQEAgLTgwLDYgKzgwLDcgQEAKIHZvaWQgaXdsX3NldF9iaXRzX21hc2tfcHJwaChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIG9mcywKIAkJCSAgICB1MzIgYml0cywgdTMyIG1hc2spOwogdm9pZCBpd2xfY2xlYXJfYml0c19wcnBoKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgb2ZzLCB1MzIgbWFzayk7Cit2b2lkIGl3bF9mb3JjZV9ubWkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOwogCiAvKiBFcnJvciBoYW5kbGluZyAqLwogaW50IGl3bF9kdW1wX2ZoKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBjaGFyICoqYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1vZHBhcmFtcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbW9kcGFyYW1zLmgKaW5kZXggZDk5NDMxNy4uZDA1MTg1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbW9kcGFyYW1zLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbW9kcGFyYW1zLmgKQEAgLTExOSw2ICsxMTksNyBAQAogI2VuZGlmCiAJaW50IGFudF9jb3VwbGluZzsKIAljaGFyICpudm1fZmlsZTsKKwlib29sIHVhcHNkX2Rpc2FibGU7CiB9OwogCiAjZW5kaWYgLyogI19faXdsX21vZHBhcmFtc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKaW5kZXggNmJlMzBjNi4uODVlZWU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgIml3bC1kcnYuaCIKICNpbmNsdWRlICJpd2wtbW9kcGFyYW1zLmgiCiAjaW5jbHVkZSAiaXdsLW52bS1wYXJzZS5oIgpAQCAtMTI3LDE5ICsxMjgsMjAgQEAKIAogc3RhdGljIGNvbnN0IHU4IGl3bF9udm1fY2hhbm5lbHNfZmFtaWx5XzgwMDBbXSA9IHsKIAkvKiAyLjQgR0h6ICovCi0JMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsCisJMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAogCS8qIDUgR0h6ICovCiAJMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA2OCwgNzIsIDc2LCA4MCwgODQsIDg4LCA5MiwKIAk5NiwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0NCwKIAkxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMsIDE3NywgMTgxCiB9OwogCi0jZGVmaW5lIElXTF9OVU1fQ0hBTk5FTFMJQVJSQVlfU0laRShpd2xfbnZtX2NoYW5uZWxzKQorI2RlZmluZSBJV0xfTlVNX0NIQU5ORUxTCQlBUlJBWV9TSVpFKGl3bF9udm1fY2hhbm5lbHMpCiAjZGVmaW5lIElXTF9OVU1fQ0hBTk5FTFNfRkFNSUxZXzgwMDAJQVJSQVlfU0laRShpd2xfbnZtX2NoYW5uZWxzX2ZhbWlseV84MDAwKQotI2RlZmluZSBOVU1fMkdIWl9DSEFOTkVMUwkxNAotI2RlZmluZSBGSVJTVF8yR0haX0hUX01JTlVTCTUKLSNkZWZpbmUgTEFTVF8yR0haX0hUX1BMVVMJOQotI2RlZmluZSBMQVNUXzVHSFpfSFQJCTE2MQorI2RlZmluZSBOVU1fMkdIWl9DSEFOTkVMUwkJMTQKKyNkZWZpbmUgTlVNXzJHSFpfQ0hBTk5FTFNfRkFNSUxZXzgwMDAJMTQKKyNkZWZpbmUgRklSU1RfMkdIWl9IVF9NSU5VUwkJNQorI2RlZmluZSBMQVNUXzJHSFpfSFRfUExVUwkJOQorI2RlZmluZSBMQVNUXzVHSFpfSFQJCQkxNjEKIAogI2RlZmluZSBERUZBVUxUX01BWF9UWF9QT1dFUiAxNgogCkBAIC0yMDIsMjEgKzIwNCwyMyBAQAogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKIAl1MTYgY2hfZmxhZ3M7CiAJYm9vbCBpc181Z2h6OwotCWludCBudW1fb2ZfY2g7CisJaW50IG51bV9vZl9jaCwgbnVtXzJnaHpfY2hhbm5lbHM7CiAJY29uc3QgdTggKm52bV9jaGFuOwogCiAJaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKSB7CiAJCW51bV9vZl9jaCA9IElXTF9OVU1fQ0hBTk5FTFM7CiAJCW52bV9jaGFuID0gJml3bF9udm1fY2hhbm5lbHNbMF07CisJCW51bV8yZ2h6X2NoYW5uZWxzID0gTlVNXzJHSFpfQ0hBTk5FTFM7CiAJfSBlbHNlIHsKIAkJbnVtX29mX2NoID0gSVdMX05VTV9DSEFOTkVMU19GQU1JTFlfODAwMDsKIAkJbnZtX2NoYW4gPSAmaXdsX252bV9jaGFubmVsc19mYW1pbHlfODAwMFswXTsKKwkJbnVtXzJnaHpfY2hhbm5lbHMgPSBOVU1fMkdIWl9DSEFOTkVMU19GQU1JTFlfODAwMDsKIAl9CiAKIAlmb3IgKGNoX2lkeCA9IDA7IGNoX2lkeCA8IG51bV9vZl9jaDsgY2hfaWR4KyspIHsKIAkJY2hfZmxhZ3MgPSBfX2xlMTZfdG9fY3B1cChudm1fY2hfZmxhZ3MgKyBjaF9pZHgpOwogCi0JCWlmIChjaF9pZHggPj0gTlVNXzJHSFpfQ0hBTk5FTFMgJiYKKwkJaWYgKGNoX2lkeCA+PSBudW1fMmdoel9jaGFubmVscyAmJgogCQkgICAgIWRhdGEtPnNrdV9jYXBfYmFuZF81MkdIel9lbmFibGUpCiAJCQljaF9mbGFncyAmPSB+TlZNX0NIQU5ORUxfVkFMSUQ7CiAKQEAgLTIyNSw3ICsyMjksNyBAQAogCQkJCQkgIkNoLiAlZCBGbGFncyAleCBbJXNHSHpdIC0gTm8gdHJhZmZpY1xuIiwKIAkJCQkJIG52bV9jaGFuW2NoX2lkeF0sCiAJCQkJCSBjaF9mbGFncywKLQkJCQkJIChjaF9pZHggPj0gTlVNXzJHSFpfQ0hBTk5FTFMpID8KKwkJCQkJIChjaF9pZHggPj0gbnVtXzJnaHpfY2hhbm5lbHMpID8KIAkJCQkJICI1LjIiIDogIjIuNCIpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTIzNCw3ICsyMzgsNyBAQAogCQluX2NoYW5uZWxzKys7CiAKIAkJY2hhbm5lbC0+aHdfdmFsdWUgPSBudm1fY2hhbltjaF9pZHhdOwotCQljaGFubmVsLT5iYW5kID0gKGNoX2lkeCA8IE5VTV8yR0haX0NIQU5ORUxTKSA/CisJCWNoYW5uZWwtPmJhbmQgPSAoY2hfaWR4IDwgbnVtXzJnaHpfY2hhbm5lbHMpID8KIAkJCQlJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKIAkJY2hhbm5lbC0+Y2VudGVyX2ZyZXEgPQogCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KApAQCAtMjQyLDcgKzI0Niw3IEBACiAKIAkJLyogVE9ETzogTmVlZCB0byBiZSBkZXBlbmRlbnQgdG8gdGhlIE5WTSAqLwogCQljaGFubmVsLT5mbGFncyA9IElFRUU4MDIxMV9DSEFOX05PX0hUNDA7Ci0JCWlmIChjaF9pZHggPCBOVU1fMkdIWl9DSEFOTkVMUyAmJgorCQlpZiAoY2hfaWR4IDwgbnVtXzJnaHpfY2hhbm5lbHMgJiYKIAkJICAgIChjaF9mbGFncyAmIE5WTV9DSEFOTkVMXzQwTUhaKSkgewogCQkJaWYgKG52bV9jaGFuW2NoX2lkeF0gPD0gTEFTVF8yR0haX0hUX1BMVVMpCiAJCQkJY2hhbm5lbC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTOwpAQCAtMjUwLDcgKzI1NCw3IEBACiAJCQkJY2hhbm5lbC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUzsKIAkJfSBlbHNlIGlmIChudm1fY2hhbltjaF9pZHhdIDw9IExBU1RfNUdIWl9IVCAmJgogCQkJICAgKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfNDBNSFopKSB7Ci0JCQlpZiAoKGNoX2lkeCAtIE5VTV8yR0haX0NIQU5ORUxTKSAlIDIgPT0gMCkKKwkJCWlmICgoY2hfaWR4IC0gbnVtXzJnaHpfY2hhbm5lbHMpICUgMiA9PSAwKQogCQkJCWNoYW5uZWwtPmZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUzsKIAkJCWVsc2UKIAkJCQljaGFubmVsLT5mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTOwpAQCAtNDQ3LDEzICs0NTEsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpd2xfbnZtX2RhdGEgKmRhdGEsCiAJCQkgICAgICAgY29uc3QgX19sZTE2ICpudm1fc2VjKQogewotCXU4IGh3X2FkZHJbRVRIX0FMRU5dOwotCi0JaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQotCQltZW1jcHkoaHdfYWRkciwgbnZtX3NlYyArIEhXX0FERFIsIEVUSF9BTEVOKTsKLQllbHNlCi0JCW1lbWNweShod19hZGRyLCBudm1fc2VjICsgTUFDX0FERFJFU1NfT1ZFUlJJREVfRkFNSUxZXzgwMDAsCi0JCSAgICAgICBFVEhfQUxFTik7CisJY29uc3QgdTggKmh3X2FkZHIgPSAoY29uc3QgdTggKikobnZtX3NlYyArIEhXX0FERFIpOwogCiAJLyogVGhlIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiAxNiBiaXQsIG1lYW5pbmcgMjE0MzY1ICovCiAJZGF0YS0+aHdfYWRkclswXSA9IGh3X2FkZHJbMV07CkBAIC00NjQsNiArNDYyLDQxIEBACiAJZGF0YS0+aHdfYWRkcls1XSA9IGh3X2FkZHJbNF07CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9zZXRfaHdfYWRkcmVzc19mYW1pbHlfODAwMChjb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnLAorCQkJCQkgICBzdHJ1Y3QgaXdsX252bV9kYXRhICpkYXRhLAorCQkJCQkgICBjb25zdCBfX2xlMTYgKm1hY19vdmVycmlkZSwKKwkJCQkJICAgY29uc3QgX19sZTE2ICpudm1faHcpCit7CisJY29uc3QgdTggKmh3X2FkZHI7CisKKwlpZiAobWFjX292ZXJyaWRlKSB7CisJCWh3X2FkZHIgPSAoY29uc3QgdTggKikobWFjX292ZXJyaWRlICsKKwkJCQkgTUFDX0FERFJFU1NfT1ZFUlJJREVfRkFNSUxZXzgwMDApOworCisJCS8qIFRoZSBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gMTYgYml0LCBtZWFuaW5nIDIxNDM2NSAqLworCQlkYXRhLT5od19hZGRyWzBdID0gaHdfYWRkclsxXTsKKwkJZGF0YS0+aHdfYWRkclsxXSA9IGh3X2FkZHJbMF07CisJCWRhdGEtPmh3X2FkZHJbMl0gPSBod19hZGRyWzNdOworCQlkYXRhLT5od19hZGRyWzNdID0gaHdfYWRkclsyXTsKKwkJZGF0YS0+aHdfYWRkcls0XSA9IGh3X2FkZHJbNV07CisJCWRhdGEtPmh3X2FkZHJbNV0gPSBod19hZGRyWzRdOworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGh3X2FkZHIpKQorCQkJcmV0dXJuOworCX0KKworCS8qIHRha2UgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIE9UUCAqLworCWh3X2FkZHIgPSAoY29uc3QgdTggKikobnZtX2h3ICsgSFdfQUREUjBfRkFNSUxZXzgwMDApOworCWRhdGEtPmh3X2FkZHJbMF0gPSBod19hZGRyWzNdOworCWRhdGEtPmh3X2FkZHJbMV0gPSBod19hZGRyWzJdOworCWRhdGEtPmh3X2FkZHJbMl0gPSBod19hZGRyWzFdOworCWRhdGEtPmh3X2FkZHJbM10gPSBod19hZGRyWzBdOworCisJaHdfYWRkciA9IChjb25zdCB1OCAqKShudm1faHcgKyBIV19BRERSMV9GQU1JTFlfODAwMCk7CisJZGF0YS0+aHdfYWRkcls0XSA9IGh3X2FkZHJbMV07CisJZGF0YS0+aHdfYWRkcls1XSA9IGh3X2FkZHJbMF07Cit9CisKIHN0cnVjdCBpd2xfbnZtX2RhdGEgKgogaXdsX3BhcnNlX252bV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJICAgY29uc3QgX19sZTE2ICpudm1faHcsIGNvbnN0IF9fbGUxNiAqbnZtX3N3LApAQCAtNTIzLDcgKzU1Niw3IEBACiAJCQkJcnhfY2hhaW5zKTsKIAl9IGVsc2UgewogCQkvKiBNQUMgYWRkcmVzcyBpbiBmYW1pbHkgODAwMCAqLwotCQlpd2xfc2V0X2h3X2FkZHJlc3MoY2ZnLCBkYXRhLCBtYWNfb3ZlcnJpZGUpOworCQlpd2xfc2V0X2h3X2FkZHJlc3NfZmFtaWx5XzgwMDAoY2ZnLCBkYXRhLCBtYWNfb3ZlcnJpZGUsIG52bV9odyk7CiAKIAkJaXdsX2luaXRfc2JhbmRzKGRldiwgY2ZnLCBkYXRhLCByZWd1bGF0b3J5LAogCQkJCXNrdSAmIE5WTV9TS1VfQ0FQXzExQUNfRU5BQkxFLCB0eF9jaGFpbnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1vcC1tb2RlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1vcC1tb2RlLmgKaW5kZXggZWEyOTUwNC4uOTk3ODVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtb3AtbW9kZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW9wLW1vZGUuaApAQCAtNjMsNiArNjMsNyBAQAogI2lmbmRlZiBfX2l3bF9vcF9tb2RlX2hfXwogI2RlZmluZSBfX2l3bF9vcF9tb2RlX2hfXwogCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCiBzdHJ1Y3QgaXdsX29wX21vZGU7CkBAIC0xMTIsOCArMTEzLDExIEBACiAgKiBAc3RvcDogc3RvcCB0aGUgb3BfbW9kZS4gTXVzdCBmcmVlIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZC4KICAqCU1heSBzbGVlcAogICogQHJ4OiBSeCBub3RpZmljYXRpb24gdG8gdGhlIG9wX21vZGUuIHJ4YiBpcyB0aGUgUnggYnVmZmVyIGl0c2VsZi4gQ21kIGlzIHRoZQotICoJSENNRCB0aGlzIFJ4IHJlc3BvbmRzIHRvLgotICoJVGhpcyBjYWxsYmFjayBtYXkgc2xlZXAsIGl0IGlzIGNhbGxlZCBmcm9tIGEgdGhyZWFkZWQgSVJRIGhhbmRsZXIuCisgKglIQ01EIHRoaXMgUnggcmVzcG9uZHMgdG8uIENhbid0IHNsZWVwLgorICogQG5hcGlfYWRkOiBOQVBJIGluaXRpYWxpc2F0aW9uLiBUaGUgdHJhbnNwb3J0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBOQVBJLAorICoJYnV0IHRoZSBoaWdoZXIgbGF5ZXJzIG5lZWQgdG8ga25vdyBhYm91dCBpdCAoaW4gcGFydGljdWxhciBtYWM4MDIxMSB0bworICoJdG8gYWJsZSB0byBjYWxsIHRoZSByaWdodCBOQVBJIFJYIGZ1bmN0aW9ucyk7IHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkCisgKgl0byBldmVudHVhbGx5IGNhbGwgbmV0aWZfbmFwaV9hZGQoKSB3aXRoIGhpZ2hlciBsYXllciBpbnZvbHZlbWVudC4KICAqIEBxdWV1ZV9mdWxsOiBub3RpZmllcyB0aGF0IGEgSFcgcXVldWUgaXMgZnVsbC4KICAqCU11c3QgYmUgYXRvbWljIGFuZCBjYWxsZWQgd2l0aCBCSCBkaXNhYmxlZC4KICAqIEBxdWV1ZV9ub3RfZnVsbDogbm90aWZpZXMgdGhhdCBhIEhXIHF1ZXVlIGlzIG5vdCBmdWxsIGFueSBtb3JlLgpAQCAtMTQzLDYgKzE0NywxMSBAQAogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUpOwogCWludCAoKnJ4KShzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUsIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKKwl2b2lkICgqbmFwaV9hZGQpKHN0cnVjdCBpd2xfb3BfbW9kZSAqb3BfbW9kZSwKKwkJCSBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5hcGlfZGV2LAorCQkJIGludCAoKnBvbGwpKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpLAorCQkJIGludCB3ZWlnaHQpOwogCXZvaWQgKCpxdWV1ZV9mdWxsKShzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUsIGludCBxdWV1ZSk7CiAJdm9pZCAoKnF1ZXVlX25vdF9mdWxsKShzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUsIGludCBxdWV1ZSk7CiAJYm9vbCAoKmh3X3JmX2tpbGwpKHN0cnVjdCBpd2xfb3BfbW9kZSAqb3BfbW9kZSwgYm9vbCBzdGF0ZSk7CkBAIC0xODAsNyArMTg5LDYgQEAKIAkJCQkgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpCiB7Ci0JbWlnaHRfc2xlZXAoKTsKIAlyZXR1cm4gb3BfbW9kZS0+b3BzLT5yeChvcF9tb2RlLCByeGIsIGNtZCk7CiB9CiAKQEAgLTI0OSw0ICsyNTcsMTUgQEAKIAlyZXR1cm4gb3BfbW9kZS0+b3BzLT5leGl0X2QwaTMob3BfbW9kZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpd2xfb3BfbW9kZV9uYXBpX2FkZChzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUsCisJCQkJCXN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5hcGlfZGV2LAorCQkJCQlpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KSwKKwkJCQkJaW50IHdlaWdodCkKK3sKKwlpZiAoIW9wX21vZGUtPm9wcy0+bmFwaV9hZGQpCisJCXJldHVybjsKKwlvcF9tb2RlLT5vcHMtPm5hcGlfYWRkKG9wX21vZGUsIG5hcGksIG5hcGlfZGV2LCBwb2xsLCB3ZWlnaHQpOworfQorCiAjZW5kaWYgLyogX19pd2xfb3BfbW9kZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBoeS1kYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGh5LWRiLmMKaW5kZXggYjc2MWFjNC4uZDRmYjVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGh5LWRiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGh5LWRiLmMKQEAgLTM0NSw3ICszNDUsNiBAQAogCXN0cnVjdCBpd2xfcGh5X2RiX2NtZCBwaHlfZGJfY21kOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBQSFlfREJfQ01ELAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCiAJSVdMX0RFQlVHX0lORk8ocGh5X2RiLT50cmFucywKQEAgLTM5MywxMyArMzkyLDEzIEBACiAJCQkJCSAgZW50cnktPmRhdGEpOwogCQlpZiAoZXJyKSB7CiAJCQlJV0xfRVJSKHBoeV9kYi0+dHJhbnMsCi0JCQkJIkNhbid0IFNFTkQgcGh5X2RiIHNlY3Rpb24gJWQgKCVkKSwgZXJyICVkIiwKKwkJCQkiQ2FuJ3QgU0VORCBwaHlfZGIgc2VjdGlvbiAlZCAoJWQpLCBlcnIgJWRcbiIsCiAJCQkJdHlwZSwgaSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAogCQlJV0xfREVCVUdfSU5GTyhwaHlfZGItPnRyYW5zLAotCQkJICAgICAgICJTZW50IFBIWV9EQiBIQ01ELCB0eXBlID0gJWQgbnVtID0gJWQiLAorCQkJICAgICAgICJTZW50IFBIWV9EQiBIQ01ELCB0eXBlID0gJWQgbnVtID0gJWRcbiIsCiAJCQkgICAgICAgdHlwZSwgaSk7CiAJfQogCkBAIC00NTEsNyArNDUwLDcgQEAKIAkJCQkJCSBJV0xfTlVNX1BBUERfQ0hfR1JPVVBTKTsKIAlpZiAoZXJyKSB7CiAJCUlXTF9FUlIocGh5X2RiLT50cmFucywKLQkJCSJDYW5ub3Qgc2VuZCBjaGFubmVsIHNwZWNpZmljIFBBUEQgZ3JvdXBzIik7CisJCQkiQ2Fubm90IHNlbmQgY2hhbm5lbCBzcGVjaWZpYyBQQVBEIGdyb3Vwc1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00NjEsNyArNDYwLDcgQEAKIAkJCQkJCSBJV0xfTlVNX1RYUF9DSF9HUk9VUFMpOwogCWlmIChlcnIpIHsKIAkJSVdMX0VSUihwaHlfZGItPnRyYW5zLAotCQkJIkNhbm5vdCBzZW5kIGNoYW5uZWwgc3BlY2lmaWMgVFggcG93ZXIgZ3JvdXBzIik7CisJCQkiQ2Fubm90IHNlbmQgY2hhbm5lbCBzcGVjaWZpYyBUWCBwb3dlciBncm91cHNcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oCmluZGV4IDVmNjU3YzUuLjQ5OTdlMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBycGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wcnBoLmgKQEAgLTEwNSw2ICsxMDUsOSBAQAogCiAvKiBEZXZpY2UgTk1JIHJlZ2lzdGVyICovCiAjZGVmaW5lIERFVklDRV9TRVRfTk1JX1JFRyAweDAwYTAxYzMwCisjZGVmaW5lIERFVklDRV9TRVRfTk1JX1ZBTCAweDEKKyNkZWZpbmUgREVWSUNFX1NFVF9OTUlfODAwMEJfUkVHIDB4MDBhMDFjMjQKKyNkZWZpbmUgREVWSUNFX1NFVF9OTUlfODAwMEJfVkFMIDB4MTAwMDAwMAogCiAvKiBTaGFyZWQgcmVnaXN0ZXJzICgweDAuLjB4M2ZmLCB2aWEgdGFyZ2V0IGluZGlyZWN0IG9yIHBlcmlwaGVyeSAqLwogI2RlZmluZSBTSFJfQkFTRQkweDAwYTEwMDAwCkBAIC0zNDgsNCArMzUxLDEyIEBACiAKICNkZWZpbmUgTE1QTV9TRUNVUkVfVElNRV9PVVQJKDEwMCkKIAorLyogUnggRklGTyAqLworI2RlZmluZSBSWEZfU0laRV9BRERSCQkJKDB4YTAwYzg4KQorI2RlZmluZSBSWEZfU0laRV9CWVRFX0NORF9QT1MJCSg3KQorI2RlZmluZSBSWEZfU0laRV9CWVRFX0NOVF9NU0sJCSgweDNmZiA8PCBSWEZfU0laRV9CWVRFX0NORF9QT1MpCisKKyNkZWZpbmUgUlhGX0xEX0ZFTkNFX09GRlNFVF9BRERSCSgweGEwMGMxMCkKKyNkZWZpbmUgUlhGX0ZJRk9fUkRfRkVOQ0VfQUREUgkJKDB4YTAwYzBjKQorCiAjZW5kaWYJCQkJLyogX19pd2xfcHJwaF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oCmluZGV4IDhjZGIwZGQuLjM0ZDQ5ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaApAQCAtMTg5LDEwICsxODksOSBAQAogLyoqCiAgKiBlbnVtIENNRF9NT0RFIC0gaG93IHRvIHNlbmQgdGhlIGhvc3QgY29tbWFuZHMgPwogICoKLSAqIEBDTURfU1lOQzogVGhlIGNhbGxlciB3aWxsIGJlIHN0YWxsZWQgdW50aWwgdGhlIGZ3IHJlc3BvbmRzIHRvIHRoZSBjb21tYW5kCiAgKiBAQ01EX0FTWU5DOiBSZXR1cm4gcmlnaHQgYXdheSBhbmQgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlc3BvbnNlCi0gKiBAQ01EX1dBTlRfU0tCOiB2YWxpZCBvbmx5IHdpdGggQ01EX1NZTkMuIFRoZSBjYWxsZXIgbmVlZHMgdGhlIGJ1ZmZlciBvZiB0aGUKLSAqCXJlc3BvbnNlLiBUaGUgY2FsbGVyIG5lZWRzIHRvIGNhbGwgaXdsX2ZyZWVfcmVzcCB3aGVuIGRvbmUuCisgKiBAQ01EX1dBTlRfU0tCOiBOb3QgdmFsaWQgd2l0aCBDTURfQVNZTkMuIFRoZSBjYWxsZXIgbmVlZHMgdGhlIGJ1ZmZlciBvZgorICoJdGhlIHJlc3BvbnNlLiBUaGUgY2FsbGVyIG5lZWRzIHRvIGNhbGwgaXdsX2ZyZWVfcmVzcCB3aGVuIGRvbmUuCiAgKiBAQ01EX0hJR0hfUFJJTzogVGhlIGNvbW1hbmQgaXMgaGlnaCBwcmlvcml0eSAtIGl0IGdvZXMgdG8gdGhlIGZyb250IG9mIHRoZQogICoJY29tbWFuZCBxdWV1ZSwgYnV0IGFmdGVyIG90aGVyIGhpZ2ggcHJpb3JpdHkgY29tbWFuZHMuIHZhbGlkIG9ubHkKICAqCXdpdGggQ01EX0FTWU5DLgpAQCAtMjAyLDcgKzIwMSw2IEBACiAgKgkoaS5lLiBtYXJrIGl0IGFzIG5vbi1pZGxlKS4KICAqLwogZW51bSBDTURfTU9ERSB7Ci0JQ01EX1NZTkMJCT0gMCwKIAlDTURfQVNZTkMJCT0gQklUKDApLAogCUNNRF9XQU5UX1NLQgkJPSBCSVQoMSksCiAJQ01EX1NFTkRfSU5fUkZLSUxMCT0gQklUKDIpLApAQCAtNDI3LDcgKzQyNSw3IEBACiAgKiBAc2VuZF9jbWQ6c2VuZCBhIGhvc3QgY29tbWFuZC4gTXVzdCByZXR1cm4gLUVSRktJTEwgaWYgUkZraWxsIGlzIGFzc2VydGVkLgogICoJSWYgUkZraWxsIGlzIGFzc2VydGVkIGluIHRoZSBtaWRkbGUgb2YgYSBTWU5DIGhvc3QgY29tbWFuZCwgaXQgbXVzdAogICoJcmV0dXJuIC1FUkZLSUxMIHN0cmFpZ2h0IGF3YXkuCi0gKglNYXkgc2xlZXAgb25seSBpZiBDTURfU1lOQyBpcyBzZXQKKyAqCU1heSBzbGVlcCBvbmx5IGlmIENNRF9BU1lOQyBpcyBub3Qgc2V0CiAgKiBAdHg6IHNlbmQgYW4gc2tiCiAgKglNdXN0IGJlIGF0b21pYwogICogQHJlY2xhaW06IGZyZWUgcGFja2V0IHVudGlsIHNzbi4gUmV0dXJucyBhIGxpc3Qgb2YgZnJlZWQgcGFja2V0cy4KQEAgLTQzNyw4ICs0MzUsNyBAQAogICoJdGhpcyBvbmUuIFRoZSBvcF9tb2RlIG11c3Qgbm90IGNvbmZpZ3VyZSB0aGUgSENNRCBxdWV1ZS4gTWF5IHNsZWVwLgogICogQHR4cV9kaXNhYmxlOiBkZS1jb25maWd1cmUgYSBUeCBxdWV1ZSB0byBzZW5kIEFNUERVcwogICoJTXVzdCBiZSBhdG9taWMKLSAqIEB3YWl0X3R4X3F1ZXVlX2VtcHR5OiB3YWl0IHVudGlsIGFsbCB0eCBxdWV1ZXMgYXJlIGVtcHR5Ci0gKglNYXkgc2xlZXAKKyAqIEB3YWl0X3R4X3F1ZXVlX2VtcHR5OiB3YWl0IHVudGlsIHR4IHF1ZXVlcyBhcmUgZW1wdHkuIE1heSBzbGVlcC4KICAqIEBkYmdmc19yZWdpc3RlcjogYWRkIHRoZSBkYmdmcyBmaWxlcyB1bmRlciB0aGlzIGRpcmVjdG9yeS4gRmlsZXMgd2lsbCBiZQogICoJYXV0b21hdGljYWxseSBkZWxldGVkLgogICogQHdyaXRlODogd3JpdGUgYSB1OCB0byBhIHJlZ2lzdGVyIGF0IG9mZnNldCBvZnMgZnJvbSB0aGUgQkFSCkBAIC00NjQsNiArNDYxLDExIEBACiAgKiBAdW5yZWY6IHJlbGVhc2UgYSByZWZlcmVuY2UgcHJldmlvdXNseSB0YWtlbiB3aXRoIEByZWYuIE5vdGUgdGhhdAogICoJaW5pdGlhbGx5IHRoZSByZWZlcmVuY2UgY291bnQgaXMgMSwgbWFraW5nIGFuIGluaXRpYWwgQHVucmVmCiAgKgluZWNlc3NhcnkgdG8gYWxsb3cgbG93IHBvd2VyIHN0YXRlcy4KKyAqIEBkdW1wX2RhdGE6IGZpbGwgYSBkYXRhIGR1bXAgd2l0aCBkZWJ1ZyBkYXRhLCBtYXliZSBjb250YWluaW5nIGxhc3QKKyAqCVRYJ2VkIGNvbW1hbmRzIGFuZCBzaW1pbGFyLiBXaGVuIGNhbGxlZCB3aXRoIGEgTlVMTCBidWZmZXIgYW5kCisgKgl6ZXJvIGJ1ZmZlciBsZW5ndGgsIHByb3ZpZGUgb25seSB0aGUgKGVzdGltYXRlZCkgcmVxdWlyZWQgYnVmZmVyCisgKglsZW5ndGguIFJldHVybiB0aGUgdXNlZCBidWZmZXIgbGVuZ3RoLgorICoJTm90ZSB0aGF0IHRoZSB0cmFuc3BvcnQgbXVzdCBmaWxsIGluIHRoZSBwcm9wZXIgZmlsZSBoZWFkZXJzLgogICovCiBzdHJ1Y3QgaXdsX3RyYW5zX29wcyB7CiAKQEAgLTQ3MSw2ICs0NzMsOCBAQAogCXZvaWQgKCpvcF9tb2RlX2xlYXZlKShzdHJ1Y3QgaXdsX3RyYW5zICppd2xfdHJhbnMpOwogCWludCAoKnN0YXJ0X2Z3KShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgY29uc3Qgc3RydWN0IGZ3X2ltZyAqZncsCiAJCQlib29sIHJ1bl9pbl9yZmtpbGwpOworCWludCAoKnVwZGF0ZV9zZikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkgc3RydWN0IGl3bF9zZl9yZWdpb24gKnN0X2Z3cmRfc3BhY2UpOwogCXZvaWQgKCpmd19hbGl2ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiBzY2RfYWRkcik7CiAJdm9pZCAoKnN0b3BfZGV2aWNlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CiAKQEAgLTQ5MCw3ICs0OTQsNyBAQAogCXZvaWQgKCp0eHFfZGlzYWJsZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxdWV1ZSk7CiAKIAlpbnQgKCpkYmdmc19yZWdpc3Rlcikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBkZW50cnkqIGRpcik7Ci0JaW50ICgqd2FpdF90eF9xdWV1ZV9lbXB0eSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworCWludCAoKndhaXRfdHhfcXVldWVfZW1wdHkpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgdHhxX2JtKTsKIAogCXZvaWQgKCp3cml0ZTgpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgb2ZzLCB1OCB2YWwpOwogCXZvaWQgKCp3cml0ZTMyKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIG9mcywgdTMyIHZhbCk7CkBAIC01MTIsNiArNTE2LDEwIEBACiAJCQkgICAgICB1MzIgdmFsdWUpOwogCXZvaWQgKCpyZWYpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAl2b2lkICgqdW5yZWYpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKKworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKKwl1MzIgKCpkdW1wX2RhdGEpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB2b2lkICpidWYsIHUzMiBidWZsZW4pOworI2VuZGlmCiB9OwogCiAvKioKQEAgLTYzMCw2ICs2MzgsMTcgQEAKIAlyZXR1cm4gdHJhbnMtPm9wcy0+c3RhcnRfZncodHJhbnMsIGZ3LCBydW5faW5fcmZraWxsKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3VwZGF0ZV9zZihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQkgICAgICBzdHJ1Y3QgaXdsX3NmX3JlZ2lvbiAqc3RfZndyZF9zcGFjZSkKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKHRyYW5zLT5vcHMtPnVwZGF0ZV9zZikKKwkJcmV0dXJuIHRyYW5zLT5vcHMtPnVwZGF0ZV9zZih0cmFucywgc3RfZndyZF9zcGFjZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc19zdG9wX2RldmljZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtNjY1LDYgKzY4NCwxNiBAQAogCQl0cmFucy0+b3BzLT51bnJlZih0cmFucyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCitzdGF0aWMgaW5saW5lIHUzMiBpd2xfdHJhbnNfZHVtcF9kYXRhKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCSAgICAgIHZvaWQgKmJ1ZiwgdTMyIGJ1ZmxlbikKK3sKKwlpZiAoIXRyYW5zLT5vcHMtPmR1bXBfZGF0YSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRyYW5zLT5vcHMtPmR1bXBfZGF0YSh0cmFucywgYnVmLCBidWZsZW4pOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc19zZW5kX2NtZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQkgICAgIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKIHsKQEAgLTY3OCw3ICs3MDcsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh1bmxpa2VseSh0cmFucy0+c3RhdGUgIT0gSVdMX1RSQU5TX0ZXX0FMSVZFKSkgewotCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWQiLCBfX2Z1bmNfXywgdHJhbnMtPnN0YXRlKTsKKwkJSVdMX0VSUih0cmFucywgIiVzIGJhZCBzdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgdHJhbnMtPnN0YXRlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC03MjAsNyArNzQ5LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAodW5saWtlbHkodHJhbnMtPnN0YXRlICE9IElXTF9UUkFOU19GV19BTElWRSkpCi0JCUlXTF9FUlIodHJhbnMsICIlcyBiYWQgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOworCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWRcbiIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOwogCiAJcmV0dXJuIHRyYW5zLT5vcHMtPnR4KHRyYW5zLCBza2IsIGRldl9jbWQsIHF1ZXVlKTsKIH0KQEAgLTcyOSw3ICs3NTgsNyBAQAogCQkJCSAgICAgaW50IHNzbiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticykKIHsKIAlpZiAodW5saWtlbHkodHJhbnMtPnN0YXRlICE9IElXTF9UUkFOU19GV19BTElWRSkpCi0JCUlXTF9FUlIodHJhbnMsICIlcyBiYWQgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOworCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWRcbiIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOwogCiAJdHJhbnMtPm9wcy0+cmVjbGFpbSh0cmFucywgcXVldWUsIHNzbiwgc2ticyk7CiB9CkBAIC03NDYsNyArNzc1LDcgQEAKIAltaWdodF9zbGVlcCgpOwogCiAJaWYgKHVubGlrZWx5KCh0cmFucy0+c3RhdGUgIT0gSVdMX1RSQU5TX0ZXX0FMSVZFKSkpCi0JCUlXTF9FUlIodHJhbnMsICIlcyBiYWQgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOworCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWRcbiIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOwogCiAJdHJhbnMtPm9wcy0+dHhxX2VuYWJsZSh0cmFucywgcXVldWUsIGZpZm8sIHN0YV9pZCwgdGlkLAogCQkJCSBmcmFtZV9saW1pdCwgc3NuKTsKQEAgLTc1OSwxMiArNzg4LDEzIEBACiAJCQkgICAgIElXTF9NQVhfVElEX0NPVU5ULCBJV0xfRlJBTUVfTElNSVQsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3N0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkJdTMyIHR4cV9ibSkKIHsKIAlpZiAodW5saWtlbHkodHJhbnMtPnN0YXRlICE9IElXTF9UUkFOU19GV19BTElWRSkpCi0JCUlXTF9FUlIodHJhbnMsICIlcyBiYWQgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOworCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWRcbiIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOwogCi0JcmV0dXJuIHRyYW5zLT5vcHMtPndhaXRfdHhfcXVldWVfZW1wdHkodHJhbnMpOworCXJldHVybiB0cmFucy0+b3BzLT53YWl0X3R4X3F1ZXVlX2VtcHR5KHRyYW5zLCB0eHFfYm0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpd2xfdHJhbnNfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL01ha2VmaWxlCmluZGV4IGNjZGQzYjcuLmMzMGQ3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL01ha2VmaWxlCkBAIC0zLDggKzMsOSBAQAogaXdsbXZtLXkgKz0gdXRpbHMubyByeC5vIHR4Lm8gYmluZGluZy5vIHF1b3RhLm8gc3RhLm8gc2YubwogaXdsbXZtLXkgKz0gc2Nhbi5vIHRpbWUtZXZlbnQubyBycy5vCiBpd2xtdm0teSArPSBwb3dlci5vIGNvZXgubwotaXdsbXZtLXkgKz0gbGVkLm8gdHQubyBvZmZsb2FkaW5nLm8KK2l3bG12bS15ICs9IHR0Lm8gb2ZmbG9hZGluZy5vCiBpd2xtdm0tJChDT05GSUdfSVdMV0lGSV9ERUJVR0ZTKSArPSBkZWJ1Z2ZzLm8gZGVidWdmcy12aWYubworaXdsbXZtLSQoQ09ORklHX0lXTFdJRklfTEVEUykgKz0gbGVkLm8KIGl3bG12bS0kKENPTkZJR19QTV9TTEVFUCkgKz0gZDMubwogCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fIC1JJChzcmMpLy4uLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vY29leC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vY29leC5jCmluZGV4IDA0ODkzMTQuLmM4YzNiMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2NvZXguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9jb2V4LmMKQEAgLTEwNCwxMiArMTA0LDkgQEAKICNkZWZpbmUgQlRfRElTQUJMRV9SRURVQ0VEX1RYUE9XRVJfVEhSRVNIT0xECSgtNjUpCiAjZGVmaW5lIEJUX0FOVEVOTkFfQ09VUExJTkdfVEhSRVNIT0xECQkoMzApCiAKLWludCBpd2xfc2VuZF9idF9wcmlvX3RibChzdHJ1Y3QgaXdsX212bSAqbXZtKQorc3RhdGljIGludCBpd2xfc2VuZF9idF9wcmlvX3RibChzdHJ1Y3QgaXdsX212bSAqbXZtKQogewotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX05FV0JUX0NPRVgpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEJUX0NPRVhfUFJJT19UQUJMRSwgQ01EX1NZTkMsCisJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQlRfQ09FWF9QUklPX1RBQkxFLCAwLAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGl3bF9idF9jb2V4X3ByaW9fdGJsX2NtZCksCiAJCQkJICAgICZpd2xfYnRfcHJpb190YmwpOwogfQpAQCAtMTI3LDEwICsxMjQsMTAgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBfX2xlMzIgaXdsX2J0X3ByaW9fYm9vc3RbQlRfQ09FWF9CT09TVF9TSVpFXSA9IHsKLQljcHVfdG9fbGUzMigweGYwZjBmMGYwKSwKLQljcHVfdG9fbGUzMigweGMwYzBjMGMwKSwKLQljcHVfdG9fbGUzMigweGZjZmNmY2ZjKSwKLQljcHVfdG9fbGUzMigweGZmMDBmZjAwKSwKKwljcHVfdG9fbGUzMigweGYwZjBmMGYwKSwgLyogNTAlICovCisJY3B1X3RvX2xlMzIoMHhjMGMwYzBjMCksIC8qIDI1JSAqLworCWNwdV90b19sZTMyKDB4ZmNmY2ZjZmMpLCAvKiA3NSUgKi8KKwljcHVfdG9fbGUzMigweGZlZmVmZWZlKSwgLyogODcuNSUgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBfX2xlMzIgaXdsX3NpbmdsZV9zaGFyZWRfYW50W0JUX0NPRVhfTUFYX0xVVF1bQlRfQ09FWF9MVVRfU0laRV0gPSB7CkBAIC0zMDMsOCArMzAwLDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBfX2xlMzIgaXdsX2J0X21wcmlvX2x1dFtCVF9DT0VYX01VTFRJX1BSSU9fTFVUX1NJWkVdID0gewotCWNwdV90b19sZTMyKDB4MjIwMDIyMDApLAotCWNwdV90b19sZTMyKDB4MzMxMTMzMTEpLAorCWNwdV90b19sZTMyKDB4Mjg0MTIyMDEpLAorCWNwdV90b19sZTMyKDB4MTExMTg0NTEpLAogfTsKIAogc3RydWN0IGNvcnVubmluZ19ibG9ja19sdXRzIHsKQEAgLTU2OCwxMyArNTY1LDEzIEBACiAJCS5pZCA9IEJUX0NPTkZJRywKIAkJLmxlbiA9IHsgc2l6ZW9mKCpidF9jbWQpLCB9LAogCQkuZGF0YWZsYWdzID0geyBJV0xfSENNRF9ERkxfTk9DT1BZLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCWludCByZXQ7CiAJdTMyIGZsYWdzOwogCi0JaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXQlRfQ09FWCkpCi0JCXJldHVybiAwOworCXJldCA9IGl3bF9zZW5kX2J0X3ByaW9fdGJsKG12bSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWJ0X2NtZCA9IGt6YWxsb2Moc2l6ZW9mKCpidF9jbWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ0X2NtZCkKQEAgLTU4MiwxMCArNTc5LDEyIEBACiAJY21kLmRhdGFbMF0gPSBidF9jbWQ7CiAKIAlidF9jbWQtPm1heF9raWxsID0gNTsKLQlidF9jbWQtPmJ0NF9hbnRlbm5hX2lzb2xhdGlvbl90aHIgPSBCVF9BTlRFTk5BX0NPVVBMSU5HX1RIUkVTSE9MRCwKLQlidF9jbWQtPmJ0NF9hbnRlbm5hX2lzb2xhdGlvbiA9IGl3bHdpZmlfbW9kX3BhcmFtcy5hbnRfY291cGxpbmcsCi0JYnRfY21kLT5idDRfdHhfdHhfZGVsdGFfZnJlcV90aHIgPSAxNSwKLQlidF9jbWQtPmJ0NF90eF9yeF9tYXhfZnJlcTAgPSAxNSwKKwlidF9jbWQtPmJ0NF9hbnRlbm5hX2lzb2xhdGlvbl90aHIgPSBCVF9BTlRFTk5BX0NPVVBMSU5HX1RIUkVTSE9MRDsKKwlidF9jbWQtPmJ0NF9hbnRlbm5hX2lzb2xhdGlvbiA9IGl3bHdpZmlfbW9kX3BhcmFtcy5hbnRfY291cGxpbmc7CisJYnRfY21kLT5idDRfdHhfdHhfZGVsdGFfZnJlcV90aHIgPSAxNTsKKwlidF9jbWQtPmJ0NF90eF9yeF9tYXhfZnJlcTAgPSAxNTsKKwlidF9jbWQtPm92ZXJyaWRlX3ByaW1hcnlfbHV0ID0gQlRfQ09FWF9JTlZBTElEX0xVVDsKKwlidF9jbWQtPm92ZXJyaWRlX3NlY29uZGFyeV9sdXQgPSBCVF9DT0VYX0lOVkFMSURfTFVUOwogCiAJZmxhZ3MgPSBpd2x3aWZpX21vZF9wYXJhbXMuYnRfY29leF9hY3RpdmUgPwogCQkJQlRfQ09FWF9OVyA6IEJUX0NPRVhfRElTQUJMRTsKQEAgLTY2Myw3ICs2NjIsNiBAQAogCQkuZGF0YVswXSA9ICZidF9jbWQsCiAJCS5sZW4gPSB7IHNpemVvZigqYnRfY21kKSwgfSwKIAkJLmRhdGFmbGFncyA9IHsgSVdMX0hDTURfREZMX05PQ09QWSwgfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJfTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNzE3LDcgKzcxNSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bF9tdm1fYnRfY29leF9yZWR1Y2VkX3R4cChzdHJ1Y3QgaXdsX212bSAqbXZtLCB1OCBzdGFfaWQsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCBpd2xfbXZtX2J0X2NvZXhfcmVkdWNlZF90eHAoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggc3RhX2lkLAorCQkJCSAgICAgICBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgaXdsX2J0X2NvZXhfY21kICpidF9jbWQ7CiAJLyogU2VuZCBBU1lOQyBzaW5jZSB0aGlzIGNhbiBiZSBzZW50IGZyb20gYW4gYXRvbWljIGNvbnRleHQgKi8KQEAgLTczNSw4ICs3MzQsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQlpZiAobXZtc3RhLT5idF9yZWR1Y2VkX3R4cG93ZXJfZGJnIHx8Ci0JICAgIG12bXN0YS0+YnRfcmVkdWNlZF90eHBvd2VyID09IGVuYWJsZSkKKwlpZiAobXZtc3RhLT5idF9yZWR1Y2VkX3R4cG93ZXIgPT0gZW5hYmxlKQogCQlyZXR1cm4gMDsKIAogCWJ0X2NtZCA9IGt6YWxsb2Moc2l6ZW9mKCpidF9jbWQpLCBHRlBfQVRPTUlDKTsKQEAgLTgwMywyMyArODAxLDEwIEBACiAKIAlzd2l0Y2ggKHZpZi0+dHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJLyogQ291bnQgQlNTZXMgdmlmcyAqLworCQlkYXRhLT5udW1fYnNzX2lmYWNlcysrOwogCQkvKiBkZWZhdWx0IHNtcHNfbW9kZSBmb3IgQlNTIC8gUDJQIGNsaWVudCBpcyBBVVRPTUFUSUMgKi8KIAkJc21wc19tb2RlID0gSUVFRTgwMjExX1NNUFNfQVVUT01BVElDOwotCQlkYXRhLT5udW1fYnNzX2lmYWNlcysrOwotCi0JCS8qCi0JCSAqIENvdW50IHVuYXNzb2MgQlNTZXMsIHJlbGF4IFNNU1AgY29uc3RyYWludHMKLQkJICogYW5kIGRpc2FibGUgcmVkdWNlZCBUeCBQb3dlcgotCQkgKi8KLQkJaWYgKCF2aWYtPmJzc19jb25mLmFzc29jKSB7Ci0JCQlpd2xfbXZtX3VwZGF0ZV9zbXBzKG12bSwgdmlmLCBJV0xfTVZNX1NNUFNfUkVRX0JUX0NPRVgsCi0JCQkJCSAgICBzbXBzX21vZGUpOwotCQkJaWYgKGl3bF9tdm1fYnRfY29leF9yZWR1Y2VkX3R4cChtdm0sCi0JCQkJCQkJbXZtdmlmLT5hcF9zdGFfaWQsCi0JCQkJCQkJZmFsc2UpKQotCQkJCUlXTF9FUlIobXZtLCAiQ291bGRuJ3Qgc2VuZCBCVF9DT05GSUcgY21kXG4iKTsKLQkJCXJldHVybjsKLQkJfQogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQkvKiBkZWZhdWx0IHNtcHNfbW9kZSBmb3IgQVAgLyBHTyBpcyBPRkYgKi8KQEAgLTg0NSw4ICs4MzAsMTIgQEAKIAkJLyogLi4uIHJlbGF4IGNvbnN0cmFpbnRzIGFuZCBkaXNhYmxlIHJzc2kgZXZlbnRzICovCiAJCWl3bF9tdm1fdXBkYXRlX3NtcHMobXZtLCB2aWYsIElXTF9NVk1fU01QU19SRVFfQlRfQ09FWCwKIAkJCQkgICAgc21wc19tb2RlKTsKLQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlkYXRhLT5yZWR1Y2VkX3R4X3Bvd2VyID0gZmFsc2U7CisJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQkJaXdsX212bV9idF9jb2V4X3JlZHVjZWRfdHhwKG12bSwgbXZtdmlmLT5hcF9zdGFfaWQsCisJCQkJCQkgICAgZmFsc2UpOwogCQkJaXdsX212bV9idF9jb2V4X2VuYWJsZV9yc3NpX2V2ZW50KG12bSwgdmlmLCBmYWxzZSwgMCk7CisJCX0KIAkJcmV0dXJuOwogCX0KIApAQCAtODU3LDYgKzg0NiwxMSBAQAogCQlzbXBzX21vZGUgPSB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgPwogCQkJCUlFRUU4MDIxMV9TTVBTX09GRiA6CiAJCQkJSUVFRTgwMjExX1NNUFNfRFlOQU1JQzsKKworCS8qIHJlbGF4IFNNUFMgY29udHJhaW50cyBmb3IgbmV4dCBhc3NvY2lhdGlvbiAqLworCWlmICghdmlmLT5ic3NfY29uZi5hc3NvYykKKwkJc21wc19tb2RlID0gSUVFRTgwMjExX1NNUFNfQVVUT01BVElDOworCiAJSVdMX0RFQlVHX0NPRVgoZGF0YS0+bXZtLAogCQkgICAgICAgIm1hYyAlZDogYnRfc3RhdHVzICVkIGJ0X2FjdGl2aXR5X2dyYWRpbmcgJWQgc21wc19yZXEgJWRcbiIsCiAJCSAgICAgICBtdm12aWYtPmlkLCBkYXRhLT5ub3RpZi0+YnRfc3RhdHVzLCBidF9hY3Rpdml0eV9ncmFkaW5nLApAQCAtOTAzLDIyICs4OTcsMTggQEAKIAkJLyogaWYgc2Vjb25kYXJ5IGlzIG5vdCBOVUxMLCBpdCBtaWdodCBiZSBhIEdPICovCiAJCWRhdGEtPnNlY29uZGFyeSA9IGNoYW5jdHhfY29uZjsKIAotCS8qIGRvbid0IHJlZHVjZSB0aGUgVHggcG93ZXIgaWYgaW4gbG9vc2Ugc2NoZW1lICovCisJLyoKKwkgKiBkb24ndCByZWR1Y2UgdGhlIFR4IHBvd2VyIGlmIG9uZSBvZiB0aGVzZSBpcyB0cnVlOgorCSAqICB3ZSBhcmUgaW4gTE9PU0UKKwkgKiAgc2luZ2xlIHNoYXJlIGFudGVubmEgcHJvZHVjdAorCSAqICBCVCBpcyBhY3RpdmUKKwkgKiAgd2UgYXJlIGFzc29jaWF0ZWQKKwkgKi8KIAlpZiAoaXdsX2dldF9jb2V4X3R5cGUobXZtLCB2aWYpID09IEJUX0NPRVhfTE9PU0VfTFVUIHx8Ci0JICAgIG12bS0+Y2ZnLT5idF9zaGFyZWRfc2luZ2xlX2FudCkgeworCSAgICBtdm0tPmNmZy0+YnRfc2hhcmVkX3NpbmdsZV9hbnQgfHwgIXZpZi0+YnNzX2NvbmYuYXNzb2MgfHwKKwkgICAgIWRhdGEtPm5vdGlmLT5idF9zdGF0dXMpIHsKIAkJZGF0YS0+cmVkdWNlZF90eF9wb3dlciA9IGZhbHNlOwotCQlpd2xfbXZtX2J0X2NvZXhfZW5hYmxlX3Jzc2lfZXZlbnQobXZtLCB2aWYsIGZhbHNlLCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHJlZHVjZWQgVHhwb3dlciBvbmx5IGlmIEJUIGlzIG9uLCBzbyAuLi4qLwotCWlmICghZGF0YS0+bm90aWYtPmJ0X3N0YXR1cykgewotCQkvKiAuLi4gY2FuY2VsIHJlZHVjZWQgVHggcG93ZXIgLi4uICovCi0JCWlmIChpd2xfbXZtX2J0X2NvZXhfcmVkdWNlZF90eHAobXZtLCBtdm12aWYtPmFwX3N0YV9pZCwgZmFsc2UpKQotCQkJSVdMX0VSUihtdm0sICJDb3VsZG4ndCBzZW5kIEJUX0NPTkZJRyBjbWRcbiIpOwotCQlkYXRhLT5yZWR1Y2VkX3R4X3Bvd2VyID0gZmFsc2U7Ci0KLQkJLyogLi4uIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCByZXBvcnRzIG9uIFJTU0kgYW55IG1vcmUuICovCisJCWl3bF9tdm1fYnRfY29leF9yZWR1Y2VkX3R4cChtdm0sIG12bXZpZi0+YXBfc3RhX2lkLCBmYWxzZSk7CiAJCWl3bF9tdm1fYnRfY29leF9lbmFibGVfcnNzaV9ldmVudChtdm0sIHZpZiwgZmFsc2UsIDApOwogCQlyZXR1cm47CiAJfQpAQCAtMTAyMiw5ICsxMDEyLDkgQEAKIAogCS8qIERvbid0IHNwYW0gdGhlIGZ3IHdpdGggdGhlIHNhbWUgY29tbWFuZCBvdmVyIGFuZCBvdmVyICovCiAJaWYgKG1lbWNtcCgmY21kLCAmbXZtLT5sYXN0X2J0X2NpX2NtZCwgc2l6ZW9mKGNtZCkpKSB7Ci0JCWlmIChpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEJUX0NPRVhfQ0ksIENNRF9TWU5DLAorCQlpZiAoaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBCVF9DT0VYX0NJLCAwLAogCQkJCQkgc2l6ZW9mKGNtZCksICZjbWQpKQotCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gc2VuZCBCVF9DSSBjbWQiKTsKKwkJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHNlbmQgQlRfQ0kgY21kXG4iKTsKIAkJbWVtY3B5KCZtdm0tPmxhc3RfYnRfY2lfY21kLCAmY21kLCBzaXplb2YoY21kKSk7CiAJfQogCkBAIC0xMDM5LDcgKzEwMjksNiBAQAogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byB1cGRhdGUgdGhlIGN0cmxfa2lsbF9tc2tcbiIpOwogfQogCi0vKiB1cG9uIGFzc29jaWF0aW9uLCB0aGUgZncgd2lsbCBzZW5kIGluIEJUIENvZXggbm90aWZpY2F0aW9uICovCiBpbnQgaXdsX212bV9yeF9idF9jb2V4X25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkgICAgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmRldl9jbWQpCkBAIC0xMjE1LDYgKzEyMDQsMTcgQEAKIAlyZXR1cm4gaXdsX2dldF9jb2V4X3R5cGUobXZtLCBtdm1zdGEtPnZpZikgPT0gQlRfQ09FWF9USUdIVF9MVVQ7CiB9CiAKK2Jvb2wgaXdsX212bV9idF9jb2V4X2lzX3RwY19hbGxvd2VkKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwl1MzIgYnRfYWN0aXZpdHkgPSBsZTMyX3RvX2NwdShtdm0tPmxhc3RfYnRfbm90aWYuYnRfYWN0aXZpdHlfZ3JhZGluZyk7CisKKwlpZiAoYmFuZCAhPSBJRUVFODAyMTFfQkFORF8yR0haKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gYnRfYWN0aXZpdHkgPj0gQlRfTE9XX1RSQUZGSUM7Cit9CisKIHU4IGl3bF9tdm1fYnRfY29leF90eF9wcmlvKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIHU4IGFjKQogewpAQCAtMTI0OSw5ICsxMjQ5LDYgQEAKIAogdm9pZCBpd2xfbXZtX2J0X2NvZXhfdmlmX2NoYW5nZShzdHJ1Y3QgaXdsX212bSAqbXZtKQogewotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX05FV0JUX0NPRVgpKQotCQlyZXR1cm47Ci0KIAlpd2xfbXZtX2J0X2NvZXhfbm90aWZfaGFuZGxlKG12bSk7CiB9CiAKQEAgLTEyNzAsNyArMTI2Nyw2IEBACiAJCS5pZCA9IEJUX0NPTkZJRywKIAkJLmxlbiA9IHsgc2l6ZW9mKCpidF9jbWQpLCB9LAogCQkuZGF0YWZsYWdzID0geyBJV0xfSENNRF9ERkxfTk9DT1BZLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCiAJaWYgKCFJV0xfTVZNX0JUX0NPRVhfQ09SVU5OSU5HKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZDMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2QzLmMKaW5kZXggZTU2ZjVhMC4uNjQ1YjNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZDMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kMy5jCkBAIC0xOTMsOCArMTkzLDcgQEAKIAkJCXdrYy53ZXBfa2V5LmtleV9vZmZzZXQgPSBkYXRhLT53ZXBfa2V5X2lkeDsKIAkJfQogCi0JCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgV0VQX0tFWSwgQ01EX1NZTkMsCi0JCQkJCSAgIHNpemVvZih3a2MpLCAmd2tjKTsKKwkJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBXRVBfS0VZLCAwLCBzaXplb2Yod2tjKSwgJndrYyk7CiAJCWRhdGEtPmVycm9yID0gcmV0ICE9IDA7CiAKIAkJbXZtLT5wdGtfaXZsZW4gPSBrZXktPml2X2xlbjsKQEAgLTM0MSw3ICszNDAsNiBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBXT1dMQU5fUEFUVEVSTlMsCiAJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCWludCBpLCBlcnI7CiAKQEAgLTUxOCw3ICs1MTYsNiBAQAogCQkuaWQgPSBSRU1PVEVfV0FLRV9DT05GSUdfQ01ELAogCQkubGVuID0geyBzaXplb2YoKmNmZyksIH0sCiAJCS5kYXRhZmxhZ3MgPSB7IElXTF9IQ01EX0RGTF9OT0NPUFksIH0sCi0JCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAJaW50IHJldDsKIApAQCAtNjY2LDEwICs2NjMsOCBAQAogCiAJaWYgKFdBUk5fT04oIXZpZi0+YnNzX2NvbmYuYXNzb2MpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkvKiBoYWNrICovCi0JdmlmLT5ic3NfY29uZi5hc3NvYyA9IGZhbHNlOworCiAJcmV0ID0gaXdsX212bV9tYWNfY3R4dF9hZGQobXZtLCB2aWYpOwotCXZpZi0+YnNzX2NvbmYuYXNzb2MgPSB0cnVlOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTcwNSw3ICs3MDAsNyBAQAogCQlyZXR1cm4gcmV0OwogCXJjdV9hc3NpZ25fcG9pbnRlcihtdm0tPmZ3X2lkX3RvX21hY19pZFttdm12aWYtPmFwX3N0YV9pZF0sIGFwX3N0YSk7CiAKLQlyZXQgPSBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCB2aWYpOworCXJldCA9IGl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIHZpZiwgZmFsc2UpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTcxOSw3ICs3MTQsNyBAQAogCWZvciAoaSA9IDE7IGkgPCBNQVhfQklORElOR1M7IGkrKykKIAkJcXVvdGFfY21kLnF1b3Rhc1tpXS5pZF9hbmRfY29sb3IgPSBjcHVfdG9fbGUzMihGV19DVFhUX0lOVkFMSUQpOwogCi0JcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBUSU1FX1FVT1RBX0NNRCwgQ01EX1NZTkMsCisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBUSU1FX1FVT1RBX0NNRCwgMCwKIAkJCQkgICBzaXplb2YocXVvdGFfY21kKSwgJnF1b3RhX2NtZCk7CiAJaWYgKHJldCkKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gc2VuZCBxdW90YTogJWRcbiIsIHJldCk7CkBAIC03MzksMTUgKzczNCwxMyBAQAogCX07CiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IE5PTl9RT1NfVFhfQ09VTlRFUl9DTUQsCi0JCS5mbGFncyA9IENNRF9TWU5DIHwgQ01EX1dBTlRfU0tCLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCiAJfTsKIAlpbnQgZXJyOwogCXUzMiBzaXplOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0QzX0NPTlRJTlVJVFlfQVBJKSB7Ci0JCWNtZC5kYXRhWzBdID0gJnF1ZXJ5X2NtZDsKLQkJY21kLmxlblswXSA9IHNpemVvZihxdWVyeV9jbWQpOwotCX0KKwljbWQuZGF0YVswXSA9ICZxdWVyeV9jbWQ7CisJY21kLmxlblswXSA9IHNpemVvZihxdWVyeV9jbWQpOwogCiAJZXJyID0gaXdsX212bV9zZW5kX2NtZChtdm0sICZjbWQpOwogCWlmIChlcnIpCkBAIC03NTgsMTAgKzc1MSw4IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJZXJyID0gbGUxNl90b19jcHVwKChfX2xlMTYgKiljbWQucmVzcF9wa3QtPmRhdGEpOwotCQkvKiBuZXcgQVBJIHJldHVybnMgbmV4dCwgbm90IGxhc3QtdXNlZCBzZXFubyAqLwotCQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmCi0JCQkJSVdMX1VDT0RFX1RMVl9GTEFHU19EM19DT05USU5VSVRZX0FQSSkKLQkJCWVyciA9ICh1MTYpIChlcnIgLSAweDEwKTsKKwkJLyogZmlybXdhcmUgcmV0dXJucyBuZXh0LCBub3QgbGFzdC11c2VkIHNlcW5vICovCisJCWVyciA9ICh1MTYpIChlcnIgLSAweDEwKTsKIAl9CiAKIAlpd2xfZnJlZV9yZXNwKCZjbWQpOwpAQCAtNzg1LDExICs3NzYsNyBAQAogCiAJbXZtdmlmLT5zZXFub192YWxpZCA9IGZhbHNlOwogCi0JaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmCi0JCQlJV0xfVUNPREVfVExWX0ZMQUdTX0QzX0NPTlRJTlVJVFlfQVBJKSkKLQkJcmV0dXJuOwotCi0JaWYgKGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgTk9OX1FPU19UWF9DT1VOVEVSX0NNRCwgQ01EX1NZTkMsCisJaWYgKGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgTk9OX1FPU19UWF9DT1VOVEVSX0NNRCwgMCwKIAkJCQkgc2l6ZW9mKHF1ZXJ5X2NtZCksICZxdWVyeV9jbWQpKQogCQlJV0xfRVJSKG12bSwgImZhaWxlZCB0byBzZXQgbm9uLVFvUyBzZXFub1xuIik7CiB9CkBAIC04MDQsNyArNzkxLDcgQEAKIAlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9XT1dMQU5fQ09ORklHX1RJRCkKIAkJY21kX2xlbiA9IHNpemVvZigqY21kKTsKIAotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFdPV0xBTl9DT05GSUdVUkFUSU9OLCBDTURfU1lOQywKKwlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBXT1dMQU5fQ09ORklHVVJBVElPTiwgMCwKIAkJCQkgICAgY21kX2xlbiwgY21kKTsKIH0KIApAQCAtODMzLDcgKzgyMCw3IEBACiAJfTsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGQzX2NmZ19jbWQgPSB7CiAJCS5pZCA9IEQzX0NPTkZJR19DTUQsCi0JCS5mbGFncyA9IENNRF9TWU5DIHwgQ01EX1dBTlRfU0tCLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCiAJCS5kYXRhWzBdID0gJmQzX2NmZ19jbWRfZGF0YSwKIAkJLmxlblswXSA9IHNpemVvZihkM19jZmdfY21kX2RhdGEpLAogCX07CkBAIC05ODMsNyArOTcwLDYgQEAKIAkJaWYgKGtleV9kYXRhLnVzZV9yc2NfdHNjKSB7CiAJCQlzdHJ1Y3QgaXdsX2hvc3RfY21kIHJzY190c2NfY21kID0gewogCQkJCS5pZCA9IFdPV0xBTl9UU0NfUlNDX1BBUkFNLAotCQkJCS5mbGFncyA9IENNRF9TWU5DLAogCQkJCS5kYXRhWzBdID0ga2V5X2RhdGEucnNjX3RzYywKIAkJCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKIAkJCQkubGVuWzBdID0gc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwKQEAgLTk5Nyw3ICs5ODMsNyBAQAogCQlpZiAoa2V5X2RhdGEudXNlX3RraXApIHsKIAkJCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwKIAkJCQkJCSAgIFdPV0xBTl9US0lQX1BBUkFNLAotCQkJCQkJICAgQ01EX1NZTkMsIHNpemVvZih0a2lwX2NtZCksCisJCQkJCQkgICAwLCBzaXplb2YodGtpcF9jbWQpLAogCQkJCQkJICAgJnRraXBfY21kKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CkBAIC0xMDE0LDggKzEwMDAsNyBAQAogCQkJa2VrX2tja19jbWQucmVwbGF5X2N0ciA9IG12bXZpZi0+cmVrZXlfZGF0YS5yZXBsYXlfY3RyOwogCiAJCQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sCi0JCQkJCQkgICBXT1dMQU5fS0VLX0tDS19NQVRFUklBTCwKLQkJCQkJCSAgIENNRF9TWU5DLAorCQkJCQkJICAgV09XTEFOX0tFS19LQ0tfTUFURVJJQUwsIDAsCiAJCQkJCQkgICBzaXplb2Yoa2VrX2tja19jbWQpLAogCQkJCQkJICAgJmtla19rY2tfY21kKTsKIAkJCWlmIChyZXQpCkBAIC0xMDMxLDcgKzEwMTYsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gaXdsX212bV9zZW5kX3Byb3RvX29mZmxvYWQobXZtLCB2aWYsIGZhbHNlLCBDTURfU1lOQyk7CisJcmV0ID0gaXdsX212bV9zZW5kX3Byb3RvX29mZmxvYWQobXZtLCB2aWYsIGZhbHNlLCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIApAQCAtMTA0Myw3ICsxMDI4LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXJldCA9IGl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0sIHZpZik7CisJcmV0ID0gaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTEwODIsNiArMTA2NywxNSBAQAogCiBpbnQgaXdsX212bV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCiB7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9NQUM4MDIxMV9HRVRfTVZNKGh3KTsKKworCWlmIChpd2xfbXZtX2lzX2QwaTNfc3VwcG9ydGVkKG12bSkpIHsKKwkJbXV0ZXhfbG9jaygmbXZtLT5kMGkzX3N1c3BlbmRfbXV0ZXgpOworCQlfX3NldF9iaXQoRDBJM19ERUZFUl9XQUtFVVAsICZtdm0tPmQwaTNfc3VzcGVuZF9mbGFncyk7CisJCW11dGV4X3VubG9jaygmbXZtLT5kMGkzX3N1c3BlbmRfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gX19pd2xfbXZtX3N1c3BlbmQoaHcsIHdvd2xhbiwgZmFsc2UpOwogfQogCkBAIC0xMjc3LDcgKzEyNzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpd2xfbXZtX3NldF9rZXlfcnhfc2VxKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwKLQkJCQkgICBzdHJ1Y3QgaXdsX3dvd2xhbl9zdGF0dXNfdjYgKnN0YXR1cykKKwkJCQkgICBzdHJ1Y3QgaXdsX3dvd2xhbl9zdGF0dXMgKnN0YXR1cykKIHsKIAl1bmlvbiBpd2xfYWxsX3RzY19yc2MgKnJzYyA9ICZzdGF0dXMtPmd0ay5yc2MuYWxsX3RzY19yc2M7CiAKQEAgLTEyOTQsNyArMTI4OCw3IEBACiB9CiAKIHN0cnVjdCBpd2xfbXZtX2QzX2d0a19pdGVyX2RhdGEgewotCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NiAqc3RhdHVzOworCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1cyAqc3RhdHVzOwogCXZvaWQgKmxhc3RfZ3RrOwogCXUzMiBjaXBoZXI7CiAJYm9vbCBmaW5kX3BoYXNlLCB1bmhhbmRsZWRfY2lwaGVyOwpAQCAtMTM3MCw3ICsxMzY0LDcgQEAKIAogc3RhdGljIGJvb2wgaXdsX212bV9zZXR1cF9jb25uZWN0aW9uX2tlZXAoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQkgIHN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NiAqc3RhdHVzKQorCQkJCQkgIHN0cnVjdCBpd2xfd293bGFuX3N0YXR1cyAqc3RhdHVzKQogewogCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwogCXN0cnVjdCBpd2xfbXZtX2QzX2d0a19pdGVyX2RhdGEgZ3RrZGF0YSA9IHsKQEAgLTE0NjUsMTAgKzE0NTksMTAgQEAKIAl9IGVycl9pbmZvOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBXT1dMQU5fR0VUX1NUQVRVU0VTLAotCQkuZmxhZ3MgPSBDTURfU1lOQyB8IENNRF9XQU5UX1NLQiwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAogCX07CiAJc3RydWN0IGl3bF93b3dsYW5fc3RhdHVzX2RhdGEgc3RhdHVzOwotCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NiAqc3RhdHVzX3Y2OworCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1cyAqZndfc3RhdHVzOwogCWludCByZXQsIGxlbiwgc3RhdHVzX3NpemUsIGk7CiAJYm9vbCBrZWVwOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhICphcF9zdGE7CkBAIC0xNDkxLDcgKzE0ODUsNyBAQAogCX0KIAogCS8qIG9ubHkgZm9yIHRyYWNpbmcgZm9yIG5vdyAqLwotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgT0ZGTE9BRFNfUVVFUllfQ01ELCBDTURfU1lOQywgMCwgTlVMTCk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBPRkZMT0FEU19RVUVSWV9DTUQsIDAsIDAsIE5VTEwpOwogCWlmIChyZXQpCiAJCUlXTF9FUlIobXZtLCAiZmFpbGVkIHRvIHF1ZXJ5IG9mZmxvYWQgc3RhdGlzdGljcyAoJWQpXG4iLCByZXQpOwogCkBAIC0xNTA1LDEwICsxNDk5LDcgQEAKIAlpZiAoIWNtZC5yZXNwX3BrdCkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0QzX0NPTlRJTlVJVFlfQVBJKQotCQlzdGF0dXNfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3dvd2xhbl9zdGF0dXNfdjYpOwotCWVsc2UKLQkJc3RhdHVzX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF93b3dsYW5fc3RhdHVzX3Y0KTsKKwlzdGF0dXNfc2l6ZSA9IHNpemVvZigqZndfc3RhdHVzKTsKIAogCWxlbiA9IGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4oY21kLnJlc3BfcGt0KTsKIAlpZiAobGVuIDwgc3RhdHVzX3NpemUpIHsKQEAgLTE1MTYsMzUgKzE1MDcsMTggQEAKIAkJZ290byBvdXRfZnJlZV9yZXNwOwogCX0KIAotCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19EM19DT05USU5VSVRZX0FQSSkgewotCQlzdGF0dXNfdjYgPSAodm9pZCAqKWNtZC5yZXNwX3BrdC0+ZGF0YTsKKwlmd19zdGF0dXMgPSAodm9pZCAqKWNtZC5yZXNwX3BrdC0+ZGF0YTsKIAotCQlzdGF0dXMucGF0dGVybl9udW1iZXIgPSBsZTE2X3RvX2NwdShzdGF0dXNfdjYtPnBhdHRlcm5fbnVtYmVyKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCXN0YXR1cy5xb3Nfc2VxX2N0cltpXSA9Ci0JCQkJbGUxNl90b19jcHUoc3RhdHVzX3Y2LT5xb3Nfc2VxX2N0cltpXSk7Ci0JCXN0YXR1cy53YWtldXBfcmVhc29ucyA9IGxlMzJfdG9fY3B1KHN0YXR1c192Ni0+d2FrZXVwX3JlYXNvbnMpOwotCQlzdGF0dXMud2FrZV9wYWNrZXRfbGVuZ3RoID0KLQkJCWxlMzJfdG9fY3B1KHN0YXR1c192Ni0+d2FrZV9wYWNrZXRfbGVuZ3RoKTsKLQkJc3RhdHVzLndha2VfcGFja2V0X2J1ZnNpemUgPQotCQkJbGUzMl90b19jcHUoc3RhdHVzX3Y2LT53YWtlX3BhY2tldF9idWZzaXplKTsKLQkJc3RhdHVzLndha2VfcGFja2V0ID0gc3RhdHVzX3Y2LT53YWtlX3BhY2tldDsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgaXdsX3dvd2xhbl9zdGF0dXNfdjQgKnN0YXR1c192NDsKLQkJc3RhdHVzX3Y2ID0gTlVMTDsKLQkJc3RhdHVzX3Y0ID0gKHZvaWQgKiljbWQucmVzcF9wa3QtPmRhdGE7Ci0KLQkJc3RhdHVzLnBhdHRlcm5fbnVtYmVyID0gbGUxNl90b19jcHUoc3RhdHVzX3Y0LT5wYXR0ZXJuX251bWJlcik7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlzdGF0dXMucW9zX3NlcV9jdHJbaV0gPQotCQkJCWxlMTZfdG9fY3B1KHN0YXR1c192NC0+cW9zX3NlcV9jdHJbaV0pOwotCQlzdGF0dXMud2FrZXVwX3JlYXNvbnMgPSBsZTMyX3RvX2NwdShzdGF0dXNfdjQtPndha2V1cF9yZWFzb25zKTsKLQkJc3RhdHVzLndha2VfcGFja2V0X2xlbmd0aCA9Ci0JCQlsZTMyX3RvX2NwdShzdGF0dXNfdjQtPndha2VfcGFja2V0X2xlbmd0aCk7Ci0JCXN0YXR1cy53YWtlX3BhY2tldF9idWZzaXplID0KLQkJCWxlMzJfdG9fY3B1KHN0YXR1c192NC0+d2FrZV9wYWNrZXRfYnVmc2l6ZSk7Ci0JCXN0YXR1cy53YWtlX3BhY2tldCA9IHN0YXR1c192NC0+d2FrZV9wYWNrZXQ7Ci0JfQorCXN0YXR1cy5wYXR0ZXJuX251bWJlciA9IGxlMTZfdG9fY3B1KGZ3X3N0YXR1cy0+cGF0dGVybl9udW1iZXIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXN0YXR1cy5xb3Nfc2VxX2N0cltpXSA9CisJCQlsZTE2X3RvX2NwdShmd19zdGF0dXMtPnFvc19zZXFfY3RyW2ldKTsKKwlzdGF0dXMud2FrZXVwX3JlYXNvbnMgPSBsZTMyX3RvX2NwdShmd19zdGF0dXMtPndha2V1cF9yZWFzb25zKTsKKwlzdGF0dXMud2FrZV9wYWNrZXRfbGVuZ3RoID0KKwkJbGUzMl90b19jcHUoZndfc3RhdHVzLT53YWtlX3BhY2tldF9sZW5ndGgpOworCXN0YXR1cy53YWtlX3BhY2tldF9idWZzaXplID0KKwkJbGUzMl90b19jcHUoZndfc3RhdHVzLT53YWtlX3BhY2tldF9idWZzaXplKTsKKwlzdGF0dXMud2FrZV9wYWNrZXQgPSBmd19zdGF0dXMtPndha2VfcGFja2V0OwogCiAJaWYgKGxlbiAhPSBzdGF0dXNfc2l6ZSArIEFMSUdOKHN0YXR1cy53YWtlX3BhY2tldF9idWZzaXplLCA0KSkgewogCQlJV0xfRVJSKG12bSwgIkludmFsaWQgV29XTEFOIHN0YXR1cyByZXNwb25zZSFcbiIpOwpAQCAtMTU3MSw3ICsxNTQ1LDcgQEAKIAogCWl3bF9tdm1fcmVwb3J0X3dha2V1cF9yZWFzb25zKG12bSwgdmlmLCAmc3RhdHVzKTsKIAotCWtlZXAgPSBpd2xfbXZtX3NldHVwX2Nvbm5lY3Rpb25fa2VlcChtdm0sIHZpZiwgc3RhdHVzX3Y2KTsKKwlrZWVwID0gaXdsX212bV9zZXR1cF9jb25uZWN0aW9uX2tlZXAobXZtLCB2aWYsIGZ3X3N0YXR1cyk7CiAKIAlpd2xfZnJlZV9yZXNwKCZjbWQpOwogCXJldHVybiBrZWVwOwpAQCAtMTY3NCw2ICsxNjQ4LDE5IEBACiB7CiAJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9NQUM4MDIxMV9HRVRfTVZNKGh3KTsKIAorCWlmIChpd2xfbXZtX2lzX2QwaTNfc3VwcG9ydGVkKG12bSkpIHsKKwkJYm9vbCBleGl0X25vdzsKKworCQltdXRleF9sb2NrKCZtdm0tPmQwaTNfc3VzcGVuZF9tdXRleCk7CisJCV9fY2xlYXJfYml0KEQwSTNfREVGRVJfV0FLRVVQLCAmbXZtLT5kMGkzX3N1c3BlbmRfZmxhZ3MpOworCQlleGl0X25vdyA9IF9fdGVzdF9hbmRfY2xlYXJfYml0KEQwSTNfUEVORElOR19XQUtFVVAsCisJCQkJCQkmbXZtLT5kMGkzX3N1c3BlbmRfZmxhZ3MpOworCQltdXRleF91bmxvY2soJm12bS0+ZDBpM19zdXNwZW5kX211dGV4KTsKKwkJaWYgKGV4aXRfbm93KQorCQkJX2l3bF9tdm1fZXhpdF9kMGkzKG12bSk7CisJCXJldHVybiAwOworCX0KKwogCXJldHVybiBfX2l3bF9tdm1fcmVzdW1lKG12bSwgZmFsc2UpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZGVidWdmcy12aWYuYwppbmRleCA5YjU5ZTFkLi4yZTkwZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMKQEAgLTEwMywxMCArMTAzLDYgQEAKIAkJSVdMX0RFQlVHX1BPV0VSKG12bSwgInR4X2RhdGFfdGltZW91dD0lZFxuIiwgdmFsKTsKIAkJZGJnZnNfcG0tPnR4X2RhdGFfdGltZW91dCA9IHZhbDsKIAkJYnJlYWs7Ci0JY2FzZSBNVk1fREVCVUdGU19QTV9ESVNBQkxFX1BPV0VSX09GRjoKLQkJSVdMX0RFQlVHX1BPV0VSKG12bSwgImRpc2FibGVfcG93ZXJfb2ZmPSVkXG4iLCB2YWwpOwotCQlkYmdmc19wbS0+ZGlzYWJsZV9wb3dlcl9vZmYgPSB2YWw7Ci0JCWJyZWFrOwogCWNhc2UgTVZNX0RFQlVHRlNfUE1fTFBSWF9FTkE6CiAJCUlXTF9ERUJVR19QT1dFUihtdm0sICJscHJ4ICVzXG4iLCB2YWwgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAkJZGJnZnNfcG0tPmxwcnhfZW5hID0gdmFsOwpAQCAtMTU0LDEyICsxNTAsNiBAQAogCQlpZiAoc3NjYW5mKGJ1ZiArIDE2LCAiJWQiLCAmdmFsKSAhPSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXBhcmFtID0gTVZNX0RFQlVHRlNfUE1fVFhfREFUQV9USU1FT1VUOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoImRpc2FibGVfcG93ZXJfb2ZmPSIsIGJ1ZiwgMTgpICYmCi0JCSAgICEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmCi0JCSAgICAgSVdMX1VDT0RFX1RMVl9GTEFHU19ERVZJQ0VfUFNfQ01EKSkgewotCQlpZiAoc3NjYW5mKGJ1ZiArIDE4LCAiJWQiLCAmdmFsKSAhPSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBhcmFtID0gTVZNX0RFQlVHRlNfUE1fRElTQUJMRV9QT1dFUl9PRkY7CiAJfSBlbHNlIGlmICghc3RybmNtcCgibHByeD0iLCBidWYsIDUpKSB7CiAJCWlmIChzc2NhbmYoYnVmICsgNSwgIiVkIiwgJnZhbCkgIT0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg1LDcgKzE3NSw3IEBACiAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAlpd2xfZGJnZnNfdXBkYXRlX3BtKG12bSwgdmlmLCBwYXJhbSwgdmFsKTsKLQlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCXJldCA9IGl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID86IGNvdW50OwpAQCAtMjcyLDEwICsyNjIsOSBAQAogCQkJc3RydWN0IGl3bF9tdm1fc3RhICptdm1fc3RhID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwogCiAJCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywKLQkJCQkJICJhcF9zdGFfaWQgJWQgLSByZWR1Y2VkIFR4IHBvd2VyICVkIGZvcmNlICVkXG4iLAorCQkJCQkgImFwX3N0YV9pZCAlZCAtIHJlZHVjZWQgVHggcG93ZXIgJWRcbiIsCiAJCQkJCSBhcF9zdGFfaWQsCi0JCQkJCSBtdm1fc3RhLT5idF9yZWR1Y2VkX3R4cG93ZXIsCi0JCQkJCSBtdm1fc3RhLT5idF9yZWR1Y2VkX3R4cG93ZXJfZGJnKTsKKwkJCQkJIG12bV9zdGEtPmJ0X3JlZHVjZWRfdHhwb3dlcik7CiAJCX0KIAl9CiAKQEAgLTI5Myw0MSArMjgyLDYgQEAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19yZWR1Y2VkX3R4cF93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQkgICBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJICAgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwotCXN0cnVjdCBpd2xfbXZtICptdm0gPSBtdm12aWYtPm12bTsKLQlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKLQlib29sIHJlZHVjZWRfdHhfcG93ZXI7Ci0JaW50IHJldDsKLQotCWlmIChtdm12aWYtPmFwX3N0YV9pZCA+PSBBUlJBWV9TSVpFKG12bS0+ZndfaWRfdG9fbWFjX2lkKSkKLQkJcmV0dXJuIC1FTk9UQ09OTjsKLQotCWlmIChzdHJ0b2Jvb2woYnVmLCAmcmVkdWNlZF90eF9wb3dlcikgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKLQotCW12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fc3RhaWRfcHJvdGVjdGVkKG12bSwgbXZtdmlmLT5hcF9zdGFfaWQpOwotCWlmIChJU19FUlJfT1JfTlVMTChtdm1zdGEpKSB7Ci0JCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7Ci0JCXJldHVybiAtRU5PVENPTk47Ci0JfQotCi0JbXZtc3RhLT5idF9yZWR1Y2VkX3R4cG93ZXJfZGJnID0gZmFsc2U7Ci0JcmV0ID0gaXdsX212bV9idF9jb2V4X3JlZHVjZWRfdHhwKG12bSwgbXZtdmlmLT5hcF9zdGFfaWQsCi0JCQkJCSAgcmVkdWNlZF90eF9wb3dlcik7Ci0JaWYgKCFyZXQpCi0JCW12bXN0YS0+YnRfcmVkdWNlZF90eHBvd2VyX2RiZyA9IHRydWU7Ci0KLQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldCA/IDogY291bnQ7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bF9kYmdmc191cGRhdGVfYmYoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQllbnVtIGl3bF9kYmdmc19iZl9tYXNrIHBhcmFtLCBpbnQgdmFsdWUpCiB7CkBAIC00NjIsOSArNDE2LDkgQEAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAlpd2xfZGJnZnNfdXBkYXRlX2JmKHZpZiwgcGFyYW0sIHZhbHVlKTsKIAlpZiAocGFyYW0gPT0gTVZNX0RFQlVHRlNfQkZfRU5BQkxFX0JFQUNPTl9GSUxURVIgJiYgIXZhbHVlKQotCQlyZXQgPSBpd2xfbXZtX2Rpc2FibGVfYmVhY29uX2ZpbHRlcihtdm0sIHZpZiwgQ01EX1NZTkMpOworCQlyZXQgPSBpd2xfbXZtX2Rpc2FibGVfYmVhY29uX2ZpbHRlcihtdm0sIHZpZiwgMCk7CiAJZWxzZQotCQlyZXQgPSBpd2xfbXZtX2VuYWJsZV9iZWFjb25fZmlsdGVyKG12bSwgdmlmLCBDTURfU1lOQyk7CisJCXJldCA9IGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID86IGNvdW50OwpAQCAtNTY4LDcgKzUyMiw2IEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHBtX3BhcmFtcywgMzIpOwogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhiZl9wYXJhbXMsIDI1Nik7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGxvd19sYXRlbmN5LCAxMCk7Ci1NVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhyZWR1Y2VkX3R4cCwgMTApOwogCiB2b2lkIGl3bF9tdm1fdmlmX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CkBAIC01OTIsOCArNTQ1LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICgobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUE1fQ01EX1NVUFBPUlQpICYmCi0JICAgIGl3bG12bV9tb2RfcGFyYW1zLnBvd2VyX3NjaGVtZSAhPSBJV0xfUE9XRVJfU0NIRU1FX0NBTSAmJgorCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgIT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0gJiYKIAkgICAgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnApIHx8CiAJICAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgdmlmLT5wMnAgJiYKIAkgICAgICBtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpKQpAQCAtNjAxLDcgKzU1Myw2IEBACiAJCQkJCSBTX0lSVVNSKTsKIAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihtYWNfcGFyYW1zLCBtdm12aWYtPmRiZ2ZzX2RpciwgU19JUlVTUik7Ci0JTVZNX0RFQlVHRlNfQUREX0ZJTEVfVklGKHJlZHVjZWRfdHhwLCBtdm12aWYtPmRiZ2ZzX2RpciwgU19JV1VTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEVfVklGKGxvd19sYXRlbmN5LCBtdm12aWYtPmRiZ2ZzX2RpciwKIAkJCQkgU19JUlVTUiB8IFNfSVdVU1IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMKaW5kZXggMWI1MmRlZS4uMjljYTcyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2RlYnVnZnMuYwpAQCAtNjUsOSArNjUsOCBAQAogI2luY2x1ZGUgIm12bS5oIgogI2luY2x1ZGUgInN0YS5oIgogI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1wcnBoLmgiCiAjaW5jbHVkZSAiZGVidWdmcy5oIgotI2luY2x1ZGUgImZ3LWVycm9yLWR1bXAuaCIKKyNpbmNsdWRlICJpd2wtZnctZXJyb3ItZHVtcC5oIgogCiBzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfdHhfZmx1c2hfd3JpdGUoc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqYnVmLAogCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTEzNiw5ICsxMzUsNiBAQAogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gbXZtLT5md19lcnJvcl9kdW1wOwogCW12bS0+ZndfZXJyb3JfZHVtcCA9IE5VTEw7Ci0Ja2ZyZWUobXZtLT5md19lcnJvcl9zcmFtKTsKLQltdm0tPmZ3X2Vycm9yX3NyYW0gPSBOVUxMOwotCW12bS0+ZndfZXJyb3Jfc3JhbV9sZW4gPSAwOwogCXJldCA9IDA7CiAKIG91dDoKQEAgLTY4NCw3ICs2ODAsNyBAQAogCQltdm0tPnJlc3RhcnRfZncrKzsKIAogCS8qIHRha2UgdGhlIHJldHVybiB2YWx1ZSB0byBtYWtlIGNvbXBpbGVyIGhhcHB5IC0gaXQgd2lsbCBmYWlsIGFueXdheSAqLwotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgUkVQTFlfRVJST1IsIENNRF9TWU5DLCAwLCBOVUxMKTsKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFJFUExZX0VSUk9SLCAwLCAwLCBOVUxMKTsKIAogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiAKQEAgLTY5NCw3ICs2OTAsNyBAQAogc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX2Z3X25taV93cml0ZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBjaGFyICpidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaXdsX3dyaXRlX3BycGgobXZtLT50cmFucywgREVWSUNFX1NFVF9OTUlfUkVHLCAxKTsKKwlpd2xfZm9yY2Vfbm1pKG12bS0+dHJhbnMpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtODQxLDcgKzgzNyw3IEBACiAJLyogc2VuZCB1cGRhdGVkIGJjYXN0IGZpbHRlcmluZyBjb25maWd1cmF0aW9uICovCiAJaWYgKG12bS0+ZGJnZnNfYmNhc3RfZmlsdGVyaW5nLm92ZXJyaWRlICYmCiAJICAgIGl3bF9tdm1fYmNhc3RfZmlsdGVyX2J1aWxkX2NtZChtdm0sICZjbWQpKQotCQllcnIgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEJDQVNUX0ZJTFRFUl9DTUQsIENNRF9TWU5DLAorCQllcnIgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEJDQVNUX0ZJTFRFUl9DTUQsIDAsCiAJCQkJCSAgIHNpemVvZihjbWQpLCAmY21kKTsKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogCkBAIC05MTMsNyArOTA5LDcgQEAKIAkvKiBzZW5kIHVwZGF0ZWQgYmNhc3QgZmlsdGVyaW5nIGNvbmZpZ3VyYXRpb24gKi8KIAlpZiAobXZtLT5kYmdmc19iY2FzdF9maWx0ZXJpbmcub3ZlcnJpZGUgJiYKIAkgICAgaXdsX212bV9iY2FzdF9maWx0ZXJfYnVpbGRfY21kKG12bSwgJmNtZCkpCi0JCWVyciA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQkNBU1RfRklMVEVSX0NNRCwgQ01EX1NZTkMsCisJCWVyciA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQkNBU1RfRklMVEVSX0NNRCwgMCwKIAkJCQkJICAgc2l6ZW9mKGNtZCksICZjbWQpOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiAKQEAgLTEwMDQsNiArMTAwMCw3IEBACiAJUFJJTlRfTVZNX1JFRihJV0xfTVZNX1JFRl9QMlBfQ0xJRU5UKTsKIAlQUklOVF9NVk1fUkVGKElXTF9NVk1fUkVGX0FQX0lCU1MpOwogCVBSSU5UX01WTV9SRUYoSVdMX01WTV9SRUZfVVNFUik7CisJUFJJTlRfTVZNX1JFRihJV0xfTVZNX1JFRl9FWElUX1dPUkspOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwogfQpAQCAtMTEwOCw5ICsxMTA1LDkgQEAKIE1WTV9ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZDBpM19yZWZzLCA4KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2RiZ2ZzX2Z3X2Vycm9yX2R1bXBfb3BzID0gewotICAgICAgICAub3BlbiA9IGl3bF9kYmdmc19md19lcnJvcl9kdW1wX29wZW4sCi0gICAgICAgIC5yZWFkID0gaXdsX2RiZ2ZzX2Z3X2Vycm9yX2R1bXBfcmVhZCwKLSAgICAgICAgLnJlbGVhc2UgPSBpd2xfZGJnZnNfZndfZXJyb3JfZHVtcF9yZWxlYXNlLAorCS5vcGVuID0gaXdsX2RiZ2ZzX2Z3X2Vycm9yX2R1bXBfb3BlbiwKKwkucmVhZCA9IGl3bF9kYmdmc19md19lcnJvcl9kdW1wX3JlYWQsCisJLnJlbGVhc2UgPSBpd2xfZGJnZnNfZndfZXJyb3JfZHVtcF9yZWxlYXNlLAogfTsKIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0JDQVNUX0ZJTFRFUklORwpAQCAtMTEzOCw5ICsxMTM1LDggQEAKIAlNVk1fREVCVUdGU19BRERfRklMRShmd19lcnJvcl9kdW1wLCBkYmdmc19kaXIsIFNfSVJVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGJ0X25vdGlmLCBkYmdmc19kaXIsIFNfSVJVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGJ0X2NtZCwgZGJnZnNfZGlyLCBTX0lSVVNSKTsKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfREVWSUNFX1BTX0NNRCkKLQkJTVZNX0RFQlVHRlNfQUREX0ZJTEUoZGlzYWJsZV9wb3dlcl9vZmYsIG12bS0+ZGVidWdmc19kaXIsCi0JCQkJICAgICBTX0lSVVNSIHwgU19JV1VTUik7CisJTVZNX0RFQlVHRlNfQUREX0ZJTEUoZGlzYWJsZV9wb3dlcl9vZmYsIG12bS0+ZGVidWdmc19kaXIsCisJCQkgICAgIFNfSVJVU1IgfCBTX0lXVVNSKTsKIAlNVk1fREVCVUdGU19BRERfRklMRShmd19yeF9zdGF0cywgbXZtLT5kZWJ1Z2ZzX2RpciwgU19JUlVTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEUoZHJ2X3J4X3N0YXRzLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lSVVNSKTsKIAlNVk1fREVCVUdGU19BRERfRklMRShmd19yZXN0YXJ0LCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1jb2V4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktY29leC5oCmluZGV4IDIxODc3ZTUuLjVmZTgyYzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktY29leC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1jb2V4LmgKQEAgLTE0MSw3ICsxNDEsOCBAQAogCUJUX0NPRVhfVFhfRElTX0xVVCwKIAogCUJUX0NPRVhfTUFYX0xVVCwKLX07CisJQlRfQ09FWF9JTlZBTElEX0xVVCA9IDB4ZmYsCit9OyAvKiBCVF9DT0VYX0RFQ0lTSU9OX0xVVF9JTkRFWF9BUElfRV9WRVJfMSAqLwogCiAjZGVmaW5lIEJUX0NPRVhfTFVUX1NJWkUgKDEyKQogI2RlZmluZSBCVF9DT0VYX0NPUlVOX0xVVF9TSVpFICgzMikKQEAgLTE1NCwxOSArMTU1LDIzIEBACiAgKiBAZmxhZ3M6JmVudW0gaXdsX2J0X2NvZXhfZmxhZ3MKICAqIEBtYXhfa2lsbDoKICAqIEBidF9yZWR1Y2VkX3R4X3Bvd2VyOiBlbnVtICVpd2xfYnRfcmVkdWNlZF90eF9wb3dlcgotICogQGJ0NF9hbnRlbm5hX2lzb2xhdGlvbjoKLSAqIEBidDRfYW50ZW5uYV9pc29sYXRpb25fdGhyOgotICogQGJ0NF90eF90eF9kZWx0YV9mcmVxX3RocjoKLSAqIEBidDRfdHhfcnhfbWF4X2ZyZXEwOgotICogQGJ0X3ByaW9fYm9vc3Q6CisgKiBAb3ZlcnJpZGVfcHJpbWFyeV9sdXQ6IGVudW0gJWl3bF9idF9jb2V4X2x1dF90eXBlOiBCVF9DT0VYX0lOVkFMSURfTFVUCisgKglzaG91bGQgYmUgc2V0IGJ5IGRlZmF1bHQKKyAqIEBvdmVycmlkZV9zZWNvbmRhcnlfbHV0OiBlbnVtICVpd2xfYnRfY29leF9sdXRfdHlwZTogQlRfQ09FWF9JTlZBTElEX0xVVAorICoJc2hvdWxkIGJlIHNldCBieSBkZWZhdWx0CisgKiBAYnQ0X2FudGVubmFfaXNvbGF0aW9uOiBhbnRlbm5hIGlzb2xhdGlvbgorICogQGJ0NF9hbnRlbm5hX2lzb2xhdGlvbl90aHI6IGFudGVubmEgdGhyZXNob2xkIHZhbHVlCisgKiBAYnQ0X3R4X3R4X2RlbHRhX2ZyZXFfdGhyOiBUeFR4IGRlbHRhIGZyZXF1ZW5jeQorICogQGJ0NF90eF9yeF9tYXhfZnJlcTA6IFR4UnggbWF4IGZyZXF1ZW5jeQorICogQGJ0X3ByaW9fYm9vc3Q6IEJUIHByaW9yaXR5IGJvb3N0IHJlZ2lzdGVycwogICogQHdpZmlfdHhfcHJpb19ib29zdDogU1cgYm9vc3Qgb2Ygd2lmaSB0eCBwcmlvcml0eQogICogQHdpZmlfcnhfcHJpb19ib29zdDogU1cgYm9vc3Qgb2Ygd2lmaSByeCBwcmlvcml0eQotICogQGtpbGxfYWNrX21zazoKLSAqIEBraWxsX2N0c19tc2s6Ci0gKiBAZGVjaXNpb25fbHV0OgotICogQGJ0NF9tdWx0aXByaW9fbHV0OgotICogQGJ0NF9jb3J1bl9sdXQyMDoKLSAqIEBidDRfY29ydW5fbHV0NDA6CisgKiBAa2lsbF9hY2tfbXNrOiBraWxsIEFDSyBtYXNrLiAxIC0gVHggQUNLLCAwIC0ga2lsbCBUeCBvZiBBQ0suCisgKiBAa2lsbF9jdHNfbXNrOiBraWxsIENUUyBtYXNrLiAxIC0gVHggQ1RTLCAwIC0ga2lsbCBUeCBvZiBDVFMuCisgKiBAZGVjaXNpb25fbHV0OiBQVEEgZGVjaXNpb24gTFVULCBwZXIgUHJpby1DaAorICogQGJ0NF9tdWx0aXByaW9fbHV0OiBtdWx0aSBwcmlvcml0eSBMVVQgY29uZmlndXJhdGlvbgorICogQGJ0NF9jb3J1bl9sdXQyMDogY28tcnVubmluZyAyMCBNSHogTFVUIGNvbmZpZ3VyYXRpb24KKyAqIEBidDRfY29ydW5fbHV0NDA6IGNvLXJ1bm5pbmcgNDAgTUh6IExVVCBjb25maWd1cmF0aW9uCiAgKiBAdmFsaWRfYml0X21zazogZW51bSAlaXdsX2J0X2NvZXhfdmFsaWRfYml0X21zawogICoKICAqIFRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIEJUX0NPRVggY29tbWFuZC4KQEAgLTE3NSw3ICsxODAsOCBAQAogCV9fbGUzMiBmbGFnczsKIAl1OCBtYXhfa2lsbDsKIAl1OCBidF9yZWR1Y2VkX3R4X3Bvd2VyOwotCXU4IHJlc2VydmVkWzJdOworCXU4IG92ZXJyaWRlX3ByaW1hcnlfbHV0OworCXU4IG92ZXJyaWRlX3NlY29uZGFyeV9sdXQ7CiAKIAl1OCBidDRfYW50ZW5uYV9pc29sYXRpb247CiAJdTggYnQ0X2FudGVubmFfaXNvbGF0aW9uX3RocjsKQEAgLTE5NCw3ICsyMDAsNyBAQAogCV9fbGUzMiBidDRfY29ydW5fbHV0NDBbQlRfQ09FWF9DT1JVTl9MVVRfU0laRV07CiAKIAlfX2xlMzIgdmFsaWRfYml0X21zazsKLX0gX19wYWNrZWQ7IC8qIEJUX0NPRVhfQ01EX0FQSV9TX1ZFUl8zICovCit9IF9fcGFja2VkOyAvKiBCVF9DT0VYX0NNRF9BUElfU19WRVJfNSAqLwogCiAvKioKICAqIHN0cnVjdCBpd2xfYnRfY29leF9jaV9jbWQgLSBidCBjb2V4IGNoYW5uZWwgaW5oaWJpdGlvbiBjb21tYW5kCkBAIC0yODIsNyArMjg4LDcgQEAKIAlCVF9PTl9OT19DT05ORUNUSU9OCT0gMSwKIAlCVF9MT1dfVFJBRkZJQwkJPSAyLAogCUJUX0hJR0hfVFJBRkZJQwkJPSAzLAotfTsKK307IC8qIEJUX0NPRVhfQlRfQUNUSVZJVFlfR1JBRElOR19BUElfRV9WRVJfMSAqLwogCiAvKioKICAqIHN0cnVjdCBpd2xfYnRfY29leF9wcm9maWxlX25vdGlmIC0gbm90aWZpY2F0aW9uIGFib3V0IEJUIGNvZXgKQEAgLTMxMCw3ICszMTYsNyBAQAogCV9fbGUzMiBwcmltYXJ5X2NoX2x1dDsKIAlfX2xlMzIgc2Vjb25kYXJ5X2NoX2x1dDsKIAlfX2xlMzIgYnRfYWN0aXZpdHlfZ3JhZGluZzsKLX0gX19wYWNrZWQ7IC8qIEJUX0NPRVhfUFJPRklMRV9OVEZZX0FQSV9TX1ZFUl8yICovCit9IF9fcGFja2VkOyAvKiBCVF9DT0VYX1BST0ZJTEVfTlRGWV9BUElfU19WRVJfMyAqLwogCiBlbnVtIGl3bF9idF9jb2V4X3ByaW9fdGFibGVfZXZlbnQgewogCUJUX0NPRVhfUFJJT19UQkxfRVZUX0lOSVRfQ0FMSUIxCQk9IDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktZDMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1kMy5oCmluZGV4IDEwZmNjMWEuLjEzNjk2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1kMy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1kMy5oCkBAIC0zNDUsMjEgKzM0NSw2IEBACiAJSVdMX1dPV0xBTl9XQUtFVVBfQllfUkVNX1dBS0VfV0FLRVVQX1BBQ0tFVAkJPSBCSVQoMTIpLAogfTsgLyogV09XTEFOX1dBS0VfVVBfUkVBU09OX0FQSV9FX1ZFUl8yICovCiAKLXN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NCB7Ci0JX19sZTY0IHJlcGxheV9jdHI7Ci0JX19sZTE2IHBhdHRlcm5fbnVtYmVyOwotCV9fbGUxNiBub25fcW9zX3NlcV9jdHI7Ci0JX19sZTE2IHFvc19zZXFfY3RyWzhdOwotCV9fbGUzMiB3YWtldXBfcmVhc29uczsKLQlfX2xlMzIgcmVrZXlfc3RhdHVzOwotCV9fbGUzMiBudW1fb2ZfZ3RrX3Jla2V5czsKLQlfX2xlMzIgdHJhbnNtaXR0ZWRfbmRwczsKLQlfX2xlMzIgcmVjZWl2ZWRfYmVhY29uczsKLQlfX2xlMzIgd2FrZV9wYWNrZXRfbGVuZ3RoOwotCV9fbGUzMiB3YWtlX3BhY2tldF9idWZzaXplOwotCXU4IHdha2VfcGFja2V0W107IC8qIGNhbiBiZSB0cnVuY2F0ZWQgZnJvbSBfbGVuZ3RoIHRvIF9idWZzaXplICovCi19IF9fcGFja2VkOyAvKiBXT1dMQU5fU1RBVFVTRVNfQVBJX1NfVkVSXzQgKi8KLQogc3RydWN0IGl3bF93b3dsYW5fZ3RrX3N0YXR1cyB7CiAJdTgga2V5X2luZGV4OwogCXU4IHJlc2VydmVkWzNdOwpAQCAtMzY4LDcgKzM1Myw3IEBACiAJc3RydWN0IGl3bF93b3dsYW5fcnNjX3RzY19wYXJhbXNfY21kIHJzYzsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NiB7CitzdHJ1Y3QgaXdsX3dvd2xhbl9zdGF0dXMgewogCXN0cnVjdCBpd2xfd293bGFuX2d0a19zdGF0dXMgZ3RrOwogCV9fbGU2NCByZXBsYXlfY3RyOwogCV9fbGUxNiBwYXR0ZXJuX251bWJlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1ycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXJzLmgKaW5kZXggMzkxNDhiNS4uOGJiNWI5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXJzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXJzLmgKQEAgLTMzNCw3ICszMzQsNyBAQAogICovCiBzdHJ1Y3QgaXdsX2xxX2NtZCB7CiAJdTggc3RhX2lkOwotCXU4IHJlc2VydmVkMTsKKwl1OCByZWR1Y2VkX3RwYzsKIAl1MTYgY29udHJvbDsKIAkvKiBMSU5LX1FVQUxfR0VORVJBTF9QQVJBTVNfQVBJX1NfVkVSXzEgKi8KIAl1OCBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCmluZGV4IGQ3M2E4OWUuLjY5NTlmZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaApAQCAtMTY5LDggKzE2OSwxMiBAQAogCVNDQU5fVFlQRV9ESVNDT1ZFUllfRk9SQ0VECT0gNiwKIH07IC8qIFNDQU5fQUNUSVZJVFlfVFlQRV9FX1ZFUl8xICovCiAKLS8qIE1heGltYWwgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gKi8KLSNkZWZpbmUgTUFYX05VTV9TQ0FOX0NIQU5ORUxTIDB4MjQKKy8qKgorICogTWF4aW1hbCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorICogaXQgc2hvdWxkIGJlIGVxdWFsIHRvOgorICogbWF4KElXTF9OVU1fQ0hBTk5FTFMsIElXTF9OVU1fQ0hBTk5FTFNfRkFNSUxZXzgwMDApCisgKi8KKyNkZWZpbmUgTUFYX05VTV9TQ0FOX0NIQU5ORUxTIDUwCiAKIC8qKgogICogc3RydWN0IGl3bF9zY2FuX2NtZCAtIHNjYW4gcmVxdWVzdCBjb21tYW5kCkBAIC01MzQsMTMgKzUzOCwxNiBAQAogICoKICAqIElXTF9TQ0FOX09GRkxPQURfRkxBR19QQVNTX0FMTDogcGFzcyBhbGwgcmVzdWx0cyAtIG5vIGZpbHRlcmluZy4KICAqIElXTF9TQ0FOX09GRkxPQURfRkxBR19DQUNIRURfQ0hBTk5FTDogYWRkIGNhY2hlZCBjaGFubmVscyB0byBwYXJ0aWFsIHNjYW4uCi0gKiBJV0xfU0NBTl9PRkZMT0FEX0ZMQUdfRU5FUkdZX1NDQU46IHVzZSBlbmVyZ3kgYmFzZWQgc2NhbiBiZWZvcmUgcGFydGlhbCBzY2FuCi0gKglvbiBBIGJhbmQuCisgKiBJV0xfU0NBTl9PRkZMT0FEX0ZMQUdfRUJTX1FVSUNLX01PREU6IEVCUyBkdXJhdGlvbiBpcyAxMDBtU2VjIC0gdHlwaWNhbAorICoJYmVhY29uIHBlcmlvZC4gRmluZGluZyBjaGFubmVsIGFjdGl2aXR5IGluIHRoaXMgbW9kZSBpcyBub3QgZ3VhcmFudGVlZC4KKyAqIElXTF9TQ0FOX09GRkxPQURfRkxBR19FQlNfQUNDVVJBVEVfTU9ERTogRUJTIGR1cmF0aW9uIGlzIDIwMG1TZWMuCisgKglBc3N1bWluZyBiZWFjb24gcGVyaW9kIGlzIDEwMG1zIGZpbmRpbmcgY2hhbm5lbCBhY3Rpdml0eSBpcyBndWFyYW50ZWVkLgogICovCiBlbnVtIGl3bF9zY2FuX29mZmxvYWRfZmxhZ3MgewogCUlXTF9TQ0FOX09GRkxPQURfRkxBR19QQVNTX0FMTAkJPSBCSVQoMCksCiAJSVdMX1NDQU5fT0ZGTE9BRF9GTEFHX0NBQ0hFRF9DSEFOTkVMCT0gQklUKDIpLAotCUlXTF9TQ0FOX09GRkxPQURfRkxBR19FTkVSR1lfU0NBTgk9IEJJVCgzKSwKKwlJV0xfU0NBTl9PRkZMT0FEX0ZMQUdfRUJTX1FVSUNLX01PREUJPSBCSVQoNSksCisJSVdMX1NDQU5fT0ZGTE9BRF9GTEFHX0VCU19BQ0NVUkFURV9NT0RFCT0gQklUKDYpLAogfTsKIAogLyoqCkBAIC01NjMsMTcgKzU3MCwyNCBAQAogCUlXTF9TQ0FOX09GRkxPQURfQUJPUlRFRAk9IDIsCiB9OwogCitlbnVtIGl3bF9zY2FuX2Vic19zdGF0dXMgeworCUlXTF9TQ0FOX0VCU19TVUNDRVNTLAorCUlXTF9TQ0FOX0VCU19GQUlMRUQsCisJSVdMX1NDQU5fRUJTX0NIQU5fTk9UX0ZPVU5ELAorfTsKKwogLyoqCiAgKiBpd2xfc2Nhbl9vZmZsb2FkX2NvbXBsZXRlIC0gU0NBTl9PRkZMT0FEX0NPTVBMRVRFX05URl9BUElfU19WRVJfMQogICogQGxhc3Rfc2NoZWR1bGVfbGluZToJCWxhc3Qgc2NoZWR1bGUgbGluZSBleGVjdXRlZCAoZmFzdCBvciByZWd1bGFyKQogICogQGxhc3Rfc2NoZWR1bGVfaXRlcmF0aW9uOglsYXN0IHNjYW4gaXRlcmF0aW9uIGV4ZWN1dGVkIGJlZm9yZSBzY2FuIGFib3J0CiAgKiBAc3RhdHVzOgkJCWVudW0gaXdsX3NjYW5fb2ZmbG9hZF9jb21wbGVhdGVfc3RhdHVzCisgKiBAZWJzX3N0YXR1czogbGFzdCBFQlMgc3RhdHVzLCBzZWUgSVdMX1NDQU5fRUJTXyoKICAqLwogc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfY29tcGxldGUgewogCXU4IGxhc3Rfc2NoZWR1bGVfbGluZTsKIAl1OCBsYXN0X3NjaGVkdWxlX2l0ZXJhdGlvbjsKIAl1OCBzdGF0dXM7Ci0JdTggcmVzZXJ2ZWQ7CisJdTggZWJzX3N0YXR1czsKIH0gX19wYWNrZWQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXN0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXN0YS5oCmluZGV4IGQ2MzY0NzguLjM5Y2ViZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc3RhLmgKQEAgLTI1NSwyMiArMjU1LDE5IEBACiB9IF9fcGFja2VkOwogCiAvKioKLSAqIHN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y1IC0gQWRkL21vZGlmeSBhIHN0YXRpb24gaW4gdGhlIGZ3J3Mgc3RhIHRhYmxlLgorICogc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgLSBBZGQvbW9kaWZ5IGEgc3RhdGlvbiBpbiB0aGUgZncncyBzdGEgdGFibGUuCiAgKiAoIFJFUExZX0FERF9TVEEgPSAweDE4ICkKICAqIEBhZGRfbW9kaWZ5OiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbgotICogQHVuaWNhc3RfdHhfa2V5X2lkOiB1bmljYXN0IHR4IGtleSBpZC4gUmVsZXZhbnQgb25seSB3aGVuIHVuaWNhc3Qga2V5IHNlbnQKLSAqIEBtdWx0aWNhc3RfdHhfa2V5X2lkOiBtdWx0aWNhc3QgdHgga2V5IGlkLiBSZWxldmFudCBvbmx5IHdoZW4gbXVsdGljYXN0IGtleQotICoJc2VudAorICogQGF3YWtlX2FjczoKKyAqIEB0aWRfZGlzYWJsZV90eDogaXMgdGlkIEJJVCh0aWQpIGVuYWJsZWQgZm9yIFR4LiBDbGVhciBCSVQoeCkgdG8gZW5hYmxlCisgKglBTVBEVSBmb3IgdGlkIHguIFNldCAlU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byBjaGFuZ2UgdGhpcyBmaWVsZC4KICAqIEBtYWNfaWRfbl9jb2xvcjogdGhlIE1hYyBjb250ZXh0IHRoaXMgc3RhdGlvbiBiZWxvbmdzIHRvCiAgKiBAYWRkcltFVEhfQUxFTl06IHN0YXRpb24ncyBNQUMgYWRkcmVzcwogICogQHN0YV9pZDogaW5kZXggb2Ygc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUKICAqIEBtb2RpZnlfbWFzazogU1RBX01PRElGWV8qLCBzZWxlY3RzIHdoaWNoIHBhcmFtZXRlcnMgdG8gbW9kaWZ5IHZzLiBsZWF2ZQogICoJYWxvbmUuIDEgLSBtb2RpZnksIDAgLSBkb24ndCBjaGFuZ2UuCi0gKiBAa2V5OiBsb29rIGF0ICVpd2xfbXZtX2tleWluZm8KICAqIEBzdGF0aW9uX2ZsYWdzOiBsb29rIGF0ICVpd2xfc3RhX2ZsYWdzCiAgKiBAc3RhdGlvbl9mbGFnc19tc2s6IHdoYXQgb2YgJXN0YXRpb25fZmxhZ3MgaGF2ZSBjaGFuZ2VkCi0gKiBAdGlkX2Rpc2FibGVfdHg6IGlzIHRpZCBCSVQodGlkKSBlbmFibGVkIGZvciBUeC4gQ2xlYXIgQklUKHgpIHRvIGVuYWJsZQotICoJQU1QRFUgZm9yIHRpZCB4LiBTZXQgJVNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gY2hhbmdlIHRoaXMgZmllbGQuCiAgKiBAYWRkX2ltbWVkaWF0ZV9iYV90aWQ6IHRpZCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0IChSeCkKICAqCVNldCAlU1RBX01PRElGWV9BRERfQkFfVElEIHRvIHVzZSB0aGlzIGZpZWxkLCBhbmQgYWxzbyBzZXQKICAqCWFkZF9pbW1lZGlhdGVfYmFfc3NuLgpAQCAtMjk0LDQwICsyOTEsNyBAQAogICogQUREX1NUQSBzZXRzIHVwIHRoZSB0YWJsZSBlbnRyeSBmb3Igb25lIHN0YXRpb24sIGVpdGhlciBjcmVhdGluZyBhIG5ldwogICogZW50cnksIG9yIG1vZGlmeWluZyBhIHByZS1leGlzdGluZyBvbmUuCiAgKi8KLXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y1IHsKLQl1OCBhZGRfbW9kaWZ5OwotCXU4IHVuaWNhc3RfdHhfa2V5X2lkOwotCXU4IG11bHRpY2FzdF90eF9rZXlfaWQ7Ci0JdTggcmVzZXJ2ZWQxOwotCV9fbGUzMiBtYWNfaWRfbl9jb2xvcjsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKLQlfX2xlMTYgcmVzZXJ2ZWQyOwotCXU4IHN0YV9pZDsKLQl1OCBtb2RpZnlfbWFzazsKLQlfX2xlMTYgcmVzZXJ2ZWQzOwotCXN0cnVjdCBpd2xfbXZtX2tleWluZm8ga2V5OwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsKLQlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7Ci0JX19sZTE2IHJlc2VydmVkNDsKLQl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKLQl1OCByZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKLQlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0JX19sZTE2IHNsZWVwX3R4X2NvdW50OwotCV9fbGUxNiBzbGVlcF9zdGF0ZV9mbGFnczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTE2IGJlYW1mb3JtX2ZsYWdzOwotCV9fbGUzMiB0ZmRfcXVldWVfbXNrOwotfSBfX3BhY2tlZDsgLyogQUREX1NUQV9DTURfQVBJX1NfVkVSXzUgKi8KLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZF92NyAtIEFkZCAvIG1vZGlmeSBhIHN0YXRpb24KLSAqIFZFUl83IG9mIHRoaXMgY29tbWFuZCBpcyBxdWl0ZSBzaW1pbGFyIHRvIFZFUl81IGV4Y2VwdAotICogZXhjbHVzaW9uIG9mIGFsbCBmaWVsZHMgcmVsYXRlZCB0byB0aGUgc2VjdXJpdHkga2V5IGluc3RhbGxhdGlvbi4KLSAqIEl0IG9ubHkgZGlmZmVycyBmcm9tIFZFUl82IGJ5IHRoZSAiYXdha2VfYWNzIiBmaWVsZCB0aGF0IGlzCi0gKiByZXNlcnZlZCBhbmQgaWdub3JlZCBpbiBWRVJfNi4KLSAqLwotc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgeworc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgewogCXU4IGFkZF9tb2RpZnk7CiAJdTggYXdha2VfYWNzOwogCV9fbGUxNiB0aWRfZGlzYWJsZV90eDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXR4LmgKaW5kZXggOGUxMjJmMy4uNmNjNWY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXR4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXR4LmgKQEAgLTQ4Miw3ICs0ODIsOCBAQAogCXU4IHBhX2ludGVnX3Jlc19iWzNdOwogCXU4IHBhX2ludGVnX3Jlc19jWzNdOwogCV9fbGUxNiBtZWFzdXJlbWVudF9yZXFfaWQ7Ci0JX19sZTE2IHJlc2VydmVkOworCXU4IHJlZHVjZWRfdHBjOworCXU4IHJlc2VydmVkOwogCiAJX19sZTMyIHRmZF9pbmZvOwogCV9fbGUxNiBzZXFfY3RsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGkuaAppbmRleCA2ZTc1YjUyLi4zMDlhOWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGkuaApAQCAtNzEsNiArNzEsNyBAQAogI2luY2x1ZGUgImZ3LWFwaS1wb3dlci5oIgogI2luY2x1ZGUgImZ3LWFwaS1kMy5oIgogI2luY2x1ZGUgImZ3LWFwaS1jb2V4LmgiCisjaW5jbHVkZSAiZnctYXBpLXNjYW4uaCIKIAogLyogbWF4aW1hbCBudW1iZXIgb2YgVHggcXVldWVzIGluIGFueSBwbGF0Zm9ybSAqLwogI2RlZmluZSBJV0xfTVZNX01BWF9RVUVVRVMJMjAKQEAgLTYwNCw1MiArNjA1LDcgQEAKIAlURV9WMV9OT1RJRl9JTlRFUk5BTF9GUkFHX0VORCA9IEJJVCg3KSwKIH07IC8qIE1BQ19FVkVOVF9BQ1RJT05fQVBJX0VfVkVSXzIgKi8KIAotCi0vKioKLSAqIHN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfYXBpX3YxIC0gY29uZmlndXJpbmcgVGltZSBFdmVudHMKLSAqIHdpdGggc3RydWN0IE1BQ19USU1FX0VWRU5UX0RBVEFfQVBJX1NfVkVSXzEgKHNlZSBhbHNvCi0gKiB3aXRoIHZlcnNpb24gMi4gZGV0ZXJtaW5lZCBieSBJV0xfVUNPREVfVExWX0ZMQUdTKQotICogKCBUSU1FX0VWRU5UX0NNRCA9IDB4MjkgKQotICogQGlkX2FuZF9jb2xvcjogSUQgYW5kIGNvbG9yIG9mIHRoZSByZWxldmFudCBNQUMKLSAqIEBhY3Rpb246IGFjdGlvbiB0byBwZXJmb3JtLCBvbmUgb2YgRldfQ1RYVF9BQ1RJT05fKgotICogQGlkOiB0aGlzIGZpZWxkIGhhcyB0d28gbWVhbmluZ3MsIGRlcGVuZGluZyBvbiB0aGUgYWN0aW9uOgotICoJSWYgdGhlIGFjdGlvbiBpcyBBREQsIHRoZW4gaXQgbWVhbnMgdGhlIHR5cGUgb2YgZXZlbnQgdG8gYWRkLgotICoJRm9yIGFsbCBvdGhlciBhY3Rpb25zIGl0IGlzIHRoZSB1bmlxdWUgZXZlbnQgSUQgYXNzaWduZWQgd2hlbiB0aGUKLSAqCWV2ZW50IHdhcyBhZGRlZCBieSB0aGUgRlcuCi0gKiBAYXBwbHlfdGltZTogV2hlbiB0byBzdGFydCB0aGUgVGltZSBFdmVudCAoaW4gR1AyKQotICogQG1heF9kZWxheTogbWF4aW11bSBkZWxheSB0byBldmVudCdzIHN0YXJ0IChhcHBseSB0aW1lKSwgaW4gVFUKLSAqIEBkZXBlbmRzX29uOiB0aGUgdW5pcXVlIElEIG9mIHRoZSBldmVudCB3ZSBkZXBlbmQgb24gKGlmIGFueSkKLSAqIEBpbnRlcnZhbDogaW50ZXJ2YWwgYmV0d2VlbiByZXBldGl0aW9ucywgaW4gVFUKLSAqIEBpbnRlcnZhbF9yZWNpcHJvY2FsOiAyXjMyIC8gaW50ZXJ2YWwKLSAqIEBkdXJhdGlvbjogZHVyYXRpb24gb2YgZXZlbnQgaW4gVFUKLSAqIEByZXBlYXQ6IGhvdyBtYW55IHJlcGV0aXRpb25zIHRvIGRvLCBjYW4gYmUgVEVfUkVQRUFUX0VORExFU1MKLSAqIEBkZXBfcG9saWN5OiBvbmUgb2YgVEVfVjFfSU5ERVBFTkRFTlQsIFRFX1YxX0RFUF9PVEhFUiwgVEVfVjFfREVQX1RTRgotICoJYW5kIFRFX1YxX0VWRU5UX1NPQ0lPUEFUSElDCi0gKiBAaXNfcHJlc2VudDogMCBvciAxLCBhcmUgd2UgcHJlc2VudCBvciBhYnNlbnQgZHVyaW5nIHRoZSBUaW1lIEV2ZW50Ci0gKiBAbWF4X2ZyYWdzOiBtYXhpbWFsIG51bWJlciBvZiBmcmFnbWVudHMgdGhlIFRpbWUgRXZlbnQgY2FuIGJlIGRpdmlkZWQgdG8KLSAqIEBub3RpZnk6IG5vdGlmaWNhdGlvbnMgdXNpbmcgVEVfVjFfTk9USUZfKiAod2hvbSB0byBub3RpZnkgd2hlbikKLSAqLwotc3RydWN0IGl3bF90aW1lX2V2ZW50X2NtZF92MSB7Ci0JLyogQ09NTU9OX0lOREVYX0hEUl9BUElfU19WRVJfMSAqLwotCV9fbGUzMiBpZF9hbmRfY29sb3I7Ci0JX19sZTMyIGFjdGlvbjsKLQlfX2xlMzIgaWQ7Ci0JLyogTUFDX1RJTUVfRVZFTlRfREFUQV9BUElfU19WRVJfMSAqLwotCV9fbGUzMiBhcHBseV90aW1lOwotCV9fbGUzMiBtYXhfZGVsYXk7Ci0JX19sZTMyIGRlcF9wb2xpY3k7Ci0JX19sZTMyIGRlcGVuZHNfb247Ci0JX19sZTMyIGlzX3ByZXNlbnQ7Ci0JX19sZTMyIG1heF9mcmFnczsKLQlfX2xlMzIgaW50ZXJ2YWw7Ci0JX19sZTMyIGludGVydmFsX3JlY2lwcm9jYWw7Ci0JX19sZTMyIGR1cmF0aW9uOwotCV9fbGUzMiByZXBlYXQ7Ci0JX19sZTMyIG5vdGlmeTsKLX0gX19wYWNrZWQ7IC8qIE1BQ19USU1FX0VWRU5UX0NNRF9BUElfU19WRVJfMSAqLwotCi0KLS8qIFRpbWUgZXZlbnQgLSBkZWZpbmVzIGZvciBjb21tYW5kIEFQSSB2MiAqLworLyogVGltZSBldmVudCAtIGRlZmluZXMgZm9yIGNvbW1hbmQgQVBJICovCiAKIC8qCiAgKiBAVEVfVjJfRlJBR19OT05FOiBmcmFnbWVudGF0aW9uIG9mIHRoZSB0aW1lIGV2ZW50IGlzIE5PVCBhbGxvd2VkLgpAQCAtNjgwLDcgKzYzNiw3IEBACiAjZGVmaW5lIFRFX1YyX1BMQUNFTUVOVF9QT1MJMTIKICNkZWZpbmUgVEVfVjJfQUJTRU5DRV9QT1MJMTUKIAotLyogVGltZSBldmVudCBwb2xpY3kgdmFsdWVzIChmb3IgdGltZSBldmVudCBjbWQgYXBpIHYyKQorLyogVGltZSBldmVudCBwb2xpY3kgdmFsdWVzCiAgKiBBIG5vdGlmaWNhdGlvbiAoYm90aCBldmVudCBhbmQgZnJhZ21lbnQpIGluY2x1ZGVzIGEgc3RhdHVzIGluZGljYXRpbmcgd2VhdGhlcgogICogdGhlIEZXIHdhcyBhYmxlIHRvIHNjaGVkdWxlIHRoZSBldmVudCBvciBub3QuIEZvciBmcmFnbWVudCBzdGFydC9lbmQKICAqIG5vdGlmaWNhdGlvbiB0aGUgc3RhdHVzIGlzIGFsd2F5cyBzdWNjZXNzLiBUaGVyZSBpcyBubyBzdGFydC9lbmQgZnJhZ21lbnQKQEAgLTcyNyw3ICs2ODMsNyBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kX2FwaV92MiAtIGNvbmZpZ3VyaW5nIFRpbWUgRXZlbnRzCisgKiBzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kX2FwaSAtIGNvbmZpZ3VyaW5nIFRpbWUgRXZlbnRzCiAgKiB3aXRoIHN0cnVjdCBNQUNfVElNRV9FVkVOVF9EQVRBX0FQSV9TX1ZFUl8yIChzZWUgYWxzbwogICogd2l0aCB2ZXJzaW9uIDEuIGRldGVybWluZWQgYnkgSVdMX1VDT0RFX1RMVl9GTEFHUykKICAqICggVElNRV9FVkVOVF9DTUQgPSAweDI5ICkKQEAgLTc1MCw3ICs3MDYsNyBAQAogICoJVEVfRVZFTlRfU09DSU9QQVRISUMKICAqCXVzaW5nIFRFX0FCU0VOQ0UgYW5kIHVzaW5nIFRFX05PVElGXyoKICAqLwotc3RydWN0IGl3bF90aW1lX2V2ZW50X2NtZF92MiB7CitzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kIHsKIAkvKiBDT01NT05fSU5ERVhfSERSX0FQSV9TX1ZFUl8xICovCiAJX19sZTMyIGlkX2FuZF9jb2xvcjsKIAlfX2xlMzIgYWN0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LmMKaW5kZXggN2NlMjAwNi4uODgzZTcwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy5jCkBAIC05OSw3ICs5OSw3IEBACiAJfTsKIAogCUlXTF9ERUJVR19GVyhtdm0sICJzZWxlY3QgdmFsaWQgdHggYW50OiAldVxuIiwgdmFsaWRfdHhfYW50KTsKLQlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBUWF9BTlRfQ09ORklHVVJBVElPTl9DTUQsIENNRF9TWU5DLAorCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRYX0FOVF9DT05GSUdVUkFUSU9OX0NNRCwgMCwKIAkJCQkgICAgc2l6ZW9mKHR4X2FudF9jbWQpLCAmdHhfYW50X2NtZCk7CiB9CiAKQEAgLTEzNyw2ICsxMzcsOCBAQAogCQlhbGl2ZV9kYXRhLT5zY2RfYmFzZV9hZGRyID0gbGUzMl90b19jcHUocGFsaXZlMi0+c2NkX2Jhc2VfcHRyKTsKIAkJbXZtLT51bWFjX2Vycm9yX2V2ZW50X3RhYmxlID0KIAkJCWxlMzJfdG9fY3B1KHBhbGl2ZTItPmVycm9yX2luZm9fYWRkcik7CisJCW12bS0+c2Zfc3BhY2UuYWRkciA9IGxlMzJfdG9fY3B1KHBhbGl2ZTItPnN0X2Z3cmRfYWRkcik7CisJCW12bS0+c2Zfc3BhY2Uuc2l6ZSA9IGxlMzJfdG9fY3B1KHBhbGl2ZTItPnN0X2Z3cmRfc2l6ZSk7CiAKIAkJYWxpdmVfZGF0YS0+dmFsaWQgPSBsZTE2X3RvX2NwdShwYWxpdmUyLT5zdGF0dXMpID09CiAJCQkJICAgIElXTF9BTElWRV9TVEFUVVNfT0s7CkBAIC0xODAsNiArMTgyLDcgQEAKIAlpbnQgcmV0LCBpOwogCWVudW0gaXdsX3Vjb2RlX3R5cGUgb2xkX3R5cGUgPSBtdm0tPmN1cl91Y29kZTsKIAlzdGF0aWMgY29uc3QgdTggYWxpdmVfY21kW10gPSB7IE1WTV9BTElWRSB9OworCXN0cnVjdCBpd2xfc2ZfcmVnaW9uIHN0X2Z3cmRfc3BhY2U7CiAKIAlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLCB1Y29kZV90eXBlKTsKIAlpZiAoV0FSTl9PTighZncpKQpAQCAtMjE1LDYgKzIxOCwxNCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwkvKgorCSAqIHVwZGF0ZSB0aGUgc2RpbyBhbGxvY2F0aW9uIGFjY29yZGluZyB0byB0aGUgcG9pbnRlciB3ZSBnZXQgaW4gdGhlCisJICogYWxpdmUgbm90aWZpY2F0aW9uLgorCSAqLworCXN0X2Z3cmRfc3BhY2UuYWRkciA9IG12bS0+c2Zfc3BhY2UuYWRkcjsKKwlzdF9md3JkX3NwYWNlLnNpemUgPSBtdm0tPnNmX3NwYWNlLnNpemU7CisJcmV0ID0gaXdsX3RyYW5zX3VwZGF0ZV9zZihtdm0tPnRyYW5zLCAmc3RfZndyZF9zcGFjZSk7CisKIAlpd2xfdHJhbnNfZndfYWxpdmUobXZtLT50cmFucywgYWxpdmVfZGF0YS5zY2RfYmFzZV9hZGRyKTsKIAogCS8qCkBAIC0yNTYsNyArMjY3LDcgQEAKIAlJV0xfREVCVUdfSU5GTyhtdm0sICJTZW5kaW5nIFBoeSBDRkcgY29tbWFuZDogMHgleFxuIiwKIAkJICAgICAgIHBoeV9jZmdfY21kLnBoeV9jZmcpOwogCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgUEhZX0NPTkZJR1VSQVRJT05fQ01ELCBDTURfU1lOQywKKwlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBQSFlfQ09ORklHVVJBVElPTl9DTUQsIDAsCiAJCQkJICAgIHNpemVvZihwaHlfY2ZnX2NtZCksICZwaHlfY2ZnX2NtZCk7CiB9CiAKQEAgLTI4OCwxNCArMjk5LDE0IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JcmV0ID0gaXdsX3NlbmRfYnRfcHJpb190YmwobXZtKTsKKwlyZXQgPSBpd2xfc2VuZF9idF9pbml0X2NvbmYobXZtKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwogCiAJLyogUmVhZCB0aGUgTlZNIG9ubHkgYXQgZHJpdmVyIGxvYWQgdGltZSwgbm8gbmVlZCB0byBkbyB0aGlzIHR3aWNlICovCiAJaWYgKHJlYWRfbnZtKSB7CiAJCS8qIFJlYWQgbnZtICovCi0JCXJldCA9IGl3bF9udm1faW5pdChtdm0pOworCQlyZXQgPSBpd2xfbnZtX2luaXQobXZtLCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcmVhZCBOVk06ICVkXG4iLCByZXQpOwogCQkJZ290byBlcnJvcjsKQEAgLTMwMyw3ICszMTQsNyBAQAogCX0KIAogCS8qIEluIGNhc2Ugd2UgcmVhZCB0aGUgTlZNIGZyb20gZXh0ZXJuYWwgZmlsZSwgbG9hZCBpdCB0byB0aGUgTklDICovCi0JaWYgKGl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZSkKKwlpZiAobXZtLT5udm1fZmlsZV9uYW1lKQogCQlpd2xfbXZtX2xvYWRfbnZtX3RvX25pYyhtdm0pOwogCiAJcmV0ID0gaXdsX252bV9jaGVja192ZXJzaW9uKG12bS0+bnZtX2RhdGEsIG12bS0+dHJhbnMpOwpAQCAtNDI0LDEwICs0MzUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSBpd2xfc2VuZF9idF9wcmlvX3RibChtdm0pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KIAlyZXQgPSBpd2xfc2VuZF9idF9pbml0X2NvbmYobXZtKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwpAQCAtNDY4LDEyICs0NzUsNiBAQAogCS8qIEluaXRpYWxpemUgdHggYmFja29mZnMgdG8gdGhlIG1pbmltYWwgcG9zc2libGUgKi8KIAlpd2xfbXZtX3R0X3R4X2JhY2tvZmYobXZtLCAwKTsKIAotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX1BNX0NNRF9TVVBQT1JUKSkgewotCQlyZXQgPSBpd2xfcG93ZXJfbGVnYWN5X3NldF9jYW1fbW9kZShtdm0pOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcjsKLQl9Ci0KIAlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9kZXZpY2UobXZtKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYy1jdHh0LmMKaW5kZXggOWNjZWMxMC4uOGI1MzAyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tYWMtY3R4dC5jCkBAIC02NjcsMTIgKzY2Nyw5IEBACiAJaWYgKHZpZi0+YnNzX2NvbmYucW9zKQogCQljbWQtPnFvc19mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfUU9TX0ZMR19VUERBVEVfRURDQSk7CiAKLQkvKiBEb24ndCB1c2UgY3RzIHRvIHNlbGYgYXMgdGhlIGZ3IGRvZXNuJ3Qgc3VwcG9ydCBpdCBjdXJyZW50bHkuICovCiAJaWYgKHZpZi0+YnNzX2NvbmYudXNlX2N0c19wcm90KSB7CiAJCWNtZC0+cHJvdGVjdGlvbl9mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfUFJPVF9GTEdfVEdHX1BST1RFQ1QpOwotCQlpZiAoSVdMX1VDT0RFX0FQSShtdm0tPmZ3LT51Y29kZV92ZXIpID49IDgpCi0JCQljbWQtPnByb3RlY3Rpb25fZmxhZ3MgfD0KLQkJCQljcHVfdG9fbGUzMihNQUNfUFJPVF9GTEdfU0VMRl9DVFNfRU4pOworCQljbWQtPnByb3RlY3Rpb25fZmxhZ3MgfD0gY3B1X3RvX2xlMzIoTUFDX1BST1RfRkxHX1NFTEZfQ1RTX0VOKTsKIAl9CiAJSVdMX0RFQlVHX1JBVEUobXZtLCAidXNlX2N0c19wcm90ICVkLCBodF9vcGVyYXRpb25fbW9kZSAlZFxuIiwKIAkJICAgICAgIHZpZi0+YnNzX2NvbmYudXNlX2N0c19wcm90LApAQCAtNjg4LDcgKzY4NSw3IEBACiBzdGF0aWMgaW50IGl3bF9tdm1fbWFjX2N0eHRfc2VuZF9jbWQoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICAgIHN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgKmNtZCkKIHsKLQlpbnQgcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNQUNfQ09OVEVYVF9DTUQsIENNRF9TWU5DLAorCWludCByZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIE1BQ19DT05URVhUX0NNRCwgMCwKIAkJCQkgICAgICAgc2l6ZW9mKCpjbWQpLCBjbWQpOwogCWlmIChyZXQpCiAJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHNlbmQgTUFDIGNvbnRleHQgKGFjdGlvbjolZCk6ICVkXG4iLApAQCAtNjk2LDE5ICs2OTMsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRmlsbCB0aGUgc3BlY2lmaWMgZGF0YSBmb3IgbWFjIGNvbnRleHQgb2YgdHlwZSBzdGF0aW9uIG9yIHAycCBjbGllbnQKLSAqLwotc3RhdGljIHZvaWQgaXdsX212bV9tYWNfY3R4dF9jbWRfZmlsbF9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQkgIHN0cnVjdCBpd2xfbWFjX2RhdGFfc3RhICpjdHh0X3N0YSwKLQkJCQkJICBib29sIGZvcmNlX2Fzc29jX29mZikKK3N0YXRpYyBpbnQgaXdsX212bV9tYWNfY3R4dF9jbWRfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgIHUzMiBhY3Rpb24sIGJvb2wgZm9yY2VfYXNzb2Nfb2ZmKQogeworCXN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgY21kID0ge307CisJc3RydWN0IGl3bF9tYWNfZGF0YV9zdGEgKmN0eHRfc3RhOworCisJV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CisKKwkvKiBGaWxsIHRoZSBjb21tb24gZGF0YSBmb3IgYWxsIG1hYyBjb250ZXh0IHR5cGVzICovCisJaXdsX212bV9tYWNfY3R4dF9jbWRfY29tbW9uKG12bSwgdmlmLCAmY21kLCBhY3Rpb24pOworCisJaWYgKHZpZi0+cDJwKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfcDJwX25vYV9hdHRyICpub2EgPQorCQkJJnZpZi0+YnNzX2NvbmYucDJwX25vYV9hdHRyOworCisJCWNtZC5wMnBfc3RhLmN0d2luID0gY3B1X3RvX2xlMzIobm9hLT5vcHBwc19jdHdpbmRvdyAmCisJCQkJCUlFRUU4MDIxMV9QMlBfT1BQUFNfQ1RXSU5ET1dfTUFTSyk7CisJCWN0eHRfc3RhID0gJmNtZC5wMnBfc3RhLnN0YTsKKwl9IGVsc2UgeworCQljdHh0X3N0YSA9ICZjbWQuc3RhOworCX0KKwogCS8qIFdlIG5lZWQgdGhlIGR0aW1fcGVyaW9kIHRvIHNldCB0aGUgTUFDIGFzIGFzc29jaWF0ZWQgKi8KIAlpZiAodmlmLT5ic3NfY29uZi5hc3NvYyAmJiB2aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kICYmCiAJICAgICFmb3JjZV9hc3NvY19vZmYpIHsKIAkJdTMyIGR0aW1fb2ZmczsKIAorCQkvKiBBbGxvdyBiZWFjb25zIHRvIHBhc3MgdGhyb3VnaCBhcyBsb25nIGFzIHdlIGFyZSBub3QKKwkJICogYXNzb2NpYXRlZCwgb3Igd2UgZG8gbm90IGhhdmUgZHRpbSBwZXJpb2QgaW5mb3JtYXRpb24uCisJCSAqLworCQljbWQuZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKKwogCQkvKgogCQkgKiBUaGUgRFRJTSBjb3VudCBjb3VudHMgZG93biwgc28gd2hlbiBpdCBpcyBOIHRoYXQgbWVhbnMgTgogCQkgKiBtb3JlIGJlYWNvbiBpbnRlcnZhbHMgaGFwcGVuIHVudGlsIHRoZSBEVElNIFRCVFQuIFRoZXJlZm9yZQpAQCAtNzU1LDUxICs3NzIsNiBAQAogCiAJY3R4dF9zdGEtPmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTMyKG12bS0+aHctPmNvbmYubGlzdGVuX2ludGVydmFsKTsKIAljdHh0X3N0YS0+YXNzb2NfaWQgPSBjcHVfdG9fbGUzMih2aWYtPmJzc19jb25mLmFpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9tYWNfY3R4dF9jbWRfc3RhdGlvbihzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQl1MzIgYWN0aW9uKQotewotCXN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgY21kID0ge307Ci0KLQlXQVJOX09OKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8IHZpZi0+cDJwKTsKLQotCS8qIEZpbGwgdGhlIGNvbW1vbiBkYXRhIGZvciBhbGwgbWFjIGNvbnRleHQgdHlwZXMgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9jb21tb24obXZtLCB2aWYsICZjbWQsIGFjdGlvbik7Ci0KLQkvKiBBbGxvdyBiZWFjb25zIHRvIHBhc3MgdGhyb3VnaCBhcyBsb25nIGFzIHdlIGFyZSBub3QgYXNzb2NpYXRlZCxvciB3ZQotCSAqIGRvIG5vdCBoYXZlIGR0aW0gcGVyaW9kIGluZm9ybWF0aW9uICovCi0JaWYgKCF2aWYtPmJzc19jb25mLmFzc29jIHx8ICF2aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kKQotCQljbWQuZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKLQllbHNlCi0JCWNtZC5maWx0ZXJfZmxhZ3MgJj0gfmNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKLQotCS8qIEZpbGwgdGhlIGRhdGEgc3BlY2lmaWMgZm9yIHN0YXRpb24gbW9kZSAqLwotCWl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfc3RhKG12bSwgdmlmLCAmY21kLnN0YSwKLQkJCQkgICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKLQotCXJldHVybiBpd2xfbXZtX21hY19jdHh0X3NlbmRfY21kKG12bSwgJmNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9tYWNfY3R4dF9jbWRfcDJwX2NsaWVudChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCQkgICB1MzIgYWN0aW9uKQotewotCXN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgY21kID0ge307Ci0Jc3RydWN0IGllZWU4MDIxMV9wMnBfbm9hX2F0dHIgKm5vYSA9ICZ2aWYtPmJzc19jb25mLnAycF9ub2FfYXR0cjsKLQotCVdBUk5fT04odmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwgIXZpZi0+cDJwKTsKLQotCS8qIEZpbGwgdGhlIGNvbW1vbiBkYXRhIGZvciBhbGwgbWFjIGNvbnRleHQgdHlwZXMgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9jb21tb24obXZtLCB2aWYsICZjbWQsIGFjdGlvbik7Ci0KLQkvKiBGaWxsIHRoZSBkYXRhIHNwZWNpZmljIGZvciBzdGF0aW9uIG1vZGUgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX3N0YShtdm0sIHZpZiwgJmNtZC5wMnBfc3RhLnN0YSwKLQkJCQkgICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKLQotCWNtZC5wMnBfc3RhLmN0d2luID0gY3B1X3RvX2xlMzIobm9hLT5vcHBwc19jdHdpbmRvdyAmCi0JCQkJCUlFRUU4MDIxMV9QMlBfT1BQUFNfQ1RXSU5ET1dfTUFTSyk7CiAKIAlyZXR1cm4gaXdsX212bV9tYWNfY3R4dF9zZW5kX2NtZChtdm0sICZjbWQpOwogfQpAQCAtMTEzNywxNiArMTEwOSwxMiBAQAogfQogCiBzdGF0aWMgaW50IGl3bF9tdm1fbWFjX2N0eF9zZW5kKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJdTMyIGFjdGlvbikKKwkJCQl1MzIgYWN0aW9uLCBib29sIGZvcmNlX2Fzc29jX29mZikKIHsKIAlzd2l0Y2ggKHZpZi0+dHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaWYgKCF2aWYtPnAycCkKLQkJCXJldHVybiBpd2xfbXZtX21hY19jdHh0X2NtZF9zdGF0aW9uKG12bSwgdmlmLAotCQkJCQkJCSAgICBhY3Rpb24pOwotCQllbHNlCi0JCQlyZXR1cm4gaXdsX212bV9tYWNfY3R4dF9jbWRfcDJwX2NsaWVudChtdm0sIHZpZiwKLQkJCQkJCQkgICAgICAgYWN0aW9uKTsKKwkJcmV0dXJuIGl3bF9tdm1fbWFjX2N0eHRfY21kX3N0YShtdm0sIHZpZiwgYWN0aW9uLAorCQkJCQkJZm9yY2VfYXNzb2Nfb2ZmKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJaWYgKCF2aWYtPnAycCkKQEAgLTExNzYsNyArMTE0NCw4IEBACiAJCSAgICAgIHZpZi0+YWRkciwgaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXQgPSBpd2xfbXZtX21hY19jdHhfc2VuZChtdm0sIHZpZiwgRldfQ1RYVF9BQ1RJT05fQUREKTsKKwlyZXQgPSBpd2xfbXZtX21hY19jdHhfc2VuZChtdm0sIHZpZiwgRldfQ1RYVF9BQ1RJT05fQURELAorCQkJCSAgIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTExODcsNyArMTE1Niw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK2ludCBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgYm9vbCBmb3JjZV9hc3NvY19vZmYpCiB7CiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAKQEAgLTExOTUsNyArMTE2NSw4IEBACiAJCSAgICAgIHZpZi0+YWRkciwgaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXR1cm4gaXdsX212bV9tYWNfY3R4X3NlbmQobXZtLCB2aWYsIEZXX0NUWFRfQUNUSU9OX01PRElGWSk7CisJcmV0dXJuIGl3bF9tdm1fbWFjX2N0eF9zZW5kKG12bSwgdmlmLCBGV19DVFhUX0FDVElPTl9NT0RJRlksCisJCQkJICAgIGZvcmNlX2Fzc29jX29mZik7CiB9CiAKIGludCBpd2xfbXZtX21hY19jdHh0X3JlbW92ZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQpAQCAtMTIxNCw3ICsxMTg1LDcgQEAKIAkJCQkJCQkgICBtdm12aWYtPmNvbG9yKSk7CiAJY21kLmFjdGlvbiA9IGNwdV90b19sZTMyKEZXX0NUWFRfQUNUSU9OX1JFTU9WRSk7CiAKLQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIE1BQ19DT05URVhUX0NNRCwgQ01EX1NZTkMsCisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNQUNfQ09OVEVYVF9DTUQsIDAsCiAJCQkJICAgc2l6ZW9mKGNtZCksICZjbWQpOwogCWlmIChyZXQpIHsKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcmVtb3ZlIE1BQyBjb250ZXh0OiAlZFxuIiwgcmV0KTsKQEAgLTEyNDAsMTEgKzEyMTEsMjMgQEAKIAl1MzIgcmF0ZSBfX21heWJlX3VudXNlZCA9CiAJCWxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuaW5pdGlhbF9yYXRlKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOworCiAJSVdMX0RFQlVHX1JYKG12bSwgImJlYWNvbiBzdGF0dXMgJSN4IHJldHJpZXM6JWQgdHNmOjB4JTE2bGxYIHJhdGU6JWRcbiIsCiAJCSAgICAgc3RhdHVzICYgVFhfU1RBVFVTX01TSywKIAkJICAgICBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCiAJCSAgICAgbGU2NF90b19jcHUoYmVhY29uLT50c2YpLAogCQkgICAgIHJhdGUpOworCisJaWYgKHVubGlrZWx5KG12bS0+Y3NhX3ZpZiAmJiBtdm0tPmNzYV92aWYtPmNzYV9hY3RpdmUpKSB7CisJCWlmICghaWVlZTgwMjExX2NzYV9pc19jb21wbGV0ZShtdm0tPmNzYV92aWYpKSB7CisJCQlpd2xfbXZtX21hY19jdHh0X2JlYWNvbl9jaGFuZ2VkKG12bSwgbXZtLT5jc2FfdmlmKTsKKwkJfSBlbHNlIHsKKwkJCWllZWU4MDIxMV9jc2FfZmluaXNoKG12bS0+Y3NhX3ZpZik7CisJCQltdm0tPmNzYV92aWYgPSBOVUxMOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tYWM4MDIxMS5jCmluZGV4IDg3MzVlZjEuLjcyMTVmNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjODAyMTEuYwpAQCAtMjk1LDcgKzI5NSw5IEBACiAJICAgICFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKQogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOwogCi0JaWYgKDAgJiYgbXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVCkgeworCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19VQVBTRF9TVVBQT1JUICYmCisJICAgIElXTF9VQ09ERV9BUEkobXZtLT5mdy0+dWNvZGVfdmVyKSA+PSA5ICYmCisJICAgICFpd2x3aWZpX21vZF9wYXJhbXMudWFwc2RfZGlzYWJsZSkgewogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX1VBUFNEOwogCQlody0+dWFwc2RfcXVldWVzID0gSVdMX1VBUFNEX0FDX0lORk87CiAJCWh3LT51YXBzZF9tYXhfc3BfbGVuID0gSVdMX1VBUFNEX01BWF9TUDsKQEAgLTMwOSwxMSArMzExLDggQEAKIAkJQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHwKIAkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CiAJCUJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKLQkJQklUKE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpOwotCi0JLyogSUJTUyBoYXMgYnVncyBpbiBvbGRlciB2ZXJzaW9ucyAqLwotCWlmIChJV0xfVUNPREVfQVBJKG12bS0+ZnctPnVjb2RlX3ZlcikgPj0gOCkKLQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKKwkJQklUKE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpIHwKKwkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKIAogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19JQlNTX1JTTjsKIAlody0+d2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHIHwKQEAgLTMyMiw2ICszMjEsOSBAQAogCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19HT19VQVBTRCkKIAkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0FQX1VBUFNEOwogCisJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfQ1NBX0ZMT1cpCisJCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfQ0hBTk5FTF9TV0lUQ0g7CisKIAlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bF9tdm1faWZhY2VfY29tYmluYXRpb25zOwogCWh3LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPQogCQlBUlJBWV9TSVpFKGl3bF9tdm1faWZhY2VfY29tYmluYXRpb25zKTsKQEAgLTM2NSwxNCArMzY3LDExIEBACiAJZWxzZQogCQlody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfU0NIRURfU0NBTikgewotCQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTjsKLQkJaHctPndpcGh5LT5tYXhfc2NoZWRfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7Ci0JCWh3LT53aXBoeS0+bWF4X21hdGNoX3NldHMgPSBJV0xfU0NBTl9NQVhfUFJPRklMRVM7Ci0JCS8qIHdlIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciBhbmQgemVybyBsZW5ndGggU1NJRCBJRS4gKi8KLQkJaHctPndpcGh5LT5tYXhfc2NoZWRfc2Nhbl9pZV9sZW4gPQotCQkJCQlTQ0FOX09GRkxPQURfUFJPQkVfUkVRX1NJWkUgLSAyNCAtIDI7Ci0JfQorCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19TQ0hFRF9TQ0FOOworCWh3LT53aXBoeS0+bWF4X3NjaGVkX3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYOworCWh3LT53aXBoeS0+bWF4X21hdGNoX3NldHMgPSBJV0xfU0NBTl9NQVhfUFJPRklMRVM7CisJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCB6ZXJvIGxlbmd0aCBTU0lEIElFLiAqLworCWh3LT53aXBoeS0+bWF4X3NjaGVkX3NjYW5faWVfbGVuID0gU0NBTl9PRkZMT0FEX1BST0JFX1JFUV9TSVpFIC0gMjQgLSAyOwogCiAJaHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX0NUV0lOIHwKIAkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX09QUFBTOwpAQCAtMzg2LDcgKzM4NSwxMSBAQAogCX0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAotCWlmIChtdm0tPmZ3LT5pbWdbSVdMX1VDT0RFX1dPV0xBTl0uc2VjWzBdLmxlbiAmJgorCWlmIChpd2xfbXZtX2lzX2QwaTNfc3VwcG9ydGVkKG12bSkgJiYKKwkgICAgZGV2aWNlX2Nhbl93YWtldXAobXZtLT50cmFucy0+ZGV2KSkgeworCQltdm0tPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9BTlk7CisJCWh3LT53aXBoeS0+d293bGFuID0gJm12bS0+d293bGFuOworCX0gZWxzZSBpZiAobXZtLT5mdy0+aW1nW0lXTF9VQ09ERV9XT1dMQU5dLnNlY1swXS5sZW4gJiYKIAkgICAgbXZtLT50cmFucy0+b3BzLT5kM19zdXNwZW5kICYmCiAJICAgIG12bS0+dHJhbnMtPm9wcy0+ZDNfcmVzdW1lICYmCiAJICAgIGRldmljZV9jYW5fd2FrZXVwKG12bS0+dHJhbnMtPmRldikpIHsKQEAgLTU0MCwxMyArNTQzLDIyIEBACiAJCXJldHVybiAtRUFDQ0VTOwogCiAJLyogcmV0dXJuIGZyb20gRDBpMyBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgVHggYWdncmVnYXRpb24gKi8KLQlpZiAoYWN0aW9uID09IElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVCkgeworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9DT05UOgorCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0g6CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSF9DT05UOgorCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgogCQlpd2xfbXZtX3JlZihtdm0sIElXTF9NVk1fUkVGX1RYX0FHRyk7CiAJCXR4X2FnZ19yZWYgPSB0cnVlOwogCiAJCS8qCi0JCSAqIHdhaXQgc3luY2hyb25vdXNseSB1bnRpbCBEMGkzIGV4aXQgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0JCSAqIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRpZAorCQkgKiBmb3IgdHggc3RhcnQsIHdhaXQgc3luY2hyb25vdXNseSB1bnRpbCBEMGkzIGV4aXQgdG8KKwkJICogZ2V0IHRoZSBjb3JyZWN0IHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRpZC4KKwkJICogYWRkaXRpb25hbGx5LCBzb21lIG90aGVyIGFtcGR1IGFjdGlvbnMgdXNlIGRpcmVjdAorCQkgKiB0YXJnZXQgYWNjZXNzLCB3aGljaCBpcyBub3QgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CisJCSAqIGJ5IHRoZSB0cmFucyBsYXllciAodW5saWtlIGNvbW1hbmRzKSwgc28gd2FpdCBmb3IKKwkJICogZDBpMyBleGl0IGluIHRoZXNlIGNhc2VzIGFzIHdlbGwuCiAJCSAqLwogCQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChtdm0tPmQwaTNfZXhpdF93YWl0cSwKIAkJCSAgIXRlc3RfYml0KElXTF9NVk1fU1RBVFVTX0lOX0QwSTMsICZtdm0tPnN0YXR1cyksIEhaKSkgewpAQCAtNTU0LDYgKzU2Niw5IEBACiAJCQlpd2xfbXZtX3VucmVmKG12bSwgSVdMX01WTV9SRUZfVFhfQUdHKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwpAQCAtNzU4LDcgKzc3Myw3IEBACiAJCS5wd3JfcmVzdHJpY3Rpb24gPSBjcHVfdG9fbGUxNih0eF9wb3dlciksCiAJfTsKIAotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFJFRFVDRV9UWF9QT1dFUl9DTUQsIENNRF9TWU5DLAorCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFJFRFVDRV9UWF9QT1dFUl9DTUQsIDAsCiAJCQkJICAgIHNpemVvZihyZWR1Y2VfdHhwd3JfY21kKSwKIAkJCQkgICAgJnJlZHVjZV90eHB3cl9jbWQpOwogfQpAQCAtODE3LDE4ICs4MzIsMTcgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9yZWxlYXNlOwogCi0JcmV0ID0gaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSwgdmlmKTsKKwlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJLyogYmVhY29uIGZpbHRlcmluZyAqLwotCXJldCA9IGl3bF9tdm1fZGlzYWJsZV9iZWFjb25fZmlsdGVyKG12bSwgdmlmLCBDTURfU1lOQyk7CisJcmV0ID0gaXdsX212bV9kaXNhYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3JlbW92ZV9tYWM7CiAKLQlpZiAoIW12bS0+YmZfYWxsb3dlZF92aWYgJiYgZmFsc2UgJiYKLQkgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgIXZpZi0+cDJwICYmCi0JICAgIG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0JGX1VQREFURUQpeworCWlmICghbXZtLT5iZl9hbGxvd2VkX3ZpZiAmJgorCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnApIHsKIAkJbXZtLT5iZl9hbGxvd2VkX3ZpZiA9IG12bXZpZjsKIAkJdmlmLT5kcml2ZXJfZmxhZ3MgfD0gSUVFRTgwMjExX1ZJRl9CRUFDT05fRklMVEVSIHwKIAkJCQkgICAgIElFRUU4MDIxMV9WSUZfU1VQUE9SVFNfQ1FNX1JTU0k7CkBAIC05NjksNyArOTgzLDcgQEAKIAlpZiAobXZtLT52aWZfY291bnQgJiYgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCiAJCW12bS0+dmlmX2NvdW50LS07CiAKLQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCWl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogCWl3bF9tdm1fbWFjX2N0eHRfcmVtb3ZlKG12bSwgdmlmKTsKIAogb3V0X3JlbGVhc2U6CkBAIC0xMjIzLDEwICsxMjM3LDE0IEBACiAJaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQkNBU1RfRklMVEVSSU5HKSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBiY2FzdCBmaWx0ZXJpbmcgaXNuJ3Qgc3VwcG9ydGVkIGZvciBQMlAgY2xpZW50ICovCisJaWYgKHZpZi0+cDJwKQorCQlyZXR1cm4gMDsKKwogCWlmICghaXdsX212bV9iY2FzdF9maWx0ZXJfYnVpbGRfY21kKG12bSwgJmNtZCkpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQkNBU1RfRklMVEVSX0NNRCwgQ01EX1NZTkMsCisJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQkNBU1RfRklMVEVSX0NNRCwgMCwKIAkJCQkgICAgc2l6ZW9mKGNtZCksICZjbWQpOwogfQogI2Vsc2UKQEAgLTEyNTMsNyArMTI3MSw3IEBACiAJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9BU1NPQyAmJiBic3NfY29uZi0+YXNzb2MpCiAJCWl3bF9tdm1fbWFjX2N0eHRfcmVjYWxjX3RzZl9pZChtdm0sIHZpZik7CiAKLQlyZXQgPSBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCB2aWYpOworCXJldCA9IGl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIHZpZiwgZmFsc2UpOwogCWlmIChyZXQpCiAJCUlXTF9FUlIobXZtLCAiZmFpbGVkIHRvIHVwZGF0ZSBNQUMgJXBNXG4iLCB2aWYtPmFkZHIpOwogCkBAIC0xMzMzLDEwICsxMzUxLDEwIEBACiAJCWl3bF9tdm1fcmVtb3ZlX3RpbWVfZXZlbnQobXZtLCBtdm12aWYsCiAJCQkJCSAgJm12bXZpZi0+dGltZV9ldmVudF9kYXRhKTsKIAkJaXdsX212bV9zZl91cGRhdGUobXZtLCB2aWYsIGZhbHNlKTsKLQkJV0FSTl9PTihpd2xfbXZtX2VuYWJsZV9iZWFjb25fZmlsdGVyKG12bSwgdmlmLCBDTURfU1lOQykpOworCQlXQVJOX09OKGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApKTsKIAl9IGVsc2UgaWYgKGNoYW5nZXMgJiAoQlNTX0NIQU5HRURfUFMgfCBCU1NfQ0hBTkdFRF9QMlBfUFMgfAogCQkJICAgICAgQlNTX0NIQU5HRURfUU9TKSkgewotCQlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCQlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtKTsKIAkJaWYgKHJldCkKIAkJCUlXTF9FUlIobXZtLCAiZmFpbGVkIHRvIHVwZGF0ZSBwb3dlciBtb2RlXG4iKTsKIAl9CkBAIC0xMzQ3LDE2ICsxMzY1LDE5IEBACiAJfQogCiAJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9DUU0pIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKG12bSwgImNxbSBpbmZvX2NoYW5nZWQiKTsKKwkJSVdMX0RFQlVHX01BQzgwMjExKG12bSwgImNxbSBpbmZvX2NoYW5nZWRcbiIpOwogCQkvKiByZXNldCBjcW0gZXZlbnRzIHRyYWNraW5nICovCiAJCW12bXZpZi0+YmZfZGF0YS5sYXN0X2NxbV9ldmVudCA9IDA7Ci0JCXJldCA9IGl3bF9tdm1fdXBkYXRlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIGZhbHNlLCBDTURfU1lOQyk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfRVJSKG12bSwgImZhaWxlZCB0byB1cGRhdGUgQ1FNIHRocmVzaG9sZHNcbiIpOworCQlpZiAobXZtdmlmLT5iZl9kYXRhLmJmX2VuYWJsZWQpIHsKKwkJCXJldCA9IGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApOworCQkJaWYgKHJldCkKKwkJCQlJV0xfRVJSKG12bSwKKwkJCQkJImZhaWxlZCB0byB1cGRhdGUgQ1FNIHRocmVzaG9sZHNcbiIpOworCQl9CiAJfQogCiAJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9BUlBfRklMVEVSKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShtdm0sICJhcnAgZmlsdGVyIGNoYW5nZWQiKTsKKwkJSVdMX0RFQlVHX01BQzgwMjExKG12bSwgImFycCBmaWx0ZXIgY2hhbmdlZFxuIik7CiAJCWl3bF9tdm1fY29uZmlndXJlX2JjYXN0X2ZpbHRlcihtdm0sIHZpZik7CiAJfQogfQpAQCAtMTQwMiw3ICsxNDIzLDcgQEAKIAltdm12aWYtPmFwX2lic3NfYWN0aXZlID0gdHJ1ZTsKIAogCS8qIHBvd2VyIHVwZGF0ZWQgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgcXVvdGFzICovCi0JaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSwgdmlmKTsKKwlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtKTsKIAogCXJldCA9IGl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIHZpZik7CiAJaWYgKHJldCkKQEAgLTE0MTAsNyArMTQzMSw3IEBACiAKIAkvKiBOZWVkIHRvIHVwZGF0ZSB0aGUgUDJQIERldmljZSBNQUMgKG9ubHkgR08sIElCU1MgaXMgc2luZ2xlIHZpZikgKi8KIAlpZiAodmlmLT5wMnAgJiYgbXZtLT5wMnBfZGV2aWNlX3ZpZikKLQkJaXdsX212bV9tYWNfY3R4dF9jaGFuZ2VkKG12bSwgbXZtLT5wMnBfZGV2aWNlX3ZpZik7CisJCWl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIG12bS0+cDJwX2RldmljZV92aWYsIGZhbHNlKTsKIAogCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfQVBfSUJTUyk7CiAKQEAgLTE0MjAsNyArMTQ0MSw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9xdW90YV9mYWlsZWQ6Ci0JaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSwgdmlmKTsKKwlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtKTsKIAltdm12aWYtPmFwX2lic3NfYWN0aXZlID0gZmFsc2U7CiAJaXdsX212bV9zZW5kX3JtX2JjYXN0X3N0YShtdm0sICZtdm12aWYtPmJjYXN0X3N0YSk7CiBvdXRfdW5iaW5kOgpAQCAtMTQ1MCwxMyArMTQ3MSwxMyBAQAogCiAJLyogTmVlZCB0byB1cGRhdGUgdGhlIFAyUCBEZXZpY2UgTUFDIChvbmx5IEdPLCBJQlNTIGlzIHNpbmdsZSB2aWYpICovCiAJaWYgKHZpZi0+cDJwICYmIG12bS0+cDJwX2RldmljZV92aWYpCi0JCWl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIG12bS0+cDJwX2RldmljZV92aWYpOworCQlpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCBtdm0tPnAycF9kZXZpY2VfdmlmLCBmYWxzZSk7CiAKIAlpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKIAlpd2xfbXZtX3NlbmRfcm1fYmNhc3Rfc3RhKG12bSwgJm12bXZpZi0+YmNhc3Rfc3RhKTsKIAlpd2xfbXZtX2JpbmRpbmdfcmVtb3ZlX3ZpZihtdm0sIHZpZik7CiAKLQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCWl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogCiAJaXdsX212bV9tYWNfY3R4dF9yZW1vdmUobXZtLCB2aWYpOwogCkBAIC0xNDc3LDcgKzE0OTgsNyBAQAogCiAJaWYgKGNoYW5nZXMgJiAoQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UIHwgQlNTX0NIQU5HRURfSFQgfAogCQkgICAgICAgQlNTX0NIQU5HRURfQkFORFdJRFRIKSAmJgotCSAgICBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCB2aWYpKQorCSAgICBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCB2aWYsIGZhbHNlKSkKIAkJSVdMX0VSUihtdm0sICJmYWlsZWQgdG8gdXBkYXRlIE1BQyAlcE1cbiIsIHZpZi0+YWRkcik7CiAKIAkvKiBOZWVkIHRvIHNlbmQgYSBuZXcgYmVhY29uIHRlbXBsYXRlIHRvIHRoZSBGVyAqLwpAQCAtMTQ5NSw2ICsxNTE2LDkgQEAKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9JRExFICYmICFic3NfY29uZi0+aWRsZSkKKwkJaXdsX212bV9zY2hlZF9zY2FuX3N0b3AobXZtLCB0cnVlKTsKKwogCXN3aXRjaCAodmlmLT50eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlpd2xfbXZtX2Jzc19pbmZvX2NoYW5nZWRfc3RhdGlvbihtdm0sIHZpZiwgYnNzX2NvbmYsIGNoYW5nZXMpOwpAQCAtMTUyNSw3ICsxNTQ5LDcgQEAKIAogCXN3aXRjaCAobXZtLT5zY2FuX3N0YXR1cykgewogCWNhc2UgSVdMX01WTV9TQ0FOX1NDSEVEOgotCQlyZXQgPSBpd2xfbXZtX3NjaGVkX3NjYW5fc3RvcChtdm0pOworCQlyZXQgPSBpd2xfbXZtX3NjaGVkX3NjYW5fc3RvcChtdm0sIHRydWUpOwogCQlpZiAocmV0KSB7CiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIG91dDsKQEAgLTE2OTcsNiArMTcyMSwxMSBAQAogCQlyZXQgPSBpd2xfbXZtX2FkZF9zdGEobXZtLCB2aWYsIHN0YSk7CiAJfSBlbHNlIGlmIChvbGRfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT05FICYmCiAJCSAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEgpIHsKKwkJLyoKKwkJICogRUJTIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgZmFpbHVyZXMgcmVwb3J0ZWQgYnkgRlcuCisJCSAqIFJlc2V0IEVCUyBzdGF0dXMgaGVyZSBhc3N1bWluZyBlbnZpcm9ubWVudCBoYXMgYmVlbiBjaGFuZ2VkLgorCQkgKi8KKwkJbXZtLT5sYXN0X2Vic19zdWNjZXNzZnVsID0gdHJ1ZTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEggJiYKIAkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MpIHsKQEAgLTE3MDgsMTQgKzE3MzcsMTIgQEAKIAl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FTU09DICYmCiAJCSAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQpIHsKIAkJLyogZW5hYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KLQkJaWYgKHZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QpCi0JCQlXQVJOX09OKGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsCi0JCQkJCQkJICAgICBDTURfU1lOQykpOworCQlXQVJOX09OKGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApKTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQgJiYKIAkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MpIHsKIAkJLyogZGlzYWJsZSBiZWFjb24gZmlsdGVyaW5nICovCi0JCVdBUk5fT04oaXdsX212bV9kaXNhYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIENNRF9TWU5DKSk7CisJCVdBUk5fT04oaXdsX212bV9kaXNhYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApKTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FTU09DICYmCiAJCSAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEgpIHsKQEAgLTE3NzIsNyArMTc5OSw3IEBACiAJCWludCByZXQ7CiAKIAkJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7Ci0JCXJldCA9IGl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIHZpZik7CisJCXJldCA9IGl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChtdm0sIHZpZiwgZmFsc2UpOwogCQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE4NjUsNyArMTg5Miw3IEBACiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwotCXJldCA9IGl3bF9tdm1fc2NoZWRfc2Nhbl9zdG9wKG12bSk7CisJcmV0ID0gaXdsX212bV9zY2hlZF9zY2FuX3N0b3AobXZtLCBmYWxzZSk7CiAJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKIAlpd2xfbXZtX3dhaXRfZm9yX2FzeW5jX2hhbmRsZXJzKG12bSk7CiAKQEAgLTIxNjEsMTAgKzIxODgsMTAgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJaXdsX212bV9idF9jb2V4X3ZpZl9jaGFuZ2UobXZtKTsKIAlpd2xfbXZtX3BoeV9jdHh0X2NoYW5nZWQobXZtLCBwaHlfY3R4dCwgJmN0eC0+bWluX2RlZiwKIAkJCQkgY3R4LT5yeF9jaGFpbnNfc3RhdGljLAogCQkJCSBjdHgtPnJ4X2NoYWluc19keW5hbWljKTsKLQlpd2xfbXZtX2J0X2NvZXhfdmlmX2NoYW5nZShtdm0pOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiB9CiAKQEAgLTIxODQsNiArMjIxMSwxMSBAQAogCiAJc3dpdGNoICh2aWYtPnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQkvKiBVbmxlc3MgaXQncyBhIENTQSBmbG93IHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlICovCisJCWlmICh2aWYtPmNzYV9hY3RpdmUpIHsKKwkJCW12bXZpZi0+YXBfaWJzc19hY3RpdmUgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQkvKgogCQkgKiBUaGUgQVAgYmluZGluZyBmbG93IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgc3RhcnRfYXAgZmxvdwpAQCAtMjIwNyw3ICsyMjM5LDcgQEAKIAkgKiBQb3dlciBzdGF0ZSBtdXN0IGJlIHVwZGF0ZWQgYmVmb3JlIHF1b3RhcywKIAkgKiBvdGhlcndpc2UgZncgd2lsbCBjb21wbGFpbi4KIAkgKi8KLQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCWl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogCiAJLyogU2V0dGluZyB0aGUgcXVvdGEgYXQgdGhpcyBzdGFnZSBpcyBvbmx5IHJlcXVpcmVkIGZvciBtb25pdG9yCiAJICogaW50ZXJmYWNlcy4gRm9yIHRoZSBvdGhlciB0eXBlcywgdGhlIGJzc19pbmZvIGNoYW5nZWQgZmxvdwpAQCAtMjIyMCwxMSArMjI1MiwxNyBAQAogCQkJZ290byBvdXRfcmVtb3ZlX2JpbmRpbmc7CiAJfQogCisJLyogSGFuZGxlIGJpbmRpbmcgZHVyaW5nIENTQSAqLworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgdmlmKTsKKwkJaXdsX212bV9tYWNfY3R4dF9jaGFuZ2VkKG12bSwgdmlmLCBmYWxzZSk7CisJfQorCiAJZ290byBvdXRfdW5sb2NrOwogCiAgb3V0X3JlbW92ZV9iaW5kaW5nOgogCWl3bF9tdm1fYmluZGluZ19yZW1vdmVfdmlmKG12bSwgdmlmKTsKLQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOworCWl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKIAlpZiAocmV0KQpAQCAtMjI0NCwyMiArMjI4MiwyOSBAQAogCWl3bF9tdm1fcmVtb3ZlX3RpbWVfZXZlbnQobXZtLCBtdm12aWYsICZtdm12aWYtPnRpbWVfZXZlbnRfZGF0YSk7CiAKIAlzd2l0Y2ggKHZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJZ290byBvdXRfdW5sb2NrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJbXZtdmlmLT5tb25pdG9yX2FjdGl2ZSA9IGZhbHNlOwogCQlpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJLyogVGhpcyBwYXJ0IGlzIHRyaWdnZXJlZCBvbmx5IGR1cmluZyBDU0EgKi8KKwkJaWYgKCF2aWYtPmNzYV9hY3RpdmUgfHwgIW12bXZpZi0+YXBfaWJzc19hY3RpdmUpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJbXZtdmlmLT5hcF9pYnNzX2FjdGl2ZSA9IGZhbHNlOworCQlpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwkJLypUT0RPOiBidF9jb2V4IG5vdGlmaWNhdGlvbiBoZXJlPyAqLwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAogCWl3bF9tdm1fYmluZGluZ19yZW1vdmVfdmlmKG12bSwgdmlmKTsKLQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMobXZtLCB2aWYpOwogCiBvdXRfdW5sb2NrOgogCW12bXZpZi0+cGh5X2N0eHQgPSBOVUxMOworCWl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhtdm0pOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiB9CiAKQEAgLTIzMjMsOSArMjM2OCw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAobmxhX2dldF91MzIodGJbSVdMX01WTV9UTV9BVFRSX0JFQUNPTl9GSUxURVJfU1RBVEVdKSkKLQkJCXJldHVybiBpd2xfbXZtX2VuYWJsZV9iZWFjb25fZmlsdGVyKG12bSwgdmlmLAotCQkJCQkJCSAgICBDTURfU1lOQyk7Ci0JCXJldHVybiBpd2xfbXZtX2Rpc2FibGVfYmVhY29uX2ZpbHRlcihtdm0sIHZpZiwgQ01EX1NZTkMpOworCQkJcmV0dXJuIGl3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApOworCQlyZXR1cm4gaXdsX212bV9kaXNhYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsIDApOwogCX0KIAogCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTIzNDYsNiArMjM5MCw1MyBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGl3bF9tdm1fY2hhbm5lbF9zd2l0Y2hfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJCSAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfTUFDODAyMTFfR0VUX01WTShodyk7CisKKwltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKKwlpZiAoV0FSTihtdm0tPmNzYV92aWYgJiYgbXZtLT5jc2FfdmlmLT5jc2FfYWN0aXZlLAorCQkgIkFub3RoZXIgQ1NBIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJSVdMX0RFQlVHX01BQzgwMjExKG12bSwgIkNTQSBzdGFydGVkIHRvIGZyZXEgJWRcbiIsCisJCQkgICBjaGFuZGVmLT5jZW50ZXJfZnJlcTEpOworCW12bS0+Y3NhX3ZpZiA9IHZpZjsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBpd2xfbXZtX21hY19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3sKKwlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX01BQzgwMjExX0dFVF9NVk0oaHcpOworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmOworCXN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtc3RhOworCisJaWYgKCF2aWYgfHwgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCW12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKKwltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX3N0YWlkX3Byb3RlY3RlZChtdm0sIG12bXZpZi0+YXBfc3RhX2lkKTsKKworCWlmIChXQVJOX09OX09OQ0UoIW12bXN0YSkpCisJCWdvdG8gZG9uZTsKKworCWlmIChkcm9wKSB7CisJCWlmIChpd2xfbXZtX2ZsdXNoX3R4X3BhdGgobXZtLCBtdm1zdGEtPnRmZF9xdWV1ZV9tc2ssIHRydWUpKQorCQkJSVdMX0VSUihtdm0sICJmbHVzaCByZXF1ZXN0IGZhaWxcbiIpOworCX0gZWxzZSB7CisJCWl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KG12bS0+dHJhbnMsCisJCQkJCSAgICAgIG12bXN0YS0+dGZkX3F1ZXVlX21zayk7CisJfQorZG9uZToKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworfQorCiBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xfbXZtX2h3X29wcyA9IHsKIAkudHggPSBpd2xfbXZtX21hY190eCwKIAkuYW1wZHVfYWN0aW9uID0gaXdsX212bV9tYWNfYW1wZHVfYWN0aW9uLApAQCAtMjM2OSw2ICsyNDYwLDcgQEAKIAkuc3RhX3JjX3VwZGF0ZSA9IGl3bF9tdm1fc3RhX3JjX3VwZGF0ZSwKIAkuY29uZl90eCA9IGl3bF9tdm1fbWFjX2NvbmZfdHgsCiAJLm1nZF9wcmVwYXJlX3R4ID0gaXdsX212bV9tYWNfbWdkX3ByZXBhcmVfdHgsCisJLmZsdXNoID0gaXdsX212bV9tYWNfZmx1c2gsCiAJLnNjaGVkX3NjYW5fc3RhcnQgPSBpd2xfbXZtX21hY19zY2hlZF9zY2FuX3N0YXJ0LAogCS5zY2hlZF9zY2FuX3N0b3AgPSBpd2xfbXZtX21hY19zY2hlZF9zY2FuX3N0b3AsCiAJLnNldF9rZXkgPSBpd2xfbXZtX21hY19zZXRfa2V5LApAQCAtMjM4OCw2ICsyNDgwLDggQEAKIAogCS5zZXRfdGltID0gaXdsX212bV9zZXRfdGltLAogCisJLmNoYW5uZWxfc3dpdGNoX2JlYWNvbiA9IGl3bF9tdm1fY2hhbm5lbF9zd2l0Y2hfYmVhY29uLAorCiAJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGl3bF9tdm1fbWFjX3Rlc3Rtb2RlX2NtZCkKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbXZtLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tdm0uaAppbmRleCBmMWVjMDk4Li5mY2M2YzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tdm0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tdm0uaApAQCAtMTY0LDcgKzE2NCw2IEBACiAJTVZNX0RFQlVHRlNfUE1fU0tJUF9EVElNX1BFUklPRFMgPSBCSVQoMiksCiAJTVZNX0RFQlVHRlNfUE1fUlhfREFUQV9USU1FT1VUID0gQklUKDMpLAogCU1WTV9ERUJVR0ZTX1BNX1RYX0RBVEFfVElNRU9VVCA9IEJJVCg0KSwKLQlNVk1fREVCVUdGU19QTV9ESVNBQkxFX1BPV0VSX09GRiA9IEJJVCg1KSwKIAlNVk1fREVCVUdGU19QTV9MUFJYX0VOQSA9IEJJVCg2KSwKIAlNVk1fREVCVUdGU19QTV9MUFJYX1JTU0lfVEhSRVNIT0xEID0gQklUKDcpLAogCU1WTV9ERUJVR0ZTX1BNX1NOT09aRV9FTkFCTEUgPSBCSVQoOCksCkBAIC0xNzcsNyArMTc2LDYgQEAKIAl1MzIgdHhfZGF0YV90aW1lb3V0OwogCWJvb2wgc2tpcF9vdmVyX2R0aW07CiAJdTggc2tpcF9kdGltX3BlcmlvZHM7Ci0JYm9vbCBkaXNhYmxlX3Bvd2VyX29mZjsKIAlib29sIGxwcnhfZW5hOwogCXUzMiBscHJ4X3Jzc2lfdGhyZXNob2xkOwogCWJvb2wgc25vb3plX2VuYTsKQEAgLTIzMiw2ICsyMzAsNyBAQAogCUlXTF9NVk1fUkVGX1VTRVIsCiAJSVdMX01WTV9SRUZfVFgsCiAJSVdMX01WTV9SRUZfVFhfQUdHLAorCUlXTF9NVk1fUkVGX0VYSVRfV09SSywKIAogCUlXTF9NVk1fUkVGX0NPVU5ULAogfTsKQEAgLTI2NSw2ICsyNjQsNyBAQAogICogQHVwbG9hZGVkOiBpbmRpY2F0ZXMgdGhlIE1BQyBjb250ZXh0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBkZXZpY2UKICAqIEBhcF9pYnNzX2FjdGl2ZTogaW5kaWNhdGVzIHRoYXQgQVAvSUJTUyBpcyBjb25maWd1cmVkIGFuZCB0aGF0IHRoZSBpbnRlcmZhY2UKICAqCXNob3VsZCBnZXQgcXVvdGEgZXRjLgorICogQHBtX2VuYWJsZWQgLSBJbmRpY2F0ZSBpZiBNQUMgcG93ZXIgbWFuYWdlbWVudCBpcyBhbGxvd2VkCiAgKiBAbW9uaXRvcl9hY3RpdmU6IGluZGljYXRlcyB0aGF0IG1vbml0b3IgY29udGV4dCBpcyBjb25maWd1cmVkLCBhbmQgdGhhdCB0aGUKICAqCWludGVyZmFjZSBzaG91bGQgZ2V0IHF1b3RhIGV0Yy4KICAqIEBsb3dfbGF0ZW5jeTogaW5kaWNhdGVzIHRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgaW4gbG93LWxhdGVuY3kgbW9kZQpAQCAtMjgzLDYgKzI4Myw3IEBACiAKIAlib29sIHVwbG9hZGVkOwogCWJvb2wgYXBfaWJzc19hY3RpdmU7CisJYm9vbCBwbV9lbmFibGVkOwogCWJvb2wgbW9uaXRvcl9hY3RpdmU7CiAJYm9vbCBsb3dfbGF0ZW5jeTsKIAlzdHJ1Y3QgaXdsX212bV92aWZfYmZfZGF0YSBiZl9kYXRhOwpAQCAtNDUxLDYgKzQ1MiwxMSBAQAogCWludCBsYXN0X2ZyYW1lX2lkeDsKIH07CiAKK2VudW0geworCUQwSTNfREVGRVJfV0FLRVVQLAorCUQwSTNfUEVORElOR19XQUtFVVAsCit9OworCiBzdHJ1Y3QgaXdsX212bSB7CiAJLyogZm9yIGxvZ2dlciBhY2Nlc3MgKi8KIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC00ODQsNiArNDkwLDcgQEAKIAl1MzIgbG9nX2V2ZW50X3RhYmxlOwogCXUzMiB1bWFjX2Vycm9yX2V2ZW50X3RhYmxlOwogCWJvb2wgc3VwcG9ydF91bWFjX2xvZzsKKwlzdHJ1Y3QgaXdsX3NmX3JlZ2lvbiBzZl9zcGFjZTsKIAogCXUzMiBhbXBkdV9yZWY7CiAKQEAgLTQ5NSw2ICs1MDIsNyBAQAogCXU4IHF1ZXVlX3RvX21hYzgwMjExW0lXTF9NQVhfSFdfUVVFVUVTXTsKIAlhdG9taWNfdCBxdWV1ZV9zdG9wX2NvdW50W0lXTF9NQVhfSFdfUVVFVUVTXTsKIAorCWNvbnN0IGNoYXIgKm52bV9maWxlX25hbWU7CiAJc3RydWN0IGl3bF9udm1fZGF0YSAqbnZtX2RhdGE7CiAJLyogTlZNIHNlY3Rpb25zICovCiAJc3RydWN0IGl3bF9udm1fc2VjdGlvbiBudm1fc2VjdGlvbnNbTlZNX01BWF9OVU1fU0VDVElPTlNdOwpAQCAtNTM1LDYgKzU0Myw4IEBACiAJLyogSW50ZXJuYWwgc3RhdGlvbiAqLwogCXN0cnVjdCBpd2xfbXZtX2ludF9zdGEgYXV4X3N0YTsKIAorCWJvb2wgbGFzdF9lYnNfc3VjY2Vzc2Z1bDsKKwogCXU4IHNjYW5fbGFzdF9hbnRlbm5hX2lkeDsgLyogdG8gdG9nZ2xlIFRYIGJldHdlZW4gYW50ZW5uYXMgKi8KIAl1OCBtZ210X2xhc3RfYW50ZW5uYV9pZHg7CiAKQEAgLTU3OCw4ICs1ODgsMTIgQEAKIAl2b2lkICpmd19lcnJvcl9kdW1wOwogCXZvaWQgKmZ3X2Vycm9yX3NyYW07CiAJdTMyIGZ3X2Vycm9yX3NyYW1fbGVuOworCXUzMiAqZndfZXJyb3JfcnhmOworCXUzMiBmd19lcnJvcl9yeGZfbGVuOwogCisjaWZkZWYgQ09ORklHX0lXTFdJRklfTEVEUwogCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOworI2VuZGlmCiAKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqcDJwX2RldmljZV92aWY7CiAKQEAgLTYwMSw2ICs2MTUsOSBAQAogCWJvb2wgZDBpM19vZmZsb2FkaW5nOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkMGkzX2V4aXRfd29yazsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGQwaTNfdHg7CisJLyogcHJvdGVjdCBkMGkzX3N1c3BlbmRfZmxhZ3MgKi8KKwlzdHJ1Y3QgbXV0ZXggZDBpM19zdXNwZW5kX211dGV4OworCXVuc2lnbmVkIGxvbmcgZDBpM19zdXNwZW5kX2ZsYWdzOwogCS8qIHN5bmMgZDBpM190eCBxdWV1ZSBhbmQgSVdMX01WTV9TVEFUVVNfSU5fRDBJMyBzdGF0dXMgZmxhZyAqLwogCXNwaW5sb2NrX3QgZDBpM190eF9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IGQwaTNfZXhpdF93YWl0cTsKQEAgLTYyOSw4ICs2NDYsOCBAQAogCiAJLyogSW5kaWNhdGUgaWYgZGV2aWNlIHBvd2VyIHNhdmUgaXMgYWxsb3dlZCAqLwogCWJvb2wgcHNfZGlzYWJsZWQ7Ci0JLyogSW5kaWNhdGUgaWYgZGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgaXMgYWxsb3dlZCAqLwotCWJvb2wgcG1fZGlzYWJsZWQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqY3NhX3ZpZjsKIH07CiAKIC8qIEV4dHJhY3QgTVZNIHByaXYgZnJvbSBvcF9tb2RlIGFuZCBfaHcgKi8KQEAgLTcwNSw2ICs3MjIsNyBAQAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIHZvaWQgaXdsX212bV9md19lcnJvcl9kdW1wKHN0cnVjdCBpd2xfbXZtICptdm0pOwogdm9pZCBpd2xfbXZtX2Z3X2Vycm9yX3NyYW1fZHVtcChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKK3ZvaWQgaXdsX212bV9md19lcnJvcl9yeGZfZHVtcChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKICNlbmRpZgogdTggZmlyc3RfYW50ZW5uYSh1OCBtYXNrKTsKIHU4IGl3bF9tdm1fbmV4dF9hbnRlbm5hKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHZhbGlkLCB1OCBsYXN0X2lkeCk7CkBAIC03NDUsNyArNzYzLDcgQEAKIAkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpOwogCiAvKiBOVk0gKi8KLWludCBpd2xfbnZtX2luaXQoc3RydWN0IGl3bF9tdm0gKm12bSk7CitpbnQgaXdsX252bV9pbml0KHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgcmVhZF9udm1fZnJvbV9uaWMpOwogaW50IGl3bF9tdm1fbG9hZF9udm1fdG9fbmljKHN0cnVjdCBpd2xfbXZtICptdm0pOwogCiBpbnQgaXdsX212bV91cChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKQEAgLTc5Niw3ICs4MTQsOCBAQAogaW50IGl3bF9tdm1fbWFjX2N0eHRfaW5pdChzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIHZvaWQgaXdsX212bV9tYWNfY3R4dF9yZWxlYXNlKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogaW50IGl3bF9tdm1fbWFjX2N0eHRfYWRkKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotaW50IGl3bF9tdm1fbWFjX2N0eHRfY2hhbmdlZChzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK2ludCBpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgYm9vbCBmb3JjZV9hc3NvY19vZmYpOwogaW50IGl3bF9tdm1fbWFjX2N0eHRfcmVtb3ZlKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogdTMyIGl3bF9tdm1fbWFjX2dldF9xdWV1ZXNfbWFzayhzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwpAQCAtODQwLDcgKzg1OSw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSk7CiBpbnQgaXdsX212bV9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSk7Ci1pbnQgaXdsX212bV9zY2hlZF9zY2FuX3N0b3Aoc3RydWN0IGl3bF9tdm0gKm12bSk7CitpbnQgaXdsX212bV9zY2hlZF9zY2FuX3N0b3Aoc3RydWN0IGl3bF9tdm0gKm12bSwgYm9vbCBub3RpZnkpOwogaW50IGl3bF9tdm1fcnhfc2NoZWRfc2Nhbl9yZXN1bHRzKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICBzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKIAkJCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKQEAgLTg3NCwxMCArODkzLDggQEAKIGludCByc19wcmV0dHlfcHJpbnRfcmF0ZShjaGFyICpidWYsIGNvbnN0IHUzMiByYXRlKTsKIAogLyogcG93ZXIgbWFuYWdlbWVudCAqLwotaW50IGl3bF9wb3dlcl9sZWdhY3lfc2V0X2NhbV9tb2RlKHN0cnVjdCBpd2xfbXZtICptdm0pOwotCiBpbnQgaXdsX212bV9wb3dlcl91cGRhdGVfZGV2aWNlKHN0cnVjdCBpd2xfbXZtICptdm0pOwotaW50IGl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK2ludCBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9tYWMoc3RydWN0IGl3bF9tdm0gKm12bSk7CiBpbnQgaXdsX212bV9wb3dlcl9tYWNfZGJnZnNfcmVhZChzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCSBjaGFyICpidWYsIGludCBidWZzeik7CiAKQEAgLTg4Niw4ICs5MDMsMTggQEAKIAkJCQkJICAgICBzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKIAkJCQkJICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CiAKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRURTCiBpbnQgaXdsX212bV9sZWRzX2luaXQoc3RydWN0IGl3bF9tdm0gKm12bSk7CiB2b2lkIGl3bF9tdm1fbGVkc19leGl0KHN0cnVjdCBpd2xfbXZtICptdm0pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGl3bF9tdm1fbGVkc19pbml0KHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX212bV9sZWRzX2V4aXQoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKK30KKyNlbmRpZgogCiAvKiBEMyAoV29XTEFOLCBOZXREZXRlY3QpICovCiBpbnQgaXdsX212bV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pOwpAQCAtOTIyLDkgKzk0OSw5IEBACiB2b2lkIGl3bF9tdm1fcmVmKHN0cnVjdCBpd2xfbXZtICptdm0sIGVudW0gaXdsX212bV9yZWZfdHlwZSByZWZfdHlwZSk7CiB2b2lkIGl3bF9tdm1fdW5yZWYoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfbXZtX3JlZl90eXBlIHJlZl90eXBlKTsKIHZvaWQgaXdsX212bV9kMGkzX2VuYWJsZV90eChzdHJ1Y3QgaXdsX212bSAqbXZtLCBfX2xlMTYgKnFvc19zZXEpOworaW50IF9pd2xfbXZtX2V4aXRfZDBpMyhzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIAogLyogQlQgQ29leCAqLwotaW50IGl3bF9zZW5kX2J0X3ByaW9fdGJsKHN0cnVjdCBpd2xfbXZtICptdm0pOwogaW50IGl3bF9zZW5kX2J0X2luaXRfY29uZihzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIGludCBpd2xfbXZtX3J4X2J0X2NvZXhfbm90aWYoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCSAgICAgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCkBAIC05MzYsOSArOTYzLDEwIEBACiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiBib29sIGl3bF9tdm1fYnRfY29leF9pc19taW1vX2FsbG93ZWQoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOworYm9vbCBpd2xfbXZtX2J0X2NvZXhfaXNfdHBjX2FsbG93ZWQoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKIHU4IGl3bF9tdm1fYnRfY29leF90eF9wcmlvKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIHU4IGFjKTsKLWludCBpd2xfbXZtX2J0X2NvZXhfcmVkdWNlZF90eHAoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggc3RhX2lkLCBib29sIGVuYWJsZSk7CiAKIGVudW0gaXdsX2J0X2tpbGxfbXNrIHsKIAlCVF9LSUxMX01TS19ERUZBVUxULApAQCAtOTY5LDE3ICs5OTcsMTEgQEAKIGludCBpd2xfbXZtX2Rpc2FibGVfYmVhY29uX2ZpbHRlcihzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgIHUzMiBmbGFncyk7Ci1pbnQgaXdsX212bV91cGRhdGVfYmVhY29uX2Fib3J0KHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBlbmFibGUpOwotaW50IGl3bF9tdm1fdXBkYXRlX2JlYWNvbl9maWx0ZXIoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgYm9vbCBmb3JjZSwKLQkJCQkgdTMyIGZsYWdzKTsKLQogLyogU01QUyAqLwogdm9pZCBpd2xfbXZtX3VwZGF0ZV9zbXBzKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJZW51bSBpd2xfbXZtX3NtcHNfdHlwZV9yZXF1ZXN0IHJlcV90eXBlLAogCQkJCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzX3JlcXVlc3QpOworYm9vbCBpd2xfbXZtX3J4X2RpdmVyc2l0eV9hbGxvd2VkKHN0cnVjdCBpd2xfbXZtICptdm0pOwogCiAvKiBMb3cgbGF0ZW5jeSAqLwogaW50IGl3bF9tdm1fdXBkYXRlX2xvd19sYXRlbmN5KHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9udm0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL252bS5jCmluZGV4IGNmMmQwOWYuLjgwOGY3OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL252bS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL252bS5jCkBAIC03NCw2ICs3NCwxMiBAQAogI2RlZmluZSBOVk1fV1JJVEVfT1BDT0RFIDEKICNkZWZpbmUgTlZNX1JFQURfT1BDT0RFIDAKIAorLyogbG9hZCBudm0gY2h1bmsgcmVzcG9uc2UgKi8KK2VudW0geworCVJFQURfTlZNX0NIVU5LX1NVQ0NFRUQgPSAwLAorCVJFQURfTlZNX0NIVU5LX05PVF9WQUxJRF9BRERSRVNTID0gMQorfTsKKwogLyoKICAqIHByZXBhcmUgdGhlIE5WTSBob3N0IGNvbW1hbmQgdy8gdGhlIHBvaW50ZXJzIHRvIHRoZSBudm0gYnVmZmVyCiAgKiBhbmQgc2VuZCBpdCB0byBmdwpAQCAtOTAsNyArOTYsNyBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBOVk1fQUNDRVNTX0NNRCwKIAkJLmxlbiA9IHsgc2l6ZW9mKHN0cnVjdCBpd2xfbnZtX2FjY2Vzc19jbWQpLCBsZW5ndGggfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMgfCBDTURfU0VORF9JTl9SRktJTEwsCisJCS5mbGFncyA9IENNRF9TRU5EX0lOX1JGS0lMTCwKIAkJLmRhdGEgPSB7ICZudm1fYWNjZXNzX2NtZCwgZGF0YSB9LAogCQkvKiBkYXRhIG1heSBjb21lIGZyb20gdm1hbGxvYywgc28gdXNlIF9EVVAgKi8KIAkJLmRhdGFmbGFncyA9IHsgMCwgSVdMX0hDTURfREZMX0RVUCB9LApAQCAtMTEyLDcgKzExOCw3IEBACiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gTlZNX0FDQ0VTU19DTUQsCi0JCS5mbGFncyA9IENNRF9TWU5DIHwgQ01EX1dBTlRfU0tCIHwgQ01EX1NFTkRfSU5fUkZLSUxMLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IgfCBDTURfU0VORF9JTl9SRktJTEwsCiAJCS5kYXRhID0geyAmbnZtX2FjY2Vzc19jbWQsIH0sCiAJfTsKIAlpbnQgcmV0LCBieXRlc19yZWFkLCBvZmZzZXRfcmVhZDsKQEAgLTEzOSwxMCArMTQ1LDI2IEBACiAJb2Zmc2V0X3JlYWQgPSBsZTE2X3RvX2NwdShudm1fcmVzcC0+b2Zmc2V0KTsKIAlyZXNwX2RhdGEgPSBudm1fcmVzcC0+ZGF0YTsKIAlpZiAocmV0KSB7Ci0JCUlXTF9FUlIobXZtLAotCQkJIk5WTSBhY2Nlc3MgY29tbWFuZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgKGRldmljZTogJXMpXG4iLAotCQkJcmV0LCBtdm0tPmNmZy0+bmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7CisJCWlmICgob2Zmc2V0ICE9IDApICYmCisJCSAgICAocmV0ID09IFJFQURfTlZNX0NIVU5LX05PVF9WQUxJRF9BRERSRVNTKSkgeworCQkJLyoKKwkJCSAqIG1lYW5pbmcgb2YgTk9UX1ZBTElEX0FERFJFU1M6CisJCQkgKiBkcml2ZXIgdHJ5IHRvIHJlYWQgY2h1bmsgZnJvbSBhZGRyZXNzIHRoYXQgaXMKKwkJCSAqIG11bHRpcGxlIG9mIDJLIGFuZCBnb3QgYW4gZXJyb3Igc2luY2UgYWRkciBpcyBlbXB0eS4KKwkJCSAqIG1lYW5pbmcgb2YgKG9mZnNldCAhPSAwKTogZHJpdmVyIGFscmVhZHkKKwkJCSAqIHJlYWQgdmFsaWQgZGF0YSBmcm9tIGFub3RoZXIgY2h1bmsgc28gdGhpcyBjYXNlCisJCQkgKiBpcyBub3QgYW4gZXJyb3IuCisJCQkgKi8KKwkJCUlXTF9ERUJVR19FRVBST00obXZtLT50cmFucy0+ZGV2LAorCQkJCQkgIk5WTSBhY2Nlc3MgY29tbWFuZCBmYWlsZWQgb24gb2Zmc2V0IDB4JXggc2luY2UgdGhhdCBzZWN0aW9uIHNpemUgaXMgbXVsdGlwbGUgMktcbiIsCisJCQkJCSBvZmZzZXQpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCUlXTF9ERUJVR19FRVBST00obXZtLT50cmFucy0+ZGV2LAorCQkJCQkgIk5WTSBhY2Nlc3MgY29tbWFuZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgKGRldmljZTogJXMpXG4iLAorCQkJCQkgcmV0LCBtdm0tPmNmZy0+bmFtZSk7CisJCQlyZXQgPSAtRUlPOworCQl9CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTIxMSw5ICsyMzMsOSBAQAogCXdoaWxlIChyZXQgPT0gbGVuZ3RoKSB7CiAJCXJldCA9IGl3bF9udm1fcmVhZF9jaHVuayhtdm0sIHNlY3Rpb24sIG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCUlXTF9FUlIobXZtLAotCQkJCSJDYW5ub3QgcmVhZCBOVk0gZnJvbSBzZWN0aW9uICVkIG9mZnNldCAlZCwgbGVuZ3RoICVkXG4iLAotCQkJCXNlY3Rpb24sIG9mZnNldCwgbGVuZ3RoKTsKKwkJCUlXTF9ERUJVR19FRVBST00obXZtLT50cmFucy0+ZGV2LAorCQkJCQkgIkNhbm5vdCByZWFkIE5WTSBmcm9tIHNlY3Rpb24gJWQgb2Zmc2V0ICVkLCBsZW5ndGggJWRcbiIsCisJCQkJCSBzZWN0aW9uLCBvZmZzZXQsIGxlbmd0aCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCW9mZnNldCArPSByZXQ7CkBAIC0yMzgsMTMgKzI2MCwyMCBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9IGVsc2UgeworCQkvKiBTVyBhbmQgUkVHVUxBVE9SWSBzZWN0aW9ucyBhcmUgbWFuZGF0b3J5ICovCiAJCWlmICghbXZtLT5udm1fc2VjdGlvbnNbTlZNX1NFQ1RJT05fVFlQRV9TV10uZGF0YSB8fAotCQkgICAgIW12bS0+bnZtX3NlY3Rpb25zW05WTV9TRUNUSU9OX1RZUEVfTUFDX09WRVJSSURFXS5kYXRhIHx8CiAJCSAgICAhbXZtLT5udm1fc2VjdGlvbnNbTlZNX1NFQ1RJT05fVFlQRV9SRUdVTEFUT1JZXS5kYXRhKSB7CiAJCQlJV0xfRVJSKG12bSwKIAkJCQkiQ2FuJ3QgcGFyc2UgZW1wdHkgZmFtaWx5IDgwMDAgTlZNIHNlY3Rpb25zXG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CisJCS8qIE1BQ19PVkVSUklERSBvciBhdCBsZWFzdCBIVyBzZWN0aW9uIG11c3QgZXhpc3QgKi8KKwkJaWYgKCFtdm0tPm52bV9zZWN0aW9uc1ttdm0tPmNmZy0+bnZtX2h3X3NlY3Rpb25fbnVtXS5kYXRhICYmCisJCSAgICAhbXZtLT5udm1fc2VjdGlvbnNbTlZNX1NFQ1RJT05fVFlQRV9NQUNfT1ZFUlJJREVdLmRhdGEpIHsKKwkJCUlXTF9FUlIobXZtLAorCQkJCSJDYW4ndCBwYXJzZSBtYWNfYWRkcmVzcywgZW1wdHkgc2VjdGlvbnNcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAKIAlpZiAoV0FSTl9PTighbXZtLT5jZmcpKQpAQCAtMzExLDE2ICszNDAsMTYgQEAKIAkgKiBnZXQgaGVyZSBhZnRlciB0aGF0IHdlIGFzc3VtZSB0aGUgTlZNIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZAogCSAqIHN5bmNocm9ub3VzbHkuCiAJICovCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIGl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZSwKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgbXZtLT5udm1fZmlsZV9uYW1lLAogCQkJICAgICAgIG12bS0+dHJhbnMtPmRldik7CiAJaWYgKHJldCkgewogCQlJV0xfRVJSKG12bSwgIkVSUk9SOiAlcyBpc24ndCBhdmFpbGFibGUgJWRcbiIsCi0JCQlpd2x3aWZpX21vZF9wYXJhbXMubnZtX2ZpbGUsIHJldCk7CisJCQltdm0tPm52bV9maWxlX25hbWUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJSVdMX0lORk8obXZtLCAiTG9hZGVkIE5WTSBmaWxlICVzICglenUgYnl0ZXMpXG4iLAotCQkgaXdsd2lmaV9tb2RfcGFyYW1zLm52bV9maWxlLCBmd19lbnRyeS0+c2l6ZSk7CisJCSBtdm0tPm52bV9maWxlX25hbWUsIGZ3X2VudHJ5LT5zaXplKTsKIAogCWlmIChmd19lbnRyeS0+c2l6ZSA8IHNpemVvZigqZmlsZV9zZWMpKSB7CiAJCUlXTF9FUlIobXZtLCAiTlZNIGZpbGUgdG9vIHNtYWxsXG4iKTsKQEAgLTQyNyw1MyArNDU2LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bF9udm1faW5pdChzdHJ1Y3QgaXdsX212bSAqbXZtKQoraW50IGl3bF9udm1faW5pdChzdHJ1Y3QgaXdsX212bSAqbXZtLCBib29sIHJlYWRfbnZtX2Zyb21fbmljKQogewotCWludCByZXQsIGksIHNlY3Rpb247CisJaW50IHJldCwgc2VjdGlvbjsKIAl1OCAqbnZtX2J1ZmZlciwgKnRlbXA7Ci0JaW50IG52bV90b19yZWFkW05WTV9NQVhfTlVNX1NFQ1RJT05TXTsKLQlpbnQgbnVtX29mX3NlY3Rpb25zX3RvX3JlYWQ7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKG12bS0+Y2ZnLT5udm1faHdfc2VjdGlvbl9udW0gPj0gTlZNX01BWF9OVU1fU0VDVElPTlMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGxvYWQgZXh0ZXJuYWwgTlZNIGlmIGNvbmZpZ3VyZWQgKi8KLQlpZiAoaXdsd2lmaV9tb2RfcGFyYW1zLm52bV9maWxlKSB7Ci0JCS8qIG1vdmUgdG8gRXh0ZXJuYWwgTlZNIGZsb3cgKi8KLQkJcmV0ID0gaXdsX212bV9yZWFkX2V4dGVybmFsX252bShtdm0pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQkvKiBsaXN0IG9mIE5WTSBzZWN0aW9ucyB3ZSBhcmUgYWxsb3dlZC9uZWVkIHRvIHJlYWQgKi8KLQkJaWYgKG12bS0+dHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKSB7Ci0JCQludm1fdG9fcmVhZFswXSA9IG12bS0+Y2ZnLT5udm1faHdfc2VjdGlvbl9udW07Ci0JCQludm1fdG9fcmVhZFsxXSA9IE5WTV9TRUNUSU9OX1RZUEVfU1c7Ci0JCQludm1fdG9fcmVhZFsyXSA9IE5WTV9TRUNUSU9OX1RZUEVfQ0FMSUJSQVRJT047Ci0JCQludm1fdG9fcmVhZFszXSA9IE5WTV9TRUNUSU9OX1RZUEVfUFJPRFVDVElPTjsKLQkJCW51bV9vZl9zZWN0aW9uc190b19yZWFkID0gNDsKLQkJfSBlbHNlIHsKLQkJCW52bV90b19yZWFkWzBdID0gTlZNX1NFQ1RJT05fVFlQRV9TVzsKLQkJCW52bV90b19yZWFkWzFdID0gTlZNX1NFQ1RJT05fVFlQRV9DQUxJQlJBVElPTjsKLQkJCW52bV90b19yZWFkWzJdID0gTlZNX1NFQ1RJT05fVFlQRV9QUk9EVUNUSU9OOwotCQkJbnZtX3RvX3JlYWRbM10gPSBOVk1fU0VDVElPTl9UWVBFX1JFR1VMQVRPUlk7Ci0JCQludm1fdG9fcmVhZFs0XSA9IE5WTV9TRUNUSU9OX1RZUEVfTUFDX09WRVJSSURFOwotCQkJbnVtX29mX3NlY3Rpb25zX3RvX3JlYWQgPSA1OwotCQl9Ci0KKwkvKiBsb2FkIE5WTSB2YWx1ZXMgZnJvbSBuaWMgKi8KKwlpZiAocmVhZF9udm1fZnJvbV9uaWMpIHsKIAkJLyogUmVhZCBGcm9tIEZXIE5WTSAqLwogCQlJV0xfREVCVUdfRUVQUk9NKG12bS0+dHJhbnMtPmRldiwgIlJlYWQgZnJvbSBOVk1cbiIpOwogCi0JCS8qIFRPRE86IGZpbmQgY29ycmVjdCBOVk0gbWF4IHNpemUgZm9yIGEgc2VjdGlvbiAqLwogCQludm1fYnVmZmVyID0ga21hbGxvYyhtdm0tPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplLAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbnZtX2J1ZmZlcikKIAkJCXJldHVybiAtRU5PTUVNOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX3NlY3Rpb25zX3RvX3JlYWQ7IGkrKykgewotCQkJc2VjdGlvbiA9IG52bV90b19yZWFkW2ldOworCQlmb3IgKHNlY3Rpb24gPSAwOyBzZWN0aW9uIDwgTlZNX01BWF9OVU1fU0VDVElPTlM7IHNlY3Rpb24rKykgewogCQkJLyogd2Ugb3ZlcnJpZGUgdGhlIGNvbnN0bmVzcyBmb3IgaW5pdGlhbCByZWFkICovCiAJCQlyZXQgPSBpd2xfbnZtX3JlYWRfc2VjdGlvbihtdm0sIHNlY3Rpb24sIG52bV9idWZmZXIpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJYnJlYWs7CisJCQkJY29udGludWU7CiAJCQl0ZW1wID0ga21lbWR1cChudm1fYnVmZmVyLCByZXQsIEdGUF9LRVJORUwpOwogCQkJaWYgKCF0ZW1wKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKQEAgLTUwMiwxNSArNTA2LDIxIEBACiAJCQkJCW12bS0+bnZtX2h3X2Jsb2Iuc2l6ZSA9IHJldDsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCVdBUk4oMSwgInNlY3Rpb246ICVkIiwgc2VjdGlvbik7CiAJCQl9CiAjZW5kaWYKIAkJfQogCQlrZnJlZShudm1fYnVmZmVyKTsKLQkJaWYgKHJldCA8IDApCisJfQorCisJLyogbG9hZCBleHRlcm5hbCBOVk0gaWYgY29uZmlndXJlZCAqLworCWlmIChtdm0tPm52bV9maWxlX25hbWUpIHsKKwkJLyogbW92ZSB0byBFeHRlcm5hbCBOVk0gZmxvdyAqLworCQlyZXQgPSBpd2xfbXZtX3JlYWRfZXh0ZXJuYWxfbnZtKG12bSk7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qIHBhcnNlIHRoZSByZWxldmFudCBudm0gc2VjdGlvbnMgKi8KIAltdm0tPm52bV9kYXRhID0gaXdsX3BhcnNlX252bV9zZWN0aW9ucyhtdm0pOwogCWlmICghbXZtLT5udm1fZGF0YSkKIAkJcmV0dXJuIC1FTk9EQVRBOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vb3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9vcHMuYwppbmRleCA5NTQ1ZDdmLi5jYzJmN2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9vcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9vcHMuYwpAQCAtNzksOCArNzksOCBAQAogI2luY2x1ZGUgIml3bC1wcnBoLmgiCiAjaW5jbHVkZSAicnMuaCIKICNpbmNsdWRlICJmdy1hcGktc2Nhbi5oIgotI2luY2x1ZGUgImZ3LWVycm9yLWR1bXAuaCIKICNpbmNsdWRlICJ0aW1lLWV2ZW50LmgiCisjaW5jbHVkZSAiaXdsLWZ3LWVycm9yLWR1bXAuaCIKIAogLyoKICAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KQEAgLTIyMCw3ICsyMjAsNyBAQAogCVJYX0hBTkRMRVIoQkFfTk9USUYsIGl3bF9tdm1fcnhfYmFfbm90aWYsIGZhbHNlKSwKIAogCVJYX0hBTkRMRVIoQlRfUFJPRklMRV9OT1RJRklDQVRJT04sIGl3bF9tdm1fcnhfYnRfY29leF9ub3RpZiwgdHJ1ZSksCi0JUlhfSEFORExFUihCRUFDT05fTk9USUZJQ0FUSU9OLCBpd2xfbXZtX3J4X2JlYWNvbl9ub3RpZiwgZmFsc2UpLAorCVJYX0hBTkRMRVIoQkVBQ09OX05PVElGSUNBVElPTiwgaXdsX212bV9yeF9iZWFjb25fbm90aWYsIHRydWUpLAogCVJYX0hBTkRMRVIoU1RBVElTVElDU19OT1RJRklDQVRJT04sIGl3bF9tdm1fcnhfc3RhdGlzdGljcywgdHJ1ZSksCiAJUlhfSEFORExFUihBTlRFTk5BX0NPVVBMSU5HX05PVElGSUNBVElPTiwKIAkJICAgaXdsX212bV9yeF9hbnRfY291cGxpbmdfbm90aWYsIHRydWUpLApAQCAtNDAyLDYgKzQwMiw3IEBACiAJbXZtLT5zZl9zdGF0ZSA9IFNGX1VOSU5JVDsKIAogCW11dGV4X2luaXQoJm12bS0+bXV0ZXgpOworCW11dGV4X2luaXQoJm12bS0+ZDBpM19zdXNwZW5kX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmbXZtLT5hc3luY19oYW5kbGVyc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbXZtLT50aW1lX2V2ZW50X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZtdm0tPmFzeW5jX2hhbmRsZXJzX2xpc3QpOwpAQCAtNDY1LDEzICs0NjYsMjQgQEAKIAogCW1pbl9iYWNrb2ZmID0gY2FsY19taW5fYmFja29mZih0cmFucywgY2ZnKTsKIAlpd2xfbXZtX3R0X2luaXRpYWxpemUobXZtLCBtaW5fYmFja29mZik7CisJLyogc2V0IHRoZSBudm1fZmlsZV9uYW1lIGFjY29yZGluZyB0byBwcmlvcml0eSAqLworCWlmIChpd2x3aWZpX21vZF9wYXJhbXMubnZtX2ZpbGUpCisJCW12bS0+bnZtX2ZpbGVfbmFtZSA9IGl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZTsKKwllbHNlCisJCW12bS0+bnZtX2ZpbGVfbmFtZSA9IG12bS0+Y2ZnLT5kZWZhdWx0X252bV9maWxlOworCisJaWYgKFdBUk4oY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCAmJiAhbXZtLT5udm1fZmlsZV9uYW1lLAorCQkgIm5vdCBhbGxvd2luZyBwb3dlci11cCBhbmQgbm90IGhhdmluZyBudm1fZmlsZVxuIikpCisJCWdvdG8gb3V0X2ZyZWU7CiAKIAkvKgotCSAqIElmIHRoZSBOVk0gZXhpc3RzIGluIGFuIGV4dGVybmFsIGZpbGUsCi0JICogdGhlcmUgaXMgbm8gbmVlZCB0byB1bm5lY2Vzc2FyaWx5IHBvd2VyIHVwIHRoZSBOSUMgYXQgZHJpdmVyIGxvYWQKKwkgKiBFdmVuIGlmIG52bSBleGlzdHMgaW4gdGhlIG52bV9maWxlIGRyaXZlciBzaG91bGQgcmVhZCBhZ2luIHRoZSBudm0KKwkgKiBmcm9tIHRoZSBuaWMgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBlbnRyaWVzIHRoYXQgZXhpc3QgaW4gdGhlIE9UUAorCSAqIGFuZCBub3QgaW4gdGhlIGZpbGUuCisJICogZm9yIG5pY3Mgd2l0aCBub19wb3dlcl91cF9uaWNfaW5faW5pdDogcmVseSBjb21wbGV0bGV5IG9uIG52bV9maWxlCiAJICovCi0JaWYgKGl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZSkgewotCQllcnIgPSBpd2xfbnZtX2luaXQobXZtKTsKKwlpZiAoY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCAmJiBtdm0tPm52bV9maWxlX25hbWUpIHsKKwkJZXJyID0gaXdsX252bV9pbml0KG12bSwgZmFsc2UpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfZnJlZTsKIAl9IGVsc2UgewpAQCAtNTE4LDcgKzUzMCw3IEBACiAgb3V0X2ZyZWU6CiAJaXdsX3BoeV9kYl9mcmVlKG12bS0+cGh5X2RiKTsKIAlrZnJlZShtdm0tPnNjYW5fY21kKTsKLQlpZiAoIWl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZSkKKwlpZiAoIWNmZy0+bm9fcG93ZXJfdXBfbmljX2luX2luaXQgfHwgIW12bS0+bnZtX2ZpbGVfbmFtZSkKIAkJaXdsX3RyYW5zX29wX21vZGVfbGVhdmUodHJhbnMpOwogCWllZWU4MDIxMV9mcmVlX2h3KG12bS0+aHcpOwogCXJldHVybiBOVUxMOwpAQCAtNTM4LDYgKzU1MCw3IEBACiAJa2ZyZWUobXZtLT5zY2FuX2NtZCk7CiAJdmZyZWUobXZtLT5md19lcnJvcl9kdW1wKTsKIAlrZnJlZShtdm0tPmZ3X2Vycm9yX3NyYW0pOworCWtmcmVlKG12bS0+ZndfZXJyb3JfcnhmKTsKIAlrZnJlZShtdm0tPm1jYXN0X2ZpbHRlcl9jbWQpOwogCW12bS0+bWNhc3RfZmlsdGVyX2NtZCA9IE5VTEw7CiAKQEAgLTgxNCw2ICs4MjcsNyBAQAogCXN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF9maWxlICpkdW1wX2ZpbGU7CiAJc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX2RhdGEgKmR1bXBfZGF0YTsKIAl1MzIgZmlsZV9sZW47CisJdTMyIHRyYW5zX2xlbjsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCkBAIC04MjEsOCArODM1LDEzIEBACiAJCXJldHVybjsKIAogCWZpbGVfbGVuID0gbXZtLT5md19lcnJvcl9zcmFtX2xlbiArCisJCSAgIG12bS0+ZndfZXJyb3JfcnhmX2xlbiArCiAJCSAgIHNpemVvZigqZHVtcF9maWxlKSArCi0JCSAgIHNpemVvZigqZHVtcF9kYXRhKTsKKwkJICAgc2l6ZW9mKCpkdW1wX2RhdGEpICogMjsKKworCXRyYW5zX2xlbiA9IGl3bF90cmFuc19kdW1wX2RhdGEobXZtLT50cmFucywgTlVMTCwgMCk7CisJaWYgKHRyYW5zX2xlbikKKwkJZmlsZV9sZW4gKz0gdHJhbnNfbGVuOwogCiAJZHVtcF9maWxlID0gdm1hbGxvYyhmaWxlX2xlbik7CiAJaWYgKCFkdW1wX2ZpbGUpCkBAIC04MzMsNyArODUyLDEyIEBACiAJZHVtcF9maWxlLT5iYXJrZXIgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9CQVJLRVIpOwogCWR1bXBfZmlsZS0+ZmlsZV9sZW4gPSBjcHVfdG9fbGUzMihmaWxlX2xlbik7CiAJZHVtcF9kYXRhID0gKHZvaWQgKilkdW1wX2ZpbGUtPmRhdGE7Ci0JZHVtcF9kYXRhLT50eXBlID0gSVdMX0ZXX0VSUk9SX0RVTVBfU1JBTTsKKwlkdW1wX2RhdGEtPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9SWEYpOworCWR1bXBfZGF0YS0+bGVuID0gY3B1X3RvX2xlMzIobXZtLT5md19lcnJvcl9yeGZfbGVuKTsKKwltZW1jcHkoZHVtcF9kYXRhLT5kYXRhLCBtdm0tPmZ3X2Vycm9yX3J4ZiwgbXZtLT5md19lcnJvcl9yeGZfbGVuKTsKKworCWR1bXBfZGF0YSA9IGl3bF9tdm1fZndfZXJyb3JfbmV4dF9kYXRhKGR1bXBfZGF0YSk7CisJZHVtcF9kYXRhLT50eXBlID0gY3B1X3RvX2xlMzIoSVdMX0ZXX0VSUk9SX0RVTVBfU1JBTSk7CiAJZHVtcF9kYXRhLT5sZW4gPSBjcHVfdG9fbGUzMihtdm0tPmZ3X2Vycm9yX3NyYW1fbGVuKTsKIAogCS8qCkBAIC04NDIsNiArODY2LDIzIEBACiAJICogbXZtLT5md19lcnJvcl9zcmFtIHJpZ2h0IG5vdy4KIAkgKi8KIAltZW1jcHkoZHVtcF9kYXRhLT5kYXRhLCBtdm0tPmZ3X2Vycm9yX3NyYW0sIG12bS0+ZndfZXJyb3Jfc3JhbV9sZW4pOworCisJa2ZyZWUobXZtLT5md19lcnJvcl9yeGYpOworCW12bS0+ZndfZXJyb3JfcnhmID0gTlVMTDsKKwltdm0tPmZ3X2Vycm9yX3J4Zl9sZW4gPSAwOworCisJa2ZyZWUobXZtLT5md19lcnJvcl9zcmFtKTsKKwltdm0tPmZ3X2Vycm9yX3NyYW0gPSBOVUxMOworCW12bS0+ZndfZXJyb3Jfc3JhbV9sZW4gPSAwOworCisJaWYgKHRyYW5zX2xlbikgeworCQl2b2lkICpidWYgPSBpd2xfbXZtX2Z3X2Vycm9yX25leHRfZGF0YShkdW1wX2RhdGEpOworCQl1MzIgcmVhbF90cmFuc19sZW4gPSBpd2xfdHJhbnNfZHVtcF9kYXRhKG12bS0+dHJhbnMsIGJ1ZiwKKwkJCQkJCQkgdHJhbnNfbGVuKTsKKwkJZHVtcF9kYXRhID0gKHZvaWQgKikoKHU4ICopYnVmICsgcmVhbF90cmFuc19sZW4pOworCQlkdW1wX2ZpbGUtPmZpbGVfbGVuID0KKwkJCWNwdV90b19sZTMyKGZpbGVfbGVuIC0gdHJhbnNfbGVuICsgcmVhbF90cmFuc19sZW4pOworCX0KIH0KICNlbmRpZgogCkBAIC04NTMsNiArODk0LDcgQEAKIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAlpd2xfbXZtX2Z3X2Vycm9yX3NyYW1fZHVtcChtdm0pOworCWl3bF9tdm1fZndfZXJyb3JfcnhmX2R1bXAobXZtKTsKICNlbmRpZgogCiAJaXdsX212bV9uaWNfcmVzdGFydChtdm0pOwpAQCAtMTEyNiw5ICsxMTY4LDkgQEAKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0gY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgaXdsX212bSwgZDBpM19leGl0X3dvcmspOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgZ2V0X3N0YXR1c19jbWQgPSB7CiAJCS5pZCA9IFdPV0xBTl9HRVRfU1RBVFVTRVMsCi0JCS5mbGFncyA9IENNRF9TWU5DIHwgQ01EX0hJR0hfUFJJTyB8IENNRF9XQU5UX1NLQiwKKwkJLmZsYWdzID0gQ01EX0hJR0hfUFJJTyB8IENNRF9XQU5UX1NLQiwKIAl9OwotCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1c192NiAqc3RhdHVzOworCXN0cnVjdCBpd2xfd293bGFuX3N0YXR1cyAqc3RhdHVzOwogCWludCByZXQ7CiAJdTMyIGRpc2Nvbm5lY3Rpb25fcmVhc29ucywgd2FrZXVwX3JlYXNvbnM7CiAJX19sZTE2ICpxb3Nfc2VxID0gTlVMTDsKQEAgLTExNTgsMTggKzEyMDAsMjcgQEAKIAlpd2xfZnJlZV9yZXNwKCZnZXRfc3RhdHVzX2NtZCk7CiBvdXQ6CiAJaXdsX212bV9kMGkzX2VuYWJsZV90eChtdm0sIHFvc19zZXEpOworCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9FWElUX1dPUkspOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX212bV9leGl0X2QwaTMoc3RydWN0IGl3bF9vcF9tb2RlICpvcF9tb2RlKQoraW50IF9pd2xfbXZtX2V4aXRfZDBpMyhzdHJ1Y3QgaXdsX212bSAqbXZtKQogewotCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOwogCXUzMiBmbGFncyA9IENNRF9BU1lOQyB8IENNRF9ISUdIX1BSSU8gfCBDTURfU0VORF9JTl9JRExFIHwKIAkJICAgIENNRF9XQUtFX1VQX1RSQU5TOwogCWludCByZXQ7CiAKIAlJV0xfREVCVUdfUlBNKG12bSwgIk1WTSBleGl0aW5nIEQwaTNcbiIpOwogCisJbXV0ZXhfbG9jaygmbXZtLT5kMGkzX3N1c3BlbmRfbXV0ZXgpOworCWlmICh0ZXN0X2JpdChEMEkzX0RFRkVSX1dBS0VVUCwgJm12bS0+ZDBpM19zdXNwZW5kX2ZsYWdzKSkgeworCQlJV0xfREVCVUdfUlBNKG12bSwgIkRlZmVycmluZyBkMGkzIGV4aXQgdW50aWwgcmVzdW1lXG4iKTsKKwkJX19zZXRfYml0KEQwSTNfUEVORElOR19XQUtFVVAsICZtdm0tPmQwaTNfc3VzcGVuZF9mbGFncyk7CisJCW11dGV4X3VubG9jaygmbXZtLT5kMGkzX3N1c3BlbmRfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtdm0tPmQwaTNfc3VzcGVuZF9tdXRleCk7CisKIAlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEQwSTNfRU5EX0NNRCwgZmxhZ3MsIDAsIE5VTEwpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtMTE4Myw2ICsxMjM0LDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBpd2xfbXZtX2V4aXRfZDBpMyhzdHJ1Y3QgaXdsX29wX21vZGUgKm9wX21vZGUpCit7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9PUF9NT0RFX0dFVF9NVk0ob3BfbW9kZSk7CisKKwlpd2xfbXZtX3JlZihtdm0sIElXTF9NVk1fUkVGX0VYSVRfV09SSyk7CisJcmV0dXJuIF9pd2xfbXZtX2V4aXRfZDBpMyhtdm0pOworfQorCitzdGF0aWMgdm9pZCBpd2xfbXZtX25hcGlfYWRkKHN0cnVjdCBpd2xfb3BfbW9kZSAqb3BfbW9kZSwKKwkJCSAgICAgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmFwaV9kZXYsCisJCQkgICAgIGludCAoKnBvbGwpKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpLAorCQkJICAgICBpbnQgd2VpZ2h0KQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOworCisJaWVlZTgwMjExX25hcGlfYWRkKG12bS0+aHcsIG5hcGksIG5hcGlfZGV2LCBwb2xsLCB3ZWlnaHQpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcF9tb2RlX29wcyBpd2xfbXZtX29wcyA9IHsKIAkuc3RhcnQgPSBpd2xfb3BfbW9kZV9tdm1fc3RhcnQsCiAJLnN0b3AgPSBpd2xfb3BfbW9kZV9tdm1fc3RvcCwKQEAgLTExOTYsNCArMTI2Niw1IEBACiAJLm5pY19jb25maWcgPSBpd2xfbXZtX25pY19jb25maWcsCiAJLmVudGVyX2QwaTMgPSBpd2xfbXZtX2VudGVyX2QwaTMsCiAJLmV4aXRfZDBpMyA9IGl3bF9tdm1fZXhpdF9kMGkzLAorCS5uYXBpX2FkZCA9IGl3bF9tdm1fbmFwaV9hZGQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcGh5LWN0eHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3BoeS1jdHh0LmMKaW5kZXggMjM3ZWZlMC4uNTM5ZjNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcGh5LWN0eHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9waHktY3R4dC5jCkBAIC0xNTYsNiArMTU2LDE4IEBACiAJaWRsZV9jbnQgPSBjaGFpbnNfc3RhdGljOwogCWFjdGl2ZV9jbnQgPSBjaGFpbnNfZHluYW1pYzsKIAorCS8qIEluIHNjZW5hcmlvcyB3aGVyZSB3ZSBvbmx5IGV2ZXIgdXNlIGEgc2luZ2xlLXN0cmVhbSByYXRlcywKKwkgKiBpLmUuIGxlZ2FjeSAxMWIvZy9hIGFzc29jaWF0aW9ucywgc2luZ2xlLXN0cmVhbSBBUHMgb3IgZXZlbgorCSAqIHN0YXRpYyBTTVBTLCBlbmFibGUgYm90aCBjaGFpbnMgdG8gZ2V0IGRpdmVyc2l0eSwgaW1wcm92aW5nCisJICogdGhlIGNhc2Ugd2hlcmUgd2UncmUgZmFyIGVub3VnaCBmcm9tIHRoZSBBUCB0aGF0IGF0dGVudWF0aW9uCisJICogYmV0d2VlbiB0aGUgdHdvIGFudGVubmFzIGlzIHN1ZmZpY2llbnRseSBkaWZmZXJlbnQgdG8gaW1wYWN0CisJICogcGVyZm9ybWFuY2UuCisJICovCisJaWYgKGFjdGl2ZV9jbnQgPT0gMSAmJiBpd2xfbXZtX3J4X2RpdmVyc2l0eV9hbGxvd2VkKG12bSkpIHsKKwkJaWRsZV9jbnQgPSAyOworCQlhY3RpdmVfY250ID0gMjsKKwl9CisKIAljbWQtPnJ4Y2hhaW5faW5mbyA9IGNwdV90b19sZTMyKG12bS0+ZnctPnZhbGlkX3J4X2FudCA8PAogCQkJCQlQSFlfUlhfQ0hBSU5fVkFMSURfUE9TKTsKIAljbWQtPnJ4Y2hhaW5faW5mbyB8PSBjcHVfdG9fbGUzMihpZGxlX2NudCA8PCBQSFlfUlhfQ0hBSU5fQ05UX1BPUyk7CkBAIC0xODcsNyArMTk5LDcgQEAKIAlpd2xfbXZtX3BoeV9jdHh0X2NtZF9kYXRhKG12bSwgJmNtZCwgY2hhbmRlZiwKIAkJCQkgIGNoYWluc19zdGF0aWMsIGNoYWluc19keW5hbWljKTsKIAotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgUEhZX0NPTlRFWFRfQ01ELCBDTURfU1lOQywKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFBIWV9DT05URVhUX0NNRCwgMCwKIAkJCQkgICBzaXplb2Yoc3RydWN0IGl3bF9waHlfY29udGV4dF9jbWQpLAogCQkJCSAgICZjbWQpOwogCWlmIChyZXQpCkBAIC0yMDIsMTggKzIxNCwxNSBAQAogCQkJIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKIAkJCSB1OCBjaGFpbnNfc3RhdGljLCB1OCBjaGFpbnNfZHluYW1pYykKIHsKLQlpbnQgcmV0OwotCiAJV0FSTl9PTighdGVzdF9iaXQoSVdMX01WTV9TVEFUVVNfSU5fSFdfUkVTVEFSVCwgJm12bS0+c3RhdHVzKSAmJgogCQljdHh0LT5yZWYpOwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCiAJY3R4dC0+Y2hhbm5lbCA9IGNoYW5kZWYtPmNoYW47Ci0JcmV0ID0gaXdsX212bV9waHlfY3R4dF9hcHBseShtdm0sIGN0eHQsIGNoYW5kZWYsCi0JCQkJICAgICBjaGFpbnNfc3RhdGljLCBjaGFpbnNfZHluYW1pYywKLQkJCQkgICAgIEZXX0NUWFRfQUNUSU9OX0FERCwgMCk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBpd2xfbXZtX3BoeV9jdHh0X2FwcGx5KG12bSwgY3R4dCwgY2hhbmRlZiwKKwkJCQkgICAgICBjaGFpbnNfc3RhdGljLCBjaGFpbnNfZHluYW1pYywKKwkJCQkgICAgICBGV19DVFhUX0FDVElPTl9BREQsIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3Bvd2VyLmMKaW5kZXggNmI2MzZlYS4uYzE4MmE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9wb3dlci5jCkBAIC0xMjMsMjggKzEyMyw2IEBACiAJY21kLT5iYV9lbmFibGVfYmVhY29uX2Fib3J0ID0gY3B1X3RvX2xlMzIobXZtdmlmLT5iZl9kYXRhLmJhX2VuYWJsZWQpOwogfQogCi1pbnQgaXdsX212bV91cGRhdGVfYmVhY29uX2Fib3J0KHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7Ci0Jc3RydWN0IGl3bF9iZWFjb25fZmlsdGVyX2NtZCBjbWQgPSB7Ci0JCUlXTF9CRl9DTURfQ09ORklHX0RFRkFVTFRTLAotCQkuYmZfZW5hYmxlX2JlYWNvbl9maWx0ZXIgPSBjcHVfdG9fbGUzMigxKSwKLQkJLmJhX2VuYWJsZV9iZWFjb25fYWJvcnQgPSBjcHVfdG9fbGUzMihlbmFibGUpLAotCX07Ci0KLQlpZiAoIW12bXZpZi0+YmZfZGF0YS5iZl9lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChtdm0tPmN1cl91Y29kZSA9PSBJV0xfVUNPREVfV09XTEFOKQotCQljbWQuYmFfZXNjYXBlX3RpbWVyID0gY3B1X3RvX2xlMzIoSVdMX0JBX0VTQ0FQRV9USU1FUl9EMyk7Ci0KLQltdm12aWYtPmJmX2RhdGEuYmFfZW5hYmxlZCA9IGVuYWJsZTsKLQlpd2xfbXZtX2JlYWNvbl9maWx0ZXJfc2V0X2NxbV9wYXJhbXMobXZtLCB2aWYsICZjbWQpOwotCWl3bF9tdm1fYmVhY29uX2ZpbHRlcl9kZWJ1Z2ZzX3BhcmFtZXRlcnModmlmLCAmY21kKTsKLQlyZXR1cm4gaXdsX212bV9iZWFjb25fZmlsdGVyX3NlbmRfY21kKG12bSwgJmNtZCwgQ01EX1NZTkMpOwotfQotCiBzdGF0aWMgdm9pZCBpd2xfbXZtX3Bvd2VyX2xvZyhzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJICAgICAgc3RydWN0IGl3bF9tYWNfcG93ZXJfY21kICpjbWQpCiB7CkBAIC0yNjgsNiArMjQ2LDU3IEBACiAJCUlXTF9NVk1fUFNfSEVBVllfUlhfVEhMRF9QRVJDRU5UOwogfQogCitzdGF0aWMgdm9pZCBpd2xfbXZtX2JpbmRpbmdfaXRlcmF0b3Iodm9pZCAqX2RhdGEsIHU4ICptYWMsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwl1bnNpZ25lZCBsb25nICpkYXRhID0gX2RhdGE7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisKKwlpZiAoIW12bXZpZi0+cGh5X2N0eHQpCisJCXJldHVybjsKKworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCV9fc2V0X2JpdChtdm12aWYtPnBoeV9jdHh0LT5pZCwgZGF0YSk7Cit9CisKK3N0YXRpYyBib29sIGl3bF9tdm1fcG93ZXJfYWxsb3dfdWFwc2Qoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKKwl1bnNpZ25lZCBsb25nIHBoeV9jdHh0X2NvdW50ZXIgPSAwOworCisJaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKG12bS0+aHcsCisJCQkJCQkgICBJRUVFODAyMTFfSUZBQ0VfSVRFUl9OT1JNQUwsCisJCQkJCQkgICBpd2xfbXZtX2JpbmRpbmdfaXRlcmF0b3IsCisJCQkJCQkgICAmcGh5X2N0eHRfY291bnRlcik7CisKKwlpZiAoIW1lbWNtcChtdm12aWYtPnVhcHNkX21pc2JlaGF2aW5nX2Jzc2lkLCB2aWYtPmJzc19jb25mLmJzc2lkLAorCQkgICAgRVRIX0FMRU4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodmlmLT5wMnAgJiYKKwkgICAgIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUFNfVUFQU0QpKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgKiBBdm9pZCB1c2luZyB1QVBTRCBpZiBQMlAgY2xpZW50IGlzIGFzc29jaWF0ZWQgdG8gR08gdGhhdCB1c2VzCisJICogb3Bwb3J0dW5pc3RpYyBwb3dlciBzYXZlLiBUaGlzIGlzIGR1ZSB0byBjdXJyZW50IEZXIGxpbWl0YXRpb24uCisJICovCisJaWYgKHZpZi0+cDJwICYmCisJICAgICh2aWYtPmJzc19jb25mLnAycF9ub2FfYXR0ci5vcHBwc19jdHdpbmRvdyAmCisJICAgIElFRUU4MDIxMV9QMlBfT1BQUFNfRU5BQkxFX0JJVCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogQXZvaWQgdXNpbmcgdUFQU0QgaWYgY2xpZW50IGlzIGluIERDTSAtCisJICogbG93IGxhdGVuY3kgaXNzdWUgaW4gTWlyYWNhc3QKKwkgKi8KKwlpZiAoaHdlaWdodDgocGh5X2N0eHRfY291bnRlcikgPj0gMikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkIGl3bF9tdm1fcG93ZXJfYnVpbGRfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgIHN0cnVjdCBpd2xfbWFjX3Bvd2VyX2NtZCAqY21kKQpAQCAtMjgwLDcgKzMwOSw2IEBACiAJYm9vbCByYWRhcl9kZXRlY3QgPSBmYWxzZTsKIAlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiBfX21heWJlX3VudXNlZCA9CiAJCWl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKLQlib29sIGFsbG93X3VhcHNkID0gdHJ1ZTsKIAogCWNtZC0+aWRfYW5kX2NvbG9yID0gY3B1X3RvX2xlMzIoRldfQ01EX0lEX0FORF9DT0xPUihtdm12aWYtPmlkLAogCQkJCQkJCSAgICBtdm12aWYtPmNvbG9yKSk7CkBAIC0zMDMsMTMgKzMzMSw4IEBACiAKIAljbWQtPmZsYWdzIHw9IGNwdV90b19sZTE2KFBPV0VSX0ZMQUdTX1BPV0VSX1NBVkVfRU5BX01TSyk7CiAKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCi0JaWYgKG12bXZpZi0+ZGJnZnNfcG0ubWFzayAmIE1WTV9ERUJVR0ZTX1BNX0RJU0FCTEVfUE9XRVJfT0ZGICYmCi0JICAgIG12bXZpZi0+ZGJnZnNfcG0uZGlzYWJsZV9wb3dlcl9vZmYpCi0JCWNtZC0+ZmxhZ3MgJj0gY3B1X3RvX2xlMTYoflBPV0VSX0ZMQUdTX1BPV0VSX1NBVkVfRU5BX01TSyk7Ci0jZW5kaWYKIAlpZiAoIXZpZi0+YnNzX2NvbmYucHMgfHwgaXdsX212bV92aWZfbG93X2xhdGVuY3kobXZtdmlmKSB8fAotCSAgICBtdm0tPnBtX2Rpc2FibGVkKQorCSAgICAhbXZtdmlmLT5wbV9lbmFibGVkKQogCQlyZXR1cm47CiAKIAljbWQtPmZsYWdzIHw9IGNwdV90b19sZTE2KFBPV0VSX0ZMQUdTX1BPV0VSX01BTkFHRU1FTlRfRU5BX01TSyk7CkBAIC0zNTEsMjMgKzM3NCw3IEBACiAJCQljcHVfdG9fbGUzMihJV0xfTVZNX1dPV0xBTl9QU19UWF9EQVRBX1RJTUVPVVQpOwogCX0KIAotCWlmICghbWVtY21wKG12bXZpZi0+dWFwc2RfbWlzYmVoYXZpbmdfYnNzaWQsIHZpZi0+YnNzX2NvbmYuYnNzaWQsCi0JCSAgICBFVEhfQUxFTikpCi0JCWFsbG93X3VhcHNkID0gZmFsc2U7Ci0KLQlpZiAodmlmLT5wMnAgJiYKLQkgICAgIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUFNfVUFQU0QpKQotCQlhbGxvd191YXBzZCA9IGZhbHNlOwotCS8qCi0JICogQXZvaWQgdXNpbmcgdUFQU0QgaWYgUDJQIGNsaWVudCBpcyBhc3NvY2lhdGVkIHRvIEdPIHRoYXQgdXNlcwotCSAqIG9wcG9ydHVuaXN0aWMgcG93ZXIgc2F2ZS4gVGhpcyBpcyBkdWUgdG8gY3VycmVudCBGVyBsaW1pdGF0aW9uLgotCSAqLwotCWlmICh2aWYtPnAycCAmJgotCSAgICB2aWYtPmJzc19jb25mLnAycF9ub2FfYXR0ci5vcHBwc19jdHdpbmRvdyAmCi0JICAgIElFRUU4MDIxMV9QMlBfT1BQUFNfRU5BQkxFX0JJVCkKLQkJYWxsb3dfdWFwc2QgPSBmYWxzZTsKLQotCWlmIChhbGxvd191YXBzZCkKKwlpZiAoaXdsX212bV9wb3dlcl9hbGxvd191YXBzZChtdm0sIHZpZikpCiAJCWl3bF9tdm1fcG93ZXJfY29uZmlndXJlX3VhcHNkKG12bSwgdmlmLCBjbWQpOwogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwpAQCAtNDIxLDIwICs0MjgsMTMgQEAKIHsKIAlzdHJ1Y3QgaXdsX21hY19wb3dlcl9jbWQgY21kID0ge307CiAKLQlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCi0JCXJldHVybiAwOwotCi0JaWYgKHZpZi0+cDJwICYmCi0JICAgICEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00pKQotCQlyZXR1cm4gMDsKLQogCWl3bF9tdm1fcG93ZXJfYnVpbGRfY21kKG12bSwgdmlmLCAmY21kKTsKIAlpd2xfbXZtX3Bvd2VyX2xvZyhtdm0sICZjbWQpOwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAltZW1jcHkoJml3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKS0+bWFjX3B3cl9jbWQsICZjbWQsIHNpemVvZihjbWQpKTsKICNlbmRpZgogCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgTUFDX1BNX1BPV0VSX1RBQkxFLCBDTURfU1lOQywKKwlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNQUNfUE1fUE9XRVJfVEFCTEUsIDAsCiAJCQkJICAgIHNpemVvZihjbWQpLCAmY21kKTsKIH0KIApAQCAtNDQ0LDEyICs0NDQsNiBAQAogCQkuZmxhZ3MgPSBjcHVfdG9fbGUxNihERVZJQ0VfUE9XRVJfRkxBR1NfUE9XRVJfU0FWRV9FTkFfTVNLKSwKIAl9OwogCi0JaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUE1fQ01EX1NVUFBPUlQpKQotCQlyZXR1cm4gMDsKLQotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0RFVklDRV9QU19DTUQpKQotCQlyZXR1cm4gMDsKLQogCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgPT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0pCiAJCW12bS0+cHNfZGlzYWJsZWQgPSB0cnVlOwogCkBAIC00NjYsNyArNDYwLDcgQEAKIAkJCSJTZW5kaW5nIGRldmljZSBwb3dlciBjb21tYW5kIHdpdGggZmxhZ3MgPSAweCVYXG4iLAogCQkJY21kLmZsYWdzKTsKIAotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFBPV0VSX1RBQkxFX0NNRCwgQ01EX1NZTkMsIHNpemVvZihjbWQpLAorCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFBPV0VSX1RBQkxFX0NNRCwgMCwgc2l6ZW9mKGNtZCksCiAJCQkJICAgICZjbWQpOwogfQogCkBAIC01MDgsODYgKzUwMiw2OSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgaXdsX3Bvd2VyX2NvbnN0cmFpbnQgeworc3RydWN0IGl3bF9wb3dlcl92aWZzIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqYmZfdmlmOwogCXN0cnVjdCBpZWVlODAyMTFfdmlmICpic3NfdmlmOwogCXN0cnVjdCBpZWVlODAyMTFfdmlmICpwMnBfdmlmOwotCXUxNiBic3NfcGh5Y3R4X2lkOwotCXUxNiBwMnBfcGh5Y3R4X2lkOwotCWJvb2wgcG1fZGlzYWJsZWQ7Ci0JYm9vbCBwc19kaXNhYmxlZDsKLQlzdHJ1Y3QgaXdsX212bSAqbXZtOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICphcF92aWY7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKm1vbml0b3JfdmlmOworCWJvb2wgcDJwX2FjdGl2ZTsKKwlib29sIGJzc19hY3RpdmU7CisJYm9vbCBhcF9hY3RpdmU7CisJYm9vbCBtb25pdG9yX2FjdGl2ZTsKIH07CiAKIHN0YXRpYyB2b2lkIGl3bF9tdm1fcG93ZXJfaXRlcmF0b3Iodm9pZCAqX2RhdGEsIHU4ICptYWMsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKIAlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKLQlzdHJ1Y3QgaXdsX3Bvd2VyX2NvbnN0cmFpbnQgKnBvd2VyX2l0ZXJhdG9yID0gX2RhdGE7Ci0Jc3RydWN0IGl3bF9tdm0gKm12bSA9IHBvd2VyX2l0ZXJhdG9yLT5tdm07CisJc3RydWN0IGl3bF9wb3dlcl92aWZzICpwb3dlcl9pdGVyYXRvciA9IF9kYXRhOwogCisJbXZtdmlmLT5wbV9lbmFibGVkID0gZmFsc2U7CiAJc3dpdGNoIChpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZikpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCWJyZWFrOwogCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJLyogbm8gQlNTIHBvd2VyIG1nbXQgaWYgd2UgaGF2ZSBhbiBhY3RpdmUgQVAgKi8KLQkJaWYgKG12bXZpZi0+YXBfaWJzc19hY3RpdmUpCi0JCQlwb3dlcl9pdGVyYXRvci0+cG1fZGlzYWJsZWQgPSB0cnVlOworCQkvKiBvbmx5IGEgc2luZ2xlIE1BQyBvZiB0aGUgc2FtZSB0eXBlICovCisJCVdBUk5fT04ocG93ZXJfaXRlcmF0b3ItPmFwX3ZpZik7CisJCXBvd2VyX2l0ZXJhdG9yLT5hcF92aWYgPSB2aWY7CisJCWlmIChtdm12aWYtPnBoeV9jdHh0KQorCQkJaWYgKG12bXZpZi0+cGh5X2N0eHQtPmlkIDwgTUFYX1BIWVMpCisJCQkJcG93ZXJfaXRlcmF0b3ItPmFwX2FjdGl2ZSA9IHRydWU7CiAJCWJyZWFrOwogCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQkvKiBubyBCU1MgcG93ZXIgbWdtdCBhbmQgbm8gZGV2aWNlIHBvd2VyIHNhdmUgKi8KLQkJcG93ZXJfaXRlcmF0b3ItPnBtX2Rpc2FibGVkID0gdHJ1ZTsKLQkJcG93ZXJfaXRlcmF0b3ItPnBzX2Rpc2FibGVkID0gdHJ1ZTsKKwkJLyogb25seSBhIHNpbmdsZSBNQUMgb2YgdGhlIHNhbWUgdHlwZSAqLworCQlXQVJOX09OKHBvd2VyX2l0ZXJhdG9yLT5tb25pdG9yX3ZpZik7CisJCXBvd2VyX2l0ZXJhdG9yLT5tb25pdG9yX3ZpZiA9IHZpZjsKKwkJaWYgKG12bXZpZi0+cGh5X2N0eHQpCisJCQlpZiAobXZtdmlmLT5waHlfY3R4dC0+aWQgPCBNQVhfUEhZUykKKwkJCQlwb3dlcl9pdGVyYXRvci0+bW9uaXRvcl9hY3RpdmUgPSB0cnVlOwogCQlicmVhazsKIAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQkJaWYgKG12bXZpZi0+cGh5X2N0eHQpCi0JCQlwb3dlcl9pdGVyYXRvci0+cDJwX3BoeWN0eF9pZCA9IG12bXZpZi0+cGh5X2N0eHQtPmlkOwotCi0JCS8qIHdlIHNob3VsZCBoYXZlIG9ubHkgb25lIFAyUCB2aWYgKi8KKwkJLyogb25seSBhIHNpbmdsZSBNQUMgb2YgdGhlIHNhbWUgdHlwZSAqLwogCQlXQVJOX09OKHBvd2VyX2l0ZXJhdG9yLT5wMnBfdmlmKTsKIAkJcG93ZXJfaXRlcmF0b3ItPnAycF92aWYgPSB2aWY7Ci0KLQkJSVdMX0RFQlVHX1BPV0VSKG12bSwgInAycDogcDJwX2lkPSVkLCBic3NfaWQ9JWRcbiIsCi0JCQkJcG93ZXJfaXRlcmF0b3ItPnAycF9waHljdHhfaWQsCi0JCQkJcG93ZXJfaXRlcmF0b3ItPmJzc19waHljdHhfaWQpOwotCQlpZiAoIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYKLQkJICAgICAgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpIHsKLQkJCS8qIG5vIEJTUyBwb3dlciBtZ210IGlmIHdlIGhhdmUgYSBQMlAgY2xpZW50Ki8KLQkJCXBvd2VyX2l0ZXJhdG9yLT5wbV9kaXNhYmxlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAocG93ZXJfaXRlcmF0b3ItPnAycF9waHljdHhfaWQgPCBNQVhfUEhZUyAmJgotCQkJICAgcG93ZXJfaXRlcmF0b3ItPmJzc19waHljdHhfaWQgPCBNQVhfUEhZUyAmJgotCQkJICAgcG93ZXJfaXRlcmF0b3ItPnAycF9waHljdHhfaWQgPT0KLQkJCSAgIHBvd2VyX2l0ZXJhdG9yLT5ic3NfcGh5Y3R4X2lkKSB7Ci0JCQlwb3dlcl9pdGVyYXRvci0+cG1fZGlzYWJsZWQgPSB0cnVlOwotCQl9CisJCWlmIChtdm12aWYtPnBoeV9jdHh0KQorCQkJaWYgKG12bXZpZi0+cGh5X2N0eHQtPmlkIDwgTUFYX1BIWVMpCisJCQkJcG93ZXJfaXRlcmF0b3ItPnAycF9hY3RpdmUgPSB0cnVlOwogCQlicmVhazsKIAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaWYgKG12bXZpZi0+cGh5X2N0eHQpCi0JCQlwb3dlcl9pdGVyYXRvci0+YnNzX3BoeWN0eF9pZCA9IG12bXZpZi0+cGh5X2N0eHQtPmlkOwotCi0JCS8qIHdlIHNob3VsZCBoYXZlIG9ubHkgb25lIEJTUyB2aWYgKi8KKwkJLyogb25seSBhIHNpbmdsZSBNQUMgb2YgdGhlIHNhbWUgdHlwZSAqLwogCQlXQVJOX09OKHBvd2VyX2l0ZXJhdG9yLT5ic3NfdmlmKTsKIAkJcG93ZXJfaXRlcmF0b3ItPmJzc192aWYgPSB2aWY7CisJCWlmIChtdm12aWYtPnBoeV9jdHh0KQorCQkJaWYgKG12bXZpZi0+cGh5X2N0eHQtPmlkIDwgTUFYX1BIWVMpCisJCQkJcG93ZXJfaXRlcmF0b3ItPmJzc19hY3RpdmUgPSB0cnVlOwogCiAJCWlmIChtdm12aWYtPmJmX2RhdGEuYmZfZW5hYmxlZCAmJgogCQkgICAgIVdBUk5fT04ocG93ZXJfaXRlcmF0b3ItPmJmX3ZpZikpCiAJCQlwb3dlcl9pdGVyYXRvci0+YmZfdmlmID0gdmlmOwogCi0JCUlXTF9ERUJVR19QT1dFUihtdm0sICJic3M6IHAycF9pZD0lZCwgYnNzX2lkPSVkXG4iLAotCQkJCXBvd2VyX2l0ZXJhdG9yLT5wMnBfcGh5Y3R4X2lkLAotCQkJCXBvd2VyX2l0ZXJhdG9yLT5ic3NfcGh5Y3R4X2lkKTsKLQkJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJgotCQkgICAgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSAmJgotCQkJKHBvd2VyX2l0ZXJhdG9yLT5wMnBfcGh5Y3R4X2lkIDwgTUFYX1BIWVMgJiYKLQkJCSBwb3dlcl9pdGVyYXRvci0+YnNzX3BoeWN0eF9pZCA8IE1BWF9QSFlTICYmCi0JCQkgcG93ZXJfaXRlcmF0b3ItPnAycF9waHljdHhfaWQgPT0KLQkJCSBwb3dlcl9pdGVyYXRvci0+YnNzX3BoeWN0eF9pZCkpCi0JCQlwb3dlcl9pdGVyYXRvci0+cG1fZGlzYWJsZWQgPSB0cnVlOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC01OTYsNzAgKzU3Myw3MyBAQAogfQogCiBzdGF0aWMgdm9pZAotaXdsX212bV9wb3dlcl9nZXRfZ2xvYmFsX2NvbnN0cmFpbnQoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkgICAgc3RydWN0IGl3bF9wb3dlcl9jb25zdHJhaW50ICpjb25zdHJhaW50KQoraXdsX212bV9wb3dlcl9zZXRfcG0oc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgc3RydWN0IGl3bF9wb3dlcl92aWZzICp2aWZzKQogeworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqYnNzX212bXZpZiA9IE5VTEw7CisJc3RydWN0IGl3bF9tdm1fdmlmICpwMnBfbXZtdmlmID0gTlVMTDsKKwlzdHJ1Y3QgaXdsX212bV92aWYgKmFwX212bXZpZiA9IE5VTEw7CisJYm9vbCBjbGllbnRfc2FtZV9jaGFubmVsID0gZmFsc2U7CisJYm9vbCBhcF9zYW1lX2NoYW5uZWwgPSBmYWxzZTsKKwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCi0JaWYgKGl3bG12bV9tb2RfcGFyYW1zLnBvd2VyX3NjaGVtZSA9PSBJV0xfUE9XRVJfU0NIRU1FX0NBTSkgewotCQljb25zdHJhaW50LT5wbV9kaXNhYmxlZCA9IHRydWU7Ci0JCWNvbnN0cmFpbnQtPnBzX2Rpc2FibGVkID0gdHJ1ZTsKLQl9Ci0KKwkvKiBnZXQgdmlmcyBpbmZvICsgc2V0IHBtX2VuYWJsZSB0byBmYWxzZSAqLwogCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhtdm0tPmh3LAogCQkJCQkgICAgSUVFRTgwMjExX0lGQUNFX0lURVJfTk9STUFMLAotCQkJCQkgICAgaXdsX212bV9wb3dlcl9pdGVyYXRvciwgY29uc3RyYWludCk7Ci19CisJCQkJCSAgICBpd2xfbXZtX3Bvd2VyX2l0ZXJhdG9yLCB2aWZzKTsKIAotaW50IGl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwotCXN0cnVjdCBpd2xfcG93ZXJfY29uc3RyYWludCBjb25zdHJhaW50ID0gewotCQkgICAgLnAycF9waHljdHhfaWQgPSBNQVhfUEhZUywKLQkJICAgIC5ic3NfcGh5Y3R4X2lkID0gTUFYX1BIWVMsCi0JCSAgICAubXZtID0gbXZtLAotCX07Ci0JYm9vbCBiYV9lbmFibGU7Ci0JaW50IHJldDsKKwlpZiAodmlmcy0+YnNzX3ZpZikKKwkJYnNzX212bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmcy0+YnNzX3ZpZik7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKwlpZiAodmlmcy0+cDJwX3ZpZikKKwkJcDJwX212bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmcy0+cDJwX3ZpZik7CiAKLQlpZiAoIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QTV9DTURfU1VQUE9SVCkpCi0JCXJldHVybiAwOworCWlmICh2aWZzLT5hcF92aWYpCisJCWFwX212bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmcy0+YXBfdmlmKTsKIAotCWl3bF9tdm1fcG93ZXJfZ2V0X2dsb2JhbF9jb25zdHJhaW50KG12bSwgJmNvbnN0cmFpbnQpOwotCW12bS0+cHNfZGlzYWJsZWQgPSBjb25zdHJhaW50LnBzX2Rpc2FibGVkOwotCW12bS0+cG1fZGlzYWJsZWQgPSBjb25zdHJhaW50LnBtX2Rpc2FibGVkOwotCi0JLyogZG9uJ3QgdXBkYXRlIGRldmljZSBwb3dlciBzdGF0ZSB1bmxlc3Mgd2UgYWRkIC8gcmVtb3ZlIG1vbml0b3IgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKLQkJcmV0ID0gaXdsX212bV9wb3dlcl91cGRhdGVfZGV2aWNlKG12bSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCS8qIGVuYWJsZSBQTSBvbiBic3MgaWYgYnNzIHN0YW5kIGFsb25lICovCisJaWYgKHZpZnMtPmJzc19hY3RpdmUgJiYgIXZpZnMtPnAycF9hY3RpdmUgJiYgIXZpZnMtPmFwX2FjdGl2ZSkgeworCQlic3NfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKKwkJcmV0dXJuOwogCX0KIAotCWlmIChjb25zdHJhaW50LmJzc192aWYpIHsKLQkJcmV0ID0gaXdsX212bV9wb3dlcl9zZW5kX2NtZChtdm0sIGNvbnN0cmFpbnQuYnNzX3ZpZik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCS8qIGVuYWJsZSBQTSBvbiBwMnAgaWYgcDJwIHN0YW5kIGFsb25lICovCisJaWYgKHZpZnMtPnAycF9hY3RpdmUgJiYgIXZpZnMtPmJzc19hY3RpdmUgJiYgIXZpZnMtPmFwX2FjdGl2ZSkgeworCQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BNKQorCQkJcDJwX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CisJCXJldHVybjsKIAl9CiAKLQlpZiAoY29uc3RyYWludC5wMnBfdmlmKSB7Ci0JCXJldCA9IGl3bF9tdm1fcG93ZXJfc2VuZF9jbWQobXZtLCBjb25zdHJhaW50LnAycF92aWYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwlpZiAodmlmcy0+YnNzX2FjdGl2ZSAmJiB2aWZzLT5wMnBfYWN0aXZlKQorCQljbGllbnRfc2FtZV9jaGFubmVsID0gKGJzc19tdm12aWYtPnBoeV9jdHh0LT5pZCA9PQorCQkJCSAgICAgICBwMnBfbXZtdmlmLT5waHlfY3R4dC0+aWQpOworCWlmICh2aWZzLT5ic3NfYWN0aXZlICYmIHZpZnMtPmFwX2FjdGl2ZSkKKwkJYXBfc2FtZV9jaGFubmVsID0gKGJzc19tdm12aWYtPnBoeV9jdHh0LT5pZCA9PQorCQkJCSAgIGFwX212bXZpZi0+cGh5X2N0eHQtPmlkKTsKKworCS8qIGNsaWVudHMgYXJlIG5vdCBzdGFuZCBhbG9uZTogZW5hYmxlIFBNIGlmIERDTSAqLworCWlmICghKGNsaWVudF9zYW1lX2NoYW5uZWwgfHwgYXBfc2FtZV9jaGFubmVsKSAmJgorCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00pKSB7CisJCWlmICh2aWZzLT5ic3NfYWN0aXZlKQorCQkJYnNzX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CisJCWlmICh2aWZzLT5wMnBfYWN0aXZlICYmCisJCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BNKSkKKwkJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOworCQlyZXR1cm47CiAJfQogCi0JaWYgKCFjb25zdHJhaW50LmJmX3ZpZikKLQkJcmV0dXJuIDA7Ci0KLQl2aWYgPSBjb25zdHJhaW50LmJmX3ZpZjsKLQltdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7Ci0KLQliYV9lbmFibGUgPSAhKGNvbnN0cmFpbnQucG1fZGlzYWJsZWQgfHwgY29uc3RyYWludC5wc19kaXNhYmxlZCB8fAotCQkgICAgICAhdmlmLT5ic3NfY29uZi5wcyB8fCBpd2xfbXZtX3ZpZl9sb3dfbGF0ZW5jeShtdm12aWYpKTsKLQotCXJldHVybiBpd2xfbXZtX3VwZGF0ZV9iZWFjb25fYWJvcnQobXZtLCBjb25zdHJhaW50LmJmX3ZpZiwgYmFfZW5hYmxlKTsKKwkvKgorCSAqIFRoZXJlIGlzIG9ubHkgb25lIGNoYW5uZWwgaW4gdGhlIHN5c3RlbSBhbmQgdGhlcmUgYXJlIG9ubHkKKwkgKiBic3MgYW5kIHAycCBjbGllbnRzIHRoYXQgc2hhcmUgaXQKKwkgKi8KKwlpZiAoY2xpZW50X3NhbWVfY2hhbm5lbCAmJiAhdmlmcy0+YXBfYWN0aXZlICYmCisJICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX1NDTSkpIHsKKwkJLyogc2hhcmUgc2FtZSBjaGFubmVsKi8KKwkJYnNzX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CisJCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pCisJCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKKwl9CiB9CiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCkBAIC02NzEsMTkgKzY1MSwxMCBAQAogCXN0cnVjdCBpd2xfbWFjX3Bvd2VyX2NtZCBjbWQgPSB7fTsKIAlpbnQgcG9zID0gMDsKIAotCWlmIChXQVJOX09OKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmCi0JCSAgICAgIElXTF9VQ09ERV9UTFZfRkxBR1NfUE1fQ01EX1NVUFBPUlQpKSkKLQkJcmV0dXJuIDA7Ci0KIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAltZW1jcHkoJmNtZCwgJm12bXZpZi0+bWFjX3B3cl9jbWQsIHNpemVvZihjbWQpKTsKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogCi0JaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfREVWSUNFX1BTX0NNRCkpCi0JCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLCAiZGlzYWJsZV9wb3dlcl9vZmYgPSAlZFxuIiwKLQkJCQkgKGNtZC5mbGFncyAmCi0JCQkJIGNwdV90b19sZTE2KFBPV0VSX0ZMQUdTX1BPV0VSX1NBVkVfRU5BX01TSykpID8KLQkJCQkgMCA6IDEpOwogCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLCAicG93ZXJfc2NoZW1lID0gJWRcbiIsCiAJCQkgaXdsbXZtX21vZF9wYXJhbXMucG93ZXJfc2NoZW1lKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywgImZsYWdzID0gMHgleFxuIiwKQEAgLTc5MCw3ICs3NjEsNyBAQAogCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwogCWludCByZXQ7CiAKLQlpZiAobXZtdmlmICE9IG12bS0+YmZfYWxsb3dlZF92aWYgfHwKKwlpZiAobXZtdmlmICE9IG12bS0+YmZfYWxsb3dlZF92aWYgfHwgIXZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QgfHwKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwgdmlmLT5wMnApCiAJCXJldHVybiAwOwogCkBAIC04MTgsNiArNzg5LDI2IEBACiAJcmV0dXJuIF9pd2xfbXZtX2VuYWJsZV9iZWFjb25fZmlsdGVyKG12bSwgdmlmLCAmY21kLCBmbGFncywgZmFsc2UpOwogfQogCitzdGF0aWMgaW50IGl3bF9tdm1fdXBkYXRlX2JlYWNvbl9hYm9ydChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgICBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKKwlzdHJ1Y3QgaXdsX2JlYWNvbl9maWx0ZXJfY21kIGNtZCA9IHsKKwkJSVdMX0JGX0NNRF9DT05GSUdfREVGQVVMVFMsCisJCS5iZl9lbmFibGVfYmVhY29uX2ZpbHRlciA9IGNwdV90b19sZTMyKDEpLAorCX07CisKKwlpZiAoIW12bXZpZi0+YmZfZGF0YS5iZl9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWlmIChtdm0tPmN1cl91Y29kZSA9PSBJV0xfVUNPREVfV09XTEFOKQorCQljbWQuYmFfZXNjYXBlX3RpbWVyID0gY3B1X3RvX2xlMzIoSVdMX0JBX0VTQ0FQRV9USU1FUl9EMyk7CisKKwltdm12aWYtPmJmX2RhdGEuYmFfZW5hYmxlZCA9IGVuYWJsZTsKKwlyZXR1cm4gX2l3bF9tdm1fZW5hYmxlX2JlYWNvbl9maWx0ZXIobXZtLCB2aWYsICZjbWQsIDAsIGZhbHNlKTsKK30KKwogaW50IGl3bF9tdm1fZGlzYWJsZV9iZWFjb25fZmlsdGVyKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCSAgdTMyIGZsYWdzKQpAQCAtODI2LDggKzgxNyw3IEBACiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAJaW50IHJldDsKIAotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0JGX1VQREFURUQpIHx8Ci0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8IHZpZi0+cDJwKQorCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fCB2aWYtPnAycCkKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBpd2xfbXZtX2JlYWNvbl9maWx0ZXJfc2VuZF9jbWQobXZtLCAmY21kLCBmbGFncyk7CkBAIC04MzgsNiArODI4LDU1IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGl3bF9tdm1fcG93ZXJfdXBkYXRlX21hYyhzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmOworCXN0cnVjdCBpd2xfcG93ZXJfdmlmcyB2aWZzID0ge307CisJYm9vbCBiYV9lbmFibGU7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOworCisJaXdsX212bV9wb3dlcl9zZXRfcG0obXZtLCAmdmlmcyk7CisKKwkvKiBkaXNhYmxlIFBTIGlmIENBTSAqLworCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgPT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0pIHsKKwkJbXZtLT5wc19kaXNhYmxlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkvKiBkb24ndCB1cGRhdGUgZGV2aWNlIHBvd2VyIHN0YXRlIHVubGVzcyB3ZSBhZGQgLyByZW1vdmUgbW9uaXRvciAqLworCQlpZiAodmlmcy5tb25pdG9yX3ZpZikgeworCQkJaWYgKHZpZnMubW9uaXRvcl9hY3RpdmUpCisJCQkJbXZtLT5wc19kaXNhYmxlZCA9IHRydWU7CisJCQlyZXQgPSBpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9kZXZpY2UobXZtKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmICh2aWZzLmJzc192aWYpIHsKKwkJcmV0ID0gaXdsX212bV9wb3dlcl9zZW5kX2NtZChtdm0sIHZpZnMuYnNzX3ZpZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh2aWZzLnAycF92aWYpIHsKKwkJcmV0ID0gaXdsX212bV9wb3dlcl9zZW5kX2NtZChtdm0sIHZpZnMucDJwX3ZpZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghdmlmcy5iZl92aWYpCisJCXJldHVybiAwOworCisJbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWZzLmJmX3ZpZik7CisKKwliYV9lbmFibGUgPSAhKCFtdm12aWYtPnBtX2VuYWJsZWQgfHwgbXZtLT5wc19kaXNhYmxlZCB8fAorCQkgICAgICAhdmlmcy5iZl92aWYtPmJzc19jb25mLnBzIHx8CisJCSAgICAgIGl3bF9tdm1fdmlmX2xvd19sYXRlbmN5KG12bXZpZikpOworCisJcmV0dXJuIGl3bF9tdm1fdXBkYXRlX2JlYWNvbl9hYm9ydChtdm0sIHZpZnMuYmZfdmlmLCBiYV9lbmFibGUpOworfQorCiBpbnQgaXdsX212bV91cGRhdGVfZDBpM19wb3dlcl9tb2RlKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgICBib29sIGVuYWJsZSwgdTMyIGZsYWdzKQpAQCAtODYxLDkgKzkwMCwxMCBAQAogCQlpZiAoV0FSTl9PTighZHRpbXBlcl9tc2VjKSkKIAkJCXJldHVybiAwOwogCi0JCWNtZC5mbGFncyB8PQotCQkJY3B1X3RvX2xlMTYoUE9XRVJfRkxBR1NfU0tJUF9PVkVSX0RUSU1fTVNLKTsKIAkJY21kLnNraXBfZHRpbV9wZXJpb2RzID0gMzAwIC8gZHRpbXBlcl9tc2VjOworCQlpZiAoY21kLnNraXBfZHRpbV9wZXJpb2RzKQorCQkJY21kLmZsYWdzIHw9CisJCQkJY3B1X3RvX2xlMTYoUE9XRVJfRkxBR1NfU0tJUF9PVkVSX0RUSU1fTVNLKTsKIAl9CiAJaXdsX212bV9wb3dlcl9sb2cobXZtLCAmY21kKTsKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCkBAIC04OTQsMzMgKzkzNCwzIEBACiAKIAlyZXR1cm4gcmV0OwogfQotCi1pbnQgaXdsX212bV91cGRhdGVfYmVhY29uX2ZpbHRlcihzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSBib29sIGZvcmNlLAotCQkJCSB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7Ci0KLQlpZiAobXZtdmlmICE9IG12bS0+YmZfYWxsb3dlZF92aWYpCi0JCXJldHVybiAwOwotCi0JaWYgKCFtdm12aWYtPmJmX2RhdGEuYmZfZW5hYmxlZCkgewotCQkvKiBkaXNhYmxlIGJlYWNvbiBmaWx0ZXJpbmcgZXhwbGljaXRseSBpZiBmb3JjZSBpcyB0cnVlICovCi0JCWlmIChmb3JjZSkKLQkJCXJldHVybiBpd2xfbXZtX2Rpc2FibGVfYmVhY29uX2ZpbHRlcihtdm0sIHZpZiwgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gaXdsX212bV9lbmFibGVfYmVhY29uX2ZpbHRlcihtdm0sIHZpZiwgZmxhZ3MpOwotfQotCi1pbnQgaXdsX3Bvd2VyX2xlZ2FjeV9zZXRfY2FtX21vZGUoc3RydWN0IGl3bF9tdm0gKm12bSkKLXsKLQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIGNtZCA9IHsKLQkJLmtlZXBfYWxpdmVfc2Vjb25kcyA9IFBPV0VSX0tFRVBfQUxJVkVfUEVSSU9EX1NFQywKLQl9OwotCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgUE9XRVJfVEFCTEVfQ01ELCBDTURfU1lOQywKLQkJCQkgICAgc2l6ZW9mKGNtZCksICZjbWQpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcXVvdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3F1b3RhLmMKaW5kZXggMzVlODZlMC4uYmE2OGQ3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3F1b3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcXVvdGEuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAKIAlpd2xfbXZtX2FkanVzdF9xdW90YV9mb3Jfbm9hKG12bSwgJmNtZCk7CiAKLQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRJTUVfUVVPVEFfQ01ELCBDTURfU1lOQywKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRJTUVfUVVPVEFfQ01ELCAwLAogCQkJCSAgIHNpemVvZihjbWQpLCAmY21kKTsKIAlpZiAocmV0KQogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBzZW5kIHF1b3RhOiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3JzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5jCmluZGV4IGUxYzgzODguLjMwNmE2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3JzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnMuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCS5uZXh0X2NvbHVtbnMgPSB7CiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9CLAogCQkJUlNfQ09MVU1OX1NJU09fQU5UX0EsCi0JCQlSU19DT0xVTU5fU0lTT19BTlRfQiwKKwkJCVJTX0NPTFVNTl9NSU1PMiwKIAkJCVJTX0NPTFVNTl9JTlZBTElELAogCQkJUlNfQ09MVU1OX0lOVkFMSUQsCiAJCQlSU19DT0xVTU5fSU5WQUxJRCwKQEAgLTIyMyw4ICsyMjMsOCBAQAogCQkuYW50ID0gQU5UX0IsCiAJCS5uZXh0X2NvbHVtbnMgPSB7CiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9BLAotCQkJUlNfQ09MVU1OX1NJU09fQU5UX0EsCiAJCQlSU19DT0xVTU5fU0lTT19BTlRfQiwKKwkJCVJTX0NPTFVNTl9NSU1PMiwKIAkJCVJTX0NPTFVNTl9JTlZBTElELAogCQkJUlNfQ09MVU1OX0lOVkFMSUQsCiAJCQlSU19DT0xVTU5fSU5WQUxJRCwKQEAgLTIzOCwxMCArMjM4LDEwIEBACiAJCQlSU19DT0xVTU5fU0lTT19BTlRfQiwKIAkJCVJTX0NPTFVNTl9NSU1PMiwKIAkJCVJTX0NPTFVNTl9TSVNPX0FOVF9BX1NHSSwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9CX1NHSSwKIAkJCVJTX0NPTFVNTl9MRUdBQ1lfQU5UX0EsCiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9CLAogCQkJUlNfQ09MVU1OX0lOVkFMSUQsCisJCQlSU19DT0xVTU5fSU5WQUxJRCwKIAkJfSwKIAkJLmNoZWNrcyA9IHsKIAkJCXJzX3Npc29fYWxsb3csCkBAIC0yNTQsMTAgKzI1NCwxMCBAQAogCQkJUlNfQ09MVU1OX1NJU09fQU5UX0EsCiAJCQlSU19DT0xVTU5fTUlNTzIsCiAJCQlSU19DT0xVTU5fU0lTT19BTlRfQl9TR0ksCi0JCQlSU19DT0xVTU5fU0lTT19BTlRfQV9TR0ksCiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9BLAogCQkJUlNfQ09MVU1OX0xFR0FDWV9BTlRfQiwKIAkJCVJTX0NPTFVNTl9JTlZBTElELAorCQkJUlNfQ09MVU1OX0lOVkFMSUQsCiAJCX0sCiAJCS5jaGVja3MgPSB7CiAJCQlyc19zaXNvX2FsbG93LApAQCAtMjcxLDEwICsyNzEsMTAgQEAKIAkJCVJTX0NPTFVNTl9TSVNPX0FOVF9CX1NHSSwKIAkJCVJTX0NPTFVNTl9NSU1PMl9TR0ksCiAJCQlSU19DT0xVTU5fU0lTT19BTlRfQSwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9CLAotCQkJUlNfQ09MVU1OX01JTU8yLAogCQkJUlNfQ09MVU1OX0xFR0FDWV9BTlRfQSwKIAkJCVJTX0NPTFVNTl9MRUdBQ1lfQU5UX0IsCisJCQlSU19DT0xVTU5fSU5WQUxJRCwKKwkJCVJTX0NPTFVNTl9JTlZBTElELAogCQl9LAogCQkuY2hlY2tzID0gewogCQkJcnNfc2lzb19hbGxvdywKQEAgLTI4OSwxMCArMjg5LDEwIEBACiAJCQlSU19DT0xVTU5fU0lTT19BTlRfQV9TR0ksCiAJCQlSU19DT0xVTU5fTUlNTzJfU0dJLAogCQkJUlNfQ09MVU1OX1NJU09fQU5UX0IsCi0JCQlSU19DT0xVTU5fU0lTT19BTlRfQSwKLQkJCVJTX0NPTFVNTl9NSU1PMiwKIAkJCVJTX0NPTFVNTl9MRUdBQ1lfQU5UX0EsCiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9CLAorCQkJUlNfQ09MVU1OX0lOVkFMSUQsCisJCQlSU19DT0xVTU5fSU5WQUxJRCwKIAkJfSwKIAkJLmNoZWNrcyA9IHsKIAkJCXJzX3Npc29fYWxsb3csCkBAIC0zMDQsMTIgKzMwNCwxMiBAQAogCQkuYW50ID0gQU5UX0FCLAogCQkubmV4dF9jb2x1bW5zID0gewogCQkJUlNfQ09MVU1OX1NJU09fQU5UX0EsCi0JCQlSU19DT0xVTU5fU0lTT19BTlRfQiwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9BX1NHSSwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9CX1NHSSwKIAkJCVJTX0NPTFVNTl9NSU1PMl9TR0ksCiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9BLAogCQkJUlNfQ09MVU1OX0xFR0FDWV9BTlRfQiwKKwkJCVJTX0NPTFVNTl9JTlZBTElELAorCQkJUlNfQ09MVU1OX0lOVkFMSUQsCisJCQlSU19DT0xVTU5fSU5WQUxJRCwKIAkJfSwKIAkJLmNoZWNrcyA9IHsKIAkJCXJzX21pbW9fYWxsb3csCkBAIC0zMjEsMTIgKzMyMSwxMiBAQAogCQkuc2dpID0gdHJ1ZSwKIAkJLm5leHRfY29sdW1ucyA9IHsKIAkJCVJTX0NPTFVNTl9TSVNPX0FOVF9BX1NHSSwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9CX1NHSSwKLQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9BLAotCQkJUlNfQ09MVU1OX1NJU09fQU5UX0IsCiAJCQlSU19DT0xVTU5fTUlNTzIsCiAJCQlSU19DT0xVTU5fTEVHQUNZX0FOVF9BLAogCQkJUlNfQ09MVU1OX0xFR0FDWV9BTlRfQiwKKwkJCVJTX0NPTFVNTl9JTlZBTElELAorCQkJUlNfQ09MVU1OX0lOVkFMSUQsCisJCQlSU19DT0xVTU5fSU5WQUxJRCwKIAkJfSwKIAkJLmNoZWNrcyA9IHsKIAkJCXJzX21pbW9fYWxsb3csCkBAIC01MjcsNiArNTI3LDkgQEAKIAlJV0xfREVCVUdfUkFURShtdm0sICJDbGVhcmluZyB1cCB3aW5kb3cgc3RhdHNcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBJV0xfUkFURV9DT1VOVDsgaSsrKQogCQlyc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygmdGJsLT53aW5baV0pOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGJsLT50cGNfd2luKTsgaSsrKQorCQlyc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygmdGJsLT50cGNfd2luW2ldKTsKIH0KIAogc3RhdGljIGlubGluZSB1OCByc19pc192YWxpZF9hbnQodTggdmFsaWRfYW50ZW5uYSwgdTggYW50X3R5cGUpCkBAIC02NTYsMTcgKzY1OSwzNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJzX2NvbGxlY3RfdHhfZGF0YShzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsCi0JCQkgICAgICBpbnQgc2NhbGVfaW5kZXgsIGludCBhdHRlbXB0cywgaW50IHN1Y2Nlc3NlcykKK3N0YXRpYyBpbnQgcnNfY29sbGVjdF90eF9kYXRhKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCisJCQkgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsCisJCQkgICAgICBpbnQgc2NhbGVfaW5kZXgsIGludCBhdHRlbXB0cywgaW50IHN1Y2Nlc3NlcywKKwkJCSAgICAgIHU4IHJlZHVjZWRfdHhwKQogewogCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSBOVUxMOworCWludCByZXQ7CiAKIAlpZiAoc2NhbGVfaW5kZXggPCAwIHx8IHNjYWxlX2luZGV4ID49IElXTF9SQVRFX0NPVU5UKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh0YmwtPmNvbHVtbiAhPSBSU19DT0xVTU5fSU5WQUxJRCkgeworCQlscV9zdGEtPnR4X3N0YXRzW3RibC0+Y29sdW1uXVtzY2FsZV9pbmRleF0udG90YWwgKz0gYXR0ZW1wdHM7CisJCWxxX3N0YS0+dHhfc3RhdHNbdGJsLT5jb2x1bW5dW3NjYWxlX2luZGV4XS5zdWNjZXNzICs9IHN1Y2Nlc3NlczsKKwl9CisKIAkvKiBTZWxlY3Qgd2luZG93IGZvciBjdXJyZW50IHR4IGJpdCByYXRlICovCiAJd2luZG93ID0gJih0YmwtPndpbltzY2FsZV9pbmRleF0pOwogCisJcmV0ID0gX3JzX2NvbGxlY3RfdHhfZGF0YSh0YmwsIHNjYWxlX2luZGV4LCBhdHRlbXB0cywgc3VjY2Vzc2VzLAorCQkJCSAgd2luZG93KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKFdBUk5fT05fT05DRShyZWR1Y2VkX3R4cCA+IFRQQ19NQVhfUkVEVUNUSU9OKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aW5kb3cgPSAmdGJsLT50cGNfd2luW3JlZHVjZWRfdHhwXTsKIAlyZXR1cm4gX3JzX2NvbGxlY3RfdHhfZGF0YSh0YmwsIHNjYWxlX2luZGV4LCBhdHRlbXB0cywgc3VjY2Vzc2VzLAogCQkJCSAgIHdpbmRvdyk7CiB9CkBAIC0xMDAwLDYgKzEwMjAsNyBAQAogCXUzMiB1Y29kZV9yYXRlOwogCXN0cnVjdCByc19yYXRlIHJhdGU7CiAJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqY3Vycl90YmwsICpvdGhlcl90YmwsICp0bXBfdGJsOworCXU4IHJlZHVjZWRfdHhwID0gKHVpbnRwdHJfdClpbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdOwogCiAJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KIAlpZiAoIWxxX3N0YSkgewpAQCAtMTE0MSw5ICsxMTYyLDEwIEBACiAJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUpIHsKIAkJdWNvZGVfcmF0ZSA9IGxlMzJfdG9fY3B1KHRhYmxlLT5yc190YWJsZVswXSk7CiAJCXJzX3JhdGVfZnJvbV91Y29kZV9yYXRlKHVjb2RlX3JhdGUsIGluZm8tPmJhbmQsICZyYXRlKTsKLQkJcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByYXRlLmluZGV4LAorCQlyc19jb2xsZWN0X3R4X2RhdGEobHFfc3RhLCBjdXJyX3RibCwgcmF0ZS5pbmRleCwKIAkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuLAotCQkJCSAgIGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuKTsKKwkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiwKKwkJCQkgICByZWR1Y2VkX3R4cCk7CiAKIAkJLyogVXBkYXRlIHN1Y2Nlc3MvZmFpbCBjb3VudHMgaWYgbm90IHNlYXJjaGluZyBmb3IgbmV3IG1vZGUgKi8KIAkJaWYgKGxxX3N0YS0+cnNfc3RhdGUgPT0gUlNfU1RBVEVfU1RBWV9JTl9DT0xVTU4pIHsKQEAgLTExNzYsOCArMTE5OCw5IEBACiAJCQllbHNlCiAJCQkJY29udGludWU7CiAKLQkJCXJzX2NvbGxlY3RfdHhfZGF0YSh0bXBfdGJsLCByYXRlLmluZGV4LCAxLAotCQkJCQkgICBpIDwgcmV0cmllcyA/IDAgOiBsZWdhY3lfc3VjY2Vzcyk7CisJCQlyc19jb2xsZWN0X3R4X2RhdGEobHFfc3RhLCB0bXBfdGJsLCByYXRlLmluZGV4LCAxLAorCQkJCQkgICBpIDwgcmV0cmllcyA/IDAgOiBsZWdhY3lfc3VjY2VzcywKKwkJCQkJICAgcmVkdWNlZF90eHApOwogCQl9CiAKIAkJLyogVXBkYXRlIHN1Y2Nlc3MvZmFpbCBjb3VudHMgaWYgbm90IHNlYXJjaGluZyBmb3IgbmV3IG1vZGUgKi8KQEAgLTExODgsNiArMTIxMSw3IEBACiAJfQogCS8qIFRoZSBsYXN0IFRYIHJhdGUgaXMgY2FjaGVkIGluIGxxX3N0YTsgaXQncyBzZXQgaW4gaWYvZWxzZSBhYm92ZSAqLwogCWxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgPSB1Y29kZV9yYXRlOworCUlXTF9ERUJVR19SQVRFKG12bSwgInJlZHVjZWQgdHhwb3dlcjogJWRcbiIsIHJlZHVjZWRfdHhwKTsKIGRvbmU6CiAJLyogU2VlIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcmF0ZSBvciBtb2R1bGF0aW9uIG1vZGUgdG8gdHJ5LiAqLwogCWlmIChzdGEgJiYgc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXSkKQEAgLTEzMTEsMTA1ICsxMzM1LDUwIEBACiAJdGJsLT5leHBlY3RlZF90cHQgPSByc19nZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgY29sdW1uLCByYXRlLT5idyk7CiB9CiAKLS8qCi0gKiBGaW5kIHN0YXJ0aW5nIHJhdGUgZm9yIG5ldyAic2VhcmNoIiBoaWdoLXRocm91Z2hwdXQgbW9kZSBvZiBtb2R1bGF0aW9uLgotICogR29hbCBpcyB0byBmaW5kIGxvd2VzdCBleHBlY3RlZCByYXRlICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpIHRoYXQgaXMKLSAqIGFib3ZlIHRoZSBjdXJyZW50IG1lYXN1cmVkIHRocm91Z2hwdXQgb2YgImFjdGl2ZSIgbW9kZSwgdG8gZ2l2ZSBuZXcgbW9kZQotICogYSBmYWlyIGNoYW5jZSB0byBwcm92ZSBpdHNlbGYgd2l0aG91dCB0b28gbWFueSBjaGFsbGVuZ2VzLgotICoKLSAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0cmFuc2l0aW9uaW5nIHRvIG1vcmUgYWdncmVzc2l2ZSBtb2R1bGF0aW9uCi0gKiAoaS5lLiBsZWdhY3kgdG8gU0lTTyBvciBNSU1PLCBvciBTSVNPIHRvIE1JTU8pLCBhcyB3ZWxsIGFzIGxlc3MgYWdncmVzc2l2ZQotICogKGkuZS4gTUlNTyB0byBTSVNPKS4gIFdoZW4gbW92aW5nIHRvIE1JTU8sIGJpdCByYXRlIHdpbGwgdHlwaWNhbGx5IG5lZWQKLSAqIHRvIGRlY3JlYXNlIHRvIG1hdGNoICJhY3RpdmUiIHRocm91Z2hwdXQuICBXaGVuIG1vdmluZyBmcm9tIE1JTU8gdG8gU0lTTywKLSAqIGJpdCByYXRlIHdpbGwgdHlwaWNhbGx5IG5lZWQgdG8gaW5jcmVhc2UsIGJ1dCBub3QgaWYgcGVyZm9ybWFuY2Ugd2FzIGJhZC4KLSAqLwogc3RhdGljIHMzMiByc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKIAkJCSAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsCS8qICJzZWFyY2giICovCi0JCQkgICAgdTE2IHJhdGVfbWFzaywgczggaW5kZXgpCisJCQkgICAgdW5zaWduZWQgbG9uZyByYXRlX21hc2ssIHM4IGluZGV4KQogewotCS8qICJhY3RpdmUiIHZhbHVlcyAqLwogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKmFjdGl2ZV90YmwgPQogCSAgICAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKLQlzMzIgYWN0aXZlX3NyID0gYWN0aXZlX3RibC0+d2luW2luZGV4XS5zdWNjZXNzX3JhdGlvOwotCXMzMiBhY3RpdmVfdHB0ID0gYWN0aXZlX3RibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XTsKLQkvKiBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICovCisJczMyIHN1Y2Nlc3NfcmF0aW8gPSBhY3RpdmVfdGJsLT53aW5baW5kZXhdLnN1Y2Nlc3NfcmF0aW87CisJdTE2IGV4cGVjdGVkX2N1cnJlbnRfdHB0ID0gYWN0aXZlX3RibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XTsKIAljb25zdCB1MTYgKnRwdF90YmwgPSB0YmwtPmV4cGVjdGVkX3RwdDsKLQotCXMzMiBuZXdfcmF0ZSwgaGlnaCwgbG93LCBzdGFydF9oaTsKIAl1MTYgaGlnaF9sb3c7Ci0JczggcmF0ZSA9IGluZGV4OworCXUzMiB0YXJnZXRfdHB0OworCWludCByYXRlX2lkeDsKIAotCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCXdoaWxlICgxKSB7Ci0JCWhpZ2hfbG93ID0gcnNfZ2V0X2FkamFjZW50X3JhdGUobXZtLCByYXRlLCByYXRlX21hc2ssCi0JCQkJCQl0YmwtPnJhdGUudHlwZSk7Ci0KLQkJbG93ID0gaGlnaF9sb3cgJiAweGZmOwotCQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKLQotCQkvKgotCQkgKiBMb3dlciB0aGUgInNlYXJjaCIgYml0IHJhdGUsIHRvIGdpdmUgbmV3ICJzZWFyY2giIG1vZGUKLQkJICogYXBwcm94aW1hdGVseSB0aGUgc2FtZSB0aHJvdWdocHV0IGFzICJhY3RpdmUiIGlmOgotCQkgKgotCQkgKiAxKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgbW9kZXN0bHkgd2VsbCAoYnV0IG5vdAotCQkgKiAgICBncmVhdCksIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0Ci0JCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIHRoZSBhY3R1YWwKLQkJICogICAgbWVhc3VyZWQgImFjdGl2ZSIgdGhyb3VnaHB1dCAoYnV0IGxlc3MgdGhhbiBleHBlY3RlZAotCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0IHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCi0JCSAqIE9SCi0JCSAqIDIpICJBY3RpdmUiIG1vZGUgaGFzIGJlZW4gd29ya2luZyBwZXJmZWN0bHkgb3IgdmVyeSB3ZWxsCi0JCSAqICAgIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0Ci0JCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIGV4cGVjdGVkCi0JCSAqICAgICJhY3RpdmUiIHRocm91Z2hwdXQgKHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCi0JCSAqLwotCQlpZiAoKCgoMTAwICogdHB0X3RibFtyYXRlXSkgPiBscV9zdGEtPmxhc3RfdHB0KSAmJgotCQkgICAgICgoYWN0aXZlX3NyID4gUlNfU1JfRk9SQ0VfREVDUkVBU0UpICYmCi0JCSAgICAgIChhY3RpdmVfc3IgPD0gSVdMX1JBVEVfSElHSF9USCkgJiYKLQkJICAgICAgKHRwdF90YmxbcmF0ZV0gPD0gYWN0aXZlX3RwdCkpKSB8fAotCQkgICAgKChhY3RpdmVfc3IgPj0gSVdMX1JBVEVfU0NBTEVfU1dJVENIKSAmJgotCQkgICAgICh0cHRfdGJsW3JhdGVdID4gYWN0aXZlX3RwdCkpKSB7Ci0JCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCi0JCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCi0JCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLwotCQkJaWYgKHN0YXJ0X2hpICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCQluZXdfcmF0ZSA9IHN0YXJ0X2hpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQluZXdfcmF0ZSA9IHJhdGU7Ci0KLQkJCS8qIExvb3AgYWdhaW4gd2l0aCBsb3dlciByYXRlICovCi0JCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQkJcmF0ZSA9IGxvdzsKLQotCQkJLyogTG93ZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCi0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJLyogRWxzZSB0cnkgdG8gcmFpc2UgdGhlICJzZWFyY2giIHJhdGUgdG8gbWF0Y2ggImFjdGl2ZSIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qICgybmQgb3IgbGF0ZXIgcGFzcykKLQkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gbG93ZXIgdGhlIHJhdGUsIGFuZCBhcmUKLQkJCSAqIG5vdyB0cnlpbmcgdG8gcmFpc2UgaXQsIHVzZSB0aGUgbG93ZXIgcmF0ZS4gKi8KLQkJCWlmIChuZXdfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJCWJyZWFrOwotCi0JCQkvKiBMb29wIGFnYWluIHdpdGggaGlnaGVyIHJhdGUgKi8KLQkJCWVsc2UgaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkJCXN0YXJ0X2hpID0gaGlnaDsKLQkJCQlyYXRlID0gaGlnaDsKLQotCQkJLyogSGlnaGVyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLwotCQkJfSBlbHNlIHsKLQkJCQluZXdfcmF0ZSA9IHJhdGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwlpZiAoc3VjY2Vzc19yYXRpbyA+IFJTX1NSX05PX0RFQ1JFQVNFKSB7CisJCXRhcmdldF90cHQgPSAxMDAgKiBleHBlY3RlZF9jdXJyZW50X3RwdDsKKwkJSVdMX0RFQlVHX1JBVEUobXZtLAorCQkJICAgICAgICJTUiAlZCBoaWdoLiBGaW5kIHJhdGUgZXhjZWVkaW5nIEVYUEVDVEVEX0NVUlJFTlQgJWRcbiIsCisJCQkgICAgICAgc3VjY2Vzc19yYXRpbywgdGFyZ2V0X3RwdCk7CisJfSBlbHNlIHsKKwkJdGFyZ2V0X3RwdCA9IGxxX3N0YS0+bGFzdF90cHQ7CisJCUlXTF9ERUJVR19SQVRFKG12bSwKKwkJCSAgICAgICAiU1IgJWQgbm90IHRoYWcgZ29vZC4gRmluZCByYXRlIGV4Y2VlZGluZyBBQ1RVQUxfVFBUICVkXG4iLAorCQkJICAgICAgIHN1Y2Nlc3NfcmF0aW8sIHRhcmdldF90cHQpOwogCX0KIAotCXJldHVybiBuZXdfcmF0ZTsKKwlyYXRlX2lkeCA9IGZpbmRfZmlyc3RfYml0KCZyYXRlX21hc2ssIEJJVFNfUEVSX0xPTkcpOworCisJd2hpbGUgKHJhdGVfaWR4ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKKwkJaWYgKHRhcmdldF90cHQgPCAoMTAwICogdHB0X3RibFtyYXRlX2lkeF0pKQorCQkJYnJlYWs7CisKKwkJaGlnaF9sb3cgPSByc19nZXRfYWRqYWNlbnRfcmF0ZShtdm0sIHJhdGVfaWR4LCByYXRlX21hc2ssCisJCQkJCQl0YmwtPnJhdGUudHlwZSk7CisKKwkJcmF0ZV9pZHggPSAoaGlnaF9sb3cgPj4gOCkgJiAweGZmOworCX0KKworCUlXTF9ERUJVR19SQVRFKG12bSwgIkJlc3QgcmF0ZSBmb3VuZCAlZCB0YXJnZXRfdHAgJWQgZXhwZWN0ZWRfbmV3ICVkXG4iLAorCQkgICAgICAgcmF0ZV9pZHgsIHRhcmdldF90cHQsCisJCSAgICAgICByYXRlX2lkeCAhPSBJV0xfUkFURV9JTlZBTElEID8KKwkJICAgICAgIDEwMCAqIHRwdF90YmxbcmF0ZV9pZHhdIDogSVdMX0lOVkFMSURfVkFMVUUpOworCisJcmV0dXJuIHJhdGVfaWR4OwogfQogCiBzdGF0aWMgdTMyIHJzX2J3X2Zyb21fc3RhX2J3KHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCkBAIC0xNTg0LDcgKzE1NTMsNyBAQAogCiAJCXRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7CiAJCWV4cGVjdGVkX3RwdF90YmwgPSByc19nZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgbmV4dF9jb2wsCi0JCQkJCQkJICAgICB0YmwtPnJhdGUuYncpOworCQkJCQkJICAgICByc19id19mcm9tX3N0YV9idyhzdGEpKTsKIAkJaWYgKFdBUk5fT05fT05DRSghZXhwZWN0ZWRfdHB0X3RibCkpCiAJCQljb250aW51ZTsKIApAQCAtMTYyNSw3ICsxNTk0LDcgQEAKIAljb25zdCBzdHJ1Y3QgcnNfdHhfY29sdW1uICpjdXJyX2NvbHVtbiA9ICZyc190eF9jb2x1bW5zW3RibC0+Y29sdW1uXTsKIAl1MzIgc3ogPSAoc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pIC0KIAkJICAoc2l6ZW9mKHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhKSAqIElXTF9SQVRFX0NPVU5UKSk7Ci0JdTE2IHJhdGVfbWFzayA9IDA7CisJdW5zaWduZWQgbG9uZyByYXRlX21hc2sgPSAwOwogCXUzMiByYXRlX2lkeCA9IDA7CiAKIAltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CkBAIC0xNjY3LDcgKzE2MzYsNyBAQAogCQkgICAgIShCSVQocmF0ZV9pZHgpICYgcmF0ZV9tYXNrKSkgewogCQkJSVdMX0RFQlVHX1JBVEUobXZtLAogCQkJCSAgICAgICAiY2FuIG5vdCBzd2l0Y2ggd2l0aCBpbmRleCAlZCIKLQkJCQkgICAgICAgIiByYXRlIG1hc2sgJXhcbiIsCisJCQkJICAgICAgICIgcmF0ZSBtYXNrICVseFxuIiwKIAkJCQkgICAgICAgcmF0ZV9pZHgsIHJhdGVfbWFzayk7CiAKIAkJCWdvdG8gZXJyOwpAQCAtMTc2OSw2ICsxNzM4LDIwMyBAQAogCXJldHVybiBhY3Rpb247CiB9CiAKK3N0YXRpYyB2b2lkIHJzX2dldF9hZGphY2VudF90eHAoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IGluZGV4LAorCQkJCWludCAqd2Vha2VyLCBpbnQgKnN0cm9uZ2VyKQoreworCSp3ZWFrZXIgPSBpbmRleCArIFRQQ19UWF9QT1dFUl9TVEVQOworCWlmICgqd2Vha2VyID4gVFBDX01BWF9SRURVQ1RJT04pCisJCSp3ZWFrZXIgPSBUUENfSU5WQUxJRDsKKworCSpzdHJvbmdlciA9IGluZGV4IC0gVFBDX1RYX1BPV0VSX1NURVA7CisJaWYgKCpzdHJvbmdlciA8IDApCisJCSpzdHJvbmdlciA9IFRQQ19JTlZBTElEOworfQorCitzdGF0aWMgYm9vbCByc190cGNfYWxsb3dlZChzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgc3RydWN0IHJzX3JhdGUgKnJhdGUsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlpbnQgaW5kZXggPSByYXRlLT5pbmRleDsKKwlib29sIGNhbSA9IChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgPT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0pOworCWJvb2wgc3RhX3BzX2Rpc2FibGVkID0gKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCQkJIXZpZi0+YnNzX2NvbmYucHMpOworCisJSVdMX0RFQlVHX1JBVEUobXZtLCAiY2FtOiAlZCBzdGFfcHNfZGlzYWJsZWQgJWRcbiIsCisJCSAgICAgICBjYW0sIHN0YV9wc19kaXNhYmxlZCk7CisJLyoKKwkgKiBhbGxvdyB0cGMgb25seSBpZiBwb3dlciBtYW5hZ2VtZW50IGlzIGVuYWJsZWQsIG9yIGJ0IGNvZXgKKwkgKiBhY3Rpdml0eSBncmFkZSBhbGxvd3MgaXQgYW5kIHdlIGFyZSBvbiAyLjRHaHouCisJICovCisJaWYgKChjYW0gfHwgc3RhX3BzX2Rpc2FibGVkKSAmJgorCSAgICAhaXdsX212bV9idF9jb2V4X2lzX3RwY19hbGxvd2VkKG12bSwgYmFuZCkpCisJCXJldHVybiBmYWxzZTsKKworCUlXTF9ERUJVR19SQVRFKG12bSwgImNoZWNrIHJhdGUsIHRhYmxlIHR5cGU6ICVkXG4iLCByYXRlLT50eXBlKTsKKwlpZiAoaXNfbGVnYWN5KHJhdGUpKQorCQlyZXR1cm4gaW5kZXggPT0gSVdMX1JBVEVfNTRNX0lOREVYOworCWlmIChpc19odChyYXRlKSkKKwkJcmV0dXJuIGluZGV4ID09IElXTF9SQVRFX01DU183X0lOREVYOworCWlmIChpc192aHQocmF0ZSkpCisJCXJldHVybiBpbmRleCA9PSBJV0xfUkFURV9NQ1NfN19JTkRFWCB8fAorCQkgICAgICAgaW5kZXggPT0gSVdMX1JBVEVfTUNTXzhfSU5ERVggfHwKKwkJICAgICAgIGluZGV4ID09IElXTF9SQVRFX01DU185X0lOREVYOworCisJV0FSTl9PTl9PTkNFKDEpOworCXJldHVybiBmYWxzZTsKK30KKworZW51bSB0cGNfYWN0aW9uIHsKKwlUUENfQUNUSU9OX1NUQVksCisJVFBDX0FDVElPTl9ERUNSRUFTRSwKKwlUUENfQUNUSU9OX0lOQ1JFQVNFLAorCVRQQ19BQ1RJT05fTk9fUkVTVElSQ1RJT04sCit9OworCitzdGF0aWMgZW51bSB0cGNfYWN0aW9uIHJzX2dldF90cGNfYWN0aW9uKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCSBzMzIgc3IsIGludCB3ZWFrLCBpbnQgc3Ryb25nLAorCQkJCQkgaW50IGN1cnJlbnRfdHB0LAorCQkJCQkgaW50IHdlYWtfdHB0LCBpbnQgc3Ryb25nX3RwdCkKK3sKKwkvKiBzdGF5IHVudGlsIHdlIGhhdmUgdmFsaWQgdHB0ICovCisJaWYgKGN1cnJlbnRfdHB0ID09IElXTF9JTlZBTElEX1ZBTFVFKSB7CisJCUlXTF9ERUJVR19SQVRFKG12bSwgIm5vIGN1cnJlbnQgdHB0LiBzdGF5LlxuIik7CisJCXJldHVybiBUUENfQUNUSU9OX1NUQVk7CisJfQorCisJLyogVG9vIG1hbnkgZmFpbHVyZXMsIGluY3JlYXNlIHR4cCAqLworCWlmIChzciA8PSBUUENfU1JfRk9SQ0VfSU5DUkVBU0UgfHwgY3VycmVudF90cHQgPT0gMCkgeworCQlJV0xfREVCVUdfUkFURShtdm0sICJpbmNyZWFzZSB0eHAgYmVjYXVzZSBvZiB3ZWFrIFNSXG4iKTsKKwkJcmV0dXJuIFRQQ19BQ1RJT05fTk9fUkVTVElSQ1RJT047CisJfQorCisJLyogdHJ5IGRlY3JlYXNpbmcgZmlyc3QgaWYgYXBwbGljYWJsZSAqLworCWlmICh3ZWFrICE9IFRQQ19JTlZBTElEKSB7CisJCWlmICh3ZWFrX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSAmJgorCQkgICAgKHN0cm9uZ190cHQgPT0gSVdMX0lOVkFMSURfVkFMVUUgfHwKKwkJICAgICBjdXJyZW50X3RwdCA+PSBzdHJvbmdfdHB0KSkgeworCQkJSVdMX0RFQlVHX1JBVEUobXZtLAorCQkJCSAgICAgICAibm8gd2VhayB0eHAgbWVhc3VyZW1lbnQuIGRlY3JlYXNlIHR4cFxuIik7CisJCQlyZXR1cm4gVFBDX0FDVElPTl9ERUNSRUFTRTsKKwkJfQorCisJCWlmICh3ZWFrX3RwdCA+IGN1cnJlbnRfdHB0KSB7CisJCQlJV0xfREVCVUdfUkFURShtdm0sCisJCQkJICAgICAgICJsb3dlciB0eHAgaGFzIGJldHRlciB0cHQuIGRlY3JlYXNlIHR4cFxuIik7CisJCQlyZXR1cm4gVFBDX0FDVElPTl9ERUNSRUFTRTsKKwkJfQorCX0KKworCS8qIG5leHQsIGluY3JlYXNlIGlmIG5lZWRlZCAqLworCWlmIChzciA8IFRQQ19TUl9OT19JTkNSRUFTRSAmJiBzdHJvbmcgIT0gVFBDX0lOVkFMSUQpIHsKKwkJaWYgKHdlYWtfdHB0ID09IElXTF9JTlZBTElEX1ZBTFVFICYmCisJCSAgICBzdHJvbmdfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFICYmCisJCSAgICBjdXJyZW50X3RwdCA8IHN0cm9uZ190cHQpIHsKKwkJCUlXTF9ERUJVR19SQVRFKG12bSwKKwkJCQkgICAgICAgImhpZ2hlciB0eHAgaGFzIGJldHRlciB0cHQuIGluY3JlYXNlIHR4cFxuIik7CisJCQlyZXR1cm4gVFBDX0FDVElPTl9JTkNSRUFTRTsKKwkJfQorCisJCWlmICh3ZWFrX3RwdCA8IGN1cnJlbnRfdHB0ICYmCisJCSAgICAoc3Ryb25nX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSB8fAorCQkgICAgIHN0cm9uZ190cHQgPiBjdXJyZW50X3RwdCkpIHsKKwkJCUlXTF9ERUJVR19SQVRFKG12bSwKKwkJCQkgICAgICAgImxvd2VyIHR4cCBoYXMgd29yc2UgdHB0LiBpbmNyZWFzZSB0eHBcbiIpOworCQkJcmV0dXJuIFRQQ19BQ1RJT05fSU5DUkVBU0U7CisJCX0KKwl9CisKKwlJV0xfREVCVUdfUkFURShtdm0sICJubyBuZWVkIHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIHR4cCAtIHN0YXlcbiIpOworCXJldHVybiBUUENfQUNUSU9OX1NUQVk7Cit9CisKK3N0YXRpYyBib29sIHJzX3RwY19wZXJmb3JtKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKK3sKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bV9zdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IG12bV9zdGEtPnZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93OworCXN0cnVjdCByc19yYXRlICpyYXRlID0gJnRibC0+cmF0ZTsKKwllbnVtIHRwY19hY3Rpb24gYWN0aW9uOworCXMzMiBzcjsKKwl1OCBjdXIgPSBscV9zdGEtPmxxLnJlZHVjZWRfdHBjOworCWludCBjdXJyZW50X3RwdDsKKwlpbnQgd2Vhaywgc3Ryb25nOworCWludCB3ZWFrX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFLCBzdHJvbmdfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCWlmIChscV9zdGEtPmRiZ19maXhlZF90eHBfcmVkdWN0aW9uIDw9IFRQQ19NQVhfUkVEVUNUSU9OKSB7CisJCUlXTF9ERUJVR19SQVRFKG12bSwgImZpeGVkIHRwYzogJWRcbiIsCisJCQkgICAgICAgbHFfc3RhLT5kYmdfZml4ZWRfdHhwX3JlZHVjdGlvbik7CisJCWxxX3N0YS0+bHEucmVkdWNlZF90cGMgPSBscV9zdGEtPmRiZ19maXhlZF90eHBfcmVkdWN0aW9uOworCQlyZXR1cm4gY3VyICE9IGxxX3N0YS0+ZGJnX2ZpeGVkX3R4cF9yZWR1Y3Rpb247CisJfQorI2VuZGlmCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY2hhbmN0eF9jb25mID0gcmN1X2RlcmVmZXJlbmNlKHZpZi0+Y2hhbmN0eF9jb25mKTsKKwlpZiAoV0FSTl9PTighY2hhbmN0eF9jb25mKSkKKwkJYmFuZCA9IElFRUU4MDIxMV9OVU1fQkFORFM7CisJZWxzZQorCQliYW5kID0gY2hhbmN0eF9jb25mLT5kZWYuY2hhbi0+YmFuZDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICghcnNfdHBjX2FsbG93ZWQobXZtLCB2aWYsIHJhdGUsIGJhbmQpKSB7CisJCUlXTF9ERUJVR19SQVRFKG12bSwKKwkJCSAgICAgICAidHBjIGlzIG5vdCBhbGxvd2VkLiByZW1vdmUgdHhwIHJlc3RyaWN0aW9uc1xuIik7CisJCWxxX3N0YS0+bHEucmVkdWNlZF90cGMgPSBUUENfTk9fUkVEVUNUSU9OOworCQlyZXR1cm4gY3VyICE9IFRQQ19OT19SRURVQ1RJT047CisJfQorCisJcnNfZ2V0X2FkamFjZW50X3R4cChtdm0sIGN1ciwgJndlYWssICZzdHJvbmcpOworCisJLyogQ29sbGVjdCBtZWFzdXJlZCB0aHJvdWdocHV0cyBmb3IgY3VycmVudCBhbmQgYWRqYWNlbnQgcmF0ZXMgKi8KKwl3aW5kb3cgPSB0YmwtPnRwY193aW47CisJc3IgPSB3aW5kb3dbY3VyXS5zdWNjZXNzX3JhdGlvOworCWN1cnJlbnRfdHB0ID0gd2luZG93W2N1cl0uYXZlcmFnZV90cHQ7CisJaWYgKHdlYWsgIT0gVFBDX0lOVkFMSUQpCisJCXdlYWtfdHB0ID0gd2luZG93W3dlYWtdLmF2ZXJhZ2VfdHB0OworCWlmIChzdHJvbmcgIT0gVFBDX0lOVkFMSUQpCisJCXN0cm9uZ190cHQgPSB3aW5kb3dbc3Ryb25nXS5hdmVyYWdlX3RwdDsKKworCUlXTF9ERUJVR19SQVRFKG12bSwKKwkJICAgICAgICIoVFBDOiAlZCk6IGN1cl90cHQgJWQgU1IgJWQgd2VhayAlZCBzdHJvbmcgJWQgd2Vha190cHQgJWQgc3Ryb25nX3RwdCAlZFxuIiwKKwkJICAgICAgIGN1ciwgY3VycmVudF90cHQsIHNyLCB3ZWFrLCBzdHJvbmcsCisJCSAgICAgICB3ZWFrX3RwdCwgc3Ryb25nX3RwdCk7CisKKwlhY3Rpb24gPSByc19nZXRfdHBjX2FjdGlvbihtdm0sIHNyLCB3ZWFrLCBzdHJvbmcsCisJCQkJICAgY3VycmVudF90cHQsIHdlYWtfdHB0LCBzdHJvbmdfdHB0KTsKKworCS8qIG92ZXJyaWRlIGFjdGlvbnMgaWYgd2UgYXJlIG9uIHRoZSBlZGdlICovCisJaWYgKHdlYWsgPT0gVFBDX0lOVkFMSUQgJiYgYWN0aW9uID09IFRQQ19BQ1RJT05fREVDUkVBU0UpIHsKKwkJSVdMX0RFQlVHX1JBVEUobXZtLCAiYWxyZWFkeSBpbiBsb3dlc3QgdHhwLCBzdGF5XG4iKTsKKwkJYWN0aW9uID0gVFBDX0FDVElPTl9TVEFZOworCX0gZWxzZSBpZiAoc3Ryb25nID09IFRQQ19JTlZBTElEICYmCisJCSAgIChhY3Rpb24gPT0gVFBDX0FDVElPTl9JTkNSRUFTRSB8fAorCQkgICAgYWN0aW9uID09IFRQQ19BQ1RJT05fTk9fUkVTVElSQ1RJT04pKSB7CisJCUlXTF9ERUJVR19SQVRFKG12bSwgImFscmVhZHkgaW4gaGlnaGVzdCB0eHAsIHN0YXlcbiIpOworCQlhY3Rpb24gPSBUUENfQUNUSU9OX1NUQVk7CisJfQorCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFRQQ19BQ1RJT05fREVDUkVBU0U6CisJCWxxX3N0YS0+bHEucmVkdWNlZF90cGMgPSB3ZWFrOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFRQQ19BQ1RJT05fSU5DUkVBU0U6CisJCWxxX3N0YS0+bHEucmVkdWNlZF90cGMgPSBzdHJvbmc7CisJCXJldHVybiB0cnVlOworCWNhc2UgVFBDX0FDVElPTl9OT19SRVNUSVJDVElPTjoKKwkJbHFfc3RhLT5scS5yZWR1Y2VkX3RwYyA9IFRQQ19OT19SRURVQ1RJT047CisJCXJldHVybiB0cnVlOworCWNhc2UgVFBDX0FDVElPTl9TVEFZOgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBEbyByYXRlIHNjYWxpbmcgYW5kIHNlYXJjaCBmb3IgbmV3IG1vZHVsYXRpb24gbW9kZS4KICAqLwpAQCAtMjAxOSw2ICsyMTg1LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBSU19BQ1RJT05fU1RBWToKIAkJLyogTm8gY2hhbmdlICovCisJCWlmIChscV9zdGEtPnJzX3N0YXRlID09IFJTX1NUQVRFX1NUQVlfSU5fQ09MVU1OKQorCQkJdXBkYXRlX2xxID0gcnNfdHBjX3BlcmZvcm0obXZtLCBzdGEsIGxxX3N0YSwgdGJsKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjI3MSwxMCArMjQ0MCw2IEBACiAJCQlpZiAoaSA9PSBJV0xfUkFURV85TV9JTkRFWCkKIAkJCQljb250aW51ZTsKIAotCQkJLyogRGlzYWJsZSBNQ1M5IGFzIGEgd29ya2Fyb3VuZCAqLwotCQkJaWYgKGkgPT0gSVdMX1JBVEVfTUNTXzlfSU5ERVgpCi0JCQkJY29udGludWU7Ci0KIAkJCS8qIFZIVCBNQ1M5IGlzbid0IHZhbGlkIGZvciAyME1oeiBmb3IgTlNTPTEsMiAqLwogCQkJaWYgKGkgPT0gSVdMX1JBVEVfTUNTXzlfSU5ERVggJiYKIAkJCSAgICBzdGEtPmJhbmR3aWR0aCA9PSBJRUVFODAyMTFfU1RBX1JYX0JXXzIwKQpAQCAtMjI5MywxMCArMjQ1OCw2IEBACiAJCQlpZiAoaSA9PSBJV0xfUkFURV85TV9JTkRFWCkKIAkJCQljb250aW51ZTsKIAotCQkJLyogRGlzYWJsZSBNQ1M5IGFzIGEgd29ya2Fyb3VuZCAqLwotCQkJaWYgKGkgPT0gSVdMX1JBVEVfTUNTXzlfSU5ERVgpCi0JCQkJY29udGludWU7Ci0KIAkJCS8qIFZIVCBNQ1M5IGlzbid0IHZhbGlkIGZvciAyME1oeiBmb3IgTlNTPTEsMiAqLwogCQkJaWYgKGkgPT0gSVdMX1JBVEVfTUNTXzlfSU5ERVggJiYKIAkJCSAgICBzdGEtPmJhbmR3aWR0aCA9PSBJRUVFODAyMTFfU1RBX1JYX0JXXzIwKQpAQCAtMjQ3OCw2ICsyNjM5LDcgQEAKIAlscV9zdGEtPmlzX2FnZyA9IDA7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKIAlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gMDsKKwlscV9zdGEtPmRiZ19maXhlZF90eHBfcmVkdWN0aW9uID0gVFBDX0lOVkFMSUQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAJaXdsX212bV9yZXNldF9mcmFtZV9zdGF0cyhtdm0sICZtdm0tPmRydl9yeF9zdGF0cyk7CkBAIC0yNjUzLDYgKzI4MTUsNyBAQAogCQlyc19idWlsZF9yYXRlc190YWJsZV9mcm9tX2ZpeGVkKG12bSwgbHFfY21kLAogCQkJCQkJbHFfc3RhLT5iYW5kLAogCQkJCQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7CisJCWxxX2NtZC0+cmVkdWNlZF90cGMgPSAwOwogCQlhbnQgPSAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKSA+PgogCQkJUkFURV9NQ1NfQU5UX1BPUzsKIAl9IGVsc2UKQEAgLTI3ODMsNyArMjk0Niw2IEBACiAJc2l6ZV90IGJ1Zl9zaXplOwogCXUzMiBwYXJzZWRfcmF0ZTsKIAotCiAJbXZtID0gbHFfc3RhLT5kcnY7CiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwogCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKQEAgLTI4NTYsNiArMzAxOCw3IEBACiAJCQlscV9zdGEtPmxxLmFnZ19kaXNhYmxlX3N0YXJ0X3RoLAogCQkJbHFfc3RhLT5scS5hZ2dfZnJhbWVfY250X2xpbWl0KTsKIAorCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJyZWR1Y2VkIHRwYz0lZFxuIiwgbHFfc3RhLT5scS5yZWR1Y2VkX3RwYyk7CiAJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKIAkJCSJTdGFydCBpZHggWzBdPTB4JXggWzFdPTB4JXggWzJdPTB4JXggWzNdPTB4JXhcbiIsCiAJCQlscV9zdGEtPmxxLmluaXRpYWxfcmF0ZV9pbmRleFswXSwKQEAgLTI5MjgsNiArMzA5MSw5NCBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHJzX3N0YV9kYmdmc19kcnZfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbHVtbl9uYW1lW10gPSB7CisJCVtSU19DT0xVTU5fTEVHQUNZX0FOVF9BXSA9ICJMRUdBQ1lfQU5UX0EiLAorCQlbUlNfQ09MVU1OX0xFR0FDWV9BTlRfQl0gPSAiTEVHQUNZX0FOVF9CIiwKKwkJW1JTX0NPTFVNTl9TSVNPX0FOVF9BXSA9ICJTSVNPX0FOVF9BIiwKKwkJW1JTX0NPTFVNTl9TSVNPX0FOVF9CXSA9ICJTSVNPX0FOVF9CIiwKKwkJW1JTX0NPTFVNTl9TSVNPX0FOVF9BX1NHSV0gPSAiU0lTT19BTlRfQV9TR0kiLAorCQlbUlNfQ09MVU1OX1NJU09fQU5UX0JfU0dJXSA9ICJTSVNPX0FOVF9CX1NHSSIsCisJCVtSU19DT0xVTU5fTUlNTzJdID0gIk1JTU8yIiwKKwkJW1JTX0NPTFVNTl9NSU1PMl9TR0ldID0gIk1JTU8yX1NHSSIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmF0ZV9uYW1lW10gPSB7CisJCVtJV0xfUkFURV8xTV9JTkRFWF0gPSAiMU0iLAorCQlbSVdMX1JBVEVfMk1fSU5ERVhdID0gIjJNIiwKKwkJW0lXTF9SQVRFXzVNX0lOREVYXSA9ICI1LjVNIiwKKwkJW0lXTF9SQVRFXzExTV9JTkRFWF0gPSAiMTFNIiwKKwkJW0lXTF9SQVRFXzZNX0lOREVYXSA9ICI2TXxNQ1MwIiwKKwkJW0lXTF9SQVRFXzlNX0lOREVYXSA9ICI5TSIsCisJCVtJV0xfUkFURV8xMk1fSU5ERVhdID0gIjEyTXxNQ1MxIiwKKwkJW0lXTF9SQVRFXzE4TV9JTkRFWF0gPSAiMThNfE1DUzIiLAorCQlbSVdMX1JBVEVfMjRNX0lOREVYXSA9ICIyNE18TUNTMyIsCisJCVtJV0xfUkFURV8zNk1fSU5ERVhdID0gIjM2TXxNQ1M0IiwKKwkJW0lXTF9SQVRFXzQ4TV9JTkRFWF0gPSAiNDhNfE1DUzUiLAorCQlbSVdMX1JBVEVfNTRNX0lOREVYXSA9ICI1NE18TUNTNiIsCisJCVtJV0xfUkFURV9NQ1NfN19JTkRFWF0gPSAiTUNTNyIsCisJCVtJV0xfUkFURV9NQ1NfOF9JTkRFWF0gPSAiTUNTOCIsCisJCVtJV0xfUkFURV9NQ1NfOV9JTkRFWF0gPSAiTUNTOSIsCisJfTsKKworCWNoYXIgKmJ1ZmYsICpwb3MsICplbmRwb3M7CisJaW50IGNvbCwgcmF0ZTsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCByc19yYXRlX3N0YXRzICpzdGF0czsKKwlzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gMTAyNDsKKworCWJ1ZmYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9zID0gYnVmZjsKKwllbmRwb3MgPSBwb3MgKyBidWZzejsKKworCXBvcyArPSBzY25wcmludGYocG9zLCBlbmRwb3MgLSBwb3MsICJDT0xVTU4sIik7CisJZm9yIChyYXRlID0gMDsgcmF0ZSA8IElXTF9SQVRFX0NPVU5UOyByYXRlKyspCisJCXBvcyArPSBzY25wcmludGYocG9zLCBlbmRwb3MgLSBwb3MsICIlcywiLCByYXRlX25hbWVbcmF0ZV0pOworCXBvcyArPSBzY25wcmludGYocG9zLCBlbmRwb3MgLSBwb3MsICJcbiIpOworCisJZm9yIChjb2wgPSAwOyBjb2wgPCBSU19DT0xVTU5fQ09VTlQ7IGNvbCsrKSB7CisJCXBvcyArPSBzY25wcmludGYocG9zLCBlbmRwb3MgLSBwb3MsCisJCQkJICIlcywiLCBjb2x1bW5fbmFtZVtjb2xdKTsKKworCQlmb3IgKHJhdGUgPSAwOyByYXRlIDwgSVdMX1JBVEVfQ09VTlQ7IHJhdGUrKykgeworCQkJc3RhdHMgPSAmKGxxX3N0YS0+dHhfc3RhdHNbY29sXVtyYXRlXSk7CisJCQlwb3MgKz0gc2NucHJpbnRmKHBvcywgZW5kcG9zIC0gcG9zLAorCQkJCQkgIiVsbHUvJWxsdSwiLAorCQkJCQkgc3RhdHMtPnN1Y2Nlc3MsCisJCQkJCSBzdGF0cy0+dG90YWwpOworCQl9CisJCXBvcyArPSBzY25wcmludGYocG9zLCBlbmRwb3MgLSBwb3MsICJcbiIpOworCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgcG9zIC0gYnVmZik7CisJa2ZyZWUoYnVmZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcnNfc3RhX2RiZ2ZzX2Rydl90eF9zdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbWVtc2V0KGxxX3N0YS0+dHhfc3RhdHMsIDAsIHNpemVvZihscV9zdGEtPnR4X3N0YXRzKSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzX3N0YV9kYmdmc19kcnZfdHhfc3RhdHNfb3BzID0geworCS5yZWFkID0gcnNfc3RhX2RiZ2ZzX2Rydl90eF9zdGF0c19yZWFkLAorCS53cml0ZSA9IHJzX3N0YV9kYmdmc19kcnZfdHhfc3RhdHNfd3JpdGUsCisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCiBzdGF0aWMgdm9pZCByc19hZGRfZGVidWdmcyh2b2lkICptdm0sIHZvaWQgKm12bV9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcikKIHsKIAlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gbXZtX3N0YTsKQEAgLTI5MzcsOSArMzE4OCwxNSBAQAogCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3N0YXRzX3RhYmxlIiwgU19JUlVTUiwgZGlyLAogCQkJCSAgICBscV9zdGEsICZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19kcnZfdHhfc3RhdHNfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRydl90eF9zdGF0cyIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCisJCQkJICAgIGxxX3N0YSwgJnJzX3N0YV9kYmdmc19kcnZfdHhfc3RhdHNfb3BzKTsKIAlscV9zdGEtPnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGUgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV91OCgidHhfYWdnX3RpZF9lbmFibGUiLCBTX0lSVVNSIHwgU19JV1VTUiwgZGlyLAogCQkJCSAgJmxxX3N0YS0+dHhfYWdnX3RpZF9lbik7CisJbHFfc3RhLT5yc19zdGFfZGJnZnNfcmVkdWNlZF90eHBfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX3U4KCJyZWR1Y2VkX3RwYyIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCisJCQkJICAmbHFfc3RhLT5kYmdfZml4ZWRfdHhwX3JlZHVjdGlvbik7CiB9CiAKIHN0YXRpYyB2b2lkIHJzX3JlbW92ZV9kZWJ1Z2ZzKHZvaWQgKm12bSwgdm9pZCAqbXZtX3N0YSkKQEAgLTI5NDcsNyArMzIwNCw5IEBACiAJc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IG12bV9zdGE7CiAJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfZmlsZSk7CiAJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfZHJ2X3R4X3N0YXRzX2ZpbGUpOwogCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfcmVkdWNlZF90eHBfZmlsZSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3JzLmgKaW5kZXggMGFjZmFjOS4uMzc0YTgzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5oCkBAIC0xNTgsNiArMTU4LDEzIEBACiAjZGVmaW5lIFJTX1NSX0ZPUkNFX0RFQ1JFQVNFCQkxOTIwCS8qICAxNSUgKi8KICNkZWZpbmUgUlNfU1JfTk9fREVDUkVBU0UJCTEwODgwCS8qICA4NSUgKi8KIAorI2RlZmluZSBUUENfU1JfRk9SQ0VfSU5DUkVBU0UJCTk2MDAJLyogNzUlICovCisjZGVmaW5lIFRQQ19TUl9OT19JTkNSRUFTRQkJMTA4ODAJLyogODUlICovCisjZGVmaW5lIFRQQ19UWF9QT1dFUl9TVEVQCQkzCisjZGVmaW5lIFRQQ19NQVhfUkVEVUNUSU9OCQkxNQorI2RlZmluZSBUUENfTk9fUkVEVUNUSU9OCQkwCisjZGVmaW5lIFRQQ19JTlZBTElECQkJMHhmZgorCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYJKDQwMDApIC8qIDQgbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9NQVgJKDgwMDApCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9NSU4JKDEwMCkKQEAgLTI2Niw5ICsyNzMsMTYgQEAKIAlSU19DT0xVTU5fTUlNTzJfU0dJLAogCiAJUlNfQ09MVU1OX0xBU1QgPSBSU19DT0xVTU5fTUlNTzJfU0dJLAorCVJTX0NPTFVNTl9DT1VOVCA9IFJTX0NPTFVNTl9MQVNUICsgMSwKIAlSU19DT0xVTU5fSU5WQUxJRCwKIH07CiAKKy8qIFBhY2tldCBzdGF0cyBwZXIgcmF0ZSAqLworc3RydWN0IHJzX3JhdGVfc3RhdHMgeworCXU2NCBzdWNjZXNzOworCXU2NCB0b3RhbDsKK307CisKIC8qKgogICogc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAtLSB0eCBwYXJhbXMgYW5kIHN1Y2Nlc3MgaGlzdG9yeSBmb3IgYWxsIHJhdGVzCiAgKgpAQCAtMjgwLDYgKzI5NCw4IEBACiAJZW51bSByc19jb2x1bW4gY29sdW1uOwogCWNvbnN0IHUxNiAqZXhwZWN0ZWRfdHB0OwkvKiB0aHJvdWdocHV0IG1ldHJpY3M7IGV4cGVjdGVkX3RwdF9HLCBldGMuICovCiAJc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgd2luW0lXTF9SQVRFX0NPVU5UXTsgLyogcmF0ZSBoaXN0b3JpZXMgKi8KKwkvKiBwZXIgdHhwb3dlci1yZWR1Y3Rpb24gaGlzdG9yeSAqLworCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhIHRwY193aW5bVFBDX01BWF9SRURVQ1RJT04gKyAxXTsKIH07CiAKIGVudW0gewpAQCAtMzE1LDYgKzMzMSw4IEBACiAJYm9vbCBpc192aHQ7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCisJc3RydWN0IHJzX3JhdGVfc3RhdHMgdHhfc3RhdHNbUlNfQ09MVU1OX0NPVU5UXVtJV0xfUkFURV9DT1VOVF07CisKIAkvKiBUaGUgZm9sbG93aW5nIGFyZSBiaXRtYXBzIG9mIHJhdGVzOyBJV0xfUkFURV82TV9NQVNLLCBldGMuICovCiAJdW5zaWduZWQgbG9uZyBhY3RpdmVfbGVnYWN5X3JhdGU7CiAJdW5zaWduZWQgbG9uZyBhY3RpdmVfc2lzb19yYXRlOwpAQCAtMzM0LDggKzM1MiwxMSBAQAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiAJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGU7CiAJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX2Rydl90eF9zdGF0c19maWxlOwogCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3JlZHVjZWRfdHhwX2ZpbGU7CiAJdTMyIGRiZ19maXhlZF9yYXRlOworCXU4IGRiZ19maXhlZF90eHBfcmVkdWN0aW9uOwogI2VuZGlmCiAJc3RydWN0IGl3bF9tdm0gKmRydjsKIApAQCAtMzQ1LDYgKzM2Niw5IEBACiAJdTMyIGxhc3RfcmF0ZV9uX2ZsYWdzOwogCS8qIHBhY2tldHMgZGVzdGluZWQgZm9yIHRoaXMgU1RBIGFyZSBhZ2dyZWdhdGVkICovCiAJdTggaXNfYWdnOworCisJLyogdHggcG93ZXIgcmVkdWNlIGZvciB0aGlzIHN0YSAqLworCWludCB0cGNfcmVkdWNlOwogfTsKIAogLyogSW5pdGlhbGl6ZSBzdGF0aW9uJ3MgcmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIGFmdGVyIGFkZGluZyBzdGF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnguYwppbmRleCA2MDYxNTUzLi5jZjcyNzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3J4LmMKQEAgLTYwLDcgKzYwLDYgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCi0KICNpbmNsdWRlICJtdm0uaCIKICNpbmNsdWRlICJmdy1hcGkuaCIKIApAQCAtMTMwLDQyICsxMjksNyBAQAogCiAJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOwogCi0JaWVlZTgwMjExX3J4X25pKG12bS0+aHcsIHNrYik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9tdm1fY2FsY19yc3NpKHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X3BoeV9pbmZvICpwaHlfaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCi17Ci0JaW50IHJzc2lfYSwgcnNzaV9iLCByc3NpX2FfZGJtLCByc3NpX2JfZGJtLCBtYXhfcnNzaV9kYm07Ci0JdTMyIGFnY19hLCBhZ2NfYjsKLQl1MzIgdmFsOwotCi0JdmFsID0gbGUzMl90b19jcHUocGh5X2luZm8tPm5vbl9jZmdfcGh5W0lXTF9SWF9JTkZPX0FHQ19JRFhdKTsKLQlhZ2NfYSA9ICh2YWwgJiBJV0xfT0ZETV9BR0NfQV9NU0spID4+IElXTF9PRkRNX0FHQ19BX1BPUzsKLQlhZ2NfYiA9ICh2YWwgJiBJV0xfT0ZETV9BR0NfQl9NU0spID4+IElXTF9PRkRNX0FHQ19CX1BPUzsKLQotCXZhbCA9IGxlMzJfdG9fY3B1KHBoeV9pbmZvLT5ub25fY2ZnX3BoeVtJV0xfUlhfSU5GT19SU1NJX0FCX0lEWF0pOwotCXJzc2lfYSA9ICh2YWwgJiBJV0xfT0ZETV9SU1NJX0lOQkFORF9BX01TSykgPj4gSVdMX09GRE1fUlNTSV9BX1BPUzsKLQlyc3NpX2IgPSAodmFsICYgSVdMX09GRE1fUlNTSV9JTkJBTkRfQl9NU0spID4+IElXTF9PRkRNX1JTU0lfQl9QT1M7Ci0KLQkvKgotCSAqIGRCbSA9IHJzc2kgZEIgLSBhZ2MgZEIgLSBjb25zdGFudC4KLQkgKiBIaWdoZXIgQUdDIChoaWdoZXIgcmFkaW8gZ2FpbikgbWVhbnMgbG93ZXIgc2lnbmFsLgotCSAqLwotCXJzc2lfYV9kYm0gPSByc3NpX2EgLSBJV0xfUlNTSV9PRkZTRVQgLSBhZ2NfYTsKLQlyc3NpX2JfZGJtID0gcnNzaV9iIC0gSVdMX1JTU0lfT0ZGU0VUIC0gYWdjX2I7Ci0JbWF4X3Jzc2lfZGJtID0gbWF4X3QoaW50LCByc3NpX2FfZGJtLCByc3NpX2JfZGJtKTsKLQotCUlXTF9ERUJVR19TVEFUUyhtdm0sICJSc3NpIEluIEEgJWQgQiAlZCBNYXggJWQgQUdDQSAlZCBBR0NCICVkXG4iLAotCQkJcnNzaV9hX2RibSwgcnNzaV9iX2RibSwgbWF4X3Jzc2lfZGJtLCBhZ2NfYSwgYWdjX2IpOwotCi0Jcnhfc3RhdHVzLT5zaWduYWwgPSBtYXhfcnNzaV9kYm07Ci0Jcnhfc3RhdHVzLT5jaGFpbnMgPSAobGUxNl90b19jcHUocGh5X2luZm8tPnBoeV9mbGFncykgJgotCQkJCVJYX1JFU19QSFlfRkxBR1NfQU5URU5OQSkKLQkJCQkJPj4gUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX1BPUzsKLQlyeF9zdGF0dXMtPmNoYWluX3NpZ25hbFswXSA9IHJzc2lfYV9kYm07Ci0Jcnhfc3RhdHVzLT5jaGFpbl9zaWduYWxbMV0gPSByc3NpX2JfZGJtOworCWllZWU4MDIxMV9yeChtdm0tPmh3LCBza2IpOwogfQogCiAvKgpAQCAtMzM3LDEwICszMDEsNyBAQAogCSAqLwogCS8qcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19NQUNUSU1FX01QRFU7Ki8KIAotCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19SWF9FTkVSR1lfQVBJKQotCQlpd2xfbXZtX2dldF9zaWduYWxfc3RyZW5ndGgobXZtLCBwaHlfaW5mbywgJnJ4X3N0YXR1cyk7Ci0JZWxzZQotCQlpd2xfbXZtX2NhbGNfcnNzaShtdm0sIHBoeV9pbmZvLCAmcnhfc3RhdHVzKTsKKwlpd2xfbXZtX2dldF9zaWduYWxfc3RyZW5ndGgobXZtLCBwaHlfaW5mbywgJnJ4X3N0YXR1cyk7CiAKIAlJV0xfREVCVUdfU1RBVFNfTElNSVQobXZtLCAiUnNzaSAlZCwgVFNGICVsbHVcbiIsIHJ4X3N0YXR1cy5zaWduYWwsCiAJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKQEAgLTM5NCw2ICszNTUsOCBAQAogCQlyeF9zdGF0dXMucmF0ZV9pZHggPSByYXRlX25fZmxhZ3MgJiBSQVRFX1ZIVF9NQ1NfUkFURV9DT0RFX01TSzsKIAkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19WSFQ7CiAJCXJ4X3N0YXR1cy5mbGFnIHw9IHN0YmMgPDwgUlhfRkxBR19TVEJDX1NISUZUOworCQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQkZfTVNLKQorCQkJcnhfc3RhdHVzLnZodF9mbGFnIHw9IFJYX1ZIVF9GTEFHX0JGOwogCX0gZWxzZSB7CiAJCXJ4X3N0YXR1cy5yYXRlX2lkeCA9CiAJCQlpd2xfbXZtX2xlZ2FjeV9yYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zY2FuLmMKaW5kZXggYzI4ZGU1NC4uNGI2YzdkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NjYW4uYwpAQCAtMzA2LDcgKzMwNiw2IEBACiAJCS5pZCA9IFNDQU5fUkVRVUVTVF9DTUQsCiAJCS5sZW4gPSB7IDAsIH0sCiAJCS5kYXRhID0geyBtdm0tPnNjYW5fY21kLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKIAkJLmRhdGFmbGFncyA9IHsgSVdMX0hDTURfREZMX05PQ09QWSwgfSwKIAl9OwogCXN0cnVjdCBpd2xfc2Nhbl9jbWQgKmNtZCA9IG12bS0+c2Nhbl9jbWQ7CkBAIC0zMTksNyArMzE4LDEwIEBACiAJc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgcGFyYW1zID0ge307CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKLQlCVUdfT04obXZtLT5zY2FuX2NtZCA9PSBOVUxMKTsKKworCS8qIHdlIHNob3VsZCBoYXZlIGZhaWxlZCByZWdpc3RyYXRpb24gaWYgc2Nhbl9jbWQgd2FzIE5VTEwgKi8KKwlpZiAoV0FSTl9PTihtdm0tPnNjYW5fY21kID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCUlXTF9ERUJVR19TQ0FOKG12bSwgIkhhbmRsaW5nIG1hYzgwMjExIHNjYW4gcmVxdWVzdFxuIik7CiAJbXZtLT5zY2FuX3N0YXR1cyA9IElXTF9NVk1fU0NBTl9PUzsKQEAgLTUxNCw3ICs1MTYsNyBAQAogCQkJCSAgIEFSUkFZX1NJWkUoc2Nhbl9hYm9ydF9ub3RpZiksCiAJCQkJICAgaXdsX212bV9zY2FuX2Fib3J0X25vdGlmLCBOVUxMKTsKIAotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgU0NBTl9BQk9SVF9DTUQsIENNRF9TWU5DLCAwLCBOVUxMKTsKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFNDQU5fQUJPUlRfQ01ELCAwLCAwLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCUlXTF9FUlIobXZtLCAiQ291bGRuJ3Qgc2VuZCBTQ0FOX0FCT1JUX0NNRDogJWRcbiIsIHJldCk7CiAJCS8qIG1hYzgwMjExJ3Mgc3RhdGUgd2lsbCBiZSBjbGVhbmVkIGluIHRoZSBuaWNfcmVzdGFydCBmbG93ICovCkBAIC01MzgsOSArNTQwLDEzIEBACiAJLyogc2NhbiBzdGF0dXMgbXVzdCBiZSBsb2NrZWQgZm9yIHByb3BlciBjaGVja2luZyAqLwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCi0JSVdMX0RFQlVHX1NDQU4obXZtLCAiU2NoZWR1bGVkIHNjYW4gY29tcGxldGVkLCBzdGF0dXMgJXNcbiIsCisJSVdMX0RFQlVHX1NDQU4obXZtLAorCQkgICAgICAgIlNjaGVkdWxlZCBzY2FuIGNvbXBsZXRlZCwgc3RhdHVzICVzIEVCUyBzdGF0dXMgJXM6JWRcbiIsCiAJCSAgICAgICBzY2FuX25vdGlmLT5zdGF0dXMgPT0gSVdMX1NDQU5fT0ZGTE9BRF9DT01QTEVURUQgPwotCQkgICAgICAgImNvbXBsZXRlZCIgOiAiYWJvcnRlZCIpOworCQkgICAgICAgImNvbXBsZXRlZCIgOiAiYWJvcnRlZCIsIHNjYW5fbm90aWYtPmVic19zdGF0dXMgPT0KKwkJICAgICAgIElXTF9TQ0FOX0VCU19TVUNDRVNTID8gInN1Y2Nlc3MiIDogImZhaWxlZCIsCisJCSAgICAgICBzY2FuX25vdGlmLT5lYnNfc3RhdHVzKTsKKwogCiAJLyogb25seSBjYWxsIG1hYzgwMjExIGNvbXBsZXRpb24gaWYgdGhlIHN0b3Agd2FzIGluaXRpYXRlZCBieSBGVyAqLwogCWlmIChtdm0tPnNjYW5fc3RhdHVzID09IElXTF9NVk1fU0NBTl9TQ0hFRCkgewpAQCAtNTQ4LDYgKzU1NCw4IEBACiAJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQobXZtLT5odyk7CiAJfQogCisJbXZtLT5sYXN0X2Vic19zdWNjZXNzZnVsID0gIXNjYW5fbm90aWYtPmVic19zdGF0dXM7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQwLDcgKzc0OCw2IEBACiAJc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfY2ZnICpzY2FuX2NmZzsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gU0NBTl9PRkZMT0FEX0NPTkZJR19DTUQsCi0JCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAJc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgcGFyYW1zID0ge307CiAKQEAgLTc5OCw3ICs4MDUsNiBAQAogCXN0cnVjdCBpd2xfc2Nhbl9vZmZsb2FkX2JsYWNrbGlzdCAqYmxhY2tsaXN0OwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBTQ0FOX09GRkxPQURfVVBEQVRFX1BST0ZJTEVTX0NNRCwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJCS5sZW5bMV0gPSBzaXplb2YoKnByb2ZpbGVfY2ZnKSwKIAkJLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFksCiAJCS5kYXRhZmxhZ3NbMV0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLApAQCAtODg0LDcgKzg5MCwxMiBAQAogCQlzY2FuX3JlcS5mbGFncyB8PSBjcHVfdG9fbGUxNihJV0xfU0NBTl9PRkZMT0FEX0ZMQUdfUEFTU19BTEwpOwogCX0KIAotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFNDQU5fT0ZGTE9BRF9SRVFVRVNUX0NNRCwgQ01EX1NZTkMsCisJaWYgKG12bS0+bGFzdF9lYnNfc3VjY2Vzc2Z1bCAmJgorCSAgICBtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVCkKKwkJc2Nhbl9yZXEuZmxhZ3MgfD0KKwkJCWNwdV90b19sZTE2KElXTF9TQ0FOX09GRkxPQURfRkxBR19FQlNfQUNDVVJBVEVfTU9ERSk7CisKKwlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBTQ0FOX09GRkxPQURfUkVRVUVTVF9DTUQsIDAsCiAJCQkJICAgIHNpemVvZihzY2FuX3JlcSksICZzY2FuX3JlcSk7CiB9CiAKQEAgLTg5Myw3ICs5MDQsNiBAQAogCWludCByZXQ7CiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IFNDQU5fT0ZGTE9BRF9BQk9SVF9DTUQsCi0JCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAJdTMyIHN0YXR1czsKIApAQCAtOTIyLDcgKzkzMiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bF9tdm1fc2NoZWRfc2Nhbl9zdG9wKHN0cnVjdCBpd2xfbXZtICptdm0pCitpbnQgaXdsX212bV9zY2hlZF9zY2FuX3N0b3Aoc3RydWN0IGl3bF9tdm0gKm12bSwgYm9vbCBub3RpZnkpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IHdhaXRfc2Nhbl9kb25lOwpAQCAtOTYwLDUgKzk3MCw4IEBACiAJICovCiAJbXZtLT5zY2FuX3N0YXR1cyA9IElXTF9NVk1fU0NBTl9OT05FOwogCisJaWYgKG5vdGlmeSkKKwkJaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZChtdm0tPmh3KTsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2YuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NmLmMKaW5kZXggODg4MDliMi4uN2VkZmQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2YuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zZi5jCkBAIC0yMzcsOSArMjM3LDYgQEAKIAkJLnN0YV92aWZfYXBfc3RhX2lkID0gSVdMX01WTV9TVEFUSU9OX0NPVU5ULAogCX07CiAKLQlpZiAoSVdMX1VDT0RFX0FQSShtdm0tPmZ3LT51Y29kZV92ZXIpIDwgOCkKLQkJcmV0dXJuIDA7Ci0KIAkvKgogCSAqIElnbm9yZSB0aGUgY2FsbCBpZiB3ZSBhcmUgaW4gSFcgUmVzdGFydCBmbG93LCBvciBpZiB0aGUgaGFuZGxlZAogCSAqIHZpZiBpcyBhIHAycCBkZXZpY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCmluZGV4IGYzMzllZjguLjFmYjAxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCkBAIC02NiwxMTUgKzY2LDYgQEAKICNpbmNsdWRlICJzdGEuaCIKICNpbmNsdWRlICJycy5oIgogCi1zdGF0aWMgdm9pZCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y3X3RvX3Y1KHN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y3ICpjbWRfdjcsCi0JCQkJCSBzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZF92NSAqY21kX3Y1KQotewotCW1lbXNldChjbWRfdjUsIDAsIHNpemVvZigqY21kX3Y1KSk7Ci0KLQljbWRfdjUtPmFkZF9tb2RpZnkgPSBjbWRfdjctPmFkZF9tb2RpZnk7Ci0JY21kX3Y1LT50aWRfZGlzYWJsZV90eCA9IGNtZF92Ny0+dGlkX2Rpc2FibGVfdHg7Ci0JY21kX3Y1LT5tYWNfaWRfbl9jb2xvciA9IGNtZF92Ny0+bWFjX2lkX25fY29sb3I7Ci0JbWVtY3B5KGNtZF92NS0+YWRkciwgY21kX3Y3LT5hZGRyLCBFVEhfQUxFTik7Ci0JY21kX3Y1LT5zdGFfaWQgPSBjbWRfdjctPnN0YV9pZDsKLQljbWRfdjUtPm1vZGlmeV9tYXNrID0gY21kX3Y3LT5tb2RpZnlfbWFzazsKLQljbWRfdjUtPnN0YXRpb25fZmxhZ3MgPSBjbWRfdjctPnN0YXRpb25fZmxhZ3M7Ci0JY21kX3Y1LT5zdGF0aW9uX2ZsYWdzX21zayA9IGNtZF92Ny0+c3RhdGlvbl9mbGFnc19tc2s7Ci0JY21kX3Y1LT5hZGRfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZF92Ny0+YWRkX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JY21kX3Y1LT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZF92Ny0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JY21kX3Y1LT5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNtZF92Ny0+YWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0JY21kX3Y1LT5zbGVlcF90eF9jb3VudCA9IGNtZF92Ny0+c2xlZXBfdHhfY291bnQ7Ci0JY21kX3Y1LT5zbGVlcF9zdGF0ZV9mbGFncyA9IGNtZF92Ny0+c2xlZXBfc3RhdGVfZmxhZ3M7Ci0JY21kX3Y1LT5hc3NvY19pZCA9IGNtZF92Ny0+YXNzb2NfaWQ7Ci0JY21kX3Y1LT5iZWFtZm9ybV9mbGFncyA9IGNtZF92Ny0+YmVhbWZvcm1fZmxhZ3M7Ci0JY21kX3Y1LT50ZmRfcXVldWVfbXNrID0gY21kX3Y3LT50ZmRfcXVldWVfbXNrOwotfQotCi1zdGF0aWMgdm9pZAotaXdsX212bV9hZGRfc3RhX2tleV90b19hZGRfc3RhX2NtZF92NShzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2tleV9jbWQgKmtleV9jbWQsCi0JCQkJICAgICAgc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjUgKnN0YV9jbWQsCi0JCQkJICAgICAgdTMyIG1hY19pZF9uX2NvbG9yKQotewotCW1lbXNldChzdGFfY21kLCAwLCBzaXplb2YoKnN0YV9jbWQpKTsKLQotCXN0YV9jbWQtPnN0YV9pZCA9IGtleV9jbWQtPnN0YV9pZDsKLQlzdGFfY21kLT5hZGRfbW9kaWZ5ID0gU1RBX01PREVfTU9ESUZZOwotCXN0YV9jbWQtPm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVk7Ci0Jc3RhX2NtZC0+bWFjX2lkX25fY29sb3IgPSBjcHVfdG9fbGUzMihtYWNfaWRfbl9jb2xvcik7Ci0KLQlzdGFfY21kLT5rZXkua2V5X29mZnNldCA9IGtleV9jbWQtPmtleV9vZmZzZXQ7Ci0Jc3RhX2NtZC0+a2V5LmtleV9mbGFncyA9IGtleV9jbWQtPmtleV9mbGFnczsKLQltZW1jcHkoc3RhX2NtZC0+a2V5LmtleSwga2V5X2NtZC0+a2V5LCBzaXplb2Yoc3RhX2NtZC0+a2V5LmtleSkpOwotCXN0YV9jbWQtPmtleS50a2lwX3J4X3RzY19ieXRlMiA9IGtleV9jbWQtPnRraXBfcnhfdHNjX2J5dGUyOwotCW1lbWNweShzdGFfY21kLT5rZXkudGtpcF9yeF90dGFrLCBrZXlfY21kLT50a2lwX3J4X3R0YWssCi0JICAgICAgIHNpemVvZihzdGFfY21kLT5rZXkudGtpcF9yeF90dGFrKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9zZW5kX2FkZF9zdGFfY21kX3N0YXR1cyhzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCQkgICBzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZF92NyAqY21kLAotCQkJCQkgICBpbnQgKnN0YXR1cykKLXsKLQlzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZF92NSBjbWRfdjU7Ci0KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfU1RBX0tFWV9DTUQpCi0JCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdV9zdGF0dXMobXZtLCBBRERfU1RBLCBzaXplb2YoKmNtZCksCi0JCQkJCQkgICBjbWQsIHN0YXR1cyk7Ci0KLQlpd2xfbXZtX2FkZF9zdGFfY21kX3Y3X3RvX3Y1KGNtZCwgJmNtZF92NSk7Ci0KLQlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHVfc3RhdHVzKG12bSwgQUREX1NUQSwgc2l6ZW9mKGNtZF92NSksCi0JCQkJCSAgICZjbWRfdjUsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9zZW5kX2FkZF9zdGFfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sIHUzMiBmbGFncywKLQkJCQkgICAgc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgKmNtZCkKLXsKLQlzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZF92NSBjbWRfdjU7Ci0KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfU1RBX0tFWV9DTUQpCi0JCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEFERF9TVEEsIGZsYWdzLAotCQkJCQkgICAgc2l6ZW9mKCpjbWQpLCBjbWQpOwotCi0JaXdsX212bV9hZGRfc3RhX2NtZF92N190b192NShjbWQsICZjbWRfdjUpOwotCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQUREX1NUQSwgZmxhZ3MsIHNpemVvZihjbWRfdjUpLAotCQkJCSAgICAmY21kX3Y1KTsKLX0KLQotc3RhdGljIGludAotaXdsX212bV9zZW5kX2FkZF9zdGFfa2V5X2NtZF9zdGF0dXMoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkgICAgc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9rZXlfY21kICpjbWQsCi0JCQkJICAgIHUzMiBtYWNfaWRfbl9jb2xvciwKLQkJCQkgICAgaW50ICpzdGF0dXMpCi17Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjUgc3RhX2NtZDsKLQotCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19TVEFfS0VZX0NNRCkKLQkJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1X3N0YXR1cyhtdm0sIEFERF9TVEFfS0VZLAotCQkJCQkJICAgc2l6ZW9mKCpjbWQpLCBjbWQsIHN0YXR1cyk7Ci0KLQlpd2xfbXZtX2FkZF9zdGFfa2V5X3RvX2FkZF9zdGFfY21kX3Y1KGNtZCwgJnN0YV9jbWQsIG1hY19pZF9uX2NvbG9yKTsKLQotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdV9zdGF0dXMobXZtLCBBRERfU1RBLCBzaXplb2Yoc3RhX2NtZCksCi0JCQkJCSAgICZzdGFfY21kLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgaW50IGl3bF9tdm1fc2VuZF9hZGRfc3RhX2tleV9jbWQoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkJdTMyIGZsYWdzLAotCQkJCQlzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2tleV9jbWQgKmNtZCwKLQkJCQkJdTMyIG1hY19pZF9uX2NvbG9yKQotewotCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y1IHN0YV9jbWQ7Ci0KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfU1RBX0tFWV9DTUQpCi0JCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEFERF9TVEFfS0VZLCBmbGFncywKLQkJCQkJICAgIHNpemVvZigqY21kKSwgY21kKTsKLQotCWl3bF9tdm1fYWRkX3N0YV9rZXlfdG9fYWRkX3N0YV9jbWRfdjUoY21kLCAmc3RhX2NtZCwgbWFjX2lkX25fY29sb3IpOwotCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQUREX1NUQSwgZmxhZ3MsIHNpemVvZihzdGFfY21kKSwKLQkJCQkgICAgJnN0YV9jbWQpOwotfQotCiBzdGF0aWMgaW50IGl3bF9tdm1fZmluZF9mcmVlX3N0YV9pZChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCSAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZSkKIHsKQEAgLTIwNyw3ICs5OCw3IEBACiAJCQkgICBib29sIHVwZGF0ZSkKIHsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bV9zdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgYWRkX3N0YV9jbWQ7CisJc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgYWRkX3N0YV9jbWQ7CiAJaW50IHJldDsKIAl1MzIgc3RhdHVzOwogCXUzMiBhZ2dfc2l6ZSA9IDAsIG1wZHVfZGVucyA9IDA7CkBAIC0yOTUsNyArMTg2LDggQEAKIAkJY3B1X3RvX2xlMzIobXBkdV9kZW5zIDw8IFNUQV9GTEdfQUdHX01QRFVfREVOU19TSElGVCk7CiAKIAlzdGF0dXMgPSBBRERfU1RBX1NVQ0NFU1M7Ci0JcmV0ID0gaXdsX212bV9zZW5kX2FkZF9zdGFfY21kX3N0YXR1cyhtdm0sICZhZGRfc3RhX2NtZCwgJnN0YXR1cyk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHVfc3RhdHVzKG12bSwgQUREX1NUQSwgc2l6ZW9mKGFkZF9zdGFfY21kKSwKKwkJCQkJICAmYWRkX3N0YV9jbWQsICZzdGF0dXMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTM4MCw3ICsyNzIsNyBAQAogaW50IGl3bF9tdm1fZHJhaW5fc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtc3RhLAogCQkgICAgICBib29sIGRyYWluKQogewotCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y3IGNtZCA9IHt9OworCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kIGNtZCA9IHt9OwogCWludCByZXQ7CiAJdTMyIHN0YXR1czsKIApAQCAtMzkzLDcgKzI4NSw4IEBACiAJY21kLnN0YXRpb25fZmxhZ3NfbXNrID0gY3B1X3RvX2xlMzIoU1RBX0ZMR19EUkFJTl9GTE9XKTsKIAogCXN0YXR1cyA9IEFERF9TVEFfU1VDQ0VTUzsKLQlyZXQgPSBpd2xfbXZtX3NlbmRfYWRkX3N0YV9jbWRfc3RhdHVzKG12bSwgJmNtZCwgJnN0YXR1cyk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHVfc3RhdHVzKG12bSwgQUREX1NUQSwgc2l6ZW9mKGNtZCksCisJCQkJCSAgJmNtZCwgJnN0YXR1cyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDM0LDcgKzMyNyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgUkVNT1ZFX1NUQSwgQ01EX1NZTkMsCisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBSRU1PVkVfU1RBLCAwLAogCQkJCSAgIHNpemVvZihybV9zdGFfY21kKSwgJnJtX3N0YV9jbWQpOwogCWlmIChyZXQpIHsKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcmVtb3ZlIHN0YXRpb24uIElkPSVkXG4iLCBzdGFfaWQpOwpAQCAtNDk4LDcgKzM5MSw3IEBACiAJCQkJc3RhX2lkKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihtdm0tPmZ3X2lkX3RvX21hY19pZFtzdGFfaWRdLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihtdm0tPmZ3X2lkX3RvX21hY19pZFtzdGFfaWRdLCBOVUxMKTsKIAkJY2xlYXJfYml0KHN0YV9pZCwgbXZtLT5zdGFfZHJhaW5lZCk7CiAJfQogCkBAIC01MjAsMTQgKzQxMyw2IEBACiAJCS8qIGZsdXNoIGl0cyBxdWV1ZXMgaGVyZSBzaW5jZSB3ZSBhcmUgZnJlZWluZyBtdm1fc3RhICovCiAJCXJldCA9IGl3bF9tdm1fZmx1c2hfdHhfcGF0aChtdm0sIG12bV9zdGEtPnRmZF9xdWV1ZV9tc2ssIHRydWUpOwogCi0JCS8qCi0JCSAqIFB1dCBhIG5vbi1OVUxMIHNpbmNlIHRoZSBmdyBzdGF0aW9uIGlzbid0IHJlbW92ZWQuCi0JCSAqIEl0IHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGUgTUFDIHdpbGwgYmUgc2V0IGFzCi0JCSAqIHVuYXNzb2MuCi0JCSAqLwotCQlyY3VfYXNzaWduX3BvaW50ZXIobXZtLT5md19pZF90b19tYWNfaWRbbXZtX3N0YS0+c3RhX2lkXSwKLQkJCQkgICBFUlJfUFRSKC1FSU5WQUwpKTsKLQogCQkvKiBpZiB3ZSBhcmUgYXNzb2NpYXRlZCAtIHdlIGNhbid0IHJlbW92ZSB0aGUgQVAgU1RBIG5vdyAqLwogCQlpZiAodmlmLT5ic3NfY29uZi5hc3NvYykKIAkJCXJldHVybiByZXQ7CkBAIC01NTcsNyArNDQyLDcgQEAKIAl9IGVsc2UgewogCQlzcGluX3VubG9ja19iaCgmbXZtX3N0YS0+bG9jayk7CiAJCXJldCA9IGl3bF9tdm1fcm1fc3RhX2NvbW1vbihtdm0sIG12bV9zdGEtPnN0YV9pZCk7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihtdm0tPmZ3X2lkX3RvX21hY19pZFttdm1fc3RhLT5zdGFfaWRdLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihtdm0tPmZ3X2lkX3RvX21hY19pZFttdm1fc3RhLT5zdGFfaWRdLCBOVUxMKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNTcxLDcgKzQ1Niw3IEBACiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcihtdm0tPmZ3X2lkX3RvX21hY19pZFtzdGFfaWRdLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKG12bS0+ZndfaWRfdG9fbWFjX2lkW3N0YV9pZF0sIE5VTEwpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU5Myw3ICs0NzgsNyBAQAogCiB2b2lkIGl3bF9tdm1fZGVhbGxvY19pbnRfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpd2xfbXZtX2ludF9zdGEgKnN0YSkKIHsKLQlyY3VfYXNzaWduX3BvaW50ZXIobXZtLT5md19pZF90b19tYWNfaWRbc3RhLT5zdGFfaWRdLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKG12bS0+ZndfaWRfdG9fbWFjX2lkW3N0YS0+c3RhX2lkXSwgTlVMTCk7CiAJbWVtc2V0KHN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfbXZtX2ludF9zdGEpKTsKIAlzdGEtPnN0YV9pZCA9IElXTF9NVk1fU1RBVElPTl9DT1VOVDsKIH0KQEAgLTYwMywxMyArNDg4LDEzIEBACiAJCQkJICAgICAgY29uc3QgdTggKmFkZHIsCiAJCQkJICAgICAgdTE2IG1hY19pZCwgdTE2IGNvbG9yKQogewotCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y3IGNtZDsKKwlzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2NtZCBjbWQ7CiAJaW50IHJldDsKIAl1MzIgc3RhdHVzOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CiAKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kX3Y3KSk7CisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAljbWQuc3RhX2lkID0gc3RhLT5zdGFfaWQ7CiAJY21kLm1hY19pZF9uX2NvbG9yID0gY3B1X3RvX2xlMzIoRldfQ01EX0lEX0FORF9DT0xPUihtYWNfaWQsCiAJCQkJCQkJICAgICBjb2xvcikpOwpAQCAtNjE5LDcgKzUwNCw4IEBACiAJaWYgKGFkZHIpCiAJCW1lbWNweShjbWQuYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCi0JcmV0ID0gaXdsX212bV9zZW5kX2FkZF9zdGFfY21kX3N0YXR1cyhtdm0sICZjbWQsICZzdGF0dXMpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1X3N0YXR1cyhtdm0sIEFERF9TVEEsIHNpemVvZihjbWQpLAorCQkJCQkgICZjbWQsICZzdGF0dXMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTc1Myw3ICs2MzksNyBAQAogCQkgICAgICAgaW50IHRpZCwgdTE2IHNzbiwgYm9vbCBzdGFydCkKIHsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bV9zdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgY21kID0ge307CisJc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgY21kID0ge307CiAJaW50IHJldDsKIAl1MzIgc3RhdHVzOwogCkBAIC03NzcsNyArNjYzLDggQEAKIAkJCQkgIFNUQV9NT0RJRllfUkVNT1ZFX0JBX1RJRDsKIAogCXN0YXR1cyA9IEFERF9TVEFfU1VDQ0VTUzsKLQlyZXQgPSBpd2xfbXZtX3NlbmRfYWRkX3N0YV9jbWRfc3RhdHVzKG12bSwgJmNtZCwgJnN0YXR1cyk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHVfc3RhdHVzKG12bSwgQUREX1NUQSwgc2l6ZW9mKGNtZCksCisJCQkJCSAgJmNtZCwgJnN0YXR1cyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODEyLDcgKzY5OSw3IEBACiAJCQkgICAgICBpbnQgdGlkLCB1OCBxdWV1ZSwgYm9vbCBzdGFydCkKIHsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bV9zdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgY21kID0ge307CisJc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgY21kID0ge307CiAJaW50IHJldDsKIAl1MzIgc3RhdHVzOwogCkBAIC04MzQsNyArNzIxLDggQEAKIAljbWQudGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNihtdm1fc3RhLT50aWRfZGlzYWJsZV9hZ2cpOwogCiAJc3RhdHVzID0gQUREX1NUQV9TVUNDRVNTOwotCXJldCA9IGl3bF9tdm1fc2VuZF9hZGRfc3RhX2NtZF9zdGF0dXMobXZtLCAmY21kLCAmc3RhdHVzKTsKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdV9zdGF0dXMobXZtLCBBRERfU1RBLCBzaXplb2YoY21kKSwKKwkJCQkJICAmY21kLCAmc3RhdHVzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMTI5LDEyICsxMDE3LDExIEBACiAJCQkJdTggc3RhX2lkLCB1MzIgdGtpcF9pdjMyLCB1MTYgKnRraXBfcDFrLAogCQkJCXUzMiBjbWRfZmxhZ3MpCiB7Ci0JX19sZTE2IGtleV9mbGFnczsKIAlzdHJ1Y3QgaXdsX212bV9hZGRfc3RhX2tleV9jbWQgY21kID0ge307CisJX19sZTE2IGtleV9mbGFnczsKIAlpbnQgcmV0LCBzdGF0dXM7CiAJdTE2IGtleWlkeDsKIAlpbnQgaTsKLQl1MzIgbWFjX2lkX25fY29sb3IgPSBtdm1fc3RhLT5tYWNfaWRfbl9jb2xvcjsKIAogCWtleWlkeCA9IChrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKSAmCiAJCSBTVEFfS0VZX0ZMR19LRVlJRF9NU0s7CkBAIC0xMTY2LDEzICsxMDUzLDEyIEBACiAJY21kLnN0YV9pZCA9IHN0YV9pZDsKIAogCXN0YXR1cyA9IEFERF9TVEFfU1VDQ0VTUzsKLQlpZiAoY21kX2ZsYWdzID09IENNRF9TWU5DKQotCQlyZXQgPSBpd2xfbXZtX3NlbmRfYWRkX3N0YV9rZXlfY21kX3N0YXR1cyhtdm0sICZjbWQsCi0JCQkJCQkJICBtYWNfaWRfbl9jb2xvciwKLQkJCQkJCQkgICZzdGF0dXMpOworCWlmIChjbWRfZmxhZ3MgJiBDTURfQVNZTkMpCisJCXJldCA9ICBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEFERF9TVEFfS0VZLCBDTURfQVNZTkMsCisJCQkJCSAgICBzaXplb2YoY21kKSwgJmNtZCk7CiAJZWxzZQotCQlyZXQgPSBpd2xfbXZtX3NlbmRfYWRkX3N0YV9rZXlfY21kKG12bSwgQ01EX0FTWU5DLCAmY21kLAotCQkJCQkJICAgbWFjX2lkX25fY29sb3IpOworCQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdV9zdGF0dXMobXZtLCBBRERfU1RBX0tFWSwgc2l6ZW9mKGNtZCksCisJCQkJCQkgICZjbWQsICZzdGF0dXMpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIEFERF9TVEFfU1VDQ0VTUzoKQEAgLTEyMjUsNyArMTExMSw3IEBACiAJCSAgICAgICByZW1vdmVfa2V5ID8gInJlbW92aW5nIiA6ICJpbnN0YWxsaW5nIiwKIAkJICAgICAgIGlndGtfY21kLnN0YV9pZCk7CiAKLQlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNR01UX01DQVNUX0tFWSwgQ01EX1NZTkMsCisJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgTUdNVF9NQ0FTVF9LRVksIDAsCiAJCQkJICAgIHNpemVvZihpZ3RrX2NtZCksICZpZ3RrX2NtZCk7CiB9CiAKQEAgLTEzMTIsMTUgKzExOTgsMTUgQEAKIAkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleWNvbmYsIDAsICZzZXEpOwogCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleWNvbmYsIGFkZHIsIHNlcS50a2lwLml2MzIsIHAxayk7CiAJCXJldCA9IGl3bF9tdm1fc2VuZF9zdGFfa2V5KG12bSwgbXZtX3N0YSwga2V5Y29uZiwgc3RhX2lkLAotCQkJCQkgICBzZXEudGtpcC5pdjMyLCBwMWssIENNRF9TWU5DKTsKKwkJCQkJICAgc2VxLnRraXAuaXYzMiwgcDFrLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQlyZXQgPSBpd2xfbXZtX3NlbmRfc3RhX2tleShtdm0sIG12bV9zdGEsIGtleWNvbmYsIHN0YV9pZCwKLQkJCQkJICAgMCwgTlVMTCwgQ01EX1NZTkMpOworCQkJCQkgICAwLCBOVUxMLCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gaXdsX212bV9zZW5kX3N0YV9rZXkobXZtLCBtdm1fc3RhLCBrZXljb25mLAotCQkJCQkgICBzdGFfaWQsIDAsIE5VTEwsIENNRF9TWU5DKTsKKwkJCQkJICAgc3RhX2lkLCAwLCBOVUxMLCAwKTsKIAl9CiAKIAlpZiAocmV0KQpAQCAtMTM5OSw5ICsxMjg1LDggQEAKIAljbWQuc3RhX2lkID0gc3RhX2lkOwogCiAJc3RhdHVzID0gQUREX1NUQV9TVUNDRVNTOwotCXJldCA9IGl3bF9tdm1fc2VuZF9hZGRfc3RhX2tleV9jbWRfc3RhdHVzKG12bSwgJmNtZCwKLQkJCQkJCSAgbXZtX3N0YS0+bWFjX2lkX25fY29sb3IsCi0JCQkJCQkgICZzdGF0dXMpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1X3N0YXR1cyhtdm0sIEFERF9TVEFfS0VZLCBzaXplb2YoY21kKSwKKwkJCQkJICAmY21kLCAmc3RhdHVzKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBBRERfU1RBX1NVQ0NFU1M6CkBAIC0xNDQ4LDcgKzEzMzMsNyBAQAogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgY21kID0geworCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kIGNtZCA9IHsKIAkJLmFkZF9tb2RpZnkgPSBTVEFfTU9ERV9NT0RJRlksCiAJCS5zdGFfaWQgPSBtdm1zdGEtPnN0YV9pZCwKIAkJLnN0YXRpb25fZmxhZ3NfbXNrID0gY3B1X3RvX2xlMzIoU1RBX0ZMR19QUyksCkBAIC0xNDU2LDcgKzEzNDEsNyBAQAogCX07CiAJaW50IHJldDsKIAotCXJldCA9IGl3bF9tdm1fc2VuZF9hZGRfc3RhX2NtZChtdm0sIENNRF9BU1lOQywgJmNtZCk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBBRERfU1RBLCBDTURfQVNZTkMsIHNpemVvZihjbWQpLCAmY21kKTsKIAlpZiAocmV0KQogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBzZW5kIEFERF9TVEEgY29tbWFuZCAoJWQpXG4iLCByZXQpOwogfQpAQCAtMTQ2OCw3ICsxMzUzLDcgQEAKIAkJCQkgICAgICAgYm9vbCBhZ2cpCiB7CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7Ci0Jc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWRfdjcgY21kID0geworCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kIGNtZCA9IHsKIAkJLmFkZF9tb2RpZnkgPSBTVEFfTU9ERV9NT0RJRlksCiAJCS5zdGFfaWQgPSBtdm1zdGEtPnN0YV9pZCwKIAkJLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9TTEVFUElOR19TVEFfVFhfQ09VTlQsCkBAIC0xNTM4LDcgKzE0MjMsNyBAQAogCQljbWQuc2xlZXBfc3RhdGVfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoU1RBX1NMRUVQX1NUQVRFX1VBUFNEKTsKIAl9CiAKLQlyZXQgPSBpd2xfbXZtX3NlbmRfYWRkX3N0YV9jbWQobXZtLCBDTURfQVNZTkMsICZjbWQpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQUREX1NUQSwgQ01EX0FTWU5DLCBzaXplb2YoY21kKSwgJmNtZCk7CiAJaWYgKHJldCkKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gc2VuZCBBRERfU1RBIGNvbW1hbmQgKCVkKVxuIiwgcmV0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmgKaW5kZXggMmVkODRjNC4uZDk4ZThhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc3RhLmgKQEAgLTI1Myw2ICsyNTMsOCBAQAogICoJVGhpcyBpcyBiYXNpY2FsbHkgKGxhc3QgYWNrZWQgcGFja2V0KyspLgogICogQHJhdGVfbl9mbGFnczogUmF0ZSBhdCB3aGljaCBUeCB3YXMgYXR0ZW1wdGVkLiBIb2xkcyB0aGUgZGF0YSBiZXR3ZWVuIHRoZQogICoJVHggcmVzcG9uc2UgKFRYX0NNRCksIGFuZCB0aGUgYmxvY2sgYWNrIG5vdGlmaWNhdGlvbiAoQ09NUFJFU1NFRF9CQSkuCisgKiBAcmVkdWNlZF90cGM6IFJlZHVjZWQgdHggcG93ZXIuIEhvbGRzIHRoZSBkYXRhIGJldHdlZW4gdGhlCisgKglUeCByZXNwb25zZSAoVFhfQ01EKSwgYW5kIHRoZSBibG9jayBhY2sgbm90aWZpY2F0aW9uIChDT01QUkVTU0VEX0JBKS4KICAqIEBzdGF0ZTogc3RhdGUgb2YgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IC8gdGVhciBkb3duLgogICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBieSB0aGUgQkEgc2Vzc2lvbgogICogQHNzbjogdGhlIGZpcnN0IHBhY2tldCB0byBiZSBzZW50IGluIEFHRyBIVyBxdWV1ZSBpbiBUeCBBR0cgc3RhcnQgZmxvdywgb3IKQEAgLTI2NSw2ICsyNjcsNyBAQAogCXUxNiBuZXh0X3JlY2xhaW1lZDsKIAkvKiBUaGUgcmVzdCBpcyBUeCBBR0cgcmVsYXRlZCAqLwogCXUzMiByYXRlX25fZmxhZ3M7CisJdTggcmVkdWNlZF90cGM7CiAJZW51bSBpd2xfbXZtX2FnZ19zdGF0ZSBzdGF0ZTsKIAl1MTYgdHhxX2lkOwogCXUxNiBzc247CkBAIC0yODQsOCArMjg3LDYgQEAKICAqIEB0aWRfZGlzYWJsZV9hZ2c6IGJpdG1hcDogaWYgYml0KHRpZCkgaXMgc2V0LCB0aGUgZncgd29uJ3Qgc2VuZCBhbXBkdXMgZm9yCiAgKgl0aWQuCiAgKiBAbWF4X2FnZ19idWZzaXplOiB0aGUgbWF4aW1hbCBzaXplIG9mIHRoZSBBR0cgYnVmZmVyIGZvciB0aGlzIHN0YXRpb24KLSAqIEBidF9yZWR1Y2VkX3R4cG93ZXJfZGJnOiBkZWJ1ZyBtb2RlIGluIHdoaWNoICVidF9yZWR1Y2VkX3R4cG93ZXIgaXMgZm9yY2VkCi0gKglieSBkZWJ1Z2ZzLgogICogQGJ0X3JlZHVjZWRfdHhwb3dlcjogaXMgcmVkdWNlZCB0eCBwb3dlciBlbmFibGVkIGZvciB0aGlzIHN0YXRpb24KICAqIEBuZXh0X3N0YXR1c19lb3NwOiB0aGUgbmV4dCByZWNsYWltZWQgcGFja2V0IGlzIGEgUFMtUG9sbCByZXNwb25zZSBhbmQKICAqCXdlIG5lZWQgdG8gc2lnbmFsIHRoZSBFT1NQCkBAIC0zMDYsNyArMzA3LDYgQEAKIAl1MzIgbWFjX2lkX25fY29sb3I7CiAJdTE2IHRpZF9kaXNhYmxlX2FnZzsKIAl1OCBtYXhfYWdnX2J1ZnNpemU7Ci0JYm9vbCBidF9yZWR1Y2VkX3R4cG93ZXJfZGJnOwogCWJvb2wgYnRfcmVkdWNlZF90eHBvd2VyOwogCWJvb2wgbmV4dF9zdGF0dXNfZW9zcDsKIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90aW1lLWV2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90aW1lLWV2ZW50LmMKaW5kZXggNjEzMzEyNC4uODAxMDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdGltZS1ldmVudC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3RpbWUtZXZlbnQuYwpAQCAtMjczLDY3ICsyNzMsMTAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyogdXNlZCB0byBjb252ZXJ0IGZyb20gdGltZSBldmVudCBBUEkgdjIgdG8gdjEgKi8KLSNkZWZpbmUgVEVfVjJfREVQX1BPTElDWV9NU0sgKFRFX1YyX0RFUF9PVEhFUiB8IFRFX1YyX0RFUF9UU0YgfFwKLQkJCSAgICAgVEVfVjJfRVZFTlRfU09DSU9QQVRISUMpCi1zdGF0aWMgaW5saW5lIHUxNiB0ZV92Ml9nZXRfbm90aWZ5KF9fbGUxNiBwb2xpY3kpCi17Ci0JcmV0dXJuIGxlMTZfdG9fY3B1KHBvbGljeSkgJiBURV9WMl9OT1RJRl9NU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IHRlX3YyX2dldF9kZXBfcG9saWN5KF9fbGUxNiBwb2xpY3kpCi17Ci0JcmV0dXJuIChsZTE2X3RvX2NwdShwb2xpY3kpICYgVEVfVjJfREVQX1BPTElDWV9NU0spID4+Ci0JCVRFX1YyX1BMQUNFTUVOVF9QT1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IHRlX3YyX2dldF9hYnNlbmNlKF9fbGUxNiBwb2xpY3kpCi17Ci0JcmV0dXJuIChsZTE2X3RvX2NwdShwb2xpY3kpICYgVEVfVjJfQUJTRU5DRSkgPj4gVEVfVjJfQUJTRU5DRV9QT1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9tdm1fdGVfdjJfdG9fdjEoY29uc3Qgc3RydWN0IGl3bF90aW1lX2V2ZW50X2NtZF92MiAqY21kX3YyLAotCQkJCXN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfdjEgKmNtZF92MSkKLXsKLQljbWRfdjEtPmlkX2FuZF9jb2xvciA9IGNtZF92Mi0+aWRfYW5kX2NvbG9yOwotCWNtZF92MS0+YWN0aW9uID0gY21kX3YyLT5hY3Rpb247Ci0JY21kX3YxLT5pZCA9IGNtZF92Mi0+aWQ7Ci0JY21kX3YxLT5hcHBseV90aW1lID0gY21kX3YyLT5hcHBseV90aW1lOwotCWNtZF92MS0+bWF4X2RlbGF5ID0gY21kX3YyLT5tYXhfZGVsYXk7Ci0JY21kX3YxLT5kZXBlbmRzX29uID0gY21kX3YyLT5kZXBlbmRzX29uOwotCWNtZF92MS0+aW50ZXJ2YWwgPSBjbWRfdjItPmludGVydmFsOwotCWNtZF92MS0+ZHVyYXRpb24gPSBjbWRfdjItPmR1cmF0aW9uOwotCWlmIChjbWRfdjItPnJlcGVhdCA9PSBURV9WMl9SRVBFQVRfRU5ETEVTUykKLQkJY21kX3YxLT5yZXBlYXQgPSBjcHVfdG9fbGUzMihURV9WMV9SRVBFQVRfRU5ETEVTUyk7Ci0JZWxzZQotCQljbWRfdjEtPnJlcGVhdCA9IGNwdV90b19sZTMyKGNtZF92Mi0+cmVwZWF0KTsKLQljbWRfdjEtPm1heF9mcmFncyA9IGNwdV90b19sZTMyKGNtZF92Mi0+bWF4X2ZyYWdzKTsKLQljbWRfdjEtPmludGVydmFsX3JlY2lwcm9jYWwgPSAwOyAvKiB1bnVzZWQgKi8KLQotCWNtZF92MS0+ZGVwX3BvbGljeSA9IGNwdV90b19sZTMyKHRlX3YyX2dldF9kZXBfcG9saWN5KGNtZF92Mi0+cG9saWN5KSk7Ci0JY21kX3YxLT5pc19wcmVzZW50ID0gY3B1X3RvX2xlMzIoIXRlX3YyX2dldF9hYnNlbmNlKGNtZF92Mi0+cG9saWN5KSk7Ci0JY21kX3YxLT5ub3RpZnkgPSBjcHVfdG9fbGUzMih0ZV92Ml9nZXRfbm90aWZ5KGNtZF92Mi0+cG9saWN5KSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9zZW5kX3RpbWVfZXZlbnRfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfdjIgKmNtZCkKLXsKLQlzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kX3YxIGNtZF92MTsKLQotCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19USU1FX0VWRU5UX0FQSV9WMikKLQkJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgVElNRV9FVkVOVF9DTUQsIENNRF9TWU5DLAotCQkJCQkgICAgc2l6ZW9mKCpjbWQpLCBjbWQpOwotCi0JaXdsX212bV90ZV92Ml90b192MShjbWQsICZjbWRfdjEpOwotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRJTUVfRVZFTlRfQ01ELCBDTURfU1lOQywKLQkJCQkgICAgc2l6ZW9mKGNtZF92MSksICZjbWRfdjEpOwotfQotCi0KIHN0YXRpYyBpbnQgaXdsX212bV90aW1lX2V2ZW50X3NlbmRfYWRkKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICAgIHN0cnVjdCBpd2xfbXZtX3RpbWVfZXZlbnRfZGF0YSAqdGVfZGF0YSwKLQkJCQkgICAgICAgc3RydWN0IGl3bF90aW1lX2V2ZW50X2NtZF92MiAqdGVfY21kKQorCQkJCSAgICAgICBzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kICp0ZV9jbWQpCiB7CiAJc3RhdGljIGNvbnN0IHU4IHRpbWVfZXZlbnRfcmVzcG9uc2VbXSA9IHsgVElNRV9FVkVOVF9DTUQgfTsKIAlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IHdhaXRfdGltZV9ldmVudDsKQEAgLTM2OSw3ICszMTIsOCBAQAogCQkJCSAgIEFSUkFZX1NJWkUodGltZV9ldmVudF9yZXNwb25zZSksCiAJCQkJICAgaXdsX212bV90aW1lX2V2ZW50X3Jlc3BvbnNlLCB0ZV9kYXRhKTsKIAotCXJldCA9IGl3bF9tdm1fc2VuZF90aW1lX2V2ZW50X2NtZChtdm0sIHRlX2NtZCk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBUSU1FX0VWRU5UX0NNRCwgMCwKKwkJCQkJICAgIHNpemVvZigqdGVfY21kKSwgdGVfY21kKTsKIAlpZiAocmV0KSB7CiAJCUlXTF9FUlIobXZtLCAiQ291bGRuJ3Qgc2VuZCBUSU1FX0VWRU5UX0NNRDogJWRcbiIsIHJldCk7CiAJCWl3bF9yZW1vdmVfbm90aWZpY2F0aW9uKCZtdm0tPm5vdGlmX3dhaXQsICZ3YWl0X3RpbWVfZXZlbnQpOwpAQCAtMzk3LDcgKzM0MSw3IEBACiB7CiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAJc3RydWN0IGl3bF9tdm1fdGltZV9ldmVudF9kYXRhICp0ZV9kYXRhID0gJm12bXZpZi0+dGltZV9ldmVudF9kYXRhOwotCXN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfdjIgdGltZV9jbWQgPSB7fTsKKwlzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kIHRpbWVfY21kID0ge307CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIApAQCAtNDUzLDcgKzM5Nyw3IEBACiAJCQkgICAgICAgc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYsCiAJCQkgICAgICAgc3RydWN0IGl3bF9tdm1fdGltZV9ldmVudF9kYXRhICp0ZV9kYXRhKQogewotCXN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfdjIgdGltZV9jbWQgPSB7fTsKKwlzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kIHRpbWVfY21kID0ge307CiAJdTMyIGlkLCB1aWQ7CiAJaW50IHJldDsKIApAQCAtNDkwLDcgKzQzNCw4IEBACiAJCWNwdV90b19sZTMyKEZXX0NNRF9JRF9BTkRfQ09MT1IobXZtdmlmLT5pZCwgbXZtdmlmLT5jb2xvcikpOwogCiAJSVdMX0RFQlVHX1RFKG12bSwgIlJlbW92aW5nIFRFIDB4JXhcbiIsIGxlMzJfdG9fY3B1KHRpbWVfY21kLmlkKSk7Ci0JcmV0ID0gaXdsX212bV9zZW5kX3RpbWVfZXZlbnRfY21kKG12bSwgJnRpbWVfY21kKTsKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRJTUVfRVZFTlRfQ01ELCAwLAorCQkJCSAgIHNpemVvZih0aW1lX2NtZCksICZ0aW1lX2NtZCk7CiAJaWYgKFdBUk5fT04ocmV0KSkKIAkJcmV0dXJuOwogfQpAQCAtNTEwLDcgKzQ1NSw3IEBACiB7CiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAJc3RydWN0IGl3bF9tdm1fdGltZV9ldmVudF9kYXRhICp0ZV9kYXRhID0gJm12bXZpZi0+dGltZV9ldmVudF9kYXRhOwotCXN0cnVjdCBpd2xfdGltZV9ldmVudF9jbWRfdjIgdGltZV9jbWQgPSB7fTsKKwlzdHJ1Y3QgaXdsX3RpbWVfZXZlbnRfY21kIHRpbWVfY21kID0ge307CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIAlpZiAodGVfZGF0YS0+cnVubmluZykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3R0LmMKaW5kZXggN2E5OWZhMy4uODY4NTYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90dC5jCkBAIC00MDksNyArNDA5LDYgQEAKIAkJLmlkID0gUkVQTFlfVEhFUk1BTF9NTkdfQkFDS09GRiwKIAkJLmxlbiA9IHsgc2l6ZW9mKHUzMiksIH0sCiAJCS5kYXRhID0geyAmYmFja29mZiwgfSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCiAJfTsKIAogCWJhY2tvZmYgPSBtYXgoYmFja29mZiwgbXZtLT50aGVybWFsX3Rocm90dGxlLm1pbl9iYWNrb2ZmKTsKQEAgLTQ2OCwxMyArNDY3LDE0IEBACiAJfQogCiAJaWYgKHBhcmFtcy0+c3VwcG9ydF90eF9iYWNrb2ZmKSB7Ci0JCXR4X2JhY2tvZmYgPSAwOworCQl0eF9iYWNrb2ZmID0gdHQtPm1pbl9iYWNrb2ZmOwogCQlmb3IgKGkgPSAwOyBpIDwgVFRfVFhfQkFDS09GRl9TSVpFOyBpKyspIHsKIAkJCWlmICh0ZW1wZXJhdHVyZSA8IHBhcmFtcy0+dHhfYmFja29mZltpXS50ZW1wZXJhdHVyZSkKIAkJCQlicmVhazsKLQkJCXR4X2JhY2tvZmYgPSBwYXJhbXMtPnR4X2JhY2tvZmZbaV0uYmFja29mZjsKKwkJCXR4X2JhY2tvZmYgPSBtYXgodHQtPm1pbl9iYWNrb2ZmLAorCQkJCQkgcGFyYW1zLT50eF9iYWNrb2ZmW2ldLmJhY2tvZmYpOwogCQl9Ci0JCWlmICh0eF9iYWNrb2ZmICE9IDApCisJCWlmICh0eF9iYWNrb2ZmICE9IHR0LT5taW5fYmFja29mZikKIAkJCXRocm90dGxlX2VuYWJsZSA9IHRydWU7CiAJCWlmICh0dC0+dHhfYmFja29mZiAhPSB0eF9iYWNrb2ZmKQogCQkJaXdsX212bV90dF90eF9iYWNrb2ZmKG12bSwgdHhfYmFja29mZik7CkBAIC00ODQsNyArNDg0LDggQEAKIAkJSVdMX1dBUk4obXZtLAogCQkJICJEdWUgdG8gaGlnaCB0ZW1wZXJhdHVyZSB0aGVybWFsIHRocm90dGxpbmcgaW5pdGlhdGVkXG4iKTsKIAkJdHQtPnRocm90dGxlID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKHR0LT50aHJvdHRsZSAmJiAhdHQtPmR5bmFtaWNfc21wcyAmJiB0dC0+dHhfYmFja29mZiA9PSAwICYmCisJfSBlbHNlIGlmICh0dC0+dGhyb3R0bGUgJiYgIXR0LT5keW5hbWljX3NtcHMgJiYKKwkJICAgdHQtPnR4X2JhY2tvZmYgPT0gdHQtPm1pbl9iYWNrb2ZmICYmCiAJCSAgIHRlbXBlcmF0dXJlIDw9IHBhcmFtcy0+dHhfcHJvdGVjdGlvbl9leGl0KSB7CiAJCUlXTF9XQVJOKG12bSwKIAkJCSAiVGVtcGVyYXR1cmUgaXMgYmFjayB0byBub3JtYWwgdGhlcm1hbCB0aHJvdHRsaW5nIHN0b3BwZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3R4LmMKaW5kZXggODc5YWVhYy4uMzg0NmE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90eC5jCkBAIC02MzYsNyArNjM2LDExIEBACiAJCQlzZXFfY3RsID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCk7CiAJCX0KIAotCQlpZWVlODAyMTFfdHhfc3RhdHVzX25pKG12bS0+aHcsIHNrYik7CisJCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGEpIDwgMSk7CisJCWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMF0gPQorCQkJCSh2b2lkICopKHVpbnRwdHJfdCl0eF9yZXNwLT5yZWR1Y2VkX3RwYzsKKworCQlpZWVlODAyMTFfdHhfc3RhdHVzKG12bS0+aHcsIHNrYik7CiAJfQogCiAJaWYgKHR4cV9pZCA+PSBtdm0tPmZpcnN0X2FnZ19xdWV1ZSkgewpAQCAtODE1LDYgKzgxOSw3IEBACiAJCXN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOwogCQltdm1zdGEtPnRpZF9kYXRhW3RpZF0ucmF0ZV9uX2ZsYWdzID0KIAkJCWxlMzJfdG9fY3B1KHR4X3Jlc3AtPmluaXRpYWxfcmF0ZSk7CisJCW12bXN0YS0+dGlkX2RhdGFbdGlkXS5yZWR1Y2VkX3RwYyA9IHR4X3Jlc3AtPnJlZHVjZWRfdHBjOwogCX0KIAogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtOTI4LDYgKzkzMyw4IEBACiAJCQlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gYmFfbm90aWYtPnR4ZWQ7CiAJCQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXModGlkX2RhdGEtPnJhdGVfbl9mbGFncywKIAkJCQkJCSAgICBpbmZvKTsKKwkJCWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMF0gPQorCQkJCSh2b2lkICopKHVpbnRwdHJfdCl0aWRfZGF0YS0+cmVkdWNlZF90cGM7CiAJCX0KIAl9CiAKQEAgLTkzNyw3ICs5NDQsNyBAQAogCiAJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnJlY2xhaW1lZF9za2JzKSkgewogCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZyZWNsYWltZWRfc2ticyk7Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfbmkobXZtLT5odywgc2tiKTsKKwkJaWVlZTgwMjExX3R4X3N0YXR1cyhtdm0tPmh3LCBza2IpOwogCX0KIAogCXJldHVybiAwOwpAQCAtOTUxLDcgKzk1OCw3IEBACiAJCS5mbHVzaF9jdGwgPSBjcHVfdG9fbGUxNihEVU1QX1RYX0ZJRk9fRkxVU0gpLAogCX07CiAKLQl1MzIgZmxhZ3MgPSBzeW5jID8gQ01EX1NZTkMgOiBDTURfQVNZTkM7CisJdTMyIGZsYWdzID0gc3luYyA/IDAgOiBDTURfQVNZTkM7CiAKIAlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFRYUEFUSF9GTFVTSCwgZmxhZ3MsCiAJCQkJICAgc2l6ZW9mKGZsdXNoX2NtZCksICZmbHVzaF9jbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3V0aWxzLmMKaW5kZXggMjE4MDkwMi4uYWE5ZmM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS91dGlscy5jCkBAIC02NCw2ICs2NCw3IEBACiAKICNpbmNsdWRlICJpd2wtZGVidWcuaCIKICNpbmNsdWRlICJpd2wtaW8uaCIKKyNpbmNsdWRlICJpd2wtcHJwaC5oIgogCiAjaW5jbHVkZSAibXZtLmgiCiAjaW5jbHVkZSAiZnctYXBpLXJzLmgiCkBAIC0xNDMsNyArMTQ0LDcgQEAKIAkJICAgICAgImNtZCBmbGFncyAleCIsIGNtZC0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNtZC0+ZmxhZ3MgfD0gQ01EX1NZTkMgfCBDTURfV0FOVF9TS0I7CisJY21kLT5mbGFncyB8PSBDTURfV0FOVF9TS0I7CiAKIAlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWQobXZtLT50cmFucywgY21kKTsKIAlpZiAocmV0ID09IC1FUkZLSUxMKSB7CkBAIC00NjksNiArNDcwLDggQEAKIAkJCW12bS0+c3RhdHVzLCB0YWJsZS52YWxpZCk7CiAJfQogCisJLyogRG8gbm90IGNoYW5nZSB0aGlzIG91dHB1dCAtIHNjcmlwdHMgcmVseSBvbiBpdCAqLworCiAJSVdMX0VSUihtdm0sICJMb2FkZWQgZmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIG12bS0+ZnctPmZ3X3ZlcnNpb24pOwogCiAJdHJhY2VfaXdsd2lmaV9kZXZfdWNvZGVfZXJyb3IodHJhbnMtPmRldiwgdGFibGUuZXJyb3JfaWQsIHRhYmxlLnRzZl9sb3csCkBAIC01MTYsMTMgKzUxOSwxNCBAQAogCQlpd2xfbXZtX2R1bXBfdW1hY19lcnJvcl9sb2cobXZtKTsKIH0KIAorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIHZvaWQgaXdsX212bV9md19lcnJvcl9zcmFtX2R1bXAoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAljb25zdCBzdHJ1Y3QgZndfaW1nICppbWc7CiAJdTMyIG9mcywgc3JhbV9sZW47CiAJdm9pZCAqc3JhbTsKIAotCWlmICghbXZtLT51Y29kZV9sb2FkZWQgfHwgbXZtLT5md19lcnJvcl9zcmFtKQorCWlmICghbXZtLT51Y29kZV9sb2FkZWQgfHwgbXZtLT5md19lcnJvcl9zcmFtIHx8IG12bS0+ZndfZXJyb3JfZHVtcCkKIAkJcmV0dXJuOwogCiAJaW1nID0gJm12bS0+ZnctPmltZ1ttdm0tPmN1cl91Y29kZV07CkBAIC01MzgsNiArNTQyLDQ4IEBACiAJbXZtLT5md19lcnJvcl9zcmFtX2xlbiA9IHNyYW1fbGVuOwogfQogCit2b2lkIGl3bF9tdm1fZndfZXJyb3JfcnhmX2R1bXAoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwlpbnQgaSwgcmVnX3ZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtdm0tPnVjb2RlX2xvYWRlZCB8fCBtdm0tPmZ3X2Vycm9yX3J4ZiB8fCBtdm0tPmZ3X2Vycm9yX2R1bXApCisJCXJldHVybjsKKworCS8qIHJlYWRpbmcgYnVmZmVyIHNpemUgKi8KKwlyZWdfdmFsID0gaXdsX3RyYW5zX3JlYWRfcHJwaChtdm0tPnRyYW5zLCBSWEZfU0laRV9BRERSKTsKKwltdm0tPmZ3X2Vycm9yX3J4Zl9sZW4gPQorCQkocmVnX3ZhbCAmIFJYRl9TSVpFX0JZVEVfQ05UX01TSykgPj4gUlhGX1NJWkVfQllURV9DTkRfUE9TOworCisJLyogdGhlIHJlZ2lzdGVyIGhvbGRzIHRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEyOCAqLworCW12bS0+ZndfZXJyb3JfcnhmX2xlbiA9IG12bS0+ZndfZXJyb3JfcnhmX2xlbiA8PCA3OworCisJaWYgKCFtdm0tPmZ3X2Vycm9yX3J4Zl9sZW4pCisJCXJldHVybjsKKworCW12bS0+ZndfZXJyb3JfcnhmID0gIGt6YWxsb2MobXZtLT5md19lcnJvcl9yeGZfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW12bS0+ZndfZXJyb3JfcnhmKSB7CisJCW12bS0+ZndfZXJyb3JfcnhmX2xlbiA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWl3bF90cmFuc19ncmFiX25pY19hY2Nlc3MobXZtLT50cmFucywgZmFsc2UsICZmbGFncykpIHsKKwkJa2ZyZWUobXZtLT5md19lcnJvcl9yeGYpOworCQltdm0tPmZ3X2Vycm9yX3J4ZiA9IE5VTEw7CisJCW12bS0+ZndfZXJyb3JfcnhmX2xlbiA9IDA7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgKG12bS0+ZndfZXJyb3JfcnhmX2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKSB7CisJCWl3bF90cmFuc193cml0ZV9wcnBoKG12bS0+dHJhbnMsIFJYRl9MRF9GRU5DRV9PRkZTRVRfQUREUiwKKwkJCQkgICAgIGkgKiBzaXplb2YodTMyKSk7CisJCW12bS0+ZndfZXJyb3JfcnhmW2ldID0KKwkJCWl3bF90cmFuc19yZWFkX3BycGgobXZtLT50cmFucywgUlhGX0ZJRk9fUkRfRkVOQ0VfQUREUik7CisJfQorCWl3bF90cmFuc19yZWxlYXNlX25pY19hY2Nlc3MobXZtLT50cmFucywgJmZsYWdzKTsKK30KKyNlbmRpZgorCiAvKioKICAqIGl3bF9tdm1fc2VuZF9scV9jbWQoKSAtIFNlbmQgbGluayBxdWFsaXR5IGNvbW1hbmQKICAqIEBpbml0OiBUaGlzIGNvbW1hbmQgaXMgc2VudCBhcyBwYXJ0IG9mIHN0YXRpb24gaW5pdGlhbGl6YXRpb24gcmlnaHQKQEAgLTU1Myw3ICs1OTksNyBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBMUV9DTUQsCiAJCS5sZW4gPSB7IHNpemVvZihzdHJ1Y3QgaXdsX2xxX2NtZCksIH0sCi0JCS5mbGFncyA9IGluaXQgPyBDTURfU1lOQyA6IENNRF9BU1lOQywKKwkJLmZsYWdzID0gaW5pdCA/IDAgOiBDTURfQVNZTkMsCiAJCS5kYXRhID0geyBscSwgfSwKIAl9OwogCkBAIC02MDQsNiArNjUwLDM5IEBACiAJaWVlZTgwMjExX3JlcXVlc3Rfc21wcyh2aWYsIHNtcHNfbW9kZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9tdm1fZGl2ZXJzaXR5X2l0ZXIodm9pZCAqX2RhdGEsIHU4ICptYWMsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKKwlib29sICpyZXN1bHQgPSBfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fSVdMX01WTV9TTVBTX1JFUTsgaSsrKSB7CisJCWlmIChtdm12aWYtPnNtcHNfcmVxdWVzdHNbaV0gPT0gSUVFRTgwMjExX1NNUFNfU1RBVElDIHx8CisJCSAgICBtdm12aWYtPnNtcHNfcmVxdWVzdHNbaV0gPT0gSUVFRTgwMjExX1NNUFNfRFlOQU1JQykKKwkJCSpyZXN1bHQgPSBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgaXdsX212bV9yeF9kaXZlcnNpdHlfYWxsb3dlZChzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOworCisJaWYgKG51bV9vZl9hbnQobXZtLT5mdy0+dmFsaWRfcnhfYW50KSA9PSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIW12bS0+Y2ZnLT5yeF93aXRoX3Npc29fZGl2ZXJzaXR5KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMoCisJCQltdm0tPmh3LCBJRUVFODAyMTFfSUZBQ0VfSVRFUl9OT1JNQUwsCisJCQlpd2xfbXZtX2RpdmVyc2l0eV9pdGVyLCAmcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKIGludCBpd2xfbXZtX3VwZGF0ZV9sb3dfbGF0ZW5jeShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICAgIGJvb2wgdmFsdWUpCiB7CkBAIC02MjMsNyArNzAyLDcgQEAKIAogCWl3bF9tdm1fYnRfY29leF92aWZfY2hhbmdlKG12bSk7CiAKLQlyZXR1cm4gaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSwgdmlmKTsKKwlyZXR1cm4gaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSk7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9tdm1fbGxfaXRlcih2b2lkICpfZGF0YSwgdTggKm1hYywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9kcnYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9kcnYuYwppbmRleCAzZDFkNTdmLi43MDkxYTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL2Rydi5jCkBAIC00MTcsNyArNDE3LDcgQEAKIAkgICAgc3BseC0+cGFja2FnZS5jb3VudCAhPSAyIHx8CiAJICAgIHNwbHgtPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUiB8fAogCSAgICBzcGx4LT5wYWNrYWdlLmVsZW1lbnRzWzBdLmludGVnZXIudmFsdWUgIT0gMCkgewotCQlJV0xfRVJSKHRyYW5zLCAiVW5zdXBwb3J0ZWQgc3BseCBzdHJ1Y3R1cmUiKTsKKwkJSVdMX0VSUih0cmFucywgIlVuc3VwcG9ydGVkIHNwbHggc3RydWN0dXJlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00MjYsMTQgKzQyNiwxNCBAQAogCSAgICBsaW1pdHMtPnBhY2thZ2UuY291bnQgPCAyIHx8CiAJICAgIGxpbWl0cy0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8CiAJICAgIGxpbWl0cy0+cGFja2FnZS5lbGVtZW50c1sxXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCUlXTF9FUlIodHJhbnMsICJJbnZhbGlkIGxpbWl0cyBlbGVtZW50Iik7CisJCUlXTF9FUlIodHJhbnMsICJJbnZhbGlkIGxpbWl0cyBlbGVtZW50XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZG9tYWluX3R5cGUgPSAmbGltaXRzLT5wYWNrYWdlLmVsZW1lbnRzWzBdOwogCXBvd2VyX2xpbWl0ID0gJmxpbWl0cy0+cGFja2FnZS5lbGVtZW50c1sxXTsKIAlpZiAoIShkb21haW5fdHlwZS0+aW50ZWdlci52YWx1ZSAmIFNQTF9ET01BSU5UWVBFX1dJRkkpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiV2lGaSBwb3dlciBpcyBub3QgbGltaXRlZCIpOworCQlJV0xfREVCVUdfSU5GTyh0cmFucywgIldpRmkgcG93ZXIgaXMgbm90IGxpbWl0ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ1MCwyNiArNDUwLDI2IEBACiAJcHhzeF9oYW5kbGUgPSBBQ1BJX0hBTkRMRSgmcGRldi0+ZGV2KTsKIAlpZiAoIXB4c3hfaGFuZGxlKSB7CiAJCUlXTF9ERUJVR19JTkZPKHRyYW5zLAotCQkJICAgICAgICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlIik7CisJCQkgICAgICAgIkNvdWxkIG5vdCByZXRyaWV2ZSByb290IHBvcnQgQUNQSSBoYW5kbGVcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocHhzeF9oYW5kbGUsIChhY3BpX3N0cmluZylTUExfTUVUSE9ELCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX0lORk8odHJhbnMsICJTUEwgbWV0aG9kIG5vdCBmb3VuZCIpOworCQlJV0xfREVCVUdfSU5GTyh0cmFucywgIlNQTCBtZXRob2Qgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIENhbGwgU1BMQyB3aXRoIG5vIGFyZ3VtZW50cyAqLwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJnNwbHgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlJV0xfRVJSKHRyYW5zLCAiU1BMQyBpbnZvY2F0aW9uIGZhaWxlZCAoMHgleCkiLCBzdGF0dXMpOworCQlJV0xfRVJSKHRyYW5zLCAiU1BMQyBpbnZvY2F0aW9uIGZhaWxlZCAoMHgleClcbiIsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKIAl0cmFucy0+ZGZsdF9wd3JfbGltaXQgPSBzcGx4X2dldF9wd3JfbGltaXQodHJhbnMsIHNwbHgucG9pbnRlcik7Ci0JSVdMX0RFQlVHX0lORk8odHJhbnMsICJEZWZhdWx0IHBvd2VyIGxpbWl0IHNldCB0byAlbGxkIiwKKwlJV0xfREVCVUdfSU5GTyh0cmFucywgIkRlZmF1bHQgcG93ZXIgbGltaXQgc2V0IHRvICVsbGRcbiIsCiAJCSAgICAgICB0cmFucy0+ZGZsdF9wd3JfbGltaXQpOwogCWtmcmVlKHNwbHgucG9pbnRlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCmluZGV4IDkwOTE1MTMuLjZjMjJiMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl1MzIgd3JpdGVfYWN0dWFsOwogCXN0cnVjdCBsaXN0X2hlYWQgcnhfZnJlZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X3VzZWQ7Ci0JaW50IG5lZWRfdXBkYXRlOworCWJvb2wgbmVlZF91cGRhdGU7CiAJc3RydWN0IGl3bF9yYl9zdGF0dXMgKnJiX3N0dHM7CiAJZG1hX2FkZHJfdCByYl9zdHRzX2RtYTsKIAlzcGlubG9ja190IGxvY2s7CkBAIC0xMTcsMjEgKzExNywxOSBAQAogLyoqCiAgKiBpd2xfcXVldWVfaW5jX3dyYXAgLSBpbmNyZW1lbnQgcXVldWUgaW5kZXgsIHdyYXAgYmFjayB0byBiZWdpbm5pbmcKICAqIEBpbmRleCAtLSBjdXJyZW50IGluZGV4Ci0gKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQogICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfcXVldWVfaW5jX3dyYXAoaW50IGluZGV4LCBpbnQgbl9iZCkKK3N0YXRpYyBpbmxpbmUgaW50IGl3bF9xdWV1ZV9pbmNfd3JhcChpbnQgaW5kZXgpCiB7Ci0JcmV0dXJuICsraW5kZXggJiAobl9iZCAtIDEpOworCXJldHVybiArK2luZGV4ICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpOwogfQogCiAvKioKICAqIGl3bF9xdWV1ZV9kZWNfd3JhcCAtIGRlY3JlbWVudCBxdWV1ZSBpbmRleCwgd3JhcCBiYWNrIHRvIGVuZAogICogQGluZGV4IC0tIGN1cnJlbnQgaW5kZXgKLSAqIEBuX2JkIC0tIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlIChtdXN0IGJlIHBvd2VyIG9mIDIpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9xdWV1ZV9kZWNfd3JhcChpbnQgaW5kZXgsIGludCBuX2JkKQorc3RhdGljIGlubGluZSBpbnQgaXdsX3F1ZXVlX2RlY193cmFwKGludCBpbmRleCkKIHsKLQlyZXR1cm4gLS1pbmRleCAmIChuX2JkIC0gMSk7CisJcmV0dXJuIC0taW5kZXggJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSk7CiB9CiAKIHN0cnVjdCBpd2xfY21kX21ldGEgewpAQCAtMTQ1LDEzICsxNDMsMTMgQEAKICAqCiAgKiBDb250YWlucyBjb21tb24gZGF0YSBmb3IgUnggYW5kIFR4IHF1ZXVlcy4KICAqCi0gKiBOb3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbl9iZCBhbmQgbl93aW5kb3c6IHRoZSBoYXJkd2FyZQotICogYWx3YXlzIGFzc3VtZXMgMjU2IGRlc2NyaXB0b3JzLCBzbyBuX2JkIGlzIGFsd2F5cyAyNTYgKHVubGVzcworICogTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRGRF9RVUVVRV9TSVpFX01BWCBhbmQgbl93aW5kb3c6IHRoZSBoYXJkd2FyZQorICogYWx3YXlzIGFzc3VtZXMgMjU2IGRlc2NyaXB0b3JzLCBzbyBURkRfUVVFVUVfU0laRV9NQVggaXMgYWx3YXlzIDI1NiAodW5sZXNzCiAgKiB0aGVyZSBtaWdodCBiZSBIVyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUpLiBGb3IgdGhlIG5vcm1hbCBUWAogICogcXVldWVzLCBuX3dpbmRvdywgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIHNvZnR3YXJlIHF1ZXVlIGRhdGEKICAqIGlzIGFsc28gMjU2OyBob3dldmVyLCBmb3IgdGhlIGNvbW1hbmQgcXVldWUsIG5fd2luZG93IGlzIG9ubHkKICAqIDMyIHNpbmNlIHdlIGRvbid0IG5lZWQgc28gbWFueSBjb21tYW5kcyBwZW5kaW5nLiBTaW5jZSB0aGUgSFcKLSAqIHN0aWxsIHVzZXMgMjU2IEJEcyBmb3IgRE1BIHRob3VnaCwgbl9iZCBzdGF5cyAyNTYuIEFzIGEgcmVzdWx0LAorICogc3RpbGwgdXNlcyAyNTYgQkRzIGZvciBETUEgdGhvdWdoLCBURkRfUVVFVUVfU0laRV9NQVggc3RheXMgMjU2LiBBcyBhIHJlc3VsdCwKICAqIHRoZSBzb2Z0d2FyZSBidWZmZXJzIChpbiB0aGUgdmFyaWFibGVzIEBtZXRhLCBAdHhiIGluIHN0cnVjdAogICogaXdsX3R4cSkgb25seSBoYXZlIDMyIGVudHJpZXMsIHdoaWxlIHRoZSBIVyBidWZmZXJzIChAdGZkcyBpbgogICogdGhlIHNhbWUgc3RydWN0KSBoYXZlIDI1Ni4KQEAgLTE2Miw3ICsxNjAsNiBAQAogICogZGF0YSBpcyBhIHdpbmRvdyBvdmVybGF5ZWQgb3ZlciB0aGUgSFcgcXVldWUuCiAgKi8KIHN0cnVjdCBpd2xfcXVldWUgewotCWludCBuX2JkOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIEJEcyBpbiB0aGlzIHF1ZXVlICovCiAJaW50IHdyaXRlX3B0cjsgICAgICAgLyogMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpIGhvc3RfdyovCiAJaW50IHJlYWRfcHRyOyAgICAgICAgIC8qIGxhc3QgdXNlZCBlbnRyeSAoaW5kZXgpIGhvc3RfciovCiAJLyogdXNlIGZvciBtb25pdG9yaW5nIGFuZCByZWNvdmVyaW5nIHRoZSBzdHVjayBxdWV1ZSAqLwpAQCAtMjMxLDcgKzIyOCw3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0dWNrX3RpbWVyOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZTsKLQl1OCBuZWVkX3VwZGF0ZTsKKwlib29sIG5lZWRfdXBkYXRlOwogCXU4IGFjdGl2ZTsKIAlib29sIGFtcGR1OwogfTsKQEAgLTI3MCw2ICsyNjcsOSBAQAogCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zOwogCXN0cnVjdCBpd2xfZHJ2ICpkcnY7CiAKKwlzdHJ1Y3QgbmV0X2RldmljZSBuYXBpX2RldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwogCS8qIElOVCBJQ1QgVGFibGUgKi8KIAlfX2xlMzIgKmljdF90Ymw7CiAJZG1hX2FkZHJfdCBpY3RfdGJsX2RtYTsKQEAgLTM2Miw3ICszNjIsNyBAQAogdm9pZCBpd2xfdHJhbnNfcGNpZV90eHFfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHF1ZXVlKTsKIGludCBpd2xfdHJhbnNfcGNpZV90eChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpkZXZfY21kLCBpbnQgdHhxX2lkKTsKLXZvaWQgaXdsX3BjaWVfdHhxX2luY193cl9wdHIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfdHhxICp0eHEpOwordm9pZCBpd2xfcGNpZV90eHFfY2hlY2tfd3JwdHJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIGludCBpd2xfdHJhbnNfcGNpZV9zZW5kX2hjbWQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7CiB2b2lkIGl3bF9wY2llX2hjbWRfY29tcGxldGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkgICAgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsIGludCBoYW5kbGVyX3N0YXR1cyk7CkBAIC0zNzAsNiArMzcwLDEzIEBACiAJCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticyk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4X3Jlc2V0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAorc3RhdGljIGlubGluZSB1MTYgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQoreworCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgPj4gNDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEVycm9yIGhhbmRsaW5nCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9yeC5jCmluZGV4IGZkZmEzOTYuLmEyNjk4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9yeC5jCkBAIC0xNDUsMTUgKzE0NSwxMyBAQAogLyoKICAqIGl3bF9wY2llX3J4cV9pbmNfd3JfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKICAqLwotc3RhdGljIHZvaWQgaXdsX3BjaWVfcnhxX2luY193cl9wdHIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhxICpyeHEpCitzdGF0aWMgdm9pZCBpd2xfcGNpZV9yeHFfaW5jX3dyX3B0cihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCXN0cnVjdCBpd2xfcnhxICpyeHEgPSAmdHJhbnNfcGNpZS0+cnhxOwogCXUzMiByZWc7CiAKLQlzcGluX2xvY2soJnJ4cS0+bG9jayk7Ci0KLQlpZiAocnhxLT5uZWVkX3VwZGF0ZSA9PSAwKQotCQlnb3RvIGV4aXRfdW5sb2NrOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJ4cS0+bG9jayk7CiAKIAkvKgogCSAqIGV4cGxpY2l0bHkgd2FrZSB1cCB0aGUgTklDIGlmOgpAQCAtMTY5LDEzICsxNjcsMjcgQEAKIAkJCQkgICAgICAgcmVnKTsKIAkJCWl3bF9zZXRfYml0KHRyYW5zLCBDU1JfR1BfQ05UUkwsCiAJCQkJICAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7Ci0JCQlnb3RvIGV4aXRfdW5sb2NrOworCQkJcnhxLT5uZWVkX3VwZGF0ZSA9IHRydWU7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAlyeHEtPndyaXRlX2FjdHVhbCA9IHJvdW5kX2Rvd24ocnhxLT53cml0ZSwgOCk7CiAJaXdsX3dyaXRlMzIodHJhbnMsIEZIX1JTQ1NSX0NITkwwX1dQVFIsIHJ4cS0+d3JpdGVfYWN0dWFsKTsKLQlyeHEtPm5lZWRfdXBkYXRlID0gMDsKK30KKworc3RhdGljIHZvaWQgaXdsX3BjaWVfcnhxX2NoZWNrX3dycHRyKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJc3RydWN0IGl3bF9yeHEgKnJ4cSA9ICZ0cmFuc19wY2llLT5yeHE7CisKKwlzcGluX2xvY2soJnJ4cS0+bG9jayk7CisKKwlpZiAoIXJ4cS0+bmVlZF91cGRhdGUpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlpd2xfcGNpZV9yeHFfaW5jX3dyX3B0cih0cmFucyk7CisJcnhxLT5uZWVkX3VwZGF0ZSA9IGZhbHNlOwogCiAgZXhpdF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJnJ4cS0+bG9jayk7CkBAIC0yMzYsOSArMjQ4LDggQEAKIAkgKiBJbmNyZW1lbnQgZGV2aWNlJ3Mgd3JpdGUgcG9pbnRlciBpbiBtdWx0aXBsZXMgb2YgOC4gKi8KIAlpZiAocnhxLT53cml0ZV9hY3R1YWwgIT0gKHJ4cS0+d3JpdGUgJiB+MHg3KSkgewogCQlzcGluX2xvY2soJnJ4cS0+bG9jayk7Ci0JCXJ4cS0+bmVlZF91cGRhdGUgPSAxOworCQlpd2xfcGNpZV9yeHFfaW5jX3dyX3B0cih0cmFucyk7CiAJCXNwaW5fdW5sb2NrKCZyeHEtPmxvY2spOwotCQlpd2xfcGNpZV9yeHFfaW5jX3dyX3B0cih0cmFucywgcnhxKTsKIAl9CiB9CiAKQEAgLTM2MiwyMCArMzczLDkgQEAKICAqIEFsc28gcmVzdG9jayB0aGUgUnggcXVldWUgdmlhIGl3bF9wY2llX3J4cV9yZXN0b2NrLgogICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbml0aWFsaXphdGlvbikKICAqLwotc3RhdGljIHZvaWQgaXdsX3BjaWVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQorc3RhdGljIHZvaWQgaXdsX3BjaWVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBnZnBfdCBnZnApCiB7Ci0Jc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKLQotCWl3bF9wY2llX3J4cV9hbGxvY19yYnModHJhbnMsIEdGUF9LRVJORUwpOwotCi0Jc3Bpbl9sb2NrKCZ0cmFuc19wY2llLT5pcnFfbG9jayk7Ci0JaXdsX3BjaWVfcnhxX3Jlc3RvY2sodHJhbnMpOwotCXNwaW5fdW5sb2NrKCZ0cmFuc19wY2llLT5pcnFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9wY2llX3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCi17Ci0JaXdsX3BjaWVfcnhxX2FsbG9jX3Jicyh0cmFucywgR0ZQX0FUT01JQyk7CisJaXdsX3BjaWVfcnhxX2FsbG9jX3Jicyh0cmFucywgZ2ZwKTsKIAogCWl3bF9wY2llX3J4cV9yZXN0b2NrKHRyYW5zKTsKIH0KQEAgLTM4NSw3ICszODUsNyBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUsIHJ4X3JlcGxlbmlzaCk7CiAKLQlpd2xfcGNpZV9yeF9yZXBsZW5pc2godHJhbnNfcGNpZS0+dHJhbnMpOworCWl3bF9wY2llX3J4X3JlcGxlbmlzaCh0cmFuc19wY2llLT50cmFucywgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyBpbnQgaXdsX3BjaWVfcnhfYWxsb2Moc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCkBAIC01MjEsMTQgKzUyMSwxMyBAQAogCW1lbXNldChyeHEtPnJiX3N0dHMsIDAsIHNpemVvZigqcnhxLT5yYl9zdHRzKSk7CiAJc3Bpbl91bmxvY2soJnJ4cS0+bG9jayk7CiAKLQlpd2xfcGNpZV9yeF9yZXBsZW5pc2godHJhbnMpOworCWl3bF9wY2llX3J4X3JlcGxlbmlzaCh0cmFucywgR0ZQX0tFUk5FTCk7CiAKIAlpd2xfcGNpZV9yeF9od19pbml0KHRyYW5zLCByeHEpOwogCi0Jc3Bpbl9sb2NrKCZ0cmFuc19wY2llLT5pcnFfbG9jayk7Ci0JcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JaXdsX3BjaWVfcnhxX2luY193cl9wdHIodHJhbnMsIHJ4cSk7Ci0Jc3Bpbl91bmxvY2soJnRyYW5zX3BjaWUtPmlycV9sb2NrKTsKKwlzcGluX2xvY2soJnJ4cS0+bG9jayk7CisJaXdsX3BjaWVfcnhxX2luY193cl9wdHIodHJhbnMpOworCXNwaW5fdW5sb2NrKCZyeHEtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NzMsNyArNjcyLDYgQEAKIAkvKiBSZXVzZSB0aGUgcGFnZSBpZiBwb3NzaWJsZS4gRm9yIG5vdGlmaWNhdGlvbiBwYWNrZXRzIGFuZAogCSAqIFNLQnMgdGhhdCBmYWlsIHRvIFJ4IGNvcnJlY3RseSwgYWRkIHRoZW0gYmFjayBpbnRvIHRoZQogCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCi0Jc3Bpbl9sb2NrKCZyeHEtPmxvY2spOwogCWlmIChyeGItPnBhZ2UgIT0gTlVMTCkgewogCQlyeGItPnBhZ2VfZG1hID0KIAkJCWRtYV9tYXBfcGFnZSh0cmFucy0+ZGV2LCByeGItPnBhZ2UsIDAsCkBAIC02OTQsNyArNjkyLDYgQEAKIAkJfQogCX0gZWxzZQogCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCXNwaW5fdW5sb2NrKCZyeHEtPmxvY2spOwogfQogCiAvKgpAQCAtNzA5LDYgKzcwNiw4IEBACiAJdTMyIGNvdW50ID0gODsKIAlpbnQgdG90YWxfZW1wdHk7CiAKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZyeHEtPmxvY2spOwogCS8qIHVDb2RlJ3MgcmVhZCBpbmRleCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKIAkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLwogCXIgPSBsZTE2X3RvX2NwdShBQ0NFU1NfT05DRShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pKSAmIDB4MEZGRjsKQEAgLTc0MywxOCArNzQyLDI1IEBACiAJCQljb3VudCsrOwogCQkJaWYgKGNvdW50ID49IDgpIHsKIAkJCQlyeHEtPnJlYWQgPSBpOwotCQkJCWl3bF9wY2llX3J4X3JlcGxlbmlzaF9ub3codHJhbnMpOworCQkJCXNwaW5fdW5sb2NrKCZyeHEtPmxvY2spOworCQkJCWl3bF9wY2llX3J4X3JlcGxlbmlzaCh0cmFucywgR0ZQX0FUT01JQyk7CiAJCQkJY291bnQgPSAwOworCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KIAkJfQogCX0KIAogCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KIAlyeHEtPnJlYWQgPSBpOworCXNwaW5fdW5sb2NrKCZyeHEtPmxvY2spOworCiAJaWYgKGZpbGxfcngpCi0JCWl3bF9wY2llX3J4X3JlcGxlbmlzaF9ub3codHJhbnMpOworCQlpd2xfcGNpZV9yeF9yZXBsZW5pc2godHJhbnMsIEdGUF9BVE9NSUMpOwogCWVsc2UKIAkJaXdsX3BjaWVfcnhxX3Jlc3RvY2sodHJhbnMpOworCisJaWYgKHRyYW5zX3BjaWUtPm5hcGkucG9sbCkKKwkJbmFwaV9ncm9fZmx1c2goJnRyYW5zX3BjaWUtPm5hcGksIGZhbHNlKTsKIH0KIAogLyoKQEAgLTg0NCw3ICs4NTAsNyBAQAogCQkJCXRyYW5zX3BjaWUtPmljdF9pbmRleCwgcmVhZCk7CiAJCXRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSA9IDA7CiAJCXRyYW5zX3BjaWUtPmljdF9pbmRleCA9Ci0JCQlpd2xfcXVldWVfaW5jX3dyYXAodHJhbnNfcGNpZS0+aWN0X2luZGV4LCBJQ1RfQ09VTlQpOworCQkJKCh0cmFuc19wY2llLT5pY3RfaW5kZXggKyAxKSAmIChJQ1RfQ09VTlQgLSAxKSk7CiAKIAkJcmVhZCA9IGxlMzJfdG9fY3B1KHRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSk7CiAJCXRyYWNlX2l3bHdpZmlfZGV2X2ljdF9yZWFkKHRyYW5zLT5kZXYsIHRyYW5zX3BjaWUtPmljdF9pbmRleCwKQEAgLTg3Niw3ICs4ODIsNiBAQAogCXN0cnVjdCBpc3Jfc3RhdGlzdGljcyAqaXNyX3N0YXRzID0gJnRyYW5zX3BjaWUtPmlzcl9zdGF0czsKIAl1MzIgaW50YSA9IDA7CiAJdTMyIGhhbmRsZWQgPSAwOwotCXUzMiBpOwogCiAJbG9ja19tYXBfYWNxdWlyZSgmdHJhbnMtPnN5bmNfY21kX2xvY2tkZXBfbWFwKTsKIApAQCAtMTAyOCw5ICsxMDMzLDggQEAKIAkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCiAJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKIAkJSVdMX0RFQlVHX0lTUih0cmFucywgIldha2V1cCBpbnRlcnJ1cHRcbiIpOwotCQlpd2xfcGNpZV9yeHFfaW5jX3dyX3B0cih0cmFucywgJnRyYW5zX3BjaWUtPnJ4cSk7Ci0JCWZvciAoaSA9IDA7IGkgPCB0cmFucy0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsgaSsrKQotCQkJaXdsX3BjaWVfdHhxX2luY193cl9wdHIodHJhbnMsICZ0cmFuc19wY2llLT50eHFbaV0pOworCQlpd2xfcGNpZV9yeHFfY2hlY2tfd3JwdHIodHJhbnMpOworCQlpd2xfcGNpZV90eHFfY2hlY2tfd3JwdHJzKHRyYW5zKTsKIAogCQlpc3Jfc3RhdHMtPndha2V1cCsrOwogCkBAIC0xMDY4LDggKzEwNzIsNiBAQAogCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfSU5UX1BFUklPRElDX1JFRywKIAkJCSAgICBDU1JfSU5UX1BFUklPRElDX0RJUyk7CiAKLQkJaXdsX3BjaWVfcnhfaGFuZGxlKHRyYW5zKTsKLQogCQkvKgogCQkgKiBFbmFibGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIDggbXNlYyBvbmx5IGlmIHdlIHJlY2VpdmVkCiAJCSAqIHJlYWwgUlggaW50ZXJydXB0IChpbnN0ZWFkIG9mIGp1c3QgcGVyaW9kaWMgaW50KSwgdG8gY2F0Y2gKQEAgLTEwODIsNiArMTA4NCwxMCBAQAogCQkJCSAgIENTUl9JTlRfUEVSSU9ESUNfRU5BKTsKIAogCQlpc3Jfc3RhdHMtPnJ4Kys7CisKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlpd2xfcGNpZV9yeF9oYW5kbGUodHJhbnMpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKIAl9CiAKIAkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHJhbnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS90cmFucy5jCmluZGV4IDIzNjU1NTMuLjc4ODA4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS90cmFucy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS90cmFucy5jCkBAIC03Myw2ICs3Myw3IEBACiAjaW5jbHVkZSAiaXdsLWNzci5oIgogI2luY2x1ZGUgIml3bC1wcnBoLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgorI2luY2x1ZGUgIml3bC1mdy1lcnJvci1kdW1wLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogc3RhdGljIHUzMiBpd2xfdHJhbnNfcGNpZV9yZWFkX3NocihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHJlZykKQEAgLTEwMyw3ICsxMDQsNiBAQAogCiAvKiBQQ0kgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQotI2RlZmluZSBDUFUxX0NQVTJfU0VQQVJBVE9SX1NFQ1RJT04JMHhGRkZGQ0NDQwogCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV9hcG1fY29uZmlnKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewpAQCAtNDU0LDYgKzQ1NCw3IEBACiB7CiAJaW50IHJldDsKIAlpbnQgdCA9IDA7CisJaW50IGl0ZXI7CiAKIAlJV0xfREVCVUdfSU5GTyh0cmFucywgIml3bF90cmFuc19wcmVwYXJlX2NhcmRfaHcgZW50ZXJcbiIpOwogCkBAIC00NjIsMTggKzQ2MywyMyBAQAogCWlmIChyZXQgPj0gMCkKIAkJcmV0dXJuIDA7CiAKLQkvKiBJZiBIVyBpcyBub3QgcmVhZHksIHByZXBhcmUgdGhlIGNvbmRpdGlvbnMgdG8gY2hlY2sgYWdhaW4gKi8KLQlpd2xfc2V0X2JpdCh0cmFucywgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19QUkVQQVJFKTsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTA7IGl0ZXIrKykgeworCQkvKiBJZiBIVyBpcyBub3QgcmVhZHksIHByZXBhcmUgdGhlIGNvbmRpdGlvbnMgdG8gY2hlY2sgYWdhaW4gKi8KKwkJaXdsX3NldF9iaXQodHJhbnMsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUpOwogCi0JZG8gewotCQlyZXQgPSBpd2xfcGNpZV9zZXRfaHdfcmVhZHkodHJhbnMpOwotCQlpZiAocmV0ID49IDApCi0JCQlyZXR1cm4gMDsKKwkJZG8geworCQkJcmV0ID0gaXdsX3BjaWVfc2V0X2h3X3JlYWR5KHRyYW5zKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXR1cm4gMDsKIAotCQl1c2xlZXBfcmFuZ2UoMjAwLCAxMDAwKTsKLQkJdCArPSAyMDA7Ci0JfSB3aGlsZSAodCA8IDE1MDAwMCk7CisJCQl1c2xlZXBfcmFuZ2UoMjAwLCAxMDAwKTsKKwkJCXQgKz0gMjAwOworCQl9IHdoaWxlICh0IDwgMTUwMDAwKTsKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlJV0xfREVCVUdfSU5GTyh0cmFucywgImdvdCBOSUMgYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwgaXRlcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA1Myw2ICsxMDU5LDEyIEBACiAJaXdsX3RyYW5zX3BjaWVfd3JpdGUzMih0cmFucywgSEJVU19UQVJHX1BSUEhfV0RBVCwgdmFsKTsKIH0KIAorc3RhdGljIGludCBpd2xfcGNpZV9kdW1teV9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCVdBUk5fT04oMSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX2NvbmZpZ3VyZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBpd2xfdHJhbnNfY29uZmlnICp0cmFuc19jZmcpCiB7CkBAIC0xMDc5LDYgKzEwOTEsMTggQEAKIAogCXRyYW5zX3BjaWUtPmNvbW1hbmRfbmFtZXMgPSB0cmFuc19jZmctPmNvbW1hbmRfbmFtZXM7CiAJdHJhbnNfcGNpZS0+YmNfdGFibGVfZHdvcmQgPSB0cmFuc19jZmctPmJjX3RhYmxlX2R3b3JkOworCisJLyogSW5pdGlhbGl6ZSBOQVBJIGhlcmUgLSBpdCBzaG91bGQgYmUgYmVmb3JlIHJlZ2lzdGVyaW5nIHRvIG1hYzgwMjExCisJICogaW4gdGhlIG9wbW9kZSBidXQgYWZ0ZXIgdGhlIEhXIHN0cnVjdCBpcyBhbGxvY2F0ZWQuCisJICogQXMgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFnYWluIGluIHNvbWUgY29ybmVyIGNhc2VzIGRvbid0CisJICogZG8gYW55dGhpbmcgaWYgTkFQSSB3YXMgYWxyZWFkeSBpbml0aWFsaXplZC4KKwkgKi8KKwlpZiAoIXRyYW5zX3BjaWUtPm5hcGkucG9sbCAmJiB0cmFucy0+b3BfbW9kZS0+b3BzLT5uYXBpX2FkZCkgeworCQlpbml0X2R1bW15X25ldGRldigmdHJhbnNfcGNpZS0+bmFwaV9kZXYpOworCQlpd2xfb3BfbW9kZV9uYXBpX2FkZCh0cmFucy0+b3BfbW9kZSwgJnRyYW5zX3BjaWUtPm5hcGksCisJCQkJICAgICAmdHJhbnNfcGNpZS0+bmFwaV9kZXYsCisJCQkJICAgICBpd2xfcGNpZV9kdW1teV9uYXBpX3BvbGwsIDY0KTsKKwl9CiB9CiAKIHZvaWQgaXdsX3RyYW5zX3BjaWVfZnJlZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKQEAgLTEwOTksNiArMTEyMyw5IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKHRyYW5zX3BjaWUtPnBjaV9kZXYpOwogCWttZW1fY2FjaGVfZGVzdHJveSh0cmFucy0+ZGV2X2NtZF9wb29sKTsKIAorCWlmICh0cmFuc19wY2llLT5uYXBpLnBvbGwpCisJCW5ldGlmX25hcGlfZGVsKCZ0cmFuc19wY2llLT5uYXBpKTsKKwogCWtmcmVlKHRyYW5zKTsKIH0KIApAQCAtMTIzNyw3ICsxMjY0LDcgQEAKIAogI2RlZmluZSBJV0xfRkxVU0hfV0FJVF9NUwkyMDAwCiAKLXN0YXRpYyBpbnQgaXdsX3RyYW5zX3BjaWVfd2FpdF90eHFfZW1wdHkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCitzdGF0aWMgaW50IGl3bF90cmFuc19wY2llX3dhaXRfdHhxX2VtcHR5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgdHhxX2JtKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGl3bF90eHEgKnR4cTsKQEAgLTEyNTAsMTMgKzEyNzcsMzEgQEAKIAogCS8qIHdhaXRpbmcgZm9yIGFsbCB0aGUgdHggZnJhbWVzIGNvbXBsZXRlIG1pZ2h0IHRha2UgYSB3aGlsZSAqLwogCWZvciAoY250ID0gMDsgY250IDwgdHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7IGNudCsrKSB7CisJCXU4IHdyX3B0cjsKKwogCQlpZiAoY250ID09IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkKIAkJCWNvbnRpbnVlOworCQlpZiAoIXRlc3RfYml0KGNudCwgdHJhbnNfcGNpZS0+cXVldWVfdXNlZCkpCisJCQljb250aW51ZTsKKwkJaWYgKCEoQklUKGNudCkgJiB0eHFfYm0pKQorCQkJY29udGludWU7CisKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIkVtcHR5aW5nIHF1ZXVlICVkLi4uXG4iLCBjbnQpOwogCQl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW2NudF07CiAJCXEgPSAmdHhxLT5xOwotCQl3aGlsZSAocS0+cmVhZF9wdHIgIT0gcS0+d3JpdGVfcHRyICYmICF0aW1lX2FmdGVyKGppZmZpZXMsCi0JCSAgICAgICBub3cgKyBtc2Vjc190b19qaWZmaWVzKElXTF9GTFVTSF9XQUlUX01TKSkpCisJCXdyX3B0ciA9IEFDQ0VTU19PTkNFKHEtPndyaXRlX3B0cik7CisKKwkJd2hpbGUgKHEtPnJlYWRfcHRyICE9IEFDQ0VTU19PTkNFKHEtPndyaXRlX3B0cikgJiYKKwkJICAgICAgICF0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJICAgbm93ICsgbXNlY3NfdG9famlmZmllcyhJV0xfRkxVU0hfV0FJVF9NUykpKSB7CisJCQl1OCB3cml0ZV9wdHIgPSBBQ0NFU1NfT05DRShxLT53cml0ZV9wdHIpOworCisJCQlpZiAoV0FSTl9PTkNFKHdyX3B0ciAhPSB3cml0ZV9wdHIsCisJCQkJICAgICAgIldSIHBvaW50ZXIgbW92ZWQgd2hpbGUgZmx1c2hpbmcgJWQgLT4gJWRcbiIsCisJCQkJICAgICAgd3JfcHRyLCB3cml0ZV9wdHIpKQorCQkJCXJldHVybiAtRVRJTUVET1VUOwogCQkJbXNsZWVwKDEpOworCQl9CiAKIAkJaWYgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgewogCQkJSVdMX0VSUih0cmFucywKQEAgLTEyNjQsNiArMTMwOSw3IEBACiAJCQlyZXQgPSAtRVRJTUVET1VUOwogCQkJYnJlYWs7CiAJCX0KKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIlF1ZXVlICVkIGlzIG5vdyBlbXB0eS5cbiIsIGNudCk7CiAJfQogCiAJaWYgKCFyZXQpCkBAIC0xMjk4LDggKzEzNDQsOCBAQAogCQlJV0xfRVJSKHRyYW5zLAogCQkJIlEgJWQgaXMgJXNhY3RpdmUgYW5kIG1hcHBlZCB0byBmaWZvICVkIHJhX3RpZCAweCUwNHggWyVkLCVkXVxuIiwKIAkJCWNudCwgYWN0aXZlID8gIiIgOiAiaW4iLCBmaWZvLCB0YmxfZHcsCi0JCQlpd2xfcmVhZF9wcnBoKHRyYW5zLAotCQkJCSAgICAgIFNDRF9RVUVVRV9SRFBUUihjbnQpKSAmICh0eHEtPnEubl9iZCAtIDEpLAorCQkJaXdsX3JlYWRfcHJwaCh0cmFucywgU0NEX1FVRVVFX1JEUFRSKGNudCkpICYKKwkJCQkoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSksCiAJCQlpd2xfcmVhZF9wcnBoKHRyYW5zLCBTQ0RfUVVFVUVfV1JQVFIoY250KSkpOwogCX0KIApAQCAtMTYzMCw2ICsxNjc2LDYxIEBACiAJSVdMX0VSUih0cmFucywgImZhaWxlZCB0byBjcmVhdGUgdGhlIHRyYW5zIGRlYnVnZnMgZW50cnlcbiIpOwogCXJldHVybiAtRU5PTUVNOwogfQorCitzdGF0aWMgdTMyIGl3bF90cmFuc19wY2llX2dldF9jbWRsZW4oc3RydWN0IGl3bF90ZmQgKnRmZCkKK3sKKwl1MzIgY21kbGVuID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJV0xfTlVNX09GX1RCUzsgaSsrKQorCQljbWRsZW4gKz0gaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKTsKKworCXJldHVybiBjbWRsZW47Cit9CisKK3N0YXRpYyB1MzIgaXdsX3RyYW5zX3BjaWVfZHVtcF9kYXRhKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCSAgICB2b2lkICpidWYsIHUzMiBidWZsZW4pCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgaXdsX3R4cSAqY21kcSA9ICZ0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfdHhjbWQgKnR4Y21kOworCXUzMiBsZW47CisJaW50IGksIHB0cjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gc2l6ZW9mKCpkYXRhKSArCisJCSAgICAgICBjbWRxLT5xLm5fd2luZG93ICogKHNpemVvZigqdHhjbWQpICsKKwkJCQkJICAgVEZEX01BWF9QQVlMT0FEX1NJWkUpOworCisJbGVuID0gMDsKKwlkYXRhID0gYnVmOworCWRhdGEtPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9UWENNRCk7CisJdHhjbWQgPSAodm9pZCAqKWRhdGEtPmRhdGE7CisJc3Bpbl9sb2NrX2JoKCZjbWRxLT5sb2NrKTsKKwlwdHIgPSBjbWRxLT5xLndyaXRlX3B0cjsKKwlmb3IgKGkgPSAwOyBpIDwgY21kcS0+cS5uX3dpbmRvdzsgaSsrKSB7CisJCXU4IGlkeCA9IGdldF9jbWRfaW5kZXgoJmNtZHEtPnEsIHB0cik7CisJCXUzMiBjYXBsZW4sIGNtZGxlbjsKKworCQljbWRsZW4gPSBpd2xfdHJhbnNfcGNpZV9nZXRfY21kbGVuKCZjbWRxLT50ZmRzW3B0cl0pOworCQljYXBsZW4gPSBtaW5fdCh1MzIsIFRGRF9NQVhfUEFZTE9BRF9TSVpFLCBjbWRsZW4pOworCisJCWlmIChjbWRsZW4pIHsKKwkJCWxlbiArPSBzaXplb2YoKnR4Y21kKSArIGNhcGxlbjsKKwkJCXR4Y21kLT5jbWRsZW4gPSBjcHVfdG9fbGUzMihjbWRsZW4pOworCQkJdHhjbWQtPmNhcGxlbiA9IGNwdV90b19sZTMyKGNhcGxlbik7CisJCQltZW1jcHkodHhjbWQtPmRhdGEsIGNtZHEtPmVudHJpZXNbaWR4XS5jbWQsIGNhcGxlbik7CisJCQl0eGNtZCA9ICh2b2lkICopKCh1OCAqKXR4Y21kLT5kYXRhICsgY2FwbGVuKTsKKwkJfQorCisJCXB0ciA9IGl3bF9xdWV1ZV9kZWNfd3JhcChwdHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmY21kcS0+bG9jayk7CisKKwlkYXRhLT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCXJldHVybiBzaXplb2YoKmRhdGEpICsgbGVuOworfQogI2Vsc2UKIHN0YXRpYyBpbnQgaXdsX3RyYW5zX3BjaWVfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpkaXIpCkBAIC0xNjcyLDYgKzE3NzMsMTAgQEAKIAkuZ3JhYl9uaWNfYWNjZXNzID0gaXdsX3RyYW5zX3BjaWVfZ3JhYl9uaWNfYWNjZXNzLAogCS5yZWxlYXNlX25pY19hY2Nlc3MgPSBpd2xfdHJhbnNfcGNpZV9yZWxlYXNlX25pY19hY2Nlc3MsCiAJLnNldF9iaXRzX21hc2sgPSBpd2xfdHJhbnNfcGNpZV9zZXRfYml0c19tYXNrLAorCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworCS5kdW1wX2RhdGEgPSBpd2xfdHJhbnNfcGNpZV9kdW1wX2RhdGEsCisjZW5kaWYKIH07CiAKIHN0cnVjdCBpd2xfdHJhbnMgKml3bF90cmFuc19wY2llX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHguYwppbmRleCAzYjBjNzJjLi4wMzg5NDBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3R4LmMKQEAgLTcwLDIwICs3MCwyMCBAQAogCiAJLyoKIAkgKiBUbyBhdm9pZCBhbWJpZ3VpdHkgYmV0d2VlbiBlbXB0eSBhbmQgY29tcGxldGVseSBmdWxsIHF1ZXVlcywgdGhlcmUKLQkgKiBzaG91bGQgYWx3YXlzIGJlIGxlc3MgdGhhbiBxLT5uX2JkIGVsZW1lbnRzIGluIHRoZSBxdWV1ZS4KLQkgKiBJZiBxLT5uX3dpbmRvdyBpcyBzbWFsbGVyIHRoYW4gcS0+bl9iZCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZXNlcnZlCi0JICogYW55IHF1ZXVlIGVudHJpZXMgZm9yIHRoaXMgcHVycG9zZS4KKwkgKiBzaG91bGQgYWx3YXlzIGJlIGxlc3MgdGhhbiBURkRfUVVFVUVfU0laRV9NQVggZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgorCSAqIElmIHEtPm5fd2luZG93IGlzIHNtYWxsZXIgdGhhbiBURkRfUVVFVUVfU0laRV9NQVgsIHRoZXJlIGlzIG5vIG5lZWQKKwkgKiB0byByZXNlcnZlIGFueSBxdWV1ZSBlbnRyaWVzIGZvciB0aGlzIHB1cnBvc2UuCiAJICovCi0JaWYgKHEtPm5fd2luZG93IDwgcS0+bl9iZCkKKwlpZiAocS0+bl93aW5kb3cgPCBURkRfUVVFVUVfU0laRV9NQVgpCiAJCW1heCA9IHEtPm5fd2luZG93OwogCWVsc2UKLQkJbWF4ID0gcS0+bl9iZCAtIDE7CisJCW1heCA9IFRGRF9RVUVVRV9TSVpFX01BWCAtIDE7CiAKIAkvKgotCSAqIHEtPm5fYmQgaXMgYSBwb3dlciBvZiAyLCBzbyB0aGUgZm9sbG93aW5nIGlzIGVxdWl2YWxlbnQgdG8gbW9kdWxvIGJ5Ci0JICogcS0+bl9iZCBhbmQgaXMgd2VsbCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBkaXZpZGVuZHMuCisJICogVEZEX1FVRVVFX1NJWkVfTUFYIGlzIGEgcG93ZXIgb2YgMiwgc28gdGhlIGZvbGxvd2luZyBpcyBlcXVpdmFsZW50IHRvCisJICogbW9kdWxvIGJ5IFRGRF9RVUVVRV9TSVpFX01BWCBhbmQgaXMgd2VsbCBkZWZpbmVkLgogCSAqLwotCXVzZWQgPSAocS0+d3JpdGVfcHRyIC0gcS0+cmVhZF9wdHIpICYgKHEtPm5fYmQgLSAxKTsKKwl1c2VkID0gKHEtPndyaXRlX3B0ciAtIHEtPnJlYWRfcHRyKSAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKTsKIAogCWlmIChXQVJOX09OKHVzZWQgPiBtYXgpKQogCQlyZXR1cm4gMDsKQEAgLTk0LDE3ICs5NCwxMSBAQAogLyoKICAqIGl3bF9xdWV1ZV9pbml0IC0gSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIGFuZCByZWFkL3dyaXRlIGluZGV4ZXMKICAqLwotc3RhdGljIGludCBpd2xfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3F1ZXVlICpxLCBpbnQgY291bnQsIGludCBzbG90c19udW0sIHUzMiBpZCkKK3N0YXRpYyBpbnQgaXdsX3F1ZXVlX2luaXQoc3RydWN0IGl3bF9xdWV1ZSAqcSwgaW50IHNsb3RzX251bSwgdTMyIGlkKQogewotCXEtPm5fYmQgPSBjb3VudDsKIAlxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKIAlxLT5pZCA9IGlkOwogCi0JLyogY291bnQgbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlIGl3bF9xdWV1ZV9pbmNfd3JhcAotCSAqIGFuZCBpd2xfcXVldWVfZGVjX3dyYXAgYXJlIGJyb2tlbi4gKi8KLQlpZiAoV0FSTl9PTighaXNfcG93ZXJfb2ZfMihjb3VudCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qIHNsb3RzX251bSBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKIAkgKiBnZXRfY21kX2luZGV4IGlzIGJyb2tlbi4gKi8KIAlpZiAoV0FSTl9PTighaXNfcG93ZXJfb2ZfMihzbG90c19udW0pKSkKQEAgLTE5NywxNyArMTkxLDE3IEBACiAJCUlXTF9FUlIodHJhbnMsCiAJCQkiUSAlZCBpcyAlc2FjdGl2ZSBhbmQgbWFwcGVkIHRvIGZpZm8gJWQgcmFfdGlkIDB4JTA0eCBbJWQsJWRdXG4iLAogCQkJaSwgYWN0aXZlID8gIiIgOiAiaW4iLCBmaWZvLCB0YmxfZHcsCi0JCQlpd2xfcmVhZF9wcnBoKHRyYW5zLAotCQkJCSAgICAgIFNDRF9RVUVVRV9SRFBUUihpKSkgJiAodHhxLT5xLm5fYmQgLSAxKSwKKwkJCWl3bF9yZWFkX3BycGgodHJhbnMsIFNDRF9RVUVVRV9SRFBUUihpKSkgJgorCQkJCShURkRfUVVFVUVfU0laRV9NQVggLSAxKSwKIAkJCWl3bF9yZWFkX3BycGgodHJhbnMsIFNDRF9RVUVVRV9XUlBUUihpKSkpOwogCX0KIAogCWZvciAoaSA9IHEtPnJlYWRfcHRyOyBpICE9IHEtPndyaXRlX3B0cjsKLQkgICAgIGkgPSBpd2xfcXVldWVfaW5jX3dyYXAoaSwgcS0+bl9iZCkpCisJICAgICBpID0gaXdsX3F1ZXVlX2luY193cmFwKGkpKQogCQlJV0xfRVJSKHRyYW5zLCAic2NyYXRjaCAlZCA9IDB4JTA4eFxuIiwgaSwKIAkJCWxlMzJfdG9fY3B1KHR4cS0+c2NyYXRjaGJ1ZnNbaV0uc2NyYXRjaCkpOwogCi0JaXdsX3dyaXRlX3BycGgodHJhbnMsIERFVklDRV9TRVRfTk1JX1JFRywgMSk7CisJaXdsX2ZvcmNlX25taSh0cmFucyk7CiB9CiAKIC8qCkBAIC0yODcsMTQgKzI4MSwxNCBAQAogLyoKICAqIGl3bF9wY2llX3R4cV9pbmNfd3JfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaW5kZXggdG8gaGFyZHdhcmUKICAqLwotdm9pZCBpd2xfcGNpZV90eHFfaW5jX3dyX3B0cihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eHEgKnR4cSkKK3N0YXRpYyB2b2lkIGl3bF9wY2llX3R4cV9pbmNfd3JfcHRyKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgaXdsX3R4cSAqdHhxKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJdTMyIHJlZyA9IDA7CiAJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKIAotCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCi0JCXJldHVybjsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0eHEtPmxvY2spOwogCiAJLyoKIAkgKiBleHBsaWNpdGx5IHdha2UgdXAgdGhlIE5JQyBpZjoKQEAgLTMxNyw2ICszMTEsNyBAQAogCQkJCSAgICAgICB0eHFfaWQsIHJlZyk7CiAJCQlpd2xfc2V0X2JpdCh0cmFucywgQ1NSX0dQX0NOVFJMLAogCQkJCSAgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOworCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IHRydWU7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0zMjcsOCArMzIyLDIzIEBACiAJICovCiAJSVdMX0RFQlVHX1RYKHRyYW5zLCAiUTolZCBXUjogMHgleFxuIiwgdHhxX2lkLCB0eHEtPnEud3JpdGVfcHRyKTsKIAlpd2xfd3JpdGUzMih0cmFucywgSEJVU19UQVJHX1dSUFRSLCB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7Cit9CiAKLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKK3ZvaWQgaXdsX3BjaWVfdHhxX2NoZWNrX3dycHRycyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHRyYW5zLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOyBpKyspIHsKKwkJc3RydWN0IGl3bF90eHEgKnR4cSA9ICZ0cmFuc19wY2llLT50eHFbaV07CisKKwkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOworCQlpZiAodHJhbnNfcGNpZS0+dHhxW2ldLm5lZWRfdXBkYXRlKSB7CisJCQlpd2xfcGNpZV90eHFfaW5jX3dyX3B0cih0cmFucywgdHhxKTsKKwkJCXRyYW5zX3BjaWUtPnR4cVtpXS5uZWVkX3VwZGF0ZSA9IGZhbHNlOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmxvY2spOworCX0KIH0KIAogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcihzdHJ1Y3QgaXdsX3RmZCAqdGZkLCB1OCBpZHgpCkBAIC0zNDMsMTMgKzM1Myw2IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQotCXJldHVybiBsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pID4+IDQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfcGNpZV90ZmRfc2V0X3RiKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCwKIAkJCQkgICAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuKQogewpAQCAtNDA5LDEzICs0MTIsMTcgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RmZCAqdGZkX3RtcCA9IHR4cS0+dGZkczsKIAotCS8qIHJkX3B0ciBpcyBib3VuZGVkIGJ5IG5fYmQgYW5kIGlkeCBpcyBib3VuZGVkIGJ5IG5fd2luZG93ICovCisJLyogcmRfcHRyIGlzIGJvdW5kZWQgYnkgVEZEX1FVRVVFX1NJWkVfTUFYIGFuZAorCSAqIGlkeCBpcyBib3VuZGVkIGJ5IG5fd2luZG93CisJICovCiAJaW50IHJkX3B0ciA9IHR4cS0+cS5yZWFkX3B0cjsKIAlpbnQgaWR4ID0gZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCByZF9wdHIpOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmdHhxLT5sb2NrKTsKIAotCS8qIFdlIGhhdmUgb25seSBxLT5uX3dpbmRvdyB0eHEtPmVudHJpZXMsIGJ1dCB3ZSB1c2UgcS0+bl9iZCB0ZmRzICovCisJLyogV2UgaGF2ZSBvbmx5IHEtPm5fd2luZG93IHR4cS0+ZW50cmllcywgYnV0IHdlIHVzZQorCSAqIFRGRF9RVUVVRV9TSVpFX01BWCB0ZmRzCisJICovCiAJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCAmdHhxLT5lbnRyaWVzW2lkeF0ubWV0YSwgJnRmZF90bXBbcmRfcHRyXSk7CiAKIAkvKiBmcmVlIFNLQiAqLwpAQCAtNDM2LDcgKzQ0Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXdsX3BjaWVfdHhxX2J1aWxkX3RmZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eHEgKnR4cSwKLQkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQpCisJCQkJICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIGJvb2wgcmVzZXQpCiB7CiAJc3RydWN0IGl3bF9xdWV1ZSAqcTsKIAlzdHJ1Y3QgaXdsX3RmZCAqdGZkLCAqdGZkX3RtcDsKQEAgLTU0MiwxNSArNTQ5LDE0IEBACiB7CiAJaW50IHJldDsKIAotCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCXR4cS0+bmVlZF91cGRhdGUgPSBmYWxzZTsKIAogCS8qIFRGRF9RVUVVRV9TSVpFX01BWCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKIAkgKiBpd2xfcXVldWVfaW5jX3dyYXAgYW5kIGl3bF9xdWV1ZV9kZWNfd3JhcCBhcmUgYnJva2VuLiAqLwogCUJVSUxEX0JVR19PTihURkRfUVVFVUVfU0laRV9NQVggJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSkpOwogCiAJLyogSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIG1hcmtzLCBhbmQgaGVhZC90YWlsIGluZGV4ZXMgKi8KLQlyZXQgPSBpd2xfcXVldWVfaW5pdCgmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwKLQkJCXR4cV9pZCk7CisJcmV0ID0gaXdsX3F1ZXVlX2luaXQoJnR4cS0+cSwgc2xvdHNfbnVtLCB0eHFfaWQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTU3NSwxNSArNTgxLDEyIEBACiAJc3RydWN0IGl3bF90eHEgKnR4cSA9ICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXTsKIAlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKIAotCWlmICghcS0+bl9iZCkKLQkJcmV0dXJuOwotCiAJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOwogCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKIAkJSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAiUSAlZCBGcmVlICVkXG4iLAogCQkJCSAgIHR4cV9pZCwgcS0+cmVhZF9wdHIpOwogCQlpd2xfcGNpZV90eHFfZnJlZV90ZmQodHJhbnMsIHR4cSk7Ci0JCXEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKTsKKwkJcS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIpOwogCX0KIAl0eHEtPmFjdGl2ZSA9IGZhbHNlOwogCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmxvY2spOwpAQCAtNjIwLDEwICs2MjMsMTIgQEAKIAkJfQogCiAJLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KLQlpZiAodHhxLT5xLm5fYmQpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGl3bF90ZmQpICoKLQkJCQkgIHR4cS0+cS5uX2JkLCB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7CisJaWYgKHR4cS0+dGZkcykgeworCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsCisJCQkJICBzaXplb2Yoc3RydWN0IGl3bF90ZmQpICogVEZEX1FVRVVFX1NJWkVfTUFYLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwogCQl0eHEtPnEuZG1hX2FkZHIgPSAwOworCQl0eHEtPnRmZHMgPSBOVUxMOwogCiAJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKIAkJCQkgIHNpemVvZigqdHhxLT5zY3JhdGNoYnVmcykgKiB0eHEtPnEubl93aW5kb3csCkBAIC02ODAsNyArNjg1LDggQEAKIAkvKiBUaGUgY2hhaW4gZXh0ZW5zaW9uIG9mIHRoZSBTQ0QgZG9lc24ndCB3b3JrIHdlbGwuIFRoaXMgZmVhdHVyZSBpcwogCSAqIGVuYWJsZWQgYnkgZGVmYXVsdCBieSB0aGUgSFcsIHNvIHdlIG5lZWQgdG8gZGlzYWJsZSBpdCBtYW51YWxseS4KIAkgKi8KLQlpd2xfd3JpdGVfcHJwaCh0cmFucywgU0NEX0NIQUlORVhUX0VOLCAwKTsKKwlpZiAodHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPnNjZF9jaGFpbl9leHRfd2EpCisJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBTQ0RfQ0hBSU5FWFRfRU4sIDApOwogCiAJaXdsX3RyYW5zX2FjX3R4cV9lbmFibGUodHJhbnMsIHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSwKIAkJCQl0cmFuc19wY2llLT5jbWRfZmlmbyk7CkBAIC05MzEsOCArOTM3LDcgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0JLyogbl9iZCBpcyB1c3VhbGx5IDI1NiA9PiBuX2JkIC0gMSA9IDB4ZmYgKi8KLQlpbnQgdGZkX251bSA9IHNzbiAmICh0eHEtPnEubl9iZCAtIDEpOworCWludCB0ZmRfbnVtID0gc3NuICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpOwogCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCWludCBsYXN0X3RvX2ZyZWU7CiAKQEAgLTk1NiwxMiArOTYxLDEyIEBACiAKIAkvKlNpbmNlIHdlIGZyZWUgdW50aWwgaW5kZXggX25vdF8gaW5jbHVzaXZlLCB0aGUgb25lIGJlZm9yZSBpbmRleCBpcwogCSAqIHRoZSBsYXN0IHdlIHdpbGwgZnJlZS4gVGhpcyBvbmUgbXVzdCBiZSB1c2VkICovCi0JbGFzdF90b19mcmVlID0gaXdsX3F1ZXVlX2RlY193cmFwKHRmZF9udW0sIHEtPm5fYmQpOworCWxhc3RfdG9fZnJlZSA9IGl3bF9xdWV1ZV9kZWNfd3JhcCh0ZmRfbnVtKTsKIAogCWlmICghaXdsX3F1ZXVlX3VzZWQocSwgbGFzdF90b19mcmVlKSkgewogCQlJV0xfRVJSKHRyYW5zLAogCQkJIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGxhc3RfdG9fZnJlZSAlZCBpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwKLQkJCV9fZnVuY19fLCB0eHFfaWQsIGxhc3RfdG9fZnJlZSwgcS0+bl9iZCwKKwkJCV9fZnVuY19fLCB0eHFfaWQsIGxhc3RfdG9fZnJlZSwgVEZEX1FVRVVFX1NJWkVfTUFYLAogCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk3MSw3ICs5NzYsNyBAQAogCiAJZm9yICg7CiAJICAgICBxLT5yZWFkX3B0ciAhPSB0ZmRfbnVtOwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpKSB7CisJICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cikpIHsKIAogCQlpZiAoV0FSTl9PTl9PTkNFKHR4cS0+ZW50cmllc1t0eHEtPnEucmVhZF9wdHJdLnNrYiA9PSBOVUxMKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTAxMCwyNSArMTAxNSwyNiBAQAogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmdHhxLT5sb2NrKTsKIAotCWlmICgoaWR4ID49IHEtPm5fYmQpIHx8ICghaXdsX3F1ZXVlX3VzZWQocSwgaWR4KSkpIHsKKwlpZiAoKGlkeCA+PSBURkRfUVVFVUVfU0laRV9NQVgpIHx8ICghaXdsX3F1ZXVlX3VzZWQocSwgaWR4KSkpIHsKIAkJSVdMX0VSUih0cmFucywKIAkJCSIlczogUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpbmRleCAlZCBpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwKLQkJCV9fZnVuY19fLCB0eHFfaWQsIGlkeCwgcS0+bl9iZCwKKwkJCV9fZnVuY19fLCB0eHFfaWQsIGlkeCwgVEZEX1FVRVVFX1NJWkVfTUFYLAogCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGlkeCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7Ci0JICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKKwlmb3IgKGlkeCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChpZHgpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cikpIHsKIAogCQlpZiAobmZyZWVkKysgPiAwKSB7CiAJCQlJV0xfRVJSKHRyYW5zLCAiSENNRCBza2lwcGVkOiBpbmRleCAoJWQpICVkICVkXG4iLAogCQkJCWlkeCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgREVWSUNFX1NFVF9OTUlfUkVHLCAxKTsKKwkJCWl3bF9mb3JjZV9ubWkodHJhbnMpOwogCQl9CiAJfQogCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCWlmICh0cmFucy0+Y2ZnLT5iYXNlX3BhcmFtcy0+YXBtZ193YWtlX3VwX3dhICYmCisJICAgIHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKIAkJV0FSTl9PTighdHJhbnNfcGNpZS0+Y21kX2luX2ZsaWdodCk7CiAJCXRyYW5zX3BjaWUtPmNtZF9pbl9mbGlnaHQgPSBmYWxzZTsKQEAgLTEzMDksMjcgKzEzMTUsMzggQEAKIAljbWRfcG9zID0gb2Zmc2V0b2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kLCBwYXlsb2FkKTsKIAljb3B5X3NpemUgPSBzaXplb2Yob3V0X2NtZC0+aGRyKTsKIAlmb3IgKGkgPSAwOyBpIDwgSVdMX01BWF9DTURfVEJTX1BFUl9URkQ7IGkrKykgewotCQlpbnQgY29weSA9IDA7CisJCWludCBjb3B5OwogCiAJCWlmICghY21kLT5sZW5baV0pCiAJCQljb250aW51ZTsKIAotCQkvKiBuZWVkIGF0IGxlYXN0IElXTF9IQ01EX1NDUkFUQ0hCVUZfU0laRSBjb3BpZWQgKi8KKwkJLyogY29weSBldmVyeXRoaW5nIGlmIG5vdCBub2NvcHkvZHVwICovCisJCWlmICghKGNtZC0+ZGF0YWZsYWdzW2ldICYgKElXTF9IQ01EX0RGTF9OT0NPUFkgfAorCQkJCQkgICBJV0xfSENNRF9ERkxfRFVQKSkpIHsKKwkJCWNvcHkgPSBjbWQtPmxlbltpXTsKKworCQkJbWVtY3B5KCh1OCAqKW91dF9jbWQgKyBjbWRfcG9zLCBjbWQtPmRhdGFbaV0sIGNvcHkpOworCQkJY21kX3BvcyArPSBjb3B5OworCQkJY29weV9zaXplICs9IGNvcHk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIE90aGVyd2lzZSB3ZSBuZWVkIGF0IGxlYXN0IElXTF9IQ01EX1NDUkFUQ0hCVUZfU0laRSBjb3BpZWQKKwkJICogaW4gdG90YWwgKGZvciB0aGUgc2NyYXRjaGJ1ZiBoYW5kbGluZyksIGJ1dCBjb3B5IHVwIHRvIHdoYXQKKwkJICogd2UgY2FuIGZpdCBpbnRvIHRoZSBwYXlsb2FkIGZvciBkZWJ1ZyBkdW1wIHB1cnBvc2VzLgorCQkgKi8KKwkJY29weSA9IG1pbl90KGludCwgVEZEX01BWF9QQVlMT0FEX1NJWkUgLSBjbWRfcG9zLCBjbWQtPmxlbltpXSk7CisKKwkJbWVtY3B5KCh1OCAqKW91dF9jbWQgKyBjbWRfcG9zLCBjbWQtPmRhdGFbaV0sIGNvcHkpOworCQljbWRfcG9zICs9IGNvcHk7CisKKwkJLyogSG93ZXZlciwgdHJlYXQgY29weV9zaXplIHRoZSBwcm9wZXIgd2F5LCB3ZSBuZWVkIGl0IGJlbG93ICovCiAJCWlmIChjb3B5X3NpemUgPCBJV0xfSENNRF9TQ1JBVENIQlVGX1NJWkUpIHsKIAkJCWNvcHkgPSBJV0xfSENNRF9TQ1JBVENIQlVGX1NJWkUgLSBjb3B5X3NpemU7CiAKIAkJCWlmIChjb3B5ID4gY21kLT5sZW5baV0pCiAJCQkJY29weSA9IGNtZC0+bGVuW2ldOwotCQl9Ci0KLQkJLyogY29weSBldmVyeXRoaW5nIGlmIG5vdCBub2NvcHkvZHVwICovCi0JCWlmICghKGNtZC0+ZGF0YWZsYWdzW2ldICYgKElXTF9IQ01EX0RGTF9OT0NPUFkgfAotCQkJCQkgICBJV0xfSENNRF9ERkxfRFVQKSkpCi0JCQljb3B5ID0gY21kLT5sZW5baV07Ci0KLQkJaWYgKGNvcHkpIHsKLQkJCW1lbWNweSgodTggKilvdXRfY21kICsgY21kX3BvcywgY21kLT5kYXRhW2ldLCBjb3B5KTsKLQkJCWNtZF9wb3MgKz0gY29weTsKIAkJCWNvcHlfc2l6ZSArPSBjb3B5OwogCQl9CiAJfQpAQCAtMTM0NSw3ICsxMzYyLDcgQEAKIAltZW1jcHkoJnR4cS0+c2NyYXRjaGJ1ZnNbcS0+d3JpdGVfcHRyXSwgJm91dF9jbWQtPmhkciwgc2NyYXRjaF9zaXplKTsKIAlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsCiAJCQkgICAgICAgaXdsX3BjaWVfZ2V0X3NjcmF0Y2hidWZfZG1hKHR4cSwgcS0+d3JpdGVfcHRyKSwKLQkJCSAgICAgICBzY3JhdGNoX3NpemUsIDEpOworCQkJICAgICAgIHNjcmF0Y2hfc2l6ZSwgdHJ1ZSk7CiAKIAkvKiBtYXAgZmlyc3QgY29tbWFuZCBmcmFnbWVudCwgaWYgYW55IHJlbWFpbnMgKi8KIAlpZiAoY29weV9zaXplID4gc2NyYXRjaF9zaXplKSB7CkBAIC0xMzYxLDcgKzEzNzgsNyBAQAogCQl9CiAKIAkJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCBwaHlzX2FkZHIsCi0JCQkJICAgICAgIGNvcHlfc2l6ZSAtIHNjcmF0Y2hfc2l6ZSwgMCk7CisJCQkJICAgICAgIGNvcHlfc2l6ZSAtIHNjcmF0Y2hfc2l6ZSwgZmFsc2UpOwogCX0KIAogCS8qIG1hcCB0aGUgcmVtYWluaW5nIChhZGp1c3RlZCkgbm9jb3B5L2R1cCBmcmFnbWVudHMgKi8KQEAgLTEzODQsNyArMTQwMSw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgcGh5c19hZGRyLCBjbWRsZW5baV0sIDApOworCQlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHBoeXNfYWRkciwgY21kbGVuW2ldLCBmYWxzZSk7CiAJfQogCiAJb3V0X21ldGEtPmZsYWdzID0gY21kLT5mbGFnczsKQEAgLTEzOTIsOCArMTQwOSw2IEBACiAJCWtmcmVlKHR4cS0+ZW50cmllc1tpZHhdLmZyZWVfYnVmKTsKIAl0eHEtPmVudHJpZXNbaWR4XS5mcmVlX2J1ZiA9IGR1cF9idWY7CiAKLQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQogCXRyYWNlX2l3bHdpZmlfZGV2X2hjbWQodHJhbnMtPmRldiwgY21kLCBjbWRfc2l6ZSwgJm91dF9jbWQtPmhkcik7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KQEAgLTE0MDUsOSArMTQyMCwxMSBAQAogCS8qCiAJICogd2FrZSB1cCB0aGUgTklDIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJtd2FyZSB3aWxsIHNlZSB0aGUgaG9zdAogCSAqIGNvbW1hbmQgLSB3ZSB3aWxsIGxldCB0aGUgTklDIHNsZWVwIG9uY2UgYWxsIHRoZSBob3N0IGNvbW1hbmRzCi0JICogcmV0dXJuZWQuCisJICogcmV0dXJuZWQuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbmx5IG9uIE5JQ3MgdGhhdCBoYXZlCisJICogYXBtZ193YWtlX3VwX3dhIHNldC4KIAkgKi8KLQlpZiAoIXRyYW5zX3BjaWUtPmNtZF9pbl9mbGlnaHQpIHsKKwlpZiAodHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPmFwbWdfd2FrZV91cF93YSAmJgorCSAgICAhdHJhbnNfcGNpZS0+Y21kX2luX2ZsaWdodCkgewogCQl0cmFuc19wY2llLT5jbWRfaW5fZmxpZ2h0ID0gdHJ1ZTsKIAkJX19pd2xfdHJhbnNfcGNpZV9zZXRfYml0KHRyYW5zLCBDU1JfR1BfQ05UUkwsCiAJCQkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwpAQCAtMTQyNyw3ICsxNDQ0LDcgQEAKIAl9CiAKIAkvKiBJbmNyZW1lbnQgYW5kIHVwZGF0ZSBxdWV1ZSdzIHdyaXRlIGluZGV4ICovCi0JcS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7CisJcS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0cik7CiAJaXdsX3BjaWVfdHhxX2luY193cl9wdHIodHJhbnMsIHR4cSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFuc19wY2llLT5yZWdfbG9jaywgZmxhZ3MpOwpAQCAtMTU4Myw3ICsxNjAwLDcgQEAKIAkJCSAgICAgICBnZXRfY21kX3N0cmluZyh0cmFuc19wY2llLCBjbWQtPmlkKSk7CiAJCXJldCA9IC1FVElNRURPVVQ7CiAKLQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIERFVklDRV9TRVRfTk1JX1JFRywgMSk7CisJCWl3bF9mb3JjZV9ubWkodHJhbnMpOwogCQlpd2xfdHJhbnNfZndfZXJyb3IodHJhbnMpOwogCiAJCWdvdG8gY2FuY2VsOwpAQCAtMTY2MSw3ICsxNjc4LDcgQEAKIAlkbWFfYWRkcl90IHRiMF9waHlzLCB0YjFfcGh5cywgc2NyYXRjaF9waHlzOwogCXZvaWQgKnRiMV9hZGRyOwogCXUxNiBsZW4sIHRiMV9sZW4sIHRiMl9sZW47Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOworCWJvb2wgd2FpdF93cml0ZV9wdHI7CiAJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCXU4IGhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKIAl1MTYgd2lmaV9zZXE7CkBAIC0xNzIyLDcgKzE3MzksNyBAQAogCW1lbWNweSgmdHhxLT5zY3JhdGNoYnVmc1txLT53cml0ZV9wdHJdLCAmZGV2X2NtZC0+aGRyLAogCSAgICAgICBJV0xfSENNRF9TQ1JBVENIQlVGX1NJWkUpOwogCWl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgdGIwX3BoeXMsCi0JCQkgICAgICAgSVdMX0hDTURfU0NSQVRDSEJVRl9TSVpFLCAxKTsKKwkJCSAgICAgICBJV0xfSENNRF9TQ1JBVENIQlVGX1NJWkUsIHRydWUpOwogCiAJLyogdGhlcmUgbXVzdCBiZSBkYXRhIGxlZnQgb3ZlciBmb3IgVEIxIG9yIHRoaXMgY29kZSBtdXN0IGJlIGNoYW5nZWQgKi8KIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpd2xfdHhfY21kKSA8IElXTF9IQ01EX1NDUkFUQ0hCVUZfU0laRSk7CkBAIC0xNzMyLDcgKzE3NDksNyBAQAogCXRiMV9waHlzID0gZG1hX21hcF9zaW5nbGUodHJhbnMtPmRldiwgdGIxX2FkZHIsIHRiMV9sZW4sIERNQV9UT19ERVZJQ0UpOwogCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCB0YjFfcGh5cykpKQogCQlnb3RvIG91dF9lcnI7Ci0JaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCB0YjFfcGh5cywgdGIxX2xlbiwgMCk7CisJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCB0YjFfcGh5cywgdGIxX2xlbiwgZmFsc2UpOwogCiAJLyoKIAkgKiBTZXQgdXAgVEZEJ3MgdGhpcmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyCkBAIC0xNzQ4LDcgKzE3NjUsNyBAQAogCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOwogCQkJZ290byBvdXRfZXJyOwogCQl9Ci0JCWl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgdGIyX3BoeXMsIHRiMl9sZW4sIDApOworCQlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiMl9waHlzLCB0YjJfbGVuLCBmYWxzZSk7CiAJfQogCiAJLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCkBAIC0xNzYyLDEyICsxNzc5LDcgQEAKIAl0cmFjZV9pd2x3aWZpX2Rldl90eF9kYXRhKHRyYW5zLT5kZXYsIHNrYiwKIAkJCQkgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHRiMl9sZW4pOwogCi0JaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpIHsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JfSBlbHNlIHsKLQkJd2FpdF93cml0ZV9wdHIgPSAxOwotCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQl9CisJd2FpdF93cml0ZV9wdHIgPSBpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYyk7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KIAlpZiAodHhxLT5uZWVkX3VwZGF0ZSAmJiBxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIgJiYKQEAgLTE3NzUsMjIgKzE3ODcsMTkgQEAKIAkJbW9kX3RpbWVyKCZ0eHEtPnN0dWNrX3RpbWVyLCBqaWZmaWVzICsgdHJhbnNfcGNpZS0+d2RfdGltZW91dCk7CiAKIAkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaW5kZXggKmp1c3QgcGFzdCogdGhpcyBsYXRlc3QgZmlsbGVkIFRGRCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOwotCWl3bF9wY2llX3R4cV9pbmNfd3JfcHRyKHRyYW5zLCB0eHEpOworCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIpOworCWlmICghd2FpdF93cml0ZV9wdHIpCisJCWl3bF9wY2llX3R4cV9pbmNfd3JfcHRyKHRyYW5zLCB0eHEpOwogCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQotCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCi0JICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KKwkgKiBhbmQgd2Ugd2lsbCBnZXQgYSBUWCBzdGF0dXMgbm90aWZpY2F0aW9uIGV2ZW50dWFsbHkuCiAJICovCiAJaWYgKGl3bF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykgewotCQlpZiAod2FpdF93cml0ZV9wdHIpIHsKLQkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOworCQlpZiAod2FpdF93cml0ZV9wdHIpCiAJCQlpd2xfcGNpZV90eHFfaW5jX3dyX3B0cih0cmFucywgdHhxKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJaXdsX3N0b3BfcXVldWUodHJhbnMsIHR4cSk7Ci0JCX0KIAl9CiAJc3Bpbl91bmxvY2soJnR4cS0+bG9jayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCmluZGV4IDU0ZTM0NGEuLjQ3YTk5OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCkBAIC0xMDA2LDkgKzEwMDYsOCBAQAogfSBfX3BhY2tlZDsKIAogc3RhdGljIGludCBsYnNfc2V0X2tleV9tYXRlcmlhbChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJaW50IGtleV90eXBlLAotCQkJCWludCBrZXlfaW5mbywKLQkJCQl1OCAqa2V5LCB1MTYga2V5X2xlbikKKwkJCQlpbnQga2V5X3R5cGUsIGludCBrZXlfaW5mbywKKwkJCQljb25zdCB1OCAqa2V5LCB1MTYga2V5X2xlbikKIHsKIAlzdHJ1Y3QgY21kX2tleV9tYXRlcmlhbCBjbWQ7CiAJaW50IHJldDsKQEAgLTE2MTAsNyArMTYwOSw3IEBACiAgKi8KIAogc3RhdGljIGludCBsYnNfY2ZnX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKKwkJCSAgICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlzOCBzaWduYWwsIG5vaXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCmluZGV4IGFiOTY2ZjAuLjQwNzc4NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKQEAgLTkwLDcgKzkwLDggQEAKICNkZWZpbmUgbGJzX2RlYl9jZmc4MDIxMShmbXQsIGFyZ3MuLi4pICBMQlNfREVCX0xMKExCU19ERUJfQ0ZHODAyMTEsICIgY2ZnODAyMTEiLCBmbXQsICMjYXJncykKIAogI2lmZGVmIERFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQgbGJzX2RlYl9oZXgodW5zaWduZWQgaW50IGdycCwgY29uc3QgY2hhciAqcHJvbXB0LCB1OCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGxic19kZWJfaGV4KHVuc2lnbmVkIGludCBncnAsIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCSAgICAgICBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQogewogCWludCBpID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKaW5kZXggYzczNjZiMC4uZTQ0NmZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCkBAIC03MSw4ICs3MSwxMCBAQAogCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCi0JaWYgKHByaXYtPndkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQotCQlyZXR1cm4gcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQocHJpdiwgc2tiKTsKKwlpZiAocHJpdi0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKKwkJcmV0ID0gcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQocHJpdiwgc2tiKTsKKwkJZ290byBkb25lOworCX0KIAogCXBfcnhfcGQgPSAoc3RydWN0IHJ4cGQgKikgc2tiLT5kYXRhOwogCXBfcnhfcGt0ID0gKHN0cnVjdCByeHBhY2tldGhkciAqKSAoKHU4ICopcF9yeF9wZCArCkBAIC04Niw3ICs4OCw3IEBACiAJaWYgKHNrYi0+bGVuIDwgKEVUSF9ITEVOICsgOCArIHNpemVvZihzdHJ1Y3QgcnhwZCkpKSB7CiAJCWxic19kZWJfcngoInJ4IGVycjogZnJhbWUgcmVjZWl2ZWQgd2l0aCBiYWQgbGVuZ3RoXG4iKTsKIAkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCXJldCA9IDA7CisJCXJldCA9IC1FSU5WQUw7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJZ290byBkb25lOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCmluZGV4IDlkN2E1MmYuLmEzMTJjNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwpAQCAtMTY3Niw3ICsxNjc2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjODAyMTFfaHdzaW1fZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIG1hYzgwMjExX2h3c2ltX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJLyogTm90IGltcGxlbWVudGVkLCBxdWV1ZXMgb25seSBvbiBrZXJuZWwgc2lkZSAqLwogfQpAQCAtMjA1Niw2ICsyMDU4LDcgQEAKIAkJCSAgICBXSVBIWV9GTEFHX0FQX1VBUFNEIHwKIAkJCSAgICBXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSDsKIAlody0+d2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9BQ1RJVkVfTU9OSVRPUjsKKwlody0+d2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9BUF9NT0RFX0NIQU5fV0lEVEhfQ0hBTkdFOwogCiAJLyogYXNrIG1hYzgwMjExIHRvIHJlc2VydmUgc3BhY2UgZm9yIG1hZ2ljICovCiAJaHctPnZpZl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGh3c2ltX3ZpZl9wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFhYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMWFjLmMKaW5kZXggYzkyZjI3YS4uNzA2ODMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMWFjLmMKQEAgLTIxMiw4ICsyMTIsNyBAQAogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIpKTsKIAkJCW1lbWNweSgodTggKil2aHRfb3AgKwogCQkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIpLAotCQkJICAgICAgICh1OCAqKWJzc19kZXNjLT5iY25fdmh0X29wZXIgKwotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpLAorCQkJICAgICAgICh1OCAqKWJzc19kZXNjLT5iY25fdmh0X29wZXIsCiAJCQkgICAgICAgbGUxNl90b19jcHUodmh0X29wLT5oZWFkZXIubGVuKSk7CiAKIAkJCS8qIG5lZ290aWF0ZSB0aGUgY2hhbm5lbCB3aWR0aCBhbmQgY2VudHJhbCBmcmVxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uYwppbmRleCBkMTRlYWQ4Li5lMWMyZjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmMKQEAgLTM0NSw4ICszNDUsNyBAQAogCiAJCQltZW1jcHkoKHU4ICopIGh0X2luZm8gKwogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIpLAotCQkJICAgICAgICh1OCAqKSBic3NfZGVzYy0+YmNuX2h0X29wZXIgKwotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpLAorCQkJICAgICAgICh1OCAqKWJzc19kZXNjLT5iY25faHRfb3BlciwKIAkJCSAgICAgICBsZTE2X3RvX2NwdShodF9pbmZvLT5oZWFkZXIubGVuKSk7CiAKIAkJCWlmICghKHNiYW5kLT5odF9jYXAuY2FwICYKQEAgLTc1MCwzICs3NDksNDUgQEAKIAogCXJldHVybjsKIH0KKwordTggbXdpZmlleF9nZXRfc2VjX2NoYW5fb2Zmc2V0KGludCBjaGFuKQoreworCXU4IHNlY19vZmZzZXQ7CisKKwlzd2l0Y2ggKGNoYW4pIHsKKwljYXNlIDM2OgorCWNhc2UgNDQ6CisJY2FzZSA1MjoKKwljYXNlIDYwOgorCWNhc2UgMTAwOgorCWNhc2UgMTA4OgorCWNhc2UgMTE2OgorCWNhc2UgMTI0OgorCWNhc2UgMTMyOgorCWNhc2UgMTQwOgorCWNhc2UgMTQ5OgorCWNhc2UgMTU3OgorCQlzZWNfb2Zmc2V0ID0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CisJCWJyZWFrOworCWNhc2UgNDA6CisJY2FzZSA0ODoKKwljYXNlIDU2OgorCWNhc2UgNjQ6CisJY2FzZSAxMDQ6CisJY2FzZSAxMTI6CisJY2FzZSAxMjA6CisJY2FzZSAxMjg6CisJY2FzZSAxMzY6CisJY2FzZSAxNDQ6CisJY2FzZSAxNTM6CisJY2FzZSAxNjE6CisJCXNlY19vZmZzZXQgPSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKKwkJYnJlYWs7CisJY2FzZSAxNjU6CisJZGVmYXVsdDoKKwkJc2VjX29mZnNldCA9IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzZWNfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmgKaW5kZXggNDBiMDA3YS4uMGI3M2ZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5oCkBAIC02Myw2ICs2Myw3IEBACiAJCQkJaW50IGNtZF9hY3Rpb24sCiAJCQkJc3RydWN0IG13aWZpZXhfZHNfMTFuX2Ftc2R1X2FnZ3JfY3RybCAqYWFfY3RybCk7CiB2b2lkIG13aWZpZXhfZGVsX3R4X2JhX3N0cmVhbV90YmxfYnlfcmEoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnJhKTsKK3U4IG13aWZpZXhfZ2V0X3NlY19jaGFuX29mZnNldChpbnQgY2hhbik7CiAKIHN0YXRpYyBpbmxpbmUgdTgKIG13aWZpZXhfaXNfc3RhdGlvbl9hbXBkdV9hbGxvd2VkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCkBAIC0xOTksNyArMjAwLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB1OAotbXdpZmlleF90ZGxzX3BlZXJfMTFuX2VuYWJsZWQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnJhKQorbXdpZmlleF90ZGxzX3BlZXJfMTFuX2VuYWJsZWQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKnJhKQogewogCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpub2RlID0gbXdpZmlleF9nZXRfc3RhX2VudHJ5KHByaXYsIHJhKTsKIAlpZiAobm9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX2FnZ3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX2FnZ3IuYwppbmRleCA2MzIxMTcwNy4uNWIzMjEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fYWdnci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX2FnZ3IuYwpAQCAtMTAwLDYgKzEwMCw3IEBACiAJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdHhwZCAqbG9jYWxfdHhfcGQ7CisJc3RydWN0IG13aWZpZXhfdHhpbmZvICp0eF9pbmZvID0gTVdJRklFWF9TS0JfVFhDQihza2IpOwogCiAJc2tiX3B1c2goc2tiLCBzaXplb2YoKmxvY2FsX3R4X3BkKSk7CiAKQEAgLTExOCw2ICsxMTksOSBAQAogCWxvY2FsX3R4X3BkLT50eF9wa3RfbGVuZ3RoID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLQogCQkJCQkJIHNpemVvZigqbG9jYWxfdHhfcGQpKTsKIAorCWlmICh0eF9pbmZvLT5mbGFncyAmIE1XSUZJRVhfQlVGX0ZMQUdfVERMU19QS1QpCisJCWxvY2FsX3R4X3BkLT5mbGFncyB8PSBNV0lGSUVYX1RYUERfRkxBR1NfVERMU19QQUNLRVQ7CisKIAlpZiAobG9jYWxfdHhfcGQtPnR4X2NvbnRyb2wgPT0gMCkKIAkJLyogVHhDdHJsIHNldCBieSB1c2VyIG9yIGRlZmF1bHQgKi8KIAkJbG9jYWxfdHhfcGQtPnR4X2NvbnRyb2wgPSBjcHVfdG9fbGUzMihwcml2LT5wa3RfdHhfY3RybCk7CkBAIC0xNjAsNiArMTY0LDcgQEAKIAlpbnQgcGFkID0gMCwgcmV0OwogCXN0cnVjdCBtd2lmaWV4X3R4X3BhcmFtIHR4X3BhcmFtOwogCXN0cnVjdCB0eHBkICpwdHhfcGQgPSBOVUxMOworCXN0cnVjdCB0aW1ldmFsIHR2OwogCWludCBoZWFkcm9vbSA9IGFkYXB0ZXItPmlmYWNlX3R5cGUgPT0gTVdJRklFWF9VU0IgPyAwIDogSU5URl9IRUFERVJfTEVOOwogCiAJc2tiX3NyYyA9IHNrYl9wZWVrKCZwcmFfbGlzdC0+c2tiX2hlYWQpOwpAQCAtMTgyLDggKzE4NywxNCBAQAogCiAJdHhfaW5mb19hZ2dyLT5ic3NfdHlwZSA9IHR4X2luZm9fc3JjLT5ic3NfdHlwZTsKIAl0eF9pbmZvX2FnZ3ItPmJzc19udW0gPSB0eF9pbmZvX3NyYy0+YnNzX251bTsKKworCWlmICh0eF9pbmZvX3NyYy0+ZmxhZ3MgJiBNV0lGSUVYX0JVRl9GTEFHX1RETFNfUEtUKQorCQl0eF9pbmZvX2FnZ3ItPmZsYWdzIHw9IE1XSUZJRVhfQlVGX0ZMQUdfVERMU19QS1Q7CiAJc2tiX2FnZ3ItPnByaW9yaXR5ID0gc2tiX3NyYy0+cHJpb3JpdHk7CiAKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlza2JfYWdnci0+dHN0YW1wID0gdGltZXZhbF90b19rdGltZSh0dik7CisKIAlkbyB7CiAJCS8qIENoZWNrIGlmIEFNU0RVIGNhbiBhY2NvbW1vZGF0ZSB0aGlzIE1TRFUgKi8KIAkJaWYgKHNrYl90YWlscm9vbShza2JfYWdncikgPCAoc2tiX3NyYy0+bGVuICsgTExDX1NOQVBfTEVOKSkKQEAgLTIzNiwxOCArMjQ3LDExIEBACiAJCXJldCA9IGFkYXB0ZXItPmlmX29wcy5ob3N0X3RvX2NhcmQoYWRhcHRlciwgTVdJRklFWF9VU0JfRVBfREFUQSwKIAkJCQkJCSAgIHNrYl9hZ2dyLCBOVUxMKTsKIAl9IGVsc2UgewotCQkvKgotCQkgKiBQYWRkaW5nIHBlciBNU0RVIHdpbGwgYWZmZWN0IHRoZSBsZW5ndGggb2YgbmV4dAotCQkgKiBwYWNrZXQgYW5kIGhlbmNlIHRoZSBleGFjdCBsZW5ndGggb2YgbmV4dCBwYWNrZXQKLQkJICogaXMgdW5jZXJ0YWluIGhlcmUuCi0JCSAqCi0JCSAqIEFsc28sIGFnZ3JlZ2F0aW9uIG9mIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdoaWxlCi0JCSAqIGRvd25sb2FkaW5nIHRoZSBkYXRhIHRvIHRoZSBjYXJkLCB3b250IGdhaW4gbXVjaAotCQkgKiBvbiB0aGUgQU1TRFUgcGFja2V0cyBhcyB0aGUgQU1TRFUgcGFja2V0cyB1dGlsaXplcwotCQkgKiB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlciBzcGFjZSB0byB0aGUgbWF4aW11bQotCQkgKiAoYWRhcHRlci0+dHhfYnVmX3NpemUpLgotCQkgKi8KLQkJdHhfcGFyYW0ubmV4dF9wa3RfbGVuID0gMDsKKwkJaWYgKHNrYl9zcmMpCisJCQl0eF9wYXJhbS5uZXh0X3BrdF9sZW4gPQorCQkJCQlza2Jfc3JjLT5sZW4gKyBzaXplb2Yoc3RydWN0IHR4cGQpOworCQllbHNlCisJCQl0eF9wYXJhbS5uZXh0X3BrdF9sZW4gPSAwOwogCiAJCXJldCA9IGFkYXB0ZXItPmlmX29wcy5ob3N0X3RvX2NhcmQoYWRhcHRlciwgTVdJRklFWF9UWVBFX0RBVEEsCiAJCQkJCQkgICBza2JfYWdnciwgJnR4X3BhcmFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvUkVBRE1FIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9SRUFETUUKaW5kZXggYjkyNDJjMy4uM2I1NWNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9SRUFETUUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9SRUFETUUKQEAgLTIwMCw0ICsyMDAsMTEgQEAKIAogCWNhdCBnZXRsb2cKIAorZndfZHVtcAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGR1bXAgZmlybXdhcmUgbWVtb3J5IGludG8gZmlsZXMuCisJU2VwYXJhdGUgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggbWVtb3J5IHNlZ21lbnQuCisJVXNhZ2U6CisKKwljYXQgZndfZHVtcAorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKaW5kZXggMjFlZTI3YS4uZTk1ZGVjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYwpAQCAtOTk0LDcgKzk5NCw3IEBACiAgKi8KIHN0YXRpYyBpbnQKIG13aWZpZXhfY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisJCQkgICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9nZXRfcHJpdihkZXYpOwogCkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogICovCiBzdGF0aWMgaW50CiBtd2lmaWV4X2NmZzgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHU4ICptYWMpCisJCQkgICAgIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7CiAJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9ub2RlOwpAQCAtMjYyOSw3ICsyNjI5LDcgQEAKICAqLwogc3RhdGljIGludAogbXdpZmlleF9jZmc4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJICAgY29uc3QgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCiAJCQkgICB1MTYgc3RhdHVzX2NvZGUsIHUzMiBwZWVyX2NhcGFiaWxpdHksCiAJCQkgICBjb25zdCB1OCAqZXh0cmFfaWVzLCBzaXplX3QgZXh0cmFfaWVzX2xlbikKIHsKQEAgLTI3MDEsNyArMjcwMSw3IEBACiAKIHN0YXRpYyBpbnQKIG13aWZpZXhfY2ZnODAyMTFfdGRsc19vcGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICB1OCAqcGVlciwgZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIGFjdGlvbikKKwkJCSAgIGNvbnN0IHU4ICpwZWVyLCBlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24gYWN0aW9uKQogewogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9nZXRfcHJpdihkZXYpOwogCkBAIC0yNzQ4LDkgKzI3NDgsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1td2lmaWV4X2NmZzgwMjExX2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKK213aWZpZXhfY2ZnODAyMTFfYWRkX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgY29uc3QgdTggKm1hYywgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9nZXRfcHJpdihkZXYpOwogCkBAIC0yNzY1LDkgKzI3NjQsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1td2lmaWV4X2NmZzgwMjExX2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQl1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCittd2lmaWV4X2NmZzgwMjExX2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJY29uc3QgdTggKm1hYywKKwkJCQlzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NtZGV2dC5jCmluZGV4IDEwNjJjOTEuLjhkZWU2YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jbWRldnQuYwpAQCAtOTU1LDggKzk1NSw2IEBACiAJCQlhZGFwdGVyLT5jbWRfd2FpdF9xLnN0YXR1cyA9IC1FVElNRURPVVQ7CiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPmNtZF93YWl0X3Eud2FpdCk7CiAJCQltd2lmaWV4X2NhbmNlbF9wZW5kaW5nX2lvY3RsKGFkYXB0ZXIpOwotCQkJLyogcmVzZXQgY21kX3NlbnQgZmxhZyB0byB1bmJsb2NrIG5ldyBjb21tYW5kcyAqLwotCQkJYWRhcHRlci0+Y21kX3NlbnQgPSBmYWxzZTsKIAkJfQogCX0KIAlpZiAoYWRhcHRlci0+aHdfc3RhdHVzID09IE1XSUZJRVhfSFdfU1RBVFVTX0lOSVRJQUxJWklORykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWJ1Z2ZzLmMKaW5kZXggYjhhNDlhYS4uN2I0MTliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWJ1Z2ZzLmMKQEAgLTI1Nyw2ICsyNTcsMjkgQEAKIH0KIAogLyoKKyAqIFByb2MgZmlybXdhcmUgZHVtcCByZWFkIGhhbmRsZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgJ2Z3X2R1bXAnIGZpbGUgaXMgb3BlbmVkIGZvcgorICogcmVhZGluZy4KKyAqIFRoaXMgZnVuY3Rpb24gZHVtcHMgZmlybXdhcmUgbWVtb3J5IGluIGRpZmZlcmVudCBmaWxlcworICogKGV4LiBEVENNLCBJVENNLCBTUVJBTSBldGMuKSBiYXNlZCBvbiB0aGUgdGhlIHNlZ21lbnRzIGZvcgorICogZGVidWdnaW5nLgorICovCitzdGF0aWMgc3NpemVfdAorbXdpZmlleF9md19kdW1wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLAorCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXByaXYtPmFkYXB0ZXItPmlmX29wcy5md19kdW1wKQorCQlyZXR1cm4gLUVJTzsKKworCXByaXYtPmFkYXB0ZXItPmlmX29wcy5md19kdW1wKHByaXYtPmFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBQcm9jIGdldGxvZyBmaWxlIHJlYWQgaGFuZGxlci4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSAnZ2V0bG9nJyBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZwpAQCAtNjk5LDYgKzcyMiw3IEBACiBNV0lGSUVYX0RGU19GSUxFX1JFQURfT1BTKGluZm8pOwogTVdJRklFWF9ERlNfRklMRV9SRUFEX09QUyhkZWJ1Zyk7CiBNV0lGSUVYX0RGU19GSUxFX1JFQURfT1BTKGdldGxvZyk7CitNV0lGSUVYX0RGU19GSUxFX1JFQURfT1BTKGZ3X2R1bXApOwogTVdJRklFWF9ERlNfRklMRV9PUFMocmVncmR3cik7CiBNV0lGSUVYX0RGU19GSUxFX09QUyhyZGVlcHJvbSk7CiAKQEAgLTcyMiw2ICs3NDYsNyBAQAogCU1XSUZJRVhfREZTX0FERF9GSUxFKGdldGxvZyk7CiAJTVdJRklFWF9ERlNfQUREX0ZJTEUocmVncmR3cik7CiAJTVdJRklFWF9ERlNfQUREX0ZJTEUocmRlZXByb20pOworCU1XSUZJRVhfREZTX0FERF9GSUxFKGZ3X2R1bXApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWNsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2RlY2wuaAppbmRleCBlN2IzZTE2Li4zOGRhNmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2RlY2wuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2RlY2wuaApAQCAtNDIsMTIgKzQyLDEyIEBACiAjZGVmaW5lIE1XSUZJRVhfTUFYX1RYX0JBU1RSRUFNX1NVUFBPUlRFRAkyCiAjZGVmaW5lIE1XSUZJRVhfTUFYX1JYX0JBU1RSRUFNX1NVUFBPUlRFRAkxNgogCi0jZGVmaW5lIE1XSUZJRVhfU1RBX0FNUERVX0RFRl9UWFdJTlNJWkUgICAgICAgIDE2Ci0jZGVmaW5lIE1XSUZJRVhfU1RBX0FNUERVX0RFRl9SWFdJTlNJWkUgICAgICAgIDMyCisjZGVmaW5lIE1XSUZJRVhfU1RBX0FNUERVX0RFRl9UWFdJTlNJWkUgICAgICAgIDY0CisjZGVmaW5lIE1XSUZJRVhfU1RBX0FNUERVX0RFRl9SWFdJTlNJWkUgICAgICAgIDY0CiAjZGVmaW5lIE1XSUZJRVhfVUFQX0FNUERVX0RFRl9UWFdJTlNJWkUgICAgICAgIDMyCiAjZGVmaW5lIE1XSUZJRVhfVUFQX0FNUERVX0RFRl9SWFdJTlNJWkUgICAgICAgIDE2Ci0jZGVmaW5lIE1XSUZJRVhfMTFBQ19TVEFfQU1QRFVfREVGX1RYV0lOU0laRSAgIDMyCi0jZGVmaW5lIE1XSUZJRVhfMTFBQ19TVEFfQU1QRFVfREVGX1JYV0lOU0laRSAgIDQ4CisjZGVmaW5lIE1XSUZJRVhfMTFBQ19TVEFfQU1QRFVfREVGX1RYV0lOU0laRSAgIDY0CisjZGVmaW5lIE1XSUZJRVhfMTFBQ19TVEFfQU1QRFVfREVGX1JYV0lOU0laRSAgIDY0CiAjZGVmaW5lIE1XSUZJRVhfMTFBQ19VQVBfQU1QRFVfREVGX1RYV0lOU0laRSAgIDQ4CiAjZGVmaW5lIE1XSUZJRVhfMTFBQ19VQVBfQU1QRFVfREVGX1JYV0lOU0laRSAgIDMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAppbmRleCBiNDg1ZGMxLi4zMTc1ZGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCkBAIC0xNjksNiArMTY5LDcgQEAKICNkZWZpbmUgVExWX1RZUEVfR1dLX0NJUEhFUiAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE0NikKICNkZWZpbmUgVExWX1RZUEVfQ09BTEVTQ0VfUlVMRSAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE1NCkKICNkZWZpbmUgVExWX1RZUEVfS0VZX1BBUkFNX1YyICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE1NikKKyNkZWZpbmUgVExWX1RZUEVfVERMU19JRExFX1RJTUVPVVQgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE5NCkKICNkZWZpbmUgVExWX1RZUEVfRldfQVBJX1JFViAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE5OSkKIAogI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMksgICAgICAgIDIwNDgKQEAgLTIyOSw2ICsyMzAsNyBAQAogI2RlZmluZSBJU0VOQUJMRURfNDBNSFpfSU5UT0xFUkFOVChEb3QxMW5EZXZDYXApIChEb3QxMW5EZXZDYXAgJiBCSVQoOCkpCiAjZGVmaW5lIElTU1VQUF9SWExEUEMoRG90MTFuRGV2Q2FwKSAoRG90MTFuRGV2Q2FwICYgQklUKDIyKSkKICNkZWZpbmUgSVNTVVBQX0JFQU1GT1JNSU5HKERvdDExbkRldkNhcCkgKERvdDExbkRldkNhcCAmIEJJVCgzMCkpCisjZGVmaW5lIElTQUxMT1dFRF9DSEFOV0lEVEg0MChodF9wYXJhbSkgKGh0X3BhcmFtICYgQklUKDIpKQogCiAvKiBodHR4Y2ZnIGJpdG1hcAogICogMAkJcmVzZXJ2ZWQKQEAgLTQwMyw3ICs0MDUsNyBAQAogI2RlZmluZSBIU19DRkdfQ0FOQ0VMCQkJMHhmZmZmZmZmZgogI2RlZmluZSBIU19DRkdfQ09ORF9ERUYJCQkweDAwMDAwMDAwCiAjZGVmaW5lIEhTX0NGR19HUElPX0RFRgkJCTB4ZmYKLSNkZWZpbmUgSFNfQ0ZHX0dBUF9ERUYJCQkwCisjZGVmaW5lIEhTX0NGR19HQVBfREVGCQkJMHhmZgogI2RlZmluZSBIU19DRkdfQ09ORF9CUk9BRENBU1RfREFUQQkweDAwMDAwMDAxCiAjZGVmaW5lIEhTX0NGR19DT05EX1VOSUNBU1RfREFUQQkweDAwMDAwMDAyCiAjZGVmaW5lIEhTX0NGR19DT05EX01BQ19FVkVOVAkJMHgwMDAwMDAwNApAQCAtNDg3LDYgKzQ4OSw3IEBACiAjZGVmaW5lIEVWRU5UX1VBUF9NSUNfQ09VTlRFUk1FQVNVUkVTICAgMHgwMDAwMDA0YwogI2RlZmluZSBFVkVOVF9IT1NUV0FLRV9TVEFJRQkJMHgwMDAwMDA0ZAogI2RlZmluZSBFVkVOVF9DSEFOTkVMX1NXSVRDSF9BTk4gICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgRVZFTlRfVERMU19HRU5FUklDX0VWRU5UICAgICAgICAweDAwMDAwMDUyCiAjZGVmaW5lIEVWRU5UX0VYVF9TQ0FOX1JFUE9SVCAgICAgICAgICAgMHgwMDAwMDA1OAogI2RlZmluZSBFVkVOVF9SRU1BSU5fT05fQ0hBTl9FWFBJUkVEICAgIDB4MDAwMDAwNWYKIApAQCAtNTE5LDYgKzUyMiw3IEBACiAjZGVmaW5lIEFDVF9URExTX0RFTEVURSAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgQUNUX1RETFNfQ1JFQVRFICAgICAgICAgICAgMHgwMQogI2RlZmluZSBBQ1RfVERMU19DT05GSUcgICAgICAgICAgICAweDAyCisjZGVmaW5lIFRETFNfRVZFTlRfTElOS19URUFSX0RPV04gIDMKIAogI2RlZmluZSBNV0lGSUVYX0ZXX1YxNQkJICAgMTUKIApAQCAtNTM1LDYgKzUzOSw3IEBACiAjZGVmaW5lIE1XSUZJRVhfVHhQRF9QT1dFUl9NR01UX05VTExfUEFDS0VUIDB4MDEKICNkZWZpbmUgTVdJRklFWF9UeFBEX1BPV0VSX01HTVRfTEFTVF9QQUNLRVQgMHgwOAogI2RlZmluZSBNV0lGSUVYX1RYUERfRkxBR1NfVERMU19QQUNLRVQgICAgICAweDEwCisjZGVmaW5lIE1XSUZJRVhfUlhQRF9GTEFHU19URExTX1BBQ0tFVCAgICAgIDB4MDEKIAogc3RydWN0IHR4cGQgewogCXU4IGJzc190eXBlOwpAQCAtNTc3LDcgKzU4Miw3IEBACiAJICogW0JpdCA3XSBSZXNlcnZlZAogCSAqLwogCXU4IGh0X2luZm87Ci0JdTggcmVzZXJ2ZWQ7CisJdTggZmxhZ3M7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdWFwX3R4cGQgewpAQCAtNzA4LDYgKzcxMywxMyBAQAogCXU4IGllW01XSUZJRVhfTUFYX1ZTSUVfTEVOXTsKIH07CiAKKyNkZWZpbmUgTVdJRklFWF9URExTX0lETEVfVElNRU9VVAk2MAorCitzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc190ZGxzX2lkbGVfdGltZW91dCB7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMTYgdmFsdWU7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yc25fcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOwogCXU4IHJzbl9pZVsxXTsKQEAgLTE3NDUsNiArMTc1NywxNSBAQAogCV9fbGUxNiBldmVudHM7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgbXdpZmlleF90ZGxzX2dlbmVyaWNfZXZlbnQgeworCV9fbGUxNiB0eXBlOworCXU4IHBlZXJfbWFjW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCV9fbGUxNiByZWFzb25fY29kZTsKKwkJX19sZTE2IHJlc2VydmVkOworCX0gdTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBtd2lmaWV4X2llIHsKIAlfX2xlMTYgaWVfaW5kZXg7CiAJX19sZTE2IG1nbXRfc3VidHlwZV9tYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pb2N0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pb2N0bC5oCmluZGV4IGVlNDk0ZGIuLjFiNTc2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW9jdGwuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2lvY3RsLmgKQEAgLTMwMyw3ICszMDMsNyBAQAogCXUzMiByeF9hbnQ7CiB9OwogCi0jZGVmaW5lIE1XSUZJRVhfTlVNX09GX0NNRF9CVUZGRVIJMjAKKyNkZWZpbmUgTVdJRklFWF9OVU1fT0ZfQ01EX0JVRkZFUgk1MAogI2RlZmluZSBNV0lGSUVYX1NJWkVfT0ZfQ01EX0JVRkZFUgkyMDQ4CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwppbmRleCA5Yzc3MWIzLi5jYmFiYzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwpAQCAtNTIxLDcgKzUyMSw2IEBACiAJCXJlbGVhc2VfZmlybXdhcmUoYWRhcHRlci0+ZmlybXdhcmUpOwogCQlhZGFwdGVyLT5maXJtd2FyZSA9IE5VTEw7CiAJfQotCWNvbXBsZXRlKCZhZGFwdGVyLT5md19sb2FkKTsKIAlpZiAoaW5pdF9mYWlsZWQpCiAJCW13aWZpZXhfZnJlZV9hZGFwdGVyKGFkYXB0ZXIpOwogCXVwKHNlbSk7CkBAIC01MzUsNyArNTM0LDYgQEAKIHsKIAlpbnQgcmV0OwogCi0JaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5md19sb2FkKTsKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgYWRhcHRlci0+ZndfbmFtZSwKIAkJCQkgICAgICBhZGFwdGVyLT5kZXYsIEdGUF9LRVJORUwsIGFkYXB0ZXIsCiAJCQkJICAgICAgbXdpZmlleF9md19kcGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaAppbmRleCBkNTNlMWU4Li4xMzk4YWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaApAQCAtNjcyLDYgKzY3Miw3IEBACiAJaW50ICgqaW5pdF9md19wb3J0KSAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqKTsKIAlpbnQgKCpkbmxkX2Z3KSAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqLCBzdHJ1Y3QgbXdpZmlleF9md19pbWFnZSAqKTsKIAl2b2lkICgqY2FyZF9yZXNldCkgKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKik7CisJdm9pZCAoKmZ3X2R1bXApKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKik7CiAJaW50ICgqY2xlYW5fcGNpZV9yaW5nKSAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CiB9OwogCkBAIC03ODcsNyArNzg4LDYgQEAKIAlzdHJ1Y3QgbXdpZmlleF93YWl0X3F1ZXVlIGNtZF93YWl0X3E7CiAJdTggc2Nhbl93YWl0X3Ffd29rZW47CiAJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwkJLyogbG9jayBmb3IgdHggcXVldWVzICovCi0Jc3RydWN0IGNvbXBsZXRpb24gZndfbG9hZDsKIAl1OCBjb3VudHJ5X2NvZGVbSUVFRTgwMjExX0NPVU5UUllfU1RSSU5HX0xFTl07CiAJdTE2IG1heF9tZ210X2llX2luZGV4OwogCXU4IHNjYW5fZGVsYXlfY250OwpAQCAtOTEwLDggKzkxMCw2IEBACiAJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBtd2lmaWV4X3Byb2Nlc3Nfc3RhX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKik7CiBpbnQgbXdpZmlleF9wcm9jZXNzX3VhcF9ldmVudChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICopOwotc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKgotbXdpZmlleF9nZXRfc3RhX2VudHJ5KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICptYWMpOwogdm9pZCBtd2lmaWV4X2RlbGV0ZV9hbGxfc3RhdGlvbl9saXN0KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwogdm9pZCAqbXdpZmlleF9wcm9jZXNzX3N0YV90eHBkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkICptd2lmaWV4X3Byb2Nlc3NfdWFwX3R4cGQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTExMDEsNyArMTA5OSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogQ2xlYXIgY3NhIGNoYW5uZWwsIGlmIERGUyBjaGFubmVsIG1vdmUgdGltZSBoYXMgcGFzc2VkICovCi0JaWYgKGppZmZpZXMgPiBwcml2LT5jc2FfZXhwaXJlX3RpbWUpIHsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5jc2FfZXhwaXJlX3RpbWUpKSB7CiAJCXByaXYtPmNzYV9jaGFuID0gMDsKIAkJcHJpdi0+Y3NhX2V4cGlyZV90aW1lID0gMDsKIAl9CkBAIC0xMjIwLDI2ICsxMjE4LDI2IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG13aWZpZXhfZXRodG9vbF9vcHM7CiAKIHZvaWQgbXdpZmlleF9kZWxfYWxsX3N0YV9saXN0KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwotdm9pZCBtd2lmaWV4X2RlbF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKm1hYyk7Cit2b2lkIG13aWZpZXhfZGVsX3N0YV9lbnRyeShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBjb25zdCB1OCAqbWFjKTsKIHZvaWQKIG13aWZpZXhfc2V0X3N0YV9odF9jYXAoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKmllcywKIAkJICAgICAgIGludCBpZXNfbGVuLCBzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqbm9kZSk7CiBzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqCi1td2lmaWV4X2FkZF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKm1hYyk7Cittd2lmaWV4X2FkZF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYyk7CiBzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqCi1td2lmaWV4X2dldF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKm1hYyk7Ci1pbnQgbXdpZmlleF9zZW5kX3RkbHNfZGF0YV9mcmFtZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqcGVlciwKK213aWZpZXhfZ2V0X3N0YV9lbnRyeShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBjb25zdCB1OCAqbWFjKTsKK2ludCBtd2lmaWV4X3NlbmRfdGRsc19kYXRhX2ZyYW1lKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyLAogCQkJCSB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAogCQkJCSB1MTYgc3RhdHVzX2NvZGUsIGNvbnN0IHU4ICpleHRyYV9pZXMsCiAJCQkJIHNpemVfdCBleHRyYV9pZXNfbGVuKTsKLWludCBtd2lmaWV4X3NlbmRfdGRsc19hY3Rpb25fZnJhbWUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCi0JCQkJIHUxNiBzdGF0dXNfY29kZSwgY29uc3QgdTggKmV4dHJhX2llcywKLQkJCQkgc2l6ZV90IGV4dHJhX2llc19sZW4pOworaW50IG13aWZpZXhfc2VuZF90ZGxzX2FjdGlvbl9mcmFtZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBjb25zdCB1OCAqcGVlciwKKwkJCQkgICB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJCSAgIHUxNiBzdGF0dXNfY29kZSwgY29uc3QgdTggKmV4dHJhX2llcywKKwkJCQkgICBzaXplX3QgZXh0cmFfaWVzX2xlbik7CiB2b2lkIG13aWZpZXhfcHJvY2Vzc190ZGxzX2FjdGlvbl9mcmFtZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCSAgICAgICB1OCAqYnVmLCBpbnQgbGVuKTsKLWludCBtd2lmaWV4X3RkbHNfb3BlcihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqcGVlciwgdTggYWN0aW9uKTsKLWludCBtd2lmaWV4X2dldF90ZGxzX2xpbmtfc3RhdHVzKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICptYWMpOworaW50IG13aWZpZXhfdGRsc19vcGVyKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb24pOworaW50IG13aWZpZXhfZ2V0X3RkbHNfbGlua19zdGF0dXMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYyk7CiB2b2lkIG13aWZpZXhfZGlzYWJsZV9hbGxfdGRsc19saW5rcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KTsKIGJvb2wgbXdpZmlleF9pc19ic3NfaW5fMTFhY19tb2RlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwogdTggbXdpZmlleF9nZXRfY2VudGVyX2ZyZXFfaW5kZXgoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggYmFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKaW5kZXggYTdlOGI5Ni4uNTc0ZDRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKQEAgLTIyMSw5ICsyMjEsNiBAQAogCWlmICghYWRhcHRlciB8fCAhYWRhcHRlci0+cHJpdl9udW0pCiAJCXJldHVybjsKIAotCS8qIEluIGNhc2UgZHJpdmVyIGlzIHJlbW92ZWQgd2hlbiBhc3luY2hyb25vdXMgRlcgbG9hZCBpcyBpbiBwcm9ncmVzcyAqLwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXB0ZXItPmZ3X2xvYWQpOwotCiAJaWYgKHVzZXJfcm1tb2QpIHsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKQEAgLTEwNzQsNiArMTA3MSw3IEBACiAgKiBpcyBtYXBwZWQgdG8gUENJIGRldmljZSBtZW1vcnkuIFR4IHJpbmcgcG9pbnRlcnMgYXJlIGFkdmFuY2VkIGFjY29yZGluZ2x5LgogICogRG93bmxvYWQgcmVhZHkgaW50ZXJydXB0IHRvIEZXIGlzIGRlZmZlcmVkIGlmIFR4IHJpbmcgaXMgbm90IGZ1bGwgYW5kCiAgKiBhZGRpdGlvbmFsIHBheWxvYWQgY2FuIGJlIGFjY29tb2RhdGVkLgorICogQ2FsbGVyIG11c3QgZW5zdXJlIHR4X3BhcmFtIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLgogICovCiBzdGF0aWMgaW50CiBtd2lmaWV4X3BjaWVfc2VuZF9kYXRhKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCmluZGV4IDdiM2FmM2QuLjQ1YzViMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCkBAIC0yOSw5ICsyOSw2IEBACiAjZGVmaW5lIE1XSUZJRVhfTUFYX0NIQU5ORUxTX1BFUl9TUEVDSUZJQ19TQ0FOICAgMTQKIAogI2RlZmluZSBNV0lGSUVYX0RFRl9DSEFOTkVMU19QRVJfU0NBTl9DTUQJNAotI2RlZmluZSBNV0lGSUVYX0xJTUlUXzFfQ0hBTk5FTF9QRVJfU0NBTl9DTUQJMTUKLSNkZWZpbmUgTVdJRklFWF9MSU1JVF8yX0NIQU5ORUxTX1BFUl9TQ0FOX0NNRAkyNwotI2RlZmluZSBNV0lGSUVYX0xJTUlUXzNfQ0hBTk5FTFNfUEVSX1NDQU5fQ01ECTM1CiAKIC8qIE1lbW9yeSBuZWVkZWQgdG8gc3RvcmUgYSBtYXggc2l6ZWQgQ2hhbm5lbCBMaXN0IFRMViBmb3IgYSBmaXJtd2FyZSBzY2FuICovCiAjZGVmaW5lIENIQU5fVExWX01BWF9TSVpFICAoc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlcikgICAgICAgICBcCkBAIC0xMDU1LDIwICsxMDUyLDEwIEBACiAKIAkvKgogCSAqIEluIGFzc29jaWF0ZWQgc3RhdGUgd2Ugd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBjaGFubmVscyBzY2FubmVkIHBlcgotCSAqIHNjYW4gY29tbWFuZCB0byBhdm9pZCBhbnkgdHJhZmZpYyBkZWxheS9sb3NzLiBUaGlzIG51bWJlciBpcyBkZWNpZGVkCi0JICogYmFzZWQgb24gdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIHNjYW5uZWQgZHVlIHRvIGNvbnN0cmFpbnRzCi0JICogb2YgY29tbWFuZCBidWZmZXJzLgorCSAqIHNjYW4gY29tbWFuZCB0byAxIHRvIGF2b2lkIGFueSB0cmFmZmljIGRlbGF5L2xvc3MuCiAJICovCi0JaWYgKHByaXYtPm1lZGlhX2Nvbm5lY3RlZCkgewotCQlpZiAoY2hhbl9udW0gPCBNV0lGSUVYX0xJTUlUXzFfQ0hBTk5FTF9QRVJfU0NBTl9DTUQpCisJaWYgKHByaXYtPm1lZGlhX2Nvbm5lY3RlZCkKIAkJCSptYXhfY2hhbl9wZXJfc2NhbiA9IDE7Ci0JCWVsc2UgaWYgKGNoYW5fbnVtIDwgTVdJRklFWF9MSU1JVF8yX0NIQU5ORUxTX1BFUl9TQ0FOX0NNRCkKLQkJCSptYXhfY2hhbl9wZXJfc2NhbiA9IDI7Ci0JCWVsc2UgaWYgKGNoYW5fbnVtIDwgTVdJRklFWF9MSU1JVF8zX0NIQU5ORUxTX1BFUl9TQ0FOX0NNRCkKLQkJCSptYXhfY2hhbl9wZXJfc2NhbiA9IDM7Ci0JCWVsc2UKLQkJCSptYXhfY2hhbl9wZXJfc2NhbiA9IDQ7Ci0JfQogfQogCiAvKgpAQCAtMTM1MywyMyArMTM0MCwxNyBAQAogCQkJCQkgICAgICBic3NfZW50cnktPmJlYWNvbl9idWYpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfQlNTX0NPRVhfMjA0MDoKLQkJCWJzc19lbnRyeS0+YmNuX2Jzc19jb18yMDQwID0gY3VycmVudF9wdHIgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpOwotCQkJYnNzX2VudHJ5LT5ic3NfY29fMjA0MF9vZmZzZXQgPSAodTE2KSAoY3VycmVudF9wdHIgKwotCQkJCQlzaXplb2Yoc3RydWN0IGllZWVfdHlwZXNfaGVhZGVyKSAtCi0JCQkJCQlic3NfZW50cnktPmJlYWNvbl9idWYpOworCQkJYnNzX2VudHJ5LT5iY25fYnNzX2NvXzIwNDAgPSBjdXJyZW50X3B0cjsKKwkJCWJzc19lbnRyeS0+YnNzX2NvXzIwNDBfb2Zmc2V0ID0KKwkJCQkodTE2KSAoY3VycmVudF9wdHIgLSBic3NfZW50cnktPmJlYWNvbl9idWYpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVhUX0NBUEFCSUxJVFk6Ci0JCQlic3NfZW50cnktPmJjbl9leHRfY2FwID0gY3VycmVudF9wdHIgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpOwotCQkJYnNzX2VudHJ5LT5leHRfY2FwX29mZnNldCA9ICh1MTYpIChjdXJyZW50X3B0ciArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpIC0KLQkJCQkJYnNzX2VudHJ5LT5iZWFjb25fYnVmKTsKKwkJCWJzc19lbnRyeS0+YmNuX2V4dF9jYXAgPSBjdXJyZW50X3B0cjsKKwkJCWJzc19lbnRyeS0+ZXh0X2NhcF9vZmZzZXQgPQorCQkJCSh1MTYpIChjdXJyZW50X3B0ciAtIGJzc19lbnRyeS0+YmVhY29uX2J1Zik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9PUE1PREVfTk9USUY6Ci0JCQlic3NfZW50cnktPm9wZXJfbW9kZSA9Ci0JCQkJKHZvaWQgKikoY3VycmVudF9wdHIgKwotCQkJCQkgc2l6ZW9mKHN0cnVjdCBpZWVlX3R5cGVzX2hlYWRlcikpOworCQkJYnNzX2VudHJ5LT5vcGVyX21vZGUgPSAodm9pZCAqKWN1cnJlbnRfcHRyOwogCQkJYnNzX2VudHJ5LT5vcGVyX21vZGVfb2Zmc2V0ID0KIAkJCQkJKHUxNikoKHU4ICopYnNzX2VudHJ5LT5vcGVyX21vZGUgLQogCQkJCQkgICAgICBic3NfZW50cnktPmJlYWNvbl9idWYpOwpAQCAtMTc1Nyw2ICsxNzM4LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG13aWZpZXhfY29tcGxldGVfc2NhbihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKGFkYXB0ZXItPmN1cnJfY21kLT53YWl0X3FfZW5hYmxlZCkgeworCQlhZGFwdGVyLT5jbWRfd2FpdF9xLnN0YXR1cyA9IDA7CisJCWlmICghcHJpdi0+c2Nhbl9yZXF1ZXN0KSB7CisJCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImNvbXBsZXRlIGludGVybmFsIHNjYW5cbiIpOworCQkJbXdpZmlleF9jb21wbGV0ZV9jbWQoYWRhcHRlciwgYWRhcHRlci0+Y3Vycl9jbWQpOworCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBtd2lmaWV4X2NoZWNrX25leHRfc2Nhbl9jb21tYW5kKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CkBAIC0xNzcwLDE2ICsxNzY0LDkgQEAKIAkJYWRhcHRlci0+c2Nhbl9wcm9jZXNzaW5nID0gZmFsc2U7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm13aWZpZXhfY21kX2xvY2ssIGZsYWdzKTsKIAotCQkvKiBOZWVkIHRvIGluZGljYXRlIElPQ1RMIGNvbXBsZXRlICovCi0JCWlmIChhZGFwdGVyLT5jdXJyX2NtZC0+d2FpdF9xX2VuYWJsZWQpIHsKLQkJCWFkYXB0ZXItPmNtZF93YWl0X3Euc3RhdHVzID0gMDsKLQkJCWlmICghcHJpdi0+c2Nhbl9yZXF1ZXN0KSB7Ci0JCQkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsCi0JCQkJCSJjb21wbGV0ZSBpbnRlcm5hbCBzY2FuXG4iKTsKLQkJCQltd2lmaWV4X2NvbXBsZXRlX2NtZChhZGFwdGVyLAotCQkJCQkJICAgICBhZGFwdGVyLT5jdXJyX2NtZCk7Ci0JCQl9Ci0JCX0KKwkJaWYgKCFhZGFwdGVyLT5leHRfc2NhbikKKwkJCW13aWZpZXhfY29tcGxldGVfc2Nhbihwcml2KTsKKwogCQlpZiAocHJpdi0+cmVwb3J0X3NjYW5fcmVzdWx0KQogCQkJcHJpdi0+cmVwb3J0X3NjYW5fcmVzdWx0ID0gZmFsc2U7CiAKQEAgLTE5ODQsNiArMTk3MSw5IEBACiBpbnQgbXdpZmlleF9yZXRfODAyXzExX3NjYW5fZXh0KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpCiB7CiAJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJpbmZvOiBFWFQgc2NhbiByZXR1cm5zIHN1Y2Nlc3NmdWxseVxuIik7CisKKwltd2lmaWV4X2NvbXBsZXRlX3NjYW4ocHJpdik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYwppbmRleCBkMjA2ZjA0Li40Y2UzZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYwpAQCAtODUsNiArODUsOCBAQAogCQljYXJkLT5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gZGF0YS0+c3VwcG9ydHNfc2Rpb19uZXdfbW9kZTsKIAkJY2FyZC0+aGFzX2NvbnRyb2xfbWFzayA9IGRhdGEtPmhhc19jb250cm9sX21hc2s7CiAJCWNhcmQtPnR4X2J1Zl9zaXplID0gZGF0YS0+dHhfYnVmX3NpemU7CisJCWNhcmQtPm1wX3R4X2FnZ19idWZfc2l6ZSA9IGRhdGEtPm1wX3R4X2FnZ19idWZfc2l6ZTsKKwkJY2FyZC0+bXBfcnhfYWdnX2J1Zl9zaXplID0gZGF0YS0+bXBfcnhfYWdnX2J1Zl9zaXplOwogCX0KIAogCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKQEAgLTE3Nyw5ICsxNzksNiBAQAogCWlmICghYWRhcHRlciB8fCAhYWRhcHRlci0+cHJpdl9udW0pCiAJCXJldHVybjsKIAotCS8qIEluIGNhc2UgZHJpdmVyIGlzIHJlbW92ZWQgd2hlbiBhc3luY2hyb25vdXMgRlcgbG9hZCBpcyBpbiBwcm9ncmVzcyAqLwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXB0ZXItPmZ3X2xvYWQpOwotCiAJaWYgKHVzZXJfcm1tb2QpIHsKIAkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKIAkJCW13aWZpZXhfc2Rpb19yZXN1bWUoYWRhcHRlci0+ZGV2KTsKQEAgLTE2NzksOCArMTY3OCwxMiBAQAogCWlmIChyZXQpIHsKIAkJaWYgKHR5cGUgPT0gTVdJRklFWF9UWVBFX0NNRCkKIAkJCWFkYXB0ZXItPmNtZF9zZW50ID0gZmFsc2U7Ci0JCWlmICh0eXBlID09IE1XSUZJRVhfVFlQRV9EQVRBKQorCQlpZiAodHlwZSA9PSBNV0lGSUVYX1RZUEVfREFUQSkgewogCQkJYWRhcHRlci0+ZGF0YV9zZW50ID0gZmFsc2U7CisJCQkvKiByZXN0b3JlIGN1cnJfd3JfcG9ydCBpbiBlcnJvciBjYXNlcyAqLworCQkJY2FyZC0+Y3Vycl93cl9wb3J0ID0gcG9ydDsKKwkJCWNhcmQtPm1wX3dyX2JpdG1hcCB8PSAodTMyKSgxIDw8IGNhcmQtPmN1cnJfd3JfcG9ydCk7CisJCX0KIAl9IGVsc2UgewogCQlpZiAodHlwZSA9PSBNV0lGSUVYX1RZUEVfREFUQSkgewogCQkJaWYgKCEoY2FyZC0+bXBfd3JfYml0bWFwICYgKDEgPDwgY2FyZC0+Y3Vycl93cl9wb3J0KSkpCkBAIC0xODQyLDggKzE4NDUsOCBAQAogCWNhcmQtPm1wYV9yeC5sZW5fYXJyID0ga3phbGxvYyhzaXplb2YoKmNhcmQtPm1wYV9yeC5sZW5fYXJyKSAqCiAJCQkJICAgICAgIGNhcmQtPm1wX2FnZ19wa3RfbGltaXQsIEdGUF9LRVJORUwpOwogCXJldCA9IG13aWZpZXhfYWxsb2Nfc2Rpb19tcGFfYnVmZmVycyhhZGFwdGVyLAotCQkJCQkgICAgIFNESU9fTVBfVFhfQUdHUl9ERUZfQlVGX1NJWkUsCi0JCQkJCSAgICAgU0RJT19NUF9SWF9BR0dSX0RFRl9CVUZfU0laRSk7CisJCQkJCSAgICAgY2FyZC0+bXBfdHhfYWdnX2J1Zl9zaXplLAorCQkJCQkgICAgIGNhcmQtPm1wX3J4X2FnZ19idWZfc2l6ZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImZhaWxlZCB0byBhbGxvYyBzZGlvIG1wLWEgYnVmZmVyc1xuIik7CiAJCWtmcmVlKGNhcmQtPm1wX3JlZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaAppbmRleCBjNzEyMDFiLi42ZWVhMzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaApAQCAtNjQsMTAgKzY0LDggQEAKICNkZWZpbmUgVVBfTERfQ01EX1BPUlRfSE9TVF9JTlRfU1RBVFVTCSgweDQwVSkKICNkZWZpbmUgRE5fTERfQ01EX1BPUlRfSE9TVF9JTlRfU1RBVFVTCSgweDgwVSkKIAotI2RlZmluZSBTRElPX01QX1RYX0FHR1JfREVGX0JVRl9TSVpFICAgICAgICAoODE5MikJLyogOEsgKi8KLQotLyogTXVsdGkgcG9ydCBSWCBhZ2dyZWdhdGlvbiBidWZmZXIgc2l6ZSAqLwotI2RlZmluZSBTRElPX01QX1JYX0FHR1JfREVGX0JVRl9TSVpFICAgICAgICAoMTYzODQpCS8qIDE2SyAqLworI2RlZmluZSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfMTZLCSgxNjM4NCkKKyNkZWZpbmUgTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySwkoMzI3NjgpCiAKIC8qIE1pc2MuIENvbmZpZyBSZWdpc3RlciA6IEF1dG8gUmUtZW5hYmxlIGludGVycnVwdHMgKi8KICNkZWZpbmUgQVVUT19SRV9FTkFCTEVfSU5UICAgICAgICAgICAgICBCSVQoNCkKQEAgLTIzNCw2ICsyMzIsOCBAQAogCWJvb2wgc3VwcG9ydHNfc2Rpb19uZXdfbW9kZTsKIAlib29sIGhhc19jb250cm9sX21hc2s7CiAJdTE2IHR4X2J1Zl9zaXplOworCXUzMiBtcF90eF9hZ2dfYnVmX3NpemU7CisJdTMyIG1wX3J4X2FnZ19idWZfc2l6ZTsKIAogCXUzMiBtcF9yZF9iaXRtYXA7CiAJdTMyIG1wX3dyX2JpdG1hcDsKQEAgLTI1OCw2ICsyNTgsOCBAQAogCWJvb2wgc3VwcG9ydHNfc2Rpb19uZXdfbW9kZTsKIAlib29sIGhhc19jb250cm9sX21hc2s7CiAJdTE2IHR4X2J1Zl9zaXplOworCXUzMiBtcF90eF9hZ2dfYnVmX3NpemU7CisJdTMyIG1wX3J4X2FnZ19idWZfc2l6ZTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXdpZmlleF9zZGlvX2NhcmRfcmVnIG13aWZpZXhfcmVnX3NkODd4eCA9IHsKQEAgLTMxNSw2ICszMTcsOCBAQAogCS5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gZmFsc2UsCiAJLmhhc19jb250cm9sX21hc2sgPSB0cnVlLAogCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8ySywKKwkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKKwkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXdpZmlleF9zZGlvX2RldmljZSBtd2lmaWV4X3NkaW9fc2Q4Nzg3ID0gewpAQCAtMzI1LDYgKzMyOSw4IEBACiAJLnN1cHBvcnRzX3NkaW9fbmV3X21vZGUgPSBmYWxzZSwKIAkuaGFzX2NvbnRyb2xfbWFzayA9IHRydWUsCiAJLnR4X2J1Zl9zaXplID0gTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzJLLAorCS5tcF90eF9hZ2dfYnVmX3NpemUgPSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfMTZLLAorCS5tcF9yeF9hZ2dfYnVmX3NpemUgPSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfMTZLLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtd2lmaWV4X3NkaW9fZGV2aWNlIG13aWZpZXhfc2Rpb19zZDg3OTcgPSB7CkBAIC0zMzUsNiArMzQxLDggQEAKIAkuc3VwcG9ydHNfc2Rpb19uZXdfbW9kZSA9IGZhbHNlLAogCS5oYXNfY29udHJvbF9tYXNrID0gdHJ1ZSwKIAkudHhfYnVmX3NpemUgPSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMkssCisJLm1wX3R4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCisJLm1wX3J4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG13aWZpZXhfc2Rpb19kZXZpY2UgbXdpZmlleF9zZGlvX3NkODg5NyA9IHsKQEAgLTM0NSw2ICszNTMsOCBAQAogCS5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gdHJ1ZSwKIAkuaGFzX2NvbnRyb2xfbWFzayA9IGZhbHNlLAogCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SywKKwkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKKwkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCmluZGV4IGUzY2FjMTQuLjg4MjAyY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCkBAIC0xNTQ2LDYgKzE1NDYsNyBAQAogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2V4dGNhcCAqZXh0Y2FwOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3ZodGNhcCAqdmh0X2NhcGFiOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2FpZCAqYWlkOworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3RkbHNfaWRsZV90aW1lb3V0ICp0aW1lb3V0OwogCXU4ICpwb3MsIHFvc19pbmZvOwogCXUxNiBjb25maWdfbGVuID0gMDsKIAlzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMgPSBwcml2LT5zdGFfcGFyYW1zOwpAQCAtMTY0Myw2ICsxNjQ0LDEyIEBACiAJCQljb25maWdfbGVuICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19haWQpOwogCQl9CiAKKwkJdGltZW91dCA9ICh2b2lkICopKHBvcyArIGNvbmZpZ19sZW4pOworCQl0aW1lb3V0LT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1RETFNfSURMRV9USU1FT1VUKTsKKwkJdGltZW91dC0+aGVhZGVyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZih0aW1lb3V0LT52YWx1ZSkpOworCQl0aW1lb3V0LT52YWx1ZSA9IGNwdV90b19sZTE2KE1XSUZJRVhfVERMU19JRExFX1RJTUVPVVQpOworCQljb25maWdfbGVuICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc190ZGxzX2lkbGVfdGltZW91dCk7CisKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihwcml2LT5hZGFwdGVyLT5kZXYsICJVbmtub3duIFRETFMgb3BlcmF0aW9uXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYwppbmRleCBiZmViYjAxLi41NzdmMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCkBAIC04NjUsMTQgKzg2NSwyMCBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEFDVF9URExTX0RFTEVURToKLQkJaWYgKHJlYXNvbikKLQkJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LAotCQkJCSJURExTIGxpbmsgZGVsZXRlIGZvciAlcE0gZmFpbGVkOiByZWFzb24gJWRcbiIsCi0JCQkJY21kX3RkbHNfb3Blci0+cGVlcl9tYWMsIHJlYXNvbik7Ci0JCWVsc2UKKwkJaWYgKHJlYXNvbikgeworCQkJaWYgKCFub2RlIHx8IHJlYXNvbiA9PSBURExTX0VSUl9MSU5LX05PTkVYSVNURU5UKQorCQkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAorCQkJCQkiVERMUyBsaW5rIGRlbGV0ZSBmb3IgJXBNIGZhaWxlZDogcmVhc29uICVkXG4iLAorCQkJCQljbWRfdGRsc19vcGVyLT5wZWVyX21hYywgcmVhc29uKTsKKwkJCWVsc2UKKwkJCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCQkJIlRETFMgbGluayBkZWxldGUgZm9yICVwTSBmYWlsZWQ6IHJlYXNvbiAlZFxuIiwKKwkJCQkJY21kX3RkbHNfb3Blci0+cGVlcl9tYWMsIHJlYXNvbik7CisJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKLQkJCQkiVERMUyBsaW5rIGNvbmZpZyBmb3IgJXBNIHN1Y2Nlc3NmdWxcbiIsCisJCQkJIlRETFMgbGluayBkZWxldGUgZm9yICVwTSBzdWNjZXNzZnVsXG4iLAogCQkJCWNtZF90ZGxzX29wZXItPnBlZXJfbWFjKTsKKwkJfQogCQlicmVhazsKIAljYXNlIEFDVF9URExTX0NSRUFURToKIAkJaWYgKHJlYXNvbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMKaW5kZXggMzY4NDUwYy4uZjYzOTVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9ldmVudC5jCkBAIC0xMzQsNiArMTM0LDQ2IEBACiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7CiB9CiAKK3N0YXRpYyBpbnQgbXdpZmlleF9wYXJzZV90ZGxzX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpldmVudF9za2IpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHI7CisJc3RydWN0IG13aWZpZXhfdGRsc19nZW5lcmljX2V2ZW50ICp0ZGxzX2V2dCA9CisJCQkodm9pZCAqKWV2ZW50X3NrYi0+ZGF0YSArIHNpemVvZihhZGFwdGVyLT5ldmVudF9jYXVzZSk7CisKKwkvKiByZXNlcnZlZCAyIGJ5dGVzIGFyZSBub3QgbWFuZGF0b3J5IGluIHRkbHMgZXZlbnQgKi8KKwlpZiAoZXZlbnRfc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X3RkbHNfZ2VuZXJpY19ldmVudCkgLQorCQkJICAgICAgc2l6ZW9mKHUxNikgLSBzaXplb2YoYWRhcHRlci0+ZXZlbnRfY2F1c2UpKSkgeworCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIkludmFsaWQgZXZlbnQgbGVuZ3RoIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdGFfcHRyID0gbXdpZmlleF9nZXRfc3RhX2VudHJ5KHByaXYsIHRkbHNfZXZ0LT5wZWVyX21hYyk7CisJaWYgKCFzdGFfcHRyKSB7CisJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiY2Fubm90IGdldCBzdGEgZW50cnkhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAobGUxNl90b19jcHUodGRsc19ldnQtPnR5cGUpKSB7CisJY2FzZSBURExTX0VWRU5UX0xJTktfVEVBUl9ET1dOOgorCQljZmc4MDIxMV90ZGxzX29wZXJfcmVxdWVzdChwcml2LT5uZXRkZXYsCisJCQkJCSAgIHRkbHNfZXZ0LT5wZWVyX21hYywKKwkJCQkJICAgTkw4MDIxMV9URExTX1RFQVJET1dOLAorCQkJCQkgICBsZTE2X3RvX2NwdSh0ZGxzX2V2dC0+dS5yZWFzb25fY29kZSksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlyZXQgPSBtd2lmaWV4X3RkbHNfb3Blcihwcml2LCB0ZGxzX2V2dC0+cGVlcl9tYWMsCisJCQkJCU1XSUZJRVhfVERMU19ESVNBQkxFX0xJTkspOworCQlxdWV1ZV93b3JrKGFkYXB0ZXItPndvcmtxdWV1ZSwgJmFkYXB0ZXItPm1haW5fd29yayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIGdlbmVyYXRlZCBieSBmaXJtd2FyZS4KICAqCkBAIC00NTksNiArNDk5LDEwIEBACiAJCQlmYWxzZSk7CiAJCWJyZWFrOwogCisJY2FzZSBFVkVOVF9URExTX0dFTkVSSUNfRVZFTlQ6CisJCXJldCA9IG13aWZpZXhfcGFyc2VfdGRsc19ldmVudChwcml2LCBhZGFwdGVyLT5ldmVudF9za2IpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiZXZlbnQ6IHVua25vd24gZXZlbnQgaWQ6ICUjeFxuIiwKIAkJCWV2ZW50Y2F1c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMKaW5kZXggZWQyNjM4Ny4uOGI2MzlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jCkBAIC0xODMsNiArMTgzLDcgQEAKIAlzdHJ1Y3QgcnhfcGFja2V0X2hkciAqcnhfcGt0X2hkcjsKIAl1OCB0YVtFVEhfQUxFTl07CiAJdTE2IHJ4X3BrdF90eXBlLCByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuZ3RoLCBzZXFfbnVtOworCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfcHRyOwogCiAJbG9jYWxfcnhfcGQgPSAoc3RydWN0IHJ4cGQgKikgKHNrYi0+ZGF0YSk7CiAJcnhfcGt0X3R5cGUgPSBsZTE2X3RvX2NwdShsb2NhbF9yeF9wZC0+cnhfcGt0X3R5cGUpOwpAQCAtMjEzLDE0ICsyMTQsMjUgQEAKIAkgKiBJZiB0aGUgcGFja2V0IGlzIG5vdCBhbiB1bmljYXN0IHBhY2tldCB0aGVuIHNlbmQgdGhlIHBhY2tldAogCSAqIGRpcmVjdGx5IHRvIG9zLiBEb24ndCBwYXNzIHRocnUgcnggcmVvcmRlcmluZwogCSAqLwotCWlmICghSVNfMTFOX0VOQUJMRUQocHJpdikgfHwKKwlpZiAoKCFJU18xMU5fRU5BQkxFRChwcml2KSAmJgorCSAgICAgIShJU1NVUFBfVERMU19FTkFCTEVEKHByaXYtPmFkYXB0ZXItPmZ3X2NhcF9pbmZvKSAmJgorCSAgICAgICAhKGxvY2FsX3J4X3BkLT5mbGFncyAmIE1XSUZJRVhfUlhQRF9GTEFHU19URExTX1BBQ0tFVCkpKSB8fAogCSAgICAhZXRoZXJfYWRkcl9lcXVhbF91bmFsaWduZWQocHJpdi0+Y3Vycl9hZGRyLCByeF9wa3RfaGRyLT5ldGg4MDNfaGRyLmhfZGVzdCkpIHsKIAkJbXdpZmlleF9wcm9jZXNzX3J4X3BhY2tldChwcml2LCBza2IpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChtd2lmaWV4X3F1ZXVpbmdfcmFfYmFzZWQocHJpdikpIHsKKwlpZiAobXdpZmlleF9xdWV1aW5nX3JhX2Jhc2VkKHByaXYpIHx8CisJICAgIChJU1NVUFBfVERMU19FTkFCTEVEKHByaXYtPmFkYXB0ZXItPmZ3X2NhcF9pbmZvKSAmJgorCSAgICAgbG9jYWxfcnhfcGQtPmZsYWdzICYgTVdJRklFWF9SWFBEX0ZMQUdTX1RETFNfUEFDS0VUKSkgewogCQltZW1jcHkodGEsIHJ4X3BrdF9oZHItPmV0aDgwM19oZHIuaF9zb3VyY2UsIEVUSF9BTEVOKTsKKwkJaWYgKGxvY2FsX3J4X3BkLT5mbGFncyAmIE1XSUZJRVhfUlhQRF9GTEFHU19URExTX1BBQ0tFVCAmJgorCQkgICAgbG9jYWxfcnhfcGQtPnByaW9yaXR5IDwgTUFYX05VTV9USUQpIHsKKwkJCXN0YV9wdHIgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgdGEpOworCQkJaWYgKHN0YV9wdHIpCisJCQkJc3RhX3B0ci0+cnhfc2VxW2xvY2FsX3J4X3BkLT5wcmlvcml0eV0gPQorCQkJCQkgICAgICBsZTE2X3RvX2NwdShsb2NhbF9yeF9wZC0+c2VxX251bSk7CisJCX0KIAl9IGVsc2UgewogCQlpZiAocnhfcGt0X3R5cGUgIT0gUEtUX1RZUEVfQkFSKQogCQkJcHJpdi0+cnhfc2VxW2xvY2FsX3J4X3BkLT5wcmlvcml0eV0gPSBzZXFfbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3R4LmMKaW5kZXggMTIzNmE1ZC4uNWZjZTdlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV90eC5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKIAlzdHJ1Y3QgdHhwZCAqbG9jYWxfdHhfcGQ7CisJc3RydWN0IG13aWZpZXhfdHhfcGFyYW0gdHhfcGFyYW07CiAvKiBzaXplb2Yoc3RydWN0IHR4cGQpICsgSW50ZXJmYWNlIHNwZWNpZmljIGhlYWRlciAqLwogI2RlZmluZSBOVUxMX1BBQ0tFVF9IRFIgNjQKIAl1MzIgZGF0YV9sZW4gPSBOVUxMX1BBQ0tFVF9IRFI7CkBAIC0xNjgsOCArMTY5LDkgQEAKIAkJCQkJCSAgIHNrYiwgTlVMTCk7CiAJfSBlbHNlIHsKIAkJc2tiX3B1c2goc2tiLCBJTlRGX0hFQURFUl9MRU4pOworCQl0eF9wYXJhbS5uZXh0X3BrdF9sZW4gPSAwOwogCQlyZXQgPSBhZGFwdGVyLT5pZl9vcHMuaG9zdF90b19jYXJkKGFkYXB0ZXIsIE1XSUZJRVhfVFlQRV9EQVRBLAotCQkJCQkJICAgc2tiLCBOVUxMKTsKKwkJCQkJCSAgIHNrYiwgJnR4X3BhcmFtKTsKIAl9CiAJc3dpdGNoIChyZXQpIHsKIAljYXNlIC1FQlVTWToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdGRscy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90ZGxzLmMKaW5kZXggOTc2NjJhMS4uZTczMDM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90ZGxzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90ZGxzLmMKQEAgLTI1LDggKzI1LDggQEAKICNkZWZpbmUgVERMU19SRVNQX0ZJWF9MRU4gICAgIDgKICNkZWZpbmUgVERMU19DT05GSVJNX0ZJWF9MRU4gIDYKIAotc3RhdGljIHZvaWQKLW13aWZpZXhfcmVzdG9yZV90ZGxzX3BhY2tldHMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKm1hYywgdTggc3RhdHVzKQorc3RhdGljIHZvaWQgbXdpZmlleF9yZXN0b3JlX3RkbHNfcGFja2V0cyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCQkgY29uc3QgdTggKm1hYywgdTggc3RhdHVzKQogewogCXN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICpyYV9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRpZF9saXN0OwpAQCAtODQsNyArODQsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgbXdpZmlleF9ob2xkX3RkbHNfcGFja2V0cyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqbWFjKQorc3RhdGljIHZvaWQgbXdpZmlleF9ob2xkX3RkbHNfcGFja2V0cyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCSAgICAgIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnJhX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCAqcmFfbGlzdF9oZWFkOwpAQCAtMTg1LDggKzE4Niw1MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50Cittd2lmaWV4X3RkbHNfYWRkX2h0X29wZXIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYywKKwkJCSB1OCB2aHRfZW5hYmxlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqaHRfb3BlcjsKKwlzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqc3RhX3B0cjsKKwlzdHJ1Y3QgbXdpZmlleF9ic3NkZXNjcmlwdG9yICpic3NfZGVzYyA9CisJCQkJCSZwcml2LT5jdXJyX2Jzc19wYXJhbXMuYnNzX2Rlc2NyaXB0b3I7CisJdTggKnBvczsKKworCXN0YV9wdHIgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgbWFjKTsKKwlpZiAodW5saWtlbHkoIXN0YV9wdHIpKSB7CisJCWRldl93YXJuKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCSAiVERMUyBwZWVyIHN0YXRpb24gbm90IGZvdW5kIGluIGxpc3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcG9zID0gKHZvaWQgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uKSArIDIpOworCSpwb3MrKyA9IFdMQU5fRUlEX0hUX09QRVJBVElPTjsKKwkqcG9zKysgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24pOworCWh0X29wZXIgPSAodm9pZCAqKXBvczsKKworCWh0X29wZXItPnByaW1hcnlfY2hhbiA9IGJzc19kZXNjLT5jaGFubmVsOworCisJLyogZm9sbG93IEFQJ3MgY2hhbm5lbCBiYW5kd2lkdGggKi8KKwlpZiAoSVNTVVBQX0NIQU5XSURUSDQwKHByaXYtPmFkYXB0ZXItPmh3X2RvdF8xMW5fZGV2X2NhcCkgJiYKKwkgICAgYnNzX2Rlc2MtPmJjbl9odF9jYXAgJiYKKwkgICAgSVNBTExPV0VEX0NIQU5XSURUSDQwKGJzc19kZXNjLT5iY25faHRfb3Blci0+aHRfcGFyYW0pKQorCQlodF9vcGVyLT5odF9wYXJhbSA9IGJzc19kZXNjLT5iY25faHRfb3Blci0+aHRfcGFyYW07CisKKwlpZiAodmh0X2VuYWJsZWQpIHsKKwkJaHRfb3Blci0+aHRfcGFyYW0gPQorCQkJICBtd2lmaWV4X2dldF9zZWNfY2hhbl9vZmZzZXQoYnNzX2Rlc2MtPmNoYW5uZWwpOworCQlodF9vcGVyLT5odF9wYXJhbSB8PSBCSVQoMik7CisJfQorCisJbWVtY3B5KCZzdGFfcHRyLT50ZGxzX2NhcC5odF9vcGVyLCBodF9vcGVyLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24pKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG13aWZpZXhfdGRsc19hZGRfdmh0X29wZXIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgICAgIHU4ICptYWMsIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtd2lmaWV4X2Jzc2Rlc2NyaXB0b3IgKmJzc19kZXNjOwogCXN0cnVjdCBpZWVlODAyMTFfdmh0X29wZXJhdGlvbiAqdmh0X29wZXI7CkBAIC0zMjUsOCArMzY4LDkgQEAKIH0KIAogc3RhdGljIGludCBtd2lmaWV4X3ByZXBfdGRsc19lbmNhcF9kYXRhKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCi0JCQkgICAgIHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAotCQkJICAgICB1MTYgc3RhdHVzX2NvZGUsIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJCWNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwKKwkJCQkJdTggZGlhbG9nX3Rva2VuLAorCQkJCQl1MTYgc3RhdHVzX2NvZGUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90ZGxzX2RhdGEgKnRmOwogCWludCByZXQ7CkBAIC00MjgsNiArNDcyLDE3IEBACiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQorCQkJcmV0ID0gbXdpZmlleF90ZGxzX2FkZF9odF9vcGVyKHByaXYsIHBlZXIsIDEsIHNrYik7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gbXdpZmlleF90ZGxzX2FkZF9odF9vcGVyKHByaXYsIHBlZXIsIDAsIHNrYik7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC00NTMsNyArNTA4LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW13aWZpZXhfdGRsc19hZGRfbGlua19pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqc3JjX2FkZHIsIHU4ICpwZWVyLCB1OCAqYnNzaWQpCittd2lmaWV4X3RkbHNfYWRkX2xpbmtfaWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgdTggKnNyY19hZGRyLAorCQkJIGNvbnN0IHU4ICpwZWVyLCBjb25zdCB1OCAqYnNzaWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90ZGxzX2xua2llICpsbmtpZDsKIApAQCAtNDY3LDggKzUyMyw4IEBACiAJbWVtY3B5KGxua2lkLT5yZXNwX3N0YSwgcGVlciwgRVRIX0FMRU4pOwogfQogCi1pbnQgbXdpZmlleF9zZW5kX3RkbHNfZGF0YV9mcmFtZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCSB1OCAqcGVlciwgdTggYWN0aW9uX2NvZGUsIHU4IGRpYWxvZ190b2tlbiwKK2ludCBtd2lmaWV4X3NlbmRfdGRsc19kYXRhX2ZyYW1lKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyLAorCQkJCSB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAogCQkJCSB1MTYgc3RhdHVzX2NvZGUsIGNvbnN0IHU4ICpleHRyYV9pZXMsCiAJCQkJIHNpemVfdCBleHRyYV9pZXNfbGVuKQogewpAQCAtNTYwLDcgKzYxNiw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW13aWZpZXhfY29uc3RydWN0X3RkbHNfYWN0aW9uX2ZyYW1lKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICpwZWVyLAorbXdpZmlleF9jb25zdHJ1Y3RfdGRsc19hY3Rpb25fZnJhbWUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgY29uc3QgdTggKnBlZXIsCiAJCQkJICAgIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCiAJCQkJICAgIHUxNiBzdGF0dXNfY29kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTYzOCwxMCArNjk1LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtd2lmaWV4X3NlbmRfdGRsc19hY3Rpb25fZnJhbWUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCi0JCQkJIHUxNiBzdGF0dXNfY29kZSwgY29uc3QgdTggKmV4dHJhX2llcywKLQkJCQkgc2l6ZV90IGV4dHJhX2llc19sZW4pCitpbnQgbXdpZmlleF9zZW5kX3RkbHNfYWN0aW9uX2ZyYW1lKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyLAorCQkJCSAgIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCisJCQkJICAgdTE2IHN0YXR1c19jb2RlLCBjb25zdCB1OCAqZXh0cmFfaWVzLAorCQkJCSAgIHNpemVfdCBleHRyYV9pZXNfbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG13aWZpZXhfdHhpbmZvICp0eF9pbmZvOwpAQCAtODQ4LDcgKzkwNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW13aWZpZXhfdGRsc19wcm9jZXNzX2NvbmZpZ19saW5rKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICpwZWVyKQorbXdpZmlleF90ZGxzX3Byb2Nlc3NfY29uZmlnX2xpbmsoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKnBlZXIpCiB7CiAJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHI7CiAJc3RydWN0IG13aWZpZXhfZHNfdGRsc19vcGVyIHRkbHNfb3BlcjsKQEAgLTg2OSw3ICs5MjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1td2lmaWV4X3RkbHNfcHJvY2Vzc19jcmVhdGVfbGluayhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqcGVlcikKK213aWZpZXhfdGRsc19wcm9jZXNzX2NyZWF0ZV9saW5rKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyKQogewogCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfcHRyOwogCXN0cnVjdCBtd2lmaWV4X2RzX3RkbHNfb3BlciB0ZGxzX29wZXI7CkBAIC04OTYsNyArOTUzLDcgQEAKIH0KIAogc3RhdGljIGludAotbXdpZmlleF90ZGxzX3Byb2Nlc3NfZGlzYWJsZV9saW5rKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICpwZWVyKQorbXdpZmlleF90ZGxzX3Byb2Nlc3NfZGlzYWJsZV9saW5rKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpwZWVyKQogewogCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfcHRyOwogCXN0cnVjdCBtd2lmaWV4X2RzX3RkbHNfb3BlciB0ZGxzX29wZXI7CkBAIC05MjUsNyArOTgyLDcgQEAKIH0KIAogc3RhdGljIGludAotbXdpZmlleF90ZGxzX3Byb2Nlc3NfZW5hYmxlX2xpbmsoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnBlZXIpCittd2lmaWV4X3RkbHNfcHJvY2Vzc19lbmFibGVfbGluayhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBjb25zdCB1OCAqcGVlcikKIHsKIAlzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqc3RhX3B0cjsKIAlzdHJ1Y3QgaWVlZTgwMjExX21jc19pbmZvIG1jczsKQEAgLTk4Miw3ICsxMDM5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG13aWZpZXhfdGRsc19vcGVyKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICpwZWVyLCB1OCBhY3Rpb24pCitpbnQgbXdpZmlleF90ZGxzX29wZXIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKnBlZXIsIHU4IGFjdGlvbikKIHsKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgTVdJRklFWF9URExTX0VOQUJMRV9MSU5LOgpAQCAtOTk3LDcgKzEwNTQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbXdpZmlleF9nZXRfdGRsc19saW5rX3N0YXR1cyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqbWFjKQoraW50IG13aWZpZXhfZ2V0X3RkbHNfbGlua19zdGF0dXMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYykKIHsKIAlzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqc3RhX3B0cjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91YXBfY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VhcF9jbWQuYwppbmRleCA5YmU2NTQ0Li4zMjY0MzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VhcF9jbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VhcF9jbWQuYwpAQCAtMTc1LDE3ICsxNzUsMTkgQEAKIAkJc3dpdGNoIChHRVRfUlhTVEJDKGNhcF9pbmZvKSkgewogCQljYXNlIE1XSUZJRVhfUlhfU1RCQzE6CiAJCQkvKiBIVF9DQVAgMVgxIG1vZGUgKi8KLQkJCW1lbXNldCgmYnNzX2NmZy0+aHRfY2FwLm1jcywgMHhmZiwgMSk7CisJCQlic3NfY2ZnLT5odF9jYXAubWNzLnJ4X21hc2tbMF0gPSAweGZmOwogCQkJYnJlYWs7CiAJCWNhc2UgTVdJRklFWF9SWF9TVEJDMTI6CS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE1XSUZJRVhfUlhfU1RCQzEyMzoKIAkJCS8qIEhUX0NBUCAyWDIgbW9kZSAqLwotCQkJbWVtc2V0KCZic3NfY2ZnLT5odF9jYXAubWNzLCAweGZmLCAyKTsKKwkJCWJzc19jZmctPmh0X2NhcC5tY3MucnhfbWFza1swXSA9IDB4ZmY7CisJCQlic3NfY2ZnLT5odF9jYXAubWNzLnJ4X21hc2tbMV0gPSAweGZmOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfd2Fybihwcml2LT5hZGFwdGVyLT5kZXYsCiAJCQkJICJVbnN1cHBvcnRlZCBSWC1TVEJDLCBkZWZhdWx0IHRvIDJ4MlxuIik7Ci0JCQltZW1zZXQoJmJzc19jZmctPmh0X2NhcC5tY3MsIDB4ZmYsIDIpOworCQkJYnNzX2NmZy0+aHRfY2FwLm1jcy5yeF9tYXNrWzBdID0gMHhmZjsKKwkJCWJzc19jZmctPmh0X2NhcC5tY3MucnhfbWFza1sxXSA9IDB4ZmY7CiAJCQlicmVhazsKIAkJfQogCQlwcml2LT5hcF8xMW5fZW5hYmxlZCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91c2IuYwppbmRleCBlZGJlNGFmLi5hOGNlODEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdXNiLmMKQEAgLTIyLDkgKzIyLDkgQEAKIAogI2RlZmluZSBVU0JfVkVSU0lPTgkiMS4wIgogCitzdGF0aWMgdTggdXNlcl9ybW1vZDsKIHN0YXRpYyBzdHJ1Y3QgbXdpZmlleF9pZl9vcHMgdXNiX29wczsKIHN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIGFkZF9yZW1vdmVfY2FyZF9zZW07Ci1zdGF0aWMgc3RydWN0IHVzYl9jYXJkX3JlYyAqdXNiX2NhcmQ7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtd2lmaWV4X3VzYl90YWJsZVtdID0gewogCS8qIDg3OTcgKi8KQEAgLTUzMiwyOCArNTMyLDM4IEBACiBzdGF0aWMgdm9pZCBtd2lmaWV4X3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXI7CiAKLQlpZiAoIWNhcmQpIHsKLQkJcHJfZXJyKCIlczogY2FyZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFjYXJkIHx8ICFjYXJkLT5hZGFwdGVyKSB7CisJCXByX2VycigiJXM6IGNhcmQgb3IgY2FyZC0+YWRhcHRlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKKwlhZGFwdGVyID0gY2FyZC0+YWRhcHRlcjsKKwlpZiAoIWFkYXB0ZXItPnByaXZfbnVtKQorCQlyZXR1cm47CisKKwlpZiAodXNlcl9ybW1vZCkgeworI2lmZGVmIENPTkZJR19QTQorCQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQorCQkJbXdpZmlleF91c2JfcmVzdW1lKGludGYpOworI2VuZGlmCisKKwkJbXdpZmlleF9kZWF1dGhlbnRpY2F0ZV9hbGwoYWRhcHRlcik7CisKKwkJbXdpZmlleF9pbml0X3NodXRkb3duX2Z3KG13aWZpZXhfZ2V0X3ByaXYoYWRhcHRlciwKKwkJCQkJCQkgIE1XSUZJRVhfQlNTX1JPTEVfQU5ZKSwKKwkJCQkJIE1XSUZJRVhfRlVOQ19TSFVURE9XTik7CisJfQorCiAJbXdpZmlleF91c2JfZnJlZShjYXJkKTsKIAotCWlmIChjYXJkLT5hZGFwdGVyKSB7Ci0JCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBjYXJkLT5hZGFwdGVyOwotCi0JCWlmICghYWRhcHRlci0+cHJpdl9udW0pCi0JCQlyZXR1cm47Ci0KLQkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICIlczogcmVtb3ZpbmcgY2FyZFxuIiwgX19mdW5jX18pOwotCQltd2lmaWV4X3JlbW92ZV9jYXJkKGFkYXB0ZXIsICZhZGRfcmVtb3ZlX2NhcmRfc2VtKTsKLQl9CisJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICIlczogcmVtb3ZpbmcgY2FyZFxuIiwgX19mdW5jX18pOworCW13aWZpZXhfcmVtb3ZlX2NhcmQoYWRhcHRlciwgJmFkZF9yZW1vdmVfY2FyZF9zZW0pOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKIAlrZnJlZShjYXJkKTsKLQl1c2JfY2FyZCA9IE5VTEw7CiAKIAlyZXR1cm47CiB9CkBAIC01NjUsNiArNTc1LDcgQEAKIAkuaWRfdGFibGUgPSBtd2lmaWV4X3VzYl90YWJsZSwKIAkuc3VzcGVuZCA9IG13aWZpZXhfdXNiX3N1c3BlbmQsCiAJLnJlc3VtZSA9IG13aWZpZXhfdXNiX3Jlc3VtZSwKKwkuc29mdF91bmJpbmQgPSAxLAogfTsKIAogc3RhdGljIGludCBtd2lmaWV4X3VzYl90eF9pbml0KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC03NjIsNyArNzczLDYgQEAKIAogCWNhcmQtPmFkYXB0ZXIgPSBhZGFwdGVyOwogCWFkYXB0ZXItPmRldiA9ICZjYXJkLT51ZGV2LT5kZXY7Ci0JdXNiX2NhcmQgPSBjYXJkOwogCiAJc3dpdGNoIChsZTE2X3RvX2NwdShjYXJkLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKIAljYXNlIFVTQjg4OTdfUElEXzE6CkBAIC0xMDI1LDI1ICsxMDM1LDggQEAKIAlpZiAoIWRvd25faW50ZXJydXB0aWJsZSgmYWRkX3JlbW92ZV9jYXJkX3NlbSkpCiAJCXVwKCZhZGRfcmVtb3ZlX2NhcmRfc2VtKTsKIAotCWlmICh1c2JfY2FyZCAmJiB1c2JfY2FyZC0+YWRhcHRlcikgewotCQlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gdXNiX2NhcmQtPmFkYXB0ZXI7Ci0KLQkJLyogSW4gY2FzZSBkcml2ZXIgaXMgcmVtb3ZlZCB3aGVuIGFzeW5jaHJvbm91cyBGVyBkb3dubG9hZGluZyBpcwotCQkgKiBpbiBwcm9ncmVzcwotCQkgKi8KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmYWRhcHRlci0+ZndfbG9hZCk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKLQkJCW13aWZpZXhfdXNiX3Jlc3VtZSh1c2JfY2FyZC0+aW50Zik7Ci0jZW5kaWYKLQotCQltd2lmaWV4X2RlYXV0aGVudGljYXRlX2FsbChhZGFwdGVyKTsKLQotCQltd2lmaWV4X2luaXRfc2h1dGRvd25fZncobXdpZmlleF9nZXRfcHJpdihhZGFwdGVyLAotCQkJCQkJCSAgTVdJRklFWF9CU1NfUk9MRV9BTlkpLAotCQkJCQkgTVdJRklFWF9GVU5DX1NIVVRET1dOKTsKLQl9CisJLyogc2V0IHRoZSBmbGFnIGFzIHVzZXIgaXMgcmVtb3ZpbmcgdGhpcyBtb2R1bGUgKi8KKwl1c2VyX3JtbW9kID0gMTsKIAogCXVzYl9kZXJlZ2lzdGVyKCZtd2lmaWV4X3VzYl9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91dGlsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3V0aWwuYwppbmRleCBjMzgyNGUzLi42ZGE1YWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3V0aWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3V0aWwuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAgKiBOVUxMIGlzIHJldHVybmVkIGlmIHN0YXRpb24gZW50cnkgaXMgbm90IGZvdW5kIGluIGFzc29jaWF0ZWQgU1RBIGxpc3QuCiAgKi8KIHN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICoKLW13aWZpZXhfZ2V0X3N0YV9lbnRyeShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqbWFjKQorbXdpZmlleF9nZXRfc3RhX2VudHJ5KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKm5vZGU7CiAKQEAgLTI4MCw3ICsyODAsNyBAQAogICogSWYgcmVjZWl2ZWQgbWFjIGFkZHJlc3MgaXMgTlVMTCwgTlVMTCBpcyByZXR1cm5lZC4KICAqLwogc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKgotbXdpZmlleF9hZGRfc3RhX2VudHJ5KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICptYWMpCittd2lmaWV4X2FkZF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYykKIHsKIAlzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzMyLDcgKzMzMiw3IEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgYSBzdGF0aW9uIGVudHJ5IGZyb20gc3RhdGlvbiBsaXN0ICovCi12b2lkIG13aWZpZXhfZGVsX3N0YV9lbnRyeShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCAqbWFjKQordm9pZCBtd2lmaWV4X2RlbF9zdGFfZW50cnkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdTggKm1hYykKIHsKIAlzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmMKaW5kZXggMGE3Y2M3NC4uZDM2NzFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5jCkBAIC05Miw3ICs5Miw3IEBACiAgKiBUaGUgZnVuY3Rpb24gYWxzbyBpbml0aWFsaXplcyB0aGUgbGlzdCB3aXRoIHRoZSBwcm92aWRlZCBSQS4KICAqLwogc3RhdGljIHN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICoKLW13aWZpZXhfd21tX2FsbG9jYXRlX3JhbGlzdF9ub2RlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpyYSkKK213aWZpZXhfd21tX2FsbG9jYXRlX3JhbGlzdF9ub2RlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpyYSkKIHsKIAlzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqcmFfbGlzdDsKIApAQCAtMTM5LDggKzEzOSw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgYWRkcyBhIFJBIGxpc3QgZm9yIGFsbCBUSURzCiAgKiB3aXRoIHRoZSBnaXZlbiBSQS4KICAqLwotdm9pZAotbXdpZmlleF9yYWxpc3RfYWRkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICpyYSkKK3ZvaWQgbXdpZmlleF9yYWxpc3RfYWRkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpyYSkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqcmFfbGlzdDsKQEAgLTE2NCw2ICsxNjMsNyBAQAogCQlpZiAoIW13aWZpZXhfcXVldWluZ19yYV9iYXNlZChwcml2KSkgewogCQkJaWYgKG13aWZpZXhfZ2V0X3RkbHNfbGlua19zdGF0dXMocHJpdiwgcmEpID09CiAJCQkgICAgVERMU19TRVRVUF9DT01QTEVURSkgeworCQkJCXJhX2xpc3QtPnRkbHNfbGluayA9IHRydWU7CiAJCQkJcmFfbGlzdC0+aXNfMTFuX2VuYWJsZWQgPQogCQkJCQltd2lmaWV4X3RkbHNfcGVlcl8xMW5fZW5hYmxlZChwcml2LCByYSk7CiAJCQl9IGVsc2UgewpAQCAtNDI2LDE1ICs0MjYsNiBAQAogCQkJCQkJCXByaXYtPnRvc190b190aWRfaW52W2ldOwogCQl9CiAKLQkJcHJpdi0+YWdncl9wcmlvX3RibFs2XS5hbXNkdQotCQkJCQk9IHByaXYtPmFnZ3JfcHJpb190YmxbNl0uYW1wZHVfYXAKLQkJCQkJPSBwcml2LT5hZ2dyX3ByaW9fdGJsWzZdLmFtcGR1X3VzZXIKLQkJCQkJPSBCQV9TVFJFQU1fTk9UX0FMTE9XRUQ7Ci0KLQkJcHJpdi0+YWdncl9wcmlvX3RibFs3XS5hbXNkdSA9IHByaXYtPmFnZ3JfcHJpb190YmxbN10uYW1wZHVfYXAKLQkJCQkJPSBwcml2LT5hZ2dyX3ByaW9fdGJsWzddLmFtcGR1X3VzZXIKLQkJCQkJPSBCQV9TVFJFQU1fTk9UX0FMTE9XRUQ7Ci0KIAkJbXdpZmlleF9zZXRfYmFfcGFyYW1zKHByaXYpOwogCQltd2lmaWV4X3Jlc2V0XzExbl9yeF9zZXFfbnVtKHByaXYpOwogCkBAIC01NzUsNyArNTY2LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICoKIG13aWZpZXhfd21tX2dldF9yYWxpc3Rfbm9kZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCB0aWQsCi0JCQkgICAgdTggKnJhX2FkZHIpCisJCQkgICAgY29uc3QgdTggKnJhX2FkZHIpCiB7CiAJc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnJhX2xpc3Q7CiAKQEAgLTU5Niw3ICs1ODcsOCBAQAogICogcmV0cmlldmVkLgogICovCiBzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqCi1td2lmaWV4X3dtbV9nZXRfcXVldWVfcmFwdHIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggdGlkLCB1OCAqcmFfYWRkcikKK213aWZpZXhfd21tX2dldF9xdWV1ZV9yYXB0cihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCB0aWQsCisJCQkgICAgY29uc3QgdTggKnJhX2FkZHIpCiB7CiAJc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnJhX2xpc3Q7CiAKQEAgLTY1Nyw3ICs2NDksNyBAQAogCQlpZiAobnRvaHMoZXRoX2hkci0+aF9wcm90bykgPT0gRVRIX1BfVERMUykKIAkJCWRldl9kYmcoYWRhcHRlci0+ZGV2LAogCQkJCSJURExTIHNldHVwIHBhY2tldCBmb3IgJXBNLiBEb24ndCBibG9ja1xuIiwgcmEpOwotCQllbHNlCisJCWVsc2UgaWYgKG1lbWNtcChwcml2LT5jZmdfYnNzaWQsIHJhLCBFVEhfQUxFTikpCiAJCQl0ZGxzX3N0YXR1cyA9IG13aWZpZXhfZ2V0X3RkbHNfbGlua19zdGF0dXMocHJpdiwgcmEpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmgKaW5kZXggODNlNDIwOC4uZWNhNTZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5oCkBAIC05OSw3ICs5OSw3IEBACiAKIHZvaWQgbXdpZmlleF93bW1fYWRkX2J1Zl90eHF1ZXVlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBtd2lmaWV4X3JhbGlzdF9hZGQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnJhKTsKK3ZvaWQgbXdpZmlleF9yYWxpc3RfYWRkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIGNvbnN0IHU4ICpyYSk7CiB2b2lkIG13aWZpZXhfcm90YXRlX3ByaW9saXN0cyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgICAgc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnJhLCBpbnQgdGlkKTsKIApAQCAtMTIzLDcgKzEyMyw4IEBACiBpbnQgbXdpZmlleF9yZXRfd21tX2dldF9zdGF0dXMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCk7CiBzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqCi1td2lmaWV4X3dtbV9nZXRfcXVldWVfcmFwdHIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggdGlkLCB1OCAqcmFfYWRkcik7Cittd2lmaWV4X3dtbV9nZXRfcXVldWVfcmFwdHIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggdGlkLAorCQkJICAgIGNvbnN0IHU4ICpyYV9hZGRyKTsKIHU4IG13aWZpZXhfd21tX2Rvd25ncmFkZV90aWQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTMyIHRpZCk7CiAKICNlbmRpZiAvKiAhX01XSUZJRVhfV01NX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmMKaW5kZXggNDkzMDBkMC4uZTI3ZTMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuYwpAQCAtOTg4LDggKzk4OCw4IEBACiAgKiB0c2MgbXVzdCBiZSBOVUxMIG9yIHVwIHRvIDggYnl0ZXMKICAqLwogaW50IF9fb3Jpbm9jb19od19zZXRfdGtpcF9rZXkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGtleV9pZHgsCi0JCQkgICAgICBpbnQgc2V0X3R4LCB1OCAqa2V5LCB1OCAqcnNjLCBzaXplX3QgcnNjX2xlbiwKLQkJCSAgICAgIHU4ICp0c2MsIHNpemVfdCB0c2NfbGVuKQorCQkJICAgICAgaW50IHNldF90eCwgY29uc3QgdTggKmtleSwgY29uc3QgdTggKnJzYywKKwkJCSAgICAgIHNpemVfdCByc2NfbGVuLCBjb25zdCB1OCAqdHNjLCBzaXplX3QgdHNjX2xlbikKIHsKIAlzdHJ1Y3QgewogCQlfX2xlMTYgaWR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5oCmluZGV4IDhmNjgzMWYuLjQ2NmQxZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmgKQEAgLTM4LDggKzM4LDggQEAKIGludCBfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KTsKIGludCBfX29yaW5vY29faHdfc2V0dXBfZW5jKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpOwogaW50IF9fb3Jpbm9jb19od19zZXRfdGtpcF9rZXkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGtleV9pZHgsCi0JCQkgICAgICBpbnQgc2V0X3R4LCB1OCAqa2V5LCB1OCAqcnNjLCBzaXplX3QgcnNjX2xlbiwKLQkJCSAgICAgIHU4ICp0c2MsIHNpemVfdCB0c2NfbGVuKTsKKwkJCSAgICAgIGludCBzZXRfdHgsIGNvbnN0IHU4ICprZXksIGNvbnN0IHU4ICpyc2MsCisJCQkgICAgICBzaXplX3QgcnNjX2xlbiwgY29uc3QgdTggKnRzYywgc2l6ZV90IHRzY19sZW4pOwogaW50IG9yaW5vY29fY2xlYXJfdGtpcF9rZXkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGtleV9pZHgpOwogaW50IF9fb3Jpbm9jb19od19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb191c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb191c2IuYwppbmRleCAzYWM3MTMzLi5jOTA5MzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3VzYi5jCkBAIC0xNjczLDcgKzE2NzMsNyBAQAogCQlmaXJtd2FyZS5jb2RlID0gZndfZW50cnktPmRhdGE7CiAJfQogCWlmIChmaXJtd2FyZS5zaXplICYmIGZpcm13YXJlLmNvZGUpIHsKLQkJaWYgKGV6dXNiX2Zpcm13YXJlX2Rvd25sb2FkKHVwcml2LCAmZmlybXdhcmUpKQorCQlpZiAoZXp1c2JfZmlybXdhcmVfZG93bmxvYWQodXByaXYsICZmaXJtd2FyZSkgPCAwKQogCQkJZ290byBlcnJvcjsKIAl9IGVsc2UgewogCQllcnIoIk5vIGZpcm13YXJlIHRvIGRvd25sb2FkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vd2V4dC5jCmluZGV4IGI3YTg2N2IuLjZhYmRhZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vd2V4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vd2V4dC5jCkBAIC01Miw5ICs1Miw5IEBACiAJcHJpdi0+a2V5c1tpbmRleF0uc2VxX2xlbiA9IHNlcV9sZW47CiAKIAlpZiAoa2V5X2xlbikKLQkJbWVtY3B5KHByaXYtPmtleXNbaW5kZXhdLmtleSwga2V5LCBrZXlfbGVuKTsKKwkJbWVtY3B5KCh2b2lkICopcHJpdi0+a2V5c1tpbmRleF0ua2V5LCBrZXksIGtleV9sZW4pOwogCWlmIChzZXFfbGVuKQotCQltZW1jcHkocHJpdi0+a2V5c1tpbmRleF0uc2VxLCBzZXEsIHNlcV9sZW4pOworCQltZW1jcHkoKHZvaWQgKilwcml2LT5rZXlzW2luZGV4XS5zZXEsIHNlcSwgc2VxX2xlbik7CiAKIAlzd2l0Y2ggKGFsZykgewogCWNhc2UgT1JJTk9DT19BTEdfVEtJUDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCmluZGV4IGVlZGU5MGI2Li43YmUzYTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKQEAgLTY2OSw3ICs2NjksOCBAQAogCXJldHVybiB0b3RhbDsKIH0KIAotc3RhdGljIHZvaWQgcDU0X2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQorc3RhdGljIHZvaWQgcDU0X2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICAgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQogewogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGludCB0b3RhbCwgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKaW5kZXggY2JmMGE1OC4uODMzMGZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCXJheV9yZWxlYXNlKGxpbmspOwogCiAJbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwotCWRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmbG9jYWwtPnRpbWVyKTsKIAogCWlmIChsaW5rLT5wcml2KSB7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKaW5kZXggMzlkMjJhMS4uZDJhOWEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCQkJIHU4IGtleV9pbmRleCwgYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCk7CiAKIHN0YXRpYyBpbnQgcm5kaXNfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworCQkJICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbyk7CiAKIHN0YXRpYyBpbnQgcm5kaXNfZHVtcF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgaW50IGlkeCwgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOwpAQCAtMjQ5MCw3ICsyNDkwLDcgQEAKIH0KIAogc3RhdGljIGludCBybmRpc19nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQl1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKKwkJCSAgICAgY29uc3QgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCiB7CiAJc3RydWN0IHJuZGlzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXN0cnVjdCB1c2JuZXQgKnVzYmRldiA9IHByaXYtPnVzYmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JzaS9yc2lfOTF4X21hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpXzkxeF9tYWM4MDIxMS5jCmluZGV4IDg0MTY0NzQuLjU0YWFlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JzaS9yc2lfOTF4X21hYzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL3JzaV85MXhfbWFjODAyMTEuYwpAQCAtNjU2LDYgKzY1Niw3IEBACiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CiAJCWNvbW1vbi0+dmlmX2luZm9baWldLnNlcV9zdGFydCA9IHNlcV9ubzsKIAkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CisJCXN0YXR1cyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9DT05UOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL3JzaV85MXhfbWdtdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL3JzaV85MXhfbWdtdC5jCmluZGV4IDFiMjhjZGEuLjJlZWZiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JzaS9yc2lfOTF4X21nbXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpXzkxeF9tZ210LmMKQEAgLTEwODMsNyArMTA4Myw3IEBACiB7CiAJaWYgKHN0YXR1cykgewogCQlyc2lfaGFsX3NlbmRfc3RhX25vdGlmeV9mcmFtZShjb21tb24sCi0JCQkJCSAgICAgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04sCisJCQkJCSAgICAgIFJTSV9JRlRZUEVfU1RBVElPTiwKIAkJCQkJICAgICAgU1RBX0NPTk5FQ1RFRCwKIAkJCQkJICAgICAgYnNzaWQsCiAJCQkJCSAgICAgIHFvc19lbmFibGUsCkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogCQkJcnNpX3NlbmRfYXV0b19yYXRlX3JlcXVlc3QoY29tbW9uKTsKIAl9IGVsc2UgewogCQlyc2lfaGFsX3NlbmRfc3RhX25vdGlmeV9mcmFtZShjb21tb24sCi0JCQkJCSAgICAgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04sCisJCQkJCSAgICAgIFJTSV9JRlRZUEVfU1RBVElPTiwKIAkJCQkJICAgICAgU1RBX0RJU0NPTk5FQ1RFRCwKIAkJCQkJICAgICAgYnNzaWQsCiAJCQkJCSAgICAgIHFvc19lbmFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL3JzaV9jb21tb24uaAppbmRleCBmMmY3MDc4Li5kM2ZiZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JzaS9yc2lfY29tbW9uLmgKQEAgLTYzLDcgKzYzLDcgQEAKIAkJCQkgICAgIHU4ICpuYW1lKQogewogCWluaXRfY29tcGxldGlvbigmdGhyZWFkLT5jb21wbGV0aW9uKTsKLQl0aHJlYWQtPnRhc2sgPSBrdGhyZWFkX3J1bihmdW5jX3B0ciwgY29tbW9uLCBuYW1lKTsKKwl0aHJlYWQtPnRhc2sgPSBrdGhyZWFkX3J1bihmdW5jX3B0ciwgY29tbW9uLCAiJXMiLCBuYW1lKTsKIAlpZiAoSVNfRVJSKHRocmVhZC0+dGFzaykpCiAJCXJldHVybiAoaW50KVBUUl9FUlIodGhyZWFkLT50YXNrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL3JzaV9tZ210LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpX21nbXQuaAppbmRleCBhYzY3YzRhLi4yMjUyMTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpX21nbXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yc2kvcnNpX21nbXQuaApAQCAtNzMsNiArNzMsNyBAQAogI2RlZmluZSBSWF9CQV9JTkRJQ0FUSU9OICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgUlNJX1RCTF9TWiAgICAgICAgICAgICAgICAgICAgICA0MAogI2RlZmluZSBNQVhfUkVUUklFUyAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgUlNJX0lGVFlQRV9TVEFUSU9OCQkgMAogCiAjZGVmaW5lIFNURF9SQVRFX01DUzcgICAgICAgICAgICAgICAgICAgMHgwNwogI2RlZmluZSBTVERfUkFURV9NQ1M2ICAgICAgICAgICAgICAgICAgIDB4MDYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwppbmRleCA0MWQ0YTgxNi4uYzE3ZmNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtMTAwNSwxMCArMTAwNSw5IEBACiAJCQkJICAgZW50cnktPnNrYi0+bGVuICsgcGFkZGluZ19sZW4pOwogCiAJLyoKLQkgKiBFbmFibGUgYmVhY29uaW5nIGFnYWluLgorCSAqIFJlc3RvcmUgYmVhY29uaW5nIHN0YXRlLgogCSAqLwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEJDTl9USU1FX0NGRywgb3JpZ19yZWcpOwogCiAJLyoKIAkgKiBDbGVhbiB1cCBiZWFjb24gc2tiLgpAQCAtMTAzOSwxMyArMTAzOCwxNCBAQAogdm9pZCBydDI4MDBfY2xlYXJfYmVhY29uKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnkpCiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2OwotCXUzMiByZWc7CisJdTMyIG9yaWdfcmVnLCByZWc7CiAKIAkvKgogCSAqIERpc2FibGUgYmVhY29uaW5nIHdoaWxlIHdlIGFyZSByZWxvYWRpbmcgdGhlIGJlYWNvbiBkYXRhLAogCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBiZSBzZW5kaW5nIG91dCBpbnZhbGlkIGRhdGEuCiAJICovCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBCQ05fVElNRV9DRkcsICZyZWcpOworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCAmb3JpZ19yZWcpOworCXJlZyA9IG9yaWdfcmVnOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMCk7CiAJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOwogCkBAIC0xMDU1LDEwICsxMDU1LDkgQEAKIAlydDI4MDBfY2xlYXJfYmVhY29uX3JlZ2lzdGVyKHJ0MngwMGRldiwgZW50cnktPmVudHJ5X2lkeCk7CiAKIAkvKgotCSAqIEVuYWJsZWQgYmVhY29uaW5nIGFnYWluLgorCSAqIFJlc3RvcmUgYmVhY29uaW5nIHN0YXRlLgogCSAqLwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEJDTl9USU1FX0NGRywgb3JpZ19yZWcpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyODAwX2NsZWFyX2JlYWNvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaAppbmRleCBlM2I4ODVkLi4wMTBiNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCkBAIC0xNDQ4LDcgKzE0NDgsOCBAQAogCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOwogdm9pZCBydDJ4MDBtYWNfcmZraWxsX3BvbGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCBydDJ4MDBtYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCk7Cit2b2lkIHJ0MngwMG1hY19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICB1MzIgcXVldWVzLCBib29sIGRyb3ApOwogaW50IHJ0MngwMG1hY19zZXRfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHR4X2FudCwgdTMyIHJ4X2FudCk7CiBpbnQgcnQyeDAwbWFjX2dldF9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgKnR4X2FudCwgdTMyICpyeF9hbnQpOwogdm9pZCBydDJ4MDBtYWNfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwppbmRleCBhODdlZTliLi4yMTJhYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCkBAIC03NDksNyArNzQ5LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMG1hY19yZmtpbGxfcG9sbCk7CiAKLXZvaWQgcnQyeDAwbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcXVldWVzLCBib29sIGRyb3ApCit2b2lkIHJ0MngwMG1hY19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGh3LT5wcml2OwogCXN0cnVjdCBkYXRhX3F1ZXVlICpxdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYwppbmRleCAxMDU3MjQ1Li44NmM0M2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCkBAIC02OCw2ICs2OCwxMiBAQAogCQl9CiAJfQogCisJLyogSWYgdGhlIHBvcnQgaXMgcG93ZXJlZCBkb3duLCB3ZSBnZXQgYSAtRVBST1RPIGVycm9yLCBhbmQgdGhpcworCSAqIGxlYWRzIHRvIGEgZW5kbGVzcyBsb29wLiBTbyBqdXN0IHNheSB0aGF0IHRoZSBkZXZpY2UgaXMgZ29uZS4KKwkgKi8KKwlpZiAoc3RhdHVzID09IC1FUFJPVE8pCisJCWNsZWFyX2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpOworCiAJcnQyeDAwX2VycihydDJ4MDBkZXYsCiAJCSAgICJWZW5kb3IgUmVxdWVzdCAweCUwMnggZmFpbGVkIGZvciBvZmZzZXQgMHglMDR4IHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgIHJlcXVlc3QsIG9mZnNldCwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jCmluZGV4IDI0NDAyOTguLjkwNDhhOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYwpAQCAtMjAzMSwxMyArMjAzMSwxNCBAQAogc3RhdGljIHZvaWQgcnQ2MXBjaV9jbGVhcl9iZWFjb24oc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSkKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7Ci0JdTMyIHJlZzsKKwl1MzIgb3JpZ19yZWcsIHJlZzsKIAogCS8qCiAJICogRGlzYWJsZSBiZWFjb25pbmcgd2hpbGUgd2UgYXJlIHJlbG9hZGluZyB0aGUgYmVhY29uIGRhdGEsCiAJICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGJlIHNlbmRpbmcgb3V0IGludmFsaWQgZGF0YS4KIAkgKi8KLQlydDJ4MDBtbWlvX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWFJYX0NTUjksICZyZWcpOworCXJ0MngwMG1taW9fcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYUlhfQ1NSOSwgJm9yaWdfcmVnKTsKKwlyZWcgPSBvcmlnX3JlZzsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhSWF9DU1I5X0JFQUNPTl9HRU4sIDApOwogCXJ0MngwMG1taW9fcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWFJYX0NTUjksIHJlZyk7CiAKQEAgLTIwNDgsMTAgKzIwNDksOSBAQAogCQkJCSAgSFdfQkVBQ09OX09GRlNFVChlbnRyeS0+ZW50cnlfaWR4KSwgMCk7CiAKIAkvKgotCSAqIEVuYWJsZSBiZWFjb25pbmcgYWdhaW4uCisJICogUmVzdG9yZSBnbG9iYWwgYmVhY29uaW5nIHN0YXRlLgogCSAqLwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjlfQkVBQ09OX0dFTiwgMSk7Ci0JcnQyeDAwbW1pb19yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYUlhfQ1NSOSwgcmVnKTsKKwlydDJ4MDBtbWlvX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I5LCBvcmlnX3JlZyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYwppbmRleCBhMTQwMTcwLi45NTcyNGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKQEAgLTE1OTcsMTMgKzE1OTcsMTQgQEAKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7CiAJdW5zaWduZWQgaW50IGJlYWNvbl9iYXNlOwotCXUzMiByZWc7CisJdTMyIG9yaWdfcmVnLCByZWc7CiAKIAkvKgogCSAqIERpc2FibGUgYmVhY29uaW5nIHdoaWxlIHdlIGFyZSByZWxvYWRpbmcgdGhlIGJlYWNvbiBkYXRhLAogCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBiZSBzZW5kaW5nIG91dCBpbnZhbGlkIGRhdGEuCiAJICovCi0JcnQyeDAwdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWFJYX0NTUjksICZyZWcpOworCXJ0MngwMHVzYl9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgVFhSWF9DU1I5LCAmb3JpZ19yZWcpOworCXJlZyA9IG9yaWdfcmVnOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjlfQkVBQ09OX0dFTiwgMCk7CiAJcnQyeDAwdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I5LCByZWcpOwogCkBAIC0xNjE0LDEwICsxNjE1LDkgQEAKIAlydDJ4MDB1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBiZWFjb25fYmFzZSwgMCk7CiAKIAkvKgotCSAqIEVuYWJsZSBiZWFjb25pbmcgYWdhaW4uCisJICogUmVzdG9yZSBiZWFjb25pbmcgc3RhdGUuCiAJICovCi0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYUlhfQ1NSOV9CRUFDT05fR0VOLCAxKTsKLQlydDJ4MDB1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWFJYX0NTUjksIHJlZyk7CisJcnQyeDAwdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I5LCBvcmlnX3JlZyk7CiB9CiAKIHN0YXRpYyBpbnQgcnQ3M3VzYl9nZXRfdHhfZGF0YV9sZW4oc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9NYWtlZmlsZQppbmRleCAwOGIwNTZkLi4yMTAwNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAotcnRsODE4MC1vYmpzCQk6PSBkZXYubyBydGw4MjI1Lm8gc2EyNDAwLm8gbWF4MjgyMC5vIGdyZjUxMDEubyBydGw4MjI1c2UubworcnRsODE4eF9wY2ktb2Jqcwk6PSBkZXYubyBydGw4MjI1Lm8gc2EyNDAwLm8gbWF4MjgyMC5vIGdyZjUxMDEubyBydGw4MjI1c2UubwogCi1vYmotJChDT05GSUdfUlRMODE4MCkJKz0gcnRsODE4MC5vCitvYmotJChDT05GSUdfUlRMODE4MCkJKz0gcnRsODE4eF9wY2kubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKaW5kZXggOThkODI1NmYuLjJjMWMwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKQEAgLTI4NCw2ICsyODQsOCBAQAogCQkJcnhfc3RhdHVzLmJhbmQgPSBkZXYtPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOwogCQkJcnhfc3RhdHVzLm1hY3RpbWUgPSB0c2Z0OwogCQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19NQUNUSU1FX1NUQVJUOworCQkJaWYgKGZsYWdzICYgUlRMODE4WF9SWF9ERVNDX0ZMQUdfU1BMQ1ApCisJCQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKIAkJCWlmIChmbGFncyAmIFJUTDgxOFhfUlhfREVTQ19GTEFHX0NSQzMyX0VSUikKIAkJCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDOwogCkBAIC00NjEsMTggKzQ2MywyMyBAQAogCQkJICAgIFJUTDgxOFhfVFhfREVTQ19GTEFHX05PX0VOQzsKIAogCXJjX2ZsYWdzID0gaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFnczsKKworCS8qIEhXIHdpbGwgcGVyZm9ybSBSVFMtQ1RTIHdoZW4gb25seSBSVFMgZmxhZ3MgaXMgc2V0LgorCSAqIEhXIHdpbGwgcGVyZm9ybSBDVFMtdG8tc2VsZiB3aGVuIGJvdGggUlRTIGFuZCBDVFMgZmxhZ3MgYXJlIHNldC4KKwkgKiBSVFMgcmF0ZSBhbmQgUlRTIGR1cmF0aW9uIHdpbGwgYmUgdXNlZCBhbHNvIGZvciBDVFMtdG8tc2VsZi4KKwkgKi8KIAlpZiAocmNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKIAkJdHhfZmxhZ3MgfD0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfUlRTOwogCQl0eF9mbGFncyB8PSBpZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShkZXYsIGluZm8pLT5od192YWx1ZSA8PCAxOTsKKwkJcnRzX2R1cmF0aW9uID0gaWVlZTgwMjExX3J0c19kdXJhdGlvbihkZXYsIHByaXYtPnZpZiwKKwkJCQkJCXNrYi0+bGVuLCBpbmZvKTsKIAl9IGVsc2UgaWYgKHJjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgewotCQl0eF9mbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19DVFM7CisJCXR4X2ZsYWdzIHw9IFJUTDgxOFhfVFhfREVTQ19GTEFHX1JUUyB8IFJUTDgxOFhfVFhfREVTQ19GTEFHX0NUUzsKIAkJdHhfZmxhZ3MgfD0gaWVlZTgwMjExX2dldF9ydHNfY3RzX3JhdGUoZGV2LCBpbmZvKS0+aHdfdmFsdWUgPDwgMTk7CisJCXJ0c19kdXJhdGlvbiA9IGllZWU4MDIxMV9jdHN0b3NlbGZfZHVyYXRpb24oZGV2LCBwcml2LT52aWYsCisJCQkJCQlza2ItPmxlbiwgaW5mbyk7CiAJfQogCi0JaWYgKHJjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKQotCQlydHNfZHVyYXRpb24gPSBpZWVlODAyMTFfcnRzX2R1cmF0aW9uKGRldiwgcHJpdi0+dmlmLCBza2ItPmxlbiwKLQkJCQkJCSAgICAgIGluZm8pOwotCiAJaWYgKHByaXYtPmNoaXBfZmFtaWx5ID09IFJUTDgxOFhfQ0hJUF9GQU1JTFlfUlRMODE4MCkgewogCQl1bnNpZ25lZCBpbnQgcmVtYWluZGVyOwogCkBAIC02ODMsOSArNjkwLDggQEAKIAlzdHJ1Y3QgcnRsODE4MF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCiAJaWYgKHByaXYtPmNoaXBfZmFtaWx5ID09IFJUTDgxOFhfQ0hJUF9GQU1JTFlfUlRMODE4N1NFKSB7Ci0JCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPklNUiwgSU1SX1RNR0RPSyB8Ci0JCQkgIElNUl9UQkRFUiB8IElNUl9USFBERVIgfAotCQkJICBJTVJfVEhQREVSIHwgSU1SX1RIUERPSyB8CisJCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPklNUiwKKwkJCSAgSU1SX1RCREVSIHwgSU1SX1RCRE9LIHwKIAkJCSAgSU1SX1RWT0RFUiB8IElNUl9UVk9ET0sgfAogCQkJICBJTVJfVFZJREVSIHwgSU1SX1RWSURPSyB8CiAJCQkgIElNUl9UQkVERVIgfCBJTVJfVEJFRE9LIHwKQEAgLTkxMSw3ICs5MTcsMTAgQEAKIAkJcmVnMzIgJj0gMHgwMGZmZmYwMDsKIAkJcmVnMzIgfD0gMHhiODAwMDA1NDsKIAkJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+UkZfUEFSQSwgcmVnMzIpOwotCX0KKwl9IGVsc2UKKwkJLyogc3RvcCB1bnVzZWQgcXVldXMgKG5vIGRtYSBhbGxvYykgKi8KKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5UWF9ETUFfUE9MTElORywKKwkJCSAgICAoMTw8MSkgfCAoMTw8MikpOwogCiAJcHJpdi0+cmYtPmluaXQoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3L2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3L2Rldi5jCmluZGV4IDBjYTE3Y2QuLjYyOWFkOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODcvZGV2LmMKQEAgLTI1MywxNCArMjUzLDIxIEBACiAJZmxhZ3MgfD0gaWVlZTgwMjExX2dldF90eF9yYXRlKGRldiwgaW5mbyktPmh3X3ZhbHVlIDw8IDI0OwogCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyh0eF9oZHItPmZyYW1lX2NvbnRyb2wpKQogCQlmbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19NT1JFRlJBRzsKKworCS8qIEhXIHdpbGwgcGVyZm9ybSBSVFMtQ1RTIHdoZW4gb25seSBSVFMgZmxhZ3MgaXMgc2V0LgorCSAqIEhXIHdpbGwgcGVyZm9ybSBDVFMtdG8tc2VsZiB3aGVuIGJvdGggUlRTIGFuZCBDVFMgZmxhZ3MgYXJlIHNldC4KKwkgKiBSVFMgcmF0ZSBhbmQgUlRTIGR1cmF0aW9uIHdpbGwgYmUgdXNlZCBhbHNvIGZvciBDVFMtdG8tc2VsZi4KKwkgKi8KIAlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUykgewogCQlmbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19SVFM7CiAJCWZsYWdzIHw9IGllZWU4MDIxMV9nZXRfcnRzX2N0c19yYXRlKGRldiwgaW5mbyktPmh3X3ZhbHVlIDw8IDE5OwogCQlydHNfZHVyID0gaWVlZTgwMjExX3J0c19kdXJhdGlvbihkZXYsIHByaXYtPnZpZiwKIAkJCQkJCSBza2ItPmxlbiwgaW5mbyk7CiAJfSBlbHNlIGlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgewotCQlmbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19DVFM7CisJCWZsYWdzIHw9IFJUTDgxOFhfVFhfREVTQ19GTEFHX1JUUyB8IFJUTDgxOFhfVFhfREVTQ19GTEFHX0NUUzsKIAkJZmxhZ3MgfD0gaWVlZTgwMjExX2dldF9ydHNfY3RzX3JhdGUoZGV2LCBpbmZvKS0+aHdfdmFsdWUgPDwgMTk7CisJCXJ0c19kdXIgPSBpZWVlODAyMTFfY3RzdG9zZWxmX2R1cmF0aW9uKGRldiwgcHJpdi0+dmlmLAorCQkJCQkJIHNrYi0+bGVuLCBpbmZvKTsKIAl9CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVEpIHsKQEAgLTM4MSw2ICszODgsOCBAQAogCXJ4X3N0YXR1cy5mcmVxID0gZGV2LT5jb25mLmNoYW5kZWYuY2hhbi0+Y2VudGVyX2ZyZXE7CiAJcnhfc3RhdHVzLmJhbmQgPSBkZXYtPmNvbmYuY2hhbmRlZi5jaGFuLT5iYW5kOwogCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfTUFDVElNRV9TVEFSVDsKKwlpZiAoZmxhZ3MgJiBSVEw4MThYX1JYX0RFU0NfRkxBR19TUExDUCkKKwkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKIAlpZiAoZmxhZ3MgJiBSVEw4MThYX1JYX0RFU0NfRkxBR19DUkMzMl9FUlIpCiAJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CiAJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLCBzaXplb2Yocnhfc3RhdHVzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxOHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4eC5oCmluZGV4IDQ1ZWE0ZTEuLjdhYmVmOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4eC5oCkBAIC0zMzQsOSArMzM0LDkgQEAKICAqIEkgZG9uJ3QgbGlrZSB0byBpbnRyb2R1Y2UgYSB0b24gb2YgInJlc2VydmVkIi4uCiAgKiBUaGV5IGFyZSBmb3IgUlRMODE4N1NFCiAgKi8KLSNkZWZpbmUgUkVHX0FERFIxKGFkZHIpCSgodTggX19pb21lbSAqKXByaXYtPm1hcCArIGFkZHIpCi0jZGVmaW5lIFJFR19BRERSMihhZGRyKQkoKF9fbGUxNiBfX2lvbWVtICopcHJpdi0+bWFwICsgKGFkZHIgPj4gMSkpCi0jZGVmaW5lIFJFR19BRERSNChhZGRyKQkoKF9fbGUzMiBfX2lvbWVtICopcHJpdi0+bWFwICsgKGFkZHIgPj4gMikpCisjZGVmaW5lIFJFR19BRERSMShhZGRyKQkoKHU4IF9faW9tZW0gKilwcml2LT5tYXAgKyAoYWRkcikpCisjZGVmaW5lIFJFR19BRERSMihhZGRyKQkoKF9fbGUxNiBfX2lvbWVtICopcHJpdi0+bWFwICsgKChhZGRyKSA+PiAxKSkKKyNkZWZpbmUgUkVHX0FERFI0KGFkZHIpCSgoX19sZTMyIF9faW9tZW0gKilwcml2LT5tYXAgKyAoKGFkZHIpID4+IDIpKQogCiAjZGVmaW5lIEZFTVJfU0UJCVJFR19BRERSMigweDFENCkKICNkZWZpbmUgQVJGUgkJUkVHX0FERFIyKDB4MUUwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYwppbmRleCA0ZWM0MjRmLi5iMWVkNmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYwpAQCAtMTM4Nyw3ICsxMzg3LDggQEAKICAqIGJlZm9yZSBzd2l0Y2ggY2hhbm5lbCBvciBwb3dlciBzYXZlLCBvciB0eCBidWZmZXIgcGFja2V0CiAgKiBtYXliZSBzZW5kIGFmdGVyIG9mZmNoYW5uZWwgb3IgcmYgc2xlZXAsIHRoaXMgbWF5IGNhdXNlCiAgKiBkaXMtYXNzb2NpYXRpb24gYnkgQVAgKi8KLXN0YXRpYyB2b2lkIHJ0bF9vcF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQorc3RhdGljIHZvaWQgcnRsX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9ody5jCmluZGV4IDk0Y2Q5ZGYuLmIxNGNmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYwpAQCAtMjUxNSwyMyArMjUxNSwzIEBACiB2b2lkIHJ0bDg4ZWVfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogfQotCi0vKiBUdXJuIG9uIEFBUCAoUkNSOmJpdCAwKSBmb3IgcHJvbWljdW91cyBtb2RlLiAqLwotdm9pZCBydGw4OGVlX2FsbG93X2FsbF9kZXN0YWRkcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZykKLXsKLQlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7Ci0Jc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKLQotCWlmIChhbGxvd19hbGxfZGEpIC8qIFNldCBCSVQwICovCi0JCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgfD0gUkNSX0FBUDsKLQkgZWxzZSAvKiBDbGVhciBCSVQwICovCi0JCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgJj0gflJDUl9BQVA7Ci0KLQlpZiAod3JpdGVfaW50b19yZWcpCi0JCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsKLQotCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfVFVSQk8gfCBDT01QX0lOSVQsIERCR19MT1VELAotCQkgInJlY2VpdmVfY29uZmlnID0gMHglMDhYLCB3cml0ZV9pbnRvX3JlZyA9JWRcbiIsCi0JCSBydGxwY2ktPnJlY2VpdmVfY29uZmlnLCB3cml0ZV9pbnRvX3JlZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuaAppbmRleCBiNDQ2MGE0Li4xODUwZmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL2h3LmgKQEAgLTYxLDggKzYxLDYgQEAKIHZvaWQgcnRsODE4OGVlX2J0X2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw4OGVlX3N1c3BlbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw4OGVlX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIHJ0bDg4ZWVfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKTsKIHZvaWQgcnRsODhlZV9md19jbGtfb2ZmX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL3N3LmMKaW5kZXggMWI0MTAxYi4uODQyZDY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9zdy5jCkBAIC05Myw3ICs5Myw3IEBACiAJdTggdGlkOwogCiAJcnRsODE4OGVlX2J0X3JlZ19pbml0KGh3KTsKLQlydGxwY2ktPm1zaV9zdXBwb3J0ID0gdHJ1ZTsKKwlydGxwY2ktPm1zaV9zdXBwb3J0ID0gcnRscHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5tc2lfc3VwcG9ydDsKIAogCXJ0bHByaXYtPmRtLmRtX2luaXRpYWxnYWluX2VuYWJsZSA9IDE7CiAJcnRscHJpdi0+ZG0uZG1fZmxhZyA9IDA7CkBAIC0yNTUsNyArMjU1LDYgQEAKIAkuZW5hYmxlX2h3X3NlYyA9IHJ0bDg4ZWVfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZywKIAkuc2V0X2tleSA9IHJ0bDg4ZWVfc2V0X2tleSwKIAkuaW5pdF9zd19sZWRzID0gcnRsODhlZV9pbml0X3N3X2xlZHMsCi0JLmFsbG93X2FsbF9kZXN0YWRkciA9IHJ0bDg4ZWVfYWxsb3dfYWxsX2Rlc3RhZGRyLAogCS5nZXRfYmJyZWcgPSBydGw4OGVfcGh5X3F1ZXJ5X2JiX3JlZywKIAkuc2V0X2JicmVnID0gcnRsODhlX3BoeV9zZXRfYmJfcmVnLAogCS5nZXRfcmZyZWcgPSBydGw4OGVfcGh5X3F1ZXJ5X3JmX3JlZywKQEAgLTI2Nyw2ICsyNjYsNyBAQAogCS5pbmFjdGl2ZXBzID0gdHJ1ZSwKIAkuc3djdHJsX2xwcyA9IGZhbHNlLAogCS5md2N0cmxfbHBzID0gdHJ1ZSwKKwkubXNpX3N1cHBvcnQgPSBmYWxzZSwKIAkuZGVidWcgPSBEQkdfRU1FUkcsCiB9OwogCkBAIC0zODMsMTAgKzM4MywxMiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGlwcywgcnRsODhlZV9tb2RfcGFyYW1zLmluYWN0aXZlcHMsIGJvb2wsIDA0NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKHN3bHBzLCBydGw4OGVlX21vZF9wYXJhbXMuc3djdHJsX2xwcywgYm9vbCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZndscHMsIHJ0bDg4ZWVfbW9kX3BhcmFtcy5md2N0cmxfbHBzLCBib29sLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChtc2ksIHJ0bDg4ZWVfbW9kX3BhcmFtcy5tc2lfc3VwcG9ydCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHN3ZW5jLCAiU2V0IHRvIDEgZm9yIHNvZnR3YXJlIGNyeXB0byAoZGVmYXVsdCAwKVxuIik7CiBNT0RVTEVfUEFSTV9ERVNDKGlwcywgIlNldCB0byAwIHRvIG5vdCB1c2UgbGluayBwb3dlciBzYXZlIChkZWZhdWx0IDEpXG4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3dscHMsICJTZXQgdG8gMSB0byB1c2UgU1cgY29udHJvbCBwb3dlciBzYXZlIChkZWZhdWx0IDApXG4iKTsKIE1PRFVMRV9QQVJNX0RFU0MoZndscHMsICJTZXQgdG8gMSB0byB1c2UgRlcgY29udHJvbCBwb3dlciBzYXZlIChkZWZhdWx0IDEpXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpLCAiU2V0IHRvIDEgdG8gdXNlIE1TSSBpbnRlcnJ1cHRzIG1vZGUgKGRlZmF1bHQgMClcbiIpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1ZyBsZXZlbCAoMC01KSAoZGVmYXVsdCAwKSIpOwogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocnRsd2lmaV9wbV9vcHMsIHJ0bF9wY2lfc3VzcGVuZCwgcnRsX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKaW5kZXggNTVhZGYwNC4uY2RlY2IwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCkBAIC0yNDIzLDI0ICsyNDIzLDMgQEAKIHZvaWQgcnRsOTJjZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiB9Ci0KLS8qIFR1cm4gb24gQUFQIChSQ1I6Yml0IDApIGZvciBwcm9taWN1b3VzIG1vZGUuICovCi12b2lkIHJ0bDkyY2VfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKQotewotCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKLQlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOwotCi0JaWYgKGFsbG93X2FsbF9kYSkgey8qIFNldCBCSVQwICovCi0JCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgfD0gUkNSX0FBUDsKLQl9IGVsc2Ugey8qIENsZWFyIEJJVDAgKi8KLQkJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyAmPSB+UkNSX0FBUDsKLQl9Ci0KLQlpZiAod3JpdGVfaW50b19yZWcpCi0JCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsKLQotCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfVFVSQk8gfCBDT01QX0lOSVQsIERCR19MT1VELAotCQkgInJlY2VpdmVfY29uZmlnPTB4JTA4WCwgd3JpdGVfaW50b19yZWc9JWRcbiIsCi0JCSBydGxwY2ktPnJlY2VpdmVfY29uZmlnLCB3cml0ZV9pbnRvX3JlZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvaHcuaAppbmRleCAyZDA2M2IwLi41NTMzMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmgKQEAgLTc2LDcgKzc2LDUgQEAKIHZvaWQgcnRsODE5MmNlX2J0X2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw5MmNlX3N1c3BlbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw5MmNlX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIHJ0bDkyY2VfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYwppbmRleCBiNzkwMzIwLi4xMmYyMWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKQEAgLTIyOSw3ICsyMjksNiBAQAogCS5lbmFibGVfaHdfc2VjID0gcnRsOTJjZV9lbmFibGVfaHdfc2VjdXJpdHlfY29uZmlnLAogCS5zZXRfa2V5ID0gcnRsOTJjZV9zZXRfa2V5LAogCS5pbml0X3N3X2xlZHMgPSBydGw5MmNlX2luaXRfc3dfbGVkcywKLQkuYWxsb3dfYWxsX2Rlc3RhZGRyID0gcnRsOTJjZV9hbGxvd19hbGxfZGVzdGFkZHIsCiAJLmdldF9iYnJlZyA9IHJ0bDkyY19waHlfcXVlcnlfYmJfcmVnLAogCS5zZXRfYmJyZWcgPSBydGw5MmNfcGh5X3NldF9iYl9yZWcsCiAJLnNldF9yZnJlZyA9IHJ0bDkyY2VfcGh5X3NldF9yZl9yZWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwppbmRleCAwN2NiMDZkLi5hOTAzYzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKQEAgLTUxMSw3ICs1MTEsNyBAQAogCQkJcHJfaW5mbygiTUFDIGF1dG8gT04gb2theSFcbiIpOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHBvbGxpbmdDb3VudCsrID4gMTAwKSB7CisJCWlmIChwb2xsaW5nQ291bnQrKyA+IDEwMDApIHsKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0VNRVJHLAogCQkJCSAiRmFpbGVkIHRvIHBvbGxpbmcgUkVHX0FQU19GU01DT1tBUEZNX09OTUFDXSBkb25lIVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCmluZGV4IGM2MTMxMTAuLjM2MTQzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwpAQCAtMzk1LDkgKzM5NSw2IEBACiAJLyogLnJlc3VtZSA9IHJ0bF91c2JfcmVzdW1lLCAqLwogCS8qIC5yZXNldF9yZXN1bWUgPSBydGw4MTkyY19yZXN1bWUsICovCiAjZW5kaWYgLyogQ09ORklHX1BNICovCi0jaWZkZWYgQ09ORklHX0FVVE9TVVNQRU5ECi0JLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKLSNlbmRpZgogCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCmluZGV4IDkwOTg1NTguLjFjNzEwMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwpAQCAtMjU0NCwyMyArMjU0NCwzIEBACiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocnRscGNpLT5wZGV2LCAweDQwLAogCQkJdmFsICYgMHhmZmZmMDBmZik7CiB9Ci0KLS8qIFR1cm4gb24gQUFQIChSQ1I6Yml0IDApIGZvciBwcm9taWN1b3VzIG1vZGUuICovCi12b2lkIHJ0bDkyc2VfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCWJvb2wgYWxsb3dfYWxsX2RhLCBib29sIHdyaXRlX2ludG9fcmVnKQotewotCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKLQlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOwotCi0JaWYgKGFsbG93X2FsbF9kYSkgLyogU2V0IEJJVDAgKi8KLQkJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyB8PSBSQ1JfQUFQOwotCWVsc2UgLyogQ2xlYXIgQklUMCAqLwotCQlydGxwY2ktPnJlY2VpdmVfY29uZmlnICY9IH5SQ1JfQUFQOwotCi0JaWYgKHdyaXRlX2ludG9fcmVnKQotCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsKLQotCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfVFVSQk8gfCBDT01QX0lOSVQsIERCR19MT1VELAotCQkgInJlY2VpdmVfY29uZmlnPTB4JTA4WCwgd3JpdGVfaW50b19yZWc9JWRcbiIsCi0JCSBydGxwY2ktPnJlY2VpdmVfY29uZmlnLCB3cml0ZV9pbnRvX3JlZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvaHcuaAppbmRleCBkYTQ4YWE4Li40Y2FjZWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmgKQEAgLTc0LDcgKzc0LDUgQEAKIAkJICAgICB1OCBlbmNfYWxnbywgYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKTsKIHZvaWQgcnRsOTJzZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgcnRsOTJzZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCBydGw5MnNlX2FsbG93X2FsbF9kZXN0YWRkcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKaW5kZXggMmU4ZTZmOC4uMWJmZjJhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCkBAIC0yOTAsNyArMjkwLDYgQEAKIAkuZW5hYmxlX2h3X3NlYyA9IHJ0bDkyc2VfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZywKIAkuc2V0X2tleSA9IHJ0bDkyc2Vfc2V0X2tleSwKIAkuaW5pdF9zd19sZWRzID0gcnRsOTJzZV9pbml0X3N3X2xlZHMsCi0JLmFsbG93X2FsbF9kZXN0YWRkciA9IHJ0bDkyc2VfYWxsb3dfYWxsX2Rlc3RhZGRyLAogCS5nZXRfYmJyZWcgPSBydGw5MnNfcGh5X3F1ZXJ5X2JiX3JlZywKIAkuc2V0X2JicmVnID0gcnRsOTJzX3BoeV9zZXRfYmJfcmVnLAogCS5nZXRfcmZyZWcgPSBydGw5MnNfcGh5X3F1ZXJ5X3JmX3JlZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2hhbF9idF9jb2V4aXN0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9oYWxfYnRfY29leGlzdC5jCmluZGV4IDQ4ZmVlMWIuLjViNGE3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2hhbF9idF9jb2V4aXN0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaGFsX2J0X2NvZXhpc3QuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgImRtLmgiCiAjaW5jbHVkZSAiZncuaCIKICNpbmNsdWRlICIuLi9ydGw4NzIzY29tL2Z3X2NvbW1vbi5oIgotI2luY2x1ZGUgIi4uL3J0bDg3MjNjb20vZndfY29tbW9uLmgiCiAjaW5jbHVkZSAicGh5LmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiaGFsX2J0Yy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMKaW5kZXggNjVjOWU4MC4uODdmNjkxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9ody5jCkBAIC0yMzgzLDI0ICsyMzgzLDMgQEAKIHZvaWQgcnRsODcyM2FlX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIH0KLQotLyogVHVybiBvbiBBQVAgKFJDUjpiaXQgMCkgZm9yIHByb21pY3VvdXMgbW9kZS4gKi8KLXZvaWQgcnRsODcyM2FlX2FsbG93X2FsbF9kZXN0YWRkcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQlib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZykKLXsKLQlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7Ci0Jc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKLQotCWlmIChhbGxvd19hbGxfZGEpIC8qIFNldCBCSVQwICovCi0JCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgfD0gUkNSX0FBUDsKLQllbHNlIC8qIENsZWFyIEJJVDAgKi8KLQkJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyAmPSB+UkNSX0FBUDsKLQotCWlmICh3cml0ZV9pbnRvX3JlZykKLQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IsIHJ0bHBjaS0+cmVjZWl2ZV9jb25maWcpOwotCi0KLQlSVF9UUkFDRShydGxwcml2LCBDT01QX1RVUkJPIHwgQ09NUF9JTklULCBEQkdfTE9VRCwKLQkJICJyZWNlaXZlX2NvbmZpZz0weCUwOFgsIHdyaXRlX2ludG9fcmVnPSVkXG4iLAotCQkgcnRscGNpLT5yZWNlaXZlX2NvbmZpZywgd3JpdGVfaW50b19yZWcpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2h3LmgKaW5kZXggNmZhMjRmNzkuLmQzYmMzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaHcuaApAQCAtNjcsNyArNjcsNSBAQAogdm9pZCBydGw4NzIzYWVfYnRfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIHJ0bDg3MjNhZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgcnRsODcyM2FlX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIHJ0bDg3MjNhZV9hbGxvd19hbGxfZGVzdGFkZHIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICBib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMKaW5kZXggMTA4N2EzYi4uNzNjYmExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9zdy5jCkBAIC0yMzgsNyArMjM4LDYgQEAKIAkuZW5hYmxlX2h3X3NlYyA9IHJ0bDg3MjNhZV9lbmFibGVfaHdfc2VjdXJpdHlfY29uZmlnLAogCS5zZXRfa2V5ID0gcnRsODcyM2FlX3NldF9rZXksCiAJLmluaXRfc3dfbGVkcyA9IHJ0bDg3MjNhZV9pbml0X3N3X2xlZHMsCi0JLmFsbG93X2FsbF9kZXN0YWRkciA9IHJ0bDg3MjNhZV9hbGxvd19hbGxfZGVzdGFkZHIsCiAJLmdldF9iYnJlZyA9IHJ0bDg3MjNfcGh5X3F1ZXJ5X2JiX3JlZywKIAkuc2V0X2JicmVnID0gcnRsODcyM19waHlfc2V0X2JiX3JlZywKIAkuZ2V0X3JmcmVnID0gcnRsODcyM2FlX3BoeV9xdWVyeV9yZl9yZWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYwppbmRleCAwZmRmMDkwLi4zZDU1NTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL2h3LmMKQEAgLTI1MDEsMjMgKzI1MDEsMyBAQAogdm9pZCBydGw4NzIzYmVfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogfQotCi0vKiBUdXJuIG9uIEFBUCAoUkNSOmJpdCAwKSBmb3IgcHJvbWljdW91cyBtb2RlLiAqLwotdm9pZCBydGw4NzIzYmVfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGFsbG93X2FsbF9kYSwKLQkJCQkgIGJvb2wgd3JpdGVfaW50b19yZWcpCi17Ci0Jc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwotCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7Ci0KLQlpZiAoYWxsb3dfYWxsX2RhKSAvKiBTZXQgQklUMCAqLwotCQlydGxwY2ktPnJlY2VpdmVfY29uZmlnIHw9IFJDUl9BQVA7Ci0JZWxzZSAvKiBDbGVhciBCSVQwICovCi0JCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgJj0gflJDUl9BQVA7Ci0KLQlpZiAod3JpdGVfaW50b19yZWcpCi0JCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkNSLCBydGxwY2ktPnJlY2VpdmVfY29uZmlnKTsKLQotCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfVFVSQk8gfCBDT01QX0lOSVQsIERCR19MT1VELAotCQkgInJlY2VpdmVfY29uZmlnID0gMHglMDhYLCB3cml0ZV9pbnRvX3JlZyA9JWRcbiIsCi0JCSBydGxwY2ktPnJlY2VpdmVfY29uZmlnLCB3cml0ZV9pbnRvX3JlZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvaHcuaAppbmRleCBiNzQ0OWE5Li42NGM3NTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL2h3LmgKQEAgLTU5LDYgKzU5LDQgQEAKIHZvaWQgcnRsODcyM2JlX2J0X2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBydGw4NzIzYmVfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIHJ0bDg3MjNiZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCBydGw4NzIzYmVfYWxsb3dfYWxsX2Rlc3RhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGFsbG93X2FsbF9kYSwKLQkJCQkgIGJvb2wgd3JpdGVfaW50b19yZWcpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvc3cuYwppbmRleCBiNDU3N2ViLi5mZjEyYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOwogCiAJcnRsODcyM2JlX2J0X3JlZ19pbml0KGh3KTsKLQlydGxwY2ktPm1zaV9zdXBwb3J0ID0gdHJ1ZTsKKwlydGxwY2ktPm1zaV9zdXBwb3J0ID0gcnRscHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5tc2lfc3VwcG9ydDsKIAlydGxwcml2LT5idGNvZXhpc3QuYnRjX29wcyA9IHJ0bF9idGNfZ2V0X29wc19wb2ludGVyKCk7CiAKIAlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOwpAQCAtMjUzLDYgKzI1Myw3IEBACiAJLmluYWN0aXZlcHMgPSB0cnVlLAogCS5zd2N0cmxfbHBzID0gZmFsc2UsCiAJLmZ3Y3RybF9scHMgPSB0cnVlLAorCS5tc2lfc3VwcG9ydCA9IGZhbHNlLAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKQEAgLTM2NSw5ICszNjYsMTEgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChpcHMsIHJ0bDg3MjNiZV9tb2RfcGFyYW1zLmluYWN0aXZlcHMsIGJvb2wsIDA0NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKHN3bHBzLCBydGw4NzIzYmVfbW9kX3BhcmFtcy5zd2N0cmxfbHBzLCBib29sLCAwNDQ0KTsKIG1vZHVsZV9wYXJhbV9uYW1lZChmd2xwcywgcnRsODcyM2JlX21vZF9wYXJhbXMuZndjdHJsX2xwcywgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobXNpLCBydGw4NzIzYmVfbW9kX3BhcmFtcy5tc2lfc3VwcG9ydCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHN3ZW5jLCAidXNpbmcgaGFyZHdhcmUgY3J5cHRvIChkZWZhdWx0IDAgW2hhcmR3YXJlXSlcbiIpOwogTU9EVUxFX1BBUk1fREVTQyhpcHMsICJ1c2luZyBubyBsaW5rIHBvd2VyIHNhdmUgKGRlZmF1bHQgMSBpcyBvcGVuKVxuIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZ3bHBzLCAidXNpbmcgbGlua2VkIGZ3IGNvbnRyb2wgcG93ZXIgc2F2ZSAoZGVmYXVsdCAxIGlzIG9wZW4pXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpLCAiU2V0IHRvIDEgdG8gdXNlIE1TSSBpbnRlcnJ1cHRzIG1vZGUgKGRlZmF1bHQgMClcbiIpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1ZyBsZXZlbCAoMC01KSAoZGVmYXVsdCAwKSIpOwogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocnRsd2lmaV9wbV9vcHMsIHJ0bF9wY2lfc3VzcGVuZCwgcnRsX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS90cnguYwppbmRleCBlMGEwZDhjLi45NjllYWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS90cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS90cnguYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgInRyeC5oIgogI2luY2x1ZGUgImxlZC5oIgogI2luY2x1ZGUgImRtLmgiCi0jaW5jbHVkZSAicGh5LmgiCiAKIHN0YXRpYyB1OCBfcnRsODcyM2JlX21hcF9od3F1ZXVlX3RvX2Z3cXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaHdfcXVldWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCmluZGV4IDY5NjVhZmQuLjQwN2E3OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCkBAIC0xOTYwLDggKzE5NjAsNiBAQAogCQkJICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spOwogCXZvaWQgKCpzZXRfcmZyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKIAkJCSAgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpOwotCXZvaWQgKCphbGxvd19hbGxfZGVzdGFkZHIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQlib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZyk7CiAJdm9pZCAoKmxpbmtlZF9zZXRfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogCXZvaWQgKCpjaGtfc3dpdGNoX2RtZHApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJdm9pZCAoKmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpAQCAtMjAzMCw2ICsyMDI4LDEwIEBACiAKIAkvKiBkZWZhdWx0OiAxID0gdXNpbmcgbGlua2VkIGZ3IHBvd2VyIHNhdmUgKi8KIAlib29sIGZ3Y3RybF9scHM7CisKKwkvKiBkZWZhdWx0OiAwID0gbm90IHVzaW5nIE1TSSBpbnRlcnJ1cHRzIG1vZGUgKi8KKwkvKiBzdWJtb2R1bGVzIHNob3VsZCBzZXQgdGhlaXIgb3duIGRlZmFsdXQgdmFsdWUgKi8KKwlib29sIG1zaV9zdXBwb3J0OwogfTsKIAogc3RydWN0IHJ0bF9oYWxfdXNiaW50X2NmZyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvYWN4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvYWN4LmMKaW5kZXggNWE0ZWM1Ni4uNTY5NTYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL2FjeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9hY3guYwpAQCAtMiw3ICsyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CiAKICNpbmNsdWRlICJ3bDEyNTEuaCIKICNpbmNsdWRlICJyZWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9jbWQuYwppbmRleCBiZjFmYTE4Li5lZGUzMWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL2NtZC5jCkBAIC0yLDcgKzIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzcuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSAid2wxMjUxLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9ldmVudC5jCmluZGV4IGRiMDEwNTMuLmM5ODYzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9ldmVudC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9ldmVudC5jCkBAIC0xMjQsMTEgKzEyNCwxMiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAod2wtPnZpZiAmJiB2ZWN0b3IgJiBTWU5DSFJPTklaQVRJT05fVElNRU9VVF9FVkVOVF9JRCkgeworCWlmICh2ZWN0b3IgJiBTWU5DSFJPTklaQVRJT05fVElNRU9VVF9FVkVOVF9JRCkgewogCQl3bDEyNTFfZGVidWcoREVCVUdfRVZFTlQsICJTWU5DSFJPTklaQVRJT05fVElNRU9VVF9FVkVOVCIpOwogCiAJCS8qIGluZGljYXRlIHRvIHRoZSBzdGFjaywgdGhhdCBiZWFjb25zIGhhdmUgYmVlbiBsb3N0ICovCi0JCWllZWU4MDIxMV9iZWFjb25fbG9zcyh3bC0+dmlmKTsKKwkJaWYgKHdsLT52aWYgJiYgd2wtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQkJaWVlZTgwMjExX2JlYWNvbl9sb3NzKHdsLT52aWYpOwogCX0KIAogCWlmICh2ZWN0b3IgJiBSRUdBSU5FRF9CU1NfRVZFTlRfSUQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvbWFpbi5jCmluZGV4IDc1N2UyNTcuLjRlNzgyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL21haW4uYwpAQCAtNTUwLDYgKzU1MCwzNCBAQAogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIH0KIAorc3RhdGljIGludCB3bDEyNTFfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNTEgKndsKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBzaXplOworCXZvaWQgKnB0cjsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgeworCQlzaXplID0gc2l6ZW9mKHN0cnVjdCB3bDEyeHhfbnVsbF9kYXRhX3RlbXBsYXRlKTsKKwkJcHRyID0gTlVMTDsKKwl9IGVsc2UgeworCQlza2IgPSBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0KHdsLT5odywgd2wtPnZpZik7CisJCWlmICghc2tiKQorCQkJZ290byBvdXQ7CisJCXNpemUgPSBza2ItPmxlbjsKKwkJcHRyID0gc2tiLT5kYXRhOworCX0KKworCXJldCA9IHdsMTI1MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfTlVMTF9EQVRBLCBwdHIsIHNpemUpOworCitvdXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCWlmIChyZXQpCisJCXdsMTI1MV93YXJuaW5nKCJjbWQgYnVsZCBudWxsIGRhdGEgZmFpbGVkOiAlZCIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHdsMTI1MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNTEgKndsKQogewogCXN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciB0ZW1wbGF0ZTsKQEAgLTY4NywxNiArNzE1LDYgQEAKIAkJd2wtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CiAJfQogCi0JLyoKLQkgKiBUZWxsIHN0YWNrIHRoYXQgY29ubmVjdGlvbiBpcyBsb3N0IGJlY2F1c2UgaHcgZW5jcnlwdGlvbiBpc24ndAotCSAqIHN1cHBvcnRlZCBpbiBtb25pdG9yIG1vZGUuCi0JICogVGhpcyByZXF1aXJlcyB0ZW1wb3JhcnkgZW5hYmxpbmcgb2YgdGhlIGh3IGNvbm5lY3Rpb24gbW9uaXRvciBmbGFnCi0JICovCi0JaWYgKChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpICYmIHdsLT52aWYpIHsKLQkJd2wtPmh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfQ09OTkVDVElPTl9NT05JVE9SOwotCQlpZWVlODAyMTFfY29ubmVjdGlvbl9sb3NzKHdsLT52aWYpOwotCX0KLQogb3V0X3NsZWVwOgogCXdsMTI1MV9wc19lbHBfc2xlZXAod2wpOwogCkBAIC0xMTAzLDI0ICsxMTIxLDE5IEBACiAJCXdsLT5yc3NpX3Rob2xkID0gYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkOwogCX0KIAotCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKKwlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgJiYKKwkgICAgbWVtY21wKHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTikpIHsKIAkJbWVtY3B5KHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7CiAKLQkJc2tiID0gaWVlZTgwMjExX251bGxmdW5jX2dldCh3bC0+aHcsIHdsLT52aWYpOwotCQlpZiAoIXNrYikKLQkJCWdvdG8gb3V0X3NsZWVwOworCQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcih3bC0+YnNzaWQpKSB7CisJCQlyZXQgPSB3bDEyNTFfYnVpbGRfbnVsbF9kYXRhKHdsKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0X3NsZWVwOwogCi0JCXJldCA9IHdsMTI1MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfTlVMTF9EQVRBLAotCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X3NsZWVwOworCQkJcmV0ID0gd2wxMjUxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXRfc2xlZXA7CiAKLQkJcmV0ID0gd2wxMjUxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfSUJTUykgewogCQkJcmV0ID0gd2wxMjUxX2pvaW4od2wsIHdsLT5ic3NfdHlwZSwgd2wtPmNoYW5uZWwsCiAJCQkJCSAgd2wtPmJlYWNvbl9pbnQsIHdsLT5kdGltX3BlcmlvZCk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTExMjksOSArMTE0Miw2IEBACiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgewotCQkvKiBEaXNhYmxlIHRlbXBvcmFyeSBlbmFibGVkIGh3IGNvbm5lY3Rpb24gbW9uaXRvciBmbGFnICovCi0JCXdsLT5ody0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9IV19DT05ORUNUSU9OX01PTklUT1I7Ci0KIAkJaWYgKGJzc19jb25mLT5hc3NvYykgewogCQkJd2wtPmJlYWNvbl9pbnQgPSBic3NfY29uZi0+YmVhY29uX2ludDsKIApAQCAtMTIxNiw4ICsxMjI2LDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9zbGVlcDsKIAotCQlyZXQgPSB3bDEyNTFfam9pbih3bCwgd2wtPmJzc190eXBlLCB3bC0+YmVhY29uX2ludCwKLQkJCQkgIHdsLT5jaGFubmVsLCB3bC0+ZHRpbV9wZXJpb2QpOworCQlyZXQgPSB3bDEyNTFfam9pbih3bCwgd2wtPmJzc190eXBlLCB3bC0+Y2hhbm5lbCwKKwkJCQkgIHdsLT5iZWFjb25faW50LCB3bC0+ZHRpbV9wZXJpb2QpOwogCiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXRfc2xlZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvc3BpLmMKaW5kZXggYjA2ZDM2ZC4uYTBhYThmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9zcGkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjNy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC93bDEyeHguaD4KQEAgLTgzLDQ3ICs4NCw0NCBAQAogCiBzdGF0aWMgdm9pZCB3bDEyNTFfc3BpX3dha2Uoc3RydWN0IHdsMTI1MSAqd2wpCiB7Ci0JdTggY3JjW1dTUElfSU5JVF9DTURfQ1JDX0xFTl0sICpjbWQ7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0OwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCXU4ICpjbWQgPSBremFsbG9jKFdTUElfSU5JVF9DTURfTEVOLCBHRlBfS0VSTkVMKTsKIAotCWNtZCA9IGt6YWxsb2MoV1NQSV9JTklUX0NNRF9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghY21kKSB7CiAJCXdsMTI1MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIGNtZCBmb3Igc3BpIGluaXQiKTsKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldChjcmMsIDAsIHNpemVvZihjcmMpKTsKIAltZW1zZXQoJnQsIDAsIHNpemVvZih0KSk7CiAJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CiAKIAkvKiBTZXQgV1NQSV9JTklUX0NPTU1BTkQKIAkgKiB0aGUgZGF0YSBpcyBiZWluZyBzZW5kIGZyb20gdGhlIE1TQiB0byBMU0IKIAkgKi8KLQljbWRbMl0gPSAweGZmOwotCWNtZFszXSA9IDB4ZmY7Ci0JY21kWzFdID0gV1NQSV9JTklUX0NNRF9TVEFSVCB8IFdTUElfSU5JVF9DTURfVFg7Ci0JY21kWzBdID0gMDsKLQljbWRbN10gPSAwOwotCWNtZFs2XSB8PSBIV19BQ0NFU1NfV1NQSV9JTklUX0NNRF9NQVNLIDw8IDM7Ci0JY21kWzZdIHw9IEhXX0FDQ0VTU19XU1BJX0ZJWEVEX0JVU1lfTEVOICYgV1NQSV9JTklUX0NNRF9GSVhFREJVU1lfTEVOOworCWNtZFswXSA9IDB4ZmY7CisJY21kWzFdID0gMHhmZjsKKwljbWRbMl0gPSBXU1BJX0lOSVRfQ01EX1NUQVJUIHwgV1NQSV9JTklUX0NNRF9UWDsKKwljbWRbM10gPSAwOworCWNtZFs0XSA9IDA7CisJY21kWzVdID0gSFdfQUNDRVNTX1dTUElfSU5JVF9DTURfTUFTSyA8PCAzOworCWNtZFs1XSB8PSBIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiAmIFdTUElfSU5JVF9DTURfRklYRURCVVNZX0xFTjsKIAotCWlmIChIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiA9PSAwKQotCQljbWRbNV0gfD0gIFdTUElfSU5JVF9DTURfRElTX0ZJWEVEQlVTWTsKLQllbHNlCi0JCWNtZFs1XSB8PSBXU1BJX0lOSVRfQ01EX0VOX0ZJWEVEQlVTWTsKLQotCWNtZFs1XSB8PSBXU1BJX0lOSVRfQ01EX0lPRCB8IFdTUElfSU5JVF9DTURfSVAgfCBXU1BJX0lOSVRfQ01EX0NTCisJY21kWzZdID0gV1NQSV9JTklUX0NNRF9JT0QgfCBXU1BJX0lOSVRfQ01EX0lQIHwgV1NQSV9JTklUX0NNRF9DUwogCQl8IFdTUElfSU5JVF9DTURfV1NQSSB8IFdTUElfSU5JVF9DTURfV1M7CiAKLQljcmNbMF0gPSBjbWRbMV07Ci0JY3JjWzFdID0gY21kWzBdOwotCWNyY1syXSA9IGNtZFs3XTsKLQljcmNbM10gPSBjbWRbNl07Ci0JY3JjWzRdID0gY21kWzVdOworCWlmIChIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiA9PSAwKQorCQljbWRbNl0gfD0gV1NQSV9JTklUX0NNRF9ESVNfRklYRURCVVNZOworCWVsc2UKKwkJY21kWzZdIHw9IFdTUElfSU5JVF9DTURfRU5fRklYRURCVVNZOwogCi0JY21kWzRdIHw9IGNyYzcoMCwgY3JjLCBXU1BJX0lOSVRfQ01EX0NSQ19MRU4pIDw8IDE7Ci0JY21kWzRdIHw9IFdTUElfSU5JVF9DTURfRU5EOworCWNtZFs3XSA9IGNyYzdfYmUoMCwgY21kKzIsIFdTUElfSU5JVF9DTURfQ1JDX0xFTikgfCBXU1BJX0lOSVRfQ01EX0VORDsKKwkvKgorCSAqIFRoZSBhYm92ZSBpcyB0aGUgbG9naWNhbCBvcmRlcjsgaXQgbXVzdCBhY3R1YWxseSBiZSBzdG9yZWQKKwkgKiBpbiB0aGUgYnVmZmVyIGJ5dGUtc3dhcHBlZC4KKwkgKi8KKwlfX3N3YWIzMnMoKHUzMiAqKWNtZCk7CisJX19zd2FiMzJzKCh1MzIgKiljbWQrMSk7CiAKIAl0LnR4X2J1ZiA9IGNtZDsKIAl0LmxlbiA9IFdTUElfSU5JVF9DTURfTEVOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2RlYnVnZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9kZWJ1Z2ZzLmgKaW5kZXggZjczODFkZC4uMGYyY2ZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2RlYnVnZnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvZGVidWdmcy5oCkBAIC01Nyw3ICs1Nyw3IEBACiAJCQkJCSAgICB3bCwgJm5hbWUjIyBfb3BzKTsJCVwKIAkJaWYgKCFlbnRyeSB8fCBJU19FUlIoZW50cnkpKQkJCQlcCiAJCQlnb3RvIGVycjsJCQkJCVwKLQl9IHdoaWxlICgwKTsKKwl9IHdoaWxlICgwKQogCiAKICNkZWZpbmUgREVCVUdGU19BRERfUFJFRklYKHByZWZpeCwgbmFtZSwgcGFyZW50KQkJCVwKQEAgLTY2LDcgKzY2LDcgQEAKIAkJCQkgICAgd2wsICZwcmVmaXgjIyBfIyMgbmFtZSMjIF9vcHMpOwlcCiAJCWlmICghZW50cnkgfHwgSVNfRVJSKGVudHJ5KSkJCQkJXAogCQkJZ290byBlcnI7CQkJCQlcCi0JfSB3aGlsZSAoMCk7CisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBERUJVR0ZTX0ZXU1RBVFNfRklMRShzdWIsIG5hbWUsIGZtdCwgc3RydWN0X3R5cGUpCQlcCiBzdGF0aWMgc3NpemVfdCBzdWIjIyBfICMjbmFtZSMjIF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9tYWluLmMKaW5kZXggZTcxZWFlMy4uM2Q2MDI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jCkBAIC0xNDE2LDcgKzE0MTYsNyBAQAogCiBpbnQgd2wxMjcxX3J4X2ZpbHRlcl9hbGxvY19maWVsZChzdHJ1Y3Qgd2wxMnh4X3J4X2ZpbHRlciAqZmlsdGVyLAogCQkJCSB1MTYgb2Zmc2V0LCB1OCBmbGFncywKLQkJCQkgdTggKnBhdHRlcm4sIHU4IGxlbikKKwkJCQkgY29uc3QgdTggKnBhdHRlcm4sIHU4IGxlbikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X3J4X2ZpbHRlcl9maWVsZCAqZmllbGQ7CiAKQEAgLTUxODQsNyArNTE4NCw4IEBACiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNvcmVfb3BfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKK3N0YXRpYyB2b2lkIHdsY29yZV9vcF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICB1MzIgcXVldWVzLCBib29sIGRyb3ApCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zZGlvLmMKaW5kZXggMjllZjI0OS4uZDNkZDdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc2Rpby5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIHN0YXRpYyBpbnQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKQogewotCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGE7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgcGRldl9kYXRhOwogCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlOwogCXN0cnVjdCByZXNvdXJjZSByZXNbMV07CiAJbW1jX3BtX2ZsYWdfdCBtbWNmbGFnczsKQEAgLTIyOCwxNiArMjI4LDEzIEBACiAJaWYgKGZ1bmMtPm51bSAhPSAweDAyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBkZXZfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGV2X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkZXZfZGF0YSkKLQkJZ290byBvdXQ7Ci0KLQlwZGV2X2RhdGEtPmlmX29wcyA9ICZzZGlvX29wczsKKwltZW1zZXQoJnBkZXZfZGF0YSwgMHgwMCwgc2l6ZW9mKHBkZXZfZGF0YSkpOworCXBkZXZfZGF0YS5pZl9vcHMgPSAmc2Rpb19vcHM7CiAKIAlnbHVlID0ga3phbGxvYyhzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdsdWUpIHsKIAkJZGV2X2VycigmZnVuYy0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgZ2x1ZVxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfcGRldl9kYXRhOworCQlnb3RvIG91dDsKIAl9CiAKIAlnbHVlLT5kZXYgPSAmZnVuYy0+ZGV2OwpAQCAtMjQ4LDkgKzI0NSw5IEBACiAJLyogVXNlIGJsb2NrIG1vZGUgZm9yIHRyYW5zZmVycmluZyBvdmVyIG9uZSBibG9jayBzaXplIG9mIGRhdGEgKi8KIAlmdW5jLT5jYXJkLT5xdWlya3MgfD0gTU1DX1FVSVJLX0JMS1NaX0ZPUl9CWVRFX01PREU7CiAKLQlwZGV2X2RhdGEtPnBkYXRhID0gd2wxMnh4X2dldF9wbGF0Zm9ybV9kYXRhKCk7Ci0JaWYgKElTX0VSUihwZGV2X2RhdGEtPnBkYXRhKSkgewotCQlyZXQgPSBQVFJfRVJSKHBkZXZfZGF0YS0+cGRhdGEpOworCXBkZXZfZGF0YS5wZGF0YSA9IHdsMTJ4eF9nZXRfcGxhdGZvcm1fZGF0YSgpOworCWlmIChJU19FUlIocGRldl9kYXRhLnBkYXRhKSkgeworCQlyZXQgPSBQVFJfRVJSKHBkZXZfZGF0YS5wZGF0YSk7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAibWlzc2luZyB3bGFuIHBsYXRmb3JtIGRhdGE6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dF9mcmVlX2dsdWU7CiAJfQpAQCAtMjYwLDcgKzI1Nyw3IEBACiAJZGV2X2RiZyhnbHVlLT5kZXYsICJzZGlvIFBNIGNhcHMgPSAweCV4XG4iLCBtbWNmbGFncyk7CiAKIAlpZiAobW1jZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikKLQkJcGRldl9kYXRhLT5wZGF0YS0+cHdyX2luX3N1c3BlbmQgPSB0cnVlOworCQlwZGV2X2RhdGEucGRhdGEtPnB3cl9pbl9zdXNwZW5kID0gdHJ1ZTsKIAogCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgZ2x1ZSk7CiAKQEAgLTI4OSw3ICsyODYsNyBAQAogCiAJbWVtc2V0KHJlcywgMHgwMCwgc2l6ZW9mKHJlcykpOwogCi0JcmVzWzBdLnN0YXJ0ID0gcGRldl9kYXRhLT5wZGF0YS0+aXJxOworCXJlc1swXS5zdGFydCA9IHBkZXZfZGF0YS5wZGF0YS0+aXJxOwogCXJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwogCXJlc1swXS5uYW1lID0gImlycSI7CiAKQEAgLTI5OSw4ICsyOTYsOCBAQAogCQlnb3RvIG91dF9kZXZfcHV0OwogCX0KIAotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCBwZGV2X2RhdGEsCi0JCQkJICAgICAgIHNpemVvZigqcGRldl9kYXRhKSk7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsICZwZGV2X2RhdGEsCisJCQkJICAgICAgIHNpemVvZihwZGV2X2RhdGEpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlnb3RvIG91dF9kZXZfcHV0OwpAQCAtMzE5LDkgKzMxNiw2IEBACiBvdXRfZnJlZV9nbHVlOgogCWtmcmVlKGdsdWUpOwogCi1vdXRfZnJlZV9wZGV2X2RhdGE6Ci0Ja2ZyZWUocGRldl9kYXRhKTsKLQogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMKaW5kZXggZGJlODI2ZC4uMzkyYzg4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zcGkuYwpAQCAtMjQsMTEgKzI0LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIndsY29yZS5oIgogI2luY2x1ZGUgIndsMTJ4eF84MDIxMS5oIgpAQCAtMTEwLDE4ICsxMTEsMTYgQEAKIHN0YXRpYyB2b2lkIHdsMTJ4eF9zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpjaGlsZCkKIHsKIAlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOwotCXU4IGNyY1tXU1BJX0lOSVRfQ01EX0NSQ19MRU5dLCAqY21kOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdDsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwl1OCAqY21kID0ga3phbGxvYyhXU1BJX0lOSVRfQ01EX0xFTiwgR0ZQX0tFUk5FTCk7CiAKLQljbWQgPSBremFsbG9jKFdTUElfSU5JVF9DTURfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNtZCkgewogCQlkZXZfZXJyKGNoaWxkLT5wYXJlbnQsCiAJCQkiY291bGQgbm90IGFsbG9jYXRlIGNtZCBmb3Igc3BpIGluaXRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JbWVtc2V0KGNyYywgMCwgc2l6ZW9mKGNyYykpOwogCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHQpKTsKIAlzcGlfbWVzc2FnZV9pbml0KCZtKTsKIApAQCAtMTI5LDMwICsxMjgsMjkgQEAKIAkgKiBTZXQgV1NQSV9JTklUX0NPTU1BTkQKIAkgKiB0aGUgZGF0YSBpcyBiZWluZyBzZW5kIGZyb20gdGhlIE1TQiB0byBMU0IKIAkgKi8KLQljbWRbMl0gPSAweGZmOwotCWNtZFszXSA9IDB4ZmY7Ci0JY21kWzFdID0gV1NQSV9JTklUX0NNRF9TVEFSVCB8IFdTUElfSU5JVF9DTURfVFg7Ci0JY21kWzBdID0gMDsKLQljbWRbN10gPSAwOwotCWNtZFs2XSB8PSBIV19BQ0NFU1NfV1NQSV9JTklUX0NNRF9NQVNLIDw8IDM7Ci0JY21kWzZdIHw9IEhXX0FDQ0VTU19XU1BJX0ZJWEVEX0JVU1lfTEVOICYgV1NQSV9JTklUX0NNRF9GSVhFREJVU1lfTEVOOworCWNtZFswXSA9IDB4ZmY7CisJY21kWzFdID0gMHhmZjsKKwljbWRbMl0gPSBXU1BJX0lOSVRfQ01EX1NUQVJUIHwgV1NQSV9JTklUX0NNRF9UWDsKKwljbWRbM10gPSAwOworCWNtZFs0XSA9IDA7CisJY21kWzVdID0gSFdfQUNDRVNTX1dTUElfSU5JVF9DTURfTUFTSyA8PCAzOworCWNtZFs1XSB8PSBIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiAmIFdTUElfSU5JVF9DTURfRklYRURCVVNZX0xFTjsKIAotCWlmIChIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiA9PSAwKQotCQljbWRbNV0gfD0gIFdTUElfSU5JVF9DTURfRElTX0ZJWEVEQlVTWTsKLQllbHNlCi0JCWNtZFs1XSB8PSBXU1BJX0lOSVRfQ01EX0VOX0ZJWEVEQlVTWTsKLQotCWNtZFs1XSB8PSBXU1BJX0lOSVRfQ01EX0lPRCB8IFdTUElfSU5JVF9DTURfSVAgfCBXU1BJX0lOSVRfQ01EX0NTCisJY21kWzZdID0gV1NQSV9JTklUX0NNRF9JT0QgfCBXU1BJX0lOSVRfQ01EX0lQIHwgV1NQSV9JTklUX0NNRF9DUwogCQl8IFdTUElfSU5JVF9DTURfV1NQSSB8IFdTUElfSU5JVF9DTURfV1M7CiAKLQljcmNbMF0gPSBjbWRbMV07Ci0JY3JjWzFdID0gY21kWzBdOwotCWNyY1syXSA9IGNtZFs3XTsKLQljcmNbM10gPSBjbWRbNl07Ci0JY3JjWzRdID0gY21kWzVdOworCWlmIChIV19BQ0NFU1NfV1NQSV9GSVhFRF9CVVNZX0xFTiA9PSAwKQorCQljbWRbNl0gfD0gV1NQSV9JTklUX0NNRF9ESVNfRklYRURCVVNZOworCWVsc2UKKwkJY21kWzZdIHw9IFdTUElfSU5JVF9DTURfRU5fRklYRURCVVNZOwogCi0JY21kWzRdIHw9IGNyYzcoMCwgY3JjLCBXU1BJX0lOSVRfQ01EX0NSQ19MRU4pIDw8IDE7Ci0JY21kWzRdIHw9IFdTUElfSU5JVF9DTURfRU5EOworCWNtZFs3XSA9IGNyYzdfYmUoMCwgY21kKzIsIFdTUElfSU5JVF9DTURfQ1JDX0xFTikgfCBXU1BJX0lOSVRfQ01EX0VORDsKKwkvKgorCSAqIFRoZSBhYm92ZSBpcyB0aGUgbG9naWNhbCBvcmRlcjsgaXQgbXVzdCBhY3R1YWxseSBiZSBzdG9yZWQKKwkgKiBpbiB0aGUgYnVmZmVyIGJ5dGUtc3dhcHBlZC4KKwkgKi8KKwlfX3N3YWIzMnMoKHUzMiAqKWNtZCk7CisJX19zd2FiMzJzKCh1MzIgKiljbWQrMSk7CiAKIAl0LnR4X2J1ZiA9IGNtZDsKIAl0LmxlbiA9IFdTUElfSU5JVF9DTURfTEVOOwpAQCAtMzI3LDI3ICszMjUsMjUgQEAKIHN0YXRpYyBpbnQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZTsKLQlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhOworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhIHBkZXZfZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzFdOwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JcGRldl9kYXRhID0ga3phbGxvYyhzaXplb2YoKnBkZXZfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRldl9kYXRhKQotCQlnb3RvIG91dDsKKwltZW1zZXQoJnBkZXZfZGF0YSwgMHgwMCwgc2l6ZW9mKHBkZXZfZGF0YSkpOwogCi0JcGRldl9kYXRhLT5wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnNwaS0+ZGV2KTsKLQlpZiAoIXBkZXZfZGF0YS0+cGRhdGEpIHsKKwlwZGV2X2RhdGEucGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZzcGktPmRldik7CisJaWYgKCFwZGV2X2RhdGEucGRhdGEpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfZnJlZV9wZGV2X2RhdGE7CisJCWdvdG8gb3V0OwogCX0KIAotCXBkZXZfZGF0YS0+aWZfb3BzID0gJnNwaV9vcHM7CisJcGRldl9kYXRhLmlmX29wcyA9ICZzcGlfb3BzOwogCiAJZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnbHVlKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgZ2x1ZVxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfcGRldl9kYXRhOworCQlnb3RvIG91dDsKIAl9CiAKIAlnbHVlLT5kZXYgPSAmc3BpLT5kZXY7CkBAIC0zODUsOCArMzgxLDggQEAKIAkJZ290byBvdXRfZGV2X3B1dDsKIAl9CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgcGRldl9kYXRhLAotCQkJCSAgICAgICBzaXplb2YoKnBkZXZfZGF0YSkpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCAmcGRldl9kYXRhLAorCQkJCSAgICAgICBzaXplb2YocGRldl9kYXRhKSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJZ290byBvdXRfZGV2X3B1dDsKQEAgLTQwNiw5ICs0MDIsNiBAQAogb3V0X2ZyZWVfZ2x1ZToKIAlrZnJlZShnbHVlKTsKIAotb3V0X2ZyZWVfcGRldl9kYXRhOgotCWtmcmVlKHBkZXZfZGF0YSk7Ci0KIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZV9pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaAppbmRleCA3NTZlODkwLi5jMmMzNGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaApAQCAtNTEyLDggKzUxMiw4IEBACiB2b2lkIHdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3bDEyNzEgKndsKTsKIHNpemVfdCB3bDEyeHhfY29weV9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggKm1lbWJsb2NrLCBzaXplX3QgbWF4bGVuKTsKIGludCB3bDEyNzFfcnhfZmlsdGVyX2FsbG9jX2ZpZWxkKHN0cnVjdCB3bDEyeHhfcnhfZmlsdGVyICpmaWx0ZXIsCi0JCQkJCXUxNiBvZmZzZXQsIHU4IGZsYWdzLAotCQkJCQl1OCAqcGF0dGVybiwgdTggbGVuKTsKKwkJCQkgdTE2IG9mZnNldCwgdTggZmxhZ3MsCisJCQkJIGNvbnN0IHU4ICpwYXR0ZXJuLCB1OCBsZW4pOwogdm9pZCB3bDEyNzFfcnhfZmlsdGVyX2ZyZWUoc3RydWN0IHdsMTJ4eF9yeF9maWx0ZXIgKmZpbHRlcik7CiBzdHJ1Y3Qgd2wxMnh4X3J4X2ZpbHRlciAqd2wxMjcxX3J4X2ZpbHRlcl9hbGxvYyh2b2lkKTsKIGludCB3bDEyNzFfcnhfZmlsdGVyX2dldF9maWVsZHNfc2l6ZShzdHJ1Y3Qgd2wxMnh4X3J4X2ZpbHRlciAqZmlsdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKaW5kZXggMGQ0YTI4NS4uNGRkN2M0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKQEAgLTk5LDIyICs5OSw0MyBAQAogICovCiAjZGVmaW5lIFhFTl9ORVRCS19MRUdBQ1lfU0xPVFNfTUFYIFhFTl9ORVRJRl9OUl9TTE9UU19NSU4KIAotc3RydWN0IHhlbnZpZiB7Ci0JLyogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW50ZXJmYWNlLiAqLwotCWRvbWlkX3QgICAgICAgICAgZG9taWQ7Ci0JdW5zaWduZWQgaW50ICAgICBoYW5kbGU7CisvKiBRdWV1ZSBuYW1lIGlzIGludGVyZmFjZSBuYW1lIHdpdGggIi1xTk5OIiBhcHBlbmRlZCAqLworI2RlZmluZSBRVUVVRV9OQU1FX1NJWkUgKElGTkFNU0laICsgNSkKIAotCS8qIElzIHRoaXMgaW50ZXJmYWNlIGRpc2FibGVkPyBUcnVlIHdoZW4gYmFja2VuZCBkaXNjb3ZlcnMKLQkgKiBmcm9udGVuZCBpcyByb2d1ZS4KKy8qIElSUSBuYW1lIGlzIHF1ZXVlIG5hbWUgd2l0aCAiLXR4IiBvciAiLXJ4IiBhcHBlbmRlZCAqLworI2RlZmluZSBJUlFfTkFNRV9TSVpFIChRVUVVRV9OQU1FX1NJWkUgKyAzKQorCitzdHJ1Y3QgeGVudmlmOworCitzdHJ1Y3QgeGVudmlmX3N0YXRzIHsKKwkvKiBTdGF0cyBmaWVsZHMgdG8gYmUgdXBkYXRlZCBwZXItcXVldWUuCisJICogQSBzdWJzZXQgb2Ygc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgdGhhdCBjb250YWlucyBvbmx5IHRoZQorCSAqIGZpZWxkcyB0aGF0IGFyZSB1cGRhdGVkIGluIG5ldGJhY2suYyBmb3IgZWFjaCBxdWV1ZS4KIAkgKi8KLQlib29sIGRpc2FibGVkOworCXVuc2lnbmVkIGludCByeF9ieXRlczsKKwl1bnNpZ25lZCBpbnQgcnhfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQgdHhfYnl0ZXM7CisJdW5zaWduZWQgaW50IHR4X3BhY2tldHM7CisKKwkvKiBBZGRpdGlvbmFsIHN0YXRzIHVzZWQgYnkgeGVudmlmICovCisJdW5zaWduZWQgbG9uZyByeF9nc29fY2hlY2tzdW1fZml4dXA7CisJdW5zaWduZWQgbG9uZyB0eF96ZXJvY29weV9zZW50OworCXVuc2lnbmVkIGxvbmcgdHhfemVyb2NvcHlfc3VjY2VzczsKKwl1bnNpZ25lZCBsb25nIHR4X3plcm9jb3B5X2ZhaWw7CisJdW5zaWduZWQgbG9uZyB0eF9mcmFnX292ZXJmbG93OworfTsKKworc3RydWN0IHhlbnZpZl9xdWV1ZSB7IC8qIFBlci1xdWV1ZSBkYXRhIGZvciB4ZW52aWYgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7IC8qIFF1ZXVlIElELCAwLWJhc2VkICovCisJY2hhciBuYW1lW1FVRVVFX05BTUVfU0laRV07IC8qIERFVk5BTUUtcU4gKi8KKwlzdHJ1Y3QgeGVudmlmICp2aWY7IC8qIFBhcmVudCBWSUYgKi8KIAogCS8qIFVzZSBOQVBJIGZvciBndWVzdCBUWCAqLwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwogCS8qIFdoZW4gZmVhdHVyZS1zcGxpdC1ldmVudC1jaGFubmVscyA9IDAsIHR4X2lycSA9IHJ4X2lycS4gKi8KIAl1bnNpZ25lZCBpbnQgdHhfaXJxOwogCS8qIE9ubHkgdXNlZCB3aGVuIGZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMgPSAxICovCi0JY2hhciB0eF9pcnFfbmFtZVtJRk5BTVNJWis0XTsgLyogREVWTkFNRS10eCAqLworCWNoYXIgdHhfaXJxX25hbWVbSVJRX05BTUVfU0laRV07IC8qIERFVk5BTUUtcU4tdHggKi8KIAlzdHJ1Y3QgeGVuX25ldGlmX3R4X2JhY2tfcmluZyB0eDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOwogCXN0cnVjdCBwYWdlICptbWFwX3BhZ2VzW01BWF9QRU5ESU5HX1JFUVNdOwpAQCAtMTUwLDcgKzE3MSw3IEBACiAJLyogV2hlbiBmZWF0dXJlLXNwbGl0LWV2ZW50LWNoYW5uZWxzID0gMCwgdHhfaXJxID0gcnhfaXJxLiAqLwogCXVuc2lnbmVkIGludCByeF9pcnE7CiAJLyogT25seSB1c2VkIHdoZW4gZmVhdHVyZS1zcGxpdC1ldmVudC1jaGFubmVscyA9IDEgKi8KLQljaGFyIHJ4X2lycV9uYW1lW0lGTkFNU0laKzRdOyAvKiBERVZOQU1FLXJ4ICovCisJY2hhciByeF9pcnFfbmFtZVtJUlFfTkFNRV9TSVpFXTsgLyogREVWTkFNRS1xTi1yeCAqLwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfYmFja19yaW5nIHJ4OwogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfcXVldWU7CiAJUklOR19JRFggcnhfbGFzdF9za2Jfc2xvdHM7CkBAIC0xNTgsMTQgKzE3OSwyOSBAQAogCiAJc3RydWN0IHRpbWVyX2xpc3Qgd2FrZV9xdWV1ZTsKIAotCS8qIFRoaXMgYXJyYXkgaXMgYWxsb2NhdGVkIHNlcGVyYXRlbHkgYXMgaXQgaXMgbGFyZ2UgKi8KLQlzdHJ1Y3QgZ250dGFiX2NvcHkgKmdyYW50X2NvcHlfb3A7CisJc3RydWN0IGdudHRhYl9jb3B5IGdyYW50X2NvcHlfb3BbTUFYX0dSQU5UX0NPUFlfT1BTXTsKIAogCS8qIFdlIGNyZWF0ZSBvbmUgbWV0YSBzdHJ1Y3R1cmUgcGVyIHJpbmcgcmVxdWVzdCB3ZSBjb25zdW1lLCBzbwogCSAqIHRoZSBtYXhpbXVtIG51bWJlciBpcyB0aGUgc2FtZSBhcyB0aGUgcmluZyBzaXplLgogCSAqLwogCXN0cnVjdCB4ZW52aWZfcnhfbWV0YSBtZXRhW1hFTl9ORVRJRl9SWF9SSU5HX1NJWkVdOwogCisJLyogVHJhbnNtaXQgc2hhcGluZzogYWxsb3cgJ2NyZWRpdF9ieXRlcycgZXZlcnkgJ2NyZWRpdF91c2VjJy4gKi8KKwl1bnNpZ25lZCBsb25nICAgY3JlZGl0X2J5dGVzOworCXVuc2lnbmVkIGxvbmcgICBjcmVkaXRfdXNlYzsKKwl1bnNpZ25lZCBsb25nICAgcmVtYWluaW5nX2NyZWRpdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcmVkaXRfdGltZW91dDsKKwl1NjQgY3JlZGl0X3dpbmRvd19zdGFydDsKKworCS8qIFN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgeGVudmlmX3N0YXRzIHN0YXRzOworfTsKKworc3RydWN0IHhlbnZpZiB7CisJLyogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW50ZXJmYWNlLiAqLworCWRvbWlkX3QgICAgICAgICAgZG9taWQ7CisJdW5zaWduZWQgaW50ICAgICBoYW5kbGU7CisKIAl1OCAgICAgICAgICAgICAgIGZlX2Rldl9hZGRyWzZdOwogCiAJLyogRnJvbnRlbmQgZmVhdHVyZSBpbmZvcm1hdGlvbi4gKi8KQEAgLTE3OSwxOSArMjE1LDEzIEBACiAJLyogSW50ZXJuYWwgZmVhdHVyZSBpbmZvcm1hdGlvbi4gKi8KIAl1OCBjYW5fcXVldWU6MTsJICAgIC8qIGNhbiBxdWV1ZSBwYWNrZXRzIGZvciByZWNlaXZlcj8gKi8KIAotCS8qIFRyYW5zbWl0IHNoYXBpbmc6IGFsbG93ICdjcmVkaXRfYnl0ZXMnIGV2ZXJ5ICdjcmVkaXRfdXNlYycuICovCi0JdW5zaWduZWQgbG9uZyAgIGNyZWRpdF9ieXRlczsKLQl1bnNpZ25lZCBsb25nICAgY3JlZGl0X3VzZWM7Ci0JdW5zaWduZWQgbG9uZyAgIHJlbWFpbmluZ19jcmVkaXQ7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgY3JlZGl0X3RpbWVvdXQ7Ci0JdTY0IGNyZWRpdF93aW5kb3dfc3RhcnQ7CisJLyogSXMgdGhpcyBpbnRlcmZhY2UgZGlzYWJsZWQ/IFRydWUgd2hlbiBiYWNrZW5kIGRpc2NvdmVycworCSAqIGZyb250ZW5kIGlzIHJvZ3VlLgorCSAqLworCWJvb2wgZGlzYWJsZWQ7CiAKLQkvKiBTdGF0aXN0aWNzICovCi0JdW5zaWduZWQgbG9uZyByeF9nc29fY2hlY2tzdW1fZml4dXA7Ci0JdW5zaWduZWQgbG9uZyB0eF96ZXJvY29weV9zZW50OwotCXVuc2lnbmVkIGxvbmcgdHhfemVyb2NvcHlfc3VjY2VzczsKLQl1bnNpZ25lZCBsb25nIHR4X3plcm9jb3B5X2ZhaWw7Ci0JdW5zaWduZWQgbG9uZyB0eF9mcmFnX292ZXJmbG93OworCS8qIFF1ZXVlcyAqLworCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlczsKIAogCS8qIE1pc2NlbGxhbmVvdXMgcHJpdmF0ZSBzdHVmZi4gKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjA2LDcgKzIzNiwxMCBAQAogCQkJICAgIGRvbWlkX3QgZG9taWQsCiAJCQkgICAgdW5zaWduZWQgaW50IGhhbmRsZSk7CiAKLWludCB4ZW52aWZfY29ubmVjdChzdHJ1Y3QgeGVudmlmICp2aWYsIHVuc2lnbmVkIGxvbmcgdHhfcmluZ19yZWYsCitpbnQgeGVudmlmX2luaXRfcXVldWUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpOwordm9pZCB4ZW52aWZfZGVpbml0X3F1ZXVlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKTsKKworaW50IHhlbnZpZl9jb25uZWN0KHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLCB1bnNpZ25lZCBsb25nIHR4X3JpbmdfcmVmLAogCQkgICB1bnNpZ25lZCBsb25nIHJ4X3JpbmdfcmVmLCB1bnNpZ25lZCBpbnQgdHhfZXZ0Y2huLAogCQkgICB1bnNpZ25lZCBpbnQgcnhfZXZ0Y2huKTsKIHZvaWQgeGVudmlmX2Rpc2Nvbm5lY3Qoc3RydWN0IHhlbnZpZiAqdmlmKTsKQEAgLTIxNyw0NCArMjUwLDQ3IEBACiAKIGludCB4ZW52aWZfc2NoZWR1bGFibGUoc3RydWN0IHhlbnZpZiAqdmlmKTsKIAotaW50IHhlbnZpZl9tdXN0X3N0b3BfcXVldWUoc3RydWN0IHhlbnZpZiAqdmlmKTsKK2ludCB4ZW52aWZfbXVzdF9zdG9wX3F1ZXVlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKTsKKworaW50IHhlbnZpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKTsKK3ZvaWQgeGVudmlmX3dha2VfcXVldWUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpOwogCiAvKiAoVW4pTWFwIGNvbW11bmljYXRpb24gcmluZ3MuICovCi12b2lkIHhlbnZpZl91bm1hcF9mcm9udGVuZF9yaW5ncyhzdHJ1Y3QgeGVudmlmICp2aWYpOwotaW50IHhlbnZpZl9tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZiAqdmlmLAordm9pZCB4ZW52aWZfdW5tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpOworaW50IHhlbnZpZl9tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgICBncmFudF9yZWZfdCB0eF9yaW5nX3JlZiwKIAkJCSAgICAgIGdyYW50X3JlZl90IHJ4X3JpbmdfcmVmKTsKIAogLyogQ2hlY2sgZm9yIFNLQnMgZnJvbSBmcm9udGVuZCBhbmQgc2NoZWR1bGUgYmFja2VuZCBwcm9jZXNzaW5nICovCi12b2lkIHhlbnZpZl9uYXBpX3NjaGVkdWxlX29yX2VuYWJsZV9ldmVudHMoc3RydWN0IHhlbnZpZiAqdmlmKTsKK3ZvaWQgeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSk7CiAKIC8qIFByZXZlbnQgdGhlIGRldmljZSBmcm9tIGdlbmVyYXRpbmcgYW55IGZ1cnRoZXIgdHJhZmZpYy4gKi8KIHZvaWQgeGVudmlmX2NhcnJpZXJfb2ZmKHN0cnVjdCB4ZW52aWYgKnZpZik7CiAKLWludCB4ZW52aWZfdHhfYWN0aW9uKHN0cnVjdCB4ZW52aWYgKnZpZiwgaW50IGJ1ZGdldCk7CitpbnQgeGVudmlmX3R4X2FjdGlvbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgaW50IGJ1ZGdldCk7CiAKIGludCB4ZW52aWZfa3RocmVhZF9ndWVzdF9yeCh2b2lkICpkYXRhKTsKLXZvaWQgeGVudmlmX2tpY2tfdGhyZWFkKHN0cnVjdCB4ZW52aWYgKnZpZik7Cit2b2lkIHhlbnZpZl9raWNrX3RocmVhZChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSk7CiAKIGludCB4ZW52aWZfZGVhbGxvY19rdGhyZWFkKHZvaWQgKmRhdGEpOwogCiAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbmVlZGVkIG51bWJlciBvZiBzbG90cyAocmVxKSBhcmUgYXZhaWxhYmxlLAogICogYW5kIHNldCByZXFfZXZlbnQgaWYgbm90LgogICovCi1ib29sIHhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShzdHJ1Y3QgeGVudmlmICp2aWYsIGludCBuZWVkZWQpOworYm9vbCB4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIGludCBuZWVkZWQpOwogCi12b2lkIHhlbnZpZl9zdG9wX3F1ZXVlKHN0cnVjdCB4ZW52aWYgKnZpZik7Cit2b2lkIHhlbnZpZl9jYXJyaWVyX29uKHN0cnVjdCB4ZW52aWYgKnZpZik7CiAKIC8qIENhbGxiYWNrIGZyb20gc3RhY2sgd2hlbiBUWCBwYWNrZXQgY2FuIGJlIHJlbGVhc2VkICovCiB2b2lkIHhlbnZpZl96ZXJvY29weV9jYWxsYmFjayhzdHJ1Y3QgdWJ1Zl9pbmZvICp1YnVmLCBib29sIHplcm9jb3B5X3N1Y2Nlc3MpOwogCiAvKiBVbm1hcCBhIHBlbmRpbmcgcGFnZSBhbmQgcmVsZWFzZSBpdCBiYWNrIHRvIHRoZSBndWVzdCAqLwotdm9pZCB4ZW52aWZfaWR4X3VubWFwKHN0cnVjdCB4ZW52aWYgKnZpZiwgdTE2IHBlbmRpbmdfaWR4KTsKK3ZvaWQgeGVudmlmX2lkeF91bm1hcChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgdTE2IHBlbmRpbmdfaWR4KTsKIAotc3RhdGljIGlubGluZSBwZW5kaW5nX3JpbmdfaWR4X3QgbnJfcGVuZGluZ19yZXFzKHN0cnVjdCB4ZW52aWYgKnZpZikKK3N0YXRpYyBpbmxpbmUgcGVuZGluZ19yaW5nX2lkeF90IG5yX3BlbmRpbmdfcmVxcyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIHsKIAlyZXR1cm4gTUFYX1BFTkRJTkdfUkVRUyAtCi0JCXZpZi0+cGVuZGluZ19wcm9kICsgdmlmLT5wZW5kaW5nX2NvbnM7CisJCXF1ZXVlLT5wZW5kaW5nX3Byb2QgKyBxdWV1ZS0+cGVuZGluZ19jb25zOwogfQogCiAvKiBDYWxsYmFjayBmcm9tIHN0YWNrIHdoZW4gVFggcGFja2V0IGNhbiBiZSByZWxlYXNlZCAqLwpAQCAtMjY0LDUgKzMwMCw2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgcnhfZHJhaW5fdGltZW91dF9tc2VjczsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcnhfZHJhaW5fdGltZW91dF9qaWZmaWVzOworZXh0ZXJuIHVuc2lnbmVkIGludCB4ZW52aWZfbWF4X3F1ZXVlczsKIAogI2VuZGlmIC8qIF9fWEVOX05FVEJBQ0tfX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKaW5kZXggMjBlOWRlZi4uODUyZGEzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKQEAgLTQzLDYgKzQzLDE2IEBACiAjZGVmaW5lIFhFTlZJRl9RVUVVRV9MRU5HVEggMzIKICNkZWZpbmUgWEVOVklGX05BUElfV0VJR0hUICA2NAogCitzdGF0aWMgaW5saW5lIHZvaWQgeGVudmlmX3N0b3BfcXVldWUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT52aWYtPmRldjsKKworCWlmICghcXVldWUtPnZpZi0+Y2FuX3F1ZXVlKQorCQlyZXR1cm47CisKKwluZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxdWV1ZS0+aWQpKTsKK30KKwogaW50IHhlbnZpZl9zY2hlZHVsYWJsZShzdHJ1Y3QgeGVudmlmICp2aWYpCiB7CiAJcmV0dXJuIG5ldGlmX3J1bm5pbmcodmlmLT5kZXYpICYmIG5ldGlmX2NhcnJpZXJfb2sodmlmLT5kZXYpOwpAQCAtNTAsMzMgKzYwLDM0IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB4ZW52aWZfdHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgeGVudmlmICp2aWYgPSBkZXZfaWQ7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSBkZXZfaWQ7CiAKLQlpZiAoUklOR19IQVNfVU5DT05TVU1FRF9SRVFVRVNUUygmdmlmLT50eCkpCi0JCW5hcGlfc2NoZWR1bGUoJnZpZi0+bmFwaSk7CisJaWYgKFJJTkdfSEFTX1VOQ09OU1VNRURfUkVRVUVTVFMoJnF1ZXVlLT50eCkpCisJCW5hcGlfc2NoZWR1bGUoJnF1ZXVlLT5uYXBpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCB4ZW52aWZfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCitpbnQgeGVudmlmX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCB4ZW52aWYgKnZpZiA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgeGVudmlmLCBuYXBpKTsKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9CisJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgeGVudmlmX3F1ZXVlLCBuYXBpKTsKIAlpbnQgd29ya19kb25lOwogCiAJLyogVGhpcyB2aWYgaXMgcm9ndWUsIHdlIHByZXRlbmQgd2UndmUgdGhlcmUgaXMgbm90aGluZyB0byBkbwogCSAqIGZvciB0aGlzIHZpZiB0byBkZXNjaGVkdWxlIGl0IGZyb20gTkFQSS4gQnV0IHRoaXMgaW50ZXJmYWNlCiAJICogd2lsbCBiZSB0dXJuZWQgb2ZmIGluIHRocmVhZCBjb250ZXh0IGxhdGVyLgogCSAqLwotCWlmICh1bmxpa2VseSh2aWYtPmRpc2FibGVkKSkgeworCWlmICh1bmxpa2VseShxdWV1ZS0+dmlmLT5kaXNhYmxlZCkpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jd29ya19kb25lID0geGVudmlmX3R4X2FjdGlvbih2aWYsIGJ1ZGdldCk7CisJd29ya19kb25lID0geGVudmlmX3R4X2FjdGlvbihxdWV1ZSwgYnVkZ2V0KTsKIAogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyh2aWYpOworCQl4ZW52aWZfbmFwaV9zY2hlZHVsZV9vcl9lbmFibGVfZXZlbnRzKHF1ZXVlKTsKIAl9CiAKIAlyZXR1cm4gd29ya19kb25lOwpAQCAtODQsOSArOTUsOSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVudmlmX3J4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gZGV2X2lkOworCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlID0gZGV2X2lkOwogCi0JeGVudmlmX2tpY2tfdGhyZWFkKHZpZik7CisJeGVudmlmX2tpY2tfdGhyZWFkKHF1ZXVlKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTk5LDI4ICsxMTAsODAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHhlbnZpZl93YWtlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK2ludCB4ZW52aWZfcXVldWVfc3RvcHBlZChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIHsKLQlzdHJ1Y3QgeGVudmlmICp2aWYgPSAoc3RydWN0IHhlbnZpZiAqKWRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT52aWYtPmRldjsKKwl1bnNpZ25lZCBpbnQgaWQgPSBxdWV1ZS0+aWQ7CisJcmV0dXJuIG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIGlkKSk7Cit9CiAKLQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCh2aWYtPmRldikpIHsKLQkJbmV0ZGV2X2Vycih2aWYtPmRldiwgImRyYWluaW5nIFRYIHF1ZXVlXG4iKTsKLQkJdmlmLT5yeF9xdWV1ZV9wdXJnZSA9IHRydWU7Ci0JCXhlbnZpZl9raWNrX3RocmVhZCh2aWYpOwotCQluZXRpZl93YWtlX3F1ZXVlKHZpZi0+ZGV2KTsKK3ZvaWQgeGVudmlmX3dha2VfcXVldWUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT52aWYtPmRldjsKKwl1bnNpZ25lZCBpbnQgaWQgPSBxdWV1ZS0+aWQ7CisJbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaWQpKTsKK30KKworLyogQ2FsbGJhY2sgdG8gd2FrZSB0aGUgcXVldWUgYW5kIGRyYWluIGl0IG9uIHRpbWVvdXQgKi8KK3N0YXRpYyB2b2lkIHhlbnZpZl93YWtlX3F1ZXVlX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IChzdHJ1Y3QgeGVudmlmX3F1ZXVlICopZGF0YTsKKworCWlmICh4ZW52aWZfcXVldWVfc3RvcHBlZChxdWV1ZSkpIHsKKwkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsICJkcmFpbmluZyBUWCBxdWV1ZVxuIik7CisJCXF1ZXVlLT5yeF9xdWV1ZV9wdXJnZSA9IHRydWU7CisJCXhlbnZpZl9raWNrX3RocmVhZChxdWV1ZSk7CisJCXhlbnZpZl93YWtlX3F1ZXVlKHF1ZXVlKTsKIAl9CiB9CiAKK3N0YXRpYyB1MTYgeGVudmlmX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHZvaWQgKmFjY2VsX3ByaXYsIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQoreworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdTMyIGhhc2g7CisJdTE2IHF1ZXVlX2luZGV4OworCisJLyogRmlyc3QsIGNoZWNrIGlmIHRoZXJlIGlzIG9ubHkgb25lIHF1ZXVlIHRvIG9wdGltaXNlIHRoZQorCSAqIHNpbmdsZS1xdWV1ZSBvciBvbGQgZnJvbnRlbmQgc2NlbmFyaW8uCisJICovCisJaWYgKG51bV9xdWV1ZXMgPT0gMSkgeworCQlxdWV1ZV9pbmRleCA9IDA7CisJfSBlbHNlIHsKKwkJLyogVXNlIHNrYl9nZXRfaGFzaCB0byBvYnRhaW4gYW4gTDQgaGFzaCBpZiBhdmFpbGFibGUgKi8KKwkJaGFzaCA9IHNrYl9nZXRfaGFzaChza2IpOworCQlxdWV1ZV9pbmRleCA9IGhhc2ggJSBudW1fcXVldWVzOworCX0KKworCXJldHVybiBxdWV1ZV9pbmRleDsKK30KKwogc3RhdGljIGludCB4ZW52aWZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB4ZW52aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSBOVUxMOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdTE2IGluZGV4OwogCWludCBtaW5fc2xvdHNfbmVlZGVkOwogCiAJQlVHX09OKHNrYi0+ZGV2ICE9IGRldik7CiAKLQkvKiBEcm9wIHRoZSBwYWNrZXQgaWYgdmlmIGlzIG5vdCByZWFkeSAqLwotCWlmICh2aWYtPnRhc2sgPT0gTlVMTCB8fAotCSAgICB2aWYtPmRlYWxsb2NfdGFzayA9PSBOVUxMIHx8CisJLyogRHJvcCB0aGUgcGFja2V0IGlmIHF1ZXVlcyBhcmUgbm90IHNldCB1cCAqLworCWlmIChudW1fcXVldWVzIDwgMSkKKwkJZ290byBkcm9wOworCisJLyogT2J0YWluIHRoZSBxdWV1ZSB0byBiZSB1c2VkIHRvIHRyYW5zbWl0IHRoaXMgcGFja2V0ICovCisJaW5kZXggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwlpZiAoaW5kZXggPj0gbnVtX3F1ZXVlcykgeworCQlwcl93YXJuX3JhdGVsaW1pdGVkKCJJbnZhbGlkIHF1ZXVlICVodSBmb3IgcGFja2V0IG9uIGludGVyZmFjZSAlc1xuLiIsCisJCQkJICAgIGluZGV4LCB2aWYtPmRldi0+bmFtZSk7CisJCWluZGV4ICU9IG51bV9xdWV1ZXM7CisJfQorCXF1ZXVlID0gJnZpZi0+cXVldWVzW2luZGV4XTsKKworCS8qIERyb3AgdGhlIHBhY2tldCBpZiBxdWV1ZSBpcyBub3QgcmVhZHkgKi8KKwlpZiAocXVldWUtPnRhc2sgPT0gTlVMTCB8fAorCSAgICBxdWV1ZS0+ZGVhbGxvY190YXNrID09IE5VTEwgfHwKIAkgICAgIXhlbnZpZl9zY2hlZHVsYWJsZSh2aWYpKQogCQlnb3RvIGRyb3A7CiAKQEAgLTEzOSwxNiArMjAyLDE2IEBACiAJICogdGhlbiB0dXJuIG9mZiB0aGUgcXVldWUgdG8gZ2l2ZSB0aGUgcmluZyBhIGNoYW5jZSB0bwogCSAqIGRyYWluLgogCSAqLwotCWlmICgheGVudmlmX3J4X3Jpbmdfc2xvdHNfYXZhaWxhYmxlKHZpZiwgbWluX3Nsb3RzX25lZWRlZCkpIHsKLQkJdmlmLT53YWtlX3F1ZXVlLmZ1bmN0aW9uID0geGVudmlmX3dha2VfcXVldWU7Ci0JCXZpZi0+d2FrZV9xdWV1ZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdmlmOwotCQl4ZW52aWZfc3RvcF9xdWV1ZSh2aWYpOwotCQltb2RfdGltZXIoJnZpZi0+d2FrZV9xdWV1ZSwKKwlpZiAoIXhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShxdWV1ZSwgbWluX3Nsb3RzX25lZWRlZCkpIHsKKwkJcXVldWUtPndha2VfcXVldWUuZnVuY3Rpb24gPSB4ZW52aWZfd2FrZV9xdWV1ZV9jYWxsYmFjazsKKwkJcXVldWUtPndha2VfcXVldWUuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXF1ZXVlOworCQl4ZW52aWZfc3RvcF9xdWV1ZShxdWV1ZSk7CisJCW1vZF90aW1lcigmcXVldWUtPndha2VfcXVldWUsCiAJCQlqaWZmaWVzICsgcnhfZHJhaW5fdGltZW91dF9qaWZmaWVzKTsKIAl9CiAKLQlza2JfcXVldWVfdGFpbCgmdmlmLT5yeF9xdWV1ZSwgc2tiKTsKLQl4ZW52aWZfa2lja190aHJlYWQodmlmKTsKKwlza2JfcXVldWVfdGFpbCgmcXVldWUtPnJ4X3F1ZXVlLCBza2IpOworCXhlbnZpZl9raWNrX3RocmVhZChxdWV1ZSk7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCkBAIC0xNjEsMjUgKzIyNCw2NSBAQAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4ZW52aWZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHhlbnZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHMgPSAwOworCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0cyA9IDA7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJaWYgKHZpZi0+cXVldWVzID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogQWdncmVnYXRlIHR4IGFuZCByeCBzdGF0cyBmcm9tIGVhY2ggcXVldWUgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fcXVldWVzOyArK2luZGV4KSB7CisJCXF1ZXVlID0gJnZpZi0+cXVldWVzW2luZGV4XTsKKwkJcnhfYnl0ZXMgKz0gcXVldWUtPnN0YXRzLnJ4X2J5dGVzOworCQlyeF9wYWNrZXRzICs9IHF1ZXVlLT5zdGF0cy5yeF9wYWNrZXRzOworCQl0eF9ieXRlcyArPSBxdWV1ZS0+c3RhdHMudHhfYnl0ZXM7CisJCXR4X3BhY2tldHMgKz0gcXVldWUtPnN0YXRzLnR4X3BhY2tldHM7CisJfQorCitvdXQ6CisJdmlmLT5kZXYtPnN0YXRzLnJ4X2J5dGVzID0gcnhfYnl0ZXM7CisJdmlmLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMgPSByeF9wYWNrZXRzOworCXZpZi0+ZGV2LT5zdGF0cy50eF9ieXRlcyA9IHR4X2J5dGVzOworCXZpZi0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzID0gdHhfcGFja2V0czsKKwogCXJldHVybiAmdmlmLT5kZXYtPnN0YXRzOwogfQogCiBzdGF0aWMgdm9pZCB4ZW52aWZfdXAoc3RydWN0IHhlbnZpZiAqdmlmKQogewotCW5hcGlfZW5hYmxlKCZ2aWYtPm5hcGkpOwotCWVuYWJsZV9pcnEodmlmLT50eF9pcnEpOwotCWlmICh2aWYtPnR4X2lycSAhPSB2aWYtPnJ4X2lycSkKLQkJZW5hYmxlX2lycSh2aWYtPnJ4X2lycSk7Ci0JeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyh2aWYpOworCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IHZpZi0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IHF1ZXVlX2luZGV4OworCisJZm9yIChxdWV1ZV9pbmRleCA9IDA7IHF1ZXVlX2luZGV4IDwgbnVtX3F1ZXVlczsgKytxdWV1ZV9pbmRleCkgeworCQlxdWV1ZSA9ICZ2aWYtPnF1ZXVlc1txdWV1ZV9pbmRleF07CisJCW5hcGlfZW5hYmxlKCZxdWV1ZS0+bmFwaSk7CisJCWVuYWJsZV9pcnEocXVldWUtPnR4X2lycSk7CisJCWlmIChxdWV1ZS0+dHhfaXJxICE9IHF1ZXVlLT5yeF9pcnEpCisJCQllbmFibGVfaXJxKHF1ZXVlLT5yeF9pcnEpOworCQl4ZW52aWZfbmFwaV9zY2hlZHVsZV9vcl9lbmFibGVfZXZlbnRzKHF1ZXVlKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHhlbnZpZl9kb3duKHN0cnVjdCB4ZW52aWYgKnZpZikKIHsKLQluYXBpX2Rpc2FibGUoJnZpZi0+bmFwaSk7Ci0JZGlzYWJsZV9pcnEodmlmLT50eF9pcnEpOwotCWlmICh2aWYtPnR4X2lycSAhPSB2aWYtPnJ4X2lycSkKLQkJZGlzYWJsZV9pcnEodmlmLT5yeF9pcnEpOwotCWRlbF90aW1lcl9zeW5jKCZ2aWYtPmNyZWRpdF90aW1lb3V0KTsKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSB2aWYtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzOworCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleDsKKworCWZvciAocXVldWVfaW5kZXggPSAwOyBxdWV1ZV9pbmRleCA8IG51bV9xdWV1ZXM7ICsrcXVldWVfaW5kZXgpIHsKKwkJcXVldWUgPSAmdmlmLT5xdWV1ZXNbcXVldWVfaW5kZXhdOworCQluYXBpX2Rpc2FibGUoJnF1ZXVlLT5uYXBpKTsKKwkJZGlzYWJsZV9pcnEocXVldWUtPnR4X2lycSk7CisJCWlmIChxdWV1ZS0+dHhfaXJxICE9IHF1ZXVlLT5yeF9pcnEpCisJCQlkaXNhYmxlX2lycShxdWV1ZS0+cnhfaXJxKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnF1ZXVlLT5jcmVkaXRfdGltZW91dCk7CisJfQogfQogCiBzdGF0aWMgaW50IHhlbnZpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xODcsNyArMjkwLDcgQEAKIAlzdHJ1Y3QgeGVudmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCXhlbnZpZl91cCh2aWYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTYsNyArMjk5LDcgQEAKIAlzdHJ1Y3QgeGVudmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCXhlbnZpZl9kb3duKHZpZik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzYsMjkgKzMzOSwyOSBAQAogfSB4ZW52aWZfc3RhdHNbXSA9IHsKIAl7CiAJCSJyeF9nc29fY2hlY2tzdW1fZml4dXAiLAotCQlvZmZzZXRvZihzdHJ1Y3QgeGVudmlmLCByeF9nc29fY2hlY2tzdW1fZml4dXApCisJCW9mZnNldG9mKHN0cnVjdCB4ZW52aWZfc3RhdHMsIHJ4X2dzb19jaGVja3N1bV9maXh1cCkKIAl9LAogCS8qIElmIChzZW50ICE9IHN1Y2Nlc3MgKyBmYWlsKSwgdGhlcmUgYXJlIHByb2JhYmx5IHBhY2tldHMgbmV2ZXIKIAkgKiBmcmVlZCB1cCBwcm9wZXJseSEKIAkgKi8KIAl7CiAJCSJ0eF96ZXJvY29weV9zZW50IiwKLQkJb2Zmc2V0b2Yoc3RydWN0IHhlbnZpZiwgdHhfemVyb2NvcHlfc2VudCksCisJCW9mZnNldG9mKHN0cnVjdCB4ZW52aWZfc3RhdHMsIHR4X3plcm9jb3B5X3NlbnQpLAogCX0sCiAJewogCQkidHhfemVyb2NvcHlfc3VjY2VzcyIsCi0JCW9mZnNldG9mKHN0cnVjdCB4ZW52aWYsIHR4X3plcm9jb3B5X3N1Y2Nlc3MpLAorCQlvZmZzZXRvZihzdHJ1Y3QgeGVudmlmX3N0YXRzLCB0eF96ZXJvY29weV9zdWNjZXNzKSwKIAl9LAogCXsKIAkJInR4X3plcm9jb3B5X2ZhaWwiLAotCQlvZmZzZXRvZihzdHJ1Y3QgeGVudmlmLCB0eF96ZXJvY29weV9mYWlsKQorCQlvZmZzZXRvZihzdHJ1Y3QgeGVudmlmX3N0YXRzLCB0eF96ZXJvY29weV9mYWlsKQogCX0sCiAJLyogTnVtYmVyIG9mIHBhY2tldHMgZXhjZWVkaW5nIE1BWF9TS0JfRlJBRyBzbG90cy4gWW91IHNob3VsZCB1c2UKIAkgKiBhIGd1ZXN0IHdpdGggdGhlIHNhbWUgTUFYX1NLQl9GUkFHCiAJICovCiAJewogCQkidHhfZnJhZ19vdmVyZmxvdyIsCi0JCW9mZnNldG9mKHN0cnVjdCB4ZW52aWYsIHR4X2ZyYWdfb3ZlcmZsb3cpCisJCW9mZnNldG9mKHN0cnVjdCB4ZW52aWZfc3RhdHMsIHR4X2ZyYWdfb3ZlcmZsb3cpCiAJfSwKIH07CiAKQEAgLTI3NSwxMSArMzc4LDIwIEBACiBzdGF0aWMgdm9pZCB4ZW52aWZfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICogZGF0YSkKIHsKLQl2b2lkICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB4ZW52aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKIAlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcXVldWVfaW5kZXg7CisJc3RydWN0IHhlbnZpZl9zdGF0cyAqdmlmX3N0YXRzOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGVudmlmX3N0YXRzKTsgaSsrKQotCQlkYXRhW2ldID0gKih1bnNpZ25lZCBsb25nICopKHZpZiArIHhlbnZpZl9zdGF0c1tpXS5vZmZzZXQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhlbnZpZl9zdGF0cyk7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGFjY3VtID0gMDsKKwkJZm9yIChxdWV1ZV9pbmRleCA9IDA7IHF1ZXVlX2luZGV4IDwgbnVtX3F1ZXVlczsgKytxdWV1ZV9pbmRleCkgeworCQkJdmlmX3N0YXRzID0gJnZpZi0+cXVldWVzW3F1ZXVlX2luZGV4XS5zdGF0czsKKwkJCWFjY3VtICs9ICoodW5zaWduZWQgbG9uZyAqKSh2aWZfc3RhdHMgKyB4ZW52aWZfc3RhdHNbaV0ub2Zmc2V0KTsKKwkJfQorCQlkYXRhW2ldID0gYWNjdW07CisJfQogfQogCiBzdGF0aWMgdm9pZCB4ZW52aWZfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBkYXRhKQpAQCAtMzEyLDYgKzQyNCw3IEBACiAJLm5kb19maXhfZmVhdHVyZXMgPSB4ZW52aWZfZml4X2ZlYXR1cmVzLAogCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAogCS5uZG9fdmFsaWRhdGVfYWRkciAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZWxlY3RfcXVldWUgPSB4ZW52aWZfc2VsZWN0X3F1ZXVlLAogfTsKIAogc3RydWN0IHhlbnZpZiAqeGVudmlmX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgZG9taWRfdCBkb21pZCwKQEAgLTMyMSwxMCArNDM0LDE0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgeGVudmlmICp2aWY7CiAJY2hhciBuYW1lW0lGTkFNU0laXSA9IHt9OwotCWludCBpOwogCiAJc25wcmludGYobmFtZSwgSUZOQU1TSVogLSAxLCAidmlmJXUuJXUiLCBkb21pZCwgaGFuZGxlKTsKLQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB4ZW52aWYpLCBuYW1lLCBldGhlcl9zZXR1cCk7CisJLyogQWxsb2NhdGUgYSBuZXRkZXYgd2l0aCB0aGUgbWF4LiBzdXBwb3J0ZWQgbnVtYmVyIG9mIHF1ZXVlcy4KKwkgKiBXaGVuIHRoZSBndWVzdCBzZWxlY3RzIHRoZSBkZXNpcmVkIG51bWJlciwgaXQgd2lsbCBiZSB1cGRhdGVkCisJICogdmlhIG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoKS4KKwkgKi8KKwlkZXYgPSBhbGxvY19uZXRkZXZfbXEoc2l6ZW9mKHN0cnVjdCB4ZW52aWYpLCBuYW1lLCBldGhlcl9zZXR1cCwKKwkJCSAgICAgIHhlbnZpZl9tYXhfcXVldWVzKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJcHJfd2FybigiQ291bGQgbm90IGFsbG9jYXRlIG5ldGRldiBmb3IgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTMzNCw2NiArNDUxLDI4IEBACiAKIAl2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JdmlmLT5ncmFudF9jb3B5X29wID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGdudHRhYl9jb3B5KSAqCi0JCQkJICAgICBNQVhfR1JBTlRfQ09QWV9PUFMpOwotCWlmICh2aWYtPmdyYW50X2NvcHlfb3AgPT0gTlVMTCkgewotCQlwcl93YXJuKCJDb3VsZCBub3QgYWxsb2NhdGUgZ3JhbnQgY29weSBzcGFjZSBmb3IgJXNcbiIsIG5hbWUpOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KIAl2aWYtPmRvbWlkICA9IGRvbWlkOwogCXZpZi0+aGFuZGxlID0gaGFuZGxlOwogCXZpZi0+Y2FuX3NnID0gMTsKIAl2aWYtPmlwX2NzdW0gPSAxOwogCXZpZi0+ZGV2ID0gZGV2OwotCiAJdmlmLT5kaXNhYmxlZCA9IGZhbHNlOwogCi0JdmlmLT5jcmVkaXRfYnl0ZXMgPSB2aWYtPnJlbWFpbmluZ19jcmVkaXQgPSB+MFVMOwotCXZpZi0+Y3JlZGl0X3VzZWMgID0gMFVMOwotCWluaXRfdGltZXIoJnZpZi0+Y3JlZGl0X3RpbWVvdXQpOwotCXZpZi0+Y3JlZGl0X3dpbmRvd19zdGFydCA9IGdldF9qaWZmaWVzXzY0KCk7Ci0KLQlpbml0X3RpbWVyKCZ2aWYtPndha2VfcXVldWUpOworCS8qIFN0YXJ0IG91dCB3aXRoIG5vIHF1ZXVlcy4gVGhlIGNhbGwgYmVsb3cgZG9lcyBub3QgcmVxdWlyZQorCSAqIHJ0bmxfbG9jaygpIGFzIGl0IGhhcHBlbnMgYmVmb3JlIHJlZ2lzdGVyX25ldGRldigpLgorCSAqLworCXZpZi0+cXVldWVzID0gTlVMTDsKKwluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKGRldiwgMCk7CiAKIAlkZXYtPm5ldGRldl9vcHMJPSAmeGVudmlmX25ldGRldl9vcHM7CiAJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAogCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8CiAJCU5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082OwogCWRldi0+ZmVhdHVyZXMgPSBkZXYtPmh3X2ZlYXR1cmVzIHwgTkVUSUZfRl9SWENTVU07Ci0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJnhlbnZpZl9ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZ4ZW52aWZfZXRodG9vbF9vcHM7CiAKIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IFhFTlZJRl9RVUVVRV9MRU5HVEg7CiAKLQlza2JfcXVldWVfaGVhZF9pbml0KCZ2aWYtPnJ4X3F1ZXVlKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZ2aWYtPnR4X3F1ZXVlKTsKLQotCXZpZi0+cGVuZGluZ19jb25zID0gMDsKLQl2aWYtPnBlbmRpbmdfcHJvZCA9IE1BWF9QRU5ESU5HX1JFUVM7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9QRU5ESU5HX1JFUVM7IGkrKykKLQkJdmlmLT5wZW5kaW5nX3JpbmdbaV0gPSBpOwotCXNwaW5fbG9ja19pbml0KCZ2aWYtPmNhbGxiYWNrX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ2aWYtPnJlc3BvbnNlX2xvY2spOwotCS8qIElmIGJhbGxvb25pbmcgaXMgZGlzYWJsZWQsIHRoaXMgd2lsbCBjb25zdW1lIHJlYWwgbWVtb3J5LCBzbyB5b3UKLQkgKiBiZXR0ZXIgZW5hYmxlIGl0LiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBqdXN0IGEKLQkgKiBidW5jaCBvZiB2YWxpZCBwYWdlIGRlc2NyaXB0b3JzLCB3aXRob3V0IGRlcGVuZGVuY3kgb24gYmFsbG9vbmluZwotCSAqLwotCWVyciA9IGFsbG9jX3hlbmJhbGxvb25lZF9wYWdlcyhNQVhfUEVORElOR19SRVFTLAotCQkJCSAgICAgICB2aWYtPm1tYXBfcGFnZXMsCi0JCQkJICAgICAgIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiQ291bGQgbm90IHJlc2VydmUgbW1hcF9wYWdlc1xuIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFTkRJTkdfUkVRUzsgaSsrKSB7Ci0JCXZpZi0+cGVuZGluZ190eF9pbmZvW2ldLmNhbGxiYWNrX3N0cnVjdCA9IChzdHJ1Y3QgdWJ1Zl9pbmZvKQotCQkJeyAuY2FsbGJhY2sgPSB4ZW52aWZfemVyb2NvcHlfY2FsbGJhY2ssCi0JCQkgIC5jdHggPSBOVUxMLAotCQkJICAuZGVzYyA9IGkgfTsKLQkJdmlmLT5ncmFudF90eF9oYW5kbGVbaV0gPSBORVRCQUNLX0lOVkFMSURfSEFORExFOwotCX0KLQogCS8qCiAJICogSW5pdGlhbGlzZSBhIGR1bW15IE1BQyBhZGRyZXNzLiBXZSBjaG9vc2UgdGhlIG51bWVyaWNhbGx5CiAJICogbGFyZ2VzdCBub24tYnJvYWRjYXN0IGFkZHJlc3MgdG8gcHJldmVudCB0aGUgYWRkcmVzcyBnZXR0aW5nCkBAIC00MDMsOCArNDgyLDYgQEAKIAltZW1zZXQoZGV2LT5kZXZfYWRkciwgMHhGRiwgRVRIX0FMRU4pOwogCWRldi0+ZGV2X2FkZHJbMF0gJj0gfjB4MDE7CiAKLQluZXRpZl9uYXBpX2FkZChkZXYsICZ2aWYtPm5hcGksIHhlbnZpZl9wb2xsLCBYRU5WSUZfTkFQSV9XRUlHSFQpOwotCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpAQCAtNDIxLDc2ICs0OTgsNTYgQEAKIAlyZXR1cm4gdmlmOwogfQogCi1pbnQgeGVudmlmX2Nvbm5lY3Qoc3RydWN0IHhlbnZpZiAqdmlmLCB1bnNpZ25lZCBsb25nIHR4X3JpbmdfcmVmLAotCQkgICB1bnNpZ25lZCBsb25nIHJ4X3JpbmdfcmVmLCB1bnNpZ25lZCBpbnQgdHhfZXZ0Y2huLAotCQkgICB1bnNpZ25lZCBpbnQgcnhfZXZ0Y2huKQoraW50IHhlbnZpZl9pbml0X3F1ZXVlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgZXJyLCBpOwogCi0JQlVHX09OKHZpZi0+dHhfaXJxKTsKLQlCVUdfT04odmlmLT50YXNrKTsKLQlCVUdfT04odmlmLT5kZWFsbG9jX3Rhc2spOworCXF1ZXVlLT5jcmVkaXRfYnl0ZXMgPSBxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCA9IH4wVUw7CisJcXVldWUtPmNyZWRpdF91c2VjICA9IDBVTDsKKwlpbml0X3RpbWVyKCZxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQpOworCXF1ZXVlLT5jcmVkaXRfd2luZG93X3N0YXJ0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAotCWVyciA9IHhlbnZpZl9tYXBfZnJvbnRlbmRfcmluZ3ModmlmLCB0eF9yaW5nX3JlZiwgcnhfcmluZ19yZWYpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycjsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxdWV1ZS0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT50eF9xdWV1ZSk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2aWYtPndxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2aWYtPmRlYWxsb2Nfd3EpOworCXF1ZXVlLT5wZW5kaW5nX2NvbnMgPSAwOworCXF1ZXVlLT5wZW5kaW5nX3Byb2QgPSBNQVhfUEVORElOR19SRVFTOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUEVORElOR19SRVFTOyArK2kpCisJCXF1ZXVlLT5wZW5kaW5nX3JpbmdbaV0gPSBpOwogCi0JaWYgKHR4X2V2dGNobiA9PSByeF9ldnRjaG4pIHsKLQkJLyogZmVhdHVyZS1zcGxpdC1ldmVudC1jaGFubmVscyA9PSAwICovCi0JCWVyciA9IGJpbmRfaW50ZXJkb21haW5fZXZ0Y2huX3RvX2lycWhhbmRsZXIoCi0JCQl2aWYtPmRvbWlkLCB0eF9ldnRjaG4sIHhlbnZpZl9pbnRlcnJ1cHQsIDAsCi0JCQl2aWYtPmRldi0+bmFtZSwgdmlmKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycl91bm1hcDsKLQkJdmlmLT50eF9pcnEgPSB2aWYtPnJ4X2lycSA9IGVycjsKLQkJZGlzYWJsZV9pcnEodmlmLT50eF9pcnEpOwotCX0gZWxzZSB7Ci0JCS8qIGZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMgPT0gMSAqLwotCQlzbnByaW50Zih2aWYtPnR4X2lycV9uYW1lLCBzaXplb2YodmlmLT50eF9pcnFfbmFtZSksCi0JCQkgIiVzLXR4IiwgdmlmLT5kZXYtPm5hbWUpOwotCQllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnFoYW5kbGVyKAotCQkJdmlmLT5kb21pZCwgdHhfZXZ0Y2huLCB4ZW52aWZfdHhfaW50ZXJydXB0LCAwLAotCQkJdmlmLT50eF9pcnFfbmFtZSwgdmlmKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycl91bm1hcDsKLQkJdmlmLT50eF9pcnEgPSBlcnI7Ci0JCWRpc2FibGVfaXJxKHZpZi0+dHhfaXJxKTsKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmNhbGxiYWNrX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+cmVzcG9uc2VfbG9jayk7CiAKLQkJc25wcmludGYodmlmLT5yeF9pcnFfbmFtZSwgc2l6ZW9mKHZpZi0+cnhfaXJxX25hbWUpLAotCQkJICIlcy1yeCIsIHZpZi0+ZGV2LT5uYW1lKTsKLQkJZXJyID0gYmluZF9pbnRlcmRvbWFpbl9ldnRjaG5fdG9faXJxaGFuZGxlcigKLQkJCXZpZi0+ZG9taWQsIHJ4X2V2dGNobiwgeGVudmlmX3J4X2ludGVycnVwdCwgMCwKLQkJCXZpZi0+cnhfaXJxX25hbWUsIHZpZik7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJfdHhfdW5iaW5kOwotCQl2aWYtPnJ4X2lycSA9IGVycjsKLQkJZGlzYWJsZV9pcnEodmlmLT5yeF9pcnEpOworCS8qIElmIGJhbGxvb25pbmcgaXMgZGlzYWJsZWQsIHRoaXMgd2lsbCBjb25zdW1lIHJlYWwgbWVtb3J5LCBzbyB5b3UKKwkgKiBiZXR0ZXIgZW5hYmxlIGl0LiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBqdXN0IGEKKwkgKiBidW5jaCBvZiB2YWxpZCBwYWdlIGRlc2NyaXB0b3JzLCB3aXRob3V0IGRlcGVuZGVuY3kgb24gYmFsbG9vbmluZworCSAqLworCWVyciA9IGFsbG9jX3hlbmJhbGxvb25lZF9wYWdlcyhNQVhfUEVORElOR19SRVFTLAorCQkJCSAgICAgICBxdWV1ZS0+bW1hcF9wYWdlcywKKwkJCQkgICAgICAgZmFsc2UpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsICJDb3VsZCBub3QgcmVzZXJ2ZSBtbWFwX3BhZ2VzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JdGFzayA9IGt0aHJlYWRfY3JlYXRlKHhlbnZpZl9rdGhyZWFkX2d1ZXN0X3J4LAotCQkJICAgICAgKHZvaWQgKil2aWYsICIlcy1ndWVzdC1yeCIsIHZpZi0+ZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXByX3dhcm4oIkNvdWxkIG5vdCBhbGxvY2F0ZSBrdGhyZWFkIGZvciAlc1xuIiwgdmlmLT5kZXYtPm5hbWUpOwotCQllcnIgPSBQVFJfRVJSKHRhc2spOwotCQlnb3RvIGVycl9yeF91bmJpbmQ7CisJZm9yIChpID0gMDsgaSA8IE1BWF9QRU5ESU5HX1JFUVM7IGkrKykgeworCQlxdWV1ZS0+cGVuZGluZ190eF9pbmZvW2ldLmNhbGxiYWNrX3N0cnVjdCA9IChzdHJ1Y3QgdWJ1Zl9pbmZvKQorCQkJeyAuY2FsbGJhY2sgPSB4ZW52aWZfemVyb2NvcHlfY2FsbGJhY2ssCisJCQkgIC5jdHggPSBOVUxMLAorCQkJICAuZGVzYyA9IGkgfTsKKwkJcXVldWUtPmdyYW50X3R4X2hhbmRsZVtpXSA9IE5FVEJBQ0tfSU5WQUxJRF9IQU5ETEU7CiAJfQogCi0JdmlmLT50YXNrID0gdGFzazsKKwlpbml0X3RpbWVyKCZxdWV1ZS0+d2FrZV9xdWV1ZSk7CiAKLQl0YXNrID0ga3RocmVhZF9jcmVhdGUoeGVudmlmX2RlYWxsb2Nfa3RocmVhZCwKLQkJCSAgICAgICh2b2lkICopdmlmLCAiJXMtZGVhbGxvYyIsIHZpZi0+ZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXByX3dhcm4oIkNvdWxkIG5vdCBhbGxvY2F0ZSBrdGhyZWFkIGZvciAlc1xuIiwgdmlmLT5kZXYtPm5hbWUpOwotCQllcnIgPSBQVFJfRVJSKHRhc2spOwotCQlnb3RvIGVycl9yeF91bmJpbmQ7Ci0JfQorCW5ldGlmX25hcGlfYWRkKHF1ZXVlLT52aWYtPmRldiwgJnF1ZXVlLT5uYXBpLCB4ZW52aWZfcG9sbCwKKwkJCVhFTlZJRl9OQVBJX1dFSUdIVCk7CiAKLQl2aWYtPmRlYWxsb2NfdGFzayA9IHRhc2s7CisJcmV0dXJuIDA7Cit9CiAKK3ZvaWQgeGVudmlmX2NhcnJpZXJfb24oc3RydWN0IHhlbnZpZiAqdmlmKQorewogCXJ0bmxfbG9jaygpOwogCWlmICghdmlmLT5jYW5fc2cgJiYgdmlmLT5kZXYtPm10dSA+IEVUSF9EQVRBX0xFTikKIAkJZGV2X3NldF9tdHUodmlmLT5kZXYsIEVUSF9EQVRBX0xFTik7CkBAIC00OTksMjAgKzU1Niw4OSBAQAogCWlmIChuZXRpZl9ydW5uaW5nKHZpZi0+ZGV2KSkKIAkJeGVudmlmX3VwKHZpZik7CiAJcnRubF91bmxvY2soKTsKK30KIAotCXdha2VfdXBfcHJvY2Vzcyh2aWYtPnRhc2spOwotCXdha2VfdXBfcHJvY2Vzcyh2aWYtPmRlYWxsb2NfdGFzayk7CitpbnQgeGVudmlmX2Nvbm5lY3Qoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIHVuc2lnbmVkIGxvbmcgdHhfcmluZ19yZWYsCisJCSAgIHVuc2lnbmVkIGxvbmcgcnhfcmluZ19yZWYsIHVuc2lnbmVkIGludCB0eF9ldnRjaG4sCisJCSAgIHVuc2lnbmVkIGludCByeF9ldnRjaG4pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBlcnIgPSAtRU5PTUVNOworCisJQlVHX09OKHF1ZXVlLT50eF9pcnEpOworCUJVR19PTihxdWV1ZS0+dGFzayk7CisJQlVHX09OKHF1ZXVlLT5kZWFsbG9jX3Rhc2spOworCisJZXJyID0geGVudmlmX21hcF9mcm9udGVuZF9yaW5ncyhxdWV1ZSwgdHhfcmluZ19yZWYsIHJ4X3JpbmdfcmVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnI7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZS0+d3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlLT5kZWFsbG9jX3dxKTsKKworCWlmICh0eF9ldnRjaG4gPT0gcnhfZXZ0Y2huKSB7CisJCS8qIGZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMgPT0gMCAqLworCQllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnFoYW5kbGVyKAorCQkJcXVldWUtPnZpZi0+ZG9taWQsIHR4X2V2dGNobiwgeGVudmlmX2ludGVycnVwdCwgMCwKKwkJCXF1ZXVlLT5uYW1lLCBxdWV1ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJfdW5tYXA7CisJCXF1ZXVlLT50eF9pcnEgPSBxdWV1ZS0+cnhfaXJxID0gZXJyOworCQlkaXNhYmxlX2lycShxdWV1ZS0+dHhfaXJxKTsKKwl9IGVsc2UgeworCQkvKiBmZWF0dXJlLXNwbGl0LWV2ZW50LWNoYW5uZWxzID09IDEgKi8KKwkJc25wcmludGYocXVldWUtPnR4X2lycV9uYW1lLCBzaXplb2YocXVldWUtPnR4X2lycV9uYW1lKSwKKwkJCSAiJXMtdHgiLCBxdWV1ZS0+bmFtZSk7CisJCWVyciA9IGJpbmRfaW50ZXJkb21haW5fZXZ0Y2huX3RvX2lycWhhbmRsZXIoCisJCQlxdWV1ZS0+dmlmLT5kb21pZCwgdHhfZXZ0Y2huLCB4ZW52aWZfdHhfaW50ZXJydXB0LCAwLAorCQkJcXVldWUtPnR4X2lycV9uYW1lLCBxdWV1ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJfdW5tYXA7CisJCXF1ZXVlLT50eF9pcnEgPSBlcnI7CisJCWRpc2FibGVfaXJxKHF1ZXVlLT50eF9pcnEpOworCisJCXNucHJpbnRmKHF1ZXVlLT5yeF9pcnFfbmFtZSwgc2l6ZW9mKHF1ZXVlLT5yeF9pcnFfbmFtZSksCisJCQkgIiVzLXJ4IiwgcXVldWUtPm5hbWUpOworCQllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnFoYW5kbGVyKAorCQkJcXVldWUtPnZpZi0+ZG9taWQsIHJ4X2V2dGNobiwgeGVudmlmX3J4X2ludGVycnVwdCwgMCwKKwkJCXF1ZXVlLT5yeF9pcnFfbmFtZSwgcXVldWUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyX3R4X3VuYmluZDsKKwkJcXVldWUtPnJ4X2lycSA9IGVycjsKKwkJZGlzYWJsZV9pcnEocXVldWUtPnJ4X2lycSk7CisJfQorCisJdGFzayA9IGt0aHJlYWRfY3JlYXRlKHhlbnZpZl9rdGhyZWFkX2d1ZXN0X3J4LAorCQkJICAgICAgKHZvaWQgKilxdWV1ZSwgIiVzLWd1ZXN0LXJ4IiwgcXVldWUtPm5hbWUpOworCWlmIChJU19FUlIodGFzaykpIHsKKwkJcHJfd2FybigiQ291bGQgbm90IGFsbG9jYXRlIGt0aHJlYWQgZm9yICVzXG4iLCBxdWV1ZS0+bmFtZSk7CisJCWVyciA9IFBUUl9FUlIodGFzayk7CisJCWdvdG8gZXJyX3J4X3VuYmluZDsKKwl9CisJcXVldWUtPnRhc2sgPSB0YXNrOworCisJdGFzayA9IGt0aHJlYWRfY3JlYXRlKHhlbnZpZl9kZWFsbG9jX2t0aHJlYWQsCisJCQkgICAgICAodm9pZCAqKXF1ZXVlLCAiJXMtZGVhbGxvYyIsIHF1ZXVlLT5uYW1lKTsKKwlpZiAoSVNfRVJSKHRhc2spKSB7CisJCXByX3dhcm4oIkNvdWxkIG5vdCBhbGxvY2F0ZSBrdGhyZWFkIGZvciAlc1xuIiwgcXVldWUtPm5hbWUpOworCQllcnIgPSBQVFJfRVJSKHRhc2spOworCQlnb3RvIGVycl9yeF91bmJpbmQ7CisJfQorCXF1ZXVlLT5kZWFsbG9jX3Rhc2sgPSB0YXNrOworCisJd2FrZV91cF9wcm9jZXNzKHF1ZXVlLT50YXNrKTsKKwl3YWtlX3VwX3Byb2Nlc3MocXVldWUtPmRlYWxsb2NfdGFzayk7CiAKIAlyZXR1cm4gMDsKIAogZXJyX3J4X3VuYmluZDoKLQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHZpZi0+cnhfaXJxLCB2aWYpOwotCXZpZi0+cnhfaXJxID0gMDsKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHF1ZXVlLT5yeF9pcnEsIHF1ZXVlKTsKKwlxdWV1ZS0+cnhfaXJxID0gMDsKIGVycl90eF91bmJpbmQ6Ci0JdW5iaW5kX2Zyb21faXJxaGFuZGxlcih2aWYtPnR4X2lycSwgdmlmKTsKLQl2aWYtPnR4X2lycSA9IDA7CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihxdWV1ZS0+dHhfaXJxLCBxdWV1ZSk7CisJcXVldWUtPnR4X2lycSA9IDA7CiBlcnJfdW5tYXA6Ci0JeGVudmlmX3VubWFwX2Zyb250ZW5kX3JpbmdzKHZpZik7CisJeGVudmlmX3VubWFwX2Zyb250ZW5kX3JpbmdzKHF1ZXVlKTsKIGVycjoKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gZXJyOwpAQCAtNTI5LDM4ICs2NTUsNzcgQEAKIAlydG5sX3VubG9jaygpOwogfQogCitzdGF0aWMgdm9pZCB4ZW52aWZfd2FpdF91bm1hcF90aW1lb3V0KHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB3b3JzdF9jYXNlX3NrYl9saWZldGltZSkKK3sKKwlpbnQgaSwgdW5tYXBfdGltZW91dCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFTkRJTkdfUkVRUzsgKytpKSB7CisJCWlmIChxdWV1ZS0+Z3JhbnRfdHhfaGFuZGxlW2ldICE9IE5FVEJBQ0tfSU5WQUxJRF9IQU5ETEUpIHsKKwkJCXVubWFwX3RpbWVvdXQrKzsKKwkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCQlpZiAodW5tYXBfdGltZW91dCA+IHdvcnN0X2Nhc2Vfc2tiX2xpZmV0aW1lICYmCisJCQkgICAgbmV0X3JhdGVsaW1pdCgpKQorCQkJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAorCQkJCQkgICAiUGFnZSBzdGlsbCBncmFudGVkISBJbmRleDogJXhcbiIsCisJCQkJCSAgIGkpOworCQkJaSA9IC0xOworCQl9CisJfQorfQorCiB2b2lkIHhlbnZpZl9kaXNjb25uZWN0KHN0cnVjdCB4ZW52aWYgKnZpZikKIHsKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSB2aWYtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzOworCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleDsKKwogCWlmIChuZXRpZl9jYXJyaWVyX29rKHZpZi0+ZGV2KSkKIAkJeGVudmlmX2NhcnJpZXJfb2ZmKHZpZik7CiAKLQlpZiAodmlmLT50YXNrKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZ2aWYtPndha2VfcXVldWUpOwotCQlrdGhyZWFkX3N0b3AodmlmLT50YXNrKTsKLQkJdmlmLT50YXNrID0gTlVMTDsKLQl9CisJZm9yIChxdWV1ZV9pbmRleCA9IDA7IHF1ZXVlX2luZGV4IDwgbnVtX3F1ZXVlczsgKytxdWV1ZV9pbmRleCkgeworCQlxdWV1ZSA9ICZ2aWYtPnF1ZXVlc1txdWV1ZV9pbmRleF07CiAKLQlpZiAodmlmLT5kZWFsbG9jX3Rhc2spIHsKLQkJa3RocmVhZF9zdG9wKHZpZi0+ZGVhbGxvY190YXNrKTsKLQkJdmlmLT5kZWFsbG9jX3Rhc2sgPSBOVUxMOwotCX0KLQotCWlmICh2aWYtPnR4X2lycSkgewotCQlpZiAodmlmLT50eF9pcnEgPT0gdmlmLT5yeF9pcnEpCi0JCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHZpZi0+dHhfaXJxLCB2aWYpOwotCQllbHNlIHsKLQkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIodmlmLT50eF9pcnEsIHZpZik7Ci0JCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHZpZi0+cnhfaXJxLCB2aWYpOworCQlpZiAocXVldWUtPnRhc2spIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZxdWV1ZS0+d2FrZV9xdWV1ZSk7CisJCQlrdGhyZWFkX3N0b3AocXVldWUtPnRhc2spOworCQkJcXVldWUtPnRhc2sgPSBOVUxMOwogCQl9Ci0JCXZpZi0+dHhfaXJxID0gMDsKLQl9CiAKLQl4ZW52aWZfdW5tYXBfZnJvbnRlbmRfcmluZ3ModmlmKTsKKwkJaWYgKHF1ZXVlLT5kZWFsbG9jX3Rhc2spIHsKKwkJCWt0aHJlYWRfc3RvcChxdWV1ZS0+ZGVhbGxvY190YXNrKTsKKwkJCXF1ZXVlLT5kZWFsbG9jX3Rhc2sgPSBOVUxMOworCQl9CisKKwkJaWYgKHF1ZXVlLT50eF9pcnEpIHsKKwkJCWlmIChxdWV1ZS0+dHhfaXJxID09IHF1ZXVlLT5yeF9pcnEpCisJCQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihxdWV1ZS0+dHhfaXJxLCBxdWV1ZSk7CisJCQllbHNlIHsKKwkJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHF1ZXVlLT50eF9pcnEsIHF1ZXVlKTsKKwkJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHF1ZXVlLT5yeF9pcnEsIHF1ZXVlKTsKKwkJCX0KKwkJCXF1ZXVlLT50eF9pcnEgPSAwOworCQl9CisKKwkJeGVudmlmX3VubWFwX2Zyb250ZW5kX3JpbmdzKHF1ZXVlKTsKKwl9Cit9CisKKy8qIFJldmVyc2UgdGhlIHJlbGV2YW50IHBhcnRzIG9mIHhlbnZpZl9pbml0X3F1ZXVlKCkuCisgKiBVc2VkIGZvciBxdWV1ZSB0ZWFyZG93biBmcm9tIHhlbnZpZl9mcmVlKCksIGFuZCBvbiB0aGUKKyAqIGVycm9yIGhhbmRsaW5nIHBhdGhzIGluIHhlbmJ1cy5jOmNvbm5lY3QoKS4KKyAqLwordm9pZCB4ZW52aWZfZGVpbml0X3F1ZXVlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCWZyZWVfeGVuYmFsbG9vbmVkX3BhZ2VzKE1BWF9QRU5ESU5HX1JFUVMsIHF1ZXVlLT5tbWFwX3BhZ2VzKTsKKwluZXRpZl9uYXBpX2RlbCgmcXVldWUtPm5hcGkpOwogfQogCiB2b2lkIHhlbnZpZl9mcmVlKHN0cnVjdCB4ZW52aWYgKnZpZikKIHsKLQlpbnQgaSwgdW5tYXBfdGltZW91dCA9IDA7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSBOVUxMOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gdmlmLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwl1bnNpZ25lZCBpbnQgcXVldWVfaW5kZXg7CiAJLyogSGVyZSB3ZSB3YW50IHRvIGF2b2lkIHRpbWVvdXQgbWVzc2FnZXMgaWYgYW4gc2tiIGNhbiBiZSBsZWdpdGltYXRlbHkKIAkgKiBzdHVjayBzb21ld2hlcmUgZWxzZS4gUmVhbGlzdGljYWxseSB0aGlzIGNvdWxkIGJlIGFuIGFub3RoZXIgdmlmJ3MKIAkgKiBpbnRlcm5hbCBvciBRRGlzYyBxdWV1ZS4gVGhhdCBhbm90aGVyIHZpZiBhbHNvIGhhcyB0aGlzCkBAIC01NzUsMzMgKzc0MCwyMSBAQAogCXVuc2lnbmVkIGludCB3b3JzdF9jYXNlX3NrYl9saWZldGltZSA9IChyeF9kcmFpbl90aW1lb3V0X21zZWNzLzEwMDApICoKIAkJRElWX1JPVU5EX1VQKFhFTlZJRl9RVUVVRV9MRU5HVEgsIChYRU5fTkVUSUZfUlhfUklOR19TSVpFIC8gTUFYX1NLQl9GUkFHUykpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9QRU5ESU5HX1JFUVM7ICsraSkgewotCQlpZiAodmlmLT5ncmFudF90eF9oYW5kbGVbaV0gIT0gTkVUQkFDS19JTlZBTElEX0hBTkRMRSkgewotCQkJdW5tYXBfdGltZW91dCsrOwotCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKLQkJCWlmICh1bm1hcF90aW1lb3V0ID4gd29yc3RfY2FzZV9za2JfbGlmZXRpbWUgJiYKLQkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJbmV0ZGV2X2Vycih2aWYtPmRldiwKLQkJCQkJICAgIlBhZ2Ugc3RpbGwgZ3JhbnRlZCEgSW5kZXg6ICV4XG4iLAotCQkJCQkgICBpKTsKLQkJCS8qIElmIHRoZXJlIGFyZSBzdGlsbCB1bm1hcHBlZCBwYWdlcywgcmVzZXQgdGhlIGxvb3AgdG8KLQkJCSAqIHN0YXJ0IGNoZWNraW5nIGFnYWluLiBXZSBzaG91bGRuJ3QgZXhpdCBoZXJlIHVudGlsCi0JCQkgKiBkZWFsbG9jIHRocmVhZCBhbmQgTkFQSSBpbnN0YW5jZSByZWxlYXNlIGFsbCB0aGUKLQkJCSAqIHBhZ2VzLiBJZiBhIGtlcm5lbCBidWcgY2F1c2VzIHRoZSBza2JzIHRvIHN0YWxsCi0JCQkgKiBzb21ld2hlcmUsIHRoZSBpbnRlcmZhY2UgY2Fubm90IGJlIGJyb3VnaHQgZG93bgotCQkJICogcHJvcGVybHkuCi0JCQkgKi8KLQkJCWkgPSAtMTsKLQkJfQotCX0KLQotCWZyZWVfeGVuYmFsbG9vbmVkX3BhZ2VzKE1BWF9QRU5ESU5HX1JFUVMsIHZpZi0+bW1hcF9wYWdlcyk7Ci0KLQluZXRpZl9uYXBpX2RlbCgmdmlmLT5uYXBpKTsKLQogCXVucmVnaXN0ZXJfbmV0ZGV2KHZpZi0+ZGV2KTsKIAotCXZmcmVlKHZpZi0+Z3JhbnRfY29weV9vcCk7CisJZm9yIChxdWV1ZV9pbmRleCA9IDA7IHF1ZXVlX2luZGV4IDwgbnVtX3F1ZXVlczsgKytxdWV1ZV9pbmRleCkgeworCQlxdWV1ZSA9ICZ2aWYtPnF1ZXVlc1txdWV1ZV9pbmRleF07CisJCXhlbnZpZl93YWl0X3VubWFwX3RpbWVvdXQocXVldWUsIHdvcnN0X2Nhc2Vfc2tiX2xpZmV0aW1lKTsKKwkJeGVudmlmX2RlaW5pdF9xdWV1ZShxdWV1ZSk7CisJfQorCisJLyogRnJlZSB0aGUgYXJyYXkgb2YgcXVldWVzLiBUaGUgY2FsbCBiZWxvdyBkb2VzIG5vdCByZXF1aXJlCisJICogcnRubF9sb2NrKCkgYmVjYXVzZSBpdCBoYXBwZW5zIGFmdGVyIHVucmVnaXN0ZXJfbmV0ZGV2KCkuCisJICovCisJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyh2aWYtPmRldiwgMCk7CisJdmZyZWUodmlmLT5xdWV1ZXMpOworCXZpZi0+cXVldWVzID0gTlVMTDsKKwogCWZyZWVfbmV0ZGV2KHZpZi0+ZGV2KTsKIAogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IDczNjcyMDguLjE4NDRhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTYyLDYgKzYyLDExIEBACiBtb2R1bGVfcGFyYW0ocnhfZHJhaW5fdGltZW91dF9tc2VjcywgdWludCwgMDQ0NCk7CiB1bnNpZ25lZCBpbnQgcnhfZHJhaW5fdGltZW91dF9qaWZmaWVzOwogCit1bnNpZ25lZCBpbnQgeGVudmlmX21heF9xdWV1ZXM7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3F1ZXVlcywgeGVudmlmX21heF9xdWV1ZXMsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcXVldWVzLAorCQkgIk1heGltdW0gbnVtYmVyIG9mIHF1ZXVlcyBwZXIgdmlydHVhbCBpbnRlcmZhY2UiKTsKKwogLyoKICAqIFRoaXMgaXMgdGhlIG1heGltdW0gc2xvdHMgYSBza2IgY2FuIGhhdmUuIElmIGEgZ3Vlc3Qgc2VuZHMgYSBza2IKICAqIHdoaWNoIGV4Y2VlZHMgdGhpcyBsaW1pdCBpdCBpcyBjb25zaWRlcmVkIG1hbGljaW91cy4KQEAgLTcwLDMzICs3NSwzMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBmYXRhbF9za2Jfc2xvdHMgPSBGQVRBTF9TS0JfU0xPVFNfREVGQVVMVDsKIG1vZHVsZV9wYXJhbShmYXRhbF9za2Jfc2xvdHMsIHVpbnQsIDA0NDQpOwogCi1zdGF0aWMgdm9pZCB4ZW52aWZfaWR4X3JlbGVhc2Uoc3RydWN0IHhlbnZpZiAqdmlmLCB1MTYgcGVuZGluZ19pZHgsCitzdGF0aWMgdm9pZCB4ZW52aWZfaWR4X3JlbGVhc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIHUxNiBwZW5kaW5nX2lkeCwKIAkJCSAgICAgICB1OCBzdGF0dXMpOwogCi1zdGF0aWMgdm9pZCBtYWtlX3R4X3Jlc3BvbnNlKHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyB2b2lkIG1ha2VfdHhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgIHN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCAqdHhwLAogCQkJICAgICBzOCAgICAgICBzdCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHR4X3dvcmtfdG9kbyhzdHJ1Y3QgeGVudmlmICp2aWYpOwotc3RhdGljIGlubGluZSBpbnQgcnhfd29ya190b2RvKHN0cnVjdCB4ZW52aWYgKnZpZik7CitzdGF0aWMgaW5saW5lIGludCB0eF93b3JrX3RvZG8oc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpOworc3RhdGljIGlubGluZSBpbnQgcnhfd29ya190b2RvKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKTsKIAotc3RhdGljIHN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKm1ha2VfcnhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZiAqdmlmLAorc3RhdGljIHN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKm1ha2VfcnhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkJCSAgICAgdTE2ICAgICAgaWQsCiAJCQkJCSAgICAgczggICAgICAgc3QsCiAJCQkJCSAgICAgdTE2ICAgICAgb2Zmc2V0LAogCQkJCQkgICAgIHUxNiAgICAgIHNpemUsCiAJCQkJCSAgICAgdTE2ICAgICAgZmxhZ3MpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaWR4X3RvX3BmbihzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaWR4X3RvX3BmbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCQkgICAgICAgdTE2IGlkeCkKIHsKLQlyZXR1cm4gcGFnZV90b19wZm4odmlmLT5tbWFwX3BhZ2VzW2lkeF0pOworCXJldHVybiBwYWdlX3RvX3BmbihxdWV1ZS0+bW1hcF9wYWdlc1tpZHhdKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlkeF90b19rYWRkcihzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaWR4X3RvX2thZGRyKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAogCQkJCQkgdTE2IGlkeCkKIHsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGlkeF90b19wZm4odmlmLCBpZHgpKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGlkeF90b19wZm4ocXVldWUsIGlkeCkpOwogfQogCiAjZGVmaW5lIGNhbGxiYWNrX3BhcmFtKHZpZiwgcGVuZGluZ19pZHgpIFwKQEAgLTEwNCwxMyArMTA5LDEzIEBACiAKIC8qIEZpbmQgdGhlIGNvbnRhaW5pbmcgVklGJ3Mgc3RydWN0dXJlIGZyb20gYSBwb2ludGVyIGluIHBlbmRpbmdfdHhfaW5mbyBhcnJheQogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB4ZW52aWYgKnVidWZfdG9fdmlmKGNvbnN0IHN0cnVjdCB1YnVmX2luZm8gKnVidWYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZW52aWZfcXVldWUgKnVidWZfdG9fcXVldWUoY29uc3Qgc3RydWN0IHVidWZfaW5mbyAqdWJ1ZikKIHsKIAl1MTYgcGVuZGluZ19pZHggPSB1YnVmLT5kZXNjOwogCXN0cnVjdCBwZW5kaW5nX3R4X2luZm8gKnRlbXAgPQogCQljb250YWluZXJfb2YodWJ1Ziwgc3RydWN0IHBlbmRpbmdfdHhfaW5mbywgY2FsbGJhY2tfc3RydWN0KTsKIAlyZXR1cm4gY29udGFpbmVyX29mKHRlbXAgLSBwZW5kaW5nX2lkeCwKLQkJCSAgICBzdHJ1Y3QgeGVudmlmLAorCQkJICAgIHN0cnVjdCB4ZW52aWZfcXVldWUsCiAJCQkgICAgcGVuZGluZ190eF9pbmZvWzBdKTsKIH0KIApAQCAtMTM2LDI0ICsxNDEsMjQgQEAKIAlyZXR1cm4gaSAmIChNQVhfUEVORElOR19SRVFTLTEpOwogfQogCi1ib29sIHhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShzdHJ1Y3QgeGVudmlmICp2aWYsIGludCBuZWVkZWQpCitib29sIHhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgaW50IG5lZWRlZCkKIHsKIAlSSU5HX0lEWCBwcm9kLCBjb25zOwogCiAJZG8gewotCQlwcm9kID0gdmlmLT5yeC5zcmluZy0+cmVxX3Byb2Q7Ci0JCWNvbnMgPSB2aWYtPnJ4LnJlcV9jb25zOworCQlwcm9kID0gcXVldWUtPnJ4LnNyaW5nLT5yZXFfcHJvZDsKKwkJY29ucyA9IHF1ZXVlLT5yeC5yZXFfY29uczsKIAogCQlpZiAocHJvZCAtIGNvbnMgPj0gbmVlZGVkKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJdmlmLT5yeC5zcmluZy0+cmVxX2V2ZW50ID0gcHJvZCArIDE7CisJCXF1ZXVlLT5yeC5zcmluZy0+cmVxX2V2ZW50ID0gcHJvZCArIDE7CiAKIAkJLyogTWFrZSBzdXJlIGV2ZW50IGlzIHZpc2libGUgYmVmb3JlIHdlIGNoZWNrIHByb2QKIAkJICogYWdhaW4uCiAJCSAqLwogCQltYigpOwotCX0gd2hpbGUgKHZpZi0+cnguc3JpbmctPnJlcV9wcm9kICE9IHByb2QpOworCX0gd2hpbGUgKHF1ZXVlLT5yeC5zcmluZy0+cmVxX3Byb2QgIT0gcHJvZCk7CiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0xNjMsNyArMTY4LDggQEAKICAqIGFkZGluZyAnc2l6ZScgYnl0ZXMgdG8gYSBidWZmZXIgd2hpY2ggY3VycmVudGx5IGNvbnRhaW5zICdvZmZzZXQnCiAgKiBieXRlcy4KICAqLwotc3RhdGljIGJvb2wgc3RhcnRfbmV3X3J4X2J1ZmZlcihpbnQgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBoZWFkKQorc3RhdGljIGJvb2wgc3RhcnRfbmV3X3J4X2J1ZmZlcihpbnQgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBoZWFkLAorCQkJCWJvb2wgZnVsbF9jb2FsZXNjZSkKIHsKIAkvKiBzaW1wbGUgY2FzZTogd2UgaGF2ZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGUgY3VycmVudCBidWZmZXIuICovCiAJaWYgKG9mZnNldCA9PSBNQVhfQlVGRkVSX09GRlNFVCkKQEAgLTE3NSw2ICsxODEsNyBAQAogCSAqICAgICAoaSkgICB0aGlzIGZyYWcgd291bGQgZml0IGNvbXBsZXRlbHkgaW4gdGhlIG5leHQgYnVmZmVyCiAJICogYW5kIChpaSkgIHRoZXJlIGlzIGFscmVhZHkgc29tZSBkYXRhIGluIHRoZSBjdXJyZW50IGJ1ZmZlcgogCSAqIGFuZCAoaWlpKSB0aGlzIGlzIG5vdCB0aGUgaGVhZCBidWZmZXIuCisJICogYW5kIChpdikgIHRoZXJlIGlzIG5vIG5lZWQgdG8gZnVsbHkgdXRpbGl6ZSB0aGUgYnVmZmVycwogCSAqCiAJICogV2hlcmU6CiAJICogLSAoaSkgc3RvcHMgdXMgc3BsaXR0aW5nIGEgZnJhZyBpbnRvIHR3byBjb3BpZXMKQEAgLTE4NSw2ICsxOTIsOCBAQAogCSAqICAgYnkgKGlpKSBidXQgaXMgZXhwbGljaXRseSBjaGVja2VkIGJlY2F1c2UKIAkgKiAgIG5ldGZyb250IHJlbGllcyBvbiB0aGUgZmlyc3QgYnVmZmVyIGJlaW5nCiAJICogICBub24tZW1wdHkgYW5kIGNhbiBjcmFzaCBvdGhlcndpc2UuCisJICogLSAoaXYpIGlzIG5lZWRlZCBmb3Igc2ticyB3aGljaCBjYW4gdXNlIHVwIG1vcmUgdGhhbiBNQVhfU0tCX0ZSQUdTCisJICogICBzbG90CiAJICoKIAkgKiBUaGlzIG1lYW5zIHdlIHdpbGwgZWZmZWN0aXZlbHkgbGluZWFyaXNlIHNtYWxsCiAJICogZnJhZ3MgYnV0IGRvIG5vdCBuZWVkbGVzc2x5IHNwbGl0IGxhcmdlIGJ1ZmZlcnMKQEAgLTE5Miw3ICsyMDEsOCBAQAogCSAqIG93biBidWZmZXJzIGFzIGJlZm9yZS4KIAkgKi8KIAlCVUdfT04oc2l6ZSA+IE1BWF9CVUZGRVJfT0ZGU0VUKTsKLQlpZiAoKG9mZnNldCArIHNpemUgPiBNQVhfQlVGRkVSX09GRlNFVCkgJiYgb2Zmc2V0ICYmICFoZWFkKQorCWlmICgob2Zmc2V0ICsgc2l6ZSA+IE1BWF9CVUZGRVJfT0ZGU0VUKSAmJiBvZmZzZXQgJiYgIWhlYWQgJiYKKwkgICAgIWZ1bGxfY29hbGVzY2UpCiAJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGZhbHNlOwpAQCAtMjA3LDEzICsyMTcsMTMgQEAKIAlncmFudF9yZWZfdCBjb3B5X2dyZWY7CiB9OwogCi1zdGF0aWMgc3RydWN0IHhlbnZpZl9yeF9tZXRhICpnZXRfbmV4dF9yeF9idWZmZXIoc3RydWN0IHhlbnZpZiAqdmlmLAorc3RhdGljIHN0cnVjdCB4ZW52aWZfcnhfbWV0YSAqZ2V0X25leHRfcnhfYnVmZmVyKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAogCQkJCQkJIHN0cnVjdCBuZXRyeF9wZW5kaW5nX29wZXJhdGlvbnMgKm5wbykKIHsKIAlzdHJ1Y3QgeGVudmlmX3J4X21ldGEgKm1ldGE7CiAJc3RydWN0IHhlbl9uZXRpZl9yeF9yZXF1ZXN0ICpyZXE7CiAKLQlyZXEgPSBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnJ4LCB2aWYtPnJ4LnJlcV9jb25zKyspOworCXJlcSA9IFJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVldWUtPnJ4LnJlcV9jb25zKyspOwogCiAJbWV0YSA9IG5wby0+bWV0YSArIG5wby0+bWV0YV9wcm9kKys7CiAJbWV0YS0+Z3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfTk9ORTsKQEAgLTIyNywxNSArMjM3LDIyIEBACiAJcmV0dXJuIG1ldGE7CiB9CiAKK3N0cnVjdCB4ZW52aWZfcnhfY2IgeworCWludCBtZXRhX3Nsb3RzX3VzZWQ7CisJYm9vbCBmdWxsX2NvYWxlc2NlOworfTsKKworI2RlZmluZSBYRU5WSUZfUlhfQ0Ioc2tiKSAoKHN0cnVjdCB4ZW52aWZfcnhfY2IgKikoc2tiKS0+Y2IpCisKIC8qCiAgKiBTZXQgdXAgdGhlIGdyYW50IG9wZXJhdGlvbnMgZm9yIHRoaXMgZnJhZ21lbnQuIElmIGl0J3MgYSBmbGlwcGluZwogICogaW50ZXJmYWNlLCB3ZSBhbHNvIHNldCB1cCB0aGUgdW5tYXAgcmVxdWVzdCBmcm9tIGhlcmUuCiAgKi8KLXN0YXRpYyB2b2lkIHhlbnZpZl9nb3BfZnJhZ19jb3B5KHN0cnVjdCB4ZW52aWYgKnZpZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyB2b2lkIHhlbnZpZl9nb3BfZnJhZ19jb3B5KHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBzdHJ1Y3QgbmV0cnhfcGVuZGluZ19vcGVyYXRpb25zICpucG8sCiAJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgKmhlYWQsCi0JCQkJIHN0cnVjdCB4ZW52aWYgKmZvcmVpZ25fdmlmLAorCQkJCSBzdHJ1Y3QgeGVudmlmX3F1ZXVlICpmb3JlaWduX3F1ZXVlLAogCQkJCSBncmFudF9yZWZfdCBmb3JlaWduX2dyZWYpCiB7CiAJc3RydWN0IGdudHRhYl9jb3B5ICpjb3B5X2dvcDsKQEAgLTI2MSwxNCArMjc4LDE3IEBACiAJCWlmIChieXRlcyA+IHNpemUpCiAJCQlieXRlcyA9IHNpemU7CiAKLQkJaWYgKHN0YXJ0X25ld19yeF9idWZmZXIobnBvLT5jb3B5X29mZiwgYnl0ZXMsICpoZWFkKSkgeworCQlpZiAoc3RhcnRfbmV3X3J4X2J1ZmZlcihucG8tPmNvcHlfb2ZmLAorCQkJCQlieXRlcywKKwkJCQkJKmhlYWQsCisJCQkJCVhFTlZJRl9SWF9DQihza2IpLT5mdWxsX2NvYWxlc2NlKSkgewogCQkJLyoKIAkJCSAqIE5ldGZyb250IHJlcXVpcmVzIHRoZXJlIHRvIGJlIHNvbWUgZGF0YSBpbiB0aGUgaGVhZAogCQkJICogYnVmZmVyLgogCQkJICovCiAJCQlCVUdfT04oKmhlYWQpOwogCi0JCQltZXRhID0gZ2V0X25leHRfcnhfYnVmZmVyKHZpZiwgbnBvKTsKKwkJCW1ldGEgPSBnZXRfbmV4dF9yeF9idWZmZXIocXVldWUsIG5wbyk7CiAJCX0KIAogCQlpZiAobnBvLT5jb3B5X29mZiArIGJ5dGVzID4gTUFYX0JVRkZFUl9PRkZTRVQpCkBAIC0yNzgsOCArMjk4LDggQEAKIAkJY29weV9nb3AtPmZsYWdzID0gR05UQ09QWV9kZXN0X2dyZWY7CiAJCWNvcHlfZ29wLT5sZW4gPSBieXRlczsKIAotCQlpZiAoZm9yZWlnbl92aWYpIHsKLQkJCWNvcHlfZ29wLT5zb3VyY2UuZG9taWQgPSBmb3JlaWduX3ZpZi0+ZG9taWQ7CisJCWlmIChmb3JlaWduX3F1ZXVlKSB7CisJCQljb3B5X2dvcC0+c291cmNlLmRvbWlkID0gZm9yZWlnbl9xdWV1ZS0+dmlmLT5kb21pZDsKIAkJCWNvcHlfZ29wLT5zb3VyY2UudS5yZWYgPSBmb3JlaWduX2dyZWY7CiAJCQljb3B5X2dvcC0+ZmxhZ3MgfD0gR05UQ09QWV9zb3VyY2VfZ3JlZjsKIAkJfSBlbHNlIHsKQEAgLTI4OSw3ICszMDksNyBAQAogCQl9CiAJCWNvcHlfZ29wLT5zb3VyY2Uub2Zmc2V0ID0gb2Zmc2V0OwogCi0JCWNvcHlfZ29wLT5kZXN0LmRvbWlkID0gdmlmLT5kb21pZDsKKwkJY29weV9nb3AtPmRlc3QuZG9taWQgPSBxdWV1ZS0+dmlmLT5kb21pZDsKIAkJY29weV9nb3AtPmRlc3Qub2Zmc2V0ID0gbnBvLT5jb3B5X29mZjsKIAkJY29weV9nb3AtPmRlc3QudS5yZWYgPSBucG8tPmNvcHlfZ3JlZjsKIApAQCAtMzE0LDggKzMzNCw4IEBACiAJCQkJZ3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfVENQVjY7CiAJCX0KIAotCQlpZiAoKmhlYWQgJiYgKCgxIDw8IGdzb190eXBlKSAmIHZpZi0+Z3NvX21hc2spKQotCQkJdmlmLT5yeC5yZXFfY29ucysrOworCQlpZiAoKmhlYWQgJiYgKCgxIDw8IGdzb190eXBlKSAmIHF1ZXVlLT52aWYtPmdzb19tYXNrKSkKKwkJCXF1ZXVlLT5yeC5yZXFfY29ucysrOwogCiAJCSpoZWFkID0gMDsgLyogVGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgaW4gdGhpcyBidWZmZXIgbm93LiAqLwogCkBAIC0zMzcsMTMgKzM1NywxMyBAQAogCQkJCQkJY29uc3QgaW50IGksCiAJCQkJCQljb25zdCBzdHJ1Y3QgdWJ1Zl9pbmZvICp1YnVmKQogewotCXN0cnVjdCB4ZW52aWYgKmZvcmVpZ25fdmlmID0gdWJ1Zl90b192aWYodWJ1Zik7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqZm9yZWlnbl9xdWV1ZSA9IHVidWZfdG9fcXVldWUodWJ1Zik7CiAKIAlkbyB7CiAJCXUxNiBwZW5kaW5nX2lkeCA9IHVidWYtPmRlc2M7CiAKIAkJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZS5wID09Ci0JCSAgICBmb3JlaWduX3ZpZi0+bW1hcF9wYWdlc1twZW5kaW5nX2lkeF0pCisJCSAgICBmb3JlaWduX3F1ZXVlLT5tbWFwX3BhZ2VzW3BlbmRpbmdfaWR4XSkKIAkJCWJyZWFrOwogCQl1YnVmID0gKHN0cnVjdCB1YnVmX2luZm8gKikgdWJ1Zi0+Y3R4OwogCX0gd2hpbGUgKHVidWYpOwpAQCAtMzY0LDcgKzM4NCw4IEBACiAgKiBmcm9udGVuZC1zaWRlIExSTykuCiAgKi8KIHN0YXRpYyBpbnQgeGVudmlmX2dvcF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IG5ldHJ4X3BlbmRpbmdfb3BlcmF0aW9ucyAqbnBvKQorCQkJICBzdHJ1Y3QgbmV0cnhfcGVuZGluZ19vcGVyYXRpb25zICpucG8sCisJCQkgIHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewogCXN0cnVjdCB4ZW52aWYgKnZpZiA9IG5ldGRldl9wcml2KHNrYi0+ZGV2KTsKIAlpbnQgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwpAQCAtMzkwLDcgKzQxMSw3IEBACiAKIAkvKiBTZXQgdXAgYSBHU08gcHJlZml4IGRlc2NyaXB0b3IsIGlmIG5lY2Vzc2FyeSAqLwogCWlmICgoMSA8PCBnc29fdHlwZSkgJiB2aWYtPmdzb19wcmVmaXhfbWFzaykgewotCQlyZXEgPSBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnJ4LCB2aWYtPnJ4LnJlcV9jb25zKyspOworCQlyZXEgPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+cngsIHF1ZXVlLT5yeC5yZXFfY29ucysrKTsKIAkJbWV0YSA9IG5wby0+bWV0YSArIG5wby0+bWV0YV9wcm9kKys7CiAJCW1ldGEtPmdzb190eXBlID0gZ3NvX3R5cGU7CiAJCW1ldGEtPmdzb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKQEAgLTM5OCw3ICs0MTksNyBAQAogCQltZXRhLT5pZCA9IHJlcS0+aWQ7CiAJfQogCi0JcmVxID0gUklOR19HRVRfUkVRVUVTVCgmdmlmLT5yeCwgdmlmLT5yeC5yZXFfY29ucysrKTsKKwlyZXEgPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+cngsIHF1ZXVlLT5yeC5yZXFfY29ucysrKTsKIAltZXRhID0gbnBvLT5tZXRhICsgbnBvLT5tZXRhX3Byb2QrKzsKIAogCWlmICgoMSA8PCBnc29fdHlwZSkgJiB2aWYtPmdzb19tYXNrKSB7CkBAIC00MjIsNyArNDQzLDcgQEAKIAkJaWYgKGRhdGEgKyBsZW4gPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCQlsZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBkYXRhOwogCi0JCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHZpZiwgc2tiLCBucG8sCisJCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHF1ZXVlLCBza2IsIG5wbywKIAkJCQkgICAgIHZpcnRfdG9fcGFnZShkYXRhKSwgbGVuLCBvZmZzZXQsICZoZWFkLAogCQkJCSAgICAgTlVMTCwKIAkJCQkgICAgIDApOwpAQCAtNDMzLDcgKzQ1NCw3IEBACiAJCS8qIFRoaXMgdmFyaWFibGUgYWxzbyBzaWduYWxzIHdoZXRoZXIgZm9yZWlnbl9ncmVmIGhhcyBhIHJlYWwKIAkJICogdmFsdWUgb3Igbm90LgogCQkgKi8KLQkJc3RydWN0IHhlbnZpZiAqZm9yZWlnbl92aWYgPSBOVUxMOworCQlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpmb3JlaWduX3F1ZXVlID0gTlVMTDsKIAkJZ3JhbnRfcmVmX3QgZm9yZWlnbl9ncmVmOwogCiAJCWlmICgoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX0RFVl9aRVJPQ09QWSkgJiYKQEAgLTQ1OCw4ICs0NzksOSBAQAogCQkJaWYgKGxpa2VseSh1YnVmKSkgewogCQkJCXUxNiBwZW5kaW5nX2lkeCA9IHVidWYtPmRlc2M7CiAKLQkJCQlmb3JlaWduX3ZpZiA9IHVidWZfdG9fdmlmKHVidWYpOwotCQkJCWZvcmVpZ25fZ3JlZiA9IGZvcmVpZ25fdmlmLT5wZW5kaW5nX3R4X2luZm9bcGVuZGluZ19pZHhdLnJlcS5ncmVmOworCQkJCWZvcmVpZ25fcXVldWUgPSB1YnVmX3RvX3F1ZXVlKHVidWYpOworCQkJCWZvcmVpZ25fZ3JlZiA9CisJCQkJCWZvcmVpZ25fcXVldWUtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxLmdyZWY7CiAJCQkJLyogSnVzdCBhIHNhZmV0eSBtZWFzdXJlLiBJZiB0aGlzIHdhcyB0aGUgbGFzdAogCQkJCSAqIGVsZW1lbnQgb24gdGhlIGxpc3QsIHRoZSBmb3IgbG9vcCB3aWxsCiAJCQkJICogaXRlcmF0ZSBhZ2FpbiBpZiBhIGxvY2FsIHBhZ2Ugd2VyZSBhZGRlZCB0bwpAQCAtNDc3LDEzICs0OTksMTMgQEAKIAkJCQkgKi8KIAkJCQl1YnVmID0gaGVhZF91YnVmOwogCQl9Ci0JCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHZpZiwgc2tiLCBucG8sCisJCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHF1ZXVlLCBza2IsIG5wbywKIAkJCQkgICAgIHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pLAogCQkJCSAgICAgc2tiX2ZyYWdfc2l6ZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSksCiAJCQkJICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0LAogCQkJCSAgICAgJmhlYWQsCi0JCQkJICAgICBmb3JlaWduX3ZpZiwKLQkJCQkgICAgIGZvcmVpZ25fdmlmID8gZm9yZWlnbl9ncmVmIDogVUlOVF9NQVgpOworCQkJCSAgICAgZm9yZWlnbl9xdWV1ZSwKKwkJCQkgICAgIGZvcmVpZ25fcXVldWUgPyBmb3JlaWduX2dyZWYgOiBVSU5UX01BWCk7CiAJfQogCiAJcmV0dXJuIG5wby0+bWV0YV9wcm9kIC0gb2xkX21ldGFfcHJvZDsKQEAgLTUxNSw3ICs1MzcsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIHhlbnZpZl9hZGRfZnJhZ19yZXNwb25zZXMoc3RydWN0IHhlbnZpZiAqdmlmLCBpbnQgc3RhdHVzLAorc3RhdGljIHZvaWQgeGVudmlmX2FkZF9mcmFnX3Jlc3BvbnNlcyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgaW50IHN0YXR1cywKIAkJCQkgICAgICBzdHJ1Y3QgeGVudmlmX3J4X21ldGEgKm1ldGEsCiAJCQkJICAgICAgaW50IG5yX21ldGFfc2xvdHMpCiB7CkBAIC01MzYsMjMgKzU1OCwxNyBAQAogCQkJZmxhZ3MgPSBYRU5fTkVUUlhGX21vcmVfZGF0YTsKIAogCQlvZmZzZXQgPSAwOwotCQltYWtlX3J4X3Jlc3BvbnNlKHZpZiwgbWV0YVtpXS5pZCwgc3RhdHVzLCBvZmZzZXQsCisJCW1ha2VfcnhfcmVzcG9uc2UocXVldWUsIG1ldGFbaV0uaWQsIHN0YXR1cywgb2Zmc2V0LAogCQkJCSBtZXRhW2ldLnNpemUsIGZsYWdzKTsKIAl9CiB9CiAKLXN0cnVjdCB4ZW52aWZfcnhfY2IgewotCWludCBtZXRhX3Nsb3RzX3VzZWQ7Ci19OwotCi0jZGVmaW5lIFhFTlZJRl9SWF9DQihza2IpICgoc3RydWN0IHhlbnZpZl9yeF9jYiAqKShza2IpLT5jYikKLQotdm9pZCB4ZW52aWZfa2lja190aHJlYWQoc3RydWN0IHhlbnZpZiAqdmlmKQordm9pZCB4ZW52aWZfa2lja190aHJlYWQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7Ci0Jd2FrZV91cCgmdmlmLT53cSk7CisJd2FrZV91cCgmcXVldWUtPndxKTsKIH0KIAotc3RhdGljIHZvaWQgeGVudmlmX3J4X2FjdGlvbihzdHJ1Y3QgeGVudmlmICp2aWYpCitzdGF0aWMgdm9pZCB4ZW52aWZfcnhfYWN0aW9uKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewogCXM4IHN0YXR1czsKIAl1MTYgZmxhZ3M7CkBAIC01NjUsMTMgKzU4MSwxMyBAQAogCWJvb2wgbmVlZF90b19ub3RpZnkgPSBmYWxzZTsKIAogCXN0cnVjdCBuZXRyeF9wZW5kaW5nX29wZXJhdGlvbnMgbnBvID0gewotCQkuY29weSAgPSB2aWYtPmdyYW50X2NvcHlfb3AsCi0JCS5tZXRhICA9IHZpZi0+bWV0YSwKKwkJLmNvcHkgID0gcXVldWUtPmdyYW50X2NvcHlfb3AsCisJCS5tZXRhICA9IHF1ZXVlLT5tZXRhLAogCX07CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZyeHEpOwogCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmdmlmLT5yeF9xdWV1ZSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZxdWV1ZS0+cnhfcXVldWUpKSAhPSBOVUxMKSB7CiAJCVJJTkdfSURYIG1heF9zbG90c19uZWVkZWQ7CiAJCVJJTkdfSURYIG9sZF9yZXFfY29uczsKIAkJUklOR19JRFggcmluZ19zbG90c191c2VkOwpAQCAtNjAyLDEwICs2MTgsMTUgQEAKIAogCQkvKiBUbyBhdm9pZCB0aGUgZXN0aW1hdGUgYmVjb21pbmcgdG9vIHBlc3NpbWFsIGZvciBzb21lCiAJCSAqIGZyb250ZW5kcyB0aGF0IGxpbWl0IHBvc3RlZCByeCByZXF1ZXN0cywgY2FwIHRoZSBlc3RpbWF0ZQotCQkgKiBhdCBNQVhfU0tCX0ZSQUdTLgorCQkgKiBhdCBNQVhfU0tCX0ZSQUdTLiBJbiB0aGlzIGNhc2UgbmV0YmFjayB3aWxsIGZ1bGx5IGNvYWxlc2NlCisJCSAqIHRoZSBza2IgaW50byB0aGUgcHJvdmlkZWQgc2xvdHMuCiAJCSAqLwotCQlpZiAobWF4X3Nsb3RzX25lZWRlZCA+IE1BWF9TS0JfRlJBR1MpCisJCWlmIChtYXhfc2xvdHNfbmVlZGVkID4gTUFYX1NLQl9GUkFHUykgewogCQkJbWF4X3Nsb3RzX25lZWRlZCA9IE1BWF9TS0JfRlJBR1M7CisJCQlYRU5WSUZfUlhfQ0Ioc2tiKS0+ZnVsbF9jb2FsZXNjZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlYRU5WSUZfUlhfQ0Ioc2tiKS0+ZnVsbF9jb2FsZXNjZSA9IGZhbHNlOworCQl9CiAKIAkJLyogV2UgbWF5IG5lZWQgb25lIG1vcmUgc2xvdCBmb3IgR1NPIG1ldGFkYXRhICovCiAJCWlmIChza2JfaXNfZ3NvKHNrYikgJiYKQEAgLTYxNCw0MiArNjM1LDQyIEBACiAJCQltYXhfc2xvdHNfbmVlZGVkKys7CiAKIAkJLyogSWYgdGhlIHNrYiBtYXkgbm90IGZpdCB0aGVuIGJhaWwgb3V0IG5vdyAqLwotCQlpZiAoIXhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZSh2aWYsIG1heF9zbG90c19uZWVkZWQpKSB7Ci0JCQlza2JfcXVldWVfaGVhZCgmdmlmLT5yeF9xdWV1ZSwgc2tiKTsKKwkJaWYgKCF4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUocXVldWUsIG1heF9zbG90c19uZWVkZWQpKSB7CisJCQlza2JfcXVldWVfaGVhZCgmcXVldWUtPnJ4X3F1ZXVlLCBza2IpOwogCQkJbmVlZF90b19ub3RpZnkgPSB0cnVlOwotCQkJdmlmLT5yeF9sYXN0X3NrYl9zbG90cyA9IG1heF9zbG90c19uZWVkZWQ7CisJCQlxdWV1ZS0+cnhfbGFzdF9za2Jfc2xvdHMgPSBtYXhfc2xvdHNfbmVlZGVkOwogCQkJYnJlYWs7CiAJCX0gZWxzZQotCQkJdmlmLT5yeF9sYXN0X3NrYl9zbG90cyA9IDA7CisJCQlxdWV1ZS0+cnhfbGFzdF9za2Jfc2xvdHMgPSAwOwogCi0JCW9sZF9yZXFfY29ucyA9IHZpZi0+cngucmVxX2NvbnM7Ci0JCVhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQgPSB4ZW52aWZfZ29wX3NrYihza2IsICZucG8pOwotCQlyaW5nX3Nsb3RzX3VzZWQgPSB2aWYtPnJ4LnJlcV9jb25zIC0gb2xkX3JlcV9jb25zOworCQlvbGRfcmVxX2NvbnMgPSBxdWV1ZS0+cngucmVxX2NvbnM7CisJCVhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQgPSB4ZW52aWZfZ29wX3NrYihza2IsICZucG8sIHF1ZXVlKTsKKwkJcmluZ19zbG90c191c2VkID0gcXVldWUtPnJ4LnJlcV9jb25zIC0gb2xkX3JlcV9jb25zOwogCiAJCUJVR19PTihyaW5nX3Nsb3RzX3VzZWQgPiBtYXhfc2xvdHNfbmVlZGVkKTsKIAogCQlfX3NrYl9xdWV1ZV90YWlsKCZyeHEsIHNrYik7CiAJfQogCi0JQlVHX09OKG5wby5tZXRhX3Byb2QgPiBBUlJBWV9TSVpFKHZpZi0+bWV0YSkpOworCUJVR19PTihucG8ubWV0YV9wcm9kID4gQVJSQVlfU0laRShxdWV1ZS0+bWV0YSkpOwogCiAJaWYgKCFucG8uY29weV9wcm9kKQogCQlnb3RvIGRvbmU7CiAKIAlCVUdfT04obnBvLmNvcHlfcHJvZCA+IE1BWF9HUkFOVF9DT1BZX09QUyk7Ci0JZ250dGFiX2JhdGNoX2NvcHkodmlmLT5ncmFudF9jb3B5X29wLCBucG8uY29weV9wcm9kKTsKKwlnbnR0YWJfYmF0Y2hfY29weShxdWV1ZS0+Z3JhbnRfY29weV9vcCwgbnBvLmNvcHlfcHJvZCk7CiAKIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnJ4cSkpICE9IE5VTEwpIHsKIAotCQlpZiAoKDEgPDwgdmlmLT5tZXRhW25wby5tZXRhX2NvbnNdLmdzb190eXBlKSAmCi0JCSAgICB2aWYtPmdzb19wcmVmaXhfbWFzaykgewotCQkJcmVzcCA9IFJJTkdfR0VUX1JFU1BPTlNFKCZ2aWYtPnJ4LAotCQkJCQkJIHZpZi0+cngucnNwX3Byb2RfcHZ0KyspOworCQlpZiAoKDEgPDwgcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3R5cGUpICYKKwkJICAgIHF1ZXVlLT52aWYtPmdzb19wcmVmaXhfbWFzaykgeworCQkJcmVzcCA9IFJJTkdfR0VUX1JFU1BPTlNFKCZxdWV1ZS0+cngsCisJCQkJCQkgcXVldWUtPnJ4LnJzcF9wcm9kX3B2dCsrKTsKIAogCQkJcmVzcC0+ZmxhZ3MgPSBYRU5fTkVUUlhGX2dzb19wcmVmaXggfCBYRU5fTkVUUlhGX21vcmVfZGF0YTsKIAotCQkJcmVzcC0+b2Zmc2V0ID0gdmlmLT5tZXRhW25wby5tZXRhX2NvbnNdLmdzb19zaXplOwotCQkJcmVzcC0+aWQgPSB2aWYtPm1ldGFbbnBvLm1ldGFfY29uc10uaWQ7CisJCQlyZXNwLT5vZmZzZXQgPSBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5nc29fc2l6ZTsKKwkJCXJlc3AtPmlkID0gcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uaWQ7CiAJCQlyZXNwLT5zdGF0dXMgPSBYRU5WSUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkOwogCiAJCQlucG8ubWV0YV9jb25zKys7CkBAIC02NTcsMTAgKzY3OCwxMCBAQAogCQl9CiAKIAotCQl2aWYtPmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCXZpZi0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXF1ZXVlLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcXVldWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAotCQlzdGF0dXMgPSB4ZW52aWZfY2hlY2tfZ29wKHZpZiwKKwkJc3RhdHVzID0geGVudmlmX2NoZWNrX2dvcChxdWV1ZS0+dmlmLAogCQkJCQkgIFhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQsCiAJCQkJCSAgJm5wbyk7CiAKQEAgLTY3NiwyMiArNjk3LDIyIEBACiAJCQlmbGFncyB8PSBYRU5fTkVUUlhGX2RhdGFfdmFsaWRhdGVkOwogCiAJCW9mZnNldCA9IDA7Ci0JCXJlc3AgPSBtYWtlX3J4X3Jlc3BvbnNlKHZpZiwgdmlmLT5tZXRhW25wby5tZXRhX2NvbnNdLmlkLAorCQlyZXNwID0gbWFrZV9yeF9yZXNwb25zZShxdWV1ZSwgcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uaWQsCiAJCQkJCXN0YXR1cywgb2Zmc2V0LAotCQkJCQl2aWYtPm1ldGFbbnBvLm1ldGFfY29uc10uc2l6ZSwKKwkJCQkJcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uc2l6ZSwKIAkJCQkJZmxhZ3MpOwogCi0JCWlmICgoMSA8PCB2aWYtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3R5cGUpICYKLQkJICAgIHZpZi0+Z3NvX21hc2spIHsKKwkJaWYgKCgxIDw8IHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmdzb190eXBlKSAmCisJCSAgICBxdWV1ZS0+dmlmLT5nc29fbWFzaykgewogCQkJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpnc28gPQogCQkJCShzdHJ1Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKikKLQkJCQlSSU5HX0dFVF9SRVNQT05TRSgmdmlmLT5yeCwKLQkJCQkJCSAgdmlmLT5yeC5yc3BfcHJvZF9wdnQrKyk7CisJCQkJUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKKwkJCQkJCSAgcXVldWUtPnJ4LnJzcF9wcm9kX3B2dCsrKTsKIAogCQkJcmVzcC0+ZmxhZ3MgfD0gWEVOX05FVFJYRl9leHRyYV9pbmZvOwogCi0JCQlnc28tPnUuZ3NvLnR5cGUgPSB2aWYtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3R5cGU7Ci0JCQlnc28tPnUuZ3NvLnNpemUgPSB2aWYtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3NpemU7CisJCQlnc28tPnUuZ3NvLnR5cGUgPSBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5nc29fdHlwZTsKKwkJCWdzby0+dS5nc28uc2l6ZSA9IHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmdzb19zaXplOwogCQkJZ3NvLT51Lmdzby5wYWQgPSAwOwogCQkJZ3NvLT51Lmdzby5mZWF0dXJlcyA9IDA7CiAKQEAgLTY5OSwxMSArNzIwLDExIEBACiAJCQlnc28tPmZsYWdzID0gMDsKIAkJfQogCi0JCXhlbnZpZl9hZGRfZnJhZ19yZXNwb25zZXModmlmLCBzdGF0dXMsCi0JCQkJCSAgdmlmLT5tZXRhICsgbnBvLm1ldGFfY29ucyArIDEsCisJCXhlbnZpZl9hZGRfZnJhZ19yZXNwb25zZXMocXVldWUsIHN0YXR1cywKKwkJCQkJICBxdWV1ZS0+bWV0YSArIG5wby5tZXRhX2NvbnMgKyAxLAogCQkJCQkgIFhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQpOwogCi0JCVJJTkdfUFVTSF9SRVNQT05TRVNfQU5EX0NIRUNLX05PVElGWSgmdmlmLT5yeCwgcmV0KTsKKwkJUklOR19QVVNIX1JFU1BPTlNFU19BTkRfQ0hFQ0tfTk9USUZZKCZxdWV1ZS0+cngsIHJldCk7CiAKIAkJbmVlZF90b19ub3RpZnkgfD0gISFyZXQ7CiAKQEAgLTcxMywyMCArNzM0LDIwIEBACiAKIGRvbmU6CiAJaWYgKG5lZWRfdG9fbm90aWZ5KQotCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEodmlmLT5yeF9pcnEpOworCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEocXVldWUtPnJ4X2lycSk7CiB9CiAKLXZvaWQgeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyhzdHJ1Y3QgeGVudmlmICp2aWYpCit2b2lkIHhlbnZpZl9uYXBpX3NjaGVkdWxlX29yX2VuYWJsZV9ldmVudHMoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7CiAJaW50IG1vcmVfdG9fZG87CiAKLQlSSU5HX0ZJTkFMX0NIRUNLX0ZPUl9SRVFVRVNUUygmdmlmLT50eCwgbW9yZV90b19kbyk7CisJUklOR19GSU5BTF9DSEVDS19GT1JfUkVRVUVTVFMoJnF1ZXVlLT50eCwgbW9yZV90b19kbyk7CiAKIAlpZiAobW9yZV90b19kbykKLQkJbmFwaV9zY2hlZHVsZSgmdmlmLT5uYXBpKTsKKwkJbmFwaV9zY2hlZHVsZSgmcXVldWUtPm5hcGkpOwogfQogCi1zdGF0aWMgdm9pZCB0eF9hZGRfY3JlZGl0KHN0cnVjdCB4ZW52aWYgKnZpZikKK3N0YXRpYyB2b2lkIHR4X2FkZF9jcmVkaXQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfYnVyc3QsIG1heF9jcmVkaXQ7CiAKQEAgLTczNCw1NSArNzU1LDU3IEBACiAJICogQWxsb3cgYSBidXJzdCBiaWcgZW5vdWdoIHRvIHRyYW5zbWl0IGEganVtYm8gcGFja2V0IG9mIHVwIHRvIDEyOGtCLgogCSAqIE90aGVyd2lzZSB0aGUgaW50ZXJmYWNlIGNhbiBzZWl6ZSB1cCBkdWUgdG8gaW5zdWZmaWNpZW50IGNyZWRpdC4KIAkgKi8KLQltYXhfYnVyc3QgPSBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnR4LCB2aWYtPnR4LnJlcV9jb25zKS0+c2l6ZTsKKwltYXhfYnVyc3QgPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+dHgsIHF1ZXVlLT50eC5yZXFfY29ucyktPnNpemU7CiAJbWF4X2J1cnN0ID0gbWluKG1heF9idXJzdCwgMTMxMDcyVUwpOwotCW1heF9idXJzdCA9IG1heChtYXhfYnVyc3QsIHZpZi0+Y3JlZGl0X2J5dGVzKTsKKwltYXhfYnVyc3QgPSBtYXgobWF4X2J1cnN0LCBxdWV1ZS0+Y3JlZGl0X2J5dGVzKTsKIAogCS8qIFRha2UgY2FyZSB0aGF0IGFkZGluZyBhIG5ldyBjaHVuayBvZiBjcmVkaXQgZG9lc24ndCB3cmFwIHRvIHplcm8uICovCi0JbWF4X2NyZWRpdCA9IHZpZi0+cmVtYWluaW5nX2NyZWRpdCArIHZpZi0+Y3JlZGl0X2J5dGVzOwotCWlmIChtYXhfY3JlZGl0IDwgdmlmLT5yZW1haW5pbmdfY3JlZGl0KQorCW1heF9jcmVkaXQgPSBxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCArIHF1ZXVlLT5jcmVkaXRfYnl0ZXM7CisJaWYgKG1heF9jcmVkaXQgPCBxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCkKIAkJbWF4X2NyZWRpdCA9IFVMT05HX01BWDsgLyogd3JhcHBlZDogY2xhbXAgdG8gVUxPTkdfTUFYICovCiAKLQl2aWYtPnJlbWFpbmluZ19jcmVkaXQgPSBtaW4obWF4X2NyZWRpdCwgbWF4X2J1cnN0KTsKKwlxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCA9IG1pbihtYXhfY3JlZGl0LCBtYXhfYnVyc3QpOwogfQogCiBzdGF0aWMgdm9pZCB0eF9jcmVkaXRfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCB4ZW52aWYgKnZpZiA9IChzdHJ1Y3QgeGVudmlmICopZGF0YTsKLQl0eF9hZGRfY3JlZGl0KHZpZik7Ci0JeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyh2aWYpOworCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlID0gKHN0cnVjdCB4ZW52aWZfcXVldWUgKilkYXRhOworCXR4X2FkZF9jcmVkaXQocXVldWUpOworCXhlbnZpZl9uYXBpX3NjaGVkdWxlX29yX2VuYWJsZV9ldmVudHMocXVldWUpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW52aWZfdHhfZXJyKHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyB2b2lkIHhlbnZpZl90eF9lcnIoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgIHN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCAqdHhwLCBSSU5HX0lEWCBlbmQpCiB7Ci0JUklOR19JRFggY29ucyA9IHZpZi0+dHgucmVxX2NvbnM7CisJUklOR19JRFggY29ucyA9IHF1ZXVlLT50eC5yZXFfY29uczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZG8gewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlmLT5yZXNwb25zZV9sb2NrLCBmbGFncyk7Ci0JCW1ha2VfdHhfcmVzcG9uc2UodmlmLCB0eHAsIFhFTl9ORVRJRl9SU1BfRVJST1IpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWYtPnJlc3BvbnNlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5yZXNwb25zZV9sb2NrLCBmbGFncyk7CisJCW1ha2VfdHhfcmVzcG9uc2UocXVldWUsIHR4cCwgWEVOX05FVElGX1JTUF9FUlJPUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5yZXNwb25zZV9sb2NrLCBmbGFncyk7CiAJCWlmIChjb25zID09IGVuZCkKIAkJCWJyZWFrOwotCQl0eHAgPSBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnR4LCBjb25zKyspOworCQl0eHAgPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+dHgsIGNvbnMrKyk7CiAJfSB3aGlsZSAoMSk7Ci0JdmlmLT50eC5yZXFfY29ucyA9IGNvbnM7CisJcXVldWUtPnR4LnJlcV9jb25zID0gY29uczsKIH0KIAogc3RhdGljIHZvaWQgeGVudmlmX2ZhdGFsX3R4X2VycihzdHJ1Y3QgeGVudmlmICp2aWYpCiB7CiAJbmV0ZGV2X2Vycih2aWYtPmRldiwgImZhdGFsIGVycm9yOyBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAl2aWYtPmRpc2FibGVkID0gdHJ1ZTsKLQl4ZW52aWZfa2lja190aHJlYWQodmlmKTsKKwkvKiBEaXNhYmxlIHRoZSB2aWYgZnJvbSBxdWV1ZSAwJ3Mga3RocmVhZCAqLworCWlmICh2aWYtPnF1ZXVlcykKKwkJeGVudmlmX2tpY2tfdGhyZWFkKCZ2aWYtPnF1ZXVlc1swXSk7CiB9CiAKLXN0YXRpYyBpbnQgeGVudmlmX2NvdW50X3JlcXVlc3RzKHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyBpbnQgeGVudmlmX2NvdW50X3JlcXVlc3RzKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAogCQkJCSBzdHJ1Y3QgeGVuX25ldGlmX3R4X3JlcXVlc3QgKmZpcnN0LAogCQkJCSBzdHJ1Y3QgeGVuX25ldGlmX3R4X3JlcXVlc3QgKnR4cCwKIAkJCQkgaW50IHdvcmtfdG9fZG8pCiB7Ci0JUklOR19JRFggY29ucyA9IHZpZi0+dHgucmVxX2NvbnM7CisJUklOR19JRFggY29ucyA9IHF1ZXVlLT50eC5yZXFfY29uczsKIAlpbnQgc2xvdHMgPSAwOwogCWludCBkcm9wX2VyciA9IDA7CiAJaW50IG1vcmVfZGF0YTsKQEAgLTc5NCwxMCArODE3LDEwIEBACiAJCXN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCBkcm9wcGVkX3R4ID0geyAwIH07CiAKIAkJaWYgKHNsb3RzID49IHdvcmtfdG9fZG8pIHsKLQkJCW5ldGRldl9lcnIodmlmLT5kZXYsCisJCQluZXRkZXZfZXJyKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkgICAiQXNrZWQgZm9yICVkIHNsb3RzIGJ1dCBleGNlZWRzIHRoaXMgbGltaXRcbiIsCiAJCQkJICAgd29ya190b19kbyk7Ci0JCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHZpZik7CisJCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHF1ZXVlLT52aWYpOwogCQkJcmV0dXJuIC1FTk9EQVRBOwogCQl9CiAKQEAgLTgwNSwxMCArODI4LDEwIEBACiAJCSAqIGNvbnNpZGVyZWQgbWFsaWNpb3VzLgogCQkgKi8KIAkJaWYgKHVubGlrZWx5KHNsb3RzID49IGZhdGFsX3NrYl9zbG90cykpIHsKLQkJCW5ldGRldl9lcnIodmlmLT5kZXYsCisJCQluZXRkZXZfZXJyKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkgICAiTWFsaWNpb3VzIGZyb250ZW5kIHVzaW5nICVkIHNsb3RzLCB0aHJlc2hvbGQgJXVcbiIsCiAJCQkJICAgc2xvdHMsIGZhdGFsX3NrYl9zbG90cyk7Ci0JCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHZpZik7CisJCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHF1ZXVlLT52aWYpOwogCQkJcmV0dXJuIC1FMkJJRzsKIAkJfQogCkBAIC04MjEsNyArODQ0LDcgQEAKIAkJICovCiAJCWlmICghZHJvcF9lcnIgJiYgc2xvdHMgPj0gWEVOX05FVEJLX0xFR0FDWV9TTE9UU19NQVgpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJbmV0ZGV2X2RiZyh2aWYtPmRldiwKKwkJCQluZXRkZXZfZGJnKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkJICAgIlRvbyBtYW55IHNsb3RzICglZCkgZXhjZWVkaW5nIGxpbWl0ICglZCksIGRyb3BwaW5nIHBhY2tldFxuIiwKIAkJCQkJICAgc2xvdHMsIFhFTl9ORVRCS19MRUdBQ1lfU0xPVFNfTUFYKTsKIAkJCWRyb3BfZXJyID0gLUUyQklHOwpAQCAtODMwLDcgKzg1Myw3IEBACiAJCWlmIChkcm9wX2VycikKIAkJCXR4cCA9ICZkcm9wcGVkX3R4OwogCi0JCW1lbWNweSh0eHAsIFJJTkdfR0VUX1JFUVVFU1QoJnZpZi0+dHgsIGNvbnMgKyBzbG90cyksCisJCW1lbWNweSh0eHAsIFJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT50eCwgY29ucyArIHNsb3RzKSwKIAkJICAgICAgIHNpemVvZigqdHhwKSk7CiAKIAkJLyogSWYgdGhlIGd1ZXN0IHN1Ym1pdHRlZCBhIGZyYW1lID49IDY0IEtpQiB0aGVuCkBAIC04NDQsNyArODY3LDcgQEAKIAkJICovCiAJCWlmICghZHJvcF9lcnIgJiYgdHhwLT5zaXplID4gZmlyc3QtPnNpemUpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJbmV0ZGV2X2RiZyh2aWYtPmRldiwKKwkJCQluZXRkZXZfZGJnKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkJICAgIkludmFsaWQgdHggcmVxdWVzdCwgc2xvdCBzaXplICV1ID4gcmVtYWluaW5nIHNpemUgJXVcbiIsCiAJCQkJCSAgIHR4cC0+c2l6ZSwgZmlyc3QtPnNpemUpOwogCQkJZHJvcF9lcnIgPSAtRUlPOwpAQCAtODU0LDkgKzg3Nyw5IEBACiAJCXNsb3RzKys7CiAKIAkJaWYgKHVubGlrZWx5KCh0eHAtPm9mZnNldCArIHR4cC0+c2l6ZSkgPiBQQUdFX1NJWkUpKSB7Ci0JCQluZXRkZXZfZXJyKHZpZi0+ZGV2LCAiQ3Jvc3MgcGFnZSBib3VuZGFyeSwgdHhwLT5vZmZzZXQ6ICV4LCBzaXplOiAldVxuIiwKKwkJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LCAiQ3Jvc3MgcGFnZSBib3VuZGFyeSwgdHhwLT5vZmZzZXQ6ICV4LCBzaXplOiAldVxuIiwKIAkJCQkgdHhwLT5vZmZzZXQsIHR4cC0+c2l6ZSk7Ci0JCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHZpZik7CisJCQl4ZW52aWZfZmF0YWxfdHhfZXJyKHF1ZXVlLT52aWYpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtODY4LDcgKzg5MSw3IEBACiAJfSB3aGlsZSAobW9yZV9kYXRhKTsKIAogCWlmIChkcm9wX2VycikgewotCQl4ZW52aWZfdHhfZXJyKHZpZiwgZmlyc3QsIGNvbnMgKyBzbG90cyk7CisJCXhlbnZpZl90eF9lcnIocXVldWUsIGZpcnN0LCBjb25zICsgc2xvdHMpOwogCQlyZXR1cm4gZHJvcF9lcnI7CiAJfQogCkBAIC04ODIsMTcgKzkwNSwxNyBAQAogCiAjZGVmaW5lIFhFTlZJRl9UWF9DQihza2IpICgoc3RydWN0IHhlbnZpZl90eF9jYiAqKShza2IpLT5jYikKIAotc3RhdGljIGlubGluZSB2b2lkIHhlbnZpZl90eF9jcmVhdGVfbWFwX29wKHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW52aWZfdHhfY3JlYXRlX21hcF9vcChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCQkJICB1MTYgcGVuZGluZ19pZHgsCiAJCQkJCSAgc3RydWN0IHhlbl9uZXRpZl90eF9yZXF1ZXN0ICp0eHAsCiAJCQkJCSAgc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmICptb3ApCiB7Ci0JdmlmLT5wYWdlc190b19tYXBbbW9wLXZpZi0+dHhfbWFwX29wc10gPSB2aWYtPm1tYXBfcGFnZXNbcGVuZGluZ19pZHhdOwotCWdudHRhYl9zZXRfbWFwX29wKG1vcCwgaWR4X3RvX2thZGRyKHZpZiwgcGVuZGluZ19pZHgpLAorCXF1ZXVlLT5wYWdlc190b19tYXBbbW9wLXF1ZXVlLT50eF9tYXBfb3BzXSA9IHF1ZXVlLT5tbWFwX3BhZ2VzW3BlbmRpbmdfaWR4XTsKKwlnbnR0YWJfc2V0X21hcF9vcChtb3AsIGlkeF90b19rYWRkcihxdWV1ZSwgcGVuZGluZ19pZHgpLAogCQkJICBHTlRNQVBfaG9zdF9tYXAgfCBHTlRNQVBfcmVhZG9ubHksCi0JCQkgIHR4cC0+Z3JlZiwgdmlmLT5kb21pZCk7CisJCQkgIHR4cC0+Z3JlZiwgcXVldWUtPnZpZi0+ZG9taWQpOwogCi0JbWVtY3B5KCZ2aWYtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxLCB0eHAsCisJbWVtY3B5KCZxdWV1ZS0+cGVuZGluZ190eF9pbmZvW3BlbmRpbmdfaWR4XS5yZXEsIHR4cCwKIAkgICAgICAgc2l6ZW9mKCp0eHApKTsKIH0KIApAQCAtOTEzLDcgKzkzNiw3IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIHN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqeGVudmlmX2dldF9yZXF1ZXN0cyhzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmICp4ZW52aWZfZ2V0X3JlcXVlc3RzKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAogCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQkJc3RydWN0IHhlbl9uZXRpZl90eF9yZXF1ZXN0ICp0eHAsCiAJCQkJCQkJc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmICpnb3ApCkBAIC05NDAsOSArOTYzLDkgQEAKIAogCWZvciAoc2hpbmZvLT5ucl9mcmFncyA9IHN0YXJ0OyBzaGluZm8tPm5yX2ZyYWdzIDwgbnJfc2xvdHM7CiAJICAgICBzaGluZm8tPm5yX2ZyYWdzKyssIHR4cCsrLCBnb3ArKykgewotCQlpbmRleCA9IHBlbmRpbmdfaW5kZXgodmlmLT5wZW5kaW5nX2NvbnMrKyk7Ci0JCXBlbmRpbmdfaWR4ID0gdmlmLT5wZW5kaW5nX3JpbmdbaW5kZXhdOwotCQl4ZW52aWZfdHhfY3JlYXRlX21hcF9vcCh2aWYsIHBlbmRpbmdfaWR4LCB0eHAsIGdvcCk7CisJCWluZGV4ID0gcGVuZGluZ19pbmRleChxdWV1ZS0+cGVuZGluZ19jb25zKyspOworCQlwZW5kaW5nX2lkeCA9IHF1ZXVlLT5wZW5kaW5nX3JpbmdbaW5kZXhdOworCQl4ZW52aWZfdHhfY3JlYXRlX21hcF9vcChxdWV1ZSwgcGVuZGluZ19pZHgsIHR4cCwgZ29wKTsKIAkJZnJhZ19zZXRfcGVuZGluZ19pZHgoJmZyYWdzW3NoaW5mby0+bnJfZnJhZ3NdLCBwZW5kaW5nX2lkeCk7CiAJfQogCkBAIC05NTAsNyArOTczLDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSB4ZW52aWZfYWxsb2Nfc2tiKDApOwogCQlpZiAodW5saWtlbHkobnNrYiA9PSBOVUxMKSkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQluZXRkZXZfZXJyKHZpZi0+ZGV2LAorCQkJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAogCQkJCQkgICAiQ2FuJ3QgYWxsb2NhdGUgdGhlIGZyYWdfbGlzdCBza2IuXG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC05NjAsOSArOTgzLDkgQEAKIAogCQlmb3IgKHNoaW5mby0+bnJfZnJhZ3MgPSAwOyBzaGluZm8tPm5yX2ZyYWdzIDwgZnJhZ19vdmVyZmxvdzsKIAkJICAgICBzaGluZm8tPm5yX2ZyYWdzKyssIHR4cCsrLCBnb3ArKykgewotCQkJaW5kZXggPSBwZW5kaW5nX2luZGV4KHZpZi0+cGVuZGluZ19jb25zKyspOwotCQkJcGVuZGluZ19pZHggPSB2aWYtPnBlbmRpbmdfcmluZ1tpbmRleF07Ci0JCQl4ZW52aWZfdHhfY3JlYXRlX21hcF9vcCh2aWYsIHBlbmRpbmdfaWR4LCB0eHAsIGdvcCk7CisJCQlpbmRleCA9IHBlbmRpbmdfaW5kZXgocXVldWUtPnBlbmRpbmdfY29ucysrKTsKKwkJCXBlbmRpbmdfaWR4ID0gcXVldWUtPnBlbmRpbmdfcmluZ1tpbmRleF07CisJCQl4ZW52aWZfdHhfY3JlYXRlX21hcF9vcChxdWV1ZSwgcGVuZGluZ19pZHgsIHR4cCwgZ29wKTsKIAkJCWZyYWdfc2V0X3BlbmRpbmdfaWR4KCZmcmFnc1tzaGluZm8tPm5yX2ZyYWdzXSwKIAkJCQkJICAgICBwZW5kaW5nX2lkeCk7CiAJCX0KQEAgLTk3MywzNCArOTk2LDM0IEBACiAJcmV0dXJuIGdvcDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHhlbnZpZl9ncmFudF9oYW5kbGVfc2V0KHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW52aWZfZ3JhbnRfaGFuZGxlX3NldChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCQkJICAgdTE2IHBlbmRpbmdfaWR4LAogCQkJCQkgICBncmFudF9oYW5kbGVfdCBoYW5kbGUpCiB7Ci0JaWYgKHVubGlrZWx5KHZpZi0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSAhPQorCWlmICh1bmxpa2VseShxdWV1ZS0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSAhPQogCQkgICAgIE5FVEJBQ0tfSU5WQUxJRF9IQU5ETEUpKSB7Ci0JCW5ldGRldl9lcnIodmlmLT5kZXYsCisJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAogCQkJICAgIlRyeWluZyB0byBvdmVyd3JpdGUgYWN0aXZlIGhhbmRsZSEgcGVuZGluZ19pZHg6ICV4XG4iLAogCQkJICAgcGVuZGluZ19pZHgpOwogCQlCVUcoKTsKIAl9Ci0JdmlmLT5ncmFudF90eF9oYW5kbGVbcGVuZGluZ19pZHhdID0gaGFuZGxlOworCXF1ZXVlLT5ncmFudF90eF9oYW5kbGVbcGVuZGluZ19pZHhdID0gaGFuZGxlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgeGVudmlmX2dyYW50X2hhbmRsZV9yZXNldChzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgaW5saW5lIHZvaWQgeGVudmlmX2dyYW50X2hhbmRsZV9yZXNldChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCQkJICAgICB1MTYgcGVuZGluZ19pZHgpCiB7Ci0JaWYgKHVubGlrZWx5KHZpZi0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSA9PQorCWlmICh1bmxpa2VseShxdWV1ZS0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSA9PQogCQkgICAgIE5FVEJBQ0tfSU5WQUxJRF9IQU5ETEUpKSB7Ci0JCW5ldGRldl9lcnIodmlmLT5kZXYsCisJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAogCQkJICAgIlRyeWluZyB0byB1bm1hcCBpbnZhbGlkIGhhbmRsZSEgcGVuZGluZ19pZHg6ICV4XG4iLAogCQkJICAgcGVuZGluZ19pZHgpOwogCQlCVUcoKTsKIAl9Ci0JdmlmLT5ncmFudF90eF9oYW5kbGVbcGVuZGluZ19pZHhdID0gTkVUQkFDS19JTlZBTElEX0hBTkRMRTsKKwlxdWV1ZS0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSA9IE5FVEJBQ0tfSU5WQUxJRF9IQU5ETEU7CiB9CiAKLXN0YXRpYyBpbnQgeGVudmlmX3R4X2NoZWNrX2dvcChzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgaW50IHhlbnZpZl90eF9jaGVja19nb3Aoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgKipnb3BwX21hcCwKIAkJCSAgICAgICBzdHJ1Y3QgZ250dGFiX2NvcHkgKipnb3BwX2NvcHkpCkBAIC0xMDE3LDEyICsxMDQwLDEyIEBACiAJKCpnb3BwX2NvcHkpKys7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCW5ldGRldl9kYmcodmlmLT5kZXYsCisJCQluZXRkZXZfZGJnKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkgICAiR3JhbnQgY29weSBvZiBoZWFkZXIgZmFpbGVkISBzdGF0dXM6ICVkIHBlbmRpbmdfaWR4OiAldSByZWY6ICV1XG4iLAogCQkJCSAgICgqZ29wcF9jb3B5KS0+c3RhdHVzLAogCQkJCSAgIHBlbmRpbmdfaWR4LAogCQkJCSAgICgqZ29wcF9jb3B5KS0+c291cmNlLnUucmVmKTsKLQkJeGVudmlmX2lkeF9yZWxlYXNlKHZpZiwgcGVuZGluZ19pZHgsIFhFTl9ORVRJRl9SU1BfRVJST1IpOworCQl4ZW52aWZfaWR4X3JlbGVhc2UocXVldWUsIHBlbmRpbmdfaWR4LCBYRU5fTkVUSUZfUlNQX0VSUk9SKTsKIAl9CiAKIGNoZWNrX2ZyYWdzOgpAQCAtMTAzNSwyNCArMTA1OCwyNCBAQAogCQluZXdlcnIgPSBnb3BfbWFwLT5zdGF0dXM7CiAKIAkJaWYgKGxpa2VseSghbmV3ZXJyKSkgewotCQkJeGVudmlmX2dyYW50X2hhbmRsZV9zZXQodmlmLAorCQkJeGVudmlmX2dyYW50X2hhbmRsZV9zZXQocXVldWUsCiAJCQkJCQlwZW5kaW5nX2lkeCwKIAkJCQkJCWdvcF9tYXAtPmhhbmRsZSk7CiAJCQkvKiBIYWQgYSBwcmV2aW91cyBlcnJvcj8gSW52YWxpZGF0ZSB0aGlzIGZyYWdtZW50LiAqLwogCQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQkJeGVudmlmX2lkeF91bm1hcCh2aWYsIHBlbmRpbmdfaWR4KTsKKwkJCQl4ZW52aWZfaWR4X3VubWFwKHF1ZXVlLCBwZW5kaW5nX2lkeCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIEVycm9yIG9uIHRoaXMgZnJhZ21lbnQ6IHJlc3BvbmQgdG8gY2xpZW50IHdpdGggYW4gZXJyb3IuICovCiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQluZXRkZXZfZGJnKHZpZi0+ZGV2LAorCQkJbmV0ZGV2X2RiZyhxdWV1ZS0+dmlmLT5kZXYsCiAJCQkJICAgIkdyYW50IG1hcCBvZiAlZC4gZnJhZyBmYWlsZWQhIHN0YXR1czogJWQgcGVuZGluZ19pZHg6ICV1IHJlZjogJXVcbiIsCiAJCQkJICAgaSwKIAkJCQkgICBnb3BfbWFwLT5zdGF0dXMsCiAJCQkJICAgcGVuZGluZ19pZHgsCiAJCQkJICAgZ29wX21hcC0+cmVmKTsKLQkJeGVudmlmX2lkeF9yZWxlYXNlKHZpZiwgcGVuZGluZ19pZHgsIFhFTl9ORVRJRl9SU1BfRVJST1IpOworCQl4ZW52aWZfaWR4X3JlbGVhc2UocXVldWUsIHBlbmRpbmdfaWR4LCBYRU5fTkVUSUZfUlNQX0VSUk9SKTsKIAogCQkvKiBOb3QgdGhlIGZpcnN0IGVycm9yPyBQcmVjZWRpbmcgZnJhZ3MgYWxyZWFkeSBpbnZhbGlkYXRlZC4gKi8KIAkJaWYgKGVycikKQEAgLTEwNjAsNyArMTA4Myw3IEBACiAJCS8qIEZpcnN0IGVycm9yOiBpbnZhbGlkYXRlIHByZWNlZGluZyBmcmFnbWVudHMuICovCiAJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKIAkJCXBlbmRpbmdfaWR4ID0gZnJhZ19nZXRfcGVuZGluZ19pZHgoJnNoaW5mby0+ZnJhZ3Nbal0pOwotCQkJeGVudmlmX2lkeF91bm1hcCh2aWYsIHBlbmRpbmdfaWR4KTsKKwkJCXhlbnZpZl9pZHhfdW5tYXAocXVldWUsIHBlbmRpbmdfaWR4KTsKIAkJfQogCiAJCS8qIFJlbWVtYmVyIHRoZSBlcnJvcjogaW52YWxpZGF0ZSBhbGwgc3Vic2VxdWVudCBmcmFnbWVudHMuICovCkBAIC0xMDg0LDcgKzExMDcsNyBAQAogCQlzaGluZm8gPSBza2Jfc2hpbmZvKGZpcnN0X3NrYik7CiAJCWZvciAoaiA9IDA7IGogPCBzaGluZm8tPm5yX2ZyYWdzOyBqKyspIHsKIAkJCXBlbmRpbmdfaWR4ID0gZnJhZ19nZXRfcGVuZGluZ19pZHgoJnNoaW5mby0+ZnJhZ3Nbal0pOwotCQkJeGVudmlmX2lkeF91bm1hcCh2aWYsIHBlbmRpbmdfaWR4KTsKKwkJCXhlbnZpZl9pZHhfdW5tYXAocXVldWUsIHBlbmRpbmdfaWR4KTsKIAkJfQogCX0KIApAQCAtMTA5Miw3ICsxMTE1LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCB4ZW52aWZfZmlsbF9mcmFncyhzdHJ1Y3QgeGVudmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB4ZW52aWZfZmlsbF9mcmFncyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7CiAJaW50IG5yX2ZyYWdzID0gc2hpbmZvLT5ucl9mcmFnczsKQEAgLTExMTAsMjMgKzExMzMsMjMgQEAKIAkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGZyYWcsIGNoYWluIGl0IHRvIHRoZSBwcmV2aW91cyovCiAJCWlmIChwcmV2X3BlbmRpbmdfaWR4ID09IElOVkFMSURfUEVORElOR19JRFgpCiAJCQlza2Jfc2hpbmZvKHNrYiktPmRlc3RydWN0b3JfYXJnID0KLQkJCQkmY2FsbGJhY2tfcGFyYW0odmlmLCBwZW5kaW5nX2lkeCk7CisJCQkJJmNhbGxiYWNrX3BhcmFtKHF1ZXVlLCBwZW5kaW5nX2lkeCk7CiAJCWVsc2UKLQkJCWNhbGxiYWNrX3BhcmFtKHZpZiwgcHJldl9wZW5kaW5nX2lkeCkuY3R4ID0KLQkJCQkmY2FsbGJhY2tfcGFyYW0odmlmLCBwZW5kaW5nX2lkeCk7CisJCQljYWxsYmFja19wYXJhbShxdWV1ZSwgcHJldl9wZW5kaW5nX2lkeCkuY3R4ID0KKwkJCQkmY2FsbGJhY2tfcGFyYW0ocXVldWUsIHBlbmRpbmdfaWR4KTsKIAotCQljYWxsYmFja19wYXJhbSh2aWYsIHBlbmRpbmdfaWR4KS5jdHggPSBOVUxMOworCQljYWxsYmFja19wYXJhbShxdWV1ZSwgcGVuZGluZ19pZHgpLmN0eCA9IE5VTEw7CiAJCXByZXZfcGVuZGluZ19pZHggPSBwZW5kaW5nX2lkeDsKIAotCQl0eHAgPSAmdmlmLT5wZW5kaW5nX3R4X2luZm9bcGVuZGluZ19pZHhdLnJlcTsKLQkJcGFnZSA9IHZpcnRfdG9fcGFnZShpZHhfdG9fa2FkZHIodmlmLCBwZW5kaW5nX2lkeCkpOworCQl0eHAgPSAmcXVldWUtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxOworCQlwYWdlID0gdmlydF90b19wYWdlKGlkeF90b19rYWRkcihxdWV1ZSwgcGVuZGluZ19pZHgpKTsKIAkJX19za2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBpLCBwYWdlLCB0eHAtPm9mZnNldCwgdHhwLT5zaXplKTsKIAkJc2tiLT5sZW4gKz0gdHhwLT5zaXplOwogCQlza2ItPmRhdGFfbGVuICs9IHR4cC0+c2l6ZTsKIAkJc2tiLT50cnVlc2l6ZSArPSB0eHAtPnNpemU7CiAKIAkJLyogVGFrZSBhbiBleHRyYSByZWZlcmVuY2UgdG8gb2Zmc2V0IG5ldHdvcmsgc3RhY2sncyBwdXRfcGFnZSAqLwotCQlnZXRfcGFnZSh2aWYtPm1tYXBfcGFnZXNbcGVuZGluZ19pZHhdKTsKKwkJZ2V0X3BhZ2UocXVldWUtPm1tYXBfcGFnZXNbcGVuZGluZ19pZHhdKTsKIAl9CiAJLyogRklYTUU6IF9fc2tiX2ZpbGxfcGFnZV9kZXNjIHNldCB0aGlzIHRvIHRydWUgYmVjYXVzZSBwYWdlLT5wZm1lbWFsbG9jCiAJICogb3ZlcmxhcHMgd2l0aCAiaW5kZXgiLCBhbmQgIm1hcHBpbmciIGlzIG5vdCBzZXQuIEkgdGhpbmsgbWFwcGluZwpAQCAtMTEzNiwzMyArMTE1OSwzMyBAQAogCXNrYi0+cGZtZW1hbGxvYwk9IGZhbHNlOwogfQogCi1zdGF0aWMgaW50IHhlbnZpZl9nZXRfZXh0cmFzKHN0cnVjdCB4ZW52aWYgKnZpZiwKK3N0YXRpYyBpbnQgeGVudmlmX2dldF9leHRyYXMoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpleHRyYXMsCiAJCQkJaW50IHdvcmtfdG9fZG8pCiB7CiAJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvIGV4dHJhOwotCVJJTkdfSURYIGNvbnMgPSB2aWYtPnR4LnJlcV9jb25zOworCVJJTkdfSURYIGNvbnMgPSBxdWV1ZS0+dHgucmVxX2NvbnM7CiAKIAlkbyB7CiAJCWlmICh1bmxpa2VseSh3b3JrX3RvX2RvLS0gPD0gMCkpIHsKLQkJCW5ldGRldl9lcnIodmlmLT5kZXYsICJNaXNzaW5nIGV4dHJhIGluZm9cbiIpOwotCQkJeGVudmlmX2ZhdGFsX3R4X2Vycih2aWYpOworCQkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsICJNaXNzaW5nIGV4dHJhIGluZm9cbiIpOworCQkJeGVudmlmX2ZhdGFsX3R4X2VycihxdWV1ZS0+dmlmKTsKIAkJCXJldHVybiAtRUJBRFI7CiAJCX0KIAotCQltZW1jcHkoJmV4dHJhLCBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnR4LCBjb25zKSwKKwkJbWVtY3B5KCZleHRyYSwgUklOR19HRVRfUkVRVUVTVCgmcXVldWUtPnR4LCBjb25zKSwKIAkJICAgICAgIHNpemVvZihleHRyYSkpOwogCQlpZiAodW5saWtlbHkoIWV4dHJhLnR5cGUgfHwKIAkJCSAgICAgZXh0cmEudHlwZSA+PSBYRU5fTkVUSUZfRVhUUkFfVFlQRV9NQVgpKSB7Ci0JCQl2aWYtPnR4LnJlcV9jb25zID0gKytjb25zOwotCQkJbmV0ZGV2X2Vycih2aWYtPmRldiwKKwkJCXF1ZXVlLT50eC5yZXFfY29ucyA9ICsrY29uczsKKwkJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAogCQkJCSAgICJJbnZhbGlkIGV4dHJhIHR5cGU6ICVkXG4iLCBleHRyYS50eXBlKTsKLQkJCXhlbnZpZl9mYXRhbF90eF9lcnIodmlmKTsKKwkJCXhlbnZpZl9mYXRhbF90eF9lcnIocXVldWUtPnZpZik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCW1lbWNweSgmZXh0cmFzW2V4dHJhLnR5cGUgLSAxXSwgJmV4dHJhLCBzaXplb2YoZXh0cmEpKTsKLQkJdmlmLT50eC5yZXFfY29ucyA9ICsrY29uczsKKwkJcXVldWUtPnR4LnJlcV9jb25zID0gKytjb25zOwogCX0gd2hpbGUgKGV4dHJhLmZsYWdzICYgWEVOX05FVElGX0VYVFJBX0ZMQUdfTU9SRSk7CiAKIAlyZXR1cm4gd29ya190b19kbzsKQEAgLTExOTcsNyArMTIyMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tzdW1fc2V0dXAoc3RydWN0IHhlbnZpZiAqdmlmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBjaGVja3N1bV9zZXR1cChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlib29sIHJlY2FsY3VsYXRlX3BhcnRpYWxfY3N1bSA9IGZhbHNlOwogCkBAIC0xMjA3LDcgKzEyMzAsNyBAQAogCSAqIHJlY2FsY3VsYXRlIHRoZSBwYXJ0aWFsIGNoZWNrc3VtLgogCSAqLwogCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMICYmIHNrYl9pc19nc28oc2tiKSkgewotCQl2aWYtPnJ4X2dzb19jaGVja3N1bV9maXh1cCsrOworCQlxdWV1ZS0+c3RhdHMucnhfZ3NvX2NoZWNrc3VtX2ZpeHVwKys7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJcmVjYWxjdWxhdGVfcGFydGlhbF9jc3VtID0gdHJ1ZTsKIAl9CkBAIC0xMjE5LDMxICsxMjQyLDMxIEBACiAJcmV0dXJuIHNrYl9jaGVja3N1bV9zZXR1cChza2IsIHJlY2FsY3VsYXRlX3BhcnRpYWxfY3N1bSk7CiB9CiAKLXN0YXRpYyBib29sIHR4X2NyZWRpdF9leGNlZWRlZChzdHJ1Y3QgeGVudmlmICp2aWYsIHVuc2lnbmVkIHNpemUpCitzdGF0aWMgYm9vbCB0eF9jcmVkaXRfZXhjZWVkZWQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJdTY0IG5vdyA9IGdldF9qaWZmaWVzXzY0KCk7Ci0JdTY0IG5leHRfY3JlZGl0ID0gdmlmLT5jcmVkaXRfd2luZG93X3N0YXJ0ICsKLQkJbXNlY3NfdG9famlmZmllcyh2aWYtPmNyZWRpdF91c2VjIC8gMTAwMCk7CisJdTY0IG5leHRfY3JlZGl0ID0gcXVldWUtPmNyZWRpdF93aW5kb3dfc3RhcnQgKworCQltc2Vjc190b19qaWZmaWVzKHF1ZXVlLT5jcmVkaXRfdXNlYyAvIDEwMDApOwogCiAJLyogVGltZXIgY291bGQgYWxyZWFkeSBiZSBwZW5kaW5nIGluIHJhcmUgY2FzZXMuICovCi0JaWYgKHRpbWVyX3BlbmRpbmcoJnZpZi0+Y3JlZGl0X3RpbWVvdXQpKQorCWlmICh0aW1lcl9wZW5kaW5nKCZxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQpKQogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qIFBhc3NlZCB0aGUgcG9pbnQgd2hlcmUgd2UgY2FuIHJlcGxlbmlzaCBjcmVkaXQ/ICovCiAJaWYgKHRpbWVfYWZ0ZXJfZXE2NChub3csIG5leHRfY3JlZGl0KSkgewotCQl2aWYtPmNyZWRpdF93aW5kb3dfc3RhcnQgPSBub3c7Ci0JCXR4X2FkZF9jcmVkaXQodmlmKTsKKwkJcXVldWUtPmNyZWRpdF93aW5kb3dfc3RhcnQgPSBub3c7CisJCXR4X2FkZF9jcmVkaXQocXVldWUpOwogCX0KIAogCS8qIFN0aWxsIHRvbyBiaWcgdG8gc2VuZCByaWdodCBub3c/IFNldCBhIGNhbGxiYWNrLiAqLwotCWlmIChzaXplID4gdmlmLT5yZW1haW5pbmdfY3JlZGl0KSB7Ci0JCXZpZi0+Y3JlZGl0X3RpbWVvdXQuZGF0YSAgICAgPQotCQkJKHVuc2lnbmVkIGxvbmcpdmlmOwotCQl2aWYtPmNyZWRpdF90aW1lb3V0LmZ1bmN0aW9uID0KKwlpZiAoc2l6ZSA+IHF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0KSB7CisJCXF1ZXVlLT5jcmVkaXRfdGltZW91dC5kYXRhICAgICA9CisJCQkodW5zaWduZWQgbG9uZylxdWV1ZTsKKwkJcXVldWUtPmNyZWRpdF90aW1lb3V0LmZ1bmN0aW9uID0KIAkJCXR4X2NyZWRpdF9jYWxsYmFjazsKLQkJbW9kX3RpbWVyKCZ2aWYtPmNyZWRpdF90aW1lb3V0LAorCQltb2RfdGltZXIoJnF1ZXVlLT5jcmVkaXRfdGltZW91dCwKIAkJCSAgbmV4dF9jcmVkaXQpOwotCQl2aWYtPmNyZWRpdF93aW5kb3dfc3RhcnQgPSBuZXh0X2NyZWRpdDsKKwkJcXVldWUtPmNyZWRpdF93aW5kb3dfc3RhcnQgPSBuZXh0X2NyZWRpdDsKIAogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0xMjUxLDE2ICsxMjc0LDE2IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCB4ZW52aWZfdHhfYnVpbGRfZ29wcyhzdHJ1Y3QgeGVudmlmICp2aWYsCitzdGF0aWMgdm9pZCB4ZW52aWZfdHhfYnVpbGRfZ29wcyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCQkgICAgIGludCBidWRnZXQsCiAJCQkJICAgICB1bnNpZ25lZCAqY29weV9vcHMsCiAJCQkJICAgICB1bnNpZ25lZCAqbWFwX29wcykKIHsKLQlzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgKmdvcCA9IHZpZi0+dHhfbWFwX29wcywgKnJlcXVlc3RfZ29wOworCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqZ29wID0gcXVldWUtPnR4X21hcF9vcHMsICpyZXF1ZXN0X2dvcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXQ7CiAKLQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmdmlmLT50eF9xdWV1ZSkgPCBidWRnZXQpIHsKKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcXVldWUtPnR4X3F1ZXVlKSA8IGJ1ZGdldCkgewogCQlzdHJ1Y3QgeGVuX25ldGlmX3R4X3JlcXVlc3QgdHhyZXE7CiAJCXN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCB0eGZyYWdzW1hFTl9ORVRCS19MRUdBQ1lfU0xPVFNfTUFYXTsKIAkJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvIGV4dHJhc1tYRU5fTkVUSUZfRVhUUkFfVFlQRV9NQVgtMV07CkBAIC0xMjcwLDY5ICsxMjkzLDY5IEBACiAJCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKIAkJcGVuZGluZ19yaW5nX2lkeF90IGluZGV4OwogCi0JCWlmICh2aWYtPnR4LnNyaW5nLT5yZXFfcHJvZCAtIHZpZi0+dHgucmVxX2NvbnMgPgorCQlpZiAocXVldWUtPnR4LnNyaW5nLT5yZXFfcHJvZCAtIHF1ZXVlLT50eC5yZXFfY29ucyA+CiAJCSAgICBYRU5fTkVUSUZfVFhfUklOR19TSVpFKSB7Ci0JCQluZXRkZXZfZXJyKHZpZi0+ZGV2LAorCQkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsCiAJCQkJICAgIkltcG9zc2libGUgbnVtYmVyIG9mIHJlcXVlc3RzLiAiCiAJCQkJICAgInJlcV9wcm9kICVkLCByZXFfY29ucyAlZCwgc2l6ZSAlbGRcbiIsCi0JCQkJICAgdmlmLT50eC5zcmluZy0+cmVxX3Byb2QsIHZpZi0+dHgucmVxX2NvbnMsCisJCQkJICAgcXVldWUtPnR4LnNyaW5nLT5yZXFfcHJvZCwgcXVldWUtPnR4LnJlcV9jb25zLAogCQkJCSAgIFhFTl9ORVRJRl9UWF9SSU5HX1NJWkUpOwotCQkJeGVudmlmX2ZhdGFsX3R4X2Vycih2aWYpOworCQkJeGVudmlmX2ZhdGFsX3R4X2VycihxdWV1ZS0+dmlmKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJd29ya190b19kbyA9IFJJTkdfSEFTX1VOQ09OU1VNRURfUkVRVUVTVFMoJnZpZi0+dHgpOworCQl3b3JrX3RvX2RvID0gUklOR19IQVNfVU5DT05TVU1FRF9SRVFVRVNUUygmcXVldWUtPnR4KTsKIAkJaWYgKCF3b3JrX3RvX2RvKQogCQkJYnJlYWs7CiAKLQkJaWR4ID0gdmlmLT50eC5yZXFfY29uczsKKwkJaWR4ID0gcXVldWUtPnR4LnJlcV9jb25zOwogCQlybWIoKTsgLyogRW5zdXJlIHRoYXQgd2Ugc2VlIHRoZSByZXF1ZXN0IGJlZm9yZSB3ZSBjb3B5IGl0LiAqLwotCQltZW1jcHkoJnR4cmVxLCBSSU5HX0dFVF9SRVFVRVNUKCZ2aWYtPnR4LCBpZHgpLCBzaXplb2YodHhyZXEpKTsKKwkJbWVtY3B5KCZ0eHJlcSwgUklOR19HRVRfUkVRVUVTVCgmcXVldWUtPnR4LCBpZHgpLCBzaXplb2YodHhyZXEpKTsKIAogCQkvKiBDcmVkaXQtYmFzZWQgc2NoZWR1bGluZy4gKi8KLQkJaWYgKHR4cmVxLnNpemUgPiB2aWYtPnJlbWFpbmluZ19jcmVkaXQgJiYKLQkJICAgIHR4X2NyZWRpdF9leGNlZWRlZCh2aWYsIHR4cmVxLnNpemUpKQorCQlpZiAodHhyZXEuc2l6ZSA+IHF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0ICYmCisJCSAgICB0eF9jcmVkaXRfZXhjZWVkZWQocXVldWUsIHR4cmVxLnNpemUpKQogCQkJYnJlYWs7CiAKLQkJdmlmLT5yZW1haW5pbmdfY3JlZGl0IC09IHR4cmVxLnNpemU7CisJCXF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0IC09IHR4cmVxLnNpemU7CiAKIAkJd29ya190b19kby0tOwotCQl2aWYtPnR4LnJlcV9jb25zID0gKytpZHg7CisJCXF1ZXVlLT50eC5yZXFfY29ucyA9ICsraWR4OwogCiAJCW1lbXNldChleHRyYXMsIDAsIHNpemVvZihleHRyYXMpKTsKIAkJaWYgKHR4cmVxLmZsYWdzICYgWEVOX05FVFRYRl9leHRyYV9pbmZvKSB7Ci0JCQl3b3JrX3RvX2RvID0geGVudmlmX2dldF9leHRyYXModmlmLCBleHRyYXMsCisJCQl3b3JrX3RvX2RvID0geGVudmlmX2dldF9leHRyYXMocXVldWUsIGV4dHJhcywKIAkJCQkJCSAgICAgICB3b3JrX3RvX2RvKTsKLQkJCWlkeCA9IHZpZi0+dHgucmVxX2NvbnM7CisJCQlpZHggPSBxdWV1ZS0+dHgucmVxX2NvbnM7CiAJCQlpZiAodW5saWtlbHkod29ya190b19kbyA8IDApKQogCQkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0geGVudmlmX2NvdW50X3JlcXVlc3RzKHZpZiwgJnR4cmVxLCB0eGZyYWdzLCB3b3JrX3RvX2RvKTsKKwkJcmV0ID0geGVudmlmX2NvdW50X3JlcXVlc3RzKHF1ZXVlLCAmdHhyZXEsIHR4ZnJhZ3MsIHdvcmtfdG9fZG8pOwogCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCQlicmVhazsKIAogCQlpZHggKz0gcmV0OwogCiAJCWlmICh1bmxpa2VseSh0eHJlcS5zaXplIDwgRVRIX0hMRU4pKSB7Ci0JCQluZXRkZXZfZGJnKHZpZi0+ZGV2LAorCQkJbmV0ZGV2X2RiZyhxdWV1ZS0+dmlmLT5kZXYsCiAJCQkJICAgIkJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIHR4cmVxLnNpemUpOwotCQkJeGVudmlmX3R4X2Vycih2aWYsICZ0eHJlcSwgaWR4KTsKKwkJCXhlbnZpZl90eF9lcnIocXVldWUsICZ0eHJlcSwgaWR4KTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLyogTm8gY3Jvc3NpbmcgYSBwYWdlIGFzIHRoZSBwYXlsb2FkIG11c3RuJ3QgZnJhZ21lbnQuICovCiAJCWlmICh1bmxpa2VseSgodHhyZXEub2Zmc2V0ICsgdHhyZXEuc2l6ZSkgPiBQQUdFX1NJWkUpKSB7Ci0JCQluZXRkZXZfZXJyKHZpZi0+ZGV2LAorCQkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsCiAJCQkJICAgInR4cmVxLm9mZnNldDogJXgsIHNpemU6ICV1LCBlbmQ6ICVsdVxuIiwKIAkJCQkgICB0eHJlcS5vZmZzZXQsIHR4cmVxLnNpemUsCiAJCQkJICAgKHR4cmVxLm9mZnNldCZ+UEFHRV9NQVNLKSArIHR4cmVxLnNpemUpOwotCQkJeGVudmlmX2ZhdGFsX3R4X2Vycih2aWYpOworCQkJeGVudmlmX2ZhdGFsX3R4X2VycihxdWV1ZS0+dmlmKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaW5kZXggPSBwZW5kaW5nX2luZGV4KHZpZi0+cGVuZGluZ19jb25zKTsKLQkJcGVuZGluZ19pZHggPSB2aWYtPnBlbmRpbmdfcmluZ1tpbmRleF07CisJCWluZGV4ID0gcGVuZGluZ19pbmRleChxdWV1ZS0+cGVuZGluZ19jb25zKTsKKwkJcGVuZGluZ19pZHggPSBxdWV1ZS0+cGVuZGluZ19yaW5nW2luZGV4XTsKIAogCQlkYXRhX2xlbiA9ICh0eHJlcS5zaXplID4gUEtUX1BST1RfTEVOICYmCiAJCQkgICAgcmV0IDwgWEVOX05FVEJLX0xFR0FDWV9TTE9UU19NQVgpID8KQEAgLTEzNDAsOSArMTM2Myw5IEBACiAKIAkJc2tiID0geGVudmlmX2FsbG9jX3NrYihkYXRhX2xlbik7CiAJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKLQkJCW5ldGRldl9kYmcodmlmLT5kZXYsCisJCQluZXRkZXZfZGJnKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkgICAiQ2FuJ3QgYWxsb2NhdGUgYSBza2IgaW4gc3RhcnRfeG1pdC5cbiIpOwotCQkJeGVudmlmX3R4X2Vycih2aWYsICZ0eHJlcSwgaWR4KTsKKwkJCXhlbnZpZl90eF9lcnIocXVldWUsICZ0eHJlcSwgaWR4KTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEzNTAsNyArMTM3Myw3IEBACiAJCQlzdHJ1Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKmdzbzsKIAkJCWdzbyA9ICZleHRyYXNbWEVOX05FVElGX0VYVFJBX1RZUEVfR1NPIC0gMV07CiAKLQkJCWlmICh4ZW52aWZfc2V0X3NrYl9nc28odmlmLCBza2IsIGdzbykpIHsKKwkJCWlmICh4ZW52aWZfc2V0X3NrYl9nc28ocXVldWUtPnZpZiwgc2tiLCBnc28pKSB7CiAJCQkJLyogRmFpbHVyZSBpbiB4ZW52aWZfc2V0X3NrYl9nc28gaXMgZmF0YWwuICovCiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJYnJlYWs7CkBAIC0xMzYwLDE4ICsxMzgzLDE4IEBACiAJCVhFTlZJRl9UWF9DQihza2IpLT5wZW5kaW5nX2lkeCA9IHBlbmRpbmdfaWR4OwogCiAJCV9fc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKLQkJdmlmLT50eF9jb3B5X29wc1sqY29weV9vcHNdLnNvdXJjZS51LnJlZiA9IHR4cmVxLmdyZWY7Ci0JCXZpZi0+dHhfY29weV9vcHNbKmNvcHlfb3BzXS5zb3VyY2UuZG9taWQgPSB2aWYtPmRvbWlkOwotCQl2aWYtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uc291cmNlLm9mZnNldCA9IHR4cmVxLm9mZnNldDsKKwkJcXVldWUtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uc291cmNlLnUucmVmID0gdHhyZXEuZ3JlZjsKKwkJcXVldWUtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uc291cmNlLmRvbWlkID0gcXVldWUtPnZpZi0+ZG9taWQ7CisJCXF1ZXVlLT50eF9jb3B5X29wc1sqY29weV9vcHNdLnNvdXJjZS5vZmZzZXQgPSB0eHJlcS5vZmZzZXQ7CiAKLQkJdmlmLT50eF9jb3B5X29wc1sqY29weV9vcHNdLmRlc3QudS5nbWZuID0KKwkJcXVldWUtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uZGVzdC51LmdtZm4gPQogCQkJdmlydF90b19tZm4oc2tiLT5kYXRhKTsKLQkJdmlmLT50eF9jb3B5X29wc1sqY29weV9vcHNdLmRlc3QuZG9taWQgPSBET01JRF9TRUxGOwotCQl2aWYtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uZGVzdC5vZmZzZXQgPQorCQlxdWV1ZS0+dHhfY29weV9vcHNbKmNvcHlfb3BzXS5kZXN0LmRvbWlkID0gRE9NSURfU0VMRjsKKwkJcXVldWUtPnR4X2NvcHlfb3BzWypjb3B5X29wc10uZGVzdC5vZmZzZXQgPQogCQkJb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKTsKIAotCQl2aWYtPnR4X2NvcHlfb3BzWypjb3B5X29wc10ubGVuID0gZGF0YV9sZW47Ci0JCXZpZi0+dHhfY29weV9vcHNbKmNvcHlfb3BzXS5mbGFncyA9IEdOVENPUFlfc291cmNlX2dyZWY7CisJCXF1ZXVlLT50eF9jb3B5X29wc1sqY29weV9vcHNdLmxlbiA9IGRhdGFfbGVuOworCQlxdWV1ZS0+dHhfY29weV9vcHNbKmNvcHlfb3BzXS5mbGFncyA9IEdOVENPUFlfc291cmNlX2dyZWY7CiAKIAkJKCpjb3B5X29wcykrKzsKIApAQCAtMTM4MCw0MiArMTQwMyw0MiBAQAogCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOwogCQkJZnJhZ19zZXRfcGVuZGluZ19pZHgoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0sCiAJCQkJCSAgICAgcGVuZGluZ19pZHgpOwotCQkJeGVudmlmX3R4X2NyZWF0ZV9tYXBfb3AodmlmLCBwZW5kaW5nX2lkeCwgJnR4cmVxLCBnb3ApOworCQkJeGVudmlmX3R4X2NyZWF0ZV9tYXBfb3AocXVldWUsIHBlbmRpbmdfaWR4LCAmdHhyZXEsIGdvcCk7CiAJCQlnb3ArKzsKIAkJfSBlbHNlIHsKIAkJCWZyYWdfc2V0X3BlbmRpbmdfaWR4KCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLAogCQkJCQkgICAgIElOVkFMSURfUEVORElOR19JRFgpOwotCQkJbWVtY3B5KCZ2aWYtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxLCAmdHhyZXEsCisJCQltZW1jcHkoJnF1ZXVlLT5wZW5kaW5nX3R4X2luZm9bcGVuZGluZ19pZHhdLnJlcSwgJnR4cmVxLAogCQkJICAgICAgIHNpemVvZih0eHJlcSkpOwogCQl9CiAKLQkJdmlmLT5wZW5kaW5nX2NvbnMrKzsKKwkJcXVldWUtPnBlbmRpbmdfY29ucysrOwogCi0JCXJlcXVlc3RfZ29wID0geGVudmlmX2dldF9yZXF1ZXN0cyh2aWYsIHNrYiwgdHhmcmFncywgZ29wKTsKKwkJcmVxdWVzdF9nb3AgPSB4ZW52aWZfZ2V0X3JlcXVlc3RzKHF1ZXVlLCBza2IsIHR4ZnJhZ3MsIGdvcCk7CiAJCWlmIChyZXF1ZXN0X2dvcCA9PSBOVUxMKSB7CiAJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXhlbnZpZl90eF9lcnIodmlmLCAmdHhyZXEsIGlkeCk7CisJCQl4ZW52aWZfdHhfZXJyKHF1ZXVlLCAmdHhyZXEsIGlkeCk7CiAJCQlicmVhazsKIAkJfQogCQlnb3AgPSByZXF1ZXN0X2dvcDsKIAotCQlfX3NrYl9xdWV1ZV90YWlsKCZ2aWYtPnR4X3F1ZXVlLCBza2IpOworCQlfX3NrYl9xdWV1ZV90YWlsKCZxdWV1ZS0+dHhfcXVldWUsIHNrYik7CiAKLQkJdmlmLT50eC5yZXFfY29ucyA9IGlkeDsKKwkJcXVldWUtPnR4LnJlcV9jb25zID0gaWR4OwogCi0JCWlmICgoKGdvcC12aWYtPnR4X21hcF9vcHMpID49IEFSUkFZX1NJWkUodmlmLT50eF9tYXBfb3BzKSkgfHwKLQkJICAgICgqY29weV9vcHMgPj0gQVJSQVlfU0laRSh2aWYtPnR4X2NvcHlfb3BzKSkpCisJCWlmICgoKGdvcC1xdWV1ZS0+dHhfbWFwX29wcykgPj0gQVJSQVlfU0laRShxdWV1ZS0+dHhfbWFwX29wcykpIHx8CisJCSAgICAoKmNvcHlfb3BzID49IEFSUkFZX1NJWkUocXVldWUtPnR4X2NvcHlfb3BzKSkpCiAJCQlicmVhazsKIAl9CiAKLQkoKm1hcF9vcHMpID0gZ29wIC0gdmlmLT50eF9tYXBfb3BzOworCSgqbWFwX29wcykgPSBnb3AgLSBxdWV1ZS0+dHhfbWFwX29wczsKIAlyZXR1cm47CiB9CiAKIC8qIENvbnNvbGlkYXRlIHNrYiB3aXRoIGEgZnJhZ19saXN0IGludG8gYSBicmFuZCBuZXcgb25lIHdpdGggbG9jYWwgcGFnZXMgb24KICAqIGZyYWdzLiBSZXR1cm5zIDAgb3IgLUVOT01FTSBpZiBjYW4ndCBhbGxvY2F0ZSBuZXcgcGFnZXMuCiAgKi8KLXN0YXRpYyBpbnQgeGVudmlmX2hhbmRsZV9mcmFnX2xpc3Qoc3RydWN0IHhlbnZpZiAqdmlmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCB4ZW52aWZfaGFuZGxlX2ZyYWdfbGlzdChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2tiX2hlYWRsZW4oc2tiKTsKIAlza2JfZnJhZ190IGZyYWdzW01BWF9TS0JfRlJBR1NdOwpAQCAtMTQyMywxMCArMTQ0NiwxMCBAQAogCXN0cnVjdCB1YnVmX2luZm8gKnVhcmc7CiAJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAotCXZpZi0+dHhfemVyb2NvcHlfc2VudCArPSAyOwotCXZpZi0+dHhfZnJhZ19vdmVyZmxvdysrOworCXF1ZXVlLT5zdGF0cy50eF96ZXJvY29weV9zZW50ICs9IDI7CisJcXVldWUtPnN0YXRzLnR4X2ZyYWdfb3ZlcmZsb3crKzsKIAotCXhlbnZpZl9maWxsX2ZyYWdzKHZpZiwgbnNrYik7CisJeGVudmlmX2ZpbGxfZnJhZ3MocXVldWUsIG5za2IpOwogCS8qIFN1YnRyYWN0IGZyYWdzIHNpemUsIHdlIHdpbGwgY29ycmVjdCBpdCBsYXRlciAqLwogCXNrYi0+dHJ1ZXNpemUgLT0gc2tiLT5kYXRhX2xlbjsKIAlza2ItPmxlbiArPSBuc2tiLT5sZW47CkBAIC0xNDc4LDM3ICsxNTAxLDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeGVudmlmX3R4X3N1Ym1pdChzdHJ1Y3QgeGVudmlmICp2aWYpCitzdGF0aWMgaW50IHhlbnZpZl90eF9zdWJtaXQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7Ci0Jc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmICpnb3BfbWFwID0gdmlmLT50eF9tYXBfb3BzOwotCXN0cnVjdCBnbnR0YWJfY29weSAqZ29wX2NvcHkgPSB2aWYtPnR4X2NvcHlfb3BzOworCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqZ29wX21hcCA9IHF1ZXVlLT50eF9tYXBfb3BzOworCXN0cnVjdCBnbnR0YWJfY29weSAqZ29wX2NvcHkgPSBxdWV1ZS0+dHhfY29weV9vcHM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgd29ya19kb25lID0gMDsKIAotCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmdmlmLT50eF9xdWV1ZSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnF1ZXVlLT50eF9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJc3RydWN0IHhlbl9uZXRpZl90eF9yZXF1ZXN0ICp0eHA7CiAJCXUxNiBwZW5kaW5nX2lkeDsKIAkJdW5zaWduZWQgZGF0YV9sZW47CiAKIAkJcGVuZGluZ19pZHggPSBYRU5WSUZfVFhfQ0Ioc2tiKS0+cGVuZGluZ19pZHg7Ci0JCXR4cCA9ICZ2aWYtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxOworCQl0eHAgPSAmcXVldWUtPnBlbmRpbmdfdHhfaW5mb1twZW5kaW5nX2lkeF0ucmVxOwogCiAJCS8qIENoZWNrIHRoZSByZW1hcCBlcnJvciBjb2RlLiAqLwotCQlpZiAodW5saWtlbHkoeGVudmlmX3R4X2NoZWNrX2dvcCh2aWYsIHNrYiwgJmdvcF9tYXAsICZnb3BfY29weSkpKSB7CisJCWlmICh1bmxpa2VseSh4ZW52aWZfdHhfY2hlY2tfZ29wKHF1ZXVlLCBza2IsICZnb3BfbWFwLCAmZ29wX2NvcHkpKSkgewogCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IDA7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJZGF0YV9sZW4gPSBza2ItPmxlbjsKLQkJY2FsbGJhY2tfcGFyYW0odmlmLCBwZW5kaW5nX2lkeCkuY3R4ID0gTlVMTDsKKwkJY2FsbGJhY2tfcGFyYW0ocXVldWUsIHBlbmRpbmdfaWR4KS5jdHggPSBOVUxMOwogCQlpZiAoZGF0YV9sZW4gPCB0eHAtPnNpemUpIHsKIAkJCS8qIEFwcGVuZCB0aGUgcGFja2V0IHBheWxvYWQgYXMgYSBmcmFnbWVudC4gKi8KIAkJCXR4cC0+b2Zmc2V0ICs9IGRhdGFfbGVuOwogCQkJdHhwLT5zaXplIC09IGRhdGFfbGVuOwogCQl9IGVsc2UgewogCQkJLyogU2NoZWR1bGUgYSByZXNwb25zZSBpbW1lZGlhdGVseS4gKi8KLQkJCXhlbnZpZl9pZHhfcmVsZWFzZSh2aWYsIHBlbmRpbmdfaWR4LAorCQkJeGVudmlmX2lkeF9yZWxlYXNlKHF1ZXVlLCBwZW5kaW5nX2lkeCwKIAkJCQkJICAgWEVOX05FVElGX1JTUF9PS0FZKTsKIAkJfQogCkBAIC0xNTE3LDEyICsxNTQwLDEyIEBACiAJCWVsc2UgaWYgKHR4cC0+ZmxhZ3MgJiBYRU5fTkVUVFhGX2RhdGFfdmFsaWRhdGVkKQogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCQl4ZW52aWZfZmlsbF9mcmFncyh2aWYsIHNrYik7CisJCXhlbnZpZl9maWxsX2ZyYWdzKHF1ZXVlLCBza2IpOwogCiAJCWlmICh1bmxpa2VseShza2JfaGFzX2ZyYWdfbGlzdChza2IpKSkgewotCQkJaWYgKHhlbnZpZl9oYW5kbGVfZnJhZ19saXN0KHZpZiwgc2tiKSkgeworCQkJaWYgKHhlbnZpZl9oYW5kbGVfZnJhZ19saXN0KHF1ZXVlLCBza2IpKSB7CiAJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJbmV0ZGV2X2Vycih2aWYtPmRldiwKKwkJCQkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsCiAJCQkJCQkgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gY29uc29saWRhdGUgZnJhZ19saXN0IVxuIik7CiAJCQkJc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyB8PSBTS0JUWF9ERVZfWkVST0NPUFk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xNTM1LDEyICsxNTU4LDEyIEBACiAJCQlfX3Bza2JfcHVsbF90YWlsKHNrYiwgdGFyZ2V0IC0gc2tiX2hlYWRsZW4oc2tiKSk7CiAJCX0KIAotCQlza2ItPmRldiAgICAgID0gdmlmLT5kZXY7CisJCXNrYi0+ZGV2ICAgICAgPSBxdWV1ZS0+dmlmLT5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKIAkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKLQkJaWYgKGNoZWNrc3VtX3NldHVwKHZpZiwgc2tiKSkgewotCQkJbmV0ZGV2X2RiZyh2aWYtPmRldiwKKwkJaWYgKGNoZWNrc3VtX3NldHVwKHF1ZXVlLCBza2IpKSB7CisJCQluZXRkZXZfZGJnKHF1ZXVlLT52aWYtPmRldiwKIAkJCQkgICAiQ2FuJ3Qgc2V0dXAgY2hlY2tzdW0gaW4gbmV0X3R4X2FjdGlvblxuIik7CiAJCQkvKiBXZSBoYXZlIHRvIHNldCB0aGlzIGZsYWcgdG8gdHJpZ2dlciB0aGUgY2FsbGJhY2sgKi8KIAkJCWlmIChza2Jfc2hpbmZvKHNrYiktPmRlc3RydWN0b3JfYXJnKQpAQCAtMTU2NSw4ICsxNTg4LDggQEAKIAkJCQlESVZfUk9VTkRfVVAoc2tiLT5sZW4gLSBoZHJsZW4sIG1zcyk7CiAJCX0KIAotCQl2aWYtPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCXZpZi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXF1ZXVlLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcXVldWUtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCQl3b3JrX2RvbmUrKzsKIApAQCAtMTU3Nyw3ICsxNjAwLDcgQEAKIAkJICovCiAJCWlmIChza2Jfc2hpbmZvKHNrYiktPmRlc3RydWN0b3JfYXJnKSB7CiAJCQlza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzIHw9IFNLQlRYX0RFVl9aRVJPQ09QWTsKLQkJCXZpZi0+dHhfemVyb2NvcHlfc2VudCsrOworCQkJcXVldWUtPnN0YXRzLnR4X3plcm9jb3B5X3NlbnQrKzsKIAkJfQogCiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CkBAIC0xNTkwLDQ3ICsxNjEzLDQ3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlwZW5kaW5nX3JpbmdfaWR4X3QgaW5kZXg7Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gdWJ1Zl90b192aWYodWJ1Zik7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSB1YnVmX3RvX3F1ZXVlKHVidWYpOwogCiAJLyogVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBncmFiIHRoaXMgbG9jaywgdG8gcHJvdGVjdCBjYWxsYmFja3MKIAkgKiBmcm9tIGVhY2ggb3RoZXIuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZpZi0+Y2FsbGJhY2tfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+Y2FsbGJhY2tfbG9jaywgZmxhZ3MpOwogCWRvIHsKIAkJdTE2IHBlbmRpbmdfaWR4ID0gdWJ1Zi0+ZGVzYzsKIAkJdWJ1ZiA9IChzdHJ1Y3QgdWJ1Zl9pbmZvICopIHVidWYtPmN0eDsKLQkJQlVHX09OKHZpZi0+ZGVhbGxvY19wcm9kIC0gdmlmLT5kZWFsbG9jX2NvbnMgPj0KKwkJQlVHX09OKHF1ZXVlLT5kZWFsbG9jX3Byb2QgLSBxdWV1ZS0+ZGVhbGxvY19jb25zID49CiAJCQlNQVhfUEVORElOR19SRVFTKTsKLQkJaW5kZXggPSBwZW5kaW5nX2luZGV4KHZpZi0+ZGVhbGxvY19wcm9kKTsKLQkJdmlmLT5kZWFsbG9jX3JpbmdbaW5kZXhdID0gcGVuZGluZ19pZHg7CisJCWluZGV4ID0gcGVuZGluZ19pbmRleChxdWV1ZS0+ZGVhbGxvY19wcm9kKTsKKwkJcXVldWUtPmRlYWxsb2NfcmluZ1tpbmRleF0gPSBwZW5kaW5nX2lkeDsKIAkJLyogU3luYyB3aXRoIHhlbnZpZl90eF9kZWFsbG9jX2FjdGlvbjoKIAkJICogaW5zZXJ0IGlkeCB0aGVuIGluY3IgcHJvZHVjZXIuCiAJCSAqLwogCQlzbXBfd21iKCk7Ci0JCXZpZi0+ZGVhbGxvY19wcm9kKys7CisJCXF1ZXVlLT5kZWFsbG9jX3Byb2QrKzsKIAl9IHdoaWxlICh1YnVmKTsKLQl3YWtlX3VwKCZ2aWYtPmRlYWxsb2Nfd3EpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZi0+Y2FsbGJhY2tfbG9jaywgZmxhZ3MpOworCXdha2VfdXAoJnF1ZXVlLT5kZWFsbG9jX3dxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+Y2FsbGJhY2tfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGxpa2VseSh6ZXJvY29weV9zdWNjZXNzKSkKLQkJdmlmLT50eF96ZXJvY29weV9zdWNjZXNzKys7CisJCXF1ZXVlLT5zdGF0cy50eF96ZXJvY29weV9zdWNjZXNzKys7CiAJZWxzZQotCQl2aWYtPnR4X3plcm9jb3B5X2ZhaWwrKzsKKwkJcXVldWUtPnN0YXRzLnR4X3plcm9jb3B5X2ZhaWwrKzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHhlbnZpZl90eF9kZWFsbG9jX2FjdGlvbihzdHJ1Y3QgeGVudmlmICp2aWYpCitzdGF0aWMgaW5saW5lIHZvaWQgeGVudmlmX3R4X2RlYWxsb2NfYWN0aW9uKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewogCXN0cnVjdCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmICpnb3A7CiAJcGVuZGluZ19yaW5nX2lkeF90IGRjLCBkcDsKIAl1MTYgcGVuZGluZ19pZHgsIHBlbmRpbmdfaWR4X3JlbGVhc2VbTUFYX1BFTkRJTkdfUkVRU107CiAJdW5zaWduZWQgaW50IGkgPSAwOwogCi0JZGMgPSB2aWYtPmRlYWxsb2NfY29uczsKLQlnb3AgPSB2aWYtPnR4X3VubWFwX29wczsKKwlkYyA9IHF1ZXVlLT5kZWFsbG9jX2NvbnM7CisJZ29wID0gcXVldWUtPnR4X3VubWFwX29wczsKIAogCS8qIEZyZWUgdXAgYW55IGdyYW50cyB3ZSBoYXZlIGZpbmlzaGVkIHVzaW5nICovCiAJZG8gewotCQlkcCA9IHZpZi0+ZGVhbGxvY19wcm9kOworCQlkcCA9IHF1ZXVlLT5kZWFsbG9jX3Byb2Q7CiAKIAkJLyogRW5zdXJlIHdlIHNlZSBhbGwgaW5kaWNlcyBlbnF1ZXVlZCBieSBhbGwKIAkJICogeGVudmlmX3plcm9jb3B5X2NhbGxiYWNrKCkuCkBAIC0xNjM4LDM4ICsxNjYxLDM4IEBACiAJCXNtcF9ybWIoKTsKIAogCQl3aGlsZSAoZGMgIT0gZHApIHsKLQkJCUJVR19PTihnb3AgLSB2aWYtPnR4X3VubWFwX29wcyA+IE1BWF9QRU5ESU5HX1JFUVMpOworCQkJQlVHX09OKGdvcCAtIHF1ZXVlLT50eF91bm1hcF9vcHMgPiBNQVhfUEVORElOR19SRVFTKTsKIAkJCXBlbmRpbmdfaWR4ID0KLQkJCQl2aWYtPmRlYWxsb2NfcmluZ1twZW5kaW5nX2luZGV4KGRjKyspXTsKKwkJCQlxdWV1ZS0+ZGVhbGxvY19yaW5nW3BlbmRpbmdfaW5kZXgoZGMrKyldOwogCi0JCQlwZW5kaW5nX2lkeF9yZWxlYXNlW2dvcC12aWYtPnR4X3VubWFwX29wc10gPQorCQkJcGVuZGluZ19pZHhfcmVsZWFzZVtnb3AtcXVldWUtPnR4X3VubWFwX29wc10gPQogCQkJCXBlbmRpbmdfaWR4OwotCQkJdmlmLT5wYWdlc190b191bm1hcFtnb3AtdmlmLT50eF91bm1hcF9vcHNdID0KLQkJCQl2aWYtPm1tYXBfcGFnZXNbcGVuZGluZ19pZHhdOworCQkJcXVldWUtPnBhZ2VzX3RvX3VubWFwW2dvcC1xdWV1ZS0+dHhfdW5tYXBfb3BzXSA9CisJCQkJcXVldWUtPm1tYXBfcGFnZXNbcGVuZGluZ19pZHhdOwogCQkJZ250dGFiX3NldF91bm1hcF9vcChnb3AsCi0JCQkJCSAgICBpZHhfdG9fa2FkZHIodmlmLCBwZW5kaW5nX2lkeCksCisJCQkJCSAgICBpZHhfdG9fa2FkZHIocXVldWUsIHBlbmRpbmdfaWR4KSwKIAkJCQkJICAgIEdOVE1BUF9ob3N0X21hcCwKLQkJCQkJICAgIHZpZi0+Z3JhbnRfdHhfaGFuZGxlW3BlbmRpbmdfaWR4XSk7Ci0JCQl4ZW52aWZfZ3JhbnRfaGFuZGxlX3Jlc2V0KHZpZiwgcGVuZGluZ19pZHgpOworCQkJCQkgICAgcXVldWUtPmdyYW50X3R4X2hhbmRsZVtwZW5kaW5nX2lkeF0pOworCQkJeGVudmlmX2dyYW50X2hhbmRsZV9yZXNldChxdWV1ZSwgcGVuZGluZ19pZHgpOwogCQkJKytnb3A7CiAJCX0KIAotCX0gd2hpbGUgKGRwICE9IHZpZi0+ZGVhbGxvY19wcm9kKTsKKwl9IHdoaWxlIChkcCAhPSBxdWV1ZS0+ZGVhbGxvY19wcm9kKTsKIAotCXZpZi0+ZGVhbGxvY19jb25zID0gZGM7CisJcXVldWUtPmRlYWxsb2NfY29ucyA9IGRjOwogCi0JaWYgKGdvcCAtIHZpZi0+dHhfdW5tYXBfb3BzID4gMCkgeworCWlmIChnb3AgLSBxdWV1ZS0+dHhfdW5tYXBfb3BzID4gMCkgewogCQlpbnQgcmV0OwotCQlyZXQgPSBnbnR0YWJfdW5tYXBfcmVmcyh2aWYtPnR4X3VubWFwX29wcywKKwkJcmV0ID0gZ250dGFiX3VubWFwX3JlZnMocXVldWUtPnR4X3VubWFwX29wcywKIAkJCQkJTlVMTCwKLQkJCQkJdmlmLT5wYWdlc190b191bm1hcCwKLQkJCQkJZ29wIC0gdmlmLT50eF91bm1hcF9vcHMpOworCQkJCQlxdWV1ZS0+cGFnZXNfdG9fdW5tYXAsCisJCQkJCWdvcCAtIHF1ZXVlLT50eF91bm1hcF9vcHMpOwogCQlpZiAocmV0KSB7Ci0JCQluZXRkZXZfZXJyKHZpZi0+ZGV2LCAiVW5tYXAgZmFpbDogbnJfb3BzICV0eCByZXQgJWRcbiIsCi0JCQkJICAgZ29wIC0gdmlmLT50eF91bm1hcF9vcHMsIHJldCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZ29wIC0gdmlmLT50eF91bm1hcF9vcHM7ICsraSkgeworCQkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsICJVbm1hcCBmYWlsOiBucl9vcHMgJXR4IHJldCAlZFxuIiwKKwkJCQkgICBnb3AgLSBxdWV1ZS0+dHhfdW5tYXBfb3BzLCByZXQpOworCQkJZm9yIChpID0gMDsgaSA8IGdvcCAtIHF1ZXVlLT50eF91bm1hcF9vcHM7ICsraSkgewogCQkJCWlmIChnb3BbaV0uc3RhdHVzICE9IEdOVFNUX29rYXkpCi0JCQkJCW5ldGRldl9lcnIodmlmLT5kZXYsCisJCQkJCW5ldGRldl9lcnIocXVldWUtPnZpZi0+ZGV2LAogCQkJCQkJICAgIiBob3N0X2FkZHI6ICVsbHggaGFuZGxlOiAleCBzdGF0dXM6ICVkXG4iLAogCQkJCQkJICAgZ29wW2ldLmhvc3RfYWRkciwKIAkJCQkJCSAgIGdvcFtpXS5oYW5kbGUsCkBAIC0xNjc5LDkxICsxNzAyLDkxIEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgZ29wIC0gdmlmLT50eF91bm1hcF9vcHM7ICsraSkKLQkJeGVudmlmX2lkeF9yZWxlYXNlKHZpZiwgcGVuZGluZ19pZHhfcmVsZWFzZVtpXSwKKwlmb3IgKGkgPSAwOyBpIDwgZ29wIC0gcXVldWUtPnR4X3VubWFwX29wczsgKytpKQorCQl4ZW52aWZfaWR4X3JlbGVhc2UocXVldWUsIHBlbmRpbmdfaWR4X3JlbGVhc2VbaV0sCiAJCQkJICAgWEVOX05FVElGX1JTUF9PS0FZKTsKIH0KIAogCiAvKiBDYWxsZWQgYWZ0ZXIgbmV0ZnJvbnQgaGFzIHRyYW5zbWl0dGVkICovCi1pbnQgeGVudmlmX3R4X2FjdGlvbihzdHJ1Y3QgeGVudmlmICp2aWYsIGludCBidWRnZXQpCitpbnQgeGVudmlmX3R4X2FjdGlvbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgaW50IGJ1ZGdldCkKIHsKIAl1bnNpZ25lZCBucl9tb3BzLCBucl9jb3BzID0gMDsKIAlpbnQgd29ya19kb25lLCByZXQ7CiAKLQlpZiAodW5saWtlbHkoIXR4X3dvcmtfdG9kbyh2aWYpKSkKKwlpZiAodW5saWtlbHkoIXR4X3dvcmtfdG9kbyhxdWV1ZSkpKQogCQlyZXR1cm4gMDsKIAotCXhlbnZpZl90eF9idWlsZF9nb3BzKHZpZiwgYnVkZ2V0LCAmbnJfY29wcywgJm5yX21vcHMpOworCXhlbnZpZl90eF9idWlsZF9nb3BzKHF1ZXVlLCBidWRnZXQsICZucl9jb3BzLCAmbnJfbW9wcyk7CiAKIAlpZiAobnJfY29wcyA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWdudHRhYl9iYXRjaF9jb3B5KHZpZi0+dHhfY29weV9vcHMsIG5yX2NvcHMpOworCWdudHRhYl9iYXRjaF9jb3B5KHF1ZXVlLT50eF9jb3B5X29wcywgbnJfY29wcyk7CiAJaWYgKG5yX21vcHMgIT0gMCkgewotCQlyZXQgPSBnbnR0YWJfbWFwX3JlZnModmlmLT50eF9tYXBfb3BzLAorCQlyZXQgPSBnbnR0YWJfbWFwX3JlZnMocXVldWUtPnR4X21hcF9vcHMsCiAJCQkJICAgICAgTlVMTCwKLQkJCQkgICAgICB2aWYtPnBhZ2VzX3RvX21hcCwKKwkJCQkgICAgICBxdWV1ZS0+cGFnZXNfdG9fbWFwLAogCQkJCSAgICAgIG5yX21vcHMpOwogCQlCVUdfT04ocmV0KTsKIAl9CiAKLQl3b3JrX2RvbmUgPSB4ZW52aWZfdHhfc3VibWl0KHZpZik7CisJd29ya19kb25lID0geGVudmlmX3R4X3N1Ym1pdChxdWV1ZSk7CiAKIAlyZXR1cm4gd29ya19kb25lOwogfQogCi1zdGF0aWMgdm9pZCB4ZW52aWZfaWR4X3JlbGVhc2Uoc3RydWN0IHhlbnZpZiAqdmlmLCB1MTYgcGVuZGluZ19pZHgsCitzdGF0aWMgdm9pZCB4ZW52aWZfaWR4X3JlbGVhc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIHUxNiBwZW5kaW5nX2lkeCwKIAkJCSAgICAgICB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfdHhfaW5mbyAqcGVuZGluZ190eF9pbmZvOwogCXBlbmRpbmdfcmluZ19pZHhfdCBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcGVuZGluZ190eF9pbmZvID0gJnZpZi0+cGVuZGluZ190eF9pbmZvW3BlbmRpbmdfaWR4XTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlmLT5yZXNwb25zZV9sb2NrLCBmbGFncyk7Ci0JbWFrZV90eF9yZXNwb25zZSh2aWYsICZwZW5kaW5nX3R4X2luZm8tPnJlcSwgc3RhdHVzKTsKLQlpbmRleCA9IHBlbmRpbmdfaW5kZXgodmlmLT5wZW5kaW5nX3Byb2QpOwotCXZpZi0+cGVuZGluZ19yaW5nW2luZGV4XSA9IHBlbmRpbmdfaWR4OworCXBlbmRpbmdfdHhfaW5mbyA9ICZxdWV1ZS0+cGVuZGluZ190eF9pbmZvW3BlbmRpbmdfaWR4XTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnJlc3BvbnNlX2xvY2ssIGZsYWdzKTsKKwltYWtlX3R4X3Jlc3BvbnNlKHF1ZXVlLCAmcGVuZGluZ190eF9pbmZvLT5yZXEsIHN0YXR1cyk7CisJaW5kZXggPSBwZW5kaW5nX2luZGV4KHF1ZXVlLT5wZW5kaW5nX3Byb2QpOworCXF1ZXVlLT5wZW5kaW5nX3JpbmdbaW5kZXhdID0gcGVuZGluZ19pZHg7CiAJLyogVFggc2hvdWxkbid0IHVzZSB0aGUgaW5kZXggYmVmb3JlIHdlIGdpdmUgaXQgYmFjayBoZXJlICovCiAJbWIoKTsKLQl2aWYtPnBlbmRpbmdfcHJvZCsrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZi0+cmVzcG9uc2VfbG9jaywgZmxhZ3MpOworCXF1ZXVlLT5wZW5kaW5nX3Byb2QrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cmVzcG9uc2VfbG9jaywgZmxhZ3MpOwogfQogCiAKLXN0YXRpYyB2b2lkIG1ha2VfdHhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZiAqdmlmLAorc3RhdGljIHZvaWQgbWFrZV90eF9yZXNwb25zZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKIAkJCSAgICAgc3RydWN0IHhlbl9uZXRpZl90eF9yZXF1ZXN0ICp0eHAsCiAJCQkgICAgIHM4ICAgICAgIHN0KQogewotCVJJTkdfSURYIGkgPSB2aWYtPnR4LnJzcF9wcm9kX3B2dDsKKwlSSU5HX0lEWCBpID0gcXVldWUtPnR4LnJzcF9wcm9kX3B2dDsKIAlzdHJ1Y3QgeGVuX25ldGlmX3R4X3Jlc3BvbnNlICpyZXNwOwogCWludCBub3RpZnk7CiAKLQlyZXNwID0gUklOR19HRVRfUkVTUE9OU0UoJnZpZi0+dHgsIGkpOworCXJlc3AgPSBSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnR4LCBpKTsKIAlyZXNwLT5pZCAgICAgPSB0eHAtPmlkOwogCXJlc3AtPnN0YXR1cyA9IHN0OwogCiAJaWYgKHR4cC0+ZmxhZ3MgJiBYRU5fTkVUVFhGX2V4dHJhX2luZm8pCi0JCVJJTkdfR0VUX1JFU1BPTlNFKCZ2aWYtPnR4LCArK2kpLT5zdGF0dXMgPSBYRU5fTkVUSUZfUlNQX05VTEw7CisJCVJJTkdfR0VUX1JFU1BPTlNFKCZxdWV1ZS0+dHgsICsraSktPnN0YXR1cyA9IFhFTl9ORVRJRl9SU1BfTlVMTDsKIAotCXZpZi0+dHgucnNwX3Byb2RfcHZ0ID0gKytpOwotCVJJTkdfUFVTSF9SRVNQT05TRVNfQU5EX0NIRUNLX05PVElGWSgmdmlmLT50eCwgbm90aWZ5KTsKKwlxdWV1ZS0+dHgucnNwX3Byb2RfcHZ0ID0gKytpOworCVJJTkdfUFVTSF9SRVNQT05TRVNfQU5EX0NIRUNLX05PVElGWSgmcXVldWUtPnR4LCBub3RpZnkpOwogCWlmIChub3RpZnkpCi0JCW5vdGlmeV9yZW1vdGVfdmlhX2lycSh2aWYtPnR4X2lycSk7CisJCW5vdGlmeV9yZW1vdGVfdmlhX2lycShxdWV1ZS0+dHhfaXJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKm1ha2VfcnhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZiAqdmlmLAorc3RhdGljIHN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKm1ha2VfcnhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkJCSAgICAgdTE2ICAgICAgaWQsCiAJCQkJCSAgICAgczggICAgICAgc3QsCiAJCQkJCSAgICAgdTE2ICAgICAgb2Zmc2V0LAogCQkJCQkgICAgIHUxNiAgICAgIHNpemUsCiAJCQkJCSAgICAgdTE2ICAgICAgZmxhZ3MpCiB7Ci0JUklOR19JRFggaSA9IHZpZi0+cngucnNwX3Byb2RfcHZ0OworCVJJTkdfSURYIGkgPSBxdWV1ZS0+cngucnNwX3Byb2RfcHZ0OwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKnJlc3A7CiAKLQlyZXNwID0gUklOR19HRVRfUkVTUE9OU0UoJnZpZi0+cngsIGkpOworCXJlc3AgPSBSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnJ4LCBpKTsKIAlyZXNwLT5vZmZzZXQgICAgID0gb2Zmc2V0OwogCXJlc3AtPmZsYWdzICAgICAgPSBmbGFnczsKIAlyZXNwLT5pZCAgICAgICAgID0gaWQ7CkBAIC0xNzcxLDI2ICsxNzk0LDI2IEBACiAJaWYgKHN0IDwgMCkKIAkJcmVzcC0+c3RhdHVzID0gKHMxNilzdDsKIAotCXZpZi0+cngucnNwX3Byb2RfcHZ0ID0gKytpOworCXF1ZXVlLT5yeC5yc3BfcHJvZF9wdnQgPSArK2k7CiAKIAlyZXR1cm4gcmVzcDsKIH0KIAotdm9pZCB4ZW52aWZfaWR4X3VubWFwKHN0cnVjdCB4ZW52aWYgKnZpZiwgdTE2IHBlbmRpbmdfaWR4KQordm9pZCB4ZW52aWZfaWR4X3VubWFwKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLCB1MTYgcGVuZGluZ19pZHgpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZ250dGFiX3VubWFwX2dyYW50X3JlZiB0eF91bm1hcF9vcDsKIAogCWdudHRhYl9zZXRfdW5tYXBfb3AoJnR4X3VubWFwX29wLAotCQkJICAgIGlkeF90b19rYWRkcih2aWYsIHBlbmRpbmdfaWR4KSwKKwkJCSAgICBpZHhfdG9fa2FkZHIocXVldWUsIHBlbmRpbmdfaWR4KSwKIAkJCSAgICBHTlRNQVBfaG9zdF9tYXAsCi0JCQkgICAgdmlmLT5ncmFudF90eF9oYW5kbGVbcGVuZGluZ19pZHhdKTsKLQl4ZW52aWZfZ3JhbnRfaGFuZGxlX3Jlc2V0KHZpZiwgcGVuZGluZ19pZHgpOworCQkJICAgIHF1ZXVlLT5ncmFudF90eF9oYW5kbGVbcGVuZGluZ19pZHhdKTsKKwl4ZW52aWZfZ3JhbnRfaGFuZGxlX3Jlc2V0KHF1ZXVlLCBwZW5kaW5nX2lkeCk7CiAKIAlyZXQgPSBnbnR0YWJfdW5tYXBfcmVmcygmdHhfdW5tYXBfb3AsIE5VTEwsCi0JCQkJJnZpZi0+bW1hcF9wYWdlc1twZW5kaW5nX2lkeF0sIDEpOworCQkJCSZxdWV1ZS0+bW1hcF9wYWdlc1twZW5kaW5nX2lkeF0sIDEpOwogCWlmIChyZXQpIHsKLQkJbmV0ZGV2X2Vycih2aWYtPmRldiwKKwkJbmV0ZGV2X2VycihxdWV1ZS0+dmlmLT5kZXYsCiAJCQkgICAiVW5tYXAgZmFpbDogcmV0OiAlZCBwZW5kaW5nX2lkeDogJWQgaG9zdF9hZGRyOiAlbGx4IGhhbmRsZTogJXggc3RhdHVzOiAlZFxuIiwKIAkJCSAgIHJldCwKIAkJCSAgIHBlbmRpbmdfaWR4LApAQCAtMTgwMCw0MSArMTgyMyw0MCBAQAogCQlCVUcoKTsKIAl9CiAKLQl4ZW52aWZfaWR4X3JlbGVhc2UodmlmLCBwZW5kaW5nX2lkeCwgWEVOX05FVElGX1JTUF9PS0FZKTsKKwl4ZW52aWZfaWR4X3JlbGVhc2UocXVldWUsIHBlbmRpbmdfaWR4LCBYRU5fTkVUSUZfUlNQX09LQVkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByeF93b3JrX3RvZG8oc3RydWN0IHhlbnZpZiAqdmlmKQorc3RhdGljIGlubGluZSBpbnQgcnhfd29ya190b2RvKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewotCXJldHVybiAoIXNrYl9xdWV1ZV9lbXB0eSgmdmlmLT5yeF9xdWV1ZSkgJiYKLQkgICAgICAgeGVudmlmX3J4X3Jpbmdfc2xvdHNfYXZhaWxhYmxlKHZpZiwgdmlmLT5yeF9sYXN0X3NrYl9zbG90cykpIHx8Ci0JICAgICAgIHZpZi0+cnhfcXVldWVfcHVyZ2U7CisJcmV0dXJuICghc2tiX3F1ZXVlX2VtcHR5KCZxdWV1ZS0+cnhfcXVldWUpICYmCisJICAgICAgIHhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShxdWV1ZSwgcXVldWUtPnJ4X2xhc3Rfc2tiX3Nsb3RzKSkgfHwKKwkgICAgICAgcXVldWUtPnJ4X3F1ZXVlX3B1cmdlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0eF93b3JrX3RvZG8oc3RydWN0IHhlbnZpZiAqdmlmKQorc3RhdGljIGlubGluZSBpbnQgdHhfd29ya190b2RvKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewotCi0JaWYgKGxpa2VseShSSU5HX0hBU19VTkNPTlNVTUVEX1JFUVVFU1RTKCZ2aWYtPnR4KSkpCisJaWYgKGxpa2VseShSSU5HX0hBU19VTkNPTlNVTUVEX1JFUVVFU1RTKCZxdWV1ZS0+dHgpKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHR4X2RlYWxsb2Nfd29ya190b2RvKHN0cnVjdCB4ZW52aWYgKnZpZikKK3N0YXRpYyBpbmxpbmUgYm9vbCB0eF9kZWFsbG9jX3dvcmtfdG9kbyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIHsKLQlyZXR1cm4gdmlmLT5kZWFsbG9jX2NvbnMgIT0gdmlmLT5kZWFsbG9jX3Byb2Q7CisJcmV0dXJuIHF1ZXVlLT5kZWFsbG9jX2NvbnMgIT0gcXVldWUtPmRlYWxsb2NfcHJvZDsKIH0KIAotdm9pZCB4ZW52aWZfdW5tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZiAqdmlmKQordm9pZCB4ZW52aWZfdW5tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7Ci0JaWYgKHZpZi0+dHguc3JpbmcpCi0JCXhlbmJ1c191bm1hcF9yaW5nX3ZmcmVlKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCi0JCQkJCXZpZi0+dHguc3JpbmcpOwotCWlmICh2aWYtPnJ4LnNyaW5nKQotCQl4ZW5idXNfdW5tYXBfcmluZ192ZnJlZSh4ZW52aWZfdG9feGVuYnVzX2RldmljZSh2aWYpLAotCQkJCQl2aWYtPnJ4LnNyaW5nKTsKKwlpZiAocXVldWUtPnR4LnNyaW5nKQorCQl4ZW5idXNfdW5tYXBfcmluZ192ZnJlZSh4ZW52aWZfdG9feGVuYnVzX2RldmljZShxdWV1ZS0+dmlmKSwKKwkJCQkJcXVldWUtPnR4LnNyaW5nKTsKKwlpZiAocXVldWUtPnJ4LnNyaW5nKQorCQl4ZW5idXNfdW5tYXBfcmluZ192ZnJlZSh4ZW52aWZfdG9feGVuYnVzX2RldmljZShxdWV1ZS0+dmlmKSwKKwkJCQkJcXVldWUtPnJ4LnNyaW5nKTsKIH0KIAotaW50IHhlbnZpZl9tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZiAqdmlmLAoraW50IHhlbnZpZl9tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgICBncmFudF9yZWZfdCB0eF9yaW5nX3JlZiwKIAkJCSAgICAgIGdyYW50X3JlZl90IHJ4X3JpbmdfcmVmKQogewpAQCAtMTg0NCw4NSArMTg2Niw3OCBAQAogCiAJaW50IGVyciA9IC1FTk9NRU07CiAKLQllcnIgPSB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCisJZXJyID0geGVuYnVzX21hcF9yaW5nX3ZhbGxvYyh4ZW52aWZfdG9feGVuYnVzX2RldmljZShxdWV1ZS0+dmlmKSwKIAkJCQkgICAgIHR4X3JpbmdfcmVmLCAmYWRkcik7CiAJaWYgKGVycikKIAkJZ290byBlcnI7CiAKIAl0eHMgPSAoc3RydWN0IHhlbl9uZXRpZl90eF9zcmluZyAqKWFkZHI7Ci0JQkFDS19SSU5HX0lOSVQoJnZpZi0+dHgsIHR4cywgUEFHRV9TSVpFKTsKKwlCQUNLX1JJTkdfSU5JVCgmcXVldWUtPnR4LCB0eHMsIFBBR0VfU0laRSk7CiAKLQllcnIgPSB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCisJZXJyID0geGVuYnVzX21hcF9yaW5nX3ZhbGxvYyh4ZW52aWZfdG9feGVuYnVzX2RldmljZShxdWV1ZS0+dmlmKSwKIAkJCQkgICAgIHJ4X3JpbmdfcmVmLCAmYWRkcik7CiAJaWYgKGVycikKIAkJZ290byBlcnI7CiAKIAlyeHMgPSAoc3RydWN0IHhlbl9uZXRpZl9yeF9zcmluZyAqKWFkZHI7Ci0JQkFDS19SSU5HX0lOSVQoJnZpZi0+cngsIHJ4cywgUEFHRV9TSVpFKTsKKwlCQUNLX1JJTkdfSU5JVCgmcXVldWUtPnJ4LCByeHMsIFBBR0VfU0laRSk7CiAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXhlbnZpZl91bm1hcF9mcm9udGVuZF9yaW5ncyh2aWYpOworCXhlbnZpZl91bm1hcF9mcm9udGVuZF9yaW5ncyhxdWV1ZSk7CiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCB4ZW52aWZfc3RvcF9xdWV1ZShzdHJ1Y3QgeGVudmlmICp2aWYpCitzdGF0aWMgdm9pZCB4ZW52aWZfc3RhcnRfcXVldWUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7Ci0JaWYgKCF2aWYtPmNhbl9xdWV1ZSkKLQkJcmV0dXJuOwotCi0JbmV0aWZfc3RvcF9xdWV1ZSh2aWYtPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbnZpZl9zdGFydF9xdWV1ZShzdHJ1Y3QgeGVudmlmICp2aWYpCi17Ci0JaWYgKHhlbnZpZl9zY2hlZHVsYWJsZSh2aWYpKQotCQluZXRpZl93YWtlX3F1ZXVlKHZpZi0+ZGV2KTsKKwlpZiAoeGVudmlmX3NjaGVkdWxhYmxlKHF1ZXVlLT52aWYpKQorCQl4ZW52aWZfd2FrZV9xdWV1ZShxdWV1ZSk7CiB9CiAKIGludCB4ZW52aWZfa3RocmVhZF9ndWVzdF9yeCh2b2lkICpkYXRhKQogewotCXN0cnVjdCB4ZW52aWYgKnZpZiA9IGRhdGE7CisJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSBkYXRhOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodmlmLT53cSwKLQkJCQkJIHJ4X3dvcmtfdG9kbyh2aWYpIHx8Ci0JCQkJCSB2aWYtPmRpc2FibGVkIHx8CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShxdWV1ZS0+d3EsCisJCQkJCSByeF93b3JrX3RvZG8ocXVldWUpIHx8CisJCQkJCSBxdWV1ZS0+dmlmLT5kaXNhYmxlZCB8fAogCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAogCQkvKiBUaGlzIGZyb250ZW5kIGlzIGZvdW5kIHRvIGJlIHJvZ3VlLCBkaXNhYmxlIGl0IGluCiAJCSAqIGt0aHJlYWQgY29udGV4dC4gQ3VycmVudGx5IHRoaXMgaXMgb25seSBzZXQgd2hlbgogCQkgKiBuZXRiYWNrIGZpbmRzIG91dCBmcm9udGVuZCBzZW5kcyBtYWxmb3JtZWQgcGFja2V0LAogCQkgKiBidXQgd2UgY2Fubm90IGRpc2FibGUgdGhlIGludGVyZmFjZSBpbiBzb2Z0aXJxCi0JCSAqIGNvbnRleHQgc28gd2UgZGVmZXIgaXQgaGVyZS4KKwkJICogY29udGV4dCBzbyB3ZSBkZWZlciBpdCBoZXJlLCBpZiB0aGlzIHRocmVhZCBpcworCQkgKiBhc3NvY2lhdGVkIHdpdGggcXVldWUgMC4KIAkJICovCi0JCWlmICh1bmxpa2VseSh2aWYtPmRpc2FibGVkICYmIG5ldGlmX2NhcnJpZXJfb2sodmlmLT5kZXYpKSkKLQkJCXhlbnZpZl9jYXJyaWVyX29mZih2aWYpOworCQlpZiAodW5saWtlbHkocXVldWUtPnZpZi0+ZGlzYWJsZWQgJiYgbmV0aWZfY2Fycmllcl9vayhxdWV1ZS0+dmlmLT5kZXYpICYmIHF1ZXVlLT5pZCA9PSAwKSkKKwkJCXhlbnZpZl9jYXJyaWVyX29mZihxdWV1ZS0+dmlmKTsKIAogCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJYnJlYWs7CiAKLQkJaWYgKHZpZi0+cnhfcXVldWVfcHVyZ2UpIHsKLQkJCXNrYl9xdWV1ZV9wdXJnZSgmdmlmLT5yeF9xdWV1ZSk7Ci0JCQl2aWYtPnJ4X3F1ZXVlX3B1cmdlID0gZmFsc2U7CisJCWlmIChxdWV1ZS0+cnhfcXVldWVfcHVyZ2UpIHsKKwkJCXNrYl9xdWV1ZV9wdXJnZSgmcXVldWUtPnJ4X3F1ZXVlKTsKKwkJCXF1ZXVlLT5yeF9xdWV1ZV9wdXJnZSA9IGZhbHNlOwogCQl9CiAKLQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnZpZi0+cnhfcXVldWUpKQotCQkJeGVudmlmX3J4X2FjdGlvbih2aWYpOworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcXVldWUtPnJ4X3F1ZXVlKSkKKwkJCXhlbnZpZl9yeF9hY3Rpb24ocXVldWUpOwogCi0JCWlmIChza2JfcXVldWVfZW1wdHkoJnZpZi0+cnhfcXVldWUpICYmCi0JCSAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKHZpZi0+ZGV2KSkgewotCQkJZGVsX3RpbWVyX3N5bmMoJnZpZi0+d2FrZV9xdWV1ZSk7Ci0JCQl4ZW52aWZfc3RhcnRfcXVldWUodmlmKTsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcXVldWUtPnJ4X3F1ZXVlKSAmJgorCQkgICAgeGVudmlmX3F1ZXVlX3N0b3BwZWQocXVldWUpKSB7CisJCQlkZWxfdGltZXJfc3luYygmcXVldWUtPndha2VfcXVldWUpOworCQkJeGVudmlmX3N0YXJ0X3F1ZXVlKHF1ZXVlKTsKIAkJfQogCiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAogCS8qIEJpbiBhbnkgcmVtYWluaW5nIHNrYnMgKi8KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ2aWYtPnJ4X3F1ZXVlKSkgIT0gTlVMTCkKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZxdWV1ZS0+cnhfcXVldWUpKSAhPSBOVUxMKQogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlyZXR1cm4gMDsKQEAgLTE5MzAsMjIgKzE5NDUsMjIgQEAKIAogaW50IHhlbnZpZl9kZWFsbG9jX2t0aHJlYWQodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgeGVudmlmICp2aWYgPSBkYXRhOworCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlID0gZGF0YTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh2aWYtPmRlYWxsb2Nfd3EsCi0JCQkJCSB0eF9kZWFsbG9jX3dvcmtfdG9kbyh2aWYpIHx8CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShxdWV1ZS0+ZGVhbGxvY193cSwKKwkJCQkJIHR4X2RlYWxsb2Nfd29ya190b2RvKHF1ZXVlKSB8fAogCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCWJyZWFrOwogCi0JCXhlbnZpZl90eF9kZWFsbG9jX2FjdGlvbih2aWYpOworCQl4ZW52aWZfdHhfZGVhbGxvY19hY3Rpb24ocXVldWUpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKIAkvKiBVbm1hcCBhbnl0aGluZyByZW1haW5pbmcqLwotCWlmICh0eF9kZWFsbG9jX3dvcmtfdG9kbyh2aWYpKQotCQl4ZW52aWZfdHhfZGVhbGxvY19hY3Rpb24odmlmKTsKKwlpZiAodHhfZGVhbGxvY193b3JrX3RvZG8ocXVldWUpKQorCQl4ZW52aWZfdHhfZGVhbGxvY19hY3Rpb24ocXVldWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTU3LDYgKzE5NzIsOSBAQAogCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIEFsbG93IGFzIG1hbnkgcXVldWVzIGFzIHRoZXJlIGFyZSBDUFVzLCBieSBkZWZhdWx0ICovCisJeGVudmlmX21heF9xdWV1ZXMgPSBudW1fb25saW5lX2NwdXMoKTsKKwogCWlmIChmYXRhbF9za2Jfc2xvdHMgPCBYRU5fTkVUQktfTEVHQUNZX1NMT1RTX01BWCkgewogCQlwcl9pbmZvKCJmYXRhbF9za2Jfc2xvdHMgdG9vIHNtYWxsICglZCksIGJ1bXAgaXQgdG8gWEVOX05FVEJLX0xFR0FDWV9TTE9UU19NQVggKCVkKVxuIiwKIAkJCWZhdGFsX3NrYl9zbG90cywgWEVOX05FVEJLX0xFR0FDWV9TTE9UU19NQVgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYwppbmRleCA3YTIwNmNmLi45NmM2M2RjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMKQEAgLTE5LDYgKzE5LDggQEAKICovCiAKICNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBiYWNrZW5kX2luZm8gewogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXY7CkBAIC0zNCw4ICszNiw5IEBACiAJdTggaGF2ZV9ob3RwbHVnX3N0YXR1c193YXRjaDoxOwogfTsKIAotc3RhdGljIGludCBjb25uZWN0X3JpbmdzKHN0cnVjdCBiYWNrZW5kX2luZm8gKik7Ci1zdGF0aWMgdm9pZCBjb25uZWN0KHN0cnVjdCBiYWNrZW5kX2luZm8gKik7CitzdGF0aWMgaW50IGNvbm5lY3RfcmluZ3Moc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsIHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKTsKK3N0YXRpYyB2b2lkIGNvbm5lY3Qoc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOworc3RhdGljIGludCByZWFkX3hlbmJ1c192aWZfZmxhZ3Moc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOwogc3RhdGljIHZvaWQgYmFja2VuZF9jcmVhdGVfeGVudmlmKHN0cnVjdCBiYWNrZW5kX2luZm8gKmJlKTsKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfaG90cGx1Z19zdGF0dXNfd2F0Y2goc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOwogc3RhdGljIHZvaWQgc2V0X2JhY2tlbmRfc3RhdGUoc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsCkBAIC0xNTcsNiArMTYwLDEyIEBACiAJaWYgKGVycikKIAkJcHJfZGVidWcoIkVycm9yIHdyaXRpbmcgZmVhdHVyZS1zcGxpdC1ldmVudC1jaGFubmVsc1xuIik7CiAKKwkvKiBNdWx0aS1xdWV1ZSBzdXBwb3J0OiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZlYXR1cmUuICovCisJZXJyID0geGVuYnVzX3ByaW50ZihYQlRfTklMLCBkZXYtPm5vZGVuYW1lLAorCQkJICAgICJtdWx0aS1xdWV1ZS1tYXgtcXVldWVzIiwgIiV1IiwgeGVudmlmX21heF9xdWV1ZXMpOworCWlmIChlcnIpCisJCXByX2RlYnVnKCJFcnJvciB3cml0aW5nIG11bHRpLXF1ZXVlLW1heC1xdWV1ZXNcbiIpOworCiAJZXJyID0geGVuYnVzX3N3aXRjaF9zdGF0ZShkZXYsIFhlbmJ1c1N0YXRlSW5pdFdhaXQpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKQEAgLTQ4NSwxMCArNDk0LDI2IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gYmUtPmRldjsKKwl1bnNpZ25lZCBsb25nIGNyZWRpdF9ieXRlcywgY3JlZGl0X3VzZWM7CisJdW5zaWduZWQgaW50IHF1ZXVlX2luZGV4OworCXVuc2lnbmVkIGludCByZXF1ZXN0ZWRfbnVtX3F1ZXVlczsKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZTsKIAotCWVyciA9IGNvbm5lY3RfcmluZ3MoYmUpOwotCWlmIChlcnIpCisJLyogQ2hlY2sgd2hldGhlciB0aGUgZnJvbnRlbmQgcmVxdWVzdGVkIG11bHRpcGxlIHF1ZXVlcworCSAqIGFuZCByZWFkIHRoZSBudW1iZXIgcmVxdWVzdGVkLgorCSAqLworCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBkZXYtPm90aGVyZW5kLAorCQkJICAgIm11bHRpLXF1ZXVlLW51bS1xdWV1ZXMiLAorCQkJICAgIiV1IiwgJnJlcXVlc3RlZF9udW1fcXVldWVzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlyZXF1ZXN0ZWRfbnVtX3F1ZXVlcyA9IDE7IC8qIEZhbGwgYmFjayB0byBzaW5nbGUgcXVldWUgKi8KKwl9IGVsc2UgaWYgKHJlcXVlc3RlZF9udW1fcXVldWVzID4geGVudmlmX21heF9xdWV1ZXMpIHsKKwkJLyogYnVnZ3kgb3IgbWFsaWNpb3VzIGd1ZXN0ICovCisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsCisJCQkJICJndWVzdCByZXF1ZXN0ZWQgJXUgcXVldWVzLCBleGNlZWRpbmcgdGhlIG1heGltdW0gb2YgJXUuIiwKKwkJCQkgcmVxdWVzdGVkX251bV9xdWV1ZXMsIHhlbnZpZl9tYXhfcXVldWVzKTsKIAkJcmV0dXJuOworCX0KIAogCWVyciA9IHhlbl9uZXRfcmVhZF9tYWMoZGV2LCBiZS0+dmlmLT5mZV9kZXZfYWRkcik7CiAJaWYgKGVycikgewpAQCAtNDk2LDkgKzUyMSw1NCBAQAogCQlyZXR1cm47CiAJfQogCi0JeGVuX25ldF9yZWFkX3JhdGUoZGV2LCAmYmUtPnZpZi0+Y3JlZGl0X2J5dGVzLAotCQkJICAmYmUtPnZpZi0+Y3JlZGl0X3VzZWMpOwotCWJlLT52aWYtPnJlbWFpbmluZ19jcmVkaXQgPSBiZS0+dmlmLT5jcmVkaXRfYnl0ZXM7CisJeGVuX25ldF9yZWFkX3JhdGUoZGV2LCAmY3JlZGl0X2J5dGVzLCAmY3JlZGl0X3VzZWMpOworCXJlYWRfeGVuYnVzX3ZpZl9mbGFncyhiZSk7CisKKwkvKiBVc2UgdGhlIG51bWJlciBvZiBxdWV1ZXMgcmVxdWVzdGVkIGJ5IHRoZSBmcm9udGVuZCAqLworCWJlLT52aWYtPnF1ZXVlcyA9IHZ6YWxsb2MocmVxdWVzdGVkX251bV9xdWV1ZXMgKgorCQkJCSAgc2l6ZW9mKHN0cnVjdCB4ZW52aWZfcXVldWUpKTsKKwlydG5sX2xvY2soKTsKKwluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKGJlLT52aWYtPmRldiwgcmVxdWVzdGVkX251bV9xdWV1ZXMpOworCXJ0bmxfdW5sb2NrKCk7CisKKwlmb3IgKHF1ZXVlX2luZGV4ID0gMDsgcXVldWVfaW5kZXggPCByZXF1ZXN0ZWRfbnVtX3F1ZXVlczsgKytxdWV1ZV9pbmRleCkgeworCQlxdWV1ZSA9ICZiZS0+dmlmLT5xdWV1ZXNbcXVldWVfaW5kZXhdOworCQlxdWV1ZS0+dmlmID0gYmUtPnZpZjsKKwkJcXVldWUtPmlkID0gcXVldWVfaW5kZXg7CisJCXNucHJpbnRmKHF1ZXVlLT5uYW1lLCBzaXplb2YocXVldWUtPm5hbWUpLCAiJXMtcSV1IiwKKwkJCQliZS0+dmlmLT5kZXYtPm5hbWUsIHF1ZXVlLT5pZCk7CisKKwkJZXJyID0geGVudmlmX2luaXRfcXVldWUocXVldWUpOworCQlpZiAoZXJyKSB7CisJCQkvKiB4ZW52aWZfaW5pdF9xdWV1ZSgpIGNsZWFucyB1cCBhZnRlciBpdHNlbGYgb24KKwkJCSAqIGZhaWx1cmUsIGJ1dCB3ZSBuZWVkIHRvIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5CisJCQkgKiBpbml0aWFsaXNlZCBxdWV1ZXMuIFNldCBudW1fcXVldWVzIHRvIGkgc28gdGhhdAorCQkJICogZWFybGllciBxdWV1ZXMgY2FuIGJlIGRlc3Ryb3llZCB1c2luZyB0aGUgcmVndWxhcgorCQkJICogZGlzY29ubmVjdCBsb2dpYy4KKwkJCSAqLworCQkJcnRubF9sb2NrKCk7CisJCQluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKGJlLT52aWYtPmRldiwgcXVldWVfaW5kZXgpOworCQkJcnRubF91bmxvY2soKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcXVldWUtPnJlbWFpbmluZ19jcmVkaXQgPSBjcmVkaXRfYnl0ZXM7CisKKwkJZXJyID0gY29ubmVjdF9yaW5ncyhiZSwgcXVldWUpOworCQlpZiAoZXJyKSB7CisJCQkvKiBjb25uZWN0X3JpbmdzKCkgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBvbiBmYWlsdXJlLAorCQkJICogYnV0IHdlIG5lZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgeGVudmlmX2luaXRfcXVldWUoKSBoZXJlLAorCQkJICogYW5kIGFsc28gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgaW5pdGlhbGlzZWQgcXVldWVzLgorCQkJICovCisJCQl4ZW52aWZfZGVpbml0X3F1ZXVlKHF1ZXVlKTsKKwkJCXJ0bmxfbG9jaygpOworCQkJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhiZS0+dmlmLT5kZXYsIHF1ZXVlX2luZGV4KTsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXhlbnZpZl9jYXJyaWVyX29uKGJlLT52aWYpOwogCiAJdW5yZWdpc3Rlcl9ob3RwbHVnX3N0YXR1c193YXRjaChiZSk7CiAJZXJyID0geGVuYnVzX3dhdGNoX3BhdGhmbXQoZGV2LCAmYmUtPmhvdHBsdWdfc3RhdHVzX3dhdGNoLApAQCAtNTA3LDQ1ICs1NzcsMTA5IEBACiAJaWYgKCFlcnIpCiAJCWJlLT5oYXZlX2hvdHBsdWdfc3RhdHVzX3dhdGNoID0gMTsKIAotCW5ldGlmX3dha2VfcXVldWUoYmUtPnZpZi0+ZGV2KTsKKwluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoYmUtPnZpZi0+ZGV2KTsKKworCXJldHVybjsKKworZXJyOgorCWlmIChiZS0+dmlmLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA+IDApCisJCXhlbnZpZl9kaXNjb25uZWN0KGJlLT52aWYpOyAvKiBDbGVhbiB1cCBleGlzdGluZyBxdWV1ZXMgKi8KKwl2ZnJlZShiZS0+dmlmLT5xdWV1ZXMpOworCWJlLT52aWYtPnF1ZXVlcyA9IE5VTEw7CisJcnRubF9sb2NrKCk7CisJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhiZS0+dmlmLT5kZXYsIDApOworCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuOwogfQogCiAKLXN0YXRpYyBpbnQgY29ubmVjdF9yaW5ncyhzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSkKK3N0YXRpYyBpbnQgY29ubmVjdF9yaW5ncyhzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSwgc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gYmUtPnZpZjsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gYmUtPmRldjsKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IHF1ZXVlLT52aWYtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCXVuc2lnbmVkIGxvbmcgdHhfcmluZ19yZWYsIHJ4X3JpbmdfcmVmOwotCXVuc2lnbmVkIGludCB0eF9ldnRjaG4sIHJ4X2V2dGNobiwgcnhfY29weTsKKwl1bnNpZ25lZCBpbnQgdHhfZXZ0Y2huLCByeF9ldnRjaG47CiAJaW50IGVycjsKLQlpbnQgdmFsOworCWNoYXIgKnhzcGF0aDsKKwlzaXplX3QgeHNwYXRoc2l6ZTsKKwljb25zdCBzaXplX3QgeGVuc3RvcmVfcGF0aF9leHRfc2l6ZSA9IDExOyAvKiBzdWZmaWNpZW50IGZvciAiL3F1ZXVlLU5OTiIgKi8KIAotCWVyciA9IHhlbmJ1c19nYXRoZXIoWEJUX05JTCwgZGV2LT5vdGhlcmVuZCwKKwkvKiBJZiB0aGUgZnJvbnRlbmQgcmVxdWVzdGVkIDEgcXVldWUsIG9yIHdlIGhhdmUgZmFsbGVuIGJhY2sKKwkgKiB0byBzaW5nbGUgcXVldWUgZHVlIHRvIGxhY2sgb2YgZnJvbnRlbmQgc3VwcG9ydCBmb3IgbXVsdGktCisJICogcXVldWUsIGV4cGVjdCB0aGUgcmVtYWluaW5nIFhlblN0b3JlIGtleXMgaW4gdGhlIHRvcGxldmVsCisJICogZGlyZWN0b3J5LiBPdGhlcndpc2UsIGV4cGVjdCB0aGVtIGluIGEgc3ViZGlyZWN0b3J5IGNhbGxlZAorCSAqIHF1ZXVlLU4uCisJICovCisJaWYgKG51bV9xdWV1ZXMgPT0gMSkgeworCQl4c3BhdGggPSBremFsbG9jKHN0cmxlbihkZXYtPm90aGVyZW5kKSArIDEsIEdGUF9LRVJORUwpOworCQlpZiAoIXhzcGF0aCkgeworCQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FTk9NRU0sCisJCQkJCSAicmVhZGluZyByaW5nIHJlZmVyZW5jZXMiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXN0cmNweSh4c3BhdGgsIGRldi0+b3RoZXJlbmQpOworCX0gZWxzZSB7CisJCXhzcGF0aHNpemUgPSBzdHJsZW4oZGV2LT5vdGhlcmVuZCkgKyB4ZW5zdG9yZV9wYXRoX2V4dF9zaXplOworCQl4c3BhdGggPSBremFsbG9jKHhzcGF0aHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXhzcGF0aCkgeworCQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FTk9NRU0sCisJCQkJCSAicmVhZGluZyByaW5nIHJlZmVyZW5jZXMiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXNucHJpbnRmKHhzcGF0aCwgeHNwYXRoc2l6ZSwgIiVzL3F1ZXVlLSV1IiwgZGV2LT5vdGhlcmVuZCwKKwkJCSBxdWV1ZS0+aWQpOworCX0KKworCWVyciA9IHhlbmJ1c19nYXRoZXIoWEJUX05JTCwgeHNwYXRoLAogCQkJICAgICJ0eC1yaW5nLXJlZiIsICIlbHUiLCAmdHhfcmluZ19yZWYsCiAJCQkgICAgInJ4LXJpbmctcmVmIiwgIiVsdSIsICZyeF9yaW5nX3JlZiwgTlVMTCk7CiAJaWYgKGVycikgewogCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLAogCQkJCSAicmVhZGluZyAlcy9yaW5nLXJlZiIsCi0JCQkJIGRldi0+b3RoZXJlbmQpOwotCQlyZXR1cm4gZXJyOworCQkJCSB4c3BhdGgpOworCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBUcnkgc3BsaXQgZXZlbnQgY2hhbm5lbHMgZmlyc3QsIHRoZW4gc2luZ2xlIGV2ZW50IGNoYW5uZWwuICovCi0JZXJyID0geGVuYnVzX2dhdGhlcihYQlRfTklMLCBkZXYtPm90aGVyZW5kLAorCWVyciA9IHhlbmJ1c19nYXRoZXIoWEJUX05JTCwgeHNwYXRoLAogCQkJICAgICJldmVudC1jaGFubmVsLXR4IiwgIiV1IiwgJnR4X2V2dGNobiwKIAkJCSAgICAiZXZlbnQtY2hhbm5lbC1yeCIsICIldSIsICZyeF9ldnRjaG4sIE5VTEwpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBkZXYtPm90aGVyZW5kLAorCQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgeHNwYXRoLAogCQkJCSAgICJldmVudC1jaGFubmVsIiwgIiV1IiwgJnR4X2V2dGNobik7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLAogCQkJCQkgInJlYWRpbmcgJXMvZXZlbnQtY2hhbm5lbCgtdHgvcngpIiwKLQkJCQkJIGRldi0+b3RoZXJlbmQpOwotCQkJcmV0dXJuIGVycjsKKwkJCQkJIHhzcGF0aCk7CisJCQlnb3RvIGVycjsKIAkJfQogCQlyeF9ldnRjaG4gPSB0eF9ldnRjaG47CiAJfQogCisJLyogTWFwIHRoZSBzaGFyZWQgZnJhbWUsIGlycSBldGMuICovCisJZXJyID0geGVudmlmX2Nvbm5lY3QocXVldWUsIHR4X3JpbmdfcmVmLCByeF9yaW5nX3JlZiwKKwkJCSAgICAgdHhfZXZ0Y2huLCByeF9ldnRjaG4pOworCWlmIChlcnIpIHsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwKKwkJCQkgIm1hcHBpbmcgc2hhcmVkLWZyYW1lcyAlbHUvJWx1IHBvcnQgdHggJXUgcnggJXUiLAorCQkJCSB0eF9yaW5nX3JlZiwgcnhfcmluZ19yZWYsCisJCQkJIHR4X2V2dGNobiwgcnhfZXZ0Y2huKTsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gMDsKK2VycjogLyogUmVndWxhciByZXR1cm4gZmFsbHMgdGhyb3VnaCB3aXRoIGVyciA9PSAwICovCisJa2ZyZWUoeHNwYXRoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfeGVuYnVzX3ZpZl9mbGFncyhzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSkKK3sKKwlzdHJ1Y3QgeGVudmlmICp2aWYgPSBiZS0+dmlmOworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYgPSBiZS0+ZGV2OworCXVuc2lnbmVkIGludCByeF9jb3B5OworCWludCBlcnIsIHZhbDsKKwogCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBkZXYtPm90aGVyZW5kLCAicmVxdWVzdC1yeC1jb3B5IiwgIiV1IiwKIAkJCSAgICZyeF9jb3B5KTsKIAlpZiAoZXJyID09IC1FTk9FTlQpIHsKQEAgLTYyMSwxNiArNzU1LDYgQEAKIAkJdmFsID0gMDsKIAl2aWYtPmlwdjZfY3N1bSA9ICEhdmFsOwogCi0JLyogTWFwIHRoZSBzaGFyZWQgZnJhbWUsIGlycSBldGMuICovCi0JZXJyID0geGVudmlmX2Nvbm5lY3QodmlmLCB0eF9yaW5nX3JlZiwgcnhfcmluZ19yZWYsCi0JCQkgICAgIHR4X2V2dGNobiwgcnhfZXZ0Y2huKTsKLQlpZiAoZXJyKSB7Ci0JCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsCi0JCQkJICJtYXBwaW5nIHNoYXJlZC1mcmFtZXMgJWx1LyVsdSBwb3J0IHR4ICV1IHJ4ICV1IiwKLQkJCQkgdHhfcmluZ19yZWYsIHJ4X3JpbmdfcmVmLAotCQkJCSB0eF9ldnRjaG4sIHJ4X2V2dGNobik7Ci0JCXJldHVybiBlcnI7Ci0JfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IDE1OGI1ZTYuLjVhNzg3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC01Nyw2ICs1NywxMiBAQAogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oPgogCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCB4ZW5uZXRfbWF4X3F1ZXVlczsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfcXVldWVzLCB4ZW5uZXRfbWF4X3F1ZXVlcywgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9xdWV1ZXMsCisJCSAiTWF4aW11bSBudW1iZXIgb2YgcXVldWVzIHBlciB2aXJ0dWFsIGludGVyZmFjZSIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHhlbm5ldF9ldGh0b29sX29wczsKIAogc3RydWN0IG5ldGZyb250X2NiIHsKQEAgLTczLDYgKzc5LDEyIEBACiAjZGVmaW5lIE5FVF9SWF9SSU5HX1NJWkUgX19DT05TVF9SSU5HX1NJWkUoeGVuX25ldGlmX3J4LCBQQUdFX1NJWkUpCiAjZGVmaW5lIFRYX01BWF9UQVJHRVQgbWluX3QoaW50LCBORVRfVFhfUklOR19TSVpFLCAyNTYpCiAKKy8qIFF1ZXVlIG5hbWUgaXMgaW50ZXJmYWNlIG5hbWUgd2l0aCAiLXFOTk4iIGFwcGVuZGVkICovCisjZGVmaW5lIFFVRVVFX05BTUVfU0laRSAoSUZOQU1TSVogKyA2KQorCisvKiBJUlEgbmFtZSBpcyBxdWV1ZSBuYW1lIHdpdGggIi10eCIgb3IgIi1yeCIgYXBwZW5kZWQgKi8KKyNkZWZpbmUgSVJRX05BTUVfU0laRSAoUVVFVUVfTkFNRV9TSVpFICsgMykKKwogc3RydWN0IG5ldGZyb250X3N0YXRzIHsKIAl1NjQJCQlyeF9wYWNrZXRzOwogCXU2NAkJCXR4X3BhY2tldHM7CkBAIC04MSw5ICs5MywxMiBAQAogCXN0cnVjdCB1NjRfc3RhdHNfc3luYwlzeW5jcDsKIH07CiAKLXN0cnVjdCBuZXRmcm9udF9pbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKK3N0cnVjdCBuZXRmcm9udF9pbmZvOworCitzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgeworCXVuc2lnbmVkIGludCBpZDsgLyogUXVldWUgSUQsIDAtYmFzZWQgKi8KKwljaGFyIG5hbWVbUVVFVUVfTkFNRV9TSVpFXTsgLyogREVWTkFNRS1xTiAqLworCXN0cnVjdCBuZXRmcm9udF9pbmZvICppbmZvOwogCiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CiAKQEAgLTkzLDEwICsxMDgsOCBAQAogCXVuc2lnbmVkIGludCB0eF9ldnRjaG4sIHJ4X2V2dGNobjsKIAl1bnNpZ25lZCBpbnQgdHhfaXJxLCByeF9pcnE7CiAJLyogT25seSB1c2VkIHdoZW4gc3BsaXQgZXZlbnQgY2hhbm5lbHMgc3VwcG9ydCBpcyBlbmFibGVkICovCi0JY2hhciB0eF9pcnFfbmFtZVtJRk5BTVNJWis0XTsgLyogREVWTkFNRS10eCAqLwotCWNoYXIgcnhfaXJxX25hbWVbSUZOQU1TSVorNF07IC8qIERFVk5BTUUtcnggKi8KLQotCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4YmRldjsKKwljaGFyIHR4X2lycV9uYW1lW0lSUV9OQU1FX1NJWkVdOyAvKiBERVZOQU1FLXFOLXR4ICovCisJY2hhciByeF9pcnFfbmFtZVtJUlFfTkFNRV9TSVpFXTsgLyogREVWTkFNRS1xTi1yeCAqLwogCiAJc3BpbmxvY2tfdCAgIHR4X2xvY2s7CiAJc3RydWN0IHhlbl9uZXRpZl90eF9mcm9udF9yaW5nIHR4OwpAQCAtMTQwLDExICsxNTMsMjEgQEAKIAl1bnNpZ25lZCBsb25nIHJ4X3Bmbl9hcnJheVtORVRfUlhfUklOR19TSVpFXTsKIAlzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5IHJ4X21jbFtORVRfUlhfUklOR19TSVpFKzFdOwogCXN0cnVjdCBtbXVfdXBkYXRlIHJ4X21tdVtORVRfUlhfUklOR19TSVpFXTsKK307CisKK3N0cnVjdCBuZXRmcm9udF9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4YmRldjsKKworCS8qIE11bHRpLXF1ZXVlIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlczsKIAogCS8qIFN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgbmV0ZnJvbnRfc3RhdHMgX19wZXJjcHUgKnN0YXRzOwogCi0JdW5zaWduZWQgbG9uZyByeF9nc29fY2hlY2tzdW1fZml4dXA7CisJYXRvbWljX3QgcnhfZ3NvX2NoZWNrc3VtX2ZpeHVwOwogfTsKIAogc3RydWN0IG5ldGZyb250X3J4X2luZm8gewpAQCAtMTg3LDIxICsyMTAsMjEgQEAKIAlyZXR1cm4gaWR4ICYgKE5FVF9SWF9SSU5HX1NJWkUgLSAxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICp4ZW5uZXRfZ2V0X3J4X3NrYihzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAsCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnhlbm5ldF9nZXRfcnhfc2tiKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUsCiAJCQkJCSBSSU5HX0lEWCByaSkKIHsKIAlpbnQgaSA9IHhlbm5ldF9yeGlkeChyaSk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5wLT5yeF9za2JzW2ldOwotCW5wLT5yeF9za2JzW2ldID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcXVldWUtPnJ4X3NrYnNbaV07CisJcXVldWUtPnJ4X3NrYnNbaV0gPSBOVUxMOwogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBncmFudF9yZWZfdCB4ZW5uZXRfZ2V0X3J4X3JlZihzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAsCitzdGF0aWMgZ3JhbnRfcmVmX3QgeGVubmV0X2dldF9yeF9yZWYoc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSwKIAkJCQkJICAgIFJJTkdfSURYIHJpKQogewogCWludCBpID0geGVubmV0X3J4aWR4KHJpKTsKLQlncmFudF9yZWZfdCByZWYgPSBucC0+Z3JhbnRfcnhfcmVmW2ldOwotCW5wLT5ncmFudF9yeF9yZWZbaV0gPSBHUkFOVF9JTlZBTElEX1JFRjsKKwlncmFudF9yZWZfdCByZWYgPSBxdWV1ZS0+Z3JhbnRfcnhfcmVmW2ldOworCXF1ZXVlLT5ncmFudF9yeF9yZWZbaV0gPSBHUkFOVF9JTlZBTElEX1JFRjsKIAlyZXR1cm4gcmVmOwogfQogCkBAIC0yMjEsNDEgKzI0NCw0MCBAQAogCiBzdGF0aWMgdm9pZCByeF9yZWZpbGxfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7Ci0Jc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQluYXBpX3NjaGVkdWxlKCZucC0+bmFwaSk7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSA9IChzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKilkYXRhOworCW5hcGlfc2NoZWR1bGUoJnF1ZXVlLT5uYXBpKTsKIH0KIAotc3RhdGljIGludCBuZXRmcm9udF90eF9zbG90X2F2YWlsYWJsZShzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnApCitzdGF0aWMgaW50IG5ldGZyb250X3R4X3Nsb3RfYXZhaWxhYmxlKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUpCiB7Ci0JcmV0dXJuIChucC0+dHgucmVxX3Byb2RfcHZ0IC0gbnAtPnR4LnJzcF9jb25zKSA8CisJcmV0dXJuIChxdWV1ZS0+dHgucmVxX3Byb2RfcHZ0IC0gcXVldWUtPnR4LnJzcF9jb25zKSA8CiAJCShUWF9NQVhfVEFSR0VUIC0gTUFYX1NLQl9GUkFHUyAtIDIpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5uZXRfbWF5YmVfd2FrZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgeGVubmV0X21heWJlX3dha2VfdHgoc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSkKIHsKLQlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBxdWV1ZS0+aW5mby0+bmV0ZGV2OworCXN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxdWV1ZS0+aWQpOwogCi0JaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgJiYKLQkgICAgbmV0ZnJvbnRfdHhfc2xvdF9hdmFpbGFibGUobnApICYmCisJaWYgKHVubGlrZWx5KG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoZGV2X3F1ZXVlKSkgJiYKKwkgICAgbmV0ZnJvbnRfdHhfc2xvdF9hdmFpbGFibGUocXVldWUpICYmCiAJICAgIGxpa2VseShuZXRpZl9ydW5uaW5nKGRldikpKQotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHF1ZXVlLT5pZCkpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5uZXRfYWxsb2NfcnhfYnVmZmVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSkKIHsKIAl1bnNpZ25lZCBzaG9ydCBpZDsKLQlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGksIGJhdGNoX3RhcmdldCwgbm90aWZ5OwotCVJJTkdfSURYIHJlcV9wcm9kID0gbnAtPnJ4LnJlcV9wcm9kX3B2dDsKKwlSSU5HX0lEWCByZXFfcHJvZCA9IHF1ZXVlLT5yeC5yZXFfcHJvZF9wdnQ7CiAJZ3JhbnRfcmVmX3QgcmVmOwogCXVuc2lnbmVkIGxvbmcgcGZuOwogCXZvaWQgKnZhZGRyOwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVxdWVzdCAqcmVxOwogCi0JaWYgKHVubGlrZWx5KCFuZXRpZl9jYXJyaWVyX29rKGRldikpKQorCWlmICh1bmxpa2VseSghbmV0aWZfY2Fycmllcl9vayhxdWV1ZS0+aW5mby0+bmV0ZGV2KSkpCiAJCXJldHVybjsKIAogCS8qCkBAIC0yNjQsOSArMjg2LDEwIEBACiAJICogYWxsb2NhdG9yLCBzbyBzaG91bGQgcmVkdWNlIHRoZSBjaGFuY2Ugb2YgZmFpbGVkIGFsbG9jYXRpb24gcmVxdWVzdHMKIAkgKiBib3RoIGZvciBvdXJzZWxmIGFuZCBmb3Igb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuCiAJICovCi0JYmF0Y2hfdGFyZ2V0ID0gbnAtPnJ4X3RhcmdldCAtIChyZXFfcHJvZCAtIG5wLT5yeC5yc3BfY29ucyk7Ci0JZm9yIChpID0gc2tiX3F1ZXVlX2xlbigmbnAtPnJ4X2JhdGNoKTsgaSA8IGJhdGNoX3RhcmdldDsgaSsrKSB7Ci0JCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihkZXYsIFJYX0NPUFlfVEhSRVNIT0xEICsgTkVUX0lQX0FMSUdOLAorCWJhdGNoX3RhcmdldCA9IHF1ZXVlLT5yeF90YXJnZXQgLSAocmVxX3Byb2QgLSBxdWV1ZS0+cngucnNwX2NvbnMpOworCWZvciAoaSA9IHNrYl9xdWV1ZV9sZW4oJnF1ZXVlLT5yeF9iYXRjaCk7IGkgPCBiYXRjaF90YXJnZXQ7IGkrKykgeworCQlza2IgPSBfX25ldGRldl9hbGxvY19za2IocXVldWUtPmluZm8tPm5ldGRldiwKKwkJCQkJIFJYX0NPUFlfVEhSRVNIT0xEICsgTkVUX0lQX0FMSUdOLAogCQkJCQkgR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkKIAkJCWdvdG8gbm9fc2tiOwpAQCAtMjc5LDcgKzMwMiw3IEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIG5vX3NrYjoKIAkJCS8qIENvdWxkIG5vdCBhbGxvY2F0ZSBhbnkgc2tidWZmcy4gVHJ5IGFnYWluIGxhdGVyLiAqLwotCQkJbW9kX3RpbWVyKCZucC0+cnhfcmVmaWxsX3RpbWVyLAorCQkJbW9kX3RpbWVyKCZxdWV1ZS0+cnhfcmVmaWxsX3RpbWVyLAogCQkJCSAgamlmZmllcyArIChIWi8xMCkpOwogCiAJCQkvKiBBbnkgc2tidWZmcyBxdWV1ZWQgZm9yIHJlZmlsbD8gRm9yY2UgdGhlbSBvdXQuICovCkBAIC0yODksNDQgKzMxMiw0NCBAQAogCQl9CiAKIAkJc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcGFnZSwgMCwgMCwgUEFHRV9TSVpFKTsKLQkJX19za2JfcXVldWVfdGFpbCgmbnAtPnJ4X2JhdGNoLCBza2IpOworCQlfX3NrYl9xdWV1ZV90YWlsKCZxdWV1ZS0+cnhfYmF0Y2gsIHNrYik7CiAJfQogCiAJLyogSXMgdGhlIGJhdGNoIGxhcmdlIGVub3VnaCB0byBiZSB3b3J0aHdoaWxlPyAqLwotCWlmIChpIDwgKG5wLT5yeF90YXJnZXQvMikpIHsKLQkJaWYgKHJlcV9wcm9kID4gbnAtPnJ4LnNyaW5nLT5yZXFfcHJvZCkKKwlpZiAoaSA8IChxdWV1ZS0+cnhfdGFyZ2V0LzIpKSB7CisJCWlmIChyZXFfcHJvZCA+IHF1ZXVlLT5yeC5zcmluZy0+cmVxX3Byb2QpCiAJCQlnb3RvIHB1c2g7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBBZGp1c3Qgb3VyIGZpbGwgdGFyZ2V0IGlmIHdlIHJpc2tlZCBydW5uaW5nIG91dCBvZiBidWZmZXJzLiAqLwotCWlmICgoKHJlcV9wcm9kIC0gbnAtPnJ4LnNyaW5nLT5yc3BfcHJvZCkgPCAobnAtPnJ4X3RhcmdldCAvIDQpKSAmJgotCSAgICAoKG5wLT5yeF90YXJnZXQgKj0gMikgPiBucC0+cnhfbWF4X3RhcmdldCkpCi0JCW5wLT5yeF90YXJnZXQgPSBucC0+cnhfbWF4X3RhcmdldDsKKwlpZiAoKChyZXFfcHJvZCAtIHF1ZXVlLT5yeC5zcmluZy0+cnNwX3Byb2QpIDwgKHF1ZXVlLT5yeF90YXJnZXQgLyA0KSkgJiYKKwkgICAgKChxdWV1ZS0+cnhfdGFyZ2V0ICo9IDIpID4gcXVldWUtPnJ4X21heF90YXJnZXQpKQorCQlxdWV1ZS0+cnhfdGFyZ2V0ID0gcXVldWUtPnJ4X21heF90YXJnZXQ7CiAKICByZWZpbGw6CiAJZm9yIChpID0gMDsgOyBpKyspIHsKLQkJc2tiID0gX19za2JfZGVxdWV1ZSgmbnAtPnJ4X2JhdGNoKTsKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmcXVldWUtPnJ4X2JhdGNoKTsKIAkJaWYgKHNrYiA9PSBOVUxMKQogCQkJYnJlYWs7CiAKLQkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+ZGV2ID0gcXVldWUtPmluZm8tPm5ldGRldjsKIAogCQlpZCA9IHhlbm5ldF9yeGlkeChyZXFfcHJvZCArIGkpOwogCi0JCUJVR19PTihucC0+cnhfc2tic1tpZF0pOwotCQlucC0+cnhfc2tic1tpZF0gPSBza2I7CisJCUJVR19PTihxdWV1ZS0+cnhfc2tic1tpZF0pOworCQlxdWV1ZS0+cnhfc2tic1tpZF0gPSBza2I7CiAKLQkJcmVmID0gZ250dGFiX2NsYWltX2dyYW50X3JlZmVyZW5jZSgmbnAtPmdyZWZfcnhfaGVhZCk7CisJCXJlZiA9IGdudHRhYl9jbGFpbV9ncmFudF9yZWZlcmVuY2UoJnF1ZXVlLT5ncmVmX3J4X2hlYWQpOwogCQlCVUdfT04oKHNpZ25lZCBzaG9ydClyZWYgPCAwKTsKLQkJbnAtPmdyYW50X3J4X3JlZltpZF0gPSByZWY7CisJCXF1ZXVlLT5ncmFudF9yeF9yZWZbaWRdID0gcmVmOwogCiAJCXBmbiA9IHBhZ2VfdG9fcGZuKHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0pKTsKIAkJdmFkZHIgPSBwYWdlX2FkZHJlc3Moc2tiX2ZyYWdfcGFnZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXSkpOwogCi0JCXJlcSA9IFJJTkdfR0VUX1JFUVVFU1QoJm5wLT5yeCwgcmVxX3Byb2QgKyBpKTsKKwkJcmVxID0gUklOR19HRVRfUkVRVUVTVCgmcXVldWUtPnJ4LCByZXFfcHJvZCArIGkpOwogCQlnbnR0YWJfZ3JhbnRfZm9yZWlnbl9hY2Nlc3NfcmVmKHJlZiwKLQkJCQkJCW5wLT54YmRldi0+b3RoZXJlbmRfaWQsCisJCQkJCQlxdWV1ZS0+aW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLAogCQkJCQkJcGZuX3RvX21mbihwZm4pLAogCQkJCQkJMCk7CiAKQEAgLTMzNyw3MiArMzYwLDc3IEBACiAJd21iKCk7CQkvKiBiYXJyaWVyIHNvIGJhY2tlbmQgc2VlbnMgcmVxdWVzdHMgKi8KIAogCS8qIEFib3ZlIGlzIGEgc3VpdGFibGUgYmFycmllciB0byBlbnN1cmUgYmFja2VuZCB3aWxsIHNlZSByZXF1ZXN0cy4gKi8KLQlucC0+cngucmVxX3Byb2RfcHZ0ID0gcmVxX3Byb2QgKyBpOworCXF1ZXVlLT5yeC5yZXFfcHJvZF9wdnQgPSByZXFfcHJvZCArIGk7CiAgcHVzaDoKLQlSSU5HX1BVU0hfUkVRVUVTVFNfQU5EX0NIRUNLX05PVElGWSgmbnAtPnJ4LCBub3RpZnkpOworCVJJTkdfUFVTSF9SRVFVRVNUU19BTkRfQ0hFQ0tfTk9USUZZKCZxdWV1ZS0+cngsIG5vdGlmeSk7CiAJaWYgKG5vdGlmeSkKLQkJbm90aWZ5X3JlbW90ZV92aWFfaXJxKG5wLT5yeF9pcnEpOworCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEocXVldWUtPnJ4X2lycSk7CiB9CiAKIHN0YXRpYyBpbnQgeGVubmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IGkgPSAwOworCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBOVUxMOwogCi0JbmFwaV9lbmFibGUoJm5wLT5uYXBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3F1ZXVlczsgKytpKSB7CisJCXF1ZXVlID0gJm5wLT5xdWV1ZXNbaV07CisJCW5hcGlfZW5hYmxlKCZxdWV1ZS0+bmFwaSk7CiAKLQlzcGluX2xvY2tfYmgoJm5wLT5yeF9sb2NrKTsKLQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7Ci0JCXhlbm5ldF9hbGxvY19yeF9idWZmZXJzKGRldik7Ci0JCW5wLT5yeC5zcmluZy0+cnNwX2V2ZW50ID0gbnAtPnJ4LnJzcF9jb25zICsgMTsKLQkJaWYgKFJJTkdfSEFTX1VOQ09OU1VNRURfUkVTUE9OU0VTKCZucC0+cngpKQotCQkJbmFwaV9zY2hlZHVsZSgmbnAtPm5hcGkpOworCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5yeF9sb2NrKTsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMocXVldWUpOworCQkJcXVldWUtPnJ4LnNyaW5nLT5yc3BfZXZlbnQgPSBxdWV1ZS0+cngucnNwX2NvbnMgKyAxOworCQkJaWYgKFJJTkdfSEFTX1VOQ09OU1VNRURfUkVTUE9OU0VTKCZxdWV1ZS0+cngpKQorCQkJCW5hcGlfc2NoZWR1bGUoJnF1ZXVlLT5uYXBpKTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmcXVldWUtPnJ4X2xvY2spOwogCX0KLQlzcGluX3VubG9ja19iaCgmbnAtPnJ4X2xvY2spOwogCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgeGVubmV0X3R4X2J1Zl9nYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgeGVubmV0X3R4X2J1Zl9nYyhzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlKQogewogCVJJTkdfSURYIGNvbnMsIHByb2Q7CiAJdW5zaWduZWQgc2hvcnQgaWQ7Ci0Jc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JQlVHX09OKCFuZXRpZl9jYXJyaWVyX29rKGRldikpOworCUJVR19PTighbmV0aWZfY2Fycmllcl9vayhxdWV1ZS0+aW5mby0+bmV0ZGV2KSk7CiAKIAlkbyB7Ci0JCXByb2QgPSBucC0+dHguc3JpbmctPnJzcF9wcm9kOworCQlwcm9kID0gcXVldWUtPnR4LnNyaW5nLT5yc3BfcHJvZDsKIAkJcm1iKCk7IC8qIEVuc3VyZSB3ZSBzZWUgcmVzcG9uc2VzIHVwIHRvICdycCcuICovCiAKLQkJZm9yIChjb25zID0gbnAtPnR4LnJzcF9jb25zOyBjb25zICE9IHByb2Q7IGNvbnMrKykgeworCQlmb3IgKGNvbnMgPSBxdWV1ZS0+dHgucnNwX2NvbnM7IGNvbnMgIT0gcHJvZDsgY29ucysrKSB7CiAJCQlzdHJ1Y3QgeGVuX25ldGlmX3R4X3Jlc3BvbnNlICp0eHJzcDsKIAotCQkJdHhyc3AgPSBSSU5HX0dFVF9SRVNQT05TRSgmbnAtPnR4LCBjb25zKTsKKwkJCXR4cnNwID0gUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT50eCwgY29ucyk7CiAJCQlpZiAodHhyc3AtPnN0YXR1cyA9PSBYRU5fTkVUSUZfUlNQX05VTEwpCiAJCQkJY29udGludWU7CiAKIAkJCWlkICA9IHR4cnNwLT5pZDsKLQkJCXNrYiA9IG5wLT50eF9za2JzW2lkXS5za2I7CisJCQlza2IgPSBxdWV1ZS0+dHhfc2tic1tpZF0uc2tiOwogCQkJaWYgKHVubGlrZWx5KGdudHRhYl9xdWVyeV9mb3JlaWduX2FjY2VzcygKLQkJCQlucC0+Z3JhbnRfdHhfcmVmW2lkXSkgIT0gMCkpIHsKKwkJCQlxdWV1ZS0+Z3JhbnRfdHhfcmVmW2lkXSkgIT0gMCkpIHsKIAkJCQlwcl9hbGVydCgiJXM6IHdhcm5pbmcgLS0gZ3JhbnQgc3RpbGwgaW4gdXNlIGJ5IGJhY2tlbmQgZG9tYWluXG4iLAogCQkJCQkgX19mdW5jX18pOwogCQkJCUJVRygpOwogCQkJfQogCQkJZ250dGFiX2VuZF9mb3JlaWduX2FjY2Vzc19yZWYoCi0JCQkJbnAtPmdyYW50X3R4X3JlZltpZF0sIEdOVE1BUF9yZWFkb25seSk7CisJCQkJcXVldWUtPmdyYW50X3R4X3JlZltpZF0sIEdOVE1BUF9yZWFkb25seSk7CiAJCQlnbnR0YWJfcmVsZWFzZV9ncmFudF9yZWZlcmVuY2UoCi0JCQkJJm5wLT5ncmVmX3R4X2hlYWQsIG5wLT5ncmFudF90eF9yZWZbaWRdKTsKLQkJCW5wLT5ncmFudF90eF9yZWZbaWRdID0gR1JBTlRfSU5WQUxJRF9SRUY7Ci0JCQlucC0+Z3JhbnRfdHhfcGFnZVtpZF0gPSBOVUxMOwotCQkJYWRkX2lkX3RvX2ZyZWVsaXN0KCZucC0+dHhfc2tiX2ZyZWVsaXN0LCBucC0+dHhfc2ticywgaWQpOworCQkJCSZxdWV1ZS0+Z3JlZl90eF9oZWFkLCBxdWV1ZS0+Z3JhbnRfdHhfcmVmW2lkXSk7CisJCQlxdWV1ZS0+Z3JhbnRfdHhfcmVmW2lkXSA9IEdSQU5UX0lOVkFMSURfUkVGOworCQkJcXVldWUtPmdyYW50X3R4X3BhZ2VbaWRdID0gTlVMTDsKKwkJCWFkZF9pZF90b19mcmVlbGlzdCgmcXVldWUtPnR4X3NrYl9mcmVlbGlzdCwgcXVldWUtPnR4X3NrYnMsIGlkKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCX0KIAotCQlucC0+dHgucnNwX2NvbnMgPSBwcm9kOworCQlxdWV1ZS0+dHgucnNwX2NvbnMgPSBwcm9kOwogCiAJCS8qCiAJCSAqIFNldCBhIG5ldyBldmVudCwgdGhlbiBjaGVjayBmb3IgcmFjZSB3aXRoIHVwZGF0ZSBvZiB0eF9jb25zLgpAQCAtNDEyLDIxICs0NDAsMjAgQEAKIAkJICogZGF0YSBpcyBvdXRzdGFuZGluZzogaW4gc3VjaCBjYXNlcyBub3RpZmljYXRpb24gZnJvbSBYZW4gaXMKIAkJICogbGlrZWx5IHRvIGJlIHRoZSBvbmx5IGtpY2sgdGhhdCB3ZSdsbCBnZXQuCiAJCSAqLwotCQlucC0+dHguc3JpbmctPnJzcF9ldmVudCA9Ci0JCQlwcm9kICsgKChucC0+dHguc3JpbmctPnJlcV9wcm9kIC0gcHJvZCkgPj4gMSkgKyAxOworCQlxdWV1ZS0+dHguc3JpbmctPnJzcF9ldmVudCA9CisJCQlwcm9kICsgKChxdWV1ZS0+dHguc3JpbmctPnJlcV9wcm9kIC0gcHJvZCkgPj4gMSkgKyAxOwogCQltYigpOwkJLyogdXBkYXRlIHNoYXJlZCBhcmVhICovCi0JfSB3aGlsZSAoKGNvbnMgPT0gcHJvZCkgJiYgKHByb2QgIT0gbnAtPnR4LnNyaW5nLT5yc3BfcHJvZCkpOworCX0gd2hpbGUgKChjb25zID09IHByb2QpICYmIChwcm9kICE9IHF1ZXVlLT50eC5zcmluZy0+cnNwX3Byb2QpKTsKIAotCXhlbm5ldF9tYXliZV93YWtlX3R4KGRldik7CisJeGVubmV0X21heWJlX3dha2VfdHgocXVldWUpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5uZXRfbWFrZV9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgeGVubmV0X21ha2VfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSwKIAkJCSAgICAgIHN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCAqdHgpCiB7Ci0Jc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAljaGFyICpkYXRhID0gc2tiLT5kYXRhOwogCXVuc2lnbmVkIGxvbmcgbWZuOwotCVJJTkdfSURYIHByb2QgPSBucC0+dHgucmVxX3Byb2RfcHZ0OworCVJJTkdfSURYIHByb2QgPSBxdWV1ZS0+dHgucmVxX3Byb2RfcHZ0OwogCWludCBmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGEpOwogCXVuc2lnbmVkIGludCBsZW4gPSBza2JfaGVhZGxlbihza2IpOwpAQCAtNDQzLDE5ICs0NzAsMTkgQEAKIAkJZGF0YSArPSB0eC0+c2l6ZTsKIAkJb2Zmc2V0ID0gMDsKIAotCQlpZCA9IGdldF9pZF9mcm9tX2ZyZWVsaXN0KCZucC0+dHhfc2tiX2ZyZWVsaXN0LCBucC0+dHhfc2ticyk7Ci0JCW5wLT50eF9za2JzW2lkXS5za2IgPSBza2JfZ2V0KHNrYik7Ci0JCXR4ID0gUklOR19HRVRfUkVRVUVTVCgmbnAtPnR4LCBwcm9kKyspOworCQlpZCA9IGdldF9pZF9mcm9tX2ZyZWVsaXN0KCZxdWV1ZS0+dHhfc2tiX2ZyZWVsaXN0LCBxdWV1ZS0+dHhfc2ticyk7CisJCXF1ZXVlLT50eF9za2JzW2lkXS5za2IgPSBza2JfZ2V0KHNrYik7CisJCXR4ID0gUklOR19HRVRfUkVRVUVTVCgmcXVldWUtPnR4LCBwcm9kKyspOwogCQl0eC0+aWQgPSBpZDsKLQkJcmVmID0gZ250dGFiX2NsYWltX2dyYW50X3JlZmVyZW5jZSgmbnAtPmdyZWZfdHhfaGVhZCk7CisJCXJlZiA9IGdudHRhYl9jbGFpbV9ncmFudF9yZWZlcmVuY2UoJnF1ZXVlLT5ncmVmX3R4X2hlYWQpOwogCQlCVUdfT04oKHNpZ25lZCBzaG9ydClyZWYgPCAwKTsKIAogCQltZm4gPSB2aXJ0X3RvX21mbihkYXRhKTsKLQkJZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNjZXNzX3JlZihyZWYsIG5wLT54YmRldi0+b3RoZXJlbmRfaWQsCisJCWdudHRhYl9ncmFudF9mb3JlaWduX2FjY2Vzc19yZWYocmVmLCBxdWV1ZS0+aW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLAogCQkJCQkJbWZuLCBHTlRNQVBfcmVhZG9ubHkpOwogCi0JCW5wLT5ncmFudF90eF9wYWdlW2lkXSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKLQkJdHgtPmdyZWYgPSBucC0+Z3JhbnRfdHhfcmVmW2lkXSA9IHJlZjsKKwkJcXVldWUtPmdyYW50X3R4X3BhZ2VbaWRdID0gdmlydF90b19wYWdlKGRhdGEpOworCQl0eC0+Z3JlZiA9IHF1ZXVlLT5ncmFudF90eF9yZWZbaWRdID0gcmVmOwogCQl0eC0+b2Zmc2V0ID0gb2Zmc2V0OwogCQl0eC0+c2l6ZSA9IGxlbjsKIAkJdHgtPmZsYWdzID0gMDsKQEAgLTQ4NywyMSArNTE0LDIxIEBACiAKIAkJCXR4LT5mbGFncyB8PSBYRU5fTkVUVFhGX21vcmVfZGF0YTsKIAotCQkJaWQgPSBnZXRfaWRfZnJvbV9mcmVlbGlzdCgmbnAtPnR4X3NrYl9mcmVlbGlzdCwKLQkJCQkJCSAgbnAtPnR4X3NrYnMpOwotCQkJbnAtPnR4X3NrYnNbaWRdLnNrYiA9IHNrYl9nZXQoc2tiKTsKLQkJCXR4ID0gUklOR19HRVRfUkVRVUVTVCgmbnAtPnR4LCBwcm9kKyspOworCQkJaWQgPSBnZXRfaWRfZnJvbV9mcmVlbGlzdCgmcXVldWUtPnR4X3NrYl9mcmVlbGlzdCwKKwkJCQkJCSAgcXVldWUtPnR4X3NrYnMpOworCQkJcXVldWUtPnR4X3NrYnNbaWRdLnNrYiA9IHNrYl9nZXQoc2tiKTsKKwkJCXR4ID0gUklOR19HRVRfUkVRVUVTVCgmcXVldWUtPnR4LCBwcm9kKyspOwogCQkJdHgtPmlkID0gaWQ7Ci0JCQlyZWYgPSBnbnR0YWJfY2xhaW1fZ3JhbnRfcmVmZXJlbmNlKCZucC0+Z3JlZl90eF9oZWFkKTsKKwkJCXJlZiA9IGdudHRhYl9jbGFpbV9ncmFudF9yZWZlcmVuY2UoJnF1ZXVlLT5ncmVmX3R4X2hlYWQpOwogCQkJQlVHX09OKChzaWduZWQgc2hvcnQpcmVmIDwgMCk7CiAKIAkJCW1mbiA9IHBmbl90b19tZm4ocGFnZV90b19wZm4ocGFnZSkpOwogCQkJZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNjZXNzX3JlZihyZWYsCi0JCQkJCQkJbnAtPnhiZGV2LT5vdGhlcmVuZF9pZCwKKwkJCQkJCQlxdWV1ZS0+aW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLAogCQkJCQkJCW1mbiwgR05UTUFQX3JlYWRvbmx5KTsKIAotCQkJbnAtPmdyYW50X3R4X3BhZ2VbaWRdID0gcGFnZTsKLQkJCXR4LT5ncmVmID0gbnAtPmdyYW50X3R4X3JlZltpZF0gPSByZWY7CisJCQlxdWV1ZS0+Z3JhbnRfdHhfcGFnZVtpZF0gPSBwYWdlOworCQkJdHgtPmdyZWYgPSBxdWV1ZS0+Z3JhbnRfdHhfcmVmW2lkXSA9IHJlZjsKIAkJCXR4LT5vZmZzZXQgPSBvZmZzZXQ7CiAJCQl0eC0+c2l6ZSA9IGJ5dGVzOwogCQkJdHgtPmZsYWdzID0gMDsKQEAgLTUxOCw3ICs1NDUsNyBAQAogCQl9CiAJfQogCi0JbnAtPnR4LnJlcV9wcm9kX3B2dCA9IHByb2Q7CisJcXVldWUtPnR4LnJlcV9wcm9kX3B2dCA9IHByb2Q7CiB9CiAKIC8qCkBAIC01NDQsNiArNTcxLDI0IEBACiAJcmV0dXJuIHBhZ2VzOwogfQogCitzdGF0aWMgdTE2IHhlbm5ldF9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB2b2lkICphY2NlbF9wcml2LCBzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKK3sKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IGRldi0+cmVhbF9udW1fdHhfcXVldWVzOworCXUzMiBoYXNoOworCXUxNiBxdWV1ZV9pZHg7CisKKwkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlcmUgaXMgb25seSBvbmUgcXVldWUgKi8KKwlpZiAobnVtX3F1ZXVlcyA9PSAxKSB7CisJCXF1ZXVlX2lkeCA9IDA7CisJfSBlbHNlIHsKKwkJaGFzaCA9IHNrYl9nZXRfaGFzaChza2IpOworCQlxdWV1ZV9pZHggPSBoYXNoICUgbnVtX3F1ZXVlczsKKwl9CisKKwlyZXR1cm4gcXVldWVfaWR4OworfQorCiBzdGF0aWMgaW50IHhlbm5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgc2hvcnQgaWQ7CkBAIC01NTksNiArNjA0LDE2IEBACiAJdW5zaWduZWQgaW50IG9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGEpOwogCXVuc2lnbmVkIGludCBsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwl1MTYgcXVldWVfaW5kZXg7CisKKwkvKiBEcm9wIHRoZSBwYWNrZXQgaWYgbm8gcXVldWVzIGFyZSBzZXQgdXAgKi8KKwlpZiAobnVtX3F1ZXVlcyA8IDEpCisJCWdvdG8gZHJvcDsKKwkvKiBEZXRlcm1pbmUgd2hpY2ggcXVldWUgdG8gdHJhbnNtaXQgdGhpcyBTS0Igb24gKi8KKwlxdWV1ZV9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXF1ZXVlID0gJm5wLT5xdWV1ZXNbcXVldWVfaW5kZXhdOwogCiAJLyogSWYgc2tiLT5sZW4gaXMgdG9vIGJpZyBmb3Igd2lyZSBmb3JtYXQsIGRyb3Agc2tiIGFuZCBhbGVydAogCSAqIHVzZXIgYWJvdXQgbWlzY29uZmlndXJhdGlvbi4KQEAgLTU3OCwzMCArNjMzLDMwIEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPnR4X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnR4X2xvY2ssIGZsYWdzKTsKIAogCWlmICh1bmxpa2VseSghbmV0aWZfY2Fycmllcl9vayhkZXYpIHx8CiAJCSAgICAgKHNsb3RzID4gMSAmJiAheGVubmV0X2Nhbl9zZyhkZXYpKSB8fAogCQkgICAgIG5ldGlmX25lZWRzX2dzbyhza2IsIG5ldGlmX3NrYl9mZWF0dXJlcyhza2IpKSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnR4X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnR4X2xvY2ssIGZsYWdzKTsKIAkJZ290byBkcm9wOwogCX0KIAotCWkgPSBucC0+dHgucmVxX3Byb2RfcHZ0OworCWkgPSBxdWV1ZS0+dHgucmVxX3Byb2RfcHZ0OwogCi0JaWQgPSBnZXRfaWRfZnJvbV9mcmVlbGlzdCgmbnAtPnR4X3NrYl9mcmVlbGlzdCwgbnAtPnR4X3NrYnMpOwotCW5wLT50eF9za2JzW2lkXS5za2IgPSBza2I7CisJaWQgPSBnZXRfaWRfZnJvbV9mcmVlbGlzdCgmcXVldWUtPnR4X3NrYl9mcmVlbGlzdCwgcXVldWUtPnR4X3NrYnMpOworCXF1ZXVlLT50eF9za2JzW2lkXS5za2IgPSBza2I7CiAKLQl0eCA9IFJJTkdfR0VUX1JFUVVFU1QoJm5wLT50eCwgaSk7CisJdHggPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+dHgsIGkpOwogCiAJdHgtPmlkICAgPSBpZDsKLQlyZWYgPSBnbnR0YWJfY2xhaW1fZ3JhbnRfcmVmZXJlbmNlKCZucC0+Z3JlZl90eF9oZWFkKTsKKwlyZWYgPSBnbnR0YWJfY2xhaW1fZ3JhbnRfcmVmZXJlbmNlKCZxdWV1ZS0+Z3JlZl90eF9oZWFkKTsKIAlCVUdfT04oKHNpZ25lZCBzaG9ydClyZWYgPCAwKTsKIAltZm4gPSB2aXJ0X3RvX21mbihkYXRhKTsKIAlnbnR0YWJfZ3JhbnRfZm9yZWlnbl9hY2Nlc3NfcmVmKAotCQlyZWYsIG5wLT54YmRldi0+b3RoZXJlbmRfaWQsIG1mbiwgR05UTUFQX3JlYWRvbmx5KTsKLQlucC0+Z3JhbnRfdHhfcGFnZVtpZF0gPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7Ci0JdHgtPmdyZWYgPSBucC0+Z3JhbnRfdHhfcmVmW2lkXSA9IHJlZjsKKwkJcmVmLCBxdWV1ZS0+aW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLCBtZm4sIEdOVE1BUF9yZWFkb25seSk7CisJcXVldWUtPmdyYW50X3R4X3BhZ2VbaWRdID0gdmlydF90b19wYWdlKGRhdGEpOworCXR4LT5ncmVmID0gcXVldWUtPmdyYW50X3R4X3JlZltpZF0gPSByZWY7CiAJdHgtPm9mZnNldCA9IG9mZnNldDsKIAl0eC0+c2l6ZSA9IGxlbjsKIApAQCAtNjE3LDcgKzY3Miw3IEBACiAJCXN0cnVjdCB4ZW5fbmV0aWZfZXh0cmFfaW5mbyAqZ3NvOwogCiAJCWdzbyA9IChzdHJ1Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKikKLQkJCVJJTkdfR0VUX1JFUVVFU1QoJm5wLT50eCwgKytpKTsKKwkJCVJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT50eCwgKytpKTsKIAogCQl0eC0+ZmxhZ3MgfD0gWEVOX05FVFRYRl9leHRyYV9pbmZvOwogCkBAIC02MzIsMTQgKzY4NywxNCBAQAogCQlnc28tPmZsYWdzID0gMDsKIAl9CiAKLQlucC0+dHgucmVxX3Byb2RfcHZ0ID0gaSArIDE7CisJcXVldWUtPnR4LnJlcV9wcm9kX3B2dCA9IGkgKyAxOwogCi0JeGVubmV0X21ha2VfZnJhZ3Moc2tiLCBkZXYsIHR4KTsKKwl4ZW5uZXRfbWFrZV9mcmFncyhza2IsIHF1ZXVlLCB0eCk7CiAJdHgtPnNpemUgPSBza2ItPmxlbjsKIAotCVJJTkdfUFVTSF9SRVFVRVNUU19BTkRfQ0hFQ0tfTk9USUZZKCZucC0+dHgsIG5vdGlmeSk7CisJUklOR19QVVNIX1JFUVVFU1RTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT50eCwgbm90aWZ5KTsKIAlpZiAobm90aWZ5KQotCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEobnAtPnR4X2lycSk7CisJCW5vdGlmeV9yZW1vdGVfdmlhX2lycShxdWV1ZS0+dHhfaXJxKTsKIAogCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CiAJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtNjQ3LDEyICs3MDIsMTIgQEAKIAl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKIAogCS8qIE5vdGU6IEl0IGlzIG5vdCBzYWZlIHRvIGFjY2VzcyBza2IgYWZ0ZXIgeGVubmV0X3R4X2J1Zl9nYygpISAqLwotCXhlbm5ldF90eF9idWZfZ2MoZGV2KTsKKwl4ZW5uZXRfdHhfYnVmX2djKHF1ZXVlKTsKIAotCWlmICghbmV0ZnJvbnRfdHhfc2xvdF9hdmFpbGFibGUobnApKQotCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJaWYgKCFuZXRmcm9udF90eF9zbG90X2F2YWlsYWJsZShxdWV1ZSkpCisJCW5ldGlmX3R4X3N0b3BfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHF1ZXVlLT5pZCkpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnR4X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+dHhfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIApAQCAtNjY1LDMyICs3MjAsMzggQEAKIHN0YXRpYyBpbnQgeGVubmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKG5wLT5uZXRkZXYpOwotCW5hcGlfZGlzYWJsZSgmbnAtPm5hcGkpOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZTsKKwluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobnAtPm5ldGRldik7CisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkgeworCQlxdWV1ZSA9ICZucC0+cXVldWVzW2ldOworCQluYXBpX2Rpc2FibGUoJnF1ZXVlLT5uYXBpKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHhlbm5ldF9tb3ZlX3J4X3Nsb3Qoc3RydWN0IG5ldGZyb250X2luZm8gKm5wLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIHZvaWQgeGVubmV0X21vdmVfcnhfc2xvdChzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCWdyYW50X3JlZl90IHJlZikKIHsKLQlpbnQgbmV3ID0geGVubmV0X3J4aWR4KG5wLT5yeC5yZXFfcHJvZF9wdnQpOworCWludCBuZXcgPSB4ZW5uZXRfcnhpZHgocXVldWUtPnJ4LnJlcV9wcm9kX3B2dCk7CiAKLQlCVUdfT04obnAtPnJ4X3NrYnNbbmV3XSk7Ci0JbnAtPnJ4X3NrYnNbbmV3XSA9IHNrYjsKLQlucC0+Z3JhbnRfcnhfcmVmW25ld10gPSByZWY7Ci0JUklOR19HRVRfUkVRVUVTVCgmbnAtPnJ4LCBucC0+cngucmVxX3Byb2RfcHZ0KS0+aWQgPSBuZXc7Ci0JUklOR19HRVRfUkVRVUVTVCgmbnAtPnJ4LCBucC0+cngucmVxX3Byb2RfcHZ0KS0+Z3JlZiA9IHJlZjsKLQlucC0+cngucmVxX3Byb2RfcHZ0Kys7CisJQlVHX09OKHF1ZXVlLT5yeF9za2JzW25ld10pOworCXF1ZXVlLT5yeF9za2JzW25ld10gPSBza2I7CisJcXVldWUtPmdyYW50X3J4X3JlZltuZXddID0gcmVmOworCVJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVldWUtPnJ4LnJlcV9wcm9kX3B2dCktPmlkID0gbmV3OworCVJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVldWUtPnJ4LnJlcV9wcm9kX3B2dCktPmdyZWYgPSByZWY7CisJcXVldWUtPnJ4LnJlcV9wcm9kX3B2dCsrOwogfQogCi1zdGF0aWMgaW50IHhlbm5ldF9nZXRfZXh0cmFzKHN0cnVjdCBuZXRmcm9udF9pbmZvICpucCwKK3N0YXRpYyBpbnQgeGVubmV0X2dldF9leHRyYXMoc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSwKIAkJCSAgICAgc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpleHRyYXMsCiAJCQkgICAgIFJJTkdfSURYIHJwKQogCiB7CiAJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpleHRyYTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbnAtPm5ldGRldi0+ZGV2OwotCVJJTkdfSURYIGNvbnMgPSBucC0+cngucnNwX2NvbnM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnF1ZXVlLT5pbmZvLT5uZXRkZXYtPmRldjsKKwlSSU5HX0lEWCBjb25zID0gcXVldWUtPnJ4LnJzcF9jb25zOwogCWludCBlcnIgPSAwOwogCiAJZG8gewpAQCAtNzA1LDcgKzc2Niw3IEBACiAJCX0KIAogCQlleHRyYSA9IChzdHJ1Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKikKLQkJCVJJTkdfR0VUX1JFU1BPTlNFKCZucC0+cngsICsrY29ucyk7CisJCQlSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnJ4LCArK2NvbnMpOwogCiAJCWlmICh1bmxpa2VseSghZXh0cmEtPnR5cGUgfHwKIAkJCSAgICAgZXh0cmEtPnR5cGUgPj0gWEVOX05FVElGX0VYVFJBX1RZUEVfTUFYKSkgewpAQCAtNzE4LDMzICs3NzksMzMgQEAKIAkJCSAgICAgICBzaXplb2YoKmV4dHJhKSk7CiAJCX0KIAotCQlza2IgPSB4ZW5uZXRfZ2V0X3J4X3NrYihucCwgY29ucyk7Ci0JCXJlZiA9IHhlbm5ldF9nZXRfcnhfcmVmKG5wLCBjb25zKTsKLQkJeGVubmV0X21vdmVfcnhfc2xvdChucCwgc2tiLCByZWYpOworCQlza2IgPSB4ZW5uZXRfZ2V0X3J4X3NrYihxdWV1ZSwgY29ucyk7CisJCXJlZiA9IHhlbm5ldF9nZXRfcnhfcmVmKHF1ZXVlLCBjb25zKTsKKwkJeGVubmV0X21vdmVfcnhfc2xvdChxdWV1ZSwgc2tiLCByZWYpOwogCX0gd2hpbGUgKGV4dHJhLT5mbGFncyAmIFhFTl9ORVRJRl9FWFRSQV9GTEFHX01PUkUpOwogCi0JbnAtPnJ4LnJzcF9jb25zID0gY29uczsKKwlxdWV1ZS0+cngucnNwX2NvbnMgPSBjb25zOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgeGVubmV0X2dldF9yZXNwb25zZXMoc3RydWN0IG5ldGZyb250X2luZm8gKm5wLAorc3RhdGljIGludCB4ZW5uZXRfZ2V0X3Jlc3BvbnNlcyhzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlLAogCQkJCXN0cnVjdCBuZXRmcm9udF9yeF9pbmZvICpyaW5mbywgUklOR19JRFggcnAsCiAJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKIHsKIAlzdHJ1Y3QgeGVuX25ldGlmX3J4X3Jlc3BvbnNlICpyeCA9ICZyaW5mby0+cng7CiAJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpleHRyYXMgPSByaW5mby0+ZXh0cmFzOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZucC0+bmV0ZGV2LT5kZXY7Ci0JUklOR19JRFggY29ucyA9IG5wLT5yeC5yc3BfY29uczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0geGVubmV0X2dldF9yeF9za2IobnAsIGNvbnMpOwotCWdyYW50X3JlZl90IHJlZiA9IHhlbm5ldF9nZXRfcnhfcmVmKG5wLCBjb25zKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcXVldWUtPmluZm8tPm5ldGRldi0+ZGV2OworCVJJTkdfSURYIGNvbnMgPSBxdWV1ZS0+cngucnNwX2NvbnM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHhlbm5ldF9nZXRfcnhfc2tiKHF1ZXVlLCBjb25zKTsKKwlncmFudF9yZWZfdCByZWYgPSB4ZW5uZXRfZ2V0X3J4X3JlZihxdWV1ZSwgY29ucyk7CiAJaW50IG1heCA9IE1BWF9TS0JfRlJBR1MgKyAocngtPnN0YXR1cyA8PSBSWF9DT1BZX1RIUkVTSE9MRCk7CiAJaW50IHNsb3RzID0gMTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAogCWlmIChyeC0+ZmxhZ3MgJiBYRU5fTkVUUlhGX2V4dHJhX2luZm8pIHsKLQkJZXJyID0geGVubmV0X2dldF9leHRyYXMobnAsIGV4dHJhcywgcnApOwotCQljb25zID0gbnAtPnJ4LnJzcF9jb25zOworCQllcnIgPSB4ZW5uZXRfZ2V0X2V4dHJhcyhxdWV1ZSwgZXh0cmFzLCBycCk7CisJCWNvbnMgPSBxdWV1ZS0+cngucnNwX2NvbnM7CiAJfQogCiAJZm9yICg7OykgewpAQCAtNzUzLDcgKzgxNCw3IEBACiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCWRldl93YXJuKGRldiwgInJ4LT5vZmZzZXQ6ICV4LCBzaXplOiAldVxuIiwKIAkJCQkJIHJ4LT5vZmZzZXQsIHJ4LT5zdGF0dXMpOwotCQkJeGVubmV0X21vdmVfcnhfc2xvdChucCwgc2tiLCByZWYpOworCQkJeGVubmV0X21vdmVfcnhfc2xvdChxdWV1ZSwgc2tiLCByZWYpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gbmV4dDsKIAkJfQpAQCAtNzc0LDcgKzgzNSw3IEBACiAJCXJldCA9IGdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3NfcmVmKHJlZiwgMCk7CiAJCUJVR19PTighcmV0KTsKIAotCQlnbnR0YWJfcmVsZWFzZV9ncmFudF9yZWZlcmVuY2UoJm5wLT5ncmVmX3J4X2hlYWQsIHJlZik7CisJCWdudHRhYl9yZWxlYXNlX2dyYW50X3JlZmVyZW5jZSgmcXVldWUtPmdyZWZfcnhfaGVhZCwgcmVmKTsKIAogCQlfX3NrYl9xdWV1ZV90YWlsKGxpc3QsIHNrYik7CiAKQEAgLTc4OSw5ICs4NTAsOSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyeCA9IFJJTkdfR0VUX1JFU1BPTlNFKCZucC0+cngsIGNvbnMgKyBzbG90cyk7Ci0JCXNrYiA9IHhlbm5ldF9nZXRfcnhfc2tiKG5wLCBjb25zICsgc2xvdHMpOwotCQlyZWYgPSB4ZW5uZXRfZ2V0X3J4X3JlZihucCwgY29ucyArIHNsb3RzKTsKKwkJcnggPSBSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnJ4LCBjb25zICsgc2xvdHMpOworCQlza2IgPSB4ZW5uZXRfZ2V0X3J4X3NrYihxdWV1ZSwgY29ucyArIHNsb3RzKTsKKwkJcmVmID0geGVubmV0X2dldF9yeF9yZWYocXVldWUsIGNvbnMgKyBzbG90cyk7CiAJCXNsb3RzKys7CiAJfQogCkBAIC04MDIsNyArODYzLDcgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJbnAtPnJ4LnJzcF9jb25zID0gY29ucyArIHNsb3RzOworCQlxdWV1ZS0+cngucnNwX2NvbnMgPSBjb25zICsgc2xvdHM7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtODM2LDE3ICs4OTcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIFJJTkdfSURYIHhlbm5ldF9maWxsX2ZyYWdzKHN0cnVjdCBuZXRmcm9udF9pbmZvICpucCwKK3N0YXRpYyBSSU5HX0lEWCB4ZW5uZXRfZmlsbF9mcmFncyhzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlLAogCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOwotCVJJTkdfSURYIGNvbnMgPSBucC0+cngucnNwX2NvbnM7CisJUklOR19JRFggY29ucyA9IHF1ZXVlLT5yeC5yc3BfY29uczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAogCXdoaWxlICgobnNrYiA9IF9fc2tiX2RlcXVldWUobGlzdCkpKSB7CiAJCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKnJ4ID0KLQkJCVJJTkdfR0VUX1JFU1BPTlNFKCZucC0+cngsICsrY29ucyk7CisJCQlSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnJ4LCArK2NvbnMpOwogCQlza2JfZnJhZ190ICpuZnJhZyA9ICZza2Jfc2hpbmZvKG5za2IpLT5mcmFnc1swXTsKIAogCQlpZiAoc2hpbmZvLT5ucl9mcmFncyA9PSBNQVhfU0tCX0ZSQUdTKSB7CkBAIC04NzksNyArOTQwLDcgQEAKIAkgKi8KIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCAmJiBza2JfaXNfZ3NvKHNrYikpIHsKIAkJc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJbnAtPnJ4X2dzb19jaGVja3N1bV9maXh1cCsrOworCQlhdG9taWNfaW5jKCZucC0+cnhfZ3NvX2NoZWNrc3VtX2ZpeHVwKTsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCQlyZWNhbGN1bGF0ZV9wYXJ0aWFsX2NzdW0gPSB0cnVlOwogCX0KQEAgLTg5MSwxMSArOTUyLDEwIEBACiAJcmV0dXJuIHNrYl9jaGVja3N1bV9zZXR1cChza2IsIHJlY2FsY3VsYXRlX3BhcnRpYWxfY3N1bSk7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX2luY29taW5nX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGhhbmRsZV9pbmNvbWluZ19xdWV1ZShzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpyeHEpCiB7Ci0Jc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0ZnJvbnRfc3RhdHMgKnN0YXRzID0gdGhpc19jcHVfcHRyKG5wLT5zdGF0cyk7CisJc3RydWN0IG5ldGZyb250X3N0YXRzICpzdGF0cyA9IHRoaXNfY3B1X3B0cihxdWV1ZS0+aW5mby0+c3RhdHMpOwogCWludCBwYWNrZXRzX2Ryb3BwZWQgPSAwOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTkwNiwxMyArOTY2LDEzIEBACiAJCQlfX3Bza2JfcHVsbF90YWlsKHNrYiwgcHVsbF90byAtIHNrYl9oZWFkbGVuKHNrYikpOwogCiAJCS8qIEV0aGVybmV0IHdvcms6IERlbGF5ZWQgdG8gaGVyZSBhcyBpdCBwZWVrcyB0aGUgaGVhZGVyLiAqLwotCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBxdWV1ZS0+aW5mby0+bmV0ZGV2KTsKIAkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKLQkJaWYgKGNoZWNrc3VtX3NldHVwKGRldiwgc2tiKSkgeworCQlpZiAoY2hlY2tzdW1fc2V0dXAocXVldWUtPmluZm8tPm5ldGRldiwgc2tiKSkgewogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlwYWNrZXRzX2Ryb3BwZWQrKzsKLQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlxdWV1ZS0+aW5mby0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTkyMiw3ICs5ODIsNyBAQAogCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKIAogCQkvKiBQYXNzIGl0IHVwLiAqLwotCQluYXBpX2dyb19yZWNlaXZlKCZucC0+bmFwaSwgc2tiKTsKKwkJbmFwaV9ncm9fcmVjZWl2ZSgmcXVldWUtPm5hcGksIHNrYik7CiAJfQogCiAJcmV0dXJuIHBhY2tldHNfZHJvcHBlZDsKQEAgLTkzMCw4ICs5OTAsOCBAQAogCiBzdGF0aWMgaW50IHhlbm5ldF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG5ldGZyb250X2luZm8sIG5hcGkpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBucC0+bmV0ZGV2OworCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG5ldGZyb250X3F1ZXVlLCBuYXBpKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXVldWUtPmluZm8tPm5ldGRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRmcm9udF9yeF9pbmZvIHJpbmZvOwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVzcG9uc2UgKnJ4ID0gJnJpbmZvLnJ4OwpAQCAtOTQ0LDI5ICsxMDA0LDI5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwogCi0Jc3Bpbl9sb2NrKCZucC0+cnhfbG9jayk7CisJc3Bpbl9sb2NrKCZxdWV1ZS0+cnhfbG9jayk7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZyeHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmVycnEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRtcHEpOwogCi0JcnAgPSBucC0+cnguc3JpbmctPnJzcF9wcm9kOworCXJwID0gcXVldWUtPnJ4LnNyaW5nLT5yc3BfcHJvZDsKIAlybWIoKTsgLyogRW5zdXJlIHdlIHNlZSBxdWV1ZWQgcmVzcG9uc2VzIHVwIHRvICdycCcuICovCiAKLQlpID0gbnAtPnJ4LnJzcF9jb25zOworCWkgPSBxdWV1ZS0+cngucnNwX2NvbnM7CiAJd29ya19kb25lID0gMDsKIAl3aGlsZSAoKGkgIT0gcnApICYmICh3b3JrX2RvbmUgPCBidWRnZXQpKSB7Ci0JCW1lbWNweShyeCwgUklOR19HRVRfUkVTUE9OU0UoJm5wLT5yeCwgaSksIHNpemVvZigqcngpKTsKKwkJbWVtY3B5KHJ4LCBSSU5HX0dFVF9SRVNQT05TRSgmcXVldWUtPnJ4LCBpKSwgc2l6ZW9mKCpyeCkpOwogCQltZW1zZXQoZXh0cmFzLCAwLCBzaXplb2YocmluZm8uZXh0cmFzKSk7CiAKLQkJZXJyID0geGVubmV0X2dldF9yZXNwb25zZXMobnAsICZyaW5mbywgcnAsICZ0bXBxKTsKKwkJZXJyID0geGVubmV0X2dldF9yZXNwb25zZXMocXVldWUsICZyaW5mbywgcnAsICZ0bXBxKTsKIAogCQlpZiAodW5saWtlbHkoZXJyKSkgewogZXJyOgogCQkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0bXBxKSkpCiAJCQkJX19za2JfcXVldWVfdGFpbCgmZXJycSwgc2tiKTsKIAkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQlpID0gbnAtPnJ4LnJzcF9jb25zOworCQkJaSA9IHF1ZXVlLT5yeC5yc3BfY29uczsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTk3OCw3ICsxMDM4LDcgQEAKIAogCQkJaWYgKHVubGlrZWx5KHhlbm5ldF9zZXRfc2tiX2dzbyhza2IsIGdzbykpKSB7CiAJCQkJX19za2JfcXVldWVfaGVhZCgmdG1wcSwgc2tiKTsKLQkJCQlucC0+cngucnNwX2NvbnMgKz0gc2tiX3F1ZXVlX2xlbigmdG1wcSk7CisJCQkJcXVldWUtPnJ4LnJzcF9jb25zICs9IHNrYl9xdWV1ZV9sZW4oJnRtcHEpOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC05OTIsNyArMTA1Miw3IEBACiAJCXNrYi0+ZGF0YV9sZW4gPSByeC0+c3RhdHVzOwogCQlza2ItPmxlbiArPSByeC0+c3RhdHVzOwogCi0JCWkgPSB4ZW5uZXRfZmlsbF9mcmFncyhucCwgc2tiLCAmdG1wcSk7CisJCWkgPSB4ZW5uZXRfZmlsbF9mcmFncyhxdWV1ZSwgc2tiLCAmdG1wcSk7CiAKIAkJaWYgKHJ4LT5mbGFncyAmIFhFTl9ORVRSWEZfY3N1bV9ibGFuaykKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKQEAgLTEwMDEsMjIgKzEwNjEsMjIgQEAKIAogCQlfX3NrYl9xdWV1ZV90YWlsKCZyeHEsIHNrYik7CiAKLQkJbnAtPnJ4LnJzcF9jb25zID0gKytpOworCQlxdWV1ZS0+cngucnNwX2NvbnMgPSArK2k7CiAJCXdvcmtfZG9uZSsrOwogCX0KIAogCV9fc2tiX3F1ZXVlX3B1cmdlKCZlcnJxKTsKIAotCXdvcmtfZG9uZSAtPSBoYW5kbGVfaW5jb21pbmdfcXVldWUoZGV2LCAmcnhxKTsKKwl3b3JrX2RvbmUgLT0gaGFuZGxlX2luY29taW5nX3F1ZXVlKHF1ZXVlLCAmcnhxKTsKIAogCS8qIElmIHdlIGdldCBhIGNhbGxiYWNrIHdpdGggdmVyeSBmZXcgcmVzcG9uc2VzLCByZWR1Y2UgZmlsbCB0YXJnZXQuICovCiAJLyogTkIuIE5vdGUgZXhwb25lbnRpYWwgaW5jcmVhc2UsIGxpbmVhciBkZWNyZWFzZS4gKi8KLQlpZiAoKChucC0+cngucmVxX3Byb2RfcHZ0IC0gbnAtPnJ4LnNyaW5nLT5yc3BfcHJvZCkgPgotCSAgICAgKCgzKm5wLT5yeF90YXJnZXQpIC8gNCkpICYmCi0JICAgICgtLW5wLT5yeF90YXJnZXQgPCBucC0+cnhfbWluX3RhcmdldCkpCi0JCW5wLT5yeF90YXJnZXQgPSBucC0+cnhfbWluX3RhcmdldDsKKwlpZiAoKChxdWV1ZS0+cngucmVxX3Byb2RfcHZ0IC0gcXVldWUtPnJ4LnNyaW5nLT5yc3BfcHJvZCkgPgorCSAgICAgKCgzKnF1ZXVlLT5yeF90YXJnZXQpIC8gNCkpICYmCisJICAgICgtLXF1ZXVlLT5yeF90YXJnZXQgPCBxdWV1ZS0+cnhfbWluX3RhcmdldCkpCisJCXF1ZXVlLT5yeF90YXJnZXQgPSBxdWV1ZS0+cnhfbWluX3RhcmdldDsKIAotCXhlbm5ldF9hbGxvY19yeF9idWZmZXJzKGRldik7CisJeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMocXVldWUpOwogCiAJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgewogCQlpbnQgbW9yZV90b19kbyA9IDA7CkBAIC0xMDI1LDE0ICsxMDg1LDE0IEBACiAKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JCVJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFU1BPTlNFUygmbnAtPnJ4LCBtb3JlX3RvX2RvKTsKKwkJUklOR19GSU5BTF9DSEVDS19GT1JfUkVTUE9OU0VTKCZxdWV1ZS0+cngsIG1vcmVfdG9fZG8pOwogCQlpZiAoIW1vcmVfdG9fZG8pCiAJCQlfX25hcGlfY29tcGxldGUobmFwaSk7CiAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZucC0+cnhfbG9jayk7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5yeF9sb2NrKTsKIAogCXJldHVybiB3b3JrX2RvbmU7CiB9CkBAIC0xMDgwLDQzICsxMTQwLDQzIEBACiAJcmV0dXJuIHRvdDsKIH0KIAotc3RhdGljIHZvaWQgeGVubmV0X3JlbGVhc2VfdHhfYnVmcyhzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnApCitzdGF0aWMgdm9pZCB4ZW5uZXRfcmVsZWFzZV90eF9idWZzKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBORVRfVFhfUklOR19TSVpFOyBpKyspIHsKIAkJLyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGFjdHVhbGx5IGZyZWVsaXN0IHJlZmVyZW5jZXMgKi8KLQkJaWYgKHNrYl9lbnRyeV9pc19saW5rKCZucC0+dHhfc2tic1tpXSkpCisJCWlmIChza2JfZW50cnlfaXNfbGluaygmcXVldWUtPnR4X3NrYnNbaV0pKQogCQkJY29udGludWU7CiAKLQkJc2tiID0gbnAtPnR4X3NrYnNbaV0uc2tiOwotCQlnZXRfcGFnZShucC0+Z3JhbnRfdHhfcGFnZVtpXSk7Ci0JCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MobnAtPmdyYW50X3R4X3JlZltpXSwKKwkJc2tiID0gcXVldWUtPnR4X3NrYnNbaV0uc2tiOworCQlnZXRfcGFnZShxdWV1ZS0+Z3JhbnRfdHhfcGFnZVtpXSk7CisJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MocXVldWUtPmdyYW50X3R4X3JlZltpXSwKIAkJCQkJICBHTlRNQVBfcmVhZG9ubHksCi0JCQkJCSAgKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKG5wLT5ncmFudF90eF9wYWdlW2ldKSk7Ci0JCW5wLT5ncmFudF90eF9wYWdlW2ldID0gTlVMTDsKLQkJbnAtPmdyYW50X3R4X3JlZltpXSA9IEdSQU5UX0lOVkFMSURfUkVGOwotCQlhZGRfaWRfdG9fZnJlZWxpc3QoJm5wLT50eF9za2JfZnJlZWxpc3QsIG5wLT50eF9za2JzLCBpKTsKKwkJCQkJICAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocXVldWUtPmdyYW50X3R4X3BhZ2VbaV0pKTsKKwkJcXVldWUtPmdyYW50X3R4X3BhZ2VbaV0gPSBOVUxMOworCQlxdWV1ZS0+Z3JhbnRfdHhfcmVmW2ldID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJCWFkZF9pZF90b19mcmVlbGlzdCgmcXVldWUtPnR4X3NrYl9mcmVlbGlzdCwgcXVldWUtPnR4X3NrYnMsIGkpOwogCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgeGVubmV0X3JlbGVhc2VfcnhfYnVmcyhzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnApCitzdGF0aWMgdm9pZCB4ZW5uZXRfcmVsZWFzZV9yeF9idWZzKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUpCiB7CiAJaW50IGlkLCByZWY7CiAKLQlzcGluX2xvY2tfYmgoJm5wLT5yeF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlLT5yeF9sb2NrKTsKIAogCWZvciAoaWQgPSAwOyBpZCA8IE5FVF9SWF9SSU5HX1NJWkU7IGlkKyspIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJc2tiID0gbnAtPnJ4X3NrYnNbaWRdOworCQlza2IgPSBxdWV1ZS0+cnhfc2tic1tpZF07CiAJCWlmICghc2tiKQogCQkJY29udGludWU7CiAKLQkJcmVmID0gbnAtPmdyYW50X3J4X3JlZltpZF07CisJCXJlZiA9IHF1ZXVlLT5ncmFudF9yeF9yZWZbaWRdOwogCQlpZiAocmVmID09IEdSQU5UX0lOVkFMSURfUkVGKQogCQkJY29udGludWU7CiAKQEAgLTExMjgsMjEgKzExODgsMjggQEAKIAkJZ2V0X3BhZ2UocGFnZSk7CiAJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MocmVmLCAwLAogCQkJCQkgICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSk7Ci0JCW5wLT5ncmFudF9yeF9yZWZbaWRdID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJCXF1ZXVlLT5ncmFudF9yeF9yZWZbaWRdID0gR1JBTlRfSU5WQUxJRF9SRUY7CiAKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJm5wLT5yeF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWUtPnJ4X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCB4ZW5uZXRfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl4ZW5uZXRfcmVsZWFzZV90eF9idWZzKG5wKTsKLQl4ZW5uZXRfcmVsZWFzZV9yeF9idWZzKG5wKTsKLQlnbnR0YWJfZnJlZV9ncmFudF9yZWZlcmVuY2VzKG5wLT5ncmVmX3R4X2hlYWQpOwotCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMobnAtPmdyZWZfcnhfaGVhZCk7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwlzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkgeworCQlxdWV1ZSA9ICZucC0+cXVldWVzW2ldOworCQl4ZW5uZXRfcmVsZWFzZV90eF9idWZzKHF1ZXVlKTsKKwkJeGVubmV0X3JlbGVhc2VfcnhfYnVmcyhxdWV1ZSk7CisJCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMocXVldWUtPmdyZWZfdHhfaGVhZCk7CisJCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMocXVldWUtPmdyZWZfcnhfaGVhZCk7CisJfQogfQogCiBzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgeGVubmV0X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTIwMywyNSArMTI3MCwyNCBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVubmV0X3R4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gZGV2X2lkOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBucC0+bmV0ZGV2OworCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBkZXZfaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+dHhfbG9jaywgZmxhZ3MpOwotCXhlbm5ldF90eF9idWZfZ2MoZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+dHhfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+dHhfbG9jaywgZmxhZ3MpOworCXhlbm5ldF90eF9idWZfZ2MocXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT50eF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB4ZW5uZXRfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBkZXZfaWQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5wLT5uZXRkZXY7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXVldWUtPmluZm8tPm5ldGRldjsKIAogCWlmIChsaWtlbHkobmV0aWZfY2Fycmllcl9vayhkZXYpICYmCi0JCSAgIFJJTkdfSEFTX1VOQ09OU1VNRURfUkVTUE9OU0VTKCZucC0+cngpKSkKLQkJCW5hcGlfc2NoZWR1bGUoJm5wLT5uYXBpKTsKKwkJICAgUklOR19IQVNfVU5DT05TVU1FRF9SRVNQT05TRVMoJnF1ZXVlLT5yeCkpKQorCQkJbmFwaV9zY2hlZHVsZSgmcXVldWUtPm5hcGkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTIzNiw3ICsxMzAyLDEyIEBACiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHhlbm5ldF9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl4ZW5uZXRfaW50ZXJydXB0KDAsIGRldik7CisJLyogUG9sbCBlYWNoIHF1ZXVlICovCisJc3RydWN0IG5ldGZyb250X2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkKKwkJeGVubmV0X2ludGVycnVwdCgwLCAmaW5mby0+cXVldWVzW2ldKTsKIH0KICNlbmRpZgogCkBAIC0xMjUxLDYgKzEzMjIsNyBAQAogCS5uZG9fdmFsaWRhdGVfYWRkciAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19maXhfZmVhdHVyZXMgICAgPSB4ZW5uZXRfZml4X2ZlYXR1cmVzLAogCS5uZG9fc2V0X2ZlYXR1cmVzICAgID0geGVubmV0X3NldF9mZWF0dXJlcywKKwkubmRvX3NlbGVjdF9xdWV1ZSAgICA9IHhlbm5ldF9zZWxlY3RfcXVldWUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlciA9IHhlbm5ldF9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKQEAgLTEyNTgsNjYgKzEzMzAsMzAgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICp4ZW5uZXRfY3JlYXRlX2RldihzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQogewotCWludCBpLCBlcnI7CisJaW50IGVycjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBuZXRmcm9udF9pbmZvICpucDsKIAotCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0ZnJvbnRfaW5mbykpOworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyksIHhlbm5ldF9tYXhfcXVldWVzKTsKIAlpZiAoIW5ldGRldikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlucCAgICAgICAgICAgICAgICAgICA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJbnAtPnhiZGV2ICAgICAgICAgICAgPSBkZXY7CiAKLQlzcGluX2xvY2tfaW5pdCgmbnAtPnR4X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZucC0+cnhfbG9jayk7Ci0KLQlza2JfcXVldWVfaGVhZF9pbml0KCZucC0+cnhfYmF0Y2gpOwotCW5wLT5yeF90YXJnZXQgICAgID0gUlhfREZMX01JTl9UQVJHRVQ7Ci0JbnAtPnJ4X21pbl90YXJnZXQgPSBSWF9ERkxfTUlOX1RBUkdFVDsKLQlucC0+cnhfbWF4X3RhcmdldCA9IFJYX01BWF9UQVJHRVQ7Ci0KLQlpbml0X3RpbWVyKCZucC0+cnhfcmVmaWxsX3RpbWVyKTsKLQlucC0+cnhfcmVmaWxsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyluZXRkZXY7Ci0JbnAtPnJ4X3JlZmlsbF90aW1lci5mdW5jdGlvbiA9IHJ4X3JlZmlsbF90aW1lb3V0OworCS8qIE5vIG5lZWQgdG8gdXNlIHJ0bmxfbG9jaygpIGJlZm9yZSB0aGUgY2FsbCBiZWxvdyBhcyBpdAorCSAqIGhhcHBlbnMgYmVmb3JlIHJlZ2lzdGVyX25ldGRldigpLgorCSAqLworCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmV0ZGV2LCAwKTsKKwlucC0+cXVldWVzID0gTlVMTDsKIAogCWVyciA9IC1FTk9NRU07CiAJbnAtPnN0YXRzID0gbmV0ZGV2X2FsbG9jX3BjcHVfc3RhdHMoc3RydWN0IG5ldGZyb250X3N0YXRzKTsKIAlpZiAobnAtPnN0YXRzID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKIAotCS8qIEluaXRpYWxpc2UgdHhfc2ticyBhcyBhIGZyZWUgY2hhaW4gY29udGFpbmluZyBldmVyeSBlbnRyeS4gKi8KLQlucC0+dHhfc2tiX2ZyZWVsaXN0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTkVUX1RYX1JJTkdfU0laRTsgaSsrKSB7Ci0JCXNrYl9lbnRyeV9zZXRfbGluaygmbnAtPnR4X3NrYnNbaV0sIGkrMSk7Ci0JCW5wLT5ncmFudF90eF9yZWZbaV0gPSBHUkFOVF9JTlZBTElEX1JFRjsKLQkJbnAtPmdyYW50X3R4X3BhZ2VbaV0gPSBOVUxMOwotCX0KLQotCS8qIENsZWFyIG91dCByeF9za2JzICovCi0JZm9yIChpID0gMDsgaSA8IE5FVF9SWF9SSU5HX1NJWkU7IGkrKykgewotCQlucC0+cnhfc2tic1tpXSA9IE5VTEw7Ci0JCW5wLT5ncmFudF9yeF9yZWZbaV0gPSBHUkFOVF9JTlZBTElEX1JFRjsKLQl9Ci0KLQkvKiBBIGdyYW50IGZvciBldmVyeSB0eCByaW5nIHNsb3QgKi8KLQlpZiAoZ250dGFiX2FsbG9jX2dyYW50X3JlZmVyZW5jZXMoVFhfTUFYX1RBUkdFVCwKLQkJCQkJICAmbnAtPmdyZWZfdHhfaGVhZCkgPCAwKSB7Ci0JCXByX2FsZXJ0KCJjYW4ndCBhbGxvYyB0eCBncmFudCByZWZzXG4iKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0X2ZyZWVfc3RhdHM7Ci0JfQotCS8qIEEgZ3JhbnQgZm9yIGV2ZXJ5IHJ4IHJpbmcgc2xvdCAqLwotCWlmIChnbnR0YWJfYWxsb2NfZ3JhbnRfcmVmZXJlbmNlcyhSWF9NQVhfVEFSR0VULAotCQkJCQkgICZucC0+Z3JlZl9yeF9oZWFkKSA8IDApIHsKLQkJcHJfYWxlcnQoImNhbid0IGFsbG9jIHJ4IGdyYW50IHJlZnNcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfZnJlZV90eDsKLQl9Ci0KIAluZXRkZXYtPm5ldGRldl9vcHMJPSAmeGVubmV0X25ldGRldl9vcHM7CiAKLQluZXRpZl9uYXBpX2FkZChuZXRkZXYsICZucC0+bmFwaSwgeGVubmV0X3BvbGwsIDY0KTsKIAluZXRkZXYtPmZlYXR1cmVzICAgICAgICA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfUlhDU1VNIHwKIAkJCQkgIE5FVElGX0ZfR1NPX1JPQlVTVDsKIAluZXRkZXYtPmh3X2ZlYXR1cmVzCT0gTkVUSUZfRl9TRyB8CkBAIC0xMzMyLDcgKzEzNjgsNyBAQAogICAgICAgICAgKi8KIAluZXRkZXYtPmZlYXR1cmVzIHw9IG5ldGRldi0+aHdfZmVhdHVyZXM7CiAKLQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmeGVubmV0X2V0aHRvb2xfb3BzKTsKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnhlbm5ldF9ldGh0b29sX29wczsKIAlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZkZXYtPmRldik7CiAKIAluZXRpZl9zZXRfZ3NvX21heF9zaXplKG5ldGRldiwgWEVOX05FVElGX01BWF9UWF9TSVpFIC0gTUFYX1RDUF9IRUFERVIpOwpAQCAtMTM0MywxMCArMTM3OSw2IEBACiAKIAlyZXR1cm4gbmV0ZGV2OwogCi0gZXhpdF9mcmVlX3R4OgotCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMobnAtPmdyZWZfdHhfaGVhZCk7Ci0gZXhpdF9mcmVlX3N0YXRzOgotCWZyZWVfcGVyY3B1KG5wLT5zdGF0cyk7CiAgZXhpdDoKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0xNDA0LDMwICsxNDM2LDM2IEBACiAKIHN0YXRpYyB2b2lkIHhlbm5ldF9kaXNjb25uZWN0X2JhY2tlbmQoc3RydWN0IG5ldGZyb250X2luZm8gKmluZm8pCiB7Ci0JLyogU3RvcCBvbGQgaS9mIHRvIHByZXZlbnQgZXJyb3JzIHdoaWxzdCB3ZSByZWJ1aWxkIHRoZSBzdGF0ZS4gKi8KLQlzcGluX2xvY2tfYmgoJmluZm8tPnJ4X2xvY2spOwotCXNwaW5fbG9ja19pcnEoJmluZm8tPnR4X2xvY2spOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGluZm8tPm5ldGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19iaCgmaW5mby0+cnhfbG9jayk7CisJdW5zaWduZWQgaW50IGkgPSAwOworCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBOVUxMOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gaW5mby0+bmV0ZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CiAKLQlpZiAoaW5mby0+dHhfaXJxICYmIChpbmZvLT50eF9pcnEgPT0gaW5mby0+cnhfaXJxKSkKLQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpbmZvLT50eF9pcnEsIGluZm8pOwotCWlmIChpbmZvLT50eF9pcnEgJiYgKGluZm8tPnR4X2lycSAhPSBpbmZvLT5yeF9pcnEpKSB7Ci0JCXVuYmluZF9mcm9tX2lycWhhbmRsZXIoaW5mby0+dHhfaXJxLCBpbmZvKTsKLQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpbmZvLT5yeF9pcnEsIGluZm8pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcXVldWVzOyArK2kpIHsKKwkJLyogU3RvcCBvbGQgaS9mIHRvIHByZXZlbnQgZXJyb3JzIHdoaWxzdCB3ZSByZWJ1aWxkIHRoZSBzdGF0ZS4gKi8KKwkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+cnhfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT50eF9sb2NrKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYocXVldWUtPmluZm8tPm5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmcXVldWUtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcXVldWUtPnJ4X2xvY2spOworCisJCWlmIChxdWV1ZS0+dHhfaXJxICYmIChxdWV1ZS0+dHhfaXJxID09IHF1ZXVlLT5yeF9pcnEpKQorCQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihxdWV1ZS0+dHhfaXJxLCBxdWV1ZSk7CisJCWlmIChxdWV1ZS0+dHhfaXJxICYmIChxdWV1ZS0+dHhfaXJxICE9IHF1ZXVlLT5yeF9pcnEpKSB7CisJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHF1ZXVlLT50eF9pcnEsIHF1ZXVlKTsKKwkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocXVldWUtPnJ4X2lycSwgcXVldWUpOworCQl9CisJCXF1ZXVlLT50eF9ldnRjaG4gPSBxdWV1ZS0+cnhfZXZ0Y2huID0gMDsKKwkJcXVldWUtPnR4X2lycSA9IHF1ZXVlLT5yeF9pcnEgPSAwOworCisJCS8qIEVuZCBhY2Nlc3MgYW5kIGZyZWUgdGhlIHBhZ2VzICovCisJCXhlbm5ldF9lbmRfYWNjZXNzKHF1ZXVlLT50eF9yaW5nX3JlZiwgcXVldWUtPnR4LnNyaW5nKTsKKwkJeGVubmV0X2VuZF9hY2Nlc3MocXVldWUtPnJ4X3JpbmdfcmVmLCBxdWV1ZS0+cnguc3JpbmcpOworCisJCXF1ZXVlLT50eF9yaW5nX3JlZiA9IEdSQU5UX0lOVkFMSURfUkVGOworCQlxdWV1ZS0+cnhfcmluZ19yZWYgPSBHUkFOVF9JTlZBTElEX1JFRjsKKwkJcXVldWUtPnR4LnNyaW5nID0gTlVMTDsKKwkJcXVldWUtPnJ4LnNyaW5nID0gTlVMTDsKIAl9Ci0JaW5mby0+dHhfZXZ0Y2huID0gaW5mby0+cnhfZXZ0Y2huID0gMDsKLQlpbmZvLT50eF9pcnEgPSBpbmZvLT5yeF9pcnEgPSAwOwotCi0JLyogRW5kIGFjY2VzcyBhbmQgZnJlZSB0aGUgcGFnZXMgKi8KLQl4ZW5uZXRfZW5kX2FjY2VzcyhpbmZvLT50eF9yaW5nX3JlZiwgaW5mby0+dHguc3JpbmcpOwotCXhlbm5ldF9lbmRfYWNjZXNzKGluZm8tPnJ4X3JpbmdfcmVmLCBpbmZvLT5yeC5zcmluZyk7Ci0KLQlpbmZvLT50eF9yaW5nX3JlZiA9IEdSQU5UX0lOVkFMSURfUkVGOwotCWluZm8tPnJ4X3JpbmdfcmVmID0gR1JBTlRfSU5WQUxJRF9SRUY7Ci0JaW5mby0+dHguc3JpbmcgPSBOVUxMOwotCWluZm8tPnJ4LnNyaW5nID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xNDY4LDEwMCArMTUwNiw4NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldHVwX25ldGZyb250X3NpbmdsZShzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgc2V0dXBfbmV0ZnJvbnRfc2luZ2xlKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IHhlbmJ1c19hbGxvY19ldnRjaG4oaW5mby0+eGJkZXYsICZpbmZvLT50eF9ldnRjaG4pOworCWVyciA9IHhlbmJ1c19hbGxvY19ldnRjaG4ocXVldWUtPmluZm8tPnhiZGV2LCAmcXVldWUtPnR4X2V2dGNobik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZmFpbDsKIAotCWVyciA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoaW5mby0+dHhfZXZ0Y2huLAorCWVyciA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIocXVldWUtPnR4X2V2dGNobiwKIAkJCQkJeGVubmV0X2ludGVycnVwdCwKLQkJCQkJMCwgaW5mby0+bmV0ZGV2LT5uYW1lLCBpbmZvKTsKKwkJCQkJMCwgcXVldWUtPmluZm8tPm5ldGRldi0+bmFtZSwgcXVldWUpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGJpbmRfZmFpbDsKLQlpbmZvLT5yeF9ldnRjaG4gPSBpbmZvLT50eF9ldnRjaG47Ci0JaW5mby0+cnhfaXJxID0gaW5mby0+dHhfaXJxID0gZXJyOworCXF1ZXVlLT5yeF9ldnRjaG4gPSBxdWV1ZS0+dHhfZXZ0Y2huOworCXF1ZXVlLT5yeF9pcnEgPSBxdWV1ZS0+dHhfaXJxID0gZXJyOwogCiAJcmV0dXJuIDA7CiAKIGJpbmRfZmFpbDoKLQl4ZW5idXNfZnJlZV9ldnRjaG4oaW5mby0+eGJkZXYsIGluZm8tPnR4X2V2dGNobik7Ci0JaW5mby0+dHhfZXZ0Y2huID0gMDsKKwl4ZW5idXNfZnJlZV9ldnRjaG4ocXVldWUtPmluZm8tPnhiZGV2LCBxdWV1ZS0+dHhfZXZ0Y2huKTsKKwlxdWV1ZS0+dHhfZXZ0Y2huID0gMDsKIGZhaWw6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzZXR1cF9uZXRmcm9udF9zcGxpdChzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgc2V0dXBfbmV0ZnJvbnRfc3BsaXQoc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0geGVuYnVzX2FsbG9jX2V2dGNobihpbmZvLT54YmRldiwgJmluZm8tPnR4X2V2dGNobik7CisJZXJyID0geGVuYnVzX2FsbG9jX2V2dGNobihxdWV1ZS0+aW5mby0+eGJkZXYsICZxdWV1ZS0+dHhfZXZ0Y2huKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsOwotCWVyciA9IHhlbmJ1c19hbGxvY19ldnRjaG4oaW5mby0+eGJkZXYsICZpbmZvLT5yeF9ldnRjaG4pOworCWVyciA9IHhlbmJ1c19hbGxvY19ldnRjaG4ocXVldWUtPmluZm8tPnhiZGV2LCAmcXVldWUtPnJ4X2V2dGNobik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gYWxsb2NfcnhfZXZ0Y2huX2ZhaWw7CiAKLQlzbnByaW50ZihpbmZvLT50eF9pcnFfbmFtZSwgc2l6ZW9mKGluZm8tPnR4X2lycV9uYW1lKSwKLQkJICIlcy10eCIsIGluZm8tPm5ldGRldi0+bmFtZSk7Ci0JZXJyID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihpbmZvLT50eF9ldnRjaG4sCisJc25wcmludGYocXVldWUtPnR4X2lycV9uYW1lLCBzaXplb2YocXVldWUtPnR4X2lycV9uYW1lKSwKKwkJICIlcy10eCIsIHF1ZXVlLT5uYW1lKTsKKwllcnIgPSBiaW5kX2V2dGNobl90b19pcnFoYW5kbGVyKHF1ZXVlLT50eF9ldnRjaG4sCiAJCQkJCXhlbm5ldF90eF9pbnRlcnJ1cHQsCi0JCQkJCTAsIGluZm8tPnR4X2lycV9uYW1lLCBpbmZvKTsKKwkJCQkJMCwgcXVldWUtPnR4X2lycV9uYW1lLCBxdWV1ZSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gYmluZF90eF9mYWlsOwotCWluZm8tPnR4X2lycSA9IGVycjsKKwlxdWV1ZS0+dHhfaXJxID0gZXJyOwogCi0Jc25wcmludGYoaW5mby0+cnhfaXJxX25hbWUsIHNpemVvZihpbmZvLT5yeF9pcnFfbmFtZSksCi0JCSAiJXMtcngiLCBpbmZvLT5uZXRkZXYtPm5hbWUpOwotCWVyciA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoaW5mby0+cnhfZXZ0Y2huLAorCXNucHJpbnRmKHF1ZXVlLT5yeF9pcnFfbmFtZSwgc2l6ZW9mKHF1ZXVlLT5yeF9pcnFfbmFtZSksCisJCSAiJXMtcngiLCBxdWV1ZS0+bmFtZSk7CisJZXJyID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihxdWV1ZS0+cnhfZXZ0Y2huLAogCQkJCQl4ZW5uZXRfcnhfaW50ZXJydXB0LAotCQkJCQkwLCBpbmZvLT5yeF9pcnFfbmFtZSwgaW5mbyk7CisJCQkJCTAsIHF1ZXVlLT5yeF9pcnFfbmFtZSwgcXVldWUpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGJpbmRfcnhfZmFpbDsKLQlpbmZvLT5yeF9pcnEgPSBlcnI7CisJcXVldWUtPnJ4X2lycSA9IGVycjsKIAogCXJldHVybiAwOwogCiBiaW5kX3J4X2ZhaWw6Ci0JdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpbmZvLT50eF9pcnEsIGluZm8pOwotCWluZm8tPnR4X2lycSA9IDA7CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihxdWV1ZS0+dHhfaXJxLCBxdWV1ZSk7CisJcXVldWUtPnR4X2lycSA9IDA7CiBiaW5kX3R4X2ZhaWw6Ci0JeGVuYnVzX2ZyZWVfZXZ0Y2huKGluZm8tPnhiZGV2LCBpbmZvLT5yeF9ldnRjaG4pOwotCWluZm8tPnJ4X2V2dGNobiA9IDA7CisJeGVuYnVzX2ZyZWVfZXZ0Y2huKHF1ZXVlLT5pbmZvLT54YmRldiwgcXVldWUtPnJ4X2V2dGNobik7CisJcXVldWUtPnJ4X2V2dGNobiA9IDA7CiBhbGxvY19yeF9ldnRjaG5fZmFpbDoKLQl4ZW5idXNfZnJlZV9ldnRjaG4oaW5mby0+eGJkZXYsIGluZm8tPnR4X2V2dGNobik7Ci0JaW5mby0+dHhfZXZ0Y2huID0gMDsKKwl4ZW5idXNfZnJlZV9ldnRjaG4ocXVldWUtPmluZm8tPnhiZGV2LCBxdWV1ZS0+dHhfZXZ0Y2huKTsKKwlxdWV1ZS0+dHhfZXZ0Y2huID0gMDsKIGZhaWw6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzZXR1cF9uZXRmcm9udChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgc2V0dXBfbmV0ZnJvbnQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUsIHVuc2lnbmVkIGludCBmZWF0dXJlX3NwbGl0X2V2dGNobikKIHsKIAlzdHJ1Y3QgeGVuX25ldGlmX3R4X3NyaW5nICp0eHM7CiAJc3RydWN0IHhlbl9uZXRpZl9yeF9zcmluZyAqcnhzOwogCWludCBlcnI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGluZm8tPm5ldGRldjsKLQl1bnNpZ25lZCBpbnQgZmVhdHVyZV9zcGxpdF9ldnRjaG47CiAKLQlpbmZvLT50eF9yaW5nX3JlZiA9IEdSQU5UX0lOVkFMSURfUkVGOwotCWluZm8tPnJ4X3JpbmdfcmVmID0gR1JBTlRfSU5WQUxJRF9SRUY7Ci0JaW5mby0+cnguc3JpbmcgPSBOVUxMOwotCWluZm8tPnR4LnNyaW5nID0gTlVMTDsKLQluZXRkZXYtPmlycSA9IDA7Ci0KLQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgaW5mby0+eGJkZXYtPm90aGVyZW5kLAotCQkJICAgImZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMiLCAiJXUiLAotCQkJICAgJmZlYXR1cmVfc3BsaXRfZXZ0Y2huKTsKLQlpZiAoZXJyIDwgMCkKLQkJZmVhdHVyZV9zcGxpdF9ldnRjaG4gPSAwOwotCi0JZXJyID0geGVuX25ldF9yZWFkX21hYyhkZXYsIG5ldGRldi0+ZGV2X2FkZHIpOwotCWlmIChlcnIpIHsKLQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgInBhcnNpbmcgJXMvbWFjIiwgZGV2LT5ub2RlbmFtZSk7Ci0JCWdvdG8gZmFpbDsKLQl9CisJcXVldWUtPnR4X3JpbmdfcmVmID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJcXVldWUtPnJ4X3JpbmdfcmVmID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJcXVldWUtPnJ4LnNyaW5nID0gTlVMTDsKKwlxdWV1ZS0+dHguc3JpbmcgPSBOVUxMOwogCiAJdHhzID0gKHN0cnVjdCB4ZW5fbmV0aWZfdHhfc3JpbmcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX05PSU8gfCBfX0dGUF9ISUdIKTsKIAlpZiAoIXR4cykgewpAQCAtMTU3MCwxMyArMTU5NCwxMyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCVNIQVJFRF9SSU5HX0lOSVQodHhzKTsKLQlGUk9OVF9SSU5HX0lOSVQoJmluZm8tPnR4LCB0eHMsIFBBR0VfU0laRSk7CisJRlJPTlRfUklOR19JTklUKCZxdWV1ZS0+dHgsIHR4cywgUEFHRV9TSVpFKTsKIAogCWVyciA9IHhlbmJ1c19ncmFudF9yaW5nKGRldiwgdmlydF90b19tZm4odHhzKSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZ3JhbnRfdHhfcmluZ19mYWlsOworCXF1ZXVlLT50eF9yaW5nX3JlZiA9IGVycjsKIAotCWluZm8tPnR4X3JpbmdfcmVmID0gZXJyOwogCXJ4cyA9IChzdHJ1Y3QgeGVuX25ldGlmX3J4X3NyaW5nICopZ2V0X3plcm9lZF9wYWdlKEdGUF9OT0lPIHwgX19HRlBfSElHSCk7CiAJaWYgKCFyeHMpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTE1ODQsMjEgKzE2MDgsMjEgQEAKIAkJZ290byBhbGxvY19yeF9yaW5nX2ZhaWw7CiAJfQogCVNIQVJFRF9SSU5HX0lOSVQocnhzKTsKLQlGUk9OVF9SSU5HX0lOSVQoJmluZm8tPnJ4LCByeHMsIFBBR0VfU0laRSk7CisJRlJPTlRfUklOR19JTklUKCZxdWV1ZS0+cngsIHJ4cywgUEFHRV9TSVpFKTsKIAogCWVyciA9IHhlbmJ1c19ncmFudF9yaW5nKGRldiwgdmlydF90b19tZm4ocnhzKSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZ3JhbnRfcnhfcmluZ19mYWlsOwotCWluZm8tPnJ4X3JpbmdfcmVmID0gZXJyOworCXF1ZXVlLT5yeF9yaW5nX3JlZiA9IGVycjsKIAogCWlmIChmZWF0dXJlX3NwbGl0X2V2dGNobikKLQkJZXJyID0gc2V0dXBfbmV0ZnJvbnRfc3BsaXQoaW5mbyk7CisJCWVyciA9IHNldHVwX25ldGZyb250X3NwbGl0KHF1ZXVlKTsKIAkvKiBzZXR1cCBzaW5nbGUgZXZlbnQgY2hhbm5lbCBpZgogCSAqICBhKSBmZWF0dXJlLXNwbGl0LWV2ZW50LWNoYW5uZWxzID09IDAKIAkgKiAgYikgZmVhdHVyZS1zcGxpdC1ldmVudC1jaGFubmVscyA9PSAxIGJ1dCBmYWlsZWQgdG8gc2V0dXAKIAkgKi8KIAlpZiAoIWZlYXR1cmVfc3BsaXRfZXZ0Y2huIHx8IChmZWF0dXJlX3NwbGl0X2V2dGNobiAmJiBlcnIpKQotCQllcnIgPSBzZXR1cF9uZXRmcm9udF9zaW5nbGUoaW5mbyk7CisJCWVyciA9IHNldHVwX25ldGZyb250X3NpbmdsZShxdWV1ZSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIGFsbG9jX2V2dGNobl9mYWlsOwpAQCAtMTYwOSwxNyArMTYzMywxNjMgQEAKIAkgKiBncmFudGVkIHBhZ2VzIGJlY2F1c2UgYmFja2VuZCBpcyBub3QgYWNjZXNzaW5nIGl0IGF0IHRoaXMgcG9pbnQuCiAJICovCiBhbGxvY19ldnRjaG5fZmFpbDoKLQlnbnR0YWJfZW5kX2ZvcmVpZ25fYWNjZXNzX3JlZihpbmZvLT5yeF9yaW5nX3JlZiwgMCk7CisJZ250dGFiX2VuZF9mb3JlaWduX2FjY2Vzc19yZWYocXVldWUtPnJ4X3JpbmdfcmVmLCAwKTsKIGdyYW50X3J4X3JpbmdfZmFpbDoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcnhzKTsKIGFsbG9jX3J4X3JpbmdfZmFpbDoKLQlnbnR0YWJfZW5kX2ZvcmVpZ25fYWNjZXNzX3JlZihpbmZvLT50eF9yaW5nX3JlZiwgMCk7CisJZ250dGFiX2VuZF9mb3JlaWduX2FjY2Vzc19yZWYocXVldWUtPnR4X3JpbmdfcmVmLCAwKTsKIGdyYW50X3R4X3JpbmdfZmFpbDoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdHhzKTsKIGZhaWw6CiAJcmV0dXJuIGVycjsKIH0KIAorLyogUXVldWUtc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24KKyAqIFRoaXMgdXNlZCB0byBiZSBkb25lIGluIHhlbm5ldF9jcmVhdGVfZGV2KCkgYnV0IG11c3Qgbm93CisgKiBiZSBydW4gcGVyLXF1ZXVlLgorICovCitzdGF0aWMgaW50IHhlbm5ldF9pbml0X3F1ZXVlKHN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUpCit7CisJdW5zaWduZWQgc2hvcnQgaTsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT5yeF9sb2NrKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT5yeF9iYXRjaCk7CisJcXVldWUtPnJ4X3RhcmdldCAgICAgPSBSWF9ERkxfTUlOX1RBUkdFVDsKKwlxdWV1ZS0+cnhfbWluX3RhcmdldCA9IFJYX0RGTF9NSU5fVEFSR0VUOworCXF1ZXVlLT5yeF9tYXhfdGFyZ2V0ID0gUlhfTUFYX1RBUkdFVDsKKworCWluaXRfdGltZXIoJnF1ZXVlLT5yeF9yZWZpbGxfdGltZXIpOworCXF1ZXVlLT5yeF9yZWZpbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXF1ZXVlOworCXF1ZXVlLT5yeF9yZWZpbGxfdGltZXIuZnVuY3Rpb24gPSByeF9yZWZpbGxfdGltZW91dDsKKworCXNucHJpbnRmKHF1ZXVlLT5uYW1lLCBzaXplb2YocXVldWUtPm5hbWUpLCAiJXMtcSV1IiwKKwkJIHF1ZXVlLT5pbmZvLT5uZXRkZXYtPm5hbWUsIHF1ZXVlLT5pZCk7CisKKwkvKiBJbml0aWFsaXNlIHR4X3NrYnMgYXMgYSBmcmVlIGNoYWluIGNvbnRhaW5pbmcgZXZlcnkgZW50cnkuICovCisJcXVldWUtPnR4X3NrYl9mcmVlbGlzdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5FVF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2JfZW50cnlfc2V0X2xpbmsoJnF1ZXVlLT50eF9za2JzW2ldLCBpKzEpOworCQlxdWV1ZS0+Z3JhbnRfdHhfcmVmW2ldID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJCXF1ZXVlLT5ncmFudF90eF9wYWdlW2ldID0gTlVMTDsKKwl9CisKKwkvKiBDbGVhciBvdXQgcnhfc2ticyAqLworCWZvciAoaSA9IDA7IGkgPCBORVRfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcXVldWUtPnJ4X3NrYnNbaV0gPSBOVUxMOworCQlxdWV1ZS0+Z3JhbnRfcnhfcmVmW2ldID0gR1JBTlRfSU5WQUxJRF9SRUY7CisJfQorCisJLyogQSBncmFudCBmb3IgZXZlcnkgdHggcmluZyBzbG90ICovCisJaWYgKGdudHRhYl9hbGxvY19ncmFudF9yZWZlcmVuY2VzKFRYX01BWF9UQVJHRVQsCisJCQkJCSAgJnF1ZXVlLT5ncmVmX3R4X2hlYWQpIDwgMCkgeworCQlwcl9hbGVydCgiY2FuJ3QgYWxsb2MgdHggZ3JhbnQgcmVmc1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBBIGdyYW50IGZvciBldmVyeSByeCByaW5nIHNsb3QgKi8KKwlpZiAoZ250dGFiX2FsbG9jX2dyYW50X3JlZmVyZW5jZXMoUlhfTUFYX1RBUkdFVCwKKwkJCQkJICAmcXVldWUtPmdyZWZfcnhfaGVhZCkgPCAwKSB7CisJCXByX2FsZXJ0KCJjYW4ndCBhbGxvYyByeCBncmFudCByZWZzXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2ZyZWVfdHg7CisJfQorCisJbmV0aWZfbmFwaV9hZGQocXVldWUtPmluZm8tPm5ldGRldiwgJnF1ZXVlLT5uYXBpLCB4ZW5uZXRfcG9sbCwgNjQpOworCisJcmV0dXJuIDA7CisKKyBleGl0X2ZyZWVfdHg6CisJZ250dGFiX2ZyZWVfZ3JhbnRfcmVmZXJlbmNlcyhxdWV1ZS0+Z3JlZl90eF9oZWFkKTsKKyBleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcXVldWVfeGVuc3RvcmVfa2V5cyhzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlLAorCQkJICAgc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiAqeGJ0LCBpbnQgd3JpdGVfaGllcmFyY2hpY2FsKQoreworCS8qIFdyaXRlIHRoZSBxdWV1ZS1zcGVjaWZpYyBrZXlzIGludG8gWGVuU3RvcmUgaW4gdGhlIHRyYWRpdGlvbmFsCisJICogd2F5IGZvciBhIHNpbmdsZSBxdWV1ZSwgb3IgaW4gYSBxdWV1ZSBzdWJrZXlzIGZvciBtdWx0aXBsZQorCSAqIHF1ZXVlcy4KKwkgKi8KKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gcXVldWUtPmluZm8tPnhiZGV2OworCWludCBlcnI7CisJY29uc3QgY2hhciAqbWVzc2FnZTsKKwljaGFyICpwYXRoOworCXNpemVfdCBwYXRoc2l6ZTsKKworCS8qIENob29zZSB0aGUgY29ycmVjdCBwbGFjZSB0byB3cml0ZSB0aGUga2V5cyAqLworCWlmICh3cml0ZV9oaWVyYXJjaGljYWwpIHsKKwkJcGF0aHNpemUgPSBzdHJsZW4oZGV2LT5ub2RlbmFtZSkgKyAxMDsKKwkJcGF0aCA9IGt6YWxsb2MocGF0aHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBhdGgpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQltZXNzYWdlID0gIm91dCBvZiBtZW1vcnkgd2hpbGUgd3JpdGluZyByaW5nIHJlZmVyZW5jZXMiOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzbnByaW50ZihwYXRoLCBwYXRoc2l6ZSwgIiVzL3F1ZXVlLSV1IiwKKwkJCQlkZXYtPm5vZGVuYW1lLCBxdWV1ZS0+aWQpOworCX0gZWxzZSB7CisJCXBhdGggPSAoY2hhciAqKWRldi0+bm9kZW5hbWU7CisJfQorCisJLyogV3JpdGUgcmluZyByZWZlcmVuY2VzICovCisJZXJyID0geGVuYnVzX3ByaW50ZigqeGJ0LCBwYXRoLCAidHgtcmluZy1yZWYiLCAiJXUiLAorCQkJcXVldWUtPnR4X3JpbmdfcmVmKTsKKwlpZiAoZXJyKSB7CisJCW1lc3NhZ2UgPSAid3JpdGluZyB0eC1yaW5nLXJlZiI7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0geGVuYnVzX3ByaW50ZigqeGJ0LCBwYXRoLCAicngtcmluZy1yZWYiLCAiJXUiLAorCQkJcXVldWUtPnJ4X3JpbmdfcmVmKTsKKwlpZiAoZXJyKSB7CisJCW1lc3NhZ2UgPSAid3JpdGluZyByeC1yaW5nLXJlZiI7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogV3JpdGUgZXZlbnQgY2hhbm5lbHM7IHRha2luZyBpbnRvIGFjY291bnQgYm90aCBzaGFyZWQKKwkgKiBhbmQgc3BsaXQgZXZlbnQgY2hhbm5lbCBzY2VuYXJpb3MuCisJICovCisJaWYgKHF1ZXVlLT50eF9ldnRjaG4gPT0gcXVldWUtPnJ4X2V2dGNobikgeworCQkvKiBTaGFyZWQgZXZlbnQgY2hhbm5lbCAqLworCQllcnIgPSB4ZW5idXNfcHJpbnRmKCp4YnQsIHBhdGgsCisJCQkJImV2ZW50LWNoYW5uZWwiLCAiJXUiLCBxdWV1ZS0+dHhfZXZ0Y2huKTsKKwkJaWYgKGVycikgeworCQkJbWVzc2FnZSA9ICJ3cml0aW5nIGV2ZW50LWNoYW5uZWwiOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNwbGl0IGV2ZW50IGNoYW5uZWxzICovCisJCWVyciA9IHhlbmJ1c19wcmludGYoKnhidCwgcGF0aCwKKwkJCQkiZXZlbnQtY2hhbm5lbC10eCIsICIldSIsIHF1ZXVlLT50eF9ldnRjaG4pOworCQlpZiAoZXJyKSB7CisJCQltZXNzYWdlID0gIndyaXRpbmcgZXZlbnQtY2hhbm5lbC10eCI7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJZXJyID0geGVuYnVzX3ByaW50ZigqeGJ0LCBwYXRoLAorCQkJCSJldmVudC1jaGFubmVsLXJ4IiwgIiV1IiwgcXVldWUtPnJ4X2V2dGNobik7CisJCWlmIChlcnIpIHsKKwkJCW1lc3NhZ2UgPSAid3JpdGluZyBldmVudC1jaGFubmVsLXJ4IjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlpZiAod3JpdGVfaGllcmFyY2hpY2FsKQorCQlrZnJlZShwYXRoKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKHdyaXRlX2hpZXJhcmNoaWNhbCkKKwkJa2ZyZWUocGF0aCk7CisJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgIiVzIiwgbWVzc2FnZSk7CisJcmV0dXJuIGVycjsKK30KKwogLyogQ29tbW9uIGNvZGUgdXNlZCB3aGVuIGZpcnN0IHNldHRpbmcgdXAsIGFuZCB3aGVuIHJlc3VtaW5nLiAqLwogc3RhdGljIGludCB0YWxrX3RvX25ldGJhY2soc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBuZXRmcm9udF9pbmZvICppbmZvKQpAQCAtMTYyNywxMSArMTc5Nyw4MyBAQAogCWNvbnN0IGNoYXIgKm1lc3NhZ2U7CiAJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB4YnQ7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZV9zcGxpdF9ldnRjaG47CisJdW5zaWduZWQgaW50IGkgPSAwOworCXVuc2lnbmVkIGludCBtYXhfcXVldWVzID0gMDsKKwlzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IDE7CiAKLQkvKiBDcmVhdGUgc2hhcmVkIHJpbmcsIGFsbG9jIGV2ZW50IGNoYW5uZWwuICovCi0JZXJyID0gc2V0dXBfbmV0ZnJvbnQoZGV2LCBpbmZvKTsKLQlpZiAoZXJyKQorCWluZm8tPm5ldGRldi0+aXJxID0gMDsKKworCS8qIENoZWNrIGlmIGJhY2tlbmQgc3VwcG9ydHMgbXVsdGlwbGUgcXVldWVzICovCisJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwKKwkJCSAgICJtdWx0aS1xdWV1ZS1tYXgtcXVldWVzIiwgIiV1IiwgJm1heF9xdWV1ZXMpOworCWlmIChlcnIgPCAwKQorCQltYXhfcXVldWVzID0gMTsKKwludW1fcXVldWVzID0gbWluKG1heF9xdWV1ZXMsIHhlbm5ldF9tYXhfcXVldWVzKTsKKworCS8qIENoZWNrIGZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMgKi8KKwllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgaW5mby0+eGJkZXYtPm90aGVyZW5kLAorCQkJICAgImZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMiLCAiJXUiLAorCQkJICAgJmZlYXR1cmVfc3BsaXRfZXZ0Y2huKTsKKwlpZiAoZXJyIDwgMCkKKwkJZmVhdHVyZV9zcGxpdF9ldnRjaG4gPSAwOworCisJLyogUmVhZCBtYWMgYWRkci4gKi8KKwllcnIgPSB4ZW5fbmV0X3JlYWRfbWFjKGRldiwgaW5mby0+bmV0ZGV2LT5kZXZfYWRkcik7CisJaWYgKGVycikgeworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLCAicGFyc2luZyAlcy9tYWMiLCBkZXYtPm5vZGVuYW1lKTsKIAkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgYXJyYXkgb2YgcXVldWVzICovCisJaW5mby0+cXVldWVzID0ga2NhbGxvYyhudW1fcXVldWVzLCBzaXplb2Yoc3RydWN0IG5ldGZyb250X3F1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvLT5xdWV1ZXMpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXJ0bmxfbG9jaygpOworCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoaW5mby0+bmV0ZGV2LCBudW1fcXVldWVzKTsKKwlydG5sX3VubG9jaygpOworCisJLyogQ3JlYXRlIHNoYXJlZCByaW5nLCBhbGxvYyBldmVudCBjaGFubmVsIC0tIGZvciBlYWNoIHF1ZXVlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkgeworCQlxdWV1ZSA9ICZpbmZvLT5xdWV1ZXNbaV07CisJCXF1ZXVlLT5pZCA9IGk7CisJCXF1ZXVlLT5pbmZvID0gaW5mbzsKKwkJZXJyID0geGVubmV0X2luaXRfcXVldWUocXVldWUpOworCQlpZiAoZXJyKSB7CisJCQkvKiB4ZW5uZXRfaW5pdF9xdWV1ZSgpIGNsZWFucyB1cCBhZnRlciBpdHNlbGYgb24gZmFpbHVyZSwKKwkJCSAqIGJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IGluaXRpYWxpc2VkCisJCQkgKiBxdWV1ZXMuIElmIGkgPiAwLCBzZXQgbnVtX3F1ZXVlcyB0byBpLCB0aGVuIGdvdG8KKwkJCSAqIGRlc3Ryb3lfcmluZywgd2hpY2ggY2FsbHMgeGVubmV0X2Rpc2Nvbm5lY3RfYmFja2VuZCgpCisJCQkgKiB0byB0aWR5IHVwLgorCQkJICovCisJCQlpZiAoaSA+IDApIHsKKwkJCQlydG5sX2xvY2soKTsKKwkJCQluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKGluZm8tPm5ldGRldiwgaSk7CisJCQkJcnRubF91bmxvY2soKTsKKwkJCQlnb3RvIGRlc3Ryb3lfcmluZzsKKwkJCX0gZWxzZSB7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZXJyID0gc2V0dXBfbmV0ZnJvbnQoZGV2LCBxdWV1ZSwgZmVhdHVyZV9zcGxpdF9ldnRjaG4pOworCQlpZiAoZXJyKSB7CisJCQkvKiBBcyBmb3IgeGVubmV0X2luaXRfcXVldWUoKSwgc2V0dXBfbmV0ZnJvbnQoKSB3aWxsIHRpZHkKKwkJCSAqIHVwIHRoZSBjdXJyZW50IHF1ZXVlIG9uIGVycm9yLCBidXQgd2UgbmVlZCB0byBjbGVhbiB1cAorCQkJICogdGhvc2UgYWxyZWFkeSBhbGxvY2F0ZWQuCisJCQkgKi8KKwkJCWlmIChpID4gMCkgeworCQkJCXJ0bmxfbG9jaygpOworCQkJCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoaW5mby0+bmV0ZGV2LCBpKTsKKwkJCQlydG5sX3VubG9jaygpOworCQkJCWdvdG8gZGVzdHJveV9yaW5nOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KIAogYWdhaW46CiAJZXJyID0geGVuYnVzX3RyYW5zYWN0aW9uX3N0YXJ0KCZ4YnQpOwpAQCAtMTY0MCw0MSArMTg4MiwyOSBAQAogCQlnb3RvIGRlc3Ryb3lfcmluZzsKIAl9CiAKLQllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInR4LXJpbmctcmVmIiwgIiV1IiwKLQkJCSAgICBpbmZvLT50eF9yaW5nX3JlZik7Ci0JaWYgKGVycikgewotCQltZXNzYWdlID0gIndyaXRpbmcgdHggcmluZy1yZWYiOwotCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOwotCX0KLQllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInJ4LXJpbmctcmVmIiwgIiV1IiwKLQkJCSAgICBpbmZvLT5yeF9yaW5nX3JlZik7Ci0JaWYgKGVycikgewotCQltZXNzYWdlID0gIndyaXRpbmcgcnggcmluZy1yZWYiOwotCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOwotCX0KLQotCWlmIChpbmZvLT50eF9ldnRjaG4gPT0gaW5mby0+cnhfZXZ0Y2huKSB7Ci0JCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLAotCQkJCSAgICAiZXZlbnQtY2hhbm5lbCIsICIldSIsIGluZm8tPnR4X2V2dGNobik7Ci0JCWlmIChlcnIpIHsKLQkJCW1lc3NhZ2UgPSAid3JpdGluZyBldmVudC1jaGFubmVsIjsKLQkJCWdvdG8gYWJvcnRfdHJhbnNhY3Rpb247Ci0JCX0KKwlpZiAobnVtX3F1ZXVlcyA9PSAxKSB7CisJCWVyciA9IHdyaXRlX3F1ZXVlX3hlbnN0b3JlX2tleXMoJmluZm8tPnF1ZXVlc1swXSwgJnhidCwgMCk7IC8qIGZsYXQgKi8KKwkJaWYgKGVycikKKwkJCWdvdG8gYWJvcnRfdHJhbnNhY3Rpb25fbm9fZGV2X2ZhdGFsOwogCX0gZWxzZSB7Ci0JCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLAotCQkJCSAgICAiZXZlbnQtY2hhbm5lbC10eCIsICIldSIsIGluZm8tPnR4X2V2dGNobik7CisJCS8qIFdyaXRlIHRoZSBudW1iZXIgb2YgcXVldWVzICovCisJCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAibXVsdGktcXVldWUtbnVtLXF1ZXVlcyIsCisJCQkJICAgICIldSIsIG51bV9xdWV1ZXMpOwogCQlpZiAoZXJyKSB7Ci0JCQltZXNzYWdlID0gIndyaXRpbmcgZXZlbnQtY2hhbm5lbC10eCI7Ci0JCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOworCQkJbWVzc2FnZSA9ICJ3cml0aW5nIG11bHRpLXF1ZXVlLW51bS1xdWV1ZXMiOworCQkJZ290byBhYm9ydF90cmFuc2FjdGlvbl9ub19kZXZfZmF0YWw7CiAJCX0KLQkJZXJyID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsCi0JCQkJICAgICJldmVudC1jaGFubmVsLXJ4IiwgIiV1IiwgaW5mby0+cnhfZXZ0Y2huKTsKLQkJaWYgKGVycikgewotCQkJbWVzc2FnZSA9ICJ3cml0aW5nIGV2ZW50LWNoYW5uZWwtcngiOwotCQkJZ290byBhYm9ydF90cmFuc2FjdGlvbjsKKworCQkvKiBXcml0ZSB0aGUga2V5cyBmb3IgZWFjaCBxdWV1ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3F1ZXVlczsgKytpKSB7CisJCQlxdWV1ZSA9ICZpbmZvLT5xdWV1ZXNbaV07CisJCQllcnIgPSB3cml0ZV9xdWV1ZV94ZW5zdG9yZV9rZXlzKHF1ZXVlLCAmeGJ0LCAxKTsgLyogaGllcmFyY2hpY2FsICovCisJCQlpZiAoZXJyKQorCQkJCWdvdG8gYWJvcnRfdHJhbnNhY3Rpb25fbm9fZGV2X2ZhdGFsOwogCQl9CiAJfQogCisJLyogVGhlIHJlbWFpbmluZyBrZXlzIGFyZSBub3QgcXVldWUtc3BlY2lmaWMgKi8KIAllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInJlcXVlc3QtcngtY29weSIsICIldSIsCiAJCQkgICAgMSk7CiAJaWYgKGVycikgewpAQCAtMTcyNCwxMCArMTk1NCwxNiBAQAogCXJldHVybiAwOwogCiAgYWJvcnRfdHJhbnNhY3Rpb246Ci0JeGVuYnVzX3RyYW5zYWN0aW9uX2VuZCh4YnQsIDEpOwogCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICIlcyIsIG1lc3NhZ2UpOworYWJvcnRfdHJhbnNhY3Rpb25fbm9fZGV2X2ZhdGFsOgorCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQoeGJ0LCAxKTsKICBkZXN0cm95X3Jpbmc6CiAJeGVubmV0X2Rpc2Nvbm5lY3RfYmFja2VuZChpbmZvKTsKKwlrZnJlZShpbmZvLT5xdWV1ZXMpOworCWluZm8tPnF1ZXVlcyA9IE5VTEw7CisJcnRubF9sb2NrKCk7CisJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhpbmZvLT5uZXRkZXYsIDApOworCXJ0bmxfbG9jaygpOwogIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTczNSwxMSArMTk3MSwxNCBAQAogc3RhdGljIGludCB4ZW5uZXRfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRmcm9udF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSAwOwogCWludCBpLCByZXF1ZXVlX2lkeCwgZXJyOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJZ3JhbnRfcmVmX3QgcmVmOwogCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGludCBmZWF0dXJlX3J4X2NvcHk7CisJdW5zaWduZWQgaW50IGogPSAwOworCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBOVUxMOwogCiAJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIG5wLT54YmRldi0+b3RoZXJlbmQsCiAJCQkgICAiZmVhdHVyZS1yeC1jb3B5IiwgIiV1IiwgJmZlYXR1cmVfcnhfY29weSk7CkBAIC0xNzU2LDQxICsxOTk1LDQ4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCS8qIHRhbGtfdG9fbmV0YmFjaygpIHNldHMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHF1ZXVlcyAqLworCW51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwogCXJ0bmxfbG9jaygpOwogCW5ldGRldl91cGRhdGVfZmVhdHVyZXMoZGV2KTsKIAlydG5sX3VubG9jaygpOwogCi0Jc3Bpbl9sb2NrX2JoKCZucC0+cnhfbG9jayk7Ci0Jc3Bpbl9sb2NrX2lycSgmbnAtPnR4X2xvY2spOworCS8qIEJ5IG5vdywgdGhlIHF1ZXVlIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIHNldCB1cCAqLworCWZvciAoaiA9IDA7IGogPCBudW1fcXVldWVzOyArK2opIHsKKwkJcXVldWUgPSAmbnAtPnF1ZXVlc1tqXTsKKwkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+cnhfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT50eF9sb2NrKTsKIAotCS8qIFN0ZXAgMTogRGlzY2FyZCBhbGwgcGVuZGluZyBUWCBwYWNrZXQgZnJhZ21lbnRzLiAqLwotCXhlbm5ldF9yZWxlYXNlX3R4X2J1ZnMobnApOworCQkvKiBTdGVwIDE6IERpc2NhcmQgYWxsIHBlbmRpbmcgVFggcGFja2V0IGZyYWdtZW50cy4gKi8KKwkJeGVubmV0X3JlbGVhc2VfdHhfYnVmcyhxdWV1ZSk7CiAKLQkvKiBTdGVwIDI6IFJlYnVpbGQgdGhlIFJYIGJ1ZmZlciBmcmVlbGlzdCBhbmQgdGhlIFJYIHJpbmcgaXRzZWxmLiAqLwotCWZvciAocmVxdWV1ZV9pZHggPSAwLCBpID0gMDsgaSA8IE5FVF9SWF9SSU5HX1NJWkU7IGkrKykgewotCQlza2JfZnJhZ190ICpmcmFnOwotCQljb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJaWYgKCFucC0+cnhfc2tic1tpXSkKLQkJCWNvbnRpbnVlOworCQkvKiBTdGVwIDI6IFJlYnVpbGQgdGhlIFJYIGJ1ZmZlciBmcmVlbGlzdCBhbmQgdGhlIFJYIHJpbmcgaXRzZWxmLiAqLworCQlmb3IgKHJlcXVldWVfaWR4ID0gMCwgaSA9IDA7IGkgPCBORVRfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWc7CisJCQljb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJCWlmICghcXVldWUtPnJ4X3NrYnNbaV0pCisJCQkJY29udGludWU7CiAKLQkJc2tiID0gbnAtPnJ4X3NrYnNbcmVxdWV1ZV9pZHhdID0geGVubmV0X2dldF9yeF9za2IobnAsIGkpOwotCQlyZWYgPSBucC0+Z3JhbnRfcnhfcmVmW3JlcXVldWVfaWR4XSA9IHhlbm5ldF9nZXRfcnhfcmVmKG5wLCBpKTsKLQkJcmVxID0gUklOR19HRVRfUkVRVUVTVCgmbnAtPnJ4LCByZXF1ZXVlX2lkeCk7CisJCQlza2IgPSBxdWV1ZS0+cnhfc2tic1tyZXF1ZXVlX2lkeF0gPSB4ZW5uZXRfZ2V0X3J4X3NrYihxdWV1ZSwgaSk7CisJCQlyZWYgPSBxdWV1ZS0+Z3JhbnRfcnhfcmVmW3JlcXVldWVfaWR4XSA9IHhlbm5ldF9nZXRfcnhfcmVmKHF1ZXVlLCBpKTsKKwkJCXJlcSA9IFJJTkdfR0VUX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcmVxdWV1ZV9pZHgpOwogCi0JCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKLQkJcGFnZSA9IHNrYl9mcmFnX3BhZ2UoZnJhZyk7Ci0JCWdudHRhYl9ncmFudF9mb3JlaWduX2FjY2Vzc19yZWYoCi0JCQlyZWYsIG5wLT54YmRldi0+b3RoZXJlbmRfaWQsCi0JCQlwZm5fdG9fbWZuKHBhZ2VfdG9fcGZuKHBhZ2UpKSwKLQkJCTApOwotCQlyZXEtPmdyZWYgPSByZWY7Ci0JCXJlcS0+aWQgICA9IHJlcXVldWVfaWR4OworCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdOworCQkJcGFnZSA9IHNrYl9mcmFnX3BhZ2UoZnJhZyk7CisJCQlnbnR0YWJfZ3JhbnRfZm9yZWlnbl9hY2Nlc3NfcmVmKAorCQkJCXJlZiwgcXVldWUtPmluZm8tPnhiZGV2LT5vdGhlcmVuZF9pZCwKKwkJCQlwZm5fdG9fbWZuKHBhZ2VfdG9fcGZuKHBhZ2UpKSwKKwkJCQkwKTsKKwkJCXJlcS0+Z3JlZiA9IHJlZjsKKwkJCXJlcS0+aWQgICA9IHJlcXVldWVfaWR4OwogCi0JCXJlcXVldWVfaWR4Kys7CisJCQlyZXF1ZXVlX2lkeCsrOworCQl9CisKKwkJcXVldWUtPnJ4LnJlcV9wcm9kX3B2dCA9IHJlcXVldWVfaWR4OwogCX0KIAotCW5wLT5yeC5yZXFfcHJvZF9wdnQgPSByZXF1ZXVlX2lkeDsKLQogCS8qCiAJICogU3RlcCAzOiBBbGwgcHVibGljIGFuZCBwcml2YXRlIHN0YXRlIHNob3VsZCBub3cgYmUgc2FuZS4gIEdldAogCSAqIHJlYWR5IHRvIHN0YXJ0IHNlbmRpbmcgYW5kIHJlY2VpdmluZyBwYWNrZXRzIGFuZCBnaXZlIHRoZSBkcml2ZXIKQEAgLTE3OTgsMTQgKzIwNDQsMTcgQEAKIAkgKiBwYWNrZXRzLgogCSAqLwogCW5ldGlmX2NhcnJpZXJfb24obnAtPm5ldGRldik7Ci0Jbm90aWZ5X3JlbW90ZV92aWFfaXJxKG5wLT50eF9pcnEpOwotCWlmIChucC0+dHhfaXJxICE9IG5wLT5yeF9pcnEpCi0JCW5vdGlmeV9yZW1vdGVfdmlhX2lycShucC0+cnhfaXJxKTsKLQl4ZW5uZXRfdHhfYnVmX2djKGRldik7Ci0JeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMoZGV2KTsKKwlmb3IgKGogPSAwOyBqIDwgbnVtX3F1ZXVlczsgKytqKSB7CisJCXF1ZXVlID0gJm5wLT5xdWV1ZXNbal07CisJCW5vdGlmeV9yZW1vdGVfdmlhX2lycShxdWV1ZS0+dHhfaXJxKTsKKwkJaWYgKHF1ZXVlLT50eF9pcnEgIT0gcXVldWUtPnJ4X2lycSkKKwkJCW5vdGlmeV9yZW1vdGVfdmlhX2lycShxdWV1ZS0+cnhfaXJxKTsKKwkJeGVubmV0X3R4X2J1Zl9nYyhxdWV1ZSk7CisJCXhlbm5ldF9hbGxvY19yeF9idWZmZXJzKHF1ZXVlKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmbnAtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2JoKCZucC0+cnhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcXVldWUtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcXVldWUtPnJ4X2xvY2spOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTg3OCw3ICsyMTI3LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhlbm5ldF9zdGF0cyk7IGkrKykKLQkJZGF0YVtpXSA9ICoodW5zaWduZWQgbG9uZyAqKShucCArIHhlbm5ldF9zdGF0c1tpXS5vZmZzZXQpOworCQlkYXRhW2ldID0gYXRvbWljX3JlYWQoKGF0b21pY190ICopKG5wICsgeGVubmV0X3N0YXRzW2ldLm9mZnNldCkpOwogfQogCiBzdGF0aWMgdm9pZCB4ZW5uZXRfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBkYXRhKQpAQCAtMTkwOSw4ICsyMTU4LDEyIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHRvX25ldF9kZXYoZGV2KTsKIAlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBuZXRkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBpbmZvLT5yeF9taW5fdGFyZ2V0KTsKKwlpZiAobnVtX3F1ZXVlcykKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGluZm8tPnF1ZXVlc1swXS5yeF9taW5fdGFyZ2V0KTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBSWF9NSU5fVEFSR0VUKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfcnhidWZfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE5MTksOCArMjE3MiwxMSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0b19uZXRfZGV2KGRldik7CiAJc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IG5ldGRldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCWNoYXIgKmVuZHA7CiAJdW5zaWduZWQgbG9uZyB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZTsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTE5MzQsMTYgKzIxOTAsMTkgQEAKIAlpZiAodGFyZ2V0ID4gUlhfTUFYX1RBUkdFVCkKIAkJdGFyZ2V0ID0gUlhfTUFYX1RBUkdFVDsKIAotCXNwaW5fbG9ja19iaCgmbnAtPnJ4X2xvY2spOwotCWlmICh0YXJnZXQgPiBucC0+cnhfbWF4X3RhcmdldCkKLQkJbnAtPnJ4X21heF90YXJnZXQgPSB0YXJnZXQ7Ci0JbnAtPnJ4X21pbl90YXJnZXQgPSB0YXJnZXQ7Ci0JaWYgKHRhcmdldCA+IG5wLT5yeF90YXJnZXQpCi0JCW5wLT5yeF90YXJnZXQgPSB0YXJnZXQ7CisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkgeworCQlxdWV1ZSA9ICZucC0+cXVldWVzW2ldOworCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5yeF9sb2NrKTsKKwkJaWYgKHRhcmdldCA+IHF1ZXVlLT5yeF9tYXhfdGFyZ2V0KQorCQkJcXVldWUtPnJ4X21heF90YXJnZXQgPSB0YXJnZXQ7CisJCXF1ZXVlLT5yeF9taW5fdGFyZ2V0ID0gdGFyZ2V0OworCQlpZiAodGFyZ2V0ID4gcXVldWUtPnJ4X3RhcmdldCkKKwkJCXF1ZXVlLT5yeF90YXJnZXQgPSB0YXJnZXQ7CiAKLQl4ZW5uZXRfYWxsb2NfcnhfYnVmZmVycyhuZXRkZXYpOworCQl4ZW5uZXRfYWxsb2NfcnhfYnVmZmVycyhxdWV1ZSk7CiAKLQlzcGluX3VubG9ja19iaCgmbnAtPnJ4X2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcXVldWUtPnJ4X2xvY2spOworCX0KIAlyZXR1cm4gbGVuOwogfQogCkBAIC0xOTUyLDggKzIyMTEsMTIgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gdG9fbmV0X2RldihkZXYpOwogCXN0cnVjdCBuZXRmcm9udF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IG5ldGRldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGluZm8tPnJ4X21heF90YXJnZXQpOworCWlmIChudW1fcXVldWVzKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgaW5mby0+cXVldWVzWzBdLnJ4X21heF90YXJnZXQpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFJYX01BWF9UQVJHRVQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9yeGJ1Zl9tYXgoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTk2Miw4ICsyMjI1LDExIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHRvX25ldF9kZXYoZGV2KTsKIAlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gbmV0ZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CiAJY2hhciAqZW5kcDsKIAl1bnNpZ25lZCBsb25nIHRhcmdldDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSA9IE5VTEw7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CkBAIC0xOTc3LDE2ICsyMjQzLDE5IEBACiAJaWYgKHRhcmdldCA+IFJYX01BWF9UQVJHRVQpCiAJCXRhcmdldCA9IFJYX01BWF9UQVJHRVQ7CiAKLQlzcGluX2xvY2tfYmgoJm5wLT5yeF9sb2NrKTsKLQlpZiAodGFyZ2V0IDwgbnAtPnJ4X21pbl90YXJnZXQpCi0JCW5wLT5yeF9taW5fdGFyZ2V0ID0gdGFyZ2V0OwotCW5wLT5yeF9tYXhfdGFyZ2V0ID0gdGFyZ2V0OwotCWlmICh0YXJnZXQgPCBucC0+cnhfdGFyZ2V0KQotCQlucC0+cnhfdGFyZ2V0ID0gdGFyZ2V0OworCWZvciAoaSA9IDA7IGkgPCBudW1fcXVldWVzOyArK2kpIHsKKwkJcXVldWUgPSAmbnAtPnF1ZXVlc1tpXTsKKwkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+cnhfbG9jayk7CisJCWlmICh0YXJnZXQgPCBxdWV1ZS0+cnhfbWluX3RhcmdldCkKKwkJCXF1ZXVlLT5yeF9taW5fdGFyZ2V0ID0gdGFyZ2V0OworCQlxdWV1ZS0+cnhfbWF4X3RhcmdldCA9IHRhcmdldDsKKwkJaWYgKHRhcmdldCA8IHF1ZXVlLT5yeF90YXJnZXQpCisJCQlxdWV1ZS0+cnhfdGFyZ2V0ID0gdGFyZ2V0OwogCi0JeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMobmV0ZGV2KTsKKwkJeGVubmV0X2FsbG9jX3J4X2J1ZmZlcnMocXVldWUpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJm5wLT5yeF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5yeF9sb2NrKTsKKwl9CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMTk5NSw4ICsyMjY0LDEyIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHRvX25ldF9kZXYoZGV2KTsKIAlzdHJ1Y3QgbmV0ZnJvbnRfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBuZXRkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBpbmZvLT5yeF90YXJnZXQpOworCWlmIChudW1fcXVldWVzKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgaW5mby0+cXVldWVzWzBdLnJ4X3RhcmdldCk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHhlbm5ldF9hdHRyc1tdID0gewpAQCAtMjA0Myw2ICsyMzE2LDkgQEAKIHN0YXRpYyBpbnQgeGVubmV0X3JlbW92ZShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRmcm9udF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBpbmZvLT5uZXRkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKKwlzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIiVzXG4iLCBkZXYtPm5vZGVuYW1lKTsKIApAQCAtMjA1Miw3ICsyMzI4LDE1IEBACiAKIAl1bnJlZ2lzdGVyX25ldGRldihpbmZvLT5uZXRkZXYpOwogCi0JZGVsX3RpbWVyX3N5bmMoJmluZm8tPnJ4X3JlZmlsbF90aW1lcik7CisJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7ICsraSkgeworCQlxdWV1ZSA9ICZpbmZvLT5xdWV1ZXNbaV07CisJCWRlbF90aW1lcl9zeW5jKCZxdWV1ZS0+cnhfcmVmaWxsX3RpbWVyKTsKKwl9CisKKwlpZiAobnVtX3F1ZXVlcykgeworCQlrZnJlZShpbmZvLT5xdWV1ZXMpOworCQlpbmZvLT5xdWV1ZXMgPSBOVUxMOworCX0KIAogCWZyZWVfcGVyY3B1KGluZm8tPnN0YXRzKTsKIApAQCAtMjA3OCw2ICsyMzYyLDkgQEAKIAogCXByX2luZm8oIkluaXRpYWxpc2luZyBYZW4gdmlydHVhbCBldGhlcm5ldCBkcml2ZXJcbiIpOwogCisJLyogQWxsb3cgYXMgbWFueSBxdWV1ZXMgYXMgdGhlcmUgYXJlIENQVXMsIGJ5IGRlZmF1bHQgKi8KKwl4ZW5uZXRfbWF4X3F1ZXVlcyA9IG51bV9vbmxpbmVfY3B1cygpOworCiAJcmV0dXJuIHhlbmJ1c19yZWdpc3Rlcl9mcm9udGVuZCgmbmV0ZnJvbnRfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KG5ldGlmX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvS2NvbmZpZyBiL2RyaXZlcnMvbmZjL0tjb25maWcKaW5kZXggNjVkNGNhMS4uMjZjNjZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvS2NvbmZpZworKysgYi9kcml2ZXJzL25mYy9LY29uZmlnCkBAIC03MSw1ICs3MSw2IEBACiBzb3VyY2UgImRyaXZlcnMvbmZjL3BuNTQ0L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmZjL21pY3JvcmVhZC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25mYy9uZmNtcnZsL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmZjL3N0MjFuZmNhL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL01ha2VmaWxlIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKaW5kZXggYWU0MmEzZi4uMjMyMjViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKQEAgLTExLDUgKzExLDYgQEAKIG9iai0kKENPTkZJR19ORkNfUE9SVDEwMCkJKz0gcG9ydDEwMC5vCiBvYmotJChDT05GSUdfTkZDX01SVkwpCQkrPSBuZmNtcnZsLwogb2JqLSQoQ09ORklHX05GQ19UUkY3OTcwQSkJKz0gdHJmNzk3MGEubworb2JqLSQoQ09ORklHX05GQ19TVDIxTkZDQSkgICs9IHN0MjFuZmNhLwogCiBjY2ZsYWdzLSQoQ09ORklHX05GQ19ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG41NDQvaTJjLmMgYi9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYwppbmRleCBmMmFjZDg1Li40NDAyOTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYworKysgYi9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYwpAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC04NTcsNiArODU5LDkyIEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX09GCisKK3N0YXRpYyBpbnQgcG41NDRfaGNpX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBwbjU0NF9pMmNfcGh5ICpwaHkgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwOworCWludCByZXQ7CisKKwlwcCA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJaWYgKCFwcCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kdDsKKwl9CisKKwkvKiBPYnRlbnRpb24gb2YgRU4gR1BJTyBmcm9tIGRldmljZSB0cmVlICovCisJcmV0ID0gb2ZfZ2V0X25hbWVkX2dwaW8ocHAsICJlbmFibGUtZ3Bpb3MiLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGdldCBFTiBncGlvLCBlcnJvcjogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2R0OworCX0KKwlwaHktPmdwaW9fZW4gPSByZXQ7CisKKwkvKiBDb25maWd1cmF0aW9uIG9mIEVOIEdQSU8gKi8KKwlyZXQgPSBncGlvX3JlcXVlc3QocGh5LT5ncGlvX2VuLCAicG41NDRfZW4iKTsKKwlpZiAocmV0KSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbCBFTiBwaW5cbiIpOworCQlnb3RvIGVycl9kdDsKKwl9CisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBoeS0+Z3Bpb19lbiwgMCk7CisJaWYgKHJldCkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkZhaWwgRU4gcGluIGRpcmVjdGlvblxuIik7CisJCWdvdG8gZXJyX2dwaW9fZW47CisJfQorCisJLyogT2J0ZW50aW9uIG9mIEZXIEdQSU8gZnJvbSBkZXZpY2UgdHJlZSAqLworCXJldCA9IG9mX2dldF9uYW1lZF9ncGlvKHBwLCAiZmlybXdhcmUtZ3Bpb3MiLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGdldCBGVyBncGlvLCBlcnJvcjogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2dwaW9fZW47CisJfQorCXBoeS0+Z3Bpb19mdyA9IHJldDsKKworCS8qIENvbmZpZ3VyYXRpb24gb2YgRlcgR1BJTyAqLworCXJldCA9IGdwaW9fcmVxdWVzdChwaHktPmdwaW9fZncsICJwbjU0NF9mdyIpOworCWlmIChyZXQpIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJGYWlsIEZXIHBpblxuIik7CisJCWdvdG8gZXJyX2dwaW9fZW47CisJfQorCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwaHktPmdwaW9fZncsIDApOworCWlmIChyZXQpIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJGYWlsIEZXIHBpbiBkaXJlY3Rpb25cbiIpOworCQlnb3RvIGVycl9ncGlvX2Z3OworCX0KKworCS8qIElSUSAqLworCXJldCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBwLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJVbmFibGUgdG8gZ2V0IGlycSwgZXJyb3I6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9ncGlvX2Z3OworCX0KKwljbGllbnQtPmlycSA9IHJldDsKKworCXJldHVybiAwOworCitlcnJfZ3Bpb19mdzoKKwlncGlvX2ZyZWUocGh5LT5ncGlvX2Z3KTsKK2Vycl9ncGlvX2VuOgorCWdwaW9fZnJlZShwaHktPmdwaW9fZW4pOworZXJyX2R0OgorCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgcG41NDRfaGNpX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAtRU5PREVWOworfQorCisjZW5kaWYKKwogc3RhdGljIGludCBwbjU0NF9oY2lfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtODg3LDI2ICs5NzUsMzcgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwaHkpOwogCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YSA9PSBOVUxMKSB7CisKKwkvKiBObyBwbGF0Zm9ybSBkYXRhLCB1c2luZyBkZXZpY2UgdHJlZS4gKi8KKwlpZiAoIXBkYXRhICYmIGNsaWVudC0+ZGV2Lm9mX25vZGUpIHsKKwkJciA9IHBuNTQ0X2hjaV9pMmNfb2ZfcmVxdWVzdF9yZXNvdXJjZXMoY2xpZW50KTsKKwkJaWYgKHIpIHsKKwkJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiTm8gRFQgZGF0YVxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCS8qIFVzaW5nIHBsYXRmb3JtIGRhdGEuICovCisJfSBlbHNlIGlmIChwZGF0YSkgeworCisJCWlmIChwZGF0YS0+cmVxdWVzdF9yZXNvdXJjZXMgPT0gTlVMTCkgeworCQkJbmZjX2VycigmY2xpZW50LT5kZXYsICJyZXF1ZXN0X3Jlc291cmNlcygpIG1pc3NpbmdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyID0gcGRhdGEtPnJlcXVlc3RfcmVzb3VyY2VzKGNsaWVudCk7CisJCWlmIChyKSB7CisJCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiQ2Fubm90IGdldCBwbGF0Zm9ybSByZXNvdXJjZXNcbiIpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQlwaHktPmdwaW9fZW4gPSBwZGF0YS0+Z2V0X2dwaW8oTkZDX0dQSU9fRU5BQkxFKTsKKwkJcGh5LT5ncGlvX2Z3ID0gcGRhdGEtPmdldF9ncGlvKE5GQ19HUElPX0ZXX1JFU0VUKTsKKwkJcGh5LT5ncGlvX2lycSA9IHBkYXRhLT5nZXRfZ3BpbyhORkNfR1BJT19JUlEpOworCX0gZWxzZSB7CiAJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwZGF0YS0+cmVxdWVzdF9yZXNvdXJjZXMgPT0gTlVMTCkgewotCQluZmNfZXJyKCZjbGllbnQtPmRldiwgInJlcXVlc3RfcmVzb3VyY2VzKCkgbWlzc2luZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXIgPSBwZGF0YS0+cmVxdWVzdF9yZXNvdXJjZXMoY2xpZW50KTsKLQlpZiAocikgewotCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkNhbm5vdCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JcGh5LT5ncGlvX2VuID0gcGRhdGEtPmdldF9ncGlvKE5GQ19HUElPX0VOQUJMRSk7Ci0JcGh5LT5ncGlvX2Z3ID0gcGRhdGEtPmdldF9ncGlvKE5GQ19HUElPX0ZXX1JFU0VUKTsKLQlwaHktPmdwaW9faXJxID0gcGRhdGEtPmdldF9ncGlvKE5GQ19HUElPX0lSUSk7Ci0KIAlwbjU0NF9oY2lfaTJjX3BsYXRmb3JtX2luaXQocGh5KTsKIAogCXIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgcG41NDRfaGNpX2kyY19pcnFfdGhyZWFkX2ZuLApAQCAtOTMwLDggKzEwMjksMTIgQEAKIAlmcmVlX2lycShjbGllbnQtPmlycSwgcGh5KTsKIAogZXJyX3J0aToKLQlpZiAocGRhdGEtPmZyZWVfcmVzb3VyY2VzICE9IE5VTEwpCisJaWYgKCFwZGF0YSkgeworCQlncGlvX2ZyZWUocGh5LT5ncGlvX2VuKTsKKwkJZ3Bpb19mcmVlKHBoeS0+Z3Bpb19mdyk7CisJfSBlbHNlIGlmIChwZGF0YS0+ZnJlZV9yZXNvdXJjZXMpIHsKIAkJcGRhdGEtPmZyZWVfcmVzb3VyY2VzKCk7CisJfQogCiAJcmV0dXJuIHI7CiB9CkBAIC05NTMsMTUgKzEwNTYsMzAgQEAKIAkJcG41NDRfaGNpX2kyY19kaXNhYmxlKHBoeSk7CiAKIAlmcmVlX2lycShjbGllbnQtPmlycSwgcGh5KTsKLQlpZiAocGRhdGEtPmZyZWVfcmVzb3VyY2VzKQorCisJLyogTm8gcGxhdGZvcm0gZGF0YSwgR1BJT3MgaGF2ZSBiZWVuIHJlcXVlc3RlZCBieSB0aGlzIGRyaXZlciAqLworCWlmICghcGRhdGEpIHsKKwkJZ3Bpb19mcmVlKHBoeS0+Z3Bpb19lbik7CisJCWdwaW9fZnJlZShwaHktPmdwaW9fZncpOworCS8qIFVzaW5nIHBsYXRmb3JtIGRhdGEgKi8KKwl9IGVsc2UgaWYgKHBkYXRhLT5mcmVlX3Jlc291cmNlcykgewogCQlwZGF0YS0+ZnJlZV9yZXNvdXJjZXMoKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfcG41NDRfaTJjX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJueHAscG41NDQtaTJjIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9wbjU0NF9pMmNfbWF0Y2gpOworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcG41NDRfaGNpX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJICAgLm5hbWUgPSBQTjU0NF9IQ0lfSTJDX0RSSVZFUl9OQU1FLAorCQkgICAub3duZXIgID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9wbjU0NF9pMmNfbWF0Y2gpLAogCQkgIH0sCiAJLnByb2JlID0gcG41NDRfaGNpX2kyY19wcm9iZSwKIAkuaWRfdGFibGUgPSBwbjU0NF9oY2lfaTJjX2lkX3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG9ydDEwMC5jIGIvZHJpdmVycy9uZmMvcG9ydDEwMC5jCmluZGV4IGI3YTM3MmEuLjRhYzRkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL3BvcnQxMDAuYworKysgYi9kcml2ZXJzL25mYy9wb3J0MTAwLmMKQEAgLTI4LDcgKzI4LDggQEAKIAkJCSAgIE5GQ19QUk9UT19NSUZBUkVfTUFTSyAgIHwgXAogCQkJICAgTkZDX1BST1RPX0ZFTElDQV9NQVNLICAgfCBcCiAJCQkgICBORkNfUFJPVE9fTkZDX0RFUF9NQVNLICB8IFwKLQkJCSAgIE5GQ19QUk9UT19JU08xNDQ0M19NQVNLKQorCQkJICAgTkZDX1BST1RPX0lTTzE0NDQzX01BU0sgfCBcCisJCQkgICBORkNfUFJPVE9fSVNPMTQ0NDNfQl9NQVNLKQogCiAjZGVmaW5lIFBPUlQxMDBfQ0FQQUJJTElUSUVTIChORkNfRElHSVRBTF9EUlZfQ0FQU19JTl9DUkMgfCBcCiAJCQkgICAgICBORkNfRElHSVRBTF9EUlZfQ0FQU19UR19DUkMpCkBAIC0xMjAsNiArMTIxLDcgQEAKICNkZWZpbmUgUE9SVDEwMF9DT01NX1RZUEVfSU5fMjEyRiAweDAxCiAjZGVmaW5lIFBPUlQxMDBfQ09NTV9UWVBFX0lOXzQyNEYgMHgwMgogI2RlZmluZSBQT1JUMTAwX0NPTU1fVFlQRV9JTl8xMDZBIDB4MDMKKyNkZWZpbmUgUE9SVDEwMF9DT01NX1RZUEVfSU5fMTA2QiAweDA3CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcG9ydDEwMF9pbl9yZl9zZXR0aW5nIGluX3JmX3NldHRpbmdzW10gPSB7CiAJW05GQ19ESUdJVEFMX1JGX1RFQ0hfMjEyRl0gPSB7CkBAIC0xNDAsNiArMTQyLDEyIEBACiAJCS5pbl9yZWN2X3NldF9udW1iZXIgPSAxNSwKIAkJLmluX3JlY3ZfY29tbV90eXBlICA9IFBPUlQxMDBfQ09NTV9UWVBFX0lOXzEwNkEsCiAJfSwKKwlbTkZDX0RJR0lUQUxfUkZfVEVDSF8xMDZCXSA9IHsKKwkJLmluX3NlbmRfc2V0X251bWJlciA9IDMsCisJCS5pbl9zZW5kX2NvbW1fdHlwZSAgPSBQT1JUMTAwX0NPTU1fVFlQRV9JTl8xMDZCLAorCQkuaW5fcmVjdl9zZXRfbnVtYmVyID0gMTUsCisJCS5pbl9yZWN2X2NvbW1fdHlwZSAgPSBQT1JUMTAwX0NPTU1fVFlQRV9JTl8xMDZCLAorCX0sCiAJLyogRW5zdXJlcyB0aGUgYXJyYXkgaGFzIE5GQ19ESUdJVEFMX1JGX1RFQ0hfTEFTVCBlbGVtZW50cyAqLwogCVtORkNfRElHSVRBTF9SRl9URUNIX0xBU1RdID0geyAwIH0sCiB9OwpAQCAtMzQwLDYgKzM0OCwzMiBAQAogCVtORkNfRElHSVRBTF9GUkFNSU5HX05GQ19ERVBfQUNUSVZBVEVEXSA9IHsKIAkJeyBQT1JUMTAwX0lOX1BST1RfRU5ELCAwIH0sCiAJfSwKKwlbTkZDX0RJR0lUQUxfRlJBTUlOR19ORkNCXSA9IHsKKwkJeyBQT1JUMTAwX0lOX1BST1RfSU5JVElBTF9HVUFSRF9USU1FLCAgICAgMjAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQUREX0NSQywgICAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ0hFQ0tfQ1JDLCAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfTVVMVElfQ0FSRCwgICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQUREX1BBUklUWSwgICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ0hFQ0tfUEFSSVRZLCAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQklUV0lTRV9BQ19SRUNWX01PREUsICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfVkFMSURfQklUX05VTUJFUiwgICAgICAgIDggfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ1JZUFRPMSwgICAgICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQUREX1NPRiwgICAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ0hFQ0tfU09GLCAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQUREX0VPRiwgICAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ0hFQ0tfRU9GLCAgICAgICAgICAgICAgIDEgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfREVBRl9USU1FLCAgICAgICAgICAgICAgIDQgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ1JNLCAgICAgICAgICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfQ1JNX01JTl9MRU4sICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfVDFfVEFHX0ZSQU1FLCAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfUkZDQSwgICAgICAgICAgICAgICAgICAgIDAgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfR1VBUkRfVElNRV9BVF9JTklUSUFUT1IsIDYgfSwKKwkJeyBQT1JUMTAwX0lOX1BST1RfRU5ELCAgICAgICAgICAgICAgICAgICAgIDAgfSwKKwl9LAorCVtORkNfRElHSVRBTF9GUkFNSU5HX05GQ0JfVDRUXSA9IHsKKwkJLyogbmZjX2RpZ2l0YWxfZnJhbWluZ19uZmNiICovCisJCXsgUE9SVDEwMF9JTl9QUk9UX0VORCwgICAgICAgICAgICAgICAgICAgICAwIH0sCisJfSwKIAkvKiBFbnN1cmVzIHRoZSBhcnJheSBoYXMgTkZDX0RJR0lUQUxfRlJBTUlOR19MQVNUIGVsZW1lbnRzICovCiAJW05GQ19ESUdJVEFMX0ZSQU1JTkdfTEFTVF0gPSB7CiAJCXsgUE9SVDEwMF9JTl9QUk9UX0VORCwgMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvc3QyMW5mY2EvS2NvbmZpZyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0NTlmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL0tjb25maWcKQEAgLTAsMCArMSwyMyBAQAorY29uZmlnIE5GQ19TVDIxTkZDQQorCXRyaXN0YXRlICJTVE1pY3JvZWxlY3Ryb25pY3MgU1QyMU5GQ0EgTkZDIGRyaXZlciIKKwlkZXBlbmRzIG9uIE5GQ19IQ0kKKwlzZWxlY3QgQ1JDX0NDSVRUCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgU1RNaWNyb2VsZWN0cm9uaWNzIFNUMjFORkNBIGNvcmUgZHJpdmVyLiBJdCBpbXBsZW1lbnRzIHRoZSBjaGlwc2V0CisJICBIQ0kgbG9naWMgYW5kIGhvb2tzIGludG8gdGhlIE5GQyBrZXJuZWwgQVBJcy4gUGh5c2ljYWwgbGF5ZXJzIHdpbGwKKwkgIHJlZ2lzdGVyIGFnYWluc3QgaXQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBtIGhlcmUuIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHN0MjFuZmNhLgorCSAgU2F5IE4gaWYgdW5zdXJlLgorCitjb25maWcgTkZDX1NUMjFORkNBX0kyQworCXRyaXN0YXRlICJORkMgU1QyMU5GQ0EgaTJjIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORkNfU1QyMU5GQ0EgJiYgSTJDICYmIE5GQ19TSERMQworCS0tLWhlbHAtLS0KKwkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgdGhlIFNUTWljcm9lbGVjdHJvbmljcyBzdDIxbmZjYSBpMmMgaW50ZXJmYWNlLgorCSAgU2VsZWN0IHRoaXMgaWYgeW91ciBwbGF0Zm9ybSBpcyB1c2luZyB0aGUgaTJjIGJ1cy4KKworCSAgSWYgeW91IGNob29zZSB0byBidWlsZCBhIG1vZHVsZSwgaXQnbGwgYmUgY2FsbGVkIHN0MjFuZmNhX2kyYy4KKwkgIFNheSBOIGlmIHVuc3VyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3N0MjFuZmNhL01ha2VmaWxlIGIvZHJpdmVycy9uZmMvc3QyMW5mY2EvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZWQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgU1QyMU5GQ0EgSENJIGJhc2VkIE5GQyBkcml2ZXIKKyMKKworc3QyMW5mY2FfaTJjLW9ianMgID0gaTJjLm8KKworb2JqLSQoQ09ORklHX05GQ19TVDIxTkZDQSkgICAgICs9IHN0MjFuZmNhLm8KK29iai0kKENPTkZJR19ORkNfU1QyMU5GQ0FfSTJDKSArPSBzdDIxbmZjYV9pMmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvc3QyMW5mY2EvaTJjLmMgYi9kcml2ZXJzL25mYy9zdDIxbmZjYS9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk1NGVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZmMvc3QyMW5mY2EvaTJjLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisgKiBJMkMgTGluayBMYXllciBmb3IgU1QyMU5GQ0EgSENJIGJhc2VkIERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDE0ICBTVE1pY3JvZWxlY3Ryb25pY3MgU0FTLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9hY2Nlc3Nfb2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3N0MjFuZmNhLmg+CisKKyNpbmNsdWRlIDxuZXQvbmZjL2hjaS5oPgorI2luY2x1ZGUgPG5ldC9uZmMvbGxjLmg+CisjaW5jbHVkZSA8bmV0L25mYy9uZmMuaD4KKworI2luY2x1ZGUgInN0MjFuZmNhLmgiCisKKy8qCisgKiBFdmVyeSBmcmFtZSBzdGFydHMgd2l0aCBTVDIxTkZDQV9TT0ZfRU9GIGFuZCBlbmRzIHdpdGggU1QyMU5GQ0FfU09GX0VPRi4KKyAqIEJlY2F1c2UgU1QyMU5GQ0FfU09GX0VPRiBpcyBhIHBvc3NpYmxlIGRhdGEgdmFsdWUsIHRoZXJlIGlzIGEgbWVjYW5pc20KKyAqIGNhbGxlZCBieXRlIHN0dWZmaW5nIGhhcyBiZWVuIGludHJvZHVjZWQuCisgKgorICogaWYgYnl0ZSA9PSBTVDIxTkZDQV9TT0ZfRU9GIG9yIFNUMjFORkNBX0VTQ0FQRV9CWVRFX1NUVUZGSU5HCisgKiAtIGluc2VydCBTVDIxTkZDQV9FU0NBUEVfQllURV9TVFVGRklORyAoZXNjYXBlIGJ5dGUpCisgKiAtIHhvciBieXRlIHdpdGggU1QyMU5GQ0FfQllURV9TVFVGRklOR19NQVNLCisgKi8KKyNkZWZpbmUgU1QyMU5GQ0FfU09GX0VPRgkJMHg3ZQorI2RlZmluZSBTVDIxTkZDQV9CWVRFX1NUVUZGSU5HX01BU0sJMHgyMAorI2RlZmluZSBTVDIxTkZDQV9FU0NBUEVfQllURV9TVFVGRklORwkweDdkCisKKy8qIFNPRiArIDAwICovCisjZGVmaW5lIFNUMjFORkNBX0ZSQU1FX0hFQURST09NCQkJMgorCisvKiAyIGJ5dGVzIGNyYyArIEVPRiAqLworI2RlZmluZSBTVDIxTkZDQV9GUkFNRV9UQUlMUk9PTSAzCisjZGVmaW5lIElTX1NUQVJUX09GX0ZSQU1FKGJ1ZikgKGJ1ZlswXSA9PSBTVDIxTkZDQV9TT0ZfRU9GICYmIFwKKwkJCQlidWZbMV0gPT0gMCkKKworI2RlZmluZSBTVDIxTkZDQV9IQ0lfSTJDX0RSSVZFUl9OQU1FICJzdDIxbmZjYV9oY2lfaTJjIgorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgc3QyMW5mY2FfaGNpX2kyY19pZF90YWJsZVtdID0geworCXtTVDIxTkZDQV9IQ0lfRFJJVkVSX05BTUUsIDB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3QyMW5mY2FfaGNpX2kyY19pZF90YWJsZSk7CisKK3N0cnVjdCBzdDIxbmZjYV9pMmNfcGh5IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2RldjsKKwlzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXY7CisKKwl1bnNpZ25lZCBpbnQgZ3Bpb19lbmE7CisJdW5zaWduZWQgaW50IGdwaW9faXJxOworCXVuc2lnbmVkIGludCBpcnFfcG9sYXJpdHk7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CisJaW50IGN1cnJlbnRfcmVhZF9sZW47CisJLyoKKwkgKiBjcmMgbWlnaHQgaGF2ZSBmYWlsIGJlY2F1c2UgaTJjIG1hY3JvCisJICogaXMgZGlzYWJsZSBkdWUgdG8gb3RoZXIgaW50ZXJmYWNlIGFjdGl2aXR5CisJICovCisJaW50IGNyY190cmlhbHM7CisKKwlpbnQgcG93ZXJlZDsKKwlpbnQgcnVuX21vZGU7CisKKwkvKgorCSAqIDwgMCBpZiBoYXJkd2FyZSBlcnJvciBvY2N1cmVkIChlLmcuIGkyYyBlcnIpCisJICogYW5kIHByZXZlbnRzIG5vcm1hbCBvcGVyYXRpb24uCisJICovCisJaW50IGhhcmRfZmF1bHQ7CisJc3RydWN0IG11dGV4IHBoeV9sb2NrOworfTsKK3N0YXRpYyB1OCBsZW5fc2VxW10gPSB7IDEzLCAyNCwgMTUsIDI5IH07CitzdGF0aWMgdTE2IHdhaXRfdGFiW10gPSB7IDIsIDMsIDUsIDE1LCAyMCwgNDB9OworCisjZGVmaW5lIEkyQ19EVU1QX1NLQihpbmZvLCBza2IpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJcHJfZGVidWcoIiVzOlxuIiwgaW5mbyk7CQkJCVwKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiaTJjOiAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCVwKKwkJICAgICAgIDE2LCAxLCAoc2tiKS0+ZGF0YSwgKHNrYiktPmxlbiwgMCk7CVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBJbiBvcmRlciB0byBnZXQgdGhlIENMRiBpbiBhIGtub3duIHN0YXRlIHdlIGdlbmVyYXRlIGFuIGludGVybmFsIHJlYm9vdAorICogdXNpbmcgYSBwcm9wcmlldGFyeSBjb21tYW5kLgorICogT25jZSB0aGUgcmVib290IGlzIGNvbXBsZXRlZCwgd2UgZXhwZWN0IHRvIHJlY2VpdmUgYSBTVDIxTkZDQV9TT0ZfRU9GCisgKiBmaWxsIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBzdDIxbmZjYV9oY2lfcGxhdGZvcm1faW5pdChzdHJ1Y3Qgc3QyMW5mY2FfaTJjX3BoeSAqcGh5KQoreworCXUxNiB3YWl0X3JlYm9vdFtdID0geyA1MCwgMzAwLCAxMDAwIH07CisJY2hhciByZWJvb3RfY21kW10gPSB7IDB4N0UsIDB4NjYsIDB4NDgsIDB4RjYsIDB4N0UgfTsKKwl1OCB0bXBbU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRV07CisJaW50IGksIHIgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdhaXRfcmVib290KSAmJiByIDwgMDsgaSsrKSB7CisJCXIgPSBpMmNfbWFzdGVyX3NlbmQocGh5LT5pMmNfZGV2LCByZWJvb3RfY21kLAorCQkJCSAgICBzaXplb2YocmVib290X2NtZCkpOworCQlpZiAociA8IDApCisJCQltc2xlZXAod2FpdF9yZWJvb3RbaV0pOworCX0KKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJLyogQ0xGIGlzIHNwZW5kaW5nIGFib3V0IDIwbXMgdG8gZG8gYW4gaW50ZXJuYWwgcmVib290ICovCisJbXNsZWVwKDIwKTsKKwlyID0gLTE7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2FpdF9yZWJvb3QpICYmIHIgPCAwOyBpKyspIHsKKwkJciA9IGkyY19tYXN0ZXJfcmVjdihwaHktPmkyY19kZXYsIHRtcCwKKwkJCQkgICAgU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRSk7CisJCWlmIChyIDwgMCkKKwkJCW1zbGVlcCh3YWl0X3JlYm9vdFtpXSk7CisJfQorCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRSAmJgorCQl0bXBbaV0gPT0gU1QyMU5GQ0FfU09GX0VPRjsgaSsrKQorCQk7CisKKwlpZiAociAhPSBTVDIxTkZDQV9IQ0lfTExDX01BWF9TSVpFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdDIxbmZjYV9oY2lfaTJjX2VuYWJsZSh2b2lkICpwaHlfaWQpCit7CisJc3RydWN0IHN0MjFuZmNhX2kyY19waHkgKnBoeSA9IHBoeV9pZDsKKworCWdwaW9fc2V0X3ZhbHVlKHBoeS0+Z3Bpb19lbmEsIDEpOworCXBoeS0+cG93ZXJlZCA9IDE7CisJcGh5LT5ydW5fbW9kZSA9IFNUMjFORkNBX0hDSV9NT0RFOworCisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3QyMW5mY2FfaGNpX2kyY19kaXNhYmxlKHZvaWQgKnBoeV9pZCkKK3sKKwlzdHJ1Y3Qgc3QyMW5mY2FfaTJjX3BoeSAqcGh5ID0gcGh5X2lkOworCisJcHJfaW5mbygiXG4iKTsKKwlncGlvX3NldF92YWx1ZShwaHktPmdwaW9fZW5hLCAwKTsKKworCXBoeS0+cG93ZXJlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0MjFuZmNhX2hjaV9hZGRfbGVuX2NyYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiBjcmM7CisJdTggdG1wOworCisJKnNrYl9wdXNoKHNrYiwgMSkgPSAwOworCisJY3JjID0gY3JjX2NjaXR0KDB4ZmZmZiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJY3JjID0gfmNyYzsKKworCXRtcCA9IGNyYyAmIDB4MDBmZjsKKwkqc2tiX3B1dChza2IsIDEpID0gdG1wOworCisJdG1wID0gKGNyYyA+PiA4KSAmIDB4MDBmZjsKKwkqc2tiX3B1dChza2IsIDEpID0gdG1wOworfQorCitzdGF0aWMgdm9pZCBzdDIxbmZjYV9oY2lfcmVtb3ZlX2xlbl9jcmMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2JfcHVsbChza2IsIFNUMjFORkNBX0ZSQU1FX0hFQURST09NKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gU1QyMU5GQ0FfRlJBTUVfVEFJTFJPT00pOworfQorCisvKgorICogV3JpdGluZyBhIGZyYW1lIG11c3Qgbm90IHJldHVybiB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCisgKiBJdCBtdXN0IHJldHVybiBlaXRoZXIgemVybyBmb3Igc3VjY2Vzcywgb3IgPDAgZm9yIGVycm9yLgorICogSW4gYWRkaXRpb24sIGl0IG11c3Qgbm90IGFsdGVyIHRoZSBza2IKKyAqLworc3RhdGljIGludCBzdDIxbmZjYV9oY2lfaTJjX3dyaXRlKHZvaWQgKnBoeV9pZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgciA9IC0xLCBpLCBqOworCXN0cnVjdCBzdDIxbmZjYV9pMmNfcGh5ICpwaHkgPSBwaHlfaWQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHBoeS0+aTJjX2RldjsKKwl1OCB0bXBbU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRSAqIDJdOworCisJSTJDX0RVTVBfU0tCKCJzdDIxbmZjYV9oY2lfaTJjX3dyaXRlIiwgc2tiKTsKKworCisJaWYgKHBoeS0+aGFyZF9mYXVsdCAhPSAwKQorCQlyZXR1cm4gcGh5LT5oYXJkX2ZhdWx0OworCisJLyoKKwkgKiBDb21wdXRlIENSQyBiZWZvcmUgYnl0ZSBzdHVmZmluZyBjb21wdXRhdGlvbiBvbiBmcmFtZQorCSAqIE5vdGUgc3QyMW5mY2FfaGNpX2FkZF9sZW5fY3JjIGlzIGRvaW5nIGEgYnl0ZSBzdHVmZmluZworCSAqIG9uIGl0cyBvd24gdmFsdWUKKwkgKi8KKwlzdDIxbmZjYV9oY2lfYWRkX2xlbl9jcmMoc2tiKTsKKworCS8qIGFkZCBTVDIxTkZDQV9TT0ZfRU9GIG9uIHRhaWwgKi8KKwkqc2tiX3B1dChza2IsIDEpID0gU1QyMU5GQ0FfU09GX0VPRjsKKwkvKiBhZGQgU1QyMU5GQ0FfU09GX0VPRiBvbiBoZWFkICovCisJKnNrYl9wdXNoKHNrYiwgMSkgPSBTVDIxTkZDQV9TT0ZfRU9GOworCisJLyoKKwkgKiBDb21wdXRlIGJ5dGUgc3R1ZmZpbmcKKwkgKiBpZiBieXRlID09IFNUMjFORkNBX1NPRl9FT0Ygb3IgU1QyMU5GQ0FfRVNDQVBFX0JZVEVfU1RVRkZJTkcKKwkgKiBpbnNlcnQgU1QyMU5GQ0FfRVNDQVBFX0JZVEVfU1RVRkZJTkcgKGVzY2FwZSBieXRlKQorCSAqIHhvciBieXRlIHdpdGggU1QyMU5GQ0FfQllURV9TVFVGRklOR19NQVNLCisJICovCisJdG1wWzBdID0gc2tiLT5kYXRhWzBdOworCWZvciAoaSA9IDEsIGogPSAxOyBpIDwgc2tiLT5sZW4gLSAxOyBpKyssIGorKykgeworCQlpZiAoc2tiLT5kYXRhW2ldID09IFNUMjFORkNBX1NPRl9FT0YKKwkJICAgIHx8IHNrYi0+ZGF0YVtpXSA9PSBTVDIxTkZDQV9FU0NBUEVfQllURV9TVFVGRklORykgeworCQkJdG1wW2pdID0gU1QyMU5GQ0FfRVNDQVBFX0JZVEVfU1RVRkZJTkc7CisJCQlqKys7CisJCQl0bXBbal0gPSBza2ItPmRhdGFbaV0gXiBTVDIxTkZDQV9CWVRFX1NUVUZGSU5HX01BU0s7CisJCX0gZWxzZSB7CisJCQl0bXBbal0gPSBza2ItPmRhdGFbaV07CisJCX0KKwl9CisJdG1wW2pdID0gc2tiLT5kYXRhW2ldOworCWorKzsKKworCS8qCisJICogTWFuYWdlIHNsZWVwIG1vZGUKKwkgKiBUcnkgMyB0aW1lcyB0byBzZW5kIGRhdGEgd2l0aCBkZWxheSBiZXR3ZWVuIGVhY2gKKwkgKi8KKwltdXRleF9sb2NrKCZwaHktPnBoeV9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3YWl0X3RhYikgJiYgciA8IDA7IGkrKykgeworCQlyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdG1wLCBqKTsKKwkJaWYgKHIgPCAwKQorCQkJbXNsZWVwKHdhaXRfdGFiW2ldKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwaHktPnBoeV9sb2NrKTsKKworCWlmIChyID49IDApIHsKKwkJaWYgKHIgIT0gaikKKwkJCXIgPSAtRVJFTU9URUlPOworCQllbHNlCisJCQlyID0gMDsKKwl9CisKKwlzdDIxbmZjYV9oY2lfcmVtb3ZlX2xlbl9jcmMoc2tiKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGdldF9mcmFtZV9zaXplKHU4ICpidWYsIGludCBidWZsZW4pCit7CisJaW50IGxlbiA9IDA7CisJaWYgKGJ1ZltsZW4gKyAxXSA9PSBTVDIxTkZDQV9TT0ZfRU9GKQorCQlyZXR1cm4gMDsKKworCWZvciAobGVuID0gMTsgbGVuIDwgYnVmbGVuICYmIGJ1ZltsZW5dICE9IFNUMjFORkNBX1NPRl9FT0Y7IGxlbisrKQorCQk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGNoZWNrX2NyYyh1OCAqYnVmLCBpbnQgYnVmbGVuKQoreworCXUxNiBjcmM7CisKKwljcmMgPSBjcmNfY2NpdHQoMHhmZmZmLCBidWYsIGJ1ZmxlbiAtIDIpOworCWNyYyA9IH5jcmM7CisKKwlpZiAoYnVmW2J1ZmxlbiAtIDJdICE9IChjcmMgJiAweGZmKSB8fCBidWZbYnVmbGVuIC0gMV0gIT0gKGNyYyA+PiA4KSkgeworCQlwcl9lcnIoU1QyMU5GQ0FfSENJX0RSSVZFUl9OQU1FCisJCSAgICAgICAiOiBDUkMgZXJyb3IgMHgleCAhPSAweCV4IDB4JXhcbiIsIGNyYywgYnVmW2J1ZmxlbiAtIDFdLAorCQkgICAgICAgYnVmW2J1ZmxlbiAtIDJdKTsKKworCQlwcl9pbmZvKERSSVZFUl9ERVNDICI6ICVzIDogQkFEIENSQ1xuIiwgX19mdW5jX18pOworCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiY3JjOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJICAgICAgIDE2LCAyLCBidWYsIGJ1ZmxlbiwgZmFsc2UpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByZXBhcmUgcmVjZWl2ZWQgZGF0YSBmb3IgdXBwZXIgbGF5ZXIuCisgKiBSZWNlaXZlZCBkYXRhIGluY2x1ZGUgYnl0ZSBzdHVmZmluZywgY3JjIGFuZCBzb2YvZW9mCisgKiB3aGljaCBpcyBub3QgdXNhYmxlIGJ5IGhjaSBwYXJ0LgorICogcmV0dXJuczoKKyAqIGZyYW1lIHNpemUgd2l0aG91dCBzb2YvZW9mLCBoZWFkZXIgYW5kIGJ5dGUgc3R1ZmZpbmcKKyAqIC1FQkFETVNHIDogZnJhbWUgd2FzIGluY29ycmVjdCBhbmQgZGlzY2FyZGVkCisgKi8KK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX2kyY19yZXBhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaSwgaiwgciwgc2l6ZTsKKwlpZiAoc2tiLT5sZW4gPCAxIHx8IChza2ItPmxlbiA+IDEgJiYgc2tiLT5kYXRhWzFdICE9IDApKQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwlzaXplID0gZ2V0X2ZyYW1lX3NpemUoc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKHNpemUgPiAwKSB7CisJCXNrYl90cmltKHNrYiwgc2l6ZSk7CisJCS8qIHJlbW92ZSBTVDIxTkZDQSBieXRlIHN0dWZmaW5nIGZvciB1cHBlciBsYXllciAqLworCQlmb3IgKGkgPSAxLCBqID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspIHsKKwkJCWlmIChza2ItPmRhdGFbaSArIGpdID09CisJCQkJCSh1OCkgU1QyMU5GQ0FfRVNDQVBFX0JZVEVfU1RVRkZJTkcpIHsKKwkJCQlza2ItPmRhdGFbaV0gPSBza2ItPmRhdGFbaSArIGogKyAxXQorCQkJCQkJfCBTVDIxTkZDQV9CWVRFX1NUVUZGSU5HX01BU0s7CisJCQkJaSsrOworCQkJCWorKzsKKwkJCX0KKwkJCXNrYi0+ZGF0YVtpXSA9IHNrYi0+ZGF0YVtpICsgal07CisJCX0KKwkJLyogcmVtb3ZlIGJ5dGUgc3R1ZmZpbmcgdXNlbGVzcyBieXRlICovCisJCXNrYl90cmltKHNrYiwgaSAtIGopOworCQkvKiByZW1vdmUgU1QyMU5GQ0FfU09GX0VPRiBmcm9tIGhlYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCAxKTsKKworCQlyID0gY2hlY2tfY3JjKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlpZiAociAhPSAwKSB7CisJCQlpID0gMDsKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJfQorCisJCS8qIHJlbW92ZSBoZWFkYnl0ZSAqLworCQlza2JfcHVsbChza2IsIDEpOworCQkvKiByZW1vdmUgY3JjLiBCeXRlIFN0dWZmaW5nIGlzIGFscmVhZHkgcmVtb3ZlZCBoZXJlICovCisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAyKTsKKwkJcmV0dXJuIHNrYi0+bGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRzIGFuIHNoZGxjIGZyYW1lIGFuZCByZXR1cm5zIGl0IGluIGEgbmV3bHkgYWxsb2NhdGVkIHNrX2J1ZmYuIEd1YXJhbnRlZXMKKyAqIHRoYXQgaTJjIGJ1cyB3aWxsIGJlIGZsdXNoZWQgYW5kIHRoYXQgbmV4dCByZWFkIHdpbGwgc3RhcnQgb24gYSBuZXcgZnJhbWUuCisgKiByZXR1cm5lZCBza2IgY29udGFpbnMgb25seSBMTEMgaGVhZGVyIGFuZCBwYXlsb2FkLgorICogcmV0dXJuczoKKyAqIGZyYW1lIHNpemUgOiBpZiByZWNlaXZlZCBmcmFtZSBpcyBjb21wbGV0ZSAoZmluZCBTVDIxTkZDQV9TT0ZfRU9GIGF0CisgKiBlbmQgb2YgcmVhZCkKKyAqIC1FQUdBSU4gOiBpZiByZWNlaXZlZCBmcmFtZSBpcyBpbmNvbXBsZXRlIChub3QgZmluZCBTVDIxTkZDQV9TT0ZfRU9GCisgKiBhdCBlbmQgb2YgcmVhZCkKKyAqIC1FUkVNT1RFSU8gOiBpMmMgcmVhZCBlcnJvciAoZmF0YWwpCisgKiAtRUJBRE1TRyA6IGZyYW1lIHdhcyBpbmNvcnJlY3QgYW5kIGRpc2NhcmRlZAorICogKHZhbHVlIHJldHVybmVkIGZyb20gc3QyMW5mY2FfaGNpX2kyY19yZXBhY2spCisgKiAtRUlPIDogaWYgbm8gU1QyMU5GQ0FfU09GX0VPRiBpcyBmb3VuZCBhZnRlciByZWFjaGluZworICogdGhlIHJlYWQgbGVuZ3RoIGVuZCBzZXF1ZW5jZQorICovCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9pMmNfcmVhZChzdHJ1Y3Qgc3QyMW5mY2FfaTJjX3BoeSAqcGh5LAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByLCBpOworCXU4IGxlbjsKKwl1OCBidWZbU1QyMU5GQ0FfSENJX0xMQ19NQVhfUEFZTE9BRF07CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHBoeS0+aTJjX2RldjsKKworCWlmIChwaHktPmN1cnJlbnRfcmVhZF9sZW4gPCBBUlJBWV9TSVpFKGxlbl9zZXEpKSB7CisJCWxlbiA9IGxlbl9zZXFbcGh5LT5jdXJyZW50X3JlYWRfbGVuXTsKKworCQkvKgorCQkgKiBBZGQgcmV0cnkgbWVjYW5pc20KKwkJICogT3BlcmF0aW9uIG9uIEkyQyBpbnRlcmZhY2UgbWF5IGZhaWwgaW4gY2FzZSBvZiBvcGVyYXRpb24gb24KKwkJICogUkYgb3IgU1dQIGludGVyZmFjZQorCQkgKi8KKwkJciA9IDA7CisJCW11dGV4X2xvY2soJnBoeS0+cGh5X2xvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3YWl0X3RhYikgJiYgciA8PSAwOyBpKyspIHsKKwkJCXIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIGxlbik7CisJCQlpZiAociA8IDApCisJCQkJbXNsZWVwKHdhaXRfdGFiW2ldKTsKKwkJfQorCQltdXRleF91bmxvY2soJnBoeS0+cGh5X2xvY2spOworCisJCWlmIChyICE9IGxlbikgeworCQkJcGh5LT5jdXJyZW50X3JlYWRfbGVuID0gMDsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisKKwkJLyoKKwkJICogVGhlIGZpcnN0IHJlYWQgc2VxdWVuY2UgZG9lcyBub3Qgc3RhcnQgd2l0aCBTT0YuCisJCSAqIERhdGEgaXMgY29ycnVwZXRlZCBzbyB3ZSBkcm9wIGl0LgorCQkgKi8KKwkJaWYgKCFwaHktPmN1cnJlbnRfcmVhZF9sZW4gJiYgYnVmWzBdICE9IFNUMjFORkNBX1NPRl9FT0YpIHsKKwkJCXNrYl90cmltKHNrYiwgMCk7CisJCQlwaHktPmN1cnJlbnRfcmVhZF9sZW4gPSAwOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAocGh5LT5jdXJyZW50X3JlYWRfbGVuICYmCisJCQlJU19TVEFSVF9PRl9GUkFNRShidWYpKSB7CisJCQkvKgorCQkJICogUHJldmlvdXMgZnJhbWUgdHJhbnNtaXNzaW9uIHdhcyBpbnRlcnJ1cHRlZCBhbmQKKwkJCSAqIHRoZSBmcmFtZSBnb3QgcmVwZWF0ZWQuCisJCQkgKiBSZWNlaXZlZCBmcmFtZSBzdGFydCB3aXRoIFNUMjFORkNBX1NPRl9FT0YgKyAwMC4KKwkJCSAqLworCQkJc2tiX3RyaW0oc2tiLCAwKTsKKwkJCXBoeS0+Y3VycmVudF9yZWFkX2xlbiA9IDA7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKKworCQlpZiAoc2tiLT5kYXRhW3NrYi0+bGVuIC0gMV0gPT0gU1QyMU5GQ0FfU09GX0VPRikgeworCQkJcGh5LT5jdXJyZW50X3JlYWRfbGVuID0gMDsKKwkJCXJldHVybiBzdDIxbmZjYV9oY2lfaTJjX3JlcGFjayhza2IpOworCQl9CisJCXBoeS0+Y3VycmVudF9yZWFkX2xlbisrOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBSZWFkcyBhbiBzaGRsYyBmcmFtZSBmcm9tIHRoZSBjaGlwLiBUaGlzIGlzIG5vdCBhcyBzdHJhaWdodGZvcndhcmQgYXMgaXQKKyAqIHNlZW1zLiBUaGUgZnJhbWUgZm9ybWF0IGlzIGRhdGEtY3JjLCBhbmQgY29ycnVwdGlvbiBjYW4gb2NjdXIgYW55d2hlcmUKKyAqIHdoaWxlIHRyYW5zaXRpbmcgb24gaTJjIGJ1cywgc3VjaCB0aGF0IHdlIGNvdWxkIHJlYWQgYW4gaW52YWxpZCBkYXRhLgorICogVGhlIHRyaWNreSBjYXNlIGlzIHdoZW4gd2UgcmVhZCBhIGNvcnJ1cHRlZCBkYXRhIG9yIGNyYy4gV2UgbXVzdCBkZXRlY3QKKyAqIHRoaXMgaGVyZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhhdCBkYXRhIGNhbiBiZSB0cmFuc21pdHRlZCB0byB0aGUgaGNpCisgKiBjb3JlLiBUaGlzIGlzIHRoZSByZWFzb24gd2h5IHdlIGNoZWNrIHRoZSBjcmMgaGVyZS4KKyAqIFRoZSBDTEYgd2lsbCByZXBlYXQgYSBmcmFtZSB1bnRpbCB3ZSBzZW5kIGEgUlIgb24gdGhhdCBmcmFtZS4KKyAqCisgKiBPbiBTVDIxTkZDQSwgSVJRIGdvZXMgaW4gaWRsZSB3aGVuIHJlYWQgc3RhcnRzLiBBcyBubyBzaXplIGluZm9ybWF0aW9uIGFyZQorICogYXZhaWxhYmxlIGluIHRoZSBpbmNvbWluZyBkYXRhLCBvdGhlciBJUlEgbWlnaHQgY29tZS4gRXZlcnkgSVJRIHdpbGwgdHJpZ2dlcgorICogYSByZWFkIHNlcXVlbmNlIHdpdGggZGlmZmVyZW50IGxlbmd0aCBhbmQgd2lsbCBmaWxsIHRoZSBjdXJyZW50IGZyYW1lLgorICogVGhlIHJlY2VwdGlvbiBpcyBjb21wbGV0ZSBvbmNlIHdlIHJlYWNoIGEgU1QyMU5GQ0FfU09GX0VPRi4KKyAqLworc3RhdGljIGlycXJldHVybl90IHN0MjFuZmNhX2hjaV9pcnFfdGhyZWFkX2ZuKGludCBpcnEsIHZvaWQgKnBoeV9pZCkKK3sKKwlzdHJ1Y3Qgc3QyMW5mY2FfaTJjX3BoeSAqcGh5ID0gcGh5X2lkOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwlpbnQgcjsKKworCWlmICghcGh5IHx8IGlycSAhPSBwaHktPmkyY19kZXYtPmlycSkgeworCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwljbGllbnQgPSBwaHktPmkyY19kZXY7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJJUlFcbiIpOworCisJaWYgKHBoeS0+aGFyZF9mYXVsdCAhPSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlyID0gc3QyMW5mY2FfaGNpX2kyY19yZWFkKHBoeSwgcGh5LT5wZW5kaW5nX3NrYik7CisJaWYgKHIgPT0gLUVSRU1PVEVJTykgeworCQlwaHktPmhhcmRfZmF1bHQgPSByOworCisJCW5mY19oY2lfcmVjdl9mcmFtZShwaHktPmhkZXYsIE5VTEwpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKHIgPT0gLUVBR0FJTiB8fCByID09IC1FSU8pIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAociA9PSAtRUJBRE1TRyAmJiBwaHktPmNyY190cmlhbHMgPCBBUlJBWV9TSVpFKHdhaXRfdGFiKSkgeworCQkvKgorCQkgKiBXaXRoIFNUMjFORkNBLCBvbmx5IG9uZSBpbnRlcmZhY2UgKEkyQywgUkYgb3IgU1dQKQorCQkgKiBtYXkgYmUgYWN0aXZlIGF0IGEgdGltZS4KKwkJICogSGF2aW5nIGluY29ycmVjdCBjcmMgaXMgdXN1YWxseSBkdWUgdG8gaTJjIG1hY3JvY2VsbAorCQkgKiBkZWFjdGl2YXRpb24gaW4gdGhlIG1pZGRsZSBvZiBhIHRyYW5zbWlzc2lvbi4KKwkJICogSXQgbWF5IGdlbmVyYXRlIGNvcnJ1cHRlZCBkYXRhIG9uIGkyYy4KKwkJICogV2UgZ2l2ZSBzb21ldGltZSB0byBnZXQgaTJjIGJhY2suCisJCSAqIFRoZSBjb21wbGV0ZSBmcmFtZSB3aWxsIGJlIHJlcGVhdGVkLgorCQkgKi8KKwkJbXNsZWVwKHdhaXRfdGFiW3BoeS0+Y3JjX3RyaWFsc10pOworCQlwaHktPmNyY190cmlhbHMrKzsKKwkJcGh5LT5jdXJyZW50X3JlYWRfbGVuID0gMDsKKwkJa2ZyZWVfc2tiKHBoeS0+cGVuZGluZ19za2IpOworCX0gZWxzZSBpZiAociA+IDApIHsKKwkJLyoKKwkJICogV2Ugc3VjY2VlZGVkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBDTEYgYW5kCisJCSAqIGRhdGEgaXMgdmFsaWQuCisJCSAqIFJlc2V0IGNvdW50ZXIuCisJCSAqLworCQluZmNfaGNpX3JlY3ZfZnJhbWUocGh5LT5oZGV2LCBwaHktPnBlbmRpbmdfc2tiKTsKKwkJcGh5LT5jcmNfdHJpYWxzID0gMDsKKwl9CisKKwlwaHktPnBlbmRpbmdfc2tiID0gYWxsb2Nfc2tiKFNUMjFORkNBX0hDSV9MTENfTUFYX1NJWkUgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAocGh5LT5wZW5kaW5nX3NrYiA9PSBOVUxMKSB7CisJCXBoeS0+aGFyZF9mYXVsdCA9IC1FTk9NRU07CisJCW5mY19oY2lfcmVjdl9mcmFtZShwaHktPmhkZXYsIE5VTEwpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBuZmNfcGh5X29wcyBpMmNfcGh5X29wcyA9IHsKKwkud3JpdGUgPSBzdDIxbmZjYV9oY2lfaTJjX3dyaXRlLAorCS5lbmFibGUgPSBzdDIxbmZjYV9oY2lfaTJjX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHN0MjFuZmNhX2hjaV9pMmNfZGlzYWJsZSwKK307CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzdDIxbmZjYV9pMmNfcGh5ICpwaHkgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwOworCWludCBncGlvOworCWludCByOworCisJcHAgPSBjbGllbnQtPmRldi5vZl9ub2RlOworCWlmICghcHApCisJCXJldHVybiAtRU5PREVWOworCisJLyogR2V0IEdQSU8gZnJvbSBkZXZpY2UgdHJlZSAqLworCWdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwcCwgImVuYWJsZS1ncGlvcyIsIDApOworCWlmIChncGlvIDwgMCkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBlbmFibGUtZ3Bpb3MgZnJvbSBkZXZpY2UgdHJlZVxuIik7CisJCXJldHVybiBncGlvOworCX0KKworCS8qIEdQSU8gcmVxdWVzdCBhbmQgY29uZmlndXJhdGlvbiAqLworCXIgPSBkZXZtX2dwaW9fcmVxdWVzdCgmY2xpZW50LT5kZXYsIGdwaW8sICJjbGZfZW5hYmxlIik7CisJaWYgKHIpIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBlbmFibGUgcGluXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCAxKTsKKwlpZiAocikgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBzZXQgZW5hYmxlIHBpbiBkaXJlY3Rpb24gYXMgb3V0cHV0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBoeS0+Z3Bpb19lbmEgPSBncGlvOworCisJLyogSVJRICovCisJciA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBwLCAwKTsKKwlpZiAociA8IDApIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsCisJCQkJIlVuYWJsZSB0byBnZXQgaXJxLCBlcnJvcjogJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlwaHktPmlycV9wb2xhcml0eSA9IGlycV9nZXRfdHJpZ2dlcl90eXBlKHIpOworCWNsaWVudC0+aXJxID0gcjsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX2kyY19yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzdDIxbmZjYV9uZmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHN0MjFuZmNhX2kyY19waHkgKnBoeSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByOworCWludCBpcnE7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3RvcmUgZm9yIGxhdGVyIHVzZSAqLworCXBoeS0+Z3Bpb19pcnEgPSBwZGF0YS0+Z3Bpb19pcnE7CisJcGh5LT5ncGlvX2VuYSA9IHBkYXRhLT5ncGlvX2VuYTsKKwlwaHktPmlycV9wb2xhcml0eSA9IHBkYXRhLT5pcnFfcG9sYXJpdHk7CisKKwlyID0gZGV2bV9ncGlvX3JlcXVlc3QoJmNsaWVudC0+ZGV2LCBwaHktPmdwaW9faXJxLCAid2FrZV91cCIpOworCWlmIChyKSB7CisJCXByX2VycigiJXMgOiBncGlvX3JlcXVlc3QgZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChwaHktPmdwaW9faXJxKTsKKwlpZiAocikgeworCQlwcl9lcnIoIiVzIDogZ3Bpb19kaXJlY3Rpb25faW5wdXQgZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwaHktPmdwaW9fZW5hID4gMCkgeworCQlyID0gZGV2bV9ncGlvX3JlcXVlc3QoJmNsaWVudC0+ZGV2LAorCQkJCQlwaHktPmdwaW9fZW5hLCAiY2xmX2VuYWJsZSIpOworCQlpZiAocikgeworCQkJcHJfZXJyKCIlcyA6IGVuYSBncGlvX3JlcXVlc3QgZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBoeS0+Z3Bpb19lbmEsIDEpOworCisJCWlmIChyKSB7CisJCQlwcl9lcnIoIiVzIDogZW5hIGdwaW9fZGlyZWN0aW9uX291dHB1dCBmYWlsZWRcbiIsCisJCQkgICAgICAgX19GSUxFX18pOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwkvKiBJUlEgKi8KKwlpcnEgPSBncGlvX3RvX2lycShwaHktPmdwaW9faXJxKTsKKwlpZiAoaXJxIDwgMCkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGdldCBpcnEgbnVtYmVyIGZvciBHUElPICVkIGVycm9yICVkXG4iLAorCQkJCXBoeS0+Z3Bpb19pcnEsIHIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2xpZW50LT5pcnEgPSBpcnE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdDIxbmZjYV9oY2lfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHN0MjFuZmNhX2kyY19waHkgKnBoeTsKKwlzdHJ1Y3Qgc3QyMW5mY2FfbmZjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCByOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiSVJROiAlZFxuIiwgY2xpZW50LT5pcnEpOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJOZWVkIEkyQ19GVU5DX0kyQ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBoeSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3QyMW5mY2FfaTJjX3BoeSksCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoeSkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdDIxbmZjYSBpMmMgcGh5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBoeS0+aTJjX2RldiA9IGNsaWVudDsKKwlwaHktPnBlbmRpbmdfc2tiID0gYWxsb2Nfc2tiKFNUMjFORkNBX0hDSV9MTENfTUFYX1NJWkUgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAocGh5LT5wZW5kaW5nX3NrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeS0+Y3VycmVudF9yZWFkX2xlbiA9IDA7CisJcGh5LT5jcmNfdHJpYWxzID0gMDsKKwltdXRleF9pbml0KCZwaHktPnBoeV9sb2NrKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwaHkpOworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEgJiYgY2xpZW50LT5kZXYub2Zfbm9kZSkgeworCQlyID0gc3QyMW5mY2FfaGNpX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhjbGllbnQpOworCQlpZiAocikgeworCQkJbmZjX2VycigmY2xpZW50LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJCXJldHVybiByOworCQl9CisJfSBlbHNlIGlmIChwZGF0YSkgeworCQlyID0gc3QyMW5mY2FfaGNpX2kyY19yZXF1ZXN0X3Jlc291cmNlcyhjbGllbnQpOworCQlpZiAocikgeworCQkJbmZjX2VycigmY2xpZW50LT5kZXYsICJDYW5ub3QgZ2V0IHBsYXRmb3JtIHJlc291cmNlc1xuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0gZWxzZSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAic3QyMW5mY2EgcGxhdGZvcm0gcmVzb3VyY2VzIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyID0gc3QyMW5mY2FfaGNpX3BsYXRmb3JtX2luaXQocGh5KTsKKwlpZiAociA8IDApIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVib290IHN0MjFuZmNhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJciA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwgTlVMTCwKKwkJCQlzdDIxbmZjYV9oY2lfaXJxX3RocmVhZF9mbiwKKwkJCQlwaHktPmlycV9wb2xhcml0eSB8IElSUUZfT05FU0hPVCwKKwkJCQlTVDIxTkZDQV9IQ0lfRFJJVkVSX05BTUUsIHBoeSk7CisJaWYgKHIgPCAwKSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHN0MjFuZmNhX2hjaV9wcm9iZShwaHksICZpMmNfcGh5X29wcywgTExDX1NIRExDX05BTUUsCisJCQkgICAgICAgU1QyMU5GQ0FfRlJBTUVfSEVBRFJPT00sIFNUMjFORkNBX0ZSQU1FX1RBSUxST09NLAorCQkJICAgICAgIFNUMjFORkNBX0hDSV9MTENfTUFYX1BBWUxPQUQsICZwaHktPmhkZXYpOworfQorCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHN0MjFuZmNhX2kyY19waHkgKnBoeSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJc3QyMW5mY2FfaGNpX3JlbW92ZShwaHktPmhkZXYpOworCisJaWYgKHBoeS0+cG93ZXJlZCkKKwkJc3QyMW5mY2FfaGNpX2kyY19kaXNhYmxlKHBoeSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2Zfc3QyMW5mY2FfaTJjX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdDIxbmZjYV9pMmMiLCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3QyMW5mY2FfaGNpX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gU1QyMU5GQ0FfSENJX0kyQ19EUklWRVJfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9zdDIxbmZjYV9pMmNfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc3QyMW5mY2FfaGNpX2kyY19wcm9iZSwKKwkuaWRfdGFibGUgPSBzdDIxbmZjYV9oY2lfaTJjX2lkX3RhYmxlLAorCS5yZW1vdmUgPSBzdDIxbmZjYV9oY2lfaTJjX3JlbW92ZSwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKHN0MjFuZmNhX2hjaV9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3N0MjFuZmNhL3N0MjFuZmNhLmMgYi9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTBmMDBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Evc3QyMW5mY2EuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIEhDSSBiYXNlZCBEcml2ZXIgZm9yIFNUTWljcm9lbGVjdHJvbmljcyBORkMgQ2hpcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgU1RNaWNyb2VsZWN0cm9uaWNzIFNBUy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKyNpbmNsdWRlIDxuZXQvbmZjL2hjaS5oPgorI2luY2x1ZGUgPG5ldC9uZmMvbGxjLmg+CisKKyNpbmNsdWRlICJzdDIxbmZjYS5oIgorCisjZGVmaW5lIERSSVZFUl9ERVNDICJIQ0kgTkZDIGRyaXZlciBmb3IgU1QyMU5GQ0EiCisKKyNkZWZpbmUgRlVMTF9WRVJTSU9OX0xFTiAzCisKKy8qIFByb3ByaWV0YXJ5IGdhdGVzLCBldmVudHMsIGNvbW1hbmRzIGFuZCByZWdpc3RlcnMgKi8KKworLyogQ29tbWFuZHMgdGhhdCBhcHBseSB0byBhbGwgUkYgcmVhZGVycyAqLworI2RlZmluZSBTVDIxTkZDQV9SRl9SRUFERVJfQ01EX1BSRVNFTkNFX0NIRUNLCTB4MzAKKworI2RlZmluZSBTVDIxTkZDQV9SRl9SRUFERVJfSVNPMTU2OTNfR0FURQkweDEyCisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl9JU08xNTY5M19JTlZFTlRPUlkgMHgwMQorCisvKgorICogUmVhZGVyIGdhdGUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBjb250YWN0LWxlc3MgY2FyZHMgdXNpbmcgVHlwZSBBCisgKiBwcm90b2NvbCBJU08xNDQ0My0zIGJ1dCBub3QgY29tcGxpYW50IHdpdGggSVNPMTQ0NDMtNAorICovCisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURQkweDE1CisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfVUlECTB4MDIKKyNkZWZpbmUgU1QyMU5GQ0FfUkZfUkVBREVSXzE0NDQzXzNfQV9BVFFBCTB4MDMKKyNkZWZpbmUgU1QyMU5GQ0FfUkZfUkVBREVSXzE0NDQzXzNfQV9TQUsJMHgwNAorCisjZGVmaW5lIFNUMjFORkNBX0RFVklDRV9NR05UX0dBVEUJCTB4MDEKKyNkZWZpbmUgU1QyMU5GQ0FfREVWSUNFX01HTlRfUElQRQkJMHgwMgorCisjZGVmaW5lIFNUMjFORkNBX0RNX0dFVElORk8gICAgICAgICAweDEzCisjZGVmaW5lIFNUMjFORkNBX0RNX0dFVElORk9fUElQRV9MSVNUICAgICAgIDB4MDIKKyNkZWZpbmUgU1QyMU5GQ0FfRE1fR0VUSU5GT19QSVBFX0lORk8gICAgICAgMHgwMQorI2RlZmluZSBTVDIxTkZDQV9ETV9QSVBFX0NSRUFURUQgICAgICAgIDB4MDIKKyNkZWZpbmUgU1QyMU5GQ0FfRE1fUElQRV9PUEVOICAgICAgICAgICAweDA0CisjZGVmaW5lIFNUMjFORkNBX0RNX1JGX0FDVElWRSAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFNUMjFORkNBX0RNX0lTX1BJUEVfT1BFTihwKSBcCisJKChwICYgMHgwZikgPT0gKFNUMjFORkNBX0RNX1BJUEVfQ1JFQVRFRCB8IFNUMjFORkNBX0RNX1BJUEVfT1BFTikpCisKKyNkZWZpbmUgU1QyMU5GQ0FfTkZDX01PREUJMHgwMwkvKiBORkNfTU9ERSBwYXJhbWV0ZXIqLworCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoZGV2X21hc2ssIFNUMjFORkNBX05VTV9ERVZJQ0VTKTsKKworc3RhdGljIHN0cnVjdCBuZmNfaGNpX2dhdGUgc3QyMW5mY2FfZ2F0ZXNbXSA9IHsKKwl7TkZDX0hDSV9BRE1JTl9HQVRFLCBORkNfSENJX0FETUlOX1BJUEV9LAorCXtORkNfSENJX0xPT1BCQUNLX0dBVEUsIE5GQ19IQ0lfSU5WQUxJRF9QSVBFfSwKKwl7TkZDX0hDSV9JRF9NR01UX0dBVEUsIE5GQ19IQ0lfSU5WQUxJRF9QSVBFfSwKKwl7TkZDX0hDSV9MSU5LX01HTVRfR0FURSwgTkZDX0hDSV9MSU5LX01HTVRfUElQRX0sCisJe05GQ19IQ0lfUkZfUkVBREVSX0JfR0FURSwgTkZDX0hDSV9JTlZBTElEX1BJUEV9LAorCXtORkNfSENJX1JGX1JFQURFUl9BX0dBVEUsIE5GQ19IQ0lfSU5WQUxJRF9QSVBFfSwKKwl7U1QyMU5GQ0FfREVWSUNFX01HTlRfR0FURSwgU1QyMU5GQ0FfREVWSUNFX01HTlRfUElQRX0sCisJe1NUMjFORkNBX1JGX1JFQURFUl9GX0dBVEUsIE5GQ19IQ0lfSU5WQUxJRF9QSVBFfSwKKwl7U1QyMU5GQ0FfUkZfUkVBREVSXzE0NDQzXzNfQV9HQVRFLCBORkNfSENJX0lOVkFMSURfUElQRX0sCisJe1NUMjFORkNBX1JGX1JFQURFUl9JU08xNTY5M19HQVRFLCBORkNfSENJX0lOVkFMSURfUElQRX0sCit9OworCitzdHJ1Y3Qgc3QyMW5mY2FfcGlwZV9pbmZvIHsKKwl1OCBwaXBlX3N0YXRlOworCXU4IHNyY19ob3N0X2lkOworCXU4IHNyY19nYXRlX2lkOworCXU4IGRzdF9ob3N0X2lkOworCXU4IGRzdF9nYXRlX2lkOworfSBfX3BhY2tlZDsKKworLyogTGFyZ2VzdCBoZWFkcm9vbSBuZWVkZWQgZm9yIG91dGdvaW5nIGN1c3RvbSBjb21tYW5kcyAqLworI2RlZmluZSBTVDIxTkZDQV9DTURTX0hFQURST09NICA3CisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX2xvYWRfc2Vzc2lvbihzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpCit7CisJaW50IGksIGosIHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9waXBlX2xpc3QsICpza2JfcGlwZV9pbmZvOworCXN0cnVjdCBzdDIxbmZjYV9waXBlX2luZm8gKmluZm87CisKKwl1OCBwaXBlX2xpc3RbXSA9IHsgU1QyMU5GQ0FfRE1fR0VUSU5GT19QSVBFX0xJU1QsCisJCU5GQ19IQ0lfVEVSTUlOQUxfSE9TVF9JRAorCX07CisJdTggcGlwZV9pbmZvW10gPSB7IFNUMjFORkNBX0RNX0dFVElORk9fUElQRV9JTkZPLAorCQlORkNfSENJX1RFUk1JTkFMX0hPU1RfSUQsIDAKKwl9OworCisJc2tiX3BpcGVfbGlzdCA9IGFsbG9jX3NrYihTVDIxTkZDQV9IQ0lfTExDX01BWF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYl9waXBlX2xpc3QpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9saXN0OworCX0KKworCXNrYl9waXBlX2luZm8gPSBhbGxvY19za2IoU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2JfcGlwZV9pbmZvKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfaW5mbzsKKwl9CisKKwkvKiBPbiBTVDIxTkZDQSBkZXZpY2UgcGlwZXMgbnVtYmVyIGFyZSBkeW5hbWljcworCSAqIEEgbWF4aW11bSBvZiAxNiBwaXBlcyBjYW4gYmUgY3JlYXRlZCBhdCB0aGUgc2FtZSB0aW1lCisJICogSWYgcGlwZXMgYXJlIGFscmVhZHkgY3JlYXRlZCwgaGNpX2Rldl91cCB3aWxsIGZhaWwuCisJICogRG9pbmcgYSBjbGVhciBhbGwgcGlwZSBpcyBhIGJhZCBpZGVhIGJlY2F1c2U6CisJICogLSBJdCBkb2VzIHVzZWxlc3MgRUVQUk9NIGN5Y2xpbmcKKwkgKiAtIEl0IG1pZ2h0IGNhdXNlIGlzc3VlIGZvciBzZWN1cmUgZWxlbWVudHMgc3VwcG9ydAorCSAqIChzdWNoIGFzIHJlbW92aW5nIGNvbm5lY3Rpdml0eSBvciBBUERVIHJlYWRlciBwaXBlKQorCSAqIEEgYmV0dGVyIGFwcHJvYWNoIG9uIFNUMjFORkNBIGlzIHRvOgorCSAqIC0gZ2V0IGEgcGlwZSBsaXN0IGZvciBlYWNoIGhvc3QuCisJICogKGVnOiBORkNfSENJX0hPU1RfQ09OVFJPTExFUl9JRCBmb3Igbm93KS4KKwkgKiAoVE9ETyBMYXRlciBvbiBVSUNDIEhPU1QgYW5kIGVTRSBIT1NUKQorCSAqIC0gZ2V0IHBpcGUgaW5mb3JtYXRpb24KKwkgKiAtIG1hdGNoIHJldHJpZXZlZCBwaXBlIGxpc3QgaW4gc3QyMW5mY2FfZ2F0ZXMKKwkgKiBTVDIxTkZDQV9ERVZJQ0VfTUdOVF9HQVRFIGlzIGEgcHJvcHJpZXRhcnkgZ2F0ZQorCSAqIHdpdGggU1QyMU5GQ0FfREVWSUNFX01HTlRfUElQRS4KKwkgKiBQaXBlIGNhbiBiZSBjbG9zZWQgYW5kIG5lZWQgdG8gYmUgb3Blbi4KKwkgKi8KKwlyID0gbmZjX2hjaV9jb25uZWN0X2dhdGUoaGRldiwgTkZDX0hDSV9IT1NUX0NPTlRST0xMRVJfSUQsCisJCVNUMjFORkNBX0RFVklDRV9NR05UX0dBVEUsIFNUMjFORkNBX0RFVklDRV9NR05UX1BJUEUpOworCWlmIChyIDwgMCkKKwkJZ290byBmcmVlX2luZm87CisKKwkvKiBHZXQgcGlwZSBsaXN0ICovCisJciA9IG5mY19oY2lfc2VuZF9jbWQoaGRldiwgU1QyMU5GQ0FfREVWSUNFX01HTlRfR0FURSwKKwkJCVNUMjFORkNBX0RNX0dFVElORk8sIHBpcGVfbGlzdCwgc2l6ZW9mKHBpcGVfbGlzdCksCisJCQkmc2tiX3BpcGVfbGlzdCk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGZyZWVfaW5mbzsKKworCS8qIENvbXBsZXRlIHRoZSBleGlzdGluZyBnYXRlX3BpcGUgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3BpcGVfbGlzdC0+bGVuOyBpKyspIHsKKwkJcGlwZV9pbmZvWzJdID0gc2tiX3BpcGVfbGlzdC0+ZGF0YVtpXTsKKwkJciA9IG5mY19oY2lfc2VuZF9jbWQoaGRldiwgU1QyMU5GQ0FfREVWSUNFX01HTlRfR0FURSwKKwkJCQkJU1QyMU5GQ0FfRE1fR0VUSU5GTywgcGlwZV9pbmZvLAorCQkJCQlzaXplb2YocGlwZV9pbmZvKSwgJnNrYl9waXBlX2luZm8pOworCisJCWlmIChyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTWF0Y2ggcGlwZSBJRCBhbmQgZ2F0ZSBJRAorCQkgKiBPdXRwdXQgZm9ybWF0IGZyb20gU1QyMU5GQ19ETV9HRVRJTkZPIGlzOgorCQkgKiAtIHBpcGUgc3RhdGUgKDFieXRlKQorCQkgKiAtIHNvdXJjZSBoaWQgKDFieXRlKQorCQkgKiAtIHNvdXJjZSBnaWQgKDFieXRlKQorCQkgKiAtIGRlc3RpbmF0aW9uIGhpZCAoMWJ5dGUpCisJCSAqIC0gZGVzdGluYXRpb24gZ2lkICgxYnl0ZSkKKwkJICovCisJCWluZm8gPSAoc3RydWN0IHN0MjFuZmNhX3BpcGVfaW5mbyAqKSBza2JfcGlwZV9pbmZvLT5kYXRhOworCQlmb3IgKGogPSAwOyAoaiA8IEFSUkFZX1NJWkUoc3QyMW5mY2FfZ2F0ZXMpKSAmJgorCQkJKHN0MjFuZmNhX2dhdGVzW2pdLmdhdGUgIT0gaW5mby0+ZHN0X2dhdGVfaWQpOworCQkJaisrKQorCQkJOworCisJCWlmIChqIDwgQVJSQVlfU0laRShzdDIxbmZjYV9nYXRlcykgJiYKKwkJCXN0MjFuZmNhX2dhdGVzW2pdLmdhdGUgPT0gaW5mby0+ZHN0X2dhdGVfaWQgJiYKKwkJCVNUMjFORkNBX0RNX0lTX1BJUEVfT1BFTihpbmZvLT5waXBlX3N0YXRlKSkgeworCQkJc3QyMW5mY2FfZ2F0ZXNbal0ucGlwZSA9IHBpcGVfaW5mb1syXTsKKwkJCWhkZXYtPmdhdGUycGlwZVtzdDIxbmZjYV9nYXRlc1tqXS5nYXRlXSA9CisJCQkJc3QyMW5mY2FfZ2F0ZXNbal0ucGlwZTsKKwkJfQorCX0KKworCS8qCisJICogMyBnYXRlcyBoYXZlIGEgd2VsbCBrbm93biBwaXBlIElELgorCSAqIFRoZXkgd2lsbCBuZXZlciBhcHBlYXIgaW4gdGhlIHBpcGUgbGlzdAorCSAqLworCWlmIChza2JfcGlwZV9saXN0LT5sZW4gKyAzIDwgQVJSQVlfU0laRShzdDIxbmZjYV9nYXRlcykpIHsKKwkJZm9yIChpID0gc2tiX3BpcGVfbGlzdC0+bGVuICsgMzsKKwkJCQlpIDwgQVJSQVlfU0laRShzdDIxbmZjYV9nYXRlcyk7IGkrKykgeworCQkJciA9IG5mY19oY2lfY29ubmVjdF9nYXRlKGhkZXYsCisJCQkJCU5GQ19IQ0lfSE9TVF9DT05UUk9MTEVSX0lELAorCQkJCQlzdDIxbmZjYV9nYXRlc1tpXS5nYXRlLAorCQkJCQlzdDIxbmZjYV9nYXRlc1tpXS5waXBlKTsKKwkJCWlmIChyIDwgMCkKKwkJCQlnb3RvIGZyZWVfaW5mbzsKKwkJfQorCX0KKworCW1lbWNweShoZGV2LT5pbml0X2RhdGEuZ2F0ZXMsIHN0MjFuZmNhX2dhdGVzLCBzaXplb2Yoc3QyMW5mY2FfZ2F0ZXMpKTsKK2ZyZWVfaW5mbzoKKwlrZnJlZV9za2Ioc2tiX3BpcGVfaW5mbyk7CitmcmVlX2xpc3Q6CisJa2ZyZWVfc2tiKHNrYl9waXBlX2xpc3QpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9vcGVuKHN0cnVjdCBuZmNfaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3Qgc3QyMW5mY2FfaGNpX2luZm8gKmluZm8gPSBuZmNfaGNpX2dldF9jbGllbnRkYXRhKGhkZXYpOworCWludCByOworCisJbXV0ZXhfbG9jaygmaW5mby0+aW5mb19sb2NrKTsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBTVDIxTkZDQV9TVF9DT0xEKSB7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSBpbmZvLT5waHlfb3BzLT5lbmFibGUoaW5mby0+cGh5X2lkKTsKKworCWlmIChyID09IDApCisJCWluZm8tPnN0YXRlID0gU1QyMU5GQ0FfU1RfUkVBRFk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZm8tPmluZm9fbG9jayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHN0MjFuZmNhX2hjaV9jbG9zZShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IHN0MjFuZmNhX2hjaV9pbmZvICppbmZvID0gbmZjX2hjaV9nZXRfY2xpZW50ZGF0YShoZGV2KTsKKworCW11dGV4X2xvY2soJmluZm8tPmluZm9fbG9jayk7CisKKwlpZiAoaW5mby0+c3RhdGUgPT0gU1QyMU5GQ0FfU1RfQ09MRCkKKwkJZ290byBvdXQ7CisKKwlpbmZvLT5waHlfb3BzLT5kaXNhYmxlKGluZm8tPnBoeV9pZCk7CisJaW5mby0+c3RhdGUgPSBTVDIxTkZDQV9TVF9DT0xEOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworfQorCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9yZWFkeShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXU4IHBhcmFtOworCWludCByOworCisJcGFyYW0gPSBORkNfSENJX1VJQ0NfSE9TVF9JRDsKKwlyID0gbmZjX2hjaV9zZXRfcGFyYW0oaGRldiwgTkZDX0hDSV9BRE1JTl9HQVRFLAorCQkJICAgICAgTkZDX0hDSV9BRE1JTl9XSElURUxJU1QsICZwYXJhbSwgMSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCS8qIFNldCBORkNfTU9ERSBpbiBkZXZpY2UgbWFuYWdlbWVudCBnYXRlIHRvIGVuYWJsZSAqLworCXIgPSBuZmNfaGNpX2dldF9wYXJhbShoZGV2LCBTVDIxTkZDQV9ERVZJQ0VfTUdOVF9HQVRFLAorCQkJICAgICAgU1QyMU5GQ0FfTkZDX01PREUsICZza2IpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlpZiAoc2tiLT5kYXRhWzBdID09IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXBhcmFtID0gMTsKKworCQlyID0gbmZjX2hjaV9zZXRfcGFyYW0oaGRldiwgU1QyMU5GQ0FfREVWSUNFX01HTlRfR0FURSwKKwkJCQkJU1QyMU5GQ0FfTkZDX01PREUsICZwYXJhbSwgMSk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCX0KKworCXIgPSBuZmNfaGNpX3NlbmRfZXZlbnQoaGRldiwgTkZDX0hDSV9SRl9SRUFERVJfQV9HQVRFLAorCQkJICAgICAgIE5GQ19IQ0lfRVZUX0VORF9PUEVSQVRJT04sIE5VTEwsIDApOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gbmZjX2hjaV9nZXRfcGFyYW0oaGRldiwgTkZDX0hDSV9JRF9NR01UX0dBVEUsCisJCQkgICAgICBORkNfSENJX0lEX01HTVRfVkVSU0lPTl9TVywgJnNrYik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmIChza2ItPmxlbiAhPSBGVUxMX1ZFUlNJT05fTEVOKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiRlVMTCBWRVJTSU9OIFNPRlRXQVJFIElORk86ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJICAgICAgIHNrYi0+ZGF0YSwgRlVMTF9WRVJTSU9OX0xFTiwgZmFsc2UpOworCisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdDIxbmZjYV9oY2lfeG1pdChzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHN0MjFuZmNhX2hjaV9pbmZvICppbmZvID0gbmZjX2hjaV9nZXRfY2xpZW50ZGF0YShoZGV2KTsKKworCXJldHVybiBpbmZvLT5waHlfb3BzLT53cml0ZShpbmZvLT5waHlfaWQsIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX3N0YXJ0X3BvbGwoc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2LAorCQkJCSAgIHUzMiBpbV9wcm90b2NvbHMsIHUzMiB0bV9wcm90b2NvbHMpCit7CisJaW50IHI7CisKKwlwcl9pbmZvKERSSVZFUl9ERVNDICI6ICVzIHByb3RvY29scyAweCV4IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpbV9wcm90b2NvbHMsIHRtX3Byb3RvY29scyk7CisKKwlyID0gbmZjX2hjaV9zZW5kX2V2ZW50KGhkZXYsIE5GQ19IQ0lfUkZfUkVBREVSX0FfR0FURSwKKwkJCSAgICAgICBORkNfSENJX0VWVF9FTkRfT1BFUkFUSU9OLCBOVUxMLCAwKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCWlmIChpbV9wcm90b2NvbHMpIHsKKwkJLyoKKwkJICogZW5hYmxlIHBvbGxpbmcgYWNjb3JkaW5nIHRvIGltX3Byb3RvY29scyAmIHRtX3Byb3RvY29scworCQkgKiAtIENMT1NFIHBpcGUgYWNjb3JkaW5nIHRvIGltX3Byb3RvY29scyAmIHRtX3Byb3RvY29scworCQkgKi8KKwkJaWYgKChORkNfSENJX1JGX1JFQURFUl9CX0dBVEUgJiBpbV9wcm90b2NvbHMpID09IDApIHsKKwkJCXIgPSBuZmNfaGNpX2Rpc2Nvbm5lY3RfZ2F0ZShoZGV2LAorCQkJCQlORkNfSENJX1JGX1JFQURFUl9CX0dBVEUpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisKKwkJaWYgKChORkNfSENJX1JGX1JFQURFUl9BX0dBVEUgJiBpbV9wcm90b2NvbHMpID09IDApIHsKKwkJCXIgPSBuZmNfaGNpX2Rpc2Nvbm5lY3RfZ2F0ZShoZGV2LAorCQkJCQlORkNfSENJX1JGX1JFQURFUl9BX0dBVEUpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisKKwkJaWYgKChTVDIxTkZDQV9SRl9SRUFERVJfRl9HQVRFICYgaW1fcHJvdG9jb2xzKSA9PSAwKSB7CisJCQlyID0gbmZjX2hjaV9kaXNjb25uZWN0X2dhdGUoaGRldiwKKwkJCQkJU1QyMU5GQ0FfUkZfUkVBREVSX0ZfR0FURSk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIHI7CisJCX0KKworCQlpZiAoKFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURSAmIGltX3Byb3RvY29scykgPT0gMCkgeworCQkJciA9IG5mY19oY2lfZGlzY29ubmVjdF9nYXRlKGhkZXYsCisJCQkJCVNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURSk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIHI7CisJCX0KKworCQlpZiAoKFNUMjFORkNBX1JGX1JFQURFUl9JU08xNTY5M19HQVRFICYgaW1fcHJvdG9jb2xzKSA9PSAwKSB7CisJCQlyID0gbmZjX2hjaV9kaXNjb25uZWN0X2dhdGUoaGRldiwKKwkJCQkJU1QyMU5GQ0FfUkZfUkVBREVSX0lTTzE1NjkzX0dBVEUpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisKKwkJciA9IG5mY19oY2lfc2VuZF9ldmVudChoZGV2LCBORkNfSENJX1JGX1JFQURFUl9BX0dBVEUsCisJCQkJICAgICAgIE5GQ19IQ0lfRVZUX1JFQURFUl9SRVFVRVNURUQsIE5VTEwsIDApOworCQlpZiAociA8IDApCisJCQluZmNfaGNpX3NlbmRfZXZlbnQoaGRldiwgTkZDX0hDSV9SRl9SRUFERVJfQV9HQVRFLAorCQkJCQkgICBORkNfSENJX0VWVF9FTkRfT1BFUkFUSU9OLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfZ2V0X2lzbzE0NDQzXzNfYXRxYShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsIHUxNiAqYXRxYSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYXRxYV9za2IgPSBOVUxMOworCisJciA9IG5mY19oY2lfZ2V0X3BhcmFtKGhkZXYsIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURSwKKwkJCSAgICAgIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfQVRRQSwgJmF0cWFfc2tiKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXhpdDsKKworCWlmIChhdHFhX3NrYi0+bGVuICE9IDIpIHsKKwkJciA9IC1FUFJPVE87CisJCWdvdG8gZXhpdDsKKwl9CisKKwkqYXRxYSA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopIGF0cWFfc2tiLT5kYXRhKTsKKworZXhpdDoKKwlrZnJlZV9za2IoYXRxYV9za2IpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHN0MjFuZmNhX2dldF9pc28xNDQ0M18zX3NhayhzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsIHU4ICpzYWspCit7CisJaW50IHI7CisJc3RydWN0IHNrX2J1ZmYgKnNha19za2IgPSBOVUxMOworCisJciA9IG5mY19oY2lfZ2V0X3BhcmFtKGhkZXYsIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURSwKKwkJCSAgICAgIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfU0FLLCAmc2FrX3NrYik7CisJaWYgKHIgPCAwKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoc2FrX3NrYi0+bGVuICE9IDEpIHsKKwkJciA9IC1FUFJPVE87CisJCWdvdG8gZXhpdDsKKwl9CisKKwkqc2FrID0gc2FrX3NrYi0+ZGF0YVswXTsKKworZXhpdDoKKwlrZnJlZV9za2Ioc2FrX3NrYik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfZ2V0X2lzbzE0NDQzXzNfdWlkKHN0cnVjdCBuZmNfaGNpX2RldiAqaGRldiwgdTggKmdhdGUsCisJCQkJICAgICAgIGludCAqbGVuKQoreworCWludCByOworCXN0cnVjdCBza19idWZmICp1aWRfc2tiID0gTlVMTDsKKworCXIgPSBuZmNfaGNpX2dldF9wYXJhbShoZGV2LCBTVDIxTkZDQV9SRl9SRUFERVJfMTQ0NDNfM19BX0dBVEUsCisJCQkgICAgICBTVDIxTkZDQV9SRl9SRUFERVJfMTQ0NDNfM19BX1VJRCwgJnVpZF9za2IpOworCWlmIChyIDwgMCkKKwkJZ290byBleGl0OworCisJaWYgKHVpZF9za2ItPmxlbiA9PSAwIHx8IHVpZF9za2ItPmxlbiA+IE5GQ19ORkNJRDFfTUFYU0laRSkgeworCQlyID0gLUVQUk9UTzsKKwkJZ290byBleGl0OworCX0KKworCWdhdGUgPSB1aWRfc2tiLT5kYXRhOworCSpsZW4gPSB1aWRfc2tiLT5sZW47CitleGl0OgorCWtmcmVlX3NrYih1aWRfc2tiKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzdDIxbmZjYV9nZXRfaXNvMTU2OTNfaW52ZW50b3J5KHN0cnVjdCBuZmNfaGNpX2RldiAqaGRldiwKKwkJCQkJICAgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW52ZW50b3J5X3NrYiA9IE5VTEw7CisKKwlyID0gbmZjX2hjaV9nZXRfcGFyYW0oaGRldiwgU1QyMU5GQ0FfUkZfUkVBREVSX0lTTzE1NjkzX0dBVEUsCisJCQkgICAgICBTVDIxTkZDQV9SRl9SRUFERVJfSVNPMTU2OTNfSU5WRU5UT1JZLAorCQkJICAgICAgJmludmVudG9yeV9za2IpOworCWlmIChyIDwgMCkKKwkJZ290byBleGl0OworCisJc2tiX3B1bGwoaW52ZW50b3J5X3NrYiwgMik7CisKKwlpZiAoaW52ZW50b3J5X3NrYi0+bGVuID09IDAgfHwKKwkgICAgaW52ZW50b3J5X3NrYi0+bGVuID4gTkZDX0lTTzE1NjkzX1VJRF9NQVhTSVpFKSB7CisJCXIgPSAtRVBST1RPOworCQlnb3RvIGV4aXQ7CisJfQorCisJbWVtY3B5KHRhcmdldC0+aXNvMTU2OTNfdWlkLCBpbnZlbnRvcnlfc2tiLT5kYXRhLCBpbnZlbnRvcnlfc2tiLT5sZW4pOworCXRhcmdldC0+aXNvMTU2OTNfZHNmaWQJPSBpbnZlbnRvcnlfc2tiLT5kYXRhWzFdOworCXRhcmdldC0+aXNfaXNvMTU2OTMgPSAxOworZXhpdDoKKwlrZnJlZV9za2IoaW52ZW50b3J5X3NrYik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc3QyMW5mY2FfaGNpX3RhcmdldF9mcm9tX2dhdGUoc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2LCB1OCBnYXRlLAorCQkJCQkgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgciwgbGVuOworCXUxNiBhdHFhOworCXU4IHNhazsKKwl1OCB1aWRbTkZDX05GQ0lEMV9NQVhTSVpFXTsKKworCXN3aXRjaCAoZ2F0ZSkgeworCWNhc2UgU1QyMU5GQ0FfUkZfUkVBREVSX0ZfR0FURToKKwkJdGFyZ2V0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzID0gTkZDX1BST1RPX0ZFTElDQV9NQVNLOworCQlicmVhazsKKwljYXNlIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURToKKwkJLyogSVNPMTQ0NDMtMyB0eXBlIDEgb3IgMiB0YWdzICovCisJCXIgPSBzdDIxbmZjYV9nZXRfaXNvMTQ0NDNfM19hdHFhKGhkZXYsICZhdHFhKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCWlmIChhdHFhID09IDB4MDAwYykgeworCQkJdGFyZ2V0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzID0gTkZDX1BST1RPX0pFV0VMX01BU0s7CisJCQl0YXJnZXQtPnNlbnNfcmVzID0gMHgwYzAwOworCQl9IGVsc2UgeworCQkJciA9IHN0MjFuZmNhX2dldF9pc28xNDQ0M18zX3NhayhoZGV2LCAmc2FrKTsKKwkJCWlmIChyIDwgMCkKKwkJCQlyZXR1cm4gcjsKKworCQkJciA9IHN0MjFuZmNhX2dldF9pc28xNDQ0M18zX3VpZChoZGV2LCB1aWQsICZsZW4pOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCisJCQl0YXJnZXQtPnN1cHBvcnRlZF9wcm90b2NvbHMgPQorCQkJICAgIG5mY19oY2lfc2FrX3RvX3Byb3RvY29sKHNhayk7CisJCQlpZiAodGFyZ2V0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzID09IDB4ZmZmZmZmZmYpCisJCQkJcmV0dXJuIC1FUFJPVE87CisKKwkJCXRhcmdldC0+c2Vuc19yZXMgPSBhdHFhOworCQkJdGFyZ2V0LT5zZWxfcmVzID0gc2FrOworCQkJbWVtY3B5KHRhcmdldC0+bmZjaWQxLCB1aWQsIGxlbik7CisJCQl0YXJnZXQtPm5mY2lkMV9sZW4gPSBsZW47CisJCX0KKworCQlicmVhazsKKwljYXNlIFNUMjFORkNBX1JGX1JFQURFUl9JU08xNTY5M19HQVRFOgorCQl0YXJnZXQtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSVNPMTU2OTNfTUFTSzsKKwkJciA9IHN0MjFuZmNhX2dldF9pc28xNTY5M19pbnZlbnRvcnkoaGRldiwgdGFyZ2V0KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNUMjFORkNBX0NCX1RZUEVfUkVBREVSX0lTTzE1NjkzIDEKK3N0YXRpYyB2b2lkIHN0MjFuZmNhX2hjaV9kYXRhX2V4Y2hhbmdlX2NiKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgaW50IGVycikKK3sKKwlzdHJ1Y3Qgc3QyMW5mY2FfaGNpX2luZm8gKmluZm8gPSBjb250ZXh0OworCisJc3dpdGNoIChpbmZvLT5hc3luY19jYl90eXBlKSB7CisJY2FzZSBTVDIxTkZDQV9DQl9UWVBFX1JFQURFUl9JU08xNTY5MzoKKwkJaWYgKGVyciA9PSAwKQorCQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDEpOworCQlpbmZvLT5hc3luY19jYihpbmZvLT5hc3luY19jYl9jb250ZXh0LCBza2IsIGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChlcnIgPT0gMCkKKwkJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm5zOgorICogPD0gMDogZHJpdmVyIGhhbmRsZWQgdGhlIGRhdGEgZXhjaGFuZ2UKKyAqICAgIDE6IGRyaXZlciBkb2Vzbid0IGVzcGVjaWFsbHkgaGFuZGxlLCBwbGVhc2UgZG8gc3RhbmRhcmQgcHJvY2Vzc2luZworICovCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9pbV90cmFuc2NlaXZlKHN0cnVjdCBuZmNfaGNpX2RldiAqaGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgbmZjX3RhcmdldCAqdGFyZ2V0LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgZGF0YV9leGNoYW5nZV9jYl90IGNiLCB2b2lkICpjYl9jb250ZXh0KQoreworCXN0cnVjdCBzdDIxbmZjYV9oY2lfaW5mbyAqaW5mbyA9IG5mY19oY2lfZ2V0X2NsaWVudGRhdGEoaGRldik7CisKKwlwcl9pbmZvKERSSVZFUl9ERVNDICI6ICVzIGZvciBnYXRlPSVkIGxlbj0lZFxuIiwgX19mdW5jX18sCisJCXRhcmdldC0+aGNpX3JlYWRlcl9nYXRlLCBza2ItPmxlbik7CisKKwlzd2l0Y2ggKHRhcmdldC0+aGNpX3JlYWRlcl9nYXRlKSB7CisJY2FzZSBTVDIxTkZDQV9SRl9SRUFERVJfRl9HQVRFOgorCQkqc2tiX3B1c2goc2tiLCAxKSA9IDB4MWE7CisJCXJldHVybiBuZmNfaGNpX3NlbmRfY21kX2FzeW5jKGhkZXYsIHRhcmdldC0+aGNpX3JlYWRlcl9nYXRlLAorCQkJCQkgICAgICBTVDIxTkZDQV9XUl9YQ0hHX0RBVEEsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgc2tiLT5sZW4sIGNiLCBjYl9jb250ZXh0KTsKKwljYXNlIFNUMjFORkNBX1JGX1JFQURFUl8xNDQ0M18zX0FfR0FURToKKwkJKnNrYl9wdXNoKHNrYiwgMSkgPSAweDFhOwkvKiBDVFIsIHNlZSBzcGVjOjEwLjIuMi4xICovCisKKwkJcmV0dXJuIG5mY19oY2lfc2VuZF9jbWRfYXN5bmMoaGRldiwgdGFyZ2V0LT5oY2lfcmVhZGVyX2dhdGUsCisJCQkJCSAgICAgIFNUMjFORkNBX1dSX1hDSEdfREFUQSwgc2tiLT5kYXRhLAorCQkJCQkgICAgICBza2ItPmxlbiwgY2IsIGNiX2NvbnRleHQpOworCWNhc2UgU1QyMU5GQ0FfUkZfUkVBREVSX0lTTzE1NjkzX0dBVEU6CisJCWluZm8tPmFzeW5jX2NiX3R5cGUgPSBTVDIxTkZDQV9DQl9UWVBFX1JFQURFUl9JU08xNTY5MzsKKwkJaW5mby0+YXN5bmNfY2IgPSBjYjsKKwkJaW5mby0+YXN5bmNfY2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisKKwkJKnNrYl9wdXNoKHNrYiwgMSkgPSAweDE3OworCisJCXJldHVybiBuZmNfaGNpX3NlbmRfY21kX2FzeW5jKGhkZXYsIHRhcmdldC0+aGNpX3JlYWRlcl9nYXRlLAorCQkJCQkgICAgICBTVDIxTkZDQV9XUl9YQ0hHX0RBVEEsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgc2tiLT5sZW4sCisJCQkJCSAgICAgIHN0MjFuZmNhX2hjaV9kYXRhX2V4Y2hhbmdlX2NiLAorCQkJCQkgICAgICBpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW50IHN0MjFuZmNhX2hjaV9jaGVja19wcmVzZW5jZShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsCisJCQkJICAgICAgIHN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXQpCit7CisJdTggZndpID0gMHgxMTsKKwlzd2l0Y2ggKHRhcmdldC0+aGNpX3JlYWRlcl9nYXRlKSB7CisJY2FzZSBORkNfSENJX1JGX1JFQURFUl9BX0dBVEU6CisJY2FzZSBORkNfSENJX1JGX1JFQURFUl9CX0dBVEU6CisJCS8qCisJCSAqIFBSRVNFTkNFX0NIRUNLIG9uIHRob3NlIGdhdGVzIGlzIGF2YWlsYWJsZQorCQkgKiBIb3dldmVyLCB0aGUgYW5zd2VyIHRvIHRoaXMgY29tbWFuZCBpcyB0YWtpbmcgMyAqIGZ3aQorCQkgKiBpZiB0aGUgY2FyZCBpcyBubyBwcmVzZW50LgorCQkgKiBJbnN0ZWFkLCB3ZSBzZW5kIGFuIGVtcHR5IEktRnJhbWUgd2l0aCBhIHZlcnkgc2hvcnQKKwkJICogY29uZmlndXJhYmxlIGZ3aSB+NjA0wrVzLgorCQkgKi8KKwkJcmV0dXJuIG5mY19oY2lfc2VuZF9jbWQoaGRldiwgdGFyZ2V0LT5oY2lfcmVhZGVyX2dhdGUsCisJCQkJCVNUMjFORkNBX1dSX1hDSEdfREFUQSwgJmZ3aSwgMSwgTlVMTCk7CisJY2FzZSBTVDIxTkZDQV9SRl9SRUFERVJfMTQ0NDNfM19BX0dBVEU6CisJCXJldHVybiBuZmNfaGNpX3NlbmRfY21kKGhkZXYsIHRhcmdldC0+aGNpX3JlYWRlcl9nYXRlLAorCQkJCQlTVDIxTkZDQV9SRl9SRUFERVJfQ01EX1BSRVNFTkNFX0NIRUNLLAorCQkJCQlOVUxMLCAwLCBOVUxMKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5mY19oY2lfb3BzIHN0MjFuZmNhX2hjaV9vcHMgPSB7CisJLm9wZW4gPSBzdDIxbmZjYV9oY2lfb3BlbiwKKwkuY2xvc2UgPSBzdDIxbmZjYV9oY2lfY2xvc2UsCisJLmxvYWRfc2Vzc2lvbiA9IHN0MjFuZmNhX2hjaV9sb2FkX3Nlc3Npb24sCisJLmhjaV9yZWFkeSA9IHN0MjFuZmNhX2hjaV9yZWFkeSwKKwkueG1pdCA9IHN0MjFuZmNhX2hjaV94bWl0LAorCS5zdGFydF9wb2xsID0gc3QyMW5mY2FfaGNpX3N0YXJ0X3BvbGwsCisJLnRhcmdldF9mcm9tX2dhdGUgPSBzdDIxbmZjYV9oY2lfdGFyZ2V0X2Zyb21fZ2F0ZSwKKwkuaW1fdHJhbnNjZWl2ZSA9IHN0MjFuZmNhX2hjaV9pbV90cmFuc2NlaXZlLAorCS5jaGVja19wcmVzZW5jZSA9IHN0MjFuZmNhX2hjaV9jaGVja19wcmVzZW5jZSwKK307CisKK2ludCBzdDIxbmZjYV9oY2lfcHJvYmUodm9pZCAqcGh5X2lkLCBzdHJ1Y3QgbmZjX3BoeV9vcHMgKnBoeV9vcHMsCisJCSAgICAgICBjaGFyICpsbGNfbmFtZSwgaW50IHBoeV9oZWFkcm9vbSwgaW50IHBoeV90YWlscm9vbSwKKwkJICAgICAgIGludCBwaHlfcGF5bG9hZCwgc3RydWN0IG5mY19oY2lfZGV2ICoqaGRldikKK3sKKwlzdHJ1Y3Qgc3QyMW5mY2FfaGNpX2luZm8gKmluZm87CisJaW50IHIgPSAwOworCWludCBkZXZfbnVtOworCXUzMiBwcm90b2NvbHM7CisJc3RydWN0IG5mY19oY2lfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9IDA7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0MjFuZmNhX2hjaV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19oZGV2OworCX0KKworCWluZm8tPnBoeV9vcHMgPSBwaHlfb3BzOworCWluZm8tPnBoeV9pZCA9IHBoeV9pZDsKKwlpbmZvLT5zdGF0ZSA9IFNUMjFORkNBX1NUX0NPTEQ7CisJbXV0ZXhfaW5pdCgmaW5mby0+aW5mb19sb2NrKTsKKworCWluaXRfZGF0YS5nYXRlX2NvdW50ID0gQVJSQVlfU0laRShzdDIxbmZjYV9nYXRlcyk7CisKKwltZW1jcHkoaW5pdF9kYXRhLmdhdGVzLCBzdDIxbmZjYV9nYXRlcywgc2l6ZW9mKHN0MjFuZmNhX2dhdGVzKSk7CisKKwkvKgorCSAqIFNlc3Npb24gaWQgbXVzdCBpbmNsdWRlIHRoZSBkcml2ZXIgbmFtZSArIGkyYyBidXMgYWRkcgorCSAqIHBlcnNpc3RlbnQgaW5mbyB0byBkaXNjcmltaW5hdGUgMiBpZGVudGljYWwgY2hpcHMKKwkgKi8KKwlkZXZfbnVtID0gZmluZF9maXJzdF96ZXJvX2JpdChkZXZfbWFzaywgU1QyMU5GQ0FfTlVNX0RFVklDRVMpOworCWlmIChkZXZfbnVtID49IFNUMjFORkNBX05VTV9ERVZJQ0VTKQorCQlnb3RvIGVycl9hbGxvY19oZGV2OworCisJc2NucHJpbnRmKGluaXRfZGF0YS5zZXNzaW9uX2lkLCBzaXplb2YoaW5pdF9kYXRhLnNlc3Npb25faWQpLCAiJXMlMngiLAorCQkgICJTVDIxQUgiLCBkZXZfbnVtKTsKKworCXByb3RvY29scyA9IE5GQ19QUk9UT19KRVdFTF9NQVNLIHwKKwkgICAgTkZDX1BST1RPX01JRkFSRV9NQVNLIHwKKwkgICAgTkZDX1BST1RPX0ZFTElDQV9NQVNLIHwKKwkgICAgTkZDX1BST1RPX0lTTzE0NDQzX01BU0sgfAorCSAgICBORkNfUFJPVE9fSVNPMTQ0NDNfQl9NQVNLIHwKKwkgICAgTkZDX1BST1RPX0lTTzE1NjkzX01BU0s7CisKKwlzZXRfYml0KE5GQ19IQ0lfUVVJUktfU0hPUlRfQ0xFQVIsICZxdWlya3MpOworCisJaW5mby0+aGRldiA9CisJICAgIG5mY19oY2lfYWxsb2NhdGVfZGV2aWNlKCZzdDIxbmZjYV9oY2lfb3BzLCAmaW5pdF9kYXRhLCBxdWlya3MsCisJCQkJICAgIHByb3RvY29scywgbGxjX25hbWUsCisJCQkJICAgIHBoeV9oZWFkcm9vbSArIFNUMjFORkNBX0NNRFNfSEVBRFJPT00sCisJCQkJICAgIHBoeV90YWlscm9vbSwgcGh5X3BheWxvYWQpOworCisJaWYgKCFpbmZvLT5oZGV2KSB7CisJCXByX2VycigiQ2Fubm90IGFsbG9jYXRlIG5mYyBoZGV2LlxuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19oZGV2OworCX0KKworCW5mY19oY2lfc2V0X2NsaWVudGRhdGEoaW5mby0+aGRldiwgaW5mbyk7CisKKwlyID0gbmZjX2hjaV9yZWdpc3Rlcl9kZXZpY2UoaW5mby0+aGRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX3JlZ2RldjsKKworCSpoZGV2ID0gaW5mby0+aGRldjsKKworCXJldHVybiAwOworCitlcnJfcmVnZGV2OgorCW5mY19oY2lfZnJlZV9kZXZpY2UoaW5mby0+aGRldik7CisKK2Vycl9hbGxvY19oZGV2OgorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHN0MjFuZmNhX2hjaV9wcm9iZSk7CisKK3ZvaWQgc3QyMW5mY2FfaGNpX3JlbW92ZShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IHN0MjFuZmNhX2hjaV9pbmZvICppbmZvID0gbmZjX2hjaV9nZXRfY2xpZW50ZGF0YShoZGV2KTsKKworCW5mY19oY2lfdW5yZWdpc3Rlcl9kZXZpY2UoaGRldik7CisJbmZjX2hjaV9mcmVlX2RldmljZShoZGV2KTsKKwlrZnJlZShpbmZvKTsKK30KK0VYUE9SVF9TWU1CT0woc3QyMW5mY2FfaGNpX3JlbW92ZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYS5oIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Evc3QyMW5mY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRjZDkwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL3N0MjFuZmNhLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgU1RNaWNyb2VsZWN0cm9uaWNzIFNBUy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19MT0NBTF9TVDIxTkZDQV9IXworI2RlZmluZSBfX0xPQ0FMX1NUMjFORkNBX0hfCisKKyNpbmNsdWRlIDxuZXQvbmZjL2hjaS5oPgorCisjZGVmaW5lIEhDSV9NT0RFIDAKKworLyogZnJhbWluZyBpbiBIQ0kgbW9kZSAqLworI2RlZmluZSBTVDIxTkZDQV9TT0ZfRU9GX0xFTiAgICAyCisKKy8qIEFsbW9zdCBldmVyeSB0aW1lIHZhbHVlIGlzIDAgKi8KKyNkZWZpbmUgU1QyMU5GQ0FfSENJX0xMQ19MRU4gICAgMQorCisvKiBTaXplIGluIHdvcnN0IGNhc2UgOgorICogSW4gbm9ybWFsIGNhc2UgQ1JDIGxlbiA9IDIgYnV0IGJ5dGUgc3R1ZmZpbmcKKyAqIG1heSBhcHBlYXIgaW4gY2FzZSBvbmUgQ1JDIGJ5dGUgPSBTVDIxTkZDQV9TT0ZfRU9GCisgKi8KKyNkZWZpbmUgU1QyMU5GQ0FfSENJX0xMQ19DUkMgICAgNAorCisjZGVmaW5lIFNUMjFORkNBX0hDSV9MTENfTEVOX0NSQyAgICAgICAgKFNUMjFORkNBX1NPRl9FT0ZfTEVOICsgXAorCQkJCQkJU1QyMU5GQ0FfSENJX0xMQ19MRU4gKyBcCisJCQkJCQlTVDIxTkZDQV9IQ0lfTExDX0NSQykKKyNkZWZpbmUgU1QyMU5GQ0FfSENJX0xMQ19NSU5fU0laRSAgICAgICAoMSArIFNUMjFORkNBX0hDSV9MTENfTEVOX0NSQykKKworLyogV29yc3QgY2FzZSB3aGVuIGFkZGluZyBieXRlIHN0dWZmaW5nIGJldHdlZW4gZWFjaCBieXRlICovCisjZGVmaW5lIFNUMjFORkNBX0hDSV9MTENfTUFYX1BBWUxPQUQgICAgMjkKKyNkZWZpbmUgU1QyMU5GQ0FfSENJX0xMQ19NQVhfU0laRSAgICAgICAoU1QyMU5GQ0FfSENJX0xMQ19MRU5fQ1JDICsgMSArIFwKKwkJCQkJU1QyMU5GQ0FfSENJX0xMQ19NQVhfUEFZTE9BRCkKKworI2RlZmluZSBEUklWRVJfREVTQyAiSENJIE5GQyBkcml2ZXIgZm9yIFNUMjFORkNBIgorCisjZGVmaW5lIFNUMjFORkNBX0hDSV9NT0RFIDAKKworI2RlZmluZSBTVDIxTkZDQV9OVU1fREVWSUNFUyAyNTYKKworaW50IHN0MjFuZmNhX2hjaV9wcm9iZSh2b2lkICpwaHlfaWQsIHN0cnVjdCBuZmNfcGh5X29wcyAqcGh5X29wcywKKwkJICAgICAgIGNoYXIgKmxsY19uYW1lLCBpbnQgcGh5X2hlYWRyb29tLCBpbnQgcGh5X3RhaWxyb29tLAorCQkgICAgICAgaW50IHBoeV9wYXlsb2FkLCBzdHJ1Y3QgbmZjX2hjaV9kZXYgKipoZGV2KTsKK3ZvaWQgc3QyMW5mY2FfaGNpX3JlbW92ZShzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpOworCitlbnVtIHN0MjFuZmNhX3N0YXRlIHsKKwlTVDIxTkZDQV9TVF9DT0xELAorCVNUMjFORkNBX1NUX1JFQURZLAorfTsKKworc3RydWN0IHN0MjFuZmNhX2hjaV9pbmZvIHsKKwlzdHJ1Y3QgbmZjX3BoeV9vcHMgKnBoeV9vcHM7CisJdm9pZCAqcGh5X2lkOworCisJc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2OworCisJZW51bSBzdDIxbmZjYV9zdGF0ZSBzdGF0ZTsKKworCXN0cnVjdCBtdXRleCBpbmZvX2xvY2s7CisKKwlpbnQgYXN5bmNfY2JfdHlwZTsKKwlkYXRhX2V4Y2hhbmdlX2NiX3QgYXN5bmNfY2I7CisJdm9pZCAqYXN5bmNfY2JfY29udGV4dDsKKworfSBfX3BhY2tlZDsKKworLyogUmVhZGVyIFJGIGNvbW1hbmRzICovCisjZGVmaW5lIFNUMjFORkNBX1dSX1hDSEdfREFUQSAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBTVDIxTkZDQV9SRl9SRUFERVJfRl9HQVRFICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBTVDIxTkZDQV9SRl9SRUFERVJfRl9EQVRBUkFURSAweDAxCisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl9GX0RBVEFSQVRFXzEwNiAweDAxCisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl9GX0RBVEFSQVRFXzIxMiAweDAyCisjZGVmaW5lIFNUMjFORkNBX1JGX1JFQURFUl9GX0RBVEFSQVRFXzQyNCAweDA0CisKKyNlbmRpZiAvKiBfX0xPQ0FMX1NUMjFORkNBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy90cmY3OTcwYS5jIGIvZHJpdmVycy9uZmMvdHJmNzk3MGEuYwppbmRleCBkOWJhYmU5Li4zYjc4YjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy90cmY3OTcwYS5jCisrKyBiL2RyaXZlcnMvbmZjL3RyZjc5NzBhLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbmZjLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTY3LDE0ICs2OCwxNCBAQAogICogb25seSB0aGUgU1JYIGJpdCBzZXQsIGl0IG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkCiAgKiAob25jZSB3aGF0J3MgaW4gdGhlIGZpZm8gaGFzIGJlZW4gcmVhZCkuICBIb3dldmVyLCBkZXBlbmRpbmcgb24gdGltaW5nCiAgKiBhbiBpbnRlcnJ1cHQgc3RhdHVzIHdpdGggb25seSB0aGUgU1JYIGJpdCBzZXQgbWF5IG5vdCBiZSByZWNpdmVkLiAgSW4KLSAqIHRob3NlIGNhc2VzLCB0aGUgdGltZW91dCBtZWNoYW5pc20gaXMgdXNlZCB0byB3YWl0IDUgbXMgaW4gY2FzZSBtb3JlCi0gKiBkYXRhIGFycml2ZXMuICBBZnRlciA1IG1zLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuCisgKiB0aG9zZSBjYXNlcywgdGhlIHRpbWVvdXQgbWVjaGFuaXNtIGlzIHVzZWQgdG8gd2FpdCAyMCBtcyBpbiBjYXNlIG1vcmUKKyAqIGRhdGEgYXJyaXZlcy4gIEFmdGVyIDIwIG1zLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuCiAgKiByZWNlaXZlZCBhbmQgdGhlIGFjY3VtdWxhdGVkIHJ4IGRhdGEgaXMgc2VudCB1cHN0cmVhbS4gIFRoZQogICogJ1RSRjc5NzBBX1NUX1dBSVRfRk9SX1JYX0RBVEFfQ09OVCcgc3RhdGUgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCiAgKiAoaS5lLiwgaXQgaW5kaWNhdGVzIHRoYXQgc29tZSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB3ZSdyZSBub3Qgc3VyZQogICogaWYgdGhlcmUgaXMgbW9yZSBjb21pbmcgc28gYSB0aW1lb3V0IGluIHRoaXMgc3RhdGUgbWVhbnMgYWxsIGRhdGEgaGFzCi0gKiBiZWVuIHJlY2VpdmVkIGFuZCB0aGVyZSBpc24ndCBhbiBlcnJvcikuICBUaGUgZGVsYXkgaXMgNSBtcyBzaW5jZSBkZWxheXMKLSAqIG92ZXIgMiBtcyBoYXZlIGJlZW4gb2JzZXJ2ZWQgZHVyaW5nIHRlc3RpbmcgKGEgbGl0dGxlIGV4dHJhIGp1c3QgaW4gY2FzZSkuCisgKiBiZWVuIHJlY2VpdmVkIGFuZCB0aGVyZSBpc24ndCBhbiBlcnJvcikuICBUaGUgZGVsYXkgaXMgMjAgbXMgc2luY2UgZGVsYXlzCisgKiBvZiB+MTYgbXMgaGF2ZSBiZWVuIG9ic2VydmVkIGR1cmluZyB0ZXN0aW5nLgogICoKICAqIFR5cGUgMiB3cml0ZSBhbmQgc2VjdG9yIHNlbGVjdCBjb21tYW5kcyByZXNwb25kIHdpdGggYSA0LWJpdCBBQ0sgb3IgTkFDSy4KICAqIEhhdmluZyBvbmx5IDQgYml0cyBpbiB0aGUgRklGTyB3b24ndCBub3JtYWxseSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgc28KQEAgLTEwNCw4ICsxMDUsMTEgQEAKIAogI2RlZmluZSBUUkY3OTcwQV9TVVBQT1JURURfUFJPVE9DT0xTIFwKIAkJKE5GQ19QUk9UT19NSUZBUkVfTUFTSyB8IE5GQ19QUk9UT19JU08xNDQ0M19NQVNLIHwJXAorCQkgTkZDX1BST1RPX0lTTzE0NDQzX0JfTUFTSyB8IE5GQ19QUk9UT19GRUxJQ0FfTUFTSyB8IFwKIAkJIE5GQ19QUk9UT19JU08xNTY5M19NQVNLKQogCisjZGVmaW5lIFRSRjc5NzBBX0FVVE9TVVNQRU5EX0RFTEFZCQkzMDAwMCAvKiAzMCBzZWNvbmRzICovCisKIC8qIFRYIGRhdGEgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIGEgRklGTyByZXNldCBjbWQsIGEgY21kIHRoYXQgZGVwZW5kcwogICogb24gd2hhdCB0aGUgY3VycmVudCBmcmFtaW5nIGlzLCB0aGUgYWRkcmVzcyBvZiB0aGUgVFggbGVuZ3RoIGJ5dGUgMQogICogcmVnaXN0ZXIgKDB4MWQpLCBhbmQgdGhlIDIgYnl0ZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuCkBAIC0xMjAsNyArMTI0LDcgQEAKIC8qIFRYIGxlbmd0aCBpcyAzIG5pYmJsZXMgbG9uZyA9PT4gNEtCIC0gMSBieXRlcyBtYXggKi8KICNkZWZpbmUgVFJGNzk3MEFfVFhfTUFYCQkJCSg0MDk2IC0gMSkKIAotI2RlZmluZSBUUkY3OTcwQV9XQUlUX0ZPUl9SWF9EQVRBX1RJTUVPVVQJNQorI2RlZmluZSBUUkY3OTcwQV9XQUlUX0ZPUl9SWF9EQVRBX1RJTUVPVVQJMjAKICNkZWZpbmUgVFJGNzk3MEFfV0FJVF9GT1JfRklGT19EUkFJTl9USU1FT1VUCTMKICNkZWZpbmUgVFJGNzk3MEFfV0FJVF9UT19JU1NVRV9JU08xNTY5M19FT0YJMjAKIApAQCAtMzMwLDEzICszMzQsMTUgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVndWxhdG9yOwogCXN0cnVjdCBuZmNfZGlnaXRhbF9kZXYJCSpkZGV2OwogCXUzMgkJCQlxdWlya3M7Ci0JYm9vbAkJCQlwb3dlcmluZ191cDsKIAlib29sCQkJCWFib3J0aW5nOwogCXN0cnVjdCBza19idWZmCQkJKnR4X3NrYjsKIAlzdHJ1Y3Qgc2tfYnVmZgkJCSpyeF9za2I7CiAJbmZjX2RpZ2l0YWxfY21kX2NvbXBsZXRlX3QJY2I7CiAJdm9pZAkJCQkqY2JfYXJnOworCXU4CQkJCWNoaXBfc3RhdHVzX2N0cmw7CiAJdTgJCQkJaXNvX2N0cmw7CisJdTgJCQkJaXNvX2N0cmxfdGVjaDsKKwl1OAkJCQltb2R1bGF0b3Jfc3lzX2Nsa19jdHJsOwogCXU4CQkJCXNwZWNpYWxfZmNuX3JlZzE7CiAJaW50CQkJCXRlY2hub2xvZ3k7CiAJaW50CQkJCWZyYW1pbmc7CkBAIC02ODEsNyArNjg3LDkgQEAKIAkJCXRyZi0+aWdub3JlX3RpbWVvdXQgPQogCQkJCSFjYW5jZWxfZGVsYXllZF93b3JrKCZ0cmYtPnRpbWVvdXRfd29yayk7CiAJCQl0cmY3OTcwYV9kcmFpbl9maWZvKHRyZiwgc3RhdHVzKTsKLQkJfSBlbHNlIGlmICghKHN0YXR1cyAmIFRSRjc5NzBBX0lSUV9TVEFUVVNfVFgpKSB7CisJCX0gZWxzZSBpZiAoc3RhdHVzID09IFRSRjc5NzBBX0lSUV9TVEFUVVNfVFgpIHsKKwkJCXRyZjc5NzBhX2NtZCh0cmYsIFRSRjc5NzBBX0NNRF9GSUZPX1JFU0VUKTsKKwkJfSBlbHNlIHsKIAkJCXRyZjc5NzBhX3NlbmRfZXJyX3Vwc3RyZWFtKHRyZiwgLUVJTyk7CiAJCX0KIAkJYnJlYWs7CkBAIC03NTcsOCArNzY1LDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9vdXQ7CiAKLQlyZXQgPSB0cmY3OTcwYV93cml0ZSh0cmYsIFRSRjc5NzBBX01PRFVMQVRPUl9TWVNfQ0xLX0NUUkwsCi0JCQlUUkY3OTcwQV9NT0RVTEFUT1JfREVQVEhfT09LKTsKKwkvKiBNdXN0IGNsZWFyIE5GQyBUYXJnZXQgRGV0ZWN0aW9uIExldmVsIHJlZyBkdWUgdG8gZXJyYXR1bSAqLworCXJldCA9IHRyZjc5NzBhX3dyaXRlKHRyZiwgVFJGNzk3MEFfTkZDX1RBUkdFVF9MRVZFTCwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfb3V0OwogCkBAIC03NzQsMTIgKzc4Miw3IEBACiAKIAl0cmYtPnNwZWNpYWxfZmNuX3JlZzEgPSAwOwogCi0JcmV0ID0gdHJmNzk3MGFfd3JpdGUodHJmLCBUUkY3OTcwQV9DSElQX1NUQVRVU19DVFJMLAotCQkJVFJGNzk3MEFfQ0hJUF9TVEFUVVNfUkZfT04gfAotCQkJCVRSRjc5NzBBX0NISVBfU1RBVFVTX1ZSUzVfMyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OwotCisJdHJmLT5pc29fY3RybCA9IDB4ZmY7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6CkBAIC03OTEsNTMgKzc5NCwyOSBAQAogewogCWRldl9kYmcodHJmLT5kZXYsICJTd2l0Y2hpbmcgcmYgb2ZmXG4iKTsKIAotCWdwaW9fc2V0X3ZhbHVlKHRyZi0+ZW5fZ3BpbywgMCk7Ci0JZ3Bpb19zZXRfdmFsdWUodHJmLT5lbjJfZ3BpbywgMCk7CisJdHJmLT5jaGlwX3N0YXR1c19jdHJsICY9IH5UUkY3OTcwQV9DSElQX1NUQVRVU19SRl9PTjsKKworCXRyZjc5NzBhX3dyaXRlKHRyZiwgVFJGNzk3MEFfQ0hJUF9TVEFUVVNfQ1RSTCwgdHJmLT5jaGlwX3N0YXR1c19jdHJsKTsKIAogCXRyZi0+YWJvcnRpbmcgPSBmYWxzZTsKIAl0cmYtPnN0YXRlID0gVFJGNzk3MEFfU1RfT0ZGOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSh0cmYtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQodHJmLT5kZXYpOwogfQogCi1zdGF0aWMgaW50IHRyZjc5NzBhX3N3aXRjaF9yZl9vbihzdHJ1Y3QgdHJmNzk3MGEgKnRyZikKK3N0YXRpYyB2b2lkIHRyZjc5NzBhX3N3aXRjaF9yZl9vbihzdHJ1Y3QgdHJmNzk3MGEgKnRyZikKIHsKLQl1bnNpZ25lZCBsb25nIGRlbGF5OwotCWludCByZXQ7Ci0KIAlkZXZfZGJnKHRyZi0+ZGV2LCAiU3dpdGNoaW5nIHJmIG9uXG4iKTsKIAotCWlmICh0cmYtPnBvd2VyaW5nX3VwKQotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7CisJcG1fcnVudGltZV9nZXRfc3luYyh0cmYtPmRldik7CiAKLQlncGlvX3NldF92YWx1ZSh0cmYtPmVuMl9ncGlvLCAxKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JZ3Bpb19zZXRfdmFsdWUodHJmLT5lbl9ncGlvLCAxKTsKLQotCS8qIFRoZSBkZWxheSBiZXR3ZWVuIGVuYWJsaW5nIHRoZSB0cmY3OTcwYSBhbmQgaXNzdWluZyB0aGUgZmlyc3QKLQkgKiBjb21tYW5kIGlzIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoZSB2ZXJ5IGZpcnN0IHRpbWUgYWZ0ZXIgcG93ZXJpbmcKLQkgKiB1cC4gIE1ha2Ugc3VyZSB0aGUgbG9uZ2VyIGRlbGF5IGlzIG9ubHkgZG9uZSB0aGUgZmlyc3QgdGltZS4KLQkgKi8KLQlpZiAodHJmLT5wb3dlcmluZ191cCkgewotCQlkZWxheSA9IDIwMDAwOwotCQl0cmYtPnBvd2VyaW5nX3VwID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJZGVsYXkgPSA1MDAwOwotCX0KLQotCXVzbGVlcF9yYW5nZShkZWxheSwgZGVsYXkgKyAxMDAwKTsKLQotCXJldCA9IHRyZjc5NzBhX2luaXQodHJmKTsKLQlpZiAocmV0KQotCQl0cmY3OTcwYV9zd2l0Y2hfcmZfb2ZmKHRyZik7Ci0JZWxzZQotCQl0cmYtPnN0YXRlID0gVFJGNzk3MEFfU1RfSURMRTsKLQotCXJldHVybiByZXQ7CisJdHJmLT5zdGF0ZSA9IFRSRjc5NzBBX1NUX0lETEU7CiB9CiAKIHN0YXRpYyBpbnQgdHJmNzk3MGFfc3dpdGNoX3JmKHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsIGJvb2wgb24pCiB7CiAJc3RydWN0IHRyZjc5NzBhICp0cmYgPSBuZmNfZGlnaXRhbF9nZXRfZHJ2ZGF0YShkZGV2KTsKLQlpbnQgcmV0ID0gMDsKIAogCWRldl9kYmcodHJmLT5kZXYsICJTd2l0Y2hpbmcgUkYgLSBzdGF0ZTogJWQsIG9uOiAlZFxuIiwgdHJmLT5zdGF0ZSwgb24pOwogCkBAIC04NDYsNyArODI1LDcgQEAKIAlpZiAob24pIHsKIAkJc3dpdGNoICh0cmYtPnN0YXRlKSB7CiAJCWNhc2UgVFJGNzk3MEFfU1RfT0ZGOgotCQkJcmV0ID0gdHJmNzk3MGFfc3dpdGNoX3JmX29uKHRyZik7CisJCQl0cmY3OTcwYV9zd2l0Y2hfcmZfb24odHJmKTsKIAkJCWJyZWFrOwogCQljYXNlIFRSRjc5NzBBX1NUX0lETEU6CiAJCWNhc2UgVFJGNzk3MEFfU1RfSURMRV9SWF9CTE9DS0VEOgpAQCAtODcxLDcgKzg1MCw3IEBACiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZ0cmYtPmxvY2spOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHJmNzk3MGFfY29uZmlnX3JmX3RlY2goc3RydWN0IHRyZjc5NzBhICp0cmYsIGludCB0ZWNoKQpAQCAtODgyLDEwICs4NjEsMjQgQEAKIAogCXN3aXRjaCAodGVjaCkgewogCWNhc2UgTkZDX0RJR0lUQUxfUkZfVEVDSF8xMDZBOgotCQl0cmYtPmlzb19jdHJsID0gVFJGNzk3MEFfSVNPX0NUUkxfMTQ0NDNBXzEwNjsKKwkJdHJmLT5pc29fY3RybF90ZWNoID0gVFJGNzk3MEFfSVNPX0NUUkxfMTQ0NDNBXzEwNjsKKwkJdHJmLT5tb2R1bGF0b3Jfc3lzX2Nsa19jdHJsID0gVFJGNzk3MEFfTU9EVUxBVE9SX0RFUFRIX09PSzsKKwkJYnJlYWs7CisJY2FzZSBORkNfRElHSVRBTF9SRl9URUNIXzEwNkI6CisJCXRyZi0+aXNvX2N0cmxfdGVjaCA9IFRSRjc5NzBBX0lTT19DVFJMXzE0NDQzQl8xMDY7CisJCXRyZi0+bW9kdWxhdG9yX3N5c19jbGtfY3RybCA9IFRSRjc5NzBBX01PRFVMQVRPUl9ERVBUSF9BU0sxMDsKKwkJYnJlYWs7CisJY2FzZSBORkNfRElHSVRBTF9SRl9URUNIXzIxMkY6CisJCXRyZi0+aXNvX2N0cmxfdGVjaCA9IFRSRjc5NzBBX0lTT19DVFJMX0ZFTElDQV8yMTI7CisJCXRyZi0+bW9kdWxhdG9yX3N5c19jbGtfY3RybCA9IFRSRjc5NzBBX01PRFVMQVRPUl9ERVBUSF9BU0sxMDsKKwkJYnJlYWs7CisJY2FzZSBORkNfRElHSVRBTF9SRl9URUNIXzQyNEY6CisJCXRyZi0+aXNvX2N0cmxfdGVjaCA9IFRSRjc5NzBBX0lTT19DVFJMX0ZFTElDQV80MjQ7CisJCXRyZi0+bW9kdWxhdG9yX3N5c19jbGtfY3RybCA9IFRSRjc5NzBBX01PRFVMQVRPUl9ERVBUSF9BU0sxMDsKIAkJYnJlYWs7CiAJY2FzZSBORkNfRElHSVRBTF9SRl9URUNIX0lTTzE1NjkzOgotCQl0cmYtPmlzb19jdHJsID0gVFJGNzk3MEFfSVNPX0NUUkxfMTU2OTNfU0dMXzFPRjRfMjY0ODsKKwkJdHJmLT5pc29fY3RybF90ZWNoID0gVFJGNzk3MEFfSVNPX0NUUkxfMTU2OTNfU0dMXzFPRjRfMjY0ODsKKwkJdHJmLT5tb2R1bGF0b3Jfc3lzX2Nsa19jdHJsID0gVFJGNzk3MEFfTU9EVUxBVE9SX0RFUFRIX09PSzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZyh0cmYtPmRldiwgIlVuc3VwcG9ydGVkIHJmIHRlY2hub2xvZ3k6ICVkXG4iLCB0ZWNoKTsKQEAgLTg5OSwyNCArODkyLDMxIEBACiAKIHN0YXRpYyBpbnQgdHJmNzk3MGFfY29uZmlnX2ZyYW1pbmcoc3RydWN0IHRyZjc5NzBhICp0cmYsIGludCBmcmFtaW5nKQogeworCXU4IGlzb19jdHJsID0gdHJmLT5pc29fY3RybF90ZWNoOworCWludCByZXQ7CisKIAlkZXZfZGJnKHRyZi0+ZGV2LCAiZnJhbWluZzogJWRcbiIsIGZyYW1pbmcpOwogCiAJc3dpdGNoIChmcmFtaW5nKSB7CiAJY2FzZSBORkNfRElHSVRBTF9GUkFNSU5HX05GQ0FfU0hPUlQ6CiAJY2FzZSBORkNfRElHSVRBTF9GUkFNSU5HX05GQ0FfU1RBTkRBUkQ6CiAJCXRyZi0+dHhfY21kID0gVFJGNzk3MEFfQ01EX1RSQU5TTUlUX05PX0NSQzsKLQkJdHJmLT5pc29fY3RybCB8PSBUUkY3OTcwQV9JU09fQ1RSTF9SWF9DUkNfTjsKKwkJaXNvX2N0cmwgfD0gVFJGNzk3MEFfSVNPX0NUUkxfUlhfQ1JDX047CiAJCWJyZWFrOwogCWNhc2UgTkZDX0RJR0lUQUxfRlJBTUlOR19ORkNBX1NUQU5EQVJEX1dJVEhfQ1JDX0E6CiAJY2FzZSBORkNfRElHSVRBTF9GUkFNSU5HX05GQ0FfVDRUOgorCWNhc2UgTkZDX0RJR0lUQUxfRlJBTUlOR19ORkNCOgorCWNhc2UgTkZDX0RJR0lUQUxfRlJBTUlOR19ORkNCX1Q0VDoKKwljYXNlIE5GQ19ESUdJVEFMX0ZSQU1JTkdfTkZDRjoKKwljYXNlIE5GQ19ESUdJVEFMX0ZSQU1JTkdfTkZDRl9UM1Q6CiAJY2FzZSBORkNfRElHSVRBTF9GUkFNSU5HX0lTTzE1NjkzX0lOVkVOVE9SWToKIAljYXNlIE5GQ19ESUdJVEFMX0ZSQU1JTkdfSVNPMTU2OTNfVDVUOgogCQl0cmYtPnR4X2NtZCA9IFRSRjc5NzBBX0NNRF9UUkFOU01JVDsKLQkJdHJmLT5pc29fY3RybCAmPSB+VFJGNzk3MEFfSVNPX0NUUkxfUlhfQ1JDX047CisJCWlzb19jdHJsICY9IH5UUkY3OTcwQV9JU09fQ1RSTF9SWF9DUkNfTjsKIAkJYnJlYWs7CiAJY2FzZSBORkNfRElHSVRBTF9GUkFNSU5HX05GQ0FfVDJUOgogCQl0cmYtPnR4X2NtZCA9IFRSRjc5NzBBX0NNRF9UUkFOU01JVDsKLQkJdHJmLT5pc29fY3RybCB8PSBUUkY3OTcwQV9JU09fQ1RSTF9SWF9DUkNfTjsKKwkJaXNvX2N0cmwgfD0gVFJGNzk3MEFfSVNPX0NUUkxfUlhfQ1JDX047CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9kYmcodHJmLT5kZXYsICJVbnN1cHBvcnRlZCBGcmFtaW5nOiAlZFxuIiwgZnJhbWluZyk7CkBAIC05MjUsMjQgKzkyNSw0NiBAQAogCiAJdHJmLT5mcmFtaW5nID0gZnJhbWluZzsKIAotCXJldHVybiB0cmY3OTcwYV93cml0ZSh0cmYsIFRSRjc5NzBBX0lTT19DVFJMLCB0cmYtPmlzb19jdHJsKTsKKwlpZiAoaXNvX2N0cmwgIT0gdHJmLT5pc29fY3RybCkgeworCQlyZXQgPSB0cmY3OTcwYV93cml0ZSh0cmYsIFRSRjc5NzBBX0lTT19DVFJMLCBpc29fY3RybCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXRyZi0+aXNvX2N0cmwgPSBpc29fY3RybDsKKworCQlyZXQgPSB0cmY3OTcwYV93cml0ZSh0cmYsIFRSRjc5NzBBX01PRFVMQVRPUl9TWVNfQ0xLX0NUUkwsCisJCQkJdHJmLT5tb2R1bGF0b3Jfc3lzX2Nsa19jdHJsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCEodHJmLT5jaGlwX3N0YXR1c19jdHJsICYgVFJGNzk3MEFfQ0hJUF9TVEFUVVNfUkZfT04pKSB7CisJCXJldCA9IHRyZjc5NzBhX3dyaXRlKHRyZiwgVFJGNzk3MEFfQ0hJUF9TVEFUVVNfQ1RSTCwKKwkJCQl0cmYtPmNoaXBfc3RhdHVzX2N0cmwgfAorCQkJCQlUUkY3OTcwQV9DSElQX1NUQVRVU19SRl9PTik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXRyZi0+Y2hpcF9zdGF0dXNfY3RybCB8PSBUUkY3OTcwQV9DSElQX1NUQVRVU19SRl9PTjsKKworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHJmNzk3MGFfaW5fY29uZmlndXJlX2h3KHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsIGludCB0eXBlLAogCQlpbnQgcGFyYW0pCiB7CiAJc3RydWN0IHRyZjc5NzBhICp0cmYgPSBuZmNfZGlnaXRhbF9nZXRfZHJ2ZGF0YShkZGV2KTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJZGV2X2RiZyh0cmYtPmRldiwgIkNvbmZpZ3VyZSBodyAtIHR5cGU6ICVkLCBwYXJhbTogJWRcbiIsIHR5cGUsIHBhcmFtKTsKIAogCW11dGV4X2xvY2soJnRyZi0+bG9jayk7CiAKLQlpZiAodHJmLT5zdGF0ZSA9PSBUUkY3OTcwQV9TVF9PRkYpIHsKLQkJcmV0ID0gdHJmNzk3MGFfc3dpdGNoX3JmX29uKHRyZik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9vdXQ7Ci0JfQorCWlmICh0cmYtPnN0YXRlID09IFRSRjc5NzBBX1NUX09GRikKKwkJdHJmNzk3MGFfc3dpdGNoX3JmX29uKHRyZik7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE5GQ19ESUdJVEFMX0NPTkZJR19SRl9URUNIOgpAQCAtOTU2LDcgKzk3OCw2IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCi1lcnJfb3V0OgogCW11dGV4X3VubG9jaygmdHJmLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE5MSw3ICsxMjEyLDE4IEBACiAJZGV2X2RiZyh0cmYtPmRldiwgIkFib3J0IHByb2Nlc3MgaW5pdGlhdGVkXG4iKTsKIAogCW11dGV4X2xvY2soJnRyZi0+bG9jayk7Ci0JdHJmLT5hYm9ydGluZyA9IHRydWU7CisKKwlzd2l0Y2ggKHRyZi0+c3RhdGUpIHsKKwljYXNlIFRSRjc5NzBBX1NUX1dBSVRfRk9SX1RYX0ZJRk86CisJY2FzZSBUUkY3OTcwQV9TVF9XQUlUX0ZPUl9SWF9EQVRBOgorCWNhc2UgVFJGNzk3MEFfU1RfV0FJVF9GT1JfUlhfREFUQV9DT05UOgorCWNhc2UgVFJGNzk3MEFfU1RfV0FJVF9UT19JU1NVRV9FT0Y6CisJCXRyZi0+YWJvcnRpbmcgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAltdXRleF91bmxvY2soJnRyZi0+bG9jayk7CiB9CiAKQEAgLTEyMDYsMTIgKzEyMzgsMjUgQEAKIAkuYWJvcnRfY21kCQk9IHRyZjc5NzBhX2Fib3J0X2NtZCwKIH07CiAKK3N0YXRpYyBpbnQgdHJmNzk3MGFfZ2V0X2F1dG9zdXNwZW5kX2RlbGF5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJaW50IGF1dG9zdXNwZW5kX2RlbGF5LCByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF1dG9zdXNwZW5kLWRlbGF5IiwgJmF1dG9zdXNwZW5kX2RlbGF5KTsKKwlpZiAocmV0KQorCQlhdXRvc3VzcGVuZF9kZWxheSA9IFRSRjc5NzBBX0FVVE9TVVNQRU5EX0RFTEFZOworCisJb2Zfbm9kZV9wdXQobnApOworCisJcmV0dXJuIGF1dG9zdXNwZW5kX2RlbGF5OworfQorCiBzdGF0aWMgaW50IHRyZjc5NzBhX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHNwaS0+ZGV2Lm9mX25vZGU7CiAJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKIAlzdHJ1Y3QgdHJmNzk3MGEgKnRyZjsKLQlpbnQgcmV0OworCWludCB1dm9sdHMsIGF1dG9zdXNwZW5kX2RlbGF5LCByZXQ7CiAKIAlpZiAoIW5wKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiTm8gRGV2aWNlIFRyZWUgZW50cnlcbiIpOwpAQCAtMTI4MSw3ICsxMzI2LDEwIEBACiAJCWdvdG8gZXJyX2Rlc3Ryb3lfbG9jazsKIAl9CiAKLQl0cmYtPnBvd2VyaW5nX3VwID0gdHJ1ZTsKKwl1dm9sdHMgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UodHJmLT5yZWd1bGF0b3IpOworCisJaWYgKHV2b2x0cyA+IDQwMDAwMDApCisJCXRyZi0+Y2hpcF9zdGF0dXNfY3RybCA9IFRSRjc5NzBBX0NISVBfU1RBVFVTX1ZSUzVfMzsKIAogCXRyZi0+ZGRldiA9IG5mY19kaWdpdGFsX2FsbG9jYXRlX2RldmljZSgmdHJmNzk3MGFfbmZjX29wcywKIAkJCVRSRjc5NzBBX1NVUFBPUlRFRF9QUk9UT0NPTFMsCkBAIC0xMjk3LDYgKzEzNDUsMTIgQEAKIAluZmNfZGlnaXRhbF9zZXRfZHJ2ZGF0YSh0cmYtPmRkZXYsIHRyZik7CiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgdHJmKTsKIAorCWF1dG9zdXNwZW5kX2RlbGF5ID0gdHJmNzk3MGFfZ2V0X2F1dG9zdXNwZW5kX2RlbGF5KG5wKTsKKworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KHRyZi0+ZGV2LCBhdXRvc3VzcGVuZF9kZWxheSk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQodHJmLT5kZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKHRyZi0+ZGV2KTsKKwogCXJldCA9IG5mY19kaWdpdGFsX3JlZ2lzdGVyX2RldmljZSh0cmYtPmRkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycih0cmYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIE5GQyBkaWdpdGFsIGRldmljZTogJWRcbiIsCkBAIC0xMzA3LDYgKzEzNjEsNyBAQAogCXJldHVybiAwOwogCiBlcnJfZnJlZV9kZGV2OgorCXBtX3J1bnRpbWVfZGlzYWJsZSh0cmYtPmRldik7CiAJbmZjX2RpZ2l0YWxfZnJlZV9kZXZpY2UodHJmLT5kZGV2KTsKIGVycl9kaXNhYmxlX3JlZ3VsYXRvcjoKIAlyZWd1bGF0b3JfZGlzYWJsZSh0cmYtPnJlZ3VsYXRvcik7CkBAIC0xMzIxLDE1ICsxMzc2LDE2IEBACiAKIAltdXRleF9sb2NrKCZ0cmYtPmxvY2spOwogCi0JdHJmNzk3MGFfc3dpdGNoX3JmX29mZih0cmYpOwotCXRyZjc5NzBhX2luaXQodHJmKTsKLQogCXN3aXRjaCAodHJmLT5zdGF0ZSkgewogCWNhc2UgVFJGNzk3MEFfU1RfV0FJVF9GT1JfVFhfRklGTzoKIAljYXNlIFRSRjc5NzBBX1NUX1dBSVRfRk9SX1JYX0RBVEE6CiAJY2FzZSBUUkY3OTcwQV9TVF9XQUlUX0ZPUl9SWF9EQVRBX0NPTlQ6CiAJY2FzZSBUUkY3OTcwQV9TVF9XQUlUX1RPX0lTU1VFX0VPRjoKIAkJdHJmNzk3MGFfc2VuZF9lcnJfdXBzdHJlYW0odHJmLCAtRUNBTkNFTEVEKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFRSRjc5NzBBX1NUX0lETEU6CisJY2FzZSBUUkY3OTcwQV9TVF9JRExFX1JYX0JMT0NLRUQ6CisJCXBtX3J1bnRpbWVfcHV0X3N5bmModHJmLT5kZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEzMzcsNiArMTM5Myw4IEBACiAKIAltdXRleF91bmxvY2soJnRyZi0+bG9jayk7CiAKKwlwbV9ydW50aW1lX2Rpc2FibGUodHJmLT5kZXYpOworCiAJbmZjX2RpZ2l0YWxfdW5yZWdpc3Rlcl9kZXZpY2UodHJmLT5kZGV2KTsKIAluZmNfZGlnaXRhbF9mcmVlX2RldmljZSh0cmYtPmRkZXYpOwogCkBAIC0xMzQ3LDYgKzE0MDUsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHRyZjc5NzBhX3BtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzcGlfZGV2aWNlLCBkZXYpOworCXN0cnVjdCB0cmY3OTcwYSAqdHJmID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAiUnVudGltZSBzdXNwZW5kXG4iKTsKKworCWlmICh0cmYtPnN0YXRlICE9IFRSRjc5NzBBX1NUX09GRikgeworCQlkZXZfZGJnKGRldiwgIkNhbid0IHN1c3BlbmQgLSBub3QgaW4gT0ZGIHN0YXRlICglZClcbiIsCisJCQkJdHJmLT5zdGF0ZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZ3Bpb19zZXRfdmFsdWUodHJmLT5lbl9ncGlvLCAwKTsKKwlncGlvX3NldF92YWx1ZSh0cmYtPmVuMl9ncGlvLCAwKTsKKworCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKHRyZi0+cmVndWxhdG9yKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgIiVzIC0gQ2FuJ3QgZGlzYWJsZSBWSU46ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHJmNzk3MGFfcG1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3BpX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgdHJmNzk3MGEgKnRyZiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIlJ1bnRpbWUgcmVzdW1lXG4iKTsKKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUodHJmLT5yZWd1bGF0b3IpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlcyAtIENhbid0IGVuYWJsZSBWSU46ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7CisKKwlncGlvX3NldF92YWx1ZSh0cmYtPmVuMl9ncGlvLCAxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJZ3Bpb19zZXRfdmFsdWUodHJmLT5lbl9ncGlvLCAxKTsKKworCXVzbGVlcF9yYW5nZSgyMDAwMCwgMjEwMDApOworCisJcmV0ID0gdHJmNzk3MGFfaW5pdCh0cmYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlcyAtIENhbid0IGluaXRpYWxpemU6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdHJmNzk3MGFfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyh0cmY3OTcwYV9wbV9ydW50aW1lX3N1c3BlbmQsCisJCQl0cmY3OTcwYV9wbV9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCB0cmY3OTcwYV9pZF90YWJsZVtdID0gewogCXsgInRyZjc5NzBhIiwgVFJGNzk3MEFfUVVJUktfSVJRX1NUQVRVU19SRUFEX0VSUkFUQSB9LAogCXsgfQpAQCAtMTM2MCw2ICsxNDgyLDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAidHJmNzk3MGEiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnRyZjc5NzBhX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9tZGlvLmMgYi9kcml2ZXJzL29mL29mX21kaW8uYwppbmRleCA5YTk1ODMxLi5mYjRhNTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX21kaW8uYworKysgYi9kcml2ZXJzL29mL29mX21kaW8uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeV9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgpAQCAtMjIsMjcgKzIzLDYgQEAKIE1PRFVMRV9BVVRIT1IoIkdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIHZvaWQgb2Zfc2V0X3BoeV9zdXBwb3J0ZWQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTMyIG1heF9zcGVlZCkKLXsKLQkvKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBoeWRldi0+c3VwcG9ydGVkIGFyZSBwcm92aWRlZCBieSB0aGUgUEhZCi0JICogZHJpdmVyICJmZWF0dXJlcyIgbWVtYmVyLCB3ZSB3YW50IHRvIHJlc2V0IHRvIHNhbmUgZGVmYXVsdHMgZmlzdAotCSAqIGJlZm9yZSBzdXBwb3J0aW5nIGhpZ2hlciBzcGVlZHMuCi0JICovCi0JcGh5ZGV2LT5zdXBwb3J0ZWQgJj0gUEhZX0RFRkFVTFRfRkVBVFVSRVM7Ci0KLQlzd2l0Y2ggKG1heF9zcGVlZCkgewotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQotCWNhc2UgU1BFRURfMTAwMDoKLQkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gUEhZXzEwMDBCVF9GRUFUVVJFUzsKLQljYXNlIFNQRUVEXzEwMDoKLQkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gUEhZXzEwMEJUX0ZFQVRVUkVTOwotCWNhc2UgU1BFRURfMTA6Ci0JCXBoeWRldi0+c3VwcG9ydGVkIHw9IFBIWV8xMEJUX0ZFQVRVUkVTOwotCX0KLX0KLQogLyogRXh0cmFjdCB0aGUgY2xhdXNlIDIyIHBoeSBJRCBmcm9tIHRoZSBjb21wYXRpYmxlIHN0cmluZyBvZiB0aGUgZm9ybQogICogZXRoZXJuZXQtcGh5LWlkQUFBQS5CQkJCICovCiBzdGF0aWMgaW50IG9mX2dldF9waHlfaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIHUzMiAqcGh5X2lkKQpAQCAtNjYsNyArNDYsNiBAQAogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHk7CiAJYm9vbCBpc19jNDU7CiAJaW50IHJjOwotCXUzMiBtYXhfc3BlZWQgPSAwOwogCXUzMiBwaHlfaWQ7CiAKIAlpc19jNDUgPSBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwKQEAgLTEwMywxNyArODIsMzMgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogU2V0IHBoeWRldi0+c3VwcG9ydGVkIGJhc2VkIG9uIHRoZSAibWF4LXNwZWVkIiBwcm9wZXJ0eQotCSAqIGlmIHByZXNlbnQgKi8KLQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAibWF4LXNwZWVkIiwgJm1heF9zcGVlZCkpCi0JCW9mX3NldF9waHlfc3VwcG9ydGVkKHBoeSwgbWF4X3NwZWVkKTsKLQogCWRldl9kYmcoJm1kaW8tPmRldiwgInJlZ2lzdGVyZWQgcGh5ICVzIGF0IGFkZHJlc3MgJWlcbiIsCiAJCWNoaWxkLT5uYW1lLCBhZGRyKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9mX21kaW9fcGFyc2VfYWRkcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdTMyIGFkZHI7CisJaW50IHJldDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicmVnIiwgJmFkZHIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgaGFzIGludmFsaWQgUEhZIGFkZHJlc3NcbiIsIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEEgUEhZIG11c3QgaGF2ZSBhIHJlZyBwcm9wZXJ0eSBpbiB0aGUgcmFuZ2UgWzAtMzFdICovCisJaWYgKGFkZHIgPj0gUEhZX01BWF9BRERSKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgUEhZIGFkZHJlc3MgJWkgaXMgdG9vIGxhcmdlXG4iLAorCQkJbnAtPmZ1bGxfbmFtZSwgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBhZGRyOworfQorCiAvKioKICAqIG9mX21kaW9idXNfcmVnaXN0ZXIgLSBSZWdpc3RlciBtaWlfYnVzIGFuZCBjcmVhdGUgUEhZcyBmcm9tIHRoZSBkZXZpY2UgdHJlZQogICogQG1kaW86IHBvaW50ZXIgdG8gbWlpX2J1cyBzdHJ1Y3R1cmUKQEAgLTEyNiw5ICsxMjEsOCBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CiAJY29uc3QgX19iZTMyICpwYWRkcjsKLQl1MzIgYWRkcjsKIAlib29sIHNjYW5waHlzID0gZmFsc2U7Ci0JaW50IHJjLCBpLCBsZW47CisJaW50IGFkZHIsIHJjLCBpOwogCiAJLyogTWFzayBvdXQgYWxsIFBIWXMgZnJvbSBhdXRvIHByb2JpbmcuICBJbnN0ZWFkIHRoZSBQSFlzIGxpc3RlZCBpbgogCSAqIHRoZSBkZXZpY2UgdHJlZSBhcmUgcG9wdWxhdGVkIGFmdGVyIHRoZSBidXMgaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLwpAQCAtMTQ4LDE5ICsxNDIsOSBAQAogCiAJLyogTG9vcCBvdmVyIHRoZSBjaGlsZCBub2RlcyBhbmQgcmVnaXN0ZXIgYSBwaHlfZGV2aWNlIGZvciBlYWNoIG9uZSAqLwogCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkgewotCQkvKiBBIFBIWSBtdXN0IGhhdmUgYSByZWcgcHJvcGVydHkgaW4gdGhlIHJhbmdlIFswLTMxXSAqLwotCQlwYWRkciA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsICZsZW4pOwotCQlpZiAoIXBhZGRyIHx8IGxlbiA8IHNpemVvZigqcGFkZHIpKSB7CisJCWFkZHIgPSBvZl9tZGlvX3BhcnNlX2FkZHIoJm1kaW8tPmRldiwgY2hpbGQpOworCQlpZiAoYWRkciA8IDApIHsKIAkJCXNjYW5waHlzID0gdHJ1ZTsKLQkJCWRldl9lcnIoJm1kaW8tPmRldiwgIiVzIGhhcyBpbnZhbGlkIFBIWSBhZGRyZXNzXG4iLAotCQkJCWNoaWxkLT5mdWxsX25hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlhZGRyID0gYmUzMl90b19jcHVwKHBhZGRyKTsKLQkJaWYgKGFkZHIgPj0gUEhZX01BWF9BRERSKSB7Ci0JCQlkZXZfZXJyKCZtZGlvLT5kZXYsICIlcyBQSFkgYWRkcmVzcyAlaSBpcyB0b28gbGFyZ2VcbiIsCi0JCQkJY2hpbGQtPmZ1bGxfbmFtZSwgYWRkcik7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xNzUsNyArMTU5LDcgQEAKIAkvKiBhdXRvIHNjYW4gZm9yIFBIWXMgd2l0aCBlbXB0eSByZWcgcHJvcGVydHkgKi8KIAlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKIAkJLyogU2tpcCBQSFlzIHdpdGggcmVnIHByb3BlcnR5IHNldCAqLwotCQlwYWRkciA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsICZsZW4pOworCQlwYWRkciA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsIE5VTEwpOwogCQlpZiAocGFkZHIpCiAJCQljb250aW51ZTsKIApAQCAtMTk4LDYgKzE4Miw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9tZGlvYnVzX3JlZ2lzdGVyKTsKIAorLyoqCisgKiBvZl9tZGlvYnVzX2xpbmtfcGh5ZGV2IC0gRmluZCBhIGRldmljZSBub2RlIGZvciBhIHBoeQorICogQG1kaW86IHBvaW50ZXIgdG8gbWlpX2J1cyBzdHJ1Y3R1cmUKKyAqIEBwaHlkZXY6IHBoeWRldiBmb3Igd2hpY2ggdGhlIG9mX25vZGUgcG9pbnRlciBzaG91bGQgYmUgc2V0CisgKgorICogV2FsayB0aGUgbGlzdCBvZiBzdWJub2RlcyBvZiBhIG1kaW8gYnVzIGFuZCBsb29rIGZvciBhIG5vZGUgdGhhdCBtYXRjaGVzIHRoZQorICogcGh5J3MgYWRkcmVzcyB3aXRoIGl0cyAncmVnJyBwcm9wZXJ0eS4gSWYgZm91bmQsIHNldCB0aGUgb2Zfbm9kZSBwb2ludGVyIGZvcgorICogdGhlIHBoeS4gVGhpcyBhbGxvd3MgYXV0by1wcm9iZWQgcHloIGRldmljZXMgdG8gYmUgc3VwcGxpZWQgd2l0aCBpbmZvcm1hdGlvbgorICogcGFzc2VkIGluIHZpYSBEVC4KKyAqLwordm9pZCBvZl9tZGlvYnVzX2xpbmtfcGh5ZGV2KHN0cnVjdCBtaWlfYnVzICptZGlvLAorCQkJICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBoeWRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CisKKwlpZiAoZGV2LT5vZl9ub2RlIHx8ICFtZGlvLT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobWRpby0+ZGV2Lm9mX25vZGUsIGNoaWxkKSB7CisJCWludCBhZGRyOworCisJCWFkZHIgPSBvZl9tZGlvX3BhcnNlX2FkZHIoJm1kaW8tPmRldiwgY2hpbGQpOworCQlpZiAoYWRkciA8IDApCisJCQljb250aW51ZTsKKworCQlpZiAoYWRkciA9PSBwaHlkZXYtPmFkZHIpIHsKKwkJCWRldi0+b2Zfbm9kZSA9IGNoaWxkOworCQkJcmV0dXJuOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChvZl9tZGlvYnVzX2xpbmtfcGh5ZGV2KTsKKwogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBvZl9waHlfZmluZF9kZXZpY2UgKi8KIHN0YXRpYyBpbnQgb2ZfcGh5X21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcGh5X25wKQogewpAQCAtMjQ1LDQ0ICsyNjMsNiBAQAogRVhQT1JUX1NZTUJPTChvZl9waHlfY29ubmVjdCk7CiAKIC8qKgotICogb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayAtIFBhcnNlIGZpeGVkLWxpbmsgcHJvcGVydHkgYW5kIHJldHVybiBhIGR1bW15IHBoeQotICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlIGNsYWltaW5nIHRoZSBwaHkKLSAqIEBobmRscjogTGluayBzdGF0ZSBjYWxsYmFjayBmb3IgdGhlIG5ldHdvcmsgZGV2aWNlCi0gKiBAaWZhY2U6IFBIWSBkYXRhIGludGVyZmFjZSB0eXBlCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBhIHRlbXBvcmFyeSBzdG9wLWdhcCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uICBJdCBpcwotICogb25seSB0byBzdXBwb3J0IHRoZSBmc19lbmV0LCB1Y2NfZ2V0aCBhbmQgZ2lhbmZhciBFdGhlcm5ldCBkcml2ZXJzLiAgRG8KLSAqIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBuZXcgZHJpdmVycy4KLSAqLwotc3RydWN0IHBoeV9kZXZpY2UgKm9mX3BoeV9jb25uZWN0X2ZpeGVkX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICB2b2lkICgqaG5kbHIpKHN0cnVjdCBuZXRfZGV2aWNlICopLAotCQkJCQkgICAgIHBoeV9pbnRlcmZhY2VfdCBpZmFjZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5ldF9ucDsKLQljaGFyIGJ1c19pZFtNSUlfQlVTX0lEX1NJWkUgKyAzXTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5OwotCWNvbnN0IF9fYmUzMiAqcGh5X2lkOwotCWludCBzejsKLQotCWlmICghZGV2LT5kZXYucGFyZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCW5ldF9ucCA9IGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZTsKLQlpZiAoIW5ldF9ucCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkobmV0X25wLCAiZml4ZWQtbGluayIsICZzeik7Ci0JaWYgKCFwaHlfaWQgfHwgc3ogPCBzaXplb2YoKnBoeV9pZCkpCi0JCXJldHVybiBOVUxMOwotCi0Jc3ByaW50ZihidXNfaWQsIFBIWV9JRF9GTVQsICJmaXhlZC0wIiwgYmUzMl90b19jcHUocGh5X2lkWzBdKSk7Ci0KLQlwaHkgPSBwaHlfY29ubmVjdChkZXYsIGJ1c19pZCwgaG5kbHIsIGlmYWNlKTsKLQlyZXR1cm4gSVNfRVJSKHBoeSkgPyBOVUxMIDogcGh5OwotfQotRVhQT1JUX1NZTUJPTChvZl9waHlfY29ubmVjdF9maXhlZF9saW5rKTsKLQotLyoqCiAgKiBvZl9waHlfYXR0YWNoIC0gQXR0YWNoIHRvIGEgUEhZIHdpdGhvdXQgc3RhcnRpbmcgdGhlIHN0YXRlIG1hY2hpbmUKICAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZSBjbGFpbWluZyB0aGUgcGh5CiAgKiBAcGh5X25wOiBOb2RlIHBvaW50ZXIgZm9yIHRoZSBQSFkKQEAgLTMwMSwzICsyODEsNjkgQEAKIAlyZXR1cm4gcGh5X2F0dGFjaF9kaXJlY3QoZGV2LCBwaHksIGZsYWdzLCBpZmFjZSkgPyBOVUxMIDogcGh5OwogfQogRVhQT1JUX1NZTUJPTChvZl9waHlfYXR0YWNoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZJWEVEX1BIWSkKKy8qCisgKiBvZl9waHlfaXNfZml4ZWRfbGluaygpIGFuZCBvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluaygpIG11c3QKKyAqIHN1cHBvcnQgdHdvIERUIGJpbmRpbmdzOgorICogLSB0aGUgb2xkIERUIGJpbmRpbmcsIHdoZXJlICdmaXhlZC1saW5rJyB3YXMgYSBwcm9wZXJ0eSB3aXRoIDUKKyAqICAgY2VsbHMgZW5jb2RpbmcgdmFyaW91cyBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIGZpeGVkIFBIWQorICogLSB0aGUgbmV3IERUIGJpbmRpbmcsIHdoZXJlICdmaXhlZC1saW5rJyBpcyBhIHN1Yi1ub2RlIG9mIHRoZQorICogICBFdGhlcm5ldCBkZXZpY2UuCisgKi8KK2Jvb2wgb2ZfcGh5X2lzX2ZpeGVkX2xpbmsoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCWludCBsZW47CisKKwkvKiBOZXcgYmluZGluZyAqLworCWRuID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJmaXhlZC1saW5rIik7CisJaWYgKGRuKSB7CisJCW9mX25vZGVfcHV0KGRuKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogT2xkIGJpbmRpbmcgKi8KKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZml4ZWQtbGluayIsICZsZW4pICYmCisJICAgIGxlbiA9PSAoNSAqIHNpemVvZihfX2JlMzIpKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3BoeV9pc19maXhlZF9saW5rKTsKKworaW50IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgc3RhdHVzID0ge307CisJc3RydWN0IGRldmljZV9ub2RlICpmaXhlZF9saW5rX25vZGU7CisJY29uc3QgX19iZTMyICpmaXhlZF9saW5rX3Byb3A7CisJaW50IGxlbjsKKworCS8qIE5ldyBiaW5kaW5nICovCisJZml4ZWRfbGlua19ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJmaXhlZC1saW5rIik7CisJaWYgKGZpeGVkX2xpbmtfbm9kZSkgeworCQlzdGF0dXMubGluayA9IDE7CisJCXN0YXR1cy5kdXBsZXggPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmdWxsLWR1cGxleCIpOworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZml4ZWRfbGlua19ub2RlLCAic3BlZWQiLCAmc3RhdHVzLnNwZWVkKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzdGF0dXMucGF1c2UgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJwYXVzZSIpOworCQlzdGF0dXMuYXN5bV9wYXVzZSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImFzeW0tcGF1c2UiKTsKKwkJb2Zfbm9kZV9wdXQoZml4ZWRfbGlua19ub2RlKTsKKwkJcmV0dXJuIGZpeGVkX3BoeV9yZWdpc3RlcihQSFlfUE9MTCwgJnN0YXR1cywgbnApOworCX0KKworCS8qIE9sZCBiaW5kaW5nICovCisJZml4ZWRfbGlua19wcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZml4ZWQtbGluayIsICZsZW4pOworCWlmIChmaXhlZF9saW5rX3Byb3AgJiYgbGVuID09ICg1ICogc2l6ZW9mKF9fYmUzMikpKSB7CisJCXN0YXR1cy5saW5rID0gMTsKKwkJc3RhdHVzLmR1cGxleCA9IGJlMzJfdG9fY3B1KGZpeGVkX2xpbmtfcHJvcFsxXSk7CisJCXN0YXR1cy5zcGVlZCA9IGJlMzJfdG9fY3B1KGZpeGVkX2xpbmtfcHJvcFsyXSk7CisJCXN0YXR1cy5wYXVzZSA9IGJlMzJfdG9fY3B1KGZpeGVkX2xpbmtfcHJvcFszXSk7CisJCXN0YXR1cy5hc3ltX3BhdXNlID0gYmUzMl90b19jcHUoZml4ZWRfbGlua19wcm9wWzRdKTsKKwkJcmV0dXJuIGZpeGVkX3BoeV9yZWdpc3RlcihQSFlfUE9MTCwgJnN0YXR1cywgbnApOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTChvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluayk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2FjY2Vzcy5jIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKaW5kZXggOGMxNDhmMy4uZDI5MmQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYWNjZXNzLmMKKysrIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKQEAgLTIzMSwxMCArMjMxLDcgQEAKIAkJfQogCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwKLQkJCQkgICAidnBkIHIvdyBmYWlsZWQuICBUaGlzIGlzIGxpa2VseSBhIGZpcm13YXJlICIKLQkJCQkgICAiYnVnIG9uIHRoaXMgZGV2aWNlLiAgQ29udGFjdCB0aGUgY2FyZCAiCi0JCQkJICAgInZlbmRvciBmb3IgYSBmaXJtd2FyZSB1cGRhdGUuIik7CisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgInZwZCByL3cgZmFpbGVkLiAgVGhpcyBpcyBsaWtlbHkgYSBmaXJtd2FyZSBidWcgb24gdGhpcyBkZXZpY2UuICBDb250YWN0IHRoZSBjYXJkIHZlbmRvciBmb3IgYSBmaXJtd2FyZSB1cGRhdGVcbiIpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCA0NDdkMzkzLi43M2FlZjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtMjI2LDYgKzIyNiw3IEBACiAJCQkJCSB0eXBlX21hc2ssIGFsaWduZiwgYWxpZ25mX2RhdGEsCiAJCQkJCSAmcGNpXzMyX2JpdCk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9idXNfYWxsb2NfcmVzb3VyY2UpOwogCiB2b2lkIF9fd2VhayBwY2liaW9zX3Jlc291cmNlX3N1cnZleV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CiAKQEAgLTI1Myw2ICsyNTQsNyBAQAogCiAJZGV2LT5pc19hZGRlZCA9IDE7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfYnVzX2FkZF9kZXZpY2UpOwogCiAvKioKICAqIHBjaV9idXNfYWRkX2RldmljZXMgLSBzdGFydCBkcml2ZXIgZm9yIFBDSSBkZXZpY2VzCkBAIC0yNzksNiArMjgxLDcgQEAKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wocGNpX2J1c19hZGRfZGV2aWNlcyk7CiAKIC8qKiBwY2lfd2Fsa19idXMgLSB3YWxrIGRldmljZXMgb24vdW5kZXIgYnVzLCBjYWxsaW5nIGNhbGxiYWNrLgogICogIEB0b3AgICAgICBidXMgd2hvc2UgZGV2aWNlcyBzaG91bGQgYmUgd2Fsa2VkCkBAIC0zNDQsNiArMzQ3LDMgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2J1c19wdXQpOwogCi1FWFBPUlRfU1lNQk9MKHBjaV9idXNfYWxsb2NfcmVzb3VyY2UpOwotRVhQT1JUX1NZTUJPTF9HUEwocGNpX2J1c19hZGRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wocGNpX2J1c19hZGRfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1leHlub3MuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCmluZGV4IDE2MzI2NjEuLmM1ZDBjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCkBAIC01NDUsNyArNTQ1LDYgQEAKIAlwcC0+cm9vdF9idXNfbnIgPSAtMTsKIAlwcC0+b3BzID0gJmV4eW5vc19wY2llX2hvc3Rfb3BzOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBwLT5jb25mX2xvY2spOwogCXJldCA9IGR3X3BjaWVfaG9zdF9pbml0KHBwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGhvc3RcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCmluZGV4IGE1NjQ1YWUuLmE1NjhlZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMKQEAgLTUwNyw3ICs1MDcsNiBAQAogCXBwLT5yb290X2J1c19uciA9IC0xOwogCXBwLT5vcHMgPSAmaW14Nl9wY2llX2hvc3Rfb3BzOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBwLT5jb25mX2xvY2spOwogCXJldCA9IGR3X3BjaWVfaG9zdF9pbml0KHBwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGhvc3RcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW12ZWJ1LmMKaW5kZXggZTM4NGUyNS4uY2UyM2UwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jCkBAIC0xMTMsNyArMTEzLDYgQEAKIHN0cnVjdCBtdmVidV9wY2llX3BvcnQgewogCWNoYXIgKm5hbWU7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXNwaW5sb2NrX3QgY29uZl9sb2NrOwogCXUzMiBwb3J0OwogCXUzMiBsYW5lOwogCWludCBkZXZmbjsKQEAgLTMyOSw5ICszMjgsMTEgQEAKIAkJcmV0ID0gbXZlYnVfbWJ1c19hZGRfd2luZG93X3JlbWFwX2J5X2lkKHRhcmdldCwgYXR0cmlidXRlLCBiYXNlLAogCQkJCQkJCXN6LCByZW1hcCk7CiAJCWlmIChyZXQpIHsKKwkJCXBoeXNfYWRkcl90IGVuZCA9IGJhc2UgKyBzeiAtIDE7CisKIAkJCWRldl9lcnIoJnBvcnQtPnBjaWUtPnBkZXYtPmRldiwKLQkJCQkiQ291bGQgbm90IGNyZWF0ZSBNQnVzIHdpbmRvdyBhdCAweCV4LCBzaXplIDB4JXg6ICVkXG4iLAotCQkJCWJhc2UsIHN6LCByZXQpOworCQkJCSJDb3VsZCBub3QgY3JlYXRlIE1CdXMgd2luZG93IGF0IFttZW0gJXBhLSVwYV06ICVkXG4iLAorCQkJCSZiYXNlLCAmZW5kLCByZXQpOwogCQkJbXZlYnVfcGNpZV9kZWxfd2luZG93cyhwb3J0LCBiYXNlIC0gc2l6ZV9tYXBwZWQsCiAJCQkJCSAgICAgICBzaXplX21hcHBlZCk7CiAJCQlyZXR1cm47CkBAIC02MTMsOSArNjE0LDkgQEAKIAlyZXR1cm4gc3lzLT5wcml2YXRlX2RhdGE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICoKLW12ZWJ1X3BjaWVfZmluZF9wb3J0KHN0cnVjdCBtdmVidV9wY2llICpwY2llLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAotCQkgICAgIGludCBkZXZmbikKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICptdmVidV9wY2llX2ZpbmRfcG9ydChzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSwKKwkJCQkJCSAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQkJICAgIGludCBkZXZmbikKIHsKIAlpbnQgaTsKIApAQCAtNjM4LDcgKzYzOSw2IEBACiB7CiAJc3RydWN0IG12ZWJ1X3BjaWUgKnBjaWUgPSBzeXNfdG9fcGNpZShidXMtPnN5c2RhdGEpOwogCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJcG9ydCA9IG12ZWJ1X3BjaWVfZmluZF9wb3J0KHBjaWUsIGJ1cywgZGV2Zm4pOwpAQCAtNjY0LDEwICs2NjQsOCBAQAogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJLyogQWNjZXNzIHRoZSByZWFsIFBDSWUgaW50ZXJmYWNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmNvbmZfbG9jaywgZmxhZ3MpOwogCXJldCA9IG12ZWJ1X3BjaWVfaHdfd3JfY29uZihwb3J0LCBidXMsIGRldmZuLAogCQkJCSAgICB3aGVyZSwgc2l6ZSwgdmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5jb25mX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02NzgsNyArNjc2LDYgQEAKIHsKIAlzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSA9IHN5c190b19wY2llKGJ1cy0+c3lzZGF0YSk7CiAJc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlwb3J0ID0gbXZlYnVfcGNpZV9maW5kX3BvcnQocGNpZSwgYnVzLCBkZXZmbik7CkBAIC03MTAsMTAgKzcwNyw4IEBACiAJfQogCiAJLyogQWNjZXNzIHRoZSByZWFsIFBDSWUgaW50ZXJmYWNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmNvbmZfbG9jaywgZmxhZ3MpOwogCXJldCA9IG12ZWJ1X3BjaWVfaHdfcmRfY29uZihwb3J0LCBidXMsIGRldmZuLAogCQkJCSAgICB3aGVyZSwgc2l6ZSwgdmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5jb25mX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03ODYsMTAgKzc4MSwxMCBAQAogfQogCiBzdGF0aWMgcmVzb3VyY2Vfc2l6ZV90IG12ZWJ1X3BjaWVfYWxpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQkJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCQkJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAotCQkJCQkJcmVzb3VyY2Vfc2l6ZV90IHNpemUsCi0JCQkJCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24pCisJCQkJCQkgY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJCQkgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAorCQkJCQkJIHJlc291cmNlX3NpemVfdCBzaXplLAorCQkJCQkJIHJlc291cmNlX3NpemVfdCBhbGlnbikKIHsKIAlpZiAoZGV2LT5idXMtPm51bWJlciAhPSAwKQogCQlyZXR1cm4gc3RhcnQ7CkBAIC04MzksNyArODM0LDggQEAKICAqIGZvdW5kLCBtYXBzIGl0LgogICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICptdmVidV9wY2llX21hcF9yZWdpc3RlcnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgICAgc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVnczsKIAlpbnQgcmV0ID0gMDsKQEAgLTEwNjAsNyArMTA1Niw2IEBACiAJCW12ZWJ1X3BjaWVfc2V0X2xvY2FsX2Rldl9ucihwb3J0LCAxKTsKIAogCQlwb3J0LT5kbiA9IGNoaWxkOwotCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+Y29uZl9sb2NrKTsKIAkJbXZlYnVfc3dfcGNpX2JyaWRnZV9pbml0KHBvcnQpOwogCQlpKys7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKaW5kZXggZTNiZjllNi4uMWVhZjRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCkBAIC02NDMsNyArNjQzLDYgQEAKIAkJCWludCBzaXplLCB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IHN5c190b19wY2llKGJ1cy0+c3lzZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJaWYgKCFwcCkgewpAQCAtNjU2LDEzICs2NTUsMTEgQEAKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOwogCWlmIChidXMtPm51bWJlciAhPSBwcC0+cm9vdF9idXNfbnIpCiAJCXJldCA9IGR3X3BjaWVfcmRfb3RoZXJfY29uZihwcCwgYnVzLCBkZXZmbiwKIAkJCQkJCXdoZXJlLCBzaXplLCB2YWwpOwogCWVsc2UKIAkJcmV0ID0gZHdfcGNpZV9yZF9vd25fY29uZihwcCwgd2hlcmUsIHNpemUsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY3MSw3ICs2NjgsNiBAQAogCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IHN5c190b19wY2llKGJ1cy0+c3lzZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJaWYgKCFwcCkgewpAQCAtNjgyLDEzICs2NzgsMTEgQEAKIAlpZiAoZHdfcGNpZV92YWxpZF9jb25maWcocHAsIGJ1cywgUENJX1NMT1QoZGV2Zm4pKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBwLT5jb25mX2xvY2ssIGZsYWdzKTsKIAlpZiAoYnVzLT5udW1iZXIgIT0gcHAtPnJvb3RfYnVzX25yKQogCQlyZXQgPSBkd19wY2llX3dyX290aGVyX2NvbmYocHAsIGJ1cywgZGV2Zm4sCiAJCQkJCQl3aGVyZSwgc2l6ZSwgdmFsKTsKIAllbHNlCiAJCXJldCA9IGR3X3BjaWVfd3Jfb3duX2NvbmYocHAsIHdoZXJlLCBzaXplLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwLT5jb25mX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5oIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuaAppbmRleCBhMTY5ZDIyLi43N2Y1OTJmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuaAorKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5oCkBAIC00MSw3ICs0MSw2IEBACiAJdm9pZCBfX2lvbWVtCQkqdmFfY2ZnMV9iYXNlOwogCXU2NAkJCWlvX2Jhc2U7CiAJdTY0CQkJbWVtX2Jhc2U7Ci0Jc3BpbmxvY2tfdAkJY29uZl9sb2NrOwogCXN0cnVjdCByZXNvdXJjZQkJY2ZnOwogCXN0cnVjdCByZXNvdXJjZQkJaW87CiAJc3RydWN0IHJlc291cmNlCQltZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtcmNhci5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXJjYXIuYwppbmRleCA4ZTA2MTI0Li5mN2QzZGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtcmNhci5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yY2FyLmMKQEAgLTI3Nyw5ICsyNzcsOCBAQAogCWVsc2UgaWYgKHNpemUgPT0gMikKIAkJKnZhbCA9ICgqdmFsID4+ICg4ICogKHdoZXJlICYgMikpKSAmIDB4ZmZmZjsKIAotCWRldl9kYmcoJmJ1cy0+ZGV2LCAicGNpZS1jb25maWctcmVhZDogYnVzPSUzZCBkZXZmbj0weCUwNHggIgotCQkid2hlcmU9MHglMDR4IHNpemU9JWQgdmFsPTB4JTA4bHhcbiIsIGJ1cy0+bnVtYmVyLAotCQlkZXZmbiwgd2hlcmUsIHNpemUsICh1bnNpZ25lZCBsb25nKSp2YWwpOworCWRldl9kYmcoJmJ1cy0+ZGV2LCAicGNpZS1jb25maWctcmVhZDogYnVzPSUzZCBkZXZmbj0weCUwNHggd2hlcmU9MHglMDR4IHNpemU9JWQgdmFsPTB4JTA4bHhcbiIsCisJCWJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsICh1bnNpZ25lZCBsb25nKSp2YWwpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMwMiw5ICszMDEsOCBAQAogCWlmIChyZXQgIT0gUENJQklPU19TVUNDRVNTRlVMKQogCQlyZXR1cm4gcmV0OwogCi0JZGV2X2RiZygmYnVzLT5kZXYsICJwY2llLWNvbmZpZy13cml0ZTogYnVzPSUzZCBkZXZmbj0weCUwNHggIgotCQkid2hlcmU9MHglMDR4IHNpemU9JWQgdmFsPTB4JTA4bHhcbiIsIGJ1cy0+bnVtYmVyLAotCQlkZXZmbiwgd2hlcmUsIHNpemUsICh1bnNpZ25lZCBsb25nKXZhbCk7CisJZGV2X2RiZygmYnVzLT5kZXYsICJwY2llLWNvbmZpZy13cml0ZTogYnVzPSUzZCBkZXZmbj0weCUwNHggd2hlcmU9MHglMDR4IHNpemU9JWQgdmFsPTB4JTA4bHhcbiIsCisJCWJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsICh1bnNpZ25lZCBsb25nKXZhbCk7CiAKIAlpZiAoc2l6ZSA9PSAxKSB7CiAJCXNoaWZ0ID0gOCAqICh3aGVyZSAmIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCAyYjg1OTI0Li5iMGU2MWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaApAQCAtMTQyLDYgKzE0MiwxNiBAQAogCXJldHVybiBmdW5jX3RvX2FjcGlfZGV2aWNlKGZ1bmMpLT5oYW5kbGU7CiB9CiAKK3N0cnVjdCBhY3BpcGhwX3Jvb3RfY29udGV4dCB7CisJc3RydWN0IGFjcGlfaG90cGx1Z19jb250ZXh0IGhwOworCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqcm9vdF9icmlkZ2U7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhY3BpcGhwX3Jvb3RfY29udGV4dCAqdG9fYWNwaXBocF9yb290X2NvbnRleHQoc3RydWN0IGFjcGlfaG90cGx1Z19jb250ZXh0ICpocCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGhwLCBzdHJ1Y3QgYWNwaXBocF9yb290X2NvbnRleHQsIGhwKTsKK30KKwogLyoKICAqIHN0cnVjdCBhY3BpcGhwX2F0dGVudGlvbl9pbmZvIC0gZGV2aWNlIHNwZWNpZmljIGF0dGVudGlvbiByZWdpc3RyYXRpb24KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwppbmRleCA3MjhjMzFmLi5lMjkxZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKQEAgLTYzLDEwICs2Myw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGUsICJkaXNhYmxlIGFjcGlwaHAgZHJpdmVyIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZSwgYWNwaXBocF9kaXNhYmxlZCwgYm9vbCwgMDQ0NCk7CiAKLS8qIGV4cG9ydCB0aGUgYXR0ZW50aW9uIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBtZXRob2RzICovCi1FWFBPUlRfU1lNQk9MX0dQTChhY3BpcGhwX3JlZ2lzdGVyX2F0dGVudGlvbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhY3BpcGhwX3VucmVnaXN0ZXJfYXR0ZW50aW9uKTsKLQogc3RhdGljIGludCBlbmFibGVfc2xvdAkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOwogc3RhdGljIGludCBkaXNhYmxlX3Nsb3QJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKIHN0YXRpYyBpbnQgc2V0X2F0dGVudGlvbl9zdGF0dXMgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4IHZhbHVlKTsKQEAgLTEwNCw2ICsxMDAsNyBAQAogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaXBocF9yZWdpc3Rlcl9hdHRlbnRpb24pOwogCiAKIC8qKgpAQCAtMTI0LDYgKzEyMSw3IEBACiAJfQogCXJldHVybiByZXR2YWw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpcGhwX3VucmVnaXN0ZXJfYXR0ZW50aW9uKTsKIAogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDc1ZTE3ODMuLjYwMmQxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtMzUxLDExICszNTEsOSBAQAogCQkJc2xvdC0+c2xvdCA9IE5VTEw7CiAJCQlicmlkZ2UtPm5yX3Nsb3RzLS07CiAJCQlpZiAocmV0dmFsID09IC1FQlVTWSkKLQkJCQlwcl93YXJuKCJTbG90ICVsbHUgYWxyZWFkeSByZWdpc3RlcmVkIGJ5IGFub3RoZXIgIgotCQkJCQkiaG90cGx1ZyBkcml2ZXJcbiIsIHN1bik7CisJCQkJcHJfd2FybigiU2xvdCAlbGx1IGFscmVhZHkgcmVnaXN0ZXJlZCBieSBhbm90aGVyIGhvdHBsdWcgZHJpdmVyXG4iLCBzdW4pOwogCQkJZWxzZQotCQkJCXByX3dhcm4oImFjcGlwaHBfcmVnaXN0ZXJfaG90cGx1Z19zbG90IGZhaWxlZCAiCi0JCQkJCSIoZXJyIGNvZGUgPSAweCV4KVxuIiwgcmV0dmFsKTsKKwkJCQlwcl93YXJuKCJhY3BpcGhwX3JlZ2lzdGVyX2hvdHBsdWdfc2xvdCBmYWlsZWQgKGVyciBjb2RlID0gMHgleClcbiIsIHJldHZhbCk7CiAJCX0KIAkJLyogRXZlbiBpZiB0aGUgc2xvdCByZWdpc3RyYXRpb24gZmFpbHMsIHdlIGNhbiBzdGlsbCB1c2UgaXQuICovCiAJfQpAQCAtMzczLDE3ICszNzEsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYWNwaXBocF9kZXZfdG9fYnJpZGdlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgYWNwaXBocF9jb250ZXh0ICpjb250ZXh0OwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gTlVMTDsKIAogCWFjcGlfbG9ja19ocF9jb250ZXh0KCk7Ci0JY29udGV4dCA9IGFjcGlwaHBfZ2V0X2NvbnRleHQoYWRldik7Ci0JaWYgKGNvbnRleHQpIHsKLQkJYnJpZGdlID0gY29udGV4dC0+YnJpZGdlOworCWlmIChhZGV2LT5ocCkgeworCQlicmlkZ2UgPSB0b19hY3BpcGhwX3Jvb3RfY29udGV4dChhZGV2LT5ocCktPnJvb3RfYnJpZGdlOwogCQlpZiAoYnJpZGdlKQogCQkJZ2V0X2JyaWRnZShicmlkZ2UpOwotCi0JCWFjcGlwaHBfcHV0X2NvbnRleHQoY29udGV4dCk7CiAJfQogCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAlyZXR1cm4gYnJpZGdlOwpAQCAtODgxLDcgKzg3NSwxNyBAQAogCSAqLwogCWdldF9kZXZpY2UoJmJ1cy0+ZGV2KTsKIAotCWlmICghcGNpX2lzX3Jvb3RfYnVzKGJyaWRnZS0+cGNpX2J1cykpIHsKKwlhY3BpX2xvY2tfaHBfY29udGV4dCgpOworCWlmIChwY2lfaXNfcm9vdF9idXMoYnJpZGdlLT5wY2lfYnVzKSkgeworCQlzdHJ1Y3QgYWNwaXBocF9yb290X2NvbnRleHQgKnJvb3RfY29udGV4dDsKKworCQlyb290X2NvbnRleHQgPSBremFsbG9jKHNpemVvZigqcm9vdF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcm9vdF9jb250ZXh0KQorCQkJZ290byBlcnI7CisKKwkJcm9vdF9jb250ZXh0LT5yb290X2JyaWRnZSA9IGJyaWRnZTsKKwkJYWNwaV9zZXRfaHBfY29udGV4dChhZGV2LCAmcm9vdF9jb250ZXh0LT5ocCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJfSBlbHNlIHsKIAkJc3RydWN0IGFjcGlwaHBfY29udGV4dCAqY29udGV4dDsKIAogCQkvKgpAQCAtODkwLDIxICs4OTQsMTYgQEAKIAkJICogcGFyZW50IGlzIGdvaW5nIHRvIGJlIGhhbmRsZWQgYnkgcGNpZWhwLCBpbiB3aGljaCBjYXNlIHRoaXMKIAkJICogYnJpZGdlIGlzIG5vdCBpbnRlcmVzdGluZyB0byB1cyBlaXRoZXIuCiAJCSAqLwotCQlhY3BpX2xvY2tfaHBfY29udGV4dCgpOwogCQljb250ZXh0ID0gYWNwaXBocF9nZXRfY29udGV4dChhZGV2KTsKLQkJaWYgKCFjb250ZXh0KSB7Ci0JCQlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7Ci0JCQlwdXRfZGV2aWNlKCZidXMtPmRldik7Ci0JCQlwY2lfZGV2X3B1dChicmlkZ2UtPnBjaV9kZXYpOwotCQkJa2ZyZWUoYnJpZGdlKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoIWNvbnRleHQpCisJCQlnb3RvIGVycjsKKwogCQlicmlkZ2UtPmNvbnRleHQgPSBjb250ZXh0OwogCQljb250ZXh0LT5icmlkZ2UgPSBicmlkZ2U7CiAJCS8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGJyaWRnZS4gKi8KIAkJZ2V0X2JyaWRnZShjb250ZXh0LT5mdW5jLnBhcmVudCk7Ci0JCWFjcGlfdW5sb2NrX2hwX2NvbnRleHQoKTsKIAl9CisJYWNwaV91bmxvY2tfaHBfY29udGV4dCgpOwogCiAJLyogTXVzdCBiZSBhZGRlZCB0byB0aGUgbGlzdCBwcmlvciB0byBjYWxsaW5nIGFjcGlwaHBfYWRkX2NvbnRleHQoKS4gKi8KIAltdXRleF9sb2NrKCZicmlkZ2VfbXV0ZXgpOwpAQCAtOTE5LDYgKzkxOCwzMCBAQAogCQljbGVhbnVwX2JyaWRnZShicmlkZ2UpOwogCQlwdXRfYnJpZGdlKGJyaWRnZSk7CiAJfQorCXJldHVybjsKKworIGVycjoKKwlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CisJcHV0X2RldmljZSgmYnVzLT5kZXYpOworCXBjaV9kZXZfcHV0KGJyaWRnZS0+cGNpX2Rldik7CisJa2ZyZWUoYnJpZGdlKTsKK30KKwordm9pZCBhY3BpcGhwX2Ryb3BfYnJpZGdlKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlKQoreworCWlmIChwY2lfaXNfcm9vdF9idXMoYnJpZGdlLT5wY2lfYnVzKSkgeworCQlzdHJ1Y3QgYWNwaXBocF9yb290X2NvbnRleHQgKnJvb3RfY29udGV4dDsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OworCisJCWFjcGlfbG9ja19ocF9jb250ZXh0KCk7CisJCWFkZXYgPSBBQ1BJX0NPTVBBTklPTihicmlkZ2UtPnBjaV9idXMtPmJyaWRnZSk7CisJCXJvb3RfY29udGV4dCA9IHRvX2FjcGlwaHBfcm9vdF9jb250ZXh0KGFkZXYtPmhwKTsKKwkJYWRldi0+aHAgPSBOVUxMOworCQlhY3BpX3VubG9ja19ocF9jb250ZXh0KCk7CisJCWtmcmVlKHJvb3RfY29udGV4dCk7CisJfQorCWNsZWFudXBfYnJpZGdlKGJyaWRnZSk7CisJcHV0X2JyaWRnZShicmlkZ2UpOwogfQogCiAvKioKQEAgLTkzNiw4ICs5NTksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpCiAJCWlmIChicmlkZ2UtPnBjaV9idXMgPT0gYnVzKSB7CiAJCQltdXRleF91bmxvY2soJmJyaWRnZV9tdXRleCk7Ci0JCQljbGVhbnVwX2JyaWRnZShicmlkZ2UpOwotCQkJcHV0X2JyaWRnZShicmlkZ2UpOworCQkJYWNwaXBocF9kcm9wX2JyaWRnZShicmlkZ2UpOwogCQkJcmV0dXJuOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Zy5oCmluZGV4IDEzNTYyMTEuLjZhMGRkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWcuaApAQCAtNTYsOSArNTYsOSBAQAogCWludCAoKmVuYWJsZV9pcnEpICh2b2lkKTsKIAlpbnQgKCpkaXNhYmxlX2lycSkgKHZvaWQpOwogCWludCAoKmNoZWNrX2lycSkgKHZvaWQgKmRldl9pZCk7Ci0JaW50ICgqaGFyZHdhcmVfdGVzdCkgKHN0cnVjdCBzbG90KiBzbG90LCB1MzIgdmFsdWUpOwotCXU4ICAoKmdldF9wb3dlcikgKHN0cnVjdCBzbG90KiBzbG90KTsKLQlpbnQgKCpzZXRfcG93ZXIpIChzdHJ1Y3Qgc2xvdCogc2xvdCwgaW50IHZhbHVlKTsKKwlpbnQgKCpoYXJkd2FyZV90ZXN0KSAoc3RydWN0IHNsb3QgKnNsb3QsIHUzMiB2YWx1ZSk7CisJdTggICgqZ2V0X3Bvd2VyKSAoc3RydWN0IHNsb3QgKnNsb3QpOworCWludCAoKnNldF9wb3dlcikgKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgdmFsdWUpOwogfTsKIAogc3RydWN0IGNwY2lfaHBfY29udHJvbGxlciB7CkBAIC04OSwxMyArODksMTMgQEAKIHU4IGNwY2lfZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QpOwogdTggY3BjaV9nZXRfbGF0Y2hfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90KTsKIHU4IGNwY2lfZ2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90KTsKLXUxNiBjcGNpX2dldF9oc19jc3Ioc3RydWN0IHNsb3QgKiBzbG90KTsKK3UxNiBjcGNpX2dldF9oc19jc3Ioc3RydWN0IHNsb3QgKnNsb3QpOwogaW50IGNwY2lfc2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIGludCBzdGF0dXMpOwotaW50IGNwY2lfY2hlY2tfYW5kX2NsZWFyX2lucyhzdHJ1Y3Qgc2xvdCAqIHNsb3QpOwotaW50IGNwY2lfY2hlY2tfZXh0KHN0cnVjdCBzbG90ICogc2xvdCk7Ci1pbnQgY3BjaV9jbGVhcl9leHQoc3RydWN0IHNsb3QgKiBzbG90KTsKLWludCBjcGNpX2xlZF9vbihzdHJ1Y3Qgc2xvdCAqIHNsb3QpOwotaW50IGNwY2lfbGVkX29mZihzdHJ1Y3Qgc2xvdCAqIHNsb3QpOworaW50IGNwY2lfY2hlY2tfYW5kX2NsZWFyX2lucyhzdHJ1Y3Qgc2xvdCAqc2xvdCk7CitpbnQgY3BjaV9jaGVja19leHQoc3RydWN0IHNsb3QgKnNsb3QpOworaW50IGNwY2lfY2xlYXJfZXh0KHN0cnVjdCBzbG90ICpzbG90KTsKK2ludCBjcGNpX2xlZF9vbihzdHJ1Y3Qgc2xvdCAqc2xvdCk7CitpbnQgY3BjaV9sZWRfb2ZmKHN0cnVjdCBzbG90ICpzbG90KTsKIGludCBjcGNpX2NvbmZpZ3VyZV9zbG90KHN0cnVjdCBzbG90ICpzbG90KTsKIGludCBjcGNpX3VuY29uZmlndXJlX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMKaW5kZXggMDBjODFhMy4uZTA5Y2Y3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtNjUsMTAgKzY1LDEwIEBACiBzdGF0aWMgaW50IGVuYWJsZV9zbG90KHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOwogc3RhdGljIGludCBkaXNhYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CiBzdGF0aWMgaW50IHNldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4IHZhbHVlKTsKLXN0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqIHZhbHVlKTsKLXN0YXRpYyBpbnQgZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKiB2YWx1ZSk7Ci1zdGF0aWMgaW50IGdldF9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqIHZhbHVlKTsKLXN0YXRpYyBpbnQgZ2V0X2xhdGNoX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqIHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworc3RhdGljIGludCBnZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworc3RhdGljIGludCBnZXRfYWRhcHRlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKK3N0YXRpYyBpbnQgZ2V0X2xhdGNoX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOwogCiBzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgY3BjaV9ob3RwbHVnX3Nsb3Rfb3BzID0gewogCS5lbmFibGVfc2xvdCA9IGVuYWJsZV9zbG90LApAQCAtMTY4LDcgKzE2OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQorZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKiB2YWx1ZSkKK2dldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gaG90cGx1Z19zbG90LT5wcml2YXRlOwogCkBAIC0xOTIsMTQgKzE5MiwxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1nZXRfYWRhcHRlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQorZ2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQogewogCSp2YWx1ZSA9IGhvdHBsdWdfc2xvdC0+aW5mby0+YWRhcHRlcl9zdGF0dXM7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLWdldF9sYXRjaF9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQorZ2V0X2xhdGNoX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPmxhdGNoX3N0YXR1czsKIAlyZXR1cm4gMDsKQEAgLTI5OSw2ICsyOTksNyBAQAogZXJyb3I6CiAJcmV0dXJuIHN0YXR1czsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwY2lfaHBfcmVnaXN0ZXJfYnVzKTsKIAogaW50CiBjcGNpX2hwX3VucmVnaXN0ZXJfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCkBAIC0zMjksNiArMzMwLDcgQEAKIAl1cF93cml0ZSgmbGlzdF9yd3NlbSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwY2lfaHBfdW5yZWdpc3Rlcl9idXMpOwogCiAvKiBUaGlzIGlzIHRoZSBpbnRlcnJ1cHQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwogc3RhdGljIGlycXJldHVybl90CkBAIC0zNjAsNyArMzYyLDcgQEAKIGluaXRfc2xvdHMoaW50IGNsZWFyX2lucykKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgcGNpX2RldiogZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CiAJZG93bl9yZWFkKCZsaXN0X3J3c2VtKTsKQEAgLTYxNCw2ICs2MTYsNyBAQAogCQljb250cm9sbGVyID0gbmV3X2NvbnRyb2xsZXI7CiAJcmV0dXJuIHN0YXR1czsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwY2lfaHBfcmVnaXN0ZXJfY29udHJvbGxlcik7CiAKIHN0YXRpYyB2b2lkCiBjbGVhbnVwX3Nsb3RzKHZvaWQpCkBAIC02NTMsNiArNjU2LDcgQEAKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAlyZXR1cm4gc3RhdHVzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BjaV9ocF91bnJlZ2lzdGVyX2NvbnRyb2xsZXIpOwogCiBpbnQKIGNwY2lfaHBfc3RhcnQodm9pZCkKQEAgLTY5MCw2ICs2OTQsNyBAQAogCWRiZygiJXMgLSBleGl0IiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BjaV9ocF9zdGFydCk7CiAKIGludAogY3BjaV9ocF9zdG9wKHZvaWQpCkBAIC03MDQsNiArNzA5LDcgQEAKIAljcGNpX3N0b3BfdGhyZWFkKCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjcGNpX2hwX3N0b3ApOwogCiBpbnQgX19pbml0CiBjcGNpX2hvdHBsdWdfaW5pdChpbnQgZGVidWcpCkBAIC03MjEsMTAgKzcyNywzIEBACiAJY3BjaV9ocF9zdG9wKCk7CiAJY3BjaV9ocF91bnJlZ2lzdGVyX2NvbnRyb2xsZXIoY29udHJvbGxlcik7CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGNwY2lfaHBfcmVnaXN0ZXJfY29udHJvbGxlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChjcGNpX2hwX3VucmVnaXN0ZXJfY29udHJvbGxlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChjcGNpX2hwX3JlZ2lzdGVyX2J1cyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChjcGNpX2hwX3VucmVnaXN0ZXJfYnVzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGNwY2lfaHBfc3RhcnQpOwotRVhQT1JUX1NZTUJPTF9HUEwoY3BjaV9ocF9zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMKaW5kZXggZjZlZjY0Yy4uN2Q0OGVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgZm9ybWF0ICJcbiIsIE1ZX05BTUUgLCAjIyBhcmcpCiAKIAotdTggY3BjaV9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCogc2xvdCkKK3U4IGNwY2lfZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJaW50IGhzX2NhcDsKIAl1MTYgaHNfY3NyOwpAQCAtNjYsNyArNjYsNyBAQAogCXJldHVybiBoc19jc3IgJiAweDAwMDggPyAxIDogMDsKIH0KIAotaW50IGNwY2lfc2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QqIHNsb3QsIGludCBzdGF0dXMpCitpbnQgY3BjaV9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IHN0YXR1cykKIHsKIAlpbnQgaHNfY2FwOwogCXUxNiBoc19jc3I7CkBAIC05Myw3ICs5Myw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXUxNiBjcGNpX2dldF9oc19jc3Ioc3RydWN0IHNsb3QqIHNsb3QpCit1MTYgY3BjaV9nZXRfaHNfY3NyKHN0cnVjdCBzbG90ICpzbG90KQogewogCWludCBoc19jYXA7CiAJdTE2IGhzX2NzcjsKQEAgLTExMSw3ICsxMTEsNyBAQAogCXJldHVybiBoc19jc3I7CiB9CiAKLWludCBjcGNpX2NoZWNrX2FuZF9jbGVhcl9pbnMoc3RydWN0IHNsb3QqIHNsb3QpCitpbnQgY3BjaV9jaGVja19hbmRfY2xlYXJfaW5zKHN0cnVjdCBzbG90ICpzbG90KQogewogCWludCBoc19jYXA7CiAJdTE2IGhzX2NzcjsKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXJldHVybiBpbnM7CiB9CiAKLWludCBjcGNpX2NoZWNrX2V4dChzdHJ1Y3Qgc2xvdCogc2xvdCkKK2ludCBjcGNpX2NoZWNrX2V4dChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlpbnQgaHNfY2FwOwogCXUxNiBoc19jc3I7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAlyZXR1cm4gZXh0OwogfQogCi1pbnQgY3BjaV9jbGVhcl9leHQoc3RydWN0IHNsb3QqIHNsb3QpCitpbnQgY3BjaV9jbGVhcl9leHQoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJaW50IGhzX2NhcDsKIAl1MTYgaHNfY3NyOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjcGNpX2xlZF9vbihzdHJ1Y3Qgc2xvdCogc2xvdCkKK2ludCBjcGNpX2xlZF9vbihzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlpbnQgaHNfY2FwOwogCXUxNiBoc19jc3I7CkBAIC0yMTYsNyArMjE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNwY2lfbGVkX29mZihzdHJ1Y3Qgc2xvdCogc2xvdCkKK2ludCBjcGNpX2xlZF9vZmYoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJaW50IGhzX2NhcDsKIAl1MTYgaHNfY3NyOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGNwY2lfdW5jb25maWd1cmVfc2xvdChzdHJ1Y3Qgc2xvdCogc2xvdCkKK2ludCBjcGNpX3VuY29uZmlndXJlX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiwgKnRlbXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaWhwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaWhwX2dlbmVyaWMuYwppbmRleCA3NTM2ZWVmLi4wNGZjZDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfZ2VuZXJpYy5jCkBAIC03OCw4ICs3OCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHZhbGlkYXRlX3BhcmFtZXRlcnModm9pZCkKIHsKLQljaGFyKiBzdHI7Ci0JY2hhciogcDsKKwljaGFyICpzdHI7CisJY2hhciAqcDsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAogCWlmKCFicmlkZ2UpIHsKQEAgLTE0Miw4ICsxNDIsOCBAQAogc3RhdGljIGludCBfX2luaXQgY3BjaWhwX2dlbmVyaWNfaW5pdCh2b2lkKQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHJlc291cmNlKiByOwotCXN0cnVjdCBwY2lfZGV2KiBkZXY7CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlpbmZvKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTik7CiAJc3RhdHVzID0gdmFsaWRhdGVfcGFyYW1ldGVycygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfenQ1NTUwLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF96dDU1NTAuYwppbmRleCBlOGM0YTdjLi42NzU3YjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF96dDU1NTAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF96dDU1NTAuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHp0NTU1MF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHJlc291cmNlKiByOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgcmM7CiAKIAlpbmZvKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaAppbmRleCA1MTZiODc3Li4wNDUwZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmgKQEAgLTI1NSw3ICsyNTUsNyBAQAogCXN0cnVjdCBwY2lfcmVzb3VyY2UgKmlvX2hlYWQ7CiAJc3RydWN0IHBjaV9yZXNvdXJjZSAqYnVzX2hlYWQ7CiAJc3RydWN0IHRpbWVyX2xpc3QgKnBfdGFza19ldmVudDsKLQlzdHJ1Y3QgcGNpX2RldiogcGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKIH07CiAKIHN0cnVjdCBzbG90IHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogfTsKIAogc3RydWN0IHBjaV9yZXNvdXJjZSB7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqIG5leHQ7CisJc3RydWN0IHBjaV9yZXNvdXJjZSAqbmV4dDsKIAl1MzIgYmFzZTsKIAl1MzIgbGVuZ3RoOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwppbmRleCAwMzdlMjYxLi40YWFlZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCkBAIC05NCw3ICs5NCw3IEBACiAgKgogICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSBTTUJJT1MgdGFibGVzIChvciAlTlVMTCkuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBkZXRlY3RfU01CSU9TX3BvaW50ZXIodm9pZCBfX2lvbWVtICpiZWdpbiwgdm9pZCBfX2lvbWVtICplbmQpCitzdGF0aWMgdm9pZCBfX2lvbWVtICpkZXRlY3RfU01CSU9TX3BvaW50ZXIodm9pZCBfX2lvbWVtICpiZWdpbiwgdm9pZCBfX2lvbWVtICplbmQpCiB7CiAJdm9pZCBfX2lvbWVtICpmcDsKIAl2b2lkIF9faW9tZW0gKmVuZHA7CkBAIC0xMzEsNyArMTMxLDcgQEAKICAqCiAgKiBGb3IgdW5leHBlY3RlZCBzd2l0Y2ggb3BlbnMKICAqLwotc3RhdGljIGludCBpbml0X1NFUlIoc3RydWN0IGNvbnRyb2xsZXIgKiBjdHJsKQorc3RhdGljIGludCBpbml0X1NFUlIoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJdTMyIHRlbXBkd29yZDsKIAl1MzIgbnVtYmVyX29mX3Nsb3RzOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJa2ZyZWUoc2xvdCk7CiB9CiAKLXN0YXRpYyBpbnQgY3RybF9zbG90X2NsZWFudXAgKHN0cnVjdCBjb250cm9sbGVyICogY3RybCkKK3N0YXRpYyBpbnQgY3RybF9zbG90X2NsZWFudXAgKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCXN0cnVjdCBzbG90ICpvbGRfc2xvdCwgKm5leHRfc2xvdDsKIApAQCAtNzA2LDggKzcwNiw3IEBACiAJCWhvdHBsdWdfc2xvdF9pbmZvLT5hZGFwdGVyX3N0YXR1cyA9CiAJCQlnZXRfcHJlc2VuY2Vfc3RhdHVzKGN0cmwsIHNsb3QpOwogCi0JCWRiZygicmVnaXN0ZXJpbmcgYnVzICVkLCBkZXYgJWQsIG51bWJlciAlZCwgIgotCQkJCSJjdHJsLT5zbG90X2RldmljZV9vZmZzZXQgJWQsIHNsb3QgJWRcbiIsCisJCWRiZygicmVnaXN0ZXJpbmcgYnVzICVkLCBkZXYgJWQsIG51bWJlciAlZCwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0ICVkLCBzbG90ICVkXG4iLAogCQkJCXNsb3QtPmJ1cywgc2xvdC0+ZGV2aWNlLAogCQkJCXNsb3QtPm51bWJlciwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0LAogCQkJCXNsb3RfbnVtYmVyKTsKQEAgLTgzNyw4ICs4MzYsNyBAQAogCiAJYnVzID0gcGRldi0+c3Vib3JkaW5hdGU7CiAJaWYgKCFidXMpIHsKLQkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAidGhlIGRldmljZSBpcyBub3QgYSBicmlkZ2UsICIKLQkJCQkic2tpcHBpbmdcbiIpOworCQlkZXZfbm90aWNlKCZwZGV2LT5kZXYsICJ0aGUgZGV2aWNlIGlzIG5vdCBhIGJyaWRnZSwgc2tpcHBpbmdcbiIpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYwppbmRleCBmNTkzNTg1Li5iZGU0N2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCkBAIC0zOSw5ICszOSw5IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgImNwcXBocC5oIgogCi1zdGF0aWMgdTMyIGNvbmZpZ3VyZV9uZXdfZGV2aWNlKHN0cnVjdCBjb250cm9sbGVyKiBjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKmZ1bmMsCitzdGF0aWMgdTMyIGNvbmZpZ3VyZV9uZXdfZGV2aWNlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKmZ1bmMsCiAJCQl1OCBiZWhpbmRfYnJpZGdlLCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdHMgKnJlc291cmNlcyk7Ci1zdGF0aWMgaW50IGNvbmZpZ3VyZV9uZXdfZnVuY3Rpb24oc3RydWN0IGNvbnRyb2xsZXIqIGN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqZnVuYywKK3N0YXRpYyBpbnQgY29uZmlndXJlX25ld19mdW5jdGlvbihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHBjaV9mdW5jICpmdW5jLAogCQkJdTggYmVoaW5kX2JyaWRnZSwgc3RydWN0IHJlc291cmNlX2xpc3RzICpyZXNvdXJjZXMpOwogc3RhdGljIHZvaWQgaW50ZXJydXB0X2V2ZW50X2hhbmRsZXIoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogCkBAIC02NCw3ICs2NCw3IEBACiAKIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIGxpbmUgbmVlZHMgdG8gYmUgc29tZXdoZXJlIGVsc2UuLi4gKi8KICNkZWZpbmUgV1JPTkdfQlVTX0ZSRVFVRU5DWSAweDA3Ci1zdGF0aWMgdTggaGFuZGxlX3N3aXRjaF9jaGFuZ2UodTggY2hhbmdlLCBzdHJ1Y3QgY29udHJvbGxlciAqIGN0cmwpCitzdGF0aWMgdTggaGFuZGxlX3N3aXRjaF9jaGFuZ2UodTggY2hhbmdlLCBzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAlpbnQgaHBfc2xvdDsKIAl1OCByYyA9IDA7CkBAIC0xMzgsNyArMTM4LDcgQEAKIH0KIAogCi1zdGF0aWMgdTggaGFuZGxlX3ByZXNlbmNlX2NoYW5nZSh1MTYgY2hhbmdlLCBzdHJ1Y3QgY29udHJvbGxlciAqIGN0cmwpCitzdGF0aWMgdTggaGFuZGxlX3ByZXNlbmNlX2NoYW5nZSh1MTYgY2hhbmdlLCBzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAlpbnQgaHBfc2xvdDsKIAl1OCByYyA9IDA7CkBAIC0yMzIsNyArMjMyLDcgQEAKIH0KIAogCi1zdGF0aWMgdTggaGFuZGxlX3Bvd2VyX2ZhdWx0KHU4IGNoYW5nZSwgc3RydWN0IGNvbnRyb2xsZXIgKiBjdHJsKQorc3RhdGljIHU4IGhhbmRsZV9wb3dlcl9mYXVsdCh1OCBjaGFuZ2UsIHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCWludCBocF9zbG90OwogCXU4IHJjID0gMDsKQEAgLTk5Nyw3ICs5OTcsNyBAQAogICoKICAqIFJldHVybnMgJTAgaWYgc3VjY2Vzc2Z1bCwgITAgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW50IHNsb3RfcmVtb3ZlKHN0cnVjdCBwY2lfZnVuYyAqIG9sZF9zbG90KQorc3RhdGljIGludCBzbG90X3JlbW92ZShzdHJ1Y3QgcGNpX2Z1bmMgKm9sZF9zbG90KQogewogCXN0cnVjdCBwY2lfZnVuYyAqbmV4dDsKIApAQCAtMTEwOSw3ICsxMTA5LDcgQEAKIAogLyogREpaOiBJIGRvbid0IHRoaW5rIGlzX2JyaWRnZSB3aWxsIHdvcmsgYXMgaXMuCiAgKiBGSVhNRSAqLwotc3RhdGljIGludCBpc19icmlkZ2Uoc3RydWN0IHBjaV9mdW5jICogZnVuYykKK3N0YXRpYyBpbnQgaXNfYnJpZGdlKHN0cnVjdCBwY2lfZnVuYyAqZnVuYykKIHsKIAkvKiBDaGVjayB0aGUgaGVhZGVyIHR5cGUgKi8KIAlpZiAoKChmdW5jLT5jb25maWdfc3BhY2VbMHgwM10gPj4gMTYpICYgMHhGRikgPT0gMHgwMSkKQEAgLTE2MjUsNyArMTYyNSw3IEBACiAgKiBAcmVwbGFjZV9mbGFnOiB3aGV0aGVyIHJlcGxhY2luZyBvciBhZGRpbmcgYSBuZXcgZGV2aWNlCiAgKiBAY3RybDogdGFyZ2V0IGNvbnRyb2xsZXIKICAqLwotc3RhdGljIHUzMiByZW1vdmVfYm9hcmQoc3RydWN0IHBjaV9mdW5jICogZnVuYywgdTMyIHJlcGxhY2VfZmxhZywgc3RydWN0IGNvbnRyb2xsZXIgKiBjdHJsKQorc3RhdGljIHUzMiByZW1vdmVfYm9hcmQoc3RydWN0IHBjaV9mdW5jICpmdW5jLCB1MzIgcmVwbGFjZV9mbGFnLCBzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAlpbnQgaW5kZXg7CiAJdTggc2tpcCA9IDA7CkBAIC0xNzQyLDcgKzE3NDIsNyBAQAogCiAKIC8qIHRoaXMgaXMgdGhlIG1haW4gd29ya2VyIHRocmVhZCAqLwotc3RhdGljIGludCBldmVudF90aHJlYWQodm9pZCogZGF0YSkKK3N0YXRpYyBpbnQgZXZlbnRfdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmw7CiAKQEAgLTE5OTIsNyArMTk5Miw3IEBACiAJdTE2IHRlbXBfd29yZDsKIAl1MzIgdGVtcGR3b3JkOwogCWludCByYzsKLQlzdHJ1Y3Qgc2xvdCogcF9zbG90OworCXN0cnVjdCBzbG90ICpwX3Nsb3Q7CiAJaW50IHBoeXNpY2FsX3Nsb3QgPSAwOwogCiAJdGVtcGR3b3JkID0gMDsKQEAgLTIwODgsNyArMjA4OCw3IEBACiAJdTggcmVwbGFjZV9mbGFnOwogCXUzMiByYyA9IDA7CiAJdW5zaWduZWQgaW50IGRldmZuOwotCXN0cnVjdCBzbG90KiBwX3Nsb3Q7CisJc3RydWN0IHNsb3QgKnBfc2xvdDsKIAlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cyA9IGN0cmwtPnBjaV9idXM7CiAJaW50IHBoeXNpY2FsX3Nsb3Q9MDsKIApAQCAtMjI3MCw4ICsyMjcwLDggQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzcy4KICAqLwotc3RhdGljIHUzMiBjb25maWd1cmVfbmV3X2RldmljZShzdHJ1Y3QgY29udHJvbGxlciAqIGN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqIGZ1bmMsCi0JCQkJIHU4IGJlaGluZF9icmlkZ2UsIHN0cnVjdCByZXNvdXJjZV9saXN0cyAqIHJlc291cmNlcykKK3N0YXRpYyB1MzIgY29uZmlndXJlX25ld19kZXZpY2Uoc3RydWN0IGNvbnRyb2xsZXIgICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgICpmdW5jLAorCQkJCSB1OCBiZWhpbmRfYnJpZGdlLCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdHMgICpyZXNvdXJjZXMpCiB7CiAJdTggdGVtcF9ieXRlLCBmdW5jdGlvbiwgbWF4X2Z1bmN0aW9ucywgc3RvcF9pdDsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9udnJhbS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfbnZyYW0uYwppbmRleCA5NjAwYTM5Li4wOTY4YTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9udnJhbS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX252cmFtLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogICovCiAKIAotc3RhdGljIHUzMiBhZGRfYnl0ZSggdTMyICoqcF9idWZmZXIsIHU4IHZhbHVlLCB1MzIgKnVzZWQsIHUzMiAqYXZhaWwpCitzdGF0aWMgdTMyIGFkZF9ieXRlKHUzMiAqKnBfYnVmZmVyLCB1OCB2YWx1ZSwgdTMyICp1c2VkLCB1MzIgKmF2YWlsKQogewogCXU4ICoqdEJ5dGU7CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogfQogCiAKLXN0YXRpYyB1MzIgYWRkX2R3b3JkKCB1MzIgKipwX2J1ZmZlciwgdTMyIHZhbHVlLCB1MzIgKnVzZWQsIHUzMiAqYXZhaWwpCitzdGF0aWMgdTMyIGFkZF9kd29yZCh1MzIgKipwX2J1ZmZlciwgdTMyIHZhbHVlLCB1MzIgKnVzZWQsIHUzMiAqYXZhaWwpCiB7CiAJaWYgKCgqdXNlZCArIDQpID4gKmF2YWlsKQogCQlyZXR1cm4oMSk7CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCWN0cmwgPSBjcHFocF9jdHJsX2xpc3Q7CiAKIAkvKiBUaGUgcmV2aXNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KLQlyYyA9IGFkZF9ieXRlKCAmcEZpbGwsIDEgKyBjdHJsLT5wdXNoX2ZsYWcsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCXJjID0gYWRkX2J5dGUoJnBGaWxsLCAxICsgY3RybC0+cHVzaF9mbGFnLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKIAlpZiAocmMpCiAJCXJldHVybihyYyk7CiAKIAkvKiBUaGUgbnVtYmVyIG9mIGNvbnRyb2xsZXJzICovCi0JcmMgPSBhZGRfYnl0ZSggJnBGaWxsLCAxLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKKwlyYyA9IGFkZF9ieXRlKCZwRmlsbCwgMSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ocmMpOwogCkBAIC0yODIsMjIgKzI4MiwyMiBAQAogCQludW1DdHJsKys7CiAKIAkJLyogVGhlIGJ1cyBudW1iZXIgKi8KLQkJcmMgPSBhZGRfYnl0ZSggJnBGaWxsLCBjdHJsLT5idXMsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQlyYyA9IGFkZF9ieXRlKCZwRmlsbCwgY3RybC0+YnVzLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuKHJjKTsKIAogCQkvKiBUaGUgZGV2aWNlIE51bWJlciAqLwotCQlyYyA9IGFkZF9ieXRlKCAmcEZpbGwsIFBDSV9TTE9UKGN0cmwtPnBjaV9kZXYtPmRldmZuKSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CisJCXJjID0gYWRkX2J5dGUoJnBGaWxsLCBQQ0lfU0xPVChjdHJsLT5wY2lfZGV2LT5kZXZmbiksICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4ocmMpOwogCiAJCS8qIFRoZSBmdW5jdGlvbiBOdW1iZXIgKi8KLQkJcmMgPSBhZGRfYnl0ZSggJnBGaWxsLCBQQ0lfRlVOQyhjdHJsLT5wY2lfZGV2LT5kZXZmbiksICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQlyYyA9IGFkZF9ieXRlKCZwRmlsbCwgUENJX0ZVTkMoY3RybC0+cGNpX2Rldi0+ZGV2Zm4pLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuKHJjKTsKIAogCQkvKiBTa2lwIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGVudHJpZXMgKi8KLQkJcmMgPSBhZGRfZHdvcmQoICZwRmlsbCwgMCwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CisJCXJjID0gYWRkX2R3b3JkKCZwRmlsbCwgMCwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJCWlmIChyYykKIAkJCXJldHVybihyYyk7CiAKQEAgLTMxMSwxMiArMzExLDEyIEBACiAJCQlsb29wICsrOwogCiAJCQkvKiBiYXNlICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5iYXNlLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKKwkJCXJjID0gYWRkX2R3b3JkKCZwRmlsbCwgcmVzTm9kZS0+YmFzZSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuKHJjKTsKIAogCQkJLyogbGVuZ3RoICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQkJcmMgPSBhZGRfZHdvcmQoJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOwogCQkJaWYgKHJjKQogCQkJCXJldHVybihyYyk7CiAKQEAgLTMzNiwxMiArMzM2LDEyIEBACiAJCQlsb29wICsrOwogCiAJCQkvKiBiYXNlICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5iYXNlLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKKwkJCXJjID0gYWRkX2R3b3JkKCZwRmlsbCwgcmVzTm9kZS0+YmFzZSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuKHJjKTsKIAogCQkJLyogbGVuZ3RoICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQkJcmMgPSBhZGRfZHdvcmQoJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOwogCQkJaWYgKHJjKQogCQkJCXJldHVybihyYyk7CiAKQEAgLTM2MSwxMiArMzYxLDEyIEBACiAJCQlsb29wICsrOwogCiAJCQkvKiBiYXNlICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5iYXNlLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKKwkJCXJjID0gYWRkX2R3b3JkKCZwRmlsbCwgcmVzTm9kZS0+YmFzZSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuKHJjKTsKIAogCQkJLyogbGVuZ3RoICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQkJcmMgPSBhZGRfZHdvcmQoJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOwogCQkJaWYgKHJjKQogCQkJCXJldHVybihyYyk7CiAKQEAgLTM4NiwxMiArMzg2LDEyIEBACiAJCQlsb29wICsrOwogCiAJCQkvKiBiYXNlICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5iYXNlLCAmdXNlZGJ5dGVzLCAmYXZhaWxhYmxlKTsKKwkJCXJjID0gYWRkX2R3b3JkKCZwRmlsbCwgcmVzTm9kZS0+YmFzZSwgJnVzZWRieXRlcywgJmF2YWlsYWJsZSk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuKHJjKTsKIAogCQkJLyogbGVuZ3RoICovCi0JCQlyYyA9IGFkZF9kd29yZCggJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOworCQkJcmMgPSBhZGRfZHdvcmQoJnBGaWxsLCByZXNOb2RlLT5sZW5ndGgsICZ1c2VkYnl0ZXMsICZhdmFpbGFibGUpOwogCQkJaWYgKHJjKQogCQkJCXJldHVybihyYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKaW5kZXggYTNlM2MyMC4uMWM4YzJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH0KIAogCi1pbnQgY3BxaHBfY29uZmlndXJlX2RldmljZSAoc3RydWN0IGNvbnRyb2xsZXIqIGN0cmwsIHN0cnVjdCBwY2lfZnVuYyogZnVuYykKK2ludCBjcHFocF9jb25maWd1cmVfZGV2aWNlIChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHBjaV9mdW5jICpmdW5jKQogewogCXN0cnVjdCBwY2lfYnVzICpjaGlsZDsKIAlpbnQgbnVtOwpAQCAtMTIxLDcgKzEyMSw3IEBACiB9CiAKIAotaW50IGNwcWhwX3VuY29uZmlndXJlX2RldmljZShzdHJ1Y3QgcGNpX2Z1bmMqIGZ1bmMpCitpbnQgY3BxaHBfdW5jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBwY2lfZnVuYyAqZnVuYykKIHsKIAlpbnQgajsKIApAQCAtMTI5LDcgKzEyOSw3IEBACiAKIAlwY2lfbG9ja19yZXNjYW5fcmVtb3ZlKCk7CiAJZm9yIChqPTA7IGo8OCA7IGorKykgewotCQlzdHJ1Y3QgcGNpX2RldiogdGVtcCA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KGZ1bmMtPmJ1cywgUENJX0RFVkZOKGZ1bmMtPmRldmljZSwgaikpOworCQlzdHJ1Y3QgcGNpX2RldiAqdGVtcCA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KGZ1bmMtPmJ1cywgUENJX0RFVkZOKGZ1bmMtPmRldmljZSwgaikpOwogCQlpZiAodGVtcCkgewogCQkJcGNpX2Rldl9wdXQodGVtcCk7CiAJCQlwY2lfc3RvcF9hbmRfcmVtb3ZlX2J1c19kZXZpY2UodGVtcCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IFBDSV9TY2FuQnVzRm9yTm9uQnJpZGdlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCB1OCBidXNfbnVtLCB1OCAqIGRldl9udW0pCitzdGF0aWMgaW50IFBDSV9TY2FuQnVzRm9yTm9uQnJpZGdlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCB1OCBidXNfbnVtLCB1OCAqZGV2X251bSkKIHsKIAl1MTYgdGRldmljZTsKIAl1MzIgd29yazsKQEAgLTI4MCw3ICsyODAsNyBAQAogfQogCiAKLWludCBjcHFocF9nZXRfYnVzX2RldiAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHU4ICogYnVzX251bSwgdTggKiBkZXZfbnVtLCB1OCBzbG90KQoraW50IGNwcWhwX2dldF9idXNfZGV2IChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgdTggKmJ1c19udW0sIHU4ICpkZXZfbnVtLCB1OCBzbG90KQogewogCS8qIHBsYWluIChicmlkZ2VzIGFsbG93ZWQpICovCiAJcmV0dXJuIFBDSV9HZXRCdXNEZXZIZWxwZXIoY3RybCwgYnVzX251bSwgZGV2X251bSwgc2xvdCwgMCk7CkBAIC00NjUsNyArNDY1LDcgQEAKICAqCiAgKiByZXR1cm5zIDAgaWYgc3VjY2VzcwogICovCi1pbnQgY3BxaHBfc2F2ZV9zbG90X2NvbmZpZyAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqIG5ld19zbG90KQoraW50IGNwcWhwX3NhdmVfc2xvdF9jb25maWcgKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKm5ld19zbG90KQogewogCWxvbmcgcmM7CiAJdTggY2xhc3NfY29kZTsKQEAgLTU0OSw3ICs1NDksNyBAQAogICoKICAqIHJldHVybnMgMCBpZiBzdWNjZXNzCiAgKi8KLWludCBjcHFocF9zYXZlX2Jhc2VfYWRkcl9sZW5ndGgoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqIGZ1bmMpCitpbnQgY3BxaHBfc2F2ZV9iYXNlX2FkZHJfbGVuZ3RoKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKmZ1bmMpCiB7CiAJdTggY2xvb3A7CiAJdTggaGVhZGVyX3R5cGU7CkBAIC02ODYsNyArNjg2LDcgQEAKICAqCiAgKiByZXR1cm5zIDAgaWYgc3VjY2VzcwogICovCi1pbnQgY3BxaHBfc2F2ZV91c2VkX3Jlc291cmNlcyAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqIGZ1bmMpCitpbnQgY3BxaHBfc2F2ZV91c2VkX3Jlc291cmNlcyAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqZnVuYykKIHsKIAl1OCBjbG9vcDsKIAl1OCBoZWFkZXJfdHlwZTsKQEAgLTk0OSw3ICs5NDksNyBAQAogICoKICAqIHJldHVybnMgMCBpZiBzdWNjZXNzCiAgKi8KLWludCBjcHFocF9jb25maWd1cmVfYm9hcmQoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqIGZ1bmMpCitpbnQgY3BxaHBfY29uZmlndXJlX2JvYXJkKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKmZ1bmMpCiB7CiAJaW50IGNsb29wOwogCXU4IGhlYWRlcl90eXBlOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKICAqCiAgKiByZXR1cm5zIDAgaWYgdGhlIGJvYXJkIGlzIHRoZSBzYW1lIG5vbnplcm8gb3RoZXJ3aXNlCiAgKi8KLWludCBjcHFocF92YWxpZF9yZXBsYWNlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3QgcGNpX2Z1bmMgKiBmdW5jKQoraW50IGNwcWhwX3ZhbGlkX3JlcGxhY2Uoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBwY2lfZnVuYyAqZnVuYykKIHsKIAl1OCBjbG9vcDsKIAl1OCBoZWFkZXJfdHlwZTsKQEAgLTE0MTksNyArMTQxOSw3IEBACiAgKgogICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MKICAqLwotaW50IGNwcWhwX3JldHVybl9ib2FyZF9yZXNvdXJjZXMoc3RydWN0IHBjaV9mdW5jICogZnVuYywgc3RydWN0IHJlc291cmNlX2xpc3RzICogcmVzb3VyY2VzKQoraW50IGNwcWhwX3JldHVybl9ib2FyZF9yZXNvdXJjZXMoc3RydWN0IHBjaV9mdW5jICpmdW5jLCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdHMgKnJlc291cmNlcykKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBwY2lfcmVzb3VyY2UgKm5vZGU7CkBAIC0xNDc1LDcgKzE0NzUsNyBAQAogICoKICAqIFB1dHMgbm9kZSBiYWNrIGluIHRoZSByZXNvdXJjZSBsaXN0IHBvaW50ZWQgdG8gYnkgaGVhZAogICovCi12b2lkIGNwcWhwX2Rlc3Ryb3lfcmVzb3VyY2VfbGlzdCAoc3RydWN0IHJlc291cmNlX2xpc3RzICogcmVzb3VyY2VzKQordm9pZCBjcHFocF9kZXN0cm95X3Jlc291cmNlX2xpc3QgKHN0cnVjdCByZXNvdXJjZV9saXN0cyAqcmVzb3VyY2VzKQogewogCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlcywgKnRyZXM7CiAKQEAgLTE1MjIsNyArMTUyMiw3IEBACiAgKgogICogUHV0cyBub2RlIGJhY2sgaW4gdGhlIHJlc291cmNlIGxpc3QgcG9pbnRlZCB0byBieSBoZWFkCiAgKi8KLXZvaWQgY3BxaHBfZGVzdHJveV9ib2FyZF9yZXNvdXJjZXMgKHN0cnVjdCBwY2lfZnVuYyAqIGZ1bmMpCit2b2lkIGNwcWhwX2Rlc3Ryb3lfYm9hcmRfcmVzb3VyY2VzIChzdHJ1Y3QgcGNpX2Z1bmMgKmZ1bmMpCiB7CiAJc3RydWN0IHBjaV9yZXNvdXJjZSAqcmVzLCAqdHJlczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMKaW5kZXggMTdjMWYzNi4uNGEzOTJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jCkBAIC03OSw3ICs3OSw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd19kZXYgKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBjaGFyICpidWYpCiB7Ci0JY2hhciAqIG91dCA9IGJ1ZjsKKwljaGFyICpvdXQgPSBidWY7CiAJaW50IGluZGV4OwogCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgcGNpX2Z1bmMgKm5ld19zbG90OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jCmluZGV4IGNmM2FjMWUuLmY3Yjg2ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9jb3JlLmMKQEAgLTc0LDcgKzc0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdldF9jdXJfYnVzX2luZm8oc3RydWN0IHNsb3QgKipzbCkKIHsKIAlpbnQgcmMgPSAxOwotCXN0cnVjdCBzbG90ICogc2xvdF9jdXIgPSAqc2w7CisJc3RydWN0IHNsb3QgKnNsb3RfY3VyID0gKnNsOwogCiAJZGVidWcoIm9wdGlvbnMgPSAleFxuIiwgc2xvdF9jdXItPmN0cmwtPm9wdGlvbnMpOwogCWRlYnVnKCJyZXZpc2lvbiA9ICV4XG4iLCBzbG90X2N1ci0+Y3RybC0+cmV2aXNpb24pOwpAQCAtMTE0LDggKzExNCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGdldF9tYXhfc2xvdHMgKHZvaWQpCiB7Ci0Jc3RydWN0IHNsb3QgKiBzbG90X2N1cjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogdG1wOworCXN0cnVjdCBzbG90ICpzbG90X2N1cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJdTggc2xvdF9jb3VudCA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoKHRtcCwgJmlibXBocF9zbG90X2hlYWQpIHsKQEAgLTI4MCw3ICsyODAsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBnZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICogdmFsdWUpCitzdGF0aWMgaW50IGdldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQogewogCWludCByYyA9IC1FTk9ERVY7CiAJc3RydWN0IHNsb3QgKnBzbG90OwpAQCAtMzExLDcgKzMxMSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGdldF9sYXRjaF9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQorc3RhdGljIGludCBnZXRfbGF0Y2hfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQogewogCWludCByYyA9IC1FTk9ERVY7CiAJc3RydWN0IHNsb3QgKnBzbG90OwpAQCAtMzM4LDcgKzMzOCw3IEBACiB9CiAKIAotc3RhdGljIGludCBnZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKiB2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlpbnQgcmMgPSAtRU5PREVWOwogCXN0cnVjdCBzbG90ICpwc2xvdDsKQEAgLTM2NCw3ICszNjQsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBnZXRfYWRhcHRlcl9wcmVzZW50KHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKiB2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfcHJlc2VudChzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlpbnQgcmMgPSAtRU5PREVWOwogCXN0cnVjdCBzbG90ICpwc2xvdDsKQEAgLTQzMyw3ICs0MzMsNyBAQAogfQogCiAvKgotc3RhdGljIGludCBnZXRfbWF4X2FkYXB0ZXJfc3BlZWRfMShzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICogdmFsdWUsIHU4IGZsYWcpCitzdGF0aWMgaW50IGdldF9tYXhfYWRhcHRlcl9zcGVlZF8xKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlLCB1OCBmbGFnKQogewogCWludCByYyA9IC1FTk9ERVY7CiAJc3RydWN0IHNsb3QgKnBzbG90OwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGdldF9idXNfbmFtZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIGNoYXIgKiB2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2J1c19uYW1lKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgY2hhciAqdmFsdWUpCiB7CiAJaW50IHJjID0gLUVOT0RFVjsKIAlzdHJ1Y3Qgc2xvdCAqcHNsb3QgPSBOVUxMOwpAQCAtNjcxLDcgKzY3MSw3IEBACiB7CiAJc3RydWN0IHBjaV9mdW5jICpmdW5jX2N1cjsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdF9jdXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZpYm1waHBfc2xvdF9oZWFkKSB7CiAJCXNsb3RfY3VyID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBpYm1fc2xvdF9saXN0KTsKIAkJaWYgKHNsb3RfY3VyLT5mdW5jKSB7CkBAIC02OTYsOCArNjk2LDggQEAKIHN0YXRpYyB2b2lkIGZyZWVfc2xvdHModm9pZCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdF9jdXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHRtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKIAogCWRlYnVnKCIlcyAtLSBlbnRlclxuIiwgX19mdW5jX18pOwogCkBAIC04MjUsMTAgKzgyNSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgYnVzIGlzIGVtcHR5IG9yIG5vdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGlzX2J1c19lbXB0eShzdHJ1Y3Qgc2xvdCAqIHNsb3RfY3VyKQorc3RhdGljIGludCBpc19idXNfZW1wdHkoc3RydWN0IHNsb3QgKnNsb3RfY3VyKQogewogCWludCByYzsKLQlzdHJ1Y3Qgc2xvdCAqIHRtcF9zbG90OworCXN0cnVjdCBzbG90ICp0bXBfc2xvdDsKIAl1OCBpID0gc2xvdF9jdXItPmJ1c19vbi0+c2xvdF9taW47CiAKIAl3aGlsZSAoaSA8PSBzbG90X2N1ci0+YnVzX29uLT5zbG90X21heCkgewpAQCAtODU2LDcgKzg1Niw3IEBACiAgKiBQYXJhbWV0ZXJzOiBzbG90CiAgKiBSZXR1cm5zOiBidXMgaXMgc2V0ICgwKSBvciBlcnJvciBjb2RlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9idXMoc3RydWN0IHNsb3QgKiBzbG90X2N1cikKK3N0YXRpYyBpbnQgc2V0X2J1cyhzdHJ1Y3Qgc2xvdCAqc2xvdF9jdXIpCiB7CiAJaW50IHJjOwogCXU4IHNwZWVkOwpAQCAtOTU2LDcgKzk1Niw3IEBACiBzdGF0aWMgaW50IGNoZWNrX2xpbWl0YXRpb25zKHN0cnVjdCBzbG90ICpzbG90X2N1cikKIHsKIAl1OCBpOwotCXN0cnVjdCBzbG90ICogdG1wX3Nsb3Q7CisJc3RydWN0IHNsb3QgKnRtcF9zbG90OwogCXU4IGNvdW50ID0gMDsKIAl1OCBsaW1pdGF0aW9uID0gMDsKIApAQCAtMTA0NSw4ICsxMDQ1LDcgQEAKIAlyYyA9IGNoZWNrX2xpbWl0YXRpb25zKHNsb3RfY3VyKTsKIAlpZiAocmMpIHsKIAkJZXJyKCJBZGRpbmcgdGhpcyBjYXJkIGV4Y2VlZHMgdGhlIGxpbWl0YXRpb25zIG9mIHRoaXMgYnVzLlxuIik7Ci0JCWVycigiKGkuZS4sID4xIDEzM01IeiBjYXJkcyBydW5uaW5nIG9uIHNhbWUgYnVzLCBvciAiCi0JCSAgICAgIj4yIDY2IFBDSSBjYXJkcyBydW5uaW5nIG9uIHNhbWUgYnVzLlxuIik7CisJCWVycigiKGkuZS4sID4xIDEzM01IeiBjYXJkcyBydW5uaW5nIG9uIHNhbWUgYnVzLCBvciA+MiA2NiBQQ0kgY2FyZHMgcnVubmluZyBvbiBzYW1lIGJ1cy5cbiIpOwogCQllcnIoIlRyeSBob3QtYWRkaW5nIGludG8gYW5vdGhlciBidXNcbiIpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3Jfbm9wb3dlcjsKQEAgLTEwNzAsMTIgKzEwNjksMTAgQEAKIAkJCQkJIShTTE9UX1BXUkdEKHNsb3RfY3VyLT5zdGF0dXMpKSkKIAkJCWVycigicG93ZXIgZmF1bHQgb2NjdXJyZWQgdHJ5aW5nIHRvIHBvd2VyIHVwXG4iKTsKIAkJZWxzZSBpZiAoU0xPVF9CVVNfU1BFRUQoc2xvdF9jdXItPnN0YXR1cykpIHsKLQkJCWVycigiYnVzIHNwZWVkIG1pc21hdGNoIG9jY3VycmVkLiAgcGxlYXNlIGNoZWNrICIKLQkJCQkiY3VycmVudCBidXMgc3BlZWQgYW5kIGNhcmQgY2FwYWJpbGl0eVxuIik7CisJCQllcnIoImJ1cyBzcGVlZCBtaXNtYXRjaCBvY2N1cnJlZC4gIHBsZWFzZSBjaGVjayBjdXJyZW50IGJ1cyBzcGVlZCBhbmQgY2FyZCBjYXBhYmlsaXR5XG4iKTsKIAkJCXByaW50X2NhcmRfY2FwYWJpbGl0eShzbG90X2N1cik7CiAJCX0gZWxzZSBpZiAoU0xPVF9CVVNfTU9ERShzbG90X2N1ci0+ZXh0X3N0YXR1cykpIHsKLQkJCWVycigiYnVzIG1vZGUgbWlzbWF0Y2ggb2NjdXJyZWQuICBwbGVhc2UgY2hlY2sgIgotCQkJCSJjdXJyZW50IGJ1cyBtb2RlIGFuZCBjYXJkIGNhcGFiaWxpdHlcbiIpOworCQkJZXJyKCJidXMgbW9kZSBtaXNtYXRjaCBvY2N1cnJlZC4gIHBsZWFzZSBjaGVjayBjdXJyZW50IGJ1cyBtb2RlIGFuZCBjYXJkIGNhcGFiaWxpdHlcbiIpOwogCQkJcHJpbnRfY2FyZF9jYXBhYmlsaXR5KHNsb3RfY3VyKTsKIAkJfQogCQlpYm1waHBfdXBkYXRlX3Nsb3RfaW5mbyhzbG90X2N1cik7CkBAIC0xMDk4LDggKzEwOTUsNyBAQAogCQlnb3RvIGVycm9yX3Bvd2VyOwogCX0KIAlpZiAoU0xPVF9QT1dFUihzbG90X2N1ci0+c3RhdHVzKSAmJiAoU0xPVF9CVVNfU1BFRUQoc2xvdF9jdXItPnN0YXR1cykpKSB7Ci0JCWVycigiYnVzIHNwZWVkIG1pc21hdGNoIG9jY3VycmVkLiAgcGxlYXNlIGNoZWNrIGN1cnJlbnQgYnVzICIKLQkJCQkJInNwZWVkIGFuZCBjYXJkIGNhcGFiaWxpdHlcbiIpOworCQllcnIoImJ1cyBzcGVlZCBtaXNtYXRjaCBvY2N1cnJlZC4gIHBsZWFzZSBjaGVjayBjdXJyZW50IGJ1cyBzcGVlZCBhbmQgY2FyZCBjYXBhYmlsaXR5XG4iKTsKIAkJcHJpbnRfY2FyZF9jYXBhYmlsaXR5KHNsb3RfY3VyKTsKIAkJZ290byBlcnJvcl9wb3dlcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9lYmRhLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9lYmRhLmMKaW5kZXggYmQwNDQxNS4uMGY2NWFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfZWJkYS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2ViZGEuYwpAQCAtNTYzLDcgKzU2Myw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IG9wdF9yaW9fbG8gKiBmaW5kX3J4ZV9udW0gKHU4IHNsb3RfbnVtKQorc3RhdGljIHN0cnVjdCBvcHRfcmlvX2xvICpmaW5kX3J4ZV9udW0gKHU4IHNsb3RfbnVtKQogewogCXN0cnVjdCBvcHRfcmlvX2xvICpvcHRfbG9fcHRyOwogCkBAIC01NzUsNyArNTc1LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBvcHRfcmlvICogZmluZF9jaGFzc2lzX251bSAodTggc2xvdF9udW0pCitzdGF0aWMgc3RydWN0IG9wdF9yaW8gKmZpbmRfY2hhc3Npc19udW0gKHU4IHNsb3RfbnVtKQogewogCXN0cnVjdCBvcHRfcmlvICpvcHRfdmdfcHRyOwogCkBAIC01OTMsNyArNTkzLDcgQEAKIHN0YXRpYyB1OCBjYWxjdWxhdGVfZmlyc3Rfc2xvdCAodTggc2xvdF9udW0pCiB7CiAJdTggZmlyc3Rfc2xvdCA9IDE7Ci0Jc3RydWN0IHNsb3QgKiBzbG90X2N1cjsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdF9jdXI7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsb3RfY3VyLCAmaWJtcGhwX3Nsb3RfaGVhZCwgaWJtX3Nsb3RfbGlzdCkgewogCQlpZiAoc2xvdF9jdXItPmN0cmwpIHsKQEAgLTYwNyw3ICs2MDcsNyBAQAogCiAjZGVmaW5lIFNMT1RfTkFNRV9TSVpFIDMwCiAKLXN0YXRpYyBjaGFyICpjcmVhdGVfZmlsZV9uYW1lIChzdHJ1Y3Qgc2xvdCAqIHNsb3RfY3VyKQorc3RhdGljIGNoYXIgKmNyZWF0ZV9maWxlX25hbWUgKHN0cnVjdCBzbG90ICpzbG90X2N1cikKIHsKIAlzdHJ1Y3Qgb3B0X3JpbyAqb3B0X3ZnX3B0ciA9IE5VTEw7CiAJc3RydWN0IG9wdF9yaW9fbG8gKm9wdF9sb19wdHIgPSBOVUxMOwpAQCAtMTE5Miw3ICsxMTkyLDcgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQotc3RhdGljIGludCBpYm1waHBfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICogZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzKQorc3RhdGljIGludCBpYm1waHBfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKaW5kZXggNWZjN2EwOC4uYTkzNjAyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogKgogKiBSZXR1cm4gICAwIG9yIGVycm9yIGNvZGVzCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBpYm1waHBfaHBjX3JlYWRzbG90IChzdHJ1Y3Qgc2xvdCAqIHBzbG90LCB1OCBjbWQsIHU4ICogcHN0YXR1cykKK2ludCBpYm1waHBfaHBjX3JlYWRzbG90IChzdHJ1Y3Qgc2xvdCAqcHNsb3QsIHU4IGNtZCwgdTggKnBzdGF0dXMpCiB7CiAJdm9pZCBfX2lvbWVtICp3cGdfYmJhciA9IE5VTEw7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0bHJfcHRyOwpAQCAtNjcyLDcgKzY3Miw3IEBACiAqCiAqIEFjdGlvbjogaXNzdWUgYSBXUklURSBjb21tYW5kIHRvIEhQQwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaWJtcGhwX2hwY193cml0ZXNsb3QgKHN0cnVjdCBzbG90ICogcHNsb3QsIHU4IGNtZCkKK2ludCBpYm1waHBfaHBjX3dyaXRlc2xvdCAoc3RydWN0IHNsb3QgKnBzbG90LCB1OCBjbWQpCiB7CiAJdm9pZCBfX2lvbWVtICp3cGdfYmJhciA9IE5VTEw7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0bHJfcHRyOwpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKICogVmFsdWU6CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgaHBjX3dhaXRfY3Rscl9ub3R3b3JraW5nIChpbnQgdGltZW91dCwgc3RydWN0IGNvbnRyb2xsZXIgKmN0bHJfcHRyLCB2b2lkIF9faW9tZW0gKndwZ19iYmFyLAotCQkJCSAgICB1OCAqIHBzdGF0dXMpCisJCQkJICAgIHU4ICpwc3RhdHVzKQogewogCWludCByYyA9IDA7CiAJdTggZG9uZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX3BjaS5jCmluZGV4IDYzOWVhM2EuLjJmZDI5NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX3BjaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiBXZSBhbHNvIGFzc2lnbiB0aGUgc2FtZSBpcnEgbnVtYmVycyBmb3IgbXVsdGkgZnVuY3Rpb24gZGV2aWNlcy4KICAqIFRoZXNlIGFyZSBQSUMgbW9kZSwgc28gc2hvdWxkbid0IG1hdHRlciBuLmUud2F5cyAoaG9wZWZ1bGx5KQogICovCi1zdGF0aWMgdm9pZCBhc3NpZ25fYWx0X2lycSAoc3RydWN0IHBjaV9mdW5jICogY3VyX2Z1bmMsIHU4IGNsYXNzX2NvZGUpCitzdGF0aWMgdm9pZCBhc3NpZ25fYWx0X2lycSAoc3RydWN0IHBjaV9mdW5jICpjdXJfZnVuYywgdTggY2xhc3NfY29kZSkKIHsKIAlpbnQgajsKIAlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CkBAIC0xMzcsOCArMTM3LDggQEAKIAkJCQkgICAgICJQbGVhc2UgY2hvb3NlIGFub3RoZXIgZGV2aWNlLlxuIiwgY3VyX2Z1bmMtPmRldmljZSk7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9IGVsc2UgaWYgKGNsYXNzID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgewotCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHBsdWdnaW5nLiAiCi0JCQkJICAgICAiUGxlYXNlIGNob29zZSBhbm90aGVyIGRldmljZS5cbiIsIGN1cl9mdW5jLT5kZXZpY2UpOworCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHBsdWdnaW5nLiBQbGVhc2UgY2hvb3NlIGFub3RoZXIgZGV2aWNlLlxuIiwKKwkJCQkgICAgIGN1cl9mdW5jLT5kZXZpY2UpOwogCQkJCXJldHVybiAtRU5PREVWOwogCQkJfQogCQkJc3dpdGNoIChoZHJfdHlwZSkgewpAQCAtMTc5LDggKzE3OSw4IEBACiAJCQkJY2FzZSBQQ0lfSEVBREVSX1RZUEVfTVVMVElCUklER0U6CiAJCQkJCWNsYXNzID4+PSA4OwogCQkJCQlpZiAoY2xhc3MgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKLQkJCQkJCWVyciAoIlRoaXMgJXggaXMgbm90IFBDSS10by1QQ0kgYnJpZGdlLCBhbmQgYXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWdnaW5nLiAiCi0JCQkJCQkgICAgICJQbGVhc2UgaW5zZXJ0IGFub3RoZXIgY2FyZC5cbiIsIGN1cl9mdW5jLT5kZXZpY2UpOworCQkJCQkJZXJyICgiVGhpcyAleCBpcyBub3QgUENJLXRvLVBDSSBicmlkZ2UsIGFuZCBhcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QtcGx1Z2dpbmcuICBQbGVhc2UgaW5zZXJ0IGFub3RoZXIgY2FyZC5cbiIsCisJCQkJCQkgICAgIGN1cl9mdW5jLT5kZXZpY2UpOwogCQkJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQkJCX0KIAkJCQkJYXNzaWduX2FsdF9pcnEgKGN1cl9mdW5jLCBjbGFzc19jb2RlKTsKQEAgLTI0Nyw4ICsyNDcsOCBAQAogCQkJCQljbGFzcyA+Pj0gODsKIAkJCQkJZGVidWcgKCJjbGFzcyBub3cgaXMgJXhcbiIsIGNsYXNzKTsKIAkJCQkJaWYgKGNsYXNzICE9IFBDSV9DTEFTU19CUklER0VfUENJKSB7Ci0JCQkJCQllcnIgKCJUaGlzICV4IGlzIG5vdCBQQ0ktdG8tUENJIGJyaWRnZSwgYW5kIGFzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdC1wbHVnZ2luZy4gIgotCQkJCQkJICAgICAiUGxlYXNlIGluc2VydCBhbm90aGVyIGNhcmQuXG4iLCBjdXJfZnVuYy0+ZGV2aWNlKTsKKwkJCQkJCWVyciAoIlRoaXMgJXggaXMgbm90IFBDSS10by1QQ0kgYnJpZGdlLCBhbmQgYXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWdnaW5nLiAgUGxlYXNlIGluc2VydCBhbm90aGVyIGNhcmQuXG4iLAorCQkJCQkJICAgICBjdXJfZnVuYy0+ZGV2aWNlKTsKIAkJCQkJCXJldHVybiAtRU5PREVWOwogCQkJCQl9CiAKQEAgLTEwNzMsNyArMTA3Myw3IEBACiAgKiBJbnB1dDogYnJpZGdlIGZ1bmN0aW9uCiAgKiBPdXRwdXQ6IGFtb3VudCBvZiByZXNvdXJjZXMgbmVlZGVkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IHJlc19uZWVkZWQgKnNjYW5fYmVoaW5kX2JyaWRnZSAoc3RydWN0IHBjaV9mdW5jICogZnVuYywgdTggYnVzbm8pCitzdGF0aWMgc3RydWN0IHJlc19uZWVkZWQgKnNjYW5fYmVoaW5kX2JyaWRnZSAoc3RydWN0IHBjaV9mdW5jICpmdW5jLCB1OCBidXNubykKIHsKIAlpbnQgY291bnQsIGxlbls2XTsKIAl1MTYgdmVuZG9yX2lkOwpAQCAtMTEyNSwxMyArMTEyNSwxMSBAQAogCiAJCQkJY2xhc3MgPj49IDg7CS8qIHRvIHRha2UgcmV2aXNpb24gb3V0LCBjbGFzcyA9IGNsYXNzLnN1YmNsYXNzLnByb2cgaS9mICovCiAJCQkJaWYgKGNsYXNzID09IFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EpIHsKLQkJCQkJZXJyICgiVGhlIGRldmljZSAleCBpcyBWR0EgY29tcGF0aWJsZSBhbmQgYXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHBsdWdnaW5nLiAiCi0JCQkJCSAgICAgIlBsZWFzZSBjaG9vc2UgYW5vdGhlciBkZXZpY2UuXG4iLCBkZXZpY2UpOworCQkJCQllcnIgKCJUaGUgZGV2aWNlICV4IGlzIFZHQSBjb21wYXRpYmxlIGFuZCBhcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QgcGx1Z2dpbmcuICBQbGVhc2UgY2hvb3NlIGFub3RoZXIgZGV2aWNlLlxuIiwgZGV2aWNlKTsKIAkJCQkJYW1vdW50LT5ub3RfY29ycmVjdCA9IDE7CiAJCQkJCXJldHVybiBhbW91bnQ7CiAJCQkJfSBlbHNlIGlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EpIHsKLQkJCQkJZXJyICgiVGhlIGRldmljZSAleCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QgcGx1Z2dpbmcuICIKLQkJCQkJICAgICAiUGxlYXNlIGNob29zZSBhbm90aGVyIGRldmljZS5cbiIsIGRldmljZSk7CisJCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHBsdWdnaW5nLiAgUGxlYXNlIGNob29zZSBhbm90aGVyIGRldmljZS5cbiIsIGRldmljZSk7CiAJCQkJCWFtb3VudC0+bm90X2NvcnJlY3QgPSAxOwogCQkJCQlyZXR1cm4gYW1vdW50OwogCQkJCX0KQEAgLTE0ODMsMTIgKzE0ODEsMTAgQEAKIAkJCWRlYnVnICgiaGRyX3R5cGUgJXgsIGNsYXNzICV4XG4iLCBoZHJfdHlwZSwgY2xhc3MpOwogCQkJY2xhc3MgPj49IDg7CS8qIHRvIHRha2UgcmV2aXNpb24gb3V0LCBjbGFzcyA9IGNsYXNzLnN1YmNsYXNzLnByb2cgaS9mICovCiAJCQlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSkgewotCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggZnVuY3Rpb24gJXggaXMgVkdBIGNvbXBhdGlibGUgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdCByZW1vdmluZy4gIgotCQkJCSAgICAgIlBsZWFzZSBjaG9vc2UgYW5vdGhlciBkZXZpY2UuXG4iLCBkZXZpY2UsIGZ1bmN0aW9uKTsKKwkJCQllcnIgKCJUaGUgZGV2aWNlICV4IGZ1bmN0aW9uICV4IGlzIFZHQSBjb21wYXRpYmxlIGFuZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QgcmVtb3ZpbmcuICBQbGVhc2UgY2hvb3NlIGFub3RoZXIgZGV2aWNlLlxuIiwgZGV2aWNlLCBmdW5jdGlvbik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9IGVsc2UgaWYgKGNsYXNzID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgewotCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggZnVuY3Rpb24gJXggaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHJlbW92aW5nLiAiCi0JCQkJICAgICAiUGxlYXNlIGNob29zZSBhbm90aGVyIGRldmljZS5cbiIsIGRldmljZSwgZnVuY3Rpb24pOworCQkJCWVyciAoIlRoZSBkZXZpY2UgJXggZnVuY3Rpb24gJXggaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90IHJlbW92aW5nLiAgUGxlYXNlIGNob29zZSBhbm90aGVyIGRldmljZS5cbiIsIGRldmljZSwgZnVuY3Rpb24pOwogCQkJCXJldHVybiAtRU5PREVWOwogCQkJfQogCkBAIC0xNTEzLDkgKzE1MDksNyBAQAogCQkJCWNhc2UgUENJX0hFQURFUl9UWVBFX0JSSURHRToKIAkJCQkJY2xhc3MgPj49IDg7CiAJCQkJCWlmIChjbGFzcyAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgewotCQkJCQkJZXJyICgiVGhpcyBkZXZpY2UgJXggZnVuY3Rpb24gJXggaXMgbm90IFBDSS10by1QQ0kgYnJpZGdlLCAiCi0JCQkJCQkgICAgICJhbmQgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXJlbW92aW5nLiAiCi0JCQkJCQkgICAgICJQbGVhc2UgdHJ5IGFub3RoZXIgY2FyZC5cbiIsIGRldmljZSwgZnVuY3Rpb24pOworCQkJCQkJZXJyICgiVGhpcyBkZXZpY2UgJXggZnVuY3Rpb24gJXggaXMgbm90IFBDSS10by1QQ0kgYnJpZGdlLCBhbmQgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXJlbW92aW5nLiAgUGxlYXNlIHRyeSBhbm90aGVyIGNhcmQuXG4iLCBkZXZpY2UsIGZ1bmN0aW9uKTsKIAkJCQkJCXJldHVybiAtRU5PREVWOwogCQkJCQl9CiAJCQkJCXJjID0gdW5jb25maWd1cmVfYm9vdF9icmlkZ2UgKGJ1c25vLCBkZXZpY2UsIGZ1bmN0aW9uKTsKQEAgLTE1MjksOSArMTUyMyw3IEBACiAJCQkJY2FzZSBQQ0lfSEVBREVSX1RZUEVfTVVMVElCUklER0U6CiAJCQkJCWNsYXNzID4+PSA4OwogCQkJCQlpZiAoY2xhc3MgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKLQkJCQkJCWVyciAoIlRoaXMgZGV2aWNlICV4IGZ1bmN0aW9uICV4IGlzIG5vdCBQQ0ktdG8tUENJIGJyaWRnZSwgIgotCQkJCQkJICAgICAiYW5kIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdC1yZW1vdmluZy4gIgotCQkJCQkJICAgICAiUGxlYXNlIHRyeSBhbm90aGVyIGNhcmQuXG4iLCBkZXZpY2UsIGZ1bmN0aW9uKTsKKwkJCQkJCWVyciAoIlRoaXMgZGV2aWNlICV4IGZ1bmN0aW9uICV4IGlzIG5vdCBQQ0ktdG8tUENJIGJyaWRnZSwgIGFuZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QtcmVtb3ZpbmcuICBQbGVhc2UgdHJ5IGFub3RoZXIgY2FyZC5cbiIsIGRldmljZSwgZnVuY3Rpb24pOwogCQkJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQkJCX0KIAkJCQkJcmMgPSB1bmNvbmZpZ3VyZV9ib290X2JyaWRnZSAoYnVzbm8sIGRldmljZSwgZnVuY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcmVzLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9yZXMuYwppbmRleCBhMjY1YWNiLi5mMzQ3NDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9yZXMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9yZXMuYwpAQCAtNDYsOSArNDYsOSBAQAogCiBzdGF0aWMgTElTVF9IRUFEKGdidXNlcyk7CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX25vZGUgKiBfX2luaXQgYWxsb2NfZXJyb3JfYnVzIChzdHJ1Y3QgZWJkYV9wY2lfcnNyYyAqIGN1cnIsIHU4IGJ1c25vLCBpbnQgZmxhZykKK3N0YXRpYyBzdHJ1Y3QgYnVzX25vZGUgKiBfX2luaXQgYWxsb2NfZXJyb3JfYnVzIChzdHJ1Y3QgZWJkYV9wY2lfcnNyYyAqY3VyciwgdTggYnVzbm8sIGludCBmbGFnKQogewotCXN0cnVjdCBidXNfbm9kZSAqIG5ld2J1czsKKwlzdHJ1Y3QgYnVzX25vZGUgKm5ld2J1czsKIAogCWlmICghKGN1cnIpICYmICEoZmxhZykpIHsKIAkJZXJyICgiTlVMTCBwb2ludGVyIHBhc3NlZFxuIik7CkBAIC02OSw3ICs2OSw3IEBACiAJcmV0dXJuIG5ld2J1czsKIH0KIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZV9ub2RlICogX19pbml0IGFsbG9jX3Jlc291cmNlcyAoc3RydWN0IGViZGFfcGNpX3JzcmMgKiBjdXJyKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZV9ub2RlICogX19pbml0IGFsbG9jX3Jlc291cmNlcyAoc3RydWN0IGViZGFfcGNpX3JzcmMgKmN1cnIpCiB7CiAJc3RydWN0IHJlc291cmNlX25vZGUgKnJzOwogCkBAIC05Myw3ICs5Myw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFsbG9jX2J1c19yYW5nZSAoc3RydWN0IGJ1c19ub2RlICoqbmV3X2J1cywgc3RydWN0IHJhbmdlX25vZGUgKipuZXdfcmFuZ2UsIHN0cnVjdCBlYmRhX3BjaV9yc3JjICpjdXJyLCBpbnQgZmxhZywgdTggZmlyc3RfYnVzKQogewotCXN0cnVjdCBidXNfbm9kZSAqIG5ld2J1czsKKwlzdHJ1Y3QgYnVzX25vZGUgKm5ld2J1czsKIAlzdHJ1Y3QgcmFuZ2Vfbm9kZSAqbmV3cmFuZ2U7CiAJdTggbnVtX3JhbmdlcyA9IDA7CiAKQEAgLTc4OSw4ICs3ODksNyBAQAogCWJ1c19jdXIgPSBmaW5kX2J1c193cHJldiAocmVzLT5idXNubywgTlVMTCwgMCk7CiAKIAlpZiAoIWJ1c19jdXIpIHsKLQkJZXJyICgiY2Fubm90IGZpbmQgY29ycmVzcG9uZGluZyBidXMgb2YgdGhlIGlvIHJlc291cmNlIHRvIHJlbW92ZSAgIgotCQkJImJhaWxpbmcgb3V0Li4uXG4iKTsKKwkJZXJyICgiY2Fubm90IGZpbmQgY29ycmVzcG9uZGluZyBidXMgb2YgdGhlIGlvIHJlc291cmNlIHRvIHJlbW92ZSAgYmFpbGluZyBvdXQuLi5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTkzNCw5ICs5MzMsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHJhbmdlX25vZGUgKiBmaW5kX3JhbmdlIChzdHJ1Y3QgYnVzX25vZGUgKmJ1c19jdXIsIHN0cnVjdCByZXNvdXJjZV9ub2RlICogcmVzKQorc3RhdGljIHN0cnVjdCByYW5nZV9ub2RlICpmaW5kX3JhbmdlIChzdHJ1Y3QgYnVzX25vZGUgKmJ1c19jdXIsIHN0cnVjdCByZXNvdXJjZV9ub2RlICpyZXMpCiB7Ci0Jc3RydWN0IHJhbmdlX25vZGUgKiByYW5nZSA9IE5VTEw7CisJc3RydWN0IHJhbmdlX25vZGUgKnJhbmdlID0gTlVMTDsKIAogCXN3aXRjaCAocmVzLT50eXBlKSB7CiAJCWNhc2UgSU86CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCmluZGV4IGNmYTkyYTkuLjU2ZDg0ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCkBAIC01OSwxNCArNTksMTIgQEAKICNkZWZpbmUgRFJJVkVSX0RFU0MJIlBDSSBIb3QgUGx1ZyBQQ0kgQ29yZSIKIAogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQogc3RhdGljIExJU1RfSEVBRChwY2lfaG90cGx1Z19zbG90X2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChwY2lfaHBfbXV0ZXgpOwogCiAvKiBXZWVlLCBmdW4gd2l0aCBtYWNyb3MuLi4gKi8KLSNkZWZpbmUgR0VUX1NUQVRVUyhuYW1lLHR5cGUpCVwKLXN0YXRpYyBpbnQgZ2V0XyMjbmFtZSAoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdHlwZSAqdmFsdWUpCQlcCisjZGVmaW5lIEdFVF9TVEFUVVMobmFtZSwgdHlwZSkJXAorc3RhdGljIGludCBnZXRfIyNuYW1lKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHR5cGUgKnZhbHVlKQkJXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyAqb3BzID0gc2xvdC0+b3BzOwkJCVwKIAlpbnQgcmV0dmFsID0gMDsJCQkJCQkJXApAQCAtOTIsNDIgKzkwLDQxIEBACiAKIAlyZXR2YWwgPSBnZXRfcG93ZXJfc3RhdHVzKHNsb3QtPmhvdHBsdWcsICZ2YWx1ZSk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBleGl0OwotCXJldHZhbCA9IHNwcmludGYgKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7Ci1leGl0OgotCXJldHVybiByZXR2YWw7CisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBwb3dlcl93cml0ZV9maWxlKHN0cnVjdCBwY2lfc2xvdCAqcGNpX3Nsb3QsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGNvdW50KQorCQkJCXNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90ID0gcGNpX3Nsb3QtPmhvdHBsdWc7CiAJdW5zaWduZWQgbG9uZyBscG93ZXI7CiAJdTggcG93ZXI7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlscG93ZXIgPSBzaW1wbGVfc3RydG91bCAoYnVmLCBOVUxMLCAxMCk7CisJbHBvd2VyID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAJcG93ZXIgPSAodTgpKGxwb3dlciAmIDB4ZmYpOwotCWRiZyAoInBvd2VyID0gJWRcbiIsIHBvd2VyKTsKKwlkYmcoInBvd2VyID0gJWRcbiIsIHBvd2VyKTsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQoc2xvdC0+b3BzLT5vd25lcikpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KIAlzd2l0Y2ggKHBvd2VyKSB7Ci0JCWNhc2UgMDoKLQkJCWlmIChzbG90LT5vcHMtPmRpc2FibGVfc2xvdCkKLQkJCQlyZXR2YWwgPSBzbG90LT5vcHMtPmRpc2FibGVfc2xvdChzbG90KTsKLQkJCWJyZWFrOworCWNhc2UgMDoKKwkJaWYgKHNsb3QtPm9wcy0+ZGlzYWJsZV9zbG90KQorCQkJcmV0dmFsID0gc2xvdC0+b3BzLT5kaXNhYmxlX3Nsb3Qoc2xvdCk7CisJCWJyZWFrOwogCi0JCWNhc2UgMToKLQkJCWlmIChzbG90LT5vcHMtPmVuYWJsZV9zbG90KQotCQkJCXJldHZhbCA9IHNsb3QtPm9wcy0+ZW5hYmxlX3Nsb3Qoc2xvdCk7Ci0JCQlicmVhazsKKwljYXNlIDE6CisJCWlmIChzbG90LT5vcHMtPmVuYWJsZV9zbG90KQorCQkJcmV0dmFsID0gc2xvdC0+b3BzLT5lbmFibGVfc2xvdChzbG90KTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCWVyciAoIklsbGVnYWwgdmFsdWUgc3BlY2lmaWVkIGZvciBwb3dlclxuIik7Ci0JCQlyZXR2YWwgPSAtRUlOVkFMOworCWRlZmF1bHQ6CisJCWVycigiSWxsZWdhbCB2YWx1ZSBzcGVjaWZpZWQgZm9yIHBvd2VyXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKIAl9CiAJbW9kdWxlX3B1dChzbG90LT5vcHMtPm93bmVyKTsKIApAQCAtMTUwLDI0ICsxNDcsMjIgQEAKIAogCXJldHZhbCA9IGdldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QtPmhvdHBsdWcsICZ2YWx1ZSk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBleGl0OwotCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKKwkJcmV0dXJuIHJldHZhbDsKIAotZXhpdDoKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGF0dGVudGlvbl93cml0ZV9maWxlKHN0cnVjdCBwY2lfc2xvdCAqc2xvdCwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQpCisJCQkJICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyAqb3BzID0gc2xvdC0+aG90cGx1Zy0+b3BzOwogCXVuc2lnbmVkIGxvbmcgbGF0dGVudGlvbjsKIAl1OCBhdHRlbnRpb247CiAJaW50IHJldHZhbCA9IDA7CiAKLQlsYXR0ZW50aW9uID0gc2ltcGxlX3N0cnRvdWwgKGJ1ZiwgTlVMTCwgMTApOworCWxhdHRlbnRpb24gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAlhdHRlbnRpb24gPSAodTgpKGxhdHRlbnRpb24gJiAweGZmKTsKLQlkYmcgKCIgLSBhdHRlbnRpb24gPSAlZFxuIiwgYXR0ZW50aW9uKTsKKwlkYmcoIiAtIGF0dGVudGlvbiA9ICVkXG4iLCBhdHRlbnRpb24pOwogCiAJaWYgKCF0cnlfbW9kdWxlX2dldChvcHMtPm93bmVyKSkgewogCQlyZXR2YWwgPSAtRU5PREVWOwpAQCAtMTk2LDExICsxOTEsOSBAQAogCiAJcmV0dmFsID0gZ2V0X2xhdGNoX3N0YXR1cyhzbG90LT5ob3RwbHVnLCAmdmFsdWUpOwogCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdDsKLQlyZXR2YWwgPSBzcHJpbnRmIChidWYsICIlZFxuIiwgdmFsdWUpOworCQlyZXR1cm4gcmV0dmFsOwogCi1leGl0OgotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfc2xvdF9hdHRyaWJ1dGUgaG90cGx1Z19zbG90X2F0dHJfbGF0Y2ggPSB7CkBAIC0yMTUsMTEgKzIwOCw5IEBACiAKIAlyZXR2YWwgPSBnZXRfYWRhcHRlcl9zdGF0dXMoc2xvdC0+aG90cGx1ZywgJnZhbHVlKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXQ7Ci0JcmV0dmFsID0gc3ByaW50ZiAoYnVmLCAiJWRcbiIsIHZhbHVlKTsKKwkJcmV0dXJuIHJldHZhbDsKIAotZXhpdDoKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX3Nsb3RfYXR0cmlidXRlIGhvdHBsdWdfc2xvdF9hdHRyX3ByZXNlbmNlID0gewpAQCAtMjI4LDcgKzIxOSw3IEBACiB9OwogCiBzdGF0aWMgc3NpemVfdCB0ZXN0X3dyaXRlX2ZpbGUoc3RydWN0IHBjaV9zbG90ICpwY2lfc2xvdCwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQpCisJCQkgICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QgPSBwY2lfc2xvdC0+aG90cGx1ZzsKIAl1bnNpZ25lZCBsb25nIGx0ZXN0OwpAQCAtMjM3LDcgKzIyOCw3IEBACiAKIAlsdGVzdCA9IHNpbXBsZV9zdHJ0b3VsIChidWYsIE5VTEwsIDEwKTsKIAl0ZXN0ID0gKHUzMikobHRlc3QgJiAweGZmZmZmZmZmKTsKLQlkYmcgKCJ0ZXN0ID0gJWRcbiIsIHRlc3QpOworCWRiZygidGVzdCA9ICVkXG4iLCB0ZXN0KTsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQoc2xvdC0+b3BzLT5vd25lcikpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKQEAgLTI2MSw2ICsyNTIsNyBAQAogc3RhdGljIGJvb2wgaGFzX3Bvd2VyX2ZpbGUoc3RydWN0IHBjaV9zbG90ICpwY2lfc2xvdCkKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90ID0gcGNpX3Nsb3QtPmhvdHBsdWc7CisKIAlpZiAoKCFzbG90KSB8fCAoIXNsb3QtPm9wcykpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAoKHNsb3QtPm9wcy0+ZW5hYmxlX3Nsb3QpIHx8CkBAIC0yNzMsNiArMjY1LDcgQEAKIHN0YXRpYyBib29sIGhhc19hdHRlbnRpb25fZmlsZShzdHJ1Y3QgcGNpX3Nsb3QgKnBjaV9zbG90KQogewogCXN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QgPSBwY2lfc2xvdC0+aG90cGx1ZzsKKwogCWlmICgoIXNsb3QpIHx8ICghc2xvdC0+b3BzKSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmICgoc2xvdC0+b3BzLT5zZXRfYXR0ZW50aW9uX3N0YXR1cykgfHwKQEAgLTI4NCw2ICsyNzcsNyBAQAogc3RhdGljIGJvb2wgaGFzX2xhdGNoX2ZpbGUoc3RydWN0IHBjaV9zbG90ICpwY2lfc2xvdCkKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90ID0gcGNpX3Nsb3QtPmhvdHBsdWc7CisKIAlpZiAoKCFzbG90KSB8fCAoIXNsb3QtPm9wcykpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAoc2xvdC0+b3BzLT5nZXRfbGF0Y2hfc3RhdHVzKQpAQCAtMjk0LDYgKzI4OCw3IEBACiBzdGF0aWMgYm9vbCBoYXNfYWRhcHRlcl9maWxlKHN0cnVjdCBwY2lfc2xvdCAqcGNpX3Nsb3QpCiB7CiAJc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCA9IHBjaV9zbG90LT5ob3RwbHVnOworCiAJaWYgKCghc2xvdCkgfHwgKCFzbG90LT5vcHMpKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHNsb3QtPm9wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKQpAQCAtMzA0LDYgKzI5OSw3IEBACiBzdGF0aWMgYm9vbCBoYXNfdGVzdF9maWxlKHN0cnVjdCBwY2lfc2xvdCAqcGNpX3Nsb3QpCiB7CiAJc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCA9IHBjaV9zbG90LT5ob3RwbHVnOworCiAJaWYgKCghc2xvdCkgfHwgKCFzbG90LT5vcHMpKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHNsb3QtPm9wcy0+aGFyZHdhcmVfdGVzdCkKQEAgLTM5NywxMyArMzkzLDEzIEBACiAJcGNpX2hwX3JlbW92ZV9tb2R1bGVfbGluayhzbG90KTsKIH0KIAotc3RhdGljIHN0cnVjdCBob3RwbHVnX3Nsb3QgKmdldF9zbG90X2Zyb21fbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90ICpnZXRfc2xvdF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWxpc3RfZm9yX2VhY2ggKHRtcCwgJnBjaV9ob3RwbHVnX3Nsb3RfbGlzdCkgewotCQlzbG90ID0gbGlzdF9lbnRyeSAodG1wLCBzdHJ1Y3QgaG90cGx1Z19zbG90LCBzbG90X2xpc3QpOworCWxpc3RfZm9yX2VhY2godG1wLCAmcGNpX2hvdHBsdWdfc2xvdF9saXN0KSB7CisJCXNsb3QgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGhvdHBsdWdfc2xvdCwgc2xvdF9saXN0KTsKIAkJaWYgKHN0cmNtcChob3RwbHVnX3Nsb3RfbmFtZShzbG90KSwgbmFtZSkgPT0gMCkKIAkJCXJldHVybiBzbG90OwogCX0KQEAgLTQzNiw4ICs0MzIsNyBAQAogCWlmICgoc2xvdC0+aW5mbyA9PSBOVUxMKSB8fCAoc2xvdC0+b3BzID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoc2xvdC0+cmVsZWFzZSA9PSBOVUxMKSB7Ci0JCWRiZygiV2h5IGFyZSB5b3UgdHJ5aW5nIHRvIHJlZ2lzdGVyIGEgaG90cGx1ZyBzbG90ICIKLQkJICAgICJ3aXRob3V0IGEgcHJvcGVyIHJlbGVhc2UgZnVuY3Rpb24/XG4iKTsKKwkJZGJnKCJXaHkgYXJlIHlvdSB0cnlpbmcgdG8gcmVnaXN0ZXIgYSBob3RwbHVnIHNsb3Qgd2l0aG91dCBhIHByb3BlciByZWxlYXNlIGZ1bmN0aW9uP1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDY4LDYgKzQ2Myw3IEBACiAJbXV0ZXhfdW5sb2NrKCZwY2lfaHBfbXV0ZXgpOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfX3BjaV9ocF9yZWdpc3Rlcik7CiAKIC8qKgogICogcGNpX2hwX2RlcmVnaXN0ZXIgLSBkZXJlZ2lzdGVyIGEgaG90cGx1Z19zbG90IHdpdGggdGhlIFBDSSBob3RwbHVnIHN1YnN5c3RlbQpAQCAtNTA2LDYgKzUwMiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9ocF9kZXJlZ2lzdGVyKTsKIAogLyoqCiAgKiBwY2lfaHBfY2hhbmdlX3Nsb3RfaW5mbyAtIGNoYW5nZXMgdGhlIHNsb3QncyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaW4gdGhlIGNvcmUKQEAgLTUyNywyNCArNTI0LDIzIEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9ocF9jaGFuZ2Vfc2xvdF9pbmZvKTsKIAotc3RhdGljIGludCBfX2luaXQgcGNpX2hvdHBsdWdfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9ob3RwbHVnX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwogCiAJcmVzdWx0ID0gY3BjaV9ob3RwbHVnX2luaXQoZGVidWcpOwogCWlmIChyZXN1bHQpIHsKLQkJZXJyICgiY3BjaV9ob3RwbHVnX2luaXQgd2l0aCBlcnJvciAlZFxuIiwgcmVzdWx0KTsKLQkJZ290byBlcnJfY3BjaTsKKwkJZXJyKCJjcGNpX2hvdHBsdWdfaW5pdCB3aXRoIGVycm9yICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCWluZm8gKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKLQotZXJyX2NwY2k6CisJaW5mbyhEUklWRVJfREVTQyAiIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHBjaV9ob3RwbHVnX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNpX2hvdHBsdWdfZXhpdCh2b2lkKQogewogCWNwY2lfaG90cGx1Z19leGl0KCk7CiB9CkBAIC01NTcsNyArNTUzLDMgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWdnaW5nIG1vZGUgZW5hYmxlZCBvciBub3QiKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoX19wY2lfaHBfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwocGNpX2hwX2RlcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwocGNpX2hwX2NoYW5nZV9zbG90X2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCmluZGV4IDIwZmVhNTcuLjkzY2M5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTEwMywxMCArMTAzLDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyIF9faW5pdGRhdGEgZHVtbXlfZHJpdmVyID0gewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAicGNpZWhwX2R1bW15IiwKKwkubmFtZQkJPSAicGNpZWhwX2R1bW15IiwKIAkucG9ydF90eXBlCT0gUENJRV9BTllfUE9SVCwKIAkuc2VydmljZQk9IFBDSUVfUE9SVF9TRVJWSUNFX0hQLAotICAgICAgICAucHJvYmUgICAgICAgICAgPSBkdW1teV9wcm9iZSwKKwkucHJvYmUJCT0gZHVtbXlfcHJvYmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZWxlY3RfZGV0ZWN0aW9uX21vZGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwppbmRleCAwZTBhMmZmLi5hMjI5N2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCkBAIC0yNjYsOCArMjY2LDcgQEAKIAlyYyA9IGluaXRfc2xvdChjdHJsKTsKIAlpZiAocmMpIHsKIAkJaWYgKHJjID09IC1FQlVTWSkKLQkJCWN0cmxfd2FybihjdHJsLCAiU2xvdCBhbHJlYWR5IHJlZ2lzdGVyZWQgYnkgYW5vdGhlciAiCi0JCQkJICAiaG90cGx1ZyBkcml2ZXJcbiIpOworCQkJY3RybF93YXJuKGN0cmwsICJTbG90IGFscmVhZHkgcmVnaXN0ZXJlZCBieSBhbm90aGVyIGhvdHBsdWcgZHJpdmVyXG4iKTsKIAkJZWxzZQogCQkJY3RybF9lcnIoY3RybCwgIlNsb3QgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfb3V0X3JlbGVhc2VfY3RscjsKQEAgLTMxMiwxMiArMzExLDEyIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcGNpZWhwX3N1c3BlbmQgKHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQorc3RhdGljIGludCBwY2llaHBfc3VzcGVuZChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwY2llaHBfcmVzdW1lIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcGNpZWhwX3Jlc3VtZShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCBjNzVlNmE2Li5mZjMyZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgIGhvdHBsdWcgY29udHJvbGxlciBsb2dpYwogICovCiAKLXN0YXRpYyB2b2lkIHNldF9zbG90X29mZihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHNsb3QgKiBwc2xvdCkKK3N0YXRpYyB2b2lkIHNldF9zbG90X29mZihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHNsb3QgKnBzbG90KQogewogCS8qIHR1cm4gb2ZmIHNsb3QsIHR1cm4gb24gQW1iZXIgTEVELCB0dXJuIG9mZiBHcmVlbiBMRUQgaWYgc3VwcG9ydGVkKi8KIAlpZiAoUE9XRVJfQ1RSTChjdHJsKSkgewpAQCAtMzc2LDE0ICszNzYsMTIgQEAKIAkJcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKGdldHN0YXR1cykgewogCQkJcF9zbG90LT5zdGF0ZSA9IEJMSU5LSU5HT0ZGX1NUQVRFOwotCQkJY3RybF9pbmZvKGN0cmwsCi0JCQkJICAiUENJIHNsb3QgIyVzIC0gcG93ZXJpbmcgb2ZmIGR1ZSB0byBidXR0b24gIgotCQkJCSAgInByZXNzLlxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBwb3dlcmluZyBvZmYgZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwKKwkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJfSBlbHNlIHsKIAkJCXBfc2xvdC0+c3RhdGUgPSBCTElOS0lOR09OX1NUQVRFOwotCQkJY3RybF9pbmZvKGN0cmwsCi0JCQkJICAiUENJIHNsb3QgIyVzIC0gcG93ZXJpbmcgb24gZHVlIHRvIGJ1dHRvbiAiCi0JCQkJICAicHJlc3MuXG4iLCBzbG90X25hbWUocF9zbG90KSk7CisJCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIHBvd2VyaW5nIG9uIGR1ZSB0byBidXR0b24gcHJlc3NcbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CiAJCX0KIAkJLyogYmxpbmsgZ3JlZW4gTEVEIGFuZCB0dXJuIG9mZiBhbWJlciAqLwogCQlwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHBfc2xvdCk7CkBAIC00MDQsOCArNDAyLDggQEAKIAkJZWxzZQogCQkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKIAkJcGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7Ci0JCWN0cmxfaW5mbyhjdHJsLCAiUENJIHNsb3QgIyVzIC0gYWN0aW9uIGNhbmNlbGVkICIKLQkJCSAgImR1ZSB0byBidXR0b24gcHJlc3NcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBhY3Rpb24gY2FuY2VsZWQgZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwKKwkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCQlicmVhazsKIAljYXNlIFBPV0VST0ZGX1NUQVRFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCAxNDYzNDEyLi40MjkxNGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMTc0LDEyICsxNzQsMTAgQEAKIAkJCSAqIGV2ZW50IGV2ZW4gdGhvdWdoIGl0IHN1cHBvcnRzIG5vbmUgb2YgcG93ZXIKIAkJCSAqIGNvbnRyb2xsZXIsIGF0dGVudGlvbiBsZWQsIHBvd2VyIGxlZCBhbmQgRU1JLgogCQkJICovCi0JCQljdHJsX2RiZyhjdHJsLCAiVW5leHBlY3RlZCBDTURfQ09NUExFVEVELiBOZWVkIHRvICIKLQkJCQkgIndhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVkIGV2ZW50LlxuIik7CisJCQljdHJsX2RiZyhjdHJsLCAiVW5leHBlY3RlZCBDTURfQ09NUExFVEVELiBOZWVkIHRvIHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVkIGV2ZW50XG4iKTsKIAkJCWN0cmwtPm5vX2NtZF9jb21wbGV0ZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQljdHJsX2RiZyhjdHJsLCAiVW5leHBlY3RlZCBDTURfQ09NUExFVEVELiBNYXliZSAiCi0JCQkJICJ0aGUgY29udHJvbGxlciBpcyBicm9rZW4uXG4iKTsKKwkJCWN0cmxfZGJnKGN0cmwsICJVbmV4cGVjdGVkIENNRF9DT01QTEVURUQuIE1heWJlIHRoZSBjb250cm9sbGVyIGlzIGJyb2tlblxuIik7CiAJCX0KIAl9CiAKQEAgLTIwMyw3ICsyMDEsNyBAQAogCQlpZiAoIShzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9IUElFKSB8fAogCQkgICAgIShzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9DQ0lFKSkKIAkJCXBvbGwgPSAxOwotICAgICAgICAgICAgICAgIHBjaWVfd2FpdF9jbWQoY3RybCwgcG9sbCk7CisJCXBjaWVfd2FpdF9jbWQoY3RybCwgcG9sbCk7CiAJfQogCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIH0KQEAgLTI3NiwxNSArMjc0LDE1IEBACiAJYm9vbCBmb3VuZDsKIAl1MTYgbG5rX3N0YXR1czsKIAotICAgICAgICAvKgotICAgICAgICAgKiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIG11c3QgYmUgY2FwYWJsZSBmb3IKLSAgICAgICAgICogaG90LXBsdWcgY2FwYWJsZSBkb3duc3RyZWFtIHBvcnQuIEJ1dCBvbGQgY29udHJvbGxlciBtaWdodAotICAgICAgICAgKiBub3QgaW1wbGVtZW50IGl0LiBJbiB0aGlzIGNhc2UsIHdlIHdhaXQgZm9yIDEwMDAgbXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nKQotICAgICAgICAgICAgICAgIHBjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1zbGVlcCgxMDAwKTsKKwkvKgorCSAqIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBSZXBvcnRpbmcgbXVzdCBiZSBjYXBhYmxlIGZvcgorCSAqIGhvdC1wbHVnIGNhcGFibGUgZG93bnN0cmVhbSBwb3J0LiBCdXQgb2xkIGNvbnRyb2xsZXIgbWlnaHQKKwkgKiBub3QgaW1wbGVtZW50IGl0LiBJbiB0aGlzIGNhc2UsIHdlIHdhaXQgZm9yIDEwMDAgbXMuCisJKi8KKwlpZiAoY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nKQorCQlwY2llX3dhaXRfbGlua19hY3RpdmUoY3RybCk7CisJZWxzZQorCQltc2xlZXAoMTAwMCk7CiAKIAkvKiB3YWl0IDEwMG1zIGJlZm9yZSByZWFkIHBjaSBjb25mLCBhbmQgdHJ5IGluIDFzICovCiAJbXNsZWVwKDEwMCk7CkBAIC0yOTUsNyArMjkzLDcgQEAKIAljdHJsX2RiZyhjdHJsLCAiJXM6IGxua19zdGF0dXMgPSAleFxuIiwgX19mdW5jX18sIGxua19zdGF0dXMpOwogCWlmICgobG5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX0xUKSB8fAogCSAgICAhKGxua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9OTFcpKSB7Ci0JCWN0cmxfZXJyKGN0cmwsICJMaW5rIFRyYWluaW5nIEVycm9yIG9jY3VycyBcbiIpOworCQljdHJsX2VycihjdHJsLCAiTGluayBUcmFpbmluZyBFcnJvciBvY2N1cnNcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00MTQsNyArNDEyLDcgQEAKIAkJcmV0dXJuOwogCiAJc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCisJY2FzZSAwOgkJLyogdHVybiBvZmYgKi8KIAkJc2xvdF9jbWQgPSBQQ0lfRVhQX1NMVENUTF9BVFROX0lORF9PRkY7CiAJCWJyZWFrOwogCWNhc2UgMToJCS8qIHR1cm4gb24gKi8KQEAgLTQ3MCw3ICs0NjgsNyBAQAogCQkgUENJX0VYUF9TTFRDVExfUFdSX0lORF9CTElOSyk7CiB9CiAKLWludCBwY2llaHBfcG93ZXJfb25fc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCitpbnQgcGNpZWhwX3Bvd2VyX29uX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY3RybF9kZXYoY3RybCk7CkBAIC00OTYsNyArNDk0LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi12b2lkIHBjaWVocF9wb3dlcl9vZmZfc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCit2b2lkIHBjaWVocF9wb3dlcl9vZmZfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAKQEAgLTc1Niw3ICs3NTQsNyBAQAogCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCBDb250cm9sICAgICAgICAgICA6IDB4JTA0eFxuIiwgcmVnMTYpOwogfQogCi0jZGVmaW5lIEZMQUcoeCx5KQkoKCh4KSAmICh5KSkgPyAnKycgOiAnLScpCisjZGVmaW5lIEZMQUcoeCwgeSkJKCgoeCkgJiAoeSkpID8gJysnIDogJy0nKQogCiBzdHJ1Y3QgY29udHJvbGxlciAqcGNpZV9pbml0KHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQogewpAQCAtNzgzLDE0ICs3ODEsMTQgQEAKIAkgKi8KIAlpZiAoTk9fQ01EX0NNUEwoY3RybCkgfHwKIAkgICAgIShQT1dFUl9DVFJMKGN0cmwpIHwgQVRUTl9MRUQoY3RybCkgfCBQV1JfTEVEKGN0cmwpIHwgRU1JKGN0cmwpKSkKLQkgICAgY3RybC0+bm9fY21kX2NvbXBsZXRlID0gMTsKKwkJY3RybC0+bm9fY21kX2NvbXBsZXRlID0gMTsKIAotICAgICAgICAvKiBDaGVjayBpZiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIGlzIGltcGxlbWVudGVkICovCi0gICAgICAgIHBjaWVfY2FwYWJpbGl0eV9yZWFkX2R3b3JkKHBkZXYsIFBDSV9FWFBfTE5LQ0FQLCAmbGlua19jYXApOwotICAgICAgICBpZiAobGlua19jYXAgJiBQQ0lfRVhQX0xOS0NBUF9ETExMQVJDKSB7Ci0gICAgICAgICAgICAgICAgY3RybF9kYmcoY3RybCwgIkxpbmsgQWN0aXZlIFJlcG9ydGluZyBzdXBwb3J0ZWRcbiIpOwotICAgICAgICAgICAgICAgIGN0cmwtPmxpbmtfYWN0aXZlX3JlcG9ydGluZyA9IDE7Ci0gICAgICAgIH0KKwkvKiBDaGVjayBpZiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIGlzIGltcGxlbWVudGVkICovCisJcGNpZV9jYXBhYmlsaXR5X3JlYWRfZHdvcmQocGRldiwgUENJX0VYUF9MTktDQVAsICZsaW5rX2NhcCk7CisJaWYgKGxpbmtfY2FwICYgUENJX0VYUF9MTktDQVBfRExMTEFSQykgeworCQljdHJsX2RiZyhjdHJsLCAiTGluayBBY3RpdmUgUmVwb3J0aW5nIHN1cHBvcnRlZFxuIik7CisJCWN0cmwtPmxpbmtfYWN0aXZlX3JlcG9ydGluZyA9IDE7CisJfQogCiAJLyogQ2xlYXIgYWxsIHJlbWFpbmluZyBldmVudCBiaXRzIGluIFNsb3QgU3RhdHVzIHJlZ2lzdGVyICovCiAJcGNpZV9jYXBhYmlsaXR5X3dyaXRlX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCmluZGV4IGI2Y2IxZGYuLjVmODcxZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCkBAIC00Niw5ICs0Niw4IEBACiAKIAlkZXYgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LCBQQ0lfREVWRk4oMCwgMCkpOwogCWlmIChkZXYpIHsKLQkJY3RybF9lcnIoY3RybCwgIkRldmljZSAlcyBhbHJlYWR5IGV4aXN0cyAiCi0JCQkgImF0ICUwNHg6JTAyeDowMCwgY2Fubm90IGhvdC1hZGRcbiIsIHBjaV9uYW1lKGRldiksCi0JCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwYXJlbnQtPm51bWJlcik7CisJCWN0cmxfZXJyKGN0cmwsICJEZXZpY2UgJXMgYWxyZWFkeSBleGlzdHMgYXQgJTA0eDolMDJ4OjAwLCBjYW5ub3QgaG90LWFkZFxuIiwKKwkJCSBwY2lfbmFtZShkZXYpLCBwY2lfZG9tYWluX25yKHBhcmVudCksIHBhcmVudC0+bnVtYmVyKTsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3NrZWxldG9uLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3NrZWxldG9uLmMKaW5kZXggYWM2OTA5NC4uZDA2MmMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2tlbGV0b24uYwpAQCAtNTEsNyArNTEsNyBAQAogI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pCQkJCQlcCiAJZG8gewkJCQkJCQlcCiAJCWlmIChkZWJ1ZykJCQkJCVwKLQkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQgIlxuIiwJXAogCQkJCU1ZX05BTUUgLCAjIyBhcmcpOwkJXAogCX0gd2hpbGUgKDApCiAjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSICIlczogIiBmb3JtYXQgIlxuIiwgTVlfTkFNRSAsICMjIGFyZykKQEAgLTEyOCwxOCArMTI4LDE4IEBACiAJZGJnKCIlcyAtIHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwgX19mdW5jX18sIGhvdHBsdWdfc2xvdC0+bmFtZSk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIDA6Ci0JCQkvKgotCQkJICogRmlsbCBpbiBjb2RlIGhlcmUgdG8gdHVybiBsaWdodCBvZmYKLQkJCSAqLwotCQkJYnJlYWs7CisJY2FzZSAwOgorCQkvKgorCQkgKiBGaWxsIGluIGNvZGUgaGVyZSB0byB0dXJuIGxpZ2h0IG9mZgorCQkgKi8KKwkJYnJlYWs7CiAKLQkJY2FzZSAxOgotCQlkZWZhdWx0OgotCQkJLyoKLQkJCSAqIEZpbGwgaW4gY29kZSBoZXJlIHRvIHR1cm4gbGlnaHQgb24KLQkJCSAqLwotCQkJYnJlYWs7CisJY2FzZSAxOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIEZpbGwgaW4gY29kZSBoZXJlIHRvIHR1cm4gbGlnaHQgb24KKwkJICovCisJCWJyZWFrOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC0xNTMsMTIgKzE1MywxMiBAQAogCWRiZygiJXMgLSBwaHlzaWNhbF9zbG90ID0gJXNcbiIsIF9fZnVuY19fLCBob3RwbHVnX3Nsb3QtPm5hbWUpOwogCiAJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIDA6Ci0JCQkvKiBTcGVjaWZ5IGEgdGVzdCBoZXJlICovCi0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJLyogU3BlY2lmeSBhbm90aGVyIHRlc3QgaGVyZSAqLwotCQkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBTcGVjaWZ5IGEgdGVzdCBoZXJlICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogU3BlY2lmeSBhbm90aGVyIHRlc3QgaGVyZSAqLworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCmluZGV4IDk4NGQ3MDguLjkzYWEyOWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCkBAIC0zOSw2ICszOSw3IEBACiAKIGJvb2wgcnBhcGhwX2RlYnVnOwogTElTVF9IRUFEKHJwYXBocF9zbG90X2hlYWQpOworRVhQT1JUX1NZTUJPTF9HUEwocnBhcGhwX3Nsb3RfaGVhZCk7CiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMSIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiTGluZGEgWGllIDxseGllQHVzLmlibS5jb20+IgpAQCAtODgsNyArODksNyBAQAogICogQGhvdHBsdWdfc2xvdDogc2xvdCB0byBnZXQgc3RhdHVzCiAgKiBAdmFsdWU6IHBvaW50ZXIgdG8gc3RvcmUgc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICogdmFsdWUpCitzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCiB7CiAJaW50IHJldHZhbCwgbGV2ZWw7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilob3RwbHVnX3Nsb3QtPnByaXZhdGU7CkBAIC0xMDQsMTQgKzEwNSwxNCBAQAogICogQGhvdHBsdWdfc2xvdDogc2xvdCB0byBnZXQgc3RhdHVzCiAgKiBAdmFsdWU6IHBvaW50ZXIgdG8gc3RvcmUgc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQorc3RhdGljIGludCBnZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIAkqdmFsdWUgPSBzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXM7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKiB2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopaG90cGx1Z19zbG90LT5wcml2YXRlOwogCWludCByYywgc3RhdGU7CkBAIC0yNDEsNiArMjQyLDcgQEAKIAogCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocnBhcGhwX2dldF9kcmNfcHJvcHMpOwogCiBzdGF0aWMgaW50IGlzX3BocF90eXBlKGNoYXIgKmRyY190eXBlKQogewpAQCAtMzUwLDYgKzM1Miw3IEBACiAJLyogWFhYIEZJWE1FOiByZXBvcnRzIGEgZmFpbHVyZSBvbmx5IGlmIGxhc3QgZW50cnkgaW4gbG9vcCBmYWlsZWQgKi8KIAlyZXR1cm4gcmV0dmFsOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocnBhcGhwX2FkZF9zbG90KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc2xvdHModm9pZCkKIHsKQEAgLTQ0Myw3ICs0NDYsMyBAQAogCiBtb2R1bGVfaW5pdChycGFwaHBfaW5pdCk7CiBtb2R1bGVfZXhpdChycGFwaHBfZXhpdCk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9hZGRfc2xvdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChycGFwaHBfc2xvdF9oZWFkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9nZXRfZHJjX3Byb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCA2MTMwNDNmLi5iYWRhMjA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90ICogc25faHBfZGVzdHJveSh2b2lkKQorc3RhdGljIHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNuX2hwX2Rlc3Ryb3kodm9pZCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKIAlzdHJ1Y3QgcGNpX3Nsb3QgKnBjaV9zbG90OwpAQCAtMjUwLDE1ICsyNTAsMTMgQEAKIAl9CiAKIAlpZiAocmMgPT0gUENJX0wxX0VSUikgewotCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCi0JCQkiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2U6ICVzIiwKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCAiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2U6ICVzIiwKIAkJCXJlc3AucmVzcF9zdWJfZXJybm8sIHJlc3AucmVzcF9sMV9tc2cpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAogCWlmIChyYykgewotCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCi0JCQkiaW5zZXJ0IGZhaWxlZCB3aXRoIGVycm9yICVkIHN1Yi1lcnJvciAlZFxuIiwKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCAiaW5zZXJ0IGZhaWxlZCB3aXRoIGVycm9yICVkIHN1Yi1lcnJvciAlZFxuIiwKIAkJCXJjLCByZXNwLnJlc3Bfc3ViX2Vycm5vKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjg4LDIxICsyODYsMTggQEAKIAl9CiAKIAlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIChyYyA9PSBQQ0lfRU1QVFlfMzNNSFopKSB7Ci0JCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwKLQkJCSJDYW5ub3QgcmVtb3ZlIGxhc3QgMzNNSHogY2FyZFxuIik7CisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgIkNhbm5vdCByZW1vdmUgbGFzdCAzM01IeiBjYXJkXG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKIAlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIChyYyA9PSBQQ0lfTDFfRVJSKSkgewotCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCi0JCQkiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2UgXG4lc1xuIiwKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCAiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2UgXG4lc1xuIiwKIAkJCXJlc3AucmVzcF9zdWJfZXJybm8sIHJlc3AucmVzcF9sMV9tc2cpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAogCWlmICgoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSkgJiYgcmMpIHsKLQkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LAotCQkJInJlbW92ZSBmYWlsZWQgd2l0aCBlcnJvciAlZCBzdWItZXJyb3IgJWRcbiIsCisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgInJlbW92ZSBmYWlsZWQgd2l0aCBlcnJvciAlZCBzdWItZXJyb3IgJWRcbiIsCiAJCQlyYywgcmVzcC5yZXNwX3N1Yl9lcnJubyk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTQxNyw4ICs0MTIsNyBAQAogCQlwaGFuZGxlID0gYWNwaV9kZXZpY2VfaGFuZGxlKFBDSV9DT05UUk9MTEVSKHNsb3QtPnBjaV9idXMpLT5jb21wYW5pb24pOwogCiAJCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKHBoYW5kbGUsICZwZGV2aWNlKSkgewotCQkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LAotCQkJCSJubyBwYXJlbnQgZGV2aWNlLCBhc3N1bWluZyBOVUxMXG4iKTsKKwkJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgIm5vIHBhcmVudCBkZXZpY2UsIGFzc3VtaW5nIE5VTExcbiIpOwogCQkJcGRldmljZSA9IE5VTEw7CiAJCX0KIApAQCAtNDQ3LDEwICs0NDEsOCBAQAogCiAJCQkJcmV0ID0gYWNwaV9idXNfc2NhbihjaGFuZGxlKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHJldCkpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYWNwaV9idXNfc2NhbiAiCi0JCQkJCSAgICAgICAiZmFpbGVkICgweCV4KSBmb3Igc2xvdCAlZCAiCi0JCQkJCSAgICAgICAiZnVuYyAlZFxuIiwgX19mdW5jX18sCi0JCQkJCSAgICAgICByZXQsIChpbnQpKGFkcj4+MTYpLAorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhY3BpX2J1c19zY2FuIGZhaWxlZCAoMHgleCkgZm9yIHNsb3QgJWQgZnVuYyAlZFxuIiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCByZXQsIChpbnQpKGFkcj4+MTYpLAogCQkJCQkgICAgICAgKGludCkoYWRyJjB4ZmZmZikpOwogCQkJCQkvKiB0cnkgdG8gY29udGludWUgb24gKi8KIAkJCQl9CkBAIC00NzEsMTEgKzQ2Myw5IEBACiAJbXV0ZXhfdW5sb2NrKCZzbl9ob3RwbHVnX211dGV4KTsKIAogCWlmIChyYyA9PSAwKQotCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCi0JCQkiaW5zZXJ0IG9wZXJhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCAiaW5zZXJ0IG9wZXJhdGlvbiBzdWNjZXNzZnVsXG4iKTsKIAllbHNlCi0JCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwKLQkJCSJpbnNlcnQgb3BlcmF0aW9uIGZhaWxlZCByYyA9ICVkXG4iLCByYyk7CisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgImluc2VydCBvcGVyYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTU2MSw4ICs1NTEsNyBAQAogCQlhY3BpX3N0YXR1cyByZXQ7CiAJCXJldCA9IGFjcGlfdW5sb2FkX3RhYmxlX2lkKHNzZHRfaWQpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHJldCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFjcGlfdW5sb2FkX3RhYmxlX2lkICIKLQkJCSAgICAgICAiZmFpbGVkICgweCV4KSBmb3IgaWQgJWRcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhY3BpX3VubG9hZF90YWJsZV9pZCBmYWlsZWQgKDB4JXgpIGZvciBpZCAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgcmV0LCBzc2R0X2lkKTsKIAkJCS8qIHRyeSB0byBjb250aW51ZSBvbiAqLwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaAppbmRleCA2MTUyOTA5Li41ODk3ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKQEAgLTE4MCw3ICsxODAsNyBAQAogaW50IHNocGNocF91bmNvbmZpZ3VyZV9kZXZpY2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiB2b2lkIGNsZWFudXBfc2xvdHMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogdm9pZCBzaHBjaHBfcXVldWVfcHVzaGJ1dHRvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1pbnQgc2hwY19pbml0KCBzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IHNocGNfaW5pdChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnNsb3RfbmFtZShzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKQEAgLTI5NSw3ICsyOTUsNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBfc2xvdC0+Y3RybC0+cGNpX2RldiwgUENJWF9NRU1fQkFTRV9MSU1JVF9PRkZTRVQsIHJzZV9zZXQpOwogCX0KIAkvKiByZXN0b3JlIE1pc2NJSSByZWdpc3RlciAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZCggcF9zbG90LT5jdHJsLT5wY2lfZGV2LCBQQ0lYX01JU0NJSV9PRkZTRVQsICZwY2l4X21pc2MyX3RlbXAgKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocF9zbG90LT5jdHJsLT5wY2lfZGV2LCBQQ0lYX01JU0NJSV9PRkZTRVQsICZwY2l4X21pc2MyX3RlbXAgKTsKIAogCWlmIChwX3Nsb3QtPmN0cmwtPnBjaXhfbWlzYzJfcmVnICYgU0VSUkZBVEFMRU5BQkxFX01BU0spCiAJCXBjaXhfbWlzYzJfdGVtcCB8PSBTRVJSRkFUQUxFTkFCTEVfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwppbmRleCBmYWYxM2FiLi4yOTRlZjRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwpAQCAtMTQzLDggKzE0Myw3IEBACiAJCXNucHJpbnRmKG5hbWUsIFNMT1RfTkFNRV9TSVpFLCAiJWQiLCBzbG90LT5udW1iZXIpOwogCQlob3RwbHVnX3Nsb3QtPm9wcyA9ICZzaHBjaHBfaG90cGx1Z19zbG90X29wczsKIAotCQljdHJsX2RiZyhjdHJsLCAiUmVnaXN0ZXJpbmcgZG9tYWluOmJ1czpkZXY9JTA0eDolMDJ4OiUwMnggIgotCQkJICJocF9zbG90PSV4IHN1bj0leCBzbG90X2RldmljZV9vZmZzZXQ9JXhcbiIsCisJCWN0cmxfZGJnKGN0cmwsICJSZWdpc3RlcmluZyBkb21haW46YnVzOmRldj0lMDR4OiUwMng6JTAyeCBocF9zbG90PSV4IHN1bj0leCBzbG90X2RldmljZV9vZmZzZXQ9JXhcbiIsCiAJCQkgcGNpX2RvbWFpbl9ucihjdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZSksCiAJCQkgc2xvdC0+YnVzLCBzbG90LT5kZXZpY2UsIHNsb3QtPmhwX3Nsb3QsIHNsb3QtPm51bWJlciwKIAkJCSBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY3RybC5jCmluZGV4IDZlZmMyZWMuLmE4MWZiNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCiAJcF9zbG90ID0gc2hwY2hwX2ZpbmRfc2xvdChjdHJsLCBocF9zbG90ICsgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0KTsKIAotCWlmICggIShwX3Nsb3QtPmhwY19vcHMtPnF1ZXJ5X3Bvd2VyX2ZhdWx0KHBfc2xvdCkpKSB7CisJaWYgKCEocF9zbG90LT5ocGNfb3BzLT5xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSkgewogCQkvKgogCQkgKiBQb3dlciBmYXVsdCBDbGVhcmVkCiAJCSAqLwpAQCAtMTk2LDggKzE5Niw4IEBACiAKIAljdHJsX2RiZyhjdHJsLCAiQ2hhbmdlIHNwZWVkIHRvICVkXG4iLCBzcGVlZCk7CiAJaWYgKChyYyA9IHBfc2xvdC0+aHBjX29wcy0+c2V0X2J1c19zcGVlZF9tb2RlKHBfc2xvdCwgc3BlZWQpKSkgewotCQljdHJsX2VycihjdHJsLCAiJXM6IElzc3VlIG9mIHNldCBidXMgc3BlZWQgbW9kZSBjb21tYW5kICIKLQkJCSAiZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWN0cmxfZXJyKGN0cmwsICIlczogSXNzdWUgb2Ygc2V0IGJ1cyBzcGVlZCBtb2RlIGNvbW1hbmQgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIFdST05HX0JVU19GUkVRVUVOQ1k7CiAJfQogCXJldHVybiByYzsKQEAgLTIxNSw4ICsyMTUsOCBAQAogCSAqLwogCWlmIChmbGFnKSB7CiAJCWlmIChhc3AgPCBic3ApIHsKLQkJCWN0cmxfZXJyKGN0cmwsICJTcGVlZCBvZiBidXMgJXggYW5kIGFkYXB0ZXIgJXggIgotCQkJCSAibWlzbWF0Y2hcbiIsIGJzcCwgYXNwKTsKKwkJCWN0cmxfZXJyKGN0cmwsICJTcGVlZCBvZiBidXMgJXggYW5kIGFkYXB0ZXIgJXggbWlzbWF0Y2hcbiIsCisJCQkJIGJzcCwgYXNwKTsKIAkJCXJjID0gV1JPTkdfQlVTX0ZSRVFVRU5DWTsKIAkJfQogCQlyZXR1cm4gcmM7CkBAIC0yNTAsOCArMjUwLDcgQEAKIAogCWhwX3Nsb3QgPSBwX3Nsb3QtPmRldmljZSAtIGN0cmwtPnNsb3RfZGV2aWNlX29mZnNldDsKIAotCWN0cmxfZGJnKGN0cmwsCi0JCSAiJXM6IHBfc2xvdC0+ZGV2aWNlLCBzbG90X29mZnNldCwgaHBfc2xvdCA9ICVkLCAlZCAsJWRcbiIsCisJY3RybF9kYmcoY3RybCwgIiVzOiBwX3Nsb3QtPmRldmljZSwgc2xvdF9vZmZzZXQsIGhwX3Nsb3QgPSAlZCwgJWQgLCVkXG4iLAogCQkgX19mdW5jX18sIHBfc2xvdC0+ZGV2aWNlLCBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQsIGhwX3Nsb3QpOwogCiAJLyogUG93ZXIgb24gc2xvdCB3aXRob3V0IGNvbm5lY3RpbmcgdG8gYnVzICovCkBAIC0yNjMsOCArMjYyLDggQEAKIAogCWlmICgoY3RybC0+cGNpX2Rldi0+dmVuZG9yID09IDB4ODA4NikgJiYgKGN0cmwtPnBjaV9kZXYtPmRldmljZSA9PSAweDAzMzIpKSB7CiAJCWlmICgocmMgPSBwX3Nsb3QtPmhwY19vcHMtPnNldF9idXNfc3BlZWRfbW9kZShwX3Nsb3QsIFBDSV9TUEVFRF8zM01IeikpKSB7Ci0JCQljdHJsX2VycihjdHJsLCAiJXM6IElzc3VlIG9mIHNldCBidXMgc3BlZWQgbW9kZSBjb21tYW5kIgotCQkJCSAiIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJY3RybF9lcnIoY3RybCwgIiVzOiBJc3N1ZSBvZiBzZXQgYnVzIHNwZWVkIG1vZGUgY29tbWFuZCBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCXJldHVybiBXUk9OR19CVVNfRlJFUVVFTkNZOwogCQl9CiAKQEAgLTI3Nyw4ICsyNzYsNyBAQAogCiAJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3NwZWVkKHBfc2xvdCwgJmFzcCk7CiAJaWYgKHJjKSB7Ci0JCWN0cmxfZXJyKGN0cmwsICJDYW4ndCBnZXQgYWRhcHRlciBzcGVlZCBvciAiCi0JCQkgImJ1cyBtb2RlIG1pc21hdGNoXG4iKTsKKwkJY3RybF9lcnIoY3RybCwgIkNhbid0IGdldCBhZGFwdGVyIHNwZWVkIG9yIGJ1cyBtb2RlIG1pc21hdGNoXG4iKTsKIAkJcmV0dXJuIFdST05HX0JVU19GUkVRVUVOQ1k7CiAJfQogCkBAIC0yODksOCArMjg3LDggQEAKIAlpZiAoIWxpc3RfZW1wdHkoJmN0cmwtPnBjaV9kZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzKSkKIAkJc2xvdHNfbm90X2VtcHR5ID0gMTsKIAotCWN0cmxfZGJnKGN0cmwsICIlczogc2xvdHNfbm90X2VtcHR5ICVkLCBhZGFwdGVyX3NwZWVkICVkLCBidXNfc3BlZWQgJWQsIgotCQkgIiBtYXhfYnVzX3NwZWVkICVkXG4iLCBfX2Z1bmNfXywgc2xvdHNfbm90X2VtcHR5LCBhc3AsCisJY3RybF9kYmcoY3RybCwgIiVzOiBzbG90c19ub3RfZW1wdHkgJWQsIGFkYXB0ZXJfc3BlZWQgJWQsIGJ1c19zcGVlZCAlZCwgbWF4X2J1c19zcGVlZCAlZFxuIiwKKwkJIF9fZnVuY19fLCBzbG90c19ub3RfZW1wdHksIGFzcCwKIAkJIGJzcCwgbXNwKTsKIAogCXJjID0gZml4X2J1c19zcGVlZChjdHJsLCBwX3Nsb3QsIHNsb3RzX25vdF9lbXB0eSwgYXNwLCBic3AsIG1zcCk7CkBAIC00OTAsMTIgKzQ4OCwxMiBAQAogCQlwX3Nsb3QtPmhwY19vcHMtPmdldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKGdldHN0YXR1cykgewogCQkJcF9zbG90LT5zdGF0ZSA9IEJMSU5LSU5HT0ZGX1NUQVRFOwotCQkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBwb3dlcmluZyBvZmYgZHVlIHRvICIKLQkJCQkgICJidXR0b24gcHJlc3MuXG4iLCBzbG90X25hbWUocF9zbG90KSk7CisJCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIHBvd2VyaW5nIG9mZiBkdWUgdG8gYnV0dG9uIHByZXNzXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl9IGVsc2UgewogCQkJcF9zbG90LT5zdGF0ZSA9IEJMSU5LSU5HT05fU1RBVEU7Ci0JCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIHBvd2VyaW5nIG9uIGR1ZSB0byAiCi0JCQkJICAiYnV0dG9uIHByZXNzLlxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBwb3dlcmluZyBvbiBkdWUgdG8gYnV0dG9uIHByZXNzXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl9CiAJCS8qIGJsaW5rIGdyZWVuIExFRCBhbmQgdHVybiBvZmYgYW1iZXIgKi8KIAkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfYmxpbmsocF9zbG90KTsKQEAgLTUxOCw4ICs1MTYsOCBAQAogCQllbHNlCiAJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKIAkJcF9zbG90LT5ocGNfb3BzLT5zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDApOwotCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIGFjdGlvbiBjYW5jZWxlZCBkdWUgdG8gIgotCQkJICAiYnV0dG9uIHByZXNzXG4iLCBzbG90X25hbWUocF9zbG90KSk7CisJCWN0cmxfaW5mbyhjdHJsLCAiUENJIHNsb3QgIyVzIC0gYWN0aW9uIGNhbmNlbGVkIGR1ZSB0byBidXR0b24gcHJlc3NcbiIsCisJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUk9GRl9TVEFURToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKaW5kZXggMmQ3ZjQ3NC4uMjllMjIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKQEAgLTM0MSw4ICszNDEsNyBAQAogCiAJY21kX3N0YXR1cyA9IGhwY19jaGVja19jbWRfc3RhdHVzKHNsb3QtPmN0cmwpOwogCWlmIChjbWRfc3RhdHVzKSB7Ci0JCWN0cmxfZXJyKGN0cmwsCi0JCQkgIkZhaWxlZCB0byBpc3N1ZWQgY29tbWFuZCAweCV4IChlcnJvciBjb2RlID0gJWQpXG4iLAorCQljdHJsX2VycihjdHJsLCAiRmFpbGVkIHRvIGlzc3VlZCBjb21tYW5kIDB4JXggKGVycm9yIGNvZGUgPSAlZClcbiIsCiAJCQkgY21kLCBjbWRfc3RhdHVzKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9CkBAIC00MDQsNyArNDAzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBocGNfZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqIHNsb3QsIHU4ICpzdGF0dXMpCitzdGF0aWMgaW50IGhwY19nZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MzIgc2xvdF9yZWcgPSBzaHBjX3JlYWRsKGN0cmwsIFNMT1RfUkVHKHNsb3QtPmhwX3Nsb3QpKTsKQEAgLTUyOCw3ICs1MjcsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX3F1ZXJ5X3Bvd2VyX2ZhdWx0KHN0cnVjdCBzbG90ICogc2xvdCkKK3N0YXRpYyBpbnQgaHBjX3F1ZXJ5X3Bvd2VyX2ZhdWx0KHN0cnVjdCBzbG90ICpzbG90KQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MzIgc2xvdF9yZWcgPSBzaHBjX3JlYWRsKGN0cmwsIFNMT1RfUkVHKHNsb3QtPmhwX3Nsb3QpKTsKQEAgLTYxNCw3ICs2MTMsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihjdHJsLT5tbWlvX2Jhc2UsIGN0cmwtPm1taW9fc2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX3Bvd2VyX29uX3Nsb3Qoc3RydWN0IHNsb3QgKiBzbG90KQorc3RhdGljIGludCBocGNfcG93ZXJfb25fc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC02MjUsNyArNjI0LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGhwY19zbG90X2VuYWJsZShzdHJ1Y3Qgc2xvdCAqIHNsb3QpCitzdGF0aWMgaW50IGhwY19zbG90X2VuYWJsZShzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC02MzgsNyArNjM3LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGhwY19zbG90X2Rpc2FibGUoc3RydWN0IHNsb3QgKiBzbG90KQorc3RhdGljIGludCBocGNfc2xvdF9kaXNhYmxlKHN0cnVjdCBzbG90ICpzbG90KQogewogCWludCByZXR2YWw7CiAKQEAgLTcyMCw3ICs3MTksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgaHBjX3NldF9idXNfc3BlZWRfbW9kZShzdHJ1Y3Qgc2xvdCAqIHNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCB2YWx1ZSkKK3N0YXRpYyBpbnQgaHBjX3NldF9idXNfc3BlZWRfbW9kZShzdHJ1Y3Qgc2xvdCAqc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkIHZhbHVlKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwpAQCAtOTc0LDggKzk3Myw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCA5ICsgbnVtX3Nsb3RzOyBpKyspIHsKIAkJCXJjID0gc2hwY19pbmRpcmVjdF9yZWFkKGN0cmwsIGksICZ0ZW1wZHdvcmQpOwogCQkJaWYgKHJjKSB7Ci0JCQkJY3RybF9lcnIoY3RybCwKLQkJCQkJICJDYW5ub3QgcmVhZCBjcmVnIChpbmRleCA9ICVkKVxuIiwgaSk7CisJCQkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCByZWFkIGNyZWcgKGluZGV4ID0gJWQpXG4iLAorCQkJCQkgaSk7CiAJCQkJZ290byBhYm9ydDsKIAkJCX0KIAkJCWN0cmxfZGJnKGN0cmwsICIgb2Zmc2V0ICVkOiB2YWx1ZSAleFxuIiwgaSwgdGVtcGR3b3JkKTsKQEAgLTEwNjAsMTAgKzEwNTksOCBAQAogCQkvKiBJbnN0YWxscyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAkJcmMgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKIAkJaWYgKHJjKSB7Ci0JCQljdHJsX2luZm8oY3RybCwKLQkJCQkgICJDYW4ndCBnZXQgbXNpIGZvciB0aGUgaG90cGx1ZyBjb250cm9sbGVyXG4iKTsKLQkJCWN0cmxfaW5mbyhjdHJsLAotCQkJCSAgIlVzZSBJTlR4IGZvciB0aGUgaG90cGx1ZyBjb250cm9sbGVyXG4iKTsKKwkJCWN0cmxfaW5mbyhjdHJsLCAiQ2FuJ3QgZ2V0IG1zaSBmb3IgdGhlIGhvdHBsdWcgY29udHJvbGxlclxuIik7CisJCQljdHJsX2luZm8oY3RybCwgIlVzZSBJTlR4IGZvciB0aGUgaG90cGx1ZyBjb250cm9sbGVyXG4iKTsKIAkJfQogCiAJCXJjID0gcmVxdWVzdF9pcnEoY3RybC0+cGNpX2Rldi0+aXJxLCBzaHBjX2lzciwgSVJRRl9TSEFSRUQsCkBAIC0xMDcxLDggKzEwNjgsOCBAQAogCQljdHJsX2RiZyhjdHJsLCAicmVxdWVzdF9pcnEgJWQgKHJldHVybnMgJWQpXG4iLAogCQkJIGN0cmwtPnBjaV9kZXYtPmlycSwgcmMpOwogCQlpZiAocmMpIHsKLQkJCWN0cmxfZXJyKGN0cmwsICJDYW4ndCBnZXQgaXJxICVkIGZvciB0aGUgaG90cGx1ZyAiCi0JCQkJICJjb250cm9sbGVyXG4iLCBjdHJsLT5wY2lfZGV2LT5pcnEpOworCQkJY3RybF9lcnIoY3RybCwgIkNhbid0IGdldCBpcnEgJWQgZm9yIHRoZSBob3RwbHVnIGNvbnRyb2xsZXJcbiIsCisJCQkJIGN0cmwtPnBjaV9kZXYtPmlycSk7CiAJCQlnb3RvIGFib3J0X2lvdW5tYXA7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCmluZGV4IDkyMDJkMTMuLjQ2OTQ1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCkBAIC00Niw5ICs0Niw5IEBACiAKIAlkZXYgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LCBQQ0lfREVWRk4ocF9zbG90LT5kZXZpY2UsIDApKTsKIAlpZiAoZGV2KSB7Ci0JCWN0cmxfZXJyKGN0cmwsICJEZXZpY2UgJXMgYWxyZWFkeSBleGlzdHMgIgotCQkJICJhdCAlMDR4OiUwMng6JTAyeCwgY2Fubm90IGhvdC1hZGRcbiIsIHBjaV9uYW1lKGRldiksCi0JCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UpOworCQljdHJsX2VycihjdHJsLCAiRGV2aWNlICVzIGFscmVhZHkgZXhpc3RzIGF0ICUwNHg6JTAyeDolMDJ4LCBjYW5ub3QgaG90LWFkZFxuIiwKKwkJCSBwY2lfbmFtZShkZXYpLCBwY2lfZG9tYWluX25yKHBhcmVudCksCisJCQkgcF9zbG90LT5idXMsIHBfc2xvdC0+ZGV2aWNlKTsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9zeXNmcy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfc3lzZnMuYwppbmRleCBlOGMzMWZlLi41Mjg3NWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3N5c2ZzLmMKQEAgLTM4LDcgKzM4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfY3RybCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCWNoYXIgKiBvdXQgPSBidWY7CisJY2hhciAqb3V0ID0gYnVmOwogCWludCBpbmRleCwgYnVzbnI7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2h0aXJxLmMgYi9kcml2ZXJzL3BjaS9odGlycS5jCmluZGV4IGQ2OGIwMzAuLmE5NGRkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2h0aXJxLmMKKysrIGIvZHJpdmVycy9wY2kvaHRpcnEuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKIAogCW1heF9pcnEgPSAoZGF0YSA+PiAxNikgJiAweGZmOwotCWlmICggaWR4ID4gbWF4X2lycSkKKwlpZiAoaWR4ID4gbWF4X2lycSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljZmcgPSBrbWFsbG9jKHNpemVvZigqY2ZnKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMzEsNiArMTMxLDcgQEAKIAogCXJldHVybiBpcnE7CiB9CitFWFBPUlRfU1lNQk9MKF9faHRfY3JlYXRlX2lycSk7CiAKIC8qKgogICogaHRfY3JlYXRlX2lycSAtIGNyZWF0ZSBhbiBpcnEgYW5kIGF0dGFjaCBpdCB0byBhIGRldmljZS4KQEAgLTE0Niw2ICsxNDcsNyBAQAogewogCXJldHVybiBfX2h0X2NyZWF0ZV9pcnEoZGV2LCBpZHgsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChodF9jcmVhdGVfaXJxKTsKIAogLyoqCiAgKiBodF9kZXN0cm95X2lycSAtIGRlc3Ryb3kgYW4gaXJxIGNyZWF0ZWQgd2l0aCBodF9jcmVhdGVfaXJxCkBAIC0xNjUsNyArMTY3LDQgQEAKIAogCWtmcmVlKGNmZyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woX19odF9jcmVhdGVfaXJxKTsKLUVYUE9SVF9TWU1CT0woaHRfY3JlYXRlX2lycSk7CiBFWFBPUlRfU1lNQk9MKGh0X2Rlc3Ryb3lfaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMjdhN2U2Ny4uMTNmM2QzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCWlmIChkZXYtPm1zaV9pcnFfZ3JvdXBzKSB7CiAJCXN5c2ZzX3JlbW92ZV9ncm91cHMoJmRldi0+ZGV2LmtvYmosIGRldi0+bXNpX2lycV9ncm91cHMpOwogCQltc2lfYXR0cnMgPSBkZXYtPm1zaV9pcnFfZ3JvdXBzWzBdLT5hdHRyczsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJd2hpbGUgKG1zaV9hdHRyc1tjb3VudF0pIHsKIAkJCWRldl9hdHRyID0gY29udGFpbmVyX29mKG1zaV9hdHRyc1tjb3VudF0sCiAJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cik7CiAJCQlrZnJlZShkZXZfYXR0ci0+YXR0ci5uYW1lKTsKQEAgLTk4MCw4ICs5ODAsNyBAQAogCiAJLyogQ2hlY2sgd2hldGhlciBkcml2ZXIgYWxyZWFkeSByZXF1ZXN0ZWQgZm9yIE1TSSBpcnEgKi8KIAlpZiAoZGV2LT5tc2lfZW5hYmxlZCkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgTVNJLVggIgotCQkgICAgICAgIihNU0kgSVJRIGFscmVhZHkgYXNzaWduZWQpXG4iKTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIE1TSS1YIChNU0kgSVJRIGFscmVhZHkgYXNzaWduZWQpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN0YXR1cyA9IG1zaXhfY2FwYWJpbGl0eV9pbml0KGRldiwgZW50cmllcywgbnZlYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggODM3ZDcxZi4uM2Y4ZTNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNzcsNiArNzcsNyBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9hZGRfZHluaWQpOwogCiBzdGF0aWMgdm9pZCBwY2lfZnJlZV9keW5pZHMoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKQEAgLTk4LDE1ICs5OSwxNSBAQAogICoKICAqIEFsbG93IFBDSSBJRHMgdG8gYmUgYWRkZWQgdG8gYW4gZXhpc3RpbmcgZHJpdmVyIHZpYSBzeXNmcy4KICAqLwotc3RhdGljIHNzaXplX3QKLXN0b3JlX25ld19pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX25ld19pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZHJpdmVyICpwZHJ2ID0gdG9fcGNpX2RyaXZlcihkcml2ZXIpOwogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMgPSBwZHJ2LT5pZF90YWJsZTsKLQlfX3UzMiB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yPVBDSV9BTllfSUQsCi0JCXN1YmRldmljZT1QQ0lfQU5ZX0lELCBjbGFzcz0wLCBjbGFzc19tYXNrPTA7Ci0JdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YT0wOwotCWludCBmaWVsZHM9MDsKKwlfX3UzMiB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJc3ViZGV2aWNlID0gUENJX0FOWV9JRCwgY2xhc3MgPSAwLCBjbGFzc19tYXNrID0gMDsKKwl1bnNpZ25lZCBsb25nIGRyaXZlcl9kYXRhID0gMDsKKwlpbnQgZmllbGRzID0gMDsKIAlpbnQgcmV0dmFsID0gMDsKIAogCWZpZWxkcyA9IHNzY2FuZihidWYsICIleCAleCAleCAleCAleCAleCAlbHgiLApAQCAtMTY2LDggKzE2Nyw4IEBACiAgKgogICogUmVtb3ZlcyBhIGR5bmFtaWMgcGNpIGRldmljZSBJRCB0byB0aGlzIGRyaXZlci4KICAqLwotc3RhdGljIHNzaXplX3QKLXN0b3JlX3JlbW92ZV9pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlbW92ZV9pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZHluaWQgKmR5bmlkLCAqbjsKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqcGRydiA9IHRvX3BjaV9kcml2ZXIoZHJpdmVyKTsKQEAgLTIzNSw2ICsyMzYsNyBAQAogCX0KIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX21hdGNoX2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9kZXZpY2VfaWRfYW55ID0gewogCS52ZW5kb3IgPSBQQ0lfQU5ZX0lELApAQCAtMzcyLDggKzM3NCw3IEBACiAgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBlcnJvci4KICAqIHNpZGUtZWZmZWN0OiBwY2lfZGV2LT5kcml2ZXIgaXMgc2V0IHRvIGRydiB3aGVuIGRydiBjbGFpbXMgcGNpX2Rldi4KICAqLwotc3RhdGljIGludAotX19wY2lfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIGludCBfX3BjaV9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOwogCWludCBlcnJvciA9IDA7CkBAIC0zOTAsNyArMzkxLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgcGNpX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIGludCBwY2lfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgZXJyb3IgPSAwOwogCXN0cnVjdCBwY2lfZHJpdmVyICpkcnY7CkBAIC00MDYsMTAgKzQwNywxMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBwY2lfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIGludCBwY2lfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAKIAlpZiAoZHJ2KSB7CiAJCWlmIChkcnYtPnJlbW92ZSkgewpAQCAtNTM3LDggKzUzOCw4IEBACiAKIHN0YXRpYyBpbnQgcGNpX2xlZ2FjeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqIGRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwogCiAJaWYgKGRydiAmJiBkcnYtPnN1c3BlbmQpIHsKIAkJcGNpX3Bvd2VyX3QgcHJldiA9IHBjaV9kZXYtPmN1cnJlbnRfc3RhdGU7CkBAIC01NjQsOCArNTY1LDggQEAKIAogc3RhdGljIGludCBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKIAogCWlmIChkcnYgJiYgZHJ2LT5zdXNwZW5kX2xhdGUpIHsKIAkJcGNpX3Bvd2VyX3QgcHJldiA9IHBjaV9kZXYtPmN1cnJlbnRfc3RhdGU7CkBAIC01OTUsOCArNTk2LDggQEAKIAogc3RhdGljIGludCBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAKIAlyZXR1cm4gZHJ2ICYmIGRydi0+cmVzdW1lX2Vhcmx5ID8KIAkJCWRydi0+cmVzdW1lX2Vhcmx5KHBjaV9kZXYpIDogMDsKQEAgLTYwNCw4ICs2MDUsOCBAQAogCiBzdGF0aWMgaW50IHBjaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKIAogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CiAKQEAgLTEyNTUsNiArMTI1Niw3IEBACiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogfQorRVhQT1JUX1NZTUJPTChfX3BjaV9yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKioKICAqIHBjaV91bnJlZ2lzdGVyX2RyaXZlciAtIHVucmVnaXN0ZXIgYSBwY2kgZHJpdmVyCkBAIC0xMjY2LDEyICsxMjY4LDEyIEBACiAgKiBkcml2ZXJsZXNzLgogICovCiAKLXZvaWQKLXBjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2KQordm9pZCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogCXBjaV9mcmVlX2R5bmlkcyhkcnYpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpX2NvbXBhdF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiY29tcGF0IgpAQCAtMTI4NCwxOSArMTI4NiwxOSBAQAogICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUgb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8KICAqIHJlZ2lzdGVyZWQgZHJpdmVyIGZvciB0aGUgZGV2aWNlLgogICovCi1zdHJ1Y3QgcGNpX2RyaXZlciAqCi1wY2lfZGV2X2RyaXZlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RydWN0IHBjaV9kcml2ZXIgKnBjaV9kZXZfZHJpdmVyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaWYgKGRldi0+ZHJpdmVyKQogCQlyZXR1cm4gZGV2LT5kcml2ZXI7CiAJZWxzZSB7CiAJCWludCBpOwotCQlmb3IoaT0wOyBpPD1QQ0lfUk9NX1JFU09VUkNFOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKQogCQkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX0JVU1kpCiAJCQkJcmV0dXJuICZwY2lfY29tcGF0X2RyaXZlcjsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kZXZfZHJpdmVyKTsKIAogLyoqCiAgKiBwY2lfYnVzX21hdGNoIC0gVGVsbCBpZiBhIFBDSSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBhIG1hdGNoaW5nIFBDSSBkZXZpY2UgaWQgc3RydWN0dXJlCkBAIC0xMzQyLDYgKzEzNDQsNyBAQAogCQlnZXRfZGV2aWNlKCZkZXYtPmRldik7CiAJcmV0dXJuIGRldjsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2Rldl9nZXQpOwogCiAvKioKICAqIHBjaV9kZXZfcHV0IC0gcmVsZWFzZSBhIHVzZSBvZiB0aGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTEzNTUsNiArMTM1OCw3IEBACiAJaWYgKGRldikKIAkJcHV0X2RldmljZSgmZGV2LT5kZXYpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZGV2X3B1dCk7CiAKIHN0YXRpYyBpbnQgcGNpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKIHsKQEAgLTE0MDAsMTkgKzE0MDQsMTAgQEAKIAkuZHJ2X2dyb3Vwcwk9IHBjaV9kcnZfZ3JvdXBzLAogCS5wbQkJPSBQQ0lfUE1fT1BTX1BUUiwKIH07CitFWFBPUlRfU1lNQk9MKHBjaV9idXNfdHlwZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaV9kcml2ZXJfaW5pdCh2b2lkKQogewogCXJldHVybiBidXNfcmVnaXN0ZXIoJnBjaV9idXNfdHlwZSk7CiB9Ci0KIHBvc3Rjb3JlX2luaXRjYWxsKHBjaV9kcml2ZXJfaW5pdCk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHBjaV9hZGRfZHluaWQpOwotRVhQT1JUX1NZTUJPTChwY2lfbWF0Y2hfaWQpOwotRVhQT1JUX1NZTUJPTChfX3BjaV9yZWdpc3Rlcl9kcml2ZXIpOwotRVhQT1JUX1NZTUJPTChwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOwotRVhQT1JUX1NZTUJPTChwY2lfZGV2X2RyaXZlcik7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfdHlwZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9kZXZfZ2V0KTsKLUVYUE9SVF9TWU1CT0wocGNpX2Rldl9wdXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMgYi9kcml2ZXJzL3BjaS9wY2ktbGFiZWwuYwppbmRleCA0NTExM2RhLi5hM2ZiZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktbGFiZWwuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktbGFiZWwuYwpAQCAtNDAsOSArNDAsOCBAQAogCVNNQklPU19BVFRSX0lOU1RBTkNFX1NIT1csCiB9OwogCi1zdGF0aWMgc2l6ZV90Ci1maW5kX3NtYmlvc19pbnN0YW5jZV9zdHJpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNoYXIgKmJ1ZiwKLQkJCSAgICBlbnVtIHNtYmlvc19hdHRyX2VudW0gYXR0cmlidXRlKQorc3RhdGljIHNpemVfdCBmaW5kX3NtYmlvc19pbnN0YW5jZV9zdHJpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNoYXIgKmJ1ZiwKKwkJCQkJICBlbnVtIHNtYmlvc19hdHRyX2VudW0gYXR0cmlidXRlKQogewogCWNvbnN0IHN0cnVjdCBkbWlfZGV2aWNlICpkbWk7CiAJc3RydWN0IGRtaV9kZXZfb25ib2FyZCAqZG9uYm9hcmQ7CkBAIC03NCw5ICs3Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bW9kZV90Ci1zbWJpb3NfaW5zdGFuY2Vfc3RyaW5nX2V4aXN0KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBpbnQgbikKK3N0YXRpYyB1bW9kZV90IHNtYmlvc19pbnN0YW5jZV9zdHJpbmdfZXhpc3Qoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC04OCw4ICs4Niw4IEBACiAJCQkJCSAgIFNfSVJVR08gOiAwOwogfQogCi1zdGF0aWMgc3NpemVfdAotc21iaW9zbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzbWJpb3NsYWJlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXBkZXYgPSB0b19wY2lfZGV2KGRldik7CkBAIC05OCw5ICs5Niw4IEBACiAJCQkJCSAgIFNNQklPU19BVFRSX0xBQkVMX1NIT1cpOwogfQogCi1zdGF0aWMgc3NpemVfdAotc21iaW9zaW5zdGFuY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc21iaW9zaW5zdGFuY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlwZGV2ID0gdG9fcGNpX2RldihkZXYpOwpAQCAtMTMwLDI2ICsxMjcsMjIgQEAKIAkuaXNfdmlzaWJsZSA9IHNtYmlvc19pbnN0YW5jZV9zdHJpbmdfZXhpc3QsCiB9OwogCi1zdGF0aWMgaW50Ci1wY2lfY3JlYXRlX3NtYmlvc25hbWVfZmlsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgcGNpX2NyZWF0ZV9zbWJpb3NuYW1lX2ZpbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZzbWJpb3NfYXR0cl9ncm91cCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1wY2lfcmVtb3ZlX3NtYmlvc25hbWVfZmlsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHBjaV9yZW1vdmVfc21iaW9zbmFtZV9maWxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZzbWJpb3NfYXR0cl9ncm91cCk7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQKLXBjaV9jcmVhdGVfc21iaW9zbmFtZV9maWxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGlubGluZSBpbnQgcGNpX2NyZWF0ZV9zbWJpb3NuYW1lX2ZpbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXBjaV9yZW1vdmVfc21iaW9zbmFtZV9maWxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9yZW1vdmVfc21iaW9zbmFtZV9maWxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogfQogI2VuZGlmCkBAIC0xNzUsOCArMTY4LDggQEAKIAlidWZbbGVuXSA9ICdcbic7CiB9CiAKLXN0YXRpYyBpbnQKLWRzbV9nZXRfbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGVudW0gYWNwaV9hdHRyX2VudW0gYXR0cikKK3N0YXRpYyBpbnQgZHNtX2dldF9sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJCSBlbnVtIGFjcGlfYXR0cl9lbnVtIGF0dHIpCiB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmosICp0bXA7CkBAIC0yMTIsOCArMjA1LDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgYm9vbAotZGV2aWNlX2hhc19kc20oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGJvb2wgZGV2aWNlX2hhc19kc20oc3RydWN0IGRldmljZSAqZGV2KQogewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIApAQCAtMjI1LDggKzIxNyw4IEBACiAJCQkJMSA8PCBERVZJQ0VfTEFCRUxfRFNNKTsKIH0KIAotc3RhdGljIHVtb2RlX3QKLWFjcGlfaW5kZXhfc3RyaW5nX2V4aXN0KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3N0YXRpYyB1bW9kZV90IGFjcGlfaW5kZXhfc3RyaW5nX2V4aXN0KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKQEAgLTIzOCwxNCArMjMwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1hY3BpbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBhY3BpbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXJldHVybiBkc21fZ2V0X2xhYmVsKGRldiwgYnVmLCBBQ1BJX0FUVFJfTEFCRUxfU0hPVyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1hY3BpaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBhY3BpaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXJldHVybiBkc21fZ2V0X2xhYmVsKGRldiwgYnVmLCBBQ1BJX0FUVFJfSU5ERVhfU0hPVyk7CiB9CkBAIC0yNzEsMzMgKzI2MywyOCBAQAogCS5pc192aXNpYmxlID0gYWNwaV9pbmRleF9zdHJpbmdfZXhpc3QsCiB9OwogCi1zdGF0aWMgaW50Ci1wY2lfY3JlYXRlX2FjcGlfaW5kZXhfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IHBjaV9jcmVhdGVfYWNwaV9pbmRleF9sYWJlbF9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmFjcGlfYXR0cl9ncm91cCk7CiB9CiAKLXN0YXRpYyBpbnQKLXBjaV9yZW1vdmVfYWNwaV9pbmRleF9sYWJlbF9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgcGNpX3JlbW92ZV9hY3BpX2luZGV4X2xhYmVsX2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZhY3BpX2F0dHJfZ3JvdXApOwogCXJldHVybiAwOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50Ci1wY2lfY3JlYXRlX2FjcGlfaW5kZXhfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW5saW5lIGludCBwY2lfY3JlYXRlX2FjcGlfaW5kZXhfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotcGNpX3JlbW92ZV9hY3BpX2luZGV4X2xhYmVsX2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGlubGluZSBpbnQgcGNpX3JlbW92ZV9hY3BpX2luZGV4X2xhYmVsX2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGlubGluZSBib29sCi1kZXZpY2VfaGFzX2RzbShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX2hhc19kc20oc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jCmluZGV4IDJmZjc3NTAuLjg4NmZiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN0dWIuYwpAQCAtNTUsNyArNTUsNyBAQAogCXAgPSBpZHM7CiAJd2hpbGUgKChpZCA9IHN0cnNlcCgmcCwgIiwiKSkpIHsKIAkJdW5zaWduZWQgaW50IHZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAotCQkJc3ViZGV2aWNlID0gUENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOworCQkJc3ViZGV2aWNlID0gUENJX0FOWV9JRCwgY2xhc3MgPSAwLCBjbGFzc19tYXNrID0gMDsKIAkJaW50IGZpZWxkczsKIAogCQlpZiAoIXN0cmxlbihpZCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IDg0YzM1MDkuLjlmZjBhOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC00MSw4ICs0MSw4IEBACiB7CQkJCQkJCQkJXAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkJCQkJCVwKIAkJCQkJCQkJCVwKLQlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsJCQkJCVwKLQlyZXR1cm4gc3ByaW50ZiAoYnVmLCBmb3JtYXRfc3RyaW5nLCBwZGV2LT5maWVsZCk7CQlcCisJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCBmb3JtYXRfc3RyaW5nLCBwZGV2LT5maWVsZCk7CQlcCiB9CQkJCQkJCQkJXAogc3RhdGljIERFVklDRV9BVFRSX1JPKGZpZWxkKQogCkBAIC01OCw3ICs1OCw3IEBACiAJCQkJCSBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0JcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiV1XG4iLCBwZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBkZXYtPmJyb2tlbl9wYXJpdHlfc3RhdHVzKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYnJva2VuX3Bhcml0eV9zdGF0dXNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LApAQCAtNzcsMTAgKzc3LDggQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhicm9rZW5fcGFyaXR5X3N0YXR1cyk7CiAKLXN0YXRpYyBzc2l6ZV90IHBjaV9kZXZfc2hvd19sb2NhbF9jcHUoc3RydWN0IGRldmljZSAqZGV2LAotCQlpbnQgdHlwZSwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjaV9kZXZfc2hvd19sb2NhbF9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdHlwZSwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CkBAIC0xMDEsMTQgKzk5LDE0IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxvY2FsX2NwdXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHBjaV9kZXZfc2hvd19sb2NhbF9jcHUoZGV2LCAxLCBhdHRyLCBidWYpOwogfQogc3RhdGljIERFVklDRV9BVFRSX1JPKGxvY2FsX2NwdXMpOwogCiBzdGF0aWMgc3NpemVfdCBsb2NhbF9jcHVsaXN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHBjaV9kZXZfc2hvd19sb2NhbF9jcHUoZGV2LCAwLCBhdHRyLCBidWYpOwogfQpAQCAtMTE3LDggKzExNSw3IEBACiAvKgogICogUENJIEJ1cyBDbGFzcyBEZXZpY2VzCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHBjaV9idXNfc2hvd19jcHVhZmZpbml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCWludCB0eXBlLAorc3RhdGljIHNzaXplX3QgcGNpX2J1c19zaG93X2NwdWFmZmluaXR5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHR5cGUsCiAJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQljaGFyICpidWYpCiB7CkBAIC0xNDksMTEgKzE0NiwxMSBAQAogc3RhdGljIERFVklDRV9BVFRSX1JPKGNwdWxpc3RhZmZpbml0eSk7CiAKIC8qIHNob3cgcmVzb3VyY2VzICovCi1zdGF0aWMgc3NpemVfdAotcmVzb3VyY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqIGJ1ZikKK3N0YXRpYyBzc2l6ZV90IHJlc291cmNlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQljaGFyICogc3RyID0gYnVmOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCWNoYXIgKnN0ciA9IGJ1ZjsKIAlpbnQgaTsKIAlpbnQgbWF4OwogCXJlc291cmNlX3NpemVfdCBzdGFydCwgZW5kOwpAQCAtMTY2LDcgKzE2Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CiAJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gICZwY2lfZGV2LT5yZXNvdXJjZVtpXTsKIAkJcGNpX3Jlc291cmNlX3RvX3VzZXIocGNpX2RldiwgaSwgcmVzLCAmc3RhcnQsICZlbmQpOwotCQlzdHIgKz0gc3ByaW50ZihzdHIsIjB4JTAxNmxseCAweCUwMTZsbHggMHglMDE2bGx4XG4iLAorCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwMTZsbHggMHglMDE2bGx4IDB4JTAxNmxseFxuIiwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5mbGFncyk7CkBAIC0xNzUsNyArMTcyLDggQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9STyhyZXNvdXJjZSk7CiAKLXN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAKQEAgLTE4Nyw5ICsxODUsOCBAQAogfQogc3RhdGljIERFVklDRV9BVFRSX1JPKG1vZGFsaWFzKTsKIAotc3RhdGljIHNzaXplX3QgZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yMTMsNTcgKzIxMCw1NiBAQAogCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGVuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAotCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOwotCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpKTsKKwlwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkpOwogfQogc3RhdGljIERFVklDRV9BVFRSX1JXKGVuYWJsZWQpOwogCiAjaWZkZWYgQ09ORklHX05VTUEKLXN0YXRpYyBzc2l6ZV90Ci1udW1hX25vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBudW1hX25vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmIChidWYsICIlZFxuIiwgZGV2LT5udW1hX25vZGUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXYtPm51bWFfbm9kZSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFJfUk8obnVtYV9ub2RlKTsKICNlbmRpZgogCi1zdGF0aWMgc3NpemVfdAotZG1hX21hc2tfYml0c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGRtYV9tYXNrX2JpdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCi0JcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVkXG4iLCBmbHM2NChwZGV2LT5kbWFfbWFzaykpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBmbHM2NChwZGV2LT5kbWFfbWFzaykpOwogfQogc3RhdGljIERFVklDRV9BVFRSX1JPKGRtYV9tYXNrX2JpdHMpOwogCi1zdGF0aWMgc3NpemVfdAotY29uc2lzdGVudF9kbWFfbWFza19iaXRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgY29uc2lzdGVudF9kbWFfbWFza19iaXRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJWRcbiIsIGZsczY0KGRldi0+Y29oZXJlbnRfZG1hX21hc2spKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZmxzNjQoZGV2LT5jb2hlcmVudF9kbWFfbWFzaykpOwogfQogc3RhdGljIERFVklDRV9BVFRSX1JPKGNvbnNpc3RlbnRfZG1hX21hc2tfYml0cyk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1tc2lfYnVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbXNpX2J1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCiAJaWYgKCFwZGV2LT5zdWJvcmRpbmF0ZSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXVcbiIsCi0JCQkhKHBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLAorCQkgICAgICAgIShwZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzICYgUENJX0JVU19GTEFHU19OT19NU0kpKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLW1zaV9idXNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IG1zaV9idXNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yOTAsOCArMjg2LDggQEAKIAkgICAgISF2YWwpIHsKIAkJcGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyBePSBQQ0lfQlVTX0ZMQUdTX05PX01TSTsKIAotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZm9yY2VkIHN1Ym9yZGluYXRlIGJ1cyB0byVzIHN1cHBvcnQgTVNJLCIKLQkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuXG4iLCB2YWwgPyAiIiA6ICIgbm90Iik7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvJXMgc3VwcG9ydCBNU0ksIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuXG4iLAorCQkJIHZhbCA/ICIiIDogIiBub3QiKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0zMzEsOSArMzI3LDkgQEAKIAlOVUxMLAogfTsKIAotc3RhdGljIHNzaXplX3QKLWRldl9yZXNjYW5fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZGV2X3Jlc2Nhbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CkBAIC0zNTIsOSArMzQ4LDggQEAKIAkJCQkJCQkoU19JV1VTUnxTX0lXR1JQKSwKIAkJCQkJCQlOVUxMLCBkZXZfcmVzY2FuX3N0b3JlKTsKIAotc3RhdGljIHNzaXplX3QKLXJlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCByZW1vdmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIApAQCAtMzY5LDkgKzM2NCw5IEBACiAJCQkJCQkJKFNfSVdVU1J8U19JV0dSUCksCiAJCQkJCQkJTlVMTCwgcmVtb3ZlX3N0b3JlKTsKIAotc3RhdGljIHNzaXplX3QKLWRldl9idXNfcmVzY2FuX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGRldl9idXNfcmVzY2FuX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwogCXN0cnVjdCBwY2lfYnVzICpidXMgPSB0b19wY2lfYnVzKGRldik7CkBAIC00MTIsNyArNDA3LDcgQEAKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgcGRldi0+ZDNjb2xkX2FsbG93ZWQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwZGV2LT5kM2NvbGRfYWxsb3dlZCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcoZDNjb2xkX2FsbG93ZWQpOwogI2VuZGlmCkBAIC02MDcsOCArNjAyLDggQEAKIAlOVUxMLAogfTsKIAotc3RhdGljIHNzaXplX3QKLWJvb3RfdmdhX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9vdF92Z2Ffc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHBjaV9kZXYgKnZnYV9kZXYgPSB2Z2FfZGVmYXVsdF9kZXZpY2UoKTsKQEAgLTYyMiwyMiArNjE3LDIxIEBACiB9CiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmdhX2F0dHIgPSBfX0FUVFJfUk8oYm9vdF92Z2EpOwogCi1zdGF0aWMgc3NpemVfdAotcGNpX3JlYWRfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCisJCQkgICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLHN0cnVjdCBkZXZpY2Usa29iaikpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLAorCQkJCQkJICAgICAga29iaikpOwogCXVuc2lnbmVkIGludCBzaXplID0gNjQ7CiAJbG9mZl90IGluaXRfb2ZmID0gb2ZmOwotCXU4ICpkYXRhID0gKHU4KikgYnVmOworCXU4ICpkYXRhID0gKHU4ICopIGJ1ZjsKIAogCS8qIFNldmVyYWwgY2hpcHMgbG9jayB1cCB0cnlpbmcgdG8gcmVhZCB1bmRlZmluZWQgY29uZmlnIHNwYWNlICovCi0JaWYgKHNlY3VyaXR5X2NhcGFibGUoZmlscC0+Zl9jcmVkLCAmaW5pdF91c2VyX25zLCBDQVBfU1lTX0FETUlOKSA9PSAwKSB7CisJaWYgKHNlY3VyaXR5X2NhcGFibGUoZmlscC0+Zl9jcmVkLCAmaW5pdF91c2VyX25zLCBDQVBfU1lTX0FETUlOKSA9PSAwKQogCQlzaXplID0gZGV2LT5jZmdfc2l6ZTsKLQl9IGVsc2UgaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpIHsKKwllbHNlIGlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKQogCQlzaXplID0gMTI4OwotCX0KIAogCWlmIChvZmYgPiBzaXplKQogCQlyZXR1cm4gMDsKQEAgLTcwMCwxNSArNjk0LDE1IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdAotcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZmlsZSogZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCSBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCSBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjaV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmLAorCQkJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgZGV2aWNlLGtvYmopKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwKKwkJCQkJCSAgICAgIGtvYmopKTsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IGNvdW50OwogCWxvZmZfdCBpbml0X29mZiA9IG9mZjsKLQl1OCAqZGF0YSA9ICh1OCopIGJ1ZjsKKwl1OCAqZGF0YSA9ICh1OCAqKSBidWY7CiAKIAlpZiAob2ZmID4gZGV2LT5jZmdfc2l6ZSkKIAkJcmV0dXJuIDA7CkBAIC03MjgsMTAgKzcyMiwxMCBAQAogCWlmICgob2ZmICYgMykgJiYgc2l6ZSA+IDIpIHsKIAkJdTE2IHZhbCA9IGRhdGFbb2ZmIC0gaW5pdF9vZmZdOwogCQl2YWwgfD0gKHUxNikgZGF0YVtvZmYgLSBpbml0X29mZiArIDFdIDw8IDg7Ci0gICAgICAgICAgICAgICAgcGNpX3VzZXJfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBvZmYsIHZhbCk7Ci0gICAgICAgICAgICAgICAgb2ZmICs9IDI7Ci0gICAgICAgICAgICAgICAgc2l6ZSAtPSAyOwotICAgICAgICB9CisJCXBjaV91c2VyX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgb2ZmLCB2YWwpOworCQlvZmYgKz0gMjsKKwkJc2l6ZSAtPSAyOworCX0KIAogCXdoaWxlIChzaXplID4gMykgewogCQl1MzIgdmFsID0gZGF0YVtvZmYgLSBpbml0X29mZl07CkBAIC03NjIsMTAgKzc1Niw5IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdAotcmVhZF92cGRfYXR0cihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCSAgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcmVhZF92cGRfYXR0cihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmLAorCQkJICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9CiAJCXRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKQEAgLTc3OCwxMCArNzcxLDkgQEAKIAlyZXR1cm4gcGNpX3JlYWRfdnBkKGRldiwgb2ZmLCBjb3VudCwgYnVmKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXdyaXRlX3ZwZF9hdHRyKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCSAgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3ZwZF9hdHRyKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmLAorCQkJICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPQogCQl0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CkBAIC04MDcsMjAgKzc5OSwxOCBAQAogICogUmVhZHMgMSwgMiwgb3IgNCBieXRlcyBmcm9tIGxlZ2FjeSBJL08gcG9ydCBzcGFjZSB1c2luZyBhbiBhcmNoIHNwZWNpZmljCiAgKiBjYWxsYmFjayByb3V0aW5lIChwY2lfbGVnYWN5X3JlYWQpLgogICovCi1zdGF0aWMgc3NpemVfdAotcGNpX3JlYWRfbGVnYWN5X2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCQkgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjaV9yZWFkX2xlZ2FjeV9pbyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZiwKKwkJCQkgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLSAgICAgICAgc3RydWN0IHBjaV9idXMgKmJ1cyA9IHRvX3BjaV9idXMoY29udGFpbmVyX29mKGtvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlLAorCXN0cnVjdCBwY2lfYnVzICpidXMgPSB0b19wY2lfYnVzKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLAogCQkJCQkJICAgICAga29iaikpOwogCi0gICAgICAgIC8qIE9ubHkgc3VwcG9ydCAxLCAyIG9yIDQgYnl0ZSBhY2Nlc3NlcyAqLwotICAgICAgICBpZiAoY291bnQgIT0gMSAmJiBjb3VudCAhPSAyICYmIGNvdW50ICE9IDQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJLyogT25seSBzdXBwb3J0IDEsIDIgb3IgNCBieXRlIGFjY2Vzc2VzICovCisJaWYgKGNvdW50ICE9IDEgJiYgY291bnQgIT0gMiAmJiBjb3VudCAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICByZXR1cm4gcGNpX2xlZ2FjeV9yZWFkKGJ1cywgb2ZmLCAodTMyICopYnVmLCBjb3VudCk7CisJcmV0dXJuIHBjaV9sZWdhY3lfcmVhZChidXMsIG9mZiwgKHUzMiAqKWJ1ZiwgY291bnQpOwogfQogCiAvKioKQEAgLTgzNSwxOSArODI1LDE4IEBACiAgKiBXcml0ZXMgMSwgMiwgb3IgNCBieXRlcyBmcm9tIGxlZ2FjeSBJL08gcG9ydCBzcGFjZSB1c2luZyBhbiBhcmNoIHNwZWNpZmljCiAgKiBjYWxsYmFjayByb3V0aW5lIChwY2lfbGVnYWN5X3dyaXRlKS4KICAqLwotc3RhdGljIHNzaXplX3QKLXBjaV93cml0ZV9sZWdhY3lfaW8oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCQkgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwY2lfd3JpdGVfbGVnYWN5X2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZiwKKwkJCQkgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0gICAgICAgIHN0cnVjdCBwY2lfYnVzICpidXMgPSB0b19wY2lfYnVzKGNvbnRhaW5lcl9vZihrb2JqLAotCQkJCQkJICAgICAgc3RydWN0IGRldmljZSwKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gdG9fcGNpX2J1cyhjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwKIAkJCQkJCSAgICAgIGtvYmopKTsKLSAgICAgICAgLyogT25seSBzdXBwb3J0IDEsIDIgb3IgNCBieXRlIGFjY2Vzc2VzICovCi0gICAgICAgIGlmIChjb3VudCAhPSAxICYmIGNvdW50ICE9IDIgJiYgY291bnQgIT0gNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICByZXR1cm4gcGNpX2xlZ2FjeV93cml0ZShidXMsIG9mZiwgKih1MzIgKilidWYsIGNvdW50KTsKKwkvKiBPbmx5IHN1cHBvcnQgMSwgMiBvciA0IGJ5dGUgYWNjZXNzZXMgKi8KKwlpZiAoY291bnQgIT0gMSAmJiBjb3VudCAhPSAyICYmIGNvdW50ICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBjaV9sZWdhY3lfd3JpdGUoYnVzLCBvZmYsICoodTMyICopYnVmLCBjb3VudCk7CiB9CiAKIC8qKgpAQCAtODYxLDE2ICs4NTAsMTQgQEAKICAqIGxlZ2FjeSBtZW1vcnkgc3BhY2UgKGZpcnN0IG1lZyBvZiBidXMgc3BhY2UpIGludG8gYXBwbGljYXRpb24gdmlydHVhbAogICogbWVtb3J5IHNwYWNlLgogICovCi1zdGF0aWMgaW50Ci1wY2lfbW1hcF9sZWdhY3lfbWVtKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgcGNpX21tYXBfbGVnYWN5X21lbShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0gICAgICAgIHN0cnVjdCBwY2lfYnVzICpidXMgPSB0b19wY2lfYnVzKGNvbnRhaW5lcl9vZihrb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZSwKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gdG9fcGNpX2J1cyhjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwKIAkJCQkJCSAgICAgIGtvYmopKTsKIAotICAgICAgICByZXR1cm4gcGNpX21tYXBfbGVnYWN5X3BhZ2VfcmFuZ2UoYnVzLCB2bWEsIHBjaV9tbWFwX21lbSk7CisJcmV0dXJuIHBjaV9tbWFwX2xlZ2FjeV9wYWdlX3JhbmdlKGJ1cywgdm1hLCBwY2lfbW1hcF9tZW0pOwogfQogCiAvKioKQEAgLTg4NCwxNiArODcxLDE0IEBACiAgKiBsZWdhY3kgSU8gc3BhY2UgKGZpcnN0IG1lZyBvZiBidXMgc3BhY2UpIGludG8gYXBwbGljYXRpb24gdmlydHVhbAogICogbWVtb3J5IHNwYWNlLiBSZXR1cm5zIC1FTk9TWVMgaWYgdGhlIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQKICAqLwotc3RhdGljIGludAotcGNpX21tYXBfbGVnYWN5X2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBwY2lfbW1hcF9sZWdhY3lfaW8oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLSAgICAgICAgc3RydWN0IHBjaV9idXMgKmJ1cyA9IHRvX3BjaV9idXMoY29udGFpbmVyX29mKGtvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlLAorCXN0cnVjdCBwY2lfYnVzICpidXMgPSB0b19wY2lfYnVzKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLAogCQkJCQkJICAgICAga29iaikpOwogCi0gICAgICAgIHJldHVybiBwY2lfbW1hcF9sZWdhY3lfcGFnZV9yYW5nZShidXMsIHZtYSwgcGNpX21tYXBfaW8pOworCXJldHVybiBwY2lfbW1hcF9sZWdhY3lfcGFnZV9yYW5nZShidXMsIHZtYSwgcGNpX21tYXBfaW8pOwogfQogCiAvKioKQEAgLTkwMywxMCArODg4LDkgQEAKICAqCiAgKiBTdHViIGltcGxlbWVudGF0aW9uLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBhcmNoIGlmIG5lY2Vzc2FyeS4KICAqLwotdm9pZCBfX3dlYWsKLXBjaV9hZGp1c3RfbGVnYWN5X2F0dHIoc3RydWN0IHBjaV9idXMgKmIsIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF90eXBlKQordm9pZCBfX3dlYWsgcGNpX2FkanVzdF9sZWdhY3lfYXR0cihzdHJ1Y3QgcGNpX2J1cyAqYiwKKwkJCQkgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfdHlwZSkKIHsKLQlyZXR1cm47CiB9CiAKIC8qKgpAQCAtOTYxLDggKzk0NSw3IEBACiAJa2ZyZWUoYi0+bGVnYWN5X2lvKTsKIAliLT5sZWdhY3lfaW8gPSBOVUxMOwoga3phbGxvY19lcnI6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAicGNpOiB3YXJuaW5nOiBjb3VsZCBub3QgY3JlYXRlIGxlZ2FjeSBJL08gcG9ydCAiCi0JICAgICAgICJhbmQgSVNBIG1lbW9yeSByZXNvdXJjZXMgdG8gc3lzZnNcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaTogd2FybmluZzogY291bGQgbm90IGNyZWF0ZSBsZWdhY3kgSS9PIHBvcnQgYW5kIElTQSBtZW1vcnkgcmVzb3VyY2VzIHRvIHN5c2ZzXG4iKTsKIAlyZXR1cm47CiB9CiAKQEAgLTEwMDUsOSArOTg4LDggQEAKICAqCiAgKiBVc2UgdGhlIHJlZ3VsYXIgUENJIG1hcHBpbmcgcm91dGluZXMgdG8gbWFwIGEgUENJIHJlc291cmNlIGludG8gdXNlcnNwYWNlLgogICovCi1zdGF0aWMgaW50Ci1wY2lfbW1hcF9yZXNvdXJjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGludCB3cml0ZV9jb21iaW5lKQorc3RhdGljIGludCBwY2lfbW1hcF9yZXNvdXJjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBpbnQgd3JpdGVfY29tYmluZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosCiAJCQkJCQkgICAgICAgc3RydWN0IGRldmljZSwga29iaikpOwpAQCAtMTAyMyw4ICsxMDA1LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIXBjaV9tbWFwX2ZpdHMocGRldiwgaSwgdm1hLCBQQ0lfTU1BUF9TWVNGUykpIHsKLQkJV0FSTigxLCAicHJvY2VzcyBcIiVzXCIgdHJpZWQgdG8gbWFwIDB4JTA4bHggYnl0ZXMgIgotCQkJImF0IHBhZ2UgMHglMDhseCBvbiAlcyBCQVIgJWQgKHN0YXJ0IDB4JTE2THgsIHNpemUgMHglMTZMeClcbiIsCisJCVdBUk4oMSwgInByb2Nlc3MgXCIlc1wiIHRyaWVkIHRvIG1hcCAweCUwOGx4IGJ5dGVzIGF0IHBhZ2UgMHglMDhseCBvbiAlcyBCQVIgJWQgKHN0YXJ0IDB4JTE2THgsIHNpemUgMHglMTZMeClcbiIsCiAJCQljdXJyZW50LT5jb21tLCB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAogCQkJcGNpX25hbWUocGRldiksIGksCiAJCQkodTY0KXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKSwKQEAgLTEwNDYsMjYgKzEwMjcsMjMgQEAKIAlyZXR1cm4gcGNpX21tYXBfcGFnZV9yYW5nZShwZGV2LCB2bWEsIG1tYXBfdHlwZSwgd3JpdGVfY29tYmluZSk7CiB9CiAKLXN0YXRpYyBpbnQKLXBjaV9tbWFwX3Jlc291cmNlX3VjKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKLQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgcGNpX21tYXBfcmVzb3VyY2VfdWMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXJldHVybiBwY2lfbW1hcF9yZXNvdXJjZShrb2JqLCBhdHRyLCB2bWEsIDApOwogfQogCi1zdGF0aWMgaW50Ci1wY2lfbW1hcF9yZXNvdXJjZV93YyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IHBjaV9tbWFwX3Jlc291cmNlX3djKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlyZXR1cm4gcGNpX21tYXBfcmVzb3VyY2Uoa29iaiwgYXR0ciwgdm1hLCAxKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXBjaV9yZXNvdXJjZV9pbyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwgYm9vbCB3cml0ZSkKK3N0YXRpYyBzc2l6ZV90IHBjaV9yZXNvdXJjZV9pbyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGJvb2wgd3JpdGUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLAogCQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKQEAgLTExMTAsMTggKzEwODgsMTYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHNzaXplX3QKLXBjaV9yZWFkX3Jlc291cmNlX2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQkgICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjaV9yZWFkX3Jlc291cmNlX2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewogCXJldHVybiBwY2lfcmVzb3VyY2VfaW8oZmlscCwga29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1wY2lfd3JpdGVfcmVzb3VyY2VfaW8oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQkgICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwY2lfd3JpdGVfcmVzb3VyY2VfaW8oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX2lvKGZpbHAsIGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgdHJ1ZSk7CiB9CkBAIC0xMTMzLDggKzExMDksNyBAQAogICogSWYgd2UgY3JlYXRlZCByZXNvdXJjZSBmaWxlcyBmb3IgQHBkZXYsIHJlbW92ZSB0aGVtIGZyb20gc3lzZnMgYW5kCiAgKiBmcmVlIHRoZWlyIHJlc291cmNlcy4KICAqLwotc3RhdGljIHZvaWQKLXBjaV9yZW1vdmVfcmVzb3VyY2VfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCBwY2lfcmVtb3ZlX3Jlc291cmNlX2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWludCBpOwogCkBAIC0xMjM3LDEwICsxMjEyLDkgQEAKICAqCiAgKiB3cml0aW5nIGFueXRoaW5nIGV4Y2VwdCAwIGVuYWJsZXMgaXQKICAqLwotc3RhdGljIHNzaXplX3QKLXBjaV93cml0ZV9yb20oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCSAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjaV93cml0ZV9yb20oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwogCkBAIC0xMjY0LDEwICsxMjM4LDkgQEAKICAqIFB1dCBAY291bnQgYnl0ZXMgc3RhcnRpbmcgYXQgQG9mZiBpbnRvIEBidWYgZnJvbSB0aGUgUk9NIGluIHRoZSBQQ0kKICAqIGRldmljZSBjb3JyZXNwb25kaW5nIHRvIEBrb2JqLgogICovCi1zdGF0aWMgc3NpemVfdAotcGNpX3JlYWRfcm9tKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcGNpX3JlYWRfcm9tKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZiwKKwkJCSAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CiAJdm9pZCBfX2lvbWVtICpyb207CkBAIC0xMzEzLDkgKzEyODYsOCBAQAogCS53cml0ZSA9IHBjaV93cml0ZV9jb25maWcsCiB9OwogCi1zdGF0aWMgc3NpemVfdCByZXNldF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcmVzZXRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXVuc2lnbmVkIGxvbmcgdmFsOwpAQCAtMTM4Miw3ICsxMzU0LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1pbnQgX19tdXN0X2NoZWNrIHBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK2ludCBfX211c3RfY2hlY2sgcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJaW50IHJldHZhbDsKIAlpbnQgcm9tX3NpemUgPSAwOwpAQCAtMTUyMCw3ICsxNDkyLDYgQEAKIAogCXJldHVybiAwOwogfQotCiBsYXRlX2luaXRjYWxsKHBjaV9zeXNmc19pbml0KTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjaV9kZXZfZGV2X2F0dHJzW10gPSB7CkBAIC0xNTI5LDcgKzE1MDAsNyBAQAogfTsKIAogc3RhdGljIHVtb2RlX3QgcGNpX2Rldl9hdHRyc19hcmVfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwpAQCAtMTU0OCw3ICsxNTE5LDcgQEAKIH07CiAKIHN0YXRpYyB1bW9kZV90IHBjaV9kZXZfaHBfYXR0cnNfYXJlX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphLCBpbnQgbikKKwkJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKQEAgLTE1NzIsNyArMTU0Myw3IEBACiB9OwogCiBzdGF0aWMgdW1vZGVfdCBzcmlvdl9hdHRyc19hcmVfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorCQkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphLCBpbnQgbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggMjEyYzYzZC4uNjNhNTRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCW1heCA9IGJ1cy0+YnVzbl9yZXMuZW5kOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgewogCQluID0gcGNpX2J1c19tYXhfYnVzbnIodG1wKTsKLQkJaWYobiA+IG1heCkKKwkJaWYgKG4gPiBtYXgpCiAJCQltYXggPSBuOwogCX0KIAlyZXR1cm4gbWF4OwpAQCAtMjI2LDYgKzIyNiw3IEBACiAKIAlyZXR1cm4gcG9zOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZmluZF9jYXBhYmlsaXR5KTsKIAogLyoqCiAgKiBwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eSAtIHF1ZXJ5IGZvciBkZXZpY2VzJyBjYXBhYmlsaXRpZXMKQEAgLTI1Myw2ICsyNTQsNyBAQAogCiAJcmV0dXJuIHBvczsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2J1c19maW5kX2NhcGFiaWxpdHkpOwogCiAvKioKICAqIHBjaV9maW5kX25leHRfZXh0X2NhcGFiaWxpdHkgLSBGaW5kIGFuIGV4dGVuZGVkIGNhcGFiaWxpdHkKQEAgLTQwMyw4ICs0MDUsOCBAQAogICogIEZvciBnaXZlbiByZXNvdXJjZSByZWdpb24gb2YgZ2l2ZW4gZGV2aWNlLCByZXR1cm4gdGhlIHJlc291cmNlCiAgKiAgcmVnaW9uIG9mIHBhcmVudCBidXMgdGhlIGdpdmVuIHJlZ2lvbiBpcyBjb250YWluZWQgaW4uCiAgKi8KLXN0cnVjdCByZXNvdXJjZSAqCi1wY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCitzdHJ1Y3QgcmVzb3VyY2UgKnBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCWNvbnN0IHN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPmJ1czsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CkBAIC00MzYsNiArNDM4LDcgQEAKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZSk7CiAKIC8qKgogICogcGNpX3dhaXRfZm9yX3BlbmRpbmcgLSB3YWl0IGZvciBAbWFzayBiaXQocykgdG8gY2xlYXIgaW4gc3RhdHVzIHdvcmQgQHBvcwpAQCAtNDcwLDggKzQ3Myw3IEBACiAgKiBSZXN0b3JlIHRoZSBCQVIgdmFsdWVzIGZvciBhIGdpdmVuIGRldmljZSwgc28gYXMgdG8gbWFrZSBpdAogICogYWNjZXNzaWJsZSBieSBpdHMgZHJpdmVyLgogICovCi1zdGF0aWMgdm9pZAotcGNpX3Jlc3RvcmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX3Jlc3RvcmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBpOwogCkBAIC00OTYsNyArNDk4LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3Bvd2VyX3QgdCkKKwkJCQkJICAgICAgIHBjaV9wb3dlcl90IHQpCiB7CiAJcmV0dXJuIHBjaV9wbGF0Zm9ybV9wbSA/IHBjaV9wbGF0Zm9ybV9wbS0+c2V0X3N0YXRlKGRldiwgdCkgOiAtRU5PU1lTOwogfQpAQCAtNTUzLDggKzU1NSw4IEBACiAJICovCiAJaWYgKHN0YXRlICE9IFBDSV9EMCAmJiBkZXYtPmN1cnJlbnRfc3RhdGUgPD0gUENJX0QzY29sZAogCSAgICAmJiBkZXYtPmN1cnJlbnRfc3RhdGUgPiBzdGF0ZSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImludmFsaWQgcG93ZXIgdHJhbnNpdGlvbiAiCi0JCQkiKGZyb20gc3RhdGUgJWQgdG8gJWQpXG4iLCBkZXYtPmN1cnJlbnRfc3RhdGUsIHN0YXRlKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJpbnZhbGlkIHBvd2VyIHRyYW5zaXRpb24gKGZyb20gc3RhdGUgJWQgdG8gJWQpXG4iLAorCQkJZGV2LT5jdXJyZW50X3N0YXRlLCBzdGF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjAxLDggKzYwMyw4IEBACiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPnBtX2NhcCArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwogCWRldi0+Y3VycmVudF9zdGF0ZSA9IChwbWNzciAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOwogCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgIT0gc3RhdGUgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJSZWZ1c2VkIHRvIGNoYW5nZSBwb3dlciBzdGF0ZSwgIgotCQkJImN1cnJlbnRseSBpbiBEJWRcbiIsIGRldi0+Y3VycmVudF9zdGF0ZSk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIlJlZnVzZWQgdG8gY2hhbmdlIHBvd2VyIHN0YXRlLCBjdXJyZW50bHkgaW4gRCVkXG4iLAorCQkJIGRldi0+Y3VycmVudF9zdGF0ZSk7CiAKIAkvKgogCSAqIEFjY29yZGluZyB0byBzZWN0aW9uIDUuNC4xIG9mIHRoZSAiUENJIEJVUyBQT1dFUiBNQU5BR0VNRU5UCkBAIC04NDYsNiArODQ4LDcgQEAKIAogCXJldHVybiBlcnJvcjsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3NldF9wb3dlcl9zdGF0ZSk7CiAKIC8qKgogICogcGNpX2Nob29zZV9zdGF0ZSAtIENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCkBAIC04ODQsMTIgKzg4NywxMCBAQAogCX0KIAlyZXR1cm4gUENJX0QwOwogfQotCiBFWFBPUlRfU1lNQk9MKHBjaV9jaG9vc2Vfc3RhdGUpOwogCiAjZGVmaW5lIFBDSV9FWFBfU0FWRV9SRUdTCTcKIAotCiBzdGF0aWMgc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKl9wY2lfZmluZF9zYXZlZF9jYXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCiAJCQkJCQkgICAgICAgdTE2IGNhcCwgYm9vbCBleHRlbmRlZCkKIHsKQEAgLTEwMDEsOCArMTAwMiw3IEBACiAgKiBwY2lfc2F2ZV9zdGF0ZSAtIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCiAgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKICAqLwotaW50Ci1wY2lfc2F2ZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoraW50IHBjaV9zYXZlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IGk7CiAJLyogWFhYOiAxMDAlIGR3b3JkIGFjY2VzcyBvayBoZXJlPyAqLwpAQCAtMTAxNyw2ICsxMDE3LDcgQEAKIAkJcmV0dXJuIGk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9zYXZlX3N0YXRlKTsKIAogc3RhdGljIHZvaWQgcGNpX3Jlc3RvcmVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgb2Zmc2V0LAogCQkJCSAgICAgdTMyIHNhdmVkX3ZhbCwgaW50IHJldHJ5KQpAQCAtMTAyOCw4ICsxMDI5LDggQEAKIAkJcmV0dXJuOwogCiAJZm9yICg7OykgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZXN0b3JpbmcgY29uZmlnIHNwYWNlIGF0IG9mZnNldCAiCi0JCQkiJSN4ICh3YXMgJSN4LCB3cml0aW5nICUjeClcbiIsIG9mZnNldCwgdmFsLCBzYXZlZF92YWwpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZXN0b3JpbmcgY29uZmlnIHNwYWNlIGF0IG9mZnNldCAlI3ggKHdhcyAlI3gsIHdyaXRpbmcgJSN4KVxuIiwKKwkJCW9mZnNldCwgdmFsLCBzYXZlZF92YWwpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIG9mZnNldCwgc2F2ZWRfdmFsKTsKIAkJaWYgKHJldHJ5LS0gPD0gMCkKIAkJCXJldHVybjsKQEAgLTEwODcsNiArMTA4OCw3IEBACiAKIAlkZXYtPnN0YXRlX3NhdmVkID0gZmFsc2U7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9yZXN0b3JlX3N0YXRlKTsKIAogc3RydWN0IHBjaV9zYXZlZF9zdGF0ZSB7CiAJdTMyIGNvbmZpZ19zcGFjZVsxNl07CkBAIC0xMjMxLDYgKzEyMzMsNyBAQAogCQlyZXR1cm4gZG9fcGNpX2VuYWJsZV9kZXZpY2UoZGV2LCAoMSA8PCBQQ0lfTlVNX1JFU09VUkNFUykgLSAxKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3JlZW5hYmxlX2RldmljZSk7CiAKIHN0YXRpYyB2b2lkIHBjaV9lbmFibGVfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0xMzA1LDYgKzEzMDgsNyBAQAogewogCXJldHVybiBwY2lfZW5hYmxlX2RldmljZV9mbGFncyhkZXYsIElPUkVTT1VSQ0VfSU8pOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZV9pbyk7CiAKIC8qKgogICogcGNpX2VuYWJsZV9kZXZpY2VfbWVtIC0gSW5pdGlhbGl6ZSBhIGRldmljZSBmb3IgdXNlIHdpdGggTWVtb3J5IHNwYWNlCkBAIC0xMzE4LDYgKzEzMjIsNyBAQAogewogCXJldHVybiBwY2lfZW5hYmxlX2RldmljZV9mbGFncyhkZXYsIElPUkVTT1VSQ0VfTUVNKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9kZXZpY2VfbWVtKTsKIAogLyoqCiAgKiBwY2lfZW5hYmxlX2RldmljZSAtIEluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIuCkBAIC0xMzM0LDYgKzEzMzksNyBAQAogewogCXJldHVybiBwY2lfZW5hYmxlX2RldmljZV9mbGFncyhkZXYsIElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9JTyk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfZGV2aWNlKTsKIAogLyoKICAqIE1hbmFnZWQgUENJIHJlc291cmNlcy4gIFRoaXMgbWFuYWdlcyBkZXZpY2Ugb24vb2ZmLCBpbnR4L21zaS9tc2l4CkBAIC0xNDE2LDYgKzE0MjIsNyBAQAogCX0KIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MKHBjaW1fZW5hYmxlX2RldmljZSk7CiAKIC8qKgogICogcGNpbV9waW5fZGV2aWNlIC0gUGluIG1hbmFnZWQgUENJIGRldmljZQpAQCAtMTQzNCw2ICsxNDQxLDcgQEAKIAlpZiAoZHIpCiAJCWRyLT5waW5uZWQgPSAxOwogfQorRVhQT1JUX1NZTUJPTChwY2ltX3Bpbl9kZXZpY2UpOwogCiAvKgogICogcGNpYmlvc19hZGRfZGV2aWNlIC0gcHJvdmlkZSBhcmNoIHNwZWNpZmljIGhvb2tzIHdoZW4gYWRkaW5nIGRldmljZSBkZXYKQEAgLTE0NDMsNyArMTQ1MSw3IEBACiAgKiBkZXZpY2VzIGFyZSBhZGRlZC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gQXJjaGl0ZWN0dXJlCiAgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG92ZXJyaWRlIHRoaXMuCiAgKi8KLWludCBfX3dlYWsgcGNpYmlvc19hZGRfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoraW50IF9fd2VhayBwY2liaW9zX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MTUsOCArMTUyMyw3IEBACiAgKiBOb3RlIHdlIGRvbid0IGFjdHVhbGx5IGRpc2FibGUgdGhlIGRldmljZSB1bnRpbCBhbGwgY2FsbGVycyBvZgogICogcGNpX2VuYWJsZV9kZXZpY2UoKSBoYXZlIGNhbGxlZCBwY2lfZGlzYWJsZV9kZXZpY2UoKS4KICAqLwotdm9pZAotcGNpX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit2b2lkIHBjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2cmVzICpkcjsKIApAQCAtMTUzNCw2ICsxNTQxLDcgQEAKIAogCWRldi0+aXNfYnVzbWFzdGVyID0gMDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2Rpc2FibGVfZGV2aWNlKTsKIAogLyoqCiAgKiBwY2liaW9zX3NldF9wY2llX3Jlc2V0X3N0YXRlIC0gc2V0IHJlc2V0IHN0YXRlIGZvciBkZXZpY2UgZGV2CkBAIC0xNTYyLDYgKzE1NzAsNyBAQAogewogCXJldHVybiBwY2liaW9zX3NldF9wY2llX3Jlc2V0X3N0YXRlKGRldiwgc3RhdGUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NldF9wY2llX3Jlc2V0X3N0YXRlKTsKIAogLyoqCiAgKiBwY2lfY2hlY2tfcG1lX3N0YXR1cyAtIENoZWNrIGlmIGdpdmVuIGRldmljZSBoYXMgZ2VuZXJhdGVkIFBNRS4KQEAgLTE2NDEsNiArMTY1MCw3IEBACiAKIAlyZXR1cm4gISEoZGV2LT5wbWVfc3VwcG9ydCAmICgxIDw8IHN0YXRlKSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9wbWVfY2FwYWJsZSk7CiAKIHN0YXRpYyB2b2lkIHBjaV9wbWVfbGlzdF9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTE3NDUsNiArMTc1NSw3IEBACiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIlBNRSMgJXNcbiIsIGVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfcG1lX2FjdGl2ZSk7CiAKIC8qKgogICogX19wY2lfZW5hYmxlX3dha2UgLSBlbmFibGUgUENJIGRldmljZSBhcyB3YWtldXAgZXZlbnQgc291cmNlCkBAIC0xODMwLDYgKzE4NDEsNyBAQAogCQkJcGNpX2VuYWJsZV93YWtlKGRldiwgUENJX0QzY29sZCwgZW5hYmxlKSA6CiAJCQlwY2lfZW5hYmxlX3dha2UoZGV2LCBQQ0lfRDNob3QsIGVuYWJsZSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV93YWtlX2Zyb21fZDMpOwogCiAvKioKICAqIHBjaV90YXJnZXRfc3RhdGUgLSBmaW5kIGFuIGFwcHJvcHJpYXRlIGxvdyBwb3dlciBzdGF0ZSBmb3IgYSBnaXZlbiBQQ0kgZGV2CkBAIC0xOTA4LDYgKzE5MjAsNyBAQAogCiAJcmV0dXJuIGVycm9yOwogfQorRVhQT1JUX1NZTUJPTChwY2lfcHJlcGFyZV90b19zbGVlcCk7CiAKIC8qKgogICogcGNpX2JhY2tfZnJvbV9zbGVlcCAtIHR1cm4gUENJIGRldmljZSBvbiBkdXJpbmcgc3lzdGVtLXdpZGUgdHJhbnNpdGlvbiBpbnRvIHdvcmtpbmcgc3RhdGUKQEAgLTE5MjAsNiArMTkzMyw3IEBACiAJcGNpX2VuYWJsZV93YWtlKGRldiwgUENJX0QwLCBmYWxzZSk7CiAJcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOwogfQorRVhQT1JUX1NZTUJPTChwY2lfYmFja19mcm9tX3NsZWVwKTsKIAogLyoqCiAgKiBwY2lfZmluaXNoX3J1bnRpbWVfc3VzcGVuZCAtIENhcnJ5IG91dCBQQ0ktc3BlY2lmaWMgcGFydCBvZiBydW50aW1lIHN1c3BlbmQuCkBAIC0yNDE1LDggKzI0MjksNyBAQAogCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwogfQogCi1pbnQKLXBjaV9nZXRfaW50ZXJydXB0X3BpbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldiAqKmJyaWRnZSkKK2ludCBwY2lfZ2V0X2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9kZXYgKipicmlkZ2UpCiB7CiAJdTggcGluOwogCkBAIC0yNDc4LDYgKzI0OTEsNyBAQAogCWlmIChkcikKIAkJZHItPnJlZ2lvbl9tYXNrICY9IH4oMSA8PCBiYXIpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfcmVsZWFzZV9yZWdpb24pOwogCiAvKioKICAqCV9fcGNpX3JlcXVlc3RfcmVnaW9uIC0gUmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlCkBAIC0yNDk4LDggKzI1MTIsOCBAQAogICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yICVFQlVTWSBvbiBlcnJvci4gIEEgd2FybmluZwogICoJbWVzc2FnZSBpcyBhbHNvIHByaW50ZWQgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgY29uc3QgY2hhciAqcmVzX25hbWUsCi0JCQkJCQkJCQlpbnQgZXhjbHVzaXZlKQorc3RhdGljIGludCBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwKKwkJCQljb25zdCBjaGFyICpyZXNfbmFtZSwgaW50IGV4Y2x1c2l2ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldnJlcyAqZHI7CiAKQEAgLTI1MTAsOCArMjUyNCw3IEBACiAJCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCiAJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpLCByZXNfbmFtZSkpCiAJCQlnb3RvIGVycl9vdXQ7Ci0JfQotCWVsc2UgaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pIHsKKwl9IGVsc2UgaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pIHsKIAkJaWYgKCFfX3JlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKIAkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpLCByZXNfbmFtZSwKIAkJCQkJZXhjbHVzaXZlKSkKQEAgLTI1NDgsNiArMjU2MSw3IEBACiB7CiAJcmV0dXJuIF9fcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgcmVzX25hbWUsIDApOwogfQorRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb24pOwogCiAvKioKICAqCXBjaV9yZXF1ZXN0X3JlZ2lvbl9leGNsdXNpdmUgLSBSZXNlcnZlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2UKQEAgLTI1NjcsMTAgKzI1ODEsMTMgQEAKICAqCWV4cGxpY2l0bHkgbm90IGFsbG93ZWQgdG8gbWFwIHRoZSByZXNvdXJjZSB2aWEgL2Rldi9tZW0gb3IKICAqCXN5c2ZzLgogICovCi1pbnQgcGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgY29uc3QgY2hhciAqcmVzX25hbWUpCitpbnQgcGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwKKwkJCQkgY29uc3QgY2hhciAqcmVzX25hbWUpCiB7CiAJcmV0dXJuIF9fcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgcmVzX25hbWUsIElPUkVTT1VSQ0VfRVhDTFVTSVZFKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZSk7CisKIC8qKgogICogcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyAtIFJlbGVhc2Ugc2VsZWN0ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlcwogICogQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIHdlcmUgcHJldmlvdXNseSByZXNlcnZlZApAQCAtMjU4Nyw5ICsyNjA0LDEwIEBACiAJCWlmIChiYXJzICYgKDEgPDwgaSkpCiAJCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMpOwogCiBzdGF0aWMgaW50IF9fcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCi0JCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lLCBpbnQgZXhjbCkKKwkJCQkJICBjb25zdCBjaGFyICpyZXNfbmFtZSwgaW50IGV4Y2wpCiB7CiAJaW50IGk7CiAKQEAgLTI2MDAsNyArMjYxOCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0Jd2hpbGUoLS1pID49IDApCisJd2hpbGUgKC0taSA+PSAwKQogCQlpZiAoYmFycyAmICgxIDw8IGkpKQogCQkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOwogCkBAIC0yNjE5LDEzICsyNjM3LDE1IEBACiB7CiAJcmV0dXJuIF9fcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCBiYXJzLCByZXNfbmFtZSwgMCk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMpOwogCi1pbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJIGludCBiYXJzLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK2ludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnJlc19uYW1lKQogewogCXJldHVybiBfX3BjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgYmFycywgcmVzX25hbWUsCiAJCQlJT1JFU09VUkNFX0VYQ0xVU0lWRSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnNfZXhjbHVzaXZlKTsKIAogLyoqCiAgKglwY2lfcmVsZWFzZV9yZWdpb25zIC0gUmVsZWFzZSByZXNlcnZlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCkBAIC0yNjQwLDYgKzI2NjAsNyBAQAogewogCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgKDEgPDwgNikgLSAxKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3JlbGVhc2VfcmVnaW9ucyk7CiAKIC8qKgogICoJcGNpX3JlcXVlc3RfcmVnaW9ucyAtIFJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKQEAgLTI2NTgsNiArMjY3OSw3IEBACiB7CiAJcmV0dXJuIHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgKCgxIDw8IDYpIC0gMSksIHJlc19uYW1lKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9ucyk7CiAKIC8qKgogICoJcGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUgLSBSZXNlcnZlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCkBAIC0yNjgwLDYgKzI3MDIsNyBAQAogCXJldHVybiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShwZGV2LAogCQkJCQkoKDEgPDwgNikgLSAxKSwgcmVzX25hbWUpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZSk7CiAKIHN0YXRpYyB2b2lkIF9fcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldiwgYm9vbCBlbmFibGUpCiB7CkBAIC0yNzQ5LDYgKzI3NzIsNyBAQAogCV9fcGNpX3NldF9tYXN0ZXIoZGV2LCB0cnVlKTsKIAlwY2liaW9zX3NldF9tYXN0ZXIoZGV2KTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3NldF9tYXN0ZXIpOwogCiAvKioKICAqIHBjaV9jbGVhcl9tYXN0ZXIgLSBkaXNhYmxlcyBidXMtbWFzdGVyaW5nIGZvciBkZXZpY2UgZGV2CkBAIC0yNzU4LDYgKzI3ODIsNyBAQAogewogCV9fcGNpX3NldF9tYXN0ZXIoZGV2LCBmYWxzZSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9tYXN0ZXIpOwogCiAvKioKICAqIHBjaV9zZXRfY2FjaGVsaW5lX3NpemUgLSBlbnN1cmUgdGhlIENBQ0hFX0xJTkVfU0laRSByZWdpc3RlciBpcyBwcm9ncmFtbWVkCkBAIC0yNzkwLDMwICsyODE1LDEzIEBACiAJaWYgKGNhY2hlbGluZV9zaXplID09IHBjaV9jYWNoZV9saW5lX3NpemUpCiAJCXJldHVybiAwOwogCi0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJjYWNoZSBsaW5lIHNpemUgb2YgJWQgaXMgbm90ICIKLQkJICAgInN1cHBvcnRlZFxuIiwgcGNpX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKKwlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgImNhY2hlIGxpbmUgc2l6ZSBvZiAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkgICBwY2lfY2FjaGVfbGluZV9zaXplIDw8IDIpOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfc2V0X2NhY2hlbGluZV9zaXplKTsKIAotI2lmZGVmIFBDSV9ESVNBQkxFX01XSQotaW50IHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwY2lfdHJ5X3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBwY2lfY2xlYXJfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci19Ci0KLSNlbHNlCi0KIC8qKgogICogcGNpX3NldF9td2kgLSBlbmFibGVzIG1lbW9yeS13cml0ZS1pbnZhbGlkYXRlIFBDSSB0cmFuc2FjdGlvbgogICogQGRldjogdGhlIFBDSSBkZXZpY2UgZm9yIHdoaWNoIE1XSSBpcyBlbmFibGVkCkBAIC0yODIyLDkgKzI4MzAsMTEgQEAKICAqCiAgKiBSRVRVUk5TOiBBbiBhcHByb3ByaWF0ZSAtRVJSTk8gZXJyb3IgdmFsdWUgb24gZXJyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCiAgKi8KLWludAotcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKK2ludCBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworI2lmZGVmIFBDSV9ESVNBQkxFX01XSQorCXJldHVybiAwOworI2Vsc2UKIAlpbnQgcmM7CiAJdTE2IGNtZDsKIApAQCAtMjgzMywxNCArMjg0MywxNSBAQAogCQlyZXR1cm4gcmM7CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAoISAoY21kICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkpIHsKKwlpZiAoIShjbWQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKSkgewogCQlkZXZfZGJnKCZkZXYtPmRldiwgImVuYWJsaW5nIE1lbS1Xci1JbnZhbFxuIik7CiAJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTlZBTElEQVRFOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9Ci0KIAlyZXR1cm4gMDsKKyNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChwY2lfc2V0X213aSk7CiAKIC8qKgogICogcGNpX3RyeV9zZXRfbXdpIC0gZW5hYmxlcyBtZW1vcnktd3JpdGUtaW52YWxpZGF0ZSBQQ0kgdHJhbnNhY3Rpb24KQEAgLTI4NTMsOSArMjg2NCwxMyBAQAogICovCiBpbnQgcGNpX3RyeV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IHJjID0gcGNpX3NldF9td2koZGV2KTsKLQlyZXR1cm4gcmM7CisjaWZkZWYgUENJX0RJU0FCTEVfTVdJCisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBwY2lfc2V0X213aShkZXYpOworI2VuZGlmCiB9CitFWFBPUlRfU1lNQk9MKHBjaV90cnlfc2V0X213aSk7CiAKIC8qKgogICogcGNpX2NsZWFyX213aSAtIGRpc2FibGVzIE1lbW9yeS1Xcml0ZS1JbnZhbGlkYXRlIGZvciBkZXZpY2UgZGV2CkBAIC0yODYzLDkgKzI4NzgsOSBAQAogICoKICAqIERpc2FibGVzIFBDSSBNZW1vcnktV3JpdGUtSW52YWxpZGF0ZSB0cmFuc2FjdGlvbiBvbiB0aGUgZGV2aWNlCiAgKi8KLXZvaWQKLXBjaV9jbGVhcl9td2koc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworI2lmbmRlZiBQQ0lfRElTQUJMRV9NV0kKIAl1MTYgY21kOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CkBAIC0yODczLDggKzI4ODgsOSBAQAogCQljbWQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KKyNlbmRpZgogfQotI2VuZGlmIC8qICEgUENJX0RJU0FCTEVfTVdJICovCitFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9td2kpOwogCiAvKioKICAqIHBjaV9pbnR4IC0gZW5hYmxlcy9kaXNhYmxlcyBQQ0kgSU5UeCBmb3IgZGV2aWNlIGRldgpAQCAtMjg4MywxOCArMjg5OSwxNiBAQAogICoKICAqIEVuYWJsZXMvZGlzYWJsZXMgUENJIElOVHggZm9yIGRldmljZSBkZXYKICAqLwotdm9pZAotcGNpX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBlbmFibGUpCit2b2lkIHBjaV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZW5hYmxlKQogewogCXUxNiBwY2lfY29tbWFuZCwgbmV3OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CiAKLQlpZiAoZW5hYmxlKSB7CisJaWYgKGVuYWJsZSkKIAkJbmV3ID0gcGNpX2NvbW1hbmQgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCX0gZWxzZSB7CisJZWxzZQogCQluZXcgPSBwY2lfY29tbWFuZCB8IFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQl9CiAKIAlpZiAobmV3ICE9IHBjaV9jb21tYW5kKSB7CiAJCXN0cnVjdCBwY2lfZGV2cmVzICpkcjsKQEAgLTI5MDgsNiArMjkyMiw3IEBACiAJCX0KIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfaW50eCk7CiAKIC8qKgogICogcGNpX2ludHhfbWFza19zdXBwb3J0ZWQgLSBwcm9iZSBmb3IgSU5UeCBtYXNraW5nIHN1cHBvcnQKQEAgLTI5MzcsOCArMjk1Miw4IEBACiAJICogZ28gYWhlYWQgYW5kIGNoZWNrIGl0LgogCSAqLwogCWlmICgobmV3IF4gb3JpZykgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQ29tbWFuZCByZWdpc3RlciBjaGFuZ2VkIGZyb20gIgotCQkJIjB4JXggdG8gMHgleDogZHJpdmVyIG9yIGhhcmR3YXJlIGJ1Zz9cbiIsIG9yaWcsIG5ldyk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ29tbWFuZCByZWdpc3RlciBjaGFuZ2VkIGZyb20gMHgleCB0byAweCV4OiBkcml2ZXIgb3IgaGFyZHdhcmUgYnVnP1xuIiwKKwkJCW9yaWcsIG5ldyk7CiAJfSBlbHNlIGlmICgobmV3IF4gb3JpZykgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKIAkJbWFza19zdXBwb3J0ZWQgPSB0cnVlOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgb3JpZyk7CkBAIC0zMTI0LDggKzMxMzksNyBAQAogCWlmIChwY2lfd2FpdF9mb3JfcGVuZGluZyhkZXYsIHBvcyArIFBDSV9BRl9TVEFUVVMsIFBDSV9BRl9TVEFUVVNfVFApKQogCQlnb3RvIGNsZWFyOwogCi0JZGV2X2VycigmZGV2LT5kZXYsICJ0cmFuc2FjdGlvbiBpcyBub3QgY2xlYXJlZDsgIgotCQkJInByb2NlZWRpbmcgd2l0aCByZXNldCBhbnl3YXlcbiIpOworCWRldl9lcnIoJmRldi0+ZGV2LCAidHJhbnNhY3Rpb24gaXMgbm90IGNsZWFyZWQ7IHByb2NlZWRpbmcgd2l0aCByZXNldCBhbnl3YXlcbiIpOwogCiBjbGVhcjoKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwb3MgKyBQQ0lfQUZfQ1RSTCwgUENJX0FGX0NUUkxfRkxSKTsKQEAgLTQxMDAsNiArNDExNCw3IEBACiAJCQliYXJzIHw9ICgxIDw8IGkpOwogCXJldHVybiBiYXJzOwogfQorRVhQT1JUX1NZTUJPTChwY2lfc2VsZWN0X2JhcnMpOwogCiAvKioKICAqIHBjaV9yZXNvdXJjZV9iYXIgLSBnZXQgcG9zaXRpb24gb2YgdGhlIEJBUiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQpAQCAtNDEzOSw3ICs0MTU0LDcgQEAKIH0KIAogc3RhdGljIGludCBwY2lfc2V0X3ZnYV9zdGF0ZV9hcmNoKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGJvb2wgZGVjb2RlLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCisJCQkJICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCiB7CiAJaWYgKGFyY2hfc2V0X3ZnYV9zdGF0ZSkKIAkJcmV0dXJuIGFyY2hfc2V0X3ZnYV9zdGF0ZShkZXYsIGRlY29kZSwgY29tbWFuZF9iaXRzLApAQCAtNDI1MSwxMSArNDI2NiwxMCBAQAogCQkJYnVzID09IGRldi0+YnVzLT5udW1iZXIgJiYKIAkJCXNsb3QgPT0gUENJX1NMT1QoZGV2LT5kZXZmbikgJiYKIAkJCWZ1bmMgPT0gUENJX0ZVTkMoZGV2LT5kZXZmbikpIHsKLQkJCWlmIChhbGlnbl9vcmRlciA9PSAtMSkgeworCQkJaWYgKGFsaWduX29yZGVyID09IC0xKQogCQkJCWFsaWduID0gUEFHRV9TSVpFOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlhbGlnbiA9IDEgPDwgYWxpZ25fb3JkZXI7Ci0JCQl9CiAJCQkvKiBGb3VuZCAqLwogCQkJYnJlYWs7CiAJCX0KQEAgLTQzNzMsNyArNDM4Nyw2IEBACiAJcmV0dXJuIGJ1c19jcmVhdGVfZmlsZSgmcGNpX2J1c190eXBlLAogCQkJCQkmYnVzX2F0dHJfcmVzb3VyY2VfYWxpZ25tZW50KTsKIH0KLQogbGF0ZV9pbml0Y2FsbChwY2lfcmVzb3VyY2VfYWxpZ25tZW50X3N5c2ZzX2luaXQpOwogCiBzdGF0aWMgdm9pZCBwY2lfbm9fZG9tYWlucyh2b2lkKQpAQCAtNDQ1Miw0MSArNDQ2NSwzIEBACiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgicGNpIiwgcGNpX3NldHVwKTsKLQotRVhQT1JUX1NZTUJPTChwY2lfcmVlbmFibGVfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9kZXZpY2VfaW8pOwotRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZV9tZW0pOwotRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaW1fZW5hYmxlX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaW1fcGluX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9kaXNhYmxlX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9maW5kX2NhcGFiaWxpdHkpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3JlZ2lvbnMpOwotRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb25zKTsKLUVYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUpOwotRVhQT1JUX1NZTUJPTChwY2lfcmVsZWFzZV9yZWdpb24pOwotRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb24pOwotRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb25fZXhjbHVzaXZlKTsKLUVYUE9SVF9TWU1CT0wocGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMpOwotRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9zZXRfbWFzdGVyKTsKLUVYUE9SVF9TWU1CT0wocGNpX2NsZWFyX21hc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHBjaV9zZXRfbXdpKTsKLUVYUE9SVF9TWU1CT0wocGNpX3RyeV9zZXRfbXdpKTsKLUVYUE9SVF9TWU1CT0wocGNpX2NsZWFyX213aSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2lfaW50eCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9hc3NpZ25fcmVzb3VyY2UpOwotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UpOwotRVhQT1JUX1NZTUJPTChwY2lfc2VsZWN0X2JhcnMpOwotCi1FWFBPUlRfU1lNQk9MKHBjaV9zZXRfcG93ZXJfc3RhdGUpOwotRVhQT1JUX1NZTUJPTChwY2lfc2F2ZV9zdGF0ZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZXN0b3JlX3N0YXRlKTsKLUVYUE9SVF9TWU1CT0wocGNpX3BtZV9jYXBhYmxlKTsKLUVYUE9SVF9TWU1CT0wocGNpX3BtZV9hY3RpdmUpOwotRVhQT1JUX1NZTUJPTChwY2lfd2FrZV9mcm9tX2QzKTsKLUVYUE9SVF9TWU1CT0wocGNpX3ByZXBhcmVfdG9fc2xlZXApOwotRVhQT1JUX1NZTUJPTChwY2lfYmFja19mcm9tX3NsZWVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHBjaV9zZXRfcGNpZV9yZXNldF9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMKaW5kZXggNTg3ZTdlOC4uMTgyMjI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyX2luamVjdC5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2Flcl9pbmplY3QuYwpAQCAtMzk3LDE2ICszOTcsMTQgQEAKIAlpZiAoIWFlcl9tYXNrX292ZXJyaWRlICYmIGVpbmotPmNvcl9zdGF0dXMgJiYKIAkgICAgIShlaW5qLT5jb3Jfc3RhdHVzICYgfmNvcl9tYXNrKSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJUaGUgY29ycmVjdGFibGUgZXJyb3IocykgaXMgbWFza2VkICIKLQkJCQkiYnkgZGV2aWNlXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVGhlIGNvcnJlY3RhYmxlIGVycm9yKHMpIGlzIG1hc2tlZCBieSBkZXZpY2VcbiIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmplY3RfbG9jaywgZmxhZ3MpOwogCQlnb3RvIG91dF9wdXQ7CiAJfQogCWlmICghYWVyX21hc2tfb3ZlcnJpZGUgJiYgZWluai0+dW5jb3Jfc3RhdHVzICYmCiAJICAgICEoZWluai0+dW5jb3Jfc3RhdHVzICYgfnVuY29yX21hc2spKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoZSB1bmNvcnJlY3RhYmxlIGVycm9yKHMpIGlzIG1hc2tlZCAiCi0JCQkJImJ5IGRldmljZVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoZSB1bmNvcnJlY3RhYmxlIGVycm9yKHMpIGlzIG1hc2tlZCBieSBkZXZpY2VcbiIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmplY3RfbG9jaywgZmxhZ3MpOwogCQlnb3RvIG91dF9wdXQ7CiAJfQpAQCAtNDY0LDggKzQ2Miw3IEBACiAJCQlnb3RvIG91dF9wdXQ7CiAJCX0KIAkJYWVyX2lycSgtMSwgZWRldik7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcmV0ID0gLUVJTlZBTDsKIG91dF9wdXQ6CiAJa2ZyZWUoZXJyX2FsbG9jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCmluZGV4IGIyYzg4ODEuLjU2NTNlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYwpAQCAtNTQyLDggKzU0Miw3IEBACiAjZGVmaW5lIEFFUl9SRUNPVkVSX1JJTkdfT1JERVIJCTQKICNkZWZpbmUgQUVSX1JFQ09WRVJfUklOR19TSVpFCQkoMSA8PCBBRVJfUkVDT1ZFUl9SSU5HX09SREVSKQogCi1zdHJ1Y3QgYWVyX3JlY292ZXJfZW50cnkKLXsKK3N0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeSB7CiAJdTgJYnVzOwogCXU4CWRldmZuOwogCXUxNglkb21haW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCmluZGV4IDM0ZmY3MDIuLjM2ZWQzMWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwpAQCAtMTcyLDkgKzE3Miw3IEBACiAJaW50IGlkID0gKChkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbik7CiAKIAlpZiAoIWluZm8tPnN0YXR1cykgewotCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCSJQQ0llIEJ1cyBFcnJvcjogc2V2ZXJpdHk9JXMsIHR5cGU9VW5hY2Nlc3NpYmxlLCAiCi0JCQkiaWQ9JTA0eChVbnJlZ2lzdGVyZWQgQWdlbnQgSUQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwgIlBDSWUgQnVzIEVycm9yOiBzZXZlcml0eT0lcywgdHlwZT1VbmFjY2Vzc2libGUsIGlkPSUwNHgoVW5yZWdpc3RlcmVkIEFnZW50IElEKVxuIiwKIAkJCWFlcl9lcnJvcl9zZXZlcml0eV9zdHJpbmdbaW5mby0+c2V2ZXJpdHldLCBpZCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE4MiwxMyArMTgwLDExIEBACiAJbGF5ZXIgPSBBRVJfR0VUX0xBWUVSX0VSUk9SKGluZm8tPnNldmVyaXR5LCBpbmZvLT5zdGF0dXMpOwogCWFnZW50ID0gQUVSX0dFVF9BR0VOVChpbmZvLT5zZXZlcml0eSwgaW5mby0+c3RhdHVzKTsKIAotCWRldl9lcnIoJmRldi0+ZGV2LAotCQkiUENJZSBCdXMgRXJyb3I6IHNldmVyaXR5PSVzLCB0eXBlPSVzLCBpZD0lMDR4KCVzKVxuIiwKKwlkZXZfZXJyKCZkZXYtPmRldiwgIlBDSWUgQnVzIEVycm9yOiBzZXZlcml0eT0lcywgdHlwZT0lcywgaWQ9JTA0eCglcylcbiIsCiAJCWFlcl9lcnJvcl9zZXZlcml0eV9zdHJpbmdbaW5mby0+c2V2ZXJpdHldLAogCQlhZXJfZXJyb3JfbGF5ZXJbbGF5ZXJdLCBpZCwgYWVyX2FnZW50X3N0cmluZ1thZ2VudF0pOwogCi0JZGV2X2VycigmZGV2LT5kZXYsCi0JCSIgIGRldmljZSBbJTA0eDolMDR4XSBlcnJvciBzdGF0dXMvbWFzaz0lMDh4LyUwOHhcbiIsCisJZGV2X2VycigmZGV2LT5kZXYsICIgIGRldmljZSBbJTA0eDolMDR4XSBlcnJvciBzdGF0dXMvbWFzaz0lMDh4LyUwOHhcbiIsCiAJCWRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwKIAkJaW5mby0+c3RhdHVzLCBpbmZvLT5tYXNrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wbWUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMKaW5kZXggYmJjM2JkZC4uODJlMDZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wbWUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BtZS5jCkBAIC0xOTksOCArMTk5LDcgQEAKIAkJICogYXNzdW1pbmcgdGhhdCB0aGUgUE1FIHdhcyByZXBvcnRlZCBieSBhIFBDSWUtUENJIGJyaWRnZSB0aGF0CiAJCSAqIHVzZWQgZGV2Zm4gZGlmZmVyZW50IGZyb20gemVyby4KIAkJICovCi0JCWRldl9kYmcoJnBvcnQtPmRldiwgIlBNRSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGZvciAiCi0JCQkibm9uLWV4aXN0ZW50IGRldmljZSAlMDJ4OiUwMnguJWRcbiIsCisJCWRldl9kYmcoJnBvcnQtPmRldiwgIlBNRSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGZvciBub24tZXhpc3RlbnQgZGV2aWNlICUwMng6JTAyeC4lZFxuIiwKIAkJCWJ1c25yLCBQQ0lfU0xPVChkZXZmbiksIFBDSV9GVU5DKGRldmZuKSk7CiAJCWZvdW5kID0gcGNpZV9wbWVfZnJvbV9wY2lfYnJpZGdlKGJ1cywgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCmluZGV4IDBkOGZkYzQuLjgwODg3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKQEAgLTIwNCw4ICsyMDQsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghZGV2LT5pcnEgJiYgZGV2LT5waW4pIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGV2aWNlIFslMDR4OiUwNHhdIGhhcyBpbnZhbGlkIElSUTsgIgotCQkJICJjaGVjayB2ZW5kb3IgQklPU1xuIiwgZGV2LT52ZW5kb3IsIGRldi0+ZGV2aWNlKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGV2aWNlIFslMDR4OiUwNHhdIGhhcyBpbnZhbGlkIElSUTsgY2hlY2sgdmVuZG9yIEJJT1NcbiIsCisJCQkgZGV2LT52ZW5kb3IsIGRldi0+ZGV2aWNlKTsKIAl9CiAJc3RhdHVzID0gcGNpZV9wb3J0X2RldmljZV9yZWdpc3RlcihkZXYpOwogCWlmIChzdGF0dXMpCkBAIC0zOTcsNyArMzk3LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGRtaV9wY2llX3BtZV9kaXNhYmxlX21zaShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlwcl9ub3RpY2UoIiVzIGRldGVjdGVkOiB3aWxsIG5vdCB1c2UgTVNJIGZvciBQQ0llIFBNRSBzaWduYWxpbmdcbiIsCi0JCQlkLT5pZGVudCk7CisJCSAgZC0+aWRlbnQpOwogCXBjaWVfcG1lX2Rpc2FibGVfbXNpKCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCAyYmJmNTIyLi5lM2NmOGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogICogUmV0dXJucyAxIGlmIHRoZSBCQVIgaXMgNjQtYml0LCBvciAwIGlmIDMyLWJpdC4KICAqLwogaW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAotCQkJc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBwb3MpCisJCSAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IHBvcykKIHsKIAl1MzIgbCwgc3osIG1hc2s7CiAJdTY0IGw2NCwgc3o2NCwgbWFzazY0OwpAQCAtNDMzLDggKzQzMyw3IEBACiAJCQlsaW1pdCB8PSAoKHVuc2lnbmVkIGxvbmcpIG1lbV9saW1pdF9oaSkgPDwgMzI7CiAjZWxzZQogCQkJaWYgKG1lbV9iYXNlX2hpIHx8IG1lbV9saW1pdF9oaSkgewotCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuJ3QgaGFuZGxlIDY0LWJpdCAiCi0JCQkJCSJhZGRyZXNzIHNwYWNlIGZvciBicmlkZ2VcbiIpOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuJ3QgaGFuZGxlIDY0LWJpdCBhZGRyZXNzIHNwYWNlIGZvciBicmlkZ2VcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KICNlbmRpZgpAQCAtNjA0LDcgKzYwMyw2IEBACiAJcmV0dXJuIGFncF9zcGVlZHNbaW5kZXhdOwogfQogCi0KIHN0YXRpYyB2b2lkIHBjaV9zZXRfYnVzX3NwZWVkKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGJ1cy0+c2VsZjsKQEAgLTYzNiwxMSArNjM0LDEwIEBACiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgUENJX1hfU1NUQVRVU18yNjZNSFopIHsKIAkJCW1heCA9IFBDSV9TUEVFRF8xMzNNSHpfUENJWF8yNjY7CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgUENJX1hfU1NUQVRVU18xMzNNSFopIHsKLQkJCWlmICgoc3RhdHVzICYgUENJX1hfU1NUQVRVU19WRVJTKSA9PSBQQ0lfWF9TU1RBVFVTX1YyKSB7CisJCQlpZiAoKHN0YXR1cyAmIFBDSV9YX1NTVEFUVVNfVkVSUykgPT0gUENJX1hfU1NUQVRVU19WMikKIAkJCQltYXggPSBQQ0lfU1BFRURfMTMzTUh6X1BDSVhfRUNDOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQltYXggPSBQQ0lfU1BFRURfMTMzTUh6X1BDSVg7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQltYXggPSBQQ0lfU1BFRURfNjZNSHpfUENJWDsKIAkJfQpAQCAtNjY0LDcgKzY2MSw2IEBACiAJfQogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqcGNpX2FsbG9jX2NoaWxkX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50LAogCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlLCBpbnQgYnVzbnIpCiB7CkBAIC03MjksNyArNzI1LDggQEAKIAlyZXR1cm4gY2hpbGQ7CiB9CiAKLXN0cnVjdCBwY2lfYnVzICpwY2lfYWRkX25ld19idXMoc3RydWN0IHBjaV9idXMgKnBhcmVudCwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJ1c25yKQorc3RydWN0IHBjaV9idXMgKnBjaV9hZGRfbmV3X2J1cyhzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCWludCBidXNucikKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CiAKQEAgLTc0MSw2ICs3MzgsNyBAQAogCX0KIAlyZXR1cm4gY2hpbGQ7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9hZGRfbmV3X2J1cyk7CiAKIC8qCiAgKiBJZiBpdCdzIGEgYnJpZGdlLCBjb25maWd1cmUgaXQgYW5kIHNjYW4gdGhlIGJ1cyBiZWhpbmQgaXQuCkBAIC04ODcsNyArODg1LDcgQEAKIAkJCSAqIGFzIGNhcmRzIHdpdGggYSBQQ0ktdG8tUENJIGJyaWRnZSBjYW4gYmUKIAkJCSAqIGluc2VydGVkIGxhdGVyLgogCQkJICovCi0JCQlmb3IgKGk9MDsgaTxDQVJEQlVTX1JFU0VSVkVfQlVTTlI7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IENBUkRCVVNfUkVTRVJWRV9CVVNOUjsgaSsrKSB7CiAJCQkJc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IGJ1czsKIAkJCQlpZiAocGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYnVzKSwKIAkJCQkJCQltYXgraSsxKSkKQEAgLTkzNCw4ICs5MzIsNyBAQAogCQkgICAgKGNoaWxkLT5udW1iZXIgPiBidXMtPmJ1c25fcmVzLmVuZCkgfHwKIAkJICAgIChjaGlsZC0+bnVtYmVyIDwgYnVzLT5udW1iZXIpIHx8CiAJCSAgICAoY2hpbGQtPmJ1c25fcmVzLmVuZCA8IGJ1cy0+bnVtYmVyKSkgewotCQkJZGV2X2luZm8oJmNoaWxkLT5kZXYsICIlcFIgJXMgIgotCQkJCSJoaWRkZW4gYmVoaW5kJXMgYnJpZGdlICVzICVwUlxuIiwKKwkJCWRldl9pbmZvKCZjaGlsZC0+ZGV2LCAiJXBSICVzIGhpZGRlbiBiZWhpbmQlcyBicmlkZ2UgJXMgJXBSXG4iLAogCQkJCSZjaGlsZC0+YnVzbl9yZXMsCiAJCQkJKGJ1cy0+bnVtYmVyID4gY2hpbGQtPmJ1c25fcmVzLmVuZCAmJgogCQkJCSBidXMtPmJ1c25fcmVzLmVuZCA8IGNoaWxkLT5udW1iZXIpID8KQEAgLTk1Miw2ICs5NDksNyBAQAogCiAJcmV0dXJuIG1heDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3NjYW5fYnJpZGdlKTsKIAogLyoKICAqIFJlYWQgaW50ZXJydXB0IGxpbmUgYW5kIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMuCkBAIC05OTIsNyArOTkwLDYgQEAKIAkJcGRldi0+aXNfaG90cGx1Z19icmlkZ2UgPSAxOwogfQogCi0KIC8qKgogICogcGNpX2V4dF9jZmdfaXNfYWxpYXNlZCAtIGlzIGV4dCBjb25maWcgc3BhY2UganVzdCBhbiBhbGlhcyBvZiBzdGQgY29uZmlnPwogICogQGRldjogUENJIGRldmljZQpAQCAtMTIyNSwxMyArMTIyMiwxMyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6CQkJCSAgICAvKiB1bmtub3duIGhlYWRlciAqLwotCQlkZXZfZXJyKCZkZXYtPmRldiwgInVua25vd24gaGVhZGVyIHR5cGUgJTAyeCwgIgotCQkJImlnbm9yaW5nIGRldmljZVxuIiwgZGV2LT5oZHJfdHlwZSk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5rbm93biBoZWFkZXIgdHlwZSAlMDJ4LCBpZ25vcmluZyBkZXZpY2VcbiIsCisJCQlkZXYtPmhkcl90eXBlKTsKIAkJcmV0dXJuIC1FSU87CiAKIAliYWQ6Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiaWdub3JpbmcgY2xhc3MgJSMwOHggKGRvZXNuJ3QgbWF0Y2ggaGVhZGVyICIKLQkJCSJ0eXBlICUwMngpXG4iLCBkZXYtPmNsYXNzLCBkZXYtPmhkcl90eXBlKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJpZ25vcmluZyBjbGFzcyAlIzA4eCAoZG9lc24ndCBtYXRjaCBoZWFkZXIgdHlwZSAlMDJ4KVxuIiwKKwkJCWRldi0+Y2xhc3MsIGRldi0+aGRyX3R5cGUpOwogCQlkZXYtPmNsYXNzID0gUENJX0NMQVNTX05PVF9ERUZJTkVEOwogCX0KIApAQCAtMTI4Myw3ICsxMjgwLDcgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2Rldik7CiAKIGJvb2wgcGNpX2J1c19yZWFkX2Rldl92ZW5kb3JfaWQoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuLCB1MzIgKmwsCi0JCQkJIGludCBjcnNfdGltZW91dCkKKwkJCQlpbnQgY3JzX3RpbWVvdXQpCiB7CiAJaW50IGRlbGF5ID0gMTsKIApAQCAtMTMwNiwxMCArMTMwMyw5IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCS8qIENhcmQgaGFzbid0IHJlc3BvbmRlZCBpbiA2MCBzZWNvbmRzPyAgTXVzdCBiZSBzdHVjay4gKi8KIAkJaWYgKGRlbGF5ID4gY3JzX3RpbWVvdXQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaSAlMDR4OiUwMng6JTAyeC4lZDogbm90ICIKLQkJCQkJInJlc3BvbmRpbmdcbiIsIHBjaV9kb21haW5fbnIoYnVzKSwKLQkJCQkJYnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldmZuKSwKLQkJCQkJUENJX0ZVTkMoZGV2Zm4pKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaSAlMDR4OiUwMng6JTAyeC4lZDogbm90IHJlc3BvbmRpbmdcbiIsCisJCQkgICAgICAgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pLAorCQkJICAgICAgIFBDSV9GVU5DKGRldmZuKSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CkBAIC0xNTE5LDYgKzE1MTUsNyBAQAogCiAJcmV0dXJuIG5yOwogfQorRVhQT1JUX1NZTUJPTChwY2lfc2Nhbl9zbG90KTsKIAogc3RhdGljIGludCBwY2llX2ZpbmRfc21wc3Moc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKIHsKQEAgLTE2MTMsOSArMTYxMCw3IEBACiAJfQogCiAJaWYgKG1ycnMgPCAxMjgpCi0JCWRldl9lcnIoJmRldi0+ZGV2LCAiTVJSUyB3YXMgdW5hYmxlIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBhICIKLQkJCSJzYWZlIHZhbHVlLiAgSWYgcHJvYmxlbXMgYXJlIGV4cGVyaWVuY2VkLCB0cnkgcnVubmluZyAiCi0JCQkid2l0aCBwY2k9cGNpZV9idXNfc2FmZS5cbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIk1SUlMgd2FzIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIHdpdGggYSBzYWZlIHZhbHVlLiAgSWYgcHJvYmxlbXMgYXJlIGV4cGVyaWVuY2VkLCB0cnkgcnVubmluZyB3aXRoIHBjaT1wY2llX2J1c19zYWZlXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgcGNpZV9idXNfZGV0ZWN0X21wcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMTY1Miw4ICsxNjQ3LDggQEAKIAlwY2llX3dyaXRlX21wcyhkZXYsIG1wcyk7CiAJcGNpZV93cml0ZV9tcnJzKGRldik7CiAKLQlkZXZfaW5mbygmZGV2LT5kZXYsICJNYXggUGF5bG9hZCBTaXplIHNldCB0byAlNGQvJTRkICh3YXMgJTRkKSwgIgotCQkgIk1heCBSZWFkIFJxICU0ZFxuIiwgcGNpZV9nZXRfbXBzKGRldiksIDEyOCA8PCBkZXYtPnBjaWVfbXBzcywKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJNYXggUGF5bG9hZCBTaXplIHNldCB0byAlNGQvJTRkICh3YXMgJTRkKSwgTWF4IFJlYWQgUnEgJTRkXG4iLAorCQkgcGNpZV9nZXRfbXBzKGRldiksIDEyOCA8PCBkZXYtPnBjaWVfbXBzcywKIAkJIG9yaWdfbXBzLCBwY2llX2dldF9yZWFkcnEoZGV2KSk7CiAKIAlyZXR1cm4gMDsKQEAgLTE3MTYsNyArMTcxMSw3IEBACiAJCWJ1cy0+aXNfYWRkZWQgPSAxOwogCX0KIAotCWZvciAocGFzcz0wOyBwYXNzIDwgMjsgcGFzcysrKQorCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQkJaWYgKHBjaV9pc19icmlkZ2UoZGV2KSkKIAkJCQltYXggPSBwY2lfc2Nhbl9icmlkZ2UoYnVzLCBkZXYsIG1heCwgcGFzcyk7CkBAIC0xNzMyLDYgKzE3MjcsNyBAQAogCWRldl9kYmcoJmJ1cy0+ZGV2LCAiYnVzIHNjYW4gcmV0dXJuaW5nIHdpdGggbWF4PSUwMnhcbiIsIG1heCk7CiAJcmV0dXJuIG1heDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9zY2FuX2NoaWxkX2J1cyk7CiAKIC8qKgogICogcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlIC0gUGxhdGZvcm0tc3BlY2lmaWMgaG9zdCBicmlkZ2Ugc2V0dXAuCkBAIC0yMDQwLDExICsyMDM2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9yZXNjYW5fYnVzKTsKIAotRVhQT1JUX1NZTUJPTChwY2lfYWRkX25ld19idXMpOwotRVhQT1JUX1NZTUJPTChwY2lfc2Nhbl9zbG90KTsKLUVYUE9SVF9TWU1CT0wocGNpX3NjYW5fYnJpZGdlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHBjaV9zY2FuX2NoaWxkX2J1cyk7Ci0KIC8qCiAgKiBwY2lfcmVzY2FuX2J1cygpLCBwY2lfcmVzY2FuX2J1c19icmlkZ2VfcmVzaXplKCkgYW5kIFBDSSBkZXZpY2UgcmVtb3ZhbAogICogcm91dGluZXMgc2hvdWxkIGFsd2F5cyBiZSBleGVjdXRlZCB1bmRlciB0aGlzIG11dGV4LgpAQCAtMjA2Myw3ICsyMDU0LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV91bmxvY2tfcmVzY2FuX3JlbW92ZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9zb3J0X2JmX2NtcChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkX2EsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRfYikKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zb3J0X2JmX2NtcChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkX2EsCisJCQkJICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkX2IpCiB7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXYgKmEgPSB0b19wY2lfZGV2KGRfYSk7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXYgKmIgPSB0b19wY2lfZGV2KGRfYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggNDZkMTM3OC4uM2YxNTVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMTcsMTUgKzE3LDE0IEBACiAKIHN0YXRpYyBpbnQgcHJvY19pbml0aWFsaXplZDsJLyogPSAwICovCiAKLXN0YXRpYyBsb2ZmX3QKLXByb2NfYnVzX3BjaV9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZiwgaW50IHdoZW5jZSkKK3N0YXRpYyBsb2ZmX3QgcHJvY19idXNfcGNpX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBQREVfREFUQShmaWxlX2lub2RlKGZpbGUpKTsKIAlyZXR1cm4gZml4ZWRfc2l6ZV9sbHNlZWsoZmlsZSwgb2ZmLCB3aGVuY2UsIGRldi0+Y2ZnX3NpemUpOwogfQogCi1zdGF0aWMgc3NpemVfdAotcHJvY19idXNfcGNpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHByb2NfYnVzX3BjaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IFBERV9EQVRBKGZpbGVfaW5vZGUoZmlsZSkpOwogCXVuc2lnbmVkIGludCBwb3MgPSAqcHBvczsKQEAgLTEwOCw4ICsxMDcsOCBAQAogCXJldHVybiBuYnl0ZXM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1wcm9jX2J1c19wY2lfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHByb2NfYnVzX3BjaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IFBERV9EQVRBKGlubyk7CkBAIC00MTMsNyArNDEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBjaV9wcm9jX2RldGFjaF9idXMoc3RydWN0IHBjaV9idXMqIGJ1cykKK2ludCBwY2lfcHJvY19kZXRhY2hfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJcHJvY19yZW1vdmUoYnVzLT5wcm9jZGlyKTsKIAlyZXR1cm4gMDsKQEAgLTQyMyw2ICs0MjIsNyBAQAogewogCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcHJvY19idXNfcGNpX2RldmljZXNfb3ApOwogfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2J1c19wY2lfZGV2X29wZXJhdGlvbnMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IHByb2NfYnVzX3BjaV9kZXZfb3BlbiwKQEAgLTQ0Myw2ICs0NDMsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KIGRldmljZV9pbml0Y2FsbChwY2lfcHJvY19pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCA5MmU2OGM3Ny4uZDBmNjkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTQ4LDggKzQ4LDggQEAKIHsKIAlkZXYtPmJyb2tlbl9wYXJpdHlfc3RhdHVzID0gMTsJLyogVGhpcyBkZXZpY2UgZ2l2ZXMgZmFsc2UgcG9zaXRpdmVzICovCiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX01FTExBTk9YLFBDSV9ERVZJQ0VfSURfTUVMTEFOT1hfVEFWT1IscXVpcmtfbWVsbGFub3hfdGF2b3IpOwotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9NRUxMQU5PWCxQQ0lfREVWSUNFX0lEX01FTExBTk9YX1RBVk9SX0JSSURHRSxxdWlya19tZWxsYW5veF90YXZvcik7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX01FTExBTk9YLCBQQ0lfREVWSUNFX0lEX01FTExBTk9YX1RBVk9SLCBxdWlya19tZWxsYW5veF90YXZvcik7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX01FTExBTk9YLCBQQ0lfREVWSUNFX0lEX01FTExBTk9YX1RBVk9SX0JSSURHRSwgcXVpcmtfbWVsbGFub3hfdGF2b3IpOwogCiAvKiBEZWFsIHdpdGggYnJva2VuIEJJT1NlcyB0aGF0IG5lZ2xlY3QgdG8gZW5hYmxlIHBhc3NpdmUgcmVsZWFzZSwKICAgIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSA4MjQ0MUZYL1BQcm8gTVRSUnMgKi8KQEAgLTgyLDcgKzgyLDcgQEAKIHN0YXRpYyB2b2lkIHF1aXJrX2lzYV9kbWFfaGFuZ3Moc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpZiAoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JCWlzYV9kbWFfYnJpZGdlX2J1Z2d5PTE7CisJCWlzYV9kbWFfYnJpZGdlX2J1Z2d5ID0gMTsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQWN0aXZhdGluZyBJU0EgRE1BIGhhbmcgd29ya2Fyb3VuZHNcbiIpOwogCX0KIH0KQEAgLTEyMyw3ICsxMjMsNyBAQAogICovCiBzdGF0aWMgdm9pZCBxdWlya19ub3BjaXBjaShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmICgocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKT09MCkgeworCWlmICgocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKSA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkRpc2FibGluZyBkaXJlY3QgUENJL1BDSSB0cmFuc2ZlcnNcbiIpOwogCQlwY2lfcGNpX3Byb2JsZW1zIHw9IFBDSVBDSV9GQUlMOwogCX0KQEAgLTE0OCw3ICsxNDgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBxdWlya190cml0b24oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoKHBjaV9wY2lfcHJvYmxlbXMmUENJUENJX1RSSVRPTik9PTApIHsKKwlpZiAoKHBjaV9wY2lfcHJvYmxlbXMmUENJUENJX1RSSVRPTikgPT0gMCkgewogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJMaW1pdGluZyBkaXJlY3QgUENJL1BDSSB0cmFuc2ZlcnNcbiIpOwogCQlwY2lfcGNpX3Byb2JsZW1zIHw9IFBDSVBDSV9UUklUT047CiAJfQpAQCAtMTYzLDggKzE2Myw4IEBACiAgKglNYWRlIGFjY29yZGluZyB0byBhIHdpbmRvd3MgZHJpdmVyIGJhc2VkIHBhdGNoIGJ5IEdlb3JnZSBFLiBCcmVlc2UKICAqCXNlZSBQQ0kgTGF0ZW5jeSBBZGp1c3Qgb24gaHR0cDovL3d3dy52aWFoYXJkd2FyZS5jb20vZG93bmxvYWQvdmlhdHdlYWsuc2h0bQogICoJYW5kIGh0dHA6Ly93d3cuZ2VvcmdlYnJlZXNlLmNvbS9uZXQvc29mdHdhcmUvI1BDSQotICogICAgICBBbHNvIHNlZSBodHRwOi8vd3d3LmF1LWphLm9yZy9yZXZpZXcta3QxMzNhLTEtZW4ucGh0bWwgZm9yCi0gKiAgICAgIHRoZSBpbmZvIG9uIHdoaWNoIE1yIEJyZWVzZSBiYXNlZCBoaXMgd29yay4KKyAqCUFsc28gc2VlIGh0dHA6Ly93d3cuYXUtamEub3JnL3Jldmlldy1rdDEzM2EtMS1lbi5waHRtbCBmb3IKKyAqCXRoZSBpbmZvIG9uIHdoaWNoIE1yIEJyZWVzZSBiYXNlZCBoaXMgd29yay4KICAqCiAgKglVcGRhdGVkIGJhc2VkIG9uIGZ1cnRoZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2l0ZSBhbmQgYWxzbyBvbgogICoJaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgVklBCkBAIC0xNzcsMTQgKzE3NywxNCBAQAogCSAgIGEgYnVnZ3kgc291dGhicmlkZ2UgKi8KIAogCXAgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2LCBOVUxMKTsKLQlpZiAocCE9TlVMTCkgeworCWlmIChwICE9IE5VTEwpIHsKIAkJLyogMHg0MCAtIDB4NGYgPT0gNjg2QiwgMHgxMCAtIDB4MmYgPT0gNjg2QTsgdGhhbmtzIERhbiBIb2xsaXMgKi8KIAkJLyogQ2hlY2sgZm9yIGJ1Z2d5IHBhcnQgcmV2aXNpb25zICovCiAJCWlmIChwLT5yZXZpc2lvbiA8IDB4NDAgfHwgcC0+cmV2aXNpb24gPiAweDQyKQogCQkJZ290byBleGl0OwogCX0gZWxzZSB7CiAJCXAgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzMSwgTlVMTCk7Ci0JCWlmIChwPT1OVUxMKQkvKiBObyBwcm9ibGVtIHBhcnRzICovCisJCWlmIChwID09IE5VTEwpCS8qIE5vIHByb2JsZW0gcGFydHMgKi8KIAkJCWdvdG8gZXhpdDsKIAkJLyogQ2hlY2sgZm9yIGJ1Z2d5IHBhcnQgcmV2aXNpb25zICovCiAJCWlmIChwLT5yZXZpc2lvbiA8IDB4MTAgfHwgcC0+cmV2aXNpb24gPiAweDEyKQpAQCAtMjI3LDcgKzIyNyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHF1aXJrX3ZpYWV0YmYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoKHBjaV9wY2lfcHJvYmxlbXMmUENJUENJX1ZJQUVUQkYpPT0wKSB7CisJaWYgKChwY2lfcGNpX3Byb2JsZW1zJlBDSVBDSV9WSUFFVEJGKSA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkxpbWl0aW5nIGRpcmVjdCBQQ0kvUENJIHRyYW5zZmVyc1xuIik7CiAJCXBjaV9wY2lfcHJvYmxlbXMgfD0gUENJUENJX1ZJQUVUQkY7CiAJfQpAQCAtMjM2LDcgKzIzNiw3IEBACiAKIHN0YXRpYyB2b2lkIHF1aXJrX3ZzZngoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoKHBjaV9wY2lfcHJvYmxlbXMmUENJUENJX1ZTRlgpPT0wKSB7CisJaWYgKChwY2lfcGNpX3Byb2JsZW1zJlBDSVBDSV9WU0ZYKSA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkxpbWl0aW5nIGRpcmVjdCBQQ0kvUENJIHRyYW5zZmVyc1xuIik7CiAJCXBjaV9wY2lfcHJvYmxlbXMgfD0gUENJUENJX1ZTRlg7CiAJfQpAQCAtMjUxLDcgKzI1MSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHF1aXJrX2FsaW1hZ2lrKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaWYgKChwY2lfcGNpX3Byb2JsZW1zJlBDSVBDSV9BTElNQUdJSyk9PTApIHsKKwlpZiAoKHBjaV9wY2lfcHJvYmxlbXMmUENJUENJX0FMSU1BR0lLKSA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkxpbWl0aW5nIGRpcmVjdCBQQ0kvUENJIHRyYW5zZmVyc1xuIik7CiAJCXBjaV9wY2lfcHJvYmxlbXMgfD0gUENJUENJX0FMSU1BR0lLfFBDSVBDSV9UUklUT047CiAJfQpAQCAtMjY1LDcgKzI2NSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHF1aXJrX25hdG9tYShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmICgocGNpX3BjaV9wcm9ibGVtcyZQQ0lQQ0lfTkFUT01BKT09MCkgeworCWlmICgocGNpX3BjaV9wcm9ibGVtcyZQQ0lQQ0lfTkFUT01BKSA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkxpbWl0aW5nIGRpcmVjdCBQQ0kvUENJIHRyYW5zZmVyc1xuIik7CiAJCXBjaV9wY2lfcHJvYmxlbXMgfD0gUENJUENJX05BVE9NQTsKIAl9CkBAIC0zMTUsOCArMzE1LDcgQEAKIAlpZiAocGNpX3Jlc291cmNlX2xlbihkZXYsIDApICE9IDgpIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVswXTsKIAkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgOCAtIDE7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkNTNTUzNiBJU0EgYnJpZGdlIGJ1ZyBkZXRlY3RlZCAiCi0JCQkJIihpbmNvcnJlY3QgaGVhZGVyKTsgd29ya2Fyb3VuZCBhcHBsaWVkLlxuIik7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkNTNTUzNiBJU0EgYnJpZGdlIGJ1ZyBkZXRlY3RlZCAoaW5jb3JyZWN0IGhlYWRlcik7IHdvcmthcm91bmQgYXBwbGllZFxuIik7CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSVNBLCBxdWlya19jczU1MzZfdnNhKTsKQEAgLTQwMCw3ICszOTksOCBAQAogCSAqIGxldCdzIGdldCBlbm91Z2ggY29uZmlybWF0aW9uIHJlcG9ydHMgZmlyc3QuCiAJICovCiAJYmFzZSAmPSAtc2l6ZTsKLQlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQSU8gYXQgJTA0eC0lMDR4XG4iLCBuYW1lLCBiYXNlLCBiYXNlICsgc2l6ZSAtIDEpOworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBJTyBhdCAlMDR4LSUwNHhcbiIsIG5hbWUsIGJhc2UsCisJCSBiYXNlICsgc2l6ZSAtIDEpOwogfQogCiBzdGF0aWMgdm9pZCBwaWl4NF9tZW1fcXVpcmsoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCBlbmFibGUpCkBAIC00MjUsNyArNDI1LDggQEAKIAkgKiByZXNlcnZlIGl0LCBidXQgbGV0J3MgZ2V0IGVub3VnaCBjb25maXJtYXRpb24gcmVwb3J0cyBmaXJzdC4KIAkgKi8KIAliYXNlICY9IC1zaXplOwotCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIE1NSU8gYXQgJTA0eC0lMDR4XG4iLCBuYW1lLCBiYXNlLCBiYXNlICsgc2l6ZSAtIDEpOworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIE1NSU8gYXQgJTA0eC0lMDR4XG4iLCBuYW1lLCBiYXNlLAorCQkgYmFzZSArIHNpemUgLSAxKTsKIH0KIAogLyoKQEAgLTY2OCw4ICs2NjksNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXUxNiBjb21tYW5kOwogCi0JZGV2X3dhcm4oJmRldi0+ZGV2LCAiVEkgWElPMjAwMGEgcXVpcmsgZGV0ZWN0ZWQ7ICIKLQkJInNlY29uZGFyeSBidXMgZmFzdCBiYWNrLXRvLWJhY2sgdHJhbnNmZXJzIGRpc2FibGVkXG4iKTsKKwlkZXZfd2FybigmZGV2LT5kZXYsICJUSSBYSU8yMDAwYSBxdWlyayBkZXRlY3RlZDsgc2Vjb25kYXJ5IGJ1cyBmYXN0IGJhY2stdG8tYmFjayB0cmFuc2ZlcnMgZGlzYWJsZWRcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGRldiwgJmRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CiAJCWlmIChjb21tYW5kICYgUENJX0NPTU1BTkRfRkFTVF9CQUNLKQpAQCAtNzAzLDcgKzcwMyw3IEBACiAJICAgICAgIHRtcCA9PSAwID8gIkRpc2EiIDogIkVuYSIpOwogCiAJLyogT2Zmc2V0IDB4NTg6IEV4dGVybmFsIEFQSUMgSVJRIG91dHB1dCBjb250cm9sICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChkZXYsIDB4NTgsIHRtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1OCwgdG1wKTsKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODYsCXF1aXJrX3ZpYV9pb2FwaWMpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODYsCXF1aXJrX3ZpYV9pb2FwaWMpOwpAQCAtNzYxLDggKzc2MSw4IEBACiBzdGF0aWMgdm9pZCBxdWlya19hbWRfODEzMV9tbXJiYyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWlmIChkZXYtPnN1Ym9yZGluYXRlICYmIGRldi0+cmV2aXNpb24gPD0gMHgxMikgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJBTUQ4MTMxIHJldiAleCBkZXRlY3RlZDsgIgotCQkJImRpc2FibGluZyBQQ0ktWCBNTVJCQ1xuIiwgZGV2LT5yZXZpc2lvbik7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkFNRDgxMzEgcmV2ICV4IGRldGVjdGVkOyBkaXNhYmxpbmcgUENJLVggTU1SQkNcbiIsCisJCQkgZGV2LT5yZXZpc2lvbik7CiAJCWRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyB8PSBQQ0lfQlVTX0ZMQUdTX05PX01NUkJDOwogCX0KIH0KQEAgLTkxNiwxMiArOTE2LDEyIEBACiB7CiAJdTMyIHBjaWM7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0QywgJnBjaWMpOwotCWlmICgocGNpYyY2KSE9NikgeworCWlmICgocGNpYyAmIDYpICE9IDYpIHsKIAkJcGNpYyB8PSA2OwogCQlkZXZfd2FybigmZGV2LT5kZXYsICJCSU9TIGZhaWxlZCB0byBlbmFibGUgUENJIHN0YW5kYXJkcyBjb21wbGlhbmNlOyBmaXhpbmcgdGhpcyBlcnJvclxuIik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDRDLCBwY2ljKTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg4NCwgJnBjaWMpOwotCQlwY2ljIHw9ICgxPDwyMyk7CS8qIFJlcXVpcmVkIGluIHRoaXMgbW9kZSAqLworCQlwY2ljIHw9ICgxIDw8IDIzKTsJLyogUmVxdWlyZWQgaW4gdGhpcyBtb2RlICovCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDg0LCBwY2ljKTsKIAl9CiB9CkBAIC05MzcsNyArOTM3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcXVpcmtfZHVub3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2UgWzFdOworCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlWzFdOwogCiAJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlyLT5zdGFydCA9IDA7CkBAIC05NjcsMTEgKzk2NywxMyBAQAogc3RhdGljIHZvaWQgcXVpcmtfbWVkaWFneF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCByZWc7CisKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDEsICZyZWcpOwogCWlmIChyZWcgJiAyKSB7CiAJCXJlZyAmPSB+MjsKLQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiRml4dXAgZm9yIE1lZGlhR1gvR2VvZGUgU2xhdmUgRGlzY29ubmVjdCBCb3VuZGFyeSAoMHg0MT0weCUwMngpXG4iLCByZWcpOwotICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDEsIHJlZyk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkZpeHVwIGZvciBNZWRpYUdYL0dlb2RlIFNsYXZlIERpc2Nvbm5lY3QgQm91bmRhcnkgKDB4NDE9MHglMDJ4KVxuIiwKKwkJCSByZWcpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQxLCByZWcpOwogCX0KIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQ1lSSVgsCVBDSV9ERVZJQ0VfSURfQ1lSSVhfUENJX01BU1RFUiwgcXVpcmtfbWVkaWFneF9tYXN0ZXIpOwpAQCAtMTEyMCw3ICsxMTIyLDcgQEAKIHsKIAlpZiAodW5saWtlbHkoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVNVU1RFSykpIHsKIAkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIpCi0JCQlzd2l0Y2goZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQlzd2l0Y2ggKGRldi0+c3Vic3lzdGVtX2RldmljZSkgewogCQkJY2FzZSAweDgwMjU6IC8qIFA0Qi1MWCAqLwogCQkJY2FzZSAweDgwNzA6IC8qIFA0QiAqLwogCQkJY2FzZSAweDgwODg6IC8qIFA0QjUzMyAqLwpAQCAtMTEyOCwxNCArMTEzMCwxNCBAQAogCQkJCWFzdXNfaGlkZXNfc21idXMgPSAxOwogCQkJfQogCQllbHNlIGlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQikKLQkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCXN3aXRjaCAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CiAJCQljYXNlIDB4ODBiMTogLyogUDRHRS1WICovCiAJCQljYXNlIDB4ODBiMjogLyogUDRQRSAqLwogCQkJY2FzZSAweDgwOTM6IC8qIFA0QjUzMy1WICovCiAJCQkJYXN1c19oaWRlc19zbWJ1cyA9IDE7CiAJCQl9CiAJCWVsc2UgaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTBfSEIpCi0JCQlzd2l0Y2goZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQlzd2l0Y2ggKGRldi0+c3Vic3lzdGVtX2RldmljZSkgewogCQkJY2FzZSAweDgwMzA6IC8qIFA0VDUzMyAqLwogCQkJCWFzdXNfaGlkZXNfc21idXMgPSAxOwogCQkJfQpAQCAtMTE3NSw3ICsxMTc3LDcgQEAKIAkJCX0KIAl9IGVsc2UgaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0hQKSkgewogCQlpZiAoZGV2LT5kZXZpY2UgPT0gIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQikKLQkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCXN3aXRjaCAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CiAJCQljYXNlIDB4MDg4QzogLyogSFAgQ29tcGFxIG5jODAwMCAqLwogCQkJY2FzZSAweDA4OTA6IC8qIEhQIENvbXBhcSBuYzYwMDAgKi8KIAkJCQlhc3VzX2hpZGVzX3NtYnVzID0gMTsKQEAgLTExOTIsMjAgKzExOTQsMjAgQEAKIAkJCWNhc2UgMHgxMmJmOiAvKiBIUCB4dzQxMDAgKi8KIAkJCQlhc3VzX2hpZGVzX3NtYnVzID0gMTsKIAkJCX0KLSAgICAgICB9IGVsc2UgaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NBTVNVTkcpKSB7Ci0gICAgICAgICAgICAgICBpZiAoZGV2LT5kZXZpY2UgPT0gIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQikKLSAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRldi0+c3Vic3lzdGVtX2RldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4QzAwQzogLyogU2Ftc3VuZyBQMzUgbm90ZWJvb2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3VzX2hpZGVzX3NtYnVzID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQorCX0gZWxzZSBpZiAodW5saWtlbHkoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0FNU1VORykpIHsKKwkJaWYgKGRldi0+ZGV2aWNlID09ICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIpCisJCQlzd2l0Y2ggKGRldi0+c3Vic3lzdGVtX2RldmljZSkgeworCQkJY2FzZSAweEMwMEM6IC8qIFNhbXN1bmcgUDM1IG5vdGVib29rICovCisJCQkJYXN1c19oaWRlc19zbWJ1cyA9IDE7CisJCX0KIAl9IGVsc2UgaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkpIHsKIAkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQikKLQkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCXN3aXRjaCAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CiAJCQljYXNlIDB4MDA1ODogLyogQ29tcGFxIEV2byBONjIwYyAqLwogCQkJCWFzdXNfaGlkZXNfc21idXMgPSAxOwogCQkJfQogCQllbHNlIGlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX0lHMykKLQkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCXN3aXRjaCAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CiAJCQljYXNlIDB4QjE2QzogLyogQ29tcGFxIERlc2twcm8gRVAgNDAxOTYzLTAwMSAoUENBIyAwMTAxNzQpICovCiAJCQkJLyogTW90aGVyYm9hcmQgZG9lc24ndCBoYXZlIEhvc3QgYnJpZGdlCiAJCQkJICogc3VidmVuZG9yL3N1YmRldmljZSBJRHMsIHRoZXJlZm9yZSBjaGVja2luZwpAQCAtMTIxMyw3ICsxMjE1LDcgQEAKIAkJCQlhc3VzX2hpZGVzX3NtYnVzID0gMTsKIAkJCX0KIAkJZWxzZSBpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzIpCi0JCQlzd2l0Y2goZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQlzd2l0Y2ggKGRldi0+c3Vic3lzdGVtX2RldmljZSkgewogCQkJY2FzZSAweDAwYjg6IC8qIENvbXBhcSBFdm8gRDUxMCBDTVQgKi8KIAkJCWNhc2UgMHgwMGI5OiAvKiBDb21wYXEgRXZvIEQ1MTAgU0ZGICovCiAJCQljYXNlIDB4MDBiYTogLyogQ29tcGFxIEV2byBENTEwIFVTRFQgKi8KQEAgLTEyNjEsNyArMTI2Myw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4RjIsIHZhbCAmICh+MHg4KSk7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHhGMiwgJnZhbCk7CiAJCWlmICh2YWwgJiAweDgpCi0JCQlkZXZfaW5mbygmZGV2LT5kZXYsICJpODAxIFNNQnVzIGRldmljZSBjb250aW51ZXMgdG8gcGxheSAnaGlkZSBhbmQgc2VlaychIDB4JXhcbiIsIHZhbCk7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJpODAxIFNNQnVzIGRldmljZSBjb250aW51ZXMgdG8gcGxheSAnaGlkZSBhbmQgc2VlaychIDB4JXhcbiIsCisJCQkJIHZhbCk7CiAJCWVsc2UKIAkJCWRldl9pbmZvKCZkZXYtPmRldiwgIkVuYWJsZWQgaTgwMSBTTUJ1cyBkZXZpY2VcbiIpOwogCX0KQEAgLTE0MDksNyArMTQxMiw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIHZhbCAmICh+MHhjMCkpOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTAsICZ2YWwpOwogCQlpZiAodmFsICYgMHhjMCkKLQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIk9uYm9hcmQgQUM5Ny9NQzk3IGRldmljZXMgY29udGludWUgdG8gcGxheSAnaGlkZSBhbmQgc2VlaychIDB4JXhcbiIsIHZhbCk7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJPbmJvYXJkIEFDOTcvTUM5NyBkZXZpY2VzIGNvbnRpbnVlIHRvIHBsYXkgJ2hpZGUgYW5kIHNlZWsnISAweCV4XG4iLAorCQkJCSB2YWwpOwogCQllbHNlCiAJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJFbmFibGVkIG9uYm9hcmQgQUM5Ny9NQzk3IGRldmljZXNcbiIpOwogCX0KQEAgLTE1MTQsMTAgKzE1MTgsOCBAQAogCiAJLyogVGhlIG5leHQgZml2ZSBCQVJzIGFsbCBzZWVtIHRvIGJlIHJ1YmJpc2gsIHNvIGp1c3QgY2xlYW4KIAkgKiB0aGVtIG91dCAqLwotCWZvciAoaT0xOyBpIDwgNjsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKIAkJbWVtc2V0KCZwZGV2LT5yZXNvdXJjZVtpXSwgMCwgc2l6ZW9mKHBkZXYtPnJlc291cmNlW2ldKSk7Ci0JfQotCiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9FRVNTQywJcXVpcmtfYWxkZXJfaW9hcGljKTsKICNlbmRpZgpAQCAtMTU1Miw3ICsxNTU0LDcgQEAKICAqIFNvbWUgSW50ZWwgUENJIEV4cHJlc3MgY2hpcHNldHMgaGF2ZSB0cm91YmxlIHdpdGggZG93bnN0cmVhbQogICogZGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQuCiAgKi8KLXN0YXRpYyB2b2lkIHF1aXJrX2ludGVsX3BjaWVfcG0oc3RydWN0IHBjaV9kZXYgKiBkZXYpCitzdGF0aWMgdm9pZCBxdWlya19pbnRlbF9wY2llX3BtKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJcGNpX3BtX2QzX2RlbGF5ID0gMTIwOwogCWRldi0+bm9fZDFkMiA9IDE7CkBAIC0xNzIxLDggKzE3MjMsOCBAQAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBBTURfODExMV9QQ0lfSVJRX1JPVVRJTkcsICZwY2lfY29uZmlnX3dvcmQpOwogCWlmICghcGNpX2NvbmZpZ193b3JkKSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgImJvb3QgaW50ZXJydXB0cyBvbiBkZXZpY2UgWyUwNHg6JTA0eF0gIgotCQkJICJhbHJlYWR5IGRpc2FibGVkXG4iLCBkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJib290IGludGVycnVwdHMgb24gZGV2aWNlIFslMDR4OiUwNHhdIGFscmVhZHkgZGlzYWJsZWRcbiIsCisJCQkgZGV2LT52ZW5kb3IsIGRldi0+ZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBBTURfODExMV9QQ0lfSVJRX1JPVVRJTkcsIDApOwpAQCAtMTc3MCw4ICsxNzcyLDcgQEAKIAkJaWYgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpID09IDB4ODAgJiYKIAkJICAgIChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBiYXIpICYgMHg4MCkpIHsKIAkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2Jhcl07Ci0JCQlkZXZfaW5mbygmZGV2LT5kZXYsCi0JCQkJICJSZS1hbGxvY2F0aW5nIFBMWCBQQ0kgOTA1MCBCQVIgJXUgdG8gbGVuZ3RoIDI1NiB0byBhdm9pZCBiaXQgNyBidWdcbiIsCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJSZS1hbGxvY2F0aW5nIFBMWCBQQ0kgOTA1MCBCQVIgJXUgdG8gbGVuZ3RoIDI1NiB0byBhdm9pZCBiaXQgNyBidWdcbiIsCiAJCQkJIGJhcik7CiAJCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQkJci0+c3RhcnQgPSAwOwpAQCAtMTgxOCw5ICsxODE5LDcgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfTkVUTU9TXzk4NDU6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX05FVE1PU185ODU1OgogCQlpZiAobnVtX3BhcmFsbGVsKSB7Ci0JCQlkZXZfaW5mbygmZGV2LT5kZXYsICJOZXRtb3MgJTA0eCAoJXUgcGFyYWxsZWwsICIKLQkJCQkiJXUgc2VyaWFsKTsgY2hhbmdpbmcgY2xhc3MgU0VSSUFMIHRvIE9USEVSICIKLQkJCQkiKHVzZSBwYXJwb3J0X3NlcmlhbClcbiIsCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJOZXRtb3MgJTA0eCAoJXUgcGFyYWxsZWwsICV1IHNlcmlhbCk7IGNoYW5naW5nIGNsYXNzIFNFUklBTCB0byBPVEhFUiAodXNlIHBhcnBvcnRfc2VyaWFsKVxuIiwKIAkJCQlkZXYtPmRldmljZSwgbnVtX3BhcmFsbGVsLCBudW1fc2VyaWFsKTsKIAkJCWRldi0+Y2xhc3MgPSAoUENJX0NMQVNTX0NPTU1VTklDQVRJT05fT1RIRVIgPDwgOCkgfAogCQkJICAgIChkZXYtPmNsYXNzICYgMHhmZik7CkBAIC0xODg3LDggKzE4ODYsNyBAQAogCiAJY21kX2hpID0gcmVhZGIoY3NyICsgMyk7CiAJaWYgKGNtZF9oaSA9PSAwKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgIkZpcm13YXJlIGxlZnQgZTEwMCBpbnRlcnJ1cHRzIGVuYWJsZWQ7ICIKLQkJCSJkaXNhYmxpbmdcbiIpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICJGaXJtd2FyZSBsZWZ0IGUxMDAgaW50ZXJydXB0cyBlbmFibGVkOyBkaXNhYmxpbmdcbiIpOwogCQl3cml0ZWIoMSwgY3NyICsgMyk7CiAJfQogCkBAIC0xOTU4LDggKzE5NTYsNyBAQAogCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ZjQxLCAmYikgPT0gMCkgewogCQlpZiAoIShiICYgMHgyMCkpIHsKIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZjQxLCBiIHwgMHgyMCk7Ci0JCQlkZXZfaW5mbygmZGV2LT5kZXYsCi0JCQkgICAgICAgIkxpbmtpbmcgQUVSIGV4dGVuZGVkIGNhcGFiaWxpdHlcbiIpOworCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiTGlua2luZyBBRVIgZXh0ZW5kZWQgY2FwYWJpbGl0eVxuIik7CiAJCX0KIAl9CiB9CkBAIC0xOTk3LDggKzE5OTQsNyBAQAogCQkJLyogVHVybiBvZmYgUENJIEJ1cyBQYXJraW5nICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDc2LCBiIF4gMHg0MCk7CiAKLQkJCWRldl9pbmZvKCZkZXYtPmRldiwKLQkJCQkiRGlzYWJsaW5nIFZJQSBDWDcwMCBQQ0kgcGFya2luZ1xuIik7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJEaXNhYmxpbmcgVklBIENYNzAwIFBDSSBwYXJraW5nXG4iKTsKIAkJfQogCX0KIApAQCAtMjAxMyw4ICsyMDA5LDcgQEAKIAkJCS8qIERpc2FibGUgIlJlYWQgRklGTyBUaW1lciIgKi8KIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NzcsIDB4MCk7CiAKLQkJCWRldl9pbmZvKCZkZXYtPmRldiwKLQkJCQkiRGlzYWJsaW5nIFZJQSBDWDcwMCBQQ0kgY2FjaGluZ1xuIik7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJEaXNhYmxpbmcgVklBIENYNzAwIFBDSSBjYWNoaW5nXG4iKTsKIAkJfQogCX0KIH0KQEAgLTIxNDksOCArMjE0NCw3IEBACiBzdGF0aWMgdm9pZCBxdWlya19kaXNhYmxlX21zaShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgIk1TSSBxdWlyayBkZXRlY3RlZDsgIgotCQkJInN1Ym9yZGluYXRlIE1TSSBkaXNhYmxlZFxuIik7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIk1TSSBxdWlyayBkZXRlY3RlZDsgc3Vib3JkaW5hdGUgTVNJIGRpc2FibGVkXG4iKTsKIAkJZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzIHw9IFBDSV9CVVNfRkxBR1NfTk9fTVNJOwogCX0KIH0KQEAgLTIxODksOCArMjE4Myw3IEBACiAJCXU4IGZsYWdzOwogCiAJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHBvcyArIEhUX01TSV9GTEFHUywKLQkJCQkJICZmbGFncykgPT0gMCkKLQkJeworCQkJCQkgJmZsYWdzKSA9PSAwKSB7CiAJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJGb3VuZCAlcyBIVCBNU0kgTWFwcGluZ1xuIiwKIAkJCQlmbGFncyAmIEhUX01TSV9GTEFHU19FTkFCTEUgPwogCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwpAQCAtMjIwNyw4ICsyMjAwLDcgQEAKIHN0YXRpYyB2b2lkIHF1aXJrX21zaV9odF9jYXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpZiAoZGV2LT5zdWJvcmRpbmF0ZSAmJiAhbXNpX2h0X2NhcF9lbmFibGVkKGRldikpIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiTVNJIHF1aXJrIGRldGVjdGVkOyAiCi0JCQkic3Vib3JkaW5hdGUgTVNJIGRpc2FibGVkXG4iKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiTVNJIHF1aXJrIGRldGVjdGVkOyBzdWJvcmRpbmF0ZSBNU0kgZGlzYWJsZWRcbiIpOwogCQlkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7CiAJfQogfQpAQCAtMjIzMiw4ICsyMjI0LDcgQEAKIAlpZiAoIXBkZXYpCiAJCXJldHVybjsKIAlpZiAoIW1zaV9odF9jYXBfZW5hYmxlZChkZXYpICYmICFtc2lfaHRfY2FwX2VuYWJsZWQocGRldikpIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiTVNJIHF1aXJrIGRldGVjdGVkOyAiCi0JCQkic3Vib3JkaW5hdGUgTVNJIGRpc2FibGVkXG4iKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiTVNJIHF1aXJrIGRldGVjdGVkOyBzdWJvcmRpbmF0ZSBNU0kgZGlzYWJsZWRcbiIpOwogCQlkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7CiAJfQogCXBjaV9kZXZfcHV0KHBkZXYpOwpAQCAtMjI3OSw4ICsyMjcwLDcgQEAKIAlpZiAoYm9hcmRfbmFtZSAmJgogCSAgICAoc3Ryc3RyKGJvYXJkX25hbWUsICJQNU4zMi1TTEkgUFJFTUlVTSIpIHx8CiAJICAgICBzdHJzdHIoYm9hcmRfbmFtZSwgIlA1TjMyLUUgU0xJIikpKSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwKLQkJCSAiRGlzYWJsaW5nIG1zaSBmb3IgTUNQNTUgTklDIG9uIFA1TjMyLVNMSVxuIik7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkRpc2FibGluZyBtc2kgZm9yIE1DUDU1IE5JQyBvbiBQNU4zMi1TTElcbiIpOwogCQlkZXYtPm5vX21zaSA9IDE7CiAJfQogfQpAQCAtMjQ4OSw4ICsyNDc5LDcgQEAKIAkgKi8KIAlob3N0X2JyaWRnZSA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIFBDSV9ERVZGTigwLCAwKSk7CiAJaWYgKGhvc3RfYnJpZGdlID09IE5VTEwpIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LAotCQkJICJudl9tc2lfaHRfY2FwX3F1aXJrIGRpZG4ndCBsb2NhdGUgaG9zdCBicmlkZ2VcbiIpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICJudl9tc2lfaHRfY2FwX3F1aXJrIGRpZG4ndCBsb2NhdGUgaG9zdCBicmlkZ2VcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yODE3LDggKzI4MDYsNyBAQAogCSAqLwogCWVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0OCwgJnJjYyk7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgcmVhZCAiCi0JCQkiY29tcGxldGlvbiBjb2FsZXNjaW5nIHJlZ2lzdGVyLlxuIik7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgYXR0ZW1wdGluZyB0byByZWFkIHRoZSByZWFkIGNvbXBsZXRpb24gY29hbGVzY2luZyByZWdpc3RlclxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI4MjksMTMgKzI4MTcsMTEgQEAKIAogCWVyciA9IHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NDgsIHJjYyk7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIHJlYWQgIgotCQkJImNvbXBsZXRpb24gY29hbGVzY2luZyByZWdpc3Rlci5cbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIHJlYWQgY29tcGxldGlvbiBjb2FsZXNjaW5nIHJlZ2lzdGVyXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXByX2luZm9fb25jZSgiUmVhZCBjb21wbGV0aW9uIGNvYWxlc2NpbmcgZGlzYWJsZWQgZHVlIHRvIGhhcmR3YXJlICIKLQkJICAgICAiZXJyYXRhIHJlbGF0aW5nIHRvIDI1NkIgTVBTLlxuIik7CisJcHJfaW5mb19vbmNlKCJSZWFkIGNvbXBsZXRpb24gY29hbGVzY2luZyBkaXNhYmxlZCBkdWUgdG8gaGFyZHdhcmUgZXJyYXRhIHJlbGF0aW5nIHRvIDI1NkIgTVBTXG4iKTsKIH0KIC8qIEludGVsIDUwMDAgc2VyaWVzIG1lbW9yeSBjb250cm9sbGVycyBhbmQgcG9ydHMgMi03ICovCiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWMwLCBxdWlya19pbnRlbF9tY19lcnJhdGEpOwpAQCAtMjk0NCw4ICsyOTMwLDcgQEAKIAogCS8qIENoZWNrIGlmIGFueSBpbnRlcnJ1cHQgbGluZSBpcyBzdGlsbCBlbmFibGVkICovCiAJaWYgKHJlYWRsKHJlZ3MgKyBJOTE1X0RFSUVSX1JFRykgIT0gMCkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJCSU9TIGxlZnQgSW50ZWwgR1BVIGludGVycnVwdHMgZW5hYmxlZDsgIgotCQkJImRpc2FibGluZ1xuIik7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIkJJT1MgbGVmdCBJbnRlbCBHUFUgaW50ZXJydXB0cyBlbmFibGVkOyBkaXNhYmxpbmdcbiIpOwogCiAJCXdyaXRlbCgwLCByZWdzICsgSTkxNV9ERUlFUl9SRUcpOwogCX0KQEAgLTMwNDAsNyArMzAyNSw3IEBACiB7CiAJc3RydWN0IHBjaV9maXh1cCAqc3RhcnQsICplbmQ7CiAKLQlzd2l0Y2gocGFzcykgeworCXN3aXRjaCAocGFzcykgewogCWNhc2UgcGNpX2ZpeHVwX2Vhcmx5OgogCQlzdGFydCA9IF9fc3RhcnRfcGNpX2ZpeHVwc19lYXJseTsKIAkJZW5kID0gX19lbmRfcGNpX2ZpeHVwc19lYXJseTsKQEAgLTMxMTIsOCArMzA5Nyw4IEBACiAJCQlpZiAoIXRtcCB8fCBjbHMgPT0gdG1wKQogCQkJCWNvbnRpbnVlOwogCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBDTFMgbWlzbWF0Y2ggKCV1ICE9ICV1KSwgIgotCQkJICAgICAgICJ1c2luZyAldSBieXRlc1xuIiwgY2xzIDw8IDIsIHRtcCA8PCAyLAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTIG1pc21hdGNoICgldSAhPSAldSksIHVzaW5nICV1IGJ5dGVzXG4iLAorCQkJICAgICAgIGNscyA8PCAyLCB0bXAgPDwgMiwKIAkJCSAgICAgICBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKIAkJCXBjaV9jYWNoZV9saW5lX3NpemUgPSBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZTsKIAkJfQpAQCAtMzM0Miw2ICszMzI3LDg1IEBACiAJcmV0dXJuIC1FTk9UVFk7CiB9CiAKK3N0YXRpYyB2b2lkIHF1aXJrX2RtYV9mdW5jMF9hbGlhcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAwKSB7CisJCWRldi0+ZG1hX2FsaWFzX2RldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCAwKTsKKwkJZGV2LT5kZXZfZmxhZ3MgfD0gUENJX0RFVl9GTEFHU19ETUFfQUxJQVNfREVWRk47CisJfQorfQorCisvKgorICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD02MDU4ODgKKyAqCisgKiBTb21lIFJpY29oIGRldmljZXMgdXNlIGZ1bmN0aW9uIDAgYXMgdGhlIFBDSWUgcmVxdWVzdGVyIElEIGZvciBETUEuCisgKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1JJQ09ILCAweGU4MzIsIHF1aXJrX2RtYV9mdW5jMF9hbGlhcyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9SSUNPSCwgMHhlNDc2LCBxdWlya19kbWFfZnVuYzBfYWxpYXMpOworCitzdGF0aWMgdm9pZCBxdWlya19kbWFfZnVuYzFfYWxpYXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikgIT0gMSkgeworCQlkZXYtPmRtYV9hbGlhc19kZXZmbiA9IFBDSV9ERVZGTihQQ0lfU0xPVChkZXYtPmRldmZuKSwgMSk7CisJCWRldi0+ZGV2X2ZsYWdzIHw9IFBDSV9ERVZfRkxBR1NfRE1BX0FMSUFTX0RFVkZOOworCX0KK30KKworLyoKKyAqIE1hcnZlbGwgODhTRTkxMjMgdXNlcyBmdW5jdGlvbiAxIGFzIHRoZSByZXF1ZXN0ZXIgSUQgZm9yIERNQS4gIEluIHNvbWUKKyAqIFNLVXMgZnVuY3Rpb24gMSBpcyBwcmVzZW50IGFuZCBpcyBhIGxlZ2FjeSBJREUgY29udHJvbGxlciwgaW4gb3RoZXIKKyAqIFNLVXMgdGhpcyBmdW5jdGlvbiBpcyBub3QgcHJlc2VudCwgbWFraW5nIHRoaXMgYSBnaG9zdCByZXF1ZXN0ZXIuCisgKiBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQyNjc5CisgKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX01BUlZFTExfRVhULCAweDkxMjMsCisJCQkgcXVpcmtfZG1hX2Z1bmMxX2FsaWFzKTsKKy8qIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI2NzkjYzE0ICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9NQVJWRUxMX0VYVCwgMHg5MTMwLAorCQkJIHF1aXJrX2RtYV9mdW5jMV9hbGlhcyk7CisvKiBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQyNjc5I2M0NyArIGM1NyAqLworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTUFSVkVMTF9FWFQsIDB4OTE3MiwKKwkJCSBxdWlya19kbWFfZnVuYzFfYWxpYXMpOworLyogaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD00MjY3OSNjNTkgKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX01BUlZFTExfRVhULCAweDkxN2EsCisJCQkgcXVpcmtfZG1hX2Z1bmMxX2FsaWFzKTsKKy8qIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI2NzkjYzQ2ICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9NQVJWRUxMX0VYVCwgMHg5MWEwLAorCQkJIHF1aXJrX2RtYV9mdW5jMV9hbGlhcyk7CisvKiBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQyNjc5I2M0OSAqLworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTUFSVkVMTF9FWFQsIDB4OTIzMCwKKwkJCSBxdWlya19kbWFfZnVuYzFfYWxpYXMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVFRJLCAweDA2NDIsCisJCQkgcXVpcmtfZG1hX2Z1bmMxX2FsaWFzKTsKKy8qIGh0dHBzOi8vYnVncy5nZW50b28ub3JnL3Nob3dfYnVnLmNnaT9pZD00OTc2MzAgKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0pNSUNST04sCisJCQkgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QsCisJCQkgcXVpcmtfZG1hX2Z1bmMxX2FsaWFzKTsKKworLyoKKyAqIEEgZmV3IFBDSWUtdG8tUENJIGJyaWRnZXMgZmFpbCB0byBleHBvc2UgYSBQQ0llIGNhcGFiaWxpdHksIHJlc3VsdGluZyBpbgorICogdXNpbmcgdGhlIHdyb25nIERNQSBhbGlhcyBmb3IgdGhlIGRldmljZS4gIFNvbWUgb2YgdGhlc2UgZGV2aWNlcyBjYW4gYmUKKyAqIHVzZWQgYXMgZWl0aGVyIGZvcndhcmQgb3IgcmV2ZXJzZSBicmlkZ2VzLCBzbyB3ZSBuZWVkIHRvIHRlc3Qgd2hldGhlciB0aGUKKyAqIGRldmljZSBpcyBvcGVyYXRpbmcgaW4gdGhlIGNvcnJlY3QgbW9kZS4gIFdlIGNvdWxkIHByb2JhYmx5IGFwcGx5IHRoaXMKKyAqIHF1aXJrIHRvIFBDSV9BTllfSUQsIGJ1dCBmb3Igbm93IHdlJ2xsIGp1c3QgdXNlIGtub3duIG9mZmVuZGVycy4gIFRoZSB0ZXN0CisgKiBpcyBmb3IgYSBub24tcm9vdCwgbm9uLVBDSWUgYnJpZGdlIHdoZXJlIHRoZSB1cHN0cmVhbSBkZXZpY2UgaXMgUENJZSBhbmQKKyAqIGlzIG5vdCBhIFBDSWUtdG8tUENJIGJyaWRnZSwgdGhlbiBAcGRldiBpcyBhY3R1YWxseSBhIFBDSWUtdG8tUENJIGJyaWRnZS4KKyAqLworc3RhdGljIHZvaWQgcXVpcmtfdXNlX3BjaWVfYnJpZGdlX2RtYV9hbGlhcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAoIXBjaV9pc19yb290X2J1cyhwZGV2LT5idXMpICYmCisJICAgIHBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgJiYKKwkgICAgIXBjaV9pc19wY2llKHBkZXYpICYmIHBjaV9pc19wY2llKHBkZXYtPmJ1cy0+c2VsZikgJiYKKwkgICAgcGNpX3BjaWVfdHlwZShwZGV2LT5idXMtPnNlbGYpICE9IFBDSV9FWFBfVFlQRV9QQ0lfQlJJREdFKQorCQlwZGV2LT5kZXZfZmxhZ3MgfD0gUENJX0RFVl9GTEFHX1BDSUVfQlJJREdFX0FMSUFTOworfQorLyogQVNNMTA4My8xMDg1LCBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0ODgxI2M0NiAqLworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQVNNRURJQSwgMHgxMDgwLAorCQkJIHF1aXJrX3VzZV9wY2llX2JyaWRnZV9kbWFfYWxpYXMpOworLyogVHVuZHJhIDgxMTMsIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ4ODEjYzQzICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxMGUzLCAweDgxMTMsIHF1aXJrX3VzZV9wY2llX2JyaWRnZV9kbWFfYWxpYXMpOworLyogSVRFIDg4OTIsIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NTEgKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDEyODMsIDB4ODg5MiwgcXVpcmtfdXNlX3BjaWVfYnJpZGdlX2RtYV9hbGlhcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Z1bmNfMF9kbWFfc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaWYgKCFQQ0lfRlVOQyhkZXYtPmRldmZuKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3JvbS5jIGIvZHJpdmVycy9wY2kvcm9tLmMKaW5kZXggYzE4Mzk0NS4uZjk1NWVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcm9tLmMKKysrIGIvZHJpdmVycy9wY2kvcm9tLmMKQEAgLTM4LDYgKzM4LDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX2FkZHIpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2VuYWJsZV9yb20pOwogCiAvKioKICAqIHBjaV9kaXNhYmxlX3JvbSAtIGRpc2FibGUgUk9NIGRlY29kaW5nIGZvciBhIFBDSSBkZXZpY2UKQEAgLTUzLDYgKzU0LDcgQEAKIAlyb21fYWRkciAmPSB+UENJX1JPTV9BRERSRVNTX0VOQUJMRTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX2FkZHIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2Rpc2FibGVfcm9tKTsKIAogLyoqCiAgKiBwY2lfZ2V0X3JvbV9zaXplIC0gb2J0YWluIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgUk9NIGltYWdlCkBAIC0xMzUsNyArMTM3LDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGFzc2lnbiB0aGUgUk9NIGFuIGFkZHJlc3MgaWYgaXQgZG9lc24ndCBoYXZlIG9uZSAqLwogCQkJaWYgKHJlcy0+cGFyZW50ID09IE5VTEwgJiYKLQkJCSAgICBwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsUENJX1JPTV9SRVNPVVJDRSkpCisJCQkgICAgcGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSkKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpOwogCQkJKnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpOwpAQCAtMTY2LDYgKzE2OCw3IEBACiAJKnNpemUgPSBwY2lfZ2V0X3JvbV9zaXplKHBkZXYsIHJvbSwgKnNpemUpOwogCXJldHVybiByb207CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9tYXBfcm9tKTsKIAogLyoqCiAgKiBwY2lfdW5tYXBfcm9tIC0gdW5tYXAgdGhlIFJPTSBmcm9tIGtlcm5lbCBzcGFjZQpAQCAtMTg3LDYgKzE5MCw3IEBACiAJaWYgKCEocmVzLT5mbGFncyAmIChJT1JFU09VUkNFX1JPTV9FTkFCTEUgfCBJT1JFU09VUkNFX1JPTV9TSEFET1cpKSkKIAkJcGNpX2Rpc2FibGVfcm9tKHBkZXYpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfcm9tKTsKIAogLyoqCiAgKiBwY2lfY2xlYW51cF9yb20gLSBmcmVlIHRoZSBST00gY29weSBjcmVhdGVkIGJ5IHBjaV9tYXBfcm9tX2NvcHkKQEAgLTE5OSw3ICsyMDMsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9DT1BZKSB7Ci0JCWtmcmVlKCh2b2lkKikodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0KTsKKwkJa2ZyZWUoKHZvaWQgKikodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0KTsKIAkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1JPTV9DT1BZOwogCQlyZXMtPnN0YXJ0ID0gMDsKQEAgLTIyMiw5ICsyMjYsNCBAQAogCiAJcmV0dXJuIE5VTEw7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocGNpX21hcF9yb20pOwotRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfcm9tKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHBjaV9lbmFibGVfcm9tKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHBjaV9kaXNhYmxlX3JvbSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9wbGF0Zm9ybV9yb20pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCA4ZTQ5NWJkLi44MjdhZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMTcsMTQgKzE3LDEwMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocGNpX2J1c19zZW0pOwogCiAvKgorICogcGNpX2Zvcl9lYWNoX2RtYV9hbGlhcyAtIEl0ZXJhdGUgb3ZlciBETUEgYWxpYXNlcyBmb3IgYSBkZXZpY2UKKyAqIEBwZGV2OiBzdGFydGluZyBkb3duc3RyZWFtIGRldmljZQorICogQGZuOiBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGFsaWFzCisgKiBAZGF0YTogb3BhcXVlIGRhdGEgdG8gcGFzcyB0byBAZm4KKyAqCisgKiBTdGFydGluZyBAcGRldiwgd2FsayB1cCB0aGUgYnVzIGNhbGxpbmcgQGZuIGZvciBlYWNoIHBvc3NpYmxlIGFsaWFzCisgKiBvZiBAcGRldiBhdCB0aGUgcm9vdCBidXMuCisgKi8KK2ludCBwY2lfZm9yX2VhY2hfZG1hX2FsaWFzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgaW50ICgqZm4pKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgdTE2IGFsaWFzLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWludCByZXQ7CisKKwlyZXQgPSBmbihwZGV2LCBQQ0lfREVWSUQocGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKSwgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBicm9rZW4gYW5kIHVzZXMgYW4gYWxpYXMgcmVxdWVzdGVyIElEIGZvcgorCSAqIERNQSwgaXRlcmF0ZSBvdmVyIHRoYXQgdG9vLgorCSAqLworCWlmICh1bmxpa2VseShwZGV2LT5kZXZfZmxhZ3MgJiBQQ0lfREVWX0ZMQUdTX0RNQV9BTElBU19ERVZGTikpIHsKKwkJcmV0ID0gZm4ocGRldiwgUENJX0RFVklEKHBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCQkgcGRldi0+ZG1hX2FsaWFzX2RldmZuKSwgZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoYnVzID0gcGRldi0+YnVzOyAhcGNpX2lzX3Jvb3RfYnVzKGJ1cyk7IGJ1cyA9IGJ1cy0+cGFyZW50KSB7CisJCXN0cnVjdCBwY2lfZGV2ICp0bXA7CisKKwkJLyogU2tpcCB2aXJ0dWFsIGJ1c2VzICovCisJCWlmICghYnVzLT5zZWxmKQorCQkJY29udGludWU7CisKKwkJdG1wID0gYnVzLT5zZWxmOworCisJCS8qCisJCSAqIFBDSWUtdG8tUENJL1ggYnJpZGdlcyBhbGlhcyB0cmFuc2FjdGlvbnMgZnJvbSBkb3duc3RyZWFtCisJCSAqIGRldmljZXMgdXNpbmcgdGhlIHN1Ym9yZGluYXRlIGJ1cyBudW1iZXIgKFBDSSBFeHByZXNzIHRvCisJCSAqIFBDSS9QQ0ktWCBCcmlkZ2UgU3BlYywgcmV2IDEuMCwgc2VjIDIuMykuICBGb3IgYWxsIGNhc2VzCisJCSAqIHdoZXJlIHRoZSB1cHN0cmVhbSBidXMgaXMgUENJL1ggd2UgYWxpYXMgdG8gdGhlIGJyaWRnZQorCQkgKiAodGhlcmUgYXJlIHZhcmlvdXMgY29uZGl0aW9ucyBpbiB0aGUgcHJldmlvdXMgcmVmZXJlbmNlCisJCSAqIHdoZXJlIHRoZSBicmlkZ2UgbWF5IHRha2Ugb3duZXJzaGlwIG9mIHRyYW5zYWN0aW9ucywgZXZlbgorCQkgKiB3aGVuIHRoZSBzZWNvbmRhcnkgaW50ZXJmYWNlIGlzIFBDSS1YKS4KKwkJICovCisJCWlmIChwY2lfaXNfcGNpZSh0bXApKSB7CisJCQlzd2l0Y2ggKHBjaV9wY2llX3R5cGUodG1wKSkgeworCQkJY2FzZSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUOgorCQkJY2FzZSBQQ0lfRVhQX1RZUEVfVVBTVFJFQU06CisJCQljYXNlIFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBQQ0lfRVhQX1RZUEVfUENJX0JSSURHRToKKwkJCQlyZXQgPSBmbih0bXAsCisJCQkJCSBQQ0lfREVWSUQodG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLAorCQkJCQkJICAgUENJX0RFVkZOKDAsIDApKSwgZGF0YSk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgUENJX0VYUF9UWVBFX1BDSUVfQlJJREdFOgorCQkJCXJldCA9IGZuKHRtcCwKKwkJCQkJIFBDSV9ERVZJRCh0bXAtPmJ1cy0+bnVtYmVyLAorCQkJCQkJICAgdG1wLT5kZXZmbiksIGRhdGEpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodG1wLT5kZXZfZmxhZ3MgJiBQQ0lfREVWX0ZMQUdfUENJRV9CUklER0VfQUxJQVMpCisJCQkJcmV0ID0gZm4odG1wLAorCQkJCQkgUENJX0RFVklEKHRtcC0+c3Vib3JkaW5hdGUtPm51bWJlciwKKwkJCQkJCSAgIFBDSV9ERVZGTigwLCAwKSksIGRhdGEpOworCQkJZWxzZQorCQkJCXJldCA9IGZuKHRtcCwKKwkJCQkJIFBDSV9ERVZJRCh0bXAtPmJ1cy0+bnVtYmVyLAorCQkJCQkJICAgdG1wLT5kZXZmbiksIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIGZpbmQgdGhlIHVwc3RyZWFtIFBDSWUtdG8tUENJIGJyaWRnZSBvZiBhIFBDSSBkZXZpY2UKICAqIGlmIHRoZSBkZXZpY2UgaXMgUENJRSwgcmV0dXJuIE5VTEwKICAqIGlmIHRoZSBkZXZpY2UgaXNuJ3QgY29ubmVjdGVkIHRvIGEgUENJZSBicmlkZ2UgKHRoYXQgaXMgaXRzIHBhcmVudCBpcyBhCiAgKiBsZWdhY3kgUENJIGJyaWRnZSBhbmQgdGhlIGJyaWRnZSBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYnVzIDApLCByZXR1cm4gaXRzCiAgKiBwYXJlbnQKICAqLwotc3RydWN0IHBjaV9kZXYgKgotcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdHJ1Y3QgcGNpX2RldiAqcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnRtcCA9IE5VTEw7CiAKQEAgLTU2LDEyICsxNDIsMTIgQEAKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CiAJc3RydWN0IHBjaV9idXMgKnRtcDsKIAotCWlmKGJ1cy0+bnVtYmVyID09IGJ1c25yKQorCWlmIChidXMtPm51bWJlciA9PSBidXNucikKIAkJcmV0dXJuIGJ1czsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgewogCQljaGlsZCA9IHBjaV9kb19maW5kX2J1cyh0bXAsIGJ1c25yKTsKLQkJaWYoY2hpbGQpCisJCWlmIChjaGlsZCkKIAkJCXJldHVybiBjaGlsZDsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC03Niw3ICsxNjIsNyBAQAogICogaW4gdGhlIGdsb2JhbCBsaXN0IG9mIFBDSSBidXNlcy4gIElmIHRoZSBidXMgaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMKICAqIGRhdGEgc3RydWN0dXJlIGlzIHJldHVybmVkLiAgSWYgbm8gYnVzIGlzIGZvdW5kLCAlTlVMTCBpcyByZXR1cm5lZC4KICAqLwotc3RydWN0IHBjaV9idXMgKiBwY2lfZmluZF9idXMoaW50IGRvbWFpbiwgaW50IGJ1c25yKQorc3RydWN0IHBjaV9idXMgKnBjaV9maW5kX2J1cyhpbnQgZG9tYWluLCBpbnQgYnVzbnIpCiB7CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CiAJc3RydWN0IHBjaV9idXMgKnRtcF9idXM7CkBAIC05MCw2ICsxNzYsNyBAQAogCX0KIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfYnVzKTsKIAogLyoqCiAgKiBwY2lfZmluZF9uZXh0X2J1cyAtIGJlZ2luIG9yIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYSBQQ0kgYnVzCkBAIC0xMDAsOCArMTg3LDcgQEAKICAqIEBmcm9tIGlzIG5vdCAlTlVMTCwgc2VhcmNoZXMgY29udGludWUgZnJvbSBuZXh0IGRldmljZSBvbiB0aGUKICAqIGdsb2JhbCBsaXN0LgogICovCi1zdHJ1Y3QgcGNpX2J1cyAqCi1wY2lfZmluZF9uZXh0X2J1cyhjb25zdCBzdHJ1Y3QgcGNpX2J1cyAqZnJvbSkKK3N0cnVjdCBwY2lfYnVzICpwY2lfZmluZF9uZXh0X2J1cyhjb25zdCBzdHJ1Y3QgcGNpX2J1cyAqZnJvbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuOwogCXN0cnVjdCBwY2lfYnVzICpiID0gTlVMTDsKQEAgLTExNCw2ICsyMDAsNyBAQAogCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKIAlyZXR1cm4gYjsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfbmV4dF9idXMpOwogCiAvKioKICAqIHBjaV9nZXRfc2xvdCAtIGxvY2F0ZSBQQ0kgZGV2aWNlIGZvciBhIGdpdmVuIFBDSSBzbG90CkBAIC0xNDcsNiArMjM0LDcgQEAKIAl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcmV0dXJuIGRldjsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2dldF9zbG90KTsKIAogLyoqCiAgKiBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QgLSBsb2NhdGUgUENJIGRldmljZSBmb3IgYSBnaXZlbiBQQ0kgZG9tYWluIChzZWdtZW50KSwgYnVzLCBhbmQgc2xvdApAQCAtMjUxLDYgKzMzOSw3IEBACiAKIAlyZXR1cm4gcGNpX2dldF9kZXZfYnlfaWQoJmlkLCBmcm9tKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2dldF9zdWJzeXMpOwogCiAvKioKICAqIHBjaV9nZXRfZGV2aWNlIC0gYmVnaW4gb3IgY29udGludWUgc2VhcmNoaW5nIGZvciBhIFBDSSBkZXZpY2UgYnkgdmVuZG9yL2RldmljZSBpZApAQCAtMjY2LDExICszNTUsMTIgQEAKICAqIGZyb20gbmV4dCBkZXZpY2Ugb24gdGhlIGdsb2JhbCBsaXN0LiAgVGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgQGZyb20gaXMKICAqIGFsd2F5cyBkZWNyZW1lbnRlZCBpZiBpdCBpcyBub3QgJU5VTEwuCiAgKi8KLXN0cnVjdCBwY2lfZGV2ICoKLXBjaV9nZXRfZGV2aWNlKHVuc2lnbmVkIGludCB2ZW5kb3IsIHVuc2lnbmVkIGludCBkZXZpY2UsIHN0cnVjdCBwY2lfZGV2ICpmcm9tKQorc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfZGV2aWNlKHVuc2lnbmVkIGludCB2ZW5kb3IsIHVuc2lnbmVkIGludCBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKmZyb20pCiB7CiAJcmV0dXJuIHBjaV9nZXRfc3Vic3lzKHZlbmRvciwgZGV2aWNlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBmcm9tKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2dldF9kZXZpY2UpOwogCiAvKioKICAqIHBjaV9nZXRfY2xhc3MgLSBiZWdpbiBvciBjb250aW51ZSBzZWFyY2hpbmcgZm9yIGEgUENJIGRldmljZSBieSBjbGFzcwpAQCAtMjk5LDYgKzM4OSw3IEBACiAKIAlyZXR1cm4gcGNpX2dldF9kZXZfYnlfaWQoJmlkLCBmcm9tKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2dldF9jbGFzcyk7CiAKIC8qKgogICogcGNpX2Rldl9wcmVzZW50IC0gUmV0dXJucyAxIGlmIGRldmljZSBtYXRjaGluZyB0aGUgZGV2aWNlIGxpc3QgaXMgcHJlc2VudCwgMCBpZiBub3QuCkBAIC0zMjgsMTIgKzQxOSwzIEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZfcHJlc2VudCk7Ci0KLS8qIEZvciBib290IHRpbWUgd29yayAqLwotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9idXMpOwotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9uZXh0X2J1cyk7Ci0vKiBGb3IgZXZlcnlvbmUgKi8KLUVYUE9SVF9TWU1CT0wocGNpX2dldF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChwY2lfZ2V0X3N1YnN5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9nZXRfc2xvdCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9nZXRfY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBmZDliNTQ1Li5hNWE2M2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNjgsNyArNjgsNyBAQAogCiAJdG1wID0ga3phbGxvYyhzaXplb2YoKnRtcCksIEdGUF9LRVJORUwpOwogCWlmICghdG1wKSB7Ci0JCXByX3dhcm5pbmcoImFkZF90b19saXN0OiBrbWFsbG9jKCkgZmFpbGVkIVxuIik7CisJCXByX3dhcm4oImFkZF90b19saXN0OiBrbWFsbG9jKCkgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQ4LDggKzE0OCw3IEBACiAKIAkJdG1wID0ga3phbGxvYyhzaXplb2YoKnRtcCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcCkKLQkJCXBhbmljKCJwZGV2X3NvcnRfcmVzb3VyY2VzKCk6ICIKLQkJCSAgICAgICJrbWFsbG9jKCkgZmFpbGVkIVxuIik7CisJCQlwYW5pYygicGRldl9zb3J0X3Jlc291cmNlcygpOiBrbWFsbG9jKCkgZmFpbGVkIVxuIik7CiAJCXRtcC0+cmVzID0gcjsKIAkJdG1wLT5kZXYgPSBkZXY7CiAKQEAgLTczNiw3ICs3MzUsNyBAQAogewogCWlmIChzaXplIDwgbWluX3NpemUpCiAJCXNpemUgPSBtaW5fc2l6ZTsKLQlpZiAob2xkX3NpemUgPT0gMSApCisJaWYgKG9sZF9zaXplID09IDEpCiAJCW9sZF9zaXplID0gMDsKIAkvKiBUbyBiZSBmaXhlZCBpbiAyLjU6IHdlIHNob3VsZCBoYXZlIHNvcnQgb2YgSEFWRV9JU0EKIAkgICBmbGFnIGluIHRoZSBzdHJ1Y3QgcGNpX2J1cy4gKi8KQEAgLTc1Nyw3ICs3NTYsNyBAQAogewogCWlmIChzaXplIDwgbWluX3NpemUpCiAJCXNpemUgPSBtaW5fc2l6ZTsKLQlpZiAob2xkX3NpemUgPT0gMSApCisJaWYgKG9sZF9zaXplID09IDEpCiAJCW9sZF9zaXplID0gMDsKIAlpZiAoc2l6ZSA8IG9sZF9zaXplKQogCQlzaXplID0gb2xkX3NpemU7CkBAIC04NTksOSArODU4LDggQEAKIAkJCXJlc291cmNlX3NpemUoYl9yZXMpLCBtaW5fYWxpZ24pOwogCWlmICghc2l6ZTAgJiYgIXNpemUxKSB7CiAJCWlmIChiX3Jlcy0+c3RhcnQgfHwgYl9yZXMtPmVuZCkKLQkJCWRldl9pbmZvKCZidXMtPnNlbGYtPmRldiwgImRpc2FibGluZyBicmlkZ2Ugd2luZG93ICIKLQkJCQkgIiVwUiB0byAlcFIgKHVudXNlZClcbiIsIGJfcmVzLAotCQkJCSAmYnVzLT5idXNuX3Jlcyk7CisJCQlkZXZfaW5mbygmYnVzLT5zZWxmLT5kZXYsICJkaXNhYmxpbmcgYnJpZGdlIHdpbmRvdyAlcFIgdG8gJXBSICh1bnVzZWQpXG4iLAorCQkJCSBiX3JlcywgJmJ1cy0+YnVzbl9yZXMpOwogCQliX3Jlcy0+ZmxhZ3MgPSAwOwogCQlyZXR1cm47CiAJfQpAQCAtODcyLDEwICs4NzAsOSBAQAogCWlmIChzaXplMSA+IHNpemUwICYmIHJlYWxsb2NfaGVhZCkgewogCQlhZGRfdG9fbGlzdChyZWFsbG9jX2hlYWQsIGJ1cy0+c2VsZiwgYl9yZXMsIHNpemUxLXNpemUwLAogCQkJICAgIG1pbl9hbGlnbik7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+c2VsZi0+ZGV2LCAiYnJpZGdlIHdpbmRvdyAiCi0JCQkJICIlcFIgdG8gJXBSIGFkZF9zaXplICVsbHhcbiIsIGJfcmVzLAotCQkJCSAmYnVzLT5idXNuX3JlcywKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplMS1zaXplMCk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+c2VsZi0+ZGV2LCAiYnJpZGdlIHdpbmRvdyAlcFIgdG8gJXBSIGFkZF9zaXplICVsbHhcbiIsCisJCQkgICBiX3JlcywgJmJ1cy0+YnVzbl9yZXMsCisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNpemUxLXNpemUwKTsKIAl9CiB9CiAKQEAgLTk3NCw5ICs5NzEsOCBAQAogCQkJaWYgKG9yZGVyIDwgMCkKIAkJCQlvcmRlciA9IDA7CiAJCQlpZiAob3JkZXIgPj0gQVJSQVlfU0laRShhbGlnbnMpKSB7Ci0JCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGlzYWJsaW5nIEJBUiAlZDogJXBSICIKLQkJCQkJICIoYmFkIGFsaWdubWVudCAlI2xseClcbiIsIGksIHIsCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBhbGlnbik7CisJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGlzYWJsaW5nIEJBUiAlZDogJXBSIChiYWQgYWxpZ25tZW50ICUjbGx4KVxuIiwKKwkJCQkJIGksIHIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGFsaWduKTsKIAkJCQlyLT5mbGFncyA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0xMDAzLDkgKzk5OSw4IEBACiAJCQkJcmVzb3VyY2Vfc2l6ZShiX3JlcyksIG1pbl9hbGlnbik7CiAJaWYgKCFzaXplMCAmJiAhc2l6ZTEpIHsKIAkJaWYgKGJfcmVzLT5zdGFydCB8fCBiX3Jlcy0+ZW5kKQotCQkJZGV2X2luZm8oJmJ1cy0+c2VsZi0+ZGV2LCAiZGlzYWJsaW5nIGJyaWRnZSB3aW5kb3cgIgotCQkJCSAiJXBSIHRvICVwUiAodW51c2VkKVxuIiwgYl9yZXMsCi0JCQkJICZidXMtPmJ1c25fcmVzKTsKKwkJCWRldl9pbmZvKCZidXMtPnNlbGYtPmRldiwgImRpc2FibGluZyBicmlkZ2Ugd2luZG93ICVwUiB0byAlcFIgKHVudXNlZClcbiIsCisJCQkJIGJfcmVzLCAmYnVzLT5idXNuX3Jlcyk7CiAJCWJfcmVzLT5mbGFncyA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTEwMTQsOSArMTAwOSw5IEBACiAJYl9yZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfU1RBUlRBTElHTjsKIAlpZiAoc2l6ZTEgPiBzaXplMCAmJiByZWFsbG9jX2hlYWQpIHsKIAkJYWRkX3RvX2xpc3QocmVhbGxvY19oZWFkLCBidXMtPnNlbGYsIGJfcmVzLCBzaXplMS1zaXplMCwgbWluX2FsaWduKTsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5zZWxmLT5kZXYsICJicmlkZ2Ugd2luZG93ICIKLQkJCQkgIiVwUiB0byAlcFIgYWRkX3NpemUgJWxseFxuIiwgYl9yZXMsCi0JCQkJICZidXMtPmJ1c25fcmVzLCAodW5zaWduZWQgbG9uZyBsb25nKXNpemUxLXNpemUwKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5zZWxmLT5kZXYsICJicmlkZ2Ugd2luZG93ICVwUiB0byAlcFIgYWRkX3NpemUgJWxseFxuIiwKKwkJCSAgIGJfcmVzLCAmYnVzLT5idXNuX3JlcywKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZTEtc2l6ZTApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEyNzQsOCArMTI2OSw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibm90IHNldHRpbmcgdXAgYnJpZGdlIGZvciBidXMgIgotCQkJCSAiJTA0eDolMDJ4XG4iLCBwY2lfZG9tYWluX25yKGIpLCBiLT5udW1iZXIpOworCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibm90IHNldHRpbmcgdXAgYnJpZGdlIGZvciBidXMgJTA0eDolMDJ4XG4iLAorCQkJCSBwY2lfZG9tYWluX25yKGIpLCBiLT5udW1iZXIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMzEyLDggKzEzMDcsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIm5vdCBzZXR0aW5nIHVwIGJyaWRnZSBmb3IgYnVzICIKLQkJCSAiJTA0eDolMDJ4XG4iLCBwY2lfZG9tYWluX25yKGIpLCBiLT5udW1iZXIpOworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICJub3Qgc2V0dGluZyB1cCBicmlkZ2UgZm9yIGJ1cyAlMDR4OiUwMnhcbiIsCisJCQkgcGNpX2RvbWFpbl9ucihiKSwgYi0+bnVtYmVyKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTQzMCwxMCArMTQyNSwxMCBAQAogCiAJcGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZShidXMsIHJlcywgaSkgewogCQlpZiAoIXJlcyB8fCAhcmVzLT5lbmQgfHwgIXJlcy0+ZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkJCWNvbnRpbnVlOwogCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXBSXG4iLCBpLCByZXMpOwotICAgICAgICB9CisJfQogfQogCiBzdGF0aWMgdm9pZCBwY2lfYnVzX2R1bXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCkBAIC0xNDU4LDcgKzE0NTMsNyBAQAogCWludCBkZXB0aCA9IDA7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkX2J1czsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfYnVzLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSl7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZF9idXMsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CiAJCWludCByZXQ7CiAKIAkJcmV0ID0gcGNpX2J1c19nZXRfZGVwdGgoY2hpbGRfYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jIGIvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKaW5kZXggZGJjNGZmYy4uNGUyZDU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKQEAgLTIyLDEwICsyMiw5IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwogfQogCi1zdGF0aWMgdm9pZAotcGRldl9maXh1cF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkgICAgICAgdTggKCpzd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKSwKLQkgICAgICAgaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKK3N0YXRpYyB2b2lkIHBkZXZfZml4dXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkgICB1OCAoKnN3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopLAorCQkJICAgaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKIHsKIAl1OCBwaW4sIHNsb3Q7CiAJaW50IGlycSA9IDA7CkBAIC01OCwxMSArNTcsMTEgQEAKIAlwY2liaW9zX3VwZGF0ZV9pcnEoZGV2LCBpcnEpOwogfQogCi12b2lkCi1wY2lfZml4dXBfaXJxcyh1OCAoKnN3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopLAotCSAgICAgICBpbnQgKCptYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKQordm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKnN3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopLAorCQkgICAgaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwogCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQogCQlwZGV2X2ZpeHVwX2lycShkZXYsIHN3aXp6bGUsIG1hcF9pcnEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwppbmRleCAzM2Y5ZTMyLi5jYWVkMWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtOTYsOCArOTYsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgbmV3KTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgJmNoZWNrKTsKIAkJaWYgKGNoZWNrICE9IG5ldykgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGVycm9yIHVwZGF0aW5nICIKLQkJCSAgICAgICAiKGhpZ2ggJSMwOHggIT0gJSMwOHgpXG4iLCByZXNubywgbmV3LCBjaGVjayk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogZXJyb3IgdXBkYXRpbmcgKGhpZ2ggJSMwOHggIT0gJSMwOHgpXG4iLAorCQkJCXJlc25vLCBuZXcsIGNoZWNrKTsKIAkJfQogCX0KIApAQCAtMjg5LDggKzI4OSw4IEBACiAJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCWFsaWduID0gcGNpX3Jlc291cmNlX2FsaWdubWVudChkZXYsIHJlcyk7CiAJaWYgKCFhbGlnbikgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFzc2lnbiAlcFIgIgotCQkJICIoYm9ndXMgYWxpZ25tZW50KVxuIiwgcmVzbm8sIHJlcyk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVwUiAoYm9ndXMgYWxpZ25tZW50KVxuIiwKKwkJCSByZXNubywgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMTQsNiArMzE0LDcgQEAKIAl9CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2Fzc2lnbl9yZXNvdXJjZSk7CiAKIGludCBwY2lfcmVhc3NpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vLCByZXNvdXJjZV9zaXplX3QgYWRkc2l6ZSwKIAkJCXJlc291cmNlX3NpemVfdCBtaW5fYWxpZ24pCkBAIC0zMjQsOCArMzI1LDggQEAKIAogCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlpZiAoIXJlcy0+cGFyZW50KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgcmVhc3NpZ24gYW4gdW5hc3NpZ25lZCByZXNvdXJjZSAlcFIgIgotCQkJICJcbiIsIHJlc25vLCByZXMpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IHJlYXNzaWduIGFuIHVuYXNzaWduZWQgcmVzb3VyY2UgJXBSXG4iLAorCQkJIHJlc25vLCByZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3N5c2NhbGwuYyBiL2RyaXZlcnMvcGNpL3N5c2NhbGwuYwppbmRleCAyNDc1MGExYi4uYjkxYzRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc3lzY2FsbC5jCisrKyBiL2RyaXZlcnMvcGNpL3N5c2NhbGwuYwpAQCAtOTksNyArOTksNyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN3aXRjaChsZW4pIHsKKwlzd2l0Y2ggKGxlbikgewogCWNhc2UgMToKIAkJZXJyID0gZ2V0X3VzZXIoYnl0ZSwgKHU4IF9fdXNlciAqKWJ1Zik7CiAJCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCmluZGV4IGUyNWQyYmMuLjI5NmIwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCkBAIC0xNDIsNyArMTQyLDEwIEBACiAJCWRlbHRhID0ga3RpbWVfdG9fbnMoa3QpOwogCQllcnIgPSBvcHMtPmFkanRpbWUob3BzLCBkZWx0YSk7CiAJfSBlbHNlIGlmICh0eC0+bW9kZXMgJiBBREpfRlJFUVVFTkNZKSB7Ci0JCWVyciA9IG9wcy0+YWRqZnJlcShvcHMsIHNjYWxlZF9wcG1fdG9fcHBiKHR4LT5mcmVxKSk7CisJCXMzMiBwcGIgPSBzY2FsZWRfcHBtX3RvX3BwYih0eC0+ZnJlcSk7CisJCWlmIChwcGIgPiBvcHMtPm1heF9hZGogfHwgcHBiIDwgLW9wcy0+bWF4X2FkaikKKwkJCXJldHVybiAtRVJBTkdFOworCQllcnIgPSBvcHMtPmFkamZyZXEob3BzLCBwcGIpOwogCQlwdHAtPmRpYWxlZF9mcmVxdWVuY3kgPSB0eC0+ZnJlcTsKIAl9IGVsc2UgaWYgKHR4LT5tb2RlcyA9PSAwKSB7CiAJCXR4LT5mcmVxID0gcHRwLT5kaWFsZWRfZnJlcXVlbmN5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwppbmRleCBmZDdiM2JkLi5kODM3YzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwpAQCAtMzM0OCw3ICszMzQ4LDcgQEAKIAl9CiAJQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgImluaXRfbW9kIik7CiAJY2xhd19yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJjbGF3Iik7Ci0JcmV0ID0gUFRSX1JFVChjbGF3X3Jvb3RfZGV2KTsKKwlyZXQgPSBQVFJfRVJSX09SX1pFUk8oY2xhd19yb290X2Rldik7CiAJaWYgKHJldCkKIAkJZ290byByZWdpc3Rlcl9lcnI7CiAJcmV0ID0gY2N3X2RyaXZlcl9yZWdpc3RlcigmY2xhd19jY3dfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbWFpbi5jCmluZGV4IDcwYjNhMDIuLjAzYjZhZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uYwpAQCAtMTgzNyw3ICsxODM3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CiAJY3RjbV9yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJjdGNtIik7Ci0JcmV0ID0gUFRSX1JFVChjdGNtX3Jvb3RfZGV2KTsKKwlyZXQgPSBQVFJfRVJSX09SX1pFUk8oY3RjbV9yb290X2Rldik7CiAJaWYgKHJldCkKIAkJZ290byByZWdpc3Rlcl9lcnI7CiAJcmV0ID0gY2N3X2RyaXZlcl9yZWdpc3RlcigmY3RjbV9jY3dfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9zeXNmcy5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKaW5kZXggOTg1YjVkYy4uNmJjZmJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKQEAgLTM0LDggKzM0LDkgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotCWludCBiczE7CisJdW5zaWduZWQgaW50IGJzMTsKIAlzdHJ1Y3QgY3RjbV9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJjOwogCiAJbmRldiA9IHByaXYtPmNoYW5uZWxbQ1RDTV9SRUFEXS0+bmV0ZGV2OwogCWlmICghKHByaXYgJiYgcHJpdi0+Y2hhbm5lbFtDVENNX1JFQURdICYmIG5kZXYpKSB7CkBAIC00Myw3ICs0NCw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNzY2FuZihidWYsICIldSIsICZiczEpOworCXJjID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmJzMSk7CisJaWYgKHJjICE9IDEpCisJCWdvdG8gZWludmFsOwogCWlmIChiczEgPiBDVENNX0JVRlNJWkVfTElNSVQpCiAJCQkJCWdvdG8gZWludmFsOwogCWlmIChiczEgPCAoNTc2ICsgTExfSEVBREVSX0xFTkdUSCArIDIpKQpAQCAtMTQzLDEzICsxNDYsMTQgQEAKIHN0YXRpYyBzc2l6ZV90IGN0Y21fcHJvdG9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHZhbHVlOworCWludCB2YWx1ZSwgcmM7CiAJc3RydWN0IGN0Y21fcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQlzc2NhbmYoYnVmLCAiJXUiLCAmdmFsdWUpOwotCWlmICghKCh2YWx1ZSA9PSBDVENNX1BST1RPX1MzOTApICB8fAorCXJjID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKTsKKwlpZiAoKHJjICE9IDEpIHx8CisJICAgICEoKHZhbHVlID09IENUQ01fUFJPVE9fUzM5MCkgIHx8CiAJICAgICAgKHZhbHVlID09IENUQ01fUFJPVE9fTElOVVgpIHx8CiAJICAgICAgKHZhbHVlID09IENUQ01fUFJPVE9fTVBDKSB8fAogCSAgICAgICh2YWx1ZSA9PSBDVENNX1BST1RPX09TMzkwKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwppbmRleCBjNDYxZjJhLi4wYTdkODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKQEAgLTE5NDMsMTQgKzE5NDMsMTYgQEAKIGxjc19wb3J0bm9fc3RvcmUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogICAgICAgICBzdHJ1Y3QgbGNzX2NhcmQgKmNhcmQ7Ci0gICAgICAgIGludCB2YWx1ZTsKKwlpbnQgdmFsdWUsIHJjOwogCiAJY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAgICAgICAgIGlmICghY2FyZCkKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBzc2NhbmYoYnVmLCAiJXUiLCAmdmFsdWUpOworCXJjID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKTsKKwlpZiAocmMgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIC8qIFRPRE86IHNhbml0eSBjaGVja3MgKi8KICAgICAgICAgY2FyZC0+cG9ydG5vID0gdmFsdWU7CiAKQEAgLTE5OTcsMTQgKzE5OTksMTcgQEAKIGxjc190aW1lb3V0X3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKICAgICAgICAgc3RydWN0IGxjc19jYXJkICpjYXJkOwotICAgICAgICBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCByYzsKIAogCWNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogICAgICAgICBpZiAoIWNhcmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgc3NjYW5mKGJ1ZiwgIiV1IiwgJnZhbHVlKTsKKwlyYyA9IHNzY2FuZihidWYsICIldSIsICZ2YWx1ZSk7CisJaWYgKHJjICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogICAgICAgICAvKiBUT0RPOiBzYW5pdHkgY2hlY2tzICovCiAgICAgICAgIGNhcmQtPmxhbmNtZF90aW1lb3V0ID0gdmFsdWU7CiAKQEAgLTI0NDIsNyArMjQ0Nyw3IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9lcnI7CiAJbGNzX3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImxjcyIpOwotCXJjID0gUFRSX1JFVChsY3Nfcm9vdF9kZXYpOworCXJjID0gUFRSX0VSUl9PUl9aRVJPKGxjc19yb290X2Rldik7CiAJaWYgKHJjKQogCQlnb3RvIHJlZ2lzdGVyX2VycjsKIAlyYyA9IGNjd19kcml2ZXJfcmVnaXN0ZXIoJmxjc19jY3dfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCmluZGV4IDUzMzNiMmMuLmEyMDg4YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtMjY4LDEwICsyNjgsOCBAQAogI2RlZmluZSBRRVRIX05PX1BSSU9fUVVFVUVJTkcgMAogI2RlZmluZSBRRVRIX1BSSU9fUV9JTkdfUFJFQyAgMQogI2RlZmluZSBRRVRIX1BSSU9fUV9JTkdfVE9TICAgMgotI2RlZmluZSBJUF9UT1NfTE9XREVMQVkgMHgxMAotI2RlZmluZSBJUF9UT1NfSElHSFRIUk9VR0hQVVQgMHgwOAotI2RlZmluZSBJUF9UT1NfSElHSFJFTElBQklMSVRZIDB4MDQKLSNkZWZpbmUgSVBfVE9TX05PVElNUE9SVEFOVCAweDAyCisjZGVmaW5lIFFFVEhfUFJJT19RX0lOR19TS0IgICAzCisjZGVmaW5lIFFFVEhfUFJJT19RX0lOR19WTEFOICA0CiAKIC8qIFBhY2tpbmcgKi8KICNkZWZpbmUgUUVUSF9MT1dfV0FURVJNQVJLX1BBQ0sgIDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCBlODlmMzhjLi5mNTRiZWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxuZXQvaXVjdi9hZl9pdWN2Lmg+CisjaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KIAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vY2hwaWQuaD4KQEAgLTEwMTMsNyArMTAxNCw3IEBACiAKIAljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2Rldik7CiAKLQlpZiAoIUlTX0VSUihpcmIpKQorCWlmICghY2FyZCB8fCAhSVNfRVJSKGlyYikpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChQVFJfRVJSKGlyYikpIHsKQEAgLTEwMjksNyArMTAzMCw3IEBACiAJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJja2lyYmVyciIpOwogCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiAgcmMlZCIsIC1FVElNRURPVVQpOwogCQlpZiAoaW50cGFybSA9PSBRRVRIX1JDRF9QQVJNKSB7Ci0JCQlpZiAoY2FyZCAmJiAoY2FyZC0+ZGF0YS5jY3dkZXYgPT0gY2RldikpIHsKKwkJCWlmIChjYXJkLT5kYXRhLmNjd2RldiA9PSBjZGV2KSB7CiAJCQkJY2FyZC0+ZGF0YS5zdGF0ZSA9IENIX1NUQVRFX0RPV047CiAJCQkJd2FrZV91cCgmY2FyZC0+d2FpdF9xKTsKIAkJCX0KQEAgLTM2NjIsNDIgKzM2NjMsNTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHFldGhfcWRpb19vdXRwdXRfaGFuZGxlcik7CiAKKy8qKgorICogTm90ZTogRnVuY3Rpb24gYXNzdW1lcyB0aGF0IHdlIGhhdmUgNCBvdXRib3VuZCBxdWV1ZXMuCisgKi8KIGludCBxZXRoX2dldF9wcmlvcml0eV9xdWV1ZShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJaW50IGlwdiwgaW50IGNhc3RfdHlwZSkKIHsKLQlpZiAoIWlwdiAmJiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TRCB8fAotCQkgICAgIGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU1gpKQotCQlyZXR1cm4gY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZTsKLQlzd2l0Y2ggKGNhcmQtPnFkaW8ubm9fb3V0X3F1ZXVlcykgewotCWNhc2UgNDoKLQkJaWYgKGNhc3RfdHlwZSAmJiBjYXJkLT5pbmZvLmlzX211bHRpY2FzdF9kaWZmZXJlbnQpCi0JCQlyZXR1cm4gY2FyZC0+aW5mby5pc19tdWx0aWNhc3RfZGlmZmVyZW50ICYKLQkJCQkoY2FyZC0+cWRpby5ub19vdXRfcXVldWVzIC0gMSk7Ci0JCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgJiYgKGlwdiA9PSA0KSkgewotCQkJY29uc3QgdTggdG9zID0gaXBfaGRyKHNrYiktPnRvczsKKwlfX2JlMTYgKnRjaTsKKwl1OCB0b3M7CiAKLQkJCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgPT0KLQkJCQlRRVRIX1BSSU9fUV9JTkdfVE9TKSB7Ci0JCQkJaWYgKHRvcyAmIElQX1RPU19OT1RJTVBPUlRBTlQpCi0JCQkJCXJldHVybiAzOwotCQkJCWlmICh0b3MgJiBJUF9UT1NfSElHSFJFTElBQklMSVRZKQotCQkJCQlyZXR1cm4gMjsKLQkJCQlpZiAodG9zICYgSVBfVE9TX0hJR0hUSFJPVUdIUFVUKQotCQkJCQlyZXR1cm4gMTsKLQkJCQlpZiAodG9zICYgSVBfVE9TX0xPV0RFTEFZKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgPT0KLQkJCQlRRVRIX1BSSU9fUV9JTkdfUFJFQykKLQkJCQlyZXR1cm4gMyAtICh0b3MgPj4gNik7Ci0JCX0gZWxzZSBpZiAoY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nICYmIChpcHYgPT0gNikpIHsKLQkJCS8qIFRPRE86IElQdjYhISEgKi8KKwlpZiAoY2FzdF90eXBlICYmIGNhcmQtPmluZm8uaXNfbXVsdGljYXN0X2RpZmZlcmVudCkKKwkJcmV0dXJuIGNhcmQtPmluZm8uaXNfbXVsdGljYXN0X2RpZmZlcmVudCAmCisJCQkoY2FyZC0+cWRpby5ub19vdXRfcXVldWVzIC0gMSk7CisKKwlzd2l0Y2ggKGNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZykgeworCWNhc2UgUUVUSF9QUklPX1FfSU5HX1RPUzoKKwljYXNlIFFFVEhfUFJJT19RX0lOR19QUkVDOgorCQlzd2l0Y2ggKGlwdikgeworCQljYXNlIDQ6CisJCQl0b3MgPSBpcHY0X2dldF9kc2ZpZWxkKGlwX2hkcihza2IpKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQl0b3MgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZTsKIAkJfQotCQlyZXR1cm4gY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZTsKLQljYXNlIDE6IC8qIGZhbGx0aHJvdWdoIGZvciBzaW5nbGUtb3V0LXF1ZXVlIDE5MjAtZGV2aWNlICovCisJCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgPT0gUUVUSF9QUklPX1FfSU5HX1BSRUMpCisJCQlyZXR1cm4gfnRvcyA+PiA2ICYgMzsKKwkJaWYgKHRvcyAmIElQVE9TX01JTkNPU1QpCisJCQlyZXR1cm4gMzsKKwkJaWYgKHRvcyAmIElQVE9TX1JFTElBQklMSVRZKQorCQkJcmV0dXJuIDI7CisJCWlmICh0b3MgJiBJUFRPU19USFJPVUdIUFVUKQorCQkJcmV0dXJuIDE7CisJCWlmICh0b3MgJiBJUFRPU19MT1dERUxBWSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIFFFVEhfUFJJT19RX0lOR19TS0I6CisJCWlmIChza2ItPnByaW9yaXR5ID4gNSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gfnNrYi0+cHJpb3JpdHkgPj4gMSAmIDM7CisJY2FzZSBRRVRIX1BSSU9fUV9JTkdfVkxBTjoKKwkJdGNpID0gJigoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG87CisJCWlmICgqdGNpID09IEVUSF9QXzgwMjFRKQorCQkJcmV0dXJuIH4qKHRjaSArIDEpID4+IChWTEFOX1BSSU9fU0hJRlQgKyAxKSAmIDM7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBjYXJkLT5xZGlvLmRlZmF1bHRfb3V0X3F1ZXVlOworCQlicmVhazsKIAl9CisJcmV0dXJuIGNhcmQtPnFkaW8uZGVmYXVsdF9vdXRfcXVldWU7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChxZXRoX2dldF9wcmlvcml0eV9xdWV1ZSk7CiAKQEAgLTU3MDMsNiArNTcxOCw3IEBACiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IG5ldGRldi0+bWxfcHJpdjsKIAllbnVtIHFldGhfbGlua190eXBlcyBsaW5rX3R5cGU7CiAJc3RydWN0IGNhcnJpZXJfaW5mbyBjYXJyaWVyX2luZm87CisJdTMyIHNwZWVkOwogCiAJaWYgKChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKSB8fCAoY2FyZC0+aW5mby5ndWVzdGxhbikpCiAJCWxpbmtfdHlwZSA9IFFFVEhfTElOS19UWVBFXzEwR0JJVF9FVEg7CkBAIC01NzE3LDI4ICs1NzMzLDI5IEBACiAJY2FzZSBRRVRIX0xJTktfVFlQRV9GQVNUX0VUSDoKIAljYXNlIFFFVEhfTElOS19UWVBFX0xBTkVfRVRIMTAwOgogCQlxZXRoX3NldF9lY21kX2Fkdl9zdXAoZWNtZCwgU1BFRURfMTAwLCBQT1JUX1RQKTsKLQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCXNwZWVkID0gU1BFRURfMTAwOwogCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKIAkJYnJlYWs7CiAKIAljYXNlIFFFVEhfTElOS19UWVBFX0dCSVRfRVRIOgogCWNhc2UgUUVUSF9MSU5LX1RZUEVfTEFORV9FVEgxMDAwOgogCQlxZXRoX3NldF9lY21kX2Fkdl9zdXAoZWNtZCwgU1BFRURfMTAwMCwgUE9SVF9GSUJSRSk7Ci0JCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJc3BlZWQgPSBTUEVFRF8xMDAwOwogCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKIAkJYnJlYWs7CiAKIAljYXNlIFFFVEhfTElOS19UWVBFXzEwR0JJVF9FVEg6CiAJCXFldGhfc2V0X2VjbWRfYWR2X3N1cChlY21kLCBTUEVFRF8xMDAwMCwgUE9SVF9GSUJSRSk7Ci0JCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJCXNwZWVkID0gU1BFRURfMTAwMDA7CiAJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCXFldGhfc2V0X2VjbWRfYWR2X3N1cChlY21kLCBTUEVFRF8xMCwgUE9SVF9UUCk7Ci0JCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCXNwZWVkID0gU1BFRURfMTA7CiAJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOwogCX0KKwlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgc3BlZWQpOwogCiAJLyogQ2hlY2sgaWYgd2UgY2FuIG9idGFpbiBtb3JlIGFjY3VyYXRlIGluZm9ybWF0aW9uLgkgKi8KIAkvKiBJZiBRVUVSWV9DQVJEX0lORk8gY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9yIGZhaWxzLCAqLwpAQCAtNTc4MywxOCArNTgwMCwxOSBAQAogCiAJc3dpdGNoIChjYXJyaWVyX2luZm8ucG9ydF9zcGVlZCkgewogCWNhc2UgQ0FSRF9JTkZPX1BPUlRTXzEwTToKLQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJc3BlZWQgPSBTUEVFRF8xMDsKIAkJYnJlYWs7CiAJY2FzZSBDQVJEX0lORk9fUE9SVFNfMTAwTToKLQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCXNwZWVkID0gU1BFRURfMTAwOwogCQlicmVhazsKIAljYXNlIENBUkRfSU5GT19QT1JUU18xRzoKLQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwOworCQlzcGVlZCA9IFNQRUVEXzEwMDA7CiAJCWJyZWFrOwogCWNhc2UgQ0FSRF9JTkZPX1BPUlRTXzEwRzoKLQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkJc3BlZWQgPSBTUEVFRF8xMDAwMDsKIAkJYnJlYWs7CiAJfQorCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBzcGVlZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU4MTYsNyArNTgzNCw3IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9lcnI7CiAJcWV0aF9jb3JlX3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoInFldGgiKTsKLQlyYyA9IFBUUl9SRVQocWV0aF9jb3JlX3Jvb3RfZGV2KTsKKwlyYyA9IFBUUl9FUlJfT1JfWkVSTyhxZXRoX2NvcmVfcm9vdF9kZXYpOwogCWlmIChyYykKIAkJZ290byByZWdpc3Rlcl9lcnI7CiAJcWV0aF9jb3JlX2hlYWRlcl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJxZXRoX2hkciIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9zeXMuYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX3N5cy5jCmluZGV4IDQyNWMwZWMuLjhhMjVhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX3N5cy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX3N5cy5jCkBAIC0yMTcsNiArMjE3LDEwIEBACiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAiYnkgcHJlY2VkZW5jZSIpOwogCWNhc2UgUUVUSF9QUklPX1FfSU5HX1RPUzoKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsICJieSB0eXBlIG9mIHNlcnZpY2UiKTsKKwljYXNlIFFFVEhfUFJJT19RX0lOR19TS0I6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAiYnkgc2tiLXByaW9yaXR5Iik7CisJY2FzZSBRRVRIX1BSSU9fUV9JTkdfVkxBTjoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsICJieSBWTEFOIGhlYWRlcnMiKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gc3ByaW50ZihidWYsICJhbHdheXMgcXVldWUgJWlcbiIsCiAJCQkgICAgICAgY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZSk7CkBAIC0yNTAsMTEgKzI1NCwyMyBAQAogCX0KIAogCXRtcCA9IHN0cnNlcCgoY2hhciAqKikgJmJ1ZiwgIlxuIik7Ci0JaWYgKCFzdHJjbXAodG1wLCAicHJpb19xdWV1ZWluZ19wcmVjIikpCisJaWYgKCFzdHJjbXAodG1wLCAicHJpb19xdWV1ZWluZ19wcmVjIikpIHsKIAkJY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nID0gUUVUSF9QUklPX1FfSU5HX1BSRUM7Ci0JZWxzZSBpZiAoIXN0cmNtcCh0bXAsICJwcmlvX3F1ZXVlaW5nX3RvcyIpKQorCQljYXJkLT5xZGlvLmRlZmF1bHRfb3V0X3F1ZXVlID0gUUVUSF9ERUZBVUxUX1FVRVVFOworCX0gZWxzZSBpZiAoIXN0cmNtcCh0bXAsICJwcmlvX3F1ZXVlaW5nX3NrYiIpKSB7CisJCWNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZyA9IFFFVEhfUFJJT19RX0lOR19TS0I7CisJCWNhcmQtPnFkaW8uZGVmYXVsdF9vdXRfcXVldWUgPSBRRVRIX0RFRkFVTFRfUVVFVUU7CisJfSBlbHNlIGlmICghc3RyY21wKHRtcCwgInByaW9fcXVldWVpbmdfdG9zIikpIHsKIAkJY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nID0gUUVUSF9QUklPX1FfSU5HX1RPUzsKLQllbHNlIGlmICghc3RyY21wKHRtcCwgIm5vX3ByaW9fcXVldWVpbmc6MCIpKSB7CisJCWNhcmQtPnFkaW8uZGVmYXVsdF9vdXRfcXVldWUgPSBRRVRIX0RFRkFVTFRfUVVFVUU7CisJfSBlbHNlIGlmICghc3RyY21wKHRtcCwgInByaW9fcXVldWVpbmdfdmxhbiIpKSB7CisJCWlmICghY2FyZC0+b3B0aW9ucy5sYXllcjIpIHsKKwkJCXJjID0gLUVOT1RTVVBQOworCQkJZ290byBvdXQ7CisJCX0KKwkJY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nID0gUUVUSF9QUklPX1FfSU5HX1ZMQU47CisJCWNhcmQtPnFkaW8uZGVmYXVsdF9vdXRfcXVldWUgPSBRRVRIX0RFRkFVTFRfUVVFVUU7CisJfSBlbHNlIGlmICghc3RyY21wKHRtcCwgIm5vX3ByaW9fcXVldWVpbmc6MCIpKSB7CiAJCWNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZyA9IFFFVEhfTk9fUFJJT19RVUVVRUlORzsKIAkJY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZSA9IDA7CiAJfSBlbHNlIGlmICghc3RyY21wKHRtcCwgIm5vX3ByaW9fcXVldWVpbmc6MSIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwppbmRleCA4ZGVhM2YxLi41ZWY1YjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKQEAgLTcyNSwxNSArNzI1LDIwIEBACiAJaW50IGVsZW1lbnRzID0gMDsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gc2tiOwotCWludCBpcHYgPSBxZXRoX2dldF9pcF92ZXJzaW9uKHNrYik7CiAJaW50IGNhc3RfdHlwZSA9IHFldGhfbDJfZ2V0X2Nhc3RfdHlwZShjYXJkLCBza2IpOwotCXN0cnVjdCBxZXRoX3FkaW9fb3V0X3EgKnF1ZXVlID0gY2FyZC0+cWRpby5vdXRfcXMKLQkJW3FldGhfZ2V0X3ByaW9yaXR5X3F1ZXVlKGNhcmQsIHNrYiwgaXB2LCBjYXN0X3R5cGUpXTsKKwlzdHJ1Y3QgcWV0aF9xZGlvX291dF9xICpxdWV1ZTsKIAlpbnQgdHhfYnl0ZXMgPSBza2ItPmxlbjsKIAlpbnQgZGF0YV9vZmZzZXQgPSAtMTsKIAlpbnQgZWxlbWVudHNfbmVlZGVkID0gMDsKIAlpbnQgaGRfbGVuID0gMDsKIAorCWlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgfHwgKGNhc3RfdHlwZSAmJgorCQkJCQljYXJkLT5pbmZvLmlzX211bHRpY2FzdF9kaWZmZXJlbnQpKQorCQlxdWV1ZSA9IGNhcmQtPnFkaW8ub3V0X3FzW3FldGhfZ2V0X3ByaW9yaXR5X3F1ZXVlKGNhcmQsIHNrYiwKKwkJCQkJcWV0aF9nZXRfaXBfdmVyc2lvbihza2IpLCBjYXN0X3R5cGUpXTsKKwllbHNlCisJCXF1ZXVlID0gY2FyZC0+cWRpby5vdXRfcXNbY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZV07CisKIAlpZiAoKGNhcmQtPnN0YXRlICE9IENBUkRfU1RBVEVfVVApIHx8ICFjYXJkLT5sYW5fb25saW5lKSB7CiAJCWNhcmQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCWdvdG8gdHhfZHJvcDsKQEAgLTk2NCwxMCArOTY5LDkgQEAKIAljYXJkLT5kZXYtPndhdGNoZG9nX3RpbWVvID0gUUVUSF9UWF9USU1FT1VUOwogCWNhcmQtPmRldi0+bXR1ID0gY2FyZC0+aW5mby5pbml0aWFsX210dTsKIAljYXJkLT5kZXYtPm5ldGRldl9vcHMgPSAmcWV0aF9sMl9uZXRkZXZfb3BzOwotCWlmIChjYXJkLT5pbmZvLnR5cGUgIT0gUUVUSF9DQVJEX1RZUEVfT1NOKQotCQlTRVRfRVRIVE9PTF9PUFMoY2FyZC0+ZGV2LCAmcWV0aF9sMl9ldGh0b29sX29wcyk7Ci0JZWxzZQotCQlTRVRfRVRIVE9PTF9PUFMoY2FyZC0+ZGV2LCAmcWV0aF9sMl9vc25fb3BzKTsKKwljYXJkLT5kZXYtPmV0aHRvb2xfb3BzID0KKwkJKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9PU04pID8KKwkJJnFldGhfbDJfZXRodG9vbF9vcHMgOiAmcWV0aF9sMl9vc25fb3BzOwogCWNhcmQtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOwogCWNhcmQtPmluZm8uYnJvYWRjYXN0X2NhcGFibGUgPSAxOwogCXFldGhfbDJfcmVxdWVzdF9pbml0aWFsX21hYyhjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IDM1MjRkMzQuLjE0ZTBiNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtNjMsNyArNjMsNyBAQAogaW50IHFldGhfbDNfc3RyaW5nX3RvX2lwYWRkcjQoY29uc3QgY2hhciAqYnVmLCBfX3U4ICphZGRyKQogewogCWludCBjb3VudCA9IDAsIHJjID0gMDsKLQlpbnQgaW5bNF07CisJdW5zaWduZWQgaW50IGluWzRdOwogCWNoYXIgYzsKIAogCXJjID0gc3NjYW5mKGJ1ZiwgIiV1LiV1LiV1LiV1JWMiLApAQCAtMTY1OSw3ICsxNjU5LDcgQEAKIAlmb3JfZWFjaF9zZXRfYml0KHZpZCwgY2FyZC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAKLQkJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksCisJCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShjYXJkLT5kZXYsIGh0b25zKEVUSF9QXzgwMjFRKSwKIAkJCQkJICAgICAgdmlkKTsKIAkJaWYgKG5ldGRldiA9PSBOVUxMIHx8CiAJCSAgICAhKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAlmb3JfZWFjaF9zZXRfYml0KHZpZCwgY2FyZC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAKLQkJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksCisJCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShjYXJkLT5kZXYsIGh0b25zKEVUSF9QXzgwMjFRKSwKIAkJCQkJICAgICAgdmlkKTsKIAkJaWYgKG5ldGRldiA9PSBOVUxMIHx8CiAJCSAgICAhKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQpAQCAtMTc2Niw3ICsxNzY2LDcgQEAKIAogCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJmcnZhZGRyNCIpOwogCi0JbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIHZpZCk7CisJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXBfcmN1KGNhcmQtPmRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOwogCWlmICghbmV0ZGV2KQogCQlyZXR1cm47CiAJaW5fZGV2ID0gaW5fZGV2X2dldChuZXRkZXYpOwpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKIAogCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJmcnZhZGRyNiIpOwogCi0JbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIHZpZCk7CisJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXBfcmN1KGNhcmQtPmRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOwogCWlmICghbmV0ZGV2KQogCQlyZXR1cm47CiAJaW42X2RldiA9IGluNl9kZXZfZ2V0KG5ldGRldik7CkBAIC0yMDg5LDcgKzIwODksNyBAQAogCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksCisJCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShjYXJkLT5kZXYsIGh0b25zKEVUSF9QXzgwMjFRKSwKIAkJCQkJICAgICAgdmlkKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWlmIChuZXRkZXYgPT0gZGV2KSB7CkBAIC0yOTI2LDggKzI5MjYsMTEgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IE5VTEw7CiAJaW50IGlwdiA9IHFldGhfZ2V0X2lwX3ZlcnNpb24oc2tiKTsKIAlpbnQgY2FzdF90eXBlID0gcWV0aF9sM19nZXRfY2FzdF90eXBlKGNhcmQsIHNrYik7Ci0Jc3RydWN0IHFldGhfcWRpb19vdXRfcSAqcXVldWUgPSBjYXJkLT5xZGlvLm91dF9xcwotCQlbcWV0aF9nZXRfcHJpb3JpdHlfcXVldWUoY2FyZCwgc2tiLCBpcHYsIGNhc3RfdHlwZSldOworCXN0cnVjdCBxZXRoX3FkaW9fb3V0X3EgKnF1ZXVlID0KKwkJY2FyZC0+cWRpby5vdXRfcXNbY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nCisJCQl8fCAoY2FzdF90eXBlICYmIGNhcmQtPmluZm8uaXNfbXVsdGljYXN0X2RpZmZlcmVudCkgPworCQkJcWV0aF9nZXRfcHJpb3JpdHlfcXVldWUoY2FyZCwgc2tiLCBpcHYsIGNhc3RfdHlwZSkgOgorCQkJY2FyZC0+cWRpby5kZWZhdWx0X291dF9xdWV1ZV07CiAJaW50IHR4X2J5dGVzID0gc2tiLT5sZW47CiAJYm9vbCBsYXJnZV9zZW5kOwogCWludCBkYXRhX29mZnNldCA9IC0xOwpAQCAtMzI5OCw3ICszMzAxLDcgQEAKIAljYXJkLT5kZXYtPm1sX3ByaXYgPSBjYXJkOwogCWNhcmQtPmRldi0+d2F0Y2hkb2dfdGltZW8gPSBRRVRIX1RYX1RJTUVPVVQ7CiAJY2FyZC0+ZGV2LT5tdHUgPSBjYXJkLT5pbmZvLmluaXRpYWxfbXR1OwotCVNFVF9FVEhUT09MX09QUyhjYXJkLT5kZXYsICZxZXRoX2wzX2V0aHRvb2xfb3BzKTsKKwljYXJkLT5kZXYtPmV0aHRvb2xfb3BzID0gJnFldGhfbDNfZXRodG9vbF9vcHM7CiAJY2FyZC0+ZGV2LT5mZWF0dXJlcyB8PQlORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CiAJCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAogCQkJCU5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggMDI4MzJkNi4uYmFjYTU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTE3NzMsNiArMTc3Myw3IEBACiBjb25maWcgU0NTSV9WSVJUSU8KIAl0cmlzdGF0ZSAidmlydGlvLXNjc2kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFZJUlRJTworCXNlbGVjdCBCTEtfREVWX0lOVEVHUklUWQogCWhlbHAKICAgICAgICAgICBUaGlzIGlzIHRoZSB2aXJ0dWFsIEhCQSBkcml2ZXIgZm9yIHZpcnRpby4gIElmIHRoZSBrZXJuZWwgd2lsbAogICAgICAgICAgIGJlIHVzZWQgaW4gYSB2aXJ0dWFsIG1hY2hpbmUsIHNheSBZIG9yIE0uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKaW5kZXggMTE4NTQ4NC4uYTY2OWYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJc2stPnNrX2RhdGFfcmVhZHkgICA9IHRjcF9zd19jb25uLT5vbGRfZGF0YV9yZWFkeTsKIAlzay0+c2tfc3RhdGVfY2hhbmdlID0gdGNwX3N3X2Nvbm4tPm9sZF9zdGF0ZV9jaGFuZ2U7CiAJc2stPnNrX3dyaXRlX3NwYWNlICA9IHRjcF9zd19jb25uLT5vbGRfd3JpdGVfc3BhY2U7Ci0Jc2stPnNrX25vX2NoZWNrCSA9IDA7CisJc2stPnNrX25vX2NoZWNrX3R4ID0gMDsKIAl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCBlY2Q3YmQzLi4zZDFiYzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGFzay0+c2M7CiAJc3RydWN0IGlzY3NpX3Njc2lfcmVxICpoZHI7Ci0JdW5zaWduZWQgaGRybGVuZ3RoLCBjbWRfbGVuOworCXVuc2lnbmVkIGhkcmxlbmd0aCwgY21kX2xlbiwgdHJhbnNmZXJfbGVuZ3RoOwogCWl0dF90IGl0dDsKIAlpbnQgcmM7CiAKQEAgLTM5MSwxMSArMzkxLDExIEBACiAJaWYgKHNjc2lfZ2V0X3Byb3Rfb3Aoc2MpICE9IFNDU0lfUFJPVF9OT1JNQUwpCiAJCXRhc2stPnByb3RlY3RlZCA9IHRydWU7CiAKKwl0cmFuc2Zlcl9sZW5ndGggPSBzY3NpX3RyYW5zZmVyX2xlbmd0aChzYyk7CisJaGRyLT5kYXRhX2xlbmd0aCA9IGNwdV90b19iZTMyKHRyYW5zZmVyX2xlbmd0aCk7CiAJaWYgKHNjLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7Ci0JCXVuc2lnbmVkIG91dF9sZW4gPSBzY3NpX291dChzYyktPmxlbmd0aDsKIAkJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQgPSAmdGFzay0+dW5zb2xfcjJ0OwogCi0JCWhkci0+ZGF0YV9sZW5ndGggPSBjcHVfdG9fYmUzMihvdXRfbGVuKTsKIAkJaGRyLT5mbGFncyB8PSBJU0NTSV9GTEFHX0NNRF9XUklURTsKIAkJLyoKIAkJICogV3JpdGUgY291bnRlcnM6CkBAIC00MTQsMTggKzQxNCwxOSBAQAogCQltZW1zZXQocjJ0LCAwLCBzaXplb2YoKnIydCkpOwogCiAJCWlmIChzZXNzaW9uLT5pbW1fZGF0YV9lbikgewotCQkJaWYgKG91dF9sZW4gPj0gc2Vzc2lvbi0+Zmlyc3RfYnVyc3QpCisJCQlpZiAodHJhbnNmZXJfbGVuZ3RoID49IHNlc3Npb24tPmZpcnN0X2J1cnN0KQogCQkJCXRhc2stPmltbV9jb3VudCA9IG1pbihzZXNzaW9uLT5maXJzdF9idXJzdCwKIAkJCQkJCQljb25uLT5tYXhfeG1pdF9kbGVuZ3RoKTsKIAkJCWVsc2UKLQkJCQl0YXNrLT5pbW1fY291bnQgPSBtaW4ob3V0X2xlbiwKLQkJCQkJCQljb25uLT5tYXhfeG1pdF9kbGVuZ3RoKTsKKwkJCQl0YXNrLT5pbW1fY291bnQgPSBtaW4odHJhbnNmZXJfbGVuZ3RoLAorCQkJCQkJICAgICAgY29ubi0+bWF4X3htaXRfZGxlbmd0aCk7CiAJCQlodG9uMjQoaGRyLT5kbGVuZ3RoLCB0YXNrLT5pbW1fY291bnQpOwogCQl9IGVsc2UKIAkJCXplcm9fZGF0YShoZHItPmRsZW5ndGgpOwogCiAJCWlmICghc2Vzc2lvbi0+aW5pdGlhbF9yMnRfZW4pIHsKLQkJCXIydC0+ZGF0YV9sZW5ndGggPSBtaW4oc2Vzc2lvbi0+Zmlyc3RfYnVyc3QsIG91dF9sZW4pIC0KKwkJCXIydC0+ZGF0YV9sZW5ndGggPSBtaW4oc2Vzc2lvbi0+Zmlyc3RfYnVyc3QsCisJCQkJCSAgICAgICB0cmFuc2Zlcl9sZW5ndGgpIC0KIAkJCQkJICAgICAgIHRhc2stPmltbV9jb3VudDsKIAkJCXIydC0+ZGF0YV9vZmZzZXQgPSB0YXNrLT5pbW1fY291bnQ7CiAJCQlyMnQtPnR0dCA9IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRyk7CkBAIC00MzgsNyArNDM5LDYgQEAKIAl9IGVsc2UgewogCQloZHItPmZsYWdzIHw9IElTQ1NJX0ZMQUdfQ01EX0ZJTkFMOwogCQl6ZXJvX2RhdGEoaGRyLT5kbGVuZ3RoKTsKLQkJaGRyLT5kYXRhX2xlbmd0aCA9IGNwdV90b19iZTMyKHNjc2lfaW4oc2MpLT5sZW5ndGgpOwogCiAJCWlmIChzYy0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQogCQkJaGRyLT5mbGFncyB8PSBJU0NTSV9GTEFHX0NNRF9SRUFEOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJCQkgIHNjc2lfYmlkaV9jbW5kKHNjKSA/ICJiaWRpcmVjdGlvbmFsIiA6CiAJCQkgIHNjLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFID8KIAkJCSAgIndyaXRlIiA6ICJyZWFkIiwgY29ubi0+aWQsIHNjLCBzYy0+Y21uZFswXSwKLQkJCSAgdGFzay0+aXR0LCBzY3NpX2J1ZmZsZW4oc2MpLAorCQkJICB0YXNrLT5pdHQsIHRyYW5zZmVyX2xlbmd0aCwKIAkJCSAgc2NzaV9iaWRpX2NtbmQoc2MpID8gc2NzaV9pbihzYyktPmxlbmd0aCA6IDAsCiAJCQkgIHNlc3Npb24tPmNtZHNuLAogCQkJICBzZXNzaW9uLT5tYXhfY21kc24gLSBzZXNzaW9uLT5leHBfY21kc24gKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuYwppbmRleCBiMWQxMGY5Li44ZDg1ZWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdGFyZ2V0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5jCkBAIC0xMDQsNyArMTA0LDYgQEAKIC8qCiAgKiBHbG9iYWwgVmFyaWFibGVzCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcWxhX3RndF9jbWRfY2FjaGVwOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpxbGFfdGd0X21nbXRfY21kX2NhY2hlcDsKIHN0YXRpYyBtZW1wb29sX3QgKnFsYV90Z3RfbWdtdF9jbWRfbWVtcG9vbDsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcWxhX3RndF93cTsKQEAgLTI3MDUsNiArMjcwNCw4IEBACiAKIHZvaWQgcWx0X2ZyZWVfY21kKHN0cnVjdCBxbGFfdGd0X2NtZCAqY21kKQogeworCXN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3MgPSBjbWQtPnNlc3M7CisKIAlxbF9kYmcocWxfZGJnX3RndCwgY21kLT52aGEsIDB4ZTA3NCwKIAkgICAgIiVzOiBzZV9jbWRbJXBdIG94X2lkICUwNHhcbiIsCiAJICAgIF9fZnVuY19fLCAmY21kLT5zZV9jbWQsCkBAIC0yNzEzLDcgKzI3MTQsMTIgQEAKIAlCVUdfT04oY21kLT5zZ19tYXBwZWQpOwogCWlmICh1bmxpa2VseShjbWQtPmZyZWVfc2cpKQogCQlrZnJlZShjbWQtPnNnKTsKLQlrbWVtX2NhY2hlX2ZyZWUocWxhX3RndF9jbWRfY2FjaGVwLCBjbWQpOworCisJaWYgKCFzZXNzIHx8ICFzZXNzLT5zZV9zZXNzKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJcGVyY3B1X2lkYV9mcmVlKCZzZXNzLT5zZV9zZXNzLT5zZXNzX3RhZ19wb29sLCBjbWQtPnNlX2NtZC5tYXBfdGFnKTsKIH0KIEVYUE9SVF9TWU1CT0wocWx0X2ZyZWVfY21kKTsKIApAQCAtMzA3NSwxMyArMzA4MSwxMiBAQAogLyoKICAqIFByb2Nlc3MgY29udGV4dCBmb3IgSS9PIHBhdGggaW50byB0Y21fcWxhMnh4eCBjb2RlCiAgKi8KLXN0YXRpYyB2b2lkIHFsdF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIF9fcWx0X2RvX3dvcmsoc3RydWN0IHFsYV90Z3RfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHFsYV90Z3RfY21kICpjbWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsYV90Z3RfY21kLCB3b3JrKTsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGNtZC0+dmhhOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBxbGFfdGd0ICp0Z3QgPSB2aGEtPnZoYV90Z3QucWxhX3RndDsKLQlzdHJ1Y3QgcWxhX3RndF9zZXNzICpzZXNzID0gTlVMTDsKKwlzdHJ1Y3QgcWxhX3RndF9zZXNzICpzZXNzID0gY21kLT5zZXNzOwogCXN0cnVjdCBhdGlvX2Zyb21faXNwICphdGlvID0gJmNtZC0+YXRpbzsKIAl1bnNpZ25lZCBjaGFyICpjZGI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMwOTEsNDEgKzMwOTYsNiBAQAogCWlmICh0Z3QtPnRndF9zdG9wKQogCQlnb3RvIG91dF90ZXJtOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0Jc2VzcyA9IGhhLT50Z3QudGd0X29wcy0+ZmluZF9zZXNzX2J5X3NfaWQodmhhLAotCSAgICBhdGlvLT51LmlzcDI0LmZjcF9oZHIuc19pZCk7Ci0JLyogRG8ga3JlZl9nZXQoKSBiZWZvcmUgZHJvcHBpbmcgcWxhX2h3X2RhdGEtPmhhcmR3YXJlX2xvY2suICovCi0JaWYgKHNlc3MpCi0JCWtyZWZfZ2V0KCZzZXNzLT5zZV9zZXNzLT5zZXNzX2tyZWYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAodW5saWtlbHkoIXNlc3MpKSB7Ci0JCXVpbnQ4X3QgKnNfaWQgPQlhdGlvLT51LmlzcDI0LmZjcF9oZHIuc19pZDsKLQotCQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDIyLAotCQkJInFsYV90YXJnZXQoJWQpOiBVbmFibGUgdG8gZmluZCB3d24gbG9naW4iCi0JCQkiIChzX2lkICV4OiV4OiV4KSwgdHJ5aW5nIHRvIGNyZWF0ZSBpdCBtYW51YWxseVxuIiwKLQkJCXZoYS0+dnBfaWR4LCBzX2lkWzBdLCBzX2lkWzFdLCBzX2lkWzJdKTsKLQotCQlpZiAoYXRpby0+dS5yYXcuZW50cnlfY291bnQgPiAxKSB7Ci0JCQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDIzLAotCQkJCSJEcm9wcGluZyBtdWx0eSBlbnRyeSBjbWQgJXBcbiIsIGNtZCk7Ci0JCQlnb3RvIG91dF90ZXJtOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmdmhhLT52aGFfdGd0LnRndF9tdXRleCk7Ci0JCXNlc3MgPSBxbHRfbWFrZV9sb2NhbF9zZXNzKHZoYSwgc19pZCk7Ci0JCS8qIHNlc3MgaGFzIGFuIGV4dHJhIGNyZWF0aW9uIHJlZi4gKi8KLQkJbXV0ZXhfdW5sb2NrKCZ2aGEtPnZoYV90Z3QudGd0X211dGV4KTsKLQotCQlpZiAoIXNlc3MpCi0JCQlnb3RvIG91dF90ZXJtOwotCX0KLQotCWNtZC0+c2VzcyA9IHNlc3M7Ci0JY21kLT5sb29wX2lkID0gc2Vzcy0+bG9vcF9pZDsKLQljbWQtPmNvbmZfY29tcGxfc3VwcG9ydGVkID0gc2Vzcy0+Y29uZl9jb21wbF9zdXBwb3J0ZWQ7Ci0KIAljZGIgPSAmYXRpby0+dS5pc3AyNC5mY3BfY21uZC5jZGJbMF07CiAJY21kLT50YWcgPSBhdGlvLT51LmlzcDI0LmV4Y2hhbmdlX2FkZHI7CiAJY21kLT51bnBhY2tlZF9sdW4gPSBzY3NpbHVuX3RvX2ludCgKQEAgLTMxNTMsOCArMzEyMyw4IEBACiAJCWNtZCwgJmNtZC0+c2VfY21kLCBjbWQtPnVucGFja2VkX2x1biwgY21kLT50YWcsIGRhdGFfbGVuZ3RoLAogCQljbWQtPmF0aW8udS5pc3AyNC5mY3BfaGRyLm94X2lkKTsKIAotCXJldCA9IHZoYS0+aHctPnRndC50Z3Rfb3BzLT5oYW5kbGVfY21kKHZoYSwgY21kLCBjZGIsIGRhdGFfbGVuZ3RoLAotCSAgICBmY3BfdGFza19hdHRyLCBkYXRhX2RpciwgYmlkaSk7CisJcmV0ID0gaGEtPnRndC50Z3Rfb3BzLT5oYW5kbGVfY21kKHZoYSwgY21kLCBjZGIsIGRhdGFfbGVuZ3RoLAorCQkJCSAgICAgICAgICBmY3BfdGFza19hdHRyLCBkYXRhX2RpciwgYmlkaSk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIG91dF90ZXJtOwogCS8qCkBAIC0zMTczLDE3ICszMTQzLDExNCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXFsdF9zZW5kX3Rlcm1fZXhjaGFuZ2UodmhhLCBOVUxMLCAmY21kLT5hdGlvLCAxKTsKLQlrbWVtX2NhY2hlX2ZyZWUocWxhX3RndF9jbWRfY2FjaGVwLCBjbWQpOwotCWlmIChzZXNzKQotCQloYS0+dGd0LnRndF9vcHMtPnB1dF9zZXNzKHNlc3MpOworCXBlcmNwdV9pZGFfZnJlZSgmc2Vzcy0+c2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgY21kLT5zZV9jbWQubWFwX3RhZyk7CisJaGEtPnRndC50Z3Rfb3BzLT5wdXRfc2VzcyhzZXNzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBxbHRfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHFsYV90Z3RfY21kICpjbWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsYV90Z3RfY21kLCB3b3JrKTsKKworCV9fcWx0X2RvX3dvcmsoY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBxbGFfdGd0X2NtZCAqcWx0X2dldF90YWcoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJCQkJICAgICAgIHN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3MsCisJCQkJICAgICAgIHN0cnVjdCBhdGlvX2Zyb21faXNwICphdGlvKQoreworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gc2Vzcy0+c2Vfc2VzczsKKwlzdHJ1Y3QgcWxhX3RndF9jbWQgKmNtZDsKKwlpbnQgdGFnOworCisJdGFnID0gcGVyY3B1X2lkYV9hbGxvYygmc2Vfc2Vzcy0+c2Vzc190YWdfcG9vbCwgVEFTS19SVU5OSU5HKTsKKwlpZiAodGFnIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbWQgPSAmKChzdHJ1Y3QgcWxhX3RndF9jbWQgKilzZV9zZXNzLT5zZXNzX2NtZF9tYXApW3RhZ107CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBxbGFfdGd0X2NtZCkpOworCisJbWVtY3B5KCZjbWQtPmF0aW8sIGF0aW8sIHNpemVvZigqYXRpbykpOworCWNtZC0+c3RhdGUgPSBRTEFfVEdUX1NUQVRFX05FVzsKKwljbWQtPnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OworCWNtZC0+dmhhID0gdmhhOworCWNtZC0+c2VfY21kLm1hcF90YWcgPSB0YWc7CisJY21kLT5zZXNzID0gc2VzczsKKwljbWQtPmxvb3BfaWQgPSBzZXNzLT5sb29wX2lkOworCWNtZC0+Y29uZl9jb21wbF9zdXBwb3J0ZWQgPSBzZXNzLT5jb25mX2NvbXBsX3N1cHBvcnRlZDsKKworCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyB2b2lkIHFsdF9zZW5kX2J1c3koc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IGF0aW9fZnJvbV9pc3AgKiwKKwkJCSAgdWludDE2X3QpOworCitzdGF0aWMgdm9pZCBxbHRfY3JlYXRlX3Nlc3NfZnJvbV9hdGlvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcWxhX3RndF9zZXNzX29wICpvcCA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQlzdHJ1Y3QgcWxhX3RndF9zZXNzX29wLCB3b3JrKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IG9wLT52aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHFsYV90Z3Rfc2VzcyAqc2VzczsKKwlzdHJ1Y3QgcWxhX3RndF9jbWQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQ4X3QgKnNfaWQgPSBvcC0+YXRpby51LmlzcDI0LmZjcF9oZHIuc19pZDsKKworCXFsX2RiZyhxbF9kYmdfdGd0X21ndCwgdmhhLCAweGYwMjIsCisJCSJxbGFfdGFyZ2V0KCVkKTogVW5hYmxlIHRvIGZpbmQgd3duIGxvZ2luIgorCQkiIChzX2lkICV4OiV4OiV4KSwgdHJ5aW5nIHRvIGNyZWF0ZSBpdCBtYW51YWxseVxuIiwKKwkJdmhhLT52cF9pZHgsIHNfaWRbMF0sIHNfaWRbMV0sIHNfaWRbMl0pOworCisJaWYgKG9wLT5hdGlvLnUucmF3LmVudHJ5X2NvdW50ID4gMSkgeworCQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDIzLAorCQkgICAgICAgICJEcm9wcGluZyBtdWx0eSBlbnRyeSBhdGlvICVwXG4iLCAmb3AtPmF0aW8pOworCQlnb3RvIG91dF90ZXJtOworCX0KKworCW11dGV4X2xvY2soJnZoYS0+dmhhX3RndC50Z3RfbXV0ZXgpOworCXNlc3MgPSBxbHRfbWFrZV9sb2NhbF9zZXNzKHZoYSwgc19pZCk7CisJLyogc2VzcyBoYXMgYW4gZXh0cmEgY3JlYXRpb24gcmVmLiAqLworCW11dGV4X3VubG9jaygmdmhhLT52aGFfdGd0LnRndF9tdXRleCk7CisKKwlpZiAoIXNlc3MpCisJCWdvdG8gb3V0X3Rlcm07CisJLyoKKwkgKiBOb3cgb2J0YWluIGEgcHJlLWFsbG9jYXRlZCBzZXNzaW9uIHRhZyB1c2luZyB0aGUgb3JpZ2luYWwgb3AtPmF0aW8KKwkgKiBwYWNrZXQgaGVhZGVyLCBhbmQgZGlzcGF0Y2ggaW50byBfX3FsdF9kb193b3JrKCkgdXNpbmcgdGhlIGV4aXN0aW5nCisJICogcHJvY2VzcyBjb250ZXh0LgorCSAqLworCWNtZCA9IHFsdF9nZXRfdGFnKHZoYSwgc2VzcywgJm9wLT5hdGlvKTsKKwlpZiAoIWNtZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJcWx0X3NlbmRfYnVzeSh2aGEsICZvcC0+YXRpbywgU0FNX1NUQVRfQlVTWSk7CisJCWhhLT50Z3QudGd0X29wcy0+cHV0X3Nlc3Moc2Vzcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCWtmcmVlKG9wKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIF9fcWx0X2RvX3dvcmsoKSB3aWxsIGNhbGwgaGEtPnRndC50Z3Rfb3BzLT5wdXRfc2VzcygpIHRvIHJlbGVhc2UKKwkgKiB0aGUgZXh0cmEgcmVmZXJlbmNlIHRha2VuIGFib3ZlIGJ5IHFsdF9tYWtlX2xvY2FsX3Nlc3MoKQorCSAqLworCV9fcWx0X2RvX3dvcmsoY21kKTsKKwlrZnJlZShvcCk7CisJcmV0dXJuOworCitvdXRfdGVybToKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlxbHRfc2VuZF90ZXJtX2V4Y2hhbmdlKHZoYSwgTlVMTCwgJm9wLT5hdGlvLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWtmcmVlKG9wKTsKKworfQorCiAvKiBoYS0+aGFyZHdhcmVfbG9jayBzdXBwb3NlZCB0byBiZSBoZWxkIG9uIGVudHJ5ICovCiBzdGF0aWMgaW50IHFsdF9oYW5kbGVfY21kX2Zvcl9hdGlvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCiAJc3RydWN0IGF0aW9fZnJvbV9pc3AgKmF0aW8pCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHFsYV90Z3QgKnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OworCXN0cnVjdCBxbGFfdGd0X3Nlc3MgKnNlc3M7CiAJc3RydWN0IHFsYV90Z3RfY21kICpjbWQ7CiAKIAlpZiAodW5saWtlbHkodGd0LT50Z3Rfc3RvcCkpIHsKQEAgLTMxOTIsMTggKzMyNTksMzEgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JY21kID0ga21lbV9jYWNoZV96YWxsb2MocWxhX3RndF9jbWRfY2FjaGVwLCBHRlBfQVRPTUlDKTsKKwlzZXNzID0gaGEtPnRndC50Z3Rfb3BzLT5maW5kX3Nlc3NfYnlfc19pZCh2aGEsIGF0aW8tPnUuaXNwMjQuZmNwX2hkci5zX2lkKTsKKwlpZiAodW5saWtlbHkoIXNlc3MpKSB7CisJCXN0cnVjdCBxbGFfdGd0X3Nlc3Nfb3AgKm9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFsYV90Z3Rfc2Vzc19vcCksCisJCQkJCQkgICAgIEdGUF9BVE9NSUMpOworCQlpZiAoIW9wKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KCZvcC0+YXRpbywgYXRpbywgc2l6ZW9mKCphdGlvKSk7CisJCUlOSVRfV09SSygmb3AtPndvcmssIHFsdF9jcmVhdGVfc2Vzc19mcm9tX2F0aW8pOworCQlxdWV1ZV93b3JrKHFsYV90Z3Rfd3EsICZvcC0+d29yayk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIERvIGtyZWZfZ2V0KCkgYmVmb3JlIHJldHVybmluZyArIGRyb3BwaW5nIHFsYV9od19kYXRhLT5oYXJkd2FyZV9sb2NrLgorCSAqLworCWtyZWZfZ2V0KCZzZXNzLT5zZV9zZXNzLT5zZXNzX2tyZWYpOworCisJY21kID0gcWx0X2dldF90YWcodmhhLCBzZXNzLCBhdGlvKTsKIAlpZiAoIWNtZCkgewogCQlxbF9kYmcocWxfZGJnX3RndF9tZ3QsIHZoYSwgMHhmMDVlLAogCQkgICAgInFsYV90YXJnZXQoJWQpOiBBbGxvY2F0aW9uIG9mIGNtZCBmYWlsZWRcbiIsIHZoYS0+dnBfaWR4KTsKKwkJaGEtPnRndC50Z3Rfb3BzLT5wdXRfc2VzcyhzZXNzKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtY3B5KCZjbWQtPmF0aW8sIGF0aW8sIHNpemVvZigqYXRpbykpOwotCWNtZC0+c3RhdGUgPSBRTEFfVEdUX1NUQVRFX05FVzsKLQljbWQtPnRndCA9IHZoYS0+dmhhX3RndC5xbGFfdGd0OwotCWNtZC0+dmhhID0gdmhhOwotCiAJSU5JVF9XT1JLKCZjbWQtPndvcmssIHFsdF9kb193b3JrKTsKIAlxdWV1ZV93b3JrKHFsYV90Z3Rfd3EsICZjbWQtPndvcmspOwogCXJldHVybiAwOwpAQCAtNTUwMSwyMyArNTU4MSwxMyBAQAogCWlmICghUUxBX1RHVF9NT0RFX0VOQUJMRUQoKSkKIAkJcmV0dXJuIDA7CiAKLQlxbGFfdGd0X2NtZF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicWxhX3RndF9jbWRfY2FjaGVwIiwKLQkgICAgc2l6ZW9mKHN0cnVjdCBxbGFfdGd0X2NtZCksIF9fYWxpZ25vZl9fKHN0cnVjdCBxbGFfdGd0X2NtZCksIDAsCi0JICAgIE5VTEwpOwotCWlmICghcWxhX3RndF9jbWRfY2FjaGVwKSB7Ci0JCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4ZTA2YywKLQkJICAgICJrbWVtX2NhY2hlX2NyZWF0ZSBmb3IgcWxhX3RndF9jbWRfY2FjaGVwIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXFsYV90Z3RfbWdtdF9jbWRfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInFsYV90Z3RfbWdtdF9jbWRfY2FjaGVwIiwKIAkgICAgc2l6ZW9mKHN0cnVjdCBxbGFfdGd0X21nbXRfY21kKSwgX19hbGlnbm9mX18oc3RydWN0CiAJICAgIHFsYV90Z3RfbWdtdF9jbWQpLCAwLCBOVUxMKTsKIAlpZiAoIXFsYV90Z3RfbWdtdF9jbWRfY2FjaGVwKSB7CiAJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4ZTA2ZCwKIAkJICAgICJrbWVtX2NhY2hlX2NyZWF0ZSBmb3IgcWxhX3RndF9tZ210X2NtZF9jYWNoZXAgZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXFsYV90Z3RfbWdtdF9jbWRfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlKDI1LCBtZW1wb29sX2FsbG9jX3NsYWIsCkBAIC01NTQ1LDggKzU2MTUsNiBAQAogCW1lbXBvb2xfZGVzdHJveShxbGFfdGd0X21nbXRfY21kX21lbXBvb2wpOwogb3V0X21nbXRfY21kX2NhY2hlcDoKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kocWxhX3RndF9tZ210X2NtZF9jYWNoZXApOwotb3V0OgotCWttZW1fY2FjaGVfZGVzdHJveShxbGFfdGd0X2NtZF9jYWNoZXApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU1NTgsNSArNTYyNiw0IEBACiAJZGVzdHJveV93b3JrcXVldWUocWxhX3RndF93cSk7CiAJbWVtcG9vbF9kZXN0cm95KHFsYV90Z3RfbWdtdF9jbWRfbWVtcG9vbCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHFsYV90Z3RfbWdtdF9jbWRfY2FjaGVwKTsKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kocWxhX3RndF9jbWRfY2FjaGVwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90YXJnZXQuaAppbmRleCBmODczZTEwLi41YzlmMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdGFyZ2V0LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RhcmdldC5oCkBAIC04NzAsNiArODcwLDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZCB0Z3RfbGlzdF9lbnRyeTsKIH07CiAKK3N0cnVjdCBxbGFfdGd0X3Nlc3Nfb3AgeworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGE7CisJc3RydWN0IGF0aW9fZnJvbV9pc3AgYXRpbzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKIC8qCiAgKiBFcXVpdmlsYW50IHRvIElUIE5leHVzIChJbml0aWF0b3ItVGFyZ2V0KQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguYwppbmRleCA4OTZjYjIzLi5lMmJlYWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmMKQEAgLTE1MDEsNiArMTUwMSw4IEBACiAJc3RydWN0IHFsYV90Z3Rfc2VzcyAqc2VzcyA9IHFsYV90Z3Rfc2VzczsKIAl1bnNpZ25lZCBjaGFyIHBvcnRfbmFtZVszNl07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbnVtX3RhZ3MgPSAoaGEtPmZ3X3hjYl9jb3VudCkgPyBoYS0+ZndfeGNiX2NvdW50IDoKKwkJICAgICAgIFRDTV9RTEEyWFhYX0RFRkFVTFRfVEFHUzsKIAogCWxwb3J0ID0gdmhhLT52aGFfdGd0LnRhcmdldF9scG9ydF9wdHI7CiAJaWYgKCFscG9ydCkgewpAQCAtMTUxOCw3ICsxNTIwLDkgQEAKIAl9CiAJc2VfdHBnID0gJnRwZy0+c2VfdHBnOwogCi0Jc2Vfc2VzcyA9IHRyYW5zcG9ydF9pbml0X3Nlc3Npb24oVEFSR0VUX1BST1RfTk9STUFMKTsKKwlzZV9zZXNzID0gdHJhbnNwb3J0X2luaXRfc2Vzc2lvbl90YWdzKG51bV90YWdzLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHFsYV90Z3RfY21kKSwKKwkJCQkJICAgICAgVEFSR0VUX1BST1RfTk9STUFMKTsKIAlpZiAoSVNfRVJSKHNlX3Nlc3MpKSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgc3RydWN0IHNlX3Nlc3Npb25cbiIpOwogCQlyZXR1cm4gUFRSX0VSUihzZV9zZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5oCmluZGV4IDMzYWFhYzguLjEwYzAwMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguaApAQCAtNCw2ICs0LDExIEBACiAjZGVmaW5lIFRDTV9RTEEyWFhYX1ZFUlNJT04JInYwLjEiCiAvKiBsZW5ndGggb2YgQVNDSUkgV1dQTnMgaW5jbHVkaW5nIHBhZCAqLwogI2RlZmluZSBUQ01fUUxBMlhYWF9OQU1FTEVOCTMyCisvKgorICogTnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgcGVyLXNlc3Npb24gdGFncywgYmFzZWQgdXBvbiB0aGUgd29yc3QtY2FzZQorICogcGVyIHBvcnQgbnVtYmVyIG9mIGlvY2JzCisgKi8KKyNkZWZpbmUgVENNX1FMQTJYWFhfREVGQVVMVF9UQUdTIDIwODgKIAogI2luY2x1ZGUgInFsYV90YXJnZXQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvdmlydGlvX3Njc2kuYwppbmRleCA5OWZkYjk0Li44OWVlNTkyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX3Njc2kuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtMzcsNiArMzgsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uICpjb21wOwogCXVuaW9uIHsKIAkJc3RydWN0IHZpcnRpb19zY3NpX2NtZF9yZXEgICAgICAgY21kOworCQlzdHJ1Y3QgdmlydGlvX3Njc2lfY21kX3JlcV9waSAgICBjbWRfcGk7CiAJCXN0cnVjdCB2aXJ0aW9fc2NzaV9jdHJsX3RtZl9yZXEgIHRtZjsKIAkJc3RydWN0IHZpcnRpb19zY3NpX2N0cmxfYW5fcmVxICAgYW47CiAJfSByZXE7CkBAIC0zOTksNyArNDAxLDcgQEAKIAkJCSAgICBzaXplX3QgcmVxX3NpemUsIHNpemVfdCByZXNwX3NpemUpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqc2MgPSBjbWQtPnNjOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dzWzRdLCByZXEsIHJlc3A7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3NbNl0sIHJlcSwgcmVzcDsKIAlzdHJ1Y3Qgc2dfdGFibGUgKm91dCwgKmluOwogCXVuc2lnbmVkIG91dF9udW0gPSAwLCBpbl9udW0gPSAwOwogCkBAIC00MTcsMTYgKzQxOSwyNCBAQAogCXNnc1tvdXRfbnVtKytdID0gJnJlcTsKIAogCS8qIERhdGEtb3V0IGJ1ZmZlci4gICovCi0JaWYgKG91dCkKKwlpZiAob3V0KSB7CisJCS8qIFBsYWNlIFdSSVRFIHByb3RlY3Rpb24gU0dMcyBiZWZvcmUgRGF0YSBPVVQgcGF5bG9hZCAqLworCQlpZiAoc2NzaV9wcm90X3NnX2NvdW50KHNjKSkKKwkJCXNnc1tvdXRfbnVtKytdID0gc2NzaV9wcm90X3NnbGlzdChzYyk7CiAJCXNnc1tvdXRfbnVtKytdID0gb3V0LT5zZ2w7CisJfQogCiAJLyogUmVzcG9uc2UgaGVhZGVyLiAgKi8KIAlzZ19pbml0X29uZSgmcmVzcCwgJmNtZC0+cmVzcCwgcmVzcF9zaXplKTsKIAlzZ3Nbb3V0X251bSArIGluX251bSsrXSA9ICZyZXNwOwogCiAJLyogRGF0YS1pbiBidWZmZXIgKi8KLQlpZiAoaW4pCisJaWYgKGluKSB7CisJCS8qIFBsYWNlIFJFQUQgcHJvdGVjdGlvbiBTR0xzIGJlZm9yZSBEYXRhIElOIHBheWxvYWQgKi8KKwkJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChzYykpCisJCQlzZ3Nbb3V0X251bSArIGluX251bSsrXSA9IHNjc2lfcHJvdF9zZ2xpc3Qoc2MpOwogCQlzZ3Nbb3V0X251bSArIGluX251bSsrXSA9IGluLT5zZ2w7CisJfQogCiAJcmV0dXJuIHZpcnRxdWV1ZV9hZGRfc2dzKHZxLCBzZ3MsIG91dF9udW0sIGluX251bSwgY21kLCBHRlBfQVRPTUlDKTsKIH0KQEAgLTQ1MSwxMiArNDYxLDQ1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgdmlydGlvX3Njc2lfaW5pdF9oZHIoc3RydWN0IHZpcnRpb19zY3NpX2NtZF9yZXEgKmNtZCwKKwkJCQkgc3RydWN0IHNjc2lfY21uZCAqc2MpCit7CisJY21kLT5sdW5bMF0gPSAxOworCWNtZC0+bHVuWzFdID0gc2MtPmRldmljZS0+aWQ7CisJY21kLT5sdW5bMl0gPSAoc2MtPmRldmljZS0+bHVuID4+IDgpIHwgMHg0MDsKKwljbWQtPmx1blszXSA9IHNjLT5kZXZpY2UtPmx1biAmIDB4ZmY7CisJY21kLT50YWcgPSAodW5zaWduZWQgbG9uZylzYzsKKwljbWQtPnRhc2tfYXR0ciA9IFZJUlRJT19TQ1NJX1NfU0lNUExFOworCWNtZC0+cHJpbyA9IDA7CisJY21kLT5jcm4gPSAwOworfQorCitzdGF0aWMgdm9pZCB2aXJ0aW9fc2NzaV9pbml0X2hkcl9waShzdHJ1Y3QgdmlydGlvX3Njc2lfY21kX3JlcV9waSAqY21kX3BpLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBzYy0+cmVxdWVzdDsKKwlzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmk7CisKKwl2aXJ0aW9fc2NzaV9pbml0X2hkcigoc3RydWN0IHZpcnRpb19zY3NpX2NtZF9yZXEgKiljbWRfcGksIHNjKTsKKworCWlmICghcnEgfHwgIXNjc2lfcHJvdF9zZ19jb3VudChzYykpCisJCXJldHVybjsKKworCWJpID0gYmxrX2dldF9pbnRlZ3JpdHkocnEtPnJxX2Rpc2spOworCisJaWYgKHNjLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQljbWRfcGktPnBpX2J5dGVzb3V0ID0gYmxrX3JxX3NlY3RvcnMocnEpICogYmktPnR1cGxlX3NpemU7CisJZWxzZSBpZiAoc2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJY21kX3BpLT5waV9ieXRlc2luID0gYmxrX3JxX3NlY3RvcnMocnEpICogYmktPnR1cGxlX3NpemU7Cit9CisKIHN0YXRpYyBpbnQgdmlydHNjc2lfcXVldWVjb21tYW5kKHN0cnVjdCB2aXJ0aW9fc2NzaSAqdnNjc2ksCiAJCQkJIHN0cnVjdCB2aXJ0aW9fc2NzaV92cSAqcmVxX3ZxLAogCQkJCSBzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZpcnRpb19zY3NpX2hvc3QodnNjc2ktPnZkZXYpOwogCXN0cnVjdCB2aXJ0aW9fc2NzaV9jbWQgKmNtZCA9IHNjc2lfY21kX3ByaXYoc2MpOworCWludCByZXFfc2l6ZTsKIAogCUJVR19PTihzY3NpX3NnX2NvdW50KHNjKSA+IHNob3N0LT5zZ190YWJsZXNpemUpOwogCkBAIC00NjgsMjIgKzUxMSwyMCBAQAogCiAJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKIAljbWQtPnNjID0gc2M7Ci0JY21kLT5yZXEuY21kID0gKHN0cnVjdCB2aXJ0aW9fc2NzaV9jbWRfcmVxKXsKLQkJLmx1blswXSA9IDEsCi0JCS5sdW5bMV0gPSBzYy0+ZGV2aWNlLT5pZCwKLQkJLmx1blsyXSA9IChzYy0+ZGV2aWNlLT5sdW4gPj4gOCkgfCAweDQwLAotCQkubHVuWzNdID0gc2MtPmRldmljZS0+bHVuICYgMHhmZiwKLQkJLnRhZyA9ICh1bnNpZ25lZCBsb25nKXNjLAotCQkudGFza19hdHRyID0gVklSVElPX1NDU0lfU19TSU1QTEUsCi0JCS5wcmlvID0gMCwKLQkJLmNybiA9IDAsCi0JfTsKIAogCUJVR19PTihzYy0+Y21kX2xlbiA+IFZJUlRJT19TQ1NJX0NEQl9TSVpFKTsKLQltZW1jcHkoY21kLT5yZXEuY21kLmNkYiwgc2MtPmNtbmQsIHNjLT5jbWRfbGVuKTsKIAotCWlmICh2aXJ0c2NzaV9raWNrX2NtZChyZXFfdnEsIGNtZCwKLQkJCSAgICAgIHNpemVvZiBjbWQtPnJlcS5jbWQsIHNpemVvZiBjbWQtPnJlc3AuY21kKSAhPSAwKQorCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodnNjc2ktPnZkZXYsIFZJUlRJT19TQ1NJX0ZfVDEwX1BJKSkgeworCQl2aXJ0aW9fc2NzaV9pbml0X2hkcl9waSgmY21kLT5yZXEuY21kX3BpLCBzYyk7CisJCW1lbWNweShjbWQtPnJlcS5jbWRfcGkuY2RiLCBzYy0+Y21uZCwgc2MtPmNtZF9sZW4pOworCQlyZXFfc2l6ZSA9IHNpemVvZihjbWQtPnJlcS5jbWRfcGkpOworCX0gZWxzZSB7CisJCXZpcnRpb19zY3NpX2luaXRfaGRyKCZjbWQtPnJlcS5jbWQsIHNjKTsKKwkJbWVtY3B5KGNtZC0+cmVxLmNtZC5jZGIsIHNjLT5jbW5kLCBzYy0+Y21kX2xlbik7CisJCXJlcV9zaXplID0gc2l6ZW9mKGNtZC0+cmVxLmNtZCk7CisJfQorCisJaWYgKHZpcnRzY3NpX2tpY2tfY21kKHJlcV92cSwgY21kLCByZXFfc2l6ZSwgc2l6ZW9mKGNtZC0+cmVzcC5jbWQpKSAhPSAwKQogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgyMCw3ICs4NjEsNyBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCXN0cnVjdCB2aXJ0aW9fc2NzaSAqdnNjc2k7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBob3N0X3Byb3Q7CiAJdTMyIHNnX2VsZW1zLCBudW1fdGFyZ2V0czsKIAl1MzIgY21kX3Blcl9sdW47CiAJdTMyIG51bV9xdWV1ZXM7CkBAIC04NzAsNiArOTExLDE2IEBACiAJc2hvc3QtPm1heF9pZCA9IG51bV90YXJnZXRzOwogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CiAJc2hvc3QtPm1heF9jbWRfbGVuID0gVklSVElPX1NDU0lfQ0RCX1NJWkU7CisKKwlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19TQ1NJX0ZfVDEwX1BJKSkgeworCQlob3N0X3Byb3QgPSBTSE9TVF9ESUZfVFlQRTFfUFJPVEVDVElPTiB8IFNIT1NUX0RJRl9UWVBFMl9QUk9URUNUSU9OIHwKKwkJCSAgICBTSE9TVF9ESUZfVFlQRTNfUFJPVEVDVElPTiB8IFNIT1NUX0RJWF9UWVBFMV9QUk9URUNUSU9OIHwKKwkJCSAgICBTSE9TVF9ESVhfVFlQRTJfUFJPVEVDVElPTiB8IFNIT1NUX0RJWF9UWVBFM19QUk9URUNUSU9OOworCisJCXNjc2lfaG9zdF9zZXRfcHJvdChzaG9zdCwgaG9zdF9wcm90KTsKKwkJc2NzaV9ob3N0X3NldF9ndWFyZChzaG9zdCwgU0hPU1RfRElYX0dVQVJEX0NSQyk7CisJfQorCiAJZXJyID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgJnZkZXYtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBzY3NpX2FkZF9ob3N0X2ZhaWxlZDsKQEAgLTkzOSw2ICs5OTAsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBmZWF0dXJlc1tdID0gewogCVZJUlRJT19TQ1NJX0ZfSE9UUExVRywKIAlWSVJUSU9fU0NTSV9GX0NIQU5HRSwKKwlWSVJUSU9fU0NTSV9GX1QxMF9QSSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2RyaXZlciB2aXJ0aW9fc2NzaV9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguYwppbmRleCAwOTAxZWY1Li4wODM1NmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKQEAgLTQ2MDUsNyArNDYwNSw3IEBACiAJbmV0ZGV2LT5uZXRkZXZfb3BzICAgICA9ICZldDEzMXhfbmV0ZGV2X29wczsKIAogCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmV0MTMxeF9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZldDEzMXhfZXRodG9vbF9vcHM7CiAKIAlhZGFwdGVyID0gZXQxMzF4X2FkYXB0ZXJfaW5pdChuZXRkZXYsIHBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKaW5kZXggZDY0MjFiOS4uYTYxNThiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYwpAQCAtMjI0OSw3ICsyMjQ5LDcgQEAKIAogCWZ0MTAwMEluaXRQcm9jKGRldik7CiAJZnQxMDAwX2NhcmRfcHJlc2VudCA9IDE7Ci0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZvcHM7CiAJcHJpbnRrKEtFUk5fSU5GTyAiZnQxMDAwOiAlczogYWRkciAweCUwNGx4IGlycSAlZCwgTUFDIGFkZHIgJXBNXG4iLAogCQkJZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGRldi0+ZGV2X2FkZHIpOwogCXJldHVybiBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZwppbmRleCBjNmU4YmE3Li44MmZiNzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL0tjb25maWcKQEAgLTM5LDE5ICszOSwxMCBAQAogCSAgQ2hvb3NlIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRlcm5hbCBMVkRTIERpc3BsYXkgQnJpZGdlIChMREIpCiAJICBmb3VuZCBvbiBpLk1YNTMgYW5kIGkuTVg2IHByb2Nlc3NvcnMuCiAKLWNvbmZpZyBEUk1fSU1YX0lQVVYzX0NPUkUKLQl0cmlzdGF0ZSAiSVBVdjMgY29yZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gRFJNX0lNWAotCWRlcGVuZHMgb24gUkVTRVRfQ09OVFJPTExFUgotCWhlbHAKLQkgIENob29zZSB0aGlzIGlmIHlvdSBoYXZlIGEgaS5NWDUvNiBzeXN0ZW0gYW5kIHdhbnQKLQkgIHRvIHVzZSB0aGUgSVBVLiBUaGlzIG9wdGlvbiBvbmx5IGVuYWJsZXMgSVBVIGJhc2UKLQkgIHN1cHBvcnQuCi0KIGNvbmZpZyBEUk1fSU1YX0lQVVYzCiAJdHJpc3RhdGUgIkRSTSBTdXBwb3J0IGZvciBpLk1YIElQVXYzIgogCWRlcGVuZHMgb24gRFJNX0lNWAotCWRlcGVuZHMgb24gRFJNX0lNWF9JUFVWM19DT1JFCisJZGVwZW5kcyBvbiBJTVhfSVBVVjNfQ09SRQogCWhlbHAKIAkgIENob29zZSB0aGlzIGlmIHlvdSBoYXZlIGEgaS5NWDUgb3IgaS5NWDYgcHJvY2Vzc29yLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCmluZGV4IDEyOWUzYTMuLjU4MmM0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCkBAIC02LDcgKzYsNiBAQAogb2JqLSQoQ09ORklHX0RSTV9JTVhfUEFSQUxMRUxfRElTUExBWSkgKz0gcGFyYWxsZWwtZGlzcGxheS5vCiBvYmotJChDT05GSUdfRFJNX0lNWF9UVkUpICs9IGlteC10dmUubwogb2JqLSQoQ09ORklHX0RSTV9JTVhfTERCKSArPSBpbXgtbGRiLm8KLW9iai0kKENPTkZJR19EUk1fSU1YX0lQVVYzX0NPUkUpICs9IGlwdS12My8KIAogaW14LWlwdXYzLWNydGMtb2JqcyAgOj0gaXB1djMtY3J0Yy5vIGlwdXYzLXBsYW5lLm8KIG9iai0kKENPTkZJR19EUk1fSU1YX0lQVVYzKQkrPSBpbXgtaXB1djMtY3J0Yy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCmluZGV4IGMyNzBjOWEuLmRlZjgyODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0tY29yZS5jCkBAIC0yMDAsMTMgKzIwMCw2IEBACiAJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAogfTsKIAotaW50IGlteF9kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlyZXR1cm4gTU9ERV9PSzsKLX0KLUVYUE9SVF9TWU1CT0woaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCk7Ci0KIHZvaWQgaW14X2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CkBAIC0zMDUsNyArMjk4LDcgQEAKIAkJCWRldl9lcnIoZHJtLT5kZXYsCiAJCQkJIltDT05ORUNUT1I6JWQ6JXNdIGRybV9zeXNmc19jb25uZWN0b3JfYWRkIGZhaWxlZDogJWRcbiIsCiAJCQkJY29ubmVjdG9yLT5iYXNlLmlkLAotCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwgcmV0KTsKKwkJCQljb25uZWN0b3ItPm5hbWUsIHJldCk7CiAJCQlnb3RvIGVycl91bmJpbmQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLmggYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLmgKaW5kZXggYTMyMmJhYy4uNzQ1M2FlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaApAQCAtNTAsOCArNTAsNiBAQAogaW50IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAKLWludCBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwogdm9pZCBpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogdm9pZCBpbXhfZHJtX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYwppbmRleCAxYjQ0MDQ4Li4xOGM5Y2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1oZG1pLmMKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9lbmNvZGVyX3NsYXZlLmg+CisjaW5jbHVkZSA8dmlkZW8vaW14LWlwdS12My5oPgogCi0jaW5jbHVkZSAiaXB1LXYzL2lteC1pcHUtdjMuaCIKICNpbmNsdWRlICJpbXgtaGRtaS5oIgogI2luY2x1ZGUgImlteC1kcm0uaCIKIApAQCAtMTQ5MCw3ICsxNDkwLDYgQEAKIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbXhfaGRtaV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBpbXhfaGRtaV9jb25uZWN0b3JfZ2V0X21vZGVzLAotCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIAkuYmVzdF9lbmNvZGVyID0gaW14X2hkbWlfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYwppbmRleCBmZTRjMWVmLi43ZTNmMDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtbGRiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWxkYi5jCkBAIC0zMTcsNyArMzE3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW14X2xkYl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewogCS5nZXRfbW9kZXMgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9sZGJfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKLQkubW9kZV92YWxpZCA9IGlteF9kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGlteF9sZGJfZW5jb2Rlcl9mdW5jcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC10dmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC10dmUuYwppbmRleCBhMjNmNGY3Li5jNjI4ZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtdHZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jCkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KKyNpbmNsdWRlIDx2aWRlby9pbXgtaXB1LXYzLmg+CiAKLSNpbmNsdWRlICJpcHUtdjMvaW14LWlwdS12My5oIgogI2luY2x1ZGUgImlteC1kcm0uaCIKIAogI2RlZmluZSBUVkVfQ09NX0NPTkZfUkVHCTB4MDAKQEAgLTI0OSwxMSArMjQ5LDYgQEAKIHsKIAlzdHJ1Y3QgaW14X3R2ZSAqdHZlID0gY29uX3RvX3R2ZShjb25uZWN0b3IpOwogCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChjb25uZWN0b3IsIG1vZGUpOwotCWlmIChyZXQgIT0gTU9ERV9PSykKLQkJcmV0dXJuIHJldDsKIAogCS8qIHBpeGVsIGNsb2NrIHdpdGggMnggb3ZlcnNhbXBsaW5nICovCiAJcmF0ZSA9IGNsa19yb3VuZF9yYXRlKHR2ZS0+Y2xrLCAyMDAwVUwgKiBtb2RlLT5jbG9jaykgLyAyMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVkNzJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLSQoQ09ORklHX0RSTV9JTVhfSVBVVjNfQ09SRSkgKz0gaW14LWlwdS12My5vCi0KLWlteC1pcHUtdjMtb2JqcyA6PSBpcHUtY29tbW9uLm8gaXB1LWRjLm8gaXB1LWRpLm8gaXB1LWRwLm8gaXB1LWRtZmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtY3J0Yy5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtY3J0Yy5jCmluZGV4IDQ3YmVjNWUuLjcyMDg2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLWNydGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxkcm0vZHJtX2dlbV9jbWFfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9jbWFfaGVscGVyLmg+CiAKLSNpbmNsdWRlICJpcHUtdjMvaW14LWlwdS12My5oIgorI2luY2x1ZGUgPHZpZGVvL2lteC1pcHUtdjMuaD4KICNpbmNsdWRlICJpbXgtZHJtLmgiCiAjaW5jbHVkZSAiaXB1djMtcGxhbmUuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMKaW5kZXggNTY5N2U1OS4uNmYzOTNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1wbGFuZS5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9jbWFfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9nZW1fY21hX2hlbHBlci5oPgogCi0jaW5jbHVkZSAiaXB1LXYzL2lteC1pcHUtdjMuaCIKKyNpbmNsdWRlICJ2aWRlby9pbXgtaXB1LXYzLmgiCiAjaW5jbHVkZSAiaXB1djMtcGxhbmUuaCIKIAogI2RlZmluZSB0b19pcHVfcGxhbmUoeCkJY29udGFpbmVyX29mKHgsIHN0cnVjdCBpcHVfcGxhbmUsIGJhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMKaW5kZXggZWFmNGRkYTEuLmI1Njc4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL3BhcmFsbGVsLWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMKQEAgLTE0OCw3ICsxNDgsNiBAQAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbXhfcGRfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X3BkX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9wZF9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAotCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW14X3BkX2VuY29kZXJfZnVuY3MgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xjbGllbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCmluZGV4IDgyNzIwOWUuLjM4NmEzNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oCkBAIC04MiwxNiArODIsNyBAQAogCS8qKgogCSAqIEkvTyB2ZWN0b3IgaW5mb3JtYXRpb24gdG8gb3IgZnJvbSB3aGljaCByZWFkL3dyaXRlIGlzIGdvaW5nLgogCSAqLwotCXN0cnVjdCBpb3ZlYyAqY3VpX2lvdjsKLQl1bnNpZ25lZCBsb25nIGN1aV9ucnNlZ3M7Ci0JLyoqCi0JICogVG90YWwgaW92IGNvdW50IGZvciBsZWZ0IElPLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgY3VpX3RvdF9ucnNlZ3M7Ci0JLyoqCi0JICogT2xkIGxlbmd0aCBmb3IgaW92IHRoYXQgd2FzIHRydW5jYXRlZCBwYXJ0aWFsbHkuCi0JICovCi0Jc2l6ZV90IGN1aV9pb3Zfb2xlbjsKKwlzdHJ1Y3QgaW92X2l0ZXIgKmN1aV9pdGVyOwogCS8qKgogCSAqIFRvdGFsIHNpemUgZm9yIHRoZSBsZWZ0IElPLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYwppbmRleCBkYzI0Y2ZhLi4xYjBjMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYwpAQCAtNzIwLDMxICs3MjAsMTIgQEAKIHZvaWQgY2NjX2lvX3VwZGF0ZV9pb3YoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkgICAgICAgc3RydWN0IGNjY19pbyAqY2lvLCBzdHJ1Y3QgY2xfaW8gKmlvKQogewotCWludCBpOwogCXNpemVfdCBzaXplID0gaW8tPnUuY2lfcncuY3J3X2NvdW50OwogCi0JY2lvLT5jdWlfaW92X29sZW4gPSAwOwotCWlmICghY2xfaXNfbm9ybWFsaW8oZW52LCBpbykgfHwgY2lvLT5jdWlfdG90X25yc2VncyA9PSAwKQorCWlmICghY2xfaXNfbm9ybWFsaW8oZW52LCBpbykgfHwgY2lvLT5jdWlfaXRlciA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2lvLT5jdWlfdG90X25yc2VnczsgaSsrKSB7Ci0JCXN0cnVjdCBpb3ZlYyAqaXYgPSAmY2lvLT5jdWlfaW92W2ldOwotCi0JCWlmIChpdi0+aW92X2xlbiA8IHNpemUpCi0JCQlzaXplIC09IGl2LT5pb3ZfbGVuOwotCQllbHNlIHsKLQkJCWlmIChpdi0+aW92X2xlbiA+IHNpemUpIHsKLQkJCQljaW8tPmN1aV9pb3Zfb2xlbiA9IGl2LT5pb3ZfbGVuOwotCQkJCWl2LT5pb3ZfbGVuID0gc2l6ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JY2lvLT5jdWlfbnJzZWdzID0gaSArIDE7Ci0JTEFTU0VSVEYoY2lvLT5jdWlfdG90X25yc2VncyA+PSBjaW8tPmN1aV9ucnNlZ3MsCi0JCSAidG90X25yc2VnczogJWx1LCBucnNlZ3M6ICVsdVxuIiwKLQkJIGNpby0+Y3VpX3RvdF9ucnNlZ3MsIGNpby0+Y3VpX25yc2Vncyk7CisJaW92X2l0ZXJfdHJ1bmNhdGUoY2lvLT5jdWlfaXRlciwgc2l6ZSk7CiB9CiAKIGludCBjY2NfaW9fb25lX2xvY2soY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfaW8gKmlvLApAQCAtNzc1LDMwICs3NTYsNyBAQAogCWlmICghY2xfaXNfbm9ybWFsaW8oZW52LCBpbykpCiAJCXJldHVybjsKIAotCUxBU1NFUlQoY2lvLT5jdWlfdG90X25yc2VncyA+PSBjaW8tPmN1aV9ucnNlZ3MpOwotCUxBU1NFUlQoY2lvLT5jdWlfdG90X2NvdW50ICA+PSBub2IpOwotCi0JY2lvLT5jdWlfaW92CSs9IGNpby0+Y3VpX25yc2VnczsKLQljaW8tPmN1aV90b3RfbnJzZWdzIC09IGNpby0+Y3VpX25yc2VnczsKLQljaW8tPmN1aV90b3RfY291bnQgIC09IG5vYjsKLQotCS8qIHVwZGF0ZSB0aGUgaW92ICovCi0JaWYgKGNpby0+Y3VpX2lvdl9vbGVuID4gMCkgewotCQlzdHJ1Y3QgaW92ZWMgKml2OwotCi0JCWNpby0+Y3VpX2lvdi0tOwotCQljaW8tPmN1aV90b3RfbnJzZWdzKys7Ci0JCWl2ID0gJmNpby0+Y3VpX2lvdlswXTsKLQkJaWYgKGlvLT5jaV9jb250aW51ZSkgewotCQkJaXYtPmlvdl9iYXNlICs9IGl2LT5pb3ZfbGVuOwotCQkJTEFTU0VSVChjaW8tPmN1aV9pb3Zfb2xlbiA+IGl2LT5pb3ZfbGVuKTsKLQkJCWl2LT5pb3ZfbGVuID0gY2lvLT5jdWlfaW92X29sZW4gLSBpdi0+aW92X2xlbjsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlc3RvcmUgdGhlIGlvdl9sZW4sIGluIGNhc2Ugb2YgcmVzdGFydCBpby4gKi8KLQkJCWl2LT5pb3ZfbGVuID0gY2lvLT5jdWlfaW92X29sZW47Ci0JCX0KLQkJY2lvLT5jdWlfaW92X29sZW4gPSAwOwotCX0KKwlpb3ZfaXRlcl9yZWV4cGFuZChjaW8tPmN1aV9pdGVyLCBjaW8tPmN1aV90b3RfY291bnQgIC09IG5vYik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCmluZGV4IGM0ZGRlYzIuLjcxNmUxZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKQEAgLTExMTQsOSArMTExNCw3IEBACiAKIAkJc3dpdGNoICh2aW8tPmN1aV9pb19zdWJ0eXBlKSB7CiAJCWNhc2UgSU9fTk9STUFMOgotCQkJY2lvLT5jdWlfaW92ID0gYXJncy0+dS5ub3JtYWwudmlhX2lvdjsKLQkJCWNpby0+Y3VpX25yc2VncyA9IGFyZ3MtPnUubm9ybWFsLnZpYV9ucnNlZ3M7Ci0JCQljaW8tPmN1aV90b3RfbnJzZWdzID0gY2lvLT5jdWlfbnJzZWdzOworCQkJY2lvLT5jdWlfaXRlciA9IGFyZ3MtPnUubm9ybWFsLnZpYV9pdGVyOwogCQkJY2lvLT5jdWlfaW9jYiA9IGFyZ3MtPnUubm9ybWFsLnZpYV9pb2NiOwogCQkJaWYgKChpb3QgPT0gQ0lUX1dSSVRFKSAmJgogCQkJICAgICEoY2lvLT5jdWlfZmQtPmZkX2ZsYWdzICYgTExfRklMRV9HUk9VUF9MT0NLRUQpKSB7CkBAIC0xMTgwLDU4ICsxMTc4LDIzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHNzaXplX3QgbGxfZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IGxsX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKIAlzdHJ1Y3QgbHVfZW52ICAgICAgKmVudjsKIAlzdHJ1Y3QgdnZwX2lvX2FyZ3MgKmFyZ3M7Ci0Jc2l6ZV90CSAgICAgIGNvdW50ID0gMDsKIAlzc2l6ZV90CSAgICAgcmVzdWx0OwogCWludAkJIHJlZmNoZWNrOwogCi0JcmVzdWx0ID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3YsICZucl9zZWdzLCAmY291bnQsIFZFUklGWV9XUklURSk7Ci0JaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKLQogCWVudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKIAlpZiAoSVNfRVJSKGVudikpCiAJCXJldHVybiBQVFJfRVJSKGVudik7CiAKIAlhcmdzID0gdnZwX2Vudl9hcmdzKGVudiwgSU9fTk9STUFMKTsKLQlhcmdzLT51Lm5vcm1hbC52aWFfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKWlvdjsKLQlhcmdzLT51Lm5vcm1hbC52aWFfbnJzZWdzID0gbnJfc2VnczsKKwlhcmdzLT51Lm5vcm1hbC52aWFfaXRlciA9IHRvOwogCWFyZ3MtPnUubm9ybWFsLnZpYV9pb2NiID0gaW9jYjsKIAogCXJlc3VsdCA9IGxsX2ZpbGVfaW9fZ2VuZXJpYyhlbnYsIGFyZ3MsIGlvY2ItPmtpX2ZpbHAsIENJVF9SRUFELAotCQkJCSAgICAmaW9jYi0+a2lfcG9zLCBjb3VudCk7Ci0JY2xfZW52X3B1dChlbnYsICZyZWZjaGVjayk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHNzaXplX3QgbGxfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgICBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGx1X2VudiAqZW52OwotCXN0cnVjdCBpb3ZlYyAgKmxvY2FsX2lvdjsKLQlzdHJ1Y3Qga2lvY2IgICpraW9jYjsKLQlzc2l6ZV90CXJlc3VsdDsKLQlpbnQJICAgIHJlZmNoZWNrOwotCi0JZW52ID0gY2xfZW52X2dldCgmcmVmY2hlY2spOwotCWlmIChJU19FUlIoZW52KSkKLQkJcmV0dXJuIFBUUl9FUlIoZW52KTsKLQotCWxvY2FsX2lvdiA9ICZ2dnBfZW52X2luZm8oZW52KS0+dnRpX2xvY2FsX2lvdjsKLQlraW9jYiA9ICZ2dnBfZW52X2luZm8oZW52KS0+dnRpX2tpb2NiOwotCWxvY2FsX2lvdi0+aW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWY7Ci0JbG9jYWxfaW92LT5pb3ZfbGVuID0gY291bnQ7Ci0JaW5pdF9zeW5jX2tpb2NiKGtpb2NiLCBmaWxlKTsKLQlraW9jYi0+a2lfcG9zID0gKnBwb3M7Ci0Ja2lvY2ItPmtpX25ieXRlcyA9IGNvdW50OwotCi0JcmVzdWx0ID0gbGxfZmlsZV9haW9fcmVhZChraW9jYiwgbG9jYWxfaW92LCAxLCBraW9jYi0+a2lfcG9zKTsKLQkqcHBvcyA9IGtpb2NiLT5raV9wb3M7Ci0KKwkJCQkgICAgJmlvY2ItPmtpX3BvcywgaW92X2l0ZXJfY291bnQodG8pKTsKIAljbF9lbnZfcHV0KGVudiwgJnJlZmNoZWNrKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTIzOSw2NCArMTIwMiwyNyBAQAogLyoKICAqIFdyaXRlIHRvIGEgZmlsZSAodGhyb3VnaCB0aGUgcGFnZSBjYWNoZSkuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGxsX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IGxsX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgbHVfZW52ICAgICAgKmVudjsKIAlzdHJ1Y3QgdnZwX2lvX2FyZ3MgKmFyZ3M7Ci0Jc2l6ZV90CSAgICAgIGNvdW50ID0gMDsKIAlzc2l6ZV90CSAgICAgcmVzdWx0OwogCWludAkJIHJlZmNoZWNrOwogCi0JcmVzdWx0ID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3YsICZucl9zZWdzLCAmY291bnQsIFZFUklGWV9SRUFEKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OwotCiAJZW52ID0gY2xfZW52X2dldCgmcmVmY2hlY2spOwogCWlmIChJU19FUlIoZW52KSkKIAkJcmV0dXJuIFBUUl9FUlIoZW52KTsKIAogCWFyZ3MgPSB2dnBfZW52X2FyZ3MoZW52LCBJT19OT1JNQUwpOwotCWFyZ3MtPnUubm9ybWFsLnZpYV9pb3YgPSAoc3RydWN0IGlvdmVjICopaW92OwotCWFyZ3MtPnUubm9ybWFsLnZpYV9ucnNlZ3MgPSBucl9zZWdzOworCWFyZ3MtPnUubm9ybWFsLnZpYV9pdGVyID0gZnJvbTsKIAlhcmdzLT51Lm5vcm1hbC52aWFfaW9jYiA9IGlvY2I7CiAKIAlyZXN1bHQgPSBsbF9maWxlX2lvX2dlbmVyaWMoZW52LCBhcmdzLCBpb2NiLT5raV9maWxwLCBDSVRfV1JJVEUsCi0JCQkJICAmaW9jYi0+a2lfcG9zLCBjb3VudCk7CisJCQkJICAmaW9jYi0+a2lfcG9zLCBpb3ZfaXRlcl9jb3VudChmcm9tKSk7CiAJY2xfZW52X3B1dChlbnYsICZyZWZjaGVjayk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHNzaXplX3QgbGxfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgICAgIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgbHVfZW52ICplbnY7Ci0Jc3RydWN0IGlvdmVjICAqbG9jYWxfaW92OwotCXN0cnVjdCBraW9jYiAgKmtpb2NiOwotCXNzaXplX3QJcmVzdWx0OwotCWludAkgICAgcmVmY2hlY2s7Ci0KLQllbnYgPSBjbF9lbnZfZ2V0KCZyZWZjaGVjayk7Ci0JaWYgKElTX0VSUihlbnYpKQotCQlyZXR1cm4gUFRSX0VSUihlbnYpOwotCi0JbG9jYWxfaW92ID0gJnZ2cF9lbnZfaW5mbyhlbnYpLT52dGlfbG9jYWxfaW92OwotCWtpb2NiID0gJnZ2cF9lbnZfaW5mbyhlbnYpLT52dGlfa2lvY2I7Ci0JbG9jYWxfaW92LT5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWJ1ZjsKLQlsb2NhbF9pb3YtPmlvdl9sZW4gPSBjb3VudDsKLQlpbml0X3N5bmNfa2lvY2Ioa2lvY2IsIGZpbGUpOwotCWtpb2NiLT5raV9wb3MgPSAqcHBvczsKLQlraW9jYi0+a2lfbmJ5dGVzID0gY291bnQ7Ci0KLQlyZXN1bHQgPSBsbF9maWxlX2Fpb193cml0ZShraW9jYiwgbG9jYWxfaW92LCAxLCBraW9jYi0+a2lfcG9zKTsKLQkqcHBvcyA9IGtpb2NiLT5raV9wb3M7Ci0KLQljbF9lbnZfcHV0KGVudiwgJnJlZmNoZWNrKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLQogLyoKICAqIFNlbmQgZmlsZSBjb250ZW50ICh0aHJvdWdoIHBhZ2VjYWNoZSkgc29tZXdoZXJlIHdpdGggaGVscGVyCiAgKi8KQEAgLTMxNDMsMTAgKzMwNjksMTAgQEAKIAogLyogLW8gbG9jYWxmbG9jayAtIG9ubHkgcHJvdmlkZXMgbG9jYWxseSBjb25zaXN0ZW50IGZsb2NrIGxvY2tzICovCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxsX2ZpbGVfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkgICA9IGxsX2ZpbGVfcmVhZCwKLQkuYWlvX3JlYWQgPSBsbF9maWxlX2Fpb19yZWFkLAotCS53cml0ZQkgID0gbGxfZmlsZV93cml0ZSwKLQkuYWlvX3dyaXRlID0gbGxfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJICAgPSBuZXdfc3luY19yZWFkLAorCS5yZWFkX2l0ZXIgPSBsbF9maWxlX3JlYWRfaXRlciwKKwkud3JpdGUJICA9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyID0gbGxfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGxsX2ZpbGVfaW9jdGwsCiAJLm9wZW4JICAgPSBsbF9maWxlX29wZW4sCiAJLnJlbGVhc2UJPSBsbF9maWxlX3JlbGVhc2UsCkBAIC0zMTU4LDEwICszMDg0LDEwIEBACiB9OwogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxsX2ZpbGVfb3BlcmF0aW9uc19mbG9jayA9IHsKLQkucmVhZAkgICA9IGxsX2ZpbGVfcmVhZCwKLQkuYWlvX3JlYWQgICAgPSBsbF9maWxlX2Fpb19yZWFkLAotCS53cml0ZQkgID0gbGxfZmlsZV93cml0ZSwKLQkuYWlvX3dyaXRlICAgPSBsbF9maWxlX2Fpb193cml0ZSwKKwkucmVhZAkgICA9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlciAgICA9IGxsX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZQkgID0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIgICA9IGxsX2ZpbGVfd3JpdGVfaXRlciwKIAkudW5sb2NrZWRfaW9jdGwgPSBsbF9maWxlX2lvY3RsLAogCS5vcGVuCSAgID0gbGxfZmlsZV9vcGVuLAogCS5yZWxlYXNlCT0gbGxfZmlsZV9yZWxlYXNlLApAQCAtMzE3NiwxMCArMzEwMiwxMCBAQAogCiAvKiBUaGVzZSBhcmUgZm9yIC1vIG5vZmxvY2sgLSB0byByZXR1cm4gRU5PU1lTIG9uIGZsb2NrIGNhbGxzICovCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxsX2ZpbGVfb3BlcmF0aW9uc19ub2Zsb2NrID0gewotCS5yZWFkCSAgID0gbGxfZmlsZV9yZWFkLAotCS5haW9fcmVhZCAgICA9IGxsX2ZpbGVfYWlvX3JlYWQsCi0JLndyaXRlCSAgPSBsbF9maWxlX3dyaXRlLAotCS5haW9fd3JpdGUgICA9IGxsX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCSAgID0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyICAgID0gbGxfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCSAgPSBuZXdfc3luY193cml0ZSwKKwkud3JpdGVfaXRlciAgID0gbGxfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGxsX2ZpbGVfaW9jdGwsCiAJLm9wZW4JICAgPSBsbF9maWxlX29wZW4sCiAJLnJlbGVhc2UJPSBsbF9maWxlX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaAppbmRleCBkZGU3NjMyYi4uMTQwZWU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCkBAIC05MTcsOCArOTE3LDcgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3Qga2lvY2IgICAgICAqdmlhX2lvY2I7Ci0JCQlzdHJ1Y3QgaW92ZWMgICAgICAqdmlhX2lvdjsKLQkJCXVuc2lnbmVkIGxvbmcgICAgICB2aWFfbnJzZWdzOworCQkJc3RydWN0IGlvdl9pdGVyICAgKnZpYV9pdGVyOwogCQl9IG5vcm1hbDsKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gICp2aWFfcGlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCmluZGV4IGYwMTIyYzUuLjU2MTYyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwpAQCAtMTUxLDggKzE1MSw3IEBACiAJCXJlc3VsdCA9IGNsX2lvX3J3X2luaXQoZW52LCBpbywgQ0lUX1dSSVRFLCBwb3MsIFBBR0VfQ0FDSEVfU0laRSk7CiAJCWlmIChyZXN1bHQgPT0gMCkgewogCQkJY2lvLT5jdWlfZmQgPSBMVVNUUkVfRlBSSVZBVEUoZmlsZSk7Ci0JCQljaW8tPmN1aV9pb3YgPSBOVUxMOwotCQkJY2lvLT5jdWlfbnJzZWdzID0gMDsKKwkJCWNpby0+Y3VpX2l0ZXIgPSBOVUxMOwogCQkJcmVzdWx0ID0gY2xfaW9faXRlcl9pbml0KGVudiwgaW8pOwogCQkJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCQkJcmVzdWx0ID0gY2xfaW9fbG9jayhlbnYsIGlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYwppbmRleCA1NWNhOGQzLi5hZjg0YzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCkBAIC0yMTgsMTQgKzIxOCwxMSBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7Ci0JCWlmIChwYWdlc1tpXSA9PSBOVUxMKQotCQkJYnJlYWs7CiAJCWlmIChkb19kaXJ0eSkKIAkJCXNldF9wYWdlX2RpcnR5X2xvY2socGFnZXNbaV0pOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOwogCX0KLQotCU9CRF9GUkVFX0xBUkdFKHBhZ2VzLCBucGFnZXMgKiBzaXplb2YoKnBhZ2VzKSk7CisJa3ZmcmVlKHBhZ2VzKTsKIH0KIAogc3NpemVfdCBsbF9kaXJlY3RfcndfcGFnZXMoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfaW8gKmlvLApAQCAtMzYzLDE4ICszNjAsMTYgQEAKICNkZWZpbmUgTUFYX0RJT19TSVpFICgoTUFYX01BTExPQyAvIHNpemVvZihzdHJ1Y3QgYnJ3X3BhZ2UpICogUEFHRV9DQUNIRV9TSVpFKSAmIFwKIAkJICAgICAgfihEVF9NQVhfQlJXX1NJWkUgLSAxKSkKIHN0YXRpYyBzc2l6ZV90IGxsX2RpcmVjdF9JT18yNihpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IGZpbGVfb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJCSAgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBmaWxlX29mZnNldCkKIHsKIAlzdHJ1Y3QgbHVfZW52ICplbnY7CiAJc3RydWN0IGNsX2lvICppbzsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgY2NjX29iamVjdCAqb2JqID0gY2xfaW5vZGUyY2NjKGlub2RlKTsKLQlsb25nIGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwotCWxvbmcgdG90X2J5dGVzID0gMCwgcmVzdWx0ID0gMDsKKwlzc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CisJc3NpemVfdCB0b3RfYnl0ZXMgPSAwLCByZXN1bHQgPSAwOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwotCXVuc2lnbmVkIGxvbmcgc2VnID0gMDsKIAlsb25nIHNpemUgPSBNQVhfRElPX1NJWkU7CiAJaW50IHJlZmNoZWNrOwogCkBAIC0zOTIsMTEgKzM4Nyw4IEBACiAJICAgICAgIE1BWF9ESU9fU0laRSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKIAogCS8qIENoZWNrIHRoYXQgYWxsIHVzZXIgYnVmZmVycyBhcmUgYWxpZ25lZCBhcyB3ZWxsICovCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQlpZiAoKCh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlICYgfkNGU19QQUdFX01BU0spIHx8Ci0JCSAgICAoaW92W3NlZ10uaW92X2xlbiAmIH5DRlNfUEFHRV9NQVNLKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KKwlpZiAoaW92X2l0ZXJfYWxpZ25tZW50KGl0ZXIpICYgfkNGU19QQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOwogCiAJZW52ID0gY2xfZW52X2dldCgmcmVmY2hlY2spOwogCUxBU1NFUlQoIUlTX0VSUihlbnYpKTsKQEAgLTQxMSw2MyArNDAzLDQ5IEBACiAJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAogCUxBU1NFUlQob2JqLT5jb2JfdHJhbnNpZW50X3BhZ2VzID09IDApOwotCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKLQkJbG9uZyBpb3ZfbGVmdCA9IGlvdltzZWddLmlvdl9sZW47Ci0JCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92W3NlZ10uaW92X2Jhc2U7CisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGl0ZXIpKSB7CisJCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJCXNpemVfdCBvZmZzOwogCisJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCBpb3ZfaXRlcl9jb3VudChpdGVyKSwgc2l6ZSk7CiAJCWlmIChydyA9PSBSRUFEKSB7CiAJCQlpZiAoZmlsZV9vZmZzZXQgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQogCQkJCWJyZWFrOwotCQkJaWYgKGZpbGVfb2Zmc2V0ICsgaW92X2xlZnQgPiBpX3NpemVfcmVhZChpbm9kZSkpCi0JCQkJaW92X2xlZnQgPSBpX3NpemVfcmVhZChpbm9kZSkgLSBmaWxlX29mZnNldDsKKwkJCWlmIChmaWxlX29mZnNldCArIGNvdW50ID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJCWNvdW50ID0gaV9zaXplX3JlYWQoaW5vZGUpIC0gZmlsZV9vZmZzZXQ7CiAJCX0KIAotCQl3aGlsZSAoaW92X2xlZnQgPiAwKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCQkJaW50IHBhZ2VfY291bnQsIG1heF9wYWdlcyA9IDA7Ci0JCQlsb25nIGJ5dGVzOwotCi0JCQlieXRlcyA9IG1pbihzaXplLCBpb3ZfbGVmdCk7Ci0JCQlwYWdlX2NvdW50ID0gbGxfZ2V0X3VzZXJfcGFnZXMocncsIHVzZXJfYWRkciwgYnl0ZXMsCi0JCQkJCQkgICAgICAgJnBhZ2VzLCAmbWF4X3BhZ2VzKTsKLQkJCWlmIChsaWtlbHkocGFnZV9jb3VudCA+IDApKSB7Ci0JCQkJaWYgKHVubGlrZWx5KHBhZ2VfY291bnQgPCAgbWF4X3BhZ2VzKSkKLQkJCQkJYnl0ZXMgPSBwYWdlX2NvdW50IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQkJcmVzdWx0ID0gbGxfZGlyZWN0X0lPXzI2X3NlZyhlbnYsIGlvLCBydywgaW5vZGUsCi0JCQkJCQkJICAgICBmaWxlLT5mX21hcHBpbmcsCi0JCQkJCQkJICAgICBieXRlcywgZmlsZV9vZmZzZXQsCi0JCQkJCQkJICAgICBwYWdlcywgcGFnZV9jb3VudCk7Ci0JCQkJbGxfZnJlZV91c2VyX3BhZ2VzKHBhZ2VzLCBtYXhfcGFnZXMsIHJ3PT1SRUFEKTsKLQkJCX0gZWxzZSBpZiAocGFnZV9jb3VudCA9PSAwKSB7Ci0JCQkJR09UTyhvdXQsIHJlc3VsdCA9IC1FRkFVTFQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBwYWdlX2NvdW50OwotCQkJfQotCQkJaWYgKHVubGlrZWx5KHJlc3VsdCA8PSAwKSkgewotCQkJCS8qIElmIHdlIGNhbid0IGFsbG9jYXRlIGEgbGFyZ2UgZW5vdWdoIGJ1ZmZlcgotCQkJCSAqIGZvciB0aGUgcmVxdWVzdCwgc2hyaW5rIGl0IHRvIGEgc21hbGxlcgotCQkJCSAqIFBBR0VfU0laRSBtdWx0aXBsZSBhbmQgdHJ5IGFnYWluLgotCQkJCSAqIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBrbWFsbG9jIGZvciBhCi0JCQkJICogcGFnZSB3b3J0aCBvZiBwYWdlIHBvaW50ZXJzID0gNE1CIG9uIGkzODYuICovCi0JCQkJaWYgKHJlc3VsdCA9PSAtRU5PTUVNICYmCi0JCQkJICAgIHNpemUgPiAoUEFHRV9DQUNIRV9TSVpFIC8gc2l6ZW9mKCpwYWdlcykpICoKLQkJCQkJICAgUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCQkJCXNpemUgPSAoKCgoc2l6ZSAvIDIpIC0gMSkgfAotCQkJCQkJIH5DRlNfUEFHRV9NQVNLKSArIDEpICYKLQkJCQkJCUNGU19QQUdFX01BU0s7Ci0JCQkJCUNERUJVRyhEX1ZGU1RSQUNFLCJESU8gc2l6ZSBub3cgJWx1XG4iLAotCQkJCQkgICAgICAgc2l6ZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUdPVE8ob3V0LCByZXN1bHQpOwotCQkJfQotCi0JCQl0b3RfYnl0ZXMgKz0gcmVzdWx0OwotCQkJZmlsZV9vZmZzZXQgKz0gcmVzdWx0OwotCQkJaW92X2xlZnQgLT0gcmVzdWx0OwotCQkJdXNlcl9hZGRyICs9IHJlc3VsdDsKKwkJcmVzdWx0ID0gaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKGl0ZXIsICZwYWdlcywgY291bnQsICZvZmZzKTsKKwkJaWYgKGxpa2VseShyZXN1bHQgPiAwKSkgeworCQkJaW50IG4gPSAocmVzdWx0ICsgb2ZmcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCQkJcmVzdWx0ID0gbGxfZGlyZWN0X0lPXzI2X3NlZyhlbnYsIGlvLCBydywgaW5vZGUsCisJCQkJCQkgICAgIGZpbGUtPmZfbWFwcGluZywKKwkJCQkJCSAgICAgcmVzdWx0LCBmaWxlX29mZnNldCwKKwkJCQkJCSAgICAgcGFnZXMsIG4pOworCQkJbGxfZnJlZV91c2VyX3BhZ2VzKHBhZ2VzLCBuLCBydz09UkVBRCk7CiAJCX0KKwkJaWYgKHVubGlrZWx5KHJlc3VsdCA8PSAwKSkgeworCQkJLyogSWYgd2UgY2FuJ3QgYWxsb2NhdGUgYSBsYXJnZSBlbm91Z2ggYnVmZmVyCisJCQkgKiBmb3IgdGhlIHJlcXVlc3QsIHNocmluayBpdCB0byBhIHNtYWxsZXIKKwkJCSAqIFBBR0VfU0laRSBtdWx0aXBsZSBhbmQgdHJ5IGFnYWluLgorCQkJICogV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGttYWxsb2MgZm9yIGEKKwkJCSAqIHBhZ2Ugd29ydGggb2YgcGFnZSBwb2ludGVycyA9IDRNQiBvbiBpMzg2LiAqLworCQkJaWYgKHJlc3VsdCA9PSAtRU5PTUVNICYmCisJCQkgICAgc2l6ZSA+IChQQUdFX0NBQ0hFX1NJWkUgLyBzaXplb2YoKnBhZ2VzKSkgKgorCQkJCSAgIFBBR0VfQ0FDSEVfU0laRSkgeworCQkJCXNpemUgPSAoKCgoc2l6ZSAvIDIpIC0gMSkgfAorCQkJCQkgfkNGU19QQUdFX01BU0spICsgMSkgJgorCQkJCQlDRlNfUEFHRV9NQVNLOworCQkJCUNERUJVRyhEX1ZGU1RSQUNFLCJESU8gc2l6ZSBub3cgJWx1XG4iLAorCQkJCSAgICAgICBzaXplKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJR09UTyhvdXQsIHJlc3VsdCk7CisJCX0KKwkJaW92X2l0ZXJfYWR2YW5jZShpdGVyLCByZXN1bHQpOworCQl0b3RfYnl0ZXMgKz0gcmVzdWx0OworCQlmaWxlX29mZnNldCArPSByZXN1bHQ7CiAJfQogb3V0OgogCUxBU1NFUlQob2JqLT5jb2JfdHJhbnNpZW50X3BhZ2VzID09IDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwppbmRleCA3ZGQyYjQ3Li4wZTBiNDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwpAQCAtMjExLDI3ICsyMTEsMjYgQEAKIAlzdHJ1Y3QgY2xfbG9ja19kZXNjciAgICpkZXNjciA9ICZjdGktPmN0aV9kZXNjcjsKIAlsZGxtX3BvbGljeV9kYXRhX3QgICAgICBwb2xpY3k7CiAJdW5zaWduZWQgbG9uZwkgICBhZGRyOwotCXVuc2lnbmVkIGxvbmcJICAgc2VnOwogCXNzaXplX3QJCSBjb3VudDsKIAlpbnQJCSAgICAgcmVzdWx0OworCXN0cnVjdCBpb3ZfaXRlciBpOworCXN0cnVjdCBpb3ZlYyBpb3Y7CiAKIAlMQVNTRVJUKGlvLT5jaV90eXBlID09IENJVF9SRUFEIHx8IGlvLT5jaV90eXBlID09IENJVF9XUklURSk7CiAKIAlpZiAoIWNsX2lzX25vcm1hbGlvKGVudiwgaW8pKQogCQlyZXR1cm4gMDsKIAotCWlmICh2aW8tPmN1aV9pb3YgPT0gTlVMTCkgLyogbmZzIG9yIGxvb3AgYmFjayBkZXZpY2Ugd3JpdGUgKi8KKwlpZiAodmlvLT5jdWlfaXRlciA9PSBOVUxMKSAvKiBuZnMgb3IgbG9vcCBiYWNrIGRldmljZSB3cml0ZSAqLwogCQlyZXR1cm4gMDsKIAogCS8qIE5vIE1NIChlLmcuIE5GUyk/IE5vIHZtYXMgdG9vLiAqLwogCWlmIChtbSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWZvciAoc2VnID0gMDsgc2VnIDwgdmlvLT5jdWlfbnJzZWdzOyBzZWcrKykgewotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKml2ID0gJnZpby0+Y3VpX2lvdltzZWddOwotCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylpdi0+aW92X2Jhc2U7Ci0JCWNvdW50ID0gaXYtPmlvdl9sZW47CisJaW92X2Zvcl9lYWNoKGlvdiwgaSwgKih2aW8tPmN1aV9pdGVyKSkgeworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92Lmlvdl9iYXNlOworCQljb3VudCA9IGlvdi5pb3ZfbGVuOwogCQlpZiAoY291bnQgPT0gMCkKIAkJCWNvbnRpbnVlOwogCkBAIC01MjcsOSArNTI2LDcgQEAKIAlzd2l0Y2ggKHZpby0+Y3VpX2lvX3N1YnR5cGUpIHsKIAljYXNlIElPX05PUk1BTDoKIAkJTEFTU0VSVChjaW8tPmN1aV9pb2NiLT5raV9wb3MgPT0gcG9zKTsKLQkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGNpby0+Y3VpX2lvY2IsCi0JCQkJCSAgICAgICBjaW8tPmN1aV9pb3YsIGNpby0+Y3VpX25yc2VncywKLQkJCQkJICAgICAgIGNpby0+Y3VpX2lvY2ItPmtpX3Bvcyk7CisJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIoY2lvLT5jdWlfaW9jYiwgY2lvLT5jdWlfaXRlcik7CiAJCWJyZWFrOwogCWNhc2UgSU9fU1BMSUNFOgogCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQoZmlsZSwgJnBvcywKQEAgLTU5NSwxMiArNTkyLDExIEBACiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIndyaXRlOiBbJWxsaSwgJWxsaSlcbiIsIHBvcywgcG9zICsgKGxvbmcgbG9uZyljbnQpOwogCi0JaWYgKGNpby0+Y3VpX2lvdiA9PSBOVUxMKSAvKiBmcm9tIGEgdGVtcCBpbyBpbiBsbF9jbF9pbml0KCkuICovCisJaWYgKGNpby0+Y3VpX2l0ZXIgPT0gTlVMTCkgLyogZnJvbSBhIHRlbXAgaW8gaW4gbGxfY2xfaW5pdCgpLiAqLwogCQlyZXN1bHQgPSAwOwogCWVsc2UKLQkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShjaW8tPmN1aV9pb2NiLAotCQkJCQkJY2lvLT5jdWlfaW92LCBjaW8tPmN1aV9ucnNlZ3MsCi0JCQkJCQljaW8tPmN1aV9pb2NiLT5raV9wb3MpOworCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlcihjaW8tPmN1aV9pb2NiLCBjaW8tPmN1aV9pdGVyKTsKKwogCWlmIChyZXN1bHQgPiAwKSB7CiAJCWlmIChyZXN1bHQgPCBjbnQpCiAJCQlpby0+Y2lfY29udGludWUgPSAwOwpAQCAtMTE2MiwxMCArMTE1OCw5IEBACiAJCSAqICByZXN1bHRzLiIgIC0tIFNpbmdsZSBVbml4IFNwZWMgKi8KIAkJaWYgKGNvdW50ID09IDApCiAJCQlyZXN1bHQgPSAxOwotCQllbHNlIHsKKwkJZWxzZQogCQkJY2lvLT5jdWlfdG90X2NvdW50ID0gY291bnQ7Ci0JCQljaW8tPmN1aV90b3RfbnJzZWdzID0gMDsKLQkJfQorCiAJCS8qIGZvciByZWFkL3dyaXRlLCB3ZSBzdG9yZSB0aGUgam9iaWQgaW4gdGhlIGlub2RlLCBhbmQKIAkJICogaXQnbGwgYmUgZmV0Y2hlZCBieSBvc2Mgd2hlbiBidWlsZGluZyBSUEMuCiAJCSAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMKaW5kZXggZGVkMzFlYS4uY2JmNDU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc192aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfdmlkZW8uYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHZiMl9vcHMgaXNzX3ZpZGVvX3ZiMm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmIyX29wcyBpc3NfdmlkZW9fdmIyb3BzID0gewogCS5xdWV1ZV9zZXR1cAk9IGlzc192aWRlb19xdWV1ZV9zZXR1cCwKIAkuYnVmX3ByZXBhcmUJPSBpc3NfdmlkZW9fYnVmX3ByZXBhcmUsCiAJLmJ1Zl9xdWV1ZQk9IGlzc192aWRlb19idWZfcXVldWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwppbmRleCA3NWQ3YzYzLi5lMzIwZDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJeGxyX3NldF9yeF9tb2RlKG5kZXYpOwogCiAJcHJpdi0+bnVtX3J4X2Rlc2MgKz0gTUFYX05VTV9ERVNDX1NQSUxMOwotCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmeGxyX2V0aHRvb2xfb3BzKTsKKwluZGV2LT5ldGh0b29sX29wcyA9ICZ4bHJfZXRodG9vbF9vcHM7CiAJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CiAKIAkvKiBDb21tb24gcmVnaXN0ZXJzLCBkbyBvbmUgdGltZSBpbml0aWFsaXphdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCmluZGV4IGZmNzIxNGEuLmRhOWRkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCiAJLyogV2UgZG8gb3VyIG93biBsb2NraW5nLCBMaW51eCBkb2Vzbid0IG5lZWQgdG8gKi8KIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmY3ZtX29jdF9ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZjdm1fb2N0X2V0aHRvb2xfb3BzOwogCiAJY3ZtX29jdF9waHlfc2V0dXBfZGV2aWNlKGRldik7CiAJY3ZtX29jdF9zZXRfbWFjX2ZpbHRlcihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlZS9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmVlL2NvcmUuYwppbmRleCA3NmVhMzU2Li43ZjZhY2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmVlL2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmVlL2NvcmUuYwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJc3RydWN0IHJ0bF9tYWMgKm1hYyA9ICYocnRscHJpdi0+bWFjODAyMTEpOwogCXN0cnVjdCBjZmc4MDIxMV9wa3RfcGF0dGVybiAqcGF0dGVybnMgPSB3b3ctPnBhdHRlcm5zOwogCXN0cnVjdCBydGxfd293X3BhdHRlcm4gcnRsX3BhdHRlcm47Ci0JdTggKnBhdHRlcm5fb3MsICptYXNrX29zOworCWNvbnN0IHU4ICpwYXR0ZXJuX29zLCAqbWFza19vczsKIAl1OCBtYXNrW01BWF9XT0xfQklUX01BU0tfU0laRV0gPSB7MH07CiAJdTggY29udGVudFtNQVhfV09MX1BBVFRFUk5fU0laRV0gPSB7MH07CiAJdTggYnJvYWRjYXN0X2FkZHJbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CkBAIC0xNTYxLDcgKzE1NjEsNyBAQAogICogYmVmb3JlIHN3aXRjaCBjaGFubmxlIG9yIHBvd2VyIHNhdmUsIG9yIHR4IGJ1ZmZlciBwYWNrZXQKICAqIG1heWJlIHNlbmQgYWZ0ZXIgb2ZmY2hhbm5lbCBvciByZiBzbGVlcCwgdGhpcyBtYXkgY2F1c2UKICAqIGRpcy1hc3NvY2lhdGlvbiBieSBBUCAqLwotc3RhdGljIHZvaWQgcnRsX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorc3RhdGljIHZvaWQgcnRsX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJIHUzMiBxdWV1ZXMsIGJvb2wgZHJvcCkKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYwppbmRleCAwYzlmNWNlYi4uZjA4MzlmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCiBzdGF0aWMgaW50IGNmZzgwMjExX3J0d19nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisJCQkJICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKQEAgLTI5MDMsNyArMjkwMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1OCAqbWFjLAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3QgdTggKm1hYywKIAkJCQkgICAgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQogewogCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7CkBAIC0yOTEyLDcgKzI5MTIsNyBAQAogfQogCiBzdGF0aWMgaW50IGNmZzgwMjExX3J0d19kZWxfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTggKm1hYykKKwkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNvbnN0IHU4ICptYWMpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdCwgKnB0bXA7CkBAIC0yOTg4LDcgKzI5ODgsNyBAQAogfQogCiBzdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2Vfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTggKm1hYywKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNvbnN0IHU4ICptYWMsCiAJCQkJICAgICAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYwppbmRleCA5YTM3NDA4Li4wNDZiZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYwpAQCAtMTI3OCw3ICsxMjc4LDkgQEAKICAqIGJlZm9yZSBzd2l0Y2ggY2hhbm5lbCBvciBwb3dlciBzYXZlLCBvciB0eCBidWZmZXIgcGFja2V0CiAgKiBtYXliZSBzZW5kIGFmdGVyIG9mZmNoYW5uZWwgb3IgcmYgc2xlZXAsIHRoaXMgbWF5IGNhdXNlCiAgKiBkaXMtYXNzb2NpYXRpb24gYnkgQVAgKi8KLXN0YXRpYyB2b2lkIHJ0bF9vcF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQorc3RhdGljIHZvaWQgcnRsX29wX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQogewogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKaW5kZXggZjc2Zjk1Yy4uNzIzMzE5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCkBAIC04NCw3ICs4NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICB1MzIgZGlkLCB1OCBsZW4sIHU4ICpkYXRhKQorCQkJCSAgdTMyIGRpZCwgdTggbGVuLCBjb25zdCB1OCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCBtc2c7CiAJcDgwMjExaXRlbV9wc3RyMzJfdCAqbWliaXRlbSA9CkBAIC0yOTgsNyArMjk4LDcgQEAKIAogCiBzdGF0aWMgaW50IHByaXNtMl9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCisJCQkgICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKIAl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5IHF1YWxpdHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCmluZGV4IDkxODliYzAuLjU2NjNmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCkBAIC0zMDAsNyArMzAwLDcgQEAKIAkJcG9ydCA9IG50b2hzKHNvY2tfaW4tPnNpbl9wb3J0KTsKIAl9CiAKLQlpZiAoKGlwX21hdGNoID09IHRydWUpICYmIChucC0+bnBfcG9ydCA9PSBwb3J0KSAmJgorCWlmIChpcF9tYXRjaCAmJiAobnAtPm5wX3BvcnQgPT0gcG9ydCkgJiYKIAkgICAgKG5wLT5ucF9uZXR3b3JrX3RyYW5zcG9ydCA9PSBuZXR3b3JrX3RyYW5zcG9ydCkpCiAJCXJldHVybiB0cnVlOwogCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJfQogCiAJCW1hdGNoID0gaXNjc2l0X2NoZWNrX25wX21hdGNoKHNvY2thZGRyLCBucCwgbmV0d29ya190cmFuc3BvcnQpOwotCQlpZiAobWF0Y2ggPT0gdHJ1ZSkgeworCQlpZiAobWF0Y2gpIHsKIAkJCS8qCiAJCQkgKiBJbmNyZW1lbnQgdGhlIG5wX2V4cG9ydHMgcmVmZXJlbmNlIGNvdW50IG5vdyB0bwogCQkJICogcHJldmVudCBpc2NzaXRfZGVsX25wKCkgYmVsb3cgZnJvbSBiZWluZyBjYWxsZWQKQEAgLTExMjEsNyArMTEyMSw3IEBACiAJLyoKIAkgKiBTcGVjaWFsIGNhc2UgZm9yIFVuc3VwcG9ydGVkIFNBTSBXUklURSBPcGNvZGVzIGFuZCBJbW1lZGlhdGVEYXRhPVllcy4KIAkgKi8KLQlpZiAoZHVtcF9wYXlsb2FkID09IHRydWUpCisJaWYgKGR1bXBfcGF5bG9hZCkKIAkJZ290byBhZnRlcl9pbW1lZGlhdGVfZGF0YTsKIAogCWltbWVkX3JldCA9IGlzY3NpdF9oYW5kbGVfaW1tZWRpYXRlX2RhdGEoY21kLCBoZHIsCkBAIC0zMzkwLDcgKzMzOTAsOSBAQAogCiAjZGVmaW5lIFNFTkRUQVJHRVRTX0JVRl9MSU1JVCAzMjc2OFUKIAotc3RhdGljIGludCBpc2NzaXRfYnVpbGRfc2VuZHRhcmdldHNfcmVzcG9uc2Uoc3RydWN0IGlzY3NpX2NtZCAqY21kKQorc3RhdGljIGludAoraXNjc2l0X2J1aWxkX3NlbmR0YXJnZXRzX3Jlc3BvbnNlKHN0cnVjdCBpc2NzaV9jbWQgKmNtZCwKKwkJCQkgIGVudW0gaXNjc2l0X3RyYW5zcG9ydF90eXBlIG5ldHdvcmtfdHJhbnNwb3J0KQogewogCWNoYXIgKnBheWxvYWQgPSBOVUxMOwogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY21kLT5jb25uOwpAQCAtMzQ2Nyw2ICszNDY5LDkgQEAKIAkJCQlzdHJ1Y3QgaXNjc2lfbnAgKm5wID0gdHBnX25wLT50cGdfbnA7CiAJCQkJYm9vbCBpbmFkZHJfYW55ID0gaXNjc2l0X2NoZWNrX2luYWRkcl9hbnkobnApOwogCisJCQkJaWYgKG5wLT5ucF9uZXR3b3JrX3RyYW5zcG9ydCAhPSBuZXR3b3JrX3RyYW5zcG9ydCkKKwkJCQkJY29udGludWU7CisKIAkJCQlpZiAoIXRhcmdldF9uYW1lX3ByaW50ZWQpIHsKIAkJCQkJbGVuID0gc3ByaW50ZihidWYsICJUYXJnZXROYW1lPSVzIiwKIAkJCQkJCSAgICAgIHRpcW4tPnRpcW4pOwpAQCAtMzQ4NSwxMCArMzQ5MCw4IEBACiAKIAkJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlRhcmdldEFkZHJlc3M9IgogCQkJCQkiJXM6JWh1LCVodSIsCi0JCQkJCShpbmFkZHJfYW55ID09IGZhbHNlKSA/Ci0JCQkJCQlucC0+bnBfaXAgOiBjb25uLT5sb2NhbF9pcCwKLQkJCQkJKGluYWRkcl9hbnkgPT0gZmFsc2UpID8KLQkJCQkJCW5wLT5ucF9wb3J0IDogY29ubi0+bG9jYWxfcG9ydCwKKwkJCQkJaW5hZGRyX2FueSA/IGNvbm4tPmxvY2FsX2lwIDogbnAtPm5wX2lwLAorCQkJCQlpbmFkZHJfYW55ID8gY29ubi0+bG9jYWxfcG9ydCA6IG5wLT5ucF9wb3J0LAogCQkJCQl0cGctPnRwZ3QpOwogCQkJCWxlbiArPSAxOwogCkBAIC0zNTIwLDExICszNTIzLDEyIEBACiAKIGludAogaXNjc2l0X2J1aWxkX3RleHRfcnNwKHN0cnVjdCBpc2NzaV9jbWQgKmNtZCwgc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCi0JCSAgICAgIHN0cnVjdCBpc2NzaV90ZXh0X3JzcCAqaGRyKQorCQkgICAgICBzdHJ1Y3QgaXNjc2lfdGV4dF9yc3AgKmhkciwKKwkJICAgICAgZW51bSBpc2NzaXRfdHJhbnNwb3J0X3R5cGUgbmV0d29ya190cmFuc3BvcnQpCiB7CiAJaW50IHRleHRfbGVuZ3RoLCBwYWRkaW5nOwogCi0JdGV4dF9sZW5ndGggPSBpc2NzaXRfYnVpbGRfc2VuZHRhcmdldHNfcmVzcG9uc2UoY21kKTsKKwl0ZXh0X2xlbmd0aCA9IGlzY3NpdF9idWlsZF9zZW5kdGFyZ2V0c19yZXNwb25zZShjbWQsIG5ldHdvcmtfdHJhbnNwb3J0KTsKIAlpZiAodGV4dF9sZW5ndGggPCAwKQogCQlyZXR1cm4gdGV4dF9sZW5ndGg7CiAKQEAgLTM1NjIsNyArMzU2Niw3IEBACiAJdTMyIHR4X3NpemUgPSAwOwogCWludCB0ZXh0X2xlbmd0aCwgaW92X2NvdW50ID0gMCwgcmM7CiAKLQlyYyA9IGlzY3NpdF9idWlsZF90ZXh0X3JzcChjbWQsIGNvbm4sIGhkcik7CisJcmMgPSBpc2NzaXRfYnVpbGRfdGV4dF9yc3AoY21kLCBjb25uLCBoZHIsIElTQ1NJX1RDUCk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCkBAIC00MjM0LDggKzQyMzgsNiBAQAogCWlmIChjb25uLT5jb25uX3RyYW5zcG9ydC0+aXNjc2l0X3dhaXRfY29ubikKIAkJY29ubi0+Y29ubl90cmFuc3BvcnQtPmlzY3NpdF93YWl0X2Nvbm4oY29ubik7CiAKLQlpc2NzaXRfZnJlZV9xdWV1ZV9yZXFzX2Zvcl9jb25uKGNvbm4pOwotCiAJLyoKIAkgKiBEdXJpbmcgQ29ubmVjdGlvbiByZWNvdmVyeSBkcm9wIHVuYWNrbm93bGVkZ2VkIG91dCBvZiBvcmRlcgogCSAqIGNvbW1hbmRzIGZvciB0aGlzIGNvbm5lY3Rpb24sIGFuZCBwcmVwYXJlIHRoZSBvdGhlciBjb21tYW5kcwpAQCAtNDI1Miw2ICs0MjU0LDcgQEAKIAkJaXNjc2l0X2NsZWFyX29vb19jbWRzbnNfZm9yX2Nvbm4oY29ubik7CiAJCWlzY3NpdF9yZWxlYXNlX2NvbW1hbmRzX2Zyb21fY29ubihjb25uKTsKIAl9CisJaXNjc2l0X2ZyZWVfcXVldWVfcmVxc19mb3JfY29ubihjb25uKTsKIAogCS8qCiAJICogSGFuZGxlIGRlY3JlbWVudGluZyBzZXNzaW9uIG9yIGNvbm5lY3Rpb24gdXNhZ2UgY291bnQgaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9hdXRoLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfYXV0aC5jCmluZGV4IGRlNzdkOWEuLjE5Yjg0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9hdXRoLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2F1dGguYwpAQCAtNzEsNiArNzEsNDAgQEAKIAkJCWNoYWxsZW5nZV9hc2NpaWhleCk7CiB9CiAKK3N0YXRpYyBpbnQgY2hhcF9jaGVja19hbGdvcml0aG0oY29uc3QgY2hhciAqYV9zdHIpCit7CisJY2hhciAqdG1wLCAqb3JpZywgKnRva2VuOworCisJdG1wID0ga3N0cmR1cChhX3N0ciwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXApIHsKKwkJcHJfZXJyKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIENIQVBfQSB0ZW1wb3JhcnkgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIENIQVBfRElHRVNUX1VOS05PV047CisJfQorCW9yaWcgPSB0bXA7CisKKwl0b2tlbiA9IHN0cnNlcCgmdG1wLCAiPSIpOworCWlmICghdG9rZW4pCisJCWdvdG8gb3V0OworCisJaWYgKHN0cmNtcCh0b2tlbiwgIkNIQVBfQSIpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBDSEFQX0Ega2V5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlICh0b2tlbikgeworCQl0b2tlbiA9IHN0cnNlcCgmdG1wLCAiLCIpOworCQlpZiAoIXRva2VuKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKCFzdHJuY21wKHRva2VuLCAiNSIsIDEpKSB7CisJCQlwcl9kZWJ1ZygiU2VsZWN0ZWQgTUQ1IEFsZ29yaXRobVxuIik7CisJCQlrZnJlZShvcmlnKTsKKwkJCXJldHVybiBDSEFQX0RJR0VTVF9NRDU7CisJCX0KKwl9CitvdXQ6CisJa2ZyZWUob3JpZyk7CisJcmV0dXJuIENIQVBfRElHRVNUX1VOS05PV047Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgaXNjc2lfY2hhcCAqY2hhcF9zZXJ2ZXJfb3BlbigKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKQEAgLTc5LDYgKzExMyw3IEBACiAJY2hhciAqYWljX3N0ciwKIAl1bnNpZ25lZCBpbnQgKmFpY19sZW4pCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgaXNjc2lfY2hhcCAqY2hhcDsKIAogCWlmICghKGF1dGgtPm5hZl9mbGFncyAmIE5BRl9VU0VSSURfU0VUKSB8fApAQCAtOTMsMjEgKzEyOCwyNCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWNoYXAgPSBjb25uLT5hdXRoX3Byb3RvY29sOwotCS8qCi0JICogV2Ugb25seSBzdXBwb3J0IE1ENSBNREEgcHJlc2VudGx5LgotCSAqLwotCWlmIChzdHJuY21wKGFfc3RyLCAiQ0hBUF9BPTUiLCA4KSkgewotCQlwcl9lcnIoIkNIQVBfQSBpcyBub3QgTUQ1LlxuIik7CisJcmV0ID0gY2hhcF9jaGVja19hbGdvcml0aG0oYV9zdHIpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDSEFQX0RJR0VTVF9NRDU6CisJCXByX2RlYnVnKCJbc2VydmVyXSBHb3QgQ0hBUF9BPTVcbiIpOworCQkvKgorCQkgKiBTZW5kIGJhY2sgQ0hBUF9BIHNldCB0byBNRDUuCisJCSovCisJCSphaWNfbGVuID0gc3ByaW50ZihhaWNfc3RyLCAiQ0hBUF9BPTUiKTsKKwkJKmFpY19sZW4gKz0gMTsKKwkJY2hhcC0+ZGlnZXN0X3R5cGUgPSBDSEFQX0RJR0VTVF9NRDU7CisJCXByX2RlYnVnKCJbc2VydmVyXSBTZW5kaW5nIENIQVBfQT0lZFxuIiwgY2hhcC0+ZGlnZXN0X3R5cGUpOworCQlicmVhazsKKwljYXNlIENIQVBfRElHRVNUX1VOS05PV046CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBDSEFQX0EgdmFsdWVcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcHJfZGVidWcoIltzZXJ2ZXJdIEdvdCBDSEFQX0E9NVxuIik7Ci0JLyoKLQkgKiBTZW5kIGJhY2sgQ0hBUF9BIHNldCB0byBNRDUuCi0JICovCi0JKmFpY19sZW4gPSBzcHJpbnRmKGFpY19zdHIsICJDSEFQX0E9NSIpOwotCSphaWNfbGVuICs9IDE7Ci0JY2hhcC0+ZGlnZXN0X3R5cGUgPSBDSEFQX0RJR0VTVF9NRDU7Ci0JcHJfZGVidWcoIltzZXJ2ZXJdIFNlbmRpbmcgQ0hBUF9BPSVkXG4iLCBjaGFwLT5kaWdlc3RfdHlwZSk7CisKIAkvKgogCSAqIFNldCBJZGVudGlmaWVyLgogCSAqLwpAQCAtMzE0LDYgKzM1MiwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAJLyoKKwkgKiBEdXJpbmcgbXV0dWFsIGF1dGhlbnRpY2F0aW9uLCB0aGUgQ0hBUF9DIGdlbmVyYXRlZCBieSB0aGUKKwkgKiBpbml0aWF0b3IgbXVzdCBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIENIQVBfQyBnZW5lcmF0ZWQgYnkKKwkgKiB0aGUgdGFyZ2V0LgorCSAqLworCWlmICghbWVtY21wKGNoYWxsZW5nZV9iaW5oZXgsIGNoYXAtPmNoYWxsZW5nZSwgQ0hBUF9DSEFMTEVOR0VfTEVOR1RIKSkgeworCQlwcl9lcnIoImluaXRpYXRvciBDSEFQX0MgbWF0Y2hlcyB0YXJnZXQgQ0hBUF9DLCBmYWlsaW5nIgorCQkgICAgICAgIiBsb2dpbiBhdHRlbXB0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCS8qCiAJICogR2VuZXJhdGUgQ0hBUF9OIGFuZCBDSEFQX1IgZm9yIG11dHVhbCBhdXRoZW50aWNhdGlvbi4KIAkgKi8KIAl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgibWQ1IiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfYXV0aC5oIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2F1dGguaAppbmRleCAyZjQ2M2MwLi5kMjJmN2I5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2F1dGguaAorKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfYXV0aC5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfSVNDU0lfQ0hBUF9IXwogI2RlZmluZSBfSVNDU0lfQ0hBUF9IXwogCisjZGVmaW5lIENIQVBfRElHRVNUX1VOS05PV04JMAogI2RlZmluZSBDSEFQX0RJR0VTVF9NRDUJCTUKICNkZWZpbmUgQ0hBUF9ESUdFU1RfU0hBCQk2CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9sb2dpbi5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2xvZ2luLmMKaW5kZXggZDliMWQ4OC4uZmVjYjY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2xvZ2luLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2xvZ2luLmMKQEAgLTExNDUsNyArMTE0NSw3IEBACiB2b2lkIGlzY3NpX3RhcmdldF9sb2dpbl9zZXNzX291dChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKIAkJc3RydWN0IGlzY3NpX25wICpucCwgYm9vbCB6ZXJvX3RzaWgsIGJvb2wgbmV3X3Nlc3MpCiB7Ci0JaWYgKG5ld19zZXNzID09IGZhbHNlKQorCWlmICghbmV3X3Nlc3MpCiAJCWdvdG8gb2xkX3Nlc3Nfb3V0OwogCiAJcHJfZXJyKCJpU0NTSSBMb2dpbiBuZWdvdGlhdGlvbiBmYWlsZWQuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCmluZGV4IDc1YjY4NTkuLjYyYTA5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJfQogCiAJcmMgPSBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvbm4tPmxvZ2luX3dvcmssIDApOwotCWlmIChyYyA9PSBmYWxzZSkgeworCWlmICghcmMpIHsKIAkJcHJfZGVidWcoImlzY3NpX3RhcmdldF9za19kYXRhX3JlYWR5LCBzY2hlZHVsZV9kZWxheWVkX3dvcmsiCiAJCQkgIiBnb3QgZmFsc2VcbiIpOwogCX0KQEAgLTUxMyw3ICs1MTMsNyBAQAogCXN0YXRlID0gKHRwZy0+dHBnX3N0YXRlID09IFRQR19TVEFURV9BQ1RJVkUpOwogCXNwaW5fdW5sb2NrKCZ0cGctPnRwZ19zdGF0ZV9sb2NrKTsKIAotCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCWlmICghc3RhdGUpIHsKIAkJcHJfZGVidWcoImlzY3NpX3RhcmdldF9kb19sb2dpbl9yeDogdHBnX3N0YXRlICE9IFRQR19TVEFURV9BQ1RJVkVcbiIpOwogCQlpc2NzaV90YXJnZXRfcmVzdG9yZV9zb2NrX2NhbGxiYWNrcyhjb25uKTsKIAkJaXNjc2lfdGFyZ2V0X2xvZ2luX2Ryb3AoY29ubiwgbG9naW4pOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJCXN0YXRlID0gaXNjc2lfdGFyZ2V0X3NrX3N0YXRlX2NoZWNrKHNrKTsKIAkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAotCQlpZiAoc3RhdGUgPT0gZmFsc2UpIHsKKwkJaWYgKCFzdGF0ZSkgewogCQkJcHJfZGVidWcoImlzY3NpX3RhcmdldF9kb19sb2dpbl9yeCwgVENQIHN0YXRlIENMT1NFXG4iKTsKIAkJCWlzY3NpX3RhcmdldF9yZXN0b3JlX3NvY2tfY2FsbGJhY2tzKGNvbm4pOwogCQkJaXNjc2lfdGFyZ2V0X2xvZ2luX2Ryb3AoY29ubiwgbG9naW4pOwpAQCAtNzczLDYgKzc3MywxMiBAQAogCQl9CiAKIAkJZ290byBkb19hdXRoOworCX0gZWxzZSBpZiAoIXBheWxvYWRfbGVuZ3RoKSB7CisJCXByX2VycigiSW5pdGlhdG9yIHNlbnQgemVybyBsZW5ndGggc2VjdXJpdHkgcGF5bG9hZCwiCisJCSAgICAgICAiIGxvZ2luIGZhaWxlZFxuIik7CisJCWlzY3NpdF90eF9sb2dpbl9yc3AoY29ubiwgSVNDU0lfU1RBVFVTX0NMU19JTklUSUFUT1JfRVJSLAorCQkJCSAgICBJU0NTSV9MT0dJTl9TVEFUVVNfQVVUSF9GQUlMRUQpOworCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGxvZ2luLT5maXJzdF9yZXF1ZXN0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3BhcmFtZXRlcnMuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9wYXJhbWV0ZXJzLmMKaW5kZXggNGQyZTIzZi4uMDJmOWRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3BhcmFtZXRlcnMuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfcGFyYW1ldGVycy5jCkBAIC00NzQsMTAgKzQ3NCwxMCBAQAogCQlpZiAoIXN0cmNtcChwYXJhbS0+bmFtZSwgQVVUSE1FVEhPRCkpIHsKIAkJCVNFVF9QU1RBVEVfTkVHT1RJQVRFKHBhcmFtKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLT5uYW1lLCBIRUFERVJESUdFU1QpKSB7Ci0JCQlpZiAoaXNlciA9PSBmYWxzZSkKKwkJCWlmICghaXNlcikKIAkJCQlTRVRfUFNUQVRFX05FR09USUFURShwYXJhbSk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbS0+bmFtZSwgREFUQURJR0VTVCkpIHsKLQkJCWlmIChpc2VyID09IGZhbHNlKQorCQkJaWYgKCFpc2VyKQogCQkJCVNFVF9QU1RBVEVfTkVHT1RJQVRFKHBhcmFtKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLT5uYW1lLCBNQVhDT05ORUNUSU9OUykpIHsKIAkJCVNFVF9QU1RBVEVfTkVHT1RJQVRFKHBhcmFtKTsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQl9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW0tPm5hbWUsIElNTUVESUFURURBVEEpKSB7CiAJCQlTRVRfUFNUQVRFX05FR09USUFURShwYXJhbSk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbS0+bmFtZSwgTUFYUkVDVkRBVEFTRUdNRU5UTEVOR1RIKSkgewotCQkJaWYgKGlzZXIgPT0gZmFsc2UpCisJCQlpZiAoIWlzZXIpCiAJCQkJU0VUX1BTVEFURV9ORUdPVElBVEUocGFyYW0pOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW0tPm5hbWUsIE1BWFhNSVREQVRBU0VHTUVOVExFTkdUSCkpIHsKIAkJCWNvbnRpbnVlOwpAQCAtNTI4LDEzICs1MjgsMTMgQEAKIAkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLT5uYW1lLCBPRk1BUktJTlQpKSB7CiAJCQlTRVRfUFNUQVRFX05FR09USUFURShwYXJhbSk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbS0+bmFtZSwgUkRNQUVYVEVOU0lPTlMpKSB7Ci0JCQlpZiAoaXNlciA9PSB0cnVlKQorCQkJaWYgKGlzZXIpCiAJCQkJU0VUX1BTVEFURV9ORUdPVElBVEUocGFyYW0pOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAocGFyYW0tPm5hbWUsIElOSVRJQVRPUlJFQ1ZEQVRBU0VHTUVOVExFTkdUSCkpIHsKLQkJCWlmIChpc2VyID09IHRydWUpCisJCQlpZiAoaXNlcikKIAkJCQlTRVRfUFNUQVRFX05FR09USUFURShwYXJhbSk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbS0+bmFtZSwgVEFSR0VUUkVDVkRBVEFTRUdNRU5UTEVOR1RIKSkgewotCQkJaWYgKGlzZXIgPT0gdHJ1ZSkKKwkJCWlmIChpc2VyKQogCQkJCVNFVF9QU1RBVEVfTkVHT1RJQVRFKHBhcmFtKTsKIAkJfQogCX0KQEAgLTE2MDUsNyArMTYwNSw3IEBACiAKIAl0bXBidWYgPSBremFsbG9jKGxlbmd0aCArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdG1wYnVmKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdG1wYnVmLlxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlICV1ICsgMSBieXRlcyBmb3IgdG1wYnVmLlxuIiwgbGVuZ3RoKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3RwZy5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3RwZy5jCmluZGV4IDE0MzFlODQuLmMzY2I1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF90cGcuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdHBnLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCWlzY3NpdF9yZXNldF9ucF90aHJlYWQodHBnX25wLT50cGdfbnAsIHRwZ19ucCwgdHBnLCBzaHV0ZG93bik7CiB9CiAKLXZvaWQgaXNjc2l0X2NsZWFyX3RwZ19ucF9sb2dpbl90aHJlYWRzKAorc3RhdGljIHZvaWQgaXNjc2l0X2NsZWFyX3RwZ19ucF9sb2dpbl90aHJlYWRzKAogCXN0cnVjdCBpc2NzaV9wb3J0YWxfZ3JvdXAgKnRwZywKIAlib29sIHNodXRkb3duKQogewpAQCAtMjc2LDggKzI3Niw2IEBACiAJdHBnLT50cGdfc3RhdGUgPSBUUEdfU1RBVEVfSU5BQ1RJVkU7CiAJc3Bpbl91bmxvY2soJnRwZy0+dHBnX3N0YXRlX2xvY2spOwogCi0JaXNjc2l0X2NsZWFyX3RwZ19ucF9sb2dpbl90aHJlYWRzKHRwZywgdHJ1ZSk7Ci0KIAlpZiAoaXNjc2l0X3JlbGVhc2Vfc2Vzc2lvbnNfZm9yX3RwZyh0cGcsIGZvcmNlKSA8IDApIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gZGVsZXRlIGlTQ1NJIFRhcmdldCBQb3J0YWwgR3JvdXA6IgogCQkJIiAlaHUgd2hpbGUgYWN0aXZlIHNlc3Npb25zIGV4aXN0LCBhbmQgZm9yY2U9MFxuIiwKQEAgLTQ1Myw3ICs0NTEsNyBAQAogCiAJCQltYXRjaCA9IGlzY3NpdF9jaGVja19ucF9tYXRjaChzb2NrYWRkciwgbnAsCiAJCQkJCQluZXR3b3JrX3RyYW5zcG9ydCk7Ci0JCQlpZiAobWF0Y2ggPT0gdHJ1ZSkKKwkJCWlmIChtYXRjaCkKIAkJCQlicmVhazsKIAkJfQogCQlzcGluX3VubG9jaygmdHBnLT50cGdfbnBfbG9jayk7CkBAIC00NzUsNyArNDczLDcgQEAKIAogCWlmICghdHBnX25wX3BhcmVudCkgewogCQlpZiAoaXNjc2l0X3RwZ19jaGVja19uZXR3b3JrX3BvcnRhbCh0cGctPnRwZ190aXFuLCBzb2NrYWRkciwKLQkJCQluZXR3b3JrX3RyYW5zcG9ydCkgPT0gdHJ1ZSkgeworCQkJCW5ldHdvcmtfdHJhbnNwb3J0KSkgewogCQkJcHJfZXJyKCJOZXR3b3JrIFBvcnRhbDogJXMgYWxyZWFkeSBleGlzdHMgb24gYSIKIAkJCQkiIGRpZmZlcmVudCBUUEcgb24gJXNcbiIsIGlwX3N0ciwKIAkJCQl0cGctPnRwZ190aXFuLT50aXFuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF90cGcuaCBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF90cGcuaAppbmRleCAwYTE4MmYyLi5lNzI2NTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfdHBnLmgKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3RwZy5oCkBAIC04LDcgKzgsNiBAQAogCQkJc3RydWN0IGlzY3NpX25wICosIHN0cnVjdCBpc2NzaV90cGdfbnAgKiopOwogZXh0ZXJuIGludCBpc2NzaXRfZ2V0X3RwZyhzdHJ1Y3QgaXNjc2lfcG9ydGFsX2dyb3VwICopOwogZXh0ZXJuIHZvaWQgaXNjc2l0X3B1dF90cGcoc3RydWN0IGlzY3NpX3BvcnRhbF9ncm91cCAqKTsKLWV4dGVybiB2b2lkIGlzY3NpdF9jbGVhcl90cGdfbnBfbG9naW5fdGhyZWFkcyhzdHJ1Y3QgaXNjc2lfcG9ydGFsX2dyb3VwICosIGJvb2wpOwogZXh0ZXJuIHZvaWQgaXNjc2l0X3RwZ19kdW1wX3BhcmFtcyhzdHJ1Y3QgaXNjc2lfcG9ydGFsX2dyb3VwICopOwogZXh0ZXJuIGludCBpc2NzaXRfdHBnX2FkZF9wb3J0YWxfZ3JvdXAoc3RydWN0IGlzY3NpX3RpcW4gKiwgc3RydWN0IGlzY3NpX3BvcnRhbF9ncm91cCAqKTsKIGV4dGVybiBpbnQgaXNjc2l0X3RwZ19kZWxfcG9ydGFsX2dyb3VwKHN0cnVjdCBpc2NzaV90aXFuICosIHN0cnVjdCBpc2NzaV9wb3J0YWxfZ3JvdXAgKiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IDczYWI3NWQuLjZkMmYzNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJc3RydWN0IHRjbV9sb29wX2hiYSAqdGxfaGJhOwogCXN0cnVjdCB0Y21fbG9vcF90cGcgKnRsX3RwZzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbF9iaWRpID0gTlVMTDsKLQl1MzIgc2dsX2JpZGlfY291bnQgPSAwOworCXUzMiBzZ2xfYmlkaV9jb3VudCA9IDAsIHRyYW5zZmVyX2xlbmd0aDsKIAlpbnQgcmM7CiAKIAl0bF9oYmEgPSAqKHN0cnVjdCB0Y21fbG9vcF9oYmEgKiopc2hvc3RfcHJpdihzYy0+ZGV2aWNlLT5ob3N0KTsKQEAgLTIxMywxMiArMjEzLDIxIEBACiAKIAl9CiAKLQlpZiAoIXNjc2lfcHJvdF9zZ19jb3VudChzYykgJiYgc2NzaV9nZXRfcHJvdF9vcChzYykgIT0gU0NTSV9QUk9UX05PUk1BTCkKKwl0cmFuc2Zlcl9sZW5ndGggPSBzY3NpX3RyYW5zZmVyX2xlbmd0aChzYyk7CisJaWYgKCFzY3NpX3Byb3Rfc2dfY291bnQoc2MpICYmCisJICAgIHNjc2lfZ2V0X3Byb3Rfb3Aoc2MpICE9IFNDU0lfUFJPVF9OT1JNQUwpIHsKIAkJc2VfY21kLT5wcm90X3B0byA9IHRydWU7CisJCS8qCisJCSAqIGxvb3BiYWNrIHRyYW5zcG9ydCBkb2Vzbid0IHN1cHBvcnQKKwkJICogV1JJVEVfR0VORVJBVEUsIFJFQURfU1RSSVAgcHJvdGVjdGlvbgorCQkgKiBpbmZvcm1hdGlvbiBvcGVyYXRpb25zLCBnbyBhaGVhZCB1bnByb3RlY3RlZC4KKwkJICovCisJCXRyYW5zZmVyX2xlbmd0aCA9IHNjc2lfYnVmZmxlbihzYyk7CisJfQogCiAJcmMgPSB0YXJnZXRfc3VibWl0X2NtZF9tYXBfc2dscyhzZV9jbWQsIHRsX25leHVzLT5zZV9zZXNzLCBzYy0+Y21uZCwKIAkJCSZ0bF9jbWQtPnRsX3NlbnNlX2J1ZlswXSwgdGxfY21kLT5zYy0+ZGV2aWNlLT5sdW4sCi0JCQlzY3NpX2J1ZmZsZW4oc2MpLCB0Y21fbG9vcF9zYW1fYXR0cihzYyksCisJCQl0cmFuc2Zlcl9sZW5ndGgsIHRjbV9sb29wX3NhbV9hdHRyKHNjKSwKIAkJCXNjLT5zY19kYXRhX2RpcmVjdGlvbiwgMCwKIAkJCXNjc2lfc2dsaXN0KHNjKSwgc2NzaV9zZ19jb3VudChzYyksCiAJCQlzZ2xfYmlkaSwgc2dsX2JpZGlfY291bnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zYmMuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NiYy5jCmluZGV4IGUwMjI5NTkuLmJkNzhkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NiYy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NiYy5jCkBAIC04MSw3ICs4MSw3IEBACiAJCXRyYW5zcG9ydF9rdW5tYXBfZGF0YV9zZyhjbWQpOwogCX0KIAotCXRhcmdldF9jb21wbGV0ZV9jbWQoY21kLCBHT09EKTsKKwl0YXJnZXRfY29tcGxldGVfY21kX3dpdGhfbGVuZ3RoKGNtZCwgR09PRCwgOCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQl0cmFuc3BvcnRfa3VubWFwX2RhdGFfc2coY21kKTsKIAl9CiAKLQl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgR09PRCk7CisJdGFyZ2V0X2NvbXBsZXRlX2NtZF93aXRoX2xlbmd0aChjbWQsIEdPT0QsIDMyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc2LDI0ICsxNzYsNiBAQAogCXJldHVybiBjbWQtPnNlX2Rldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplICogc2VjdG9yczsKIH0KIAotc3RhdGljIGludCBzYmNfY2hlY2tfdmFsaWRfc2VjdG9ycyhzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGVuZF9sYmE7Ci0JdTMyIHNlY3RvcnM7Ci0KLQlzZWN0b3JzID0gY21kLT5kYXRhX2xlbmd0aCAvIGRldi0+ZGV2X2F0dHJpYi5ibG9ja19zaXplOwotCWVuZF9sYmEgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpICsgMTsKLQotCWlmIChjbWQtPnRfdGFza19sYmEgKyBzZWN0b3JzID4gZW5kX2xiYSkgewotCQlwcl9lcnIoInRhcmdldDogbGJhICVsbHUsIHNlY3RvcnMgJXUgZXhjZWVkcyBlbmQgbGJhICVsbHVcbiIsCi0JCQljbWQtPnRfdGFza19sYmEsIHNlY3RvcnMsIGVuZF9sYmEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgdHJhbnNwb3J0X2dldF9zZWN0b3JzXzYodW5zaWduZWQgY2hhciAqY2RiKQogewogCS8qCkBAIC02NjUsOCArNjQ3LDE5IEBACiAKIAljbWQtPnByb3RfdHlwZSA9IGRldi0+ZGV2X2F0dHJpYi5waV9wcm90X3R5cGU7CiAJY21kLT5wcm90X2xlbmd0aCA9IGRldi0+cHJvdF9sZW5ndGggKiBzZWN0b3JzOwotCXByX2RlYnVnKCIlczogcHJvdF90eXBlPSVkLCBwcm90X2xlbmd0aD0lZCBwcm90X29wPSVkIHByb3RfY2hlY2tzPSVkXG4iLAotCQkgX19mdW5jX18sIGNtZC0+cHJvdF90eXBlLCBjbWQtPnByb3RfbGVuZ3RoLAorCisJLyoqCisJICogSW4gY2FzZSBwcm90ZWN0aW9uIGluZm9ybWF0aW9uIGV4aXN0cyBvdmVyIHRoZSB3aXJlCisJICogd2UgbW9kaWZ5IGNvbW1hbmQgZGF0YSBsZW5ndGggdG8gZGVzY3JpYmUgcHVyZSBkYXRhLgorCSAqIFRoZSBhY3R1YWwgdHJhbnNmZXIgbGVuZ3RoIGlzIGRhdGEgbGVuZ3RoICsgcHJvdGVjdGlvbgorCSAqIGxlbmd0aAorCSAqKi8KKwlpZiAocHJvdGVjdCkKKwkJY21kLT5kYXRhX2xlbmd0aCA9IHNlY3RvcnMgKiBkZXYtPmRldl9hdHRyaWIuYmxvY2tfc2l6ZTsKKworCXByX2RlYnVnKCIlczogcHJvdF90eXBlPSVkLCBkYXRhX2xlbmd0aD0lZCwgcHJvdF9sZW5ndGg9JWQgIgorCQkgInByb3Rfb3A9JWQgcHJvdF9jaGVja3M9JWRcbiIsCisJCSBfX2Z1bmNfXywgY21kLT5wcm90X3R5cGUsIGNtZC0+ZGF0YV9sZW5ndGgsIGNtZC0+cHJvdF9sZW5ndGgsCiAJCSBjbWQtPnByb3Rfb3AsIGNtZC0+cHJvdF9jaGVja3MpOwogCiAJcmV0dXJuIHRydWU7CkBAIC04NzcsMTUgKzg3MCw2IEBACiAJCWJyZWFrOwogCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CiAJY2FzZSBTWU5DSFJPTklaRV9DQUNIRV8xNjoKLQkJaWYgKCFvcHMtPmV4ZWN1dGVfc3luY19jYWNoZSkgewotCQkJc2l6ZSA9IDA7Ci0JCQljbWQtPmV4ZWN1dGVfY21kID0gc2JjX2VtdWxhdGVfbm9vcDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogRXh0cmFjdCBMQkEgYW5kIHJhbmdlIHRvIGJlIGZsdXNoZWQgZm9yIGVtdWxhdGVkIFNZTkNIUk9OSVpFX0NBQ0hFCi0JCSAqLwogCQlpZiAoY2RiWzBdID09IFNZTkNIUk9OSVpFX0NBQ0hFKSB7CiAJCQlzZWN0b3JzID0gdHJhbnNwb3J0X2dldF9zZWN0b3JzXzEwKGNkYik7CiAJCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzMyKGNkYik7CkBAIC04OTMsMTggKzg3NywxMiBAQAogCQkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xNihjZGIpOwogCQkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOwogCQl9Ci0KLQkJc2l6ZSA9IHNiY19nZXRfc2l6ZShjbWQsIHNlY3RvcnMpOwotCi0JCS8qCi0JCSAqIENoZWNrIHRvIGVuc3VyZSB0aGF0IExCQSArIFJhbmdlIGRvZXMgbm90IGV4Y2VlZCBwYXN0IGVuZCBvZgotCQkgKiBkZXZpY2UgZm9yIElCTE9DSyBhbmQgRklMRUlPIC0+ZG9fc3luY19jYWNoZSgpIGJhY2tlbmQgY2FsbHMKLQkJICovCi0JCWlmIChjbWQtPnRfdGFza19sYmEgfHwgc2VjdG9ycykgewotCQkJaWYgKHNiY19jaGVja192YWxpZF9zZWN0b3JzKGNtZCkgPCAwKQotCQkJCXJldHVybiBUQ01fQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCWlmIChvcHMtPmV4ZWN1dGVfc3luY19jYWNoZSkgeworCQkJY21kLT5leGVjdXRlX2NtZCA9IG9wcy0+ZXhlY3V0ZV9zeW5jX2NhY2hlOworCQkJZ290byBjaGVja19sYmE7CiAJCX0KLQkJY21kLT5leGVjdXRlX2NtZCA9IG9wcy0+ZXhlY3V0ZV9zeW5jX2NhY2hlOworCQlzaXplID0gMDsKKwkJY21kLT5leGVjdXRlX2NtZCA9IHNiY19lbXVsYXRlX25vb3A7CiAJCWJyZWFrOwogCWNhc2UgVU5NQVA6CiAJCWlmICghb3BzLT5leGVjdXRlX3VubWFwKQpAQCAtOTQ3LDggKzkyNSwxMCBAQAogCQlicmVhazsKIAljYXNlIFZFUklGWToKIAkJc2l6ZSA9IDA7CisJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTAoY2RiKTsKKwkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOwogCQljbWQtPmV4ZWN1dGVfY21kID0gc2JjX2VtdWxhdGVfbm9vcDsKLQkJYnJlYWs7CisJCWdvdG8gY2hlY2tfbGJhOwogCWNhc2UgUkVaRVJPX1VOSVQ6CiAJY2FzZSBTRUVLXzY6CiAJY2FzZSBTRUVLXzEwOgpAQCAtOTg4LDcgKzk2OCw3IEBACiAJCQkJZGV2LT5kZXZfYXR0cmliLmh3X21heF9zZWN0b3JzKTsKIAkJCXJldHVybiBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CiAJCX0KLQorY2hlY2tfbGJhOgogCQllbmRfbGJhID0gZGV2LT50cmFuc3BvcnQtPmdldF9ibG9ja3MoZGV2KSArIDE7CiAJCWlmIChjbWQtPnRfdGFza19sYmEgKyBzZWN0b3JzID4gZW5kX2xiYSkgewogCQkJcHJfZXJyKCJjbWQgZXhjZWVkcyBsYXN0IGxiYSAlbGx1ICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3BjLmMKaW5kZXggODY1MzY2Ni4uNmNkNzIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3BjLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3BjLmMKQEAgLTEyOSwxNSArMTI5LDEwIEBACiBzcGNfZW11bGF0ZV9ldnBkXzgwKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQogewogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwotCXUxNiBsZW4gPSAwOworCXUxNiBsZW47CiAKIAlpZiAoZGV2LT5kZXZfZmxhZ3MgJiBERl9FTVVMQVRFRF9WUERfVU5JVF9TRVJJQUwpIHsKLQkJdTMyIHVuaXRfc2VyaWFsX2xlbjsKLQotCQl1bml0X3NlcmlhbF9sZW4gPSBzdHJsZW4oZGV2LT50MTBfd3duLnVuaXRfc2VyaWFsKTsKLQkJdW5pdF9zZXJpYWxfbGVuKys7IC8qIEZvciBOVUxMIFRlcm1pbmF0b3IgKi8KLQotCQlsZW4gKz0gc3ByaW50ZigmYnVmWzRdLCAiJXMiLCBkZXYtPnQxMF93d24udW5pdF9zZXJpYWwpOworCQlsZW4gPSBzcHJpbnRmKCZidWZbNF0sICIlcyIsIGRldi0+dDEwX3d3bi51bml0X3NlcmlhbCk7CiAJCWxlbisrOyAvKiBFeHRyYSBCeXRlIGZvciBOVUxMIFRlcm1pbmF0b3IgKi8KIAkJYnVmWzNdID0gbGVuOwogCX0KQEAgLTcyMSw2ICs3MTYsNyBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAlzZW5zZV9yZWFzb25fdCByZXQ7CiAJaW50IHA7CisJaW50IGxlbiA9IDA7CiAKIAlidWYgPSBremFsbG9jKFNFX0lOUVVJUllfQlVGLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewpAQCAtNzQyLDYgKzczOCw3IEBACiAJCX0KIAogCQlyZXQgPSBzcGNfZW11bGF0ZV9pbnF1aXJ5X3N0ZChjbWQsIGJ1Zik7CisJCWxlbiA9IGJ1Zls0XSArIDU7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNzQ5LDYgKzc0Niw3IEBACiAJCWlmIChjZGJbMl0gPT0gZXZwZF9oYW5kbGVyc1twXS5wYWdlKSB7CiAJCQlidWZbMV0gPSBjZGJbMl07CiAJCQlyZXQgPSBldnBkX2hhbmRsZXJzW3BdLmVtdWxhdGUoY21kLCBidWYpOworCQkJbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZidWZbMl0pICsgNDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtNzY1LDcgKzc2Myw3IEBACiAJa2ZyZWUoYnVmKTsKIAogCWlmICghcmV0KQotCQl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgR09PRCk7CisJCXRhcmdldF9jb21wbGV0ZV9jbWRfd2l0aF9sZW5ndGgoY21kLCBHT09ELCBsZW4pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMDMsNyArMTEwMSw3IEBACiAJCXRyYW5zcG9ydF9rdW5tYXBfZGF0YV9zZyhjbWQpOwogCX0KIAotCXRhcmdldF9jb21wbGV0ZV9jbWQoY21kLCBHT09EKTsKKwl0YXJnZXRfY29tcGxldGVfY21kX3dpdGhfbGVuZ3RoKGNtZCwgR09PRCwgbGVuZ3RoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI3OSw3ICsxMjc3LDcgQEAKIAlidWZbM10gPSAobHVuX2NvdW50ICYgMHhmZik7CiAJdHJhbnNwb3J0X2t1bm1hcF9kYXRhX3NnKGNtZCk7CiAKLQl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgR09PRCk7CisJdGFyZ2V0X2NvbXBsZXRlX2NtZF93aXRoX2xlbmd0aChjbWQsIEdPT0QsIDggKyBsdW5fY291bnQgKiA4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woc3BjX2VtdWxhdGVfcmVwb3J0X2x1bnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCAyMTc5ZmVlLi43ZmE2MmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJICogLT5hY2xfZnJlZV9jb21wIGNhbGxlciB0byB3YWtldXAgY29uZmlnZnMgc2Vfbm9kZV9hY2wtPmFjbF9ncm91cAogCSAqIHJlbW92YWwgY29udGV4dC4KIAkgKi8KLQlpZiAoc2VfbmFjbCAmJiBjb21wX25hY2wgPT0gdHJ1ZSkKKwlpZiAoc2VfbmFjbCAmJiBjb21wX25hY2wpCiAJCXRhcmdldF9wdXRfbmFjbChzZV9uYWNsKTsKIAogCXRyYW5zcG9ydF9mcmVlX3Nlc3Npb24oc2Vfc2Vzcyk7CkBAIC01NjIsNyArNTYyLDcgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCi0JCWNvbXBsZXRlKCZjbWQtPnRfdHJhbnNwb3J0X3N0b3BfY29tcCk7CisJCWNvbXBsZXRlX2FsbCgmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCWlmIChjbWQtPnRyYW5zcG9ydF9zdGF0ZSAmIENNRF9UX0FCT1JURUQgJiYKIAkgICAgY21kLT50cmFuc3BvcnRfc3RhdGUgJiBDTURfVF9TVE9QKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCWNvbXBsZXRlKCZjbWQtPnRfdHJhbnNwb3J0X3N0b3BfY29tcCk7CisJCWNvbXBsZXRlX2FsbCgmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOwogCQlyZXR1cm47CiAJfSBlbHNlIGlmICghc3VjY2VzcykgewogCQlJTklUX1dPUksoJmNtZC0+d29yaywgdGFyZ2V0X2NvbXBsZXRlX2ZhaWx1cmVfd29yayk7CkBAIC03MDMsNiArNzAzLDIzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHRhcmdldF9jb21wbGV0ZV9jbWQpOwogCit2b2lkIHRhcmdldF9jb21wbGV0ZV9jbWRfd2l0aF9sZW5ndGgoc3RydWN0IHNlX2NtZCAqY21kLCB1OCBzY3NpX3N0YXR1cywgaW50IGxlbmd0aCkKK3sKKwlpZiAoc2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfR09PRCAmJiBsZW5ndGggPCBjbWQtPmRhdGFfbGVuZ3RoKSB7CisJCWlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9VTkRFUkZMT1dfQklUKSB7CisJCQljbWQtPnJlc2lkdWFsX2NvdW50ICs9IGNtZC0+ZGF0YV9sZW5ndGggLSBsZW5ndGg7CisJCX0gZWxzZSB7CisJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfVU5ERVJGTE9XX0JJVDsKKwkJCWNtZC0+cmVzaWR1YWxfY291bnQgPSBjbWQtPmRhdGFfbGVuZ3RoIC0gbGVuZ3RoOworCQl9CisKKwkJY21kLT5kYXRhX2xlbmd0aCA9IGxlbmd0aDsKKwl9CisKKwl0YXJnZXRfY29tcGxldGVfY21kKGNtZCwgc2NzaV9zdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfY29tcGxldGVfY21kX3dpdGhfbGVuZ3RoKTsKKwogc3RhdGljIHZvaWQgdGFyZ2V0X2FkZF90b19zdGF0ZV9saXN0KHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKQEAgLTE3NjEsNyArMTc3OCw3IEBACiAJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogCiAJCXNwaW5fdW5sb2NrX2lycSgmY21kLT50X3N0YXRlX2xvY2spOwotCQljb21wbGV0ZSgmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOworCQljb21wbGV0ZV9hbGwoJmNtZC0+dF90cmFuc3BvcnRfc3RvcF9jb21wKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjM2Myw3ICsyMzgwLDcgQEAKIAkgKiBmYWJyaWMgYWNrbm93bGVkZ2VtZW50IHRoYXQgcmVxdWlyZXMgdHdvIHRhcmdldF9wdXRfc2Vzc19jbWQoKQogCSAqIGludm9jYXRpb25zIGJlZm9yZSBzZV9jbWQgZGVzY3JpcHRvciByZWxlYXNlLgogCSAqLwotCWlmIChhY2tfa3JlZiA9PSB0cnVlKSB7CisJaWYgKGFja19rcmVmKSB7CiAJCWtyZWZfZ2V0KCZzZV9jbWQtPmNtZF9rcmVmKTsKIAkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX0FDS19LUkVGOwogCX0KQEAgLTI0MDcsNiArMjQyNCwxMCBAQAogICovCiBpbnQgdGFyZ2V0X3B1dF9zZXNzX2NtZChzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2Vzcywgc3RydWN0IHNlX2NtZCAqc2VfY21kKQogeworCWlmICghc2Vfc2VzcykgeworCQlzZV9jbWQtPnNlX3Rmby0+cmVsZWFzZV9jbWQoc2VfY21kKTsKKwkJcmV0dXJuIDE7CisJfQogCXJldHVybiBrcmVmX3B1dF9zcGlubG9ja19pcnFzYXZlKCZzZV9jbWQtPmNtZF9rcmVmLCB0YXJnZXRfcmVsZWFzZV9jbWRfa3JlZiwKIAkJCSZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrKTsKIH0KQEAgLTI5MzQsNiArMjk1NSwxMiBAQAogaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV90bXIoCiAJc3RydWN0IHNlX2NtZCAqY21kKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwljbWQtPnRyYW5zcG9ydF9zdGF0ZSB8PSBDTURfVF9BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwogCUlOSVRfV09SSygmY21kLT53b3JrLCB0YXJnZXRfdG1yX3dvcmspOwogCXF1ZXVlX3dvcmsoY21kLT5zZV9kZXYtPnRtcl93cSwgJmNtZC0+d29yayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV94Y29weS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfeGNvcHkuYwppbmRleCA2NjljNTM2Li5lOTE4NmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV94Y29weS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3hjb3B5LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHRtcF9kZXZfd3duW1hDT1BZX05BQV9JRUVFX1JFR0VYX0xFTl0sICpkZXZfd3duOwogCWludCByYzsKIAotCWlmIChzcmMgPT0gdHJ1ZSkKKwlpZiAoc3JjKQogCQlkZXZfd3duID0gJnhvcC0+ZHN0X3RpZF93d25bMF07CiAJZWxzZQogCQlkZXZfd3duID0gJnhvcC0+c3JjX3RpZF93d25bMF07CkBAIC04OCw3ICs4OCw3IEBACiAJCWlmIChyYyAhPSAwKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNyYyA9PSB0cnVlKSB7CisJCWlmIChzcmMpIHsKIAkJCXhvcC0+ZHN0X2RldiA9IHNlX2RldjsKIAkJCXByX2RlYnVnKCJYQ09QWSAweGU0OiBTZXR0aW5nIHhvcC0+ZHN0X2RldjogJXAgZnJvbSBsb2NhdGVkIgogCQkJCSIgc2VfZGV2XG4iLCB4b3AtPmRzdF9kZXYpOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChzcmMgPT0gdHJ1ZSkgeworCWlmIChzcmMpIHsKIAkJbWVtY3B5KCZ4b3AtPnNyY190aWRfd3duWzBdLCAmZGVzY1s4XSwgWENPUFlfTkFBX0lFRUVfUkVHRVhfTEVOKTsKIAkJLyoKIAkJICogRGV0ZXJtaW5lIGlmIHRoZSBzb3VyY2UgZGVzaWduYXRvciBtYXRjaGVzIHRoZSBsb2NhbCBkZXZpY2UKQEAgLTIzNiw3ICsyMzYsNyBAQAogCQkJLyoKIAkJCSAqIEFzc3VtZSB0YXJnZXQgZGVzY3JpcHRvcnMgYXJlIGluIHNvdXJjZSAtPiBkZXN0aW5hdGlvbiBvcmRlci4uCiAJCQkgKi8KLQkJCWlmIChzcmMgPT0gdHJ1ZSkKKwkJCWlmIChzcmMpCiAJCQkJc3JjID0gZmFsc2U7CiAJCQllbHNlCiAJCQkJc3JjID0gdHJ1ZTsKQEAgLTU2MCw3ICs1NjAsNyBAQAogCSAqIHJlc2VydmF0aW9ucy4gIFRoZSBwdF9jbWQtPnNlX2x1biBwb2ludGVyIHdpbGwgYmUgc2V0dXAgZnJvbSB3aXRoaW4KIAkgKiB0YXJnZXRfeGNvcHlfc2V0dXBfcHRfcG9ydCgpCiAJICovCi0JaWYgKHJlbW90ZV9wb3J0ID09IGZhbHNlKSB7CisJaWYgKCFyZW1vdGVfcG9ydCkgewogCQlwdF9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0VfTFVOX0NNRCB8IFNDRl9DTURfWENPUFlfUEFTU1RIUk9VR0g7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCmluZGV4IGY1ZmQ1MTUuLmJlMGMwZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwpAQCAtMTI4LDYgKzEyOCw3IEBACiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXA7CiAJc2l6ZV90IGxlbjsKKwlpbnQgcmM7CiAKIAlpZiAoY21kLT5hYm9ydGVkKQogCQlyZXR1cm4gMDsKQEAgLTEzNyw5ICsxMzgsMTAgQEAKIAlsZW4gPSBzaXplb2YoKmZjcCkgKyBzZV9jbWQtPnNjc2lfc2Vuc2VfbGVuZ3RoOwogCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGxlbik7CiAJaWYgKCFmcCkgewotCQkvKiBYWFggc2hvdWxkbid0IGp1c3QgZHJvcCBpdCAtIHJlcXVldWUgYW5kIHJldHJ5PyAqLwotCQlyZXR1cm4gMDsKKwkJc2VfY21kLT5zY3NpX3N0YXR1cyA9IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEw7CisJCXJldHVybiAtRU5PTUVNOwogCX0KKwogCWZjcCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBsZW4pOwogCW1lbXNldChmY3AsIDAsIGxlbik7CiAJZmNwLT5yZXNwLmZyX3N0YXR1cyA9IHNlX2NtZC0+c2NzaV9zdGF0dXM7CkBAIC0xNzAsNyArMTcyLDE4IEBACiAJZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRERfQ01EX1NUQVRVUywgZXAtPmRpZCwgZXAtPnNpZCwgRkNfVFlQRV9GQ1AsCiAJCSAgICAgICBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVEsIDApOwogCi0JbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBjbWQtPnNlcSwgZnApOworCXJjID0gbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBjbWQtPnNlcSwgZnApOworCWlmIChyYykgeworCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCIlczogRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2UgZnJhbWUgJXAsICIKKwkJCQkgICAgInhpZCA8MHgleD5cbiIsIF9fZnVuY19fLCBmcCwgZXAtPnhpZCk7CisJCS8qCisJCSAqIEdlbmVyYXRlIGEgVEFTS19TRVRfRlVMTCBzdGF0dXMgdG8gbm90aWZ5IHRoZSBpbml0aWF0b3IKKwkJICogdG8gcmVkdWNlIGl0J3MgcXVldWVfZGVwdGggYWZ0ZXIgdGhlIHNlX2NtZCByZXNwb25zZSBoYXMKKwkJICogYmVlbiByZS1xdWV1ZWQgYnkgdGFyZ2V0LWNvcmUuCisJCSAqLworCQlzZV9jbWQtPnNjc2lfc3RhdHVzID0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCWxwb3J0LT50dC5leGNoX2RvbmUoY21kLT5zZXEpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCmluZGV4IGU0MTVhZjMuLjk3YjQ4NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKQEAgLTgyLDYgKzgyLDEwIEBACiAKIAlpZiAoY21kLT5hYm9ydGVkKQogCQlyZXR1cm4gMDsKKworCWlmIChzZV9jbWQtPnNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpCisJCWdvdG8gcXVldWVfc3RhdHVzOworCiAJZXAgPSBmY19zZXFfZXhjaChjbWQtPnNlcSk7CiAJbHBvcnQgPSBlcC0+bHA7CiAJY21kLT5zZXEgPSBscG9ydC0+dHQuc2VxX3N0YXJ0X25leHQoY21kLT5zZXEpOwpAQCAtMTc4LDE0ICsxODIsMjMgQEAKIAkJCSAgICAgICBGQ19UWVBFX0ZDUCwgZl9jdGwsIGZoX29mZik7CiAJCWVycm9yID0gbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzZXEsIGZwKTsKIAkJaWYgKGVycm9yKSB7Ci0JCQkvKiBYWFggRm9yIG5vdywgaW5pdGlhdG9yIHdpbGwgcmV0cnkgKi8KLQkJCXByX2Vycl9yYXRlbGltaXRlZCgiJXM6IEZhaWxlZCB0byBzZW5kIGZyYW1lICVwLCAiCisJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCIlczogRmFpbGVkIHRvIHNlbmQgZnJhbWUgJXAsICIKIAkJCQkJCSJ4aWQgPDB4JXg+LCByZW1haW5pbmcgJXp1LCAiCiAJCQkJCQkibHNvX21heCA8MHgleD5cbiIsCiAJCQkJCQlfX2Z1bmNfXywgZnAsIGVwLT54aWQsCiAJCQkJCQlyZW1haW5pbmcsIGxwb3J0LT5sc29fbWF4KTsKKwkJCS8qCisJCQkgKiBHbyBhaGVhZCBhbmQgc2V0IFRBU0tfU0VUX0ZVTEwgc3RhdHVzIGlnbm9yaW5nIHRoZQorCQkJICogcmVzdCBvZiB0aGUgRGF0YUlOLCBhbmQgaW1tZWRpYXRlbHkgYXR0ZW1wdCB0bworCQkJICogc2VuZCB0aGUgcmVzcG9uc2UgdmlhIGZ0X3F1ZXVlX3N0YXR1cygpIGluIG9yZGVyCisJCQkgKiB0byBub3RpZnkgdGhlIGluaXRpYXRvciB0aGF0IGl0IHNob3VsZCByZWR1Y2UgaXQncworCQkJICogcGVyIExVTiBxdWV1ZV9kZXB0aC4KKwkJCSAqLworCQkJc2VfY21kLT5zY3NpX3N0YXR1cyA9IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEw7CisJCQlicmVhazsKIAkJfQogCX0KK3F1ZXVlX3N0YXR1czoKIAlyZXR1cm4gZnRfcXVldWVfc3RhdHVzKHNlX2NtZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKaW5kZXggZmYyMDVhNy4uNjQ4ZjllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKQEAgLTIyMCwxMSArMjIwLDExIEBACiAJICogSWYgd2UgY2FuJ3QgcmVhZCB0aGUgZmlsZSwgaXQncyBubyBnb29kLgogCSAqIElmIHdlIGNhbid0IHdyaXRlIHRoZSBmaWxlLCB1c2UgaXQgcmVhZC1vbmx5LgogCSAqLwotCWlmICghKGZpbHAtPmZfb3AtPnJlYWQgfHwgZmlscC0+Zl9vcC0+YWlvX3JlYWQpKSB7CisJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfQ0FOX1JFQUQpKSB7CiAJCUxJTkZPKGN1cmx1biwgImZpbGUgbm90IHJlYWRhYmxlOiAlc1xuIiwgZmlsZW5hbWUpOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCEoZmlscC0+Zl9vcC0+d3JpdGUgfHwgZmlscC0+Zl9vcC0+YWlvX3dyaXRlKSkKKwlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9DQU5fV1JJVEUpKQogCQlybyA9IDE7CiAKIAlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUtPmlfbWFwcGluZy0+aG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwppbmRleCBmZTA4ODBkLi4zZDc4YTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCiAJbmV0LT5uZXRkZXZfb3BzID0gJmV0aF9uZXRkZXZfb3BzOwogCi0JU0VUX0VUSFRPT0xfT1BTKG5ldCwgJm9wcyk7CisJbmV0LT5ldGh0b29sX29wcyA9ICZvcHM7CiAKIAlkZXYtPmdhZGdldCA9IGc7CiAJU0VUX05FVERFVl9ERVYobmV0LCAmZy0+ZGV2KTsKQEAgLTg1MCw3ICs4NTAsNyBAQAogCiAJbmV0LT5uZXRkZXZfb3BzID0gJmV0aF9uZXRkZXZfb3BzOwogCi0JU0VUX0VUSFRPT0xfT1BTKG5ldCwgJm9wcyk7CisJbmV0LT5ldGh0b29sX29wcyA9ICZvcHM7CiAJU0VUX05FVERFVl9ERVZUWVBFKG5ldCwgJmdhZGdldF90eXBlKTsKIAogCXJldHVybiBuZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Njc2kuYyBiL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCmluZGV4IGU5YzI4MGYuLjRmNGZmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCisrKyBiL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCkBAIC01Nyw3ICs1Nyw4IEBACiAjZGVmaW5lIFRDTV9WSE9TVF9NQVhfQ0RCX1NJWkUgMzIKICNkZWZpbmUgVENNX1ZIT1NUX0RFRkFVTFRfVEFHUyAyNTYKICNkZWZpbmUgVENNX1ZIT1NUX1BSRUFMTE9DX1NHTFMgMjA0OAotI2RlZmluZSBUQ01fVkhPU1RfUFJFQUxMT0NfUEFHRVMgMjA0OAorI2RlZmluZSBUQ01fVkhPU1RfUFJFQUxMT0NfVVBBR0VTIDIwNDgKKyNkZWZpbmUgVENNX1ZIT1NUX1BSRUFMTE9DX1BST1RfU0dMUyA1MTIKIAogc3RydWN0IHZob3N0X3Njc2lfaW5mbGlnaHQgewogCS8qIFdhaXQgZm9yIHRoZSBmbHVzaCBvcGVyYXRpb24gdG8gZmluaXNoICovCkBAIC03OSwxMCArODAsMTIgQEAKIAl1NjQgdHZjX3RhZzsKIAkvKiBUaGUgbnVtYmVyIG9mIHNjYXR0ZXJsaXN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbWQgKi8KIAl1MzIgdHZjX3NnbF9jb3VudDsKKwl1MzIgdHZjX3Byb3Rfc2dsX2NvdW50OwogCS8qIFNhdmVkIHVucGFja2VkIFNDU0kgTFVOIGZvciB0Y21fdmhvc3Rfc3VibWlzc2lvbl93b3JrKCkgKi8KIAl1MzIgdHZjX2x1bjsKIAkvKiBQb2ludGVyIHRvIHRoZSBTR0wgZm9ybWF0dGVkIG1lbW9yeSBmcm9tIHZpcnRpby1zY3NpICovCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICp0dmNfc2dsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqdHZjX3Byb3Rfc2dsOwogCXN0cnVjdCBwYWdlICoqdHZjX3VwYWdlczsKIAkvKiBQb2ludGVyIHRvIHJlc3BvbnNlICovCiAJc3RydWN0IHZpcnRpb19zY3NpX2NtZF9yZXNwIF9fdXNlciAqdHZjX3Jlc3A7CkBAIC0xNjYsNyArMTY5LDggQEAKIH07CiAKIGVudW0gewotCVZIT1NUX1NDU0lfRkVBVFVSRVMgPSBWSE9TVF9GRUFUVVJFUyB8ICgxVUxMIDw8IFZJUlRJT19TQ1NJX0ZfSE9UUExVRykKKwlWSE9TVF9TQ1NJX0ZFQVRVUkVTID0gVkhPU1RfRkVBVFVSRVMgfCAoMVVMTCA8PCBWSVJUSU9fU0NTSV9GX0hPVFBMVUcpIHwKKwkJCQkJICAgICAgICgxVUxMIDw8IFZJUlRJT19TQ1NJX0ZfVDEwX1BJKQogfTsKIAogI2RlZmluZSBWSE9TVF9TQ1NJX01BWF9UQVJHRVQJMjU2CkBAIC00NTYsMTIgKzQ2MCwxNiBAQAogCXN0cnVjdCB0Y21fdmhvc3RfY21kICp0dl9jbWQgPSBjb250YWluZXJfb2Yoc2VfY21kLAogCQkJCXN0cnVjdCB0Y21fdmhvc3RfY21kLCB0dmNfc2VfY21kKTsKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IHNlX2NtZC0+c2Vfc2VzczsKKwlpbnQgaTsKIAogCWlmICh0dl9jbWQtPnR2Y19zZ2xfY291bnQpIHsKLQkJdTMyIGk7CiAJCWZvciAoaSA9IDA7IGkgPCB0dl9jbWQtPnR2Y19zZ2xfY291bnQ7IGkrKykKIAkJCXB1dF9wYWdlKHNnX3BhZ2UoJnR2X2NtZC0+dHZjX3NnbFtpXSkpOwogCX0KKwlpZiAodHZfY21kLT50dmNfcHJvdF9zZ2xfY291bnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHR2X2NtZC0+dHZjX3Byb3Rfc2dsX2NvdW50OyBpKyspCisJCQlwdXRfcGFnZShzZ19wYWdlKCZ0dl9jbWQtPnR2Y19wcm90X3NnbFtpXSkpOworCX0KIAogCXRjbV92aG9zdF9wdXRfaW5mbGlnaHQodHZfY21kLT5pbmZsaWdodCk7CiAJcGVyY3B1X2lkYV9mcmVlKCZzZV9zZXNzLT5zZXNzX3RhZ19wb29sLCBzZV9jbWQtPm1hcF90YWcpOwpAQCAtNzEzLDE2ICs3MjEsMTQgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB0Y21fdmhvc3RfY21kICoKLXZob3N0X3Njc2lfZ2V0X3RhZyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwKLQkJCXN0cnVjdCB0Y21fdmhvc3RfdHBnICp0cGcsCi0JCQlzdHJ1Y3QgdmlydGlvX3Njc2lfY21kX3JlcSAqdl9yZXEsCi0JCQl1MzIgZXhwX2RhdGFfbGVuLAotCQkJaW50IGRhdGFfZGlyZWN0aW9uKQordmhvc3Rfc2NzaV9nZXRfdGFnKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3QgdGNtX3Zob3N0X3RwZyAqdHBnLAorCQkgICB1bnNpZ25lZCBjaGFyICpjZGIsIHU2NCBzY3NpX3RhZywgdTE2IGx1biwgdTggdGFza19hdHRyLAorCQkgICB1MzIgZXhwX2RhdGFfbGVuLCBpbnQgZGF0YV9kaXJlY3Rpb24pCiB7CiAJc3RydWN0IHRjbV92aG9zdF9jbWQgKmNtZDsKIAlzdHJ1Y3QgdGNtX3Zob3N0X25leHVzICp0dl9uZXh1czsKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzczsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csICpwcm90X3NnOwogCXN0cnVjdCBwYWdlICoqcGFnZXM7CiAJaW50IHRhZzsKIApAQCAtNzQxLDE5ICs3NDcsMjQgQEAKIAogCWNtZCA9ICYoKHN0cnVjdCB0Y21fdmhvc3RfY21kICopc2Vfc2Vzcy0+c2Vzc19jbWRfbWFwKVt0YWddOwogCXNnID0gY21kLT50dmNfc2dsOworCXByb3Rfc2cgPSBjbWQtPnR2Y19wcm90X3NnbDsKIAlwYWdlcyA9IGNtZC0+dHZjX3VwYWdlczsKIAltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IHRjbV92aG9zdF9jbWQpKTsKIAogCWNtZC0+dHZjX3NnbCA9IHNnOworCWNtZC0+dHZjX3Byb3Rfc2dsID0gcHJvdF9zZzsKIAljbWQtPnR2Y191cGFnZXMgPSBwYWdlczsKIAljbWQtPnR2Y19zZV9jbWQubWFwX3RhZyA9IHRhZzsKLQljbWQtPnR2Y190YWcgPSB2X3JlcS0+dGFnOwotCWNtZC0+dHZjX3Rhc2tfYXR0ciA9IHZfcmVxLT50YXNrX2F0dHI7CisJY21kLT50dmNfdGFnID0gc2NzaV90YWc7CisJY21kLT50dmNfbHVuID0gbHVuOworCWNtZC0+dHZjX3Rhc2tfYXR0ciA9IHRhc2tfYXR0cjsKIAljbWQtPnR2Y19leHBfZGF0YV9sZW4gPSBleHBfZGF0YV9sZW47CiAJY21kLT50dmNfZGF0YV9kaXJlY3Rpb24gPSBkYXRhX2RpcmVjdGlvbjsKIAljbWQtPnR2Y19uZXh1cyA9IHR2X25leHVzOwogCWNtZC0+aW5mbGlnaHQgPSB0Y21fdmhvc3RfZ2V0X2luZmxpZ2h0KHZxKTsKIAorCW1lbWNweShjbWQtPnR2Y19jZGIsIGNkYiwgVENNX1ZIT1NUX01BWF9DREJfU0laRSk7CisKIAlyZXR1cm4gY21kOwogfQogCkBAIC03NjcsMzQgKzc3OCwyNyBAQAogCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKIAkJICAgICAgdW5zaWduZWQgaW50IHNnbF9jb3VudCwKIAkJICAgICAgc3RydWN0IGlvdmVjICppb3YsCi0JCSAgICAgIGludCB3cml0ZSkKKwkJICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJICAgICAgYm9vbCB3cml0ZSkKIHsKIAl1bnNpZ25lZCBpbnQgbnBhZ2VzID0gMCwgcGFnZXNfbnIsIG9mZnNldCwgbmJ5dGVzOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzZ2w7CiAJdm9pZCBfX3VzZXIgKnB0ciA9IGlvdi0+aW92X2Jhc2U7CiAJc2l6ZV90IGxlbiA9IGlvdi0+aW92X2xlbjsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCWludCByZXQsIGk7CiAKLQlpZiAoc2dsX2NvdW50ID4gVENNX1ZIT1NUX1BSRUFMTE9DX1NHTFMpIHsKLQkJcHJfZXJyKCJ2aG9zdF9zY3NpX21hcF90b19zZ2woKSBwc2dsX2NvdW50OiAldSBncmVhdGVyIHRoYW4iCi0JCSAgICAgICAiIHByZWFsbG9jYXRlZCBUQ01fVkhPU1RfUFJFQUxMT0NfU0dMUzogJXVcbiIsCi0JCQlzZ2xfY291bnQsIFRDTV9WSE9TVF9QUkVBTExPQ19TR0xTKTsKLQkJcmV0dXJuIC1FTk9CVUZTOwotCX0KLQogCXBhZ2VzX25yID0gaW92X251bV9wYWdlcyhpb3YpOwotCWlmIChwYWdlc19uciA+IHNnbF9jb3VudCkKLQkJcmV0dXJuIC1FTk9CVUZTOwotCi0JaWYgKHBhZ2VzX25yID4gVENNX1ZIT1NUX1BSRUFMTE9DX1BBR0VTKSB7CisJaWYgKHBhZ2VzX25yID4gc2dsX2NvdW50KSB7CiAJCXByX2Vycigidmhvc3Rfc2NzaV9tYXBfdG9fc2dsKCkgcGFnZXNfbnI6ICV1IGdyZWF0ZXIgdGhhbiIKLQkJICAgICAgICIgcHJlYWxsb2NhdGVkIFRDTV9WSE9TVF9QUkVBTExPQ19QQUdFUzogJXVcbiIsCi0JCQlwYWdlc19uciwgVENNX1ZIT1NUX1BSRUFMTE9DX1BBR0VTKTsKKwkJICAgICAgICIgc2dsX2NvdW50OiAldVxuIiwgcGFnZXNfbnIsIHNnbF9jb3VudCk7CiAJCXJldHVybiAtRU5PQlVGUzsKIAl9Ci0KLQlwYWdlcyA9IHR2X2NtZC0+dHZjX3VwYWdlczsKKwlpZiAocGFnZXNfbnIgPiBUQ01fVkhPU1RfUFJFQUxMT0NfVVBBR0VTKSB7CisJCXByX2Vycigidmhvc3Rfc2NzaV9tYXBfdG9fc2dsKCkgcGFnZXNfbnI6ICV1IGdyZWF0ZXIgdGhhbiIKKwkJICAgICAgICIgcHJlYWxsb2NhdGVkIFRDTV9WSE9TVF9QUkVBTExPQ19VUEFHRVM6ICV1XG4iLAorCQkJcGFnZXNfbnIsIFRDTV9WSE9TVF9QUkVBTExPQ19VUEFHRVMpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQogCiAJcmV0ID0gZ2V0X3VzZXJfcGFnZXNfZmFzdCgodW5zaWduZWQgbG9uZylwdHIsIHBhZ2VzX25yLCB3cml0ZSwgcGFnZXMpOwogCS8qIE5vIHBhZ2VzIHdlcmUgcGlubmVkICovCkBAIC04MjUsMzMgKzgyOSwzMiBAQAogc3RhdGljIGludAogdmhvc3Rfc2NzaV9tYXBfaW92X3RvX3NnbChzdHJ1Y3QgdGNtX3Zob3N0X2NtZCAqY21kLAogCQkJICBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgdW5zaWduZWQgaW50IG5pb3YsCi0JCQkgIGludCB3cml0ZSkKKwkJCSAgaW50IG5pb3YsCisJCQkgIGJvb2wgd3JpdGUpCiB7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgc2dsX2NvdW50OwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGNtZC0+dHZjX3NnbDsKKwl1bnNpZ25lZCBpbnQgc2dsX2NvdW50ID0gMDsKKwlpbnQgcmV0LCBpOwogCi0JLyoKLQkgKiBGaW5kIG91dCBob3cgbG9uZyBzZ2xpc3QgbmVlZHMgdG8gYmUKLQkgKi8KLQlzZ2xfY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspCiAJCXNnbF9jb3VudCArPSBpb3ZfbnVtX3BhZ2VzKCZpb3ZbaV0pOwogCi0JLyogVE9ETyBvdmVyZmxvdyBjaGVja2luZyAqLworCWlmIChzZ2xfY291bnQgPiBUQ01fVkhPU1RfUFJFQUxMT0NfU0dMUykgeworCQlwcl9lcnIoInZob3N0X3Njc2lfbWFwX2lvdl90b19zZ2woKSBzZ2xfY291bnQ6ICV1IGdyZWF0ZXIgdGhhbiIKKwkJCSIgcHJlYWxsb2NhdGVkIFRDTV9WSE9TVF9QUkVBTExPQ19TR0xTOiAldVxuIiwKKwkJCXNnbF9jb3VudCwgVENNX1ZIT1NUX1BSRUFMTE9DX1NHTFMpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQogCi0Jc2cgPSBjbWQtPnR2Y19zZ2w7CiAJcHJfZGVidWcoIiVzIHNnICVwIHNnbF9jb3VudCAldVxuIiwgX19mdW5jX18sIHNnLCBzZ2xfY291bnQpOwogCXNnX2luaXRfdGFibGUoc2csIHNnbF9jb3VudCk7Ci0KIAljbWQtPnR2Y19zZ2xfY291bnQgPSBzZ2xfY291bnQ7CiAKLQlwcl9kZWJ1ZygiTWFwcGluZyAldSBpb3ZlY3MgZm9yICV1IHBhZ2VzXG4iLCBuaW92LCBzZ2xfY291bnQpOworCXByX2RlYnVnKCJNYXBwaW5nIGlvdmVjICVwIGZvciAldSBwYWdlc1xuIiwgJmlvdlswXSwgc2dsX2NvdW50KTsKKwogCWZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspIHsKIAkJcmV0ID0gdmhvc3Rfc2NzaV9tYXBfdG9fc2dsKGNtZCwgc2csIHNnbF9jb3VudCwgJmlvdltpXSwKLQkJCQkJICAgIHdyaXRlKTsKKwkJCQkJICAgIGNtZC0+dHZjX3VwYWdlcywgd3JpdGUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZm9yIChpID0gMDsgaSA8IGNtZC0+dHZjX3NnbF9jb3VudDsgaSsrKQogCQkJCXB1dF9wYWdlKHNnX3BhZ2UoJmNtZC0+dHZjX3NnbFtpXSkpOwpAQCAtODU5LDMxICs4NjIsNzAgQEAKIAkJCWNtZC0+dHZjX3NnbF9jb3VudCA9IDA7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0KIAkJc2cgKz0gcmV0OwogCQlzZ2xfY291bnQgLT0gcmV0OwogCX0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAordmhvc3Rfc2NzaV9tYXBfaW92X3RvX3Byb3Qoc3RydWN0IHRjbV92aG9zdF9jbWQgKmNtZCwKKwkJCSAgIHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgaW50IG5pb3YsCisJCQkgICBib29sIHdyaXRlKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqcHJvdF9zZyA9IGNtZC0+dHZjX3Byb3Rfc2dsOworCXVuc2lnbmVkIGludCBwcm90X3NnbF9jb3VudCA9IDA7CisJaW50IHJldCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspCisJCXByb3Rfc2dsX2NvdW50ICs9IGlvdl9udW1fcGFnZXMoJmlvdltpXSk7CisKKwlpZiAocHJvdF9zZ2xfY291bnQgPiBUQ01fVkhPU1RfUFJFQUxMT0NfUFJPVF9TR0xTKSB7CisJCXByX2Vycigidmhvc3Rfc2NzaV9tYXBfaW92X3RvX3Byb3QoKSBzZ2xfY291bnQ6ICV1IGdyZWF0ZXIgdGhhbiIKKwkJCSIgcHJlYWxsb2NhdGVkIFRDTV9WSE9TVF9QUkVBTExPQ19QUk9UX1NHTFM6ICV1XG4iLAorCQkJcHJvdF9zZ2xfY291bnQsIFRDTV9WSE9TVF9QUkVBTExPQ19QUk9UX1NHTFMpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJcHJfZGVidWcoIiVzIHByb3Rfc2cgJXAgcHJvdF9zZ2xfY291bnQgJXVcbiIsIF9fZnVuY19fLAorCQkgcHJvdF9zZywgcHJvdF9zZ2xfY291bnQpOworCXNnX2luaXRfdGFibGUocHJvdF9zZywgcHJvdF9zZ2xfY291bnQpOworCWNtZC0+dHZjX3Byb3Rfc2dsX2NvdW50ID0gcHJvdF9zZ2xfY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmlvdjsgaSsrKSB7CisJCXJldCA9IHZob3N0X3Njc2lfbWFwX3RvX3NnbChjbWQsIHByb3Rfc2csIHByb3Rfc2dsX2NvdW50LCAmaW92W2ldLAorCQkJCQkgICAgY21kLT50dmNfdXBhZ2VzLCB3cml0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgY21kLT50dmNfcHJvdF9zZ2xfY291bnQ7IGkrKykKKwkJCQlwdXRfcGFnZShzZ19wYWdlKCZjbWQtPnR2Y19wcm90X3NnbFtpXSkpOworCisJCQljbWQtPnR2Y19wcm90X3NnbF9jb3VudCA9IDA7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXByb3Rfc2cgKz0gcmV0OworCQlwcm90X3NnbF9jb3VudCAtPSByZXQ7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCB0Y21fdmhvc3Rfc3VibWlzc2lvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdGNtX3Zob3N0X2NtZCAqY21kID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0Y21fdmhvc3RfY21kLCB3b3JrKTsKIAlzdHJ1Y3QgdGNtX3Zob3N0X25leHVzICp0dl9uZXh1czsKIAlzdHJ1Y3Qgc2VfY21kICpzZV9jbWQgPSAmY21kLT50dmNfc2VfY21kOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcHRyLCAqc2dfYmlkaV9wdHIgPSBOVUxMOwotCWludCByYywgc2dfbm9fYmlkaSA9IDA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19wdHIsICpzZ19wcm90X3B0ciA9IE5VTEw7CisJaW50IHJjOwogCisJLyogRklYTUU6IEJJREkgb3BlcmF0aW9uICovCiAJaWYgKGNtZC0+dHZjX3NnbF9jb3VudCkgewogCQlzZ19wdHIgPSBjbWQtPnR2Y19zZ2w7Ci0vKiBGSVhNRTogRml4IEJJREkgb3BlcmF0aW9uIGluIHRjbV92aG9zdF9zdWJtaXNzaW9uX3dvcmsoKSAqLwotI2lmIDAKLQkJaWYgKHNlX2NtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0JJREkpIHsKLQkJCXNnX2JpZGlfcHRyID0gTlVMTDsKLQkJCXNnX25vX2JpZGkgPSAwOwotCQl9Ci0jZW5kaWYKKworCQlpZiAoY21kLT50dmNfcHJvdF9zZ2xfY291bnQpCisJCQlzZ19wcm90X3B0ciA9IGNtZC0+dHZjX3Byb3Rfc2dsOworCQllbHNlCisJCQlzZV9jbWQtPnByb3RfcHRvID0gdHJ1ZTsKIAl9IGVsc2UgewogCQlzZ19wdHIgPSBOVUxMOwogCX0KQEAgLTg5NCw3ICs5MzYsNyBAQAogCQkJY21kLT50dmNfbHVuLCBjbWQtPnR2Y19leHBfZGF0YV9sZW4sCiAJCQljbWQtPnR2Y190YXNrX2F0dHIsIGNtZC0+dHZjX2RhdGFfZGlyZWN0aW9uLAogCQkJVEFSR0VUX1NDRl9BQ0tfS1JFRiwgc2dfcHRyLCBjbWQtPnR2Y19zZ2xfY291bnQsCi0JCQlzZ19iaWRpX3B0ciwgc2dfbm9fYmlkaSwgTlVMTCwgMCk7CisJCQlOVUxMLCAwLCBzZ19wcm90X3B0ciwgY21kLT50dmNfcHJvdF9zZ2xfY291bnQpOwogCWlmIChyYyA8IDApIHsKIAkJdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZShzZV9jbWQsCiAJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkUsIDApOwpAQCAtOTI2LDEyICs5NjgsMTggQEAKIHsKIAlzdHJ1Y3QgdGNtX3Zob3N0X3RwZyAqKnZzX3RwZzsKIAlzdHJ1Y3QgdmlydGlvX3Njc2lfY21kX3JlcSB2X3JlcTsKKwlzdHJ1Y3QgdmlydGlvX3Njc2lfY21kX3JlcV9waSB2X3JlcV9waTsKIAlzdHJ1Y3QgdGNtX3Zob3N0X3RwZyAqdHBnOwogCXN0cnVjdCB0Y21fdmhvc3RfY21kICpjbWQ7Ci0JdTMyIGV4cF9kYXRhX2xlbiwgZGF0YV9maXJzdCwgZGF0YV9udW0sIGRhdGFfZGlyZWN0aW9uOworCXU2NCB0YWc7CisJdTMyIGV4cF9kYXRhX2xlbiwgZGF0YV9maXJzdCwgZGF0YV9udW0sIGRhdGFfZGlyZWN0aW9uLCBwcm90X2ZpcnN0OwogCXVuc2lnbmVkIG91dCwgaW4sIGk7Ci0JaW50IGhlYWQsIHJldDsKLQl1OCB0YXJnZXQ7CisJaW50IGhlYWQsIHJldCwgZGF0YV9uaW92LCBwcm90X25pb3YsIHByb3RfYnl0ZXM7CisJc2l6ZV90IHJlcV9zaXplOworCXUxNiBsdW47CisJdTggKnRhcmdldCwgKmx1bnAsIHRhc2tfYXR0cjsKKwlib29sIGhkcl9waTsKKwl2b2lkICpyZXEsICpjZGI7CiAKIAltdXRleF9sb2NrKCZ2cS0+bXV0ZXgpOwogCS8qCkBAIC05NjIsNyArMTAxMCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0vKiBGSVhNRTogQklESSBvcGVyYXRpb24gKi8KKwkJLyogRklYTUU6IEJJREkgb3BlcmF0aW9uICovCiAJCWlmIChvdXQgPT0gMSAmJiBpbiA9PSAxKSB7CiAJCQlkYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOwogCQkJZGF0YV9maXJzdCA9IDA7CkBAIC05OTIsMjkgKzEwNDAsMzggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KHZxLT5pb3ZbMF0uaW92X2xlbiAhPSBzaXplb2Yodl9yZXEpKSkgewotCQkJdnFfZXJyKHZxLCAiRXhwZWN0aW5nIHZpcnRpb19zY3NpX2NtZF9yZXEsIGdvdCAlenUiCi0JCQkJIiBieXRlc1xuIiwgdnEtPmlvdlswXS5pb3ZfbGVuKTsKKwkJaWYgKHZob3N0X2hhc19mZWF0dXJlKHZxLCBWSVJUSU9fU0NTSV9GX1QxMF9QSSkpIHsKKwkJCXJlcSA9ICZ2X3JlcV9waTsKKwkJCWx1bnAgPSAmdl9yZXFfcGkubHVuWzBdOworCQkJdGFyZ2V0ID0gJnZfcmVxX3BpLmx1blsxXTsKKwkJCXJlcV9zaXplID0gc2l6ZW9mKHZfcmVxX3BpKTsKKwkJCWhkcl9waSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlyZXEgPSAmdl9yZXE7CisJCQlsdW5wID0gJnZfcmVxLmx1blswXTsKKwkJCXRhcmdldCA9ICZ2X3JlcS5sdW5bMV07CisJCQlyZXFfc2l6ZSA9IHNpemVvZih2X3JlcSk7CisJCQloZHJfcGkgPSBmYWxzZTsKKwkJfQorCisJCWlmICh1bmxpa2VseSh2cS0+aW92WzBdLmlvdl9sZW4gPCByZXFfc2l6ZSkpIHsKKwkJCXByX2VycigiRXhwZWN0aW5nIHZpcnRpby1zY3NpIGhlYWRlcjogJXp1LCBnb3QgJXp1XG4iLAorCQkJICAgICAgIHJlcV9zaXplLCB2cS0+aW92WzBdLmlvdl9sZW4pOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZGVidWcoIkNhbGxpbmcgX19jb3B5X2Zyb21fdXNlcjogdnEtPmlvdlswXS5pb3ZfYmFzZTogJXAsIgotCQkJIiBsZW46ICV6dVxuIiwgdnEtPmlvdlswXS5pb3ZfYmFzZSwgc2l6ZW9mKHZfcmVxKSk7Ci0JCXJldCA9IF9fY29weV9mcm9tX3VzZXIoJnZfcmVxLCB2cS0+aW92WzBdLmlvdl9iYXNlLAotCQkJCXNpemVvZih2X3JlcSkpOworCQlyZXQgPSBtZW1jcHlfZnJvbWlvdmVjZW5kKHJlcSwgJnZxLT5pb3ZbMF0sIDAsIHJlcV9zaXplKTsKIAkJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJCXZxX2Vycih2cSwgIkZhdWx0ZWQgb24gdmlydGlvX3Njc2lfY21kX3JlcVxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCS8qIHZpcnRpby1zY3NpIHNwZWMgcmVxdWlyZXMgYnl0ZSAwIG9mIHRoZSBsdW4gdG8gYmUgMSAqLwotCQlpZiAodW5saWtlbHkodl9yZXEubHVuWzBdICE9IDEpKSB7CisJCWlmICh1bmxpa2VseSgqbHVucCAhPSAxKSkgewogCQkJdmhvc3Rfc2NzaV9zZW5kX2JhZF90YXJnZXQodnMsIHZxLCBoZWFkLCBvdXQpOwogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBFeHRyYWN0IHRoZSB0cGd0ICovCi0JCXRhcmdldCA9IHZfcmVxLmx1blsxXTsKLQkJdHBnID0gQUNDRVNTX09OQ0UodnNfdHBnW3RhcmdldF0pOworCQl0cGcgPSBBQ0NFU1NfT05DRSh2c190cGdbKnRhcmdldF0pOwogCiAJCS8qIFRhcmdldCBkb2VzIG5vdCBleGlzdCwgZmFpbCB0aGUgcmVxdWVzdCAqLwogCQlpZiAodW5saWtlbHkoIXRwZykpIHsKQEAgLTEwMjIsMTcgKzEwNzksNzkgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZXhwX2RhdGFfbGVuID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGRhdGFfbnVtOyBpKyspCi0JCQlleHBfZGF0YV9sZW4gKz0gdnEtPmlvdltkYXRhX2ZpcnN0ICsgaV0uaW92X2xlbjsKKwkJZGF0YV9uaW92ID0gZGF0YV9udW07CisJCXByb3RfbmlvdiA9IHByb3RfZmlyc3QgPSBwcm90X2J5dGVzID0gMDsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGlmIGFueSBwcm90ZWN0aW9uIGluZm9ybWF0aW9uIGlvdmVjcyBhcmUgcHJlY2VlZGluZworCQkgKiB0aGUgYWN0dWFsIGRhdGEgcGF5bG9hZCwgYW5kIGFkanVzdCBkYXRhX2ZpcnN0ICsgZGF0YV9uaW92CisJCSAqIHZhbHVlcyBhY2NvcmRpbmdseSBmb3Igdmhvc3Rfc2NzaV9tYXBfaW92X3RvX3NnbCgpIGJlbG93LgorCQkgKgorCQkgKiBBbHNvIGV4dHJhY3QgdmlydGlvX3Njc2kgaGVhZGVyIGJpdHMgZm9yIHZob3N0X3Njc2lfZ2V0X3RhZygpCisJCSAqLworCQlpZiAoaGRyX3BpKSB7CisJCQlpZiAodl9yZXFfcGkucGlfYnl0ZXNvdXQpIHsKKwkJCQlpZiAoZGF0YV9kaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkgeworCQkJCQl2cV9lcnIodnEsICJSZWNlaXZlZCBub24gemVybyBkb19waV9uaW92IgorCQkJCQkJIiwgYnV0IHdyb25nIGRhdGFfZGlyZWN0aW9uXG4iKTsKKwkJCQkJZ290byBlcnJfY21kOworCQkJCX0KKwkJCQlwcm90X2J5dGVzID0gdl9yZXFfcGkucGlfYnl0ZXNvdXQ7CisJCQl9IGVsc2UgaWYgKHZfcmVxX3BpLnBpX2J5dGVzaW4pIHsKKwkJCQlpZiAoZGF0YV9kaXJlY3Rpb24gIT0gRE1BX0ZST01fREVWSUNFKSB7CisJCQkJCXZxX2Vycih2cSwgIlJlY2VpdmVkIG5vbiB6ZXJvIGRpX3BpX25pb3YiCisJCQkJCQkiLCBidXQgd3JvbmcgZGF0YV9kaXJlY3Rpb25cbiIpOworCQkJCQlnb3RvIGVycl9jbWQ7CisJCQkJfQorCQkJCXByb3RfYnl0ZXMgPSB2X3JlcV9waS5waV9ieXRlc2luOworCQkJfQorCQkJaWYgKHByb3RfYnl0ZXMpIHsKKwkJCQlpbnQgdG1wID0gMDsKIAotCQljbWQgPSB2aG9zdF9zY3NpX2dldF90YWcodnEsIHRwZywgJnZfcmVxLAotCQkJCQkgZXhwX2RhdGFfbGVuLCBkYXRhX2RpcmVjdGlvbik7CisJCQkJZm9yIChpID0gMDsgaSA8IGRhdGFfbnVtOyBpKyspIHsKKwkJCQkJdG1wICs9IHZxLT5pb3ZbZGF0YV9maXJzdCArIGldLmlvdl9sZW47CisJCQkJCXByb3RfbmlvdisrOworCQkJCQlpZiAodG1wID49IHByb3RfYnl0ZXMpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJvdF9maXJzdCA9IGRhdGFfZmlyc3Q7CisJCQkJZGF0YV9maXJzdCArPSBwcm90X25pb3Y7CisJCQkJZGF0YV9uaW92ID0gZGF0YV9udW0gLSBwcm90X25pb3Y7CisJCQl9CisJCQl0YWcgPSB2X3JlcV9waS50YWc7CisJCQl0YXNrX2F0dHIgPSB2X3JlcV9waS50YXNrX2F0dHI7CisJCQljZGIgPSAmdl9yZXFfcGkuY2RiWzBdOworCQkJbHVuID0gKCh2X3JlcV9waS5sdW5bMl0gPDwgOCkgfCB2X3JlcV9waS5sdW5bM10pICYgMHgzRkZGOworCQl9IGVsc2UgeworCQkJdGFnID0gdl9yZXEudGFnOworCQkJdGFza19hdHRyID0gdl9yZXEudGFza19hdHRyOworCQkJY2RiID0gJnZfcmVxLmNkYlswXTsKKwkJCWx1biA9ICgodl9yZXEubHVuWzJdIDw8IDgpIHwgdl9yZXEubHVuWzNdKSAmIDB4M0ZGRjsKKwkJfQorCQlleHBfZGF0YV9sZW4gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YV9uaW92OyBpKyspCisJCQlleHBfZGF0YV9sZW4gKz0gdnEtPmlvdltkYXRhX2ZpcnN0ICsgaV0uaW92X2xlbjsKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCB0aGUgcmVjaWV2ZWQgQ0RCIHNpemUgZG9lcyBub3QgZXhjZWVkZWQgb3VyCisJCSAqIGhhcmRjb2RlZCBtYXggZm9yIHZob3N0LXNjc2kKKwkJICoKKwkJICogVE9ETyB3aGF0IGlmIGNkYiB3YXMgdG9vIHNtYWxsIGZvciB2YXJsZW4gY2RiIGhlYWRlcj8KKwkJICovCisJCWlmICh1bmxpa2VseShzY3NpX2NvbW1hbmRfc2l6ZShjZGIpID4gVENNX1ZIT1NUX01BWF9DREJfU0laRSkpIHsKKwkJCXZxX2Vycih2cSwgIlJlY2VpdmVkIFNDU0kgQ0RCIHdpdGggY29tbWFuZF9zaXplOiAlZCB0aGF0IgorCQkJCSIgZXhjZWVkcyBTQ1NJX01BWF9WQVJMRU5fQ0RCX1NJWkU6ICVkXG4iLAorCQkJCXNjc2lfY29tbWFuZF9zaXplKGNkYiksIFRDTV9WSE9TVF9NQVhfQ0RCX1NJWkUpOworCQkJZ290byBlcnJfY21kOworCQl9CisKKwkJY21kID0gdmhvc3Rfc2NzaV9nZXRfdGFnKHZxLCB0cGcsIGNkYiwgdGFnLCBsdW4sIHRhc2tfYXR0ciwKKwkJCQkJIGV4cF9kYXRhX2xlbiArIHByb3RfYnl0ZXMsCisJCQkJCSBkYXRhX2RpcmVjdGlvbik7CiAJCWlmIChJU19FUlIoY21kKSkgewogCQkJdnFfZXJyKHZxLCAidmhvc3Rfc2NzaV9nZXRfdGFnIGZhaWxlZCAlbGRcbiIsCiAJCQkJCVBUUl9FUlIoY21kKSk7CiAJCQlnb3RvIGVycl9jbWQ7CiAJCX0KKwogCQlwcl9kZWJ1ZygiQWxsb2NhdGVkIHR2X2NtZDogJXAgZXhwX2RhdGFfbGVuOiAlZCwgZGF0YV9kaXJlY3Rpb24iCiAJCQkiOiAlZFxuIiwgY21kLCBleHBfZGF0YV9sZW4sIGRhdGFfZGlyZWN0aW9uKTsKIApAQCAtMTA0MCw0MCArMTE1OSwyOCBAQAogCQljbWQtPnR2Y192cSA9IHZxOwogCQljbWQtPnR2Y19yZXNwID0gdnEtPmlvdltvdXRdLmlvdl9iYXNlOwogCi0JCS8qCi0JCSAqIENvcHkgaW4gdGhlIHJlY2lldmVkIENEQiBkZXNjcmlwdG9yIGludG8gY21kLT50dmNfY2RiCi0JCSAqIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRjbV92aG9zdF9uZXdfY21kX21hcCgpIGFuZCBkb3duIGludG8KLQkJICogdGFyZ2V0X3NldHVwX2NtZF9mcm9tX2NkYigpCi0JCSAqLwotCQltZW1jcHkoY21kLT50dmNfY2RiLCB2X3JlcS5jZGIsIFRDTV9WSE9TVF9NQVhfQ0RCX1NJWkUpOwotCQkvKgotCQkgKiBDaGVjayB0aGF0IHRoZSByZWNpZXZlZCBDREIgc2l6ZSBkb2VzIG5vdCBleGNlZWRlZCBvdXIKLQkJICogaGFyZGNvZGVkIG1heCBmb3IgdGNtX3Zob3N0Ci0JCSAqLwotCQkvKiBUT0RPIHdoYXQgaWYgY2RiIHdhcyB0b28gc21hbGwgZm9yIHZhcmxlbiBjZGIgaGVhZGVyPyAqLwotCQlpZiAodW5saWtlbHkoc2NzaV9jb21tYW5kX3NpemUoY21kLT50dmNfY2RiKSA+Ci0JCQkJCVRDTV9WSE9TVF9NQVhfQ0RCX1NJWkUpKSB7Ci0JCQl2cV9lcnIodnEsICJSZWNlaXZlZCBTQ1NJIENEQiB3aXRoIGNvbW1hbmRfc2l6ZTogJWQgdGhhdCIKLQkJCQkiIGV4Y2VlZHMgU0NTSV9NQVhfVkFSTEVOX0NEQl9TSVpFOiAlZFxuIiwKLQkJCQlzY3NpX2NvbW1hbmRfc2l6ZShjbWQtPnR2Y19jZGIpLAotCQkJCVRDTV9WSE9TVF9NQVhfQ0RCX1NJWkUpOwotCQkJZ290byBlcnJfZnJlZTsKLQkJfQotCQljbWQtPnR2Y19sdW4gPSAoKHZfcmVxLmx1blsyXSA8PCA4KSB8IHZfcmVxLmx1blszXSkgJiAweDNGRkY7Ci0KIAkJcHJfZGVidWcoInZob3N0X3Njc2kgZ290IGNvbW1hbmQgb3Bjb2RlOiAlIzAyeCwgbHVuOiAlZFxuIiwKIAkJCWNtZC0+dHZjX2NkYlswXSwgY21kLT50dmNfbHVuKTsKIAorCQlpZiAocHJvdF9uaW92KSB7CisJCQlyZXQgPSB2aG9zdF9zY3NpX21hcF9pb3ZfdG9fcHJvdChjbWQsCisJCQkJCSZ2cS0+aW92W3Byb3RfZmlyc3RdLCBwcm90X25pb3YsCisJCQkJCWRhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSk7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCXZxX2Vycih2cSwgIkZhaWxlZCB0byBtYXAgaW92IHRvIgorCQkJCQkiIHByb3Rfc2dsXG4iKTsKKwkJCQlnb3RvIGVycl9mcmVlOworCQkJfQorCQl9CiAJCWlmIChkYXRhX2RpcmVjdGlvbiAhPSBETUFfTk9ORSkgewogCQkJcmV0ID0gdmhvc3Rfc2NzaV9tYXBfaW92X3RvX3NnbChjbWQsCi0JCQkJCSZ2cS0+aW92W2RhdGFfZmlyc3RdLCBkYXRhX251bSwKKwkJCQkJJnZxLT5pb3ZbZGF0YV9maXJzdF0sIGRhdGFfbmlvdiwKIAkJCQkJZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKTsKIAkJCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIG1hcCBpb3YgdG8gc2dsXG4iKTsKIAkJCQlnb3RvIGVycl9mcmVlOwogCQkJfQogCQl9Ci0KIAkJLyoKIAkJICogU2F2ZSB0aGUgZGVzY3JpcHRvciBmcm9tIHZob3N0X2dldF92cV9kZXNjKCkgdG8gYmUgdXNlZCB0bwogCQkgKiBjb21wbGV0ZSB0aGUgdmlydGlvLXNjc2kgcmVxdWVzdCBpbiBUQ00gY2FsbGJhY2sgY29udGV4dCB2aWEKQEAgLTE3MTYsNiArMTgyMyw3IEBACiAJCXR2X2NtZCA9ICYoKHN0cnVjdCB0Y21fdmhvc3RfY21kICopc2Vfc2Vzcy0+c2Vzc19jbWRfbWFwKVtpXTsKIAogCQlrZnJlZSh0dl9jbWQtPnR2Y19zZ2wpOworCQlrZnJlZSh0dl9jbWQtPnR2Y19wcm90X3NnbCk7CiAJCWtmcmVlKHR2X2NtZC0+dHZjX3VwYWdlcyk7CiAJfQogfQpAQCAtMTc1MCw3ICsxODU4LDcgQEAKIAl0dl9uZXh1cy0+dHZuX3NlX3Nlc3MgPSB0cmFuc3BvcnRfaW5pdF9zZXNzaW9uX3RhZ3MoCiAJCQkJCVRDTV9WSE9TVF9ERUZBVUxUX1RBR1MsCiAJCQkJCXNpemVvZihzdHJ1Y3QgdGNtX3Zob3N0X2NtZCksCi0JCQkJCVRBUkdFVF9QUk9UX05PUk1BTCk7CisJCQkJCVRBUkdFVF9QUk9UX0RJTl9QQVNTIHwgVEFSR0VUX1BST1RfRE9VVF9QQVNTKTsKIAlpZiAoSVNfRVJSKHR2X25leHVzLT50dm5fc2Vfc2VzcykpIHsKIAkJbXV0ZXhfdW5sb2NrKCZ0cGctPnR2X3RwZ19tdXRleCk7CiAJCWtmcmVlKHR2X25leHVzKTsKQEAgLTE3NjksMTIgKzE4NzcsMjAgQEAKIAkJfQogCiAJCXR2X2NtZC0+dHZjX3VwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICoKLQkJCQkJVENNX1ZIT1NUX1BSRUFMTE9DX1BBR0VTLCBHRlBfS0VSTkVMKTsKKwkJCQkJVENNX1ZIT1NUX1BSRUFMTE9DX1VQQUdFUywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdHZfY21kLT50dmNfdXBhZ2VzKSB7CiAJCQltdXRleF91bmxvY2soJnRwZy0+dHZfdHBnX211dGV4KTsKIAkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHR2X2NtZC0+dHZjX3VwYWdlc1xuIik7CiAJCQlnb3RvIG91dDsKIAkJfQorCisJCXR2X2NtZC0+dHZjX3Byb3Rfc2dsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCisJCQkJCVRDTV9WSE9TVF9QUkVBTExPQ19QUk9UX1NHTFMsIEdGUF9LRVJORUwpOworCQlpZiAoIXR2X2NtZC0+dHZjX3Byb3Rfc2dsKSB7CisJCQltdXRleF91bmxvY2soJnRwZy0+dHZfdHBnX211dGV4KTsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHR2X2NtZC0+dHZjX3Byb3Rfc2dsXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCS8qCiAJICogU2luY2Ugd2UgYXJlIHJ1bm5pbmcgaW4gJ2RlbW8gbW9kZScgdGhpcyBjYWxsIHdpdGggZ2VuZXJhdGUgYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IGM3YjRmMGYuLjhiZjQ5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTIwLDYgKzIwLDcgQEAKIHNvdXJjZSAiZHJpdmVycy9ncHUvdmdhL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9ncHUvaG9zdDF4L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvZ3B1L2lwdS12My9LY29uZmlnIgogCiBtZW51ICJEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIiCiBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggNWEzZWIyZS4uNWQ0NDkwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNvbmZpZyBMQ0RfQ09SR0kKIAl0cmlzdGF0ZSAiTENEIFBhbmVsIHN1cHBvcnQgZm9yIFNIQVJQIGNvcmdpL3NwaXR6IG1vZGVsIgotCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQWEFfU0hBUlBTTAorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQWEFfU0hBUlBTTCAmJiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJaGVscAogCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSBMQ0QgcGFuZWxzIHVzdWFsbHkgZm91bmQgb24gU0hBUlAKIAkgIGNvcmdpIChDN3gwKSBhbmQgc3BpdHogKEN4eDAwKSBtb2RlbHMuCkBAIC0zNzAsNyArMzcwLDcgQEAKIAogY29uZmlnIEJBQ0tMSUdIVF9MTTM2MzBBCiAJdHJpc3RhdGUgIkJhY2tsaWdodCBEcml2ZXIgZm9yIExNMzYzMEEiCi0JZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIEkyQworCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBJMkMgJiYgUFdNCiAJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBUaGlzIHN1cHBvcnRzIFRJIExNMzYzMEEgQmFja2xpZ2h0IERyaXZlcgpAQCAtMzg2LDE0ICszODYsMTQgQEAKIAogY29uZmlnIEJBQ0tMSUdIVF9MUDg1NVgKIAl0cmlzdGF0ZSAiQmFja2xpZ2h0IGRyaXZlciBmb3IgVEkgTFA4NTVYIgotCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBJMkMKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgSTJDICYmIFBXTQogCWhlbHAKIAkgIFRoaXMgc3VwcG9ydHMgVEkgTFA4NTUwLCBMUDg1NTEsIExQODU1MiwgTFA4NTUzLCBMUDg1NTUsIExQODU1NiBhbmQKIAkgIExQODU1NyBiYWNrbGlnaHQgZHJpdmVyLgogCiBjb25maWcgQkFDS0xJR0hUX0xQODc4OAogCXRyaXN0YXRlICJCYWNrbGlnaHQgZHJpdmVyIGZvciBUSSBMUDg3ODggTUZEIgotCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBNRkRfTFA4Nzg4CisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIE1GRF9MUDg3ODggJiYgUFdNCiAJaGVscAogCSAgVGhpcyBzdXBwb3J0cyBUSSBMUDg3ODggYmFja2xpZ2h0IGRyaXZlci4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZ3Bpb19iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2dwaW9fYmFja2xpZ2h0LmMKaW5kZXggYTJlYmExMi4uMWNlYTY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZ3Bpb19iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ncGlvX2JhY2tsaWdodC5jCkBAIC0zOCw3ICszOCw4IEBACiAJICAgIGJsLT5wcm9wcy5zdGF0ZSAmIChCTF9DT1JFX1NVU1BFTkRFRCB8IEJMX0NPUkVfRkJCTEFOSykpCiAJCWJyaWdodG5lc3MgPSAwOwogCi0JZ3Bpb19zZXRfdmFsdWUoZ2JsLT5ncGlvLCBicmlnaHRuZXNzID8gZ2JsLT5hY3RpdmUgOiAhZ2JsLT5hY3RpdmUpOworCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGdibC0+Z3BpbywKKwkJCQlicmlnaHRuZXNzID8gZ2JsLT5hY3RpdmUgOiAhZ2JsLT5hY3RpdmUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMKaW5kZXggNTEwYTFiYy4uMmQ2ZDQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNtMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3M2ZTYzbTAuYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAJc3RydWN0IHM2ZTYzbTAgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWNoYXIgdGVtcFszXTsKIAotCXNwcmludGYodGVtcCwgIiVkXG4iLCBsY2QtPmdhbW1hX3RhYmxlX2NvdW50KTsKKwlzcHJpbnRmKHRlbXAsICIldVxuIiwgbGNkLT5nYW1tYV90YWJsZV9jb3VudCk7CiAJc3RyY3B5KGJ1ZiwgdGVtcCk7CiAKIAlyZXR1cm4gc3RybGVuKGJ1Zik7CmRpZmYgLS1naXQgYS9maXJtd2FyZS9NYWtlZmlsZSBiL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IGNiYjA5Y2UuLjU3NDc0MTcgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL01ha2VmaWxlCisrKyBiL2Zpcm13YXJlL01ha2VmaWxlCkBAIC00LDEwICs0LDEwIEBACiAKICMgQ3JlYXRlICQoZndhYnMpIGZyb20gJChDT05GSUdfRVhUUkFfRklSTVdBUkVfRElSKSAtLSBpZiBpdCBkb2Vzbid0IGhhdmUgYQogIyBsZWFkaW5nIC8sIGl0J3MgcmVsYXRpdmUgdG8gJChzcmN0cmVlKS4KLWZ3ZGlyIDo9ICQoc3Vic3QgIiwsJChDT05GSUdfRVhUUkFfRklSTVdBUkVfRElSKSkKK2Z3ZGlyIDo9ICQoc3Vic3QgJChxdW90ZSksLCQoQ09ORklHX0VYVFJBX0ZJUk1XQVJFX0RJUikpCiBmd2FicyA6PSAkKGFkZHByZWZpeCAkKHNyY3RyZWUpLywkKGZpbHRlci1vdXQgLyUsJChmd2RpcikpKSQoZmlsdGVyIC8lLCQoZndkaXIpKQogCi1mdy1leHRlcm5hbC15IDo9ICQoc3Vic3QgIiwsJChDT05GSUdfRVhUUkFfRklSTVdBUkUpKQorZnctZXh0ZXJuYWwteSA6PSAkKHN1YnN0ICQocXVvdGUpLCwkKENPTkZJR19FWFRSQV9GSVJNV0FSRSkpCiAKICMgVGhlcmUgYXJlIHRocmVlIGNhc2VzIHRvIGNhcmUgYWJvdXQ6CiAjIDEuIEJ1aWxkaW5nIGtlcm5lbCB3aXRoIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eSAtLSAkKGZ3LXNoaXBwZWQteSkgc2hvdWxkCkBAIC0xMzgsMTIgKzEzOCw2IEBACiAKIGZ3LXNoaXBwZWQtYWxsIDo9ICQoZnctc2hpcHBlZC15KSAkKGZ3LXNoaXBwZWQtbSkgJChmdy1zaGlwcGVkLSkKIAotIyBEaXJlY3RvcmllcyB3aGljaCB3ZSBfbWlnaHRfIG5lZWQgdG8gY3JlYXRlLCBzbyB3ZSBoYXZlIGEgcnVsZSBmb3IgdGhlbS4KLWZpcm13YXJlLWRpcnMgOj0gJChzb3J0ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvJChvYmopLywkKGRpciAkKGZ3LWV4dGVybmFsLXkpICQoZnctc2hpcHBlZC1hbGwpKSkpCi0KLXF1aWV0X2NtZF9ta2RpciA9IE1LRElSICAgJChwYXRzdWJzdCAkKG9ianRyZWUpLyUsJSwkQCkKLSAgICAgIGNtZF9ta2RpciA9IG1rZGlyIC1wICRACi0KIHF1aWV0X2NtZF9paGV4ICA9IElIRVggICAgJEAKICAgICAgIGNtZF9paGV4ICA9ICQoT0JKQ09QWSkgLUlpaGV4IC1PYmluYXJ5ICQ8ICRACiAKQEAgLTE4NCwyMSArMTc4LDEwIEBACiAJCWluY2x1ZGUvY29uZmlnL3N1cGVyaDMyLmggaW5jbHVkZS9jb25maWcvc3VwZXJoNjQuaCBcCiAJCWluY2x1ZGUvY29uZmlnL3g4Nl8zMi5oIGluY2x1ZGUvY29uZmlnL3g4Nl82NC5oKQogCi0jIFdvcmthcm91bmQgZm9yIG1ha2UgPCAzLjgxLCB3aGVyZSAuU0VDT05ERVhQQU5TSU9OIGRvZXNuJ3Qgd29yay4KLSMgSXQnbGwgZW5kIHVwIGRlcGVuZGluZyBvbiB0aGVzZSB0YXJnZXRzLCBzbyBtYWtlIHRoZW0gYSBQSE9OWSBydWxlIHdoaWNoCi0jIGRlcGVuZHMgb24gX2FsbF8gdGhlIGRpcmVjdG9yaWVzIGluICQoZmlybXdhcmUtZGlycyksIGFuZCBpdCdsbCB3b3JrIG91dCBPSy4KLVBIT05ZICs9ICQob2JqdHJlZSkvJCQoJSkgJChvYmp0cmVlKS8kKG9iaikvJCQoJSkKLSQob2JqdHJlZSkvJCQoJSkgJChvYmp0cmVlKS8kKG9iaikvJCQoJSk6ICQoZmlybXdhcmUtZGlycykKLQlAdHJ1ZQotCi0jIEZvciB0aGUgJCQoZGlyICUpIHRyaWNrLCB3aGVyZSB3ZSBuZWVkICUgdG8gYmUgZXhwYW5kZWQgZmlyc3QuCi0uU0VDT05ERVhQQU5TSU9OOgotCi0kKHBhdHN1YnN0ICUsJChvYmopLyUuZ2VuLlMsICQoZnctc2hpcHBlZC15KSk6ICU6ICQod29yZHNpemVfZGVwcykgXAotCQl8ICQob2JqdHJlZSkvJCQoZGlyICUpCiskKHBhdHN1YnN0ICUsJChvYmopLyUuZ2VuLlMsICQoZnctc2hpcHBlZC15KSk6ICU6ICQod29yZHNpemVfZGVwcykKIAkkKGNhbGwgY21kLGZ3YmluLCQocGF0c3Vic3QgJS5nZW4uUywlLCRAKSkKICQocGF0c3Vic3QgJSwkKG9iaikvJS5nZW4uUywgJChmdy1leHRlcm5hbC15KSk6ICU6ICQod29yZHNpemVfZGVwcykgXAotCQlpbmNsdWRlL2NvbmZpZy9leHRyYS9maXJtd2FyZS9kaXIuaCB8ICQob2JqdHJlZSkvJCQoZGlyICUpCisJCWluY2x1ZGUvY29uZmlnL2V4dHJhL2Zpcm13YXJlL2Rpci5oCiAJJChjYWxsIGNtZCxmd2JpbiwkKGZ3YWJzKS8kKHBhdHN1YnN0ICQob2JqKS8lLmdlbi5TLCUsJEApKQogCiAjIFRoZSAubyBmaWxlcyBkZXBlbmQgb24gdGhlIGJpbmFyaWVzIGRpcmVjdGx5OyB0aGUgLlMgZmlsZXMgZG9uJ3QuCkBAIC0yMDcsNyArMTkwLDcgQEAKIAogIyAuaWhleCBpcyB1c2VkIGp1c3QgYXMgYSBzaW1wbGUgd2F5IHRvIGhvbGQgYmluYXJ5IGZpbGVzIGluIGEgc291cmNlIHRyZWUKICMgd2hlcmUgYmluYXJpZXMgYXJlIGZyb3duZWQgdXBvbi4gVGhleSBhcmUgZGlyZWN0bHkgY29udmVydGVkIHdpdGggb2JqY29weS4KLSQob2JqKS8lOiAkKG9iaikvJS5paGV4IHwgJChvYmp0cmVlKS8kKG9iaikvJCQoZGlyICUpCiskKG9iaikvJTogJChvYmopLyUuaWhleAogCSQoY2FsbCBjbWQsaWhleCkKIAogIyBEb24ndCBkZXBlbmQgb24gaWhleDJmdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGFuZCBpdCBhbHJlYWR5IGV4aXN0cy4KQEAgLTIyNiwxNiArMjA5LDEzIEBACiAjIGlzIGFjdHVhbGx5IG1lYW5pbmdmdWwsIGJlY2F1c2UgdGhlIGZpcm13YXJlIGhhcyB0byBiZSBsb2FkZWQgaW4gYSBjZXJ0YWluCiAjIG9yZGVyIHJhdGhlciB0aGFuIGFzIGEgc2luZ2xlIGJpbmFyeSBibG9iLiBUaHVzLCB3ZSBjb252ZXJ0IHRoZW0gaW50byBvdXIKICMgbW9yZSBjb21wYWN0IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBpaGV4IHJlY29yZHMgKDxsaW51eC9paGV4Lmg+KQotJChvYmopLyUuZnc6ICQob2JqKS8lLkhFWCAkKGloZXgyZndfZGVwKSB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQorJChvYmopLyUuZnc6ICQob2JqKS8lLkhFWCAkKGloZXgyZndfZGVwKQogCSQoY2FsbCBjbWQsaWhleDJmdykKIAogIyAuSDE2IGlzIG91ciBvd24gbW9kaWZpZWQgZm9ybSBvZiBJbnRlbCBIRVgsIHdpdGggMTYtYml0IGxlbmd0aCBmb3IgcmVjb3Jkcy4KLSQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChpaGV4MmZ3X2RlcCkgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKKyQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChpaGV4MmZ3X2RlcCkKIAkkKGNhbGwgY21kLGgxNnRvZncpCiAKLSQoZmlybXdhcmUtZGlycyk6Ci0JJChjYWxsIGNtZCxta2RpcikKLQogb2JqLXkJCQkJICs9ICQocGF0c3Vic3QgJSwlLmdlbi5vLCAkKGZ3LWV4dGVybmFsLXkpKQogb2JqLSQoQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCkgKz0gJChwYXRzdWJzdCAlLCUuZ2VuLm8sICQoZnctc2hpcHBlZC15KSkKIApkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2FkZHIuYyBiL2ZzLzlwL3Zmc19hZGRyLmMKaW5kZXggYzcxZTg4Ni4uY2MxY2ZhZSAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2FkZHIuYworKysgYi9mcy85cC92ZnNfYWRkci5jCkBAIC0yNTksOCArMjU5LDcgQEAKICAqCiAgKi8KIHN0YXRpYyBzc2l6ZV90Ci12OWZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JICAgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3Y5ZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBwb3MpCiB7CiAJLyoKIAkgKiBGSVhNRQpAQCAtMjY5LDcgKzI2OCw3IEBACiAJICovCiAJcDlfZGVidWcoUDlfREVCVUdfVkZTLCAidjlmc19kaXJlY3RfSU86IHY5ZnNfZGlyZWN0X0lPICglcykgb2ZmL25vKCVsbGQvJWx1KSBFSU5WQUxcbiIsCiAJCSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJIChsb25nIGxvbmcpcG9zLCBucl9zZWdzKTsKKwkJIChsb25nIGxvbmcpcG9zLCBpdGVyLT5ucl9zZWdzKTsKIAogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2ZpbGUuYyBiL2ZzLzlwL3Zmc19maWxlLmMKaW5kZXggOTZlNTUwNy4uNTIwYzExYyAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2ZpbGUuYworKysgYi9mcy85cC92ZnNfZmlsZS5jCkBAIC02OTIsNyArNjkyLDcgQEAKIHsKIAlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKQogCQlyZXR1cm4gdjlmc19kaXJlY3RfcmVhZChmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKLQlyZXR1cm4gZG9fc3luY19yZWFkKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXQpOworCXJldHVybiBuZXdfc3luY19yZWFkKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXQpOwogfQogCiAvKioKQEAgLTc2MCw3ICs3NjAsNyBAQAogCiBidWZmX3dyaXRlOgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCXJldHVybiBkb19zeW5jX3dyaXRlKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXRwKTsKKwlyZXR1cm4gbmV3X3N5bmNfd3JpdGUoZmlscCwgZGF0YSwgY291bnQsIG9mZnNldHApOwogfQogCiAvKioKQEAgLTc3OCw3ICs3NzgsNyBAQAogCiAJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkKIAkJcmV0dXJuIHY5ZnNfZGlyZWN0X3dyaXRlKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXQpOwotCXJldHVybiBkb19zeW5jX3dyaXRlKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXQpOworCXJldHVybiBuZXdfc3luY193cml0ZShmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKIH0KIAogCkBAIC04NDcsOCArODQ3LDggQEAKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZCA9IHY5ZnNfY2FjaGVkX2ZpbGVfcmVhZCwKIAkud3JpdGUgPSB2OWZzX2NhY2hlZF9maWxlX3dyaXRlLAotCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZF9pdGVyID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlciA9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogCS5sb2NrID0gdjlmc19maWxlX2xvY2ssCkBAIC04NjAsOCArODYwLDggQEAKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZCA9IHY5ZnNfY2FjaGVkX2ZpbGVfcmVhZCwKIAkud3JpdGUgPSB2OWZzX2NhY2hlZF9maWxlX3dyaXRlLAotCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZF9pdGVyID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlciA9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogCS5sb2NrID0gdjlmc19maWxlX2xvY2tfZG90bCwKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvZmlsZS5jIGIvZnMvYWRmcy9maWxlLmMKaW5kZXggYTM2ZGE1My4uMDdjOWVkYyAxMDA2NDQKLS0tIGEvZnMvYWRmcy9maWxlLmMKKysrIGIvZnMvYWRmcy9maWxlLmMKQEAgLTIzLDEyICsyMywxMiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLmZzeW5jCQk9IGdlbmVyaWNfZmlsZV9mc3luYywKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9hZmZzL2ZpbGUuYyBiL2ZzL2FmZnMvZmlsZS5jCmluZGV4IDAyNzAzMDMuLmE3ZmU1N2QgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvZmlsZS5jCisrKyBiL2ZzL2FmZnMvZmlsZS5jCkBAIC0yNywxMCArMjcsMTAgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5vcGVuCQk9IGFmZnNfZmlsZV9vcGVuLAogCS5yZWxlYXNlCT0gYWZmc19maWxlX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwppbmRleCA2NmQ1MGZlLi45MzJjZTA3IDEwMDY0NAotLS0gYS9mcy9hZnMvZmlsZS5jCisrKyBiL2ZzL2Fmcy9maWxlLmMKQEAgLTMxLDEwICszMSwxMCBAQAogCS5vcGVuCQk9IGFmc19vcGVuLAogCS5yZWxlYXNlCT0gYWZzX3JlbGVhc2UsCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGFmc19maWxlX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gYWZzX2ZpbGVfd3JpdGUsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5mc3luYwkJPSBhZnNfZnN5bmMsCmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDU5MGI1NWY0Li43MWQ1OTgyIDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtNzQ3LDggKzc0Nyw3IEBACiBleHRlcm4gaW50IGFmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICopOwogZXh0ZXJuIGludCBhZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKik7CiBleHRlcm4gdm9pZCBhZnNfcGFnZXNfd3JpdHRlbl9iYWNrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGFmc19jYWxsICopOwotZXh0ZXJuIHNzaXplX3QgYWZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAotCQkJICAgICAgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKK2V4dGVybiBzc2l6ZV90IGFmc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiBleHRlcm4gaW50IGFmc193cml0ZWJhY2tfYWxsKHN0cnVjdCBhZnNfdm5vZGUgKik7CiBleHRlcm4gaW50IGFmc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGxvZmZfdCwgaW50KTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL3dyaXRlLmMgYi9mcy9hZnMvd3JpdGUuYwppbmRleCBhODkwZGI0Li5hYjZhZGZkIDEwMDY0NAotLS0gYS9mcy9hZnMvd3JpdGUuYworKysgYi9mcy9hZnMvd3JpdGUuYwpAQCAtNjI1LDE1ICs2MjUsMTQgQEAKIC8qCiAgKiB3cml0ZSB0byBhbiBBRlMgZmlsZQogICovCi1zc2l6ZV90IGFmc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitzc2l6ZV90IGFmc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZV9pbm9kZShpb2NiLT5raV9maWxwKSk7CiAJc3NpemVfdCByZXN1bHQ7Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCi0JX2VudGVyKCJ7JXguJXV9LHslenV9LCVsdSwiLAotCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgY291bnQsIG5yX3NlZ3MpOworCV9lbnRlcigieyV4LiV1fSx7JXp1fSwiLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgY291bnQpOwogCiAJaWYgKElTX1NXQVBGSUxFKCZ2bm9kZS0+dmZzX2lub2RlKSkgewogCQlwcmludGsoS0VSTl9JTkZPCkBAIC02NDQsNyArNjQzLDcgQEAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAotCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyKGlvY2IsIGZyb20pOwogCWlmIChJU19FUlJfVkFMVUUocmVzdWx0KSkgewogCQlfbGVhdmUoIiA9ICV6ZCIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IGEwZWQ2YzcuLjU2YjI4NjAgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC0xMjQxLDYgKzEyNDEsNyBAQAogCiB0eXBlZGVmIHNzaXplX3QgKGFpb19yd19vcCkoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAogCQkJICAgIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCk7Cit0eXBlZGVmIHNzaXplX3QgKHJ3X2l0ZXJfb3ApKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiAKIHN0YXRpYyBzc2l6ZV90IGFpb19zZXR1cF92ZWN0b3JlZF9ydyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLAogCQkJCSAgICAgaW50IHJ3LCBjaGFyIF9fdXNlciAqYnVmLApAQCAtMTI5OCw3ICsxMjk5LDkgQEAKIAlpbnQgcnc7CiAJZm1vZGVfdCBtb2RlOwogCWFpb19yd19vcCAqcndfb3A7CisJcndfaXRlcl9vcCAqaXRlcl9vcDsKIAlzdHJ1Y3QgaW92ZWMgaW5saW5lX3ZlYywgKmlvdmVjID0gJmlubGluZV92ZWM7CisJc3RydWN0IGlvdl9pdGVyIGl0ZXI7CiAKIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgSU9DQl9DTURfUFJFQUQ6CkBAIC0xMzA2LDYgKzEzMDksNyBAQAogCQltb2RlCT0gRk1PREVfUkVBRDsKIAkJcncJPSBSRUFEOwogCQlyd19vcAk9IGZpbGUtPmZfb3AtPmFpb19yZWFkOworCQlpdGVyX29wCT0gZmlsZS0+Zl9vcC0+cmVhZF9pdGVyOwogCQlnb3RvIHJ3X2NvbW1vbjsKIAogCWNhc2UgSU9DQl9DTURfUFdSSVRFOgpAQCAtMTMxMywxMiArMTMxNywxMyBAQAogCQltb2RlCT0gRk1PREVfV1JJVEU7CiAJCXJ3CT0gV1JJVEU7CiAJCXJ3X29wCT0gZmlsZS0+Zl9vcC0+YWlvX3dyaXRlOworCQlpdGVyX29wCT0gZmlsZS0+Zl9vcC0+d3JpdGVfaXRlcjsKIAkJZ290byByd19jb21tb247CiByd19jb21tb246CiAJCWlmICh1bmxpa2VseSghKGZpbGUtPmZfbW9kZSAmIG1vZGUpKSkKIAkJCXJldHVybiAtRUJBREY7CiAKLQkJaWYgKCFyd19vcCkKKwkJaWYgKCFyd19vcCAmJiAhaXRlcl9vcCkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXJldCA9IChvcGNvZGUgPT0gSU9DQl9DTURfUFJFQURWIHx8CkBAIC0xMzQ3LDcgKzEzNTIsMTIgQEAKIAkJaWYgKHJ3ID09IFdSSVRFKQogCQkJZmlsZV9zdGFydF93cml0ZShmaWxlKTsKIAotCQlyZXQgPSByd19vcChyZXEsIGlvdmVjLCBucl9zZWdzLCByZXEtPmtpX3Bvcyk7CisJCWlmIChpdGVyX29wKSB7CisJCQlpb3ZfaXRlcl9pbml0KCZpdGVyLCBydywgaW92ZWMsIG5yX3NlZ3MsIHJlcS0+a2lfbmJ5dGVzKTsKKwkJCXJldCA9IGl0ZXJfb3AocmVxLCAmaXRlcik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSByd19vcChyZXEsIGlvdmVjLCBucl9zZWdzLCByZXEtPmtpX3Bvcyk7CisJCX0KIAogCQlpZiAocncgPT0gV1JJVEUpCiAJCQlmaWxlX2VuZF93cml0ZShmaWxlKTsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9maWxlLmMgYi9mcy9iZnMvZmlsZS5jCmluZGV4IGFlMjg5MjIuLmU3Zjg4YWMgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9maWxlLmMKKysrIGIvZnMvYmZzL2ZpbGUuYwpAQCAtMjMsMTAgKzIzLDEwIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrIAk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIH07CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDgzZmJhMTUuLjZkNzI3NDYgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0xNjUsMTQgKzE2NSwxNSBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotYmxrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCitibGtkZXZfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQlsb2ZmX3Qgb2Zmc2V0KQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCi0JcmV0dXJuIF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgSV9CREVWKGlub2RlKSwgaW92LCBvZmZzZXQsCi0JCQkJICAgIG5yX3NlZ3MsIGJsa2Rldl9nZXRfYmxvY2ssIE5VTEwsIE5VTEwsIDApOworCXJldHVybiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIElfQkRFVihpbm9kZSksIGl0ZXIsCisJCQkJICAgIG9mZnNldCwgYmxrZGV2X2dldF9ibG9jaywKKwkJCQkgICAgTlVMTCwgTlVMTCwgMCk7CiB9CiAKIGludCBfX3N5bmNfYmxvY2tkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgaW50IHdhaXQpCkBAIC0xNTcxLDQzICsxNTcyLDM4IEBACiAgKiBEb2VzIG5vdCB0YWtlIGlfbXV0ZXggZm9yIHRoZSB3cml0ZSBhbmQgdGh1cyBpcyBub3QgZm9yIGdlbmVyYWwgcHVycG9zZQogICogdXNlLgogICovCi1zc2l6ZV90IGJsa2Rldl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAlzc2l6ZV90IHJldDsKIAotCUJVR19PTihpb2NiLT5raV9wb3MgIT0gcG9zKTsKLQogCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKLQlyZXQgPSBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzKTsKKwlyZXQgPSBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKGlvY2IsIGZyb20pOwogCWlmIChyZXQgPiAwKSB7CiAJCXNzaXplX3QgZXJyOwotCi0JCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBwb3MsIHJldCk7CisJCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBpb2NiLT5raV9wb3MgLSByZXQsIHJldCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0ID0gZXJyOwogCX0KIAlibGtfZmluaXNoX3BsdWcoJnBsdWcpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChibGtkZXZfYWlvX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJsa2Rldl93cml0ZV9pdGVyKTsKIAotc3RhdGljIHNzaXplX3QgYmxrZGV2X2Fpb19yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgYmxrZGV2X3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJbG9mZl90IHNpemUgPSBpX3NpemVfcmVhZChiZF9pbm9kZSk7CisJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvczsKIAogCWlmIChwb3MgPj0gc2l6ZSkKIAkJcmV0dXJuIDA7CiAKIAlzaXplIC09IHBvczsKLQlpZiAoc2l6ZSA8IGlvY2ItPmtpX25ieXRlcykKLQkJbnJfc2VncyA9IGlvdl9zaG9ydGVuKChzdHJ1Y3QgaW92ZWMgKilpb3YsIG5yX3NlZ3MsIHNpemUpOwotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCWlvdl9pdGVyX3RydW5jYXRlKHRvLCBzaXplKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3JlYWRfaXRlcihpb2NiLCB0byk7CiB9CiAKIC8qCkBAIC0xNjM5LDEwICsxNjM1LDEwIEBACiAJLm9wZW4JCT0gYmxrZGV2X29wZW4sCiAJLnJlbGVhc2UJPSBibGtkZXZfY2xvc2UsCiAJLmxsc2VlawkJPSBibG9ja19sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IGJsa2Rldl9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gYmxrZGV2X2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyCT0gYmxrZGV2X3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGJsa2Rldl93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5mc3luYwkJPSBibGtkZXZfZnN5bmMsCiAJLnVubG9ja2VkX2lvY3RsCT0gYmxvY2tfaW9jdGwsCkBAIC0xNjUwLDcgKzE2NDYsNyBAQAogCS5jb21wYXRfaW9jdGwJPSBjb21wYXRfYmxrZGV2X2lvY3RsLAogI2VuZGlmCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAorCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogfTsKIAogaW50IGlvY3RsX2J5X2JkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCBlNDcyNDQxLi4xZjJiOTljIDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC00NDgsNyArNDQ4LDcgQEAKIAkJd3JpdGVfYnl0ZXMgLT0gY29waWVkOwogCQl0b3RhbF9jb3BpZWQgKz0gY29waWVkOwogCi0JCS8qIFJldHVybiB0byBidHJmc19maWxlX2Fpb193cml0ZSB0byBmYXVsdCBwYWdlICovCisJCS8qIFJldHVybiB0byBidHJmc19maWxlX3dyaXRlX2l0ZXIgdG8gZmF1bHQgcGFnZSAqLwogCQlpZiAodW5saWtlbHkoY29waWVkID09IDApKQogCQkJYnJlYWs7CiAKQEAgLTE2NzUsMjcgKzE2NzUsMjIgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgX19idHJmc19kaXJlY3Rfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zLAotCQkJCSAgICBzaXplX3QgY291bnQsIHNpemVfdCBvY291bnQpCisJCQkJICAgIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSwKKwkJCQkgICAgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlvdl9pdGVyIGk7CiAJc3NpemVfdCB3cml0dGVuOwogCXNzaXplX3Qgd3JpdHRlbl9idWZmZXJlZDsKIAlsb2ZmX3QgZW5kYnl0ZTsKIAlpbnQgZXJyOwogCi0Jd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92LCAmbnJfc2VncywgcG9zLAotCQkJCQkgICAgY291bnQsIG9jb3VudCk7CisJd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgZnJvbSwgcG9zKTsKIAotCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID09IGNvdW50KQorCWlmICh3cml0dGVuIDwgMCB8fCAhaW92X2l0ZXJfY291bnQoZnJvbSkpCiAJCXJldHVybiB3cml0dGVuOwogCiAJcG9zICs9IHdyaXR0ZW47Ci0JY291bnQgLT0gd3JpdHRlbjsKLQlpb3ZfaXRlcl9pbml0KCZpLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCB3cml0dGVuKTsKLQl3cml0dGVuX2J1ZmZlcmVkID0gX19idHJmc19idWZmZXJlZF93cml0ZShmaWxlLCAmaSwgcG9zKTsKKwl3cml0dGVuX2J1ZmZlcmVkID0gX19idHJmc19idWZmZXJlZF93cml0ZShmaWxlLCBmcm9tLCBwb3MpOwogCWlmICh3cml0dGVuX2J1ZmZlcmVkIDwgMCkgewogCQllcnIgPSB3cml0dGVuX2J1ZmZlcmVkOwogCQlnb3RvIG91dDsKQEAgLTE3MzAsOSArMTcyNSw4IEBACiAJCWlub2RlX2luY19pdmVyc2lvbihpbm9kZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJ0cmZzX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IGJ0cmZzX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQkJICAgIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CkBAIC0xNzQxLDE4ICsxNzM1LDEyIEBACiAJdTY0IGVuZF9wb3M7CiAJc3NpemVfdCBudW1fd3JpdHRlbiA9IDA7CiAJc3NpemVfdCBlcnIgPSAwOwotCXNpemVfdCBjb3VudCwgb2NvdW50OworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCWJvb2wgc3luYyA9IChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgfHwgSVNfU1lOQyhmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKLQllcnIgPSBnZW5lcmljX3NlZ21lbnRfY2hlY2tzKGlvdiwgJm5yX3NlZ3MsICZvY291bnQsIFZFUklGWV9SRUFEKTsKLQlpZiAoZXJyKSB7Ci0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQlnb3RvIG91dDsKLQl9Ci0JY291bnQgPSBvY291bnQ7Ci0KIAljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAllcnIgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpOwogCWlmIChlcnIpIHsKQEAgLTE3NjUsNiArMTc1Myw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIGNvdW50KTsKKwogCWVyciA9IGZpbGVfcmVtb3ZlX3N1aWQoZmlsZSk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKQEAgLTE4MDYsMTQgKzE3OTYsOSBAQAogCQlhdG9taWNfaW5jKCZCVFJGU19JKGlub2RlKS0+c3luY193cml0ZXJzKTsKIAogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKSB7Ci0JCW51bV93cml0dGVuID0gX19idHJmc19kaXJlY3Rfd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLAotCQkJCQkJICAgcG9zLCBjb3VudCwgb2NvdW50KTsKKwkJbnVtX3dyaXR0ZW4gPSBfX2J0cmZzX2RpcmVjdF93cml0ZShpb2NiLCBmcm9tLCBwb3MpOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBpb3ZfaXRlciBpOwotCi0JCWlvdl9pdGVyX2luaXQoJmksIGlvdiwgbnJfc2VncywgY291bnQsIG51bV93cml0dGVuKTsKLQotCQludW1fd3JpdHRlbiA9IF9fYnRyZnNfYnVmZmVyZWRfd3JpdGUoZmlsZSwgJmksIHBvcyk7CisJCW51bV93cml0dGVuID0gX19idHJmc19idWZmZXJlZF93cml0ZShmaWxlLCBmcm9tLCBwb3MpOwogCQlpZiAobnVtX3dyaXR0ZW4gPiAwKQogCQkJaW9jYi0+a2lfcG9zID0gcG9zICsgbnVtX3dyaXR0ZW47CiAJfQpAQCAtMjc0MCwxMSArMjcyNSwxMSBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGJ0cmZzX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3JlYWQgICAgICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciAgICAgID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLmFpb193cml0ZQk9IGJ0cmZzX2ZpbGVfYWlvX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gYnRyZnNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGJ0cmZzX2ZpbGVfbW1hcCwKIAkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKIAkucmVsZWFzZQk9IGJ0cmZzX3JlbGVhc2VfZmlsZSwKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCmluZGV4IDdmYTVmN2YuLjg5MjVmNjYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUuYwpAQCAtNzQ0NSwzOSArNzQ0NSwzMCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBjaGVja19kaXJlY3RfSU8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQljb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHNlZzsKIAlpbnQgaTsKLQlzaXplX3Qgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgYmxvY2tzaXplX21hc2sgPSByb290LT5zZWN0b3JzaXplIC0gMTsKIAlzc2l6ZV90IHJldHZhbCA9IC1FSU5WQUw7Ci0JbG9mZl90IGVuZCA9IG9mZnNldDsKIAogCWlmIChvZmZzZXQgJiBibG9ja3NpemVfbWFzaykKIAkJZ290byBvdXQ7CiAKLQkvKiBDaGVjayB0aGUgbWVtb3J5IGFsaWdubWVudC4gIEJsb2NrcyBjYW5ub3Qgc3RyYWRkbGUgcGFnZXMgKi8KLQlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7Ci0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJc2l6ZSA9IGlvdltzZWddLmlvdl9sZW47Ci0JCWVuZCArPSBzaXplOwotCQlpZiAoKGFkZHIgJiBibG9ja3NpemVfbWFzaykgfHwgKHNpemUgJiBibG9ja3NpemVfbWFzaykpCi0JCQlnb3RvIG91dDsKKwlpZiAoaW92X2l0ZXJfYWxpZ25tZW50KGl0ZXIpICYgYmxvY2tzaXplX21hc2spCisJCWdvdG8gb3V0OwogCi0JCS8qIElmIHRoaXMgaXMgYSB3cml0ZSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFueW1vcmUgKi8KLQkJaWYgKHJ3ICYgV1JJVEUpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBkdXBsaWNhdGUgaW92X2Jhc2UncyBpbiB0aGlzCi0JCSAqIGlvdmVjLCBpZiBzbyByZXR1cm4gRUlOVkFMLCBvdGhlcndpc2Ugd2UnbGwgZ2V0IGNzdW0gZXJyb3JzCi0JCSAqIHdoZW4gcmVhZGluZyBiYWNrLgotCQkgKi8KLQkJZm9yIChpID0gc2VnICsgMTsgaSA8IG5yX3NlZ3M7IGkrKykgewotCQkJaWYgKGlvdltzZWddLmlvdl9iYXNlID09IGlvdltpXS5pb3ZfYmFzZSkKKwkvKiBJZiB0aGlzIGlzIGEgd3JpdGUgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhbnltb3JlICovCisJaWYgKHJ3ICYgV1JJVEUpCisJCXJldHVybiAwOworCS8qCisJICogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgZHVwbGljYXRlIGlvdl9iYXNlJ3MgaW4gdGhpcworCSAqIGlvdmVjLCBpZiBzbyByZXR1cm4gRUlOVkFMLCBvdGhlcndpc2Ugd2UnbGwgZ2V0IGNzdW0gZXJyb3JzCisJICogd2hlbiByZWFkaW5nIGJhY2suCisJICovCisJZm9yIChzZWcgPSAwOyBzZWcgPCBpdGVyLT5ucl9zZWdzOyBzZWcrKykgeworCQlmb3IgKGkgPSBzZWcgKyAxOyBpIDwgaXRlci0+bnJfc2VnczsgaSsrKSB7CisJCQlpZiAoaXRlci0+aW92W3NlZ10uaW92X2Jhc2UgPT0gaXRlci0+aW92W2ldLmlvdl9iYXNlKQogCQkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtNzQ4Nyw4ICs3NDc4LDcgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYnRyZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC03NDk4LDggKzc0ODgsNyBAQAogCWJvb2wgcmVsb2NrID0gZmFsc2U7CiAJc3NpemVfdCByZXQ7CiAKLQlpZiAoY2hlY2tfZGlyZWN0X0lPKEJUUkZTX0koaW5vZGUpLT5yb290LCBydywgaW9jYiwgaW92LAotCQkJICAgIG9mZnNldCwgbnJfc2VncykpCisJaWYgKGNoZWNrX2RpcmVjdF9JTyhCVFJGU19JKGlub2RlKS0+cm9vdCwgcncsIGlvY2IsIGl0ZXIsIG9mZnNldCkpCiAJCXJldHVybiAwOwogCiAJYXRvbWljX2luYygmaW5vZGUtPmlfZGlvX2NvdW50KTsKQEAgLTc1MTEsNyArNzUwMCw3IEBACiAJICogd2UgbmVlZCB0byBmbHVzaCB0aGUgZGlydHkgcGFnZXMgYWdhaW4gdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUKIAkgKiB0aGF0IGFueSBvdXRzdGFuZGluZyBkaXJ0eSBwYWdlcyBhcmUgb24gZGlzay4KIAkgKi8KLQljb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwljb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCWlmICh0ZXN0X2JpdChCVFJGU19JTk9ERV9IQVNfQVNZTkNfRVhURU5ULAogCQkgICAgICZCVFJGU19JKGlub2RlKS0+cnVudGltZV9mbGFncykpCiAJCWZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBvZmZzZXQsIGNvdW50KTsKQEAgLTc1MzgsNyArNzUyNyw3IEBACiAKIAlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsCiAJCQlCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bGF0ZXN0X2JkZXYsCi0JCQlpb3YsIG9mZnNldCwgbnJfc2VncywgYnRyZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsIE5VTEwsCisJCQlpdGVyLCBvZmZzZXQsIGJ0cmZzX2dldF9ibG9ja3NfZGlyZWN0LCBOVUxMLAogCQkJYnRyZnNfc3VibWl0X2RpcmVjdCwgZmxhZ3MpOwogCWlmIChydyAmIFdSSVRFKSB7CiAJCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUlPQ0JRVUVVRUQpCmRpZmYgLS1naXQgYS9mcy9jZXBoL2FjbC5jIGIvZnMvY2VwaC9hY2wuYwppbmRleCAyMTg4N2Q2Li40NjlmMmU4IDEwMDY0NAotLS0gYS9mcy9jZXBoL2FjbC5jCisrKyBiL2ZzL2NlcGgvYWNsLmMKQEAgLTEwNCwxMiArMTA0LDYgQEAKIAl1bW9kZV90IG5ld19tb2RlID0gaW5vZGUtPmlfbW9kZSwgb2xkX21vZGUgPSBpbm9kZS0+aV9tb2RlOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAotCWlmIChhY2wpIHsKLQkJcmV0ID0gcG9zaXhfYWNsX3ZhbGlkKGFjbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9hZGRyLmMgYi9mcy9jZXBoL2FkZHIuYwppbmRleCA2NWEzMGU4Li45MGIzOTU0IDEwMDY0NAotLS0gYS9mcy9jZXBoL2FkZHIuYworKysgYi9mcy9jZXBoL2FkZHIuYwpAQCAtMjExLDE4ICsyMTEsMTUgQEAKIAkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQljZXBoX2ZzY2FjaGVfcmVhZHBhZ2VfY2FuY2VsKGlub2RlLCBwYWdlKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGVyciA8IFBBR0VfQ0FDSEVfU0laRSkgewotCQkvKiB6ZXJvIGZpbGwgcmVtYWluZGVyIG9mIHBhZ2UgKi8KLQkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIGVyciwgUEFHRV9DQUNIRV9TSVpFKTsKLQkJfSBlbHNlIHsKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQl9CiAJfQotCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlpZiAoZXJyIDwgUEFHRV9DQUNIRV9TSVpFKQorCQkvKiB6ZXJvIGZpbGwgcmVtYWluZGVyIG9mIHBhZ2UgKi8KKwkJemVyb191c2VyX3NlZ21lbnQocGFnZSwgZXJyLCBQQUdFX0NBQ0hFX1NJWkUpOworCWVsc2UKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKLQlpZiAoZXJyID49IDApCi0JCWNlcGhfcmVhZHBhZ2VfdG9fZnNjYWNoZShpbm9kZSwgcGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWNlcGhfcmVhZHBhZ2VfdG9fZnNjYWNoZShpbm9kZSwgcGFnZSk7CiAKIG91dDoKIAlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IDA7CkBAIC0xMTg3LDggKzExODQsOCBAQAogICogbmV2ZXIgZ2V0IGNhbGxlZC4KICAqLwogc3RhdGljIHNzaXplX3QgY2VwaF9kaXJlY3RfaW8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJCSAgICAgIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCSAgICAgIGxvZmZfdCBwb3MpCiB7CiAJV0FSTl9PTigxKTsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvY2Fwcy5jIGIvZnMvY2VwaC9jYXBzLmMKaW5kZXggYzU2MWI2Mi4uMWZkZTE2NCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9jYXBzLmMKKysrIGIvZnMvY2VwaC9jYXBzLmMKQEAgLTIyMSw4ICsyMjEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGNlcGhfY2FwICpnZXRfY2FwKHN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MsCi0JCQkJc3RydWN0IGNlcGhfY2FwX3Jlc2VydmF0aW9uICpjdHgpCitzdHJ1Y3QgY2VwaF9jYXAgKmNlcGhfZ2V0X2NhcChzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjLAorCQkJICAgICAgc3RydWN0IGNlcGhfY2FwX3Jlc2VydmF0aW9uICpjdHgpCiB7CiAJc3RydWN0IGNlcGhfY2FwICpjYXAgPSBOVUxMOwogCkBAIC01MDgsMTUgKzUwOCwxNCBAQAogICogaXQgaXMgPCAwLiAgKFRoaXMgaXMgc28gd2UgY2FuIGF0b21pY2FsbHkgYWRkIHRoZSBjYXAgYW5kIGFkZCBhbgogICogb3BlbiBmaWxlIHJlZmVyZW5jZSB0byBpdC4pCiAgKi8KLWludCBjZXBoX2FkZF9jYXAoc3RydWN0IGlub2RlICppbm9kZSwKLQkJIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLCB1NjQgY2FwX2lkLAotCQkgaW50IGZtb2RlLCB1bnNpZ25lZCBpc3N1ZWQsIHVuc2lnbmVkIHdhbnRlZCwKLQkJIHVuc2lnbmVkIHNlcSwgdW5zaWduZWQgbXNlcSwgdTY0IHJlYWxtaW5vLCBpbnQgZmxhZ3MsCi0JCSBzdHJ1Y3QgY2VwaF9jYXBfcmVzZXJ2YXRpb24gKmNhcHNfcmVzZXJ2YXRpb24pCit2b2lkIGNlcGhfYWRkX2NhcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLCB1NjQgY2FwX2lkLAorCQkgIGludCBmbW9kZSwgdW5zaWduZWQgaXNzdWVkLCB1bnNpZ25lZCB3YW50ZWQsCisJCSAgdW5zaWduZWQgc2VxLCB1bnNpZ25lZCBtc2VxLCB1NjQgcmVhbG1pbm8sIGludCBmbGFncywKKwkJICBzdHJ1Y3QgY2VwaF9jYXAgKipuZXdfY2FwKQogewogCXN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MgPSBjZXBoX2lub2RlX3RvX2NsaWVudChpbm9kZSktPm1kc2M7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKLQlzdHJ1Y3QgY2VwaF9jYXAgKm5ld19jYXAgPSBOVUxMOwogCXN0cnVjdCBjZXBoX2NhcCAqY2FwOwogCWludCBtZHMgPSBzZXNzaW9uLT5zX21kczsKIAlpbnQgYWN0dWFsX3dhbnRlZDsKQEAgLTUzMSwyMCArNTMwLDEwIEBACiAJaWYgKGZtb2RlID49IDApCiAJCXdhbnRlZCB8PSBjZXBoX2NhcHNfZm9yX21vZGUoZm1vZGUpOwogCi1yZXRyeToKLQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2FwID0gX19nZXRfY2FwX2Zvcl9tZHMoY2ksIG1kcyk7CiAJaWYgKCFjYXApIHsKLQkJaWYgKG5ld19jYXApIHsKLQkJCWNhcCA9IG5ld19jYXA7Ci0JCQluZXdfY2FwID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwotCQkJbmV3X2NhcCA9IGdldF9jYXAobWRzYywgY2Fwc19yZXNlcnZhdGlvbik7Ci0JCQlpZiAobmV3X2NhcCA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJZ290byByZXRyeTsKLQkJfQorCQljYXAgPSAqbmV3X2NhcDsKKwkJKm5ld19jYXAgPSBOVUxMOwogCiAJCWNhcC0+aXNzdWVkID0gMDsKIAkJY2FwLT5pbXBsZW1lbnRlZCA9IDA7CkBAIC01NjIsOSArNTUxLDYgQEAKIAkJc2Vzc2lvbi0+c19ucl9jYXBzKys7CiAJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5zX2NhcF9sb2NrKTsKIAl9IGVsc2UgewotCQlpZiAobmV3X2NhcCkKLQkJCWNlcGhfcHV0X2NhcChtZHNjLCBuZXdfY2FwKTsKLQogCQkvKgogCQkgKiBhdXRoIG1kcyBvZiB0aGUgaW5vZGUgY2hhbmdlZC4gd2UgcmVjZWl2ZWQgdGhlIGNhcCBleHBvcnQKIAkJICogbWVzc2FnZSwgYnV0IHN0aWxsIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGNhcCBpbXBvcnQgbWVzc2FnZS4KQEAgLTYyNiw3ICs2MTIsNiBAQAogCQkJY2ktPmlfYXV0aF9jYXAgPSBjYXA7CiAJCQljYXAtPm1kc193YW50ZWQgPSB3YW50ZWQ7CiAJCX0KLQkJY2ktPmlfY2FwX2V4cG9ydGluZ19pc3N1ZWQgPSAwOwogCX0gZWxzZSB7CiAJCVdBUk5fT04oY2ktPmlfYXV0aF9jYXAgPT0gY2FwKTsKIAl9CkBAIC02NDgsOSArNjMzLDYgQEAKIAogCWlmIChmbW9kZSA+PSAwKQogCQlfX2NlcGhfZ2V0X2Ztb2RlKGNpLCBmbW9kZSk7Ci0Jc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7Ci0Jd2FrZV91cF9hbGwoJmNpLT5pX2NhcF93cSk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC02ODUsNyArNjY3LDcgQEAKICAqLwogaW50IF9fY2VwaF9jYXBzX2lzc3VlZChzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSwgaW50ICppbXBsZW1lbnRlZCkKIHsKLQlpbnQgaGF2ZSA9IGNpLT5pX3NuYXBfY2FwcyB8IGNpLT5pX2NhcF9leHBvcnRpbmdfaXNzdWVkOworCWludCBoYXZlID0gY2ktPmlfc25hcF9jYXBzOwogCXN0cnVjdCBjZXBoX2NhcCAqY2FwOwogCXN0cnVjdCByYl9ub2RlICpwOwogCkBAIC05MDAsNyArODgyLDcgQEAKICAqLwogc3RhdGljIGludCBfX2NlcGhfaXNfYW55X2NhcHMoc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kpCiB7Ci0JcmV0dXJuICFSQl9FTVBUWV9ST09UKCZjaS0+aV9jYXBzKSB8fCBjaS0+aV9jYXBfZXhwb3J0aW5nX2lzc3VlZDsKKwlyZXR1cm4gIVJCX0VNUFRZX1JPT1QoJmNpLT5pX2NhcHMpOwogfQogCiBpbnQgY2VwaF9pc19hbnlfY2FwcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMjM5NywzMiArMjM3OSwzMCBAQAogICogYWN0dWFsbHkgYmUgYSByZXZvY2F0aW9uIGlmIGl0IHNwZWNpZmllcyBhIHNtYWxsZXIgY2FwIHNldC4pCiAgKgogICogY2FsbGVyIGhvbGRzIHNfbXV0ZXggYW5kIGlfY2VwaF9sb2NrLCB3ZSBkcm9wIGJvdGguCi0gKgotICogcmV0dXJuIHZhbHVlOgotICogIDAgLSBvawotICogIDEgLSBjaGVja19jYXBzIG9uIGF1dGggY2FwIG9ubHkgKHdyaXRlYmFjaykKLSAqICAyIC0gY2hlY2tfY2FwcyAoYWNrIHJldm9rZSkKICAqLwotc3RhdGljIHZvaWQgaGFuZGxlX2NhcF9ncmFudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgY2VwaF9tZHNfY2FwcyAqZ3JhbnQsCitzdGF0aWMgdm9pZCBoYW5kbGVfY2FwX2dyYW50KHN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBjZXBoX21kc19jYXBzICpncmFudCwKKwkJCSAgICAgdm9pZCAqc25hcHRyYWNlLCBpbnQgc25hcHRyYWNlX2xlbiwKKwkJCSAgICAgc3RydWN0IGNlcGhfYnVmZmVyICp4YXR0cl9idWYsCiAJCQkgICAgIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLAotCQkJICAgICBzdHJ1Y3QgY2VwaF9jYXAgKmNhcCwKLQkJCSAgICAgc3RydWN0IGNlcGhfYnVmZmVyICp4YXR0cl9idWYpCi0JCV9fcmVsZWFzZXMoY2ktPmlfY2VwaF9sb2NrKQorCQkJICAgICBzdHJ1Y3QgY2VwaF9jYXAgKmNhcCwgaW50IGlzc3VlZCkKKwlfX3JlbGVhc2VzKGNpLT5pX2NlcGhfbG9jaykKIHsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCWludCBtZHMgPSBzZXNzaW9uLT5zX21kczsKIAlpbnQgc2VxID0gbGUzMl90b19jcHUoZ3JhbnQtPnNlcSk7CiAJaW50IG5ld2NhcHMgPSBsZTMyX3RvX2NwdShncmFudC0+Y2Fwcyk7Ci0JaW50IGlzc3VlZCwgaW1wbGVtZW50ZWQsIHVzZWQsIHdhbnRlZCwgZGlydHk7CisJaW50IHVzZWQsIHdhbnRlZCwgZGlydHk7CiAJdTY0IHNpemUgPSBsZTY0X3RvX2NwdShncmFudC0+c2l6ZSk7CiAJdTY0IG1heF9zaXplID0gbGU2NF90b19jcHUoZ3JhbnQtPm1heF9zaXplKTsKIAlzdHJ1Y3QgdGltZXNwZWMgbXRpbWUsIGF0aW1lLCBjdGltZTsKIAlpbnQgY2hlY2tfY2FwcyA9IDA7Ci0JaW50IHdha2UgPSAwOwotCWludCB3cml0ZWJhY2sgPSAwOwotCWludCBxdWV1ZV9pbnZhbGlkYXRlID0gMDsKLQlpbnQgZGVsZXRlZF9pbm9kZSA9IDA7Ci0JaW50IHF1ZXVlX3JldmFsaWRhdGUgPSAwOworCWJvb2wgd2FrZSA9IDA7CisJYm9vbCB3cml0ZWJhY2sgPSAwOworCWJvb2wgcXVldWVfdHJ1bmMgPSAwOworCWJvb2wgcXVldWVfaW52YWxpZGF0ZSA9IDA7CisJYm9vbCBxdWV1ZV9yZXZhbGlkYXRlID0gMDsKKwlib29sIGRlbGV0ZWRfaW5vZGUgPSAwOwogCiAJZG91dCgiaGFuZGxlX2NhcF9ncmFudCBpbm9kZSAlcCBjYXAgJXAgbWRzJWQgc2VxICVkICVzXG4iLAogCSAgICAgaW5vZGUsIGNhcCwgbWRzLCBzZXEsIGNlcGhfY2FwX3N0cmluZyhuZXdjYXBzKSk7CkBAIC0yNDY2LDE2ICsyNDQ2LDEzIEBACiAJfQogCiAJLyogc2lkZSBlZmZlY3RzIG5vdyBhcmUgYWxsb3dlZCAqLwotCi0JaXNzdWVkID0gX19jZXBoX2NhcHNfaXNzdWVkKGNpLCAmaW1wbGVtZW50ZWQpOwotCWlzc3VlZCB8PSBpbXBsZW1lbnRlZCB8IF9fY2VwaF9jYXBzX2RpcnR5KGNpKTsKLQogCWNhcC0+Y2FwX2dlbiA9IHNlc3Npb24tPnNfY2FwX2dlbjsKIAljYXAtPnNlcSA9IHNlcTsKIAogCV9fY2hlY2tfY2FwX2lzc3VlKGNpLCBjYXAsIG5ld2NhcHMpOwogCi0JaWYgKChpc3N1ZWQgJiBDRVBIX0NBUF9BVVRIX0VYQ0wpID09IDApIHsKKwlpZiAoKG5ld2NhcHMgJiBDRVBIX0NBUF9BVVRIX1NIQVJFRCkgJiYKKwkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0FVVEhfRVhDTCkgPT0gMCkgewogCQlpbm9kZS0+aV9tb2RlID0gbGUzMl90b19jcHUoZ3JhbnQtPm1vZGUpOwogCQlpbm9kZS0+aV91aWQgPSBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgbGUzMl90b19jcHUoZ3JhbnQtPnVpZCkpOwogCQlpbm9kZS0+aV9naWQgPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgbGUzMl90b19jcHUoZ3JhbnQtPmdpZCkpOwpAQCAtMjQ4NCw3ICsyNDYxLDggQEAKIAkJICAgICBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgaW5vZGUtPmlfZ2lkKSk7CiAJfQogCi0JaWYgKChpc3N1ZWQgJiBDRVBIX0NBUF9MSU5LX0VYQ0wpID09IDApIHsKKwlpZiAoKG5ld2NhcHMgJiBDRVBIX0NBUF9BVVRIX1NIQVJFRCkgJiYKKwkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0xJTktfRVhDTCkgPT0gMCkgewogCQlzZXRfbmxpbmsoaW5vZGUsIGxlMzJfdG9fY3B1KGdyYW50LT5ubGluaykpOwogCQlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCAmJgogCQkgICAgKG5ld2NhcHMgJiAoQ0VQSF9DQVBfTElOS19TSEFSRUQgfCBDRVBIX0NBUF9MSU5LX0VYQ0wpKSkKQEAgLTI1MTEsMzAgKzI0ODksMzUgQEAKIAlpZiAoKGlzc3VlZCAmIENFUEhfQ0FQX0ZJTEVfQ0FDSEUpICYmIGNpLT5pX3JkY2FjaGVfZ2VuID4gMSkKIAkJcXVldWVfcmV2YWxpZGF0ZSA9IDE7CiAKLQkvKiBzaXplL2N0aW1lL210aW1lL2F0aW1lPyAqLwotCWNlcGhfZmlsbF9maWxlX3NpemUoaW5vZGUsIGlzc3VlZCwKLQkJCSAgICBsZTMyX3RvX2NwdShncmFudC0+dHJ1bmNhdGVfc2VxKSwKLQkJCSAgICBsZTY0X3RvX2NwdShncmFudC0+dHJ1bmNhdGVfc2l6ZSksIHNpemUpOwotCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZtdGltZSwgJmdyYW50LT5tdGltZSk7Ci0JY2VwaF9kZWNvZGVfdGltZXNwZWMoJmF0aW1lLCAmZ3JhbnQtPmF0aW1lKTsKLQljZXBoX2RlY29kZV90aW1lc3BlYygmY3RpbWUsICZncmFudC0+Y3RpbWUpOwotCWNlcGhfZmlsbF9maWxlX3RpbWUoaW5vZGUsIGlzc3VlZCwKLQkJCSAgICBsZTMyX3RvX2NwdShncmFudC0+dGltZV93YXJwX3NlcSksICZjdGltZSwgJm10aW1lLAotCQkJICAgICZhdGltZSk7CisJaWYgKG5ld2NhcHMgJiBDRVBIX0NBUF9BTllfUkQpIHsKKwkJLyogY3RpbWUvbXRpbWUvYXRpbWU/ICovCisJCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZtdGltZSwgJmdyYW50LT5tdGltZSk7CisJCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZhdGltZSwgJmdyYW50LT5hdGltZSk7CisJCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZjdGltZSwgJmdyYW50LT5jdGltZSk7CisJCWNlcGhfZmlsbF9maWxlX3RpbWUoaW5vZGUsIGlzc3VlZCwKKwkJCQkgICAgbGUzMl90b19jcHUoZ3JhbnQtPnRpbWVfd2FycF9zZXEpLAorCQkJCSAgICAmY3RpbWUsICZtdGltZSwgJmF0aW1lKTsKKwl9CiAKLQotCS8qIGZpbGUgbGF5b3V0IG1heSBoYXZlIGNoYW5nZWQgKi8KLQljaS0+aV9sYXlvdXQgPSBncmFudC0+bGF5b3V0OwotCi0JLyogbWF4IHNpemUgaW5jcmVhc2U/ICovCi0JaWYgKGNpLT5pX2F1dGhfY2FwID09IGNhcCAmJiBtYXhfc2l6ZSAhPSBjaS0+aV9tYXhfc2l6ZSkgewotCQlkb3V0KCJtYXhfc2l6ZSAlbGxkIC0+ICVsbHVcbiIsIGNpLT5pX21heF9zaXplLCBtYXhfc2l6ZSk7Ci0JCWNpLT5pX21heF9zaXplID0gbWF4X3NpemU7Ci0JCWlmIChtYXhfc2l6ZSA+PSBjaS0+aV93YW50ZWRfbWF4X3NpemUpIHsKLQkJCWNpLT5pX3dhbnRlZF9tYXhfc2l6ZSA9IDA7ICAvKiByZXNldCAqLwotCQkJY2ktPmlfcmVxdWVzdGVkX21heF9zaXplID0gMDsKKwlpZiAobmV3Y2FwcyAmIChDRVBIX0NBUF9BTllfRklMRV9SRCB8IENFUEhfQ0FQX0FOWV9GSUxFX1dSKSkgeworCQkvKiBmaWxlIGxheW91dCBtYXkgaGF2ZSBjaGFuZ2VkICovCisJCWNpLT5pX2xheW91dCA9IGdyYW50LT5sYXlvdXQ7CisJCS8qIHNpemUvdHJ1bmNhdGVfc2VxPyAqLworCQlxdWV1ZV90cnVuYyA9IGNlcGhfZmlsbF9maWxlX3NpemUoaW5vZGUsIGlzc3VlZCwKKwkJCQkJbGUzMl90b19jcHUoZ3JhbnQtPnRydW5jYXRlX3NlcSksCisJCQkJCWxlNjRfdG9fY3B1KGdyYW50LT50cnVuY2F0ZV9zaXplKSwKKwkJCQkJc2l6ZSk7CisJCS8qIG1heCBzaXplIGluY3JlYXNlPyAqLworCQlpZiAoY2ktPmlfYXV0aF9jYXAgPT0gY2FwICYmIG1heF9zaXplICE9IGNpLT5pX21heF9zaXplKSB7CisJCQlkb3V0KCJtYXhfc2l6ZSAlbGxkIC0+ICVsbHVcbiIsCisJCQkgICAgIGNpLT5pX21heF9zaXplLCBtYXhfc2l6ZSk7CisJCQljaS0+aV9tYXhfc2l6ZSA9IG1heF9zaXplOworCQkJaWYgKG1heF9zaXplID49IGNpLT5pX3dhbnRlZF9tYXhfc2l6ZSkgeworCQkJCWNpLT5pX3dhbnRlZF9tYXhfc2l6ZSA9IDA7ICAvKiByZXNldCAqLworCQkJCWNpLT5pX3JlcXVlc3RlZF9tYXhfc2l6ZSA9IDA7CisJCQl9CisJCQl3YWtlID0gMTsKIAkJfQotCQl3YWtlID0gMTsKIAl9CiAKIAkvKiBjaGVjayBjYXAgYml0cyAqLwpAQCAtMjU5NSw2ICsyNTc4LDIzIEBACiAKIAlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAorCWlmIChsZTMyX3RvX2NwdShncmFudC0+b3ApID09IENFUEhfQ0FQX09QX0lNUE9SVCkgeworCQlkb3duX3dyaXRlKCZtZHNjLT5zbmFwX3J3c2VtKTsKKwkJY2VwaF91cGRhdGVfc25hcF90cmFjZShtZHNjLCBzbmFwdHJhY2UsCisJCQkJICAgICAgIHNuYXB0cmFjZSArIHNuYXB0cmFjZV9sZW4sIGZhbHNlKTsKKwkJZG93bmdyYWRlX3dyaXRlKCZtZHNjLT5zbmFwX3J3c2VtKTsKKwkJa2lja19mbHVzaGluZ19pbm9kZV9jYXBzKG1kc2MsIHNlc3Npb24sIGlub2RlKTsKKwkJdXBfcmVhZCgmbWRzYy0+c25hcF9yd3NlbSk7CisJCWlmIChuZXdjYXBzICYgfmlzc3VlZCkKKwkJCXdha2UgPSAxOworCX0KKworCWlmIChxdWV1ZV90cnVuYykgeworCQljZXBoX3F1ZXVlX3ZtdHJ1bmNhdGUoaW5vZGUpOworCQljZXBoX3F1ZXVlX3JldmFsaWRhdGUoaW5vZGUpOworCX0gZWxzZSBpZiAocXVldWVfcmV2YWxpZGF0ZSkKKwkJY2VwaF9xdWV1ZV9yZXZhbGlkYXRlKGlub2RlKTsKKwogCWlmICh3cml0ZWJhY2spCiAJCS8qCiAJCSAqIHF1ZXVlIGlub2RlIGZvciB3cml0ZWJhY2s6IHdlIGNhbid0IGFjdHVhbGx5IGNhbGwKQEAgLTI2MDYsOCArMjYwNiw2IEBACiAJCWNlcGhfcXVldWVfaW52YWxpZGF0ZShpbm9kZSk7CiAJaWYgKGRlbGV0ZWRfaW5vZGUpCiAJCWludmFsaWRhdGVfYWxpYXNlcyhpbm9kZSk7Ci0JaWYgKHF1ZXVlX3JldmFsaWRhdGUpCi0JCWNlcGhfcXVldWVfcmV2YWxpZGF0ZShpbm9kZSk7CiAJaWYgKHdha2UpCiAJCXdha2VfdXBfYWxsKCZjaS0+aV9jYXBfd3EpOwogCkBAIC0yNzg0LDcgKzI3ODIsNyBAQAogewogCXN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MgPSBjZXBoX2lub2RlX3RvX2NsaWVudChpbm9kZSktPm1kc2M7CiAJc3RydWN0IGNlcGhfbWRzX3Nlc3Npb24gKnRzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3QgY2VwaF9jYXAgKmNhcCwgKnRjYXA7CisJc3RydWN0IGNlcGhfY2FwICpjYXAsICp0Y2FwLCAqbmV3X2NhcCA9IE5VTEw7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAl1NjQgdF9jYXBfaWQ7CiAJdW5zaWduZWQgbXNlcSA9IGxlMzJfdG9fY3B1KGV4LT5taWdyYXRlX3NlcSk7CkBAIC0yODA3LDcgKzI4MDUsNyBAQAogcmV0cnk6CiAJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWNhcCA9IF9fZ2V0X2NhcF9mb3JfbWRzKGNpLCBtZHMpOwotCWlmICghY2FwKQorCWlmICghY2FwIHx8IGNhcC0+Y2FwX2lkICE9IGxlNjRfdG9fY3B1KGV4LT5jYXBfaWQpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpZiAodGFyZ2V0IDwgMCkgewpAQCAtMjg0NiwxNSArMjg0NCwxNCBAQAogCQl9CiAJCV9fY2VwaF9yZW1vdmVfY2FwKGNhcCwgZmFsc2UpOwogCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JaWYgKHRzZXNzaW9uKSB7Ci0JCWludCBmbGFnID0gKGNhcCA9PSBjaS0+aV9hdXRoX2NhcCkgPyBDRVBIX0NBUF9GTEFHX0FVVEggOiAwOwotCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKKwl9IGVsc2UgaWYgKHRzZXNzaW9uKSB7CiAJCS8qIGFkZCBwbGFjZWhvbGRlciBmb3IgdGhlIGV4cG9ydCB0YWdlcnQgKi8KKwkJaW50IGZsYWcgPSAoY2FwID09IGNpLT5pX2F1dGhfY2FwKSA/IENFUEhfQ0FQX0ZMQUdfQVVUSCA6IDA7CiAJCWNlcGhfYWRkX2NhcChpbm9kZSwgdHNlc3Npb24sIHRfY2FwX2lkLCAtMSwgaXNzdWVkLCAwLAotCQkJICAgICB0X3NlcSAtIDEsIHRfbXNlcSwgKHU2NCktMSwgZmxhZywgTlVMTCk7Ci0JCWdvdG8gcmV0cnk7CisJCQkgICAgIHRfc2VxIC0gMSwgdF9tc2VxLCAodTY0KS0xLCBmbGFnLCAmbmV3X2NhcCk7CisKKwkJX19jZXBoX3JlbW92ZV9jYXAoY2FwLCBmYWxzZSk7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIAlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKQEAgLTI4NzMsNiArMjg3MCw3IEBACiAJCQkJCSAgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCQl9CiAJCWNlcGhfYWRkX2NhcF9yZWxlYXNlcyhtZHNjLCB0c2Vzc2lvbik7CisJCW5ld19jYXAgPSBjZXBoX2dldF9jYXAobWRzYywgTlVMTCk7CiAJfSBlbHNlIHsKIAkJV0FSTl9PTigxKTsKIAkJdHNlc3Npb24gPSBOVUxMOwpAQCAtMjg4NywyNCArMjg4NSwyNyBAQAogCQltdXRleF91bmxvY2soJnRzZXNzaW9uLT5zX211dGV4KTsKIAkJY2VwaF9wdXRfbWRzX3Nlc3Npb24odHNlc3Npb24pOwogCX0KKwlpZiAobmV3X2NhcCkKKwkJY2VwaF9wdXRfY2FwKG1kc2MsIG5ld19jYXApOwogfQogCiAvKgotICogSGFuZGxlIGNhcCBJTVBPUlQuICBJZiB0aGVyZSBhcmUgdGVtcCBiaXRzIGZyb20gYW4gb2xkZXIgRVhQT1JULAotICogY2xlYW4gdGhlbSB1cC4KKyAqIEhhbmRsZSBjYXAgSU1QT1JULgogICoKLSAqIGNhbGxlciBob2xkcyBzX211dGV4LgorICogY2FsbGVyIGhvbGRzIHNfbXV0ZXguIGFjcXVpcmVzIGlfY2VwaF9sb2NrCiAgKi8KIHN0YXRpYyB2b2lkIGhhbmRsZV9jYXBfaW1wb3J0KHN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgY2VwaF9tZHNfY2FwcyAqaW0sCiAJCQkgICAgICBzdHJ1Y3QgY2VwaF9tZHNfY2FwX3BlZXIgKnBoLAogCQkJICAgICAgc3RydWN0IGNlcGhfbWRzX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkgICAgICB2b2lkICpzbmFwdHJhY2UsIGludCBzbmFwdHJhY2VfbGVuKQorCQkJICAgICAgc3RydWN0IGNlcGhfY2FwICoqdGFyZ2V0X2NhcCwgaW50ICpvbGRfaXNzdWVkKQorCV9fYWNxdWlyZXMoY2ktPmlfY2VwaF9sb2NrKQogewogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7Ci0Jc3RydWN0IGNlcGhfY2FwICpjYXA7CisJc3RydWN0IGNlcGhfY2FwICpjYXAsICpvY2FwLCAqbmV3X2NhcCA9IE5VTEw7CiAJaW50IG1kcyA9IHNlc3Npb24tPnNfbWRzOwotCXVuc2lnbmVkIGlzc3VlZCA9IGxlMzJfdG9fY3B1KGltLT5jYXBzKTsKKwlpbnQgaXNzdWVkOworCXVuc2lnbmVkIGNhcHMgPSBsZTMyX3RvX2NwdShpbS0+Y2Fwcyk7CiAJdW5zaWduZWQgd2FudGVkID0gbGUzMl90b19jcHUoaW0tPndhbnRlZCk7CiAJdW5zaWduZWQgc2VxID0gbGUzMl90b19jcHUoaW0tPnNlcSk7CiAJdW5zaWduZWQgbXNlcSA9IGxlMzJfdG9fY3B1KGltLT5taWdyYXRlX3NlcSk7CkBAIC0yOTI0LDQwICsyOTI1LDUyIEBACiAJZG91dCgiaGFuZGxlX2NhcF9pbXBvcnQgaW5vZGUgJXAgY2kgJXAgbWRzJWQgbXNlcSAlZCBwZWVyICVkXG4iLAogCSAgICAgaW5vZGUsIGNpLCBtZHMsIG1zZXEsIHBlZXIpOwogCityZXRyeToKIAlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7Ci0JY2FwID0gcGVlciA+PSAwID8gX19nZXRfY2FwX2Zvcl9tZHMoY2ksIHBlZXIpIDogTlVMTDsKLQlpZiAoY2FwICYmIGNhcC0+Y2FwX2lkID09IHBfY2FwX2lkKSB7CisJY2FwID0gX19nZXRfY2FwX2Zvcl9tZHMoY2ksIG1kcyk7CisJaWYgKCFjYXApIHsKKwkJaWYgKCFuZXdfY2FwKSB7CisJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKKwkJCW5ld19jYXAgPSBjZXBoX2dldF9jYXAobWRzYywgTlVMTCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCWNhcCA9IG5ld19jYXA7CisJfSBlbHNlIHsKKwkJaWYgKG5ld19jYXApIHsKKwkJCWNlcGhfcHV0X2NhcChtZHNjLCBuZXdfY2FwKTsKKwkJCW5ld19jYXAgPSBOVUxMOworCQl9CisJfQorCisJX19jZXBoX2NhcHNfaXNzdWVkKGNpLCAmaXNzdWVkKTsKKwlpc3N1ZWQgfD0gX19jZXBoX2NhcHNfZGlydHkoY2kpOworCisJY2VwaF9hZGRfY2FwKGlub2RlLCBzZXNzaW9uLCBjYXBfaWQsIC0xLCBjYXBzLCB3YW50ZWQsIHNlcSwgbXNlcSwKKwkJICAgICByZWFsbWlubywgQ0VQSF9DQVBfRkxBR19BVVRILCAmbmV3X2NhcCk7CisKKwlvY2FwID0gcGVlciA+PSAwID8gX19nZXRfY2FwX2Zvcl9tZHMoY2ksIHBlZXIpIDogTlVMTDsKKwlpZiAob2NhcCAmJiBvY2FwLT5jYXBfaWQgPT0gcF9jYXBfaWQpIHsKIAkJZG91dCgiIHJlbW92ZSBleHBvcnQgY2FwICVwIG1kcyVkIGZsYWdzICVkXG4iLAotCQkgICAgIGNhcCwgcGVlciwgcGgtPmZsYWdzKTsKKwkJICAgICBvY2FwLCBwZWVyLCBwaC0+ZmxhZ3MpOwogCQlpZiAoKHBoLT5mbGFncyAmIENFUEhfQ0FQX0ZMQUdfQVVUSCkgJiYKLQkJICAgIChjYXAtPnNlcSAhPSBsZTMyX3RvX2NwdShwaC0+c2VxKSB8fAotCQkgICAgIGNhcC0+bXNlcSAhPSBsZTMyX3RvX2NwdShwaC0+bXNlcSkpKSB7CisJCSAgICAob2NhcC0+c2VxICE9IGxlMzJfdG9fY3B1KHBoLT5zZXEpIHx8CisJCSAgICAgb2NhcC0+bXNlcSAhPSBsZTMyX3RvX2NwdShwaC0+bXNlcSkpKSB7CiAJCQlwcl9lcnIoImhhbmRsZV9jYXBfaW1wb3J0OiBtaXNtYXRjaGVkIHNlcS9tc2VxOiAiCiAJCQkgICAgICAgImlubyAoJWxseC4lbGx4KSBtZHMlZCBzZXEgJWQgbXNlcSAlZCAiCiAJCQkgICAgICAgImltcG9ydGVyIG1kcyVkIGhhcyBwZWVyIHNlcSAlZCBtc2VxICVkXG4iLAotCQkJICAgICAgIGNlcGhfdmlub3AoaW5vZGUpLCBwZWVyLCBjYXAtPnNlcSwKLQkJCSAgICAgICBjYXAtPm1zZXEsIG1kcywgbGUzMl90b19jcHUocGgtPnNlcSksCisJCQkgICAgICAgY2VwaF92aW5vcChpbm9kZSksIHBlZXIsIG9jYXAtPnNlcSwKKwkJCSAgICAgICBvY2FwLT5tc2VxLCBtZHMsIGxlMzJfdG9fY3B1KHBoLT5zZXEpLAogCQkJICAgICAgIGxlMzJfdG9fY3B1KHBoLT5tc2VxKSk7CiAJCX0KLQkJY2ktPmlfY2FwX2V4cG9ydGluZ19pc3N1ZWQgPSBjYXAtPmlzc3VlZDsKLQkJX19jZXBoX3JlbW92ZV9jYXAoY2FwLCAocGgtPmZsYWdzICYgQ0VQSF9DQVBfRkxBR19SRUxFQVNFKSk7CisJCV9fY2VwaF9yZW1vdmVfY2FwKG9jYXAsIChwaC0+ZmxhZ3MgJiBDRVBIX0NBUF9GTEFHX1JFTEVBU0UpKTsKIAl9CiAKIAkvKiBtYWtlIHN1cmUgd2UgcmUtcmVxdWVzdCBtYXhfc2l6ZSwgaWYgbmVjZXNzYXJ5ICovCiAJY2ktPmlfd2FudGVkX21heF9zaXplID0gMDsKIAljaS0+aV9yZXF1ZXN0ZWRfbWF4X3NpemUgPSAwOwotCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCi0JZG93bl93cml0ZSgmbWRzYy0+c25hcF9yd3NlbSk7Ci0JY2VwaF91cGRhdGVfc25hcF90cmFjZShtZHNjLCBzbmFwdHJhY2UsIHNuYXB0cmFjZStzbmFwdHJhY2VfbGVuLAotCQkJICAgICAgIGZhbHNlKTsKLQlkb3duZ3JhZGVfd3JpdGUoJm1kc2MtPnNuYXBfcndzZW0pOwotCWNlcGhfYWRkX2NhcChpbm9kZSwgc2Vzc2lvbiwgY2FwX2lkLCAtMSwKLQkJICAgICBpc3N1ZWQsIHdhbnRlZCwgc2VxLCBtc2VxLCByZWFsbWlubywgQ0VQSF9DQVBfRkxBR19BVVRILAotCQkgICAgIE5VTEwgLyogbm8gY2FwcyBjb250ZXh0ICovKTsKLQlraWNrX2ZsdXNoaW5nX2lub2RlX2NhcHMobWRzYywgc2Vzc2lvbiwgaW5vZGUpOwotCXVwX3JlYWQoJm1kc2MtPnNuYXBfcndzZW0pOwotCisJKm9sZF9pc3N1ZWQgPSBpc3N1ZWQ7CisJKnRhcmdldF9jYXAgPSBjYXA7CiB9CiAKIC8qCkBAIC0yOTc3LDcgKzI5OTAsNyBAQAogCXN0cnVjdCBjZXBoX21kc19jYXBzICpoOwogCXN0cnVjdCBjZXBoX21kc19jYXBfcGVlciAqcGVlciA9IE5VTEw7CiAJaW50IG1kcyA9IHNlc3Npb24tPnNfbWRzOwotCWludCBvcDsKKwlpbnQgb3AsIGlzc3VlZDsKIAl1MzIgc2VxLCBtc2VxOwogCXN0cnVjdCBjZXBoX3Zpbm8gdmlubzsKIAl1NjQgY2FwX2lkOwpAQCAtMzA2OSw3ICszMDgyLDEwIEBACiAKIAljYXNlIENFUEhfQ0FQX09QX0lNUE9SVDoKIAkJaGFuZGxlX2NhcF9pbXBvcnQobWRzYywgaW5vZGUsIGgsIHBlZXIsIHNlc3Npb24sCi0JCQkJICBzbmFwdHJhY2UsIHNuYXB0cmFjZV9sZW4pOworCQkJCSAgJmNhcCwgJmlzc3VlZCk7CisJCWhhbmRsZV9jYXBfZ3JhbnQobWRzYywgaW5vZGUsIGgsICBzbmFwdHJhY2UsIHNuYXB0cmFjZV9sZW4sCisJCQkJIG1zZy0+bWlkZGxlLCBzZXNzaW9uLCBjYXAsIGlzc3VlZCk7CisJCWdvdG8gZG9uZV91bmxvY2tlZDsKIAl9CiAKIAkvKiB0aGUgcmVzdCByZXF1aXJlIGEgY2FwICovCkBAIC0zMDg2LDggKzMxMDIsMTAgQEAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBDRVBIX0NBUF9PUF9SRVZPS0U6CiAJY2FzZSBDRVBIX0NBUF9PUF9HUkFOVDoKLQljYXNlIENFUEhfQ0FQX09QX0lNUE9SVDoKLQkJaGFuZGxlX2NhcF9ncmFudChpbm9kZSwgaCwgc2Vzc2lvbiwgY2FwLCBtc2ctPm1pZGRsZSk7CisJCV9fY2VwaF9jYXBzX2lzc3VlZChjaSwgJmlzc3VlZCk7CisJCWlzc3VlZCB8PSBfX2NlcGhfY2Fwc19kaXJ0eShjaSk7CisJCWhhbmRsZV9jYXBfZ3JhbnQobWRzYywgaW5vZGUsIGgsIE5VTEwsIDAsIG1zZy0+bWlkZGxlLAorCQkJCSBzZXNzaW9uLCBjYXAsIGlzc3VlZCk7CiAJCWdvdG8gZG9uZV91bmxvY2tlZDsKIAogCWNhc2UgQ0VQSF9DQVBfT1BfRkxVU0hfQUNLOgpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9leHBvcnQuYyBiL2ZzL2NlcGgvZXhwb3J0LmMKaW5kZXggMDBkNmFmNi4uOGQ3ZDc4MiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9leHBvcnQuYworKysgYi9mcy9jZXBoL2V4cG9ydC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlyZXR1cm4gZGVudHJ5OwogfQogCi1zdHJ1Y3QgZGVudHJ5ICpjZXBoX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2VwaF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQogewogCS8qIGRvbid0IHJlLWV4cG9ydCBzbmFwcyAqLwogCWlmIChjZXBoX3NuYXAoY2hpbGQtPmRfaW5vZGUpICE9IENFUEhfTk9TTkFQKQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9maWxlLmMgYi9mcy9jZXBoL2ZpbGUuYwppbmRleCA4OGE2ZGY0Li4zMDIwODUxIDEwMDY0NAotLS0gYS9mcy9jZXBoL2ZpbGUuYworKysgYi9mcy9jZXBoL2ZpbGUuYwpAQCAtNDE4LDcgKzQxOCw3IEBACiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAl1NjQgb2ZmID0gaW9jYi0+a2lfcG9zOwogCWludCBudW1fcGFnZXMsIHJldDsKLQlzaXplX3QgbGVuID0gaS0+Y291bnQ7CisJc2l6ZV90IGxlbiA9IGlvdl9pdGVyX2NvdW50KGkpOwogCiAJZG91dCgic3luY19yZWFkIG9uIGZpbGUgJXAgJWxsdX4ldSAlc1xuIiwgZmlsZSwgb2ZmLAogCSAgICAgKHVuc2lnbmVkKWxlbiwKQEAgLTQzNiwyNSArNDM2LDI2IEBACiAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7CiAJCXdoaWxlIChpb3ZfaXRlcl9jb3VudChpKSkgewotCQkJdm9pZCBfX3VzZXIgKmRhdGEgPSBpLT5pb3ZbMF0uaW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OwotCQkJc2l6ZV90IGxlbiA9IGktPmlvdlswXS5pb3ZfbGVuIC0gaS0+aW92X29mZnNldDsKKwkJCXNpemVfdCBzdGFydDsKKwkJCXNzaXplX3QgbjsKIAotCQkJbnVtX3BhZ2VzID0gY2FsY19wYWdlc19mb3IoKHVuc2lnbmVkIGxvbmcpZGF0YSwgbGVuKTsKLQkJCXBhZ2VzID0gY2VwaF9nZXRfZGlyZWN0X3BhZ2VfdmVjdG9yKGRhdGEsCi0JCQkJCQkJICAgIG51bV9wYWdlcywgdHJ1ZSk7Ci0JCQlpZiAoSVNfRVJSKHBhZ2VzKSkKLQkJCQlyZXR1cm4gUFRSX0VSUihwYWdlcyk7CisJCQluID0gaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKGksICZwYWdlcywgSU5UX01BWCwgJnN0YXJ0KTsKKwkJCWlmIChuIDwgMCkKKwkJCQlyZXR1cm4gbjsKIAotCQkJcmV0ID0gc3RyaXBlZF9yZWFkKGlub2RlLCBvZmYsIGxlbiwKKwkJCW51bV9wYWdlcyA9IChuICsgc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKworCQkJcmV0ID0gc3RyaXBlZF9yZWFkKGlub2RlLCBvZmYsIG4sCiAJCQkJCSAgIHBhZ2VzLCBudW1fcGFnZXMsIGNoZWNrZW9mLAotCQkJCQkgICAxLCAodW5zaWduZWQgbG9uZylkYXRhICYgflBBR0VfTUFTSyk7CisJCQkJCSAgIDEsIHN0YXJ0KTsKKwogCQkJY2VwaF9wdXRfcGFnZV92ZWN0b3IocGFnZXMsIG51bV9wYWdlcywgdHJ1ZSk7CiAKIAkJCWlmIChyZXQgPD0gMCkKIAkJCQlicmVhazsKIAkJCW9mZiArPSByZXQ7CiAJCQlpb3ZfaXRlcl9hZHZhbmNlKGksIHJldCk7Ci0JCQlpZiAocmV0IDwgbGVuKQorCQkJaWYgKHJldCA8IG4pCiAJCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewpAQCAtNDY2LDI1ICs0NjcsMTQgQEAKIAkJCQkJbnVtX3BhZ2VzLCBjaGVja2VvZiwgMCwgMCk7CiAJCWlmIChyZXQgPiAwKSB7CiAJCQlpbnQgbCwgayA9IDA7Ci0JCQlzaXplX3QgbGVmdCA9IGxlbiA9IHJldDsKKwkJCXNpemVfdCBsZWZ0ID0gcmV0OwogCiAJCQl3aGlsZSAobGVmdCkgewotCQkJCXZvaWQgX191c2VyICpkYXRhID0gaS0+aW92WzBdLmlvdl9iYXNlCi0JCQkJCQkJKyBpLT5pb3Zfb2Zmc2V0OwotCQkJCWwgPSBtaW4oaS0+aW92WzBdLmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0LAotCQkJCQlsZWZ0KTsKLQotCQkJCXJldCA9IGNlcGhfY29weV9wYWdlX3ZlY3Rvcl90b191c2VyKCZwYWdlc1trXSwKLQkJCQkJCQkJICAgIGRhdGEsIG9mZiwKLQkJCQkJCQkJICAgIGwpOwotCQkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJCWlvdl9pdGVyX2FkdmFuY2UoaSwgcmV0KTsKLQkJCQkJbGVmdCAtPSByZXQ7Ci0JCQkJCW9mZiArPSByZXQ7Ci0JCQkJCWsgPSBjYWxjX3BhZ2VzX2Zvcihpb2NiLT5raV9wb3MsCi0JCQkJCQkJICAgbGVuIC0gbGVmdCArIDEpIC0gMTsKLQkJCQkJQlVHX09OKGsgPj0gbnVtX3BhZ2VzICYmIGxlZnQpOwotCQkJCX0gZWxzZQorCQkJCWludCBjb3B5ID0gbWluX3Qoc2l6ZV90LCBQQUdFX1NJWkUsIGxlZnQpOworCQkJCWwgPSBjb3B5X3BhZ2VfdG9faXRlcihwYWdlc1trKytdLCAwLCBjb3B5LCBpKTsKKwkJCQlvZmYgKz0gbDsKKwkJCQlsZWZ0IC09IGw7CisJCQkJaWYgKGwgPCBjb3B5KQogCQkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNTQxLDggKzUzMSw3IEBACiAgKiBvYmplY3RzLCByb2xsYmFjayBvbiBmYWlsdXJlLCBldGMuKQogICovCiBzdGF0aWMgc3NpemVfdAotY2VwaF9zeW5jX2RpcmVjdF93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBzaXplX3QgY291bnQpCitjZXBoX3N5bmNfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKQEAgLTU1NiwxMSArNTQ1LDEwIEBACiAJaW50IHdyaXR0ZW4gPSAwOwogCWludCBmbGFnczsKIAlpbnQgY2hlY2tfY2FwcyA9IDA7Ci0JaW50IHBhZ2VfYWxpZ247CiAJaW50IHJldDsKIAlzdHJ1Y3QgdGltZXNwZWMgbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvczsKLQlzdHJ1Y3QgaW92X2l0ZXIgaTsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKTsKIAogCWlmIChjZXBoX3NuYXAoZmlsZV9pbm9kZShmaWxlKSkgIT0gQ0VQSF9OT1NOQVApCiAJCXJldHVybiAtRVJPRlM7CkBAIC01ODIsMTMgKzU3MCwxMCBAQAogCQlDRVBIX09TRF9GTEFHX09ORElTSyB8CiAJCUNFUEhfT1NEX0ZMQUdfV1JJVEU7CiAKLQlpb3ZfaXRlcl9pbml0KCZpLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCAwKTsKLQotCXdoaWxlIChpb3ZfaXRlcl9jb3VudCgmaSkgPiAwKSB7Ci0JCXZvaWQgX191c2VyICpkYXRhID0gaS5pb3YtPmlvdl9iYXNlICsgaS5pb3Zfb2Zmc2V0OwotCQl1NjQgbGVuID0gaS5pb3YtPmlvdl9sZW4gLSBpLmlvdl9vZmZzZXQ7Ci0KLQkJcGFnZV9hbGlnbiA9ICh1bnNpZ25lZCBsb25nKWRhdGEgJiB+UEFHRV9NQVNLOworCXdoaWxlIChpb3ZfaXRlcl9jb3VudChmcm9tKSA+IDApIHsKKwkJdTY0IGxlbiA9IGlvdl9pdGVyX3NpbmdsZV9zZWdfY291bnQoZnJvbSk7CisJCXNpemVfdCBzdGFydDsKKwkJc3NpemVfdCBuOwogCiAJCXNuYXBjID0gY2ktPmlfc25hcF9yZWFsbS0+Y2FjaGVkX2NvbnRleHQ7CiAJCXZpbm8gPSBjZXBoX3Zpbm8oaW5vZGUpOwpAQCAtNjA0LDIwICs1ODksMjEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJbnVtX3BhZ2VzID0gY2FsY19wYWdlc19mb3IocGFnZV9hbGlnbiwgbGVuKTsKLQkJcGFnZXMgPSBjZXBoX2dldF9kaXJlY3RfcGFnZV92ZWN0b3IoZGF0YSwgbnVtX3BhZ2VzLCBmYWxzZSk7Ci0JCWlmIChJU19FUlIocGFnZXMpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHBhZ2VzKTsKLQkJCWdvdG8gb3V0OworCQluID0gaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKGZyb20sICZwYWdlcywgbGVuLCAmc3RhcnQpOworCQlpZiAodW5saWtlbHkobiA8IDApKSB7CisJCQlyZXQgPSBuOworCQkJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CisJCQlicmVhazsKIAkJfQogCisJCW51bV9wYWdlcyA9IChuICsgc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKIAkJLyoKIAkJICogdGhyb3cgb3V0IGFueSBwYWdlIGNhY2hlIHBhZ2VzIGluIHRoaXMgcmFuZ2UuIHRoaXMKIAkJICogbWF5IGJsb2NrLgogCQkgKi8KIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgcG9zLAotCQkJCSAgIChwb3MrbGVuKSB8IChQQUdFX0NBQ0hFX1NJWkUtMSkpOwotCQlvc2RfcmVxX29wX2V4dGVudF9vc2RfZGF0YV9wYWdlcyhyZXEsIDAsIHBhZ2VzLCBsZW4sIHBhZ2VfYWxpZ24sCisJCQkJICAgKHBvcytuKSB8IChQQUdFX0NBQ0hFX1NJWkUtMSkpOworCQlvc2RfcmVxX29wX2V4dGVudF9vc2RfZGF0YV9wYWdlcyhyZXEsIDAsIHBhZ2VzLCBuLCBzdGFydCwKIAkJCQkJCWZhbHNlLCBmYWxzZSk7CiAKIAkJLyogQlVHX09OKHZpbm8uc25hcCAhPSBDRVBIX05PU05BUCk7ICovCkBAIC02MjksMjIgKzYxNSwyMCBAQAogCiAJCWNlcGhfcHV0X3BhZ2VfdmVjdG9yKHBhZ2VzLCBudW1fcGFnZXMsIGZhbHNlKTsKIAotb3V0OgogCQljZXBoX29zZGNfcHV0X3JlcXVlc3QocmVxKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwb3MgKz0gbGVuOwotCQkJd3JpdHRlbiArPSBsZW47Ci0JCQlpb3ZfaXRlcl9hZHZhbmNlKCZpLCAoc2l6ZV90KWxlbik7Ci0KLQkJCWlmIChwb3MgPiBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJCQljaGVja19jYXBzID0gY2VwaF9pbm9kZV9zZXRfc2l6ZShpbm9kZSwgcG9zKTsKLQkJCQlpZiAoY2hlY2tfY2FwcykKLQkJCQkJY2VwaF9jaGVja19jYXBzKGNlcGhfaW5vZGUoaW5vZGUpLAotCQkJCQkJCUNIRUNLX0NBUFNfQVVUSE9OTFksCi0JCQkJCQkJTlVMTCk7Ci0JCQl9Ci0JCX0gZWxzZQorCQlpZiAocmV0KQogCQkJYnJlYWs7CisJCXBvcyArPSBuOworCQl3cml0dGVuICs9IG47CisJCWlvdl9pdGVyX2FkdmFuY2UoZnJvbSwgbik7CisKKwkJaWYgKHBvcyA+IGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQkJY2hlY2tfY2FwcyA9IGNlcGhfaW5vZGVfc2V0X3NpemUoaW5vZGUsIHBvcyk7CisJCQlpZiAoY2hlY2tfY2FwcykKKwkJCQljZXBoX2NoZWNrX2NhcHMoY2VwaF9pbm9kZShpbm9kZSksCisJCQkJCQlDSEVDS19DQVBTX0FVVEhPTkxZLAorCQkJCQkJTlVMTCk7CisJCX0KIAl9CiAKIAlpZiAocmV0ICE9IC1FT0xEU05BUEMgJiYgd3JpdHRlbiA+IDApIHsKQEAgLTY2Miw4ICs2NDYsNyBAQAogICogY29ycmVjdCBhdG9taWMgd3JpdGUsIHdlIHNob3VsZCBlLmcuIHRha2Ugd3JpdGUgbG9ja3Mgb24gYWxsCiAgKiBvYmplY3RzLCByb2xsYmFjayBvbiBmYWlsdXJlLCBldGMuKQogICovCi1zdGF0aWMgc3NpemVfdCBjZXBoX3N5bmNfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGNlcGhfc3luY193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CkBAIC02ODEsNyArNjY0LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB0aW1lc3BlYyBtdGltZSA9IENVUlJFTlRfVElNRTsKIAlsb2ZmX3QgcG9zID0gaW9jYi0+a2lfcG9zOwotCXN0cnVjdCBpb3ZfaXRlciBpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCiAJaWYgKGNlcGhfc25hcChmaWxlX2lub2RlKGZpbGUpKSAhPSBDRVBIX05PU05BUCkKIAkJcmV0dXJuIC1FUk9GUzsKQEAgLTcwMyw5ICs2ODYsNyBAQAogCQlDRVBIX09TRF9GTEFHX1dSSVRFIHwKIAkJQ0VQSF9PU0RfRkxBR19BQ0s7CiAKLQlpb3ZfaXRlcl9pbml0KCZpLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCAwKTsKLQotCXdoaWxlICgobGVuID0gaW92X2l0ZXJfY291bnQoJmkpKSA+IDApIHsKKwl3aGlsZSAoKGxlbiA9IGlvdl9pdGVyX2NvdW50KGZyb20pKSA+IDApIHsKIAkJc2l6ZV90IGxlZnQ7CiAJCWludCBuOwogCkBAIC03MzcsMTMgKzcxOCwxMiBAQAogCQlsZWZ0ID0gbGVuOwogCQlmb3IgKG4gPSAwOyBuIDwgbnVtX3BhZ2VzOyBuKyspIHsKIAkJCXNpemVfdCBwbGVuID0gbWluX3Qoc2l6ZV90LCBsZWZ0LCBQQUdFX1NJWkUpOwotCQkJcmV0ID0gaW92X2l0ZXJfY29weV9mcm9tX3VzZXIocGFnZXNbbl0sICZpLCAwLCBwbGVuKTsKKwkJCXJldCA9IGNvcHlfcGFnZV9mcm9tX2l0ZXIocGFnZXNbbl0sIDAsIHBsZW4sIGZyb20pOwogCQkJaWYgKHJldCAhPSBwbGVuKSB7CiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWxlZnQgLT0gcmV0OwotCQkJaW92X2l0ZXJfYWR2YW5jZSgmaSwgcmV0KTsKIAkJfQogCiAJCWlmIChyZXQgPCAwKSB7CkBAIC03OTYsOCArNzc2LDcgQEAKICAqCiAgKiBIbW0sIHRoZSBzeW5jIHJlYWQgY2FzZSBpc24ndCBhY3R1YWxseSBhc3luYy4uLiBzaG91bGQgaXQgYmU/CiAgKi8KLXN0YXRpYyBzc2l6ZV90IGNlcGhfYWlvX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgY2VwaF9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQogewogCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgY2VwaF9maWxlX2luZm8gKmZpID0gZmlscC0+cHJpdmF0ZV9kYXRhOwpAQCAtODIzLDQwICs4MDIsMjAgQEAKIAlpZiAoKGdvdCAmIChDRVBIX0NBUF9GSUxFX0NBQ0hFfENFUEhfQ0FQX0ZJTEVfTEFaWUlPKSkgPT0gMCB8fAogCSAgICAoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSB8fAogCSAgICAoZmktPmZsYWdzICYgQ0VQSF9GX1NZTkMpKSB7Ci0JCXN0cnVjdCBpb3ZfaXRlciBpOwogCiAJCWRvdXQoImFpb19zeW5jX3JlYWQgJXAgJWxseC4lbGx4ICVsbHV+JXUgZ290IGNhcCByZWZzIG9uICVzXG4iLAogCQkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgaW9jYi0+a2lfcG9zLCAodW5zaWduZWQpbGVuLAogCQkgICAgIGNlcGhfY2FwX3N0cmluZyhnb3QpKTsKIAotCQlpZiAoIXJlYWQpIHsKLQkJCXJldCA9IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoaW92LCAmbnJfc2VncywKLQkJCQkJCQkmbGVuLCBWRVJJRllfV1JJVEUpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCi0JCWlvdl9pdGVyX2luaXQoJmksIGlvdiwgbnJfc2VncywgbGVuLCByZWFkKTsKLQogCQkvKiBobW0sIHRoaXMgaXNuJ3QgcmVhbGx5IGFzeW5jLi4uICovCi0JCXJldCA9IGNlcGhfc3luY19yZWFkKGlvY2IsICZpLCAmY2hlY2tlb2YpOworCQlyZXQgPSBjZXBoX3N5bmNfcmVhZChpb2NiLCB0bywgJmNoZWNrZW9mKTsKIAl9IGVsc2UgewotCQkvKgotCQkgKiBXZSBjYW4ndCBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgaW92LAotCQkgKiBzbyB3ZSBvbmx5IHJlYWQgZnJvbSBiZWdpbm5pbmcuCi0JCSAqLwotCQlpZiAocmVhZCkgewotCQkJaW9jYi0+a2lfcG9zID0gcG9zOwotCQkJbGVuID0gaW9jYi0+a2lfbmJ5dGVzOwotCQkJcmVhZCA9IDA7Ci0JCX0KIAkJZG91dCgiYWlvX3JlYWQgJXAgJWxseC4lbGx4ICVsbHV+JXUgZ290IGNhcCByZWZzIG9uICVzXG4iLAotCQkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgcG9zLCAodW5zaWduZWQpbGVuLAorCQkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgaW9jYi0+a2lfcG9zLCAodW5zaWduZWQpbGVuLAogCQkgICAgIGNlcGhfY2FwX3N0cmluZyhnb3QpKTsKIAotCQlyZXQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCQlyZXQgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAl9Ci1vdXQ6CiAJZG91dCgiYWlvX3JlYWQgJXAgJWxseC4lbGx4IGRyb3BwaW5nIGNhcCByZWZzIG9uICVzID0gJWRcbiIsCiAJICAgICBpbm9kZSwgY2VwaF92aW5vcChpbm9kZSksIGNlcGhfY2FwX3N0cmluZyhnb3QpLCAoaW50KXJldCk7CiAJY2VwaF9wdXRfY2FwX3JlZnMoY2ksIGdvdCk7CkBAIC04NzIsNiArODMxLDcgQEAKIAkJCSAgICAgIiwgcmVhZGluZyBtb3JlXG4iLCBpb2NiLT5raV9wb3MsCiAJCQkgICAgIGlub2RlLT5pX3NpemUpOwogCisJCQlpb3ZfaXRlcl9hZHZhbmNlKHRvLCByZXQpOwogCQkJcmVhZCArPSByZXQ7CiAJCQlsZW4gLT0gcmV0OwogCQkJY2hlY2tlb2YgPSAwOwpAQCAtODk1LDggKzg1NSw3IEBACiAgKgogICogSWYgd2UgYXJlIG5lYXIgRU5PU1BDLCB3cml0ZSBzeW5jaHJvbm91c2x5LgogICovCi1zdGF0aWMgc3NpemVfdCBjZXBoX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgY2VwaF93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgY2VwaF9maWxlX2luZm8gKmZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtOTA0LDE4ICs4NjMsMTUgQEAKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCXN0cnVjdCBjZXBoX29zZF9jbGllbnQgKm9zZGMgPQogCQkmY2VwaF9zYl90b19jbGllbnQoaW5vZGUtPmlfc2IpLT5jbGllbnQtPm9zZGM7Ci0Jc3NpemVfdCBjb3VudCwgd3JpdHRlbiA9IDA7CisJc3NpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pLCB3cml0dGVuID0gMDsKIAlpbnQgZXJyLCB3YW50LCBnb3Q7CisJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvczsKIAogCWlmIChjZXBoX3NuYXAoaW5vZGUpICE9IENFUEhfTk9TTkFQKQogCQlyZXR1cm4gLUVST0ZTOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0JZXJyID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3YsICZucl9zZWdzLCAmY291bnQsIFZFUklGWV9SRUFEKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQogCS8qIFdlIGNhbiB3cml0ZSBiYWNrIHRoaXMgcXVldWUgaW4gcGFnZSByZWNsYWltICovCiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IGZpbGUtPmZfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIApAQCAtOTI1LDYgKzg4MSw3IEBACiAKIAlpZiAoY291bnQgPT0gMCkKIAkJZ290byBvdXQ7CisJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgY291bnQpOwogCiAJZXJyID0gZmlsZV9yZW1vdmVfc3VpZChmaWxlKTsKIAlpZiAoZXJyKQpAQCAtOTU2LDIzICs5MTMsMjYgQEAKIAogCWlmICgoZ290ICYgKENFUEhfQ0FQX0ZJTEVfQlVGRkVSfENFUEhfQ0FQX0ZJTEVfTEFaWUlPKSkgPT0gMCB8fAogCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB8fCAoZmktPmZsYWdzICYgQ0VQSF9GX1NZTkMpKSB7CisJCXN0cnVjdCBpb3ZfaXRlciBkYXRhOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJLyogd2UgbWlnaHQgbmVlZCB0byByZXZlcnQgYmFjayB0byB0aGF0IHBvaW50ICovCisJCWRhdGEgPSAqZnJvbTsKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkKLQkJCXdyaXR0ZW4gPSBjZXBoX3N5bmNfZGlyZWN0X3dyaXRlKGlvY2IsIGlvdiwKLQkJCQkJCQkgbnJfc2VncywgY291bnQpOworCQkJd3JpdHRlbiA9IGNlcGhfc3luY19kaXJlY3Rfd3JpdGUoaW9jYiwgJmRhdGEpOwogCQllbHNlCi0JCQl3cml0dGVuID0gY2VwaF9zeW5jX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgY291bnQpOworCQkJd3JpdHRlbiA9IGNlcGhfc3luY193cml0ZShpb2NiLCAmZGF0YSk7CiAJCWlmICh3cml0dGVuID09IC1FT0xEU05BUEMpIHsKIAkJCWRvdXQoImFpb193cml0ZSAlcCAlbGx4LiVsbHggJWxsdX4ldSIKIAkJCQkiZ290IEVPTERTTkFQQywgcmV0cnlpbmdcbiIsCiAJCQkJaW5vZGUsIGNlcGhfdmlub3AoaW5vZGUpLAotCQkJCXBvcywgKHVuc2lnbmVkKWlvdi0+aW92X2xlbik7CisJCQkJcG9zLCAodW5zaWduZWQpY291bnQpOwogCQkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJZ290byByZXRyeV9zbmFwOwogCQl9CisJCWlmICh3cml0dGVuID4gMCkKKwkJCWlvdl9pdGVyX2FkdmFuY2UoZnJvbSwgd3JpdHRlbik7CiAJfSBlbHNlIHsKIAkJbG9mZl90IG9sZF9zaXplID0gaW5vZGUtPmlfc2l6ZTsKLQkJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJCS8qCiAJCSAqIE5vIG5lZWQgdG8gYWNxdWlyZSB0aGUgaV90cnVuY2F0ZV9tdXRleC4gQmVjYXVzZQogCQkgKiB0aGUgTURTIHJldm9rZXMgRndiIGNhcHMgYmVmb3JlIHNlbmRpbmcgdHJ1bmNhdGUKQEAgLTk4MCw4ICs5NDAsNyBAQAogCQkgKiBhcmUgcGVuZGluZyB2bXRydW5jYXRlLiBTbyB3cml0ZSBhbmQgdm10cnVuY2F0ZQogCQkgKiBjYW4gbm90IHJ1biBhdCB0aGUgc2FtZSB0aW1lCiAJCSAqLwotCQlpb3ZfaXRlcl9pbml0KCZmcm9tLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCAwKTsKLQkJd3JpdHRlbiA9IGdlbmVyaWNfcGVyZm9ybV93cml0ZShmaWxlLCAmZnJvbSwgcG9zKTsKKwkJd3JpdHRlbiA9IGdlbmVyaWNfcGVyZm9ybV93cml0ZShmaWxlLCBmcm9tLCBwb3MpOwogCQlpZiAobGlrZWx5KHdyaXR0ZW4gPj0gMCkpCiAJCQlpb2NiLT5raV9wb3MgPSBwb3MgKyB3cml0dGVuOwogCQlpZiAoaW5vZGUtPmlfc2l6ZSA+IG9sZF9zaXplKQpAQCAtOTk5LDcgKzk1OCw3IEBACiAJfQogCiAJZG91dCgiYWlvX3dyaXRlICVwICVsbHguJWxseCAlbGx1fiV1ICBkcm9wcGluZyBjYXAgcmVmcyBvbiAlc1xuIiwKLQkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgcG9zLCAodW5zaWduZWQpaW92LT5pb3ZfbGVuLAorCSAgICAgaW5vZGUsIGNlcGhfdmlub3AoaW5vZGUpLCBwb3MsICh1bnNpZ25lZCljb3VudCwKIAkgICAgIGNlcGhfY2FwX3N0cmluZyhnb3QpKTsKIAljZXBoX3B1dF9jYXBfcmVmcyhjaSwgZ290KTsKIApAQCAtMTI3NiwxNiArMTIzNSwxNiBAQAogCS5vcGVuID0gY2VwaF9vcGVuLAogCS5yZWxlYXNlID0gY2VwaF9yZWxlYXNlLAogCS5sbHNlZWsgPSBjZXBoX2xsc2VlaywKLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZCA9IGNlcGhfYWlvX3JlYWQsCi0JLmFpb193cml0ZSA9IGNlcGhfYWlvX3dyaXRlLAorCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyID0gY2VwaF9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSBjZXBoX3dyaXRlX2l0ZXIsCiAJLm1tYXAgPSBjZXBoX21tYXAsCiAJLmZzeW5jID0gY2VwaF9mc3luYywKIAkubG9jayA9IGNlcGhfbG9jaywKIAkuZmxvY2sgPSBjZXBoX2Zsb2NrLAogCS5zcGxpY2VfcmVhZCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlID0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlID0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkudW5sb2NrZWRfaW9jdGwgPSBjZXBoX2lvY3RsLAogCS5jb21wYXRfaW9jdGwJPSBjZXBoX2lvY3RsLAogCS5mYWxsb2NhdGUJPSBjZXBoX2ZhbGxvY2F0ZSwKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW5vZGUuYyBiL2ZzL2NlcGgvaW5vZGUuYwppbmRleCBlNGZmZjlmLi4wNGM4OWMyIDEwMDY0NAotLS0gYS9mcy9jZXBoL2lub2RlLmMKKysrIGIvZnMvY2VwaC9pbm9kZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJtZHNfY2xpZW50LmgiCkBAIC0xNzksOSArMTgwLDggQEAKICAqIHNwZWNpZmllZCwgY29weSB0aGUgZnJhZyBkZWxlZ2F0aW9uIGluZm8gdG8gdGhlIGNhbGxlciBpZgogICogaXQgaXMgcHJlc2VudC4KICAqLwotdTMyIGNlcGhfY2hvb3NlX2ZyYWcoc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2ksIHUzMiB2LAotCQkgICAgIHN0cnVjdCBjZXBoX2lub2RlX2ZyYWcgKnBmcmFnLAotCQkgICAgIGludCAqZm91bmQpCitzdGF0aWMgdTMyIF9fY2VwaF9jaG9vc2VfZnJhZyhzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSwgdTMyIHYsCisJCQkgICAgICBzdHJ1Y3QgY2VwaF9pbm9kZV9mcmFnICpwZnJhZywgaW50ICpmb3VuZCkKIHsKIAl1MzIgdCA9IGNlcGhfZnJhZ19tYWtlKDAsIDApOwogCXN0cnVjdCBjZXBoX2lub2RlX2ZyYWcgKmZyYWc7CkBAIC0xOTEsNyArMTkxLDYgQEAKIAlpZiAoZm91bmQpCiAJCSpmb3VuZCA9IDA7CiAKLQltdXRleF9sb2NrKCZjaS0+aV9mcmFndHJlZV9tdXRleCk7CiAJd2hpbGUgKDEpIHsKIAkJV0FSTl9PTighY2VwaF9mcmFnX2NvbnRhaW5zX3ZhbHVlKHQsIHYpKTsKIAkJZnJhZyA9IF9fY2VwaF9maW5kX2ZyYWcoY2ksIHQpOwpAQCAtMjIwLDEwICsyMTksMTkgQEAKIAl9CiAJZG91dCgiY2hvb3NlX2ZyYWcoJXgpID0gJXhcbiIsIHYsIHQpOwogCi0JbXV0ZXhfdW5sb2NrKCZjaS0+aV9mcmFndHJlZV9tdXRleCk7CiAJcmV0dXJuIHQ7CiB9CiAKK3UzMiBjZXBoX2Nob29zZV9mcmFnKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpLCB1MzIgdiwKKwkJICAgICBzdHJ1Y3QgY2VwaF9pbm9kZV9mcmFnICpwZnJhZywgaW50ICpmb3VuZCkKK3sKKwl1MzIgcmV0OworCW11dGV4X2xvY2soJmNpLT5pX2ZyYWd0cmVlX211dGV4KTsKKwlyZXQgPSBfX2NlcGhfY2hvb3NlX2ZyYWcoY2ksIHYsIHBmcmFnLCBmb3VuZCk7CisJbXV0ZXhfdW5sb2NrKCZjaS0+aV9mcmFndHJlZV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIFByb2Nlc3MgZGlyZnJhZyAoZGVsZWdhdGlvbikgaW5mbyBmcm9tIHRoZSBtZHMuICBJbmNsdWRlIGxlYWYKICAqIGZyYWdtZW50IGluIHRyZWUgT05MWSBpZiBuZGlzdCA+IDAuICBPdGhlcndpc2UsIG9ubHkKQEAgLTIzNywxMSArMjQ1LDE3IEBACiAJdTMyIGlkID0gbGUzMl90b19jcHUoZGlyaW5mby0+ZnJhZyk7CiAJaW50IG1kcyA9IGxlMzJfdG9fY3B1KGRpcmluZm8tPmF1dGgpOwogCWludCBuZGlzdCA9IGxlMzJfdG9fY3B1KGRpcmluZm8tPm5kaXN0KTsKKwlpbnQgZGlyaV9hdXRoID0gLTE7CiAJaW50IGk7CiAJaW50IGVyciA9IDA7CiAKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CisJaWYgKGNpLT5pX2F1dGhfY2FwKQorCQlkaXJpX2F1dGggPSBjaS0+aV9hdXRoX2NhcC0+bWRzOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOworCiAJbXV0ZXhfbG9jaygmY2ktPmlfZnJhZ3RyZWVfbXV0ZXgpOwotCWlmIChuZGlzdCA9PSAwKSB7CisJaWYgKG5kaXN0ID09IDAgJiYgbWRzID09IGRpcmlfYXV0aCkgewogCQkvKiBubyBkZWxlZ2F0aW9uIGluZm8gbmVlZGVkLiAqLwogCQlmcmFnID0gX19jZXBoX2ZpbmRfZnJhZyhjaSwgaWQpOwogCQlpZiAoIWZyYWcpCkBAIC0yODYsNiArMzAwLDc1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBjZXBoX2ZpbGxfZnJhZ3RyZWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBjZXBoX2ZyYWdfdHJlZV9oZWFkICpmcmFndHJlZSwKKwkJCSAgICAgIHN0cnVjdCBjZXBoX21kc19yZXBseV9kaXJmcmFnICpkaXJpbmZvKQoreworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CisJc3RydWN0IGNlcGhfaW5vZGVfZnJhZyAqZnJhZzsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKKwlpbnQgaTsKKwl1MzIgaWQsIG5zcGxpdHM7CisJYm9vbCB1cGRhdGUgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJmNpLT5pX2ZyYWd0cmVlX211dGV4KTsKKwluc3BsaXRzID0gbGUzMl90b19jcHUoZnJhZ3RyZWUtPm5zcGxpdHMpOworCWlmIChuc3BsaXRzKSB7CisJCWkgPSBwcmFuZG9tX3UzMigpICUgbnNwbGl0czsKKwkJaWQgPSBsZTMyX3RvX2NwdShmcmFndHJlZS0+c3BsaXRzW2ldLmZyYWcpOworCQlpZiAoIV9fY2VwaF9maW5kX2ZyYWcoY2ksIGlkKSkKKwkJCXVwZGF0ZSA9IHRydWU7CisJfSBlbHNlIGlmICghUkJfRU1QVFlfUk9PVCgmY2ktPmlfZnJhZ3RyZWUpKSB7CisJCXJiX25vZGUgPSByYl9maXJzdCgmY2ktPmlfZnJhZ3RyZWUpOworCQlmcmFnID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGNlcGhfaW5vZGVfZnJhZywgbm9kZSk7CisJCWlmIChmcmFnLT5mcmFnICE9IGNlcGhfZnJhZ19tYWtlKDAsIDApIHx8IHJiX25leHQocmJfbm9kZSkpCisJCQl1cGRhdGUgPSB0cnVlOworCX0KKwlpZiAoIXVwZGF0ZSAmJiBkaXJpbmZvKSB7CisJCWlkID0gbGUzMl90b19jcHUoZGlyaW5mby0+ZnJhZyk7CisJCWlmIChpZCAhPSBfX2NlcGhfY2hvb3NlX2ZyYWcoY2ksIGlkLCBOVUxMLCBOVUxMKSkKKwkJCXVwZGF0ZSA9IHRydWU7CisJfQorCWlmICghdXBkYXRlKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkb3V0KCJmaWxsX2ZyYWd0cmVlICVsbHguJWxseFxuIiwgY2VwaF92aW5vcChpbm9kZSkpOworCXJiX25vZGUgPSByYl9maXJzdCgmY2ktPmlfZnJhZ3RyZWUpOworCWZvciAoaSA9IDA7IGkgPCBuc3BsaXRzOyBpKyspIHsKKwkJaWQgPSBsZTMyX3RvX2NwdShmcmFndHJlZS0+c3BsaXRzW2ldLmZyYWcpOworCQlmcmFnID0gTlVMTDsKKwkJd2hpbGUgKHJiX25vZGUpIHsKKwkJCWZyYWcgPSByYl9lbnRyeShyYl9ub2RlLCBzdHJ1Y3QgY2VwaF9pbm9kZV9mcmFnLCBub2RlKTsKKwkJCWlmIChjZXBoX2ZyYWdfY29tcGFyZShmcmFnLT5mcmFnLCBpZCkgPj0gMCkgeworCQkJCWlmIChmcmFnLT5mcmFnICE9IGlkKQorCQkJCQlmcmFnID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXJiX25vZGUgPSByYl9uZXh0KHJiX25vZGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJcmJfbm9kZSA9IHJiX25leHQocmJfbm9kZSk7CisJCQlyYl9lcmFzZSgmZnJhZy0+bm9kZSwgJmNpLT5pX2ZyYWd0cmVlKTsKKwkJCWtmcmVlKGZyYWcpOworCQkJZnJhZyA9IE5VTEw7CisJCX0KKwkJaWYgKCFmcmFnKSB7CisJCQlmcmFnID0gX19nZXRfb3JfY3JlYXRlX2ZyYWcoY2ksIGlkKTsKKwkJCWlmIChJU19FUlIoZnJhZykpCisJCQkJY29udGludWU7CisJCX0KKwkJZnJhZy0+c3BsaXRfYnkgPSBsZTMyX3RvX2NwdShmcmFndHJlZS0+c3BsaXRzW2ldLmJ5KTsKKwkJZG91dCgiIGZyYWcgJXggc3BsaXQgYnkgJWRcbiIsIGZyYWctPmZyYWcsIGZyYWctPnNwbGl0X2J5KTsKKwl9CisJd2hpbGUgKHJiX25vZGUpIHsKKwkJZnJhZyA9IHJiX2VudHJ5KHJiX25vZGUsIHN0cnVjdCBjZXBoX2lub2RlX2ZyYWcsIG5vZGUpOworCQlyYl9ub2RlID0gcmJfbmV4dChyYl9ub2RlKTsKKwkJcmJfZXJhc2UoJmZyYWctPm5vZGUsICZjaS0+aV9mcmFndHJlZSk7CisJCWtmcmVlKGZyYWcpOworCX0KK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjaS0+aV9mcmFndHJlZV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBpbml0aWFsaXplIGEgbmV3bHkgYWxsb2NhdGVkIGlub2RlLgpAQCAtMzQxLDcgKzQyNCw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNpLT5pX2NhcF9zbmFwcyk7CiAJY2ktPmlfaGVhZF9zbmFwYyA9IE5VTEw7CiAJY2ktPmlfc25hcF9jYXBzID0gMDsKLQljaS0+aV9jYXBfZXhwb3J0aW5nX2lzc3VlZCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ0VQSF9GSUxFX01PREVfTlVNOyBpKyspCiAJCWNpLT5pX25yX2J5X21vZGVbaV0gPSAwOwpAQCAtNDA3LDcgKzQ4OSw3IEBACiAKIAkvKgogCSAqIHdlIG1heSBzdGlsbCBoYXZlIGEgc25hcF9yZWFsbSByZWZlcmVuY2UgaWYgdGhlcmUgYXJlIHN0cmF5Ci0JICogY2FwcyBpbiBpX2NhcF9leHBvcnRpbmdfaXNzdWVkIG9yIGlfc25hcF9jYXBzLgorCSAqIGNhcHMgaW4gaV9zbmFwX2NhcHMuCiAJICovCiAJaWYgKGNpLT5pX3NuYXBfcmVhbG0pIHsKIAkJc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYyA9CkBAIC01ODIsMjIgKzY2NCwyNiBAQAogCQkgICAgICB1bnNpZ25lZCBsb25nIHR0bF9mcm9tLCBpbnQgY2FwX2Ztb2RlLAogCQkgICAgICBzdHJ1Y3QgY2VwaF9jYXBfcmVzZXJ2YXRpb24gKmNhcHNfcmVzZXJ2YXRpb24pCiB7CisJc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYyA9IGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+bWRzYzsKIAlzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfaW5vZGUgKmluZm8gPSBpaW5mby0+aW47CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKLQlpbnQgaTsKLQlpbnQgaXNzdWVkID0gMCwgaW1wbGVtZW50ZWQ7CisJaW50IGlzc3VlZCA9IDAsIGltcGxlbWVudGVkLCBuZXdfaXNzdWVkOwogCXN0cnVjdCB0aW1lc3BlYyBtdGltZSwgYXRpbWUsIGN0aW1lOwotCXUzMiBuc3BsaXRzOwotCXN0cnVjdCBjZXBoX2lub2RlX2ZyYWcgKmZyYWc7Ci0Jc3RydWN0IHJiX25vZGUgKnJiX25vZGU7CiAJc3RydWN0IGNlcGhfYnVmZmVyICp4YXR0cl9ibG9iID0gTlVMTDsKKwlzdHJ1Y3QgY2VwaF9jYXAgKm5ld19jYXAgPSBOVUxMOwogCWludCBlcnIgPSAwOwotCWludCBxdWV1ZV90cnVuYyA9IDA7CisJYm9vbCB3YWtlID0gZmFsc2U7CisJYm9vbCBxdWV1ZV90cnVuYyA9IGZhbHNlOworCWJvb2wgbmV3X3ZlcnNpb24gPSBmYWxzZTsKIAogCWRvdXQoImZpbGxfaW5vZGUgJXAgaW5vICVsbHguJWxseCB2ICVsbHUgaGFkICVsbHVcbiIsCiAJICAgICBpbm9kZSwgY2VwaF92aW5vcChpbm9kZSksIGxlNjRfdG9fY3B1KGluZm8tPnZlcnNpb24pLAogCSAgICAgY2ktPmlfdmVyc2lvbik7CiAKKwkvKiBwcmVhbGxvYyBuZXcgY2FwIHN0cnVjdCAqLworCWlmIChpbmZvLT5jYXAuY2FwcyAmJiBjZXBoX3NuYXAoaW5vZGUpID09IENFUEhfTk9TTkFQKQorCQluZXdfY2FwID0gY2VwaF9nZXRfY2FwKG1kc2MsIGNhcHNfcmVzZXJ2YXRpb24pOworCiAJLyoKIAkgKiBwcmVhbGxvYyB4YXR0ciBkYXRhLCBpZiBpdCBsb29rcyBsaWtlIHdlJ2xsIG5lZWQgaXQuICBvbmx5CiAJICogaWYgbGVuID4gNCAobWVhbmluZyB0aGVyZSBhcmUgYWN0dWFsbHkgeGF0dHJzOyB0aGUgZmlyc3QgNApAQCAtNjIzLDE5ICs3MDksMjMgQEAKIAkgKiAgIDMgICAgMiAgICAgc2tpcAogCSAqICAgMyAgICAzICAgICB1cGRhdGUKIAkgKi8KLQlpZiAobGU2NF90b19jcHUoaW5mby0+dmVyc2lvbikgPiAwICYmCi0JICAgIChjaS0+aV92ZXJzaW9uICYgfjEpID49IGxlNjRfdG9fY3B1KGluZm8tPnZlcnNpb24pKQotCQlnb3RvIG5vX2NoYW5nZTsKLQkKKwlpZiAoY2ktPmlfdmVyc2lvbiA9PSAwIHx8CisJICAgICgoaW5mby0+Y2FwLmZsYWdzICYgQ0VQSF9DQVBfRkxBR19BVVRIKSAmJgorCSAgICAgbGU2NF90b19jcHUoaW5mby0+dmVyc2lvbikgPiAoY2ktPmlfdmVyc2lvbiAmIH4xKSkpCisJCW5ld192ZXJzaW9uID0gdHJ1ZTsKKwogCWlzc3VlZCA9IF9fY2VwaF9jYXBzX2lzc3VlZChjaSwgJmltcGxlbWVudGVkKTsKIAlpc3N1ZWQgfD0gaW1wbGVtZW50ZWQgfCBfX2NlcGhfY2Fwc19kaXJ0eShjaSk7CisJbmV3X2lzc3VlZCA9IH5pc3N1ZWQgJiBsZTMyX3RvX2NwdShpbmZvLT5jYXAuY2Fwcyk7CiAKIAkvKiB1cGRhdGUgaW5vZGUgKi8KIAljaS0+aV92ZXJzaW9uID0gbGU2NF90b19jcHUoaW5mby0+dmVyc2lvbik7CiAJaW5vZGUtPmlfdmVyc2lvbisrOwogCWlub2RlLT5pX3JkZXYgPSBsZTMyX3RvX2NwdShpbmZvLT5yZGV2KTsKKwlpbm9kZS0+aV9ibGtiaXRzID0gZmxzKGxlMzJfdG9fY3B1KGluZm8tPmxheW91dC5mbF9zdHJpcGVfdW5pdCkpIC0gMTsKIAotCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfQVVUSF9FWENMKSA9PSAwKSB7CisJaWYgKChuZXdfdmVyc2lvbiB8fCAobmV3X2lzc3VlZCAmIENFUEhfQ0FQX0FVVEhfU0hBUkVEKSkgJiYKKwkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0FVVEhfRVhDTCkgPT0gMCkgewogCQlpbm9kZS0+aV9tb2RlID0gbGUzMl90b19jcHUoaW5mby0+bW9kZSk7CiAJCWlub2RlLT5pX3VpZCA9IG1ha2Vfa3VpZCgmaW5pdF91c2VyX25zLCBsZTMyX3RvX2NwdShpbmZvLT51aWQpKTsKIAkJaW5vZGUtPmlfZ2lkID0gbWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGxlMzJfdG9fY3B1KGluZm8tPmdpZCkpOwpAQCAtNjQ0LDIzICs3MzQsMzUgQEAKIAkJICAgICBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgaW5vZGUtPmlfZ2lkKSk7CiAJfQogCi0JaWYgKChpc3N1ZWQgJiBDRVBIX0NBUF9MSU5LX0VYQ0wpID09IDApCisJaWYgKChuZXdfdmVyc2lvbiB8fCAobmV3X2lzc3VlZCAmIENFUEhfQ0FQX0xJTktfU0hBUkVEKSkgJiYKKwkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0xJTktfRVhDTCkgPT0gMCkKIAkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShpbmZvLT5ubGluaykpOwogCi0JLyogYmUgY2FyZWZ1bCB3aXRoIG10aW1lLCBhdGltZSwgc2l6ZSAqLwotCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZhdGltZSwgJmluZm8tPmF0aW1lKTsKLQljZXBoX2RlY29kZV90aW1lc3BlYygmbXRpbWUsICZpbmZvLT5tdGltZSk7Ci0JY2VwaF9kZWNvZGVfdGltZXNwZWMoJmN0aW1lLCAmaW5mby0+Y3RpbWUpOwotCXF1ZXVlX3RydW5jID0gY2VwaF9maWxsX2ZpbGVfc2l6ZShpbm9kZSwgaXNzdWVkLAotCQkJCQkgIGxlMzJfdG9fY3B1KGluZm8tPnRydW5jYXRlX3NlcSksCi0JCQkJCSAgbGU2NF90b19jcHUoaW5mby0+dHJ1bmNhdGVfc2l6ZSksCi0JCQkJCSAgbGU2NF90b19jcHUoaW5mby0+c2l6ZSkpOwotCWNlcGhfZmlsbF9maWxlX3RpbWUoaW5vZGUsIGlzc3VlZCwKLQkJCSAgICBsZTMyX3RvX2NwdShpbmZvLT50aW1lX3dhcnBfc2VxKSwKLQkJCSAgICAmY3RpbWUsICZtdGltZSwgJmF0aW1lKTsKKwlpZiAobmV3X3ZlcnNpb24gfHwgKG5ld19pc3N1ZWQgJiBDRVBIX0NBUF9BTllfUkQpKSB7CisJCS8qIGJlIGNhcmVmdWwgd2l0aCBtdGltZSwgYXRpbWUsIHNpemUgKi8KKwkJY2VwaF9kZWNvZGVfdGltZXNwZWMoJmF0aW1lLCAmaW5mby0+YXRpbWUpOworCQljZXBoX2RlY29kZV90aW1lc3BlYygmbXRpbWUsICZpbmZvLT5tdGltZSk7CisJCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZjdGltZSwgJmluZm8tPmN0aW1lKTsKKwkJY2VwaF9maWxsX2ZpbGVfdGltZShpbm9kZSwgaXNzdWVkLAorCQkJCWxlMzJfdG9fY3B1KGluZm8tPnRpbWVfd2FycF9zZXEpLAorCQkJCSZjdGltZSwgJm10aW1lLCAmYXRpbWUpOworCX0KIAotCWNpLT5pX2xheW91dCA9IGluZm8tPmxheW91dDsKLQlpbm9kZS0+aV9ibGtiaXRzID0gZmxzKGxlMzJfdG9fY3B1KGluZm8tPmxheW91dC5mbF9zdHJpcGVfdW5pdCkpIC0gMTsKKwlpZiAobmV3X3ZlcnNpb24gfHwKKwkgICAgKG5ld19pc3N1ZWQgJiAoQ0VQSF9DQVBfQU5ZX0ZJTEVfUkQgfCBDRVBIX0NBUF9BTllfRklMRV9XUikpKSB7CisJCWNpLT5pX2xheW91dCA9IGluZm8tPmxheW91dDsKKwkJcXVldWVfdHJ1bmMgPSBjZXBoX2ZpbGxfZmlsZV9zaXplKGlub2RlLCBpc3N1ZWQsCisJCQkJCWxlMzJfdG9fY3B1KGluZm8tPnRydW5jYXRlX3NlcSksCisJCQkJCWxlNjRfdG9fY3B1KGluZm8tPnRydW5jYXRlX3NpemUpLAorCQkJCQlsZTY0X3RvX2NwdShpbmZvLT5zaXplKSk7CisJCS8qIG9ubHkgdXBkYXRlIG1heF9zaXplIG9uIGF1dGggY2FwICovCisJCWlmICgoaW5mby0+Y2FwLmZsYWdzICYgQ0VQSF9DQVBfRkxBR19BVVRIKSAmJgorCQkgICAgY2ktPmlfbWF4X3NpemUgIT0gbGU2NF90b19jcHUoaW5mby0+bWF4X3NpemUpKSB7CisJCQlkb3V0KCJtYXhfc2l6ZSAlbGxkIC0+ICVsbHVcbiIsIGNpLT5pX21heF9zaXplLAorCQkJCQlsZTY0X3RvX2NwdShpbmZvLT5tYXhfc2l6ZSkpOworCQkJY2ktPmlfbWF4X3NpemUgPSBsZTY0X3RvX2NwdShpbmZvLT5tYXhfc2l6ZSk7CisJCX0KKwl9CiAKIAkvKiB4YXR0cnMgKi8KIAkvKiBub3RlIHRoYXQgaWYgaV94YXR0cnMubGVuIDw9IDQsIGlfeGF0dHJzLmRhdGEgd2lsbCBzdGlsbCBiZSBOVUxMLiAqLwpAQCAtNzQ1LDU4ICs4NDcsNiBAQAogCQlkb3V0KCIgbWFya2luZyAlcCBjb21wbGV0ZSAoZW1wdHkpXG4iLCBpbm9kZSk7CiAJCV9fY2VwaF9kaXJfc2V0X2NvbXBsZXRlKGNpLCBhdG9taWNfcmVhZCgmY2ktPmlfcmVsZWFzZV9jb3VudCkpOwogCX0KLW5vX2NoYW5nZToKLQkvKiBvbmx5IHVwZGF0ZSBtYXhfc2l6ZSBvbiBhdXRoIGNhcCAqLwotCWlmICgoaW5mby0+Y2FwLmZsYWdzICYgQ0VQSF9DQVBfRkxBR19BVVRIKSAmJgotCSAgICBjaS0+aV9tYXhfc2l6ZSAhPSBsZTY0X3RvX2NwdShpbmZvLT5tYXhfc2l6ZSkpIHsKLQkJZG91dCgibWF4X3NpemUgJWxsZCAtPiAlbGx1XG4iLCBjaS0+aV9tYXhfc2l6ZSwKLQkJICAgICBsZTY0X3RvX2NwdShpbmZvLT5tYXhfc2l6ZSkpOwotCQljaS0+aV9tYXhfc2l6ZSA9IGxlNjRfdG9fY3B1KGluZm8tPm1heF9zaXplKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKLQotCS8qIHF1ZXVlIHRydW5jYXRlIGlmIHdlIHNhdyBpX3NpemUgZGVjcmVhc2UgKi8KLQlpZiAocXVldWVfdHJ1bmMpCi0JCWNlcGhfcXVldWVfdm10cnVuY2F0ZShpbm9kZSk7Ci0KLQkvKiBwb3B1bGF0ZSBmcmFnIHRyZWUgKi8KLQkvKiBGSVhNRTogbW92ZSBtZSB1cCwgaWYvd2hlbiB2ZXJzaW9uIHJlZmxlY3RzIGZyYWd0cmVlIGNoYW5nZXMgKi8KLQluc3BsaXRzID0gbGUzMl90b19jcHUoaW5mby0+ZnJhZ3RyZWUubnNwbGl0cyk7Ci0JbXV0ZXhfbG9jaygmY2ktPmlfZnJhZ3RyZWVfbXV0ZXgpOwotCXJiX25vZGUgPSByYl9maXJzdCgmY2ktPmlfZnJhZ3RyZWUpOwotCWZvciAoaSA9IDA7IGkgPCBuc3BsaXRzOyBpKyspIHsKLQkJdTMyIGlkID0gbGUzMl90b19jcHUoaW5mby0+ZnJhZ3RyZWUuc3BsaXRzW2ldLmZyYWcpOwotCQlmcmFnID0gTlVMTDsKLQkJd2hpbGUgKHJiX25vZGUpIHsKLQkJCWZyYWcgPSByYl9lbnRyeShyYl9ub2RlLCBzdHJ1Y3QgY2VwaF9pbm9kZV9mcmFnLCBub2RlKTsKLQkJCWlmIChjZXBoX2ZyYWdfY29tcGFyZShmcmFnLT5mcmFnLCBpZCkgPj0gMCkgewotCQkJCWlmIChmcmFnLT5mcmFnICE9IGlkKQotCQkJCQlmcmFnID0gTlVMTDsKLQkJCQllbHNlCi0JCQkJCXJiX25vZGUgPSByYl9uZXh0KHJiX25vZGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmJfbm9kZSA9IHJiX25leHQocmJfbm9kZSk7Ci0JCQlyYl9lcmFzZSgmZnJhZy0+bm9kZSwgJmNpLT5pX2ZyYWd0cmVlKTsKLQkJCWtmcmVlKGZyYWcpOwotCQkJZnJhZyA9IE5VTEw7Ci0JCX0KLQkJaWYgKCFmcmFnKSB7Ci0JCQlmcmFnID0gX19nZXRfb3JfY3JlYXRlX2ZyYWcoY2ksIGlkKTsKLQkJCWlmIChJU19FUlIoZnJhZykpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJZnJhZy0+c3BsaXRfYnkgPSBsZTMyX3RvX2NwdShpbmZvLT5mcmFndHJlZS5zcGxpdHNbaV0uYnkpOwotCQlkb3V0KCIgZnJhZyAleCBzcGxpdCBieSAlZFxuIiwgZnJhZy0+ZnJhZywgZnJhZy0+c3BsaXRfYnkpOwotCX0KLQl3aGlsZSAocmJfbm9kZSkgewotCQlmcmFnID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGNlcGhfaW5vZGVfZnJhZywgbm9kZSk7Ci0JCXJiX25vZGUgPSByYl9uZXh0KHJiX25vZGUpOwotCQlyYl9lcmFzZSgmZnJhZy0+bm9kZSwgJmNpLT5pX2ZyYWd0cmVlKTsKLQkJa2ZyZWUoZnJhZyk7Ci0JfQotCW11dGV4X3VubG9jaygmY2ktPmlfZnJhZ3RyZWVfbXV0ZXgpOwogCiAJLyogd2VyZSB3ZSBpc3N1ZWQgYSBjYXBhYmlsaXR5PyAqLwogCWlmIChpbmZvLT5jYXAuY2FwcykgewpAQCAtODA5LDMwICs4NTksNDEgQEAKIAkJCQkgICAgIGxlMzJfdG9fY3B1KGluZm8tPmNhcC5zZXEpLAogCQkJCSAgICAgbGUzMl90b19jcHUoaW5mby0+Y2FwLm1zZXEpLAogCQkJCSAgICAgbGU2NF90b19jcHUoaW5mby0+Y2FwLnJlYWxtKSwKLQkJCQkgICAgIGluZm8tPmNhcC5mbGFncywKLQkJCQkgICAgIGNhcHNfcmVzZXJ2YXRpb24pOworCQkJCSAgICAgaW5mby0+Y2FwLmZsYWdzLCAmbmV3X2NhcCk7CisJCQl3YWtlID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCWRvdXQoIiAlcCBnb3Qgc25hcF9jYXBzICVzXG4iLCBpbm9kZSwKIAkJCSAgICAgY2VwaF9jYXBfc3RyaW5nKGxlMzJfdG9fY3B1KGluZm8tPmNhcC5jYXBzKSkpOwogCQkJY2ktPmlfc25hcF9jYXBzIHw9IGxlMzJfdG9fY3B1KGluZm8tPmNhcC5jYXBzKTsKIAkJCWlmIChjYXBfZm1vZGUgPj0gMCkKIAkJCQlfX2NlcGhfZ2V0X2Ztb2RlKGNpLCBjYXBfZm1vZGUpOwotCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCX0KIAl9IGVsc2UgaWYgKGNhcF9mbW9kZSA+PSAwKSB7CiAJCXByX3dhcm4oIm1kcyBpc3N1ZWQgbm8gY2FwcyBvbiAlbGx4LiVsbHhcbiIsCiAJCQkgICBjZXBoX3Zpbm9wKGlub2RlKSk7CiAJCV9fY2VwaF9nZXRfZm1vZGUoY2ksIGNhcF9mbW9kZSk7CiAJfQorCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOworCisJaWYgKHdha2UpCisJCXdha2VfdXBfYWxsKCZjaS0+aV9jYXBfd3EpOworCisJLyogcXVldWUgdHJ1bmNhdGUgaWYgd2Ugc2F3IGlfc2l6ZSBkZWNyZWFzZSAqLworCWlmIChxdWV1ZV90cnVuYykKKwkJY2VwaF9xdWV1ZV92bXRydW5jYXRlKGlub2RlKTsKKworCS8qIHBvcHVsYXRlIGZyYWcgdHJlZSAqLworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQljZXBoX2ZpbGxfZnJhZ3RyZWUoaW5vZGUsICZpbmZvLT5mcmFndHJlZSwgZGlyaW5mbyk7CiAKIAkvKiB1cGRhdGUgZGVsZWdhdGlvbiBpbmZvPyAqLwogCWlmIChkaXJpbmZvKQogCQljZXBoX2ZpbGxfZGlyZnJhZyhpbm9kZSwgZGlyaW5mbyk7CiAKIAllcnIgPSAwOwotCiBvdXQ6CisJaWYgKG5ld19jYXApCisJCWNlcGhfcHV0X2NhcChtZHNjLCBuZXdfY2FwKTsKIAlpZiAoeGF0dHJfYmxvYikKIAkJY2VwaF9idWZmZXJfcHV0KHhhdHRyX2Jsb2IpOwogCXJldHVybiBlcnI7CkBAIC0xNDg1LDcgKzE1NDYsNyBAQAogCW9yaWdfZ2VuID0gY2ktPmlfcmRjYWNoZV9nZW47CiAJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKKwl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIDApOwogCiAJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChvcmlnX2dlbiA9PSBjaS0+aV9yZGNhY2hlX2dlbiAmJgpAQCAtMTU4OCw3ICsxNjQ5LDcgQEAKIAkgICAgIGNpLT5pX3RydW5jYXRlX3BlbmRpbmcsIHRvKTsKIAlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAotCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIHRvKTsKKwl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIHRvKTsKIAogCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAodG8gPT0gY2ktPmlfdHJ1bmNhdGVfc2l6ZSkgewpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCA5YTMzYjk4Li45MmEyNTQ4IDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtMTU1OCw2ICsxNTU4LDggQEAKIAlpbml0X2NvbXBsZXRpb24oJnJlcS0+cl9zYWZlX2NvbXBsZXRpb24pOwogCUlOSVRfTElTVF9IRUFEKCZyZXEtPnJfdW5zYWZlX2l0ZW0pOwogCisJcmVxLT5yX3N0YW1wID0gQ1VSUkVOVF9USU1FOworCiAJcmVxLT5yX29wID0gb3A7CiAJcmVxLT5yX2RpcmVjdF9tb2RlID0gbW9kZTsKIAlyZXR1cm4gcmVxOwpAQCAtMTc4Myw3ICsxNzg1LDggQEAKIAl9CiAKIAlsZW4gPSBzaXplb2YoKmhlYWQpICsKLQkJcGF0aGxlbjEgKyBwYXRobGVuMiArIDIqKDEgKyBzaXplb2YodTMyKSArIHNpemVvZih1NjQpKTsKKwkJcGF0aGxlbjEgKyBwYXRobGVuMiArIDIqKDEgKyBzaXplb2YodTMyKSArIHNpemVvZih1NjQpKSArCisJCXNpemVvZihzdHJ1Y3QgdGltZXNwZWMpOwogCiAJLyogY2FsY3VsYXRlIChtYXgpIGxlbmd0aCBmb3IgY2FwIHJlbGVhc2VzICovCiAJbGVuICs9IHNpemVvZihzdHJ1Y3QgY2VwaF9tZHNfcmVxdWVzdF9yZWxlYXNlKSAqCkBAIC0xODAwLDYgKzE4MDMsNyBAQAogCQlnb3RvIG91dF9mcmVlMjsKIAl9CiAKKwltc2ctPmhkci52ZXJzaW9uID0gMjsKIAltc2ctPmhkci50aWQgPSBjcHVfdG9fbGU2NChyZXEtPnJfdGlkKTsKIAogCWhlYWQgPSBtc2ctPmZyb250Lmlvdl9iYXNlOwpAQCAtMTgzNiw2ICsxODQwLDkgQEAKIAkJICAgICAgbWRzLCByZXEtPnJfb2xkX2lub2RlX2Ryb3AsIHJlcS0+cl9vbGRfaW5vZGVfdW5sZXNzLCAwKTsKIAloZWFkLT5udW1fcmVsZWFzZXMgPSBjcHVfdG9fbGUxNihyZWxlYXNlcyk7CiAKKwkvKiB0aW1lIHN0YW1wICovCisJY2VwaF9lbmNvZGVfY29weSgmcCwgJnJlcS0+cl9zdGFtcCwgc2l6ZW9mKHJlcS0+cl9zdGFtcCkpOworCiAJQlVHX09OKHAgPiBlbmQpOwogCW1zZy0+ZnJvbnQuaW92X2xlbiA9IHAgLSBtc2ctPmZyb250Lmlvdl9iYXNlOwogCW1zZy0+aGRyLmZyb250X2xlbiA9IGNwdV90b19sZTMyKG1zZy0+ZnJvbnQuaW92X2xlbik7CmRpZmYgLS1naXQgYS9mcy9jZXBoL21kc19jbGllbnQuaCBiL2ZzL2NlcGgvbWRzX2NsaWVudC5oCmluZGV4IGU5MGNmY2MuLmUwMDczN2MgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvbWRzX2NsaWVudC5oCisrKyBiL2ZzL2NlcGgvbWRzX2NsaWVudC5oCkBAIC0xOTQsNiArMTk0LDcgQEAKIAlpbnQgcl9mbW9kZTsgICAgICAgIC8qIGZpbGUgbW9kZSwgaWYgZXhwZWN0aW5nIGNhcCAqLwogCWt1aWRfdCByX3VpZDsKIAlrZ2lkX3Qgcl9naWQ7CisJc3RydWN0IHRpbWVzcGVjIHJfc3RhbXA7CiAKIAkvKiBmb3IgY2hvb3Npbmcgd2hpY2ggbWRzIHRvIHNlbmQgdGhpcyByZXF1ZXN0IHRvICovCiAJaW50IHJfZGlyZWN0X21vZGU7CmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmggYi9mcy9jZXBoL3N1cGVyLmgKaW5kZXggZWFkMDVjYy4uMTJiMjA3NCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5oCisrKyBiL2ZzL2NlcGgvc3VwZXIuaApAQCAtMjkyLDcgKzI5Miw2IEBACiAJc3RydWN0IGNlcGhfc25hcF9jb250ZXh0ICppX2hlYWRfc25hcGM7ICAvKiBzZXQgaWYgd3JfYnVmZmVyX2hlYWQgPiAwIG9yCiAJCQkJCQkgICAgZGlydHl8Zmx1c2hpbmcgY2FwcyAqLwogCXVuc2lnbmVkIGlfc25hcF9jYXBzOyAgICAgICAgICAgLyogY2FwIGJpdHMgZm9yIHNuYXBwZWQgZmlsZXMgKi8KLQl1bnNpZ25lZCBpX2NhcF9leHBvcnRpbmdfaXNzdWVkOwogCiAJaW50IGlfbnJfYnlfbW9kZVtDRVBIX0ZJTEVfTU9ERV9OVU1dOyAgLyogb3BlbiBmaWxlIGNvdW50cyAqLwogCkBAIC03NzUsMTEgKzc3NCwxMyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmNlcGhfY2FwX3N0cmluZyhpbnQgYyk7CiBleHRlcm4gdm9pZCBjZXBoX2hhbmRsZV9jYXBzKHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLAogCQkJICAgICBzdHJ1Y3QgY2VwaF9tc2cgKm1zZyk7Ci1leHRlcm4gaW50IGNlcGhfYWRkX2NhcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc3RydWN0IGNlcGhfbWRzX3Nlc3Npb24gKnNlc3Npb24sIHU2NCBjYXBfaWQsCi0JCQlpbnQgZm1vZGUsIHVuc2lnbmVkIGlzc3VlZCwgdW5zaWduZWQgd2FudGVkLAotCQkJdW5zaWduZWQgY2FwLCB1bnNpZ25lZCBzZXEsIHU2NCByZWFsbWlubywgaW50IGZsYWdzLAotCQkJc3RydWN0IGNlcGhfY2FwX3Jlc2VydmF0aW9uICpjYXBzX3Jlc2VydmF0aW9uKTsKK2V4dGVybiBzdHJ1Y3QgY2VwaF9jYXAgKmNlcGhfZ2V0X2NhcChzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjLAorCQkJCSAgICAgc3RydWN0IGNlcGhfY2FwX3Jlc2VydmF0aW9uICpjdHgpOworZXh0ZXJuIHZvaWQgY2VwaF9hZGRfY2FwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGNlcGhfbWRzX3Nlc3Npb24gKnNlc3Npb24sIHU2NCBjYXBfaWQsCisJCQkgaW50IGZtb2RlLCB1bnNpZ25lZCBpc3N1ZWQsIHVuc2lnbmVkIHdhbnRlZCwKKwkJCSB1bnNpZ25lZCBjYXAsIHVuc2lnbmVkIHNlcSwgdTY0IHJlYWxtaW5vLCBpbnQgZmxhZ3MsCisJCQkgc3RydWN0IGNlcGhfY2FwICoqbmV3X2NhcCk7CiBleHRlcm4gdm9pZCBfX2NlcGhfcmVtb3ZlX2NhcChzdHJ1Y3QgY2VwaF9jYXAgKmNhcCwgYm9vbCBxdWV1ZV9yZWxlYXNlKTsKIGV4dGVybiB2b2lkIGNlcGhfcHV0X2NhcChzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjLAogCQkJIHN0cnVjdCBjZXBoX2NhcCAqY2FwKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDZhYWE4MTEuLjJjOTBkMDcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtNzI1LDggKzcyNSw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGNpZnNfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitzdGF0aWMgc3NpemVfdCBjaWZzX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShpb2NiLT5raV9maWxwKTsKIAlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGlub2RlKTsKQEAgLTczNywxNCArNzM2LDE0IEBACiAJaWYgKHdyaXR0ZW4pCiAJCXJldHVybiB3cml0dGVuOwogCi0Jd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlcihpb2NiLCBmcm9tKTsKIAogCWlmIChDSUZTX0NBQ0hFX1dSSVRFKENJRlNfSShpbm9kZSkpKQogCQlnb3RvIG91dDsKIAogCXJjID0gZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOwogCWlmIChyYykKLQkJY2lmc19kYmcoRllJLCAiY2lmc19maWxlX2Fpb193cml0ZTogJWQgcmMgb24gJXAgaW5vZGVcbiIsCisJCWNpZnNfZGJnKEZZSSwgImNpZnNfZmlsZV93cml0ZV9pdGVyOiAlZCByYyBvbiAlcCBpbm9kZVxuIiwKIAkJCSByYywgaW5vZGUpOwogCiBvdXQ6CkBAIC04ODAsMTAgKzg3OSwxMCBAQAogfTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfb3BzID0gewotCS5yZWFkID0gZG9fc3luY19yZWFkLAotCS53cml0ZSA9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUgPSBjaWZzX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlciA9IGNpZnNfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gY2lmc19vcGVuLAogCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKIAkubG9jayA9IGNpZnNfbG9jaywKQEAgLTg5OSwxMCArODk4LDEwIEBACiB9OwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9zdHJpY3Rfb3BzID0gewotCS5yZWFkID0gZG9fc3luY19yZWFkLAotCS53cml0ZSA9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkID0gY2lmc19zdHJpY3RfcmVhZHYsCi0JLmFpb193cml0ZSA9IGNpZnNfc3RyaWN0X3dyaXRldiwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGNpZnNfc3RyaWN0X3JlYWR2LAorCS53cml0ZV9pdGVyID0gY2lmc19zdHJpY3Rfd3JpdGV2LAogCS5vcGVuID0gY2lmc19vcGVuLAogCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKIAkubG9jayA9IGNpZnNfbG9jaywKQEAgLTkxOSwxMCArOTE4LDEwIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX2RpcmVjdF9vcHMgPSB7CiAJLyogQkIgcmVldmFsdWF0ZSB3aGV0aGVyIHRoZXkgY2FuIGJlIGRvbmUgd2l0aCBkaXJlY3Rpbywgbm8gY2FjaGUgKi8KLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZCA9IGNpZnNfdXNlcl9yZWFkdiwKLQkuYWlvX3dyaXRlID0gY2lmc191c2VyX3dyaXRldiwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGNpZnNfdXNlcl9yZWFkdiwKKwkud3JpdGVfaXRlciA9IGNpZnNfdXNlcl93cml0ZXYsCiAJLm9wZW4gPSBjaWZzX29wZW4sCiAJLnJlbGVhc2UgPSBjaWZzX2Nsb3NlLAogCS5sb2NrID0gY2lmc19sb2NrLApAQCAtOTM4LDEwICs5MzcsMTAgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX25vYnJsX29wcyA9IHsKLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlID0gY2lmc19maWxlX2Fpb193cml0ZSwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSBjaWZzX2ZpbGVfd3JpdGVfaXRlciwKIAkub3BlbiA9IGNpZnNfb3BlbiwKIAkucmVsZWFzZSA9IGNpZnNfY2xvc2UsCiAJLmZzeW5jID0gY2lmc19mc3luYywKQEAgLTk1NiwxMCArOTU1LDEwIEBACiB9OwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9zdHJpY3Rfbm9icmxfb3BzID0gewotCS5yZWFkID0gZG9fc3luY19yZWFkLAotCS53cml0ZSA9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkID0gY2lmc19zdHJpY3RfcmVhZHYsCi0JLmFpb193cml0ZSA9IGNpZnNfc3RyaWN0X3dyaXRldiwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGNpZnNfc3RyaWN0X3JlYWR2LAorCS53cml0ZV9pdGVyID0gY2lmc19zdHJpY3Rfd3JpdGV2LAogCS5vcGVuID0gY2lmc19vcGVuLAogCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKIAkuZnN5bmMgPSBjaWZzX3N0cmljdF9mc3luYywKQEAgLTk3NSwxMCArOTc0LDEwIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX2RpcmVjdF9ub2JybF9vcHMgPSB7CiAJLyogQkIgcmVldmFsdWF0ZSB3aGV0aGVyIHRoZXkgY2FuIGJlIGRvbmUgd2l0aCBkaXJlY3Rpbywgbm8gY2FjaGUgKi8KLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZCA9IGNpZnNfdXNlcl9yZWFkdiwKLQkuYWlvX3dyaXRlID0gY2lmc191c2VyX3dyaXRldiwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGNpZnNfdXNlcl9yZWFkdiwKKwkud3JpdGVfaXRlciA9IGNpZnNfdXNlcl93cml0ZXYsCiAJLm9wZW4gPSBjaWZzX29wZW4sCiAJLnJlbGVhc2UgPSBjaWZzX2Nsb3NlLAogCS5mc3luYyA9IGNpZnNfZnN5bmMsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaAppbmRleCA4ZmU1MTE2Li43MGYxNzhhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5oCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmgKQEAgLTk1LDE0ICs5NSwxMCBAQAogZXh0ZXJuIGludCBjaWZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogZXh0ZXJuIGludCBjaWZzX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIGV4dGVybiBpbnQgY2lmc19jbG9zZWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1leHRlcm4gc3NpemVfdCBjaWZzX3VzZXJfcmVhZHYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOwotZXh0ZXJuIHNzaXplX3QgY2lmc19zdHJpY3RfcmVhZHYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKTsKLWV4dGVybiBzc2l6ZV90IGNpZnNfdXNlcl93cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOwotZXh0ZXJuIHNzaXplX3QgY2lmc19zdHJpY3Rfd3JpdGV2KHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOworZXh0ZXJuIHNzaXplX3QgY2lmc191c2VyX3JlYWR2KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0byk7CitleHRlcm4gc3NpemVfdCBjaWZzX3N0cmljdF9yZWFkdihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pOworZXh0ZXJuIHNzaXplX3QgY2lmc191c2VyX3dyaXRldihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSk7CitleHRlcm4gc3NpemVfdCBjaWZzX3N0cmljdF93cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pOwogZXh0ZXJuIGludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogZXh0ZXJuIGludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOwogZXh0ZXJuIGludCBjaWZzX3N0cmljdF9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGxvZmZfdCwgaW50KTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggMjA4ZjU2ZS4uZTkwYTFlOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTIzODUsMTQgKzIzODUsMTIgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLWNpZnNfaW92ZWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBvZmZzZXQpCitjaWZzX2lvdmVjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sIGxvZmZfdCAqcG9mZnNldCkKIHsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBpOwogCXNpemVfdCBieXRlcywgY29waWVkLCBsZW4sIGN1cl9sZW47CiAJc3NpemVfdCB0b3RhbF93cml0dGVuID0gMDsKIAlsb2ZmX3Qgb2Zmc2V0OwotCXN0cnVjdCBpb3ZfaXRlciBpdDsKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7CiAJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwpAQCAtMjQwMSwxNCArMjM5OSwxNiBAQAogCWludCByYzsKIAlwaWRfdCBwaWQ7CiAKLQlsZW4gPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7Ci0JaWYgKCFsZW4pCi0JCXJldHVybiAwOwotCisJbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiAJcmMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwb2Zmc2V0LCAmbGVuLCAwKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIGxlbik7CisKIAlJTklUX0xJU1RfSEVBRCgmd2RhdGFfbGlzdCk7CiAJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAJb3Blbl9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMjQyNCw3ICsyNDI0LDYgQEAKIAllbHNlCiAJCXBpZCA9IGN1cnJlbnQtPnRnaWQ7CiAKLQlpb3ZfaXRlcl9pbml0KCZpdCwgaW92LCBucl9zZWdzLCBsZW4sIDApOwogCWRvIHsKIAkJc2l6ZV90IHNhdmVfbGVuOwogCkBAIC0yNDQ0LDExICsyNDQzLDEwIEBACiAKIAkJc2F2ZV9sZW4gPSBjdXJfbGVuOwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQkJYnl0ZXMgPSBtaW5fdChjb25zdCBzaXplX3QsIGN1cl9sZW4sIFBBR0VfU0laRSk7Ci0JCQljb3BpZWQgPSBpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcih3ZGF0YS0+cGFnZXNbaV0sICZpdCwKLQkJCQkJCQkgMCwgYnl0ZXMpOworCQkJYnl0ZXMgPSBtaW5fdChzaXplX3QsIGN1cl9sZW4sIFBBR0VfU0laRSk7CisJCQljb3BpZWQgPSBjb3B5X3BhZ2VfZnJvbV9pdGVyKHdkYXRhLT5wYWdlc1tpXSwgMCwgYnl0ZXMsCisJCQkJCQkgICAgIGZyb20pOwogCQkJY3VyX2xlbiAtPSBjb3BpZWQ7Ci0JCQlpb3ZfaXRlcl9hZHZhbmNlKCZpdCwgY29waWVkKTsKIAkJCS8qCiAJCQkgKiBJZiB3ZSBkaWRuJ3QgY29weSBhcyBtdWNoIGFzIHdlIGV4cGVjdGVkLCB0aGVuIHRoYXQKIAkJCSAqIG1heSBtZWFuIHdlIHRyb2QgaW50byBhbiB1bm1hcHBlZCBhcmVhLiBTdG9wIGNvcHlpbmcKQEAgLTI1NDYsMTEgKzI1NDQsMTEgQEAKIAlyZXR1cm4gdG90YWxfd3JpdHRlbiA/IHRvdGFsX3dyaXR0ZW4gOiAoc3NpemVfdClyYzsKIH0KIAotc3NpemVfdCBjaWZzX3VzZXJfd3JpdGV2KHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3NpemVfdCBjaWZzX3VzZXJfd3JpdGV2KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXNzaXplX3Qgd3JpdHRlbjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAlpbm9kZSA9IGZpbGVfaW5vZGUoaW9jYi0+a2lfZmlscCk7CiAKQEAgLTI1NjAsNyArMjU1OCw3IEBACiAJICogd3JpdGUgcmVxdWVzdC4KIAkgKi8KIAotCXdyaXR0ZW4gPSBjaWZzX2lvdmVjX3dyaXRlKGlvY2ItPmtpX2ZpbHAsIGlvdiwgbnJfc2VncywgJnBvcyk7CisJd3JpdHRlbiA9IGNpZnNfaW92ZWNfd3JpdGUoaW9jYi0+a2lfZmlscCwgZnJvbSwgJnBvcyk7CiAJaWYgKHdyaXR0ZW4gPiAwKSB7CiAJCXNldF9iaXQoQ0lGU19JTk9fSU5WQUxJRF9NQVBQSU5HLCAmQ0lGU19JKGlub2RlKS0+ZmxhZ3MpOwogCQlpb2NiLT5raV9wb3MgPSBwb3M7CkBAIC0yNTcwLDggKzI1NjgsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotY2lmc193cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorY2lmc193cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0yNTg5LDEwICsyNTg2LDEwIEBACiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCiAJCWxvY2tfcG9zID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWlmICghY2lmc19maW5kX2xvY2tfY29uZmxpY3QoY2ZpbGUsIGxvY2tfcG9zLCBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksCisJaWYgKCFjaWZzX2ZpbmRfbG9ja19jb25mbGljdChjZmlsZSwgbG9ja19wb3MsIGlvdl9pdGVyX2NvdW50KGZyb20pLAogCQkJCSAgICAgc2VydmVyLT52YWxzLT5leGNsdXNpdmVfbG9ja190eXBlLCBOVUxMLAogCQkJCSAgICAgQ0lGU19XUklURV9PUCkpIHsKLQkJcmMgPSBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzKTsKKwkJcmMgPSBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKGlvY2IsIGZyb20pOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQlpZiAocmMgPiAwKSB7CkBAIC0yNjEwLDggKzI2MDcsNyBAQAogfQogCiBzc2l6ZV90Ci1jaWZzX3N0cmljdF93cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorY2lmc19zdHJpY3Rfd3JpdGV2KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGlvY2ItPmtpX2ZpbHApOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koaW5vZGUpOwpAQCAtMjYyOSwxMSArMjYyNSwxMCBAQAogCQlpZiAoY2FwX3VuaXgodGNvbi0+c2VzKSAmJgogCQkoQ0lGU19VTklYX0ZDTlRMX0NBUCAmIGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSkpCiAJCSAgJiYgKChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9QT1NJWEJSTCkgPT0gMCkpIHsKLQkJCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKAotCQkJCQlpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CisJCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoaW9jYiwgZnJvbSk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQl3cml0dGVuID0gY2lmc193cml0ZXYoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCQl3cml0dGVuID0gY2lmc193cml0ZXYoaW9jYiwgZnJvbSk7CiAJCWdvdG8gb3V0OwogCX0KIAkvKgpAQCAtMjY0Miw3ICsyNjM3LDcgQEAKIAkgKiBhZmZlY3RlZCBwYWdlcyBiZWNhdXNlIGl0IG1heSBjYXVzZSBhIGVycm9yIHdpdGggbWFuZGF0b3J5IGxvY2tzIG9uCiAJICogdGhlc2UgcGFnZXMgYnV0IG5vdCBvbiB0aGUgcmVnaW9uIGZyb20gcG9zIHRvIHBwb3MrbGVuLTEuCiAJICovCi0Jd3JpdHRlbiA9IGNpZnNfdXNlcl93cml0ZXYoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCXdyaXR0ZW4gPSBjaWZzX3VzZXJfd3JpdGV2KGlvY2IsIGZyb20pOwogCWlmICh3cml0dGVuID4gMCAmJiBDSUZTX0NBQ0hFX1JFQUQoY2lub2RlKSkgewogCQkvKgogCQkgKiBXaW5kb3dzIDcgc2VydmVyIGNhbiBkZWxheSBicmVha2luZyBsZXZlbDIgb3Bsb2NrIGlmIGEgd3JpdGUKQEAgLTI4MzEsMzIgKzI4MjYsMjUgQEAKIAlyZXR1cm4gdG90YWxfcmVhZCA+IDAgPyB0b3RhbF9yZWFkIDogcmVzdWx0OwogfQogCi1zc2l6ZV90IGNpZnNfdXNlcl9yZWFkdihzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3NzaXplX3QgY2lmc191c2VyX3JlYWR2KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3NpemVfdCByYzsKIAlzaXplX3QgbGVuLCBjdXJfbGVuOwogCXNzaXplX3QgdG90YWxfcmVhZCA9IDA7Ci0JbG9mZl90IG9mZnNldCA9IHBvczsKKwlsb2ZmX3Qgb2Zmc2V0ID0gaW9jYi0+a2lfcG9zOwogCXVuc2lnbmVkIGludCBucGFnZXM7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKIAlzdHJ1Y3QgY2lmc190Y29uICp0Y29uOwogCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKIAlzdHJ1Y3QgY2lmc19yZWFkZGF0YSAqcmRhdGEsICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCByZGF0YV9saXN0OwotCXN0cnVjdCBpb3ZfaXRlciB0bzsKIAlwaWRfdCBwaWQ7CiAKLQlpZiAoIW5yX3NlZ3MpCi0JCXJldHVybiAwOwotCi0JbGVuID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCWxlbiA9IGlvdl9pdGVyX2NvdW50KHRvKTsKIAlpZiAoIWxlbikKIAkJcmV0dXJuIDA7CiAKLQlpb3ZfaXRlcl9pbml0KCZ0bywgaW92LCBucl9zZWdzLCBsZW4sIDApOwotCiAJSU5JVF9MSVNUX0hFQUQoJnJkYXRhX2xpc3QpOwogCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCW9wZW5fZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTI5MTQsNyArMjkwMiw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZyZGF0YV9saXN0KSkKIAkJcmMgPSAwOwogCi0JbGVuID0gaW92X2l0ZXJfY291bnQoJnRvKTsKKwlsZW4gPSBpb3ZfaXRlcl9jb3VudCh0byk7CiAJLyogdGhlIGxvb3AgYmVsb3cgc2hvdWxkIHByb2NlZWQgaW4gdGhlIG9yZGVyIG9mIGluY3JlYXNpbmcgb2Zmc2V0cyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZGF0YSwgdG1wLCAmcmRhdGFfbGlzdCwgbGlzdCkgewogCWFnYWluOgpAQCAtMjkzMSw3ICsyOTE5LDcgQEAKIAkJCQkJZ290byBhZ2FpbjsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXJjID0gY2lmc19yZWFkZGF0YV90b19pb3YocmRhdGEsICZ0byk7CisJCQkJcmMgPSBjaWZzX3JlYWRkYXRhX3RvX2lvdihyZGF0YSwgdG8pOwogCQkJfQogCiAJCX0KQEAgLTI5MzksNyArMjkyNyw3IEBACiAJCWtyZWZfcHV0KCZyZGF0YS0+cmVmY291bnQsIGNpZnNfdW5jYWNoZWRfcmVhZGRhdGFfcmVsZWFzZSk7CiAJfQogCi0JdG90YWxfcmVhZCA9IGxlbiAtIGlvdl9pdGVyX2NvdW50KCZ0byk7CisJdG90YWxfcmVhZCA9IGxlbiAtIGlvdl9pdGVyX2NvdW50KHRvKTsKIAogCWNpZnNfc3RhdHNfYnl0ZXNfcmVhZCh0Y29uLCB0b3RhbF9yZWFkKTsKIApAQCAtMjk0OCwxNSArMjkzNiwxNCBAQAogCQlyYyA9IDA7CiAKIAlpZiAodG90YWxfcmVhZCkgewotCQlpb2NiLT5raV9wb3MgPSBwb3MgKyB0b3RhbF9yZWFkOworCQlpb2NiLT5raV9wb3MgKz0gdG90YWxfcmVhZDsKIAkJcmV0dXJuIHRvdGFsX3JlYWQ7CiAJfQogCXJldHVybiByYzsKIH0KIAogc3NpemVfdAotY2lmc19zdHJpY3RfcmVhZHYoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitjaWZzX3N0cmljdF9yZWFkdihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoaW9jYi0+a2lfZmlscCk7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSA9IENJRlNfSShpbm9kZSk7CkBAIC0yOTc1LDIyICsyOTYyLDIyIEBACiAJICogcG9zK2xlbi0xLgogCSAqLwogCWlmICghQ0lGU19DQUNIRV9SRUFEKGNpbm9kZSkpCi0JCXJldHVybiBjaWZzX3VzZXJfcmVhZHYoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCQlyZXR1cm4gY2lmc191c2VyX3JlYWR2KGlvY2IsIHRvKTsKIAogCWlmIChjYXBfdW5peCh0Y29uLT5zZXMpICYmCiAJICAgIChDSUZTX1VOSVhfRkNOVExfQ0FQICYgbGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KSkgJiYKIAkgICAgKChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9QT1NJWEJSTCkgPT0gMCkpCi0JCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCQlyZXR1cm4gZ2VuZXJpY19maWxlX3JlYWRfaXRlcihpb2NiLCB0byk7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gaG9sZCB0aGUgc2VtIHRvIGJlIHN1cmUgbm9ib2R5IG1vZGlmaWVzIGxvY2sgbGlzdAogCSAqIHdpdGggYSBicmxvY2sgdGhhdCBwcmV2ZW50cyByZWFkaW5nLgogCSAqLwogCWRvd25fcmVhZCgmY2lub2RlLT5sb2NrX3NlbSk7Ci0JaWYgKCFjaWZzX2ZpbmRfbG9ja19jb25mbGljdChjZmlsZSwgcG9zLCBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksCisJaWYgKCFjaWZzX2ZpbmRfbG9ja19jb25mbGljdChjZmlsZSwgaW9jYi0+a2lfcG9zLCBpb3ZfaXRlcl9jb3VudCh0byksCiAJCQkJICAgICB0Y29uLT5zZXMtPnNlcnZlci0+dmFscy0+c2hhcmVkX2xvY2tfdHlwZSwKIAkJCQkgICAgIE5VTEwsIENJRlNfUkVBRF9PUCkpCi0JCXJjID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsKKwkJcmMgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAl1cF9yZWFkKCZjaW5vZGUtPmxvY2tfc2VtKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0zNzAzLDggKzM2OTAsOCBAQAogICogRGlyZWN0IElPIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIHRoZSBjYWNoZWQgbW9kZS4gCiAgKi8KIHN0YXRpYyBzc2l6ZV90Ci1jaWZzX2RpcmVjdF9pbyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0gICAgICAgICAgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCitjaWZzX2RpcmVjdF9pbyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyLAorICAgICAgICAgICAgICAgbG9mZl90IHBvcykKIHsKICAgICAgICAgLyoKICAgICAgICAgICogRklYTUUKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMTc5MmQ2MC4uMDZmNjU4NSAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTUzMiwxMCArNTMyLDEyIEBACiAJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKIAlpZiAoSVNfUk9PVChkZW50cnkpKQogCQlyZXR1cm4gTlVMTDsKKwlpZiAodW5saWtlbHkoKGludClkZW50cnktPmRfbG9ja3JlZi5jb3VudCA8IDApKQorCQlyZXR1cm4gTlVMTDsKIAlpZiAobGlrZWx5KHNwaW5fdHJ5bG9jaygmcGFyZW50LT5kX2xvY2spKSkKIAkJcmV0dXJuIHBhcmVudDsKLQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwogCXJjdV9yZWFkX2xvY2soKTsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwogYWdhaW46CiAJcGFyZW50ID0gQUNDRVNTX09OQ0UoZGVudHJ5LT5kX3BhcmVudCk7CiAJc3Bpbl9sb2NrKCZwYXJlbnQtPmRfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IDMxYmEwOTMuLjk4MDQwYmEgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJdW5zaWduZWQgYmxvY2tzX2F2YWlsYWJsZTsJLyogQXQgYmxvY2tfaW5fZmlsZS4gIGNoYW5nZXMgKi8KIAlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCiAJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fcmVxdWVzdDsvKiBkb2Vzbid0IGNoYW5nZSAqLwotCXVuc2lnbmVkIGZpcnN0X2Jsb2NrX2luX3BhZ2U7CS8qIGRvZXNuJ3QgY2hhbmdlLCBVc2VkIG9ubHkgb25jZSAqLwogCWludCBib3VuZGFyeTsJCQkvKiBwcmV2IGJsb2NrIGlzIGF0IGEgYm91bmRhcnkgKi8KIAlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrOwkJLyogYmxvY2sgbWFwcGluZyBmdW5jdGlvbiAqLwogCWRpb19zdWJtaXRfdCAqc3VibWl0X2lvOwkvKiBJTyBzdWJtaXRpb24gZnVuY3Rpb24gKi8KQEAgLTk4LDE5ICs5NywxNCBAQAogCXNlY3Rvcl90IGN1cl9wYWdlX2Jsb2NrOwkvKiBXaGVyZSBpdCBzdGFydHMgKi8KIAlsb2ZmX3QgY3VyX3BhZ2VfZnNfb2Zmc2V0OwkvKiBPZmZzZXQgaW4gZmlsZSAqLwogCi0JLyoKLQkgKiBQYWdlIGZldGNoaW5nIHN0YXRlLiBUaGVzZSB2YXJpYWJsZXMgYmVsb25nIHRvIGRpb19yZWZpbGxfcGFnZXMoKS4KLQkgKi8KLQlpbnQgY3Vycl9wYWdlOwkJCS8qIGNoYW5nZXMgKi8KLQlpbnQgdG90YWxfcGFnZXM7CQkvKiBkb2Vzbid0IGNoYW5nZSAqLwotCXVuc2lnbmVkIGxvbmcgY3Vycl91c2VyX2FkZHJlc3M7LyogY2hhbmdlcyAqLwotCisJc3RydWN0IGlvdl9pdGVyICppdGVyOwogCS8qCiAJICogUGFnZSBxdWV1ZS4gIFRoZXNlIHZhcmlhYmxlcyBiZWxvbmcgdG8gZGlvX3JlZmlsbF9wYWdlcygpIGFuZAogCSAqIGRpb19nZXRfcGFnZSgpLgogCSAqLwogCXVuc2lnbmVkIGhlYWQ7CQkJLyogbmV4dCBwYWdlIHRvIHByb2Nlc3MgKi8KIAl1bnNpZ25lZCB0YWlsOwkJCS8qIGxhc3QgdmFsaWQgcGFnZSArIDEgKi8KKwlzaXplX3QgZnJvbSwgdG87CiB9OwogCiAvKiBkaW9fc3RhdGUgY29tbXVuaWNhdGVkIGJldHdlZW4gc3VibWlzc2lvbiBwYXRoIGFuZCBlbmRfaW8gKi8KQEAgLTE2MywxNSArMTU3LDEwIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGRpb19yZWZpbGxfcGFnZXMoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKLQlpbnQgcmV0OwotCWludCBucl9wYWdlczsKKwlzc2l6ZV90IHJldDsKIAotCW5yX3BhZ2VzID0gbWluKHNkaW8tPnRvdGFsX3BhZ2VzIC0gc2Rpby0+Y3Vycl9wYWdlLCBESU9fUEFHRVMpOwotCXJldCA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoCi0JCXNkaW8tPmN1cnJfdXNlcl9hZGRyZXNzLAkJLyogV2hlcmUgZnJvbT8gKi8KLQkJbnJfcGFnZXMsCQkJLyogSG93IG1hbnkgcGFnZXM/ICovCi0JCWRpby0+cncgPT0gUkVBRCwJCS8qIFdyaXRlIHRvIG1lbW9yeT8gKi8KLQkJJmRpby0+cGFnZXNbMF0pOwkJLyogUHV0IHJlc3VsdHMgaGVyZSAqLworCXJldCA9IGlvdl9pdGVyX2dldF9wYWdlcyhzZGlvLT5pdGVyLCBkaW8tPnBhZ2VzLCBESU9fUEFHRVMgKiBQQUdFX1NJWkUsCisJCQkJJnNkaW8tPmZyb20pOwogCiAJaWYgKHJldCA8IDAgJiYgc2Rpby0+YmxvY2tzX2F2YWlsYWJsZSAmJiAoZGlvLT5ydyAmIFdSSVRFKSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IFpFUk9fUEFHRSgwKTsKQEAgLTE4NiwxOCArMTc1LDE5IEBACiAJCWRpby0+cGFnZXNbMF0gPSBwYWdlOwogCQlzZGlvLT5oZWFkID0gMDsKIAkJc2Rpby0+dGFpbCA9IDE7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OworCQlzZGlvLT5mcm9tID0gMDsKKwkJc2Rpby0+dG8gPSBQQUdFX1NJWkU7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChyZXQgPj0gMCkgewotCQlzZGlvLT5jdXJyX3VzZXJfYWRkcmVzcyArPSByZXQgKiBQQUdFX1NJWkU7Ci0JCXNkaW8tPmN1cnJfcGFnZSArPSByZXQ7CisJCWlvdl9pdGVyX2FkdmFuY2Uoc2Rpby0+aXRlciwgcmV0KTsKKwkJcmV0ICs9IHNkaW8tPmZyb207CiAJCXNkaW8tPmhlYWQgPSAwOwotCQlzZGlvLT50YWlsID0gcmV0OwotCQlyZXQgPSAwOworCQlzZGlvLT50YWlsID0gKHJldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCQlzZGlvLT50byA9ICgocmV0IC0gMSkgJiAoUEFHRV9TSVpFIC0gMSkpICsgMTsKKwkJcmV0dXJuIDA7CiAJfQotb3V0OgogCXJldHVybiByZXQ7CQogfQogCkBAIC0yMDgsOCArMTk4LDkgQEAKICAqIEwxIGNhY2hlLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpkaW9fZ2V0X3BhZ2Uoc3RydWN0IGRpbyAqZGlvLAotCQlzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKKwkJc3RydWN0IGRpb19zdWJtaXQgKnNkaW8sIHNpemVfdCAqZnJvbSwgc2l6ZV90ICp0bykKIHsKKwlpbnQgbjsKIAlpZiAoZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykgPT0gMCkgewogCQlpbnQgcmV0OwogCkBAIC0yMTgsNyArMjA5LDEwIEBACiAJCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCQlCVUdfT04oZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykgPT0gMCk7CiAJfQotCXJldHVybiBkaW8tPnBhZ2VzW3NkaW8tPmhlYWQrK107CisJbiA9IHNkaW8tPmhlYWQrKzsKKwkqZnJvbSA9IG4gPyAwIDogc2Rpby0+ZnJvbTsKKwkqdG8gPSAobiA9PSBzZGlvLT50YWlsIC0gMSkgPyBzZGlvLT50byA6IFBBR0VfU0laRTsKKwlyZXR1cm4gZGlvLT5wYWdlc1tuXTsKIH0KIAogLyoqCkBAIC00MjIsOCArNDE2LDggQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGRpb19jbGVhbnVwKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8pCiB7Ci0Jd2hpbGUgKGRpb19wYWdlc19wcmVzZW50KHNkaW8pKQotCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvX2dldF9wYWdlKGRpbywgc2RpbykpOworCXdoaWxlIChzZGlvLT5oZWFkIDwgc2Rpby0+dGFpbCkKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpby0+cGFnZXNbc2Rpby0+aGVhZCsrXSk7CiB9CiAKIC8qCkBAIC05MTIsMjMgKzkwNiwxOCBAQAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJY29uc3QgdW5zaWduZWQgYmxrYml0cyA9IHNkaW8tPmJsa2JpdHM7Ci0JY29uc3QgdW5zaWduZWQgYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9TSVpFID4+IGJsa2JpdHM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgYmxvY2tfaW5fcGFnZTsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIFRoZSBJL08gY2FuIHN0YXJ0IGF0IGFueSBibG9jayBvZmZzZXQgd2l0aGluIHRoZSBmaXJzdCBwYWdlICovCi0JYmxvY2tfaW5fcGFnZSA9IHNkaW8tPmZpcnN0X2Jsb2NrX2luX3BhZ2U7Ci0KIAl3aGlsZSAoc2Rpby0+YmxvY2tfaW5fZmlsZSA8IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpIHsKLQkJcGFnZSA9IGRpb19nZXRfcGFnZShkaW8sIHNkaW8pOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJc2l6ZV90IGZyb20sIHRvOworCQlwYWdlID0gZGlvX2dldF9wYWdlKGRpbywgc2RpbywgJmZyb20sICZ0byk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXdoaWxlIChibG9ja19pbl9wYWdlIDwgYmxvY2tzX3Blcl9wYWdlKSB7Ci0JCQl1bnNpZ25lZCBvZmZzZXRfaW5fcGFnZSA9IGJsb2NrX2luX3BhZ2UgPDwgYmxrYml0czsKKwkJd2hpbGUgKGZyb20gPCB0bykgewogCQkJdW5zaWduZWQgdGhpc19jaHVua19ieXRlczsJLyogIyBvZiBieXRlcyBtYXBwZWQgKi8KIAkJCXVuc2lnbmVkIHRoaXNfY2h1bmtfYmxvY2tzOwkvKiAjIG9mIGJsb2NrcyAqLwogCQkJdW5zaWduZWQgdTsKQEAgLTk5OSwxMCArOTg4LDEwIEBACiAJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQotCQkJCXplcm9fdXNlcihwYWdlLCBibG9ja19pbl9wYWdlIDw8IGJsa2JpdHMsCi0JCQkJCQkxIDw8IGJsa2JpdHMpOworCQkJCXplcm9fdXNlcihwYWdlLCBmcm9tLCAxIDw8IGJsa2JpdHMpOwogCQkJCXNkaW8tPmJsb2NrX2luX2ZpbGUrKzsKLQkJCQlibG9ja19pbl9wYWdlKys7CisJCQkJZnJvbSArPSAxIDw8IGJsa2JpdHM7CisJCQkJZGlvLT5yZXN1bHQgKz0gMSA8PCBibGtiaXRzOwogCQkJCWdvdG8gbmV4dF9ibG9jazsKIAkJCX0KIApAQCAtMTAxOSw3ICsxMDA4LDcgQEAKIAkJCSAqIGNhbiBhZGQgdG8gdGhpcyBwYWdlCiAJCQkgKi8KIAkJCXRoaXNfY2h1bmtfYmxvY2tzID0gc2Rpby0+YmxvY2tzX2F2YWlsYWJsZTsKLQkJCXUgPSAoUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UpID4+IGJsa2JpdHM7CisJCQl1ID0gKHRvIC0gZnJvbSkgPj4gYmxrYml0czsKIAkJCWlmICh0aGlzX2NodW5rX2Jsb2NrcyA+IHUpCiAJCQkJdGhpc19jaHVua19ibG9ja3MgPSB1OwogCQkJdSA9IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBzZGlvLT5ibG9ja19pbl9maWxlOwpAQCAtMTAzMSw3ICsxMDIwLDcgQEAKIAkJCWlmICh0aGlzX2NodW5rX2Jsb2NrcyA9PSBzZGlvLT5ibG9ja3NfYXZhaWxhYmxlKQogCQkJCXNkaW8tPmJvdW5kYXJ5ID0gYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCk7CiAJCQlyZXQgPSBzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgc2RpbywgcGFnZSwKLQkJCQkJCSAgb2Zmc2V0X2luX3BhZ2UsCisJCQkJCQkgIGZyb20sCiAJCQkJCQkgIHRoaXNfY2h1bmtfYnl0ZXMsCiAJCQkJCQkgIHNkaW8tPm5leHRfYmxvY2tfZm9yX2lvLAogCQkJCQkJICBtYXBfYmgpOwpAQCAtMTA0Miw3ICsxMDMxLDggQEAKIAkJCXNkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOwogCiAJCQlzZGlvLT5ibG9ja19pbl9maWxlICs9IHRoaXNfY2h1bmtfYmxvY2tzOwotCQkJYmxvY2tfaW5fcGFnZSArPSB0aGlzX2NodW5rX2Jsb2NrczsKKwkJCWZyb20gKz0gdGhpc19jaHVua19ieXRlczsKKwkJCWRpby0+cmVzdWx0ICs9IHRoaXNfY2h1bmtfYnl0ZXM7CiAJCQlzZGlvLT5ibG9ja3NfYXZhaWxhYmxlIC09IHRoaXNfY2h1bmtfYmxvY2tzOwogbmV4dF9ibG9jazoKIAkJCUJVR19PTihzZGlvLT5ibG9ja19pbl9maWxlID4gc2Rpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCk7CkBAIC0xMDUyLDcgKzEwNDIsNiBAQAogCiAJCS8qIERyb3AgdGhlIHJlZiB3aGljaCB3YXMgdGFrZW4gaW4gZ2V0X3VzZXJfcGFnZXMoKSAqLwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWJsb2NrX2luX3BhZ2UgPSAwOwogCX0KIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMTEwNywyNCArMTA5NiwyMCBAQAogICovCiBzdGF0aWMgaW5saW5lIHNzaXplX3QKIGRvX2Jsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgCi0JdW5zaWduZWQgbG9uZyBucl9zZWdzLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssIGRpb19pb2RvbmVfdCBlbmRfaW8sCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3Qgb2Zmc2V0LCAKKwlnZXRfYmxvY2tfdCBnZXRfYmxvY2ssIGRpb19pb2RvbmVfdCBlbmRfaW8sCiAJZGlvX3N1Ym1pdF90IHN1Ym1pdF9pbywJaW50IGZsYWdzKQogewotCWludCBzZWc7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGlfYmxrYml0cyA9IEFDQ0VTU19PTkNFKGlub2RlLT5pX2Jsa2JpdHMpOwogCXVuc2lnbmVkIGJsa2JpdHMgPSBpX2Jsa2JpdHM7CiAJdW5zaWduZWQgYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7CiAJc3NpemVfdCByZXR2YWwgPSAtRUlOVkFMOwotCWxvZmZfdCBlbmQgPSBvZmZzZXQ7CisJbG9mZl90IGVuZCA9IG9mZnNldCArIGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXN0cnVjdCBkaW8gKmRpbzsKIAlzdHJ1Y3QgZGlvX3N1Ym1pdCBzZGlvID0geyAwLCB9OwotCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOwotCXNpemVfdCBieXRlczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoID0geyAwLCB9OwogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOworCXVuc2lnbmVkIGxvbmcgYWxpZ24gPSBvZmZzZXQgfCBpb3ZfaXRlcl9hbGlnbm1lbnQoaXRlcik7CiAKIAlpZiAocncgJiBXUklURSkKIAkJcncgPSBXUklURV9PRElSRUNUOwpAQCAtMTEzNCwzMiArMTExOSwxNiBAQAogCSAqIHRoZSBlYXJseSBwcmVmZXRjaCBpbiB0aGUgY2FsbGVyIGVub3VnaCB0aW1lLgogCSAqLwogCi0JaWYgKG9mZnNldCAmIGJsb2Nrc2l6ZV9tYXNrKSB7CisJaWYgKGFsaWduICYgYmxvY2tzaXplX21hc2spIHsKIAkJaWYgKGJkZXYpCiAJCQlibGtiaXRzID0gYmxrc2l6ZV9iaXRzKGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7Ci0JCWlmIChvZmZzZXQgJiBibG9ja3NpemVfbWFzaykKKwkJaWYgKGFsaWduICYgYmxvY2tzaXplX21hc2spCiAJCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBDaGVjayB0aGUgbWVtb3J5IGFsaWdubWVudC4gIEJsb2NrcyBjYW5ub3Qgc3RyYWRkbGUgcGFnZXMgKi8KLQlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7Ci0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJc2l6ZSA9IGlvdltzZWddLmlvdl9sZW47Ci0JCWVuZCArPSBzaXplOwotCQlpZiAodW5saWtlbHkoKGFkZHIgJiBibG9ja3NpemVfbWFzaykgfHwKLQkJCSAgICAgKHNpemUgJiBibG9ja3NpemVfbWFzaykpKSB7Ci0JCQlpZiAoYmRldikKLQkJCQlibGtiaXRzID0gYmxrc2l6ZV9iaXRzKAotCQkJCQkgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoYmRldikpOwotCQkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7Ci0JCQlpZiAoKGFkZHIgJiBibG9ja3NpemVfbWFzaykgfHwgKHNpemUgJiBibG9ja3NpemVfbWFzaykpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAkvKiB3YXRjaCBvdXQgZm9yIGEgMCBsZW4gaW8gZnJvbSBhIHRyaWNrc3kgZnMgKi8KLQlpZiAocncgPT0gUkVBRCAmJiBlbmQgPT0gb2Zmc2V0KQorCWlmIChydyA9PSBSRUFEICYmICFpb3ZfaXRlcl9jb3VudChpdGVyKSkKIAkJcmV0dXJuIDA7CiAKIAlkaW8gPSBrbWVtX2NhY2hlX2FsbG9jKGRpb19jYWNoZSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjQ5LDYgKzEyMTgsMTAgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGlvLT5iaW9fbG9jayk7CiAJZGlvLT5yZWZjb3VudCA9IDE7CiAKKwlzZGlvLml0ZXIgPSBpdGVyOworCXNkaW8uZmluYWxfYmxvY2tfaW5fcmVxdWVzdCA9CisJCShvZmZzZXQgKyBpb3ZfaXRlcl9jb3VudChpdGVyKSkgPj4gYmxrYml0czsKKwogCS8qCiAJICogSW4gY2FzZSBvZiBub24tYWxpZ25lZCBidWZmZXJzLCB3ZSBtYXkgbmVlZCAyIG1vcmUKIAkgKiBwYWdlcyBzaW5jZSB3ZSBuZWVkIHRvIHplcm8gb3V0IGZpcnN0IGFuZCBsYXN0IGJsb2NrLgpAQCAtMTI1Niw0NyArMTIyOSwxMyBAQAogCWlmICh1bmxpa2VseShzZGlvLmJsa2ZhY3RvcikpCiAJCXNkaW8ucGFnZXNfaW5faW8gPSAyOwogCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQl1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJc2Rpby5wYWdlc19pbl9pbyArPQotCQkJKCh1c2VyX2FkZHIgKyBpb3Zbc2VnXS5pb3ZfbGVuICsgUEFHRV9TSVpFLTEpIC8KLQkJCQlQQUdFX1NJWkUgLSB1c2VyX2FkZHIgLyBQQUdFX1NJWkUpOwotCX0KKwlzZGlvLnBhZ2VzX2luX2lvICs9IGlvdl9pdGVyX25wYWdlcyhpdGVyLCBJTlRfTUFYKTsKIAogCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAotCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKLQkJdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92W3NlZ10uaW92X2Jhc2U7Ci0JCXNkaW8uc2l6ZSArPSBieXRlcyA9IGlvdltzZWddLmlvdl9sZW47Ci0KLQkJLyogSW5kZXggaW50byB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZmlyc3QgYmxvY2sgKi8KLQkJc2Rpby5maXJzdF9ibG9ja19pbl9wYWdlID0gKHVzZXJfYWRkciAmIH5QQUdFX01BU0spID4+IGJsa2JpdHM7Ci0JCXNkaW8uZmluYWxfYmxvY2tfaW5fcmVxdWVzdCA9IHNkaW8uYmxvY2tfaW5fZmlsZSArCi0JCQkJCQkoYnl0ZXMgPj4gYmxrYml0cyk7Ci0JCS8qIFBhZ2UgZmV0Y2hpbmcgc3RhdGUgKi8KLQkJc2Rpby5oZWFkID0gMDsKLQkJc2Rpby50YWlsID0gMDsKLQkJc2Rpby5jdXJyX3BhZ2UgPSAwOwotCi0JCXNkaW8udG90YWxfcGFnZXMgPSAwOwotCQlpZiAodXNlcl9hZGRyICYgKFBBR0VfU0laRS0xKSkgewotCQkJc2Rpby50b3RhbF9wYWdlcysrOwotCQkJYnl0ZXMgLT0gUEFHRV9TSVpFIC0gKHVzZXJfYWRkciAmIChQQUdFX1NJWkUgLSAxKSk7Ci0JCX0KLQkJc2Rpby50b3RhbF9wYWdlcyArPSAoYnl0ZXMgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKLQkJc2Rpby5jdXJyX3VzZXJfYWRkcmVzcyA9IHVzZXJfYWRkcjsKLQotCQlyZXR2YWwgPSBkb19kaXJlY3RfSU8oZGlvLCAmc2RpbywgJm1hcF9iaCk7Ci0KLQkJZGlvLT5yZXN1bHQgKz0gaW92W3NlZ10uaW92X2xlbiAtCi0JCQkoKHNkaW8uZmluYWxfYmxvY2tfaW5fcmVxdWVzdCAtIHNkaW8uYmxvY2tfaW5fZmlsZSkgPDwKLQkJCQkJYmxrYml0cyk7Ci0KLQkJaWYgKHJldHZhbCkgewotCQkJZGlvX2NsZWFudXAoZGlvLCAmc2Rpbyk7Ci0JCQlicmVhazsKLQkJfQotCX0gLyogZW5kIGlvdmVjIGxvb3AgKi8KKwlyZXR2YWwgPSBkb19kaXJlY3RfSU8oZGlvLCAmc2RpbywgJm1hcF9iaCk7CisJaWYgKHJldHZhbCkKKwkJZGlvX2NsZWFudXAoZGlvLCAmc2Rpbyk7CiAKIAlpZiAocmV0dmFsID09IC1FTk9UQkxLKSB7CiAJCS8qCkBAIC0xMzY1LDggKzEzMDQsOCBAQAogCiBzc2l6ZV90CiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKLQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGdldF9ibG9ja190IGdldF9ibG9jaywgZGlvX2lvZG9uZV90IGVuZF9pbywKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQsCisJZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrLCBkaW9faW9kb25lX3QgZW5kX2lvLAogCWRpb19zdWJtaXRfdCBzdWJtaXRfaW8sCWludCBmbGFncykKIHsKIAkvKgpAQCAtMTM4MSw5ICsxMzIwLDggQEAKIAlwcmVmZXRjaChiZGV2LT5iZF9xdWV1ZSk7CiAJcHJlZmV0Y2goKGNoYXIgKiliZGV2LT5iZF9xdWV1ZSArIFNNUF9DQUNIRV9CWVRFUyk7CiAKLQlyZXR1cm4gZG9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgYmRldiwgaW92LCBvZmZzZXQsCi0JCQkJICAgICBucl9zZWdzLCBnZXRfYmxvY2ssIGVuZF9pbywKLQkJCQkgICAgIHN1Ym1pdF9pbywgZmxhZ3MpOworCXJldHVybiBkb19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBiZGV2LCBpdGVyLCBvZmZzZXQsCisJCQkJICAgICBnZXRfYmxvY2ssIGVuZF9pbywgc3VibWl0X2lvLCBmbGFncyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woX19ibG9ja2Rldl9kaXJlY3RfSU8pOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZmlsZS5jIGIvZnMvZWNyeXB0ZnMvZmlsZS5jCmluZGV4IGIxZWFhN2EuLmRiMGZhZDMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2ZpbGUuYworKysgYi9mcy9lY3J5cHRmcy9maWxlLmMKQEAgLTQ1LDE0ICs0NSwxMyBAQAogICogVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGRpcmVjdG9yeSByZWFkcyBpcyBlY3J5cHRmc19yZWFkLgogICovCiBzdGF0aWMgc3NpemVfdCBlY3J5cHRmc19yZWFkX3VwZGF0ZV9hdGltZShzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorCQkJCXN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CiAJc3NpemVfdCByYzsKIAlzdHJ1Y3QgcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAKLQlyYyA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CisJcmMgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAkvKgogCSAqIEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBhc3luYyBpbnRlcmZhY2UsIHdlIG5lZWQgdG8gd2FpdAogCSAqIGZvciBJTyB0byBmaW5pc2ggdG8gdXBkYXRlIGF0aW1lCkBAIC0zNTIsMTAgKzM1MSwxMCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVjcnlwdGZzX21haW5fZm9wcyA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkuYWlvX3JlYWQgPSBlY3J5cHRmc19yZWFkX3VwZGF0ZV9hdGltZSwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUgPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyID0gZWNyeXB0ZnNfcmVhZF91cGRhdGVfYXRpbWUsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkuaXRlcmF0ZSA9IGVjcnlwdGZzX3JlYWRkaXIsCiAJLnVubG9ja2VkX2lvY3RsID0gZWNyeXB0ZnNfdW5sb2NrZWRfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVApkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDIzOGI3YWEuLmEzZDMzZmUgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTEwNDYsMTMgKzEwNDYsMTMgQEAKICAqIHNvIHRoYXQgYSBuZXcgb25lIGNhbiBiZSBzdGFydGVkCiAgKi8KIAotdm9pZCBzZXRfdGFza19jb21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjb25zdCBjaGFyICpidWYpCit2b2lkIF9fc2V0X3Rhc2tfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3QgY2hhciAqYnVmLCBib29sIGV4ZWMpCiB7CiAJdGFza19sb2NrKHRzayk7CiAJdHJhY2VfdGFza19yZW5hbWUodHNrLCBidWYpOwogCXN0cmxjcHkodHNrLT5jb21tLCBidWYsIHNpemVvZih0c2stPmNvbW0pKTsKIAl0YXNrX3VubG9jayh0c2spOwotCXBlcmZfZXZlbnRfY29tbSh0c2spOworCXBlcmZfZXZlbnRfY29tbSh0c2ssIGV4ZWMpOwogfQogCiBpbnQgZmx1c2hfb2xkX2V4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0pCkBAIC0xMTEwLDcgKzExMTAsOCBAQAogCWVsc2UKIAkJc2V0X2R1bXBhYmxlKGN1cnJlbnQtPm1tLCBzdWlkX2R1bXBhYmxlKTsKIAotCXNldF90YXNrX2NvbW0oY3VycmVudCwga2Jhc2VuYW1lKGJwcm0tPmZpbGVuYW1lKSk7CisJcGVyZl9ldmVudF9leGVjKCk7CisJX19zZXRfdGFza19jb21tKGN1cnJlbnQsIGtiYXNlbmFtZShicHJtLT5maWxlbmFtZSksIHRydWUpOwogCiAJLyogU2V0IHRoZSBuZXcgbW0gdGFzayBzaXplLiBXZSBoYXZlIHRvIGRvIHRoYXQgbGF0ZSBiZWNhdXNlIGl0IG1heQogCSAqIGRlcGVuZCBvbiBUSUZfMzJCSVQgd2hpY2ggaXMgb25seSB1cGRhdGVkIGluIGZsdXNoX3RocmVhZCgpIG9uCmRpZmYgLS1naXQgYS9mcy9leG9mcy9maWxlLmMgYi9mcy9leG9mcy9maWxlLmMKaW5kZXggNDkxYzZjMC4uNzFiZjhlNCAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvZmlsZS5jCisrKyBiL2ZzL2V4b2ZzL2ZpbGUuYwpAQCAtNjcsMTcgKzY3LDE3IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhvZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCiAJLnJlbGVhc2UJPSBleG9mc19yZWxlYXNlX2ZpbGUsCiAJLmZzeW5jCQk9IGV4b2ZzX2ZpbGVfZnN5bmMsCiAJLmZsdXNoCQk9IGV4b2ZzX2ZsdXNoLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4b2ZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL2lub2RlLmMgYi9mcy9leG9mcy9pbm9kZS5jCmluZGV4IGQxYzI0NGQuLjNmOWNhZmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL2lub2RlLmMKKysrIGIvZnMvZXhvZnMvaW5vZGUuYwpAQCAtOTY0LDcgKzk2NCw3IEBACiAKICAvKiBUT0RPOiBTaG91bGQgYmUgZWFzeSBlbm91Z2ggdG8gZG8gcHJvcHJseSAqLwogc3RhdGljIHNzaXplX3QgZXhvZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZpbGUuYyBiL2ZzL2V4dDIvZmlsZS5jCmluZGV4IDQ0YzM2ZTUuLjdjODdiMjIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZmlsZS5jCisrKyBiL2ZzL2V4dDIvZmlsZS5jCkBAIC02MiwxMCArNjIsMTAgQEAKICAqLwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGV4dDJfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSBleHQyX2NvbXBhdF9pb2N0bCwKQEAgLTc1LDcgKzc1LDcgQEAKIAkucmVsZWFzZQk9IGV4dDJfcmVsZWFzZV9maWxlLAogCS5mc3luYwkJPSBleHQyX2ZzeW5jLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIH07CiAKICNpZmRlZiBDT05GSUdfRVhUMl9GU19YSVAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCBiMWQyYTQ2Li4zNmQzNWMzIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC04NTAsMTggKzg1MCwxOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotZXh0Ml9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorZXh0Ml9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCWxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXNzaXplX3QgcmV0OwogCi0JcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJIGV4dDJfZ2V0X2Jsb2NrKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsIGV4dDJfZ2V0X2Jsb2NrKTsKIAlpZiAocmV0IDwgMCAmJiAocncgJiBXUklURSkpCi0JCWV4dDJfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSk7CisJCWV4dDJfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGNvdW50KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZpbGUuYyBiL2ZzL2V4dDMvZmlsZS5jCmluZGV4IGFhZDA1MzEuLmEwNjJmYTEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvZmlsZS5jCisrKyBiL2ZzL2V4dDMvZmlsZS5jCkBAIC01MCwxMCArNTAsMTAgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bAk9IGV4dDNfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSBleHQzX2NvbXBhdF9pb2N0bCwKQEAgLTYzLDcgKzYzLDcgQEAKIAkucmVsZWFzZQk9IGV4dDNfcmVsZWFzZV9maWxlLAogCS5mc3luYwkJPSBleHQzX3N5bmNfZmlsZSwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwppbmRleCA2OTVhYmU3Li4yYzZjY2M0IDEwMDY0NAotLS0gYS9mcy9leHQzL2lub2RlLmMKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0xODIxLDggKzE4MjEsNyBAQAogICogVkZTIGNvZGUgZmFsbHMgYmFjayBpbnRvIGJ1ZmZlcmVkIHBhdGggaW4gdGhhdCBjYXNlIHNvIHdlIGFyZSBzYWZlLgogICovCiBzdGF0aWMgc3NpemVfdCBleHQzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAotCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQkJc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3Qgb2Zmc2V0KQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwpAQCAtMTgzMCwxMCArMTgyOSwxMCBAQAogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3NpemVfdCByZXQ7CiAJaW50IG9ycGhhbiA9IDA7Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCWludCByZXRyaWVzID0gMDsKIAotCXRyYWNlX2V4dDNfZGlyZWN0X0lPX2VudGVyKGlub2RlLCBvZmZzZXQsIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSwgcncpOworCXRyYWNlX2V4dDNfZGlyZWN0X0lPX2VudGVyKGlub2RlLCBvZmZzZXQsIGNvdW50LCBydyk7CiAKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJbG9mZl90IGZpbmFsX3NpemUgPSBvZmZzZXQgKyBjb3VudDsKQEAgLTE4NTcsMTUgKzE4NTYsMTQgQEAKIAl9CiAKIHJldHJ5OgotCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LCBucl9zZWdzLAotCQkJCSBleHQzX2dldF9ibG9jayk7CisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaXRlciwgb2Zmc2V0LCBleHQzX2dldF9ibG9jayk7CiAJLyoKIAkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKIAkgKiBibG9ja3Mgb3V0c2lkZSBpX3NpemUuIFRyaW0gdGhlc2Ugb2ZmIGFnYWluLgogCSAqLwogCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKIAkJbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgY291bnQ7CiAKIAkJaWYgKGVuZCA+IGlzaXplKQogCQkJZXh0M190cnVuY2F0ZV9mYWlsZWRfZGlyZWN0X3dyaXRlKGlub2RlKTsKQEAgLTE5MTAsOCArMTkwOCw3IEBACiAJCQlyZXQgPSBlcnI7CiAJfQogb3V0OgotCXRyYWNlX2V4dDNfZGlyZWN0X0lPX2V4aXQoaW5vZGUsIG9mZnNldCwKLQkJCQlpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksIHJ3LCByZXQpOworCXRyYWNlX2V4dDNfZGlyZWN0X0lPX2V4aXQoaW5vZGUsIG9mZnNldCwgY291bnQsIHJ3LCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggMTQ3OWUyYS4uN2NjNWEwZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTIxNDAsOCArMjE0MCw3IEBACiBleHRlcm4gaW50IGV4dDRfaW5kX21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsIGludCBmbGFncyk7CiBleHRlcm4gc3NpemVfdCBleHQ0X2luZF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzKTsKKwkJCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpOwogZXh0ZXJuIGludCBleHQ0X2luZF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spOwogZXh0ZXJuIGludCBleHQ0X2luZF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzKTsKIGV4dGVybiB2b2lkIGV4dDRfaW5kX3RydW5jYXRlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9maWxlLmMgYi9mcy9leHQ0L2ZpbGUuYwppbmRleCA0ZThiYzI4NC4uODY5NWY3MCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTc0LDI2ICs3NCwyMiBAQAogICogb3Igb25lIHRocmVhZCB3aWxsIHplcm8gdGhlIG90aGVyJ3MgZGF0YSwgY2F1c2luZyBjb3JydXB0aW9uLgogICovCiBzdGF0aWMgaW50Ci1leHQ0X3VuYWxpZ25lZF9haW8oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCSAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK2V4dDRfdW5hbGlnbmVkX2FpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sIGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWludCBibG9ja21hc2sgPSBzYi0+c19ibG9ja3NpemUgLSAxOwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKLQlsb2ZmX3QgZmluYWxfc2l6ZSA9IHBvcyArIGNvdW50OwogCiAJaWYgKHBvcyA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCXJldHVybiAwOwogCi0JaWYgKChwb3MgJiBibG9ja21hc2spIHx8IChmaW5hbF9zaXplICYgYmxvY2ttYXNrKSkKKwlpZiAoKHBvcyB8IGlvdl9pdGVyX2FsaWdubWVudChmcm9tKSkgJiBibG9ja21hc2spCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1leHQ0X2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorZXh0NF9maWxlX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGlvY2ItPmtpX2ZpbHApOwpAQCAtMTAxLDEwICs5Nyw5IEBACiAJc3RydWN0IGJsa19wbHVnIHBsdWc7CiAJaW50IG9fZGlyZWN0ID0gZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUOwogCWludCBvdmVyd3JpdGUgPSAwOwotCXNpemVfdCBsZW5ndGggPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJc2l6ZV90IGxlbmd0aCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCXNzaXplX3QgcmV0OwotCi0JQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAkvKgogCSAqIFVuYWxpZ25lZCBkaXJlY3QgQUlPIG11c3QgYmUgc2VyaWFsaXplZDsgc2VlIGNvbW1lbnQgYWJvdmUKQEAgLTExNCw3ICsxMDksNyBAQAogCSAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSAmJgogCSAgICAhaXNfc3luY19raW9jYihpb2NiKSAmJgogCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EIHx8Ci0JICAgICBleHQ0X3VuYWxpZ25lZF9haW8oaW5vZGUsIGlvdiwgbnJfc2VncywgcG9zKSkpIHsKKwkgICAgIGV4dDRfdW5hbGlnbmVkX2Fpbyhpbm9kZSwgZnJvbSwgcG9zKSkpIHsKIAkJYWlvX211dGV4ID0gZXh0NF9haW9fbXV0ZXgoaW5vZGUpOwogCQltdXRleF9sb2NrKGFpb19tdXRleCk7CiAJCWV4dDRfdW53cml0dGVuX3dhaXQoaW5vZGUpOwpAQCAtMTM4LDEwICsxMzMsOCBAQAogCQkJZ290byBlcnJvdXQ7CiAJCX0KIAotCQlpZiAocG9zICsgbGVuZ3RoID4gc2JpLT5zX2JpdG1hcF9tYXhieXRlcykgewotCQkJbnJfc2VncyA9IGlvdl9zaG9ydGVuKChzdHJ1Y3QgaW92ZWMgKilpb3YsIG5yX3NlZ3MsCi0JCQkJCSAgICAgIHNiaS0+c19iaXRtYXBfbWF4Ynl0ZXMgLSBwb3MpOwotCQl9CisJCWlmIChwb3MgKyBsZW5ndGggPiBzYmktPnNfYml0bWFwX21heGJ5dGVzKQorCQkJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgc2JpLT5zX2JpdG1hcF9tYXhieXRlcyAtIHBvcyk7CiAJfQogCiAJaWYgKG9fZGlyZWN0KSB7CkBAIC0xNzksNyArMTcyLDcgQEAKIAkJfQogCX0KIAotCXJldCA9IF9fZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MpOworCXJldCA9IF9fZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoaW9jYiwgZnJvbSk7CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAlpZiAocmV0ID4gMCkgewpAQCAtNTk0LDEwICs1ODcsMTAgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGV4dDRfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGV4dDRfZmlsZV93cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGV4dDRfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGV4dDRfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSBleHQ0X2NvbXBhdF9pb2N0bCwKQEAgLTYwNyw3ICs2MDAsNyBAQAogCS5yZWxlYXNlCT0gZXh0NF9yZWxlYXNlX2ZpbGUsCiAJLmZzeW5jCQk9IGV4dDRfc3luY19maWxlLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZmFsbG9jYXRlCT0gZXh0NF9mYWxsb2NhdGUsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2luZGlyZWN0LmMgYi9mcy9leHQ0L2luZGlyZWN0LmMKaW5kZXggNTk0MDA5Zi4uOGE1N2U5ZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmRpcmVjdC5jCisrKyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwpAQCAtNjM5LDggKzYzOSw3IEBACiAgKiBWRlMgY29kZSBmYWxscyBiYWNrIGludG8gYnVmZmVyZWQgcGF0aCBpbiB0aGF0IGNhc2Ugc28gd2UgYXJlIHNhZmUuCiAgKi8KIHNzaXplX3QgZXh0NF9pbmRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC02NDgsNyArNjQ3LDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCXNzaXplX3QgcmV0OwogCWludCBvcnBoYW4gPSAwOwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAlpbnQgcmV0cmllcyA9IDA7CiAKIAlpZiAocncgPT0gV1JJVEUpIHsKQEAgLTY4NywxOCArNjg2LDE3IEBACiAJCQlnb3RvIGxvY2tlZDsKIAkJfQogCQlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsCi0JCQkJIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgb2Zmc2V0LCBucl9zZWdzLAorCQkJCSBpbm9kZS0+aV9zYi0+c19iZGV2LCBpdGVyLCBvZmZzZXQsCiAJCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLCAwKTsKIAkJaW5vZGVfZGlvX2RvbmUoaW5vZGUpOwogCX0gZWxzZSB7CiBsb2NrZWQ6Ci0JCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwKLQkJCQkgb2Zmc2V0LCBucl9zZWdzLCBleHQ0X2dldF9ibG9jayk7CisJCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGl0ZXIsCisJCQkJIG9mZnNldCwgZXh0NF9nZXRfYmxvY2spOwogCiAJCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKIAkJCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgY291bnQ7CiAKIAkJCWlmIChlbmQgPiBpc2l6ZSkKIAkJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggN2ZjZDY4ZS4uOGEwNjQ3MyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMzA5MywxMyArMzA5MywxMiBAQAogICoKICAqLwogc3RhdGljIHNzaXplX3QgZXh0NF9leHRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCWludCBvdmVyd3JpdGUgPSAwOwogCWdldF9ibG9ja190ICpnZXRfYmxvY2tfZnVuYyA9IE5VTEw7CiAJaW50IGRpb19mbGFncyA9IDA7CkBAIC0zMTA4LDcgKzMxMDcsNyBAQAogCiAJLyogVXNlIHRoZSBvbGQgcGF0aCBmb3IgcmVhZHMgYW5kIHdyaXRlcyBiZXlvbmQgaV9zaXplLiAqLwogCWlmIChydyAhPSBXUklURSB8fCBmaW5hbF9zaXplID4gaW5vZGUtPmlfc2l6ZSkKLQkJcmV0dXJuIGV4dDRfaW5kX2RpcmVjdF9JTyhydywgaW9jYiwgaW92LCBvZmZzZXQsIG5yX3NlZ3MpOworCQlyZXR1cm4gZXh0NF9pbmRfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpdGVyLCBvZmZzZXQpOwogCiAJQlVHX09OKGlvY2ItPnByaXZhdGUgPT0gTlVMTCk7CiAKQEAgLTMxNzUsOCArMzE3NCw4IEBACiAJCWRpb19mbGFncyA9IERJT19MT0NLSU5HOwogCX0KIAlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsCi0JCQkJICAgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCSAgIG9mZnNldCwgbnJfc2VncywKKwkJCQkgICBpbm9kZS0+aV9zYi0+c19iZGV2LCBpdGVyLAorCQkJCSAgIG9mZnNldCwKIAkJCQkgICBnZXRfYmxvY2tfZnVuYywKIAkJCQkgICBleHQ0X2VuZF9pb19kaW8sCiAJCQkJICAgTlVMTCwKQEAgLTMyMzAsMTEgKzMyMjksMTEgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgZXh0NF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJCSAgICAgIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IG9mZnNldCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAlzc2l6ZV90IHJldDsKIAogCS8qCkBAIC0zMjQ3LDEzICszMjQ2LDEyIEBACiAJaWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKLQl0cmFjZV9leHQ0X2RpcmVjdF9JT19lbnRlcihpbm9kZSwgb2Zmc2V0LCBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksIHJ3KTsKKwl0cmFjZV9leHQ0X2RpcmVjdF9JT19lbnRlcihpbm9kZSwgb2Zmc2V0LCBjb3VudCwgcncpOwogCWlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkKLQkJcmV0ID0gZXh0NF9leHRfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpb3YsIG9mZnNldCwgbnJfc2Vncyk7CisJCXJldCA9IGV4dDRfZXh0X2RpcmVjdF9JTyhydywgaW9jYiwgaXRlciwgb2Zmc2V0KTsKIAllbHNlCi0JCXJldCA9IGV4dDRfaW5kX2RpcmVjdF9JTyhydywgaW9jYiwgaW92LCBvZmZzZXQsIG5yX3NlZ3MpOwotCXRyYWNlX2V4dDRfZGlyZWN0X0lPX2V4aXQoaW5vZGUsIG9mZnNldCwKLQkJCQlpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksIHJ3LCByZXQpOworCQlyZXQgPSBleHQ0X2luZF9kaXJlY3RfSU8ocncsIGlvY2IsIGl0ZXIsIG9mZnNldCk7CisJdHJhY2VfZXh0NF9kaXJlY3RfSU9fZXhpdChpbm9kZSwgb2Zmc2V0LCBjb3VudCwgcncsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9mMmZzL2RhdGEuYwppbmRleCBjMWZiNmRkLi4wOTI0NTIxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2RhdGEuYworKysgYi9mcy9mMmZzL2RhdGEuYwpAQCAtMTAxNywxMCArMTAxNyw5IEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfZGlyZWN0X0lPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBydywKLQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3Qgb2Zmc2V0KQogewogCXVuc2lnbmVkIGJsb2Nrc2l6ZV9tYXNrID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMTsKLQlpbnQgaTsKIAogCWlmIChydyA9PSBSRUFEKQogCQlyZXR1cm4gMDsKQEAgLTEwMjgsMTQgKzEwMjcsMTQgQEAKIAlpZiAob2Zmc2V0ICYgYmxvY2tzaXplX21hc2spCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX3NlZ3M7IGkrKykKLQkJaWYgKGlvdltpXS5pb3ZfbGVuICYgYmxvY2tzaXplX21hc2spCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW92X2l0ZXJfYWxpZ25tZW50KGl0ZXIpICYgYmxvY2tzaXplX21hc2spCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGYyZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC0xMDQ0LDE0ICsxMDQzLDE0IEBACiAJaWYgKGYyZnNfaGFzX2lubGluZV9kYXRhKGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY2hlY2tfZGlyZWN0X0lPKGlub2RlLCBydywgaW92LCBvZmZzZXQsIG5yX3NlZ3MpKQorCWlmIChjaGVja19kaXJlY3RfSU8oaW5vZGUsIHJ3LCBpdGVyLCBvZmZzZXQpKQogCQlyZXR1cm4gMDsKIAogCS8qIGNsZWFyIGZzeW5jIG1hcmsgdG8gcmVjb3ZlciB0aGVzZSBibG9ja3MgKi8KIAlmc3luY19tYXJrX2NsZWFyKEYyRlNfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZS0+aV9pbm8pOwogCi0JcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LCBucl9zZWdzLAotCQkJCQkJCWdldF9kYXRhX2Jsb2NrKTsKKwlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaXRlciwgb2Zmc2V0LAorCQkJCSAgZ2V0X2RhdGFfYmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBmMmZzX2ludmFsaWRhdGVfZGF0YV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA5YzQ5YzU5Li5jNThlMzMwIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9mMmZzL2ZpbGUuYwpAQCAtODA4LDEwICs4MDgsMTAgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmMmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGYyZnNfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKIAkubW1hcAkJPSBmMmZzX2ZpbGVfbW1hcCwKIAkuZnN5bmMJCT0gZjJmc19zeW5jX2ZpbGUsCkBAIC04MjEsNSArODIxLDUgQEAKIAkuY29tcGF0X2lvY3RsCT0gZjJmc19jb21wYXRfaW9jdGwsCiAjZW5kaWYKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZpbGUuYyBiL2ZzL2ZhdC9maWxlLmMKaW5kZXggOWIxMDRmNS4uODVmNzlhOCAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZpbGUuYworKysgYi9mcy9mYXQvZmlsZS5jCkBAIC0xNzAsMTAgKzE3MCwxMCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZhdF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkucmVsZWFzZQk9IGZhdF9maWxlX3JlbGVhc2UsCiAJLnVubG9ja2VkX2lvY3RsCT0gZmF0X2dlbmVyaWNfaW9jdGwsCmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDljODM1OTQuLjc1NmFlYWQgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC0yNDcsMTIgKzI0NywxMyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBmYXRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQkgICAgIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXNzaXplX3QgcmV0OwogCiAJaWYgKHJ3ID09IFdSSVRFKSB7CkBAIC0yNjUsNyArMjY2LDcgQEAKIAkJICoKIAkJICogUmV0dXJuIDAsIGFuZCBmYWxsYmFjayB0byBub3JtYWwgYnVmZmVyZWQgd3JpdGUuCiAJCSAqLwotCQlsb2ZmX3Qgc2l6ZSA9IG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwkJbG9mZl90IHNpemUgPSBvZmZzZXQgKyBjb3VudDsKIAkJaWYgKE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA8IHNpemUpCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yNzQsMTAgKzI3NSw5IEBACiAJICogRkFUIG5lZWQgdG8gdXNlIHRoZSBESU9fTE9DS0lORyBmb3IgYXZvaWRpbmcgdGhlIHJhY2UKIAkgKiBjb25kaXRpb24gb2YgZmF0X2dldF9ibG9jaygpIGFuZCAtPnRydW5jYXRlKCkuCiAJICovCi0JcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJIGZhdF9nZXRfYmxvY2spOworCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGl0ZXIsIG9mZnNldCwgZmF0X2dldF9ibG9jayk7CiAJaWYgKHJldCA8IDAgJiYgKHJ3ICYgV1JJVEUpKQotCQlmYXRfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSk7CisJCWZhdF93cml0ZV9mYWlsZWQobWFwcGluZywgb2Zmc2V0ICsgY291bnQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2ZpbGUuYyBiL2ZzL2ZpbGUuYwppbmRleCA4ZjI5NGNmLi42NjkyM2ZlIDEwMDY0NAotLS0gYS9mcy9maWxlLmMKKysrIGIvZnMvZmlsZS5jCkBAIC00NCwxNSArNDQsMTAgQEAKIAlyZXR1cm4gdm1hbGxvYyhzaXplKTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9mZG1lbSh2b2lkICpwdHIpCi17Ci0JaXNfdm1hbGxvY19hZGRyKHB0cikgPyB2ZnJlZShwdHIpIDoga2ZyZWUocHRyKTsKLX0KLQogc3RhdGljIHZvaWQgX19mcmVlX2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKmZkdCkKIHsKLQlmcmVlX2ZkbWVtKGZkdC0+ZmQpOwotCWZyZWVfZmRtZW0oZmR0LT5vcGVuX2Zkcyk7CisJa3ZmcmVlKGZkdC0+ZmQpOworCWt2ZnJlZShmZHQtPm9wZW5fZmRzKTsKIAlrZnJlZShmZHQpOwogfQogCkBAIC0xMzAsNyArMTI1LDcgQEAKIAlyZXR1cm4gZmR0OwogCiBvdXRfYXJyOgotCWZyZWVfZmRtZW0oZmR0LT5mZCk7CisJa3ZmcmVlKGZkdC0+ZmQpOwogb3V0X2ZkdDoKIAlrZnJlZShmZHQpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCmluZGV4IDQwYmY0NjYuLjM4NWJmZDMgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGVfdGFibGUuYworKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTE3NSw2ICsxNzUsMTIgQEAKIAlmaWxlLT5mX3BhdGggPSAqcGF0aDsKIAlmaWxlLT5mX2lub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCWZpbGUtPmZfbWFwcGluZyA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWlmICgobW9kZSAmIEZNT0RFX1JFQUQpICYmCisJICAgICBsaWtlbHkoZm9wLT5yZWFkIHx8IGZvcC0+YWlvX3JlYWQgfHwgZm9wLT5yZWFkX2l0ZXIpKQorCQltb2RlIHw9IEZNT0RFX0NBTl9SRUFEOworCWlmICgobW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCSAgICAgbGlrZWx5KGZvcC0+d3JpdGUgfHwgZm9wLT5haW9fd3JpdGUgfHwgZm9wLT53cml0ZV9pdGVyKSkKKwkJbW9kZSB8PSBGTU9ERV9DQU5fV1JJVEU7CiAJZmlsZS0+Zl9tb2RlID0gbW9kZTsKIAlmaWxlLT5mX29wID0gZm9wOwogCWlmICgobW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSA9PSBGTU9ERV9SRUFEKQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9jdXNlLmMgYi9mcy9mdXNlL2N1c2UuYwppbmRleCAxM2I2OTFhLi45NjZhY2U4IDEwMDY0NAotLS0gYS9mcy9mdXNlL2N1c2UuYworKysgYi9mcy9mdXNlL2N1c2UuYwpAQCAtOTQsOCArOTQsMTAgQEAKIAlsb2ZmX3QgcG9zID0gMDsKIAlzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSBidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKIAlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGZpbGUgfTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaWk7CisJaW92X2l0ZXJfaW5pdCgmaWksIFJFQUQsICZpb3YsIDEsIGNvdW50KTsKIAotCXJldHVybiBmdXNlX2RpcmVjdF9pbygmaW8sICZpb3YsIDEsIGNvdW50LCAmcG9zLCBGVVNFX0RJT19DVVNFKTsKKwlyZXR1cm4gZnVzZV9kaXJlY3RfaW8oJmlvLCAmaWksICZwb3MsIEZVU0VfRElPX0NVU0UpOwogfQogCiBzdGF0aWMgc3NpemVfdCBjdXNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApAQCAtMTA0LDEyICsxMDYsMTQgQEAKIAlsb2ZmX3QgcG9zID0gMDsKIAlzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKIAlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGZpbGUgfTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaWk7CisJaW92X2l0ZXJfaW5pdCgmaWksIFdSSVRFLCAmaW92LCAxLCBjb3VudCk7CiAKIAkvKgogCSAqIE5vIGxvY2tpbmcgb3IgZ2VuZXJpY193cml0ZV9jaGVja3MoKSwgdGhlIHNlcnZlciBpcwogCSAqIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIGFuZCBzYW5pdHkgY2hlY2tzLgogCSAqLwotCXJldHVybiBmdXNlX2RpcmVjdF9pbygmaW8sICZpb3YsIDEsIGNvdW50LCAmcG9zLAorCXJldHVybiBmdXNlX2RpcmVjdF9pbygmaW8sICZpaSwgJnBvcywKIAkJCSAgICAgIEZVU0VfRElPX1dSSVRFIHwgRlVTRV9ESU9fQ1VTRSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggOTAzY2JjOS4uNmUxNmRhZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTkzMyw4ICs5MzMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZ1c2VfZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgZnVzZV9maWxlX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwpAQCAtOTQ1LDE0ICs5NDQsMTQgQEAKIAkgKiBpX3NpemUgaXMgdXAgdG8gZGF0ZSkuCiAJICovCiAJaWYgKGZjLT5hdXRvX2ludmFsX2RhdGEgfHwKLQkgICAgKHBvcyArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSA+IGlfc2l6ZV9yZWFkKGlub2RlKSkpIHsKKwkgICAgKGlvY2ItPmtpX3BvcyArIGlvdl9pdGVyX2NvdW50KHRvKSA+IGlfc2l6ZV9yZWFkKGlub2RlKSkpIHsKIAkJaW50IGVycjsKIAkJZXJyID0gZnVzZV91cGRhdGVfYXR0cmlidXRlcyhpbm9kZSwgTlVMTCwgaW9jYi0+a2lfZmlscCwgTlVMTCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCXJldHVybiBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIH0KIAogc3RhdGljIHZvaWQgZnVzZV93cml0ZV9maWxsKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZnVzZV9maWxlICpmZiwKQEAgLTExODEsMTkgKzExODAsMTcgQEAKIAlyZXR1cm4gcmVzID4gMCA/IHJlcyA6IGVycjsKIH0KIAotc3RhdGljIHNzaXplX3QgZnVzZV9maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKLQlzaXplX3QgY291bnQgPSAwOwotCXNpemVfdCBvY291bnQgPSAwOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCXNzaXplX3Qgd3JpdHRlbiA9IDA7CiAJc3NpemVfdCB3cml0dGVuX2J1ZmZlcmVkID0gMDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzc2l6ZV90IGVycjsKLQlzdHJ1Y3QgaW92X2l0ZXIgaTsKIAlsb2ZmX3QgZW5kYnl0ZSA9IDA7CisJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvczsKIAogCWlmIChnZXRfZnVzZV9jb25uKGlub2RlKS0+d3JpdGViYWNrX2NhY2hlKSB7CiAJCS8qIFVwZGF0ZSBzaXplIChFT0Ygb3B0aW1pemF0aW9uKSBhbmQgbW9kZSAoU1VJRCBjbGVhcmluZykgKi8KQEAgLTEyMDEsMTcgKzExOTgsOSBAQAogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAotCQlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CisJCXJldHVybiBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlcihpb2NiLCBmcm9tKTsKIAl9CiAKLQlXQVJOX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwotCi0Jb2NvdW50ID0gMDsKLQllcnIgPSBnZW5lcmljX3NlZ21lbnRfY2hlY2tzKGlvdiwgJm5yX3NlZ3MsICZvY291bnQsIFZFUklGWV9SRUFEKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JY291bnQgPSBvY291bnQ7CiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJLyogV2UgY2FuIHdyaXRlIGJhY2sgdGhpcyBxdWV1ZSBpbiBwYWdlIHJlY2xhaW0gKi8KQEAgLTEyMjQsNiArMTIxMyw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCWdvdG8gb3V0OwogCisJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgY291bnQpOwogCWVyciA9IGZpbGVfcmVtb3ZlX3N1aWQoZmlsZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0xMjMzLDE2ICsxMjIzLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgewotCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3YsICZucl9zZWdzLCBwb3MsIAotCQkJCQkJICAgIGNvdW50LCBvY291bnQpOwotCQlpZiAod3JpdHRlbiA8IDAgfHwgd3JpdHRlbiA9PSBjb3VudCkKKwkJd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgZnJvbSwgcG9zKTsKKwkJaWYgKHdyaXR0ZW4gPCAwIHx8ICFpb3ZfaXRlcl9jb3VudChmcm9tKSkKIAkJCWdvdG8gb3V0OwogCiAJCXBvcyArPSB3cml0dGVuOwotCQljb3VudCAtPSB3cml0dGVuOwogCi0JCWlvdl9pdGVyX2luaXQoJmksIGlvdiwgbnJfc2VncywgY291bnQsIHdyaXR0ZW4pOwotCQl3cml0dGVuX2J1ZmZlcmVkID0gZnVzZV9wZXJmb3JtX3dyaXRlKGZpbGUsIG1hcHBpbmcsICZpLCBwb3MpOworCQl3cml0dGVuX2J1ZmZlcmVkID0gZnVzZV9wZXJmb3JtX3dyaXRlKGZpbGUsIG1hcHBpbmcsIGZyb20sIHBvcyk7CiAJCWlmICh3cml0dGVuX2J1ZmZlcmVkIDwgMCkgewogCQkJZXJyID0gd3JpdHRlbl9idWZmZXJlZDsKIAkJCWdvdG8gb3V0OwpAQCAtMTI2MSw4ICsxMjQ4LDcgQEAKIAkJd3JpdHRlbiArPSB3cml0dGVuX2J1ZmZlcmVkOwogCQlpb2NiLT5raV9wb3MgPSBwb3MgKyB3cml0dGVuX2J1ZmZlcmVkOwogCX0gZWxzZSB7Ci0JCWlvdl9pdGVyX2luaXQoJmksIGlvdiwgbnJfc2VncywgY291bnQsIDApOwotCQl3cml0dGVuID0gZnVzZV9wZXJmb3JtX3dyaXRlKGZpbGUsIG1hcHBpbmcsICZpLCBwb3MpOworCQl3cml0dGVuID0gZnVzZV9wZXJmb3JtX3dyaXRlKGZpbGUsIG1hcHBpbmcsIGZyb20sIHBvcyk7CiAJCWlmICh3cml0dGVuID49IDApCiAJCQlpb2NiLT5raV9wb3MgPSBwb3MgKyB3cml0dGVuOwogCX0KQEAgLTEzMDAsNyArMTI4Niw3IEBACiAJc2l6ZV90IG5ieXRlcyA9IDA7ICAvKiAjIGJ5dGVzIGFscmVhZHkgcGFja2VkIGluIHJlcSAqLwogCiAJLyogU3BlY2lhbCBjYXNlIGZvciBrZXJuZWwgSS9POiBjYW4gY29weSBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIgKi8KLQlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCWlmIChpaS0+dHlwZSAmIElURVJfS1ZFQykgewogCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9IGZ1c2VfZ2V0X3VzZXJfYWRkcihpaSk7CiAJCXNpemVfdCBmcmFnX3NpemUgPSBmdXNlX2dldF9mcmFnX3NpemUoaWksICpuYnl0ZXNwKTsKIApAQCAtMTMxNiwzNSArMTMwMiwyNiBAQAogCiAJd2hpbGUgKG5ieXRlcyA8ICpuYnl0ZXNwICYmIHJlcS0+bnVtX3BhZ2VzIDwgcmVxLT5tYXhfcGFnZXMpIHsKIAkJdW5zaWduZWQgbnBhZ2VzOwotCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9IGZ1c2VfZ2V0X3VzZXJfYWRkcihpaSk7Ci0JCXVuc2lnbmVkIG9mZnNldCA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7Ci0JCXNpemVfdCBmcmFnX3NpemUgPSBmdXNlX2dldF9mcmFnX3NpemUoaWksICpuYnl0ZXNwIC0gbmJ5dGVzKTsKLQkJaW50IHJldDsKLQorCQlzaXplX3Qgc3RhcnQ7CiAJCXVuc2lnbmVkIG4gPSByZXEtPm1heF9wYWdlcyAtIHJlcS0+bnVtX3BhZ2VzOwotCQlmcmFnX3NpemUgPSBtaW5fdChzaXplX3QsIGZyYWdfc2l6ZSwgbiA8PCBQQUdFX1NISUZUKTsKLQotCQlucGFnZXMgPSAoZnJhZ19zaXplICsgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQkJbnBhZ2VzID0gY2xhbXAobnBhZ2VzLCAxVSwgbik7Ci0KLQkJcmV0ID0gZ2V0X3VzZXJfcGFnZXNfZmFzdCh1c2VyX2FkZHIsIG5wYWdlcywgIXdyaXRlLAotCQkJCQkgICZyZXEtPnBhZ2VzW3JlcS0+bnVtX3BhZ2VzXSk7CisJCXNzaXplX3QgcmV0ID0gaW92X2l0ZXJfZ2V0X3BhZ2VzKGlpLAorCQkJCQkmcmVxLT5wYWdlc1tyZXEtPm51bV9wYWdlc10sCisJCQkJCW4gKiBQQUdFX1NJWkUsICZzdGFydCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlucGFnZXMgPSByZXQ7Ci0JCWZyYWdfc2l6ZSA9IG1pbl90KHNpemVfdCwgZnJhZ19zaXplLAotCQkJCSAgKG5wYWdlcyA8PCBQQUdFX1NISUZUKSAtIG9mZnNldCk7Ci0JCWlvdl9pdGVyX2FkdmFuY2UoaWksIGZyYWdfc2l6ZSk7CisJCWlvdl9pdGVyX2FkdmFuY2UoaWksIHJldCk7CisJCW5ieXRlcyArPSByZXQ7CiAKLQkJcmVxLT5wYWdlX2Rlc2NzW3JlcS0+bnVtX3BhZ2VzXS5vZmZzZXQgPSBvZmZzZXQ7CisJCXJldCArPSBzdGFydDsKKwkJbnBhZ2VzID0gKHJldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCisJCXJlcS0+cGFnZV9kZXNjc1tyZXEtPm51bV9wYWdlc10ub2Zmc2V0ID0gc3RhcnQ7CiAJCWZ1c2VfcGFnZV9kZXNjc19sZW5ndGhfaW5pdChyZXEsIHJlcS0+bnVtX3BhZ2VzLCBucGFnZXMpOwogCiAJCXJlcS0+bnVtX3BhZ2VzICs9IG5wYWdlczsKIAkJcmVxLT5wYWdlX2Rlc2NzW3JlcS0+bnVtX3BhZ2VzIC0gMV0ubGVuZ3RoIC09Ci0JCQkobnBhZ2VzIDw8IFBBR0VfU0hJRlQpIC0gb2Zmc2V0IC0gZnJhZ19zaXplOwotCi0JCW5ieXRlcyArPSBmcmFnX3NpemU7CisJCQkoUEFHRV9TSVpFIC0gcmV0KSAmIChQQUdFX1NJWkUgLSAxKTsKIAl9CiAKIAlpZiAod3JpdGUpCkBAIC0xMzU5LDI0ICsxMzM2LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGZ1c2VfaXRlcl9ucGFnZXMoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppaV9wKQogewotCXN0cnVjdCBpb3ZfaXRlciBpaSA9ICppaV9wOwotCWludCBucGFnZXMgPSAwOwotCi0Jd2hpbGUgKGlvdl9pdGVyX2NvdW50KCZpaSkgJiYgbnBhZ2VzIDwgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSkgewotCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9IGZ1c2VfZ2V0X3VzZXJfYWRkcigmaWkpOwotCQl1bnNpZ25lZCBvZmZzZXQgPSB1c2VyX2FkZHIgJiB+UEFHRV9NQVNLOwotCQlzaXplX3QgZnJhZ19zaXplID0gaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudCgmaWkpOwotCi0JCW5wYWdlcyArPSAoZnJhZ19zaXplICsgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGZyYWdfc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIG1pbihucGFnZXMsIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEpOworCXJldHVybiBpb3ZfaXRlcl9ucGFnZXMoaWlfcCwgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSk7CiB9CiAKLXNzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKLQkJICAgICAgIGludCBmbGFncykKK3NzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJICAgICAgIGxvZmZfdCAqcHBvcywgaW50IGZsYWdzKQogewogCWludCB3cml0ZSA9IGZsYWdzICYgRlVTRV9ESU9fV1JJVEU7CiAJaW50IGN1c2UgPSBmbGFncyAmIEZVU0VfRElPX0NVU0U7CkBAIC0xMzg2LDE4ICsxMzUwLDE2IEBACiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBmZi0+ZmM7CiAJc2l6ZV90IG5tYXggPSB3cml0ZSA/IGZjLT5tYXhfd3JpdGUgOiBmYy0+bWF4X3JlYWQ7CiAJbG9mZl90IHBvcyA9ICpwcG9zOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXBnb2ZmX3QgaWR4X2Zyb20gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlwZ29mZl90IGlkeF90byA9IChwb3MgKyBjb3VudCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc3NpemVfdCByZXMgPSAwOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCXN0cnVjdCBpb3ZfaXRlciBpaTsKLQotCWlvdl9pdGVyX2luaXQoJmlpLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCAwKTsKIAogCWlmIChpby0+YXN5bmMpCi0JCXJlcSA9IGZ1c2VfZ2V0X3JlcV9mb3JfYmFja2dyb3VuZChmYywgZnVzZV9pdGVyX25wYWdlcygmaWkpKTsKKwkJcmVxID0gZnVzZV9nZXRfcmVxX2Zvcl9iYWNrZ3JvdW5kKGZjLCBmdXNlX2l0ZXJfbnBhZ2VzKGl0ZXIpKTsKIAllbHNlCi0JCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYywgZnVzZV9pdGVyX25wYWdlcygmaWkpKTsKKwkJcmVxID0gZnVzZV9nZXRfcmVxKGZjLCBmdXNlX2l0ZXJfbnBhZ2VzKGl0ZXIpKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7CiAKQEAgLTE0MTMsNyArMTM3NSw3IEBACiAJCXNpemVfdCBucmVzOwogCQlmbF9vd25lcl90IG93bmVyID0gY3VycmVudC0+ZmlsZXM7CiAJCXNpemVfdCBuYnl0ZXMgPSBtaW4oY291bnQsIG5tYXgpOwotCQlpbnQgZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhyZXEsICZpaSwgJm5ieXRlcywgd3JpdGUpOworCQlpbnQgZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhyZXEsIGl0ZXIsICZuYnl0ZXMsIHdyaXRlKTsKIAkJaWYgKGVycikgewogCQkJcmVzID0gZXJyOwogCQkJYnJlYWs7CkBAIC0xNDQzLDkgKzE0MDUsOSBAQAogCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCWlmIChpby0+YXN5bmMpCiAJCQkJcmVxID0gZnVzZV9nZXRfcmVxX2Zvcl9iYWNrZ3JvdW5kKGZjLAotCQkJCQlmdXNlX2l0ZXJfbnBhZ2VzKCZpaSkpOworCQkJCQlmdXNlX2l0ZXJfbnBhZ2VzKGl0ZXIpKTsKIAkJCWVsc2UKLQkJCQlyZXEgPSBmdXNlX2dldF9yZXEoZmMsIGZ1c2VfaXRlcl9ucGFnZXMoJmlpKSk7CisJCQkJcmVxID0gZnVzZV9nZXRfcmVxKGZjLCBmdXNlX2l0ZXJfbnBhZ2VzKGl0ZXIpKTsKIAkJCWlmIChJU19FUlIocmVxKSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTQ2MCw5ICsxNDIyLDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGZ1c2VfZGlyZWN0X2lvKTsKIAogc3RhdGljIHNzaXplX3QgX19mdXNlX2RpcmVjdF9yZWFkKHN0cnVjdCBmdXNlX2lvX3ByaXYgKmlvLAotCQkJCSAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcywKLQkJCQkgIHNpemVfdCBjb3VudCkKKwkJCQkgIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCQkgIGxvZmZfdCAqcHBvcykKIHsKIAlzc2l6ZV90IHJlczsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvLT5maWxlOwpAQCAtMTQ3MSw3ICsxNDMyLDcgQEAKIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXMgPSBmdXNlX2RpcmVjdF9pbyhpbywgaW92LCBucl9zZWdzLCBjb3VudCwgcHBvcywgMCk7CisJcmVzID0gZnVzZV9kaXJlY3RfaW8oaW8sIGl0ZXIsIHBwb3MsIDApOwogCiAJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwogCkBAIC0xNDgzLDIyICsxNDQ0LDI2IEBACiB7CiAJc3RydWN0IGZ1c2VfaW9fcHJpdiBpbyA9IHsgLmFzeW5jID0gMCwgLmZpbGUgPSBmaWxlIH07CiAJc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYnVmLCAuaW92X2xlbiA9IGNvdW50IH07Ci0JcmV0dXJuIF9fZnVzZV9kaXJlY3RfcmVhZCgmaW8sICZpb3YsIDEsIHBwb3MsIGNvdW50KTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaWk7CisJaW92X2l0ZXJfaW5pdCgmaWksIFJFQUQsICZpb3YsIDEsIGNvdW50KTsKKwlyZXR1cm4gX19mdXNlX2RpcmVjdF9yZWFkKCZpbywgJmlpLCBwcG9zKTsKIH0KIAogc3RhdGljIHNzaXplX3QgX19mdXNlX2RpcmVjdF93cml0ZShzdHJ1Y3QgZnVzZV9pb19wcml2ICppbywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcykKKwkJCQkgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQkJICAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW8tPmZpbGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXNzaXplX3QgcmVzOwogCisKIAlyZXMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwcG9zLCAmY291bnQsIDApOwotCWlmICghcmVzKQotCQlyZXMgPSBmdXNlX2RpcmVjdF9pbyhpbywgaW92LCBucl9zZWdzLCBjb3VudCwgcHBvcywKLQkJCQkgICAgIEZVU0VfRElPX1dSSVRFKTsKKwlpZiAoIXJlcykgeworCQlpb3ZfaXRlcl90cnVuY2F0ZShpdGVyLCBjb3VudCk7CisJCXJlcyA9IGZ1c2VfZGlyZWN0X2lvKGlvLCBpdGVyLCBwcG9zLCBGVVNFX0RJT19XUklURSk7CisJfQogCiAJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwogCkBAIC0xNTEyLDEzICsxNDc3LDE1IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJc3NpemVfdCByZXM7CiAJc3RydWN0IGZ1c2VfaW9fcHJpdiBpbyA9IHsgLmFzeW5jID0gMCwgLmZpbGUgPSBmaWxlIH07CisJc3RydWN0IGlvdl9pdGVyIGlpOworCWlvdl9pdGVyX2luaXQoJmlpLCBXUklURSwgJmlvdiwgMSwgY291bnQpOwogCiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCXJldHVybiAtRUlPOwogCiAJLyogRG9uJ3QgYWxsb3cgcGFyYWxsZWwgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgKi8KIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmVzID0gX19mdXNlX2RpcmVjdF93cml0ZSgmaW8sICZpb3YsIDEsIHBwb3MpOworCXJlcyA9IF9fZnVzZV9kaXJlY3Rfd3JpdGUoJmlvLCAmaWksIHBwb3MpOwogCWlmIChyZXMgPiAwKQogCQlmdXNlX3dyaXRlX3VwZGF0ZV9zaXplKGlub2RlLCAqcHBvcyk7CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CkBAIC0yMzcyLDcgKzIzMzksNyBAQAogCWlmICghYnl0ZXMpCiAJCXJldHVybiAwOwogCi0JaW92X2l0ZXJfaW5pdCgmaWksIGlvdiwgbnJfc2VncywgYnl0ZXMsIDApOworCWlvdl9pdGVyX2luaXQoJmlpLCB0b191c2VyID8gUkVBRCA6IFdSSVRFLCBpb3YsIG5yX3NlZ3MsIGJ5dGVzKTsKIAogCXdoaWxlIChpb3ZfaXRlcl9jb3VudCgmaWkpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGFnZXNbcGFnZV9pZHgrK107CkBAIC0yODk0LDggKzI4NjEsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotZnVzZV9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorZnVzZV9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCWxvZmZfdCBvZmZzZXQpCiB7CiAJc3NpemVfdCByZXQgPSAwOwogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKQEAgLTI5MDQsNyArMjg3MSw3IEBACiAJbG9mZl90IHBvcyA9IDA7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlsb2ZmX3QgaV9zaXplOwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAlzdHJ1Y3QgZnVzZV9pb19wcml2ICppbzsKIAogCXBvcyA9IG9mZnNldDsKQEAgLTI5MTksNiArMjg4Niw3IEBACiAJCWlmIChvZmZzZXQgPj0gaV9zaXplKQogCQkJcmV0dXJuIDA7CiAJCWNvdW50ID0gbWluX3QobG9mZl90LCBjb3VudCwgZnVzZV9yb3VuZF91cChpX3NpemUgLSBvZmZzZXQpKTsKKwkJaW92X2l0ZXJfdHJ1bmNhdGUoaXRlciwgY291bnQpOwogCX0KIAogCWlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfaW9fcHJpdiksIEdGUF9LRVJORUwpOwpAQCAtMjk0OCw5ICsyOTE2LDkgQEAKIAkJaW8tPmFzeW5jID0gZmFsc2U7CiAKIAlpZiAocncgPT0gV1JJVEUpCi0JCXJldCA9IF9fZnVzZV9kaXJlY3Rfd3JpdGUoaW8sIGlvdiwgbnJfc2VncywgJnBvcyk7CisJCXJldCA9IF9fZnVzZV9kaXJlY3Rfd3JpdGUoaW8sIGl0ZXIsICZwb3MpOwogCWVsc2UKLQkJcmV0ID0gX19mdXNlX2RpcmVjdF9yZWFkKGlvLCBpb3YsIG5yX3NlZ3MsICZwb3MsIGNvdW50KTsKKwkJcmV0ID0gX19mdXNlX2RpcmVjdF9yZWFkKGlvLCBpdGVyLCAmcG9zKTsKIAogCWlmIChpby0+YXN5bmMpIHsKIAkJZnVzZV9haW9fY29tcGxldGUoaW8sIHJldCA8IDAgPyByZXQgOiAwLCAtMSk7CkBAIC0zMDYxLDEwICszMDI5LDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZnVzZV9maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZnVzZV9maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBmdXNlX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGZ1c2VfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZnVzZV9maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZnVzZV9maWxlX21tYXAsCiAJLm9wZW4JCT0gZnVzZV9vcGVuLAogCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggN2FhNWM3NS4uZThlNDdhNiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC04ODAsOSArODgwLDggQEAKIC8qKiBDVVNFIHBhc3MgZnVzZV9kaXJlY3RfaW8oKSBhIGZpbGUgd2hpY2ggZl9tYXBwaW5nLT5ob3N0IGlzIG5vdCBmcm9tIEZVU0UgKi8KICNkZWZpbmUgRlVTRV9ESU9fQ1VTRSAgKDEgPDwgMSkKIAotc3NpemVfdCBmdXNlX2RpcmVjdF9pbyhzdHJ1Y3QgZnVzZV9pb19wcml2ICppbywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zLAotCQkgICAgICAgaW50IGZsYWdzKTsKK3NzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJICAgICAgIGxvZmZfdCAqcHBvcywgaW50IGZsYWdzKTsKIGxvbmcgZnVzZV9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCiAJCSAgIHVuc2lnbmVkIGludCBmbGFncyk7CiBsb25nIGZ1c2VfaW9jdGxfY29tbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hb3BzLmMgYi9mcy9nZnMyL2FvcHMuYwppbmRleCA0OTIxMjNjLi44MDViMzdmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2FvcHMuYworKysgYi9mcy9nZnMyL2FvcHMuYwpAQCAtMTA0MCw4ICsxMDQwLDcgQEAKIAogCiBzdGF0aWMgc3NpemVfdCBnZnMyX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQkJICAgICAgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3Qgb2Zmc2V0KQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwpAQCAtMTA4MSw3ICsxMDgwLDcgQEAKIAkgKi8KIAlpZiAobWFwcGluZy0+bnJwYWdlcykgewogCQlsb2ZmX3QgbHN0YXJ0ID0gb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwotCQlsb2ZmX3QgbGVuID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCQlsb2ZmX3QgbGVuID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJCWxvZmZfdCBlbmQgPSBQQUdFX0FMSUdOKG9mZnNldCArIGxlbikgLSAxOwogCiAJCXJ2ID0gMDsKQEAgLTEwOTYsOSArMTA5NSw5IEBACiAJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBsc3RhcnQsIGVuZCk7CiAJfQogCi0JcnYgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgIG9mZnNldCwgbnJfc2VncywgZ2ZzMl9nZXRfYmxvY2tfZGlyZWN0LAotCQkJCSAgTlVMTCwgTlVMTCwgMCk7CisJcnYgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsCisJCQkJICBpdGVyLCBvZmZzZXQsCisJCQkJICBnZnMyX2dldF9ibG9ja19kaXJlY3QsIE5VTEwsIE5VTEwsIDApOwogb3V0OgogCWdmczJfZ2xvY2tfZHEoJmdoKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoJmdoKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggNmFiMGNmYi4uNGZjM2EzMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTY4NCw3ICs2ODQsNyBAQAogfQogCiAvKioKLSAqIGdmczJfZmlsZV9haW9fd3JpdGUgLSBQZXJmb3JtIGEgd3JpdGUgdG8gYSBmaWxlCisgKiBnZnMyX2ZpbGVfd3JpdGVfaXRlciAtIFBlcmZvcm0gYSB3cml0ZSB0byBhIGZpbGUKICAqIEBpb2NiOiBUaGUgaW8gY29udGV4dAogICogQGlvdjogVGhlIGRhdGEgdG8gd3JpdGUKICAqIEBucl9zZWdzOiBOdW1iZXIgb2YgQGlvdiBzZWdtZW50cwpAQCAtNjk3LDExICs2OTcsOSBAQAogICoKICAqLwogCi1zdGF0aWMgc3NpemVfdCBnZnMyX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgZ2ZzMl9maWxlX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCXNpemVfdCB3cml0ZXNpemUgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGZpbGVfaW5vZGUoZmlsZSkpOwogCWludCByZXQ7CiAKQEAgLTcwOSw3ICs3MDcsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlnZnMyX3NpemVfaGludChmaWxlLCBwb3MsIHdyaXRlc2l6ZSk7CisJZ2ZzMl9zaXplX2hpbnQoZmlsZSwgaW9jYi0+a2lfcG9zLCBpb3ZfaXRlcl9jb3VudChmcm9tKSk7CiAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CiAJCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKQEAgLTcyMCw3ICs3MTgsNyBAQAogCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwogCX0KIAotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoaW9jYiwgZnJvbSk7CiB9CiAKIHN0YXRpYyBpbnQgZmFsbG9jYXRlX2NodW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4sCkBAIC0xMDU4LDEwICsxMDU2LDEwIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBnZnMyX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBnZnMyX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZ2ZzMl9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsCT0gZ2ZzMl9pb2N0bCwKIAkubW1hcAkJPSBnZnMyX21tYXAsCiAJLm9wZW4JCT0gZ2ZzMl9vcGVuLApAQCAtMTA3MCw3ICsxMDY4LDcgQEAKIAkubG9jawkJPSBnZnMyX2xvY2ssCiAJLmZsb2NrCQk9IGdmczJfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAorCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5zZXRsZWFzZQk9IGdmczJfc2V0bGVhc2UsCiAJLmZhbGxvY2F0ZQk9IGdmczJfZmFsbG9jYXRlLAogfTsKQEAgLTEwOTAsMTcgKzEwODgsMTcgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZnMyX2ZpbGVfZm9wc19ub2xvY2sgPSB7CiAJLmxsc2VlawkJPSBnZnMyX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBnZnMyX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZ2ZzMl9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsCT0gZ2ZzMl9pb2N0bCwKIAkubW1hcAkJPSBnZnMyX21tYXAsCiAJLm9wZW4JCT0gZ2ZzMl9vcGVuLAogCS5yZWxlYXNlCT0gZ2ZzMl9yZWxlYXNlLAogCS5mc3luYwkJPSBnZnMyX2ZzeW5jLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuc2V0bGVhc2UJPSBnZW5lcmljX3NldGxlYXNlLAogCS5mYWxsb2NhdGUJPSBnZnMyX2ZhbGxvY2F0ZSwKIH07CmRpZmYgLS1naXQgYS9mcy9oZnMvaW5vZGUuYyBiL2ZzL2hmcy9pbm9kZS5jCmluZGV4IDllMmZlY2QuLmQwOTI5YmMgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9pbm9kZS5jCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0xMjUsMTUgKzEyNSwxNSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBoZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpLT5pX21hcHBpbmctPmhvc3Q7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKLQkJCQkgaGZzX2dldF9ibG9jayk7CisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaXRlciwgb2Zmc2V0LCBoZnNfZ2V0X2Jsb2NrKTsKIAogCS8qCiAJICogSW4gY2FzZSBvZiBlcnJvciBleHRlbmRpbmcgd3JpdGUgbWF5IGhhdmUgaW5zdGFudGlhdGVkIGEgZmV3CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHJldCA8IDApKSB7CiAJCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQkJbG9mZl90IGVuZCA9IG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwkJbG9mZl90IGVuZCA9IG9mZnNldCArIGNvdW50OwogCiAJCWlmIChlbmQgPiBpc2l6ZSkKIAkJCWhmc193cml0ZV9mYWlsZWQobWFwcGluZywgZW5kKTsKQEAgLTY3NCwxMCArNjc0LDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLmZzeW5jCQk9IGhmc19maWxlX2ZzeW5jLApkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9pbm9kZS5jIGIvZnMvaGZzcGx1cy9pbm9kZS5jCmluZGV4IGE0ZjQ1YmQuLjBjZjc4NmYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaW5vZGUuYworKysgYi9mcy9oZnNwbHVzL2lub2RlLmMKQEAgLTEyMywxNCArMTIzLDE1IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGhmc3BsdXNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpLT5pX21hcHBpbmctPmhvc3Q7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsIAogCQkJCSBoZnNwbHVzX2dldF9ibG9jayk7CiAKIAkvKgpAQCAtMTM5LDcgKzE0MCw3IEBACiAJICovCiAJaWYgKHVubGlrZWx5KChydyAmIFdSSVRFKSAmJiByZXQgPCAwKSkgewogCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKIAogCQlpZiAoZW5kID4gaXNpemUpCiAJCQloZnNwbHVzX3dyaXRlX2ZhaWxlZChtYXBwaW5nLCBlbmQpOwpAQCAtMzQwLDEwICszNDEsMTAgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzcGx1c19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLmZzeW5jCQk9IGhmc3BsdXNfZmlsZV9mc3luYywKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggOWM0NzBmZC4uYmI1MjlmMyAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTM3OCwxMSArMzc4LDExIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvc3Rmc19maWxlX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLm9wZW4JCT0gaG9zdGZzX2ZpbGVfb3BlbiwKIAkucmVsZWFzZQk9IGhvc3Rmc19maWxlX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9mcy9ocGZzL2ZpbGUuYyBiL2ZzL2hwZnMvZmlsZS5jCmluZGV4IDY3YzFhNjEuLjdmNTRlNWYgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvZmlsZS5jCisrKyBiL2ZzL2hwZnMvZmlsZS5jCkBAIC0xOTcsMTAgKzE5NywxMCBAQAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfb3BzID0KIHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZAkJPSBuZXdfc3luY19yZWFkLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5yZWxlYXNlCT0gaHBmc19maWxlX3JlbGVhc2UsCiAJLmZzeW5jCQk9IGhwZnNfZmlsZV9mc3luYywKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZpbGUuYyBiL2ZzL2pmZnMyL2ZpbGUuYwppbmRleCAyNTZjZDE5Li42NDk4OWNhOSAxMDA2NDQKLS0tIGEvZnMvamZmczIvZmlsZS5jCisrKyBiL2ZzL2pmZnMyL2ZpbGUuYwpAQCAtNTEsMTAgKzUxLDEwIEBACiB7CiAJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLm9wZW4gPQkJZ2VuZXJpY19maWxlX29wZW4sCi0gCS5yZWFkID0JCWRvX3N5bmNfcmVhZCwKLSAJLmFpb19yZWFkID0JZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotIAkud3JpdGUgPQlkb19zeW5jX3dyaXRlLAotIAkuYWlvX3dyaXRlID0JZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKyAJLnJlYWQgPQkJbmV3X3N5bmNfcmVhZCwKKyAJLnJlYWRfaXRlciA9CWdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisgCS53cml0ZSA9CW5ld19zeW5jX3dyaXRlLAorIAkud3JpdGVfaXRlciA9CWdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bD1qZmZzMl9pb2N0bCwKIAkubW1hcCA9CQlnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuZnN5bmMgPQlqZmZzMl9mc3luYywKZGlmZiAtLWdpdCBhL2ZzL2pmcy9maWxlLmMgYi9mcy9qZnMvZmlsZS5jCmluZGV4IDc5NGRhOTQuLjMzYWEwY2MgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9maWxlLmMKKysrIGIvZnMvamZzL2ZpbGUuYwpAQCAtMTUxLDEzICsxNTEsMTMgQEAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBqZnNfb3BlbiwKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZnN5bmMJCT0gamZzX2ZzeW5jLAogCS5yZWxlYXNlCT0gamZzX3JlbGVhc2UsCiAJLnVubG9ja2VkX2lvY3RsID0gamZzX2lvY3RsLApkaWZmIC0tZ2l0IGEvZnMvamZzL2lub2RlLmMgYi9mcy9qZnMvaW5vZGUuYwppbmRleCA2ZjhmZTcyLi5iZDNkZjFjIDEwMDY0NAotLS0gYS9mcy9qZnMvaW5vZGUuYworKysgYi9mcy9qZnMvaW5vZGUuYwpAQCAtMzMxLDE1ICszMzEsMTUgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgamZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCXN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IG9mZnNldCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAlzc2l6ZV90IHJldDsKIAotCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LCBucl9zZWdzLAotCQkJCSBqZnNfZ2V0X2Jsb2NrKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsIGpmc19nZXRfYmxvY2spOwogCiAJLyoKIAkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKQEAgLTM0Nyw3ICszNDcsNyBAQAogCSAqLwogCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKIAkJbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgY291bnQ7CiAKIAkJaWYgKGVuZCA+IGlzaXplKQogCQkJamZzX3dyaXRlX2ZhaWxlZChtYXBwaW5nLCBlbmQpOwpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvZmlsZS5jIGIvZnMvbG9nZnMvZmlsZS5jCmluZGV4IDU3OTE0ZmMuLjg1Mzg3NTIgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2ZpbGUuYworKysgYi9mcy9sb2dmcy9maWxlLmMKQEAgLTI2NCwxNSArMjY0LDE1IEBACiB9OwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxvZ2ZzX3JlZ19mb3BzID0gewotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5mc3luYwkJPSBsb2dmc19mc3luYywKIAkudW5sb2NrZWRfaW9jdGwJPSBsb2dmc19pb2N0bCwKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogfTsKIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsb2dmc19yZWdfYW9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2ZpbGUuYyBiL2ZzL21pbml4L2ZpbGUuYwppbmRleCBhZGM2ZjU0Li5hOTY3ZGUwIDEwMDY0NAotLS0gYS9mcy9taW5peC9maWxlLmMKKysrIGIvZnMvbWluaXgvZmlsZS5jCkBAIC0xNCwxMCArMTQsMTAgQEAKICAqLwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaW5peF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuZnN5bmMJCT0gZ2VuZXJpY19maWxlX2ZzeW5jLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXJlY3QuYyBiL2ZzL25mcy9kaXJlY3QuYwppbmRleCA0YWQ3YmMzLi44Zjk4MTM4IDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyZWN0LmMKKysrIGIvZnMvbmZzL2RpcmVjdC5jCkBAIC0yMTIsMjAgKzIxMiwyMCBAQAogICogc2h1bnQgb2ZmIGRpcmVjdCByZWFkIGFuZCB3cml0ZSByZXF1ZXN0cyBiZWZvcmUgdGhlIFZGUyBnZXRzIHRoZW0sCiAgKiBzbyB0aGlzIG1ldGhvZCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGZvciBzd2FwLgogICovCi1zc2l6ZV90IG5mc19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCitzc2l6ZV90IG5mc19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IHBvcykKIHsKICNpZm5kZWYgQ09ORklHX05GU19TV0FQCiAJZHByaW50aygiTkZTOiBuZnNfZGlyZWN0X0lPICglcEQpIG9mZi9ubyglTGQvJWx1KSBFSU5WQUxcbiIsCi0JCQlpb2NiLT5raV9maWxwLCAobG9uZyBsb25nKSBwb3MsIG5yX3NlZ3MpOworCQkJaW9jYi0+a2lfZmlscCwgKGxvbmcgbG9uZykgcG9zLCBpdGVyLT5ucl9zZWdzKTsKIAogCXJldHVybiAtRUlOVkFMOwogI2Vsc2UKIAlWTV9CVUdfT04oaW9jYi0+a2lfbmJ5dGVzICE9IFBBR0VfU0laRSk7CiAKIAlpZiAocncgPT0gUkVBRCB8fCBydyA9PSBLRVJORUxfUkVBRCkKLQkJcmV0dXJuIG5mc19maWxlX2RpcmVjdF9yZWFkKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zLAorCQlyZXR1cm4gbmZzX2ZpbGVfZGlyZWN0X3JlYWQoaW9jYiwgaXRlciwgcG9zLAogCQkJCXJ3ID09IFJFQUQgPyB0cnVlIDogZmFsc2UpOwotCXJldHVybiBuZnNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MsCisJcmV0dXJuIG5mc19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpdGVyLCBwb3MsCiAJCQkJcncgPT0gV1JJVEUgPyB0cnVlIDogZmFsc2UpOwogI2VuZGlmIC8qIENPTkZJR19ORlNfU1dBUCAqLwogfQpAQCAtNDE0LDYwICs0MTQsMzcgQEAKICAqIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSBuZnNfZGlyZWN0X3JlYWRfcmVzdWx0KCkuICBPdGhlcndpc2UsIGlmCiAgKiBubyByZXF1ZXN0cyBoYXZlIGJlZW4gc2VudCwganVzdCByZXR1cm4gYW4gZXJyb3IuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IG5mc19kaXJlY3RfcmVhZF9zY2hlZHVsZV9zZWdtZW50KHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IgKmRlc2MsCi0JCQkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkJCWxvZmZfdCBwb3MsIGJvb2wgdWlvKQorCitzdGF0aWMgc3NpemVfdCBuZnNfZGlyZWN0X3JlYWRfc2NoZWR1bGVfaW92ZWMoc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxLAorCQkJCQkgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQkJCSAgICAgIGxvZmZfdCBwb3MpCiB7Ci0Jc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxID0gZGVzYy0+cGdfZHJlcTsKLQlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gZHJlcS0+Y3R4OwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBjdHgtPmRlbnRyeS0+ZF9pbm9kZTsKLQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2U7Ci0Jc2l6ZV90IGNvdW50ID0gaW92LT5pb3ZfbGVuOwotCXNpemVfdCByc2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT5yc2l6ZTsKLQl1bnNpZ25lZCBpbnQgcGdiYXNlOwotCWludCByZXN1bHQ7Ci0Jc3NpemVfdCBzdGFydGVkID0gMDsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2V2ZWMgPSBOVUxMOwotCXVuc2lnbmVkIGludCBucGFnZXM7CisJc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciBkZXNjOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkcmVxLT5pbm9kZTsKKwlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7CisJc2l6ZV90IHJlcXVlc3RlZF9ieXRlcyA9IDA7CisJc2l6ZV90IHJzaXplID0gbWF4X3Qoc2l6ZV90LCBORlNfU0VSVkVSKGlub2RlKS0+cnNpemUsIFBBR0VfU0laRSk7CiAKLQlkbyB7CisJbmZzX3BhZ2Vpb19pbml0X3JlYWQoJmRlc2MsIGRyZXEtPmlub2RlLCBmYWxzZSwKKwkJCSAgICAgJm5mc19kaXJlY3RfcmVhZF9jb21wbGV0aW9uX29wcyk7CisJZ2V0X2RyZXEoZHJlcSk7CisJZGVzYy5wZ19kcmVxID0gZHJlcTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9kaW9fY291bnQpOworCisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGl0ZXIpKSB7CisJCXN0cnVjdCBwYWdlICoqcGFnZXZlYzsKIAkJc2l6ZV90IGJ5dGVzOwotCQlpbnQgaTsKKwkJc2l6ZV90IHBnYmFzZTsKKwkJdW5zaWduZWQgbnBhZ2VzLCBpOwogCi0JCXBnYmFzZSA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7Ci0JCWJ5dGVzID0gbWluKG1heF90KHNpemVfdCwgcnNpemUsIFBBR0VfU0laRSksIGNvdW50KTsKLQotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlucGFnZXMgPSBuZnNfcGFnZV9hcnJheV9sZW4ocGdiYXNlLCBieXRlcyk7Ci0JCWlmICghcGFnZXZlYykKLQkJCXBhZ2V2ZWMgPSBrbWFsbG9jKG5wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKLQkJCQkJICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWdldmVjKQorCQlyZXN1bHQgPSBpb3ZfaXRlcl9nZXRfcGFnZXNfYWxsb2MoaXRlciwgJnBhZ2V2ZWMsIAorCQkJCQkJICByc2l6ZSwgJnBnYmFzZSk7CisJCWlmIChyZXN1bHQgPCAwKQogCQkJYnJlYWs7Ci0JCWlmICh1aW8pIHsKLQkJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJCXJlc3VsdCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1c2VyX2FkZHIsCi0JCQkJCW5wYWdlcywgMSwgMCwgcGFnZXZlYywgTlVMTCk7Ci0JCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQkJaWYgKHJlc3VsdCA8IDApCi0JCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlXQVJOX09OKG5wYWdlcyAhPSAxKTsKLQkJCXJlc3VsdCA9IGdldF9rZXJuZWxfcGFnZSh1c2VyX2FkZHIsIDEsIHBhZ2V2ZWMpOwotCQkJaWYgKFdBUk5fT04ocmVzdWx0ICE9IDEpKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCh1bnNpZ25lZClyZXN1bHQgPCBucGFnZXMpIHsKLQkJCWJ5dGVzID0gcmVzdWx0ICogUEFHRV9TSVpFOwotCQkJaWYgKGJ5dGVzIDw9IHBnYmFzZSkgewotCQkJCW5mc19kaXJlY3RfcmVsZWFzZV9wYWdlcyhwYWdldmVjLCByZXN1bHQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnl0ZXMgLT0gcGdiYXNlOwotCQkJbnBhZ2VzID0gcmVzdWx0OwotCQl9Ci0KKwkKKwkJYnl0ZXMgPSByZXN1bHQ7CisJCWlvdl9pdGVyX2FkdmFuY2UoaXRlciwgYnl0ZXMpOworCQlucGFnZXMgPSAocmVzdWx0ICsgcGdiYXNlICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogCQkJc3RydWN0IG5mc19wYWdlICpyZXE7CiAJCQl1bnNpZ25lZCBpbnQgcmVxX2xlbiA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIFBBR0VfU0laRSAtIHBnYmFzZSk7CkBAIC00ODAsNTYgKzQ1NywyMSBAQAogCQkJfQogCQkJcmVxLT53Yl9pbmRleCA9IHBvcyA+PiBQQUdFX1NISUZUOwogCQkJcmVxLT53Yl9vZmZzZXQgPSBwb3MgJiB+UEFHRV9NQVNLOwotCQkJaWYgKCFuZnNfcGFnZWlvX2FkZF9yZXF1ZXN0KGRlc2MsIHJlcSkpIHsKLQkJCQlyZXN1bHQgPSBkZXNjLT5wZ19lcnJvcjsKKwkJCWlmICghbmZzX3BhZ2Vpb19hZGRfcmVxdWVzdCgmZGVzYywgcmVxKSkgeworCQkJCXJlc3VsdCA9IGRlc2MucGdfZXJyb3I7CiAJCQkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJcGdiYXNlID0gMDsKIAkJCWJ5dGVzIC09IHJlcV9sZW47Ci0JCQlzdGFydGVkICs9IHJlcV9sZW47Ci0JCQl1c2VyX2FkZHIgKz0gcmVxX2xlbjsKKwkJCXJlcXVlc3RlZF9ieXRlcyArPSByZXFfbGVuOwogCQkJcG9zICs9IHJlcV9sZW47Ci0JCQljb3VudCAtPSByZXFfbGVuOwogCQkJZHJlcS0+Ynl0ZXNfbGVmdCAtPSByZXFfbGVuOwogCQl9Ci0JCS8qIFRoZSBuZnNfcGFnZSBub3cgaG9sZCByZWZlcmVuY2VzIHRvIHRoZXNlIHBhZ2VzICovCiAJCW5mc19kaXJlY3RfcmVsZWFzZV9wYWdlcyhwYWdldmVjLCBucGFnZXMpOwotCX0gd2hpbGUgKGNvdW50ICE9IDAgJiYgcmVzdWx0ID49IDApOwotCi0Ja2ZyZWUocGFnZXZlYyk7Ci0KLQlpZiAoc3RhcnRlZCkKLQkJcmV0dXJuIHN0YXJ0ZWQ7Ci0JcmV0dXJuIHJlc3VsdCA8IDAgPyAoc3NpemVfdCkgcmVzdWx0IDogLUVGQVVMVDsKLX0KLQotc3RhdGljIHNzaXplX3QgbmZzX2RpcmVjdF9yZWFkX3NjaGVkdWxlX2lvdmVjKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcSwKLQkJCQkJICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKLQkJCQkJICAgICAgbG9mZl90IHBvcywgYm9vbCB1aW8pCi17Ci0Jc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciBkZXNjOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkcmVxLT5pbm9kZTsKLQlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7Ci0Jc2l6ZV90IHJlcXVlc3RlZF9ieXRlcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzZWc7Ci0KLQluZnNfcGFnZWlvX2luaXRfcmVhZCgmZGVzYywgZHJlcS0+aW5vZGUsIGZhbHNlLAotCQkJICAgICAmbmZzX2RpcmVjdF9yZWFkX2NvbXBsZXRpb25fb3BzKTsKLQlnZXRfZHJlcShkcmVxKTsKLQlkZXNjLnBnX2RyZXEgPSBkcmVxOwotCWF0b21pY19pbmMoJmlub2RlLT5pX2Rpb19jb3VudCk7Ci0KLQlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7Ci0JCWNvbnN0IHN0cnVjdCBpb3ZlYyAqdmVjID0gJmlvdltzZWddOwotCQlyZXN1bHQgPSBuZnNfZGlyZWN0X3JlYWRfc2NoZWR1bGVfc2VnbWVudCgmZGVzYywgdmVjLCBwb3MsIHVpbyk7CisJCWt2ZnJlZShwYWdldmVjKTsKIAkJaWYgKHJlc3VsdCA8IDApCiAJCQlicmVhazsKLQkJcmVxdWVzdGVkX2J5dGVzICs9IHJlc3VsdDsKLQkJaWYgKChzaXplX3QpcmVzdWx0IDwgdmVjLT5pb3ZfbGVuKQotCQkJYnJlYWs7Ci0JCXBvcyArPSB2ZWMtPmlvdl9sZW47CiAJfQogCiAJbmZzX3BhZ2Vpb19jb21wbGV0ZSgmZGVzYyk7CkBAIC01NTIsOCArNDk0LDcgQEAKIC8qKgogICogbmZzX2ZpbGVfZGlyZWN0X3JlYWQgLSBmaWxlIGRpcmVjdCByZWFkIG9wZXJhdGlvbiBmb3IgTkZTIGZpbGVzCiAgKiBAaW9jYjogdGFyZ2V0IEkvTyBjb250cm9sIGJsb2NrCi0gKiBAaW92OiB2ZWN0b3Igb2YgdXNlciBidWZmZXJzIGludG8gd2hpY2ggdG8gcmVhZCBkYXRhCi0gKiBAbnJfc2Vnczogc2l6ZSBvZiBpb3YgdmVjdG9yCisgKiBAaXRlcjogdmVjdG9yIG9mIHVzZXIgYnVmZmVycyBpbnRvIHdoaWNoIHRvIHJlYWQgZGF0YQogICogQHBvczogYnl0ZSBvZmZzZXQgaW4gZmlsZSB3aGVyZSByZWFkaW5nIHN0YXJ0cwogICoKICAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBkaXJlY3QgcmVhZHMgaW5zdGVhZCBvZiBjYWxsaW5nCkBAIC01NzAsOCArNTExLDggQEAKICAqIGNsaWVudCBtdXN0IHJlYWQgdGhlIHVwZGF0ZWQgYXRpbWUgZnJvbSB0aGUgc2VydmVyIGJhY2sgaW50byBpdHMKICAqIGNhY2hlLgogICovCi1zc2l6ZV90IG5mc19maWxlX2RpcmVjdF9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zLCBib29sIHVpbykKK3NzaXplX3QgbmZzX2ZpbGVfZGlyZWN0X3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQkJbG9mZl90IHBvcywgYm9vbCB1aW8pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwpAQCAtNTc5LDkgKzUyMCw3IEBACiAJc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxOwogCXN0cnVjdCBuZnNfbG9ja19jb250ZXh0ICpsX2N0eDsKIAlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7Ci0Jc2l6ZV90IGNvdW50OwotCi0JY291bnQgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJbmZzX2FkZF9zdGF0cyhtYXBwaW5nLT5ob3N0LCBORlNJT1NfRElSRUNUUkVBREJZVEVTLCBjb3VudCk7CiAKIAlkZnByaW50ayhGSUxFLCAiTkZTOiBkaXJlY3QgcmVhZCglcEQyLCAlemRAJUxkKVxuIiwKQEAgLTYwNCw3ICs1NDMsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlkcmVxLT5pbm9kZSA9IGlub2RlOwotCWRyZXEtPmJ5dGVzX2xlZnQgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJZHJlcS0+Ynl0ZXNfbGVmdCA9IGNvdW50OwogCWRyZXEtPmN0eCA9IGdldF9uZnNfb3Blbl9jb250ZXh0KG5mc19maWxlX29wZW5fY29udGV4dChpb2NiLT5raV9maWxwKSk7CiAJbF9jdHggPSBuZnNfZ2V0X2xvY2tfY29udGV4dChkcmVxLT5jdHgpOwogCWlmIChJU19FUlIobF9jdHgpKSB7CkBAIC02MTUsOCArNTU0LDggQEAKIAlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCiAJCWRyZXEtPmlvY2IgPSBpb2NiOwogCi0JTkZTX0koaW5vZGUpLT5yZWFkX2lvICs9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKLQlyZXN1bHQgPSBuZnNfZGlyZWN0X3JlYWRfc2NoZWR1bGVfaW92ZWMoZHJlcSwgaW92LCBucl9zZWdzLCBwb3MsIHVpbyk7CisJTkZTX0koaW5vZGUpLT5yZWFkX2lvICs9IGNvdW50OworCXJlc3VsdCA9IG5mc19kaXJlY3RfcmVhZF9zY2hlZHVsZV9pb3ZlYyhkcmVxLCBpdGVyLCBwb3MpOwogCiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKQEAgLTc3MiwxMDggKzcxMSw2IEBACiB9CiAjZW5kaWYKIAotLyoKLSAqIE5COiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlcnJvciByZXR1cm4gY29kZS4gIFN1YnNlcXVlbnQKLSAqICAgICBlcnJvcnMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBhcmUgaWdub3JlZC4KLSAqLwotLyoKLSAqIEZvciBlYWNoIHdzaXplJ2QgY2h1bmsgb2YgdGhlIHVzZXIncyBidWZmZXIsIGRpc3BhdGNoIGFuIE5GUyBXUklURQotICogb3BlcmF0aW9uLiAgSWYgbmZzX3dyaXRlZGF0YV9hbGxvYygpIG9yIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMsCi0gKiBiYWlsIGFuZCBzdG9wIHNlbmRpbmcgbW9yZSB3cml0ZXMuICBXcml0ZSBsZW5ndGggYWNjb3VudGluZyBpcwotICogaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IG5mc19kaXJlY3Rfd3JpdGVfcmVzdWx0KCkuICBPdGhlcndpc2UsIGlmCi0gKiBubyByZXF1ZXN0cyBoYXZlIGJlZW4gc2VudCwganVzdCByZXR1cm4gYW4gZXJyb3IuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IG5mc19kaXJlY3Rfd3JpdGVfc2NoZWR1bGVfc2VnbWVudChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICpkZXNjLAotCQkJCQkJIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCQkJIGxvZmZfdCBwb3MsIGJvb2wgdWlvKQotewotCXN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcSA9IGRlc2MtPnBnX2RyZXE7Ci0Jc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IGRyZXEtPmN0eDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5kZW50cnktPmRfaW5vZGU7Ci0JdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3YtPmlvdl9iYXNlOwotCXNpemVfdCBjb3VudCA9IGlvdi0+aW92X2xlbjsKLQlzaXplX3Qgd3NpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+d3NpemU7Ci0JdW5zaWduZWQgaW50IHBnYmFzZTsKLQlpbnQgcmVzdWx0OwotCXNzaXplX3Qgc3RhcnRlZCA9IDA7Ci0Jc3RydWN0IHBhZ2UgKipwYWdldmVjID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbnBhZ2VzOwotCi0JZG8gewotCQlzaXplX3QgYnl0ZXM7Ci0JCWludCBpOwotCi0JCXBnYmFzZSA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7Ci0JCWJ5dGVzID0gbWluKG1heF90KHNpemVfdCwgd3NpemUsIFBBR0VfU0laRSksIGNvdW50KTsKLQotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlucGFnZXMgPSBuZnNfcGFnZV9hcnJheV9sZW4ocGdiYXNlLCBieXRlcyk7Ci0JCWlmICghcGFnZXZlYykKLQkJCXBhZ2V2ZWMgPSBrbWFsbG9jKG5wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFnZXZlYykKLQkJCWJyZWFrOwotCi0JCWlmICh1aW8pIHsKLQkJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJCXJlc3VsdCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1c2VyX2FkZHIsCi0JCQkJCQlucGFnZXMsIDAsIDAsIHBhZ2V2ZWMsIE5VTEwpOwotCQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJCWlmIChyZXN1bHQgPCAwKQotCQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJV0FSTl9PTihucGFnZXMgIT0gMSk7Ci0JCQlyZXN1bHQgPSBnZXRfa2VybmVsX3BhZ2UodXNlcl9hZGRyLCAwLCBwYWdldmVjKTsKLQkJCWlmIChXQVJOX09OKHJlc3VsdCAhPSAxKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICgodW5zaWduZWQpcmVzdWx0IDwgbnBhZ2VzKSB7Ci0JCQlieXRlcyA9IHJlc3VsdCAqIFBBR0VfU0laRTsKLQkJCWlmIChieXRlcyA8PSBwZ2Jhc2UpIHsKLQkJCQluZnNfZGlyZWN0X3JlbGVhc2VfcGFnZXMocGFnZXZlYywgcmVzdWx0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ5dGVzIC09IHBnYmFzZTsKLQkJCW5wYWdlcyA9IHJlc3VsdDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewotCQkJc3RydWN0IG5mc19wYWdlICpyZXE7Ci0JCQl1bnNpZ25lZCBpbnQgcmVxX2xlbiA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIFBBR0VfU0laRSAtIHBnYmFzZSk7Ci0KLQkJCXJlcSA9IG5mc19jcmVhdGVfcmVxdWVzdChkcmVxLT5jdHgsIHBhZ2V2ZWNbaV0sIE5VTEwsCi0JCQkJCQkgcGdiYXNlLCByZXFfbGVuKTsKLQkJCWlmIChJU19FUlIocmVxKSkgewotCQkJCXJlc3VsdCA9IFBUUl9FUlIocmVxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW5mc19sb2NrX3JlcXVlc3QocmVxKTsKLQkJCXJlcS0+d2JfaW5kZXggPSBwb3MgPj4gUEFHRV9TSElGVDsKLQkJCXJlcS0+d2Jfb2Zmc2V0ID0gcG9zICYgflBBR0VfTUFTSzsKLQkJCWlmICghbmZzX3BhZ2Vpb19hZGRfcmVxdWVzdChkZXNjLCByZXEpKSB7Ci0JCQkJcmVzdWx0ID0gZGVzYy0+cGdfZXJyb3I7Ci0JCQkJbmZzX3VubG9ja19hbmRfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwZ2Jhc2UgPSAwOwotCQkJYnl0ZXMgLT0gcmVxX2xlbjsKLQkJCXN0YXJ0ZWQgKz0gcmVxX2xlbjsKLQkJCXVzZXJfYWRkciArPSByZXFfbGVuOwotCQkJcG9zICs9IHJlcV9sZW47Ci0JCQljb3VudCAtPSByZXFfbGVuOwotCQkJZHJlcS0+Ynl0ZXNfbGVmdCAtPSByZXFfbGVuOwotCQl9Ci0JCS8qIFRoZSBuZnNfcGFnZSBub3cgaG9sZCByZWZlcmVuY2VzIHRvIHRoZXNlIHBhZ2VzICovCi0JCW5mc19kaXJlY3RfcmVsZWFzZV9wYWdlcyhwYWdldmVjLCBucGFnZXMpOwotCX0gd2hpbGUgKGNvdW50ICE9IDAgJiYgcmVzdWx0ID49IDApOwotCi0Ja2ZyZWUocGFnZXZlYyk7Ci0KLQlpZiAoc3RhcnRlZCkKLQkJcmV0dXJuIHN0YXJ0ZWQ7Ci0JcmV0dXJuIHJlc3VsdCA8IDAgPyAoc3NpemVfdCkgcmVzdWx0IDogLUVGQVVMVDsKLX0KLQogc3RhdGljIHZvaWQgbmZzX2RpcmVjdF93cml0ZV9jb21wbGV0aW9uKHN0cnVjdCBuZnNfcGdpb19oZWFkZXIgKmhkcikKIHsKIAlzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXEgPSBoZHItPmRyZXE7CkBAIC05NTYsMTYgKzc5MywyNyBAQAogCS5jb21wbGV0aW9uID0gbmZzX2RpcmVjdF93cml0ZV9jb21wbGV0aW9uLAogfTsKIAorCisvKgorICogTkI6IFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVycm9yIHJldHVybiBjb2RlLiAgU3Vic2VxdWVudAorICogICAgIGVycm9ycyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBpZ25vcmVkLgorICovCisvKgorICogRm9yIGVhY2ggd3NpemUnZCBjaHVuayBvZiB0aGUgdXNlcidzIGJ1ZmZlciwgZGlzcGF0Y2ggYW4gTkZTIFdSSVRFCisgKiBvcGVyYXRpb24uICBJZiBuZnNfd3JpdGVkYXRhX2FsbG9jKCkgb3IgZ2V0X3VzZXJfcGFnZXMoKSBmYWlscywKKyAqIGJhaWwgYW5kIHN0b3Agc2VuZGluZyBtb3JlIHdyaXRlcy4gIFdyaXRlIGxlbmd0aCBhY2NvdW50aW5nIGlzCisgKiBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgbmZzX2RpcmVjdF93cml0ZV9yZXN1bHQoKS4gIE90aGVyd2lzZSwgaWYKKyAqIG5vIHJlcXVlc3RzIGhhdmUgYmVlbiBzZW50LCBqdXN0IHJldHVybiBhbiBlcnJvci4KKyAqLwogc3RhdGljIHNzaXplX3QgbmZzX2RpcmVjdF93cml0ZV9zY2hlZHVsZV9pb3ZlYyhzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXEsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKLQkJCQkJICAgICAgIGxvZmZfdCBwb3MsIGJvb2wgdWlvKQorCQkJCQkgICAgICAgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQkJCQkgICAgICAgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yIGRlc2M7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRyZXEtPmlub2RlOwogCXNzaXplX3QgcmVzdWx0ID0gMDsKIAlzaXplX3QgcmVxdWVzdGVkX2J5dGVzID0gMDsKLQl1bnNpZ25lZCBsb25nIHNlZzsKKwlzaXplX3Qgd3NpemUgPSBtYXhfdChzaXplX3QsIE5GU19TRVJWRVIoaW5vZGUpLT53c2l6ZSwgUEFHRV9TSVpFKTsKIAogCW5mc19wYWdlaW9faW5pdF93cml0ZSgmZGVzYywgaW5vZGUsIEZMVVNIX0NPTkRfU1RBQkxFLCBmYWxzZSwKIAkJCSAgICAgICZuZnNfZGlyZWN0X3dyaXRlX2NvbXBsZXRpb25fb3BzKTsKQEAgLTk3MywxNiArODIxLDQ5IEBACiAJZ2V0X2RyZXEoZHJlcSk7CiAJYXRvbWljX2luYygmaW5vZGUtPmlfZGlvX2NvdW50KTsKIAotCU5GU19JKGRyZXEtPmlub2RlKS0+d3JpdGVfaW8gKz0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwotCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKLQkJY29uc3Qgc3RydWN0IGlvdmVjICp2ZWMgPSAmaW92W3NlZ107Ci0JCXJlc3VsdCA9IG5mc19kaXJlY3Rfd3JpdGVfc2NoZWR1bGVfc2VnbWVudCgmZGVzYywgdmVjLCBwb3MsIHVpbyk7CisJTkZTX0koaW5vZGUpLT53cml0ZV9pbyArPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKKwl3aGlsZSAoaW92X2l0ZXJfY291bnQoaXRlcikpIHsKKwkJc3RydWN0IHBhZ2UgKipwYWdldmVjOworCQlzaXplX3QgYnl0ZXM7CisJCXNpemVfdCBwZ2Jhc2U7CisJCXVuc2lnbmVkIG5wYWdlcywgaTsKKworCQlyZXN1bHQgPSBpb3ZfaXRlcl9nZXRfcGFnZXNfYWxsb2MoaXRlciwgJnBhZ2V2ZWMsIAorCQkJCQkJICB3c2l6ZSwgJnBnYmFzZSk7CiAJCWlmIChyZXN1bHQgPCAwKQogCQkJYnJlYWs7Ci0JCXJlcXVlc3RlZF9ieXRlcyArPSByZXN1bHQ7Ci0JCWlmICgoc2l6ZV90KXJlc3VsdCA8IHZlYy0+aW92X2xlbikKKworCQlieXRlcyA9IHJlc3VsdDsKKwkJaW92X2l0ZXJfYWR2YW5jZShpdGVyLCBieXRlcyk7CisJCW5wYWdlcyA9IChyZXN1bHQgKyBwZ2Jhc2UgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKwkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcTsKKwkJCXVuc2lnbmVkIGludCByZXFfbGVuID0gbWluX3Qoc2l6ZV90LCBieXRlcywgUEFHRV9TSVpFIC0gcGdiYXNlKTsKKworCQkJcmVxID0gbmZzX2NyZWF0ZV9yZXF1ZXN0KGRyZXEtPmN0eCwgcGFnZXZlY1tpXSwgTlVMTCwKKwkJCQkJCSBwZ2Jhc2UsIHJlcV9sZW4pOworCQkJaWYgKElTX0VSUihyZXEpKSB7CisJCQkJcmVzdWx0ID0gUFRSX0VSUihyZXEpOworCQkJCWJyZWFrOworCQkJfQorCQkJbmZzX2xvY2tfcmVxdWVzdChyZXEpOworCQkJcmVxLT53Yl9pbmRleCA9IHBvcyA+PiBQQUdFX1NISUZUOworCQkJcmVxLT53Yl9vZmZzZXQgPSBwb3MgJiB+UEFHRV9NQVNLOworCQkJaWYgKCFuZnNfcGFnZWlvX2FkZF9yZXF1ZXN0KCZkZXNjLCByZXEpKSB7CisJCQkJcmVzdWx0ID0gZGVzYy5wZ19lcnJvcjsKKwkJCQluZnNfdW5sb2NrX2FuZF9yZWxlYXNlX3JlcXVlc3QocmVxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBnYmFzZSA9IDA7CisJCQlieXRlcyAtPSByZXFfbGVuOworCQkJcmVxdWVzdGVkX2J5dGVzICs9IHJlcV9sZW47CisJCQlwb3MgKz0gcmVxX2xlbjsKKwkJCWRyZXEtPmJ5dGVzX2xlZnQgLT0gcmVxX2xlbjsKKwkJfQorCQluZnNfZGlyZWN0X3JlbGVhc2VfcGFnZXMocGFnZXZlYywgbnBhZ2VzKTsKKwkJa3ZmcmVlKHBhZ2V2ZWMpOworCQlpZiAocmVzdWx0IDwgMCkKIAkJCWJyZWFrOwotCQlwb3MgKz0gdmVjLT5pb3ZfbGVuOwogCX0KIAluZnNfcGFnZWlvX2NvbXBsZXRlKCZkZXNjKTsKIApAQCAtMTAwNCw4ICs4ODUsNyBAQAogLyoqCiAgKiBuZnNfZmlsZV9kaXJlY3Rfd3JpdGUgLSBmaWxlIGRpcmVjdCB3cml0ZSBvcGVyYXRpb24gZm9yIE5GUyBmaWxlcwogICogQGlvY2I6IHRhcmdldCBJL08gY29udHJvbCBibG9jawotICogQGlvdjogdmVjdG9yIG9mIHVzZXIgYnVmZmVycyBmcm9tIHdoaWNoIHRvIHdyaXRlIGRhdGEKLSAqIEBucl9zZWdzOiBzaXplIG9mIGlvdiB2ZWN0b3IKKyAqIEBpdGVyOiB2ZWN0b3Igb2YgdXNlciBidWZmZXJzIGZyb20gd2hpY2ggdG8gd3JpdGUgZGF0YQogICogQHBvczogYnl0ZSBvZmZzZXQgaW4gZmlsZSB3aGVyZSB3cml0aW5nIHN0YXJ0cwogICoKICAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBkaXJlY3Qgd3JpdGVzIGluc3RlYWQgb2YgY2FsbGluZwpAQCAtMTAyMyw4ICs5MDMsOCBAQAogICogTm90ZSB0aGF0IE9fQVBQRU5EIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIE5GUyBkaXJlY3Qgd3JpdGVzLCBhcyB0aGVyZQogICogaXMgbm8gYXRvbWljIE9fQVBQRU5EIHdyaXRlIGZhY2lsaXR5IGluIHRoZSBORlMgcHJvdG9jb2wuCiAgKi8KLXNzaXplX3QgbmZzX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zLCBib29sIHVpbykKK3NzaXplX3QgbmZzX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQkJCWxvZmZfdCBwb3MsIGJvb2wgdWlvKQogewogCXNzaXplX3QgcmVzdWx0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC0xMDMzLDkgKzkxMyw3IEBACiAJc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxOwogCXN0cnVjdCBuZnNfbG9ja19jb250ZXh0ICpsX2N0eDsKIAlsb2ZmX3QgZW5kOwotCXNpemVfdCBjb3VudDsKLQotCWNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCWVuZCA9IChwb3MgKyBjb3VudCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKIAluZnNfYWRkX3N0YXRzKG1hcHBpbmctPmhvc3QsIE5GU0lPU19ESVJFQ1RXUklUVEVOQllURVMsIGNvdW50KTsKQEAgLTEwODYsNyArOTY0LDcgQEAKIAlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCiAJCWRyZXEtPmlvY2IgPSBpb2NiOwogCi0JcmVzdWx0ID0gbmZzX2RpcmVjdF93cml0ZV9zY2hlZHVsZV9pb3ZlYyhkcmVxLCBpb3YsIG5yX3NlZ3MsIHBvcywgdWlvKTsKKwlyZXN1bHQgPSBuZnNfZGlyZWN0X3dyaXRlX3NjaGVkdWxlX2lvdmVjKGRyZXEsIGl0ZXIsIHBvcyk7CiAKIAlpZiAobWFwcGluZy0+bnJwYWdlcykgewogCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMl9yYW5nZShtYXBwaW5nLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggYzFlZGY3MzMuLjQwNDJmZjUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtMTY1LDIyICsxNjUsMjEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG5mc19maWxlX2ZsdXNoKTsKIAogc3NpemVfdAotbmZzX2ZpbGVfcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCituZnNfZmlsZV9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShpb2NiLT5raV9maWxwKTsKIAlzc2l6ZV90IHJlc3VsdDsKIAogCWlmIChpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpCi0JCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcywgdHJ1ZSk7CisJCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCB0bywgaW9jYi0+a2lfcG9zLCB0cnVlKTsKIAotCWRwcmludGsoIk5GUzogcmVhZCglcEQyLCAlbHVAJWx1KVxuIiwKKwlkcHJpbnRrKCJORlM6IHJlYWQoJXBEMiwgJXp1QCVsdSlcbiIsCiAJCWlvY2ItPmtpX2ZpbHAsCi0JCSh1bnNpZ25lZCBsb25nKSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncyksICh1bnNpZ25lZCBsb25nKSBwb3MpOworCQlpb3ZfaXRlcl9jb3VudCh0byksICh1bnNpZ25lZCBsb25nKSBpb2NiLT5raV9wb3MpOwogCiAJcmVzdWx0ID0gbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nKTsKIAlpZiAoIXJlc3VsdCkgewotCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAkJaWYgKHJlc3VsdCA+IDApCiAJCQluZnNfYWRkX3N0YXRzKGlub2RlLCBORlNJT1NfTk9STUFMUkVBREJZVEVTLCByZXN1bHQpOwogCX0KQEAgLTYzNSwyNCArNjM0LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXNzaXplX3QgbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3NzaXplX3QgbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOwogCXVuc2lnbmVkIGxvbmcgd3JpdHRlbiA9IDA7CiAJc3NpemVfdCByZXN1bHQ7Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAlyZXN1bHQgPSBuZnNfa2V5X3RpbWVvdXRfbm90aWZ5KGZpbGUsIGlub2RlKTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkKLQkJcmV0dXJuIG5mc19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcywgdHJ1ZSk7CisJCXJldHVybiBuZnNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgZnJvbSwgcG9zLCB0cnVlKTsKIAotCWRwcmludGsoIk5GUzogd3JpdGUoJXBEMiwgJWx1QCVMZClcbiIsCi0JCWZpbGUsICh1bnNpZ25lZCBsb25nKSBjb3VudCwgKGxvbmcgbG9uZykgcG9zKTsKKwlkcHJpbnRrKCJORlM6IHdyaXRlKCVwRDIsICV6dUAlTGQpXG4iLAorCQlmaWxlLCBjb3VudCwgKGxvbmcgbG9uZykgcG9zKTsKIAogCXJlc3VsdCA9IC1FQlVTWTsKIAlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKQpAQCAtNjcwLDcgKzY2OSw3IEBACiAJaWYgKCFjb3VudCkKIAkJZ290byBvdXQ7CiAKLQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsKKwlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlcihpb2NiLCBmcm9tKTsKIAlpZiAocmVzdWx0ID4gMCkKIAkJd3JpdHRlbiA9IHJlc3VsdDsKIApAQCAtNjkxLDM2ICs2OTAsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZzX2ZpbGVfd3JpdGUpOwogCi1zc2l6ZV90IG5mc19maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAotCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCAqcHBvcywKLQkJCSAgICAgIHNpemVfdCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbHApOwotCXVuc2lnbmVkIGxvbmcgd3JpdHRlbiA9IDA7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlkcHJpbnRrKCJORlMgc3BsaWNlX3dyaXRlKCVwRDIsICVsdUAlbGx1KVxuIiwKLQkJZmlscCwgKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZyBsb25nKSAqcHBvcyk7Ci0KLQkvKgotCSAqIFRoZSBjb21iaW5hdGlvbiBvZiBzcGxpY2UgYW5kIGFuIE9fQVBQRU5EIGRlc3RpbmF0aW9uIGlzIGRpc2FsbG93ZWQuCi0JICovCi0KLQlyZXQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlKHBpcGUsIGZpbHAsIHBwb3MsIGNvdW50LCBmbGFncyk7Ci0JaWYgKHJldCA+IDApCi0JCXdyaXR0ZW4gPSByZXQ7Ci0KLQlpZiAocmV0ID49IDAgJiYgbmZzX25lZWRfc3luY193cml0ZShmaWxwLCBpbm9kZSkpIHsKLQkJaW50IGVyciA9IHZmc19mc3luYyhmaWxwLCAwKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXQgPSBlcnI7Ci0JfQotCWlmIChyZXQgPiAwKQotCQluZnNfYWRkX3N0YXRzKGlub2RlLCBORlNJT1NfTk9STUFMV1JJVFRFTkJZVEVTLCB3cml0dGVuKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZzX2ZpbGVfc3BsaWNlX3dyaXRlKTsKLQogc3RhdGljIGludAogZG9fZ2V0bGsoc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBpbnQgaXNfbG9jYWwpCiB7CkBAIC05MzUsMTAgKzkwNCwxMCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5mc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBuZnNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IG5mc19maWxlX3JlYWQsCi0JLmFpb193cml0ZQk9IG5mc19maWxlX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBuZnNfZmlsZV9yZWFkLAorCS53cml0ZV9pdGVyCT0gbmZzX2ZpbGVfd3JpdGUsCiAJLm1tYXAJCT0gbmZzX2ZpbGVfbW1hcCwKIAkub3BlbgkJPSBuZnNfZmlsZV9vcGVuLAogCS5mbHVzaAkJPSBuZnNfZmlsZV9mbHVzaCwKQEAgLTk0Nyw3ICs5MTYsNyBAQAogCS5sb2NrCQk9IG5mc19sb2NrLAogCS5mbG9jawkJPSBuZnNfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gbmZzX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IG5mc19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuY2hlY2tfZmxhZ3MJPSBuZnNfY2hlY2tfZmxhZ3MsCiAJLnNldGxlYXNlCT0gbmZzX3NldGxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggOGI2OWNiYS4uODJkZGJmNCAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTMyNywxNiArMzI3LDE0IEBACiBpbnQgbmZzX2ZpbGVfZnN5bmNfY29tbWl0KHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOwogbG9mZl90IG5mc19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiBpbnQgbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKiwgZmxfb3duZXJfdCk7Ci1zc2l6ZV90IG5mc19maWxlX3JlYWQoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOworc3NpemVfdCBuZnNfZmlsZV9yZWFkKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiBzc2l6ZV90IG5mc19maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCiAJCQkgICAgIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGludCBuZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKLXNzaXplX3QgbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOworc3NpemVfdCBuZnNfZmlsZV93cml0ZShzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOwogaW50IG5mc19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogaW50IG5mc19sb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKIGludCBuZnNfZmxvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotc3NpemVfdCBuZnNfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwKLQkJCSAgICAgIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGludCBuZnNfY2hlY2tfZmxhZ3MoaW50KTsKIGludCBuZnNfc2V0bGVhc2Uoc3RydWN0IGZpbGUgKiwgbG9uZywgc3RydWN0IGZpbGVfbG9jayAqKik7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0ZmlsZS5jIGIvZnMvbmZzL25mczRmaWxlLmMKaW5kZXggNDY0ZGI5ZC4uYTgxNmYwNiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRmaWxlLmMKKysrIGIvZnMvbmZzL25mczRmaWxlLmMKQEAgLTExNywxMCArMTE3LDEwIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmZzNF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBuZnNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IG5mc19maWxlX3JlYWQsCi0JLmFpb193cml0ZQk9IG5mc19maWxlX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBuZnNfZmlsZV9yZWFkLAorCS53cml0ZV9pdGVyCT0gbmZzX2ZpbGVfd3JpdGUsCiAJLm1tYXAJCT0gbmZzX2ZpbGVfbW1hcCwKIAkub3BlbgkJPSBuZnM0X2ZpbGVfb3BlbiwKIAkuZmx1c2gJCT0gbmZzX2ZpbGVfZmx1c2gsCkBAIC0xMjksNyArMTI5LDcgQEAKIAkubG9jawkJPSBuZnNfbG9jaywKIAkuZmxvY2sJCT0gbmZzX2Zsb2NrLAogCS5zcGxpY2VfcmVhZAk9IG5mc19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBuZnNfZmlsZV9zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLmNoZWNrX2ZsYWdzCT0gbmZzX2NoZWNrX2ZsYWdzLAogCS5zZXRsZWFzZQk9IG5mc19zZXRsZWFzZSwKIH07CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZmlsZS5jIGIvZnMvbmlsZnMyL2ZpbGUuYwppbmRleCBmM2E4MmZiLi4yNDk3ODE1IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZmlsZS5jCisrKyBiL2ZzL25pbGZzMi9maWxlLmMKQEAgLTE1MiwxMCArMTUyLDEwIEBACiAgKi8KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsCT0gbmlsZnNfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSBuaWxmc19jb21wYXRfaW9jdGwsCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaW5vZGUuYyBiL2ZzL25pbGZzMi9pbm9kZS5jCmluZGV4IGI5YzU3MjYxLi42MjUyYjE3IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaW5vZGUuYworKysgYi9mcy9uaWxmczIvaW5vZGUuYwpAQCAtMjk4LDE5ICsyOTgsMjAgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLW5pbGZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK25pbGZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQlsb2ZmX3Qgb2Zmc2V0KQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXNzaXplX3Qgc2l6ZTsKIAogCWlmIChydyA9PSBXUklURSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBOZWVkcyBzeW5jaHJvbml6YXRpb24gd2l0aCB0aGUgY2xlYW5lciAqLwotCXNpemUgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKKwlzaXplID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaXRlciwgb2Zmc2V0LAogCQkJCSAgbmlsZnNfZ2V0X2Jsb2NrKTsKIAogCS8qCkBAIC0zMTksNyArMzIwLDcgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHNpemUgPCAwKSkgewogCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKIAogCQlpZiAoZW5kID4gaXNpemUpCiAJCQluaWxmc193cml0ZV9mYWlsZWQobWFwcGluZywgZW5kKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKaW5kZXggODZkZGFiOS4uNWM5ZTJjOCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9maWxlLmMKKysrIGIvZnMvbnRmcy9maWxlLmMKQEAgLTIwOTAsMTAgKzIwOTAsNyBAQAogCXNpemVfdCBjb3VudDsJCS8qIGFmdGVyIGZpbGUgbGltaXQgY2hlY2tzICovCiAJc3NpemVfdCB3cml0dGVuLCBlcnI7CiAKLQljb3VudCA9IDA7Ci0JZXJyID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3YsICZucl9zZWdzLCAmY291bnQsIFZFUklGWV9SRUFEKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCWNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwogCXBvcyA9ICpwcG9zOwogCS8qIFdlIGNhbiB3cml0ZSBiYWNrIHRoaXMgcXVldWUgaW4gcGFnZSByZWNsYWltLiAqLwogCWN1cnJlbnQtPmJhY2tpbmdfZGV2X2luZm8gPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwpAQCAtMjIwMiw4ICsyMTk5LDggQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2ZpbGVfb3BzID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywJIC8qIFNlZWsgaW5zaWRlIGZpbGUuICovCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAkJIC8qIFJlYWQgZnJvbSBmaWxlLiAqLwotCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwgLyogQXN5bmMgcmVhZCBmcm9tIGZpbGUuICovCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwJIC8qIFJlYWQgZnJvbSBmaWxlLiAqLworCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLCAvKiBBc3luYyByZWFkIGZyb20gZmlsZS4gKi8KICNpZmRlZiBOVEZTX1JXCiAJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCSAvKiBXcml0ZSB0byBmaWxlLiAqLwogCS5haW9fd3JpdGUJPSBudGZzX2ZpbGVfYWlvX3dyaXRlLAkgLyogQXN5bmMgd3JpdGUgdG8gZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCBkMzEwZDEyLi40YTIzMWExIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC01OTksOSArNTk5LDggQEAKIAogc3RhdGljIHNzaXplX3Qgb2NmczJfZGlyZWN0X0lPKGludCBydywKIAkJCSAgICAgICBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgICAgICAgbG9mZl90IG9mZnNldCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkgICAgICAgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQkJICAgICAgIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpLT5pX21hcHBpbmctPmhvc3Q7CkBAIC02MTgsNyArNjE3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LAotCQkJCSAgICBpb3YsIG9mZnNldCwgbnJfc2VncywKKwkJCQkgICAgaXRlciwgb2Zmc2V0LAogCQkJCSAgICBvY2ZzMl9kaXJlY3RfSU9fZ2V0X2Jsb2NrcywKIAkJCQkgICAgb2NmczJfZGlvX2VuZF9pbywgTlVMTCwgMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggOGViNmU1Ny4uMjkzMGUyMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMjIzMywxNiArMjIzMywxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG9jZnMyX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKLQkJCQkgICAgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IG9jZnMyX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQkJICAgIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlpbnQgcmV0LCBkaXJlY3RfaW8sIGFwcGVuZGluZywgcndfbGV2ZWwsIGhhdmVfYWxsb2Nfc2VtICA9IDA7CiAJaW50IGNhbl9kb19kaXJlY3QsIGhhc19yZWZjb3VudCA9IDA7CiAJc3NpemVfdCB3cml0dGVuID0gMDsKLQlzaXplX3Qgb2NvdW50OwkJLyogb3JpZ2luYWwgY291bnQgKi8KLQlzaXplX3QgY291bnQ7CQkvKiBhZnRlciBmaWxlIGxpbWl0IGNoZWNrcyAqLworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCWxvZmZfdCBvbGRfc2l6ZSwgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOwogCXUzMiBvbGRfY2x1c3RlcnM7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwpAQCAtMjI1Niw3ICsyMjUzLDcgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCiAJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5sZW4sCiAJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAotCQkodW5zaWduZWQgaW50KW5yX3NlZ3MpOworCQkodW5zaWduZWQgaW50KWZyb20tPm5yX3NlZ3MpOwkvKiBHUlJSUlIgKi8KIAogCWlmIChpb2NiLT5raV9uYnl0ZXMgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC0yMzU0LDI5ICsyMzUxLDIxIEBACiAJLyogY29tbXVuaWNhdGUgd2l0aCBvY2ZzMl9kaW9fZW5kX2lvICovCiAJb2NmczJfaW9jYl9zZXRfcndfbG9ja2VkKGlvY2IsIHJ3X2xldmVsKTsKIAotCXJldCA9IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoaW92LCAmbnJfc2VncywgJm9jb3VudCwKLQkJCQkgICAgIFZFUklGWV9SRUFEKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9kaW87Ci0KLQljb3VudCA9IG9jb3VudDsKIAlyZXQgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwcG9zLCAmY291bnQsCiAJCQkJICAgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGlvOwogCisJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgY291bnQpOwogCWlmIChkaXJlY3RfaW8pIHsKLQkJd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92LCAmbnJfc2VncywgKnBwb3MsCi0JCQkJCQkgICAgY291bnQsIG9jb3VudCk7CisJCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20sICpwcG9zKTsKIAkJaWYgKHdyaXR0ZW4gPCAwKSB7CiAJCQlyZXQgPSB3cml0dGVuOwogCQkJZ290byBvdXRfZGlvOwogCQl9CiAJfSBlbHNlIHsKLQkJc3RydWN0IGlvdl9pdGVyIGZyb207Ci0JCWlvdl9pdGVyX2luaXQoJmZyb20sIGlvdiwgbnJfc2VncywgY291bnQsIDApOwogCQljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gZmlsZS0+Zl9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwotCQl3cml0dGVuID0gZ2VuZXJpY19wZXJmb3JtX3dyaXRlKGZpbGUsICZmcm9tLCAqcHBvcyk7CisJCXdyaXR0ZW4gPSBnZW5lcmljX3BlcmZvcm1fd3JpdGUoZmlsZSwgZnJvbSwgKnBwb3MpOwogCQlpZiAobGlrZWx5KHdyaXR0ZW4gPj0gMCkpCiAJCQlpb2NiLT5raV9wb3MgPSAqcHBvcyArIHdyaXR0ZW47CiAJCWN1cnJlbnQtPmJhY2tpbmdfZGV2X2luZm8gPSBOVUxMOwpAQCAtMjQ0MSw4NCArMjQzMCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9zcGxpY2VfdG9fZmlsZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAotCQkJCXN0cnVjdCBmaWxlICpvdXQsCi0JCQkJc3RydWN0IHNwbGljZV9kZXNjICpzZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUob3V0LCAmc2QtPnBvcywKLQkJCQkJICAgIHNkLT50b3RhbF9sZW4sIDAsIE5VTEwsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gc3BsaWNlX2Zyb21fcGlwZV9mZWVkKHBpcGUsIHNkLCBwaXBlX3RvX2ZpbGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAotCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqb3V0LAotCQkJCSAgICAgICBsb2ZmX3QgKnBwb3MsCi0JCQkJICAgICAgIHNpemVfdCBsZW4sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb3V0LT5mX21hcHBpbmc7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHNwbGljZV9kZXNjIHNkID0gewotCQkudG90YWxfbGVuID0gbGVuLAotCQkuZmxhZ3MgPSBmbGFncywKLQkJLnBvcyA9ICpwcG9zLAotCQkudS5maWxlID0gb3V0LAotCX07Ci0KLQotCXRyYWNlX29jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlKGlub2RlLCBvdXQsIG91dC0+Zl9wYXRoLmRlbnRyeSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJb3V0LT5mX3BhdGguZGVudHJ5LT5kX25hbWUubGVuLAotCQkJb3V0LT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKLQotCXBpcGVfbG9jayhwaXBlKTsKLQotCXNwbGljZV9mcm9tX3BpcGVfYmVnaW4oJnNkKTsKLQlkbyB7Ci0JCXJldCA9IHNwbGljZV9mcm9tX3BpcGVfbmV4dChwaXBlLCAmc2QpOwotCQlpZiAocmV0IDw9IDApCi0JCQlicmVhazsKLQotCQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOwotCQlyZXQgPSBvY2ZzMl9yd19sb2NrKGlub2RlLCAxKTsKLQkJaWYgKHJldCA8IDApCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCWVsc2UgewotCQkJcmV0ID0gb2NmczJfc3BsaWNlX3RvX2ZpbGUocGlwZSwgb3V0LCAmc2QpOwotCQkJb2NmczJfcndfdW5sb2NrKGlub2RlLCAxKTsKLQkJfQotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQl9IHdoaWxlIChyZXQgPiAwKTsKLQlzcGxpY2VfZnJvbV9waXBlX2VuZChwaXBlLCAmc2QpOwotCi0JcGlwZV91bmxvY2socGlwZSk7Ci0KLQlpZiAoc2QubnVtX3NwbGljZWQpCi0JCXJldCA9IHNkLm51bV9zcGxpY2VkOwotCi0JaWYgKHJldCA+IDApIHsKLQkJaW50IGVycjsKLQotCQllcnIgPSBnZW5lcmljX3dyaXRlX3N5bmMob3V0LCAqcHBvcywgcmV0KTsKLQkJaWYgKGVycikKLQkJCXJldCA9IGVycjsKLQkJZWxzZQotCQkJKnBwb3MgKz0gcmV0OwotCi0JCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQobWFwcGluZyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sCiAJCQkJICAgICAgbG9mZl90ICpwcG9zLAogCQkJCSAgICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCkBAIC0yNTM0LDcgKzI0NDUsNyBAQAogCQkJaW4tPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOwogCiAJLyoKLQkgKiBTZWUgdGhlIGNvbW1lbnQgaW4gb2NmczJfZmlsZV9haW9fcmVhZCgpCisJICogU2VlIHRoZSBjb21tZW50IGluIG9jZnMyX2ZpbGVfcmVhZF9pdGVyKCkKIAkgKi8KIAlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrX2F0aW1lKGlub2RlLCBpbi0+Zl9wYXRoLm1udCwgJmxvY2tfbGV2ZWwpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0yNTQ5LDEwICsyNDYwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX2Fpb19yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCi0JCQkJICAgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IG9jZnMyX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCQkgICBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQogewogCWludCByZXQgPSAwLCByd19sZXZlbCA9IC0xLCBoYXZlX2FsbG9jX3NlbSA9IDAsIGxvY2tfbGV2ZWwgPSAwOwogCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKQEAgLTI1NjEsNyArMjQ3MCw4IEBACiAJdHJhY2Vfb2NmczJfZmlsZV9haW9fcmVhZChpbm9kZSwgZmlscCwgZmlscC0+Zl9wYXRoLmRlbnRyeSwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBucl9zZWdzKTsKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJdG8tPm5yX3NlZ3MpOwkvKiBHUlJSUlIgKi8KIAogCiAJaWYgKCFpbm9kZSkgewpAQCAtMjYwNiwxMyArMjUxNiwxMyBAQAogCX0KIAlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIGxvY2tfbGV2ZWwpOwogCi0JcmV0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdiwgbnJfc2VncywgaW9jYi0+a2lfcG9zKTsKKwlyZXQgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAl0cmFjZV9nZW5lcmljX2ZpbGVfYWlvX3JlYWRfcmV0KHJldCk7CiAKIAkvKiBidWZmZXJlZCBhaW8gd291bGRuJ3QgaGF2ZSBwcm9wZXIgbG9jayBjb3ZlcmFnZSB0b2RheSAqLwogCUJVR19PTihyZXQgPT0gLUVJT0NCUVVFVUVEICYmICEoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSk7CiAKLQkvKiBzZWUgb2NmczJfZmlsZV9haW9fd3JpdGUgKi8KKwkvKiBzZWUgb2NmczJfZmlsZV93cml0ZV9pdGVyICovCiAJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQgfHwgIW9jZnMyX2lvY2JfaXNfcndfbG9ja2VkKGlvY2IpKSB7CiAJCXJ3X2xldmVsID0gLTE7CiAJCWhhdmVfYWxsb2Nfc2VtID0gMDsKQEAgLTI3MDUsMTQgKzI2MTUsMTQgQEAKICAqLwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9mb3BzID0gewogCS5sbHNlZWsJCT0gb2NmczJfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS5tbWFwCQk9IG9jZnMyX21tYXAsCiAJLmZzeW5jCQk9IG9jZnMyX3N5bmNfZmlsZSwKIAkucmVsZWFzZQk9IG9jZnMyX2ZpbGVfcmVsZWFzZSwKIAkub3BlbgkJPSBvY2ZzMl9maWxlX29wZW4sCi0JLmFpb19yZWFkCT0gb2NmczJfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlCT0gb2NmczJfZmlsZV9haW9fd3JpdGUsCisJLnJlYWRfaXRlcgk9IG9jZnMyX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gb2NmczJfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bAk9IG9jZnMyX2lvY3RsLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsICAgPSBvY2ZzMl9jb21wYXRfaW9jdGwsCkBAIC0yNzIwLDcgKzI2MzAsNyBAQAogCS5sb2NrCQk9IG9jZnMyX2xvY2ssCiAJLmZsb2NrCQk9IG9jZnMyX2Zsb2NrLAogCS5zcGxpY2VfcmVhZAk9IG9jZnMyX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IG9jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlLAorCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5mYWxsb2NhdGUJPSBvY2ZzMl9mYWxsb2NhdGUsCiB9OwogCkBAIC0yNzUzLDIxICsyNjYzLDIxIEBACiAgKi8KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wc19ub19wbG9ja3MgPSB7CiAJLmxsc2VlawkJPSBvY2ZzMl9maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLm1tYXAJCT0gb2NmczJfbW1hcCwKIAkuZnN5bmMJCT0gb2NmczJfc3luY19maWxlLAogCS5yZWxlYXNlCT0gb2NmczJfZmlsZV9yZWxlYXNlLAogCS5vcGVuCQk9IG9jZnMyX2ZpbGVfb3BlbiwKLQkuYWlvX3JlYWQJPSBvY2ZzMl9maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUJPSBvY2ZzMl9maWxlX2Fpb193cml0ZSwKKwkucmVhZF9pdGVyCT0gb2NmczJfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJPSBvY2ZzMl9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsCT0gb2NmczJfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwgICA9IG9jZnMyX2NvbXBhdF9pb2N0bCwKICNlbmRpZgogCS5mbG9jawkJPSBvY2ZzMl9mbG9jaywKIAkuc3BsaWNlX3JlYWQJPSBvY2ZzMl9maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBvY2ZzMl9maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZmFsbG9jYXRlCT0gb2NmczJfZmFsbG9jYXRlLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvb21mcy9maWxlLmMgYi9mcy9vbWZzL2ZpbGUuYwppbmRleCA1NGQ1N2Q2Li45MDJlODg1IDEwMDY0NAotLS0gYS9mcy9vbWZzL2ZpbGUuYworKysgYi9mcy9vbWZzL2ZpbGUuYwpAQCAtMzM3LDEwICszMzcsMTAgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUgPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkuYWlvX3dyaXRlID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlciA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcCA9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5mc3luYyA9IGdlbmVyaWNfZmlsZV9mc3luYywKIAkuc3BsaWNlX3JlYWQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggOWQ2NDY3OS4uMzY2NjJkMCAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtNzI1LDYgKzcyNSwxMiBAQAogCX0KIAlpZiAoKGYtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSA9PSBGTU9ERV9SRUFEKQogCQlpX3JlYWRjb3VudF9pbmMoaW5vZGUpOworCWlmICgoZi0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYKKwkgICAgIGxpa2VseShmLT5mX29wLT5yZWFkIHx8IGYtPmZfb3AtPmFpb19yZWFkIHx8IGYtPmZfb3AtPnJlYWRfaXRlcikpCisJCWYtPmZfbW9kZSB8PSBGTU9ERV9DQU5fUkVBRDsKKwlpZiAoKGYtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCSAgICAgbGlrZWx5KGYtPmZfb3AtPndyaXRlIHx8IGYtPmZfb3AtPmFpb193cml0ZSB8fCBmLT5mX29wLT53cml0ZV9pdGVyKSkKKwkJZi0+Zl9tb2RlIHw9IEZNT0RFX0NBTl9XUklURTsKIAogCWYtPmZfZmxhZ3MgJj0gfihPX0NSRUFUIHwgT19FWENMIHwgT19OT0NUVFkgfCBPX1RSVU5DKTsKIApkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDAzNGJmZmEuLjIxOTgxZTUgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTExNiw1MCArMTE2LDYgQEAKIAlwaXBlX2xvY2socGlwZSk7CiB9CiAKLXN0YXRpYyBpbnQKLXBpcGVfaW92X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQlpbnQgYXRvbWljKQotewotCXVuc2lnbmVkIGxvbmcgY29weTsKLQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCXdoaWxlICghaW92LT5pb3ZfbGVuKQotCQkJaW92Kys7Ci0JCWNvcHkgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW4sIGlvdi0+aW92X2xlbik7Ci0KLQkJaWYgKGF0b21pYykgewotCQkJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGlvdi0+aW92X2Jhc2UsIGNvcHkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9IGVsc2UgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRvLCBpb3YtPmlvdl9iYXNlLCBjb3B5KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl0byArPSBjb3B5OwotCQlsZW4gLT0gY29weTsKLQkJaW92LT5pb3ZfYmFzZSArPSBjb3B5OwotCQlpb3YtPmlvdl9sZW4gLT0gY29weTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcmUtZmF1bHQgaW4gdGhlIHVzZXIgbWVtb3J5LCBzbyB3ZSBjYW4gdXNlIGF0b21pYyBjb3BpZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGlvdl9mYXVsdF9pbl9wYWdlc19yZWFkKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLQl3aGlsZSAoIWlvdi0+aW92X2xlbikKLQkJaW92Kys7Ci0KLQl3aGlsZSAobGVuID4gMCkgewotCQl1bnNpZ25lZCBsb25nIHRoaXNfbGVuOwotCi0JCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuLCBpb3YtPmlvdl9sZW4pOwotCQlmYXVsdF9pbl9wYWdlc19yZWFkYWJsZShpb3YtPmlvdl9iYXNlLCB0aGlzX2xlbik7Ci0JCWxlbiAtPSB0aGlzX2xlbjsKLQkJaW92Kys7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBhbm9uX3BpcGVfYnVmX3JlbGVhc2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKIAkJCQkgIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmKQogewpAQCAtMjcxLDI0ICsyMjcsMTggQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90Ci1waXBlX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9pb3YsCi0JICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorcGlwZV9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKKwlzaXplX3QgdG90YWxfbGVuID0gaW92X2l0ZXJfY291bnQodG8pOwogCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWludCBkb193YWtldXA7CiAJc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGlvdmVjICppb3YgPSAoc3RydWN0IGlvdmVjICopX2lvdjsKLQlzaXplX3QgdG90YWxfbGVuOwotCXN0cnVjdCBpb3ZfaXRlciBpdGVyOwogCi0JdG90YWxfbGVuID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwogCS8qIE51bGwgcmVhZCBzdWNjZWVkcy4gKi8KIAlpZiAodW5saWtlbHkodG90YWxfbGVuID09IDApKQogCQlyZXR1cm4gMDsKIAotCWlvdl9pdGVyX2luaXQoJml0ZXIsIGlvdiwgbnJfc2VncywgdG90YWxfbGVuLCAwKTsKLQogCWRvX3dha2V1cCA9IDA7CiAJcmV0ID0gMDsKIAlfX3BpcGVfbG9jayhwaXBlKTsKQEAgLTMxMiw3ICsyNjIsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQl3cml0dGVuID0gY29weV9wYWdlX3RvX2l0ZXIoYnVmLT5wYWdlLCBidWYtPm9mZnNldCwgY2hhcnMsICZpdGVyKTsKKwkJCXdyaXR0ZW4gPSBjb3B5X3BhZ2VfdG9faXRlcihidWYtPnBhZ2UsIGJ1Zi0+b2Zmc2V0LCBjaGFycywgdG8pOwogCQkJaWYgKHVubGlrZWx5KHdyaXR0ZW4gPCBjaGFycykpIHsKIAkJCQlpZiAoIXJldCkKIAkJCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTM4NiwyNCArMzM2LDE5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1waXBlX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICpfaW92LAotCSAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQorcGlwZV93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzc2l6ZV90IHJldDsKLQlpbnQgZG9fd2FrZXVwOwotCXN0cnVjdCBpb3ZlYyAqaW92ID0gKHN0cnVjdCBpb3ZlYyAqKV9pb3Y7Ci0Jc2l6ZV90IHRvdGFsX2xlbjsKKwlzc2l6ZV90IHJldCA9IDA7CisJaW50IGRvX3dha2V1cCA9IDA7CisJc2l6ZV90IHRvdGFsX2xlbiA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCXNzaXplX3QgY2hhcnM7CiAKLQl0b3RhbF9sZW4gPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CiAJLyogTnVsbCB3cml0ZSBzdWNjZWVkcy4gKi8KIAlpZiAodW5saWtlbHkodG90YWxfbGVuID09IDApKQogCQlyZXR1cm4gMDsKIAotCWRvX3dha2V1cCA9IDA7Ci0JcmV0ID0gMDsKIAlfX3BpcGVfbG9jayhwaXBlKTsKIAogCWlmICghcGlwZS0+cmVhZGVycykgewpAQCAtNDIyLDM4ICszNjcsMTkgQEAKIAkJaW50IG9mZnNldCA9IGJ1Zi0+b2Zmc2V0ICsgYnVmLT5sZW47CiAKIAkJaWYgKG9wcy0+Y2FuX21lcmdlICYmIG9mZnNldCArIGNoYXJzIDw9IFBBR0VfU0laRSkgewotCQkJaW50IGVycm9yLCBhdG9taWMgPSAxOwotCQkJdm9pZCAqYWRkcjsKLQotCQkJZXJyb3IgPSBvcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJCWludCBlcnJvciA9IG9wcy0+Y29uZmlybShwaXBlLCBidWYpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gb3V0OwogCi0JCQlpb3ZfZmF1bHRfaW5fcGFnZXNfcmVhZChpb3YsIGNoYXJzKTsKLXJlZG8xOgotCQkJaWYgKGF0b21pYykKLQkJCQlhZGRyID0ga21hcF9hdG9taWMoYnVmLT5wYWdlKTsKLQkJCWVsc2UKLQkJCQlhZGRyID0ga21hcChidWYtPnBhZ2UpOwotCQkJZXJyb3IgPSBwaXBlX2lvdl9jb3B5X2Zyb21fdXNlcihvZmZzZXQgKyBhZGRyLCBpb3YsCi0JCQkJCQkJY2hhcnMsIGF0b21pYyk7Ci0JCQlpZiAoYXRvbWljKQotCQkJCWt1bm1hcF9hdG9taWMoYWRkcik7Ci0JCQllbHNlCi0JCQkJa3VubWFwKGJ1Zi0+cGFnZSk7Ci0JCQlyZXQgPSBlcnJvcjsKLQkJCWRvX3dha2V1cCA9IDE7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlpZiAoYXRvbWljKSB7Ci0JCQkJCWF0b21pYyA9IDA7Ci0JCQkJCWdvdG8gcmVkbzE7Ci0JCQkJfQorCQkJcmV0ID0gY29weV9wYWdlX2Zyb21faXRlcihidWYtPnBhZ2UsIG9mZnNldCwgY2hhcnMsIGZyb20pOworCQkJaWYgKHVubGlrZWx5KHJldCA8IGNoYXJzKSkgeworCQkJCWVycm9yID0gLUVGQVVMVDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KKwkJCWRvX3dha2V1cCA9IDE7CiAJCQlidWYtPmxlbiArPSBjaGFyczsKLQkJCXRvdGFsX2xlbiAtPSBjaGFyczsKIAkJCXJldCA9IGNoYXJzOwotCQkJaWYgKCF0b3RhbF9sZW4pCisJCQlpZiAoIWlvdl9pdGVyX2NvdW50KGZyb20pKQogCQkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtNDcyLDggKzM5OCw3IEBACiAJCQlpbnQgbmV3YnVmID0gKHBpcGUtPmN1cmJ1ZiArIGJ1ZnMpICYgKHBpcGUtPmJ1ZmZlcnMtMSk7CiAJCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBuZXdidWY7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBpcGUtPnRtcF9wYWdlOwotCQkJY2hhciAqc3JjOwotCQkJaW50IGVycm9yLCBhdG9taWMgPSAxOworCQkJaW50IGNvcGllZDsKIAogCQkJaWYgKCFwYWdlKSB7CiAJCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSKTsKQEAgLTQ4OSw0MCArNDE0LDE5IEBACiAJCQkgKiBGSVhNRSEgSXMgdGhpcyByZWFsbHkgdHJ1ZT8KIAkJCSAqLwogCQkJZG9fd2FrZXVwID0gMTsKLQkJCWNoYXJzID0gUEFHRV9TSVpFOwotCQkJaWYgKGNoYXJzID4gdG90YWxfbGVuKQotCQkJCWNoYXJzID0gdG90YWxfbGVuOwotCi0JCQlpb3ZfZmF1bHRfaW5fcGFnZXNfcmVhZChpb3YsIGNoYXJzKTsKLXJlZG8yOgotCQkJaWYgKGF0b21pYykKLQkJCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlKTsKLQkJCWVsc2UKLQkJCQlzcmMgPSBrbWFwKHBhZ2UpOwotCi0JCQllcnJvciA9IHBpcGVfaW92X2NvcHlfZnJvbV91c2VyKHNyYywgaW92LCBjaGFycywKLQkJCQkJCQlhdG9taWMpOwotCQkJaWYgKGF0b21pYykKLQkJCQlrdW5tYXBfYXRvbWljKHNyYyk7Ci0JCQllbHNlCi0JCQkJa3VubWFwKHBhZ2UpOwotCi0JCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7Ci0JCQkJaWYgKGF0b21pYykgewotCQkJCQlhdG9taWMgPSAwOwotCQkJCQlnb3RvIHJlZG8yOwotCQkJCX0KKwkJCWNvcGllZCA9IGNvcHlfcGFnZV9mcm9tX2l0ZXIocGFnZSwgMCwgUEFHRV9TSVpFLCBmcm9tKTsKKwkJCWlmICh1bmxpa2VseShjb3BpZWQgPCBQQUdFX1NJWkUgJiYgaW92X2l0ZXJfY291bnQoZnJvbSkpKSB7CiAJCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IGVycm9yOworCQkJCQlyZXQgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcmV0ICs9IGNoYXJzOworCQkJcmV0ICs9IGNvcGllZDsKIAogCQkJLyogSW5zZXJ0IGl0IGludG8gdGhlIGJ1ZmZlciBhcnJheSAqLwogCQkJYnVmLT5wYWdlID0gcGFnZTsKIAkJCWJ1Zi0+b3BzID0gJmFub25fcGlwZV9idWZfb3BzOwogCQkJYnVmLT5vZmZzZXQgPSAwOwotCQkJYnVmLT5sZW4gPSBjaGFyczsKKwkJCWJ1Zi0+bGVuID0gY29waWVkOwogCQkJYnVmLT5mbGFncyA9IDA7CiAJCQlpZiAoaXNfcGFja2V0aXplZChmaWxwKSkgewogCQkJCWJ1Zi0+b3BzID0gJnBhY2tldF9waXBlX2J1Zl9vcHM7CkBAIC01MzEsOCArNDM1LDcgQEAKIAkJCXBpcGUtPm5yYnVmcyA9ICsrYnVmczsKIAkJCXBpcGUtPnRtcF9wYWdlID0gTlVMTDsKIAotCQkJdG90YWxfbGVuIC09IGNoYXJzOwotCQkJaWYgKCF0b3RhbF9sZW4pCisJCQlpZiAoIWlvdl9pdGVyX2NvdW50KGZyb20pKQogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChidWZzIDwgcGlwZS0+YnVmZmVycykKQEAgLTEwNDQsMTAgKzk0NywxMCBAQAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwaXBlZmlmb19mb3BzID0gewogCS5vcGVuCQk9IGZpZm9fb3BlbiwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gcGlwZV9yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBwaXBlX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IHBpcGVfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLndyaXRlX2l0ZXIJPSBwaXBlX3dyaXRlLAogCS5wb2xsCQk9IHBpcGVfcG9sbCwKIAkudW5sb2NrZWRfaW9jdGwJPSBwaXBlX2lvY3RsLAogCS5yZWxlYXNlCT0gcGlwZV9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvZmlsZS1tbXUuYyBiL2ZzL3JhbWZzL2ZpbGUtbW11LmMKaW5kZXggMWU1NmE0ZS4uNGY1NmRlOCAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvZmlsZS1tbXUuYworKysgYi9mcy9yYW1mcy9maWxlLW1tdS5jCkBAIC0zMSwxNCArMzEsMTQgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLmZzeW5jCQk9IG5vb3BfZnN5bmMsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAorCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYyBiL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYwppbmRleCAwYjNkOGU0Li5kZGEwMTJhIDEwMDY0NAotLS0gYS9mcy9yYW1mcy9maWxlLW5vbW11LmMKKysrIGIvZnMvcmFtZnMvZmlsZS1ub21tdS5jCkBAIC0zNywxMyArMzcsMTMgQEAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmFtZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5tbWFwCQkJPSByYW1mc19ub21tdV9tbWFwLAogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHJhbWZzX25vbW11X2dldF91bm1hcHBlZF9hcmVhLAotCS5yZWFkCQkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCQk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLQkud3JpdGUJCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQkJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQkJPSBuZXdfc3luY19yZWFkLAorCS5yZWFkX2l0ZXIJCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKKwkud3JpdGUJCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCQk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5mc3luYwkJCT0gbm9vcF9mc3luYywKIAkuc3BsaWNlX3JlYWQJCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLmxsc2VlawkJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCAzMWM2ZWZhLi4wMDlkODU0IDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC0yNSwxMSArMjUsMTIgQEAKIHR5cGVkZWYgc3NpemVfdCAoKmlvX2ZuX3QpKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogdHlwZWRlZiBzc2l6ZV90ICgqaW92X2ZuX3QpKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwKIAkJdW5zaWduZWQgbG9uZywgbG9mZl90KTsKK3R5cGVkZWYgc3NpemVfdCAoKml0ZXJfZm5fdCkoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZW5lcmljX3JvX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiB9OwpAQCAtMzkwLDEzICszOTEsMzQgQEAKIAogRVhQT1JUX1NZTUJPTChkb19zeW5jX3JlYWQpOwogCitzc2l6ZV90IG5ld19zeW5jX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSBidWYsIC5pb3ZfbGVuID0gbGVuIH07CisJc3RydWN0IGtpb2NiIGtpb2NiOworCXN0cnVjdCBpb3ZfaXRlciBpdGVyOworCXNzaXplX3QgcmV0OworCisJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7CisJa2lvY2Iua2lfcG9zID0gKnBwb3M7CisJa2lvY2Iua2lfbmJ5dGVzID0gbGVuOworCWlvdl9pdGVyX2luaXQoJml0ZXIsIFJFQUQsICZpb3YsIDEsIGxlbik7CisKKwlyZXQgPSBmaWxwLT5mX29wLT5yZWFkX2l0ZXIoJmtpb2NiLCAmaXRlcik7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOworCSpwcG9zID0ga2lvY2Iua2lfcG9zOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0wobmV3X3N5bmNfcmVhZCk7CisKIHNzaXplX3QgdmZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7CiAJc3NpemVfdCByZXQ7CiAKIAlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKIAkJcmV0dXJuIC1FQkFERjsKLQlpZiAoIWZpbGUtPmZfb3AtPnJlYWQgJiYgIWZpbGUtPmZfb3AtPmFpb19yZWFkKQorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9SRUFEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDA2LDggKzQyOCwxMCBAQAogCQljb3VudCA9IHJldDsKIAkJaWYgKGZpbGUtPmZfb3AtPnJlYWQpCiAJCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7Ci0JCWVsc2UKKwkJZWxzZSBpZiAoZmlsZS0+Zl9vcC0+YWlvX3JlYWQpCiAJCQlyZXQgPSBkb19zeW5jX3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKKwkJZWxzZQorCQkJcmV0ID0gbmV3X3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOwogCQlpZiAocmV0ID4gMCkgewogCQkJZnNub3RpZnlfYWNjZXNzKGZpbGUpOwogCQkJYWRkX3JjaGFyKGN1cnJlbnQsIHJldCk7CkBAIC00MzksMTMgKzQ2MywzNCBAQAogCiBFWFBPUlRfU1lNQk9MKGRvX3N5bmNfd3JpdGUpOwogCitzc2l6ZV90IG5ld19zeW5jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYnVmLCAuaW92X2xlbiA9IGxlbiB9OworCXN0cnVjdCBraW9jYiBraW9jYjsKKwlzdHJ1Y3QgaW92X2l0ZXIgaXRlcjsKKwlzc2l6ZV90IHJldDsKKworCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbHApOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCWtpb2NiLmtpX25ieXRlcyA9IGxlbjsKKwlpb3ZfaXRlcl9pbml0KCZpdGVyLCBXUklURSwgJmlvdiwgMSwgbGVuKTsKKworCXJldCA9IGZpbHAtPmZfb3AtPndyaXRlX2l0ZXIoJmtpb2NiLCAmaXRlcik7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOworCSpwcG9zID0ga2lvY2Iua2lfcG9zOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0wobmV3X3N5bmNfd3JpdGUpOworCiBzc2l6ZV90IF9fa2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKIAljb25zdCBjaGFyIF9fdXNlciAqcDsKIAlzc2l6ZV90IHJldDsKIAotCWlmICghZmlsZS0+Zl9vcC0+d3JpdGUgJiYgIWZpbGUtPmZfb3AtPmFpb193cml0ZSkKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9DQU5fV1JJVEUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9sZF9mcyA9IGdldF9mcygpOwpAQCAtNDU1LDggKzUwMCwxMCBAQAogCQljb3VudCA9ICBNQVhfUldfQ09VTlQ7CiAJaWYgKGZpbGUtPmZfb3AtPndyaXRlKQogCQlyZXQgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBwLCBjb3VudCwgcG9zKTsKLQllbHNlCisJZWxzZSBpZiAoZmlsZS0+Zl9vcC0+YWlvX3dyaXRlKQogCQlyZXQgPSBkb19zeW5jX3dyaXRlKGZpbGUsIHAsIGNvdW50LCBwb3MpOworCWVsc2UKKwkJcmV0ID0gbmV3X3N5bmNfd3JpdGUoZmlsZSwgcCwgY291bnQsIHBvcyk7CiAJc2V0X2ZzKG9sZF9mcyk7CiAJaWYgKHJldCA+IDApIHsKIAkJZnNub3RpZnlfbW9kaWZ5KGZpbGUpOwpAQCAtNDcyLDcgKzUxOSw3IEBACiAKIAlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCXJldHVybiAtRUJBREY7Ci0JaWYgKCFmaWxlLT5mX29wLT53cml0ZSAmJiAhZmlsZS0+Zl9vcC0+YWlvX3dyaXRlKQorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9XUklURSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDgzLDggKzUzMCwxMCBAQAogCQlmaWxlX3N0YXJ0X3dyaXRlKGZpbGUpOwogCQlpZiAoZmlsZS0+Zl9vcC0+d3JpdGUpCiAJCQlyZXQgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOwotCQllbHNlCisJCWVsc2UgaWYgKGZpbGUtPmZfb3AtPmFpb193cml0ZSkKIAkJCXJldCA9IGRvX3N5bmNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKKwkJZWxzZQorCQkJcmV0ID0gbmV3X3N5bmNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKIAkJaWYgKHJldCA+IDApIHsKIAkJCWZzbm90aWZ5X21vZGlmeShmaWxlKTsKIAkJCWFkZF93Y2hhcihjdXJyZW50LCByZXQpOwpAQCAtNjAxLDYgKzY1MCwyNSBAQAogfQogRVhQT1JUX1NZTUJPTChpb3Zfc2hvcnRlbik7CiAKK3N0YXRpYyBzc2l6ZV90IGRvX2l0ZXJfcmVhZHZfd3JpdGV2KHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgcncsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcywgaXRlcl9mbl90IGZuKQoreworCXN0cnVjdCBraW9jYiBraW9jYjsKKwlzdHJ1Y3QgaW92X2l0ZXIgaXRlcjsKKwlzc2l6ZV90IHJldDsKKworCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbHApOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCWtpb2NiLmtpX25ieXRlcyA9IGxlbjsKKworCWlvdl9pdGVyX2luaXQoJml0ZXIsIHJ3LCBpb3YsIG5yX3NlZ3MsIGxlbik7CisJcmV0ID0gZm4oJmtpb2NiLCAmaXRlcik7CisJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOworCSpwcG9zID0ga2lvY2Iua2lfcG9zOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGRvX3N5bmNfcmVhZHZfd3JpdGV2KHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MsIGlvdl9mbl90IGZuKQogewpAQCAtNzM4LDYgKzgwNiw3IEBACiAJc3NpemVfdCByZXQ7CiAJaW9fZm5fdCBmbjsKIAlpb3ZfZm5fdCBmbnY7CisJaXRlcl9mbl90IGl0ZXJfZm47CiAKIAlyZXQgPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IodHlwZSwgdXZlY3RvciwgbnJfc2VncywKIAkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKQEAgLTc1MywxMyArODIyLDE4IEBACiAJaWYgKHR5cGUgPT0gUkVBRCkgewogCQlmbiA9IGZpbGUtPmZfb3AtPnJlYWQ7CiAJCWZudiA9IGZpbGUtPmZfb3AtPmFpb19yZWFkOworCQlpdGVyX2ZuID0gZmlsZS0+Zl9vcC0+cmVhZF9pdGVyOwogCX0gZWxzZSB7CiAJCWZuID0gKGlvX2ZuX3QpZmlsZS0+Zl9vcC0+d3JpdGU7CiAJCWZudiA9IGZpbGUtPmZfb3AtPmFpb193cml0ZTsKKwkJaXRlcl9mbiA9IGZpbGUtPmZfb3AtPndyaXRlX2l0ZXI7CiAJCWZpbGVfc3RhcnRfd3JpdGUoZmlsZSk7CiAJfQogCi0JaWYgKGZudikKKwlpZiAoaXRlcl9mbikKKwkJcmV0ID0gZG9faXRlcl9yZWFkdl93cml0ZXYoZmlsZSwgdHlwZSwgaW92LCBucl9zZWdzLCB0b3RfbGVuLAorCQkJCQkJcG9zLCBpdGVyX2ZuKTsKKwllbHNlIGlmIChmbnYpCiAJCXJldCA9IGRvX3N5bmNfcmVhZHZfd3JpdGV2KGZpbGUsIGlvdiwgbnJfc2VncywgdG90X2xlbiwKIAkJCQkJCXBvcywgZm52KTsKIAllbHNlCkBAIC03ODUsNyArODU5LDcgQEAKIHsKIAlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKIAkJcmV0dXJuIC1FQkFERjsKLQlpZiAoIWZpbGUtPmZfb3AtPmFpb19yZWFkICYmICFmaWxlLT5mX29wLT5yZWFkKQorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9SRUFEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gZG9fcmVhZHZfd3JpdGV2KFJFQUQsIGZpbGUsIHZlYywgdmxlbiwgcG9zKTsKQEAgLTc5OCw3ICs4NzIsNyBAQAogewogCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJcmV0dXJuIC1FQkFERjsKLQlpZiAoIWZpbGUtPmZfb3AtPmFpb193cml0ZSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfQ0FOX1dSSVRFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gZG9fcmVhZHZfd3JpdGV2KFdSSVRFLCBmaWxlLCB2ZWMsIHZsZW4sIHBvcyk7CkBAIC05MTIsNiArOTg2LDcgQEAKIAlzc2l6ZV90IHJldDsKIAlpb19mbl90IGZuOwogCWlvdl9mbl90IGZudjsKKwlpdGVyX2ZuX3QgaXRlcl9mbjsKIAogCXJldCA9IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IodHlwZSwgdXZlY3RvciwgbnJfc2VncywKIAkJCQkJICAgICAgIFVJT19GQVNUSU9WLCBpb3ZzdGFjaywgJmlvdik7CkBAIC05MjcsMTMgKzEwMDIsMTggQEAKIAlpZiAodHlwZSA9PSBSRUFEKSB7CiAJCWZuID0gZmlsZS0+Zl9vcC0+cmVhZDsKIAkJZm52ID0gZmlsZS0+Zl9vcC0+YWlvX3JlYWQ7CisJCWl0ZXJfZm4gPSBmaWxlLT5mX29wLT5yZWFkX2l0ZXI7CiAJfSBlbHNlIHsKIAkJZm4gPSAoaW9fZm5fdClmaWxlLT5mX29wLT53cml0ZTsKIAkJZm52ID0gZmlsZS0+Zl9vcC0+YWlvX3dyaXRlOworCQlpdGVyX2ZuID0gZmlsZS0+Zl9vcC0+d3JpdGVfaXRlcjsKIAkJZmlsZV9zdGFydF93cml0ZShmaWxlKTsKIAl9CiAKLQlpZiAoZm52KQorCWlmIChpdGVyX2ZuKQorCQlyZXQgPSBkb19pdGVyX3JlYWR2X3dyaXRldihmaWxlLCB0eXBlLCBpb3YsIG5yX3NlZ3MsIHRvdF9sZW4sCisJCQkJCQlwb3MsIGl0ZXJfZm4pOworCWVsc2UgaWYgKGZudikKIAkJcmV0ID0gZG9fc3luY19yZWFkdl93cml0ZXYoZmlsZSwgaW92LCBucl9zZWdzLCB0b3RfbGVuLAogCQkJCQkJcG9zLCBmbnYpOwogCWVsc2UKQEAgLTk2NCw3ICsxMDQ0LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRUlOVkFMOwotCWlmICghZmlsZS0+Zl9vcC0+YWlvX3JlYWQgJiYgIWZpbGUtPmZfb3AtPnJlYWQpCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfQ0FOX1JFQUQpKQogCQlnb3RvIG91dDsKIAogCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoUkVBRCwgZmlsZSwgdmVjLCB2bGVuLCBwb3MpOwpAQCAtMTA0MSw3ICsxMTIxLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRUlOVkFMOwotCWlmICghZmlsZS0+Zl9vcC0+YWlvX3dyaXRlICYmICFmaWxlLT5mX29wLT53cml0ZSkKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9DQU5fV1JJVEUpKQogCQlnb3RvIG91dDsKIAogCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoV1JJVEUsIGZpbGUsIHZlYywgdmxlbiwgcG9zKTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCA1ZjZjMzJjLi5kYjllODBiIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC0yNDMsOCArMjQzLDggQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQgPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlID0gZG9fc3luY193cml0ZSwKKwkucmVhZCA9IG5ld19zeW5jX3JlYWQsCisJLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCiAJLnVubG9ja2VkX2lvY3RsID0gcmVpc2VyZnNfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwgPSByZWlzZXJmc19jb21wYXRfaW9jdGwsCkBAIC0yNTMsMTAgKzI1MywxMCBAQAogCS5vcGVuID0gcmVpc2VyZnNfZmlsZV9vcGVuLAogCS5yZWxlYXNlID0gcmVpc2VyZnNfZmlsZV9yZWxlYXNlLAogCS5mc3luYyA9IHJlaXNlcmZzX3N5bmNfZmlsZSwKLQkuYWlvX3JlYWQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZSA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWRfaXRlciA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkuc3BsaWNlX3JlYWQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZSA9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV93cml0ZSA9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCBlM2NhMDQ4Li42M2IyYjBlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTMyNzksMTUgKzMyNzksMTUgQEAKICAqIHRvIGRvIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZS4KICAqLwogc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQkJCSAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkJICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKLQkJCQkgIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpdGVyLCBvZmZzZXQsCisJCQkJIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvKTsKIAogCS8qCiAJICogSW4gY2FzZSBvZiBlcnJvciBleHRlbmRpbmcgd3JpdGUgbWF5IGhhdmUgaW5zdGFudGlhdGVkIGEgZmV3CkBAIC0zMjk1LDcgKzMyOTUsNyBAQAogCSAqLwogCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKIAkJbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgY291bnQ7CiAKIAkJaWYgKChlbmQgPiBpc2l6ZSkgJiYgaW5vZGVfbmV3c2l6ZV9vayhpbm9kZSwgaXNpemUpID09IDApIHsKIAkJCXRydW5jYXRlX3NldHNpemUoaW5vZGUsIGlzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL21tYXAtbm9tbXUuYyBiL2ZzL3JvbWZzL21tYXAtbm9tbXUuYwppbmRleCBmMzczYmRlLi5lYTA2Yzc1IDEwMDY0NAotLS0gYS9mcy9yb21mcy9tbWFwLW5vbW11LmMKKysrIGIvZnMvcm9tZnMvbW1hcC1ub21tdS5jCkBAIC03Miw4ICs3Miw4IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm9tZnNfcm9fZm9wcyA9IHsKIAkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCQk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkucmVhZAkJCT0gbmV3X3N5bmNfcmVhZCwKKwkucmVhZF9pdGVyCQk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLnNwbGljZV9yZWFkCQk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkubW1hcAkJCT0gcm9tZnNfbW1hcCwKIAkuZ2V0X3VubWFwcGVkX2FyZWEJPSByb21mc19nZXRfdW5tYXBwZWRfYXJlYSwKZGlmZiAtLWdpdCBhL2ZzL3NwbGljZS5jIGIvZnMvc3BsaWNlLmMKaW5kZXggZTI0Njk1NC4uZjVjYjliYSAxMDA2NDQKLS0tIGEvZnMvc3BsaWNlLmMKKysrIGIvZnMvc3BsaWNlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKgpAQCAtNzE3LDYzICs3MTgsNiBAQAogCQkJCSAgICBzZC0+bGVuLCAmcG9zLCBtb3JlKTsKIH0KIAotLyoKLSAqIFRoaXMgaXMgYSBsaXR0bGUgbW9yZSB0cmlja3kgdGhhbiB0aGUgZmlsZSAtPiBwaXBlIHNwbGljaW5nLiBUaGVyZSBhcmUKLSAqIGJhc2ljYWxseSB0aHJlZSBjYXNlczoKLSAqCi0gKgktIERlc3RpbmF0aW9uIHBhZ2UgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHRoZXJlCi0gKgkgIGFyZSB1c2VycyBvZiBpdC4gRm9yIHRoYXQgY2FzZSB3ZSBoYXZlIG5vIG90aGVyIG9wdGlvbiB0aGF0Ci0gKgkgIGNvcHlpbmcgdGhlIGRhdGEuIFRvdWdoIGx1Y2suCi0gKgktIERlc3RpbmF0aW9uIHBhZ2UgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFkZHJlc3Mgc3BhY2UsIGJ1dCB0aGVyZQotICoJICBhcmUgbm8gdXNlcnMgb2YgaXQuIE1ha2Ugc3VyZSBpdCdzIHVwdG9kYXRlLCB0aGVuIGRyb3AgaXQuIEZhbGwKLSAqCSAgdGhyb3VnaCB0byBsYXN0IGNhc2UuCi0gKgktIERlc3RpbmF0aW9uIHBhZ2UgZG9lcyBub3QgZXhpc3QsIHdlIGNhbiBhZGQgdGhlIHBpcGUgcGFnZSB0bwotICoJICB0aGUgcGFnZSBjYWNoZSBhbmQgYXZvaWQgdGhlIGNvcHkuCi0gKgotICogSWYgYXNrZWQgdG8gbW92ZSBwYWdlcyB0byB0aGUgb3V0cHV0IGZpbGUgKFNQTElDRV9GX01PVkUgaXMgc2V0IGluCi0gKiBzZC0+ZmxhZ3MpLCB3ZSBhdHRlbXB0IHRvIG1pZ3JhdGUgcGFnZXMgZnJvbSB0aGUgcGlwZSB0byB0aGUgb3V0cHV0Ci0gKiBmaWxlIGFkZHJlc3Mgc3BhY2UgcGFnZSBjYWNoZS4gVGhpcyBpcyBwb3NzaWJsZSBpZiBubyBvbmUgZWxzZSBoYXMKLSAqIHRoZSBwaXBlIHBhZ2UgcmVmZXJlbmNlZCBvdXRzaWRlIG9mIHRoZSBwaXBlIGFuZCBwYWdlIGNhY2hlLiBJZgotICogU1BMSUNFX0ZfTU9WRSBpc24ndCBzZXQsIG9yIHdlIGNhbm5vdCBtb3ZlIHRoZSBwYWdlLCB3ZSBzaW1wbHkgY3JlYXRlCi0gKiBhIG5ldyBwYWdlIGluIHRoZSBvdXRwdXQgZmlsZSBwYWdlIGNhY2hlIGFuZCBmaWxsL2RpcnR5IHRoYXQuCi0gKi8KLWludCBwaXBlX3RvX2ZpbGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCi0JCSBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gc2QtPnUuZmlsZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB0aGlzX2xlbjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICpmc2RhdGE7Ci0JaW50IHJldDsKLQotCW9mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwotCi0JdGhpc19sZW4gPSBzZC0+bGVuOwotCWlmICh0aGlzX2xlbiArIG9mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKLQkJdGhpc19sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7Ci0KLQlyZXQgPSBwYWdlY2FjaGVfd3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgc2QtPnBvcywgdGhpc19sZW4sCi0JCQkJQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFLCAmcGFnZSwgJmZzZGF0YSk7Ci0JaWYgKHVubGlrZWx5KHJldCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGJ1Zi0+cGFnZSAhPSBwYWdlKSB7Ci0JCWNoYXIgKnNyYyA9IGttYXBfYXRvbWljKGJ1Zi0+cGFnZSk7Ci0JCWNoYXIgKmRzdCA9IGttYXBfYXRvbWljKHBhZ2UpOwotCi0JCW1lbWNweShkc3QgKyBvZmZzZXQsIHNyYyArIGJ1Zi0+b2Zmc2V0LCB0aGlzX2xlbik7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQlrdW5tYXBfYXRvbWljKGRzdCk7Ci0JCWt1bm1hcF9hdG9taWMoc3JjKTsKLQl9Ci0JcmV0ID0gcGFnZWNhY2hlX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBzZC0+cG9zLCB0aGlzX2xlbiwgdGhpc19sZW4sCi0JCQkJcGFnZSwgZnNkYXRhKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChwaXBlX3RvX2ZpbGUpOwotCiBzdGF0aWMgdm9pZCB3YWtldXBfcGlwZV93cml0ZXJzKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUpCiB7CiAJc21wX21iKCk7CkBAIC04MDIsNyArNzQ2LDcgQEAKICAqICAgIGxvY2tpbmcgaXMgcmVxdWlyZWQgYXJvdW5kIGNvcHlpbmcgdGhlIHBpcGUgYnVmZmVycyB0byB0aGUKICAqICAgIGRlc3RpbmF0aW9uLgogICovCi1pbnQgc3BsaWNlX2Zyb21fcGlwZV9mZWVkKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QsCitzdGF0aWMgaW50IHNwbGljZV9mcm9tX3BpcGVfZmVlZChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkLAogCQkJICBzcGxpY2VfYWN0b3IgKmFjdG9yKQogewogCWludCByZXQ7CkBAIC04NDksNyArNzkzLDYgQEAKIAogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChzcGxpY2VfZnJvbV9waXBlX2ZlZWQpOwogCiAvKioKICAqIHNwbGljZV9mcm9tX3BpcGVfbmV4dCAtIHdhaXQgZm9yIHNvbWUgZGF0YSB0byBzcGxpY2UgZnJvbQpAQCAtODYxLDcgKzgwNCw3IEBACiAgKiAgICB2YWx1ZSAob25lKSBpZiBwaXBlIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZS4gIEl0IHdpbGwgcmV0dXJuIHplcm8KICAqICAgIG9yIC1lcnJubyBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgc3BsaWNlZC4KICAqLwotaW50IHNwbGljZV9mcm9tX3BpcGVfbmV4dChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQorc3RhdGljIGludCBzcGxpY2VfZnJvbV9waXBlX25leHQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHNwbGljZV9kZXNjICpzZCkKIHsKIAl3aGlsZSAoIXBpcGUtPm5yYnVmcykgewogCQlpZiAoIXBpcGUtPndyaXRlcnMpCkBAIC04ODYsNyArODI5LDYgQEAKIAogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChzcGxpY2VfZnJvbV9waXBlX25leHQpOwogCiAvKioKICAqIHNwbGljZV9mcm9tX3BpcGVfYmVnaW4gLSBzdGFydCBzcGxpY2luZyBmcm9tIHBpcGUKQEAgLTg5NywxMiArODM5LDExIEBACiAgKiAgICBzcGxpY2VfZnJvbV9waXBlX25leHQoKSBhbmQgc3BsaWNlX2Zyb21fcGlwZV9mZWVkKCkgdG8KICAqICAgIGluaXRpYWxpemUgdGhlIG5lY2Vzc2FyeSBmaWVsZHMgb2YgQHNkLgogICovCi12b2lkIHNwbGljZV9mcm9tX3BpcGVfYmVnaW4oc3RydWN0IHNwbGljZV9kZXNjICpzZCkKK3N0YXRpYyB2b2lkIHNwbGljZV9mcm9tX3BpcGVfYmVnaW4oc3RydWN0IHNwbGljZV9kZXNjICpzZCkKIHsKIAlzZC0+bnVtX3NwbGljZWQgPSAwOwogCXNkLT5uZWVkX3dha2V1cCA9IGZhbHNlOwogfQotRVhQT1JUX1NZTUJPTChzcGxpY2VfZnJvbV9waXBlX2JlZ2luKTsKIAogLyoqCiAgKiBzcGxpY2VfZnJvbV9waXBlX2VuZCAtIGZpbmlzaCBzcGxpY2luZyBmcm9tIHBpcGUKQEAgLTkxNCwxMiArODU1LDExIEBACiAgKiAgICBiZSBjYWxsZWQgYWZ0ZXIgYSBsb29wIGNvbnRhaW5pbmcgc3BsaWNlX2Zyb21fcGlwZV9uZXh0KCkgYW5kCiAgKiAgICBzcGxpY2VfZnJvbV9waXBlX2ZlZWQoKS4KICAqLwotdm9pZCBzcGxpY2VfZnJvbV9waXBlX2VuZChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQorc3RhdGljIHZvaWQgc3BsaWNlX2Zyb21fcGlwZV9lbmQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHNwbGljZV9kZXNjICpzZCkKIHsKIAlpZiAoc2QtPm5lZWRfd2FrZXVwKQogCQl3YWtldXBfcGlwZV93cml0ZXJzKHBpcGUpOwogfQotRVhQT1JUX1NZTUJPTChzcGxpY2VfZnJvbV9waXBlX2VuZCk7CiAKIC8qKgogICogX19zcGxpY2VfZnJvbV9waXBlIC0gc3BsaWNlIGRhdGEgZnJvbSBhIHBpcGUgdG8gZ2l2ZW4gYWN0b3IKQEAgLTk4NSw3ICs5MjUsNyBAQAogfQogCiAvKioKLSAqIGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUgLSBzcGxpY2UgZGF0YSBmcm9tIGEgcGlwZSB0byBhIGZpbGUKKyAqIGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUgLSBzcGxpY2UgZGF0YSBmcm9tIGEgcGlwZSB0byBhIGZpbGUKICAqIEBwaXBlOglwaXBlIGluZm8KICAqIEBvdXQ6CWZpbGUgdG8gd3JpdGUgdG8KICAqIEBwcG9zOglwb3NpdGlvbiBpbiBAb3V0CkBAIC05OTUsNDAgKzkzNSwxMjIgQEAKICAqIERlc2NyaXB0aW9uOgogICogICAgV2lsbCBlaXRoZXIgbW92ZSBvciBjb3B5IHBhZ2VzIChkZXRlcm1pbmVkIGJ5IEBmbGFncyBvcHRpb25zKSBmcm9tCiAgKiAgICB0aGUgZ2l2ZW4gcGlwZSBpbm9kZSB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAqICAgIFRoaXMgb25lIGlzIC0+d3JpdGVfaXRlci1iYXNlZC4KICAqCiAgKi8KIHNzaXplX3QKLWdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKK2l0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKIAkJCSAgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvdXQtPmZfbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3Qgc3BsaWNlX2Rlc2Mgc2QgPSB7CiAJCS50b3RhbF9sZW4gPSBsZW4sCiAJCS5mbGFncyA9IGZsYWdzLAogCQkucG9zID0gKnBwb3MsCiAJCS51LmZpbGUgPSBvdXQsCiAJfTsKKwlpbnQgbmJ1ZnMgPSBwaXBlLT5idWZmZXJzOworCXN0cnVjdCBiaW9fdmVjICphcnJheSA9IGtjYWxsb2MobmJ1ZnMsIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYyksCisJCQkJCUdGUF9LRVJORUwpOwogCXNzaXplX3QgcmV0OwogCisJaWYgKHVubGlrZWx5KCFhcnJheSkpCisJCXJldHVybiAtRU5PTUVNOworCiAJcGlwZV9sb2NrKHBpcGUpOwogCiAJc3BsaWNlX2Zyb21fcGlwZV9iZWdpbigmc2QpOwotCWRvIHsKKwl3aGlsZSAoc2QudG90YWxfbGVuKSB7CisJCXN0cnVjdCBpb3ZfaXRlciBmcm9tOworCQlzdHJ1Y3Qga2lvY2Iga2lvY2I7CisJCXNpemVfdCBsZWZ0OworCQlpbnQgbiwgaWR4OworCiAJCXJldCA9IHNwbGljZV9mcm9tX3BpcGVfbmV4dChwaXBlLCAmc2QpOwogCQlpZiAocmV0IDw9IDApCiAJCQlicmVhazsKIAotCQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOwotCQlyZXQgPSBmaWxlX3JlbW92ZV9zdWlkKG91dCk7Ci0JCWlmICghcmV0KSB7Ci0JCQlyZXQgPSBmaWxlX3VwZGF0ZV90aW1lKG91dCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSBzcGxpY2VfZnJvbV9waXBlX2ZlZWQocGlwZSwgJnNkLAotCQkJCQkJCSAgICBwaXBlX3RvX2ZpbGUpOworCQlpZiAodW5saWtlbHkobmJ1ZnMgPCBwaXBlLT5idWZmZXJzKSkgeworCQkJa2ZyZWUoYXJyYXkpOworCQkJbmJ1ZnMgPSBwaXBlLT5idWZmZXJzOworCQkJYXJyYXkgPSBrY2FsbG9jKG5idWZzLCBzaXplb2Yoc3RydWN0IGJpb192ZWMpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghYXJyYXkpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQogCQl9Ci0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCX0gd2hpbGUgKHJldCA+IDApOworCisJCS8qIGJ1aWxkIHRoZSB2ZWN0b3IgKi8KKwkJbGVmdCA9IHNkLnRvdGFsX2xlbjsKKwkJZm9yIChuID0gMCwgaWR4ID0gcGlwZS0+Y3VyYnVmOyBsZWZ0ICYmIG4gPCBwaXBlLT5ucmJ1ZnM7IG4rKywgaWR4KyspIHsKKwkJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gcGlwZS0+YnVmcyArIGlkeDsKKwkJCXNpemVfdCB0aGlzX2xlbiA9IGJ1Zi0+bGVuOworCisJCQlpZiAodGhpc19sZW4gPiBsZWZ0KQorCQkJCXRoaXNfbGVuID0gbGVmdDsKKworCQkJaWYgKGlkeCA9PSBwaXBlLT5idWZmZXJzIC0gMSkKKwkJCQlpZHggPSAtMTsKKworCQkJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJaWYgKHJldCA9PSAtRU5PREFUQSkKKwkJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCWFycmF5W25dLmJ2X3BhZ2UgPSBidWYtPnBhZ2U7CisJCQlhcnJheVtuXS5idl9sZW4gPSB0aGlzX2xlbjsKKwkJCWFycmF5W25dLmJ2X29mZnNldCA9IGJ1Zi0+b2Zmc2V0OworCQkJbGVmdCAtPSB0aGlzX2xlbjsKKwkJfQorCisJCS8qIC4uLiBpb3ZfaXRlciAqLworCQlmcm9tLnR5cGUgPSBJVEVSX0JWRUMgfCBXUklURTsKKwkJZnJvbS5idmVjID0gYXJyYXk7CisJCWZyb20ubnJfc2VncyA9IG47CisJCWZyb20uY291bnQgPSBzZC50b3RhbF9sZW4gLSBsZWZ0OworCQlmcm9tLmlvdl9vZmZzZXQgPSAwOworCisJCS8qIC4uLiBhbmQgaW9jYiAqLworCQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBvdXQpOworCQlraW9jYi5raV9wb3MgPSBzZC5wb3M7CisJCWtpb2NiLmtpX25ieXRlcyA9IHNkLnRvdGFsX2xlbiAtIGxlZnQ7CisKKwkJLyogbm93LCBzZW5kIGl0ICovCisJCXJldCA9IG91dC0+Zl9vcC0+d3JpdGVfaXRlcigma2lvY2IsICZmcm9tKTsKKwkJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoJmtpb2NiKTsKKworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKworCQlzZC5udW1fc3BsaWNlZCArPSByZXQ7CisJCXNkLnRvdGFsX2xlbiAtPSByZXQ7CisJCSpwcG9zID0gc2QucG9zID0ga2lvY2Iua2lfcG9zOworCisJCS8qIGRpc21pc3MgdGhlIGZ1bGx5IGVhdGVuIGJ1ZmZlcnMsIGFkanVzdCB0aGUgcGFydGlhbCBvbmUgKi8KKwkJd2hpbGUgKHJldCkgeworCQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBwaXBlLT5idWZzICsgcGlwZS0+Y3VyYnVmOworCQkJaWYgKHJldCA+PSBidWYtPmxlbikgeworCQkJCWNvbnN0IHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zICpvcHMgPSBidWYtPm9wczsKKwkJCQlyZXQgLT0gYnVmLT5sZW47CisJCQkJYnVmLT5sZW4gPSAwOworCQkJCWJ1Zi0+b3BzID0gTlVMTDsKKwkJCQlvcHMtPnJlbGVhc2UocGlwZSwgYnVmKTsKKwkJCQlwaXBlLT5jdXJidWYgPSAocGlwZS0+Y3VyYnVmICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOworCQkJCXBpcGUtPm5yYnVmcy0tOworCQkJCWlmIChwaXBlLT5maWxlcykKKwkJCQkJc2QubmVlZF93YWtldXAgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlidWYtPm9mZnNldCArPSByZXQ7CisJCQkJYnVmLT5sZW4gLT0gcmV0OworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwl9Citkb25lOgorCWtmcmVlKGFycmF5KTsKIAlzcGxpY2VfZnJvbV9waXBlX2VuZChwaXBlLCAmc2QpOwogCiAJcGlwZV91bmxvY2socGlwZSk7CkBAIC0xMDM2LDIxICsxMDU4LDEwIEBACiAJaWYgKHNkLm51bV9zcGxpY2VkKQogCQlyZXQgPSBzZC5udW1fc3BsaWNlZDsKIAotCWlmIChyZXQgPiAwKSB7Ci0JCWludCBlcnI7Ci0KLQkJZXJyID0gZ2VuZXJpY193cml0ZV9zeW5jKG91dCwgKnBwb3MsIHJldCk7Ci0JCWlmIChlcnIpCi0JCQlyZXQgPSBlcnI7Ci0JCWVsc2UKLQkJCSpwcG9zICs9IHJldDsKLQkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChtYXBwaW5nKTsKLQl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCi1FWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUpOworRVhQT1JUX1NZTUJPTChpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlKTsKIAogc3RhdGljIGludCB3cml0ZV9waXBlX2J1ZihzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiwKIAkJCSAgc3RydWN0IHNwbGljZV9kZXNjICpzZCkKQEAgLTE1NDksNyArMTU2MCw3IEBACiAJCWdvdG8gb3V0OwogCiAJY291bnQgPSByZXQ7Ci0JaW92X2l0ZXJfaW5pdCgmaXRlciwgaW92LCBucl9zZWdzLCBjb3VudCwgMCk7CisJaW92X2l0ZXJfaW5pdCgmaXRlciwgUkVBRCwgaW92LCBucl9zZWdzLCBjb3VudCk7CiAKIAlzZC5sZW4gPSAwOwogCXNkLnRvdGFsX2xlbiA9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9maWxlLmMgYi9mcy9zeXN2L2ZpbGUuYwppbmRleCA5ZDRkYzY4My4uYjAwODExYyAxMDA2NDQKLS0tIGEvZnMvc3lzdi9maWxlLmMKKysrIGIvZnMvc3lzdi9maWxlLmMKQEAgLTIxLDEwICsyMSwxMCBAQAogICovCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLmZzeW5jCQk9IGdlbmVyaWNfZmlsZV9mc3luYywKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9maWxlLmMgYi9mcy91Ymlmcy9maWxlLmMKaW5kZXggMGFiN2Y3ZC4uYjViNTkzYyAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZmlsZS5jCisrKyBiL2ZzL3ViaWZzL2ZpbGUuYwpAQCAtMTM2NCwxNyArMTM2NCwxNyBAQAogCiAvKioKICAqIHVwZGF0ZV9jdGltZSAtIHVwZGF0ZSBtdGltZSBhbmQgY3RpbWUgb2YgYW4gaW5vZGUuCi0gKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAaW5vZGU6IGlub2RlIHRvIHVwZGF0ZQogICoKICAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBtdGltZSBhbmQgY3RpbWUgb2YgdGhlIGlub2RlIGlmIGl0IGlzIG5vdCBlcXVpdmFsZW50IHRvCiAgKiBjdXJyZW50IHRpbWUuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgogICogY2FzZSBvZiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IHVwZGF0ZV9tY3RpbWUoc3RydWN0IHViaWZzX2luZm8gKmMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IHVwZGF0ZV9tY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93ID0gdWJpZnNfY3VycmVudF90aW1lKGlub2RlKTsKIAlzdHJ1Y3QgdWJpZnNfaW5vZGUgKnVpID0gdWJpZnNfaW5vZGUoaW5vZGUpOworCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKIAogCWlmIChtY3RpbWVfdXBkYXRlX25lZWRlZChpbm9kZSwgJm5vdykpIHsKIAkJaW50IGVyciwgcmVsZWFzZTsKQEAgLTEzOTcsMTggKzEzOTcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgdWJpZnNfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgdWJpZnNfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHViaWZzX2luZm8gKmMgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOwotCi0JZXJyID0gdXBkYXRlX21jdGltZShjLCBpbm9kZSk7CisJaW50IGVyciA9IHVwZGF0ZV9tY3RpbWUoZmlsZV9pbm9kZShpb2NiLT5raV9maWxwKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoaW9jYiwgZnJvbSk7CiB9CiAKIHN0YXRpYyBpbnQgdWJpZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xNTgyLDE1ICsxNTc3LDE1IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsgICAgICAgICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQgICAgICAgICAgID0gZG9fc3luY19yZWFkLAotCS53cml0ZSAgICAgICAgICA9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb19yZWFkICAgICAgID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUgICAgICA9IHViaWZzX2Fpb193cml0ZSwKKwkucmVhZCAgICAgICAgICAgPSBuZXdfc3luY19yZWFkLAorCS53cml0ZSAgICAgICAgICA9IG5ld19zeW5jX3dyaXRlLAorCS5yZWFkX2l0ZXIgICAgICA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgICAgID0gdWJpZnNfd3JpdGVfaXRlciwKIAkubW1hcCAgICAgICAgICAgPSB1Ymlmc19maWxlX21tYXAsCiAJLmZzeW5jICAgICAgICAgID0gdWJpZnNfZnN5bmMsCiAJLnVubG9ja2VkX2lvY3RsID0gdWJpZnNfaW9jdGwsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAorCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsICAgPSB1Ymlmc19jb21wYXRfaW9jdGwsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3VkZi9maWxlLmMgYi9mcy91ZGYvZmlsZS5jCmluZGV4IGQyYzE3MGYuLmQ4MDczOGYgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9maWxlLmMKKysrIGIvZnMvdWRmL2ZpbGUuYwpAQCAtMTE5LDggKzExOSw4IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IHVkZl9hZGluaWNiX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCSAgICAgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQkJCSAgICAgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQkJCSAgICAgbG9mZl90IG9mZnNldCkKIHsKIAkvKiBGYWxsYmFjayB0byBidWZmZXJlZCBJL08uICovCiAJcmV0dXJuIDA7CkBAIC0xMzQsOCArMTM0LDcgQEAKIAkuZGlyZWN0X0lPCT0gdWRmX2FkaW5pY2JfZGlyZWN0X0lPLAogfTsKIAotc3RhdGljIHNzaXplX3QgdWRmX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQorc3RhdGljIHNzaXplX3QgdWRmX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzc2l6ZV90IHJldHZhbDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC0xNTAsNyArMTQ5LDcgQEAKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkKIAkJCXBvcyA9IGlub2RlLT5pX3NpemU7CiAJCWVsc2UKLQkJCXBvcyA9IHBwb3M7CisJCQlwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAkJaWYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8CiAJCQkJKHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKwpAQCAtMTcxLDcgKzE3MCw3IEBACiAJfSBlbHNlCiAJCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAKLQlyZXR2YWwgPSBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzKTsKKwlyZXR2YWwgPSBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKGlvY2IsIGZyb20pOwogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYgKHJldHZhbCA+IDApIHsKQEAgLTI1MiwxMyArMjUxLDEzIEBACiB9CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRmX2ZpbGVfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAkJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLnJlYWQJCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgkJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS51bmxvY2tlZF9pb2N0bAkJPSB1ZGZfaW9jdGwsCiAJLm9wZW4JCQk9IGdlbmVyaWNfZmlsZV9vcGVuLAogCS5tbWFwCQkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKLQkud3JpdGUJCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQkJPSB1ZGZfZmlsZV9haW9fd3JpdGUsCisJLndyaXRlCQkJPSBuZXdfc3luY193cml0ZSwKKwkud3JpdGVfaXRlcgkJPSB1ZGZfZmlsZV93cml0ZV9pdGVyLAogCS5yZWxlYXNlCQk9IHVkZl9yZWxlYXNlX2ZpbGUsCiAJLmZzeW5jCQkJPSBnZW5lcmljX2ZpbGVfZnN5bmMsCiAJLnNwbGljZV9yZWFkCQk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL3VkZi9pbm9kZS5jIGIvZnMvdWRmL2lub2RlLmMKaW5kZXggNWQ2NDM3MC4uMjM2Y2Q0OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2lub2RlLmMKKysrIGIvZnMvdWRmL2lub2RlLmMKQEAgLTIxNywxOCArMjE3LDE4IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IHVkZl9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJICAgICBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkgICAgIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCSAgICAgbG9mZl90IG9mZnNldCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKLQkJCQkgIHVkZl9nZXRfYmxvY2spOworCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGl0ZXIsIG9mZnNldCwgdWRmX2dldF9ibG9jayk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDAgJiYgKHJ3ICYgV1JJVEUpKSkKLQkJdWRmX3dyaXRlX2ZhaWxlZChtYXBwaW5nLCBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncykpOworCQl1ZGZfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGNvdW50KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy91ZnMvZmlsZS5jIGIvZnMvdWZzL2ZpbGUuYwppbmRleCAzM2FmYTIwLi5jODRlYzAxIDEwMDY0NAotLS0gYS9mcy91ZnMvZmlsZS5jCisrKyBiL2ZzL3Vmcy9maWxlLmMKQEAgLTM1LDEwICszNSwxMCBAQAogIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCisJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLm9wZW4gICAgICAgICAgID0gZ2VuZXJpY19maWxlX29wZW4sCiAJLmZzeW5jCQk9IGdlbmVyaWNfZmlsZV9mc3luYywKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5jIGIvZnMveGZzL3hmc19hb3BzLmMKaW5kZXggZTMyNjQwZS4uZmFhZjcxNmUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5jCkBAIC0xNDg2LDkgKzE0ODYsOCBAQAogeGZzX3ZtX2RpcmVjdF9JTygKIAlpbnQJCQlydywKIAlzdHJ1Y3Qga2lvY2IJCSppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92LAotCWxvZmZfdAkJCW9mZnNldCwKLQl1bnNpZ25lZCBsb25nCQlucl9zZWdzKQorCXN0cnVjdCBpb3ZfaXRlcgkJKml0ZXIsCisJbG9mZl90CQkJb2Zmc2V0KQogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYgPSB4ZnNfZmluZF9iZGV2X2Zvcl9pbm9kZShpbm9kZSk7CkBAIC0xNDk2LDcgKzE0OTUsNyBAQAogCXNzaXplX3QJCQlyZXQ7CiAKIAlpZiAocncgJiBXUklURSkgewotCQlzaXplX3Qgc2l6ZSA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwkJc2l6ZV90IHNpemUgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAogCQkvKgogCQkgKiBXZSBjYW5ub3QgcHJlYWxsb2NhdGUgYSBzaXplIHVwZGF0ZSB0cmFuc2FjdGlvbiBoZXJlIGFzIHdlCkBAIC0xNTA4LDE3ICsxNTA3LDE1IEBACiAJCWlmIChvZmZzZXQgKyBzaXplID4gWEZTX0koaW5vZGUpLT5pX2QuZGlfc2l6ZSkKIAkJCWlvZW5kLT5pb19pc2RpcmVjdCA9IDE7CiAKLQkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBiZGV2LCBpb3YsCi0JCQkJCSAgICBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJCSAgICB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCisJCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgYmRldiwgaXRlciwKKwkJCQkJICAgIG9mZnNldCwgeGZzX2dldF9ibG9ja3NfZGlyZWN0LAogCQkJCQkgICAgeGZzX2VuZF9pb19kaXJlY3Rfd3JpdGUsIE5VTEwsCiAJCQkJCSAgICBESU9fQVNZTkNfRVhURU5EKTsKIAkJaWYgKHJldCAhPSAtRUlPQ0JRVUVVRUQgJiYgaW9jYi0+cHJpdmF0ZSkKIAkJCWdvdG8gb3V0X2Rlc3Ryb3lfaW9lbmQ7CiAJfSBlbHNlIHsKLQkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBiZGV2LCBpb3YsCi0JCQkJCSAgICBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJCSAgICB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCisJCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgYmRldiwgaXRlciwKKwkJCQkJICAgIG9mZnNldCwgeGZzX2dldF9ibG9ja3NfZGlyZWN0LAogCQkJCQkgICAgTlVMTCwgTlVMTCwgMCk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZpbGUuYyBiL2ZzL3hmcy94ZnNfZmlsZS5jCmluZGV4IDFiODE2MGQuLjFmNjY3NzlkNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlLmMKKysrIGIvZnMveGZzL3hmc19maWxlLmMKQEAgLTIyOSwzNCArMjI5LDI3IEBACiB9CiAKIFNUQVRJQyBzc2l6ZV90Ci14ZnNfZmlsZV9haW9fcmVhZCgKK3hmc19maWxlX3JlYWRfaXRlcigKIAlzdHJ1Y3Qga2lvY2IJCSppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92cCwKLQl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAotCWxvZmZfdAkJCXBvcykKKwlzdHJ1Y3QgaW92X2l0ZXIJCSp0bykKIHsKIAlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0Jc2l6ZV90CQkJc2l6ZSA9IDA7CisJc2l6ZV90CQkJc2l6ZSA9IGlvdl9pdGVyX2NvdW50KHRvKTsKIAlzc2l6ZV90CQkJcmV0ID0gMDsKIAlpbnQJCQlpb2ZsYWdzID0gMDsKIAl4ZnNfZnNpemVfdAkJbjsKKwlsb2ZmX3QJCQlwb3MgPSBpb2NiLT5raV9wb3M7CiAKIAlYRlNfU1RBVFNfSU5DKHhzX3JlYWRfY2FsbHMpOwogCi0JQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwotCiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpCiAJCWlvZmxhZ3MgfD0gSU9fSVNESVJFQ1Q7CiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX05PQ01USU1FKQogCQlpb2ZsYWdzIHw9IElPX0lOVklTOwogCi0JcmV0ID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3ZwLCAmbnJfc2VncywgJnNpemUsIFZFUklGWV9XUklURSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgewogCQl4ZnNfYnVmdGFyZ190CSp0YXJnZXQgPQogCQkJWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSA/CkBAIC0zMDksNyArMzAyLDcgQEAKIAogCXRyYWNlX3hmc19maWxlX3JlYWQoaXAsIHNpemUsIHBvcywgaW9mbGFncyk7CiAKLQlyZXQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92cCwgbnJfc2VncywgcG9zKTsKKwlyZXQgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKGlvY2IsIHRvKTsKIAlpZiAocmV0ID4gMCkKIAkJWEZTX1NUQVRTX0FERCh4c19yZWFkX2J5dGVzLCByZXQpOwogCkBAIC0zNTAsNDcgKzM0Myw2IEBACiB9CiAKIC8qCi0gKiB4ZnNfZmlsZV9zcGxpY2Vfd3JpdGUoKSBkb2VzIG5vdCB1c2UgeGZzX3J3X2lsb2NrKCkgYmVjYXVzZQotICogZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSgpIHRha2VzIHRoZSBpX211dGV4IGl0c2VsZi4gVGhpcywgaW4gdGhlb3J5LAotICogY291dWxkIGNhdXNlIGxvY2sgaW52ZXJzaW9ucyBiZXR3ZWVuIHRoZSBhaW9fd3JpdGUgcGF0aCBhbmQgdGhlIHNwbGljZSBwYXRoCi0gKiBpZiBzb21lb25lIGlzIGRvaW5nIGNvbmN1cnJlbnQgc3BsaWNlKDIpIGJhc2VkIHdyaXRlcyBhbmQgd3JpdGUoMikgYmFzZWQKLSAqIHdyaXRlcyB0byB0aGUgc2FtZSBpbm9kZS4gVGhlIG9ubHkgcmVhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gcmUtaW1wbGVtZW50Ci0gKiB0aGUgZ2VuZXJpYyBjb2RlIGhlcmUgd2l0aCBjb3JyZWN0IGxvY2tpbmcgb3JkZXJzLgotICovCi1TVEFUSUMgc3NpemVfdAoteGZzX2ZpbGVfc3BsaWNlX3dyaXRlKAotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8JKnBpcGUsCi0Jc3RydWN0IGZpbGUJCSpvdXRmaWxwLAotCWxvZmZfdAkJCSpwcG9zLAotCXNpemVfdAkJCWNvdW50LAotCXVuc2lnbmVkIGludAkJZmxhZ3MpCi17Ci0Jc3RydWN0IGlub2RlCQkqaW5vZGUgPSBvdXRmaWxwLT5mX21hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0JaW50CQkJaW9mbGFncyA9IDA7Ci0Jc3NpemVfdAkJCXJldDsKLQotCVhGU19TVEFUU19JTkMoeHNfd3JpdGVfY2FsbHMpOwotCi0JaWYgKG91dGZpbHAtPmZfbW9kZSAmIEZNT0RFX05PQ01USU1FKQotCQlpb2ZsYWdzIHw9IElPX0lOVklTOwotCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQotCQlyZXR1cm4gLUVJTzsKLQotCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKLQotCXRyYWNlX3hmc19maWxlX3NwbGljZV93cml0ZShpcCwgY291bnQsICpwcG9zLCBpb2ZsYWdzKTsKLQotCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUocGlwZSwgb3V0ZmlscCwgcHBvcywgY291bnQsIGZsYWdzKTsKLQlpZiAocmV0ID4gMCkKLQkJWEZTX1NUQVRTX0FERCh4c193cml0ZV9ieXRlcywgcmV0KTsKLQotCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGhhbmRsZSB6ZXJvaW5nIGFueSBzcGFjZSBpbiB0aGUgbGFzdCBibG9jayBvZiB0aGUKICAqIGZpbGUgdGhhdCBpcyBiZXlvbmQgdGhlIEVPRi4gIFdlIGRvIHRoaXMgc2luY2UgdGhlIHNpemUgaXMgYmVpbmcgaW5jcmVhc2VkCiAgKiB3aXRob3V0IHdyaXRpbmcgYW55dGhpbmcgdG8gdGhhdCBibG9jayBhbmQgd2UgZG9uJ3Qgd2FudCB0byByZWFkIHRoZQpAQCAtNjI1LDEwICs1NzcsNyBAQAogU1RBVElDIHNzaXplX3QKIHhmc19maWxlX2Rpb19haW9fd3JpdGUoCiAJc3RydWN0IGtpb2NiCQkqaW9jYiwKLQljb25zdCBzdHJ1Y3QgaW92ZWMJKmlvdnAsCi0JdW5zaWduZWQgbG9uZwkJbnJfc2VncywKLQlsb2ZmX3QJCQlwb3MsCi0Jc2l6ZV90CQkJb2NvdW50KQorCXN0cnVjdCBpb3ZfaXRlcgkJKmZyb20pCiB7CiAJc3RydWN0IGZpbGUJCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKQEAgLTYzNiw5ICs1ODUsMTAgQEAKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXNzaXplX3QJCQlyZXQgPSAwOwotCXNpemVfdAkJCWNvdW50ID0gb2NvdW50OwogCWludAkJCXVuYWxpZ25lZF9pbyA9IDA7CiAJaW50CQkJaW9sb2NrOworCXNpemVfdAkJCWNvdW50ID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CisJbG9mZl90CQkJcG9zID0gaW9jYi0+a2lfcG9zOwogCXN0cnVjdCB4ZnNfYnVmdGFyZwkqdGFyZ2V0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSA/CiAJCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKIApAQCAtNjc3LDYgKzYyNyw3IEBACiAJcmV0ID0geGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsICZpb2xvY2spOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OworCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIGNvdW50KTsKIAogCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CiAJCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoVkZTX0koaXApLT5pX21hcHBpbmcsCkBAIC02OTgsOCArNjQ5LDcgQEAKIAl9CiAKIAl0cmFjZV94ZnNfZmlsZV9kaXJlY3Rfd3JpdGUoaXAsIGNvdW50LCBpb2NiLT5raV9wb3MsIDApOwotCXJldCA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92cCwKLQkJCSZucl9zZWdzLCBwb3MsIGNvdW50LCBvY291bnQpOworCXJldCA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgZnJvbSwgcG9zKTsKIAogb3V0OgogCXhmc19yd19pdW5sb2NrKGlwLCBpb2xvY2spOwpAQCAtNzEyLDEwICs2NjIsNyBAQAogU1RBVElDIHNzaXplX3QKIHhmc19maWxlX2J1ZmZlcmVkX2Fpb193cml0ZSgKIAlzdHJ1Y3Qga2lvY2IJCSppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92cCwKLQl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAotCWxvZmZfdAkJCXBvcywKLQlzaXplX3QJCQljb3VudCkKKwlzdHJ1Y3QgaW92X2l0ZXIJCSpmcm9tKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CkBAIC03MjQsNyArNjcxLDggQEAKIAlzc2l6ZV90CQkJcmV0OwogCWludAkJCWVub3NwYyA9IDA7CiAJaW50CQkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOwotCXN0cnVjdCBpb3ZfaXRlcgkJZnJvbTsKKwlsb2ZmX3QJCQlwb3MgPSBpb2NiLT5raV9wb3M7CisJc2l6ZV90CQkJY291bnQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKTsKIAogCXhmc19yd19pbG9jayhpcCwgaW9sb2NrKTsKIApAQCAtNzMyLDEzICs2ODAsMTMgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWlvdl9pdGVyX2luaXQoJmZyb20sIGlvdnAsIG5yX3NlZ3MsIGNvdW50LCAwKTsKKwlpb3ZfaXRlcl90cnVuY2F0ZShmcm9tLCBjb3VudCk7CiAJLyogV2UgY2FuIHdyaXRlIGJhY2sgdGhpcyBxdWV1ZSBpbiBwYWdlIHJlY2xhaW0gKi8KIAljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAogd3JpdGVfcmV0cnk6CiAJdHJhY2VfeGZzX2ZpbGVfYnVmZmVyZWRfd3JpdGUoaXAsIGNvdW50LCBpb2NiLT5raV9wb3MsIDApOwotCXJldCA9IGdlbmVyaWNfcGVyZm9ybV93cml0ZShmaWxlLCAmZnJvbSwgcG9zKTsKKwlyZXQgPSBnZW5lcmljX3BlcmZvcm1fd3JpdGUoZmlsZSwgZnJvbSwgcG9zKTsKIAlpZiAobGlrZWx5KHJldCA+PSAwKSkKIAkJaW9jYi0+a2lfcG9zID0gcG9zICsgcmV0OwogCS8qCkBAIC03NTksNDAgKzcwNywyOSBAQAogfQogCiBTVEFUSUMgc3NpemVfdAoteGZzX2ZpbGVfYWlvX3dyaXRlKAoreGZzX2ZpbGVfd3JpdGVfaXRlcigKIAlzdHJ1Y3Qga2lvY2IJCSppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92cCwKLQl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAotCWxvZmZfdAkJCXBvcykKKwlzdHJ1Y3QgaW92X2l0ZXIJCSpmcm9tKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwogCXNzaXplX3QJCQlyZXQ7Ci0Jc2l6ZV90CQkJb2NvdW50ID0gMDsKKwlzaXplX3QJCQlvY291bnQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKTsKIAogCVhGU19TVEFUU19JTkMoeHNfd3JpdGVfY2FsbHMpOwogCi0JQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwotCi0JcmV0ID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3ZwLCAmbnJfc2VncywgJm9jb3VudCwgVkVSSUZZX1JFQUQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlpZiAob2NvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJCXJldHVybiAtRUlPOwogCiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpCi0JCXJldCA9IHhmc19maWxlX2Rpb19haW9fd3JpdGUoaW9jYiwgaW92cCwgbnJfc2VncywgcG9zLCBvY291bnQpOworCQlyZXQgPSB4ZnNfZmlsZV9kaW9fYWlvX3dyaXRlKGlvY2IsIGZyb20pOwogCWVsc2UKLQkJcmV0ID0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dyaXRlKGlvY2IsIGlvdnAsIG5yX3NlZ3MsIHBvcywKLQkJCQkJCSAgb2NvdW50KTsKKwkJcmV0ID0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dyaXRlKGlvY2IsIGZyb20pOwogCiAJaWYgKHJldCA+IDApIHsKIAkJc3NpemVfdCBlcnI7CkBAIC04MDQsOCArNzQxLDYgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXQgPSBlcnI7CiAJfQotCi1vdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ2MSwxMiArMTM5NiwxMiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSB4ZnNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IHhmc19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUJPSB4ZnNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlcgk9IHhmc19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlcgk9IHhmc19maWxlX3dyaXRlX2l0ZXIsCiAJLnNwbGljZV9yZWFkCT0geGZzX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IHhmc19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkudW5sb2NrZWRfaW9jdGwJPSB4ZnNfZmlsZV9pb2N0bCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHhmc19maWxlX2NvbXBhdF9pb2N0bCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhY2UuaCBiL2ZzL3hmcy94ZnNfdHJhY2UuaAppbmRleCA2OTEwNDU4Li4xNTJmODI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYWNlLmgKKysrIGIvZnMveGZzL3hmc190cmFjZS5oCkBAIC0xMTE4LDcgKzExMTgsNiBAQAogREVGSU5FX1JXX0VWRU5UKHhmc19maWxlX2J1ZmZlcmVkX3dyaXRlKTsKIERFRklORV9SV19FVkVOVCh4ZnNfZmlsZV9kaXJlY3Rfd3JpdGUpOwogREVGSU5FX1JXX0VWRU5UKHhmc19maWxlX3NwbGljZV9yZWFkKTsKLURFRklORV9SV19FVkVOVCh4ZnNfZmlsZV9zcGxpY2Vfd3JpdGUpOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19wYWdlX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcXJ3bG9jay5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9xcndsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4M2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcXJ3bG9jay5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogUXVldWUgcmVhZC93cml0ZSBsb2NrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxMy0yMDE0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogQXV0aG9yczogV2FpbWFuIExvbmcgPHdhaW1hbi5sb25nQGhwLmNvbT4KKyAqLworI2lmbmRlZiBfX0FTTV9HRU5FUklDX1FSV0xPQ0tfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1FSV0xPQ0tfSAorCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9xcndsb2NrX3R5cGVzLmg+CisKKy8qCisgKiBXcml0ZXIgc3RhdGVzICYgcmVhZGVyIHNoaWZ0IGFuZCBiaWFzCisgKi8KKyNkZWZpbmUJX1FXX1dBSVRJTkcJMQkJLyogQSB3cml0ZXIgaXMgd2FpdGluZwkgICAqLworI2RlZmluZQlfUVdfTE9DS0VECTB4ZmYJCS8qIEEgd3JpdGVyIGhvbGRzIHRoZSBsb2NrICovCisjZGVmaW5lCV9RV19XTUFTSwkweGZmCQkvKiBXcml0ZXIgbWFzawkJICAgKi8KKyNkZWZpbmUJX1FSX1NISUZUCTgJCS8qIFJlYWRlciBjb3VudCBzaGlmdAkgICAqLworI2RlZmluZSBfUVJfQklBUwkoMVUgPDwgX1FSX1NISUZUKQorCisvKgorICogRXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK2V4dGVybiB2b2lkIHF1ZXVlX3JlYWRfbG9ja19zbG93cGF0aChzdHJ1Y3QgcXJ3bG9jayAqbG9jayk7CitleHRlcm4gdm9pZCBxdWV1ZV93cml0ZV9sb2NrX3Nsb3dwYXRoKHN0cnVjdCBxcndsb2NrICpsb2NrKTsKKworLyoqCisgKiBxdWV1ZV9yZWFkX2Nhbl9sb2NrLSB3b3VsZCByZWFkX3RyeWxvY2soKSBzdWNjZWVkPworICogQGxvY2s6IFBvaW50ZXIgdG8gcXVldWUgcndsb2NrIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9yZWFkX2Nhbl9sb2NrKHN0cnVjdCBxcndsb2NrICpsb2NrKQoreworCXJldHVybiAhKGF0b21pY19yZWFkKCZsb2NrLT5jbnRzKSAmIF9RV19XTUFTSyk7Cit9CisKKy8qKgorICogcXVldWVfd3JpdGVfY2FuX2xvY2stIHdvdWxkIHdyaXRlX3RyeWxvY2soKSBzdWNjZWVkPworICogQGxvY2s6IFBvaW50ZXIgdG8gcXVldWUgcndsb2NrIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV93cml0ZV9jYW5fbG9jayhzdHJ1Y3QgcXJ3bG9jayAqbG9jaykKK3sKKwlyZXR1cm4gIWF0b21pY19yZWFkKCZsb2NrLT5jbnRzKTsKK30KKworLyoqCisgKiBxdWV1ZV9yZWFkX3RyeWxvY2sgLSB0cnkgdG8gYWNxdWlyZSByZWFkIGxvY2sgb2YgYSBxdWV1ZSByd2xvY2sKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1ZSByd2xvY2sgc3RydWN0dXJlCisgKiBSZXR1cm46IDEgaWYgbG9jayBhY3F1aXJlZCwgMCBpZiBmYWlsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgcXVldWVfcmVhZF90cnlsb2NrKHN0cnVjdCBxcndsb2NrICpsb2NrKQoreworCXUzMiBjbnRzOworCisJY250cyA9IGF0b21pY19yZWFkKCZsb2NrLT5jbnRzKTsKKwlpZiAobGlrZWx5KCEoY250cyAmIF9RV19XTUFTSykpKSB7CisJCWNudHMgPSAodTMyKWF0b21pY19hZGRfcmV0dXJuKF9RUl9CSUFTLCAmbG9jay0+Y250cyk7CisJCWlmIChsaWtlbHkoIShjbnRzICYgX1FXX1dNQVNLKSkpCisJCQlyZXR1cm4gMTsKKwkJYXRvbWljX3N1YihfUVJfQklBUywgJmxvY2stPmNudHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBxdWV1ZV93cml0ZV90cnlsb2NrIC0gdHJ5IHRvIGFjcXVpcmUgd3JpdGUgbG9jayBvZiBhIHF1ZXVlIHJ3bG9jaworICogQGxvY2sgOiBQb2ludGVyIHRvIHF1ZXVlIHJ3bG9jayBzdHJ1Y3R1cmUKKyAqIFJldHVybjogMSBpZiBsb2NrIGFjcXVpcmVkLCAwIGlmIGZhaWxlZAorICovCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV93cml0ZV90cnlsb2NrKHN0cnVjdCBxcndsb2NrICpsb2NrKQoreworCXUzMiBjbnRzOworCisJY250cyA9IGF0b21pY19yZWFkKCZsb2NrLT5jbnRzKTsKKwlpZiAodW5saWtlbHkoY250cykpCisJCXJldHVybiAwOworCisJcmV0dXJuIGxpa2VseShhdG9taWNfY21weGNoZygmbG9jay0+Y250cywKKwkJCQkgICAgIGNudHMsIGNudHMgfCBfUVdfTE9DS0VEKSA9PSBjbnRzKTsKK30KKy8qKgorICogcXVldWVfcmVhZF9sb2NrIC0gYWNxdWlyZSByZWFkIGxvY2sgb2YgYSBxdWV1ZSByd2xvY2sKKyAqIEBsb2NrOiBQb2ludGVyIHRvIHF1ZXVlIHJ3bG9jayBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX3JlYWRfbG9jayhzdHJ1Y3QgcXJ3bG9jayAqbG9jaykKK3sKKwl1MzIgY250czsKKworCWNudHMgPSBhdG9taWNfYWRkX3JldHVybihfUVJfQklBUywgJmxvY2stPmNudHMpOworCWlmIChsaWtlbHkoIShjbnRzICYgX1FXX1dNQVNLKSkpCisJCXJldHVybjsKKworCS8qIFRoZSBzbG93cGF0aCB3aWxsIGRlY3JlbWVudCB0aGUgcmVhZGVyIGNvdW50LCBpZiBuZWNlc3NhcnkuICovCisJcXVldWVfcmVhZF9sb2NrX3Nsb3dwYXRoKGxvY2spOworfQorCisvKioKKyAqIHF1ZXVlX3dyaXRlX2xvY2sgLSBhY3F1aXJlIHdyaXRlIGxvY2sgb2YgYSBxdWV1ZSByd2xvY2sKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1ZSByd2xvY2sgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV93cml0ZV9sb2NrKHN0cnVjdCBxcndsb2NrICpsb2NrKQoreworCS8qIE9wdGltaXplIGZvciB0aGUgdW5mYWlyIGxvY2sgY2FzZSB3aGVyZSB0aGUgZmFpciBmbGFnIGlzIDAuICovCisJaWYgKGF0b21pY19jbXB4Y2hnKCZsb2NrLT5jbnRzLCAwLCBfUVdfTE9DS0VEKSA9PSAwKQorCQlyZXR1cm47CisKKwlxdWV1ZV93cml0ZV9sb2NrX3Nsb3dwYXRoKGxvY2spOworfQorCisvKioKKyAqIHF1ZXVlX3JlYWRfdW5sb2NrIC0gcmVsZWFzZSByZWFkIGxvY2sgb2YgYSBxdWV1ZSByd2xvY2sKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1ZSByd2xvY2sgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9yZWFkX3VubG9jayhzdHJ1Y3QgcXJ3bG9jayAqbG9jaykKK3sKKwkvKgorCSAqIEF0b21pY2FsbHkgZGVjcmVtZW50IHRoZSByZWFkZXIgY291bnQKKwkgKi8KKwlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKKwlhdG9taWNfc3ViKF9RUl9CSUFTLCAmbG9jay0+Y250cyk7Cit9CisKKyNpZm5kZWYgcXVldWVfd3JpdGVfdW5sb2NrCisvKioKKyAqIHF1ZXVlX3dyaXRlX3VubG9jayAtIHJlbGVhc2Ugd3JpdGUgbG9jayBvZiBhIHF1ZXVlIHJ3bG9jaworICogQGxvY2sgOiBQb2ludGVyIHRvIHF1ZXVlIHJ3bG9jayBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX3dyaXRlX3VubG9jayhzdHJ1Y3QgcXJ3bG9jayAqbG9jaykKK3sKKwkvKgorCSAqIElmIHRoZSB3cml0ZXIgZmllbGQgaXMgYXRvbWljLCBpdCBjYW4gYmUgY2xlYXJlZCBkaXJlY3RseS4KKwkgKiBPdGhlcndpc2UsIGFuIGF0b21pYyBzdWJ0cmFjdGlvbiB3aWxsIGJlIHVzZWQgdG8gY2xlYXIgaXQuCisJICovCisJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJYXRvbWljX3N1YihfUVdfTE9DS0VELCAmbG9jay0+Y250cyk7Cit9CisjZW5kaWYKKworLyoKKyAqIFJlbWFwcGluZyByd2xvY2sgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZworICogcXVldWUgcndsb2NrIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBhcmNoX3JlYWRfY2FuX2xvY2sobCkJcXVldWVfcmVhZF9jYW5fbG9jayhsKQorI2RlZmluZSBhcmNoX3dyaXRlX2Nhbl9sb2NrKGwpCXF1ZXVlX3dyaXRlX2Nhbl9sb2NrKGwpCisjZGVmaW5lIGFyY2hfcmVhZF9sb2NrKGwpCXF1ZXVlX3JlYWRfbG9jayhsKQorI2RlZmluZSBhcmNoX3dyaXRlX2xvY2sobCkJcXVldWVfd3JpdGVfbG9jayhsKQorI2RlZmluZSBhcmNoX3JlYWRfdHJ5bG9jayhsKQlxdWV1ZV9yZWFkX3RyeWxvY2sobCkKKyNkZWZpbmUgYXJjaF93cml0ZV90cnlsb2NrKGwpCXF1ZXVlX3dyaXRlX3RyeWxvY2sobCkKKyNkZWZpbmUgYXJjaF9yZWFkX3VubG9jayhsKQlxdWV1ZV9yZWFkX3VubG9jayhsKQorI2RlZmluZSBhcmNoX3dyaXRlX3VubG9jayhsKQlxdWV1ZV93cml0ZV91bmxvY2sobCkKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfUVJXTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3Fyd2xvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcXJ3bG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzZmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3Fyd2xvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfUVJXTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfUVJXTE9DS19UWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zcGlubG9ja190eXBlcy5oPgorCisvKgorICogVGhlIHF1ZXVlIHJlYWQvd3JpdGUgbG9jayBkYXRhIHN0cnVjdHVyZQorICovCisKK3R5cGVkZWYgc3RydWN0IHFyd2xvY2sgeworCWF0b21pY190CQljbnRzOworCWFyY2hfc3BpbmxvY2tfdAkJbG9jazsKK30gYXJjaF9yd2xvY2tfdDsKKworI2RlZmluZQlfX0FSQ0hfUldfTE9DS19VTkxPQ0tFRCB7CQlcCisJLmNudHMgPSBBVE9NSUNfSU5JVCgwKSwJCQlcCisJLmxvY2sgPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VELAlcCit9CisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1FSV0xPQ0tfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IGQ2NDc2MzcuLjQ3MWJhNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTEwOSw2ICsxMDksMTUgQEAKICNkZWZpbmUgQlJBTkNIX1BST0ZJTEUoKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfS1BST0JFUworI2RlZmluZSBLUFJPQkVfQkxBQ0tMSVNUKCkJLiA9IEFMSUdOKDgpOwkJCQkgICAgICBcCisJCQkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9rcHJvYmVfYmxhY2tsaXN0KSA9IC47IFwKKwkJCQkqKF9rcHJvYmVfYmxhY2tsaXN0KQkJCSAgICAgIFwKKwkJCQlWTUxJTlVYX1NZTUJPTChfX3N0b3Bfa3Byb2JlX2JsYWNrbGlzdCkgPSAuOworI2Vsc2UKKyNkZWZpbmUgS1BST0JFX0JMQUNLTElTVCgpCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCiAjZGVmaW5lIEZUUkFDRV9FVkVOVFMoKQkuID0gQUxJR04oOCk7CQkJCQlcCiAJCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X2Z0cmFjZV9ldmVudHMpID0gLjsJXApAQCAtNDc4LDYgKzQ4Nyw3IEBACiAJKiguaW5pdC5yb2RhdGEpCQkJCQkJCVwKIAlGVFJBQ0VfRVZFTlRTKCkJCQkJCQkJXAogCVRSQUNFX1NZU0NBTExTKCkJCQkJCQlcCisJS1BST0JFX0JMQUNLTElTVCgpCQkJCQkJXAogCU1FTV9ESVNDQVJEKGluaXQucm9kYXRhKQkJCQkJXAogCUNMS19PRl9UQUJMRVMoKQkJCQkJCQlcCiAJUkVTRVJWRURNRU1fT0ZfVEFCTEVTKCkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1QLmggYi9pbmNsdWRlL2RybS9kcm1QLmgKaW5kZXggYTdjMmE4Ni4uOGFmNzFhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtUC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybVAuaApAQCAtMTQzLDExICsxNDMsNiBAQAogI2RlZmluZSBEUklWRVJfUFJJTUUgICAgICAgMHg0MDAwCiAjZGVmaW5lIERSSVZFUl9SRU5ERVIgICAgICAweDgwMDAKIAotI2RlZmluZSBEUklWRVJfQlVTX1BDSSAweDEKLSNkZWZpbmUgRFJJVkVSX0JVU19QTEFURk9STSAweDIKLSNkZWZpbmUgRFJJVkVSX0JVU19VU0IgMHgzCi0jZGVmaW5lIERSSVZFUl9CVVNfSE9TVDFYIDB4NAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiogXG5hbWUgQmVnaW4gdGhlIERSTS4uLiAqLwogLypAeyovCkBAIC0yMzksOCArMjM0LDYgQEAKIC8qKiBcbmFtZSBJbnRlcm5hbCB0eXBlcyBhbmQgc3RydWN0dXJlcyAqLwogLypAeyovCiAKLSNkZWZpbmUgRFJNX0FSUkFZX1NJWkUoeCkgQVJSQVlfU0laRSh4KQotCiAjZGVmaW5lIERSTV9JRl9WRVJTSU9OKG1haiwgbWluKSAobWFqIDw8IDE2IHwgbWluKQogCiAvKioKQEAgLTczMSwxMyArNzI0LDcgQEAKICNkZWZpbmUgRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEUgICAgICgxIDw8IDIpCiAKIHN0cnVjdCBkcm1fYnVzIHsKLQlpbnQgYnVzX3R5cGU7Ci0JaW50ICgqZ2V0X2lycSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0JY29uc3QgY2hhciAqKCpnZXRfbmFtZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJaW50ICgqc2V0X2J1c2lkKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKLQlpbnQgKCpzZXRfdW5pcXVlKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLAotCQkJICBzdHJ1Y3QgZHJtX3VuaXF1ZSAqdW5pcXVlKTsKLQlpbnQgKCppcnFfYnlfYnVzaWQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKTsKIH07CiAKIC8qKgpAQCAtOTc0LDExICs5NjEsNiBAQAogCWNvbnN0IHN0cnVjdCBkcm1faW9jdGxfZGVzYyAqaW9jdGxzOwogCWludCBudW1faW9jdGxzOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7Ci0JdW5pb24gewotCQlzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpOwotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7Ci0JCXN0cnVjdCB1c2JfZHJpdmVyICp1c2I7Ci0JfSBrZHJpdmVyOwogCXN0cnVjdCBkcm1fYnVzICpidXM7CiAKIAkvKiBMaXN0IG9mIGRldmljZXMgaGFuZ2luZyBvZmYgdGhpcyBkcml2ZXIgd2l0aCBzdGVhbHRoIGF0dGFjaC4gKi8KQEAgLTEwNDAsMTQgKzEwMjIsMTcgQEAKIH07CiAKIHN0cnVjdCBkcm1fdmJsYW5rX2NydGMgeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CQkvKiBwb2ludGVyIHRvIHRoZSBkcm1fZGV2aWNlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CS8qKjwgVkJMQU5LIHdhaXQgcXVldWUgKi8KIAlzdHJ1Y3QgdGltZXZhbCB0aW1lW0RSTV9WQkxBTktUSU1FX1JCU0laRV07CS8qKjwgdGltZXN0YW1wIG9mIGN1cnJlbnQgY291bnQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNhYmxlX3RpbWVyOwkJLyogZGVsYXllZCBkaXNhYmxlIHRpbWVyICovCiAJYXRvbWljX3QgY291bnQ7CQkJLyoqPCBudW1iZXIgb2YgVkJMQU5LIGludGVycnVwdHMgKi8KIAlhdG9taWNfdCByZWZjb3VudDsJCS8qIG51bWJlciBvZiB1c2VycyBvZiB2YmxhbmsgaW50ZXJydXB0c3BlciBjcnRjICovCiAJdTMyIGxhc3Q7CQkJLyogcHJvdGVjdGVkIGJ5IGRldi0+dmJsX2xvY2ssIHVzZWQgKi8KIAkJCQkJLyogZm9yIHdyYXBhcm91bmQgaGFuZGxpbmcgKi8KIAl1MzIgbGFzdF93YWl0OwkJCS8qIExhc3QgdmJsYW5rIHNlcW5vIHdhaXRlZCBwZXIgQ1JUQyAqLwogCXVuc2lnbmVkIGludCBpbm1vZGVzZXQ7CQkvKiBEaXNwbGF5IGRyaXZlciBpcyBzZXR0aW5nIG1vZGUgKi8KKwlpbnQgY3J0YzsJCQkvKiBjcnRjIGluZGV4ICovCiAJYm9vbCBlbmFibGVkOwkJCS8qIHNvIHdlIGRvbid0IGNhbGwgZW5hYmxlIG1vcmUgdGhhbgogCQkJCQkgICBvbmNlIHBlciBkaXNhYmxlICovCiB9OwpAQCAtMTA1OCw3ICsxMDQzLDYgQEAKICAqLwogc3RydWN0IGRybV9kZXZpY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGVnYWN5X2Rldl9saXN0Oy8qKjwgbGlzdCBvZiBkZXZpY2VzIHBlciBkcml2ZXIgZm9yIHN0ZWFsdGggYXR0YWNoIGNsZWFudXAgKi8KLQljaGFyICpkZXZuYW1lOwkJCS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KIAlpbnQgaWZfdmVyc2lvbjsJCQkvKio8IEhpZ2hlc3QgaW50ZXJmYWNlIHZlcnNpb24gc2V0ICovCiAKIAkvKiogXG5hbWUgTGlmZXRpbWUgTWFuYWdlbWVudCAqLwpAQCAtMTA3MiwxOCArMTA1NiwxOSBAQAogCXN0cnVjdCBkcm1fbWlub3IgKnJlbmRlcjsJCS8qKjwgUmVuZGVyIG5vZGUgKi8KIAlhdG9taWNfdCB1bnBsdWdnZWQ7CQkJLyoqPCBGbGFnIHdoZXRoZXIgZGV2IGlzIGRlYWQgKi8KIAlzdHJ1Y3QgaW5vZGUgKmFub25faW5vZGU7CQkvKio8IGlub2RlIGZvciBwcml2YXRlIGFkZHJlc3Mtc3BhY2UgKi8KKwljaGFyICp1bmlxdWU7CQkJCS8qKjwgdW5pcXVlIG5hbWUgb2YgdGhlIGRldmljZSAqLwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBMb2NrcyAqLwogCS8qQHsgKi8KLQlzcGlubG9ja190IGNvdW50X2xvY2s7CQkvKio8IEZvciBpbnVzZSwgZHJtX2RldmljZTo6b3Blbl9jb3VudCwgZHJtX2RldmljZTo6YnVmX3VzZSAqLwogCXN0cnVjdCBtdXRleCBzdHJ1Y3RfbXV0ZXg7CS8qKjwgRm9yIG90aGVycyAqLwogCXN0cnVjdCBtdXRleCBtYXN0ZXJfbXV0ZXg7ICAgICAgLyoqPCBGb3IgZHJtX21pbm9yOjptYXN0ZXIgYW5kIGRybV9maWxlOjppc19tYXN0ZXIgKi8KIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgVXNhZ2UgQ291bnRlcnMgKi8KIAkvKkB7ICovCi0JaW50IG9wZW5fY291bnQ7CQkJLyoqPCBPdXRzdGFuZGluZyBmaWxlcyBvcGVuICovCisJaW50IG9wZW5fY291bnQ7CQkJLyoqPCBPdXRzdGFuZGluZyBmaWxlcyBvcGVuLCBwcm90ZWN0ZWQgYnkgZHJtX2dsb2JhbF9tdXRleC4gKi8KKwlzcGlubG9ja190IGJ1Zl9sb2NrOwkJLyoqPCBGb3IgZHJtX2RldmljZTo6YnVmX3VzZSBhbmQgYSBmZXcgb3RoZXIgdGhpbmdzLiAqLwogCWludCBidWZfdXNlOwkJCS8qKjwgQnVmZmVycyBpbiB1c2UgLS0gY2Fubm90IGFsbG9jICovCiAJYXRvbWljX3QgYnVmX2FsbG9jOwkJLyoqPCBCdWZmZXIgYWxsb2NhdGlvbiBpbiBwcm9ncmVzcyAqLwogCS8qQH0gKi8KQEAgLTExMTQsNiArMTA5OSw4IEBACiAJLyoqIFxuYW1lIENvbnRleHQgc3VwcG9ydCAqLwogCS8qQHsgKi8KIAlib29sIGlycV9lbmFibGVkOwkJLyoqPCBUcnVlIGlmIGlycSBoYW5kbGVyIGlzIGVuYWJsZWQgKi8KKwlpbnQgaXJxOworCiAJX192b2xhdGlsZV9fIGxvbmcgY29udGV4dF9mbGFnOwkvKio8IENvbnRleHQgc3dhcHBpbmcgZmxhZyAqLwogCWludCBsYXN0X2NvbnRleHQ7CQkvKio8IExhc3QgY3VycmVudCBjb250ZXh0ICovCiAJLypAfSAqLwpAQCAtMTEzNCw3ICsxMTIxLDYgQEAKIAogCXNwaW5sb2NrX3QgdmJsYW5rX3RpbWVfbG9jazsgICAgLyoqPCBQcm90ZWN0cyB2YmxhbmsgY291bnQgYW5kIHRpbWUgdXBkYXRlcyBkdXJpbmcgdmJsYW5rIGVuYWJsZS9kaXNhYmxlICovCiAJc3BpbmxvY2tfdCB2YmxfbG9jazsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB2YmxhbmtfZGlzYWJsZV90aW1lcjsKIAogCXUzMiBtYXhfdmJsYW5rX2NvdW50OyAgICAgICAgICAgLyoqPCBzaXplIG9mIHZibGFuayBjb3VudGVyIHJlZ2lzdGVyICovCiAKQEAgLTExODYsMTEgKzExNzIsNiBAQAogCXJldHVybiAoKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBmZWF0dXJlKSA/IDEgOiAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHJtX2Rldl90b19pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2LT5kcml2ZXItPmJ1cy0+Z2V0X2lycShkZXYpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJtX2RldmljZV9zZXRfdW5wbHVnZ2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc21wX3dtYigpOwpAQCAtMTIwNCwxMSArMTE4NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGRybV9tb2Rlc2V0X2lzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXJldHVybiBtdXRleF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wgZHJtX2lzX3JlbmRlcl9jbGllbnQoY29uc3Qgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJcmV0dXJuIGZpbGVfcHJpdi0+bWlub3ItPnR5cGUgPT0gRFJNX01JTk9SX1JFTkRFUjsKQEAgLTEzMTAsNyArMTI4Niw3IEBACiAvKiBDYWNoZSBtYW5hZ2VtZW50IChkcm1fY2FjaGUuYykgKi8KIHZvaWQgZHJtX2NsZmx1c2hfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2VzW10sIHVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzKTsKIHZvaWQgZHJtX2NsZmx1c2hfc2coc3RydWN0IHNnX3RhYmxlICpzdCk7Ci12b2lkIGRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW5ndGgpOwordm9pZCBkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKIAogCQkJCS8qIExvY2tpbmcgSU9DVEwgc3VwcG9ydCAoZHJtX2xvY2suaCkgKi8KIGV4dGVybiBpbnQgZHJtX2xvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTEzNjMsNyArMTMzOSw3IEBACiAJCQkJLyogSVJRIHN1cHBvcnQgKGRybV9pcnEuaCkgKi8KIGV4dGVybiBpbnQgZHJtX2NvbnRyb2woc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKLWV4dGVybiBpbnQgZHJtX2lycV9pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBkcm1faXJxX2luc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGlycSk7CiBleHRlcm4gaW50IGRybV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaW50IGRybV92YmxhbmtfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbnVtX2NydGNzKTsKQEAgLTEzNzcsOCArMTM1MywxNCBAQAogZXh0ZXJuIGJvb2wgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIGludCBkcm1fdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gaW50IGRybV9jcnRjX3ZibGFua19nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK2V4dGVybiB2b2lkIGRybV9jcnRjX3ZibGFua19wdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92Ymxhbmtfb2ZmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2V4dGVybiB2b2lkIGRybV92Ymxhbmtfb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOworZXh0ZXJuIHZvaWQgZHJtX2NydGNfdmJsYW5rX29mZihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworZXh0ZXJuIHZvaWQgZHJtX2NydGNfdmJsYW5rX29uKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKIGV4dGVybiB1MzIgZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKIAkJCQkgICAgIHN0cnVjdCB0aW1ldmFsICp0dmJsYW5rLCB1bnNpZ25lZCBmbGFncyk7CiBleHRlcm4gaW50IGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTE1MjIsNiArMTUwNCw5IEBACiAJCQkJICAgICAgIHNpemVfdCBhbGlnbik7CiBleHRlcm4gdm9pZCBfX2RybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CiBleHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOworZXh0ZXJuIGludCBkcm1fcGNpX3NldF91bmlxdWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX3VuaXF1ZSAqdSk7CiAKIAkJCSAgICAgICAvKiBzeXNmcyBzdXBwb3J0IChkcm1fc3lzZnMuYykgKi8KIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3M7CkBAIC0xNjMxLDYgKzE2MTYsNyBAQAogdm9pZCBkcm1fZGV2X3VucmVmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGRybV9kZXZfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGRybV9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBkcm1fZGV2X3NldF91bmlxdWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgZHJtX21pbm9yICpkcm1fbWlub3JfYWNxdWlyZSh1bnNpZ25lZCBpbnQgbWlub3JfaWQpOwogdm9pZCBkcm1fbWlub3JfcmVsZWFzZShzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAppbmRleCBlNTVmY2NiLi4yNTFiNzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oZG1pLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9tb2RlLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mb3VyY2MuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzZXRfbG9jay5oPgogCiBzdHJ1Y3QgZHJtX2RldmljZTsKIHN0cnVjdCBkcm1fbW9kZV9zZXQ7CkBAIC01MCw2ICs1MSw3IEBACiAjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9CTE9CIDB4YmJiYmJiYmIKICNkZWZpbmUgRFJNX01PREVfT0JKRUNUX1BMQU5FIDB4ZWVlZWVlZWUKICNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0JSSURHRSAweGJkYmRiZGJkCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9BTlkgMAogCiBzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0IHsKIAl1aW50MzJfdCBpZDsKQEAgLTY0LDYgKzY2LDE1IEBACiAJdWludDY0X3QgdmFsdWVzW0RSTV9PQkpFQ1RfTUFYX1BST1BFUlRZXTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBVNjQySTY0KHVpbnQ2NF90IHZhbCkKK3sKKwlyZXR1cm4gKGludDY0X3QpKigoaW50NjRfdCAqKSZ2YWwpOworfQorc3RhdGljIGlubGluZSB1aW50NjRfdCBJNjQyVTY0KGludDY0X3QgdmFsKQoreworCXJldHVybiAodWludDY0X3QpKigodWludDY0X3QgKikmdmFsKTsKK30KKwogZW51bSBkcm1fY29ubmVjdG9yX2ZvcmNlIHsKIAlEUk1fRk9SQ0VfVU5TUEVDSUZJRUQsCiAJRFJNX0ZPUkNFX09GRiwKQEAgLTExMCw2ICsxMjEsOSBAQAogCWVudW0gc3VicGl4ZWxfb3JkZXIgc3VicGl4ZWxfb3JkZXI7CiAJdTMyIGNvbG9yX2Zvcm1hdHM7CiAKKwkvKiBNYXNrIG9mIHN1cHBvcnRlZCBoZG1pIGRlZXAgY29sb3IgbW9kZXMgKi8KKwl1OCBlZGlkX2hkbWlfZGNfbW9kZXM7CisKIAl1OCBjZWFfcmV2OwogfTsKIApAQCAtMTkwLDEwICsyMDQsMTUgQEAKIAljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOwogCXVpbnQzMl90IG51bV92YWx1ZXM7CiAJdWludDY0X3QgKnZhbHVlczsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCiAJc3RydWN0IGxpc3RfaGVhZCBlbnVtX2Jsb2JfbGlzdDsKIH07CiAKK3ZvaWQgZHJtX21vZGVzZXRfbG9ja19hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGRybV9tb2Rlc2V0X3VubG9ja19hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGRybV93YXJuX29uX21vZGVzZXRfbm90X2FsbF9sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKIHN0cnVjdCBkcm1fY3J0YzsKIHN0cnVjdCBkcm1fY29ubmVjdG9yOwogc3RydWN0IGRybV9lbmNvZGVyOwpAQCAtMjY5LDYgKzI4OCw3IEBACiAgKiBkcm1fY3J0YyAtIGNlbnRyYWwgQ1JUQyBjb250cm9sIHN0cnVjdHVyZQogICogQGRldjogcGFyZW50IERSTSBkZXZpY2UKICAqIEBoZWFkOiBsaXN0IG1hbmFnZW1lbnQKKyAqIEBtdXRleDogcGVyLUNSVEMgbG9ja2luZwogICogQGJhc2U6IGJhc2UgS01TIG9iamVjdCBmb3IgSUQgdHJhY2tpbmcgZXRjLgogICogQHByaW1hcnk6IHByaW1hcnkgcGxhbmUgZm9yIHRoaXMgQ1JUQwogICogQGN1cnNvcjogY3Vyc29yIHBsYW5lIGZvciB0aGlzIENSVEMKQEAgLTMwMyw3ICszMjMsNyBAQAogCSAqIHN0YXRlLCAuLi4pIGFuZCBhIHdyaXRlIGxvY2sgZm9yIGV2ZXJ5dGhpbmcgd2hpY2ggY2FuIGJlIHVwZGF0ZQogCSAqIHdpdGhvdXQgYSBmdWxsIG1vZGVzZXQgKGZiLCBjdXJzb3IgZGF0YSwgLi4uKQogCSAqLwotCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgZHJtX21vZGVzZXRfbG9jayBtdXRleDsKIAogCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgYmFzZTsKIApAQCAtNDAwLDYgKzQyMCw3IEBACiAgKiBAZGV2OiBwYXJlbnQgRFJNIGRldmljZQogICogQGhlYWQ6IGxpc3QgbWFuYWdlbWVudAogICogQGJhc2U6IGJhc2UgS01TIG9iamVjdAorICogQG5hbWU6IGVuY29kZXIgbmFtZQogICogQGVuY29kZXJfdHlwZTogb25lIG9mIHRoZSAlRFJNX01PREVfRU5DT0RFUl88Zm9vPiB0eXBlcyBpbiBkcm1fbW9kZS5oCiAgKiBAcG9zc2libGVfY3J0Y3M6IGJpdG1hc2sgb2YgcG90ZW50aWFsIENSVEMgYmluZGluZ3MKICAqIEBwb3NzaWJsZV9jbG9uZXM6IGJpdG1hc2sgb2YgcG90ZW50aWFsIHNpYmxpbmcgZW5jb2RlcnMgZm9yIGNsb25pbmcKQEAgLTQxNiw2ICs0MzcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAogCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgYmFzZTsKKwljaGFyICpuYW1lOwogCWludCBlbmNvZGVyX3R5cGU7CiAJdWludDMyX3QgcG9zc2libGVfY3J0Y3M7CiAJdWludDMyX3QgcG9zc2libGVfY2xvbmVzOwpAQCAtNDQ0LDYgKzQ2Niw3IEBACiAgKiBAYXR0cjogc3lzZnMgYXR0cmlidXRlcwogICogQGhlYWQ6IGxpc3QgbWFuYWdlbWVudAogICogQGJhc2U6IGJhc2UgS01TIG9iamVjdAorICogQG5hbWU6IGNvbm5lY3RvciBuYW1lCiAgKiBAY29ubmVjdG9yX3R5cGU6IG9uZSBvZiB0aGUgJURSTV9NT0RFX0NPTk5FQ1RPUl88Zm9vPiB0eXBlcyBmcm9tIGRybV9tb2RlLmgKICAqIEBjb25uZWN0b3JfdHlwZV9pZDogaW5kZXggaW50byBjb25uZWN0b3IgdHlwZSBlbnVtCiAgKiBAaW50ZXJsYWNlX2FsbG93ZWQ6IGNhbiB0aGlzIGNvbm5lY3RvciBoYW5kbGUgaW50ZXJsYWNlZCBtb2Rlcz8KQEAgLTQ4Miw2ICs1MDUsNyBAQAogCiAJc3RydWN0IGRybV9tb2RlX29iamVjdCBiYXNlOwogCisJY2hhciAqbmFtZTsKIAlpbnQgY29ubmVjdG9yX3R5cGU7CiAJaW50IGNvbm5lY3Rvcl90eXBlX2lkOwogCWJvb2wgaW50ZXJsYWNlX2FsbG93ZWQ7CkBAIC03MjMsNiArNzQ3LDggQEAKICAqLwogc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7CiAJc3RydWN0IG11dGV4IG11dGV4OyAvKiBwcm90ZWN0cyBjb25maWd1cmF0aW9uIChtb2RlIGxpc3RzIGV0Yy4pICovCisJc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgY29ubmVjdGlvbl9tdXRleDsgLyogcHJvdGVjdHMgY29ubmVjdG9yLT5lbmNvZGVyIGFuZCBlbmNvZGVyLT5jcnRjIGxpbmtzICovCisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICphY3F1aXJlX2N0eDsgLyogZm9yIGxlZ2FjeSBfbG9ja19hbGwoKSAvIF91bmxvY2tfYWxsKCkgKi8KIAlzdHJ1Y3QgbXV0ZXggaWRyX211dGV4OyAvKiBmb3IgSURSIG1hbmFnZW1lbnQgKi8KIAlzdHJ1Y3QgaWRyIGNydGNfaWRyOyAvKiB1c2UgdGhpcyBpZHIgZm9yIGFsbCBJRHMsIGZiLCBjcnRjLCBjb25uZWN0b3IsIG1vZGVzIC0ganVzdCBtYWtlcyBsaWZlIGVhc2llciAqLwogCS8qIHRoaXMgaXMgbGltaXRlZCB0byBvbmUgZm9yIG5vdyAqLwpAQCAtODIzLDEwICs4NDksNiBAQAogCWNoYXIgKm5hbWU7CiB9OwogCi1leHRlcm4gdm9pZCBkcm1fbW9kZXNldF9sb2NrX2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGRybV9tb2Rlc2V0X3VubG9ja19hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkcm1fd2Fybl9vbl9tb2Rlc2V0X25vdF9hbGxfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCiBleHRlcm4gaW50IGRybV9jcnRjX2luaXRfd2l0aF9wbGFuZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgICAgIHN0cnVjdCBkcm1fcGxhbmUgKnByaW1hcnksCkBAIC05MDUsNyArOTI3LDYgQEAKIAogZXh0ZXJuIHZvaWQgZHJtX2VuY29kZXJfY2xlYW51cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCi1leHRlcm4gY29uc3QgY2hhciAqZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIGV4dGVybiBjb25zdCBjaGFyICpkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyk7CiBleHRlcm4gY29uc3QgY2hhciAqZHJtX2dldF9zdWJwaXhlbF9vcmRlcl9uYW1lKGVudW0gc3VicGl4ZWxfb3JkZXIgb3JkZXIpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmRybV9nZXRfZHBtc19uYW1lKGludCB2YWwpOwpAQCAtOTE1LDYgKzkzNiw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqZHJtX2dldF90dl9zZWxlY3RfbmFtZShpbnQgdmFsKTsKIGV4dGVybiB2b2lkIGRybV9mYl9yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tb2RlX2dyb3VwICpncm91cCk7CitleHRlcm4gdm9pZCBkcm1fbW9kZV9ncm91cF9kZXN0cm95KHN0cnVjdCBkcm1fbW9kZV9ncm91cCAqZ3JvdXApOwogZXh0ZXJuIGJvb2wgZHJtX3Byb2JlX2RkYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIHN0cnVjdCBlZGlkICpkcm1fZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQkgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKQEAgLTkyNiw2ICs5NDgsMjMgQEAKIAogZXh0ZXJuIGludCBkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQkJCXN0cnVjdCBlZGlkICplZGlkKTsKKworc3RhdGljIGlubGluZSBib29sIGRybV9wcm9wZXJ0eV90eXBlX2lzKHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQl1aW50MzJfdCB0eXBlKQoreworCS8qIGluc3RhbmNlb2YgZm9yIHByb3BzLi4gaGFuZGxlcyBleHRlbmRlZCB0eXBlIHZzIG9yaWdpbmFsIHR5cGVzOiAqLworCWlmIChwcm9wZXJ0eS0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0VYVEVOREVEX1RZUEUpCisJCXJldHVybiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9FWFRFTkRFRF9UWVBFKSA9PSB0eXBlOworCXJldHVybiBwcm9wZXJ0eS0+ZmxhZ3MgJiB0eXBlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZHJtX3Byb3BlcnR5X3R5cGVfdmFsaWQoc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHkpCit7CisJaWYgKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfRVhURU5ERURfVFlQRSkKKwkJcmV0dXJuICEocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9MRUdBQ1lfVFlQRSk7CisJcmV0dXJuICEhKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfTEVHQUNZX1RZUEUpOworfQorCiBleHRlcm4gaW50IGRybV9vYmplY3RfcHJvcGVydHlfc2V0X3ZhbHVlKHN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iaiwKIAkJCQkJIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAogCQkJCQkgdWludDY0X3QgdmFsKTsKQEAgLTk1OSw2ICs5OTgsMTEgQEAKIHN0cnVjdCBkcm1fcHJvcGVydHkgKmRybV9wcm9wZXJ0eV9jcmVhdGVfcmFuZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZsYWdzLAogCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJIHVpbnQ2NF90IG1pbiwgdWludDY0X3QgbWF4KTsKK3N0cnVjdCBkcm1fcHJvcGVydHkgKmRybV9wcm9wZXJ0eV9jcmVhdGVfc2lnbmVkX3JhbmdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSBpbnQ2NF90IG1pbiwgaW50NjRfdCBtYXgpOworc3RydWN0IGRybV9wcm9wZXJ0eSAqZHJtX3Byb3BlcnR5X2NyZWF0ZV9vYmplY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJIGludCBmbGFncywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSk7CiBleHRlcm4gdm9pZCBkcm1fcHJvcGVydHlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSk7CiBleHRlcm4gaW50IGRybV9wcm9wZXJ0eV9hZGRfZW51bShzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwgaW50IGluZGV4LAogCQkJCSB1aW50NjRfdCB2YWx1ZSwgY29uc3QgY2hhciAqbmFtZSk7CkBAIC05NjcsNyArMTAxMSw2IEBACiAJCQkJICAgICBjaGFyICpmb3JtYXRzW10pOwogZXh0ZXJuIGludCBkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkcm1fbW9kZV9jcmVhdGVfZGlydHlfaW5mb19wcm9wZXJ0eShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiBjb25zdCBjaGFyICpkcm1fZ2V0X2VuY29kZXJfbmFtZShjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCiBleHRlcm4gaW50IGRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJCQkgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CkBAIC05NzUsNiArMTAxOCw3IEBACiAJCQkJCSBpbnQgZ2FtbWFfc2l6ZSk7CiBleHRlcm4gc3RydWN0IGRybV9tb2RlX29iamVjdCAqZHJtX21vZGVfb2JqZWN0X2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJdWludDMyX3QgaWQsIHVpbnQzMl90IHR5cGUpOworCiAvKiBJT0NUTHMgKi8KIGV4dGVybiBpbnQgZHJtX21vZGVfZ2V0cmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKQEAgLTEwMjAsNiArMTA2NCw3IEBACiBleHRlcm4gaW50IGRybV9tb2RlX2dhbW1hX3NldF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gdTggZHJtX21hdGNoX2NlYV9tb2RlKGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp0b19tYXRjaCk7CitleHRlcm4gZW51bSBoZG1pX3BpY3R1cmVfYXNwZWN0IGRybV9nZXRfY2VhX2FzcGVjdF9yYXRpbyhjb25zdCB1OCB2aWRlb19jb2RlKTsKIGV4dGVybiBib29sIGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHN0cnVjdCBlZGlkICplZGlkKTsKIGV4dGVybiBib29sIGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhzdHJ1Y3QgZWRpZCAqZWRpZCk7CiBleHRlcm4gYm9vbCBkcm1fcmdiX3F1YW50X3JhbmdlX3NlbGVjdGFibGUoc3RydWN0IGVkaWQgKmVkaWQpOwpAQCAtMTA1Nyw2ICsxMTAyLDE1IEBACiBleHRlcm4gY29uc3QgY2hhciAqZHJtX2dldF9mb3JtYXRfbmFtZSh1aW50MzJfdCBmb3JtYXQpOwogCiAvKiBIZWxwZXJzICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9wbGFuZSAqZHJtX3BsYW5lX2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJdWludDMyX3QgaWQpCit7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqbW87CisJbW8gPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGlkLCBEUk1fTU9ERV9PQkpFQ1RfUExBTkUpOworCXJldHVybiBtbyA/IG9ial90b19wbGFuZShtbykgOiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fY3J0YyAqZHJtX2NydGNfZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCXVpbnQzMl90IGlkKQogewpAQCAtMTA3Myw2ICsxMTI3LDMwIEBACiAJcmV0dXJuIG1vID8gb2JqX3RvX2VuY29kZXIobW8pIDogTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX2Nvbm5lY3Rvcl9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGlkKQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm1vOworCW1vID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBpZCwgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisJcmV0dXJuIG1vID8gb2JqX3RvX2Nvbm5lY3RvcihtbykgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fcHJvcGVydHkgKmRybV9wcm9wZXJ0eV9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGlkKQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm1vOworCW1vID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBpZCwgRFJNX01PREVfT0JKRUNUX1BST1BFUlRZKTsKKwlyZXR1cm4gbW8gPyBvYmpfdG9fcHJvcGVydHkobW8pIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX3Byb3BlcnR5X2Jsb2IgKgorZHJtX3Byb3BlcnR5X2Jsb2JfZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICptbzsKKwltbyA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgaWQsIERSTV9NT0RFX09CSkVDVF9CTE9CKTsKKwlyZXR1cm4gbW8gPyBvYmpfdG9fYmxvYihtbykgOiBOVUxMOworfQorCiAvKiBQbGFuZSBsaXN0IGl0ZXJhdG9yIGZvciBsZWdhY3kgKG92ZXJsYXkgb25seSkgcGxhbmVzLiAqLwogI2RlZmluZSBkcm1fZm9yX2VhY2hfbGVnYWN5X3BsYW5lKHBsYW5lLCBwbGFuZWxpc3QpIFwKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBsYW5lLCBwbGFuZWxpc3QsIGhlYWQpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKaW5kZXggMzZhNWZlYi4uYTNkNzVmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKQEAgLTExNCw3ICsxMTQsNyBAQAogLyoqCiAgKiBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyAtIGhlbHBlciBvcGVyYXRpb25zIGZvciBjb25uZWN0b3JzCiAgKiBAZ2V0X21vZGVzOiBnZXQgbW9kZSBsaXN0IGZvciB0aGlzIGNvbm5lY3RvcgotICogQG1vZGVfdmFsaWQ6IGlzIHRoaXMgbW9kZSB2YWxpZCBvbiB0aGUgZ2l2ZW4gY29ubmVjdG9yPworICogQG1vZGVfdmFsaWQgKG9wdGlvbmFsKTogaXMgdGhpcyBtb2RlIHZhbGlkIG9uIHRoZSBnaXZlbiBjb25uZWN0b3I/CiAgKgogICogVGhlIGhlbHBlciBvcGVyYXRpb25zIGFyZSBjYWxsZWQgYnkgdGhlIG1pZC1sYXllciBDUlRDIGhlbHBlci4KICAqLwpAQCAtMTY1LDYgKzE2NSwxMCBAQAogZXh0ZXJuIGludCBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IKIAkJCQkJCSAgICpjb25uZWN0b3IsIHVpbnQzMl90IG1heFgsCiAJCQkJCQkgICB1aW50MzJfdCBtYXhZKTsKK2V4dGVybiBpbnQgZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzX25vbWVyZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IKKwkJCQkJCQkgICAqY29ubmVjdG9yLAorCQkJCQkJCSAgIHVpbnQzMl90IG1heFgsCisJCQkJCQkJICAgdWludDMyX3QgbWF4WSk7CiBleHRlcm4gdm9pZCBkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBkcm1fa21zX2hlbHBlcl9wb2xsX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gYm9vbCBkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKaW5kZXggY2ZjYWNlYy4uYTIxNTY4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaApAQCAtMzcsNiArMzcsNyBAQAogICogZURQOiBFbWJlZGRlZCBEaXNwbGF5UG9ydCB2ZXJzaW9uIDEKICAqIERQSTogRGlzcGxheVBvcnQgSW50ZXJvcGVyYWJpbGl0eSBHdWlkZWxpbmUgdjEuMWEKICAqIDEuMjogRGlzcGxheVBvcnQgMS4yCisgKiBNU1Q6IE11bHRpc3RyZWFtIFRyYW5zcG9ydCAtIHBhcnQgb2YgRFAgMS4yYQogICoKICAqIDEuMiBmb3JtYWxseSBpbmNsdWRlcyBib3RoIGVEUCBhbmQgRFBJIGRlZmluaXRpb25zLgogICovCkBAIC0xMDMsOSArMTA0LDE0IEBACiAjZGVmaW5lIERQX1RSQUlOSU5HX0FVWF9SRF9JTlRFUlZBTCAgICAgICAgIDB4MDBlICAgLyogWFhYIDEuMj8gKi8KIAogLyogTXVsdGlwbGUgc3RyZWFtIHRyYW5zcG9ydCAqLworI2RlZmluZSBEUF9GQVVYX0NBUAkJCSAgICAweDAyMCAgIC8qIDEuMiAqLworIyBkZWZpbmUgRFBfRkFVWF9DQVBfMQkJCSAgICAoMSA8PCAwKQorCiAjZGVmaW5lIERQX01TVE1fQ0FQCQkJICAgIDB4MDIxICAgLyogMS4yICovCiAjIGRlZmluZSBEUF9NU1RfQ0FQCQkJICAgICgxIDw8IDApCiAKKyNkZWZpbmUgRFBfR1VJRAkJCQkgICAgMHgwMzAgICAvKiAxLjIgKi8KKwogI2RlZmluZSBEUF9QU1JfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAweDA3MCAgIC8qIFhYWCAxLjI/ICovCiAjIGRlZmluZSBEUF9QU1JfSVNfU1VQUE9SVEVEICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgRFBfUFNSX0NBUFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzEgICAvKiBYWFggMS4yPyAqLwpAQCAtMjIxLDYgKzIyNywxNiBAQAogIyBkZWZpbmUgRFBfUFNSX0NSQ19WRVJJRklDQVRJT04JICAgICgxIDw8IDIpCiAjIGRlZmluZSBEUF9QU1JfRlJBTUVfQ0FQVFVSRQkJICAgICgxIDw8IDMpCiAKKyNkZWZpbmUgRFBfQURBUFRFUl9DVFJMCQkJICAgIDB4MWEwCisjIGRlZmluZSBEUF9BREFQVEVSX0NUUkxfRk9SQ0VfTE9BRF9TRU5TRSAgICgxIDw8IDApCisKKyNkZWZpbmUgRFBfQlJBTkNIX0RFVklDRV9DVFJMCQkgICAgMHgxYTEKKyMgZGVmaW5lIERQX0JSQU5DSF9ERVZJQ0VfSVJRX0hQRAkgICAgKDEgPDwgMCkKKworI2RlZmluZSBEUF9QQVlMT0FEX0FMTE9DQVRFX1NFVAkJICAgIDB4MWMwCisjZGVmaW5lIERQX1BBWUxPQURfQUxMT0NBVEVfU1RBUlRfVElNRV9TTE9UIDB4MWMxCisjZGVmaW5lIERQX1BBWUxPQURfQUxMT0NBVEVfVElNRV9TTE9UX0NPVU5UIDB4MWMyCisKICNkZWZpbmUgRFBfU0lOS19DT1VOVAkJCSAgICAweDIwMAogLyogcHJpb3IgdG8gMS4yIGJpdCA3IHdhcyByZXNlcnZlZCBtYnogKi8KICMgZGVmaW5lIERQX0dFVF9TSU5LX0NPVU5UKHgpCQkgICAgKCgoKHgpICYgMHg4MCkgPj4gMSkgfCAoKHgpICYgMHgzZikpCkBAIC0yMzAsNiArMjQ2LDkgQEAKICMgZGVmaW5lIERQX1JFTU9URV9DT05UUk9MX0NPTU1BTkRfUEVORElORyAgKDEgPDwgMCkKICMgZGVmaW5lIERQX0FVVE9NQVRFRF9URVNUX1JFUVVFU1QJICAgICgxIDw8IDEpCiAjIGRlZmluZSBEUF9DUF9JUlEJCQkgICAgKDEgPDwgMikKKyMgZGVmaW5lIERQX01DQ1NfSVJRCQkJICAgICgxIDw8IDMpCisjIGRlZmluZSBEUF9ET1dOX1JFUF9NU0dfUkRZCQkgICAgKDEgPDwgNCkgLyogMS4yIE1TVCAqLworIyBkZWZpbmUgRFBfVVBfUkVRX01TR19SRFkJCSAgICAoMSA8PCA1KSAvKiAxLjIgTVNUICovCiAjIGRlZmluZSBEUF9TSU5LX1NQRUNJRklDX0lSUQkJICAgICgxIDw8IDYpCiAKICNkZWZpbmUgRFBfTEFORTBfMV9TVEFUVVMJCSAgICAweDIwMgpAQCAtMjkxLDkgKzMxMCwxOCBAQAogIyBkZWZpbmUgRFBfVEVTVF9OQUsJCQkgICAgKDEgPDwgMSkKICMgZGVmaW5lIERQX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURQkgICAgKDEgPDwgMikKIAorI2RlZmluZSBEUF9URVNUX0VESURfQ0hFQ0tTVU0JCSAgICAweDI2MQorCiAjZGVmaW5lIERQX1RFU1RfU0lOSwkJCSAgICAweDI3MAogI2RlZmluZSBEUF9URVNUX1NJTktfU1RBUlQJICAgICgxIDw8IDApCiAKKyNkZWZpbmUgRFBfUEFZTE9BRF9UQUJMRV9VUERBVEVfU1RBVFVTICAgICAgMHgyYzAgICAvKiAxLjIgTVNUICovCisjIGRlZmluZSBEUF9QQVlMT0FEX1RBQkxFX1VQREFURUQgICAgICAgICAgICgxIDw8IDApCisjIGRlZmluZSBEUF9QQVlMT0FEX0FDVF9IQU5ETEVEICAgICAgICAgICAgICgxIDw8IDEpCisKKyNkZWZpbmUgRFBfVkNfUEFZTE9BRF9JRF9TTE9UXzEgICAgICAgICAgICAgMHgyYzEgICAvKiAxLjIgTVNUICovCisvKiB1cCB0byBJRF9TTE9UXzYzIGF0IDB4MmZmICovCisKICNkZWZpbmUgRFBfU09VUkNFX09VSQkJCSAgICAweDMwMAogI2RlZmluZSBEUF9TSU5LX09VSQkJCSAgICAweDQwMAogI2RlZmluZSBEUF9CUkFOQ0hfT1VJCQkJICAgIDB4NTAwCkBAIC0zMDMsNiArMzMxLDIxIEBACiAjIGRlZmluZSBEUF9TRVRfUE9XRVJfRDMgICAgICAgICAgICAgICAgICAgIDB4MgogIyBkZWZpbmUgRFBfU0VUX1BPV0VSX01BU0sgICAgICAgICAgICAgICAgICAweDMKIAorI2RlZmluZSBEUF9TSURFQkFORF9NU0dfRE9XTl9SRVFfQkFTRQkgICAgMHgxMDAwICAgLyogMS4yIE1TVCAqLworI2RlZmluZSBEUF9TSURFQkFORF9NU0dfVVBfUkVQX0JBU0UJICAgIDB4MTIwMCAgIC8qIDEuMiBNU1QgKi8KKyNkZWZpbmUgRFBfU0lERUJBTkRfTVNHX0RPV05fUkVQX0JBU0UJICAgIDB4MTQwMCAgIC8qIDEuMiBNU1QgKi8KKyNkZWZpbmUgRFBfU0lERUJBTkRfTVNHX1VQX1JFUV9CQVNFCSAgICAweDE2MDAgICAvKiAxLjIgTVNUICovCisKKyNkZWZpbmUgRFBfU0lOS19DT1VOVF9FU0kJCSAgICAweDIwMDIgICAvKiAxLjIgKi8KKy8qIDAtNSBzaW5rIGNvdW50ICovCisjIGRlZmluZSBEUF9TSU5LX0NPVU5UX0NQX1JFQURZICAgICAgICAgICAgICgxIDw8IDYpCisKKyNkZWZpbmUgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUl9FU0kwICAgMHgyMDAzICAgLyogMS4yICovCisKKyNkZWZpbmUgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUl9FU0kxICAgMHgyMDA0ICAgLyogMS4yICovCisKKyNkZWZpbmUgRFBfTElOS19TRVJWSUNFX0lSUV9WRUNUT1JfRVNJMCAgICAgMHgyMDA1ICAgLyogMS4yICovCisKICNkZWZpbmUgRFBfUFNSX0VSUk9SX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgyMDA2ICAvKiBYWFggMS4yPyAqLwogIyBkZWZpbmUgRFBfUFNSX0xJTktfQ1JDX0VSUk9SICAgICAgICAgICAgICAoMSA8PCAwKQogIyBkZWZpbmUgRFBfUFNSX1JGQl9TVE9SQUdFX0VSUk9SICAgICAgICAgICAoMSA8PCAxKQpAQCAtMzE5LDYgKzM2Miw0MyBAQAogIyBkZWZpbmUgRFBfUFNSX1NJTktfSU5URVJOQUxfRVJST1IgICAgICAgICA3CiAjIGRlZmluZSBEUF9QU1JfU0lOS19TVEFURV9NQVNLICAgICAgICAgICAgIDB4MDcKIAorLyogRFAgMS4yIFNpZGViYW5kIG1lc3NhZ2UgZGVmaW5lcyAqLworLyogcGVlciBkZXZpY2UgdHlwZSAtIERQIDEuMmEgVGFibGUgMi05MiAqLworI2RlZmluZSBEUF9QRUVSX0RFVklDRV9OT05FCQkweDAKKyNkZWZpbmUgRFBfUEVFUl9ERVZJQ0VfU09VUkNFX09SX1NTVAkweDEKKyNkZWZpbmUgRFBfUEVFUl9ERVZJQ0VfTVNUX0JSQU5DSElORwkweDIKKyNkZWZpbmUgRFBfUEVFUl9ERVZJQ0VfU1NUX1NJTksJCTB4MworI2RlZmluZSBEUF9QRUVSX0RFVklDRV9EUF9MRUdBQ1lfQ09OVgkweDQKKworLyogRFAgMS4yIE1TVCBzaWRlYmFuZCByZXF1ZXN0IG5hbWVzIERQIDEuMmEgVGFibGUgMi04MCAqLworI2RlZmluZSBEUF9MSU5LX0FERFJFU1MJCQkweDAxCisjZGVmaW5lIERQX0NPTk5FQ1RJT05fU1RBVFVTX05PVElGWQkweDAyCisjZGVmaW5lIERQX0VOVU1fUEFUSF9SRVNPVVJDRVMJCTB4MTAKKyNkZWZpbmUgRFBfQUxMT0NBVEVfUEFZTE9BRAkJMHgxMQorI2RlZmluZSBEUF9RVUVSWV9QQVlMT0FECQkweDEyCisjZGVmaW5lIERQX1JFU09VUkNFX1NUQVRVU19OT1RJRlkJMHgxMworI2RlZmluZSBEUF9DTEVBUl9QQVlMT0FEX0lEX1RBQkxFCTB4MTQKKyNkZWZpbmUgRFBfUkVNT1RFX0RQQ0RfUkVBRAkJMHgyMAorI2RlZmluZSBEUF9SRU1PVEVfRFBDRF9XUklURQkJMHgyMQorI2RlZmluZSBEUF9SRU1PVEVfSTJDX1JFQUQJCTB4MjIKKyNkZWZpbmUgRFBfUkVNT1RFX0kyQ19XUklURQkJMHgyMworI2RlZmluZSBEUF9QT1dFUl9VUF9QSFkJCQkweDI0CisjZGVmaW5lIERQX1BPV0VSX0RPV05fUEhZCQkweDI1CisjZGVmaW5lIERQX1NJTktfRVZFTlRfTk9USUZZCQkweDMwCisjZGVmaW5lIERQX1FVRVJZX1NUUkVBTV9FTkNfU1RBVFVTCTB4MzgKKworLyogRFAgMS4yIE1TVCBzaWRlYmFuZCBuYWsgcmVhc29ucyAtIHRhYmxlIDIuODQgKi8KKyNkZWZpbmUgRFBfTkFLX1dSSVRFX0ZBSUxVUkUJCTB4MDEKKyNkZWZpbmUgRFBfTkFLX0lOVkFMSURfUkVBRAkJMHgwMgorI2RlZmluZSBEUF9OQUtfQ1JDX0ZBSUxVUkUJCTB4MDMKKyNkZWZpbmUgRFBfTkFLX0JBRF9QQVJBTQkJMHgwNAorI2RlZmluZSBEUF9OQUtfREVGRVIJCQkweDA1CisjZGVmaW5lIERQX05BS19MSU5LX0ZBSUxVUkUJCTB4MDYKKyNkZWZpbmUgRFBfTkFLX05PX1JFU09VUkNFUwkJMHgwNworI2RlZmluZSBEUF9OQUtfRFBDRF9GQUlMCQkweDA4CisjZGVmaW5lIERQX05BS19JMkNfTkFLCQkJMHgwOQorI2RlZmluZSBEUF9OQUtfQUxMT0NBVEVfRkFJTAkJMHgwYQorCiAjZGVmaW5lIE1PREVfSTJDX1NUQVJUCTEKICNkZWZpbmUgTU9ERV9JMkNfV1JJVEUJMgogI2RlZmluZSBNT0RFX0kyQ19SRUFECTQKQEAgLTQzMSw4ICs1MTEsMTAgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZHJtX2RwX2F1eCAtIERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKiBAbmFtZTogdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBBVVggY2hhbm5lbCBhbmQgdGhlIEkyQy1vdmVyLUFVWCBhZGFwdGVyCiAgKiBAZGRjOiBJMkMgYWRhcHRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBJMkMtb3Zlci1BVVggY29tbXVuaWNhdGlvbgogICogQGRldjogcG9pbnRlciB0byBzdHJ1Y3QgZGV2aWNlIHRoYXQgaXMgdGhlIHBhcmVudCBmb3IgdGhpcyBBVVggY2hhbm5lbAorICogQGh3X211dGV4OiBpbnRlcm5hbCBtdXRleCB1c2VkIGZvciBsb2NraW5nIHRyYW5zZmVycwogICogQHRyYW5zZmVyOiB0cmFuc2ZlcnMgYSBtZXNzYWdlIHJlcHJlc2VudGluZyBhIHNpbmdsZSBBVVggdHJhbnNhY3Rpb24KICAqCiAgKiBUaGUgLmRldiBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHRoYXQgaW1wbGVtZW50cwpAQCAtNDY1LDcgKzU0Nyw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgZGRjOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQorCXN0cnVjdCBtdXRleCBod19tdXRleDsKIAlzc2l6ZV90ICgqdHJhbnNmZXIpKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCiAJCQkgICAgc3RydWN0IGRybV9kcF9hdXhfbXNnICptc2cpOwogfTsKQEAgLTUyNCw3ICs2MDYsNyBAQAogaW50IGRybV9kcF9saW5rX3Bvd2VyX3VwKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdCBkcm1fZHBfbGluayAqbGluayk7CiBpbnQgZHJtX2RwX2xpbmtfY29uZmlndXJlKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdCBkcm1fZHBfbGluayAqbGluayk7CiAKLWludCBkcm1fZHBfYXV4X3JlZ2lzdGVyX2kyY19idXMoc3RydWN0IGRybV9kcF9hdXggKmF1eCk7Ci12b2lkIGRybV9kcF9hdXhfdW5yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpOworaW50IGRybV9kcF9hdXhfcmVnaXN0ZXIoc3RydWN0IGRybV9kcF9hdXggKmF1eCk7Cit2b2lkIGRybV9kcF9hdXhfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KTsKIAogI2VuZGlmIC8qIF9EUk1fRFBfSEVMUEVSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZWRpZC5oIGIvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaAppbmRleCBhMTQ0MWM1Li5iOTYwMzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZWRpZC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKQEAgLTIwMiw2ICsyMDIsMTEgQEAKICNkZWZpbmUgRFJNX0VESURfRkVBVFVSRV9QTV9TVVNQRU5EICAgICAgICgxIDw8IDYpCiAjZGVmaW5lIERSTV9FRElEX0ZFQVRVUkVfUE1fU1RBTkRCWSAgICAgICAoMSA8PCA3KQogCisjZGVmaW5lIERSTV9FRElEX0hETUlfRENfNDggICAgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBEUk1fRURJRF9IRE1JX0RDXzM2ICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgRFJNX0VESURfSERNSV9EQ18zMCAgICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIERSTV9FRElEX0hETUlfRENfWTQ0NCAgICAgICAgICAgICAoMSA8PCAzKQorCiBzdHJ1Y3QgZWRpZCB7CiAJdTggaGVhZGVyWzhdOwogCS8qIFZlbmRvciAmIHByb2R1Y3QgaW5mbyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCmluZGV4IDZlNjIyZjcuLjc5OTcyNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKQEAgLTEwOCw3ICsxMDgsNyBAQAogaW50IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAotYm9vbCBkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyKTsKK2Jvb2wgZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGVfdW5sb2NrZWQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7CiB2b2lkIGRybV9mYl9oZWxwZXJfZmlsbF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJCQkgICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCk7CiB2b2lkIGRybV9mYl9oZWxwZXJfZmlsbF9maXgoc3RydWN0IGZiX2luZm8gKmluZm8sIHVpbnQzMl90IHBpdGNoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZsaXBfd29yay5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZsaXBfd29yay5oCmluZGV4IDM1Yzc3NmEuLjllZWQzNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mbGlwX3dvcmsuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmxpcF93b3JrLmgKQEAgLTU3LDYgKzU3LDcgQEAKICAqIEBjb3VudDogbnVtYmVyIG9mIGNvbW1pdHRlZCBpdGVtcwogICogQGZ1bmM6IGNhbGxiYWNrIGZ4biBjYWxsZWQgZm9yIGVhY2ggY29tbWl0dGVkIGl0ZW0KICAqIEB3b3JrZXI6IHdvcmtlciB3aGljaCBjYWxscyBAZnVuYworICogQGZpZm86IHF1ZXVlIG9mIGNvbW1pdHRlZCBpdGVtcwogICovCiBzdHJ1Y3QgZHJtX2ZsaXBfd29yayB7CiAJY29uc3QgY2hhciAqbmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9taXBpX2RzaS5oIGIvaW5jbHVkZS9kcm0vZHJtX21pcGlfZHNpLmgKaW5kZXggNzIwOWRmMS4uOTQ0ZjMzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21pcGlfZHNpLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX21pcGlfZHNpLmgKQEAgLTEzNSwxMSArMTM1LDEzIEBACiAgKiBAZHJpdmVyOiBkZXZpY2UgZHJpdmVyIG1vZGVsIGRyaXZlcgogICogQHByb2JlOiBjYWxsYmFjayBmb3IgZGV2aWNlIGJpbmRpbmcKICAqIEByZW1vdmU6IGNhbGxiYWNrIGZvciBkZXZpY2UgdW5iaW5kaW5nCisgKiBAc2h1dGRvd246IGNhbGxlZCBhdCBzaHV0ZG93biB0aW1lIHRvIHF1aWVzY2UgdGhlIGRldmljZQogICovCiBzdHJ1Y3QgbWlwaV9kc2lfZHJpdmVyIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CiAJaW50KCpwcm9iZSkoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKTsKIAlpbnQoKnJlbW92ZSkoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSk7CiB9OwogCiAjZGVmaW5lIHRvX21pcGlfZHNpX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG1pcGlfZHNpX2RyaXZlciwgZHJpdmVyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGVzLmggYi9pbmNsdWRlL2RybS9kcm1fbW9kZXMuaAppbmRleCAyZGJiZjk5Li45MWQwNTgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fbW9kZXMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fbW9kZXMuaApAQCAtMjIzLDcgKzIyMyw3IEBACiB2b2lkIGRybV9tb2RlX3BydW5lX2ludmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICptb2RlX2xpc3QsIGJvb2wgdmVyYm9zZSk7CiB2b2lkIGRybV9tb2RlX3NvcnQoc3RydWN0IGxpc3RfaGVhZCAqbW9kZV9saXN0KTsKLXZvaWQgZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwordm9pZCBkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBtZXJnZV90eXBlX2JpdHMpOwogCiAvKiBwYXJzaW5nIGNtZGxpbmUgbW9kZXMgKi8KIGJvb2wKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2xvY2suaCBiL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJhYTdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vZHJtX21vZGVzZXRfbG9jay5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQKKyAqIEF1dGhvcjogUm9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRFJNX01PREVTRVRfTE9DS19IXworI2RlZmluZSBEUk1fTU9ERVNFVF9MT0NLX0hfCisKKyNpbmNsdWRlIDxsaW51eC93d19tdXRleC5oPgorCitzdHJ1Y3QgZHJtX21vZGVzZXRfbG9jazsKKworLyoqCisgKiBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAtIGxvY2tpbmcgY29udGV4dCAoc2VlIHd3X2FjcXVpcmVfY3R4KQorICogQHd3X2N0eDogYmFzZSBhY3F1aXJlIGN0eAorICogQGNvbnRlbmRlZDogdXNlZCBpbnRlcm5hbGx5IGZvciAtRURFQURMSyBoYW5kbGluZworICogQGxvY2tlZDogbGlzdCBvZiBoZWxkIGxvY2tzCisgKgorICogRWFjaCB0aHJlYWQgY29tcGV0aW5nIGZvciBhIHNldCBvZiBsb2NrcyBtdXN0IHVzZSBvbmUgYWNxdWlyZQorICogY3R4LiAgQW5kIGlmIGFueSBsb2NrIGZ4biByZXR1cm5zIC1FREVBRExLLCBpdCBtdXN0IGJhY2tvZmYgYW5kCisgKiByZXRyeS4KKyAqLworc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IHsKKworCXN0cnVjdCB3d19hY3F1aXJlX2N0eCB3d19jdHg7CisKKwkvKioKKwkgKiBDb250ZW5kZWQgbG9jazogaWYgYSBsb2NrIGlzIGNvbnRlbmRlZCB5b3Ugc2hvdWxkIG9ubHkgY2FsbAorCSAqIGRybV9tb2Rlc2V0X2JhY2tvZmYoKSB3aGljaCBkcm9wcyBsb2NrcyBhbmQgc2xvdy1sb2NrcyB0aGUKKwkgKiBjb250ZW5kZWQgbG9jay4KKwkgKi8KKwlzdHJ1Y3QgZHJtX21vZGVzZXRfbG9jayAqY29udGVuZGVkOworCisJLyoqCisJICogbGlzdCBvZiBoZWxkIGxvY2tzIChkcm1fbW9kZXNldF9sb2NrKQorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja2VkOworfTsKKworLyoqCisgKiBkcm1fbW9kZXNldF9sb2NrIC0gdXNlZCBmb3IgbG9ja2luZyBtb2Rlc2V0IHJlc291cmNlcy4KKyAqIEBtdXRleDogcmVzb3VyY2UgbG9ja2luZworICogQGhlYWQ6IHVzZWQgdG8gaG9sZCBpdCdzIHBsYWNlIG9uIHN0YXRlLT5sb2NrZWQgbGlzdCB3aGVuCisgKiAgICBwYXJ0IG9mIGFuIGF0b21pYyB1cGRhdGUKKyAqCisgKiBVc2VkIGZvciBsb2NraW5nIENSVENzIGFuZCBvdGhlciBtb2Rlc2V0IHJlc291cmNlcy4KKyAqLworc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgeworCS8qKgorCSAqIG1vZGVzZXQgbG9jaworCSAqLworCXN0cnVjdCB3d19tdXRleCBtdXRleDsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGFyZSBsb2NrZWQgYXMgcGFydCBvZiBhbiBhdG9taWMgdXBkYXRlIGFyZSBhZGRlZAorCSAqIHRvIGEgbGlzdCAoc28gd2Uga25vdyB3aGF0IHRvIHVubG9jayBhdCB0aGUgZW5kKS4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Cit9OworCitleHRlcm4gc3RydWN0IHd3X2NsYXNzIGNydGNfd3dfY2xhc3M7CisKK3ZvaWQgZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4LAorCQl1aW50MzJfdCBmbGFncyk7Cit2b2lkIGRybV9tb2Rlc2V0X2FjcXVpcmVfZmluaShzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggKmN0eCk7Cit2b2lkIGRybV9tb2Rlc2V0X2Ryb3BfbG9ja3Moc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpOwordm9pZCBkcm1fbW9kZXNldF9iYWNrb2ZmKHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KTsKK2ludCBkcm1fbW9kZXNldF9iYWNrb2ZmX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpOworCisvKioKKyAqIGRybV9tb2Rlc2V0X2xvY2tfaW5pdCAtIGluaXRpYWxpemUgbG9jaworICogQGxvY2s6IGxvY2sgdG8gaW5pdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZHJtX21vZGVzZXRfbG9ja19pbml0KHN0cnVjdCBkcm1fbW9kZXNldF9sb2NrICpsb2NrKQoreworCXd3X211dGV4X2luaXQoJmxvY2stPm11dGV4LCAmY3J0Y193d19jbGFzcyk7CisJSU5JVF9MSVNUX0hFQUQoJmxvY2stPmhlYWQpOworfQorCisvKioKKyAqIGRybV9tb2Rlc2V0X2xvY2tfZmluaSAtIGNsZWFudXAgbG9jaworICogQGxvY2s6IGxvY2sgdG8gY2xlYW51cAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZHJtX21vZGVzZXRfbG9ja19maW5pKHN0cnVjdCBkcm1fbW9kZXNldF9sb2NrICpsb2NrKQoreworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmxvY2stPmhlYWQpKTsKK30KKworLyoqCisgKiBkcm1fbW9kZXNldF9pc19sb2NrZWQgLSBlcXVpdmFsZW50IHRvIG11dGV4X2lzX2xvY2tlZCgpCisgKiBAbG9jazogbG9jayB0byBjaGVjaworICovCitzdGF0aWMgaW5saW5lIGJvb2wgZHJtX21vZGVzZXRfaXNfbG9ja2VkKHN0cnVjdCBkcm1fbW9kZXNldF9sb2NrICpsb2NrKQoreworCXJldHVybiB3d19tdXRleF9pc19sb2NrZWQoJmxvY2stPm11dGV4KTsKK30KKworaW50IGRybV9tb2Rlc2V0X2xvY2soc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2ssCisJCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KTsKK2ludCBkcm1fbW9kZXNldF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9tb2Rlc2V0X2xvY2sgKmxvY2ssCisJCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4KTsKK3ZvaWQgZHJtX21vZGVzZXRfdW5sb2NrKHN0cnVjdCBkcm1fbW9kZXNldF9sb2NrICpsb2NrKTsKKworc3RydWN0IGRybV9kZXZpY2U7CitpbnQgZHJtX21vZGVzZXRfbG9ja19hbGxfY3J0Y3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgpOworCisjZW5kaWYgLyogRFJNX01PREVTRVRfTE9DS19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX3BsYW5lX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lX2hlbHBlci5oCmluZGV4IDA5ODI0YmVjLi41MmU2ODcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fcGxhbmVfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lX2hlbHBlci5oCkBAIC0yNCw2ICsyNCwxNyBAQAogI2lmbmRlZiBEUk1fUExBTkVfSEVMUEVSX0gKICNkZWZpbmUgRFJNX1BMQU5FX0hFTFBFUl9ICiAKKyNpbmNsdWRlIDxkcm0vZHJtX3JlY3QuaD4KKworLyoKKyAqIERyaXZlcnMgdGhhdCBkb24ndCBhbGxvdyBwcmltYXJ5IHBsYW5lIHNjYWxpbmcgbWF5IHBhc3MgdGhpcyBtYWNybyBpbiBwbGFjZQorICogb2YgdGhlIG1pbi9tYXggc2NhbGUgcGFyYW1ldGVycyBvZiB0aGUgdXBkYXRlIGNoZWNrZXIgZnVuY3Rpb24uCisgKgorICogRHVlIHRvIHNyYyBiZWluZyBpbiAxNi4xNiBmaXhlZCBwb2ludCBhbmQgZGVzdCBiZWluZyBpbiBpbnRlZ2VyIHBpeGVscywKKyAqIDE8PDE2IHJlcHJlc2VudHMgbm8gc2NhbGluZy4KKyAqLworI2RlZmluZSBEUk1fUExBTkVfSEVMUEVSX05PX1NDQUxJTkcgKDE8PDE2KQorCiAvKioKICAqIERPQzogcGxhbmUgaGVscGVycwogICoKQEAgLTMxLDYgKzQyLDE3IEBACiAgKiBwbGFuZXMuCiAgKi8KIAorZXh0ZXJuIGludCBkcm1fcGxhbmVfaGVscGVyX2NoZWNrX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkgc3RydWN0IGRybV9yZWN0ICpzcmMsCisJCQkJCSBzdHJ1Y3QgZHJtX3JlY3QgKmRlc3QsCisJCQkJCSBjb25zdCBzdHJ1Y3QgZHJtX3JlY3QgKmNsaXAsCisJCQkJCSBpbnQgbWluX3NjYWxlLAorCQkJCQkgaW50IG1heF9zY2FsZSwKKwkJCQkJIGJvb2wgY2FuX3Bvc2l0aW9uLAorCQkJCQkgYm9vbCBjYW5fdXBkYXRlX2Rpc2FibGVkLAorCQkJCQkgYm9vbCAqdmlzaWJsZSk7CiBleHRlcm4gaW50IGRybV9wcmltYXJ5X2hlbHBlcl91cGRhdGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCiAJCQkJICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKQEAgLTQyLDcgKzY0LDcgQEAKIGV4dGVybiB2b2lkIGRybV9wcmltYXJ5X2hlbHBlcl9kZXN0cm95KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIGRybV9wcmltYXJ5X2hlbHBlcl9mdW5jczsKIGV4dGVybiBzdHJ1Y3QgZHJtX3BsYW5lICpkcm1fcHJpbWFyeV9oZWxwZXJfY3JlYXRlX3BsYW5lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCQkJIHVpbnQzMl90ICpmb3JtYXRzLAorCQkJCQkJCSBjb25zdCB1aW50MzJfdCAqZm9ybWF0cywKIAkJCQkJCQkgaW50IG51bV9mb3JtYXRzKTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9pOTE1X3BjaWlkcy5oIGIvaW5jbHVkZS9kcm0vaTkxNV9wY2lpZHMuaAppbmRleCAwMTJkNThmLi4wNTcyMDM1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaTkxNV9wY2lpZHMuaAorKysgYi9pbmNsdWRlL2RybS9pOTE1X3BjaWlkcy5oCkBAIC0yMjMsMTQgKzIyMywzMiBAQAogCV9JTlRFTF9CRFdfRChndCwgMHgxNjBBLCBpbmZvKSwgLyogU2VydmVyICovIFwKIAlfSU5URUxfQkRXX0QoZ3QsIDB4MTYwRCwgaW5mbykgLyogV29ya3N0YXRpb24gKi8KIAotI2RlZmluZSBJTlRFTF9CRFdfTV9JRFMoaW5mbykgXAorI2RlZmluZSBJTlRFTF9CRFdfR1QxMk1fSURTKGluZm8pIFwKIAlfSU5URUxfQkRXX01fSURTKDEsIGluZm8pLCBcCi0JX0lOVEVMX0JEV19NX0lEUygyLCBpbmZvKSwgXAorCV9JTlRFTF9CRFdfTV9JRFMoMiwgaW5mbykKKworI2RlZmluZSBJTlRFTF9CRFdfR1QxMkRfSURTKGluZm8pIFwKKwlfSU5URUxfQkRXX0RfSURTKDEsIGluZm8pLCBcCisJX0lOVEVMX0JEV19EX0lEUygyLCBpbmZvKQorCisjZGVmaW5lIElOVEVMX0JEV19HVDNNX0lEUyhpbmZvKSBcCiAJX0lOVEVMX0JEV19NX0lEUygzLCBpbmZvKQogCi0jZGVmaW5lIElOVEVMX0JEV19EX0lEUyhpbmZvKSBcCi0JX0lOVEVMX0JEV19EX0lEUygxLCBpbmZvKSwgXAotCV9JTlRFTF9CRFdfRF9JRFMoMiwgaW5mbyksIFwKKyNkZWZpbmUgSU5URUxfQkRXX0dUM0RfSURTKGluZm8pIFwKIAlfSU5URUxfQkRXX0RfSURTKDMsIGluZm8pCiAKKyNkZWZpbmUgSU5URUxfQkRXX01fSURTKGluZm8pIFwKKwlJTlRFTF9CRFdfR1QxMk1fSURTKGluZm8pLCBcCisJSU5URUxfQkRXX0dUM01fSURTKGluZm8pCisKKyNkZWZpbmUgSU5URUxfQkRXX0RfSURTKGluZm8pIFwKKwlJTlRFTF9CRFdfR1QxMkRfSURTKGluZm8pLCBcCisJSU5URUxfQkRXX0dUM0RfSURTKGluZm8pCisKKyNkZWZpbmUgSU5URUxfQ0hWX0lEUyhpbmZvKSBcCisJSU5URUxfVkdBX0RFVklDRSgweDIyYjAsIGluZm8pLCBcCisJSU5URUxfVkdBX0RFVklDRSgweDIyYjEsIGluZm8pLCBcCisJSU5URUxfVkdBX0RFVklDRSgweDIyYjIsIGluZm8pLCBcCisJSU5URUxfVkdBX0RFVklDRSgweDIyYjMsIGluZm8pCisKICNlbmRpZiAvKiBfSTkxNV9QQ0lJRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmgKaW5kZXggZWUxMjdlYy4uNzUyNmM1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oCkBAIC00ODUsMTMgKzQ4NSwxMiBAQAogCQkJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKikpOwogCiAvKioKLSAqIHR0bV9ib19zeW5jY3B1X29iamVjdF9pbml0CisgKiB0dG1fYm9fY3JlYXRlCiAgKgogICogQGJkZXY6IFBvaW50ZXIgdG8gYSB0dG1fYm9fZGV2aWNlIHN0cnVjdC4KLSAqIEBibzogUG9pbnRlciB0byBhIHR0bV9idWZmZXJfb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkLgogICogQHNpemU6IFJlcXVlc3RlZCBzaXplIG9mIGJ1ZmZlciBvYmplY3QuCiAgKiBAdHlwZTogUmVxdWVzdGVkIHR5cGUgb2YgYnVmZmVyIG9iamVjdC4KLSAqIEBmbGFnczogSW5pdGlhbCBwbGFjZW1lbnQgZmxhZ3MuCisgKiBAcGxhY2VtZW50OiBJbml0aWFsIHBsYWNlbWVudC4KICAqIEBwYWdlX2FsaWdubWVudDogRGF0YSBhbGlnbm1lbnQgaW4gcGFnZXMuCiAgKiBAaW50ZXJydXB0aWJsZTogSWYgbmVlZGluZyB0byBzbGVlcCB3aGlsZSB3YWl0aW5nIGZvciBHUFUgcmVzb3VyY2VzLAogICogc2xlZXAgaW50ZXJydXB0aWJsZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRoOWtfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvYXRoOWtfcGxhdGZvcm0uaAppbmRleCA4NTk4ZjhlLi5hNDk1YTk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0aDlrX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGg5a19wbGF0Zm9ybS5oCkBAIC0zNiw2ICszNiw4IEBACiAKIAlpbnQgKCpnZXRfbWFjX3JldmlzaW9uKSh2b2lkKTsKIAlpbnQgKCpleHRlcm5hbF9yZXNldCkodm9pZCk7CisKKwlib29sIHVzZV9lZXByb207CiB9OwogCiAjZW5kaWYgLyogX0xJTlVYX0FUSDlLX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCmluZGV4IGQ4ZTRjZWEuLjY2YzIxNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApAQCAtNSw4ICs1LDYgQEAKICNpZm5kZWYgX19MSU5VWF9CTEtfVFlQRVNfSAogI2RlZmluZSBfX0xJTlVYX0JMS19UWVBFU19ICiAKLSNpZmRlZiBDT05GSUdfQkxPQ0sKLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCBiaW9fc2V0OwpAQCAtMjgsNiArMjYsOCBAQAogCXVuc2lnbmVkIGludAlidl9vZmZzZXQ7CiB9OwogCisjaWZkZWYgQ09ORklHX0JMT0NLCisKIHN0cnVjdCBidmVjX2l0ZXIgewogCXNlY3Rvcl90CQliaV9zZWN0b3I7CS8qIGRldmljZSBhZGRyZXNzIGluIDUxMiBieXRlCiAJCQkJCQkgICBzZWN0b3JzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmgKaW5kZXggNzhjNmM1Mi4uYTA4NzUwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL2NvcmUuaApAQCAtMTAsOCArMTAsOCBAQAogICoKICAqLwogCi0jaWZuZGVmIENBTl9DT1JFX0gKLSNkZWZpbmUgQ0FOX0NPUkVfSAorI2lmbmRlZiBfQ0FOX0NPUkVfSAorI2RlZmluZSBfQ0FOX0NPUkVfSAogCiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC01OCw0ICs1OCw0IEBACiBleHRlcm4gaW50IGNhbl9zZW5kKHN0cnVjdCBza19idWZmICpza2IsIGludCBsb29wKTsKIGV4dGVybiBpbnQgY2FuX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotI2VuZGlmIC8qIENBTl9DT1JFX0ggKi8KKyNlbmRpZiAvKiAhX0NBTl9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oIGIvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKaW5kZXggM2NlNWU1Mi4uNjk5MmFmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKQEAgLTEwLDggKzEwLDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBDQU5fREVWX0gKLSNkZWZpbmUgQ0FOX0RFVl9ICisjaWZuZGVmIF9DQU5fREVWX0gKKyNkZWZpbmUgX0NBTl9ERVZfSAogCiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL25ldGxpbmsuaD4KQEAgLTEzMiw0ICsxMzIsNCBAQAogc3RydWN0IHNrX2J1ZmYgKmFsbG9jX2Nhbl9lcnJfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY2FuX2ZyYW1lICoqY2YpOwogCi0jZW5kaWYgLyogQ0FOX0RFVl9IICovCisjZW5kaWYgLyogIV9DQU5fREVWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FuL2xlZC5oIGIvaW5jbHVkZS9saW51eC9jYW4vbGVkLmgKaW5kZXggOWMxMTY3YmEuLmUwNDc1YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL2xlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL2xlZC5oCkBAIC02LDggKzYsOCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2lmbmRlZiBDQU5fTEVEX0gKLSNkZWZpbmUgQ0FOX0xFRF9ICisjaWZuZGVmIF9DQU5fTEVEX0gKKyNkZWZpbmUgX0NBTl9MRURfSAogCiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CkBAIC00OCw0ICs0OCw0IEBACiAKICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiAhX0NBTl9MRURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vY2M3NzAuaCBiL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL2NjNzcwLmgKaW5kZXggNzcwMjY0MS4uNzhiMmQ0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vY2M3NzAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9jYzc3MC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQ0FOX1BMQVRGT1JNX0NDNzcwX0hfCi0jZGVmaW5lIF9DQU5fUExBVEZPUk1fQ0M3NzBfSF8KKyNpZm5kZWYgX0NBTl9QTEFURk9STV9DQzc3MF9ICisjZGVmaW5lIF9DQU5fUExBVEZPUk1fQ0M3NzBfSAogCiAvKiBDUFUgSW50ZXJmYWNlIFJlZ2lzdGVyICgweDAyKSAqLwogI2RlZmluZSBDUFVJRl9DRU4JMHgwMQkvKiBDbG9jayBPdXQgRW5hYmxlICovCkBAIC0zMCw0ICszMCw0IEBACiAJdTggYmNyOwkJLyogQnVzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KIH07CiAKLSNlbmRpZgkvKiAhX0NBTl9QTEFURk9STV9DQzc3MF9IXyAqLworI2VuZGlmCS8qICFfQ0FOX1BMQVRGT1JNX0NDNzcwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL21jcDI1MXguaCBiL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL21jcDI1MXguaAppbmRleCBkYzAyOWRiLi5kNDRmY2FlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9tY3AyNTF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vbWNwMjUxeC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0NBTl9QTEFURk9STV9NQ1AyNTFYX0hfXwotI2RlZmluZSBfX0NBTl9QTEFURk9STV9NQ1AyNTFYX0hfXworI2lmbmRlZiBfQ0FOX1BMQVRGT1JNX01DUDI1MVhfSAorI2RlZmluZSBfQ0FOX1BMQVRGT1JNX01DUDI1MVhfSAogCiAvKgogICoKQEAgLTE4LDQgKzE4LDQgQEAKIAl1bnNpZ25lZCBsb25nIG9zY2lsbGF0b3JfZnJlcXVlbmN5OwogfTsKIAotI2VuZGlmIC8qIF9fQ0FOX1BMQVRGT1JNX01DUDI1MVhfSF9fICovCisjZW5kaWYgLyogIV9DQU5fUExBVEZPUk1fTUNQMjUxWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9yY2FyX2Nhbi5oIGIvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vcmNhcl9jYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRhMmYzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vcmNhcl9jYW4uaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9DQU5fUExBVEZPUk1fUkNBUl9DQU5fSF8KKyNkZWZpbmUgX0NBTl9QTEFURk9STV9SQ0FSX0NBTl9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyIHNldHRpbmdzICovCitlbnVtIENMS1IgeworCUNMS1JfQ0xLUDEgPSAwLAkvKiBQZXJpcGhlcmFsIGNsb2NrIChjbGtwMSkgKi8KKwlDTEtSX0NMS1AyID0gMSwJLyogUGVyaXBoZXJhbCBjbG9jayAoY2xrcDIpICovCisJQ0xLUl9DTEtFWFQgPSAzCS8qIEV4dGVybmFsbHkgaW5wdXQgY2xvY2sgKi8KK307CisKK3N0cnVjdCByY2FyX2Nhbl9wbGF0Zm9ybV9kYXRhIHsKKwllbnVtIENMS1IgY2xvY2tfc2VsZWN0OwkvKiBDbG9jayBzb3VyY2Ugc2VsZWN0ICovCit9OworCisjZW5kaWYJLyogIV9DQU5fUExBVEZPUk1fUkNBUl9DQU5fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL3NqYTEwMDAuaCBiL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL3NqYTEwMDAuaAppbmRleCA5NmY4ZmNjLi45MzU3MGI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9zamExMDAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vc2phMTAwMC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQ0FOX1BMQVRGT1JNX1NKQTEwMDBfSF8KLSNkZWZpbmUgX0NBTl9QTEFURk9STV9TSkExMDAwX0hfCisjaWZuZGVmIF9DQU5fUExBVEZPUk1fU0pBMTAwMF9ICisjZGVmaW5lIF9DQU5fUExBVEZPUk1fU0pBMTAwMF9ICiAKIC8qIGNsb2NrIGRpdmlkZXIgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ0RSX0NMS09VVF9NQVNLIDB4MDcKQEAgLTMyLDQgKzMyLDQgQEAKIAl1OCBjZHI7CQkvKiBjbG9jayBkaXZpZGVyIHJlZ2lzdGVyICovCiB9OwogCi0jZW5kaWYJLyogIV9DQU5fUExBVEZPUk1fU0pBMTAwMF9IXyAqLworI2VuZGlmCS8qICFfQ0FOX1BMQVRGT1JNX1NKQTEwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vdGlfaGVjYy5oIGIvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vdGlfaGVjYy5oCmluZGV4IGFmMTdjYjMuLmE1MmY0N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL3RpX2hlY2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS90aV9oZWNjLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQ0FOX1BMQVRGT1JNX1RJX0hFQ0NfSF9fCi0jZGVmaW5lIF9fQ0FOX1BMQVRGT1JNX1RJX0hFQ0NfSF9fCisjaWZuZGVmIF9DQU5fUExBVEZPUk1fVElfSEVDQ19ICisjZGVmaW5lIF9DQU5fUExBVEZPUk1fVElfSEVDQ19ICiAKIC8qCiAgKiBUSSBIRUNDIChIaWdoIEVuZCBDQU4gQ29udHJvbGxlcikgZHJpdmVyIHBsYXRmb3JtIGhlYWRlcgpAQCAtNDEsNCArNDEsNCBAQAogCXUzMiB2ZXJzaW9uOwogCXZvaWQgKCp0cmFuc2NlaXZlcl9zd2l0Y2gpIChpbnQpOwogfTsKLSNlbmRpZgorI2VuZGlmIC8qICFfQ0FOX1BMQVRGT1JNX1RJX0hFQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vc2tiLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaAppbmRleCBmOWJiYmI0Li5jYzAwZDE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaApAQCAtNyw4ICs3LDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBDQU5fU0tCX0gKLSNkZWZpbmUgQ0FOX1NLQl9ICisjaWZuZGVmIF9DQU5fU0tCX0gKKyNkZWZpbmUgX0NBTl9TS0JfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTgwLDQgKzgwLDQgQEAKIAlyZXR1cm4gc2tiOwogfQogCi0jZW5kaWYgLyogQ0FOX1NLQl9IICovCisjZW5kaWYgLyogIV9DQU5fU0tCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2VwaC9jZXBoX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvY2VwaF9mcy5oCmluZGV4IDVmNmRiMTguLjNjOTdkNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2VwaC9jZXBoX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZXBoL2NlcGhfZnMuaApAQCAtNjI1LDYgKzYyNSw4IEBACiAJCQkgICBDRVBIX0NBUF9MSU5LX0VYQ0wgfAkJXAogCQkJICAgQ0VQSF9DQVBfWEFUVFJfRVhDTCB8CVwKIAkJCSAgIENFUEhfQ0FQX0ZJTEVfRVhDTCkKKyNkZWZpbmUgQ0VQSF9DQVBfQU5ZX0ZJTEVfUkQgKENFUEhfQ0FQX0ZJTEVfUkQgfCBDRVBIX0NBUF9GSUxFX0NBQ0hFIHwgXAorCQkJICAgICAgQ0VQSF9DQVBfRklMRV9TSEFSRUQpCiAjZGVmaW5lIENFUEhfQ0FQX0FOWV9GSUxFX1dSIChDRVBIX0NBUF9GSUxFX1dSIHwgQ0VQSF9DQVBfRklMRV9CVUZGRVIgfAlcCiAJCQkgICAgICBDRVBIX0NBUF9GSUxFX0VYQ0wpCiAjZGVmaW5lIENFUEhfQ0FQX0FOWV9XUiAgIChDRVBIX0NBUF9BTllfRVhDTCB8IENFUEhfQ0FQX0FOWV9GSUxFX1dSKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZXBoL2xpYmNlcGguaCBiL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmgKaW5kZXggMmY0OWFhNC4uMjc5YjBhZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZXBoL2xpYmNlcGguaApAQCAtMjIyLDggKzIyMiw2IEBACiBleHRlcm4gdm9pZCBjZXBoX2NvcHlfZnJvbV9wYWdlX3ZlY3RvcihzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAogCQkJCSAgICB2b2lkICpkYXRhLAogCQkJCSAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgbGVuKTsKLWV4dGVybiBpbnQgY2VwaF9jb3B5X3BhZ2VfdmVjdG9yX3RvX3VzZXIoc3RydWN0IHBhZ2UgKipwYWdlcywgdm9pZCBfX3VzZXIgKmRhdGEsCi0JCQkJICAgIGxvZmZfdCBvZmYsIHNpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgY2VwaF96ZXJvX3BhZ2VfdmVjdG9yX3JhbmdlKGludCBvZmYsIGludCBsZW4sIHN0cnVjdCBwYWdlICoqcGFnZXMpOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2VwaC9tb25fY2xpZW50LmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvbW9uX2NsaWVudC5oCmluZGV4IGE0ODZmMzkuLmRlYjQ3ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2VwaC9tb25fY2xpZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9jZXBoL21vbl9jbGllbnQuaApAQCAtNDAsOSArNDAsOSBAQAogfTsKIAogLyoKLSAqIGNlcGhfbW9uX2dlbmVyaWNfcmVxdWVzdCBpcyBiZWluZyB1c2VkIGZvciB0aGUgc3RhdGZzIGFuZCBwb29sb3AgcmVxdWVzdHMKLSAqIHdoaWNoIGFyZSBiZW5pbmcgZG9uZSBhIGJpdCBkaWZmZXJlbnRseSBiZWNhdXNlIHdlIG5lZWQgdG8gZ2V0IGRhdGEgYmFjawotICogdG8gdGhlIGNhbGxlcgorICogY2VwaF9tb25fZ2VuZXJpY19yZXF1ZXN0IGlzIGJlaW5nIHVzZWQgZm9yIHRoZSBzdGF0ZnMsIHBvb2xvcCBhbmQKKyAqIG1vbl9nZXRfdmVyc2lvbiByZXF1ZXN0cyB3aGljaCBhcmUgYmVpbmcgZG9uZSBhIGJpdCBkaWZmZXJlbnRseQorICogYmVjYXVzZSB3ZSBuZWVkIHRvIGdldCBkYXRhIGJhY2sgdG8gdGhlIGNhbGxlcgogICovCiBzdHJ1Y3QgY2VwaF9tb25fZ2VuZXJpY19yZXF1ZXN0IHsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwpAQCAtMTA0LDEwICsxMDQsMTUgQEAKIGV4dGVybiBpbnQgY2VwaF9tb25jX2dvdF9vc2RtYXAoc3RydWN0IGNlcGhfbW9uX2NsaWVudCAqbW9uYywgdTMyIGhhdmUpOwogCiBleHRlcm4gdm9pZCBjZXBoX21vbmNfcmVxdWVzdF9uZXh0X29zZG1hcChzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jKTsKK2V4dGVybiBpbnQgY2VwaF9tb25jX3dhaXRfb3NkbWFwKHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsIHUzMiBlcG9jaCwKKwkJCQkgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIAogZXh0ZXJuIGludCBjZXBoX21vbmNfZG9fc3RhdGZzKHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsCiAJCQkgICAgICAgc3RydWN0IGNlcGhfc3RhdGZzICpidWYpOwogCitleHRlcm4gaW50IGNlcGhfbW9uY19kb19nZXRfdmVyc2lvbihzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jLAorCQkJCSAgICBjb25zdCBjaGFyICp3aGF0LCB1NjQgKm5ld2VzdCk7CisKIGV4dGVybiBpbnQgY2VwaF9tb25jX29wZW5fc2Vzc2lvbihzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jKTsKIAogZXh0ZXJuIGludCBjZXBoX21vbmNfdmFsaWRhdGVfYXV0aChzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAppbmRleCA2NGZkZmUxLi5kNWFkN2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCkBAIC0zODMsNyArMzgzLDkgQEAKIC8qIElnbm9yZS9mb3JiaWQga3Byb2JlcyBhdHRhY2ggb24gdmVyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIG1hcmtlZCBieSB0aGlzIGF0dHJpYnV0ZTogKi8KICNpZmRlZiBDT05GSUdfS1BST0JFUwogIyBkZWZpbmUgX19rcHJvYmVzCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIua3Byb2Jlcy50ZXh0IikpKQorIyBkZWZpbmUgbm9rcHJvYmVfaW5saW5lCV9fYWx3YXlzX2lubGluZQogI2Vsc2UKICMgZGVmaW5lIF9fa3Byb2JlcworIyBkZWZpbmUgbm9rcHJvYmVfaW5saW5lCWlubGluZQogI2VuZGlmCiAjZW5kaWYgLyogX19MSU5VWF9DT01QSUxFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDNmNDU4ODkuLmVjNDExMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC03NSw2ICs3NSw3IEBACiAJdW5zaWduZWQgaW50CQltYXg7ICAgIC8qIGluIGtIeiAqLwogCXVuc2lnbmVkIGludAkJY3VyOyAgICAvKiBpbiBrSHosIG9ubHkgbmVlZGVkIGlmIGNwdWZyZXEKIAkJCQkJICogZ292ZXJub3JzIGFyZSB1c2VkICovCisJdW5zaWduZWQgaW50CQlyZXN0b3JlX2ZyZXE7IC8qID0gcG9saWN5LT5jdXIgYmVmb3JlIHRyYW5zaXRpb24gKi8KIAl1bnNpZ25lZCBpbnQJCXN1c3BlbmRfZnJlcTsgLyogZnJlcSB0byBzZXQgZHVyaW5nIHN1c3BlbmQgKi8KIAogCXVuc2lnbmVkIGludAkJcG9saWN5OyAvKiBzZWUgYWJvdmUgKi8KQEAgLTIyMSwxMSArMjIyLDM1IEBACiAKIAkvKiBkZWZpbmUgb25lIG91dCBvZiB0d28gKi8KIAlpbnQJKCpzZXRwb2xpY3kpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CisKKwkvKgorCSAqIE9uIGZhaWx1cmUsIHNob3VsZCBhbHdheXMgcmVzdG9yZSBmcmVxdWVuY3kgdG8gcG9saWN5LT5yZXN0b3JlX2ZyZXEKKwkgKiAoaS5lLiBvbGQgZnJlcSkuCisJICovCiAJaW50CSgqdGFyZ2V0KQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCS8qIERlcHJlY2F0ZWQgKi8KIAkJCQkgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAogCQkJCSB1bnNpZ25lZCBpbnQgcmVsYXRpb24pOwogCWludAkoKnRhcmdldF9pbmRleCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgpOworCS8qCisJICogT25seSBmb3IgZHJpdmVycyB3aXRoIHRhcmdldF9pbmRleCgpIGFuZCBDUFVGUkVRX0FTWU5DX05PVElGSUNBVElPTgorCSAqIHVuc2V0LgorCSAqCisJICogZ2V0X2ludGVybWVkaWF0ZSBzaG91bGQgcmV0dXJuIGEgc3RhYmxlIGludGVybWVkaWF0ZSBmcmVxdWVuY3kKKwkgKiBwbGF0Zm9ybSB3YW50cyB0byBzd2l0Y2ggdG8gYW5kIHRhcmdldF9pbnRlcm1lZGlhdGUoKSBzaG91bGQgc2V0IENQVQorCSAqIHRvIHRvIHRoYXQgZnJlcXVlbmN5LCBiZWZvcmUganVtcGluZyB0byB0aGUgZnJlcXVlbmN5IGNvcnJlc3BvbmRpbmcKKwkgKiB0byAnaW5kZXgnLiBDb3JlIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgbm90aWZpY2F0aW9ucyBhbmQgZHJpdmVyCisJICogZG9lc24ndCBoYXZlIHRvIGhhbmRsZSB0aGVtIGluIHRhcmdldF9pbnRlcm1lZGlhdGUoKSBvcgorCSAqIHRhcmdldF9pbmRleCgpLgorCSAqCisJICogRHJpdmVycyBjYW4gcmV0dXJuICcwJyBmcm9tIGdldF9pbnRlcm1lZGlhdGUoKSBpbiBjYXNlIHRoZXkgZG9uJ3QKKwkgKiB3aXNoIHRvIHN3aXRjaCB0byBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGZvciBzb21lIHRhcmdldCBmcmVxdWVuY3kuCisJICogSW4gdGhhdCBjYXNlIGNvcmUgd2lsbCBkaXJlY3RseSBjYWxsIC0+dGFyZ2V0X2luZGV4KCkuCisJICovCisJdW5zaWduZWQgaW50ICgqZ2V0X2ludGVybWVkaWF0ZSkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgpOworCWludAkoKnRhcmdldF9pbnRlcm1lZGlhdGUpKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpOwogCiAJLyogc2hvdWxkIGJlIGRlZmluZWQsIGlmIHBvc3NpYmxlICovCiAJdW5zaWduZWQgaW50CSgqZ2V0KQkodW5zaWduZWQgaW50IGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaCBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCmluZGV4IDM1NTdlYTcuLjI5OTdhZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCkBAIC0xNDIsNiArMTQyLDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNwdW1hc2tfc2V0X2NwdV9sb2NhbF9maXJzdChpbnQgaSwgaW50IG51bWFfbm9kZSwgY3B1bWFza190ICpkc3RwKQoreworCXNldF9iaXQoMCwgY3B1bWFza19iaXRzKGRzdHApKTsKKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIGZvcl9lYWNoX2NwdShjcHUsIG1hc2spCQkJXAogCWZvciAoKGNwdSkgPSAwOyAoY3B1KSA8IDE7IChjcHUpKyssICh2b2lkKW1hc2spCiAjZGVmaW5lIGZvcl9lYWNoX2NwdV9ub3QoY3B1LCBtYXNrKQkJXApAQCAtMTkyLDYgKzE5OSw3IEBACiAKIGludCBjcHVtYXNrX25leHRfYW5kKGludCBuLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqKTsKIGludCBjcHVtYXNrX2FueV9idXQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBjcHUpOworaW50IGNwdW1hc2tfc2V0X2NwdV9sb2NhbF9maXJzdChpbnQgaSwgaW50IG51bWFfbm9kZSwgY3B1bWFza190ICpkc3RwKTsKIAogLyoqCiAgKiBmb3JfZWFjaF9jcHUgLSBpdGVyYXRlIG92ZXIgZXZlcnkgY3B1IGluIGEgbWFzawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmM3LmggYi9pbmNsdWRlL2xpbnV4L2NyYzcuaAppbmRleCAxNzg2ZTc3Li5kNTkwNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyYzcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYzcuaApAQCAtMiwxMyArMiwxMyBAQAogI2RlZmluZSBfTElOVVhfQ1JDN19ICiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotZXh0ZXJuIGNvbnN0IHU4IGNyYzdfc3luZHJvbWVfdGFibGVbMjU2XTsKK2V4dGVybiBjb25zdCB1OCBjcmM3X2JlX3N5bmRyb21lX3RhYmxlWzI1Nl07CiAKLXN0YXRpYyBpbmxpbmUgdTggY3JjN19ieXRlKHU4IGNyYywgdTggZGF0YSkKK3N0YXRpYyBpbmxpbmUgdTggY3JjN19iZV9ieXRlKHU4IGNyYywgdTggZGF0YSkKIHsKLQlyZXR1cm4gY3JjN19zeW5kcm9tZV90YWJsZVsoY3JjIDw8IDEpIF4gZGF0YV07CisJcmV0dXJuIGNyYzdfYmVfc3luZHJvbWVfdGFibGVbY3JjIF4gZGF0YV07CiB9CiAKLWV4dGVybiB1OCBjcmM3KHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbik7CitleHRlcm4gdTggY3JjN19iZSh1OCBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVsbC1sZWQuaCBiL2luY2x1ZGUvbGludXgvZGVsbC1sZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA5YjhiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9kZWxsLWxlZC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19ERUxMX0xFRF9IX18KKyNkZWZpbmUgX19ERUxMX0xFRF9IX18KKworZW51bSB7CisJREVMTF9MRURfTUlDTVVURSwKK307CisKK2ludCBkZWxsX2FwcF93bWlfbGVkX3NldChpbnQgd2hpY2hsZWQsIGludCBvbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAppbmRleCA2M2RhNTZlLi5lMTcwN2RlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaApAQCAtMTE1LDEyICsxMTUsNiBAQAogCiB2b2lkIGRtX2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogCi0vKgotICogQ29tYmluZSBkZXZpY2UgbGltaXRzLgotICovCi1pbnQgZG1fc2V0X2RldmljZV9saW1pdHMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKLQkJCSBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKTsKLQogc3RydWN0IGRtX2RldiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAlmbW9kZV90IG1vZGU7CkBAIC0xMzIsNyArMTI2LDcgQEAKICAqIGFyZSBvcGVuZWQvY2xvc2VkIGNvcnJlY3RseS4KICAqLwogaW50IGRtX2dldF9kZXZpY2Uoc3RydWN0IGRtX3RhcmdldCAqdGksIGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwKLQkJCQkJCSBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KTsKKwkJICBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KTsKIHZvaWQgZG1fcHV0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZCk7CiAKIC8qCkBAIC0yOTEsNiArMjg1LDcgQEAKIAlzdHJ1Y3QgZG1faW8gKmlvOwogCXN0cnVjdCBkbV90YXJnZXQgKnRpOwogCXVuc2lnbmVkIHRhcmdldF9iaW9fbnI7CisJdW5zaWduZWQgKmxlbl9wdHI7CiAJc3RydWN0IGJpbyBjbG9uZTsKIH07CiAKQEAgLTQwMSw2ICszOTYsNyBAQAogc3RydWN0IGdlbmRpc2sgKmRtX2Rpc2soc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIGludCBkbV9zdXNwZW5kZWQoc3RydWN0IGRtX3RhcmdldCAqdGkpOwogaW50IGRtX25vZmx1c2hfc3VzcGVuZGluZyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSk7Cit2b2lkIGRtX2FjY2VwdF9wYXJ0aWFsX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIG5fc2VjdG9ycyk7CiB1bmlvbiBtYXBfaW5mbyAqZG1fZ2V0X3JxX21hcGluZm8oc3RydWN0IHJlcXVlc3QgKnJxKTsKIAogc3RydWN0IHF1ZXVlX2xpbWl0cyAqZG1fZ2V0X3F1ZXVlX2xpbWl0cyhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldGh0b29sLmggYi9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaAppbmRleCAwYTExNGQwLi5lNjU4MjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaApAQCAtMTU0LDEzICsxNTQsMjAgQEAKICAqIEByZXNldDogUmVzZXQgKHBhcnQgb2YpIHRoZSBkZXZpY2UsIGFzIHNwZWNpZmllZCBieSBhIGJpdG1hc2sgb2YKICAqCWZsYWdzIGZyb20gJmVudW0gZXRodG9vbF9yZXNldF9mbGFncy4gIFJldHVybnMgYSBuZWdhdGl2ZQogICoJZXJyb3IgY29kZSBvciB6ZXJvLgorICogQGdldF9yeGZoX2tleV9zaXplOiBHZXQgdGhlIHNpemUgb2YgdGhlIFJYIGZsb3cgaGFzaCBrZXkuCisgKglSZXR1cm5zIHplcm8gaWYgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzcGVjaWZpYyBkZXZpY2UuCiAgKiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZTogR2V0IHRoZSBzaXplIG9mIHRoZSBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUuCiAgKglSZXR1cm5zIHplcm8gaWYgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzcGVjaWZpYyBkZXZpY2UuCi0gKiBAZ2V0X3J4ZmhfaW5kaXI6IEdldCB0aGUgY29udGVudHMgb2YgdGhlIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZS4KLSAqCVdpbGwgbm90IGJlIGNhbGxlZCBpZiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZSByZXR1cm5zIHplcm8uCisgKiBAZ2V0X3J4Zmg6IEdldCB0aGUgY29udGVudHMgb2YgdGhlIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZSBhbmQgaGFzaAorICoJa2V5LgorICoJV2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBvbmUgb3IgYm90aCBvZiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZSBhbmQKKyAqCUBnZXRfcnhmaF9rZXlfc2l6ZSBhcmUgaW1wbGVtZW50ZWQgYW5kIHJldHVybiBub24temVyby4KICAqCVJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8uCi0gKiBAc2V0X3J4ZmhfaW5kaXI6IFNldCB0aGUgY29udGVudHMgb2YgdGhlIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZS4KLSAqCVdpbGwgbm90IGJlIGNhbGxlZCBpZiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZSByZXR1cm5zIHplcm8uCisgKiBAc2V0X3J4Zmg6IFNldCB0aGUgY29udGVudHMgb2YgdGhlIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZSBhbmQvb3IKKyAqCWhhc2gga2V5LiAgSW4gY2FzZSBvbmx5IHRoZSBpbmRpcmVjdGlvbiB0YWJsZSBvciBoYXNoIGtleSBpcyB0byBiZQorICoJY2hhbmdlZCwgdGhlIG90aGVyIGFyZ3VtZW50IHdpbGwgYmUgJU5VTEwuCisgKglXaWxsIG9ubHkgYmUgY2FsbGVkIGlmIG9uZSBvciBib3RoIG9mIEBnZXRfcnhmaF9pbmRpcl9zaXplIGFuZAorICoJQGdldF9yeGZoX2tleV9zaXplIGFyZSBpbXBsZW1lbnRlZCBhbmQgcmV0dXJuIG5vbi16ZXJvLgogICoJUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KICAqIEBnZXRfY2hhbm5lbHM6IEdldCBudW1iZXIgb2YgY2hhbm5lbHMuCiAgKiBAc2V0X2NoYW5uZWxzOiBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IKQEAgLTIzMiw5ICsyMzksMTEgQEAKIAlpbnQJKCpzZXRfcnhuZmMpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX3J4bmZjICopOwogCWludAkoKmZsYXNoX2RldmljZSkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZmxhc2ggKik7CiAJaW50CSgqcmVzZXQpKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiAqKTsKKwl1MzIJKCpnZXRfcnhmaF9rZXlfc2l6ZSkoc3RydWN0IG5ldF9kZXZpY2UgKik7CiAJdTMyCSgqZ2V0X3J4ZmhfaW5kaXJfc2l6ZSkoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci0JaW50CSgqZ2V0X3J4ZmhfaW5kaXIpKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiAqKTsKLQlpbnQJKCpzZXRfcnhmaF9pbmRpcikoc3RydWN0IG5ldF9kZXZpY2UgKiwgY29uc3QgdTMyICopOworCWludAkoKmdldF9yeGZoKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgKmluZGlyLCB1OCAqa2V5KTsKKwlpbnQJKCpzZXRfcnhmaCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgY29uc3QgdTMyICppbmRpciwKKwkJCSAgICBjb25zdCB1OCAqa2V5KTsKIAl2b2lkCSgqZ2V0X2NoYW5uZWxzKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqKTsKIAlpbnQJKCpzZXRfY2hhbm5lbHMpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICopOwogCWludAkoKmdldF9kdW1wX2ZsYWcpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2R1bXAgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCAwMjRmZDAzLi5hN2UzYzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTM3LDIxICszNywyNzAgQEAKICNkZWZpbmUgQlBGX0NBTEwJMHg4MAkvKiBmdW5jdGlvbiBjYWxsICovCiAjZGVmaW5lIEJQRl9FWElUCTB4OTAJLyogZnVuY3Rpb24gcmV0dXJuICovCiAKKy8qIFJlZ2lzdGVyIG51bWJlcnMgKi8KK2VudW0geworCUJQRl9SRUdfMCA9IDAsCisJQlBGX1JFR18xLAorCUJQRl9SRUdfMiwKKwlCUEZfUkVHXzMsCisJQlBGX1JFR180LAorCUJQRl9SRUdfNSwKKwlCUEZfUkVHXzYsCisJQlBGX1JFR183LAorCUJQRl9SRUdfOCwKKwlCUEZfUkVHXzksCisJQlBGX1JFR18xMCwKKwlfX01BWF9CUEZfUkVHLAorfTsKKwogLyogQlBGIGhhcyAxMCBnZW5lcmFsIHB1cnBvc2UgNjQtYml0IHJlZ2lzdGVycyBhbmQgc3RhY2sgZnJhbWUuICovCi0jZGVmaW5lIE1BWF9CUEZfUkVHCTExCisjZGVmaW5lIE1BWF9CUEZfUkVHCV9fTUFYX0JQRl9SRUcKKworLyogQXJnWCwgY29udGV4dCBhbmQgc3RhY2sgZnJhbWUgcG9pbnRlciByZWdpc3RlciBwb3NpdGlvbnMuIE5vdGUsCisgKiBBcmcxLCBBcmcyLCBBcmczLCBldGMgYXJlIHVzZWQgYXMgYXJndW1lbnQgbWFwcGluZ3Mgb2YgZnVuY3Rpb24KKyAqIGNhbGxzIGluIEJQRl9DQUxMIGluc3RydWN0aW9uLgorICovCisjZGVmaW5lIEJQRl9SRUdfQVJHMQlCUEZfUkVHXzEKKyNkZWZpbmUgQlBGX1JFR19BUkcyCUJQRl9SRUdfMgorI2RlZmluZSBCUEZfUkVHX0FSRzMJQlBGX1JFR18zCisjZGVmaW5lIEJQRl9SRUdfQVJHNAlCUEZfUkVHXzQKKyNkZWZpbmUgQlBGX1JFR19BUkc1CUJQRl9SRUdfNQorI2RlZmluZSBCUEZfUkVHX0NUWAlCUEZfUkVHXzYKKyNkZWZpbmUgQlBGX1JFR19GUAlCUEZfUkVHXzEwCisKKy8qIEFkZGl0aW9uYWwgcmVnaXN0ZXIgbWFwcGluZ3MgZm9yIGNvbnZlcnRlZCB1c2VyIHByb2dyYW1zLiAqLworI2RlZmluZSBCUEZfUkVHX0EJQlBGX1JFR18wCisjZGVmaW5lIEJQRl9SRUdfWAlCUEZfUkVHXzcKKyNkZWZpbmUgQlBGX1JFR19UTVAJQlBGX1JFR184CiAKIC8qIEJQRiBwcm9ncmFtIGNhbiBhY2Nlc3MgdXAgdG8gNTEyIGJ5dGVzIG9mIHN0YWNrIHNwYWNlLiAqLwogI2RlZmluZSBNQVhfQlBGX1NUQUNLCTUxMgogCi0vKiBBcmcxLCBjb250ZXh0IGFuZCBzdGFjayBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyIHBvc2l0aW9ucy4gKi8KLSNkZWZpbmUgQVJHMV9SRUcJMQotI2RlZmluZSBDVFhfUkVHCQk2Ci0jZGVmaW5lIEZQX1JFRwkJMTAKKy8qIEhlbHBlciBtYWNyb3MgZm9yIGZpbHRlciBibG9jayBhcnJheSBpbml0aWFsaXplcnMuICovCisKKy8qIEFMVSBvcHMgb24gcmVnaXN0ZXJzLCBicGZfYWRkfHN1YnwuLi46IGRzdF9yZWcgKz0gc3JjX3JlZyAqLworCisjZGVmaW5lIEJQRl9BTFU2NF9SRUcoT1AsIERTVCwgU1JDKQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0FMVTY0IHwgQlBGX09QKE9QKSB8IEJQRl9YLAlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IFNSQywJCQkJCVwKKwkJLm9mZiAgID0gMCwJCQkJCVwKKwkJLmltbSAgID0gMCB9KQorCisjZGVmaW5lIEJQRl9BTFUzMl9SRUcoT1AsIERTVCwgU1JDKQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0FMVSB8IEJQRl9PUChPUCkgfCBCUEZfWCwJCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gU1JDLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSAwIH0pCisKKy8qIEFMVSBvcHMgb24gaW1tZWRpYXRlcywgYnBmX2FkZHxzdWJ8Li4uOiBkc3RfcmVnICs9IGltbTMyICovCisKKyNkZWZpbmUgQlBGX0FMVTY0X0lNTShPUCwgRFNULCBJTU0pCQkJCVwKKwkoKHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQpIHsJCQkJXAorCQkuY29kZSAgPSBCUEZfQUxVNjQgfCBCUEZfT1AoT1ApIHwgQlBGX0ssCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gMCwJCQkJCVwKKwkJLm9mZiAgID0gMCwJCQkJCVwKKwkJLmltbSAgID0gSU1NIH0pCisKKyNkZWZpbmUgQlBGX0FMVTMyX0lNTShPUCwgRFNULCBJTU0pCQkJCVwKKwkoKHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQpIHsJCQkJXAorCQkuY29kZSAgPSBCUEZfQUxVIHwgQlBGX09QKE9QKSB8IEJQRl9LLAkJXAorCQkuZHN0X3JlZyA9IERTVCwJCQkJCVwKKwkJLnNyY19yZWcgPSAwLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSBJTU0gfSkKKworLyogRW5kaWFuZXNzIGNvbnZlcnNpb24sIGNwdV90b197bCxifWUoKSwge2wsYn1lX3RvX2NwdSgpICovCisKKyNkZWZpbmUgQlBGX0VORElBTihUWVBFLCBEU1QsIExFTikJCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IEJQRl9BTFUgfCBCUEZfRU5EIHwgQlBGX1NSQyhUWVBFKSwJXAorCQkuZHN0X3JlZyA9IERTVCwJCQkJCVwKKwkJLnNyY19yZWcgPSAwLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSBMRU4gfSkKKworLyogU2hvcnQgZm9ybSBvZiBtb3YsIGRzdF9yZWcgPSBzcmNfcmVnICovCisKKyNkZWZpbmUgQlBGX01PVjY0X1JFRyhEU1QsIFNSQykJCQkJCVwKKwkoKHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQpIHsJCQkJXAorCQkuY29kZSAgPSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1gsCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IFNSQywJCQkJCVwKKwkJLm9mZiAgID0gMCwJCQkJCVwKKwkJLmltbSAgID0gMCB9KQorCisjZGVmaW5lIEJQRl9NT1YzMl9SRUcoRFNULCBTUkMpCQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0FMVSB8IEJQRl9NT1YgfCBCUEZfWCwJCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gU1JDLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSAwIH0pCisKKy8qIFNob3J0IGZvcm0gb2YgbW92LCBkc3RfcmVnID0gaW1tMzIgKi8KKworI2RlZmluZSBCUEZfTU9WNjRfSU1NKERTVCwgSU1NKQkJCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfSywJCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gMCwJCQkJCVwKKwkJLm9mZiAgID0gMCwJCQkJCVwKKwkJLmltbSAgID0gSU1NIH0pCisKKyNkZWZpbmUgQlBGX01PVjMyX0lNTShEU1QsIElNTSkJCQkJCVwKKwkoKHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQpIHsJCQkJXAorCQkuY29kZSAgPSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9LLAkJXAorCQkuZHN0X3JlZyA9IERTVCwJCQkJCVwKKwkJLnNyY19yZWcgPSAwLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSBJTU0gfSkKKworLyogU2hvcnQgZm9ybSBvZiBtb3YgYmFzZWQgb24gdHlwZSwgQlBGX1g6IGRzdF9yZWcgPSBzcmNfcmVnLCBCUEZfSzogZHN0X3JlZyA9IGltbTMyICovCisKKyNkZWZpbmUgQlBGX01PVjY0X1JBVyhUWVBFLCBEU1QsIFNSQywgSU1NKQkJCVwKKwkoKHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQpIHsJCQkJXAorCQkuY29kZSAgPSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1NSQyhUWVBFKSwJXAorCQkuZHN0X3JlZyA9IERTVCwJCQkJCVwKKwkJLnNyY19yZWcgPSBTUkMsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9IElNTSB9KQorCisjZGVmaW5lIEJQRl9NT1YzMl9SQVcoVFlQRSwgRFNULCBTUkMsIElNTSkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0FMVSB8IEJQRl9NT1YgfCBCUEZfU1JDKFRZUEUpLAlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IFNSQywJCQkJCVwKKwkJLm9mZiAgID0gMCwJCQkJCVwKKwkJLmltbSAgID0gSU1NIH0pCisKKy8qIERpcmVjdCBwYWNrZXQgYWNjZXNzLCBSMCA9ICoodWludCAqKSAoc2tiLT5kYXRhICsgaW1tMzIpICovCisKKyNkZWZpbmUgQlBGX0xEX0FCUyhTSVpFLCBJTU0pCQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0xEIHwgQlBGX1NJWkUoU0laRSkgfCBCUEZfQUJTLAlcCisJCS5kc3RfcmVnID0gMCwJCQkJCVwKKwkJLnNyY19yZWcgPSAwLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSBJTU0gfSkKKworLyogSW5kaXJlY3QgcGFja2V0IGFjY2VzcywgUjAgPSAqKHVpbnQgKikgKHNrYi0+ZGF0YSArIHNyY19yZWcgKyBpbW0zMikgKi8KKworI2RlZmluZSBCUEZfTERfSU5EKFNJWkUsIFNSQywgSU1NKQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0xEIHwgQlBGX1NJWkUoU0laRSkgfCBCUEZfSU5ELAlcCisJCS5kc3RfcmVnID0gMCwJCQkJCVwKKwkJLnNyY19yZWcgPSBTUkMsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9IElNTSB9KQorCisvKiBNZW1vcnkgbG9hZCwgZHN0X3JlZyA9ICoodWludCAqKSAoc3JjX3JlZyArIG9mZjE2KSAqLworCisjZGVmaW5lIEJQRl9MRFhfTUVNKFNJWkUsIERTVCwgU1JDLCBPRkYpCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IEJQRl9MRFggfCBCUEZfU0laRShTSVpFKSB8IEJQRl9NRU0sCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gU1JDLAkJCQkJXAorCQkub2ZmICAgPSBPRkYsCQkJCQlcCisJCS5pbW0gICA9IDAgfSkKKworLyogTWVtb3J5IHN0b3JlLCAqKHVpbnQgKikgKGRzdF9yZWcgKyBvZmYxNikgPSBzcmNfcmVnICovCisKKyNkZWZpbmUgQlBGX1NUWF9NRU0oU0laRSwgRFNULCBTUkMsIE9GRikJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX1NUWCB8IEJQRl9TSVpFKFNJWkUpIHwgQlBGX01FTSwJXAorCQkuZHN0X3JlZyA9IERTVCwJCQkJCVwKKwkJLnNyY19yZWcgPSBTUkMsCQkJCQlcCisJCS5vZmYgICA9IE9GRiwJCQkJCVwKKwkJLmltbSAgID0gMCB9KQorCisvKiBNZW1vcnkgc3RvcmUsICoodWludCAqKSAoZHN0X3JlZyArIG9mZjE2KSA9IGltbTMyICovCisKKyNkZWZpbmUgQlBGX1NUX01FTShTSVpFLCBEU1QsIE9GRiwgSU1NKQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX1NUIHwgQlBGX1NJWkUoU0laRSkgfCBCUEZfTUVNLAlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IE9GRiwJCQkJCVwKKwkJLmltbSAgID0gSU1NIH0pCisKKy8qIENvbmRpdGlvbmFsIGp1bXBzIGFnYWluc3QgcmVnaXN0ZXJzLCBpZiAoZHN0X3JlZyAnb3AnIHNyY19yZWcpIGdvdG8gcGMgKyBvZmYxNiAqLworCisjZGVmaW5lIEJQRl9KTVBfUkVHKE9QLCBEU1QsIFNSQywgT0ZGKQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0pNUCB8IEJQRl9PUChPUCkgfCBCUEZfWCwJCVwKKwkJLmRzdF9yZWcgPSBEU1QsCQkJCQlcCisJCS5zcmNfcmVnID0gU1JDLAkJCQkJXAorCQkub2ZmICAgPSBPRkYsCQkJCQlcCisJCS5pbW0gICA9IDAgfSkKKworLyogQ29uZGl0aW9uYWwganVtcHMgYWdhaW5zdCBpbW1lZGlhdGVzLCBpZiAoZHN0X3JlZyAnb3AnIGltbTMyKSBnb3RvIHBjICsgb2ZmMTYgKi8KKworI2RlZmluZSBCUEZfSk1QX0lNTShPUCwgRFNULCBJTU0sIE9GRikJCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IEJQRl9KTVAgfCBCUEZfT1AoT1ApIHwgQlBGX0ssCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IE9GRiwJCQkJCVwKKwkJLmltbSAgID0gSU1NIH0pCisKKy8qIEZ1bmN0aW9uIGNhbGwgKi8KKworI2RlZmluZSBCUEZfRU1JVF9DQUxMKEZVTkMpCQkJCQlcCisJKChzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSB7CQkJCVwKKwkJLmNvZGUgID0gQlBGX0pNUCB8IEJQRl9DQUxMLAkJCVwKKwkJLmRzdF9yZWcgPSAwLAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9ICgoRlVOQykgLSBfX2JwZl9jYWxsX2Jhc2UpIH0pCisKKy8qIFJhdyBjb2RlIHN0YXRlbWVudCBibG9jayAqLworCisjZGVmaW5lIEJQRl9SQVdfSU5TTihDT0RFLCBEU1QsIFNSQywgT0ZGLCBJTU0pCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IENPREUsCQkJCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IFNSQywJCQkJCVwKKwkJLm9mZiAgID0gT0ZGLAkJCQkJXAorCQkuaW1tICAgPSBJTU0gfSkKKworLyogUHJvZ3JhbSBleGl0ICovCisKKyNkZWZpbmUgQlBGX0VYSVRfSU5TTigpCQkJCQkJXAorCSgoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkgewkJCQlcCisJCS5jb2RlICA9IEJQRl9KTVAgfCBCUEZfRVhJVCwJCQlcCisJCS5kc3RfcmVnID0gMCwJCQkJCVwKKwkJLnNyY19yZWcgPSAwLAkJCQkJXAorCQkub2ZmICAgPSAwLAkJCQkJXAorCQkuaW1tICAgPSAwIH0pCisKKyNkZWZpbmUgYnl0ZXNfdG9fYnBmX3NpemUoYnl0ZXMpCQkJCVwKKyh7CQkJCQkJCQlcCisJaW50IGJwZl9zaXplID0gLUVJTlZBTDsJCQkJCVwKKwkJCQkJCQkJXAorCWlmIChieXRlcyA9PSBzaXplb2YodTgpKQkJCQlcCisJCWJwZl9zaXplID0gQlBGX0I7CQkJCVwKKwllbHNlIGlmIChieXRlcyA9PSBzaXplb2YodTE2KSkJCQkJXAorCQlicGZfc2l6ZSA9IEJQRl9IOwkJCQlcCisJZWxzZSBpZiAoYnl0ZXMgPT0gc2l6ZW9mKHUzMikpCQkJCVwKKwkJYnBmX3NpemUgPSBCUEZfVzsJCQkJXAorCWVsc2UgaWYgKGJ5dGVzID09IHNpemVvZih1NjQpKQkJCQlcCisJCWJwZl9zaXplID0gQlBGX0RXOwkJCQlcCisJCQkJCQkJCVwKKwlicGZfc2l6ZTsJCQkJCQlcCit9KQorCisvKiBNYWNybyB0byBpbnZva2UgZmlsdGVyIGZ1bmN0aW9uLiAqLworI2RlZmluZSBTS19SVU5fRklMVEVSKGZpbHRlciwgY3R4KSAgKCpmaWx0ZXItPmJwZl9mdW5jKShjdHgsIGZpbHRlci0+aW5zbnNpKQogCiBzdHJ1Y3Qgc29ja19maWx0ZXJfaW50IHsKIAlfX3U4CWNvZGU7CQkvKiBvcGNvZGUgKi8KLQlfX3U4CWFfcmVnOjQ7CS8qIGRlc3QgcmVnaXN0ZXIgKi8KLQlfX3U4CXhfcmVnOjQ7CS8qIHNvdXJjZSByZWdpc3RlciAqLworCV9fdTgJZHN0X3JlZzo0OwkvKiBkZXN0IHJlZ2lzdGVyICovCisJX191OAlzcmNfcmVnOjQ7CS8qIHNvdXJjZSByZWdpc3RlciAqLwogCV9fczE2CW9mZjsJCS8qIHNpZ25lZCBvZmZzZXQgKi8KIAlfX3MzMglpbW07CQkvKiBzaWduZWQgaW1tZWRpYXRlIGNvbnN0YW50ICovCiB9OwpAQCAtOTcsMjEgKzM0NiwxNiBAQAogI2RlZmluZSBza19maWx0ZXJfcHJvZ2xlbihmcHJvZykJCQlcCiAJCShmcHJvZy0+bGVuICogc2l6ZW9mKGZwcm9nLT5maWx0ZXJbMF0pKQogCi0jZGVmaW5lIFNLX1JVTl9GSUxURVIoZmlsdGVyLCBjdHgpCQkJXAotCQkoKmZpbHRlci0+YnBmX2Z1bmMpKGN0eCwgZmlsdGVyLT5pbnNuc2kpCi0KIGludCBza19maWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotdTMyIHNrX3J1bl9maWx0ZXJfaW50X3NlY2NvbXAoY29uc3Qgc3RydWN0IHNlY2NvbXBfZGF0YSAqY3R4LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHNvY2tfZmlsdGVyX2ludCAqaW5zbmkpOwotdTMyIHNrX3J1bl9maWx0ZXJfaW50X3NrYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqY3R4LAotCQkJICBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXJfaW50ICppbnNuaSk7Cit2b2lkIHNrX2ZpbHRlcl9zZWxlY3RfcnVudGltZShzdHJ1Y3Qgc2tfZmlsdGVyICpmcCk7Cit2b2lkIHNrX2ZpbHRlcl9mcmVlKHN0cnVjdCBza19maWx0ZXIgKmZwKTsKIAogaW50IHNrX2NvbnZlcnRfZmlsdGVyKHN0cnVjdCBzb2NrX2ZpbHRlciAqcHJvZywgaW50IGxlbiwKIAkJICAgICAgc3RydWN0IHNvY2tfZmlsdGVyX2ludCAqbmV3X3Byb2csIGludCAqbmV3X2xlbik7CiAKIGludCBza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoc3RydWN0IHNrX2ZpbHRlciAqKnBmcCwKLQkJCQlzdHJ1Y3Qgc29ja19mcHJvZyAqZnByb2cpOworCQkJCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gKmZwcm9nKTsKIHZvaWQgc2tfdW5hdHRhY2hlZF9maWx0ZXJfZGVzdHJveShzdHJ1Y3Qgc2tfZmlsdGVyICpmcCk7CiAKIGludCBza19hdHRhY2hfZmlsdGVyKHN0cnVjdCBzb2NrX2Zwcm9nICpmcHJvZywgc3RydWN0IHNvY2sgKnNrKTsKQEAgLTEyMCwxMSArMzY0LDQ4IEBACiBpbnQgc2tfY2hrX2ZpbHRlcihzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciwgdW5zaWduZWQgaW50IGZsZW4pOwogaW50IHNrX2dldF9maWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja19maWx0ZXIgX191c2VyICpmaWx0ZXIsCiAJCSAgdW5zaWduZWQgaW50IGxlbik7Ci12b2lkIHNrX2RlY29kZV9maWx0ZXIoc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0LCBzdHJ1Y3Qgc29ja19maWx0ZXIgKnRvKTsKIAogdm9pZCBza19maWx0ZXJfY2hhcmdlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2ZpbHRlciAqZnApOwogdm9pZCBza19maWx0ZXJfdW5jaGFyZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfZmlsdGVyICpmcCk7CiAKK3U2NCBfX2JwZl9jYWxsX2Jhc2UodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpOwordm9pZCBicGZfaW50X2ppdF9jb21waWxlKHN0cnVjdCBza19maWx0ZXIgKmZwKTsKKworI2RlZmluZSBCUEZfQU5DCQlCSVQoMTUpCisKK3N0YXRpYyBpbmxpbmUgdTE2IGJwZl9hbmNfaGVscGVyKGNvbnN0IHN0cnVjdCBzb2NrX2ZpbHRlciAqZnRlc3QpCit7CisJQlVHX09OKGZ0ZXN0LT5jb2RlICYgQlBGX0FOQyk7CisKKwlzd2l0Y2ggKGZ0ZXN0LT5jb2RlKSB7CisJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CisJY2FzZSBCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlM6CisjZGVmaW5lIEJQRl9BTkNJTExBUlkoQ09ERSkJY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEXyMjQ09ERToJXAorCQkJCXJldHVybiBCUEZfQU5DIHwgU0tGX0FEXyMjQ09ERQorCQlzd2l0Y2ggKGZ0ZXN0LT5rKSB7CisJCUJQRl9BTkNJTExBUlkoUFJPVE9DT0wpOworCQlCUEZfQU5DSUxMQVJZKFBLVFRZUEUpOworCQlCUEZfQU5DSUxMQVJZKElGSU5ERVgpOworCQlCUEZfQU5DSUxMQVJZKE5MQVRUUik7CisJCUJQRl9BTkNJTExBUlkoTkxBVFRSX05FU1QpOworCQlCUEZfQU5DSUxMQVJZKE1BUkspOworCQlCUEZfQU5DSUxMQVJZKFFVRVVFKTsKKwkJQlBGX0FOQ0lMTEFSWShIQVRZUEUpOworCQlCUEZfQU5DSUxMQVJZKFJYSEFTSCk7CisJCUJQRl9BTkNJTExBUlkoQ1BVKTsKKwkJQlBGX0FOQ0lMTEFSWShBTFVfWE9SX1gpOworCQlCUEZfQU5DSUxMQVJZKFZMQU5fVEFHKTsKKwkJQlBGX0FOQ0lMTEFSWShWTEFOX1RBR19QUkVTRU5UKTsKKwkJQlBGX0FOQ0lMTEFSWShQQVlfT0ZGU0VUKTsKKwkJQlBGX0FOQ0lMTEFSWShSQU5ET00pOworCQl9CisJCS8qIEZhbGx0aHJvdWdoLiAqLworCWRlZmF1bHQ6CisJCXJldHVybiBmdGVzdC0+Y29kZTsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfQlBGX0pJVAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTE0NCw4NSArNDI1LDIwIEBACiB9CiAjZWxzZQogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKwogc3RhdGljIGlubGluZSB2b2lkIGJwZl9qaXRfY29tcGlsZShzdHJ1Y3Qgc2tfZmlsdGVyICpmcCkKIHsKIH0KKwogc3RhdGljIGlubGluZSB2b2lkIGJwZl9qaXRfZnJlZShzdHJ1Y3Qgc2tfZmlsdGVyICpmcCkKIHsKIAlrZnJlZShmcCk7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfQlBGX0pJVCAqLwogCiBzdGF0aWMgaW5saW5lIGludCBicGZfdGVsbF9leHRlbnNpb25zKHZvaWQpCiB7CiAJcmV0dXJuIFNLRl9BRF9NQVg7CiB9CiAKLWVudW0gewotCUJQRl9TX1JFVF9LID0gMSwKLQlCUEZfU19SRVRfQSwKLQlCUEZfU19BTFVfQUREX0ssCi0JQlBGX1NfQUxVX0FERF9YLAotCUJQRl9TX0FMVV9TVUJfSywKLQlCUEZfU19BTFVfU1VCX1gsCi0JQlBGX1NfQUxVX01VTF9LLAotCUJQRl9TX0FMVV9NVUxfWCwKLQlCUEZfU19BTFVfRElWX1gsCi0JQlBGX1NfQUxVX01PRF9LLAotCUJQRl9TX0FMVV9NT0RfWCwKLQlCUEZfU19BTFVfQU5EX0ssCi0JQlBGX1NfQUxVX0FORF9YLAotCUJQRl9TX0FMVV9PUl9LLAotCUJQRl9TX0FMVV9PUl9YLAotCUJQRl9TX0FMVV9YT1JfSywKLQlCUEZfU19BTFVfWE9SX1gsCi0JQlBGX1NfQUxVX0xTSF9LLAotCUJQRl9TX0FMVV9MU0hfWCwKLQlCUEZfU19BTFVfUlNIX0ssCi0JQlBGX1NfQUxVX1JTSF9YLAotCUJQRl9TX0FMVV9ORUcsCi0JQlBGX1NfTERfV19BQlMsCi0JQlBGX1NfTERfSF9BQlMsCi0JQlBGX1NfTERfQl9BQlMsCi0JQlBGX1NfTERfV19MRU4sCi0JQlBGX1NfTERfV19JTkQsCi0JQlBGX1NfTERfSF9JTkQsCi0JQlBGX1NfTERfQl9JTkQsCi0JQlBGX1NfTERfSU1NLAotCUJQRl9TX0xEWF9XX0xFTiwKLQlCUEZfU19MRFhfQl9NU0gsCi0JQlBGX1NfTERYX0lNTSwKLQlCUEZfU19NSVNDX1RBWCwKLQlCUEZfU19NSVNDX1RYQSwKLQlCUEZfU19BTFVfRElWX0ssCi0JQlBGX1NfTERfTUVNLAotCUJQRl9TX0xEWF9NRU0sCi0JQlBGX1NfU1QsCi0JQlBGX1NfU1RYLAotCUJQRl9TX0pNUF9KQSwKLQlCUEZfU19KTVBfSkVRX0ssCi0JQlBGX1NfSk1QX0pFUV9YLAotCUJQRl9TX0pNUF9KR0VfSywKLQlCUEZfU19KTVBfSkdFX1gsCi0JQlBGX1NfSk1QX0pHVF9LLAotCUJQRl9TX0pNUF9KR1RfWCwKLQlCUEZfU19KTVBfSlNFVF9LLAotCUJQRl9TX0pNUF9KU0VUX1gsCi0JLyogQW5jaWxsYXJ5IGRhdGEgKi8KLQlCUEZfU19BTkNfUFJPVE9DT0wsCi0JQlBGX1NfQU5DX1BLVFRZUEUsCi0JQlBGX1NfQU5DX0lGSU5ERVgsCi0JQlBGX1NfQU5DX05MQVRUUiwKLQlCUEZfU19BTkNfTkxBVFRSX05FU1QsCi0JQlBGX1NfQU5DX01BUkssCi0JQlBGX1NfQU5DX1FVRVVFLAotCUJQRl9TX0FOQ19IQVRZUEUsCi0JQlBGX1NfQU5DX1JYSEFTSCwKLQlCUEZfU19BTkNfQ1BVLAotCUJQRl9TX0FOQ19BTFVfWE9SX1gsCi0JQlBGX1NfQU5DX1ZMQU5fVEFHLAotCUJQRl9TX0FOQ19WTEFOX1RBR19QUkVTRU5ULAotCUJQRl9TX0FOQ19QQVlfT0ZGU0VULAotfTsKLQogI2VuZGlmIC8qIF9fTElOVVhfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGMzZjQ2ZTQuLjMzOGU2ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTEyOCw2ICsxMjgsMTAgQEAKICNkZWZpbmUgRk1PREVfQVRPTUlDX1BPUwkoKF9fZm9yY2UgZm1vZGVfdCkweDgwMDApCiAvKiBXcml0ZSBhY2Nlc3MgdG8gdW5kZXJseWluZyBmcyAqLwogI2RlZmluZSBGTU9ERV9XUklURVIJCSgoX19mb3JjZSBmbW9kZV90KTB4MTAwMDApCisvKiBIYXMgcmVhZCBtZXRob2QocykgKi8KKyNkZWZpbmUgRk1PREVfQ0FOX1JFQUQgICAgICAgICAgKChfX2ZvcmNlIGZtb2RlX3QpMHgyMDAwMCkKKy8qIEhhcyB3cml0ZSBtZXRob2QocykgKi8KKyNkZWZpbmUgRk1PREVfQ0FOX1dSSVRFICAgICAgICAgKChfX2ZvcmNlIGZtb2RlX3QpMHg0MDAwMCkKIAogLyogRmlsZSB3YXMgb3BlbmVkIGJ5IGZhbm90aWZ5IGFuZCBzaG91bGRuJ3QgZ2VuZXJhdGUgZmFub3RpZnkgZXZlbnRzICovCiAjZGVmaW5lIEZNT0RFX05PTk9USUZZCQkoKF9fZm9yY2UgZm1vZGVfdCkweDEwMDAwMDApCkBAIC0zNDMsOCArMzQ3LDcgQEAKIAl2b2lkICgqaW52YWxpZGF0ZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiAJaW50ICgqcmVsZWFzZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCBnZnBfdCk7CiAJdm9pZCAoKmZyZWVwYWdlKShzdHJ1Y3QgcGFnZSAqKTsKLQlzc2l6ZV90ICgqZGlyZWN0X0lPKShpbnQsIHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2Vncyk7CisJc3NpemVfdCAoKmRpcmVjdF9JTykoaW50LCBzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3Qgb2Zmc2V0KTsKIAlpbnQgKCpnZXRfeGlwX21lbSkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgcGdvZmZfdCwgaW50LAogCQkJCQkJdm9pZCAqKiwgdW5zaWduZWQgbG9uZyAqKTsKIAkvKgpAQCAtMTQ0OCw2ICsxNDUxLDggQEAKICNkZWZpbmUgSEFWRV9DT01QQVRfSU9DVEwgMQogI2RlZmluZSBIQVZFX1VOTE9DS0VEX0lPQ1RMIDEKIAorc3RydWN0IGlvdl9pdGVyOworCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CkBAIC0xNDU1LDYgKzE0NjAsOCBAQAogCXNzaXplX3QgKCp3cml0ZSkgKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogCXNzaXplX3QgKCphaW9fcmVhZCkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKIAlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOworCXNzaXplX3QgKCpyZWFkX2l0ZXIpIChzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOworCXNzaXplX3QgKCp3cml0ZV9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAlpbnQgKCppdGVyYXRlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopOwogCXVuc2lnbmVkIGludCAoKnBvbGwpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiAJbG9uZyAoKnVubG9ja2VkX2lvY3RsKSAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKQEAgLTI0MDQsMjAgKzI0MTEsMTggQEAKIGV4dGVybiBpbnQgZ2VuZXJpY19maWxlX3JlbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdvZmZfdCBwZ29mZik7CiBpbnQgZ2VuZXJpY193cml0ZV9jaGVja3Moc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCAqcG9zLCBzaXplX3QgKmNvdW50LCBpbnQgaXNibGspOwotZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX2Fpb19yZWFkKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKLWV4dGVybiBzc2l6ZV90IF9fZ2VuZXJpY19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCk7Ci1leHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwKLQkJdW5zaWduZWQgbG9uZyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90KTsKK2V4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKK2V4dGVybiBzc2l6ZV90IF9fZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKK2V4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CitleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKiwgbG9mZl90KTsKIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfcGVyZm9ybV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgaW92X2l0ZXIgKiwgbG9mZl90KTsKIGV4dGVybiBzc2l6ZV90IGRvX3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKIGV4dGVybiBzc2l6ZV90IGRvX3N5bmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcyk7Ci1leHRlcm4gaW50IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCXVuc2lnbmVkIGxvbmcgKm5yX3NlZ3MsIHNpemVfdCAqY291bnQsIGludCBhY2Nlc3NfZmxhZ3MpOworZXh0ZXJuIHNzaXplX3QgbmV3X3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKK2V4dGVybiBzc2l6ZV90IG5ld19zeW5jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpOwogCiAvKiBmcy9ibG9ja19kZXYuYyAqLwotZXh0ZXJuIHNzaXplX3QgYmxrZGV2X2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcyk7CitleHRlcm4gc3NpemVfdCBibGtkZXZfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSk7CiBleHRlcm4gaW50IGJsa2Rldl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAogCQkJaW50IGRhdGFzeW5jKTsKIGV4dGVybiB2b2lkIGJsb2NrX3N5bmNfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CkBAIC0yNDI3LDcgKzI0MzIsNyBAQAogCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwKIAkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKK2V4dGVybiBzc2l6ZV90IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAogCQlzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19zcGxpY2Vfc2VuZHBhZ2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKIAkJc3RydWN0IGZpbGUgKm91dCwgbG9mZl90ICosIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CkBAIC0yNDc3LDE2ICsyNDgyLDE2IEBACiB2b2lkIGRpb19lbmRfaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpOwogCiBzc2l6ZV90IF9fYmxvY2tkZXZfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAotCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrLCBkaW9faW9kb25lX3QgZW5kX2lvLAorCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgbG9mZl90IG9mZnNldCwKKwlnZXRfYmxvY2tfdCBnZXRfYmxvY2ssIGRpb19pb2RvbmVfdCBlbmRfaW8sCiAJZGlvX3N1Ym1pdF90IHN1Ym1pdF9pbywJaW50IGZsYWdzKTsKIAogc3RhdGljIGlubGluZSBzc2l6ZV90IGJsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCi0JCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsIGxvZmZfdCBvZmZzZXQsCisJCWdldF9ibG9ja190IGdldF9ibG9jaykKIHsKLQlyZXR1cm4gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCi0JCQkJICAgIG9mZnNldCwgbnJfc2VncywgZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLAorCXJldHVybiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGl0ZXIsCisJCQkJICAgIG9mZnNldCwgZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLAogCQkJCSAgICBESU9fTE9DS0lORyB8IERJT19TS0lQX0hPTEVTKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHdsLmggYi9pbmNsdWRlL2xpbnV4L2kyYy90d2wuaAppbmRleCBkMmIxNjcwLi44Y2ZiNTBmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMvdHdsLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsLmgKQEAgLTQ5OCw3ICs0OTgsMTAgQEAKICNkZWZpbmUgUkVTX0dSUF9BTEwJCTB4NwkvKiBBbGwgcmVzb3VyY2UgZ3JvdXBzICovCiAKICNkZWZpbmUgUkVTX1RZUEUyX1IwCQkweDAKKyNkZWZpbmUgUkVTX1RZUEUyX1IxCQkweDEKKyNkZWZpbmUgUkVTX1RZUEUyX1IyCQkweDIKIAorI2RlZmluZSBSRVNfVFlQRV9SMAkJMHgwCiAjZGVmaW5lIFJFU19UWVBFX0FMTAkJMHg3CiAKIC8qIFJlc291cmNlIHN0YXRlcyAqLwpAQCAtNjcxLDYgKzY3NCw3IEBACiAJc3RydWN0IHR3bDQwMzBfc2NyaXB0ICoqc2NyaXB0czsKIAl1bnNpZ25lZCBudW07CiAJc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpyZXNvdXJjZV9jb25maWc7CisJc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpib2FyZF9jb25maWc7CiAjZGVmaW5lIFRXTDQwMzBfUkVTQ09ORklHX1VOREVGCSgodTgpLTEpCiAJYm9vbCB1c2VfcG93ZXJvZmY7CS8qIEJvYXJkIGlzIHdpcmVkIGZvciBUV0wgcG93ZXJvZmYgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oIGIvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAppbmRleCBmMTk0Y2NiLi42YmZmMTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKQEAgLTE3MTEsNiArMTcxMSw3IEBACiAJV0xBTl9FSURfUlJNX0VOQUJMRURfQ0FQQUJJTElUSUVTID0gNzAsCiAJV0xBTl9FSURfTVVMVElQTEVfQlNTSUQgPSA3MSwKIAlXTEFOX0VJRF9CU1NfQ09FWF8yMDQwID0gNzIsCisJV0xBTl9FSURfQlNTX0lOVE9MRVJBTlRfQ0hMX1JFUE9SVCA9IDczLAogCVdMQU5fRUlEX09WRVJMQVBfQlNTX1NDQU5fUEFSQU0gPSA3NCwKIAlXTEFOX0VJRF9SSUNfREVTQ1JJUFRPUiA9IDc1LAogCVdMQU5fRUlEX01NSUUgPSA3NiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCmluZGV4IDEwODVmZmUuLmZkMjI3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApAQCAtMTYsOSArMTYsMjggQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L2lmX2JyaWRnZS5oPgogCitzdHJ1Y3QgYnJfaXAgeworCXVuaW9uIHsKKwkJX19iZTMyCWlwNDsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCQlzdHJ1Y3QgaW42X2FkZHIgaXA2OworI2VuZGlmCisJfSB1OworCV9fYmUxNgkJcHJvdG87CisJX191MTYgICAgICAgICAgIHZpZDsKK307CisKK3N0cnVjdCBicl9pcF9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGJyX2lwIGFkZHI7Cit9OworCiBleHRlcm4gdm9pZCBicmlvY3RsX3NldChpbnQgKCppb2N0bF9ob29rKShzdHJ1Y3QgbmV0ICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKikpOwogCiB0eXBlZGVmIGludCBicl9zaG91bGRfcm91dGVfaG9va190KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGJyX3Nob3VsZF9yb3V0ZV9ob29rX3QgX19yY3UgKmJyX3Nob3VsZF9yb3V0ZV9ob29rOworaW50IGJyX211bHRpY2FzdF9saXN0X2FkamFjZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqYnJfaXBfbGlzdCk7Citib29sIGJyX211bHRpY2FzdF9oYXNfcXVlcmllcl9hZGphY2VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJvdG8pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKaW5kZXggYTg2Nzg0ZC4uMTE5MTMwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTEwLDggKzEwLDkgQEAKIAlfX3U4IG1hY1szMl07CiAJX191MzIgdmxhbjsKIAlfX3UzMiBxb3M7Ci0JX191MzIgdHhfcmF0ZTsKIAlfX3UzMiBzcG9vZmNoazsKIAlfX3UzMiBsaW5rc3RhdGU7CisJX191MzIgbWluX3R4X3JhdGU7CisJX191MzIgbWF4X3R4X3JhdGU7CiB9OwogI2VuZGlmIC8qIF9MSU5VWF9JRl9MSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbWFjdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKaW5kZXggYTlhNTNiMS4uNmIyYzdjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKQEAgLTU3LDYgKzU3LDkgQEAKIAluZXRkZXZfZmVhdHVyZXNfdAl0YXBfZmVhdHVyZXM7CiAJaW50CQkJbWlub3I7CiAJaW50CQkJbmVzdF9sZXZlbDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCXN0cnVjdCBuZXRwb2xsCQkqbmV0cG9sbDsKKyNlbmRpZgogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1hY3ZsYW5fY291bnRfcngoY29uc3Qgc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmggYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAppbmRleCBiMmFjYzRhLi40OTY3OTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApAQCAtMTA2LDcgKzEwNiw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKIAotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpfX3ZsYW5fZmluZF9kZXZfZGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKl9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsCiAJCQkJCSAgICAgICBfX2JlMTYgdmxhbl9wcm90bywgdTE2IHZsYW5faWQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2Rldl9yZWFsX2Rldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB1MTYgdmxhbl9kZXZfdmxhbl9pZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKgotX192bGFuX2ZpbmRfZGV2X2RlZXAoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LAorX192bGFuX2ZpbmRfZGV2X2RlZXBfcmN1KHN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiwKIAkJICAgICBfX2JlMTYgdmxhbl9wcm90bywgdTE2IHZsYW5faWQpCiB7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lzZG4vY2FwaXV0aWwuaCBiL2luY2x1ZGUvbGludXgvaXNkbi9jYXBpdXRpbC5oCmluZGV4IDVhNTJmMmMuLjQ0YmQ2MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXNkbi9jYXBpdXRpbC5oCisrKyBiL2luY2x1ZGUvbGludXgvaXNkbi9jYXBpdXRpbC5oCkBAIC0xNjQsMTEgKzE2NCw2IEBACiAJCQkgIF9fdTggX0NvbW1hbmQsIF9fdTggX1N1YmNvbW1hbmQsCiAJCQkgIF9fdTE2IF9NZXNzYWdlbnVtYmVyLCBfX3UzMiBfQ29udHJvbGxlcik7CiAKLS8qCi0gKiBjYXBpX2luZm8yc3RyIGdlbmVyYXRlZCBhIHJlYWRhYmxlIHN0cmluZyBmb3IgQ2FwaTIuMCByZWFzb25zLgotICovCi1jaGFyICpjYXBpX2luZm8yc3RyKF9fdTE2IHJlYXNvbik7Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmggYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAppbmRleCA3YmQyYWQwLi5mNzI5NmU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaApAQCAtMjA1LDEwICsyMDUsMTAgQEAKIAl2b2lkICphZGRyOwogfTsKIAotc3RydWN0IGtwcm9iZV9ibGFja3BvaW50IHsKLQljb25zdCBjaGFyICpuYW1lOworc3RydWN0IGtwcm9iZV9ibGFja2xpc3RfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7Ci0JdW5zaWduZWQgbG9uZyByYW5nZTsKKwl1bnNpZ25lZCBsb25nIGVuZF9hZGRyOwogfTsKIAogI2lmZGVmIENPTkZJR19LUFJPQkVTCkBAIC0yNjUsNiArMjY1LDcgQEAKIGV4dGVybiBpbnQgYXJjaF9pbml0X2twcm9iZXModm9pZCk7CiBleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBrcHJvYmVzX2luY19ubWlzc2VkX2NvdW50KHN0cnVjdCBrcHJvYmUgKnApOworZXh0ZXJuIGJvb2wgYXJjaF93aXRoaW5fa3Byb2JlX2JsYWNrbGlzdCh1bnNpZ25lZCBsb25nIGFkZHIpOwogCiBzdHJ1Y3Qga3Byb2JlX2luc25fY2FjaGUgewogCXN0cnVjdCBtdXRleCBtdXRleDsKQEAgLTQ3Niw0ICs0NzcsMTggQEAKIAlyZXR1cm4gZW5hYmxlX2twcm9iZSgmanAtPmtwKTsKIH0KIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCisvKgorICogQmxhY2tsaXN0IGdhbmVyYXRpbmcgbWFjcm8uIFNwZWNpZnkgZnVuY3Rpb25zIHdoaWNoIGlzIG5vdCBwcm9iZWQKKyAqIGJ5IHVzaW5nIHRoaXMgbWFjcm8uCisgKi8KKyNkZWZpbmUgX19OT0tQUk9CRV9TWU1CT0woZm5hbWUpCQkJXAorc3RhdGljIHVuc2lnbmVkIGxvbmcgX191c2VkCQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfa3Byb2JlX2JsYWNrbGlzdCIpKSkJXAorCV9rYmxfYWRkcl8jI2ZuYW1lID0gKHVuc2lnbmVkIGxvbmcpZm5hbWU7CisjZGVmaW5lIE5PS1BST0JFX1NZTUJPTChmbmFtZSkJX19OT0tQUk9CRV9TWU1CT0woZm5hbWUpCisjZWxzZQorI2RlZmluZSBOT0tQUk9CRV9TWU1CT0woZm5hbWUpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RpbWUuaCBiL2luY2x1ZGUvbGludXgva3RpbWUuaAppbmRleCAzMWMwY2QxLi5kZTllNDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCkBAIC0zMDQsNiArMzA0LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICoga3RpbWVfYWZ0ZXIgLSBDb21wYXJlIGlmIGEga3RpbWVfdCB2YWx1ZSBpcyBiaWdnZXIgdGhhbiBhbm90aGVyIG9uZS4KKyAqIEBjbXAxOgljb21wYXJhYmxlMQorICogQGNtcDI6CWNvbXBhcmFibGUyCisgKgorICogUmV0dXJuOiB0cnVlIGlmIGNtcDEgaGFwcGVuZWQgYWZ0ZXIgY21wMi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGt0aW1lX2FmdGVyKGNvbnN0IGt0aW1lX3QgY21wMSwgY29uc3Qga3RpbWVfdCBjbXAyKQoreworCXJldHVybiBrdGltZV9jb21wYXJlKGNtcDEsIGNtcDIpID4gMDsKK30KKworLyoqCisgKiBrdGltZV9iZWZvcmUgLSBDb21wYXJlIGlmIGEga3RpbWVfdCB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gYW5vdGhlciBvbmUuCisgKiBAY21wMToJY29tcGFyYWJsZTEKKyAqIEBjbXAyOgljb21wYXJhYmxlMgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBjbXAxIGhhcHBlbmVkIGJlZm9yZSBjbXAyLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wga3RpbWVfYmVmb3JlKGNvbnN0IGt0aW1lX3QgY21wMSwgY29uc3Qga3RpbWVfdCBjbXAyKQoreworCXJldHVybiBrdGltZV9jb21wYXJlKGNtcDEsIGNtcDIpIDwgMDsKK30KKwogc3RhdGljIGlubGluZSBzNjQga3RpbWVfdG9fdXMoY29uc3Qga3RpbWVfdCBrdCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0diA9IGt0aW1lX3RvX3RpbWV2YWwoa3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCmluZGV4IDk3MGM2ODEuLmVjNGUzYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKQEAgLTU4Niw3ICs1ODYsNyBAQAogCiB2b2lkIGt2bV92Y3B1X2Jsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV92Y3B1X2tpY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLWJvb2wga3ZtX3ZjcHVfeWllbGRfdG8oc3RydWN0IGt2bV92Y3B1ICp0YXJnZXQpOworaW50IGt2bV92Y3B1X3lpZWxkX3RvKHN0cnVjdCBrdm1fdmNwdSAqdGFyZ2V0KTsKIHZvaWQga3ZtX3ZjcHVfb25fc3BpbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbG9hZF9ndWVzdF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX3B1dF9ndWVzdF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAppbmRleCAzNDQ3YmVhLi5iMTJmNGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCkBAIC00NTAsNyArNDUwLDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZF9xcHNfYmFzZVtNTFg0X05VTV9RUF9SRUdJT05dOwogCWludCAgICAgICAgICAgICAgICAgICAgIGxvZ19udW1fbWFjczsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBsb2dfbnVtX3ZsYW5zOwotCWludCAgICAgICAgICAgICAgICAgICAgIGxvZ19udW1fcHJpb3M7CiAJZW51bSBtbHg0X3BvcnRfdHlwZQlwb3J0X3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKIAl1OAkJCXN1cHBvcnRlZF90eXBlW01MWDRfTUFYX1BPUlRTICsgMV07CiAJdTggICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkX3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKQEAgLTU3OCw2ICs1NzcsOSBAQAogCiAJdTMyCQkJY29uc19pbmRleDsKIAorCXUxNiAgICAgICAgICAgICAgICAgICAgIGlycTsKKwlib29sICAgICAgICAgICAgICAgICAgICBpcnFfYWZmaW5pdHlfY2hhbmdlOworCiAJX19iZTMyCQkgICAgICAgKnNldF9jaV9kYjsKIAlfX2JlMzIJCSAgICAgICAqYXJtX2RiOwogCWludAkJCWFybV9zbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldl9mZWF0dXJlcy5oCmluZGV4IGMyNmQwZWMuLmU1YTU4OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaApAQCAtNDIsOSArNDIsMTEgQEAKIAlORVRJRl9GX1RTTzZfQklULAkJLyogLi4uIFRDUHY2IHNlZ21lbnRhdGlvbiAqLwogCU5FVElGX0ZfRlNPX0JJVCwJCS8qIC4uLiBGQ29FIHNlZ21lbnRhdGlvbiAqLwogCU5FVElGX0ZfR1NPX0dSRV9CSVQsCQkvKiAuLi4gR1JFIHdpdGggVFNPICovCisJTkVUSUZfRl9HU09fR1JFX0NTVU1fQklULAkvKiAuLi4gR1JFIHdpdGggY3N1bSB3aXRoIFRTTyAqLwogCU5FVElGX0ZfR1NPX0lQSVBfQklULAkJLyogLi4uIElQSVAgdHVubmVsIHdpdGggVFNPICovCiAJTkVUSUZfRl9HU09fU0lUX0JJVCwJCS8qIC4uLiBTSVQgdHVubmVsIHdpdGggVFNPICovCiAJTkVUSUZfRl9HU09fVURQX1RVTk5FTF9CSVQsCS8qIC4uLiBVRFAgVFVOTkVMIHdpdGggVFNPICovCisJTkVUSUZfRl9HU09fVURQX1RVTk5FTF9DU1VNX0JJVCwvKiAuLi4gVURQIFRVTk5FTCB3aXRoIFRTTyAmIENTVU0gKi8KIAlORVRJRl9GX0dTT19NUExTX0JJVCwJCS8qIC4uLiBNUExTIHNlZ21lbnRhdGlvbiAqLwogCS8qKi9ORVRJRl9GX0dTT19MQVNUID0JCS8qIGxhc3QgYml0LCBzZWUgR1NPX01BU0sgKi8KIAkJTkVUSUZfRl9HU09fTVBMU19CSVQsCkBAIC0xMTEsNiArMTEzLDcgQEAKICNkZWZpbmUgTkVUSUZfRl9SWEZDUwkJX19ORVRJRl9GKFJYRkNTKQogI2RlZmluZSBORVRJRl9GX1JYQUxMCQlfX05FVElGX0YoUlhBTEwpCiAjZGVmaW5lIE5FVElGX0ZfR1NPX0dSRQkJX19ORVRJRl9GKEdTT19HUkUpCisjZGVmaW5lIE5FVElGX0ZfR1NPX0dSRV9DU1VNCV9fTkVUSUZfRihHU09fR1JFX0NTVU0pCiAjZGVmaW5lIE5FVElGX0ZfR1NPX0lQSVAJX19ORVRJRl9GKEdTT19JUElQKQogI2RlZmluZSBORVRJRl9GX0dTT19TSVQJCV9fTkVUSUZfRihHU09fU0lUKQogI2RlZmluZSBORVRJRl9GX0dTT19VRFBfVFVOTkVMCV9fTkVUSUZfRihHU09fVURQX1RVTk5FTCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDZjMWFlOWYuLmFiZTNkZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtNTYsOSArNTYsNiBAQAogc3RydWN0IHBoeV9kZXZpY2U7CiAvKiA4MDIuMTEgc3BlY2lmaWMgKi8KIHN0cnVjdCB3aXJlbGVzc19kZXY7Ci0JCQkJCS8qIHNvdXJjZSBiYWNrLWNvbXBhdCBob29rcyAqLwotI2RlZmluZSBTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LG9wcykgXAotCSggKG5ldGRldiktPmV0aHRvb2xfb3BzID0gKG9wcykgKQogCiB2b2lkIG5ldGRldl9zZXRfZGVmYXVsdF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKm9wcyk7CkBAIC04NTMsNyArODUwLDggQEAKICAqCVNSLUlPViBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KICAqIGludCAoKm5kb19zZXRfdmZfbWFjKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHU4KiBtYWMpOwogICogaW50ICgqbmRvX3NldF92Zl92bGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpOwotICogaW50ICgqbmRvX3NldF92Zl90eF9yYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIGludCByYXRlKTsKKyAqIGludCAoKm5kb19zZXRfdmZfcmF0ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCisgKgkJCSAgaW50IG1heF90eF9yYXRlKTsKICAqIGludCAoKm5kb19zZXRfdmZfc3Bvb2ZjaGspKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKICAqIGludCAoKm5kb19nZXRfdmZfY29uZmlnKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogICoJCQkgICAgaW50IHZmLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmYpOwpAQCAtMTA0Nyw4ICsxMDQ1LDkgQEAKIAkJCQkJCSAgaW50IHF1ZXVlLCB1OCAqbWFjKTsKIAlpbnQJCQkoKm5kb19zZXRfdmZfdmxhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIGludCBxdWV1ZSwgdTE2IHZsYW4sIHU4IHFvcyk7Ci0JaW50CQkJKCpuZG9fc2V0X3ZmX3R4X3JhdGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgICBpbnQgdmYsIGludCByYXRlKTsKKwlpbnQJCQkoKm5kb19zZXRfdmZfcmF0ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLAorCQkJCQkJICAgaW50IG1heF90eF9yYXRlKTsKIAlpbnQJCQkoKm5kb19zZXRfdmZfc3Bvb2ZjaGspKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICAgaW50IHZmLCBib29sIHNldHRpbmcpOwogCWludAkJCSgqbmRvX2dldF92Zl9jb25maWcpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0yNjM0LDYgKzI2MzMsNyBAQAogCQkJIHN0cnVjdCBuZXRkZXZfcGh5c19wb3J0X2lkICpwcGlkKTsKIGludCBkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEpOworaW50IF9fZGV2X2ZvcndhcmRfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGRldl9mb3J3YXJkX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGJvb2wgaXNfc2tiX2ZvcndhcmRhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCkBAIC0zMDAzLDYgKzMwMDMsMTUgQEAKIAkJICAgc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKmZyb21fbGlzdCwgaW50IGFkZHJfbGVuKTsKIHZvaWQgX19od19hZGRyX3Vuc3luYyhzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHJfbGlzdCAqdG9fbGlzdCwKIAkJICAgICAgc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKmZyb21fbGlzdCwgaW50IGFkZHJfbGVuKTsKK2ludCBfX2h3X2FkZHJfc3luY19kZXYoc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKmxpc3QsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgaW50ICgqc3luYykoc3RydWN0IG5ldF9kZXZpY2UgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKSwKKwkJICAgICAgIGludCAoKnVuc3luYykoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwordm9pZCBfX2h3X2FkZHJfdW5zeW5jX2RldihzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHJfbGlzdCAqbGlzdCwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgaW50ICgqdW5zeW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICopKTsKIHZvaWQgX19od19hZGRyX2luaXQoc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKmxpc3QpOwogCiAvKiBGdW5jdGlvbnMgdXNlZCBmb3IgZGV2aWNlIGFkZHJlc3NlcyBoYW5kbGluZyAqLwpAQCAtMzAyMyw2ICszMDMyLDM4IEBACiB2b2lkIGRldl91Y19mbHVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgZGV2X3VjX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKKy8qKgorICogIF9fZGV2X3VjX3N5bmMgLSBTeW5jaG9uaXplIGRldmljZSdzIHVuaWNhc3QgbGlzdAorICogIEBkZXY6ICBkZXZpY2UgdG8gc3luYworICogIEBzeW5jOiBmdW5jdGlvbiB0byBjYWxsIGlmIGFkZHJlc3Mgc2hvdWxkIGJlIGFkZGVkCisgKiAgQHVuc3luYzogZnVuY3Rpb24gdG8gY2FsbCBpZiBhZGRyZXNzIHNob3VsZCBiZSByZW1vdmVkCisgKgorICogIEFkZCBuZXdseSBhZGRlZCBhZGRyZXNzZXMgdG8gdGhlIGludGVyZmFjZSwgYW5kIHJlbGVhc2UKKyAqICBhZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZC4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fZGV2X3VjX3N5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlpbnQgKCpzeW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKSwKKwkJCQlpbnQgKCp1bnN5bmMpKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpCit7CisJcmV0dXJuIF9faHdfYWRkcl9zeW5jX2RldigmZGV2LT51YywgZGV2LCBzeW5jLCB1bnN5bmMpOworfQorCisvKioKKyAqICBfX2Rldl91Y191bnN5bmMgLSBSZW1vdmUgc3luY2hvbml6ZWQgYWRkcmVzc2VzIGZyb20gZGV2aWNlCisgKiAgQGRldjogIGRldmljZSB0byBzeW5jCisgKiAgQHVuc3luYzogZnVuY3Rpb24gdG8gY2FsbCBpZiBhZGRyZXNzIHNob3VsZCBiZSByZW1vdmVkCisgKgorICogIFJlbW92ZSBhbGwgYWRkcmVzc2VzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgZGV2aWNlIGJ5IGRldl91Y19zeW5jKCkuCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZXZfdWNfdW5zeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgaW50ICgqdW5zeW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpCit7CisJX19od19hZGRyX3Vuc3luY19kZXYoJmRldi0+dWMsIGRldiwgdW5zeW5jKTsKK30KKwogLyogRnVuY3Rpb25zIHVzZWQgZm9yIG11bHRpY2FzdCBhZGRyZXNzZXMgaGFuZGxpbmcgKi8KIGludCBkZXZfbWNfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOwogaW50IGRldl9tY19hZGRfZ2xvYmFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOwpAQCAtMzAzNSw2ICszMDc2LDM4IEBACiB2b2lkIGRldl9tY19mbHVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgZGV2X21jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKKy8qKgorICogIF9fZGV2X21jX3N5bmMgLSBTeW5jaG9uaXplIGRldmljZSdzIG11bHRpY2FzdCBsaXN0CisgKiAgQGRldjogIGRldmljZSB0byBzeW5jCisgKiAgQHN5bmM6IGZ1bmN0aW9uIHRvIGNhbGwgaWYgYWRkcmVzcyBzaG91bGQgYmUgYWRkZWQKKyAqICBAdW5zeW5jOiBmdW5jdGlvbiB0byBjYWxsIGlmIGFkZHJlc3Mgc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKiAgQWRkIG5ld2x5IGFkZGVkIGFkZHJlc3NlcyB0byB0aGUgaW50ZXJmYWNlLCBhbmQgcmVsZWFzZQorICogIGFkZHJlc3NlcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkLgorICoqLworc3RhdGljIGlubGluZSBpbnQgX19kZXZfbWNfc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWludCAoKnN5bmMpKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICopLAorCQkJCWludCAoKnVuc3luYykoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKSkKK3sKKwlyZXR1cm4gX19od19hZGRyX3N5bmNfZGV2KCZkZXYtPm1jLCBkZXYsIHN5bmMsIHVuc3luYyk7Cit9CisKKy8qKgorICogIF9fZGV2X21jX3Vuc3luYyAtIFJlbW92ZSBzeW5jaG9uaXplZCBhZGRyZXNzZXMgZnJvbSBkZXZpY2UKKyAqICBAZGV2OiAgZGV2aWNlIHRvIHN5bmMKKyAqICBAdW5zeW5jOiBmdW5jdGlvbiB0byBjYWxsIGlmIGFkZHJlc3Mgc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKiAgUmVtb3ZlIGFsbCBhZGRyZXNzZXMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBkZXZpY2UgYnkgZGV2X21jX3N5bmMoKS4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Rldl9tY191bnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBpbnQgKCp1bnN5bmMpKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqKSkKK3sKKwlfX2h3X2FkZHJfdW5zeW5jX2RldigmZGV2LT5tYywgZGV2LCB1bnN5bmMpOworfQorCiAvKiBGdW5jdGlvbnMgdXNlZCBmb3Igc2Vjb25kYXJ5IHVuaWNhc3QgYW5kIG11bHRpY2FzdCBzdXBwb3J0ICovCiB2b2lkIGRldl9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgX19kZXZfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0zMTgwLDYgKzMyNTMsMjAgQEAKIAogdm9pZCBsaW5rd2F0Y2hfcnVuX3F1ZXVlKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIG5ldGRldl9mZWF0dXJlc190IG5ldGRldl9pbnRlcnNlY3RfZmVhdHVyZXMobmV0ZGV2X2ZlYXR1cmVzX3QgZjEsCisJCQkJCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmMikKK3sKKwlpZiAoZjEgJiBORVRJRl9GX0dFTl9DU1VNKQorCQlmMSB8PSAoTkVUSUZfRl9BTExfQ1NVTSAmIH5ORVRJRl9GX0dFTl9DU1VNKTsKKwlpZiAoZjIgJiBORVRJRl9GX0dFTl9DU1VNKQorCQlmMiB8PSAoTkVUSUZfRl9BTExfQ1NVTSAmIH5ORVRJRl9GX0dFTl9DU1VNKTsKKwlmMSAmPSBmMjsKKwlpZiAoZjEgJiBORVRJRl9GX0dFTl9DU1VNKQorCQlmMSAmPSB+KE5FVElGX0ZfQUxMX0NTVU0gJiB+TkVUSUZfRl9HRU5fQ1NVTSk7CisKKwlyZXR1cm4gZjE7Cit9CisKIHN0YXRpYyBpbmxpbmUgbmV0ZGV2X2ZlYXR1cmVzX3QgbmV0ZGV2X2dldF93YW50ZWRfZmVhdHVyZXMoCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCmluZGV4IGIyZTg1ZTU5Li42ZWM5NzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmgKQEAgLTMsMTEgKzMsMTcgQEAKIAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0Lmg+CiAKK2VudW0geworCU5GQUNDVF9OT19RVU9UQQkJPSAtMSwKKwlORkFDQ1RfVU5ERVJRVU9UQSwKKwlORkFDQ1RfT1ZFUlFVT1RBLAorfTsKIAogc3RydWN0IG5mX2FjY3Q7CiAKIHN0cnVjdCBuZl9hY2N0ICpuZm5sX2FjY3RfZmluZF9nZXQoY29uc3QgY2hhciAqZmlsdGVyX25hbWUpOwogdm9pZCBuZm5sX2FjY3RfcHV0KHN0cnVjdCBuZl9hY2N0ICphY2N0KTsKIHZvaWQgbmZubF9hY2N0X3VwZGF0ZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKLQorZXh0ZXJuIGludCBuZm5sX2FjY3Rfb3ZlcnF1b3RhKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKICNlbmRpZiAvKiBfTkZOTF9BQ0NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggMDM0Y2RhNy4uOWU1NzJkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTQ2LDcgKzQ2LDggQEAKIAl1bnNpZ25lZCBpbnQJZmxhZ3M7CiAJdm9pZAkJKCppbnB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJc3RydWN0IG11dGV4CSpjYl9tdXRleDsKLQl2b2lkCQkoKmJpbmQpKGludCBncm91cCk7CisJaW50CQkoKmJpbmQpKGludCBncm91cCk7CisJdm9pZAkJKCp1bmJpbmQpKGludCBncm91cCk7CiAJYm9vbAkJKCpjb21wYXJlKShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzayk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaAppbmRleCA5MTk1NzZiOC4uZTMwZjYwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCkBAIC00NTksMTMgKzQ1OSwxMiBAQAogLyoKICAqIGxpbnV4L2ZzL25mcy9kaXJlY3QuYwogICovCi1leHRlcm4gc3NpemVfdCBuZnNfZGlyZWN0X0lPKGludCwgc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBsb2ZmX3QsCi0JCQl1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBzc2l6ZV90IG5mc19kaXJlY3RfSU8oaW50LCBzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICosIGxvZmZfdCk7CiBleHRlcm4gc3NpemVfdCBuZnNfZmlsZV9kaXJlY3RfcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzLAorCQkJc3RydWN0IGlvdl9pdGVyICppdGVyLAogCQkJbG9mZl90IHBvcywgYm9vbCB1aW8pOwogZXh0ZXJuIHNzaXplX3QgbmZzX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCisJCQlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCiAJCQlsb2ZmX3QgcG9zLCBib29sIHVpbyk7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25sODAyMTU0LmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTU0LmgKaW5kZXggYzhkN2YzOS4uMjAxNjNiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ubDgwMjE1NC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmw4MDIxNTQuaApAQCAtODAsNiArODAsMjIgQEAKIAogCUlFRUU4MDIxNTRfQVRUUl9GUkFNRV9SRVRSSUVTLAogCisJSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0VOQUJMRUQsCisJSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMLAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfTU9ERSwKKwlJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1NPVVJDRV9TSE9SVCwKKwlJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1NPVVJDRV9FWFRFTkRFRCwKKwlJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX0lELAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19GUkFNRV9DT1VOVEVSLAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfQllURVMsCisJSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9VU0FHRV9GUkFNRV9UWVBFUywKKwlJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1VTQUdFX0NPTU1BTkRTLAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19GUkFNRV9UWVBFLAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19DTURfRlJBTUVfSUQsCisJSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMUywKKwlJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX09WRVJSSURFLAorCUlFRUU4MDIxNTRfQVRUUl9MTFNFQ19ERVZfS0VZX01PREUsCisKIAlfX0lFRUU4MDIxNTRfQVRUUl9NQVgsCiB9OwogCkBAIC0xMzQsNiArMTUwLDIxIEBACiAKIAlJRUVFODAyMTU0X1NFVF9NQUNQQVJBTVMsCiAKKwlJRUVFODAyMTU0X0xMU0VDX0dFVFBBUkFNUywKKwlJRUVFODAyMTU0X0xMU0VDX1NFVFBBUkFNUywKKwlJRUVFODAyMTU0X0xMU0VDX0xJU1RfS0VZLAorCUlFRUU4MDIxNTRfTExTRUNfQUREX0tFWSwKKwlJRUVFODAyMTU0X0xMU0VDX0RFTF9LRVksCisJSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0RFViwKKwlJRUVFODAyMTU0X0xMU0VDX0FERF9ERVYsCisJSUVFRTgwMjE1NF9MTFNFQ19ERUxfREVWLAorCUlFRUU4MDIxNTRfTExTRUNfTElTVF9ERVZLRVksCisJSUVFRTgwMjE1NF9MTFNFQ19BRERfREVWS0VZLAorCUlFRUU4MDIxNTRfTExTRUNfREVMX0RFVktFWSwKKwlJRUVFODAyMTU0X0xMU0VDX0xJU1RfU0VDTEVWRUwsCisJSUVFRTgwMjE1NF9MTFNFQ19BRERfU0VDTEVWRUwsCisJSUVFRTgwMjE1NF9MTFNFQ19ERUxfU0VDTEVWRUwsCisKIAlfX0lFRUU4MDIxNTRfQ01EX01BWCwKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfbWRpby5oIGIvaW5jbHVkZS9saW51eC9vZl9tZGlvLmgKaW5kZXggODgxYTdjMy4uYTcwYzk0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9tZGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9tZGlvLmgKQEAgLTIyLDEyICsyMiwxMiBAQAogc3RydWN0IHBoeV9kZXZpY2UgKm9mX3BoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRldmljZV9ub2RlICpwaHlfbnAsIHUzMiBmbGFncywKIAkJCQkgcGh5X2ludGVyZmFjZV90IGlmYWNlKTsKLWV4dGVybiBzdHJ1Y3QgcGh5X2RldmljZSAqb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgdm9pZCAoKmhuZGxyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKLQkJCQkJIHBoeV9pbnRlcmZhY2VfdCBpZmFjZSk7CiAKIGV4dGVybiBzdHJ1Y3QgbWlpX2J1cyAqb2ZfbWRpb19maW5kX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm1kaW9fbnApOwogCitleHRlcm4gdm9pZCBvZl9tZGlvYnVzX2xpbmtfcGh5ZGV2KHN0cnVjdCBtaWlfYnVzICptZGlvLAorCQkJCSAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOworCiAjZWxzZSAvKiBDT05GSUdfT0YgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG9mX21kaW9idXNfcmVnaXN0ZXIoc3RydWN0IG1paV9idXMgKm1kaW8sIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CkBAIC01OSwxNyArNTksMzAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGh5X2RldmljZSAqb2ZfcGh5X2Nvbm5lY3RfZml4ZWRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCSAgIHZvaWQgKCpobmRscikoc3RydWN0IG5ldF9kZXZpY2UgKiksCi0JCQkJCQkJICAgcGh5X2ludGVyZmFjZV90IGlmYWNlKQotewotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtaWlfYnVzICpvZl9tZGlvX2ZpbmRfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbWRpb19ucCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIG9mX21kaW9idXNfbGlua19waHlkZXYoc3RydWN0IG1paV9idXMgKm1kaW8sCisJCQkJCSAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKK30KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX09GKSAmJiBkZWZpbmVkKENPTkZJR19GSVhFRF9QSFkpCitleHRlcm4gaW50IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIGJvb2wgb2ZfcGh5X2lzX2ZpeGVkX2xpbmsoc3RydWN0IGRldmljZV9ub2RlICpucCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgb2ZfcGh5X3JlZ2lzdGVyX2ZpeGVkX2xpbmsoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBvZl9waHlfaXNfZml4ZWRfbGluayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisKICNlbmRpZiAvKiBfX0xJTlVYX09GX01ESU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNzFkOTY3My4uNDY2YmNkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0xNjQsMTMgKzE2NCwxNyBAQAogCS8qIElOVFhfRElTQUJMRSBpbiBQQ0lfQ09NTUFORCByZWdpc3RlciBkaXNhYmxlcyBNU0kKIAkgKiBnZW5lcmF0aW9uIHRvby4KIAkgKi8KLQlQQ0lfREVWX0ZMQUdTX01TSV9JTlRYX0RJU0FCTEVfQlVHID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSAxLAorCVBDSV9ERVZfRkxBR1NfTVNJX0lOVFhfRElTQUJMRV9CVUcgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpICgxIDw8IDApLAogCS8qIERldmljZSBjb25maWd1cmF0aW9uIGlzIGlycmV2b2NhYmx5IGxvc3QgaWYgZGlzYWJsZWQgaW50byBEMyAqLwotCVBDSV9ERVZfRkxBR1NfTk9fRDMgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpIDIsCisJUENJX0RFVl9GTEFHU19OT19EMyA9IChfX2ZvcmNlIHBjaV9kZXZfZmxhZ3NfdCkgKDEgPDwgMSksCiAJLyogUHJvdmlkZSBpbmRpY2F0aW9uIGRldmljZSBpcyBhc3NpZ25lZCBieSBhIFZpcnR1YWwgTWFjaGluZSBNYW5hZ2VyICovCi0JUENJX0RFVl9GTEFHU19BU1NJR05FRCA9IChfX2ZvcmNlIHBjaV9kZXZfZmxhZ3NfdCkgNCwKKwlQQ0lfREVWX0ZMQUdTX0FTU0lHTkVEID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSAoMSA8PCAyKSwKIAkvKiBGbGFnIGZvciBxdWlyayB1c2UgdG8gc3RvcmUgaWYgcXVpcmstc3BlY2lmaWMgQUNTIGlzIGVuYWJsZWQgKi8KLQlQQ0lfREVWX0ZMQUdTX0FDU19FTkFCTEVEX1FVSVJLID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSA4LAorCVBDSV9ERVZfRkxBR1NfQUNTX0VOQUJMRURfUVVJUksgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpICgxIDw8IDMpLAorCS8qIEZsYWcgdG8gaW5kaWNhdGUgdGhlIGRldmljZSB1c2VzIGRtYV9hbGlhc19kZXZmbiAqLworCVBDSV9ERVZfRkxBR1NfRE1BX0FMSUFTX0RFVkZOID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSAoMSA8PCA0KSwKKwkvKiBVc2UgYSBQQ0llLXRvLVBDSSBicmlkZ2UgYWxpYXMgZXZlbiBpZiAhcGNpX2lzX3BjaWUgKi8KKwlQQ0lfREVWX0ZMQUdfUENJRV9CUklER0VfQUxJQVMgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpICgxIDw8IDUpLAogfTsKIAogZW51bSBwY2lfaXJxX3Jlcm91dGVfdmFyaWFudCB7CkBAIC0yNjgsNiArMjcyLDcgQEAKIAl1OAkJcm9tX2Jhc2VfcmVnOwkvKiB3aGljaCBjb25maWcgcmVnaXN0ZXIgY29udHJvbHMgdGhlIFJPTSAqLwogCXU4CQlwaW47CQkvKiB3aGljaCBpbnRlcnJ1cHQgcGluIHRoaXMgZGV2aWNlIHVzZXMgKi8KIAl1MTYJCXBjaWVfZmxhZ3NfcmVnOwkvKiBjYWNoZWQgUENJZSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KKwl1OAkJZG1hX2FsaWFzX2RldmZuOy8qIGRldmZuIG9mIERNQSBhbGlhcywgaWYgYW55ICovCiAKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyOwkvKiB3aGljaCBkcml2ZXIgaGFzIGFsbG9jYXRlZCB0aGlzIGRldmljZSAqLwogCXU2NAkJZG1hX21hc2s7CS8qIE1hc2sgb2YgdGhlIGJpdHMgb2YgYnVzIGFkZHJlc3MgdGhpcwpAQCAtMTgwOSw2ICsxODE0LDEwIEBACiB9CiAjZW5kaWYKIAoraW50IHBjaV9mb3JfZWFjaF9kbWFfYWxpYXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICBpbnQgKCpmbikoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICB1MTYgYWxpYXMsIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKKwogLyoqCiAgKiBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZSAtIGZpbmQgdXBzdHJlYW0gUENJZS10by1QQ0kgYnJpZGdlIG9mIGEgZGV2aWNlCiAgKiBAcGRldjogdGhlIFBDSSBkZXZpY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKaW5kZXggYTkyMDkxMS4uNzA3NjE3YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC0xNjcsNiArMTY3LDExIEBACiAjZGVmaW5lIFBFUkZfRVZFTlRfVFhOIDB4MQogCiAvKioKKyAqIHBtdTo6Y2FwYWJpbGl0aWVzIGZsYWdzCisgKi8KKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX05PX0lOVEVSUlVQVAkJMHgwMQorCisvKioKICAqIHN0cnVjdCBwbXUgLSBnZW5lcmljIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdAogICovCiBzdHJ1Y3QgcG11IHsKQEAgLTE3OCw2ICsxODMsMTEgQEAKIAljb25zdCBjaGFyCQkJKm5hbWU7CiAJaW50CQkJCXR5cGU7CiAKKwkvKgorCSAqIHZhcmlvdXMgY29tbW9uIHBlci1wbXUgZmVhdHVyZSBmbGFncworCSAqLworCWludAkJCQljYXBhYmlsaXRpZXM7CisKIAlpbnQgKiBfX3BlcmNwdQkJCXBtdV9kaXNhYmxlX2NvdW50OwogCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICogX19wZXJjcHUgcG11X2NwdV9jb250ZXh0OwogCWludAkJCQl0YXNrX2N0eF9ucjsKQEAgLTY5Niw3ICs3MDYsOCBAQAogZXh0ZXJuIGludCBwZXJmX3JlZ2lzdGVyX2d1ZXN0X2luZm9fY2FsbGJhY2tzKHN0cnVjdCBwZXJmX2d1ZXN0X2luZm9fY2FsbGJhY2tzICpjYWxsYmFja3MpOwogZXh0ZXJuIGludCBwZXJmX3VucmVnaXN0ZXJfZ3Vlc3RfaW5mb19jYWxsYmFja3Moc3RydWN0IHBlcmZfZ3Vlc3RfaW5mb19jYWxsYmFja3MgKmNhbGxiYWNrcyk7CiAKLWV4dGVybiB2b2lkIHBlcmZfZXZlbnRfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CitleHRlcm4gdm9pZCBwZXJmX2V2ZW50X2V4ZWModm9pZCk7CitleHRlcm4gdm9pZCBwZXJmX2V2ZW50X2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGJvb2wgZXhlYyk7CiBleHRlcm4gdm9pZCBwZXJmX2V2ZW50X2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCiAvKiBDYWxsY2hhaW5zICovCkBAIC03NzMsNyArNzg0LDcgQEAKIGV4dGVybiB2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogZXh0ZXJuIGludCBfX3BlcmZfZXZlbnRfZGlzYWJsZSh2b2lkICppbmZvKTsKIGV4dGVybiB2b2lkIHBlcmZfZXZlbnRfdGFza190aWNrKHZvaWQpOwotI2Vsc2UKKyNlbHNlIC8qICFDT05GSUdfUEVSRl9FVkVOVFM6ICovCiBzdGF0aWMgaW5saW5lIHZvaWQKIHBlcmZfZXZlbnRfdGFza19zY2hlZF9pbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCiAJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQkJCXsgfQpAQCAtODAzLDcgKzgxNCw4IEBACiAoc3RydWN0IHBlcmZfZ3Vlc3RfaW5mb19jYWxsYmFja3MgKmNhbGxiYWNrcykJCQkJeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQkJeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9jb21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9leGVjKHZvaWQpCQkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZXZlbnRfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgYm9vbCBleGVjKQl7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50X2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCQl7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50X2luaXQodm9pZCkJCQkJeyB9CiBzdGF0aWMgaW5saW5lIGludCAgcGVyZl9zd2V2ZW50X2dldF9yZWN1cnNpb25fY29udGV4dCh2b2lkKQkJeyByZXR1cm4gLTE7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS5oCmluZGV4IDRkMDIyMWYuLjg2NGRkYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtMTk4LDYgKzE5OCwxMyBAQAogaW50IG1kaW9idXNfcmVnaXN0ZXIoc3RydWN0IG1paV9idXMgKmJ1cyk7CiB2b2lkIG1kaW9idXNfdW5yZWdpc3RlcihzdHJ1Y3QgbWlpX2J1cyAqYnVzKTsKIHZvaWQgbWRpb2J1c19mcmVlKHN0cnVjdCBtaWlfYnVzICpidXMpOworc3RydWN0IG1paV9idXMgKmRldm1fbWRpb2J1c19hbGxvY19zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemVvZl9wcml2KTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1paV9idXMgKmRldm1fbWRpb2J1c19hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldm1fbWRpb2J1c19hbGxvY19zaXplKGRldiwgMCk7Cit9CisKK3ZvaWQgZGV2bV9tZGlvYnVzX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWlpX2J1cyAqYnVzKTsKIHN0cnVjdCBwaHlfZGV2aWNlICptZGlvYnVzX3NjYW4oc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIpOwogaW50IG1kaW9idXNfcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgdTMyIHJlZ251bSk7CiBpbnQgbWRpb2J1c193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgdTMyIHJlZ251bSwgdTE2IHZhbCk7CkBAIC02NjYsNiArNjczLDcgQEAKIAlyZXR1cm4gcGh5ZGV2LT5kcnYtPnJlYWRfc3RhdHVzKHBoeWRldik7CiB9CiAKK2ludCBnZW5waHlfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiBpbnQgZ2VucGh5X3NldHVwX2ZvcmNlZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIGludCBnZW5waHlfcmVzdGFydF9hbmVnKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogaW50IGdlbnBoeV9jb25maWdfYW5lZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5X2ZpeGVkLmggYi9pbmNsdWRlL2xpbnV4L3BoeV9maXhlZC5oCmluZGV4IDUwOWQ4ZjUuLmFlNjEyYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5X2ZpeGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9waHlfZml4ZWQuaApAQCAtOSwxNSArOSwzMSBAQAogCWludCBhc3ltX3BhdXNlOwogfTsKIAorc3RydWN0IGRldmljZV9ub2RlOworCiAjaWZkZWYgQ09ORklHX0ZJWEVEX1BIWQogZXh0ZXJuIGludCBmaXhlZF9waHlfYWRkKHVuc2lnbmVkIGludCBpcnEsIGludCBwaHlfaWQsCiAJCQkgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cyk7CitleHRlcm4gaW50IGZpeGVkX3BoeV9yZWdpc3Rlcih1bnNpZ25lZCBpbnQgaXJxLAorCQkJICAgICAgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cywKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIHZvaWQgZml4ZWRfcGh5X2RlbChpbnQgcGh5X2FkZHIpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGZpeGVkX3BoeV9hZGQodW5zaWduZWQgaW50IGlycSwgaW50IHBoeV9pZCwKIAkJCQlzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyAqc3RhdHVzKQogewogCXJldHVybiAtRU5PREVWOwogfQorc3RhdGljIGlubGluZSBpbnQgZml4ZWRfcGh5X3JlZ2lzdGVyKHVuc2lnbmVkIGludCBpcnEsCisJCQkJICAgICBzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyAqc3RhdHVzLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGZpeGVkX3BoeV9kZWwoaW50IHBoeV9hZGRyKQoreworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmIC8qIENPTkZJR19GSVhFRF9QSFkgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXBjYTk2ODUuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXBjYTk2ODUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4ZTllNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbGVkcy1wY2E5Njg1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMgTWF4aW1pbGlhbiBHw7xudG5lciA8bWF4aW1pbGlhbi5ndWVudG5lckBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgotICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KLSAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBCYXNlZCBvbiBsZWRzLXBjYTk2M3guaCBieSBQZXRlciBNZWVyd2FsZCA8cC5tZWVyd2FsZEBiY3QtZWxlY3Ryb25pYy5jb20+Ci0gKgotICogTEVEIGRyaXZlciBmb3IgdGhlIE5YUCBQQ0E5Njg1IFBXTSBjaGlwCi0gKgotICovCi0KLSNpZm5kZWYgX19MSU5VWF9QQ0E5Njg1X0gKLSNkZWZpbmUgX19MSU5VWF9QQ0E5Njg1X0gKLQotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLQotZW51bSBwY2E5Njg1X291dGRydiB7Ci0JUENBOTY4NV9PUEVOX0RSQUlOLAotCVBDQTk2ODVfVE9URU1fUE9MRSwKLX07Ci0KLWVudW0gcGNhOTY4NV9pbnZlcnRlZCB7Ci0JUENBOTY4NV9OT1RfSU5WRVJURUQsCi0JUENBOTY4NV9JTlZFUlRFRCwKLX07Ci0KLXN0cnVjdCBwY2E5Njg1X3BsYXRmb3JtX2RhdGEgewotCXN0cnVjdCBsZWRfcGxhdGZvcm1fZGF0YSBsZWRzOwotCWVudW0gcGNhOTY4NV9vdXRkcnYgb3V0ZHJ2OwotCWVudW0gcGNhOTY4NV9pbnZlcnRlZCBpbnZlcnRlZDsKLX07Ci0KLSNlbmRpZiAvKiBfX0xJTlVYX1BDQTk2ODVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3N0MjFuZmNhLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3QyMW5mY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMwMzEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3N0MjFuZmNhLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIERyaXZlciBpbmNsdWRlIGZvciB0aGUgU1QyMU5GQ0EgTkZDIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0ICBTVE1pY3JvZWxlY3Ryb25pY3MgU0FTLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfU1QyMU5GQ0FfSENJX0hfCisjZGVmaW5lIF9TVDIxTkZDQV9IQ0lfSF8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjZGVmaW5lIFNUMjFORkNBX0hDSV9EUklWRVJfTkFNRSAic3QyMW5mY2FfaGNpIgorCitzdHJ1Y3Qgc3QyMW5mY2FfbmZjX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCBncGlvX2lycTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19lbmE7CisJdW5zaWduZWQgaW50IGlycV9wb2xhcml0eTsKK307CisKKyNlbmRpZiAvKiBfU1QyMU5GQ0FfSENJX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jma2lsbC1ncGlvLmggYi9pbmNsdWRlL2xpbnV4L3Jma2lsbC1ncGlvLmgKaW5kZXggNGQwOWY2ZS4uMjBiY2I1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZmtpbGwtZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvcmZraWxsLWdwaW8uaApAQCAtMjcsMjEgKzI3LDExIEBACiAgKiBzdHJ1Y3QgcmZraWxsX2dwaW9fcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIHJma2lsbCBncGlvIGRldmljZS4KICAqIGZvciB1bnVzZWQgZ3BpbydzLCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgLTEuCiAgKiBAbmFtZToJCW5hbWUgZm9yIHRoZSBncGlvIHJmIGtpbGwgaW5zdGFuY2UKLSAqIEByZXNldF9ncGlvOgkJR1BJTyB3aGljaCBpcyB1c2VkIGZvciByZXNldGluZyByZmtpbGwgc3dpdGNoCi0gKiBAc2h1dGRvd25fZ3BpbzoJR1BJTyB3aGljaCBpcyB1c2VkIGZvciBzaHV0ZG93biBvZiByZmtpbGwgc3dpdGNoCi0gKiBAcG93ZXJfY2xrX25hbWU6CVtvcHRpb25hbF0gbmFtZSBvZiBjbGsgdG8gdHVybiBvZmYgd2hpbGUgYmxvY2tlZAotICogQGdwaW9fcnVudGltZV9jbG9zZToJY2xlYW4gdXAgcGxhdGZvcm0gc3BlY2lmaWMgZ3BpbyBjb25maWd1cmF0aW9uCi0gKiBAZ3Bpb19ydW50aW1lX3NldHVwOglzZXQgdXAgcGxhdGZvcm0gc3BlY2lmaWMgZ3BpbyBjb25maWd1cmF0aW9uCiAgKi8KIAogc3RydWN0IHJma2lsbF9ncGlvX3BsYXRmb3JtX2RhdGEgewogCWNoYXIJCQkqbmFtZTsKLQlpbnQJCQlyZXNldF9ncGlvOwotCWludAkJCXNodXRkb3duX2dwaW87Ci0JY29uc3QgY2hhcgkJKnBvd2VyX2Nsa19uYW1lOwogCWVudW0gcmZraWxsX3R5cGUJdHlwZTsKLQl2b2lkCSgqZ3Bpb19ydW50aW1lX2Nsb3NlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwotCWludAkoKmdwaW9fcnVudGltZV9zZXR1cCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIH07CiAKICNlbmRpZiAvKiBfX1JGS0lMTF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaCBiL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaAppbmRleCBkNjljZjYzLi40OWE0ZDZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW5nX2J1ZmZlci5oCkBAIC05Nyw3ICs5Nyw3IEBACiAJX19yaW5nX2J1ZmZlcl9hbGxvYygoc2l6ZSksIChmbGFncyksICZfX2tleSk7CVwKIH0pCiAKLXZvaWQgcmluZ19idWZmZXJfd2FpdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CitpbnQgcmluZ19idWZmZXJfd2FpdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CiBpbnQgcmluZ19idWZmZXJfcG9sbF93YWl0KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1LAogCQkJICBzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqcG9sbF90YWJsZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcndzZW0uaCBiL2luY2x1ZGUvbGludXgvcndzZW0uaAppbmRleCAwM2YzYjA1Li44ZDc5NzA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J3c2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9yd3NlbS5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KIAorc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZTsKIHN0cnVjdCByd19zZW1hcGhvcmU7CiAKICNpZmRlZiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSwpAQCAtMjMsOSArMjQsMTcgQEAKICNlbHNlCiAvKiBBbGwgYXJjaCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgc2hhcmUgdGhlIHNhbWUgc3RydWN0ICovCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHsKLQlsb25nCQkJY291bnQ7Ci0JcmF3X3NwaW5sb2NrX3QJCXdhaXRfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRfbGlzdDsKKwlsb25nIGNvdW50OworCXJhd19zcGlubG9ja190IHdhaXRfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfbGlzdDsKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBXcml0ZSBvd25lci4gVXNlZCBhcyBhIHNwZWN1bGF0aXZlIGNoZWNrIHRvIHNlZQorCSAqIGlmIHRoZSBvd25lciBpcyBydW5uaW5nIG9uIHRoZSBjcHUuCisJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcjsKKwlzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICpvc3E7IC8qIHNwaW5uZXIgTUNTIGxvY2sgKi8KKyNlbmRpZgogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiAJc3RydWN0IGxvY2tkZXBfbWFwCWRlcF9tYXA7CiAjZW5kaWYKQEAgLTU1LDExICs2NCwyMSBAQAogIyBkZWZpbmUgX19SV1NFTV9ERVBfTUFQX0lOSVQobG9ja25hbWUpCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgIWRlZmluZWQoQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0spCisjZGVmaW5lIF9fUldTRU1fSU5JVElBTElaRVIobmFtZSkJCQlcCisJeyBSV1NFTV9VTkxPQ0tFRF9WQUxVRSwJCQkJXAorCSAgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEKG5hbWUud2FpdF9sb2NrKSwJXAorCSAgTElTVF9IRUFEX0lOSVQoKG5hbWUpLndhaXRfbGlzdCksCQlcCisJICBOVUxMLCAvKiBvd25lciAqLwkJCQlcCisJICBOVUxMIC8qIG1jcyBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgX19SV1NFTV9ERVBfTUFQX0lOSVQobmFtZSkgfQorI2Vsc2UKICNkZWZpbmUgX19SV1NFTV9JTklUSUFMSVpFUihuYW1lKQkJCVwKIAl7IFJXU0VNX1VOTE9DS0VEX1ZBTFVFLAkJCQlcCiAJICBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQobmFtZS53YWl0X2xvY2spLAlcCiAJICBMSVNUX0hFQURfSU5JVCgobmFtZSkud2FpdF9saXN0KQkJXAogCSAgX19SV1NFTV9ERVBfTUFQX0lOSVQobmFtZSkgfQorI2VuZGlmCiAKICNkZWZpbmUgREVDTEFSRV9SV1NFTShuYW1lKSBcCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBuYW1lID0gX19SV1NFTV9JTklUSUFMSVpFUihuYW1lKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGVhNzQ1OTYuLjMwNmY0ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTg0NywxMCArODQ3LDEwIEBACiB9OwogCiAvKgotICogSW5jcmVhc2UgcmVzb2x1dGlvbiBvZiBjcHVfcG93ZXIgY2FsY3VsYXRpb25zCisgKiBJbmNyZWFzZSByZXNvbHV0aW9uIG9mIGNwdV9jYXBhY2l0eSBjYWxjdWxhdGlvbnMKICAqLwotI2RlZmluZSBTQ0hFRF9QT1dFUl9TSElGVAkxMAotI2RlZmluZSBTQ0hFRF9QT1dFUl9TQ0FMRQkoMUwgPDwgU0NIRURfUE9XRVJfU0hJRlQpCisjZGVmaW5lIFNDSEVEX0NBUEFDSVRZX1NISUZUCTEwCisjZGVmaW5lIFNDSEVEX0NBUEFDSVRZX1NDQUxFCSgxTCA8PCBTQ0hFRF9DQVBBQ0lUWV9TSElGVCkKIAogLyoKICAqIHNjaGVkLWRvbWFpbnMgKG11bHRpcHJvY2Vzc29yIGJhbGFuY2luZykgZGVjbGFyYXRpb25zOgpAQCAtODYyLDcgKzg2Miw3IEBACiAjZGVmaW5lIFNEX0JBTEFOQ0VfRk9SSwkJMHgwMDA4CS8qIEJhbGFuY2Ugb24gZm9yaywgY2xvbmUgKi8KICNkZWZpbmUgU0RfQkFMQU5DRV9XQUtFCQkweDAwMTAgIC8qIEJhbGFuY2Ugb24gd2FrZXVwICovCiAjZGVmaW5lIFNEX1dBS0VfQUZGSU5FCQkweDAwMjAJLyogV2FrZSB0YXNrIHRvIHdha2luZyBDUFUgKi8KLSNkZWZpbmUgU0RfU0hBUkVfQ1BVUE9XRVIJMHgwMDgwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwb3dlciAqLworI2RlZmluZSBTRF9TSEFSRV9DUFVDQVBBQ0lUWQkweDAwODAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgY3B1IHBvd2VyICovCiAjZGVmaW5lIFNEX1NIQVJFX1BPV0VSRE9NQUlOCTB4MDEwMAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBwb3dlciBkb21haW4gKi8KICNkZWZpbmUgU0RfU0hBUkVfUEtHX1JFU09VUkNFUwkweDAyMDAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgY3B1IHBrZyByZXNvdXJjZXMgKi8KICNkZWZpbmUgU0RfU0VSSUFMSVpFCQkweDA0MDAJLyogT25seSBhIHNpbmdsZSBsb2FkIGJhbGFuY2luZyBpbnN0YW5jZSAqLwpAQCAtODc0LDcgKzg3NCw3IEBACiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAogc3RhdGljIGlubGluZSBjb25zdCBpbnQgY3B1X3NtdF9mbGFncyh2b2lkKQogewotCXJldHVybiBTRF9TSEFSRV9DUFVQT1dFUiB8IFNEX1NIQVJFX1BLR19SRVNPVVJDRVM7CisJcmV0dXJuIFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwgU0RfU0hBUkVfUEtHX1JFU09VUkNFUzsKIH0KICNlbmRpZgogCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogc3RydWN0IHNkX2RhdGEgewogCXN0cnVjdCBzY2hlZF9kb21haW4gKipfX3BlcmNwdSBzZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipfX3BlcmNwdSBzZzsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgKipfX3BlcmNwdSBzZ3A7CisJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICoqX19wZXJjcHUgc2djOwogfTsKIAogc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCB7CkBAIC0yMTczLDcgKzIxNzMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2F1dG9ncm91cF9leGl0KHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpIHsgfQogI2VuZGlmCiAKLWV4dGVybiBib29sIHlpZWxkX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgYm9vbCBwcmVlbXB0KTsKK2V4dGVybiBpbnQgeWllbGRfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBib29sIHByZWVtcHQpOwogZXh0ZXJuIHZvaWQgc2V0X3VzZXJfbmljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgbmljZSk7CiBleHRlcm4gaW50IHRhc2tfcHJpbyhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogLyoqCkBAIC0yNDIxLDcgKzI0MjEsMTEgQEAKIHN0cnVjdCB0YXNrX3N0cnVjdCAqZm9ya19pZGxlKGludCk7CiBleHRlcm4gcGlkX3Qga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAotZXh0ZXJuIHZvaWQgc2V0X3Rhc2tfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3QgY2hhciAqZnJvbSk7CitleHRlcm4gdm9pZCBfX3NldF90YXNrX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNvbnN0IGNoYXIgKmZyb20sIGJvb2wgZXhlYyk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rhc2tfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3QgY2hhciAqZnJvbSkKK3sKKwlfX3NldF90YXNrX2NvbW0odHNrLCBmcm9tLCBmYWxzZSk7Cit9CiBleHRlcm4gY2hhciAqZ2V0X3Rhc2tfY29tbShjaGFyICp0bywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggMDgwNzRhOC4uNWI1Y2QzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0zNDUsNiArMzQ1LDEwIEBACiAJU0tCX0dTT19VRFBfVFVOTkVMID0gMSA8PCA5LAogCiAJU0tCX0dTT19NUExTID0gMSA8PCAxMCwKKworCVNLQl9HU09fVURQX1RVTk5FTF9DU1VNID0gMSA8PCAxMSwKKworCVNLQl9HU09fR1JFX0NTVU0gPSAxIDw8IDEyLAogfTsKIAogI2lmIEJJVFNfUEVSX0xPTkcgPiAzMgpAQCAtNDI2LDcgKzQzMCw3IEBACiAgKglAY3N1bV9zdGFydDogT2Zmc2V0IGZyb20gc2tiLT5oZWFkIHdoZXJlIGNoZWNrc3VtbWluZyBzaG91bGQgc3RhcnQKICAqCUBjc3VtX29mZnNldDogT2Zmc2V0IGZyb20gY3N1bV9zdGFydCB3aGVyZSBjaGVja3N1bSBzaG91bGQgYmUgc3RvcmVkCiAgKglAcHJpb3JpdHk6IFBhY2tldCBxdWV1ZWluZyBwcmlvcml0eQotICoJQGxvY2FsX2RmOiBhbGxvdyBsb2NhbCBmcmFnbWVudGF0aW9uCisgKglAaWdub3JlX2RmOiBhbGxvdyBsb2NhbCBmcmFnbWVudGF0aW9uCiAgKglAY2xvbmVkOiBIZWFkIG1heSBiZSBjbG9uZWQgKGNoZWNrIHJlZmNudCB0byBiZSBzdXJlKQogICoJQGlwX3N1bW1lZDogRHJpdmVyIGZlZCB1cyBhbiBJUCBjaGVja3N1bQogICoJQG5vaGRyOiBQYXlsb2FkIHJlZmVyZW5jZSBvbmx5LCBtdXN0IG5vdCBtb2RpZnkgaGVhZGVyCkBAIC01MTQsNyArNTE4LDcgQEAKIAl9OwogCV9fdTMyCQkJcHJpb3JpdHk7CiAJa21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKGZsYWdzMSk7Ci0JX191OAkJCWxvY2FsX2RmOjEsCisJX191OAkJCWlnbm9yZV9kZjoxLAogCQkJCWNsb25lZDoxLAogCQkJCWlwX3N1bW1lZDoyLAogCQkJCW5vaGRyOjEsCkBAIC01NjcsNyArNTcxLDEwIEBACiAJICogaGVhZGVycyBpZiBuZWVkZWQKIAkgKi8KIAlfX3U4CQkJZW5jYXBzdWxhdGlvbjoxOwotCS8qIDYvOCBiaXQgaG9sZSAoZGVwZW5kaW5nIG9uIG5kaXNjX25vZGV0eXBlIHByZXNlbmNlKSAqLworCV9fdTgJCQllbmNhcF9oZHJfY3N1bToxOworCV9fdTgJCQljc3VtX3ZhbGlkOjE7CisJX191OAkJCWNzdW1fY29tcGxldGVfc3c6MTsKKwkvKiAzLzUgYml0IGhvbGUgKGRlcGVuZGluZyBvbiBuZGlzY19ub2RldHlwZSBwcmVzZW5jZSkgKi8KIAlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzMik7CiAKICNpZiBkZWZpbmVkIENPTkZJR19ORVRfRE1BIHx8IGRlZmluZWQgQ09ORklHX05FVF9SWF9CVVNZX1BPTEwKQEAgLTczOSw3ICs3NDYsMTMgQEAKIGludCBza2JfY29weV91YnVmcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnBfbWFzayk7CiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IHByaW9yaXR5KTsKIHN0cnVjdCBza19idWZmICpza2JfY29weShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBwcmlvcml0eSk7Ci1zdHJ1Y3Qgc2tfYnVmZiAqX19wc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhlYWRyb29tLCBnZnBfdCBnZnBfbWFzayk7CitzdHJ1Y3Qgc2tfYnVmZiAqX19wc2tiX2NvcHlfZmNsb25lKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZWFkcm9vbSwKKwkJCQkgICBnZnBfdCBnZnBfbWFzaywgYm9vbCBmY2xvbmUpOworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX19wc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhlYWRyb29tLAorCQkJCQkgIGdmcF90IGdmcF9tYXNrKQoreworCXJldHVybiBfX3Bza2JfY29weV9mY2xvbmUoc2tiLCBoZWFkcm9vbSwgZ2ZwX21hc2ssIGZhbHNlKTsKK30KIAogaW50IHBza2JfZXhwYW5kX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5oZWFkLCBpbnQgbnRhaWwsIGdmcF90IGdmcF9tYXNrKTsKIHN0cnVjdCBza19idWZmICpza2JfcmVhbGxvY19oZWFkcm9vbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjIzMyw2ICsyMjQ2LDE0IEBACiAJcmV0dXJuIF9fcHNrYl9jb3B5KHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIGdmcF9tYXNrKTsKIH0KIAorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpwc2tiX2NvcHlfZm9yX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGdmcF90IGdmcF9tYXNrKQoreworCXJldHVybiBfX3Bza2JfY29weV9mY2xvbmUoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgZ2ZwX21hc2ssIHRydWUpOworfQorCisKIC8qKgogICoJc2tiX2Nsb25lX3dyaXRhYmxlIC0gaXMgdGhlIGhlYWRlciBvZiBhIGNsb25lIHdyaXRhYmxlCiAgKglAc2tiOiBidWZmZXIgdG8gY2hlY2sKQEAgLTI3MTYsNyArMjczNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHNrYl9jc3VtX3VubmVjZXNzYXJ5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYi0+aXBfc3VtbWVkICYgQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJcmV0dXJuICgoc2tiLT5pcF9zdW1tZWQgJiBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgfHwgc2tiLT5jc3VtX3ZhbGlkKTsKIH0KIAogLyoqCkBAIC0yNzQxLDYgKzI3NjIsMTAzIEBACiAJICAgICAgIDAgOiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwogfQogCisvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gY2hlY2tzdW0gY29tcGxldGUgdmFsaWRhdGlvbi4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgY2hlY2tzdW0gY29tcGxldGUgaXMgbmVlZGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqIChlaXRoZXIgY2hlY2tzdW0gaXMgdW5uZWNlc3Nhcnkgb3IgemVybyBjaGVja3N1bSBpcyBhbGxvd2VkKS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fc2tiX2NoZWNrc3VtX3ZhbGlkYXRlX25lZWRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICBib29sIHplcm9fb2theSwKKwkJCQkJCSAgX19zdW0xNiBjaGVjaykKK3sKKwlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSB8fCAoemVyb19va2F5ICYmICFjaGVjaykpIHsKKwkJc2tiLT5jc3VtX3ZhbGlkID0gMTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBGb3Igc21hbGwgcGFja2V0cyA8PSBDSEVDS1NVTV9CUkVBSyBwZWZvcm0gY2hlY2tzdW0gY29tcGxldGUgZGlyZWN0bHkKKyAqIGluIGNoZWNrc3VtX2luaXQuCisgKi8KKyNkZWZpbmUgQ0hFQ0tTVU1fQlJFQUsgNzYKKworLyogVmFsaWRhdGUgKGluaXQpIGNoZWNrc3VtIGJhc2VkIG9uIGNoZWNrc3VtIGNvbXBsZXRlLgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDA6IGNoZWNrc3VtIGlzIHZhbGlkYXRlZCBvciB0cnkgdG8gaW4gc2tiX2NoZWNrc3VtX2NvbXBsZXRlLiBJbiB0aGUgbGF0dGVyCisgKgljYXNlIHRoZSBpcF9zdW1tZWQgd2lsbCBub3QgYmUgQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgYW5kIHRoZSBwc2V1ZG8KKyAqCWNoZWNrc3VtIGlzIHN0b3JlZCBpbiBza2ItPmNzdW0gZm9yIHVzZSBpbiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZQorICogICBub24temVybzogdmFsdWUgb2YgaW52YWxpZCBjaGVja3N1bQorICoKKyAqLworc3RhdGljIGlubGluZSBfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX3ZhbGlkYXRlX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgICAgICAgYm9vbCBjb21wbGV0ZSwKKwkJCQkJCSAgICAgICBfX3dzdW0gcHN1bSkKK3sKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKKwkJaWYgKCFjc3VtX2ZvbGQoY3N1bV9hZGQocHN1bSwgc2tiLT5jc3VtKSkpIHsKKwkJCXNrYi0+Y3N1bV92YWxpZCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXNrYi0+Y3N1bSA9IHBzdW07CisKKwlpZiAoY29tcGxldGUgfHwgc2tiLT5sZW4gPD0gQ0hFQ0tTVU1fQlJFQUspIHsKKwkJX19zdW0xNiBjc3VtOworCisJCWNzdW0gPSBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOworCQlza2ItPmNzdW1fdmFsaWQgPSAhY3N1bTsKKwkJcmV0dXJuIGNzdW07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX193c3VtIG51bGxfY29tcHV0ZV9wc2V1ZG8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByb3RvKQoreworCXJldHVybiAwOworfQorCisvKiBQZXJmb3JtIGNoZWNrc3VtIHZhbGlkYXRlIChpbml0KS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBtYWNybyBzaW5jZSB3ZSBvbmx5CisgKiB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgcHNldWRvIGhlYWRlciB3aGljaCBpcyBhbiBpbnB1dCBmdW5jdGlvbiBpZiBuZWNlc3NhcnkuCisgKiBGaXJzdCB3ZSB0cnkgdG8gdmFsaWRhdGUgd2l0aG91dCBhbnkgY29tcHV0YXRpb24gKGNoZWNrc3VtIHVubmVjZXNzYXJ5KSBhbmQKKyAqIHRoZW4gY2FsY3VsYXRlIGJhc2VkIG9uIGNoZWNrc3VtIGNvbXBsZXRlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHRvIGNvbXB1dGUKKyAqIHBzZXVkbyBoZWFkZXIuCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMDogY2hlY2tzdW0gaXMgdmFsaWRhdGVkIG9yIHRyeSB0byBpbiBza2JfY2hlY2tzdW1fY29tcGxldGUKKyAqICAgbm9uLXplcm86IHZhbHVlIG9mIGludmFsaWQgY2hlY2tzdW0KKyAqLworI2RlZmluZSBfX3NrYl9jaGVja3N1bV92YWxpZGF0ZShza2IsIHByb3RvLCBjb21wbGV0ZSwJCQlcCisJCQkJemVyb19va2F5LCBjaGVjaywgY29tcHV0ZV9wc2V1ZG8pCVwKKyh7CQkJCQkJCQkJXAorCV9fc3VtMTYgX19yZXQgPSAwOwkJCQkJCVwKKwlza2ItPmNzdW1fdmFsaWQgPSAwOwkJCQkJCVwKKwlpZiAoX19za2JfY2hlY2tzdW1fdmFsaWRhdGVfbmVlZGVkKHNrYiwgemVyb19va2F5LCBjaGVjaykpCVwKKwkJX19yZXQgPSBfX3NrYl9jaGVja3N1bV92YWxpZGF0ZV9jb21wbGV0ZShza2IsCQlcCisJCQkJY29tcGxldGUsIGNvbXB1dGVfcHNldWRvKHNrYiwgcHJvdG8pKTsJXAorCV9fcmV0OwkJCQkJCQkJXAorfSkKKworI2RlZmluZSBza2JfY2hlY2tzdW1faW5pdChza2IsIHByb3RvLCBjb21wdXRlX3BzZXVkbykJCQlcCisJX19za2JfY2hlY2tzdW1fdmFsaWRhdGUoc2tiLCBwcm90bywgZmFsc2UsIGZhbHNlLCAwLCBjb21wdXRlX3BzZXVkbykKKworI2RlZmluZSBza2JfY2hlY2tzdW1faW5pdF96ZXJvX2NoZWNrKHNrYiwgcHJvdG8sIGNoZWNrLCBjb21wdXRlX3BzZXVkbykJXAorCV9fc2tiX2NoZWNrc3VtX3ZhbGlkYXRlKHNrYiwgcHJvdG8sIGZhbHNlLCB0cnVlLCBjaGVjaywgY29tcHV0ZV9wc2V1ZG8pCisKKyNkZWZpbmUgc2tiX2NoZWNrc3VtX3ZhbGlkYXRlKHNrYiwgcHJvdG8sIGNvbXB1dGVfcHNldWRvKQkJXAorCV9fc2tiX2NoZWNrc3VtX3ZhbGlkYXRlKHNrYiwgcHJvdG8sIHRydWUsIGZhbHNlLCAwLCBjb21wdXRlX3BzZXVkbykKKworI2RlZmluZSBza2JfY2hlY2tzdW1fdmFsaWRhdGVfemVyb19jaGVjayhza2IsIHByb3RvLCBjaGVjaywJCVwKKwkJCQkJIGNvbXB1dGVfcHNldWRvKQkJXAorCV9fc2tiX2NoZWNrc3VtX3ZhbGlkYXRlXyhza2IsIHByb3RvLCB0cnVlLCB0cnVlLCBjaGVjaywgY29tcHV0ZV9wc2V1ZG8pCisKKyNkZWZpbmUgc2tiX2NoZWNrc3VtX3NpbXBsZV92YWxpZGF0ZShza2IpCQkJCVwKKwlfX3NrYl9jaGVja3N1bV92YWxpZGF0ZShza2IsIDAsIHRydWUsIGZhbHNlLCAwLCBudWxsX2NvbXB1dGVfcHNldWRvKQorCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogdm9pZCBuZl9jb25udHJhY2tfZGVzdHJveShzdHJ1Y3QgbmZfY29ubnRyYWNrICpuZmN0KTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfcHV0KHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCkBAIC0yODk1LDYgKzMwMTMsNyBAQAogc3RydWN0IHNrYl9nc29fY2IgewogCWludAltYWNfb2Zmc2V0OwogCWludAllbmNhcF9sZXZlbDsKKwlfX3UxNgljc3VtX3N0YXJ0OwogfTsKICNkZWZpbmUgU0tCX0dTT19DQihza2IpICgoc3RydWN0IHNrYl9nc29fY2IgKikoc2tiKS0+Y2IpCiAKQEAgLTI5MTksNiArMzAzOCwyOCBAQAogCXJldHVybiAwOwogfQogCisvKiBDb21wdXRlIHRoZSBjaGVja3N1bSBmb3IgYSBnc28gc2VnbWVudC4gRmlyc3QgY29tcHV0ZSB0aGUgY2hlY2tzdW0gdmFsdWUKKyAqIGZyb20gdGhlIHN0YXJ0IG9mIHRyYW5zcG9ydCBoZWFkZXIgdG8gU0tCX0dTT19DQihza2IpLT5jc3VtX3N0YXJ0LCBhbmQKKyAqIHRoZW4gYWRkIGluIHNrYi0+Y3N1bSAoY2hlY2tzdW0gZnJvbSBjc3VtX3N0YXJ0IHRvIGVuZCBvZiBwYWNrZXQpLgorICogc2tiLT5jc3VtIGFuZCBjc3VtX3N0YXJ0IGFyZSB0aGVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hlY2tzdW0gb2YgdGhlCisgKiByZXN1bHRhbnQgcGFja2V0IHN0YXJ0aW5nIGZyb20gdGhlIHRyYW5zcG9ydCBoZWFkZXItLSB0aGUgcmVzdWx0YW50IGNoZWNrc3VtCisgKiBpcyBpbiB0aGUgcmVzIGFyZ3VtZW50IChpLmUuIG5vcm1hbGx5IHplcm8gb3IgfiBvZiBjaGVja3N1bSBvZiBhIHBzZXVkbworICogaGVhZGVyLgorICovCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgZ3NvX21ha2VfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgX193c3VtIHJlcykKK3sKKwlpbnQgcGxlbiA9IFNLQl9HU09fQ0Ioc2tiKS0+Y3N1bV9zdGFydCAtIHNrYl9oZWFkcm9vbShza2IpIC0KKwkgICAgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwlfX3UxNiBjc3VtOworCisJY3N1bSA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkgICAgICBwbGVuLCBza2ItPmNzdW0pKTsKKwlza2ItPmNzdW0gPSByZXM7CisJU0tCX0dTT19DQihza2IpLT5jc3VtX3N0YXJ0IC09IHBsZW47CisKKwlyZXR1cm4gY3N1bTsKK30KKwogc3RhdGljIGlubGluZSBib29sIHNrYl9pc19nc28oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2F0ODZyZjIzMC5oIGIvaW5jbHVkZS9saW51eC9zcGkvYXQ4NnJmMjMwLmgKaW5kZXggYWEzMjdhOC4uYjJiMWFmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvYXQ4NnJmMjMwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvYXQ4NnJmMjMwLmgKQEAgLTI2LDIwICsyNiw2IEBACiAJaW50IHJzdG47CiAJaW50IHNscF90cjsKIAlpbnQgZGlnMjsKLQotCS8qIFNldHRpbmcgdGhlIGlycV90eXBlIHdpbGwgY29uZmlndXJlIHRoZSBkcml2ZXIgdG8gcmVxdWVzdAotCSAqIHRoZSBwbGF0Zm9ybSBpcnEgdHJpZ2dlciB0eXBlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdmFsdWUKLQkgKiBhbmQgY29uZmlndXJlIHRoZSBpbnRlcnJ1cHQgcG9sYXJpdHkgb2YgdGhlIGRldmljZSB0byB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIHBvbGFyaXR5LgotCSAqCi0JICogQWxsb3dlZCB2YWx1ZXMgYXJlOiBJUlFGX1RSSUdHRVJfUklTSU5HLCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkgKiAgICAgICAgICAgICAgICAgICAgIElSUUZfVFJJR0dFUl9ISUdIIGFuZCBJUlFGX1RSSUdHRVJfTE9XCi0JICoKLQkgKiBTZXR0aW5nIGl0IHRvIDAsIHRoZSBkcml2ZXIgZG9lcyBub3QgdG91Y2ggdGhlIHRyaWdnZXIgdHlwZQotCSAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGludGVycnVwdCBhbmQgc2V0cyB0aGUgaW50ZXJydXB0IHBvbGFyaXR5Ci0JICogb2YgdGhlIGRldmljZSB0byBoaWdoIGFjdGl2ZSAodGhlIGRlZmF1bHQgdmFsdWUpLgotCSAqLwotCWludCBpcnFfdHlwZTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGxpY2UuaCBiL2luY2x1ZGUvbGludXgvc3BsaWNlLmgKaW5kZXggMGU0MzkwNi4uZGEyNzUxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGxpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwbGljZS5oCkBAIC03MCwxNiArNzAsNiBAQAogCQkJCXNwbGljZV9hY3RvciAqKTsKIGV4dGVybiBzc2l6ZV90IF9fc3BsaWNlX2Zyb21fcGlwZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCiAJCQkJICBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKiwgc3BsaWNlX2FjdG9yICopOwotZXh0ZXJuIGludCBzcGxpY2VfZnJvbV9waXBlX2ZlZWQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKiwKLQkJCQkgc3BsaWNlX2FjdG9yICopOwotZXh0ZXJuIGludCBzcGxpY2VfZnJvbV9waXBlX25leHQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAotCQkJCSBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKik7Ci1leHRlcm4gdm9pZCBzcGxpY2VfZnJvbV9waXBlX2JlZ2luKHN0cnVjdCBzcGxpY2VfZGVzYyAqKTsKLWV4dGVybiB2b2lkIHNwbGljZV9mcm9tX3BpcGVfZW5kKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKLQkJCQkgc3RydWN0IHNwbGljZV9kZXNjICopOwotZXh0ZXJuIGludCBwaXBlX3RvX2ZpbGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKiwKLQkJCXN0cnVjdCBzcGxpY2VfZGVzYyAqKTsKLQogZXh0ZXJuIHNzaXplX3Qgc3BsaWNlX3RvX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAogCQkJICAgICAgc3RydWN0IHNwbGljZV9waXBlX2Rlc2MgKik7CiBleHRlcm4gc3NpemVfdCBzcGxpY2VfZGlyZWN0X3RvX2FjdG9yKHN0cnVjdCBmaWxlICosIHN0cnVjdCBzcGxpY2VfZGVzYyAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmggYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAppbmRleCAwN2VmOWI4Li40NTY4YTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaApAQCAtMzMsNiArMzMsNyBAQAogCXU4IGV0MXBoeWFkZHI7CQkvKiBNSUkgYWRkcmVzcyBmb3IgZW5ldDEgKi8KIAl1OCBldDBtZGNwb3J0OwkJLyogTURJTyBmb3IgZW5ldDAgKi8KIAl1OCBldDFtZGNwb3J0OwkJLyogTURJTyBmb3IgZW5ldDEgKi8KKwl1MTYgZGV2X2lkOwkJLyogRGV2aWNlIElEIG92ZXJyaWRpbmcgZS5nLiBQQ0kgSUQgKi8KIAl1MTYgYm9hcmRfcmV2OwkJLyogQm9hcmQgcmV2aXNpb24gbnVtYmVyIGZyb20gU1BST00uICovCiAJdTE2IGJvYXJkX251bTsJCS8qIEJvYXJkIG51bWJlciBmcm9tIFNQUk9NLiAqLwogCXUxNiBib2FyZF90eXBlOwkJLyogQm9hcmQgdHlwZSBmcm9tIFNQUk9NLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggMjM5OTQ2OC4uYTA1MTMyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xOTcsNyArMTk3LDggQEAKIAl1OAlkb19lYXJseV9yZXRyYW5zOjEsLyogRW5hYmxlIFJGQzU4MjcgZWFybHktcmV0cmFuc21pdCAgKi8KIAkJc3luX2RhdGE6MSwJLyogU1lOIGluY2x1ZGVzIGRhdGEgKi8KIAkJc3luX2Zhc3RvcGVuOjEsCS8qIFNZTiBpbmNsdWRlcyBGYXN0IE9wZW4gb3B0aW9uICovCi0JCXN5bl9kYXRhX2Fja2VkOjE7LyogZGF0YSBpbiBTWU4gaXMgYWNrZWQgYnkgU1lOLUFDSyAqLworCQlzeW5fZGF0YV9hY2tlZDoxLC8qIGRhdGEgaW4gU1lOIGlzIGFja2VkIGJ5IFNZTi1BQ0sgKi8KKwkJaXNfY3duZF9saW1pdGVkOjE7LyogZm9yd2FyZCBwcm9ncmVzcyBsaW1pdGVkIGJ5IHNuZF9jd25kPyAqLwogCXUzMgl0bHBfaGlnaF9zZXE7CS8qIHNuZF9ueHQgYXQgdGhlIHRpbWUgb2YgVExQIHJldHJhbnNtaXQuICovCiAKIC8qIFJUVCBtZWFzdXJlbWVudCAqLwpAQCAtMjA5LDYgKzIxMCw4IEBACiAKIAl1MzIJcGFja2V0c19vdXQ7CS8qIFBhY2tldHMgd2hpY2ggYXJlICJpbiBmbGlnaHQiCSovCiAJdTMyCXJldHJhbnNfb3V0OwkvKiBSZXRyYW5zbWl0dGVkIHBhY2tldHMgb3V0CQkqLworCXUzMgltYXhfcGFja2V0c19vdXQ7ICAvKiBtYXggcGFja2V0c19vdXQgaW4gbGFzdCB3aW5kb3cgKi8KKwl1MzIJbWF4X3BhY2tldHNfc2VxOyAgLyogcmlnaHQgZWRnZSBvZiBtYXhfcGFja2V0c19vdXQgZmxpZ2h0ICovCiAKIAl1MTYJdXJnX2RhdGE7CS8qIFNhdmVkIG9jdGV0IG9mIE9PQiBkYXRhIGFuZCBjb250cm9sIGZsYWdzICovCiAJdTgJZWNuX2ZsYWdzOwkvKiBFQ04gc3RhdHVzIGJpdHMuCQkJKi8KQEAgLTM2NSwxMSArMzY4LDYgQEAKIAkJdGNwX3NrKHNrKS0+ZmFzdG9wZW5fcnNrICE9IE5VTEwpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmFzdG9wZW5fY29va2llX3ByZXNlbnQoc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgKmZvYykKLXsKLQlyZXR1cm4gZm9jLT5sZW4gIT0gLTE7Ci19Ci0KIGV4dGVybiB2b2lkIHRjcF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzayk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZhc3RvcGVuX2luaXRfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBpbnQgYmFja2xvZykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWRwLmggYi9pbmNsdWRlL2xpbnV4L3VkcC5oCmluZGV4IDQyMjc4YmIuLjI0N2NmZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWRwLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZHAuaApAQCAtNDcsNyArNDcsOSBAQAogI2RlZmluZSB1ZHBfcG9ydGFkZHJfbm9kZQlpbmV0LnNrLl9fc2tfY29tbW9uLnNrY19wb3J0YWRkcl9ub2RlCiAJaW50CQkgcGVuZGluZzsJLyogQW55IHBlbmRpbmcgZnJhbWVzID8gKi8KIAl1bnNpZ25lZCBpbnQJIGNvcmtmbGFnOwkvKiBDb3JrIGlzIHJlcXVpcmVkICovCi0gIAlfX3UxNgkJIGVuY2FwX3R5cGU7CS8qIElzIHRoaXMgYW4gRW5jYXBzdWxhdGlvbiBzb2NrZXQ/ICovCisJX191OAkJIGVuY2FwX3R5cGU7CS8qIElzIHRoaXMgYW4gRW5jYXBzdWxhdGlvbiBzb2NrZXQ/ICovCisJdW5zaWduZWQgY2hhcgkgbm9fY2hlY2s2X3R4OjEsLyogU2VuZCB6ZXJvIFVEUDYgY2hlY2tzdW1zIG9uIFRYPyAqLworCQkJIG5vX2NoZWNrNl9yeDoxOy8qIEFsbG93IHplcm8gVURQNiBjaGVja3N1bXMgb24gUlg/ICovCiAJLyoKIAkgKiBGb2xsb3dpbmcgbWVtYmVyIHJldGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhIFVEUCBoZWFkZXIKIAkgKiB3aGVuIHRoZSBzb2NrZXQgaXMgdW5jb3JrZWQuCkBAIC03Niw2ICs3OCwyNiBAQAogCXJldHVybiAoc3RydWN0IHVkcF9zb2NrICopc2s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZHBfc2V0X25vX2NoZWNrNl90eChzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgdmFsKQoreworCXVkcF9zayhzayktPm5vX2NoZWNrNl90eCA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVkcF9zZXRfbm9fY2hlY2s2X3J4KHN0cnVjdCBzb2NrICpzaywgYm9vbCB2YWwpCit7CisJdWRwX3NrKHNrKS0+bm9fY2hlY2s2X3J4ID0gdmFsOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdWRwX2dldF9ub19jaGVjazZfdHgoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiB1ZHBfc2soc2spLT5ub19jaGVjazZfdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB1ZHBfZ2V0X25vX2NoZWNrNl9yeChzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHVkcF9zayhzayktPm5vX2NoZWNrNl9yeDsKK30KKwogI2RlZmluZSB1ZHBfcG9ydGFkZHJfZm9yX2VhY2hfZW50cnkoX19zaywgbm9kZSwgbGlzdCkgXAogCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KF9fc2ssIG5vZGUsIGxpc3QsIF9fc2tfY29tbW9uLnNrY19wb3J0YWRkcl9ub2RlKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvaW5jbHVkZS9saW51eC91aW8uaAppbmRleCAxOTliY2MzLi5lMjIzMWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvLmgKQEAgLTE5LDExICsxOSwyMSBAQAogCXNpemVfdCBpb3ZfbGVuOwogfTsKIAorZW51bSB7CisJSVRFUl9JT1ZFQyA9IDAsCisJSVRFUl9LVkVDID0gMiwKKwlJVEVSX0JWRUMgPSA0LAorfTsKKwogc3RydWN0IGlvdl9pdGVyIHsKLQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdjsKLQl1bnNpZ25lZCBsb25nIG5yX3NlZ3M7CisJaW50IHR5cGU7CiAJc2l6ZV90IGlvdl9vZmZzZXQ7CiAJc2l6ZV90IGNvdW50OworCXVuaW9uIHsKKwkJY29uc3Qgc3RydWN0IGlvdmVjICppb3Y7CisJCWNvbnN0IHN0cnVjdCBiaW9fdmVjICpidmVjOworCX07CisJdW5zaWduZWQgbG9uZyBucl9zZWdzOwogfTsKIAogLyoKQEAgLTUzLDYgKzYzLDcgQEAKIH0KIAogI2RlZmluZSBpb3ZfZm9yX2VhY2goaW92LCBpdGVyLCBzdGFydCkJCQkJXAorCWlmICghKChzdGFydCkudHlwZSAmIElURVJfQlZFQykpCQkJXAogCWZvciAoaXRlciA9IChzdGFydCk7CQkJCQlcCiAJICAgICAoaXRlcikuY291bnQgJiYJCQkJCVwKIAkgICAgICgoaW92ID0gaW92X2l0ZXJfaW92ZWMoJihpdGVyKSkpLCAxKTsJCVwKQEAgLTYyLDMyICs3Myw0NCBAQAogCiBzaXplX3QgaW92X2l0ZXJfY29weV9mcm9tX3VzZXJfYXRvbWljKHN0cnVjdCBwYWdlICpwYWdlLAogCQlzdHJ1Y3QgaW92X2l0ZXIgKmksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgYnl0ZXMpOwotc2l6ZV90IGlvdl9pdGVyX2NvcHlfZnJvbV91c2VyKHN0cnVjdCBwYWdlICpwYWdlLAotCQlzdHJ1Y3QgaW92X2l0ZXIgKmksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgYnl0ZXMpOwogdm9pZCBpb3ZfaXRlcl9hZHZhbmNlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IGJ5dGVzKTsKIGludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7CiBzaXplX3QgaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudChjb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwogc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCiAJCQkgc3RydWN0IGlvdl9pdGVyICppKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGlvdl9pdGVyX2luaXQoc3RydWN0IGlvdl9pdGVyICppLAotCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKLQkJCXNpemVfdCBjb3VudCwgc2l6ZV90IHdyaXR0ZW4pCi17Ci0JaS0+aW92ID0gaW92OwotCWktPm5yX3NlZ3MgPSBucl9zZWdzOwotCWktPmlvdl9vZmZzZXQgPSAwOwotCWktPmNvdW50ID0gY291bnQgKyB3cml0dGVuOwotCi0JaW92X2l0ZXJfYWR2YW5jZShpLCB3cml0dGVuKTsKLX0KK3NpemVfdCBjb3B5X3BhZ2VfZnJvbV9pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCisJCQkgc3RydWN0IGlvdl9pdGVyICppKTsKK3Vuc2lnbmVkIGxvbmcgaW92X2l0ZXJfYWxpZ25tZW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSk7Cit2b2lkIGlvdl9pdGVyX2luaXQoc3RydWN0IGlvdl9pdGVyICppLCBpbnQgZGlyZWN0aW9uLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCXVuc2lnbmVkIGxvbmcgbnJfc2Vncywgc2l6ZV90IGNvdW50KTsKK3NzaXplX3QgaW92X2l0ZXJfZ2V0X3BhZ2VzKHN0cnVjdCBpb3ZfaXRlciAqaSwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCXNpemVfdCBtYXhzaXplLCBzaXplX3QgKnN0YXJ0KTsKK3NzaXplX3QgaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKHN0cnVjdCBpb3ZfaXRlciAqaSwgc3RydWN0IHBhZ2UgKioqcGFnZXMsCisJCQlzaXplX3QgbWF4c2l6ZSwgc2l6ZV90ICpzdGFydCk7CitpbnQgaW92X2l0ZXJfbnBhZ2VzKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSwgaW50IG1heHBhZ2VzKTsKIAogc3RhdGljIGlubGluZSBzaXplX3QgaW92X2l0ZXJfY291bnQoc3RydWN0IGlvdl9pdGVyICppKQogewogCXJldHVybiBpLT5jb3VudDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGlvdl9pdGVyX3RydW5jYXRlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IGNvdW50KQoreworCWlmIChpLT5jb3VudCA+IGNvdW50KQorCQlpLT5jb3VudCA9IGNvdW50OworfQorCisvKgorICogcmVleHBhbmQgYSBwcmV2aW91c2x5IHRydW5jYXRlZCBpdGVyYXRvcjsgY291bnQgbXVzdCBiZSBubyBtb3JlIHRoYW4gaG93IG11Y2gKKyAqIHdlIGhhZCBzaHJ1bmsgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3ZfaXRlcl9yZWV4cGFuZChzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBjb3VudCkKK3sKKwlpLT5jb3VudCA9IGNvdW50OworfQorCiBpbnQgbWVtY3B5X2Zyb21pb3ZlYyh1bnNpZ25lZCBjaGFyICprZGF0YSwgc3RydWN0IGlvdmVjICppb3YsIGludCBsZW4pOwogaW50IG1lbWNweV90b2lvdmVjKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBjaGFyICprZGF0YSwgaW50IGxlbik7CiAKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vwcm9iZXMuaCBiL2luY2x1ZGUvbGludXgvdXByb2Jlcy5oCmluZGV4IGM1MmY4MjcuLjRmODQ0YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXByb2Jlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXByb2Jlcy5oCkBAIC0xMDMsNiArMTAzLDcgQEAKIGV4dGVybiBib29sIF9fd2VhayBpc19zd2JwX2luc24odXByb2JlX29wY29kZV90ICppbnNuKTsKIGV4dGVybiBib29sIF9fd2VhayBpc190cmFwX2luc24odXByb2JlX29wY29kZV90ICppbnNuKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fd2VhayB1cHJvYmVfZ2V0X3N3YnBfYWRkcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB1cHJvYmVfZ2V0X3RyYXBfYWRkcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gaW50IHVwcm9iZV93cml0ZV9vcGNvZGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVwcm9iZV9vcGNvZGVfdCk7CiBleHRlcm4gaW50IHVwcm9iZV9yZWdpc3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3QgdXByb2JlX2NvbnN1bWVyICp1Yyk7CiBleHRlcm4gaW50IHVwcm9iZV9hcHBseShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3QgdXByb2JlX2NvbnN1bWVyICp1YywgYm9vbCk7CkBAIC0xMzMsNiArMTM0LDkgQEAKICNlbHNlIC8qICFDT05GSUdfVVBST0JFUyAqLwogc3RydWN0IHVwcm9iZXNfc3RhdGUgewogfTsKKworI2RlZmluZSB1cHJvYmVfZ2V0X3RyYXBfYWRkcihyZWdzKQlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisKIHN0YXRpYyBpbmxpbmUgaW50CiB1cHJvYmVfcmVnaXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgc3RydWN0IHVwcm9iZV9jb25zdW1lciAqdWMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jZGNfbmNtLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGNfbmNtLmgKaW5kZXggNDRiMzhiOS4uN2M5YjQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2RjX25jbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NkY19uY20uaApAQCAtNTIsNiArNTIsMTAgQEAKICNkZWZpbmUJQ0RDX05DTV9OVEJfTUFYX1NJWkVfVFgJCQkzMjc2OAkvKiBieXRlcyAqLwogI2RlZmluZQlDRENfTkNNX05UQl9NQVhfU0laRV9SWAkJCTMyNzY4CS8qIGJ5dGVzICovCiAKKy8qIEluaXRpYWwgTlRCIGxlbmd0aCAqLworI2RlZmluZQlDRENfTkNNX05UQl9ERUZfU0laRV9UWAkJCTE2Mzg0CS8qIGJ5dGVzICovCisjZGVmaW5lCUNEQ19OQ01fTlRCX0RFRl9TSVpFX1JYCQkJMTYzODQJLyogYnl0ZXMgKi8KKwogLyogTWluaW11bSB2YWx1ZSBmb3IgTWF4RGF0YWdyYW1TaXplLCBjaC4gNi4yLjkgKi8KICNkZWZpbmUJQ0RDX05DTV9NSU5fREFUQUdSQU1fU0laRQkJMTUxNAkvKiBieXRlcyAqLwogCkBAIC03MiwxNiArNzYsOSBAQAogLyogUmVzdGFydCB0aGUgdGltZXIsIGlmIGFtb3VudCBvZiBkYXRhZ3JhbXMgaXMgbGVzcyB0aGFuIGdpdmVuIHZhbHVlICovCiAjZGVmaW5lCUNEQ19OQ01fUkVTVEFSVF9USU1FUl9EQVRBR1JBTV9DTlQJMwogI2RlZmluZQlDRENfTkNNX1RJTUVSX1BFTkRJTkdfQ05UCQkyCi0jZGVmaW5lIENEQ19OQ01fVElNRVJfSU5URVJWQUwJCQkoNDAwVUwgKiBOU0VDX1BFUl9VU0VDKQotCi0vKiBUaGUgZm9sbG93aW5nIG1hY3JvIGRlZmluZXMgdGhlIG1pbmltdW0gaGVhZGVyIHNwYWNlICovCi0jZGVmaW5lCUNEQ19OQ01fTUlOX0hEUl9TSVpFIFwKLQkoc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25jbV9udGgxNikgKyBzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX25kcDE2KSArIFwKLQkoQ0RDX05DTV9EUFRfREFUQUdSQU1TX01BWCArIDEpICogc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25jbV9kcGUxNikpCi0KLSNkZWZpbmUgQ0RDX05DTV9ORFBfU0laRSBcCi0JKHNpemVvZihzdHJ1Y3QgdXNiX2NkY19uY21fbmRwMTYpICsJCQkJXAotCSAgICAgIChDRENfTkNNX0RQVF9EQVRBR1JBTVNfTUFYICsgMSkgKiBzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX2RwZTE2KSkKKyNkZWZpbmUgQ0RDX05DTV9USU1FUl9JTlRFUlZBTF9VU0VDCQk0MDBVTAorI2RlZmluZSBDRENfTkNNX1RJTUVSX0lOVEVSVkFMX01JTgkJNVVMCisjZGVmaW5lIENEQ19OQ01fVElNRVJfSU5URVJWQUxfTUFYCQkoVTMyX01BWCAvIE5TRUNfUEVSX1VTRUMpCiAKICNkZWZpbmUgY2RjX25jbV9jb21tX2ludGZfaXNfbWJpbSh4KSAgKCh4KS0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gVVNCX0NEQ19TVUJDTEFTU19NQklNICYmIFwKIAkJCQkgICAgICAgKHgpLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfQ0RDX1BST1RPX05PTkUpCkBAIC0xMDcsNiArMTA0LDkgQEAKIAlzcGlubG9ja190IG10eDsKIAlhdG9taWNfdCBzdG9wOwogCisJdTMyIHRpbWVyX2ludGVydmFsOworCXUzMiBtYXhfbmRwX3NpemU7CisKIAl1MzIgdHhfdGltZXJfcGVuZGluZzsKIAl1MzIgdHhfY3Vycl9mcmFtZV9udW07CiAJdTMyIHJ4X21heDsKQEAgLTExOCwxMCArMTE4LDIxIEBACiAJdTE2IHR4X25kcF9tb2R1bHVzOwogCXUxNiB0eF9zZXE7CiAJdTE2IHJ4X3NlcTsKLQl1MTYgY29ubmVjdGVkOworCXUxNiBtaW5fdHhfcGt0OworCisJLyogc3RhdGlzdGljcyAqLworCXUzMiB0eF9jdXJyX2ZyYW1lX3BheWxvYWQ7CisJdTMyIHR4X3JlYXNvbl9udGJfZnVsbDsKKwl1MzIgdHhfcmVhc29uX25kcF9mdWxsOworCXUzMiB0eF9yZWFzb25fdGltZW91dDsKKwl1MzIgdHhfcmVhc29uX21heF9kYXRhZ3JhbTsKKwl1NjQgdHhfb3ZlcmhlYWQ7CisJdTY0IHR4X250YnM7CisJdTY0IHJ4X292ZXJoZWFkOworCXU2NCByeF9udGJzOwogfTsKIAotdTggY2RjX25jbV9zZWxlY3RfYWx0c2V0dGluZyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3U4IGNkY19uY21fc2VsZWN0X2FsdHNldHRpbmcoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogaW50IGNkY19uY21fYmluZF9jb21tb24oc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdTggZGF0YV9hbHRzZXR0aW5nKTsKIHZvaWQgY2RjX25jbV91bmJpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBzdHJ1Y3Qgc2tfYnVmZiAqY2RjX25jbV9maWxsX3R4X2ZyYW1lKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19sZTMyIHNpZ24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fc2NzaS5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fc2NzaS5oCmluZGV4IDQxOTViOTcuLmRlNDI5ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX3Njc2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19zY3NpLmgKQEAgLTM1LDExICszNSwyMyBAQAogCXU4IGx1bls4XTsJCS8qIExvZ2ljYWwgVW5pdCBOdW1iZXIgKi8KIAl1NjQgdGFnOwkJLyogQ29tbWFuZCBpZGVudGlmaWVyICovCiAJdTggdGFza19hdHRyOwkJLyogVGFzayBhdHRyaWJ1dGUgKi8KLQl1OCBwcmlvOworCXU4IHByaW87CQkvKiBTQU0gY29tbWFuZCBwcmlvcml0eSBmaWVsZCAqLwogCXU4IGNybjsKIAl1OCBjZGJbVklSVElPX1NDU0lfQ0RCX1NJWkVdOwogfSBfX3BhY2tlZDsKIAorLyogU0NTSSBjb21tYW5kIHJlcXVlc3QsIGZvbGxvd2VkIGJ5IHByb3RlY3Rpb24gaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB2aXJ0aW9fc2NzaV9jbWRfcmVxX3BpIHsKKwl1OCBsdW5bOF07CQkvKiBMb2dpY2FsIFVuaXQgTnVtYmVyICovCisJdTY0IHRhZzsJCS8qIENvbW1hbmQgaWRlbnRpZmllciAqLworCXU4IHRhc2tfYXR0cjsJCS8qIFRhc2sgYXR0cmlidXRlICovCisJdTggcHJpbzsJCS8qIFNBTSBjb21tYW5kIHByaW9yaXR5IGZpZWxkICovCisJdTggY3JuOworCXUzMiBwaV9ieXRlc291dDsJLyogRGF0YU9VVCBQSSBOdW1iZXIgb2YgYnl0ZXMgKi8KKwl1MzIgcGlfYnl0ZXNpbjsJCS8qIERhdGFJTiBQSSBOdW1iZXIgb2YgYnl0ZXMgKi8KKwl1OCBjZGJbVklSVElPX1NDU0lfQ0RCX1NJWkVdOworfSBfX3BhY2tlZDsKKwogLyogUmVzcG9uc2UsIGZvbGxvd2VkIGJ5IHNlbnNlIGRhdGEgYW5kIGRhdGEtaW4gKi8KIHN0cnVjdCB2aXJ0aW9fc2NzaV9jbWRfcmVzcCB7CiAJdTMyIHNlbnNlX2xlbjsJCS8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCkBAIC05Nyw2ICsxMDksNyBAQAogI2RlZmluZSBWSVJUSU9fU0NTSV9GX0lOT1VUICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFZJUlRJT19TQ1NJX0ZfSE9UUExVRyAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgVklSVElPX1NDU0lfRl9DSEFOR0UgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWSVJUSU9fU0NTSV9GX1QxMF9QSSAgICAgICAgICAgICAgICAgICAzCiAKIC8qIFJlc3BvbnNlIGNvZGVzICovCiAjZGVmaW5lIFZJUlRJT19TQ1NJX1NfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaAppbmRleCBiY2EyNWRjLi44ZmFiNmZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItY29yZS5oCkBAIC00MzIsNiArNDMyLDcgQEAKIHZvaWQgKnZiMl9wbGFuZV9jb29raWUoc3RydWN0IHZiMl9idWZmZXIgKnZiLCB1bnNpZ25lZCBpbnQgcGxhbmVfbm8pOwogCiB2b2lkIHZiMl9idWZmZXJfZG9uZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSBzdGF0ZSk7Cit2b2lkIHZiMl9kaXNjYXJkX2RvbmUoc3RydWN0IHZiMl9xdWV1ZSAqcSk7CiBpbnQgdmIyX3dhaXRfZm9yX2FsbF9idWZmZXJzKHN0cnVjdCB2YjJfcXVldWUgKnEpOwogCiBpbnQgdmIyX3F1ZXJ5YnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC82bG93cGFuLmggYi9pbmNsdWRlL25ldC82bG93cGFuLmgKaW5kZXggZjdkMzcyYi4uNzliNTMwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvNmxvd3Bhbi5oCisrKyBiL2luY2x1ZGUvbmV0LzZsb3dwYW4uaApAQCAtNTQsNiArNTQsNyBAQAogI2RlZmluZSBfXzZMT1dQQU5fSF9fCiAKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKICNkZWZpbmUgVUlQXzgwMjE1NF9TSE9SVEFERFJfTEVOCTIgIC8qIGNvbXByZXNzZWQgaXB2NiBhZGRyZXNzIGxlbmd0aCAqLwogI2RlZmluZSBVSVBfSVBIX0xFTgkJCTQwIC8qIGlwdjYgZml4ZWQgaGVhZGVyIHNpemUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmggYi9pbmNsdWRlL25ldC9hZGRyY29uZi5oCmluZGV4IDkzM2E5ZjIuLmY2Nzk4NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKKysrIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaApAQCAtMzA2LDExICszMDYsNiBAQAogCQkgICAgICBodG9ubCgweEZGMDAwMDAwKSB8IGFkZHItPnM2X2FkZHIzMlszXSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKLXsKLQlyZXR1cm4gKGFkZHItPnM2X2FkZHIzMlswXSAmIGh0b25sKDB4RkYwMDAwMDApKSA9PSBodG9ubCgweEZGMDAwMDAwKTsKLX0KLQogc3RhdGljIGlubGluZSBib29sIGlwdjZfYWRkcl9pc19sbF9hbGxfbm9kZXMoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQogewogI2lmIGRlZmluZWQoQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MpICYmIEJJVFNfUEVSX0xPTkcgPT0gNjQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FmX2llZWU4MDIxNTQuaCBiL2luY2x1ZGUvbmV0L2FmX2llZWU4MDIxNTQuaAppbmRleCBmNzlhZTJhLi4wODU5NDBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZl9pZWVlODAyMTU0LmgKKysrIGIvaW5jbHVkZS9uZXQvYWZfaWVlZTgwMjE1NC5oCkBAIC01Nyw2ICs1NywxNCBAQAogLyogZ2V0L3NldHNvY2tvcHQgKi8KICNkZWZpbmUgU09MX0lFRUU4MDIxNTQJMAogCi0jZGVmaW5lIFdQQU5fV0FOVEFDSwkwCisjZGVmaW5lIFdQQU5fV0FOVEFDSwkJMAorI2RlZmluZSBXUEFOX1NFQ1VSSVRZCQkxCisjZGVmaW5lIFdQQU5fU0VDVVJJVFlfTEVWRUwJMgorCisjZGVmaW5lIFdQQU5fU0VDVVJJVFlfREVGQVVMVAkwCisjZGVmaW5lIFdQQU5fU0VDVVJJVFlfT0ZGCTEKKyNkZWZpbmUgV1BBTl9TRUNVUklUWV9PTgkyCisKKyNkZWZpbmUgV1BBTl9TRUNVUklUWV9MRVZFTF9ERUZBVUxUCSgtMSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKaW5kZXggYmUxNTBjZi4uMTY1ODdkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaApAQCAtMzY3LDYgKzM2Nyw3IEBACiAjZGVmaW5lIEhDSV9FUlJPUl9SRU1PVEVfUE9XRVJfT0ZGCTB4MTUKICNkZWZpbmUgSENJX0VSUk9SX0xPQ0FMX0hPU1RfVEVSTQkweDE2CiAjZGVmaW5lIEhDSV9FUlJPUl9QQUlSSU5HX05PVF9BTExPV0VECTB4MTgKKyNkZWZpbmUgSENJX0VSUk9SX0FEVkVSVElTSU5HX1RJTUVPVVQJMHgzYwogCiAvKiBGbG93IGNvbnRyb2wgbW9kZXMgKi8KICNkZWZpbmUgSENJX0ZMT1dfQ1RMX01PREVfUEFDS0VUX0JBU0VECTB4MDAKQEAgLTEwNTMsNiArMTA1NCwxNyBAQAogCV9fbGUxNiAgIHdpbmRvdzsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgSENJX09QX1JFQURfVFhfUE9XRVIJCTB4MGMyZAorc3RydWN0IGhjaV9jcF9yZWFkX3R4X3Bvd2VyIHsKKwlfX2xlMTYgICBoYW5kbGU7CisJX191OCAgICAgdHlwZTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgaGNpX3JwX3JlYWRfdHhfcG93ZXIgeworCV9fdTggICAgIHN0YXR1czsKKwlfX2xlMTYgICBoYW5kbGU7CisJX19zOCAgICAgdHhfcG93ZXI7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9PUF9SRUFEX1BBR0VfU0NBTl9UWVBFCTB4MGM0Ngogc3RydWN0IGhjaV9ycF9yZWFkX3BhZ2Vfc2Nhbl90eXBlIHsKIAlfX3U4ICAgICBzdGF0dXM7CkBAIC0xMDYzLDYgKzEwNzUsMTYgQEAKIAkjZGVmaW5lIFBBR0VfU0NBTl9UWVBFX1NUQU5EQVJECQkweDAwCiAJI2RlZmluZSBQQUdFX1NDQU5fVFlQRV9JTlRFUkxBQ0VECTB4MDEKIAorI2RlZmluZSBIQ0lfT1BfUkVBRF9SU1NJCQkweDE0MDUKK3N0cnVjdCBoY2lfY3BfcmVhZF9yc3NpIHsKKwlfX2xlMTYgICBoYW5kbGU7Cit9IF9fcGFja2VkOworc3RydWN0IGhjaV9ycF9yZWFkX3Jzc2kgeworCV9fdTggICAgIHN0YXR1czsKKwlfX2xlMTYgICBoYW5kbGU7CisJX19zOCAgICAgcnNzaTsKK30gX19wYWNrZWQ7CisKICNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfQU1QX0lORk8JMHgxNDA5CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfYW1wX2luZm8gewogCV9fdTggICAgIHN0YXR1czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKaW5kZXggNWY4YmMwNS4uYjM4NmJmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKQEAgLTY4LDYgKzY4LDExIEBACiAJc3RydWN0IGxpc3RfaGVhZAl1bmtub3duOwkvKiBOYW1lIHN0YXRlIG5vdCBrbm93biAqLwogCXN0cnVjdCBsaXN0X2hlYWQJcmVzb2x2ZTsJLyogTmFtZSBuZWVkcyB0byBiZSByZXNvbHZlZCAqLwogCV9fdTMyCQkJdGltZXN0YW1wOworCWJkYWRkcl90CQlsYXN0X2Fkdl9hZGRyOworCXU4CQkJbGFzdF9hZHZfYWRkcl90eXBlOworCXM4CQkJbGFzdF9hZHZfcnNzaTsKKwl1OAkJCWxhc3RfYWR2X2RhdGFbSENJX01BWF9BRF9MRU5HVEhdOworCXU4CQkJbGFzdF9hZHZfZGF0YV9sZW47CiB9OwogCiBzdHJ1Y3QgaGNpX2Nvbm5faGFzaCB7CkBAIC0xNDAsNiArMTQ1LDEwIEBACiAvKiBEZWZhdWx0IExFIFJQQSBleHBpcnkgdGltZSwgMTUgbWludXRlcyAqLwogI2RlZmluZSBIQ0lfREVGQVVMVF9SUEFfVElNRU9VVAkJKDE1ICogNjApCiAKKy8qIERlZmF1bHQgbWluL21heCBhZ2Ugb2YgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiAoMXMvM3MpICovCisjZGVmaW5lIERFRkFVTFRfQ09OTl9JTkZPX01JTl9BR0UJMTAwMAorI2RlZmluZSBERUZBVUxUX0NPTk5fSU5GT19NQVhfQUdFCTMwMDAKKwogc3RydWN0IGFtcF9hc3NvYyB7CiAJX191MTYJbGVuOwogCV9fdTE2CW9mZnNldDsKQEAgLTE5NCw2ICsyMDMsOSBAQAogCV9fdTE2CQlsZV9zY2FuX3dpbmRvdzsKIAlfX3UxNgkJbGVfY29ubl9taW5faW50ZXJ2YWw7CiAJX191MTYJCWxlX2Nvbm5fbWF4X2ludGVydmFsOworCV9fdTE2CQlkaXNjb3ZfaW50ZXJsZWF2ZWRfdGltZW91dDsKKwlfX3UxNgkJY29ubl9pbmZvX21pbl9hZ2U7CisJX191MTYJCWNvbm5faW5mb19tYXhfYWdlOwogCV9fdTgJCXNzcF9kZWJ1Z19tb2RlOwogCiAJX191MTYJCWRldmlkX3NvdXJjZTsKQEAgLTM2OCw4ICszODAsMTMgQEAKIAlfX3UxNgkJc2V0dGluZzsKIAlfX3UxNgkJbGVfY29ubl9taW5faW50ZXJ2YWw7CiAJX191MTYJCWxlX2Nvbm5fbWF4X2ludGVydmFsOworCV9fczgJCXJzc2k7CisJX19zOAkJdHhfcG93ZXI7CisJX19zOAkJbWF4X3R4X3Bvd2VyOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKKwl1bnNpZ25lZCBsb25nCWNvbm5faW5mb190aW1lc3RhbXA7CisKIAlfX3U4CQlyZW1vdGVfY2FwOwogCV9fdTgJCXJlbW90ZV9hdXRoOwogCV9fdTgJCXJlbW90ZV9pZDsKQEAgLTEyMDQsOCArMTIyMSw4IEBACiAgKi8KICNkZWZpbmUgRElTQ09WX0xFX1NDQU5fV0lOCQkweDEyCiAjZGVmaW5lIERJU0NPVl9MRV9TQ0FOX0lOVAkJMHgxMgotI2RlZmluZSBESVNDT1ZfTEVfVElNRU9VVAkJbXNlY3NfdG9famlmZmllcygxMDI0MCkKLSNkZWZpbmUgRElTQ09WX0lOVEVSTEVBVkVEX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcyg1MTIwKQorI2RlZmluZSBESVNDT1ZfTEVfVElNRU9VVAkJMTAyNDAJLyogbXNlYyAqLworI2RlZmluZSBESVNDT1ZfSU5URVJMRUFWRURfVElNRU9VVAk1MTIwCS8qIG1zZWMgKi8KICNkZWZpbmUgRElTQ09WX0lOVEVSTEVBVkVEX0lOUVVJUllfTEVOCTB4MDQKICNkZWZpbmUgRElTQ09WX0JSRURSX0lOUVVJUllfTEVOCTB4MDgKIApAQCAtMTI2NSw3ICsxMjgyLDggQEAKIAkJCQkgICAgICAgdTggKnJhbmRvbWl6ZXIyNTYsIHU4IHN0YXR1cyk7CiB2b2lkIG1nbXRfZGV2aWNlX2ZvdW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCiAJCSAgICAgICB1OCBhZGRyX3R5cGUsIHU4ICpkZXZfY2xhc3MsIHM4IHJzc2ksIHU4IGNmbV9uYW1lLAotCQkgICAgICAgdTggc3NwLCB1OCAqZWlyLCB1MTYgZWlyX2xlbik7CisJCSAgICAgICB1OCBzc3AsIHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCAqc2Nhbl9yc3AsCisJCSAgICAgICB1OCBzY2FuX3JzcF9sZW4pOwogdm9pZCBtZ210X3JlbW90ZV9uYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCiAJCSAgICAgIHU4IGFkZHJfdHlwZSwgczggcnNzaSwgdTggKm5hbWUsIHU4IG5hbWVfbGVuKTsKIHZvaWQgbWdtdF9kaXNjb3ZlcmluZyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggZGlzY292ZXJpbmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKaW5kZXggZDRiNTcxYy4uYmNmZmM5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCkBAIC0xODEsNiArMTgxLDkgQEAKIH0gX19wYWNrZWQ7CiAjZGVmaW5lIE1HTVRfTE9BRF9MSU5LX0tFWVNfU0laRQkzCiAKKyNkZWZpbmUgTUdNVF9MVEtfVU5BVVRIRU5USUNBVEVECTB4MDAKKyNkZWZpbmUgTUdNVF9MVEtfQVVUSEVOVElDQVRFRAkJMHgwMQorCiBzdHJ1Y3QgbWdtdF9sdGtfaW5mbyB7CiAJc3RydWN0IG1nbXRfYWRkcl9pbmZvIGFkZHI7CiAJX191OAl0eXBlOwpAQCAtNDA5LDYgKzQxMiwxOCBAQAogfSBfX3BhY2tlZDsKICNkZWZpbmUgTUdNVF9MT0FEX0lSS1NfU0laRQkJMgogCisjZGVmaW5lIE1HTVRfT1BfR0VUX0NPTk5fSU5GTwkJMHgwMDMxCitzdHJ1Y3QgbWdtdF9jcF9nZXRfY29ubl9pbmZvIHsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gYWRkcjsKK30gX19wYWNrZWQ7CisjZGVmaW5lIE1HTVRfR0VUX0NPTk5fSU5GT19TSVpFCQlNR01UX0FERFJfSU5GT19TSVpFCitzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubl9pbmZvIHsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gYWRkcjsKKwlfX3M4CXJzc2k7CisJX19zOAl0eF9wb3dlcjsKKwlfX3M4CW1heF90eF9wb3dlcjsKK30gX19wYWNrZWQ7CisKICNkZWZpbmUgTUdNVF9FVl9DTURfQ09NUExFVEUJCTB4MDAwMQogc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlIHsKIAlfX2xlMTYJb3Bjb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oCmluZGV4IDI2MTFjYzMuLjU3OGI4MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmgKQEAgLTE3Myw3ICsxNzMsNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgICB0eF9xdWV1ZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgdGltZXI7CiAKLQlzcGlubG9ja190ICAgIGxvY2s7CisJc3RydWN0IG11dGV4ICBsb2NrOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlhdG9taWNfdCAgICAgIHJlZmNudDsKQEAgLTI0NCw4ICsyNDQsOCBAQAogdm9pZCByZmNvbW1fZGxjX2FjY2VwdChzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CiBzdHJ1Y3QgcmZjb21tX2RsYyAqcmZjb21tX2RsY19leGlzdHMoYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCwgdTggY2hhbm5lbCk7CiAKLSNkZWZpbmUgcmZjb21tX2RsY19sb2NrKGQpICAgICBzcGluX2xvY2soJmQtPmxvY2spCi0jZGVmaW5lIHJmY29tbV9kbGNfdW5sb2NrKGQpICAgc3Bpbl91bmxvY2soJmQtPmxvY2spCisjZGVmaW5lIHJmY29tbV9kbGNfbG9jayhkKSAgICAgbXV0ZXhfbG9jaygmZC0+bG9jaykKKyNkZWZpbmUgcmZjb21tX2RsY191bmxvY2soZCkgICBtdXRleF91bmxvY2soJmQtPmxvY2spCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fZGxjX2hvbGQoc3RydWN0IHJmY29tbV9kbGMgKmQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCBmODU2ZTVhLi5lNDZjNDM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTEwOSw2ICsxMDksMTMgQEAKICAqCWNoYW5uZWwgYXMgdGhlIGNvbnRyb2wgb3IgYW55IG9mIHRoZSBzZWNvbmRhcnkgY2hhbm5lbHMuCiAgKglUaGlzIG1heSBiZSBkdWUgdG8gdGhlIGRyaXZlciBvciBkdWUgdG8gcmVndWxhdG9yeSBiYW5kd2lkdGgKICAqCXJlc3RyaWN0aW9ucy4KKyAqIEBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWTogc2VlICVOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lORE9PUl9PTkxZCisgKiBASUVFRTgwMjExX0NIQU5fR09fQ09OQ1VSUkVOVDogc2VlICVOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0dPX0NPTkNVUlJFTlQKKyAqIEBJRUVFODAyMTFfQ0hBTl9OT18yME1IWjogMjAgTUh6IGJhbmR3aWR0aCBpcyBub3QgcGVybWl0dGVkCisgKglvbiB0aGlzIGNoYW5uZWwuCisgKiBASUVFRTgwMjExX0NIQU5fTk9fMTBNSFo6IDEwIE1IeiBiYW5kd2lkdGggaXMgbm90IHBlcm1pdHRlZAorICoJb24gdGhpcyBjaGFubmVsLgorICoKICAqLwogZW51bSBpZWVlODAyMTFfY2hhbm5lbF9mbGFncyB7CiAJSUVFRTgwMjExX0NIQU5fRElTQUJMRUQJCT0gMTw8MCwKQEAgLTEyMCw2ICsxMjcsMTAgQEAKIAlJRUVFODAyMTFfQ0hBTl9OT19PRkRNCQk9IDE8PDYsCiAJSUVFRTgwMjExX0NIQU5fTk9fODBNSFoJCT0gMTw8NywKIAlJRUVFODAyMTFfQ0hBTl9OT18xNjBNSFoJPSAxPDw4LAorCUlFRUU4MDIxMV9DSEFOX0lORE9PUl9PTkxZCT0gMTw8OSwKKwlJRUVFODAyMTFfQ0hBTl9HT19DT05DVVJSRU5UCT0gMTw8MTAsCisJSUVFRTgwMjExX0NIQU5fTk9fMjBNSFoJCT0gMTw8MTEsCisJSUVFRTgwMjExX0NIQU5fTk9fMTBNSFoJCT0gMTw8MTIsCiB9OwogCiAjZGVmaW5lIElFRUU4MDIxMV9DSEFOX05PX0hUNDAgXApAQCAtMzMwLDggKzM0MSw4IEBACiAgKiBAc2VxX2xlbjogbGVuZ3RoIG9mIEBzZXEuCiAgKi8KIHN0cnVjdCBrZXlfcGFyYW1zIHsKLQl1OCAqa2V5OwotCXU4ICpzZXE7CisJY29uc3QgdTggKmtleTsKKwljb25zdCB1OCAqc2VxOwogCWludCBrZXlfbGVuOwogCWludCBzZXFfbGVuOwogCXUzMiBjaXBoZXI7CkBAIC00NDEsMTAgKzQ1MiwxMyBAQAogICogY2ZnODAyMTFfY2hhbmRlZl9kZnNfcmVxdWlyZWQgLSBjaGVja3MgaWYgcmFkYXIgZGV0ZWN0aW9uIGlzIHJlcXVpcmVkCiAgKiBAd2lwaHk6IHRoZSB3aXBoeSB0byB2YWxpZGF0ZSBhZ2FpbnN0CiAgKiBAY2hhbmRlZjogdGhlIGNoYW5uZWwgZGVmaW5pdGlvbiB0byBjaGVjawotICogUmV0dXJuOiAxIGlmIHJhZGFyIGRldGVjdGlvbiBpcyByZXF1aXJlZCwgMCBpZiBpdCBpcyBub3QsIDwgMCBvbiBlcnJvcgorICogQGlmdHlwZTogdGhlIGludGVyZmFjZSB0eXBlIGFzIHNwZWNpZmllZCBpbiAmZW51bSBubDgwMjExX2lmdHlwZQorICogUmV0dXJuczoKKyAqCTEgaWYgcmFkYXIgZGV0ZWN0aW9uIGlzIHJlcXVpcmVkLCAwIGlmIGl0IGlzIG5vdCwgPCAwIG9uIGVycm9yCiAgKi8KIGludCBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKTsKKwkJCQkgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkgIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlKTsKIAogLyoqCiAgKiBpZWVlODAyMTFfY2hhbmRlZl9yYXRlX2ZsYWdzIC0gcmV0dXJucyByYXRlIGZsYWdzIGZvciBhIGNoYW5uZWwKQEAgLTY1NCw3ICs2NjgsNiBAQAogICogQHAycF9vcHBfcHM6IFAyUCBvcHBvcnR1bmlzdGljIFBTCiAgKiBAYWNsOiBBQ0wgY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSBkcml2ZXJzIHdoaWNoIGhhcyBzdXBwb3J0IGZvcgogICoJTUFDIGFkZHJlc3MgYmFzZWQgYWNjZXNzIGNvbnRyb2wKLSAqIEByYWRhcl9yZXF1aXJlZDogc2V0IGlmIHJhZGFyIGRldGVjdGlvbiBpcyByZXF1aXJlZAogICovCiBzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgewogCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmOwpAQCAtNjcyLDcgKzY4NSw2IEBACiAJdTggcDJwX2N0d2luZG93OwogCWJvb2wgcDJwX29wcF9wczsKIAljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYWNsX2RhdGEgKmFjbDsKLQlib29sIHJhZGFyX3JlcXVpcmVkOwogfTsKIAogLyoqCkBAIC02ODIsOCArNjk0LDEwIEBACiAgKgogICogQGNoYW5kZWY6IGRlZmluZXMgdGhlIGNoYW5uZWwgdG8gdXNlIGFmdGVyIHRoZSBzd2l0Y2gKICAqIEBiZWFjb25fY3NhOiBiZWFjb24gZGF0YSB3aGlsZSBwZXJmb3JtaW5nIHRoZSBzd2l0Y2gKLSAqIEBjb3VudGVyX29mZnNldF9iZWFjb246IG9mZnNldCBmb3IgdGhlIGNvdW50ZXIgd2l0aGluIHRoZSBiZWFjb24gKHRhaWwpCi0gKiBAY291bnRlcl9vZmZzZXRfcHJlc3A6IG9mZnNldCBmb3IgdGhlIGNvdW50ZXIgd2l0aGluIHRoZSBwcm9iZSByZXNwb25zZQorICogQGNvdW50ZXJfb2Zmc2V0c19iZWFjb246IG9mZnNldHMgb2YgdGhlIGNvdW50ZXJzIHdpdGhpbiB0aGUgYmVhY29uICh0YWlsKQorICogQGNvdW50ZXJfb2Zmc2V0c19wcmVzcDogb2Zmc2V0cyBvZiB0aGUgY291bnRlcnMgd2l0aGluIHRoZSBwcm9iZSByZXNwb25zZQorICogQG5fY291bnRlcl9vZmZzZXRzX2JlYWNvbjogbnVtYmVyIG9mIGNzYSBjb3VudGVycyB0aGUgYmVhY29uICh0YWlsKQorICogQG5fY291bnRlcl9vZmZzZXRzX3ByZXNwOiBudW1iZXIgb2YgY3NhIGNvdW50ZXJzIGluIHRoZSBwcm9iZSByZXNwb25zZQogICogQGJlYWNvbl9hZnRlcjogYmVhY29uIGRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgbmV3IGNoYW5uZWwKICAqIEByYWRhcl9yZXF1aXJlZDogd2hldGhlciByYWRhciBkZXRlY3Rpb24gaXMgcmVxdWlyZWQgb24gdGhlIG5ldyBjaGFubmVsCiAgKiBAYmxvY2tfdHg6IHdoZXRoZXIgdHJhbnNtaXNzaW9ucyBzaG91bGQgYmUgYmxvY2tlZCB3aGlsZSBjaGFuZ2luZwpAQCAtNjkyLDcgKzcwNiwxMCBAQAogc3RydWN0IGNmZzgwMjExX2NzYV9zZXR0aW5ncyB7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAJc3RydWN0IGNmZzgwMjExX2JlYWNvbl9kYXRhIGJlYWNvbl9jc2E7Ci0JdTE2IGNvdW50ZXJfb2Zmc2V0X2JlYWNvbiwgY291bnRlcl9vZmZzZXRfcHJlc3A7CisJY29uc3QgdTE2ICpjb3VudGVyX29mZnNldHNfYmVhY29uOworCWNvbnN0IHUxNiAqY291bnRlcl9vZmZzZXRzX3ByZXNwOworCXVuc2lnbmVkIGludCBuX2NvdW50ZXJfb2Zmc2V0c19iZWFjb247CisJdW5zaWduZWQgaW50IG5fY291bnRlcl9vZmZzZXRzX3ByZXNwOwogCXN0cnVjdCBjZmc4MDIxMV9iZWFjb25fZGF0YSBiZWFjb25fYWZ0ZXI7CiAJYm9vbCByYWRhcl9yZXF1aXJlZDsKIAlib29sIGJsb2NrX3R4OwpAQCAtODU2LDM2ICs4NzMsMzggQEAKICAqIEBTVEFUSU9OX0lORk9fTk9OUEVFUl9QTTogQG5vbnBlZXJfcG0gZmlsbGVkCiAgKiBAU1RBVElPTl9JTkZPX0NIQUlOX1NJR05BTDogQGNoYWluX3NpZ25hbCBmaWxsZWQKICAqIEBTVEFUSU9OX0lORk9fQ0hBSU5fU0lHTkFMX0FWRzogQGNoYWluX3NpZ25hbF9hdmcgZmlsbGVkCisgKiBAU1RBVElPTl9JTkZPX0VYUEVDVEVEX1RIUk9VR0hQVVQ6IEBleHBlY3RlZF90aHJvdWdocHV0IGZpbGxlZAogICovCiBlbnVtIHN0YXRpb25faW5mb19mbGFncyB7Ci0JU1RBVElPTl9JTkZPX0lOQUNUSVZFX1RJTUUJPSAxPDwwLAotCVNUQVRJT05fSU5GT19SWF9CWVRFUwkJPSAxPDwxLAotCVNUQVRJT05fSU5GT19UWF9CWVRFUwkJPSAxPDwyLAotCVNUQVRJT05fSU5GT19MTElECQk9IDE8PDMsCi0JU1RBVElPTl9JTkZPX1BMSUQJCT0gMTw8NCwKLQlTVEFUSU9OX0lORk9fUExJTktfU1RBVEUJPSAxPDw1LAotCVNUQVRJT05fSU5GT19TSUdOQUwJCT0gMTw8NiwKLQlTVEFUSU9OX0lORk9fVFhfQklUUkFURQkJPSAxPDw3LAotCVNUQVRJT05fSU5GT19SWF9QQUNLRVRTCQk9IDE8PDgsCi0JU1RBVElPTl9JTkZPX1RYX1BBQ0tFVFMJCT0gMTw8OSwKLQlTVEFUSU9OX0lORk9fVFhfUkVUUklFUwkJPSAxPDwxMCwKLQlTVEFUSU9OX0lORk9fVFhfRkFJTEVECQk9IDE8PDExLAotCVNUQVRJT05fSU5GT19SWF9EUk9QX01JU0MJPSAxPDwxMiwKLQlTVEFUSU9OX0lORk9fU0lHTkFMX0FWRwkJPSAxPDwxMywKLQlTVEFUSU9OX0lORk9fUlhfQklUUkFURQkJPSAxPDwxNCwKLQlTVEFUSU9OX0lORk9fQlNTX1BBUkFNICAgICAgICAgID0gMTw8MTUsCi0JU1RBVElPTl9JTkZPX0NPTk5FQ1RFRF9USU1FCT0gMTw8MTYsCi0JU1RBVElPTl9JTkZPX0FTU09DX1JFUV9JRVMJPSAxPDwxNywKLQlTVEFUSU9OX0lORk9fU1RBX0ZMQUdTCQk9IDE8PDE4LAotCVNUQVRJT05fSU5GT19CRUFDT05fTE9TU19DT1VOVAk9IDE8PDE5LAotCVNUQVRJT05fSU5GT19UX09GRlNFVAkJPSAxPDwyMCwKLQlTVEFUSU9OX0lORk9fTE9DQUxfUE0JCT0gMTw8MjEsCi0JU1RBVElPTl9JTkZPX1BFRVJfUE0JCT0gMTw8MjIsCi0JU1RBVElPTl9JTkZPX05PTlBFRVJfUE0JCT0gMTw8MjMsCi0JU1RBVElPTl9JTkZPX1JYX0JZVEVTNjQJCT0gMTw8MjQsCi0JU1RBVElPTl9JTkZPX1RYX0JZVEVTNjQJCT0gMTw8MjUsCi0JU1RBVElPTl9JTkZPX0NIQUlOX1NJR05BTAk9IDE8PDI2LAotCVNUQVRJT05fSU5GT19DSEFJTl9TSUdOQUxfQVZHCT0gMTw8MjcsCisJU1RBVElPTl9JTkZPX0lOQUNUSVZFX1RJTUUJCT0gQklUKDApLAorCVNUQVRJT05fSU5GT19SWF9CWVRFUwkJCT0gQklUKDEpLAorCVNUQVRJT05fSU5GT19UWF9CWVRFUwkJCT0gQklUKDIpLAorCVNUQVRJT05fSU5GT19MTElECQkJPSBCSVQoMyksCisJU1RBVElPTl9JTkZPX1BMSUQJCQk9IEJJVCg0KSwKKwlTVEFUSU9OX0lORk9fUExJTktfU1RBVEUJCT0gQklUKDUpLAorCVNUQVRJT05fSU5GT19TSUdOQUwJCQk9IEJJVCg2KSwKKwlTVEFUSU9OX0lORk9fVFhfQklUUkFURQkJCT0gQklUKDcpLAorCVNUQVRJT05fSU5GT19SWF9QQUNLRVRTCQkJPSBCSVQoOCksCisJU1RBVElPTl9JTkZPX1RYX1BBQ0tFVFMJCQk9IEJJVCg5KSwKKwlTVEFUSU9OX0lORk9fVFhfUkVUUklFUwkJCT0gQklUKDEwKSwKKwlTVEFUSU9OX0lORk9fVFhfRkFJTEVECQkJPSBCSVQoMTEpLAorCVNUQVRJT05fSU5GT19SWF9EUk9QX01JU0MJCT0gQklUKDEyKSwKKwlTVEFUSU9OX0lORk9fU0lHTkFMX0FWRwkJCT0gQklUKDEzKSwKKwlTVEFUSU9OX0lORk9fUlhfQklUUkFURQkJCT0gQklUKDE0KSwKKwlTVEFUSU9OX0lORk9fQlNTX1BBUkFNCQkJPSBCSVQoMTUpLAorCVNUQVRJT05fSU5GT19DT05ORUNURURfVElNRQkJPSBCSVQoMTYpLAorCVNUQVRJT05fSU5GT19BU1NPQ19SRVFfSUVTCQk9IEJJVCgxNyksCisJU1RBVElPTl9JTkZPX1NUQV9GTEFHUwkJCT0gQklUKDE4KSwKKwlTVEFUSU9OX0lORk9fQkVBQ09OX0xPU1NfQ09VTlQJCT0gQklUKDE5KSwKKwlTVEFUSU9OX0lORk9fVF9PRkZTRVQJCQk9IEJJVCgyMCksCisJU1RBVElPTl9JTkZPX0xPQ0FMX1BNCQkJPSBCSVQoMjEpLAorCVNUQVRJT05fSU5GT19QRUVSX1BNCQkJPSBCSVQoMjIpLAorCVNUQVRJT05fSU5GT19OT05QRUVSX1BNCQkJPSBCSVQoMjMpLAorCVNUQVRJT05fSU5GT19SWF9CWVRFUzY0CQkJPSBCSVQoMjQpLAorCVNUQVRJT05fSU5GT19UWF9CWVRFUzY0CQkJPSBCSVQoMjUpLAorCVNUQVRJT05fSU5GT19DSEFJTl9TSUdOQUwJCT0gQklUKDI2KSwKKwlTVEFUSU9OX0lORk9fQ0hBSU5fU0lHTkFMX0FWRwkJPSBCSVQoMjcpLAorCVNUQVRJT05fSU5GT19FWFBFQ1RFRF9USFJPVUdIUFVUCT0gQklUKDI4KSwKIH07CiAKIC8qKgpAQCAtMTAwNyw2ICsxMDI2LDggQEAKICAqIEBsb2NhbF9wbTogbG9jYWwgbWVzaCBTVEEgcG93ZXIgc2F2ZSBtb2RlCiAgKiBAcGVlcl9wbTogcGVlciBtZXNoIFNUQSBwb3dlciBzYXZlIG1vZGUKICAqIEBub25wZWVyX3BtOiBub24tcGVlciBtZXNoIFNUQSBwb3dlciBzYXZlIG1vZGUKKyAqIEBleHBlY3RlZF90aHJvdWdocHV0OiBleHBlY3RlZCB0aHJvdWdocHV0IGluIGticHMgKGluY2x1ZGluZyA4MDIuMTEgaGVhZGVycykKKyAqCXRvd2FyZHMgdGhpcyBzdGF0aW9uLgogICovCiBzdHJ1Y3Qgc3RhdGlvbl9pbmZvIHsKIAl1MzIgZmlsbGVkOwpAQCAtMTA0NSw2ICsxMDY2LDggQEAKIAllbnVtIG5sODAyMTFfbWVzaF9wb3dlcl9tb2RlIHBlZXJfcG07CiAJZW51bSBubDgwMjExX21lc2hfcG93ZXJfbW9kZSBub25wZWVyX3BtOwogCisJdTMyIGV4cGVjdGVkX3Rocm91Z2hwdXQ7CisKIAkvKgogCSAqIE5vdGU6IEFkZCBhIG5ldyBlbnVtIHN0YXRpb25faW5mb19mbGFncyB2YWx1ZSBmb3IgZWFjaCBuZXcgZmllbGQgYW5kCiAJICogdXNlIGl0IHRvIGNoZWNrIHdoaWNoIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQuCkBAIC0xMDUyLDYgKzEwNzUsMTkgQEAKIH07CiAKIC8qKgorICogY2ZnODAyMTFfZ2V0X3N0YXRpb24gLSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0YXRpb24KKyAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hlcmUgdGhlIHN0YXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgY29ubmVjdGVkIHRvCisgKiBAbWFjX2FkZHI6IHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiBvZiBpbnRlcmVzdAorICogQHNpbmZvOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIHRoZSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBzaW5mbyBpcyBmaWxsZWQgd2l0aCB0aGUgYXZhaWxhYmxlIGluZm9ybWF0aW9uCisgKiBvdGhlcndpc2UgcmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgYW5kIHRoZSBjb250ZW50IG9mIHNpbmZvIGhhcyB0byBiZQorICogY29uc2lkZXJlZCB1bmRlZmluZWQuCisgKi8KK2ludCBjZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqbWFjX2FkZHIsCisJCQkgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworCisvKioKICAqIGVudW0gbW9uaXRvcl9mbGFncyAtIG1vbml0b3IgZmxhZ3MKICAqCiAgKiBNb25pdG9yIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGZsYWdzLiBOb3RlIHRoYXQgdGhlc2UgbXVzdCBiZSB0aGUgYml0cwpAQCAtMTE1Miw3ICsxMTg4LDcgQEAKIAlpbnQgdXNlX2N0c19wcm90OwogCWludCB1c2Vfc2hvcnRfcHJlYW1ibGU7CiAJaW50IHVzZV9zaG9ydF9zbG90X3RpbWU7Ci0JdTggKmJhc2ljX3JhdGVzOworCWNvbnN0IHU4ICpiYXNpY19yYXRlczsKIAl1OCBiYXNpY19yYXRlc19sZW47CiAJaW50IGFwX2lzb2xhdGU7CiAJaW50IGh0X29wbW9kZTsKQEAgLTE2ODIsMTAgKzE3MTgsMTAgQEAKICAqIEBodF9jYXBhX21hc2s6ICBUaGUgYml0cyBvZiBodF9jYXBhIHdoaWNoIGFyZSB0byBiZSB1c2VkLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgewotCXU4ICpzc2lkOwotCXU4ICpic3NpZDsKKwljb25zdCB1OCAqc3NpZDsKKwljb25zdCB1OCAqYnNzaWQ7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7Ci0JdTggKmllOworCWNvbnN0IHU4ICppZTsKIAl1OCBzc2lkX2xlbiwgaWVfbGVuOwogCXUxNiBiZWFjb25faW50ZXJ2YWw7CiAJdTMyIGJhc2ljX3JhdGVzOwpAQCAtMTc5NCw4ICsxODMwLDggQEAKICAqIEBwbWtpZDogVGhlIFBNSyBtYXRlcmlhbCBpdHNlbGYuCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSB7Ci0JdTggKmJzc2lkOwotCXU4ICpwbWtpZDsKKwljb25zdCB1OCAqYnNzaWQ7CisJY29uc3QgdTggKnBta2lkOwogfTsKIAogLyoqCkBAIC0xODEwLDcgKzE4NDYsNyBAQAogICogbWVtb3J5LCBmcmVlIEBtYXNrIG9ubHkhCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9wa3RfcGF0dGVybiB7Ci0JdTggKm1hc2ssICpwYXR0ZXJuOworCWNvbnN0IHU4ICptYXNrLCAqcGF0dGVybjsKIAlpbnQgcGF0dGVybl9sZW47CiAJaW50IHBrdF9vZmZzZXQ7CiB9OwpAQCAtMTk3NCw2ICsyMDEwLDggQEAKICAqIEBsZW46IGJ1ZmZlciBsZW5ndGgKICAqIEBub19jY2s6IGRvbid0IHVzZSBjY2sgcmF0ZXMgZm9yIHRoaXMgZnJhbWUKICAqIEBkb250X3dhaXRfZm9yX2FjazogdGVsbHMgdGhlIGxvdyBsZXZlbCBub3QgdG8gd2FpdCBmb3IgYW4gYWNrCisgKiBAbl9jc2Ffb2Zmc2V0czogbGVuZ3RoIG9mIGNzYV9vZmZzZXRzIGFycmF5CisgKiBAY3NhX29mZnNldHM6IGFycmF5IG9mIGFsbCB0aGUgY3NhIG9mZnNldHMgaW4gdGhlIGZyYW1lCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9tZ210X3R4X3BhcmFtcyB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwpAQCAtMTk4Myw2ICsyMDIxLDggQEAKIAlzaXplX3QgbGVuOwogCWJvb2wgbm9fY2NrOwogCWJvb2wgZG9udF93YWl0X2Zvcl9hY2s7CisJaW50IG5fY3NhX29mZnNldHM7CisJY29uc3QgdTE2ICpjc2Ffb2Zmc2V0czsKIH07CiAKIC8qKgpAQCAtMjI3OCw2ICsyMzE4LDEwIEBACiAgKiBAY2hhbm5lbF9zd2l0Y2g6IGluaXRpYXRlIGNoYW5uZWwtc3dpdGNoIHByb2NlZHVyZSAod2l0aCBDU0EpCiAgKgogICogQHNldF9xb3NfbWFwOiBTZXQgUW9TIG1hcHBpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGRyaXZlcgorICoKKyAqIEBzZXRfYXBfY2hhbndpZHRoOiBTZXQgdGhlIEFQIChpbmNsdWRpbmcgUDJQIEdPKSBtb2RlIGNoYW5uZWwgd2lkdGggZm9yIHRoZQorICoJZ2l2ZW4gaW50ZXJmYWNlIFRoaXMgaXMgdXNlZCBlLmcuIGZvciBkeW5hbWljIEhUIDIwLzQwIE1IeiBjaGFubmVsIHdpZHRoCisgKgljaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIEJTUy4KICAqLwogc3RydWN0IGNmZzgwMjExX29wcyB7CiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KTsKQEAgLTIzMjAsMjggKzIzNjQsMjkgQEAKIAogCiAJaW50CSgqYWRkX3N0YXRpb24pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKTsKKwkJCSAgICAgICBjb25zdCB1OCAqbWFjLAorCQkJICAgICAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcyk7CiAJaW50CSgqZGVsX3N0YXRpb24pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdTggKm1hYyk7CisJCQkgICAgICAgY29uc3QgdTggKm1hYyk7CiAJaW50CSgqY2hhbmdlX3N0YXRpb24pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpOworCQkJCSAgY29uc3QgdTggKm1hYywKKwkJCQkgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcyk7CiAJaW50CSgqZ2V0X3N0YXRpb24pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworCQkJICAgICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKTsKIAlpbnQJKCpkdW1wX3N0YXRpb24pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgaW50IGlkeCwgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworCQkJCWludCBpZHgsIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKTsKIAogCWludAkoKmFkZF9tcGF0aCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1OCAqZHN0LCB1OCAqbmV4dF9ob3ApOworCQkJICAgICAgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpuZXh0X2hvcCk7CiAJaW50CSgqZGVsX21wYXRoKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHU4ICpkc3QpOworCQkJICAgICAgIGNvbnN0IHU4ICpkc3QpOwogCWludAkoKmNoYW5nZV9tcGF0aCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIHU4ICpkc3QsIHU4ICpuZXh0X2hvcCk7CisJCQkJICBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqbmV4dF9ob3ApOwogCWludAkoKmdldF9tcGF0aCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1OCAqZHN0LCB1OCAqbmV4dF9ob3AsCi0JCQkgICAgICAgc3RydWN0IG1wYXRoX2luZm8gKnBpbmZvKTsKKwkJCSAgICAgdTggKmRzdCwgdTggKm5leHRfaG9wLCBzdHJ1Y3QgbXBhdGhfaW5mbyAqcGluZm8pOwogCWludAkoKmR1bXBfbXBhdGgpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgaW50IGlkeCwgdTggKmRzdCwgdTggKm5leHRfaG9wLAotCQkJICAgICAgIHN0cnVjdCBtcGF0aF9pbmZvICpwaW5mbyk7CisJCQkgICAgICBpbnQgaWR4LCB1OCAqZHN0LCB1OCAqbmV4dF9ob3AsCisJCQkgICAgICBzdHJ1Y3QgbXBhdGhfaW5mbyAqcGluZm8pOwogCWludAkoKmdldF9tZXNoX2NvbmZpZykoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBtZXNoX2NvbmZpZyAqY29uZik7CkBAIC0yNDcxLDExICsyNTE2LDExIEBACiAJCQkJICBzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgKmRhdGEpOwogCiAJaW50CSgqdGRsc19tZ210KShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICB1OCAqcGVlciwgdTggYWN0aW9uX2NvZGUsICB1OCBkaWFsb2dfdG9rZW4sCisJCQkgICAgIGNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgIHU4IGRpYWxvZ190b2tlbiwKIAkJCSAgICAgdTE2IHN0YXR1c19jb2RlLCB1MzIgcGVlcl9jYXBhYmlsaXR5LAogCQkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKIAlpbnQJKCp0ZGxzX29wZXIpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHU4ICpwZWVyLCBlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24gb3Blcik7CisJCQkgICAgIGNvbnN0IHU4ICpwZWVyLCBlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24gb3Blcik7CiAKIAlpbnQJKCpwcm9iZV9jbGllbnQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJY29uc3QgdTggKnBlZXIsIHU2NCAqY29va2llKTsKQEAgLTI1MjEsOSArMjU2NiwxMyBAQAogCWludAkoKmNoYW5uZWxfc3dpdGNoKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBjZmc4MDIxMV9jc2Ffc2V0dGluZ3MgKnBhcmFtcyk7CisKIAlpbnQgICAgICgqc2V0X3Fvc19tYXApKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfcW9zX21hcCAqcW9zX21hcCk7CisKKwlpbnQJKCpzZXRfYXBfY2hhbndpZHRoKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpOwogfTsKIAogLyoKQEAgLTI2MTgsNiArMjY2Nyw3IEBACiAgKgliZXR3ZWVuIGluZnJhc3RydWN0dXJlIGFuZCBBUCB0eXBlcyBtdXN0IG1hdGNoLiBUaGlzIGlzIHJlcXVpcmVkCiAgKglvbmx5IGluIHNwZWNpYWwgY2FzZXMuCiAgKiBAcmFkYXJfZGV0ZWN0X3dpZHRoczogYml0bWFwIG9mIGNoYW5uZWwgd2lkdGhzIHN1cHBvcnRlZCBmb3IgcmFkYXIgZGV0ZWN0aW9uCisgKiBAcmFkYXJfZGV0ZWN0X3JlZ2lvbnM6IGJpdG1hcCBvZiByZWdpb25zIHN1cHBvcnRlZCBmb3IgcmFkYXIgZGV0ZWN0aW9uCiAgKgogICogV2l0aCB0aGlzIHN0cnVjdHVyZSB0aGUgZHJpdmVyIGNhbiBkZXNjcmliZSB3aGljaCBpbnRlcmZhY2UKICAqIGNvbWJpbmF0aW9ucyBpdCBzdXBwb3J0cyBjb25jdXJyZW50bHkuCkBAIC0yNjc1LDYgKzI3MjUsNyBAQAogCXU4IG5fbGltaXRzOwogCWJvb2wgYmVhY29uX2ludF9pbmZyYV9tYXRjaDsKIAl1OCByYWRhcl9kZXRlY3Rfd2lkdGhzOworCXU4IHJhZGFyX2RldGVjdF9yZWdpb25zOwogfTsKIAogc3RydWN0IGllZWU4MDIxMV90eHJ4X3N0eXBlcyB7CkBAIC0yOTA1LDYgKzI5NTYsMTcgQEAKICAqCShpbmNsdWRpbmcgUDJQIEdPKSBvciAwIHRvIGluZGljYXRlIG5vIHN1Y2ggbGltaXQgaXMgYWR2ZXJ0aXNlZC4gVGhlCiAgKglkcml2ZXIgaXMgYWxsb3dlZCB0byBhZHZlcnRpc2UgYSB0aGVvcmV0aWNhbCBsaW1pdCB0aGF0IGl0IGNhbiByZWFjaCBpbgogICoJc29tZSBjYXNlcywgYnV0IG1heSBub3QgYWx3YXlzIHJlYWNoLgorICoKKyAqIEBtYXhfbnVtX2NzYV9jb3VudGVyczogTnVtYmVyIG9mIHN1cHBvcnRlZCBjc2FfY291bnRlcnMgaW4gYmVhY29ucworICoJYW5kIHByb2JlIHJlc3BvbnNlcy4gIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCBpZiB0aGUgZHJpdmVyCisgKgl3aXNoZXMgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjc2EgY291bnRlcnMuIERlZmF1bHQgKDApIG1lYW5zCisgKglpbmZpbml0ZS4KKyAqIEBtYXhfYWRqX2NoYW5uZWxfcnNzaV9jb21wOiBtYXggb2Zmc2V0IG9mIGJldHdlZW4gdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlCisgKglmcmFtZSB3YXMgc2VudCBhbmQgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIGZyYW1lIHdhcyBoZWFyZCBmb3Igd2hpY2gKKyAqCXRoZSByZXBvcnRlZCByc3NpIGlzIHN0aWxsIHZhbGlkLiBJZiBhIGRyaXZlciBpcyBhYmxlIHRvIGNvbXBlbnNhdGUgdGhlCisgKglsb3cgcnNzaSB3aGVuIGEgZnJhbWUgaXMgaGVhcmQgb24gZGlmZmVyZW50IGNoYW5uZWwsIHRoZW4gaXQgc2hvdWxkIHNldAorICoJdGhpcyB2YXJpYWJsZSB0byB0aGUgbWF4aW1hbCBvZmZzZXQgZm9yIHdoaWNoIGl0IGNhbiBjb21wZW5zYXRlLgorICoJVGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0IGluIE1Iei4KICAqLwogc3RydWN0IHdpcGh5IHsKIAkvKiBhc3NpZ24gdGhlc2UgZmllbGRzIGJlZm9yZSB5b3UgcmVnaXN0ZXIgdGhlIHdpcGh5ICovCkBAIC0zMDIyLDYgKzMwODQsOSBAQAogCiAJdTE2IG1heF9hcF9hc3NvY19zdGE7CiAKKwl1OCBtYXhfbnVtX2NzYV9jb3VudGVyczsKKwl1OCBtYXhfYWRqX2NoYW5uZWxfcnNzaV9jb21wOworCiAJY2hhciBwcml2WzBdIF9fYWxpZ25lZChORVRERVZfQUxJR04pOwogfTsKIApAQCAtMzE5NCw2ICszMjU5LDcgQEAKICAqIEBpYnNzX2Rmc19wb3NzaWJsZTogKHByaXZhdGUpIElCU1MgbWF5IGNoYW5nZSB0byBhIERGUyBjaGFubmVsCiAgKiBAZXZlbnRfbGlzdDogKHByaXZhdGUpIGxpc3QgZm9yIGludGVybmFsIGV2ZW50IHByb2Nlc3NpbmcKICAqIEBldmVudF9sb2NrOiAocHJpdmF0ZSkgbG9jayBmb3IgZXZlbnQgbGlzdAorICogQG93bmVyX25scG9ydGlkOiAocHJpdmF0ZSkgb3duZXIgc29ja2V0IHBvcnQgSUQKICAqLwogc3RydWN0IHdpcmVsZXNzX2RldiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeTsKQEAgLTMyNDEsMTMgKzMzMDcsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGNhY19zdGFydF90aW1lOwogCXVuc2lnbmVkIGludCBjYWNfdGltZV9tczsKIAorCXUzMiBvd25lcl9ubHBvcnRpZDsKKwogI2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUCiAJLyogd2V4dCBkYXRhICovCiAJc3RydWN0IHsKIAkJc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zIGlic3M7CiAJCXN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyBjb25uZWN0OwogCQlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmtleXM7Ci0JCXU4ICppZTsKKwkJY29uc3QgdTggKmllOwogCQlzaXplX3QgaWVfbGVuOwogCQl1OCBic3NpZFtFVEhfQUxFTl0sIHByZXZfYnNzaWRbRVRIX0FMRU5dOwogCQl1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dOwpAQCAtMzQ4OCw3ICszNTU2LDggQEAKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KIGludCBpZWVlODAyMTFfZGF0YV9mcm9tXzgwMjMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgdTggKmFkZHIsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlLCB1OCAqYnNzaWQsIGJvb2wgcW9zKTsKKwkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSBpZnR5cGUsIGNvbnN0IHU4ICpic3NpZCwKKwkJCSAgICAgYm9vbCBxb3MpOwogCiAvKioKICAqIGllZWU4MDIxMV9hbXNkdV90b184MDIzcyAtIGRlY29kZSBhbiBJRUVFIDgwMi4xMW4gQS1NU0RVIGZyYW1lCkBAIC0zNjAwLDcgKzM2NjksNyBAQAogICogZGVmYXVsdCBjaGFubmVsIHNldHRpbmdzIHdpbGwgYmUgZGlzcmVnYXJkZWQuIElmIG5vIHJ1bGUgaXMgZm91bmQgZm9yIGEKICAqIGNoYW5uZWwgb24gdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHRoZSBjaGFubmVsIHdpbGwgYmUgZGlzYWJsZWQuCiAgKiBEcml2ZXJzIHVzaW5nIHRoaXMgZm9yIGEgd2lwaHkgc2hvdWxkIGFsc28gc2V0IHRoZSB3aXBoeSBmbGFnCi0gKiBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZIG9yIGNmZzgwMjExIHdpbGwgc2V0IGl0IGZvciB0aGUgd2lwaHkKKyAqIFJFR1VMQVRPUllfQ1VTVE9NX1JFRyBvciBjZmc4MDIxMSB3aWxsIHNldCBpdCBmb3IgdGhlIHdpcGh5CiAgKiB0aGF0IGNhbGxlZCB0aGlzIGhlbHBlci4KICAqLwogdm9pZCB3aXBoeV9hcHBseV9jdXN0b21fcmVndWxhdG9yeShzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtNDI4OSw3ICs0MzU4LDcgQEAKICAqIGFuZCBub3QgdHJ5IHRvIGNvbm5lY3QgdG8gYW55IEFQIGFueSBtb3JlLgogICovCiB2b2lkIGNmZzgwMjExX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVhc29uLAotCQkJICAgdTggKmllLCBzaXplX3QgaWVfbGVuLCBnZnBfdCBnZnApOworCQkJICAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuLCBnZnBfdCBnZnApOwogCiAvKioKICAqIGNmZzgwMjExX3JlYWR5X29uX2NoYW5uZWwgLSBub3RpZmljYXRpb24gb2YgcmVtYWluX29uX2NoYW5uZWwgc3RhcnQKQEAgLTQ1NDMsMTIgKzQ2MTIsMTQgQEAKICAqIGNmZzgwMjExX3JlZ19jYW5fYmVhY29uIC0gY2hlY2sgaWYgYmVhY29uaW5nIGlzIGFsbG93ZWQKICAqIEB3aXBoeTogdGhlIHdpcGh5CiAgKiBAY2hhbmRlZjogdGhlIGNoYW5uZWwgZGVmaW5pdGlvbgorICogQGlmdHlwZTogaW50ZXJmYWNlIHR5cGUKICAqCiAgKiBSZXR1cm46ICV0cnVlIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjaGFubmVsIG9yIHRoZSBzZWNvbmRhcnkgY2hhbm5lbChzKQogICogY2FuIGJlIHVzZWQgZm9yIGJlYWNvbmluZyAoaS5lLiBpcyBub3QgYSByYWRhciBjaGFubmVsIGV0Yy4pCiAgKi8KIGJvb2wgY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCSAgICAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKTsKKwkJCSAgICAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZSk7CiAKIC8qCiAgKiBjZmc4MDIxMV9jaF9zd2l0Y2hfbm90aWZ5IC0gdXBkYXRlIHdkZXYgY2hhbm5lbCBhbmQgbm90aWZ5IHVzZXJzcGFjZQpAQCAtNDY5NCw2ICs0NzY1LDg0IEBACiAgKi8KIHVuc2lnbmVkIGludCBpZWVlODAyMTFfZ2V0X251bV9zdXBwb3J0ZWRfY2hhbm5lbHMoc3RydWN0IHdpcGh5ICp3aXBoeSk7CiAKKy8qKgorICogY2ZnODAyMTFfY2hlY2tfY29tYmluYXRpb25zIC0gY2hlY2sgaW50ZXJmYWNlIGNvbWJpbmF0aW9ucworICoKKyAqIEB3aXBoeTogdGhlIHdpcGh5CisgKiBAbnVtX2RpZmZlcmVudF9jaGFubmVsczogdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2hhbm5lbHMgd2Ugd2FudAorICoJdG8gdXNlIGZvciB2ZXJpZmljYXRpb24KKyAqIEByYWRhcl9kZXRlY3Q6IGEgYml0bWFwIHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIGEgY2hhbm5lbAorICoJd2lkdGggd2hlcmUgcmFkYXIgZGV0ZWN0aW9uIGlzIG5lZWRlZCwgYXMgaW4gdGhlIGRlZmluaXRpb24gb2YKKyAqCSZzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uLkByYWRhcl9kZXRlY3Rfd2lkdGhzCisgKiBAaWZ0eXBlX251bTogYXJyYXkgd2l0aCB0aGUgbnVtYmVycyBvZiBpbnRlcmZhY2VzIG9mIGVhY2ggaW50ZXJmYWNlCisgKgl0eXBlLiAgVGhlIGluZGV4IGlzIHRoZSBpbnRlcmZhY2UgdHlwZSBhcyBzcGVjaWZpZWQgaW4gJmVudW0KKyAqCW5sODAyMTFfaWZ0eXBlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYQorICogY29tYmluYXRpb24gb2YgaW50ZXJmYWNlcyBhbmQgdGhlaXIgdHlwZXMgYXJlIGFsbG93ZWQgYWNjb3JkaW5nIHRvCisgKiB0aGUgaW50ZXJmYWNlIGNvbWJpbmF0aW9ucy4KKyAqLworaW50IGNmZzgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCWNvbnN0IGludCBudW1fZGlmZmVyZW50X2NoYW5uZWxzLAorCQkJCWNvbnN0IHU4IHJhZGFyX2RldGVjdCwKKwkJCQljb25zdCBpbnQgaWZ0eXBlX251bVtOVU1fTkw4MDIxMV9JRlRZUEVTXSk7CisKKy8qKgorICogY2ZnODAyMTFfaXRlcl9jb21iaW5hdGlvbnMgLSBpdGVyYXRlIG92ZXIgbWF0Y2hpbmcgY29tYmluYXRpb25zCisgKgorICogQHdpcGh5OiB0aGUgd2lwaHkKKyAqIEBudW1fZGlmZmVyZW50X2NoYW5uZWxzOiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjaGFubmVscyB3ZSB3YW50CisgKgl0byB1c2UgZm9yIHZlcmlmaWNhdGlvbgorICogQHJhZGFyX2RldGVjdDogYSBiaXRtYXAgd2hlcmUgZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gYSBjaGFubmVsCisgKgl3aWR0aCB3aGVyZSByYWRhciBkZXRlY3Rpb24gaXMgbmVlZGVkLCBhcyBpbiB0aGUgZGVmaW5pdGlvbiBvZgorICoJJnN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24uQHJhZGFyX2RldGVjdF93aWR0aHMKKyAqIEBpZnR5cGVfbnVtOiBhcnJheSB3aXRoIHRoZSBudW1iZXJzIG9mIGludGVyZmFjZXMgb2YgZWFjaCBpbnRlcmZhY2UKKyAqCXR5cGUuICBUaGUgaW5kZXggaXMgdGhlIGludGVyZmFjZSB0eXBlIGFzIHNwZWNpZmllZCBpbiAmZW51bQorICoJbmw4MDIxMV9pZnR5cGUuCisgKiBAaXRlcjogZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBtYXRjaGluZyBjb21iaW5hdGlvbgorICogQGRhdGE6IHBvaW50ZXIgdG8gcGFzcyB0byBpdGVyIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgdG8gY2hlY2sgd2hhdCBwb3NzaWJsZQorICogY29tYmluYXRpb25zIGl0IGZpdHMgaW4gYXQgYSBnaXZlbiBtb21lbnQsIGUuZy4gZm9yIGNoYW5uZWwgc3dpdGNoaW5nCisgKiBwdXJwb3Nlcy4KKyAqLworaW50IGNmZzgwMjExX2l0ZXJfY29tYmluYXRpb25zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICAgY29uc3QgaW50IG51bV9kaWZmZXJlbnRfY2hhbm5lbHMsCisJCQkgICAgICAgY29uc3QgdTggcmFkYXJfZGV0ZWN0LAorCQkJICAgICAgIGNvbnN0IGludCBpZnR5cGVfbnVtW05VTV9OTDgwMjExX0lGVFlQRVNdLAorCQkJICAgICAgIHZvaWQgKCppdGVyKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uICpjLAorCQkJCQkgICAgdm9pZCAqZGF0YSksCisJCQkgICAgICAgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBjZmc4MDIxMV9zdG9wX2lmYWNlIC0gdHJpZ2dlciBpbnRlcmZhY2UgZGlzY29ubmVjdGlvbgorICoKKyAqIEB3aXBoeTogdGhlIHdpcGh5CisgKiBAd2Rldjogd2lyZWxlc3MgZGV2aWNlCisgKiBAZ2ZwOiBjb250ZXh0IGZsYWdzCisgKgorICogVHJpZ2dlciBpbnRlcmZhY2UgdG8gYmUgc3RvcHBlZCBhcyBpZiBBUCB3YXMgc3RvcHBlZCwgSUJTUy9tZXNoIGxlZnQsIFNUQQorICogZGlzY29ubmVjdGVkLgorICoKKyAqIE5vdGU6IFRoaXMgZG9lc24ndCBuZWVkIGFueSBsb2NrcyBhbmQgaXMgYXN5bmNocm9ub3VzLgorICovCit2b2lkIGNmZzgwMjExX3N0b3BfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCSBnZnBfdCBnZnApOworCisvKioKKyAqIGNmZzgwMjExX3NodXRkb3duX2FsbF9pbnRlcmZhY2VzIC0gc2h1dCBkb3duIGFsbCBpbnRlcmZhY2VzIGZvciBhIHdpcGh5CisgKiBAd2lwaHk6IHRoZSB3aXBoeSB0byBzaHV0IGRvd24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNodXRzIGRvd24gYWxsIGludGVyZmFjZXMgYmVsb25naW5nIHRvIHRoaXMgd2lwaHkgYnkKKyAqIGNhbGxpbmcgZGV2X2Nsb3NlKCkgKGFuZCB0cmVhdGluZyBub24tbmV0ZGV2IGludGVyZmFjZXMgYXMgbmVlZGVkKS4KKyAqIEl0IHNob3VsZG4ndCByZWFsbHkgYmUgdXNlZCB1bmxlc3MgdGhlcmUgYXJlIHNvbWUgZmF0YWwgZGV2aWNlIGVycm9ycworICogdGhhdCByZWFsbHkgY2FuJ3QgYmUgcmVjb3ZlcmVkIGluIGFueSBvdGhlciB3YXkuCisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgdGhlIFJUTkwgYW5kIGJlIGFibGUgdG8gZGVhbCB3aXRoIGNhbGxiYWNrcyBpbnRvCisgKiB0aGUgZHJpdmVyIHdoaWxlIHRoZSBmdW5jdGlvbiBpcyBydW5uaW5nLgorICovCit2b2lkIGNmZzgwMjExX3NodXRkb3duX2FsbF9pbnRlcmZhY2VzKHN0cnVjdCB3aXBoeSAqd2lwaHkpOworCiAvKiBMb2dnaW5nLCBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy9kaWFnbm9zdGljIGhlbHBlcnMuICovCiAKIC8qIHdpcGh5X3ByaW50ayBoZWxwZXJzLCBzaW1pbGFyIHRvIGRldl9wcmludGsgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NoZWNrc3VtLmggYi9pbmNsdWRlL25ldC9jaGVja3N1bS5oCmluZGV4IGEyOGY0ZTAuLjg3Y2IxOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9uZXQvY2hlY2tzdW0uaApAQCAtNTcsMTIgKzU3LDE0IEBACiB9CiAjZW5kaWYKIAorI2lmbmRlZiBIQVZFX0FSQ0hfQ1NVTV9BREQKIHN0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fYWRkKF9fd3N1bSBjc3VtLCBfX3dzdW0gYWRkZW5kKQogewogCXUzMiByZXMgPSAoX19mb3JjZSB1MzIpY3N1bTsKIAlyZXMgKz0gKF9fZm9yY2UgdTMyKWFkZGVuZDsKIAlyZXR1cm4gKF9fZm9yY2UgX193c3VtKShyZXMgKyAocmVzIDwgKF9fZm9yY2UgdTMyKWFkZGVuZCkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fc3ViKF9fd3N1bSBjc3VtLCBfX3dzdW0gYWRkZW5kKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHNhLmggYi9pbmNsdWRlL25ldC9kc2EuaAppbmRleCA3ODI4ZWJmOS4uNmVmY2UzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHNhLmgKKysrIGIvaW5jbHVkZS9uZXQvZHNhLmgKQEAgLTE4MSw2ICsxODEsMTEgQEAKIHZvaWQgcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnR5cGUpOwogdm9pZCB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICp0eXBlKTsKIAorc3RhdGljIGlubGluZSB2b2lkICpkc190b19wcml2KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gKHZvaWQgKikoZHMgKyAxKTsKK30KKwogLyoKICAqIFRoZSBvcmlnaW5hbCBEU0EgdGFnIGZvcm1hdCBhbmQgc29tZSBvdGhlciB0YWcgZm9ybWF0cyBoYXZlIG5vCiAgKiBldGhlcnR5cGUsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBhZGQgYSBsaXR0bGUgaGFjayB0byB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dyZS5oIGIvaW5jbHVkZS9uZXQvZ3JlLmgKaW5kZXggNzAwNDZhMGIuLmI1MzE4MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2dyZS5oCisrKyBiL2luY2x1ZGUvbmV0L2dyZS5oCkBAIC0zNyw5ICszNywxMCBAQAogCQkgICAgICBpbnQgaGRyX2xlbik7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmdyZV9oYW5kbGVfb2ZmbG9hZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgYm9vbCBncmVfY3N1bSkKKwkJCQkJCSAgYm9vbCBjc3VtKQogewotCXJldHVybiBpcHR1bm5lbF9oYW5kbGVfb2ZmbG9hZHMoc2tiLCBncmVfY3N1bSwgU0tCX0dTT19HUkUpOworCXJldHVybiBpcHR1bm5lbF9oYW5kbGVfb2ZmbG9hZHMoc2tiLCBjc3VtLAorCQkJCQljc3VtID8gU0tCX0dTT19HUkVfQ1NVTSA6IFNLQl9HU09fR1JFKTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTU0LmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTU0LmgKaW5kZXggYzdhZTBhYy4uMGFhNzEyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjE1NC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxNTQuaApAQCAtNzksNiArNzksMTUgQEAKICNkZWZpbmUgSUVFRTgwMjE1NF9TQ0ZfS0VZX1NIT1JUX0lOREVYCQkyCiAjZGVmaW5lIElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWAkJMwogCisjZGVmaW5lIElFRUU4MDIxNTRfU0NGX1NFQ0xFVkVMX05PTkUJCTAKKyNkZWZpbmUgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDMzIJCTEKKyNkZWZpbmUgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDNjQJCTIKKyNkZWZpbmUgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDMTI4CQkzCisjZGVmaW5lIElFRUU4MDIxNTRfU0NGX1NFQ0xFVkVMX0VOQwkJNAorI2RlZmluZSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkNfTUlDMzIJNQorI2RlZmluZSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkNfTUlDNjQJNgorI2RlZmluZSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkNfTUlDMTI4CTcKKwogLyogTUFDIGZvb3RlciBzaXplICovCiAjZGVmaW5lIElFRUU4MDIxNTRfTUZSX1NJWkUJMiAvKiAyIG9jdGV0cyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTU0X25ldGRldi5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjE1NF9uZXRkZXYuaAppbmRleCA1YTcxOWNhLi4zYjUzYzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTU0X25ldGRldi5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxNTRfbmV0ZGV2LmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpZm5kZWYgSUVFRTgwMjE1NF9ORVRERVZJQ0VfSAogI2RlZmluZSBJRUVFODAyMTU0X05FVERFVklDRV9ICiAKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjE1NC5oPgogI2luY2x1ZGUgPG5ldC9hZl9pZWVlODAyMTU0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0xMTQsNiArMTE1LDM0IEBACiBpbnQgaWVlZTgwMjE1NF9oZHJfcGVla19hZGRycyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxNTRfaGRyICpoZHIpOwogCisvKiBwYXJzZXMgdGhlIGZ1bGwgODAyLjE1LjQgaGVhZGVyIGEgZ2l2ZW4gc2tiIGFuZCBzdG9yZXMgdGhlbSBpbnRvIGhkciwKKyAqIHBlcmZvcm1pbmcgcGFuIGlkIGRlY29tcHJlc3Npb24gYW5kIGxlbmd0aCBjaGVja3MgdG8gYmUgc3VpdGFibGUgZm9yIHVzZSBpbgorICogaGVhZGVyX29wcy5wYXJzZQorICovCitpbnQgaWVlZTgwMjE1NF9oZHJfcGVlayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkcik7CisKK2ludCBpZWVlODAyMTU0X21heF9wYXlsb2FkKGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2hkciAqaGRyKTsKKworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxNTRfc2VjaGRyX2F1dGh0YWdfbGVuKGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X3NlY2hkciAqc2VjKQoreworCXN3aXRjaCAoc2VjLT5sZXZlbCkgeworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDMzI6CisJY2FzZSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkNfTUlDMzI6CisJCXJldHVybiA0OworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDNjQ6CisJY2FzZSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkNfTUlDNjQ6CisJCXJldHVybiA4OworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTUlDMTI4OgorCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfRU5DX01JQzEyODoKKwkJcmV0dXJuIDE2OworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfTk9ORToKKwljYXNlIElFRUU4MDIxNTRfU0NGX1NFQ0xFVkVMX0VOQzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxNTRfaGRyX2xlbmd0aChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTU0X2hkciBoZHI7CkBAIC0xOTMsOCArMjIyLDEyIEBACiAgKi8KIHN0cnVjdCBpZWVlODAyMTU0X21hY19jYiB7CiAJdTggbHFpOwotCXU4IGZsYWdzOwotCXU4IHNlcTsKKwl1OCB0eXBlOworCWJvb2wgYWNrcmVxOworCWJvb2wgc2VjZW47CisJYm9vbCBzZWNlbl9vdmVycmlkZTsKKwl1OCBzZWNsZXZlbDsKKwlib29sIHNlY2xldmVsX292ZXJyaWRlOwogCXN0cnVjdCBpZWVlODAyMTU0X2FkZHIgc291cmNlOwogCXN0cnVjdCBpZWVlODAyMTU0X2FkZHIgZGVzdDsKIH07CkBAIC0yMDQsMjUgKzIzNyw5NiBAQAogCXJldHVybiAoc3RydWN0IGllZWU4MDIxNTRfbWFjX2NiICopc2tiLT5jYjsKIH0KIAotI2RlZmluZSBNQUNfQ0JfRkxBR19UWVBFTUFTSwkJKCgxIDw8IDMpIC0gMSkKLQotI2RlZmluZSBNQUNfQ0JfRkxBR19BQ0tSRVEJCSgxIDw8IDMpCi0jZGVmaW5lIE1BQ19DQl9GTEFHX1NFQ0VOCQkoMSA8PCA0KQotCi1zdGF0aWMgaW5saW5lIGJvb2wgbWFjX2NiX2lzX2Fja3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjE1NF9tYWNfY2IgKm1hY19jYl9pbml0KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIG1hY19jYihza2IpLT5mbGFncyAmIE1BQ19DQl9GTEFHX0FDS1JFUTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTU0X21hY19jYikgPiBzaXplb2Yoc2tiLT5jYikpOworCisJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjE1NF9tYWNfY2IpKTsKKwlyZXR1cm4gbWFjX2NiKHNrYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBtYWNfY2JfaXNfc2VjZW4oc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gbWFjX2NiKHNrYiktPmZsYWdzICYgTUFDX0NCX0ZMQUdfU0VDRU47Ci19CisjZGVmaW5lIElFRUU4MDIxNTRfTExTRUNfS0VZX1NJWkUgMTYKIAotc3RhdGljIGlubGluZSBpbnQgbWFjX2NiX3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gbWFjX2NiKHNrYiktPmZsYWdzICYgTUFDX0NCX0ZMQUdfVFlQRU1BU0s7Ci19CitzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgeworCXU4IG1vZGU7CisJdTggaWQ7CisJdW5pb24geworCQlzdHJ1Y3QgaWVlZTgwMjE1NF9hZGRyIGRldmljZV9hZGRyOworCQlfX2xlMzIgc2hvcnRfc291cmNlOworCQlfX2xlNjQgZXh0ZW5kZWRfc291cmNlOworCX07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkgeworCXU4IGZyYW1lX3R5cGVzOworCXUzMiBjbWRfZnJhbWVfaWRzOworCXU4IGtleVtJRUVFODAyMTU0X0xMU0VDX0tFWV9TSVpFXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkIGlkOworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleSAqa2V5OworfTsKKworc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkIGtleV9pZDsKKwl1MzIgZnJhbWVfY291bnRlcjsKK307CisKK2VudW0geworCUlFRUU4MDIxNTRfTExTRUNfREVWS0VZX0lHTk9SRSwKKwlJRUVFODAyMTU0X0xMU0VDX0RFVktFWV9SRVNUUklDVCwKKwlJRUVFODAyMTU0X0xMU0VDX0RFVktFWV9SRUNPUkQsCisKKwlfX0lFRUU4MDIxNTRfTExTRUNfREVWS0VZX01BWCwKK307CisKK3N0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJX19sZTE2IHBhbl9pZDsKKwlfX2xlMTYgc2hvcnRfYWRkcjsKKwlfX2xlNjQgaHdhZGRyOworCXUzMiBmcmFtZV9jb3VudGVyOworCWJvb2wgc2VjbGV2ZWxfZXhlbXB0OworCisJdTgga2V5X21vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBrZXlzOworfTsKKworc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXU4IGZyYW1lX3R5cGU7CisJdTggY21kX2ZyYW1lX2lkOworCWJvb2wgZGV2aWNlX292ZXJyaWRlOworCXUzMiBzZWNfbGV2ZWxzOworfTsKKworc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zIHsKKwlib29sIGVuYWJsZWQ7CisKKwlfX2JlMzIgZnJhbWVfY291bnRlcjsKKwl1OCBvdXRfbGV2ZWw7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkIG91dF9rZXk7CisKKwlfX2xlNjQgZGVmYXVsdF9rZXlfc291cmNlOworCisJX19sZTE2IHBhbl9pZDsKKwlfX2xlNjQgaHdhZGRyOworCV9fbGU2NCBjb29yZF9od2FkZHI7CisJX19sZTE2IGNvb3JkX3Nob3J0YWRkcjsKK307CisKK3N0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3RhYmxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGtleXM7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOworCXN0cnVjdCBsaXN0X2hlYWQgc2VjdXJpdHlfbGV2ZWxzOworfTsKIAogI2RlZmluZSBJRUVFODAyMTU0X01BQ19TQ0FOX0VECQkwCiAjZGVmaW5lIElFRUU4MDIxNTRfTUFDX1NDQU5fQUNUSVZFCTEKQEAgLTI0Miw2ICszNDYsNTMgQEAKIH07CiAKIHN0cnVjdCB3cGFuX3BoeTsKKworZW51bSB7CisJSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9FTkFCTEVEID0gMSA8PCAwLAorCUlFRUU4MDIxNTRfTExTRUNfUEFSQU1fRlJBTUVfQ09VTlRFUiA9IDEgPDwgMSwKKwlJRUVFODAyMTU0X0xMU0VDX1BBUkFNX09VVF9MRVZFTCA9IDEgPDwgMiwKKwlJRUVFODAyMTU0X0xMU0VDX1BBUkFNX09VVF9LRVkgPSAxIDw8IDMsCisJSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9LRVlfU09VUkNFID0gMSA8PCA0LAorCUlFRUU4MDIxNTRfTExTRUNfUEFSQU1fUEFOX0lEID0gMSA8PCA1LAorCUlFRUU4MDIxNTRfTExTRUNfUEFSQU1fSFdBRERSID0gMSA8PCA2LAorCUlFRUU4MDIxNTRfTExTRUNfUEFSQU1fQ09PUkRfSFdBRERSID0gMSA8PCA3LAorCUlFRUU4MDIxNTRfTExTRUNfUEFSQU1fQ09PUkRfU0hPUlRBRERSID0gMSA8PCA4LAorfTsKKworc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfb3BzIHsKKwlpbnQgKCpnZXRfcGFyYW1zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19wYXJhbXMgKnBhcmFtcyk7CisJaW50ICgqc2V0X3BhcmFtcykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zICpwYXJhbXMsCisJCQkgIGludCBjaGFuZ2VkKTsKKworCWludCAoKmFkZF9rZXkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmlkLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5ICprZXkpOworCWludCAoKmRlbF9rZXkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmlkKTsKKworCWludCAoKmFkZF9kZXYpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2UgKmxsc2VjX2Rldik7CisJaW50ICgqZGVsX2Rldikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19sZTY0IGRldl9hZGRyKTsKKworCWludCAoKmFkZF9kZXZrZXkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIF9fbGU2NCBkZXZpY2VfYWRkciwKKwkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqa2V5KTsKKwlpbnQgKCpkZWxfZGV2a2V5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBfX2xlNjQgZGV2aWNlX2FkZHIsCisJCQkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKmtleSk7CisKKwlpbnQgKCphZGRfc2VjbGV2ZWwpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgKnNsKTsKKwlpbnQgKCpkZWxfc2VjbGV2ZWwpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgKnNsKTsKKworCXZvaWQgKCpsb2NrX3RhYmxlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZ2V0X3RhYmxlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY190YWJsZSAqKnQpOworCXZvaWQgKCp1bmxvY2tfdGFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworfTsKIC8qCiAgKiBUaGlzIHNob3VsZCBiZSBsb2NhdGVkIGF0IG5ldF9kZXZpY2UtPm1sX3ByaXYKICAqCkBAIC0yNzIsNiArNDIzLDggQEAKIAl2b2lkICgqZ2V0X21hY19wYXJhbXMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxNTRfbWFjX3BhcmFtcyAqcGFyYW1zKTsKIAorCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX29wcyAqbGxzZWM7CisKIAkvKiBUaGUgZmllbGRzIGJlbG93IGFyZSByZXF1aXJlZC4gKi8KIAogCXN0cnVjdCB3cGFuX3BoeSAqKCpnZXRfcGh5KShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmggYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCmluZGV4IDNiZDIyNzkuLjg0YjIwODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9lY24uaApAQCAtMTUwLDcgKzE1MCw3IEBACiB9CiAKIC8qCi0gKiBSRkMgNjA4MCA0LjIKKyAqIFJGQyA2MDQwIDQuMgogICogIFRvIGRlY2Fwc3VsYXRlIHRoZSBpbm5lciBoZWFkZXIgYXQgdGhlIHR1bm5lbCBlZ3Jlc3MsIGEgY29tcGxpYW50CiAgKiAgdHVubmVsIGVncmVzcyBNVVNUIHNldCB0aGUgb3V0Z29pbmcgRUNOIGZpZWxkIHRvIHRoZSBjb2RlcG9pbnQgYXQgdGhlCiAgKiAgaW50ZXJzZWN0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSBhcnJpdmluZyBpbm5lciBoZWFkZXIgKHJvdykgYW5kIG91dGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCmluZGV4IDFiZGI0NzcxLi5kZDE5NTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaApAQCAtMjkyLDEyICsyOTIsMTIgQEAKICNkZWZpbmUgSU5FVF9BRERSX0NPT0tJRShfX25hbWUsIF9fc2FkZHIsIF9fZGFkZHIpIFwKIAljb25zdCBfX2FkZHJwYWlyIF9fbmFtZSA9IChfX2ZvcmNlIF9fYWRkcnBhaXIpICggXAogCQkJCSAgICgoKF9fZm9yY2UgX191NjQpKF9fYmUzMikoX19zYWRkcikpIDw8IDMyKSB8IFwKLQkJCQkgICAoKF9fZm9yY2UgX191NjQpKF9fYmUzMikoX19kYWRkcikpKTsKKwkJCQkgICAoKF9fZm9yY2UgX191NjQpKF9fYmUzMikoX19kYWRkcikpKQogI2Vsc2UgLyogX19MSVRUTEVfRU5ESUFOICovCiAjZGVmaW5lIElORVRfQUREUl9DT09LSUUoX19uYW1lLCBfX3NhZGRyLCBfX2RhZGRyKSBcCiAJY29uc3QgX19hZGRycGFpciBfX25hbWUgPSAoX19mb3JjZSBfX2FkZHJwYWlyKSAoIFwKIAkJCQkgICAoKChfX2ZvcmNlIF9fdTY0KShfX2JlMzIpKF9fZGFkZHIpKSA8PCAzMikgfCBcCi0JCQkJICAgKChfX2ZvcmNlIF9fdTY0KShfX2JlMzIpKF9fc2FkZHIpKSk7CisJCQkJICAgKChfX2ZvcmNlIF9fdTY0KShfX2JlMzIpKF9fc2FkZHIpKSkKICNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KICNkZWZpbmUgSU5FVF9NQVRDSChfX3NrLCBfX25ldCwgX19jb29raWUsIF9fc2FkZHIsIF9fZGFkZHIsIF9fcG9ydHMsIF9fZGlmKQlcCiAJKCgoX19zayktPnNrX3BvcnRwYWlyID09IChfX3BvcnRzKSkJCQkmJglcCkBAIC0zMDYsNyArMzA2LDkgQEAKIAkgICAoKF9fc2spLT5za19ib3VuZF9kZXZfaWYgPT0gKF9fZGlmKSkpIAkJJiYgCVwKIAkgbmV0X2VxKHNvY2tfbmV0KF9fc2spLCAoX19uZXQpKSkKICNlbHNlIC8qIDMyLWJpdCBhcmNoICovCi0jZGVmaW5lIElORVRfQUREUl9DT09LSUUoX19uYW1lLCBfX3NhZGRyLCBfX2RhZGRyKQorI2RlZmluZSBJTkVUX0FERFJfQ09PS0lFKF9fbmFtZSwgX19zYWRkciwgX19kYWRkcikgXAorCWNvbnN0IGludCBfX25hbWUgX19kZXByZWNhdGVkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKICNkZWZpbmUgSU5FVF9NQVRDSChfX3NrLCBfX25ldCwgX19jb29raWUsIF9fc2FkZHIsIF9fZGFkZHIsIF9fcG9ydHMsIF9fZGlmKSBcCiAJKCgoX19zayktPnNrX3BvcnRwYWlyID09IChfX3BvcnRzKSkJCSYmCQlcCiAJICgoX19zayktPnNrX2RhZGRyCT09IChfX3NhZGRyKSkJCSYmCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCmluZGV4IDE4MzNjM2YuLmIxZWRmMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfc29jay5oCkBAIC05MCw2ICs5MCw3IEBACiAJa21lbWNoZWNrX2JpdGZpZWxkX2VuZChmbGFncyk7CiAJc3RydWN0IGlwX29wdGlvbnNfcmN1CSpvcHQ7CiAJc3RydWN0IHNrX2J1ZmYJCSpwa3RvcHRzOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGlyX21hcms7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaW5ldF9yc2soY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqc2spCkBAIC05Nyw2ICs5OCwxNSBAQAogCXJldHVybiAoc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICopc2s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIGluZXRfcmVxdWVzdF9tYXJrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIXNrLT5za19tYXJrICYmIHNvY2tfbmV0KHNrKS0+aXB2NC5zeXNjdGxfdGNwX2Z3bWFya19hY2NlcHQpIHsKKwkJcmV0dXJuIHNrYi0+bWFyazsKKwl9IGVsc2UgeworCQlyZXR1cm4gc2stPnNrX21hcms7CisJfQorfQorCiBzdHJ1Y3QgaW5ldF9jb3JrIHsKIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwogCV9fYmUzMgkJCWFkZHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaAppbmRleCAwNTgyNzFiLi4wMWQ1OTBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKQEAgLTQxLDE0ICs0MSwxMyBAQAogCQlzdHJ1Y3QgcmN1X2hlYWQgICAgIGdjX3JjdTsKIAl9OwogCS8qCi0JICogT25jZSBpbmV0X3BlZXIgaXMgcXVldWVkIGZvciBkZWxldGlvbiAocmVmY250ID09IC0xKSwgZm9sbG93aW5nIGZpZWxkcwotCSAqIGFyZSBub3QgYXZhaWxhYmxlOiByaWQsIGlwX2lkX2NvdW50CisJICogT25jZSBpbmV0X3BlZXIgaXMgcXVldWVkIGZvciBkZWxldGlvbiAocmVmY250ID09IC0xKSwgZm9sbG93aW5nIGZpZWxkCisJICogaXMgbm90IGF2YWlsYWJsZTogcmlkCiAJICogV2UgY2FuIHNoYXJlIG1lbW9yeSB3aXRoIHJjdV9oZWFkIHRvIGhlbHAga2VlcCBpbmV0X3BlZXIgc21hbGwuCiAJICovCiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJYXRvbWljX3QJCQlyaWQ7CQkvKiBGcmFnIHJlY2VwdGlvbiBjb3VudGVyICovCi0JCQlhdG9taWNfdAkJCWlwX2lkX2NvdW50OwkvKiBJUCBJRCBmb3IgdGhlIG5leHQgcGFja2V0ICovCiAJCX07CiAJCXN0cnVjdCByY3VfaGVhZCAgICAgICAgIHJjdTsKIAkJc3RydWN0IGluZXRfcGVlcgkqZ2NfbmV4dDsKQEAgLTE2NSwyMSArMTY0LDExIEBACiB2b2lkIGluZXRwZWVyX2ludmFsaWRhdGVfdHJlZShzdHJ1Y3QgaW5ldF9wZWVyX2Jhc2UgKik7CiAKIC8qCi0gKiB0ZW1wb3JhcnkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbnQgYWNjZXNzIHJpZCwgaXBfaWRfY291bnQsIHRjcF90cywKKyAqIHRlbXBvcmFyeSBjaGVjayB0byBtYWtlIHN1cmUgd2UgZG9udCBhY2Nlc3MgcmlkLCB0Y3BfdHMsCiAgKiB0Y3BfdHNfc3RhbXAgaWYgbm8gcmVmY291bnQgaXMgdGFrZW4gb24gaW5ldF9wZWVyCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X3BlZXJfcmVmY2hlY2soY29uc3Qgc3RydWN0IGluZXRfcGVlciAqcCkKIHsKIAlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnAtPnJlZmNudCkgPD0gMCk7CiB9Ci0KLQotLyogY2FuIGJlIGNhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbG9jYWwgQkggYmVpbmcgZGlzYWJsZWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfZ2V0aWQoc3RydWN0IGluZXRfcGVlciAqcCwgaW50IG1vcmUpCi17Ci0JbW9yZSsrOwotCWluZXRfcGVlcl9yZWZjaGVjayhwKTsKLQlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4obW9yZSwgJnAtPmlwX2lkX2NvdW50KSAtIG1vcmU7Ci19Ci0KICNlbmRpZiAvKiBfTkVUX0lORVRQRUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwLmggYi9pbmNsdWRlL25ldC9pcC5oCmluZGV4IDNlYzJiMGYuLjBlNzk1ZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXAuaApAQCAtMTk2LDM1ICsxOTYsMzEgQEAKICNkZWZpbmUgTkVUX0FERF9TVEFUU19CSChuZXQsIGZpZWxkLCBhZG5kKSBTTk1QX0FERF9TVEFUU19CSCgobmV0KS0+bWliLm5ldF9zdGF0aXN0aWNzLCBmaWVsZCwgYWRuZCkKICNkZWZpbmUgTkVUX0FERF9TVEFUU19VU0VSKG5ldCwgZmllbGQsIGFkbmQpIFNOTVBfQUREX1NUQVRTX1VTRVIoKG5ldCktPm1pYi5uZXRfc3RhdGlzdGljcywgZmllbGQsIGFkbmQpCiAKLXVuc2lnbmVkIGxvbmcgc25tcF9mb2xkX2ZpZWxkKHZvaWQgX19wZXJjcHUgKm1pYltdLCBpbnQgb2ZmdCk7Cit1bnNpZ25lZCBsb25nIHNubXBfZm9sZF9maWVsZCh2b2lkIF9fcGVyY3B1ICptaWIsIGludCBvZmZ0KTsKICNpZiBCSVRTX1BFUl9MT05HPT0zMgotdTY0IHNubXBfZm9sZF9maWVsZDY0KHZvaWQgX19wZXJjcHUgKm1pYltdLCBpbnQgb2ZmdCwgc2l6ZV90IHN5bmNfb2ZmKTsKK3U2NCBzbm1wX2ZvbGRfZmllbGQ2NCh2b2lkIF9fcGVyY3B1ICptaWIsIGludCBvZmZ0LCBzaXplX3Qgc3luY19vZmYpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdTY0IHNubXBfZm9sZF9maWVsZDY0KHZvaWQgX19wZXJjcHUgKm1pYltdLCBpbnQgb2ZmdCwgc2l6ZV90IHN5bmNwX29mZikKK3N0YXRpYyBpbmxpbmUgdTY0IHNubXBfZm9sZF9maWVsZDY0KHZvaWQgX19wZXJjcHUgKm1pYiwgaW50IG9mZnQsIHNpemVfdCBzeW5jcF9vZmYpCiB7CiAJcmV0dXJuIHNubXBfZm9sZF9maWVsZChtaWIsIG9mZnQpOwogfQogI2VuZGlmCi1pbnQgc25tcF9taWJfaW5pdCh2b2lkIF9fcGVyY3B1ICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgYWxpZ24pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc25tcF9taWJfZnJlZSh2b2lkIF9fcGVyY3B1ICpwdHJbU05NUF9BUlJBWV9TWl0pCi17Ci0JaW50IGk7Ci0KLQlCVUdfT04ocHRyID09IE5VTEwpOwotCWZvciAoaSA9IDA7IGkgPCBTTk1QX0FSUkFZX1NaOyBpKyspIHsKLQkJZnJlZV9wZXJjcHUocHRyW2ldKTsKLQkJcHRyW2ldID0gTlVMTDsKLQl9Ci19CiAKIHZvaWQgaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIGludCAqbG93LCBpbnQgKmhpZ2gpOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyAqc3lzY3RsX2xvY2FsX3Jlc2VydmVkX3BvcnRzOwotc3RhdGljIGlubGluZSBpbnQgaW5ldF9pc19yZXNlcnZlZF9sb2NhbF9wb3J0KGludCBwb3J0KQorI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyBpbmxpbmUgaW50IGluZXRfaXNfbG9jYWxfcmVzZXJ2ZWRfcG9ydChzdHJ1Y3QgbmV0ICpuZXQsIGludCBwb3J0KQogewotCXJldHVybiB0ZXN0X2JpdChwb3J0LCBzeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMpOworCWlmICghbmV0LT5pcHY0LnN5c2N0bF9sb2NhbF9yZXNlcnZlZF9wb3J0cykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRlc3RfYml0KHBvcnQsIG5ldC0+aXB2NC5zeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMpOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGluZXRfaXNfbG9jYWxfcmVzZXJ2ZWRfcG9ydChzdHJ1Y3QgbmV0ICpuZXQsIGludCBwb3J0KQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKIGV4dGVybiBpbnQgc3lzY3RsX2lwX25vbmxvY2FsX2JpbmQ7CiAKQEAgLTI0Myw2ICsyMzksOSBAQAogCiB2b2lkIGlwX3N0YXRpY19zeXNjdGxfaW5pdCh2b2lkKTsKIAorI2RlZmluZSBJUDRfUkVQTFlfTUFSSyhuZXQsIG1hcmspIFwKKwkoKG5ldCktPmlwdjQuc3lzY3RsX2Z3bWFya19yZWZsZWN0ID8gKG1hcmspIDogMCkKKwogc3RhdGljIGlubGluZSBib29sIGlwX2lzX2ZyYWdtZW50KGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoKQogewogCXJldHVybiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgIT0gMDsKQEAgLTI4MSw3ICsyODAsNyBAQAogCXJldHVybiBpbmV0X3NrKHNrKS0+cG10dWRpc2MgPCBJUF9QTVRVRElTQ19QUk9CRTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlwX3NrX2xvY2FsX2RmKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBpbmxpbmUgYm9vbCBpcF9za19pZ25vcmVfZGYoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQogewogCXJldHVybiBpbmV0X3NrKHNrKS0+cG10dWRpc2MgPCBJUF9QTVRVRElTQ19ETyB8fAogCSAgICAgICBpbmV0X3NrKHNrKS0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfT01JVDsKQEAgLTMxMCwzNiArMzA5LDQ4IEBACiAJfQogfQogCi12b2lkIF9faXBfc2VsZWN0X2lkZW50KHN0cnVjdCBpcGhkciAqaXBoLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIGludCBtb3JlKTsKKyNkZWZpbmUgSVBfSURFTlRTX1NaIDIwNDh1CitleHRlcm4gYXRvbWljX3QgKmlwX2lkZW50czsKIAotc3RhdGljIGlubGluZSB2b2lkIGlwX3NlbGVjdF9pZGVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBpbmxpbmUgdTMyIGlwX2lkZW50c19yZXNlcnZlKHUzMiBoYXNoLCBpbnQgc2VncykKK3sKKwlhdG9taWNfdCAqaWRfcHRyID0gaXBfaWRlbnRzICsgaGFzaCAlIElQX0lERU5UU19TWjsKKworCXJldHVybiBhdG9taWNfYWRkX3JldHVybihzZWdzLCBpZF9wdHIpIC0gc2VnczsKK30KKwordm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCwgaW50IHNlZ3MpOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfc2VsZWN0X2lkZW50X3NlZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLCBpbnQgc2VncykKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCi0JaWYgKChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiAhc2tiLT5sb2NhbF9kZikgeworCWlmICgoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgJiYgIXNrYi0+aWdub3JlX2RmKSB7CiAJCS8qIFRoaXMgaXMgb25seSB0byB3b3JrIGFyb3VuZCBidWdneSBXaW5kb3dzOTUvMjAwMAogCQkgKiBWSiBjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvbnMuICBJZiB0aGUgSUQgZmllbGQKIAkJICogZG9lcyBub3QgY2hhbmdlLCB0aGV5IGRyb3AgZXZlcnkgb3RoZXIgcGFja2V0IGluCiAJCSAqIGEgVENQIHN0cmVhbSB1c2luZyBoZWFkZXIgY29tcHJlc3Npb24uCiAJCSAqLwotCQlpcGgtPmlkID0gKHNrICYmIGluZXRfc2soc2spLT5pbmV0X2RhZGRyKSA/Ci0JCQkJCWh0b25zKGluZXRfc2soc2spLT5pbmV0X2lkKyspIDogMDsKLQl9IGVsc2UKLQkJX19pcF9zZWxlY3RfaWRlbnQoaXBoLCBkc3QsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfc2VsZWN0X2lkZW50X21vcmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KLQlpZiAoKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpICYmICFza2ItPmxvY2FsX2RmKSB7CiAJCWlmIChzayAmJiBpbmV0X3NrKHNrKS0+aW5ldF9kYWRkcikgewogCQkJaXBoLT5pZCA9IGh0b25zKGluZXRfc2soc2spLT5pbmV0X2lkKTsKLQkJCWluZXRfc2soc2spLT5pbmV0X2lkICs9IDEgKyBtb3JlOwotCQl9IGVsc2UKKwkJCWluZXRfc2soc2spLT5pbmV0X2lkICs9IHNlZ3M7CisJCX0gZWxzZSB7CiAJCQlpcGgtPmlkID0gMDsKLQl9IGVsc2UKLQkJX19pcF9zZWxlY3RfaWRlbnQoaXBoLCBkc3QsIG1vcmUpOworCQl9CisJfSBlbHNlIHsKKwkJX19pcF9zZWxlY3RfaWRlbnQoaXBoLCBzZWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF9zZWxlY3RfaWRlbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQoreworCWlwX3NlbGVjdF9pZGVudF9zZWdzKHNrYiwgc2ssIDEpOworfQorCitzdGF0aWMgaW5saW5lIF9fd3N1bSBpbmV0X2NvbXB1dGVfcHNldWRvKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKK3sKKwlyZXR1cm4gY3N1bV90Y3B1ZHBfbm9mb2xkKGlwX2hkcihza2IpLT5zYWRkciwgaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCSAgc2tiLT5sZW4sIHByb3RvLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9jaGVja3N1bS5oIGIvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKaW5kZXggOWUzYzU0MC4uNTUyMzZjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKQEAgLTQxLDYgKzQxLDEzIEBACiAJCQlfX3dzdW0gY3N1bSk7CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBfX3dzdW0gaXA2X2NvbXB1dGVfcHNldWRvKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKK3sKKwlyZXR1cm4gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSAgICBza2ItPmxlbiwgcHJvdG8sIDApKTsKK30KKwogc3RhdGljIF9faW5saW5lX18gX19zdW0xNiB0Y3BfdjZfY2hlY2soaW50IGxlbiwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCkBAIC03NSw1ICs4MiwxNyBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiB1ZHBfdjZfY2hlY2soaW50IGxlbiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJICAgX193c3VtIGJhc2UpCit7CisJcmV0dXJuIGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIGxlbiwgSVBQUk9UT19VRFAsIGJhc2UpOworfQorCit2b2lkIHVkcDZfc2V0X2NzdW0oYm9vbCBub2NoZWNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBpbnQgbGVuKTsKKwogaW50IHVkcDZfY3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoLCBpbnQgcHJvdG8pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaCBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCmluZGV4IDIxNmNlY2MuLjFkMDliNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCkBAIC0xODYsNyArMTg2LDcgQEAKIAkgICAgICAgaW5ldDZfc2soc2spLT5wbXR1ZGlzYyAhPSBJUFY2X1BNVFVESVNDX09NSVQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpcDZfc2tfbG9jYWxfZGYoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIGlubGluZSBib29sIGlwNl9za19pZ25vcmVfZGYoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQogewogCXJldHVybiBpbmV0Nl9zayhzayktPnBtdHVkaXNjIDwgSVBWNl9QTVRVRElTQ19ETyB8fAogCSAgICAgICBpbmV0Nl9zayhzayktPnBtdHVkaXNjID09IElQVjZfUE1UVURJU0NfT01JVDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwdjYuaCBiL2luY2x1ZGUvbmV0L2lwdjYuaAppbmRleCBkNjQwOTI1Li41NzQzMzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC0xMTMsNiArMTEzLDkgQEAKICNkZWZpbmUJSVA2X01GCQkweDAwMDEKICNkZWZpbmUJSVA2X09GRlNFVAkweEZGRjgKIAorI2RlZmluZSBJUDZfUkVQTFlfTUFSSyhuZXQsIG1hcmspIFwKKwkoKG5ldCktPmlwdjYuc3lzY3RsLmZ3bWFya19yZWZsZWN0ID8gKG1hcmspIDogMCkKKwogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKIC8qIHN5c2N0bHMgKi8KQEAgLTU4Myw2ICs1ODYsMTEgQEAKIAlyZXR1cm4gKGEtPnM2X2FkZHIzMlswXSAmIGh0b25sKDB4ZmZmZmZmZjApKSA9PSBodG9ubCgweDIwMDEwMDEwKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXJldHVybiAoYWRkci0+czZfYWRkcjMyWzBdICYgaHRvbmwoMHhGRjAwMDAwMCkpID09IGh0b25sKDB4RkYwMDAwMDApOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaXB2Nl9hZGRyX3NldF92NG1hcHBlZChjb25zdCBfX2JlMzIgYWRkciwKIAkJCQkJICBzdHJ1Y3QgaW42X2FkZHIgKnY0bWFwcGVkKQogewpAQCAtNjYwLDEwICs2NjgsMjIgQEAKIAlyZXR1cm4gX19pcHY2X2FkZHJfZGlmZihhMSwgYTIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKIH0KIAotdm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIsIHN0cnVjdCBydDZfaW5mbyAqcnQpOwotCiBpbnQgaXA2X2RzdF9ob3BsaW1pdChzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCitzdGF0aWMgaW5saW5lIGludCBpcDZfc2tfZHN0X2hvcGxpbWl0KHN0cnVjdCBpcHY2X3BpbmZvICpucCwgc3RydWN0IGZsb3dpNiAqZmw2LAorCQkJCSAgICAgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlpbnQgaGxpbWl0OworCisJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsNi0+ZGFkZHIpKQorCQlobGltaXQgPSBucC0+bWNhc3RfaG9wczsKKwllbHNlCisJCWhsaW1pdCA9IG5wLT5ob3BfbGltaXQ7CisJaWYgKGhsaW1pdCA8IDApCisJCWhsaW1pdCA9IGlwNl9kc3RfaG9wbGltaXQoZHN0KTsKKwlyZXR1cm4gaGxpbWl0OworfQorCiAvKgogICoJSGVhZGVyIG1hbmlwdWxhdGlvbgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAppbmRleCA4MjQ4ZTM5Li40MjFiNmVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKQEAgLTE4OSw2ICsxODksNDMgQEAKIH07CiAKIC8qKgorICogZW51bSBpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hfbW9kZSAtIGNoYW5uZWwgY29udGV4dCBzd2l0Y2ggbW9kZQorICogQENIQU5DVFhfU1dNT0RFX1JFQVNTSUdOX1ZJRjogQm90aCBvbGQgYW5kIG5ldyBjb250ZXh0cyBhbHJlYWR5CisgKglleGlzdCAoYW5kIHdpbGwgY29udGludWUgdG8gZXhpc3QpLCBidXQgdGhlIHZpcnR1YWwgaW50ZXJmYWNlCisgKgluZWVkcyB0byBiZSBzd2l0Y2hlZCBmcm9tIG9uZSB0byB0aGUgb3RoZXIuCisgKiBAQ0hBTkNUWF9TV01PREVfU1dBUF9DT05URVhUUzogVGhlIG9sZCBjb250ZXh0IGV4aXN0cyBidXQgd2lsbCBzdG9wCisgKiAgICAgIHRvIGV4aXN0IHdpdGggdGhpcyBjYWxsLCB0aGUgbmV3IGNvbnRleHQgZG9lc24ndCBleGlzdCBidXQKKyAqICAgICAgd2lsbCBiZSBhY3RpdmUgYWZ0ZXIgdGhpcyBjYWxsLCB0aGUgdmlydHVhbCBpbnRlcmZhY2Ugc3dpdGNoZXMKKyAqICAgICAgZnJvbSB0aGUgb2xkIHRvIHRoZSBuZXcgKG5vdGUgdGhhdCB0aGUgZHJpdmVyIG1heSBvZiBjb3Vyc2UKKyAqICAgICAgaW1wbGVtZW50IHRoaXMgYXMgYW4gb24tdGhlLWZseSBjaGFuZGVmIHN3aXRjaCBvZiB0aGUgZXhpc3RpbmcKKyAqICAgICAgaGFyZHdhcmUgY29udGV4dCwgYnV0IHRoZSBtYWM4MDIxMSBwb2ludGVyIGZvciB0aGUgb2xkIGNvbnRleHQKKyAqICAgICAgd2lsbCBjZWFzZSB0byBleGlzdCBhbmQgb25seSB0aGUgbmV3IG9uZSB3aWxsIGxhdGVyIGJlIHVzZWQKKyAqICAgICAgZm9yIGNoYW5nZXMvcmVtb3ZhbC4pCisgKi8KK2VudW0gaWVlZTgwMjExX2NoYW5jdHhfc3dpdGNoX21vZGUgeworCUNIQU5DVFhfU1dNT0RFX1JFQVNTSUdOX1ZJRiwKKwlDSEFOQ1RYX1NXTU9ERV9TV0FQX0NPTlRFWFRTLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaWVlZTgwMjExX3ZpZl9jaGFuY3R4X3N3aXRjaCAtIHZpZiBjaGFuY3R4IHN3aXRjaCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBhYm91dCBhIHZpZiB0aGF0CisgKiBuZWVkcyB0byBzd2l0Y2ggZnJvbSBvbmUgY2hhbmN0eCB0byBhbm90aGVyLiAgVGhlCisgKiAmaWVlZTgwMjExX2NoYW5jdHhfc3dpdGNoX21vZGUgZGVmaW5lcyBob3cgdGhlIHN3aXRjaCBzaG91bGQgYmUKKyAqIGRvbmUuCisgKgorICogQHZpZjogdGhlIHZpZiB0aGF0IHNob3VsZCBiZSBzd2l0Y2hlZCBmcm9tIG9sZF9jdHggdG8gbmV3X2N0eAorICogQG9sZF9jdHg6IHRoZSBvbGQgY29udGV4dCB0byB3aGljaCB0aGUgdmlmIHdhcyBhc3NpZ25lZAorICogQG5ld19jdHg6IHRoZSBuZXcgY29udGV4dCB0byB3aGljaCB0aGUgdmlmIG11c3QgYmUgYXNzaWduZWQKKyAqLworc3RydWN0IGllZWU4MDIxMV92aWZfY2hhbmN0eF9zd2l0Y2ggeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKm9sZF9jdHg7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKm5ld19jdHg7Cit9OworCisvKioKICAqIGVudW0gaWVlZTgwMjExX2Jzc19jaGFuZ2UgLSBCU1MgY2hhbmdlIG5vdGlmaWNhdGlvbiBmbGFncwogICoKICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdpdGggdGhlIGJzc19pbmZvX2NoYW5nZWQoKSBjYWxsYmFjawpAQCAtMTExMyw3ICsxMTUwLDkgQEAKICAqIEBhZGRyOiBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlCiAgKiBAcDJwOiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIEFQIG9yIFNUQSBpbnRlcmZhY2UgaXMgYSBwMnAKICAqCWludGVyZmFjZSwgaS5lLiBhIEdPIG9yIHAycC1zdGEgcmVzcGVjdGl2ZWx5Ci0gKiBAY3NhX2FjdGl2ZTogbWFya3Mgd2hldGhlciBhIGNoYW5uZWwgc3dpdGNoIGlzIGdvaW5nIG9uCisgKiBAY3NhX2FjdGl2ZTogbWFya3Mgd2hldGhlciBhIGNoYW5uZWwgc3dpdGNoIGlzIGdvaW5nIG9uLiBJbnRlcm5hbGx5IGl0IGlzCisgKgl3cml0ZS1wcm90ZWN0ZWQgYnkgc2RhdGFfbG9jayBhbmQgbG9jYWwtPm10eCBzbyBob2xkaW5nIGVpdGhlciBpcyBmaW5lCisgKglmb3IgcmVhZCBhY2Nlc3MuCiAgKiBAZHJpdmVyX2ZsYWdzOiBmbGFncy9jYXBhYmlsaXRpZXMgdGhlIGRyaXZlciBoYXMgZm9yIHRoaXMgaW50ZXJmYWNlLAogICoJdGhlc2UgbmVlZCB0byBiZSBzZXQgKG9yIGNsZWFyZWQpIHdoZW4gdGhlIGludGVyZmFjZSBpcyBhZGRlZAogICoJb3IsIGlmIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLCB0aGUgaW50ZXJmYWNlIHR5cGUgaXMgY2hhbmdlZApAQCAtMTIwMiwxNCArMTI0MSwxOCBAQAogICoJZmFsbCBiYWNrIHRvIHNvZnR3YXJlIGNyeXB0by4gTm90ZSB0aGF0IHRoaXMgZmxhZyBkZWFscyBvbmx5IHdpdGgKICAqCVJYLCBpZiB5b3VyIGNyeXB0byBlbmdpbmUgY2FuJ3QgZGVhbCB3aXRoIFRYIHlvdSBjYW4gYWxzbyBzZXQgdGhlCiAgKgklSUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVRfVFggZmxhZyB0byBlbmNyeXB0IHN1Y2ggZnJhbWVzIGluIFNXLgorICogQElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVl9NR01UOiBUaGlzIGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUKKyAqCWRyaXZlciBmb3IgYSBDQ01QIGtleSB0byBpbmRpY2F0ZSB0aGF0IGlzIHJlcXVpcmVzIElWIGdlbmVyYXRpb24KKyAqCW9ubHkgZm9yIG1hbmFnbWVudCBmcmFtZXMgKE1GUCkuCiAgKi8KIGVudW0gaWVlZTgwMjExX2tleV9mbGFncyB7Ci0JSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWCT0gMTw8MSwKLQlJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQz0gMTw8MiwKLQlJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UJPSAxPDwzLAotCUlFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RYCT0gMTw8NCwKLQlJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFID0gMTw8NSwKLQlJRUVFODAyMTFfS0VZX0ZMQUdfUlhfTUdNVAk9IDE8PDYsCisJSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWX01HTVQJPSBCSVQoMCksCisJSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWCQk9IEJJVCgxKSwKKwlJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQwk9IEJJVCgyKSwKKwlJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UJCT0gQklUKDMpLAorCUlFRUU4MDIxMV9LRVlfRkxBR19TV19NR01UX1RYCQk9IEJJVCg0KSwKKwlJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFCQk9IEJJVCg1KSwKKwlJRUVFODAyMTFfS0VZX0ZMQUdfUlhfTUdNVAkJPSBCSVQoNiksCiB9OwogCiAvKioKQEAgLTEzNzAsNiArMTQxMyw3IEBACiAgKgl0aGUgc3RhdGlvbiBtb3ZlcyB0byBhc3NvY2lhdGVkIHN0YXRlLgogICogQHNtcHNfbW9kZTogY3VycmVudCBTTVBTIG1vZGUgKG9mZiwgc3RhdGljIG9yIGR5bmFtaWMpCiAgKiBAcmF0ZXM6IHJhdGUgY29udHJvbCBzZWxlY3Rpb24gdGFibGUKKyAqIEB0ZGxzOiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU1RBIGlzIGEgVERMUyBwZWVyCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfc3RhIHsKIAl1MzIgc3VwcF9yYXRlc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKQEAgLTEzODQsNiArMTQyOCw3IEBACiAJZW51bSBpZWVlODAyMTFfc3RhX3J4X2JhbmR3aWR0aCBiYW5kd2lkdGg7CiAJZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHNtcHNfbW9kZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9yYXRlcyBfX3JjdSAqcmF0ZXM7CisJYm9vbCB0ZGxzOwogCiAJLyogbXVzdCBiZSBsYXN0ICovCiAJdTggZHJ2X3ByaXZbMF0gX19hbGlnbmVkKHNpemVvZih2b2lkICopKTsKQEAgLTE1NTUsNiArMTYwMCwxMiBAQAogICoJZm9yIGEgc2luZ2xlIGFjdGl2ZSBjaGFubmVsIHdoaWxlIHVzaW5nIGNoYW5uZWwgY29udGV4dHMuIFdoZW4gc3VwcG9ydAogICoJaXMgbm90IGVuYWJsZWQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIGRpc2Nvbm5lY3Qgd2hlbiBnZXR0aW5nIHRoZQogICoJQ1NBIGZyYW1lLgorICoKKyAqIEBJRUVFODAyMTFfSFdfQ0hBTkdFX1JVTk5JTkdfQ0hBTkNUWDogVGhlIGhhcmR3YXJlIGNhbiBjaGFuZ2UgYQorICoJY2hhbm5lbCBjb250ZXh0IG9uLXRoZS1mbHkuICBUaGlzIGlzIG5lZWRlZCBmb3IgY2hhbm5lbCBzd2l0Y2gKKyAqCW9uIHNpbmdsZS1jaGFubmVsIGhhcmR3YXJlLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBhcyBhbgorICoJb3B0aW1pemF0aW9uIGluIGNlcnRhaW4gY2hhbm5lbCBzd2l0Y2ggY2FzZXMgd2l0aAorICoJbXVsdGktY2hhbm5lbC4KICAqLwogZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgewogCUlFRUU4MDIxMV9IV19IQVNfUkFURV9DT05UUk9MCQkJPSAxPDwwLApAQCAtMTU4Niw2ICsxNjM3LDcgQEAKIAlJRUVFODAyMTFfSFdfVElNSU5HX0JFQUNPTl9PTkxZCQkJPSAxPDwyNiwKIAlJRUVFODAyMTFfSFdfU1VQUE9SVFNfSFRfQ0NLX1JBVEVTCQk9IDE8PDI3LAogCUlFRUU4MDIxMV9IV19DSEFOQ1RYX1NUQV9DU0EJCQk9IDE8PDI4LAorCUlFRUU4MDIxMV9IV19DSEFOR0VfUlVOTklOR19DSEFOQ1RYCQk9IDE8PDI5LAogfTsKIAogLyoqCkBAIC0yNjA5LDYgKzI2NjEsNyBAQAogICoJb2YgcXVldWVzIHRvIGZsdXNoLCB3aGljaCBpcyB1c2VmdWwgaWYgZGlmZmVyZW50IHZpcnR1YWwgaW50ZXJmYWNlcwogICoJdXNlIGRpZmZlcmVudCBoYXJkd2FyZSBxdWV1ZXM7IGl0IG1heSBhbHNvIGluZGljYXRlIGFsbCBxdWV1ZXMuCiAgKglJZiB0aGUgcGFyYW1ldGVyIEBkcm9wIGlzIHNldCB0byAldHJ1ZSwgcGVuZGluZyBmcmFtZXMgbWF5IGJlIGRyb3BwZWQuCisgKglOb3RlIHRoYXQgdmlmIGNhbiBiZSBOVUxMLgogICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICAqCiAgKiBAY2hhbm5lbF9zd2l0Y2g6IERyaXZlcnMgdGhhdCBuZWVkIChvciB3YW50KSB0byBvZmZsb2FkIHRoZSBjaGFubmVsCkBAIC0yNzIwLDYgKzI3NzMsMTEgQEAKICAqCXRvIHZpZi4gUG9zc2libGUgdXNlIGlzIGZvciBodyBxdWV1ZSByZW1hcHBpbmcuCiAgKiBAdW5hc3NpZ25fdmlmX2NoYW5jdHg6IE5vdGlmaWVzIGRldmljZSBkcml2ZXIgYWJvdXQgY2hhbm5lbCBjb250ZXh0IGJlaW5nCiAgKgl1bmJvdW5kIGZyb20gdmlmLgorICogQHN3aXRjaF92aWZfY2hhbmN0eDogc3dpdGNoIGEgbnVtYmVyIG9mIHZpZnMgZnJvbSBvbmUgY2hhbmN0eCB0bworICoJYW5vdGhlciwgYXMgc3BlY2lmaWVkIGluIHRoZSBsaXN0IG9mCisgKglAaWVlZTgwMjExX3ZpZl9jaGFuY3R4X3N3aXRjaCBwYXNzZWQgdG8gdGhlIGRyaXZlciwgYWNjb3JkaW5nCisgKgl0byB0aGUgbW9kZSBkZWZpbmVkIGluICZpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hfbW9kZS4KKyAqCiAgKiBAc3RhcnRfYXA6IFN0YXJ0IG9wZXJhdGlvbiBvbiB0aGUgQVAgaW50ZXJmYWNlLCB0aGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlCiAgKglpbmZvcm1hdGlvbiBpbiBic3NfY29uZiBpcyBzZXQgYW5kIGJlYWNvbiBjYW4gYmUgcmV0cmlldmVkLiBBIGNoYW5uZWwKICAqCWNvbnRleHQgaXMgYm91bmQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLiBOb3RlIHRoYXQgaWYgdGhlIGRyaXZlciB1c2VzCkBAIC0yNzUzLDYgKzI4MTEsMTAgQEAKICAqCWluZm9ybWF0aW9uIGluIGJzc19jb25mIGlzIHNldCB1cCBhbmQgdGhlIGJlYWNvbiBjYW4gYmUgcmV0cmlldmVkLiBBCiAgKgljaGFubmVsIGNvbnRleHQgaXMgYm91bmQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgogICogQGxlYXZlX2lic3M6IExlYXZlIHRoZSBJQlNTIGFnYWluLgorICoKKyAqIEBnZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dDogZXh0cmFjdCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCB0b3dhcmRzIHRoZQorICoJc3BlY2lmaWVkIHN0YXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBleHByZXNzZWQgaW4gS2Jwcy4gSXQgcmV0dXJucyAwCisgKglpZiB0aGUgUkMgYWxnb3JpdGhtIGRvZXMgbm90IGhhdmUgcHJvcGVyIGRhdGEgdG8gcHJvdmlkZS4KICAqLwogc3RydWN0IGllZWU4MDIxMV9vcHMgewogCXZvaWQgKCp0eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yODcxLDcgKzI5MzMsOCBAQAogCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCQkgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pOwogI2VuZGlmCi0Jdm9pZCAoKmZsdXNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKTsKKwl2b2lkICgqZmx1c2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICB1MzIgcXVldWVzLCBib29sIGRyb3ApOwogCXZvaWQgKCpjaGFubmVsX3N3aXRjaCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKIAlpbnQgKCpzZXRfYW50ZW5uYSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB0eF9hbnQsIHUzMiByeF9hbnQpOwpAQCAtMjkzMSw2ICsyOTk0LDEwIEBACiAJdm9pZCAoKnVuYXNzaWduX3ZpZl9jaGFuY3R4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY3R4KTsKKwlpbnQgKCpzd2l0Y2hfdmlmX2NoYW5jdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWZfY2hhbmN0eF9zd2l0Y2ggKnZpZnMsCisJCQkJICBpbnQgbl92aWZzLAorCQkJCSAgZW51bSBpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hfbW9kZSBtb2RlKTsKIAogCXZvaWQgKCpyZXN0YXJ0X2NvbXBsZXRlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAKQEAgLTI5NDUsNiArMzAxMiw3IEBACiAKIAlpbnQgKCpqb2luX2lic3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAl2b2lkICgqbGVhdmVfaWJzcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCXUzMiAoKmdldF9leHBlY3RlZF90aHJvdWdocHV0KShzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKIH07CiAKIC8qKgpAQCAtMzM5NCw2ICszNDYyLDQ3IEBACiAgKi8KIHZvaWQgaWVlZTgwMjExX3JlcG9ydF9sb3dfYWNrKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBudW1fcGFja2V0cyk7CiAKKyNkZWZpbmUgSUVFRTgwMjExX01BWF9DU0FfQ09VTlRFUlNfTlVNIDIKKworLyoqCisgKiBzdHJ1Y3QgaWVlZTgwMjExX211dGFibGVfb2Zmc2V0cyAtIG11dGFibGUgYmVhY29uIG9mZnNldHMKKyAqIEB0aW1fb2Zmc2V0OiBwb3NpdGlvbiBvZiBUSU0gZWxlbWVudAorICogQHRpbV9sZW5ndGg6IHNpemUgb2YgVElNIGVsZW1lbnQKKyAqIEBjc2FfY291bnRlcl9vZmZzOiBhcnJheSBvZiBJRUVFODAyMTFfTUFYX0NTQV9DT1VOVEVSU19OVU0gb2Zmc2V0cworICoJdG8gQ1NBIGNvdW50ZXJzLiAgVGhpcyBhcnJheSBjYW4gY29udGFpbiB6ZXJvIHZhbHVlcyB3aGljaAorICoJc2hvdWxkIGJlIGlnbm9yZWQuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfbXV0YWJsZV9vZmZzZXRzIHsKKwl1MTYgdGltX29mZnNldDsKKwl1MTYgdGltX2xlbmd0aDsKKworCXUxNiBjc2FfY291bnRlcl9vZmZzW0lFRUU4MDIxMV9NQVhfQ1NBX0NPVU5URVJTX05VTV07Cit9OworCisvKioKKyAqIGllZWU4MDIxMV9iZWFjb25fZ2V0X3RlbXBsYXRlIC0gYmVhY29uIHRlbXBsYXRlIGdlbmVyYXRpb24gZnVuY3Rpb24KKyAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqIEBvZmZzOiAmc3RydWN0IGllZWU4MDIxMV9tdXRhYmxlX29mZnNldHMgcG9pbnRlciB0byBzdHJ1Y3QgdGhhdCB3aWxsCisgKglyZWNlaXZlIHRoZSBvZmZzZXRzIHRoYXQgbWF5IGJlIHVwZGF0ZWQgYnkgdGhlIGRyaXZlci4KKyAqCisgKiBJZiB0aGUgZHJpdmVyIGltcGxlbWVudHMgYmVhY29uaW5nIG1vZGVzLCBpdCBtdXN0IHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgKiBvYnRhaW4gdGhlIGJlYWNvbiB0ZW1wbGF0ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBiZWFjb24gZnJhbWVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlCisgKiBkZXZpY2UsIGFuZCB0aGVuIHRoZSBkcml2ZXIgbXVzdCB1c2UgdGhlIHJldHVybmVkIGJlYWNvbiBhcyB0aGUgdGVtcGxhdGUKKyAqIFRoZSBkcml2ZXIgb3IgdGhlIGRldmljZSBhcmUgcmVzcG9uc2libGUgdG8gdXBkYXRlIHRoZSBEVElNIGFuZCwgd2hlbgorICogYXBwbGljYWJsZSwgdGhlIENTQSBjb3VudC4KKyAqCisgKiBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBza2IuCisgKgorICogUmV0dXJuOiBUaGUgYmVhY29uIHRlbXBsYXRlLiAlTlVMTCBvbiBlcnJvci4KKyAqLworc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2JlYWNvbl9nZXRfdGVtcGxhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9tdXRhYmxlX29mZnNldHMgKm9mZnMpOworCiAvKioKICAqIGllZWU4MDIxMV9iZWFjb25fZ2V0X3RpbSAtIGJlYWNvbiBnZW5lcmF0aW9uIGZ1bmN0aW9uCiAgKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKS4KQEAgLTM0MDUsMTYgKzM1MTQsMTIgQEAKICAqCVNldCB0byAwIGlmIGludmFsaWQgKGluIG5vbi1BUCBtb2RlcykuCiAgKgogICogSWYgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGJlYWNvbmluZyBtb2RlcywgaXQgbXVzdCB1c2UgdGhpcyBmdW5jdGlvbiB0bwotICogb2J0YWluIHRoZSBiZWFjb24gZnJhbWUvdGVtcGxhdGUuCisgKiBvYnRhaW4gdGhlIGJlYWNvbiBmcmFtZS4KICAqCiAgKiBJZiB0aGUgYmVhY29uIGZyYW1lcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBob3N0IHN5c3RlbSAoaS5lLiwgbm90IGluCiAgKiBoYXJkd2FyZS9maXJtd2FyZSksIHRoZSBkcml2ZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGdldCBlYWNoIGJlYWNvbgotICogZnJhbWUgZnJvbSBtYWM4MDIxMSAtLSBpdCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiBiZWZvcmUgdGhlIGJlYWNvbiBpcyBuZWVkZWQgKGUuZy4gYmFzZWQgb24gaGFyZHdhcmUgaW50ZXJydXB0KS4KLSAqCi0gKiBJZiB0aGUgYmVhY29uIGZyYW1lcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UsIHRoZW4gdGhlIGRyaXZlcgotICogbXVzdCB1c2UgdGhlIHJldHVybmVkIGJlYWNvbiBhcyB0aGUgdGVtcGxhdGUgYW5kIGNoYW5nZSB0aGUgVElNIElFCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgRFRJTSBwYXJhbWV0ZXJzL1RJTSBiaXRtYXAuCisgKiBmcmFtZSBmcm9tIG1hYzgwMjExIC0tIGl0IGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZXhhY3RseQorICogb25jZSBiZWZvcmUgdGhlIGJlYWNvbiBpcyBuZWVkZWQgKGUuZy4gYmFzZWQgb24gaGFyZHdhcmUgaW50ZXJydXB0KS4KICAqCiAgKiBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBza2IuCiAgKgpAQCAtMzQ0MCw2ICszNTQ1LDIwIEBACiB9CiAKIC8qKgorICogaWVlZTgwMjExX2NzYV91cGRhdGVfY291bnRlciAtIHJlcXVlc3QgbWFjODAyMTEgdG8gZGVjcmVtZW50IHRoZSBjc2EgY291bnRlcgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqCisgKiBUaGUgY3NhIGNvdW50ZXIgc2hvdWxkIGJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBiZWFjb24gdHJhbnNtaXNzaW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW1wbGljaXRseSB3aGVuCisgKiBpZWVlODAyMTFfYmVhY29uX2dldC9pZWVlODAyMTFfYmVhY29uX2dldF90aW0gYXJlIGNhbGxlZCwgaG93ZXZlciBpZiB0aGUKKyAqIGJlYWNvbiBmcmFtZXMgYXJlIGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlLCB0aGUgZHJpdmVyIHNob3VsZCBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIGFmdGVyIGVhY2ggYmVhY29uIHRyYW5zbWlzc2lvbiB0byBzeW5jIG1hYzgwMjExJ3MgY3NhIGNvdW50ZXJzLgorICoKKyAqIFJldHVybjogbmV3IGNzYSBjb3VudGVyIHZhbHVlCisgKi8KK3U4IGllZWU4MDIxMV9jc2FfdXBkYXRlX2NvdW50ZXIoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisKKy8qKgogICogaWVlZTgwMjExX2NzYV9maW5pc2ggLSBub3RpZnkgbWFjODAyMTEgYWJvdXQgY2hhbm5lbCBzd2l0Y2gKICAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCiAgKgpAQCAtNDQ2Nyw2ICs0NTg2LDggQEAKIAl2b2lkICgqYWRkX3N0YV9kZWJ1Z2ZzKSh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwKIAkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpOwogCXZvaWQgKCpyZW1vdmVfc3RhX2RlYnVnZnMpKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKTsKKworCXUzMiAoKmdldF9leHBlY3RlZF90aHJvdWdocHV0KSh2b2lkICpwcml2X3N0YSk7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCByYXRlX3N1cHBvcnRlZChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLApAQCAtNDU3Niw3ICs0Njk3LDkgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbAogY29uZl9pc19odChzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCiB7Ci0JcmV0dXJuIGNvbmYtPmNoYW5kZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQ7CisJcmV0dXJuIChjb25mLT5jaGFuZGVmLndpZHRoICE9IE5MODAyMTFfQ0hBTl9XSURUSF81KSAmJgorCQkoY29uZi0+Y2hhbmRlZi53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfMTApICYmCisJCShjb25mLT5jaGFuZGVmLndpZHRoICE9IE5MODAyMTFfQ0hBTl9XSURUSF8yMF9OT0hUKTsKIH0KIAogc3RhdGljIGlubGluZSBlbnVtIG5sODAyMTFfaWZ0eXBlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggNWY5ZWIyNi4uMzYxZDI2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtMzczLDYgKzM3MywxNCBAQAogfQogI2VuZGlmCiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JRUVFODAyMTU0XzZMT1dQQU4pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRuc19pZWVlODAyMTU0X2xvd3BhbiAqCituZXRfaWVlZTgwMjE1NF9sb3dwYW4oc3RydWN0IG5ldCAqbmV0KQoreworCXJldHVybiAmbmV0LT5pZWVlODAyMTU0X2xvd3BhbjsKK30KKyNlbmRpZgorCiAvKiBGb3IgY2FsbGVycyB3aG8gZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgd2hldGhlciBpdCdzIElQdjQgb3IgSVB2NiAqLwogc3RhdGljIGlubGluZSB2b2lkIHJ0X2dlbmlkX2J1bXBfYWxsKHN0cnVjdCBuZXQgKm5ldCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaAppbmRleCAwN2VhYWY2Li5hNzFkZDMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCkBAIC00OCw2ICs0OCw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IG5mX25hdF9hbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSk7CiAKK3N0cnVjdCBuZl9jb25uX25hdCAqbmZfY3RfbmF0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KTsKKwogLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSovCiBpbnQgbmZfbmF0X3VzZWRfdHVwbGUoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICppZ25vcmVkX2Nvbm50cmFjayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKaW5kZXggZTZiYzE0ZC4uN2VlNmNlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaApAQCAtNzIsMjEgKzcyLDIzIEBACiAgKglzdHJ1Y3QgbmZ0X2N0eCAtIG5mX3RhYmxlcyBydWxlL3NldCBjb250ZXh0CiAgKgogICoJQG5ldDogbmV0IG5hbWVzcGFjZQotICogCUBza2I6IG5ldGxpbmsgc2tiCi0gKiAJQG5saDogbmV0bGluayBtZXNzYWdlIGhlYWRlcgogICogCUBhZmk6IGFkZHJlc3MgZmFtaWx5IGluZm8KICAqIAlAdGFibGU6IHRoZSB0YWJsZSB0aGUgY2hhaW4gaXMgY29udGFpbmVkIGluCiAgKiAJQGNoYWluOiB0aGUgY2hhaW4gdGhlIHJ1bGUgaXMgY29udGFpbmVkIGluCiAgKglAbmxhOiBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCUBwb3J0aWQ6IG5ldGxpbmsgcG9ydElEIG9mIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgKglAc2VxOiBuZXRsaW5rIHNlcXVlbmNlIG51bWJlcgorICoJQHJlcG9ydDogbm90aWZ5IHZpYSB1bmljYXN0IG5ldGxpbmsgbWVzc2FnZQogICovCiBzdHJ1Y3QgbmZ0X2N0eCB7CiAJc3RydWN0IG5ldAkJCSpuZXQ7Ci0JY29uc3Qgc3RydWN0IHNrX2J1ZmYJCSpza2I7Ci0JY29uc3Qgc3RydWN0IG5sbXNnaGRyCQkqbmxoOwotCWNvbnN0IHN0cnVjdCBuZnRfYWZfaW5mbwkqYWZpOwotCWNvbnN0IHN0cnVjdCBuZnRfdGFibGUJCSp0YWJsZTsKLQljb25zdCBzdHJ1Y3QgbmZ0X2NoYWluCQkqY2hhaW47CisJc3RydWN0IG5mdF9hZl9pbmZvCQkqYWZpOworCXN0cnVjdCBuZnRfdGFibGUJCSp0YWJsZTsKKwlzdHJ1Y3QgbmZ0X2NoYWluCQkqY2hhaW47CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IAkqbmxhOworCXUzMgkJCQlwb3J0aWQ7CisJdTMyCQkJCXNlcTsKKwlib29sCQkJCXJlcG9ydDsKIH07CiAKIHN0cnVjdCBuZnRfZGF0YV9kZXNjIHsKQEAgLTE0Niw2ICsxNDgsNDQgQEAKIH07CiAKIC8qKgorICoJc3RydWN0IG5mdF9zZXRfZGVzYyAtIGRlc2NyaXB0aW9uIG9mIHNldCBlbGVtZW50cworICoKKyAqCUBrbGVuOiBrZXkgbGVuZ3RoCisgKglAZGxlbjogZGF0YSBsZW5ndGgKKyAqCUBzaXplOiBudW1iZXIgb2Ygc2V0IGVsZW1lbnRzCisgKi8KK3N0cnVjdCBuZnRfc2V0X2Rlc2MgeworCXVuc2lnbmVkIGludAkJa2xlbjsKKwl1bnNpZ25lZCBpbnQJCWRsZW47CisJdW5zaWduZWQgaW50CQlzaXplOworfTsKKworLyoqCisgKgllbnVtIG5mdF9zZXRfY2xhc3MgLSBwZXJmb3JtYW5jZSBjbGFzcworICoKKyAqCUBORlRfTE9PS1VQX09fMTogY29uc3RhbnQsIE8oMSkKKyAqCUBORlRfTE9PS1VQX09fTE9HX046IGxvZ2FyaXRobWljLCBPKGxvZyBOKQorICoJQE5GVF9MT09LVVBfT19OOiBsaW5lYXIsIE8oTikKKyAqLworZW51bSBuZnRfc2V0X2NsYXNzIHsKKwlORlRfU0VUX0NMQVNTX09fMSwKKwlORlRfU0VUX0NMQVNTX09fTE9HX04sCisJTkZUX1NFVF9DTEFTU19PX04sCit9OworCisvKioKKyAqCXN0cnVjdCBuZnRfc2V0X2VzdGltYXRlIC0gZXN0aW1hdGlvbiBvZiBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlCisgKgkJCQkgIGNoYXJhY3RlcmlzdGljcworICoKKyAqCUBzaXplOiByZXF1aXJlZCBtZW1vcnkKKyAqCUBjbGFzczogbG9va3VwIHBlcmZvcm1hbmNlIGNsYXNzCisgKi8KK3N0cnVjdCBuZnRfc2V0X2VzdGltYXRlIHsKKwl1bnNpZ25lZCBpbnQJCXNpemU7CisJZW51bSBuZnRfc2V0X2NsYXNzCWNsYXNzOworfTsKKworLyoqCiAgKglzdHJ1Y3QgbmZ0X3NldF9vcHMgLSBuZl90YWJsZXMgc2V0IG9wZXJhdGlvbnMKICAqCiAgKglAbG9va3VwOiBsb29rIHVwIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKQEAgLTE3NCw3ICsyMTQsMTEgQEAKIAkJCQkJCXN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpOwogCiAJdW5zaWduZWQgaW50CQkJKCpwcml2c2l6ZSkoY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKTsKKwlib29sCQkJCSgqZXN0aW1hdGUpKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsCisJCQkJCQkgICAgdTMyIGZlYXR1cmVzLAorCQkJCQkJICAgIHN0cnVjdCBuZnRfc2V0X2VzdGltYXRlICplc3QpOwogCWludAkJCQkoKmluaXQpKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAogCQkJCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKTsKIAl2b2lkCQkJCSgqZGVzdHJveSkoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCk7CiAKQEAgLTE5NCw2ICsyMzgsOCBAQAogICogCUBuYW1lOiBuYW1lIG9mIHRoZSBzZXQKICAqIAlAa3R5cGU6IGtleSB0eXBlIChudW1lcmljIHR5cGUgZGVmaW5lZCBieSB1c2Vyc3BhY2UsIG5vdCB1c2VkIGluIHRoZSBrZXJuZWwpCiAgKiAJQGR0eXBlOiBkYXRhIHR5cGUgKHZlcmRpY3Qgb3IgbnVtZXJpYyB0eXBlIGRlZmluZWQgYnkgdXNlcnNwYWNlKQorICogCUBzaXplOiBtYXhpbXVtIHNldCBzaXplCisgKiAJQG5lbGVtczogbnVtYmVyIG9mIGVsZW1lbnRzCiAgKiAJQG9wczogc2V0IG9wcwogICogCUBmbGFnczogc2V0IGZsYWdzCiAgKiAJQGtsZW46IGtleSBsZW5ndGgKQEAgLTIwNiw2ICsyNTIsOCBAQAogCWNoYXIJCQkJbmFtZVtJRk5BTVNJWl07CiAJdTMyCQkJCWt0eXBlOwogCXUzMgkJCQlkdHlwZTsKKwl1MzIJCQkJc2l6ZTsKKwl1MzIJCQkJbmVsZW1zOwogCS8qIHJ1bnRpbWUgZGF0YSBiZWxvdyBoZXJlICovCiAJY29uc3Qgc3RydWN0IG5mdF9zZXRfb3BzCSpvcHMgX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCXUxNgkJCQlmbGFnczsKQEAgLTIyMiw2ICsyNzAsOCBAQAogCiBzdHJ1Y3QgbmZ0X3NldCAqbmZfdGFibGVzX3NldF9sb29rdXAoY29uc3Qgc3RydWN0IG5mdF90YWJsZSAqdGFibGUsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpOworc3RydWN0IG5mdF9zZXQgKm5mX3RhYmxlc19zZXRfbG9va3VwX2J5aWQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSk7CiAKIC8qKgogICoJc3RydWN0IG5mdF9zZXRfYmluZGluZyAtIG5mX3RhYmxlcyBzZXQgYmluZGluZwpAQCAtMzQxLDE4ICszOTEsNzUgQEAKIH07CiAKIC8qKgotICoJc3RydWN0IG5mdF9ydWxlX3RyYW5zIC0gbmZfdGFibGVzIHJ1bGUgdXBkYXRlIGluIHRyYW5zYWN0aW9uCisgKglzdHJ1Y3QgbmZ0X3RyYW5zIC0gbmZfdGFibGVzIG9iamVjdCB1cGRhdGUgaW4gdHJhbnNhY3Rpb24KICAqCisgKglAcmN1X2hlYWQ6IHJjdSBoZWFkIHRvIGRlZmVyIHJlbGVhc2Ugb2YgdHJhbnNhY3Rpb24gZGF0YQogICoJQGxpc3Q6IHVzZWQgaW50ZXJuYWxseQotICoJQGN0eDogcnVsZSBjb250ZXh0Ci0gKglAcnVsZTogcnVsZSB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQKKyAqCUBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKglAY3R4OiB0cmFuc2FjdGlvbiBjb250ZXh0CisgKglAZGF0YTogaW50ZXJuYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24KICAqLwotc3RydWN0IG5mdF9ydWxlX3RyYW5zIHsKK3N0cnVjdCBuZnRfdHJhbnMgeworCXN0cnVjdCByY3VfaGVhZAkJCXJjdV9oZWFkOwogCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CisJaW50CQkJCW1zZ190eXBlOwogCXN0cnVjdCBuZnRfY3R4CQkJY3R4OworCWNoYXIJCQkJZGF0YVswXTsKK307CisKK3N0cnVjdCBuZnRfdHJhbnNfcnVsZSB7CiAJc3RydWN0IG5mdF9ydWxlCQkJKnJ1bGU7CiB9OwogCisjZGVmaW5lIG5mdF90cmFuc19ydWxlKHRyYW5zKQlcCisJKCgoc3RydWN0IG5mdF90cmFuc19ydWxlICopdHJhbnMtPmRhdGEpLT5ydWxlKQorCitzdHJ1Y3QgbmZ0X3RyYW5zX3NldCB7CisJc3RydWN0IG5mdF9zZXQJKnNldDsKKwl1MzIJCXNldF9pZDsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX3NldCh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfc2V0ICopdHJhbnMtPmRhdGEpLT5zZXQpCisjZGVmaW5lIG5mdF90cmFuc19zZXRfaWQodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3NldCAqKXRyYW5zLT5kYXRhKS0+c2V0X2lkKQorCitzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluIHsKKwlib29sCQl1cGRhdGU7CisJY2hhcgkJbmFtZVtORlRfQ0hBSU5fTUFYTkFNRUxFTl07CisJc3RydWN0IG5mdF9zdGF0cyBfX3BlcmNwdSAqc3RhdHM7CisJdTgJCXBvbGljeTsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX3VwZGF0ZSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPnVwZGF0ZSkKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX25hbWUodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluICopdHJhbnMtPmRhdGEpLT5uYW1lKQorI2RlZmluZSBuZnRfdHJhbnNfY2hhaW5fc3RhdHModHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluICopdHJhbnMtPmRhdGEpLT5zdGF0cykKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX3BvbGljeSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPnBvbGljeSkKKworc3RydWN0IG5mdF90cmFuc190YWJsZSB7CisJYm9vbAkJdXBkYXRlOworCWJvb2wJCWVuYWJsZTsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX3RhYmxlX3VwZGF0ZSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfdGFibGUgKil0cmFucy0+ZGF0YSktPnVwZGF0ZSkKKyNkZWZpbmUgbmZ0X3RyYW5zX3RhYmxlX2VuYWJsZSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfdGFibGUgKil0cmFucy0+ZGF0YSktPmVuYWJsZSkKKworc3RydWN0IG5mdF90cmFuc19lbGVtIHsKKwlzdHJ1Y3QgbmZ0X3NldAkJKnNldDsKKwlzdHJ1Y3QgbmZ0X3NldF9lbGVtCWVsZW07Cit9OworCisjZGVmaW5lIG5mdF90cmFuc19lbGVtX3NldCh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfZWxlbSAqKXRyYW5zLT5kYXRhKS0+c2V0KQorI2RlZmluZSBuZnRfdHJhbnNfZWxlbSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfZWxlbSAqKXRyYW5zLT5kYXRhKS0+ZWxlbSkKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZ0X2V4cHIgKm5mdF9leHByX2ZpcnN0KGNvbnN0IHN0cnVjdCBuZnRfcnVsZSAqcnVsZSkKIHsKIAlyZXR1cm4gKHN0cnVjdCBuZnRfZXhwciAqKSZydWxlLT5kYXRhWzBdOwpAQCAtMzg1LDYgKzQ5Miw3IEBACiAKIGVudW0gbmZ0X2NoYWluX2ZsYWdzIHsKIAlORlRfQkFTRV9DSEFJTgkJCT0gMHgxLAorCU5GVF9DSEFJTl9JTkFDVElWRQkJPSAweDIsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNDdjMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX05GVF9NRVRBX0hfCisjZGVmaW5lIF9ORlRfTUVUQV9IXworCitzdHJ1Y3QgbmZ0X21ldGEgeworCWVudW0gbmZ0X21ldGFfa2V5cwlrZXk6ODsKKwl1bmlvbiB7CisJCWVudW0gbmZ0X3JlZ2lzdGVycwlkcmVnOjg7CisJCWVudW0gbmZ0X3JlZ2lzdGVycwlzcmVnOjg7CisJfTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfbWV0YV9wb2xpY3lbXTsKKworaW50IG5mdF9tZXRhX2dldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pOworCitpbnQgbmZ0X21ldGFfc2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSk7CisKK2ludCBuZnRfbWV0YV9nZXRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpOworCitpbnQgbmZ0X21ldGFfc2V0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKTsKKwordm9pZCBuZnRfbWV0YV9nZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpOworCit2b2lkIG5mdF9tZXRhX3NldF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJICAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCmluZGV4IGIyNzA0ZmQwLi5hZWM1ZTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCkBAIC03NywxMCArNzcsMTcgQEAKIAlpbnQgc3lzY3RsX2lwX25vX3BtdHVfZGlzYzsKIAlpbnQgc3lzY3RsX2lwX2Z3ZF91c2VfcG10dTsKIAorCWludCBzeXNjdGxfZndtYXJrX3JlZmxlY3Q7CisJaW50IHN5c2N0bF90Y3BfZndtYXJrX2FjY2VwdDsKKwogCXN0cnVjdCBwaW5nX2dyb3VwX3JhbmdlIHBpbmdfZ3JvdXBfcmFuZ2U7CiAKIAlhdG9taWNfdCBkZXZfYWRkcl9nZW5pZDsKIAorI2lmZGVmIENPTkZJR19TWVNDVEwKKwl1bnNpZ25lZCBsb25nICpzeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHM7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKICNpZm5kZWYgQ09ORklHX0lQX01ST1VURV9NVUxUSVBMRV9UQUJMRVMKIAlzdHJ1Y3QgbXJfdGFibGUJCSptcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9pcHY2LmggYi9pbmNsdWRlL25ldC9uZXRucy9pcHY2LmgKaW5kZXggMjFlZGFmMS4uMTlkMzQ0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL2lwdjYuaApAQCAtMzAsNiArMzAsNyBAQAogCWludCBmbG93bGFiZWxfY29uc2lzdGVuY3k7CiAJaW50IGljbXB2Nl90aW1lOwogCWludCBhbnljYXN0X3NyY19lY2hvX3JlcGx5OworCWludCBmd21hcmtfcmVmbGVjdDsKIH07CiAKIHN0cnVjdCBuZXRuc19pcHY2IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy9kaWdpdGFsLmggYi9pbmNsdWRlL25ldC9uZmMvZGlnaXRhbC5oCmluZGV4IDc2NTVjZmUuLmJkZjU1YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9kaWdpdGFsLmgKKysrIGIvaW5jbHVkZS9uZXQvbmZjL2RpZ2l0YWwuaApAQCAtMzYsNiArMzYsNyBAQAogCU5GQ19ESUdJVEFMX1JGX1RFQ0hfMjEyRiwKIAlORkNfRElHSVRBTF9SRl9URUNIXzQyNEYsCiAJTkZDX0RJR0lUQUxfUkZfVEVDSF9JU08xNTY5MywKKwlORkNfRElHSVRBTF9SRl9URUNIXzEwNkIsCiAKIAlORkNfRElHSVRBTF9SRl9URUNIX0xBU1QsCiB9OwpAQCAtNjIsNiArNjMsOSBAQAogCU5GQ19ESUdJVEFMX0ZSQU1JTkdfSVNPMTU2OTNfSU5WRU5UT1JZLAogCU5GQ19ESUdJVEFMX0ZSQU1JTkdfSVNPMTU2OTNfVDVULAogCisJTkZDX0RJR0lUQUxfRlJBTUlOR19ORkNCLAorCU5GQ19ESUdJVEFMX0ZSQU1JTkdfTkZDQl9UNFQsCisKIAlORkNfRElHSVRBTF9GUkFNSU5HX0xBU1QsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZmMvaGNpLmggYi9pbmNsdWRlL25ldC9uZmMvaGNpLmgKaW5kZXggMDNjNDY1MC4uNjEyODZkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmZjL2hjaS5oCisrKyBiL2luY2x1ZGUvbmV0L25mYy9oY2kuaApAQCAtMjcsNiArMjcsNyBAQAogc3RydWN0IG5mY19oY2lfb3BzIHsKIAlpbnQgKCpvcGVuKSAoc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2KTsKIAl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYpOworCWludCAoKmxvYWRfc2Vzc2lvbikgKHN0cnVjdCBuZmNfaGNpX2RldiAqaGRldik7CiAJaW50ICgqaGNpX3JlYWR5KSAoc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2KTsKIAkvKgogCSAqIHhtaXQgbXVzdCBhbHdheXMgc2VuZCB0aGUgY29tcGxldGUgYnVmZmVyIGJlZm9yZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25mYy5oIGIvaW5jbHVkZS9uZXQvbmZjL25mYy5oCmluZGV4IDJlOGI0MGMuLjZjNTgzZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9uZmMuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmZjLmgKQEAgLTI2NCw0ICsyNjQsNyBAQAogaW50IG5mY19yZW1vdmVfc2Uoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHNlX2lkeCk7CiBzdHJ1Y3QgbmZjX3NlICpuZmNfZmluZF9zZShzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgc2VfaWR4KTsKIAordm9pZCBuZmNfc2VuZF90b19yYXdfc29jayhzdHJ1Y3QgbmZjX2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICB1OCBwYXlsb2FkX3R5cGUsIHU4IGRpcmVjdGlvbik7CisKICNlbmRpZiAvKiBfX05FVF9ORkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X2Nscy5oIGIvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCmluZGV4IGEyNDQxZmIuLjZkYTQ2ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL25ldC9wa3RfY2xzLmgKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBpbnQgdGNmX2V4dHNfdmFsaWRhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJICAgICAgc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICpyYXRlX3RsdiwKLQkJICAgICAgc3RydWN0IHRjZl9leHRzICpleHRzKTsKKwkJICAgICAgc3RydWN0IHRjZl9leHRzICpleHRzLCBib29sIG92cik7CiB2b2lkIHRjZl9leHRzX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cyk7CiB2b2lkIHRjZl9leHRzX2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9leHRzICpkc3QsCiAJCSAgICAgc3RydWN0IHRjZl9leHRzICpzcmMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCA4OTFkODBkLi5lYzAzMGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtOTYsNyArOTYsNyBAQAogCQkJCQlzdHJ1Y3QgbmxhdHRyICp0YWIpOwogdm9pZCBxZGlzY19wdXRfcnRhYihzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqdGFiKTsKIHZvaWQgcWRpc2NfcHV0X3N0YWIoc3RydWN0IHFkaXNjX3NpemVfdGFibGUgKnRhYik7Ci12b2lkIHFkaXNjX3dhcm5fbm9ud2MoY2hhciAqdHh0LCBzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKK3ZvaWQgcWRpc2Nfd2Fybl9ub253Yyhjb25zdCBjaGFyICp0eHQsIHN0cnVjdCBRZGlzYyAqcWRpc2MpOwogaW50IHNjaF9kaXJlY3RfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnEsCiAJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEsCiAJCSAgICBzcGlubG9ja190ICpyb290X2xvY2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaCBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKaW5kZXggYTdlOTg2Yi4uZDZmY2MxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9wcm90b2NvbC5oCkBAIC04Niw3ICs4Niw2IEBACiAJc3RydWN0IHByb3RvCSAqcHJvdDsKIAljb25zdCBzdHJ1Y3QgcHJvdG9fb3BzICpvcHM7CiAgIAotCWNoYXIgICAgICAgICAgICAgbm9fY2hlY2s7ICAgLyogY2hlY2tzdW0gb24gcmN2L3htaXQvbm9uZT8gKi8KIAl1bnNpZ25lZCBjaGFyCSBmbGFnczsgICAgICAvKiBTZWUgSU5FVF9QUk9UT1NXXyogYmVsb3cuICAqLwogfTsKICNkZWZpbmUgSU5FVF9QUk9UT1NXX1JFVVNFIDB4MDEJICAgICAvKiBBcmUgcG9ydHMgYXV0b21hdGljYWxseSByZXVzYWJsZT8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaCBiL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaAppbmRleCA3NWZjMWY1Li4yNTk5OTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9yZWd1bGF0b3J5LmgKKysrIGIvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oCkBAIC0xMzEsNiArMTMxLDExIEBACiAgKiAJYWxsIGNvdW50cnkgSUUgaW5mb3JtYXRpb24gcHJvY2Vzc2VkIGJ5IHRoZSByZWd1bGF0b3J5IGNvcmUuIFRoaXMgd2lsbAogICogCW92ZXJyaWRlICVSRUdVTEFUT1JZX0NPVU5UUllfSUVfRk9MTE9XX1BPV0VSIGFzIGFsbCBjb3VudHJ5IElFcyB3aWxsCiAgKiAJYmUgaWdub3JlZC4KKyAqIEBSRUdVTEFUT1JZX0VOQUJMRV9SRUxBWF9OT19JUjogZm9yIGRldmljZXMgdGhhdCB3aXNoIHRvIGFsbG93IHRoZQorICogICAgICBOT19JUiByZWxheGF0aW9uLCB3aGljaCBlbmFibGVzIHRyYW5zbWlzc2lvbnMgb24gY2hhbm5lbHMgb24gd2hpY2gKKyAqICAgICAgb3RoZXJ3aXNlIGluaXRpYXRpbmcgcmFkaWF0aW9uIGlzIG5vdCBhbGxvd2VkLiBUaGlzIHdpbGwgZW5hYmxlIHRoZQorICogICAgICByZWxheGF0aW9ucyBlbmFibGVkIHVuZGVyIHRoZSBDRkc4MDIxMV9SRUdfUkVMQVhfTk9fSVIgY29uZmlndXJhdGlvbgorICogICAgICBvcHRpb24KICAqLwogZW51bSBpZWVlODAyMTFfcmVndWxhdG9yeV9mbGFncyB7CiAJUkVHVUxBVE9SWV9DVVNUT01fUkVHCQkJPSBCSVQoMCksCkBAIC0xMzgsNiArMTQzLDcgQEAKIAlSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTCQk9IEJJVCgyKSwKIAlSRUdVTEFUT1JZX0NPVU5UUllfSUVfRk9MTE9XX1BPV0VSCT0gQklUKDMpLAogCVJFR1VMQVRPUllfQ09VTlRSWV9JRV9JR05PUkUJCT0gQklUKDQpLAorCVJFR1VMQVRPUllfRU5BQkxFX1JFTEFYX05PX0lSICAgICAgICAgICA9IEJJVCg1KSwKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfZnJlcV9yYW5nZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCBkMDYyZjgxLi42MjRmOTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTE5OSw3ICsxOTksNyBAQAogCWludAkJCSgqY2hhbmdlKShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICosCiAJCQkJCXN0cnVjdCB0Y2ZfcHJvdG8qLCB1bnNpZ25lZCBsb25nLAogCQkJCQl1MzIgaGFuZGxlLCBzdHJ1Y3QgbmxhdHRyICoqLAotCQkJCQl1bnNpZ25lZCBsb25nICopOworCQkJCQl1bnNpZ25lZCBsb25nICosIGJvb2wpOwogCWludAkJCSgqZGVsZXRlKShzdHJ1Y3QgdGNmX3Byb3RvKiwgdW5zaWduZWQgbG9uZyk7CiAJdm9pZAkJCSgqd2Fsaykoc3RydWN0IHRjZl9wcm90byosIHN0cnVjdCB0Y2Zfd2Fsa2VyICphcmcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCmluZGV4IDBkZmNjOTIuLmYzODU4OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCkBAIC04MzgsMTAgKzgzOCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgc2Fja2RlbGF5OwogCV9fdTMyIHNhY2tmcmVxOwogCi0JLyogV2hlbiB3YXMgdGhlIGxhc3QgdGltZSAoaW4gamlmZmllcykgdGhhdCB3ZSBoZWFyZCBmcm9tIHRoaXMKLQkgKiB0cmFuc3BvcnQ/ICBXZSB1c2UgdGhpcyB0byBwaWNrIG5ldyBhY3RpdmUgYW5kIHJldHJhbiBwYXRocy4KKwkvKiBXaGVuIHdhcyB0aGUgbGFzdCB0aW1lIHRoYXQgd2UgaGVhcmQgZnJvbSB0aGlzIHRyYW5zcG9ydD8gV2UgdXNlCisJICogdGhpcyB0byBwaWNrIG5ldyBhY3RpdmUgYW5kIHJldHJhbiBwYXRocy4KIAkgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfdGltZV9oZWFyZDsKKwlrdGltZV90IGxhc3RfdGltZV9oZWFyZDsKIAogCS8qIExhc3QgdGltZShpbiBqaWZmaWVzKSB3aGVuIGN3bmQgaXMgcmVkdWNlZCBkdWUgdG8gdGhlIGNvbmdlc3Rpb24KIAkgKiBpbmRpY2F0aW9uIGJhc2VkIG9uIEVDTkUgY2h1bmsuCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zZWN1cmVfc2VxLmggYi9pbmNsdWRlL25ldC9zZWN1cmVfc2VxLmgKaW5kZXggZjI1NzQ4Ni4uM2YzNmQ0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2VjdXJlX3NlcS5oCisrKyBiL2luY2x1ZGUvbmV0L3NlY3VyZV9zZXEuaApAQCAtMyw4ICszLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLV9fdTMyIHNlY3VyZV9pcF9pZChfX2JlMzIgZGFkZHIpOwotX191MzIgc2VjdXJlX2lwdjZfaWQoY29uc3QgX19iZTMyIGRhZGRyWzRdKTsKIHUzMiBzZWN1cmVfaXB2NF9wb3J0X2VwaGVtZXJhbChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0KTsKIHUzMiBzZWN1cmVfaXB2Nl9wb3J0X2VwaGVtZXJhbChjb25zdCBfX2JlMzIgKnNhZGRyLCBjb25zdCBfX2JlMzIgKmRhZGRyLAogCQkJICAgICAgIF9fYmUxNiBkcG9ydCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zbm1wLmggYi9pbmNsdWRlL25ldC9zbm1wLmgKaW5kZXggNzE1OTYyNi4uZjFmMjdmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc25tcC5oCisrKyBiL2luY2x1ZGUvbmV0L3NubXAuaApAQCAtMTE2LDUxICsxMTYsNDkgQEAKIAl1bnNpZ25lZCBsb25nCW1pYnNbTElOVVhfTUlCX1hGUk1NQVhdOwogfTsKIAotI2RlZmluZSBTTk1QX0FSUkFZX1NaIDEKLQogI2RlZmluZSBERUZJTkVfU05NUF9TVEFUKHR5cGUsIG5hbWUpCVwKLQlfX3R5cGVvZl9fKHR5cGUpIF9fcGVyY3B1ICpuYW1lW1NOTVBfQVJSQVlfU1pdCisJX190eXBlb2ZfXyh0eXBlKSBfX3BlcmNwdSAqbmFtZQogI2RlZmluZSBERUZJTkVfU05NUF9TVEFUX0FUT01JQyh0eXBlLCBuYW1lKQlcCiAJX190eXBlb2ZfXyh0eXBlKSAqbmFtZQogI2RlZmluZSBERUNMQVJFX1NOTVBfU1RBVCh0eXBlLCBuYW1lKQlcCi0JZXh0ZXJuIF9fdHlwZW9mX18odHlwZSkgX19wZXJjcHUgKm5hbWVbU05NUF9BUlJBWV9TWl0KKwlleHRlcm4gX190eXBlb2ZfXyh0eXBlKSBfX3BlcmNwdSAqbmFtZQogCiAjZGVmaW5lIFNOTVBfSU5DX1NUQVRTX0JIKG1pYiwgZmllbGQpCVwKLQkJCV9fdGhpc19jcHVfaW5jKG1pYlswXS0+bWlic1tmaWVsZF0pCisJCQlfX3RoaXNfY3B1X2luYyhtaWItPm1pYnNbZmllbGRdKQogCiAjZGVmaW5lIFNOTVBfSU5DX1NUQVRTX1VTRVIobWliLCBmaWVsZCkJXAotCQkJdGhpc19jcHVfaW5jKG1pYlswXS0+bWlic1tmaWVsZF0pCisJCQl0aGlzX2NwdV9pbmMobWliLT5taWJzW2ZpZWxkXSkKIAogI2RlZmluZSBTTk1QX0lOQ19TVEFUU19BVE9NSUNfTE9ORyhtaWIsIGZpZWxkKQlcCiAJCQlhdG9taWNfbG9uZ19pbmMoJm1pYi0+bWlic1tmaWVsZF0pCiAKICNkZWZpbmUgU05NUF9JTkNfU1RBVFMobWliLCBmaWVsZCkJXAotCQkJdGhpc19jcHVfaW5jKG1pYlswXS0+bWlic1tmaWVsZF0pCisJCQl0aGlzX2NwdV9pbmMobWliLT5taWJzW2ZpZWxkXSkKIAogI2RlZmluZSBTTk1QX0RFQ19TVEFUUyhtaWIsIGZpZWxkKQlcCi0JCQl0aGlzX2NwdV9kZWMobWliWzBdLT5taWJzW2ZpZWxkXSkKKwkJCXRoaXNfY3B1X2RlYyhtaWItPm1pYnNbZmllbGRdKQogCiAjZGVmaW5lIFNOTVBfQUREX1NUQVRTX0JIKG1pYiwgZmllbGQsIGFkZGVuZCkJXAotCQkJX190aGlzX2NwdV9hZGQobWliWzBdLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQorCQkJX190aGlzX2NwdV9hZGQobWliLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQogCiAjZGVmaW5lIFNOTVBfQUREX1NUQVRTX1VTRVIobWliLCBmaWVsZCwgYWRkZW5kKQlcCi0JCQl0aGlzX2NwdV9hZGQobWliWzBdLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQorCQkJdGhpc19jcHVfYWRkKG1pYi0+bWlic1tmaWVsZF0sIGFkZGVuZCkKIAogI2RlZmluZSBTTk1QX0FERF9TVEFUUyhtaWIsIGZpZWxkLCBhZGRlbmQpCVwKLQkJCXRoaXNfY3B1X2FkZChtaWJbMF0tPm1pYnNbZmllbGRdLCBhZGRlbmQpCisJCQl0aGlzX2NwdV9hZGQobWliLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQogLyoKLSAqIFVzZSAiX190eXBlb2ZfXygqbWliWzBdKSAqcHRyIiBpbnN0ZWFkIG9mICJfX3R5cGVvZl9fKG1pYlswXSkgcHRyIgorICogVXNlICJfX3R5cGVvZl9fKCptaWIpICpwdHIiIGluc3RlYWQgb2YgIl9fdHlwZW9mX18obWliKSBwdHIiCiAgKiB0byBtYWtlIEBwdHIgYSBub24tcGVyY3B1IHBvaW50ZXIuCiAgKi8KICNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFMobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJXAogCWRvIHsgXAotCQlfX3R5cGVvZl9fKCptaWJbMF0tPm1pYnMpICpwdHIgPSBtaWJbMF0tPm1pYnM7CVwKKwkJX190eXBlb2ZfXygqbWliLT5taWJzKSAqcHRyID0gbWliLT5taWJzOwlcCiAJCXRoaXNfY3B1X2luYyhwdHJbYmFzZWZpZWxkIyNQS1RTXSk7CQlcCiAJCXRoaXNfY3B1X2FkZChwdHJbYmFzZWZpZWxkIyNPQ1RFVFNdLCBhZGRlbmQpOwlcCiAJfSB3aGlsZSAoMCkKICNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFNfQkgobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJXAogCWRvIHsgXAotCQlfX3R5cGVvZl9fKCptaWJbMF0tPm1pYnMpICpwdHIgPSBtaWJbMF0tPm1pYnM7CVwKKwkJX190eXBlb2ZfXygqbWliLT5taWJzKSAqcHRyID0gbWliLT5taWJzOwlcCiAJCV9fdGhpc19jcHVfaW5jKHB0cltiYXNlZmllbGQjI1BLVFNdKTsJCVwKIAkJX190aGlzX2NwdV9hZGQocHRyW2Jhc2VmaWVsZCMjT0NURVRTXSwgYWRkZW5kKTsJXAogCX0gd2hpbGUgKDApCkBAIC0xNzAsNyArMTY4LDcgQEAKIAogI2RlZmluZSBTTk1QX0FERF9TVEFUUzY0X0JIKG1pYiwgZmllbGQsIGFkZGVuZCkgCQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJX190eXBlb2ZfXygqbWliWzBdKSAqcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbMF0pOwlcCisJCV9fdHlwZW9mX18oKm1pYikgKnB0ciA9IF9fdGhpc19jcHVfcHRyKG1pYik7CQlcCiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnB0ci0+c3luY3ApOwkJCVwKIAkJcHRyLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQ7CQkJCVwKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKQEAgLTE5MSw4ICsxODksOCBAQAogI2RlZmluZSBTTk1QX0lOQ19TVEFUUzY0KG1pYiwgZmllbGQpIFNOTVBfQUREX1NUQVRTNjQobWliLCBmaWVsZCwgMSkKICNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFM2NF9CSChtaWIsIGJhc2VmaWVsZCwgYWRkZW5kKQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsJCQkJXAotCQlwdHIgPSBfX3RoaXNfY3B1X3B0cigobWliKVswXSk7CQkJCVwKKwkJX190eXBlb2ZfXygqbWliKSAqcHRyOwkJCQkJXAorCQlwdHIgPSBfX3RoaXNfY3B1X3B0cihtaWIpOwkJCQlcCiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnB0ci0+c3luY3ApOwkJCVwKIAkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjUEtUU10rKzsJCQkJXAogCQlwdHItPm1pYnNbYmFzZWZpZWxkIyNPQ1RFVFNdICs9IGFkZGVuZDsJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggMjE1NjljZi4uMDdiN2ZjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtMjQzLDcgKzI0Myw4IEBACiAgICoJQHNrX3NuZGJ1Zjogc2l6ZSBvZiBzZW5kIGJ1ZmZlciBpbiBieXRlcwogICAqCUBza19mbGFnczogJVNPX0xJTkdFUiAobF9vbm9mZiksICVTT19CUk9BRENBU1QsICVTT19LRUVQQUxJVkUsCiAgICoJCSAgICVTT19PT0JJTkxJTkUgc2V0dGluZ3MsICVTT19USU1FU1RBTVBJTkcgc2V0dGluZ3MKLSAgKglAc2tfbm9fY2hlY2s6ICVTT19OT19DSEVDSyBzZXR0aW5nLCB3aGV0aGVyIG9yIG5vdCBjaGVja3VwIHBhY2tldHMKKyAgKglAc2tfbm9fY2hlY2tfdHg6ICVTT19OT19DSEVDSyBzZXR0aW5nLCBzZXQgY2hlY2tzdW0gaW4gVFggcGFja2V0cworICAqCUBza19ub19jaGVja19yeDogYWxsb3cgemVybyBjaGVja3N1bSBpbiBSWCBwYWNrZXRzCiAgICoJQHNrX3JvdXRlX2NhcHM6IHJvdXRlIGNhcGFiaWxpdGllcyAoZS5nLiAlTkVUSUZfRl9UU08pCiAgICoJQHNrX3JvdXRlX25vY2FwczogZm9yYmlkZGVuIHJvdXRlIGNhcGFiaWxpdGllcyAoZS5nIE5FVElGX0ZfR1NPX01BU0spCiAgICoJQHNrX2dzb190eXBlOiBHU08gdHlwZSAoZS5nLiAlU0tCX0dTT19UQ1BWNCkKQEAgLTM3MSw3ICszNzIsOCBAQAogCXN0cnVjdCBza19idWZmX2hlYWQJc2tfd3JpdGVfcXVldWU7CiAJa21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKGZsYWdzKTsKIAl1bnNpZ25lZCBpbnQJCXNrX3NodXRkb3duICA6IDIsCi0JCQkJc2tfbm9fY2hlY2sgIDogMiwKKwkJCQlza19ub19jaGVja190eCA6IDEsCisJCQkJc2tfbm9fY2hlY2tfcnggOiAxLAogCQkJCXNrX3VzZXJsb2NrcyA6IDQsCiAJCQkJc2tfcHJvdG9jb2wgIDogOCwKIAkJCQlza190eXBlICAgICAgOiAxNjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggODdkODc3NC4uNzI4NmRiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTIyMCw4ICsyMjAsNiBAQAogI2RlZmluZQlURk9fU0VSVkVSX0VOQUJMRQkyCiAjZGVmaW5lCVRGT19DTElFTlRfTk9fQ09PS0lFCTQJLyogRGF0YSBpbiBTWU4gdy9vIGNvb2tpZSBvcHRpb24gKi8KIAotLyogUHJvY2VzcyBTWU4gZGF0YSBidXQgc2tpcCBjb29raWUgdmFsaWRhdGlvbiAqLwotI2RlZmluZQlURk9fU0VSVkVSX0NPT0tJRV9OT1RfQ0hLRUQJMHgxMDAKIC8qIEFjY2VwdCBTWU4gZGF0YSB3L28gYW55IGNvb2tpZSBvcHRpb24gKi8KICNkZWZpbmUJVEZPX1NFUlZFUl9DT09LSUVfTk9UX1JFUUQJMHgyMDAKIApAQCAtMjMwLDEwICsyMjgsNiBAQAogICovCiAjZGVmaW5lCVRGT19TRVJWRVJfV09fU09DS09QVDEJMHg0MDAKICNkZWZpbmUJVEZPX1NFUlZFUl9XT19TT0NLT1BUMgkweDgwMAotLyogQWx3YXlzIGNyZWF0ZSBURk8gY2hpbGQgc29ja2V0cyBvbiBhIFRGTyBsaXN0ZW5lciBldmVuIHdoZW4KLSAqIGNvb2tpZS9kYXRhIG5vdCBwcmVzZW50LiAoRm9yIHRlc3RpbmcgcHVycG9zZSEpCi0gKi8KLSNkZWZpbmUJVEZPX1NFUlZFUl9BTFdBWVMJMHgxMDAwCiAKIGV4dGVybiBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgdGNwX2RlYXRoX3JvdzsKIApAQCAtNTQxLDcgKzUzNSw3IEBACiB2b2lkIHRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc3RydWN0IHNvY2sgKik7CiB2b2lkIHRjcF9zaW1wbGVfcmV0cmFuc21pdChzdHJ1Y3Qgc29jayAqKTsKIGludCB0Y3BfdHJpbV9oZWFkKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICosIHUzMik7Ci1pbnQgdGNwX2ZyYWdtZW50KHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICosIHUzMiwgdW5zaWduZWQgaW50KTsKK2ludCB0Y3BfZnJhZ21lbnQoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKiwgdTMyLCB1bnNpZ25lZCBpbnQsIGdmcF90KTsKIAogdm9pZCB0Y3Bfc2VuZF9wcm9iZTAoc3RydWN0IHNvY2sgKik7CiB2b2lkIHRjcF9zZW5kX3BhcnRpYWwoc3RydWN0IHNvY2sgKik7CkBAIC01NTgsNyArNTUyLDYgQEAKIGJvb2wgdGNwX3NjaGVkdWxlX2xvc3NfcHJvYmUoc3RydWN0IHNvY2sgKnNrKTsKIAogLyogdGNwX2lucHV0LmMgKi8KLXZvaWQgdGNwX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCB0Y3BfcmVzdW1lX2Vhcmx5X3JldHJhbnNtaXQoc3RydWN0IHNvY2sgKnNrKTsKIHZvaWQgdGNwX3JlYXJtX3J0byhzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCB0Y3BfcmVzZXQoc3RydWN0IHNvY2sgKnNrKTsKQEAgLTc5Nyw3ICs3OTAsNyBAQAogCS8qIHJldHVybiBzbG93IHN0YXJ0IHRocmVzaG9sZCAocmVxdWlyZWQpICovCiAJdTMyICgqc3N0aHJlc2gpKHN0cnVjdCBzb2NrICpzayk7CiAJLyogZG8gbmV3IGN3bmQgY2FsY3VsYXRpb24gKHJlcXVpcmVkKSAqLwotCXZvaWQgKCpjb25nX2F2b2lkKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCwgdTMyIGluX2ZsaWdodCk7CisJdm9pZCAoKmNvbmdfYXZvaWQpKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKTsKIAkvKiBjYWxsIGJlZm9yZSBjaGFuZ2luZyBjYV9zdGF0ZSAob3B0aW9uYWwpICovCiAJdm9pZCAoKnNldF9zdGF0ZSkoc3RydWN0IHNvY2sgKnNrLCB1OCBuZXdfc3RhdGUpOwogCS8qIGNhbGwgd2hlbiBjd25kIGV2ZW50IG9jY3VycyAob3B0aW9uYWwpICovCkBAIC04MjksNyArODIyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX2luaXRfY29uZ2VzdGlvbl9vcHM7CiB1MzIgdGNwX3Jlbm9fc3N0aHJlc2goc3RydWN0IHNvY2sgKnNrKTsKLXZvaWQgdGNwX3Jlbm9fY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCwgdTMyIGluX2ZsaWdodCk7Cit2b2lkIHRjcF9yZW5vX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpOwogZXh0ZXJuIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3Jlbm87CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2V0X2NhX3N0YXRlKHN0cnVjdCBzb2NrICpzaywgY29uc3QgdTggY2Ffc3RhdGUpCkBAIC05NzUsNyArOTY4LDMwIEBACiB7CiAJcmV0dXJuIHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQ7CiB9Ci1ib29sIHRjcF9pc19jd25kX2xpbWl0ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCB1MzIgaW5fZmxpZ2h0KTsKKworLyogV2UgZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjg2MSB0byB2YWxpZGF0ZSBjd25kIGJ1dCBpbXBsZW1lbnQgYSBtb3JlCisgKiBmbGV4aWJsZSBhcHByb2FjaC4gVGhlIFJGQyBzdWdnZXN0cyBjd25kIHNob3VsZCBub3QgYmUgcmFpc2VkIHVubGVzcworICogaXQgd2FzIGZ1bGx5IHVzZWQgcHJldmlvdXNseS4gQW5kIHRoYXQncyBleGFjdGx5IHdoYXQgd2UgZG8gaW4KKyAqIGNvbmdlc3Rpb24gYXZvaWRhbmNlIG1vZGUuIEJ1dCBpbiBzbG93IHN0YXJ0IHdlIGFsbG93IGN3bmQgdG8gZ3JvdworICogYXMgbG9uZyBhcyB0aGUgYXBwbGljYXRpb24gaGFzIHVzZWQgaGFsZiB0aGUgY3duZC4KKyAqIEV4YW1wbGUgOgorICogICAgY3duZCBpcyAxMCAoSVcxMCksIGJ1dCBhcHBsaWNhdGlvbiBzZW5kcyA5IGZyYW1lcy4KKyAqICAgIFdlIGFsbG93IGN3bmQgdG8gcmVhY2ggMTggd2hlbiBhbGwgZnJhbWVzIGFyZSBBQ0tlZC4KKyAqIFRoaXMgY2hlY2sgaXMgc2FmZSBiZWNhdXNlIGl0J3MgYXMgYWdncmVzc2l2ZSBhcyBzbG93IHN0YXJ0IHdoaWNoIGFscmVhZHkKKyAqIHJpc2tzIDEwMCUgb3ZlcnNob290LiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgd2UgZGlzY291cmFnZSBhcHBsaWNhdGlvbiB0bworICogZWl0aGVyIHNlbmQgbW9yZSBmaWxsZXIgcGFja2V0cyBvciBkYXRhIHRvIGFydGlmaWNpYWxseSBibG93IHVwIHRoZSBjd25kCisgKiB1c2FnZSwgYW5kIGFsbG93IGFwcGxpY2F0aW9uLWxpbWl0ZWQgcHJvY2VzcyB0byBwcm9iZSBidyBtb3JlIGFnZ3Jlc3NpdmVseS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHRjcF9pc19jd25kX2xpbWl0ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJLyogSWYgaW4gc2xvdyBzdGFydCwgZW5zdXJlIGN3bmQgZ3Jvd3MgdG8gdHdpY2Ugd2hhdCB3YXMgQUNLZWQuICovCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQorCQlyZXR1cm4gdHAtPnNuZF9jd25kIDwgMiAqIHRwLT5tYXhfcGFja2V0c19vdXQ7CisKKwlyZXR1cm4gdHAtPmlzX2N3bmRfbGltaXRlZDsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9jaGVja19wcm9iZV90aW1lcihzdHJ1Y3Qgc29jayAqc2spCiB7CkBAIC0xMTAzLDYgKzExMTksOSBAQAogCWlyZXEtPmlyX251bSA9IG50b2hzKHRjcF9oZHIoc2tiKS0+ZGVzdCk7CiB9CiAKK2V4dGVybiB2b2lkIHRjcF9vcGVucmVxX2luaXRfcndpbihzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJICBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CisKIHZvaWQgdGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZShzdHJ1Y3Qgc29jayAqc2spOwogCiBzdGF0aWMgaW5saW5lIGludCBrZWVwYWxpdmVfaW50dmxfd2hlbihjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQpAQCAtMTMxMiw4ICsxMzMxLDEwIEBACiAKIGV4dGVybiBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2NvbnRleHQgX19yY3UgKnRjcF9mYXN0b3Blbl9jdHg7CiBpbnQgdGNwX2Zhc3RvcGVuX3Jlc2V0X2NpcGhlcih2b2lkICprZXksIHVuc2lnbmVkIGludCBsZW4pOwotdm9pZCB0Y3BfZmFzdG9wZW5fY29va2llX2dlbihfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LAotCQkJICAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jKTsKK2Jvb2wgdGNwX3RyeV9mYXN0b3BlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKKwkJICAgICAgc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgKmZvYywKKwkJICAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIHZvaWQgdGNwX2Zhc3RvcGVuX2luaXRfa2V5X29uY2UoYm9vbCBwdWJsaXNoKTsKICNkZWZpbmUgVENQX0ZBU1RPUEVOX0tFWV9MRU5HVEggMTYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdHNvLmggYi9pbmNsdWRlL25ldC90c28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U1NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdHNvLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfVFNPX0gKKyNkZWZpbmUgX1RTT19ICisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworc3RydWN0IHRzb190IHsKKwlpbnQgbmV4dF9mcmFnX2lkeDsKKwl2b2lkICpkYXRhOworCXNpemVfdCBzaXplOworCXUxNiBpcF9pZDsKKwl1MzIgdGNwX3NlcTsKK307CisKK2ludCB0c29fY291bnRfZGVzY3Moc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHRzb19idWlsZF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqaGRyLCBzdHJ1Y3QgdHNvX3QgKnRzbywKKwkJICAgaW50IHNpemUsIGJvb2wgaXNfbGFzdCk7Cit2b2lkIHRzb19idWlsZF9kYXRhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0c29fdCAqdHNvLCBpbnQgc2l6ZSk7Cit2b2lkIHRzb19zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdHNvX3QgKnRzbyk7CisKKyNlbmRpZgkvKiBfVFNPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggYTI0ZjBmMy4uMmVjZmM2ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC05NSwxNSArOTUsNiBAQAogCXJldHVybiAmdGFibGUtPmhhc2gyW2hhc2ggJiB0YWJsZS0+bWFza107CiB9CiAKLS8qIE5vdGU6IHRoaXMgbXVzdCBtYXRjaCAndmFsYm9vbCcgaW4gc29ja19zZXRzb2Nrb3B0ICovCi0jZGVmaW5lIFVEUF9DU1VNX05PWE1JVAkJMQotCi0vKiBVc2VkIGJ5IFN1blJQQy94cHJ0IGxheWVyLiAqLwotI2RlZmluZSBVRFBfQ1NVTV9OT1JDVgkJMgotCi0vKiBEZWZhdWx0LCBhcyBwZXIgdGhlIFJGQywgaXMgdG8gYWx3YXlzIGRvIGNzdW1zLiAqLwotI2RlZmluZSBVRFBfQ1NVTV9ERUZBVUxUCTAKLQogZXh0ZXJuIHN0cnVjdCBwcm90byB1ZHBfcHJvdDsKIAogZXh0ZXJuIGF0b21pY19sb25nX3QgdWRwX21lbW9yeV9hbGxvY2F0ZWQ7CkBAIC0xNTYsNiArMTQ3LDE1IEBACiAJcmV0dXJuIGNzdW07CiB9CiAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiB1ZHBfdjRfY2hlY2soaW50IGxlbiwgX19iZTMyIHNhZGRyLAorCQkJCSAgIF9fYmUzMiBkYWRkciwgX193c3VtIGJhc2UpCit7CisJcmV0dXJuIGNzdW1fdGNwdWRwX21hZ2ljKHNhZGRyLCBkYWRkciwgbGVuLCBJUFBST1RPX1VEUCwgYmFzZSk7Cit9CisKK3ZvaWQgdWRwX3NldF9jc3VtKGJvb2wgbm9jaGVjaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgaW50IGxlbik7CisKIC8qIGhhc2ggcm91dGluZXMgc2hhcmVkIGJldHdlZW4gVURQdjQvNiBhbmQgVURQLUxpdGV2NC82ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdWRwX2xpYl9oYXNoKHN0cnVjdCBzb2NrICpzaykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3Z4bGFuLmggYi9pbmNsdWRlL25ldC92eGxhbi5oCmluZGV4IDVkZWVmMWEuLjEyMTk2Y2U2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC92eGxhbi5oCisrKyBiL2luY2x1ZGUvbmV0L3Z4bGFuLmgKQEAgLTI0LDE2ICsyNCwyNiBAQAogCXN0cnVjdCB1ZHBfb2ZmbG9hZCB1ZHBfb2ZmbG9hZHM7CiB9OwogCisjZGVmaW5lIFZYTEFOX0ZfTEVBUk4JCQkweDAxCisjZGVmaW5lIFZYTEFOX0ZfUFJPWFkJCQkweDAyCisjZGVmaW5lIFZYTEFOX0ZfUlNDCQkJMHgwNAorI2RlZmluZSBWWExBTl9GX0wyTUlTUwkJCTB4MDgKKyNkZWZpbmUgVlhMQU5fRl9MM01JU1MJCQkweDEwCisjZGVmaW5lIFZYTEFOX0ZfSVBWNgkJCTB4MjAKKyNkZWZpbmUgVlhMQU5fRl9VRFBfQ1NVTQkJMHg0MAorI2RlZmluZSBWWExBTl9GX1VEUF9aRVJPX0NTVU02X1RYCTB4ODAKKyNkZWZpbmUgVlhMQU5fRl9VRFBfWkVST19DU1VNNl9SWAkweDEwMAorCiBzdHJ1Y3QgdnhsYW5fc29jayAqdnhsYW5fc29ja19hZGQoc3RydWN0IG5ldCAqbmV0LCBfX2JlMTYgcG9ydCwKIAkJCQkgIHZ4bGFuX3Jjdl90ICpyY3YsIHZvaWQgKmRhdGEsCi0JCQkJICBib29sIG5vX3NoYXJlLCBib29sIGlwdjYpOworCQkJCSAgYm9vbCBub19zaGFyZSwgdTMyIGZsYWdzKTsKIAogdm9pZCB2eGxhbl9zb2NrX3JlbGVhc2Uoc3RydWN0IHZ4bGFuX3NvY2sgKnZzKTsKIAogaW50IHZ4bGFuX3htaXRfc2tiKHN0cnVjdCB2eGxhbl9zb2NrICp2cywKIAkJICAgc3RydWN0IHJ0YWJsZSAqcnQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsIF9fdTggdG9zLCBfX3U4IHR0bCwgX19iZTE2IGRmLAotCQkgICBfX2JlMTYgc3JjX3BvcnQsIF9fYmUxNiBkc3RfcG9ydCwgX19iZTMyIHZuaSk7CisJCSAgIF9fYmUxNiBzcmNfcG9ydCwgX19iZTE2IGRzdF9wb3J0LCBfX2JlMzIgdm5pLCBib29sIHhuZXQpOwogCiBfX2JlMTYgdnhsYW5fc3JjX3BvcnQoX191MTYgcG9ydF9taW4sIF9fdTE2IHBvcnRfbWF4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveGZybS5oIGIvaW5jbHVkZS9uZXQveGZybS5oCmluZGV4IDExNmU5YzcuLjcyMWU5YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3hmcm0uaAorKysgYi9pbmNsdWRlL25ldC94ZnJtLmgKQEAgLTY5MSwxMyArNjkxLDYgQEAKIAogI2RlZmluZSBYRlJNX1NQSV9TS0JfQ0IoX19za2IpICgoc3RydWN0IHhmcm1fc3BpX3NrYl9jYiAqKSYoKF9fc2tiKS0+Y2JbMF0pKQogCi0vKiBBdWRpdCBJbmZvcm1hdGlvbiAqLwotc3RydWN0IHhmcm1fYXVkaXQgewotCXUzMglzZWNpZDsKLQlrdWlkX3QJbG9naW51aWQ7Ci0JdW5zaWduZWQgaW50IHNlc3Npb25pZDsKLX07Ci0KICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpdF9idWZmZXIgKnhmcm1fYXVkaXRfc3RhcnQoY29uc3QgY2hhciAqb3ApCiB7CkBAIC03MTMsMzAgKzcwNiwyNCBAQAogCXJldHVybiBhdWRpdF9idWY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX2F1ZGl0X2hlbHBlcl91c3JpbmZvKGt1aWRfdCBhdWlkLCB1bnNpZ25lZCBpbnQgc2VzLCB1MzIgc2VjaWQsCitzdGF0aWMgaW5saW5lIHZvaWQgeGZybV9hdWRpdF9oZWxwZXJfdXNyaW5mbyhib29sIHRhc2tfdmFsaWQsCiAJCQkJCSAgICAgc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmKQogewotCWNoYXIgKnNlY2N0eDsKLQl1MzIgc2VjY3R4X2xlbjsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXVpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCB0YXNrX3ZhbGlkID8KKwkJCQkJICAgIGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KSA6CisJCQkJCSAgICBJTlZBTElEX1VJRCk7CisJY29uc3QgdW5zaWduZWQgaW50IHNlcyA9IHRhc2tfdmFsaWQgPyBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpIDoKKwkJKHVuc2lnbmVkIGludCkgLTE7CiAKLQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBhdWlkPSV1IHNlcz0ldSIsCi0JCQkgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGF1aWQpLCBzZXMpOwotCWlmIChzZWNpZCAhPSAwICYmCi0JICAgIHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eChzZWNpZCwgJnNlY2N0eCwgJnNlY2N0eF9sZW4pID09IDApIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgc3Viaj0lcyIsIHNlY2N0eCk7Ci0JCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KHNlY2N0eCwgc2VjY3R4X2xlbik7Ci0JfSBlbHNlCi0JCWF1ZGl0X2xvZ190YXNrX2NvbnRleHQoYXVkaXRfYnVmKTsKKwlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBhdWlkPSV1IHNlcz0ldSIsIGF1aWQsIHNlcyk7CisJYXVkaXRfbG9nX3Rhc2tfY29udGV4dChhdWRpdF9idWYpOwogfQogCi12b2lkIHhmcm1fYXVkaXRfcG9saWN5X2FkZChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgcmVzdWx0LCBrdWlkX3QgYXVpZCwKLQkJCSAgIHVuc2lnbmVkIGludCBzZXMsIHUzMiBzZWNpZCk7Ci12b2lkIHhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgcmVzdWx0LCBrdWlkX3QgYXVpZCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBzZXMsIHUzMiBzZWNpZCk7Ci12b2lkIHhmcm1fYXVkaXRfc3RhdGVfYWRkKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgcmVzdWx0LCBrdWlkX3QgYXVpZCwKLQkJCSAgdW5zaWduZWQgaW50IHNlcywgdTMyIHNlY2lkKTsKLXZvaWQgeGZybV9hdWRpdF9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCByZXN1bHQsIGt1aWRfdCBhdWlkLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2VzLCB1MzIgc2VjaWQpOwordm9pZCB4ZnJtX2F1ZGl0X3BvbGljeV9hZGQoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgaW50IHJlc3VsdCwgYm9vbCB0YXNrX3ZhbGlkKTsKK3ZvaWQgeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCByZXN1bHQsCisJCQkgICAgICBib29sIHRhc2tfdmFsaWQpOwordm9pZCB4ZnJtX2F1ZGl0X3N0YXRlX2FkZChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IHJlc3VsdCwgYm9vbCB0YXNrX3ZhbGlkKTsKK3ZvaWQgeGZybV9hdWRpdF9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCByZXN1bHQsIGJvb2wgdGFza192YWxpZCk7CiB2b2lkIHhmcm1fYXVkaXRfc3RhdGVfcmVwbGF5X292ZXJmbG93KHN0cnVjdCB4ZnJtX3N0YXRlICp4LAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCB4ZnJtX2F1ZGl0X3N0YXRlX3JlcGxheShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTc0OSwyMiArNzM2LDIyIEBACiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZybV9hdWRpdF9wb2xpY3lfYWRkKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCByZXN1bHQsCi0JCQkJICBrdWlkX3QgYXVpZCwgdW5zaWduZWQgaW50IHNlcywgdTMyIHNlY2lkKQorCQkJCQkgYm9vbCB0YXNrX3ZhbGlkKQogewogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCByZXN1bHQsCi0JCQkJICBrdWlkX3QgYXVpZCwgdW5zaWduZWQgaW50IHNlcywgdTMyIHNlY2lkKQorCQkJCQkgICAgYm9vbCB0YXNrX3ZhbGlkKQogewogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZybV9hdWRpdF9zdGF0ZV9hZGQoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCByZXN1bHQsCi0JCQkJIGt1aWRfdCBhdWlkLCB1bnNpZ25lZCBpbnQgc2VzLCB1MzIgc2VjaWQpCisJCQkJCWJvb2wgdGFza192YWxpZCkKIHsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgcmVzdWx0LAotCQkJCSAgICBrdWlkX3QgYXVpZCwgdW5zaWduZWQgaW50IHNlcywgdTMyIHNlY2lkKQorCQkJCQkgICBib29sIHRhc2tfdmFsaWQpCiB7CiB9CiAKQEAgLTE1MDgsNyArMTQ5NSw3IEBACiAKIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtX2ZpbmRfYWNxX2J5c2VxKHN0cnVjdCBuZXQgKm5ldCwgdTMyIG1hcmssIHUzMiBzZXEpOwogaW50IHhmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKLWludCB4ZnJtX3N0YXRlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgdTggcHJvdG8sIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCB4ZnJtX3N0YXRlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgdTggcHJvdG8sIGJvb2wgdGFza192YWxpZCk7CiB2b2lkIHhmcm1fc2FkX2dldGluZm8oc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeGZybWtfc2FkaW5mbyAqc2kpOwogdm9pZCB4ZnJtX3NwZF9nZXRpbmZvKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHhmcm1rX3NwZGluZm8gKnNpKTsKIHUzMiB4ZnJtX3JlcGxheV9zZXFoaShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIG5ldF9zZXEpOwpAQCAtMTYwMyw3ICsxNTkwLDcgQEAKIAkJCQkJICBpbnQgKmVycik7CiBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2J5aWQoc3RydWN0IG5ldCAqbmV0LCB1MzIgbWFyaywgdTgsIGludCBkaXIsCiAJCQkJICAgICB1MzIgaWQsIGludCBkZWxldGUsIGludCAqZXJyKTsKLWludCB4ZnJtX3BvbGljeV9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHU4IHR5cGUsIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCB4ZnJtX3BvbGljeV9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHU4IHR5cGUsIGJvb2wgdGFza192YWxpZCk7CiB1MzIgeGZybV9nZXRfYWNxc2VxKHZvaWQpOwogaW50IHZlcmlmeV9zcGlfaW5mbyh1OCBwcm90bywgdTMyIG1pbiwgdTMyIG1heCk7CiBpbnQgeGZybV9hbGxvY19zcGkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHUzMiBtaW5zcGksIHUzMiBtYXhzcGkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCmluZGV4IGUwMTZlMmEuLjQyZWQ3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogCiBzdHJ1Y3QgU2NzaV9Ib3N0Owogc3RydWN0IHNjc2lfZGV2aWNlOwpAQCAtMzE1LDQgKzMxNiwyMCBAQAogCWNtZC0+cmVzdWx0ID0gKGNtZC0+cmVzdWx0ICYgMHgwMGZmZmZmZikgfCAoc3RhdHVzIDw8IDI0KTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzY3NpX3RyYW5zZmVyX2xlbmd0aChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXVuc2lnbmVkIGludCB4ZmVyX2xlbiA9IGJsa19ycV9ieXRlcyhzY21kLT5yZXF1ZXN0KTsKKwl1bnNpZ25lZCBpbnQgcHJvdF9vcCA9IHNjc2lfZ2V0X3Byb3Rfb3Aoc2NtZCk7CisJdW5zaWduZWQgaW50IHNlY3Rvcl9zaXplID0gc2NtZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZTsKKworCXN3aXRjaCAocHJvdF9vcCkgeworCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKKwljYXNlIFNDU0lfUFJPVF9XUklURV9TVFJJUDoKKwljYXNlIFNDU0lfUFJPVF9SRUFEX0lOU0VSVDoKKwkJcmV0dXJuIHhmZXJfbGVuOworCX0KKworCXJldHVybiB4ZmVyX2xlbiArICh4ZmVyX2xlbiA+PiBpbG9nMihzZWN0b3Jfc2l6ZSkpICogODsKK30KKwogI2VuZGlmIC8qIF9TQ1NJX1NDU0lfQ01ORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90cmFuc3BvcnQuaCBiL2luY2x1ZGUvdGFyZ2V0L2lzY3NpL2lzY3NpX3RyYW5zcG9ydC5oCmluZGV4IDMzYjQ4N2I1ZC4uZGFlZjlkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvaXNjc2kvaXNjc2lfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS90YXJnZXQvaXNjc2kvaXNjc2lfdHJhbnNwb3J0LmgKQEAgLTcwLDcgKzcwLDggQEAKIGV4dGVybiB2b2lkIGlzY3NpdF9idWlsZF90YXNrX21ndF9yc3Aoc3RydWN0IGlzY3NpX2NtZCAqLCBzdHJ1Y3QgaXNjc2lfY29ubiAqLAogCQkJCXN0cnVjdCBpc2NzaV90bV9yc3AgKik7CiBleHRlcm4gaW50IGlzY3NpdF9idWlsZF90ZXh0X3JzcChzdHJ1Y3QgaXNjc2lfY21kICosIHN0cnVjdCBpc2NzaV9jb25uICosCi0JCQkJc3RydWN0IGlzY3NpX3RleHRfcnNwICopOworCQkJCXN0cnVjdCBpc2NzaV90ZXh0X3JzcCAqLAorCQkJCWVudW0gaXNjc2l0X3RyYW5zcG9ydF90eXBlKTsKIGV4dGVybiB2b2lkIGlzY3NpdF9idWlsZF9yZWplY3Qoc3RydWN0IGlzY3NpX2NtZCAqLCBzdHJ1Y3QgaXNjc2lfY29ubiAqLAogCQkJCXN0cnVjdCBpc2NzaV9yZWplY3QgKik7CiBleHRlcm4gaW50IGlzY3NpdF9idWlsZF9sb2dvdXRfcnNwKHN0cnVjdCBpc2NzaV9jbWQgKiwgc3RydWN0IGlzY3NpX2Nvbm4gKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaAppbmRleCAzYTFjMWVlLi45YWRjMWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFja2VuZC5oCkBAIC01OSw2ICs1OSw3IEBACiB2b2lkCXRyYW5zcG9ydF9zdWJzeXN0ZW1fcmVsZWFzZShzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSAqKTsKIAogdm9pZAl0YXJnZXRfY29tcGxldGVfY21kKHN0cnVjdCBzZV9jbWQgKiwgdTgpOwordm9pZAl0YXJnZXRfY29tcGxldGVfY21kX3dpdGhfbGVuZ3RoKHN0cnVjdCBzZV9jbWQgKiwgdTgsIGludCk7CiAKIHNlbnNlX3JlYXNvbl90CXNwY19wYXJzZV9jZGIoc3RydWN0IHNlX2NtZCAqY21kLCB1bnNpZ25lZCBpbnQgKnNpemUpOwogc2Vuc2VfcmVhc29uX3QJc3BjX2VtdWxhdGVfcmVwb3J0X2x1bnMoc3RydWN0IHNlX2NtZCAqY21kKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCmluZGV4IDlhN2UwOGQuLmQxOTg0MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaApAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KKworI2RlZmluZSBUUFMoeCkgIHRyYWNlcG9pbnRfc3RyaW5nKHgpCiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoY3B1LAogCkBAIC05MCw2ICs5MywxNyBAQAogI2RlZmluZSBQV1JfRVZFTlRfRVhJVCAtMQogI2VuZGlmCiAKKyNkZWZpbmUgcG1fdmVyYl9zeW1ib2xpYyhldmVudCkgXAorCV9fcHJpbnRfc3ltYm9saWMoZXZlbnQsIFwKKwkJeyBQTV9FVkVOVF9TVVNQRU5ELCAic3VzcGVuZCIgfSwgXAorCQl7IFBNX0VWRU5UX1JFU1VNRSwgInJlc3VtZSIgfSwgXAorCQl7IFBNX0VWRU5UX0ZSRUVaRSwgImZyZWV6ZSIgfSwgXAorCQl7IFBNX0VWRU5UX1FVSUVTQ0UsICJxdWllc2NlIiB9LCBcCisJCXsgUE1fRVZFTlRfSElCRVJOQVRFLCAiaGliZXJuYXRlIiB9LCBcCisJCXsgUE1fRVZFTlRfVEhBVywgInRoYXciIH0sIFwKKwkJeyBQTV9FVkVOVF9SRVNUT1JFLCAicmVzdG9yZSIgfSwgXAorCQl7IFBNX0VWRU5UX1JFQ09WRVIsICJyZWNvdmVyIiB9KQorCiBERUZJTkVfRVZFTlQoY3B1LCBjcHVfZnJlcXVlbmN5LAogCiAJVFBfUFJPVE8odW5zaWduZWQgaW50IGZyZXF1ZW5jeSwgdW5zaWduZWQgaW50IGNwdV9pZCksCkBAIC05Nyw1OCArMTExLDc2IEBACiAJVFBfQVJHUyhmcmVxdWVuY3ksIGNwdV9pZCkKICk7CiAKLVRSQUNFX0VWRU5UKG1hY2hpbmVfc3VzcGVuZCwKK1RSQUNFX0VWRU5UKGRldmljZV9wbV9jYWxsYmFja19zdGFydCwKIAotCVRQX1BST1RPKHVuc2lnbmVkIGludCBzdGF0ZSksCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwbV9vcHMsIGludCBldmVudCksCiAKLQlUUF9BUkdTKHN0YXRlKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQoCXUzMiwJCXN0YXRlCQkpCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5zdGF0ZSA9IHN0YXRlOwotCSksCi0KLQlUUF9wcmludGsoInN0YXRlPSVsdSIsICh1bnNpZ25lZCBsb25nKV9fZW50cnktPnN0YXRlKQotKTsKLQotVFJBQ0VfRVZFTlQoZGV2aWNlX3BtX3JlcG9ydF90aW1lLAotCi0JVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwbV9vcHMsIHM2NCBvcHNfdGltZSwKLQkJIGNoYXIgKnBtX2V2ZW50X3N0ciwgaW50IGVycm9yKSwKLQotCVRQX0FSR1MoZGV2LCBwbV9vcHMsIG9wc190aW1lLCBwbV9ldmVudF9zdHIsIGVycm9yKSwKKwlUUF9BUkdTKGRldiwgcG1fb3BzLCBldmVudCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX3N0cmluZyhkZXZpY2UsIGRldl9uYW1lKGRldikpCiAJCV9fc3RyaW5nKGRyaXZlciwgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSkKIAkJX19zdHJpbmcocGFyZW50LCBkZXYtPnBhcmVudCA/IGRldl9uYW1lKGRldi0+cGFyZW50KSA6ICJub25lIikKIAkJX19zdHJpbmcocG1fb3BzLCBwbV9vcHMgPyBwbV9vcHMgOiAibm9uZSAiKQotCQlfX3N0cmluZyhwbV9ldmVudF9zdHIsIHBtX2V2ZW50X3N0cikKLQkJX19maWVsZChzNjQsIG9wc190aW1lKQorCQlfX2ZpZWxkKGludCwgZXZlbnQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIoZGV2aWNlLCBkZXZfbmFtZShkZXYpKTsKKwkJX19hc3NpZ25fc3RyKGRyaXZlciwgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSk7CisJCV9fYXNzaWduX3N0cihwYXJlbnQsCisJCQlkZXYtPnBhcmVudCA/IGRldl9uYW1lKGRldi0+cGFyZW50KSA6ICJub25lIik7CisJCV9fYXNzaWduX3N0cihwbV9vcHMsIHBtX29wcyA/IHBtX29wcyA6ICJub25lICIpOworCQlfX2VudHJ5LT5ldmVudCA9IGV2ZW50OworCSksCisKKwlUUF9wcmludGsoIiVzICVzLCBwYXJlbnQ6ICVzLCAlc1slc10iLCBfX2dldF9zdHIoZHJpdmVyKSwKKwkJX19nZXRfc3RyKGRldmljZSksIF9fZ2V0X3N0cihwYXJlbnQpLCBfX2dldF9zdHIocG1fb3BzKSwKKwkJcG1fdmVyYl9zeW1ib2xpYyhfX2VudHJ5LT5ldmVudCkpCispOworCitUUkFDRV9FVkVOVChkZXZpY2VfcG1fY2FsbGJhY2tfZW5kLAorCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZXJyb3IpLAorCisJVFBfQVJHUyhkZXYsIGVycm9yKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKGRldmljZSwgZGV2X25hbWUoZGV2KSkKKwkJX19zdHJpbmcoZHJpdmVyLCBkZXZfZHJpdmVyX3N0cmluZyhkZXYpKQogCQlfX2ZpZWxkKGludCwgZXJyb3IpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAotCQljb25zdCBjaGFyICp0bXAgPSBkZXYtPnBhcmVudCA/IGRldl9uYW1lKGRldi0+cGFyZW50KSA6ICJub25lIjsKLQkJY29uc3QgY2hhciAqdG1wX2kgPSBwbV9vcHMgPyBwbV9vcHMgOiAibm9uZSAiOwotCiAJCV9fYXNzaWduX3N0cihkZXZpY2UsIGRldl9uYW1lKGRldikpOwogCQlfX2Fzc2lnbl9zdHIoZHJpdmVyLCBkZXZfZHJpdmVyX3N0cmluZyhkZXYpKTsKLQkJX19hc3NpZ25fc3RyKHBhcmVudCwgdG1wKTsKLQkJX19hc3NpZ25fc3RyKHBtX29wcywgdG1wX2kpOwotCQlfX2Fzc2lnbl9zdHIocG1fZXZlbnRfc3RyLCBwbV9ldmVudF9zdHIpOwotCQlfX2VudHJ5LT5vcHNfdGltZSA9IG9wc190aW1lOwogCQlfX2VudHJ5LT5lcnJvciA9IGVycm9yOwogCSksCiAKLQkvKiBvcHNfc3RyIGhhcyBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kICovCi0JVFBfcHJpbnRrKCIlcyAlcyBwYXJlbnQ9JXMgc3RhdGU9JXMgb3BzPSVzbnNlY3M9JWxsZCBlcnI9JWQiLAotCQlfX2dldF9zdHIoZHJpdmVyKSwgX19nZXRfc3RyKGRldmljZSksIF9fZ2V0X3N0cihwYXJlbnQpLAotCQlfX2dldF9zdHIocG1fZXZlbnRfc3RyKSwgX19nZXRfc3RyKHBtX29wcyksCi0JCV9fZW50cnktPm9wc190aW1lLCBfX2VudHJ5LT5lcnJvcikKKwlUUF9wcmludGsoIiVzICVzLCBlcnI9JWQiLAorCQlfX2dldF9zdHIoZHJpdmVyKSwgX19nZXRfc3RyKGRldmljZSksIF9fZW50cnktPmVycm9yKQorKTsKKworVFJBQ0VfRVZFTlQoc3VzcGVuZF9yZXN1bWUsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICphY3Rpb24sIGludCB2YWwsIGJvb2wgc3RhcnQpLAorCisJVFBfQVJHUyhhY3Rpb24sIHZhbCwgc3RhcnQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChjb25zdCBjaGFyICosIGFjdGlvbikKKwkJX19maWVsZChpbnQsIHZhbCkKKwkJX19maWVsZChib29sLCBzdGFydCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmFjdGlvbiA9IGFjdGlvbjsKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCQlfX2VudHJ5LT5zdGFydCA9IHN0YXJ0OworCSksCisKKwlUUF9wcmludGsoIiVzWyV1XSAlcyIsIF9fZW50cnktPmFjdGlvbiwgKHVuc2lnbmVkIGludClfX2VudHJ5LT52YWwsCisJCShfX2VudHJ5LT5zdGFydCk/ImJlZ2luIjoiZW5kIikKICk7CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1Mod2FrZXVwX3NvdXJjZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCmluZGV4IDY3ZTFiYmYuLjBhNjhkNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2NoZWQuaApAQCAtNTMwLDYgKzUzMCwyNiBAQAogCQkJX19lbnRyeS0+ZHN0X3BpZCwgX19lbnRyeS0+ZHN0X3RnaWQsIF9fZW50cnktPmRzdF9uZ2lkLAogCQkJX19lbnRyeS0+ZHN0X2NwdSwgX19lbnRyeS0+ZHN0X25pZCkKICk7CisKKy8qCisgKiBUcmFjZXBvaW50IGZvciB3YWtpbmcgYSBwb2xsaW5nIGNwdSB3aXRob3V0IGFuIElQSS4KKyAqLworVFJBQ0VfRVZFTlQoc2NoZWRfd2FrZV9pZGxlX3dpdGhvdXRfaXBpLAorCisJVFBfUFJPVE8oaW50IGNwdSksCisKKwlUUF9BUkdTKGNwdSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWNwdQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jcHUJPSBjcHU7CisJKSwKKworCVRQX3ByaW50aygiY3B1PSVkIiwgX19lbnRyeS0+Y3B1KQorKTsKICNlbmRpZiAvKiBfVFJBQ0VfU0NIRURfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vZHJtX21vZGUuaCBiL2luY2x1ZGUvdWFwaS9kcm0vZHJtX21vZGUuaAppbmRleCBmMTA0YzI2Li5kZWY1NGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9kcm1fbW9kZS5oCkBAIC0xODEsNiArMTgxLDcgQEAKICNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQwk0CiAjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVklSVFVBTCA1CiAjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfRFNJCTYKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EUE1TVAk3CiAKIHN0cnVjdCBkcm1fbW9kZV9nZXRfZW5jb2RlciB7CiAJX191MzIgZW5jb2Rlcl9pZDsKQEAgLTI1MSw2ICsyNTIsMjEgQEAKICNkZWZpbmUgRFJNX01PREVfUFJPUF9CTE9CCSgxPDw0KQogI2RlZmluZSBEUk1fTU9ERV9QUk9QX0JJVE1BU0sJKDE8PDUpIC8qIGJpdG1hc2sgb2YgZW51bWVyYXRlZCB0eXBlcyAqLwogCisvKiBub24tZXh0ZW5kZWQgdHlwZXM6IGxlZ2FjeSBiaXRtYXNrLCBvbmUgYml0IHBlciB0eXBlOiAqLworI2RlZmluZSBEUk1fTU9ERV9QUk9QX0xFR0FDWV9UWVBFICAoIFwKKwkJRFJNX01PREVfUFJPUF9SQU5HRSB8IFwKKwkJRFJNX01PREVfUFJPUF9FTlVNIHwgXAorCQlEUk1fTU9ERV9QUk9QX0JMT0IgfCBcCisJCURSTV9NT0RFX1BST1BfQklUTUFTSykKKworLyogZXh0ZW5kZWQtdHlwZXM6IHJhdGhlciB0aGFuIGNvbnRpbnVlIHRvIGNvbnN1bWUgYSBiaXQgcGVyIHR5cGUsCisgKiBncmFiIGEgY2h1bmsgb2YgdGhlIGJpdHMgdG8gdXNlIGFzIGludGVnZXIgdHlwZSBpZC4KKyAqLworI2RlZmluZSBEUk1fTU9ERV9QUk9QX0VYVEVOREVEX1RZUEUJMHgwMDAwZmZjMAorI2RlZmluZSBEUk1fTU9ERV9QUk9QX1RZUEUobikJCSgobikgPDwgNikKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9PQkpFQ1QJCURSTV9NT0RFX1BST1BfVFlQRSgxKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX1NJR05FRF9SQU5HRQlEUk1fTU9ERV9QUk9QX1RZUEUoMikKKwogc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0gewogCV9fdTY0IHZhbHVlOwogCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvZHJtL2k5MTVfZHJtLmggYi9pbmNsdWRlL3VhcGkvZHJtL2k5MTVfZHJtLmgKaW5kZXggMTI2YmZhYS4uZmY1N2YwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0uaApAQCAtMjIzLDYgKzIyMyw3IEBACiAjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfQ0FDSElORwkweDMwCiAjZGVmaW5lIERSTV9JOTE1X1JFR19SRUFECQkweDMxCiAjZGVmaW5lIERSTV9JOTE1X0dFVF9SRVNFVF9TVEFUUwkweDMyCisjZGVmaW5lIERSTV9JOTE1X0dFTV9VU0VSUFRSCQkweDMzCiAKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lOSVQsIGRybV9pOTE1X2luaXRfdCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxVU0gJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GTFVTSCkKQEAgLTI3Myw2ICsyNzQsNyBAQAogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZCURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfZGVzdHJveSkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfUkVHX1JFQUQJCQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1JFR19SRUFELCBzdHJ1Y3QgZHJtX2k5MTVfcmVnX3JlYWQpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUwkJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfUkVTRVRfU1RBVFMsIHN0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIJCQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9VU0VSUFRSLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VzZXJwdHIpCiAKIC8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZwogICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCkBAIC0zMzcsNiArMzM5LDcgQEAKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19OT19SRUxPQwkgMjUKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19IQU5ETEVfTFVUICAgMjYKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfV1QgICAgIAkgCSAyNworI2RlZmluZSBJOTE1X1BBUkFNX0NNRF9QQVJTRVJfVkVSU0lPTgkgMjgKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gewogCWludCBwYXJhbTsKQEAgLTEwNDksNCArMTA1MiwxOCBAQAogCV9fdTMyIHBhZDsKIH07CiAKK3N0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB7CisJX191NjQgdXNlcl9wdHI7CisJX191NjQgdXNlcl9zaXplOworCV9fdTMyIGZsYWdzOworI2RlZmluZSBJOTE1X1VTRVJQVFJfUkVBRF9PTkxZIDB4MQorI2RlZmluZSBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQgMHg4MDAwMDAwMAorCS8qKgorCSAqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdC4KKwkgKgorCSAqIE9iamVjdCBoYW5kbGVzIGFyZSBub256ZXJvLgorCSAqLworCV9fdTMyIGhhbmRsZTsKK307CisKICNlbmRpZiAvKiBfVUFQSV9JOTE1X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2RybS9yYWRlb25fZHJtLmggYi9pbmNsdWRlL3VhcGkvZHJtL3JhZGVvbl9kcm0uaAppbmRleCBhZWZhMmY2Li4xY2MwYjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvZHJtL3JhZGVvbl9kcm0uaAorKysgYi9pbmNsdWRlL3VhcGkvZHJtL3JhZGVvbl9kcm0uaApAQCAtMTAwNyw3ICsxMDA3LDcgQEAKICNkZWZpbmUgUkFERU9OX0lORk9fTlVNX0JZVEVTX01PVkVECTB4MWQKICNkZWZpbmUgUkFERU9OX0lORk9fVlJBTV9VU0FHRQkJMHgxZQogI2RlZmluZSBSQURFT05fSU5GT19HVFRfVVNBR0UJCTB4MWYKLQorI2RlZmluZSBSQURFT05fSU5GT19BQ1RJVkVfQ1VfQ09VTlQJMHgyMAogCiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmZvIHsKIAl1aW50MzJfdAkJcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKaW5kZXggNGMzMWEzNi4uY2Y2NzE0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKQEAgLTM4NSw2ICszODUsMTQgQEAKICAqLwogI2RlZmluZSBBVURJVF9NRVNTQUdFX1RFWFRfTUFYCTg1NjAKIAorLyogTXVsdGljYXN0IE5ldGxpbmsgc29ja2V0IGdyb3VwcyAoZGVmYXVsdCB1cCB0byAzMikgKi8KK2VudW0gYXVkaXRfbmxncnBzIHsKKwlBVURJVF9OTEdSUF9OT05FLAkvKiBHcm91cCAwIG5vdCB1c2VkICovCisJQVVESVRfTkxHUlBfUkVBRExPRywJLyogImJlc3QgZWZmb3J0IiByZWFkIG9ubHkgc29ja2V0ICovCisJX19BVURJVF9OTEdSUF9NQVgKK307CisjZGVmaW5lIEFVRElUX05MR1JQX01BWCAgICAgICAgICAgICAgICAoX19BVURJVF9OTEdSUF9NQVggLSAxKQorCiBzdHJ1Y3QgYXVkaXRfc3RhdHVzIHsKIAlfX3UzMgkJbWFzazsJCS8qIEJpdCBtYXNrIGZvciB2YWxpZCBlbnRyaWVzICovCiAJX191MzIJCWVuYWJsZWQ7CS8qIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jYW4uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jYW4uaAppbmRleCA1ZDlkMWQxNC4uNDE4OTJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9jYW4uaApAQCAtNDIsOCArNDIsOCBAQAogICogREFNQUdFLgogICovCiAKLSNpZm5kZWYgQ0FOX0gKLSNkZWZpbmUgQ0FOX0gKKyNpZm5kZWYgX1VBUElfQ0FOX0gKKyNkZWZpbmUgX1VBUElfQ0FOX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CkBAIC0xOTEsNCArMTkxLDQgQEAKIAogI2RlZmluZSBDQU5fSU5WX0ZJTFRFUiAweDIwMDAwMDAwVSAvKiB0byBiZSBzZXQgaW4gY2FuX2ZpbHRlci5jYW5faWQgKi8KIAotI2VuZGlmIC8qIENBTl9IICovCisjZW5kaWYgLyogIV9VQVBJX0NBTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvY2FuL2JjbS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9iY20uaAppbmRleCAzODIyNTFhLi44OWRkYjlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvY2FuL2JjbS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vYmNtLmgKQEAgLTQxLDggKzQxLDggQEAKICAqIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIENBTl9CQ01fSAotI2RlZmluZSBDQU5fQkNNX0gKKyNpZm5kZWYgX1VBUElfQ0FOX0JDTV9ICisjZGVmaW5lIF9VQVBJX0NBTl9CQ01fSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4uaD4KQEAgLTk1LDQgKzk1LDQgQEAKICNkZWZpbmUgVFhfUkVTRVRfTVVMVElfSURYICAweDAyMDAKICNkZWZpbmUgUlhfUlRSX0ZSQU1FICAgICAgICAweDA0MDAKIAotI2VuZGlmIC8qIENBTl9CQ01fSCAqLworI2VuZGlmIC8qICFfVUFQSV9DQU5fQkNNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vZXJyb3IuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vZXJyb3IuaAppbmRleCBiNjMyMDQ1Li5jMjQ3NDQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvY2FuL2Vycm9yLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9lcnJvci5oCkBAIC00MSw4ICs0MSw4IEBACiAgKiBEQU1BR0UuCiAgKi8KIAotI2lmbmRlZiBDQU5fRVJST1JfSAotI2RlZmluZSBDQU5fRVJST1JfSAorI2lmbmRlZiBfVUFQSV9DQU5fRVJST1JfSAorI2RlZmluZSBfVUFQSV9DQU5fRVJST1JfSAogCiAjZGVmaW5lIENBTl9FUlJfRExDIDggLyogZGxjIGZvciBlcnJvciBtZXNzYWdlIGZyYW1lcyAqLwogCkBAIC0xMjAsNCArMTIwLDQgQEAKIAogLyogY29udHJvbGxlciBzcGVjaWZpYyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIC8gZGF0YVs1Li43XSAqLwogCi0jZW5kaWYgLyogQ0FOX0VSUk9SX0ggKi8KKyNlbmRpZiAvKiBfVUFQSV9DQU5fRVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9ndy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9ndy5oCmluZGV4IDg0NGM4OTYuLjNlNjE4NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vZ3cuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY2FuL2d3LmgKQEAgLTQxLDggKzQxLDggQEAKICAqIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIENBTl9HV19ICi0jZGVmaW5lIENBTl9HV19ICisjaWZuZGVmIF9VQVBJX0NBTl9HV19ICisjZGVmaW5lIF9VQVBJX0NBTl9HV19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgpAQCAtMjAwLDQgKzIwMCw0IEBACiAgKiAgICAgICAgIEJld2FyZSBvZiBzZW5kaW5nIHVucGFja2VkIG9yIGFsaWduZWQgc3RydWN0cyEKICAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiAhX1VBUElfQ0FOX0dXX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vbmV0bGluay5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9uZXRsaW5rLmgKaW5kZXggN2UyZTE4Ni4uODEzZDExZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9uZXRsaW5rLmgKQEAgLTE1LDggKzE1LDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2lmbmRlZiBDQU5fTkVUTElOS19ICi0jZGVmaW5lIENBTl9ORVRMSU5LX0gKKyNpZm5kZWYgX1VBUElfQ0FOX05FVExJTktfSAorI2RlZmluZSBfVUFQSV9DQU5fTkVUTElOS19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCkBAIC0xMzAsNCArMTMwLDQgQEAKIAogI2RlZmluZSBJRkxBX0NBTl9NQVgJKF9fSUZMQV9DQU5fTUFYIC0gMSkKIAotI2VuZGlmIC8qIENBTl9ORVRMSU5LX0ggKi8KKyNlbmRpZiAvKiAhX1VBUElfQ0FOX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9yYXcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jYW4vcmF3LmgKaW5kZXggYzdkOGMzMy4uNzhlYzc2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9yYXcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY2FuL3Jhdy5oCkBAIC00Miw4ICs0Miw4IEBACiAgKiBEQU1BR0UuCiAgKi8KIAotI2lmbmRlZiBDQU5fUkFXX0gKLSNkZWZpbmUgQ0FOX1JBV19ICisjaWZuZGVmIF9VQVBJX0NBTl9SQVdfSAorI2RlZmluZSBfVUFQSV9DQU5fUkFXX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgogCkBAIC01OSw0ICs1OSw0IEBACiAJQ0FOX1JBV19GRF9GUkFNRVMsCS8qIGFsbG93IENBTiBGRCBmcmFtZXMgKGRlZmF1bHQ6b2ZmKSAqLwogfTsKIAotI2VuZGlmCisjZW5kaWYgLyogIV9VQVBJX0NBTl9SQVdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2NhcGFiaWxpdHkuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggMTU0ZGQ2ZC4uMTJjMzdhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY2FwYWJpbGl0eS5oCkBAIC0zNDcsNyArMzQ3LDEyIEBACiAKICNkZWZpbmUgQ0FQX0JMT0NLX1NVU1BFTkQgICAgMzYKIAotI2RlZmluZSBDQVBfTEFTVF9DQVAgICAgICAgICBDQVBfQkxPQ0tfU1VTUEVORAorLyogQWxsb3cgcmVhZGluZyB0aGUgYXVkaXQgbG9nIHZpYSBtdWx0aWNhc3QgbmV0bGluayBzb2NrZXQgKi8KKworI2RlZmluZSBDQVBfQVVESVRfUkVBRAkJMzcKKworCisjZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9BVURJVF9SRUFECiAKICNkZWZpbmUgY2FwX3ZhbGlkKHgpICgoeCkgPj0gMCAmJiAoeCkgPD0gQ0FQX0xBU1RfQ0FQKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V0aHRvb2wuaAppbmRleCBmZDE2MWU5Li5lM2M3YTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ldGh0b29sLmgKQEAgLTg0Nyw2ICs4NDcsMzggQEAKIH07CiAKIC8qKgorICogc3RydWN0IGV0aHRvb2xfcnhmaCAtIGNvbW1hbmQgdG8gZ2V0L3NldCBSWCBmbG93IGhhc2ggaW5kaXIgb3IvYW5kIGhhc2gga2V5LgorICogQGNtZDogU3BlY2lmaWMgY29tbWFuZCBudW1iZXIgLSAlRVRIVE9PTF9HUlNTSCBvciAlRVRIVE9PTF9TUlNTSAorICogQHJzc19jb250ZXh0OiBSU1MgY29udGV4dCBpZGVudGlmaWVyLgorICogQGluZGlyX3NpemU6IE9uIGVudHJ5LCB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIgZm9yIHRoZQorICoJaW5kaXJlY3Rpb24gdGFibGUsIHdoaWNoIG1heSBiZSB6ZXJvLCBvciAoZm9yICVFVEhUT09MX1NSU1NIKSwKKyAqCSVFVEhfUlhGSF9JTkRJUl9OT19DSEFOR0UuICBPbiByZXR1cm4gZnJvbSAlRVRIVE9PTF9HUlNTSCwKKyAqCXRoZSBhcnJheSBzaXplIG9mIHRoZSBoYXJkd2FyZSBpbmRpcmVjdGlvbiB0YWJsZS4KKyAqIEBrZXlfc2l6ZTogT24gZW50cnksIHRoZSBhcnJheSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlciBmb3IgdGhlIGhhc2gga2V5LAorICoJd2hpY2ggbWF5IGJlIHplcm8uICBPbiByZXR1cm4gZnJvbSAlRVRIVE9PTF9HUlNTSCwgdGhlIHNpemUgb2YgdGhlCisgKgloYXJkd2FyZSBoYXNoIGtleS4KKyAqIEByc3ZkOglSZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisgKiBAcnNzX2NvbmZpZzogUlggcmluZy9xdWV1ZSBpbmRleCBmb3IgZWFjaCBoYXNoIHZhbHVlIGkuZS4sIGluZGlyZWN0aW9uIHRhYmxlCisgKglvZiBAaW5kaXJfc2l6ZSBfX3UzMiBlbGVtZW50cywgZm9sbG93ZWQgYnkgaGFzaCBrZXkgb2YgQGtleV9zaXplCisgKglieXRlcy4KKyAqCisgKiBGb3IgJUVUSFRPT0xfR1JTU0gsIGEgQGluZGlyX3NpemUgYW5kIGtleV9zaXplIG9mIHplcm8gbWVhbnMgdGhhdCBvbmx5IHRoZQorICogc2l6ZSBzaG91bGQgYmUgcmV0dXJuZWQuICBGb3IgJUVUSFRPT0xfU1JTU0gsIGFuIEBpbmRpcl9zaXplIG9mCisgKiAlRVRIX1JYRkhfSU5ESVJfTk9fQ0hBTkdFIG1lYW5zIHRoYXQgaW5kaXIgdGFibGUgc2V0dGluZyBpcyBub3QgcmVxdWVzdGVkCisgKiBhbmQgYSBAaW5kaXJfc2l6ZSBvZiB6ZXJvIG1lYW5zIHRoZSBpbmRpciB0YWJsZSBzaG91bGQgYmUgcmVzZXQgdG8gZGVmYXVsdAorICogdmFsdWVzLgorICovCitzdHJ1Y3QgZXRodG9vbF9yeGZoIHsKKwlfX3UzMiAgIGNtZDsKKwlfX3UzMglyc3NfY29udGV4dDsKKwlfX3UzMiAgIGluZGlyX3NpemU7CisJX191MzIgICBrZXlfc2l6ZTsKKwlfX3UzMglyc3ZkWzJdOworCV9fdTMyICAgcnNzX2NvbmZpZ1swXTsKK307CisjZGVmaW5lIEVUSF9SWEZIX0lORElSX05PX0NIQU5HRQkweGZmZmZmZmZmCisKKy8qKgogICogc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyAtIHNwZWNpZmljYXRpb24gZm9yIFJYIGZsb3cgZmlsdGVyCiAgKiBAZmxvd190eXBlOiBUeXBlIG9mIG1hdGNoIHRvIHBlcmZvcm0sIGUuZy4gJVRDUF9WNF9GTE9XCiAgKiBAaF91OiBGbG93IGZpZWxkIHZhbHVlcyB0byBtYXRjaCAoZGVwZW5kZW50IG9uIEBmbG93X3R5cGUpCkBAIC0xMTE4LDYgKzExNTAsOSBAQAogI2RlZmluZSBFVEhUT09MX0dFRUUJCTB4MDAwMDAwNDQgLyogR2V0IEVFRSBzZXR0aW5ncyAqLwogI2RlZmluZSBFVEhUT09MX1NFRUUJCTB4MDAwMDAwNDUgLyogU2V0IEVFRSBzZXR0aW5ncyAqLwogCisjZGVmaW5lIEVUSFRPT0xfR1JTU0gJCTB4MDAwMDAwNDYgLyogR2V0IFJYIGZsb3cgaGFzaCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEVUSFRPT0xfU1JTU0gJCTB4MDAwMDAwNDcgLyogU2V0IFJYIGZsb3cgaGFzaCBjb25maWd1cmF0aW9uICovCisKIC8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlICovCiAjZGVmaW5lIFNQQVJDX0VUSF9HU0VUCQlFVEhUT09MX0dTRVQKICNkZWZpbmUgU1BBUkNfRVRIX1NTRVQJCUVUSFRPT0xfU1NFVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZpbHRlci5oCmluZGV4IDhlYjljY2EuLjI1M2I0ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9maWx0ZXIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvZmlsdGVyLmgKQEAgLTEzMCw3ICsxMzAsOCBAQAogI2RlZmluZSBTS0ZfQURfVkxBTl9UQUcJNDQKICNkZWZpbmUgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQgNDgKICNkZWZpbmUgU0tGX0FEX1BBWV9PRkZTRVQJNTIKLSNkZWZpbmUgU0tGX0FEX01BWAk1NgorI2RlZmluZSBTS0ZfQURfUkFORE9NCTU2CisjZGVmaW5lIFNLRl9BRF9NQVgJNjAKICNkZWZpbmUgU0tGX05FVF9PRkYgICAoLTB4MTAwMDAwKQogI2RlZmluZSBTS0ZfTExfT0ZGICAgICgtMHgyMDAwMDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9mZGRpLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfZmRkaS5oCmluZGV4IDBkMzY5MDkuLjEwODZjZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9mZGRpLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2ZkZGkuaApAQCAtMzAsNzQgKzMwLDc2IEBACiAgKiAgRGVmaW5lIG1heCBhbmQgbWluIGxlZ2FsIHNpemVzLiAgVGhlIGZyYW1lIHNpemVzIGRvIG5vdCBpbmNsdWRlCiAgKiAgNCBieXRlIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNlcXVlbmNlKS4KICAqLwotI2RlZmluZSBGRERJX0tfQUxFTgkJCTYJCS8qIE9jdGV0cyBpbiBvbmUgRkRESSBhZGRyZXNzICovCi0jZGVmaW5lIEZERElfS184MDIyX0hMRU4JMTYJCS8qIFRvdGFsIG9jdGV0cyBpbiA4MDIuMiBoZWFkZXIgKi8KLSNkZWZpbmUgRkRESV9LX1NOQVBfSExFTgkyMQkJLyogVG90YWwgb2N0ZXRzIGluIDgwMi4yIFNOQVAgaGVhZGVyICovCi0jZGVmaW5lIEZERElfS184MDIyX1pMRU4JMTYJCS8qIE1pbiBvY3RldHMgaW4gODAyLjIgZnJhbWUgc2FucyBGQ1MgKi8KLSNkZWZpbmUgRkRESV9LX1NOQVBfWkxFTgkyMQkJLyogTWluIG9jdGV0cyBpbiA4MDIuMiBTTkFQIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEZERElfS19BTEVOCQk2CS8qIE9jdGV0cyBpbiBvbmUgRkRESSBhZGRyZXNzICovCisjZGVmaW5lIEZERElfS184MDIyX0hMRU4JMTYJLyogVG90YWwgb2N0ZXRzIGluIDgwMi4yIGhlYWRlciAqLworI2RlZmluZSBGRERJX0tfU05BUF9ITEVOCTIxCS8qIFRvdGFsIG9jdGV0cyBpbiA4MDIuMiBTTkFQIGhlYWRlciAqLworI2RlZmluZSBGRERJX0tfODAyMl9aTEVOCTE2CS8qIE1pbiBvY3RldHMgaW4gODAyLjIgZnJhbWUgc2FucworCQkJCQkgICBGQ1MgKi8KKyNkZWZpbmUgRkRESV9LX1NOQVBfWkxFTgkyMQkvKiBNaW4gb2N0ZXRzIGluIDgwMi4yIFNOQVAgZnJhbWUgc2FucworCQkJCQkgICBGQ1MgKi8KICNkZWZpbmUgRkRESV9LXzgwMjJfRExFTgk0NDc1CS8qIE1heCBvY3RldHMgaW4gODAyLjIgcGF5bG9hZCAqLwogI2RlZmluZSBGRERJX0tfU05BUF9ETEVOCTQ0NzAJLyogTWF4IG9jdGV0cyBpbiA4MDIuMiBTTkFQIHBheWxvYWQgKi8KLSNkZWZpbmUgRkRESV9LX0xMQ19aTEVOCQkxMwkJLyogTWluIG9jdGV0cyBpbiBMTEMgZnJhbWUgc2FucyBGQ1MgKi8KKyNkZWZpbmUgRkRESV9LX0xMQ19aTEVOCQkxMwkvKiBNaW4gb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLwogI2RlZmluZSBGRERJX0tfTExDX0xFTgkJNDQ5MQkvKiBNYXggb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBGRERJX0tfT1VJX0xFTgkJMwkvKiBPY3RldHMgaW4gT1VJIGluIDgwMi4yIFNOQVAKKwkJCQkJICAgaGVhZGVyICovCiAKIC8qIERlZmluZSBGRERJIEZyYW1lIENvbnRyb2wgKEZDKSBCeXRlIHZhbHVlcyAqLwotI2RlZmluZSBGRERJX0ZDX0tfVk9JRAkJCQkJMHgwMAkKLSNkZWZpbmUgRkRESV9GQ19LX05PTl9SRVNUUklDVEVEX1RPS0VOCTB4ODAJCi0jZGVmaW5lIEZERElfRkNfS19SRVNUUklDVEVEX1RPS0VOCQkweEMwCQotI2RlZmluZSBGRERJX0ZDX0tfU01UX01JTgkJCQkweDQxCi0jZGVmaW5lIEZERElfRkNfS19TTVRfTUFYCQkgICAJCTB4NEYKLSNkZWZpbmUgRkRESV9GQ19LX01BQ19NSU4JCQkJMHhDMQotI2RlZmluZSBGRERJX0ZDX0tfTUFDX01BWAkJICAJCTB4Q0YJCi0jZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUlOCQkJMHg1MAotI2RlZmluZSBGRERJX0ZDX0tfQVNZTkNfTExDX0RFRgkJCTB4NTQKLSNkZWZpbmUgRkRESV9GQ19LX0FTWU5DX0xMQ19NQVgJCQkweDVGCi0jZGVmaW5lIEZERElfRkNfS19TWU5DX0xMQ19NSU4JCQkweEQwCi0jZGVmaW5lIEZERElfRkNfS19TWU5DX0xMQ19NQVgJCQkweEQ3Ci0jZGVmaW5lIEZERElfRkNfS19JTVBMRU1FTlRPUl9NSU4JCTB4NjAKLSNkZWZpbmUgRkRESV9GQ19LX0lNUExFTUVOVE9SX01BWCAgCQkweDZGCi0jZGVmaW5lIEZERElfRkNfS19SRVNFUlZFRF9NSU4JCQkweDcwCi0jZGVmaW5lIEZERElfRkNfS19SRVNFUlZFRF9NQVgJCQkweDdGCisjZGVmaW5lIEZERElfRkNfS19WT0lECQkJMHgwMAorI2RlZmluZSBGRERJX0ZDX0tfTk9OX1JFU1RSSUNURURfVE9LRU4JMHg4MAorI2RlZmluZSBGRERJX0ZDX0tfUkVTVFJJQ1RFRF9UT0tFTgkweEMwCisjZGVmaW5lIEZERElfRkNfS19TTVRfTUlOCQkweDQxCisjZGVmaW5lIEZERElfRkNfS19TTVRfTUFYCQkweDRGCisjZGVmaW5lIEZERElfRkNfS19NQUNfTUlOCQkweEMxCisjZGVmaW5lIEZERElfRkNfS19NQUNfTUFYCQkweENGCisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUlOCQkweDUwCisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfREVGCQkweDU0CisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUFYCQkweDVGCisjZGVmaW5lIEZERElfRkNfS19TWU5DX0xMQ19NSU4JCTB4RDAKKyNkZWZpbmUgRkRESV9GQ19LX1NZTkNfTExDX01BWAkJMHhENworI2RlZmluZSBGRERJX0ZDX0tfSU1QTEVNRU5UT1JfTUlOCTB4NjAKKyNkZWZpbmUgRkRESV9GQ19LX0lNUExFTUVOVE9SX01BWAkweDZGCisjZGVmaW5lIEZERElfRkNfS19SRVNFUlZFRF9NSU4JCTB4NzAKKyNkZWZpbmUgRkRESV9GQ19LX1JFU0VSVkVEX01BWAkJMHg3RgogCiAvKiBEZWZpbmUgTExDIGFuZCBTTkFQIGNvbnN0YW50cyAqLwotI2RlZmluZSBGRERJX0VYVEVOREVEX1NBUAkweEFBCisjZGVmaW5lIEZERElfRVhURU5ERURfU0FQCQkweEFBCiAjZGVmaW5lIEZERElfVUlfQ01ECQkJMHgwMwogCiAvKiBEZWZpbmUgODAyLjIgVHlwZSAxIGhlYWRlciAqLwogc3RydWN0IGZkZGlfODAyMl8xX2hkciB7Ci0JX191OAlkc2FwOwkJCQkJLyogZGVzdGluYXRpb24gc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KLQlfX3U4CXNzYXA7CQkJCQkvKiBzb3VyY2Ugc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KLQlfX3U4CWN0cmw7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzEgKi8KKwlfX3U4CWRzYXA7CQkJLyogZGVzdGluYXRpb24gc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KKwlfX3U4CXNzYXA7CQkJLyogc291cmNlIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCisJX191OAljdHJsOwkJCS8qIGNvbnRyb2wgYnl0ZSAjMSAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogRGVmaW5lIDgwMi4yIFR5cGUgMiBoZWFkZXIgKi8KIHN0cnVjdCBmZGRpXzgwMjJfMl9oZHIgewotCV9fdTgJZHNhcDsJCQkJCS8qIGRlc3RpbmF0aW9uIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCi0JX191OAlzc2FwOwkJCQkJLyogc291cmNlIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCi0JX191OAljdHJsXzE7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzEgKi8KLQlfX3U4CWN0cmxfMjsJCQkJCS8qIGNvbnRyb2wgYnl0ZSAjMiAqLworCV9fdTgJZHNhcDsJCQkvKiBkZXN0aW5hdGlvbiBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJc3NhcDsJCQkvKiBzb3VyY2Ugc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KKwlfX3U4CWN0cmxfMTsJCQkvKiBjb250cm9sIGJ5dGUgIzEgKi8KKwlfX3U4CWN0cmxfMjsJCQkvKiBjb250cm9sIGJ5dGUgIzIgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIERlZmluZSA4MDIuMiBTTkFQIGhlYWRlciAqLwotI2RlZmluZSBGRERJX0tfT1VJX0xFTgkzCiBzdHJ1Y3QgZmRkaV9zbmFwX2hkciB7Ci0JX191OAlkc2FwOwkJCQkJLyogYWx3YXlzIDB4QUEgKi8KLQlfX3U4CXNzYXA7CQkJCQkvKiBhbHdheXMgMHhBQSAqLwotCV9fdTgJY3RybDsJCQkJCS8qIGFsd2F5cyAweDAzICovCisJX191OAlkc2FwOwkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAlzc2FwOwkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAljdHJsOwkJCS8qIGFsd2F5cyAweDAzICovCiAJX191OAlvdWlbRkRESV9LX09VSV9MRU5dOwkvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KLQlfX2JlMTYJZXRoZXJ0eXBlOwkJCQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLworCV9fYmUxNglldGhlcnR5cGU7CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogRGVmaW5lIEZEREkgTExDIGZyYW1lIGhlYWRlciAqLwogc3RydWN0IGZkZGloZHIgewotCV9fdTgJZmM7CQkJCQkJLyogZnJhbWUgY29udHJvbCAqLwotCV9fdTgJZGFkZHJbRkRESV9LX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLwotCV9fdTgJc2FkZHJbRkRESV9LX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KLQl1bmlvbgotCQl7Ci0JCXN0cnVjdCBmZGRpXzgwMjJfMV9oZHIJCWxsY184MDIyXzE7Ci0JCXN0cnVjdCBmZGRpXzgwMjJfMl9oZHIJCWxsY184MDIyXzI7Ci0JCXN0cnVjdCBmZGRpX3NuYXBfaGRyCQlsbGNfc25hcDsKLQkJfSBoZHI7CisJX191OAlmYzsJCQkvKiBmcmFtZSBjb250cm9sICovCisJX191OAlkYWRkcltGRERJX0tfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3U4CXNhZGRyW0ZERElfS19BTEVOXTsJLyogc291cmNlIGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBmZGRpXzgwMjJfMV9oZHIJbGxjXzgwMjJfMTsKKwkJc3RydWN0IGZkZGlfODAyMl8yX2hkcglsbGNfODAyMl8yOworCQlzdHJ1Y3QgZmRkaV9zbmFwX2hkcglsbGNfc25hcDsKKwl9IGhkcjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmgKaW5kZXggOWE3ZjdhYy4uYjM4NTM0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfbGluay5oCkBAIC0zMTksNiArMzE5LDkgQEAKIAlJRkxBX1ZYTEFOX1BPUlQsCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KIAlJRkxBX1ZYTEFOX0dST1VQNiwKIAlJRkxBX1ZYTEFOX0xPQ0FMNiwKKwlJRkxBX1ZYTEFOX1VEUF9DU1VNLAorCUlGTEFfVlhMQU5fVURQX1pFUk9fQ1NVTTZfVFgsCisJSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWCwKIAlfX0lGTEFfVlhMQU5fTUFYCiB9OwogI2RlZmluZSBJRkxBX1ZYTEFOX01BWAkoX19JRkxBX1ZYTEFOX01BWCAtIDEpCkBAIC0zOTksOSArNDAyLDEwIEBACiAJSUZMQV9WRl9VTlNQRUMsCiAJSUZMQV9WRl9NQUMsCQkvKiBIYXJkd2FyZSBxdWV1ZSBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCiAJSUZMQV9WRl9WTEFOLAotCUlGTEFfVkZfVFhfUkFURSwJLyogVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KKwlJRkxBX1ZGX1RYX1JBVEUsCS8qIE1heCBUWCBCYW5kd2lkdGggQWxsb2NhdGlvbiAqLwogCUlGTEFfVkZfU1BPT0ZDSEssCS8qIFNwb29mIENoZWNraW5nIG9uL29mZiBzd2l0Y2ggKi8KIAlJRkxBX1ZGX0xJTktfU1RBVEUsCS8qIGxpbmsgc3RhdGUgZW5hYmxlL2Rpc2FibGUvYXV0byBzd2l0Y2ggKi8KKwlJRkxBX1ZGX1JBVEUsCQkvKiBNaW4gYW5kIE1heCBUWCBCYW5kd2lkdGggQWxsb2NhdGlvbiAqLwogCV9fSUZMQV9WRl9NQVgsCiB9OwogCkBAIC00MjMsNiArNDI3LDEyIEBACiAJX191MzIgcmF0ZTsgLyogTWF4IFRYIGJhbmR3aWR0aCBpbiBNYnBzLCAwIGRpc2FibGVzIHRocm90dGxpbmcgKi8KIH07CiAKK3N0cnVjdCBpZmxhX3ZmX3JhdGUgeworCV9fdTMyIHZmOworCV9fdTMyIG1pbl90eF9yYXRlOyAvKiBNaW4gQmFuZHdpZHRoIGluIE1icHMgKi8KKwlfX3UzMiBtYXhfdHhfcmF0ZTsgLyogTWF4IEJhbmR3aWR0aCBpbiBNYnBzICovCit9OworCiBzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoayB7CiAJX191MzIgdmY7CiAJX191MzIgc2V0dGluZzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl90dW5uZWwuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl90dW5uZWwuaAppbmRleCBhZWU3M2QwLi4zYmNlOWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3R1bm5lbC5oCkBAIC0xMDAsNyArMTAwLDcgQEAKICNkZWZpbmUgSUZMQV9HUkVfTUFYCShfX0lGTEFfR1JFX01BWCAtIDEpCiAKIC8qIFZUSS1tb2RlIGlfZmxhZ3MgKi8KLSNkZWZpbmUgVlRJX0lTVlRJIDB4MDAwMQorI2RlZmluZSBWVElfSVNWVEkgKChfX2ZvcmNlIF9fYmUxNikweDAwMDEpCiAKIGVudW0gewogCUlGTEFfVlRJX1VOU1BFQywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9sMnRwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbDJ0cC5oCmluZGV4IDhhZGI2ODEuLjIxY2FhMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9sMnRwLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2wydHAuaApAQCAtMTI0LDYgKzEyNCw4IEBACiAJTDJUUF9BVFRSX1NUQVRTLAkJLyogbmVzdGVkICovCiAJTDJUUF9BVFRSX0lQNl9TQUREUiwJCS8qIHN0cnVjdCBpbjZfYWRkciAqLwogCUwyVFBfQVRUUl9JUDZfREFERFIsCQkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlMMlRQX0FUVFJfVURQX1pFUk9fQ1NVTTZfVFgsCS8qIHU4ICovCisJTDJUUF9BVFRSX1VEUF9aRVJPX0NTVU02X1JYLAkvKiB1OCAqLwogCV9fTDJUUF9BVFRSX01BWCwKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZWlnaGJvdXIuaAppbmRleCBkM2VmNTgzLi40YTFkN2U5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmVpZ2hib3VyLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25laWdoYm91ci5oCkBAIC0yNCw2ICsyNCw3IEBACiAJTkRBX1BPUlQsCiAJTkRBX1ZOSSwKIAlOREFfSUZJTkRFWCwKKwlOREFfTUFTVEVSLAogCV9fTkRBX01BWAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKaW5kZXggYzg4Y2NiZi4uMmE4OGY2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCkBAIC0yMTIsNiArMjEyLDI5IEBACiB9OwogCiAvKioKKyAqIGVudW0gbmZ0X3NldF9wb2xpY2llcyAtIHNldCBzZWxlY3Rpb24gcG9saWN5CisgKgorICogQE5GVF9TRVRfUE9MX1BFUkZPUk1BTkNFOiBwcmVmZXIgaGlnaCBwZXJmb3JtYW5jZSBvdmVyIGxvdyBtZW1vcnkgdXNlCisgKiBATkZUX1NFVF9QT0xfTUVNT1JZOiBwcmVmZXIgbG93IG1lbW9yeSB1c2Ugb3ZlciBoaWdoIHBlcmZvcm1hbmNlCisgKi8KK2VudW0gbmZ0X3NldF9wb2xpY2llcyB7CisJTkZUX1NFVF9QT0xfUEVSRk9STUFOQ0UsCisJTkZUX1NFVF9QT0xfTUVNT1JZLAorfTsKKworLyoqCisgKiBlbnVtIG5mdF9zZXRfZGVzY19hdHRyaWJ1dGVzIC0gc2V0IGVsZW1lbnQgZGVzY3JpcHRpb24KKyAqCisgKiBATkZUQV9TRVRfREVTQ19TSVpFOiBudW1iZXIgb2YgZWxlbWVudHMgaW4gc2V0IChOTEFfVTMyKQorICovCitlbnVtIG5mdF9zZXRfZGVzY19hdHRyaWJ1dGVzIHsKKwlORlRBX1NFVF9ERVNDX1VOU1BFQywKKwlORlRBX1NFVF9ERVNDX1NJWkUsCisJX19ORlRBX1NFVF9ERVNDX01BWAorfTsKKyNkZWZpbmUgTkZUQV9TRVRfREVTQ19NQVgJKF9fTkZUQV9TRVRfREVTQ19NQVggLSAxKQorCisvKioKICAqIGVudW0gbmZ0X3NldF9hdHRyaWJ1dGVzIC0gbmZfdGFibGVzIHNldCBuZXRsaW5rIGF0dHJpYnV0ZXMKICAqCiAgKiBATkZUQV9TRVRfVEFCTEU6IHRhYmxlIG5hbWUgKE5MQV9TVFJJTkcpCkBAIC0yMjEsNiArMjQ0LDkgQEAKICAqIEBORlRBX1NFVF9LRVlfTEVOOiBrZXkgZGF0YSBsZW5ndGggKE5MQV9VMzIpCiAgKiBATkZUQV9TRVRfREFUQV9UWVBFOiBtYXBwaW5nIGRhdGEgdHlwZSAoTkxBX1UzMikKICAqIEBORlRBX1NFVF9EQVRBX0xFTjogbWFwcGluZyBkYXRhIGxlbmd0aCAoTkxBX1UzMikKKyAqIEBORlRBX1NFVF9QT0xJQ1k6IHNlbGVjdGlvbiBwb2xpY3kgKE5MQV9VMzIpCisgKiBATkZUQV9TRVRfREVTQzogc2V0IGRlc2NyaXB0aW9uIChOTEFfTkVTVEVEKQorICogQE5GVEFfU0VUX0lEOiB1bmlxdWVseSBpZGVudGlmaWVzIGEgc2V0IGluIGEgdHJhbnNhY3Rpb24gKE5MQV9VMzIpCiAgKi8KIGVudW0gbmZ0X3NldF9hdHRyaWJ1dGVzIHsKIAlORlRBX1NFVF9VTlNQRUMsCkBAIC0yMzEsNiArMjU3LDkgQEAKIAlORlRBX1NFVF9LRVlfTEVOLAogCU5GVEFfU0VUX0RBVEFfVFlQRSwKIAlORlRBX1NFVF9EQVRBX0xFTiwKKwlORlRBX1NFVF9QT0xJQ1ksCisJTkZUQV9TRVRfREVTQywKKwlORlRBX1NFVF9JRCwKIAlfX05GVEFfU0VUX01BWAogfTsKICNkZWZpbmUgTkZUQV9TRVRfTUFYCQkoX19ORlRBX1NFVF9NQVggLSAxKQpAQCAtMjY2LDEyICsyOTUsMTQgQEAKICAqIEBORlRBX1NFVF9FTEVNX0xJU1RfVEFCTEU6IHRhYmxlIG9mIHRoZSBzZXQgdG8gYmUgY2hhbmdlZCAoTkxBX1NUUklORykKICAqIEBORlRBX1NFVF9FTEVNX0xJU1RfU0VUOiBuYW1lIG9mIHRoZSBzZXQgdG8gYmUgY2hhbmdlZCAoTkxBX1NUUklORykKICAqIEBORlRBX1NFVF9FTEVNX0xJU1RfRUxFTUVOVFM6IGxpc3Qgb2Ygc2V0IGVsZW1lbnRzIChOTEFfTkVTVEVEOiBuZnRfc2V0X2VsZW1fYXR0cmlidXRlcykKKyAqIEBORlRBX1NFVF9FTEVNX0xJU1RfU0VUX0lEOiB1bmlxdWVseSBpZGVudGlmaWVzIGEgc2V0IGluIGEgdHJhbnNhY3Rpb24gKE5MQV9VMzIpCiAgKi8KIGVudW0gbmZ0X3NldF9lbGVtX2xpc3RfYXR0cmlidXRlcyB7CiAJTkZUQV9TRVRfRUxFTV9MSVNUX1VOU1BFQywKIAlORlRBX1NFVF9FTEVNX0xJU1RfVEFCTEUsCiAJTkZUQV9TRVRfRUxFTV9MSVNUX1NFVCwKIAlORlRBX1NFVF9FTEVNX0xJU1RfRUxFTUVOVFMsCisJTkZUQV9TRVRfRUxFTV9MSVNUX1NFVF9JRCwKIAlfX05GVEFfU0VUX0VMRU1fTElTVF9NQVgKIH07CiAjZGVmaW5lIE5GVEFfU0VUX0VMRU1fTElTVF9NQVgJKF9fTkZUQV9TRVRfRUxFTV9MSVNUX01BWCAtIDEpCkBAIC00NTcsMTIgKzQ4OCwxNCBAQAogICogQE5GVEFfTE9PS1VQX1NFVDogbmFtZSBvZiB0aGUgc2V0IHdoZXJlIHRvIGxvb2sgZm9yIChOTEFfU1RSSU5HKQogICogQE5GVEFfTE9PS1VQX1NSRUc6IHNvdXJjZSByZWdpc3RlciBvZiB0aGUgZGF0YSB0byBsb29rIGZvciAoTkxBX1UzMjogbmZ0X3JlZ2lzdGVycykKICAqIEBORlRBX0xPT0tVUF9EUkVHOiBkZXN0aW5hdGlvbiByZWdpc3RlciAoTkxBX1UzMjogbmZ0X3JlZ2lzdGVycykKKyAqIEBORlRBX0xPT0tVUF9TRVRfSUQ6IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBzZXQgaW4gYSB0cmFuc2FjdGlvbiAoTkxBX1UzMikKICAqLwogZW51bSBuZnRfbG9va3VwX2F0dHJpYnV0ZXMgewogCU5GVEFfTE9PS1VQX1VOU1BFQywKIAlORlRBX0xPT0tVUF9TRVQsCiAJTkZUQV9MT09LVVBfU1JFRywKIAlORlRBX0xPT0tVUF9EUkVHLAorCU5GVEFfTE9PS1VQX1NFVF9JRCwKIAlfX05GVEFfTE9PS1VQX01BWAogfTsKICNkZWZpbmUgTkZUQV9MT09LVVBfTUFYCQkoX19ORlRBX0xPT0tVUF9NQVggLSAxKQpAQCAtNTM2LDYgKzU2OSw4IEBACiAgKiBATkZUX01FVEFfU0VDTUFSSzogcGFja2V0IHNlY21hcmsgKHNrYi0+c2VjbWFyaykKICAqIEBORlRfTUVUQV9ORlBST1RPOiBuZXRmaWx0ZXIgcHJvdG9jb2wKICAqIEBORlRfTUVUQV9MNFBST1RPOiBsYXllciA0IHByb3RvY29sIG51bWJlcgorICogQE5GVF9NRVRBX0JSSV9JSUZOQU1FOiBwYWNrZXQgaW5wdXQgYnJpZGdlIGludGVyZmFjZSBuYW1lCisgKiBATkZUX01FVEFfQlJJX09JRk5BTUU6IHBhY2tldCBvdXRwdXQgYnJpZGdlIGludGVyZmFjZSBuYW1lCiAgKi8KIGVudW0gbmZ0X21ldGFfa2V5cyB7CiAJTkZUX01FVEFfTEVOLApAQCAtNTU1LDYgKzU5MCw4IEBACiAJTkZUX01FVEFfU0VDTUFSSywKIAlORlRfTUVUQV9ORlBST1RPLAogCU5GVF9NRVRBX0w0UFJPVE8sCisJTkZUX01FVEFfQlJJX0lJRk5BTUUsCisJTkZUX01FVEFfQlJJX09JRk5BTUUsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCmluZGV4IDU5NmRkZDQuLjM1NGE3ZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKQEAgLTIwLDYgKzIwLDggQEAKICNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfRVhQX0RFU1RST1kJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX0RFU1RST1kKIAlORk5MR1JQX05GVEFCTEVTLAogI2RlZmluZSBORk5MR1JQX05GVEFCTEVTICAgICAgICAgICAgICAgIE5GTkxHUlBfTkZUQUJMRVMKKwlORk5MR1JQX0FDQ1RfUVVPVEEsCisjZGVmaW5lIE5GTkxHUlBfQUNDVF9RVU9UQQkJTkZOTEdSUF9BQ0NUX1FVT1RBCiAJX19ORk5MR1JQX01BWCwKIH07CiAjZGVmaW5lIE5GTkxHUlBfTUFYCShfX05GTkxHUlBfTUFYIC0gMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaAppbmRleCBjN2I2MjY5Li41MTQwNGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCkBAIC0xMCwxNSArMTAsMjQgQEAKIAlORk5MX01TR19BQ0NUX0dFVCwKIAlORk5MX01TR19BQ0NUX0dFVF9DVFJaRVJPLAogCU5GTkxfTVNHX0FDQ1RfREVMLAorCU5GTkxfTVNHX0FDQ1RfT1ZFUlFVT1RBLAogCU5GTkxfTVNHX0FDQ1RfTUFYCiB9OwogCitlbnVtIG5mbmxfYWNjdF9mbGFncyB7CisJTkZBQ0NUX0ZfUVVPVEFfUEtUUwk9ICgxIDw8IDApLAorCU5GQUNDVF9GX1FVT1RBX0JZVEVTCT0gKDEgPDwgMSksCisJTkZBQ0NUX0ZfT1ZFUlFVT1RBCT0gKDEgPDwgMiksIC8qIGNhbid0IGJlIHNldCBmcm9tIHVzZXJzcGFjZSAqLworfTsKKwogZW51bSBuZm5sX2FjY3RfdHlwZSB7CiAJTkZBQ0NUX1VOU1BFQywKIAlORkFDQ1RfTkFNRSwKIAlORkFDQ1RfUEtUUywKIAlORkFDQ1RfQllURVMsCiAJTkZBQ0NUX1VTRSwKKwlORkFDQ1RfRkxBR1MsCisJTkZBQ0NUX1FVT1RBLAogCV9fTkZBQ0NUX01BWAogfTsKICNkZWZpbmUgTkZBQ0NUX01BWCAoX19ORkFDQ1RfTUFYIC0gMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZmMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZmMuaAppbmRleCA5Nzg5ZGM5Li45YjE5YjQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmZjLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25mYy5oCkBAIC0yNzMsMTEgKzI3MywxOSBAQAogICogRmlyc3QgYnl0ZSBpcyB0aGUgYWRhcHRlciBpbmRleAogICogU2Vjb25kIGJ5dGUgY29udGFpbnMgZmxhZ3MKICAqICAtIDB4MDEgLSBEaXJlY3Rpb24gKDA9UlgsIDE9VFgpCi0gKiAgLSAweDAyLTB4ODAgLSBSZXNlcnZlZAorICogIC0gMHgwMi0weDA0IC0gUGF5bG9hZCB0eXBlICgwMDA9TExDUCwgMDAxPU5DSSwgMDEwPUhDSSwgMDExPURpZ2l0YWwsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMD1Qcm9wcmlldGFyeSkKKyAqICAtIDB4MDUtMHg4MCAtIFJlc2VydmVkCiAgKiovCi0jZGVmaW5lIE5GQ19MTENQX1JBV19IRUFERVJfU0laRQkyCi0jZGVmaW5lIE5GQ19MTENQX0RJUkVDVElPTl9SWAkJMHgwMAotI2RlZmluZSBORkNfTExDUF9ESVJFQ1RJT05fVFgJCTB4MDEKKyNkZWZpbmUgTkZDX1JBV19IRUFERVJfU0laRQkyCisjZGVmaW5lIE5GQ19ESVJFQ1RJT05fUlgJCTB4MDAKKyNkZWZpbmUgTkZDX0RJUkVDVElPTl9UWAkJMHgwMQorCisjZGVmaW5lIFJBV19QQVlMT0FEX0xMQ1AgMAorI2RlZmluZSBSQVdfUEFZTE9BRF9OQ0kJMQorI2RlZmluZSBSQVdfUEFZTE9BRF9IQ0kJMgorI2RlZmluZSBSQVdfUEFZTE9BRF9ESUdJVEFMCTMKKyNkZWZpbmUgUkFXX1BBWUxPQURfUFJPUFJJRVRBUlkJNAogCiAvKiBzb2NrZXQgb3B0aW9uIG5hbWVzICovCiAjZGVmaW5lIE5GQ19MTENQX1JXCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaAppbmRleCAxOTRjMWVhLi5iZTk1MTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKQEAgLTUwMyw2ICs1MDMsOSBAQAogICoJVFggc3RhdHVzIGV2ZW50IHBlcnRhaW5pbmcgdG8gdGhlIFRYIHJlcXVlc3QuCiAgKgklTkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc2VuZCB0aGUKICAqCW1hbmFnZW1lbnQgZnJhbWVzIGF0IENDSyByYXRlIG9yIG5vdCBpbiAyR0h6IGJhbmQuCisgKgklTkw4MDIxMV9BVFRSX0NTQV9DX09GRlNFVFNfVFggaXMgYW4gYXJyYXkgb2Ygb2Zmc2V0cyB0byBDU0EKKyAqCWNvdW50ZXJzIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgY3VycmVudCB2YWx1ZS4gVGhpcyBhdHRyaWJ1dGUKKyAqCWlzIHVzZWQgZHVyaW5nIENTQSBwZXJpb2QuCiAgKiBATkw4MDIxMV9DTURfRlJBTUVfV0FJVF9DQU5DRUw6IFdoZW4gYW4gb2ZmLWNoYW5uZWwgVFggd2FzIHJlcXVlc3RlZCwgdGhpcwogICoJY29tbWFuZCBtYXkgYmUgdXNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvb2tpZSB0byBjYW5jZWwgdGhlIHdhaXQKICAqCXRpbWUgaWYgaXQgaXMga25vd24gdGhhdCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgpAQCAtMTUyNSwxMCArMTUyOCwxMCBAQAogICoJb3BlcmF0aW9uKS4KICAqIEBOTDgwMjExX0FUVFJfQ1NBX0lFUzogTmVzdGVkIHNldCBvZiBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGhlIElFIGluZm9ybWF0aW9uCiAgKglmb3IgdGhlIHRpbWUgd2hpbGUgcGVyZm9ybWluZyBhIGNoYW5uZWwgc3dpdGNoLgotICogQE5MODAyMTFfQVRUUl9DU0FfQ19PRkZfQkVBQ09OOiBPZmZzZXQgb2YgdGhlIGNoYW5uZWwgc3dpdGNoIGNvdW50ZXIKLSAqCWZpZWxkIGluIHRoZSBiZWFjb25zIHRhaWwgKCVOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUwpLgotICogQE5MODAyMTFfQVRUUl9DU0FfQ19PRkZfUFJFU1A6IE9mZnNldCBvZiB0aGUgY2hhbm5lbCBzd2l0Y2ggY291bnRlcgotICoJZmllbGQgaW4gdGhlIHByb2JlIHJlc3BvbnNlICglTkw4MDIxMV9BVFRSX1BST0JFX1JFU1ApLgorICogQE5MODAyMTFfQVRUUl9DU0FfQ19PRkZfQkVBQ09OOiBBbiBhcnJheSBvZiBvZmZzZXRzICh1MTYpIHRvIHRoZSBjaGFubmVsCisgKglzd2l0Y2ggY291bnRlcnMgaW4gdGhlIGJlYWNvbnMgdGFpbCAoJU5MODAyMTFfQVRUUl9CRUFDT05fVEFJTCkuCisgKiBATkw4MDIxMV9BVFRSX0NTQV9DX09GRl9QUkVTUDogQW4gYXJyYXkgb2Ygb2Zmc2V0cyAodTE2KSB0byB0aGUgY2hhbm5lbAorICoJc3dpdGNoIGNvdW50ZXJzIGluIHRoZSBwcm9iZSByZXNwb25zZSAoJU5MODAyMTFfQVRUUl9QUk9CRV9SRVNQKS4KICAqCiAgKiBATkw4MDIxMV9BVFRSX1JYTUdNVF9GTEFHUzogZmxhZ3MgZm9yIG5sODAyMTFfc2VuZF9tZ210KCksIHUzMi4KICAqCUFzIHNwZWNpZmllZCBpbiB0aGUgJmVudW0gbmw4MDIxMV9yeG1nbXRfZmxhZ3MuCkBAIC0xNTc2LDkgKzE1NzksMTggQEAKICAqCWFkdmVydGlzZSB2YWx1ZXMgdGhhdCBjYW5ub3QgYWx3YXlzIGJlIG1ldC4gSW4gc3VjaCBjYXNlcywgYW4gYXR0ZW1wdAogICoJdG8gYWRkIGEgbmV3IHN0YXRpb24gZW50cnkgd2l0aCBATkw4MDIxMV9DTURfTkVXX1NUQVRJT04gbWF5IGZhaWwuCiAgKgorICogQE5MODAyMTFfQVRUUl9DU0FfQ19PRkZTRVRTX1RYOiBBbiBhcnJheSBvZiBjc2EgY291bnRlciBvZmZzZXRzICh1MTYpIHdoaWNoCisgKglzaG91bGQgYmUgdXBkYXRlZCB3aGVuIHRoZSBmcmFtZSBpcyB0cmFuc21pdHRlZC4KKyAqIEBOTDgwMjExX0FUVFJfTUFYX0NTQV9DT1VOVEVSUzogVTggYXR0cmlidXRlIHVzZWQgdG8gYWR2ZXJ0aXNlIHRoZSBtYXhpbXVtCisgKglzdXBwb3J0ZWQgbnVtYmVyIG9mIGNzYSBjb3VudGVycy4KKyAqCiAgKiBATkw4MDIxMV9BVFRSX1RETFNfUEVFUl9DQVBBQklMSVRZOiBmbGFncyBmb3IgVERMUyBwZWVyIGNhcGFiaWxpdGllcywgdTMyLgogICoJQXMgc3BlY2lmaWVkIGluIHRoZSAmZW51bSBubDgwMjExX3RkbHNfcGVlcl9jYXBhYmlsaXR5LgogICoKKyAqIEBOTDgwMjExX0FUVFJfSUZBQ0VfU09DS0VUX09XTkVSOiBmbGFnIGF0dHJpYnV0ZSwgaWYgc2V0IGR1cmluZyBpbnRlcmZhY2UKKyAqCWNyZWF0aW9uIHRoZW4gdGhlIG5ldyBpbnRlcmZhY2Ugd2lsbCBiZSBvd25lZCBieSB0aGUgbmV0bGluayBzb2NrZXQKKyAqCXRoYXQgY3JlYXRlZCBpdCBhbmQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZAorICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTkxNCw2ICsxOTI2LDExIEBACiAKIAlOTDgwMjExX0FUVFJfVERMU19QRUVSX0NBUEFCSUxJVFksCiAKKwlOTDgwMjExX0FUVFJfSUZBQ0VfU09DS0VUX09XTkVSLAorCisJTkw4MDIxMV9BVFRSX0NTQV9DX09GRlNFVFNfVFgsCisJTkw4MDIxMV9BVFRSX01BWF9DU0FfQ09VTlRFUlMsCisKIAkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KIAogCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCkBAIC0yMTgyLDYgKzIxOTksOCBAQAogICoJQ29udGFpbnMgYSBuZXN0ZWQgYXJyYXkgb2Ygc2lnbmFsIHN0cmVuZ3RoIGF0dHJpYnV0ZXMgKHU4LCBkQm0pCiAgKiBATkw4MDIxMV9TVEFfSU5GT19DSEFJTl9TSUdOQUxfQVZHOiBwZXItY2hhaW4gc2lnbmFsIHN0cmVuZ3RoIGF2ZXJhZ2UKICAqCVNhbWUgZm9ybWF0IGFzIE5MODAyMTFfU1RBX0lORk9fQ0hBSU5fU0lHTkFMLgorICogQE5MODAyMTFfU1RBX0VYUEVDVEVEX1RIUk9VR0hQVVQ6IGV4cGVjdGVkIHRocm91Z2hwdXQgY29uc2lkZXJpbmcgYWxzbyB0aGUKKyAqCTgwMi4xMSBoZWFkZXIgKHUzMiwga2JwcykKICAqIEBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwKICAqIEBOTDgwMjExX1NUQV9JTkZPX01BWDogaGlnaGVzdCBwb3NzaWJsZSBzdGF0aW9uIGluZm8gYXR0cmlidXRlCiAgKi8KQEAgLTIyMTMsNiArMjIzMiw3IEBACiAJTkw4MDIxMV9TVEFfSU5GT19UWF9CWVRFUzY0LAogCU5MODAyMTFfU1RBX0lORk9fQ0hBSU5fU0lHTkFMLAogCU5MODAyMTFfU1RBX0lORk9fQ0hBSU5fU0lHTkFMX0FWRywKKwlOTDgwMjExX1NUQV9JTkZPX0VYUEVDVEVEX1RIUk9VR0hQVVQsCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVCwKQEAgLTIzMzYsOSArMjM1NiwzNCBAQAogICoJdXNpbmcgdGhpcyBjaGFubmVsIGFzIHRoZSBwcmltYXJ5IG9yIGFueSBvZiB0aGUgc2Vjb25kYXJ5IGNoYW5uZWxzCiAgKglpc24ndCBwb3NzaWJsZQogICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfREZTX0NBQ19USU1FOiBERlMgQ0FDIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfSU5ET09SX09OTFk6IE9ubHkgaW5kb29yIHVzZSBpcyBwZXJtaXR0ZWQgb24gdGhpcworICoJY2hhbm5lbC4gQSBjaGFubmVsIHRoYXQgaGFzIHRoZSBJTkRPT1JfT05MWSBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUKKyAqCXVzZWQgd2hlbiB0aGVyZSBpcyBhIGNsZWFyIGFzc2Vzc21lbnQgdGhhdCB0aGUgZGV2aWNlIGlzIG9wZXJhdGluZyBpbgorICoJYW4gaW5kb29yIHN1cnJvdW5kaW5ncywgaS5lLiwgaXQgaXMgY29ubmVjdGVkIHRvIEFDIHBvd2VyIChhbmQgbm90CisgKgl0aHJvdWdoIHBvcnRhYmxlIERDIGludmVydGVycykgb3IgaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgYSBtYXN0ZXIKKyAqCXRoYXQgaXMgYWN0aW5nIGFzIGFuIEFQIGFuZCBpcyBjb25uZWN0ZWQgdG8gQUMgcG93ZXIuCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9HT19DT05DVVJSRU5UOiBHTyBvcGVyYXRpb24gaXMgYWxsb3dlZCBvbiB0aGlzCisgKgljaGFubmVsIGlmIGl0J3MgY29ubmVjdGVkIGNvbmN1cnJlbnRseSB0byBhIEJTUyBvbiB0aGUgc2FtZSBjaGFubmVsIG9uCisgKgl0aGUgMiBHSHogYmFuZCBvciB0byBhIGNoYW5uZWwgaW4gdGhlIHNhbWUgVU5JSSBiYW5kIChvbiB0aGUgNSBHSHoKKyAqCWJhbmQpLCBhbmQgSUVFRTgwMjExX0NIQU5fUkFEQVIgaXMgbm90IHNldC4gSW5zdGFudGlhdGluZyBhIEdPIG9uIGEKKyAqCWNoYW5uZWwgdGhhdCBoYXMgdGhlIEdPX0NPTkNVUlJFTlQgYXR0cmlidXRlIHNldCBjYW4gYmUgZG9uZSB3aGVuIHRoZXJlCisgKglpcyBhIGNsZWFyIGFzc2Vzc21lbnQgdGhhdCB0aGUgZGV2aWNlIGlzIG9wZXJhdGluZyB1bmRlciB0aGUgZ3VpZGFuY2Ugb2YKKyAqCWFuIGF1dGhvcml6ZWQgbWFzdGVyLCBpLmUuLCBzZXR0aW5nIHVwIGEgR08gd2hpbGUgdGhlIGRldmljZSBpcyBhbHNvCisgKgljb25uZWN0ZWQgdG8gYW4gQVAgd2l0aCBERlMgYW5kIHJhZGFyIGRldGVjdGlvbiBvbiB0aGUgVU5JSSBiYW5kIChpdCBpcworICoJdXAgdG8gdXNlci1zcGFjZSwgaS5lLiwgd3BhX3N1cHBsaWNhbnQgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQKKyAqCXZlcmlmaWNhdGlvbnMpCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT18yME1IWjogMjAgTUh6IG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAorICoJb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT18xME1IWjogMTAgTUh6IG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAorICoJb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCiAgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVg6IGhpZ2hlc3QgZnJlcXVlbmN5IGF0dHJpYnV0ZSBudW1iZXIKICAqCWN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICoKKyAqIFNlZSBodHRwczovL2FwcHMuZmNjLmdvdi9lYXMvY29tbWVudHMvR2V0UHVibGlzaGVkRG9jdW1lbnQuaHRtbD9pZD0zMjcmdG49NTI4MTIyCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgRkNDIGRlc2NyaXB0aW9uIG9mIHRoZSByZWxheGF0aW9ucyBhbGxvd2VkCisgKiBieSBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lORE9PUl9PTkxZIGFuZAorICogTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9HT19DT05DVVJSRU5ULgogICovCiBlbnVtIG5sODAyMTFfZnJlcXVlbmN5X2F0dHIgewogCV9fTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9JTlZBTElELApAQCAtMjM1NSw2ICsyNDAwLDEwIEBACiAJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT184ME1IWiwKIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzE2ME1IWiwKIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RGU19DQUNfVElNRSwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lORE9PUl9PTkxZLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfR09fQ09OQ1VSUkVOVCwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzIwTUhaLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fMTBNSFosCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVCwKQEAgLTI1NzMsMTAgKzI2MjIsMTMgQEAKICAqCXByZXNlbnQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSB3aXJlbGVzcyBjb3JlIHRoYXQKICAqCWhhcyBsaXN0ZWQgTkw4MDIxMV9GRUFUVVJFX0NFTExfQkFTRV9SRUdfSElOVFMgYXMgYQogICoJc3VwcG9ydGVkIGZlYXR1cmUuCisgKiBATkw4MDIxMV9VU0VSX1JFR19ISU5UX0lORE9PUjogYSB1c2VyIHNlbnQgYW4gaGludCBpbmRpY2F0aW5nIHRoYXQgdGhlCisgKglwbGF0Zm9ybSBpcyBvcGVyYXRpbmcgaW4gYW4gaW5kb29yIGVudmlyb25tZW50LgogICovCiBlbnVtIG5sODAyMTFfdXNlcl9yZWdfaGludF90eXBlIHsKIAlOTDgwMjExX1VTRVJfUkVHX0hJTlRfVVNFUgk9IDAsCiAJTkw4MDIxMV9VU0VSX1JFR19ISU5UX0NFTExfQkFTRSA9IDEsCisJTkw4MDIxMV9VU0VSX1JFR19ISU5UX0lORE9PUiAgICA9IDIsCiB9OwogCiAvKioKQEAgLTM2NTAsNiArMzcwMiw4IEBACiAgKglkaWZmZXJlbnQgY2hhbm5lbHMgbWF5IGJlIHVzZWQgd2l0aGluIHRoaXMgZ3JvdXAuCiAgKiBATkw4MDIxMV9JRkFDRV9DT01CX1JBREFSX0RFVEVDVF9XSURUSFM6IHUzMiBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgYml0bWFwCiAgKglvZiBzdXBwb3J0ZWQgY2hhbm5lbCB3aWR0aHMgZm9yIHJhZGFyIGRldGVjdGlvbi4KKyAqIEBOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1JFR0lPTlM6IHUzMiBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgYml0bWFwCisgKglvZiBzdXBwb3J0ZWQgcmVndWxhdG9yeSByZWdpb25zIGZvciByYWRhciBkZXRlY3Rpb24uCiAgKiBATlVNX05MODAyMTFfSUZBQ0VfQ09NQjogbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAqIEBNQVhfTkw4MDIxMV9JRkFDRV9DT01COiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIKICAqCkBAIC0zNjgzLDYgKzM3MzcsNyBAQAogCU5MODAyMTFfSUZBQ0VfQ09NQl9TVEFfQVBfQklfTUFUQ0gsCiAJTkw4MDIxMV9JRkFDRV9DT01CX05VTV9DSEFOTkVMUywKIAlOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1dJRFRIUywKKwlOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1JFR0lPTlMsCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlOVU1fTkw4MDIxMV9JRkFDRV9DT01CLApAQCAtMzg5Myw2ICszOTQ4LDkgQEAKICAqCWludGVyZmFjZS4gQW4gYWN0aXZlIG1vbml0b3IgaW50ZXJmYWNlIGJlaGF2ZXMgbGlrZSBhIG5vcm1hbCBtb25pdG9yCiAgKglpbnRlcmZhY2UsIGJ1dCBnZXRzIGFkZGVkIHRvIHRoZSBkcml2ZXIuIEl0IGVuc3VyZXMgdGhhdCBpbmNvbWluZwogICoJdW5pY2FzdCBwYWNrZXRzIGRpcmVjdGVkIGF0IHRoZSBjb25maWd1cmVkIGludGVyZmFjZSBhZGRyZXNzIGdldCBBQ0tlZC4KKyAqIEBOTDgwMjExX0ZFQVRVUkVfQVBfTU9ERV9DSEFOX1dJRFRIX0NIQU5HRTogVGhpcyBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYworICoJY2hhbm5lbCBiYW5kd2lkdGggY2hhbmdlIChlLmcuLCBIVCAyMCA8LT4gNDAgTUh6IGNoYW5uZWwpIGR1cmluZyB0aGUKKyAqCWxpZmV0aW1lIG9mIGEgQlNTLgogICovCiBlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncyB7CiAJTkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUwkJCT0gMSA8PCAwLApAQCAtMzkxMyw2ICszOTcxLDcgQEAKIAlOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUJCT0gMSA8PCAxNSwKIAlOTDgwMjExX0ZFQVRVUkVfVVNFUlNQQUNFX01QTQkJCT0gMSA8PCAxNiwKIAlOTDgwMjExX0ZFQVRVUkVfQUNUSVZFX01PTklUT1IJCQk9IDEgPDwgMTcsCisJTkw4MDIxMV9GRUFUVVJFX0FQX01PREVfQ0hBTl9XSURUSF9DSEFOR0UJPSAxIDw8IDE4LAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaCBiL2luY2x1ZGUvdWFwaS9saW51eC9vcGVudnN3aXRjaC5oCmluZGV4IDk3MDU1M2MuLjBiOTc5ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9vcGVudnN3aXRjaC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9vcGVudnN3aXRjaC5oCkBAIC0zOTUsNyArMzk1LDkgQEAKICAqIEBPVlNfRkxPV19BVFRSX0FDVElPTlM6IE5lc3RlZCAlT1ZTX0FDVElPTl9BVFRSXyogYXR0cmlidXRlcyBzcGVjaWZ5aW5nCiAgKiB0aGUgYWN0aW9ucyB0byB0YWtlIGZvciBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGtleS4gIEFsd2F5cyBwcmVzZW50IGluCiAgKiBub3RpZmljYXRpb25zLiAgUmVxdWlyZWQgZm9yICVPVlNfRkxPV19DTURfTkVXIHJlcXVlc3RzLCBvcHRpb25hbCBmb3IKLSAqICVPVlNfRkxPV19DTURfU0VUIHJlcXVlc3RzLgorICogJU9WU19GTE9XX0NNRF9TRVQgcmVxdWVzdHMuICBBbiAlT1ZTX0ZMT1dfQ01EX1NFVCB3aXRob3V0CisgKiAlT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TIHdpbGwgbm90IG1vZGlmeSB0aGUgYWN0aW9ucy4gIFRvIGNsZWFyIHRoZSBhY3Rpb25zLAorICogYW4gJU9WU19GTE9XX0FUVFJfQUNUSU9OUyB3aXRob3V0IGFueSBuZXN0ZWQgYXR0cmlidXRlcyBtdXN0IGJlIGdpdmVuLgogICogQE9WU19GTE9XX0FUVFJfU1RBVFM6ICZzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMgZ2l2aW5nIHN0YXRpc3RpY3MgZm9yIHRoaXMKICAqIGZsb3cuICBQcmVzZW50IGluIG5vdGlmaWNhdGlvbnMgaWYgdGhlIHN0YXRzIHdvdWxkIGJlIG5vbnplcm8uICBJZ25vcmVkIGluCiAgKiByZXF1ZXN0cy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL3VhcGkvbGludXgvcGVyZl9ldmVudC5oCmluZGV4IGUzZmM4ZjAuLjUzMTJmYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMTYzLDggKzE2Myw5IEBACiAJUEVSRl9TQU1QTEVfQlJBTkNIX0FCT1JUX1RYCT0gMVUgPDwgNywgLyogdHJhbnNhY3Rpb24gYWJvcnRzICovCiAJUEVSRl9TQU1QTEVfQlJBTkNIX0lOX1RYCT0gMVUgPDwgOCwgLyogaW4gdHJhbnNhY3Rpb24gKi8KIAlQRVJGX1NBTVBMRV9CUkFOQ0hfTk9fVFgJPSAxVSA8PCA5LCAvKiBub3QgaW4gdHJhbnNhY3Rpb24gKi8KKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORAkJPSAxVSA8PCAxMCwgLyogY29uZGl0aW9uYWwgYnJhbmNoZXMgKi8KIAotCVBFUkZfU0FNUExFX0JSQU5DSF9NQVgJCT0gMVUgPDwgMTAsIC8qIG5vbi1BQkkgKi8KKwlQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYCQk9IDFVIDw8IDExLCAvKiBub24tQUJJICovCiB9OwogCiAjZGVmaW5lIFBFUkZfU0FNUExFX0JSQU5DSF9QTE1fQUxMIFwKQEAgLTMwMSw4ICszMDIsOCBAQAogCQkJCWV4Y2x1ZGVfY2FsbGNoYWluX2tlcm5lbCA6IDEsIC8qIGV4Y2x1ZGUga2VybmVsIGNhbGxjaGFpbnMgKi8KIAkJCQlleGNsdWRlX2NhbGxjaGFpbl91c2VyICAgOiAxLCAvKiBleGNsdWRlIHVzZXIgY2FsbGNoYWlucyAqLwogCQkJCW1tYXAyICAgICAgICAgIDogIDEsIC8qIGluY2x1ZGUgbW1hcCB3aXRoIGlub2RlIGRhdGEgICAgICovCi0KLQkJCQlfX3Jlc2VydmVkXzEgICA6IDQwOworCQkJCWNvbW1fZXhlYyAgICAgIDogIDEsIC8qIGZsYWcgY29tbSBldmVudHMgdGhhdCBhcmUgZHVlIHRvIGFuIGV4ZWMgKi8KKwkJCQlfX3Jlc2VydmVkXzEgICA6IDM5OwogCiAJdW5pb24gewogCQlfX3UzMgkJd2FrZXVwX2V2ZW50czsJICAvKiB3YWtldXAgZXZlcnkgbiBldmVudHMgKi8KQEAgLTUwMSw3ICs1MDIsMTIgQEAKICNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUwJCSg0IDw8IDApCiAjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfR1VFU1RfVVNFUgkJKDUgPDwgMCkKIAorLyoKKyAqIFBFUkZfUkVDT1JEX01JU0NfTU1BUF9EQVRBIGFuZCBQRVJGX1JFQ09SRF9NSVNDX0NPTU1fRVhFQyBhcmUgdXNlZCBvbgorICogZGlmZmVyZW50IGV2ZW50cyBzbyBjYW4gcmV1c2UgdGhlIHNhbWUgYml0IHBvc2l0aW9uLgorICovCiAjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfTU1BUF9EQVRBCQkoMSA8PCAxMykKKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19DT01NX0VYRUMJCSgxIDw8IDEzKQogLyoKICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IG9mIFBFUkZfU0FNUExFX0lQIHBvaW50cyB0bwogICogdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuIFNlZSBhbHNvCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwYy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGMuaAppbmRleCA4NTIzNzNkLi42ZjcxYjliIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwYy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90aXBjLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgX0xJTlVYX1RJUENfSF8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgogCiAvKgogICogVElQQyBhZGRyZXNzaW5nIHByaW1pdGl2ZXMKQEAgLTg3LDYgKzg4LDcgQEAKIAogI2RlZmluZSBUSVBDX0NGR19TUlYJCTAJLyogY29uZmlndXJhdGlvbiBzZXJ2aWNlIG5hbWUgdHlwZSAqLwogI2RlZmluZSBUSVBDX1RPUF9TUlYJCTEJLyogdG9wb2xvZ3kgc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19MSU5LX1NUQVRFCQkyCS8qIGxpbmsgc3RhdGUgbmFtZSB0eXBlICovCiAjZGVmaW5lIFRJUENfUkVTRVJWRURfVFlQRVMJNjQJLyogbG93ZXN0IHVzZXItcHVibGlzaGFibGUgbmFtZSB0eXBlICovCiAKIC8qCkBAIC0yMDYsNCArMjA4LDI1IEBACiAjZGVmaW5lIFRJUENfTk9ERV9SRUNWUV9ERVBUSAkxMzEJLyogRGVmYXVsdDogbm9uZSAocmVhZCBvbmx5KSAqLwogI2RlZmluZSBUSVBDX1NPQ0tfUkVDVlFfREVQVEgJMTMyCS8qIERlZmF1bHQ6IG5vbmUgKHJlYWQgb25seSkgKi8KIAorLyoKKyAqIE1heGltdW0gc2l6ZXMgb2YgVElQQyBiZWFyZXItcmVsYXRlZCBuYW1lcyAoaW5jbHVkaW5nIHRlcm1pbmF0aW5nIE5VTEwpCisgKiBUaGUgc3RyaW5nIGZvcm1hdHRpbmcgZm9yIGVhY2ggbmFtZSBlbGVtZW50IGlzOgorICogbWVkaWE6IG1lZGlhCisgKiBpbnRlcmZhY2U6IG1lZGlhOmludGVyZmFjZSBuYW1lCisgKiBsaW5rOiBaLkMuTjppbnRlcmZhY2UtWi5DLk46aW50ZXJmYWNlCisgKgorICovCisKKyNkZWZpbmUgVElQQ19NQVhfTUVESUFfTkFNRQkxNgorI2RlZmluZSBUSVBDX01BWF9JRl9OQU1FCTE2CisjZGVmaW5lIFRJUENfTUFYX0JFQVJFUl9OQU1FCTMyCisjZGVmaW5lIFRJUENfTUFYX0xJTktfTkFNRQk2MAorCisjZGVmaW5lIFNJT0NHRVRMSU5LTkFNRQkJU0lPQ1BST1RPUFJJVkFURQorCitzdHJ1Y3QgdGlwY19zaW9jX2xuX3JlcSB7CisJX191MzIgcGVlcjsKKwlfX3UzMiBiZWFyZXJfaWQ7CisJY2hhciBsaW5rbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGNfY29uZmlnLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19jb25maWcuaAppbmRleCA2YjBiZmYwLi40MWE3NmFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19jb25maWcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19jb25maWcuaApAQCAtMzksNiArMzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAjaWZuZGVmIF9fS0VSTkVMX18KQEAgLTE1NSwxNSArMTU2LDYgQEAKICNkZWZpbmUgVElQQ19UTFZfUE9SVF9SRUYJMjYJLyogMzItYml0IHBvcnQgcmVmZXJlbmNlICovCiAKIC8qCi0gKiBNYXhpbXVtIHNpemVzIG9mIFRJUEMgYmVhcmVyLXJlbGF0ZWQgbmFtZXMgKGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwpCi0gKi8KLQotI2RlZmluZSBUSVBDX01BWF9NRURJQV9OQU1FCTE2CS8qIGZvcm1hdCA9IG1lZGlhICovCi0jZGVmaW5lIFRJUENfTUFYX0lGX05BTUUJMTYJLyogZm9ybWF0ID0gaW50ZXJmYWNlICovCi0jZGVmaW5lIFRJUENfTUFYX0JFQVJFUl9OQU1FCTMyCS8qIGZvcm1hdCA9IG1lZGlhOmludGVyZmFjZSAqLwotI2RlZmluZSBUSVBDX01BWF9MSU5LX05BTUUJNjAJLyogZm9ybWF0ID0gWi5DLk46aW50ZXJmYWNlLVouQy5OOmludGVyZmFjZSAqLwotCi0vKgogICogTGluayBwcmlvcml0eSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4LCBtZWRpYSBkZWZhdWx0KQogICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC91ZHAuaCBiL2luY2x1ZGUvdWFwaS9saW51eC91ZHAuaAppbmRleCBlMmJjZmQ3Li4xNjU3NGVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdWRwLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3VkcC5oCkBAIC0yOSw2ICsyOSw4IEBACiAvKiBVRFAgc29ja2V0IG9wdGlvbnMgKi8KICNkZWZpbmUgVURQX0NPUksJMQkvKiBOZXZlciBzZW5kIHBhcnRpYWxseSBjb21wbGV0ZSBzZWdtZW50cyAqLwogI2RlZmluZSBVRFBfRU5DQVAJMTAwCS8qIFNldCB0aGUgc29ja2V0IHRvIGFjY2VwdCBlbmNhcHN1bGF0ZWQgcGFja2V0cyAqLworI2RlZmluZSBVRFBfTk9fQ0hFQ0s2X1RYIDEwMQkvKiBEaXNhYmxlIHNlbmRpbmcgY2hlY2tzdW0gZm9yIFVEUDZYICovCisjZGVmaW5lIFVEUF9OT19DSEVDSzZfUlggMTAyCS8qIERpc2FibGUgYWNjcGV0aW5nIGNoZWNrc3VtIGZvciBVRFA2ICovCiAKIC8qIFVEUCBlbmNhcHN1bGF0aW9uIHR5cGVzICovCiAjZGVmaW5lIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFCTEgLyogZHJhZnQtaWV0Zi1pcHNlYy1uYXQtdC1pa2UtMDAvMDEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmggYi9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaW14LWlwdS12My5oCnJlbmFtZSB0byBpbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaAppbmRleCBjMmM2ZmFiLi4zZTQzZTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaW14LWlwdS12My5oCisrKyBiL2luY2x1ZGUvdmlkZW8vaW14LWlwdS12My5oCkBAIC0xMDQsNiArMTA0LDcgQEAKIAogdm9pZCBpcHVfaWRtYWNfc2V0X2RvdWJsZV9idWZmZXIoc3RydWN0IGlwdXYzX2NoYW5uZWwgKmNoYW5uZWwsCiAJCWJvb2wgZG91YmxlYnVmZmVyKTsKK2ludCBpcHVfaWRtYWNfZ2V0X2N1cnJlbnRfYnVmZmVyKHN0cnVjdCBpcHV2M19jaGFubmVsICpjaGFubmVsKTsKIHZvaWQgaXB1X2lkbWFjX3NlbGVjdF9idWZmZXIoc3RydWN0IGlwdXYzX2NoYW5uZWwgKmNoYW5uZWwsIHUzMiBidWZfbnVtKTsKIAogLyoKQEAgLTE2NSw2ICsxNjYsMjAgQEAKIGludCBpcHVfZHBfc2V0X2dsb2JhbF9hbHBoYShzdHJ1Y3QgaXB1X2RwICpkcCwgYm9vbCBlbmFibGUsIHU4IGFscGhhLAogCQlib29sIGJnX2NoYW4pOwogCisvKgorICogSVBVIENNT1MgU2Vuc29yIEludGVyZmFjZSAoY3NpKSBmdW5jdGlvbnMKKyAqLworaW50IGlwdV9jc2lfZW5hYmxlKHN0cnVjdCBpcHVfc29jICppcHUsIGludCBjc2kpOworaW50IGlwdV9jc2lfZGlzYWJsZShzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY3NpKTsKKworLyoKKyAqIElQVSBTZW5zb3IgTXVsdGlwbGUgRklGTyBDb250cm9sbGVyIChTTUZDKSBmdW5jdGlvbnMKKyAqLworaW50IGlwdV9zbWZjX2VuYWJsZShzdHJ1Y3QgaXB1X3NvYyAqaXB1KTsKK2ludCBpcHVfc21mY19kaXNhYmxlKHN0cnVjdCBpcHVfc29jICppcHUpOworaW50IGlwdV9zbWZjX21hcF9jaGFubmVsKHN0cnVjdCBpcHVfc29jICppcHUsIGludCBjaGFubmVsLCBpbnQgY3NpX2lkLCBpbnQgbWlwaV9pZCk7CitpbnQgaXB1X3NtZmNfc2V0X2J1cnN0c2l6ZShzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgY2hhbm5lbCwgaW50IGJ1cnN0c2l6ZSk7CisKICNkZWZpbmUgSVBVX0NQTUVNX1dPUkQod29yZCwgb2ZzLCBzaXplKSAoKCgod29yZCkgKiAxNjAgKyAob2ZzKSkgPDwgOCkgfCAoc2l6ZSkpCiAKICNkZWZpbmUgSVBVX0ZJRUxEX1VCTwkJSVBVX0NQTUVNX1dPUkQoMCwgNDYsIDIyKQpAQCAtMzIxLDYgKzMzNiw3IEBACiB9OwogCiBzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgeworCWludCBjc2k7CiAJaW50IGRpOwogCWludCBkYzsKIAlpbnQgZHA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vbmV0aWYuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9uZXRpZi5oCmluZGV4IGM1MDA2MWQuLjcwMDU0Y2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9uZXRpZi5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9uZXRpZi5oCkBAIC01MSw2ICs1MSw1OSBAQAogICovCiAKIC8qCisgKiBNdWx0aXBsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBxdWV1ZXM6CisgKiBJZiBzdXBwb3J0ZWQsIHRoZSBiYWNrZW5kIHdpbGwgd3JpdGUgdGhlIGtleSAibXVsdGktcXVldWUtbWF4LXF1ZXVlcyIgdG8KKyAqIHRoZSBkaXJlY3RvcnkgZm9yIHRoYXQgdmlmLCBhbmQgc2V0IGl0cyB2YWx1ZSB0byB0aGUgbWF4aW11bSBzdXBwb3J0ZWQKKyAqIG51bWJlciBvZiBxdWV1ZXMuCisgKiBGcm9udGVuZHMgdGhhdCBhcmUgYXdhcmUgb2YgdGhpcyBmZWF0dXJlIGFuZCB3aXNoIHRvIHVzZSBpdCBjYW4gd3JpdGUgdGhlCisgKiBrZXkgIm11bHRpLXF1ZXVlLW51bS1xdWV1ZXMiLCBzZXQgdG8gdGhlIG51bWJlciB0aGV5IHdpc2ggdG8gdXNlLCB3aGljaAorICogbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybywgYW5kIG5vIG1vcmUgdGhhbiB0aGUgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIGJhY2tlbmQKKyAqIGluICJtdWx0aS1xdWV1ZS1tYXgtcXVldWVzIi4KKyAqCisgKiBRdWV1ZXMgcmVwbGljYXRlIHRoZSBzaGFyZWQgcmluZ3MgYW5kIGV2ZW50IGNoYW5uZWxzLgorICogImZlYXR1cmUtc3BsaXQtZXZlbnQtY2hhbm5lbHMiIG1heSBvcHRpb25hbGx5IGJlIHVzZWQgd2hlbiB1c2luZworICogbXVsdGlwbGUgcXVldWVzLCBidXQgaXMgbm90IG1hbmRhdG9yeS4KKyAqCisgKiBFYWNoIHF1ZXVlIGNvbnNpc3RzIG9mIG9uZSBzaGFyZWQgcmluZyBwYWlyLCBpLmUuIHRoZXJlIG11c3QgYmUgdGhlIHNhbWUKKyAqIG51bWJlciBvZiB0eCBhbmQgcnggcmluZ3MuCisgKgorICogRm9yIGZyb250ZW5kcyByZXF1ZXN0aW5nIGp1c3Qgb25lIHF1ZXVlLCB0aGUgdXN1YWwgZXZlbnQtY2hhbm5lbCBhbmQKKyAqIHJpbmctcmVmIGtleXMgYXJlIHdyaXR0ZW4gYXMgYmVmb3JlLCBzaW1wbGlmeWluZyB0aGUgYmFja2VuZCBwcm9jZXNzaW5nCisgKiB0byBhdm9pZCBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGEgZnJvbnRlbmQgdGhhdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlCisgKiBtdWx0aS1xdWV1ZSBmZWF0dXJlLCBhbmQgb25lIHRoYXQgZG9lcywgYnV0IHJlcXVlc3RlZCBvbmx5IG9uZSBxdWV1ZS4KKyAqCisgKiBGcm9udGVuZHMgcmVxdWVzdGluZyB0d28gb3IgbW9yZSBxdWV1ZXMgbXVzdCBub3Qgd3JpdGUgdGhlIHRvcGxldmVsCisgKiBldmVudC1jaGFubmVsIChvciBldmVudC1jaGFubmVsLXt0eCxyeH0pIGFuZCB7dHgscnh9LXJpbmctcmVmIGtleXMsCisgKiBpbnN0ZWFkIHdyaXRpbmcgdGhvc2Uga2V5cyB1bmRlciBzdWIta2V5cyBoYXZpbmcgdGhlIG5hbWUgInF1ZXVlLU4iIHdoZXJlCisgKiBOIGlzIHRoZSBpbnRlZ2VyIElEIG9mIHRoZSBxdWV1ZSBmb3Igd2hpY2ggdGhvc2Uga2V5cyBiZWxvbmcuIFF1ZXVlcworICogYXJlIGluZGV4ZWQgZnJvbSB6ZXJvLiBGb3IgZXhhbXBsZSwgYSBmcm9udGVuZCB3aXRoIHR3byBxdWV1ZXMgYW5kIHNwbGl0CisgKiBldmVudCBjaGFubmVscyBtdXN0IHdyaXRlIHRoZSBmb2xsb3dpbmcgc2V0IG9mIHF1ZXVlLXJlbGF0ZWQga2V5czoKKyAqCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL211bHRpLXF1ZXVlLW51bS1xdWV1ZXMgPSAiMiIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmlmLzAvcXVldWUtMCA9ICIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTAvdHgtcmluZy1yZWYgPSAiPHJpbmctcmVmLXR4MD4iCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTAvcngtcmluZy1yZWYgPSAiPHJpbmctcmVmLXJ4MD4iCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTAvZXZlbnQtY2hhbm5lbC10eCA9ICI8ZXZ0Y2huLXR4MD4iCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTAvZXZlbnQtY2hhbm5lbC1yeCA9ICI8ZXZ0Y2huLXJ4MD4iCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTEgPSAiIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92aWYvMC9xdWV1ZS0xL3R4LXJpbmctcmVmID0gIjxyaW5nLXJlZi10eDE+IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92aWYvMC9xdWV1ZS0xL3J4LXJpbmctcmVmID0gIjxyaW5nLXJlZi1yeDEiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTEvZXZlbnQtY2hhbm5lbC10eCA9ICI8ZXZ0Y2huLXR4MT4iCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZpZi8wL3F1ZXVlLTEvZXZlbnQtY2hhbm5lbC1yeCA9ICI8ZXZ0Y2huLXJ4MT4iCisgKgorICogSWYgdGhlcmUgaXMgYW55IGluY29uc2lzdGVuY3kgaW4gdGhlIFhlblN0b3JlIGRhdGEsIHRoZSBiYWNrZW5kIG1heQorICogY2hvb3NlIG5vdCB0byBjb25uZWN0IGFueSBxdWV1ZXMsIGluc3RlYWQgdHJlYXRpbmcgdGhlIHJlcXVlc3QgYXMgYW4KKyAqIGVycm9yLiBUaGlzIGluY2x1ZGVzIHNjZW5hcmlvcyB3aGVyZSBtb3JlIChvciBmZXdlcikgcXVldWVzIHdlcmUKKyAqIHJlcXVlc3RlZCB0aGFuIHRoZSBmcm9udGVuZCBwcm92aWRlZCBkZXRhaWxzIGZvci4KKyAqCisgKiBNYXBwaW5nIG9mIHBhY2tldHMgdG8gcXVldWVzIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBmdW5jdGlvbiBvZiB0aGUKKyAqIHRyYW5zbWl0dGluZyBzeXN0ZW0gKGJhY2tlbmQgb3IgZnJvbnRlbmQpIGFuZCBpcyBub3QgbmVnb3RpYXRlZAorICogYmV0d2VlbiB0aGUgdHdvLiBHdWVzdHMgYXJlIGZyZWUgdG8gdHJhbnNtaXQgcGFja2V0cyBvbiBhbnkgcXVldWUKKyAqIHRoZXkgY2hvb3NlLCBwcm92aWRlZCBpdCBoYXMgYmVlbiBzZXQgdXAgY29ycmVjdGx5LiBHdWVzdHMgbXVzdCBiZQorICogcHJlcGFyZWQgdG8gcmVjZWl2ZSBwYWNrZXRzIG9uIGFueSBxdWV1ZSB0aGV5IGhhdmUgcmVxdWVzdGVkIGJlIHNldCB1cC4KKyAqLworCisvKgogICogImZlYXR1cmUtbm8tY3N1bS1vZmZsb2FkIiBzaG91bGQgYmUgdXNlZCB0byB0dXJuIElQdjQgVENQL1VEUCBjaGVja3N1bQogICogb2ZmbG9hZCBvZmYgb3Igb24uIElmIGl0IGlzIG1pc3NpbmcgdGhlbiB0aGUgZmVhdHVyZSBpcyBhc3N1bWVkIHRvIGJlIG9uLgogICogImZlYXR1cmUtaXB2Ni1jc3VtLW9mZmxvYWQiIHNob3VsZCBiZSB1c2VkIHRvIHR1cm4gSVB2NiBUQ1AvVURQIGNoZWNrc3VtCmRpZmYgLS1naXQgYS9rZXJuZWwvS2NvbmZpZy5sb2NrcyBiL2tlcm5lbC9LY29uZmlnLmxvY2tzCmluZGV4IGQyYjMyYWMuLjM1NTM2ZDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9LY29uZmlnLmxvY2tzCisrKyBiL2tlcm5lbC9LY29uZmlnLmxvY2tzCkBAIC0yMjMsMyArMjIzLDEwIEBACiBjb25maWcgTVVURVhfU1BJTl9PTl9PV05FUgogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFNNUCAmJiAhREVCVUdfTVVURVhFUworCitjb25maWcgQVJDSF9VU0VfUVVFVUVfUldMT0NLCisJYm9vbAorCitjb25maWcgUVVFVUVfUldMT0NLCisJZGVmX2Jvb2wgeSBpZiBBUkNIX1VTRV9RVUVVRV9SV0xPQ0sKKwlkZXBlbmRzIG9uIFNNUApkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCBmMzAxMDY0Li4zZWYyZTBlIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtNDI0LDYgKzQyNCwzOCBAQAogfQogCiAvKgorICoga2F1ZGl0ZF9zZW5kX211bHRpY2FzdF9za2IgLSBzZW5kIHRoZSBza2IgdG8gbXVsdGljYXN0IHVzZXJzcGFjZSBsaXN0ZW5lcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY29uc3VtZSBhbiBza2IgYXMgbWlnaHQgYmUgZXhwZWN0ZWQgc2luY2UgaXQgaGFzIHRvCisgKiBjb3B5IGl0IGFueXdheXMuCisgKi8KK3N0YXRpYyB2b2lkIGthdWRpdGRfc2VuZF9tdWx0aWNhc3Rfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYJCSpjb3B5OworCXN0cnVjdCBhdWRpdF9uZXQJKmF1bmV0ID0gbmV0X2dlbmVyaWMoJmluaXRfbmV0LCBhdWRpdF9uZXRfaWQpOworCXN0cnVjdCBzb2NrCQkqc29jayA9IGF1bmV0LT5ubHNrOworCisJaWYgKCFuZXRsaW5rX2hhc19saXN0ZW5lcnMoc29jaywgQVVESVRfTkxHUlBfUkVBRExPRykpCisJCXJldHVybjsKKworCS8qCisJICogVGhlIHNlZW1pbmdseSB3YXN0ZWZ1bCBza2JfY29weSgpIHJhdGhlciB0aGFuIGJ1bXBpbmcgdGhlIHJlZmNvdW50CisJICogdXNpbmcgc2tiX2dldCgpIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG5vbi1zdGFuZGFyZCBtb2RzIGFyZSBtYWRlIHRvCisJICogdGhlIHNrYiBieSB0aGUgb3JpZ2luYWwga2F1ZGl0IHVuaWNhc3Qgc29ja2V0IHNlbmQgcm91dGluZS4gIFRoZQorCSAqIGV4aXN0aW5nIGF1ZGl0ZCBkYWVtb24gYXNzdW1lcyB0aGlzIGJyZWFrYWdlLiAgRml4aW5nIHRoaXMgd291bGQKKwkgKiByZXF1aXJlIGNvLW9yZGluYXRpbmcgYSBjaGFuZ2UgaW4gdGhlIGVzdGFibGlzaGVkIHByb3RvY29sIGJldHdlZW4KKwkgKiB0aGUga2F1ZGl0IGtlcm5lbCBzdWJzeXN0ZW0gYW5kIHRoZSBhdWRpdGQgdXNlcnNwYWNlIGNvZGUuICBUaGVyZSBpcworCSAqIG5vIHJlYXNvbiBmb3IgbmV3IG11bHRpY2FzdCBjbGllbnRzIHRvIGNvbnRpbnVlIHdpdGggdGhpcworCSAqIG5vbi1jb21wbGlhbmNlLgorCSAqLworCWNvcHkgPSBza2JfY29weShza2IsIEdGUF9LRVJORUwpOworCWlmICghY29weSkKKwkJcmV0dXJuOworCisJbmxtc2dfbXVsdGljYXN0KHNvY2ssIGNvcHksIDAsIEFVRElUX05MR1JQX1JFQURMT0csIEdGUF9LRVJORUwpOworfQorCisvKgogICogZmx1c2hfaG9sZF9xdWV1ZSAtIGVtcHR5IHRoZSBob2xkIHF1ZXVlIGlmIGF1ZGl0ZCBhcHBlYXJzCiAgKgogICogSWYgYXVkaXRkIGp1c3Qgc3RhcnRlZCwgZHJhaW4gdGhlIHF1ZXVlIG9mIG1lc3NhZ2VzIGFscmVhZHkKQEAgLTEwNzYsMTAgKzExMDgsMjIgQEAKIAltdXRleF91bmxvY2soJmF1ZGl0X2NtZF9tdXRleCk7CiB9CiAKKy8qIFJ1biBjdXN0b20gYmluZCBmdW5jdGlvbiBvbiBuZXRsaW5rIHNvY2tldCBncm91cCBjb25uZWN0IG9yIGJpbmQgcmVxdWVzdHMuICovCitzdGF0aWMgaW50IGF1ZGl0X2JpbmQoaW50IGdyb3VwKQoreworCWlmICghY2FwYWJsZShDQVBfQVVESVRfUkVBRCkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX25ldF9pbml0IGF1ZGl0X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmV0bGlua19rZXJuZWxfY2ZnIGNmZyA9IHsKIAkJLmlucHV0CT0gYXVkaXRfcmVjZWl2ZSwKKwkJLmJpbmQJPSBhdWRpdF9iaW5kLAorCQkuZmxhZ3MJPSBOTF9DRkdfRl9OT05ST09UX1JFQ1YsCisJCS5ncm91cHMJPSBBVURJVF9OTEdSUF9NQVgsCiAJfTsKIAogCXN0cnVjdCBhdWRpdF9uZXQgKmF1bmV0ID0gbmV0X2dlbmVyaWMobmV0LCBhdWRpdF9uZXRfaWQpOwpAQCAtMTkwMSwxMCArMTk0NSwxMCBAQAogICogYXVkaXRfbG9nX2VuZCAtIGVuZCBvbmUgYXVkaXQgcmVjb3JkCiAgKiBAYWI6IHRoZSBhdWRpdF9idWZmZXIKICAqCi0gKiBUaGUgbmV0bGlua18qIGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGluc2lkZSBhbiBpcnEgY29udGV4dCwgc28KLSAqIHRoZSBhdWRpdCBidWZmZXIgaXMgcGxhY2VkIG9uIGEgcXVldWUgYW5kIGEgdGFza2xldCBpcyBzY2hlZHVsZWQgdG8KLSAqIHJlbW92ZSB0aGVtIGZyb20gdGhlIHF1ZXVlIG91dHNpZGUgdGhlIGlycSBjb250ZXh0LiAgTWF5IGJlIGNhbGxlZCBpbgotICogYW55IGNvbnRleHQuCisgKiBuZXRsaW5rX3VuaWNhc3QoKSBjYW5ub3QgYmUgY2FsbGVkIGluc2lkZSBhbiBpcnEgY29udGV4dCBiZWNhdXNlIGl0IGJsb2NrcworICogKGxhc3QgYXJnLCBmbGFncywgaXMgbm90IHNldCB0byBNU0dfRE9OVFdBSVQpLCBzbyB0aGUgYXVkaXQgYnVmZmVyIGlzIHBsYWNlZAorICogb24gYSBxdWV1ZSBhbmQgYSB0YXNrbGV0IGlzIHNjaGVkdWxlZCB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBxdWV1ZSBvdXRzaWRlCisgKiB0aGUgaXJxIGNvbnRleHQuICBNYXkgYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgogICovCiB2b2lkIGF1ZGl0X2xvZ19lbmQoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIpCiB7CkBAIC0xOTE0LDYgKzE5NTgsMTggQEAKIAkJYXVkaXRfbG9nX2xvc3QoInJhdGUgbGltaXQgZXhjZWVkZWQiKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IG5sbXNnX2hkcihhYi0+c2tiKTsKKworCQlrYXVkaXRkX3NlbmRfbXVsdGljYXN0X3NrYihhYi0+c2tiKTsKKworCQkvKgorCQkgKiBUaGUgb3JpZ2luYWwga2F1ZGl0IHVuaWNhc3Qgc29ja2V0IHNlbmRzIHVwIG1lc3NhZ2VzIHdpdGgKKwkJICogbmxtc2dfbGVuIHNldCB0byB0aGUgcGF5bG9hZCBsZW5ndGggcmF0aGVyIHRoYW4gdGhlIGVudGlyZQorCQkgKiBtZXNzYWdlIGxlbmd0aC4gIFRoaXMgYnJlYWtzIHRoZSBzdGFuZGFyZCBzZXQgYnkgbmV0bGluay4KKwkJICogVGhlIGV4aXN0aW5nIGF1ZGl0ZCBkYWVtb24gYXNzdW1lcyB0aGlzIGJyZWFrYWdlLiAgRml4aW5nCisJCSAqIHRoaXMgd291bGQgcmVxdWlyZSBjby1vcmRpbmF0aW5nIGEgY2hhbmdlIGluIHRoZSBlc3RhYmxpc2hlZAorCQkgKiBwcm90b2NvbCBiZXR3ZWVuIHRoZSBrYXVkaXQga2VybmVsIHN1YnN5c3RlbSBhbmQgdGhlIGF1ZGl0ZAorCQkgKiB1c2Vyc3BhY2UgY29kZS4KKwkJICovCiAJCW5saC0+bmxtc2dfbGVuID0gYWItPnNrYi0+bGVuIC0gTkxNU0dfSERSTEVOOwogCiAJCWlmIChhdWRpdF9waWQpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCBhY2Y3OTFjLi5hMzQzYmRlIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAogI2luY2x1ZGUgInNtcGJvb3QuaCIKIApAQCAtNTIwLDcgKzUyMSw5IEBACiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJaWYgKGNwdSA9PSBmaXJzdF9jcHUpCiAJCQljb250aW51ZTsKKwkJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJDUFVfT0ZGIiksIGNwdSwgdHJ1ZSk7CiAJCWVycm9yID0gX2NwdV9kb3duKGNwdSwgMSk7CisJCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiQ1BVX09GRiIpLCBjcHUsIGZhbHNlKTsKIAkJaWYgKCFlcnJvcikKIAkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGZyb3plbl9jcHVzKTsKIAkJZWxzZSB7CkBAIC01NjMsNyArNTY2LDkgQEAKIAlhcmNoX2VuYWJsZV9ub25ib290X2NwdXNfYmVnaW4oKTsKIAogCWZvcl9lYWNoX2NwdShjcHUsIGZyb3plbl9jcHVzKSB7CisJCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygiQ1BVX09OIiksIGNwdSwgdHJ1ZSk7CiAJCWVycm9yID0gX2NwdV91cChjcHUsIDEpOworCQl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoIkNQVV9PTiIpLCBjcHUsIGZhbHNlKTsKIAkJaWYgKCFlcnJvcikgewogCQkJcHJfaW5mbygiQ1BVJWQgaXMgdXBcbiIsIGNwdSk7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggMjRkMzVjYy4uNWZhNThlNCAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTI5NzQsNiArMjk3NCwyMiBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAordm9pZCBwZXJmX2V2ZW50X2V4ZWModm9pZCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CisJaW50IGN0eG47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yX2VhY2hfdGFza19jb250ZXh0X25yKGN0eG4pIHsKKwkJY3R4ID0gY3VycmVudC0+cGVyZl9ldmVudF9jdHhwW2N0eG5dOworCQlpZiAoIWN0eCkKKwkJCWNvbnRpbnVlOworCisJCXBlcmZfZXZlbnRfZW5hYmxlX29uX2V4ZWMoY3R4KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKIC8qCiAgKiBDcm9zcyBDUFUgY2FsbCB0byByZWFkIHRoZSBoYXJkd2FyZSBldmVudAogICovCkBAIC01MDc1LDIxICs1MDkxLDkgQEAKIAkJICAgICAgIE5VTEwpOwogfQogCi12b2lkIHBlcmZfZXZlbnRfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit2b2lkIHBlcmZfZXZlbnRfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGJvb2wgZXhlYykKIHsKIAlzdHJ1Y3QgcGVyZl9jb21tX2V2ZW50IGNvbW1fZXZlbnQ7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4OwotCWludCBjdHhuOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWZvcl9lYWNoX3Rhc2tfY29udGV4dF9ucihjdHhuKSB7Ci0JCWN0eCA9IHRhc2stPnBlcmZfZXZlbnRfY3R4cFtjdHhuXTsKLQkJaWYgKCFjdHgpCi0JCQljb250aW51ZTsKLQotCQlwZXJmX2V2ZW50X2VuYWJsZV9vbl9leGVjKGN0eCk7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKCFhdG9taWNfcmVhZCgmbnJfY29tbV9ldmVudHMpKQogCQlyZXR1cm47CkBAIC01MTAxLDcgKzUxMDUsNyBAQAogCQkuZXZlbnRfaWQgID0gewogCQkJLmhlYWRlciA9IHsKIAkJCQkudHlwZSA9IFBFUkZfUkVDT1JEX0NPTU0sCi0JCQkJLm1pc2MgPSAwLAorCQkJCS5taXNjID0gZXhlYyA/IFBFUkZfUkVDT1JEX01JU0NfQ09NTV9FWEVDIDogMCwKIAkJCQkvKiAuc2l6ZSAqLwogCQkJfSwKIAkJCS8qIC5waWQgKi8KQEAgLTcxMjIsNiArNzEyNiwxMyBAQAogCQl9CiAJfQogCisJaWYgKGlzX3NhbXBsaW5nX2V2ZW50KGV2ZW50KSkgeworCQlpZiAoZXZlbnQtPnBtdS0+Y2FwYWJpbGl0aWVzICYgUEVSRl9QTVVfQ0FQX05PX0lOVEVSUlVQVCkgeworCQkJZXJyID0gLUVOT1RTVVBQOworCQkJZ290byBlcnJfYWxsb2M7CisJCX0KKwl9CisKIAlhY2NvdW50X2V2ZW50KGV2ZW50KTsKIAogCS8qCkBAIC03NDMzLDcgKzc0NDQsNyBAQAogCiBzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2V4aXRfdGFza19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCBjdHhuKQogewotCXN0cnVjdCBwZXJmX2V2ZW50ICpjaGlsZF9ldmVudDsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqY2hpbGRfZXZlbnQsICpuZXh0OwogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmNoaWxkX2N0eDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC03NDg3LDcgKzc0OTgsNyBAQAogCSAqLwogCW11dGV4X2xvY2soJmNoaWxkX2N0eC0+bXV0ZXgpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hpbGRfZXZlbnQsICZjaGlsZF9jdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGlsZF9ldmVudCwgbmV4dCwgJmNoaWxkX2N0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpCiAJCV9fcGVyZl9ldmVudF9leGl0X3Rhc2soY2hpbGRfZXZlbnQsIGNoaWxkX2N0eCwgY2hpbGQpOwogCiAJbXV0ZXhfdW5sb2NrKCZjaGlsZF9jdHgtPm11dGV4KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvdXByb2Jlcy5jIGIva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKaW5kZXggYWRjZDc2YS4uYzQ0NWUzOSAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKKysrIGIva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICIuLi8uLi9tbS9pbnRlcm5hbC5oIgkvKiBtdW5sb2NrX3ZtYV9wYWdlICovCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1LXJ3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvdGFza193b3JrLmg+CisjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3Vwcm9iZXMuaD4KIApAQCAtMTI3LDcgKzEyOCw3IEBACiAgKi8KIHN0YXRpYyBib29sIHZhbGlkX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCBpc19yZWdpc3RlcikKIHsKLQl2bV9mbGFnc190IGZsYWdzID0gVk1fSFVHRVRMQiB8IFZNX01BWUVYRUMgfCBWTV9TSEFSRUQ7CisJdm1fZmxhZ3NfdCBmbGFncyA9IFZNX0hVR0VUTEIgfCBWTV9NQVlFWEVDIHwgVk1fTUFZU0hBUkU7CiAKIAlpZiAoaXNfcmVnaXN0ZXIpCiAJCWZsYWdzIHw9IFZNX1dSSVRFOwpAQCAtMjc5LDE4ICsyODAsMTMgQEAKICAqIHN1cHBvcnRlZCBieSB0aGF0IGFyY2hpdGVjdHVyZSB0aGVuIHdlIG5lZWQgdG8gbW9kaWZ5IGlzX3RyYXBfYXRfYWRkciBhbmQKICAqIHVwcm9iZV93cml0ZV9vcGNvZGUgYWNjb3JkaW5nbHkuIFRoaXMgd291bGQgbmV2ZXIgYmUgYSBwcm9ibGVtIGZvciBhcmNocwogICogdGhhdCBoYXZlIGZpeGVkIGxlbmd0aCBpbnN0cnVjdGlvbnMuCi0gKi8KLQotLyoKKyAqCiAgKiB1cHJvYmVfd3JpdGVfb3Bjb2RlIC0gd3JpdGUgdGhlIG9wY29kZSBhdCBhIGdpdmVuIHZpcnR1YWwgYWRkcmVzcy4KICAqIEBtbTogdGhlIHByb2JlZCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuCiAgKiBAdmFkZHI6IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gc3RvcmUgdGhlIG9wY29kZS4KICAqIEBvcGNvZGU6IG9wY29kZSB0byBiZSB3cml0dGVuIGF0IEB2YWRkci4KICAqCi0gKiBDYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gaGVsZCAoZm9yIHJlYWQgYW5kIHdpdGggYSByZWZlcmVuY2UgdG8KLSAqIG1tKS4KLSAqCi0gKiBGb3IgbW0gQG1tLCB3cml0ZSB0aGUgb3Bjb2RlIGF0IEB2YWRkci4KKyAqIENhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBoZWxkIGZvciB3cml0ZS4KICAqIFJldHVybiAwIChzdWNjZXNzKSBvciBhIG5lZ2F0aXZlIGVycm5vLgogICovCiBpbnQgdXByb2JlX3dyaXRlX29wY29kZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyB2YWRkciwKQEAgLTMxMCwyMSArMzA2LDI1IEBACiAJaWYgKHJldCA8PSAwKQogCQlnb3RvIHB1dF9vbGQ7CiAKKwlyZXQgPSBhbm9uX3ZtYV9wcmVwYXJlKHZtYSk7CisJaWYgKHJldCkKKwkJZ290byBwdXRfb2xkOworCiAJcmV0ID0gLUVOT01FTTsKIAluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLCB2bWEsIHZhZGRyKTsKIAlpZiAoIW5ld19wYWdlKQogCQlnb3RvIHB1dF9vbGQ7CiAKLQlfX1NldFBhZ2VVcHRvZGF0ZShuZXdfcGFnZSk7CisJaWYgKG1lbV9jZ3JvdXBfY2hhcmdlX2Fub24obmV3X3BhZ2UsIG1tLCBHRlBfS0VSTkVMKSkKKwkJZ290byBwdXRfbmV3OwogCisJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOwogCWNvcHlfaGlnaHBhZ2UobmV3X3BhZ2UsIG9sZF9wYWdlKTsKIAljb3B5X3RvX3BhZ2UobmV3X3BhZ2UsIHZhZGRyLCAmb3Bjb2RlLCBVUFJPQkVfU1dCUF9JTlNOX1NJWkUpOwogCi0JcmV0ID0gYW5vbl92bWFfcHJlcGFyZSh2bWEpOwotCWlmIChyZXQpCi0JCWdvdG8gcHV0X25ldzsKLQogCXJldCA9IF9fcmVwbGFjZV9wYWdlKHZtYSwgdmFkZHIsIG9sZF9wYWdlLCBuZXdfcGFnZSk7CisJaWYgKHJldCkKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKG5ld19wYWdlKTsKIAogcHV0X25ldzoKIAlwYWdlX2NhY2hlX3JlbGVhc2UobmV3X3BhZ2UpOwpAQCAtNTM3LDE0ICs1MzcsMTUgQEAKIAkJCXZvaWQgKmluc24sIGludCBuYnl0ZXMsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlpZiAoIW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSkKLQkJcmV0dXJuIC1FSU87CiAJLyoKLQkgKiBFbnN1cmUgdGhhdCB0aGUgcGFnZSB0aGF0IGhhcyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gaXMKLQkgKiBwb3B1bGF0ZWQgYW5kIGluIHBhZ2UtY2FjaGUuCisJICogRW5zdXJlIHRoYXQgdGhlIHBhZ2UgdGhhdCBoYXMgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIGlzIHBvcHVsYXRlZAorCSAqIGFuZCBpbiBwYWdlLWNhY2hlLiBJZiAtPnJlYWRwYWdlID09IE5VTEwgaXQgbXVzdCBiZSBzaG1lbV9tYXBwaW5nKCksCisJICogc2VlIHVwcm9iZV9yZWdpc3RlcigpLgogCSAqLwotCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVCwgZmlscCk7CisJaWYgKG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSkKKwkJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZULCBmaWxwKTsKKwllbHNlCisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKQEAgLTg4MCw2ICs4ODEsOSBAQAogCWlmICghdWMtPmhhbmRsZXIgJiYgIXVjLT5yZXRfaGFuZGxlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBjb3B5X2luc24oKSB1c2VzIHJlYWRfbWFwcGluZ19wYWdlKCkgb3Igc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UoKSAqLworCWlmICghaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlICYmICFzaG1lbV9tYXBwaW5nKGlub2RlLT5pX21hcHBpbmcpKQorCQlyZXR1cm4gLUVJTzsKIAkvKiBSYWN5LCBqdXN0IHRvIGNhdGNoIHRoZSBvYnZpb3VzIG1pc3Rha2VzICovCiAJaWYgKG9mZnNldCA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzYxLDYgKzEzNjUsMTYgQEAKIAlyZXR1cm4gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAtIFVQUk9CRV9TV0JQX0lOU05fU0laRTsKIH0KIAordW5zaWduZWQgbG9uZyB1cHJvYmVfZ2V0X3RyYXBfYWRkcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXByb2JlX3Rhc2sgKnV0YXNrID0gY3VycmVudC0+dXRhc2s7CisKKwlpZiAodW5saWtlbHkodXRhc2sgJiYgdXRhc2stPmFjdGl2ZV91cHJvYmUpKQorCQlyZXR1cm4gdXRhc2stPnZhZGRyOworCisJcmV0dXJuIGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7Cit9CisKIC8qCiAgKiBDYWxsZWQgd2l0aCBubyBsb2NrcyBoZWxkLgogICogQ2FsbGVkIGluIGNvbnRleHQgb2YgYSBleGl0aW5nIG9yIGEgZXhlYy1pbmcgdGhyZWFkLgpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggY2VlYWRmYy4uMzIxNDI4OSAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC04NiwyMSArODYsOCBAQAogCXJldHVybiAmKGtyZXRwcm9iZV90YWJsZV9sb2Nrc1toYXNoXS5sb2NrKTsKIH0KIAotLyoKLSAqIE5vcm1hbGx5LCBmdW5jdGlvbnMgdGhhdCB3ZSdkIHdhbnQgdG8gcHJvaGliaXQga3Byb2JlcyBpbiwgYXJlIG1hcmtlZAotICogX19rcHJvYmVzLiBCdXQsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBzdWNoIGZ1bmN0aW9ucyBhbHJlYWR5IGJlbG9uZyB0bwotICogYSBkaWZmZXJlbnQgc2VjdGlvbiAoX19zY2hlZCBmb3IgcHJlZW1wdF9zY2hlZHVsZSkKLSAqCi0gKiBGb3Igc3VjaCBjYXNlcywgd2Ugbm93IGhhdmUgYSBibGFja2xpc3QKLSAqLwotc3RhdGljIHN0cnVjdCBrcHJvYmVfYmxhY2twb2ludCBrcHJvYmVfYmxhY2tsaXN0W10gPSB7Ci0JeyJwcmVlbXB0X3NjaGVkdWxlIix9LAotCXsibmF0aXZlX2dldF9kZWJ1Z3JlZyIsfSwKLQl7ImlycV9lbnRyaWVzX3N0YXJ0Iix9LAotCXsiY29tbW9uX2ludGVycnVwdCIsfSwKLQl7Im1jb3VudCIsfSwJLyogbWNvdW50IGNhbiBiZSBjYWxsZWQgZnJvbSBldmVyeXdoZXJlICovCi0Je05VTEx9ICAgIC8qIFRlcm1pbmF0b3IgKi8KLX07CisvKiBCbGFja2xpc3QgLS0gbGlzdCBvZiBzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9lbnRyeSAqLworc3RhdGljIExJU1RfSEVBRChrcHJvYmVfYmxhY2tsaXN0KTsKIAogI2lmZGVmIF9fQVJDSF9XQU5UX0tQUk9CRVNfSU5TTl9TTE9UCiAvKgpAQCAtMTUxLDEzICsxMzgsMTMgQEAKIAkuaW5zbl9zaXplID0gTUFYX0lOU05fU0laRSwKIAkubnJfZ2FyYmFnZSA9IDAsCiB9Owotc3RhdGljIGludCBfX2twcm9iZXMgY29sbGVjdF9nYXJiYWdlX3Nsb3RzKHN0cnVjdCBrcHJvYmVfaW5zbl9jYWNoZSAqYyk7CitzdGF0aWMgaW50IGNvbGxlY3RfZ2FyYmFnZV9zbG90cyhzdHJ1Y3Qga3Byb2JlX2luc25fY2FjaGUgKmMpOwogCiAvKioKICAqIF9fZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KICAqIFdlIGFsbG9jYXRlIGFuIGV4ZWN1dGFibGUgcGFnZSBpZiB0aGVyZSdzIG5vIHJvb20gb24gZXhpc3Rpbmcgb25lcy4KICAqLwota3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqX19nZXRfaW5zbl9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9jYWNoZSAqYykKK2twcm9iZV9vcGNvZGVfdCAqX19nZXRfaW5zbl9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9jYWNoZSAqYykKIHsKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCWtwcm9iZV9vcGNvZGVfdCAqc2xvdCA9IE5VTEw7CkBAIC0yMTQsNyArMjAxLDcgQEAKIH0KIAogLyogUmV0dXJuIDEgaWYgYWxsIGdhcmJhZ2VzIGFyZSBjb2xsZWN0ZWQsIG90aGVyd2lzZSAwLiAqLwotc3RhdGljIGludCBfX2twcm9iZXMgY29sbGVjdF9vbmVfc2xvdChzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwLCBpbnQgaWR4KQorc3RhdGljIGludCBjb2xsZWN0X29uZV9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXAsIGludCBpZHgpCiB7CiAJa2lwLT5zbG90X3VzZWRbaWR4XSA9IFNMT1RfQ0xFQU47CiAJa2lwLT5udXNlZC0tOwpAQCAtMjM1LDcgKzIyMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIGNvbGxlY3RfZ2FyYmFnZV9zbG90cyhzdHJ1Y3Qga3Byb2JlX2luc25fY2FjaGUgKmMpCitzdGF0aWMgaW50IGNvbGxlY3RfZ2FyYmFnZV9zbG90cyhzdHJ1Y3Qga3Byb2JlX2luc25fY2FjaGUgKmMpCiB7CiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcCwgKm5leHQ7CiAKQEAgLTI1Nyw4ICsyNDQsOCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fa3Byb2JlcyBfX2ZyZWVfaW5zbl9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9jYWNoZSAqYywKLQkJCQlrcHJvYmVfb3Bjb2RlX3QgKnNsb3QsIGludCBkaXJ0eSkKK3ZvaWQgX19mcmVlX2luc25fc2xvdChzdHJ1Y3Qga3Byb2JlX2luc25fY2FjaGUgKmMsCisJCSAgICAgIGtwcm9iZV9vcGNvZGVfdCAqc2xvdCwgaW50IGRpcnR5KQogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAKQEAgLTMxNCw3ICszMDEsNyBAQAogICogCQkJCU9SCiAgKiAJLSB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQgLSBmcm9tIGFyY2gveHh4L2tlcm5lbC9rcHJvYmVzLmMKICAqLwotc3RydWN0IGtwcm9iZSBfX2twcm9iZXMgKmdldF9rcHJvYmUodm9pZCAqYWRkcikKK3N0cnVjdCBrcHJvYmUgKmdldF9rcHJvYmUodm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qga3Byb2JlICpwOwpAQCAtMzI3LDggKzMxNCw5IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KK05PS1BST0JFX1NZTUJPTChnZXRfa3Byb2JlKTsKIAotc3RhdGljIGludCBfX2twcm9iZXMgYWdncl9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGFnZ3JfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiAvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUga3Byb2JlIGlzIGFuIGFnZ3JlZ2F0b3IgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9hZ2dycHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKQEAgLTM2MCw3ICszNDgsNyBAQAogICogQ2FsbCBhbGwgcHJlX2hhbmRsZXIgb24gdGhlIGxpc3QsIGJ1dCBpZ25vcmVzIGl0cyByZXR1cm4gdmFsdWUuCiAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gYXJjaC1kZXAgb3B0aW1pemVkIGNhbGxlci4KICAqLwotdm9pZCBfX2twcm9iZXMgb3B0X3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBvcHRfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqa3A7CiAKQEAgLTM3Miw5ICszNjAsMTAgQEAKIAkJcmVzZXRfa3Byb2JlX2luc3RhbmNlKCk7CiAJfQogfQorTk9LUFJPQkVfU1lNQk9MKG9wdF9wcmVfaGFuZGxlcik7CiAKIC8qIEZyZWUgb3B0aW1pemVkIGluc3RydWN0aW9ucyBhbmQgb3B0aW1pemVkX2twcm9iZSAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGZyZWVfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIGZyZWVfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3A7CiAKQEAgLTQxMiw3ICs0MDEsNyBAQAogfQogCiAvKiBSZXR1cm4gdHJ1ZSghMCkgaWYgdGhlIHByb2JlIGlzIHF1ZXVlZCBvbiAodW4pb3B0aW1pemluZyBsaXN0cyAqLwotc3RhdGljIGludCBfX2twcm9iZXMga3Byb2JlX3F1ZXVlZChzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIGludCBrcHJvYmVfcXVldWVkKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wOwogCkBAIC00MjgsNyArNDE3LDcgQEAKICAqIFJldHVybiBhbiBvcHRpbWl6ZWQga3Byb2JlIHdob3NlIG9wdGltaXppbmcgY29kZSByZXBsYWNlcwogICogaW5zdHJ1Y3Rpb25zIGluY2x1ZGluZyBhZGRyIChleGNsdWRlIGJyZWFrcG9pbnQpLgogICovCi1zdGF0aWMgc3RydWN0IGtwcm9iZSAqX19rcHJvYmVzIGdldF9vcHRpbWl6ZWRfa3Byb2JlKHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlICpnZXRfb3B0aW1pemVkX2twcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaW50IGk7CiAJc3RydWN0IGtwcm9iZSAqcCA9IE5VTEw7CkBAIC00NjAsNyArNDQ5LDcgQEAKICAqIE9wdGltaXplIChyZXBsYWNlIGEgYnJlYWtwb2ludCB3aXRoIGEganVtcCkga3Byb2JlcyBsaXN0ZWQgb24KICAqIG9wdGltaXppbmdfbGlzdC4KICAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGRvX29wdGltaXplX2twcm9iZXModm9pZCkKK3N0YXRpYyB2b2lkIGRvX29wdGltaXplX2twcm9iZXModm9pZCkKIHsKIAkvKiBPcHRpbWl6YXRpb24gbmV2ZXIgYmUgZG9uZSB3aGVuIGRpc2FybWVkICovCiAJaWYgKGtwcm9iZXNfYWxsX2Rpc2FybWVkIHx8ICFrcHJvYmVzX2FsbG93X29wdGltaXphdGlvbiB8fApAQCAtNDg4LDcgKzQ3Nyw3IEBACiAgKiBVbm9wdGltaXplIChyZXBsYWNlIGEganVtcCB3aXRoIGEgYnJlYWtwb2ludCBhbmQgcmVtb3ZlIHRoZSBicmVha3BvaW50CiAgKiBpZiBuZWVkKSBrcHJvYmVzIGxpc3RlZCBvbiB1bm9wdGltaXppbmdfbGlzdC4KICAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGRvX3Vub3B0aW1pemVfa3Byb2Jlcyh2b2lkKQorc3RhdGljIHZvaWQgZG9fdW5vcHRpbWl6ZV9rcHJvYmVzKHZvaWQpCiB7CiAJc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wLCAqdG1wOwogCkBAIC01MjAsNyArNTA5LDcgQEAKIH0KIAogLyogUmVjbGFpbSBhbGwga3Byb2JlcyBvbiB0aGUgZnJlZV9saXN0ICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgZG9fZnJlZV9jbGVhbmVkX2twcm9iZXModm9pZCkKK3N0YXRpYyB2b2lkIGRvX2ZyZWVfY2xlYW5lZF9rcHJvYmVzKHZvaWQpCiB7CiAJc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wLCAqdG1wOwogCkBAIC01MzIsMTMgKzUyMSwxMyBAQAogfQogCiAvKiBTdGFydCBvcHRpbWl6ZXIgYWZ0ZXIgT1BUSU1JWkVfREVMQVkgcGFzc2VkICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQga2lja19rcHJvYmVfb3B0aW1pemVyKHZvaWQpCitzdGF0aWMgdm9pZCBraWNrX2twcm9iZV9vcHRpbWl6ZXIodm9pZCkKIHsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm9wdGltaXppbmdfd29yaywgT1BUSU1JWkVfREVMQVkpOwogfQogCiAvKiBLcHJvYmUganVtcCBvcHRpbWl6ZXIgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZCBrcHJvYmVfb3B0aW1pemVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGtwcm9iZV9vcHRpbWl6ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CiAJLyogTG9jayBtb2R1bGVzIHdoaWxlIG9wdGltaXppbmcga3Byb2JlcyAqLwpAQCAtNTc0LDcgKzU2Myw3IEBACiB9CiAKIC8qIFdhaXQgZm9yIGNvbXBsZXRpbmcgb3B0aW1pemF0aW9uIGFuZCB1bm9wdGltaXphdGlvbiAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIHdhaXRfZm9yX2twcm9iZV9vcHRpbWl6ZXIodm9pZCkKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2twcm9iZV9vcHRpbWl6ZXIodm9pZCkKIHsKIAltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCkBAIC01OTMsNyArNTgyLDcgQEAKIH0KIAogLyogT3B0aW1pemUga3Byb2JlIGlmIHAgaXMgcmVhZHkgdG8gYmUgb3B0aW1pemVkICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgb3B0aW1pemVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgdm9pZCBvcHRpbWl6ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3A7CiAKQEAgLTYyNyw3ICs2MTYsNyBAQAogfQogCiAvKiBTaG9ydCBjdXQgdG8gZGlyZWN0IHVub3B0aW1pemluZyAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGZvcmNlX3Vub3B0aW1pemVfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCkKK3N0YXRpYyB2b2lkIGZvcmNlX3Vub3B0aW1pemVfa3Byb2JlKHN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcCkKIHsKIAlnZXRfb25saW5lX2NwdXMoKTsKIAlhcmNoX3Vub3B0aW1pemVfa3Byb2JlKG9wKTsKQEAgLTYzNyw3ICs2MjYsNyBAQAogfQogCiAvKiBVbm9wdGltaXplIGEga3Byb2JlIGlmIHAgaXMgb3B0aW1pemVkICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgdW5vcHRpbWl6ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCwgYm9vbCBmb3JjZSkKK3N0YXRpYyB2b2lkIHVub3B0aW1pemVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsIGJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wOwogCkBAIC02OTcsNyArNjg2LDcgQEAKIH0KIAogLyogUmVtb3ZlIG9wdGltaXplZCBpbnN0cnVjdGlvbnMgKi8KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBraWxsX29wdGltaXplZF9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIGtpbGxfb3B0aW1pemVkX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcDsKIApAQCAtNzIzLDcgKzcxMiw3IEBACiB9CiAKIC8qIFRyeSB0byBwcmVwYXJlIG9wdGltaXplZCBpbnN0cnVjdGlvbnMgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZCBwcmVwYXJlX29wdGltaXplZF9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIHByZXBhcmVfb3B0aW1pemVkX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXN0cnVjdCBvcHRpbWl6ZWRfa3Byb2JlICpvcDsKIApAQCAtNzMyLDcgKzcyMSw3IEBACiB9CiAKIC8qIEFsbG9jYXRlIG5ldyBvcHRpbWl6ZWRfa3Byb2JlIGFuZCB0cnkgdG8gcHJlcGFyZSBvcHRpbWl6ZWQgaW5zdHJ1Y3Rpb25zICovCi1zdGF0aWMgX19rcHJvYmVzIHN0cnVjdCBrcHJvYmUgKmFsbG9jX2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgc3RydWN0IGtwcm9iZSAqYWxsb2NfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlzdHJ1Y3Qgb3B0aW1pemVkX2twcm9iZSAqb3A7CiAKQEAgLTc0NywxMyArNzM2LDEzIEBACiAJcmV0dXJuICZvcC0+a3A7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBpbml0X2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKmFwLCBzdHJ1Y3Qga3Byb2JlICpwKTsKK3N0YXRpYyB2b2lkIGluaXRfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqYXAsIHN0cnVjdCBrcHJvYmUgKnApOwogCiAvKgogICogUHJlcGFyZSBhbiBvcHRpbWl6ZWRfa3Byb2JlIGFuZCBvcHRpbWl6ZSBpdAogICogTk9URTogcCBtdXN0IGJlIGEgbm9ybWFsIHJlZ2lzdGVyZWQga3Byb2JlCiAgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZCB0cnlfdG9fb3B0aW1pemVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgdm9pZCB0cnlfdG9fb3B0aW1pemVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJc3RydWN0IGtwcm9iZSAqYXA7CiAJc3RydWN0IG9wdGltaXplZF9rcHJvYmUgKm9wOwpAQCAtNzg3LDcgKzc3Niw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgb3B0aW1pemVfYWxsX2twcm9iZXModm9pZCkKK3N0YXRpYyB2b2lkIG9wdGltaXplX2FsbF9rcHJvYmVzKHZvaWQpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGtwcm9iZSAqcDsKQEAgLTgxMCw3ICs3OTksNyBAQAogCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgX19rcHJvYmVzIHVub3B0aW1pemVfYWxsX2twcm9iZXModm9pZCkKK3N0YXRpYyB2b2lkIHVub3B0aW1pemVfYWxsX2twcm9iZXModm9pZCkKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qga3Byb2JlICpwOwpAQCAtODYxLDcgKzg1MCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiAvKiBQdXQgYSBicmVha3BvaW50IGZvciBhIHByb2JlLiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRleHRfbXV0ZXggbG9ja2VkICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgX19hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgdm9pZCBfX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlzdHJ1Y3Qga3Byb2JlICpfcDsKIApAQCAtODc2LDcgKzg2NSw3IEBACiB9CiAKIC8qIFJlbW92ZSB0aGUgYnJlYWtwb2ludCBvZiBhIHByb2JlLiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRleHRfbXV0ZXggbG9ja2VkICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgX19kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsIGJvb2wgcmVvcHQpCitzdGF0aWMgdm9pZCBfX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCwgYm9vbCByZW9wdCkKIHsKIAlzdHJ1Y3Qga3Byb2JlICpfcDsKIApAQCAtOTExLDEzICs5MDAsMTMgQEAKIAlCVUdfT04oa3Byb2JlX3VudXNlZChhcCkpOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgZnJlZV9hZ2dyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIHZvaWQgZnJlZV9hZ2dyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCWFyY2hfcmVtb3ZlX2twcm9iZShwKTsKIAlrZnJlZShwKTsKIH0KIAotc3RhdGljIF9fa3Byb2JlcyBzdHJ1Y3Qga3Byb2JlICphbGxvY19hZ2dyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIHN0cnVjdCBrcHJvYmUgKmFsbG9jX2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmUpLCBHRlBfS0VSTkVMKTsKIH0KQEAgLTkzMSw3ICs5MjAsNyBAQAogc3RhdGljIGludCBrcHJvYmVfZnRyYWNlX2VuYWJsZWQ7CiAKIC8qIE11c3QgZW5zdXJlIHAtPmFkZHIgaXMgcmVhbGx5IG9uIGZ0cmFjZSAqLwotc3RhdGljIGludCBfX2twcm9iZXMgcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAoIWtwcm9iZV9mdHJhY2UocCkpCiAJCXJldHVybiBhcmNoX3ByZXBhcmVfa3Byb2JlKHApOwpAQCAtOTQwLDcgKzkyOSw3IEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGxvY2sga3Byb2JlX211dGV4ICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgYXJtX2twcm9iZV9mdHJhY2Uoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIGFybV9rcHJvYmVfZnRyYWNlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldDsKIApAQCAtOTU1LDcgKzk0NCw3IEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGxvY2sga3Byb2JlX211dGV4ICovCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgZGlzYXJtX2twcm9iZV9mdHJhY2Uoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIGRpc2FybV9rcHJvYmVfZnRyYWNlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldDsKIApAQCAtOTc1LDcgKzk2NCw3IEBACiAjZW5kaWYKIAogLyogQXJtIGEga3Byb2JlIHdpdGggdGV4dF9tdXRleCAqLwotc3RhdGljIHZvaWQgX19rcHJvYmVzIGFybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqa3ApCitzdGF0aWMgdm9pZCBhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKmtwKQogewogCWlmICh1bmxpa2VseShrcHJvYmVfZnRyYWNlKGtwKSkpIHsKIAkJYXJtX2twcm9iZV9mdHJhY2Uoa3ApOwpAQCAtOTkyLDcgKzk4MSw3IEBACiB9CiAKIC8qIERpc2FybSBhIGtwcm9iZSB3aXRoIHRleHRfbXV0ZXggKi8KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBkaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKmtwLCBib29sIHJlb3B0KQorc3RhdGljIHZvaWQgZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICprcCwgYm9vbCByZW9wdCkKIHsKIAlpZiAodW5saWtlbHkoa3Byb2JlX2Z0cmFjZShrcCkpKSB7CiAJCWRpc2FybV9rcHJvYmVfZnRyYWNlKGtwKTsKQEAgLTEwMDgsNyArOTk3LDcgQEAKICAqIEFnZ3JlZ2F0ZSBoYW5kbGVycyBmb3IgbXVsdGlwbGUga3Byb2JlcyBzdXBwb3J0IC0gdGhlc2UgaGFuZGxlcnMKICAqIHRha2UgY2FyZSBvZiBpbnZva2luZyB0aGUgaW5kaXZpZHVhbCBrcHJvYmUgaGFuZGxlcnMgb24gcC0+bGlzdAogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBhZ2dyX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmtwOwogCkBAIC0xMDIyLDkgKzEwMTEsMTAgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CitOT0tQUk9CRV9TWU1CT0woYWdncl9wcmVfaGFuZGxlcik7CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBhZ2dyX3Bvc3RfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGFnZ3JfcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICprcDsKIApAQCAtMTAzNiw5ICsxMDI2LDEwIEBACiAJCX0KIAl9CiB9CitOT0tQUk9CRV9TWU1CT0woYWdncl9wb3N0X2hhbmRsZXIpOwogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCWludCB0cmFwbnIpCitzdGF0aWMgaW50IGFnZ3JfZmF1bHRfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgIGludCB0cmFwbnIpCiB7CiAJc3RydWN0IGtwcm9iZSAqY3VyID0gX190aGlzX2NwdV9yZWFkKGtwcm9iZV9pbnN0YW5jZSk7CiAKQEAgLTEwNTIsOCArMTA0Myw5IEBACiAJfQogCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKGFnZ3JfZmF1bHRfaGFuZGxlcik7CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIGFnZ3JfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgYWdncl9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmN1ciA9IF9fdGhpc19jcHVfcmVhZChrcHJvYmVfaW5zdGFuY2UpOwogCWludCByZXQgPSAwOwpAQCAtMTA2NSw5ICsxMDU3LDEwIEBACiAJcmVzZXRfa3Byb2JlX2luc3RhbmNlKCk7CiAJcmV0dXJuIHJldDsKIH0KK05PS1BST0JFX1NZTUJPTChhZ2dyX2JyZWFrX2hhbmRsZXIpOwogCiAvKiBXYWxrcyB0aGUgbGlzdCBhbmQgaW5jcmVtZW50cyBubWlzc2VkIGNvdW50IGZvciBtdWx0aXByb2JlIGNhc2UgKi8KLXZvaWQgX19rcHJvYmVzIGtwcm9iZXNfaW5jX25taXNzZWRfY291bnQoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQga3Byb2Jlc19pbmNfbm1pc3NlZF9jb3VudChzdHJ1Y3Qga3Byb2JlICpwKQogewogCXN0cnVjdCBrcHJvYmUgKmtwOwogCWlmICgha3Byb2JlX2FnZ3Jwcm9iZShwKSkgewpAQCAtMTA3OCw5ICsxMDcxLDEwIEBACiAJfQogCXJldHVybjsKIH0KK05PS1BST0JFX1NZTUJPTChrcHJvYmVzX2luY19ubWlzc2VkX2NvdW50KTsKIAotdm9pZCBfX2twcm9iZXMgcmVjeWNsZV9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpLAotCQkJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkKQordm9pZCByZWN5Y2xlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksCisJCSAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IGtyZXRwcm9iZSAqcnAgPSByaS0+cnA7CiAKQEAgLTEwOTUsOCArMTA4OSw5IEBACiAJCS8qIFVucmVnaXN0ZXJpbmcgKi8KIAkJaGxpc3RfYWRkX2hlYWQoJnJpLT5obGlzdCwgaGVhZCk7CiB9CitOT0tQUk9CRV9TWU1CT0wocmVjeWNsZV9ycF9pbnN0KTsKIAotdm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKK3ZvaWQga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCSBzdHJ1Y3QgaGxpc3RfaGVhZCAqKmhlYWQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogX19hY3F1aXJlcyhobGlzdF9sb2NrKQogewpAQCAtMTEwNywxNyArMTEwMiwxOSBAQAogCWhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CitOT0tQUk9CRV9TWU1CT0woa3JldHByb2JlX2hhc2hfbG9jayk7CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBrcmV0cHJvYmVfdGFibGVfbG9jayh1bnNpZ25lZCBsb25nIGhhc2gsCi0JdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBrcmV0cHJvYmVfdGFibGVfbG9jayh1bnNpZ25lZCBsb25nIGhhc2gsCisJCQkJIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogX19hY3F1aXJlcyhobGlzdF9sb2NrKQogewogCXJhd19zcGlubG9ja190ICpobGlzdF9sb2NrID0ga3JldHByb2JlX3RhYmxlX2xvY2tfcHRyKGhhc2gpOwogCXJhd19zcGluX2xvY2tfaXJxc2F2ZShobGlzdF9sb2NrLCAqZmxhZ3MpOwogfQorTk9LUFJPQkVfU1lNQk9MKGtyZXRwcm9iZV90YWJsZV9sb2NrKTsKIAotdm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQordm9pZCBrcmV0cHJvYmVfaGFzaF91bmxvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkgICB1bnNpZ25lZCBsb25nICpmbGFncykKIF9fcmVsZWFzZXMoaGxpc3RfbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIGhhc2ggPSBoYXNoX3B0cih0c2ssIEtQUk9CRV9IQVNIX0JJVFMpOwpAQCAtMTEyNiwxNCArMTEyMywxNiBAQAogCWhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KK05PS1BST0JFX1NZTUJPTChrcmV0cHJvYmVfaGFzaF91bmxvY2spOwogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMga3JldHByb2JlX3RhYmxlX3VubG9jayh1bnNpZ25lZCBsb25nIGhhc2gsCi0gICAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwKKwkJCQkgICB1bnNpZ25lZCBsb25nICpmbGFncykKIF9fcmVsZWFzZXMoaGxpc3RfbG9jaykKIHsKIAlyYXdfc3BpbmxvY2tfdCAqaGxpc3RfbG9jayA9IGtyZXRwcm9iZV90YWJsZV9sb2NrX3B0cihoYXNoKTsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShobGlzdF9sb2NrLCAqZmxhZ3MpOwogfQorTk9LUFJPQkVfU1lNQk9MKGtyZXRwcm9iZV90YWJsZV91bmxvY2spOwogCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBmaW5pc2hfdGFza19zd2l0Y2ggd2hlbiB0YXNrIHRrIGJlY29tZXMgZGVhZCwKQEAgLTExNDEsNyArMTE0MCw3IEBACiAgKiB3aXRoIHRoaXMgdGFzay4gVGhlc2UgbGVmdCBvdmVyIGluc3RhbmNlcyByZXByZXNlbnQgcHJvYmVkIGZ1bmN0aW9ucwogICogdGhhdCBoYXZlIGJlZW4gY2FsbGVkIGJ1dCB3aWxsIG5ldmVyIHJldHVybi4KICAqLwotdm9pZCBfX2twcm9iZXMga3Byb2JlX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0aykKK3ZvaWQga3Byb2JlX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0aykKIHsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgZW1wdHlfcnA7CkBAIC0xMTY2LDYgKzExNjUsNyBAQAogCQlrZnJlZShyaSk7CiAJfQogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV9mbHVzaF90YXNrKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKQEAgLTExNzgsNyArMTE3OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgY2xlYW51cF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKQorc3RhdGljIHZvaWQgY2xlYW51cF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGhhc2g7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0xMTk3LDEyICsxMTk3LDEzIEBACiAJfQogCWZyZWVfcnBfaW5zdChycCk7CiB9CitOT0tQUk9CRV9TWU1CT0woY2xlYW51cF9ycF9pbnN0KTsKIAogLyoKICogQWRkIHRoZSBuZXcgcHJvYmUgdG8gYXAtPmxpc3QuIEZhaWwgaWYgdGhpcyBpcyB0aGUKICogc2Vjb25kIGpwcm9iZSBhdCB0aGUgYWRkcmVzcyAtIHR3byBqcHJvYmVzIGNhbid0IGNvZXhpc3QKICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBhZGRfbmV3X2twcm9iZShzdHJ1Y3Qga3Byb2JlICphcCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgYWRkX25ld19rcHJvYmUoc3RydWN0IGtwcm9iZSAqYXAsIHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJQlVHX09OKGtwcm9iZV9nb25lKGFwKSB8fCBrcHJvYmVfZ29uZShwKSk7CiAKQEAgLTEyMjYsNyArMTIyNyw3IEBACiAgKiBGaWxsIGluIHRoZSByZXF1aXJlZCBmaWVsZHMgb2YgdGhlICJtYW5hZ2VyIGtwcm9iZSIuIFJlcGxhY2UgdGhlCiAgKiBlYXJsaWVyIGtwcm9iZSBpbiB0aGUgaGxpc3Qgd2l0aCB0aGUgbWFuYWdlciBrcHJvYmUKICAqLwotc3RhdGljIHZvaWQgX19rcHJvYmVzIGluaXRfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqYXAsIHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgdm9pZCBpbml0X2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKmFwLCBzdHJ1Y3Qga3Byb2JlICpwKQogewogCS8qIENvcHkgcCdzIGluc24gc2xvdCB0byBhcCAqLwogCWNvcHlfa3Byb2JlKHAsIGFwKTsKQEAgLTEyNTIsOCArMTI1Myw3IEBACiAgKiBUaGlzIGlzIHRoZSBzZWNvbmQgb3Igc3Vic2VxdWVudCBrcHJvYmUgYXQgdGhlIGFkZHJlc3MgLSBoYW5kbGUKICAqIHRoZSBpbnRyaWNhY2llcwogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9hZ2dyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpvcmlnX3AsCi0JCQkJCSAgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqb3JpZ19wLCBzdHJ1Y3Qga3Byb2JlICpwKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBrcHJvYmUgKmFwID0gb3JpZ19wOwpAQCAtMTMyNCwyNSArMTMyNCwyOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIGluX2twcm9iZXNfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcikKK2Jvb2wgX193ZWFrIGFyY2hfd2l0aGluX2twcm9iZV9ibGFja2xpc3QodW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBrcHJvYmVfYmxhY2twb2ludCAqa2I7CisJLyogVGhlIF9fa3Byb2JlcyBtYXJrZWQgZnVuY3Rpb25zIGFuZCBlbnRyeSBjb2RlIG11c3Qgbm90IGJlIHByb2JlZCAqLworCXJldHVybiBhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fa3Byb2Jlc190ZXh0X3N0YXJ0ICYmCisJICAgICAgIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9lbmQ7Cit9CiAKLQlpZiAoYWRkciA+PSAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9zdGFydCAmJgotCSAgICBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpX19rcHJvYmVzX3RleHRfZW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKK3N0YXRpYyBib29sIHdpdGhpbl9rcHJvYmVfYmxhY2tsaXN0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9lbnRyeSAqZW50OworCisJaWYgKGFyY2hfd2l0aGluX2twcm9iZV9ibGFja2xpc3QoYWRkcikpCisJCXJldHVybiB0cnVlOwogCS8qCiAJICogSWYgdGhlcmUgZXhpc3RzIGEga3Byb2JlX2JsYWNrbGlzdCwgdmVyaWZ5IGFuZAogCSAqIGZhaWwgYW55IHByb2JlIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvaGliaXRlZCBhcmVhCiAJICovCi0JZm9yIChrYiA9IGtwcm9iZV9ibGFja2xpc3Q7IGtiLT5uYW1lICE9IE5VTEw7IGtiKyspIHsKLQkJaWYgKGtiLT5zdGFydF9hZGRyKSB7Ci0JCQlpZiAoYWRkciA+PSBrYi0+c3RhcnRfYWRkciAmJgotCQkJICAgIGFkZHIgPCAoa2ItPnN0YXJ0X2FkZHIgKyBrYi0+cmFuZ2UpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsICZrcHJvYmVfYmxhY2tsaXN0LCBsaXN0KSB7CisJCWlmIChhZGRyID49IGVudC0+c3RhcnRfYWRkciAmJiBhZGRyIDwgZW50LT5lbmRfYWRkcikKKwkJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gMDsKKworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTEzNTEsNyArMTM1NSw3IEBACiAgKiBUaGlzIHJldHVybnMgZW5jb2RlZCBlcnJvcnMgaWYgaXQgZmFpbHMgdG8gbG9vayB1cCBzeW1ib2wgb3IgaW52YWxpZAogICogY29tYmluYXRpb24gb2YgcGFyYW1ldGVycy4KICAqLwotc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKmtwcm9iZV9hZGRyKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMga3Byb2JlX29wY29kZV90ICprcHJvYmVfYWRkcihzdHJ1Y3Qga3Byb2JlICpwKQogewogCWtwcm9iZV9vcGNvZGVfdCAqYWRkciA9IHAtPmFkZHI7CiAKQEAgLTEzNzQsNyArMTM3OCw3IEBACiB9CiAKIC8qIENoZWNrIHBhc3NlZCBrcHJvYmUgaXMgdmFsaWQgYW5kIHJldHVybiBrcHJvYmUgaW4ga3Byb2JlX3RhYmxlLiAqLwotc3RhdGljIHN0cnVjdCBrcHJvYmUgKiBfX2twcm9iZXMgX19nZXRfdmFsaWRfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgc3RydWN0IGtwcm9iZSAqX19nZXRfdmFsaWRfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJc3RydWN0IGtwcm9iZSAqYXAsICpsaXN0X3A7CiAKQEAgLTE0MDYsOCArMTQxMCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIF9fa3Byb2JlcyBpbnQgY2hlY2tfa3Byb2JlX2FkZHJlc3Nfc2FmZShzdHJ1Y3Qga3Byb2JlICpwLAotCQkJCQkgICAgICAgc3RydWN0IG1vZHVsZSAqKnByb2JlZF9tb2QpCitzdGF0aWMgaW50IGNoZWNrX2twcm9iZV9hZGRyZXNzX3NhZmUoc3RydWN0IGtwcm9iZSAqcCwKKwkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKipwcm9iZWRfbW9kKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZnRyYWNlX2FkZHI7CkBAIC0xNDMzLDcgKzE0MzcsNyBAQAogCiAJLyogRW5zdXJlIGl0IGlzIG5vdCBpbiByZXNlcnZlZCBhcmVhIG5vciBvdXQgb2YgdGV4dCAqLwogCWlmICgha2VybmVsX3RleHRfYWRkcmVzcygodW5zaWduZWQgbG9uZykgcC0+YWRkcikgfHwKLQkgICAgaW5fa3Byb2Jlc19mdW5jdGlvbnMoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIpIHx8CisJICAgIHdpdGhpbl9rcHJvYmVfYmxhY2tsaXN0KCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyKSB8fAogCSAgICBqdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQocC0+YWRkciwgcC0+YWRkcikpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC0xNDY5LDcgKzE0NzMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitpbnQgcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKQEAgLTE1MzEsNyArMTUzNSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9rcHJvYmUpOwogCiAvKiBDaGVjayBpZiBhbGwgcHJvYmVzIG9uIHRoZSBhZ2dycHJvYmUgYXJlIGRpc2FibGVkICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX2twcm9iZV9kaXNhYmxlZChzdHJ1Y3Qga3Byb2JlICphcCkKK3N0YXRpYyBpbnQgYWdncl9rcHJvYmVfZGlzYWJsZWQoc3RydWN0IGtwcm9iZSAqYXApCiB7CiAJc3RydWN0IGtwcm9iZSAqa3A7CiAKQEAgLTE1NDcsNyArMTU1MSw3IEBACiB9CiAKIC8qIERpc2FibGUgb25lIGtwcm9iZTogTWFrZSBzdXJlIGNhbGxlZCB1bmRlciBrcHJvYmVfbXV0ZXggaXMgbG9ja2VkICovCi1zdGF0aWMgc3RydWN0IGtwcm9iZSAqX19rcHJvYmVzIF9fZGlzYWJsZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlICpfX2Rpc2FibGVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJc3RydWN0IGtwcm9iZSAqb3JpZ19wOwogCkBAIC0xNTc0LDcgKzE1NzgsNyBAQAogLyoKICAqIFVucmVnaXN0ZXIgYSBrcHJvYmUgd2l0aG91dCBhIHNjaGVkdWxlciBzeW5jaHJvbml6YXRpb24uCiAgKi8KLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fdW5yZWdpc3Rlcl9rcHJvYmVfdG9wKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgaW50IF9fdW5yZWdpc3Rlcl9rcHJvYmVfdG9wKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJc3RydWN0IGtwcm9iZSAqYXAsICpsaXN0X3A7CiAKQEAgLTE2MzEsNyArMTYzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBfX3VucmVnaXN0ZXJfa3Byb2JlX2JvdHRvbShzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX2twcm9iZV9ib3R0b20oc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlzdHJ1Y3Qga3Byb2JlICphcDsKIApAQCAtMTY0Nyw3ICsxNjUxLDcgQEAKIAkvKiBPdGhlcndpc2UsIGRvIG5vdGhpbmcuICovCiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQoraW50IHJlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIApAQCAtMTY2NSwxMyArMTY2OSwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfa3Byb2Jlcyk7CiAKLXZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIHVucmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJdW5yZWdpc3Rlcl9rcHJvYmVzKCZwLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfa3Byb2JlKTsKIAotdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0pCit2b2lkIHVucmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQogewogCWludCBpOwogCkBAIC0xNzAwLDcgKzE3MDQsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyllbnRyeTsKIH0KIAotaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0pCitpbnQgcmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQogewogCXN0cnVjdCBqcHJvYmUgKmpwOwogCWludCByZXQgPSAwLCBpOwpAQCAtMTczMSwxOSArMTczNSwxOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfanByb2Jlcyk7CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQoraW50IHJlZ2lzdGVyX2pwcm9iZShzdHJ1Y3QganByb2JlICpqcCkKIHsKIAlyZXR1cm4gcmVnaXN0ZXJfanByb2JlcygmanAsIDEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfanByb2JlKTsKIAotdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCit2b2lkIHVucmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQogewogCXVucmVnaXN0ZXJfanByb2JlcygmanAsIDEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9qcHJvYmUpOwogCi12b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSkKK3ZvaWQgdW5yZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0pCiB7CiAJaW50IGk7CiAKQEAgLTE3NjgsOCArMTc3Miw3IEBACiAgKiBUaGlzIGtwcm9iZSBwcmVfaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggZXZlcnkga3JldHByb2JlLiBXaGVuIHByb2JlCiAgKiBoaXRzIGl0IHdpbGwgc2V0IHVwIHRoZSByZXR1cm4gcHJvYmUuCiAgKi8KLXN0YXRpYyBpbnQgX19rcHJvYmVzIHByZV9oYW5kbGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3Byb2JlICpwLAotCQkJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgcHJlX2hhbmRsZXJfa3JldHByb2JlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcmV0cHJvYmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBrcmV0cHJvYmUsIGtwKTsKIAl1bnNpZ25lZCBsb25nIGhhc2gsIGZsYWdzID0gMDsKQEAgLTE4MDcsOCArMTgxMCw5IEBACiAJfQogCXJldHVybiAwOwogfQorTk9LUFJPQkVfU1lNQk9MKHByZV9oYW5kbGVyX2tyZXRwcm9iZSk7CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQoraW50IHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICppbnN0OwpAQCAtMTg2MSw3ICsxODY1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2tyZXRwcm9iZSk7CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQoraW50IHJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIApAQCAtMTg3OSwxMyArMTg4MywxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfa3JldHByb2Jlcyk7CiAKLXZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQordm9pZCB1bnJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAl1bnJlZ2lzdGVyX2tyZXRwcm9iZXMoJnJwLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfa3JldHByb2JlKTsKIAotdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKHN0cnVjdCBrcmV0cHJvYmUgKipycHMsIGludCBudW0pCit2b2lkIHVucmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQogewogCWludCBpOwogCkBAIC0xOTA4LDM4ICsxOTEyLDM4IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX2tyZXRwcm9iZXMpOwogCiAjZWxzZSAvKiBDT05GSUdfS1JFVFBST0JFUyAqLwotaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCitpbnQgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCXJldHVybiAtRU5PU1lTOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfa3JldHByb2JlKTsKIAotaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcmV0cHJvYmVzKHN0cnVjdCBrcmV0cHJvYmUgKipycHMsIGludCBudW0pCitpbnQgcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQogewogCXJldHVybiAtRU5PU1lTOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfa3JldHByb2Jlcyk7CiAKLXZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQordm9pZCB1bnJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfa3JldHByb2JlKTsKIAotdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKHN0cnVjdCBrcmV0cHJvYmUgKipycHMsIGludCBudW0pCit2b2lkIHVucmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQogewogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9rcmV0cHJvYmVzKTsKIAotc3RhdGljIGludCBfX2twcm9iZXMgcHJlX2hhbmRsZXJfa3JldHByb2JlKHN0cnVjdCBrcHJvYmUgKnAsCi0JCQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBwcmVfaGFuZGxlcl9rcmV0cHJvYmUoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcmV0dXJuIDA7CiB9CitOT0tQUk9CRV9TWU1CT0wocHJlX2hhbmRsZXJfa3JldHByb2JlKTsKIAogI2VuZGlmIC8qIENPTkZJR19LUkVUUFJPQkVTICovCiAKIC8qIFNldCB0aGUga3Byb2JlIGdvbmUgYW5kIHJlbW92ZSBpdHMgaW5zdHJ1Y3Rpb24gYnVmZmVyLiAqLwotc3RhdGljIHZvaWQgX19rcHJvYmVzIGtpbGxfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgdm9pZCBraWxsX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXN0cnVjdCBrcHJvYmUgKmtwOwogCkBAIC0xOTYzLDcgKzE5NjcsNyBAQAogfQogCiAvKiBEaXNhYmxlIG9uZSBrcHJvYmUgKi8KLWludCBfX2twcm9iZXMgZGlzYWJsZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqa3ApCitpbnQgZGlzYWJsZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqa3ApCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTE5NzksNyArMTk4Myw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChkaXNhYmxlX2twcm9iZSk7CiAKIC8qIEVuYWJsZSBvbmUga3Byb2JlICovCi1pbnQgX19rcHJvYmVzIGVuYWJsZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqa3ApCitpbnQgZW5hYmxlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICprcCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3Byb2JlICpwOwpAQCAtMjAxMiwxNiArMjAxNiw0OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZW5hYmxlX2twcm9iZSk7CiAKLXZvaWQgX19rcHJvYmVzIGR1bXBfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKmtwKQordm9pZCBkdW1wX2twcm9iZShzdHJ1Y3Qga3Byb2JlICprcCkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJEdW1waW5nIGtwcm9iZTpcbiIpOwogCXByaW50ayhLRVJOX1dBUk5JTkcgIk5hbWU6ICVzXG5BZGRyZXNzOiAlcFxuT2Zmc2V0OiAleFxuIiwKIAkgICAgICAga3AtPnN5bWJvbF9uYW1lLCBrcC0+YWRkciwga3AtPm9mZnNldCk7CiB9CitOT0tQUk9CRV9TWU1CT0woZHVtcF9rcHJvYmUpOworCisvKgorICogTG9va3VwIGFuZCBwb3B1bGF0ZSB0aGUga3Byb2JlX2JsYWNrbGlzdC4KKyAqCisgKiBVbmxpa2UgdGhlIGtyZXRwcm9iZSBibGFja2xpc3QsIHdlJ2xsIG5lZWQgdG8gZGV0ZXJtaW5lCisgKiB0aGUgcmFuZ2Ugb2YgYWRkcmVzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBzYWlkIGZ1bmN0aW9ucywKKyAqIHNpbmNlIGEga3Byb2JlIG5lZWQgbm90IG5lY2Vzc2FyaWx5IGJlIGF0IHRoZSBiZWdpbm5pbmcKKyAqIG9mIGEgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBvcHVsYXRlX2twcm9iZV9ibGFja2xpc3QodW5zaWduZWQgbG9uZyAqc3RhcnQsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZW5kKQoreworCXVuc2lnbmVkIGxvbmcgKml0ZXI7CisJc3RydWN0IGtwcm9iZV9ibGFja2xpc3RfZW50cnkgKmVudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDAsIHNpemUgPSAwOworCisJZm9yIChpdGVyID0gc3RhcnQ7IGl0ZXIgPCBlbmQ7IGl0ZXIrKykgeworCQlpZiAoIWthbGxzeW1zX2xvb2t1cF9zaXplX29mZnNldCgqaXRlciwgJnNpemUsICZvZmZzZXQpKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIGJsYWNrbGlzdCAlcFxuIiwgKHZvaWQgKikqaXRlcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVudCA9IGttYWxsb2Moc2l6ZW9mKCplbnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbnQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZW50LT5zdGFydF9hZGRyID0gKml0ZXI7CisJCWVudC0+ZW5kX2FkZHIgPSAqaXRlciArIHNpemU7CisJCUlOSVRfTElTVF9IRUFEKCZlbnQtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZlbnQtPmxpc3QsICZrcHJvYmVfYmxhY2tsaXN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CiAKIC8qIE1vZHVsZSBub3RpZmllciBjYWxsIGJhY2ssIGNoZWNraW5nIGtwcm9iZXMgb24gdGhlIG1vZHVsZSAqLwotc3RhdGljIGludCBfX2twcm9iZXMga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2QgPSBkYXRhOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMjA2MiwxNCArMjA5OSwxMyBAQAogCS5wcmlvcml0eSA9IDAKIH07CiAKKy8qIE1hcmtlcnMgb2YgX2twcm9iZV9ibGFja2xpc3Qgc2VjdGlvbiAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdGFydF9rcHJvYmVfYmxhY2tsaXN0W107CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX3N0b3Bfa3Byb2JlX2JsYWNrbGlzdFtdOworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2twcm9iZXModm9pZCkKIHsKIAlpbnQgaSwgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDAsIHNpemUgPSAwOwotCWNoYXIgKm1vZG5hbWUsIG5hbWVidWZbS1NZTV9OQU1FX0xFTl07Ci0JY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0Jdm9pZCAqYWRkcjsKLQlzdHJ1Y3Qga3Byb2JlX2JsYWNrcG9pbnQgKmtiOwogCiAJLyogRklYTUUgYWxsb2NhdGUgdGhlIHByb2JlIHRhYmxlLCBjdXJyZW50bHkgZGVmaW5lZCBzdGF0aWNhbGx5ICovCiAJLyogaW5pdGlhbGl6ZSBhbGwgbGlzdCBoZWFkcyAqLwpAQCAtMjA3OSwyNiArMjExNSwxMSBAQAogCQlyYXdfc3Bpbl9sb2NrX2luaXQoJihrcmV0cHJvYmVfdGFibGVfbG9ja3NbaV0ubG9jaykpOwogCX0KIAotCS8qCi0JICogTG9va3VwIGFuZCBwb3B1bGF0ZSB0aGUga3Byb2JlX2JsYWNrbGlzdC4KLQkgKgotCSAqIFVubGlrZSB0aGUga3JldHByb2JlIGJsYWNrbGlzdCwgd2UnbGwgbmVlZCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgcmFuZ2Ugb2YgYWRkcmVzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBzYWlkIGZ1bmN0aW9ucywKLQkgKiBzaW5jZSBhIGtwcm9iZSBuZWVkIG5vdCBuZWNlc3NhcmlseSBiZSBhdCB0aGUgYmVnaW5uaW5nCi0JICogb2YgYSBmdW5jdGlvbi4KLQkgKi8KLQlmb3IgKGtiID0ga3Byb2JlX2JsYWNrbGlzdDsga2ItPm5hbWUgIT0gTlVMTDsga2IrKykgewotCQlrcHJvYmVfbG9va3VwX25hbWUoa2ItPm5hbWUsIGFkZHIpOwotCQlpZiAoIWFkZHIpCi0JCQljb250aW51ZTsKLQotCQlrYi0+c3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0JCXN5bWJvbF9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGtiLT5zdGFydF9hZGRyLAotCQkJCSZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7Ci0JCWlmICghc3ltYm9sX25hbWUpCi0JCQlrYi0+cmFuZ2UgPSAwOwotCQllbHNlCi0JCQlrYi0+cmFuZ2UgPSBzaXplOworCWVyciA9IHBvcHVsYXRlX2twcm9iZV9ibGFja2xpc3QoX19zdGFydF9rcHJvYmVfYmxhY2tsaXN0LAorCQkJCQlfX3N0b3Bfa3Byb2JlX2JsYWNrbGlzdCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImtwcm9iZXM6IGZhaWxlZCB0byBwb3B1bGF0ZSBibGFja2xpc3Q6ICVkXG4iLCBlcnIpOworCQlwcl9lcnIoIlBsZWFzZSB0YWtlIGNhcmUgb2YgdXNpbmcga3Byb2Jlcy5cbiIpOwogCX0KIAogCWlmIChrcmV0cHJvYmVfYmxhY2tsaXN0X3NpemUpIHsKQEAgLTIxMzgsNyArMjE1OSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXBvcnRfcHJvYmUoc3RydWN0IHNlcV9maWxlICpwaSwgc3RydWN0IGtwcm9iZSAqcCwKK3N0YXRpYyB2b2lkIHJlcG9ydF9wcm9iZShzdHJ1Y3Qgc2VxX2ZpbGUgKnBpLCBzdHJ1Y3Qga3Byb2JlICpwLAogCQljb25zdCBjaGFyICpzeW0sIGludCBvZmZzZXQsIGNoYXIgKm1vZG5hbWUsIHN0cnVjdCBrcHJvYmUgKnBwKQogewogCWNoYXIgKmtwcm9iZV90eXBlOwpAQCAtMjE2NywxMiArMjE4OCwxMiBAQAogCQkoa3Byb2JlX2Z0cmFjZShwcCkgPyAiW0ZUUkFDRV0iIDogIiIpKTsKIH0KIAotc3RhdGljIHZvaWQgX19rcHJvYmVzICprcHJvYmVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZiwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqa3Byb2JlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGxvZmZfdCAqcG9zKQogewogCXJldHVybiAoKnBvcyA8IEtQUk9CRV9UQUJMRV9TSVpFKSA/IHBvcyA6IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyAqa3Byb2JlX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqa3Byb2JlX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJKCpwb3MpKys7CiAJaWYgKCpwb3MgPj0gS1BST0JFX1RBQkxFX1NJWkUpCkBAIC0yMTgwLDEyICsyMjAxLDEyIEBACiAJcmV0dXJuIHBvczsKIH0KIAotc3RhdGljIHZvaWQgX19rcHJvYmVzIGtwcm9iZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpCitzdGF0aWMgdm9pZCBrcHJvYmVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQogewogCS8qIE5vdGhpbmcgdG8gZG8gKi8KIH0KIAotc3RhdGljIGludCBfX2twcm9iZXMgc2hvd19rcHJvYmVfYWRkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnBpLCB2b2lkICp2KQorc3RhdGljIGludCBzaG93X2twcm9iZV9hZGRyKHN0cnVjdCBzZXFfZmlsZSAqcGksIHZvaWQgKnYpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGtwcm9iZSAqcCwgKmtwOwpAQCAtMjIxNiw3ICsyMjM3LDcgQEAKIAkuc2hvdyAgPSBzaG93X2twcm9iZV9hZGRyCiB9OwogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBrcHJvYmVzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IGtwcm9iZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlyZXR1cm4gc2VxX29wZW4oZmlscCwgJmtwcm9iZXNfc2VxX29wcyk7CiB9CkBAIC0yMjI4LDcgKzIyNDksNDcgQEAKIAkucmVsZWFzZSAgICAgICAgPSBzZXFfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBhcm1fYWxsX2twcm9iZXModm9pZCkKKy8qIGtwcm9iZXMvYmxhY2tsaXN0IC0tIHNob3dzIHdoaWNoIGZ1bmN0aW9ucyBjYW4gbm90IGJlIHByb2JlZCAqLworc3RhdGljIHZvaWQgKmtwcm9iZV9ibGFja2xpc3Rfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZrcHJvYmVfYmxhY2tsaXN0LCAqcG9zKTsKK30KKworc3RhdGljIHZvaWQgKmtwcm9iZV9ibGFja2xpc3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAma3Byb2JlX2JsYWNrbGlzdCwgcG9zKTsKK30KKworc3RhdGljIGludCBrcHJvYmVfYmxhY2tsaXN0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9lbnRyeSAqZW50ID0KKwkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9lbnRyeSwgbGlzdCk7CisKKwlzZXFfcHJpbnRmKG0sICIweCVwLTB4JXBcdCVwc1xuIiwgKHZvaWQgKillbnQtPnN0YXJ0X2FkZHIsCisJCSAgICh2b2lkICopZW50LT5lbmRfYWRkciwgKHZvaWQgKillbnQtPnN0YXJ0X2FkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGtwcm9iZV9ibGFja2xpc3Rfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBrcHJvYmVfYmxhY2tsaXN0X3NlcV9zdGFydCwKKwkubmV4dCAgPSBrcHJvYmVfYmxhY2tsaXN0X3NlcV9uZXh0LAorCS5zdG9wICA9IGtwcm9iZV9zZXFfc3RvcCwJLyogUmV1c2Ugdm9pZCBmdW5jdGlvbiAqLworCS5zaG93ICA9IGtwcm9iZV9ibGFja2xpc3Rfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGtwcm9iZV9ibGFja2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlscCwgJmtwcm9iZV9ibGFja2xpc3Rfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfa3Byb2JlX2JsYWNrbGlzdF9vcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0ga3Byb2JlX2JsYWNrbGlzdF9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSAgICAgICAgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIGFybV9hbGxfa3Byb2Jlcyh2b2lkKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBrcHJvYmUgKnA7CkBAIC0yMjU2LDcgKzIzMTcsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgX19rcHJvYmVzIGRpc2FybV9hbGxfa3Byb2Jlcyh2b2lkKQorc3RhdGljIHZvaWQgZGlzYXJtX2FsbF9rcHJvYmVzKHZvaWQpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGtwcm9iZSAqcDsKQEAgLTIzNDAsNyArMjQwMSw3IEBACiAJLmxsc2VlayA9CWRlZmF1bHRfbGxzZWVrLAogfTsKIAotc3RhdGljIGludCBfX2twcm9iZXMgZGVidWdmc19rcHJvYmVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZGVidWdmc19rcHJvYmVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRpciwgKmZpbGU7CiAJdW5zaWduZWQgaW50IHZhbHVlID0gMTsKQEAgLTIzNTEsMTkgKzI0MTIsMjQgQEAKIAogCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJsaXN0IiwgMDQ0NCwgZGlyLCBOVUxMLAogCQkJCSZkZWJ1Z2ZzX2twcm9iZXNfb3BlcmF0aW9ucyk7Ci0JaWYgKCFmaWxlKSB7Ci0JCWRlYnVnZnNfcmVtb3ZlKGRpcik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoIWZpbGUpCisJCWdvdG8gZXJyb3I7CiAKIAlmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZW5hYmxlZCIsIDA2MDAsIGRpciwKIAkJCQkJJnZhbHVlLCAmZm9wc19rcCk7Ci0JaWYgKCFmaWxlKSB7Ci0JCWRlYnVnZnNfcmVtb3ZlKGRpcik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoIWZpbGUpCisJCWdvdG8gZXJyb3I7CisKKwlmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYmxhY2tsaXN0IiwgMDQ0NCwgZGlyLCBOVUxMLAorCQkJCSZkZWJ1Z2ZzX2twcm9iZV9ibGFja2xpc3Rfb3BzKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gZXJyb3I7CiAKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJZGVidWdmc19yZW1vdmUoZGlyKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogbGF0ZV9pbml0Y2FsbChkZWJ1Z2ZzX2twcm9iZV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlIGIva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKaW5kZXggYjhiZGNkNC4uODU0MWJmZCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKKysrIGIva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKQEAgLTI0LDQgKzI0LDUgQEAKIG9iai0kKENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLKSArPSByd3NlbS1zcGlubG9jay5vCiBvYmotJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IHJ3c2VtLXhhZGQubwogb2JqLSQoQ09ORklHX1BFUkNQVV9SV1NFTSkgKz0gcGVyY3B1LXJ3c2VtLm8KK29iai0kKENPTkZJR19RVUVVRV9SV0xPQ0spICs9IHFyd2xvY2subwogb2JqLSQoQ09ORklHX0xPQ0tfVE9SVFVSRV9URVNUKSArPSBsb2NrdG9ydHVyZS5vCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9xcndsb2NrLmMgYi9rZXJuZWwvbG9ja2luZy9xcndsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9sb2NraW5nL3Fyd2xvY2suYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIFF1ZXVlIHJlYWQvd3JpdGUgbG9jaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMTMtMjAxNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICoKKyAqIEF1dGhvcnM6IFdhaW1hbiBMb25nIDx3YWltYW4ubG9uZ0BocC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3Fyd2xvY2suaD4KKworLyoqCisgKiByc3Bpbl91bnRpbF93cml0ZXJfdW5sb2NrIC0gaW5jIHJlYWRlciBjb3VudCAmIHNwaW4gdW50aWwgd3JpdGVyIGlzIGdvbmUKKyAqIEBsb2NrICA6IFBvaW50ZXIgdG8gcXVldWUgcndsb2NrIHN0cnVjdHVyZQorICogQHdyaXRlcjogQ3VycmVudCBxdWV1ZSByd2xvY2sgd3JpdGVyIHN0YXR1cyBieXRlCisgKgorICogSW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLCB0aGUgcmVhZGVyIHdpbGwganVzdAorICogaW5jcmVtZW50IHRoZSByZWFkZXIgY291bnQgJiB3YWl0IHVudGlsIHRoZSB3cml0ZXIgcmVsZWFzZXMgdGhlIGxvY2suCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZAorcnNwaW5fdW50aWxfd3JpdGVyX3VubG9jayhzdHJ1Y3QgcXJ3bG9jayAqbG9jaywgdTMyIGNudHMpCit7CisJd2hpbGUgKChjbnRzICYgX1FXX1dNQVNLKSA9PSBfUVdfTE9DS0VEKSB7CisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisJCWNudHMgPSBzbXBfbG9hZF9hY3F1aXJlKCh1MzIgKikmbG9jay0+Y250cyk7CisJfQorfQorCisvKioKKyAqIHF1ZXVlX3JlYWRfbG9ja19zbG93cGF0aCAtIGFjcXVpcmUgcmVhZCBsb2NrIG9mIGEgcXVldWUgcndsb2NrCisgKiBAbG9jazogUG9pbnRlciB0byBxdWV1ZSByd2xvY2sgc3RydWN0dXJlCisgKi8KK3ZvaWQgcXVldWVfcmVhZF9sb2NrX3Nsb3dwYXRoKHN0cnVjdCBxcndsb2NrICpsb2NrKQoreworCXUzMiBjbnRzOworCisJLyoKKwkgKiBSZWFkZXJzIGNvbWUgaGVyZSB3aGVuIHRoZXkgY2Fubm90IGdldCB0aGUgbG9jayB3aXRob3V0IHdhaXRpbmcKKwkgKi8KKwlpZiAodW5saWtlbHkoaW5faW50ZXJydXB0KCkpKSB7CisJCS8qCisJCSAqIFJlYWRlcnMgaW4gaW50ZXJydXB0IGNvbnRleHQgd2lsbCBzcGluIHVudGlsIHRoZSBsb2NrIGlzCisJCSAqIGF2YWlsYWJsZSB3aXRob3V0IHdhaXRpbmcgaW4gdGhlIHF1ZXVlLgorCQkgKi8KKwkJY250cyA9IHNtcF9sb2FkX2FjcXVpcmUoKHUzMiAqKSZsb2NrLT5jbnRzKTsKKwkJcnNwaW5fdW50aWxfd3JpdGVyX3VubG9jayhsb2NrLCBjbnRzKTsKKwkJcmV0dXJuOworCX0KKwlhdG9taWNfc3ViKF9RUl9CSUFTLCAmbG9jay0+Y250cyk7CisKKwkvKgorCSAqIFB1dCB0aGUgcmVhZGVyIGludG8gdGhlIHdhaXQgcXVldWUKKwkgKi8KKwlhcmNoX3NwaW5fbG9jaygmbG9jay0+bG9jayk7CisKKwkvKgorCSAqIEF0IHRoZSBoZWFkIG9mIHRoZSB3YWl0IHF1ZXVlIG5vdywgd2FpdCB1bnRpbCB0aGUgd3JpdGVyIHN0YXRlCisJICogZ29lcyB0byAwIGFuZCB0aGVuIHRyeSB0byBpbmNyZW1lbnQgdGhlIHJlYWRlciBjb3VudCBhbmQgZ2V0CisJICogdGhlIGxvY2suIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gaW5jb21pbmcgd3JpdGVyIG1heSBzdGVhbCB0aGUKKwkgKiBsb2NrIGluIHRoZSBpbnRlcmltLCBzbyBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIHdyaXRlciBieXRlCisJICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHdyaXRlIGxvY2sgaXNuJ3QgdGFrZW4uCisJICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZsb2NrLT5jbnRzKSAmIF9RV19XTUFTSykKKwkJYXJjaF9tdXRleF9jcHVfcmVsYXgoKTsKKworCWNudHMgPSBhdG9taWNfYWRkX3JldHVybihfUVJfQklBUywgJmxvY2stPmNudHMpIC0gX1FSX0JJQVM7CisJcnNwaW5fdW50aWxfd3JpdGVyX3VubG9jayhsb2NrLCBjbnRzKTsKKworCS8qCisJICogU2lnbmFsIHRoZSBuZXh0IG9uZSBpbiBxdWV1ZSB0byBiZWNvbWUgcXVldWUgaGVhZAorCSAqLworCWFyY2hfc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorRVhQT1JUX1NZTUJPTChxdWV1ZV9yZWFkX2xvY2tfc2xvd3BhdGgpOworCisvKioKKyAqIHF1ZXVlX3dyaXRlX2xvY2tfc2xvd3BhdGggLSBhY3F1aXJlIHdyaXRlIGxvY2sgb2YgYSBxdWV1ZSByd2xvY2sKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1ZSByd2xvY2sgc3RydWN0dXJlCisgKi8KK3ZvaWQgcXVldWVfd3JpdGVfbG9ja19zbG93cGF0aChzdHJ1Y3QgcXJ3bG9jayAqbG9jaykKK3sKKwl1MzIgY250czsKKworCS8qIFB1dCB0aGUgd3JpdGVyIGludG8gdGhlIHdhaXQgcXVldWUgKi8KKwlhcmNoX3NwaW5fbG9jaygmbG9jay0+bG9jayk7CisKKwkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jayBkaXJlY3RseSBpZiBubyByZWFkZXIgaXMgcHJlc2VudCAqLworCWlmICghYXRvbWljX3JlYWQoJmxvY2stPmNudHMpICYmCisJICAgIChhdG9taWNfY21weGNoZygmbG9jay0+Y250cywgMCwgX1FXX0xPQ0tFRCkgPT0gMCkpCisJCWdvdG8gdW5sb2NrOworCisJLyoKKwkgKiBTZXQgdGhlIHdhaXRpbmcgZmxhZyB0byBub3RpZnkgcmVhZGVycyB0aGF0IGEgd3JpdGVyIGlzIHBlbmRpbmcsCisJICogb3Igd2FpdCBmb3IgYSBwcmV2aW91cyB3cml0ZXIgdG8gZ28gYXdheS4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWNudHMgPSBhdG9taWNfcmVhZCgmbG9jay0+Y250cyk7CisJCWlmICghKGNudHMgJiBfUVdfV01BU0spICYmCisJCSAgICAoYXRvbWljX2NtcHhjaGcoJmxvY2stPmNudHMsIGNudHMsCisJCQkJICAgIGNudHMgfCBfUVdfV0FJVElORykgPT0gY250cykpCisJCQlicmVhazsKKworCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOworCX0KKworCS8qIFdoZW4gbm8gbW9yZSByZWFkZXJzLCBzZXQgdGhlIGxvY2tlZCBmbGFnICovCisJZm9yICg7OykgeworCQljbnRzID0gYXRvbWljX3JlYWQoJmxvY2stPmNudHMpOworCQlpZiAoKGNudHMgPT0gX1FXX1dBSVRJTkcpICYmCisJCSAgICAoYXRvbWljX2NtcHhjaGcoJmxvY2stPmNudHMsIF9RV19XQUlUSU5HLAorCQkJCSAgICBfUVdfTE9DS0VEKSA9PSBfUVdfV0FJVElORykpCisJCQlicmVhazsKKworCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOworCX0KK3VubG9jazoKKwlhcmNoX3NwaW5fdW5sb2NrKCZsb2NrLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocXVldWVfd3JpdGVfbG9ja19zbG93cGF0aCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMgYi9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKaW5kZXggYjQyMTlmZi4uZGFjYzMyMSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCisrKyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYwpAQCAtNSwxMSArNSwxNyBAQAogICoKICAqIFdyaXRlciBsb2NrLXN0ZWFsaW5nIGJ5IEFsZXggU2hpIDxhbGV4LnNoaUBpbnRlbC5jb20+CiAgKiBhbmQgTWljaGVsIExlc3BpbmFzc2UgPHdhbGtlbkBnb29nbGUuY29tPgorICoKKyAqIE9wdGltaXN0aWMgc3Bpbm5pbmcgYnkgVGltIENoZW4gPHRpbS5jLmNoZW5AaW50ZWwuY29tPgorICogYW5kIERhdmlkbG9ociBCdWVzbyA8ZGF2aWRsb2hyQGhwLmNvbT4uIEJhc2VkIG9uIG11dGV4ZXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CisKKyNpbmNsdWRlICJtY3Nfc3BpbmxvY2suaCIKIAogLyoKICAqIEd1aWRlIHRvIHRoZSByd19zZW1hcGhvcmUncyBjb3VudCBmaWVsZCBmb3IgY29tbW9uIHZhbHVlcy4KQEAgLTc2LDYgKzgyLDEwIEBACiAJc2VtLT5jb3VudCA9IFJXU0VNX1VOTE9DS0VEX1ZBTFVFOwogCXJhd19zcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZzZW0tPndhaXRfbGlzdCk7CisjaWZkZWYgQ09ORklHX1NNUAorCXNlbS0+b3duZXIgPSBOVUxMOworCXNlbS0+b3NxID0gTlVMTDsKKyNlbmRpZgogfQogCiBFWFBPUlRfU1lNQk9MKF9faW5pdF9yd3NlbSk7CkBAIC0xOTAsNyArMjAwLDcgQEAKIH0KIAogLyoKLSAqIHdhaXQgZm9yIHRoZSByZWFkIGxvY2sgdG8gYmUgZ3JhbnRlZAorICogV2FpdCBmb3IgdGhlIHJlYWQgbG9jayB0byBiZSBncmFudGVkCiAgKi8KIF9fdmlzaWJsZQogc3RydWN0IHJ3X3NlbWFwaG9yZSBfX3NjaGVkICpyd3NlbV9kb3duX3JlYWRfZmFpbGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKQEAgLTIzNyw2NCArMjQ3LDIyMSBAQAogCXJldHVybiBzZW07CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCByd3NlbV90cnlfd3JpdGVfbG9jayhsb25nIGNvdW50LCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJaWYgKCEoY291bnQgJiBSV1NFTV9BQ1RJVkVfTUFTSykpIHsKKwkJLyogdHJ5IGFjcXVpcmluZyB0aGUgd3JpdGUgbG9jayAqLworCQlpZiAoc2VtLT5jb3VudCA9PSBSV1NFTV9XQUlUSU5HX0JJQVMgJiYKKwkJICAgIGNtcHhjaGcoJnNlbS0+Y291bnQsIFJXU0VNX1dBSVRJTkdfQklBUywKKwkJCSAgICBSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUykgPT0gUldTRU1fV0FJVElOR19CSUFTKSB7CisJCQlpZiAoIWxpc3RfaXNfc2luZ3VsYXIoJnNlbS0+d2FpdF9saXN0KSkKKwkJCQlyd3NlbV9hdG9taWNfdXBkYXRlKFJXU0VNX1dBSVRJTkdfQklBUywgc2VtKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKIC8qCi0gKiB3YWl0IHVudGlsIHdlIHN1Y2Nlc3NmdWxseSBhY3F1aXJlIHRoZSB3cml0ZSBsb2NrCisgKiBUcnkgdG8gYWNxdWlyZSB3cml0ZSBsb2NrIGJlZm9yZSB0aGUgd3JpdGVyIGhhcyBiZWVuIHB1dCBvbiB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcndzZW1fdHJ5X3dyaXRlX2xvY2tfdW5xdWV1ZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWxvbmcgb2xkLCBjb3VudCA9IEFDQ0VTU19PTkNFKHNlbS0+Y291bnQpOworCisJd2hpbGUgKHRydWUpIHsKKwkJaWYgKCEoY291bnQgPT0gMCB8fCBjb3VudCA9PSBSV1NFTV9XQUlUSU5HX0JJQVMpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCW9sZCA9IGNtcHhjaGcoJnNlbS0+Y291bnQsIGNvdW50LCBjb3VudCArIFJXU0VNX0FDVElWRV9XUklURV9CSUFTKTsKKwkJaWYgKG9sZCA9PSBjb3VudCkKKwkJCXJldHVybiB0cnVlOworCisJCWNvdW50ID0gb2xkOworCX0KK30KKworc3RhdGljIGlubGluZSBib29sIHJ3c2VtX2Nhbl9zcGluX29uX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOworCWJvb2wgb25fY3B1ID0gdHJ1ZTsKKworCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJb3duZXIgPSBBQ0NFU1NfT05DRShzZW0tPm93bmVyKTsKKwlpZiAob3duZXIpCisJCW9uX2NwdSA9IG93bmVyLT5vbl9jcHU7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkvKgorCSAqIElmIHNlbS0+b3duZXIgaXMgbm90IHNldCwgdGhlIHJ3c2VtIG93bmVyIG1heSBoYXZlCisJICoganVzdCBhY3F1aXJlZCBpdCBhbmQgbm90IHNldCB0aGUgb3duZXIgeWV0IG9yIHRoZSByd3NlbQorCSAqIGhhcyBiZWVuIHJlbGVhc2VkLgorCSAqLworCXJldHVybiBvbl9jcHU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvd25lcl9ydW5uaW5nKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwKKwkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcikKK3sKKwlpZiAoc2VtLT5vd25lciAhPSBvd25lcikKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBFbnN1cmUgd2UgZW1pdCB0aGUgb3duZXItPm9uX2NwdSwgZGVyZWZlcmVuY2UgX2FmdGVyXyBjaGVja2luZworCSAqIHNlbS0+b3duZXIgc3RpbGwgbWF0Y2hlcyBvd25lciwgaWYgdGhhdCBmYWlscywgb3duZXIgbWlnaHQKKwkgKiBwb2ludCB0byBmcmVlKClkIG1lbW9yeSwgaWYgaXQgc3RpbGwgbWF0Y2hlcywgdGhlIHJjdV9yZWFkX2xvY2soKQorCSAqIGVuc3VyZXMgdGhlIG1lbW9yeSBzdGF5cyB2YWxpZC4KKwkgKi8KKwliYXJyaWVyKCk7CisKKwlyZXR1cm4gb3duZXItPm9uX2NwdTsKK30KKworc3RhdGljIG5vaW5saW5lCitib29sIHJ3c2VtX3NwaW5fb25fb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKQoreworCXJjdV9yZWFkX2xvY2soKTsKKwl3aGlsZSAob3duZXJfcnVubmluZyhzZW0sIG93bmVyKSkgeworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlicmVhazsKKworCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCS8qCisJICogV2UgYnJlYWsgb3V0IHRoZSBsb29wIGFib3ZlIG9uIG5lZWRfcmVzY2hlZCgpIG9yIHdoZW4gdGhlCisJICogb3duZXIgY2hhbmdlZCwgd2hpY2ggaXMgYSBzaWduIGZvciBoZWF2eSBjb250ZW50aW9uLiBSZXR1cm4KKwkgKiBzdWNjZXNzIG9ubHkgd2hlbiBzZW0tPm93bmVyIGlzIE5VTEwuCisJICovCisJcmV0dXJuIHNlbS0+b3duZXIgPT0gTlVMTDsKK30KKworc3RhdGljIGJvb2wgcndzZW1fb3B0aW1pc3RpY19zcGluKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOworCWJvb2wgdGFrZW4gPSBmYWxzZTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCisJLyogc2VtLT53YWl0X2xvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIHdoZW4gZG9pbmcgb3B0aW1pc3RpYyBzcGlubmluZyAqLworCWlmICghcndzZW1fY2FuX3NwaW5fb25fb3duZXIoc2VtKSkKKwkJZ290byBkb25lOworCisJaWYgKCFvc3FfbG9jaygmc2VtLT5vc3EpKQorCQlnb3RvIGRvbmU7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlvd25lciA9IEFDQ0VTU19PTkNFKHNlbS0+b3duZXIpOworCQlpZiAob3duZXIgJiYgIXJ3c2VtX3NwaW5fb25fb3duZXIoc2VtLCBvd25lcikpCisJCQlicmVhazsKKworCQkvKiB3YWl0X2xvY2sgd2lsbCBiZSBhY3F1aXJlZCBpZiB3cml0ZV9sb2NrIGlzIG9idGFpbmVkICovCisJCWlmIChyd3NlbV90cnlfd3JpdGVfbG9ja191bnF1ZXVlZChzZW0pKSB7CisJCQl0YWtlbiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFdoZW4gdGhlcmUncyBubyBvd25lciwgd2UgbWlnaHQgaGF2ZSBwcmVlbXB0ZWQgYmV0d2VlbiB0aGUKKwkJICogb3duZXIgYWNxdWlyaW5nIHRoZSBsb2NrIGFuZCBzZXR0aW5nIHRoZSBvd25lciBmaWVsZC4gSWYKKwkJICogd2UncmUgYW4gUlQgdGFzayB0aGF0IHdpbGwgbGl2ZS1sb2NrIGJlY2F1c2Ugd2Ugd29uJ3QgbGV0CisJCSAqIHRoZSBvd25lciBjb21wbGV0ZS4KKwkJICovCisJCWlmICghb3duZXIgJiYgKG5lZWRfcmVzY2hlZCgpIHx8IHJ0X3Rhc2soY3VycmVudCkpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVGhlIGNwdV9yZWxheCgpIGNhbGwgaXMgYSBjb21waWxlciBiYXJyaWVyIHdoaWNoIGZvcmNlcworCQkgKiBldmVyeXRoaW5nIGluIHRoaXMgbG9vcCB0byBiZSByZS1sb2FkZWQuIFdlIGRvbid0IG5lZWQKKwkJICogbWVtb3J5IGJhcnJpZXJzIGFzIHdlJ2xsIGV2ZW50dWFsbHkgb2JzZXJ2ZSB0aGUgcmlnaHQKKwkJICogdmFsdWVzIGF0IHRoZSBjb3N0IG9mIGEgZmV3IGV4dHJhIHNwaW5zLgorCQkgKi8KKwkJYXJjaF9tdXRleF9jcHVfcmVsYXgoKTsKKwl9CisJb3NxX3VubG9jaygmc2VtLT5vc3EpOworZG9uZToKKwlwcmVlbXB0X2VuYWJsZSgpOworCXJldHVybiB0YWtlbjsKK30KKworI2Vsc2UKK3N0YXRpYyBib29sIHJ3c2VtX29wdGltaXN0aWNfc3BpbihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKy8qCisgKiBXYWl0IHVudGlsIHdlIHN1Y2Nlc3NmdWxseSBhY3F1aXJlIHRoZSB3cml0ZSBsb2NrCiAgKi8KIF9fdmlzaWJsZQogc3RydWN0IHJ3X3NlbWFwaG9yZSBfX3NjaGVkICpyd3NlbV9kb3duX3dyaXRlX2ZhaWxlZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7Ci0JbG9uZyBjb3VudCwgYWRqdXN0bWVudCA9IC1SV1NFTV9BQ1RJVkVfV1JJVEVfQklBUzsKKwlsb25nIGNvdW50OworCWJvb2wgd2FpdGluZyA9IHRydWU7IC8qIGFueSBxdWV1ZWQgdGhyZWFkcyBiZWZvcmUgdXMgKi8KIAlzdHJ1Y3QgcndzZW1fd2FpdGVyIHdhaXRlcjsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKLQkvKiBzZXQgdXAgbXkgb3duIHN0eWxlIG9mIHdhaXRxdWV1ZSAqLwotCXdhaXRlci50YXNrID0gdHNrOworCS8qIHVuZG8gd3JpdGUgYmlhcyBmcm9tIGRvd25fd3JpdGUgb3BlcmF0aW9uLCBzdG9wIGFjdGl2ZSBsb2NraW5nICovCisJY291bnQgPSByd3NlbV9hdG9taWNfdXBkYXRlKC1SV1NFTV9BQ1RJVkVfV1JJVEVfQklBUywgc2VtKTsKKworCS8qIGRvIG9wdGltaXN0aWMgc3Bpbm5pbmcgYW5kIHN0ZWFsIGxvY2sgaWYgcG9zc2libGUgKi8KKwlpZiAocndzZW1fb3B0aW1pc3RpY19zcGluKHNlbSkpCisJCXJldHVybiBzZW07CisKKwkvKgorCSAqIE9wdGltaXN0aWMgc3Bpbm5pbmcgZmFpbGVkLCBwcm9jZWVkIHRvIHRoZSBzbG93cGF0aAorCSAqIGFuZCBibG9jayB1bnRpbCB3ZSBjYW4gYWNxdWlyZSB0aGUgc2VtLgorCSAqLworCXdhaXRlci50YXNrID0gY3VycmVudDsKIAl3YWl0ZXIudHlwZSA9IFJXU0VNX1dBSVRJTkdfRk9SX1dSSVRFOwogCiAJcmF3X3NwaW5fbG9ja19pcnEoJnNlbS0+d2FpdF9sb2NrKTsKKworCS8qIGFjY291bnQgZm9yIHRoaXMgYmVmb3JlIGFkZGluZyBhIG5ldyBlbGVtZW50IHRvIHRoZSBsaXN0ICovCiAJaWYgKGxpc3RfZW1wdHkoJnNlbS0+d2FpdF9saXN0KSkKLQkJYWRqdXN0bWVudCArPSBSV1NFTV9XQUlUSU5HX0JJQVM7CisJCXdhaXRpbmcgPSBmYWxzZTsKKwogCWxpc3RfYWRkX3RhaWwoJndhaXRlci5saXN0LCAmc2VtLT53YWl0X2xpc3QpOwogCiAJLyogd2UncmUgbm93IHdhaXRpbmcgb24gdGhlIGxvY2ssIGJ1dCBubyBsb25nZXIgYWN0aXZlbHkgbG9ja2luZyAqLwotCWNvdW50ID0gcndzZW1fYXRvbWljX3VwZGF0ZShhZGp1c3RtZW50LCBzZW0pOworCWlmICh3YWl0aW5nKSB7CisJCWNvdW50ID0gQUNDRVNTX09OQ0Uoc2VtLT5jb3VudCk7CiAKLQkvKiBJZiB0aGVyZSB3ZXJlIGFscmVhZHkgdGhyZWFkcyBxdWV1ZWQgYmVmb3JlIHVzIGFuZCB0aGVyZSBhcmUgbm8KLQkgKiBhY3RpdmUgd3JpdGVycywgdGhlIGxvY2sgbXVzdCBiZSByZWFkIG93bmVkOyBzbyB3ZSB0cnkgdG8gd2FrZQotCSAqIGFueSByZWFkIGxvY2tzIHRoYXQgd2VyZSBxdWV1ZWQgYWhlYWQgb2YgdXMuICovCi0JaWYgKGNvdW50ID4gUldTRU1fV0FJVElOR19CSUFTICYmCi0JICAgIGFkanVzdG1lbnQgPT0gLVJXU0VNX0FDVElWRV9XUklURV9CSUFTKQotCQlzZW0gPSBfX3J3c2VtX2RvX3dha2Uoc2VtLCBSV1NFTV9XQUtFX1JFQURFUlMpOworCQkvKgorCQkgKiBJZiB0aGVyZSB3ZXJlIGFscmVhZHkgdGhyZWFkcyBxdWV1ZWQgYmVmb3JlIHVzIGFuZCB0aGVyZSBhcmUKKwkJICogbm8gYWN0aXZlIHdyaXRlcnMsIHRoZSBsb2NrIG11c3QgYmUgcmVhZCBvd25lZDsgc28gd2UgdHJ5IHRvCisJCSAqIHdha2UgYW55IHJlYWQgbG9ja3MgdGhhdCB3ZXJlIHF1ZXVlZCBhaGVhZCBvZiB1cy4KKwkJICovCisJCWlmIChjb3VudCA+IFJXU0VNX1dBSVRJTkdfQklBUykKKwkJCXNlbSA9IF9fcndzZW1fZG9fd2FrZShzZW0sIFJXU0VNX1dBS0VfUkVBREVSUyk7CisKKwl9IGVsc2UKKwkJY291bnQgPSByd3NlbV9hdG9taWNfdXBkYXRlKFJXU0VNX1dBSVRJTkdfQklBUywgc2VtKTsKIAogCS8qIHdhaXQgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgdGhlIGxvY2sgKi8KLQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJd2hpbGUgKHRydWUpIHsKLQkJaWYgKCEoY291bnQgJiBSV1NFTV9BQ1RJVkVfTUFTSykpIHsKLQkJCS8qIFRyeSBhY3F1aXJpbmcgdGhlIHdyaXRlIGxvY2suICovCi0JCQljb3VudCA9IFJXU0VNX0FDVElWRV9XUklURV9CSUFTOwotCQkJaWYgKCFsaXN0X2lzX3Npbmd1bGFyKCZzZW0tPndhaXRfbGlzdCkpCi0JCQkJY291bnQgKz0gUldTRU1fV0FJVElOR19CSUFTOwotCi0JCQlpZiAoc2VtLT5jb3VudCA9PSBSV1NFTV9XQUlUSU5HX0JJQVMgJiYKLQkJCSAgICBjbXB4Y2hnKCZzZW0tPmNvdW50LCBSV1NFTV9XQUlUSU5HX0JJQVMsIGNvdW50KSA9PQotCQkJCQkJCVJXU0VNX1dBSVRJTkdfQklBUykKLQkJCQlicmVhazsKLQkJfQotCisJCWlmIChyd3NlbV90cnlfd3JpdGVfbG9jayhjb3VudCwgc2VtKSkKKwkJCWJyZWFrOwogCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZzZW0tPndhaXRfbG9jayk7CiAKIAkJLyogQmxvY2sgdW50aWwgdGhlcmUgYXJlIG5vIGFjdGl2ZSBsb2NrZXJzLiAqLwogCQlkbyB7CiAJCQlzY2hlZHVsZSgpOwotCQkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCX0gd2hpbGUgKChjb3VudCA9IHNlbS0+Y291bnQpICYgUldTRU1fQUNUSVZFX01BU0spOwogCiAJCXJhd19zcGluX2xvY2tfaXJxKCZzZW0tPndhaXRfbG9jayk7CiAJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAogCWxpc3RfZGVsKCZ3YWl0ZXIubGlzdCk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmc2VtLT53YWl0X2xvY2spOwotCXRzay0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CiAKIAlyZXR1cm4gc2VtOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcndzZW0uYyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLmMKaW5kZXggY2ZmZjE0My4uNDJmODA2ZCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcndzZW0uYworKysgYi9rZXJuZWwvbG9ja2luZy9yd3NlbS5jCkBAIC0xMiw2ICsxMiwyNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNKQorc3RhdGljIGlubGluZSB2b2lkIHJ3c2VtX3NldF9vd25lcihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJc2VtLT5vd25lciA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByd3NlbV9jbGVhcl9vd25lcihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJc2VtLT5vd25lciA9IE5VTEw7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fc2V0X293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ3c2VtX2NsZWFyX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKK30KKyNlbmRpZgorCiAvKgogICogbG9jayBmb3IgcmVhZGluZwogICovCkBAIC00OCw2ICs2OSw3IEBACiAJcndzZW1fYWNxdWlyZSgmc2VtLT5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7CiAKIAlMT0NLX0NPTlRFTkRFRChzZW0sIF9fZG93bl93cml0ZV90cnlsb2NrLCBfX2Rvd25fd3JpdGUpOworCXJ3c2VtX3NldF9vd25lcihzZW0pOwogfQogCiBFWFBPUlRfU1lNQk9MKGRvd25fd3JpdGUpOwpAQCAtNTksOCArODEsMTEgQEAKIHsKIAlpbnQgcmV0ID0gX19kb3duX3dyaXRlX3RyeWxvY2soc2VtKTsKIAotCWlmIChyZXQgPT0gMSkKKwlpZiAocmV0ID09IDEpIHsKIAkJcndzZW1fYWNxdWlyZSgmc2VtLT5kZXBfbWFwLCAwLCAxLCBfUkVUX0lQXyk7CisJCXJ3c2VtX3NldF9vd25lcihzZW0pOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg1LDYgKzExMCw3IEBACiB7CiAJcndzZW1fcmVsZWFzZSgmc2VtLT5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7CiAKKwlyd3NlbV9jbGVhcl9vd25lcihzZW0pOwogCV9fdXBfd3JpdGUoc2VtKTsKIH0KIApAQCAtOTksNiArMTI1LDcgQEAKIAkgKiBsb2NrZGVwOiBhIGRvd25ncmFkZWQgd3JpdGUgd2lsbCBsaXZlIG9uIGFzIGEgd3JpdGUKIAkgKiBkZXBlbmRlbmN5LgogCSAqLworCXJ3c2VtX2NsZWFyX293bmVyKHNlbSk7CiAJX19kb3duZ3JhZGVfd3JpdGUoc2VtKTsKIH0KIApAQCAtMTIyLDYgKzE0OSw3IEBACiAJcndzZW1fYWNxdWlyZV9uZXN0KCZzZW0tPmRlcF9tYXAsIDAsIDAsIG5lc3QsIF9SRVRfSVBfKTsKIAogCUxPQ0tfQ09OVEVOREVEKHNlbSwgX19kb3duX3dyaXRlX3RyeWxvY2ssIF9fZG93bl93cml0ZSk7CisJcndzZW1fc2V0X293bmVyKHNlbSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woX2Rvd25fd3JpdGVfbmVzdF9sb2NrKTsKQEAgLTE0MSw2ICsxNjksNyBAQAogCXJ3c2VtX2FjcXVpcmUoJnNlbS0+ZGVwX21hcCwgc3ViY2xhc3MsIDAsIF9SRVRfSVBfKTsKIAogCUxPQ0tfQ09OVEVOREVEKHNlbSwgX19kb3duX3dyaXRlX3RyeWxvY2ssIF9fZG93bl93cml0ZSk7CisJcndzZW1fc2V0X293bmVyKHNlbSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZG93bl93cml0ZV9uZXN0ZWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL25vdGlmaWVyLmMgYi9rZXJuZWwvbm90aWZpZXIuYwppbmRleCBkYjRjOGIwLi40ODAzZGE2IDEwMDY0NAotLS0gYS9rZXJuZWwvbm90aWZpZXIuYworKysgYi9rZXJuZWwvbm90aWZpZXIuYwpAQCAtNzEsOSArNzEsOSBAQAogICoJQHJldHVybnM6CW5vdGlmaWVyX2NhbGxfY2hhaW4gcmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlCiAgKgkJCWxhc3Qgbm90aWZpZXIgZnVuY3Rpb24gY2FsbGVkLgogICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKm5sLAotCQkJCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdiwKLQkJCQkJaW50IG5yX3RvX2NhbGwsCWludCAqbnJfY2FsbHMpCitzdGF0aWMgaW50IG5vdGlmaWVyX2NhbGxfY2hhaW4oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICoqbmwsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYsCisJCQkgICAgICAgaW50IG5yX3RvX2NhbGwsIGludCAqbnJfY2FsbHMpCiB7CiAJaW50IHJldCA9IE5PVElGWV9ET05FOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsICpuZXh0X25iOwpAQCAtMTAyLDYgKzEwMiw3IEBACiAJfQogCXJldHVybiByZXQ7CiB9CitOT0tQUk9CRV9TWU1CT0wobm90aWZpZXJfY2FsbF9jaGFpbik7CiAKIC8qCiAgKglBdG9taWMgbm90aWZpZXIgY2hhaW4gcm91dGluZXMuICBSZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uCkBAIC0xNzIsOSArMTczLDkgQEAKICAqCU90aGVyd2lzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByZXR1cm4gdmFsdWUKICAqCW9mIHRoZSBsYXN0IG5vdGlmaWVyIGZ1bmN0aW9uIGNhbGxlZC4KICAqLwotaW50IF9fa3Byb2JlcyBfX2F0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCAqbmgsCi0JCQkJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2LAotCQkJCQlpbnQgbnJfdG9fY2FsbCwgaW50ICpucl9jYWxscykKK2ludCBfX2F0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCAqbmgsCisJCQkJIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2LAorCQkJCSBpbnQgbnJfdG9fY2FsbCwgaW50ICpucl9jYWxscykKIHsKIAlpbnQgcmV0OwogCkBAIC0xODQsMTMgKzE4NSwxNSBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2F0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKTsKK05PS1BST0JFX1NZTUJPTChfX2F0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKTsKIAotaW50IF9fa3Byb2JlcyBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbihzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgKm5oLAotCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdikKK2ludCBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbihzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgKm5oLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQogewogCXJldHVybiBfX2F0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKG5oLCB2YWwsIHYsIC0xLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKTsKK05PS1BST0JFX1NZTUJPTChhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbik7CiAKIC8qCiAgKglCbG9ja2luZyBub3RpZmllciBjaGFpbiByb3V0aW5lcy4gIEFsbCBhY2Nlc3MgdG8gdGhlIGNoYWluIGlzCkBAIC01MjcsNyArNTMwLDcgQEAKIAogc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGRpZV9jaGFpbik7CiAKLWludCBub3RyYWNlIF9fa3Byb2JlcyBub3RpZnlfZGllKGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKK2ludCBub3RyYWNlIG5vdGlmeV9kaWUoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLAogCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQogewogCXN0cnVjdCBkaWVfYXJncyBhcmdzID0gewpAQCAtNTQwLDYgKzU0Myw3IEBACiAJfTsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRpZV9jaGFpbiwgdmFsLCAmYXJncyk7CiB9CitOT0tQUk9CRV9TWU1CT0wobm90aWZ5X2RpZSk7CiAKIGludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCBkZjg4ZDU1Li40OWUwYTIwIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CiAKICNpbmNsdWRlICJwb3dlci5oIgogCkBAIC0yOTIsNyArMjkzLDkgQEAKIAogCWluX3N1c3BlbmQgPSAxOwogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7CisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJtYWNoaW5lX3N1c3BlbmQiKSwgUE1fRVZFTlRfSElCRVJOQVRFLCB0cnVlKTsKIAllcnJvciA9IHN3c3VzcF9hcmNoX3N1c3BlbmQoKTsKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoIm1hY2hpbmVfc3VzcGVuZCIpLCBQTV9FVkVOVF9ISUJFUk5BVEUsIGZhbHNlKTsKIAlpZiAoZXJyb3IpCiAJCXByaW50ayhLRVJOX0VSUiAiUE06IEVycm9yICVkIGNyZWF0aW5nIGhpYmVybmF0aW9uIGltYWdlXG4iLAogCQkJZXJyb3IpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYyBiL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKaW5kZXggMDZlYzg4NjkuLjBjYThkODMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCiAvKiAKICAqIFRpbWVvdXQgZm9yIHN0b3BwaW5nIHByb2Nlc3NlcwpAQCAtMTc1LDYgKzE3Niw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJ0aGF3X3Byb2Nlc3NlcyIpLCAwLCB0cnVlKTsKIAlpZiAocG1fZnJlZXppbmcpCiAJCWF0b21pY19kZWMoJnN5c3RlbV9mcmVlemluZ19jbnQpOwogCXBtX2ZyZWV6aW5nID0gZmFsc2U7CkBAIC0yMDEsNiArMjAzLDcgQEAKIAogCXNjaGVkdWxlKCk7CiAJcHJpbnRrKCJkb25lLlxuIik7CisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJ0aGF3X3Byb2Nlc3NlcyIpLCAwLCBmYWxzZSk7CiB9CiAKIHZvaWQgdGhhd19rZXJuZWxfdGhyZWFkcyh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKaW5kZXggOTYzZTZkMC4uNGRkODgyMiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCkBAIC0xNzcsNyArMTc3LDkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRmluaXNoOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJmcmVlemVfcHJvY2Vzc2VzIiksIDAsIHRydWUpOwogCWVycm9yID0gc3VzcGVuZF9mcmVlemVfcHJvY2Vzc2VzKCk7CisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJmcmVlemVfcHJvY2Vzc2VzIiksIDAsIGZhbHNlKTsKIAlpZiAoIWVycm9yKQogCQlyZXR1cm4gMDsKIApAQCAtMjQwLDcgKzI0Miw5IEBACiAJICogYWxsIHRoZSBkZXZpY2VzIGFyZSBzdXNwZW5kZWQuCiAJICovCiAJaWYgKHN0YXRlID09IFBNX1NVU1BFTkRfRlJFRVpFKSB7CisJCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygibWFjaGluZV9zdXNwZW5kIiksIHN0YXRlLCB0cnVlKTsKIAkJZnJlZXplX2VudGVyKCk7CisJCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygibWFjaGluZV9zdXNwZW5kIiksIHN0YXRlLCBmYWxzZSk7CiAJCWdvdG8gUGxhdGZvcm1fd2FrZTsKIAl9CiAKQEAgLTI1Niw3ICsyNjAsMTEgQEAKIAlpZiAoIWVycm9yKSB7CiAJCSp3YWtldXAgPSBwbV93YWtldXBfcGVuZGluZygpOwogCQlpZiAoIShzdXNwZW5kX3Rlc3QoVEVTVF9DT1JFKSB8fCAqd2FrZXVwKSkgeworCQkJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJtYWNoaW5lX3N1c3BlbmQiKSwKKwkJCQlzdGF0ZSwgdHJ1ZSk7CiAJCQllcnJvciA9IHN1c3BlbmRfb3BzLT5lbnRlcihzdGF0ZSk7CisJCQl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoIm1hY2hpbmVfc3VzcGVuZCIpLAorCQkJCXN0YXRlLCBmYWxzZSk7CiAJCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOwogCQl9CiAJCXN5c2NvcmVfcmVzdW1lKCk7CkBAIC0yOTQsNyArMzAyLDYgQEAKIAlpZiAobmVlZF9zdXNwZW5kX29wcyhzdGF0ZSkgJiYgIXN1c3BlbmRfb3BzKQogCQlyZXR1cm4gLUVOT1NZUzsKIAotCXRyYWNlX21hY2hpbmVfc3VzcGVuZChzdGF0ZSk7CiAJaWYgKG5lZWRfc3VzcGVuZF9vcHMoc3RhdGUpICYmIHN1c3BlbmRfb3BzLT5iZWdpbikgewogCQllcnJvciA9IHN1c3BlbmRfb3BzLT5iZWdpbihzdGF0ZSk7CiAJCWlmIChlcnJvcikKQEAgLTMzMSw3ICszMzgsNiBAQAogCWVsc2UgaWYgKHN0YXRlID09IFBNX1NVU1BFTkRfRlJFRVpFICYmIGZyZWV6ZV9vcHMtPmVuZCkKIAkJZnJlZXplX29wcy0+ZW5kKCk7CiAKLQl0cmFjZV9tYWNoaW5lX3N1c3BlbmQoUFdSX0VWRU5UX0VYSVQpOwogCXJldHVybiBlcnJvcjsKIAogIFJlY292ZXJfcGxhdGZvcm06CkBAIC0zNjUsNiArMzcxLDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAKKwl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoInN1c3BlbmRfZW50ZXIiKSwgc3RhdGUsIHRydWUpOwogCWlmIChzdGF0ZSA9PSBQTV9TVVNQRU5EX0ZSRUVaRSkgewogI2lmZGVmIENPTkZJR19QTV9ERUJVRwogCQlpZiAocG1fdGVzdF9sZXZlbCAhPSBURVNUX05PTkUgJiYgcG1fdGVzdF9sZXZlbCA8PSBURVNUX0NQVVMpIHsKQEAgLTM4Miw5ICszODksMTEgQEAKIAlpZiAoc3RhdGUgPT0gUE1fU1VTUEVORF9GUkVFWkUpCiAJCWZyZWV6ZV9iZWdpbigpOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJzeW5jX2ZpbGVzeXN0ZW1zIiksIDAsIHRydWUpOwogCXByaW50ayhLRVJOX0lORk8gIlBNOiBTeW5jaW5nIGZpbGVzeXN0ZW1zIC4uLiAiKTsKIAlzeXNfc3luYygpOwogCXByaW50aygiZG9uZS5cbiIpOworCXRyYWNlX3N1c3BlbmRfcmVzdW1lKFRQUygic3luY19maWxlc3lzdGVtcyIpLCAwLCBmYWxzZSk7CiAKIAlwcl9kZWJ1ZygiUE06IFByZXBhcmluZyBzeXN0ZW0gZm9yICVzIHNsZWVwXG4iLCBwbV9zdGF0ZXNbc3RhdGVdLmxhYmVsKTsKIAllcnJvciA9IHN1c3BlbmRfcHJlcGFyZShzdGF0ZSk7CkBAIC0zOTQsNiArNDAzLDcgQEAKIAlpZiAoc3VzcGVuZF90ZXN0KFRFU1RfRlJFRVpFUikpCiAJCWdvdG8gRmluaXNoOwogCisJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJzdXNwZW5kX2VudGVyIiksIHN0YXRlLCBmYWxzZSk7CiAJcHJfZGVidWcoIlBNOiBFbnRlcmluZyAlcyBzbGVlcFxuIiwgcG1fc3RhdGVzW3N0YXRlXS5sYWJlbCk7CiAJcG1fcmVzdHJpY3RfZ2ZwX21hc2soKTsKIAllcnJvciA9IHN1c3BlbmRfZGV2aWNlc19hbmRfZW50ZXIoc3RhdGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NvcmUuYyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKaW5kZXggYzZiOTg3OS4uM2JkZjAxYiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NvcmUuYworKysgYi9rZXJuZWwvc2NoZWQvY29yZS5jCkBAIC01MzUsNyArNTM1LDcgQEAKICAJX19vbGQ7CQkJCQkJCQlcCiB9KQogCi0jaWZkZWYgVElGX1BPTExJTkdfTlJGTEFHCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKFRJRl9QT0xMSU5HX05SRkxBRykKIC8qCiAgKiBBdG9taWNhbGx5IHNldCBUSUZfTkVFRF9SRVNDSEVEIGFuZCB0ZXN0IGZvciBUSUZfUE9MTElOR19OUkZMQUcsCiAgKiB0aGlzIGF2b2lkcyBhbnkgcmFjZXMgd3J0IHBvbGxpbmcgc3RhdGUgY2hhbmdlcyBhbmQgdGhlcmVieSBhdm9pZHMKQEAgLTU0NiwxMiArNTQ2LDQ0IEBACiAJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJcmV0dXJuICEoZmV0Y2hfb3IoJnRpLT5mbGFncywgX1RJRl9ORUVEX1JFU0NIRUQpICYgX1RJRl9QT0xMSU5HX05SRkxBRyk7CiB9CisKKy8qCisgKiBBdG9taWNhbGx5IHNldCBUSUZfTkVFRF9SRVNDSEVEIGlmIFRJRl9QT0xMSU5HX05SRkxBRyBpcyBzZXQuCisgKgorICogSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGlkbGUgdGFzayBwcm9taXNlcyB0byBjYWxsCisgKiBzY2hlZF90dHd1X3BlbmRpbmcoKSBhbmQgcmVzY2hlZHVsZSBzb29uLgorICovCitzdGF0aWMgYm9vbCBzZXRfbnJfaWZfcG9sbGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CisJdHlwZW9mKHRpLT5mbGFncykgb2xkLCB2YWwgPSBBQ0NFU1NfT05DRSh0aS0+ZmxhZ3MpOworCisJZm9yICg7OykgeworCQlpZiAoISh2YWwgJiBfVElGX1BPTExJTkdfTlJGTEFHKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHZhbCAmIF9USUZfTkVFRF9SRVNDSEVEKQorCQkJcmV0dXJuIHRydWU7CisJCW9sZCA9IGNtcHhjaGcoJnRpLT5mbGFncywgdmFsLCB2YWwgfCBfVElGX05FRURfUkVTQ0hFRCk7CisJCWlmIChvbGQgPT0gdmFsKQorCQkJYnJlYWs7CisJCXZhbCA9IG9sZDsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKICNlbHNlCiBzdGF0aWMgYm9vbCBzZXRfbnJfYW5kX25vdF9wb2xsaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzZXRfdHNrX25lZWRfcmVzY2hlZChwKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBib29sIHNldF9ucl9pZl9wb2xsaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKICNlbmRpZgogCiAvKgpAQCAtNTgwLDYgKzYxMiw4IEBACiAKIAlpZiAoc2V0X25yX2FuZF9ub3RfcG9sbGluZyhwKSkKIAkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOworCWVsc2UKKwkJdHJhY2Vfc2NoZWRfd2FrZV9pZGxlX3dpdGhvdXRfaXBpKGNwdSk7CiB9CiAKIHZvaWQgcmVzY2hlZF9jcHUoaW50IGNwdSkKQEAgLTY0MiwyNyArNjc2LDEwIEBACiAJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCiAJCXJldHVybjsKIAotCS8qCi0JICogVGhpcyBpcyBzYWZlLCBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSB0aW1lcgotCSAqIHdoZWVsIGJhc2UgbG9jayBvZiAoY3B1KSBoZWxkLiBXaGVuIHRoZSBDUFUgaXMgb24gdGhlIHdheQotCSAqIHRvIGlkbGUgYW5kIGhhcyBub3QgeWV0IHNldCBycS0+Y3VyciB0byBpZGxlIHRoZW4gaXQgd2lsbAotCSAqIGJlIHNlcmlhbGl6ZWQgb24gdGhlIHRpbWVyIHdoZWVsIGJhc2UgbG9jayBhbmQgdGFrZSB0aGUgbmV3Ci0JICogdGltZXIgaW50byBhY2NvdW50IGF1dG9tYXRpY2FsbHkuCi0JICovCi0JaWYgKHJxLT5jdXJyICE9IHJxLT5pZGxlKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFdlIGNhbiBzZXQgVElGX1JFU0NIRUQgb24gdGhlIGlkbGUgdGFzayBvZiB0aGUgb3RoZXIgQ1BVCi0JICogbG9ja2xlc3MuIFRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgdGhlIG90aGVyIENQVSBydW5zIHRoZQotCSAqIGlkbGUgdGFzayB0aHJvdWdoIGFuIGFkZGl0aW9uYWwgTk9PUCBzY2hlZHVsZSgpCi0JICovCi0Jc2V0X3Rza19uZWVkX3Jlc2NoZWQocnEtPmlkbGUpOwotCi0JLyogTkVFRF9SRVNDSEVEIG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgd2UgdGVzdCBwb2xsaW5nICovCi0Jc21wX21iKCk7Ci0JaWYgKCF0c2tfaXNfcG9sbGluZyhycS0+aWRsZSkpCisJaWYgKHNldF9ucl9hbmRfbm90X3BvbGxpbmcocnEtPmlkbGUpKQogCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CisJZWxzZQorCQl0cmFjZV9zY2hlZF93YWtlX2lkbGVfd2l0aG91dF9pcGkoY3B1KTsKIH0KIAogc3RhdGljIGJvb2wgd2FrZV91cF9mdWxsX25vaHpfY3B1KGludCBjcHUpCkBAIC04ODgsNyArOTA1LDcgQEAKIAlycS0+Y2xvY2tfdGFzayArPSBkZWx0YTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcpIHx8IGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1RJTUVfQUNDT1VOVElORykKLQlpZiAoKGlycV9kZWx0YSArIHN0ZWFsKSAmJiBzY2hlZF9mZWF0KE5PTlRBU0tfUE9XRVIpKQorCWlmICgoaXJxX2RlbHRhICsgc3RlYWwpICYmIHNjaGVkX2ZlYXQoTk9OVEFTS19DQVBBQ0lUWSkpCiAJCXNjaGVkX3J0X2F2Z191cGRhdGUocnEsIGlycV9kZWx0YSArIHN0ZWFsKTsKICNlbmRpZgogfQpAQCAtMTUyMSwxMyArMTUzOCwxNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgc2NoZWRfdHR3dV9wZW5kaW5nKHZvaWQpCit2b2lkIHNjaGVkX3R0d3VfcGVuZGluZyh2b2lkKQogewogCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CiAJc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0ID0gbGxpc3RfZGVsX2FsbCgmcnEtPndha2VfbGlzdCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlyYXdfc3Bpbl9sb2NrKCZycS0+bG9jayk7CisJaWYgKCFsbGlzdCkKKwkJcmV0dXJuOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOwogCiAJd2hpbGUgKGxsaXN0KSB7CiAJCXAgPSBsbGlzdF9lbnRyeShsbGlzdCwgc3RydWN0IHRhc2tfc3RydWN0LCB3YWtlX2VudHJ5KTsKQEAgLTE1MzUsNyArMTU1Niw3IEBACiAJCXR0d3VfZG9fYWN0aXZhdGUocnEsIHAsIDApOwogCX0KIAotCXJhd19zcGluX3VubG9jaygmcnEtPmxvY2spOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwogfQogCiB2b2lkIHNjaGVkdWxlcl9pcGkodm9pZCkKQEAgLTE1ODEsOCArMTYwMiwxNCBAQAogCiBzdGF0aWMgdm9pZCB0dHd1X3F1ZXVlX3JlbW90ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUpCiB7Ci0JaWYgKGxsaXN0X2FkZCgmcC0+d2FrZV9lbnRyeSwgJmNwdV9ycShjcHUpLT53YWtlX2xpc3QpKQotCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCisJaWYgKGxsaXN0X2FkZCgmcC0+d2FrZV9lbnRyeSwgJmNwdV9ycShjcHUpLT53YWtlX2xpc3QpKSB7CisJCWlmICghc2V0X25yX2lmX3BvbGxpbmcocnEtPmlkbGUpKQorCQkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOworCQllbHNlCisJCQl0cmFjZV9zY2hlZF93YWtlX2lkbGVfd2l0aG91dF9pcGkoY3B1KTsKKwl9CiB9CiAKIGJvb2wgY3B1c19zaGFyZV9jYWNoZShpbnQgdGhpc19jcHUsIGludCB0aGF0X2NwdSkKQEAgLTI1MjcsNyArMjU1NCw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgKGRlZmluZWQoQ09ORklHX0RFQlVHX1BSRUVNUFQpIHx8IFwKIAkJCQlkZWZpbmVkKENPTkZJR19QUkVFTVBUX1RSQUNFUikpCiAKLXZvaWQgX19rcHJvYmVzIHByZWVtcHRfY291bnRfYWRkKGludCB2YWwpCit2b2lkIHByZWVtcHRfY291bnRfYWRkKGludCB2YWwpCiB7CiAjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKIAkvKgpAQCAtMjU1Myw4ICsyNTgwLDkgQEAKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHByZWVtcHRfY291bnRfYWRkKTsKK05PS1BST0JFX1NZTUJPTChwcmVlbXB0X2NvdW50X2FkZCk7CiAKLXZvaWQgX19rcHJvYmVzIHByZWVtcHRfY291bnRfc3ViKGludCB2YWwpCit2b2lkIHByZWVtcHRfY291bnRfc3ViKGludCB2YWwpCiB7CiAjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKIAkvKgpAQCAtMjU3NSw2ICsyNjAzLDcgQEAKIAlfX3ByZWVtcHRfY291bnRfc3ViKHZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MKHByZWVtcHRfY291bnRfc3ViKTsKK05PS1BST0JFX1NZTUJPTChwcmVlbXB0X2NvdW50X3N1Yik7CiAKICNlbmRpZgogCkBAIC0yODU3LDYgKzI4ODYsNyBAQAogCQliYXJyaWVyKCk7CiAJfSB3aGlsZSAobmVlZF9yZXNjaGVkKCkpOwogfQorTk9LUFJPQkVfU1lNQk9MKHByZWVtcHRfc2NoZWR1bGUpOwogRVhQT1JUX1NZTUJPTChwcmVlbXB0X3NjaGVkdWxlKTsKICNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVCAqLwogCkBAIC00MjE2LDcgKzQyNDYsNyBAQAogICoJZmFsc2UgKDApIGlmIHdlIGZhaWxlZCB0byBib29zdCB0aGUgdGFyZ2V0LgogICoJLUVTUkNIIGlmIHRoZXJlJ3Mgbm8gdGFzayB0byB5aWVsZCB0by4KICAqLwotYm9vbCBfX3NjaGVkIHlpZWxkX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgYm9vbCBwcmVlbXB0KQoraW50IF9fc2NoZWQgeWllbGRfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBib29sIHByZWVtcHQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudDsKIAlzdHJ1Y3QgcnEgKnJxLCAqcF9ycTsKQEAgLTUyNDIsMTQgKzUyNzIsMTMgQEAKIAkJfQogCiAJCS8qCi0JCSAqIEV2ZW4gdGhvdWdoIHdlIGluaXRpYWxpemUgLT5wb3dlciB0byBzb21ldGhpbmcgc2VtaS1zYW5lLAotCQkgKiB3ZSBsZWF2ZSBwb3dlcl9vcmlnIHVuc2V0LiBUaGlzIGFsbG93cyB1cyB0byBkZXRlY3QgaWYKKwkJICogRXZlbiB0aG91Z2ggd2UgaW5pdGlhbGl6ZSAtPmNhcGFjaXR5IHRvIHNvbWV0aGluZyBzZW1pLXNhbmUsCisJCSAqIHdlIGxlYXZlIGNhcGFjaXR5X29yaWcgdW5zZXQuIFRoaXMgYWxsb3dzIHVzIHRvIGRldGVjdCBpZgogCQkgKiBkb21haW4gaXRlcmF0aW9uIGlzIHN0aWxsIGZ1bm55IHdpdGhvdXQgY2F1c2luZyAvMCB0cmFwcy4KIAkJICovCi0JCWlmICghZ3JvdXAtPnNncC0+cG93ZXJfb3JpZykgeworCQlpZiAoIWdyb3VwLT5zZ2MtPmNhcGFjaXR5X29yaWcpIHsKIAkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBkb21haW4tPmNwdV9wb3dlciBub3QgIgotCQkJCQkic2V0XG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGRvbWFpbi0+Y3B1X2NhcGFjaXR5IG5vdCBzZXRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTI3MSw5ICs1MzAwLDkgQEAKIAkJY3B1bGlzdF9zY25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpOwogCiAJCXByaW50ayhLRVJOX0NPTlQgIiAlcyIsIHN0cik7Ci0JCWlmIChncm91cC0+c2dwLT5wb3dlciAhPSBTQ0hFRF9QT1dFUl9TQ0FMRSkgewotCQkJcHJpbnRrKEtFUk5fQ09OVCAiIChjcHVfcG93ZXIgPSAlZCkiLAotCQkJCWdyb3VwLT5zZ3AtPnBvd2VyKTsKKwkJaWYgKGdyb3VwLT5zZ2MtPmNhcGFjaXR5ICE9IFNDSEVEX0NBUEFDSVRZX1NDQUxFKSB7CisJCQlwcmludGsoS0VSTl9DT05UICIgKGNwdV9jYXBhY2l0eSA9ICVkKSIsCisJCQkJZ3JvdXAtPnNnYy0+Y2FwYWNpdHkpOwogCQl9CiAKIAkJZ3JvdXAgPSBncm91cC0+bmV4dDsKQEAgLTUzMzEsNyArNTM2MCw3IEBACiAJCQkgU0RfQkFMQU5DRV9ORVdJRExFIHwKIAkJCSBTRF9CQUxBTkNFX0ZPUksgfAogCQkJIFNEX0JBTEFOQ0VfRVhFQyB8Ci0JCQkgU0RfU0hBUkVfQ1BVUE9XRVIgfAorCQkJIFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwKIAkJCSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIHwKIAkJCSBTRF9TSEFSRV9QT1dFUkRPTUFJTikpIHsKIAkJaWYgKHNkLT5ncm91cHMgIT0gc2QtPmdyb3Vwcy0+bmV4dCkKQEAgLTUzNjIsNyArNTM5MSw3IEBACiAJCQkJU0RfQkFMQU5DRV9ORVdJRExFIHwKIAkJCQlTRF9CQUxBTkNFX0ZPUksgfAogCQkJCVNEX0JBTEFOQ0VfRVhFQyB8Ci0JCQkJU0RfU0hBUkVfQ1BVUE9XRVIgfAorCQkJCVNEX1NIQVJFX0NQVUNBUEFDSVRZIHwKIAkJCQlTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIHwKIAkJCQlTRF9QUkVGRVJfU0lCTElORyB8CiAJCQkJU0RfU0hBUkVfUE9XRVJET01BSU4pOwpAQCAtNTQ4Nyw3ICs1NTE2LDcgQEAKIAlyZXR1cm4gcmQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9ncm91cCAqc2csIGludCBmcmVlX3NncCkKK3N0YXRpYyB2b2lkIGZyZWVfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9ncm91cCAqc2csIGludCBmcmVlX3NnYykKIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnRtcCwgKmZpcnN0OwogCkBAIC01NDk4LDggKzU1MjcsOCBAQAogCWRvIHsKIAkJdG1wID0gc2ctPm5leHQ7CiAKLQkJaWYgKGZyZWVfc2dwICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnNnLT5zZ3AtPnJlZikpCi0JCQlrZnJlZShzZy0+c2dwKTsKKwkJaWYgKGZyZWVfc2djICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnNnLT5zZ2MtPnJlZikpCisJCQlrZnJlZShzZy0+c2djKTsKIAogCQlrZnJlZShzZyk7CiAJCXNnID0gdG1wOwpAQCAtNTUxNyw3ICs1NTQ2LDcgQEAKIAlpZiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkgewogCQlmcmVlX3NjaGVkX2dyb3VwcyhzZC0+Z3JvdXBzLCAxKTsKIAl9IGVsc2UgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5ncm91cHMtPnJlZikpIHsKLQkJa2ZyZWUoc2QtPmdyb3Vwcy0+c2dwKTsKKwkJa2ZyZWUoc2QtPmdyb3Vwcy0+c2djKTsKIAkJa2ZyZWUoc2QtPmdyb3Vwcyk7CiAJfQogCWtmcmVlKHNkKTsKQEAgLTU3MjgsMTcgKzU3NTcsMTcgQEAKIAogCQljcHVtYXNrX29yKGNvdmVyZWQsIGNvdmVyZWQsIHNnX3NwYW4pOwogCi0JCXNnLT5zZ3AgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGkpOwotCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNnLT5zZ3AtPnJlZikgPT0gMSkKKwkJc2ctPnNnYyA9ICpwZXJfY3B1X3B0cihzZGQtPnNnYywgaSk7CisJCWlmIChhdG9taWNfaW5jX3JldHVybigmc2ctPnNnYy0+cmVmKSA9PSAxKQogCQkJYnVpbGRfZ3JvdXBfbWFzayhzZCwgc2cpOwogCiAJCS8qCi0JCSAqIEluaXRpYWxpemUgc2dwLT5wb3dlciBzdWNoIHRoYXQgZXZlbiBpZiB3ZSBtZXNzIHVwIHRoZQorCQkgKiBJbml0aWFsaXplIHNnYy0+Y2FwYWNpdHkgc3VjaCB0aGF0IGV2ZW4gaWYgd2UgbWVzcyB1cCB0aGUKIAkJICogZG9tYWlucyBhbmQgbm8gcG9zc2libGUgaXRlcmF0aW9uIHdpbGwgZ2V0IHVzIGhlcmUsIHdlIHdvbid0CiAJCSAqIGRpZSBvbiBhIC8wIHRyYXAuCiAJCSAqLwotCQlzZy0+c2dwLT5wb3dlciA9IFNDSEVEX1BPV0VSX1NDQUxFICogY3B1bWFza193ZWlnaHQoc2dfc3Bhbik7Ci0JCXNnLT5zZ3AtPnBvd2VyX29yaWcgPSBzZy0+c2dwLT5wb3dlcjsKKwkJc2ctPnNnYy0+Y2FwYWNpdHkgPSBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSAqIGNwdW1hc2tfd2VpZ2h0KHNnX3NwYW4pOworCQlzZy0+c2djLT5jYXBhY2l0eV9vcmlnID0gc2ctPnNnYy0+Y2FwYWNpdHk7CiAKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRoZSBmaXJzdCBncm91cCBvZiB0aGlzIGRvbWFpbiBjb250YWlucyB0aGUKQEAgLTU3NzYsOCArNTgwNSw4IEBACiAKIAlpZiAoc2cpIHsKIAkJKnNnID0gKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSk7Ci0JCSgqc2cpLT5zZ3AgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSk7Ci0JCWF0b21pY19zZXQoJigqc2cpLT5zZ3AtPnJlZiwgMSk7IC8qIGZvciBjbGFpbV9hbGxvY2F0aW9ucyAqLworCQkoKnNnKS0+c2djID0gKnBlcl9jcHVfcHRyKHNkZC0+c2djLCBjcHUpOworCQlhdG9taWNfc2V0KCYoKnNnKS0+c2djLT5yZWYsIDEpOyAvKiBmb3IgY2xhaW1fYWxsb2NhdGlvbnMgKi8KIAl9CiAKIAlyZXR1cm4gY3B1OwpAQCAtNTc4Niw3ICs1ODE1LDcgQEAKIC8qCiAgKiBidWlsZF9zY2hlZF9ncm91cHMgd2lsbCBidWlsZCBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0IG9mIHRoZSBncm91cHMKICAqIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHNwYW4sIGFuZCB3aWxsIHNldCBlYWNoIGdyb3VwJ3MgLT5jcHVtYXNrIGNvcnJlY3RseSwKLSAqIGFuZCAtPmNwdV9wb3dlciB0byAwLgorICogYW5kIC0+Y3B1X2NhcGFjaXR5IHRvIDAuCiAgKgogICogQXNzdW1lcyB0aGUgc2NoZWRfZG9tYWluIHRyZWUgaXMgZnVsbHkgY29uc3RydWN0ZWQKICAqLwpAQCAtNTg0MCwxNiArNTg2OSwxNiBAQAogfQogCiAvKgotICogSW5pdGlhbGl6ZSBzY2hlZCBncm91cHMgY3B1X3Bvd2VyLgorICogSW5pdGlhbGl6ZSBzY2hlZCBncm91cHMgY3B1X2NhcGFjaXR5LgogICoKLSAqIGNwdV9wb3dlciBpbmRpY2F0ZXMgdGhlIGNhcGFjaXR5IG9mIHNjaGVkIGdyb3VwLCB3aGljaCBpcyB1c2VkIHdoaWxlCisgKiBjcHVfY2FwYWNpdHkgaW5kaWNhdGVzIHRoZSBjYXBhY2l0eSBvZiBzY2hlZCBncm91cCwgd2hpY2ggaXMgdXNlZCB3aGlsZQogICogZGlzdHJpYnV0aW5nIHRoZSBsb2FkIGJldHdlZW4gZGlmZmVyZW50IHNjaGVkIGdyb3VwcyBpbiBhIHNjaGVkIGRvbWFpbi4KLSAqIFR5cGljYWxseSBjcHVfcG93ZXIgZm9yIGFsbCB0aGUgZ3JvdXBzIGluIGEgc2NoZWQgZG9tYWluIHdpbGwgYmUgc2FtZSB1bmxlc3MKLSAqIHRoZXJlIGFyZSBhc3ltbWV0cmllcyBpbiB0aGUgdG9wb2xvZ3kuIElmIHRoZXJlIGFyZSBhc3ltbWV0cmllcywgZ3JvdXAKLSAqIGhhdmluZyBtb3JlIGNwdV9wb3dlciB3aWxsIHBpY2t1cCBtb3JlIGxvYWQgY29tcGFyZWQgdG8gdGhlIGdyb3VwIGhhdmluZwotICogbGVzcyBjcHVfcG93ZXIuCisgKiBUeXBpY2FsbHkgY3B1X2NhcGFjaXR5IGZvciBhbGwgdGhlIGdyb3VwcyBpbiBhIHNjaGVkIGRvbWFpbiB3aWxsIGJlIHNhbWUKKyAqIHVubGVzcyB0aGVyZSBhcmUgYXN5bW1ldHJpZXMgaW4gdGhlIHRvcG9sb2d5LiBJZiB0aGVyZSBhcmUgYXN5bW1ldHJpZXMsCisgKiBncm91cCBoYXZpbmcgbW9yZSBjcHVfY2FwYWNpdHkgd2lsbCBwaWNrdXAgbW9yZSBsb2FkIGNvbXBhcmVkIHRvIHRoZQorICogZ3JvdXAgaGF2aW5nIGxlc3MgY3B1X2NhcGFjaXR5LgogICovCi1zdGF0aWMgdm9pZCBpbml0X3NjaGVkX2dyb3Vwc19wb3dlcihpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3N0YXRpYyB2b2lkIGluaXRfc2NoZWRfZ3JvdXBzX2NhcGFjaXR5KGludCBjcHUsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewogCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBzZC0+Z3JvdXBzOwogCkBAIC01ODYzLDggKzU4OTIsOCBAQAogCWlmIChjcHUgIT0gZ3JvdXBfYmFsYW5jZV9jcHUoc2cpKQogCQlyZXR1cm47CiAKLQl1cGRhdGVfZ3JvdXBfcG93ZXIoc2QsIGNwdSk7Ci0JYXRvbWljX3NldCgmc2ctPnNncC0+bnJfYnVzeV9jcHVzLCBzZy0+Z3JvdXBfd2VpZ2h0KTsKKwl1cGRhdGVfZ3JvdXBfY2FwYWNpdHkoc2QsIGNwdSk7CisJYXRvbWljX3NldCgmc2ctPnNnYy0+bnJfYnVzeV9jcHVzLCBzZy0+Z3JvdXBfd2VpZ2h0KTsKIH0KIAogLyoKQEAgLTU5NTUsOCArNTk4NCw4IEBACiAJaWYgKGF0b21pY19yZWFkKCYoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkpLT5yZWYpKQogCQkqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KSA9IE5VTEw7CiAKLQlpZiAoYXRvbWljX3JlYWQoJigqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSkpLT5yZWYpKQotCQkqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSkgPSBOVUxMOworCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNnYywgY3B1KSktPnJlZikpCisJCSpwZXJfY3B1X3B0cihzZGQtPnNnYywgY3B1KSA9IE5VTEw7CiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtNTk2OSw3ICs1OTk4LDcgQEAKIC8qCiAgKiBTRF9mbGFncyBhbGxvd2VkIGluIHRvcG9sb2d5IGRlc2NyaXB0aW9ucy4KICAqCi0gKiBTRF9TSEFSRV9DUFVQT1dFUiAgICAgIC0gZGVzY3JpYmVzIFNNVCB0b3BvbG9naWVzCisgKiBTRF9TSEFSRV9DUFVDQVBBQ0lUWSAgICAgIC0gZGVzY3JpYmVzIFNNVCB0b3BvbG9naWVzCiAgKiBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIC0gZGVzY3JpYmVzIHNoYXJlZCBjYWNoZXMKICAqIFNEX05VTUEgICAgICAgICAgICAgICAgLSBkZXNjcmliZXMgTlVNQSB0b3BvbG9naWVzCiAgKiBTRF9TSEFSRV9QT1dFUkRPTUFJTiAgIC0gZGVzY3JpYmVzIHNoYXJlZCBwb3dlciBkb21haW4KQEAgLTU5NzgsNyArNjAwNyw3IEBACiAgKiBTRF9BU1lNX1BBQ0tJTkcgICAgICAgIC0gZGVzY3JpYmVzIFNNVCBxdWlya3MKICAqLwogI2RlZmluZSBUT1BPTE9HWV9TRF9GTEFHUwkJXAotCShTRF9TSEFSRV9DUFVQT1dFUiB8CQlcCisJKFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwJCVwKIAkgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyB8CVwKIAkgU0RfTlVNQSB8CQkJXAogCSBTRF9BU1lNX1BBQ0tJTkcgfAkJXApAQCAtNjAyNCw3ICs2MDUzLDcgQEAKIAkJCQkJfCAxKlNEX0JBTEFOQ0VfRk9SSwogCQkJCQl8IDAqU0RfQkFMQU5DRV9XQUtFCiAJCQkJCXwgMSpTRF9XQUtFX0FGRklORQotCQkJCQl8IDAqU0RfU0hBUkVfQ1BVUE9XRVIKKwkJCQkJfCAwKlNEX1NIQVJFX0NQVUNBUEFDSVRZCiAJCQkJCXwgMCpTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTCiAJCQkJCXwgMCpTRF9TRVJJQUxJWkUKIAkJCQkJfCAwKlNEX1BSRUZFUl9TSUJMSU5HCkBAIC02MDQ2LDcgKzYwNzUsNyBAQAogCSAqIENvbnZlcnQgdG9wb2xvZ2ljYWwgcHJvcGVydGllcyBpbnRvIGJlaGF2aW91ci4KIAkgKi8KIAotCWlmIChzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikgeworCWlmIChzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVDQVBBQ0lUWSkgewogCQlzZC0+aW1iYWxhbmNlX3BjdCA9IDExMDsKIAkJc2QtPnNtdF9nYWluID0gMTE3ODsgLyogfjE1JSAqLwogCkBAIC02MzU4LDE0ICs2Mzg3LDE0IEBACiAJCWlmICghc2RkLT5zZykKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCXNkZC0+c2dwID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9ncm91cF9wb3dlciAqKTsKLQkJaWYgKCFzZGQtPnNncCkKKwkJc2RkLT5zZ2MgPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICopOworCQlpZiAoIXNkZC0+c2djKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJZm9yX2VhY2hfY3B1KGosIGNwdV9tYXApIHsKIAkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCQkJc3RydWN0IHNjaGVkX2dyb3VwICpzZzsKLQkJCXN0cnVjdCBzY2hlZF9ncm91cF9wb3dlciAqc2dwOworCQkJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICpzZ2M7CiAKIAkJICAgICAgIAlzZCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbikgKyBjcHVtYXNrX3NpemUoKSwKIAkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOwpAQCAtNjM4MywxMiArNjQxMiwxMiBAQAogCiAJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZywgaikgPSBzZzsKIAotCQkJc2dwID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIpICsgY3B1bWFza19zaXplKCksCisJCQlzZ2MgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cF9jYXBhY2l0eSkgKyBjcHVtYXNrX3NpemUoKSwKIAkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOwotCQkJaWYgKCFzZ3ApCisJCQlpZiAoIXNnYykKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2dwLCBqKSA9IHNncDsKKwkJCSpwZXJfY3B1X3B0cihzZGQtPnNnYywgaikgPSBzZ2M7CiAJCX0KIAl9CiAKQEAgLTY0MTUsMTUgKzY0NDQsMTUgQEAKIAogCQkJaWYgKHNkZC0+c2cpCiAJCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGopKTsKLQkJCWlmIChzZGQtPnNncCkKLQkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGopKTsKKwkJCWlmIChzZGQtPnNnYykKKwkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZ2MsIGopKTsKIAkJfQogCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKIAkJc2RkLT5zZCA9IE5VTEw7CiAJCWZyZWVfcGVyY3B1KHNkZC0+c2cpOwogCQlzZGQtPnNnID0gTlVMTDsKLQkJZnJlZV9wZXJjcHUoc2RkLT5zZ3ApOwotCQlzZGQtPnNncCA9IE5VTEw7CisJCWZyZWVfcGVyY3B1KHNkZC0+c2djKTsKKwkJc2RkLT5zZ2MgPSBOVUxMOwogCX0KIH0KIApAQCAtNjQ5MywxNCArNjUyMiwxNCBAQAogCQl9CiAJfQogCi0JLyogQ2FsY3VsYXRlIENQVSBwb3dlciBmb3IgcGh5c2ljYWwgcGFja2FnZXMgYW5kIG5vZGVzICovCisJLyogQ2FsY3VsYXRlIENQVSBjYXBhY2l0eSBmb3IgcGh5c2ljYWwgcGFja2FnZXMgYW5kIG5vZGVzICovCiAJZm9yIChpID0gbnJfY3B1bWFza19iaXRzLTE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmICghY3B1bWFza190ZXN0X2NwdShpLCBjcHVfbWFwKSkKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJlbnQpIHsKIAkJCWNsYWltX2FsbG9jYXRpb25zKGksIHNkKTsKLQkJCWluaXRfc2NoZWRfZ3JvdXBzX3Bvd2VyKGksIHNkKTsKKwkJCWluaXRfc2NoZWRfZ3JvdXBzX2NhcGFjaXR5KGksIHNkKTsKIAkJfQogCX0KIApAQCAtNjk0Myw3ICs2OTcyLDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCXJxLT5zZCA9IE5VTEw7CiAJCXJxLT5yZCA9IE5VTEw7Ci0JCXJxLT5jcHVfcG93ZXIgPSBTQ0hFRF9QT1dFUl9TQ0FMRTsKKwkJcnEtPmNwdV9jYXBhY2l0eSA9IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCQlycS0+cG9zdF9zY2hlZHVsZSA9IDA7CiAJCXJxLT5hY3RpdmVfYmFsYW5jZSA9IDA7CiAJCXJxLT5uZXh0X2JhbGFuY2UgPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCAyYjhjYmYwLi5mYzRmOThiMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMKKysrIGIva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMKQEAgLTU3LDggKzU3LDYgQEAKIAlkbF9iLT5kbF9ydW50aW1lID0gcnVudGltZTsKIH0KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG9fcmF0aW8odTY0IHBlcmlvZCwgdTY0IHJ1bnRpbWUpOwotCiB2b2lkIGluaXRfZGxfYncoc3RydWN0IGRsX2J3ICpkbF9iKQogewogCXJhd19zcGluX2xvY2tfaW5pdCgmZGxfYi0+bG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZmFpci5jIGIva2VybmVsL3NjaGVkL2ZhaXIuYwppbmRleCA5ODU1ZTg3ZC4uZmVhN2QzMyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWQvZmFpci5jCkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgd2VpZ2h0ZWRfY3B1bG9hZChjb25zdCBpbnQgY3B1KTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNvdXJjZV9sb2FkKGludCBjcHUsIGludCB0eXBlKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRhcmdldF9sb2FkKGludCBjcHUsIGludCB0eXBlKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyX29mKGludCBjcHUpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FwYWNpdHlfb2YoaW50IGNwdSk7CiBzdGF0aWMgbG9uZyBlZmZlY3RpdmVfbG9hZChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIGludCBjcHUsIGxvbmcgd2wsIGxvbmcgd2cpOwogCiAvKiBDYWNoZWQgc3RhdGlzdGljcyBmb3IgYWxsIENQVXMgd2l0aGluIGEgbm9kZSAqLwpAQCAtMTAyNiwxMSArMTAyNiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgbG9hZDsKIAogCS8qIFRvdGFsIGNvbXB1dGUgY2FwYWNpdHkgb2YgQ1BVcyBvbiBhIG5vZGUgKi8KLQl1bnNpZ25lZCBsb25nIHBvd2VyOworCXVuc2lnbmVkIGxvbmcgY29tcHV0ZV9jYXBhY2l0eTsKIAogCS8qIEFwcHJveGltYXRlIGNhcGFjaXR5IGluIHRlcm1zIG9mIHJ1bm5hYmxlIHRhc2tzIG9uIGEgbm9kZSAqLwotCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7Ci0JaW50IGhhc19jYXBhY2l0eTsKKwl1bnNpZ25lZCBsb25nIHRhc2tfY2FwYWNpdHk7CisJaW50IGhhc19mcmVlX2NhcGFjaXR5OwogfTsKIAogLyoKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKIAkJbnMtPm5yX3J1bm5pbmcgKz0gcnEtPm5yX3J1bm5pbmc7CiAJCW5zLT5sb2FkICs9IHdlaWdodGVkX2NwdWxvYWQoY3B1KTsKLQkJbnMtPnBvd2VyICs9IHBvd2VyX29mKGNwdSk7CisJCW5zLT5jb21wdXRlX2NhcGFjaXR5ICs9IGNhcGFjaXR5X29mKGNwdSk7CiAKIAkJY3B1cysrOwogCX0KQEAgLTEwNTYsMTUgKzEwNTYsMTYgQEAKIAkgKiB0aGUgQG5zIHN0cnVjdHVyZSBpcyBOVUxMJ2VkIGFuZCB0YXNrX251bWFfY29tcGFyZSgpIHdpbGwKIAkgKiBub3QgZmluZCB0aGlzIG5vZGUgYXR0cmFjdGl2ZS4KIAkgKgotCSAqIFdlJ2xsIGVpdGhlciBiYWlsIGF0ICFoYXNfY2FwYWNpdHksIG9yIHdlJ2xsIGRldGVjdCBhIGh1Z2UgaW1iYWxhbmNlCi0JICogYW5kIGJhaWwgdGhlcmUuCisJICogV2UnbGwgZWl0aGVyIGJhaWwgYXQgIWhhc19mcmVlX2NhcGFjaXR5LCBvciB3ZSdsbCBkZXRlY3QgYSBodWdlCisJICogaW1iYWxhbmNlIGFuZCBiYWlsIHRoZXJlLgogCSAqLwogCWlmICghY3B1cykKIAkJcmV0dXJuOwogCi0JbnMtPmxvYWQgPSAobnMtPmxvYWQgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLyBucy0+cG93ZXI7Ci0JbnMtPmNhcGFjaXR5ID0gRElWX1JPVU5EX0NMT1NFU1QobnMtPnBvd2VyLCBTQ0hFRF9QT1dFUl9TQ0FMRSk7Ci0JbnMtPmhhc19jYXBhY2l0eSA9IChucy0+bnJfcnVubmluZyA8IG5zLT5jYXBhY2l0eSk7CisJbnMtPmxvYWQgPSAobnMtPmxvYWQgKiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSkgLyBucy0+Y29tcHV0ZV9jYXBhY2l0eTsKKwlucy0+dGFza19jYXBhY2l0eSA9CisJCURJVl9ST1VORF9DTE9TRVNUKG5zLT5jb21wdXRlX2NhcGFjaXR5LCBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSk7CisJbnMtPmhhc19mcmVlX2NhcGFjaXR5ID0gKG5zLT5ucl9ydW5uaW5nIDwgbnMtPnRhc2tfY2FwYWNpdHkpOwogfQogCiBzdHJ1Y3QgdGFza19udW1hX2VudiB7CkBAIC0xMTk1LDggKzExOTYsOCBAQAogCiAJaWYgKCFjdXIpIHsKIAkJLyogSXMgdGhlcmUgY2FwYWNpdHkgYXQgb3VyIGRlc3RpbmF0aW9uPyAqLwotCQlpZiAoZW52LT5zcmNfc3RhdHMuaGFzX2NhcGFjaXR5ICYmCi0JCSAgICAhZW52LT5kc3Rfc3RhdHMuaGFzX2NhcGFjaXR5KQorCQlpZiAoZW52LT5zcmNfc3RhdHMuaGFzX2ZyZWVfY2FwYWNpdHkgJiYKKwkJICAgICFlbnYtPmRzdF9zdGF0cy5oYXNfZnJlZV9jYXBhY2l0eSkKIAkJCWdvdG8gdW5sb2NrOwogCiAJCWdvdG8gYmFsYW5jZTsKQEAgLTEyMTMsNyArMTIxNCw3IEBACiAJb3JpZ19kc3RfbG9hZCA9IGVudi0+ZHN0X3N0YXRzLmxvYWQ7CiAJb3JpZ19zcmNfbG9hZCA9IGVudi0+c3JjX3N0YXRzLmxvYWQ7CiAKLQkvKiBYWFggbWlzc2luZyBwb3dlciB0ZXJtcyAqLworCS8qIFhYWCBtaXNzaW5nIGNhcGFjaXR5IHRlcm1zICovCiAJbG9hZCA9IHRhc2tfaF9sb2FkKGVudi0+cCk7CiAJZHN0X2xvYWQgPSBvcmlnX2RzdF9sb2FkICsgbG9hZDsKIAlzcmNfbG9hZCA9IG9yaWdfc3JjX2xvYWQgLSBsb2FkOwpAQCAtMTMwMSw4ICsxMzAyLDggQEAKIAlncm91cGltcCA9IGdyb3VwX3dlaWdodChwLCBlbnYuZHN0X25pZCkgLSBncm91cHdlaWdodDsKIAl1cGRhdGVfbnVtYV9zdGF0cygmZW52LmRzdF9zdGF0cywgZW52LmRzdF9uaWQpOwogCi0JLyogSWYgdGhlIHByZWZlcnJlZCBuaWQgaGFzIGNhcGFjaXR5LCB0cnkgdG8gdXNlIGl0LiAqLwotCWlmIChlbnYuZHN0X3N0YXRzLmhhc19jYXBhY2l0eSkKKwkvKiBJZiB0aGUgcHJlZmVycmVkIG5pZCBoYXMgZnJlZSBjYXBhY2l0eSwgdHJ5IHRvIHVzZSBpdC4gKi8KKwlpZiAoZW52LmRzdF9zdGF0cy5oYXNfZnJlZV9jYXBhY2l0eSkKIAkJdGFza19udW1hX2ZpbmRfY3B1KCZlbnYsIHRhc2tpbXAsIGdyb3VwaW1wKTsKIAogCS8qIE5vIHNwYWNlIGF2YWlsYWJsZSBvbiB0aGUgcHJlZmVycmVkIG5pZC4gTG9vayBlbHNld2hlcmUuICovCkBAIC0zMjI1LDEwICszMjI2LDEyIEBACiAJICogaGFzIG5vdCB0cnVseSBleHBpcmVkLgogCSAqCiAJICogRm9ydHVuYXRlbHkgd2UgY2FuIGNoZWNrIGRldGVybWluZSB3aGV0aGVyIHRoaXMgdGhlIGNhc2UgYnkgY2hlY2tpbmcKLQkgKiB3aGV0aGVyIHRoZSBnbG9iYWwgZGVhZGxpbmUgaGFzIGFkdmFuY2VkLgorCSAqIHdoZXRoZXIgdGhlIGdsb2JhbCBkZWFkbGluZSBoYXMgYWR2YW5jZWQuIEl0IGlzIHZhbGlkIHRvIGNvbXBhcmUKKwkgKiBjZnNfYi0+cnVudGltZV9leHBpcmVzIHdpdGhvdXQgYW55IGxvY2tzIHNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dAorCSAqIGV4YWN0IGVxdWFsaXR5LCBzbyBhIHBhcnRpYWwgd3JpdGUgd2lsbCBzdGlsbCB3b3JrLgogCSAqLwogCi0JaWYgKChzNjQpKGNmc19ycS0+cnVudGltZV9leHBpcmVzIC0gY2ZzX2ItPnJ1bnRpbWVfZXhwaXJlcykgPj0gMCkgeworCWlmIChjZnNfcnEtPnJ1bnRpbWVfZXhwaXJlcyAhPSBjZnNfYi0+cnVudGltZV9leHBpcmVzKSB7CiAJCS8qIGV4dGVuZCBsb2NhbCBkZWFkbGluZSwgZHJpZnQgaXMgYm91bmRlZCBhYm92ZSBieSAyIHRpY2tzICovCiAJCWNmc19ycS0+cnVudGltZV9leHBpcmVzICs9IFRJQ0tfTlNFQzsKIAl9IGVsc2UgewpAQCAtMzQ1NywyMSArMzQ2MCwyMSBAQAogc3RhdGljIGludCBkb19zY2hlZF9jZnNfcGVyaW9kX3RpbWVyKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiwgaW50IG92ZXJydW4pCiB7CiAJdTY0IHJ1bnRpbWUsIHJ1bnRpbWVfZXhwaXJlczsKLQlpbnQgaWRsZSA9IDEsIHRocm90dGxlZDsKKwlpbnQgdGhyb3R0bGVkOwogCi0JcmF3X3NwaW5fbG9jaygmY2ZzX2ItPmxvY2spOwogCS8qIG5vIG5lZWQgdG8gY29udGludWUgdGhlIHRpbWVyIHdpdGggbm8gYmFuZHdpZHRoIGNvbnN0cmFpbnQgKi8KIAlpZiAoY2ZzX2ItPnF1b3RhID09IFJVTlRJTUVfSU5GKQotCQlnb3RvIG91dF91bmxvY2s7CisJCWdvdG8gb3V0X2RlYWN0aXZhdGU7CiAKIAl0aHJvdHRsZWQgPSAhbGlzdF9lbXB0eSgmY2ZzX2ItPnRocm90dGxlZF9jZnNfcnEpOwotCS8qIGlkbGUgZGVwZW5kcyBvbiAhdGhyb3R0bGVkIChmb3IgdGhlIGNhc2Ugb2YgYSBsYXJnZSBkZWZpY2l0KSAqLwotCWlkbGUgPSBjZnNfYi0+aWRsZSAmJiAhdGhyb3R0bGVkOwogCWNmc19iLT5ucl9wZXJpb2RzICs9IG92ZXJydW47CiAKLQkvKiBpZiB3ZSdyZSBnb2luZyBpbmFjdGl2ZSB0aGVuIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgZGVmZXJyZWQgKi8KLQlpZiAoaWRsZSkKLQkJZ290byBvdXRfdW5sb2NrOworCS8qCisJICogaWRsZSBkZXBlbmRzIG9uICF0aHJvdHRsZWQgKGZvciB0aGUgY2FzZSBvZiBhIGxhcmdlIGRlZmljaXQpLCBhbmQgaWYKKwkgKiB3ZSdyZSBnb2luZyBpbmFjdGl2ZSB0aGVuIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgZGVmZXJyZWQKKwkgKi8KKwlpZiAoY2ZzX2ItPmlkbGUgJiYgIXRocm90dGxlZCkKKwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKIAogCS8qCiAJICogaWYgd2UgaGF2ZSByZWxvb3BlZCBhZnRlciByZXR1cm5pbmcgaWRsZSBvbmNlLCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIKQEAgLTM0ODUsNyArMzQ4OCw3IEBACiAJaWYgKCF0aHJvdHRsZWQpIHsKIAkJLyogbWFyayBhcyBwb3RlbnRpYWxseSBpZGxlIGZvciB0aGUgdXBjb21pbmcgcGVyaW9kICovCiAJCWNmc19iLT5pZGxlID0gMTsKLQkJZ290byBvdXRfdW5sb2NrOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBhY2NvdW50IHByZWNlZGluZyBwZXJpb2RzIGluIHdoaWNoIHRocm90dGxpbmcgb2NjdXJyZWQgKi8KQEAgLTM1MjUsMTIgKzM1MjgsMTIgQEAKIAkgKiB0aW1lciB0byByZW1haW4gYWN0aXZlIHdoaWxlIHRoZXJlIGFyZSBhbnkgdGhyb3R0bGVkIGVudGl0aWVzLikKIAkgKi8KIAljZnNfYi0+aWRsZSA9IDA7Ci1vdXRfdW5sb2NrOgotCWlmIChpZGxlKQotCQljZnNfYi0+dGltZXJfYWN0aXZlID0gMDsKLQlyYXdfc3Bpbl91bmxvY2soJmNmc19iLT5sb2NrKTsKIAotCXJldHVybiBpZGxlOworCXJldHVybiAwOworCitvdXRfZGVhY3RpdmF0ZToKKwljZnNfYi0+dGltZXJfYWN0aXZlID0gMDsKKwlyZXR1cm4gMTsKIH0KIAogLyogYSBjZnNfcnEgd29uJ3QgZG9uYXRlIHF1b3RhIGJlbG93IHRoaXMgYW1vdW50ICovCkBAIC0zNzA3LDYgKzM3MTAsNyBAQAogCWludCBvdmVycnVuOwogCWludCBpZGxlID0gMDsKIAorCXJhd19zcGluX2xvY2soJmNmc19iLT5sb2NrKTsKIAlmb3IgKDs7KSB7CiAJCW5vdyA9IGhydGltZXJfY2JfZ2V0X3RpbWUodGltZXIpOwogCQlvdmVycnVuID0gaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCBub3csIGNmc19iLT5wZXJpb2QpOwpAQCAtMzcxNiw2ICszNzIwLDcgQEAKIAogCQlpZGxlID0gZG9fc2NoZWRfY2ZzX3BlcmlvZF90aW1lcihjZnNfYiwgb3ZlcnJ1bik7CiAJfQorCXJhd19zcGluX3VubG9jaygmY2ZzX2ItPmxvY2spOwogCiAJcmV0dXJuIGlkbGUgPyBIUlRJTUVSX05PUkVTVEFSVCA6IEhSVElNRVJfUkVTVEFSVDsKIH0KQEAgLTM3NzUsOCArMzc4MCw2IEBACiAJc3RydWN0IGNmc19ycSAqY2ZzX3JxOwogCiAJZm9yX2VhY2hfbGVhZl9jZnNfcnEocnEsIGNmc19ycSkgewotCQlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IgPSB0Z19jZnNfYmFuZHdpZHRoKGNmc19ycS0+dGcpOwotCiAJCWlmICghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQpCiAJCQljb250aW51ZTsKIApAQCAtMzc4NCw3ICszNzg3LDcgQEAKIAkJICogY2xvY2tfdGFzayBpcyBub3QgYWR2YW5jaW5nIHNvIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUKIAkJICogdGhlcmUncyBzb21lIHZhbGlkIHF1b3RhIGFtb3VudAogCQkgKi8KLQkJY2ZzX3JxLT5ydW50aW1lX3JlbWFpbmluZyA9IGNmc19iLT5xdW90YTsKKwkJY2ZzX3JxLT5ydW50aW1lX3JlbWFpbmluZyA9IDE7CiAJCWlmIChjZnNfcnFfdGhyb3R0bGVkKGNmc19ycSkpCiAJCQl1bnRocm90dGxlX2Nmc19ycShjZnNfcnEpOwogCX0KQEAgLTQwNDEsOSArNDA0NCw5IEBACiAJcmV0dXJuIG1heChycS0+Y3B1X2xvYWRbdHlwZS0xXSwgdG90YWwpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcl9vZihpbnQgY3B1KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FwYWNpdHlfb2YoaW50IGNwdSkKIHsKLQlyZXR1cm4gY3B1X3JxKGNwdSktPmNwdV9wb3dlcjsKKwlyZXR1cm4gY3B1X3JxKGNwdSktPmNwdV9jYXBhY2l0eTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2F2Z19sb2FkX3Blcl90YXNrKGludCBjcHUpCkBAIC00MDY1LDcgKzQwNjgsNyBAQAogCSAqIGFib3V0IHRoZSBib3VuZGFyeSwgcmVhbGx5IGFjdGl2ZSB0YXNrIHdvbid0IGNhcmUKIAkgKiBhYm91dCB0aGUgbG9zcy4KIAkgKi8KLQlpZiAoamlmZmllcyA+IGN1cnJlbnQtPndha2VlX2ZsaXBfZGVjYXlfdHMgKyBIWikgeworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGN1cnJlbnQtPndha2VlX2ZsaXBfZGVjYXlfdHMgKyBIWikpIHsKIAkJY3VycmVudC0+d2FrZWVfZmxpcHMgPj49IDE7CiAJCWN1cnJlbnQtPndha2VlX2ZsaXBfZGVjYXlfdHMgPSBqaWZmaWVzOwogCX0KQEAgLTQyODYsMTIgKzQyODksMTIgQEAKIAkJczY0IHRoaXNfZWZmX2xvYWQsIHByZXZfZWZmX2xvYWQ7CiAKIAkJdGhpc19lZmZfbG9hZCA9IDEwMDsKLQkJdGhpc19lZmZfbG9hZCAqPSBwb3dlcl9vZihwcmV2X2NwdSk7CisJCXRoaXNfZWZmX2xvYWQgKj0gY2FwYWNpdHlfb2YocHJldl9jcHUpOwogCQl0aGlzX2VmZl9sb2FkICo9IHRoaXNfbG9hZCArCiAJCQllZmZlY3RpdmVfbG9hZCh0ZywgdGhpc19jcHUsIHdlaWdodCwgd2VpZ2h0KTsKIAogCQlwcmV2X2VmZl9sb2FkID0gMTAwICsgKHNkLT5pbWJhbGFuY2VfcGN0IC0gMTAwKSAvIDI7Ci0JCXByZXZfZWZmX2xvYWQgKj0gcG93ZXJfb2YodGhpc19jcHUpOworCQlwcmV2X2VmZl9sb2FkICo9IGNhcGFjaXR5X29mKHRoaXNfY3B1KTsKIAkJcHJldl9lZmZfbG9hZCAqPSBsb2FkICsgZWZmZWN0aXZlX2xvYWQodGcsIHByZXZfY3B1LCAwLCB3ZWlnaHQpOwogCiAJCWJhbGFuY2VkID0gdGhpc19lZmZfbG9hZCA8PSBwcmV2X2VmZl9sb2FkOwpAQCAtNDM2Nyw4ICs0MzcwLDggQEAKIAkJCWF2Z19sb2FkICs9IGxvYWQ7CiAJCX0KIAotCQkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIHBvd2VyIG9mIHRoZSBncm91cCAqLwotCQlhdmdfbG9hZCA9IChhdmdfbG9hZCAqIFNDSEVEX1BPV0VSX1NDQUxFKSAvIGdyb3VwLT5zZ3AtPnBvd2VyOworCQkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIGNhcGFjaXR5IG9mIHRoZSBncm91cCAqLworCQlhdmdfbG9hZCA9IChhdmdfbG9hZCAqIFNDSEVEX0NBUEFDSVRZX1NDQUxFKSAvIGdyb3VwLT5zZ2MtPmNhcGFjaXR5OwogCiAJCWlmIChsb2NhbF9ncm91cCkgewogCQkJdGhpc19sb2FkID0gYXZnX2xvYWQ7CkBAIC00OTQ4LDE0ICs0OTUxLDE0IEBACiAgKgogICogICBXJ19pLG4gPSAoMl5uIC0gMSkgLyAyXm4gKiBXX2ksbiArIDEgLyAyXm4gKiBXX2ksMCAgICAgICAgICAgICAgICgzKQogICoKLSAqIFBfaSBpcyB0aGUgY3B1IHBvd2VyIChvciBjb21wdXRlIGNhcGFjaXR5KSBvZiBjcHUgaSwgdHlwaWNhbGx5IGl0IGlzIHRoZQorICogQ19pIGlzIHRoZSBjb21wdXRlIGNhcGFjaXR5IG9mIGNwdSBpLCB0eXBpY2FsbHkgaXQgaXMgdGhlCiAgKiBmcmFjdGlvbiBvZiAncmVjZW50JyB0aW1lIGF2YWlsYWJsZSBmb3IgU0NIRURfT1RIRVIgdGFzayBleGVjdXRpb24uIEJ1dCBpdAogICogY2FuIGFsc28gaW5jbHVkZSBvdGhlciBmYWN0b3JzIFtYWFhdLgogICoKICAqIFRvIGFjaGlldmUgdGhpcyBiYWxhbmNlIHdlIGRlZmluZSBhIG1lYXN1cmUgb2YgaW1iYWxhbmNlIHdoaWNoIGZvbGxvd3MKICAqIGRpcmVjdGx5IGZyb20gKDEpOgogICoKLSAqICAgaW1iX2ksaiA9IG1heHsgYXZnKFcvUCksIFdfaS9QX2kgfSAtIG1pbnsgYXZnKFcvUCksIFdfai9QX2ogfSAgICAoNCkKKyAqICAgaW1iX2ksaiA9IG1heHsgYXZnKFcvQyksIFdfaS9DX2kgfSAtIG1pbnsgYXZnKFcvQyksIFdfai9DX2ogfSAgICAoNCkKICAqCiAgKiBXZSB0aGVtIG1vdmUgdGFza3MgYXJvdW5kIHRvIG1pbmltaXplIHRoZSBpbWJhbGFuY2UuIEluIHRoZSBjb250aW51b3VzCiAgKiBmdW5jdGlvbiBzcGFjZSBpdCBpcyBvYnZpb3VzIHRoaXMgY29udmVyZ2VzLCBpbiB0aGUgZGlzY3JldGUgY2FzZSB3ZSBnZXQKQEAgLTU1MzAsMTMgKzU1MzMsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGdyb3VwX2xvYWQ7IC8qIFRvdGFsIGxvYWQgb3ZlciB0aGUgQ1BVcyBvZiB0aGUgZ3JvdXAgKi8KIAl1bnNpZ25lZCBsb25nIHN1bV93ZWlnaHRlZF9sb2FkOyAvKiBXZWlnaHRlZCBsb2FkIG9mIGdyb3VwJ3MgdGFza3MgKi8KIAl1bnNpZ25lZCBsb25nIGxvYWRfcGVyX3Rhc2s7Ci0JdW5zaWduZWQgbG9uZyBncm91cF9wb3dlcjsKKwl1bnNpZ25lZCBsb25nIGdyb3VwX2NhcGFjaXR5OwogCXVuc2lnbmVkIGludCBzdW1fbnJfcnVubmluZzsgLyogTnIgdGFza3MgcnVubmluZyBpbiB0aGUgZ3JvdXAgKi8KLQl1bnNpZ25lZCBpbnQgZ3JvdXBfY2FwYWNpdHk7CisJdW5zaWduZWQgaW50IGdyb3VwX2NhcGFjaXR5X2ZhY3RvcjsKIAl1bnNpZ25lZCBpbnQgaWRsZV9jcHVzOwogCXVuc2lnbmVkIGludCBncm91cF93ZWlnaHQ7CiAJaW50IGdyb3VwX2ltYjsgLyogSXMgdGhlcmUgYW4gaW1iYWxhbmNlIGluIHRoZSBncm91cCA/ICovCi0JaW50IGdyb3VwX2hhc19jYXBhY2l0eTsgLyogSXMgdGhlcmUgZXh0cmEgY2FwYWNpdHkgaW4gdGhlIGdyb3VwPyAqLworCWludCBncm91cF9oYXNfZnJlZV9jYXBhY2l0eTsKICNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkcKIAl1bnNpZ25lZCBpbnQgbnJfbnVtYV9ydW5uaW5nOwogCXVuc2lnbmVkIGludCBucl9wcmVmZXJyZWRfcnVubmluZzsKQEAgLTU1NTEsNyArNTU1NCw3IEBACiAJc3RydWN0IHNjaGVkX2dyb3VwICpidXNpZXN0OwkvKiBCdXNpZXN0IGdyb3VwIGluIHRoaXMgc2QgKi8KIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmxvY2FsOwkvKiBMb2NhbCBncm91cCBpbiB0aGlzIHNkICovCiAJdW5zaWduZWQgbG9uZyB0b3RhbF9sb2FkOwkvKiBUb3RhbCBsb2FkIG9mIGFsbCBncm91cHMgaW4gc2QgKi8KLQl1bnNpZ25lZCBsb25nIHRvdGFsX3B3cjsJLyogVG90YWwgcG93ZXIgb2YgYWxsIGdyb3VwcyBpbiBzZCAqLworCXVuc2lnbmVkIGxvbmcgdG90YWxfY2FwYWNpdHk7CS8qIFRvdGFsIGNhcGFjaXR5IG9mIGFsbCBncm91cHMgaW4gc2QgKi8KIAl1bnNpZ25lZCBsb25nIGF2Z19sb2FkOwkvKiBBdmVyYWdlIGxvYWQgYWNyb3NzIGFsbCBncm91cHMgaW4gc2QgKi8KIAogCXN0cnVjdCBzZ19sYl9zdGF0cyBidXNpZXN0X3N0YXQ7LyogU3RhdGlzdGljcyBvZiB0aGUgYnVzaWVzdCBncm91cCAqLwpAQCAtNTU3MCw3ICs1NTczLDcgQEAKIAkJLmJ1c2llc3QgPSBOVUxMLAogCQkubG9jYWwgPSBOVUxMLAogCQkudG90YWxfbG9hZCA9IDBVTCwKLQkJLnRvdGFsX3B3ciA9IDBVTCwKKwkJLnRvdGFsX2NhcGFjaXR5ID0gMFVMLAogCQkuYnVzaWVzdF9zdGF0ID0gewogCQkJLmF2Z19sb2FkID0gMFVMLAogCQl9LApAQCAtNTYwNSwxNyArNTYwOCwxNyBAQAogCXJldHVybiBsb2FkX2lkeDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zY2FsZV9mcmVxX3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zY2FsZV9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKLQlyZXR1cm4gU0NIRURfUE9XRVJfU0NBTEU7CisJcmV0dXJuIFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogfQogCi11bnNpZ25lZCBsb25nIF9fd2VhayBhcmNoX3NjYWxlX2ZyZXFfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit1bnNpZ25lZCBsb25nIF9fd2VhayBhcmNoX3NjYWxlX2ZyZXFfY2FwYWNpdHkoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7Ci0JcmV0dXJuIGRlZmF1bHRfc2NhbGVfZnJlcV9wb3dlcihzZCwgY3B1KTsKKwlyZXR1cm4gZGVmYXVsdF9zY2FsZV9jYXBhY2l0eShzZCwgY3B1KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zY2FsZV9zbXRfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3NjYWxlX3NtdF9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIHdlaWdodCA9IHNkLT5zcGFuX3dlaWdodDsKIAl1bnNpZ25lZCBsb25nIHNtdF9nYWluID0gc2QtPnNtdF9nYWluOwpAQCAtNTYyNSwxMiArNTYyOCwxMiBAQAogCXJldHVybiBzbXRfZ2FpbjsKIH0KIAotdW5zaWduZWQgbG9uZyBfX3dlYWsgYXJjaF9zY2FsZV9zbXRfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit1bnNpZ25lZCBsb25nIF9fd2VhayBhcmNoX3NjYWxlX3NtdF9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKLQlyZXR1cm4gZGVmYXVsdF9zY2FsZV9zbXRfcG93ZXIoc2QsIGNwdSk7CisJcmV0dXJuIGRlZmF1bHRfc2NhbGVfc210X2NhcGFjaXR5KHNkLCBjcHUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzY2FsZV9ydF9wb3dlcihpbnQgY3B1KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NhbGVfcnRfY2FwYWNpdHkoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CiAJdTY0IHRvdGFsLCBhdmFpbGFibGUsIGFnZV9zdGFtcCwgYXZnOwpAQCAtNTY1MCw3MSArNTY1Myw3MSBAQAogCXRvdGFsID0gc2NoZWRfYXZnX3BlcmlvZCgpICsgZGVsdGE7CiAKIAlpZiAodW5saWtlbHkodG90YWwgPCBhdmcpKSB7Ci0JCS8qIEVuc3VyZXMgdGhhdCBwb3dlciB3b24ndCBlbmQgdXAgYmVpbmcgbmVnYXRpdmUgKi8KKwkJLyogRW5zdXJlcyB0aGF0IGNhcGFjaXR5IHdvbid0IGVuZCB1cCBiZWluZyBuZWdhdGl2ZSAqLwogCQlhdmFpbGFibGUgPSAwOwogCX0gZWxzZSB7CiAJCWF2YWlsYWJsZSA9IHRvdGFsIC0gYXZnOwogCX0KIAotCWlmICh1bmxpa2VseSgoczY0KXRvdGFsIDwgU0NIRURfUE9XRVJfU0NBTEUpKQotCQl0b3RhbCA9IFNDSEVEX1BPV0VSX1NDQUxFOworCWlmICh1bmxpa2VseSgoczY0KXRvdGFsIDwgU0NIRURfQ0FQQUNJVFlfU0NBTEUpKQorCQl0b3RhbCA9IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCi0JdG90YWwgPj49IFNDSEVEX1BPV0VSX1NISUZUOworCXRvdGFsID4+PSBTQ0hFRF9DQVBBQ0lUWV9TSElGVDsKIAogCXJldHVybiBkaXZfdTY0KGF2YWlsYWJsZSwgdG90YWwpOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3B1X3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIHdlaWdodCA9IHNkLT5zcGFuX3dlaWdodDsKLQl1bnNpZ25lZCBsb25nIHBvd2VyID0gU0NIRURfUE9XRVJfU0NBTEU7CisJdW5zaWduZWQgbG9uZyBjYXBhY2l0eSA9IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCXN0cnVjdCBzY2hlZF9ncm91cCAqc2RnID0gc2QtPmdyb3VwczsKIAotCWlmICgoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpICYmIHdlaWdodCA+IDEpIHsKLQkJaWYgKHNjaGVkX2ZlYXQoQVJDSF9QT1dFUikpCi0JCQlwb3dlciAqPSBhcmNoX3NjYWxlX3NtdF9wb3dlcihzZCwgY3B1KTsKKwlpZiAoKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVUNBUEFDSVRZKSAmJiB3ZWlnaHQgPiAxKSB7CisJCWlmIChzY2hlZF9mZWF0KEFSQ0hfQ0FQQUNJVFkpKQorCQkJY2FwYWNpdHkgKj0gYXJjaF9zY2FsZV9zbXRfY2FwYWNpdHkoc2QsIGNwdSk7CiAJCWVsc2UKLQkJCXBvd2VyICo9IGRlZmF1bHRfc2NhbGVfc210X3Bvd2VyKHNkLCBjcHUpOworCQkJY2FwYWNpdHkgKj0gZGVmYXVsdF9zY2FsZV9zbXRfY2FwYWNpdHkoc2QsIGNwdSk7CiAKLQkJcG93ZXIgPj49IFNDSEVEX1BPV0VSX1NISUZUOworCQljYXBhY2l0eSA+Pj0gU0NIRURfQ0FQQUNJVFlfU0hJRlQ7CiAJfQogCi0Jc2RnLT5zZ3AtPnBvd2VyX29yaWcgPSBwb3dlcjsKKwlzZGctPnNnYy0+Y2FwYWNpdHlfb3JpZyA9IGNhcGFjaXR5OwogCi0JaWYgKHNjaGVkX2ZlYXQoQVJDSF9QT1dFUikpCi0JCXBvd2VyICo9IGFyY2hfc2NhbGVfZnJlcV9wb3dlcihzZCwgY3B1KTsKKwlpZiAoc2NoZWRfZmVhdChBUkNIX0NBUEFDSVRZKSkKKwkJY2FwYWNpdHkgKj0gYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5KHNkLCBjcHUpOwogCWVsc2UKLQkJcG93ZXIgKj0gZGVmYXVsdF9zY2FsZV9mcmVxX3Bvd2VyKHNkLCBjcHUpOworCQljYXBhY2l0eSAqPSBkZWZhdWx0X3NjYWxlX2NhcGFjaXR5KHNkLCBjcHUpOwogCi0JcG93ZXIgPj49IFNDSEVEX1BPV0VSX1NISUZUOworCWNhcGFjaXR5ID4+PSBTQ0hFRF9DQVBBQ0lUWV9TSElGVDsKIAotCXBvd2VyICo9IHNjYWxlX3J0X3Bvd2VyKGNwdSk7Ci0JcG93ZXIgPj49IFNDSEVEX1BPV0VSX1NISUZUOworCWNhcGFjaXR5ICo9IHNjYWxlX3J0X2NhcGFjaXR5KGNwdSk7CisJY2FwYWNpdHkgPj49IFNDSEVEX0NBUEFDSVRZX1NISUZUOwogCi0JaWYgKCFwb3dlcikKLQkJcG93ZXIgPSAxOworCWlmICghY2FwYWNpdHkpCisJCWNhcGFjaXR5ID0gMTsKIAotCWNwdV9ycShjcHUpLT5jcHVfcG93ZXIgPSBwb3dlcjsKLQlzZGctPnNncC0+cG93ZXIgPSBwb3dlcjsKKwljcHVfcnEoY3B1KS0+Y3B1X2NhcGFjaXR5ID0gY2FwYWNpdHk7CisJc2RnLT5zZ2MtPmNhcGFjaXR5ID0gY2FwYWNpdHk7CiB9CiAKLXZvaWQgdXBkYXRlX2dyb3VwX3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQordm9pZCB1cGRhdGVfZ3JvdXBfY2FwYWNpdHkoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQgPSBzZC0+Y2hpbGQ7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCwgKnNkZyA9IHNkLT5ncm91cHM7Ci0JdW5zaWduZWQgbG9uZyBwb3dlciwgcG93ZXJfb3JpZzsKKwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCBjYXBhY2l0eV9vcmlnOwogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CiAKIAlpbnRlcnZhbCA9IG1zZWNzX3RvX2ppZmZpZXMoc2QtPmJhbGFuY2VfaW50ZXJ2YWwpOwogCWludGVydmFsID0gY2xhbXAoaW50ZXJ2YWwsIDFVTCwgbWF4X2xvYWRfYmFsYW5jZV9pbnRlcnZhbCk7Ci0Jc2RnLT5zZ3AtPm5leHRfdXBkYXRlID0gamlmZmllcyArIGludGVydmFsOworCXNkZy0+c2djLT5uZXh0X3VwZGF0ZSA9IGppZmZpZXMgKyBpbnRlcnZhbDsKIAogCWlmICghY2hpbGQpIHsKLQkJdXBkYXRlX2NwdV9wb3dlcihzZCwgY3B1KTsKKwkJdXBkYXRlX2NwdV9jYXBhY2l0eShzZCwgY3B1KTsKIAkJcmV0dXJuOwogCX0KIAotCXBvd2VyX29yaWcgPSBwb3dlciA9IDA7CisJY2FwYWNpdHlfb3JpZyA9IGNhcGFjaXR5ID0gMDsKIAogCWlmIChjaGlsZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CiAJCS8qCkBAIC01NzIzLDMxICs1NzI2LDMxIEBACiAJCSAqLwogCiAJCWZvcl9lYWNoX2NwdShjcHUsIHNjaGVkX2dyb3VwX2NwdXMoc2RnKSkgewotCQkJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3A7CisJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgKnNnYzsKIAkJCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKIAogCQkJLyoKLQkJCSAqIGJ1aWxkX3NjaGVkX2RvbWFpbnMoKSAtPiBpbml0X3NjaGVkX2dyb3Vwc19wb3dlcigpCisJCQkgKiBidWlsZF9zY2hlZF9kb21haW5zKCkgLT4gaW5pdF9zY2hlZF9ncm91cHNfY2FwYWNpdHkoKQogCQkJICogZ2V0cyBoZXJlIGJlZm9yZSB3ZSd2ZSBhdHRhY2hlZCB0aGUgZG9tYWlucyB0byB0aGUKIAkJCSAqIHJ1bnF1ZXVlcy4KIAkJCSAqCi0JCQkgKiBVc2UgcG93ZXJfb2YoKSwgd2hpY2ggaXMgc2V0IGlycmVzcGVjdGl2ZSBvZiBkb21haW5zCi0JCQkgKiBpbiB1cGRhdGVfY3B1X3Bvd2VyKCkuCisJCQkgKiBVc2UgY2FwYWNpdHlfb2YoKSwgd2hpY2ggaXMgc2V0IGlycmVzcGVjdGl2ZSBvZiBkb21haW5zCisJCQkgKiBpbiB1cGRhdGVfY3B1X2NhcGFjaXR5KCkuCiAJCQkgKgotCQkJICogVGhpcyBhdm9pZHMgcG93ZXIvcG93ZXJfb3JpZyBmcm9tIGJlaW5nIDAgYW5kCisJCQkgKiBUaGlzIGF2b2lkcyBjYXBhY2l0eS9jYXBhY2l0eV9vcmlnIGZyb20gYmVpbmcgMCBhbmQKIAkJCSAqIGNhdXNpbmcgZGl2aWRlLWJ5LXplcm8gaXNzdWVzIG9uIGJvb3QuCiAJCQkgKgotCQkJICogUnVudGltZSB1cGRhdGVzIHdpbGwgY29ycmVjdCBwb3dlcl9vcmlnLgorCQkJICogUnVudGltZSB1cGRhdGVzIHdpbGwgY29ycmVjdCBjYXBhY2l0eV9vcmlnLgogCQkJICovCiAJCQlpZiAodW5saWtlbHkoIXJxLT5zZCkpIHsKLQkJCQlwb3dlcl9vcmlnICs9IHBvd2VyX29mKGNwdSk7Ci0JCQkJcG93ZXIgKz0gcG93ZXJfb2YoY3B1KTsKKwkJCQljYXBhY2l0eV9vcmlnICs9IGNhcGFjaXR5X29mKGNwdSk7CisJCQkJY2FwYWNpdHkgKz0gY2FwYWNpdHlfb2YoY3B1KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJc2dwID0gcnEtPnNkLT5ncm91cHMtPnNncDsKLQkJCXBvd2VyX29yaWcgKz0gc2dwLT5wb3dlcl9vcmlnOwotCQkJcG93ZXIgKz0gc2dwLT5wb3dlcjsKKwkJCXNnYyA9IHJxLT5zZC0+Z3JvdXBzLT5zZ2M7CisJCQljYXBhY2l0eV9vcmlnICs9IHNnYy0+Y2FwYWNpdHlfb3JpZzsKKwkJCWNhcGFjaXR5ICs9IHNnYy0+Y2FwYWNpdHk7CiAJCX0KIAl9IGVsc2UgIHsKIAkJLyoKQEAgLTU3NTcsMTQgKzU3NjAsMTQgQEAKIAogCQlncm91cCA9IGNoaWxkLT5ncm91cHM7CiAJCWRvIHsKLQkJCXBvd2VyX29yaWcgKz0gZ3JvdXAtPnNncC0+cG93ZXJfb3JpZzsKLQkJCXBvd2VyICs9IGdyb3VwLT5zZ3AtPnBvd2VyOworCQkJY2FwYWNpdHlfb3JpZyArPSBncm91cC0+c2djLT5jYXBhY2l0eV9vcmlnOworCQkJY2FwYWNpdHkgKz0gZ3JvdXAtPnNnYy0+Y2FwYWNpdHk7CiAJCQlncm91cCA9IGdyb3VwLT5uZXh0OwogCQl9IHdoaWxlIChncm91cCAhPSBjaGlsZC0+Z3JvdXBzKTsKIAl9CiAKLQlzZGctPnNncC0+cG93ZXJfb3JpZyA9IHBvd2VyX29yaWc7Ci0Jc2RnLT5zZ3AtPnBvd2VyID0gcG93ZXI7CisJc2RnLT5zZ2MtPmNhcGFjaXR5X29yaWcgPSBjYXBhY2l0eV9vcmlnOworCXNkZy0+c2djLT5jYXBhY2l0eSA9IGNhcGFjaXR5OwogfQogCiAvKgpAQCAtNTc3OCwxNSArNTc4MSwxNSBAQAogZml4X3NtYWxsX2NhcGFjaXR5KHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwKQogewogCS8qCi0JICogT25seSBzaWJsaW5ncyBjYW4gaGF2ZSBzaWduaWZpY2FudGx5IGxlc3MgdGhhbiBTQ0hFRF9QT1dFUl9TQ0FMRQorCSAqIE9ubHkgc2libGluZ3MgY2FuIGhhdmUgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gU0NIRURfQ0FQQUNJVFlfU0NBTEUKIAkgKi8KLQlpZiAoIShzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikpCisJaWYgKCEoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkpKQogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogSWYgfjkwJSBvZiB0aGUgY3B1X3Bvd2VyIGlzIHN0aWxsIHRoZXJlLCB3ZSdyZSBnb29kLgorCSAqIElmIH45MCUgb2YgdGhlIGNwdV9jYXBhY2l0eSBpcyBzdGlsbCB0aGVyZSwgd2UncmUgZ29vZC4KIAkgKi8KLQlpZiAoZ3JvdXAtPnNncC0+cG93ZXIgKiAzMiA+IGdyb3VwLT5zZ3AtPnBvd2VyX29yaWcgKiAyOSkKKwlpZiAoZ3JvdXAtPnNnYy0+Y2FwYWNpdHkgKiAzMiA+IGdyb3VwLT5zZ2MtPmNhcGFjaXR5X29yaWcgKiAyOSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTU4MjMsMzQgKzU4MjYsMzUgQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2dfaW1iYWxhbmNlZChzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwKQogewotCXJldHVybiBncm91cC0+c2dwLT5pbWJhbGFuY2U7CisJcmV0dXJuIGdyb3VwLT5zZ2MtPmltYmFsYW5jZTsKIH0KIAogLyoKLSAqIENvbXB1dGUgdGhlIGdyb3VwIGNhcGFjaXR5LgorICogQ29tcHV0ZSB0aGUgZ3JvdXAgY2FwYWNpdHkgZmFjdG9yLgogICoKLSAqIEF2b2lkIHRoZSBpc3N1ZSB3aGVyZSBOKmZyYWMoc210X3Bvd2VyKSA+PSAxIGNyZWF0ZXMgJ3BoYW50b20nIGNvcmVzIGJ5CisgKiBBdm9pZCB0aGUgaXNzdWUgd2hlcmUgTipmcmFjKHNtdF9jYXBhY2l0eSkgPj0gMSBjcmVhdGVzICdwaGFudG9tJyBjb3JlcyBieQogICogZmlyc3QgZGl2aWRpbmcgb3V0IHRoZSBzbXQgZmFjdG9yIGFuZCBjb21wdXRpbmcgdGhlIGFjdHVhbCBudW1iZXIgb2YgY29yZXMKLSAqIGFuZCBsaW1pdCBwb3dlciB1bml0IGNhcGFjaXR5IHdpdGggdGhhdC4KKyAqIGFuZCBsaW1pdCB1bml0IGNhcGFjaXR5IHdpdGggdGhhdC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgc2dfY2FwYWNpdHkoc3RydWN0IGxiX2VudiAqZW52LCBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwKQorc3RhdGljIGlubGluZSBpbnQgc2dfY2FwYWNpdHlfZmFjdG9yKHN0cnVjdCBsYl9lbnYgKmVudiwgc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCkKIHsKLQl1bnNpZ25lZCBpbnQgY2FwYWNpdHksIHNtdCwgY3B1czsKLQl1bnNpZ25lZCBpbnQgcG93ZXIsIHBvd2VyX29yaWc7CisJdW5zaWduZWQgaW50IGNhcGFjaXR5X2ZhY3Rvciwgc210LCBjcHVzOworCXVuc2lnbmVkIGludCBjYXBhY2l0eSwgY2FwYWNpdHlfb3JpZzsKIAotCXBvd2VyID0gZ3JvdXAtPnNncC0+cG93ZXI7Ci0JcG93ZXJfb3JpZyA9IGdyb3VwLT5zZ3AtPnBvd2VyX29yaWc7CisJY2FwYWNpdHkgPSBncm91cC0+c2djLT5jYXBhY2l0eTsKKwljYXBhY2l0eV9vcmlnID0gZ3JvdXAtPnNnYy0+Y2FwYWNpdHlfb3JpZzsKIAljcHVzID0gZ3JvdXAtPmdyb3VwX3dlaWdodDsKIAotCS8qIHNtdCA6PSBjZWlsKGNwdXMgLyBwb3dlciksIGFzc3VtZXM6IDEgPCBzbXRfcG93ZXIgPCAyICovCi0Jc210ID0gRElWX1JPVU5EX1VQKFNDSEVEX1BPV0VSX1NDQUxFICogY3B1cywgcG93ZXJfb3JpZyk7Ci0JY2FwYWNpdHkgPSBjcHVzIC8gc210OyAvKiBjb3JlcyAqLworCS8qIHNtdCA6PSBjZWlsKGNwdXMgLyBjYXBhY2l0eSksIGFzc3VtZXM6IDEgPCBzbXRfY2FwYWNpdHkgPCAyICovCisJc210ID0gRElWX1JPVU5EX1VQKFNDSEVEX0NBUEFDSVRZX1NDQUxFICogY3B1cywgY2FwYWNpdHlfb3JpZyk7CisJY2FwYWNpdHlfZmFjdG9yID0gY3B1cyAvIHNtdDsgLyogY29yZXMgKi8KIAotCWNhcGFjaXR5ID0gbWluX3QodW5zaWduZWQsIGNhcGFjaXR5LCBESVZfUk9VTkRfQ0xPU0VTVChwb3dlciwgU0NIRURfUE9XRVJfU0NBTEUpKTsKLQlpZiAoIWNhcGFjaXR5KQotCQljYXBhY2l0eSA9IGZpeF9zbWFsbF9jYXBhY2l0eShlbnYtPnNkLCBncm91cCk7CisJY2FwYWNpdHlfZmFjdG9yID0gbWluX3QodW5zaWduZWQsCisJCWNhcGFjaXR5X2ZhY3RvciwgRElWX1JPVU5EX0NMT1NFU1QoY2FwYWNpdHksIFNDSEVEX0NBUEFDSVRZX1NDQUxFKSk7CisJaWYgKCFjYXBhY2l0eV9mYWN0b3IpCisJCWNhcGFjaXR5X2ZhY3RvciA9IGZpeF9zbWFsbF9jYXBhY2l0eShlbnYtPnNkLCBncm91cCk7CiAKLQlyZXR1cm4gY2FwYWNpdHk7CisJcmV0dXJuIGNhcGFjaXR5X2ZhY3RvcjsKIH0KIAogLyoqCkBAIC01ODkwLDkgKzU4OTQsOSBAQAogCQkJc2dzLT5pZGxlX2NwdXMrKzsKIAl9CiAKLQkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIHBvd2VyIG9mIHRoZSBncm91cCAqLwotCXNncy0+Z3JvdXBfcG93ZXIgPSBncm91cC0+c2dwLT5wb3dlcjsKLQlzZ3MtPmF2Z19sb2FkID0gKHNncy0+Z3JvdXBfbG9hZCpTQ0hFRF9QT1dFUl9TQ0FMRSkgLyBzZ3MtPmdyb3VwX3Bvd2VyOworCS8qIEFkanVzdCBieSByZWxhdGl2ZSBDUFUgY2FwYWNpdHkgb2YgdGhlIGdyb3VwICovCisJc2dzLT5ncm91cF9jYXBhY2l0eSA9IGdyb3VwLT5zZ2MtPmNhcGFjaXR5OworCXNncy0+YXZnX2xvYWQgPSAoc2dzLT5ncm91cF9sb2FkKlNDSEVEX0NBUEFDSVRZX1NDQUxFKSAvIHNncy0+Z3JvdXBfY2FwYWNpdHk7CiAKIAlpZiAoc2dzLT5zdW1fbnJfcnVubmluZykKIAkJc2dzLT5sb2FkX3Blcl90YXNrID0gc2dzLT5zdW1fd2VpZ2h0ZWRfbG9hZCAvIHNncy0+c3VtX25yX3J1bm5pbmc7CkBAIC01OTAwLDEwICs1OTA0LDEwIEBACiAJc2dzLT5ncm91cF93ZWlnaHQgPSBncm91cC0+Z3JvdXBfd2VpZ2h0OwogCiAJc2dzLT5ncm91cF9pbWIgPSBzZ19pbWJhbGFuY2VkKGdyb3VwKTsKLQlzZ3MtPmdyb3VwX2NhcGFjaXR5ID0gc2dfY2FwYWNpdHkoZW52LCBncm91cCk7CisJc2dzLT5ncm91cF9jYXBhY2l0eV9mYWN0b3IgPSBzZ19jYXBhY2l0eV9mYWN0b3IoZW52LCBncm91cCk7CiAKLQlpZiAoc2dzLT5ncm91cF9jYXBhY2l0eSA+IHNncy0+c3VtX25yX3J1bm5pbmcpCi0JCXNncy0+Z3JvdXBfaGFzX2NhcGFjaXR5ID0gMTsKKwlpZiAoc2dzLT5ncm91cF9jYXBhY2l0eV9mYWN0b3IgPiBzZ3MtPnN1bV9ucl9ydW5uaW5nKQorCQlzZ3MtPmdyb3VwX2hhc19mcmVlX2NhcGFjaXR5ID0gMTsKIH0KIAogLyoqCkBAIC01OTI3LDcgKzU5MzEsNyBAQAogCWlmIChzZ3MtPmF2Z19sb2FkIDw9IHNkcy0+YnVzaWVzdF9zdGF0LmF2Z19sb2FkKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoc2dzLT5zdW1fbnJfcnVubmluZyA+IHNncy0+Z3JvdXBfY2FwYWNpdHkpCisJaWYgKHNncy0+c3VtX25yX3J1bm5pbmcgPiBzZ3MtPmdyb3VwX2NhcGFjaXR5X2ZhY3RvcikKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoc2dzLT5ncm91cF9pbWIpCkBAIC02MDA3LDggKzYwMTEsOCBAQAogCQkJc2dzID0gJnNkcy0+bG9jYWxfc3RhdDsKIAogCQkJaWYgKGVudi0+aWRsZSAhPSBDUFVfTkVXTFlfSURMRSB8fAotCQkJICAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc2ctPnNncC0+bmV4dF91cGRhdGUpKQotCQkJCXVwZGF0ZV9ncm91cF9wb3dlcihlbnYtPnNkLCBlbnYtPmRzdF9jcHUpOworCQkJICAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc2ctPnNnYy0+bmV4dF91cGRhdGUpKQorCQkJCXVwZGF0ZV9ncm91cF9jYXBhY2l0eShlbnYtPnNkLCBlbnYtPmRzdF9jcHUpOwogCQl9CiAKIAkJdXBkYXRlX3NnX2xiX3N0YXRzKGVudiwgc2csIGxvYWRfaWR4LCBsb2NhbF9ncm91cCwgc2dzKTsKQEAgLTYwMTgsMTcgKzYwMjIsMTcgQEAKIAogCQkvKgogCQkgKiBJbiBjYXNlIHRoZSBjaGlsZCBkb21haW4gcHJlZmVycyB0YXNrcyBnbyB0byBzaWJsaW5ncwotCQkgKiBmaXJzdCwgbG93ZXIgdGhlIHNnIGNhcGFjaXR5IHRvIG9uZSBzbyB0aGF0IHdlJ2xsIHRyeQorCQkgKiBmaXJzdCwgbG93ZXIgdGhlIHNnIGNhcGFjaXR5IGZhY3RvciB0byBvbmUgc28gdGhhdCB3ZSdsbCB0cnkKIAkJICogYW5kIG1vdmUgYWxsIHRoZSBleGNlc3MgdGFza3MgYXdheS4gV2UgbG93ZXIgdGhlIGNhcGFjaXR5CiAJCSAqIG9mIGEgZ3JvdXAgb25seSBpZiB0aGUgbG9jYWwgZ3JvdXAgaGFzIHRoZSBjYXBhY2l0eSB0byBmaXQKLQkJICogdGhlc2UgZXhjZXNzIHRhc2tzLCBpLmUuIG5yX3J1bm5pbmcgPCBncm91cF9jYXBhY2l0eS4gVGhlCisJCSAqIHRoZXNlIGV4Y2VzcyB0YXNrcywgaS5lLiBucl9ydW5uaW5nIDwgZ3JvdXBfY2FwYWNpdHlfZmFjdG9yLiBUaGUKIAkJICogZXh0cmEgY2hlY2sgcHJldmVudHMgdGhlIGNhc2Ugd2hlcmUgeW91IGFsd2F5cyBwdWxsIGZyb20gdGhlCiAJCSAqIGhlYXZpZXN0IGdyb3VwIHdoZW4gaXQgaXMgYWxyZWFkeSB1bmRlci11dGlsaXplZCAocG9zc2libGUKIAkJICogd2l0aCBhIGxhcmdlIHdlaWdodCB0YXNrIG91dHdlaWdocyB0aGUgdGFza3Mgb24gdGhlIHN5c3RlbSkuCiAJCSAqLwogCQlpZiAocHJlZmVyX3NpYmxpbmcgJiYgc2RzLT5sb2NhbCAmJgotCQkgICAgc2RzLT5sb2NhbF9zdGF0Lmdyb3VwX2hhc19jYXBhY2l0eSkKLQkJCXNncy0+Z3JvdXBfY2FwYWNpdHkgPSBtaW4oc2dzLT5ncm91cF9jYXBhY2l0eSwgMVUpOworCQkgICAgc2RzLT5sb2NhbF9zdGF0Lmdyb3VwX2hhc19mcmVlX2NhcGFjaXR5KQorCQkJc2dzLT5ncm91cF9jYXBhY2l0eV9mYWN0b3IgPSBtaW4oc2dzLT5ncm91cF9jYXBhY2l0eV9mYWN0b3IsIDFVKTsKIAogCQlpZiAodXBkYXRlX3NkX3BpY2tfYnVzaWVzdChlbnYsIHNkcywgc2csIHNncykpIHsKIAkJCXNkcy0+YnVzaWVzdCA9IHNnOwpAQCAtNjAzOCw3ICs2MDQyLDcgQEAKIG5leHRfZ3JvdXA6CiAJCS8qIE5vdywgc3RhcnQgdXBkYXRpbmcgc2RfbGJfc3RhdHMgKi8KIAkJc2RzLT50b3RhbF9sb2FkICs9IHNncy0+Z3JvdXBfbG9hZDsKLQkJc2RzLT50b3RhbF9wd3IgKz0gc2dzLT5ncm91cF9wb3dlcjsKKwkJc2RzLT50b3RhbF9jYXBhY2l0eSArPSBzZ3MtPmdyb3VwX2NhcGFjaXR5OwogCiAJCXNnID0gc2ctPm5leHQ7CiAJfSB3aGlsZSAoc2cgIT0gZW52LT5zZC0+Z3JvdXBzKTsKQEAgLTYwODUsOCArNjA4OSw4IEBACiAJCXJldHVybiAwOwogCiAJZW52LT5pbWJhbGFuY2UgPSBESVZfUk9VTkRfQ0xPU0VTVCgKLQkJc2RzLT5idXNpZXN0X3N0YXQuYXZnX2xvYWQgKiBzZHMtPmJ1c2llc3Rfc3RhdC5ncm91cF9wb3dlciwKLQkJU0NIRURfUE9XRVJfU0NBTEUpOworCQlzZHMtPmJ1c2llc3Rfc3RhdC5hdmdfbG9hZCAqIHNkcy0+YnVzaWVzdF9zdGF0Lmdyb3VwX2NhcGFjaXR5LAorCQlTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTYxMDEsNyArNjEwNSw3IEBACiBzdGF0aWMgaW5saW5lCiB2b2lkIGZpeF9zbWFsbF9pbWJhbGFuY2Uoc3RydWN0IGxiX2VudiAqZW52LCBzdHJ1Y3Qgc2RfbGJfc3RhdHMgKnNkcykKIHsKLQl1bnNpZ25lZCBsb25nIHRtcCwgcHdyX25vdyA9IDAsIHB3cl9tb3ZlID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcCwgY2FwYV9ub3cgPSAwLCBjYXBhX21vdmUgPSAwOwogCXVuc2lnbmVkIGludCBpbWJuID0gMjsKIAl1bnNpZ25lZCBsb25nIHNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2s7CiAJc3RydWN0IHNnX2xiX3N0YXRzICpsb2NhbCwgKmJ1c2llc3Q7CkBAIC02MTE1LDggKzYxMTksOCBAQAogCQlpbWJuID0gMTsKIAogCXNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgPQotCQkoYnVzaWVzdC0+bG9hZF9wZXJfdGFzayAqIFNDSEVEX1BPV0VSX1NDQUxFKSAvCi0JCWJ1c2llc3QtPmdyb3VwX3Bvd2VyOworCQkoYnVzaWVzdC0+bG9hZF9wZXJfdGFzayAqIFNDSEVEX0NBUEFDSVRZX1NDQUxFKSAvCisJCWJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5OwogCiAJaWYgKGJ1c2llc3QtPmF2Z19sb2FkICsgc2NhbGVkX2J1c3lfbG9hZF9wZXJfdGFzayA+PQogCSAgICBsb2NhbC0+YXZnX2xvYWQgKyAoc2NhbGVkX2J1c3lfbG9hZF9wZXJfdGFzayAqIGltYm4pKSB7CkBAIC02MTI2LDM4ICs2MTMwLDM4IEBACiAKIAkvKgogCSAqIE9LLCB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbWJhbGFuY2UgdG8ganVzdGlmeSBtb3ZpbmcgdGFza3MsCi0JICogaG93ZXZlciB3ZSBtYXkgYmUgYWJsZSB0byBpbmNyZWFzZSB0b3RhbCBDUFUgcG93ZXIgdXNlZCBieQorCSAqIGhvd2V2ZXIgd2UgbWF5IGJlIGFibGUgdG8gaW5jcmVhc2UgdG90YWwgQ1BVIGNhcGFjaXR5IHVzZWQgYnkKIAkgKiBtb3ZpbmcgdGhlbS4KIAkgKi8KIAotCXB3cl9ub3cgKz0gYnVzaWVzdC0+Z3JvdXBfcG93ZXIgKgorCWNhcGFfbm93ICs9IGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5ICoKIAkJCW1pbihidXNpZXN0LT5sb2FkX3Blcl90YXNrLCBidXNpZXN0LT5hdmdfbG9hZCk7Ci0JcHdyX25vdyArPSBsb2NhbC0+Z3JvdXBfcG93ZXIgKgorCWNhcGFfbm93ICs9IGxvY2FsLT5ncm91cF9jYXBhY2l0eSAqCiAJCQltaW4obG9jYWwtPmxvYWRfcGVyX3Rhc2ssIGxvY2FsLT5hdmdfbG9hZCk7Ci0JcHdyX25vdyAvPSBTQ0hFRF9QT1dFUl9TQ0FMRTsKKwljYXBhX25vdyAvPSBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKIAogCS8qIEFtb3VudCBvZiBsb2FkIHdlJ2Qgc3VidHJhY3QgKi8KIAlpZiAoYnVzaWVzdC0+YXZnX2xvYWQgPiBzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrKSB7Ci0JCXB3cl9tb3ZlICs9IGJ1c2llc3QtPmdyb3VwX3Bvd2VyICoKKwkJY2FwYV9tb3ZlICs9IGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5ICoKIAkJCSAgICBtaW4oYnVzaWVzdC0+bG9hZF9wZXJfdGFzaywKIAkJCQlidXNpZXN0LT5hdmdfbG9hZCAtIHNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2spOwogCX0KIAogCS8qIEFtb3VudCBvZiBsb2FkIHdlJ2QgYWRkICovCi0JaWYgKGJ1c2llc3QtPmF2Z19sb2FkICogYnVzaWVzdC0+Z3JvdXBfcG93ZXIgPAotCSAgICBidXNpZXN0LT5sb2FkX3Blcl90YXNrICogU0NIRURfUE9XRVJfU0NBTEUpIHsKLQkJdG1wID0gKGJ1c2llc3QtPmF2Z19sb2FkICogYnVzaWVzdC0+Z3JvdXBfcG93ZXIpIC8KLQkJICAgICAgbG9jYWwtPmdyb3VwX3Bvd2VyOworCWlmIChidXNpZXN0LT5hdmdfbG9hZCAqIGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5IDwKKwkgICAgYnVzaWVzdC0+bG9hZF9wZXJfdGFzayAqIFNDSEVEX0NBUEFDSVRZX1NDQUxFKSB7CisJCXRtcCA9IChidXNpZXN0LT5hdmdfbG9hZCAqIGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5KSAvCisJCSAgICAgIGxvY2FsLT5ncm91cF9jYXBhY2l0eTsKIAl9IGVsc2UgewotCQl0bXAgPSAoYnVzaWVzdC0+bG9hZF9wZXJfdGFzayAqIFNDSEVEX1BPV0VSX1NDQUxFKSAvCi0JCSAgICAgIGxvY2FsLT5ncm91cF9wb3dlcjsKKwkJdG1wID0gKGJ1c2llc3QtPmxvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSkgLworCQkgICAgICBsb2NhbC0+Z3JvdXBfY2FwYWNpdHk7CiAJfQotCXB3cl9tb3ZlICs9IGxvY2FsLT5ncm91cF9wb3dlciAqCisJY2FwYV9tb3ZlICs9IGxvY2FsLT5ncm91cF9jYXBhY2l0eSAqCiAJCSAgICBtaW4obG9jYWwtPmxvYWRfcGVyX3Rhc2ssIGxvY2FsLT5hdmdfbG9hZCArIHRtcCk7Ci0JcHdyX21vdmUgLz0gU0NIRURfUE9XRVJfU0NBTEU7CisJY2FwYV9tb3ZlIC89IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCiAJLyogTW92ZSBpZiB3ZSBnYWluIHRocm91Z2hwdXQgKi8KLQlpZiAocHdyX21vdmUgPiBwd3Jfbm93KQorCWlmIChjYXBhX21vdmUgPiBjYXBhX25vdykKIAkJZW52LT5pbWJhbGFuY2UgPSBidXNpZXN0LT5sb2FkX3Blcl90YXNrOwogfQogCkBAIC02MTg3LDcgKzYxOTEsNyBAQAogCS8qCiAJICogSW4gdGhlIHByZXNlbmNlIG9mIHNtcCBuaWNlIGJhbGFuY2luZywgY2VydGFpbiBzY2VuYXJpb3MgY2FuIGhhdmUKIAkgKiBtYXggbG9hZCBsZXNzIHRoYW4gYXZnIGxvYWQoYXMgd2Ugc2tpcCB0aGUgZ3JvdXBzIGF0IG9yIGJlbG93Ci0JICogaXRzIGNwdV9wb3dlciwgd2hpbGUgY2FsY3VsYXRpbmcgbWF4X2xvYWQuLikKKwkgKiBpdHMgY3B1X2NhcGFjaXR5LCB3aGlsZSBjYWxjdWxhdGluZyBtYXhfbG9hZC4uKQogCSAqLwogCWlmIChidXNpZXN0LT5hdmdfbG9hZCA8PSBzZHMtPmF2Z19sb2FkIHx8CiAJICAgIGxvY2FsLT5hdmdfbG9hZCA+PSBzZHMtPmF2Z19sb2FkKSB7CkBAIC02MjAyLDEwICs2MjA2LDEwIEBACiAJCSAqIGhhdmUgdG8gZHJvcCBiZWxvdyBjYXBhY2l0eSB0byByZWFjaCBjcHUtbG9hZCBlcXVpbGlicml1bS4KIAkJICovCiAJCWxvYWRfYWJvdmVfY2FwYWNpdHkgPQotCQkJKGJ1c2llc3QtPnN1bV9ucl9ydW5uaW5nIC0gYnVzaWVzdC0+Z3JvdXBfY2FwYWNpdHkpOworCQkJKGJ1c2llc3QtPnN1bV9ucl9ydW5uaW5nIC0gYnVzaWVzdC0+Z3JvdXBfY2FwYWNpdHlfZmFjdG9yKTsKIAotCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ICo9IChTQ0hFRF9MT0FEX1NDQUxFICogU0NIRURfUE9XRVJfU0NBTEUpOwotCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IGJ1c2llc3QtPmdyb3VwX3Bvd2VyOworCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ICo9IChTQ0hFRF9MT0FEX1NDQUxFICogU0NIRURfQ0FQQUNJVFlfU0NBTEUpOworCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5OwogCX0KIAogCS8qCkBAIC02MjIwLDkgKzYyMjQsOSBAQAogCiAJLyogSG93IG11Y2ggbG9hZCB0byBhY3R1YWxseSBtb3ZlIHRvIGVxdWFsaXNlIHRoZSBpbWJhbGFuY2UgKi8KIAllbnYtPmltYmFsYW5jZSA9IG1pbigKLQkJbWF4X3B1bGwgKiBidXNpZXN0LT5ncm91cF9wb3dlciwKLQkJKHNkcy0+YXZnX2xvYWQgLSBsb2NhbC0+YXZnX2xvYWQpICogbG9jYWwtPmdyb3VwX3Bvd2VyCi0JKSAvIFNDSEVEX1BPV0VSX1NDQUxFOworCQltYXhfcHVsbCAqIGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5LAorCQkoc2RzLT5hdmdfbG9hZCAtIGxvY2FsLT5hdmdfbG9hZCkgKiBsb2NhbC0+Z3JvdXBfY2FwYWNpdHkKKwkpIC8gU0NIRURfQ0FQQUNJVFlfU0NBTEU7CiAKIAkvKgogCSAqIGlmICppbWJhbGFuY2UgaXMgbGVzcyB0aGFuIHRoZSBhdmVyYWdlIGxvYWQgcGVyIHJ1bm5hYmxlIHRhc2sKQEAgLTYyNzYsNyArNjI4MCw4IEBACiAJaWYgKCFzZHMuYnVzaWVzdCB8fCBidXNpZXN0LT5zdW1fbnJfcnVubmluZyA9PSAwKQogCQlnb3RvIG91dF9iYWxhbmNlZDsKIAotCXNkcy5hdmdfbG9hZCA9IChTQ0hFRF9QT1dFUl9TQ0FMRSAqIHNkcy50b3RhbF9sb2FkKSAvIHNkcy50b3RhbF9wd3I7CisJc2RzLmF2Z19sb2FkID0gKFNDSEVEX0NBUEFDSVRZX1NDQUxFICogc2RzLnRvdGFsX2xvYWQpCisJCQkJCQkvIHNkcy50b3RhbF9jYXBhY2l0eTsKIAogCS8qCiAJICogSWYgdGhlIGJ1c2llc3QgZ3JvdXAgaXMgaW1iYWxhbmNlZCB0aGUgYmVsb3cgY2hlY2tzIGRvbid0CkBAIC02Mjg3LDggKzYyOTIsOCBAQAogCQlnb3RvIGZvcmNlX2JhbGFuY2U7CiAKIAkvKiBTRF9CQUxBTkNFX05FV0lETEUgdHJ1bXBzIFNNUCBuaWNlIHdoZW4gdW5kZXJ1dGlsaXplZCAqLwotCWlmIChlbnYtPmlkbGUgPT0gQ1BVX05FV0xZX0lETEUgJiYgbG9jYWwtPmdyb3VwX2hhc19jYXBhY2l0eSAmJgotCSAgICAhYnVzaWVzdC0+Z3JvdXBfaGFzX2NhcGFjaXR5KQorCWlmIChlbnYtPmlkbGUgPT0gQ1BVX05FV0xZX0lETEUgJiYgbG9jYWwtPmdyb3VwX2hhc19mcmVlX2NhcGFjaXR5ICYmCisJICAgICFidXNpZXN0LT5ncm91cF9oYXNfZnJlZV9jYXBhY2l0eSkKIAkJZ290byBmb3JjZV9iYWxhbmNlOwogCiAJLyoKQEAgLTYzNDIsMTEgKzYzNDcsMTEgQEAKIAkJCQkgICAgIHN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXApCiB7CiAJc3RydWN0IHJxICpidXNpZXN0ID0gTlVMTCwgKnJxOwotCXVuc2lnbmVkIGxvbmcgYnVzaWVzdF9sb2FkID0gMCwgYnVzaWVzdF9wb3dlciA9IDE7CisJdW5zaWduZWQgbG9uZyBidXNpZXN0X2xvYWQgPSAwLCBidXNpZXN0X2NhcGFjaXR5ID0gMTsKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2NwdV9hbmQoaSwgc2NoZWRfZ3JvdXBfY3B1cyhncm91cCksIGVudi0+Y3B1cykgewotCQl1bnNpZ25lZCBsb25nIHBvd2VyLCBjYXBhY2l0eSwgd2w7CisJCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIGNhcGFjaXR5X2ZhY3Rvciwgd2w7CiAJCWVudW0gZmJxX3R5cGUgcnQ7CiAKIAkJcnEgPSBjcHVfcnEoaSk7CkBAIC02Mzc0LDM0ICs2Mzc5LDM0IEBACiAJCWlmIChydCA+IGVudi0+ZmJxX3R5cGUpCiAJCQljb250aW51ZTsKIAotCQlwb3dlciA9IHBvd2VyX29mKGkpOwotCQljYXBhY2l0eSA9IERJVl9ST1VORF9DTE9TRVNUKHBvd2VyLCBTQ0hFRF9QT1dFUl9TQ0FMRSk7Ci0JCWlmICghY2FwYWNpdHkpCi0JCQljYXBhY2l0eSA9IGZpeF9zbWFsbF9jYXBhY2l0eShlbnYtPnNkLCBncm91cCk7CisJCWNhcGFjaXR5ID0gY2FwYWNpdHlfb2YoaSk7CisJCWNhcGFjaXR5X2ZhY3RvciA9IERJVl9ST1VORF9DTE9TRVNUKGNhcGFjaXR5LCBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSk7CisJCWlmICghY2FwYWNpdHlfZmFjdG9yKQorCQkJY2FwYWNpdHlfZmFjdG9yID0gZml4X3NtYWxsX2NhcGFjaXR5KGVudi0+c2QsIGdyb3VwKTsKIAogCQl3bCA9IHdlaWdodGVkX2NwdWxvYWQoaSk7CiAKIAkJLyoKIAkJICogV2hlbiBjb21wYXJpbmcgd2l0aCBpbWJhbGFuY2UsIHVzZSB3ZWlnaHRlZF9jcHVsb2FkKCkKLQkJICogd2hpY2ggaXMgbm90IHNjYWxlZCB3aXRoIHRoZSBjcHUgcG93ZXIuCisJCSAqIHdoaWNoIGlzIG5vdCBzY2FsZWQgd2l0aCB0aGUgY3B1IGNhcGFjaXR5LgogCQkgKi8KLQkJaWYgKGNhcGFjaXR5ICYmIHJxLT5ucl9ydW5uaW5nID09IDEgJiYgd2wgPiBlbnYtPmltYmFsYW5jZSkKKwkJaWYgKGNhcGFjaXR5X2ZhY3RvciAmJiBycS0+bnJfcnVubmluZyA9PSAxICYmIHdsID4gZW52LT5pbWJhbGFuY2UpCiAJCQljb250aW51ZTsKIAogCQkvKgogCQkgKiBGb3IgdGhlIGxvYWQgY29tcGFyaXNvbnMgd2l0aCB0aGUgb3RoZXIgY3B1J3MsIGNvbnNpZGVyCi0JCSAqIHRoZSB3ZWlnaHRlZF9jcHVsb2FkKCkgc2NhbGVkIHdpdGggdGhlIGNwdSBwb3dlciwgc28gdGhhdAotCQkgKiB0aGUgbG9hZCBjYW4gYmUgbW92ZWQgYXdheSBmcm9tIHRoZSBjcHUgdGhhdCBpcyBwb3RlbnRpYWxseQotCQkgKiBydW5uaW5nIGF0IGEgbG93ZXIgY2FwYWNpdHkuCisJCSAqIHRoZSB3ZWlnaHRlZF9jcHVsb2FkKCkgc2NhbGVkIHdpdGggdGhlIGNwdSBjYXBhY2l0eSwgc28KKwkJICogdGhhdCB0aGUgbG9hZCBjYW4gYmUgbW92ZWQgYXdheSBmcm9tIHRoZSBjcHUgdGhhdCBpcworCQkgKiBwb3RlbnRpYWxseSBydW5uaW5nIGF0IGEgbG93ZXIgY2FwYWNpdHkuCiAJCSAqCi0JCSAqIFRodXMgd2UncmUgbG9va2luZyBmb3IgbWF4KHdsX2kgLyBwb3dlcl9pKSwgY3Jvc3N3aXNlCisJCSAqIFRodXMgd2UncmUgbG9va2luZyBmb3IgbWF4KHdsX2kgLyBjYXBhY2l0eV9pKSwgY3Jvc3N3aXNlCiAJCSAqIG11bHRpcGxpY2F0aW9uIHRvIHJpZCBvdXJzZWx2ZXMgb2YgdGhlIGRpdmlzaW9uIHdvcmtzIG91dAotCQkgKiB0bzogd2xfaSAqIHBvd2VyX2ogPiB3bF9qICogcG93ZXJfaTsgIHdoZXJlIGogaXMgb3VyCi0JCSAqIHByZXZpb3VzIG1heGltdW0uCisJCSAqIHRvOiB3bF9pICogY2FwYWNpdHlfaiA+IHdsX2ogKiBjYXBhY2l0eV9pOyAgd2hlcmUgaiBpcworCQkgKiBvdXIgcHJldmlvdXMgbWF4aW11bS4KIAkJICovCi0JCWlmICh3bCAqIGJ1c2llc3RfcG93ZXIgPiBidXNpZXN0X2xvYWQgKiBwb3dlcikgeworCQlpZiAod2wgKiBidXNpZXN0X2NhcGFjaXR5ID4gYnVzaWVzdF9sb2FkICogY2FwYWNpdHkpIHsKIAkJCWJ1c2llc3RfbG9hZCA9IHdsOwotCQkJYnVzaWVzdF9wb3dlciA9IHBvd2VyOworCQkJYnVzaWVzdF9jYXBhY2l0eSA9IGNhcGFjaXR5OwogCQkJYnVzaWVzdCA9IHJxOwogCQl9CiAJfQpAQCAtNjYwOSw3ICs2NjE0LDcgQEAKIAkJICogV2UgZmFpbGVkIHRvIHJlYWNoIGJhbGFuY2UgYmVjYXVzZSBvZiBhZmZpbml0eS4KIAkJICovCiAJCWlmIChzZF9wYXJlbnQpIHsKLQkJCWludCAqZ3JvdXBfaW1iYWxhbmNlID0gJnNkX3BhcmVudC0+Z3JvdXBzLT5zZ3AtPmltYmFsYW5jZTsKKwkJCWludCAqZ3JvdXBfaW1iYWxhbmNlID0gJnNkX3BhcmVudC0+Z3JvdXBzLT5zZ2MtPmltYmFsYW5jZTsKIAogCQkJaWYgKChlbnYuZmxhZ3MgJiBMQkZfU09NRV9QSU5ORUQpICYmIGVudi5pbWJhbGFuY2UgPiAwKSB7CiAJCQkJKmdyb3VwX2ltYmFsYW5jZSA9IDE7CkBAIC02OTk2LDcgKzcwMDEsNyBAQAogCQlnb3RvIHVubG9jazsKIAlzZC0+bm9oel9pZGxlID0gMDsKIAotCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnNncC0+bnJfYnVzeV9jcHVzKTsKKwlhdG9taWNfaW5jKCZzZC0+Z3JvdXBzLT5zZ2MtPm5yX2J1c3lfY3B1cyk7CiB1bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC03MDEzLDcgKzcwMTgsNyBAQAogCQlnb3RvIHVubG9jazsKIAlzZC0+bm9oel9pZGxlID0gMTsKIAotCWF0b21pY19kZWMoJnNkLT5ncm91cHMtPnNncC0+bnJfYnVzeV9jcHVzKTsKKwlhdG9taWNfZGVjKCZzZC0+Z3JvdXBzLT5zZ2MtPm5yX2J1c3lfY3B1cyk7CiB1bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC03MTkyLDEyICs3MTk3LDE3IEBACiAKIAkJcnEgPSBjcHVfcnEoYmFsYW5jZV9jcHUpOwogCi0JCXJhd19zcGluX2xvY2tfaXJxKCZycS0+bG9jayk7Ci0JCXVwZGF0ZV9ycV9jbG9jayhycSk7Ci0JCXVwZGF0ZV9pZGxlX2NwdV9sb2FkKHJxKTsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOwotCi0JCXJlYmFsYW5jZV9kb21haW5zKHJxLCBDUFVfSURMRSk7CisJCS8qCisJCSAqIElmIHRpbWUgZm9yIG5leHQgYmFsYW5jZSBpcyBkdWUsCisJCSAqIGRvIHRoZSBiYWxhbmNlLgorCQkgKi8KKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnEtPm5leHRfYmFsYW5jZSkpIHsKKwkJCXJhd19zcGluX2xvY2tfaXJxKCZycS0+bG9jayk7CisJCQl1cGRhdGVfcnFfY2xvY2socnEpOworCQkJdXBkYXRlX2lkbGVfY3B1X2xvYWQocnEpOworCQkJcmF3X3NwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOworCQkJcmViYWxhbmNlX2RvbWFpbnMocnEsIENQVV9JRExFKTsKKwkJfQogCiAJCWlmICh0aW1lX2FmdGVyKHRoaXNfcnEtPm5leHRfYmFsYW5jZSwgcnEtPm5leHRfYmFsYW5jZSkpCiAJCQl0aGlzX3JxLT5uZXh0X2JhbGFuY2UgPSBycS0+bmV4dF9iYWxhbmNlOwpAQCAtNzIxMiw3ICs3MjIyLDcgQEAKICAqIG9mIGFuIGlkbGUgY3B1IGlzIHRoZSBzeXN0ZW0uCiAgKiAgIC0gVGhpcyBycSBoYXMgbW9yZSB0aGFuIG9uZSB0YXNrLgogICogICAtIEF0IGFueSBzY2hlZHVsZXIgZG9tYWluIGxldmVsLCB0aGlzIGNwdSdzIHNjaGVkdWxlciBncm91cCBoYXMgbXVsdGlwbGUKLSAqICAgICBidXN5IGNwdSdzIGV4Y2VlZGluZyB0aGUgZ3JvdXAncyBwb3dlci4KKyAqICAgICBidXN5IGNwdSdzIGV4Y2VlZGluZyB0aGUgZ3JvdXAncyBjYXBhY2l0eS4KICAqICAgLSBGb3IgU0RfQVNZTV9QQUNLSU5HLCBpZiB0aGUgbG93ZXIgbnVtYmVyZWQgY3B1J3MgaW4gdGhlIHNjaGVkdWxlcgogICogICAgIGRvbWFpbiBzcGFuIGFyZSBpZGxlLgogICovCkBAIC03MjIwLDcgKzcyMzAsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgKnNncDsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgKnNnYzsKIAlpbnQgbnJfYnVzeSwgY3B1ID0gcnEtPmNwdTsKIAogCWlmICh1bmxpa2VseShycS0+aWRsZV9iYWxhbmNlKSkKQEAgLTcyNTAsOCArNzI2MCw4IEBACiAJc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9idXN5LCBjcHUpKTsKIAogCWlmIChzZCkgewotCQlzZ3AgPSBzZC0+Z3JvdXBzLT5zZ3A7Ci0JCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2dwLT5ucl9idXN5X2NwdXMpOworCQlzZ2MgPSBzZC0+Z3JvdXBzLT5zZ2M7CisJCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2djLT5ucl9idXN5X2NwdXMpOwogCiAJCWlmIChucl9idXN5ID4gMSkKIAkJCWdvdG8gbmVlZF9raWNrX3VubG9jazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9mZWF0dXJlcy5oIGIva2VybmVsL3NjaGVkL2ZlYXR1cmVzLmgKaW5kZXggNTcxNjkyOS4uOTAyODRkMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2ZlYXR1cmVzLmgKKysrIGIva2VybmVsL3NjaGVkL2ZlYXR1cmVzLmgKQEAgLTM3LDE4ICszNywxOCBAQAogU0NIRURfRkVBVChXQUtFVVBfUFJFRU1QVElPTiwgdHJ1ZSkKIAogLyoKLSAqIFVzZSBhcmNoIGRlcGVuZGVudCBjcHUgcG93ZXIgZnVuY3Rpb25zCisgKiBVc2UgYXJjaCBkZXBlbmRlbnQgY3B1IGNhcGFjaXR5IGZ1bmN0aW9ucwogICovCi1TQ0hFRF9GRUFUKEFSQ0hfUE9XRVIsIHRydWUpCitTQ0hFRF9GRUFUKEFSQ0hfQ0FQQUNJVFksIHRydWUpCiAKIFNDSEVEX0ZFQVQoSFJUSUNLLCBmYWxzZSkKIFNDSEVEX0ZFQVQoRE9VQkxFX1RJQ0ssIGZhbHNlKQogU0NIRURfRkVBVChMQl9CSUFTLCB0cnVlKQogCiAvKgotICogRGVjcmVtZW50IENQVSBwb3dlciBiYXNlZCBvbiB0aW1lIG5vdCBzcGVudCBydW5uaW5nIHRhc2tzCisgKiBEZWNyZW1lbnQgQ1BVIGNhcGFjaXR5IGJhc2VkIG9uIHRpbWUgbm90IHNwZW50IHJ1bm5pbmcgdGFza3MKICAqLwotU0NIRURfRkVBVChOT05UQVNLX1BPV0VSLCB0cnVlKQorU0NIRURfRkVBVChOT05UQVNLX0NBUEFDSVRZLCB0cnVlKQogCiAvKgogICogUXVldWUgcmVtb3RlIHdha2V1cHMgb24gdGhlIHRhcmdldCBDUFUgYW5kIHByb2Nlc3MgdGhlbQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2lkbGUuYyBiL2tlcm5lbC9zY2hlZC9pZGxlLmMKaW5kZXggMjViOTQyMy4uY2YwMDlmYiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2lkbGUuYworKysgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCkBAIC0xMiw2ICsxMiw4IEBACiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAorI2luY2x1ZGUgInNjaGVkLmgiCisKIHN0YXRpYyBpbnQgX19yZWFkX21vc3RseSBjcHVfaWRsZV9mb3JjZV9wb2xsOwogCiB2b2lkIGNwdV9pZGxlX3BvbGxfY3RybChib29sIGVuYWJsZSkKQEAgLTY3LDYgKzY5LDEwIEBACiAgKiBjcHVpZGxlX2lkbGVfY2FsbCAtIHRoZSBtYWluIGlkbGUgZnVuY3Rpb24KICAqCiAgKiBOT1RFOiBubyBsb2NrcyBvciBzZW1hcGhvcmVzIHNob3VsZCBiZSB1c2VkIGhlcmUKKyAqCisgKiBPbiBhcmNocyB0aGF0IHN1cHBvcnQgVElGX1BPTExJTkdfTlJGTEFHLCBpcyBjYWxsZWQgd2l0aCBwb2xsaW5nCisgKiBzZXQsIGFuZCBpdCByZXR1cm5zIHdpdGggcG9sbGluZyBzZXQuICBJZiBpdCBldmVyIHN0b3BzIHBvbGxpbmcsIGl0CisgKiBtdXN0IGNsZWFyIHRoZSBwb2xsaW5nIGJpdC4KICAqLwogc3RhdGljIHZvaWQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkKIHsKQEAgLTE3NSwxMCArMTgxLDIyIEBACiAKIC8qCiAgKiBHZW5lcmljIGlkbGUgbG9vcCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENhbGxlZCB3aXRoIHBvbGxpbmcgY2xlYXJlZC4KICAqLwogc3RhdGljIHZvaWQgY3B1X2lkbGVfbG9vcCh2b2lkKQogewogCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIElmIHRoZSBhcmNoIGhhcyBhIHBvbGxpbmcgYml0LCB3ZSBtYWludGFpbiBhbiBpbnZhcmlhbnQ6CisJCSAqCisJCSAqIE91ciBwb2xsaW5nIGJpdCBpcyBjbGVhciBpZiB3ZSdyZSBub3Qgc2NoZWR1bGVkIChpLmUuIGlmCisJCSAqIHJxLT5jdXJyICE9IHJxLT5pZGxlKS4gIFRoaXMgbWVhbnMgdGhhdCwgaWYgcnEtPmlkbGUgaGFzCisJCSAqIHRoZSBwb2xsaW5nIGJpdCBzZXQsIHRoZW4gc2V0dGluZyBuZWVkX3Jlc2NoZWQgaXMKKwkJICogZ3VhcmFudGVlZCB0byBjYXVzZSB0aGUgY3B1IHRvIHJlc2NoZWR1bGUuCisJCSAqLworCisJCV9fY3VycmVudF9zZXRfcG9sbGluZygpOwogCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOwogCiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKQEAgLTIxOCw2ICsyMzYsMTcgQEAKIAkJICovCiAJCXByZWVtcHRfc2V0X25lZWRfcmVzY2hlZCgpOwogCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CisJCV9fY3VycmVudF9jbHJfcG9sbGluZygpOworCisJCS8qCisJCSAqIFdlIHByb21pc2UgdG8gY2FsbCBzY2hlZF90dHd1X3BlbmRpbmcgYW5kIHJlc2NoZWR1bGUKKwkJICogaWYgbmVlZF9yZXNjaGVkIGlzIHNldCB3aGlsZSBwb2xsaW5nIGlzIHNldC4gIFRoYXQKKwkJICogbWVhbnMgdGhhdCBjbGVhcmluZyBwb2xsaW5nIG5lZWRzIHRvIGJlIHZpc2libGUKKwkJICogYmVmb3JlIGRvaW5nIHRoZXNlIHRoaW5ncy4KKwkJICovCisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisKKwkJc2NoZWRfdHR3dV9wZW5kaW5nKCk7CiAJCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKIAl9CiB9CkBAIC0yMzksNyArMjY4LDYgQEAKIAkgKi8KIAlib290X2luaXRfc3RhY2tfY2FuYXJ5KCk7CiAjZW5kaWYKLQlfX2N1cnJlbnRfc2V0X3BvbGxpbmcoKTsKIAlhcmNoX2NwdV9pZGxlX3ByZXBhcmUoKTsKIAljcHVfaWRsZV9sb29wKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvcnQuYyBiL2tlcm5lbC9zY2hlZC9ydC5jCmluZGV4IGIzNTEyZjEuLmE0OTA4MzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9ydC5jCisrKyBiL2tlcm5lbC9zY2hlZC9ydC5jCkBAIC05MTgsNyArOTE4LDYgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBycS0+Y3VycjsKIAlzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICpydF9zZSA9ICZjdXJyLT5ydDsKLQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxID0gcnRfcnFfb2Zfc2UocnRfc2UpOwogCXU2NCBkZWx0YV9leGVjOwogCiAJaWYgKGN1cnItPnNjaGVkX2NsYXNzICE9ICZydF9zY2hlZF9jbGFzcykKQEAgLTk0Myw3ICs5NDIsNyBAQAogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9zY2hlZF9ydF9lbnRpdHkocnRfc2UpIHsKLQkJcnRfcnEgPSBydF9ycV9vZl9zZShydF9zZSk7CisJCXN0cnVjdCBydF9ycSAqcnRfcnEgPSBydF9ycV9vZl9zZShydF9zZSk7CiAKIAkJaWYgKHNjaGVkX3J0X3J1bnRpbWUocnRfcnEpICE9IFJVTlRJTUVfSU5GKSB7CiAJCQlyYXdfc3Bpbl9sb2NrKCZydF9ycS0+cnRfcnVudGltZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKaW5kZXggZTQ3Njc5Yi4uMzFjYzAyZSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3NjaGVkLmgKKysrIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCXN0cnVjdCByb290X2RvbWFpbiAqcmQ7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKLQl1bnNpZ25lZCBsb25nIGNwdV9wb3dlcjsKKwl1bnNpZ25lZCBsb25nIGNwdV9jYXBhY2l0eTsKIAogCXVuc2lnbmVkIGNoYXIgaWRsZV9iYWxhbmNlOwogCS8qIEZvciBhY3RpdmUgYmFsYW5jaW5nICovCkBAIC02NzAsNiArNjcwLDggQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAorZXh0ZXJuIHZvaWQgc2NoZWRfdHR3dV9wZW5kaW5nKHZvaWQpOworCiAjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9jaGVja19zY2hlZF9kb21haW4ocCkgXAogCXJjdV9kZXJlZmVyZW5jZV9jaGVjaygocCksIFwKIAkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmc2NoZWRfZG9tYWluc19tdXRleCkpCkBAIC03MjgsMTUgKzczMCwxNSBAQAogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfYnVzeSk7CiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9hc3ltKTsKIAotc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyIHsKK3N0cnVjdCBzY2hlZF9ncm91cF9jYXBhY2l0eSB7CiAJYXRvbWljX3QgcmVmOwogCS8qCi0JICogQ1BVIHBvd2VyIG9mIHRoaXMgZ3JvdXAsIFNDSEVEX0xPQURfU0NBTEUgYmVpbmcgbWF4IHBvd2VyIGZvciBhCi0JICogc2luZ2xlIENQVS4KKwkgKiBDUFUgY2FwYWNpdHkgb2YgdGhpcyBncm91cCwgU0NIRURfTE9BRF9TQ0FMRSBiZWluZyBtYXggY2FwYWNpdHkKKwkgKiBmb3IgYSBzaW5nbGUgQ1BVLgogCSAqLwotCXVuc2lnbmVkIGludCBwb3dlciwgcG93ZXJfb3JpZzsKKwl1bnNpZ25lZCBpbnQgY2FwYWNpdHksIGNhcGFjaXR5X29yaWc7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3VwZGF0ZTsKLQlpbnQgaW1iYWxhbmNlOyAvKiBYWFggdW5yZWxhdGVkIHRvIHBvd2VyIGJ1dCBzaGFyZWQgZ3JvdXAgc3RhdGUgKi8KKwlpbnQgaW1iYWxhbmNlOyAvKiBYWFggdW5yZWxhdGVkIHRvIGNhcGFjaXR5IGJ1dCBzaGFyZWQgZ3JvdXAgc3RhdGUgKi8KIAkvKgogCSAqIE51bWJlciBvZiBidXN5IGNwdXMgaW4gdGhpcyBncm91cC4KIAkgKi8KQEAgLTc1MCw3ICs3NTIsNyBAQAogCWF0b21pY190IHJlZjsKIAogCXVuc2lnbmVkIGludCBncm91cF93ZWlnaHQ7Ci0Jc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3A7CisJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICpzZ2M7CiAKIAkvKgogCSAqIFRoZSBDUFVzIHRoaXMgZ3JvdXAgY292ZXJzLgpAQCAtNzczLDcgKzc3NSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNwdW1hc2sgKnNjaGVkX2dyb3VwX21hc2soc3RydWN0IHNjaGVkX2dyb3VwICpzZykKIHsKLQlyZXR1cm4gdG9fY3B1bWFzayhzZy0+c2dwLT5jcHVtYXNrKTsKKwlyZXR1cm4gdG9fY3B1bWFzayhzZy0+c2djLT5jcHVtYXNrKTsKIH0KIAogLyoqCkBAIC03ODcsNiArNzg5LDEwIEBACiAKIGV4dGVybiBpbnQgZ3JvdXBfYmFsYW5jZV9jcHUoc3RydWN0IHNjaGVkX2dyb3VwICpzZyk7CiAKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF90dHd1X3BlbmRpbmcodm9pZCkgeyB9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKICNpbmNsdWRlICJzdGF0cy5oIgpAQCAtMTE2Nyw3ICsxMTczLDcgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAotZXh0ZXJuIHZvaWQgdXBkYXRlX2dyb3VwX3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHVwZGF0ZV9ncm91cF9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSk7CiAKIGV4dGVybiB2b2lkIHRyaWdnZXJfbG9hZF9iYWxhbmNlKHN0cnVjdCBycSAqcnEpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBmNmQ3NmJlLi4zMDFiYmMyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTU0LDggKzU0LDcgQEAKIHN0cnVjdCBzZWNjb21wX2ZpbHRlciB7CiAJYXRvbWljX3QgdXNhZ2U7CiAJc3RydWN0IHNlY2NvbXBfZmlsdGVyICpwcmV2OwotCXVuc2lnbmVkIHNob3J0IGxlbjsgIC8qIEluc3RydWN0aW9uIGNvdW50ICovCi0Jc3RydWN0IHNvY2tfZmlsdGVyX2ludCBpbnNuc2lbXTsKKwlzdHJ1Y3Qgc2tfZmlsdGVyICpwcm9nOwogfTsKIAogLyogTGltaXQgYW55IHBhdGggdGhyb3VnaCB0aGUgdHJlZSB0byAyNTZLQiB3b3J0aCBvZiBpbnN0cnVjdGlvbnMuICovCkBAIC0xMDQsNjAgKzEwMyw1OSBAQAogCQl1MzIgayA9IGZ0ZXN0LT5rOwogCiAJCXN3aXRjaCAoY29kZSkgewotCQljYXNlIEJQRl9TX0xEX1dfQUJTOgorCQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUzoKIAkJCWZ0ZXN0LT5jb2RlID0gQlBGX0xEWCB8IEJQRl9XIHwgQlBGX0FCUzsKIAkJCS8qIDMyLWJpdCBhbGlnbmVkIGFuZCBub3Qgb3V0IG9mIGJvdW5kcy4gKi8KIAkJCWlmIChrID49IHNpemVvZihzdHJ1Y3Qgc2VjY29tcF9kYXRhKSB8fCBrICYgMykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9TX0xEX1dfTEVOOgorCQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0xFTjoKIAkJCWZ0ZXN0LT5jb2RlID0gQlBGX0xEIHwgQlBGX0lNTTsKIAkJCWZ0ZXN0LT5rID0gc2l6ZW9mKHN0cnVjdCBzZWNjb21wX2RhdGEpOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX1NfTERYX1dfTEVOOgorCQljYXNlIEJQRl9MRFggfCBCUEZfVyB8IEJQRl9MRU46CiAJCQlmdGVzdC0+Y29kZSA9IEJQRl9MRFggfCBCUEZfSU1NOwogCQkJZnRlc3QtPmsgPSBzaXplb2Yoc3RydWN0IHNlY2NvbXBfZGF0YSk7CiAJCQljb250aW51ZTsKIAkJLyogRXhwbGljaXRseSBpbmNsdWRlIGFsbG93ZWQgY2FsbHMuICovCi0JCWNhc2UgQlBGX1NfUkVUX0s6Ci0JCWNhc2UgQlBGX1NfUkVUX0E6Ci0JCWNhc2UgQlBGX1NfQUxVX0FERF9LOgotCQljYXNlIEJQRl9TX0FMVV9BRERfWDoKLQkJY2FzZSBCUEZfU19BTFVfU1VCX0s6Ci0JCWNhc2UgQlBGX1NfQUxVX1NVQl9YOgotCQljYXNlIEJQRl9TX0FMVV9NVUxfSzoKLQkJY2FzZSBCUEZfU19BTFVfTVVMX1g6Ci0JCWNhc2UgQlBGX1NfQUxVX0RJVl9YOgotCQljYXNlIEJQRl9TX0FMVV9BTkRfSzoKLQkJY2FzZSBCUEZfU19BTFVfQU5EX1g6Ci0JCWNhc2UgQlBGX1NfQUxVX09SX0s6Ci0JCWNhc2UgQlBGX1NfQUxVX09SX1g6Ci0JCWNhc2UgQlBGX1NfQUxVX1hPUl9LOgotCQljYXNlIEJQRl9TX0FMVV9YT1JfWDoKLQkJY2FzZSBCUEZfU19BTFVfTFNIX0s6Ci0JCWNhc2UgQlBGX1NfQUxVX0xTSF9YOgotCQljYXNlIEJQRl9TX0FMVV9SU0hfSzoKLQkJY2FzZSBCUEZfU19BTFVfUlNIX1g6Ci0JCWNhc2UgQlBGX1NfQUxVX05FRzoKLQkJY2FzZSBCUEZfU19MRF9JTU06Ci0JCWNhc2UgQlBGX1NfTERYX0lNTToKLQkJY2FzZSBCUEZfU19NSVNDX1RBWDoKLQkJY2FzZSBCUEZfU19NSVNDX1RYQToKLQkJY2FzZSBCUEZfU19BTFVfRElWX0s6Ci0JCWNhc2UgQlBGX1NfTERfTUVNOgotCQljYXNlIEJQRl9TX0xEWF9NRU06Ci0JCWNhc2UgQlBGX1NfU1Q6Ci0JCWNhc2UgQlBGX1NfU1RYOgotCQljYXNlIEJQRl9TX0pNUF9KQToKLQkJY2FzZSBCUEZfU19KTVBfSkVRX0s6Ci0JCWNhc2UgQlBGX1NfSk1QX0pFUV9YOgotCQljYXNlIEJQRl9TX0pNUF9KR0VfSzoKLQkJY2FzZSBCUEZfU19KTVBfSkdFX1g6Ci0JCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgotCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKLQkJY2FzZSBCUEZfU19KTVBfSlNFVF9LOgotCQljYXNlIEJQRl9TX0pNUF9KU0VUX1g6Ci0JCQlza19kZWNvZGVfZmlsdGVyKGZ0ZXN0LCBmdGVzdCk7CisJCWNhc2UgQlBGX1JFVCB8IEJQRl9LOgorCQljYXNlIEJQRl9SRVQgfCBCUEZfQToKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfSzoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0s6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfWDoKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1g6CisJCWNhc2UgQlBGX0FMVSB8IEJQRl9ORUc6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0lNTToKKwkJY2FzZSBCUEZfTERYIHwgQlBGX0lNTToKKwkJY2FzZSBCUEZfTUlTQyB8IEJQRl9UQVg6CisJCWNhc2UgQlBGX01JU0MgfCBCUEZfVFhBOgorCQljYXNlIEJQRl9MRCB8IEJQRl9NRU06CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU06CisJCWNhc2UgQlBGX1NUOgorCQljYXNlIEJQRl9TVFg6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWDoKIAkJCWNvbnRpbnVlOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODksNyArMTg3LDggQEAKIAkgKiB2YWx1ZSBhbHdheXMgdGFrZXMgcHJpb3JpdHkgKGlnbm9yaW5nIHRoZSBEQVRBKS4KIAkgKi8KIAlmb3IgKGYgPSBjdXJyZW50LT5zZWNjb21wLmZpbHRlcjsgZjsgZiA9IGYtPnByZXYpIHsKLQkJdTMyIGN1cl9yZXQgPSBza19ydW5fZmlsdGVyX2ludF9zZWNjb21wKCZzZCwgZi0+aW5zbnNpKTsKKwkJdTMyIGN1cl9yZXQgPSBTS19SVU5fRklMVEVSKGYtPnByb2csICh2b2lkICopJnNkKTsKKwogCQlpZiAoKGN1cl9yZXQgJiBTRUNDT01QX1JFVF9BQ1RJT04pIDwgKHJldCAmIFNFQ0NPTVBfUkVUX0FDVElPTikpCiAJCQlyZXQgPSBjdXJfcmV0OwogCX0KQEAgLTIxNSw3ICsyMTQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoZmlsdGVyID0gY3VycmVudC0+c2VjY29tcC5maWx0ZXI7IGZpbHRlcjsgZmlsdGVyID0gZmlsdGVyLT5wcmV2KQotCQl0b3RhbF9pbnNucyArPSBmaWx0ZXItPmxlbiArIDQ7ICAvKiBpbmNsdWRlIGEgNCBpbnN0ciBwZW5hbHR5ICovCisJCXRvdGFsX2luc25zICs9IGZpbHRlci0+cHJvZy0+bGVuICsgNDsgIC8qIGluY2x1ZGUgYSA0IGluc3RyIHBlbmFsdHkgKi8KIAlpZiAodG90YWxfaW5zbnMgPiBNQVhfSU5TTlNfUEVSX1BBVEgpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yNTYsMTkgKzI1NSwyNSBAQAogCiAJLyogQWxsb2NhdGUgYSBuZXcgc2VjY29tcF9maWx0ZXIgKi8KIAlyZXQgPSAtRU5PTUVNOwotCWZpbHRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWNjb21wX2ZpbHRlcikgKwotCQkJIHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSAqIG5ld19sZW4sCisJZmlsdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlY2NvbXBfZmlsdGVyKSwKIAkJCSBHRlBfS0VSTkVMfF9fR0ZQX05PV0FSTik7CiAJaWYgKCFmaWx0ZXIpCiAJCWdvdG8gZnJlZV9wcm9nOwogCi0JcmV0ID0gc2tfY29udmVydF9maWx0ZXIoZnAsIGZwcm9nLT5sZW4sIGZpbHRlci0+aW5zbnNpLCAmbmV3X2xlbik7Ci0JaWYgKHJldCkKKwlmaWx0ZXItPnByb2cgPSBremFsbG9jKHNrX2ZpbHRlcl9zaXplKG5ld19sZW4pLAorCQkJICAgICAgIEdGUF9LRVJORUx8X19HRlBfTk9XQVJOKTsKKwlpZiAoIWZpbHRlci0+cHJvZykKIAkJZ290byBmcmVlX2ZpbHRlcjsKKworCXJldCA9IHNrX2NvbnZlcnRfZmlsdGVyKGZwLCBmcHJvZy0+bGVuLCBmaWx0ZXItPnByb2ctPmluc25zaSwgJm5ld19sZW4pOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9maWx0ZXJfcHJvZzsKIAlrZnJlZShmcCk7CiAKIAlhdG9taWNfc2V0KCZmaWx0ZXItPnVzYWdlLCAxKTsKLQlmaWx0ZXItPmxlbiA9IG5ld19sZW47CisJZmlsdGVyLT5wcm9nLT5sZW4gPSBuZXdfbGVuOworCisJc2tfZmlsdGVyX3NlbGVjdF9ydW50aW1lKGZpbHRlci0+cHJvZyk7CiAKIAkvKgogCSAqIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGZpbHRlciwgbWFrZSBpdCB0aGUgcHJldiBhbmQgZG9uJ3QgZHJvcCBpdHMKQEAgLTI3OCw2ICsyODMsOCBAQAogCWN1cnJlbnQtPnNlY2NvbXAuZmlsdGVyID0gZmlsdGVyOwogCXJldHVybiAwOwogCitmcmVlX2ZpbHRlcl9wcm9nOgorCWtmcmVlKGZpbHRlci0+cHJvZyk7CiBmcmVlX2ZpbHRlcjoKIAlrZnJlZShmaWx0ZXIpOwogZnJlZV9wcm9nOgpAQCAtMzMwLDYgKzMzNyw3IEBACiAJd2hpbGUgKG9yaWcgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmb3JpZy0+dXNhZ2UpKSB7CiAJCXN0cnVjdCBzZWNjb21wX2ZpbHRlciAqZnJlZW1lID0gb3JpZzsKIAkJb3JpZyA9IG9yaWctPnByZXY7CisJCXNrX2ZpbHRlcl9mcmVlKGZyZWVtZS0+cHJvZyk7CiAJCWtmcmVlKGZyZWVtZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGRiMTllM2UuLmJhOWVkNDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTI1NjgsMTEgKzI1NjgsMTEgQEAKIAlib29sIGZpcnN0ID0gMTsKIAlzaXplX3QgbGVmdCA9ICpsZW5wOwogCXVuc2lnbmVkIGxvbmcgYml0bWFwX2xlbiA9IHRhYmxlLT5tYXhsZW47Ci0JdW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKikgdGFibGUtPmRhdGE7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwID0gKih1bnNpZ25lZCBsb25nICoqKSB0YWJsZS0+ZGF0YTsKIAl1bnNpZ25lZCBsb25nICp0bXBfYml0bWFwID0gTlVMTDsKIAljaGFyIHRyX2FbXSA9IHsgJy0nLCAnLCcsICdcbicgfSwgdHJfYltdID0geyAnLCcsICdcbicsIDAgfSwgYzsKIAotCWlmICghYml0bWFwX2xlbiB8fCAhbGVmdCB8fCAoKnBwb3MgJiYgIXdyaXRlKSkgeworCWlmICghYml0bWFwIHx8ICFiaXRtYXBfbGVuIHx8ICFsZWZ0IHx8ICgqcHBvcyAmJiAhd3JpdGUpKSB7CiAJCSpsZW5wID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwppbmRleCBjNjM0ODY4Li43YzU2YzNkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwpAQCAtNTQzLDcgKzU0Myw3IEBACiAgKiBhcyBkYXRhIGlzIGFkZGVkIHRvIGFueSBvZiB0aGUgQGJ1ZmZlcidzIGNwdSBidWZmZXJzLiBPdGhlcndpc2UKICAqIGl0IHdpbGwgd2FpdCBmb3IgZGF0YSB0byBiZSBhZGRlZCB0byBhIHNwZWNpZmljIGNwdSBidWZmZXIuCiAgKi8KLXZvaWQgcmluZ19idWZmZXJfd2FpdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSkKK2ludCByaW5nX2J1ZmZlcl93YWl0KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KQogewogCXN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyOwogCURFRklORV9XQUlUKHdhaXQpOwpAQCAtNTU3LDYgKzU1Nyw4IEBACiAJaWYgKGNwdSA9PSBSSU5HX0JVRkZFUl9BTExfQ1BVUykKIAkJd29yayA9ICZidWZmZXItPmlycV93b3JrOwogCWVsc2UgeworCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBidWZmZXItPmNwdW1hc2spKQorCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKIAkJd29yayA9ICZjcHVfYnVmZmVyLT5pcnFfd29yazsKIAl9CkBAIC01OTEsNiArNTkzLDcgQEAKIAkJc2NoZWR1bGUoKTsKIAogCWZpbmlzaF93YWl0KCZ3b3JrLT53YWl0ZXJzLCAmd2FpdCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCAxNmY3MDM4Li4zODRlZGUzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTA4NSwxMyArMTA4NSwxMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19UUkFDRVJfTUFYX1RSQUNFICovCiAKLXN0YXRpYyB2b2lkIHdhaXRfb25fcGlwZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCitzdGF0aWMgaW50IHdhaXRfb25fcGlwZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CiAJLyogSXRlcmF0b3JzIGFyZSBzdGF0aWMsIHRoZXkgc2hvdWxkIGJlIGZpbGxlZCBvciBlbXB0eSAqLwogCWlmICh0cmFjZV9idWZmZXJfaXRlcihpdGVyLCBpdGVyLT5jcHVfZmlsZSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKLQlyaW5nX2J1ZmZlcl93YWl0KGl0ZXItPnRyYWNlX2J1ZmZlci0+YnVmZmVyLCBpdGVyLT5jcHVfZmlsZSk7CisJcmV0dXJuIHJpbmdfYnVmZmVyX3dhaXQoaXRlci0+dHJhY2VfYnVmZmVyLT5idWZmZXIsIGl0ZXItPmNwdV9maWxlKTsKIH0KIAogI2lmZGVmIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUCkBAIC0xMzM4LDcgKzEzMzgsNyBAQAogewogCWludCByZXQ7CiAKLQlzYXZlZGNtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYXZlZF9jbWRsaW5lc19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlzYXZlZGNtZCA9IGttYWxsb2Moc2l6ZW9mKCpzYXZlZGNtZCksIEdGUF9LRVJORUwpOwogCWlmICghc2F2ZWRjbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zODQwLDcgKzM4NDAsNyBAQAogCWludCByOwogCiAJYXJjaF9zcGluX2xvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7Ci0JciA9IHNwcmludGYoYnVmLCAiJXVcbiIsIHNhdmVkY21kLT5jbWRsaW5lX251bSk7CisJciA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXVcbiIsIHNhdmVkY21kLT5jbWRsaW5lX251bSk7CiAJYXJjaF9zcGluX3VubG9jaygmdHJhY2VfY21kbGluZV9sb2NrKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIGJ1Ziwgcik7CkBAIC0zODU3LDcgKzM4NTcsNyBAQAogewogCXN0cnVjdCBzYXZlZF9jbWRsaW5lc19idWZmZXIgKnMsICpzYXZlZGNtZF90ZW1wOwogCi0JcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYXZlZF9jbWRsaW5lc19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXMpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC00Mzc4LDYgKzQzNzgsNyBAQAogc3RhdGljIGludCB0cmFjaW5nX3dhaXRfcGlwZShzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKIAogCXdoaWxlICh0cmFjZV9lbXB0eShpdGVyKSkgewogCkBAIC00Mzk5LDEwICs0NDAwLDEzIEBACiAKIAkJbXV0ZXhfdW5sb2NrKCZpdGVyLT5tdXRleCk7CiAKLQkJd2FpdF9vbl9waXBlKGl0ZXIpOworCQlyZXQgPSB3YWl0X29uX3BpcGUoaXRlcik7CiAKIAkJbXV0ZXhfbG9jaygmaXRlci0+bXV0ZXgpOwogCisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQpAQCAtNTMyNyw4ICs1MzMxLDEyIEBACiAJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJfQogCQkJbXV0ZXhfdW5sb2NrKCZ0cmFjZV90eXBlc19sb2NrKTsKLQkJCXdhaXRfb25fcGlwZShpdGVyKTsKKwkJCXJldCA9IHdhaXRfb25fcGlwZShpdGVyKTsKIAkJCW11dGV4X2xvY2soJnRyYWNlX3R5cGVzX2xvY2spOworCQkJaWYgKHJldCkgeworCQkJCXNpemUgPSByZXQ7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQkJc2l6ZSA9IC1FSU5UUjsKIAkJCQlnb3RvIG91dF91bmxvY2s7CkBAIC01NTM4LDggKzU1NDYsMTAgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCW11dGV4X3VubG9jaygmdHJhY2VfdHlwZXNfbG9jayk7Ci0JCXdhaXRfb25fcGlwZShpdGVyKTsKKwkJcmV0ID0gd2FpdF9vbl9waXBlKGl0ZXIpOwogCQltdXRleF9sb2NrKCZ0cmFjZV90eXBlc19sb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXJldCA9IC1FSU5UUjsKIAkJCWdvdG8gb3V0OwpAQCAtNjIzMiwyMiArNjI0MiwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX3RyYWNlX2J1ZmZlcihzdHJ1Y3QgdHJhY2VfYnVmZmVyICpidWYpCit7CisJaWYgKGJ1Zi0+YnVmZmVyKSB7CisJCXJpbmdfYnVmZmVyX2ZyZWUoYnVmLT5idWZmZXIpOworCQlidWYtPmJ1ZmZlciA9IE5VTEw7CisJCWZyZWVfcGVyY3B1KGJ1Zi0+ZGF0YSk7CisJCWJ1Zi0+ZGF0YSA9IE5VTEw7CisJfQorfQorCiBzdGF0aWMgdm9pZCBmcmVlX3RyYWNlX2J1ZmZlcnMoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKIAlpZiAoIXRyKQogCQlyZXR1cm47CiAKLQlpZiAodHItPnRyYWNlX2J1ZmZlci5idWZmZXIpIHsKLQkJcmluZ19idWZmZXJfZnJlZSh0ci0+dHJhY2VfYnVmZmVyLmJ1ZmZlcik7Ci0JCXRyLT50cmFjZV9idWZmZXIuYnVmZmVyID0gTlVMTDsKLQkJZnJlZV9wZXJjcHUodHItPnRyYWNlX2J1ZmZlci5kYXRhKTsKLQl9CisJZnJlZV90cmFjZV9idWZmZXIoJnRyLT50cmFjZV9idWZmZXIpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKLQlpZiAodHItPm1heF9idWZmZXIuYnVmZmVyKSB7Ci0JCXJpbmdfYnVmZmVyX2ZyZWUodHItPm1heF9idWZmZXIuYnVmZmVyKTsKLQkJdHItPm1heF9idWZmZXIuYnVmZmVyID0gTlVMTDsKLQl9CisJZnJlZV90cmFjZV9idWZmZXIoJnRyLT5tYXhfYnVmZmVyKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuaCBiL2tlcm5lbC90cmFjZS90cmFjZS5oCmluZGV4IDllODI1NTEuLjkyNThmNWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5oCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5oCkBAIC0yNTIsNyArMjUyLDcgQEAKIHsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyOwogCi0JaWYgKGxpc3RfZW1wdHkoZnRyYWNlX3RyYWNlX2FycmF5cy5wcmV2KSkKKwlpZiAobGlzdF9lbXB0eSgmZnRyYWNlX3RyYWNlX2FycmF5cykpCiAJCXJldHVybiBOVUxMOwogCiAJdHIgPSBsaXN0X2VudHJ5KGZ0cmFjZV90cmFjZV9hcnJheXMucHJldiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcGVyZi5jCmluZGV4IGM4OTQ2MTQuLjVkMTJiYjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3BlcmYuYwpAQCAtMjQ4LDggKzI0OCw4IEBACiAJdHBfZXZlbnQtPmNsYXNzLT5yZWcodHBfZXZlbnQsIFRSQUNFX1JFR19QRVJGX0RFTCwgcF9ldmVudCk7CiB9CiAKLV9fa3Byb2JlcyB2b2lkICpwZXJmX3RyYWNlX2J1Zl9wcmVwYXJlKGludCBzaXplLCB1bnNpZ25lZCBzaG9ydCB0eXBlLAotCQkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50ICpyY3R4cCkKK3ZvaWQgKnBlcmZfdHJhY2VfYnVmX3ByZXBhcmUoaW50IHNpemUsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgKnJjdHhwKQogewogCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI4MSw2ICsyODEsNyBAQAogCXJldHVybiByYXdfZGF0YTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBlcmZfdHJhY2VfYnVmX3ByZXBhcmUpOworTk9LUFJPQkVfU1lNQk9MKHBlcmZfdHJhY2VfYnVmX3ByZXBhcmUpOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwppbmRleCBlZjJmYmExLi4yODJmNmU0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCkBAIC00MCwyNyArNDAsMjcgQEAKIAkoc2l6ZW9mKHN0cnVjdCBwcm9iZV9hcmcpICogKG4pKSkKIAogCi1zdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2Vfa3Byb2JlX2lzX3JldHVybihzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aykKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgYm9vbCB0cmFjZV9rcHJvYmVfaXNfcmV0dXJuKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrKQogewogCXJldHVybiB0ay0+cnAuaGFuZGxlciAhPSBOVUxMOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIGNvbnN0IGNoYXIgKnRyYWNlX2twcm9iZV9zeW1ib2woc3RydWN0IHRyYWNlX2twcm9iZSAqdGspCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIGNvbnN0IGNoYXIgKnRyYWNlX2twcm9iZV9zeW1ib2woc3RydWN0IHRyYWNlX2twcm9iZSAqdGspCiB7CiAJcmV0dXJuIHRrLT5zeW1ib2wgPyB0ay0+c3ltYm9sIDogInVua25vd24iOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIHVuc2lnbmVkIGxvbmcgdHJhY2Vfa3Byb2JlX29mZnNldChzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aykKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgdW5zaWduZWQgbG9uZyB0cmFjZV9rcHJvYmVfb2Zmc2V0KHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrKQogewogCXJldHVybiB0ay0+cnAua3Aub2Zmc2V0OwogfQogCi1zdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2Vfa3Byb2JlX2hhc19nb25lKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrKQorc3RhdGljIG5va3Byb2JlX2lubGluZSBib29sIHRyYWNlX2twcm9iZV9oYXNfZ29uZShzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aykKIHsKIAlyZXR1cm4gISEoa3Byb2JlX2dvbmUoJnRrLT5ycC5rcCkpOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2Vfa3Byb2JlX3dpdGhpbl9tb2R1bGUoc3RydWN0IHRyYWNlX2twcm9iZSAqdGssCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIGJvb2wgdHJhY2Vfa3Byb2JlX3dpdGhpbl9tb2R1bGUoc3RydWN0IHRyYWNlX2twcm9iZSAqdGssCiAJCQkJCQkgc3RydWN0IG1vZHVsZSAqbW9kKQogewogCWludCBsZW4gPSBzdHJsZW4obW9kLT5uYW1lKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAlyZXR1cm4gc3RybmNtcChtb2QtPm5hbWUsIG5hbWUsIGxlbikgPT0gMCAmJiBuYW1lW2xlbl0gPT0gJzonOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2Vfa3Byb2JlX2lzX29uX21vZHVsZShzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aykKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgYm9vbCB0cmFjZV9rcHJvYmVfaXNfb25fbW9kdWxlKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrKQogewogCXJldHVybiAhIXN0cmNocih0cmFjZV9rcHJvYmVfc3ltYm9sKHRrKSwgJzonKTsKIH0KQEAgLTEzMiwxOSArMTMyLDIxIEBACiAgKiBLcHJvYmVzLXNwZWNpZmljIGZldGNoIGZ1bmN0aW9ucwogICovCiAjZGVmaW5lIERFRklORV9GRVRDSF9zdGFjayh0eXBlKQkJCQkJXAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShzdGFjaywgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsXAorc3RhdGljIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKHN0YWNrLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJCVwKIAkJCQkJICB2b2lkICpvZmZzZXQsIHZvaWQgKmRlc3QpCVwKIHsJCQkJCQkJCQlcCiAJKih0eXBlICopZGVzdCA9ICh0eXBlKXJlZ3NfZ2V0X2tlcm5lbF9zdGFja19udGgocmVncywJCVwKIAkJCQkodW5zaWduZWQgaW50KSgodW5zaWduZWQgbG9uZylvZmZzZXQpKTsJXAotfQorfQkJCQkJCQkJCVwKK05PS1BST0JFX1NZTUJPTChGRVRDSF9GVU5DX05BTUUoc3RhY2ssIHR5cGUpKTsKKwogREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKHN0YWNrKQogLyogTm8gc3RyaW5nIG9uIHRoZSBzdGFjayBlbnRyeSAqLwogI2RlZmluZSBmZXRjaF9zdGFja19zdHJpbmcJTlVMTAogI2RlZmluZSBmZXRjaF9zdGFja19zdHJpbmdfc2l6ZQlOVUxMCiAKICNkZWZpbmUgREVGSU5FX0ZFVENIX21lbW9yeSh0eXBlKQkJCQkJXAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLFwKK3N0YXRpYyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAkJXAogCQkJCQkgIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCVwKIHsJCQkJCQkJCQlcCiAJdHlwZSByZXR2YWw7CQkJCQkJCVwKQEAgLTE1MiwxNCArMTU0LDE2IEBACiAJCSoodHlwZSAqKWRlc3QgPSAwOwkJCQkJXAogCWVsc2UJCQkJCQkJCVwKIAkJKih0eXBlICopZGVzdCA9IHJldHZhbDsJCQkJCVwKLX0KK30JCQkJCQkJCQlcCitOT0tQUk9CRV9TWU1CT0woRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgdHlwZSkpOworCiBERUZJTkVfQkFTSUNfRkVUQ0hfRlVOQ1MobWVtb3J5KQogLyoKICAqIEZldGNoIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gQ2FsbGVyIE1VU1Qgc2V0ICoodTMyICopZGVzdCB3aXRoIG1heAogICogbGVuZ3RoIGFuZCByZWxhdGl2ZSBkYXRhIGxvY2F0aW9uLgogICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nKShzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkJCSAgICAgIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCitzdGF0aWMgdm9pZCBGRVRDSF9GVU5DX05BTUUobWVtb3J5LCBzdHJpbmcpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgdm9pZCAqYWRkciwgdm9pZCAqZGVzdCkKIHsKIAlsb25nIHJldDsKIAlpbnQgbWF4bGVuID0gZ2V0X3Jsb2NfbGVuKCoodTMyICopZGVzdCk7CkBAIC0xOTMsMTAgKzE5NywxMSBAQAogCQkJCQkgICAgICBnZXRfcmxvY19vZmZzKCoodTMyICopZGVzdCkpOwogCX0KIH0KK05PS1BST0JFX1NZTUJPTChGRVRDSF9GVU5DX05BTUUobWVtb3J5LCBzdHJpbmcpKTsKIAogLyogUmV0dXJuIHRoZSBsZW5ndGggb2Ygc3RyaW5nIC0tIGluY2x1ZGluZyBudWxsIHRlcm1pbmFsIGJ5dGUgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUobWVtb3J5LCBzdHJpbmdfc2l6ZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkJdm9pZCAqYWRkciwgdm9pZCAqZGVzdCkKK3N0YXRpYyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHN0cmluZ19zaXplKShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJCSB2b2lkICphZGRyLCB2b2lkICpkZXN0KQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAJaW50IHJldCwgbGVuID0gMDsKQEAgLTIxOSwxNyArMjI0LDE5IEBACiAJZWxzZQogCQkqKHUzMiAqKWRlc3QgPSBsZW47CiB9CitOT0tQUk9CRV9TWU1CT0woRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nX3NpemUpKTsKIAogI2RlZmluZSBERUZJTkVfRkVUQ0hfc3ltYm9sKHR5cGUpCQkJCQlcCi1fX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUoc3ltYm9sLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJXAotCQkJCQkgIHZvaWQgKmRhdGEsIHZvaWQgKmRlc3QpCVwKK3ZvaWQgRkVUQ0hfRlVOQ19OQU1FKHN5bWJvbCwgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKmRhdGEsIHZvaWQgKmRlc3QpXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3Qgc3ltYm9sX2NhY2hlICpzYyA9IGRhdGE7CQkJCQlcCiAJaWYgKHNjLT5hZGRyKQkJCQkJCQlcCiAJCWZldGNoX21lbW9yeV8jI3R5cGUocmVncywgKHZvaWQgKilzYy0+YWRkciwgZGVzdCk7CVwKIAllbHNlCQkJCQkJCQlcCiAJCSoodHlwZSAqKWRlc3QgPSAwOwkJCQkJXAotfQorfQkJCQkJCQkJCVwKK05PS1BST0JFX1NZTUJPTChGRVRDSF9GVU5DX05BTUUoc3ltYm9sLCB0eXBlKSk7CisKIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhzeW1ib2wpCiBERUZJTkVfRkVUQ0hfc3ltYm9sKHN0cmluZykKIERFRklORV9GRVRDSF9zeW1ib2woc3RyaW5nX3NpemUpCkBAIC05MDcsNyArOTE0LDcgQEAKIH07CiAKIC8qIEtwcm9iZSBoYW5kbGVyICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgdm9pZAogX19rcHJvYmVfdHJhY2VfZnVuYyhzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCSAgICBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpbGUgKmZ0cmFjZV9maWxlKQogewpAQCAtOTQzLDcgKzk1MCw3IEBACiAJCQkJCSBlbnRyeSwgaXJxX2ZsYWdzLCBwYywgcmVncyk7CiB9CiAKLXN0YXRpYyBfX2twcm9iZXMgdm9pZAorc3RhdGljIHZvaWQKIGtwcm9iZV90cmFjZV9mdW5jKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgZXZlbnRfZmlsZV9saW5rICpsaW5rOwpAQCAtOTUxLDkgKzk1OCwxMCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxpbmssICZ0ay0+dHAuZmlsZXMsIGxpc3QpCiAJCV9fa3Byb2JlX3RyYWNlX2Z1bmModGssIHJlZ3MsIGxpbmstPmZpbGUpOwogfQorTk9LUFJPQkVfU1lNQk9MKGtwcm9iZV90cmFjZV9mdW5jKTsKIAogLyogS3JldHByb2JlIGhhbmRsZXIgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZAorc3RhdGljIG5va3Byb2JlX2lubGluZSB2b2lkCiBfX2tyZXRwcm9iZV90cmFjZV9mdW5jKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrLCBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSwKIAkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkgICAgICAgc3RydWN0IGZ0cmFjZV9ldmVudF9maWxlICpmdHJhY2VfZmlsZSkKQEAgLTk5MSw3ICs5OTksNyBAQAogCQkJCQkgZW50cnksIGlycV9mbGFncywgcGMsIHJlZ3MpOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQKK3N0YXRpYyB2b2lkCiBrcmV0cHJvYmVfdHJhY2VfZnVuYyhzdHJ1Y3QgdHJhY2Vfa3Byb2JlICp0aywgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksCiAJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0xMDAwLDYgKzEwMDgsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxpbmssICZ0ay0+dHAuZmlsZXMsIGxpc3QpCiAJCV9fa3JldHByb2JlX3RyYWNlX2Z1bmModGssIHJpLCByZWdzLCBsaW5rLT5maWxlKTsKIH0KK05PS1BST0JFX1NZTUJPTChrcmV0cHJvYmVfdHJhY2VfZnVuYyk7CiAKIC8qIEV2ZW50IGVudHJ5IHByaW50ZXJzICovCiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QKQEAgLTExMzEsNyArMTE0MCw3IEBACiAjaWZkZWYgQ09ORklHX1BFUkZfRVZFTlRTCiAKIC8qIEtwcm9iZSBwcm9maWxlIGhhbmRsZXIgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZAorc3RhdGljIHZvaWQKIGtwcm9iZV9wZXJmX2Z1bmMoc3RydWN0IHRyYWNlX2twcm9iZSAqdGssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZ0ay0+dHAuY2FsbDsKQEAgLTExNTgsOSArMTE2NywxMCBAQAogCXN0b3JlX3RyYWNlX2FyZ3Moc2l6ZW9mKCplbnRyeSksICZ0ay0+dHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCXBlcmZfdHJhY2VfYnVmX3N1Ym1pdChlbnRyeSwgc2l6ZSwgcmN0eCwgMCwgMSwgcmVncywgaGVhZCwgTlVMTCk7CiB9CitOT0tQUk9CRV9TWU1CT0woa3Byb2JlX3BlcmZfZnVuYyk7CiAKIC8qIEtyZXRwcm9iZSBwcm9maWxlIGhhbmRsZXIgKi8KLXN0YXRpYyBfX2twcm9iZXMgdm9pZAorc3RhdGljIHZvaWQKIGtyZXRwcm9iZV9wZXJmX2Z1bmMoc3RydWN0IHRyYWNlX2twcm9iZSAqdGssIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpLAogCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0xMTg4LDYgKzExOTgsNyBAQAogCXN0b3JlX3RyYWNlX2FyZ3Moc2l6ZW9mKCplbnRyeSksICZ0ay0+dHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCXBlcmZfdHJhY2VfYnVmX3N1Ym1pdChlbnRyeSwgc2l6ZSwgcmN0eCwgMCwgMSwgcmVncywgaGVhZCwgTlVMTCk7CiB9CitOT0tQUk9CRV9TWU1CT0woa3JldHByb2JlX3BlcmZfZnVuYyk7CiAjZW5kaWYJLyogQ09ORklHX1BFUkZfRVZFTlRTICovCiAKIC8qCkBAIC0xMTk2LDkgKzEyMDcsOCBAQAogICoga3Byb2JlX3RyYWNlX3NlbGZfdGVzdHNfaW5pdCgpIGRvZXMgZW5hYmxlX3RyYWNlX3Byb2JlL2Rpc2FibGVfdHJhY2VfcHJvYmUKICAqIGxvY2tsZXNzLCBidXQgd2UgY2FuJ3QgcmFjZSB3aXRoIHRoaXMgX19pbml0IGZ1bmN0aW9uLgogICovCi1zdGF0aWMgX19rcHJvYmVzCi1pbnQga3Byb2JlX3JlZ2lzdGVyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnQsCi0JCSAgICBlbnVtIHRyYWNlX3JlZyB0eXBlLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBrcHJvYmVfcmVnaXN0ZXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudCwKKwkJCSAgIGVudW0gdHJhY2VfcmVnIHR5cGUsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHRyYWNlX2twcm9iZSAqdGsgPSAoc3RydWN0IHRyYWNlX2twcm9iZSAqKWV2ZW50LT5kYXRhOwogCXN0cnVjdCBmdHJhY2VfZXZlbnRfZmlsZSAqZmlsZSA9IGRhdGE7CkBAIC0xMjI0LDggKzEyMzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19rcHJvYmVzCi1pbnQga3Byb2JlX2Rpc3BhdGNoZXIoc3RydWN0IGtwcm9iZSAqa3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBrcHJvYmVfZGlzcGF0Y2hlcihzdHJ1Y3Qga3Byb2JlICprcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHRyYWNlX2twcm9iZSAqdGsgPSBjb250YWluZXJfb2Yoa3AsIHN0cnVjdCB0cmFjZV9rcHJvYmUsIHJwLmtwKTsKIApAQCAtMTIzOSw5ICsxMjQ4LDEwIEBACiAjZW5kaWYKIAlyZXR1cm4gMDsJLyogV2UgZG9uJ3QgdHdlZWsga2VybmVsLCBzbyBqdXN0IHJldHVybiAwICovCiB9CitOT0tQUk9CRV9TWU1CT0woa3Byb2JlX2Rpc3BhdGNoZXIpOwogCi1zdGF0aWMgX19rcHJvYmVzCi1pbnQga3JldHByb2JlX2Rpc3BhdGNoZXIoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludAora3JldHByb2JlX2Rpc3BhdGNoZXIoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrID0gY29udGFpbmVyX29mKHJpLT5ycCwgc3RydWN0IHRyYWNlX2twcm9iZSwgcnApOwogCkBAIC0xMjU1LDYgKzEyNjUsNyBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CS8qIFdlIGRvbid0IHR3ZWVrIGtlcm5lbCwgc28ganVzdCByZXR1cm4gMCAqLwogfQorTk9LUFJPQkVfU1lNQk9MKGtyZXRwcm9iZV9kaXNwYXRjaGVyKTsKIAogc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudF9mdW5jdGlvbnMga3JldHByb2JlX2Z1bmNzID0gewogCS50cmFjZQkJPSBwcmludF9rcmV0cHJvYmVfZXZlbnQKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKaW5kZXggODM2NGE0Mi4uZDRiOWZjMiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKQEAgLTM3LDEzICszNywxMyBAQAogCiAvKiBQcmludGluZyAgaW4gYmFzaWMgdHlwZSBmdW5jdGlvbiB0ZW1wbGF0ZSAqLwogI2RlZmluZSBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHR5cGUsIGZtdCkJCQkJXAotX19rcHJvYmVzIGludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLAlcCi0JCQkJCQljb25zdCBjaGFyICpuYW1lLAlcCi0JCQkJCQl2b2lkICpkYXRhLCB2b2lkICplbnQpCVwKK2ludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLAlcCisJCQkJdm9pZCAqZGF0YSwgdm9pZCAqZW50KQkJCVwKIHsJCQkJCQkJCQlcCiAJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiAlcz0iIGZtdCwgbmFtZSwgKih0eXBlICopZGF0YSk7CVwKIH0JCQkJCQkJCQlcCi1jb25zdCBjaGFyIFBSSU5UX1RZUEVfRk1UX05BTUUodHlwZSlbXSA9IGZtdDsKK2NvbnN0IGNoYXIgUFJJTlRfVFlQRV9GTVRfTkFNRSh0eXBlKVtdID0gZm10OwkJCQlcCitOT0tQUk9CRV9TWU1CT0woUFJJTlRfVFlQRV9GVU5DX05BTUUodHlwZSkpOwogCiBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHU4ICwgIjB4JXgiKQogREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1MTYsICIweCV4IikKQEAgLTU1LDkgKzU1LDggQEAKIERFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczY0LCAiJUxkIikKIAogLyogUHJpbnQgdHlwZSBmdW5jdGlvbiBmb3Igc3RyaW5nIHR5cGUgKi8KLV9fa3Byb2JlcyBpbnQgUFJJTlRfVFlQRV9GVU5DX05BTUUoc3RyaW5nKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLAotCQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICB2b2lkICpkYXRhLCB2b2lkICplbnQpCitpbnQgUFJJTlRfVFlQRV9GVU5DX05BTUUoc3RyaW5nKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSB2b2lkICpkYXRhLCB2b2lkICplbnQpCiB7CiAJaW50IGxlbiA9ICoodTMyICopZGF0YSA+PiAxNjsKIApAQCAtNjcsNiArNjYsNyBAQAogCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICVzPVwiJXNcIiIsIG5hbWUsCiAJCQkJCShjb25zdCBjaGFyICopZ2V0X2xvY19kYXRhKGRhdGEsIGVudCkpOwogfQorTk9LUFJPQkVfU1lNQk9MKFBSSU5UX1RZUEVfRlVOQ19OQU1FKHN0cmluZykpOwogCiBjb25zdCBjaGFyIFBSSU5UX1RZUEVfRk1UX05BTUUoc3RyaW5nKVtdID0gIlxcXCIlc1xcXCIiOwogCkBAIC04MSwyMyArODEsMjQgQEAKIAogLyogRGF0YSBmZXRjaCBmdW5jdGlvbiB0ZW1wbGF0ZXMgKi8KICNkZWZpbmUgREVGSU5FX0ZFVENIX3JlZyh0eXBlKQkJCQkJCVwKLV9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShyZWcsIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAkJXAotCQkJCQl2b2lkICpvZmZzZXQsIHZvaWQgKmRlc3QpCVwKK3ZvaWQgRkVUQ0hfRlVOQ19OQU1FKHJlZywgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdCkJXAogewkJCQkJCQkJCVwKIAkqKHR5cGUgKilkZXN0ID0gKHR5cGUpcmVnc19nZXRfcmVnaXN0ZXIocmVncywJCQlcCiAJCQkJKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSk7CVwKLX0KK30JCQkJCQkJCQlcCitOT0tQUk9CRV9TWU1CT0woRkVUQ0hfRlVOQ19OQU1FKHJlZywgdHlwZSkpOwogREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKHJlZykKIC8qIE5vIHN0cmluZyBvbiB0aGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgZmV0Y2hfcmVnX3N0cmluZwlOVUxMCiAjZGVmaW5lIGZldGNoX3JlZ19zdHJpbmdfc2l6ZQlOVUxMCiAKICNkZWZpbmUgREVGSU5FX0ZFVENIX3JldHZhbCh0eXBlKQkJCQkJXAotX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKHJldHZhbCwgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCVwKLQkJCQkJICB2b2lkICpkdW1teSwgdm9pZCAqZGVzdCkJXAordm9pZCBGRVRDSF9GVU5DX05BTUUocmV0dmFsLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJCVwKKwkJCQkgICB2b2lkICpkdW1teSwgdm9pZCAqZGVzdCkJCVwKIHsJCQkJCQkJCQlcCiAJKih0eXBlICopZGVzdCA9ICh0eXBlKXJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpOwkJCVwKLX0KK30JCQkJCQkJCQlcCitOT0tQUk9CRV9TWU1CT0woRkVUQ0hfRlVOQ19OQU1FKHJldHZhbCwgdHlwZSkpOwogREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKHJldHZhbCkKIC8qIE5vIHN0cmluZyBvbiB0aGUgcmV0dmFsICovCiAjZGVmaW5lIGZldGNoX3JldHZhbF9zdHJpbmcJCU5VTEwKQEAgLTExMiw4ICsxMTMsOCBAQAogfTsKIAogI2RlZmluZSBERUZJTkVfRkVUQ0hfZGVyZWYodHlwZSkJCQkJCVwKLV9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShkZXJlZiwgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCVwKLQkJCQkJICAgIHZvaWQgKmRhdGEsIHZvaWQgKmRlc3QpCVwKK3ZvaWQgRkVUQ0hfRlVOQ19OQU1FKGRlcmVmLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJCQlcCisJCQkJICB2b2lkICpkYXRhLCB2b2lkICpkZXN0KQkJXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3QgZGVyZWZfZmV0Y2hfcGFyYW0gKmRwcm0gPSBkYXRhOwkJCQlcCiAJdW5zaWduZWQgbG9uZyBhZGRyOwkJCQkJCVwKQEAgLTEyMywxMiArMTI0LDEzIEBACiAJCWRwcm0tPmZldGNoKHJlZ3MsICh2b2lkICopYWRkciwgZGVzdCk7CQkJXAogCX0gZWxzZQkJCQkJCQkJXAogCQkqKHR5cGUgKilkZXN0ID0gMDsJCQkJCVwKLX0KK30JCQkJCQkJCQlcCitOT0tQUk9CRV9TWU1CT0woRkVUQ0hfRlVOQ19OQU1FKGRlcmVmLCB0eXBlKSk7CiBERUZJTkVfQkFTSUNfRkVUQ0hfRlVOQ1MoZGVyZWYpCiBERUZJTkVfRkVUQ0hfZGVyZWYoc3RyaW5nKQogCi1fX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUoZGVyZWYsIHN0cmluZ19zaXplKShzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkJCSAgIHZvaWQgKmRhdGEsIHZvaWQgKmRlc3QpCit2b2lkIEZFVENIX0ZVTkNfTkFNRShkZXJlZiwgc3RyaW5nX3NpemUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgdm9pZCAqZGF0YSwgdm9pZCAqZGVzdCkKIHsKIAlzdHJ1Y3QgZGVyZWZfZmV0Y2hfcGFyYW0gKmRwcm0gPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTE0MCwxNiArMTQyLDE4IEBACiAJfSBlbHNlCiAJCSooc3RyaW5nX3NpemUgKilkZXN0ID0gMDsKIH0KK05PS1BST0JFX1NZTUJPTChGRVRDSF9GVU5DX05BTUUoZGVyZWYsIHN0cmluZ19zaXplKSk7CiAKLXN0YXRpYyBfX2twcm9iZXMgdm9pZCB1cGRhdGVfZGVyZWZfZmV0Y2hfcGFyYW0oc3RydWN0IGRlcmVmX2ZldGNoX3BhcmFtICpkYXRhKQorc3RhdGljIHZvaWQgdXBkYXRlX2RlcmVmX2ZldGNoX3BhcmFtKHN0cnVjdCBkZXJlZl9mZXRjaF9wYXJhbSAqZGF0YSkKIHsKIAlpZiAoQ0hFQ0tfRkVUQ0hfRlVOQ1MoZGVyZWYsIGRhdGEtPm9yaWcuZm4pKQogCQl1cGRhdGVfZGVyZWZfZmV0Y2hfcGFyYW0oZGF0YS0+b3JpZy5kYXRhKTsKIAllbHNlIGlmIChDSEVDS19GRVRDSF9GVU5DUyhzeW1ib2wsIGRhdGEtPm9yaWcuZm4pKQogCQl1cGRhdGVfc3ltYm9sX2NhY2hlKGRhdGEtPm9yaWcuZGF0YSk7CiB9CitOT0tQUk9CRV9TWU1CT0wodXBkYXRlX2RlcmVmX2ZldGNoX3BhcmFtKTsKIAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGZyZWVfZGVyZWZfZmV0Y2hfcGFyYW0oc3RydWN0IGRlcmVmX2ZldGNoX3BhcmFtICpkYXRhKQorc3RhdGljIHZvaWQgZnJlZV9kZXJlZl9mZXRjaF9wYXJhbShzdHJ1Y3QgZGVyZWZfZmV0Y2hfcGFyYW0gKmRhdGEpCiB7CiAJaWYgKENIRUNLX0ZFVENIX0ZVTkNTKGRlcmVmLCBkYXRhLT5vcmlnLmZuKSkKIAkJZnJlZV9kZXJlZl9mZXRjaF9wYXJhbShkYXRhLT5vcmlnLmRhdGEpOwpAQCAtMTU3LDYgKzE2MSw3IEBACiAJCWZyZWVfc3ltYm9sX2NhY2hlKGRhdGEtPm9yaWcuZGF0YSk7CiAJa2ZyZWUoZGF0YSk7CiB9CitOT0tQUk9CRV9TWU1CT0woZnJlZV9kZXJlZl9mZXRjaF9wYXJhbSk7CiAKIC8qIEJpdGZpZWxkIGZldGNoIGZ1bmN0aW9uICovCiBzdHJ1Y3QgYml0ZmllbGRfZmV0Y2hfcGFyYW0gewpAQCAtMTY2LDggKzE3MSw4IEBACiB9OwogCiAjZGVmaW5lIERFRklORV9GRVRDSF9iaXRmaWVsZCh0eXBlKQkJCQkJXAotX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKGJpdGZpZWxkLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJXAotCQkJCQkgICAgdm9pZCAqZGF0YSwgdm9pZCAqZGVzdCkJXAordm9pZCBGRVRDSF9GVU5DX05BTUUoYml0ZmllbGQsIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAkJXAorCQkJCSAgICAgdm9pZCAqZGF0YSwgdm9pZCAqZGVzdCkJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGJpdGZpZWxkX2ZldGNoX3BhcmFtICpicHJtID0gZGF0YTsJCQlcCiAJdHlwZSBidWYgPSAwOwkJCQkJCQlcCkBAIC0xNzcsMTMgKzE4MiwxMyBAQAogCQlidWYgPj49IGJwcm0tPmxvd19zaGlmdDsJCQkJXAogCX0JCQkJCQkJCVwKIAkqKHR5cGUgKilkZXN0ID0gYnVmOwkJCQkJCVwKLX0KLQorfQkJCQkJCQkJCVwKK05PS1BST0JFX1NZTUJPTChGRVRDSF9GVU5DX05BTUUoYml0ZmllbGQsIHR5cGUpKTsKIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhiaXRmaWVsZCkKICNkZWZpbmUgZmV0Y2hfYml0ZmllbGRfc3RyaW5nCQlOVUxMCiAjZGVmaW5lIGZldGNoX2JpdGZpZWxkX3N0cmluZ19zaXplCU5VTEwKIAotc3RhdGljIF9fa3Byb2JlcyB2b2lkCitzdGF0aWMgdm9pZAogdXBkYXRlX2JpdGZpZWxkX2ZldGNoX3BhcmFtKHN0cnVjdCBiaXRmaWVsZF9mZXRjaF9wYXJhbSAqZGF0YSkKIHsKIAkvKgpAQCAtMTk2LDcgKzIwMSw3IEBACiAJCXVwZGF0ZV9zeW1ib2xfY2FjaGUoZGF0YS0+b3JpZy5kYXRhKTsKIH0KIAotc3RhdGljIF9fa3Byb2JlcyB2b2lkCitzdGF0aWMgdm9pZAogZnJlZV9iaXRmaWVsZF9mZXRjaF9wYXJhbShzdHJ1Y3QgYml0ZmllbGRfZmV0Y2hfcGFyYW0gKmRhdGEpCiB7CiAJLyoKQEAgLTI1NSwxNyArMjYwLDE3IEBACiB9CiAKIC8qIFNwZWNpYWwgZnVuY3Rpb24gOiBvbmx5IGFjY2VwdCB1bnNpZ25lZCBsb25nICovCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgZmV0Y2hfa2VybmVsX3N0YWNrX2FkZHJlc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkgdm9pZCAqZHVtbXksIHZvaWQgKmRlc3QpCitzdGF0aWMgdm9pZCBmZXRjaF9rZXJuZWxfc3RhY2tfYWRkcmVzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqZHVtbXksIHZvaWQgKmRlc3QpCiB7CiAJKih1bnNpZ25lZCBsb25nICopZGVzdCA9IGtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwogfQorTk9LUFJPQkVfU1lNQk9MKGZldGNoX2tlcm5lbF9zdGFja19hZGRyZXNzKTsKIAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIGZldGNoX3VzZXJfc3RhY2tfYWRkcmVzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkJICAgICAgIHZvaWQgKmR1bW15LCB2b2lkICpkZXN0KQorc3RhdGljIHZvaWQgZmV0Y2hfdXNlcl9zdGFja19hZGRyZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICpkdW1teSwgdm9pZCAqZGVzdCkKIHsKIAkqKHVuc2lnbmVkIGxvbmcgKilkZXN0ID0gdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpOwogfQorTk9LUFJPQkVfU1lNQk9MKGZldGNoX3VzZXJfc3RhY2tfYWRkcmVzcyk7CiAKIHN0YXRpYyBmZXRjaF9mdW5jX3QgZ2V0X2ZldGNoX3NpemVfZnVuY3Rpb24oY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgKnR5cGUsCiAJCQkJCSAgICBmZXRjaF9mdW5jX3Qgb3JpZ19mbiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcm9iZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKaW5kZXggZmIxYWI1ZC4uNGY4MTVmYiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKQEAgLTgxLDEzICs4MSwxMyBAQAogICovCiAjZGVmaW5lIGNvbnZlcnRfcmxvY190b19sb2MoZGwsIG9mZnMpCSgodTMyKShkbCkgKyAob2ZmcykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3Jsb2NfZGF0YSh1MzIgKmRsKQorc3RhdGljIG5va3Byb2JlX2lubGluZSB2b2lkICpnZXRfcmxvY19kYXRhKHUzMiAqZGwpCiB7CiAJcmV0dXJuICh1OCAqKWRsICsgZ2V0X3Jsb2Nfb2ZmcygqZGwpOwogfQogCiAvKiBGb3IgZGF0YV9sb2MgY29udmVyc2lvbiAqLwotc3RhdGljIGlubGluZSB2b2lkICpnZXRfbG9jX2RhdGEodTMyICpkbCwgdm9pZCAqZW50KQorc3RhdGljIG5va3Byb2JlX2lubGluZSB2b2lkICpnZXRfbG9jX2RhdGEodTMyICpkbCwgdm9pZCAqZW50KQogewogCXJldHVybiAodTggKillbnQgKyBnZXRfcmxvY19vZmZzKCpkbCk7CiB9CkBAIC0xMzYsOSArMTM2LDggQEAKIAogLyogUHJpbnRpbmcgIGluIGJhc2ljIHR5cGUgZnVuY3Rpb24gdGVtcGxhdGUgKi8KICNkZWZpbmUgREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModHlwZSkJCQkJXAotX19rcHJvYmVzIGludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLAkJXAotCQkJCQkgY29uc3QgY2hhciAqbmFtZSwJCVwKLQkJCQkJIHZvaWQgKmRhdGEsIHZvaWQgKmVudCk7CVwKK2ludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLAlcCisJCQkJdm9pZCAqZGF0YSwgdm9pZCAqZW50KTsJCQlcCiBleHRlcm4gY29uc3QgY2hhciBQUklOVF9UWVBFX0ZNVF9OQU1FKHR5cGUpW10KIAogREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTgpOwpAQCAtMzAzLDcgKzMwMiw3IEBACiAJcmV0dXJuICEhKHRwLT5mbGFncyAmIFRQX0ZMQUdfUkVHSVNURVJFRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19rcHJvYmVzIHZvaWQgY2FsbF9mZXRjaChzdHJ1Y3QgZmV0Y2hfcGFyYW0gKmZwcm0sCitzdGF0aWMgbm9rcHJvYmVfaW5saW5lIHZvaWQgY2FsbF9mZXRjaChzdHJ1Y3QgZmV0Y2hfcGFyYW0gKmZwcm0sCiAJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICpkZXN0KQogewogCXJldHVybiBmcHJtLT5mbihyZWdzLCBmcHJtLT5kYXRhLCBkZXN0KTsKQEAgLTM1MSw3ICszNTAsNyBAQAogZXh0ZXJuIGludCB0cmFjZXByb2JlX2NvbW1hbmQoY29uc3QgY2hhciAqYnVmLCBpbnQgKCpjcmVhdGVmbikoaW50LCBjaGFyKiopKTsKIAogLyogU3VtIHVwIHRvdGFsIGRhdGEgbGVuZ3RoIGZvciBkeW5hbWljIGFycmFpZXMgKHN0cmluZ3MpICovCi1zdGF0aWMgaW5saW5lIF9fa3Byb2JlcyBpbnQKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgaW50CiBfX2dldF9kYXRhX3NpemUoc3RydWN0IHRyYWNlX3Byb2JlICp0cCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGksIHJldCA9IDA7CkBAIC0zNjcsNyArMzY2LDcgQEAKIH0KIAogLyogU3RvcmUgdGhlIHZhbHVlIG9mIGVhY2ggYXJndW1lbnQgKi8KLXN0YXRpYyBpbmxpbmUgX19rcHJvYmVzIHZvaWQKK3N0YXRpYyBub2twcm9iZV9pbmxpbmUgdm9pZAogc3RvcmVfdHJhY2VfYXJncyhpbnQgZW50X3NpemUsIHN0cnVjdCB0cmFjZV9wcm9iZSAqdHAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkgdTggKmRhdGEsIGludCBtYXhsZW4pCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMKaW5kZXggYzA4MmE3NC4uMDRmZGI1ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Vwcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYwpAQCAtMTA4LDggKzEwOCw4IEBACiAgKiBVcHJvYmVzLXNwZWNpZmljIGZldGNoIGZ1bmN0aW9ucwogICovCiAjZGVmaW5lIERFRklORV9GRVRDSF9zdGFjayh0eXBlKQkJCQkJXAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShzdGFjaywgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsXAotCQkJCQkgIHZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdCkJXAorc3RhdGljIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKHN0YWNrLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncywJCVwKKwkJCQkJIHZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdCkJXAogewkJCQkJCQkJCVwKIAkqKHR5cGUgKilkZXN0ID0gKHR5cGUpZ2V0X3VzZXJfc3RhY2tfbnRoKHJlZ3MsCQkJXAogCQkJCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSk7IFwKQEAgLTEyMCw4ICsxMjAsOCBAQAogI2RlZmluZSBmZXRjaF9zdGFja19zdHJpbmdfc2l6ZQlOVUxMCiAKICNkZWZpbmUgREVGSU5FX0ZFVENIX21lbW9yeSh0eXBlKQkJCQkJXAotc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLFwKLQkJCQkJCXZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpIFwKK3N0YXRpYyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAkJXAorCQkJCQkgIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCVwKIHsJCQkJCQkJCQlcCiAJdHlwZSByZXR2YWw7CQkJCQkJCVwKIAl2b2lkIF9fdXNlciAqdmFkZHIgPSAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKSBhZGRyOwkJXApAQCAtMTM2LDggKzEzNiw4IEBACiAgKiBGZXRjaCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIENhbGxlciBNVVNUIHNldCAqKHUzMiAqKWRlc3Qgd2l0aCBtYXgKICAqIGxlbmd0aCBhbmQgcmVsYXRpdmUgZGF0YSBsb2NhdGlvbi4KICAqLwotc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShtZW1vcnksIHN0cmluZykoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkgICAgICB2b2lkICphZGRyLCB2b2lkICpkZXN0KQorc3RhdGljIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nKShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJICAgIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCiB7CiAJbG9uZyByZXQ7CiAJdTMyIHJsb2MgPSAqKHUzMiAqKWRlc3Q7CkBAIC0xNTgsOCArMTU4LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBfX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUobWVtb3J5LCBzdHJpbmdfc2l6ZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkgICAgICB2b2lkICphZGRyLCB2b2lkICpkZXN0KQorc3RhdGljIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nX3NpemUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkJIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCiB7CiAJaW50IGxlbjsKIAl2b2lkIF9fdXNlciAqdmFkZHIgPSAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKSBhZGRyOwpAQCAtMTg0LDggKzE4NCw4IEBACiB9CiAKICNkZWZpbmUgREVGSU5FX0ZFVENIX2ZpbGVfb2Zmc2V0KHR5cGUpCQkJCQlcCi1zdGF0aWMgX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKGZpbGVfb2Zmc2V0LCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncyxcCi0JCQkJCXZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdCkgCVwKK3N0YXRpYyB2b2lkIEZFVENIX0ZVTkNfTkFNRShmaWxlX29mZnNldCwgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCVwKKwkJCQkJICAgICAgIHZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdClcCiB7CQkJCQkJCQkJXAogCXZvaWQgKnZhZGRyID0gKHZvaWQgKil0cmFuc2xhdGVfdXNlcl92YWRkcihvZmZzZXQpOwkJXAogCQkJCQkJCQkJXApAQCAtMTAwOSw5ICsxMDA5LDMyIEBACiAJcmV0dXJuIF9fdXByb2JlX3BlcmZfZmlsdGVyKCZ0dS0+ZmlsdGVyLCBldmVudC0+aHcudHBfdGFyZ2V0LT5tbSk7CiB9CiAKK3N0YXRpYyBpbnQgdXByb2JlX3BlcmZfY2xvc2Uoc3RydWN0IHRyYWNlX3Vwcm9iZSAqdHUsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlib29sIGRvbmU7CisKKwl3cml0ZV9sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7CisJaWYgKGV2ZW50LT5ody50cF90YXJnZXQpIHsKKwkJbGlzdF9kZWwoJmV2ZW50LT5ody50cF9saXN0KTsKKwkJZG9uZSA9IHR1LT5maWx0ZXIubnJfc3lzdGVtd2lkZSB8fAorCQkJKGV2ZW50LT5ody50cF90YXJnZXQtPmZsYWdzICYgUEZfRVhJVElORykgfHwKKwkJCXVwcm9iZV9maWx0ZXJfZXZlbnQodHUsIGV2ZW50KTsKKwl9IGVsc2UgeworCQl0dS0+ZmlsdGVyLm5yX3N5c3RlbXdpZGUtLTsKKwkJZG9uZSA9IHR1LT5maWx0ZXIubnJfc3lzdGVtd2lkZTsKKwl9CisJd3JpdGVfdW5sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7CisKKwlpZiAoIWRvbmUpCisJCXJldHVybiB1cHJvYmVfYXBwbHkodHUtPmlub2RlLCB0dS0+b2Zmc2V0LCAmdHUtPmNvbnN1bWVyLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB1cHJvYmVfcGVyZl9vcGVuKHN0cnVjdCB0cmFjZV91cHJvYmUgKnR1LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJYm9vbCBkb25lOworCWludCBlcnI7CiAKIAl3cml0ZV9sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7CiAJaWYgKGV2ZW50LT5ody50cF90YXJnZXQpIHsKQEAgLTEwMzMsMzIgKzEwNTYsMTMgQEAKIAl9CiAJd3JpdGVfdW5sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7CiAKLQlpZiAoIWRvbmUpCi0JCXVwcm9iZV9hcHBseSh0dS0+aW5vZGUsIHR1LT5vZmZzZXQsICZ0dS0+Y29uc3VtZXIsIHRydWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXByb2JlX3BlcmZfY2xvc2Uoc3RydWN0IHRyYWNlX3Vwcm9iZSAqdHUsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKLXsKLQlib29sIGRvbmU7Ci0KLQl3cml0ZV9sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7Ci0JaWYgKGV2ZW50LT5ody50cF90YXJnZXQpIHsKLQkJbGlzdF9kZWwoJmV2ZW50LT5ody50cF9saXN0KTsKLQkJZG9uZSA9IHR1LT5maWx0ZXIubnJfc3lzdGVtd2lkZSB8fAotCQkJKGV2ZW50LT5ody50cF90YXJnZXQtPmZsYWdzICYgUEZfRVhJVElORykgfHwKLQkJCXVwcm9iZV9maWx0ZXJfZXZlbnQodHUsIGV2ZW50KTsKLQl9IGVsc2UgewotCQl0dS0+ZmlsdGVyLm5yX3N5c3RlbXdpZGUtLTsKLQkJZG9uZSA9IHR1LT5maWx0ZXIubnJfc3lzdGVtd2lkZTsKKwllcnIgPSAwOworCWlmICghZG9uZSkgeworCQllcnIgPSB1cHJvYmVfYXBwbHkodHUtPmlub2RlLCB0dS0+b2Zmc2V0LCAmdHUtPmNvbnN1bWVyLCB0cnVlKTsKKwkJaWYgKGVycikKKwkJCXVwcm9iZV9wZXJmX2Nsb3NlKHR1LCBldmVudCk7CiAJfQotCXdyaXRlX3VubG9jaygmdHUtPmZpbHRlci5yd2xvY2spOwotCi0JaWYgKCFkb25lKQotCQl1cHJvYmVfYXBwbHkodHUtPmlub2RlLCB0dS0+b2Zmc2V0LCAmdHUtPmNvbnN1bWVyLCBmYWxzZSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgYm9vbCB1cHJvYmVfcGVyZl9maWx0ZXIoc3RydWN0IHVwcm9iZV9jb25zdW1lciAqdWMsCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDQ3NzFmYjMuLjMzNGY3NzIgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC0zMzEsNiArMzMxLDIwIEBACiBjb25maWcgQlRSRUUKIAlib29sZWFuCiAKK2NvbmZpZyBJTlRFUlZBTF9UUkVFCisJYm9vbGVhbgorCWhlbHAKKwkgIFNpbXBsZSwgZW1iZWRkYWJsZSwgaW50ZXJ2YWwtdHJlZS4gQ2FuIGZpbmQgdGhlIHN0YXJ0IG9mIGFuCisJICBvdmVybGFwcGluZyByYW5nZSBpbiBsb2cobikgdGltZSBhbmQgdGhlbiBpdGVyYXRlIG92ZXIgYWxsCisJICBvdmVybGFwcGluZyBub2Rlcy4gVGhlIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBhcyBhbgorCSAgYXVnbWVudGVkIHJidHJlZS4KKworCSAgU2VlOgorCisJCURvY3VtZW50YXRpb24vcmJ0cmVlLnR4dAorCisJICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwogY29uZmlnIEFTU09DSUFUSVZFX0FSUkFZCiAJYm9vbAogCWhlbHAKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggY2NjYTMyMi4uN2NmY2MxYiAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTE1MTEsNiArMTUxMSw3IEBACiBjb25maWcgSU5URVJWQUxfVFJFRV9URVNUCiAJdHJpc3RhdGUgIkludGVydmFsIHRyZWUgdGVzdCIKIAlkZXBlbmRzIG9uIG0gJiYgREVCVUdfS0VSTkVMCisJc2VsZWN0IElOVEVSVkFMX1RSRUUKIAloZWxwCiAJICBBIGJlbmNobWFyayBtZWFzdXJpbmcgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnRlcnZhbCB0cmVlIGxpYnJhcnkKIApAQCAtMTYzNSw2ICsxNjM2LDE5IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBURVNUX0JQRgorCXRyaXN0YXRlICJUZXN0IEJQRiBmaWx0ZXIgZnVuY3Rpb25hbGl0eSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIG0gJiYgTkVUCisJaGVscAorCSAgVGhpcyBidWlsZHMgdGhlICJ0ZXN0X2JwZiIgbW9kdWxlIHRoYXQgcnVucyB2YXJpb3VzIHRlc3QgdmVjdG9ycworCSAgYWdhaW5zdCB0aGUgQlBGIGludGVycHJldGVyIG9yIEJQRiBKSVQgY29tcGlsZXIgZGVwZW5kaW5nIG9uIHRoZQorCSAgY3VycmVudCBzZXR0aW5nLiBUaGlzIGlzIGluIHBhcnRpY3VsYXIgdXNlZnVsIGZvciBCUEYgSklUIGNvbXBpbGVyCisJICBkZXZlbG9wbWVudCwgYnV0IGFsc28gdG8gcnVuIHJlZ3Jlc3Npb24gdGVzdHMgYWdhaW5zdCBjaGFuZ2VzIGluCisJICB0aGUgaW50ZXJwcmV0ZXIgY29kZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogc291cmNlICJzYW1wbGVzL0tjb25maWciCiAKIHNvdXJjZSAibGliL0tjb25maWcua2dkYiIKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCA3NGEzMmRjLi5iYTk2N2ExIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0zMyw2ICszMyw3IEBACiBvYmotJChDT05GSUdfVEVTVF9LU1RSVE9YKSArPSB0ZXN0LWtzdHJ0b3gubwogb2JqLSQoQ09ORklHX1RFU1RfTU9EVUxFKSArPSB0ZXN0X21vZHVsZS5vCiBvYmotJChDT05GSUdfVEVTVF9VU0VSX0NPUFkpICs9IHRlc3RfdXNlcl9jb3B5Lm8KK29iai0kKENPTkZJR19URVNUX0JQRikgKz0gdGVzdF9icGYubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19LT0JKRUNUKSx5KQogQ0ZMQUdTX2tvYmplY3QubyArPSAtRERFQlVHCkBAIC01MCw2ICs1MSw3IEBACiBvYmotJChDT05GSUdfR0VORVJJQ19IV0VJR0hUKSArPSBod2VpZ2h0Lm8KIAogb2JqLSQoQ09ORklHX0JUUkVFKSArPSBidHJlZS5vCitvYmotJChDT05GSUdfSU5URVJWQUxfVFJFRSkgKz0gaW50ZXJ2YWxfdHJlZS5vCiBvYmotJChDT05GSUdfQVNTT0NJQVRJVkVfQVJSQVkpICs9IGFzc29jX2FycmF5Lm8KIG9iai0kKENPTkZJR19ERUJVR19QUkVFTVBUKSArPSBzbXBfcHJvY2Vzc29yX2lkLm8KIG9iai0kKENPTkZJR19ERUJVR19MSVNUKSArPSBsaXN0X2RlYnVnLm8KQEAgLTE1Nyw4ICsxNTksNiBAQAogb2JqLSQoQ09ORklHX1JCVFJFRV9URVNUKSArPSByYnRyZWVfdGVzdC5vCiBvYmotJChDT05GSUdfSU5URVJWQUxfVFJFRV9URVNUKSArPSBpbnRlcnZhbF90cmVlX3Rlc3QubwogCi1pbnRlcnZhbF90cmVlX3Rlc3Qtb2JqcyA6PSBpbnRlcnZhbF90cmVlX3Rlc3RfbWFpbi5vIGludGVydmFsX3RyZWUubwotCiBvYmotJChDT05GSUdfUEVSQ1BVX1RFU1QpICs9IHBlcmNwdV90ZXN0Lm8KIAogb2JqLSQoQ09ORklHX0FTTjEpICs9IGFzbjFfZGVjb2Rlci5vCmRpZmYgLS1naXQgYS9saWIvY3B1bWFzay5jIGIvbGliL2NwdW1hc2suYwppbmRleCBiODEwYjc1Li5jMTAxMjMwIDEwMDY0NAotLS0gYS9saWIvY3B1bWFzay5jCisrKyBiL2xpYi9jcHVtYXNrLmMKQEAgLTE2NCwzICsxNjQsNjYgQEAKIAltZW1ibG9ja19mcmVlX2Vhcmx5KF9fcGEobWFzayksIGNwdW1hc2tfc2l6ZSgpKTsKIH0KICNlbmRpZgorCisvKioKKyAqIGNwdW1hc2tfc2V0X2NwdV9sb2NhbF9maXJzdCAtIHNldCBpJ3RoIGNwdSB3aXRoIGxvY2FsIG51bWEgY3B1J3MgZmlyc3QKKyAqCisgKiBAaTogaW5kZXggbnVtYmVyCisgKiBAbnVtYV9ub2RlOiBsb2NhbCBudW1hX25vZGUKKyAqIEBkc3RwOiBjcHVtYXNrIHdpdGggdGhlIHJlbGV2YW50IGNwdSBiaXQgc2V0IGFjY29yZGluZyB0byB0aGUgcG9saWN5CisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjcHVtYXNrIGFjY29yZGluZyB0byBhIG51bWEgYXdhcmUgcG9saWN5LgorICogY3B1bWFzayBjb3VsZCBiZSB1c2VkIGFzIGFuIGFmZmluaXR5IGhpbnQgZm9yIHRoZSBJUlEgcmVsYXRlZCB0byBhCisgKiBxdWV1ZS4gV2hlbiB0aGUgcG9saWN5IGlzIHRvIHNwcmVhZCBxdWV1ZXMgYWNyb3NzIGNvcmVzIC0gbG9jYWwgY29yZXMKKyAqIGZpcnN0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGZvciBubyBtZW1vcnksIGFuZCAtRUFHQUlOIHdoZW4gZmFpbGVkIHRvIHNldAorICogdGhlIGNwdSBiaXQgYW5kIG5lZWQgdG8gcmUtY2FsbCB0aGUgZnVuY3Rpb24uCisgKi8KK2ludCBjcHVtYXNrX3NldF9jcHVfbG9jYWxfZmlyc3QoaW50IGksIGludCBudW1hX25vZGUsIGNwdW1hc2tfdCAqZHN0cCkKK3sKKwljcHVtYXNrX3Zhcl90IG1hc2s7CisJaW50IGNwdTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZtYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpICU9IG51bV9vbmxpbmVfY3B1cygpOworCisJaWYgKCFjcHVtYXNrX29mX25vZGUobnVtYV9ub2RlKSkgeworCQkvKiBVc2UgYWxsIG9ubGluZSBjcHUncyBmb3Igbm9uIG51bWEgYXdhcmUgc3lzdGVtICovCisJCWNwdW1hc2tfY29weShtYXNrLCBjcHVfb25saW5lX21hc2spOworCX0gZWxzZSB7CisJCWludCBuOworCisJCWNwdW1hc2tfYW5kKG1hc2ssCisJCQkgICAgY3B1bWFza19vZl9ub2RlKG51bWFfbm9kZSksIGNwdV9vbmxpbmVfbWFzayk7CisKKwkJbiA9IGNwdW1hc2tfd2VpZ2h0KG1hc2spOworCQlpZiAoaSA+PSBuKSB7CisJCQlpIC09IG47CisKKwkJCS8qIElmIGluZGV4ID4gbnVtYmVyIG9mIGxvY2FsIGNwdSdzLCBtYXNrIG91dCBsb2NhbAorCQkJICogY3B1J3MKKwkJCSAqLworCQkJY3B1bWFza19hbmRub3QobWFzaywgY3B1X29ubGluZV9tYXNrLCBtYXNrKTsKKwkJfQorCX0KKworCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKKwkJaWYgKC0taSA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAtRUFHQUlOOworCitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKKworCWlmICghcmV0KQorCQljcHVtYXNrX3NldF9jcHUoY3B1LCBkc3RwKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNwdW1hc2tfc2V0X2NwdV9sb2NhbF9maXJzdCk7CmRpZmYgLS1naXQgYS9saWIvY3JjNy5jIGIvbGliL2NyYzcuYwppbmRleCBmMWMzYTE0Li5iZjYyNTVlIDEwMDY0NAotLS0gYS9saWIvY3JjNy5jCisrKyBiL2xpYi9jcmM3LmMKQEAgLTEwLDQyICsxMCw0NyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzcuaD4KIAogCi0vKiBUYWJsZSBmb3IgQ1JDLTcgKHBvbHlub21pYWwgeF43ICsgeF4zICsgMSkgKi8KLWNvbnN0IHU4IGNyYzdfc3luZHJvbWVfdGFibGVbMjU2XSA9IHsKLQkweDAwLCAweDA5LCAweDEyLCAweDFiLCAweDI0LCAweDJkLCAweDM2LCAweDNmLAotCTB4NDgsIDB4NDEsIDB4NWEsIDB4NTMsIDB4NmMsIDB4NjUsIDB4N2UsIDB4NzcsCi0JMHgxOSwgMHgxMCwgMHgwYiwgMHgwMiwgMHgzZCwgMHgzNCwgMHgyZiwgMHgyNiwKLQkweDUxLCAweDU4LCAweDQzLCAweDRhLCAweDc1LCAweDdjLCAweDY3LCAweDZlLAotCTB4MzIsIDB4M2IsIDB4MjAsIDB4MjksIDB4MTYsIDB4MWYsIDB4MDQsIDB4MGQsCi0JMHg3YSwgMHg3MywgMHg2OCwgMHg2MSwgMHg1ZSwgMHg1NywgMHg0YywgMHg0NSwKLQkweDJiLCAweDIyLCAweDM5LCAweDMwLCAweDBmLCAweDA2LCAweDFkLCAweDE0LAotCTB4NjMsIDB4NmEsIDB4NzEsIDB4NzgsIDB4NDcsIDB4NGUsIDB4NTUsIDB4NWMsCi0JMHg2NCwgMHg2ZCwgMHg3NiwgMHg3ZiwgMHg0MCwgMHg0OSwgMHg1MiwgMHg1YiwKLQkweDJjLCAweDI1LCAweDNlLCAweDM3LCAweDA4LCAweDAxLCAweDFhLCAweDEzLAotCTB4N2QsIDB4NzQsIDB4NmYsIDB4NjYsIDB4NTksIDB4NTAsIDB4NGIsIDB4NDIsCi0JMHgzNSwgMHgzYywgMHgyNywgMHgyZSwgMHgxMSwgMHgxOCwgMHgwMywgMHgwYSwKLQkweDU2LCAweDVmLCAweDQ0LCAweDRkLCAweDcyLCAweDdiLCAweDYwLCAweDY5LAotCTB4MWUsIDB4MTcsIDB4MGMsIDB4MDUsIDB4M2EsIDB4MzMsIDB4MjgsIDB4MjEsCi0JMHg0ZiwgMHg0NiwgMHg1ZCwgMHg1NCwgMHg2YiwgMHg2MiwgMHg3OSwgMHg3MCwKLQkweDA3LCAweDBlLCAweDE1LCAweDFjLCAweDIzLCAweDJhLCAweDMxLCAweDM4LAotCTB4NDEsIDB4NDgsIDB4NTMsIDB4NWEsIDB4NjUsIDB4NmMsIDB4NzcsIDB4N2UsCi0JMHgwOSwgMHgwMCwgMHgxYiwgMHgxMiwgMHgyZCwgMHgyNCwgMHgzZiwgMHgzNiwKLQkweDU4LCAweDUxLCAweDRhLCAweDQzLCAweDdjLCAweDc1LCAweDZlLCAweDY3LAotCTB4MTAsIDB4MTksIDB4MDIsIDB4MGIsIDB4MzQsIDB4M2QsIDB4MjYsIDB4MmYsCi0JMHg3MywgMHg3YSwgMHg2MSwgMHg2OCwgMHg1NywgMHg1ZSwgMHg0NSwgMHg0YywKLQkweDNiLCAweDMyLCAweDI5LCAweDIwLCAweDFmLCAweDE2LCAweDBkLCAweDA0LAotCTB4NmEsIDB4NjMsIDB4NzgsIDB4NzEsIDB4NGUsIDB4NDcsIDB4NWMsIDB4NTUsCi0JMHgyMiwgMHgyYiwgMHgzMCwgMHgzOSwgMHgwNiwgMHgwZiwgMHgxNCwgMHgxZCwKLQkweDI1LCAweDJjLCAweDM3LCAweDNlLCAweDAxLCAweDA4LCAweDEzLCAweDFhLAotCTB4NmQsIDB4NjQsIDB4N2YsIDB4NzYsIDB4NDksIDB4NDAsIDB4NWIsIDB4NTIsCi0JMHgzYywgMHgzNSwgMHgyZSwgMHgyNywgMHgxOCwgMHgxMSwgMHgwYSwgMHgwMywKLQkweDc0LCAweDdkLCAweDY2LCAweDZmLCAweDUwLCAweDU5LCAweDQyLCAweDRiLAotCTB4MTcsIDB4MWUsIDB4MDUsIDB4MGMsIDB4MzMsIDB4M2EsIDB4MjEsIDB4MjgsCi0JMHg1ZiwgMHg1NiwgMHg0ZCwgMHg0NCwgMHg3YiwgMHg3MiwgMHg2OSwgMHg2MCwKLQkweDBlLCAweDA3LCAweDFjLCAweDE1LCAweDJhLCAweDIzLCAweDM4LCAweDMxLAotCTB4NDYsIDB4NGYsIDB4NTQsIDB4NWQsIDB4NjIsIDB4NmIsIDB4NzAsIDB4NzkKKy8qCisgKiBUYWJsZSBmb3IgQ1JDLTcgKHBvbHlub21pYWwgeF43ICsgeF4zICsgMSkuCisgKiBUaGlzIGlzIGEgYmlnLWVuZGlhbiBDUkMgKG1zYml0IGlzIGhpZ2hlc3QgcG93ZXIgb2YgeCksCisgKiBhbGlnbmVkIHNvIHRoZSBtc2JpdCBvZiB0aGUgYnl0ZSBpcyB0aGUgeF42IGNvZWZmaWNpZW50CisgKiBhbmQgdGhlIGxzYml0IGlzIG5vdCB1c2VkLgorICovCitjb25zdCB1OCBjcmM3X2JlX3N5bmRyb21lX3RhYmxlWzI1Nl0gPSB7CisJMHgwMCwgMHgxMiwgMHgyNCwgMHgzNiwgMHg0OCwgMHg1YSwgMHg2YywgMHg3ZSwKKwkweDkwLCAweDgyLCAweGI0LCAweGE2LCAweGQ4LCAweGNhLCAweGZjLCAweGVlLAorCTB4MzIsIDB4MjAsIDB4MTYsIDB4MDQsIDB4N2EsIDB4NjgsIDB4NWUsIDB4NGMsCisJMHhhMiwgMHhiMCwgMHg4NiwgMHg5NCwgMHhlYSwgMHhmOCwgMHhjZSwgMHhkYywKKwkweDY0LCAweDc2LCAweDQwLCAweDUyLCAweDJjLCAweDNlLCAweDA4LCAweDFhLAorCTB4ZjQsIDB4ZTYsIDB4ZDAsIDB4YzIsIDB4YmMsIDB4YWUsIDB4OTgsIDB4OGEsCisJMHg1NiwgMHg0NCwgMHg3MiwgMHg2MCwgMHgxZSwgMHgwYywgMHgzYSwgMHgyOCwKKwkweGM2LCAweGQ0LCAweGUyLCAweGYwLCAweDhlLCAweDljLCAweGFhLCAweGI4LAorCTB4YzgsIDB4ZGEsIDB4ZWMsIDB4ZmUsIDB4ODAsIDB4OTIsIDB4YTQsIDB4YjYsCisJMHg1OCwgMHg0YSwgMHg3YywgMHg2ZSwgMHgxMCwgMHgwMiwgMHgzNCwgMHgyNiwKKwkweGZhLCAweGU4LCAweGRlLCAweGNjLCAweGIyLCAweGEwLCAweDk2LCAweDg0LAorCTB4NmEsIDB4NzgsIDB4NGUsIDB4NWMsIDB4MjIsIDB4MzAsIDB4MDYsIDB4MTQsCisJMHhhYywgMHhiZSwgMHg4OCwgMHg5YSwgMHhlNCwgMHhmNiwgMHhjMCwgMHhkMiwKKwkweDNjLCAweDJlLCAweDE4LCAweDBhLCAweDc0LCAweDY2LCAweDUwLCAweDQyLAorCTB4OWUsIDB4OGMsIDB4YmEsIDB4YTgsIDB4ZDYsIDB4YzQsIDB4ZjIsIDB4ZTAsCisJMHgwZSwgMHgxYywgMHgyYSwgMHgzOCwgMHg0NiwgMHg1NCwgMHg2MiwgMHg3MCwKKwkweDgyLCAweDkwLCAweGE2LCAweGI0LCAweGNhLCAweGQ4LCAweGVlLCAweGZjLAorCTB4MTIsIDB4MDAsIDB4MzYsIDB4MjQsIDB4NWEsIDB4NDgsIDB4N2UsIDB4NmMsCisJMHhiMCwgMHhhMiwgMHg5NCwgMHg4NiwgMHhmOCwgMHhlYSwgMHhkYywgMHhjZSwKKwkweDIwLCAweDMyLCAweDA0LCAweDE2LCAweDY4LCAweDdhLCAweDRjLCAweDVlLAorCTB4ZTYsIDB4ZjQsIDB4YzIsIDB4ZDAsIDB4YWUsIDB4YmMsIDB4OGEsIDB4OTgsCisJMHg3NiwgMHg2NCwgMHg1MiwgMHg0MCwgMHgzZSwgMHgyYywgMHgxYSwgMHgwOCwKKwkweGQ0LCAweGM2LCAweGYwLCAweGUyLCAweDljLCAweDhlLCAweGI4LCAweGFhLAorCTB4NDQsIDB4NTYsIDB4NjAsIDB4NzIsIDB4MGMsIDB4MWUsIDB4MjgsIDB4M2EsCisJMHg0YSwgMHg1OCwgMHg2ZSwgMHg3YywgMHgwMiwgMHgxMCwgMHgyNiwgMHgzNCwKKwkweGRhLCAweGM4LCAweGZlLCAweGVjLCAweDkyLCAweDgwLCAweGI2LCAweGE0LAorCTB4NzgsIDB4NmEsIDB4NWMsIDB4NGUsIDB4MzAsIDB4MjIsIDB4MTQsIDB4MDYsCisJMHhlOCwgMHhmYSwgMHhjYywgMHhkZSwgMHhhMCwgMHhiMiwgMHg4NCwgMHg5NiwKKwkweDJlLCAweDNjLCAweDBhLCAweDE4LCAweDY2LCAweDc0LCAweDQyLCAweDUwLAorCTB4YmUsIDB4YWMsIDB4OWEsIDB4ODgsIDB4ZjYsIDB4ZTQsIDB4ZDIsIDB4YzAsCisJMHgxYywgMHgwZSwgMHgzOCwgMHgyYSwgMHg1NCwgMHg0NiwgMHg3MCwgMHg2MiwKKwkweDhjLCAweDllLCAweGE4LCAweGJhLCAweGM0LCAweGQ2LCAweGUwLCAweGYyCiB9OwotRVhQT1JUX1NZTUJPTChjcmM3X3N5bmRyb21lX3RhYmxlKTsKK0VYUE9SVF9TWU1CT0woY3JjN19iZV9zeW5kcm9tZV90YWJsZSk7CiAKIC8qKgogICogY3JjNyAtIHVwZGF0ZSB0aGUgQ1JDNyBmb3IgdGhlIGRhdGEgYnVmZmVyCkBAIC01NSwxNCArNjAsMTcgQEAKICAqIENvbnRleHQ6IGFueQogICoKICAqIFJldHVybnMgdGhlIHVwZGF0ZWQgQ1JDNyB2YWx1ZS4KKyAqIFRoZSBDUkM3IGlzIGxlZnQtYWxpZ25lZCBpbiB0aGUgYnl0ZSAodGhlIGxzYml0IGlzIGFsd2F5cyAwKSwgYXMgdGhhdAorICogbWFrZXMgdGhlIGNvbXB1dGF0aW9uIGVhc2llciwgYW5kIGFsbCBjYWxsZXJzIHdhbnQgaXQgaW4gdGhhdCBmb3JtLgorICoKICAqLwotdTggY3JjNyh1OCBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pCit1OCBjcmM3X2JlKHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbikKIHsKIAl3aGlsZSAobGVuLS0pCi0JCWNyYyA9IGNyYzdfYnl0ZShjcmMsICpidWZmZXIrKyk7CisJCWNyYyA9IGNyYzdfYmVfYnl0ZShjcmMsICpidWZmZXIrKyk7CiAJcmV0dXJuIGNyYzsKIH0KLUVYUE9SVF9TWU1CT0woY3JjNyk7CitFWFBPUlRfU1lNQk9MKGNyYzdfYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzcgY2FsY3VsYXRpb25zIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9saWIvaW50ZXJ2YWxfdHJlZS5jIGIvbGliL2ludGVydmFsX3RyZWUuYwppbmRleCBlNmViNDA2Li5mMzY3ZjlhIDEwMDY0NAotLS0gYS9saWIvaW50ZXJ2YWxfdHJlZS5jCisrKyBiL2xpYi9pbnRlcnZhbF90cmVlLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVydmFsX3RyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnZhbF90cmVlX2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBTVEFSVChub2RlKSAoKG5vZGUpLT5zdGFydCkKICNkZWZpbmUgTEFTVChub2RlKSAgKChub2RlKS0+bGFzdCkKQEAgLTgsMyArOSw4IEBACiBJTlRFUlZBTF9UUkVFX0RFRklORShzdHJ1Y3QgaW50ZXJ2YWxfdHJlZV9ub2RlLCByYiwKIAkJICAgICB1bnNpZ25lZCBsb25nLCBfX3N1YnRyZWVfbGFzdCwKIAkJICAgICBTVEFSVCwgTEFTVCwsIGludGVydmFsX3RyZWUpCisKK0VYUE9SVF9TWU1CT0xfR1BMKGludGVydmFsX3RyZWVfaW5zZXJ0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGludGVydmFsX3RyZWVfcmVtb3ZlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGludGVydmFsX3RyZWVfaXRlcl9maXJzdCk7CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlcnZhbF90cmVlX2l0ZXJfbmV4dCk7CmRpZmYgLS1naXQgYS9saWIvaW50ZXJ2YWxfdHJlZV90ZXN0X21haW4uYyBiL2xpYi9pbnRlcnZhbF90cmVlX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2ludGVydmFsX3RyZWVfdGVzdF9tYWluLmMKcmVuYW1lIHRvIGxpYi9pbnRlcnZhbF90cmVlX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvbGliL3Rlc3RfYnBmLmMgYi9saWIvdGVzdF9icGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTc5ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3Rlc3RfYnBmLmMKQEAgLTAsMCArMSwxOTI5IEBACisvKgorICogVGVzdHN1aXRlIGZvciBCUEYgaW50ZXJwcmV0ZXIgYW5kIEJQRiBKSVQgY29tcGlsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKy8qIEdlbmVyYWwgdGVzdCBzcGVjaWZpYyBzZXR0aW5ncyAqLworI2RlZmluZSBNQVhfU1VCVEVTVFMJMworI2RlZmluZSBNQVhfVEVTVFJVTlMJMTAwMDAKKyNkZWZpbmUgTUFYX0RBVEEJMTI4CisjZGVmaW5lIE1BWF9JTlNOUwk1MTIKKyNkZWZpbmUgTUFYX0sJCTB4ZmZmZkZGRkYKKworLyogRmV3IGNvbnN0YW50cyB1c2VkIHRvIGluaXQgdGVzdCAnc2tiJyAqLworI2RlZmluZSBTS0JfVFlQRQkzCisjZGVmaW5lIFNLQl9NQVJLCTB4MTIzNGFhYWEKKyNkZWZpbmUgU0tCX0hBU0gJMHgxMjM0YWFhYgorI2RlZmluZSBTS0JfUVVFVUVfTUFQCTEyMworI2RlZmluZSBTS0JfVkxBTl9UQ0kJMHhmZmZmCisjZGVmaW5lIFNLQl9ERVZfSUZJTkRFWAk1NzcKKyNkZWZpbmUgU0tCX0RFVl9UWVBFCTU4OAorCisvKiBSZWRlZmluZSBSRUdzIHRvIG1ha2UgdGVzdHMgbGVzcyB2ZXJib3NlICovCisjZGVmaW5lIFIwCQlCUEZfUkVHXzAKKyNkZWZpbmUgUjEJCUJQRl9SRUdfMQorI2RlZmluZSBSMgkJQlBGX1JFR18yCisjZGVmaW5lIFIzCQlCUEZfUkVHXzMKKyNkZWZpbmUgUjQJCUJQRl9SRUdfNAorI2RlZmluZSBSNQkJQlBGX1JFR181CisjZGVmaW5lIFI2CQlCUEZfUkVHXzYKKyNkZWZpbmUgUjcJCUJQRl9SRUdfNworI2RlZmluZSBSOAkJQlBGX1JFR184CisjZGVmaW5lIFI5CQlCUEZfUkVHXzkKKyNkZWZpbmUgUjEwCQlCUEZfUkVHXzEwCisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0ZXN0IGNhc2VzICovCisjZGVmaW5lIEZMQUdfTk9fREFUQQkJQklUKDApCisjZGVmaW5lIEZMQUdfRVhQRUNURURfRkFJTAlCSVQoMSkKKworZW51bSB7CisJQ0xBU1NJQyAgPSBCSVQoNiksCS8qIE9sZCBCUEYgaW5zdHJ1Y3Rpb25zIG9ubHkuICovCisJSU5URVJOQUwgPSBCSVQoNyksCS8qIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldC4gICovCit9OworCisjZGVmaW5lIFRFU1RfVFlQRV9NQVNLCQkoQ0xBU1NJQyB8IElOVEVSTkFMKQorCitzdHJ1Y3QgYnBmX3Rlc3QgeworCWNvbnN0IGNoYXIgKmRlc2NyOworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2tfZmlsdGVyIGluc25zW01BWF9JTlNOU107CisJCXN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQgaW5zbnNfaW50W01BWF9JTlNOU107CisJfSB1OworCV9fdTggYXV4OworCV9fdTggZGF0YVtNQVhfREFUQV07CisJc3RydWN0IHsKKwkJaW50IGRhdGFfc2l6ZTsKKwkJX191MzIgcmVzdWx0OworCX0gdGVzdFtNQVhfU1VCVEVTVFNdOworfTsKKworc3RhdGljIHN0cnVjdCBicGZfdGVzdCB0ZXN0c1tdID0geworCXsKKwkJIlRBWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTkVHLCAwKSwgLyogQSA9PSAtMyAqLworCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLCAvKiBYID09IGxlbiAtIDMgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMTAsIDIwLCAzMCwgNDAsIDUwIH0sCisJCXsgeyAyLCAxMCB9LCB7IDMsIDIwIH0sIHsgNCwgMzAgfSB9LAorCX0sCisJeworCQkiVFhBIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0xFTiwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApIC8qIEEgPT0gbGVuICogMiAqLworCQl9LAorCQlDTEFTU0lDLAorCQl7IDEwLCAyMCwgMzAsIDQwLCA1MCB9LAorCQl7IHsgMSwgMiB9LCB7IDMsIDYgfSwgeyA0LCA4IH0gfSwKKwl9LAorCXsKKwkJIkFERF9TVUJfTVVMX0siLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMyksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDB4ZmZmZmZmZmYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSywgMyksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmQgfSB9CisJfSwKKwl7CisJCSJESVZfS1giLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDgpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfSywgMiksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHhmZmZmZmZmZiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX0ssIDB4NzAwMDAwMDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDB4NDAwMDAwMDEgfSB9CisJfSwKKwl7CisJCSJBTkRfT1JfTFNIX0siLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDB4ZmYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSywgMHhmMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LLCAyNyksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHhmKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfSywgMHhmMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHg4MDAwMDBmZiB9LCB7IDEsIDB4ODAwMDAwZmYgfSB9LAorCX0sCisJeworCQkiTERfSU1NXzAiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDApLCAvKiBsZCAjMCAqLworCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMCwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMSB9IH0sCisJfSwKKwl7CisJCSJMRF9JTkQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORCwgTUFYX0spLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAwIH0sIHsgMTAsIDAgfSwgeyA2MCwgMCB9IH0sCisJfSwKKwl7CisJCSJMRF9BQlMiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywgMTAwMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDEsIDAgfSwgeyAxMCwgMCB9LCB7IDYwLCAwIH0gfSwKKwl9LAorCXsKKwkJIkxEX0FCU19MTCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCBTS0ZfTExfT0ZGKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIFNLRl9MTF9PRkYgKyAxKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IDEsIDIsIDMgfSwKKwkJeyB7IDEsIDAgfSwgeyAyLCAzIH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORF9MTCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgU0tGX0xMX09GRiAtIDEpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfSU5ELCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAxLCAyLCAzLCAweGZmIH0sCisJCXsgeyAxLCAxIH0sIHsgMywgMyB9LCB7IDQsIDB4ZmYgfSB9LAorCX0sCisJeworCQkiTERfQUJTX05FVCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCBTS0ZfTkVUX09GRiksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCBTS0ZfTkVUX09GRiArIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMyB9LAorCQl7IHsgMTUsIDAgfSwgeyAxNiwgMyB9IH0sCisJfSwKKwl7CisJCSJMRF9JTkRfTkVUIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCBTS0ZfTkVUX09GRiAtIDE1KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMyB9LAorCQl7IHsgMTQsIDAgfSwgeyAxNSwgMSB9LCB7IDE3LCAzIH0gfSwKKwl9LAorCXsKKwkJIkxEX1BLVFRZUEUiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QS1RUWVBFKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIFNLQl9UWVBFLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCBTS0JfVFlQRSwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1BLVFRZUEUpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgU0tCX1RZUEUsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMyB9LCB7IDEwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkxEX01BUksiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9NQVJLKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgU0tCX01BUkt9LCB7IDEwLCBTS0JfTUFSS30gfSwKKwl9LAorCXsKKwkJIkxEX1JYSEFTSCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1JYSEFTSCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDEsIFNLQl9IQVNIfSwgeyAxMCwgU0tCX0hBU0h9IH0sCisJfSwKKwl7CisJCSJMRF9RVUVVRSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1FVRVVFKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgU0tCX1FVRVVFX01BUCB9LCB7IDEwLCBTS0JfUVVFVUVfTUFQIH0gfSwKKwl9LAorCXsKKwkJIkxEX1BST1RPQ09MIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDEpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMjAsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QUk9UT0NPTCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDMwLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IDEwLCAyMCwgMzAgfSwKKwkJeyB7IDEwLCBFVEhfUF9JUCB9LCB7IDEwMCwgRVRIX1BfSVAgfSB9LAorCX0sCisJeworCQkiTERfVkxBTl9UQUciLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RBRyksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeworCQkJeyAxLCBTS0JfVkxBTl9UQ0kgJiB+VkxBTl9UQUdfUFJFU0VOVCB9LAorCQkJeyAxMCwgU0tCX1ZMQU5fVENJICYgflZMQU5fVEFHX1BSRVNFTlQgfQorCQl9LAorCX0sCisJeworCQkiTERfVkxBTl9UQUdfUFJFU0VOVCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsKKwkJCXsgMSwgISEoU0tCX1ZMQU5fVENJICYgVkxBTl9UQUdfUFJFU0VOVCkgfSwKKwkJCXsgMTAsICEhKFNLQl9WTEFOX1RDSSAmIFZMQU5fVEFHX1BSRVNFTlQpIH0KKwkJfSwKKwl9LAorCXsKKwkJIkxEX0lGSU5ERVgiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9JRklOREVYKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgU0tCX0RFVl9JRklOREVYIH0sIHsgMTAsIFNLQl9ERVZfSUZJTkRFWCB9IH0sCisJfSwKKwl7CisJCSJMRF9IQVRZUEUiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9IQVRZUEUpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCBTS0JfREVWX1RZUEUgfSwgeyAxMCwgU0tCX0RFVl9UWVBFIH0gfSwKKwl9LAorCXsKKwkJIkxEX0NQVSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX0NQVSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX0NQVSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMCB9LCB7IDEwLCAwIH0gfSwKKwl9LAorCXsKKwkJIkxEX05MQVRUUiIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAzKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9OTEFUVFIpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorI2lmZGVmIF9fQklHX0VORElBTgorCQl7IDB4ZmYsIDB4ZmYsIDAsIDQsIDAsIDIsIDAsIDQsIDAsIDMgfSwKKyNlbHNlCisJCXsgMHhmZiwgMHhmZiwgNCwgMCwgMiwgMCwgNCwgMCwgMywgMCB9LAorI2VuZGlmCisJCXsgeyA0LCAwIH0sIHsgMjAsIDYgfSB9LAorCX0sCisJeworCQkiTERfTkxBVFRSX05FU1QiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDMpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUl9ORVNUKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJeyAweGZmLCAweGZmLCAwLCAxMiwgMCwgMSwgMCwgNCwgMCwgMiwgMCwgNCwgMCwgMyB9LAorI2Vsc2UKKwkJeyAweGZmLCAweGZmLCAxMiwgMCwgMSwgMCwgNCwgMCwgMiwgMCwgNCwgMCwgMywgMCB9LAorI2VuZGlmCisJCXsgeyA0LCAwIH0sIHsgMjAsIDEwIH0gfSwKKwl9LAorCXsKKwkJIkxEX1BBWUxPQURfT0ZGIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCS8qIDAwOjAwOjAwOjAwOjAwOjAwID4gMDA6MDA6MDA6MDA6MDA6MDAsIGV0aHR5cGUgSVB2NCAoMHgwODAwKSwKKwkJICogbGVuZ3RoIDk4OiAxMjcuMC4wLjEgPiAxMjcuMC4wLjE6IElDTVAgZWNobyByZXF1ZXN0LAorCQkgKiBpZCA5NzM3LCBzZXEgMSwgbGVuZ3RoIDY0CisJCSAqLworCQl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJICAweDA4LCAweDAwLAorCQkgIDB4NDUsIDB4MDAsIDB4MDAsIDB4NTQsIDB4YWMsIDB4OGIsIDB4NDAsIDB4MDAsIDB4NDAsCisJCSAgMHgwMSwgMHg5MCwgMHgxYiwgMHg3ZiwgMHgwMCwgMHgwMCwgMHgwMSB9LAorCQl7IHsgMzAsIDAgfSwgeyAxMDAsIDQyIH0gfSwKKwl9LAorCXsKKwkJIkxEX0FOQ19YT1IiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDEwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAzMDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX0FMVV9YT1JfWCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDQsIDEwIF4gMzAwIH0sIHsgMjAsIDEwIF4gMzAwIH0gfSwKKwl9LAorCXsKKwkJIlNQSUxMX0ZJTEwiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9SU0gsIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfU1QsIDEpLCAvKiBNMSA9IDEgXiBsZW4gKi8KKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX0ssIDB4ODAwMDAwMDApLAorCQkJQlBGX1NUTVQoQlBGX1NULCAyKSwgLyogTTIgPSAxIF4gbGVuIF4gMHg4MDAwMDAwMCAqLworCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTUpLCAvKiBNMyA9IGxlbiAqLworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX01FTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAxNSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMHg4MDAwMDAwMSB9LCB7IDIsIDB4ODAwMDAwMDIgfSwgeyA2MCwgMHg4MDAwMDAwMCBeIDYwIH0gfQorCX0sCisJeworCQkiSkVRIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0xFTiwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWCwgMCwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCBNQVhfSykKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAzLCAzLCAzLCAzLCAzIH0sCisJCXsgeyAxLCAwIH0sIHsgMywgMSB9LCB7IDQsIE1BWF9LIH0gfSwKKwl9LAorCXsKKwkJIkpHVCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1gsIDAsIDAsIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgTUFYX0spCisJCX0sCisJCUNMQVNTSUMsCisJCXsgNCwgNCwgNCwgMywgMyB9LAorCQl7IHsgMiwgMCB9LCB7IDMsIDEgfSwgeyA0LCBNQVhfSyB9IH0sCisJfSwKKwl7CisJCSJKR0UiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgTUFYX0spLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSywgMSwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0ssIDIsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LLCAzLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSywgNCwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDQwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgTUFYX0spCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMSwgMiwgMywgNCwgNSB9LAorCQl7IHsgMSwgMjAgfSwgeyAzLCA0MCB9LCB7IDUsIE1BWF9LIH0gfSwKKwl9LAorCXsKKwkJIkpTRVQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkEsIDAsIDAsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KQSwgMSwgMSwgMSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pBLCAwLCAwLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkEsIDAsIDAsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX0ssIDQpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0lORCwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMSwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LLCAweDgwMDAwMDAwLCAwLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMjApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCBNQVhfSykKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAwLCAweEFBLCAweDU1LCAxIH0sCisJCXsgeyA0LCAxMCB9LCB7IDUsIDIwIH0sIHsgNiwgTUFYX0sgfSB9LAorCX0sCisJeworCQkidGNwZHVtcCBwb3J0IDIyIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDEyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODZkZCwgMCwgOCksIC8qIElQdjYgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMjApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHg4NCwgMiwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAweDYsIDEsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHgxMSwgMCwgMTcpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCA1NCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMTQsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCA1NiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMTIsIDEzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4MDgwMCwgMCwgMTIpLCAvKiBJUHY0ICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODQsIDIsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHg2LCAxLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4MTEsIDAsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMHgxZmZmLCA2LCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0gsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORCwgMTQpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMjIsIDIsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5ELCAxNiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4ZmZmZiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApLAorCQl9LAorCQlDTEFTU0lDLAorCQkvKiAzYzowNzo1NDo0MzplNTo3NiA+IDEwOmJmOjQ4OmQ2OjQzOmQ2LCBldGhlcnR5cGUgSVB2NCgweDA4MDApCisJCSAqIGxlbmd0aCAxMTQ6IDEwLjEuMS4xNDkuNDk3MDAgPiAxMC4xLjIuMTAuMjI6IEZsYWdzIFtQLl0sCisJCSAqIHNlcSAxMzA1NjkyOTc5OjEzMDU2OTMwMjcsIGFjayAzNjUwNDY3MDM3LCB3aW4gNjU1MzUsCisJCSAqIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI1MDI2NDU0MDAgZWNyIDM5NzExMzhdLCBsZW5ndGggNDgKKwkJICovCisJCXsgMHgxMCwgMHhiZiwgMHg0OCwgMHhkNiwgMHg0MywgMHhkNiwKKwkJICAweDNjLCAweDA3LCAweDU0LCAweDQzLCAweGU1LCAweDc2LAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgxMCwgMHgwMCwgMHg2NCwgMHg3NSwgMHhiNSwKKwkJICAweDQwLCAweDAwLCAweDQwLCAweDA2LCAweGFkLCAweDJlLCAvKiBJUCBoZWFkZXIgKi8KKwkJICAweDBhLCAweDAxLCAweDAxLCAweDk1LCAvKiBpcCBzcmMgKi8KKwkJICAweDBhLCAweDAxLCAweDAyLCAweDBhLCAvKiBpcCBkc3QgKi8KKwkJICAweGMyLCAweDI0LAorCQkgIDB4MDAsIDB4MTYgLyogZHN0IHBvcnQgKi8gfSwKKwkJeyB7IDEwLCAwIH0sIHsgMzAsIDAgfSwgeyAxMDAsIDY1NTM1IH0gfSwKKwl9LAorCXsKKwkJInRjcGR1bXAgY29tcGxleCIsCisJCS51Lmluc25zID0geworCQkJLyogdGNwZHVtcCAtbmVpIGV0aDAgJ3RjcCBwb3J0IDIyIGFuZCAoKChpcFsyOjJdIC0KKwkJCSAqICgoaXBbMF0mMHhmKTw8MikpIC0gKCh0Y3BbMTJdJjB4ZjApPj4yKSkgIT0gMCkgYW5kCisJCQkgKiAobGVuID4gMTE1IG9yIGxlbiA8IDMwMDAwMDAwMDAwKScgLWQKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAxMiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAweDg2ZGQsIDMwLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODAwLCAwLCAyOSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4NiwgMCwgMjcpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMHgxZmZmLCAyNSwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0IgfCBCUEZfTVNILCAxNCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9JTkQsIDE0KSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDIyLCAyLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORCwgMTYpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMjIsIDAsIDIwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMTYpLAorCQkJQlBGX1NUTVQoQlBGX1NULCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMTQpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSywgMHhmKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0ssIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAweDUpLCAvKiBsaWJwY2FwIGVtaXRzIEsgb24gVEFYICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfTUVNLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NULCA1KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0gsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgMjYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSywgMHhmMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LLCAyKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMHg5KSwgLyogbGlicGNhcCBlbWl0cyBLIG9uIFRBWCAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX01FTSwgNSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YLCAwLCA0LCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSywgMHg3MywgMSwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LLCAweGZjMjNhYzAwLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHhmZmZmKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMHgxMCwgMHhiZiwgMHg0OCwgMHhkNiwgMHg0MywgMHhkNiwKKwkJICAweDNjLCAweDA3LCAweDU0LCAweDQzLCAweGU1LCAweDc2LAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgxMCwgMHgwMCwgMHg2NCwgMHg3NSwgMHhiNSwKKwkJICAweDQwLCAweDAwLCAweDQwLCAweDA2LCAweGFkLCAweDJlLCAvKiBJUCBoZWFkZXIgKi8KKwkJICAweDBhLCAweDAxLCAweDAxLCAweDk1LCAvKiBpcCBzcmMgKi8KKwkJICAweDBhLCAweDAxLCAweDAyLCAweDBhLCAvKiBpcCBkc3QgKi8KKwkJICAweGMyLCAweDI0LAorCQkgIDB4MDAsIDB4MTYgLyogZHN0IHBvcnQgKi8gfSwKKwkJeyB7IDEwLCAwIH0sIHsgMzAsIDAgfSwgeyAxMDAsIDY1NTM1IH0gfSwKKwl9LAorCXsKKwkJIlJFVF9BIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKiBjaGVjayB0aGF0IHVuaXRpYWxpemVkIFggYW5kIEEgY29udGFpbiB6ZXJvcyAqLworCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsxLCAwfSwgezIsIDB9IH0sCisJfSwKKwl7CisJCSJJTlQ6IEFERCB0cml2aWFsIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMSwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMSwgUjIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgLTEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTVVMLCBSMSwgMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmZmZmZkIH0gfQorCX0sCisJeworCQkiSU5UOiBNVUxfWCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIC0xKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIC0xKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4ZmZmZmZmZmQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfQorCX0sCisJeworCQkiSU5UOiBNVUxfWDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIyLCAzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjEsIDgpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4MmZmZmZmZiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9CisJfSwKKwl7CisJCSJJTlQ6IE1VTDMyX1giLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAtMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIyLCAzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01VTCwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjEsIDgpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4ZmZmZmZmLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0KKwl9LAorCXsKKwkJLyogSGF2ZSB0byB0ZXN0IGFsbCByZWdpc3RlciBjb21iaW5hdGlvbnMsIHNpbmNlCisJCSAqIEpJVGluZyBvZiBkaWZmZXJlbnQgcmVnaXN0ZXJzIHdpbGwgcHJvZHVjZQorCQkgKiBkaWZmZXJlbnQgYXNtIGNvZGUuCisJCSAqLworCQkiSU5UOiBBREQgNjQtYml0IiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIwLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIzLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI0LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI1LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI2LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI3LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI4LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI5LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIwLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIxLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIyLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIzLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI0LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI1LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI2LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI3LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI4LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI5LCAxMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOSksIC8qIFIwID09IDE1NSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDE1NSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSOSksIC8qIFIxID09IDQ1NiAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDQ1NiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSOSksIC8qIFIyID09IDEzNTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIyLCAxMzU4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI5KSwgLyogUjMgPT0gNDA2MyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjMsIDQwNjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjkpLCAvKiBSNCA9PSAxMjE3NyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDEyMTc3LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI5KSwgLyogUjUgPT0gMzY1MTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFI1LCAzNjUxOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSOSksIC8qIFI2ID09IDEwOTU0MCAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjYsIDEwOTU0MCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSOSksIC8qIFI3ID09IDMyODYwNSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjcsIDMyODYwNSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSOSksIC8qIFI4ID09IDk4NTc5OSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjgsIDk4NTc5OSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSOSksIC8qIFI5ID09IDI5NTczODAgKi8KKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFI5KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDI5NTczODAgfSB9CisJfSwKKwl7CisJCSJJTlQ6IEFERCAzMi1iaXQiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAyMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIzLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI0LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI1LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI2LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI3LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI4LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI5LCAxMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSOSksIC8qIFIwID09IDE1NSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDE1NSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSOSksIC8qIFIxID09IDQ1NiAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDQ1NiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSOSksIC8qIFIyID09IDEzNTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIyLCAxMzU4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIwKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI0KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI1KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI2KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI3KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI4KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI5KSwgLyogUjMgPT0gNDA2MyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjMsIDQwNjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjApLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjEpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjIpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjMpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjQpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjUpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjYpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjcpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjgpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjkpLCAvKiBSNCA9PSAxMjE3NyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDEyMTc3LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIwKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI0KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI1KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI2KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI3KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI4KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI5KSwgLyogUjUgPT0gMzY1MTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFI1LCAzNjUxOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSOSksIC8qIFI2ID09IDEwOTU0MCAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjYsIDEwOTU0MCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSOSksIC8qIFI3ID09IDMyODYwNSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjcsIDMyODYwNSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSOSksIC8qIFI4ID09IDk4NTc5OSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjgsIDk4NTc5OSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSOSksIC8qIFI5ID09IDI5NTczODAgKi8KKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01PViwgUjAsIFI5KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDI5NTczODAgfSB9CisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIklOVDogU1VCIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIwLCAxMCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgLTU1LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjEsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjIsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjMsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjQsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjUsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjYsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjcsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjgsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI4KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjksIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjAsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX05FRywgUjAsIDApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjkpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMTEgfSB9CisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIklOVDogWE9SIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSMSwgUjEpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjAsIFIxLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIC0xKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjIsIFIyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIyLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFIzLCBSMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMywgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMiwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI1LCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMywgUjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSNSwgUjUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSNSwgUjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNSwgMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI1LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIC0xKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFI1LCBSNiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFI3LCBSNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSNywgUjYsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSNywgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSOCwgUjgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjcsIFI4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjksIFI5KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFI5LCBSOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI5LCBSOSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFIwLCBSMCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSOSwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMSwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSMCwgUjApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjksIFIwLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfQorCX0sCisJewkvKiBNYWlubHkgY2hlY2tpbmcgSklUIGhlcmUuICovCisJCSJJTlQ6IE1VTCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDExKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMiwgMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIzLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjQsIDQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNSwgNSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI2LCA2KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjcsIDcpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOCwgOCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI5LCA5KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjAsIDEwKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIwLCA0MzkwODQ4MDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTVVMLCBSMSwgMTApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBSMiwgUjEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfUlNILCBSMiwgMzIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjIsIDB4NWE5MjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBSMSwgMzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQVJTSCwgUjEsIDMyKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIxLCAweGViYjkwMDAwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjIsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjIsIDMyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFIyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MzVkOTdlZjIgfSB9CisJfSwKKwl7CisJCSJJTlQ6IEFMVSBNSVgiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAxMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIwLCAtMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIyLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1hPUiwgUjIsIDMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfRElWLCBSMCwgUjIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDEwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PRCwgUjAsIDMpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgLTEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTEgfSB9CisJfSwKKwl7CisJCSJJTlQ6IERJViArIEFCUyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjYsIFIxKSwKKwkJCUJQRl9MRF9BQlMoQlBGX0IsIDMpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMiwgMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9ESVYsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFI4LCBSMCksCisJCQlCUEZfTERfQUJTKEJQRl9CLCA0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjgsIFIwKSwKKwkJCUJQRl9MRF9JTkQoQlBGX0IsIFI4LCAtNzApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyAxMCwgMjAsIDMwLCA0MCwgNTAgfSwKKwkJeyB7IDQsIDAgfSwgeyA1LCAxMCB9IH0KKwl9LAorCXsKKwkJIklOVDogRElWIGJ5IHplcm8iLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFI2LCBSMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCAwKSwKKwkJCUJQRl9MRF9BQlMoQlBGX0IsIDMpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfRElWLCBSMCwgUjcpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyAxMCwgMjAsIDMwLCA0MCwgNTAgfSwKKwkJeyB7IDMsIDAgfSwgeyA0LCAwIH0gfQorCX0sCisJeworCQkiY2hlY2s6IG1pc3NpbmcgcmV0IiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAxKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0KKwl9LAorCXsKKwkJImNoZWNrOiBkaXZfa18wIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCkKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0KKwl9LAorCXsKKwkJImNoZWNrOiB1bmtub3duIGluc24iLAorCQkudS5pbnNucyA9IHsKKwkJCS8qIHNlY2NvbXAgaW5zbiwgcmVqZWN0ZWQgaW4gc29ja2V0IGZpbHRlciAqLworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9XIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX0VYUEVDVEVEX0ZBSUwsCisJCXsgfSwKKwkJeyB9CisJfSwKKwl7CisJCSJjaGVjazogb3V0IG9mIHJhbmdlIHNwaWxsL2ZpbGwiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDE2KSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCkKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0KKwl9LAorCXsKKwkJIkpVTVBTICsgSE9MRVMiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSwgMCwgMTMsIDE1KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHg5MGMyODk0ZCwgMywgNCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEsIDB4OTBjMjg5NGQsIDEsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFLCAwLCAxNCwgMTUpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UsIDAsIDEzLCAxNCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEsIDB4MmFjMjgzNDksIDIsIDMpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEsIDB4MmFjMjgzNDksIDEsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFLCAwLCAxNCwgMTUpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UsIDAsIDEzLCAxNCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEsIDB4OTBkMmZmNDEsIDIsIDMpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEsIDB4OTBkMmZmNDEsIDEsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IDB4MDAsIDB4MWIsIDB4MjEsIDB4M2MsIDB4OWQsIDB4ZjgsCisJCSAgMHg5MCwgMHhlMiwgMHhiYSwgMHgwYSwgMHg1NiwgMHhiNCwKKwkJICAweDA4LCAweDAwLAorCQkgIDB4NDUsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsCisJCSAgMHgyMCwgMHgwMCwgMHg0MCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogSVAgaGVhZGVyICovCisJCSAgMHhjMCwgMHhhOCwgMHgzMywgMHgwMSwKKwkJICAweGMwLCAweGE4LCAweDMzLCAweDAyLAorCQkgIDB4YmIsIDB4YjYsCisJCSAgMHhhOSwgMHhmYSwKKwkJICAweDAwLCAweDE0LCAweDAwLCAweDAwLAorCQkgIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJICAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJICAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYyB9LAorCQl7IHsgODgsIDB4MDAxYiB9IH0KKwl9LAorCXsKKwkJImNoZWNrOiBSRVQgWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9YLCAwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0sCisJfSwKKwl7CisJCSJjaGVjazogTERYICsgUkVUIFgiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCA0MiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX1gsIDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiTVtdOiBhbHQgU1RYICsgTERYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMTAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDMpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDMpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDQpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDQpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDUpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDUpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDYpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDYpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDcpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDcpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDgpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDkpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDkpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAxMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTEpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDExKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RYQSwgMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMTIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEzKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAxMyksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTQpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RYQSwgMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMTUpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDExNiB9IH0sCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIk1bXTogZnVsbCBTVFggKyBmdWxsIExEWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmFkZmVlZGIpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhlY2FiZWRhZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGFmY2NmZWFmKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmZmZGNlZGMpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMyksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmYmJiZGNjYiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCA0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGZiYWJjYmRhKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDUpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YWVkZWNiZGIpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgNiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhZGViYmFkZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCA3KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGZjZmNmYWVjKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmNkZGRiZGMpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgOSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmZWVmZGZhYyksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhjZGRjZGVlYSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhY2NmYWViYiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhiZGNjY2RjZiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMyksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhYWVkZWNkZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmYWVhY2RhZCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAzKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDQpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgNSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCA2KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDcpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgOCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCA5KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDExKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEyKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEzKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE1KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHgyYTVhNWU1IH0gfSwKKwl9LAorCXsKKwkJImNoZWNrOiBTS0ZfQURfTUFYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTUFYKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEgfCBGTEFHX0VYUEVDVEVEX0ZBSUwsCisJCXsgfSwKKwkJeyB9LAorCX0sCisJewkvKiBQYXNzZXMgY2hlY2tlciBidXQgZmFpbHMgZHVyaW5nIHJ1bnRpbWUuICovCisJCSJMRCBbU0tGX0FEX09GRi0xXSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGIC0gMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAwIH0gfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlIGRldjsKKworc3RhdGljIHN0cnVjdCBza19idWZmICpwb3B1bGF0ZV9za2IoY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKHNpemUgPj0gTUFYX0RBVEEpCisJCXJldHVybiBOVUxMOworCisJc2tiID0gYWxsb2Nfc2tiKE1BWF9EQVRBLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoX19za2JfcHV0KHNrYiwgc2l6ZSksIGJ1Ziwgc2l6ZSk7CisKKwkvKiBJbml0aWFsaXplIGEgZmFrZSBza2Igd2l0aCB0ZXN0IHBhdHRlcm4uICovCisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCXNrYi0+cGt0X3R5cGUgPSBTS0JfVFlQRTsKKwlza2ItPm1hcmsgPSBTS0JfTUFSSzsKKwlza2ItPmhhc2ggPSBTS0JfSEFTSDsKKwlza2ItPnF1ZXVlX21hcHBpbmcgPSBTS0JfUVVFVUVfTUFQOworCXNrYi0+dmxhbl90Y2kgPSBTS0JfVkxBTl9UQ0k7CisJc2tiLT5kZXYgPSAmZGV2OworCXNrYi0+ZGV2LT5pZmluZGV4ID0gU0tCX0RFVl9JRklOREVYOworCXNrYi0+ZGV2LT50eXBlID0gU0tCX0RFVl9UWVBFOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBtaW4oc2l6ZSwgRVRIX0hMRU4pKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkICpnZW5lcmF0ZV90ZXN0X2RhdGEoc3RydWN0IGJwZl90ZXN0ICp0ZXN0LCBpbnQgc3ViKQoreworCWlmICh0ZXN0LT5hdXggJiBGTEFHX05PX0RBVEEpCisJCXJldHVybiBOVUxMOworCisJLyogVGVzdCBjYXNlIGV4cGVjdHMgYW4gc2tiLCBzbyBwb3B1bGF0ZSBvbmUuIFZhcmlvdXMKKwkgKiBzdWJ0ZXN0cyBnZW5lcmF0ZSBza2JzIG9mIGRpZmZlcmVudCBzaXplcyBiYXNlZCBvbgorCSAqIHRoZSBzYW1lIGRhdGEuCisJICovCisJcmV0dXJuIHBvcHVsYXRlX3NrYih0ZXN0LT5kYXRhLCB0ZXN0LT50ZXN0W3N1Yl0uZGF0YV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV90ZXN0X2RhdGEoY29uc3Qgc3RydWN0IGJwZl90ZXN0ICp0ZXN0LCB2b2lkICpkYXRhKQoreworCWlmICh0ZXN0LT5hdXggJiBGTEFHX05PX0RBVEEpCisJCXJldHVybjsKKworCWtmcmVlX3NrYihkYXRhKTsKK30KKworc3RhdGljIGludCBwcm9iZV9maWx0ZXJfbGVuZ3RoKHN0cnVjdCBzb2NrX2ZpbHRlciAqZnApCit7CisJaW50IGxlbiA9IDA7CisKKwlmb3IgKGxlbiA9IE1BWF9JTlNOUyAtIDE7IGxlbiA+IDA7IC0tbGVuKQorCQlpZiAoZnBbbGVuXS5jb2RlICE9IDAgfHwgZnBbbGVuXS5rICE9IDApCisJCQlicmVhazsKKworCXJldHVybiBsZW4gKyAxOworfQorCitzdGF0aWMgc3RydWN0IHNrX2ZpbHRlciAqZ2VuZXJhdGVfZmlsdGVyKGludCB3aGljaCwgaW50ICplcnIpCit7CisJc3RydWN0IHNrX2ZpbHRlciAqZnA7CisJc3RydWN0IHNvY2tfZnByb2dfa2VybiBmcHJvZzsKKwl1bnNpZ25lZCBpbnQgZmxlbiA9IHByb2JlX2ZpbHRlcl9sZW5ndGgodGVzdHNbd2hpY2hdLnUuaW5zbnMpOworCV9fdTggdGVzdF90eXBlID0gdGVzdHNbd2hpY2hdLmF1eCAmIFRFU1RfVFlQRV9NQVNLOworCisJc3dpdGNoICh0ZXN0X3R5cGUpIHsKKwljYXNlIENMQVNTSUM6CisJCWZwcm9nLmZpbHRlciA9IHRlc3RzW3doaWNoXS51Lmluc25zOworCQlmcHJvZy5sZW4gPSBmbGVuOworCisJCSplcnIgPSBza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoJmZwLCAmZnByb2cpOworCQlpZiAodGVzdHNbd2hpY2hdLmF1eCAmIEZMQUdfRVhQRUNURURfRkFJTCkgeworCQkJaWYgKCplcnIgPT0gLUVJTlZBTCkgeworCQkJCXByX2NvbnQoIlBBU1NcbiIpOworCQkJCS8qIFZlcmlmaWVyIHJlamVjdGVkIGZpbHRlciBhcyBleHBlY3RlZC4gKi8KKwkJCQkqZXJyID0gMDsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcHJfY29udCgiVU5FWFBFQ1RFRF9QQVNTXG4iKTsKKwkJCQkvKiBWZXJpZmllciBkaWRuJ3QgcmVqZWN0IHRoZSB0ZXN0IHRoYXQncworCQkJCSAqIGJhZCBlbm91Z2gsIGp1c3QgcmV0dXJuIQorCQkJCSAqLworCQkJCSplcnIgPSAtRUlOVkFMOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCS8qIFdlIGRvbid0IGV4cGVjdCB0byBmYWlsLiAqLworCQlpZiAoKmVycikgeworCQkJcHJfY29udCgiRkFJTCB0byBhdHRhY2ggZXJyPSVkIGxlbj0lZFxuIiwKKwkJCQkqZXJyLCBmcHJvZy5sZW4pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElOVEVSTkFMOgorCQlmcCA9IGt6YWxsb2Moc2tfZmlsdGVyX3NpemUoZmxlbiksIEdGUF9LRVJORUwpOworCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJcHJfY29udCgiVU5FWFBFQ1RFRF9GQUlMIG5vIG1lbW9yeSBsZWZ0XG4iKTsKKwkJCSplcnIgPSAtRU5PTUVNOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlmcC0+bGVuID0gZmxlbjsKKwkJbWVtY3B5KGZwLT5pbnNuc2ksIHRlc3RzW3doaWNoXS51Lmluc25zX2ludCwKKwkJICAgICAgIGZwLT5sZW4gKiBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyX2ludCkpOworCisJCXNrX2ZpbHRlcl9zZWxlY3RfcnVudGltZShmcCk7CisJCWJyZWFrOworCX0KKworCSplcnIgPSAwOworCXJldHVybiBmcDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9maWx0ZXIoc3RydWN0IHNrX2ZpbHRlciAqZnAsIGludCB3aGljaCkKK3sKKwlfX3U4IHRlc3RfdHlwZSA9IHRlc3RzW3doaWNoXS5hdXggJiBURVNUX1RZUEVfTUFTSzsKKworCXN3aXRjaCAodGVzdF90eXBlKSB7CisJY2FzZSBDTEFTU0lDOgorCQlza191bmF0dGFjaGVkX2ZpbHRlcl9kZXN0cm95KGZwKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRFUk5BTDoKKwkJc2tfZmlsdGVyX2ZyZWUoZnApOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19ydW5fb25lKGNvbnN0IHN0cnVjdCBza19maWx0ZXIgKmZwLCBjb25zdCB2b2lkICpkYXRhLAorCQkgICAgIGludCBydW5zLCB1NjQgKmR1cmF0aW9uKQoreworCXU2NCBzdGFydCwgZmluaXNoOworCWludCByZXQsIGk7CisKKwlzdGFydCA9IGt0aW1lX3RvX3VzKGt0aW1lX2dldCgpKTsKKworCWZvciAoaSA9IDA7IGkgPCBydW5zOyBpKyspCisJCXJldCA9IFNLX1JVTl9GSUxURVIoZnAsIGRhdGEpOworCisJZmluaXNoID0ga3RpbWVfdG9fdXMoa3RpbWVfZ2V0KCkpOworCisJKmR1cmF0aW9uID0gKGZpbmlzaCAtIHN0YXJ0KSAqIDEwMDBVTEw7CisJZG9fZGl2KCpkdXJhdGlvbiwgcnVucyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ1bl9vbmUoY29uc3Qgc3RydWN0IHNrX2ZpbHRlciAqZnAsIHN0cnVjdCBicGZfdGVzdCAqdGVzdCkKK3sKKwlpbnQgZXJyX2NudCA9IDAsIGksIHJ1bnMgPSBNQVhfVEVTVFJVTlM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NVQlRFU1RTOyBpKyspIHsKKwkJdm9pZCAqZGF0YTsKKwkJdTY0IGR1cmF0aW9uOworCQl1MzIgcmV0OworCisJCWlmICh0ZXN0LT50ZXN0W2ldLmRhdGFfc2l6ZSA9PSAwICYmCisJCSAgICB0ZXN0LT50ZXN0W2ldLnJlc3VsdCA9PSAwKQorCQkJYnJlYWs7CisKKwkJZGF0YSA9IGdlbmVyYXRlX3Rlc3RfZGF0YSh0ZXN0LCBpKTsKKwkJcmV0ID0gX19ydW5fb25lKGZwLCBkYXRhLCBydW5zLCAmZHVyYXRpb24pOworCQlyZWxlYXNlX3Rlc3RfZGF0YSh0ZXN0LCBkYXRhKTsKKworCQlpZiAocmV0ID09IHRlc3QtPnRlc3RbaV0ucmVzdWx0KSB7CisJCQlwcl9jb250KCIlbGxkICIsIGR1cmF0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXByX2NvbnQoInJldCAlZCAhPSAlZCAiLCByZXQsCisJCQkJdGVzdC0+dGVzdFtpXS5yZXN1bHQpOworCQkJZXJyX2NudCsrOworCQl9CisJfQorCisJcmV0dXJuIGVycl9jbnQ7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHRlc3RfYnBmKHZvaWQpCit7CisJaW50IGksIGVycl9jbnQgPSAwLCBwYXNzX2NudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZXN0cyk7IGkrKykgeworCQlzdHJ1Y3Qgc2tfZmlsdGVyICpmcDsKKwkJaW50IGVycjsKKworCQlwcl9pbmZvKCIjJWQgJXMgIiwgaSwgdGVzdHNbaV0uZGVzY3IpOworCisJCWZwID0gZ2VuZXJhdGVfZmlsdGVyKGksICZlcnIpOworCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJaWYgKGVyciA9PSAwKSB7CisJCQkJcGFzc19jbnQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBydW5fb25lKGZwLCAmdGVzdHNbaV0pOworCQlyZWxlYXNlX2ZpbHRlcihmcCwgaSk7CisKKwkJaWYgKGVycikgeworCQkJcHJfY29udCgiRkFJTCAoJWQgdGltZXMpXG4iLCBlcnIpOworCQkJZXJyX2NudCsrOworCQl9IGVsc2UgeworCQkJcHJfY29udCgiUEFTU1xuIik7CisJCQlwYXNzX2NudCsrOworCQl9CisJfQorCisJcHJfaW5mbygiU3VtbWFyeTogJWQgUEFTU0VELCAlZCBGQUlMRURcbiIsIHBhc3NfY250LCBlcnJfY250KTsKKwlyZXR1cm4gZXJyX2NudCA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X2JwZl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHRlc3RfYnBmKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X2JwZl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHRlc3RfYnBmX2luaXQpOworbW9kdWxlX2V4aXQodGVzdF9icGZfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA3ZmFkZjFjLi5kYWZiMDZmIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0xNjY1LDk2ICsxNjY1LDQyIEBACiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogZXJyb3I7CiB9CiAKLS8qCi0gKiBQZXJmb3JtcyBuZWNlc3NhcnkgY2hlY2tzIGJlZm9yZSBkb2luZyBhIHdyaXRlCi0gKiBAaW92OglpbyB2ZWN0b3IgcmVxdWVzdAotICogQG5yX3NlZ3M6CW51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgaW92ZWMKLSAqIEBjb3VudDoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0gKiBAYWNjZXNzX2ZsYWdzOiB0eXBlIG9mIGFjY2VzczogJVZFUklGWV9SRUFEIG9yICVWRVJJRllfV1JJVEUKLSAqCi0gKiBBZGp1c3QgbnVtYmVyIG9mIHNlZ21lbnRzIGFuZCBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKG5yX3NlZ3Mgc2hvdWxkIGJlCi0gKiBwcm9wZXJseSBpbml0aWFsaXplZCBmaXJzdCkuIFJldHVybnMgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0aGF0IGNhbGxlcgotICogc2hvdWxkIHJldHVybiBvciB6ZXJvIGluIGNhc2UgdGhhdCB3cml0ZSBzaG91bGQgYmUgYWxsb3dlZC4KLSAqLwotaW50IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQl1bnNpZ25lZCBsb25nICpucl9zZWdzLCBzaXplX3QgKmNvdW50LCBpbnQgYWNjZXNzX2ZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgICBzZWc7Ci0Jc2l6ZV90IGNudCA9IDA7Ci0JZm9yIChzZWcgPSAwOyBzZWcgPCAqbnJfc2Vnczsgc2VnKyspIHsKLQkJY29uc3Qgc3RydWN0IGlvdmVjICppdiA9ICZpb3Zbc2VnXTsKLQotCQkvKgotCQkgKiBJZiBhbnkgc2VnbWVudCBoYXMgYSBuZWdhdGl2ZSBsZW5ndGgsIG9yIHRoZSBjdW11bGF0aXZlCi0JCSAqIGxlbmd0aCBldmVyIHdyYXBzIG5lZ2F0aXZlIHRoZW4gcmV0dXJuIC1FSU5WQUwuCi0JCSAqLwotCQljbnQgKz0gaXYtPmlvdl9sZW47Ci0JCWlmICh1bmxpa2VseSgoc3NpemVfdCkoY250fGl2LT5pb3ZfbGVuKSA8IDApKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhY2Nlc3Nfb2soYWNjZXNzX2ZsYWdzLCBpdi0+aW92X2Jhc2UsIGl2LT5pb3ZfbGVuKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2VnID09IDApCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJKm5yX3NlZ3MgPSBzZWc7Ci0JCWNudCAtPSBpdi0+aW92X2xlbjsJLyogVGhpcyBzZWdtZW50IGlzIG5vIGdvb2QgKi8KLQkJYnJlYWs7Ci0JfQotCSpjb3VudCA9IGNudDsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZ2VuZXJpY19zZWdtZW50X2NoZWNrcyk7Ci0KIC8qKgotICogZ2VuZXJpY19maWxlX2Fpb19yZWFkIC0gZ2VuZXJpYyBmaWxlc3lzdGVtIHJlYWQgcm91dGluZQorICogZ2VuZXJpY19maWxlX3JlYWRfaXRlciAtIGdlbmVyaWMgZmlsZXN5c3RlbSByZWFkIHJvdXRpbmUKICAqIEBpb2NiOglrZXJuZWwgSS9PIGNvbnRyb2wgYmxvY2sKLSAqIEBpb3Y6CWlvIHZlY3RvciByZXF1ZXN0Ci0gKiBAbnJfc2VnczoJbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBpb3ZlYwotICogQHBvczoJY3VycmVudCBmaWxlIHBvc2l0aW9uCisgKiBAaXRlcjoJZGVzdGluYXRpb24gZm9yIHRoZSBkYXRhIHJlYWQKICAqCi0gKiBUaGlzIGlzIHRoZSAicmVhZCgpIiByb3V0aW5lIGZvciBhbGwgZmlsZXN5c3RlbXMKKyAqIFRoaXMgaXMgdGhlICJyZWFkX2l0ZXIoKSIgcm91dGluZSBmb3IgYWxsIGZpbGVzeXN0ZW1zCiAgKiB0aGF0IGNhbiB1c2UgdGhlIHBhZ2UgY2FjaGUgZGlyZWN0bHkuCiAgKi8KIHNzaXplX3QKLWdlbmVyaWNfZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyKQogewotCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKLQlzc2l6ZV90IHJldHZhbDsKLQlzaXplX3QgY291bnQ7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0dmFsID0gMDsKIAlsb2ZmX3QgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOwotCXN0cnVjdCBpb3ZfaXRlciBpOwotCi0JY291bnQgPSAwOwotCXJldHZhbCA9IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoaW92LCAmbnJfc2VncywgJmNvdW50LCBWRVJJRllfV1JJVEUpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JaW92X2l0ZXJfaW5pdCgmaSwgaW92LCBucl9zZWdzLCBjb3VudCwgMCk7CisJbG9mZl90IHBvcyA9ICpwcG9zOwogCiAJLyogY29hbGVzY2UgdGhlIGlvdmVjcyBhbmQgZ28gZGlyZWN0LXRvLUJJTyBmb3IgT19ESVJFQ1QgKi8KLQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSB7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCQlsb2ZmX3Qgc2l6ZTsKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQkJbWFwcGluZyA9IGZpbHAtPmZfbWFwcGluZzsKLQkJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCQlpZiAoIWNvdW50KQogCQkJZ290byBvdXQ7IC8qIHNraXAgYXRpbWUgKi8KIAkJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLCBwb3MsCi0JCQkJCXBvcyArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSAtIDEpOworCQkJCQlwb3MgKyBjb3VudCAtIDEpOwogCQlpZiAoIXJldHZhbCkgewotCQkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhSRUFELCBpb2NiLAotCQkJCQkJCSAgIGlvdiwgcG9zLCBucl9zZWdzKTsKKwkJCXN0cnVjdCBpb3ZfaXRlciBkYXRhID0gKml0ZXI7CisJCQlyZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKFJFQUQsIGlvY2IsICZkYXRhLCBwb3MpOwogCQl9CisKIAkJaWYgKHJldHZhbCA+IDApIHsKIAkJCSpwcG9zID0gcG9zICsgcmV0dmFsOwotCQkJY291bnQgLT0gcmV0dmFsOwotCQkJLyoKLQkJCSAqIElmIHdlIGRpZCBhIHNob3J0IERJTyByZWFkIHdlIG5lZWQgdG8gc2tpcCB0aGUKLQkJCSAqIHNlY3Rpb24gb2YgdGhlIGlvdiB0aGF0IHdlJ3ZlIGFscmVhZHkgcmVhZCBkYXRhIGludG8uCi0JCQkgKi8KLQkJCWlvdl9pdGVyX2FkdmFuY2UoJmksIHJldHZhbCk7CisJCQlpb3ZfaXRlcl9hZHZhbmNlKGl0ZXIsIHJldHZhbCk7CiAJCX0KIAogCQkvKgpAQCAtMTc2NSwxNyArMTcxMSwxNyBAQAogCQkgKiBhbmQgcmV0dXJuLiAgT3RoZXJ3aXNlIGZhbGx0aHJvdWdoIHRvIGJ1ZmZlcmVkIGlvIGZvcgogCQkgKiB0aGUgcmVzdCBvZiB0aGUgcmVhZC4KIAkJICovCi0JCWlmIChyZXR2YWwgPCAwIHx8ICFjb3VudCB8fCAqcHBvcyA+PSBzaXplKSB7Ci0JCQlmaWxlX2FjY2Vzc2VkKGZpbHApOworCQlpZiAocmV0dmFsIDwgMCB8fCAhaW92X2l0ZXJfY291bnQoaXRlcikgfHwgKnBwb3MgPj0gc2l6ZSkgeworCQkJZmlsZV9hY2Nlc3NlZChmaWxlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JcmV0dmFsID0gZG9fZ2VuZXJpY19maWxlX3JlYWQoZmlscCwgcHBvcywgJmksIHJldHZhbCk7CisJcmV0dmFsID0gZG9fZ2VuZXJpY19maWxlX3JlYWQoZmlsZSwgcHBvcywgaXRlciwgcmV0dmFsKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfYWlvX3JlYWQpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfcmVhZF9pdGVyKTsKIAogI2lmZGVmIENPTkZJR19NTVUKIC8qKgpAQCAtMjM4Niw5ICsyMzMyLDcgQEAKIEVYUE9SVF9TWU1CT0wocGFnZWNhY2hlX3dyaXRlX2VuZCk7CiAKIHNzaXplX3QKLWdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJdW5zaWduZWQgbG9uZyAqbnJfc2VncywgbG9mZl90IHBvcywKLQkJc2l6ZV90IGNvdW50LCBzaXplX3Qgb2NvdW50KQorZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSwgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CkBAIC0yMzk2LDExICsyMzQwLDkgQEAKIAlzc2l6ZV90CQl3cml0dGVuOwogCXNpemVfdAkJd3JpdGVfbGVuOwogCXBnb2ZmX3QJCWVuZDsKKwlzdHJ1Y3QgaW92X2l0ZXIgZGF0YTsKIAotCWlmIChjb3VudCAhPSBvY291bnQpCi0JCSpucl9zZWdzID0gaW92X3Nob3J0ZW4oKHN0cnVjdCBpb3ZlYyAqKWlvdiwgKm5yX3NlZ3MsIGNvdW50KTsKLQotCXdyaXRlX2xlbiA9IGlvdl9sZW5ndGgoaW92LCAqbnJfc2Vncyk7CisJd3JpdGVfbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiAJZW5kID0gKHBvcyArIHdyaXRlX2xlbiAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKIAl3cml0dGVuID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLCBwb3MsIHBvcyArIHdyaXRlX2xlbiAtIDEpOwpAQCAtMjQyNyw3ICsyMzY5LDggQEAKIAkJfQogCX0KIAotCXdyaXR0ZW4gPSBtYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKFdSSVRFLCBpb2NiLCBpb3YsIHBvcywgKm5yX3NlZ3MpOworCWRhdGEgPSAqZnJvbTsKKwl3cml0dGVuID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhXUklURSwgaW9jYiwgJmRhdGEsIHBvcyk7CiAKIAkvKgogCSAqIEZpbmFsbHksIHRyeSBhZ2FpbiB0byBpbnZhbGlkYXRlIGNsZWFuIHBhZ2VzIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbgpAQCAtMjQ0NCw2ICsyMzg3LDcgQEAKIAogCWlmICh3cml0dGVuID4gMCkgewogCQlwb3MgKz0gd3JpdHRlbjsKKwkJaW92X2l0ZXJfYWR2YW5jZShmcm9tLCB3cml0dGVuKTsKIAkJaWYgKHBvcyA+IGlfc2l6ZV9yZWFkKGlub2RlKSAmJiAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgewogCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOwogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CkBAIC0yNTY4LDEwICsyNTEyLDkgQEAKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19wZXJmb3JtX3dyaXRlKTsKIAogLyoqCi0gKiBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUgLSB3cml0ZSBkYXRhIHRvIGEgZmlsZQorICogX19nZW5lcmljX2ZpbGVfd3JpdGVfaXRlciAtIHdyaXRlIGRhdGEgdG8gYSBmaWxlCiAgKiBAaW9jYjoJSU8gc3RhdGUgc3RydWN0dXJlIChmaWxlLCBvZmZzZXQsIGV0Yy4pCi0gKiBAaW92Ogl2ZWN0b3Igd2l0aCBkYXRhIHRvIHdyaXRlCi0gKiBAbnJfc2VnczoJbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSB2ZWN0b3IKKyAqIEBmcm9tOglpb3ZfaXRlciB3aXRoIGRhdGEgdG8gd3JpdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB3b3JrIG5lZWRlZCBmb3IgYWN0dWFsbHkgd3JpdGluZyBkYXRhIHRvIGEKICAqIGZpbGUuIEl0IGRvZXMgYWxsIGJhc2ljIGNoZWNrcywgcmVtb3ZlcyBTVUlEIGZyb20gdGhlIGZpbGUsIHVwZGF0ZXMKQEAgLTI1ODUsMjYgKzI1MjgsMTYgQEAKICAqIEEgY2FsbGVyIGhhcyB0byBoYW5kbGUgaXQuIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IHdlIHdhbnQgdG8KICAqIGF2b2lkIHN5bmNpbmcgdW5kZXIgaV9tdXRleC4KICAqLwotc3NpemVfdCBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorc3NpemVfdCBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Ci0Jc2l6ZV90IG9jb3VudDsJCS8qIG9yaWdpbmFsIGNvdW50ICovCi0Jc2l6ZV90IGNvdW50OwkJLyogYWZ0ZXIgZmlsZSBsaW1pdCBjaGVja3MgKi8KIAlzdHJ1Y3QgaW5vZGUgCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJbG9mZl90CQlwb3MgPSBpb2NiLT5raV9wb3M7CiAJc3NpemVfdAkJd3JpdHRlbiA9IDA7CiAJc3NpemVfdAkJZXJyOwogCXNzaXplX3QJCXN0YXR1czsKLQlzdHJ1Y3QgaW92X2l0ZXIgZnJvbTsKLQotCW9jb3VudCA9IDA7Ci0JZXJyID0gZ2VuZXJpY19zZWdtZW50X2NoZWNrcyhpb3YsICZucl9zZWdzLCAmb2NvdW50LCBWRVJJRllfUkVBRCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWNvdW50ID0gb2NvdW50OworCXNpemVfdAkJY291bnQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKTsKIAogCS8qIFdlIGNhbiB3cml0ZSBiYWNrIHRoaXMgcXVldWUgaW4gcGFnZSByZWNsYWltICovCiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CkBAIC0yNjE1LDYgKzI1NDgsOCBAQAogCWlmIChjb3VudCA9PSAwKQogCQlnb3RvIG91dDsKIAorCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIGNvdW50KTsKKwogCWVyciA9IGZpbGVfcmVtb3ZlX3N1aWQoZmlsZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yNjIzLDE3ICsyNTU4LDEzIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpb3ZfaXRlcl9pbml0KCZmcm9tLCBpb3YsIG5yX3NlZ3MsIGNvdW50LCAwKTsKLQogCS8qIGNvYWxlc2NlIHRoZSBpb3ZlY3MgYW5kIGdvIGRpcmVjdC10by1CSU8gZm9yIE9fRElSRUNUICovCiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpIHsKIAkJbG9mZl90IGVuZGJ5dGU7CiAKLQkJd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92LCAmZnJvbS5ucl9zZWdzLCBwb3MsCi0JCQkJCQkJY291bnQsIG9jb3VudCk7CisJCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20sIHBvcyk7CiAJCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID09IGNvdW50KQogCQkJZ290byBvdXQ7Ci0JCWlvdl9pdGVyX2FkdmFuY2UoJmZyb20sIHdyaXR0ZW4pOwogCiAJCS8qCiAJCSAqIGRpcmVjdC1pbyB3cml0ZSB0byBhIGhvbGU6IGZhbGwgdGhyb3VnaCB0byBidWZmZXJlZCBJL08KQEAgLTI2NDIsNyArMjU3Myw3IEBACiAJCXBvcyArPSB3cml0dGVuOwogCQljb3VudCAtPSB3cml0dGVuOwogCi0JCXN0YXR1cyA9IGdlbmVyaWNfcGVyZm9ybV93cml0ZShmaWxlLCAmZnJvbSwgcG9zKTsKKwkJc3RhdHVzID0gZ2VuZXJpY19wZXJmb3JtX3dyaXRlKGZpbGUsIGZyb20sIHBvcyk7CiAJCS8qCiAJCSAqIElmIGdlbmVyaWNfcGVyZm9ybV93cml0ZSgpIHJldHVybmVkIGEgc3luY2hyb25vdXMgZXJyb3IKIAkJICogdGhlbiB3ZSB3YW50IHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUKQEAgLTI2NzQsNyArMjYwNSw3IEBACiAJCQkgKi8KIAkJfQogCX0gZWxzZSB7Ci0JCXdyaXR0ZW4gPSBnZW5lcmljX3BlcmZvcm1fd3JpdGUoZmlsZSwgJmZyb20sIHBvcyk7CisJCXdyaXR0ZW4gPSBnZW5lcmljX3BlcmZvcm1fd3JpdGUoZmlsZSwgZnJvbSwgcG9zKTsKIAkJaWYgKGxpa2VseSh3cml0dGVuID49IDApKQogCQkJaW9jYi0+a2lfcG9zID0gcG9zICsgd3JpdHRlbjsKIAl9CkBAIC0yNjgyLDMwICsyNjEzLDI1IEBACiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogZXJyOwogfQotRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUpOworRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKTsKIAogLyoqCi0gKiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlIC0gd3JpdGUgZGF0YSB0byBhIGZpbGUKKyAqIGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyIC0gd3JpdGUgZGF0YSB0byBhIGZpbGUKICAqIEBpb2NiOglJTyBzdGF0ZSBzdHJ1Y3R1cmUKLSAqIEBpb3Y6CXZlY3RvciB3aXRoIGRhdGEgdG8gd3JpdGUKLSAqIEBucl9zZWdzOgludW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhlIHZlY3RvcgotICogQHBvczoJcG9zaXRpb24gaW4gZmlsZSB3aGVyZSB0byB3cml0ZQorICogQGZyb206CWlvdl9pdGVyIHdpdGggZGF0YSB0byB3cml0ZQogICoKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoKSB0byBiZSB1c2VkIGJ5IG1vc3QKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKCkgdG8gYmUgdXNlZCBieSBtb3N0CiAgKiBmaWxlc3lzdGVtcy4gSXQgdGFrZXMgY2FyZSBvZiBzeW5jaW5nIHRoZSBmaWxlIGluIGNhc2Ugb2YgT19TWU5DIGZpbGUKICAqIGFuZCBhY3F1aXJlcyBpX211dGV4IGFzIG5lZWRlZC4KICAqLwotc3NpemVfdCBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3NzaXplX3QgZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CiAKLQlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7Ci0KIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmV0ID0gX19nZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2Vncyk7CisJcmV0ID0gX19nZW5lcmljX2ZpbGVfd3JpdGVfaXRlcihpb2NiLCBmcm9tKTsKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCWlmIChyZXQgPiAwKSB7CkBAIC0yNzE3LDcgKzI2NDMsNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIpOwogCiAvKioKICAqIHRyeV90b19yZWxlYXNlX3BhZ2UoKSAtIHJlbGVhc2Ugb2xkIGZzLXNwZWNpZmljIG1ldGFkYXRhIG9uIGEgcGFnZQpkaWZmIC0tZ2l0IGEvbW0vaW92X2l0ZXIuYyBiL21tL2lvdl9pdGVyLmMKaW5kZXggMTBlNDZjZC4uN2I1ZGJkMSAxMDA2NDQKLS0tIGEvbW0vaW92X2l0ZXIuYworKysgYi9tbS9pb3ZfaXRlci5jCkBAIC0xLDggKzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAotc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCitzdGF0aWMgc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyX2lvdmVjKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCiAJCQkgc3RydWN0IGlvdl9pdGVyICppKQogewogCXNpemVfdCBza2lwLCBjb3B5LCBsZWZ0LCB3YW50ZWQ7CkBAIC03MiwxMyArNzQsOTcgQEAKIAl9CiAJa3VubWFwKHBhZ2UpOwogZG9uZToKKwlpZiAoc2tpcCA9PSBpb3YtPmlvdl9sZW4pIHsKKwkJaW92Kys7CisJCXNraXAgPSAwOworCX0KIAlpLT5jb3VudCAtPSB3YW50ZWQgLSBieXRlczsKIAlpLT5ucl9zZWdzIC09IGlvdiAtIGktPmlvdjsKIAlpLT5pb3YgPSBpb3Y7CiAJaS0+aW92X29mZnNldCA9IHNraXA7CiAJcmV0dXJuIHdhbnRlZCAtIGJ5dGVzOwogfQotRVhQT1JUX1NZTUJPTChjb3B5X3BhZ2VfdG9faXRlcik7CisKK3N0YXRpYyBzaXplX3QgY29weV9wYWdlX2Zyb21faXRlcl9pb3ZlYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLAorCQkJIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzaXplX3Qgc2tpcCwgY29weSwgbGVmdCwgd2FudGVkOworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OworCWNoYXIgX191c2VyICpidWY7CisJdm9pZCAqa2FkZHIsICp0bzsKKworCWlmICh1bmxpa2VseShieXRlcyA+IGktPmNvdW50KSkKKwkJYnl0ZXMgPSBpLT5jb3VudDsKKworCWlmICh1bmxpa2VseSghYnl0ZXMpKQorCQlyZXR1cm4gMDsKKworCXdhbnRlZCA9IGJ5dGVzOworCWlvdiA9IGktPmlvdjsKKwlza2lwID0gaS0+aW92X29mZnNldDsKKwlidWYgPSBpb3YtPmlvdl9iYXNlICsgc2tpcDsKKwljb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4gLSBza2lwKTsKKworCWlmICghZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBjb3B5KSkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQl0byA9IGthZGRyICsgb2Zmc2V0OworCisJCS8qIGZpcnN0IGNodW5rLCB1c3VhbGx5IHRoZSBvbmx5IG9uZSAqLworCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgYnVmLCBjb3B5KTsKKwkJY29weSAtPSBsZWZ0OworCQlza2lwICs9IGNvcHk7CisJCXRvICs9IGNvcHk7CisJCWJ5dGVzIC09IGNvcHk7CisKKwkJd2hpbGUgKHVubGlrZWx5KCFsZWZ0ICYmIGJ5dGVzKSkgeworCQkJaW92Kys7CisJCQlidWYgPSBpb3YtPmlvdl9iYXNlOworCQkJY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuKTsKKwkJCWxlZnQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBidWYsIGNvcHkpOworCQkJY29weSAtPSBsZWZ0OworCQkJc2tpcCA9IGNvcHk7CisJCQl0byArPSBjb3B5OworCQkJYnl0ZXMgLT0gY29weTsKKwkJfQorCQlpZiAobGlrZWx5KCFieXRlcykpIHsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIpOworCQkJZ290byBkb25lOworCQl9CisJCW9mZnNldCA9IHRvIC0ga2FkZHI7CisJCWJ1ZiArPSBjb3B5OworCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuIC0gc2tpcCk7CisJfQorCS8qIFRvbyBiYWQgLSByZXZlcnQgdG8gbm9uLWF0b21pYyBrbWFwICovCisJa2FkZHIgPSBrbWFwKHBhZ2UpOworCXRvID0ga2FkZHIgKyBvZmZzZXQ7CisJbGVmdCA9IF9fY29weV9mcm9tX3VzZXIodG8sIGJ1ZiwgY29weSk7CisJY29weSAtPSBsZWZ0OworCXNraXAgKz0gY29weTsKKwl0byArPSBjb3B5OworCWJ5dGVzIC09IGNvcHk7CisJd2hpbGUgKHVubGlrZWx5KCFsZWZ0ICYmIGJ5dGVzKSkgeworCQlpb3YrKzsKKwkJYnVmID0gaW92LT5pb3ZfYmFzZTsKKwkJY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuKTsKKwkJbGVmdCA9IF9fY29weV9mcm9tX3VzZXIodG8sIGJ1ZiwgY29weSk7CisJCWNvcHkgLT0gbGVmdDsKKwkJc2tpcCA9IGNvcHk7CisJCXRvICs9IGNvcHk7CisJCWJ5dGVzIC09IGNvcHk7CisJfQorCWt1bm1hcChwYWdlKTsKK2RvbmU6CisJaWYgKHNraXAgPT0gaW92LT5pb3ZfbGVuKSB7CisJCWlvdisrOworCQlza2lwID0gMDsKKwl9CisJaS0+Y291bnQgLT0gd2FudGVkIC0gYnl0ZXM7CisJaS0+bnJfc2VncyAtPSBpb3YgLSBpLT5pb3Y7CisJaS0+aW92ID0gaW92OworCWktPmlvdl9vZmZzZXQgPSBza2lwOworCXJldHVybiB3YW50ZWQgLSBieXRlczsKK30KIAogc3RhdGljIHNpemVfdCBfX2lvdmVjX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKGNoYXIgKnZhZGRyLAogCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHNpemVfdCBiYXNlLCBzaXplX3QgYnl0ZXMpCkBAIC0xMDcsNyArMTkzLDcgQEAKICAqIHdlcmUgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gIElmIGEgZmF1bHQgaXMgZW5jb3VudGVyZWQgdGhlbiByZXR1cm4gdGhlIG51bWJlciBvZgogICogYnl0ZXMgd2hpY2ggd2VyZSBjb3BpZWQuCiAgKi8KLXNpemVfdCBpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsCitzdGF0aWMgc2l6ZV90IGNvcHlfZnJvbV91c2VyX2F0b21pY19pb3ZlYyhzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKQogewogCWNoYXIgKmthZGRyOwpAQCAtMTI3LDM2ICsyMTMsOCBAQAogCiAJcmV0dXJuIGNvcGllZDsKIH0KLUVYUE9SVF9TWU1CT0woaW92X2l0ZXJfY29weV9mcm9tX3VzZXJfYXRvbWljKTsKIAotLyoKLSAqIFRoaXMgaGFzIHRoZSBzYW1lIHNpZGVlZmZlY3RzIGFuZCByZXR1cm4gdmFsdWUgYXMKLSAqIGlvdl9pdGVyX2NvcHlfZnJvbV91c2VyX2F0b21pYygpLgotICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBhdHRlbXB0cyB0byByZXNvbHZlIGZhdWx0cy4KLSAqIFBhZ2UgbXVzdCBub3QgYmUgbG9ja2VkLgotICovCi1zaXplX3QgaW92X2l0ZXJfY29weV9mcm9tX3VzZXIoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXN0cnVjdCBpb3ZfaXRlciAqaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBieXRlcykKLXsKLQljaGFyICprYWRkcjsKLQlzaXplX3QgY29waWVkOwotCi0Ja2FkZHIgPSBrbWFwKHBhZ2UpOwotCWlmIChsaWtlbHkoaS0+bnJfc2VncyA9PSAxKSkgewotCQlpbnQgbGVmdDsKLQkJY2hhciBfX3VzZXIgKmJ1ZiA9IGktPmlvdi0+aW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OwotCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcihrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7Ci0JCWNvcGllZCA9IGJ5dGVzIC0gbGVmdDsKLQl9IGVsc2UgewotCQljb3BpZWQgPSBfX2lvdmVjX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKGthZGRyICsgb2Zmc2V0LAotCQkJCQkJaS0+aW92LCBpLT5pb3Zfb2Zmc2V0LCBieXRlcyk7Ci0JfQotCWt1bm1hcChwYWdlKTsKLQlyZXR1cm4gY29waWVkOwotfQotRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcik7Ci0KLXZvaWQgaW92X2l0ZXJfYWR2YW5jZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKK3N0YXRpYyB2b2lkIGFkdmFuY2VfaW92ZWMoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpCiB7CiAJQlVHX09OKGktPmNvdW50IDwgYnl0ZXMpOwogCkBAIC0xOTEsNyArMjQ5LDYgQEAKIAkJaS0+bnJfc2VncyA9IG5yX3NlZ3M7CiAJfQogfQotRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9hZHZhbmNlKTsKIAogLyoKICAqIEZhdWx0IGluIHRoZSBmaXJzdCBpb3ZlYyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGgKQEAgLTIwNCwyMSArMjYxLDQ4MyBAQAogICovCiBpbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpCiB7Ci0JY2hhciBfX3VzZXIgKmJ1ZiA9IGktPmlvdi0+aW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OwotCWJ5dGVzID0gbWluKGJ5dGVzLCBpLT5pb3YtPmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0KTsKLQlyZXR1cm4gZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisJaWYgKCEoaS0+dHlwZSAmIElURVJfQlZFQykpIHsKKwkJY2hhciBfX3VzZXIgKmJ1ZiA9IGktPmlvdi0+aW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OworCQlieXRlcyA9IG1pbihieXRlcywgaS0+aW92LT5pb3ZfbGVuIC0gaS0+aW92X29mZnNldCk7CisJCXJldHVybiBmYXVsdF9pbl9wYWdlc19yZWFkYWJsZShidWYsIGJ5dGVzKTsKKwl9CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlKTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxpZ25tZW50X2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiA9IGktPmlvdjsKKwl1bnNpZ25lZCBsb25nIHJlczsKKwlzaXplX3Qgc2l6ZSA9IGktPmNvdW50OworCXNpemVfdCBuOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXJlcyA9ICh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OworCW4gPSBpb3YtPmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0OworCWlmIChuID49IHNpemUpCisJCXJldHVybiByZXMgfCBzaXplOworCXNpemUgLT0gbjsKKwlyZXMgfD0gbjsKKwl3aGlsZSAoc2l6ZSA+ICgrK2lvdiktPmlvdl9sZW4pIHsKKwkJcmVzIHw9ICh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UgfCBpb3YtPmlvdl9sZW47CisJCXNpemUgLT0gaW92LT5pb3ZfbGVuOworCX0KKwlyZXMgfD0gKHVuc2lnbmVkIGxvbmcpaW92LT5pb3ZfYmFzZSB8IHNpemU7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBpb3ZfaXRlcl9pbml0KHN0cnVjdCBpb3ZfaXRlciAqaSwgaW50IGRpcmVjdGlvbiwKKwkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCisJCQlzaXplX3QgY291bnQpCit7CisJLyogSXQgd2lsbCBnZXQgYmV0dGVyLiAgRXZlbnR1YWxseS4uLiAqLworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQorCQlkaXJlY3Rpb24gfD0gSVRFUl9LVkVDOworCWktPnR5cGUgPSBkaXJlY3Rpb247CisJaS0+aW92ID0gaW92OworCWktPm5yX3NlZ3MgPSBucl9zZWdzOworCWktPmlvdl9vZmZzZXQgPSAwOworCWktPmNvdW50ID0gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2luaXQpOworCitzdGF0aWMgc3NpemVfdCBnZXRfcGFnZXNfaW92ZWMoc3RydWN0IGlvdl9pdGVyICppLAorCQkgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3QgbWF4c2l6ZSwKKwkJICAgc2l6ZV90ICpzdGFydCkKK3sKKwlzaXplX3Qgb2Zmc2V0ID0gaS0+aW92X29mZnNldDsKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiA9IGktPmlvdjsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgbjsKKwlpbnQgcmVzOworCisJbGVuID0gaW92LT5pb3ZfbGVuIC0gb2Zmc2V0OworCWlmIChsZW4gPiBpLT5jb3VudCkKKwkJbGVuID0gaS0+Y291bnQ7CisJaWYgKGxlbiA+IG1heHNpemUpCisJCWxlbiA9IG1heHNpemU7CisJYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UgKyBvZmZzZXQ7CisJbGVuICs9ICpzdGFydCA9IGFkZHIgJiAoUEFHRV9TSVpFIC0gMSk7CisJYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCW4gPSAobGVuICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJcmVzID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuLCAoaS0+dHlwZSAmIFdSSVRFKSAhPSBXUklURSwgcGFnZXMpOworCWlmICh1bmxpa2VseShyZXMgPCAwKSkKKwkJcmV0dXJuIHJlczsKKwlyZXR1cm4gKHJlcyA9PSBuID8gbGVuIDogcmVzICogUEFHRV9TSVpFKSAtICpzdGFydDsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X3BhZ2VzX2FsbG9jX2lvdmVjKHN0cnVjdCBpb3ZfaXRlciAqaSwKKwkJICAgc3RydWN0IHBhZ2UgKioqcGFnZXMsIHNpemVfdCBtYXhzaXplLAorCQkgICBzaXplX3QgKnN0YXJ0KQoreworCXNpemVfdCBvZmZzZXQgPSBpLT5pb3Zfb2Zmc2V0OworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ID0gaS0+aW92OworCXNpemVfdCBsZW47CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgKnA7CisJaW50IG47CisJaW50IHJlczsKKworCWxlbiA9IGlvdi0+aW92X2xlbiAtIG9mZnNldDsKKwlpZiAobGVuID4gaS0+Y291bnQpCisJCWxlbiA9IGktPmNvdW50OworCWlmIChsZW4gPiBtYXhzaXplKQorCQlsZW4gPSBtYXhzaXplOworCWFkZHIgPSAodW5zaWduZWQgbG9uZylpb3YtPmlvdl9iYXNlICsgb2Zmc2V0OworCWxlbiArPSAqc3RhcnQgPSBhZGRyICYgKFBBR0VfU0laRSAtIDEpOworCWFkZHIgJj0gfihQQUdFX1NJWkUgLSAxKTsKKwluID0gKGxlbiArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCQorCXAgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcCA9IHZtYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbiwgKGktPnR5cGUgJiBXUklURSkgIT0gV1JJVEUsIHApOworCWlmICh1bmxpa2VseShyZXMgPCAwKSkgeworCQlrdmZyZWUocCk7CisJCXJldHVybiByZXM7CisJfQorCSpwYWdlcyA9IHA7CisJcmV0dXJuIChyZXMgPT0gbiA/IGxlbiA6IHJlcyAqIFBBR0VfU0laRSkgLSAqc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQgaW92X2l0ZXJfbnBhZ2VzX2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSwgaW50IG1heHBhZ2VzKQoreworCXNpemVfdCBvZmZzZXQgPSBpLT5pb3Zfb2Zmc2V0OworCXNpemVfdCBzaXplID0gaS0+Y291bnQ7CisJY29uc3Qgc3RydWN0IGlvdmVjICppb3YgPSBpLT5pb3Y7CisJaW50IG5wYWdlcyA9IDA7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBzaXplICYmIG4gPCBpLT5ucl9zZWdzOyBuKyssIGlvdisrKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UgKyBvZmZzZXQ7CisJCXNpemVfdCBsZW4gPSBpb3YtPmlvdl9sZW4gLSBvZmZzZXQ7CisJCW9mZnNldCA9IDA7CisJCWlmICh1bmxpa2VseSghbGVuKSkJLyogZW1wdHkgc2VnbWVudCAqLworCQkJY29udGludWU7CisJCWlmIChsZW4gPiBzaXplKQorCQkJbGVuID0gc2l6ZTsKKwkJbnBhZ2VzICs9IChhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUKKwkJCSAgLSBhZGRyIC8gUEFHRV9TSVpFOworCQlpZiAobnBhZ2VzID49IG1heHBhZ2VzKQkvKiBkb24ndCBib3RoZXIgZ29pbmcgZnVydGhlciAqLworCQkJcmV0dXJuIG1heHBhZ2VzOworCQlzaXplIC09IGxlbjsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIG1pbihucGFnZXMsIG1heHBhZ2VzKTsKK30KKworc3RhdGljIHZvaWQgbWVtY3B5X2Zyb21fcGFnZShjaGFyICp0bywgc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCit7CisJY2hhciAqZnJvbSA9IGttYXBfYXRvbWljKHBhZ2UpOworCW1lbWNweSh0bywgZnJvbSArIG9mZnNldCwgbGVuKTsKKwlrdW5tYXBfYXRvbWljKGZyb20pOworfQorCitzdGF0aWMgdm9pZCBtZW1jcHlfdG9fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgY2hhciAqZnJvbSwgc2l6ZV90IGxlbikKK3sKKwljaGFyICp0byA9IGttYXBfYXRvbWljKHBhZ2UpOworCW1lbWNweSh0byArIG9mZnNldCwgZnJvbSwgbGVuKTsKKwlrdW5tYXBfYXRvbWljKHRvKTsKK30KKworc3RhdGljIHNpemVfdCBjb3B5X3BhZ2VfdG9faXRlcl9idmVjKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCisJCQkgc3RydWN0IGlvdl9pdGVyICppKQoreworCXNpemVfdCBza2lwLCBjb3B5LCB3YW50ZWQ7CisJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJdm9pZCAqa2FkZHIsICpmcm9tOworCisJaWYgKHVubGlrZWx5KGJ5dGVzID4gaS0+Y291bnQpKQorCQlieXRlcyA9IGktPmNvdW50OworCisJaWYgKHVubGlrZWx5KCFieXRlcykpCisJCXJldHVybiAwOworCisJd2FudGVkID0gYnl0ZXM7CisJYnZlYyA9IGktPmJ2ZWM7CisJc2tpcCA9IGktPmlvdl9vZmZzZXQ7CisJY29weSA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIGJ2ZWMtPmJ2X2xlbiAtIHNraXApOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwlmcm9tID0ga2FkZHIgKyBvZmZzZXQ7CisJbWVtY3B5X3RvX3BhZ2UoYnZlYy0+YnZfcGFnZSwgc2tpcCArIGJ2ZWMtPmJ2X29mZnNldCwgZnJvbSwgY29weSk7CisJc2tpcCArPSBjb3B5OworCWZyb20gKz0gY29weTsKKwlieXRlcyAtPSBjb3B5OworCXdoaWxlIChieXRlcykgeworCQlidmVjKys7CisJCWNvcHkgPSBtaW4oYnl0ZXMsIChzaXplX3QpYnZlYy0+YnZfbGVuKTsKKwkJbWVtY3B5X3RvX3BhZ2UoYnZlYy0+YnZfcGFnZSwgYnZlYy0+YnZfb2Zmc2V0LCBmcm9tLCBjb3B5KTsKKwkJc2tpcCA9IGNvcHk7CisJCWZyb20gKz0gY29weTsKKwkJYnl0ZXMgLT0gY29weTsKKwl9CisJa3VubWFwX2F0b21pYyhrYWRkcik7CisJaWYgKHNraXAgPT0gYnZlYy0+YnZfbGVuKSB7CisJCWJ2ZWMrKzsKKwkJc2tpcCA9IDA7CisJfQorCWktPmNvdW50IC09IHdhbnRlZCAtIGJ5dGVzOworCWktPm5yX3NlZ3MgLT0gYnZlYyAtIGktPmJ2ZWM7CisJaS0+YnZlYyA9IGJ2ZWM7CisJaS0+aW92X29mZnNldCA9IHNraXA7CisJcmV0dXJuIHdhbnRlZCAtIGJ5dGVzOworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfcGFnZV9mcm9tX2l0ZXJfYnZlYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLAorCQkJIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzaXplX3Qgc2tpcCwgY29weSwgd2FudGVkOworCWNvbnN0IHN0cnVjdCBiaW9fdmVjICpidmVjOworCXZvaWQgKmthZGRyLCAqdG87CisKKwlpZiAodW5saWtlbHkoYnl0ZXMgPiBpLT5jb3VudCkpCisJCWJ5dGVzID0gaS0+Y291bnQ7CisKKwlpZiAodW5saWtlbHkoIWJ5dGVzKSkKKwkJcmV0dXJuIDA7CisKKwl3YW50ZWQgPSBieXRlczsKKwlidmVjID0gaS0+YnZlYzsKKwlza2lwID0gaS0+aW92X29mZnNldDsKKworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSk7CisKKwl0byA9IGthZGRyICsgb2Zmc2V0OworCisJY29weSA9IG1pbihieXRlcywgYnZlYy0+YnZfbGVuIC0gc2tpcCk7CisKKwltZW1jcHlfZnJvbV9wYWdlKHRvLCBidmVjLT5idl9wYWdlLCBidmVjLT5idl9vZmZzZXQgKyBza2lwLCBjb3B5KTsKKworCXRvICs9IGNvcHk7CisJc2tpcCArPSBjb3B5OworCWJ5dGVzIC09IGNvcHk7CisKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJYnZlYysrOworCQljb3B5ID0gbWluKGJ5dGVzLCAoc2l6ZV90KWJ2ZWMtPmJ2X2xlbik7CisJCW1lbWNweV9mcm9tX3BhZ2UodG8sIGJ2ZWMtPmJ2X3BhZ2UsIGJ2ZWMtPmJ2X29mZnNldCwgY29weSk7CisJCXNraXAgPSBjb3B5OworCQl0byArPSBjb3B5OworCQlieXRlcyAtPSBjb3B5OworCX0KKwlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwlpZiAoc2tpcCA9PSBidmVjLT5idl9sZW4pIHsKKwkJYnZlYysrOworCQlza2lwID0gMDsKKwl9CisJaS0+Y291bnQgLT0gd2FudGVkOworCWktPm5yX3NlZ3MgLT0gYnZlYyAtIGktPmJ2ZWM7CisJaS0+YnZlYyA9IGJ2ZWM7CisJaS0+aW92X29mZnNldCA9IHNraXA7CisJcmV0dXJuIHdhbnRlZDsKK30KKworc3RhdGljIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9idmVjKHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgaW92X2l0ZXIgKmksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgYnl0ZXMpCit7CisJY2hhciAqa2FkZHI7CisJc2l6ZV90IGxlZnQ7CisJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc2l6ZV90IGJhc2UgPSBpLT5pb3Zfb2Zmc2V0OworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwlmb3IgKGxlZnQgPSBieXRlcywgYnZlYyA9IGktPmJ2ZWM7IGxlZnQ7IGJ2ZWMrKywgYmFzZSA9IDApIHsKKwkJc2l6ZV90IGNvcHkgPSBtaW4obGVmdCwgYnZlYy0+YnZfbGVuIC0gYmFzZSk7CisJCWlmICghYnZlYy0+YnZfbGVuKQorCQkJY29udGludWU7CisJCW1lbWNweV9mcm9tX3BhZ2Uoa2FkZHIgKyBvZmZzZXQsIGJ2ZWMtPmJ2X3BhZ2UsCisJCQkJIGJ2ZWMtPmJ2X29mZnNldCArIGJhc2UsIGNvcHkpOworCQlvZmZzZXQgKz0gY29weTsKKwkJbGVmdCAtPSBjb3B5OworCX0KKwlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkIGFkdmFuY2VfYnZlYyhzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKK3sKKwlCVUdfT04oaS0+Y291bnQgPCBieXRlcyk7CisKKwlpZiAobGlrZWx5KGktPm5yX3NlZ3MgPT0gMSkpIHsKKwkJaS0+aW92X29mZnNldCArPSBieXRlczsKKwkJaS0+Y291bnQgLT0gYnl0ZXM7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBpLT5idmVjOworCQlzaXplX3QgYmFzZSA9IGktPmlvdl9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbnJfc2VncyA9IGktPm5yX3NlZ3M7CisKKwkJLyoKKwkJICogVGhlICFpb3YtPmlvdl9sZW4gY2hlY2sgZW5zdXJlcyB3ZSBza2lwIG92ZXIgdW5saWtlbHkKKwkJICogemVyby1sZW5ndGggc2VnbWVudHMgKHdpdGhvdXQgb3ZlcnJ1bmluZyB0aGUgaW92ZWMpLgorCQkgKi8KKwkJd2hpbGUgKGJ5dGVzIHx8IHVubGlrZWx5KGktPmNvdW50ICYmICFidmVjLT5idl9sZW4pKSB7CisJCQlpbnQgY29weTsKKworCQkJY29weSA9IG1pbihieXRlcywgYnZlYy0+YnZfbGVuIC0gYmFzZSk7CisJCQlCVUdfT04oIWktPmNvdW50IHx8IGktPmNvdW50IDwgY29weSk7CisJCQlpLT5jb3VudCAtPSBjb3B5OworCQkJYnl0ZXMgLT0gY29weTsKKwkJCWJhc2UgKz0gY29weTsKKwkJCWlmIChidmVjLT5idl9sZW4gPT0gYmFzZSkgeworCQkJCWJ2ZWMrKzsKKwkJCQlucl9zZWdzLS07CisJCQkJYmFzZSA9IDA7CisJCQl9CisJCX0KKwkJaS0+YnZlYyA9IGJ2ZWM7CisJCWktPmlvdl9vZmZzZXQgPSBiYXNlOworCQlpLT5ucl9zZWdzID0gbnJfc2VnczsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFsaWdubWVudF9idmVjKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwljb25zdCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGktPmJ2ZWM7CisJdW5zaWduZWQgbG9uZyByZXM7CisJc2l6ZV90IHNpemUgPSBpLT5jb3VudDsKKwlzaXplX3QgbjsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXMgPSBidmVjLT5idl9vZmZzZXQgKyBpLT5pb3Zfb2Zmc2V0OworCW4gPSBidmVjLT5idl9sZW4gLSBpLT5pb3Zfb2Zmc2V0OworCWlmIChuID49IHNpemUpCisJCXJldHVybiByZXMgfCBzaXplOworCXNpemUgLT0gbjsKKwlyZXMgfD0gbjsKKwl3aGlsZSAoc2l6ZSA+ICgrK2J2ZWMpLT5idl9sZW4pIHsKKwkJcmVzIHw9IGJ2ZWMtPmJ2X29mZnNldCB8IGJ2ZWMtPmJ2X2xlbjsKKwkJc2l6ZSAtPSBidmVjLT5idl9sZW47CisJfQorCXJlcyB8PSBidmVjLT5idl9vZmZzZXQgfCBzaXplOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9wYWdlc19idmVjKHN0cnVjdCBpb3ZfaXRlciAqaSwKKwkJICAgc3RydWN0IHBhZ2UgKipwYWdlcywgc2l6ZV90IG1heHNpemUsCisJCSAgIHNpemVfdCAqc3RhcnQpCit7CisJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBpLT5idmVjOworCXNpemVfdCBsZW4gPSBidmVjLT5idl9sZW4gLSBpLT5pb3Zfb2Zmc2V0OworCWlmIChsZW4gPiBpLT5jb3VudCkKKwkJbGVuID0gaS0+Y291bnQ7CisJaWYgKGxlbiA+IG1heHNpemUpCisJCWxlbiA9IG1heHNpemU7CisJKnN0YXJ0ID0gYnZlYy0+YnZfb2Zmc2V0ICsgaS0+aW92X29mZnNldDsKKworCWdldF9wYWdlKCpwYWdlcyA9IGJ2ZWMtPmJ2X3BhZ2UpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X3BhZ2VzX2FsbG9jX2J2ZWMoc3RydWN0IGlvdl9pdGVyICppLAorCQkgICBzdHJ1Y3QgcGFnZSAqKipwYWdlcywgc2l6ZV90IG1heHNpemUsCisJCSAgIHNpemVfdCAqc3RhcnQpCit7CisJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBpLT5idmVjOworCXNpemVfdCBsZW4gPSBidmVjLT5idl9sZW4gLSBpLT5pb3Zfb2Zmc2V0OworCWlmIChsZW4gPiBpLT5jb3VudCkKKwkJbGVuID0gaS0+Y291bnQ7CisJaWYgKGxlbiA+IG1heHNpemUpCisJCWxlbiA9IG1heHNpemU7CisJKnN0YXJ0ID0gYnZlYy0+YnZfb2Zmc2V0ICsgaS0+aW92X29mZnNldDsKKworCSpwYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpwYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZXRfcGFnZSgqKnBhZ2VzID0gYnZlYy0+YnZfcGFnZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGlvdl9pdGVyX25wYWdlc19idmVjKGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSwgaW50IG1heHBhZ2VzKQoreworCXNpemVfdCBvZmZzZXQgPSBpLT5pb3Zfb2Zmc2V0OworCXNpemVfdCBzaXplID0gaS0+Y291bnQ7CisJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBpLT5idmVjOworCWludCBucGFnZXMgPSAwOworCWludCBuOworCisJZm9yIChuID0gMDsgc2l6ZSAmJiBuIDwgaS0+bnJfc2VnczsgbisrLCBidmVjKyspIHsKKwkJc2l6ZV90IGxlbiA9IGJ2ZWMtPmJ2X2xlbiAtIG9mZnNldDsKKwkJb2Zmc2V0ID0gMDsKKwkJaWYgKHVubGlrZWx5KCFsZW4pKQkvKiBlbXB0eSBzZWdtZW50ICovCisJCQljb250aW51ZTsKKwkJaWYgKGxlbiA+IHNpemUpCisJCQlsZW4gPSBzaXplOworCQlucGFnZXMrKzsKKwkJaWYgKG5wYWdlcyA+PSBtYXhwYWdlcykJLyogZG9uJ3QgYm90aGVyIGdvaW5nIGZ1cnRoZXIgKi8KKwkJCXJldHVybiBtYXhwYWdlczsKKwkJc2l6ZSAtPSBsZW47CisJCW9mZnNldCA9IDA7CisJfQorCXJldHVybiBtaW4obnBhZ2VzLCBtYXhwYWdlcyk7Cit9CisKK3NpemVfdCBjb3B5X3BhZ2VfdG9faXRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLAorCQkJIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIGNvcHlfcGFnZV90b19pdGVyX2J2ZWMocGFnZSwgb2Zmc2V0LCBieXRlcywgaSk7CisJZWxzZQorCQlyZXR1cm4gY29weV9wYWdlX3RvX2l0ZXJfaW92ZWMocGFnZSwgb2Zmc2V0LCBieXRlcywgaSk7Cit9CitFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZV90b19pdGVyKTsKKworc2l6ZV90IGNvcHlfcGFnZV9mcm9tX2l0ZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKwkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJaWYgKGktPnR5cGUgJiBJVEVSX0JWRUMpCisJCXJldHVybiBjb3B5X3BhZ2VfZnJvbV9pdGVyX2J2ZWMocGFnZSwgb2Zmc2V0LCBieXRlcywgaSk7CisJZWxzZQorCQlyZXR1cm4gY29weV9wYWdlX2Zyb21faXRlcl9pb3ZlYyhwYWdlLCBvZmZzZXQsIGJ5dGVzLCBpKTsKK30KK0VYUE9SVF9TWU1CT0woY29weV9wYWdlX2Zyb21faXRlcik7CisKK3NpemVfdCBpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXN0cnVjdCBpb3ZfaXRlciAqaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBieXRlcykKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyX2J2ZWMocGFnZSwgaSwgb2Zmc2V0LCBieXRlcyk7CisJZWxzZQorCQlyZXR1cm4gY29weV9mcm9tX3VzZXJfYXRvbWljX2lvdmVjKHBhZ2UsIGksIG9mZnNldCwgYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMpOworCit2b2lkIGlvdl9pdGVyX2FkdmFuY2Uoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJYWR2YW5jZV9idmVjKGksIHNpemUpOworCWVsc2UKKwkJYWR2YW5jZV9pb3ZlYyhpLCBzaXplKTsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfYWR2YW5jZSk7CisKIC8qCiAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIGp1c3QgdGhlIGN1cnJlbnQgaW92X2l0ZXIgc2VnbWVudC4KICAqLwogc2l6ZV90IGlvdl9pdGVyX3NpbmdsZV9zZWdfY291bnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppKQogewotCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ID0gaS0+aW92OwogCWlmIChpLT5ucl9zZWdzID09IDEpCiAJCXJldHVybiBpLT5jb3VudDsKKwllbHNlIGlmIChpLT50eXBlICYgSVRFUl9CVkVDKQorCQlyZXR1cm4gbWluKGktPmNvdW50LCBpLT5pb3YtPmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0KTsKIAllbHNlCi0JCXJldHVybiBtaW4oaS0+Y291bnQsIGlvdi0+aW92X2xlbiAtIGktPmlvdl9vZmZzZXQpOworCQlyZXR1cm4gbWluKGktPmNvdW50LCBpLT5idmVjLT5idl9sZW4gLSBpLT5pb3Zfb2Zmc2V0KTsKIH0KIEVYUE9SVF9TWU1CT0woaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudCk7CisKK3Vuc2lnbmVkIGxvbmcgaW92X2l0ZXJfYWxpZ25tZW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIGFsaWdubWVudF9idmVjKGkpOworCWVsc2UKKwkJcmV0dXJuIGFsaWdubWVudF9pb3ZlYyhpKTsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfYWxpZ25tZW50KTsKKworc3NpemVfdCBpb3ZfaXRlcl9nZXRfcGFnZXMoc3RydWN0IGlvdl9pdGVyICppLAorCQkgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3QgbWF4c2l6ZSwKKwkJICAgc2l6ZV90ICpzdGFydCkKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIGdldF9wYWdlc19idmVjKGksIHBhZ2VzLCBtYXhzaXplLCBzdGFydCk7CisJZWxzZQorCQlyZXR1cm4gZ2V0X3BhZ2VzX2lvdmVjKGksIHBhZ2VzLCBtYXhzaXplLCBzdGFydCk7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2dldF9wYWdlcyk7CisKK3NzaXplX3QgaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKHN0cnVjdCBpb3ZfaXRlciAqaSwKKwkJICAgc3RydWN0IHBhZ2UgKioqcGFnZXMsIHNpemVfdCBtYXhzaXplLAorCQkgICBzaXplX3QgKnN0YXJ0KQoreworCWlmIChpLT50eXBlICYgSVRFUl9CVkVDKQorCQlyZXR1cm4gZ2V0X3BhZ2VzX2FsbG9jX2J2ZWMoaSwgcGFnZXMsIG1heHNpemUsIHN0YXJ0KTsKKwllbHNlCisJCXJldHVybiBnZXRfcGFnZXNfYWxsb2NfaW92ZWMoaSwgcGFnZXMsIG1heHNpemUsIHN0YXJ0KTsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKTsKKworaW50IGlvdl9pdGVyX25wYWdlcyhjb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBtYXhwYWdlcykKK3sKKwlpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIGlvdl9pdGVyX25wYWdlc19idmVjKGksIG1heHBhZ2VzKTsKKwllbHNlCisJCXJldHVybiBpb3ZfaXRlcl9ucGFnZXNfaW92ZWMoaSwgbWF4cGFnZXMpOworfQorRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9ucGFnZXMpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jCmluZGV4IDU4YjUwZDIuLjI0M2E5YjcgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaW8uYworKysgYi9tbS9wYWdlX2lvLmMKQEAgLTI2NCw5ICsyNjQsMTcgQEAKIAkJc3RydWN0IGtpb2NiIGtpb2NiOwogCQlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlID0gc2lzLT5zd2FwX2ZpbGU7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gc3dhcF9maWxlLT5mX21hcHBpbmc7Ci0JCXN0cnVjdCBpb3ZlYyBpb3YgPSB7Ci0JCQkuaW92X2Jhc2UgPSBrbWFwKHBhZ2UpLAotCQkJLmlvdl9sZW4gID0gUEFHRV9TSVpFLAorCQlzdHJ1Y3QgYmlvX3ZlYyBidiA9IHsKKwkJCS5idl9wYWdlID0gcGFnZSwKKwkJCS5idl9sZW4gID0gUEFHRV9TSVpFLAorCQkJLmJ2X29mZnNldCA9IDAKKwkJfTsKKwkJc3RydWN0IGlvdl9pdGVyIGZyb20gPSB7CisJCQkudHlwZSA9IElURVJfQlZFQyB8IFdSSVRFLAorCQkJLmNvdW50ID0gUEFHRV9TSVpFLAorCQkJLmlvdl9vZmZzZXQgPSAwLAorCQkJLm5yX3NlZ3MgPSAxLAorCQkJLmJ2ZWMgPSAmYnYKIAkJfTsKIAogCQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBzd2FwX2ZpbGUpOwpAQCAtMjc1LDEwICsyODMsOSBAQAogCiAJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXJldCA9IG1hcHBpbmctPmFfb3BzLT5kaXJlY3RfSU8oS0VSTkVMX1dSSVRFLAotCQkJCQkJJmtpb2NiLCAmaW92LAotCQkJCQkJa2lvY2Iua2lfcG9zLCAxKTsKLQkJa3VubWFwKHBhZ2UpOworCQlyZXQgPSBtYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKElURVJfQlZFQyB8IFdSSVRFLAorCQkJCQkJJmtpb2NiLCAmZnJvbSwKKwkJCQkJCWtpb2NiLmtpX3Bvcyk7CiAJCWlmIChyZXQgPT0gUEFHRV9TSVpFKSB7CiAJCQljb3VudF92bV9ldmVudChQU1dQT1VUKTsKIAkJCXJldCA9IDA7CmRpZmYgLS1naXQgYS9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jIGIvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYwppbmRleCA4NTA1YzkyLi41MDc3YWZjIDEwMDY0NAotLS0gYS9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCisrKyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKQEAgLTQ2LDExICs0Niw3IEBACiAJCQljb3B5ID0gbGVuOwogCiAJCWlmICh2bV93cml0ZSkgewotCQkJaWYgKGNvcHkgPiBpb3ZfaXRlcl9jb3VudChpdGVyKSkKLQkJCQljb3B5ID0gaW92X2l0ZXJfY291bnQoaXRlcik7Ci0JCQljb3BpZWQgPSBpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcihwYWdlLCBpdGVyLAotCQkJCQlvZmZzZXQsIGNvcHkpOwotCQkJaW92X2l0ZXJfYWR2YW5jZShpdGVyLCBjb3BpZWQpOworCQkJY29waWVkID0gY29weV9wYWdlX2Zyb21faXRlcihwYWdlLCBvZmZzZXQsIGNvcHksIGl0ZXIpOwogCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKIAkJfSBlbHNlIHsKIAkJCWNvcGllZCA9IGNvcHlfcGFnZV90b19pdGVyKHBhZ2UsIG9mZnNldCwgY29weSwgaXRlcik7CkBAIC0yNzgsNyArMjc0LDcgQEAKIAlpZiAocmMgPD0gMCkKIAkJZ290byBmcmVlX2lvdmVjczsKIAotCWlvdl9pdGVyX2luaXQoJml0ZXIsIGlvdl9sLCBsaW92Y250LCByYywgMCk7CisJaW92X2l0ZXJfaW5pdCgmaXRlciwgdm1fd3JpdGUgPyBXUklURSA6IFJFQUQsIGlvdl9sLCBsaW92Y250LCByYyk7CiAKIAlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihDSEVDS19JT1ZFQ19PTkxZLCBydmVjLCByaW92Y250LCBVSU9fRkFTVElPViwKIAkJCQkgICBpb3ZzdGFja19yLCAmaW92X3IpOwpAQCAtMzQxLDcgKzMzNyw3IEBACiAJCQkJCQkgICZpb3ZfbCk7CiAJaWYgKHJjIDw9IDApCiAJCWdvdG8gZnJlZV9pb3ZlY3M7Ci0JaW92X2l0ZXJfaW5pdCgmaXRlciwgaW92X2wsIGxpb3ZjbnQsIHJjLCAwKTsKKwlpb3ZfaXRlcl9pbml0KCZpdGVyLCB2bV93cml0ZSA/IFdSSVRFIDogUkVBRCwgaW92X2wsIGxpb3ZjbnQsIHJjKTsKIAlyYyA9IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IoQ0hFQ0tfSU9WRUNfT05MWSwgcnZlYywgcmlvdmNudCwKIAkJCQkJICBVSU9fRkFTVElPViwgaW92c3RhY2tfciwKIAkJCQkJICAmaW92X3IpOwpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggNTQwMjQ4MS4uZjQ4NGMyNyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0xNDA2LDggKzE0MDYsNyBAQAogCXJldHVybiBjb3BpZWQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNobWVtX2ZpbGVfYWlvX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3Qgc2htZW1fZmlsZV9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKQEAgLTE0MTYsMTUgKzE0MTUsOCBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCWVudW0gc2dwX3R5cGUgc2dwID0gU0dQX1JFQUQ7CiAJaW50IGVycm9yID0gMDsKLQlzc2l6ZV90IHJldHZhbDsKLQlzaXplX3QgY291bnQ7CisJc3NpemVfdCByZXR2YWwgPSAwOwogCWxvZmZfdCAqcHBvcyA9ICZpb2NiLT5raV9wb3M7Ci0Jc3RydWN0IGlvdl9pdGVyIGl0ZXI7Ci0KLQlyZXR2YWwgPSBnZW5lcmljX3NlZ21lbnRfY2hlY2tzKGlvdiwgJm5yX3NlZ3MsICZjb3VudCwgVkVSSUZZX1dSSVRFKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCWlvdl9pdGVyX2luaXQoJml0ZXIsIGlvdiwgbnJfc2VncywgY291bnQsIDApOwogCiAJLyoKIAkgKiBNaWdodCB0aGlzIHJlYWQgYmUgZm9yIGEgc3RhY2tpbmcgZmlsZXN5c3RlbT8gIFRoZW4gd2hlbiByZWFkaW5nCkBAIC0xNTAwLDE0ICsxNDkyLDE0IEBACiAJCSAqIE9rLCB3ZSBoYXZlIHRoZSBwYWdlLCBhbmQgaXQncyB1cC10by1kYXRlLCBzbwogCQkgKiBub3cgd2UgY2FuIGNvcHkgaXQgdG8gdXNlciBzcGFjZS4uLgogCQkgKi8KLQkJcmV0ID0gY29weV9wYWdlX3RvX2l0ZXIocGFnZSwgb2Zmc2V0LCBuciwgJml0ZXIpOworCQlyZXQgPSBjb3B5X3BhZ2VfdG9faXRlcihwYWdlLCBvZmZzZXQsIG5yLCB0byk7CiAJCXJldHZhbCArPSByZXQ7CiAJCW9mZnNldCArPSByZXQ7CiAJCWluZGV4ICs9IG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCQlvZmZzZXQgJj0gflBBR0VfQ0FDSEVfTUFTSzsKIAogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWlmICghaW92X2l0ZXJfY291bnQoJml0ZXIpKQorCQlpZiAoIWlvdl9pdGVyX2NvdW50KHRvKSkKIAkJCWJyZWFrOwogCQlpZiAocmV0IDwgbnIpIHsKIAkJCWVycm9yID0gLUVGQVVMVDsKQEAgLTI2MjksMTMgKzI2MjEsMTMgQEAKIAkubW1hcAkJPSBzaG1lbV9tbWFwLAogI2lmZGVmIENPTkZJR19UTVBGUwogCS5sbHNlZWsJCT0gc2htZW1fZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IHNobWVtX2ZpbGVfYWlvX3JlYWQsCi0JLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCisJLnJlYWRfaXRlcgk9IHNobWVtX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLmZzeW5jCQk9IG5vb3BfZnN5bmMsCiAJLnNwbGljZV9yZWFkCT0gc2htZW1fZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZmFsbG9jYXRlCT0gc2htZW1fZmFsbG9jYXRlLAogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBlMDFkZWQzLi4wZjE2ZmZlIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJICogc3RhbGxzIGlmIHdlIG5lZWQgdG8gcnVuIGdldF9ibG9jaygpLiAgV2UgY291bGQgdGVzdAogCSAqIFBhZ2VQcml2YXRlIGZvciB0aGF0LgogCSAqCi0JICogSWYgdGhpcyBwcm9jZXNzIGlzIGN1cnJlbnRseSBpbiBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoKSBhZ2FpbnN0CisJICogSWYgdGhpcyBwcm9jZXNzIGlzIGN1cnJlbnRseSBpbiBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKCkgYWdhaW5zdAogCSAqIHRoaXMgcGFnZSdzIHF1ZXVlLCB3ZSBjYW4gcGVyZm9ybSB3cml0ZWJhY2sgZXZlbiBpZiB0aGF0CiAJICogd2lsbCBibG9jay4KIAkgKgpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCmluZGV4IDNjMzJiZDIuLjkwMTJiMWMgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2NvcmUuYworKysgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogLyogTXVzdCBiZSBpbnZva2VkIHdpdGggcmN1X3JlYWRfbG9jay4gKi8KLXN0cnVjdCBuZXRfZGV2aWNlICpfX3ZsYW5fZmluZF9kZXZfZGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RydWN0IG5ldF9kZXZpY2UgKl9fdmxhbl9maW5kX2Rldl9kZWVwX3JjdShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQlfX2JlMTYgdmxhbl9wcm90bywgdTE2IHZsYW5faWQpCiB7CiAJc3RydWN0IHZsYW5faW5mbyAqdmxhbl9pbmZvID0gcmN1X2RlcmVmZXJlbmNlKGRldi0+dmxhbl9pbmZvKTsKQEAgLTgxLDEzICs4MSwxMyBAQAogCiAJCXVwcGVyX2RldiA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldF9yY3UoZGV2KTsKIAkJaWYgKHVwcGVyX2RldikKLQkJCXJldHVybiBfX3ZsYW5fZmluZF9kZXZfZGVlcCh1cHBlcl9kZXYsCisJCQlyZXR1cm4gX192bGFuX2ZpbmRfZGV2X2RlZXBfcmN1KHVwcGVyX2RldiwKIAkJCQkJCSAgICB2bGFuX3Byb3RvLCB2bGFuX2lkKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0woX192bGFuX2ZpbmRfZGV2X2RlZXApOworRVhQT1JUX1NZTUJPTChfX3ZsYW5fZmluZF9kZXZfZGVlcF9yY3UpOwogCiBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXZfcmVhbF9kZXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2Rldi5jIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKaW5kZXggMDE5ZWZiNy4uYWQyYWMzYyAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKQEAgLTY0Myw5ICs2NDMsOSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJbmV0ZGV2X2ZlYXR1cmVzX3Qgb2xkX2ZlYXR1cmVzID0gZmVhdHVyZXM7CiAKLQlmZWF0dXJlcyAmPSByZWFsX2Rldi0+dmxhbl9mZWF0dXJlczsKKwlmZWF0dXJlcyA9IG5ldGRldl9pbnRlcnNlY3RfZmVhdHVyZXMoZmVhdHVyZXMsIHJlYWxfZGV2LT52bGFuX2ZlYXR1cmVzKTsKIAlmZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKLQlmZWF0dXJlcyAmPSByZWFsX2Rldi0+ZmVhdHVyZXM7CisJZmVhdHVyZXMgPSBuZXRkZXZfaW50ZXJzZWN0X2ZlYXR1cmVzKGZlYXR1cmVzLCByZWFsX2Rldi0+ZmVhdHVyZXMpOwogCiAJZmVhdHVyZXMgfD0gb2xkX2ZlYXR1cmVzICYgTkVUSUZfRl9TT0ZUX0ZFQVRVUkVTOwogCWZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKQEAgLTY3MSwzOCArNjcxLDM2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnZsYW5fZGV2X2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CisJc3RydWN0IHZsYW5fcGNwdV9zdGF0cyAqcDsKKwl1MzIgcnhfZXJyb3JzID0gMCwgdHhfZHJvcHBlZCA9IDA7CisJaW50IGk7CiAKLQlpZiAodmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX3BjcHVfc3RhdHMpIHsKLQkJc3RydWN0IHZsYW5fcGNwdV9zdGF0cyAqcDsKLQkJdTMyIHJ4X2Vycm9ycyA9IDAsIHR4X2Ryb3BwZWQgPSAwOwotCQlpbnQgaTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQl1NjQgcnhwYWNrZXRzLCByeGJ5dGVzLCByeG11bHRpY2FzdCwgdHhwYWNrZXRzLCB0eGJ5dGVzOworCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCXU2NCByeHBhY2tldHMsIHJ4Ynl0ZXMsIHJ4bXVsdGljYXN0LCB0eHBhY2tldHMsIHR4Ynl0ZXM7Ci0JCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJCXAgPSBwZXJfY3B1X3B0cih2bGFuX2Rldl9wcml2KGRldiktPnZsYW5fcGNwdV9zdGF0cywgaSk7CisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycSgmcC0+c3luY3ApOworCQkJcnhwYWNrZXRzCT0gcC0+cnhfcGFja2V0czsKKwkJCXJ4Ynl0ZXMJCT0gcC0+cnhfYnl0ZXM7CisJCQlyeG11bHRpY2FzdAk9IHAtPnJ4X211bHRpY2FzdDsKKwkJCXR4cGFja2V0cwk9IHAtPnR4X3BhY2tldHM7CisJCQl0eGJ5dGVzCQk9IHAtPnR4X2J5dGVzOworCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfaXJxKCZwLT5zeW5jcCwgc3RhcnQpKTsKIAotCQkJcCA9IHBlcl9jcHVfcHRyKHZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9wY3B1X3N0YXRzLCBpKTsKLQkJCWRvIHsKLQkJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJnAtPnN5bmNwKTsKLQkJCQlyeHBhY2tldHMJPSBwLT5yeF9wYWNrZXRzOwotCQkJCXJ4Ynl0ZXMJCT0gcC0+cnhfYnl0ZXM7Ci0JCQkJcnhtdWx0aWNhc3QJPSBwLT5yeF9tdWx0aWNhc3Q7Ci0JCQkJdHhwYWNrZXRzCT0gcC0+dHhfcGFja2V0czsKLQkJCQl0eGJ5dGVzCQk9IHAtPnR4X2J5dGVzOwotCQkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycSgmcC0+c3luY3AsIHN0YXJ0KSk7Ci0KLQkJCXN0YXRzLT5yeF9wYWNrZXRzCSs9IHJ4cGFja2V0czsKLQkJCXN0YXRzLT5yeF9ieXRlcwkJKz0gcnhieXRlczsKLQkJCXN0YXRzLT5tdWx0aWNhc3QJKz0gcnhtdWx0aWNhc3Q7Ci0JCQlzdGF0cy0+dHhfcGFja2V0cwkrPSB0eHBhY2tldHM7Ci0JCQlzdGF0cy0+dHhfYnl0ZXMJCSs9IHR4Ynl0ZXM7Ci0JCQkvKiByeF9lcnJvcnMgJiB0eF9kcm9wcGVkIGFyZSB1MzIgKi8KLQkJCXJ4X2Vycm9ycwkrPSBwLT5yeF9lcnJvcnM7Ci0JCQl0eF9kcm9wcGVkCSs9IHAtPnR4X2Ryb3BwZWQ7Ci0JCX0KLQkJc3RhdHMtPnJ4X2Vycm9ycyAgPSByeF9lcnJvcnM7Ci0JCXN0YXRzLT50eF9kcm9wcGVkID0gdHhfZHJvcHBlZDsKKwkJc3RhdHMtPnJ4X3BhY2tldHMJKz0gcnhwYWNrZXRzOworCQlzdGF0cy0+cnhfYnl0ZXMJCSs9IHJ4Ynl0ZXM7CisJCXN0YXRzLT5tdWx0aWNhc3QJKz0gcnhtdWx0aWNhc3Q7CisJCXN0YXRzLT50eF9wYWNrZXRzCSs9IHR4cGFja2V0czsKKwkJc3RhdHMtPnR4X2J5dGVzCQkrPSB0eGJ5dGVzOworCQkvKiByeF9lcnJvcnMgJiB0eF9kcm9wcGVkIGFyZSB1MzIgKi8KKwkJcnhfZXJyb3JzCSs9IHAtPnJ4X2Vycm9yczsKKwkJdHhfZHJvcHBlZAkrPSBwLT50eF9kcm9wcGVkOwogCX0KKwlzdGF0cy0+cnhfZXJyb3JzICA9IHJ4X2Vycm9yczsKKwlzdGF0cy0+dHhfZHJvcHBlZCA9IHR4X2Ryb3BwZWQ7CisKIAlyZXR1cm4gc3RhdHM7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvZGRwLmMgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCmluZGV4IDc4NmVlMmYuLjAxYTEwODIgMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvZGRwLmMKKysrIGIvbmV0L2FwcGxldGFsay9kZHAuYwpAQCAtMTY2OSw3ICsxNjY5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHNrLT5za19ub19jaGVjayA9PSAxKQorCWlmIChzay0+c2tfbm9fY2hlY2tfdHgpCiAJCWRkcC0+ZGVoX3N1bSA9IDA7CiAJZWxzZQogCQlkZHAtPmRlaF9zdW0gPSBhdGFsa19jaGVja3N1bShza2IsIGxlbiArIHNpemVvZigqZGRwKSk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL3N2Yy5jIGIvbmV0L2F0bS9zdmMuYwppbmRleCAxMjgxMDQ5Li5kOGU1ZDBjMiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9zdmMuYworKysgYi9uZXQvYXRtL3N2Yy5jCkBAIC0yNjMsMTcgKzI2MywxMSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0vKgotICogTm90IHN1cHBvcnRlZCB5ZXQKLSAqCi0gKiAjaWZuZGVmIENPTkZJR19TSU5HTEVfU0lHSVRGCi0gKi8KKwogCXZjYy0+cW9zLnR4dHAubWF4X3BjciA9IFNFTEVDVF9UT1BfUENSKHZjYy0+cW9zLnR4dHApOwogCXZjYy0+cW9zLnR4dHAucGNyID0gMDsKIAl2Y2MtPnFvcy50eHRwLm1pbl9wY3IgPSAwOwotLyoKLSAqICNlbmRpZgotICovCisKIAllcnJvciA9IHZjY19jb25uZWN0KHNvY2ssIHZjYy0+aXRmLCB2Y2MtPnZwaSwgdmNjLT52Y2kpOwogCWlmICghZXJyb3IpCiAJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jIGIvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jCmluZGV4IGI3NTg4ODEuLmExMmUyNWUgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuYworKysgYi9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmMKQEAgLTI0NSw2ICsyNDUsNyBAQAogc3RhdGljIGludCBiYXRhZHZfb3JpZ2luYXRvcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7CisKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYmF0YWR2X29yaWdfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwogfQogCkBAIC0yNTgsMTggKzI1OSwyMSBAQAogCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKKwogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBiYXRhZHZfb3JpZ19oYXJkaWZfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwogfQogCiBzdGF0aWMgaW50IGJhdGFkdl9nYXRld2F5c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKKwogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBiYXRhZHZfZ3dfY2xpZW50X3NlcV9wcmludF90ZXh0LCBuZXRfZGV2KTsKIH0KIAogc3RhdGljIGludCBiYXRhZHZfdHJhbnN0YWJsZV9nbG9iYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7CisKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYmF0YWR2X3R0X2dsb2JhbF9zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7CiB9CiAKQEAgLTI3Nyw2ICsyODEsNyBAQAogc3RhdGljIGludCBiYXRhZHZfYmxhX2NsYWltX3RhYmxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOworCiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGJhdGFkdl9ibGFfY2xhaW1fdGFibGVfc2VxX3ByaW50X3RleHQsCiAJCQkgICBuZXRfZGV2KTsKIH0KQEAgLTI4NSw2ICsyOTAsNyBAQAogCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKKwogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBiYXRhZHZfYmxhX2JhY2tib25lX3RhYmxlX3NlcV9wcmludF90ZXh0LAogCQkJICAgbmV0X2Rldik7CiB9CkBAIC0zMDAsNiArMzA2LDcgQEAKIHN0YXRpYyBpbnQgYmF0YWR2X2RhdF9jYWNoZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKKwogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBiYXRhZHZfZGF0X2NhY2hlX3NlcV9wcmludF90ZXh0LCBuZXRfZGV2KTsKIH0KICNlbmRpZgpAQCAtMzA3LDYgKzMxNCw3IEBACiBzdGF0aWMgaW50IGJhdGFkdl90cmFuc3RhYmxlX2xvY2FsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOworCiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGJhdGFkdl90dF9sb2NhbF9zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7CiB9CiAKQEAgLTMxOSw2ICszMjcsNyBAQAogc3RhdGljIGludCBiYXRhZHZfbmNfbm9kZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7CisKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYmF0YWR2X25jX25vZGVzX3NlcV9wcmludF90ZXh0LCBuZXRfZGV2KTsKIH0KICNlbmRpZgpAQCAtMzMzLDcgKzM0Miw3IEBACiAJCSAgLmxsc2VlayA9IHNlcV9sc2VlaywJCQlcCiAJCSAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwJCVwKIAkJfQkJCQkJXAotfTsKK30KIAogLyogdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBnZW5lcmFsIGFuZCB0aGVyZWZvcmUgdGhleSB3aWxsIGJlIGRpcmVjdGx5CiAgKiBwbGFjZWQgaW4gdGhlIEJBVEFEVl9ERUJVR0ZTX1NVQkRJUiBzdWJkaXJlY3Rvcnkgb2YgZGVidWdmcwpAQCAtMzk1LDcgKzQwNCw3IEBACiAJCS5sbHNlZWsgPSBzZXFfbHNlZWssCQkJCVwKIAkJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwJCQlcCiAJfSwJCQkJCQkJXAotfTsKK30KIHN0YXRpYyBCQVRBRFZfSEFSRElGX0RFQlVHSU5GTyhvcmlnaW5hdG9ycywgU19JUlVHTywKIAkJCSAgICAgICBiYXRhZHZfb3JpZ2luYXRvcnNfaGFyZGlmX29wZW4pOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9kaXN0cmlidXRlZC1hcnAtdGFibGUuYyBiL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCmluZGV4IGFhNWQ0OTQuLmYyYzA2NmIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCkBAIC01OTQsNyArNTk0LDcgQEAKIAkJaWYgKCFuZWlnaF9ub2RlKQogCQkJZ290byBmcmVlX29yaWc7CiAKLQkJdG1wX3NrYiA9IHBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQl0bXBfc2tiID0gcHNrYl9jb3B5X2Zvcl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCQlpZiAoIWJhdGFkdl9zZW5kX3NrYl9wcmVwYXJlX3VuaWNhc3RfNGFkZHIoYmF0X3ByaXYsIHRtcF9za2IsCiAJCQkJCQkJICAgY2FuZFtpXS5vcmlnX25vZGUsCiAJCQkJCQkJICAgcGFja2V0X3N1YnR5cGUpKSB7CkBAIC02NjIsNiArNjYyLDcgQEAKIHZvaWQgYmF0YWR2X2RhdF9zdGF0dXNfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwogCWJhdGFkdl9kYXRfdHZsdl9jb250YWluZXJfdXBkYXRlKGJhdF9wcml2KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5oIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCmluZGV4IDc3MGRjODkuLjExOGI5OTAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L21haW4uaAorKysgYi9uZXQvYmF0bWFuLWFkdi9tYWluLmgKQEAgLTI0LDcgKzI0LDcgQEAKICNkZWZpbmUgQkFUQURWX0RSSVZFUl9ERVZJQ0UgImJhdG1hbi1hZHYiCiAKICNpZm5kZWYgQkFUQURWX1NPVVJDRV9WRVJTSU9OCi0jZGVmaW5lIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTiAiMjAxNC4yLjAiCisjZGVmaW5lIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTiAiMjAxNC4zLjAiCiAjZW5kaWYKIAogLyogQi5BLlQuTS5BLk4uIHBhcmFtZXRlcnMgKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMgYi9uZXQvYmF0bWFuLWFkdi9uZXR3b3JrLWNvZGluZy5jCmluZGV4IGE5NTQ2ZmUuLjhkMDRkMTcgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbmV0d29yay1jb2RpbmcuYwpAQCAtODYsNiArODYsNyBAQAogdm9pZCBiYXRhZHZfbmNfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisKIAliYXRhZHZfbmNfdHZsdl9jb250YWluZXJfdXBkYXRlKGJhdF9wcml2KTsKIH0KIApAQCAtMTM0Myw3ICsxMzQ0LDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAKIAkvKiBDb3B5IHNrYiBoZWFkZXIgdG8gY2hhbmdlIHRoZSBtYWMgaGVhZGVyICovCi0Jc2tiID0gcHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJc2tiID0gcHNrYl9jb3B5X2Zvcl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCmluZGV4IDc0NGE1OWIuLmU3ZWU2NWQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAJLyogZ2VuZXJhdGUgcmFuZG9tIGFkZHJlc3MgKi8KIAlldGhfaHdfYWRkcl9yYW5kb20oZGV2KTsKIAotCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRhZHZfZXRodG9vbF9vcHMpOworCWRldi0+ZXRodG9vbF9vcHMgPSAmYmF0YWR2X2V0aHRvb2xfb3BzOwogCiAJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYyBiL25ldC9iYXRtYW4tYWR2L3N5c2ZzLmMKaW5kZXggMWViYjBkOS4uZmM0N2JhYSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zeXNmcy5jCkBAIC0yOSwxMiArMjksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmF0YWR2X2tvYmpfdG9fbmV0ZGV2KHN0cnVjdCBrb2JqZWN0ICpvYmopCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG9iai0+cGFyZW50LCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwogCXJldHVybiB0b19uZXRfZGV2KGRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdGFkdl9rb2JqX3RvX2JhdHByaXYoc3RydWN0IGtvYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGJhdGFkdl9rb2JqX3RvX25ldGRldihvYmopOworCiAJcmV0dXJuIG5ldGRldl9wcml2KG5ldF9kZXYpOwogfQogCkBAIC0xMDYsNyArMTA4LDcgQEAKIAkJIC5tb2RlID0gX21vZGUgfSwJCQlcCiAJLnNob3cgICA9IF9zaG93LAkJCQlcCiAJLnN0b3JlICA9IF9zdG9yZSwJCQkJXAotfTsKK30KIAogLyogVXNlIHRoaXMsIGlmIHlvdSBoYXZlIGN1c3RvbWl6ZWQgc2hvdyBhbmQgc3RvcmUgZnVuY3Rpb25zICovCiAjZGVmaW5lIEJBVEFEVl9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkJXApAQCAtMTE1LDcgKzExNyw3IEBACiAJCSAubW9kZSA9IF9tb2RlIH0sCQkJXAogCS5zaG93ICAgPSBfc2hvdywJCQkJXAogCS5zdG9yZSAgPSBfc3RvcmUsCQkJCVwKLX07Cit9CiAKICNkZWZpbmUgQkFUQURWX0FUVFJfU0lGX1NUT1JFX0JPT0woX25hbWUsIF9wb3N0X2Z1bmMpCQkJXAogc3NpemVfdCBiYXRhZHZfc3RvcmVfIyNfbmFtZShzdHJ1Y3Qga29iamVjdCAqa29iaiwJCQlcCkBAIC0xMjQsNiArMTI2LDcgQEAKIHsJCQkJCQkJCQlcCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiYXRhZHZfa29ial90b19uZXRkZXYoa29iaik7CVwKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CQlcCisJCQkJCQkJCQlcCiAJcmV0dXJuIF9fYmF0YWR2X3N0b3JlX2Jvb2xfYXR0cihidWZmLCBjb3VudCwgX3Bvc3RfZnVuYywgYXR0ciwJXAogCQkJCQkmYmF0X3ByaXYtPl9uYW1lLCBuZXRfZGV2KTsJXAogfQpAQCAtMTMzLDYgKzEzNiw3IEBACiAJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZikJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IGJhdGFkdl9rb2JqX3RvX2JhdHByaXYoa29iaik7CVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gc3ByaW50ZihidWZmLCAiJXNcbiIsCQkJCQlcCiAJCSAgICAgICBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPl9uYW1lKSA9PSAwID8JCVwKIAkJICAgICAgICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwkJCQlcCkBAIC0xNTUsNiArMTU5LDcgQEAKIHsJCQkJCQkJCQlcCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiYXRhZHZfa29ial90b19uZXRkZXYoa29iaik7CVwKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CQlcCisJCQkJCQkJCQlcCiAJcmV0dXJuIF9fYmF0YWR2X3N0b3JlX3VpbnRfYXR0cihidWZmLCBjb3VudCwgX21pbiwgX21heCwJXAogCQkJCQlfcG9zdF9mdW5jLCBhdHRyLAkJXAogCQkJCQkmYmF0X3ByaXYtPl9uYW1lLCBuZXRfZGV2KTsJXApAQCAtMTY1LDYgKzE3MCw3IEBACiAJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZikJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IGJhdGFkdl9rb2JqX3RvX2JhdHByaXYoa29iaik7CVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gc3ByaW50ZihidWZmLCAiJWlcbiIsIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+X25hbWUpKTsJXAogfQkJCQkJCQkJCVwKIApAQCAtMTg4LDYgKzE5NCw3IEBACiAJc2l6ZV90IHJlcyA9IF9fYmF0YWR2X3N0b3JlX2Jvb2xfYXR0cihidWZmLCBjb3VudCwgX3Bvc3RfZnVuYywJXAogCQkJCQkgICAgICBhdHRyLCAmdmxhbi0+X25hbWUsCVwKIAkJCQkJICAgICAgYmF0X3ByaXYtPnNvZnRfaWZhY2UpOwlcCisJCQkJCQkJCQlcCiAJYmF0YWR2X3NvZnRpZl92bGFuX2ZyZWVfcmVmKHZsYW4pOwkJCQlcCiAJcmV0dXJuIHJlczsJCQkJCQkJXAogfQpAQCAtMjAyLDYgKzIwOSw3IEBACiAJc2l6ZV90IHJlcyA9IHNwcmludGYoYnVmZiwgIiVzXG4iLAkJCQlcCiAJCQkgICAgIGF0b21pY19yZWFkKCZ2bGFuLT5fbmFtZSkgPT0gMCA/CQlcCiAJCQkgICAgICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwkJCVwKKwkJCQkJCQkJCVwKIAliYXRhZHZfc29mdGlmX3ZsYW5fZnJlZV9yZWYodmxhbik7CQkJCVwKIAlyZXR1cm4gcmVzOwkJCQkJCQlcCiB9CkBAIC0zMjQsMTIgKzMzMiwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmKQogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBiYXRhZHZfa29ial90b19iYXRwcml2KGtvYmopOworCiAJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLCBiYXRfcHJpdi0+YmF0X2FsZ29fb3BzLT5uYW1lKTsKIH0KIAogc3RhdGljIHZvaWQgYmF0YWR2X3Bvc3RfZ3dfcmVzZWxlY3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCiAJYmF0YWR2X2d3X3Jlc2VsZWN0KGJhdF9wcml2KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC82bG93cGFuLmMgYi9uZXQvYmx1ZXRvb3RoLzZsb3dwYW4uYwppbmRleCA3MzQ5MmI5Li44Nzk2ZmZhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoLzZsb3dwYW4uYworKysgYi9uZXQvYmx1ZXRvb3RoLzZsb3dwYW4uYwpAQCAtNDIwLDEyICs0MjAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZ2V0X2Rlc3RfYmRhZGRyKHN0cnVjdCBpbjZfYWRkciAqaXA2X2RhZGRyLAotCQkJICAgIGJkYWRkcl90ICphZGRyLCB1OCAqYWRkcl90eXBlKQorc3RhdGljIHU4IGdldF9hZGRyX3R5cGVfZnJvbV9ldWk2NCh1OCBieXRlKQogewotCXU4ICpldWk2NDsKKwkvKiBJcyB1bml2ZXJzYWwoMCkgb3IgbG9jYWwoMSkgYml0LCAgKi8KKwlpZiAoYnl0ZSAmIDB4MDIpCisJCXJldHVybiBBRERSX0xFX0RFVl9SQU5ET007CiAKLQlldWk2NCA9IGlwNl9kYWRkci0+czZfYWRkciArIDg7CisJcmV0dXJuIEFERFJfTEVfREVWX1BVQkxJQzsKK30KKworc3RhdGljIHZvaWQgY29weV90b19iZGFkZHIoc3RydWN0IGluNl9hZGRyICppcDZfZGFkZHIsIGJkYWRkcl90ICphZGRyKQoreworCXU4ICpldWk2NCA9IGlwNl9kYWRkci0+czZfYWRkciArIDg7CiAKIAlhZGRyLT5iWzBdID0gZXVpNjRbN107CiAJYWRkci0+YlsxXSA9IGV1aTY0WzZdOwpAQCAtNDMzLDE2ICs0MzksMTkgQEAKIAlhZGRyLT5iWzNdID0gZXVpNjRbMl07CiAJYWRkci0+Yls0XSA9IGV1aTY0WzFdOwogCWFkZHItPmJbNV0gPSBldWk2NFswXTsKK30KIAotCWFkZHItPmJbNV0gXj0gMjsKK3N0YXRpYyB2b2lkIGNvbnZlcnRfZGVzdF9iZGFkZHIoc3RydWN0IGluNl9hZGRyICppcDZfZGFkZHIsCisJCQkJYmRhZGRyX3QgKmFkZHIsIHU4ICphZGRyX3R5cGUpCit7CisJY29weV90b19iZGFkZHIoaXA2X2RhZGRyLCBhZGRyKTsKIAotCS8qIFNldCB1bml2ZXJzYWwvbG9jYWwgYml0IHRvIDAgKi8KLQlpZiAoYWRkci0+Yls1XSAmIDEpIHsKLQkJYWRkci0+Yls1XSAmPSB+MTsKLQkJKmFkZHJfdHlwZSA9IEFERFJfTEVfREVWX1BVQkxJQzsKLQl9IGVsc2UgewotCQkqYWRkcl90eXBlID0gQUREUl9MRV9ERVZfUkFORE9NOwotCX0KKwkvKiBXZSBuZWVkIHRvIHRvZ2dsZSB0aGUgVS9MIGJpdCB0aGF0IHdlIGdvdCBmcm9tIElQdjYgYWRkcmVzcworCSAqIHNvIHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIgYWRkcmVzcyBhbmQgdHlwZSBvZiB0aGUgQkQgYWRkcmVzcy4KKwkgKi8KKwlhZGRyLT5iWzVdIF49IDB4MDI7CisKKwkqYWRkcl90eXBlID0gZ2V0X2FkZHJfdHlwZV9mcm9tX2V1aTY0KGFkZHItPmJbNV0pOwogfQogCiBzdGF0aWMgaW50IGhlYWRlcl9jcmVhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKQEAgLTQ3Myw5ICs0ODIsMTEgQEAKIAkJLyogR2V0IGRlc3RpbmF0aW9uIEJUIGRldmljZSBmcm9tIHNrYi4KIAkJICogSWYgdGhlcmUgaXMgbm8gc3VjaCBwZWVyIHRoZW4gZGlzY2FyZCB0aGUgcGFja2V0LgogCQkgKi8KLQkJZ2V0X2Rlc3RfYmRhZGRyKCZoZHItPmRhZGRyLCAmYWRkciwgJmFkZHJfdHlwZSk7CisJCWNvbnZlcnRfZGVzdF9iZGFkZHIoJmhkci0+ZGFkZHIsICZhZGRyLCAmYWRkcl90eXBlKTsKIAotCQlCVF9EQkcoImRlc3QgYWRkciAlcE1SIHR5cGUgJWQiLCAmYWRkciwgYWRkcl90eXBlKTsKKwkJQlRfREJHKCJkZXN0IGFkZHIgJXBNUiB0eXBlICVzIElQICVwSTZjIiwgJmFkZHIsCisJCSAgICAgICBhZGRyX3R5cGUgPT0gQUREUl9MRV9ERVZfUFVCTElDID8gIlBVQkxJQyIgOiAiUkFORE9NIiwKKwkJICAgICAgICZoZHItPmRhZGRyKTsKIAogCQlyZWFkX2xvY2tfaXJxc2F2ZSgmZGV2aWNlc19sb2NrLCBmbGFncyk7CiAJCXBlZXIgPSBwZWVyX2xvb2t1cF9iYShkZXYsICZhZGRyLCBhZGRyX3R5cGUpOwpAQCAtNTU2LDcgKzU2Nyw3IEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlnZXRfZGVzdF9iZGFkZHIoJmxvd3Bhbl9jYihza2IpLT5hZGRyLCAmYWRkciwgJmFkZHJfdHlwZSk7CisJCWNvbnZlcnRfZGVzdF9iZGFkZHIoJmxvd3Bhbl9jYihza2IpLT5hZGRyLCAmYWRkciwgJmFkZHJfdHlwZSk7CiAJCWV1aTY0X2FkZHIgPSBsb3dwYW5fY2Ioc2tiKS0+YWRkci5zNl9hZGRyICsgODsKIAkJZGV2ID0gbG93cGFuX2RldihuZXRkZXYpOwogCkBAIC01NjQsOCArNTc1LDEwIEBACiAJCXBlZXIgPSBwZWVyX2xvb2t1cF9iYShkZXYsICZhZGRyLCBhZGRyX3R5cGUpOwogCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VzX2xvY2ssIGZsYWdzKTsKIAotCQlCVF9EQkcoInhtaXQgZnJvbSAlcyB0byAlcE1SICglcEk2YykgcGVlciAlcCIsIG5ldGRldi0+bmFtZSwKLQkJICAgICAgICZhZGRyLCAmbG93cGFuX2NiKHNrYiktPmFkZHIsIHBlZXIpOworCQlCVF9EQkcoInhtaXQgJXMgdG8gJXBNUiB0eXBlICVzIElQICVwSTZjIHBlZXIgJXAiLAorCQkgICAgICAgbmV0ZGV2LT5uYW1lLCAmYWRkciwKKwkJICAgICAgIGFkZHJfdHlwZSA9PSBBRERSX0xFX0RFVl9QVUJMSUMgPyAiUFVCTElDIiA6ICJSQU5ET00iLAorCQkgICAgICAgJmxvd3Bhbl9jYihza2IpLT5hZGRyLCBwZWVyKTsKIAogCQlpZiAocGVlciAmJiBwZWVyLT5jb25uKQogCQkJZXJyID0gc2VuZF9wa3QocGVlci0+Y29ubiwgbmV0ZGV2LT5kZXZfYWRkciwKQEAgLTYyMCwxMyArNjMzLDEzIEBACiAJZXVpWzZdID0gYWRkclsxXTsKIAlldWlbN10gPSBhZGRyWzBdOwogCi0JZXVpWzBdIF49IDI7Ci0KLQkvKiBVbml2ZXJzYWwvbG9jYWwgYml0IHNldCwgUkZDIDQyOTEgKi8KKwkvKiBVbml2ZXJzYWwvbG9jYWwgYml0IHNldCwgQlQgNmxvd3BhbiBkcmFmdCBjaC4gMy4yLjEgKi8KIAlpZiAoYWRkcl90eXBlID09IEFERFJfTEVfREVWX1BVQkxJQykKLQkJZXVpWzBdIHw9IDE7CisJCWV1aVswXSAmPSB+MHgwMjsKIAllbHNlCi0JCWV1aVswXSAmPSB+MTsKKwkJZXVpWzBdIHw9IDB4MDI7CisKKwlCVF9EQkcoInR5cGUgJWQgYWRkciAlKnBoQyIsIGFkZHJfdHlwZSwgOCwgZXVpKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2Rldl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGJkYWRkcl90ICphZGRyLApAQCAtNjM0LDcgKzY0Nyw2IEBACiB7CiAJbmV0ZGV2LT5hZGRyX2Fzc2lnbl90eXBlID0gTkVUX0FERFJfUEVSTTsKIAlzZXRfYWRkcihuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5iLCBhZGRyX3R5cGUpOwotCW5ldGRldi0+ZGV2X2FkZHJbMF0gXj0gMjsKIH0KIAogc3RhdGljIHZvaWQgaWZ1cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtNjg0LDEzICs2OTYsNiBAQAogCiAJbWVtY3B5KCZwZWVyLT5ldWk2NF9hZGRyLCAodTggKikmcGVlci0+cGVlcl9hZGRyLnM2X2FkZHIgKyA4LAogCSAgICAgICBFVUk2NF9BRERSX0xFTik7Ci0JcGVlci0+ZXVpNjRfYWRkclswXSBePSAyOyAvKiBzZWNvbmQgYml0LWZsaXAgKFVuaXZlcnNlL0xvY2FsKQotCQkJCSAgICogaXMgZG9uZSBhY2NvcmRpbmcgUkZDMjQ2NAotCQkJCSAgICovCi0KLQlyYXdfZHVtcF9pbmxpbmUoX19mdW5jX18sICJwZWVyIElQdjYgYWRkcmVzcyIsCi0JCQkodW5zaWduZWQgY2hhciAqKSZwZWVyLT5wZWVyX2FkZHIsIDE2KTsKLQlyYXdfZHVtcF9pbmxpbmUoX19mdW5jX18sICJwZWVyIEVVSTY0IGFkZHJlc3MiLCBwZWVyLT5ldWk2NF9hZGRyLCA4KTsKIAogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZGV2aWNlc19sb2NrLCBmbGFncyk7CiAJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmxpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCmluZGV4IDUyMWZkNGYuLjg2NzFiYzcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KIAogI2luY2x1ZGUgInNtcC5oIgogI2luY2x1ZGUgImEybXAuaCIKQEAgLTM2Nyw5ICszNjgsMjMgQEAKIHsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhjaV9jb25uLAogCQkJCQkgICAgIGxlX2Nvbm5fdGltZW91dC53b3JrKTsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CiAKIAlCVF9EQkcoIiIpOwogCisJLyogV2UgY291bGQgZW5kIHVwIGhlcmUgZHVlIHRvIGhhdmluZyBkb25lIGRpcmVjdGVkIGFkdmVydGlzaW5nLAorCSAqIHNvIGNsZWFuIHVwIHRoZSBzdGF0ZSBpZiBuZWNlc3NhcnkuIFRoaXMgc2hvdWxkIGhvd2V2ZXIgb25seQorCSAqIGhhcHBlbiB3aXRoIGJyb2tlbiBoYXJkd2FyZSBvciBpZiBsb3cgZHV0eSBjeWNsZSB3YXMgdXNlZAorCSAqICh3aGljaCBkb2Vzbid0IGhhdmUgYSB0aW1lb3V0IG9mIGl0cyBvd24pLgorCSAqLworCWlmICh0ZXN0X2JpdChIQ0lfQURWRVJUSVNJTkcsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJCXU4IGVuYWJsZSA9IDB4MDA7CisJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfTEVfU0VUX0FEVl9FTkFCTEUsIHNpemVvZihlbmFibGUpLAorCQkJICAgICAmZW5hYmxlKTsKKwkJaGNpX2xlX2Nvbm5fZmFpbGVkKGNvbm4sIEhDSV9FUlJPUl9BRFZFUlRJU0lOR19USU1FT1VUKTsKKwkJcmV0dXJuOworCX0KKwogCWhjaV9sZV9jcmVhdGVfY29ubmVjdGlvbl9jYW5jZWwoY29ubik7CiB9CiAKQEAgLTM5Myw2ICs0MDgsOCBAQAogCWNvbm4tPmlvX2NhcGFiaWxpdHkgPSBoZGV2LT5pb19jYXBhYmlsaXR5OwogCWNvbm4tPnJlbW90ZV9hdXRoID0gMHhmZjsKIAljb25uLT5rZXlfdHlwZSA9IDB4ZmY7CisJY29ubi0+dHhfcG93ZXIgPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRDsKKwljb25uLT5tYXhfdHhfcG93ZXIgPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRDsKIAogCXNldF9iaXQoSENJX0NPTk5fUE9XRVJfU0FWRSwgJmNvbm4tPmZsYWdzKTsKIAljb25uLT5kaXNjX3RpbWVvdXQgPSBIQ0lfRElTQ09OTl9USU1FT1VUOwpAQCAtNDAxLDYgKzQxOCwxMCBAQAogCWNhc2UgQUNMX0xJTks6CiAJCWNvbm4tPnBrdF90eXBlID0gaGRldi0+cGt0X3R5cGUgJiBBQ0xfUFRZUEVfTUFTSzsKIAkJYnJlYWs7CisJY2FzZSBMRV9MSU5LOgorCQkvKiBjb25uLT5zcmMgc2hvdWxkIHJlZmxlY3QgdGhlIGxvY2FsIGlkZW50aXR5IGFkZHJlc3MgKi8KKwkJaGNpX2NvcHlfaWRlbnRpdHlfYWRkcmVzcyhoZGV2LCAmY29ubi0+c3JjLCAmY29ubi0+c3JjX3R5cGUpOworCQlicmVhazsKIAljYXNlIFNDT19MSU5LOgogCQlpZiAobG1wX2VzY29fY2FwYWJsZShoZGV2KSkKIAkJCWNvbm4tPnBrdF90eXBlID0gKGhkZXYtPmVzY29fdHlwZSAmIFNDT19FU0NPX01BU0spIHwKQEAgLTU0NSw2ICs1NjYsMTEgQEAKIAkgKiBmYXZvciBvZiBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQsIHdlIHNob3VsZCByZXN0YXJ0IGl0LgogCSAqLwogCWhjaV91cGRhdGVfYmFja2dyb3VuZF9zY2FuKGhkZXYpOworCisJLyogUmUtZW5hYmxlIGFkdmVydGlzaW5nIGluIGNhc2UgdGhpcyB3YXMgYSBmYWlsZWQgY29ubmVjdGlvbgorCSAqIGF0dGVtcHQgYXMgYSBwZXJpcGhlcmFsLgorCSAqLworCW1nbXRfcmVlbmFibGVfYWR2ZXJ0aXNpbmcoaGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGNyZWF0ZV9sZV9jb25uX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMpCkBAIC02MDUsNiArNjMxLDQ1IEBACiAJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNUOwogfQogCitzdGF0aWMgdm9pZCBoY2lfcmVxX2RpcmVjdGVkX2FkdmVydGlzaW5nKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLAorCQkJCQkgc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gcmVxLT5oZGV2OworCXN0cnVjdCBoY2lfY3BfbGVfc2V0X2Fkdl9wYXJhbSBjcDsKKwl1OCBvd25fYWRkcl90eXBlOworCXU4IGVuYWJsZTsKKworCWVuYWJsZSA9IDB4MDA7CisJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfTEVfU0VUX0FEVl9FTkFCTEUsIHNpemVvZihlbmFibGUpLCAmZW5hYmxlKTsKKworCS8qIENsZWFyIHRoZSBIQ0lfQURWRVJUSVNJTkcgYml0IHRlbXBvcmFyaWx5IHNvIHRoYXQgdGhlCisJICogaGNpX3VwZGF0ZV9yYW5kb21fYWRkcmVzcyBrbm93cyB0aGF0IGl0J3Mgc2FmZSB0byBnbyBhaGVhZAorCSAqIGFuZCB3cml0ZSBhIG5ldyByYW5kb20gYWRkcmVzcy4gVGhlIGZsYWcgd2lsbCBiZSBzZXQgYmFjayBvbgorCSAqIGFzIHNvb24gYXMgdGhlIFNFVF9BRFZfRU5BQkxFIEhDSSBjb21tYW5kIGNvbXBsZXRlcy4KKwkgKi8KKwljbGVhcl9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKworCS8qIFNldCByZXF1aXJlX3ByaXZhY3kgdG8gZmFsc2Ugc28gdGhhdCB0aGUgcmVtb3RlIGRldmljZSBoYXMgYQorCSAqIGNoYW5jZSBvZiBpZGVudGlmeWluZyB1cy4KKwkgKi8KKwlpZiAoaGNpX3VwZGF0ZV9yYW5kb21fYWRkcmVzcyhyZXEsIGZhbHNlLCAmb3duX2FkZHJfdHlwZSkgPCAwKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKwljcC50eXBlID0gTEVfQURWX0RJUkVDVF9JTkQ7CisJY3Aub3duX2FkZHJlc3NfdHlwZSA9IG93bl9hZGRyX3R5cGU7CisJY3AuZGlyZWN0X2FkZHJfdHlwZSA9IGNvbm4tPmRzdF90eXBlOworCWJhY3B5KCZjcC5kaXJlY3RfYWRkciwgJmNvbm4tPmRzdCk7CisJY3AuY2hhbm5lbF9tYXAgPSBoZGV2LT5sZV9hZHZfY2hhbm5lbF9tYXA7CisKKwloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9MRV9TRVRfQURWX1BBUkFNLCBzaXplb2YoY3ApLCAmY3ApOworCisJZW5hYmxlID0gMHgwMTsKKwloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9MRV9TRVRfQURWX0VOQUJMRSwgc2l6ZW9mKGVuYWJsZSksICZlbmFibGUpOworCisJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNUOworfQorCiBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0X2xlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqZHN0LAogCQkJCXU4IGRzdF90eXBlLCB1OCBzZWNfbGV2ZWwsIHU4IGF1dGhfdHlwZSkKIHsKQEAgLTYxNCw5ICs2NzksNiBAQAogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfQURWRVJUSVNJTkcsICZoZGV2LT5mbGFncykpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9UU1VQUCk7Ci0KIAkvKiBTb21lIGRldmljZXMgc2VuZCBBVFQgbWVzc2FnZXMgYXMgc29vbiBhcyB0aGUgcGh5c2ljYWwgbGluayBpcwogCSAqIGVzdGFibGlzaGVkLiBUbyBiZSBhYmxlIHRvIGhhbmRsZSB0aGVzZSBBVFQgbWVzc2FnZXMsIHRoZSB1c2VyLQogCSAqIHNwYWNlIGZpcnN0IGVzdGFibGlzaGVzIHRoZSBjb25uZWN0aW9uIGFuZCB0aGVuIHN0YXJ0cyB0aGUgcGFpcmluZwpAQCAtNjY0LDEzICs3MjYsMjAgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAljb25uLT5kc3RfdHlwZSA9IGRzdF90eXBlOwotCi0JY29ubi0+b3V0ID0gdHJ1ZTsKLQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX01BU1RFUjsKIAljb25uLT5zZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9MT1c7CiAJY29ubi0+cGVuZGluZ19zZWNfbGV2ZWwgPSBzZWNfbGV2ZWw7CiAJY29ubi0+YXV0aF90eXBlID0gYXV0aF90eXBlOwogCisJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOworCisJaWYgKHRlc3RfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaGNpX3JlcV9kaXJlY3RlZF9hZHZlcnRpc2luZygmcmVxLCBjb25uKTsKKwkJZ290byBjcmVhdGVfY29ubjsKKwl9CisKKwljb25uLT5vdXQgPSB0cnVlOworCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCiAJcGFyYW1zID0gaGNpX2Nvbm5fcGFyYW1zX2xvb2t1cChoZGV2LCAmY29ubi0+ZHN0LCBjb25uLT5kc3RfdHlwZSk7CiAJaWYgKHBhcmFtcykgewogCQljb25uLT5sZV9jb25uX21pbl9pbnRlcnZhbCA9IHBhcmFtcy0+Y29ubl9taW5faW50ZXJ2YWw7CkBAIC02ODAsOCArNzQ5LDYgQEAKIAkJY29ubi0+bGVfY29ubl9tYXhfaW50ZXJ2YWwgPSBoZGV2LT5sZV9jb25uX21heF9pbnRlcnZhbDsKIAl9CiAKLQloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7Ci0KIAkvKiBJZiBjb250cm9sbGVyIGlzIHNjYW5uaW5nLCB3ZSBzdG9wIGl0IHNpbmNlIHNvbWUgY29udHJvbGxlcnMgYXJlCiAJICogbm90IGFibGUgdG8gc2NhbiBhbmQgY29ubmVjdCBhdCB0aGUgc2FtZSB0aW1lLiBBbHNvIHNldCB0aGUKIAkgKiBIQ0lfTEVfU0NBTl9JTlRFUlJVUFRFRCBmbGFnIHNvIHRoYXQgdGhlIGNvbW1hbmQgY29tcGxldGUKQEAgLTY5NSw2ICs3NjIsNyBAQAogCiAJaGNpX3JlcV9hZGRfbGVfY3JlYXRlX2Nvbm4oJnJlcSwgY29ubik7CiAKK2NyZWF0ZV9jb25uOgogCWVyciA9IGhjaV9yZXFfcnVuKCZyZXEsIGNyZWF0ZV9sZV9jb25uX2NvbXBsZXRlKTsKIAlpZiAoZXJyKSB7CiAJCWhjaV9jb25uX2RlbChjb25uKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwppbmRleCAxYzZmZmFhLi4wYTQzY2NlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CiAKICNpbmNsdWRlICJzbXAuaCIKIApAQCAtNTc5LDYgKzU4MCw2MiBAQAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc25pZmZfbWF4X2ludGVydmFsX2ZvcHMsIHNuaWZmX21heF9pbnRlcnZhbF9nZXQsCiAJCQlzbmlmZl9tYXhfaW50ZXJ2YWxfc2V0LCAiJWxsdVxuIik7CiAKK3N0YXRpYyBpbnQgY29ubl9pbmZvX21pbl9hZ2Vfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBkYXRhOworCisJaWYgKHZhbCA9PSAwIHx8IHZhbCA+IGhkZXYtPmNvbm5faW5mb19tYXhfYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloZGV2LT5jb25uX2luZm9fbWluX2FnZSA9IHZhbDsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbm5faW5mb19taW5fYWdlX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGRhdGE7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJKnZhbCA9IGhkZXYtPmNvbm5faW5mb19taW5fYWdlOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGNvbm5faW5mb19taW5fYWdlX2ZvcHMsIGNvbm5faW5mb19taW5fYWdlX2dldCwKKwkJCWNvbm5faW5mb19taW5fYWdlX3NldCwgIiVsbHVcbiIpOworCitzdGF0aWMgaW50IGNvbm5faW5mb19tYXhfYWdlX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZGF0YTsKKworCWlmICh2YWwgPT0gMCB8fCB2YWwgPCBoZGV2LT5jb25uX2luZm9fbWluX2FnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJaGRldi0+Y29ubl9pbmZvX21heF9hZ2UgPSB2YWw7CisJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25uX2luZm9fbWF4X2FnZV9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBkYXRhOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCSp2YWwgPSBoZGV2LT5jb25uX2luZm9fbWF4X2FnZTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjb25uX2luZm9fbWF4X2FnZV9mb3BzLCBjb25uX2luZm9fbWF4X2FnZV9nZXQsCisJCQljb25uX2luZm9fbWF4X2FnZV9zZXQsICIlbGx1XG4iKTsKKwogc3RhdGljIGludCBpZGVudGl0eV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGYtPnByaXZhdGU7CkBAIC05NTUsMTQgKzEwMTIsOSBAQAogCWlmIChjb3VudCA8IDMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYnVmID0ga3phbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgZGF0YSwgY291bnQpKSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9CisJYnVmID0gbWVtZHVwX3VzZXIoZGF0YSwgY291bnQpOworCWlmIChJU19FUlIoYnVmKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnVmKTsKIAogCWlmIChtZW1jbXAoYnVmLCAiYWRkIiwgMykgPT0gMCkgewogCQluID0gc3NjYW5mKCZidWZbNF0sICIlaGh4OiVoaHg6JWhoeDolaGh4OiVoaHg6JWhoeCAlaGh1ICVoaHUiLApAQCAtMTc1OSw2ICsxODExLDExIEBACiAJCQkgICAgJmJsYWNrbGlzdF9mb3BzKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ1dWlkcyIsIDA0NDQsIGhkZXYtPmRlYnVnZnMsIGhkZXYsICZ1dWlkc19mb3BzKTsKIAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImNvbm5faW5mb19taW5fYWdlIiwgMDY0NCwgaGRldi0+ZGVidWdmcywgaGRldiwKKwkJCSAgICAmY29ubl9pbmZvX21pbl9hZ2VfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgiY29ubl9pbmZvX21heF9hZ2UiLCAwNjQ0LCBoZGV2LT5kZWJ1Z2ZzLCBoZGV2LAorCQkJICAgICZjb25uX2luZm9fbWF4X2FnZV9mb3BzKTsKKwogCWlmIChsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSkgewogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbnF1aXJ5X2NhY2hlIiwgMDQ0NCwgaGRldi0+ZGVidWdmcywKIAkJCQkgICAgaGRldiwgJmlucXVpcnlfY2FjaGVfZm9wcyk7CkBAIC0xODI4LDYgKzE4ODUsOSBAQAogCQkJCSAgICAmbG93cGFuX2RlYnVnZnNfZm9wcyk7CiAJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImxlX2F1dG9fY29ubiIsIDA2NDQsIGhkZXYtPmRlYnVnZnMsIGhkZXYsCiAJCQkJICAgICZsZV9hdXRvX2Nvbm5fZm9wcyk7CisJCWRlYnVnZnNfY3JlYXRlX3UxNigiZGlzY292X2ludGVybGVhdmVkX3RpbWVvdXQiLCAwNjQ0LAorCQkJCSAgIGhkZXYtPmRlYnVnZnMsCisJCQkJICAgJmhkZXYtPmRpc2Nvdl9pbnRlcmxlYXZlZF90aW1lb3V0KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwMzMsMTIgKzIwOTMsMTEgQEAKIAogCWhjaV9yZW1vdmVfcmVtb3RlX29vYl9kYXRhKGhkZXYsICZkYXRhLT5iZGFkZHIpOwogCi0JaWYgKHNzcCkKLQkJKnNzcCA9IGRhdGEtPnNzcF9tb2RlOworCSpzc3AgPSBkYXRhLT5zc3BfbW9kZTsKIAogCWllID0gaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKGhkZXYsICZkYXRhLT5iZGFkZHIpOwogCWlmIChpZSkgewotCQlpZiAoaWUtPmRhdGEuc3NwX21vZGUgJiYgc3NwKQorCQlpZiAoaWUtPmRhdGEuc3NwX21vZGUpCiAJCQkqc3NwID0gdHJ1ZTsKIAogCQlpZiAoaWUtPm5hbWVfc3RhdGUgPT0gTkFNRV9ORUVERUQgJiYKQEAgLTM3OTEsNiArMzg1MCw5IEBACiAJaGRldi0+bGVfY29ubl9tYXhfaW50ZXJ2YWwgPSAweDAwMzg7CiAKIAloZGV2LT5ycGFfdGltZW91dCA9IEhDSV9ERUZBVUxUX1JQQV9USU1FT1VUOworCWhkZXYtPmRpc2Nvdl9pbnRlcmxlYXZlZF90aW1lb3V0ID0gRElTQ09WX0lOVEVSTEVBVkVEX1RJTUVPVVQ7CisJaGRldi0+Y29ubl9pbmZvX21pbl9hZ2UgPSBERUZBVUxUX0NPTk5fSU5GT19NSU5fQUdFOworCWhkZXYtPmNvbm5faW5mb19tYXhfYWdlID0gREVGQVVMVF9DT05OX0lORk9fTUFYX0FHRTsKIAogCW11dGV4X2luaXQoJmhkZXYtPmxvY2spOwogCW11dGV4X2luaXQoJmhkZXYtPnJlcV9sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IDY4MmYzM2EuLjIxZTU5MTMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtOTkxLDEwICs5OTEsMjUgQEAKIAlpZiAoIXNlbnQpCiAJCXJldHVybjsKIAorCWlmIChzdGF0dXMpCisJCXJldHVybjsKKwogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICghc3RhdHVzKQotCQltZ210X2FkdmVydGlzaW5nKGhkZXYsICpzZW50KTsKKwkvKiBJZiB3ZSdyZSBkb2luZyBjb25uZWN0aW9uIGluaXRhdGlvbiBhcyBwZXJpcGhlcmFsLiBTZXQgYQorCSAqIHRpbWVvdXQgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKwkgKi8KKwlpZiAoKnNlbnQpIHsKKwkJc3RydWN0IGhjaV9jb25uICpjb25uOworCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShoZGV2LCBMRV9MSU5LLCBCVF9DT05ORUNUKTsKKwkJaWYgKGNvbm4pCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaGRldi0+d29ya3F1ZXVlLAorCQkJCQkgICAmY29ubi0+bGVfY29ubl90aW1lb3V0LAorCQkJCQkgICBIQ0lfTEVfQ09OTl9USU1FT1VUKTsKKwl9CisKKwltZ210X2FkdmVydGlzaW5nKGhkZXYsICpzZW50KTsKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQpAQCAtMTAxOCw2ICsxMDMzLDMzIEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKK3N0YXRpYyBib29sIGhhc19wZW5kaW5nX2Fkdl9yZXBvcnQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGRpc2NvdmVyeV9zdGF0ZSAqZCA9ICZoZGV2LT5kaXNjb3Zlcnk7CisKKwlyZXR1cm4gYmFjbXAoJmQtPmxhc3RfYWR2X2FkZHIsIEJEQUREUl9BTlkpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wZW5kaW5nX2Fkdl9yZXBvcnQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGRpc2NvdmVyeV9zdGF0ZSAqZCA9ICZoZGV2LT5kaXNjb3Zlcnk7CisKKwliYWNweSgmZC0+bGFzdF9hZHZfYWRkciwgQkRBRERSX0FOWSk7CisJZC0+bGFzdF9hZHZfZGF0YV9sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZCBzdG9yZV9wZW5kaW5nX2Fkdl9yZXBvcnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJICAgICB1OCBiZGFkZHJfdHlwZSwgczggcnNzaSwgdTggKmRhdGEsIHU4IGxlbikKK3sKKwlzdHJ1Y3QgZGlzY292ZXJ5X3N0YXRlICpkID0gJmhkZXYtPmRpc2NvdmVyeTsKKworCWJhY3B5KCZkLT5sYXN0X2Fkdl9hZGRyLCBiZGFkZHIpOworCWQtPmxhc3RfYWR2X2FkZHJfdHlwZSA9IGJkYWRkcl90eXBlOworCWQtPmxhc3RfYWR2X3Jzc2kgPSByc3NpOworCW1lbWNweShkLT5sYXN0X2Fkdl9kYXRhLCBkYXRhLCBsZW4pOworCWQtPmxhc3RfYWR2X2RhdGFfbGVuID0gbGVuOworfQorCiBzdGF0aWMgdm9pZCBoY2lfY2NfbGVfc2V0X3NjYW5fZW5hYmxlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMDM2LDkgKzEwNzgsMjUgQEAKIAlzd2l0Y2ggKGNwLT5lbmFibGUpIHsKIAljYXNlIExFX1NDQU5fRU5BQkxFOgogCQlzZXRfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaWYgKGhkZXYtPmxlX3NjYW5fdHlwZSA9PSBMRV9TQ0FOX0FDVElWRSkKKwkJCWNsZWFyX3BlbmRpbmdfYWR2X3JlcG9ydChoZGV2KTsKIAkJYnJlYWs7CiAKIAljYXNlIExFX1NDQU5fRElTQUJMRToKKwkJLyogV2UgZG8gdGhpcyBoZXJlIGluc3RlYWQgb2Ygd2hlbiBzZXR0aW5nIERJU0NPVkVSWV9TVE9QUEVECisJCSAqIHNpbmNlIHRoZSBsYXR0ZXIgd291bGQgcG90ZW50aWFsbHkgcmVxdWlyZSB3YWl0aW5nIGZvcgorCQkgKiBpbnF1aXJ5IHRvIHN0b3AgdG9vLgorCQkgKi8KKwkJaWYgKGhhc19wZW5kaW5nX2Fkdl9yZXBvcnQoaGRldikpIHsKKwkJCXN0cnVjdCBkaXNjb3Zlcnlfc3RhdGUgKmQgPSAmaGRldi0+ZGlzY292ZXJ5OworCisJCQltZ210X2RldmljZV9mb3VuZChoZGV2LCAmZC0+bGFzdF9hZHZfYWRkciwgTEVfTElOSywKKwkJCQkJICBkLT5sYXN0X2Fkdl9hZGRyX3R5cGUsIE5VTEwsCisJCQkJCSAgZC0+bGFzdF9hZHZfcnNzaSwgMCwgMSwKKwkJCQkJICBkLT5sYXN0X2Fkdl9kYXRhLAorCQkJCQkgIGQtPmxhc3RfYWR2X2RhdGFfbGVuLCBOVUxMLCAwKTsKKwkJfQorCiAJCS8qIENhbmNlbCB0aGlzIHRpbWVyIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGRpc2FibGUgc2Nhbm5pbmcKIAkJICogd2hlbiBpdCdzIGFscmVhZHkgZGlzYWJsZWQuCiAJCSAqLwpAQCAtMTE4Nyw2ICsxMjQ1LDU5IEBACiAJYW1wX3dyaXRlX3JlbV9hc3NvY19jb250aW51ZShoZGV2LCBycC0+cGh5X2hhbmRsZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGhjaV9jY19yZWFkX3Jzc2koc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ycF9yZWFkX3Jzc2kgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JTIuMngiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKKworCWlmIChycC0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUocnAtPmhhbmRsZSkpOworCWlmIChjb25uKQorCQljb25uLT5yc3NpID0gcnAtPnJzc2k7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfdHhfcG93ZXIoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9jcF9yZWFkX3R4X3Bvd2VyICpzZW50OworCXN0cnVjdCBoY2lfcnBfcmVhZF90eF9wb3dlciAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCisJQlRfREJHKCIlcyBzdGF0dXMgMHglMi4yeCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOworCisJaWYgKHJwLT5zdGF0dXMpCisJCXJldHVybjsKKworCXNlbnQgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBIQ0lfT1BfUkVBRF9UWF9QT1dFUik7CisJaWYgKCFzZW50KQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUocnAtPmhhbmRsZSkpOworCWlmICghY29ubikKKwkJZ290byB1bmxvY2s7CisKKwlzd2l0Y2ggKHNlbnQtPnR5cGUpIHsKKwljYXNlIDB4MDA6CisJCWNvbm4tPnR4X3Bvd2VyID0gcnAtPnR4X3Bvd2VyOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCWNvbm4tPm1heF90eF9wb3dlciA9IHJwLT50eF9wb3dlcjsKKwkJYnJlYWs7CisJfQorCit1bmxvY2s6CisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKIHN0YXRpYyB2b2lkIGhjaV9jc19pbnF1aXJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHN0YXR1cykKIHsKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCUyLjJ4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTEzNDIsNiArMTQ1Myw3IEBACiAJICogaXMgcmVxdWVzdGVkLgogCSAqLwogCWlmICghaGNpX2Nvbm5fc3NwX2VuYWJsZWQoY29ubikgJiYgIShjb25uLT5hdXRoX3R5cGUgJiAweDAxKSAmJgorCSAgICBjb25uLT5wZW5kaW5nX3NlY19sZXZlbCAhPSBCVF9TRUNVUklUWV9GSVBTICYmCiAJICAgIGNvbm4tPnBlbmRpbmdfc2VjX2xldmVsICE9IEJUX1NFQ1VSSVRZX0hJR0ggJiYKIAkgICAgY29ubi0+cGVuZGluZ19zZWNfbGV2ZWwgIT0gQlRfU0VDVVJJVFlfTUVESVVNKQogCQlyZXR1cm4gMDsKQEAgLTE4MjcsNyArMTkzOSw3IEBACiAJCW5hbWVfa25vd24gPSBoY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEsIGZhbHNlLCAmc3NwKTsKIAkJbWdtdF9kZXZpY2VfZm91bmQoaGRldiwgJmluZm8tPmJkYWRkciwgQUNMX0xJTkssIDB4MDAsCiAJCQkJICBpbmZvLT5kZXZfY2xhc3MsIDAsICFuYW1lX2tub3duLCBzc3AsIE5VTEwsCi0JCQkJICAwKTsKKwkJCQkgIDAsIE5VTEwsIDApOwogCX0KIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtMjU3OSw2ICsyNjkxLDE0IEBACiAJCWhjaV9jY193cml0ZV9yZW1vdGVfYW1wX2Fzc29jKGhkZXYsIHNrYik7CiAJCWJyZWFrOwogCisJY2FzZSBIQ0lfT1BfUkVBRF9SU1NJOgorCQloY2lfY2NfcmVhZF9yc3NpKGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfT1BfUkVBRF9UWF9QT1dFUjoKKwkJaGNpX2NjX3JlYWRfdHhfcG93ZXIoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlCVF9EQkcoIiVzIG9wY29kZSAweCU0LjR4IiwgaGRldi0+bmFtZSwgb3Bjb2RlKTsKIAkJYnJlYWs7CkBAIC0yOTU3LDcgKzMwNzcsOCBAQAogCQl9CiAKIAkJaWYgKGtleS0+dHlwZSA9PSBIQ0lfTEtfQ09NQklOQVRJT04gJiYga2V5LT5waW5fbGVuIDwgMTYgJiYKLQkJICAgIGNvbm4tPnBlbmRpbmdfc2VjX2xldmVsID09IEJUX1NFQ1VSSVRZX0hJR0gpIHsKKwkJICAgIChjb25uLT5wZW5kaW5nX3NlY19sZXZlbCA9PSBCVF9TRUNVUklUWV9ISUdIIHx8CisJCSAgICAgY29ubi0+cGVuZGluZ19zZWNfbGV2ZWwgPT0gQlRfU0VDVVJJVFlfRklQUykpIHsKIAkJCUJUX0RCRygiJXMgaWdub3Jpbmcga2V5IHVuYXV0aGVudGljYXRlZCBmb3IgaGlnaCBzZWN1cml0eSIsCiAJCQkgICAgICAgaGRldi0+bmFtZSk7CiAJCQlnb3RvIG5vdF9mb3VuZDsKQEAgLTMxMDIsNyArMzIyMyw3IEBACiAJCQkJCQkJICAgICAgZmFsc2UsICZzc3ApOwogCQkJbWdtdF9kZXZpY2VfZm91bmQoaGRldiwgJmluZm8tPmJkYWRkciwgQUNMX0xJTkssIDB4MDAsCiAJCQkJCSAgaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLAotCQkJCQkgICFuYW1lX2tub3duLCBzc3AsIE5VTEwsIDApOworCQkJCQkgICFuYW1lX2tub3duLCBzc3AsIE5VTEwsIDAsIE5VTEwsIDApOwogCQl9CiAJfSBlbHNlIHsKIAkJc3RydWN0IGlucXVpcnlfaW5mb193aXRoX3Jzc2kgKmluZm8gPSAodm9pZCAqKSAoc2tiLT5kYXRhICsgMSk7CkBAIC0zMTIwLDcgKzMyNDEsNyBAQAogCQkJCQkJCSAgICAgIGZhbHNlLCAmc3NwKTsKIAkJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAogCQkJCQkgIGluZm8tPmRldl9jbGFzcywgaW5mby0+cnNzaSwKLQkJCQkJICAhbmFtZV9rbm93biwgc3NwLCBOVUxMLCAwKTsKKwkJCQkJICAhbmFtZV9rbm93biwgc3NwLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAkJfQogCX0KIApAQCAtMzMwOSw3ICszNDMwLDcgQEAKIAkJZWlyX2xlbiA9IGVpcl9nZXRfbGVuZ3RoKGluZm8tPmRhdGEsIHNpemVvZihpbmZvLT5kYXRhKSk7CiAJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAogCQkJCSAgaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLCAhbmFtZV9rbm93biwKLQkJCQkgIHNzcCwgaW5mby0+ZGF0YSwgZWlyX2xlbik7CisJCQkJICBzc3AsIGluZm8tPmRhdGEsIGVpcl9sZW4sIE5VTEwsIDApOwogCX0KIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtMzM2NywyNCArMzQ4OCwyMCBAQAogCiBzdGF0aWMgdTggaGNpX2dldF9hdXRoX3JlcShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7Ci0JLyogSWYgcmVtb3RlIHJlcXVlc3RzIGRlZGljYXRlZCBib25kaW5nIGZvbGxvdyB0aGF0IGxlYWQgKi8KLQlpZiAoY29ubi0+cmVtb3RlX2F1dGggPT0gSENJX0FUX0RFRElDQVRFRF9CT05ESU5HIHx8Ci0JICAgIGNvbm4tPnJlbW90ZV9hdXRoID09IEhDSV9BVF9ERURJQ0FURURfQk9ORElOR19NSVRNKSB7Ci0JCS8qIElmIGJvdGggcmVtb3RlIGFuZCBsb2NhbCBJTyBjYXBhYmlsaXRpZXMgYWxsb3cgTUlUTQotCQkgKiBwcm90ZWN0aW9uIHRoZW4gcmVxdWlyZSBpdCwgb3RoZXJ3aXNlIGRvbid0ICovCi0JCWlmIChjb25uLT5yZW1vdGVfY2FwID09IEhDSV9JT19OT19JTlBVVF9PVVRQVVQgfHwKLQkJICAgIGNvbm4tPmlvX2NhcGFiaWxpdHkgPT0gSENJX0lPX05PX0lOUFVUX09VVFBVVCkKLQkJCXJldHVybiBIQ0lfQVRfREVESUNBVEVEX0JPTkRJTkc7Ci0JCWVsc2UKLQkJCXJldHVybiBIQ0lfQVRfREVESUNBVEVEX0JPTkRJTkdfTUlUTTsKLQl9Ci0KIAkvKiBJZiByZW1vdGUgcmVxdWVzdHMgbm8tYm9uZGluZyBmb2xsb3cgdGhhdCBsZWFkICovCiAJaWYgKGNvbm4tPnJlbW90ZV9hdXRoID09IEhDSV9BVF9OT19CT05ESU5HIHx8CiAJICAgIGNvbm4tPnJlbW90ZV9hdXRoID09IEhDSV9BVF9OT19CT05ESU5HX01JVE0pCiAJCXJldHVybiBjb25uLT5yZW1vdGVfYXV0aCB8IChjb25uLT5hdXRoX3R5cGUgJiAweDAxKTsKIAotCXJldHVybiBjb25uLT5hdXRoX3R5cGU7CisJLyogSWYgYm90aCByZW1vdGUgYW5kIGxvY2FsIGhhdmUgZW5vdWdoIElPIGNhcGFiaWxpdGllcywgcmVxdWlyZQorCSAqIE1JVE0gcHJvdGVjdGlvbgorCSAqLworCWlmIChjb25uLT5yZW1vdGVfY2FwICE9IEhDSV9JT19OT19JTlBVVF9PVVRQVVQgJiYKKwkgICAgY29ubi0+aW9fY2FwYWJpbGl0eSAhPSBIQ0lfSU9fTk9fSU5QVVRfT1VUUFVUKQorCQlyZXR1cm4gY29ubi0+cmVtb3RlX2F1dGggfCAweDAxOworCisJLyogTm8gTUlUTSBwcm90ZWN0aW9uIHBvc3NpYmxlIHNvIGlnbm9yZSByZW1vdGUgcmVxdWlyZW1lbnQgKi8KKwlyZXR1cm4gKGNvbm4tPnJlbW90ZV9hdXRoICYgfjB4MDEpIHwgKGNvbm4tPmF1dGhfdHlwZSAmIDB4MDEpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfaW9fY2FwYV9yZXF1ZXN0X2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTM0MTQsOCArMzUzMSwyMSBAQAogCQkgKiB0byBEaXNwbGF5WWVzTm8gYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBCVCBzcGVjLiAqLwogCQljcC5jYXBhYmlsaXR5ID0gKGNvbm4tPmlvX2NhcGFiaWxpdHkgPT0gMHgwNCkgPwogCQkJCUhDSV9JT19ESVNQTEFZX1lFU05PIDogY29ubi0+aW9fY2FwYWJpbGl0eTsKLQkJY29ubi0+YXV0aF90eXBlID0gaGNpX2dldF9hdXRoX3JlcShjb25uKTsKLQkJY3AuYXV0aGVudGljYXRpb24gPSBjb25uLT5hdXRoX3R5cGU7CisKKwkJLyogSWYgd2UgYXJlIGluaXRpYXRvcnMsIHRoZXJlIGlzIG5vIHJlbW90ZSBpbmZvcm1hdGlvbiB5ZXQgKi8KKwkJaWYgKGNvbm4tPnJlbW90ZV9hdXRoID09IDB4ZmYpIHsKKwkJCWNwLmF1dGhlbnRpY2F0aW9uID0gY29ubi0+YXV0aF90eXBlOworCisJCQkvKiBSZXF1ZXN0IE1JVE0gcHJvdGVjdGlvbiBpZiBvdXIgSU8gY2FwcyBhbGxvdyBpdAorCQkJICogZXhjZXB0IGZvciB0aGUgbm8tYm9uZGluZyBjYXNlCisJCQkgKi8KKwkJCWlmIChjb25uLT5pb19jYXBhYmlsaXR5ICE9IEhDSV9JT19OT19JTlBVVF9PVVRQVVQgJiYKKwkJCSAgICBjcC5hdXRoZW50aWNhdGlvbiAhPSBIQ0lfQVRfTk9fQk9ORElORykKKwkJCQljcC5hdXRoZW50aWNhdGlvbiB8PSAweDAxOworCQl9IGVsc2UgeworCQkJY29ubi0+YXV0aF90eXBlID0gaGNpX2dldF9hdXRoX3JlcShjb25uKTsKKwkJCWNwLmF1dGhlbnRpY2F0aW9uID0gY29ubi0+YXV0aF90eXBlOworCQl9CiAKIAkJaWYgKGhjaV9maW5kX3JlbW90ZV9vb2JfZGF0YShoZGV2LCAmY29ubi0+ZHN0KSAmJgogCQkgICAgKGNvbm4tPm91dCB8fCB0ZXN0X2JpdChIQ0lfQ09OTl9SRU1PVEVfT09CLCAmY29ubi0+ZmxhZ3MpKSkKQEAgLTM0ODMsMTIgKzM2MTMsOSBAQAogCXJlbV9taXRtID0gKGNvbm4tPnJlbW90ZV9hdXRoICYgMHgwMSk7CiAKIAkvKiBJZiB3ZSByZXF1aXJlIE1JVE0gYnV0IHRoZSByZW1vdGUgZGV2aWNlIGNhbid0IHByb3ZpZGUgdGhhdAotCSAqIChpdCBoYXMgTm9JbnB1dE5vT3V0cHV0KSB0aGVuIHJlamVjdCB0aGUgY29uZmlybWF0aW9uCi0JICogcmVxdWVzdC4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHdoZW4gd2UncmUgZGVkaWNhdGVkIGJvbmRpbmcKLQkgKiBpbml0aWF0b3JzIChjb25uZWN0X2NmbV9jYiBzZXQpIHNpbmNlIHRoZW4gd2UgYWx3YXlzIGhhdmUgdGhlIE1JVE0KLQkgKiBiaXQgc2V0LiAqLwotCWlmICghY29ubi0+Y29ubmVjdF9jZm1fY2IgJiYgbG9jX21pdG0gJiYKLQkgICAgY29ubi0+cmVtb3RlX2NhcCA9PSBIQ0lfSU9fTk9fSU5QVVRfT1VUUFVUKSB7CisJICogKGl0IGhhcyBOb0lucHV0Tm9PdXRwdXQpIHRoZW4gcmVqZWN0IHRoZSBjb25maXJtYXRpb24gcmVxdWVzdAorCSAqLworCWlmIChsb2NfbWl0bSAmJiBjb25uLT5yZW1vdGVfY2FwID09IEhDSV9JT19OT19JTlBVVF9PVVRQVVQpIHsKIAkJQlRfREJHKCJSZWplY3RpbmcgcmVxdWVzdDogcmVtb3RlIGRldmljZSBjYW4ndCBwcm92aWRlIE1JVE0iKTsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZLAogCQkJICAgICBzaXplb2YoZXYtPmJkYWRkciksICZldi0+YmRhZGRyKTsKQEAgLTM4NDYsMTcgKzM5NzMsNiBAQAogCiAJCWNvbm4tPmRzdF90eXBlID0gZXYtPmJkYWRkcl90eXBlOwogCi0JCS8qIFRoZSBhZHZlcnRpc2luZyBwYXJhbWV0ZXJzIGZvciBvd24gYWRkcmVzcyB0eXBlCi0JCSAqIGRlZmluZSB3aGljaCBzb3VyY2UgYWRkcmVzcyBhbmQgc291cmNlIGFkZHJlc3MKLQkJICogdHlwZSB0aGlzIGNvbm5lY3Rpb25zIGhhcy4KLQkJICovCi0JCWlmIChiYWNtcCgmY29ubi0+c3JjLCBCREFERFJfQU5ZKSkgewotCQkJY29ubi0+c3JjX3R5cGUgPSBBRERSX0xFX0RFVl9QVUJMSUM7Ci0JCX0gZWxzZSB7Ci0JCQliYWNweSgmY29ubi0+c3JjLCAmaGRldi0+c3RhdGljX2FkZHIpOwotCQkJY29ubi0+c3JjX3R5cGUgPSBBRERSX0xFX0RFVl9SQU5ET007Ci0JCX0KLQogCQlpZiAoZXYtPnJvbGUgPT0gTEVfQ09OTl9ST0xFX01BU1RFUikgewogCQkJY29ubi0+b3V0ID0gdHJ1ZTsKIAkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOwpAQCAtMzg4MSwyNyArMzk5NywyNCBAQAogCQkJCQkJCSAgJmNvbm4tPmluaXRfYWRkciwKIAkJCQkJCQkgICZjb25uLT5pbml0X2FkZHJfdHlwZSk7CiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTZXQgdGhlIHJlc3BvbmRlciAob3VyIHNpZGUpIGFkZHJlc3MgdHlwZSBiYXNlZCBvbgotCQkJICogdGhlIGFkdmVydGlzaW5nIGFkZHJlc3MgdHlwZS4KLQkJCSAqLwotCQkJY29ubi0+cmVzcF9hZGRyX3R5cGUgPSBoZGV2LT5hZHZfYWRkcl90eXBlOwotCQkJaWYgKGhkZXYtPmFkdl9hZGRyX3R5cGUgPT0gQUREUl9MRV9ERVZfUkFORE9NKQotCQkJCWJhY3B5KCZjb25uLT5yZXNwX2FkZHIsICZoZGV2LT5yYW5kb21fYWRkcik7Ci0JCQllbHNlCi0JCQkJYmFjcHkoJmNvbm4tPnJlc3BfYWRkciwgJmhkZXYtPmJkYWRkcik7Ci0KLQkJCWNvbm4tPmluaXRfYWRkcl90eXBlID0gZXYtPmJkYWRkcl90eXBlOwotCQkJYmFjcHkoJmNvbm4tPmluaXRfYWRkciwgJmV2LT5iZGFkZHIpOwogCQl9CiAJfSBlbHNlIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY29ubi0+bGVfY29ubl90aW1lb3V0KTsKIAl9CiAKLQkvKiBFbnN1cmUgdGhhdCB0aGUgaGNpX2Nvbm4gY29udGFpbnMgdGhlIGlkZW50aXR5IGFkZHJlc3MgdHlwZQotCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYWRkcmVzcyB0aGUgY29ubmVjdGlvbiB3YXMgbWFkZSB3aXRoLgotCSAqLwotCWhjaV9jb3B5X2lkZW50aXR5X2FkZHJlc3MoaGRldiwgJmNvbm4tPnNyYywgJmNvbm4tPnNyY190eXBlKTsKKwlpZiAoIWNvbm4tPm91dCkgeworCQkvKiBTZXQgdGhlIHJlc3BvbmRlciAob3VyIHNpZGUpIGFkZHJlc3MgdHlwZSBiYXNlZCBvbgorCQkgKiB0aGUgYWR2ZXJ0aXNpbmcgYWRkcmVzcyB0eXBlLgorCQkgKi8KKwkJY29ubi0+cmVzcF9hZGRyX3R5cGUgPSBoZGV2LT5hZHZfYWRkcl90eXBlOworCQlpZiAoaGRldi0+YWR2X2FkZHJfdHlwZSA9PSBBRERSX0xFX0RFVl9SQU5ET00pCisJCQliYWNweSgmY29ubi0+cmVzcF9hZGRyLCAmaGRldi0+cmFuZG9tX2FkZHIpOworCQllbHNlCisJCQliYWNweSgmY29ubi0+cmVzcF9hZGRyLCAmaGRldi0+YmRhZGRyKTsKKworCQljb25uLT5pbml0X2FkZHJfdHlwZSA9IGV2LT5iZGFkZHJfdHlwZTsKKwkJYmFjcHkoJmNvbm4tPmluaXRfYWRkciwgJmV2LT5iZGFkZHIpOworCX0KIAogCS8qIExvb2t1cCB0aGUgaWRlbnRpdHkgYWRkcmVzcyBmcm9tIHRoZSBzdG9yZWQgY29ubmVjdGlvbgogCSAqIGFkZHJlc3MgYW5kIGFkZHJlc3MgdHlwZS4KQEAgLTM5ODEsMjUgKzQwOTQsOTcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWR2X3JlcG9ydChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggdHlwZSwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCSAgICAgICB1OCBiZGFkZHJfdHlwZSwgczggcnNzaSwgdTggKmRhdGEsIHU4IGxlbikKK3sKKwlzdHJ1Y3QgZGlzY292ZXJ5X3N0YXRlICpkID0gJmhkZXYtPmRpc2NvdmVyeTsKKwlib29sIG1hdGNoOworCisJLyogUGFzc2l2ZSBzY2FubmluZyBzaG91bGRuJ3QgdHJpZ2dlciBhbnkgZGV2aWNlIGZvdW5kIGV2ZW50cyAqLworCWlmIChoZGV2LT5sZV9zY2FuX3R5cGUgPT0gTEVfU0NBTl9QQVNTSVZFKSB7CisJCWlmICh0eXBlID09IExFX0FEVl9JTkQgfHwgdHlwZSA9PSBMRV9BRFZfRElSRUNUX0lORCkKKwkJCWNoZWNrX3BlbmRpbmdfbGVfY29ubihoZGV2LCBiZGFkZHIsIGJkYWRkcl90eXBlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIHRoZXJlJ3Mgbm90aGluZyBwZW5kaW5nIGVpdGhlciBzdG9yZSB0aGUgZGF0YSBmcm9tIHRoaXMKKwkgKiBldmVudCBvciBzZW5kIGFuIGltbWVkaWF0ZSBkZXZpY2UgZm91bmQgZXZlbnQgaWYgdGhlIGRhdGEKKwkgKiBzaG91bGQgbm90IGJlIHN0b3JlZCBmb3IgbGF0ZXIuCisJICovCisJaWYgKCFoYXNfcGVuZGluZ19hZHZfcmVwb3J0KGhkZXYpKSB7CisJCS8qIElmIHRoZSByZXBvcnQgd2lsbCB0cmlnZ2VyIGEgU0NBTl9SRVEgc3RvcmUgaXQgZm9yCisJCSAqIGxhdGVyIG1lcmdpbmcuCisJCSAqLworCQlpZiAodHlwZSA9PSBMRV9BRFZfSU5EIHx8IHR5cGUgPT0gTEVfQURWX1NDQU5fSU5EKSB7CisJCQlzdG9yZV9wZW5kaW5nX2Fkdl9yZXBvcnQoaGRldiwgYmRhZGRyLCBiZGFkZHJfdHlwZSwKKwkJCQkJCSByc3NpLCBkYXRhLCBsZW4pOworCQkJcmV0dXJuOworCQl9CisKKwkJbWdtdF9kZXZpY2VfZm91bmQoaGRldiwgYmRhZGRyLCBMRV9MSU5LLCBiZGFkZHJfdHlwZSwgTlVMTCwKKwkJCQkgIHJzc2ksIDAsIDEsIGRhdGEsIGxlbiwgTlVMTCwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgcGVuZGluZyByZXBvcnQgaXMgZm9yIHRoZSBzYW1lIGRldmljZSBhcyB0aGUgbmV3IG9uZSAqLworCW1hdGNoID0gKCFiYWNtcChiZGFkZHIsICZkLT5sYXN0X2Fkdl9hZGRyKSAmJgorCQkgYmRhZGRyX3R5cGUgPT0gZC0+bGFzdF9hZHZfYWRkcl90eXBlKTsKKworCS8qIElmIHRoZSBwZW5kaW5nIGRhdGEgZG9lc24ndCBtYXRjaCB0aGlzIHJlcG9ydCBvciB0aGlzIGlzbid0IGEKKwkgKiBzY2FuIHJlc3BvbnNlIChlLmcuIHdlIGdvdCBhIGR1cGxpY2F0ZSBBRFZfSU5EKSB0aGVuIGZvcmNlCisJICogc2VuZGluZyBvZiB0aGUgcGVuZGluZyBkYXRhLgorCSAqLworCWlmICh0eXBlICE9IExFX0FEVl9TQ0FOX1JTUCB8fCAhbWF0Y2gpIHsKKwkJLyogU2VuZCBvdXQgd2hhdGV2ZXIgaXMgaW4gdGhlIGNhY2hlLCBidXQgc2tpcCBkdXBsaWNhdGVzICovCisJCWlmICghbWF0Y2gpCisJCQltZ210X2RldmljZV9mb3VuZChoZGV2LCAmZC0+bGFzdF9hZHZfYWRkciwgTEVfTElOSywKKwkJCQkJICBkLT5sYXN0X2Fkdl9hZGRyX3R5cGUsIE5VTEwsCisJCQkJCSAgZC0+bGFzdF9hZHZfcnNzaSwgMCwgMSwKKwkJCQkJICBkLT5sYXN0X2Fkdl9kYXRhLAorCQkJCQkgIGQtPmxhc3RfYWR2X2RhdGFfbGVuLCBOVUxMLCAwKTsKKworCQkvKiBJZiB0aGUgbmV3IHJlcG9ydCB3aWxsIHRyaWdnZXIgYSBTQ0FOX1JFUSBzdG9yZSBpdCBmb3IKKwkJICogbGF0ZXIgbWVyZ2luZy4KKwkJICovCisJCWlmICh0eXBlID09IExFX0FEVl9JTkQgfHwgdHlwZSA9PSBMRV9BRFZfU0NBTl9JTkQpIHsKKwkJCXN0b3JlX3BlbmRpbmdfYWR2X3JlcG9ydChoZGV2LCBiZGFkZHIsIGJkYWRkcl90eXBlLAorCQkJCQkJIHJzc2ksIGRhdGEsIGxlbik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBUaGUgYWR2ZXJ0aXNpbmcgcmVwb3J0cyBjYW5ub3QgYmUgbWVyZ2VkLCBzbyBjbGVhcgorCQkgKiB0aGUgcGVuZGluZyByZXBvcnQgYW5kIHNlbmQgb3V0IGEgZGV2aWNlIGZvdW5kIGV2ZW50LgorCQkgKi8KKwkJY2xlYXJfcGVuZGluZ19hZHZfcmVwb3J0KGhkZXYpOworCQltZ210X2RldmljZV9mb3VuZChoZGV2LCBiZGFkZHIsIExFX0xJTkssIGJkYWRkcl90eXBlLCBOVUxMLAorCQkJCSAgcnNzaSwgMCwgMSwgZGF0YSwgbGVuLCBOVUxMLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIHdlIGdldCBoZXJlIHdlJ3ZlIGdvdCBhIHBlbmRpbmcgQURWX0lORCBvciBBRFZfU0NBTl9JTkQgYW5kCisJICogdGhlIG5ldyBldmVudCBpcyBhIFNDQU5fUlNQLiBXZSBjYW4gdGhlcmVmb3JlIHByb2NlZWQgd2l0aAorCSAqIHNlbmRpbmcgYSBtZXJnZWQgZGV2aWNlIGZvdW5kIGV2ZW50LgorCSAqLworCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZkLT5sYXN0X2Fkdl9hZGRyLCBMRV9MSU5LLAorCQkJICBkLT5sYXN0X2Fkdl9hZGRyX3R5cGUsIE5VTEwsIHJzc2ksIDAsIDEsIGRhdGEsIGxlbiwKKwkJCSAgZC0+bGFzdF9hZHZfZGF0YSwgZC0+bGFzdF9hZHZfZGF0YV9sZW4pOworCWNsZWFyX3BlbmRpbmdfYWR2X3JlcG9ydChoZGV2KTsKK30KKwogc3RhdGljIHZvaWQgaGNpX2xlX2Fkdl9yZXBvcnRfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXU4IG51bV9yZXBvcnRzID0gc2tiLT5kYXRhWzBdOwogCXZvaWQgKnB0ciA9ICZza2ItPmRhdGFbMV07Ci0JczggcnNzaTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCXdoaWxlIChudW1fcmVwb3J0cy0tKSB7CiAJCXN0cnVjdCBoY2lfZXZfbGVfYWR2ZXJ0aXNpbmdfaW5mbyAqZXYgPSBwdHI7Ci0KLQkJaWYgKGV2LT5ldnRfdHlwZSA9PSBMRV9BRFZfSU5EIHx8Ci0JCSAgICBldi0+ZXZ0X3R5cGUgPT0gTEVfQURWX0RJUkVDVF9JTkQpCi0JCQljaGVja19wZW5kaW5nX2xlX2Nvbm4oaGRldiwgJmV2LT5iZGFkZHIsCi0JCQkJCSAgICAgIGV2LT5iZGFkZHJfdHlwZSk7CisJCXM4IHJzc2k7CiAKIAkJcnNzaSA9IGV2LT5kYXRhW2V2LT5sZW5ndGhdOwotCQltZ210X2RldmljZV9mb3VuZChoZGV2LCAmZXYtPmJkYWRkciwgTEVfTElOSywgZXYtPmJkYWRkcl90eXBlLAotCQkJCSAgTlVMTCwgcnNzaSwgMCwgMSwgZXYtPmRhdGEsIGV2LT5sZW5ndGgpOworCQlwcm9jZXNzX2Fkdl9yZXBvcnQoaGRldiwgZXYtPmV2dF90eXBlLCAmZXYtPmJkYWRkciwKKwkJCQkgICBldi0+YmRhZGRyX3R5cGUsIHJzc2ksIGV2LT5kYXRhLCBldi0+bGVuZ3RoKTsKIAogCQlwdHIgKz0gc2l6ZW9mKCpldikgKyBldi0+bGVuZ3RoICsgMTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggYjlhNDE4ZS4uODBkMjVjMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAkJaWYgKCFza2JfY29weSkgewogCQkJLyogQ3JlYXRlIGEgcHJpdmF0ZSBjb3B5IHdpdGggaGVhZHJvb20gKi8KLQkJCXNrYl9jb3B5ID0gX19wc2tiX2NvcHkoc2tiLCAxLCBHRlBfQVRPTUlDKTsKKwkJCXNrYl9jb3B5ID0gX19wc2tiX2NvcHlfZmNsb25lKHNrYiwgMSwgR0ZQX0FUT01JQywgdHJ1ZSk7CiAJCQlpZiAoIXNrYl9jb3B5KQogCQkJCWNvbnRpbnVlOwogCkBAIC0yNDcsOCArMjQ3LDggQEAKIAkJCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOwogCiAJCQkvKiBDcmVhdGUgYSBwcml2YXRlIGNvcHkgd2l0aCBoZWFkcm9vbSAqLwotCQkJc2tiX2NvcHkgPSBfX3Bza2JfY29weShza2IsIEhDSV9NT05fSERSX1NJWkUsCi0JCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJCXNrYl9jb3B5ID0gX19wc2tiX2NvcHlfZmNsb25lKHNrYiwgSENJX01PTl9IRFJfU0laRSwKKwkJCQkJCSAgICAgIEdGUF9BVE9NSUMsIHRydWUpOwogCQkJaWYgKCFza2JfY29weSkKIAkJCQljb250aW51ZTsKIApAQCAtNTI0LDE2ICs1MjQsNyBAQAogCWNhc2UgSENJU0VUUkFXOgogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfUkFXX0RFVklDRSwgJmhkZXYtPnF1aXJrcykpCi0JCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmIChhcmcpCi0JCQlzZXRfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncyk7Ci0JCWVsc2UKLQkJCWNsZWFyX2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpOwotCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAljYXNlIEhDSUdFVENPTk5JTkZPOgogCQlyZXR1cm4gaGNpX2dldF9jb25uX2luZm8oaGRldiwgKHZvaWQgX191c2VyICopIGFyZyk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCmluZGV4IGRjNGQzMDEuLjZlYWJiZTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCkBAIC00NzEsOCArNDcxLDE0IEBACiAJY2hhbi0+bWF4X3R4ID0gTDJDQVBfREVGQVVMVF9NQVhfVFg7CiAJY2hhbi0+dHhfd2luID0gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1c7CiAJY2hhbi0+dHhfd2luX21heCA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCWNoYW4tPnJlbW90ZV9tYXhfdHggPSBjaGFuLT5tYXhfdHg7CisJY2hhbi0+cmVtb3RlX3R4X3dpbiA9IGNoYW4tPnR4X3dpbjsKIAljaGFuLT5hY2tfd2luID0gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1c7CiAJY2hhbi0+c2VjX2xldmVsID0gQlRfU0VDVVJJVFlfTE9XOworCWNoYW4tPmZsdXNoX3RvID0gTDJDQVBfREVGQVVMVF9GTFVTSF9UTzsKKwljaGFuLT5yZXRyYW5zX3RpbWVvdXQgPSBMMkNBUF9ERUZBVUxUX1JFVFJBTlNfVE87CisJY2hhbi0+bW9uaXRvcl90aW1lb3V0ID0gTDJDQVBfREVGQVVMVF9NT05JVE9SX1RPOworCWNoYW4tPmNvbmZfc3RhdGUgPSAwOwogCiAJc2V0X2JpdChGTEFHX0ZPUkNFX0FDVElWRSwgJmNoYW4tPmZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggZWY1ZTViMC4uYWRlM2ZiNCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTExODAsMTMgKzExODAsMTYgQEAKIAkvKiBDaGVjayBmb3IgYmFja2xvZyBzaXplICovCiAJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChwYXJlbnQpKSB7CiAJCUJUX0RCRygiYmFja2xvZyBmdWxsICVkIiwgcGFyZW50LT5za19hY2tfYmFja2xvZyk7CisJCXJlbGVhc2Vfc29jayhwYXJlbnQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlzayA9IGwyY2FwX3NvY2tfYWxsb2Moc29ja19uZXQocGFyZW50KSwgTlVMTCwgQlRQUk9UT19MMkNBUCwKIAkJCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmICghc2spCisJaWYgKCFzaykgeworCQlyZWxlYXNlX3NvY2socGFyZW50KTsKIAkJcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAogCWJ0X3NvY2tfcmVjbGFzc2lmeV9sb2NrKHNrLCBCVFBST1RPX0wyQ0FQKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9saWIuYyBiL25ldC9ibHVldG9vdGgvbGliLmMKaW5kZXggYjNmYmM3My4uOTQxYWQ3NSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9saWIuYworKysgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCkBAIC01OCw2ICs1OCw3IEBACiAJCXJldHVybiBFSU87CiAKIAljYXNlIDB4MDQ6CisJY2FzZSAweDNjOgogCQlyZXR1cm4gRUhPU1RET1dOOwogCiAJY2FzZSAweDA1OgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210LmMgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwppbmRleCBkMmQ0ZTBkLi4wZmNlNTQ0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXQuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwpAQCAtMjksMTIgKzI5LDEzIEBACiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9tZ210Lmg+CiAKICNpbmNsdWRlICJzbXAuaCIKIAogI2RlZmluZSBNR01UX1ZFUlNJT04JMQotI2RlZmluZSBNR01UX1JFVklTSU9OCTUKKyNkZWZpbmUgTUdNVF9SRVZJU0lPTgk2CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF9jb21tYW5kc1tdID0gewogCU1HTVRfT1BfUkVBRF9JTkRFWF9MSVNULApAQCAtODMsNiArODQsNyBAQAogCU1HTVRfT1BfU0VUX0RFQlVHX0tFWVMsCiAJTUdNVF9PUF9TRVRfUFJJVkFDWSwKIAlNR01UX09QX0xPQURfSVJLUywKKwlNR01UX09QX0dFVF9DT05OX0lORk8sCiB9OwogCiBzdGF0aWMgY29uc3QgdTE2IG1nbXRfZXZlbnRzW10gPSB7CkBAIC0yODUwLDEwICsyODUyLDcgQEAKIAl9CiAKIAlzZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9NRURJVU07Ci0JaWYgKGNwLT5pb19jYXAgPT0gMHgwMykKLQkJYXV0aF90eXBlID0gSENJX0FUX0RFRElDQVRFRF9CT05ESU5HOwotCWVsc2UKLQkJYXV0aF90eXBlID0gSENJX0FUX0RFRElDQVRFRF9CT05ESU5HX01JVE07CisJYXV0aF90eXBlID0gSENJX0FUX0RFRElDQVRFRF9CT05ESU5HOwogCiAJaWYgKGNwLT5hZGRyLnR5cGUgPT0gQkRBRERSX0JSRURSKSB7CiAJCWNvbm4gPSBoY2lfY29ubmVjdF9hY2woaGRldiwgJmNwLT5hZGRyLmJkYWRkciwgc2VjX2xldmVsLApAQCAtMzM1MSw2ICszMzUwLDggQEAKIAogc3RhdGljIHZvaWQgc3RhcnRfZGlzY292ZXJ5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMpCiB7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMDsKKwogCUJUX0RCRygic3RhdHVzICVkIiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMpIHsKQEAgLTMzNjYsMTMgKzMzNjcsMTEgQEAKIAogCXN3aXRjaCAoaGRldi0+ZGlzY292ZXJ5LnR5cGUpIHsKIAljYXNlIERJU0NPVl9UWVBFX0xFOgotCQlxdWV1ZV9kZWxheWVkX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+bGVfc2Nhbl9kaXNhYmxlLAotCQkJCSAgIERJU0NPVl9MRV9USU1FT1VUKTsKKwkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoRElTQ09WX0xFX1RJTUVPVVQpOwogCQlicmVhazsKIAogCWNhc2UgRElTQ09WX1RZUEVfSU5URVJMRUFWRUQ6Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5sZV9zY2FuX2Rpc2FibGUsCi0JCQkJICAgRElTQ09WX0lOVEVSTEVBVkVEX1RJTUVPVVQpOworCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhoZGV2LT5kaXNjb3ZfaW50ZXJsZWF2ZWRfdGltZW91dCk7CiAJCWJyZWFrOwogCiAJY2FzZSBESVNDT1ZfVFlQRV9CUkVEUjoKQEAgLTMzODEsNiArMzM4MCwxMSBAQAogCWRlZmF1bHQ6CiAJCUJUX0VSUigiSW52YWxpZCBkaXNjb3ZlcnkgdHlwZSAlZCIsIGhkZXYtPmRpc2NvdmVyeS50eXBlKTsKIAl9CisKKwlpZiAoIXRpbWVvdXQpCisJCXJldHVybjsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5sZV9zY2FuX2Rpc2FibGUsIHRpbWVvdXQpOwogfQogCiBzdGF0aWMgaW50IHN0YXJ0X2Rpc2NvdmVyeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LApAQCAtNDUzMCw3ICs0NTM0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgbWdtdF9sdGtfaW5mbyAqa2V5ID0gJmNwLT5rZXlzW2ldOwotCQl1OCB0eXBlLCBhZGRyX3R5cGU7CisJCXU4IHR5cGUsIGFkZHJfdHlwZSwgYXV0aGVudGljYXRlZDsKIAogCQlpZiAoa2V5LT5hZGRyLnR5cGUgPT0gQkRBRERSX0xFX1BVQkxJQykKIAkJCWFkZHJfdHlwZSA9IEFERFJfTEVfREVWX1BVQkxJQzsKQEAgLTQ1NDIsOCArNDU0NiwxOSBAQAogCQllbHNlCiAJCQl0eXBlID0gSENJX1NNUF9MVEtfU0xBVkU7CiAKKwkJc3dpdGNoIChrZXktPnR5cGUpIHsKKwkJY2FzZSBNR01UX0xUS19VTkFVVEhFTlRJQ0FURUQ6CisJCQlhdXRoZW50aWNhdGVkID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIE1HTVRfTFRLX0FVVEhFTlRJQ0FURUQ6CisJCQlhdXRoZW50aWNhdGVkID0gMHgwMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCX0KKwogCQloY2lfYWRkX2x0ayhoZGV2LCAma2V5LT5hZGRyLmJkYWRkciwgYWRkcl90eXBlLCB0eXBlLAotCQkJICAgIGtleS0+dHlwZSwga2V5LT52YWwsIGtleS0+ZW5jX3NpemUsIGtleS0+ZWRpdiwKKwkJCSAgICBhdXRoZW50aWNhdGVkLCBrZXktPnZhbCwga2V5LT5lbmNfc2l6ZSwga2V5LT5lZGl2LAogCQkJICAgIGtleS0+cmFuZCk7CiAJfQogCkBAIC00NTU1LDYgKzQ1NzAsMjE4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RydWN0IGNtZF9jb25uX2xvb2t1cCB7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWJvb2wgdmFsaWRfdHhfcG93ZXI7CisJdTggbWdtdF9zdGF0dXM7Cit9OworCitzdGF0aWMgdm9pZCBnZXRfY29ubl9pbmZvX2NvbXBsZXRlKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjbWRfY29ubl9sb29rdXAgKm1hdGNoID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9jcF9nZXRfY29ubl9pbmZvICpjcDsKKwlzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubl9pbmZvIHJwOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNtZC0+dXNlcl9kYXRhOworCisJaWYgKGNvbm4gIT0gbWF0Y2gtPmNvbm4pCisJCXJldHVybjsKKworCWNwID0gKHN0cnVjdCBtZ210X2NwX2dldF9jb25uX2luZm8gKikgY21kLT5wYXJhbTsKKworCW1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOworCWJhY3B5KCZycC5hZGRyLmJkYWRkciwgJmNwLT5hZGRyLmJkYWRkcik7CisJcnAuYWRkci50eXBlID0gY3AtPmFkZHIudHlwZTsKKworCWlmICghbWF0Y2gtPm1nbXRfc3RhdHVzKSB7CisJCXJwLnJzc2kgPSBjb25uLT5yc3NpOworCisJCWlmIChtYXRjaC0+dmFsaWRfdHhfcG93ZXIpIHsKKwkJCXJwLnR4X3Bvd2VyID0gY29ubi0+dHhfcG93ZXI7CisJCQlycC5tYXhfdHhfcG93ZXIgPSBjb25uLT5tYXhfdHhfcG93ZXI7CisJCX0gZWxzZSB7CisJCQlycC50eF9wb3dlciA9IEhDSV9UWF9QT1dFUl9JTlZBTElEOworCQkJcnAubWF4X3R4X3Bvd2VyID0gSENJX1RYX1BPV0VSX0lOVkFMSUQ7CisJCX0KKwl9CisKKwljbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkgICAgIG1hdGNoLT5tZ210X3N0YXR1cywgJnJwLCBzaXplb2YocnApKTsKKworCWhjaV9jb25uX2Ryb3AoY29ubik7CisKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbm5faW5mb19yZWZyZXNoX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMpCit7CisJc3RydWN0IGhjaV9jcF9yZWFkX3Jzc2kgKmNwOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgY21kX2Nvbm5fbG9va3VwIG1hdGNoOworCXUxNiBoYW5kbGU7CisKKwlCVF9EQkcoInN0YXR1cyAweCUwMngiLCBzdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJLyogVFggcG93ZXIgZGF0YSBpcyB2YWxpZCBpbiBjYXNlIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwKKwkgKiBvdGhlcndpc2Ugd2UgYXNzdW1lIGl0J3Mgbm90IHZhbGlkLiBBdCB0aGUgbW9tZW50IHdlIGFzc3VtZSB0aGF0CisJICogZWl0aGVyIGJvdGggb3Igbm9uZSBvZiBjdXJyZW50IGFuZCBtYXggdmFsdWVzIGFyZSB2YWxpZCB0byBrZWVwIGNvZGUKKwkgKiBzaW1wbGUuCisJICovCisJbWF0Y2gudmFsaWRfdHhfcG93ZXIgPSAhc3RhdHVzOworCisJLyogQ29tbWFuZHMgc2VudCBpbiByZXF1ZXN0IGFyZSBlaXRoZXIgUmVhZCBSU1NJIG9yIFJlYWQgVHJhbnNtaXQgUG93ZXIKKwkgKiBMZXZlbCBzbyB3ZSBjaGVjayB3aGljaCBvbmUgd2FzIGxhc3Qgc2VudCB0byByZXRyaWV2ZSBjb25uZWN0aW9uCisJICogaGFuZGxlLiAgQm90aCBjb21tYW5kcyBoYXZlIGhhbmRsZSBhcyBmaXJzdCBwYXJhbWV0ZXIgc28gaXQncyBzYWZlIHRvCisJICogY2FzdCBkYXRhIG9uIHRoZSBzYW1lIGNvbW1hbmQgc3RydWN0LgorCSAqCisJICogRmlyc3QgY29tbWFuZCBzZW50IGlzIGFsd2F5cyBSZWFkIFJTU0kgYW5kIHdlIGZhaWwgb25seSBpZiBpdCBmYWlscy4KKwkgKiBJbiBvdGhlciBjYXNlIHdlIHNpbXBseSBvdmVycmlkZSBlcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzIGFzIHdlCisJICogYWxyZWFkeSByZW1lbWJlcmVkIGlmIFRYIHBvd2VyIHZhbHVlIGlzIGFjdHVhbGx5IHZhbGlkLgorCSAqLworCWNwID0gaGNpX3NlbnRfY21kX2RhdGEoaGRldiwgSENJX09QX1JFQURfUlNTSSk7CisJaWYgKCFjcCkgeworCQljcCA9IGhjaV9zZW50X2NtZF9kYXRhKGhkZXYsIEhDSV9PUF9SRUFEX1RYX1BPV0VSKTsKKwkJc3RhdHVzID0gMDsKKwl9CisKKwlpZiAoIWNwKSB7CisJCUJUX0VSUigiaW52YWxpZCBzZW50X2NtZCBpbiByZXNwb25zZSIpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwloYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGNwLT5oYW5kbGUpOworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwlpZiAoIWNvbm4pIHsKKwkJQlRfRVJSKCJ1bmtub3duIGhhbmRsZSAoJWQpIGluIHJlc3BvbnNlIiwgaGFuZGxlKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJbWF0Y2guY29ubiA9IGNvbm47CisJbWF0Y2gubWdtdF9zdGF0dXMgPSBtZ210X3N0YXR1cyhzdGF0dXMpOworCisJLyogQ2FjaGUgcmVmcmVzaCBpcyBjb21wbGV0ZSwgbm93IHJlcGx5IGZvciBtZ210IHJlcXVlc3QgZm9yIGdpdmVuCisJICogY29ubmVjdGlvbiBvbmx5LgorCSAqLworCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfR0VUX0NPTk5fSU5GTywgaGRldiwKKwkJCSAgICAgZ2V0X2Nvbm5faW5mb19jb21wbGV0ZSwgJm1hdGNoKTsKKwordW5sb2NrOgorCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgaW50IGdldF9jb25uX2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKKwkJCSB1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X2NwX2dldF9jb25uX2luZm8gKmNwID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubl9pbmZvIHJwOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwl1bnNpZ25lZCBsb25nIGNvbm5faW5mb19hZ2U7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwltZW1zZXQoJnJwLCAwLCBzaXplb2YocnApKTsKKwliYWNweSgmcnAuYWRkci5iZGFkZHIsICZjcC0+YWRkci5iZGFkZHIpOworCXJwLmFkZHIudHlwZSA9IGNwLT5hZGRyLnR5cGU7CisKKwlpZiAoIWJkYWRkcl90eXBlX2lzX3ZhbGlkKGNwLT5hZGRyLnR5cGUpKQorCQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCSAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKKwkJCQkgICAgJnJwLCBzaXplb2YocnApKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7CisJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NPTk5fSU5GTywKKwkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLCBzaXplb2YocnApKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKGNwLT5hZGRyLnR5cGUgPT0gQkRBRERSX0JSRURSKQorCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssCisJCQkJCSAgICAgICAmY3AtPmFkZHIuYmRhZGRyKTsKKwllbHNlCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBMRV9MSU5LLCAmY3AtPmFkZHIuYmRhZGRyKTsKKworCWlmICghY29ubiB8fCBjb25uLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKKwkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCSAgIE1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQsICZycCwgc2l6ZW9mKHJwKSk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIFRvIGF2b2lkIGNsaWVudCB0cnlpbmcgdG8gZ3Vlc3Mgd2hlbiB0byBwb2xsIGFnYWluIGZvciBpbmZvcm1hdGlvbiB3ZQorCSAqIGNhbGN1bGF0ZSBjb25uIGluZm8gYWdlIGFzIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIG1pbi9tYXggc2V0IGluIGhkZXYuCisJICovCisJY29ubl9pbmZvX2FnZSA9IGhkZXYtPmNvbm5faW5mb19taW5fYWdlICsKKwkJCXByYW5kb21fdTMyX21heChoZGV2LT5jb25uX2luZm9fbWF4X2FnZSAtCisJCQkJCWhkZXYtPmNvbm5faW5mb19taW5fYWdlKTsKKworCS8qIFF1ZXJ5IGNvbnRyb2xsZXIgdG8gcmVmcmVzaCBjYWNoZWQgdmFsdWVzIGlmIHRoZXkgYXJlIHRvbyBvbGQgb3Igd2VyZQorCSAqIG5ldmVyIHJlYWQuCisJICovCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY29ubi0+Y29ubl9pbmZvX3RpbWVzdGFtcCArCisJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKGNvbm5faW5mb19hZ2UpKSB8fAorCSAgICAhY29ubi0+Y29ubl9pbmZvX3RpbWVzdGFtcCkgeworCQlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOworCQlzdHJ1Y3QgaGNpX2NwX3JlYWRfdHhfcG93ZXIgcmVxX3R4cF9jcDsKKwkJc3RydWN0IGhjaV9jcF9yZWFkX3Jzc2kgcmVxX3Jzc2lfY3A7CisJCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCisJCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKKwkJcmVxX3Jzc2lfY3AuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJaGNpX3JlcV9hZGQoJnJlcSwgSENJX09QX1JFQURfUlNTSSwgc2l6ZW9mKHJlcV9yc3NpX2NwKSwKKwkJCSAgICAmcmVxX3Jzc2lfY3ApOworCisJCS8qIEZvciBMRSBsaW5rcyBUWCBwb3dlciBkb2VzIG5vdCBjaGFuZ2UgdGh1cyB3ZSBkb24ndCBuZWVkIHRvCisJCSAqIHF1ZXJ5IGZvciBpdCBvbmNlIHZhbHVlIGlzIGtub3duLgorCQkgKi8KKwkJaWYgKCFiZGFkZHJfdHlwZV9pc19sZShjcC0+YWRkci50eXBlKSB8fAorCQkgICAgY29ubi0+dHhfcG93ZXIgPT0gSENJX1RYX1BPV0VSX0lOVkFMSUQpIHsKKwkJCXJlcV90eHBfY3AuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJCXJlcV90eHBfY3AudHlwZSA9IDB4MDA7CisJCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfUkVBRF9UWF9QT1dFUiwKKwkJCQkgICAgc2l6ZW9mKHJlcV90eHBfY3ApLCAmcmVxX3R4cF9jcCk7CisJCX0KKworCQkvKiBNYXggVFggcG93ZXIgbmVlZHMgdG8gYmUgcmVhZCBvbmx5IG9uY2UgcGVyIGNvbm5lY3Rpb24gKi8KKwkJaWYgKGNvbm4tPm1heF90eF9wb3dlciA9PSBIQ0lfVFhfUE9XRVJfSU5WQUxJRCkgeworCQkJcmVxX3R4cF9jcC5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQkJcmVxX3R4cF9jcC50eXBlID0gMHgwMTsKKwkJCWhjaV9yZXFfYWRkKCZyZXEsIEhDSV9PUF9SRUFEX1RYX1BPV0VSLAorCQkJCSAgICBzaXplb2YocmVxX3R4cF9jcCksICZyZXFfdHhwX2NwKTsKKwkJfQorCisJCWVyciA9IGhjaV9yZXFfcnVuKCZyZXEsIGNvbm5faW5mb19yZWZyZXNoX2NvbXBsZXRlKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIHVubG9jazsKKworCQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX0dFVF9DT05OX0lORk8sIGhkZXYsCisJCQkJICAgICAgIGRhdGEsIGxlbik7CisJCWlmICghY21kKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQloY2lfY29ubl9ob2xkKGNvbm4pOworCQljbWQtPnVzZXJfZGF0YSA9IGNvbm47CisKKwkJY29ubi0+Y29ubl9pbmZvX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJLyogQ2FjaGUgaXMgdmFsaWQsIGp1c3QgcmVwbHkgd2l0aCB2YWx1ZXMgY2FjaGVkIGluIGhjaV9jb25uICovCisJCXJwLnJzc2kgPSBjb25uLT5yc3NpOworCQlycC50eF9wb3dlciA9IGNvbm4tPnR4X3Bvd2VyOworCQlycC5tYXhfdHhfcG93ZXIgPSBjb25uLT5tYXhfdHhfcG93ZXI7CisKKwkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCSAgIE1HTVRfU1RBVFVTX1NVQ0NFU1MsICZycCwgc2l6ZW9mKHJwKSk7CisJfQorCit1bmxvY2s6CisJaGNpX2Rldl91bmxvY2soaGRldik7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtZ210X2hhbmRsZXIgewogCWludCAoKmZ1bmMpIChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLAogCQkgICAgIHUxNiBkYXRhX2xlbik7CkBAIC00NjEwLDYgKzQ4MzcsNyBAQAogCXsgc2V0X2RlYnVnX2tleXMsICAgICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCiAJeyBzZXRfcHJpdmFjeSwgICAgICAgICAgICBmYWxzZSwgTUdNVF9TRVRfUFJJVkFDWV9TSVpFIH0sCiAJeyBsb2FkX2lya3MsICAgICAgICAgICAgICB0cnVlLCAgTUdNVF9MT0FEX0lSS1NfU0laRSB9LAorCXsgZ2V0X2Nvbm5faW5mbywgICAgICAgICAgZmFsc2UsIE1HTVRfR0VUX0NPTk5fSU5GT19TSVpFIH0sCiB9OwogCiAKQEAgLTUwMDUsNiArNTIzMywxNCBAQAogCW1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfTElOS19LRVksIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CiB9CiAKK3N0YXRpYyB1OCBtZ210X2x0a190eXBlKHN0cnVjdCBzbXBfbHRrICpsdGspCit7CisJaWYgKGx0ay0+YXV0aGVudGljYXRlZCkKKwkJcmV0dXJuIE1HTVRfTFRLX0FVVEhFTlRJQ0FURUQ7CisKKwlyZXR1cm4gTUdNVF9MVEtfVU5BVVRIRU5USUNBVEVEOworfQorCiB2b2lkIG1nbXRfbmV3X2x0ayhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNtcF9sdGsgKmtleSwgYm9vbCBwZXJzaXN0ZW50KQogewogCXN0cnVjdCBtZ210X2V2X25ld19sb25nX3Rlcm1fa2V5IGV2OwpAQCAtNTAzMCw3ICs1MjY2LDcgQEAKIAogCWJhY3B5KCZldi5rZXkuYWRkci5iZGFkZHIsICZrZXktPmJkYWRkcik7CiAJZXYua2V5LmFkZHIudHlwZSA9IGxpbmtfdG9fYmRhZGRyKExFX0xJTkssIGtleS0+YmRhZGRyX3R5cGUpOwotCWV2LmtleS50eXBlID0ga2V5LT5hdXRoZW50aWNhdGVkOworCWV2LmtleS50eXBlID0gbWdtdF9sdGtfdHlwZShrZXkpOwogCWV2LmtleS5lbmNfc2l6ZSA9IGtleS0+ZW5jX3NpemU7CiAJZXYua2V5LmVkaXYgPSBrZXktPmVkaXY7CiAJZXYua2V5LnJhbmQgPSBrZXktPnJhbmQ7CkBAIC01NjY4LDggKzU5MDQsOSBAQAogfQogCiB2b2lkIG1nbXRfZGV2aWNlX2ZvdW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCi0JCSAgICAgICB1OCBhZGRyX3R5cGUsIHU4ICpkZXZfY2xhc3MsIHM4IHJzc2ksIHU4IGNmbV9uYW1lLCB1OAotCQkgICAgICAgc3NwLCB1OCAqZWlyLCB1MTYgZWlyX2xlbikKKwkJICAgICAgIHU4IGFkZHJfdHlwZSwgdTggKmRldl9jbGFzcywgczggcnNzaSwgdTggY2ZtX25hbWUsCisJCSAgICAgICB1OCBzc3AsIHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCAqc2Nhbl9yc3AsCisJCSAgICAgICB1OCBzY2FuX3JzcF9sZW4pCiB7CiAJY2hhciBidWZbNTEyXTsKIAlzdHJ1Y3QgbWdtdF9ldl9kZXZpY2VfZm91bmQgKmV2ID0gKHZvaWQgKikgYnVmOwpAQCAtNTY3OSw4ICs1OTE2LDEwIEBACiAJaWYgKCFoY2lfZGlzY292ZXJ5X2FjdGl2ZShoZGV2KSkKIAkJcmV0dXJuOwogCi0JLyogTGVhdmUgNSBieXRlcyBmb3IgYSBwb3RlbnRpYWwgQ29EIGZpZWxkICovCi0JaWYgKHNpemVvZigqZXYpICsgZWlyX2xlbiArIDUgPiBzaXplb2YoYnVmKSkKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2guIFRoZSA1IGV4dHJhIGJ5dGVzCisJICogYXJlIGZvciB0aGUgcG90ZW50aWFsIENvRCBmaWVsZC4KKwkgKi8KKwlpZiAoc2l6ZW9mKCpldikgKyBlaXJfbGVuICsgc2Nhbl9yc3BfbGVuICsgNSA+IHNpemVvZihidWYpKQogCQlyZXR1cm47CiAKIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CkBAIC01NzA3LDggKzU5NDYsMTEgQEAKIAkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShldi0+ZWlyLCBlaXJfbGVuLCBFSVJfQ0xBU1NfT0ZfREVWLAogCQkJCQkgIGRldl9jbGFzcywgMyk7CiAKLQlldi0+ZWlyX2xlbiA9IGNwdV90b19sZTE2KGVpcl9sZW4pOwotCWV2X3NpemUgPSBzaXplb2YoKmV2KSArIGVpcl9sZW47CisJaWYgKHNjYW5fcnNwX2xlbiA+IDApCisJCW1lbWNweShldi0+ZWlyICsgZWlyX2xlbiwgc2Nhbl9yc3AsIHNjYW5fcnNwX2xlbik7CisKKwlldi0+ZWlyX2xlbiA9IGNwdV90b19sZTE2KGVpcl9sZW4gKyBzY2FuX3JzcF9sZW4pOworCWV2X3NpemUgPSBzaXplb2YoKmV2KSArIGVpcl9sZW4gKyBzY2FuX3JzcF9sZW47CiAKIAltZ210X2V2ZW50KE1HTVRfRVZfREVWSUNFX0ZPVU5ELCBoZGV2LCBldiwgZXZfc2l6ZSwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKaW5kZXggY2Y2MjAyNjAuLjc1NGI2ZmUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCXNldHVwX3RpbWVyKCZkLT50aW1lciwgcmZjb21tX2RsY190aW1lb3V0LCAodW5zaWduZWQgbG9uZylkKTsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmQtPnR4X3F1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmZC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZC0+bG9jayk7CiAJYXRvbWljX3NldCgmZC0+cmVmY250LCAxKTsKIAogCXJmY29tbV9kbGNfY2xlYXJfc3RhdGUoZCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCmluZGV4IDQwM2VjMDkuLjhlMzg1YTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCkBAIC03MCw3ICs3MCw3IEBACiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKHJmY29tbV9kZXZfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJmY29tbV9kZXZfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKHJmY29tbV9kZXZfbG9jayk7CiAKIHN0YXRpYyB2b2lkIHJmY29tbV9kZXZfZGF0YV9yZWFkeShzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIHJmY29tbV9kZXZfc3RhdGVfY2hhbmdlKHN0cnVjdCByZmNvbW1fZGxjICpkbGMsIGludCBlcnIpOwpAQCAtOTYsOSArOTYsOSBAQAogCWlmIChkZXYtPnR0eV9kZXYpCiAJCXR0eV91bnJlZ2lzdGVyX2RldmljZShyZmNvbW1fdHR5X2RyaXZlciwgZGV2LT5pZCk7CiAKLQlzcGluX2xvY2soJnJmY29tbV9kZXZfbG9jayk7CisJbXV0ZXhfbG9jaygmcmZjb21tX2Rldl9sb2NrKTsKIAlsaXN0X2RlbCgmZGV2LT5saXN0KTsKLQlzcGluX3VubG9jaygmcmZjb21tX2Rldl9sb2NrKTsKKwltdXRleF91bmxvY2soJnJmY29tbV9kZXZfbG9jayk7CiAKIAlrZnJlZShkZXYpOwogCkBAIC0xNjEsMTQgKzE2MSwxNCBAQAogewogCXN0cnVjdCByZmNvbW1fZGV2ICpkZXY7CiAKLQlzcGluX2xvY2soJnJmY29tbV9kZXZfbG9jayk7CisJbXV0ZXhfbG9jaygmcmZjb21tX2Rldl9sb2NrKTsKIAogCWRldiA9IF9fcmZjb21tX2Rldl9sb29rdXAoaWQpOwogCiAJaWYgKGRldiAmJiAhdHR5X3BvcnRfZ2V0KCZkZXYtPnBvcnQpKQogCQlkZXYgPSBOVUxMOwogCi0Jc3Bpbl91bmxvY2soJnJmY29tbV9kZXZfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZyZmNvbW1fZGV2X2xvY2spOwogCiAJcmV0dXJuIGRldjsKIH0KQEAgLTIyNCw3ICsyMjQsNyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXNwaW5fbG9jaygmcmZjb21tX2Rldl9sb2NrKTsKKwltdXRleF9sb2NrKCZyZmNvbW1fZGV2X2xvY2spOwogCiAJaWYgKHJlcS0+ZGV2X2lkIDwgMCkgewogCQlkZXYtPmlkID0gMDsKQEAgLTMwNSwxMSArMzA1LDExIEBACiAJICAgaG9sZHMgcmVmZXJlbmNlIHRvIHRoaXMgbW9kdWxlLiAqLwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAKLQlzcGluX3VubG9jaygmcmZjb21tX2Rldl9sb2NrKTsKKwltdXRleF91bmxvY2soJnJmY29tbV9kZXZfbG9jayk7CiAJcmV0dXJuIGRldjsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCZyZmNvbW1fZGV2X2xvY2spOworCW11dGV4X3VubG9jaygmcmZjb21tX2Rldl9sb2NrKTsKIAlrZnJlZShkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC01MjQsNyArNTI0LDcgQEAKIAogCWRpID0gZGwtPmRldl9pbmZvOwogCi0Jc3Bpbl9sb2NrKCZyZmNvbW1fZGV2X2xvY2spOworCW11dGV4X2xvY2soJnJmY29tbV9kZXZfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnJmY29tbV9kZXZfbGlzdCwgbGlzdCkgewogCQlpZiAoIXR0eV9wb3J0X2dldCgmZGV2LT5wb3J0KSkKQEAgLTU0MCw3ICs1NDAsNyBAQAogCQkJYnJlYWs7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnJmY29tbV9kZXZfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZyZmNvbW1fZGV2X2xvY2spOwogCiAJZGwtPmRldl9udW0gPSBuOwogCXNpemUgPSBzaXplb2YoKmRsKSArIG4gKiBzaXplb2YoKmRpKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmMgYi9uZXQvYmx1ZXRvb3RoL3NtcC5jCmluZGV4IGRmYjRlMTEuLjNkMWNjMTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmMKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuYwpAQCAtMzUsNiArMzUsMzMgQEAKIAogI2RlZmluZSBBVVRIX1JFUV9NQVNLICAgMHgwNwogCisjZGVmaW5lIFNNUF9GTEFHX1RLX1ZBTElECTEKKyNkZWZpbmUgU01QX0ZMQUdfQ0ZNX1BFTkRJTkcJMgorI2RlZmluZSBTTVBfRkxBR19NSVRNX0FVVEgJMworI2RlZmluZSBTTVBfRkxBR19DT01QTEVURQk0CisjZGVmaW5lIFNNUF9GTEFHX0lOSVRJQVRPUgk1CisKK3N0cnVjdCBzbXBfY2hhbiB7CisJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm47CisJdTgJCXByZXFbN107IC8qIFNNUCBQYWlyaW5nIFJlcXVlc3QgKi8KKwl1OAkJcHJzcFs3XTsgLyogU01QIFBhaXJpbmcgUmVzcG9uc2UgKi8KKwl1OAkJcHJuZFsxNl07IC8qIFNNUCBQYWlyaW5nIFJhbmRvbSAobG9jYWwpICovCisJdTgJCXJybmRbMTZdOyAvKiBTTVAgUGFpcmluZyBSYW5kb20gKHJlbW90ZSkgKi8KKwl1OAkJcGNuZlsxNl07IC8qIFNNUCBQYWlyaW5nIENvbmZpcm0gKi8KKwl1OAkJdGtbMTZdOyAvKiBTTVAgVGVtcG9yYXJ5IEtleSAqLworCXU4CQllbmNfa2V5X3NpemU7CisJdTgJCXJlbW90ZV9rZXlfZGlzdDsKKwliZGFkZHJfdAlpZF9hZGRyOworCXU4CQlpZF9hZGRyX3R5cGU7CisJdTgJCWlya1sxNl07CisJc3RydWN0IHNtcF9jc3JrCSpjc3JrOworCXN0cnVjdCBzbXBfY3Nyawkqc2xhdmVfY3NyazsKKwlzdHJ1Y3Qgc21wX2x0awkqbHRrOworCXN0cnVjdCBzbXBfbHRrCSpzbGF2ZV9sdGs7CisJc3RydWN0IHNtcF9pcmsJKnJlbW90ZV9pcms7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwMTI4KGNvbnN0IHU4IHNyY1sxNl0sIHU4IGRzdFsxNl0pCiB7CiAJaW50IGk7CkBAIC0zNjksNyArMzk2LDcgQEAKIAogCS8qIEluaXRpYWxpemUga2V5IGZvciBKVVNUIFdPUktTICovCiAJbWVtc2V0KHNtcC0+dGssIDAsIHNpemVvZihzbXAtPnRrKSk7Ci0JY2xlYXJfYml0KFNNUF9GTEFHX1RLX1ZBTElELCAmc21wLT5zbXBfZmxhZ3MpOworCWNsZWFyX2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+ZmxhZ3MpOwogCiAJQlRfREJHKCJ0a19yZXF1ZXN0OiBhdXRoOiVkIGxjbDolZCByZW06JWQiLCBhdXRoLCBsb2NhbF9pbywgcmVtb3RlX2lvKTsKIApAQCAtMzg4LDE5ICs0MTUsMTggQEAKIAkJbWV0aG9kID0gSlVTVF9XT1JLUzsKIAogCS8qIERvbid0IGNvbmZpcm0gbG9jYWxseSBpbml0aWF0ZWQgcGFpcmluZyBhdHRlbXB0cyAqLwotCWlmIChtZXRob2QgPT0gSlVTVF9DRk0gJiYgdGVzdF9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLAotCQkJCQkgICAmc21wLT5zbXBfZmxhZ3MpKQorCWlmIChtZXRob2QgPT0gSlVTVF9DRk0gJiYgdGVzdF9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLCAmc21wLT5mbGFncykpCiAJCW1ldGhvZCA9IEpVU1RfV09SS1M7CiAKIAkvKiBJZiBKdXN0IFdvcmtzLCBDb250aW51ZSB3aXRoIFplcm8gVEsgKi8KIAlpZiAobWV0aG9kID09IEpVU1RfV09SS1MpIHsKLQkJc2V0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+c21wX2ZsYWdzKTsKKwkJc2V0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+ZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBOb3QgSnVzdCBXb3Jrcy9Db25maXJtIHJlc3VsdHMgaW4gTUlUTSBBdXRoZW50aWNhdGlvbiAqLwogCWlmIChtZXRob2QgIT0gSlVTVF9DRk0pCi0JCXNldF9iaXQoU01QX0ZMQUdfTUlUTV9BVVRILCAmc21wLT5zbXBfZmxhZ3MpOworCQlzZXRfYml0KFNNUF9GTEFHX01JVE1fQVVUSCwgJnNtcC0+ZmxhZ3MpOwogCiAJLyogSWYgYm90aCBkZXZpY2VzIGhhdmUgS2V5b2FyZC1EaXNwbGF5IEkvTywgdGhlIG1hc3RlcgogCSAqIENvbmZpcm1zIGFuZCB0aGUgc2xhdmUgRW50ZXJzIHRoZSBwYXNza2V5LgpAQCAtNDE5LDcgKzQ0NSw3IEBACiAJCXBhc3NrZXkgJT0gMTAwMDAwMDsKIAkJcHV0X3VuYWxpZ25lZF9sZTMyKHBhc3NrZXksIHNtcC0+dGspOwogCQlCVF9EQkcoIlBhc3NLZXk6ICVkIiwgcGFzc2tleSk7Ci0JCXNldF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPnNtcF9mbGFncyk7CisJCXNldF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPmZsYWdzKTsKIAl9CiAKIAloY2lfZGV2X2xvY2soaGNvbi0+aGRldik7CkBAIC00NDEsMTUgKzQ2NywxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbmZpcm1fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdTggc21wX2NvbmZpcm0oc3RydWN0IHNtcF9jaGFuICpzbXApCiB7Ci0Jc3RydWN0IHNtcF9jaGFuICpzbXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNtcF9jaGFuLCBjb25maXJtKTsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IHNtcC0+Y29ubjsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhjb24tPmhkZXY7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9IGhkZXYtPnRmbV9hZXM7CiAJc3RydWN0IHNtcF9jbWRfcGFpcmluZ19jb25maXJtIGNwOwogCWludCByZXQ7Ci0JdTggcmVhc29uOwogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKQEAgLTQ2MywzNSArNDg3LDI3IEBACiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIAotCWlmIChyZXQpIHsKLQkJcmVhc29uID0gU01QX1VOU1BFQ0lGSUVEOwotCQlnb3RvIGVycm9yOwotCX0KKwlpZiAocmV0KQorCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOwogCi0JY2xlYXJfYml0KFNNUF9GTEFHX0NGTV9QRU5ESU5HLCAmc21wLT5zbXBfZmxhZ3MpOworCWNsZWFyX2JpdChTTVBfRkxBR19DRk1fUEVORElORywgJnNtcC0+ZmxhZ3MpOwogCiAJc21wX3NlbmRfY21kKHNtcC0+Y29ubiwgU01QX0NNRF9QQUlSSU5HX0NPTkZJUk0sIHNpemVvZihjcCksICZjcCk7CiAKLQlyZXR1cm47Ci0KLWVycm9yOgotCXNtcF9mYWlsdXJlKGNvbm4sIHJlYXNvbik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhbmRvbV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB1OCBzbXBfcmFuZG9tKHN0cnVjdCBzbXBfY2hhbiAqc21wKQogewotCXN0cnVjdCBzbXBfY2hhbiAqc21wID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbXBfY2hhbiwgcmFuZG9tKTsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IHNtcC0+Y29ubjsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24gPSBjb25uLT5oY29uOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gaGNvbi0+aGRldjsKIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtID0gaGRldi0+dGZtX2FlczsKLQl1OCByZWFzb24sIGNvbmZpcm1bMTZdOworCXU4IGNvbmZpcm1bMTZdOwogCWludCByZXQ7CiAKLQlpZiAoSVNfRVJSX09SX05VTEwodGZtKSkgewotCQlyZWFzb24gPSBTTVBfVU5TUEVDSUZJRUQ7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorCWlmIChJU19FUlJfT1JfTlVMTCh0Zm0pKQorCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOwogCiAJQlRfREJHKCJjb25uICVwICVzIiwgY29ubiwgY29ubi0+aGNvbi0+b3V0ID8gIm1hc3RlciIgOiAic2xhdmUiKTsKIApAQCAtNTA0LDE1ICs1MjAsMTIgQEAKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCi0JaWYgKHJldCkgewotCQlyZWFzb24gPSBTTVBfVU5TUEVDSUZJRUQ7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorCWlmIChyZXQpCisJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CiAKIAlpZiAobWVtY21wKHNtcC0+cGNuZiwgY29uZmlybSwgc2l6ZW9mKHNtcC0+cGNuZikpICE9IDApIHsKIAkJQlRfRVJSKCJQYWlyaW5nIGZhaWxlZCAoY29uZmlybWF0aW9uIHZhbHVlcyBtaXNtYXRjaCkiKTsKLQkJcmVhc29uID0gU01QX0NPTkZJUk1fRkFJTEVEOwotCQlnb3RvIGVycm9yOworCQlyZXR1cm4gU01QX0NPTkZJUk1fRkFJTEVEOwogCX0KIAogCWlmIChoY29uLT5vdXQpIHsKQEAgLTUyNSwxMCArNTM4LDggQEAKIAkJbWVtc2V0KHN0ayArIHNtcC0+ZW5jX2tleV9zaXplLCAwLAogCQkgICAgICAgU01QX01BWF9FTkNfS0VZX1NJWkUgLSBzbXAtPmVuY19rZXlfc2l6ZSk7CiAKLQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmaGNvbi0+ZmxhZ3MpKSB7Ci0JCQlyZWFzb24gPSBTTVBfVU5TUEVDSUZJRUQ7Ci0JCQlnb3RvIGVycm9yOwotCQl9CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmhjb24tPmZsYWdzKSkKKwkJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CiAKIAkJaGNpX2xlX3N0YXJ0X2VuYyhoY29uLCBlZGl2LCByYW5kLCBzdGspOwogCQloY29uLT5lbmNfa2V5X3NpemUgPSBzbXAtPmVuY19rZXlfc2l6ZTsKQEAgLTU1MCwxMCArNTYxLDcgQEAKIAkJCSAgICBlZGl2LCByYW5kKTsKIAl9CiAKLQlyZXR1cm47Ci0KLWVycm9yOgotCXNtcF9mYWlsdXJlKGNvbm4sIHJlYXNvbik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc21wX2NoYW4gKnNtcF9jaGFuX2NyZWF0ZShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubikKQEAgLTU2NCw5ICs1NzIsNiBAQAogCWlmICghc21wKQogCQlyZXR1cm4gTlVMTDsKIAotCUlOSVRfV09SSygmc21wLT5jb25maXJtLCBjb25maXJtX3dvcmspOwotCUlOSVRfV09SSygmc21wLT5yYW5kb20sIHJhbmRvbV93b3JrKTsKLQogCXNtcC0+Y29ubiA9IGNvbm47CiAJY29ubi0+c21wX2NoYW4gPSBzbXA7CiAJY29ubi0+aGNvbi0+c21wX2Nvbm4gPSBjb25uOwpAQCAtNTgzLDcgKzU4OCw3IEBACiAKIAlCVUdfT04oIXNtcCk7CiAKLQljb21wbGV0ZSA9IHRlc3RfYml0KFNNUF9GTEFHX0NPTVBMRVRFLCAmc21wLT5zbXBfZmxhZ3MpOworCWNvbXBsZXRlID0gdGVzdF9iaXQoU01QX0ZMQUdfQ09NUExFVEUsICZzbXAtPmZsYWdzKTsKIAltZ210X3NtcF9jb21wbGV0ZShjb25uLT5oY29uLCBjb21wbGV0ZSk7CiAKIAlrZnJlZShzbXAtPmNzcmspOwpAQCAtNjM0LDcgKzYzOSw3IEBACiAJCXB1dF91bmFsaWduZWRfbGUzMih2YWx1ZSwgc21wLT50ayk7CiAJCS8qIEZhbGwgVGhyb3VnaCAqLwogCWNhc2UgTUdNVF9PUF9VU0VSX0NPTkZJUk1fUkVQTFk6Ci0JCXNldF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPnNtcF9mbGFncyk7CisJCXNldF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPmZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBNR01UX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFk6CiAJY2FzZSBNR01UX09QX1VTRVJfQ09ORklSTV9ORUdfUkVQTFk6CkBAIC02NDYsOCArNjUxLDExIEBACiAJfQogCiAJLyogSWYgaXQgaXMgb3VyIHR1cm4gdG8gc2VuZCBQYWlyaW5nIENvbmZpcm0sIGRvIHNvIG5vdyAqLwotCWlmICh0ZXN0X2JpdChTTVBfRkxBR19DRk1fUEVORElORywgJnNtcC0+c21wX2ZsYWdzKSkKLQkJcXVldWVfd29yayhoY29uLT5oZGV2LT53b3JrcXVldWUsICZzbXAtPmNvbmZpcm0pOworCWlmICh0ZXN0X2JpdChTTVBfRkxBR19DRk1fUEVORElORywgJnNtcC0+ZmxhZ3MpKSB7CisJCXU4IHJzcCA9IHNtcF9jb25maXJtKHNtcCk7CisJCWlmIChyc3ApCisJCQlzbXBfZmFpbHVyZShjb25uLCByc3ApOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNjU2LDE0ICs2NjQsMTMgQEAKIHsKIAlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nIHJzcCwgKnJlcSA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcDsKLQl1OCBrZXlfc2l6ZTsKLQl1OCBhdXRoID0gU01QX0FVVEhfTk9ORTsKKwl1OCBrZXlfc2l6ZSwgYXV0aDsKIAlpbnQgcmV0OwogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKnJlcSkpCi0JCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisJCXJldHVybiBTTVBfSU5WQUxJRF9QQVJBTVM7CiAKIAlpZiAoY29ubi0+aGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikKIAkJcmV0dXJuIFNNUF9DTURfTk9UU1VQUDsKQEAgLTY4MSw4ICs2ODgsNyBAQAogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpyZXEpKTsKIAogCS8qIFdlIGRpZG4ndCBzdGFydCB0aGUgcGFpcmluZywgc28gbWF0Y2ggcmVtb3RlICovCi0JaWYgKHJlcS0+YXV0aF9yZXEgJiBTTVBfQVVUSF9CT05ESU5HKQotCQlhdXRoID0gcmVxLT5hdXRoX3JlcTsKKwlhdXRoID0gcmVxLT5hdXRoX3JlcTsKIAogCWNvbm4tPmhjb24tPnBlbmRpbmdfc2VjX2xldmVsID0gYXV0aHJlcV90b19zZWNsZXZlbChhdXRoKTsKIApAQCAtNzA0LDcgKzcxMCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKIAotCWNsZWFyX2JpdChTTVBfRkxBR19JTklUSUFUT1IsICZzbXAtPnNtcF9mbGFncyk7CisJY2xlYXJfYml0KFNNUF9GTEFHX0lOSVRJQVRPUiwgJnNtcC0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MTMsMTQgKzcxOSwxMyBAQAogewogCXN0cnVjdCBzbXBfY21kX3BhaXJpbmcgKnJlcSwgKnJzcCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcCA9IGNvbm4tPnNtcF9jaGFuOwotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGNvbi0+aGRldjsKIAl1OCBrZXlfc2l6ZSwgYXV0aCA9IFNNUF9BVVRIX05PTkU7CiAJaW50IHJldDsKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCpyc3ApKQotCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCQlyZXR1cm4gU01QX0lOVkFMSURfUEFSQU1TOwogCiAJaWYgKCEoY29ubi0+aGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikpCiAJCXJldHVybiBTTVBfQ01EX05PVFNVUFA7CkBAIC03NTMsMTEgKzc1OCwxMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CiAKLQlzZXRfYml0KFNNUF9GTEFHX0NGTV9QRU5ESU5HLCAmc21wLT5zbXBfZmxhZ3MpOworCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPmZsYWdzKTsKIAogCS8qIENhbid0IGNvbXBvc2UgcmVzcG9uc2UgdW50aWwgd2UgaGF2ZSBiZWVuIGNvbmZpcm1lZCAqLwotCWlmICh0ZXN0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+c21wX2ZsYWdzKSkKLQkJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZzbXAtPmNvbmZpcm0pOworCWlmICh0ZXN0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+ZmxhZ3MpKQorCQlyZXR1cm4gc21wX2NvbmZpcm0oc21wKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzY1LDEyICs3NzAsMTEgQEAKIHN0YXRpYyB1OCBzbXBfY21kX3BhaXJpbmdfY29uZmlybShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcCA9IGNvbm4tPnNtcF9jaGFuOwotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGNvbi0+aGRldjsKIAogCUJUX0RCRygiY29ubiAlcCAlcyIsIGNvbm4sIGNvbm4tPmhjb24tPm91dCA/ICJtYXN0ZXIiIDogInNsYXZlIik7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc21wLT5wY25mKSkKLQkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwkJcmV0dXJuIFNNUF9JTlZBTElEX1BBUkFNUzsKIAogCW1lbWNweShzbXAtPnBjbmYsIHNrYi0+ZGF0YSwgc2l6ZW9mKHNtcC0+cGNuZikpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHNtcC0+cGNuZikpOwpAQCAtNzc4LDEwICs3ODIsMTAgQEAKIAlpZiAoY29ubi0+aGNvbi0+b3V0KQogCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX1JBTkRPTSwgc2l6ZW9mKHNtcC0+cHJuZCksCiAJCQkgICAgIHNtcC0+cHJuZCk7Ci0JZWxzZSBpZiAodGVzdF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPnNtcF9mbGFncykpCi0JCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmc21wLT5jb25maXJtKTsKKwllbHNlIGlmICh0ZXN0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+ZmxhZ3MpKQorCQlyZXR1cm4gc21wX2NvbmZpcm0oc21wKTsKIAllbHNlCi0JCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPnNtcF9mbGFncyk7CisJCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzg5LDE5ICs3OTMsMTYgQEAKIHN0YXRpYyB1OCBzbXBfY21kX3BhaXJpbmdfcmFuZG9tKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBzbXBfY2hhbiAqc21wID0gY29ubi0+c21wX2NoYW47Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oY29uLT5oZGV2OwogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc21wLT5ycm5kKSkKLQkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwkJcmV0dXJuIFNNUF9JTlZBTElEX1BBUkFNUzsKIAogCW1lbWNweShzbXAtPnJybmQsIHNrYi0+ZGF0YSwgc2l6ZW9mKHNtcC0+cnJuZCkpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHNtcC0+cnJuZCkpOwogCi0JcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZzbXAtPnJhbmRvbSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gc21wX3JhbmRvbShzbXApOwogfQogCiBzdGF0aWMgdTggc21wX2x0a19lbmNyeXB0KHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBzZWNfbGV2ZWwpCkBAIC04MzYsNyArODM3LDcgQEAKIAlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZigqcnApKQotCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCQlyZXR1cm4gU01QX0lOVkFMSURfUEFSQU1TOwogCiAJaWYgKCEoY29ubi0+aGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikpCiAJCXJldHVybiBTTVBfQ01EX05PVFNVUFA7CkBAIC04NjEsNyArODYyLDcgQEAKIAogCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfUkVRLCBzaXplb2YoY3ApLCAmY3ApOwogCi0JY2xlYXJfYml0KFNNUF9GTEFHX0lOSVRJQVRPUiwgJnNtcC0+c21wX2ZsYWdzKTsKKwljbGVhcl9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLCAmc21wLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkwOCwxMCArOTA5LDExIEBACiAKIAlhdXRocmVxID0gc2VjbGV2ZWxfdG9fYXV0aHJlcShzZWNfbGV2ZWwpOwogCi0JLyogaGNvbi0+YXV0aF90eXBlIGlzIHNldCBieSBwYWlyX2RldmljZSBpbiBtZ210LmMuIElmIHRoZSBNSVRNCi0JICogZmxhZyBpcyBzZXQgd2Ugc2hvdWxkIGFsc28gc2V0IGl0IGZvciB0aGUgU01QIHJlcXVlc3QuCisJLyogUmVxdWlyZSBNSVRNIGlmIElPIENhcGFiaWxpdHkgYWxsb3dzIG9yIHRoZSBzZWN1cml0eSBsZXZlbAorCSAqIHJlcXVpcmVzIGl0LgogCSAqLwotCWlmICgoaGNvbi0+YXV0aF90eXBlICYgMHgwMSkpCisJaWYgKGhjb24tPmlvX2NhcGFiaWxpdHkgIT0gSENJX0lPX05PX0lOUFVUX09VVFBVVCB8fAorCSAgICBzZWNfbGV2ZWwgPiBCVF9TRUNVUklUWV9NRURJVU0pCiAJCWF1dGhyZXEgfD0gU01QX0FVVEhfTUlUTTsKIAogCWlmIChoY29uLT5saW5rX21vZGUgJiBIQ0lfTE1fTUFTVEVSKSB7CkBAIC05MjgsNyArOTMwLDcgQEAKIAkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfU0VDVVJJVFlfUkVRLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KIAotCXNldF9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLCAmc21wLT5zbXBfZmxhZ3MpOworCXNldF9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLCAmc21wLT5mbGFncyk7CiAKIGRvbmU6CiAJaGNvbi0+cGVuZGluZ19zZWNfbGV2ZWwgPSBzZWNfbGV2ZWw7CkBAIC05NDQsNyArOTQ2LDcgQEAKIAlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZigqcnApKQotCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCQlyZXR1cm4gU01QX0lOVkFMSURfUEFSQU1TOwogCiAJLyogSWdub3JlIHRoaXMgUERVIGlmIGl0IHdhc24ndCByZXF1ZXN0ZWQgKi8KIAlpZiAoIShzbXAtPnJlbW90ZV9rZXlfZGlzdCAmIFNNUF9ESVNUX0VOQ19LRVkpKQpAQCAtOTY5LDcgKzk3MSw3IEBACiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKnJwKSkKLQkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwkJcmV0dXJuIFNNUF9JTlZBTElEX1BBUkFNUzsKIAogCS8qIElnbm9yZSB0aGlzIFBEVSBpZiBpdCB3YXNuJ3QgcmVxdWVzdGVkICovCiAJaWYgKCEoc21wLT5yZW1vdGVfa2V5X2Rpc3QgJiBTTVBfRElTVF9FTkNfS0VZKSkKQEAgLTEwMDEsNyArMTAwMyw3IEBACiAJQlRfREJHKCIiKTsKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZigqaW5mbykpCi0JCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisJCXJldHVybiBTTVBfSU5WQUxJRF9QQVJBTVM7CiAKIAkvKiBJZ25vcmUgdGhpcyBQRFUgaWYgaXQgd2Fzbid0IHJlcXVlc3RlZCAqLwogCWlmICghKHNtcC0+cmVtb3RlX2tleV9kaXN0ICYgU01QX0RJU1RfSURfS0VZKSkKQEAgLTEwMjUsNyArMTAyNyw3IEBACiAJQlRfREJHKCIiKTsKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZigqaW5mbykpCi0JCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisJCXJldHVybiBTTVBfSU5WQUxJRF9QQVJBTVM7CiAKIAkvKiBJZ25vcmUgdGhpcyBQRFUgaWYgaXQgd2Fzbid0IHJlcXVlc3RlZCAqLwogCWlmICghKHNtcC0+cmVtb3RlX2tleV9kaXN0ICYgU01QX0RJU1RfSURfS0VZKSkKQEAgLTEwNzUsNyArMTA3Nyw3IEBACiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKnJwKSkKLQkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwkJcmV0dXJuIFNNUF9JTlZBTElEX1BBUkFNUzsKIAogCS8qIElnbm9yZSB0aGlzIFBEVSBpZiBpdCB3YXNuJ3QgcmVxdWVzdGVkICovCiAJaWYgKCEoc21wLT5yZW1vdGVfa2V5X2Rpc3QgJiBTTVBfRElTVF9TSUdOKSkKQEAgLTEzNTgsNyArMTM2MCw3IEBACiAKIAljbGVhcl9iaXQoSENJX0NPTk5fTEVfU01QX1BFTkQsICZoY29uLT5mbGFncyk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb25uLT5zZWN1cml0eV90aW1lcik7Ci0Jc2V0X2JpdChTTVBfRkxBR19DT01QTEVURSwgJnNtcC0+c21wX2ZsYWdzKTsKKwlzZXRfYml0KFNNUF9GTEFHX0NPTVBMRVRFLCAmc21wLT5mbGFncyk7CiAJc21wX25vdGlmeV9rZXlzKGNvbm4pOwogCiAJc21wX2NoYW5fZGVzdHJveShjb25uKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmggYi9uZXQvYmx1ZXRvb3RoL3NtcC5oCmluZGV4IDEyNzcxNDcuLjVhOGRjMzYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmgKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuaApAQCAtMTExLDM5ICsxMTEsMTEgQEAKICNkZWZpbmUgU01QX0NNRF9OT1RTVVBQCQkJMHgwNwogI2RlZmluZSBTTVBfVU5TUEVDSUZJRUQJCQkweDA4CiAjZGVmaW5lIFNNUF9SRVBFQVRFRF9BVFRFTVBUUwkJMHgwOQorI2RlZmluZSBTTVBfSU5WQUxJRF9QQVJBTVMJCTB4MGEKIAogI2RlZmluZSBTTVBfTUlOX0VOQ19LRVlfU0laRQkJNwogI2RlZmluZSBTTVBfTUFYX0VOQ19LRVlfU0laRQkJMTYKIAotI2RlZmluZSBTTVBfRkxBR19US19WQUxJRAkxCi0jZGVmaW5lIFNNUF9GTEFHX0NGTV9QRU5ESU5HCTIKLSNkZWZpbmUgU01QX0ZMQUdfTUlUTV9BVVRICTMKLSNkZWZpbmUgU01QX0ZMQUdfQ09NUExFVEUJNAotI2RlZmluZSBTTVBfRkxBR19JTklUSUFUT1IJNQotCi1zdHJ1Y3Qgc21wX2NoYW4gewotCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOwotCXU4CQlwcmVxWzddOyAvKiBTTVAgUGFpcmluZyBSZXF1ZXN0ICovCi0JdTgJCXByc3BbN107IC8qIFNNUCBQYWlyaW5nIFJlc3BvbnNlICovCi0JdTgJCXBybmRbMTZdOyAvKiBTTVAgUGFpcmluZyBSYW5kb20gKGxvY2FsKSAqLwotCXU4CQlycm5kWzE2XTsgLyogU01QIFBhaXJpbmcgUmFuZG9tIChyZW1vdGUpICovCi0JdTgJCXBjbmZbMTZdOyAvKiBTTVAgUGFpcmluZyBDb25maXJtICovCi0JdTgJCXRrWzE2XTsgLyogU01QIFRlbXBvcmFyeSBLZXkgKi8KLQl1OAkJZW5jX2tleV9zaXplOwotCXU4CQlyZW1vdGVfa2V5X2Rpc3Q7Ci0JYmRhZGRyX3QJaWRfYWRkcjsKLQl1OAkJaWRfYWRkcl90eXBlOwotCXU4CQlpcmtbMTZdOwotCXN0cnVjdCBzbXBfY3NyawkqY3NyazsKLQlzdHJ1Y3Qgc21wX2NzcmsJKnNsYXZlX2Nzcms7Ci0Jc3RydWN0IHNtcF9sdGsJKmx0azsKLQlzdHJ1Y3Qgc21wX2x0awkqc2xhdmVfbHRrOwotCXN0cnVjdCBzbXBfaXJrCSpyZW1vdGVfaXJrOwotCXVuc2lnbmVkIGxvbmcJc21wX2ZsYWdzOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjb25maXJtOwotCXN0cnVjdCB3b3JrX3N0cnVjdCByYW5kb207Ci19OwotCiAvKiBTTVAgQ29tbWFuZHMgKi8KIGJvb2wgc21wX3N1ZmZpY2llbnRfc2VjdXJpdHkoc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzZWNfbGV2ZWwpOwogaW50IHNtcF9jb25uX3NlY3VyaXR5KHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzZWNfbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9NYWtlZmlsZSBiL25ldC9icmlkZ2UvTWFrZWZpbGUKaW5kZXggZTg1NDk4YjJmLi44NTkwYjk0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL01ha2VmaWxlCisrKyBiL25ldC9icmlkZ2UvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiBvYmotJChDT05GSUdfQlJJREdFKSArPSBicmlkZ2UubwogCiBicmlkZ2UteQk6PSBici5vIGJyX2RldmljZS5vIGJyX2ZkYi5vIGJyX2ZvcndhcmQubyBicl9pZi5vIGJyX2lucHV0Lm8gXAotCQkJYnJfaW9jdGwubyBicl9ub3RpZnkubyBicl9zdHAubyBicl9zdHBfYnBkdS5vIFwKKwkJCWJyX2lvY3RsLm8gYnJfc3RwLm8gYnJfc3RwX2JwZHUubyBcCiAJCQlicl9zdHBfaWYubyBicl9zdHBfdGltZXIubyBicl9uZXRsaW5rLm8KIAogYnJpZGdlLSQoQ09ORklHX1NZU0ZTKSArPSBicl9zeXNmc19pZi5vIGJyX3N5c2ZzX2JyLm8KQEAgLTE2LDQgKzE2LDQgQEAKIAogYnJpZGdlLSQoQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORykgKz0gYnJfdmxhbi5vCiAKLW9iai0kKENPTkZJR19CUklER0VfTkZfRUJUQUJMRVMpICs9IG5ldGZpbHRlci8KK29iai0kKENPTkZJR19ORVRGSUxURVIpICs9IG5ldGZpbHRlci8KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnIuYyBiL25ldC9icmlkZ2UvYnIuYwppbmRleCAxOTMxMWFhZi4uMWE3NTVhMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9ici5jCisrKyBiL25ldC9icmlkZ2UvYnIuYwpAQCAtMjIsNiArMjIsMTA0IEBACiAKICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKKy8qCisgKiBIYW5kbGUgY2hhbmdlcyBpbiBzdGF0ZSBvZiBuZXR3b3JrIGRldmljZXMgZW5zbGF2ZWQgdG8gYSBicmlkZ2UuCisgKgorICogTm90ZTogZG9uJ3QgY2FyZSBhYm91dCB1cC9kb3duIGlmIGJyaWRnZSBpdHNlbGYgaXMgZG93biwgYmVjYXVzZQorICogICAgIHBvcnQgc3RhdGUgaXMgY2hlY2tlZCB3aGVuIGJyaWRnZSBpcyBicm91Z2h0IHVwLgorICovCitzdGF0aWMgaW50IGJyX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKwlib29sIGNoYW5nZWRfYWRkcjsKKwlpbnQgZXJyOworCisJLyogcmVnaXN0ZXIgb2YgYnJpZGdlIGNvbXBsZXRlZCwgYWRkIHN5c2ZzIGVudHJpZXMgKi8KKwlpZiAoKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSAmJiBldmVudCA9PSBORVRERVZfUkVHSVNURVIpIHsKKwkJYnJfc3lzZnNfYWRkYnIoZGV2KTsKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCS8qIG5vdCBhIHBvcnQgb2YgYSBicmlkZ2UgKi8KKwlwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOworCWlmICghcCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJYnIgPSBwLT5icjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9DSEFOR0VNVFU6CisJCWRldl9zZXRfbXR1KGJyLT5kZXYsIGJyX21pbl9tdHUoYnIpKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9DSEFOR0VBRERSOgorCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwkJYnJfZmRiX2NoYW5nZWFkZHIocCwgZGV2LT5kZXZfYWRkcik7CisJCWNoYW5nZWRfYWRkciA9IGJyX3N0cF9yZWNhbGN1bGF0ZV9icmlkZ2VfaWQoYnIpOworCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCisJCWlmIChjaGFuZ2VkX2FkZHIpCisJCQljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0NIQU5HRUFERFIsIGJyLT5kZXYpOworCisJCWJyZWFrOworCisJY2FzZSBORVRERVZfQ0hBTkdFOgorCQlicl9wb3J0X2NhcnJpZXJfY2hlY2socCk7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfRkVBVF9DSEFOR0U6CisJCW5ldGRldl91cGRhdGVfZmVhdHVyZXMoYnItPmRldik7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfRE9XTjoKKwkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCWlmIChici0+ZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCWJyX3N0cF9kaXNhYmxlX3BvcnQocCk7CisJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfVVA6CisJCWlmIChuZXRpZl9ydW5uaW5nKGJyLT5kZXYpICYmIG5ldGlmX29wZXJfdXAoZGV2KSkgeworCQkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCQlicl9zdHBfZW5hYmxlX3BvcnQocCk7CisJCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJYnJfZGVsX2lmKGJyLCBkZXYpOworCQlicmVhazsKKworCWNhc2UgTkVUREVWX0NIQU5HRU5BTUU6CisJCWVyciA9IGJyX3N5c2ZzX3JlbmFtZWlmKHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oZXJyKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9QUkVfVFlQRV9DSEFOR0U6CisJCS8qIEZvcmJpZCB1bmRlcmxheWluZyBkZXZpY2UgdG8gY2hhbmdlIGl0cyB0eXBlLiAqLworCQlyZXR1cm4gTk9USUZZX0JBRDsKKworCWNhc2UgTkVUREVWX1JFU0VORF9JR01QOgorCQkvKiBQcm9wYWdhdGUgdG8gbWFzdGVyIGRldmljZSAqLworCQljYWxsX25ldGRldmljZV9ub3RpZmllcnMoZXZlbnQsIGJyLT5kZXYpOworCQlicmVhazsKKwl9CisKKwkvKiBFdmVudHMgdGhhdCBtYXkgY2F1c2Ugc3Bhbm5pbmcgdHJlZSB0byByZWZyZXNoICovCisJaWYgKGV2ZW50ID09IE5FVERFVl9DSEFOR0VBRERSIHx8IGV2ZW50ID09IE5FVERFVl9VUCB8fAorCSAgICBldmVudCA9PSBORVRERVZfQ0hBTkdFIHx8IGV2ZW50ID09IE5FVERFVl9ET1dOKQorCQlicl9pZmluZm9fbm90aWZ5KFJUTV9ORVdMSU5LLCBwKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBicl9kZXZpY2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBicl9kZXZpY2VfZXZlbnQKK307CisKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgYnJfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCAzZTJkYTJjLi41NjhjY2NkIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTExMiw2ICsxMTIsMTIgQEAKIHsKIH0KIAorc3RhdGljIHZvaWQgYnJfZGV2X2NoYW5nZV9yeF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbmdlKQoreworCWlmIChjaGFuZ2UgJiBJRkZfUFJPTUlTQykKKwkJYnJfbWFuYWdlX3Byb21pc2MobmV0ZGV2X3ByaXYoZGV2KSk7Cit9CisKIHN0YXRpYyBpbnQgYnJfZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMzA5LDYgKzMxNSw3IEBACiAJLm5kb19nZXRfc3RhdHM2NAkgPSBicl9nZXRfc3RhdHM2NCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwkgPSBicl9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zZXRfcnhfbW9kZQkgPSBicl9kZXZfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCSA9IGJyX2Rldl9jaGFuZ2VfcnhfZmxhZ3MsCiAJLm5kb19jaGFuZ2VfbXR1CQkgPSBicl9jaGFuZ2VfbXR1LAogCS5uZG9fZG9faW9jdGwJCSA9IGJyX2Rldl9pb2N0bCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpAQCAtMzQ4LDE0ICszNTUsMTUgQEAKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZicl9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvciA9IGJyX2Rldl9mcmVlOwotCVNFVF9FVEhUT09MX09QUyhkZXYsICZicl9ldGh0b29sX29wcyk7CisJZGV2LT5ldGh0b29sX29wcyA9ICZicl9ldGh0b29sX29wczsKIAlTRVRfTkVUREVWX0RFVlRZUEUoZGV2LCAmYnJfdHlwZSk7CiAJZGV2LT50eF9xdWV1ZV9sZW4gPSAwOwogCWRldi0+cHJpdl9mbGFncyA9IElGRl9FQlJJREdFOwogCiAJZGV2LT5mZWF0dXJlcyA9IENPTU1PTl9GRUFUVVJFUyB8IE5FVElGX0ZfTExUWCB8IE5FVElGX0ZfTkVUTlNfTE9DQUwgfAotCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7Ci0JZGV2LT5od19mZWF0dXJlcyA9IENPTU1PTl9GRUFUVVJFUyB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYOworCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWDsKKwlkZXYtPmh3X2ZlYXR1cmVzID0gQ09NTU9OX0ZFQVRVUkVTIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFg7CiAJZGV2LT52bGFuX2ZlYXR1cmVzID0gQ09NTU9OX0ZFQVRVUkVTOwogCiAJYnItPmRldiA9IGRldjsKQEAgLTM3MCw2ICszNzgsNyBAQAogCiAJYnItPnN0cF9lbmFibGVkID0gQlJfTk9fU1RQOwogCWJyLT5ncm91cF9md2RfbWFzayA9IEJSX0dST1VQRldEX0RFRkFVTFQ7CisJYnItPmdyb3VwX2Z3ZF9tYXNrX3JlcXVpcmVkID0gQlJfR1JPVVBGV0RfREVGQVVMVDsKIAogCWJyLT5kZXNpZ25hdGVkX3Jvb3QgPSBici0+YnJpZGdlX2lkOwogCWJyLT5icmlkZ2VfbWF4X2FnZSA9IGJyLT5tYXhfYWdlID0gMjAgKiBIWjsKQEAgLTM4MCw0ICszODksNSBAQAogCWJyX25ldGZpbHRlcl9ydGFibGVfaW5pdChicik7CiAJYnJfc3RwX3RpbWVyX2luaXQoYnIpOwogCWJyX211bHRpY2FzdF9pbml0KGJyKTsKKwlicl92bGFuX2luaXQoYnIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKaW5kZXggNDc0ZDM2Zi4uYjUyNGMzNiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mZGIuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCkBAIC04NSw4ICs4NSw1OCBAQAogCWttZW1fY2FjaGVfZnJlZShicl9mZGJfY2FjaGUsIGVudCk7CiB9CiAKKy8qIFdoZW4gYSBzdGF0aWMgRkRCIGVudHJ5IGlzIGFkZGVkLCB0aGUgbWFjIGFkZHJlc3MgZnJvbSB0aGUgZW50cnkgaXMKKyAqIGFkZGVkIHRvIHRoZSBicmlkZ2UgcHJpdmF0ZSBIVyBhZGRyZXNzIGxpc3QgYW5kIGFsbCByZXF1aXJlZCBwb3J0cworICogYXJlIHRoZW4gdXBkYXRlZCB3aXRoIHRoZSBuZXcgaW5mb3JtYXRpb24uCisgKiBDYWxsZWQgdW5kZXIgUlROTC4KKyAqLworc3RhdGljIHZvaWQgZmRiX2FkZF9odyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAqdG1wOworCisJQVNTRVJUX1JUTkwoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFicl9wcm9taXNjX3BvcnQocCkpIHsKKwkJCWVyciA9IGRldl91Y19hZGQocC0+ZGV2LCBhZGRyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byB1bmRvOworCQl9CisJfQorCisJcmV0dXJuOwordW5kbzoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRtcCA9PSBwKQorCQkJYnJlYWs7CisJCWlmICghYnJfcHJvbWlzY19wb3J0KHRtcCkpCisJCQlkZXZfdWNfZGVsKHRtcC0+ZGV2LCBhZGRyKTsKKwl9Cit9CisKKy8qIFdoZW4gYSBzdGF0aWMgRkRCIGVudHJ5IGlzIGRlbGV0ZWQsIHRoZSBIVyBhZGRyZXNzIGZyb20gdGhhdCBlbnRyeSBpcworICogYWxzbyByZW1vdmVkIGZyb20gdGhlIGJyaWRnZSBwcml2YXRlIEhXIGFkZHJlc3MgbGlzdCBhbmQgdXBkYXRlcyBhbGwKKyAqIHRoZSBwb3J0cyB3aXRoIG5lZWRlZCBpbmZvcm1hdGlvbi4KKyAqIENhbGxlZCB1bmRlciBSVE5MLgorICovCitzdGF0aWMgdm9pZCBmZGJfZGVsX2h3KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCisJQVNTRVJUX1JUTkwoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFicl9wcm9taXNjX3BvcnQocCkpCisJCQlkZXZfdWNfZGVsKHAtPmRldiwgYWRkcik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmKQogeworCWlmIChmLT5pc19zdGF0aWMpCisJCWZkYl9kZWxfaHcoYnIsIGYtPmFkZHIuYWRkcik7CisKIAlobGlzdF9kZWxfcmN1KCZmLT5obGlzdCk7CiAJZmRiX25vdGlmeShiciwgZiwgUlRNX0RFTE5FSUdIKTsKIAljYWxsX3JjdSgmZi0+cmN1LCBmZGJfcmN1X2ZyZWUpOwpAQCAtNDY2LDYgKzUxNiw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmRiLT5pc19sb2NhbCA9IGZkYi0+aXNfc3RhdGljID0gMTsKKwlmZGJfYWRkX2h3KGJyLCBhZGRyKTsKIAlmZGJfbm90aWZ5KGJyLCBmZGIsIFJUTV9ORVdORUlHSCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01NzEsNiArNjIyLDggQEAKIAogCWlmIChubGFfcHV0KHNrYiwgTkRBX0xMQUREUiwgRVRIX0FMRU4sICZmZGItPmFkZHIpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBOREFfTUFTVEVSLCBici0+ZGV2LT5pZmluZGV4KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJY2kubmRtX3VzZWQJID0gamlmZmllc190b19jbG9ja190KG5vdyAtIGZkYi0+dXNlZCk7CiAJY2kubmRtX2NvbmZpcm1lZCA9IDA7CiAJY2kubmRtX3VwZGF0ZWQJID0gamlmZmllc190b19jbG9ja190KG5vdyAtIGZkYi0+dXBkYXRlZCk7CkBAIC01OTIsNiArNjQ1LDcgQEAKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZG1zZykpCiAJCSsgbmxhX3RvdGFsX3NpemUoRVRIX0FMRU4pIC8qIE5EQV9MTEFERFIgKi8KKwkJKyBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkgLyogTkRBX01BU1RFUiAqLwogCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZih1MTYpKSAvKiBOREFfVkxBTiAqLwogCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgbmRhX2NhY2hlaW5mbykpOwogfQpAQCAtNjg0LDEzICs3MzgsMjUgQEAKIAl9CiAKIAlpZiAoZmRiX3RvX251ZChmZGIpICE9IHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSAmIE5VRF9QRVJNQU5FTlQpCi0JCQlmZGItPmlzX2xvY2FsID0gZmRiLT5pc19zdGF0aWMgPSAxOwotCQllbHNlIGlmIChzdGF0ZSAmIE5VRF9OT0FSUCkgeworCQlpZiAoc3RhdGUgJiBOVURfUEVSTUFORU5UKSB7CisJCQlmZGItPmlzX2xvY2FsID0gMTsKKwkJCWlmICghZmRiLT5pc19zdGF0aWMpIHsKKwkJCQlmZGItPmlzX3N0YXRpYyA9IDE7CisJCQkJZmRiX2FkZF9odyhiciwgYWRkcik7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RhdGUgJiBOVURfTk9BUlApIHsKIAkJCWZkYi0+aXNfbG9jYWwgPSAwOwotCQkJZmRiLT5pc19zdGF0aWMgPSAxOwotCQl9IGVsc2UKLQkJCWZkYi0+aXNfbG9jYWwgPSBmZGItPmlzX3N0YXRpYyA9IDA7CisJCQlpZiAoIWZkYi0+aXNfc3RhdGljKSB7CisJCQkJZmRiLT5pc19zdGF0aWMgPSAxOworCQkJCWZkYl9hZGRfaHcoYnIsIGFkZHIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmRiLT5pc19sb2NhbCA9IDA7CisJCQlpZiAoZmRiLT5pc19zdGF0aWMpIHsKKwkJCQlmZGItPmlzX3N0YXRpYyA9IDA7CisJCQkJZmRiX2RlbF9odyhiciwgYWRkcik7CisJCQl9CisJCX0KIAogCQltb2RpZmllZCA9IHRydWU7CiAJfQpAQCAtODgwLDMgKzk0Niw1OSBAQAogb3V0OgogCXJldHVybiBlcnI7CiB9CisKK2ludCBicl9mZGJfc3luY19zdGF0aWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiLCAqdG1wOworCWludCBpOworCWludCBlcnI7CisKKwlBU1NFUlRfUlROTCgpOworCisJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZkYiwgJmJyLT5oYXNoW2ldLCBobGlzdCkgeworCQkJLyogV2Ugb25seSBjYXJlIGZvciBzdGF0aWMgZW50cmllcyAqLworCQkJaWYgKCFmZGItPmlzX3N0YXRpYykKKwkJCQljb250aW51ZTsKKworCQkJZXJyID0gZGV2X3VjX2FkZChwLT5kZXYsIGZkYi0+YWRkci5hZGRyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byByb2xsYmFjazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworcm9sbGJhY2s6CisJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJyLT5oYXNoW2ldLCBobGlzdCkgeworCQkJLyogSWYgd2UgcmVhY2hlZCB0aGUgZmRiIHRoYXQgZmFpbGVkLCB3ZSBjYW4gc3RvcCAqLworCQkJaWYgKHRtcCA9PSBmZGIpCisJCQkJYnJlYWs7CisKKwkJCS8qIFdlIG9ubHkgY2FyZSBmb3Igc3RhdGljIGVudHJpZXMgKi8KKwkJCWlmICghdG1wLT5pc19zdGF0aWMpCisJCQkJY29udGludWU7CisKKwkJCWRldl91Y19kZWwocC0+ZGV2LCB0bXAtPmFkZHIuYWRkcik7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBicl9mZGJfdW5zeW5jX3N0YXRpYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CisJaW50IGk7CisKKwlBU1NFUlRfUlROTCgpOworCisJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmZGIsICZici0+aGFzaFtpXSwgaGxpc3QpIHsKKwkJCS8qIFdlIG9ubHkgY2FyZSBmb3Igc3RhdGljIGVudHJpZXMgKi8KKwkJCWlmICghZmRiLT5pc19zdGF0aWMpCisJCQkJY29udGludWU7CisKKwkJCWRldl91Y19kZWwocC0+ZGV2LCBmZGItPmFkZHIuYWRkcik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggNTI2MmI4Ni4uM2VjYTNmZCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtODUsNiArODUsMTExIEBACiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgYnJfcG9ydF9zZXRfcHJvbWlzYyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCWludCBlcnIgPSAwOworCisJaWYgKGJyX3Byb21pc2NfcG9ydChwKSkKKwkJcmV0dXJuOworCisJZXJyID0gZGV2X3NldF9wcm9taXNjdWl0eShwLT5kZXYsIDEpOworCWlmIChlcnIpCisJCXJldHVybjsKKworCWJyX2ZkYl91bnN5bmNfc3RhdGljKHAtPmJyLCBwKTsKKwlwLT5mbGFncyB8PSBCUl9QUk9NSVNDOworfQorCitzdGF0aWMgdm9pZCBicl9wb3J0X2NsZWFyX3Byb21pc2Moc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlpbnQgZXJyOworCisJLyogQ2hlY2sgaWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBub24tcHJvbWlzYyBvciBpZiBpdCBkb2Vzbid0CisJICogc3VwcG9ydCBVTklDQVNUIGZpbHRlcmluZy4gIFdpdGhvdXQgdW5pY2FzdCBmaWx0ZXJpbmcgc3VwcG9ydAorCSAqIHdlJ2xsIGVuZCB1cCByZS1lbmFibGluZyBwcm9taXNjIG1vZGUgYW55d2F5LCBzbyBqdXN0IGNoZWNrIGZvcgorCSAqIGl0IGhlcmUuCisJICovCisJaWYgKCFicl9wcm9taXNjX3BvcnQocCkgfHwgIShwLT5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfVU5JQ0FTVF9GTFQpKQorCQlyZXR1cm47CisKKwkvKiBTaW5jZSB3ZSdsbCBiZSBjbGVhcmluZyB0aGUgcHJvbWlzYyBtb2RlLCBwcm9ncmFtIHRoZSBwb3J0CisJICogZmlyc3Qgc28gdGhhdCB3ZSBkb24ndCBoYXZlIGludGVycnVwdGlvbiBpbiB0cmFmZmljLgorCSAqLworCWVyciA9IGJyX2ZkYl9zeW5jX3N0YXRpYyhwLT5iciwgcCk7CisJaWYgKGVycikKKwkJcmV0dXJuOworCisJZGV2X3NldF9wcm9taXNjdWl0eShwLT5kZXYsIC0xKTsKKwlwLT5mbGFncyAmPSB+QlJfUFJPTUlTQzsKK30KKworLyogV2hlbiBhIHBvcnQgaXMgYWRkZWQgb3IgcmVtb3ZlZCBvciB3aGVuIGNlcnRhaW4gcG9ydCBmbGFncworICogY2hhbmdlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhdXRvbWF0aWNhbGx5IG1hbmFnZQorICogcHJvbWlzY3VpdHkgc2V0dGluZyBvZiBhbGwgdGhlIGJyaWRnZSBwb3J0cy4gIFdlIGFyZSBhbHdheXMgY2FsbGVkCisgKiB1bmRlciBSVE5MIHNvIGNhbiBza2lwIHVzaW5nIHJjdSBwcmltaXRpdmVzLgorICovCit2b2lkIGJyX21hbmFnZV9wcm9taXNjKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCWJvb2wgc2V0X2FsbCA9IGZhbHNlOworCisJLyogSWYgdmxhbiBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQgb3IgYnJpZGdlIGludGVyZmFjZSBpcyBwbGFjZWQKKwkgKiBpbnRvIHByb21pc2N1b3VzIG1vZGUsIHBsYWNlIGFsbCBwb3J0cyBpbiBwcm9taXNjdW91cyBtb2RlLgorCSAqLworCWlmICgoYnItPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwgIWJyX3ZsYW5fZW5hYmxlZChicikpCisJCXNldF9hbGwgPSB0cnVlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoc2V0X2FsbCkgeworCQkJYnJfcG9ydF9zZXRfcHJvbWlzYyhwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHRoZSBudW1iZXIgb2YgYXV0by1wb3J0cyBpcyA8PSAxLCB0aGVuIGFsbCBvdGhlcgorCQkJICogcG9ydHMgd2lsbCBoYXZlIHRoZWlyIG91dHB1dCBjb25maWd1cmF0aW9uCisJCQkgKiBzdGF0aWNhbGx5IHNwZWNpZmllZCB0aHJvdWdoIGZkYnMuICBTaW5jZSBpbmdyZXNzCisJCQkgKiBvbiB0aGUgYXV0by1wb3J0IGJlY29tZXMgZm9yd2FyZGluZy9lZ3Jlc3MgdG8gb3RoZXIKKwkJCSAqIHBvcnRzIGFuZCBlZ3Jlc3MgY29uZmlndXJhdGlvbiBpcyBzdGF0aWNhbGx5IGtub3duLAorCQkJICogd2UgY2FuIHNheSB0aGF0IGluZ3Jlc3MgY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJCSAqIGF1dG8tcG9ydCBpcyBhbHNvIHN0YXRpY2FsbHkga25vd24uCisJCQkgKiBUaGlzIGxldHMgdXMgZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCB3cml0ZQorCQkJICogdGhpcyBjb25maWcgdG8gaHcuCisJCQkgKi8KKwkJCWlmIChici0+YXV0b19jbnQgPT0gMCB8fAorCQkJICAgIChici0+YXV0b19jbnQgPT0gMSAmJiBicl9hdXRvX3BvcnQocCkpKQorCQkJCWJyX3BvcnRfY2xlYXJfcHJvbWlzYyhwKTsKKwkJCWVsc2UKKwkJCQlicl9wb3J0X3NldF9wcm9taXNjKHApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBuYnBfdXBkYXRlX3BvcnRfY291bnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJdTMyIGNudCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CisJCWlmIChicl9hdXRvX3BvcnQocCkpCisJCQljbnQrKzsKKwl9CisJaWYgKGJyLT5hdXRvX2NudCAhPSBjbnQpIHsKKwkJYnItPmF1dG9fY250ID0gY250OworCQlicl9tYW5hZ2VfcHJvbWlzYyhicik7CisJfQorfQorCitzdGF0aWMgdm9pZCBuYnBfZGVsZXRlX3Byb21pc2Moc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwkvKiBJZiBwb3J0IGlzIGN1cnJlbnRseSBwcm9taXNjdW91cywgdW5zZXQgcHJvbWlzY3VpdHkuCisJICogT3RoZXJ3aXNlLCBpdCBpcyBhIHN0YXRpYyBwb3J0IHNvIHJlbW92ZSBhbGwgYWRkcmVzc2VzCisJICogZnJvbSBpdC4KKwkgKi8KKwlkZXZfc2V0X2FsbG11bHRpKHAtPmRldiwgLTEpOworCWlmIChicl9wcm9taXNjX3BvcnQocCkpCisJCWRldl9zZXRfcHJvbWlzY3VpdHkocC0+ZGV2LCAtMSk7CisJZWxzZQorCQlicl9mZGJfdW5zeW5jX3N0YXRpYyhwLT5iciwgcCk7Cit9CisKIHN0YXRpYyB2b2lkIHJlbGVhc2VfbmJwKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAKQEAgLTEzMyw3ICsyMzgsNyBAQAogCiAJc3lzZnNfcmVtb3ZlX2xpbmsoYnItPmlmb2JqLCBwLT5kZXYtPm5hbWUpOwogCi0JZGV2X3NldF9wcm9taXNjdWl0eShkZXYsIC0xKTsKKwluYnBfZGVsZXRlX3Byb21pc2MocCk7CiAKIAlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKIAlicl9zdHBfZGlzYWJsZV9wb3J0KHApOwpAQCAtMTQxLDEwICsyNDYsMTEgQEAKIAogCWJyX2lmaW5mb19ub3RpZnkoUlRNX0RFTExJTkssIHApOwogCisJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKKwogCW5icF92bGFuX2ZsdXNoKHApOwogCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCwgMSk7Ci0KLQlsaXN0X2RlbF9yY3UoJnAtPmxpc3QpOworCW5icF91cGRhdGVfcG9ydF9jb3VudChicik7CiAKIAlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9CUklER0VfUE9SVDsKIApAQCAtMzUzLDcgKzQ1OSw3IEBACiAKIAljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0pPSU4sIGRldik7CiAKLQllcnIgPSBkZXZfc2V0X3Byb21pc2N1aXR5KGRldiwgMSk7CisJZXJyID0gZGV2X3NldF9hbGxtdWx0aShkZXYsIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gcHV0X2JhY2s7CiAKQEAgLTM4NCw2ICs0OTAsOCBAQAogCiAJbGlzdF9hZGRfcmN1KCZwLT5saXN0LCAmYnItPnBvcnRfbGlzdCk7CiAKKwluYnBfdXBkYXRlX3BvcnRfY291bnQoYnIpOworCiAJbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhici0+ZGV2KTsKIAogCWlmIChici0+ZGV2LT5uZWVkZWRfaGVhZHJvb20gPCBkZXYtPm5lZWRlZF9oZWFkcm9vbSkKQEAgLTQyMSw3ICs1MjksNyBAQAogCWtvYmplY3RfcHV0KCZwLT5rb2JqKTsKIAlwID0gTlVMTDsgLyoga29iamVjdF9wdXQgZnJlZXMgKi8KIGVycjE6Ci0JZGV2X3NldF9wcm9taXNjdWl0eShkZXYsIC0xKTsKKwlkZXZfc2V0X2FsbG11bHRpKGRldiwgLTEpOwogcHV0X2JhY2s6CiAJZGV2X3B1dChkZXYpOwogCWtmcmVlKHApOwpAQCAtNDU1LDMgKzU2MywxMSBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgYnJfcG9ydF9mbGFnc19jaGFuZ2Uoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHAtPmJyOworCisJaWYgKG1hc2sgJiBCUl9BVVRPX01BU0spCisJCW5icF91cGRhdGVfcG9ydF9jb3VudChicik7Cit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggMDRkNjM0OC4uMzY2YzQzNiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtMTc3LDYgKzE3Nyw4IEBACiAJcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAKIAlpZiAodW5saWtlbHkoaXNfbGlua19sb2NhbF9ldGhlcl9hZGRyKGRlc3QpKSkgeworCQl1MTYgZndkX21hc2sgPSBwLT5ici0+Z3JvdXBfZndkX21hc2tfcmVxdWlyZWQ7CisKIAkJLyoKIAkJICogU2VlIElFRUUgODAyLjFEIFRhYmxlIDctMTAgUmVzZXJ2ZWQgYWRkcmVzc2VzCiAJCSAqCkBAIC0xOTQsNyArMTk2LDggQEAKIAkJY2FzZSAweDAwOgkvKiBCcmlkZ2UgR3JvdXAgQWRkcmVzcyAqLwogCQkJLyogSWYgU1RQIGlzIHR1cm5lZCBvZmYsCiAJCQkgICB0aGVuIG11c3QgZm9yd2FyZCB0byBrZWVwIGxvb3AgZGV0ZWN0aW9uICovCi0JCQlpZiAocC0+YnItPnN0cF9lbmFibGVkID09IEJSX05PX1NUUCkKKwkJCWlmIChwLT5ici0+c3RwX2VuYWJsZWQgPT0gQlJfTk9fU1RQIHx8CisJCQkgICAgZndkX21hc2sgJiAoMXUgPDwgZGVzdFs1XSkpCiAJCQkJZ290byBmb3J3YXJkOwogCQkJYnJlYWs7CiAKQEAgLTIwMyw3ICsyMDYsOCBAQAogCiAJCWRlZmF1bHQ6CiAJCQkvKiBBbGxvdyBzZWxlY3RpdmUgZm9yd2FyZGluZyBmb3IgbW9zdCBvdGhlciBwcm90b2NvbHMgKi8KLQkJCWlmIChwLT5ici0+Z3JvdXBfZndkX21hc2sgJiAoMXUgPDwgZGVzdFs1XSkpCisJCQlmd2RfbWFzayB8PSBwLT5ici0+Z3JvdXBfZndkX21hc2s7CisJCQlpZiAoZndkX21hc2sgJiAoMXUgPDwgZGVzdFs1XSkpCiAJCQkJZ290byBmb3J3YXJkOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbWRiLmMgYi9uZXQvYnJpZGdlL2JyX21kYi5jCmluZGV4IGI3YjE5MTQuLjVkZjA1MjYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbWRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9tZGIuYwpAQCAtNDE4LDEzICs0MTgsMTMgQEAKIAogCWlwLnByb3RvID0gZW50cnktPmFkZHIucHJvdG87CiAJaWYgKGlwLnByb3RvID09IGh0b25zKEVUSF9QX0lQKSkgewotCQlpZiAodGltZXJfcGVuZGluZygmYnItPmlwNF9xdWVyaWVyLnRpbWVyKSkKKwkJaWYgKHRpbWVyX3BlbmRpbmcoJmJyLT5pcDRfb3RoZXJfcXVlcnkudGltZXIpKQogCQkJcmV0dXJuIC1FQlVTWTsKIAogCQlpcC51LmlwNCA9IGVudHJ5LT5hZGRyLnUuaXA0OwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJfSBlbHNlIHsKLQkJaWYgKHRpbWVyX3BlbmRpbmcoJmJyLT5pcDZfcXVlcmllci50aW1lcikpCisJCWlmICh0aW1lcl9wZW5kaW5nKCZici0+aXA2X290aGVyX3F1ZXJ5LnRpbWVyKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKIAkJaXAudS5pcDYgPSBlbnRyeS0+YWRkci51LmlwNjsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCmluZGV4IDdiNzU3YjUuLmFiZmEwYjY1IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCisrKyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KQEAgLTM1LDcgKzM2LDcgQEAKICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKIHN0YXRpYyB2b2lkIGJyX211bHRpY2FzdF9zdGFydF9xdWVyaWVyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkgICAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpOworCQkJCSAgICAgICBzdHJ1Y3QgYnJpZGdlX21jYXN0X293bl9xdWVyeSAqcXVlcnkpOwogdW5zaWduZWQgaW50IGJyX21kYl9yZWhhc2hfc2VxOwogCiBzdGF0aWMgaW5saW5lIGludCBicl9pcF9lcXVhbChjb25zdCBzdHJ1Y3QgYnJfaXAgKmEsIGNvbnN0IHN0cnVjdCBicl9pcCAqYikKQEAgLTc2MSw3ICs3NjIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBicl9tdWx0aWNhc3RfcXVlcmllcl9leHBpcmVkKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkJIHN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcnkgKnF1ZXJ5KQorCQkJCQkgc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkgKnF1ZXJ5KQogewogCXNwaW5fbG9jaygmYnItPm11bHRpY2FzdF9sb2NrKTsKIAlpZiAoIW5ldGlmX3J1bm5pbmcoYnItPmRldikgfHwgYnItPm11bHRpY2FzdF9kaXNhYmxlZCkKQEAgLTc3Nyw3ICs3NzgsNyBAQAogewogCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9ICh2b2lkICopZGF0YTsKIAotCWJyX211bHRpY2FzdF9xdWVyaWVyX2V4cGlyZWQoYnIsICZici0+aXA0X3F1ZXJ5KTsKKwlicl9tdWx0aWNhc3RfcXVlcmllcl9leHBpcmVkKGJyLCAmYnItPmlwNF9vd25fcXVlcnkpOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKQEAgLTc4NSwxMCArNzg2LDIyIEBACiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gKHZvaWQgKilkYXRhOwogCi0JYnJfbXVsdGljYXN0X3F1ZXJpZXJfZXhwaXJlZChiciwgJmJyLT5pcDZfcXVlcnkpOworCWJyX211bHRpY2FzdF9xdWVyaWVyX2V4cGlyZWQoYnIsICZici0+aXA2X293bl9xdWVyeSk7CiB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgYnJfbXVsdGljYXN0X3NlbGVjdF9vd25fcXVlcmllcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJCSAgICBzdHJ1Y3QgYnJfaXAgKmlwLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoaXAtPnByb3RvID09IGh0b25zKEVUSF9QX0lQKSkKKwkJYnItPmlwNF9xdWVyaWVyLmFkZHIudS5pcDQgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwllbHNlCisJCWJyLT5pcDZfcXVlcmllci5hZGRyLnUuaXA2ID0gaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisjZW5kaWYKK30KKwogc3RhdGljIHZvaWQgX19icl9tdWx0aWNhc3Rfc2VuZF9xdWVyeShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJICAgICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwKIAkJCQkgICAgICBzdHJ1Y3QgYnJfaXAgKmlwKQpAQCAtODA0LDE3ICs4MTcsMTkgQEAKIAkJc2tiLT5kZXYgPSBwb3J0LT5kZXY7CiAJCU5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKIAkJCWRldl9xdWV1ZV94bWl0KTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQlicl9tdWx0aWNhc3Rfc2VsZWN0X293bl9xdWVyaWVyKGJyLCBpcCwgc2tiKTsKIAkJbmV0aWZfcngoc2tiKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGJyX211bHRpY2FzdF9zZW5kX3F1ZXJ5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkgICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwKLQkJCQkgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpCisJCQkJICAgIHN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpvd25fcXVlcnkpCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lOwogCXN0cnVjdCBicl9pcCBicl9ncm91cDsKLQlzdHJ1Y3QgYnJpZGdlX21jYXN0X3F1ZXJpZXIgKnF1ZXJpZXIgPSBOVUxMOworCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3RoZXJfcXVlcnkgKm90aGVyX3F1ZXJ5ID0gTlVMTDsKIAogCWlmICghbmV0aWZfcnVubmluZyhici0+ZGV2KSB8fCBici0+bXVsdGljYXN0X2Rpc2FibGVkIHx8CiAJICAgICFici0+bXVsdGljYXN0X3F1ZXJpZXIpCkBAIC04MjIsMzEgKzgzNywzMiBAQAogCiAJbWVtc2V0KCZicl9ncm91cC51LCAwLCBzaXplb2YoYnJfZ3JvdXAudSkpOwogCi0JaWYgKHBvcnQgPyAocXVlcnkgPT0gJnBvcnQtPmlwNF9xdWVyeSkgOgotCQkgICAocXVlcnkgPT0gJmJyLT5pcDRfcXVlcnkpKSB7Ci0JCXF1ZXJpZXIgPSAmYnItPmlwNF9xdWVyaWVyOworCWlmIChwb3J0ID8gKG93bl9xdWVyeSA9PSAmcG9ydC0+aXA0X293bl9xdWVyeSkgOgorCQkgICAob3duX3F1ZXJ5ID09ICZici0+aXA0X293bl9xdWVyeSkpIHsKKwkJb3RoZXJfcXVlcnkgPSAmYnItPmlwNF9vdGhlcl9xdWVyeTsKIAkJYnJfZ3JvdXAucHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgewotCQlxdWVyaWVyID0gJmJyLT5pcDZfcXVlcmllcjsKKwkJb3RoZXJfcXVlcnkgPSAmYnItPmlwNl9vdGhlcl9xdWVyeTsKIAkJYnJfZ3JvdXAucHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKICNlbmRpZgogCX0KIAotCWlmICghcXVlcmllciB8fCB0aW1lcl9wZW5kaW5nKCZxdWVyaWVyLT50aW1lcikpCisJaWYgKCFvdGhlcl9xdWVyeSB8fCB0aW1lcl9wZW5kaW5nKCZvdGhlcl9xdWVyeS0+dGltZXIpKQogCQlyZXR1cm47CiAKIAlfX2JyX211bHRpY2FzdF9zZW5kX3F1ZXJ5KGJyLCBwb3J0LCAmYnJfZ3JvdXApOwogCiAJdGltZSA9IGppZmZpZXM7Ci0JdGltZSArPSBxdWVyeS0+c3RhcnR1cF9zZW50IDwgYnItPm11bHRpY2FzdF9zdGFydHVwX3F1ZXJ5X2NvdW50ID8KKwl0aW1lICs9IG93bl9xdWVyeS0+c3RhcnR1cF9zZW50IDwgYnItPm11bHRpY2FzdF9zdGFydHVwX3F1ZXJ5X2NvdW50ID8KIAkJYnItPm11bHRpY2FzdF9zdGFydHVwX3F1ZXJ5X2ludGVydmFsIDoKIAkJYnItPm11bHRpY2FzdF9xdWVyeV9pbnRlcnZhbDsKLQltb2RfdGltZXIoJnF1ZXJ5LT50aW1lciwgdGltZSk7CisJbW9kX3RpbWVyKCZvd25fcXVlcnktPnRpbWVyLCB0aW1lKTsKIH0KIAotc3RhdGljIHZvaWQgYnJfbXVsdGljYXN0X3BvcnRfcXVlcnlfZXhwaXJlZChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAotCQkJCQkgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpCitzdGF0aWMgdm9pZAorYnJfbXVsdGljYXN0X3BvcnRfcXVlcnlfZXhwaXJlZChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpxdWVyeSkKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBwb3J0LT5icjsKIApAQCAtODY4LDcgKzg4NCw3IEBACiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCA9ICh2b2lkICopZGF0YTsKIAotCWJyX211bHRpY2FzdF9wb3J0X3F1ZXJ5X2V4cGlyZWQocG9ydCwgJnBvcnQtPmlwNF9xdWVyeSk7CisJYnJfbXVsdGljYXN0X3BvcnRfcXVlcnlfZXhwaXJlZChwb3J0LCAmcG9ydC0+aXA0X293bl9xdWVyeSk7CiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQpAQCAtODc2LDcgKzg5Miw3IEBACiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCA9ICh2b2lkICopZGF0YTsKIAotCWJyX211bHRpY2FzdF9wb3J0X3F1ZXJ5X2V4cGlyZWQocG9ydCwgJnBvcnQtPmlwNl9xdWVyeSk7CisJYnJfbXVsdGljYXN0X3BvcnRfcXVlcnlfZXhwaXJlZChwb3J0LCAmcG9ydC0+aXA2X293bl9xdWVyeSk7CiB9CiAjZW5kaWYKIApAQCAtODg2LDExICs5MDIsMTEgQEAKIAogCXNldHVwX3RpbWVyKCZwb3J0LT5tdWx0aWNhc3Rfcm91dGVyX3RpbWVyLCBicl9tdWx0aWNhc3Rfcm91dGVyX2V4cGlyZWQsCiAJCSAgICAodW5zaWduZWQgbG9uZylwb3J0KTsKLQlzZXR1cF90aW1lcigmcG9ydC0+aXA0X3F1ZXJ5LnRpbWVyLCBicl9pcDRfbXVsdGljYXN0X3BvcnRfcXVlcnlfZXhwaXJlZCwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBvcnQpOworCXNldHVwX3RpbWVyKCZwb3J0LT5pcDRfb3duX3F1ZXJ5LnRpbWVyLAorCQkgICAgYnJfaXA0X211bHRpY2FzdF9wb3J0X3F1ZXJ5X2V4cGlyZWQsICh1bnNpZ25lZCBsb25nKXBvcnQpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0Jc2V0dXBfdGltZXIoJnBvcnQtPmlwNl9xdWVyeS50aW1lciwgYnJfaXA2X211bHRpY2FzdF9wb3J0X3F1ZXJ5X2V4cGlyZWQsCi0JCSAgICAodW5zaWduZWQgbG9uZylwb3J0KTsKKwlzZXR1cF90aW1lcigmcG9ydC0+aXA2X293bl9xdWVyeS50aW1lciwKKwkJICAgIGJyX2lwNl9tdWx0aWNhc3RfcG9ydF9xdWVyeV9leHBpcmVkLCAodW5zaWduZWQgbG9uZylwb3J0KTsKICNlbmRpZgogfQogCkBAIC04OTksNyArOTE1LDcgQEAKIAlkZWxfdGltZXJfc3luYygmcG9ydC0+bXVsdGljYXN0X3JvdXRlcl90aW1lcik7CiB9CiAKLXN0YXRpYyB2b2lkIGJyX211bHRpY2FzdF9lbmFibGUoc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpCitzdGF0aWMgdm9pZCBicl9tdWx0aWNhc3RfZW5hYmxlKHN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpxdWVyeSkKIHsKIAlxdWVyeS0+c3RhcnR1cF9zZW50ID0gMDsKIApAQCAtOTE2LDkgKzkzMiw5IEBACiAJaWYgKGJyLT5tdWx0aWNhc3RfZGlzYWJsZWQgfHwgIW5ldGlmX3J1bm5pbmcoYnItPmRldikpCiAJCWdvdG8gb3V0OwogCi0JYnJfbXVsdGljYXN0X2VuYWJsZSgmcG9ydC0+aXA0X3F1ZXJ5KTsKKwlicl9tdWx0aWNhc3RfZW5hYmxlKCZwb3J0LT5pcDRfb3duX3F1ZXJ5KTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCWJyX211bHRpY2FzdF9lbmFibGUoJnBvcnQtPmlwNl9xdWVyeSk7CisJYnJfbXVsdGljYXN0X2VuYWJsZSgmcG9ydC0+aXA2X293bl9xdWVyeSk7CiAjZW5kaWYKIAogb3V0OgpAQCAtOTM4LDkgKzk1NCw5IEBACiAJaWYgKCFobGlzdF91bmhhc2hlZCgmcG9ydC0+cmxpc3QpKQogCQlobGlzdF9kZWxfaW5pdF9yY3UoJnBvcnQtPnJsaXN0KTsKIAlkZWxfdGltZXIoJnBvcnQtPm11bHRpY2FzdF9yb3V0ZXJfdGltZXIpOwotCWRlbF90aW1lcigmcG9ydC0+aXA0X3F1ZXJ5LnRpbWVyKTsKKwlkZWxfdGltZXIoJnBvcnQtPmlwNF9vd25fcXVlcnkudGltZXIpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JZGVsX3RpbWVyKCZwb3J0LT5pcDZfcXVlcnkudGltZXIpOworCWRlbF90aW1lcigmcG9ydC0+aXA2X293bl9xdWVyeS50aW1lcik7CiAjZW5kaWYKIAlzcGluX3VubG9jaygmYnItPm11bHRpY2FzdF9sb2NrKTsKIH0KQEAgLTEwNjQsMTUgKzEwODAsODAgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZAotYnJfbXVsdGljYXN0X3VwZGF0ZV9xdWVyaWVyX3RpbWVyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkgIHN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcmllciAqcXVlcmllciwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgbWF4X2RlbGF5KQorc3RhdGljIGJvb2wgYnJfaXA0X211bHRpY2FzdF9zZWxlY3RfcXVlcmllcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAorCQkJCQkgICAgX19iZTMyIHNhZGRyKQogewotCWlmICghdGltZXJfcGVuZGluZygmcXVlcmllci0+dGltZXIpKQotCQlxdWVyaWVyLT5kZWxheV90aW1lID0gamlmZmllcyArIG1heF9kZWxheTsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmJyLT5pcDRfb3duX3F1ZXJ5LnRpbWVyKSAmJgorCSAgICAhdGltZXJfcGVuZGluZygmYnItPmlwNF9vdGhlcl9xdWVyeS50aW1lcikpCisJCWdvdG8gdXBkYXRlOwogCi0JbW9kX3RpbWVyKCZxdWVyaWVyLT50aW1lciwgamlmZmllcyArIGJyLT5tdWx0aWNhc3RfcXVlcmllcl9pbnRlcnZhbCk7CisJaWYgKCFici0+aXA0X3F1ZXJpZXIuYWRkci51LmlwNCkKKwkJZ290byB1cGRhdGU7CisKKwlpZiAobnRvaGwoc2FkZHIpIDw9IG50b2hsKGJyLT5pcDRfcXVlcmllci5hZGRyLnUuaXA0KSkKKwkJZ290byB1cGRhdGU7CisKKwlyZXR1cm4gZmFsc2U7CisKK3VwZGF0ZToKKwlici0+aXA0X3F1ZXJpZXIuYWRkci51LmlwNCA9IHNhZGRyOworCisJLyogdXBkYXRlIHByb3RlY3RlZCBieSBnZW5lcmFsIG11bHRpY2FzdF9sb2NrIGJ5IGNhbGxlciAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihici0+aXA0X3F1ZXJpZXIucG9ydCwgcG9ydCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCitzdGF0aWMgYm9vbCBicl9pcDZfbXVsdGljYXN0X3NlbGVjdF9xdWVyaWVyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCQkJICAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsCisJCQkJCSAgICBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQoreworCWlmICghdGltZXJfcGVuZGluZygmYnItPmlwNl9vd25fcXVlcnkudGltZXIpICYmCisJICAgICF0aW1lcl9wZW5kaW5nKCZici0+aXA2X290aGVyX3F1ZXJ5LnRpbWVyKSkKKwkJZ290byB1cGRhdGU7CisKKwlpZiAoaXB2Nl9hZGRyX2NtcChzYWRkciwgJmJyLT5pcDZfcXVlcmllci5hZGRyLnUuaXA2KSA8PSAwKQorCQlnb3RvIHVwZGF0ZTsKKworCXJldHVybiBmYWxzZTsKKwordXBkYXRlOgorCWJyLT5pcDZfcXVlcmllci5hZGRyLnUuaXA2ID0gKnNhZGRyOworCisJLyogdXBkYXRlIHByb3RlY3RlZCBieSBnZW5lcmFsIG11bHRpY2FzdF9sb2NrIGJ5IGNhbGxlciAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihici0+aXA2X3F1ZXJpZXIucG9ydCwgcG9ydCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgYm9vbCBicl9tdWx0aWNhc3Rfc2VsZWN0X3F1ZXJpZXIoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJCQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAorCQkJCQlzdHJ1Y3QgYnJfaXAgKnNhZGRyKQoreworCXN3aXRjaCAoc2FkZHItPnByb3RvKSB7CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CisJCXJldHVybiBicl9pcDRfbXVsdGljYXN0X3NlbGVjdF9xdWVyaWVyKGJyLCBwb3J0LCBzYWRkci0+dS5pcDQpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKKwkJcmV0dXJuIGJyX2lwNl9tdWx0aWNhc3Rfc2VsZWN0X3F1ZXJpZXIoYnIsIHBvcnQsICZzYWRkci0+dS5pcDYpOworI2VuZGlmCisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZAorYnJfbXVsdGljYXN0X3VwZGF0ZV9xdWVyeV90aW1lcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJc3RydWN0IGJyaWRnZV9tY2FzdF9vdGhlcl9xdWVyeSAqcXVlcnksCisJCQkJdW5zaWduZWQgbG9uZyBtYXhfZGVsYXkpCit7CisJaWYgKCF0aW1lcl9wZW5kaW5nKCZxdWVyeS0+dGltZXIpKQorCQlxdWVyeS0+ZGVsYXlfdGltZSA9IGppZmZpZXMgKyBtYXhfZGVsYXk7CisKKwltb2RfdGltZXIoJnF1ZXJ5LT50aW1lciwgamlmZmllcyArIGJyLT5tdWx0aWNhc3RfcXVlcmllcl9pbnRlcnZhbCk7CiB9CiAKIC8qCkBAIC0xMTI1LDE2ICsxMjA2LDE0IEBACiAKIHN0YXRpYyB2b2lkIGJyX211bHRpY2FzdF9xdWVyeV9yZWNlaXZlZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsCi0JCQkJCXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcmllciAqcXVlcmllciwKLQkJCQkJaW50IHNhZGRyLAotCQkJCQlib29sIGlzX2dlbmVyYWxfcXVlcnksCisJCQkJCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3RoZXJfcXVlcnkgKnF1ZXJ5LAorCQkJCQlzdHJ1Y3QgYnJfaXAgKnNhZGRyLAogCQkJCQl1bnNpZ25lZCBsb25nIG1heF9kZWxheSkKIHsKLQlpZiAoc2FkZHIgJiYgaXNfZ2VuZXJhbF9xdWVyeSkKLQkJYnJfbXVsdGljYXN0X3VwZGF0ZV9xdWVyaWVyX3RpbWVyKGJyLCBxdWVyaWVyLCBtYXhfZGVsYXkpOwotCWVsc2UgaWYgKHRpbWVyX3BlbmRpbmcoJnF1ZXJpZXItPnRpbWVyKSkKKwlpZiAoIWJyX211bHRpY2FzdF9zZWxlY3RfcXVlcmllcihiciwgcG9ydCwgc2FkZHIpKQogCQlyZXR1cm47CiAKKwlicl9tdWx0aWNhc3RfdXBkYXRlX3F1ZXJ5X3RpbWVyKGJyLCBxdWVyeSwgbWF4X2RlbGF5KTsKIAlicl9tdWx0aWNhc3RfbWFya19yb3V0ZXIoYnIsIHBvcnQpOwogfQogCkBAIC0xMTQ5LDYgKzEyMjgsNyBAQAogCXN0cnVjdCBpZ21wdjNfcXVlcnkgKmloMzsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0X2dyb3VwICpwOwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnRfZ3JvdXAgX19yY3UgKipwcDsKKwlzdHJ1Y3QgYnJfaXAgc2FkZHI7CiAJdW5zaWduZWQgbG9uZyBtYXhfZGVsYXk7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCV9fYmUzMiBncm91cDsKQEAgLTExOTAsMTEgKzEyNzAsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYnJfbXVsdGljYXN0X3F1ZXJ5X3JlY2VpdmVkKGJyLCBwb3J0LCAmYnItPmlwNF9xdWVyaWVyLCAhIWlwaC0+c2FkZHIsCi0JCQkJICAgICFncm91cCwgbWF4X2RlbGF5KTsKKwlpZiAoIWdyb3VwKSB7CisJCXNhZGRyLnByb3RvID0gaHRvbnMoRVRIX1BfSVApOworCQlzYWRkci51LmlwNCA9IGlwaC0+c2FkZHI7CiAKLQlpZiAoIWdyb3VwKQorCQlicl9tdWx0aWNhc3RfcXVlcnlfcmVjZWl2ZWQoYnIsIHBvcnQsICZici0+aXA0X290aGVyX3F1ZXJ5LAorCQkJCQkgICAgJnNhZGRyLCBtYXhfZGVsYXkpOwogCQlnb3RvIG91dDsKKwl9CiAKIAltcCA9IGJyX21kYl9pcDRfZ2V0KG1sb2NrX2RlcmVmZXJlbmNlKGJyLT5tZGIsIGJyKSwgZ3JvdXAsIHZpZCk7CiAJaWYgKCFtcCkKQEAgLTEyMzQsNiArMTMxNyw3IEBACiAJc3RydWN0IG1sZDJfcXVlcnkgKm1sZDJxOwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnRfZ3JvdXAgKnA7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydF9ncm91cCBfX3JjdSAqKnBwOworCXN0cnVjdCBicl9pcCBzYWRkcjsKIAl1bnNpZ25lZCBsb25nIG1heF9kZWxheTsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJY29uc3Qgc3RydWN0IGluNl9hZGRyICpncm91cCA9IE5VTEw7CkBAIC0xMjgyLDEyICsxMzY2LDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWJyX211bHRpY2FzdF9xdWVyeV9yZWNlaXZlZChiciwgcG9ydCwgJmJyLT5pcDZfcXVlcmllciwKLQkJCQkgICAgIWlwdjZfYWRkcl9hbnkoJmlwNmgtPnNhZGRyKSwKLQkJCQkgICAgaXNfZ2VuZXJhbF9xdWVyeSwgbWF4X2RlbGF5KTsKKwlpZiAoaXNfZ2VuZXJhbF9xdWVyeSkgeworCQlzYWRkci5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOworCQlzYWRkci51LmlwNiA9IGlwNmgtPnNhZGRyOwogCi0JaWYgKCFncm91cCkKKwkJYnJfbXVsdGljYXN0X3F1ZXJ5X3JlY2VpdmVkKGJyLCBwb3J0LCAmYnItPmlwNl9vdGhlcl9xdWVyeSwKKwkJCQkJICAgICZzYWRkciwgbWF4X2RlbGF5KTsKIAkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghZ3JvdXApIHsKKwkJZ290byBvdXQ7CisJfQogCiAJbXAgPSBicl9tZGJfaXA2X2dldChtbG9ja19kZXJlZmVyZW5jZShici0+bWRiLCBiciksIGdyb3VwLCB2aWQpOwogCWlmICghbXApCkBAIC0xMzE1LDExICsxNDAzLDEyIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgYnJfbXVsdGljYXN0X2xlYXZlX2dyb3VwKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsCi0JCQkJICAgICBzdHJ1Y3QgYnJfaXAgKmdyb3VwLAotCQkJCSAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyaWVyICpxdWVyaWVyLAotCQkJCSAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpCitzdGF0aWMgdm9pZAorYnJfbXVsdGljYXN0X2xlYXZlX2dyb3VwKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCSBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAorCQkJIHN0cnVjdCBicl9pcCAqZ3JvdXAsCisJCQkgc3RydWN0IGJyaWRnZV9tY2FzdF9vdGhlcl9xdWVyeSAqb3RoZXJfcXVlcnksCisJCQkgc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkgKm93bl9xdWVyeSkKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9tZGJfaHRhYmxlICptZGI7CiAJc3RydWN0IG5ldF9icmlkZ2VfbWRiX2VudHJ5ICptcDsKQEAgLTEzMzAsNyArMTQxOSw3IEBACiAJc3Bpbl9sb2NrKCZici0+bXVsdGljYXN0X2xvY2spOwogCWlmICghbmV0aWZfcnVubmluZyhici0+ZGV2KSB8fAogCSAgICAocG9ydCAmJiBwb3J0LT5zdGF0ZSA9PSBCUl9TVEFURV9ESVNBQkxFRCkgfHwKLQkgICAgdGltZXJfcGVuZGluZygmcXVlcmllci0+dGltZXIpKQorCSAgICB0aW1lcl9wZW5kaW5nKCZvdGhlcl9xdWVyeS0+dGltZXIpKQogCQlnb3RvIG91dDsKIAogCW1kYiA9IG1sb2NrX2RlcmVmZXJlbmNlKGJyLT5tZGIsIGJyKTsKQEAgLTEzNDQsNyArMTQzMyw3IEBACiAJCXRpbWUgPSBqaWZmaWVzICsgYnItPm11bHRpY2FzdF9sYXN0X21lbWJlcl9jb3VudCAqCiAJCQkJIGJyLT5tdWx0aWNhc3RfbGFzdF9tZW1iZXJfaW50ZXJ2YWw7CiAKLQkJbW9kX3RpbWVyKCZxdWVyeS0+dGltZXIsIHRpbWUpOworCQltb2RfdGltZXIoJm93bl9xdWVyeS0+dGltZXIsIHRpbWUpOwogCiAJCWZvciAocCA9IG1sb2NrX2RlcmVmZXJlbmNlKG1wLT5wb3J0cywgYnIpOwogCQkgICAgIHAgIT0gTlVMTDsKQEAgLTE0MjUsMTcgKzE1MTQsMTkgQEAKIAkJCQkJIF9fdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgYnJfaXAgYnJfZ3JvdXA7Ci0Jc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkgPSBwb3J0ID8gJnBvcnQtPmlwNF9xdWVyeSA6Ci0JCQkJCQkgICZici0+aXA0X3F1ZXJ5OworCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpvd25fcXVlcnk7CiAKIAlpZiAoaXB2NF9pc19sb2NhbF9tdWx0aWNhc3QoZ3JvdXApKQogCQlyZXR1cm47CiAKKwlvd25fcXVlcnkgPSBwb3J0ID8gJnBvcnQtPmlwNF9vd25fcXVlcnkgOiAmYnItPmlwNF9vd25fcXVlcnk7CisKIAlicl9ncm91cC51LmlwNCA9IGdyb3VwOwogCWJyX2dyb3VwLnByb3RvID0gaHRvbnMoRVRIX1BfSVApOwogCWJyX2dyb3VwLnZpZCA9IHZpZDsKIAotCWJyX211bHRpY2FzdF9sZWF2ZV9ncm91cChiciwgcG9ydCwgJmJyX2dyb3VwLCAmYnItPmlwNF9xdWVyaWVyLCBxdWVyeSk7CisJYnJfbXVsdGljYXN0X2xlYXZlX2dyb3VwKGJyLCBwb3J0LCAmYnJfZ3JvdXAsICZici0+aXA0X290aGVyX3F1ZXJ5LAorCQkJCSBvd25fcXVlcnkpOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKQEAgLTE0NDUsMTggKzE1MzYsMTkgQEAKIAkJCQkJIF9fdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgYnJfaXAgYnJfZ3JvdXA7Ci0Jc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkgPSBwb3J0ID8gJnBvcnQtPmlwNl9xdWVyeSA6Ci0JCQkJCQkgICZici0+aXA2X3F1ZXJ5OwotCisJc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkgKm93bl9xdWVyeTsKIAogCWlmIChpcHY2X2FkZHJfaXNfbGxfYWxsX25vZGVzKGdyb3VwKSkKIAkJcmV0dXJuOwogCisJb3duX3F1ZXJ5ID0gcG9ydCA/ICZwb3J0LT5pcDZfb3duX3F1ZXJ5IDogJmJyLT5pcDZfb3duX3F1ZXJ5OworCiAJYnJfZ3JvdXAudS5pcDYgPSAqZ3JvdXA7CiAJYnJfZ3JvdXAucHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKIAlicl9ncm91cC52aWQgPSB2aWQ7CiAKLQlicl9tdWx0aWNhc3RfbGVhdmVfZ3JvdXAoYnIsIHBvcnQsICZicl9ncm91cCwgJmJyLT5pcDZfcXVlcmllciwgcXVlcnkpOworCWJyX211bHRpY2FzdF9sZWF2ZV9ncm91cChiciwgcG9ydCwgJmJyX2dyb3VwLCAmYnItPmlwNl9vdGhlcl9xdWVyeSwKKwkJCQkgb3duX3F1ZXJ5KTsKIH0KICNlbmRpZgogCkBAIC0xNzIzLDEyICsxODE1LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkIGJyX211bHRpY2FzdF9xdWVyeV9leHBpcmVkKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkgICAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeSAqcXVlcnkpCisJCQkJICAgICAgIHN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpxdWVyeSwKKwkJCQkgICAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyaWVyICpxdWVyaWVyKQogewogCXNwaW5fbG9jaygmYnItPm11bHRpY2FzdF9sb2NrKTsKIAlpZiAocXVlcnktPnN0YXJ0dXBfc2VudCA8IGJyLT5tdWx0aWNhc3Rfc3RhcnR1cF9xdWVyeV9jb3VudCkKIAkJcXVlcnktPnN0YXJ0dXBfc2VudCsrOwogCisJcmN1X2Fzc2lnbl9wb2ludGVyKHF1ZXJpZXIsIE5VTEwpOwogCWJyX211bHRpY2FzdF9zZW5kX3F1ZXJ5KGJyLCBOVUxMLCBxdWVyeSk7CiAJc3Bpbl91bmxvY2soJmJyLT5tdWx0aWNhc3RfbG9jayk7CiB9CkBAIC0xNzM3LDcgKzE4MzEsNyBAQAogewogCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9ICh2b2lkICopZGF0YTsKIAotCWJyX211bHRpY2FzdF9xdWVyeV9leHBpcmVkKGJyLCAmYnItPmlwNF9xdWVyeSk7CisJYnJfbXVsdGljYXN0X3F1ZXJ5X2V4cGlyZWQoYnIsICZici0+aXA0X293bl9xdWVyeSwgJmJyLT5pcDRfcXVlcmllcik7CiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQpAQCAtMTc0NSw3ICsxODM5LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSAodm9pZCAqKWRhdGE7CiAKLQlicl9tdWx0aWNhc3RfcXVlcnlfZXhwaXJlZChiciwgJmJyLT5pcDZfcXVlcnkpOworCWJyX211bHRpY2FzdF9xdWVyeV9leHBpcmVkKGJyLCAmYnItPmlwNl9vd25fcXVlcnksICZici0+aXA2X3F1ZXJpZXIpOwogfQogI2VuZGlmCiAKQEAgLTE3NjcsMjggKzE4NjEsMzAgQEAKIAlici0+bXVsdGljYXN0X3F1ZXJpZXJfaW50ZXJ2YWwgPSAyNTUgKiBIWjsKIAlici0+bXVsdGljYXN0X21lbWJlcnNoaXBfaW50ZXJ2YWwgPSAyNjAgKiBIWjsKIAotCWJyLT5pcDRfcXVlcmllci5kZWxheV90aW1lID0gMDsKKwlici0+aXA0X290aGVyX3F1ZXJ5LmRlbGF5X3RpbWUgPSAwOworCWJyLT5pcDRfcXVlcmllci5wb3J0ID0gTlVMTDsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCWJyLT5pcDZfcXVlcmllci5kZWxheV90aW1lID0gMDsKKwlici0+aXA2X290aGVyX3F1ZXJ5LmRlbGF5X3RpbWUgPSAwOworCWJyLT5pcDZfcXVlcmllci5wb3J0ID0gTlVMTDsKICNlbmRpZgogCiAJc3Bpbl9sb2NrX2luaXQoJmJyLT5tdWx0aWNhc3RfbG9jayk7CiAJc2V0dXBfdGltZXIoJmJyLT5tdWx0aWNhc3Rfcm91dGVyX3RpbWVyLAogCQkgICAgYnJfbXVsdGljYXN0X2xvY2FsX3JvdXRlcl9leHBpcmVkLCAwKTsKLQlzZXR1cF90aW1lcigmYnItPmlwNF9xdWVyaWVyLnRpbWVyLCBicl9pcDRfbXVsdGljYXN0X3F1ZXJpZXJfZXhwaXJlZCwKLQkJICAgICh1bnNpZ25lZCBsb25nKWJyKTsKLQlzZXR1cF90aW1lcigmYnItPmlwNF9xdWVyeS50aW1lciwgYnJfaXA0X211bHRpY2FzdF9xdWVyeV9leHBpcmVkLAorCXNldHVwX3RpbWVyKCZici0+aXA0X290aGVyX3F1ZXJ5LnRpbWVyLAorCQkgICAgYnJfaXA0X211bHRpY2FzdF9xdWVyaWVyX2V4cGlyZWQsICh1bnNpZ25lZCBsb25nKWJyKTsKKwlzZXR1cF90aW1lcigmYnItPmlwNF9vd25fcXVlcnkudGltZXIsIGJyX2lwNF9tdWx0aWNhc3RfcXVlcnlfZXhwaXJlZCwKIAkJICAgICh1bnNpZ25lZCBsb25nKWJyKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCXNldHVwX3RpbWVyKCZici0+aXA2X3F1ZXJpZXIudGltZXIsIGJyX2lwNl9tdWx0aWNhc3RfcXVlcmllcl9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpYnIpOwotCXNldHVwX3RpbWVyKCZici0+aXA2X3F1ZXJ5LnRpbWVyLCBicl9pcDZfbXVsdGljYXN0X3F1ZXJ5X2V4cGlyZWQsCisJc2V0dXBfdGltZXIoJmJyLT5pcDZfb3RoZXJfcXVlcnkudGltZXIsCisJCSAgICBicl9pcDZfbXVsdGljYXN0X3F1ZXJpZXJfZXhwaXJlZCwgKHVuc2lnbmVkIGxvbmcpYnIpOworCXNldHVwX3RpbWVyKCZici0+aXA2X293bl9xdWVyeS50aW1lciwgYnJfaXA2X211bHRpY2FzdF9xdWVyeV9leHBpcmVkLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpYnIpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9fYnJfbXVsdGljYXN0X29wZW4oc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJCXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcnkgKnF1ZXJ5KQorCQkJCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5ICpxdWVyeSkKIHsKIAlxdWVyeS0+c3RhcnR1cF9zZW50ID0gMDsKIApAQCAtMTgwMCw5ICsxODk2LDkgQEAKIAogdm9pZCBicl9tdWx0aWNhc3Rfb3BlbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCiB7Ci0JX19icl9tdWx0aWNhc3Rfb3BlbihiciwgJmJyLT5pcDRfcXVlcnkpOworCV9fYnJfbXVsdGljYXN0X29wZW4oYnIsICZici0+aXA0X293bl9xdWVyeSk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQlfX2JyX211bHRpY2FzdF9vcGVuKGJyLCAmYnItPmlwNl9xdWVyeSk7CisJX19icl9tdWx0aWNhc3Rfb3BlbihiciwgJmJyLT5pcDZfb3duX3F1ZXJ5KTsKICNlbmRpZgogfQogCkBAIC0xODE1LDExICsxOTExLDExIEBACiAJaW50IGk7CiAKIAlkZWxfdGltZXJfc3luYygmYnItPm11bHRpY2FzdF9yb3V0ZXJfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZici0+aXA0X3F1ZXJpZXIudGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZici0+aXA0X3F1ZXJ5LnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYnItPmlwNF9vdGhlcl9xdWVyeS50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmJyLT5pcDRfb3duX3F1ZXJ5LnRpbWVyKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCWRlbF90aW1lcl9zeW5jKCZici0+aXA2X3F1ZXJpZXIudGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZici0+aXA2X3F1ZXJ5LnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYnItPmlwNl9vdGhlcl9xdWVyeS50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmJyLT5pcDZfb3duX3F1ZXJ5LnRpbWVyKTsKICNlbmRpZgogCiAJc3Bpbl9sb2NrX2JoKCZici0+bXVsdGljYXN0X2xvY2spOwpAQCAtMTkyMyw3ICsyMDE5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYnJfbXVsdGljYXN0X3N0YXJ0X3F1ZXJpZXIoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJCSAgICAgICBzdHJ1Y3QgYnJpZGdlX21jYXN0X3F1ZXJ5ICpxdWVyeSkKKwkJCQkgICAgICAgc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkgKnF1ZXJ5KQogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQ7CiAKQEAgLTE5MzQsMTEgKzIwMzAsMTEgQEAKIAkJICAgIHBvcnQtPnN0YXRlID09IEJSX1NUQVRFX0JMT0NLSU5HKQogCQkJY29udGludWU7CiAKLQkJaWYgKHF1ZXJ5ID09ICZici0+aXA0X3F1ZXJ5KQotCQkJYnJfbXVsdGljYXN0X2VuYWJsZSgmcG9ydC0+aXA0X3F1ZXJ5KTsKKwkJaWYgKHF1ZXJ5ID09ICZici0+aXA0X293bl9xdWVyeSkKKwkJCWJyX211bHRpY2FzdF9lbmFibGUoJnBvcnQtPmlwNF9vd25fcXVlcnkpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWVsc2UKLQkJCWJyX211bHRpY2FzdF9lbmFibGUoJnBvcnQtPmlwNl9xdWVyeSk7CisJCQlicl9tdWx0aWNhc3RfZW5hYmxlKCZwb3J0LT5pcDZfb3duX3F1ZXJ5KTsKICNlbmRpZgogCX0KIH0KQEAgLTE5NzQsOSArMjA3MCw5IEBACiAJCQlnb3RvIHJvbGxiYWNrOwogCX0KIAotCWJyX211bHRpY2FzdF9zdGFydF9xdWVyaWVyKGJyLCAmYnItPmlwNF9xdWVyeSk7CisJYnJfbXVsdGljYXN0X3N0YXJ0X3F1ZXJpZXIoYnIsICZici0+aXA0X293bl9xdWVyeSk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQlicl9tdWx0aWNhc3Rfc3RhcnRfcXVlcmllcihiciwgJmJyLT5pcDZfcXVlcnkpOworCWJyX211bHRpY2FzdF9zdGFydF9xdWVyaWVyKGJyLCAmYnItPmlwNl9vd25fcXVlcnkpOwogI2VuZGlmCiAKIHVubG9jazoKQEAgLTIwMDEsMTYgKzIwOTcsMTYgQEAKIAogCW1heF9kZWxheSA9IGJyLT5tdWx0aWNhc3RfcXVlcnlfcmVzcG9uc2VfaW50ZXJ2YWw7CiAKLQlpZiAoIXRpbWVyX3BlbmRpbmcoJmJyLT5pcDRfcXVlcmllci50aW1lcikpCi0JCWJyLT5pcDRfcXVlcmllci5kZWxheV90aW1lID0gamlmZmllcyArIG1heF9kZWxheTsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmJyLT5pcDRfb3RoZXJfcXVlcnkudGltZXIpKQorCQlici0+aXA0X290aGVyX3F1ZXJ5LmRlbGF5X3RpbWUgPSBqaWZmaWVzICsgbWF4X2RlbGF5OwogCi0JYnJfbXVsdGljYXN0X3N0YXJ0X3F1ZXJpZXIoYnIsICZici0+aXA0X3F1ZXJ5KTsKKwlicl9tdWx0aWNhc3Rfc3RhcnRfcXVlcmllcihiciwgJmJyLT5pcDRfb3duX3F1ZXJ5KTsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKCF0aW1lcl9wZW5kaW5nKCZici0+aXA2X3F1ZXJpZXIudGltZXIpKQotCQlici0+aXA2X3F1ZXJpZXIuZGVsYXlfdGltZSA9IGppZmZpZXMgKyBtYXhfZGVsYXk7CisJaWYgKCF0aW1lcl9wZW5kaW5nKCZici0+aXA2X290aGVyX3F1ZXJ5LnRpbWVyKSkKKwkJYnItPmlwNl9vdGhlcl9xdWVyeS5kZWxheV90aW1lID0gamlmZmllcyArIG1heF9kZWxheTsKIAotCWJyX211bHRpY2FzdF9zdGFydF9xdWVyaWVyKGJyLCAmYnItPmlwNl9xdWVyeSk7CisJYnJfbXVsdGljYXN0X3N0YXJ0X3F1ZXJpZXIoYnIsICZici0+aXA2X293bl9xdWVyeSk7CiAjZW5kaWYKIAogdW5sb2NrOgpAQCAtMjA2MSwzICsyMTU3LDEwOSBAQAogCiAJcmV0dXJuIGVycjsKIH0KKworLyoqCisgKiBicl9tdWx0aWNhc3RfbGlzdF9hZGphY2VudCAtIFJldHVybnMgc25vb3BlZCBtdWx0aWNhc3QgYWRkcmVzc2VzCisgKiBAZGV2OglUaGUgYnJpZGdlIHBvcnQgYWRqYWNlbnQgdG8gd2hpY2ggdG8gcmV0cmlldmUgYWRkcmVzc2VzCisgKiBAYnJfaXBfbGlzdDoJVGhlIGxpc3QgdG8gc3RvcmUgZm91bmQsIHNub29wZWQgbXVsdGljYXN0IElQIGFkZHJlc3NlcyBpbgorICoKKyAqIENyZWF0ZXMgYSBsaXN0IG9mIElQIGFkZHJlc3NlcyAoc3RydWN0IGJyX2lwX2xpc3QpIHNlbnNlZCBieSB0aGUgbXVsdGljYXN0CisgKiBzbm9vcGluZyBmZWF0dXJlIG9uIGFsbCBicmlkZ2UgcG9ydHMgb2YgZGV2J3MgYnJpZGdlIGRldmljZSwgZXhjbHVkaW5nCisgKiB0aGUgYWRkcmVzc2VzIGZyb20gZGV2IGl0c2VsZi4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgYWRkZWQgdG8gYnJfaXBfbGlzdC4KKyAqCisgKiBOb3RlczoKKyAqIC0gYnJfaXBfbGlzdCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBieSBjYWxsZXIKKyAqIC0gYnJfaXBfbGlzdCBtaWdodCBjb250YWluIGR1cGxpY2F0ZXMgaW4gdGhlIGVuZAorICogICAobmVlZHMgdG8gYmUgdGFrZW4gY2FyZSBvZiBieSBjYWxsZXIpCisgKiAtIGJyX2lwX2xpc3QgbmVlZHMgdG8gYmUgZnJlZWQgYnkgY2FsbGVyCisgKi8KK2ludCBicl9tdWx0aWNhc3RfbGlzdF9hZGphY2VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmJyX2lwX2xpc3QpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQ7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydF9ncm91cCAqZ3JvdXA7CisJc3RydWN0IGJyX2lwX2xpc3QgKmVudHJ5OworCWludCBjb3VudCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCFicl9pcF9saXN0IHx8ICFicl9wb3J0X2V4aXN0cyhkZXYpKQorCQlnb3RvIHVubG9jazsKKworCXBvcnQgPSBicl9wb3J0X2dldF9yY3UoZGV2KTsKKwlpZiAoIXBvcnQgfHwgIXBvcnQtPmJyKQorCQlnb3RvIHVubG9jazsKKworCWJyID0gcG9ydC0+YnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwb3J0LCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoIXBvcnQtPmRldiB8fCBwb3J0LT5kZXYgPT0gZGV2KQorCQkJY29udGludWU7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdyb3VwLCAmcG9ydC0+bWdsaXN0LCBtZ2xpc3QpIHsKKwkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWVudHJ5KQorCQkJCWdvdG8gdW5sb2NrOworCisJCQllbnRyeS0+YWRkciA9IGdyb3VwLT5hZGRyOworCQkJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCBicl9pcF9saXN0KTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChicl9tdWx0aWNhc3RfbGlzdF9hZGphY2VudCk7CisKKy8qKgorICogYnJfbXVsdGljYXN0X2hhc19xdWVyaWVyX2FkamFjZW50IC0gQ2hlY2tzIGZvciBhIHF1ZXJpZXIgYmVoaW5kIGEgYnJpZGdlIHBvcnQKKyAqIEBkZXY6IFRoZSBicmlkZ2UgcG9ydCBhZGphY2VudCB0byB3aGljaCB0byBjaGVjayBmb3IgYSBxdWVyaWVyCisgKiBAcHJvdG86IFRoZSBwcm90b2NvbCBmYW1pbHkgdG8gY2hlY2sgZm9yOiBJR01QIC0+IEVUSF9QX0lQLCBNTEQgLT4gRVRIX1BfSVBWNgorICoKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBpbnRlcmZhY2UgaGFzIGEgYnJpZGdlIG9uIHRvcCBhbmQgaWYgc28gcmV0dXJucworICogdHJ1ZSBpZiBhIHNlbGVjdGVkIHF1ZXJpZXIgaXMgYmVoaW5kIG9uZSBvZiB0aGUgb3RoZXIgcG9ydHMgb2YgdGhpcworICogYnJpZGdlLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAqLworYm9vbCBicl9tdWx0aWNhc3RfaGFzX3F1ZXJpZXJfYWRqYWNlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByb3RvKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0OworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCFicl9wb3J0X2V4aXN0cyhkZXYpKQorCQlnb3RvIHVubG9jazsKKworCXBvcnQgPSBicl9wb3J0X2dldF9yY3UoZGV2KTsKKwlpZiAoIXBvcnQgfHwgIXBvcnQtPmJyKQorCQlnb3RvIHVubG9jazsKKworCWJyID0gcG9ydC0+YnI7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBFVEhfUF9JUDoKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZici0+aXA0X290aGVyX3F1ZXJ5LnRpbWVyKSB8fAorCQkgICAgcmN1X2RlcmVmZXJlbmNlKGJyLT5pcDRfcXVlcmllci5wb3J0KSA9PSBwb3J0KQorCQkJZ290byB1bmxvY2s7CisJCWJyZWFrOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJY2FzZSBFVEhfUF9JUFY2OgorCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmJyLT5pcDZfb3RoZXJfcXVlcnkudGltZXIpIHx8CisJCSAgICByY3VfZGVyZWZlcmVuY2UoYnItPmlwNl9xdWVyaWVyLnBvcnQpID09IHBvcnQpCisJCQlnb3RvIHVubG9jazsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlnb3RvIHVubG9jazsKKwl9CisKKwlyZXQgPSB0cnVlOwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChicl9tdWx0aWNhc3RfaGFzX3F1ZXJpZXJfYWRqYWNlbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggMmFjZjdmYS4uYTYxNTI2NCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC01MzUsNyArNTM1LDcgQEAKIAlpZiAoYnJuZl9wYXNzX3ZsYW5faW5kZXYgPT0gMCB8fCAhdmxhbl90eF90YWdfcHJlc2VudChza2IpKQogCQlyZXR1cm4gYnI7CiAKLQl2bGFuID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoYnIsIHNrYi0+dmxhbl9wcm90bywKKwl2bGFuID0gX192bGFuX2ZpbmRfZGV2X2RlZXBfcmN1KGJyLCBza2ItPnZsYW5fcHJvdG8sCiAJCQkJICAgIHZsYW5fdHhfdGFnX2dldChza2IpICYgVkxBTl9WSURfTUFTSyk7CiAKIAlyZXR1cm4gdmxhbiA/IHZsYW4gOiBicjsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKaW5kZXggZTg4NDRkOS4uMjZlZGI1MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKQEAgLTMyOCw2ICszMjgsNyBAQAogc3RhdGljIGludCBicl9zZXRwb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBubGF0dHIgKnRiW10pCiB7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIG9sZF9mbGFncyA9IHAtPmZsYWdzOwogCiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfTU9ERSwgQlJfSEFJUlBJTl9NT0RFKTsKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9HVUFSRCwgQlJfQlBEVV9HVUFSRCk7CkBAIC0zNTMsNiArMzU0LDggQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQorCisJYnJfcG9ydF9mbGFnc19jaGFuZ2UocCwgb2xkX2ZsYWdzIF4gcC0+ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jIGIvbmV0L2JyaWRnZS9icl9ub3RpZnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5OGRkMS4uMDAwMDAwMAotLS0gYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKglEZXZpY2UgZXZlbnQgaGFuZGxpbmcKLSAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQotICoKLSAqCUF1dGhvcnM6Ci0gKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KLSNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgotCi0jaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgotCi1zdGF0aWMgaW50IGJyX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKTsKLQotc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJyX2RldmljZV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGJyX2RldmljZV9ldmVudAotfTsKLQotLyoKLSAqIEhhbmRsZSBjaGFuZ2VzIGluIHN0YXRlIG9mIG5ldHdvcmsgZGV2aWNlcyBlbnNsYXZlZCB0byBhIGJyaWRnZS4KLSAqCi0gKiBOb3RlOiBkb24ndCBjYXJlIGFib3V0IHVwL2Rvd24gaWYgYnJpZGdlIGl0c2VsZiBpcyBkb3duLCBiZWNhdXNlCi0gKiAgICAgcG9ydCBzdGF0ZSBpcyBjaGVja2VkIHdoZW4gYnJpZGdlIGlzIGJyb3VnaHQgdXAuCi0gKi8KLXN0YXRpYyBpbnQgYnJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyOwotCWJvb2wgY2hhbmdlZF9hZGRyOwotCWludCBlcnI7Ci0KLQkvKiByZWdpc3RlciBvZiBicmlkZ2UgY29tcGxldGVkLCBhZGQgc3lzZnMgZW50cmllcyAqLwotCWlmICgoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpICYmIGV2ZW50ID09IE5FVERFVl9SRUdJU1RFUikgewotCQlicl9zeXNmc19hZGRicihkZXYpOwotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQotCi0JLyogbm90IGEgcG9ydCBvZiBhIGJyaWRnZSAqLwotCXAgPSBicl9wb3J0X2dldF9ydG5sKGRldik7Ci0JaWYgKCFwKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQliciA9IHAtPmJyOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKLQkJZGV2X3NldF9tdHUoYnItPmRldiwgYnJfbWluX210dShicikpOwotCQlicmVhazsKLQotCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6Ci0JCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwotCQlicl9mZGJfY2hhbmdlYWRkcihwLCBkZXYtPmRldl9hZGRyKTsKLQkJY2hhbmdlZF9hZGRyID0gYnJfc3RwX3JlY2FsY3VsYXRlX2JyaWRnZV9pZChicik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7Ci0KLQkJaWYgKGNoYW5nZWRfYWRkcikKLQkJCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfQ0hBTkdFQUREUiwgYnItPmRldik7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIE5FVERFVl9DSEFOR0U6Ci0JCWJyX3BvcnRfY2Fycmllcl9jaGVjayhwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5FVERFVl9GRUFUX0NIQU5HRToKLQkJbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhici0+ZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5FVERFVl9ET1dOOgotCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKLQkJaWYgKGJyLT5kZXYtPmZsYWdzICYgSUZGX1VQKQotCQkJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5FVERFVl9VUDoKLQkJaWYgKG5ldGlmX3J1bm5pbmcoYnItPmRldikgJiYgbmV0aWZfb3Blcl91cChkZXYpKSB7Ci0JCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKLQkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgotCQlicl9kZWxfaWYoYnIsIGRldik7Ci0JCWJyZWFrOwotCi0JY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKLQkJZXJyID0gYnJfc3lzZnNfcmVuYW1laWYocCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOwotCQlicmVhazsKLQotCWNhc2UgTkVUREVWX1BSRV9UWVBFX0NIQU5HRToKLQkJLyogRm9yYmlkIHVuZGVybGF5aW5nIGRldmljZSB0byBjaGFuZ2UgaXRzIHR5cGUuICovCi0JCXJldHVybiBOT1RJRllfQkFEOwotCi0JY2FzZSBORVRERVZfUkVTRU5EX0lHTVA6Ci0JCS8qIFByb3BhZ2F0ZSB0byBtYXN0ZXIgZGV2aWNlICovCi0JCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhldmVudCwgYnItPmRldik7Ci0JCWJyZWFrOwotCX0KLQotCS8qIEV2ZW50cyB0aGF0IG1heSBjYXVzZSBzcGFubmluZyB0cmVlIHRvIHJlZnJlc2ggKi8KLQlpZiAoZXZlbnQgPT0gTkVUREVWX0NIQU5HRUFERFIgfHwgZXZlbnQgPT0gTkVUREVWX1VQIHx8Ci0JICAgIGV2ZW50ID09IE5FVERFVl9DSEFOR0UgfHwgZXZlbnQgPT0gTkVUREVWX0RPV04pCi0JCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwotCi0JcmV0dXJuIE5PVElGWV9ET05FOwotfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmggYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAppbmRleCA1OWQzYTg1Li4yM2NhZjViIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaApAQCAtMzUsNiArMzUsOCBAQAogI2RlZmluZSBCUl9HUk9VUEZXRF9ERUZBVUxUCTAKIC8qIERvbid0IGFsbG93IGZvcndhcmRpbmcgY29udHJvbCBwcm90b2NvbHMgbGlrZSBTVFAgYW5kIExMRFAgKi8KICNkZWZpbmUgQlJfR1JPVVBGV0RfUkVTVFJJQ1RFRAkweDQwMDd1CisvKiBUaGUgTmVhcmVzdCBDdXN0b21lciBCcmlkZ2UgR3JvdXAgQWRkcmVzcywgMDEtODAtQzItMDAtMDAtWzAwLDBCLDBDLDBELDBGXSAqLworI2RlZmluZSBCUl9HUk9VUEZXRF84MDIxQUQJMHhCODAxdQogCiAvKiBQYXRoIHRvIHVzZXJtb2RlIHNwYW5uaW5nIHRyZWUgcHJvZ3JhbSAqLwogI2RlZmluZSBCUl9TVFBfUFJPRwkiL3NiaW4vYnJpZGdlLXN0cCIKQEAgLTU0LDMwICs1NiwyNCBAQAogCXVuc2lnbmVkIGNoYXIJYWRkcltFVEhfQUxFTl07CiB9OwogCi1zdHJ1Y3QgYnJfaXAKLXsKLQl1bmlvbiB7Ci0JCV9fYmUzMglpcDQ7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQkJc3RydWN0IGluNl9hZGRyIGlwNjsKLSNlbmRpZgotCX0gdTsKLQlfX2JlMTYJCXByb3RvOwotCV9fdTE2CQl2aWQ7Ci19OwotCiAjaWZkZWYgQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HCiAvKiBvdXIgb3duIHF1ZXJpZXIgKi8KLXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcnkgeworc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkgewogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwogCXUzMgkJCXN0YXJ0dXBfc2VudDsKIH07CiAKIC8qIG90aGVyIHF1ZXJpZXIgKi8KLXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcmllciB7CitzdHJ1Y3QgYnJpZGdlX21jYXN0X290aGVyX3F1ZXJ5IHsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7CiAJdW5zaWduZWQgbG9uZwkJCWRlbGF5X3RpbWU7CiB9OworCisvKiBzZWxlY3RlZCBxdWVyaWVyICovCitzdHJ1Y3QgYnJpZGdlX21jYXN0X3F1ZXJpZXIgeworCXN0cnVjdCBicl9pcCBhZGRyOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgX19yY3UJKnBvcnQ7Cit9OwogI2VuZGlmCiAKIHN0cnVjdCBuZXRfcG9ydF92bGFucyB7CkBAIC0xNzQsMTEgKzE3MCwxMyBAQAogI2RlZmluZSBCUl9BRE1JTl9DT1NUCQkweDAwMDAwMDEwCiAjZGVmaW5lIEJSX0xFQVJOSU5HCQkweDAwMDAwMDIwCiAjZGVmaW5lIEJSX0ZMT09ECQkweDAwMDAwMDQwCisjZGVmaW5lIEJSX0FVVE9fTUFTSyAoQlJfRkxPT0QgfCBCUl9MRUFSTklORykKKyNkZWZpbmUgQlJfUFJPTUlTQwkJMHgwMDAwMDA4MAogCiAjaWZkZWYgQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HCi0Jc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyeQlpcDRfcXVlcnk7CisJc3RydWN0IGJyaWRnZV9tY2FzdF9vd25fcXVlcnkJaXA0X293bl9xdWVyeTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcnkJaXA2X3F1ZXJ5OworCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5CWlwNl9vd25fcXVlcnk7CiAjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfSVBWNikgKi8KIAl1bnNpZ25lZCBjaGFyCQkJbXVsdGljYXN0X3JvdXRlcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJbXVsdGljYXN0X3JvdXRlcl90aW1lcjsKQEAgLTE5OCw2ICsxOTYsOSBAQAogI2VuZGlmCiB9OwogCisjZGVmaW5lIGJyX2F1dG9fcG9ydChwKSAoKHApLT5mbGFncyAmIEJSX0FVVE9fTUFTSykKKyNkZWZpbmUgYnJfcHJvbWlzY19wb3J0KHApICgocCktPmZsYWdzICYgQlJfUFJPTUlTQykKKwogI2RlZmluZSBicl9wb3J0X2V4aXN0cyhkZXYpIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqYnJfcG9ydF9nZXRfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMjcsNiArMjI4LDcgQEAKIAlib29sCQkJCW5mX2NhbGxfYXJwdGFibGVzOwogI2VuZGlmCiAJdTE2CQkJCWdyb3VwX2Z3ZF9tYXNrOworCXUxNgkJCQlncm91cF9md2RfbWFza19yZXF1aXJlZDsKIAogCS8qIFNUUCAqLwogCWJyaWRnZV9pZAkJCWRlc2lnbmF0ZWRfcm9vdDsKQEAgLTI0MSw2ICsyNDMsNyBAQAogCXVuc2lnbmVkIGxvbmcJCQlicmlkZ2VfZm9yd2FyZF9kZWxheTsKIAogCXU4CQkJCWdyb3VwX2FkZHJbRVRIX0FMRU5dOworCWJvb2wJCQkJZ3JvdXBfYWRkcl9zZXQ7CiAJdTE2CQkJCXJvb3RfcG9ydDsKIAogCWVudW0gewpAQCAtMjc3LDExICsyODAsMTMgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZAkJcm91dGVyX2xpc3Q7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJbXVsdGljYXN0X3JvdXRlcl90aW1lcjsKKwlzdHJ1Y3QgYnJpZGdlX21jYXN0X290aGVyX3F1ZXJ5CWlwNF9vdGhlcl9xdWVyeTsKKwlzdHJ1Y3QgYnJpZGdlX21jYXN0X293bl9xdWVyeQlpcDRfb3duX3F1ZXJ5OwogCXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcmllcglpcDRfcXVlcmllcjsKLQlzdHJ1Y3QgYnJpZGdlX21jYXN0X3F1ZXJ5CWlwNF9xdWVyeTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3RoZXJfcXVlcnkJaXA2X290aGVyX3F1ZXJ5OworCXN0cnVjdCBicmlkZ2VfbWNhc3Rfb3duX3F1ZXJ5CWlwNl9vd25fcXVlcnk7CiAJc3RydWN0IGJyaWRnZV9tY2FzdF9xdWVyaWVyCWlwNl9xdWVyaWVyOwotCXN0cnVjdCBicmlkZ2VfbWNhc3RfcXVlcnkJaXA2X3F1ZXJ5OwogI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpICovCiAjZW5kaWYKIApAQCAtMjkwLDggKzI5NSwxMCBAQAogCXN0cnVjdCB0aW1lcl9saXN0CQl0b3BvbG9neV9jaGFuZ2VfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJCWdjX3RpbWVyOwogCXN0cnVjdCBrb2JqZWN0CQkJKmlmb2JqOworCXUzMgkJCQlhdXRvX2NudDsKICNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HCiAJdTgJCQkJdmxhbl9lbmFibGVkOworCV9fYmUxNgkJCQl2bGFuX3Byb3RvOwogCXN0cnVjdCBuZXRfcG9ydF92bGFucyBfX3JjdQkqdmxhbl9pbmZvOwogI2VuZGlmCiB9OwpAQCAtMzI3LDggKzMzNCw2IEBACiAjZGVmaW5lIGJyX2RlYnVnKGJyLCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAogCXByX2RlYnVnKCIlczogIiBmb3JtYXQsICAoYnIpLT5kZXYtPm5hbWUsICMjYXJncykKIAotZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayBicl9kZXZpY2Vfbm90aWZpZXI7Ci0KIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwogc3RhdGljIGlubGluZSBpbnQgYnJfaXNfcm9vdF9icmlkZ2UoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQogewpAQCAtMzk1LDYgKzQwMCw4IEBACiAJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiBubGhfZmxhZ3MpOwogaW50IGJyX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlkeCk7CitpbnQgYnJfZmRiX3N5bmNfc3RhdGljKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7Cit2b2lkIGJyX2ZkYl91bnN5bmNfc3RhdGljKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CiAKIC8qIGJyX2ZvcndhcmQuYyAqLwogdm9pZCBicl9kZWxpdmVyKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnRvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTQxNSw2ICs0MjIsOCBAQAogaW50IGJyX21pbl9tdHUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKIG5ldGRldl9mZWF0dXJlc190IGJyX2ZlYXR1cmVzX3JlY29tcHV0ZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKK3ZvaWQgYnJfcG9ydF9mbGFnc19jaGFuZ2Uoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK3ZvaWQgYnJfbWFuYWdlX3Byb21pc2Moc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKIAogLyogYnJfaW5wdXQuYyAqLwogaW50IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC00ODUsNyArNDk0LDcgQEAKIAogc3RhdGljIGlubGluZSBib29sCiBfX2JyX211bHRpY2FzdF9xdWVyaWVyX2V4aXN0cyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQkgICAgICBzdHJ1Y3QgYnJpZGdlX21jYXN0X3F1ZXJpZXIgKnF1ZXJpZXIpCisJCQkgICAgICBzdHJ1Y3QgYnJpZGdlX21jYXN0X290aGVyX3F1ZXJ5ICpxdWVyaWVyKQogewogCXJldHVybiB0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKHF1ZXJpZXItPmRlbGF5X3RpbWUpICYmCiAJICAgICAgIChici0+bXVsdGljYXN0X3F1ZXJpZXIgfHwgdGltZXJfcGVuZGluZygmcXVlcmllci0+dGltZXIpKTsKQEAgLTQ5NiwxMCArNTA1LDEwIEBACiB7CiAJc3dpdGNoIChldGgtPmhfcHJvdG8pIHsKIAljYXNlIChodG9ucyhFVEhfUF9JUCkpOgotCQlyZXR1cm4gX19icl9tdWx0aWNhc3RfcXVlcmllcl9leGlzdHMoYnIsICZici0+aXA0X3F1ZXJpZXIpOworCQlyZXR1cm4gX19icl9tdWx0aWNhc3RfcXVlcmllcl9leGlzdHMoYnIsICZici0+aXA0X290aGVyX3F1ZXJ5KTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgKGh0b25zKEVUSF9QX0lQVjYpKToKLQkJcmV0dXJuIF9fYnJfbXVsdGljYXN0X3F1ZXJpZXJfZXhpc3RzKGJyLCAmYnItPmlwNl9xdWVyaWVyKTsKKwkJcmV0dXJuIF9fYnJfbXVsdGljYXN0X3F1ZXJpZXJfZXhpc3RzKGJyLCAmYnItPmlwNl9vdGhlcl9xdWVyeSk7CiAjZW5kaWYKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CkBAIC01ODksNyArNTk4LDEwIEBACiBpbnQgYnJfdmxhbl9kZWxldGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MTYgdmlkKTsKIHZvaWQgYnJfdmxhbl9mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwogYm9vbCBicl92bGFuX2ZpbmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MTYgdmlkKTsKK3ZvaWQgYnJfcmVjYWxjdWxhdGVfZndkX21hc2soc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKIGludCBicl92bGFuX2ZpbHRlcl90b2dnbGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCk7CitpbnQgYnJfdmxhbl9zZXRfcHJvdG8oc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCk7Cit2b2lkIGJyX3ZsYW5faW5pdChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwogaW50IG5icF92bGFuX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkLCB1MTYgZmxhZ3MpOwogaW50IG5icF92bGFuX2RlbGV0ZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LCB1MTYgdmlkKTsKIHZvaWQgbmJwX3ZsYW5fZmx1c2goc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCk7CkBAIC02MzMsNiArNjQ1LDEwIEBACiAJcmV0dXJuIHYtPnB2aWQgPzogVkxBTl9OX1ZJRDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYnJfdmxhbl9lbmFibGVkKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlyZXR1cm4gYnItPnZsYW5fZW5hYmxlZDsKK30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGJvb2wgYnJfYWxsb3dlZF9pbmdyZXNzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X3BvcnRfdmxhbnMgKnYsCkBAIC02ODEsNiArNjk3LDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYnJfcmVjYWxjdWxhdGVfZndkX21hc2soc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnJfdmxhbl9pbml0KHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKK30KKwogc3RhdGljIGlubGluZSBpbnQgbmJwX3ZsYW5fYWRkKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsIHUxNiB2aWQsIHUxNiBmbGFncykKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC03MTksNiArNzQzLDExIEBACiB7CiAJcmV0dXJuIFZMQU5fTl9WSUQ7CS8qIFJldHVybnMgaW52YWxpZCB2aWQgKi8KIH0KKworc3RhdGljIGlubGluZSBpbnQgYnJfdmxhbl9lbmFibGVkKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAvKiBicl9uZXRmaWx0ZXIuYyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCmluZGV4IDhkYWM2NTU1Li5jOWUyNTcyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCkBAIC0zMTIsMTAgKzMxMiwxOSBAQAogCSAgICBuZXdfYWRkcls1XSA9PSAzKQkJLyogODAyLjFYIFBBRSBhZGRyZXNzICovCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKCFydG5sX3RyeWxvY2soKSkKKwkJcmV0dXJuIHJlc3RhcnRfc3lzY2FsbCgpOworCiAJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJYnItPmdyb3VwX2FkZHJbaV0gPSBuZXdfYWRkcltpXTsKIAlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCisJYnItPmdyb3VwX2FkZHJfc2V0ID0gdHJ1ZTsKKwlicl9yZWNhbGN1bGF0ZV9md2RfbWFzayhicik7CisKKwlydG5sX3VubG9jaygpOworCiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtNzAwLDYgKzcwOSwyMiBAQAogCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShkLCBidWYsIGxlbiwgYnJfdmxhbl9maWx0ZXJfdG9nZ2xlKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyh2bGFuX2ZpbHRlcmluZyk7CisKK3N0YXRpYyBzc2l6ZV90IHZsYW5fcHJvdG9jb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUjMDZ4XG4iLCBudG9ocyhici0+dmxhbl9wcm90bykpOworfQorCitzdGF0aWMgc3NpemVfdCB2bGFuX3Byb3RvY29sX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShkLCBidWYsIGxlbiwgYnJfdmxhbl9zZXRfcHJvdG8pOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKHZsYW5fcHJvdG9jb2wpOwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpicmlkZ2VfYXR0cnNbXSA9IHsKQEAgLTc0NSw2ICs3NzAsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORwogCSZkZXZfYXR0cl92bGFuX2ZpbHRlcmluZy5hdHRyLAorCSZkZXZfYXR0cl92bGFuX3Byb3RvY29sLmF0dHIsCiAjZW5kaWYKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCmluZGV4IGRkNTk1YmQuLmU1NjFjZDUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKQEAgLTQxLDIwICs0MSwzMCBAQAogfQkJCQkJCQkJXAogc3RhdGljIGludCBzdG9yZV8jI19uYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHVuc2lnbmVkIGxvbmcgdikgXAogewkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwLT5mbGFnczsJCQkJXAotCWlmICh2KQkJCQkJCQlcCi0JCWZsYWdzIHw9IF9tYXNrOwkJCQkJXAotCWVsc2UJCQkJCQkJXAotCQlmbGFncyAmPSB+X21hc2s7CQkJCVwKLQlpZiAoZmxhZ3MgIT0gcC0+ZmxhZ3MpIHsJCQkJXAotCQlwLT5mbGFncyA9IGZsYWdzOwkJCQlcCi0JCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwkJXAotCX0JCQkJCQkJXAotCXJldHVybiAwOwkJCQkJCVwKKwlyZXR1cm4gc3RvcmVfZmxhZyhwLCB2LCBfbWFzayk7CQkJCVwKIH0JCQkJCQkJCVwKIHN0YXRpYyBCUlBPUlRfQVRUUihfbmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAogCQkgICBzaG93XyMjX25hbWUsIHN0b3JlXyMjX25hbWUpCiAKK3N0YXRpYyBpbnQgc3RvcmVfZmxhZyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCB1bnNpZ25lZCBsb25nIHYsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSBwLT5mbGFnczsKKworCWlmICh2KQorCQlmbGFncyB8PSBtYXNrOworCWVsc2UKKwkJZmxhZ3MgJj0gfm1hc2s7CisKKwlpZiAoZmxhZ3MgIT0gcC0+ZmxhZ3MpIHsKKwkJcC0+ZmxhZ3MgPSBmbGFnczsKKwkJYnJfcG9ydF9mbGFnc19jaGFuZ2UocCwgbWFzayk7CisJCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOworCX0KKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHNzaXplX3Qgc2hvd19wYXRoX2Nvc3Qoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQogewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl92bGFuLmMgYi9uZXQvYnJpZGdlL2JyX3ZsYW4uYwppbmRleCA1ZmVlMmZlLi4yYjI3NzRmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3ZsYW4uYworKysgYi9uZXQvYnJpZGdlL2JyX3ZsYW4uYwpAQCAtNjAsNyArNjAsNyBAQAogCQkgKiB0aGF0IGV2ZXIgY2hhbmdlcyB0aGlzIGNvZGUgd2lsbCBhbGxvdyB0YWdnZWQKIAkJICogdHJhZmZpYyB0byBlbnRlciB0aGUgYnJpZGdlLgogCQkgKi8KLQkJZXJyID0gdmxhbl92aWRfYWRkKGRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOworCQllcnIgPSB2bGFuX3ZpZF9hZGQoZGV2LCBici0+dmxhbl9wcm90bywgdmlkKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtODAsNyArODAsNyBAQAogCiBvdXRfZmlsdDoKIAlpZiAocCkKLQkJdmxhbl92aWRfZGVsKGRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOworCQl2bGFuX3ZpZF9kZWwoZGV2LCBici0+dmxhbl9wcm90bywgdmlkKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC05Miw4ICs5MiwxMCBAQAogCV9fdmxhbl9kZWxldGVfcHZpZCh2LCB2aWQpOwogCWNsZWFyX2JpdCh2aWQsIHYtPnVudGFnZ2VkX2JpdG1hcCk7CiAKLQlpZiAodi0+cG9ydF9pZHgpCi0JCXZsYW5fdmlkX2RlbCh2LT5wYXJlbnQucG9ydC0+ZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIHZpZCk7CisJaWYgKHYtPnBvcnRfaWR4KSB7CisJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSB2LT5wYXJlbnQucG9ydDsKKwkJdmxhbl92aWRfZGVsKHAtPmRldiwgcC0+YnItPnZsYW5fcHJvdG8sIHZpZCk7CisJfQogCiAJY2xlYXJfYml0KHZpZCwgdi0+dmxhbl9iaXRtYXApOwogCXYtPm51bV92bGFucy0tOwpAQCAtMTU4LDcgKzE2MCw4IEBACiBib29sIGJyX2FsbG93ZWRfaW5ncmVzcyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfcG9ydF92bGFucyAqdiwKIAkJCXN0cnVjdCBza19idWZmICpza2IsIHUxNiAqdmlkKQogewotCWludCBlcnI7CisJYm9vbCB0YWdnZWQ7CisJX19iZTE2IHByb3RvOwogCiAJLyogSWYgVkxBTiBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQgb24gdGhlIGJyaWRnZSwgYWxsIHBhY2tldHMgYXJlCiAJICogcGVybWl0dGVkLgpAQCAtMTcyLDE5ICsxNzUsNDEgQEAKIAlpZiAoIXYpCiAJCWdvdG8gZHJvcDsKIAorCXByb3RvID0gYnItPnZsYW5fcHJvdG87CisKIAkvKiBJZiB2bGFuIHR4IG9mZmxvYWQgaXMgZGlzYWJsZWQgb24gYnJpZGdlIGRldmljZSBhbmQgZnJhbWUgd2FzCiAJICogc2VudCBmcm9tIHZsYW4gZGV2aWNlIG9uIHRoZSBicmlkZ2UgZGV2aWNlLCBpdCBkb2VzIG5vdCBoYXZlCiAJICogSFcgYWNjZWxlcmF0ZWQgdmxhbiB0YWcuCiAJICovCiAJaWYgKHVubGlrZWx5KCF2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikgJiYKLQkJICAgICAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwKLQkJICAgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSkpIHsKKwkJICAgICBza2ItPnByb3RvY29sID09IHByb3RvKSkgewogCQlza2IgPSB2bGFuX3VudGFnKHNrYik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQllcnIgPSBicl92bGFuX2dldF90YWcoc2tiLCB2aWQpOworCWlmICghYnJfdmxhbl9nZXRfdGFnKHNrYiwgdmlkKSkgeworCQkvKiBUYWdnZWQgZnJhbWUgKi8KKwkJaWYgKHNrYi0+dmxhbl9wcm90byAhPSBwcm90bykgeworCQkJLyogUHJvdG9jb2wtbWlzbWF0Y2gsIGVtcHR5IG91dCB2bGFuX3RjaSBmb3IgbmV3IHRhZyAqLworCQkJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJCQlza2IgPSBfX3ZsYW5fcHV0X3RhZyhza2IsIHNrYi0+dmxhbl9wcm90bywKKwkJCQkJICAgICB2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisJCQlpZiAodW5saWtlbHkoIXNrYikpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKKwkJCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CisJCQkqdmlkID0gMDsKKwkJCXRhZ2dlZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJdGFnZ2VkID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVudGFnZ2VkIGZyYW1lICovCisJCXRhZ2dlZCA9IGZhbHNlOworCX0KKwogCWlmICghKnZpZCkgewogCQl1MTYgcHZpZCA9IGJyX2dldF9wdmlkKHYpOwogCkBAIC0xOTksOSArMjI0LDkgQEAKIAkJICogaW5ncmVzcyBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIGJlbG9uZyB0byB0aGlzIHZsYW4uCiAJCSAqLwogCQkqdmlkID0gcHZpZDsKLQkJaWYgKGxpa2VseShlcnIpKQorCQlpZiAobGlrZWx5KCF0YWdnZWQpKQogCQkJLyogVW50YWdnZWQgRnJhbWUuICovCi0JCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLCBwdmlkKTsKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBwcm90bywgcHZpZCk7CiAJCWVsc2UKIAkJCS8qIFByaW9yaXR5LXRhZ2dlZCBGcmFtZS4KIAkJCSAqIEF0IHRoaXMgcG9pbnQsIFdlIGtub3cgdGhhdCBza2ItPnZsYW5fdGNpIGhhZApAQCAtMjU0LDcgKzI3OSw5IEBACiAJaWYgKCF2KQogCQlyZXR1cm4gZmFsc2U7CiAKLQlicl92bGFuX2dldF90YWcoc2tiLCB2aWQpOworCWlmICghYnJfdmxhbl9nZXRfdGFnKHNrYiwgdmlkKSAmJiBza2ItPnZsYW5fcHJvdG8gIT0gYnItPnZsYW5fcHJvdG8pCisJCSp2aWQgPSAwOworCiAJaWYgKCEqdmlkKSB7CiAJCSp2aWQgPSBicl9nZXRfcHZpZCh2KTsKIAkJaWYgKCp2aWQgPT0gVkxBTl9OX1ZJRCkKQEAgLTM1MSw2ICszNzgsMzMgQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKKy8qIE11c3QgYmUgcHJvdGVjdGVkIGJ5IFJUTkwuICovCitzdGF0aWMgdm9pZCByZWNhbGN1bGF0ZV9ncm91cF9hZGRyKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlpZiAoYnItPmdyb3VwX2FkZHJfc2V0KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlpZiAoIWJyLT52bGFuX2VuYWJsZWQgfHwgYnItPnZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCS8qIEJyaWRnZSBHcm91cCBBZGRyZXNzICovCisJCWJyLT5ncm91cF9hZGRyWzVdID0gMHgwMDsKKwl9IGVsc2UgeyAvKiB2bGFuX2VuYWJsZWQgJiYgRVRIX1BfODAyMUFEICovCisJCS8qIFByb3ZpZGVyIEJyaWRnZSBHcm91cCBBZGRyZXNzICovCisJCWJyLT5ncm91cF9hZGRyWzVdID0gMHgwODsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKK30KKworLyogTXVzdCBiZSBwcm90ZWN0ZWQgYnkgUlROTC4gKi8KK3ZvaWQgYnJfcmVjYWxjdWxhdGVfZndkX21hc2soc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWlmICghYnItPnZsYW5fZW5hYmxlZCB8fCBici0+dmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpCisJCWJyLT5ncm91cF9md2RfbWFza19yZXF1aXJlZCA9IEJSX0dST1VQRldEX0RFRkFVTFQ7CisJZWxzZSAvKiB2bGFuX2VuYWJsZWQgJiYgRVRIX1BfODAyMUFEICovCisJCWJyLT5ncm91cF9md2RfbWFza19yZXF1aXJlZCA9IEJSX0dST1VQRldEXzgwMjFBRCAmCisJCQkJCSAgICAgIH4oMXUgPDwgYnItPmdyb3VwX2FkZHJbNV0pOworfQorCiBpbnQgYnJfdmxhbl9maWx0ZXJfdG9nZ2xlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJaWYgKCFydG5sX3RyeWxvY2soKSkKQEAgLTM2MCwxMiArNDE0LDg4IEBACiAJCWdvdG8gdW5sb2NrOwogCiAJYnItPnZsYW5fZW5hYmxlZCA9IHZhbDsKKwlicl9tYW5hZ2VfcHJvbWlzYyhicik7CisJcmVjYWxjdWxhdGVfZ3JvdXBfYWRkcihicik7CisJYnJfcmVjYWxjdWxhdGVfZndkX21hc2soYnIpOwogCiB1bmxvY2s6CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIH0KIAoraW50IGJyX3ZsYW5fc2V0X3Byb3RvKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlzdHJ1Y3QgbmV0X3BvcnRfdmxhbnMgKnB2OworCV9fYmUxNiBwcm90bywgb2xkcHJvdG87CisJdTE2IHZpZCwgZXJydmlkOworCisJaWYgKHZhbCAhPSBFVEhfUF84MDIxUSAmJiB2YWwgIT0gRVRIX1BfODAyMUFEKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmICghcnRubF90cnlsb2NrKCkpCisJCXJldHVybiByZXN0YXJ0X3N5c2NhbGwoKTsKKworCXByb3RvID0gaHRvbnModmFsKTsKKwlpZiAoYnItPnZsYW5fcHJvdG8gPT0gcHJvdG8pCisJCWdvdG8gdW5sb2NrOworCisJLyogQWRkIFZMQU5zIGZvciB0aGUgbmV3IHByb3RvIHRvIHRoZSBkZXZpY2UgZmlsdGVyLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJcHYgPSBydG5sX2RlcmVmZXJlbmNlKHAtPnZsYW5faW5mbyk7CisJCWlmICghcHYpCisJCQljb250aW51ZTsKKworCQlmb3JfZWFjaF9zZXRfYml0KHZpZCwgcHYtPnZsYW5fYml0bWFwLCBWTEFOX05fVklEKSB7CisJCQllcnIgPSB2bGFuX3ZpZF9hZGQocC0+ZGV2LCBwcm90bywgdmlkKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJfZmlsdDsKKwkJfQorCX0KKworCW9sZHByb3RvID0gYnItPnZsYW5fcHJvdG87CisJYnItPnZsYW5fcHJvdG8gPSBwcm90bzsKKworCXJlY2FsY3VsYXRlX2dyb3VwX2FkZHIoYnIpOworCWJyX3JlY2FsY3VsYXRlX2Z3ZF9tYXNrKGJyKTsKKworCS8qIERlbGV0ZSBWTEFOcyBmb3IgdGhlIG9sZCBwcm90byBmcm9tIHRoZSBkZXZpY2UgZmlsdGVyLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJcHYgPSBydG5sX2RlcmVmZXJlbmNlKHAtPnZsYW5faW5mbyk7CisJCWlmICghcHYpCisJCQljb250aW51ZTsKKworCQlmb3JfZWFjaF9zZXRfYml0KHZpZCwgcHYtPnZsYW5fYml0bWFwLCBWTEFOX05fVklEKQorCQkJdmxhbl92aWRfZGVsKHAtPmRldiwgb2xkcHJvdG8sIHZpZCk7CisJfQorCit1bmxvY2s6CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gZXJyOworCitlcnJfZmlsdDoKKwllcnJ2aWQgPSB2aWQ7CisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIHB2LT52bGFuX2JpdG1hcCwgZXJydmlkKQorCQl2bGFuX3ZpZF9kZWwocC0+ZGV2LCBwcm90bywgdmlkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlwdiA9IHJ0bmxfZGVyZWZlcmVuY2UocC0+dmxhbl9pbmZvKTsKKwkJaWYgKCFwdikKKwkJCWNvbnRpbnVlOworCisJCWZvcl9lYWNoX3NldF9iaXQodmlkLCBwdi0+dmxhbl9iaXRtYXAsIFZMQU5fTl9WSUQpCisJCQl2bGFuX3ZpZF9kZWwocC0+ZGV2LCBwcm90bywgdmlkKTsKKwl9CisKKwlnb3RvIHVubG9jazsKK30KKwordm9pZCBicl92bGFuX2luaXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWJyLT52bGFuX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOworfQorCiAvKiBNdXN0IGJlIHByb3RlY3RlZCBieSBSVE5MLgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCB2aWQgaW4gcmFuZ2UgZnJvbSAxIHRvIDQwOTQgaW5jbHVzaXZlLgogICovCkBAIC00MzIsNyArNTYyLDcgQEAKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIHB2LT52bGFuX2JpdG1hcCwgVkxBTl9OX1ZJRCkKLQkJdmxhbl92aWRfZGVsKHBvcnQtPmRldiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2aWQpOworCQl2bGFuX3ZpZF9kZWwocG9ydC0+ZGV2LCBwb3J0LT5ici0+dmxhbl9wcm90bywgdmlkKTsKIAogCV9fdmxhbl9mbHVzaChwdik7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCA1Y2E3NGEwLi42MjlkYzc3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTIsMTQgKzIsMjMgQEAKICMgQnJpZGdlIG5ldGZpbHRlciBjb25maWd1cmF0aW9uCiAjCiAjCi1jb25maWcgTkZfVEFCTEVTX0JSSURHRQotCWRlcGVuZHMgb24gTkZfVEFCTEVTCittZW51Y29uZmlnIE5GX1RBQkxFU19CUklER0UKKwlkZXBlbmRzIG9uIEJSSURHRSAmJiBORVRGSUxURVIgJiYgTkZfVEFCTEVTCiAJdHJpc3RhdGUgIkV0aGVybmV0IEJyaWRnZSBuZl90YWJsZXMgc3VwcG9ydCIKIAoraWYgTkZfVEFCTEVTX0JSSURHRQorCitjb25maWcgTkZUX0JSSURHRV9NRVRBCisJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZSBicmlkZ2UgbWV0YSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZUX01FVEEKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgYnJpZGdlIGRlZGljYXRlZCBtZXRhIGtleS4KKworZW5kaWYgIyBORl9UQUJMRVNfQlJJREdFCisKIG1lbnVjb25maWcgQlJJREdFX05GX0VCVEFCTEVTCiAJdHJpc3RhdGUgIkV0aGVybmV0IEJyaWRnZSB0YWJsZXMgKGVidGFibGVzKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFICYmIE5FVEZJTFRFUgotCXNlbGVjdCBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gQlJJREdFICYmIE5FVEZJTFRFUiAmJiBORVRGSUxURVJfWFRBQkxFUwogCWhlbHAKIAkgIGVidGFibGVzIGlzIGEgZ2VuZXJhbCwgZXh0ZW5zaWJsZSBmcmFtZS9wYWNrZXQgaWRlbnRpZmljYXRpb24KIAkgIGZyYW1ld29yay4gU2F5ICdZJyBvciAnTScgaGVyZSBpZiB5b3Ugd2FudCB0byBkbyBFdGhlcm5ldApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBlYTc2MjlmLi42ZjJmMzk0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIAogb2JqLSQoQ09ORklHX05GX1RBQkxFU19CUklER0UpICs9IG5mX3RhYmxlc19icmlkZ2Uubworb2JqLSQoQ09ORklHX05GVF9CUklER0VfTUVUQSkgICs9IG5mdF9tZXRhX2JyaWRnZS5vCiAKIG9iai0kKENPTkZJR19CUklER0VfTkZfRUJUQUJMRVMpICs9IGVidGFibGVzLm8KIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfbWV0YV9icmlkZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmg+CisKKyNpbmNsdWRlICIuLi9icl9wcml2YXRlLmgiCisKK3N0YXRpYyB2b2lkIG5mdF9tZXRhX2JyaWRnZV9nZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkJICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJY29uc3Qgc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4gPSBwa3QtPmluLCAqb3V0ID0gcGt0LT5vdXQ7CisJc3RydWN0IG5mdF9kYXRhICpkZXN0ID0gJmRhdGFbcHJpdi0+ZHJlZ107CisJY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKworCXN3aXRjaCAocHJpdi0+a2V5KSB7CisJY2FzZSBORlRfTUVUQV9CUklfSUlGTkFNRToKKwkJaWYgKGluID09IE5VTEwgfHwgKHAgPSBicl9wb3J0X2dldF9yY3UoaW4pKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2UgTkZUX01FVEFfQlJJX09JRk5BTUU6CisJCWlmIChvdXQgPT0gTlVMTCB8fCAocCA9IGJyX3BvcnRfZ2V0X3JjdShvdXQpKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCXN0cm5jcHkoKGNoYXIgKilkZXN0LT5kYXRhLCBwLT5ici0+ZGV2LT5uYW1lLCBzaXplb2YoZGVzdC0+ZGF0YSkpOworCXJldHVybjsKK291dDoKKwlyZXR1cm4gbmZ0X21ldGFfZ2V0X2V2YWwoZXhwciwgZGF0YSwgcGt0KTsKK2VycjoKKwlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKK30KKworc3RhdGljIGludCBuZnRfbWV0YV9icmlkZ2VfZ2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X21ldGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWludCBlcnI7CisKKwlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0tFWV0pKTsKKwlzd2l0Y2ggKHByaXYtPmtleSkgeworCWNhc2UgTkZUX01FVEFfQlJJX0lJRk5BTUU6CisJY2FzZSBORlRfTUVUQV9CUklfT0lGTkFNRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIG5mdF9tZXRhX2dldF9pbml0KGN0eCwgZXhwciwgdGIpOworCX0KKworCXByaXYtPmRyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0RSRUddKSk7CisJZXJyID0gbmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3Rlcihwcml2LT5kcmVnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBwcml2LT5kcmVnLCBOVUxMLCBORlRfREFUQV9WQUxVRSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9tZXRhX2JyaWRnZV90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X21ldGFfYnJpZGdlX2dldF9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9tZXRhX2JyaWRnZV90eXBlLAorCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfbWV0YSkpLAorCS5ldmFsCQk9IG5mdF9tZXRhX2JyaWRnZV9nZXRfZXZhbCwKKwkuaW5pdAkJPSBuZnRfbWV0YV9icmlkZ2VfZ2V0X2luaXQsCisJLmR1bXAJCT0gbmZ0X21ldGFfZ2V0X2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfbWV0YV9icmlkZ2Vfc2V0X29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X21ldGFfYnJpZGdlX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9tZXRhKSksCisJLmV2YWwJCT0gbmZ0X21ldGFfc2V0X2V2YWwsCisJLmluaXQJCT0gbmZ0X21ldGFfc2V0X2luaXQsCisJLmR1bXAJCT0gbmZ0X21ldGFfc2V0X2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyAqCituZnRfbWV0YV9icmlkZ2Vfc2VsZWN0X29wcyhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJaWYgKHRiW05GVEFfTUVUQV9LRVldID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKHRiW05GVEFfTUVUQV9EUkVHXSAmJiB0YltORlRBX01FVEFfU1JFR10pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKHRiW05GVEFfTUVUQV9EUkVHXSkKKwkJcmV0dXJuICZuZnRfbWV0YV9icmlkZ2VfZ2V0X29wczsKKworCWlmICh0YltORlRBX01FVEFfU1JFR10pCisJCXJldHVybiAmbmZ0X21ldGFfYnJpZGdlX3NldF9vcHM7CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9tZXRhX2JyaWRnZV90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19CUklER0UsCisJLm5hbWUgICAgICAgICAgID0gIm1ldGEiLAorCS5zZWxlY3Rfb3BzICAgICA9ICZuZnRfbWV0YV9icmlkZ2Vfc2VsZWN0X29wcywKKwkucG9saWN5ICAgICAgICAgPSBuZnRfbWV0YV9wb2xpY3ksCisJLm1heGF0dHIgICAgICAgID0gTkZUQV9NRVRBX01BWCwKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9tZXRhX2JyaWRnZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X21ldGFfYnJpZGdlX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X21ldGFfYnJpZGdlX21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X21ldGFfYnJpZGdlX3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfbWV0YV9icmlkZ2VfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X21ldGFfYnJpZGdlX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVG9tYXN6IEJ1cnN6dHlrYSA8dG9tYXN6LmJ1cnN6dHlrYUBsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0FGX0VYUFIoQUZfQlJJREdFLCAibWV0YSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9hZl9jYW4uYyBiL25ldC9jYW4vYWZfY2FuLmMKaW5kZXggYTI3ZjhhYS4uY2U4MjMzNyAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9hZl9jYW4uYworKysgYi9uZXQvY2FuL2FmX2Nhbi5jCkBAIC0zMzgsNiArMzM4LDI5IEBACiB9CiAKIC8qKgorICogZWZmaGFzaCAtIGhhc2ggZnVuY3Rpb24gZm9yIDI5IGJpdCBDQU4gaWRlbnRpZmllciByZWR1Y3Rpb24KKyAqIEBjYW5faWQ6IDI5IGJpdCBDQU4gaWRlbnRpZmllcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogIFRvIHJlZHVjZSB0aGUgbGluZWFyIHRyYXZlcnNhbCBpbiBvbmUgbGlua2VkIGxpc3Qgb2YgX3NpbmdsZV8gRUZGIENBTgorICogIGZyYW1lIHN1YnNjcmlwdGlvbnMgdGhlIDI5IGJpdCBpZGVudGlmaWVyIGlzIG1hcHBlZCB0byAxMCBiaXRzLgorICogIChzZWUgQ0FOX0VGRl9SQ1ZfSEFTSF9CSVRTIGRlZmluaXRpb24pCisgKgorICogUmV0dXJuOgorICogIEhhc2ggdmFsdWUgZnJvbSAweDAwMCAtIDB4M0ZGICggZW5mb3JjZWQgYnkgQ0FOX0VGRl9SQ1ZfSEFTSF9CSVRTIG1hc2sgKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVmZmhhc2goY2FuaWRfdCBjYW5faWQpCit7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwloYXNoID0gY2FuX2lkOworCWhhc2ggXj0gY2FuX2lkID4+IENBTl9FRkZfUkNWX0hBU0hfQklUUzsKKwloYXNoIF49IGNhbl9pZCA+PiAoMiAqIENBTl9FRkZfUkNWX0hBU0hfQklUUyk7CisKKwlyZXR1cm4gaGFzaCAmICgoMSA8PCBDQU5fRUZGX1JDVl9IQVNIX0JJVFMpIC0gMSk7Cit9CisKKy8qKgogICogZmluZF9yY3ZfbGlzdCAtIGRldGVybWluZSBvcHRpbWFsIGZpbHRlcmxpc3QgaW5zaWRlIGRldmljZSBmaWx0ZXIgc3RydWN0CiAgKiBAY2FuX2lkOiBwb2ludGVyIHRvIENBTiBpZGVudGlmaWVyIG9mIGEgZ2l2ZW4gY2FuX2ZpbHRlcgogICogQG1hc2s6IHBvaW50ZXIgdG8gQ0FOIG1hc2sgb2YgYSBnaXZlbiBjYW5fZmlsdGVyCkBAIC00MDAsMTAgKzQyMyw4IEBACiAJICAgICEoKmNhbl9pZCAmIENBTl9SVFJfRkxBRykpIHsKIAogCQlpZiAoKmNhbl9pZCAmIENBTl9FRkZfRkxBRykgewotCQkJaWYgKCptYXNrID09IChDQU5fRUZGX01BU0sgfCBDQU5fRUZGX1JUUl9GTEFHUykpIHsKLQkJCQkvKiBSRkM6IGEgZnV0dXJlIHVzZS1jYXNlIGZvciBoYXNoLXRhYmxlcz8gKi8KLQkJCQlyZXR1cm4gJmQtPnJ4W1JYX0VGRl07Ci0JCQl9CisJCQlpZiAoKm1hc2sgPT0gKENBTl9FRkZfTUFTSyB8IENBTl9FRkZfUlRSX0ZMQUdTKSkKKwkJCQlyZXR1cm4gJmQtPnJ4X2VmZltlZmZoYXNoKCpjYW5faWQpXTsKIAkJfSBlbHNlIHsKIAkJCWlmICgqbWFzayA9PSAoQ0FOX1NGRl9NQVNLIHwgQ0FOX0VGRl9SVFJfRkxBR1MpKQogCQkJCXJldHVybiAmZC0+cnhfc2ZmWypjYW5faWRdOwpAQCAtNjMyLDcgKzY1Myw3IEBACiAJCXJldHVybiBtYXRjaGVzOwogCiAJaWYgKGNhbl9pZCAmIENBTl9FRkZfRkxBRykgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UociwgJmQtPnJ4W1JYX0VGRl0sIGxpc3QpIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHIsICZkLT5yeF9lZmZbZWZmaGFzaChjYW5faWQpXSwgbGlzdCkgewogCQkJaWYgKHItPmNhbl9pZCA9PSBjYW5faWQpIHsKIAkJCQlkZWxpdmVyKHNrYiwgcik7CiAJCQkJbWF0Y2hlcysrOwpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9hZl9jYW4uaCBiL25ldC9jYW4vYWZfY2FuLmgKaW5kZXggNmRlNThiNC4uZmNhMGZlOSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9hZl9jYW4uaAorKysgYi9uZXQvY2FuL2FmX2Nhbi5oCkBAIC01OSwxMiArNTksMTcgQEAKIAljaGFyICppZGVudDsKIH07CiAKLWVudW0geyBSWF9FUlIsIFJYX0FMTCwgUlhfRklMLCBSWF9JTlYsIFJYX0VGRiwgUlhfTUFYIH07CisjZGVmaW5lIENBTl9TRkZfUkNWX0FSUkFZX1NaICgxIDw8IENBTl9TRkZfSURfQklUUykKKyNkZWZpbmUgQ0FOX0VGRl9SQ1ZfSEFTSF9CSVRTIDEwCisjZGVmaW5lIENBTl9FRkZfUkNWX0FSUkFZX1NaICgxIDw8IENBTl9FRkZfUkNWX0hBU0hfQklUUykKKworZW51bSB7IFJYX0VSUiwgUlhfQUxMLCBSWF9GSUwsIFJYX0lOViwgUlhfTUFYIH07CiAKIC8qIHBlciBkZXZpY2UgcmVjZWl2ZSBmaWx0ZXJzIGxpbmtlZCBhdCBkZXYtPm1sX3ByaXYgKi8KIHN0cnVjdCBkZXZfcmN2X2xpc3RzIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCByeFtSWF9NQVhdOwotCXN0cnVjdCBobGlzdF9oZWFkIHJ4X3NmZlsweDgwMF07CisJc3RydWN0IGhsaXN0X2hlYWQgcnhfc2ZmW0NBTl9TRkZfUkNWX0FSUkFZX1NaXTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCByeF9lZmZbQ0FOX0VGRl9SQ1ZfQVJSQVlfU1pdOwogCWludCByZW1vdmVfb25femVyb19lbnRyaWVzOwogCWludCBlbnRyaWVzOwogfTsKZGlmZiAtLWdpdCBhL25ldC9jYW4vcHJvYy5jIGIvbmV0L2Nhbi9wcm9jLmMKaW5kZXggYjU0MzQ3MC4uMWExOWI5OCAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9wcm9jLmMKKysrIGIvbmV0L2Nhbi9wcm9jLmMKQEAgLTgwLDcgKzgwLDYgQEAKIAlbUlhfQUxMXSA9ICJyeF9hbGwiLAogCVtSWF9GSUxdID0gInJ4X2ZpbCIsCiAJW1JYX0lOVl0gPSAicnhfaW52IiwKLQlbUlhfRUZGXSA9ICJyeF9lZmYiLAogfTsKIAogLyoKQEAgLTM4OSwyNSArMzg4LDI2IEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjYW5fcmN2bGlzdF9zZmZfcHJvY19zaG93X29uZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCi0JCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgZGV2X3Jjdl9saXN0cyAqZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYW5fcmN2bGlzdF9wcm9jX3Nob3dfYXJyYXkoc3RydWN0IHNlcV9maWxlICptLAorCQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpyY3ZfYXJyYXksCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmN2X2FycmF5X3N6KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCWludCBhbGxfZW1wdHkgPSAxOwogCiAJLyogY2hlY2sgd2hldGhlciBhdCBsZWFzdCBvbmUgbGlzdCBpcyBub24tZW1wdHkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMHg4MDA7IGkrKykKLQkJaWYgKCFobGlzdF9lbXB0eSgmZC0+cnhfc2ZmW2ldKSkgeworCWZvciAoaSA9IDA7IGkgPCByY3ZfYXJyYXlfc3o7IGkrKykKKwkJaWYgKCFobGlzdF9lbXB0eSgmcmN2X2FycmF5W2ldKSkgewogCQkJYWxsX2VtcHR5ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKIAlpZiAoIWFsbF9lbXB0eSkgewogCQljYW5fcHJpbnRfcmVjdl9iYW5uZXIobSk7Ci0JCWZvciAoaSA9IDA7IGkgPCAweDgwMDsgaSsrKSB7Ci0JCQlpZiAoIWhsaXN0X2VtcHR5KCZkLT5yeF9zZmZbaV0pKQotCQkJCWNhbl9wcmludF9yY3ZsaXN0KG0sICZkLT5yeF9zZmZbaV0sIGRldik7CisJCWZvciAoaSA9IDA7IGkgPCByY3ZfYXJyYXlfc3o7IGkrKykgeworCQkJaWYgKCFobGlzdF9lbXB0eSgmcmN2X2FycmF5W2ldKSkKKwkJCQljYW5fcHJpbnRfcmN2bGlzdChtLCAmcmN2X2FycmF5W2ldLCBkZXYpOwogCQl9CiAJfSBlbHNlCiAJCXNlcV9wcmludGYobSwgIiAgKCVzOiBubyBlbnRyeSlcbiIsIEROQU1FKGRldikpOwpAQCAtNDI1LDEyICs0MjUsMTUgQEAKIAogCS8qIHNmZiByZWNlaXZlIGxpc3QgZm9yICdhbGwnIENBTiBkZXZpY2VzIChkZXYgPT0gTlVMTCkgKi8KIAlkID0gJmNhbl9yeF9hbGxkZXZfbGlzdDsKLQljYW5fcmN2bGlzdF9zZmZfcHJvY19zaG93X29uZShtLCBOVUxMLCBkKTsKKwljYW5fcmN2bGlzdF9wcm9jX3Nob3dfYXJyYXkobSwgTlVMTCwgZC0+cnhfc2ZmLCBBUlJBWV9TSVpFKGQtPnJ4X3NmZikpOwogCiAJLyogc2ZmIHJlY2VpdmUgbGlzdCBmb3IgcmVnaXN0ZXJlZCBDQU4gZGV2aWNlcyAqLwogCWZvcl9lYWNoX25ldGRldl9yY3UoJmluaXRfbmV0LCBkZXYpIHsKLQkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfQ0FOICYmIGRldi0+bWxfcHJpdikKLQkJCWNhbl9yY3ZsaXN0X3NmZl9wcm9jX3Nob3dfb25lKG0sIGRldiwgZGV2LT5tbF9wcml2KTsKKwkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfQ0FOICYmIGRldi0+bWxfcHJpdikgeworCQkJZCA9IGRldi0+bWxfcHJpdjsKKwkJCWNhbl9yY3ZsaXN0X3Byb2Nfc2hvd19hcnJheShtLCBkZXYsIGQtPnJ4X3NmZiwKKwkJCQkJCSAgICBBUlJBWV9TSVpFKGQtPnJ4X3NmZikpOworCQl9CiAJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC00NTIsNiArNDU1LDQ5IEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKKworc3RhdGljIGludCBjYW5fcmN2bGlzdF9lZmZfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZfcmN2X2xpc3RzICpkOworCisJLyogUlhfRUZGICovCisJc2VxX3B1dHMobSwgIlxucmVjZWl2ZSBsaXN0ICdyeF9lZmYnOlxuIik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwkvKiBlZmYgcmVjZWl2ZSBsaXN0IGZvciAnYWxsJyBDQU4gZGV2aWNlcyAoZGV2ID09IE5VTEwpICovCisJZCA9ICZjYW5fcnhfYWxsZGV2X2xpc3Q7CisJY2FuX3Jjdmxpc3RfcHJvY19zaG93X2FycmF5KG0sIE5VTEwsIGQtPnJ4X2VmZiwgQVJSQVlfU0laRShkLT5yeF9lZmYpKTsKKworCS8qIGVmZiByZWNlaXZlIGxpc3QgZm9yIHJlZ2lzdGVyZWQgQ0FOIGRldmljZXMgKi8KKwlmb3JfZWFjaF9uZXRkZXZfcmN1KCZpbml0X25ldCwgZGV2KSB7CisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0NBTiAmJiBkZXYtPm1sX3ByaXYpIHsKKwkJCWQgPSBkZXYtPm1sX3ByaXY7CisJCQljYW5fcmN2bGlzdF9wcm9jX3Nob3dfYXJyYXkobSwgZGV2LCBkLT5yeF9lZmYsCisJCQkJCQkgICAgQVJSQVlfU0laRShkLT5yeF9lZmYpKTsKKwkJfQorCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJc2VxX3B1dGMobSwgJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FuX3Jjdmxpc3RfZWZmX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgY2FuX3Jjdmxpc3RfZWZmX3Byb2Nfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNhbl9yY3ZsaXN0X2VmZl9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGNhbl9yY3ZsaXN0X2VmZl9wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKIC8qCiAgKiBwcm9jIHV0aWxpdHkgZnVuY3Rpb25zCiAgKi8KQEAgLTQ5MSw4ICs1MzcsOCBAQAogCQkJCQkgICAmY2FuX3Jjdmxpc3RfcHJvY19mb3BzLCAodm9pZCAqKVJYX0ZJTCk7CiAJcGRlX3Jjdmxpc3RfaW52ID0gcHJvY19jcmVhdGVfZGF0YShDQU5fUFJPQ19SQ1ZMSVNUX0lOViwgMDY0NCwgY2FuX2RpciwKIAkJCQkJICAgJmNhbl9yY3ZsaXN0X3Byb2NfZm9wcywgKHZvaWQgKilSWF9JTlYpOwotCXBkZV9yY3ZsaXN0X2VmZiA9IHByb2NfY3JlYXRlX2RhdGEoQ0FOX1BST0NfUkNWTElTVF9FRkYsIDA2NDQsIGNhbl9kaXIsCi0JCQkJCSAgICZjYW5fcmN2bGlzdF9wcm9jX2ZvcHMsICh2b2lkICopUlhfRUZGKTsKKwlwZGVfcmN2bGlzdF9lZmYgPSBwcm9jX2NyZWF0ZShDQU5fUFJPQ19SQ1ZMSVNUX0VGRiwgMDY0NCwgY2FuX2RpciwKKwkJCQkgICAgICAmY2FuX3Jjdmxpc3RfZWZmX3Byb2NfZm9wcyk7CiAJcGRlX3Jjdmxpc3Rfc2ZmID0gcHJvY19jcmVhdGUoQ0FOX1BST0NfUkNWTElTVF9TRkYsIDA2NDQsIGNhbl9kaXIsCiAJCQkJICAgICAgJmNhbl9yY3ZsaXN0X3NmZl9wcm9jX2ZvcHMpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvY2VwaF9jb21tb24uYyBiL25ldC9jZXBoL2NlcGhfY29tbW9uLmMKaW5kZXggNjdkNzcyMS4uMTY3NTAyMSAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvY2VwaF9jb21tb24uYworKysgYi9uZXQvY2VwaC9jZXBoX2NvbW1vbi5jCkBAIC03Miw2ICs3Miw4IEBACiAJY2FzZSBDRVBIX01TR19NT05fU1VCU0NSSUJFX0FDSzogcmV0dXJuICJtb25fc3Vic2NyaWJlX2FjayI7CiAJY2FzZSBDRVBIX01TR19TVEFURlM6IHJldHVybiAic3RhdGZzIjsKIAljYXNlIENFUEhfTVNHX1NUQVRGU19SRVBMWTogcmV0dXJuICJzdGF0ZnNfcmVwbHkiOworCWNhc2UgQ0VQSF9NU0dfTU9OX0dFVF9WRVJTSU9OOiByZXR1cm4gIm1vbl9nZXRfdmVyc2lvbiI7CisJY2FzZSBDRVBIX01TR19NT05fR0VUX1ZFUlNJT05fUkVQTFk6IHJldHVybiAibW9uX2dldF92ZXJzaW9uX3JlcGx5IjsKIAljYXNlIENFUEhfTVNHX01EU19NQVA6IHJldHVybiAibWRzX21hcCI7CiAJY2FzZSBDRVBIX01TR19DTElFTlRfU0VTU0lPTjogcmV0dXJuICJjbGllbnRfc2Vzc2lvbiI7CiAJY2FzZSBDRVBIX01TR19DTElFTlRfUkVDT05ORUNUOiByZXR1cm4gImNsaWVudF9yZWNvbm5lY3QiOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvZGVidWdmcy5jIGIvbmV0L2NlcGgvZGVidWdmcy5jCmluZGV4IDEwNDIxYTQuLmQxYTYyYzYgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL2RlYnVnZnMuYworKysgYi9uZXQvY2VwaC9kZWJ1Z2ZzLmMKQEAgLTEyNiw5ICsxMjYsMTMgQEAKIAkJcmVxID0gcmJfZW50cnkocnAsIHN0cnVjdCBjZXBoX21vbl9nZW5lcmljX3JlcXVlc3QsIG5vZGUpOwogCQlvcCA9IGxlMTZfdG9fY3B1KHJlcS0+cmVxdWVzdC0+aGRyLnR5cGUpOwogCQlpZiAob3AgPT0gQ0VQSF9NU0dfU1RBVEZTKQotCQkJc2VxX3ByaW50ZihzLCAiJWxsZCBzdGF0ZnNcbiIsIHJlcS0+dGlkKTsKKwkJCXNlcV9wcmludGYocywgIiVsbHUgc3RhdGZzXG4iLCByZXEtPnRpZCk7CisJCWVsc2UgaWYgKG9wID09IENFUEhfTVNHX1BPT0xPUCkKKwkJCXNlcV9wcmludGYocywgIiVsbHUgcG9vbG9wXG4iLCByZXEtPnRpZCk7CisJCWVsc2UgaWYgKG9wID09IENFUEhfTVNHX01PTl9HRVRfVkVSU0lPTikKKwkJCXNlcV9wcmludGYocywgIiVsbHUgbW9uX2dldF92ZXJzaW9uIiwgcmVxLT50aWQpOwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKHMsICIlbGxkIHVua25vd25cbiIsIHJlcS0+dGlkKTsKKwkJCXNlcV9wcmludGYocywgIiVsbHUgdW5rbm93blxuIiwgcmVxLT50aWQpOwogCX0KIAogCW11dGV4X3VubG9jaygmbW9uYy0+bXV0ZXgpOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvbW9uX2NsaWVudC5jIGIvbmV0L2NlcGgvbW9uX2NsaWVudC5jCmluZGV4IDJhYzllZjMuLjA2N2QzYWYgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL21vbl9jbGllbnQuYworKysgYi9uZXQvY2VwaC9tb25fY2xpZW50LmMKQEAgLTI5Niw2ICsyOTYsMzMgQEAKIAkJX19zZW5kX3N1YnNjcmliZShtb25jKTsKIAltdXRleF91bmxvY2soJm1vbmMtPm11dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0woY2VwaF9tb25jX3JlcXVlc3RfbmV4dF9vc2RtYXApOworCitpbnQgY2VwaF9tb25jX3dhaXRfb3NkbWFwKHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsIHUzMiBlcG9jaCwKKwkJCSAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRlZCA9IGppZmZpZXM7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm1vbmMtPm11dGV4KTsKKwl3aGlsZSAobW9uYy0+aGF2ZV9vc2RtYXAgPCBlcG9jaCkgeworCQltdXRleF91bmxvY2soJm1vbmMtPm11dGV4KTsKKworCQlpZiAodGltZW91dCAhPSAwICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc3RhcnRlZCArIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobW9uYy0+Y2xpZW50LT5hdXRoX3dxLAorCQkJCQkgbW9uYy0+aGF2ZV9vc2RtYXAgPj0gZXBvY2gsIHRpbWVvdXQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOworCX0KKworCW11dGV4X3VubG9jaygmbW9uYy0+bXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjZXBoX21vbmNfd2FpdF9vc2RtYXApOwogCiAvKgogICoKQEAgLTQ3NywxNCArNTA0LDEzIEBACiAJcmV0dXJuIG07CiB9CiAKLXN0YXRpYyBpbnQgZG9fZ2VuZXJpY19yZXF1ZXN0KHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsCi0JCQkgICAgICBzdHJ1Y3QgY2VwaF9tb25fZ2VuZXJpY19yZXF1ZXN0ICpyZXEpCitzdGF0aWMgaW50IF9fZG9fZ2VuZXJpY19yZXF1ZXN0KHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsIHU2NCB0aWQsCisJCQkJc3RydWN0IGNlcGhfbW9uX2dlbmVyaWNfcmVxdWVzdCAqcmVxKQogewogCWludCBlcnI7CiAKIAkvKiByZWdpc3RlciByZXF1ZXN0ICovCi0JbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOwotCXJlcS0+dGlkID0gKyttb25jLT5sYXN0X3RpZDsKKwlyZXEtPnRpZCA9IHRpZCAhPSAwID8gdGlkIDogKyttb25jLT5sYXN0X3RpZDsKIAlyZXEtPnJlcXVlc3QtPmhkci50aWQgPSBjcHVfdG9fbGU2NChyZXEtPnRpZCk7CiAJX19pbnNlcnRfZ2VuZXJpY19yZXF1ZXN0KG1vbmMsIHJlcSk7CiAJbW9uYy0+bnVtX2dlbmVyaWNfcmVxdWVzdHMrKzsKQEAgLTQ5NiwxMyArNTIyLDI0IEBACiAJbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOwogCXJiX2VyYXNlKCZyZXEtPm5vZGUsICZtb25jLT5nZW5lcmljX3JlcXVlc3RfdHJlZSk7CiAJbW9uYy0+bnVtX2dlbmVyaWNfcmVxdWVzdHMtLTsKLQltdXRleF91bmxvY2soJm1vbmMtPm11dGV4KTsKIAogCWlmICghZXJyKQogCQllcnIgPSByZXEtPnJlc3VsdDsKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGRvX2dlbmVyaWNfcmVxdWVzdChzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jLAorCQkJICAgICAgc3RydWN0IGNlcGhfbW9uX2dlbmVyaWNfcmVxdWVzdCAqcmVxKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZtb25jLT5tdXRleCk7CisJZXJyID0gX19kb19nZW5lcmljX3JlcXVlc3QobW9uYywgMCwgcmVxKTsKKwltdXRleF91bmxvY2soJm1vbmMtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CisKIC8qCiAgKiBzdGF0ZnMKICAqLwpAQCAtNTc5LDYgKzYxNiw5NiBAQAogfQogRVhQT1JUX1NZTUJPTChjZXBoX21vbmNfZG9fc3RhdGZzKTsKIAorc3RhdGljIHZvaWQgaGFuZGxlX2dldF92ZXJzaW9uX3JlcGx5KHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMsCisJCQkJICAgICBzdHJ1Y3QgY2VwaF9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY2VwaF9tb25fZ2VuZXJpY19yZXF1ZXN0ICpyZXE7CisJdTY0IHRpZCA9IGxlNjRfdG9fY3B1KG1zZy0+aGRyLnRpZCk7CisJdm9pZCAqcCA9IG1zZy0+ZnJvbnQuaW92X2Jhc2U7CisJdm9pZCAqZW5kID0gcCArIG1zZy0+ZnJvbnRfYWxsb2NfbGVuOworCXU2NCBoYW5kbGU7CisKKwlkb3V0KCIlcyAlcCB0aWQgJWxsdVxuIiwgX19mdW5jX18sIG1zZywgdGlkKTsKKworCWNlcGhfZGVjb2RlX25lZWQoJnAsIGVuZCwgMipzaXplb2YodTY0KSwgYmFkKTsKKwloYW5kbGUgPSBjZXBoX2RlY29kZV82NCgmcCk7CisJaWYgKHRpZCAhPSAwICYmIHRpZCAhPSBoYW5kbGUpCisJCWdvdG8gYmFkOworCisJbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOworCXJlcSA9IF9fbG9va3VwX2dlbmVyaWNfcmVxKG1vbmMsIGhhbmRsZSk7CisJaWYgKHJlcSkgeworCQkqKHU2NCAqKXJlcS0+YnVmID0gY2VwaF9kZWNvZGVfNjQoJnApOworCQlyZXEtPnJlc3VsdCA9IDA7CisJCWdldF9nZW5lcmljX3JlcXVlc3QocmVxKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtb25jLT5tdXRleCk7CisJaWYgKHJlcSkgeworCQljb21wbGV0ZV9hbGwoJnJlcS0+Y29tcGxldGlvbik7CisJCXB1dF9nZW5lcmljX3JlcXVlc3QocmVxKTsKKwl9CisKKwlyZXR1cm47CitiYWQ6CisJcHJfZXJyKCJjb3JydXB0IG1vbl9nZXRfdmVyc2lvbiByZXBseVxuIik7CisJY2VwaF9tc2dfZHVtcChtc2cpOworfQorCisvKgorICogU2VuZCBNTW9uR2V0VmVyc2lvbiBhbmQgd2FpdCBmb3IgdGhlIHJlcGx5LgorICoKKyAqIEB3aGF0OiBvbmUgb2YgIm1kc21hcCIsICJvc2RtYXAiIG9yICJtb25tYXAiCisgKi8KK2ludCBjZXBoX21vbmNfZG9fZ2V0X3ZlcnNpb24oc3RydWN0IGNlcGhfbW9uX2NsaWVudCAqbW9uYywgY29uc3QgY2hhciAqd2hhdCwKKwkJCSAgICAgdTY0ICpuZXdlc3QpCit7CisJc3RydWN0IGNlcGhfbW9uX2dlbmVyaWNfcmVxdWVzdCAqcmVxOworCXZvaWQgKnAsICplbmQ7CisJdTY0IHRpZDsKKwlpbnQgZXJyOworCisJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrcmVmX2luaXQoJnJlcS0+a3JlZik7CisJcmVxLT5idWYgPSBuZXdlc3Q7CisJcmVxLT5idWZfbGVuID0gc2l6ZW9mKCpuZXdlc3QpOworCWluaXRfY29tcGxldGlvbigmcmVxLT5jb21wbGV0aW9uKTsKKworCXJlcS0+cmVxdWVzdCA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19NT05fR0VUX1ZFUlNJT04sCisJCQkJICAgIHNpemVvZih1NjQpICsgc2l6ZW9mKHUzMikgKyBzdHJsZW4od2hhdCksCisJCQkJICAgIEdGUF9OT0ZTLCB0cnVlKTsKKwlpZiAoIXJlcS0+cmVxdWVzdCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXEtPnJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX01PTl9HRVRfVkVSU0lPTl9SRVBMWSwgMTAyNCwKKwkJCQkgIEdGUF9OT0ZTLCB0cnVlKTsKKwlpZiAoIXJlcS0+cmVwbHkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcCA9IHJlcS0+cmVxdWVzdC0+ZnJvbnQuaW92X2Jhc2U7CisJZW5kID0gcCArIHJlcS0+cmVxdWVzdC0+ZnJvbnRfYWxsb2NfbGVuOworCisJLyogZmlsbCBvdXQgcmVxdWVzdCAqLworCW11dGV4X2xvY2soJm1vbmMtPm11dGV4KTsKKwl0aWQgPSArK21vbmMtPmxhc3RfdGlkOworCWNlcGhfZW5jb2RlXzY0KCZwLCB0aWQpOyAvKiBoYW5kbGUgKi8KKwljZXBoX2VuY29kZV9zdHJpbmcoJnAsIGVuZCwgd2hhdCwgc3RybGVuKHdoYXQpKTsKKworCWVyciA9IF9fZG9fZ2VuZXJpY19yZXF1ZXN0KG1vbmMsIHRpZCwgcmVxKTsKKworCW11dGV4X3VubG9jaygmbW9uYy0+bXV0ZXgpOworb3V0OgorCWtyZWZfcHV0KCZyZXEtPmtyZWYsIHJlbGVhc2VfZ2VuZXJpY19yZXF1ZXN0KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChjZXBoX21vbmNfZG9fZ2V0X3ZlcnNpb24pOworCiAvKgogICogcG9vbCBvcHMKICAqLwpAQCAtOTgxLDYgKzExMDgsMTAgQEAKIAkJaGFuZGxlX3N0YXRmc19yZXBseShtb25jLCBtc2cpOwogCQlicmVhazsKIAorCWNhc2UgQ0VQSF9NU0dfTU9OX0dFVF9WRVJTSU9OX1JFUExZOgorCQloYW5kbGVfZ2V0X3ZlcnNpb25fcmVwbHkobW9uYywgbXNnKTsKKwkJYnJlYWs7CisKIAljYXNlIENFUEhfTVNHX1BPT0xPUF9SRVBMWToKIAkJaGFuZGxlX3Bvb2xvcF9yZXBseShtb25jLCBtc2cpOwogCQlicmVhazsKQEAgLTEwMjksNiArMTE2MCwxNSBAQAogCWNhc2UgQ0VQSF9NU0dfQVVUSF9SRVBMWToKIAkJbSA9IGNlcGhfbXNnX2dldChtb25jLT5tX2F1dGhfcmVwbHkpOwogCQlicmVhazsKKwljYXNlIENFUEhfTVNHX01PTl9HRVRfVkVSU0lPTl9SRVBMWToKKwkJaWYgKGxlNjRfdG9fY3B1KGhkci0+dGlkKSAhPSAwKQorCQkJcmV0dXJuIGdldF9nZW5lcmljX3JlcGx5KGNvbiwgaGRyLCBza2lwKTsKKworCQkvKgorCQkgKiBPbGRlciBPU0RzIGRvbid0IHNldCByZXBseSB0aWQgZXZlbiBpZiB0aGUgb3JpZ25hbAorCQkgKiByZXF1ZXN0IGhhZCBhIG5vbi16ZXJvIHRpZC4gIFdvcmthcm91bmQgdGhpcyB3ZWlyZG5lc3MKKwkJICogYnkgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBhbGxvY2F0ZSBjYXNlLgorCQkgKi8KIAljYXNlIENFUEhfTVNHX01PTl9NQVA6CiAJY2FzZSBDRVBIX01TR19NRFNfTUFQOgogCWNhc2UgQ0VQSF9NU0dfT1NEX01BUDoKZGlmZiAtLWdpdCBhL25ldC9jZXBoL29zZF9jbGllbnQuYyBiL25ldC9jZXBoL29zZF9jbGllbnQuYwppbmRleCBiMGRmY2U3Li4wNWJlMGMxIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMKKysrIGIvbmV0L2NlcGgvb3NkX2NsaWVudC5jCkBAIC0yNDkxLDcgKzI0OTEsNyBAQAogICogQ2FsbCBhbGwgcGVuZGluZyBub3RpZnkgY2FsbGJhY2tzIC0gZm9yIHVzZSBhZnRlciBhIHdhdGNoIGlzCiAgKiB1bnJlZ2lzdGVyZWQsIHRvIG1ha2Ugc3VyZSBubyBtb3JlIGNhbGxiYWNrcyBmb3IgaXQgd2lsbCBiZSBpbnZva2VkCiAgKi8KLWV4dGVybiB2b2lkIGNlcGhfb3NkY19mbHVzaF9ub3RpZmllcyhzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjKQordm9pZCBjZXBoX29zZGNfZmx1c2hfbm90aWZpZXMoc3RydWN0IGNlcGhfb3NkX2NsaWVudCAqb3NkYykKIHsKIAlmbHVzaF93b3JrcXVldWUob3NkYy0+bm90aWZ5X3dxKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jZXBoL3BhZ2V2ZWMuYyBiL25ldC9jZXBoL3BhZ2V2ZWMuYwppbmRleCA4MTVhMjI0Li41NTUwMTMwIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9wYWdldmVjLmMKKysrIGIvbmV0L2NlcGgvcGFnZXZlYy5jCkBAIC01Myw3ICs1MywxMCBAQAogCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlc1tpXSk7CiAJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKIAl9Ci0Ja2ZyZWUocGFnZXMpOworCWlmIChpc192bWFsbG9jX2FkZHIocGFnZXMpKQorCQl2ZnJlZShwYWdlcyk7CisJZWxzZQorCQlrZnJlZShwYWdlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGNlcGhfcHV0X3BhZ2VfdmVjdG9yKTsKIApAQCAtMTY1LDM2ICsxNjgsNiBAQAogRVhQT1JUX1NZTUJPTChjZXBoX2NvcHlfZnJvbV9wYWdlX3ZlY3Rvcik7CiAKIC8qCi0gKiBjb3B5IHVzZXIgZGF0YSBmcm9tIGEgcGFnZSB2ZWN0b3IgaW50byBhIHVzZXIgcG9pbnRlcgotICovCi1pbnQgY2VwaF9jb3B5X3BhZ2VfdmVjdG9yX3RvX3VzZXIoc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJCQkJIHZvaWQgX191c2VyICpkYXRhLAotCQkJCQkgbG9mZl90IG9mZiwgc2l6ZV90IGxlbikKLXsKLQlpbnQgaSA9IDA7Ci0JaW50IHBvID0gb2ZmICYgflBBR0VfQ0FDSEVfTUFTSzsKLQlpbnQgbGVmdCA9IGxlbjsKLQlpbnQgbCwgYmFkOwotCi0Jd2hpbGUgKGxlZnQgPiAwKSB7Ci0JCWwgPSBtaW5fdChpbnQsIGxlZnQsIFBBR0VfQ0FDSEVfU0laRS1wbyk7Ci0JCWJhZCA9IGNvcHlfdG9fdXNlcihkYXRhLCBwYWdlX2FkZHJlc3MocGFnZXNbaV0pICsgcG8sIGwpOwotCQlpZiAoYmFkID09IGwpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJZGF0YSArPSBsIC0gYmFkOwotCQlsZWZ0IC09IGwgLSBiYWQ7Ci0JCWlmIChwbykgewotCQkJcG8gKz0gbCAtIGJhZDsKLQkJCWlmIChwbyA9PSBQQUdFX0NBQ0hFX1NJWkUpCi0JCQkJcG8gPSAwOwotCQl9Ci0JCWkrKzsKLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLUVYUE9SVF9TWU1CT0woY2VwaF9jb3B5X3BhZ2VfdmVjdG9yX3RvX3VzZXIpOwotCi0vKgogICogWmVybyBhbiBleHRlbnQgd2l0aGluIGEgcGFnZSB2ZWN0b3IuICBPZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlCiAgKiBzdGFydCBvZiB0aGUgZmlyc3QgcGFnZS4KICAqLwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvTWFrZWZpbGUgYi9uZXQvY29yZS9NYWtlZmlsZQppbmRleCA4MjZiOTI1Li43MTA5M2Q5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9NYWtlZmlsZQorKysgYi9uZXQvY29yZS9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAogb2JqLXkJCSAgICAgKz0gZGV2Lm8gZXRodG9vbC5vIGRldl9hZGRyX2xpc3RzLm8gZHN0Lm8gbmV0ZXZlbnQubyBcCiAJCQluZWlnaGJvdXIubyBydG5ldGxpbmsubyB1dGlscy5vIGxpbmtfd2F0Y2gubyBmaWx0ZXIubyBcCi0JCQlzb2NrX2RpYWcubyBkZXZfaW9jdGwubworCQkJc29ja19kaWFnLm8gZGV2X2lvY3RsLm8gdHNvLm8KIAogb2JqLSQoQ09ORklHX1hGUk0pICs9IGZsb3cubwogb2JqLXkgKz0gbmV0LXN5c2ZzLm8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RhdGFncmFtLmMgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCmluZGV4IGExNmVkN2IuLjZiMWMwNGMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RhdGFncmFtLmMKKysrIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwpAQCAtNzM5LDExICs3MzksMTUgQEAKIAlfX3N1bTE2IHN1bTsKIAogCXN1bSA9IGNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBsZW4sIHNrYi0+Y3N1bSkpOwotCWlmIChsaWtlbHkoIXN1bSkpIHsKLQkJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSkKLQkJCW5ldGRldl9yeF9jc3VtX2ZhdWx0KHNrYi0+ZGV2KTsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQl9CisJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSAmJiAhc3VtICYmCisJICAgICFza2ItPmNzdW1fY29tcGxldGVfc3cpCisJCW5ldGRldl9yeF9jc3VtX2ZhdWx0KHNrYi0+ZGV2KTsKKworCS8qIFNhdmUgY2hlY2tzdW0gY29tcGxldGUgZm9yIGxhdGVyIHVzZSAqLworCXNrYi0+Y3N1bSA9IHN1bTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOworCXNrYi0+Y3N1bV9jb21wbGV0ZV9zdyA9IDE7CisKIAlyZXR1cm4gc3VtOwogfQogRVhQT1JUX1NZTUJPTChfX3NrYl9jaGVja3N1bV9jb21wbGV0ZV9oZWFkKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggODkwOGE2OC4uMzBlZWRmNiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTE2NjEsNiArMTY2MSwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNfc2tiX2ZvcndhcmRhYmxlKTsKIAoraW50IF9fZGV2X2ZvcndhcmRfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9ERVZfWkVST0NPUFkpIHsKKwkJaWYgKHNrYl9jb3B5X3VidWZzKHNrYiwgR0ZQX0FUT01JQykpIHsKKwkJCWF0b21pY19sb25nX2luYygmZGV2LT5yeF9kcm9wcGVkKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIE5FVF9SWF9EUk9QOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KCFpc19za2JfZm9yd2FyZGFibGUoZGV2LCBza2IpKSkgeworCQlhdG9taWNfbG9uZ19pbmMoJmRldi0+cnhfZHJvcHBlZCk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisJc2tiX3NjcnViX3BhY2tldChza2IsIHRydWUpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZGV2X2ZvcndhcmRfc2tiKTsKKwogLyoqCiAgKiBkZXZfZm9yd2FyZF9za2IgLSBsb29wYmFjayBhbiBza2IgdG8gYW5vdGhlciBuZXRpZgogICoKQEAgLTE2ODEsMjQgKzE3MDQsNyBAQAogICovCiBpbnQgZGV2X2ZvcndhcmRfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9ERVZfWkVST0NPUFkpIHsKLQkJaWYgKHNrYl9jb3B5X3VidWZzKHNrYiwgR0ZQX0FUT01JQykpIHsKLQkJCWF0b21pY19sb25nX2luYygmZGV2LT5yeF9kcm9wcGVkKTsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCQl9Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFpc19za2JfZm9yd2FyZGFibGUoZGV2LCBza2IpKSkgewotCQlhdG9taWNfbG9uZ19pbmMoJmRldi0+cnhfZHJvcHBlZCk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0Jc2tiX3NjcnViX3BhY2tldChza2IsIHRydWUpOwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0KLQlyZXR1cm4gbmV0aWZfcnhfaW50ZXJuYWwoc2tiKTsKKwlyZXR1cm4gX19kZXZfZm9yd2FyZF9za2IoZGV2LCBza2IpID86IG5ldGlmX3J4X2ludGVybmFsKHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZfZm9yd2FyZF9za2IpOwogCkBAIC0yNTA3LDEzICsyNTEzLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIElmIE1QTFMgb2ZmbG9hZCByZXF1ZXN0LCB2ZXJpZnkgd2UgYXJlIHRlc3RpbmcgaGFyZHdhcmUgTVBMUyBmZWF0dXJlcworICogaW5zdGVhZCBvZiBzdGFuZGFyZCBmZWF0dXJlcyBmb3IgdGhlIG5ldGRldi4KKyAqLworI2lmZGVmIENPTkZJR19ORVRfTVBMU19HU08KK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBuZXRfbXBsc19mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywKKwkJCQkJICAgX19iZTE2IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfTVBMU19VQykgfHwgdHlwZSA9PSBodG9ucyhFVEhfUF9NUExTX01DKSkKKwkJZmVhdHVyZXMgJj0gc2tiLT5kZXYtPm1wbHNfZmVhdHVyZXM7CisKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisjZWxzZQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IG5ldF9tcGxzX2ZlYXR1cmVzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLAorCQkJCQkgICBfX2JlMTYgdHlwZSkKK3sKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisjZW5kaWYKKwogc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGhhcm1vbml6ZV9mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCWludCB0bXA7CisJX19iZTE2IHR5cGU7CisKKwl0eXBlID0gc2tiX25ldHdvcmtfcHJvdG9jb2woc2tiLCAmdG1wKTsKKwlmZWF0dXJlcyA9IG5ldF9tcGxzX2ZlYXR1cmVzKHNrYiwgZmVhdHVyZXMsIHR5cGUpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX05PTkUgJiYKLQkgICAgIWNhbl9jaGVja3N1bV9wcm90b2NvbChmZWF0dXJlcywgc2tiX25ldHdvcmtfcHJvdG9jb2woc2tiLCAmdG1wKSkpIHsKKwkgICAgIWNhbl9jaGVja3N1bV9wcm90b2NvbChmZWF0dXJlcywgdHlwZSkpIHsKIAkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfQUxMX0NTVU07CiAJfSBlbHNlIGlmIChpbGxlZ2FsX2hpZ2hkbWEoc2tiLT5kZXYsIHNrYikpIHsKIAkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfU0c7CkBAIC01Njg5LDEwICs1NzIxLDYgQEAKIAkJKi8KIAkJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9VTlJFR0lTVEVSLCBkZXYpOwogCi0JCWlmICghZGV2LT5ydG5sX2xpbmtfb3BzIHx8Ci0JCSAgICBkZXYtPnJ0bmxfbGlua19zdGF0ZSA9PSBSVE5MX0xJTktfSU5JVElBTElaRUQpCi0JCQlydG1zZ19pZmluZm8oUlRNX0RFTExJTkssIGRldiwgfjBVLCBHRlBfS0VSTkVMKTsKLQogCQkvKgogCQkgKglGbHVzaCB0aGUgdW5pY2FzdCBhbmQgbXVsdGljYXN0IGNoYWlucwogCQkgKi8KQEAgLTU3MDIsNiArNTczMCwxMCBAQAogCQlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fdW5pbml0KQogCQkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fdW5pbml0KGRldik7CiAKKwkJaWYgKCFkZXYtPnJ0bmxfbGlua19vcHMgfHwKKwkJICAgIGRldi0+cnRubF9saW5rX3N0YXRlID09IFJUTkxfTElOS19JTklUSUFMSVpFRCkKKwkJCXJ0bXNnX2lmaW5mbyhSVE1fREVMTElOSywgZGV2LCB+MFUsIEdGUF9LRVJORUwpOworCiAJCS8qIE5vdGlmaWVyIGNoYWluIE1VU1QgZGV0YWNoIHVzIGFsbCB1cHBlciBkZXZpY2VzLiAqLwogCQlXQVJOX09OKG5ldGRldl9oYXNfYW55X3VwcGVyX2RldihkZXYpKTsKIApAQCAtNTkyNywxMCArNTk1OSw3IEBACiAKIHN0YXRpYyB2b2lkIG5ldGlmX2ZyZWVfdHhfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGlzX3ZtYWxsb2NfYWRkcihkZXYtPl90eCkpCi0JCXZmcmVlKGRldi0+X3R4KTsKLQllbHNlCi0JCWtmcmVlKGRldi0+X3R4KTsKKwlrdmZyZWUoZGV2LT5fdHgpOwogfQogCiBzdGF0aWMgaW50IG5ldGlmX2FsbG9jX25ldGRldl9xdWV1ZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTY0MDQsMTAgKzY0MzMsNyBAQAogewogCWNoYXIgKmFkZHIgPSAoY2hhciAqKWRldiAtIGRldi0+cGFkZGVkOwogCi0JaWYgKGlzX3ZtYWxsb2NfYWRkcihhZGRyKSkKLQkJdmZyZWUoYWRkcik7Ci0JZWxzZQotCQlrZnJlZShhZGRyKTsKKwlrdmZyZWUoYWRkcik7CiB9CiAKIC8qKgpAQCAtNjUxMiwxMSArNjUzOCw2IEBACiAKIGZyZWVfcGNwdToKIAlmcmVlX3BlcmNwdShkZXYtPnBjcHVfcmVmY250KTsKLQluZXRpZl9mcmVlX3R4X3F1ZXVlcyhkZXYpOwotI2lmZGVmIENPTkZJR19TWVNGUwotCWtmcmVlKGRldi0+X3J4KTsKLSNlbmRpZgotCiBmcmVlX2RldjoKIAluZXRkZXZfZnJlZW1lbShkZXYpOwogCXJldHVybiBOVUxMOwpAQCAtNjYxMyw2ICs2NjM0LDkgQEAKIC8qKgogICoJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSAtIHVucmVnaXN0ZXIgbWFueSBkZXZpY2VzCiAgKglAaGVhZDogbGlzdCBvZiBkZXZpY2VzCisgKgorICogIE5vdGU6IEFzIG1vc3QgY2FsbGVycyB1c2UgYSBzdGFjayBhbGxvY2F0ZWQgbGlzdF9oZWFkLAorICogIHdlIGZvcmNlIGEgbGlzdF9kZWwoKSB0byBtYWtlIHN1cmUgc3RhY2sgd29udCBiZSBjb3JydXB0ZWQgbGF0ZXIuCiAgKi8KIHZvaWQgdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewpAQCAtNjYyMiw2ICs2NjQ2LDcgQEAKIAkJcm9sbGJhY2tfcmVnaXN0ZXJlZF9tYW55KGhlYWQpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgaGVhZCwgdW5yZWdfbGlzdCkKIAkJCW5ldF9zZXRfdG9kbyhkZXYpOworCQlsaXN0X2RlbChoZWFkKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkpOwpAQCAtNzA3Nyw3ICs3MTAyLDYgQEAKIAkJfQogCX0KIAl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZkZXZfa2lsbF9saXN0KTsKLQlsaXN0X2RlbCgmZGV2X2tpbGxfbGlzdCk7CiAJcnRubF91bmxvY2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYyBiL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMKaW5kZXggMzI5ZDU3OS4uYjZiMjMwNiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYworKysgYi9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jCkBAIC0yMjUsNiArMjI1LDkxIEBACiB9CiBFWFBPUlRfU1lNQk9MKF9faHdfYWRkcl91bnN5bmMpOwogCisvKioKKyAqICBfX2h3X2FkZHJfc3luY19kZXYgLSBTeW5jaG9uaXplIGRldmljZSdzIG11bHRpY2FzdCBsaXN0CisgKiAgQGxpc3Q6IGFkZHJlc3MgbGlzdCB0byBzeW5jcm9uaXplCisgKiAgQGRldjogIGRldmljZSB0byBzeW5jCisgKiAgQHN5bmM6IGZ1bmN0aW9uIHRvIGNhbGwgaWYgYWRkcmVzcyBzaG91bGQgYmUgYWRkZWQKKyAqICBAdW5zeW5jOiBmdW5jdGlvbiB0byBjYWxsIGlmIGFkZHJlc3Mgc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKiAgVGhpcyBmdW5jaXRvbiBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSB0aGUgbmRvX3NldF9yeF9tb2RlCisgKiAgZnVuY3Rpb24gb2YgZGV2aWNlcyB0aGF0IHJlcXVpcmUgZXhwbGljaXQgYWRkcmVzcyBhZGQvcmVtb3ZlCisgKiAgbm90aWZpY2F0aW9ucy4gIFRoZSB1bnN5bmMgZnVuY3Rpb24gbWF5IGJlIE5VTEwgaW4gd2hpY2ggY2FzZQorICogIHRoZSBhZGRyZXNzZXMgcmVxdWlyaW5nIHJlbW92YWwgd2lsbCBzaW1wbHkgYmUgcmVtb3ZlZCB3aXRob3V0CisgKiAgYW55IG5vdGlmaWNhdGlvbiB0byB0aGUgZGV2aWNlLgorICoqLworaW50IF9faHdfYWRkcl9zeW5jX2RldihzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHJfbGlzdCAqbGlzdCwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBpbnQgKCpzeW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICopLAorCQkgICAgICAgaW50ICgqdW5zeW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhLCAqdG1wOworCWludCBlcnI7CisKKwkvKiBmaXJzdCBnbyB0aHJvdWdoIGFuZCBmbHVzaCBvdXQgYW55IHN0YWxlIGVudHJpZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGEsIHRtcCwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFoYS0+c3luY19jbnQgfHwgaGEtPnJlZmNvdW50ICE9IDEpCisJCQljb250aW51ZTsKKworCQkvKiBpZiB1bnN5bmMgaXMgZGVmaW5lZCBhbmQgZmFpbHMgZGVmZXIgdW5zeW5jaW5nIGFkZHJlc3MgKi8KKwkJaWYgKHVuc3luYyAmJiB1bnN5bmMoZGV2LCBoYS0+YWRkcikpCisJCQljb250aW51ZTsKKworCQloYS0+c3luY19jbnQtLTsKKwkJX19od19hZGRyX2RlbF9lbnRyeShsaXN0LCBoYSwgZmFsc2UsIGZhbHNlKTsKKwl9CisKKwkvKiBnbyB0aHJvdWdoIGFuZCBzeW5jIG5ldyBlbnRyaWVzIHRvIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhhLCB0bXAsICZsaXN0LT5saXN0LCBsaXN0KSB7CisJCWlmIChoYS0+c3luY19jbnQpCisJCQljb250aW51ZTsKKworCQllcnIgPSBzeW5jKGRldiwgaGEtPmFkZHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQloYS0+c3luY19jbnQrKzsKKwkJaGEtPnJlZmNvdW50Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9faHdfYWRkcl9zeW5jX2Rldik7CisKKy8qKgorICogIF9faHdfYWRkcl91bnN5bmNfZGV2IC0gUmVtb3ZlIHN5bmNob25pemVkIGFkZHJlc3NlcyBmcm9tIGRldmljZQorICogIEBsaXN0OiBhZGRyZXNzIGxpc3QgdG8gcmVtb3ZlIHN5bmNyb25pemVkIGFkZHJlc3NlcyBmcm9tCisgKiAgQGRldjogIGRldmljZSB0byBzeW5jCisgKiAgQHVuc3luYzogZnVuY3Rpb24gdG8gY2FsbCBpZiBhZGRyZXNzIHNob3VsZCBiZSByZW1vdmVkCisgKgorICogIFJlbW92ZSBhbGwgYWRkcmVzc2VzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgZGV2aWNlIGJ5IF9faHdfYWRkcl9zeW5jX2RldigpLgorICogIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG5kb19zdG9wIG9yIG5kb19vcGVuCisgKiAgZnVuY3Rpb25zIG9uIGRldmljZXMgdGhhdCByZXF1aXJlIGV4cGxpY2l0IGFkZHJlc3MgYWRkL3JlbW92ZQorICogIG5vdGlmaWNhdGlvbnMuICBJZiB0aGUgdW5zeW5jIGZ1bmN0aW9uIHBvaW50ZXIgaXMgTlVMTCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAqICBjYW4gYmUgdXNlZCB0byBqdXN0IHJlc2V0IHRoZSBzeW5jX2NudCBmb3IgdGhlIGFkZHJlc3NlcyBpbiB0aGUgbGlzdC4KKyAqKi8KK3ZvaWQgX19od19hZGRyX3Vuc3luY19kZXYoc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QgKmxpc3QsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIGludCAoKnVuc3luYykoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhhLCB0bXAsICZsaXN0LT5saXN0LCBsaXN0KSB7CisJCWlmICghaGEtPnN5bmNfY250KQorCQkJY29udGludWU7CisKKwkJLyogaWYgdW5zeW5jIGlzIGRlZmluZWQgYW5kIGZhaWxzIGRlZmVyIHVuc3luY2luZyBhZGRyZXNzICovCisJCWlmICh1bnN5bmMgJiYgdW5zeW5jKGRldiwgaGEtPmFkZHIpKQorCQkJY29udGludWU7CisKKwkJaGEtPnN5bmNfY250LS07CisJCV9faHdfYWRkcl9kZWxfZW50cnkobGlzdCwgaGEsIGZhbHNlLCBmYWxzZSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChfX2h3X2FkZHJfdW5zeW5jX2Rldik7CisKIHN0YXRpYyB2b2lkIF9faHdfYWRkcl9mbHVzaChzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHJfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhLCAqdG1wOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZXRodG9vbC5jIGIvbmV0L2NvcmUvZXRodG9vbC5jCmluZGV4IDY0MGJhMGUuLjE3Y2I5MTIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2V0aHRvb2wuYworKysgYi9uZXQvY29yZS9ldGh0b29sLmMKQEAgLTU1Nyw2ICs1NTcsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGV0aHRvb2xfY29weV92YWxpZGF0ZV9pbmRpcih1MzIgKmluZGlyLCB2b2lkIF9fdXNlciAqdXNlcmFkZHIsCisJCQkJCXN0cnVjdCBldGh0b29sX3J4bmZjICpyeF9yaW5ncywKKwkJCQkJdTMyIHNpemUpCit7CisJaW50IGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5kaXIsIHVzZXJhZGRyLCBzaXplICogc2l6ZW9mKGluZGlyWzBdKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogVmFsaWRhdGUgcmluZyBpbmRpY2VzICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKGluZGlyW2ldID49IHJ4X3JpbmdzLT5kYXRhKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQgZXRodG9vbF9nZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCiB7CkBAIC01NjUsNyArNTgyLDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplIHx8Ci0JICAgICFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcikKKwkgICAgIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJZGV2X3NpemUgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplKGRldik7CiAJaWYgKGRldl9zaXplID09IDApCkBAIC01OTEsNyArNjA4LDcgQEAKIAlpZiAoIWluZGlyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoX2luZGlyKGRldiwgaW5kaXIpOworCXJldCA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoKGRldiwgaW5kaXIsIE5VTEwpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC02MTMsOCArNjMwLDkgQEAKIAl1MzIgKmluZGlyOwogCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKIAlpbnQgcmV0OworCXUzMiByaW5naWR4X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIsIHJpbmdfaW5kZXhbMF0pOwogCi0JaWYgKCFvcHMtPmdldF9yeGZoX2luZGlyX3NpemUgfHwgIW9wcy0+c2V0X3J4ZmhfaW5kaXIgfHwKKwlpZiAoIW9wcy0+Z2V0X3J4ZmhfaW5kaXJfc2l6ZSB8fCAhb3BzLT5zZXRfcnhmaCB8fAogCSAgICAhb3BzLT5nZXRfcnhuZmMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIApAQCAtNjQzLDMxICs2NjEsMTg3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBkZXZfc2l6ZTsgaSsrKQogCQkJaW5kaXJbaV0gPSBldGh0b29sX3J4ZmhfaW5kaXJfZGVmYXVsdChpLCByeF9yaW5ncy5kYXRhKTsKIAl9IGVsc2UgewotCQlpZiAoY29weV9mcm9tX3VzZXIoaW5kaXIsCi0JCQkJICB1c2VyYWRkciArCi0JCQkJICBvZmZzZXRvZihzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyLAotCQkJCQkgICByaW5nX2luZGV4WzBdKSwKLQkJCQkgIGRldl9zaXplICogc2l6ZW9mKGluZGlyWzBdKSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7CisJCXJldCA9IGV0aHRvb2xfY29weV92YWxpZGF0ZV9pbmRpcihpbmRpciwKKwkJCQkJCSAgdXNlcmFkZHIgKyByaW5naWR4X29mZnNldCwKKwkJCQkJCSAgJnJ4X3JpbmdzLAorCQkJCQkJICBkZXZfc2l6ZSk7CisJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIFZhbGlkYXRlIHJpbmcgaW5kaWNlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3NpemU7IGkrKykgewotCQkJaWYgKGluZGlyW2ldID49IHJ4X3JpbmdzLmRhdGEpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9CiAJfQogCi0JcmV0ID0gb3BzLT5zZXRfcnhmaF9pbmRpcihkZXYsIGluZGlyKTsKKwlyZXQgPSBvcHMtPnNldF9yeGZoKGRldiwgaW5kaXIsIE5VTEwpOwogCiBvdXQ6CiAJa2ZyZWUoaW5kaXIpOwogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGV0aHRvb2xfZ2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKKwl1MzIgdXNlcl9pbmRpcl9zaXplLCB1c2VyX2tleV9zaXplOworCXUzMiBkZXZfaW5kaXJfc2l6ZSA9IDAsIGRldl9rZXlfc2l6ZSA9IDA7CisJc3RydWN0IGV0aHRvb2xfcnhmaCByeGZoOworCXUzMiB0b3RhbF9zaXplOworCXUzMiBpbmRpcl9ieXRlczsKKwl1MzIgKmluZGlyID0gTlVMTDsKKwl1OCAqaGtleSA9IE5VTEw7CisJdTggKnJzc19jb25maWc7CisKKwlpZiAoIShkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplIHx8CisJICAgICAgZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4Zmhfa2V5X3NpemUpIHx8CisJICAgICAgIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAob3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplKQorCQlkZXZfaW5kaXJfc2l6ZSA9IG9wcy0+Z2V0X3J4ZmhfaW5kaXJfc2l6ZShkZXYpOworCWlmIChvcHMtPmdldF9yeGZoX2tleV9zaXplKQorCQlkZXZfa2V5X3NpemUgPSBvcHMtPmdldF9yeGZoX2tleV9zaXplKGRldik7CisKKwlpZiAoKGRldl9rZXlfc2l6ZSArIGRldl9pbmRpcl9zaXplKSA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJ4ZmgsIHVzZXJhZGRyLCBzaXplb2YocnhmaCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl1c2VyX2luZGlyX3NpemUgPSByeGZoLmluZGlyX3NpemU7CisJdXNlcl9rZXlfc2l6ZSA9IHJ4Zmgua2V5X3NpemU7CisKKwkvKiBDaGVjayB0aGF0IHJlc2VydmVkIGZpZWxkcyBhcmUgMCBmb3Igbm93ICovCisJaWYgKHJ4ZmgucnNzX2NvbnRleHQgfHwgcnhmaC5yc3ZkWzBdIHx8IHJ4ZmgucnN2ZFsxXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyeGZoLmluZGlyX3NpemUgPSBkZXZfaW5kaXJfc2l6ZTsKKwlyeGZoLmtleV9zaXplID0gZGV2X2tleV9zaXplOworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZyeGZoLCBzaXplb2YocnhmaCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIElmIHRoZSB1c2VyIGJ1ZmZlciBzaXplIGlzIDAsIHRoaXMgaXMganVzdCBhIHF1ZXJ5IGZvciB0aGUKKwkgKiBkZXZpY2UgdGFibGUgc2l6ZSBhbmQga2V5IHNpemUuICBPdGhlcndpc2UsIGlmIHRoZSBVc2VyIHNpemUgaXMKKwkgKiBub3QgZXF1YWwgdG8gZGV2aWNlIHRhYmxlIHNpemUgb3Iga2V5IHNpemUgaXQncyBhbiBlcnJvci4KKwkgKi8KKwlpZiAoIXVzZXJfaW5kaXJfc2l6ZSAmJiAhdXNlcl9rZXlfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHVzZXJfaW5kaXJfc2l6ZSAmJiAodXNlcl9pbmRpcl9zaXplICE9IGRldl9pbmRpcl9zaXplKSkgfHwKKwkgICAgKHVzZXJfa2V5X3NpemUgJiYgKHVzZXJfa2V5X3NpemUgIT0gZGV2X2tleV9zaXplKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5kaXJfYnl0ZXMgPSB1c2VyX2luZGlyX3NpemUgKiBzaXplb2YoaW5kaXJbMF0pOworCXRvdGFsX3NpemUgPSBpbmRpcl9ieXRlcyArIHVzZXJfa2V5X3NpemU7CisJcnNzX2NvbmZpZyA9IGt6YWxsb2ModG90YWxfc2l6ZSwgR0ZQX1VTRVIpOworCWlmICghcnNzX2NvbmZpZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodXNlcl9pbmRpcl9zaXplKQorCQlpbmRpciA9ICh1MzIgKilyc3NfY29uZmlnOworCisJaWYgKHVzZXJfa2V5X3NpemUpCisJCWhrZXkgPSByc3NfY29uZmlnICsgaW5kaXJfYnl0ZXM7CisKKwlyZXQgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaChkZXYsIGluZGlyLCBoa2V5KTsKKwlpZiAoIXJldCkgeworCQlpZiAoY29weV90b191c2VyKHVzZXJhZGRyICsKKwkJCQkgb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcnhmaCwgcnNzX2NvbmZpZ1swXSksCisJCQkJIHJzc19jb25maWcsIHRvdGFsX3NpemUpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShyc3NfY29uZmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGV0aHRvb2xfc2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKKwlzdHJ1Y3QgZXRodG9vbF9yeG5mYyByeF9yaW5nczsKKwlzdHJ1Y3QgZXRodG9vbF9yeGZoIHJ4Zmg7CisJdTMyIGRldl9pbmRpcl9zaXplID0gMCwgZGV2X2tleV9zaXplID0gMCwgaTsKKwl1MzIgKmluZGlyID0gTlVMTCwgaW5kaXJfYnl0ZXMgPSAwOworCXU4ICpoa2V5ID0gTlVMTDsKKwl1OCAqcnNzX2NvbmZpZzsKKwl1MzIgcnNzX2NmZ19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZXRodG9vbF9yeGZoLCByc3NfY29uZmlnWzBdKTsKKworCWlmICghKG9wcy0+Z2V0X3J4ZmhfaW5kaXJfc2l6ZSB8fCBvcHMtPmdldF9yeGZoX2tleV9zaXplKSB8fAorCSAgICAhb3BzLT5nZXRfcnhuZmMgfHwgIW9wcy0+c2V0X3J4ZmgpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChvcHMtPmdldF9yeGZoX2luZGlyX3NpemUpCisJCWRldl9pbmRpcl9zaXplID0gb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplKGRldik7CisJaWYgKG9wcy0+Z2V0X3J4Zmhfa2V5X3NpemUpCisJCWRldl9rZXlfc2l6ZSA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoX2tleV9zaXplKGRldik7CisJaWYgKChkZXZfa2V5X3NpemUgKyBkZXZfaW5kaXJfc2l6ZSkgPT0gMCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyeGZoLCB1c2VyYWRkciwgc2l6ZW9mKHJ4ZmgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBDaGVjayB0aGF0IHJlc2VydmVkIGZpZWxkcyBhcmUgMCBmb3Igbm93ICovCisJaWYgKHJ4ZmgucnNzX2NvbnRleHQgfHwgcnhmaC5yc3ZkWzBdIHx8IHJ4ZmgucnN2ZFsxXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBJZiBlaXRoZXIgaW5kaXIgb3IgaGFzaCBrZXkgaXMgdmFsaWQsIHByb2NlZWQgZnVydGhlci4KKwkgKiBJdCBpcyBub3QgdmFsaWQgdG8gcmVxdWVzdCB0aGF0IGJvdGggYmUgdW5jaGFuZ2VkLgorCSAqLworCWlmICgocnhmaC5pbmRpcl9zaXplICYmCisJICAgICByeGZoLmluZGlyX3NpemUgIT0gRVRIX1JYRkhfSU5ESVJfTk9fQ0hBTkdFICYmCisJICAgICByeGZoLmluZGlyX3NpemUgIT0gZGV2X2luZGlyX3NpemUpIHx8CisJICAgIChyeGZoLmtleV9zaXplICYmIChyeGZoLmtleV9zaXplICE9IGRldl9rZXlfc2l6ZSkpIHx8CisJICAgIChyeGZoLmluZGlyX3NpemUgPT0gRVRIX1JYRkhfSU5ESVJfTk9fQ0hBTkdFICYmCisJICAgICByeGZoLmtleV9zaXplID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyeGZoLmluZGlyX3NpemUgIT0gRVRIX1JYRkhfSU5ESVJfTk9fQ0hBTkdFKQorCQlpbmRpcl9ieXRlcyA9IGRldl9pbmRpcl9zaXplICogc2l6ZW9mKGluZGlyWzBdKTsKKworCXJzc19jb25maWcgPSBremFsbG9jKGluZGlyX2J5dGVzICsgcnhmaC5rZXlfc2l6ZSwgR0ZQX1VTRVIpOworCWlmICghcnNzX2NvbmZpZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyeF9yaW5ncy5jbWQgPSBFVEhUT09MX0dSWFJJTkdTOworCXJldCA9IG9wcy0+Z2V0X3J4bmZjKGRldiwgJnJ4X3JpbmdzLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIHJ4ZmguaW5kaXJfc2l6ZSA9PSAwIG1lYW5zIHJlc2V0IHRoZSBpbmRpciB0YWJsZSB0byBkZWZhdWx0LgorCSAqIHJ4ZmguaW5kaXJfc2l6ZSA9PSBFVEhfUlhGSF9JTkRJUl9OT19DSEFOR0UgbWVhbnMgbGVhdmUgaXQgdW5jaGFuZ2VkLgorCSAqLworCWlmIChyeGZoLmluZGlyX3NpemUgJiYKKwkgICAgcnhmaC5pbmRpcl9zaXplICE9IEVUSF9SWEZIX0lORElSX05PX0NIQU5HRSkgeworCQlpbmRpciA9ICh1MzIgKilyc3NfY29uZmlnOworCQlyZXQgPSBldGh0b29sX2NvcHlfdmFsaWRhdGVfaW5kaXIoaW5kaXIsCisJCQkJCQkgIHVzZXJhZGRyICsgcnNzX2NmZ19vZmZzZXQsCisJCQkJCQkgICZyeF9yaW5ncywKKwkJCQkJCSAgcnhmaC5pbmRpcl9zaXplKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocnhmaC5pbmRpcl9zaXplID09IDApIHsKKwkJaW5kaXIgPSAodTMyICopcnNzX2NvbmZpZzsKKwkJZm9yIChpID0gMDsgaSA8IGRldl9pbmRpcl9zaXplOyBpKyspCisJCQlpbmRpcltpXSA9IGV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0KGksIHJ4X3JpbmdzLmRhdGEpOworCX0KKworCWlmIChyeGZoLmtleV9zaXplKSB7CisJCWhrZXkgPSByc3NfY29uZmlnICsgaW5kaXJfYnl0ZXM7CisJCWlmIChjb3B5X2Zyb21fdXNlcihoa2V5LAorCQkJCSAgIHVzZXJhZGRyICsgcnNzX2NmZ19vZmZzZXQgKyBpbmRpcl9ieXRlcywKKwkJCQkgICByeGZoLmtleV9zaXplKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gb3BzLT5zZXRfcnhmaChkZXYsIGluZGlyLCBoa2V5KTsKKworb3V0OgorCWtmcmVlKHJzc19jb25maWcpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgZXRodG9vbF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCiB7CiAJc3RydWN0IGV0aHRvb2xfcmVncyByZWdzOwpAQCAtMTQ5MSw2ICsxNjY1LDcgQEAKIAljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKIAljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CiAJY2FzZSBFVEhUT09MX0dSWEZISU5ESVI6CisJY2FzZSBFVEhUT09MX0dSU1NIOgogCWNhc2UgRVRIVE9PTF9HRkVBVFVSRVM6CiAJY2FzZSBFVEhUT09MX0dDSEFOTkVMUzoKIAljYXNlIEVUSFRPT0xfR0VUX1RTX0lORk86CkBAIC0xNjI4LDYgKzE4MDMsMTIgQEAKIAljYXNlIEVUSFRPT0xfU1JYRkhJTkRJUjoKIAkJcmMgPSBldGh0b29sX3NldF9yeGZoX2luZGlyKGRldiwgdXNlcmFkZHIpOwogCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JTU0g6CisJCXJjID0gZXRodG9vbF9nZXRfcnhmaChkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSU1NIOgorCQlyYyA9IGV0aHRvb2xfc2V0X3J4ZmgoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOwogCWNhc2UgRVRIVE9PTF9HRkVBVFVSRVM6CiAJCXJjID0gZXRodG9vbF9nZXRfZmVhdHVyZXMoZGV2LCB1c2VyYWRkcik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCA0YWVjN2I5Li43MzVmYWQ4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtNDUsNiArNDUsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQlBGX1IwCXJlZ3NbQlBGX1JFR18wXQorI2RlZmluZSBCUEZfUjEJcmVnc1tCUEZfUkVHXzFdCisjZGVmaW5lIEJQRl9SMglyZWdzW0JQRl9SRUdfMl0KKyNkZWZpbmUgQlBGX1IzCXJlZ3NbQlBGX1JFR18zXQorI2RlZmluZSBCUEZfUjQJcmVnc1tCUEZfUkVHXzRdCisjZGVmaW5lIEJQRl9SNQlyZWdzW0JQRl9SRUdfNV0KKyNkZWZpbmUgQlBGX1I2CXJlZ3NbQlBGX1JFR182XQorI2RlZmluZSBCUEZfUjcJcmVnc1tCUEZfUkVHXzddCisjZGVmaW5lIEJQRl9SOAlyZWdzW0JQRl9SRUdfOF0KKyNkZWZpbmUgQlBGX1I5CXJlZ3NbQlBGX1JFR185XQorI2RlZmluZSBCUEZfUjEwCXJlZ3NbQlBGX1JFR18xMF0KKworLyogTmFtZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIERTVAlyZWdzW2luc24tPmRzdF9yZWddCisjZGVmaW5lIFNSQwlyZWdzW2luc24tPnNyY19yZWddCisjZGVmaW5lIEZQCXJlZ3NbQlBGX1JFR19GUF0KKyNkZWZpbmUgQVJHMQlyZWdzW0JQRl9SRUdfQVJHMV0KKyNkZWZpbmUgQ1RYCXJlZ3NbQlBGX1JFR19DVFhdCisjZGVmaW5lIElNTQlpbnNuLT5pbW0KKwogLyogTm8gaHVycnkgaW4gdGhpcyBicmFuY2gKICAqCiAgKiBFeHBvcnRlZCBmb3IgdGhlIGJwZiBqaXQgbG9hZCBoZWxwZXIuCkBAIC01Nyw5ICs3OCw5IEBACiAJCXB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgayAtIFNLRl9ORVRfT0ZGOwogCWVsc2UgaWYgKGsgPj0gU0tGX0xMX09GRikKIAkJcHRyID0gc2tiX21hY19oZWFkZXIoc2tiKSArIGsgLSBTS0ZfTExfT0ZGOwotCiAJaWYgKHB0ciA+PSBza2ItPmhlYWQgJiYgcHRyICsgc2l6ZSA8PSBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCXJldHVybiBwdHI7CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNjgsNiArODksNyBAQAogewogCWlmIChrID49IDApCiAJCXJldHVybiBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCBzaXplLCBidWZmZXIpOworCiAJcmV0dXJuIGJwZl9pbnRlcm5hbF9sb2FkX3BvaW50ZXJfbmVnX2hlbHBlcihza2IsIGssIHNpemUpOwogfQogCkBAIC0xMjIsMTMgKzE0NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFJlZ2lzdGVyIG1hcHBpbmdzIGZvciB1c2VyIHByb2dyYW1zLiAqLwotI2RlZmluZSBBX1JFRwkJMAotI2RlZmluZSBYX1JFRwkJNwotI2RlZmluZSBUTVBfUkVHCQk4Ci0jZGVmaW5lIEFSRzJfUkVHCTIKLSNkZWZpbmUgQVJHM19SRUcJMwotCiAvKioKICAqCV9fc2tfcnVuX2ZpbHRlciAtIHJ1biBhIGZpbHRlciBvbiBhIGdpdmVuIGNvbnRleHQKICAqCUBjdHg6IGJ1ZmZlciB0byBydW4gdGhlIGZpbHRlciBvbgpAQCAtMTM4LDQ0NyArMTUzLDQ0MiBAQAogICoga2VlcCwgMCBmb3Igbm9uZS4gQGN0eCBpcyB0aGUgZGF0YSB3ZSBhcmUgb3BlcmF0aW5nIG9uLCBAaW5zbiBpcyB0aGUKICAqIGFycmF5IG9mIGZpbHRlciBpbnN0cnVjdGlvbnMuCiAgKi8KLXVuc2lnbmVkIGludCBfX3NrX3J1bl9maWx0ZXIodm9pZCAqY3R4LCBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXJfaW50ICppbnNuKQorc3RhdGljIHVuc2lnbmVkIGludCBfX3NrX3J1bl9maWx0ZXIodm9pZCAqY3R4LCBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXJfaW50ICppbnNuKQogewogCXU2NCBzdGFja1tNQVhfQlBGX1NUQUNLIC8gc2l6ZW9mKHU2NCldOwogCXU2NCByZWdzW01BWF9CUEZfUkVHXSwgdG1wOwotCXZvaWQgKnB0cjsKLQlpbnQgb2ZmOwotCi0jZGVmaW5lIEsgIGluc24tPmltbQotI2RlZmluZSBBICByZWdzW2luc24tPmFfcmVnXQotI2RlZmluZSBYICByZWdzW2luc24tPnhfcmVnXQotI2RlZmluZSBSMCByZWdzWzBdCi0KLSNkZWZpbmUgQ09OVAkgKHtpbnNuKys7IGdvdG8gc2VsZWN0X2luc247IH0pCi0jZGVmaW5lIENPTlRfSk1QICh7aW5zbisrOyBnb3RvIHNlbGVjdF9pbnNuOyB9KQotCiAJc3RhdGljIGNvbnN0IHZvaWQgKmp1bXB0YWJsZVsyNTZdID0gewogCQlbMCAuLi4gMjU1XSA9ICYmZGVmYXVsdF9sYWJlbCwKIAkJLyogTm93IG92ZXJ3cml0ZSBub24tZGVmYXVsdHMgLi4uICovCi0jZGVmaW5lIERMKEEsIEIsIEMpCVtBfEJ8Q10gPSAmJkEjI18jI0IjI18jI0MKLQkJREwoQlBGX0FMVSwgQlBGX0FERCwgQlBGX1gpLAotCQlETChCUEZfQUxVLCBCUEZfQURELCBCUEZfSyksCi0JCURMKEJQRl9BTFUsIEJQRl9TVUIsIEJQRl9YKSwKLQkJREwoQlBGX0FMVSwgQlBGX1NVQiwgQlBGX0spLAotCQlETChCUEZfQUxVLCBCUEZfQU5ELCBCUEZfWCksCi0JCURMKEJQRl9BTFUsIEJQRl9BTkQsIEJQRl9LKSwKLQkJREwoQlBGX0FMVSwgQlBGX09SLCBCUEZfWCksCi0JCURMKEJQRl9BTFUsIEJQRl9PUiwgQlBGX0spLAotCQlETChCUEZfQUxVLCBCUEZfTFNILCBCUEZfWCksCi0JCURMKEJQRl9BTFUsIEJQRl9MU0gsIEJQRl9LKSwKLQkJREwoQlBGX0FMVSwgQlBGX1JTSCwgQlBGX1gpLAotCQlETChCUEZfQUxVLCBCUEZfUlNILCBCUEZfSyksCi0JCURMKEJQRl9BTFUsIEJQRl9YT1IsIEJQRl9YKSwKLQkJREwoQlBGX0FMVSwgQlBGX1hPUiwgQlBGX0spLAotCQlETChCUEZfQUxVLCBCUEZfTVVMLCBCUEZfWCksCi0JCURMKEJQRl9BTFUsIEJQRl9NVUwsIEJQRl9LKSwKLQkJREwoQlBGX0FMVSwgQlBGX01PViwgQlBGX1gpLAotCQlETChCUEZfQUxVLCBCUEZfTU9WLCBCUEZfSyksCi0JCURMKEJQRl9BTFUsIEJQRl9ESVYsIEJQRl9YKSwKLQkJREwoQlBGX0FMVSwgQlBGX0RJViwgQlBGX0spLAotCQlETChCUEZfQUxVLCBCUEZfTU9ELCBCUEZfWCksCi0JCURMKEJQRl9BTFUsIEJQRl9NT0QsIEJQRl9LKSwKLQkJREwoQlBGX0FMVSwgQlBGX05FRywgMCksCi0JCURMKEJQRl9BTFUsIEJQRl9FTkQsIEJQRl9UT19CRSksCi0JCURMKEJQRl9BTFUsIEJQRl9FTkQsIEJQRl9UT19MRSksCi0JCURMKEJQRl9BTFU2NCwgQlBGX0FERCwgQlBGX1gpLAotCQlETChCUEZfQUxVNjQsIEJQRl9BREQsIEJQRl9LKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfU1VCLCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX1NVQiwgQlBGX0spLAotCQlETChCUEZfQUxVNjQsIEJQRl9BTkQsIEJQRl9YKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfQU5ELCBCUEZfSyksCi0JCURMKEJQRl9BTFU2NCwgQlBGX09SLCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX09SLCBCUEZfSyksCi0JCURMKEJQRl9BTFU2NCwgQlBGX0xTSCwgQlBGX1gpLAotCQlETChCUEZfQUxVNjQsIEJQRl9MU0gsIEJQRl9LKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfUlNILCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX1JTSCwgQlBGX0spLAotCQlETChCUEZfQUxVNjQsIEJQRl9YT1IsIEJQRl9YKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfWE9SLCBCUEZfSyksCi0JCURMKEJQRl9BTFU2NCwgQlBGX01VTCwgQlBGX1gpLAotCQlETChCUEZfQUxVNjQsIEJQRl9NVUwsIEJQRl9LKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfTU9WLCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX01PViwgQlBGX0spLAotCQlETChCUEZfQUxVNjQsIEJQRl9BUlNILCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX0FSU0gsIEJQRl9LKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfRElWLCBCUEZfWCksCi0JCURMKEJQRl9BTFU2NCwgQlBGX0RJViwgQlBGX0spLAotCQlETChCUEZfQUxVNjQsIEJQRl9NT0QsIEJQRl9YKSwKLQkJREwoQlBGX0FMVTY0LCBCUEZfTU9ELCBCUEZfSyksCi0JCURMKEJQRl9BTFU2NCwgQlBGX05FRywgMCksCi0JCURMKEJQRl9KTVAsIEJQRl9DQUxMLCAwKSwKLQkJREwoQlBGX0pNUCwgQlBGX0pBLCAwKSwKLQkJREwoQlBGX0pNUCwgQlBGX0pFUSwgQlBGX1gpLAotCQlETChCUEZfSk1QLCBCUEZfSkVRLCBCUEZfSyksCi0JCURMKEJQRl9KTVAsIEJQRl9KTkUsIEJQRl9YKSwKLQkJREwoQlBGX0pNUCwgQlBGX0pORSwgQlBGX0spLAotCQlETChCUEZfSk1QLCBCUEZfSkdULCBCUEZfWCksCi0JCURMKEJQRl9KTVAsIEJQRl9KR1QsIEJQRl9LKSwKLQkJREwoQlBGX0pNUCwgQlBGX0pHRSwgQlBGX1gpLAotCQlETChCUEZfSk1QLCBCUEZfSkdFLCBCUEZfSyksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0dULCBCUEZfWCksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0dULCBCUEZfSyksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0dFLCBCUEZfWCksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0dFLCBCUEZfSyksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0VULCBCUEZfWCksCi0JCURMKEJQRl9KTVAsIEJQRl9KU0VULCBCUEZfSyksCi0JCURMKEJQRl9KTVAsIEJQRl9FWElULCAwKSwKLQkJREwoQlBGX1NUWCwgQlBGX01FTSwgQlBGX0IpLAotCQlETChCUEZfU1RYLCBCUEZfTUVNLCBCUEZfSCksCi0JCURMKEJQRl9TVFgsIEJQRl9NRU0sIEJQRl9XKSwKLQkJREwoQlBGX1NUWCwgQlBGX01FTSwgQlBGX0RXKSwKLQkJREwoQlBGX1NUWCwgQlBGX1hBREQsIEJQRl9XKSwKLQkJREwoQlBGX1NUWCwgQlBGX1hBREQsIEJQRl9EVyksCi0JCURMKEJQRl9TVCwgQlBGX01FTSwgQlBGX0IpLAotCQlETChCUEZfU1QsIEJQRl9NRU0sIEJQRl9IKSwKLQkJREwoQlBGX1NULCBCUEZfTUVNLCBCUEZfVyksCi0JCURMKEJQRl9TVCwgQlBGX01FTSwgQlBGX0RXKSwKLQkJREwoQlBGX0xEWCwgQlBGX01FTSwgQlBGX0IpLAotCQlETChCUEZfTERYLCBCUEZfTUVNLCBCUEZfSCksCi0JCURMKEJQRl9MRFgsIEJQRl9NRU0sIEJQRl9XKSwKLQkJREwoQlBGX0xEWCwgQlBGX01FTSwgQlBGX0RXKSwKLQkJREwoQlBGX0xELCBCUEZfQUJTLCBCUEZfVyksCi0JCURMKEJQRl9MRCwgQlBGX0FCUywgQlBGX0gpLAotCQlETChCUEZfTEQsIEJQRl9BQlMsIEJQRl9CKSwKLQkJREwoQlBGX0xELCBCUEZfSU5ELCBCUEZfVyksCi0JCURMKEJQRl9MRCwgQlBGX0lORCwgQlBGX0gpLAotCQlETChCUEZfTEQsIEJQRl9JTkQsIEJQRl9CKSwKLSN1bmRlZiBETAorCQkvKiAzMiBiaXQgQUxVIG9wZXJhdGlvbnMgKi8KKwkJW0JQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1hdID0gJiZBTFVfQUREX1gsCisJCVtCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LXSA9ICYmQUxVX0FERF9LLAorCQlbQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfWF0gPSAmJkFMVV9TVUJfWCwKKwkJW0JQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX0tdID0gJiZBTFVfU1VCX0ssCisJCVtCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9YXSA9ICYmQUxVX0FORF9YLAorCQlbQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfS10gPSAmJkFMVV9BTkRfSywKKwkJW0JQRl9BTFUgfCBCUEZfT1IgfCBCUEZfWF0gID0gJiZBTFVfT1JfWCwKKwkJW0JQRl9BTFUgfCBCUEZfT1IgfCBCUEZfS10gID0gJiZBTFVfT1JfSywKKwkJW0JQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX1hdID0gJiZBTFVfTFNIX1gsCisJCVtCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LXSA9ICYmQUxVX0xTSF9LLAorCQlbQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfWF0gPSAmJkFMVV9SU0hfWCwKKwkJW0JQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX0tdID0gJiZBTFVfUlNIX0ssCisJCVtCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YXSA9ICYmQUxVX1hPUl9YLAorCQlbQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfS10gPSAmJkFMVV9YT1JfSywKKwkJW0JQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX1hdID0gJiZBTFVfTVVMX1gsCisJCVtCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LXSA9ICYmQUxVX01VTF9LLAorCQlbQlBGX0FMVSB8IEJQRl9NT1YgfCBCUEZfWF0gPSAmJkFMVV9NT1ZfWCwKKwkJW0JQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0tdID0gJiZBTFVfTU9WX0ssCisJCVtCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YXSA9ICYmQUxVX0RJVl9YLAorCQlbQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfS10gPSAmJkFMVV9ESVZfSywKKwkJW0JQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX1hdID0gJiZBTFVfTU9EX1gsCisJCVtCUEZfQUxVIHwgQlBGX01PRCB8IEJQRl9LXSA9ICYmQUxVX01PRF9LLAorCQlbQlBGX0FMVSB8IEJQRl9ORUddID0gJiZBTFVfTkVHLAorCQlbQlBGX0FMVSB8IEJQRl9FTkQgfCBCUEZfVE9fQkVdID0gJiZBTFVfRU5EX1RPX0JFLAorCQlbQlBGX0FMVSB8IEJQRl9FTkQgfCBCUEZfVE9fTEVdID0gJiZBTFVfRU5EX1RPX0xFLAorCQkvKiA2NCBiaXQgQUxVIG9wZXJhdGlvbnMgKi8KKwkJW0JQRl9BTFU2NCB8IEJQRl9BREQgfCBCUEZfWF0gPSAmJkFMVTY0X0FERF9YLAorCQlbQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9LXSA9ICYmQUxVNjRfQUREX0ssCisJCVtCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX1hdID0gJiZBTFU2NF9TVUJfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9TVUIgfCBCUEZfS10gPSAmJkFMVTY0X1NVQl9LLAorCQlbQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9YXSA9ICYmQUxVNjRfQU5EX1gsCisJCVtCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX0tdID0gJiZBTFU2NF9BTkRfSywKKwkJW0JQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9YXSA9ICYmQUxVNjRfT1JfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9LXSA9ICYmQUxVNjRfT1JfSywKKwkJW0JQRl9BTFU2NCB8IEJQRl9MU0ggfCBCUEZfWF0gPSAmJkFMVTY0X0xTSF9YLAorCQlbQlBGX0FMVTY0IHwgQlBGX0xTSCB8IEJQRl9LXSA9ICYmQUxVNjRfTFNIX0ssCisJCVtCUEZfQUxVNjQgfCBCUEZfUlNIIHwgQlBGX1hdID0gJiZBTFU2NF9SU0hfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9SU0ggfCBCUEZfS10gPSAmJkFMVTY0X1JTSF9LLAorCQlbQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YXSA9ICYmQUxVNjRfWE9SX1gsCisJCVtCUEZfQUxVNjQgfCBCUEZfWE9SIHwgQlBGX0tdID0gJiZBTFU2NF9YT1JfSywKKwkJW0JQRl9BTFU2NCB8IEJQRl9NVUwgfCBCUEZfWF0gPSAmJkFMVTY0X01VTF9YLAorCQlbQlBGX0FMVTY0IHwgQlBGX01VTCB8IEJQRl9LXSA9ICYmQUxVNjRfTVVMX0ssCisJCVtCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1hdID0gJiZBTFU2NF9NT1ZfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfS10gPSAmJkFMVTY0X01PVl9LLAorCQlbQlBGX0FMVTY0IHwgQlBGX0FSU0ggfCBCUEZfWF0gPSAmJkFMVTY0X0FSU0hfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9BUlNIIHwgQlBGX0tdID0gJiZBTFU2NF9BUlNIX0ssCisJCVtCUEZfQUxVNjQgfCBCUEZfRElWIHwgQlBGX1hdID0gJiZBTFU2NF9ESVZfWCwKKwkJW0JQRl9BTFU2NCB8IEJQRl9ESVYgfCBCUEZfS10gPSAmJkFMVTY0X0RJVl9LLAorCQlbQlBGX0FMVTY0IHwgQlBGX01PRCB8IEJQRl9YXSA9ICYmQUxVNjRfTU9EX1gsCisJCVtCUEZfQUxVNjQgfCBCUEZfTU9EIHwgQlBGX0tdID0gJiZBTFU2NF9NT0RfSywKKwkJW0JQRl9BTFU2NCB8IEJQRl9ORUddID0gJiZBTFU2NF9ORUcsCisJCS8qIENhbGwgaW5zdHJ1Y3Rpb24gKi8KKwkJW0JQRl9KTVAgfCBCUEZfQ0FMTF0gPSAmJkpNUF9DQUxMLAorCQkvKiBKdW1wcyAqLworCQlbQlBGX0pNUCB8IEJQRl9KQV0gPSAmJkpNUF9KQSwKKwkJW0JQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1hdID0gJiZKTVBfSkVRX1gsCisJCVtCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LXSA9ICYmSk1QX0pFUV9LLAorCQlbQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWF0gPSAmJkpNUF9KTkVfWCwKKwkJW0JQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0tdID0gJiZKTVBfSk5FX0ssCisJCVtCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YXSA9ICYmSk1QX0pHVF9YLAorCQlbQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfS10gPSAmJkpNUF9KR1RfSywKKwkJW0JQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1hdID0gJiZKTVBfSkdFX1gsCisJCVtCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LXSA9ICYmSk1QX0pHRV9LLAorCQlbQlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX1hdID0gJiZKTVBfSlNHVF9YLAorCQlbQlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX0tdID0gJiZKTVBfSlNHVF9LLAorCQlbQlBGX0pNUCB8IEJQRl9KU0dFIHwgQlBGX1hdID0gJiZKTVBfSlNHRV9YLAorCQlbQlBGX0pNUCB8IEJQRl9KU0dFIHwgQlBGX0tdID0gJiZKTVBfSlNHRV9LLAorCQlbQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1hdID0gJiZKTVBfSlNFVF9YLAorCQlbQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0tdID0gJiZKTVBfSlNFVF9LLAorCQkvKiBQcm9ncmFtIHJldHVybiAqLworCQlbQlBGX0pNUCB8IEJQRl9FWElUXSA9ICYmSk1QX0VYSVQsCisJCS8qIFN0b3JlIGluc3RydWN0aW9ucyAqLworCQlbQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfQl0gPSAmJlNUWF9NRU1fQiwKKwkJW0JQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0hdID0gJiZTVFhfTUVNX0gsCisJCVtCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XXSA9ICYmU1RYX01FTV9XLAorCQlbQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfRFddID0gJiZTVFhfTUVNX0RXLAorCQlbQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX1ddID0gJiZTVFhfWEFERF9XLAorCQlbQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX0RXXSA9ICYmU1RYX1hBRERfRFcsCisJCVtCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0JdID0gJiZTVF9NRU1fQiwKKwkJW0JQRl9TVCB8IEJQRl9NRU0gfCBCUEZfSF0gPSAmJlNUX01FTV9ILAorCQlbQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9XXSA9ICYmU1RfTUVNX1csCisJCVtCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0RXXSA9ICYmU1RfTUVNX0RXLAorCQkvKiBMb2FkIGluc3RydWN0aW9ucyAqLworCQlbQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfQl0gPSAmJkxEWF9NRU1fQiwKKwkJW0JQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0hdID0gJiZMRFhfTUVNX0gsCisJCVtCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XXSA9ICYmTERYX01FTV9XLAorCQlbQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfRFddID0gJiZMRFhfTUVNX0RXLAorCQlbQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9XXSA9ICYmTERfQUJTX1csCisJCVtCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0hdID0gJiZMRF9BQlNfSCwKKwkJW0JQRl9MRCB8IEJQRl9BQlMgfCBCUEZfQl0gPSAmJkxEX0FCU19CLAorCQlbQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9XXSA9ICYmTERfSU5EX1csCisJCVtCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0hdID0gJiZMRF9JTkRfSCwKKwkJW0JQRl9MRCB8IEJQRl9JTkQgfCBCUEZfQl0gPSAmJkxEX0lORF9CLAogCX07CisJdm9pZCAqcHRyOworCWludCBvZmY7CiAKLQlyZWdzW0ZQX1JFR10gID0gKHU2NCkgKHVuc2lnbmVkIGxvbmcpICZzdGFja1tBUlJBWV9TSVpFKHN0YWNrKV07Ci0JcmVnc1tBUkcxX1JFR10gPSAodTY0KSAodW5zaWduZWQgbG9uZykgY3R4OwotCXJlZ3NbQV9SRUddID0gMDsKLQlyZWdzW1hfUkVHXSA9IDA7CisjZGVmaW5lIENPTlQJICh7IGluc24rKzsgZ290byBzZWxlY3RfaW5zbjsgfSkKKyNkZWZpbmUgQ09OVF9KTVAgKHsgaW5zbisrOyBnb3RvIHNlbGVjdF9pbnNuOyB9KQorCisJRlAgPSAodTY0KSAodW5zaWduZWQgbG9uZykgJnN0YWNrW0FSUkFZX1NJWkUoc3RhY2spXTsKKwlBUkcxID0gKHU2NCkgKHVuc2lnbmVkIGxvbmcpIGN0eDsKKworCS8qIFJlZ2lzdGVycyB1c2VkIGluIGNsYXNzaWMgQlBGIHByb2dyYW1zIG5lZWQgdG8gYmUgcmVzZXQgZmlyc3QuICovCisJcmVnc1tCUEZfUkVHX0FdID0gMDsKKwlyZWdzW0JQRl9SRUdfWF0gPSAwOwogCiBzZWxlY3RfaW5zbjoKIAlnb3RvICpqdW1wdGFibGVbaW5zbi0+Y29kZV07CiAKIAkvKiBBTFUgKi8KICNkZWZpbmUgQUxVKE9QQ09ERSwgT1ApCQkJXAotCUJQRl9BTFU2NF8jI09QQ09ERSMjX0JQRl9YOglcCi0JCUEgPSBBIE9QIFg7CQlcCisJQUxVNjRfIyNPUENPREUjI19YOgkJXAorCQlEU1QgPSBEU1QgT1AgU1JDOwlcCiAJCUNPTlQ7CQkJXAotCUJQRl9BTFVfIyNPUENPREUjI19CUEZfWDoJXAotCQlBID0gKHUzMikgQSBPUCAodTMyKSBYOwlcCisJQUxVXyMjT1BDT0RFIyNfWDoJCVwKKwkJRFNUID0gKHUzMikgRFNUIE9QICh1MzIpIFNSQzsJXAogCQlDT05UOwkJCVwKLQlCUEZfQUxVNjRfIyNPUENPREUjI19CUEZfSzoJXAotCQlBID0gQSBPUCBLOwkJXAorCUFMVTY0XyMjT1BDT0RFIyNfSzoJCVwKKwkJRFNUID0gRFNUIE9QIElNTTsJCVwKIAkJQ09OVDsJCQlcCi0JQlBGX0FMVV8jI09QQ09ERSMjX0JQRl9LOglcCi0JCUEgPSAodTMyKSBBIE9QICh1MzIpIEs7CVwKKwlBTFVfIyNPUENPREUjI19LOgkJXAorCQlEU1QgPSAodTMyKSBEU1QgT1AgKHUzMikgSU1NOwlcCiAJCUNPTlQ7CiAKLQlBTFUoQlBGX0FERCwgICspCi0JQUxVKEJQRl9TVUIsICAtKQotCUFMVShCUEZfQU5ELCAgJikKLQlBTFUoQlBGX09SLCAgIHwpCi0JQUxVKEJQRl9MU0gsIDw8KQotCUFMVShCUEZfUlNILCA+PikKLQlBTFUoQlBGX1hPUiwgIF4pCi0JQUxVKEJQRl9NVUwsICAqKQorCUFMVShBREQsICArKQorCUFMVShTVUIsICAtKQorCUFMVShBTkQsICAmKQorCUFMVShPUiwgICB8KQorCUFMVShMU0gsIDw8KQorCUFMVShSU0gsID4+KQorCUFMVShYT1IsICBeKQorCUFMVShNVUwsICAqKQogI3VuZGVmIEFMVQotCUJQRl9BTFVfQlBGX05FR18wOgotCQlBID0gKHUzMikgLUE7CisJQUxVX05FRzoKKwkJRFNUID0gKHUzMikgLURTVDsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX05FR18wOgotCQlBID0gLUE7CisJQUxVNjRfTkVHOgorCQlEU1QgPSAtRFNUOwogCQlDT05UOwotCUJQRl9BTFVfQlBGX01PVl9CUEZfWDoKLQkJQSA9ICh1MzIpIFg7CisJQUxVX01PVl9YOgorCQlEU1QgPSAodTMyKSBTUkM7CiAJCUNPTlQ7Ci0JQlBGX0FMVV9CUEZfTU9WX0JQRl9LOgotCQlBID0gKHUzMikgSzsKKwlBTFVfTU9WX0s6CisJCURTVCA9ICh1MzIpIElNTTsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX01PVl9CUEZfWDoKLQkJQSA9IFg7CisJQUxVNjRfTU9WX1g6CisJCURTVCA9IFNSQzsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX01PVl9CUEZfSzoKLQkJQSA9IEs7CisJQUxVNjRfTU9WX0s6CisJCURTVCA9IElNTTsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX0FSU0hfQlBGX1g6Ci0JCSgqKHM2NCAqKSAmQSkgPj49IFg7CisJQUxVNjRfQVJTSF9YOgorCQkoKihzNjQgKikgJkRTVCkgPj49IFNSQzsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX0FSU0hfQlBGX0s6Ci0JCSgqKHM2NCAqKSAmQSkgPj49IEs7CisJQUxVNjRfQVJTSF9LOgorCQkoKihzNjQgKikgJkRTVCkgPj49IElNTTsKIAkJQ09OVDsKLQlCUEZfQUxVNjRfQlBGX01PRF9CUEZfWDoKLQkJaWYgKHVubGlrZWx5KFggPT0gMCkpCisJQUxVNjRfTU9EX1g6CisJCWlmICh1bmxpa2VseShTUkMgPT0gMCkpCiAJCQlyZXR1cm4gMDsKLQkJdG1wID0gQTsKLQkJQSA9IGRvX2Rpdih0bXAsIFgpOworCQl0bXAgPSBEU1Q7CisJCURTVCA9IGRvX2Rpdih0bXAsIFNSQyk7CiAJCUNPTlQ7Ci0JQlBGX0FMVV9CUEZfTU9EX0JQRl9YOgotCQlpZiAodW5saWtlbHkoWCA9PSAwKSkKKwlBTFVfTU9EX1g6CisJCWlmICh1bmxpa2VseShTUkMgPT0gMCkpCiAJCQlyZXR1cm4gMDsKLQkJdG1wID0gKHUzMikgQTsKLQkJQSA9IGRvX2Rpdih0bXAsICh1MzIpIFgpOworCQl0bXAgPSAodTMyKSBEU1Q7CisJCURTVCA9IGRvX2Rpdih0bXAsICh1MzIpIFNSQyk7CiAJCUNPTlQ7Ci0JQlBGX0FMVTY0X0JQRl9NT0RfQlBGX0s6Ci0JCXRtcCA9IEE7Ci0JCUEgPSBkb19kaXYodG1wLCBLKTsKKwlBTFU2NF9NT0RfSzoKKwkJdG1wID0gRFNUOworCQlEU1QgPSBkb19kaXYodG1wLCBJTU0pOwogCQlDT05UOwotCUJQRl9BTFVfQlBGX01PRF9CUEZfSzoKLQkJdG1wID0gKHUzMikgQTsKLQkJQSA9IGRvX2Rpdih0bXAsICh1MzIpIEspOworCUFMVV9NT0RfSzoKKwkJdG1wID0gKHUzMikgRFNUOworCQlEU1QgPSBkb19kaXYodG1wLCAodTMyKSBJTU0pOwogCQlDT05UOwotCUJQRl9BTFU2NF9CUEZfRElWX0JQRl9YOgotCQlpZiAodW5saWtlbHkoWCA9PSAwKSkKKwlBTFU2NF9ESVZfWDoKKwkJaWYgKHVubGlrZWx5KFNSQyA9PSAwKSkKIAkJCXJldHVybiAwOwotCQlkb19kaXYoQSwgWCk7CisJCWRvX2RpdihEU1QsIFNSQyk7CiAJCUNPTlQ7Ci0JQlBGX0FMVV9CUEZfRElWX0JQRl9YOgotCQlpZiAodW5saWtlbHkoWCA9PSAwKSkKKwlBTFVfRElWX1g6CisJCWlmICh1bmxpa2VseShTUkMgPT0gMCkpCiAJCQlyZXR1cm4gMDsKLQkJdG1wID0gKHUzMikgQTsKLQkJZG9fZGl2KHRtcCwgKHUzMikgWCk7Ci0JCUEgPSAodTMyKSB0bXA7CisJCXRtcCA9ICh1MzIpIERTVDsKKwkJZG9fZGl2KHRtcCwgKHUzMikgU1JDKTsKKwkJRFNUID0gKHUzMikgdG1wOwogCQlDT05UOwotCUJQRl9BTFU2NF9CUEZfRElWX0JQRl9LOgotCQlkb19kaXYoQSwgSyk7CisJQUxVNjRfRElWX0s6CisJCWRvX2RpdihEU1QsIElNTSk7CiAJCUNPTlQ7Ci0JQlBGX0FMVV9CUEZfRElWX0JQRl9LOgotCQl0bXAgPSAodTMyKSBBOwotCQlkb19kaXYodG1wLCAodTMyKSBLKTsKLQkJQSA9ICh1MzIpIHRtcDsKKwlBTFVfRElWX0s6CisJCXRtcCA9ICh1MzIpIERTVDsKKwkJZG9fZGl2KHRtcCwgKHUzMikgSU1NKTsKKwkJRFNUID0gKHUzMikgdG1wOwogCQlDT05UOwotCUJQRl9BTFVfQlBGX0VORF9CUEZfVE9fQkU6Ci0JCXN3aXRjaCAoSykgeworCUFMVV9FTkRfVE9fQkU6CisJCXN3aXRjaCAoSU1NKSB7CiAJCWNhc2UgMTY6Ci0JCQlBID0gKF9fZm9yY2UgdTE2KSBjcHVfdG9fYmUxNihBKTsKKwkJCURTVCA9IChfX2ZvcmNlIHUxNikgY3B1X3RvX2JlMTYoRFNUKTsKIAkJCWJyZWFrOwogCQljYXNlIDMyOgotCQkJQSA9IChfX2ZvcmNlIHUzMikgY3B1X3RvX2JlMzIoQSk7CisJCQlEU1QgPSAoX19mb3JjZSB1MzIpIGNwdV90b19iZTMyKERTVCk7CiAJCQlicmVhazsKIAkJY2FzZSA2NDoKLQkJCUEgPSAoX19mb3JjZSB1NjQpIGNwdV90b19iZTY0KEEpOworCQkJRFNUID0gKF9fZm9yY2UgdTY0KSBjcHVfdG9fYmU2NChEU1QpOwogCQkJYnJlYWs7CiAJCX0KIAkJQ09OVDsKLQlCUEZfQUxVX0JQRl9FTkRfQlBGX1RPX0xFOgotCQlzd2l0Y2ggKEspIHsKKwlBTFVfRU5EX1RPX0xFOgorCQlzd2l0Y2ggKElNTSkgewogCQljYXNlIDE2OgotCQkJQSA9IChfX2ZvcmNlIHUxNikgY3B1X3RvX2xlMTYoQSk7CisJCQlEU1QgPSAoX19mb3JjZSB1MTYpIGNwdV90b19sZTE2KERTVCk7CiAJCQlicmVhazsKIAkJY2FzZSAzMjoKLQkJCUEgPSAoX19mb3JjZSB1MzIpIGNwdV90b19sZTMyKEEpOworCQkJRFNUID0gKF9fZm9yY2UgdTMyKSBjcHVfdG9fbGUzMihEU1QpOwogCQkJYnJlYWs7CiAJCWNhc2UgNjQ6Ci0JCQlBID0gKF9fZm9yY2UgdTY0KSBjcHVfdG9fbGU2NChBKTsKKwkJCURTVCA9IChfX2ZvcmNlIHU2NCkgY3B1X3RvX2xlNjQoRFNUKTsKIAkJCWJyZWFrOwogCQl9CiAJCUNPTlQ7CiAKIAkvKiBDQUxMICovCi0JQlBGX0pNUF9CUEZfQ0FMTF8wOgotCQkvKiBGdW5jdGlvbiBjYWxsIHNjcmF0Y2hlcyBSMS1SNSByZWdpc3RlcnMsIHByZXNlcnZlcyBSNi1SOSwKLQkJICogYW5kIHN0b3JlcyByZXR1cm4gdmFsdWUgaW50byBSMC4KKwlKTVBfQ0FMTDoKKwkJLyogRnVuY3Rpb24gY2FsbCBzY3JhdGNoZXMgQlBGX1IxLUJQRl9SNSByZWdpc3RlcnMsCisJCSAqIHByZXNlcnZlcyBCUEZfUjYtQlBGX1I5LCBhbmQgc3RvcmVzIHJldHVybiB2YWx1ZQorCQkgKiBpbnRvIEJQRl9SMC4KIAkJICovCi0JCVIwID0gKF9fYnBmX2NhbGxfYmFzZSArIGluc24tPmltbSkocmVnc1sxXSwgcmVnc1syXSwgcmVnc1szXSwKLQkJCQkJCSAgIHJlZ3NbNF0sIHJlZ3NbNV0pOworCQlCUEZfUjAgPSAoX19icGZfY2FsbF9iYXNlICsgaW5zbi0+aW1tKShCUEZfUjEsIEJQRl9SMiwgQlBGX1IzLAorCQkJCQkJICAgICAgIEJQRl9SNCwgQlBGX1I1KTsKIAkJQ09OVDsKIAogCS8qIEpNUCAqLwotCUJQRl9KTVBfQlBGX0pBXzA6CisJSk1QX0pBOgogCQlpbnNuICs9IGluc24tPm9mZjsKIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KRVFfQlBGX1g6Ci0JCWlmIChBID09IFgpIHsKKwlKTVBfSkVRX1g6CisJCWlmIChEU1QgPT0gU1JDKSB7CiAJCQlpbnNuICs9IGluc24tPm9mZjsKIAkJCUNPTlRfSk1QOwogCQl9CiAJCUNPTlQ7Ci0JQlBGX0pNUF9CUEZfSkVRX0JQRl9LOgotCQlpZiAoQSA9PSBLKSB7CisJSk1QX0pFUV9LOgorCQlpZiAoRFNUID09IElNTSkgewogCQkJaW5zbiArPSBpbnNuLT5vZmY7CiAJCQlDT05UX0pNUDsKIAkJfQogCQlDT05UOwotCUJQRl9KTVBfQlBGX0pORV9CUEZfWDoKLQkJaWYgKEEgIT0gWCkgeworCUpNUF9KTkVfWDoKKwkJaWYgKERTVCAhPSBTUkMpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KTkVfQlBGX0s6Ci0JCWlmIChBICE9IEspIHsKKwlKTVBfSk5FX0s6CisJCWlmIChEU1QgIT0gSU1NKSB7CiAJCQlpbnNuICs9IGluc24tPm9mZjsKIAkJCUNPTlRfSk1QOwogCQl9CiAJCUNPTlQ7Ci0JQlBGX0pNUF9CUEZfSkdUX0JQRl9YOgotCQlpZiAoQSA+IFgpIHsKKwlKTVBfSkdUX1g6CisJCWlmIChEU1QgPiBTUkMpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KR1RfQlBGX0s6Ci0JCWlmIChBID4gSykgeworCUpNUF9KR1RfSzoKKwkJaWYgKERTVCA+IElNTSkgewogCQkJaW5zbiArPSBpbnNuLT5vZmY7CiAJCQlDT05UX0pNUDsKIAkJfQogCQlDT05UOwotCUJQRl9KTVBfQlBGX0pHRV9CUEZfWDoKLQkJaWYgKEEgPj0gWCkgeworCUpNUF9KR0VfWDoKKwkJaWYgKERTVCA+PSBTUkMpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KR0VfQlBGX0s6Ci0JCWlmIChBID49IEspIHsKKwlKTVBfSkdFX0s6CisJCWlmIChEU1QgPj0gSU1NKSB7CiAJCQlpbnNuICs9IGluc24tPm9mZjsKIAkJCUNPTlRfSk1QOwogCQl9CiAJCUNPTlQ7Ci0JQlBGX0pNUF9CUEZfSlNHVF9CUEZfWDoKLQkJaWYgKCgoczY0KUEpID4gKChzNjQpWCkpIHsKKwlKTVBfSlNHVF9YOgorCQlpZiAoKChzNjQpIERTVCkgPiAoKHM2NCkgU1JDKSkgewogCQkJaW5zbiArPSBpbnNuLT5vZmY7CiAJCQlDT05UX0pNUDsKIAkJfQogCQlDT05UOwotCUJQRl9KTVBfQlBGX0pTR1RfQlBGX0s6Ci0JCWlmICgoKHM2NClBKSA+ICgoczY0KUspKSB7CisJSk1QX0pTR1RfSzoKKwkJaWYgKCgoczY0KSBEU1QpID4gKChzNjQpIElNTSkpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KU0dFX0JQRl9YOgotCQlpZiAoKChzNjQpQSkgPj0gKChzNjQpWCkpIHsKKwlKTVBfSlNHRV9YOgorCQlpZiAoKChzNjQpIERTVCkgPj0gKChzNjQpIFNSQykpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KU0dFX0JQRl9LOgotCQlpZiAoKChzNjQpQSkgPj0gKChzNjQpSykpIHsKKwlKTVBfSlNHRV9LOgorCQlpZiAoKChzNjQpIERTVCkgPj0gKChzNjQpIElNTSkpIHsKIAkJCWluc24gKz0gaW5zbi0+b2ZmOwogCQkJQ09OVF9KTVA7CiAJCX0KIAkJQ09OVDsKLQlCUEZfSk1QX0JQRl9KU0VUX0JQRl9YOgotCQlpZiAoQSAmIFgpIHsKKwlKTVBfSlNFVF9YOgorCQlpZiAoRFNUICYgU1JDKSB7CiAJCQlpbnNuICs9IGluc24tPm9mZjsKIAkJCUNPTlRfSk1QOwogCQl9CiAJCUNPTlQ7Ci0JQlBGX0pNUF9CUEZfSlNFVF9CUEZfSzoKLQkJaWYgKEEgJiBLKSB7CisJSk1QX0pTRVRfSzoKKwkJaWYgKERTVCAmIElNTSkgewogCQkJaW5zbiArPSBpbnNuLT5vZmY7CiAJCQlDT05UX0pNUDsKIAkJfQogCQlDT05UOwotCUJQRl9KTVBfQlBGX0VYSVRfMDoKLQkJcmV0dXJuIFIwOworCUpNUF9FWElUOgorCQlyZXR1cm4gQlBGX1IwOwogCiAJLyogU1RYIGFuZCBTVCBhbmQgTERYKi8KLSNkZWZpbmUgTERTVChTSVpFT1AsIFNJWkUpCQkJCQlcCi0JQlBGX1NUWF9CUEZfTUVNXyMjU0laRU9QOgkJCQlcCi0JCSooU0laRSAqKSh1bnNpZ25lZCBsb25nKSAoQSArIGluc24tPm9mZikgPSBYOwlcCi0JCUNPTlQ7CQkJCQkJXAotCUJQRl9TVF9CUEZfTUVNXyMjU0laRU9QOgkJCQlcCi0JCSooU0laRSAqKSh1bnNpZ25lZCBsb25nKSAoQSArIGluc24tPm9mZikgPSBLOwlcCi0JCUNPTlQ7CQkJCQkJXAotCUJQRl9MRFhfQlBGX01FTV8jI1NJWkVPUDoJCQkJXAotCQlBID0gKihTSVpFICopKHVuc2lnbmVkIGxvbmcpIChYICsgaW5zbi0+b2ZmKTsJXAorI2RlZmluZSBMRFNUKFNJWkVPUCwgU0laRSkJCQkJCQlcCisJU1RYX01FTV8jI1NJWkVPUDoJCQkJCQlcCisJCSooU0laRSAqKSh1bnNpZ25lZCBsb25nKSAoRFNUICsgaW5zbi0+b2ZmKSA9IFNSQzsJXAorCQlDT05UOwkJCQkJCQlcCisJU1RfTUVNXyMjU0laRU9QOgkJCQkJCVwKKwkJKihTSVpFICopKHVuc2lnbmVkIGxvbmcpIChEU1QgKyBpbnNuLT5vZmYpID0gSU1NOwlcCisJCUNPTlQ7CQkJCQkJCVwKKwlMRFhfTUVNXyMjU0laRU9QOgkJCQkJCVwKKwkJRFNUID0gKihTSVpFICopKHVuc2lnbmVkIGxvbmcpIChTUkMgKyBpbnNuLT5vZmYpOwlcCiAJCUNPTlQ7CiAKLQlMRFNUKEJQRl9CLCAgIHU4KQotCUxEU1QoQlBGX0gsICB1MTYpCi0JTERTVChCUEZfVywgIHUzMikKLQlMRFNUKEJQRl9EVywgdTY0KQorCUxEU1QoQiwgICB1OCkKKwlMRFNUKEgsICB1MTYpCisJTERTVChXLCAgdTMyKQorCUxEU1QoRFcsIHU2NCkKICN1bmRlZiBMRFNUCi0JQlBGX1NUWF9CUEZfWEFERF9CUEZfVzogLyogbG9jayB4YWRkICoodTMyICopKEEgKyBpbnNuLT5vZmYpICs9IFggKi8KLQkJYXRvbWljX2FkZCgodTMyKSBYLCAoYXRvbWljX3QgKikodW5zaWduZWQgbG9uZykKLQkJCSAgIChBICsgaW5zbi0+b2ZmKSk7CisJU1RYX1hBRERfVzogLyogbG9jayB4YWRkICoodTMyICopKGRzdF9yZWcgKyBvZmYxNikgKz0gc3JjX3JlZyAqLworCQlhdG9taWNfYWRkKCh1MzIpIFNSQywgKGF0b21pY190ICopKHVuc2lnbmVkIGxvbmcpCisJCQkgICAoRFNUICsgaW5zbi0+b2ZmKSk7CiAJCUNPTlQ7Ci0JQlBGX1NUWF9CUEZfWEFERF9CUEZfRFc6IC8qIGxvY2sgeGFkZCAqKHU2NCAqKShBICsgaW5zbi0+b2ZmKSArPSBYICovCi0JCWF0b21pYzY0X2FkZCgodTY0KSBYLCAoYXRvbWljNjRfdCAqKSh1bnNpZ25lZCBsb25nKQotCQkJICAgICAoQSArIGluc24tPm9mZikpOworCVNUWF9YQUREX0RXOiAvKiBsb2NrIHhhZGQgKih1NjQgKikoZHN0X3JlZyArIG9mZjE2KSArPSBzcmNfcmVnICovCisJCWF0b21pYzY0X2FkZCgodTY0KSBTUkMsIChhdG9taWM2NF90ICopKHVuc2lnbmVkIGxvbmcpCisJCQkgICAgIChEU1QgKyBpbnNuLT5vZmYpKTsKIAkJQ09OVDsKLQlCUEZfTERfQlBGX0FCU19CUEZfVzogLyogUjAgPSBudG9obCgqKHUzMiAqKSAoc2tiLT5kYXRhICsgSykpICovCi0JCW9mZiA9IEs7CisJTERfQUJTX1c6IC8qIEJQRl9SMCA9IG50b2hsKCoodTMyICopIChza2ItPmRhdGEgKyBpbW0zMikpICovCisJCW9mZiA9IElNTTsKIGxvYWRfd29yZDoKLQkJLyogQlBGX0xEICsgQlBEX0FCUyBhbmQgQlBGX0xEICsgQlBGX0lORCBpbnNucyBhcmUgb25seQotCQkgKiBhcHBlYXJpbmcgaW4gdGhlIHByb2dyYW1zIHdoZXJlIGN0eCA9PSBza2IuIEFsbCBwcm9ncmFtcwotCQkgKiBrZWVwICdjdHgnIGluIHJlZ3NbQ1RYX1JFR10gPT0gUjYsIHNrX2NvbnZlcnRfZmlsdGVyKCkKLQkJICogc2F2ZXMgaXQgaW4gUjYsIGludGVybmFsIEJQRiB2ZXJpZmllciB3aWxsIGNoZWNrIHRoYXQKLQkJICogUjYgPT0gY3R4LgorCQkvKiBCUEZfTEQgKyBCUERfQUJTIGFuZCBCUEZfTEQgKyBCUEZfSU5EIGluc25zIGFyZQorCQkgKiBvbmx5IGFwcGVhcmluZyBpbiB0aGUgcHJvZ3JhbXMgd2hlcmUgY3R4ID09CisJCSAqIHNrYi4gQWxsIHByb2dyYW1zIGtlZXAgJ2N0eCcgaW4gcmVnc1tCUEZfUkVHX0NUWF0KKwkJICogPT0gQlBGX1I2LCBza19jb252ZXJ0X2ZpbHRlcigpIHNhdmVzIGl0IGluIEJQRl9SNiwKKwkJICogaW50ZXJuYWwgQlBGIHZlcmlmaWVyIHdpbGwgY2hlY2sgdGhhdCBCUEZfUjYgPT0KKwkJICogY3R4LgogCQkgKgotCQkgKiBCUEZfQUJTIGFuZCBCUEZfSU5EIGFyZSB3cmFwcGVycyBvZiBmdW5jdGlvbiBjYWxscywgc28KLQkJICogdGhleSBzY3JhdGNoIFIxLVI1IHJlZ2lzdGVycywgcHJlc2VydmUgUjYtUjksIGFuZCBzdG9yZQotCQkgKiByZXR1cm4gdmFsdWUgaW50byBSMC4KKwkJICogQlBGX0FCUyBhbmQgQlBGX0lORCBhcmUgd3JhcHBlcnMgb2YgZnVuY3Rpb24gY2FsbHMsCisJCSAqIHNvIHRoZXkgc2NyYXRjaCBCUEZfUjEtQlBGX1I1IHJlZ2lzdGVycywgcHJlc2VydmUKKwkJICogQlBGX1I2LUJQRl9SOSwgYW5kIHN0b3JlIHJldHVybiB2YWx1ZSBpbnRvIEJQRl9SMC4KIAkJICoKIAkJICogSW1wbGljaXQgaW5wdXQ6Ci0JCSAqICAgY3R4CisJCSAqICAgY3R4ID09IHNrYiA9PSBCUEZfUjYgPT0gQ1RYCiAJCSAqCiAJCSAqIEV4cGxpY2l0IGlucHV0OgotCQkgKiAgIFggPT0gYW55IHJlZ2lzdGVyCi0JCSAqICAgSyA9PSAzMi1iaXQgaW1tZWRpYXRlCisJCSAqICAgU1JDID09IGFueSByZWdpc3RlcgorCQkgKiAgIElNTSA9PSAzMi1iaXQgaW1tZWRpYXRlCiAJCSAqCiAJCSAqIE91dHB1dDoKLQkJICogICBSMCAtIDgvMTYvMzItYml0IHNrYiBkYXRhIGNvbnZlcnRlZCB0byBjcHUgZW5kaWFubmVzcworCQkgKiAgIEJQRl9SMCAtIDgvMTYvMzItYml0IHNrYiBkYXRhIGNvbnZlcnRlZCB0byBjcHUgZW5kaWFubmVzcwogCQkgKi8KLQkJcHRyID0gbG9hZF9wb2ludGVyKChzdHJ1Y3Qgc2tfYnVmZiAqKSBjdHgsIG9mZiwgNCwgJnRtcCk7CisKKwkJcHRyID0gbG9hZF9wb2ludGVyKChzdHJ1Y3Qgc2tfYnVmZiAqKSAodW5zaWduZWQgbG9uZykgQ1RYLCBvZmYsIDQsICZ0bXApOwogCQlpZiAobGlrZWx5KHB0ciAhPSBOVUxMKSkgewotCQkJUjAgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTsKKwkJCUJQRl9SMCA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpOwogCQkJQ09OVDsKIAkJfQorCiAJCXJldHVybiAwOwotCUJQRl9MRF9CUEZfQUJTX0JQRl9IOiAvKiBSMCA9IG50b2hzKCoodTE2ICopIChza2ItPmRhdGEgKyBLKSkgKi8KLQkJb2ZmID0gSzsKKwlMRF9BQlNfSDogLyogQlBGX1IwID0gbnRvaHMoKih1MTYgKikgKHNrYi0+ZGF0YSArIGltbTMyKSkgKi8KKwkJb2ZmID0gSU1NOwogbG9hZF9oYWxmOgotCQlwdHIgPSBsb2FkX3BvaW50ZXIoKHN0cnVjdCBza19idWZmICopIGN0eCwgb2ZmLCAyLCAmdG1wKTsKKwkJcHRyID0gbG9hZF9wb2ludGVyKChzdHJ1Y3Qgc2tfYnVmZiAqKSAodW5zaWduZWQgbG9uZykgQ1RYLCBvZmYsIDIsICZ0bXApOwogCQlpZiAobGlrZWx5KHB0ciAhPSBOVUxMKSkgewotCQkJUjAgPSBnZXRfdW5hbGlnbmVkX2JlMTYocHRyKTsKKwkJCUJQRl9SMCA9IGdldF91bmFsaWduZWRfYmUxNihwdHIpOwogCQkJQ09OVDsKIAkJfQorCiAJCXJldHVybiAwOwotCUJQRl9MRF9CUEZfQUJTX0JQRl9COiAvKiBSMCA9ICoodTggKikgKGN0eCArIEspICovCi0JCW9mZiA9IEs7CisJTERfQUJTX0I6IC8qIEJQRl9SMCA9ICoodTggKikgKHNrYi0+ZGF0YSArIGltbTMyKSAqLworCQlvZmYgPSBJTU07CiBsb2FkX2J5dGU6Ci0JCXB0ciA9IGxvYWRfcG9pbnRlcigoc3RydWN0IHNrX2J1ZmYgKikgY3R4LCBvZmYsIDEsICZ0bXApOworCQlwdHIgPSBsb2FkX3BvaW50ZXIoKHN0cnVjdCBza19idWZmICopICh1bnNpZ25lZCBsb25nKSBDVFgsIG9mZiwgMSwgJnRtcCk7CiAJCWlmIChsaWtlbHkocHRyICE9IE5VTEwpKSB7Ci0JCQlSMCA9ICoodTggKilwdHI7CisJCQlCUEZfUjAgPSAqKHU4ICopcHRyOwogCQkJQ09OVDsKIAkJfQorCiAJCXJldHVybiAwOwotCUJQRl9MRF9CUEZfSU5EX0JQRl9XOiAvKiBSMCA9IG50b2hsKCoodTMyICopIChza2ItPmRhdGEgKyBYICsgSykpICovCi0JCW9mZiA9IEsgKyBYOworCUxEX0lORF9XOiAvKiBCUEZfUjAgPSBudG9obCgqKHUzMiAqKSAoc2tiLT5kYXRhICsgc3JjX3JlZyArIGltbTMyKSkgKi8KKwkJb2ZmID0gSU1NICsgU1JDOwogCQlnb3RvIGxvYWRfd29yZDsKLQlCUEZfTERfQlBGX0lORF9CUEZfSDogLyogUjAgPSBudG9ocygqKHUxNiAqKSAoc2tiLT5kYXRhICsgWCArIEspKSAqLwotCQlvZmYgPSBLICsgWDsKKwlMRF9JTkRfSDogLyogQlBGX1IwID0gbnRvaHMoKih1MTYgKikgKHNrYi0+ZGF0YSArIHNyY19yZWcgKyBpbW0zMikpICovCisJCW9mZiA9IElNTSArIFNSQzsKIAkJZ290byBsb2FkX2hhbGY7Ci0JQlBGX0xEX0JQRl9JTkRfQlBGX0I6IC8qIFIwID0gKih1OCAqKSAoc2tiLT5kYXRhICsgWCArIEspICovCi0JCW9mZiA9IEsgKyBYOworCUxEX0lORF9COiAvKiBCUEZfUjAgPSAqKHU4ICopIChza2ItPmRhdGEgKyBzcmNfcmVnICsgaW1tMzIpICovCisJCW9mZiA9IElNTSArIFNSQzsKIAkJZ290byBsb2FkX2J5dGU7CiAKIAlkZWZhdWx0X2xhYmVsOgogCQkvKiBJZiB3ZSBldmVyIHJlYWNoIHRoaXMsIHdlIGhhdmUgYSBidWcgc29tZXdoZXJlLiAqLwogCQlXQVJOX1JBVEVMSU1JVCgxLCAidW5rbm93biBvcGNvZGUgJTAyeFxuIiwgaW5zbi0+Y29kZSk7CiAJCXJldHVybiAwOwotI3VuZGVmIENPTlRfSk1QCi0jdW5kZWYgQ09OVAotCi0jdW5kZWYgUjAKLSN1bmRlZiBYCi0jdW5kZWYgQQotI3VuZGVmIEsKIH0KIAotdTMyIHNrX3J1bl9maWx0ZXJfaW50X3NlY2NvbXAoY29uc3Qgc3RydWN0IHNlY2NvbXBfZGF0YSAqY3R4LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHNvY2tfZmlsdGVyX2ludCAqaW5zbmkpCi0gICAgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgiX19za19ydW5fZmlsdGVyIikpKTsKLQotdTMyIHNrX3J1bl9maWx0ZXJfaW50X3NrYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqY3R4LAotCQkJICBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXJfaW50ICppbnNuaSkKLSAgICBfX2F0dHJpYnV0ZV9fICgoYWxpYXMgKCJfX3NrX3J1bl9maWx0ZXIiKSkpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2tfcnVuX2ZpbHRlcl9pbnRfc2tiKTsKLQogLyogSGVscGVyIHRvIGZpbmQgdGhlIG9mZnNldCBvZiBwa3RfdHlwZSBpbiBza19idWZmIHN0cnVjdHVyZS4gV2Ugd2FudAogICogdG8gbWFrZSBzdXJlIGl0cyBzdGlsbCBhIDNiaXQgZmllbGQgc3RhcnRpbmcgYXQgYSBieXRlIGJvdW5kYXJ5OwogICogdGFrZW4gZnJvbSBhcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMuCiAgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgUEtUX1RZUEVfTUFYCSg3IDw8IDUpCisjZWxzZQogI2RlZmluZSBQS1RfVFlQRV9NQVgJNworI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgaW50IHBrdF90eXBlX29mZnNldCh2b2lkKQogewogCXN0cnVjdCBza19idWZmIHNrYl9wcm9iZSA9IHsgLnBrdF90eXBlID0gfjAsIH07CkBAIC01OTQsMTYgKzYwNCwxNCBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHU2NCBfX3NrYl9nZXRfcGF5X29mZnNldCh1NjQgY3R4LCB1NjQgQSwgdTY0IFgsIHU2NCByNCwgdTY0IHI1KQorc3RhdGljIHU2NCBfX3NrYl9nZXRfcGF5X29mZnNldCh1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikobG9uZykgY3R4OwotCi0JcmV0dXJuIF9fc2tiX2dldF9wb2ZmKHNrYik7CisJcmV0dXJuIF9fc2tiX2dldF9wb2ZmKChzdHJ1Y3Qgc2tfYnVmZiAqKSh1bnNpZ25lZCBsb25nKSBjdHgpOwogfQogCi1zdGF0aWMgdTY0IF9fc2tiX2dldF9ubGF0dHIodTY0IGN0eCwgdTY0IEEsIHU2NCBYLCB1NjQgcjQsIHU2NCByNSkKK3N0YXRpYyB1NjQgX19za2JfZ2V0X25sYXR0cih1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikobG9uZykgY3R4OworCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4OwogCXN0cnVjdCBubGF0dHIgKm5sYTsKIAogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC02MTIsMTkgKzYyMCwxOSBAQAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgbmxhdHRyKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoQSA+IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBubGF0dHIpKQorCWlmIChhID4gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IG5sYXR0cikpCiAJCXJldHVybiAwOwogCi0JbmxhID0gbmxhX2ZpbmQoKHN0cnVjdCBubGF0dHIgKikgJnNrYi0+ZGF0YVtBXSwgc2tiLT5sZW4gLSBBLCBYKTsKKwlubGEgPSBubGFfZmluZCgoc3RydWN0IG5sYXR0ciAqKSAmc2tiLT5kYXRhW2FdLCBza2ItPmxlbiAtIGEsIHgpOwogCWlmIChubGEpCiAJCXJldHVybiAodm9pZCAqKSBubGEgLSAodm9pZCAqKSBza2ItPmRhdGE7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX3NrYl9nZXRfbmxhdHRyX25lc3QodTY0IGN0eCwgdTY0IEEsIHU2NCBYLCB1NjQgcjQsIHU2NCByNSkKK3N0YXRpYyB1NjQgX19za2JfZ2V0X25sYXR0cl9uZXN0KHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShsb25nKSBjdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSh1bnNpZ25lZCBsb25nKSBjdHg7CiAJc3RydWN0IG5sYXR0ciAqbmxhOwogCiAJaWYgKHNrYl9pc19ub25saW5lYXIoc2tiKSkKQEAgLTYzMywyNSArNjQxLDMxIEBACiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBubGF0dHIpKQogCQlyZXR1cm4gMDsKIAotCWlmIChBID4gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IG5sYXR0cikpCisJaWYgKGEgPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgbmxhdHRyKSkKIAkJcmV0dXJuIDA7CiAKLQlubGEgPSAoc3RydWN0IG5sYXR0ciAqKSAmc2tiLT5kYXRhW0FdOwotCWlmIChubGEtPm5sYV9sZW4gPiBza2ItPmxlbiAtIEEpCisJbmxhID0gKHN0cnVjdCBubGF0dHIgKikgJnNrYi0+ZGF0YVthXTsKKwlpZiAobmxhLT5ubGFfbGVuID4gc2tiLT5sZW4gLSBhKQogCQlyZXR1cm4gMDsKIAotCW5sYSA9IG5sYV9maW5kX25lc3RlZChubGEsIFgpOworCW5sYSA9IG5sYV9maW5kX25lc3RlZChubGEsIHgpOwogCWlmIChubGEpCiAJCXJldHVybiAodm9pZCAqKSBubGEgLSAodm9pZCAqKSBza2ItPmRhdGE7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX2dldF9yYXdfY3B1X2lkKHU2NCBjdHgsIHU2NCBBLCB1NjQgWCwgdTY0IHI0LCB1NjQgcjUpCitzdGF0aWMgdTY0IF9fZ2V0X3Jhd19jcHVfaWQodTY0IGN0eCwgdTY0IGEsIHU2NCB4LCB1NjQgcjQsIHU2NCByNSkKIHsKIAlyZXR1cm4gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIH0KIAorLyogbm90ZSB0aGF0IHRoaXMgb25seSBnZW5lcmF0ZXMgMzItYml0IHJhbmRvbSBudW1iZXJzICovCitzdGF0aWMgdTY0IF9fZ2V0X3JhbmRvbV91MzIodTY0IGN0eCwgdTY0IGEsIHU2NCB4LCB1NjQgcjQsIHU2NCByNSkKK3sKKwlyZXR1cm4gcHJhbmRvbV91MzIoKTsKK30KKwogc3RhdGljIGJvb2wgY29udmVydF9icGZfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc29ja19maWx0ZXIgKmZwLAogCQkJCSAgIHN0cnVjdCBzb2NrX2ZpbHRlcl9pbnQgKippbnNucCkKIHsKQEAgLTY2MSwxMTkgKzY3NSw4MyBAQAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9QUk9UT0NPTDoKIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpICE9IDIpOwogCi0JCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9IOwotCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQlpbnNuLT54X3JlZyA9IENUWF9SRUc7Ci0JCWluc24tPm9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBwcm90b2NvbCk7Ci0JCWluc24rKzsKLQorCQkvKiBBID0gKih1MTYgKikgKENUWCArIG9mZnNldG9mKHByb3RvY29sKSkgKi8KKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9ILCBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBwcm90b2NvbCkpOwogCQkvKiBBID0gbnRvaHMoQSkgW2VtaXR0aW5nIGEgbm9wIG9yIHN3YXAxNl0gKi8KLQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfRU5EIHwgQlBGX0ZST01fQkU7Ci0JCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCWluc24tPmltbSA9IDE2OworCQkqaW5zbiA9IEJQRl9FTkRJQU4oQlBGX0ZST01fQkUsIEJQRl9SRUdfQSwgMTYpOwogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9QS1RUWVBFOgotCQlpbnNuLT5jb2RlID0gQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfQjsKLQkJaW5zbi0+YV9yZWcgPSBBX1JFRzsKLQkJaW5zbi0+eF9yZWcgPSBDVFhfUkVHOwotCQlpbnNuLT5vZmYgPSBwa3RfdHlwZV9vZmZzZXQoKTsKKwkJKmluc24gPSBCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKKwkJCQkgICAgcGt0X3R5cGVfb2Zmc2V0KCkpOwogCQlpZiAoaW5zbi0+b2ZmIDwgMCkKIAkJCXJldHVybiBmYWxzZTsKIAkJaW5zbisrOwotCi0JCWluc24tPmNvZGUgPSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9LOwotCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQlpbnNuLT5pbW0gPSBQS1RfVFlQRV9NQVg7CisJCSppbnNuID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBCUEZfUkVHX0EsIFBLVF9UWVBFX01BWCk7CisjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisJCWluc24rKzsKKyAgICAgICAgICAgICAgICAqaW5zbiA9IEJQRl9BTFUzMl9JTU0oQlBGX1JTSCwgQlBGX1JFR19BLCA1KTsKKyNlbmRpZgogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9JRklOREVYOgogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9IQVRZUEU6Ci0JCWlmIChGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikgPT0gOCkKLQkJCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVzsKLQkJZWxzZQotCQkJaW5zbi0+Y29kZSA9IEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1c7Ci0JCWluc24tPmFfcmVnID0gVE1QX1JFRzsKLQkJaW5zbi0+eF9yZWcgPSBDVFhfUkVHOwotCQlpbnNuLT5vZmYgPSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KTsKLQkJaW5zbisrOwotCi0JCWluc24tPmNvZGUgPSBCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LOwotCQlpbnNuLT5hX3JlZyA9IFRNUF9SRUc7Ci0JCWluc24tPmltbSA9IDA7Ci0JCWluc24tPm9mZiA9IDE7Ci0JCWluc24rKzsKLQotCQlpbnNuLT5jb2RlID0gQlBGX0pNUCB8IEJQRl9FWElUOwotCQlpbnNuKys7Ci0KIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsIHR5cGUpICE9IDIpOworCQlCVUlMRF9CVUdfT04oYnl0ZXNfdG9fYnBmX3NpemUoRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpKSA8IDApOwogCi0JCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCWluc24tPnhfcmVnID0gVE1QX1JFRzsKLQotCQlpZiAoZnAtPmsgPT0gU0tGX0FEX09GRiArIFNLRl9BRF9JRklOREVYKSB7Ci0JCQlpbnNuLT5jb2RlID0gQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVzsKLQkJCWluc24tPm9mZiA9IG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9IOwotCQkJaW5zbi0+b2ZmID0gb2Zmc2V0b2Yoc3RydWN0IG5ldF9kZXZpY2UsIHR5cGUpOwotCQl9CisJCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpLAorCQkJCSAgICAgIEJQRl9SRUdfVE1QLCBCUEZfUkVHX0NUWCwKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CisJCS8qIGlmICh0bXAgIT0gMCkgZ290byBwYyArIDEgKi8KKwkJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KTkUsIEJQRl9SRUdfVE1QLCAwLCAxKTsKKwkJKmluc24rKyA9IEJQRl9FWElUX0lOU04oKTsKKwkJaWYgKGZwLT5rID09IFNLRl9BRF9PRkYgKyBTS0ZfQURfSUZJTkRFWCkKKwkJCSppbnNuID0gQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfQSwgQlBGX1JFR19UTVAsCisJCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkpOworCQllbHNlCisJCQkqaW5zbiA9IEJQRl9MRFhfTUVNKEJQRl9ILCBCUEZfUkVHX0EsIEJQRl9SRUdfVE1QLAorCQkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IG5ldF9kZXZpY2UsIHR5cGUpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfTUFSSzoKIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykgIT0gNCk7CiAKLQkJaW5zbi0+Y29kZSA9IEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1c7Ci0JCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCWluc24tPnhfcmVnID0gQ1RYX1JFRzsKLQkJaW5zbi0+b2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspOworCQkqaW5zbiA9IEJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykpOwogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9SWEhBU0g6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpICE9IDQpOwogCi0JCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XOwotCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQlpbnNuLT54X3JlZyA9IENUWF9SRUc7Ci0JCWluc24tPm9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBoYXNoKTsKKwkJKmluc24gPSBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGhhc2gpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfUVVFVUU6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHF1ZXVlX21hcHBpbmcpICE9IDIpOwogCi0JCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9IOwotCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQlpbnNuLT54X3JlZyA9IENUWF9SRUc7Ci0JCWluc24tPm9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5nKTsKKwkJKmluc24gPSBCUEZfTERYX01FTShCUEZfSCwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHF1ZXVlX21hcHBpbmcpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUc6CiAJY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQ6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSAhPSAyKTsKLQotCQlpbnNuLT5jb2RlID0gQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfSDsKLQkJaW5zbi0+YV9yZWcgPSBBX1JFRzsKLQkJaW5zbi0+eF9yZWcgPSBDVFhfUkVHOwotCQlpbnNuLT5vZmYgPSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdmxhbl90Y2kpOwotCQlpbnNuKys7Ci0KIAkJQlVJTERfQlVHX09OKFZMQU5fVEFHX1BSRVNFTlQgIT0gMHgxMDAwKTsKIAorCQkvKiBBID0gKih1MTYgKikgKENUWCArIG9mZnNldG9mKHZsYW5fdGNpKSkgKi8KKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9ILCBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkpOwogCQlpZiAoZnAtPmsgPT0gU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RBRykgewotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0s7Ci0JCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJaW5zbi0+aW1tID0gflZMQU5fVEFHX1BSRVNFTlQ7CisJCQkqaW5zbiA9IEJQRl9BTFUzMl9JTU0oQlBGX0FORCwgQlBGX1JFR19BLAorCQkJCQkgICAgICB+VkxBTl9UQUdfUFJFU0VOVCk7CiAJCX0gZWxzZSB7Ci0JCQlpbnNuLT5jb2RlID0gQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfSzsKLQkJCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCQlpbnNuLT5pbW0gPSAxMjsKLQkJCWluc24rKzsKLQotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0s7Ci0JCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJaW5zbi0+aW1tID0gMTsKKwkJCS8qIEEgPj49IDEyICovCisJCQkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfUlNILCBCUEZfUkVHX0EsIDEyKTsKKwkJCS8qIEEgJj0gMSAqLworCQkJKmluc24gPSBCUEZfQUxVMzJfSU1NKEJQRl9BTkQsIEJQRl9SRUdfQSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc4MSw0NiArNzU5LDM2IEBACiAJY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUjoKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1Q6CiAJY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEX0NQVToKLQkJLyogYXJnMSA9IGN0eCAqLwotCQlpbnNuLT5jb2RlID0gQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YOwotCQlpbnNuLT5hX3JlZyA9IEFSRzFfUkVHOwotCQlpbnNuLT54X3JlZyA9IENUWF9SRUc7Ci0JCWluc24rKzsKLQorCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET006CisJCS8qIGFyZzEgPSBDVFggKi8KKwkJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR19BUkcxLCBCUEZfUkVHX0NUWCk7CiAJCS8qIGFyZzIgPSBBICovCi0JCWluc24tPmNvZGUgPSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1g7Ci0JCWluc24tPmFfcmVnID0gQVJHMl9SRUc7Ci0JCWluc24tPnhfcmVnID0gQV9SRUc7Ci0JCWluc24rKzsKLQorCQkqaW5zbisrID0gQlBGX01PVjY0X1JFRyhCUEZfUkVHX0FSRzIsIEJQRl9SRUdfQSk7CiAJCS8qIGFyZzMgPSBYICovCi0JCWluc24tPmNvZGUgPSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1g7Ci0JCWluc24tPmFfcmVnID0gQVJHM19SRUc7Ci0JCWluc24tPnhfcmVnID0gWF9SRUc7Ci0JCWluc24rKzsKLQotCQkvKiBFbWl0IGNhbGwoY3R4LCBhcmcyPUEsIGFyZzM9WCkgKi8KLQkJaW5zbi0+Y29kZSA9IEJQRl9KTVAgfCBCUEZfQ0FMTDsKKwkJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR19BUkczLCBCUEZfUkVHX1gpOworCQkvKiBFbWl0IGNhbGwoYXJnMT1DVFgsIGFyZzI9QSwgYXJnMz1YKSAqLwogCQlzd2l0Y2ggKGZwLT5rKSB7CiAJCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUOgotCQkJaW5zbi0+aW1tID0gX19za2JfZ2V0X3BheV9vZmZzZXQgLSBfX2JwZl9jYWxsX2Jhc2U7CisJCQkqaW5zbiA9IEJQRl9FTUlUX0NBTEwoX19za2JfZ2V0X3BheV9vZmZzZXQpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9OTEFUVFI6Ci0JCQlpbnNuLT5pbW0gPSBfX3NrYl9nZXRfbmxhdHRyIC0gX19icGZfY2FsbF9iYXNlOworCQkJKmluc24gPSBCUEZfRU1JVF9DQUxMKF9fc2tiX2dldF9ubGF0dHIpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9OTEFUVFJfTkVTVDoKLQkJCWluc24tPmltbSA9IF9fc2tiX2dldF9ubGF0dHJfbmVzdCAtIF9fYnBmX2NhbGxfYmFzZTsKKwkJCSppbnNuID0gQlBGX0VNSVRfQ0FMTChfX3NrYl9nZXRfbmxhdHRyX25lc3QpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9DUFU6Ci0JCQlpbnNuLT5pbW0gPSBfX2dldF9yYXdfY3B1X2lkIC0gX19icGZfY2FsbF9iYXNlOworCQkJKmluc24gPSBCUEZfRU1JVF9DQUxMKF9fZ2V0X3Jhd19jcHVfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET006CisJCQkqaW5zbiA9IEJQRl9FTUlUX0NBTEwoX19nZXRfcmFuZG9tX3UzMik7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9BTFVfWE9SX1g6Ci0JCWluc24tPmNvZGUgPSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YOwotCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQlpbnNuLT54X3JlZyA9IFhfUkVHOworCQkvKiBBIF49IFggKi8KKwkJKmluc24gPSBCUEZfQUxVMzJfUkVHKEJQRl9YT1IsIEJQRl9SRUdfQSwgQlBGX1JFR19YKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODcwLDcgKzgzOCw3IEBACiAJdTggYnBmX3NyYzsKIAogCUJVSUxEX0JVR19PTihCUEZfTUVNV09SRFMgKiBzaXplb2YodTMyKSA+IE1BWF9CUEZfU1RBQ0spOwotCUJVSUxEX0JVR19PTihGUF9SRUcgKyAxICE9IE1BWF9CUEZfUkVHKTsKKwlCVUlMRF9CVUdfT04oQlBGX1JFR19GUCArIDEgIT0gTUFYX0JQRl9SRUcpOwogCiAJaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSBCUEZfTUFYSU5TTlMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODg1LDExICs4NTMsOCBAQAogCW5ld19pbnNuID0gbmV3X3Byb2c7CiAJZnAgPSBwcm9nOwogCi0JaWYgKG5ld19pbnNuKSB7Ci0JCW5ld19pbnNuLT5jb2RlID0gQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YOwotCQluZXdfaW5zbi0+YV9yZWcgPSBDVFhfUkVHOwotCQluZXdfaW5zbi0+eF9yZWcgPSBBUkcxX1JFRzsKLQl9CisJaWYgKG5ld19pbnNuKQorCQkqbmV3X2luc24gPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfQ1RYLCBCUEZfUkVHX0FSRzEpOwogCW5ld19pbnNuKys7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBmcCsrLCBpKyspIHsKQEAgLTkzNywxNyArOTAyLDE2IEBACiAJCQkgICAgY29udmVydF9icGZfZXh0ZW5zaW9ucyhmcCwgJmluc24pKQogCQkJCWJyZWFrOwogCi0JCQlpbnNuLT5jb2RlID0gZnAtPmNvZGU7Ci0JCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJaW5zbi0+eF9yZWcgPSBYX1JFRzsKLQkJCWluc24tPmltbSA9IGZwLT5rOworCQkJKmluc24gPSBCUEZfUkFXX0lOU04oZnAtPmNvZGUsIEJQRl9SRUdfQSwgQlBGX1JFR19YLCAwLCBmcC0+ayk7CiAJCQlicmVhazsKIAotCQkvKiBKdW1wIG9wY29kZXMgbWFwIGFzLWlzLCBidXQgb2Zmc2V0cyBuZWVkIGFkanVzdG1lbnQuICovCi0JCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKLQkJCXRhcmdldCA9IGkgKyBmcC0+ayArIDE7Ci0JCQlpbnNuLT5jb2RlID0gZnAtPmNvZGU7Ci0jZGVmaW5lIEVNSVRfSk1QCQkJCQkJCVwKKwkJLyogSnVtcCB0cmFuc2Zvcm1hdGlvbiBjYW5ub3QgdXNlIEJQRiBibG9jayBtYWNyb3MKKwkJICogZXZlcnl3aGVyZSBhcyBvZmZzZXQgY2FsY3VsYXRpb24gYW5kIHRhcmdldCB1cGRhdGVzCisJCSAqIHJlcXVpcmUgYSBiaXQgbW9yZSB3b3JrIHRoYW4gdGhlIHJlc3QsIGkuZS4ganVtcAorCQkgKiBvcGNvZGVzIG1hcCBhcy1pcywgYnV0IG9mZnNldHMgbmVlZCBhZGp1c3RtZW50LgorCQkgKi8KKworI2RlZmluZSBCUEZfRU1JVF9KTVAJCQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKHRhcmdldCA+PSBsZW4gfHwgdGFyZ2V0IDwgMCkJCQlcCiAJCQlnb3RvIGVycjsJCQkJCVwKQEAgLTk1Niw3ICs5MjAsMTAgQEAKIAkJaW5zbi0+b2ZmIC09IGluc24gLSB0bXBfaW5zbnM7CQkJCVwKIAl9IHdoaWxlICgwKQogCi0JCQlFTUlUX0pNUDsKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pBOgorCQkJdGFyZ2V0ID0gaSArIGZwLT5rICsgMTsKKwkJCWluc24tPmNvZGUgPSBmcC0+Y29kZTsKKwkJCUJQRl9FTUlUX0pNUDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSzoKQEAgLTk3MiwxNyArOTM5LDE0IEBACiAJCQkJICogaW1tZWRpYXRlIGludG8gdG1wIHJlZ2lzdGVyIGFuZCB1c2UgaXQKIAkJCQkgKiBpbiBjb21wYXJlIGluc24uCiAJCQkJICovCi0JCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0s7Ci0JCQkJaW5zbi0+YV9yZWcgPSBUTVBfUkVHOwotCQkJCWluc24tPmltbSA9IGZwLT5rOwotCQkJCWluc24rKzsKKwkJCQkqaW5zbisrID0gQlBGX01PVjMyX0lNTShCUEZfUkVHX1RNUCwgZnAtPmspOwogCi0JCQkJaW5zbi0+YV9yZWcgPSBBX1JFRzsKLQkJCQlpbnNuLT54X3JlZyA9IFRNUF9SRUc7CisJCQkJaW5zbi0+ZHN0X3JlZyA9IEJQRl9SRUdfQTsKKwkJCQlpbnNuLT5zcmNfcmVnID0gQlBGX1JFR19UTVA7CiAJCQkJYnBmX3NyYyA9IEJQRl9YOwogCQkJfSBlbHNlIHsKLQkJCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJCWluc24tPnhfcmVnID0gWF9SRUc7CisJCQkJaW5zbi0+ZHN0X3JlZyA9IEJQRl9SRUdfQTsKKwkJCQlpbnNuLT5zcmNfcmVnID0gQlBGX1JFR19YOwogCQkJCWluc24tPmltbSA9IGZwLT5rOwogCQkJCWJwZl9zcmMgPSBCUEZfU1JDKGZwLT5jb2RlKTsKIAkJCX0KQEAgLTk5MSw3ICs5NTUsNyBAQAogCQkJaWYgKGZwLT5qZiA9PSAwKSB7CiAJCQkJaW5zbi0+Y29kZSA9IEJQRl9KTVAgfCBCUEZfT1AoZnAtPmNvZGUpIHwgYnBmX3NyYzsKIAkJCQl0YXJnZXQgPSBpICsgZnAtPmp0ICsgMTsKLQkJCQlFTUlUX0pNUDsKKwkJCQlCUEZfRU1JVF9KTVA7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTk5OSwxMjcgKzk2Myw5NCBAQAogCQkJaWYgKGZwLT5qdCA9PSAwICYmIEJQRl9PUChmcC0+Y29kZSkgPT0gQlBGX0pFUSkgewogCQkJCWluc24tPmNvZGUgPSBCUEZfSk1QIHwgQlBGX0pORSB8IGJwZl9zcmM7CiAJCQkJdGFyZ2V0ID0gaSArIGZwLT5qZiArIDE7Ci0JCQkJRU1JVF9KTVA7CisJCQkJQlBGX0VNSVRfSk1QOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBPdGhlciBqdW1wcyBhcmUgbWFwcGVkIGludG8gdHdvIGluc25zOiBKeHggYW5kIEpBLiAqLwogCQkJdGFyZ2V0ID0gaSArIGZwLT5qdCArIDE7CiAJCQlpbnNuLT5jb2RlID0gQlBGX0pNUCB8IEJQRl9PUChmcC0+Y29kZSkgfCBicGZfc3JjOwotCQkJRU1JVF9KTVA7CisJCQlCUEZfRU1JVF9KTVA7CiAJCQlpbnNuKys7CiAKIAkJCWluc24tPmNvZGUgPSBCUEZfSk1QIHwgQlBGX0pBOwogCQkJdGFyZ2V0ID0gaSArIGZwLT5qZiArIDE7Ci0JCQlFTUlUX0pNUDsKKwkJCUJQRl9FTUlUX0pNUDsKIAkJCWJyZWFrOwogCiAJCS8qIGxkeGIgNCAqIChbMTRdICYgMHhmKSBpcyByZW1hcGVkIGludG8gNiBpbnNucy4gKi8KIAkJY2FzZSBCUEZfTERYIHwgQlBGX01TSCB8IEJQRl9COgotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWDsKLQkJCWluc24tPmFfcmVnID0gVE1QX1JFRzsKLQkJCWluc24tPnhfcmVnID0gQV9SRUc7Ci0JCQlpbnNuKys7Ci0KLQkJCWluc24tPmNvZGUgPSBCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0I7Ci0JCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJaW5zbi0+aW1tID0gZnAtPms7Ci0JCQlpbnNuKys7Ci0KLQkJCWluc24tPmNvZGUgPSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9LOwotCQkJaW5zbi0+YV9yZWcgPSBBX1JFRzsKLQkJCWluc24tPmltbSA9IDB4ZjsKLQkJCWluc24rKzsKLQotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0s7Ci0JCQlpbnNuLT5hX3JlZyA9IEFfUkVHOwotCQkJaW5zbi0+aW1tID0gMjsKLQkJCWluc24rKzsKLQotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWDsKLQkJCWluc24tPmFfcmVnID0gWF9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IEFfUkVHOwotCQkJaW5zbisrOwotCi0JCQlpbnNuLT5jb2RlID0gQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YOwotCQkJaW5zbi0+YV9yZWcgPSBBX1JFRzsKLQkJCWluc24tPnhfcmVnID0gVE1QX1JFRzsKKwkJCS8qIHRtcCA9IEEgKi8KKwkJCSppbnNuKysgPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfVE1QLCBCUEZfUkVHX0EpOworCQkJLyogQSA9IEJQRl9SMCA9ICoodTggKikgKHNrYi0+ZGF0YSArIEspICovCisJCQkqaW5zbisrID0gQlBGX0xEX0FCUyhCUEZfQiwgZnAtPmspOworCQkJLyogQSAmPSAweGYgKi8KKwkJCSppbnNuKysgPSBCUEZfQUxVMzJfSU1NKEJQRl9BTkQsIEJQRl9SRUdfQSwgMHhmKTsKKwkJCS8qIEEgPDw9IDIgKi8KKwkJCSppbnNuKysgPSBCUEZfQUxVMzJfSU1NKEJQRl9MU0gsIEJQRl9SRUdfQSwgMik7CisJCQkvKiBYID0gQSAqLworCQkJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR19YLCBCUEZfUkVHX0EpOworCQkJLyogQSA9IHRtcCAqLworCQkJKmluc24gPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfQSwgQlBGX1JFR19UTVApOwogCQkJYnJlYWs7CiAKIAkJLyogUkVUX0ssIFJFVF9BIGFyZSByZW1hcGVkIGludG8gMiBpbnNucy4gKi8KIAkJY2FzZSBCUEZfUkVUIHwgQlBGX0E6CiAJCWNhc2UgQlBGX1JFVCB8IEJQRl9LOgotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfTU9WIHwKLQkJCQkgICAgIChCUEZfUlZBTChmcC0+Y29kZSkgPT0gQlBGX0sgPwotCQkJCSAgICAgIEJQRl9LIDogQlBGX1gpOwotCQkJaW5zbi0+YV9yZWcgPSAwOwotCQkJaW5zbi0+eF9yZWcgPSBBX1JFRzsKLQkJCWluc24tPmltbSA9IGZwLT5rOwotCQkJaW5zbisrOwotCi0JCQlpbnNuLT5jb2RlID0gQlBGX0pNUCB8IEJQRl9FWElUOworCQkJKmluc24rKyA9IEJQRl9NT1YzMl9SQVcoQlBGX1JWQUwoZnAtPmNvZGUpID09IEJQRl9LID8KKwkJCQkJCUJQRl9LIDogQlBGX1gsIEJQRl9SRUdfMCwKKwkJCQkJCUJQRl9SRUdfQSwgZnAtPmspOworCQkJKmluc24gPSBCUEZfRVhJVF9JTlNOKCk7CiAJCQlicmVhazsKIAogCQkvKiBTdG9yZSB0byBzdGFjay4gKi8KIAkJY2FzZSBCUEZfU1Q6CiAJCWNhc2UgQlBGX1NUWDoKLQkJCWluc24tPmNvZGUgPSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XOwotCQkJaW5zbi0+YV9yZWcgPSBGUF9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IGZwLT5jb2RlID09IEJQRl9TVCA/IEFfUkVHIDogWF9SRUc7Ci0JCQlpbnNuLT5vZmYgPSAtKEJQRl9NRU1XT1JEUyAtIGZwLT5rKSAqIDQ7CisJCQkqaW5zbiA9IEJQRl9TVFhfTUVNKEJQRl9XLCBCUEZfUkVHX0ZQLCBCUEZfQ0xBU1MoZnAtPmNvZGUpID09CisJCQkJCSAgICBCUEZfU1QgPyBCUEZfUkVHX0EgOiBCUEZfUkVHX1gsCisJCQkJCSAgICAtKEJQRl9NRU1XT1JEUyAtIGZwLT5rKSAqIDQpOwogCQkJYnJlYWs7CiAKIAkJLyogTG9hZCBmcm9tIHN0YWNrLiAqLwogCQljYXNlIEJQRl9MRCB8IEJQRl9NRU06CiAJCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU06Ci0JCQlpbnNuLT5jb2RlID0gQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVzsKLQkJCWluc24tPmFfcmVnID0gQlBGX0NMQVNTKGZwLT5jb2RlKSA9PSBCUEZfTEQgPwotCQkJCSAgICAgIEFfUkVHIDogWF9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IEZQX1JFRzsKLQkJCWluc24tPm9mZiA9IC0oQlBGX01FTVdPUkRTIC0gZnAtPmspICogNDsKKwkJCSppbnNuID0gQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9DTEFTUyhmcC0+Y29kZSkgPT0gQlBGX0xEICA/CisJCQkJCSAgICBCUEZfUkVHX0EgOiBCUEZfUkVHX1gsIEJQRl9SRUdfRlAsCisJCQkJCSAgICAtKEJQRl9NRU1XT1JEUyAtIGZwLT5rKSAqIDQpOwogCQkJYnJlYWs7CiAKIAkJLyogQSA9IEsgb3IgWCA9IEsgKi8KIAkJY2FzZSBCUEZfTEQgfCBCUEZfSU1NOgogCQljYXNlIEJQRl9MRFggfCBCUEZfSU1NOgotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0s7Ci0JCQlpbnNuLT5hX3JlZyA9IEJQRl9DTEFTUyhmcC0+Y29kZSkgPT0gQlBGX0xEID8KLQkJCQkgICAgICBBX1JFRyA6IFhfUkVHOwotCQkJaW5zbi0+aW1tID0gZnAtPms7CisJCQkqaW5zbiA9IEJQRl9NT1YzMl9JTU0oQlBGX0NMQVNTKGZwLT5jb2RlKSA9PSBCUEZfTEQgPworCQkJCQkgICAgICBCUEZfUkVHX0EgOiBCUEZfUkVHX1gsIGZwLT5rKTsKIAkJCWJyZWFrOwogCiAJCS8qIFggPSBBICovCiAJCWNhc2UgQlBGX01JU0MgfCBCUEZfVEFYOgotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWDsKLQkJCWluc24tPmFfcmVnID0gWF9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IEFfUkVHOworCQkJKmluc24gPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfWCwgQlBGX1JFR19BKTsKIAkJCWJyZWFrOwogCiAJCS8qIEEgPSBYICovCiAJCWNhc2UgQlBGX01JU0MgfCBCUEZfVFhBOgotCQkJaW5zbi0+Y29kZSA9IEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWDsKLQkJCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IFhfUkVHOworCQkJKmluc24gPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfQSwgQlBGX1JFR19YKTsKIAkJCWJyZWFrOwogCiAJCS8qIEEgPSBza2ItPmxlbiBvciBYID0gc2tiLT5sZW4gKi8KIAkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU46CiAJCWNhc2UgQlBGX0xEWCB8IEJQRl9XIHwgQlBGX0xFTjoKLQkJCWluc24tPmNvZGUgPSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XOwotCQkJaW5zbi0+YV9yZWcgPSBCUEZfQ0xBU1MoZnAtPmNvZGUpID09IEJQRl9MRCA/Ci0JCQkJICAgICAgQV9SRUcgOiBYX1JFRzsKLQkJCWluc24tPnhfcmVnID0gQ1RYX1JFRzsKLQkJCWluc24tPm9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pOworCQkJKmluc24gPSBCUEZfTERYX01FTShCUEZfVywgQlBGX0NMQVNTKGZwLT5jb2RlKSA9PSBCUEZfTEQgPworCQkJCQkgICAgQlBGX1JFR19BIDogQlBGX1JFR19YLCBCUEZfUkVHX0NUWCwKKwkJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKIAkJCWJyZWFrOwogCi0JCS8qIGFjY2VzcyBzZWNjb21wX2RhdGEgZmllbGRzICovCisJCS8qIEFjY2VzcyBzZWNjb21wX2RhdGEgZmllbGRzLiAqLwogCQljYXNlIEJQRl9MRFggfCBCUEZfQUJTIHwgQlBGX1c6Ci0JCQlpbnNuLT5jb2RlID0gQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVzsKLQkJCWluc24tPmFfcmVnID0gQV9SRUc7Ci0JCQlpbnNuLT54X3JlZyA9IENUWF9SRUc7Ci0JCQlpbnNuLT5vZmYgPSBmcC0+azsKKwkJCS8qIEEgPSAqKHUzMiAqKSAoY3R4ICsgSykgKi8KKwkJCSppbnNuID0gQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfQSwgQlBGX1JFR19DVFgsIGZwLT5rKTsKIAkJCWJyZWFrOwogCisJCS8qIFVua293biBpbnN0cnVjdGlvbi4gKi8KIAkJZGVmYXVsdDoKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xMTI4LDcgKzEwNTksNiBAQAogCQlpZiAobmV3X3Byb2cpCiAJCQltZW1jcHkobmV3X2luc24sIHRtcF9pbnNucywKIAkJCSAgICAgICBzaXplb2YoKmluc24pICogKGluc24gLSB0bXBfaW5zbnMpKTsKLQogCQluZXdfaW5zbiArPSBpbnNuIC0gdG1wX2luc25zOwogCX0KIApAQCAtMTE0Myw3ICsxMDczLDYgQEAKIAkJbmV3X2ZsZW4gPSBuZXdfaW5zbiAtIG5ld19wcm9nOwogCQlpZiAocGFzcyA+IDIpCiAJCQlnb3RvIGVycjsKLQogCQlnb3RvIGRvX3Bhc3M7CiAJfQogCkBAIC0xMTY3LDQ0ICsxMDk2LDQ2IEBACiAgKi8KIHN0YXRpYyBpbnQgY2hlY2tfbG9hZF9hbmRfc3RvcmVzKHN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdGVyLCBpbnQgZmxlbikKIHsKLQl1MTYgKm1hc2tzLCBtZW12YWxpZCA9IDA7IC8qIG9uZSBiaXQgcGVyIGNlbGwsIDE2IGNlbGxzICovCisJdTE2ICptYXNrcywgbWVtdmFsaWQgPSAwOyAvKiBPbmUgYml0IHBlciBjZWxsLCAxNiBjZWxscyAqLwogCWludCBwYywgcmV0ID0gMDsKIAogCUJVSUxEX0JVR19PTihCUEZfTUVNV09SRFMgPiAxNik7CisKIAltYXNrcyA9IGttYWxsb2MoZmxlbiAqIHNpemVvZigqbWFza3MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1hc2tzKQogCQlyZXR1cm4gLUVOT01FTTsKKwogCW1lbXNldChtYXNrcywgMHhmZiwgZmxlbiAqIHNpemVvZigqbWFza3MpKTsKIAogCWZvciAocGMgPSAwOyBwYyA8IGZsZW47IHBjKyspIHsKIAkJbWVtdmFsaWQgJj0gbWFza3NbcGNdOwogCiAJCXN3aXRjaCAoZmlsdGVyW3BjXS5jb2RlKSB7Ci0JCWNhc2UgQlBGX1NfU1Q6Ci0JCWNhc2UgQlBGX1NfU1RYOgorCQljYXNlIEJQRl9TVDoKKwkJY2FzZSBCUEZfU1RYOgogCQkJbWVtdmFsaWQgfD0gKDEgPDwgZmlsdGVyW3BjXS5rKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEX01FTToKLQkJY2FzZSBCUEZfU19MRFhfTUVNOgorCQljYXNlIEJQRl9MRCB8IEJQRl9NRU06CisJCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU06CiAJCQlpZiAoIShtZW12YWxpZCAmICgxIDw8IGZpbHRlcltwY10uaykpKSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfSk1QX0pBOgotCQkJLyogYSBqdW1wIG11c3Qgc2V0IG1hc2tzIG9uIHRhcmdldCAqLworCQljYXNlIEJQRl9KTVAgfCBCUEZfSkE6CisJCQkvKiBBIGp1bXAgbXVzdCBzZXQgbWFza3Mgb24gdGFyZ2V0ICovCiAJCQltYXNrc1twYyArIDEgKyBmaWx0ZXJbcGNdLmtdICY9IG1lbXZhbGlkOwogCQkJbWVtdmFsaWQgPSB+MDsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKLQkJY2FzZSBCUEZfU19KTVBfSkVRX1g6Ci0JCWNhc2UgQlBGX1NfSk1QX0pHRV9LOgotCQljYXNlIEJQRl9TX0pNUF9KR0VfWDoKLQkJY2FzZSBCUEZfU19KTVBfSkdUX0s6Ci0JCWNhc2UgQlBGX1NfSk1QX0pHVF9YOgotCQljYXNlIEJQRl9TX0pNUF9KU0VUX1g6Ci0JCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKLQkJCS8qIGEganVtcCBtdXN0IHNldCBtYXNrcyBvbiB0YXJnZXRzICovCisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6CisJCQkvKiBBIGp1bXAgbXVzdCBzZXQgbWFza3Mgb24gdGFyZ2V0cyAqLwogCQkJbWFza3NbcGMgKyAxICsgZmlsdGVyW3BjXS5qdF0gJj0gbWVtdmFsaWQ7CiAJCQltYXNrc1twYyArIDEgKyBmaWx0ZXJbcGNdLmpmXSAmPSBtZW12YWxpZDsKIAkJCW1lbXZhbGlkID0gfjA7CkBAIC0xMjE2LDYgKzExNDcsNzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgYm9vbCBjaGtfY29kZV9hbGxvd2VkKHUxNiBjb2RlX3RvX3Byb2JlKQoreworCXN0YXRpYyBjb25zdCBib29sIGNvZGVzW10gPSB7CisJCS8qIDMyIGJpdCBBTFUgb3BlcmF0aW9ucyAqLworCQlbQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfS10gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfWF0gPSB0cnVlLAorCQlbQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LXSA9IHRydWUsCisJCVtCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9BTFUgfCBCUEZfTkVHXSA9IHRydWUsCisJCS8qIExvYWQgaW5zdHJ1Y3Rpb25zICovCisJCVtCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlNdID0gdHJ1ZSwKKwkJW0JQRl9MRCB8IEJQRl9IIHwgQlBGX0FCU10gPSB0cnVlLAorCQlbQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTXSA9IHRydWUsCisJCVtCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU5dID0gdHJ1ZSwKKwkJW0JQRl9MRCB8IEJQRl9XIHwgQlBGX0lORF0gPSB0cnVlLAorCQlbQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5EXSA9IHRydWUsCisJCVtCUEZfTEQgfCBCUEZfQiB8IEJQRl9JTkRdID0gdHJ1ZSwKKwkJW0JQRl9MRCB8IEJQRl9JTU1dID0gdHJ1ZSwKKwkJW0JQRl9MRCB8IEJQRl9NRU1dID0gdHJ1ZSwKKwkJW0JQRl9MRFggfCBCUEZfVyB8IEJQRl9MRU5dID0gdHJ1ZSwKKwkJW0JQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0hdID0gdHJ1ZSwKKwkJW0JQRl9MRFggfCBCUEZfSU1NXSA9IHRydWUsCisJCVtCUEZfTERYIHwgQlBGX01FTV0gPSB0cnVlLAorCQkvKiBTdG9yZSBpbnN0cnVjdGlvbnMgKi8KKwkJW0JQRl9TVF0gPSB0cnVlLAorCQlbQlBGX1NUWF0gPSB0cnVlLAorCQkvKiBNaXNjIGluc3RydWN0aW9ucyAqLworCQlbQlBGX01JU0MgfCBCUEZfVEFYXSA9IHRydWUsCisJCVtCUEZfTUlTQyB8IEJQRl9UWEFdID0gdHJ1ZSwKKwkJLyogUmV0dXJuIGluc3RydWN0aW9ucyAqLworCQlbQlBGX1JFVCB8IEJQRl9LXSA9IHRydWUsCisJCVtCUEZfUkVUIHwgQlBGX0FdID0gdHJ1ZSwKKwkJLyogSnVtcCBpbnN0cnVjdGlvbnMgKi8KKwkJW0JQRl9KTVAgfCBCUEZfSkFdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX0tdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1hdID0gdHJ1ZSwKKwkJW0JQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LXSA9IHRydWUsCisJCVtCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWF0gPSB0cnVlLAorCX07CisKKwlpZiAoY29kZV90b19wcm9iZSA+PSBBUlJBWV9TSVpFKGNvZGVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIGNvZGVzW2NvZGVfdG9fcHJvYmVdOworfQorCiAvKioKICAqCXNrX2Noa19maWx0ZXIgLSB2ZXJpZnkgc29ja2V0IGZpbHRlciBjb2RlCiAgKglAZmlsdGVyOiBmaWx0ZXIgdG8gdmVyaWZ5CkBAIC0xMjMyLDE1MyArMTIyOSw3NiBAQAogICovCiBpbnQgc2tfY2hrX2ZpbHRlcihzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciwgdW5zaWduZWQgaW50IGZsZW4pCiB7Ci0JLyoKLQkgKiBWYWxpZCBpbnN0cnVjdGlvbnMgYXJlIGluaXRpYWxpemVkIHRvIG5vbi0wLgotCSAqIEludmFsaWQgaW5zdHJ1Y3Rpb25zIGFyZSBpbml0aWFsaXplZCB0byAwLgotCSAqLwotCXN0YXRpYyBjb25zdCB1OCBjb2Rlc1tdID0gewotCQlbQlBGX0FMVXxCUEZfQUREfEJQRl9LXSAgPSBCUEZfU19BTFVfQUREX0ssCi0JCVtCUEZfQUxVfEJQRl9BRER8QlBGX1hdICA9IEJQRl9TX0FMVV9BRERfWCwKLQkJW0JQRl9BTFV8QlBGX1NVQnxCUEZfS10gID0gQlBGX1NfQUxVX1NVQl9LLAotCQlbQlBGX0FMVXxCUEZfU1VCfEJQRl9YXSAgPSBCUEZfU19BTFVfU1VCX1gsCi0JCVtCUEZfQUxVfEJQRl9NVUx8QlBGX0tdICA9IEJQRl9TX0FMVV9NVUxfSywKLQkJW0JQRl9BTFV8QlBGX01VTHxCUEZfWF0gID0gQlBGX1NfQUxVX01VTF9YLAotCQlbQlBGX0FMVXxCUEZfRElWfEJQRl9YXSAgPSBCUEZfU19BTFVfRElWX1gsCi0JCVtCUEZfQUxVfEJQRl9NT0R8QlBGX0tdICA9IEJQRl9TX0FMVV9NT0RfSywKLQkJW0JQRl9BTFV8QlBGX01PRHxCUEZfWF0gID0gQlBGX1NfQUxVX01PRF9YLAotCQlbQlBGX0FMVXxCUEZfQU5EfEJQRl9LXSAgPSBCUEZfU19BTFVfQU5EX0ssCi0JCVtCUEZfQUxVfEJQRl9BTkR8QlBGX1hdICA9IEJQRl9TX0FMVV9BTkRfWCwKLQkJW0JQRl9BTFV8QlBGX09SfEJQRl9LXSAgID0gQlBGX1NfQUxVX09SX0ssCi0JCVtCUEZfQUxVfEJQRl9PUnxCUEZfWF0gICA9IEJQRl9TX0FMVV9PUl9YLAotCQlbQlBGX0FMVXxCUEZfWE9SfEJQRl9LXSAgPSBCUEZfU19BTFVfWE9SX0ssCi0JCVtCUEZfQUxVfEJQRl9YT1J8QlBGX1hdICA9IEJQRl9TX0FMVV9YT1JfWCwKLQkJW0JQRl9BTFV8QlBGX0xTSHxCUEZfS10gID0gQlBGX1NfQUxVX0xTSF9LLAotCQlbQlBGX0FMVXxCUEZfTFNIfEJQRl9YXSAgPSBCUEZfU19BTFVfTFNIX1gsCi0JCVtCUEZfQUxVfEJQRl9SU0h8QlBGX0tdICA9IEJQRl9TX0FMVV9SU0hfSywKLQkJW0JQRl9BTFV8QlBGX1JTSHxCUEZfWF0gID0gQlBGX1NfQUxVX1JTSF9YLAotCQlbQlBGX0FMVXxCUEZfTkVHXSAgICAgICAgPSBCUEZfU19BTFVfTkVHLAotCQlbQlBGX0xEfEJQRl9XfEJQRl9BQlNdICAgPSBCUEZfU19MRF9XX0FCUywKLQkJW0JQRl9MRHxCUEZfSHxCUEZfQUJTXSAgID0gQlBGX1NfTERfSF9BQlMsCi0JCVtCUEZfTER8QlBGX0J8QlBGX0FCU10gICA9IEJQRl9TX0xEX0JfQUJTLAotCQlbQlBGX0xEfEJQRl9XfEJQRl9MRU5dICAgPSBCUEZfU19MRF9XX0xFTiwKLQkJW0JQRl9MRHxCUEZfV3xCUEZfSU5EXSAgID0gQlBGX1NfTERfV19JTkQsCi0JCVtCUEZfTER8QlBGX0h8QlBGX0lORF0gICA9IEJQRl9TX0xEX0hfSU5ELAotCQlbQlBGX0xEfEJQRl9CfEJQRl9JTkRdICAgPSBCUEZfU19MRF9CX0lORCwKLQkJW0JQRl9MRHxCUEZfSU1NXSAgICAgICAgID0gQlBGX1NfTERfSU1NLAotCQlbQlBGX0xEWHxCUEZfV3xCUEZfTEVOXSAgPSBCUEZfU19MRFhfV19MRU4sCi0JCVtCUEZfTERYfEJQRl9CfEJQRl9NU0hdICA9IEJQRl9TX0xEWF9CX01TSCwKLQkJW0JQRl9MRFh8QlBGX0lNTV0gICAgICAgID0gQlBGX1NfTERYX0lNTSwKLQkJW0JQRl9NSVNDfEJQRl9UQVhdICAgICAgID0gQlBGX1NfTUlTQ19UQVgsCi0JCVtCUEZfTUlTQ3xCUEZfVFhBXSAgICAgICA9IEJQRl9TX01JU0NfVFhBLAotCQlbQlBGX1JFVHxCUEZfS10gICAgICAgICAgPSBCUEZfU19SRVRfSywKLQkJW0JQRl9SRVR8QlBGX0FdICAgICAgICAgID0gQlBGX1NfUkVUX0EsCi0JCVtCUEZfQUxVfEJQRl9ESVZ8QlBGX0tdICA9IEJQRl9TX0FMVV9ESVZfSywKLQkJW0JQRl9MRHxCUEZfTUVNXSAgICAgICAgID0gQlBGX1NfTERfTUVNLAotCQlbQlBGX0xEWHxCUEZfTUVNXSAgICAgICAgPSBCUEZfU19MRFhfTUVNLAotCQlbQlBGX1NUXSAgICAgICAgICAgICAgICAgPSBCUEZfU19TVCwKLQkJW0JQRl9TVFhdICAgICAgICAgICAgICAgID0gQlBGX1NfU1RYLAotCQlbQlBGX0pNUHxCUEZfSkFdICAgICAgICAgPSBCUEZfU19KTVBfSkEsCi0JCVtCUEZfSk1QfEJQRl9KRVF8QlBGX0tdICA9IEJQRl9TX0pNUF9KRVFfSywKLQkJW0JQRl9KTVB8QlBGX0pFUXxCUEZfWF0gID0gQlBGX1NfSk1QX0pFUV9YLAotCQlbQlBGX0pNUHxCUEZfSkdFfEJQRl9LXSAgPSBCUEZfU19KTVBfSkdFX0ssCi0JCVtCUEZfSk1QfEJQRl9KR0V8QlBGX1hdICA9IEJQRl9TX0pNUF9KR0VfWCwKLQkJW0JQRl9KTVB8QlBGX0pHVHxCUEZfS10gID0gQlBGX1NfSk1QX0pHVF9LLAotCQlbQlBGX0pNUHxCUEZfSkdUfEJQRl9YXSAgPSBCUEZfU19KTVBfSkdUX1gsCi0JCVtCUEZfSk1QfEJQRl9KU0VUfEJQRl9LXSA9IEJQRl9TX0pNUF9KU0VUX0ssCi0JCVtCUEZfSk1QfEJQRl9KU0VUfEJQRl9YXSA9IEJQRl9TX0pNUF9KU0VUX1gsCi0JfTsKLQlpbnQgcGM7CiAJYm9vbCBhbmNfZm91bmQ7CisJaW50IHBjOwogCiAJaWYgKGZsZW4gPT0gMCB8fCBmbGVuID4gQlBGX01BWElOU05TKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGNoZWNrIHRoZSBmaWx0ZXIgY29kZSBub3cgKi8KKwkvKiBDaGVjayB0aGUgZmlsdGVyIGNvZGUgbm93ICovCiAJZm9yIChwYyA9IDA7IHBjIDwgZmxlbjsgcGMrKykgewogCQlzdHJ1Y3Qgc29ja19maWx0ZXIgKmZ0ZXN0ID0gJmZpbHRlcltwY107Ci0JCXUxNiBjb2RlID0gZnRlc3QtPmNvZGU7CiAKLQkJaWYgKGNvZGUgPj0gQVJSQVlfU0laRShjb2RlcykpCisJCS8qIE1heSB3ZSBhY3R1YWxseSBvcGVyYXRlIG9uIHRoaXMgY29kZT8gKi8KKwkJaWYgKCFjaGtfY29kZV9hbGxvd2VkKGZ0ZXN0LT5jb2RlKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQljb2RlID0gY29kZXNbY29kZV07Ci0JCWlmICghY29kZSkKLQkJCXJldHVybiAtRUlOVkFMOworCiAJCS8qIFNvbWUgaW5zdHJ1Y3Rpb25zIG5lZWQgc3BlY2lhbCBjaGVja3MgKi8KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCWNhc2UgQlBGX1NfQUxVX0RJVl9LOgotCQljYXNlIEJQRl9TX0FMVV9NT0RfSzoKLQkJCS8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvICovCisJCXN3aXRjaCAoZnRlc3QtPmNvZGUpIHsKKwkJY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOgorCQljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6CisJCQkvKiBDaGVjayBmb3IgZGl2aXNpb24gYnkgemVybyAqLwogCQkJaWYgKGZ0ZXN0LT5rID09IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19MRF9NRU06Ci0JCWNhc2UgQlBGX1NfTERYX01FTToKLQkJY2FzZSBCUEZfU19TVDoKLQkJY2FzZSBCUEZfU19TVFg6Ci0JCQkvKiBjaGVjayBmb3IgaW52YWxpZCBtZW1vcnkgYWRkcmVzc2VzICovCisJCWNhc2UgQlBGX0xEIHwgQlBGX01FTToKKwkJY2FzZSBCUEZfTERYIHwgQlBGX01FTToKKwkJY2FzZSBCUEZfU1Q6CisJCWNhc2UgQlBGX1NUWDoKKwkJCS8qIENoZWNrIGZvciBpbnZhbGlkIG1lbW9yeSBhZGRyZXNzZXMgKi8KIAkJCWlmIChmdGVzdC0+ayA+PSBCUEZfTUVNV09SRFMpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfU19KTVBfSkE6Ci0JCQkvKgotCQkJICogTm90ZSwgdGhlIGxhcmdlIGZ0ZXN0LT5rIG1pZ2h0IGNhdXNlIGxvb3BzLgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkE6CisJCQkvKiBOb3RlLCB0aGUgbGFyZ2UgZnRlc3QtPmsgbWlnaHQgY2F1c2UgbG9vcHMuCiAJCQkgKiBDb21wYXJlIHRoaXMgd2l0aCBjb25kaXRpb25hbCBqdW1wcyBiZWxvdywKIAkJCSAqIHdoZXJlIG9mZnNldHMgYXJlIGxpbWl0ZWQuIC0tQU5LICg5ODEwMTYpCiAJCQkgKi8KLQkJCWlmIChmdGVzdC0+ayA+PSAodW5zaWduZWQgaW50KShmbGVuLXBjLTEpKQorCQkJaWYgKGZ0ZXN0LT5rID49ICh1bnNpZ25lZCBpbnQpKGZsZW4gLSBwYyAtIDEpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX1NfSk1QX0pFUV9LOgotCQljYXNlIEJQRl9TX0pNUF9KRVFfWDoKLQkJY2FzZSBCUEZfU19KTVBfSkdFX0s6Ci0JCWNhc2UgQlBGX1NfSk1QX0pHRV9YOgotCQljYXNlIEJQRl9TX0pNUF9KR1RfSzoKLQkJY2FzZSBCUEZfU19KTVBfSkdUX1g6Ci0JCWNhc2UgQlBGX1NfSk1QX0pTRVRfWDoKLQkJY2FzZSBCUEZfU19KTVBfSlNFVF9LOgotCQkJLyogZm9yIGNvbmRpdGlvbmFscyBib3RoIG11c3QgYmUgc2FmZSAqLworCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWDoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1g6CisJCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKKwkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgorCQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9YOgorCQkJLyogQm90aCBjb25kaXRpb25hbHMgbXVzdCBiZSBzYWZlICovCiAJCQlpZiAocGMgKyBmdGVzdC0+anQgKyAxID49IGZsZW4gfHwKIAkJCSAgICBwYyArIGZ0ZXN0LT5qZiArIDEgPj0gZmxlbikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9TX0xEX1dfQUJTOgotCQljYXNlIEJQRl9TX0xEX0hfQUJTOgotCQljYXNlIEJQRl9TX0xEX0JfQUJTOgorCQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUzoKKwkJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlM6CisJCWNhc2UgQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTOgogCQkJYW5jX2ZvdW5kID0gZmFsc2U7Ci0jZGVmaW5lIEFOQ0lMTEFSWShDT0RFKSBjYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfIyNDT0RFOglcCi0JCQkJY29kZSA9IEJQRl9TX0FOQ18jI0NPREU7CVwKLQkJCQlhbmNfZm91bmQgPSB0cnVlOwkJXAotCQkJCWJyZWFrCi0JCQlzd2l0Y2ggKGZ0ZXN0LT5rKSB7Ci0JCQlBTkNJTExBUlkoUFJPVE9DT0wpOwotCQkJQU5DSUxMQVJZKFBLVFRZUEUpOwotCQkJQU5DSUxMQVJZKElGSU5ERVgpOwotCQkJQU5DSUxMQVJZKE5MQVRUUik7Ci0JCQlBTkNJTExBUlkoTkxBVFRSX05FU1QpOwotCQkJQU5DSUxMQVJZKE1BUkspOwotCQkJQU5DSUxMQVJZKFFVRVVFKTsKLQkJCUFOQ0lMTEFSWShIQVRZUEUpOwotCQkJQU5DSUxMQVJZKFJYSEFTSCk7Ci0JCQlBTkNJTExBUlkoQ1BVKTsKLQkJCUFOQ0lMTEFSWShBTFVfWE9SX1gpOwotCQkJQU5DSUxMQVJZKFZMQU5fVEFHKTsKLQkJCUFOQ0lMTEFSWShWTEFOX1RBR19QUkVTRU5UKTsKLQkJCUFOQ0lMTEFSWShQQVlfT0ZGU0VUKTsKLQkJCX0KLQotCQkJLyogYW5jaWxsYXJ5IG9wZXJhdGlvbiB1bmtub3duIG9yIHVuc3VwcG9ydGVkICovCisJCQlpZiAoYnBmX2FuY19oZWxwZXIoZnRlc3QpICYgQlBGX0FOQykKKwkJCQlhbmNfZm91bmQgPSB0cnVlOworCQkJLyogQW5jaWxsYXJ5IG9wZXJhdGlvbiB1bmtub3duIG9yIHVuc3VwcG9ydGVkICovCiAJCQlpZiAoYW5jX2ZvdW5kID09IGZhbHNlICYmIGZ0ZXN0LT5rID49IFNLRl9BRF9PRkYpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJZnRlc3QtPmNvZGUgPSBjb2RlOwogCX0KIAotCS8qIGxhc3QgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIFJFVCBjb2RlICovCisJLyogTGFzdCBpbnN0cnVjdGlvbiBtdXN0IGJlIGEgUkVUIGNvZGUgKi8KIAlzd2l0Y2ggKGZpbHRlcltmbGVuIC0gMV0uY29kZSkgewotCWNhc2UgQlBGX1NfUkVUX0s6Ci0JY2FzZSBCUEZfU19SRVRfQToKKwljYXNlIEJQRl9SRVQgfCBCUEZfSzoKKwljYXNlIEJQRl9SRVQgfCBCUEZfQToKIAkJcmV0dXJuIGNoZWNrX2xvYWRfYW5kX3N0b3JlcyhmaWx0ZXIsIGZsZW4pOwogCX0KKwogCXJldHVybiAtRUlOVkFMOwogfQogRVhQT1JUX1NZTUJPTChza19jaGtfZmlsdGVyKTsKQEAgLTE0MjMsNyArMTM0Myw3IEBACiAJc3RydWN0IHNrX2ZpbHRlciAqZnAgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2tfZmlsdGVyLCByY3UpOwogCiAJc2tfcmVsZWFzZV9vcmlnX2ZpbHRlcihmcCk7Ci0JYnBmX2ppdF9mcmVlKGZwKTsKKwlza19maWx0ZXJfZnJlZShmcCk7CiB9CiAKIC8qKgpAQCAtMTQ2MSw3ICsxMzgxLDcgQEAKIAogCWZwX25ldyA9IHNvY2tfa21hbGxvYyhzaywgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoZnBfbmV3KSB7Ci0JCW1lbWNweShmcF9uZXcsIGZwLCBzaXplb2Yoc3RydWN0IHNrX2ZpbHRlcikpOworCQkqZnBfbmV3ID0gKmZwOwogCQkvKiBBcyB3ZSdyZSBrZXBwaW5nIG9yaWdfcHJvZyBpbiBmcF9uZXcgYWxvbmcsCiAJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBldmljdGluZyBpdAogCQkgKiBmcm9tIHRoZSBvbGQgZnAuCkBAIC0xNDc4LDcgKzEzOTgsNyBAQAogewogCXN0cnVjdCBzb2NrX2ZpbHRlciAqb2xkX3Byb2c7CiAJc3RydWN0IHNrX2ZpbHRlciAqb2xkX2ZwOwotCWludCBpLCBlcnIsIG5ld19sZW4sIG9sZF9sZW4gPSBmcC0+bGVuOworCWludCBlcnIsIG5ld19sZW4sIG9sZF9sZW4gPSBmcC0+bGVuOwogCiAJLyogV2UgYXJlIGZyZWUgdG8gb3ZlcndyaXRlIGluc25zIGV0IGFsIHJpZ2h0IGhlcmUgYXMgaXQKIAkgKiB3b24ndCBiZSB1c2VkIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBhbnltb3JlIGludGVybmFsbHkKQEAgLTE0ODgsMTMgKzE0MDgsNiBAQAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSAhPQogCQkgICAgIHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXJfaW50KSk7CiAKLQkvKiBGb3Igbm93LCB3ZSBuZWVkIHRvIHVuZmlkZGxlIEJQRl9TXyogaWRlbnRpZmllcnMgaW4gcGxhY2UuCi0JICogVGhpcyBjYW4gc29vbmVyIG9yIGxhdGVyIG9uIGJlIHN1YmplY3QgdG8gcmVtb3ZhbCwgZS5nLiB3aGVuCi0JICogSklUcyBoYXZlIGJlZW4gY29udmVydGVkLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBmcC0+bGVuOyBpKyspCi0JCXNrX2RlY29kZV9maWx0ZXIoJmZwLT5pbnNuc1tpXSwgJmZwLT5pbnNuc1tpXSk7Ci0KIAkvKiBDb252ZXJzaW9uIGNhbm5vdCBoYXBwZW4gb24gb3ZlcmxhcHBpbmcgbWVtb3J5IGFyZWFzLAogCSAqIHNvIHdlIG5lZWQgdG8ga2VlcCB0aGUgdXNlciBCUEYgYXJvdW5kIHVudGlsIHRoZSAybmQKIAkgKiBwYXNzLiBBdCB0aGlzIHRpbWUsIHRoZSB1c2VyIEJQRiBpcyBzdG9yZWQgaW4gZnAtPmluc25zLgpAQCAtMTUyMyw3ICsxNDM2LDYgQEAKIAkJZ290byBvdXRfZXJyX2ZyZWU7CiAJfQogCi0JZnAtPmJwZl9mdW5jID0gc2tfcnVuX2ZpbHRlcl9pbnRfc2tiOwogCWZwLT5sZW4gPSBuZXdfbGVuOwogCiAJLyogMm5kIHBhc3M6IHJlbWFwIHNvY2tfZmlsdGVyIGluc25zIGludG8gc29ja19maWx0ZXJfaW50IGluc25zLiAqLwpAQCAtMTUzNiw2ICsxNDQ4LDggQEAKIAkJICovCiAJCWdvdG8gb3V0X2Vycl9mcmVlOwogCisJc2tfZmlsdGVyX3NlbGVjdF9ydW50aW1lKGZwKTsKKwogCWtmcmVlKG9sZF9wcm9nKTsKIAlyZXR1cm4gZnA7CiAKQEAgLTE1NTAsNiArMTQ2NCwzMyBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKK3ZvaWQgX193ZWFrIGJwZl9pbnRfaml0X2NvbXBpbGUoc3RydWN0IHNrX2ZpbHRlciAqcHJvZykKK3sKK30KKworLyoqCisgKglza19maWx0ZXJfc2VsZWN0X3J1bnRpbWUgLSBzZWxlY3QgZXhlY3V0aW9uIHJ1bnRpbWUgZm9yIEJQRiBwcm9ncmFtCisgKglAZnA6IHNrX2ZpbHRlciBwb3B1bGF0ZWQgd2l0aCBpbnRlcm5hbCBCUEYgcHJvZ3JhbQorICoKKyAqIHRyeSB0byBKSVQgaW50ZXJuYWwgQlBGIHByb2dyYW0sIGlmIEpJVCBpcyBub3QgYXZhaWxhYmxlIHNlbGVjdCBpbnRlcnByZXRlcgorICogQlBGIHByb2dyYW0gd2lsbCBiZSBleGVjdXRlZCB2aWEgU0tfUlVOX0ZJTFRFUigpIG1hY3JvCisgKi8KK3ZvaWQgc2tfZmlsdGVyX3NlbGVjdF9ydW50aW1lKHN0cnVjdCBza19maWx0ZXIgKmZwKQoreworCWZwLT5icGZfZnVuYyA9ICh2b2lkICopIF9fc2tfcnVuX2ZpbHRlcjsKKworCS8qIFByb2JlIGlmIGludGVybmFsIEJQRiBjYW4gYmUgSklUZWQgKi8KKwlicGZfaW50X2ppdF9jb21waWxlKGZwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrX2ZpbHRlcl9zZWxlY3RfcnVudGltZSk7CisKKy8qIGZyZWUgaW50ZXJuYWwgQlBGIHByb2dyYW0gKi8KK3ZvaWQgc2tfZmlsdGVyX2ZyZWUoc3RydWN0IHNrX2ZpbHRlciAqZnApCit7CisJYnBmX2ppdF9mcmVlKGZwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrX2ZpbHRlcl9mcmVlKTsKKwogc3RhdGljIHN0cnVjdCBza19maWx0ZXIgKl9fc2tfcHJlcGFyZV9maWx0ZXIoc3RydWN0IHNrX2ZpbHRlciAqZnAsCiAJCQkJCSAgICAgc3RydWN0IHNvY2sgKnNrKQogewpAQCAtMTU5Miw3ICsxNTMzLDcgQEAKICAqIGEgbmVnYXRpdmUgZXJybm8gY29kZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcyB0aGUgcmV0dXJuIGlzIHplcm8uCiAgKi8KIGludCBza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoc3RydWN0IHNrX2ZpbHRlciAqKnBmcCwKLQkJCQlzdHJ1Y3Qgc29ja19mcHJvZyAqZnByb2cpCisJCQkJc3RydWN0IHNvY2tfZnByb2dfa2VybiAqZnByb2cpCiB7CiAJdW5zaWduZWQgaW50IGZzaXplID0gc2tfZmlsdGVyX3Byb2dsZW4oZnByb2cpOwogCXN0cnVjdCBza19maWx0ZXIgKmZwOwpAQCAtMTcxMyw4MyArMTY1NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza19kZXRhY2hfZmlsdGVyKTsKIAotdm9pZCBza19kZWNvZGVfZmlsdGVyKHN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdCwgc3RydWN0IHNvY2tfZmlsdGVyICp0bykKLXsKLQlzdGF0aWMgY29uc3QgdTE2IGRlY29kZXNbXSA9IHsKLQkJW0JQRl9TX0FMVV9BRERfS10JPSBCUEZfQUxVfEJQRl9BRER8QlBGX0ssCi0JCVtCUEZfU19BTFVfQUREX1hdCT0gQlBGX0FMVXxCUEZfQUREfEJQRl9YLAotCQlbQlBGX1NfQUxVX1NVQl9LXQk9IEJQRl9BTFV8QlBGX1NVQnxCUEZfSywKLQkJW0JQRl9TX0FMVV9TVUJfWF0JPSBCUEZfQUxVfEJQRl9TVUJ8QlBGX1gsCi0JCVtCUEZfU19BTFVfTVVMX0tdCT0gQlBGX0FMVXxCUEZfTVVMfEJQRl9LLAotCQlbQlBGX1NfQUxVX01VTF9YXQk9IEJQRl9BTFV8QlBGX01VTHxCUEZfWCwKLQkJW0JQRl9TX0FMVV9ESVZfWF0JPSBCUEZfQUxVfEJQRl9ESVZ8QlBGX1gsCi0JCVtCUEZfU19BTFVfTU9EX0tdCT0gQlBGX0FMVXxCUEZfTU9EfEJQRl9LLAotCQlbQlBGX1NfQUxVX01PRF9YXQk9IEJQRl9BTFV8QlBGX01PRHxCUEZfWCwKLQkJW0JQRl9TX0FMVV9BTkRfS10JPSBCUEZfQUxVfEJQRl9BTkR8QlBGX0ssCi0JCVtCUEZfU19BTFVfQU5EX1hdCT0gQlBGX0FMVXxCUEZfQU5EfEJQRl9YLAotCQlbQlBGX1NfQUxVX09SX0tdCT0gQlBGX0FMVXxCUEZfT1J8QlBGX0ssCi0JCVtCUEZfU19BTFVfT1JfWF0JPSBCUEZfQUxVfEJQRl9PUnxCUEZfWCwKLQkJW0JQRl9TX0FMVV9YT1JfS10JPSBCUEZfQUxVfEJQRl9YT1J8QlBGX0ssCi0JCVtCUEZfU19BTFVfWE9SX1hdCT0gQlBGX0FMVXxCUEZfWE9SfEJQRl9YLAotCQlbQlBGX1NfQUxVX0xTSF9LXQk9IEJQRl9BTFV8QlBGX0xTSHxCUEZfSywKLQkJW0JQRl9TX0FMVV9MU0hfWF0JPSBCUEZfQUxVfEJQRl9MU0h8QlBGX1gsCi0JCVtCUEZfU19BTFVfUlNIX0tdCT0gQlBGX0FMVXxCUEZfUlNIfEJQRl9LLAotCQlbQlBGX1NfQUxVX1JTSF9YXQk9IEJQRl9BTFV8QlBGX1JTSHxCUEZfWCwKLQkJW0JQRl9TX0FMVV9ORUddCQk9IEJQRl9BTFV8QlBGX05FRywKLQkJW0JQRl9TX0xEX1dfQUJTXQk9IEJQRl9MRHxCUEZfV3xCUEZfQUJTLAotCQlbQlBGX1NfTERfSF9BQlNdCT0gQlBGX0xEfEJQRl9IfEJQRl9BQlMsCi0JCVtCUEZfU19MRF9CX0FCU10JPSBCUEZfTER8QlBGX0J8QlBGX0FCUywKLQkJW0JQRl9TX0FOQ19QUk9UT0NPTF0JPSBCUEZfTER8QlBGX0J8QlBGX0FCUywKLQkJW0JQRl9TX0FOQ19QS1RUWVBFXQk9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX0lGSU5ERVhdCT0gQlBGX0xEfEJQRl9CfEJQRl9BQlMsCi0JCVtCUEZfU19BTkNfTkxBVFRSXQk9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX05MQVRUUl9ORVNUXQk9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX01BUktdCT0gQlBGX0xEfEJQRl9CfEJQRl9BQlMsCi0JCVtCUEZfU19BTkNfUVVFVUVdCT0gQlBGX0xEfEJQRl9CfEJQRl9BQlMsCi0JCVtCUEZfU19BTkNfSEFUWVBFXQk9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX1JYSEFTSF0JPSBCUEZfTER8QlBGX0J8QlBGX0FCUywKLQkJW0JQRl9TX0FOQ19DUFVdCQk9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX0FMVV9YT1JfWF0JPSBCUEZfTER8QlBGX0J8QlBGX0FCUywKLQkJW0JQRl9TX0FOQ19WTEFOX1RBR10JPSBCUEZfTER8QlBGX0J8QlBGX0FCUywKLQkJW0JQRl9TX0FOQ19WTEFOX1RBR19QUkVTRU5UXSA9IEJQRl9MRHxCUEZfQnxCUEZfQUJTLAotCQlbQlBGX1NfQU5DX1BBWV9PRkZTRVRdCT0gQlBGX0xEfEJQRl9CfEJQRl9BQlMsCi0JCVtCUEZfU19MRF9XX0xFTl0JPSBCUEZfTER8QlBGX1d8QlBGX0xFTiwKLQkJW0JQRl9TX0xEX1dfSU5EXQk9IEJQRl9MRHxCUEZfV3xCUEZfSU5ELAotCQlbQlBGX1NfTERfSF9JTkRdCT0gQlBGX0xEfEJQRl9IfEJQRl9JTkQsCi0JCVtCUEZfU19MRF9CX0lORF0JPSBCUEZfTER8QlBGX0J8QlBGX0lORCwKLQkJW0JQRl9TX0xEX0lNTV0JCT0gQlBGX0xEfEJQRl9JTU0sCi0JCVtCUEZfU19MRFhfV19MRU5dCT0gQlBGX0xEWHxCUEZfV3xCUEZfTEVOLAotCQlbQlBGX1NfTERYX0JfTVNIXQk9IEJQRl9MRFh8QlBGX0J8QlBGX01TSCwKLQkJW0JQRl9TX0xEWF9JTU1dCQk9IEJQRl9MRFh8QlBGX0lNTSwKLQkJW0JQRl9TX01JU0NfVEFYXQk9IEJQRl9NSVNDfEJQRl9UQVgsCi0JCVtCUEZfU19NSVNDX1RYQV0JPSBCUEZfTUlTQ3xCUEZfVFhBLAotCQlbQlBGX1NfUkVUX0tdCQk9IEJQRl9SRVR8QlBGX0ssCi0JCVtCUEZfU19SRVRfQV0JCT0gQlBGX1JFVHxCUEZfQSwKLQkJW0JQRl9TX0FMVV9ESVZfS10JPSBCUEZfQUxVfEJQRl9ESVZ8QlBGX0ssCi0JCVtCUEZfU19MRF9NRU1dCQk9IEJQRl9MRHxCUEZfTUVNLAotCQlbQlBGX1NfTERYX01FTV0JCT0gQlBGX0xEWHxCUEZfTUVNLAotCQlbQlBGX1NfU1RdCQk9IEJQRl9TVCwKLQkJW0JQRl9TX1NUWF0JCT0gQlBGX1NUWCwKLQkJW0JQRl9TX0pNUF9KQV0JCT0gQlBGX0pNUHxCUEZfSkEsCi0JCVtCUEZfU19KTVBfSkVRX0tdCT0gQlBGX0pNUHxCUEZfSkVRfEJQRl9LLAotCQlbQlBGX1NfSk1QX0pFUV9YXQk9IEJQRl9KTVB8QlBGX0pFUXxCUEZfWCwKLQkJW0JQRl9TX0pNUF9KR0VfS10JPSBCUEZfSk1QfEJQRl9KR0V8QlBGX0ssCi0JCVtCUEZfU19KTVBfSkdFX1hdCT0gQlBGX0pNUHxCUEZfSkdFfEJQRl9YLAotCQlbQlBGX1NfSk1QX0pHVF9LXQk9IEJQRl9KTVB8QlBGX0pHVHxCUEZfSywKLQkJW0JQRl9TX0pNUF9KR1RfWF0JPSBCUEZfSk1QfEJQRl9KR1R8QlBGX1gsCi0JCVtCUEZfU19KTVBfSlNFVF9LXQk9IEJQRl9KTVB8QlBGX0pTRVR8QlBGX0ssCi0JCVtCUEZfU19KTVBfSlNFVF9YXQk9IEJQRl9KTVB8QlBGX0pTRVR8QlBGX1gsCi0JfTsKLQl1MTYgY29kZTsKLQotCWNvZGUgPSBmaWx0LT5jb2RlOwotCi0JdG8tPmNvZGUgPSBkZWNvZGVzW2NvZGVdOwotCXRvLT5qdCA9IGZpbHQtPmp0OwotCXRvLT5qZiA9IGZpbHQtPmpmOwotCXRvLT5rID0gZmlsdC0+azsKLX0KLQogaW50IHNrX2dldF9maWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja19maWx0ZXIgX191c2VyICp1YnVmLAogCQkgIHVuc2lnbmVkIGludCBsZW4pCiB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggN2M4ZmZkOS4uODViNjI2OSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCisrKyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwpAQCAtMjczLDcgKzI3Myw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHM7CiAJc3RydWN0IG5ldCAqbmV0LCAqdG1wOwotCUxJU1RfSEVBRChuZXRfa2lsbF9saXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldF9raWxsX2xpc3Q7CiAJTElTVF9IRUFEKG5ldF9leGl0X2xpc3QpOwogCiAJLyogQXRvbWljYWxseSBzbmFwc2hvdCB0aGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIGNsZWFudXAgKi8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggMDMwNGY5OC4uZmMxN2E5ZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTU3Myw3ICs1NzMsNyBAQAogCQkgICBpc196ZXJvX2V0aGVyX2FkZHIocGt0X2Rldi0+c3JjX21hYykgPwogCQkJICAgICBwa3RfZGV2LT5vZGV2LT5kZXZfYWRkciA6IHBrdF9kZXYtPnNyY19tYWMpOwogCi0Jc2VxX3ByaW50ZihzZXEsICJkc3RfbWFjOiAiKTsKKwlzZXFfcHV0cyhzZXEsICJkc3RfbWFjOiAiKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiVwTVxuIiwgcGt0X2Rldi0+ZHN0X21hYyk7CiAKIAlzZXFfcHJpbnRmKHNlcSwKQEAgLTU4OCw3ICs1ODgsNyBAQAogCiAJaWYgKHBrdF9kZXYtPm5yX2xhYmVscykgewogCQl1bnNpZ25lZCBpbnQgaTsKLQkJc2VxX3ByaW50ZihzZXEsICIgICAgIG1wbHM6ICIpOworCQlzZXFfcHV0cyhzZXEsICIgICAgIG1wbHM6ICIpOwogCQlmb3IgKGkgPSAwOyBpIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBpKyspCiAJCQlzZXFfcHJpbnRmKHNlcSwgIiUwOHglcyIsIG50b2hsKHBrdF9kZXYtPmxhYmVsc1tpXSksCiAJCQkJICAgaSA9PSBwa3RfZGV2LT5ucl9sYWJlbHMtMSA/ICJcbiIgOiAiLCAiKTsKQEAgLTYxMyw2NyArNjEzLDY3IEBACiAJaWYgKHBrdF9kZXYtPm5vZGUgPj0gMCkKIAkJc2VxX3ByaW50ZihzZXEsICIgICAgIG5vZGU6ICVkXG4iLCBwa3RfZGV2LT5ub2RlKTsKIAotCXNlcV9wcmludGYoc2VxLCAiICAgICBGbGFnczogIik7CisJc2VxX3B1dHMoc2VxLCAiICAgICBGbGFnczogIik7CiAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpCi0JCXNlcV9wcmludGYoc2VxLCAiSVBWNiAgIik7CisJCXNlcV9wdXRzKHNlcSwgIklQVjYgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUFNSQ19STkQpCi0JCXNlcV9wcmludGYoc2VxLCAiSVBTUkNfUk5EICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAiSVBTUkNfUk5EICAiKTsKIAogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKQotCQlzZXFfcHJpbnRmKHNlcSwgIklQRFNUX1JORCAgIik7CisJCXNlcV9wdXRzKHNlcSwgIklQRFNUX1JORCAgIik7CiAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpCi0JCXNlcV9wcmludGYoc2VxLCAiVFhTSVpFX1JORCAgIik7CisJCXNlcV9wdXRzKHNlcSwgIlRYU0laRV9STkQgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKQotCQlzZXFfcHJpbnRmKHNlcSwgIlVEUFNSQ19STkQgICIpOworCQlzZXFfcHV0cyhzZXEsICJVRFBTUkNfUk5EICAiKTsKIAogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQRFNUX1JORCkKLQkJc2VxX3ByaW50ZihzZXEsICJVRFBEU1RfUk5EICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAiVURQRFNUX1JORCAgIik7CiAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUENTVU0pCi0JCXNlcV9wcmludGYoc2VxLCAiVURQQ1NVTSAgIik7CisJCXNlcV9wdXRzKHNlcSwgIlVEUENTVU0gICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NUExTX1JORCkKLQkJc2VxX3ByaW50ZihzZXEsICAiTVBMU19STkQgICIpOworCQlzZXFfcHV0cyhzZXEsICAiTVBMU19STkQgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9RVUVVRV9NQVBfUk5EKQotCQlzZXFfcHJpbnRmKHNlcSwgICJRVUVVRV9NQVBfUk5EICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAgIlFVRVVFX01BUF9STkQgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9RVUVVRV9NQVBfQ1BVKQotCQlzZXFfcHJpbnRmKHNlcSwgICJRVUVVRV9NQVBfQ1BVICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAgIlFVRVVFX01BUF9DUFUgICIpOwogCiAJaWYgKHBrdF9kZXYtPmNmbG93cykgewogCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0ZMT1dfU0VRKQotCQkJc2VxX3ByaW50ZihzZXEsICAiRkxPV19TRVEgICIpOyAvKmluIHNlcXVlbmNlIGZsb3dzKi8KKwkJCXNlcV9wdXRzKHNlcSwgICJGTE9XX1NFUSAgIik7IC8qaW4gc2VxdWVuY2UgZmxvd3MqLwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKHNlcSwgICJGTE9XX1JORCAgIik7CisJCQlzZXFfcHV0cyhzZXEsICAiRkxPV19STkQgICIpOwogCX0KIAogI2lmZGVmIENPTkZJR19YRlJNCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUFNFQ19PTikgewotCQlzZXFfcHJpbnRmKHNlcSwgICJJUFNFQyAgIik7CisJCXNlcV9wdXRzKHNlcSwgICJJUFNFQyAgIik7CiAJCWlmIChwa3RfZGV2LT5zcGkpCiAJCQlzZXFfcHJpbnRmKHNlcSwgInNwaToldSIsIHBrdF9kZXYtPnNwaSk7CiAJfQogI2VuZGlmCiAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ1NSQ19STkQpCi0JCXNlcV9wcmludGYoc2VxLCAiTUFDU1JDX1JORCAgIik7CisJCXNlcV9wdXRzKHNlcSwgIk1BQ1NSQ19STkQgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNEU1RfUk5EKQotCQlzZXFfcHJpbnRmKHNlcSwgIk1BQ0RTVF9STkQgICIpOworCQlzZXFfcHV0cyhzZXEsICJNQUNEU1RfUk5EICAiKTsKIAogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfVklEX1JORCkKLQkJc2VxX3ByaW50ZihzZXEsICJWSURfUk5EICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAiVklEX1JORCAgIik7CiAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1NWSURfUk5EKQotCQlzZXFfcHJpbnRmKHNlcSwgIlNWSURfUk5EICAiKTsKKwkJc2VxX3B1dHMoc2VxLCAiU1ZJRF9STkQgICIpOwogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9OT0RFKQotCQlzZXFfcHJpbnRmKHNlcSwgIk5PREVfQUxMT0MgICIpOworCQlzZXFfcHV0cyhzZXEsICJOT0RFX0FMTE9DICAiKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAKQEAgLTcxNiw3ICs3MTYsNyBAQAogCWlmIChwa3RfZGV2LT5yZXN1bHRbMF0pCiAJCXNlcV9wcmludGYoc2VxLCAiUmVzdWx0OiAlc1xuIiwgcGt0X2Rldi0+cmVzdWx0KTsKIAllbHNlCi0JCXNlcV9wcmludGYoc2VxLCAiUmVzdWx0OiBJZGxlXG4iKTsKKwkJc2VxX3B1dHMoc2VxLCAiUmVzdWx0OiBJZGxlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTczNSwxNCArMTczNSwxNCBAQAogCiAJQlVHX09OKCF0KTsKIAotCXNlcV9wcmludGYoc2VxLCAiUnVubmluZzogIik7CisJc2VxX3B1dHMoc2VxLCAiUnVubmluZzogIik7CiAKIAlpZl9sb2NrKHQpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGt0X2RldiwgJnQtPmlmX2xpc3QsIGxpc3QpCiAJCWlmIChwa3RfZGV2LT5ydW5uaW5nKQogCQkJc2VxX3ByaW50ZihzZXEsICIlcyAiLCBwa3RfZGV2LT5vZGV2bmFtZSk7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIlxuU3RvcHBlZDogIik7CisJc2VxX3B1dHMoc2VxLCAiXG5TdG9wcGVkOiAiKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGt0X2RldiwgJnQtPmlmX2xpc3QsIGxpc3QpCiAJCWlmICghcGt0X2Rldi0+cnVubmluZykKQEAgLTE3NTEsNyArMTc1MSw3IEBACiAJaWYgKHQtPnJlc3VsdFswXSkKIAkJc2VxX3ByaW50ZihzZXEsICJcblJlc3VsdDogJXNcbiIsIHQtPnJlc3VsdCk7CiAJZWxzZQotCQlzZXFfcHJpbnRmKHNlcSwgIlxuUmVzdWx0OiBOQVxuIik7CisJCXNlcV9wdXRzKHNlcSwgIlxuUmVzdWx0OiBOQVxuIik7CiAKIAlpZl91bmxvY2sodCk7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3B0cF9jbGFzc2lmaWVyLmMgYi9uZXQvY29yZS9wdHBfY2xhc3NpZmllci5jCmluZGV4IGVhYmEwZjYuLmQzMDI3YTcgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3B0cF9jbGFzc2lmaWVyLmMKKysrIGIvbmV0L2NvcmUvcHRwX2NsYXNzaWZpZXIuYwpAQCAtODgsNyArODgsNyBAQAogCiB2b2lkIF9faW5pdCBwdHBfY2xhc3NpZmllcl9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBwdHBfZmlsdGVyW10gPSB7CisJc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBwdHBfZmlsdGVyW10gX19pbml0ZGF0YSA9IHsKIAkJeyAweDI4LCAgMCwgIDAsIDB4MDAwMDAwMGMgfSwKIAkJeyAweDE1LCAgMCwgMTIsIDB4MDAwMDA4MDAgfSwKIAkJeyAweDMwLCAgMCwgIDAsIDB4MDAwMDAwMTcgfSwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQl7IDB4MTYsICAwLCAgMCwgMHgwMDAwMDAwMCB9LAogCQl7IDB4MDYsICAwLCAgMCwgMHgwMDAwMDAwMCB9LAogCX07Ci0Jc3RydWN0IHNvY2tfZnByb2cgcHRwX3Byb2cgPSB7CisJc3RydWN0IHNvY2tfZnByb2dfa2VybiBwdHBfcHJvZyA9IHsKIAkJLmxlbiA9IEFSUkFZX1NJWkUocHRwX2ZpbHRlciksIC5maWx0ZXIgPSBwdHBfZmlsdGVyLAogCX07CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggMmQ4ZDhmYy4uMTA2Mzk5NiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTc5OCw4ICs3OTgsOCBAQAogCQlzaXplICs9IG51bV92ZnMgKgogCQkJKG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9tYWMpKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW4pKSArCi0JCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUpKSArCi0JCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrKSkpOworCQkJIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoaykpICsKKwkJCSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdmZfcmF0ZSkpKTsKIAkJcmV0dXJuIHNpemU7CiAJfSBlbHNlCiAJCXJldHVybiAwOwpAQCAtMTA2NSw2ICsxMDY1LDcgQEAKIAkJCXN0cnVjdCBpZmxhX3ZmX2luZm8gaXZpOwogCQkJc3RydWN0IGlmbGFfdmZfbWFjIHZmX21hYzsKIAkJCXN0cnVjdCBpZmxhX3ZmX3ZsYW4gdmZfdmxhbjsKKwkJCXN0cnVjdCBpZmxhX3ZmX3JhdGUgdmZfcmF0ZTsKIAkJCXN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUgdmZfdHhfcmF0ZTsKIAkJCXN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrIHZmX3Nwb29mY2hrOwogCQkJc3RydWN0IGlmbGFfdmZfbGlua19zdGF0ZSB2Zl9saW5rc3RhdGU7CkBAIC0xMDg1LDYgKzEwODYsNyBAQAogCQkJCWJyZWFrOwogCQkJdmZfbWFjLnZmID0KIAkJCQl2Zl92bGFuLnZmID0KKwkJCQl2Zl9yYXRlLnZmID0KIAkJCQl2Zl90eF9yYXRlLnZmID0KIAkJCQl2Zl9zcG9vZmNoay52ZiA9CiAJCQkJdmZfbGlua3N0YXRlLnZmID0gaXZpLnZmOwpAQCAtMTA5Miw3ICsxMDk0LDkgQEAKIAkJCW1lbWNweSh2Zl9tYWMubWFjLCBpdmkubWFjLCBzaXplb2YoaXZpLm1hYykpOwogCQkJdmZfdmxhbi52bGFuID0gaXZpLnZsYW47CiAJCQl2Zl92bGFuLnFvcyA9IGl2aS5xb3M7Ci0JCQl2Zl90eF9yYXRlLnJhdGUgPSBpdmkudHhfcmF0ZTsKKwkJCXZmX3R4X3JhdGUucmF0ZSA9IGl2aS5tYXhfdHhfcmF0ZTsKKwkJCXZmX3JhdGUubWluX3R4X3JhdGUgPSBpdmkubWluX3R4X3JhdGU7CisJCQl2Zl9yYXRlLm1heF90eF9yYXRlID0gaXZpLm1heF90eF9yYXRlOwogCQkJdmZfc3Bvb2ZjaGsuc2V0dGluZyA9IGl2aS5zcG9vZmNoazsKIAkJCXZmX2xpbmtzdGF0ZS5saW5rX3N0YXRlID0gaXZpLmxpbmtzdGF0ZTsKIAkJCXZmID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJRkxBX1ZGX0lORk8pOwpAQCAtMTEwMiw2ICsxMTA2LDggQEAKIAkJCX0KIAkJCWlmIChubGFfcHV0KHNrYiwgSUZMQV9WRl9NQUMsIHNpemVvZih2Zl9tYWMpLCAmdmZfbWFjKSB8fAogCQkJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1ZMQU4sIHNpemVvZih2Zl92bGFuKSwgJnZmX3ZsYW4pIHx8CisJCQkgICAgbmxhX3B1dChza2IsIElGTEFfVkZfUkFURSwgc2l6ZW9mKHZmX3JhdGUpLAorCQkJCSAgICAmdmZfcmF0ZSkgfHwKIAkJCSAgICBubGFfcHV0KHNrYiwgSUZMQV9WRl9UWF9SQVRFLCBzaXplb2YodmZfdHhfcmF0ZSksCiAJCQkJICAgICZ2Zl90eF9yYXRlKSB8fAogCQkJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1NQT09GQ0hLLCBzaXplb2YodmZfc3Bvb2ZjaGspLApAQCAtMTIwOCw2ICsxMjE0LDEwIEBACiAJCQkJICAgIC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSkgfSwKIAlbSUZMQV9WRl9TUE9PRkNIS10JPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKIAkJCQkgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoaykgfSwKKwlbSUZMQV9WRl9SQVRFXQkJPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9yYXRlKSB9LAorCVtJRkxBX1ZGX0xJTktfU1RBVEVdCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJICAgIC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfbGlua19zdGF0ZSkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX3BvcnRfcG9saWN5W0lGTEFfUE9SVF9NQVgrMV0gPSB7CkBAIC0xMjM0LDYgKzEyNDQsNyBAQAogCXN0cnVjdCBubGF0dHIgKnRiW0lGTEFfTUFYKzFdOwogCXUzMiBleHRfZmlsdGVyX21hc2sgPSAwOwogCWludCBlcnI7CisJaW50IGhkcmxlbjsKIAogCXNfaCA9IGNiLT5hcmdzWzBdOwogCXNfaWR4ID0gY2ItPmFyZ3NbMV07CkBAIC0xMjQxLDggKzEyNTIsMTcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJY2ItPnNlcSA9IG5ldC0+ZGV2X2Jhc2Vfc2VxOwogCi0JaWYgKG5sbXNnX3BhcnNlKGNiLT5ubGgsIHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSwgdGIsIElGTEFfTUFYLAotCQkJaWZsYV9wb2xpY3kpID49IDApIHsKKwkvKiBBIGhhY2sgdG8gcHJlc2VydmUga2VybmVsPC0+dXNlcnNwYWNlIGludGVyZmFjZS4KKwkgKiBUaGUgY29ycmVjdCBoZWFkZXIgaXMgaWZpbmZvbXNnLiBJdCBpcyBjb25zaXN0ZW50IHdpdGggcnRubF9nZXRsaW5rLgorCSAqIEhvd2V2ZXIsIGJlZm9yZSBMaW51eCB2My45IHRoZSBjb2RlIGhlcmUgYXNzdW1lZCBydGdlbm1zZyBhbmQgdGhhdCdzCisJICogd2hhdCBpcHJvdXRlMiA8IHYzLjkuMCB1c2VkLgorCSAqIFdlIGNhbiBkZXRlY3QgdGhlIG9sZCBpcHJvdXRlMi4gRXZlbiBpbmNsdWRpbmcgdGhlIElGTEFfRVhUX01BU0sKKwkgKiBhdHRyaWJ1dGUsIGl0cyBuZXRsaW5rIG1lc3NhZ2UgaXMgc2hvcnRlciB0aGFuIHN0cnVjdCBpZmluZm9tc2cuCisJICovCisJaGRybGVuID0gbmxtc2dfbGVuKGNiLT5ubGgpIDwgc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpID8KKwkJIHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpIDogc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpOworCisJaWYgKG5sbXNnX3BhcnNlKGNiLT5ubGgsIGhkcmxlbiwgdGIsIElGTEFfTUFYLCBpZmxhX3BvbGljeSkgPj0gMCkgewogCiAJCWlmICh0YltJRkxBX0VYVF9NQVNLXSkKIAkJCWV4dF9maWx0ZXJfbWFzayA9IG5sYV9nZXRfdTMyKHRiW0lGTEFfRVhUX01BU0tdKTsKQEAgLTEzNjcsMTEgKzEzODcsMjkgQEAKIAkJfQogCQljYXNlIElGTEFfVkZfVFhfUkFURTogewogCQkJc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSAqaXZ0OworCQkJc3RydWN0IGlmbGFfdmZfaW5mbyBpdmY7CiAJCQlpdnQgPSBubGFfZGF0YSh2Zik7CiAJCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJCWlmIChvcHMtPm5kb19zZXRfdmZfdHhfcmF0ZSkKLQkJCQllcnIgPSBvcHMtPm5kb19zZXRfdmZfdHhfcmF0ZShkZXYsIGl2dC0+dmYsCi0JCQkJCQkJICAgICAgaXZ0LT5yYXRlKTsKKwkJCWlmIChvcHMtPm5kb19nZXRfdmZfY29uZmlnKQorCQkJCWVyciA9IG9wcy0+bmRvX2dldF92Zl9jb25maWcoZGV2LCBpdnQtPnZmLAorCQkJCQkJCSAgICAgJml2Zik7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlpZiAob3BzLT5uZG9fc2V0X3ZmX3JhdGUpCisJCQkJZXJyID0gb3BzLT5uZG9fc2V0X3ZmX3JhdGUoZGV2LCBpdnQtPnZmLAorCQkJCQkJCSAgIGl2Zi5taW5fdHhfcmF0ZSwKKwkJCQkJCQkgICBpdnQtPnJhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJRkxBX1ZGX1JBVEU6IHsKKwkJCXN0cnVjdCBpZmxhX3ZmX3JhdGUgKml2dDsKKwkJCWl2dCA9IG5sYV9kYXRhKHZmKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJaWYgKG9wcy0+bmRvX3NldF92Zl9yYXRlKQorCQkJCWVyciA9IG9wcy0+bmRvX3NldF92Zl9yYXRlKGRldiwgaXZ0LT52ZiwKKwkJCQkJCQkgICBpdnQtPm1pbl90eF9yYXRlLAorCQkJCQkJCSAgIGl2dC0+bWF4X3R4X3JhdGUpOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBJRkxBX1ZGX1NQT09GQ0hLOiB7CkBAIC0xNzQ0LDcgKzE3ODIsNiBAQAogCiAJb3BzLT5kZWxsaW5rKGRldiwgJmxpc3Rfa2lsbCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmbGlzdF9raWxsKTsKLQlsaXN0X2RlbCgmbGlzdF9raWxsKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjAxOSwxMSArMjA1NiwxNSBAQAogCQlpZiAob3BzLT5uZXdsaW5rKSB7CiAJCQllcnIgPSBvcHMtPm5ld2xpbmsobmV0LCBkZXYsIHRiLCBkYXRhKTsKIAkJCS8qIERyaXZlcnMgc2hvdWxkIGNhbGwgZnJlZV9uZXRkZXYoKSBpbiAtPmRlc3RydWN0b3IKLQkJCSAqIGFuZCB1bnJlZ2lzdGVyIGl0IG9uIGZhaWx1cmUgc28gdGhhdCBkZXZpY2UgY291bGQgYmUKLQkJCSAqIGZpbmFsbHkgZnJlZWQgaW4gcnRubF91bmxvY2suCisJCQkgKiBhbmQgdW5yZWdpc3RlciBpdCBvbiBmYWlsdXJlIGFmdGVyIHJlZ2lzdHJhdGlvbgorCQkJICogc28gdGhhdCBkZXZpY2UgY291bGQgYmUgZmluYWxseSBmcmVlZCBpbiBydG5sX3VubG9jay4KIAkJCSAqLwotCQkJaWYgKGVyciA8IDApCisJCQlpZiAoZXJyIDwgMCkgeworCQkJCS8qIElmIGRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCBhdCBhbGwsIGZyZWUgaXQgbm93ICovCisJCQkJaWYgKGRldi0+cmVnX3N0YXRlID09IE5FVFJFR19VTklOSVRJQUxJWkVEKQorCQkJCQlmcmVlX25ldGRldihkZXYpOwogCQkJCWdvdG8gb3V0OworCQkJfQogCQl9IGVsc2UgewogCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CiAJCQlpZiAoZXJyIDwgMCkgewpAQCAtMjA5NSw5ICsyMTM2LDEzIEBACiAJc3RydWN0IG5sYXR0ciAqdGJbSUZMQV9NQVgrMV07CiAJdTMyIGV4dF9maWx0ZXJfbWFzayA9IDA7CiAJdTE2IG1pbl9pZmluZm9fZHVtcF9zaXplID0gMDsKKwlpbnQgaGRybGVuOwogCi0JaWYgKG5sbXNnX3BhcnNlKG5saCwgc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpLCB0YiwgSUZMQV9NQVgsCi0JCQlpZmxhX3BvbGljeSkgPj0gMCkgeworCS8qIFNhbWUga2VybmVsPC0+dXNlcnNwYWNlIGludGVyZmFjZSBoYWNrIGFzIGluIHJ0bmxfZHVtcF9pZmluZm8uICovCisJaGRybGVuID0gbmxtc2dfbGVuKG5saCkgPCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykgPworCQkgc2l6ZW9mKHN0cnVjdCBydGdlbm1zZykgOiBzaXplb2Yoc3RydWN0IGlmaW5mb21zZyk7CisKKwlpZiAobmxtc2dfcGFyc2UobmxoLCBoZHJsZW4sIHRiLCBJRkxBX01BWCwgaWZsYV9wb2xpY3kpID49IDApIHsKIAkJaWYgKHRiW0lGTEFfRVhUX01BU0tdKQogCQkJZXh0X2ZpbHRlcl9tYXNrID0gbmxhX2dldF91MzIodGJbSUZMQV9FWFRfTUFTS10pOwogCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NlY3VyZV9zZXEuYyBiL25ldC9jb3JlL3NlY3VyZV9zZXEuYwppbmRleCA4OTdkYTU2Li5iYTcxMjEyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zZWN1cmVfc2VxLmMKKysrIGIvbmV0L2NvcmUvc2VjdXJlX3NlcS5jCkBAIC04NSwzMSArODUsNiBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSU5FVAotX191MzIgc2VjdXJlX2lwX2lkKF9fYmUzMiBkYWRkcikKLXsKLQl1MzIgaGFzaFtNRDVfRElHRVNUX1dPUkRTXTsKLQotCW5ldF9zZWNyZXRfaW5pdCgpOwotCWhhc2hbMF0gPSAoX19mb3JjZSBfX3UzMikgZGFkZHI7Ci0JaGFzaFsxXSA9IG5ldF9zZWNyZXRbMTNdOwotCWhhc2hbMl0gPSBuZXRfc2VjcmV0WzE0XTsKLQloYXNoWzNdID0gbmV0X3NlY3JldFsxNV07Ci0KLQltZDVfdHJhbnNmb3JtKGhhc2gsIG5ldF9zZWNyZXQpOwotCi0JcmV0dXJuIGhhc2hbMF07Ci19Ci0KLV9fdTMyIHNlY3VyZV9pcHY2X2lkKGNvbnN0IF9fYmUzMiBkYWRkcls0XSkKLXsKLQlfX3UzMiBoYXNoWzRdOwotCi0JbmV0X3NlY3JldF9pbml0KCk7Ci0JbWVtY3B5KGhhc2gsIGRhZGRyLCAxNik7Ci0JbWQ1X3RyYW5zZm9ybShoYXNoLCBuZXRfc2VjcmV0KTsKLQotCXJldHVybiBoYXNoWzBdOwotfQogCiBfX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpCmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDgzODNiMmIuLmJmOTI4MjQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC02OTQsNyArNjk0LDcgQEAKICNlbmRpZgogCW1lbWNweShuZXctPmNiLCBvbGQtPmNiLCBzaXplb2Yob2xkLT5jYikpOwogCW5ldy0+Y3N1bQkJPSBvbGQtPmNzdW07Ci0JbmV3LT5sb2NhbF9kZgkJPSBvbGQtPmxvY2FsX2RmOworCW5ldy0+aWdub3JlX2RmCQk9IG9sZC0+aWdub3JlX2RmOwogCW5ldy0+cGt0X3R5cGUJCT0gb2xkLT5wa3RfdHlwZTsKIAluZXctPmlwX3N1bW1lZAkJPSBvbGQtPmlwX3N1bW1lZDsKIAlza2JfY29weV9xdWV1ZV9tYXBwaW5nKG5ldywgb2xkKTsKQEAgLTk1MSwxMCArOTUxLDEzIEBACiBFWFBPUlRfU1lNQk9MKHNrYl9jb3B5KTsKIAogLyoqCi0gKglfX3Bza2JfY29weQktCWNyZWF0ZSBjb3B5IG9mIGFuIHNrX2J1ZmYgd2l0aCBwcml2YXRlIGhlYWQuCisgKglfX3Bza2JfY29weV9mY2xvbmUJLSAgY3JlYXRlIGNvcHkgb2YgYW4gc2tfYnVmZiB3aXRoIHByaXZhdGUgaGVhZC4KICAqCUBza2I6IGJ1ZmZlciB0byBjb3B5CiAgKglAaGVhZHJvb206IGhlYWRyb29tIG9mIG5ldyBza2IKICAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBwcmlvcml0eQorICoJQGZjbG9uZTogaWYgdHJ1ZSBhbGxvY2F0ZSB0aGUgY29weSBvZiB0aGUgc2tiIGZyb20gdGhlIGZjbG9uZQorICoJY2FjaGUgaW5zdGVhZCBvZiB0aGUgaGVhZCBjYWNoZTsgaXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMKKyAqCXRvIHRydWUgZm9yIHRoZSBjYXNlcyB3aGVyZSB0aGUgY29weSB3aWxsIGxpa2VseSBiZSBjbG9uZWQKICAqCiAgKglNYWtlIGEgY29weSBvZiBib3RoIGFuICZza19idWZmIGFuZCBwYXJ0IG9mIGl0cyBkYXRhLCBsb2NhdGVkCiAgKglpbiBoZWFkZXIuIEZyYWdtZW50ZWQgZGF0YSByZW1haW4gc2hhcmVkLiBUaGlzIGlzIHVzZWQgd2hlbgpAQCAtOTY0LDExICs5NjcsMTIgQEAKICAqCVRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKl9fcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZWFkcm9vbSwgZ2ZwX3QgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqX19wc2tiX2NvcHlfZmNsb25lKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZWFkcm9vbSwKKwkJCQkgICBnZnBfdCBnZnBfbWFzaywgYm9vbCBmY2xvbmUpCiB7CiAJdW5zaWduZWQgaW50IHNpemUgPSBza2JfaGVhZGxlbihza2IpICsgaGVhZHJvb207Ci0Jc3RydWN0IHNrX2J1ZmYgKm4gPSBfX2FsbG9jX3NrYihzaXplLCBnZnBfbWFzaywKLQkJCQkJc2tiX2FsbG9jX3J4X2ZsYWcoc2tiKSwgTlVNQV9OT19OT0RFKTsKKwlpbnQgZmxhZ3MgPSBza2JfYWxsb2NfcnhfZmxhZyhza2IpIHwgKGZjbG9uZSA/IFNLQl9BTExPQ19GQ0xPTkUgOiAwKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IF9fYWxsb2Nfc2tiKHNpemUsIGdmcF9tYXNrLCBmbGFncywgTlVNQV9OT19OT0RFKTsKIAogCWlmICghbikKIAkJZ290byBvdXQ7CkBAIC0xMDA4LDcgKzEwMTIsNyBAQAogb3V0OgogCXJldHVybiBuOwogfQotRVhQT1JUX1NZTUJPTChfX3Bza2JfY29weSk7CitFWFBPUlRfU1lNQk9MKF9fcHNrYl9jb3B5X2ZjbG9uZSk7CiAKIC8qKgogICoJcHNrYl9leHBhbmRfaGVhZCAtIHJlYWxsb2NhdGUgaGVhZGVyIG9mICZza19idWZmCkBAIC0yODgxLDEyICsyODg1LDE0IEBACiAJaW50IHBvczsKIAlpbnQgZHVtbXk7CiAKKwlfX3NrYl9wdXNoKGhlYWRfc2tiLCBkb2Zmc2V0KTsKIAlwcm90byA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKGhlYWRfc2tiLCAmZHVtbXkpOwogCWlmICh1bmxpa2VseSghcHJvdG8pKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWNzdW0gPSAhIWNhbl9jaGVja3N1bV9wcm90b2NvbChmZWF0dXJlcywgcHJvdG8pOwotCV9fc2tiX3B1c2goaGVhZF9za2IsIGRvZmZzZXQpOworCWNzdW0gPSAhaGVhZF9za2ItPmVuY2FwX2hkcl9jc3VtICYmCisJICAgICEhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBwcm90byk7CisKIAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShoZWFkX3NrYik7CiAJcG9zID0gc2tiX2hlYWRsZW4oaGVhZF9za2IpOwogCkBAIC0yOTgzLDYgKzI5ODksOCBAQAogCQkJbnNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoaGVhZF9za2IsIG9mZnNldCwKIAkJCQkJCQkgICAgc2tiX3B1dChuc2tiLCBsZW4pLAogCQkJCQkJCSAgICBsZW4sIDApOworCQkJU0tCX0dTT19DQihuc2tiKS0+Y3N1bV9zdGFydCA9CisJCQkgICAgc2tiX2hlYWRyb29tKG5za2IpICsgb2Zmc2V0OwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMzA1Miw2ICszMDYwLDggQEAKIAkJCW5za2ItPmNzdW0gPSBza2JfY2hlY2tzdW0obnNrYiwgZG9mZnNldCwKIAkJCQkJCSAgbnNrYi0+bGVuIC0gZG9mZnNldCwgMCk7CiAJCQluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJU0tCX0dTT19DQihuc2tiKS0+Y3N1bV9zdGFydCA9CisJCQkgICAgc2tiX2hlYWRyb29tKG5za2IpICsgZG9mZnNldDsKIAkJfQogCX0gd2hpbGUgKChvZmZzZXQgKz0gbGVuKSA8IGhlYWRfc2tiLT5sZW4pOwogCkBAIC0zOTEzLDcgKzM5MjMsNyBAQAogCXNrYi0+dHN0YW1wLnR2NjQgPSAwOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAlza2ItPnNrYl9paWYgPSAwOwotCXNrYi0+bG9jYWxfZGYgPSAwOworCXNrYi0+aWdub3JlX2RmID0gMDsKIAlza2JfZHN0X2Ryb3Aoc2tiKTsKIAlza2ItPm1hcmsgPSAwOwogCXNlY3BhdGhfcmVzZXQoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCA2NjRlZTQyLi4wMjZlMDFmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC03ODQsNyArNzg0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNPX05PX0NIRUNLOgotCQlzay0+c2tfbm9fY2hlY2sgPSB2YWxib29sOworCQlzay0+c2tfbm9fY2hlY2tfdHggPSB2YWxib29sOwogCQlicmVhazsKIAogCWNhc2UgU09fUFJJT1JJVFk6CkBAIC0xMDY0LDcgKzEwNjQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU09fTk9fQ0hFQ0s6Ci0JCXYudmFsID0gc2stPnNrX25vX2NoZWNrOworCQl2LnZhbCA9IHNrLT5za19ub19jaGVja190eDsKIAkJYnJlYWs7CiAKIAljYXNlIFNPX1BSSU9SSVRZOgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdHNvLmMgYi9uZXQvY29yZS90c28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzMyMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvdHNvLmMKQEAgLTAsMCArMSw3NyBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90c28uaD4KKworLyogQ2FsY3VsYXRlIGV4cGVjdGVkIG51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAqLworaW50IHRzb19jb3VudF9kZXNjcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFRoZSBNYXJ2ZWxsIFdheSAqLworCXJldHVybiBza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzICogMiArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Cit9CitFWFBPUlRfU1lNQk9MKHRzb19jb3VudF9kZXNjcyk7CisKK3ZvaWQgdHNvX2J1aWxkX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpoZHIsIHN0cnVjdCB0c29fdCAqdHNvLAorCQkgICBpbnQgc2l6ZSwgYm9vbCBpc19sYXN0KQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJaW50IGhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOworCWludCBtYWNfaGRyX2xlbiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCisJbWVtY3B5KGhkciwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlpcGggPSAoc3RydWN0IGlwaGRyICopKGhkciArIG1hY19oZHJfbGVuKTsKKwlpcGgtPmlkID0gaHRvbnModHNvLT5pcF9pZCk7CisJaXBoLT50b3RfbGVuID0gaHRvbnMoc2l6ZSArIGhkcl9sZW4gLSBtYWNfaGRyX2xlbik7CisJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKGhkciArIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpOworCXRjcGgtPnNlcSA9IGh0b25sKHRzby0+dGNwX3NlcSk7CisJdHNvLT5pcF9pZCsrOworCisJaWYgKCFpc19sYXN0KSB7CisJCS8qIENsZWFyIGFsbCBzcGVjaWFsIGZsYWdzIGZvciBub3QgbGFzdCBwYWNrZXQgKi8KKwkJdGNwaC0+cHNoID0gMDsKKwkJdGNwaC0+ZmluID0gMDsKKwkJdGNwaC0+cnN0ID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRzb19idWlsZF9oZHIpOworCit2b2lkIHRzb19idWlsZF9kYXRhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0c29fdCAqdHNvLCBpbnQgc2l6ZSkKK3sKKwl0c28tPnRjcF9zZXEgKz0gc2l6ZTsKKwl0c28tPnNpemUgLT0gc2l6ZTsKKwl0c28tPmRhdGEgKz0gc2l6ZTsKKworCWlmICgodHNvLT5zaXplID09IDApICYmCisJICAgICh0c28tPm5leHRfZnJhZ19pZHggPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSkgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbdHNvLT5uZXh0X2ZyYWdfaWR4XTsKKworCQkvKiBNb3ZlIHRvIG5leHQgc2VnbWVudCAqLworCQl0c28tPnNpemUgPSBmcmFnLT5zaXplOworCQl0c28tPmRhdGEgPSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZS5wKSArIGZyYWctPnBhZ2Vfb2Zmc2V0OworCQl0c28tPm5leHRfZnJhZ19pZHgrKzsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRzb19idWlsZF9kYXRhKTsKKwordm9pZCB0c29fc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRzb190ICp0c28pCit7CisJaW50IGhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOworCisJdHNvLT5pcF9pZCA9IG50b2hzKGlwX2hkcihza2IpLT5pZCk7CisJdHNvLT50Y3Bfc2VxID0gbnRvaGwodGNwX2hkcihza2IpLT5zZXEpOworCXRzby0+bmV4dF9mcmFnX2lkeCA9IDA7CisKKwkvKiBCdWlsZCBmaXJzdCBkYXRhICovCisJdHNvLT5zaXplID0gc2tiX2hlYWRsZW4oc2tiKSAtIGhkcl9sZW47CisJdHNvLT5kYXRhID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlpZiAoKHRzby0+c2l6ZSA9PSAwKSAmJgorCSAgICAodHNvLT5uZXh0X2ZyYWdfaWR4IDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykpIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW3Rzby0+bmV4dF9mcmFnX2lkeF07CisKKwkJLyogTW92ZSB0byBuZXh0IHNlZ21lbnQgKi8KKwkJdHNvLT5zaXplID0gZnJhZy0+c2l6ZTsKKwkJdHNvLT5kYXRhID0gcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UucCkgKyBmcmFnLT5wYWdlX29mZnNldDsKKwkJdHNvLT5uZXh0X2ZyYWdfaWR4Kys7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0c29fc3RhcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IDIyYjVkODEuLjZjYTY0NWMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTEwMjQsNyArMTAyNCw2IEBACiAJLnByb3RvY29sCT0gSVBQUk9UT19EQ0NQLAogCS5wcm90CQk9ICZkY2NwX3Y0X3Byb3QsCiAJLm9wcwkJPSAmaW5ldF9kY2NwX29wcywKLQkubm9fY2hlY2sJPSAwLAogCS5mbGFncwkJPSBJTkVUX1BST1RPU1dfSUNTSywKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IGViODkyYjQuLmRlMmMxZTcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtMTA4NCwxNCArMTA4NCwxNSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBkY2NwX21pYl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopZGNjcF9zdGF0aXN0aWNzLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGRjY3BfbWliKSwKLQkJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGRjY3BfbWliKSk7CisJZGNjcF9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBkY2NwX21pYik7CisJaWYgKCFkY2NwX3N0YXRpc3RpY3MpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9taWJfZXhpdCh2b2lkKQogewotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopZGNjcF9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShkY2NwX3N0YXRpc3RpY3MpOwogfQogCiBzdGF0aWMgaW50IHRoYXNoX2VudHJpZXM7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9zeXNjdGwuYyBiL25ldC9kY2NwL3N5c2N0bC5jCmluZGV4IDYwN2FiNzEuLjUzNzMxZTQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3N5c2N0bC5jCisrKyBiL25ldC9kY2NwL3N5c2N0bC5jCkBAIC0yMCw2ICsyMCw3IEBACiAKIC8qIEJvdW5kYXJ5IHZhbHVlcyAqLwogc3RhdGljIGludAkJemVybyAgICAgPSAwLAorCQkJb25lICAgICAgPSAxLAogCQkJdThfbWF4ICAgPSAweEZGOwogc3RhdGljIHVuc2lnbmVkIGxvbmcJc2Vxd19taW4gPSBEQ0NQRl9TRVFfV01JTiwKIAkJCXNlcXdfbWF4ID0gMHhGRkZGRkZGRjsJCS8qIG1heGltdW0gb24gMzIgYml0ICovCkBAIC01OCw3ICs1OSw3IEBACiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllcyksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKLQkJLmV4dHJhMQkJPSAmemVybywKKwkJLmV4dHJhMQkJPSAmb25lLAogCQkuZXh0cmEyCQk9ICZ1OF9tYXgsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC90aW1lci5jIGIvbmV0L2RjY3AvdGltZXIuYwppbmRleCAxNmYwYjIyLi4xY2Q0NmEzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC90aW1lci5jCisrKyBiL25ldC9kY2NwL3RpbWVyLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogICovCiB1MzIgZGNjcF90aW1lc3RhbXAodm9pZCkKIHsKLQlzNjQgZGVsdGEgPSBrdGltZV91c19kZWx0YShrdGltZV9nZXRfcmVhbCgpLCBkY2NwX3RpbWVzdGFtcF9zZWVkKTsKKwl1NjQgZGVsdGEgPSAodTY0KWt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldF9yZWFsKCksIGRjY3BfdGltZXN0YW1wX3NlZWQpOwogCiAJZG9fZGl2KGRlbHRhLCAxMCk7CiAJcmV0dXJuIGRlbHRhOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKaW5kZXggNGMwNDg0OC4uYWUwMTFiNCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC00ODEsNyArNDgxLDcgQEAKIAogCXNrLT5za19iYWNrbG9nX3JjdiA9IGRuX25zcF9iYWNrbG9nX3JjdjsKIAlzay0+c2tfZGVzdHJ1Y3QgICAgPSBkbl9kZXN0cnVjdDsKLQlzay0+c2tfbm9fY2hlY2sgICAgPSAxOworCXNrLT5za19ub19jaGVja190eCA9IDE7CiAJc2stPnNrX2ZhbWlseSAgICAgID0gUEZfREVDbmV0OwogCXNrLT5za19wcm90b2NvbCAgICA9IDA7CiAJc2stPnNrX2FsbG9jYXRpb24gID0gZ2ZwOwpkaWZmIC0tZ2l0IGEvbmV0L2Ruc19yZXNvbHZlci9kbnNfcXVlcnkuYyBiL25ldC9kbnNfcmVzb2x2ZXIvZG5zX3F1ZXJ5LmMKaW5kZXggZTdiNmQ1My4uOWFjZWM2MWYgMTAwNjQ0Ci0tLSBhL25ldC9kbnNfcmVzb2x2ZXIvZG5zX3F1ZXJ5LmMKKysrIGIvbmV0L2Ruc19yZXNvbHZlci9kbnNfcXVlcnkuYwpAQCAtOTMsOCArOTMsOCBAQAogCX0KIAogCWlmICghbmFtZWxlbikKLQkJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKLQlpZiAobmFtZWxlbiA8IDMpCisJCW5hbWVsZW4gPSBzdHJubGVuKG5hbWUsIDI1Nik7CisJaWYgKG5hbWVsZW4gPCAzIHx8IG5hbWVsZW4gPiAyNTUpCiAJCXJldHVybiAtRUlOVkFMOwogCWRlc2NsZW4gKz0gbmFtZWxlbiArIDE7CiAKQEAgLTE0OSw3ICsxNDksOSBAQAogCWlmICghKl9yZXN1bHQpCiAJCWdvdG8gcHV0OwogCi0JbWVtY3B5KCpfcmVzdWx0LCB1cGF5bG9hZC0+ZGF0YSwgbGVuICsgMSk7CisJbWVtY3B5KCpfcmVzdWx0LCB1cGF5bG9hZC0+ZGF0YSwgbGVuKTsKKwkqX3Jlc3VsdFtsZW5dID0gJ1wwJzsKKwogCWlmIChfZXhwaXJ5KQogCQkqX2V4cGlyeSA9IHJrZXktPmV4cGlyeTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IDAyYzBlMTcuLjY0YzVhZjAgMTAwNjQ0Ci0tLSBhL25ldC9kc2Evc2xhdmUuYworKysgYi9uZXQvZHNhL3NsYXZlLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCQlyZXR1cm4gc2xhdmVfZGV2OwogCiAJc2xhdmVfZGV2LT5mZWF0dXJlcyA9IG1hc3Rlci0+dmxhbl9mZWF0dXJlczsKLQlTRVRfRVRIVE9PTF9PUFMoc2xhdmVfZGV2LCAmZHNhX3NsYXZlX2V0aHRvb2xfb3BzKTsKKwlzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzID0gJmRzYV9zbGF2ZV9ldGh0b29sX29wczsKIAlldGhfaHdfYWRkcl9pbmhlcml0KHNsYXZlX2RldiwgbWFzdGVyKTsKIAlzbGF2ZV9kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0LzZsb3dwYW5fcnRubC5jIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9ydG5sLmMKaW5kZXggMGY1YTY5ZS4uZmU2YmQ3YSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9ydG5sLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbl9ydG5sLmMKQEAgLTkyLDYgKzkyLDcgQEAKIAljb25zdCB1OCAqc2FkZHIgPSBfc2FkZHI7CiAJY29uc3QgdTggKmRhZGRyID0gX2RhZGRyOwogCXN0cnVjdCBpZWVlODAyMTU0X2FkZHIgc2EsIGRhOworCXN0cnVjdCBpZWVlODAyMTU0X21hY19jYiAqY2IgPSBtYWNfY2JfaW5pdChza2IpOwogCiAJLyogVE9ETzoKIAkgKiBpZiB0aGlzIHBhY2thZ2UgaXNuJ3QgaXB2NiBvbmUsIHdoZXJlIHNob3VsZCBpdCBiZSByb3V0ZWQ/CkBAIC0xMTUsOCArMTE2LDcgQEAKIAkgKiBmcm9tIE1BQyBzdWJpZiBvZiB0aGUgJ2RldicgYW5kICdyZWFsX2RldicgbmV0d29yayBkZXZpY2VzLCBidXQKIAkgKiB0aGlzIGlzbid0IGltcGxlbWVudGVkIGluIG1haW5saW5lIHlldCwgc28gY3VycmVudGx5IHdlIGFzc2lnbiAweGZmCiAJICovCi0JbWFjX2NiKHNrYiktPmZsYWdzID0gSUVFRTgwMjE1NF9GQ19UWVBFX0RBVEE7Ci0JbWFjX2NiKHNrYiktPnNlcSA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KS0+Z2V0X2RzbihkZXYpOworCWNiLT50eXBlID0gSUVFRTgwMjE1NF9GQ19UWVBFX0RBVEE7CiAKIAkvKiBwcmVwYXJlIHdwYW4gYWRkcmVzcyBkYXRhICovCiAJc2EubW9kZSA9IElFRUU4MDIxNTRfQUREUl9MT05HOwpAQCAtMTM1LDExICsxMzUsMTAgQEAKIAl9IGVsc2UgewogCQlkYS5tb2RlID0gSUVFRTgwMjE1NF9BRERSX0xPTkc7CiAJCWRhLmV4dGVuZGVkX2FkZHIgPSBpZWVlODAyMTU0X2RldmFkZHJfZnJvbV9yYXcoZGFkZHIpOwotCi0JCS8qIHJlcXVlc3QgYWNrbm93bGVkZ21lbnQgKi8KLQkJbWFjX2NiKHNrYiktPmZsYWdzIHw9IE1BQ19DQl9GTEFHX0FDS1JFUTsKIAl9CiAKKwljYi0+YWNrcmVxID0gIWxvd3Bhbl9pc19hZGRyX2Jyb2FkY2FzdChkYWRkcik7CisKIAlyZXR1cm4gZGV2X2hhcmRfaGVhZGVyKHNrYiwgbG93cGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2LAogCQkJdHlwZSwgKHZvaWQgKikmZGEsICh2b2lkICopJnNhLCAwKTsKIH0KQEAgLTIyMSwxMzkgKzIyMCwxNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBza19idWZmKgorbG93cGFuX2FsbG9jX2ZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNpemUsCisJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfaGRyICptYXN0ZXJfaGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IGxvd3Bhbl9kZXZfaW5mbyhza2ItPmRldiktPnJlYWxfZGV2OworCXN0cnVjdCBza19idWZmICpmcmFnOworCWludCByYzsKKworCWZyYWcgPSBhbGxvY19za2IocmVhbF9kZXYtPmhhcmRfaGVhZGVyX2xlbiArCisJCQkgcmVhbF9kZXYtPm5lZWRlZF90YWlscm9vbSArIHNpemUsCisJCQkgR0ZQX0FUT01JQyk7CisKKwlpZiAobGlrZWx5KGZyYWcpKSB7CisJCWZyYWctPmRldiA9IHJlYWxfZGV2OworCQlmcmFnLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7CisJCXNrYl9yZXNlcnZlKGZyYWcsIHJlYWxfZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoZnJhZyk7CisJCSptYWNfY2IoZnJhZykgPSAqbWFjX2NiKHNrYik7CisKKwkJcmMgPSBkZXZfaGFyZF9oZWFkZXIoZnJhZywgcmVhbF9kZXYsIDAsICZtYXN0ZXJfaGRyLT5kZXN0LAorCQkJCSAgICAgJm1hc3Rlcl9oZHItPnNvdXJjZSwgc2l6ZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWtmcmVlX3NrYihmcmFnKTsKKwkJCXJldHVybiBFUlJfUFRSKC1yYyk7CisJCX0KKwl9IGVsc2UgeworCQlmcmFnID0gRVJSX1BUUihFTk9NRU0pOworCX0KKworCXJldHVybiBmcmFnOworfQorCiBzdGF0aWMgaW50Ci1sb3dwYW5fZnJhZ21lbnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqaGVhZCwKLQkJICAgICBpbnQgbWxlbiwgaW50IHBsZW4sIGludCBvZmZzZXQsIGludCB0eXBlKQorbG93cGFuX3htaXRfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfaGRyICp3cGFuX2hkciwKKwkJICAgICB1OCAqZnJhZ19oZHIsIGludCBmcmFnX2hkcmxlbiwKKwkJICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpmcmFnOwotCWludCBobGVuOwogCi0JaGxlbiA9ICh0eXBlID09IExPV1BBTl9ESVNQQVRDSF9GUkFHMSkgPwotCQkJTE9XUEFOX0ZSQUcxX0hFQURfU0laRSA6IExPV1BBTl9GUkFHTl9IRUFEX1NJWkU7CisJcmF3X2R1bXBfaW5saW5lKF9fZnVuY19fLCAiIGZyYWdtZW50IGhlYWRlciIsIGZyYWdfaGRyLCBmcmFnX2hkcmxlbik7CiAKLQlyYXdfZHVtcF9pbmxpbmUoX19mdW5jX18sICI2bG93cGFuIGZyYWdtZW50IGhlYWRlciIsIGhlYWQsIGhsZW4pOworCWZyYWcgPSBsb3dwYW5fYWxsb2NfZnJhZyhza2IsIGZyYWdfaGRybGVuICsgbGVuLCB3cGFuX2hkcik7CisJaWYgKElTX0VSUihmcmFnKSkKKwkJcmV0dXJuIC1QVFJfRVJSKGZyYWcpOwogCi0JZnJhZyA9IG5ldGRldl9hbGxvY19za2Ioc2tiLT5kZXYsCi0JCQkJaGxlbiArIG1sZW4gKyBwbGVuICsgSUVFRTgwMjE1NF9NRlJfU0laRSk7Ci0JaWYgKCFmcmFnKQotCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoc2tiX3B1dChmcmFnLCBmcmFnX2hkcmxlbiksIGZyYWdfaGRyLCBmcmFnX2hkcmxlbik7CisJbWVtY3B5KHNrYl9wdXQoZnJhZywgbGVuKSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvZmZzZXQsIGxlbik7CiAKLQlmcmFnLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7Ci0KLQkvKiBjb3B5IGhlYWRlciwgTUZSIGFuZCBwYXlsb2FkICovCi0Jc2tiX3B1dChmcmFnLCBtbGVuKTsKLQlza2JfY29weV90b19saW5lYXJfZGF0YShmcmFnLCBza2JfbWFjX2hlYWRlcihza2IpLCBtbGVuKTsKLQotCXNrYl9wdXQoZnJhZywgaGxlbik7Ci0Jc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KGZyYWcsIG1sZW4sIGhlYWQsIGhsZW4pOwotCi0Jc2tiX3B1dChmcmFnLCBwbGVuKTsKLQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoZnJhZywgbWxlbiArIGhsZW4sCi0JCQkJICAgICAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgb2Zmc2V0LCBwbGVuKTsKLQotCXJhd19kdW1wX3RhYmxlKF9fZnVuY19fLCAiIHJhdyBmcmFnbWVudCBkdW1wIiwgZnJhZy0+ZGF0YSwgZnJhZy0+bGVuKTsKKwlyYXdfZHVtcF90YWJsZShfX2Z1bmNfXywgIiBmcmFnbWVudCBkdW1wIiwgZnJhZy0+ZGF0YSwgZnJhZy0+bGVuKTsKIAogCXJldHVybiBkZXZfcXVldWVfeG1pdChmcmFnKTsKIH0KIAogc3RhdGljIGludAotbG93cGFuX3NrYl9mcmFnbWVudGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitsb3dwYW5feG1pdF9mcmFnbWVudGVkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKndwYW5faGRyKQogewotCWludCBlcnI7Ci0JdTE2IGRncmFtX29mZnNldCwgZGdyYW1fc2l6ZSwgcGF5bG9hZF9sZW5ndGgsIGhlYWRlcl9sZW5ndGgsCi0JICAgIGxvd3Bhbl9zaXplLCBmcmFnX3BsZW4sIG9mZnNldDsKLQlfX2JlMTYgdGFnOwotCXU4IGhlYWRbNV07CisJdTE2IGRncmFtX3NpemUsIGRncmFtX29mZnNldDsKKwlfX2JlMTYgZnJhZ190YWc7CisJdTggZnJhZ19oZHJbNV07CisJaW50IGZyYWdfY2FwLCBmcmFnX2xlbiwgcGF5bG9hZF9jYXAsIHJjOworCWludCBza2JfdW5wcm9jZXNzZWQsIHNrYl9vZmZzZXQ7CiAKLQloZWFkZXJfbGVuZ3RoID0gc2tiLT5tYWNfbGVuOwotCXBheWxvYWRfbGVuZ3RoID0gc2tiLT5sZW4gLSBoZWFkZXJfbGVuZ3RoOwotCXRhZyA9IGxvd3Bhbl9kZXZfaW5mbyhkZXYpLT5mcmFnbWVudF90YWcrKzsKLQlsb3dwYW5fc2l6ZSA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKIAlkZ3JhbV9zaXplID0gbG93cGFuX3VuY29tcHJlc3Nfc2l6ZShza2IsICZkZ3JhbV9vZmZzZXQpIC0KLQkJICAgICBoZWFkZXJfbGVuZ3RoOworCQkgICAgIHNrYi0+bWFjX2xlbjsKKwlmcmFnX3RhZyA9IGxvd3Bhbl9kZXZfaW5mbyhkZXYpLT5mcmFnbWVudF90YWcrKzsKIAotCS8qIGZpcnN0IGZyYWdtZW50IGhlYWRlciAqLwotCWhlYWRbMF0gPSBMT1dQQU5fRElTUEFUQ0hfRlJBRzEgfCAoKGRncmFtX3NpemUgPj4gOCkgJiAweDcpOwotCWhlYWRbMV0gPSBkZ3JhbV9zaXplICYgMHhmZjsKLQltZW1jcHkoaGVhZCArIDIsICZ0YWcsIHNpemVvZih0YWcpKTsKKwlmcmFnX2hkclswXSA9IExPV1BBTl9ESVNQQVRDSF9GUkFHMSB8ICgoZGdyYW1fc2l6ZSA+PiA4KSAmIDB4MDcpOworCWZyYWdfaGRyWzFdID0gZGdyYW1fc2l6ZSAmIDB4ZmY7CisJbWVtY3B5KGZyYWdfaGRyICsgMiwgJmZyYWdfdGFnLCBzaXplb2YoZnJhZ190YWcpKTsKIAotCS8qIGNhbGMgdGhlIG5lYXJlc3QgcGF5bG9hZCBsZW5ndGgoZGl2aWRlZCB0byA4KSBmb3IgZmlyc3QgZnJhZ21lbnQKLQkgKiB3aGljaCBmaXRzIGludG8gYSBJRUVFODAyMTU0X01UVQotCSAqLwotCWZyYWdfcGxlbiA9IHJvdW5kX2Rvd24oSUVFRTgwMjE1NF9NVFUgLSBoZWFkZXJfbGVuZ3RoIC0KLQkJCSAgICAgICBMT1dQQU5fRlJBRzFfSEVBRF9TSVpFIC0gbG93cGFuX3NpemUgLQotCQkJICAgICAgIElFRUU4MDIxNTRfTUZSX1NJWkUsIDgpOworCXBheWxvYWRfY2FwID0gaWVlZTgwMjE1NF9tYXhfcGF5bG9hZCh3cGFuX2hkcik7CiAKLQllcnIgPSBsb3dwYW5fZnJhZ21lbnRfeG1pdChza2IsIGhlYWQsIGhlYWRlcl9sZW5ndGgsCi0JCQkJICAgZnJhZ19wbGVuICsgbG93cGFuX3NpemUsIDAsCi0JCQkJICAgTE9XUEFOX0RJU1BBVENIX0ZSQUcxKTsKLQlpZiAoZXJyKSB7CisJZnJhZ19sZW4gPSByb3VuZF9kb3duKHBheWxvYWRfY2FwIC0gTE9XUEFOX0ZSQUcxX0hFQURfU0laRSAtCisJCQkgICAgICBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYiksIDgpOworCisJc2tiX29mZnNldCA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwlza2JfdW5wcm9jZXNzZWQgPSBza2ItPmxlbiAtIHNrYi0+bWFjX2xlbiAtIHNrYl9vZmZzZXQ7CisKKwlyYyA9IGxvd3Bhbl94bWl0X2ZyYWdtZW50KHNrYiwgd3Bhbl9oZHIsIGZyYWdfaGRyLAorCQkJCSAgTE9XUEFOX0ZSQUcxX0hFQURfU0laRSwgMCwKKwkJCQkgIGZyYWdfbGVuICsgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKKwlpZiAocmMpIHsKIAkJcHJfZGVidWcoIiVzIHVuYWJsZSB0byBzZW5kIEZSQUcxIHBhY2tldCAodGFnOiAlZCkiLAotCQkJIF9fZnVuY19fLCB0YWcpOwotCQlnb3RvIGV4aXQ7CisJCQkgX19mdW5jX18sIGZyYWdfdGFnKTsKKwkJZ290byBlcnI7CiAJfQogCi0Jb2Zmc2V0ID0gbG93cGFuX3NpemUgKyBmcmFnX3BsZW47Ci0JZGdyYW1fb2Zmc2V0ICs9IGZyYWdfcGxlbjsKKwlmcmFnX2hkclswXSAmPSB+TE9XUEFOX0RJU1BBVENIX0ZSQUcxOworCWZyYWdfaGRyWzBdIHw9IExPV1BBTl9ESVNQQVRDSF9GUkFHTjsKKwlmcmFnX2NhcCA9IHJvdW5kX2Rvd24ocGF5bG9hZF9jYXAgLSBMT1dQQU5fRlJBR05fSEVBRF9TSVpFLCA4KTsKIAotCS8qIG5leHQgZnJhZ21lbnQgaGVhZGVyICovCi0JaGVhZFswXSAmPSB+TE9XUEFOX0RJU1BBVENIX0ZSQUcxOwotCWhlYWRbMF0gfD0gTE9XUEFOX0RJU1BBVENIX0ZSQUdOOworCWRvIHsKKwkJZGdyYW1fb2Zmc2V0ICs9IGZyYWdfbGVuOworCQlza2Jfb2Zmc2V0ICs9IGZyYWdfbGVuOworCQlza2JfdW5wcm9jZXNzZWQgLT0gZnJhZ19sZW47CisJCWZyYWdfbGVuID0gbWluKGZyYWdfY2FwLCBza2JfdW5wcm9jZXNzZWQpOwogCi0JZnJhZ19wbGVuID0gcm91bmRfZG93bihJRUVFODAyMTU0X01UVSAtIGhlYWRlcl9sZW5ndGggLQotCQkJICAgICAgIExPV1BBTl9GUkFHTl9IRUFEX1NJWkUgLSBJRUVFODAyMTU0X01GUl9TSVpFLCA4KTsKKwkJZnJhZ19oZHJbNF0gPSBkZ3JhbV9vZmZzZXQgPj4gMzsKIAotCXdoaWxlIChwYXlsb2FkX2xlbmd0aCAtIG9mZnNldCA+IDApIHsKLQkJaW50IGxlbiA9IGZyYWdfcGxlbjsKLQotCQloZWFkWzRdID0gZGdyYW1fb2Zmc2V0ID4+IDM7Ci0KLQkJaWYgKHBheWxvYWRfbGVuZ3RoIC0gb2Zmc2V0IDwgbGVuKQotCQkJbGVuID0gcGF5bG9hZF9sZW5ndGggLSBvZmZzZXQ7Ci0KLQkJZXJyID0gbG93cGFuX2ZyYWdtZW50X3htaXQoc2tiLCBoZWFkLCBoZWFkZXJfbGVuZ3RoLCBsZW4sCi0JCQkJCSAgIG9mZnNldCwgTE9XUEFOX0RJU1BBVENIX0ZSQUdOKTsKLQkJaWYgKGVycikgeworCQlyYyA9IGxvd3Bhbl94bWl0X2ZyYWdtZW50KHNrYiwgd3Bhbl9oZHIsIGZyYWdfaGRyLAorCQkJCQkgIExPV1BBTl9GUkFHTl9IRUFEX1NJWkUsIHNrYl9vZmZzZXQsCisJCQkJCSAgZnJhZ19sZW4pOworCQlpZiAocmMpIHsKIAkJCXByX2RlYnVnKCIlcyB1bmFibGUgdG8gc2VuZCBhIEZSQUdOIHBhY2tldC4gKHRhZzogJWQsIG9mZnNldDogJWQpXG4iLAotCQkJCSBfX2Z1bmNfXywgdGFnLCBvZmZzZXQpOwotCQkJZ290byBleGl0OworCQkJCSBfX2Z1bmNfXywgZnJhZ190YWcsIHNrYl9vZmZzZXQpOworCQkJZ290byBlcnI7CiAJCX0KKwl9IHdoaWxlIChza2JfdW5wcm9jZXNzZWQgPiBmcmFnX2NhcCk7CiAKLQkJb2Zmc2V0ICs9IGxlbjsKLQkJZGdyYW1fb2Zmc2V0ICs9IGxlbjsKLQl9CisJY29uc3VtZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKIAotZXhpdDoKLQlyZXR1cm4gZXJyOworZXJyOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIG5ldGRldl90eF90IGxvd3Bhbl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JaW50IGVyciA9IC0xOworCXN0cnVjdCBpZWVlODAyMTU0X2hkciB3cGFuX2hkcjsKKwlpbnQgbWF4X3NpbmdsZTsKIAogCXByX2RlYnVnKCJwYWNrYWdlIHhtaXRcbiIpOwogCi0Jc2tiLT5kZXYgPSBsb3dwYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7Ci0JaWYgKHNrYi0+ZGV2ID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIkVSUk9SOiBubyByZWFsIHdwYW4gZGV2aWNlIGZvdW5kXG4iKTsKLQkJZ290byBlcnJvcjsKKwlpZiAoaWVlZTgwMjE1NF9oZHJfcGVlayhza2IsICZ3cGFuX2hkcikgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1hNSVRfRFJPUDsKIAl9CiAKLQkvKiBTZW5kIGRpcmVjdGx5IGlmIGxlc3MgdGhhbiB0aGUgTVRVIG1pbnVzIHRoZSAyIGNoZWNrc3VtIGJ5dGVzLiAqLwotCWlmIChza2ItPmxlbiA8PSBJRUVFODAyMTU0X01UVSAtIElFRUU4MDIxNTRfTUZSX1NJWkUpIHsKLQkJZXJyID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKLQkJZ290byBvdXQ7CisJbWF4X3NpbmdsZSA9IGllZWU4MDIxNTRfbWF4X3BheWxvYWQoJndwYW5faGRyKTsKKworCWlmIChza2JfdGFpbF9wb2ludGVyKHNrYikgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSA8PSBtYXhfc2luZ2xlKSB7CisJCXNrYi0+ZGV2ID0gbG93cGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCQlyZXR1cm4gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwl9IGVsc2UgeworCQluZXRkZXZfdHhfdCByYzsKKworCQlwcl9kZWJ1ZygiZnJhbWUgaXMgdG9vIGJpZywgZnJhZ21lbnRhdGlvbiBpcyBuZWVkZWRcbiIpOworCQlyYyA9IGxvd3Bhbl94bWl0X2ZyYWdtZW50ZWQoc2tiLCBkZXYsICZ3cGFuX2hkcik7CisKKwkJcmV0dXJuIHJjIDwgMCA/IE5FVF9YTUlUX0RST1AgOiByYzsKIAl9Ci0KLQlwcl9kZWJ1ZygiZnJhbWUgaXMgdG9vIGJpZywgZnJhZ21lbnRhdGlvbiBpcyBuZWVkZWRcbiIpOwotCWVyciA9IGxvd3Bhbl9za2JfZnJhZ21lbnRhdGlvbihza2IsIGRldik7Ci1lcnJvcjoKLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci1vdXQ6Ci0JaWYgKGVycikKLQkJcHJfZGVidWcoIkVSUk9SOiB4bWl0IGZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gKGVyciA8IDApID8gTkVUX1hNSVRfRFJPUCA6IGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCB3cGFuX3BoeSAqbG93cGFuX2dldF9waHkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMgYi9uZXQvaWVlZTgwMjE1NC9kZ3JhbS5jCmluZGV4IDc4NjQzN2IuLjRmMGVkODcgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvZGdyYW0uYwpAQCAtMjEsNiArMjEsNyBAQAogICogRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YgPGRiYXJ5c2hrb3ZAZ21haWwuY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CkBAIC00NSw3ICs0NiwxMiBAQAogCXN0cnVjdCBpZWVlODAyMTU0X2FkZHIgZHN0X2FkZHI7CiAKIAl1bnNpZ25lZCBpbnQgYm91bmQ6MTsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdGVkOjE7CiAJdW5zaWduZWQgaW50IHdhbnRfYWNrOjE7CisJdW5zaWduZWQgaW50IHNlY2VuOjE7CisJdW5zaWduZWQgaW50IHNlY2VuX292ZXJyaWRlOjE7CisJdW5zaWduZWQgaW50IHNlY2xldmVsOjM7CisJdW5zaWduZWQgaW50IHNlY2xldmVsX292ZXJyaWRlOjE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZ3JhbV9zb2NrICpkZ3JhbV9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCkBAIC03MywxMCArNzksNyBAQAogewogCXN0cnVjdCBkZ3JhbV9zb2NrICpybyA9IGRncmFtX3NrKHNrKTsKIAotCXJvLT5kc3RfYWRkci5tb2RlID0gSUVFRTgwMjE1NF9BRERSX0xPTkc7Ci0Jcm8tPmRzdF9hZGRyLnBhbl9pZCA9IGNwdV90b19sZTE2KElFRUU4MDIxNTRfUEFOSURfQlJPQURDQVNUKTsKIAlyby0+d2FudF9hY2sgPSAxOwotCW1lbXNldCgmcm8tPmRzdF9hZGRyLmV4dGVuZGVkX2FkZHIsIDB4ZmYsIElFRUU4MDIxNTRfQUREUl9MRU4pOwogCXJldHVybiAwOwogfQogCkBAIC0xODMsNiArMTg2LDcgQEAKIAl9CiAKIAlpZWVlODAyMTU0X2FkZHJfZnJvbV9zYSgmcm8tPmRzdF9hZGRyLCAmYWRkci0+YWRkcik7CisJcm8tPmNvbm5lY3RlZCA9IDE7CiAKIG91dDoKIAlyZWxlYXNlX3NvY2soc2spOwpAQCAtMTk0LDEwICsxOTgsNyBAQAogCXN0cnVjdCBkZ3JhbV9zb2NrICpybyA9IGRncmFtX3NrKHNrKTsKIAogCWxvY2tfc29jayhzayk7Ci0KLQlyby0+ZHN0X2FkZHIubW9kZSA9IElFRUU4MDIxNTRfQUREUl9MT05HOwotCW1lbXNldCgmcm8tPmRzdF9hZGRyLmV4dGVuZGVkX2FkZHIsIDB4ZmYsIElFRUU4MDIxNTRfQUREUl9MRU4pOwotCisJcm8tPmNvbm5lY3RlZCA9IDA7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXJldHVybiAwOwpAQCAtMjA5LDcgKzIxMCw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBpbnQgbXR1OwogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxNTRfbWFjX2NiICpjYjsKIAlzdHJ1Y3QgZGdyYW1fc29jayAqcm8gPSBkZ3JhbV9zayhzayk7CisJc3RydWN0IGllZWU4MDIxNTRfYWRkciBkc3RfYWRkcjsKIAlpbnQgaGxlbiwgdGxlbjsKIAlpbnQgZXJyOwogCkBAIC0yMTgsNiArMjIxLDExIEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKKwlpZiAoIXJvLT5jb25uZWN0ZWQgJiYgIW1zZy0+bXNnX25hbWUpCisJCXJldHVybiAtRURFU1RBRERSUkVROworCWVsc2UgaWYgKHJvLT5jb25uZWN0ZWQgJiYgbXNnLT5tc2dfbmFtZSkKKwkJcmV0dXJuIC1FSVNDT05OOworCiAJaWYgKCFyby0+Ym91bmQpCiAJCWRldiA9IGRldl9nZXRmaXJzdGJ5aHd0eXBlKHNvY2tfbmV0KHNrKSwgQVJQSFJEX0lFRUU4MDIxNTQpOwogCWVsc2UKQEAgLTI0OSwxOCArMjU3LDI4IEBACiAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAotCW1hY19jYihza2IpLT5mbGFncyA9IElFRUU4MDIxNTRfRkNfVFlQRV9EQVRBOwotCWlmIChyby0+d2FudF9hY2spCi0JCW1hY19jYihza2IpLT5mbGFncyB8PSBNQUNfQ0JfRkxBR19BQ0tSRVE7CisJY2IgPSBtYWNfY2JfaW5pdChza2IpOworCWNiLT50eXBlID0gSUVFRTgwMjE1NF9GQ19UWVBFX0RBVEE7CisJY2ItPmFja3JlcSA9IHJvLT53YW50X2FjazsKIAotCW1hY19jYihza2IpLT5zZXEgPSBpZWVlODAyMTU0X21sbWVfb3BzKGRldiktPmdldF9kc24oZGV2KTsKLQllcnIgPSBkZXZfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX0lFRUU4MDIxNTQsICZyby0+ZHN0X2FkZHIsCi0JCQlyby0+Ym91bmQgPyAmcm8tPnNyY19hZGRyIDogTlVMTCwgc2l6ZSk7CisJaWYgKG1zZy0+bXNnX25hbWUpIHsKKwkJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfaWVlZTgwMjE1NCosIGRhZGRyLCBtc2ctPm1zZ19uYW1lKTsKKworCQlpZWVlODAyMTU0X2FkZHJfZnJvbV9zYSgmZHN0X2FkZHIsICZkYWRkci0+YWRkcik7CisJfSBlbHNlIHsKKwkJZHN0X2FkZHIgPSByby0+ZHN0X2FkZHI7CisJfQorCisJY2ItPnNlY2VuID0gcm8tPnNlY2VuOworCWNiLT5zZWNlbl9vdmVycmlkZSA9IHJvLT5zZWNlbl9vdmVycmlkZTsKKwljYi0+c2VjbGV2ZWwgPSByby0+c2VjbGV2ZWw7CisJY2ItPnNlY2xldmVsX292ZXJyaWRlID0gcm8tPnNlY2xldmVsX292ZXJyaWRlOworCisJZXJyID0gZGV2X2hhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9JRUVFODAyMTU0LCAmZHN0X2FkZHIsCisJCQkgICAgICByby0+Ym91bmQgPyAmcm8tPnNyY19hZGRyIDogTlVMTCwgc2l6ZSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X3NrYjsKIAotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KIAllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLCBzaXplKSwgbXNnLT5tc2dfaW92LCBzaXplKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfc2tiOwpAQCAtNDE5LDYgKzQzNywyMCBAQAogCWNhc2UgV1BBTl9XQU5UQUNLOgogCQl2YWwgPSByby0+d2FudF9hY2s7CiAJCWJyZWFrOworCWNhc2UgV1BBTl9TRUNVUklUWToKKwkJaWYgKCFyby0+c2VjZW5fb3ZlcnJpZGUpCisJCQl2YWwgPSBXUEFOX1NFQ1VSSVRZX0RFRkFVTFQ7CisJCWVsc2UgaWYgKHJvLT5zZWNlbikKKwkJCXZhbCA9IFdQQU5fU0VDVVJJVFlfT047CisJCWVsc2UKKwkJCXZhbCA9IFdQQU5fU0VDVVJJVFlfT0ZGOworCQlicmVhazsKKwljYXNlIFdQQU5fU0VDVVJJVFlfTEVWRUw6CisJCWlmICghcm8tPnNlY2xldmVsX292ZXJyaWRlKQorCQkJdmFsID0gV1BBTl9TRUNVUklUWV9MRVZFTF9ERUZBVUxUOworCQllbHNlCisJCQl2YWwgPSByby0+c2VjbGV2ZWw7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQpAQCAtNDM0LDYgKzQ2Niw3IEBACiAJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBkZ3JhbV9zb2NrICpybyA9IGRncmFtX3NrKHNrKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJaW50IHZhbDsKIAlpbnQgZXJyID0gMDsKIApAQCAtNDQ5LDYgKzQ4Miw0NyBAQAogCWNhc2UgV1BBTl9XQU5UQUNLOgogCQlyby0+d2FudF9hY2sgPSAhIXZhbDsKIAkJYnJlYWs7CisJY2FzZSBXUEFOX1NFQ1VSSVRZOgorCQlpZiAoIW5zX2NhcGFibGUobmV0LT51c2VyX25zLCBDQVBfTkVUX0FETUlOKSAmJgorCQkgICAgIW5zX2NhcGFibGUobmV0LT51c2VyX25zLCBDQVBfTkVUX1JBVykpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBXUEFOX1NFQ1VSSVRZX0RFRkFVTFQ6CisJCQlyby0+c2VjZW5fb3ZlcnJpZGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgV1BBTl9TRUNVUklUWV9PTjoKKwkJCXJvLT5zZWNlbl9vdmVycmlkZSA9IDE7CisJCQlyby0+c2VjZW4gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgV1BBTl9TRUNVUklUWV9PRkY6CisJCQlyby0+c2VjZW5fb3ZlcnJpZGUgPSAxOworCQkJcm8tPnNlY2VuID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgV1BBTl9TRUNVUklUWV9MRVZFTDoKKwkJaWYgKCFuc19jYXBhYmxlKG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikgJiYKKwkJICAgICFuc19jYXBhYmxlKG5ldC0+dXNlcl9ucywgQ0FQX05FVF9SQVcpKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWlmICh2YWwgPCBXUEFOX1NFQ1VSSVRZX0xFVkVMX0RFRkFVTFQgfHwKKwkJICAgIHZhbCA+IElFRUU4MDIxNTRfU0NGX1NFQ0xFVkVMX0VOQ19NSUMxMjgpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAodmFsID09IFdQQU5fU0VDVVJJVFlfTEVWRUxfREVGQVVMVCkgeworCQkJcm8tPnNlY2xldmVsX292ZXJyaWRlID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJvLT5zZWNsZXZlbF9vdmVycmlkZSA9IDE7CisJCQlyby0+c2VjbGV2ZWwgPSB2YWw7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2hlYWRlcl9vcHMuYyBiL25ldC9pZWVlODAyMTU0L2hlYWRlcl9vcHMuYwppbmRleCBiZWQ0MmE0Li5jMDkyOTRlIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC9oZWFkZXJfb3BzLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvaGVhZGVyX29wcy5jCkBAIC0xOTUsMTUgKzE5NSwxNiBAQAogCXJldHVybiBwb3M7CiB9CiAKK3N0YXRpYyBpbnQgaWVlZTgwMjE1NF9zZWNoZHJfbGVuZ3Roc1s0XSA9IHsKKwlbSUVFRTgwMjE1NF9TQ0ZfS0VZX0lNUExJQ0lUXSA9IDUsCisJW0lFRUU4MDIxNTRfU0NGX0tFWV9JTkRFWF0gPSA2LAorCVtJRUVFODAyMTU0X1NDRl9LRVlfU0hPUlRfSU5ERVhdID0gMTAsCisJW0lFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWF0gPSAxNCwKK307CisKIHN0YXRpYyBpbnQgaWVlZTgwMjE1NF9oZHJfc2VjaGRyX2xlbih1OCBzYykKIHsKLQlzd2l0Y2ggKElFRUU4MDIxNTRfU0NGX0tFWV9JRF9NT0RFKHNjKSkgewotCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfS0VZX0lNUExJQ0lUOiByZXR1cm4gNTsKLQljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9JTkRFWDogcmV0dXJuIDY7Ci0JY2FzZSBJRUVFODAyMTU0X1NDRl9LRVlfU0hPUlRfSU5ERVg6IHJldHVybiAxMDsKLQljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWDogcmV0dXJuIDE0OwotCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCX0KKwlyZXR1cm4gaWVlZTgwMjE1NF9zZWNoZHJfbGVuZ3Roc1tJRUVFODAyMTU0X1NDRl9LRVlfSURfTU9ERShzYyldOwogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxNTRfaGRyX21pbmxlbihjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkcikKQEAgLTI4NSwzICsyODYsNDAgQEAKIAlyZXR1cm4gcG9zOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjE1NF9oZHJfcGVla19hZGRycyk7CisKK2ludAoraWVlZTgwMjE1NF9oZHJfcGVlayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkcikKK3sKKwljb25zdCB1OCAqYnVmID0gc2tiX21hY19oZWFkZXIoc2tiKTsKKwlpbnQgcG9zOworCisJcG9zID0gaWVlZTgwMjE1NF9oZHJfcGVla19hZGRycyhza2IsIGhkcik7CisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkci0+ZmMuc2VjdXJpdHlfZW5hYmxlZCkgeworCQl1OCBrZXlfaWRfbW9kZSA9IElFRUU4MDIxNTRfU0NGX0tFWV9JRF9NT0RFKCooYnVmICsgcG9zKSk7CisJCWludCB3YW50ID0gcG9zICsgaWVlZTgwMjE1NF9zZWNoZHJfbGVuZ3Roc1trZXlfaWRfbW9kZV07CisKKwkJaWYgKGJ1ZiArIHdhbnQgPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwb3MgKz0gaWVlZTgwMjE1NF9oZHJfZ2V0X3NlY2hkcihidWYgKyBwb3MsICZoZHItPnNlYyk7CisJfQorCisJcmV0dXJuIHBvczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxNTRfaGRyX3BlZWspOworCitpbnQgaWVlZTgwMjE1NF9tYXhfcGF5bG9hZChjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkcikKK3sKKwlpbnQgaGxlbiA9IGllZWU4MDIxNTRfaGRyX21pbmxlbihoZHIpOworCisJaWYgKGhkci0+ZmMuc2VjdXJpdHlfZW5hYmxlZCkgeworCQlobGVuICs9IGllZWU4MDIxNTRfc2VjaGRyX2xlbmd0aHNbaGRyLT5zZWMua2V5X2lkX21vZGVdIC0gMTsKKwkJaGxlbiArPSBpZWVlODAyMTU0X3NlY2hkcl9hdXRodGFnX2xlbigmaGRyLT5zZWMpOworCX0KKworCXJldHVybiBJRUVFODAyMTU0X01UVSAtIGhsZW4gLSBJRUVFODAyMTU0X01GUl9TSVpFOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjE1NF9tYXhfcGF5bG9hZCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9pZWVlODAyMTU0LmggYi9uZXQvaWVlZTgwMjE1NC9pZWVlODAyMTU0LmgKaW5kZXggNjY5M2E1Yy4uOGI4M2EyMyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvaWVlZTgwMjE1NC5oCisrKyBiL25ldC9pZWVlODAyMTU0L2llZWU4MDIxNTQuaApAQCAtNjgsNCArNjgsMjMgQEAKIGludCBpZWVlODAyMTU0X2R1bXBfaWZhY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCBpZWVlODAyMTU0X3NldF9tYWNwYXJhbXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiAKK2ludCBpZWVlODAyMTU0X2xsc2VjX2dldHBhcmFtcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKK2ludCBpZWVlODAyMTU0X2xsc2VjX3NldHBhcmFtcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKK2ludCBpZWVlODAyMTU0X2xsc2VjX2FkZF9rZXkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgaWVlZTgwMjE1NF9sbHNlY19kZWxfa2V5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9rZXlzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKK2ludCBpZWVlODAyMTU0X2xsc2VjX2FkZF9kZXYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgaWVlZTgwMjE1NF9sbHNlY19kZWxfZGV2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9kZXZzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKK2ludCBpZWVlODAyMTU0X2xsc2VjX2FkZF9kZXZrZXkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgaWVlZTgwMjE1NF9sbHNlY19kZWxfZGV2a2V5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9kZXZrZXlzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworaW50IGllZWU4MDIxNTRfbGxzZWNfYWRkX3NlY2xldmVsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGllZWU4MDIxNTRfbGxzZWNfZGVsX3NlY2xldmVsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9zZWNsZXZlbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9uZXRsaW5rLmMgYi9uZXQvaWVlZTgwMjE1NC9uZXRsaW5rLmMKaW5kZXggMDRiMjA1OC4uMjZlZmNmNCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmV0bGluay5jCisrKyBiL25ldC9pZWVlODAyMTU0L25ldGxpbmsuYwpAQCAtMTI0LDYgKzEyNCwyNiBAQAogCUlFRUU4MDIxNTRfRFVNUChJRUVFODAyMTU0X0xJU1RfSUZBQ0UsIGllZWU4MDIxNTRfbGlzdF9pZmFjZSwKIAkJCWllZWU4MDIxNTRfZHVtcF9pZmFjZSksCiAJSUVFRTgwMjE1NF9PUChJRUVFODAyMTU0X1NFVF9NQUNQQVJBTVMsIGllZWU4MDIxNTRfc2V0X21hY3BhcmFtcyksCisJSUVFRTgwMjE1NF9PUChJRUVFODAyMTU0X0xMU0VDX0dFVFBBUkFNUywgaWVlZTgwMjE1NF9sbHNlY19nZXRwYXJhbXMpLAorCUlFRUU4MDIxNTRfT1AoSUVFRTgwMjE1NF9MTFNFQ19TRVRQQVJBTVMsIGllZWU4MDIxNTRfbGxzZWNfc2V0cGFyYW1zKSwKKwlJRUVFODAyMTU0X0RVTVAoSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0tFWSwgTlVMTCwKKwkJCWllZWU4MDIxNTRfbGxzZWNfZHVtcF9rZXlzKSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfQUREX0tFWSwgaWVlZTgwMjE1NF9sbHNlY19hZGRfa2V5KSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfREVMX0tFWSwgaWVlZTgwMjE1NF9sbHNlY19kZWxfa2V5KSwKKwlJRUVFODAyMTU0X0RVTVAoSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0RFViwgTlVMTCwKKwkJCWllZWU4MDIxNTRfbGxzZWNfZHVtcF9kZXZzKSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfQUREX0RFViwgaWVlZTgwMjE1NF9sbHNlY19hZGRfZGV2KSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfREVMX0RFViwgaWVlZTgwMjE1NF9sbHNlY19kZWxfZGV2KSwKKwlJRUVFODAyMTU0X0RVTVAoSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0RFVktFWSwgTlVMTCwKKwkJCWllZWU4MDIxNTRfbGxzZWNfZHVtcF9kZXZrZXlzKSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfQUREX0RFVktFWSwgaWVlZTgwMjE1NF9sbHNlY19hZGRfZGV2a2V5KSwKKwlJRUVFODAyMTU0X09QKElFRUU4MDIxNTRfTExTRUNfREVMX0RFVktFWSwgaWVlZTgwMjE1NF9sbHNlY19kZWxfZGV2a2V5KSwKKwlJRUVFODAyMTU0X0RVTVAoSUVFRTgwMjE1NF9MTFNFQ19MSVNUX1NFQ0xFVkVMLCBOVUxMLAorCQkJaWVlZTgwMjE1NF9sbHNlY19kdW1wX3NlY2xldmVscyksCisJSUVFRTgwMjE1NF9PUChJRUVFODAyMTU0X0xMU0VDX0FERF9TRUNMRVZFTCwKKwkJICAgICAgaWVlZTgwMjE1NF9sbHNlY19hZGRfc2VjbGV2ZWwpLAorCUlFRUU4MDIxNTRfT1AoSUVFRTgwMjE1NF9MTFNFQ19ERUxfU0VDTEVWRUwsCisJCSAgICAgIGllZWU4MDIxNTRfbGxzZWNfZGVsX3NlY2xldmVsKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgaWVlZTgwMjE1NF9tY2dycHNbXSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sLW1hYy5jIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKaW5kZXggNWQyODU0OS4uYTMyODFiOCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKQEAgLTcxNSwzICs3MTUsODEyIEBACiAJZGV2X3B1dChkZXYpOwogCXJldHVybiByYzsKIH0KKworCisKK3N0YXRpYyBpbnQKK2llZWU4MDIxNTRfbGxzZWNfcGFyc2Vfa2V5X2lkKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmRlc2MpCit7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCisJaWYgKCFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX01PREVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2MtPm1vZGUgPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfTU9ERV0pOworCisJaWYgKGRlc2MtPm1vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX0lNUExJQ0lUKSB7CisJCWlmICghaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX1BBTl9JRF0gJiYKKwkJICAgICEoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX1NIT1JUX0FERFJdIHx8CisJCSAgICAgIGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9IV19BRERSXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkZXNjLT5kZXZpY2VfYWRkci5wYW5faWQgPSBubGFfZ2V0X3Nob3J0YWRkcihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfUEFOX0lEXSk7CisKKwkJaWYgKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9TSE9SVF9BRERSXSkgeworCQkJZGVzYy0+ZGV2aWNlX2FkZHIubW9kZSA9IElFRUU4MDIxNTRfQUREUl9TSE9SVDsKKwkJCWRlc2MtPmRldmljZV9hZGRyLnNob3J0X2FkZHIgPSBubGFfZ2V0X3Nob3J0YWRkcihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfU0hPUlRfQUREUl0pOworCQl9IGVsc2UgeworCQkJZGVzYy0+ZGV2aWNlX2FkZHIubW9kZSA9IElFRUU4MDIxNTRfQUREUl9MT05HOworCQkJZGVzYy0+ZGV2aWNlX2FkZHIuZXh0ZW5kZWRfYWRkciA9IG5sYV9nZXRfaHdhZGRyKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9IV19BRERSXSk7CisJCX0KKwl9CisKKwlpZiAoZGVzYy0+bW9kZSAhPSBJRUVFODAyMTU0X1NDRl9LRVlfSU1QTElDSVQgJiYKKwkgICAgIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfSURdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXNjLT5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9TSE9SVF9JTkRFWCAmJgorCSAgICAhaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9TT1VSQ0VfU0hPUlRdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXNjLT5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWCAmJgorCSAgICAhaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9TT1VSQ0VfRVhURU5ERURdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXNjLT5tb2RlICE9IElFRUU4MDIxNTRfU0NGX0tFWV9JTVBMSUNJVCkKKwkJZGVzYy0+aWQgPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfSURdKTsKKworCXN3aXRjaCAoZGVzYy0+bW9kZSkgeworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfS0VZX1NIT1JUX0lOREVYOgorCXsKKwkJdTMyIHNvdXJjZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfU09VUkNFX1NIT1JUXSk7CisJCWRlc2MtPnNob3J0X3NvdXJjZSA9IGNwdV90b19sZTMyKHNvdXJjZSk7CisJCWJyZWFrOworCX0KKwljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWDoKKwkJZGVzYy0+ZXh0ZW5kZWRfc291cmNlID0gbmxhX2dldF9od2FkZHIoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9TT1VSQ0VfRVhURU5ERURdKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2llZWU4MDIxNTRfbGxzZWNfZmlsbF9rZXlfaWQoc3RydWN0IHNrX2J1ZmYgKm1zZywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkICpkZXNjKQoreworCWlmIChubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9NT0RFLCBkZXNjLT5tb2RlKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChkZXNjLT5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9JTVBMSUNJVCkgeworCQlpZiAobmxhX3B1dF9zaG9ydGFkZHIobXNnLCBJRUVFODAyMTU0X0FUVFJfUEFOX0lELAorCQkJCSAgICAgIGRlc2MtPmRldmljZV9hZGRyLnBhbl9pZCkpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworCisJCWlmIChkZXNjLT5kZXZpY2VfYWRkci5tb2RlID09IElFRUU4MDIxNTRfQUREUl9TSE9SVCAmJgorCQkgICAgbmxhX3B1dF9zaG9ydGFkZHIobXNnLCBJRUVFODAyMTU0X0FUVFJfU0hPUlRfQUREUiwKKwkJCQkgICAgICBkZXNjLT5kZXZpY2VfYWRkci5zaG9ydF9hZGRyKSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisKKwkJaWYgKGRlc2MtPmRldmljZV9hZGRyLm1vZGUgPT0gSUVFRTgwMjE1NF9BRERSX0xPTkcgJiYKKwkJICAgIG5sYV9wdXRfaHdhZGRyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0hXX0FERFIsCisJCQkJICAgZGVzYy0+ZGV2aWNlX2FkZHIuZXh0ZW5kZWRfYWRkcikpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCWlmIChkZXNjLT5tb2RlICE9IElFRUU4MDIxNTRfU0NGX0tFWV9JTVBMSUNJVCAmJgorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9JRCwgZGVzYy0+aWQpKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKGRlc2MtPm1vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX1NIT1JUX0lOREVYICYmCisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9TT1VSQ0VfU0hPUlQsCisJCQlsZTMyX3RvX2NwdShkZXNjLT5zaG9ydF9zb3VyY2UpKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChkZXNjLT5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWCAmJgorCSAgICBubGFfcHV0X2h3YWRkcihtc2csIElFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfU09VUkNFX0VYVEVOREVELAorCQkJICAgZGVzYy0+ZXh0ZW5kZWRfc291cmNlKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjE1NF9sbHNlY19nZXRwYXJhbXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBpZWVlODAyMTU0X21sbWVfb3BzICpvcHM7CisJdm9pZCAqaGRyOworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3BhcmFtcyBwYXJhbXM7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWRldiA9IGllZWU4MDIxNTRfbmxfZ2V0X2RldihpbmZvKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvcHMgPSBpZWVlODAyMTU0X21sbWVfb3BzKGRldik7CisJaWYgKCFvcHMtPmxsc2VjKSB7CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJZ290byBvdXRfZGV2OworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCAwLCBpbmZvLT5zbmRfc2VxLCAmbmw4MDIxNTRfZmFtaWx5LCAwLAorCQlJRUVFODAyMTU0X0xMU0VDX0dFVFBBUkFNUyk7CisJaWYgKCFoZHIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyYyA9IG9wcy0+bGxzZWMtPmdldF9wYXJhbXMoZGV2LCAmcGFyYW1zKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9OQU1FLCBkZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9JTkRFWCwgZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0VOQUJMRUQsIHBhcmFtcy5lbmFibGVkKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMLCBwYXJhbXMub3V0X2xldmVsKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIElFRUU4MDIxNTRfQVRUUl9MTFNFQ19GUkFNRV9DT1VOVEVSLAorCQkJYmUzMl90b19jcHUocGFyYW1zLmZyYW1lX2NvdW50ZXIpKSB8fAorCSAgICBpZWVlODAyMTU0X2xsc2VjX2ZpbGxfa2V5X2lkKG1zZywgJnBhcmFtcy5vdXRfa2V5KSkKKwkJZ290byBvdXRfZnJlZTsKKworCWRldl9wdXQoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTU0X25sX3JlcGx5KG1zZywgaW5mbyk7CitvdXRfZnJlZToKKwlubG1zZ19mcmVlKG1zZyk7CitvdXRfZGV2OgorCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBpZWVlODAyMTU0X2xsc2VjX3NldHBhcmFtcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19wYXJhbXMgcGFyYW1zOworCWludCBjaGFuZ2VkID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJZGV2ID0gaWVlZTgwMjE1NF9ubF9nZXRfZGV2KGluZm8pOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0VOQUJMRURdICYmCisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX01PREVdICYmCisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfU0VDTEVWRUxdKQorCQlnb3RvIG91dDsKKworCW9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlpZiAoIW9wcy0+bGxzZWMpIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19TRUNMRVZFTF0gJiYKKwkgICAgbmxhX2dldF91OChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfU0VDTEVWRUxdKSA+IDcpCisJCWdvdG8gb3V0OworCisJaWYgKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19FTkFCTEVEXSkgeworCQlwYXJhbXMuZW5hYmxlZCA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0VOQUJMRURdKTsKKwkJY2hhbmdlZCB8PSBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX0VOQUJMRUQ7CisJfQorCisJaWYgKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfTU9ERV0pIHsKKwkJaWYgKGllZWU4MDIxNTRfbGxzZWNfcGFyc2Vfa2V5X2lkKGluZm8sICZwYXJhbXMub3V0X2tleSkpCisJCQlnb3RvIG91dDsKKworCQljaGFuZ2VkIHw9IElFRUU4MDIxNTRfTExTRUNfUEFSQU1fT1VUX0tFWTsKKwl9CisKKwlpZiAoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMXSkgeworCQlwYXJhbXMub3V0X2xldmVsID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfU0VDTEVWRUxdKTsKKwkJY2hhbmdlZCB8PSBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX09VVF9MRVZFTDsKKwl9CisKKwlpZiAoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX0NPVU5URVJdKSB7CisJCXUzMiBmYyA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19GUkFNRV9DT1VOVEVSXSk7CisKKwkJcGFyYW1zLmZyYW1lX2NvdW50ZXIgPSBjcHVfdG9fYmUzMihmYyk7CisJCWNoYW5nZWQgfD0gSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9GUkFNRV9DT1VOVEVSOworCX0KKworCXJjID0gb3BzLT5sbHNlYy0+c2V0X3BhcmFtcyhkZXYsICZwYXJhbXMsIGNoYW5nZWQpOworCisJZGV2X3B1dChkZXYpOworCisJcmV0dXJuIHJjOworb3V0OgorCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworCitzdHJ1Y3QgbGxzZWNfZHVtcF9kYXRhIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzX2lkeCwgc19pZHgyOworCWludCBwb3J0aWQ7CisJaW50IG5sbXNnX3NlcTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpZWVlODAyMTU0X21sbWVfb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfdGFibGUgKnRhYmxlOworfTsKKworc3RhdGljIGludAoraWVlZTgwMjE1NF9sbHNlY19kdW1wX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICBpbnQgKCpzdGVwKShzdHJ1Y3QgbGxzZWNfZHVtcF9kYXRhKikpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGxzZWNfZHVtcF9kYXRhIGRhdGE7CisJaW50IGlkeCA9IDA7CisJaW50IGZpcnN0X2RldiA9IGNiLT5hcmdzWzBdOworCWludCByYzsKKworCWZvcl9lYWNoX25ldGRldihuZXQsIGRldikgeworCQlpZiAoaWR4IDwgZmlyc3RfZGV2IHx8IGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCkKKwkJCWdvdG8gc2tpcDsKKworCQlkYXRhLm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwkJaWYgKCFkYXRhLm9wcy0+bGxzZWMpCisJCQlnb3RvIHNraXA7CisKKwkJZGF0YS5za2IgPSBza2I7CisJCWRhdGEuc19pZHggPSBjYi0+YXJnc1sxXTsKKwkJZGF0YS5zX2lkeDIgPSBjYi0+YXJnc1syXTsKKwkJZGF0YS5kZXYgPSBkZXY7CisJCWRhdGEucG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJCWRhdGEubmxtc2dfc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOworCisJCWRhdGEub3BzLT5sbHNlYy0+bG9ja190YWJsZShkZXYpOworCQlkYXRhLm9wcy0+bGxzZWMtPmdldF90YWJsZShkYXRhLmRldiwgJmRhdGEudGFibGUpOworCQlyYyA9IHN0ZXAoJmRhdGEpOworCQlkYXRhLm9wcy0+bGxzZWMtPnVubG9ja190YWJsZShkZXYpOworCisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworc2tpcDoKKwkJaWR4Kys7CisJfQorCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgaW50CitpZWVlODAyMTU0X25sX2xsc2VjX2NoYW5nZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJICAgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlKiwgc3RydWN0IGdlbmxfaW5mbyopKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByYyA9IC1FSU5WQUw7CisKKwlkZXYgPSBpZWVlODAyMTU0X25sX2dldF9kZXYoaW5mbyk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpZWVlODAyMTU0X21sbWVfb3BzKGRldiktPmxsc2VjKQorCQlyYyA9IC1FT1BOT1RTVVBQOworCWVsc2UKKwkJcmMgPSBmbihkZXYsIGluZm8pOworCisJZGV2X3B1dChkZXYpOworCXJldHVybiByYzsKK30KKworCisKK3N0YXRpYyBpbnQKK2llZWU4MDIxNTRfbGxzZWNfcGFyc2Vfa2V5KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkgKmtleSkKK3sKKwl1OCBmcmFtZXM7CisJdTMyIGNvbW1hbmRzWzI1NiAvIDMyXTsKKworCW1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CisKKwlpZiAoIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfVVNBR0VfRlJBTUVfVFlQRVNdIHx8CisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX0JZVEVTXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmFtZXMgPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfVVNBR0VfRlJBTUVfVFlQRVNdKTsKKwlpZiAoKGZyYW1lcyAmIEJJVChJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRCkpICYmCisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1VTQUdFX0NPTU1BTkRTXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9VU0FHRV9DT01NQU5EU10pIHsKKwkJbmxhX21lbWNweShjb21tYW5kcywKKwkJCSAgIGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfVVNBR0VfQ09NTUFORFNdLAorCQkJICAgMjU2IC8gOCk7CisKKwkJaWYgKGNvbW1hbmRzWzBdIHx8IGNvbW1hbmRzWzFdIHx8IGNvbW1hbmRzWzJdIHx8IGNvbW1hbmRzWzNdIHx8CisJCSAgICBjb21tYW5kc1s0XSB8fCBjb21tYW5kc1s1XSB8fCBjb21tYW5kc1s2XSB8fAorCQkgICAgY29tbWFuZHNbN10gPj0gQklUKElFRUU4MDIxNTRfQ01EX0dUU19SRVEgKyAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWtleS0+Y21kX2ZyYW1lX2lkcyA9IGNvbW1hbmRzWzddOworCX0KKworCWtleS0+ZnJhbWVfdHlwZXMgPSBmcmFtZXM7CisKKwlubGFfbWVtY3B5KGtleS0+a2V5LCBpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX0JZVEVTXSwKKwkJICAgSUVFRTgwMjE1NF9MTFNFQ19LRVlfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbHNlY19hZGRfa2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkga2V5OworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCBpZDsKKworCWlmIChpZWVlODAyMTU0X2xsc2VjX3BhcnNlX2tleShpbmZvLCAma2V5KSB8fAorCSAgICBpZWVlODAyMTU0X2xsc2VjX3BhcnNlX2tleV9pZChpbmZvLCAmaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvcHMtPmxsc2VjLT5hZGRfa2V5KGRldiwgJmlkLCAma2V5KTsKK30KKworaW50IGllZWU4MDIxNTRfbGxzZWNfYWRkX2tleShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCWlmICgoaW5mby0+bmxoZHItPm5sbXNnX2ZsYWdzICYgKE5MTV9GX0NSRUFURSB8IE5MTV9GX0VYQ0wpKSAhPQorCSAgICAoTkxNX0ZfQ1JFQVRFIHwgTkxNX0ZfRVhDTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGllZWU4MDIxNTRfbmxfbGxzZWNfY2hhbmdlKHNrYiwgaW5mbywgbGxzZWNfYWRkX2tleSk7Cit9CisKK3N0YXRpYyBpbnQgbGxzZWNfcmVtb3ZlX2tleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpZWVlODAyMTU0X21sbWVfb3BzICpvcHMgPSBpZWVlODAyMTU0X21sbWVfb3BzKGRldik7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkIGlkOworCisJaWYgKGllZWU4MDIxNTRfbGxzZWNfcGFyc2Vfa2V5X2lkKGluZm8sICZpZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG9wcy0+bGxzZWMtPmRlbF9rZXkoZGV2LCAmaWQpOworfQorCitpbnQgaWVlZTgwMjE1NF9sbHNlY19kZWxfa2V5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJcmV0dXJuIGllZWU4MDIxNTRfbmxfbGxzZWNfY2hhbmdlKHNrYiwgaW5mbywgbGxzZWNfcmVtb3ZlX2tleSk7Cit9CisKK3N0YXRpYyBpbnQKK2llZWU4MDIxNTRfbmxfZmlsbF9rZXkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9lbnRyeSAqa2V5LAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2lkICpoZHI7CisJdTMyIGNvbW1hbmRzWzI1NiAvIDMyXTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmbmw4MDIxNTRfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0tFWSk7CisJaWYgKCFoZHIpCisJCWdvdG8gb3V0OworCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9OQU1FLCBkZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9JTkRFWCwgZGV2LT5pZmluZGV4KSB8fAorCSAgICBpZWVlODAyMTU0X2xsc2VjX2ZpbGxfa2V5X2lkKG1zZywgJmtleS0+aWQpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1VTQUdFX0ZSQU1FX1RZUEVTLAorCQkgICAgICAga2V5LT5rZXktPmZyYW1lX3R5cGVzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoa2V5LT5rZXktPmZyYW1lX3R5cGVzICYgQklUKElFRUU4MDIxNTRfRkNfVFlQRV9NQUNfQ01EKSkgeworCQltZW1zZXQoY29tbWFuZHMsIDAsIHNpemVvZihjb21tYW5kcykpOworCQljb21tYW5kc1s3XSA9IGtleS0+a2V5LT5jbWRfZnJhbWVfaWRzOworCQlpZiAobmxhX3B1dChtc2csIElFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfVVNBR0VfQ09NTUFORFMsCisJCQkgICAgc2l6ZW9mKGNvbW1hbmRzKSwgY29tbWFuZHMpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCisJaWYgKG5sYV9wdXQobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX0JZVEVTLAorCQkgICAgSUVFRTgwMjE1NF9MTFNFQ19LRVlfU0laRSwga2V5LT5rZXktPmtleSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworb3V0OgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgbGxzZWNfaXRlcl9rZXlzKHN0cnVjdCBsbHNlY19kdW1wX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2VudHJ5ICpwb3M7CisJaW50IHJjID0gMCwgaWR4ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmZGF0YS0+dGFibGUtPmtleXMsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgZGF0YS0+c19pZHgpCisJCQljb250aW51ZTsKKworCQlpZiAoaWVlZTgwMjE1NF9ubF9maWxsX2tleShkYXRhLT5za2IsIGRhdGEtPnBvcnRpZCwKKwkJCQkJICAgZGF0YS0+bmxtc2dfc2VxLCBwb3MsIGRhdGEtPmRldikpIHsKKwkJCXJjID0gLUVNU0dTSVpFOworCQkJYnJlYWs7CisJCX0KKworCQlkYXRhLT5zX2lkeCsrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9rZXlzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlyZXR1cm4gaWVlZTgwMjE1NF9sbHNlY19kdW1wX3RhYmxlKHNrYiwgY2IsIGxsc2VjX2l0ZXJfa2V5cyk7Cit9CisKKworCitzdGF0aWMgaW50CitsbHNlY19wYXJzZV9kZXYoc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXYpCit7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKKworCWlmICghaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX0NPVU5URVJdIHx8CisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0gfHwKKwkgICAgIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19ERVZfT1ZFUlJJREVdIHx8CisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX0tFWV9NT0RFXSB8fAorCSAgICAoISFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfUEFOX0lEXSAhPQorCSAgICAgISFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfU0hPUlRfQUREUl0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfUEFOX0lEXSkgeworCQlkZXYtPnBhbl9pZCA9IG5sYV9nZXRfc2hvcnRhZGRyKGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9QQU5fSURdKTsKKwkJZGV2LT5zaG9ydF9hZGRyID0gbmxhX2dldF9zaG9ydGFkZHIoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX1NIT1JUX0FERFJdKTsKKwl9IGVsc2UgeworCQlkZXYtPnNob3J0X2FkZHIgPSBjcHVfdG9fbGUxNihJRUVFODAyMTU0X0FERFJfVU5ERUYpOworCX0KKworCWRldi0+aHdhZGRyID0gbmxhX2dldF9od2FkZHIoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0hXX0FERFJdKTsKKwlkZXYtPmZyYW1lX2NvdW50ZXIgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfRlJBTUVfQ09VTlRFUl0pOworCWRldi0+c2VjbGV2ZWxfZXhlbXB0ID0gISFubGFfZ2V0X3U4KGluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19ERVZfT1ZFUlJJREVdKTsKKwlkZXYtPmtleV9tb2RlID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX0tFWV9NT0RFXSk7CisKKwlpZiAoZGV2LT5rZXlfbW9kZSA+PSBfX0lFRUU4MDIxNTRfTExTRUNfREVWS0VZX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbHNlY19hZGRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2UgZGVzYzsKKworCWlmIChsbHNlY19wYXJzZV9kZXYoaW5mbywgJmRlc2MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvcHMtPmxsc2VjLT5hZGRfZGV2KGRldiwgJmRlc2MpOworfQorCitpbnQgaWVlZTgwMjE1NF9sbHNlY19hZGRfZGV2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJaWYgKChpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiAoTkxNX0ZfQ1JFQVRFIHwgTkxNX0ZfRVhDTCkpICE9CisJICAgIChOTE1fRl9DUkVBVEUgfCBOTE1fRl9FWENMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaWVlZTgwMjE1NF9ubF9sbHNlY19jaGFuZ2Uoc2tiLCBpbmZvLCBsbHNlY19hZGRfZGV2KTsKK30KKworc3RhdGljIGludCBsbHNlY19kZWxfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlfX2xlNjQgZGV2YWRkcjsKKworCWlmICghaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0hXX0FERFJdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldmFkZHIgPSBubGFfZ2V0X2h3YWRkcihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0pOworCisJcmV0dXJuIG9wcy0+bGxzZWMtPmRlbF9kZXYoZGV2LCBkZXZhZGRyKTsKK30KKworaW50IGllZWU4MDIxNTRfbGxzZWNfZGVsX2RldihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXJldHVybiBpZWVlODAyMTU0X25sX2xsc2VjX2NoYW5nZShza2IsIGluZm8sIGxsc2VjX2RlbF9kZXYpOworfQorCitzdGF0aWMgaW50CitpZWVlODAyMTU0X25sX2ZpbGxfZGV2KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2UgKmRlc2MsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKmhkcjsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmbmw4MDIxNTRfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgSUVFRTgwMjE1NF9MTFNFQ19MSVNUX0RFVik7CisJaWYgKCFoZHIpCisJCWdvdG8gb3V0OworCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9OQU1FLCBkZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9JTkRFWCwgZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3Nob3J0YWRkcihtc2csIElFRUU4MDIxNTRfQVRUUl9QQU5fSUQsIGRlc2MtPnBhbl9pZCkgfHwKKwkgICAgbmxhX3B1dF9zaG9ydGFkZHIobXNnLCBJRUVFODAyMTU0X0FUVFJfU0hPUlRfQUREUiwKKwkJCSAgICAgIGRlc2MtPnNob3J0X2FkZHIpIHx8CisJICAgIG5sYV9wdXRfaHdhZGRyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0hXX0FERFIsIGRlc2MtPmh3YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfRlJBTUVfQ09VTlRFUiwKKwkJCWRlc2MtPmZyYW1lX2NvdW50ZXIpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX09WRVJSSURFLAorCQkgICAgICAgZGVzYy0+c2VjbGV2ZWxfZXhlbXB0KSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0RFVl9LRVlfTU9ERSwgZGVzYy0+a2V5X21vZGUpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKK291dDoKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGxsc2VjX2l0ZXJfZGV2cyhzdHJ1Y3QgbGxzZWNfZHVtcF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZSAqcG9zOworCWludCByYyA9IDAsIGlkeCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRhdGEtPnRhYmxlLT5kZXZpY2VzLCBsaXN0KSB7CisJCWlmIChpZHgrKyA8IGRhdGEtPnNfaWR4KQorCQkJY29udGludWU7CisKKwkJaWYgKGllZWU4MDIxNTRfbmxfZmlsbF9kZXYoZGF0YS0+c2tiLCBkYXRhLT5wb3J0aWQsCisJCQkJCSAgIGRhdGEtPm5sbXNnX3NlcSwgcG9zLCBkYXRhLT5kZXYpKSB7CisJCQlyYyA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGF0YS0+c19pZHgrKzsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBpZWVlODAyMTU0X2xsc2VjX2R1bXBfZGV2cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIGllZWU4MDIxNTRfbGxzZWNfZHVtcF90YWJsZShza2IsIGNiLCBsbHNlY19pdGVyX2RldnMpOworfQorCisKKworc3RhdGljIGludCBsbHNlY19hZGRfZGV2a2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5IGtleTsKKwlfX2xlNjQgZGV2YWRkcjsKKworCWlmICghaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX0NPVU5URVJdIHx8CisJICAgICFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0gfHwKKwkgICAgaWVlZTgwMjE1NF9sbHNlY19wYXJzZV9rZXlfaWQoaW5mbywgJmtleS5rZXlfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldmFkZHIgPSBubGFfZ2V0X2h3YWRkcihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0pOworCWtleS5mcmFtZV9jb3VudGVyID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX0NPVU5URVJdKTsKKworCXJldHVybiBvcHMtPmxsc2VjLT5hZGRfZGV2a2V5KGRldiwgZGV2YWRkciwgJmtleSk7Cit9CisKK2ludCBpZWVlODAyMTU0X2xsc2VjX2FkZF9kZXZrZXkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpZiAoKGluZm8tPm5saGRyLT5ubG1zZ19mbGFncyAmIChOTE1fRl9DUkVBVEUgfCBOTE1fRl9FWENMKSkgIT0KKwkgICAgKE5MTV9GX0NSRUFURSB8IE5MTV9GX0VYQ0wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpZWVlODAyMTU0X25sX2xsc2VjX2NoYW5nZShza2IsIGluZm8sIGxsc2VjX2FkZF9kZXZrZXkpOworfQorCitzdGF0aWMgaW50IGxsc2VjX2RlbF9kZXZrZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9tbG1lX29wcyAqb3BzID0gaWVlZTgwMjE1NF9tbG1lX29wcyhkZXYpOworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZV9rZXkga2V5OworCV9fbGU2NCBkZXZhZGRyOworCisJaWYgKCFpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0gfHwKKwkgICAgaWVlZTgwMjE1NF9sbHNlY19wYXJzZV9rZXlfaWQoaW5mbywgJmtleS5rZXlfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldmFkZHIgPSBubGFfZ2V0X2h3YWRkcihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0pOworCisJcmV0dXJuIG9wcy0+bGxzZWMtPmRlbF9kZXZrZXkoZGV2LCBkZXZhZGRyLCAma2V5KTsKK30KKworaW50IGllZWU4MDIxNTRfbGxzZWNfZGVsX2RldmtleShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXJldHVybiBpZWVlODAyMTU0X25sX2xsc2VjX2NoYW5nZShza2IsIGluZm8sIGxsc2VjX2RlbF9kZXZrZXkpOworfQorCitzdGF0aWMgaW50CitpZWVlODAyMTU0X25sX2ZpbGxfZGV2a2V5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgIF9fbGU2NCBkZXZhZGRyLAorCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICpkZXZrZXksCisJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCAqaGRyOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCAwLCBzZXEsICZubDgwMjE1NF9mYW1pbHksIE5MTV9GX01VTFRJLAorCQkJICBJRUVFODAyMTU0X0xMU0VDX0xJU1RfREVWS0VZKTsKKwlpZiAoIWhkcikKKwkJZ290byBvdXQ7CisKKwlpZiAobmxhX3B1dF9zdHJpbmcobXNnLCBJRUVFODAyMTU0X0FUVFJfREVWX05BTUUsIGRldi0+bmFtZSkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBJRUVFODAyMTU0X0FUVFJfREVWX0lOREVYLCBkZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfaHdhZGRyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0hXX0FERFIsIGRldmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX0NPVU5URVIsCisJCQlkZXZrZXktPmZyYW1lX2NvdW50ZXIpIHx8CisJICAgIGllZWU4MDIxNTRfbGxzZWNfZmlsbF9rZXlfaWQobXNnLCAmZGV2a2V5LT5rZXlfaWQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKK291dDoKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGxsc2VjX2l0ZXJfZGV2a2V5cyhzdHJ1Y3QgbGxzZWNfZHVtcF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZSAqZHBvczsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICprcG9zOworCWludCByYyA9IDAsIGlkeCA9IDAsIGlkeDI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRwb3MsICZkYXRhLT50YWJsZS0+ZGV2aWNlcywgbGlzdCkgeworCQlpZiAoaWR4KysgPCBkYXRhLT5zX2lkeCkKKwkJCWNvbnRpbnVlOworCisJCWlkeDIgPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa3BvcywgJmRwb3MtPmtleXMsIGxpc3QpIHsKKwkJCWlmIChpZHgyKysgPCBkYXRhLT5zX2lkeDIpCisJCQkJY29udGludWU7CisKKwkJCWlmIChpZWVlODAyMTU0X25sX2ZpbGxfZGV2a2V5KGRhdGEtPnNrYiwgZGF0YS0+cG9ydGlkLAorCQkJCQkJICAgICAgZGF0YS0+bmxtc2dfc2VxLAorCQkJCQkJICAgICAgZHBvcy0+aHdhZGRyLCBrcG9zLAorCQkJCQkJICAgICAgZGF0YS0+ZGV2KSkgeworCQkJCXJldHVybiByYyA9IC1FTVNHU0laRTsKKwkJCX0KKworCQkJZGF0YS0+c19pZHgyKys7CisJCX0KKworCQlkYXRhLT5zX2lkeCsrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGllZWU4MDIxNTRfbGxzZWNfZHVtcF9kZXZrZXlzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIGllZWU4MDIxNTRfbGxzZWNfZHVtcF90YWJsZShza2IsIGNiLCBsbHNlY19pdGVyX2RldmtleXMpOworfQorCisKKworc3RhdGljIGludAorbGxzZWNfcGFyc2Vfc2VjbGV2ZWwoc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpCit7CisJbWVtc2V0KHNsLCAwLCBzaXplb2YoKnNsKSk7CisKKwlpZiAoIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19GUkFNRV9UWVBFXSB8fAorCSAgICAhaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMU10gfHwKKwkgICAgIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19ERVZfT1ZFUlJJREVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNsLT5mcmFtZV90eXBlID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfRlJBTUVfVFlQRV0pOworCWlmIChzbC0+ZnJhbWVfdHlwZSA9PSBJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRCkgeworCQlpZiAoIWluZm8tPmF0dHJzW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19DTURfRlJBTUVfSURdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc2wtPmNtZF9mcmFtZV9pZCA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0NNRF9GUkFNRV9JRF0pOworCX0KKworCXNsLT5zZWNfbGV2ZWxzID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfTExTRUNfU0VDTEVWRUxTXSk7CisJc2wtPmRldmljZV9vdmVycmlkZSA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0RFVl9PVkVSUklERV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGxzZWNfYWRkX3NlY2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCBzbDsKKworCWlmIChsbHNlY19wYXJzZV9zZWNsZXZlbChpbmZvLCAmc2wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvcHMtPmxsc2VjLT5hZGRfc2VjbGV2ZWwoZGV2LCAmc2wpOworfQorCitpbnQgaWVlZTgwMjE1NF9sbHNlY19hZGRfc2VjbGV2ZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpZiAoKGluZm8tPm5saGRyLT5ubG1zZ19mbGFncyAmIChOTE1fRl9DUkVBVEUgfCBOTE1fRl9FWENMKSkgIT0KKwkgICAgKE5MTV9GX0NSRUFURSB8IE5MTV9GX0VYQ0wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpZWVlODAyMTU0X25sX2xsc2VjX2NoYW5nZShza2IsIGluZm8sIGxsc2VjX2FkZF9zZWNsZXZlbCk7Cit9CisKK3N0YXRpYyBpbnQgbGxzZWNfZGVsX3NlY2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCBzbDsKKworCWlmIChsbHNlY19wYXJzZV9zZWNsZXZlbChpbmZvLCAmc2wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvcHMtPmxsc2VjLT5kZWxfc2VjbGV2ZWwoZGV2LCAmc2wpOworfQorCitpbnQgaWVlZTgwMjE1NF9sbHNlY19kZWxfc2VjbGV2ZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gaWVlZTgwMjE1NF9ubF9sbHNlY19jaGFuZ2Uoc2tiLCBpbmZvLCBsbHNlY19kZWxfc2VjbGV2ZWwpOworfQorCitzdGF0aWMgaW50CitpZWVlODAyMTU0X25sX2ZpbGxfc2VjbGV2ZWwoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wsCisJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2lkICpoZHI7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIDAsIHNlcSwgJm5sODAyMTU0X2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkgIElFRUU4MDIxNTRfTExTRUNfTElTVF9TRUNMRVZFTCk7CisJaWYgKCFoZHIpCisJCWdvdG8gb3V0OworCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9OQU1FLCBkZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgSUVFRTgwMjE1NF9BVFRSX0RFVl9JTkRFWCwgZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0ZSQU1FX1RZUEUsIHNsLT5mcmFtZV90eXBlKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgSUVFRTgwMjE1NF9BVFRSX0xMU0VDX1NFQ0xFVkVMUywgc2wtPnNlY19sZXZlbHMpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX09WRVJSSURFLAorCQkgICAgICAgc2wtPmRldmljZV9vdmVycmlkZSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKHNsLT5mcmFtZV90eXBlID09IElFRUU4MDIxNTRfRkNfVFlQRV9NQUNfQ01EICYmCisJICAgIG5sYV9wdXRfdTgobXNnLCBJRUVFODAyMTU0X0FUVFJfTExTRUNfQ01EX0ZSQU1FX0lELAorCQkgICAgICAgc2wtPmNtZF9mcmFtZV9pZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworb3V0OgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgbGxzZWNfaXRlcl9zZWNsZXZlbHMoc3RydWN0IGxsc2VjX2R1bXBfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqcG9zOworCWludCByYyA9IDAsIGlkeCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRhdGEtPnRhYmxlLT5zZWN1cml0eV9sZXZlbHMsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgZGF0YS0+c19pZHgpCisJCQljb250aW51ZTsKKworCQlpZiAoaWVlZTgwMjE1NF9ubF9maWxsX3NlY2xldmVsKGRhdGEtPnNrYiwgZGF0YS0+cG9ydGlkLAorCQkJCQkJZGF0YS0+bmxtc2dfc2VxLCBwb3MsCisJCQkJCQlkYXRhLT5kZXYpKSB7CisJCQlyYyA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGF0YS0+c19pZHgrKzsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBpZWVlODAyMTU0X2xsc2VjX2R1bXBfc2VjbGV2ZWxzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlyZXR1cm4gaWVlZTgwMjE1NF9sbHNlY19kdW1wX3RhYmxlKHNrYiwgY2IsIGxsc2VjX2l0ZXJfc2VjbGV2ZWxzKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sX3BvbGljeS5jIGIvbmV0L2llZWU4MDIxNTQvbmxfcG9saWN5LmMKaW5kZXggZmQ3YmU1ZS4uM2E3MDNhYjggMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L25sX3BvbGljeS5jCisrKyBiL25ldC9pZWVlODAyMTU0L25sX3BvbGljeS5jCkBAIC02Miw1ICs2MiwyMSBAQAogCVtJRUVFODAyMTU0X0FUVFJfQ1NNQV9NQVhfQkVdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKIAogCVtJRUVFODAyMTU0X0FUVFJfRlJBTUVfUkVUUklFU10gPSB7IC50eXBlID0gTkxBX1M4LCB9LAorCisJW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19FTkFCTEVEXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCisJW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19TRUNMRVZFTF0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX01PREVdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKKwlbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9TT1VSQ0VfU0hPUlRdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCisJW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfU09VUkNFX0VYVEVOREVEXSA9IHsgLnR5cGUgPSBOTEFfSFdfQUREUiwgfSwKKwlbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0tFWV9JRF0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfRlJBTUVfQ09VTlRFUl0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX0JZVEVTXSA9IHsgLmxlbiA9IDE2LCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfS0VZX1VTQUdFX0ZSQU1FX1RZUEVTXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCisJW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19LRVlfVVNBR0VfQ09NTUFORFNdID0geyAubGVuID0gMjU4IC8gOCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfRlJBTUVfVFlQRV0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfQ01EX0ZSQU1FX0lEXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCisJW0lFRUU4MDIxNTRfQVRUUl9MTFNFQ19TRUNMRVZFTFNdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKKwlbSUVFRTgwMjE1NF9BVFRSX0xMU0VDX0RFVl9PVkVSUklERV0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAorCVtJRUVFODAyMTU0X0FUVFJfTExTRUNfREVWX0tFWV9NT0RFXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9yZWFzc2VtYmx5LmMgYi9uZXQvaWVlZTgwMjE1NC9yZWFzc2VtYmx5LmMKaW5kZXggZWYyZDU0My4uNmYxNDI4YyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvcmVhc3NlbWJseS5jCisrKyBiL25ldC9pZWVlODAyMTU0L3JlYXNzZW1ibHkuYwpAQCAtMzYsNyArMzYsNyBAQAogCXU4IGRfb2Zmc2V0OwogfTsKIAotc3RydWN0IGxvd3Bhbl9mcmFnX2luZm8gKmxvd3Bhbl9jYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHN0cnVjdCBsb3dwYW5fZnJhZ19pbmZvICpsb3dwYW5fY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gKHN0cnVjdCBsb3dwYW5fZnJhZ19pbmZvICopc2tiLT5jYjsKIH0KQEAgLTEyMCw2ICsxMjAsOCBAQAogCXN0cnVjdCBpbmV0X2ZyYWdfcXVldWUgKnE7CiAJc3RydWN0IGxvd3Bhbl9jcmVhdGVfYXJnIGFyZzsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKKwlzdHJ1Y3QgbmV0bnNfaWVlZTgwMjE1NF9sb3dwYW4gKmllZWU4MDIxNTRfbG93cGFuID0KKwkJbmV0X2llZWU4MDIxNTRfbG93cGFuKG5ldCk7CiAKIAlhcmcudGFnID0gZnJhZ19pbmZvLT5kX3RhZzsKIAlhcmcuZF9zaXplID0gZnJhZ19pbmZvLT5kX3NpemU7CkBAIC0xMjksNyArMTMxLDcgQEAKIAlyZWFkX2xvY2soJmxvd3Bhbl9mcmFncy5sb2NrKTsKIAloYXNoID0gbG93cGFuX2hhc2hfZnJhZyhmcmFnX2luZm8tPmRfdGFnLCBmcmFnX2luZm8tPmRfc2l6ZSwgc3JjLCBkc3QpOwogCi0JcSA9IGluZXRfZnJhZ19maW5kKCZuZXQtPmllZWU4MDIxNTRfbG93cGFuLmZyYWdzLAorCXEgPSBpbmV0X2ZyYWdfZmluZCgmaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzLAogCQkJICAgJmxvd3Bhbl9mcmFncywgJmFyZywgaGFzaCk7CiAJaWYgKElTX0VSUl9PUl9OVUxMKHEpKSB7CiAJCWluZXRfZnJhZ19tYXliZV93YXJuX292ZXJmbG93KHEsIHByX2ZtdCgpKTsKQEAgLTM1Nyw2ICszNTksOCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kZXYpOwogCXN0cnVjdCBsb3dwYW5fZnJhZ19pbmZvICpmcmFnX2luZm8gPSBsb3dwYW5fY2Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjE1NF9hZGRyIHNvdXJjZSwgZGVzdDsKKwlzdHJ1Y3QgbmV0bnNfaWVlZTgwMjE1NF9sb3dwYW4gKmllZWU4MDIxNTRfbG93cGFuID0KKwkJbmV0X2llZWU4MDIxNTRfbG93cGFuKG5ldCk7CiAJaW50IGVycjsKIAogCXNvdXJjZSA9IG1hY19jYihza2IpLT5zb3VyY2U7CkBAIC0zNjYsMTAgKzM3MCwxMCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjsKIAotCWlmIChmcmFnX2luZm8tPmRfc2l6ZSA+IG5ldC0+aWVlZTgwMjE1NF9sb3dwYW4ubWF4X2RzaXplKQorCWlmIChmcmFnX2luZm8tPmRfc2l6ZSA+IGllZWU4MDIxNTRfbG93cGFuLT5tYXhfZHNpemUpCiAJCWdvdG8gZXJyOwogCi0JaW5ldF9mcmFnX2V2aWN0b3IoJm5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uZnJhZ3MsICZsb3dwYW5fZnJhZ3MsIGZhbHNlKTsKKwlpbmV0X2ZyYWdfZXZpY3RvcigmaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzLCAmbG93cGFuX2ZyYWdzLCBmYWxzZSk7CiAKIAlmcSA9IGZxX2ZpbmQobmV0LCBmcmFnX2luZm8sICZzb3VyY2UsICZkZXN0KTsKIAlpZiAoZnEgIT0gTlVMTCkgewpAQCAtNDM2LDYgKzQ0MCw4IEBACiB7CiAJc3RydWN0IGN0bF90YWJsZSAqdGFibGU7CiAJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhkcjsKKwlzdHJ1Y3QgbmV0bnNfaWVlZTgwMjE1NF9sb3dwYW4gKmllZWU4MDIxNTRfbG93cGFuID0KKwkJbmV0X2llZWU4MDIxNTRfbG93cGFuKG5ldCk7CiAKIAl0YWJsZSA9IGxvd3Bhbl9mcmFnc19uc19jdGxfdGFibGU7CiAJaWYgKCFuZXRfZXEobmV0LCAmaW5pdF9uZXQpKSB7CkBAIC00NDQsMTAgKzQ1MCwxMCBAQAogCQlpZiAodGFibGUgPT0gTlVMTCkKIAkJCWdvdG8gZXJyX2FsbG9jOwogCi0JCXRhYmxlWzBdLmRhdGEgPSAmbmV0LT5pZWVlODAyMTU0X2xvd3Bhbi5mcmFncy5oaWdoX3RocmVzaDsKLQkJdGFibGVbMV0uZGF0YSA9ICZuZXQtPmllZWU4MDIxNTRfbG93cGFuLmZyYWdzLmxvd190aHJlc2g7Ci0JCXRhYmxlWzJdLmRhdGEgPSAmbmV0LT5pZWVlODAyMTU0X2xvd3Bhbi5mcmFncy50aW1lb3V0OwotCQl0YWJsZVszXS5kYXRhID0gJm5ldC0+aWVlZTgwMjE1NF9sb3dwYW4ubWF4X2RzaXplOworCQl0YWJsZVswXS5kYXRhID0gJmllZWU4MDIxNTRfbG93cGFuLT5mcmFncy5oaWdoX3RocmVzaDsKKwkJdGFibGVbMV0uZGF0YSA9ICZpZWVlODAyMTU0X2xvd3Bhbi0+ZnJhZ3MubG93X3RocmVzaDsKKwkJdGFibGVbMl0uZGF0YSA9ICZpZWVlODAyMTU0X2xvd3Bhbi0+ZnJhZ3MudGltZW91dDsKKwkJdGFibGVbM10uZGF0YSA9ICZpZWVlODAyMTU0X2xvd3Bhbi0+bWF4X2RzaXplOwogCiAJCS8qIERvbid0IGV4cG9ydCBzeXNjdGxzIHRvIHVucHJpdmlsZWdlZCB1c2VycyAqLwogCQlpZiAobmV0LT51c2VyX25zICE9ICZpbml0X3VzZXJfbnMpCkBAIC00NTgsNyArNDY0LDcgQEAKIAlpZiAoaGRyID09IE5VTEwpCiAJCWdvdG8gZXJyX3JlZzsKIAotCW5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uc3lzY3RsLmZyYWdzX2hkciA9IGhkcjsKKwlpZWVlODAyMTU0X2xvd3Bhbi0+c3lzY3RsLmZyYWdzX2hkciA9IGhkcjsKIAlyZXR1cm4gMDsKIAogZXJyX3JlZzoKQEAgLTQ3MSw5ICs0NzcsMTEgQEAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgbG93cGFuX2ZyYWdzX25zX3N5c2N0bF91bnJlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgbmV0bnNfaWVlZTgwMjE1NF9sb3dwYW4gKmllZWU4MDIxNTRfbG93cGFuID0KKwkJbmV0X2llZWU4MDIxNTRfbG93cGFuKG5ldCk7CiAKLQl0YWJsZSA9IG5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uc3lzY3RsLmZyYWdzX2hkci0+Y3RsX3RhYmxlX2FyZzsKLQl1bnJlZ2lzdGVyX25ldF9zeXNjdGxfdGFibGUobmV0LT5pZWVlODAyMTU0X2xvd3Bhbi5zeXNjdGwuZnJhZ3NfaGRyKTsKKwl0YWJsZSA9IGllZWU4MDIxNTRfbG93cGFuLT5zeXNjdGwuZnJhZ3NfaGRyLT5jdGxfdGFibGVfYXJnOworCXVucmVnaXN0ZXJfbmV0X3N5c2N0bF90YWJsZShpZWVlODAyMTU0X2xvd3Bhbi0+c3lzY3RsLmZyYWdzX2hkcik7CiAJaWYgKCFuZXRfZXEobmV0LCAmaW5pdF9uZXQpKQogCQlrZnJlZSh0YWJsZSk7CiB9CkBAIC01MTQsMjAgKzUyMiwyNiBAQAogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgbG93cGFuX2ZyYWdzX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZXQtPmllZWU4MDIxNTRfbG93cGFuLmZyYWdzLmhpZ2hfdGhyZXNoID0gSVBWNl9GUkFHX0hJR0hfVEhSRVNIOwotCW5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uZnJhZ3MubG93X3RocmVzaCA9IElQVjZfRlJBR19MT1dfVEhSRVNIOwotCW5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uZnJhZ3MudGltZW91dCA9IElQVjZfRlJBR19USU1FT1VUOwotCW5ldC0+aWVlZTgwMjE1NF9sb3dwYW4ubWF4X2RzaXplID0gMHhGRkZGOworCXN0cnVjdCBuZXRuc19pZWVlODAyMTU0X2xvd3BhbiAqaWVlZTgwMjE1NF9sb3dwYW4gPQorCQluZXRfaWVlZTgwMjE1NF9sb3dwYW4obmV0KTsKIAotCWluZXRfZnJhZ3NfaW5pdF9uZXQoJm5ldC0+aWVlZTgwMjE1NF9sb3dwYW4uZnJhZ3MpOworCWllZWU4MDIxNTRfbG93cGFuLT5mcmFncy5oaWdoX3RocmVzaCA9IElQVjZfRlJBR19ISUdIX1RIUkVTSDsKKwlpZWVlODAyMTU0X2xvd3Bhbi0+ZnJhZ3MubG93X3RocmVzaCA9IElQVjZfRlJBR19MT1dfVEhSRVNIOworCWllZWU4MDIxNTRfbG93cGFuLT5mcmFncy50aW1lb3V0ID0gSVBWNl9GUkFHX1RJTUVPVVQ7CisJaWVlZTgwMjE1NF9sb3dwYW4tPm1heF9kc2l6ZSA9IDB4RkZGRjsKKworCWluZXRfZnJhZ3NfaW5pdF9uZXQoJmllZWU4MDIxNTRfbG93cGFuLT5mcmFncyk7CiAKIAlyZXR1cm4gbG93cGFuX2ZyYWdzX25zX3N5c2N0bF9yZWdpc3RlcihuZXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IGxvd3Bhbl9mcmFnc19leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7CisJc3RydWN0IG5ldG5zX2llZWU4MDIxNTRfbG93cGFuICppZWVlODAyMTU0X2xvd3BhbiA9CisJCW5ldF9pZWVlODAyMTU0X2xvd3BhbihuZXQpOworCiAJbG93cGFuX2ZyYWdzX25zX3N5c2N0bF91bnJlZ2lzdGVyKG5ldCk7Ci0JaW5ldF9mcmFnc19leGl0X25ldCgmbmV0LT5pZWVlODAyMTU0X2xvd3Bhbi5mcmFncywgJmxvd3Bhbl9mcmFncyk7CisJaW5ldF9mcmFnc19leGl0X25ldCgmaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzLCAmbG93cGFuX2ZyYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBsb3dwYW5fZnJhZ3Nfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDZkNmRkMzQuLmQ1ZTY4MzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTI1NCw3ICsyNTQsNiBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CiAJc3RydWN0IHByb3RvICphbnN3ZXJfcHJvdDsKIAl1bnNpZ25lZCBjaGFyIGFuc3dlcl9mbGFnczsKLQljaGFyIGFuc3dlcl9ub19jaGVjazsKIAlpbnQgdHJ5X2xvYWRpbmdfbW9kdWxlID0gMDsKIAlpbnQgZXJyOwogCkBAIC0zMTIsNyArMzExLDYgQEAKIAogCXNvY2stPm9wcyA9IGFuc3dlci0+b3BzOwogCWFuc3dlcl9wcm90ID0gYW5zd2VyLT5wcm90OwotCWFuc3dlcl9ub19jaGVjayA9IGFuc3dlci0+bm9fY2hlY2s7CiAJYW5zd2VyX2ZsYWdzID0gYW5zd2VyLT5mbGFnczsKIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtMzI0LDcgKzMyMiw2IEBACiAJCWdvdG8gb3V0OwogCiAJZXJyID0gMDsKLQlzay0+c2tfbm9fY2hlY2sgPSBhbnN3ZXJfbm9fY2hlY2s7CiAJaWYgKElORVRfUFJPVE9TV19SRVVTRSAmIGFuc3dlcl9mbGFncykKIAkJc2stPnNrX3JldXNlID0gU0tfQ0FOX1JFVVNFOwogCkBAIC0xMDAyLDcgKzk5OSw2IEBACiAJCS5wcm90b2NvbCA9ICAgSVBQUk9UT19UQ1AsCiAJCS5wcm90ID0gICAgICAgJnRjcF9wcm90LAogCQkub3BzID0gICAgICAgICZpbmV0X3N0cmVhbV9vcHMsCi0JCS5ub19jaGVjayA9ICAgMCwKIAkJLmZsYWdzID0gICAgICBJTkVUX1BST1RPU1dfUEVSTUFORU5UIHwKIAkJCSAgICAgIElORVRfUFJPVE9TV19JQ1NLLAogCX0sCkBAIC0xMDEyLDcgKzEwMDgsNiBAQAogCQkucHJvdG9jb2wgPSAgIElQUFJPVE9fVURQLAogCQkucHJvdCA9ICAgICAgICZ1ZHBfcHJvdCwKIAkJLm9wcyA9ICAgICAgICAmaW5ldF9kZ3JhbV9vcHMsCi0JCS5ub19jaGVjayA9ICAgVURQX0NTVU1fREVGQVVMVCwKIAkJLmZsYWdzID0gICAgICBJTkVUX1BST1RPU1dfUEVSTUFORU5ULAogICAgICAgIH0sCiAKQEAgLTEwMjEsNyArMTAxNiw2IEBACiAJCS5wcm90b2NvbCA9ICAgSVBQUk9UT19JQ01QLAogCQkucHJvdCA9ICAgICAgICZwaW5nX3Byb3QsCiAJCS5vcHMgPSAgICAgICAgJmluZXRfZGdyYW1fb3BzLAotCQkubm9fY2hlY2sgPSAgIFVEUF9DU1VNX0RFRkFVTFQsCiAJCS5mbGFncyA9ICAgICAgSU5FVF9QUk9UT1NXX1JFVVNFLAogICAgICAgIH0sCiAKQEAgLTEwMzAsNyArMTAyNCw2IEBACiAJICAgICAgIC5wcm90b2NvbCA9ICAgSVBQUk9UT19JUCwJLyogd2lsZCBjYXJkICovCiAJICAgICAgIC5wcm90ID0gICAgICAgJnJhd19wcm90LAogCSAgICAgICAub3BzID0gICAgICAgICZpbmV0X3NvY2tyYXdfb3BzLAotCSAgICAgICAubm9fY2hlY2sgPSAgIFVEUF9DU1VNX0RFRkFVTFQsCiAJICAgICAgIC5mbGFncyA9ICAgICAgSU5FVF9QUk9UT1NXX1JFVVNFLAogICAgICAgIH0KIH07CkBAIC0xMjYxLDEwICsxMjU0LDEyIEBACiAJCSAgICAgICBTS0JfR1NPX0RPREdZIHwKIAkJICAgICAgIFNLQl9HU09fVENQX0VDTiB8CiAJCSAgICAgICBTS0JfR1NPX0dSRSB8CisJCSAgICAgICBTS0JfR1NPX0dSRV9DU1VNIHwKIAkJICAgICAgIFNLQl9HU09fSVBJUCB8CiAJCSAgICAgICBTS0JfR1NPX1NJVCB8CiAJCSAgICAgICBTS0JfR1NPX1RDUFY2IHwKIAkJICAgICAgIFNLQl9HU09fVURQX1RVTk5FTCB8CisJCSAgICAgICBTS0JfR1NPX1VEUF9UVU5ORUxfQ1NVTSB8CiAJCSAgICAgICBTS0JfR1NPX01QTFMgfAogCQkgICAgICAgMCkpKQogCQlnb3RvIG91dDsKQEAgLTE0NzYsMjIgKzE0NzEsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3RsX3NvY2tfY3JlYXRlKTsKIAotdW5zaWduZWQgbG9uZyBzbm1wX2ZvbGRfZmllbGQodm9pZCBfX3BlcmNwdSAqbWliW10sIGludCBvZmZ0KQordW5zaWduZWQgbG9uZyBzbm1wX2ZvbGRfZmllbGQodm9pZCBfX3BlcmNwdSAqbWliLCBpbnQgb2ZmdCkKIHsKIAl1bnNpZ25lZCBsb25nIHJlcyA9IDA7Ci0JaW50IGksIGo7CisJaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlmb3IgKGogPSAwOyBqIDwgU05NUF9BUlJBWV9TWjsgaisrKQotCQkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopIHBlcl9jcHVfcHRyKG1pYltqXSwgaSkpICsgb2ZmdCk7Ci0JfQorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliLCBpKSkgKyBvZmZ0KTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9mb2xkX2ZpZWxkKTsKIAogI2lmIEJJVFNfUEVSX0xPTkc9PTMyCiAKLXU2NCBzbm1wX2ZvbGRfZmllbGQ2NCh2b2lkIF9fcGVyY3B1ICptaWJbXSwgaW50IG9mZnQsIHNpemVfdCBzeW5jcF9vZmZzZXQpCit1NjQgc25tcF9mb2xkX2ZpZWxkNjQodm9pZCBfX3BlcmNwdSAqbWliLCBpbnQgb2ZmdCwgc2l6ZV90IHN5bmNwX29mZnNldCkKIHsKIAl1NjQgcmVzID0gMDsKIAlpbnQgY3B1OwpAQCAtMTUwMiw3ICsxNDk1LDcgQEAKIAkJdTY0IHY7CiAJCXVuc2lnbmVkIGludCBzdGFydDsKIAotCQliaHB0ciA9IHBlcl9jcHVfcHRyKG1pYlswXSwgY3B1KTsKKwkJYmhwdHIgPSBwZXJfY3B1X3B0cihtaWIsIGNwdSk7CiAJCXN5bmNwID0gKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqKShiaHB0ciArIHN5bmNwX29mZnNldCk7CiAJCWRvIHsKIAkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycShzeW5jcCk7CkBAIC0xNTE2LDI1ICsxNTA5LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNubXBfZm9sZF9maWVsZDY0KTsKICNlbmRpZgogCi1pbnQgc25tcF9taWJfaW5pdCh2b2lkIF9fcGVyY3B1ICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgYWxpZ24pCi17Ci0JQlVHX09OKHB0ciA9PSBOVUxMKTsKLQlwdHJbMF0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplLCBhbGlnbik7Ci0JaWYgKCFwdHJbMF0pCi0JCXJldHVybiAtRU5PTUVNOwotCi0jaWYgU05NUF9BUlJBWV9TWiA9PSAyCi0JcHRyWzFdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSwgYWxpZ24pOwotCWlmICghcHRyWzFdKSB7Ci0JCWZyZWVfcGVyY3B1KHB0clswXSk7Ci0JCXB0clswXSA9IE5VTEw7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLSNlbmRpZgotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9taWJfaW5pdCk7Ci0KICNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b2NvbCBpZ21wX3Byb3RvY29sID0gewogCS5oYW5kbGVyID0JaWdtcF9yY3YsCkBAIC0xNTcwLDQwICsxNTQ0LDMwIEBACiB7CiAJaW50IGk7CiAKLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi50Y3Bfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCB0Y3BfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IHRjcF9taWIpKSA8IDApCisJbmV0LT5taWIudGNwX3N0YXRpc3RpY3MgPSBhbGxvY19wZXJjcHUoc3RydWN0IHRjcF9taWIpOworCWlmICghbmV0LT5taWIudGNwX3N0YXRpc3RpY3MpCiAJCWdvdG8gZXJyX3RjcF9taWI7Ci0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwluZXQtPm1pYi5pcF9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBpcHN0YXRzX21pYik7CisJaWYgKCFuZXQtPm1pYi5pcF9zdGF0aXN0aWNzKQogCQlnb3RvIGVycl9pcF9taWI7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3QgaXBzdGF0c19taWIgKmFmX2luZXRfc3RhdHM7Ci0JCWFmX2luZXRfc3RhdHMgPSBwZXJfY3B1X3B0cihuZXQtPm1pYi5pcF9zdGF0aXN0aWNzWzBdLCBpKTsKKwkJYWZfaW5ldF9zdGF0cyA9IHBlcl9jcHVfcHRyKG5ldC0+bWliLmlwX3N0YXRpc3RpY3MsIGkpOwogCQl1NjRfc3RhdHNfaW5pdCgmYWZfaW5ldF9zdGF0cy0+c3luY3ApOwotI2lmIFNOTVBfQVJSQVlfU1ogPT0gMgotCQlhZl9pbmV0X3N0YXRzID0gcGVyX2NwdV9wdHIobmV0LT5taWIuaXBfc3RhdGlzdGljc1sxXSwgaSk7Ci0JCXU2NF9zdGF0c19pbml0KCZhZl9pbmV0X3N0YXRzLT5zeW5jcCk7Ci0jZW5kaWYKIAl9CiAKLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5uZXRfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBsaW51eF9taWIpLAotCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgbGludXhfbWliKSkgPCAwKQorCW5ldC0+bWliLm5ldF9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBsaW51eF9taWIpOworCWlmICghbmV0LT5taWIubmV0X3N0YXRpc3RpY3MpCiAJCWdvdG8gZXJyX25ldF9taWI7Ci0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRpc3RpY3MsCi0JCQkgIHNpemVvZihzdHJ1Y3QgdWRwX21pYiksCi0JCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQorCW5ldC0+bWliLnVkcF9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKKwlpZiAoIW5ldC0+bWliLnVkcF9zdGF0aXN0aWNzKQogCQlnb3RvIGVycl91ZHBfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnVkcGxpdGVfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJbmV0LT5taWIudWRwbGl0ZV9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKKwlpZiAoIW5ldC0+bWliLnVkcGxpdGVfc3RhdGlzdGljcykKIAkJZ290byBlcnJfdWRwbGl0ZV9taWI7Ci0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXBfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXBfbWliKSkgPCAwKQorCW5ldC0+bWliLmljbXBfc3RhdGlzdGljcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaWNtcF9taWIpOworCWlmICghbmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzKQogCQlnb3RvIGVycl9pY21wX21pYjsKIAluZXQtPm1pYi5pY21wbXNnX3N0YXRpc3RpY3MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWNtcG1zZ19taWIpLAogCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKQEAgLTE2MTQsMTcgKzE1NzgsMTcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2ljbXBtc2dfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MpOwogZXJyX2ljbXBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOwogZXJyX3VkcGxpdGVfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLnVkcF9zdGF0aXN0aWNzKTsKIGVycl91ZHBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIubmV0X3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLm5ldF9zdGF0aXN0aWNzKTsKIGVycl9uZXRfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIuaXBfc3RhdGlzdGljcyk7CiBlcnJfaXBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudGNwX3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLnRjcF9zdGF0aXN0aWNzKTsKIGVycl90Y3BfbWliOgogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMTYzMiwxMiArMTU5NiwxMiBAQAogc3RhdGljIF9fbmV0X2V4aXQgdm9pZCBpcHY0X21pYl9leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJa2ZyZWUobmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzKTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXBfc3RhdGlzdGljcyk7Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRpc3RpY3MpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIubmV0X3N0YXRpc3RpY3MpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcyk7Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi50Y3Bfc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLnVkcF9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi5uZXRfc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIuaXBfc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIudGNwX3N0YXRpc3RpY3MpOwogfQogCiBzdGF0aWMgX19uZXRfaW5pdGRhdGEgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGlwdjRfbWliX29wcyA9IHsKQEAgLTE3MzYsMTMgKzE3MDAsOSBAQAogCiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW5ldF9za2JfcGFybSkgPiBGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGNiKSk7CiAKLQlzeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMgPSBremFsbG9jKDY1NTM2IC8gOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMpCi0JCWdvdG8gb3V0OwotCiAJcmMgPSBwcm90b19yZWdpc3RlcigmdGNwX3Byb3QsIDEpOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9yZXNlcnZlZF9wb3J0czsKKwkJZ290byBvdXQ7CiAKIAlyYyA9IHByb3RvX3JlZ2lzdGVyKCZ1ZHBfcHJvdCwgMSk7CiAJaWYgKHJjKQpAQCAtMTg1Miw4ICsxODEyLDYgQEAKIAlwcm90b191bnJlZ2lzdGVyKCZ1ZHBfcHJvdCk7CiBvdXRfdW5yZWdpc3Rlcl90Y3BfcHJvdG86CiAJcHJvdG9fdW5yZWdpc3RlcigmdGNwX3Byb3QpOwotb3V0X2ZyZWVfcmVzZXJ2ZWRfcG9ydHM6Ci0Ja2ZyZWUoc3lzY3RsX2xvY2FsX3Jlc2VydmVkX3BvcnRzKTsKIAlnb3RvIG91dDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGF0YWdyYW0uYyBiL25ldC9pcHY0L2RhdGFncmFtLmMKaW5kZXggOGI1MTM0Yy4uYTMwOTVmZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2NC9kYXRhZ3JhbS5jCkBAIC04NiwxOCArODYsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXA0X2RhdGFncmFtX2Nvbm5lY3QpOwogCisvKiBCZWNhdXNlIFVEUCB4bWl0IHBhdGggY2FuIG1hbmlwdWxhdGUgc2tfZHN0X2NhY2hlIHdpdGhvdXQgaG9sZGluZworICogc29ja2V0IGxvY2ssIHdlIG5lZWQgdG8gdXNlIHNrX2RzdF9zZXQoKSBoZXJlLAorICogZXZlbiBpZiB3ZSBvd24gdGhlIHNvY2tldCBsb2NrLgorICovCiB2b2lkIGlwNF9kYXRhZ3JhbV9yZWxlYXNlX2NiKHN0cnVjdCBzb2NrICpzaykKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGlwX29wdGlvbnNfcmN1ICppbmV0X29wdDsKIAlfX2JlMzIgZGFkZHIgPSBpbmV0LT5pbmV0X2RhZGRyOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAotCWlmICghIF9fc2tfZHN0X2dldChzaykgfHwgX19za19kc3RfY2hlY2soc2ssIDApKQotCQlyZXR1cm47Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CisKKwlkc3QgPSBfX3NrX2RzdF9nZXQoc2spOworCWlmICghZHN0IHx8ICFkc3QtPm9ic29sZXRlIHx8IGRzdC0+b3BzLT5jaGVjayhkc3QsIDApKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQogCWluZXRfb3B0ID0gcmN1X2RlcmVmZXJlbmNlKGluZXQtPmluZXRfb3B0KTsKIAlpZiAoaW5ldF9vcHQgJiYgaW5ldF9vcHQtPm9wdC5zcnIpCiAJCWRhZGRyID0gaW5ldF9vcHQtPm9wdC5mYWRkcjsKQEAgLTEwNSw4ICsxMTMsMTAgQEAKIAkJCQkgICBpbmV0LT5pbmV0X3NhZGRyLCBpbmV0LT5pbmV0X2Rwb3J0LAogCQkJCSAgIGluZXQtPmluZXRfc3BvcnQsIHNrLT5za19wcm90b2NvbCwKIAkJCQkgICBSVF9DT05OX0ZMQUdTKHNrKSwgc2stPnNrX2JvdW5kX2Rldl9pZik7Ci0JaWYgKCFJU19FUlIocnQpKQotCQlfX3NrX2RzdF9zZXQoc2ssICZydC0+ZHN0KTsKKworCWRzdCA9ICFJU19FUlIocnQpID8gJnJ0LT5kc3QgOiBOVUxMOworCXNrX2RzdF9zZXQoc2ssIGRzdCk7CisKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlwNF9kYXRhZ3JhbV9yZWxlYXNlX2NiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCBiZGJmNjhiLi5lOTQ0OTM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0xMDYsNyArMTA2LDYgQEAKICNkZWZpbmUgSU40X0FERFJfSFNJWkUJCSgxVSA8PCBJTjRfQUREUl9IU0laRV9TSElGVCkKIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGluZXRfYWRkcl9sc3RbSU40X0FERFJfSFNJWkVdOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0X2FkZHJfaGFzaF9sb2NrKTsKIAogc3RhdGljIHUzMiBpbmV0X2FkZHJfaGFzaChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBhZGRyKQogewpAQCAtMTE5LDE2ICsxMTgsMTQgQEAKIHsKIAl1MzIgaGFzaCA9IGluZXRfYWRkcl9oYXNoKG5ldCwgaWZhLT5pZmFfbG9jYWwpOwogCi0Jc3Bpbl9sb2NrKCZpbmV0X2FkZHJfaGFzaF9sb2NrKTsKKwlBU1NFUlRfUlROTCgpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmaWZhLT5oYXNoLCAmaW5ldF9hZGRyX2xzdFtoYXNoXSk7Ci0Jc3Bpbl91bmxvY2soJmluZXRfYWRkcl9oYXNoX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0X2hhc2hfcmVtb3ZlKHN0cnVjdCBpbl9pZmFkZHIgKmlmYSkKIHsKLQlzcGluX2xvY2soJmluZXRfYWRkcl9oYXNoX2xvY2spOworCUFTU0VSVF9SVE5MKCk7CiAJaGxpc3RfZGVsX2luaXRfcmN1KCZpZmEtPmhhc2gpOwotCXNwaW5fdW5sb2NrKCZpbmV0X2FkZHJfaGFzaF9sb2NrKTsKIH0KIAogLyoqCkBAIC04MzAsNyArODI3LDcgQEAKIAlpZmFfZXhpc3RpbmcgPSBmaW5kX21hdGNoaW5nX2lmYShpZmEpOwogCWlmICghaWZhX2V4aXN0aW5nKSB7CiAJCS8qIEl0IHdvdWxkIGJlIGJlc3QgdG8gY2hlY2sgZm9yICFOTE1fRl9DUkVBVEUgaGVyZSBidXQKLQkJICogdXNlcnNwYWNlIGFscmVheSByZWxpZXMgb24gbm90IGhhdmluZyB0byBwcm92aWRlIHRoaXMuCisJCSAqIHVzZXJzcGFjZSBhbHJlYWR5IHJlbGllcyBvbiBub3QgaGF2aW5nIHRvIHByb3ZpZGUgdGhpcy4KIAkJICovCiAJCXNldF9pZmFfbGlmZXRpbWUoaWZhLCB2YWxpZF9sZnQsIHByZWZlcmVkX2xmdCk7CiAJCXJldHVybiBfX2luZXRfaW5zZXJ0X2lmYShpZmEsIG5saCwgTkVUTElOS19DQihza2IpLnBvcnRpZCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9ncmVfZGVtdXguYyBiL25ldC9pcHY0L2dyZV9kZW11eC5jCmluZGV4IDI1MGJlNzQuLjRlOTYxOWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2dyZV9kZW11eC5jCisrKyBiL25ldC9pcHY0L2dyZV9kZW11eC5jCkBAIC04NCw3ICs4NCw4IEBACiAJCQlwdHItLTsKIAkJfQogCQlpZiAodHBpLT5mbGFncyZUVU5ORUxfQ1NVTSAmJgotCQkgICAgIShza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19HUkUpKSB7CisJCSAgICAhKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJgorCQkgICAgICAoU0tCX0dTT19HUkV8U0tCX0dTT19HUkVfQ1NVTSkpKSB7CiAJCQkqcHRyID0gMDsKIAkJCSooX19zdW0xNiAqKXB0ciA9IGNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLAogCQkJCQkJCQkgc2tiLT5sZW4sIDApKTsKQEAgLTkzLDI4ICs5NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChncmVfYnVpbGRfaGVhZGVyKTsKIAotc3RhdGljIF9fc3VtMTYgY2hlY2tfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlfX3N1bTE2IGNzdW0gPSAwOwotCi0Jc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewotCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCWNzdW0gPSBjc3VtX2ZvbGQoc2tiLT5jc3VtKTsKLQotCQlpZiAoIWNzdW0pCi0JCQlicmVhazsKLQkJLyogRmFsbCB0aHJvdWdoLiAqLwotCi0JY2FzZSBDSEVDS1NVTV9OT05FOgotCQlza2ItPmNzdW0gPSAwOwotCQljc3VtID0gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNzdW07Ci19Ci0KIHN0YXRpYyBpbnQgcGFyc2VfZ3JlX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdG5sX3B0a19pbmZvICp0cGksCiAJCQkgICAgYm9vbCAqY3N1bV9lcnIpCiB7CkBAIC0xNDEsNyArMTIwLDcgQEAKIAogCW9wdGlvbnMgPSAoX19iZTMyICopKGdyZWggKyAxKTsKIAlpZiAoZ3JlaC0+ZmxhZ3MgJiBHUkVfQ1NVTSkgewotCQlpZiAoY2hlY2tfY2hlY2tzdW0oc2tiKSkgeworCQlpZiAoc2tiX2NoZWNrc3VtX3NpbXBsZV92YWxpZGF0ZShza2IpKSB7CiAJCQkqY3N1bV9lcnIgPSB0cnVlOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMgYi9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jCmluZGV4IGYxZDMyMjguLmViOTJkZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYwpAQCAtNDIsNiArNDIsNyBAQAogCQkJCSAgU0tCX0dTT19ET0RHWSB8CiAJCQkJICBTS0JfR1NPX1RDUF9FQ04gfAogCQkJCSAgU0tCX0dTT19HUkUgfAorCQkJCSAgU0tCX0dTT19HUkVfQ1NVTSB8CiAJCQkJICBTS0JfR1NPX0lQSVApKSkKIAkJZ290byBvdXQ7CiAKQEAgLTU1LDYgKzU2LDggQEAKIAkJZ290byBvdXQ7CiAKIAljc3VtID0gISEoZ3JlaC0+ZmxhZ3MgJiBHUkVfQ1NVTSk7CisJaWYgKGNzdW0pCisJCXNrYi0+ZW5jYXBfaGRyX2NzdW0gPSAxOwogCiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgZ2hsKSkpCiAJCWdvdG8gb3V0OwpAQCAtOTQsMTAgKzk3LDEzIEBACiAJCQkJfQogCQkJfQogCi0JCQlncmVoID0gKHN0cnVjdCBncmVfYmFzZV9oZHIgKikoc2tiLT5kYXRhKTsKKwkJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisKKwkJCWdyZWggPSAoc3RydWN0IGdyZV9iYXNlX2hkciAqKQorCQkJICAgIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCQlwY3N1bSA9IChfX2JlMzIgKikoZ3JlaCArIDEpOwogCQkJKnBjc3VtID0gMDsKLQkJCSooX19zdW0xNiAqKXBjc3VtID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCAwKSk7CisJCQkqKF9fc3VtMTYgKilwY3N1bSA9IGdzb19tYWtlX2NoZWNrc3VtKHNrYiwgMCk7CiAJCX0KIAkJX19za2JfcHVzaChza2IsIHRubF9obGVuIC0gZ2hsKTsKIApAQCAtMTI1LDEwICsxMzEsMTIgQEAKIAkJY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgc2tiX2dyb19vZmZzZXQoc2tiKSwgMCkpOwogCXN1bSA9IGNzdW1fZm9sZChOQVBJX0dST19DQihza2IpLT5jc3VtKTsKIAlpZiAodW5saWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpKSB7Ci0JCWlmICh1bmxpa2VseSghc3VtKSkKKwkJaWYgKHVubGlrZWx5KCFzdW0pICYmICFza2ItPmNzdW1fY29tcGxldGVfc3cpCiAJCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKKwkJc2tiLT5jc3VtX2NvbXBsZXRlX3N3ID0gMTsKKwl9CiAKIAlyZXR1cm4gc3VtOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IDAxMzQ2NjMuLjc5YzNkOTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTMzNyw2ICszMzcsNyBAQAogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0OwogCV9fYmUzMiBkYWRkciwgc2FkZHI7CisJdTMyIG1hcmsgPSBJUDRfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CiAKIAlpZiAoaXBfb3B0aW9uc19lY2hvKCZpY21wX3BhcmFtLT5yZXBseW9wdHMub3B0Lm9wdCwgc2tiKSkKIAkJcmV0dXJuOwpAQCAtMzQ5LDYgKzM1MCw3IEBACiAJaWNtcF9wYXJhbS0+ZGF0YS5pY21waC5jaGVja3N1bSA9IDA7CiAKIAlpbmV0LT50b3MgPSBpcF9oZHIoc2tiKS0+dG9zOworCXNrLT5za19tYXJrID0gbWFyazsKIAlkYWRkciA9IGlwYy5hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCXNhZGRyID0gZmliX2NvbXB1dGVfc3BlY19kc3Qoc2tiKTsKIAlpcGMub3B0ID0gTlVMTDsKQEAgLTM2NCw2ICszNjYsNyBAQAogCW1lbXNldCgmZmw0LCAwLCBzaXplb2YoZmw0KSk7CiAJZmw0LmRhZGRyID0gZGFkZHI7CiAJZmw0LnNhZGRyID0gc2FkZHI7CisJZmw0LmZsb3dpNF9tYXJrID0gbWFyazsKIAlmbDQuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcF9oZHIoc2tiKS0+dG9zKTsKIAlmbDQuZmxvd2k0X3Byb3RvID0gSVBQUk9UT19JQ01QOwogCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgZmxvd2k0X3RvX2Zsb3dpKCZmbDQpKTsKQEAgLTM4Miw3ICszODUsNyBAQAogCQkJCQlzdHJ1Y3QgZmxvd2k0ICpmbDQsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2JfaW4sCiAJCQkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLAotCQkJCQlfX2JlMzIgc2FkZHIsIHU4IHRvcywKKwkJCQkJX19iZTMyIHNhZGRyLCB1OCB0b3MsIHUzMiBtYXJrLAogCQkJCQlpbnQgdHlwZSwgaW50IGNvZGUsCiAJCQkJCXN0cnVjdCBpY21wX2J4bSAqcGFyYW0pCiB7CkBAIC0zOTQsNiArMzk3LDcgQEAKIAlmbDQtPmRhZGRyID0gKHBhcmFtLT5yZXBseW9wdHMub3B0Lm9wdC5zcnIgPwogCQkgICAgICBwYXJhbS0+cmVwbHlvcHRzLm9wdC5vcHQuZmFkZHIgOiBpcGgtPnNhZGRyKTsKIAlmbDQtPnNhZGRyID0gc2FkZHI7CisJZmw0LT5mbG93aTRfbWFyayA9IG1hcms7CiAJZmw0LT5mbG93aTRfdG9zID0gUlRfVE9TKHRvcyk7CiAJZmw0LT5mbG93aTRfcHJvdG8gPSBJUFBST1RPX0lDTVA7CiAJZmw0LT5mbDRfaWNtcF90eXBlID0gdHlwZTsKQEAgLTQ5MSw2ICs0OTUsNyBAQAogCXN0cnVjdCBmbG93aTQgZmw0OwogCV9fYmUzMiBzYWRkcjsKIAl1OCAgdG9zOworCXUzMiBtYXJrOwogCXN0cnVjdCBuZXQgKm5ldDsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKQEAgLTU5Miw2ICs1OTcsNyBAQAogCXRvcyA9IGljbXBfcG9pbnRlcnNbdHlwZV0uZXJyb3IgPyAoKGlwaC0+dG9zICYgSVBUT1NfVE9TX01BU0spIHwKIAkJCQkJICAgSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wpIDoKIAkJCQkJICBpcGgtPnRvczsKKwltYXJrID0gSVA0X1JFUExZX01BUksobmV0LCBza2JfaW4tPm1hcmspOwogCiAJaWYgKGlwX29wdGlvbnNfZWNobygmaWNtcF9wYXJhbS0+cmVwbHlvcHRzLm9wdC5vcHQsIHNrYl9pbikpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTYwOCwxMyArNjE0LDE0IEBACiAJaWNtcF9wYXJhbS0+c2tiCSAgPSBza2JfaW47CiAJaWNtcF9wYXJhbS0+b2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYl9pbik7CiAJaW5ldF9zayhzayktPnRvcyA9IHRvczsKKwlzay0+c2tfbWFyayA9IG1hcms7CiAJaXBjLmFkZHIgPSBpcGgtPnNhZGRyOwogCWlwYy5vcHQgPSAmaWNtcF9wYXJhbS0+cmVwbHlvcHRzLm9wdDsKIAlpcGMudHhfZmxhZ3MgPSAwOwogCWlwYy50dGwgPSAwOwogCWlwYy50b3MgPSAtMTsKIAotCXJ0ID0gaWNtcF9yb3V0ZV9sb29rdXAobmV0LCAmZmw0LCBza2JfaW4sIGlwaCwgc2FkZHIsIHRvcywKKwlydCA9IGljbXBfcm91dGVfbG9va3VwKG5ldCwgJmZsNCwgc2tiX2luLCBpcGgsIHNhZGRyLCB0b3MsIG1hcmssCiAJCQkgICAgICAgdHlwZSwgY29kZSwgaWNtcF9wYXJhbSk7CiAJaWYgKElTX0VSUihydCkpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTkwOCwxNiArOTE1LDggQEAKIAogCUlDTVBfSU5DX1NUQVRTX0JIKG5ldCwgSUNNUF9NSUJfSU5NU0dTKTsKIAotCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKLQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQlpZiAoIWNzdW1fZm9sZChza2ItPmNzdW0pKQotCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgQ0hFQ0tTVU1fTk9ORToKLQkJc2tiLT5jc3VtID0gMDsKLQkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCi0JCQlnb3RvIGNzdW1fZXJyb3I7Ci0JfQorCWlmIChza2JfY2hlY2tzdW1fc2ltcGxlX3ZhbGlkYXRlKHNrYikpCisJCWdvdG8gY3N1bV9lcnJvcjsKIAogCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKCppY21waCkpKQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDk3ZTRkMTYuLjY3NDhkNDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTM2OSw3ICszNjksNyBAQAogCXBpcC0+c2FkZHIgICAgPSBmbDQuc2FkZHI7CiAJcGlwLT5wcm90b2NvbCA9IElQUFJPVE9fSUdNUDsKIAlwaXAtPnRvdF9sZW4gID0gMDsJLyogZmlsbGVkIGluIGxhdGVyICovCi0JaXBfc2VsZWN0X2lkZW50KHNrYiwgJnJ0LT5kc3QsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOwogCSgodTggKikmcGlwWzFdKVswXSA9IElQT1BUX1JBOwogCSgodTggKikmcGlwWzFdKVsxXSA9IDQ7CiAJKCh1OCAqKSZwaXBbMV0pWzJdID0gMDsKQEAgLTcxNCw3ICs3MTQsNyBAQAogCWlwaC0+ZGFkZHIgICAgPSBkc3Q7CiAJaXBoLT5zYWRkciAgICA9IGZsNC5zYWRkcjsKIAlpcGgtPnByb3RvY29sID0gSVBQUk9UT19JR01QOwotCWlwX3NlbGVjdF9pZGVudChza2IsICZydC0+ZHN0LCBOVUxMKTsKKwlpcF9zZWxlY3RfaWRlbnQoc2tiLCBOVUxMKTsKIAkoKHU4ICopJmlwaFsxXSlbMF0gPSBJUE9QVF9SQTsKIAkoKHU4ICopJmlwaFsxXSlbMV0gPSA0OwogCSgodTggKikmaXBoWzFdKVsyXSA9IDA7CkBAIC05ODgsMTYgKzk4OCw4IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpZ21waGRyKSkpCiAJCWdvdG8gZHJvcDsKIAotCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKLQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQlpZiAoIWNzdW1fZm9sZChza2ItPmNzdW0pKQotCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgQ0hFQ0tTVU1fTk9ORToKLQkJc2tiLT5jc3VtID0gMDsKLQkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCi0JCQlnb3RvIGRyb3A7Ci0JfQorCWlmIChza2JfY2hlY2tzdW1fc2ltcGxlX3ZhbGlkYXRlKHNrYikpCisJCWdvdG8gZHJvcDsKIAogCWloID0gaWdtcF9oZHIoc2tiKTsKIAlzd2l0Y2ggKGloLT50eXBlKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwppbmRleCBhNTZiOGU2Li4xNGQwMmVhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTI5LDkgKzI5LDYgQEAKIEVYUE9SVF9TWU1CT0woaW5ldF9jc2tfdGltZXJfYnVnX21zZyk7CiAjZW5kaWYKIAotdW5zaWduZWQgbG9uZyAqc3lzY3RsX2xvY2FsX3Jlc2VydmVkX3BvcnRzOwotRVhQT1JUX1NZTUJPTChzeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMpOwotCiB2b2lkIGluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBpbnQgKmxvdywgaW50ICpoaWdoKQogewogCXVuc2lnbmVkIGludCBzZXE7CkBAIC0xMTMsNyArMTEwLDcgQEAKIAogCQlzbWFsbGVzdF9zaXplID0gLTE7CiAJCWRvIHsKLQkJCWlmIChpbmV0X2lzX3Jlc2VydmVkX2xvY2FsX3BvcnQocm92ZXIpKQorCQkJaWYgKGluZXRfaXNfbG9jYWxfcmVzZXJ2ZWRfcG9ydChuZXQsIHJvdmVyKSkKIAkJCQlnb3RvIG5leHRfbm9sb2NrOwogCQkJaGVhZCA9ICZoYXNoaW5mby0+Ymhhc2hbaW5ldF9iaGFzaGZuKG5ldCwgcm92ZXIsCiAJCQkJCWhhc2hpbmZvLT5iaGFzaF9zaXplKV07CkBAIC00MDgsNyArNDA1LDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJaW50IGZsYWdzID0gaW5ldF9za19mbG93aV9mbGFncyhzayk7CiAKLQlmbG93aTRfaW5pdF9vdXRwdXQoZmw0LCBzay0+c2tfYm91bmRfZGV2X2lmLCBzay0+c2tfbWFyaywKKwlmbG93aTRfaW5pdF9vdXRwdXQoZmw0LCBzay0+c2tfYm91bmRfZGV2X2lmLCBpcmVxLT5pcl9tYXJrLAogCQkJICAgUlRfQ09OTl9GTEFHUyhzayksIFJUX1NDT1BFX1VOSVZFUlNFLAogCQkJICAgc2stPnNrX3Byb3RvY29sLAogCQkJICAgZmxhZ3MsCkBAIC00NDUsNyArNDQyLDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlvcHQgPSByY3VfZGVyZWZlcmVuY2UobmV3aW5ldC0+aW5ldF9vcHQpOwotCWZsb3dpNF9pbml0X291dHB1dChmbDQsIHNrLT5za19ib3VuZF9kZXZfaWYsIHNrLT5za19tYXJrLAorCWZsb3dpNF9pbml0X291dHB1dChmbDQsIHNrLT5za19ib3VuZF9kZXZfaWYsIGluZXRfcnNrKHJlcSktPmlyX21hcmssCiAJCQkgICBSVF9DT05OX0ZMQUdTKHNrKSwgUlRfU0NPUEVfVU5JVkVSU0UsCiAJCQkgICBzay0+c2tfcHJvdG9jb2wsIGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJICAgKG9wdCAmJiBvcHQtPm9wdC5zcnIpID8gb3B0LT5vcHQuZmFkZHIgOiBpcmVxLT5pcl9ybXRfYWRkciwKQEAgLTY4MCw2ICs2NzcsOCBAQAogCQlpbmV0X3NrKG5ld3NrKS0+aW5ldF9zcG9ydCA9IGh0b25zKGluZXRfcnNrKHJlcSktPmlyX251bSk7CiAJCW5ld3NrLT5za193cml0ZV9zcGFjZSA9IHNrX3N0cmVhbV93cml0ZV9zcGFjZTsKIAorCQluZXdzay0+c2tfbWFyayA9IGluZXRfcnNrKHJlcSktPmlyX21hcms7CisKIAkJbmV3aWNzay0+aWNza19yZXRyYW5zbWl0cyA9IDA7CiAJCW5ld2ljc2stPmljc2tfYmFja29mZgkgID0gMDsKIAkJbmV3aWNzay0+aWNza19wcm9iZXNfb3V0ICA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCmluZGV4IDhiOWNmMjcuLjQzMTE2ZTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJCQkgIGNvbnN0IF9fYmUzMiBkYWRkciwgY29uc3QgdTE2IGhudW0sCiAJCQkJICBjb25zdCBpbnQgZGlmKQogewotCUlORVRfQUREUl9DT09LSUUoYWNvb2tpZSwgc2FkZHIsIGRhZGRyKQorCUlORVRfQUREUl9DT09LSUUoYWNvb2tpZSwgc2FkZHIsIGRhZGRyKTsKIAljb25zdCBfX3BvcnRwYWlyIHBvcnRzID0gSU5FVF9DT01CSU5FRF9QT1JUUyhzcG9ydCwgaG51bSk7CiAJc3RydWN0IHNvY2sgKnNrOwogCWNvbnN0IHN0cnVjdCBobGlzdF9udWxsc19ub2RlICpub2RlOwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJX19iZTMyIGRhZGRyID0gaW5ldC0+aW5ldF9yY3Zfc2FkZHI7CiAJX19iZTMyIHNhZGRyID0gaW5ldC0+aW5ldF9kYWRkcjsKIAlpbnQgZGlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKLQlJTkVUX0FERFJfQ09PS0lFKGFjb29raWUsIHNhZGRyLCBkYWRkcikKKwlJTkVUX0FERFJfQ09PS0lFKGFjb29raWUsIHNhZGRyLCBkYWRkcik7CiAJY29uc3QgX19wb3J0cGFpciBwb3J0cyA9IElORVRfQ09NQklORURfUE9SVFMoaW5ldC0+aW5ldF9kcG9ydCwgbHBvcnQpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAl1bnNpZ25lZCBpbnQgaGFzaCA9IGluZXRfZWhhc2hmbihuZXQsIGRhZGRyLCBscG9ydCwKQEAgLTUwMCw3ICs1MDAsNyBAQAogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJCWZvciAoaSA9IDE7IGkgPD0gcmVtYWluaW5nOyBpKyspIHsKIAkJCXBvcnQgPSBsb3cgKyAoaSArIG9mZnNldCkgJSByZW1haW5pbmc7Ci0JCQlpZiAoaW5ldF9pc19yZXNlcnZlZF9sb2NhbF9wb3J0KHBvcnQpKQorCQkJaWYgKGluZXRfaXNfbG9jYWxfcmVzZXJ2ZWRfcG9ydChuZXQsIHBvcnQpKQogCQkJCWNvbnRpbnVlOwogCQkJaGVhZCA9ICZoaW5mby0+Ymhhc2hbaW5ldF9iaGFzaGZuKG5ldCwgcG9ydCwKIAkJCQkJaGluZm8tPmJoYXNoX3NpemUpXTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRwZWVyLmMgYi9uZXQvaXB2NC9pbmV0cGVlci5jCmluZGV4IDU2Y2Q0NTguLmJkNWY1OTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRwZWVyLmMKKysrIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwpAQCAtMjYsMjAgKzI2LDcgQEAKICAqICBUaGVvcnkgb2Ygb3BlcmF0aW9ucy4KICAqICBXZSBrZWVwIG9uZSBlbnRyeSBmb3IgZWFjaCBwZWVyIElQIGFkZHJlc3MuICBUaGUgbm9kZXMgY29udGFpbnMgbG9uZy1saXZpbmcKICAqICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVlciB3aGljaCBkb2Vzbid0IGRlcGVuZCBvbiByb3V0ZXMuCi0gKiAgQXQgdGhpcyBtb21lbnQgdGhpcyBpbmZvcm1hdGlvbiBjb25zaXN0cyBvbmx5IG9mIElEIGZpZWxkIGZvciB0aGUgbmV4dAotICogIG91dGdvaW5nIElQIHBhY2tldC4gIFRoaXMgZmllbGQgaXMgaW5jcmVtZW50ZWQgd2l0aCBlYWNoIHBhY2tldCBhcyBlbmNvZGVkCi0gKiAgaW4gaW5ldF9nZXRpZCgpIGZ1bmN0aW9uIChpbmNsdWRlL25ldC9pbmV0cGVlci5oKS4KLSAqICBBdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcgdGhpcyBub3RlcyBpZGVudGlmaWVyIG9mIElQIHBhY2tldHMgaXMgZ2VuZXJhdGVkCi0gKiAgdG8gYmUgdW5wcmVkaWN0YWJsZSB1c2luZyB0aGlzIGNvZGUgb25seSBmb3IgcGFja2V0cyBzdWJqZWN0ZWQKLSAqICAoYWN0dWFsbHkgb3IgcG90ZW50aWFsbHkpIHRvIGRlZnJhZ21lbnRhdGlvbi4gIEkuZS4gREYgcGFja2V0cyBsZXNzIHRoYW4KLSAqICBQTVRVIGluIHNpemUgd2hlbiBsb2NhbCBmcmFnbWVudGF0aW9uIGlzIGRpc2FibGVkIHVzZSBhIGNvbnN0YW50IElEIGFuZCBkbwotICogIG5vdCB1c2UgdGhpcyBjb2RlIChzZWUgaXBfc2VsZWN0X2lkZW50KCkgaW4gaW5jbHVkZS9uZXQvaXAuaCkuCiAgKgotICogIFJvdXRlIGNhY2hlIGVudHJpZXMgaG9sZCByZWZlcmVuY2VzIHRvIG91ciBub2Rlcy4KLSAqICBOZXcgY2FjaGUgZW50cmllcyBnZXQgcmVmZXJlbmNlcyB2aWEgbG9va3VwIGJ5IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgaW4KLSAqICB0aGUgYXZsIHRyZWUuICBUaGUgcmVmZXJlbmNlIGlzIGdyYWJiZWQgb25seSB3aGVuIGl0J3MgbmVlZGVkIGkuZS4gb25seQotICogIHdoZW4gd2UgdHJ5IHRvIG91dHB1dCBJUCBwYWNrZXQgd2hpY2ggbmVlZHMgYW4gdW5wcmVkaWN0YWJsZSBJRCAoc2VlCi0gKiAgX19pcF9zZWxlY3RfaWRlbnQoKSBpbiBuZXQvaXB2NC9yb3V0ZS5jKS4KICAqICBOb2RlcyBhcmUgcmVtb3ZlZCBvbmx5IHdoZW4gcmVmZXJlbmNlIGNvdW50ZXIgZ29lcyB0byAwLgogICogIFdoZW4gaXQncyBoYXBwZW5lZCB0aGUgbm9kZSBtYXkgYmUgcmVtb3ZlZCB3aGVuIGEgc3VmZmljaWVudCBhbW91bnQgb2YKICAqICB0aW1lIGhhcyBiZWVuIHBhc3NlZCBzaW5jZSBpdHMgbGFzdCB1c2UuICBUaGUgbGVzcy1yZWNlbnRseS11c2VkIGVudHJ5IGNhbgpAQCAtNjIsNyArNDksNiBAQAogICoJCXJlZmNudDogYXRvbWljYWxseSBhZ2FpbnN0IG1vZGlmaWNhdGlvbnMgb24gb3RoZXIgQ1BVOwogICoJCSAgIHVzdWFsbHkgdW5kZXIgc29tZSBvdGhlciBsb2NrIHRvIHByZXZlbnQgbm9kZSBkaXNhcHBlYXJpbmcKICAqCQlkYWRkcjogdW5jaGFuZ2VhYmxlCi0gKgkJaXBfaWRfY291bnQ6IGF0b21pYyB2YWx1ZSAobm8gbG9jayBuZWVkZWQpCiAgKi8KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwZWVyX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwpAQCAtMTIwLDcgKzEwNiw3IEBACiBzdGF0aWMgdm9pZCBpbmV0cGVlcl9nY193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpbmV0X3BlZXIgKnAsICpuLCAqYzsKLQlMSVNUX0hFQUQobGlzdCk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJc3Bpbl9sb2NrX2JoKCZnY19sb2NrKTsKIAlsaXN0X3JlcGxhY2VfaW5pdCgmZ2NfbGlzdCwgJmxpc3QpOwpAQCAtNDk3LDEwICs0ODMsNiBAQAogCQlwLT5kYWRkciA9ICpkYWRkcjsKIAkJYXRvbWljX3NldCgmcC0+cmVmY250LCAxKTsKIAkJYXRvbWljX3NldCgmcC0+cmlkLCAwKTsKLQkJYXRvbWljX3NldCgmcC0+aXBfaWRfY291bnQsCi0JCQkJKGRhZGRyLT5mYW1pbHkgPT0gQUZfSU5FVCkgPwotCQkJCQlzZWN1cmVfaXBfaWQoZGFkZHItPmFkZHIuYTQpIDoKLQkJCQkJc2VjdXJlX2lwdjZfaWQoZGFkZHItPmFkZHIuYTYpKTsKIAkJcC0+bWV0cmljc1tSVEFYX0xPQ0stMV0gPSBJTkVUUEVFUl9NRVRSSUNTX05FVzsKIAkJcC0+cmF0ZV90b2tlbnMgPSAwOwogCQkvKiA2MCpIWiBpcyBhcmJpdHJhcnksIGJ1dCBjaG9zZW4gZW5vdWdoIGhpZ2ggc28gdGhhdCB0aGUgZmlyc3QKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZvcndhcmQuYyBiL25ldC9pcHY0L2lwX2ZvcndhcmQuYwppbmRleCA2ZjExMWU0Li4zYTgzY2U1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKKysrIGIvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCkBAIC00Miw3ICs0Miw3IEBACiBzdGF0aWMgYm9vbCBpcF9tYXlfZnJhZ21lbnQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gdW5saWtlbHkoKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgPT0gMCkgfHwKLQkJc2tiLT5sb2NhbF9kZjsKKwkJc2tiLT5pZ25vcmVfZGY7CiB9CiAKIHN0YXRpYyBib29sIGlwX2V4Y2VlZHNfbXR1KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBtdHUpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IDk0MjEzYzguLjliODQyNTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJc3RydWN0IGZsb3dpNCBmbDQ7CiAJCXN0cnVjdCBydGFibGUgKnJ0OwogCi0JCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2dyZShkZXZfbmV0KGRldiksICZmbDQsCisJCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2dyZSh0LT5uZXQsICZmbDQsCiAJCQkJCSB0LT5wYXJtcy5pcGguZGFkZHIsCiAJCQkJCSB0LT5wYXJtcy5pcGguc2FkZHIsCiAJCQkJCSB0LT5wYXJtcy5vX2tleSwKQEAgLTQzNCw3ICs0MzQsNyBAQAogCiAJaWYgKGlwdjRfaXNfbXVsdGljYXN0KHQtPnBhcm1zLmlwaC5kYWRkcikgJiYgdC0+bWxpbmspIHsKIAkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwotCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KGRldl9uZXQoZGV2KSwgdC0+bWxpbmspOworCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KHQtPm5ldCwgdC0+bWxpbmspOwogCQlpZiAoaW5fZGV2KQogCQkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgdC0+cGFybXMuaXBoLmRhZGRyKTsKIAl9CkBAIC00NzgsNyArNDc4LDcgQEAKIAlkZXYtPm5lZWRlZF9oZWFkcm9vbQk9IExMX01BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIDQ7CiAJZGV2LT5tdHUJCT0gRVRIX0RBVEFfTEVOIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSA0OwogCi0JZGV2LT5mZWF0dXJlcwkJfD0gTkVUSUZfRl9ORVROU19MT0NBTCB8IEdSRV9GRUFUVVJFUzsKKwlkZXYtPmZlYXR1cmVzCQl8PSBHUkVfRkVBVFVSRVM7CiAJZGV2LT5od19mZWF0dXJlcwl8PSBHUkVfRkVBVFVSRVM7CiAKIAlpZiAoISh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MgJiBUVU5ORUxfU0VRKSkgewpAQCAtNjQ5LDYgKzY0OSw3IEBACiB7CiAJZXRoZXJfc2V0dXAoZGV2KTsKIAlkZXYtPm5ldGRldl9vcHMJCT0gJmdyZV90YXBfbmV0ZGV2X29wczsKKwlkZXYtPnByaXZfZmxhZ3MgCXw9IElGRl9MSVZFX0FERFJfQ0hBTkdFOwogCWlwX3R1bm5lbF9zZXR1cChkZXYsIGdyZV90YXBfbmV0X2lkKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IGY0YWI3MmUuLjVlN2FlY2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogCQkJfQogCQkJaWYgKG9wdHB0clsyXSA8PSBvcHRsZW4pIHsKIAkJCQl1bnNpZ25lZCBjaGFyICp0aW1lcHRyID0gTlVMTDsKLQkJCQlpZiAob3B0cHRyWzJdKzMgPiBvcHRwdHJbMV0pIHsKKwkJCQlpZiAob3B0cHRyWzJdKzMgPiBvcHRsZW4pIHsKIAkJCQkJcHBfcHRyID0gb3B0cHRyICsgMjsKIAkJCQkJZ290byBlcnJvcjsKIAkJCQl9CkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJCQkJb3B0cHRyWzJdICs9IDQ7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgSVBPUFRfVFNfVFNBTkRBRERSOgotCQkJCQlpZiAob3B0cHRyWzJdKzcgPiBvcHRwdHJbMV0pIHsKKwkJCQkJaWYgKG9wdHB0clsyXSs3ID4gb3B0bGVuKSB7CiAJCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOwogCQkJCQkJZ290byBlcnJvcjsKIAkJCQkJfQpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCQkJCW9wdHB0clsyXSArPSA4OwogCQkJCQlicmVhazsKIAkJCQljYXNlIElQT1BUX1RTX1BSRVNQRUM6Ci0JCQkJCWlmIChvcHRwdHJbMl0rNyA+IG9wdHB0clsxXSkgeworCQkJCQlpZiAob3B0cHRyWzJdKzcgPiBvcHRsZW4pIHsKIAkJCQkJCXBwX3B0ciA9IG9wdHB0ciArIDI7CiAJCQkJCQlnb3RvIGVycm9yOwogCQkJCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IGE1MmY1MDEuLjhkM2I2YjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpcGgtPmRhZGRyICAgID0gKG9wdCAmJiBvcHQtPm9wdC5zcnIgPyBvcHQtPm9wdC5mYWRkciA6IGRhZGRyKTsKIAlpcGgtPnNhZGRyICAgID0gc2FkZHI7CiAJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKLQlpcF9zZWxlY3RfaWRlbnQoc2tiLCAmcnQtPmRzdCwgc2spOworCWlwX3NlbGVjdF9pZGVudChza2IsIHNrKTsKIAogCWlmIChvcHQgJiYgb3B0LT5vcHQub3B0bGVuKSB7CiAJCWlwaC0+aWhsICs9IG9wdC0+b3B0Lm9wdGxlbj4+MjsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWlwaCA9IGlwX2hkcihza2IpOwogCSooKF9fYmUxNiAqKWlwaCkgPSBodG9ucygoNCA8PCAxMikgfCAoNSA8PCA4KSB8IChpbmV0LT50b3MgJiAweGZmKSk7Ci0JaWYgKGlwX2RvbnRfZnJhZ21lbnQoc2ssICZydC0+ZHN0KSAmJiAhc2tiLT5sb2NhbF9kZikKKwlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT5kc3QpICYmICFza2ItPmlnbm9yZV9kZikKIAkJaXBoLT5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKIAllbHNlCiAJCWlwaC0+ZnJhZ19vZmYgPSAwOwpAQCAtNDMwLDggKzQzMCw3IEBACiAJCWlwX29wdGlvbnNfYnVpbGQoc2tiLCAmaW5ldF9vcHQtPm9wdCwgaW5ldC0+aW5ldF9kYWRkciwgcnQsIDApOwogCX0KIAotCWlwX3NlbGVjdF9pZGVudF9tb3JlKHNrYiwgJnJ0LT5kc3QsIHNrLAotCQkJICAgICAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA/OiAxKSAtIDEpOworCWlwX3NlbGVjdF9pZGVudF9zZWdzKHNrYiwgc2ssIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPzogMSk7CiAKIAkvKiBUT0RPIDogc2hvdWxkIHdlIHVzZSBza2ItPnNrIGhlcmUgaW5zdGVhZCBvZiBzayA/ICovCiAJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKQEAgLTUwMSw3ICs1MDAsNyBAQAogCWlwaCA9IGlwX2hkcihza2IpOwogCiAJbXR1ID0gaXBfc2tiX2RzdF9tdHUoc2tiKTsKLQlpZiAodW5saWtlbHkoKChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiAhc2tiLT5sb2NhbF9kZikgfHwKKwlpZiAodW5saWtlbHkoKChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiAhc2tiLT5pZ25vcmVfZGYpIHx8CiAJCSAgICAgKElQQ0Ioc2tiKS0+ZnJhZ19tYXhfc2l6ZSAmJgogCQkgICAgICBJUENCKHNrYiktPmZyYWdfbWF4X3NpemUgPiBtdHUpKSkgewogCQlJUF9JTkNfU1RBVFMoZGV2X25ldChkZXYpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwpAQCAtODY2LDcgKzg2NSw3IEBACiAKIAlmcmFnaGVhZGVybGVuID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAob3B0ID8gb3B0LT5vcHRsZW4gOiAwKTsKIAltYXhmcmFnbGVuID0gKChtdHUgLSBmcmFnaGVhZGVybGVuKSAmIH43KSArIGZyYWdoZWFkZXJsZW47Ci0JbWF4bm9uZnJhZ3NpemUgPSBpcF9za19sb2NhbF9kZihzaykgPyAweEZGRkYgOiBtdHU7CisJbWF4bm9uZnJhZ3NpemUgPSBpcF9za19pZ25vcmVfZGYoc2spID8gMHhGRkZGIDogbXR1OwogCiAJaWYgKGNvcmstPmxlbmd0aCArIGxlbmd0aCA+IG1heG5vbmZyYWdzaXplIC0gZnJhZ2hlYWRlcmxlbikgewogCQlpcF9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsIGZsNC0+ZGFkZHIsIGluZXQtPmluZXRfZHBvcnQsCkBAIC0xMTg5LDcgKzExODgsNyBAQAogCiAJZnJhZ2hlYWRlcmxlbiA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCk7CiAJbWF4ZnJhZ2xlbiA9ICgobXR1IC0gZnJhZ2hlYWRlcmxlbikgJiB+NykgKyBmcmFnaGVhZGVybGVuOwotCW1heG5vbmZyYWdzaXplID0gaXBfc2tfbG9jYWxfZGYoc2spID8gMHhGRkZGIDogbXR1OworCW1heG5vbmZyYWdzaXplID0gaXBfc2tfaWdub3JlX2RmKHNrKSA/IDB4RkZGRiA6IG10dTsKIAogCWlmIChjb3JrLT5sZW5ndGggKyBzaXplID4gbWF4bm9uZnJhZ3NpemUgLSBmcmFnaGVhZGVybGVuKSB7CiAJCWlwX2xvY2FsX2Vycm9yKHNrLCBFTVNHU0laRSwgZmw0LT5kYWRkciwgaW5ldC0+aW5ldF9kcG9ydCwKQEAgLTEzNTAsMTAgKzEzNDksMTAgQEAKIAkgKiB0byBmcmFnbWVudCB0aGUgZnJhbWUgZ2VuZXJhdGVkIGhlcmUuIE5vIG1hdHRlciwgd2hhdCB0cmFuc2Zvcm1zCiAJICogaG93IHRyYW5zZm9ybXMgY2hhbmdlIHNpemUgb2YgdGhlIHBhY2tldCwgaXQgd2lsbCBjb21lIG91dC4KIAkgKi8KLQlza2ItPmxvY2FsX2RmID0gaXBfc2tfbG9jYWxfZGYoc2spOworCXNrYi0+aWdub3JlX2RmID0gaXBfc2tfaWdub3JlX2RmKHNrKTsKIAogCS8qIERGIGJpdCBpcyBzZXQgd2hlbiB3ZSB3YW50IHRvIHNlZSBERiBvbiBvdXRnb2luZyBmcmFtZXMuCi0JICogSWYgbG9jYWxfZGYgaXMgc2V0IHRvbywgd2Ugc3RpbGwgYWxsb3cgdG8gZnJhZ21lbnQgdGhpcyBmcmFtZQorCSAqIElmIGlnbm9yZV9kZiBpcyBzZXQgdG9vLCB3ZSBzdGlsbCBhbGxvdyB0byBmcmFnbWVudCB0aGlzIGZyYW1lCiAJICogbG9jYWxseS4gKi8KIAlpZiAoaW5ldC0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfRE8gfHwKIAkgICAgaW5ldC0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfUFJPQkUgfHwKQEAgLTEzNzksNyArMTM3OCw3IEBACiAJaXBoLT50dGwgPSB0dGw7CiAJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKIAlpcF9jb3B5X2FkZHJzKGlwaCwgZmw0KTsKLQlpcF9zZWxlY3RfaWRlbnQoc2tiLCAmcnQtPmRzdCwgc2spOworCWlwX3NlbGVjdF9pZGVudChza2IsIHNrKTsKIAogCWlmIChvcHQpIHsKIAkJaXBoLT5paGwgKz0gb3B0LT5vcHRsZW4+PjI7CkBAIC0xNTQ2LDcgKzE1NDUsOCBAQAogCQkJZGFkZHIgPSByZXBseW9wdHMub3B0Lm9wdC5mYWRkcjsKIAl9CiAKLQlmbG93aTRfaW5pdF9vdXRwdXQoJmZsNCwgYXJnLT5ib3VuZF9kZXZfaWYsIDAsCisJZmxvd2k0X2luaXRfb3V0cHV0KCZmbDQsIGFyZy0+Ym91bmRfZGV2X2lmLAorCQkJICAgSVA0X1JFUExZX01BUksobmV0LCBza2ItPm1hcmspLAogCQkJICAgUlRfVE9TKGFyZy0+dG9zKSwKIAkJCSAgIFJUX1NDT1BFX1VOSVZFUlNFLCBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCiAJCQkgICBpcF9yZXBseV9hcmdfZmxvd2lfZmxhZ3MoYXJnKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbC5jIGIvbmV0L2lwdjQvaXBfdHVubmVsLmMKaW5kZXggMmFjYzIzMy4uMDk3YjNlNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsLmMKQEAgLTI2OCw2ICsyNjgsNyBAQAogCV9fYmUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOwogCV9fYmUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CiAJX19iZTMyIGtleSA9IHBhcm1zLT5pX2tleTsKKwlfX2JlMTYgZmxhZ3MgPSBwYXJtcy0+aV9mbGFnczsKIAlpbnQgbGluayA9IHBhcm1zLT5saW5rOwogCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBOVUxMOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaXBfYnVja2V0KGl0biwgcGFybXMpOwpAQCAtMjc1LDkgKzI3Niw5IEBACiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHQsIGhlYWQsIGhhc2hfbm9kZSkgewogCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyICYmCiAJCSAgICByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyICYmCi0JCSAgICBrZXkgPT0gdC0+cGFybXMuaV9rZXkgJiYKIAkJICAgIGxpbmsgPT0gdC0+cGFybXMubGluayAmJgotCQkgICAgdHlwZSA9PSB0LT5kZXYtPnR5cGUpCisJCSAgICB0eXBlID09IHQtPmRldi0+dHlwZSAmJgorCQkgICAgaXBfdHVubmVsX2tleV9tYXRjaCgmdC0+cGFybXMsIGZsYWdzLCBrZXkpKQogCQkJYnJlYWs7CiAJfQogCXJldHVybiB0OwpAQCAtMzk1LDExICszOTYsMTAgQEAKIAkJCQkJICBzdHJ1Y3QgaXBfdHVubmVsX25ldCAqaXRuLAogCQkJCQkgIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMpCiB7Ci0Jc3RydWN0IGlwX3R1bm5lbCAqbnQsICpmYnQ7CisJc3RydWN0IGlwX3R1bm5lbCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAogCUJVR19PTighaXRuLT5mYl90dW5uZWxfZGV2KTsKLQlmYnQgPSBuZXRkZXZfcHJpdihpdG4tPmZiX3R1bm5lbF9kZXYpOwogCWRldiA9IF9faXBfdHVubmVsX2NyZWF0ZShuZXQsIGl0bi0+ZmJfdHVubmVsX2Rldi0+cnRubF9saW5rX29wcywgcGFybXMpOwogCWlmIChJU19FUlIoZGV2KSkKIAkJcmV0dXJuIEVSUl9DQVNUKGRldik7CkBAIC02NjgsNiArNjY4LDcgQEAKIAkJZGV2LT5uZWVkZWRfaGVhZHJvb20gPSBtYXhfaGVhZHJvb207CiAKIAlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgZGV2LT5uZWVkZWRfaGVhZHJvb20pKSB7CisJCWlwX3J0X3B1dChydCk7CiAJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwpAQCAtNzQ3LDE5ICs3NDgsMTkgQEAKIAkJCWdvdG8gZG9uZTsKIAkJaWYgKHAtPmlwaC50dGwpCiAJCQlwLT5pcGguZnJhZ19vZmYgfD0gaHRvbnMoSVBfREYpOwotCQlpZiAoIShwLT5pX2ZsYWdzJlRVTk5FTF9LRVkpKQotCQkJcC0+aV9rZXkgPSAwOwotCQlpZiAoIShwLT5vX2ZsYWdzJlRVTk5FTF9LRVkpKQotCQkJcC0+b19rZXkgPSAwOworCQlpZiAoIShwLT5pX2ZsYWdzICYgVlRJX0lTVlRJKSkgeworCQkJaWYgKCEocC0+aV9mbGFncyAmIFRVTk5FTF9LRVkpKQorCQkJCXAtPmlfa2V5ID0gMDsKKwkJCWlmICghKHAtPm9fZmxhZ3MgJiBUVU5ORUxfS0VZKSkKKwkJCQlwLT5vX2tleSA9IDA7CisJCX0KIAogCQl0ID0gaXBfdHVubmVsX2ZpbmQoaXRuLCBwLCBpdG4tPmZiX3R1bm5lbF9kZXYtPnR5cGUpOwogCiAJCWlmICghdCAmJiAoY21kID09IFNJT0NBRERUVU5ORUwpKSB7CiAJCQl0ID0gaXBfdHVubmVsX2NyZWF0ZShuZXQsIGl0biwgcCk7Ci0JCQlpZiAoSVNfRVJSKHQpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUih0KTsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWVyciA9IFBUUl9FUlJfT1JfWkVSTyh0KTsKKwkJCWJyZWFrOwogCQl9CiAJCWlmIChkZXYgIT0gaXRuLT5mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CiAJCQlpZiAodCAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwppbmRleCBiY2YyMDZjLi5mNGM5ODdiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlpcGgtPmRhZGRyCT0JZHN0OwogCWlwaC0+c2FkZHIJPQlzcmM7CiAJaXBoLT50dGwJPQl0dGw7Ci0JX19pcF9zZWxlY3RfaWRlbnQoaXBoLCAmcnQtPmRzdCwgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPzogMSkgLSAxKTsKKwlfX2lwX3NlbGVjdF9pZGVudChpcGgsIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPzogMSk7CiAKIAllcnIgPSBpcF9sb2NhbF9vdXRfc2soc2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwoZXJyKSkpCkBAIC0xMzUsNiArMTM1LDE0IEBACiAJCXJldHVybiBza2I7CiAJfQogCisJLyogSWYgcGFja2V0IGlzIG5vdCBnc28gYW5kIHdlIGFyZSByZXNvbHZpbmcgYW55IHBhcnRpYWwgY2hlY2tzdW0sCisJICogY2xlYXIgZW5jYXBzdWxhdGlvbiBmbGFnLiBUaGlzIGFsbG93cyBzZXR0aW5nIENIRUNLU1VNX1BBUlRJQUwKKwkgKiBvbiB0aGUgb3V0ZXIgaGVhZGVyIHdpdGhvdXQgY29uZnVzaW5nIGRldmljZXMgdGhhdCBpbXBsZW1lbnQKKwkgKiBORVRJRl9GX0lQX0NTVU0gd2l0aCBlbmNhcHN1bGF0aW9uLgorCSAqLworCWlmIChjc3VtX2hlbHApCisJCXNrYi0+ZW5jYXBzdWxhdGlvbiA9IDA7CisKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJiBjc3VtX2hlbHApIHsKIAkJZXJyID0gc2tiX2NoZWNrc3VtX2hlbHAoc2tiKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF92dGkuYyBiL25ldC9pcHY0L2lwX3Z0aS5jCmluZGV4IDEzZWYwMGYuLmI4OTYwZjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3Z0aS5jCisrKyBiL25ldC9pcHY0L2lwX3Z0aS5jCkBAIC0zMTMsNyArMzEzLDEzIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwLmlfZmxhZ3MgfD0gVlRJX0lTVlRJOworCWlmICghKHAuaV9mbGFncyAmIEdSRV9LRVkpKQorCQlwLmlfa2V5ID0gMDsKKwlpZiAoIShwLm9fZmxhZ3MgJiBHUkVfS0VZKSkKKwkJcC5vX2tleSA9IDA7CisKKwlwLmlfZmxhZ3MgPSBWVElfSVNWVEk7CisKIAllcnIgPSBpcF90dW5uZWxfaW9jdGwoZGV2LCAmcCwgY21kKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDgxMmIxODMuLjYyZWFhMDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTE0OSwxMyArMTQ5LDEzIEBACiAKIAlpZiAodHlwZSA9PSBJQ01QX0RFU1RfVU5SRUFDSCAmJiBjb2RlID09IElDTVBfRlJBR19ORUVERUQpIHsKIAkJaXB2NF91cGRhdGVfcG10dShza2IsIGRldl9uZXQoc2tiLT5kZXYpLCBpbmZvLAotCQkJCSB0LT5kZXYtPmlmaW5kZXgsIDAsIElQUFJPVE9fSVBJUCwgMCk7CisJCQkJIHQtPnBhcm1zLmxpbmssIDAsIElQUFJPVE9fSVBJUCwgMCk7CiAJCWVyciA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmICh0eXBlID09IElDTVBfUkVESVJFQ1QpIHsKLQkJaXB2NF9yZWRpcmVjdChza2IsIGRldl9uZXQoc2tiLT5kZXYpLCB0LT5kZXYtPmlmaW5kZXgsIDAsCisJCWlwdjRfcmVkaXJlY3Qoc2tiLCBkZXZfbmV0KHNrYi0+ZGV2KSwgdC0+cGFybXMubGluaywgMCwKIAkJCSAgICAgIElQUFJPVE9fSVBJUCwgMCk7CiAJCWVyciA9IDA7CiAJCWdvdG8gb3V0OwpAQCAtNDg2LDQgKzQ4Niw1IEBACiBtb2R1bGVfaW5pdChpcGlwX2luaXQpOwogbW9kdWxlX2V4aXQoaXBpcF9maW5pKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19SVE5MX0xJTksoImlwaXAiKTsKIE1PRFVMRV9BTElBU19ORVRERVYoInR1bmwwIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggZDg0ZGM4ZC4uNjViY2FhNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtNDg0LDcgKzQ4NCw3IEBACiAJZGV2LT50eXBlCQk9IEFSUEhSRF9QSU1SRUc7CiAJZGV2LT5tdHUJCT0gRVRIX0RBVEFfTEVOIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSA4OwogCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOwotCWRldi0+bmV0ZGV2X29wcwkJPSAmcmVnX3ZpZl9uZXRkZXZfb3BzLAorCWRldi0+bmV0ZGV2X29wcwkJPSAmcmVnX3ZpZl9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKIAlkZXYtPmZlYXR1cmVzCQl8PSBORVRJRl9GX05FVE5TX0xPQ0FMOwogfQpAQCAtMTY2Myw3ICsxNjYzLDcgQEAKIAlpcGgtPnByb3RvY29sCT0JSVBQUk9UT19JUElQOwogCWlwaC0+aWhsCT0JNTsKIAlpcGgtPnRvdF9sZW4JPQlodG9ucyhza2ItPmxlbik7Ci0JaXBfc2VsZWN0X2lkZW50KHNrYiwgc2tiX2RzdChza2IpLCBOVUxMKTsKKwlpcF9zZWxlY3RfaWRlbnQoc2tiLCBOVUxMKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbmF0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYwppbmRleCBlZTI4ODYxLi5mMTc4N2MwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYwpAQCAtOTEsMTcgKzkxLDkgQEAKIAlpZiAobmZfY3RfaXNfdW50cmFja2VkKGN0KSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCW5hdCA9IG5mY3RfbmF0KGN0KTsKLQlpZiAoIW5hdCkgewotCQkvKiBOQVQgbW9kdWxlIHdhcyBsb2FkZWQgbGF0ZS4gKi8KLQkJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpCi0JCQlyZXR1cm4gTkZfQUNDRVBUOwotCQluYXQgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTkFULCBHRlBfQVRPTUlDKTsKLQkJaWYgKG5hdCA9PSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGFkZCBOQVQgZXh0ZW5zaW9uXG4iKTsKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCX0KLQl9CisJbmF0ID0gbmZfY3RfbmF0X2V4dF9hZGQoY3QpOworCWlmIChuYXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCXN3aXRjaCAoY3RpbmZvKSB7CiAJY2FzZSBJUF9DVF9SRUxBVEVEOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2RlZnJhZ19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYwppbmRleCBmNDBmMzIxLi5iOGY2MzgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYwpAQCAtMzQsNyArMzQsNyBAQAogCiAJaWYgKCFlcnIpIHsKIAkJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7Ci0JCXNrYi0+bG9jYWxfZGYgPSAxOworCQlza2ItPmlnbm9yZV9kZiA9IDE7CiAJfQogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjQuYwppbmRleCBiNWIyNTZkLi4zOTY0MTU3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9jaGFpbl9uYXRfaXB2NC5jCkBAIC00OCwxNSArNDgsOSBAQAogCiAJTkZfQ1RfQVNTRVJUKCEoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSk7CiAKLQluYXQgPSBuZmN0X25hdChjdCk7Ci0JaWYgKG5hdCA9PSBOVUxMKSB7Ci0JCS8qIENvbm50cmFjayBtb2R1bGUgd2FzIGxvYWRlZCBsYXRlLCBjYW4ndCBhZGQgZXh0ZW5zaW9uLiAqLwotCQlpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSkKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCW5hdCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpOwotCQlpZiAobmF0ID09IE5VTEwpCi0JCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KKwluYXQgPSBuZl9jdF9uYXRfZXh0X2FkZChjdCk7CisJaWYgKG5hdCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJc3dpdGNoIChjdGluZm8pIHsKIAljYXNlIElQX0NUX1JFTEFURUQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9wcm9jLmMgYi9uZXQvaXB2NC9wcm9jLmMKaW5kZXggYWQ3MzdmYS4uYWUwYWY5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcHJvYy5jCisrKyBiL25ldC9pcHY0L3Byb2MuYwpAQCAtMzQ1LDE1ICszNDUsMTUgQEAKIAlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiBPdXQlcyIsIGljbXBtaWJtYXBbaV0ubmFtZSk7CiAJc2VxX3ByaW50ZihzZXEsICJcbkljbXA6ICVsdSAlbHUgJWx1IiwKLQkJc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKSBuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lOTVNHUyksCi0JCXNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKikgbmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9JTkVSUk9SUyksCi0JCXNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKikgbmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9DU1VNRVJST1JTKSk7CisJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lOTVNHUyksCisJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lORVJST1JTKSwKKwkJc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLmljbXBfc3RhdGlzdGljcywgSUNNUF9NSUJfQ1NVTUVSUk9SUykpOwogCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCiAJCQkgICBhdG9taWNfbG9uZ19yZWFkKHB0ciArIGljbXBtaWJtYXBbaV0uaW5kZXgpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1IiwKLQkJc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKSBuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVE1TR1MpLAotCQlzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopIG5ldC0+bWliLmljbXBfc3RhdGlzdGljcywgSUNNUF9NSUJfT1VURVJST1JTKSk7CisJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVE1TR1MpLAorCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9PVVRFUlJPUlMpKTsKIAlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAogCQkJICAgYXRvbWljX2xvbmdfcmVhZChwdHIgKyAoaWNtcG1pYm1hcFtpXS5pbmRleCB8IDB4MTAwKSkpOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgbWlicykgIT0gMCk7CiAJZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbGx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZDY0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmlwX3N0YXRpc3RpY3MsCisJCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChuZXQtPm1pYi5pcF9zdGF0aXN0aWNzLAogCQkJCQkgICAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSwKIAkJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSkpOwogCkBAIC0zOTUsMTEgKzM5NSwxMSBAQAogCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KIAkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKIAkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsCi0JCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnRjcF9zdGF0aXN0aWNzLAorCQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi50Y3Bfc3RhdGlzdGljcywKIAkJCQkJCSAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7CiAJCWVsc2UKIAkJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnRjcF9zdGF0aXN0aWNzLAorCQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi50Y3Bfc3RhdGlzdGljcywKIAkJCQkJCSAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7CiAJfQogCkBAIC00MTAsNyArNDEwLDcgQEAKIAlzZXFfcHV0cyhzZXEsICJcblVkcDoiKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBfc3RhdGlzdGljcywKKwkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi51ZHBfc3RhdGlzdGljcywKIAkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKIAogCS8qIHRoZSBVRFAgYW5kIFVEUC1MaXRlIE1JQnMgYXJlIHRoZSBzYW1lICovCkBAIC00MjEsNyArNDIxLDcgQEAKIAlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0aXN0aWNzLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLnVkcGxpdGVfc3RhdGlzdGljcywKIAkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKIAogCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CkBAIC00NTgsNyArNDU4LDcgQEAKIAlzZXFfcHV0cyhzZXEsICJcblRjcEV4dDoiKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5uZXRfc3RhdGlzdGljcywKKwkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5uZXRfc3RhdGlzdGljcywKIAkJCQkJICAgc25tcDRfbmV0X2xpc3RbaV0uZW50cnkpKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSXBFeHQ6Iik7CkBAIC00NjgsNyArNDY4LDcgQEAKIAlzZXFfcHV0cyhzZXEsICJcbklwRXh0OiIpOwogCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWxsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQ2NCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pcF9zdGF0aXN0aWNzLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQobmV0LT5taWIuaXBfc3RhdGlzdGljcywKIAkJCQkJICAgICBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0uZW50cnksCiAJCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCBhOWRiZTU4Li4yYzY1MTYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJCWlwaC0+Y2hlY2sgICA9IDA7CiAJCWlwaC0+dG90X2xlbiA9IGh0b25zKGxlbmd0aCk7CiAJCWlmICghaXBoLT5pZCkKLQkJCWlwX3NlbGVjdF9pZGVudChza2IsICZydC0+ZHN0LCBOVUxMKTsKKwkJCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOwogCiAJCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCA1ZTY3NmJlLi4wODIyMzlmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTg5LDYgKzg5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CkBAIC00NTYsMzkgKzQ1NywxOSBAQAogCXJldHVybiBuZWlnaF9jcmVhdGUoJmFycF90YmwsIHBrZXksIGRldik7CiB9CiAKLS8qCi0gKiBQZWVyIGFsbG9jYXRpb24gbWF5IGZhaWwgb25seSBpbiBzZXJpb3VzIG91dC1vZi1tZW1vcnkgY29uZGl0aW9ucy4gIEhvd2V2ZXIKLSAqIHdlIHN0aWxsIGNhbiBnZW5lcmF0ZSBzb21lIG91dHB1dC4KLSAqIFJhbmRvbSBJRCBzZWxlY3Rpb24gbG9va3MgYSBiaXQgZGFuZ2Vyb3VzIGJlY2F1c2Ugd2UgaGF2ZSBubyBjaGFuY2VzIHRvCi0gKiBzZWxlY3QgSUQgYmVpbmcgdW5pcXVlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZS4KLSAqIEJ1dCBicm9rZW4gcGFja2V0IGlkZW50aWZpZXIgbWF5IGJlIGJldHRlciB0aGFuIG5vIHBhY2tldCBhdCBhbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGlwX3NlbGVjdF9mYl9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCkKK2F0b21pY190ICppcF9pZGVudHMgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woaXBfaWRlbnRzKTsKKwordm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCwgaW50IHNlZ3MpCiB7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhpcF9mYl9pZF9sb2NrKTsKLQlzdGF0aWMgdTMyIGlwX2ZhbGxiYWNrX2lkOwotCXUzMiBzYWx0OworCXN0YXRpYyB1MzIgaXBfaWRlbnRzX2hhc2hybmQgX19yZWFkX21vc3RseTsKKwl1MzIgaGFzaCwgaWQ7CiAKLQlzcGluX2xvY2tfYmgoJmlwX2ZiX2lkX2xvY2spOwotCXNhbHQgPSBzZWN1cmVfaXBfaWQoKF9fZm9yY2UgX19iZTMyKWlwX2ZhbGxiYWNrX2lkIF4gaXBoLT5kYWRkcik7Ci0JaXBoLT5pZCA9IGh0b25zKHNhbHQgJiAweEZGRkYpOwotCWlwX2ZhbGxiYWNrX2lkID0gc2FsdDsKLQlzcGluX3VubG9ja19iaCgmaXBfZmJfaWRfbG9jayk7Ci19CisJbmV0X2dldF9yYW5kb21fb25jZSgmaXBfaWRlbnRzX2hhc2hybmQsIHNpemVvZihpcF9pZGVudHNfaGFzaHJuZCkpOwogCi12b2lkIF9faXBfc2VsZWN0X2lkZW50KHN0cnVjdCBpcGhkciAqaXBoLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIGludCBtb3JlKQotewotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZHN0LT5kZXYpOwotCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXI7Ci0KLQlwZWVyID0gaW5ldF9nZXRwZWVyX3Y0KG5ldC0+aXB2NC5wZWVycywgaXBoLT5kYWRkciwgMSk7Ci0JaWYgKHBlZXIpIHsKLQkJaXBoLT5pZCA9IGh0b25zKGluZXRfZ2V0aWQocGVlciwgbW9yZSkpOwotCQlpbmV0X3B1dHBlZXIocGVlcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpcF9zZWxlY3RfZmJfaWRlbnQoaXBoKTsKKwloYXNoID0gamhhc2hfMXdvcmQoKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHIsIGlwX2lkZW50c19oYXNocm5kKTsKKwlpZCA9IGlwX2lkZW50c19yZXNlcnZlKGhhc2gsIHNlZ3MpOworCWlwaC0+aWQgPSBodG9ucyhpZCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9faXBfc2VsZWN0X2lkZW50KTsKIApAQCAtOTkzLDYgKzk3NCw5IEBACiAJc3RydWN0IGZsb3dpNCBmbDQ7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAKKwlpZiAoIW1hcmspCisJCW1hcmsgPSBJUDRfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CisKIAlfX2J1aWxkX2Zsb3dfa2V5KCZmbDQsIE5VTEwsIGlwaCwgb2lmLAogCQkJIFJUX1RPUyhpcGgtPnRvcyksIHByb3RvY29sLCBtYXJrLCBmbG93X2ZsYWdzKTsKIAlydCA9IF9faXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZmbDQpOwpAQCAtMTAxMCw2ICs5OTQsMTAgQEAKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAogCV9fYnVpbGRfZmxvd19rZXkoJmZsNCwgc2ssIGlwaCwgMCwgMCwgMCwgMCwgMCk7CisKKwlpZiAoIWZsNC5mbG93aTRfbWFyaykKKwkJZmw0LmZsb3dpNF9tYXJrID0gSVA0X1JFUExZX01BUksoc29ja19uZXQoc2spLCBza2ItPm1hcmspOworCiAJcnQgPSBfX2lwX3JvdXRlX291dHB1dF9rZXkoc29ja19uZXQoc2spLCAmZmw0KTsKIAlpZiAoIUlTX0VSUihydCkpIHsKIAkJX19pcF9ydF91cGRhdGVfcG10dShydCwgJmZsNCwgbXR1KTsKQEAgLTI3MDQsNiArMjY5MiwxMiBAQAogewogCWludCByYyA9IDA7CiAKKwlpcF9pZGVudHMgPSBrbWFsbG9jKElQX0lERU5UU19TWiAqIHNpemVvZigqaXBfaWRlbnRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcF9pZGVudHMpCisJCXBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIGlwX2lkZW50c1xuIik7CisKKwlwcmFuZG9tX2J5dGVzKGlwX2lkZW50cywgSVBfSURFTlRTX1NaICogc2l6ZW9mKCppcF9pZGVudHMpKTsKKwogI2lmZGVmIENPTkZJR19JUF9ST1VURV9DTEFTU0lECiAJaXBfcnRfYWNjdCA9IF9fYWxsb2NfcGVyY3B1KDI1NiAqIHNpemVvZihzdHJ1Y3QgaXBfcnRfYWNjdCksIF9fYWxpZ25vZl9fKHN0cnVjdCBpcF9ydF9hY2N0KSk7CiAJaWYgKCFpcF9ydF9hY2N0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3luY29va2llcy5jIGIvbmV0L2lwdjQvc3luY29va2llcy5jCmluZGV4IGYyZWQxM2MuLmM4NjYyNGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYworKysgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKQEAgLTMwMyw2ICszMDMsNyBAQAogCWlyZXEtPmlyX3JtdF9wb3J0CT0gdGgtPnNvdXJjZTsKIAlpcmVxLT5pcl9sb2NfYWRkcgk9IGlwX2hkcihza2IpLT5kYWRkcjsKIAlpcmVxLT5pcl9ybXRfYWRkcgk9IGlwX2hkcihza2IpLT5zYWRkcjsKKwlpcmVxLT5pcl9tYXJrCQk9IGluZXRfcmVxdWVzdF9tYXJrKHNrLCBza2IpOwogCWlyZXEtPmVjbl9vawkJPSBlY25fb2s7CiAJaXJlcS0+c25kX3dzY2FsZQk9IHRjcF9vcHQuc25kX3dzY2FsZTsKIAlpcmVxLT5zYWNrX29rCQk9IHRjcF9vcHQuc2Fja19vazsKQEAgLTMzOSw3ICszNDAsNyBAQAogCSAqIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHdlIHJlY2VpdmVkIHRoZSBvcmlnaW5hbCBzeW4sIGJ1dCBJIHNlZQogCSAqIG5vIGVhc3kgd2F5IHRvIGRvIHRoaXMuCiAJICovCi0JZmxvd2k0X2luaXRfb3V0cHV0KCZmbDQsIHNrLT5za19ib3VuZF9kZXZfaWYsIHNrLT5za19tYXJrLAorCWZsb3dpNF9pbml0X291dHB1dCgmZmw0LCBzay0+c2tfYm91bmRfZGV2X2lmLCBpcmVxLT5pcl9tYXJrLAogCQkJICAgUlRfQ09OTl9GTEFHUyhzayksIFJUX1NDT1BFX1VOSVZFUlNFLCBJUFBST1RPX1RDUCwKIAkJCSAgIGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJICAgKG9wdCAmJiBvcHQtPnNycikgPyBvcHQtPmZhZGRyIDogaXJlcS0+aXJfcm10X2FkZHIsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IDVjZGU4ZjIuLjc5YTAwN2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC00MzcsMTMgKzQzNyw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjCiAJfSwKIAl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9sb2NhbF9yZXNlcnZlZF9wb3J0cyIsCi0JCS5kYXRhCQk9IE5VTEwsIC8qIGluaXRpYWxpemVkIGluIHN5c2N0bF9pcHY0X2luaXQgKi8KLQkJLm1heGxlbgkJPSA2NTUzNiwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9fbGFyZ2VfYml0bWFwLAotCX0sCi0JewogCQkucHJvY25hbWUJPSAiaWdtcF9tYXhfbWVtYmVyc2hpcHMiLAogCQkuZGF0YQkJPSAmc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzLAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApAQCAtODI1LDYgKzgxOCwxMyBAQAogCQkucHJvY19oYW5kbGVyCT0gaXB2NF9sb2NhbF9wb3J0X3JhbmdlLAogCX0sCiAJeworCQkucHJvY25hbWUJPSAiaXBfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfbG9jYWxfcmVzZXJ2ZWRfcG9ydHMsCisJCS5tYXhsZW4JCT0gNjU1MzYsCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvX2xhcmdlX2JpdG1hcCwKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gImlwX25vX3BtdHVfZGlzYyIsCiAJCS5kYXRhCQk9ICZpbml0X25ldC5pcHY0LnN5c2N0bF9pcF9ub19wbXR1X2Rpc2MsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCkBAIC04MzgsNiArODM4LDIwIEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCisJeworCQkucHJvY25hbWUJPSAiZndtYXJrX3JlZmxlY3QiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfZndtYXJrX3JlZmxlY3QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUJPSAidGNwX2Z3bWFya19hY2NlcHQiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX2Z3bWFya19hY2NlcHQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCiAJeyB9CiB9OwogCkBAIC04NjIsOCArODc2LDE0IEBACiAJaWYgKG5ldC0+aXB2NC5pcHY0X2hkciA9PSBOVUxMKQogCQlnb3RvIGVycl9yZWc7CiAKKwluZXQtPmlwdjQuc3lzY3RsX2xvY2FsX3Jlc2VydmVkX3BvcnRzID0ga3phbGxvYyg2NTUzNiAvIDgsIEdGUF9LRVJORUwpOworCWlmICghbmV0LT5pcHY0LnN5c2N0bF9sb2NhbF9yZXNlcnZlZF9wb3J0cykKKwkJZ290byBlcnJfcG9ydHM7CisKIAlyZXR1cm4gMDsKIAorZXJyX3BvcnRzOgorCXVucmVnaXN0ZXJfbmV0X3N5c2N0bF90YWJsZShuZXQtPmlwdjQuaXB2NF9oZHIpOwogZXJyX3JlZzoKIAlpZiAoIW5ldF9lcShuZXQsICZpbml0X25ldCkpCiAJCWtmcmVlKHRhYmxlKTsKQEAgLTg3NSw2ICs4OTUsNyBAQAogewogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOwogCisJa2ZyZWUobmV0LT5pcHY0LnN5c2N0bF9sb2NhbF9yZXNlcnZlZF9wb3J0cyk7CiAJdGFibGUgPSBuZXQtPmlwdjQuaXB2NF9oZHItPmN0bF90YWJsZV9hcmc7CiAJdW5yZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKG5ldC0+aXB2NC5pcHY0X2hkcik7CiAJa2ZyZWUodGFibGUpOwpAQCAtODg4LDE2ICs5MDksNiBAQAogc3RhdGljIF9faW5pdCBpbnQgc3lzY3RsX2lwdjRfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7Ci0Jc3RydWN0IGN0bF90YWJsZSAqaTsKLQotCWZvciAoaSA9IGlwdjRfdGFibGU7IGktPnByb2NuYW1lOyBpKyspIHsKLQkJaWYgKHN0cmNtcChpLT5wcm9jbmFtZSwgImlwX2xvY2FsX3Jlc2VydmVkX3BvcnRzIikgPT0gMCkgewotCQkJaS0+ZGF0YSA9IHN5c2N0bF9sb2NhbF9yZXNlcnZlZF9wb3J0czsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghaS0+cHJvY25hbWUpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJaGRyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bCgmaW5pdF9uZXQsICJuZXQvaXB2NCIsIGlwdjRfdGFibGUpOwogCWlmIChoZHIgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggNGJkNmQ1Mi4uZWIxZGRlMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTI5MTYsNiArMjkxNiwxNCBAQAogCWNhc2UgVENQX1VTRVJfVElNRU9VVDoKIAkJdmFsID0gamlmZmllc190b19tc2VjcyhpY3NrLT5pY3NrX3VzZXJfdGltZW91dCk7CiAJCWJyZWFrOworCisJY2FzZSBUQ1BfRkFTVE9QRU46CisJCWlmIChpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnEgIT0gTlVMTCkKKwkJCXZhbCA9IGljc2stPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucS0+bWF4X3FsZW47CisJCWVsc2UKKwkJCXZhbCA9IDA7CisJCWJyZWFrOworCiAJY2FzZSBUQ1BfVElNRVNUQU1QOgogCQl2YWwgPSB0Y3BfdGltZV9zdGFtcCArIHRwLT50c29mZnNldDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfYmljLmMgYi9uZXQvaXB2NC90Y3BfYmljLmMKaW5kZXggODIxODQ2Zi4uZDVkZTY5YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2JpYy5jCisrKyBiL25ldC9pcHY0L3RjcF9iaWMuYwpAQCAtMTQwLDEzICsxNDAsMTIgQEAKIAkJY2EtPmNudCA9IDE7CiB9CiAKLXN0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJICAgICAgdTMyIGluX2ZsaWdodCkKK3N0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBiaWN0Y3AgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwogCi0JaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAogCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9jb25nLmMgYi9uZXQvaXB2NC90Y3BfY29uZy5jCmluZGV4IDJiOTQ2NGMuLjdiMDlkOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9jb25nLmMKKysrIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwpAQCAtMjc2LDI2ICsyNzYsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFJGQzI4NjEgQ2hlY2sgd2hldGhlciB3ZSBhcmUgbGltaXRlZCBieSBhcHBsaWNhdGlvbiBvciBjb25nZXN0aW9uIHdpbmRvdwotICogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBjd25kIGNoZWNrIGluIHRjcF90c29fc2hvdWxkX2RlZmVyCi0gKi8KLWJvb2wgdGNwX2lzX2N3bmRfbGltaXRlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHUzMiBpbl9mbGlnaHQpCi17Ci0JY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JdTMyIGxlZnQ7Ci0KLQlpZiAoaW5fZmxpZ2h0ID49IHRwLT5zbmRfY3duZCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlsZWZ0ID0gdHAtPnNuZF9jd25kIC0gaW5fZmxpZ2h0OwotCWlmIChza19jYW5fZ3NvKHNrKSAmJgotCSAgICBsZWZ0ICogc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IgPCB0cC0+c25kX2N3bmQgJiYKLQkgICAgbGVmdCA8IHRwLT54bWl0X3NpemVfZ29hbF9zZWdzKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gbGVmdCA8PSB0Y3BfbWF4X3Rzb19kZWZlcnJlZF9tc3ModHApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodGNwX2lzX2N3bmRfbGltaXRlZCk7Ci0KIC8qIFNsb3cgc3RhcnQgaXMgdXNlZCB3aGVuIGNvbmdlc3Rpb24gd2luZG93IGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGUgc2xvdyBzdGFydAogICogdGhyZXNob2xkLiBXZSBiYXNlIG9uIFJGQzI1ODEgYW5kIGFsc28gaGFuZGxlIHN0cmV0Y2ggQUNLcyBwcm9wZXJseS4KICAqIFdlIGRvIG5vdCBpbXBsZW1lbnQgUkZDMzQ2NSBBcHByb3ByaWF0ZSBCeXRlIENvdW50aW5nIChBQkMpIHBlciBzZSBidXQKQEAgLTMzNywxMSArMzE3LDExIEBACiAvKiBUaGlzIGlzIEphY29ic29uJ3Mgc2xvdyBzdGFydCBhbmQgY29uZ2VzdGlvbiBhdm9pZGFuY2UuCiAgKiBTSUdDT01NICc4OCwgcC4gMzI4LgogICovCi12b2lkIHRjcF9yZW5vX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQsIHUzMiBpbl9mbGlnaHQpCit2b2lkIHRjcF9yZW5vX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2ssIGluX2ZsaWdodCkpCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrKSkKIAkJcmV0dXJuOwogCiAJLyogSW4gInNhZmUiIGFyZWEsIGluY3JlYXNlLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2N1YmljLmMgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwppbmRleCBiNGYxYjI5Li5hOWJkOGE0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY3ViaWMuYworKysgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwpAQCAtMzA0LDEzICszMDQsMTIgQEAKIAkJY2EtPmNudCA9IDE7CiB9CiAKLXN0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJICAgICAgdTMyIGluX2ZsaWdodCkKK3N0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBiaWN0Y3AgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwogCi0JaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAogCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwppbmRleCBmMTk1ZDkzLi42MmU0OGNmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYworKysgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwpAQCAtNzIsMjUgKzcyLDIyNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIENvbXB1dGVzIHRoZSBmYXN0b3BlbiBjb29raWUgZm9yIHRoZSBJUCBwYXRoLgotICogVGhlIHBhdGggaXMgYSAxMjggYml0cyBsb25nIChwYWQgd2l0aCB6ZXJvcyBmb3IgSVB2NCkuCi0gKgotICogVGhlIGNhbGxlciBtdXN0IGNoZWNrIGZvYy0+bGVuIHRvIGRldGVybWluZSBpZiBhIHZhbGlkIGNvb2tpZQotICogaGFzIGJlZW4gZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseS4KLSovCi12b2lkIHRjcF9mYXN0b3Blbl9jb29raWVfZ2VuKF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsCi0JCQkgICAgIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICpmb2MpCitzdGF0aWMgYm9vbCBfX3RjcF9mYXN0b3Blbl9jb29raWVfZ2VuKGNvbnN0IHZvaWQgKnBhdGgsCisJCQkJICAgICAgc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgKmZvYykKIHsKLQlfX2JlMzIgcGF0aFs0XSA9IHsgc3JjLCBkc3QsIDAsIDAgfTsKIAlzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2NvbnRleHQgKmN0eDsKKwlib29sIG9rID0gZmFsc2U7CiAKIAl0Y3BfZmFzdG9wZW5faW5pdF9rZXlfb25jZSh0cnVlKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAljdHggPSByY3VfZGVyZWZlcmVuY2UodGNwX2Zhc3RvcGVuX2N0eCk7CiAJaWYgKGN0eCkgewotCQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKGN0eC0+dGZtLCBmb2MtPnZhbCwgKF9fdTggKilwYXRoKTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShjdHgtPnRmbSwgZm9jLT52YWwsIHBhdGgpOwogCQlmb2MtPmxlbiA9IFRDUF9GQVNUT1BFTl9DT09LSUVfU0laRTsKKwkJb2sgPSB0cnVlOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gb2s7CiB9CisKKy8qIEdlbmVyYXRlIHRoZSBmYXN0b3BlbiBjb29raWUgYnkgZG9pbmcgYWVzMTI4IGVuY3J5cHRpb24gb24gYm90aAorICogdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLiBQYWQgMHMgZm9yIElQdjQgb3IgSVB2NC1tYXBwZWQtSVB2NgorICogYWRkcmVzc2VzLiBGb3IgdGhlIGxvbmdlciBJUHY2IGFkZHJlc3NlcyB1c2UgQ0JDLU1BQy4KKyAqCisgKiBYWFggKFRGTykgLSByZWZhY3RvciB3aGVuIFRDUF9GQVNUT1BFTl9DT09LSUVfU0laRSAhPSBBRVNfQkxPQ0tfU0laRS4KKyAqLworc3RhdGljIGJvb2wgdGNwX2Zhc3RvcGVuX2Nvb2tpZV9nZW4oc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc3luLAorCQkJCSAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jKQoreworCWlmIChyZXEtPnJza19vcHMtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHN5bik7CisKKwkJX19iZTMyIHBhdGhbNF0gPSB7IGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIDAsIDAgfTsKKwkJcmV0dXJuIF9fdGNwX2Zhc3RvcGVuX2Nvb2tpZV9nZW4ocGF0aCwgZm9jKTsKKwl9CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCWlmIChyZXEtPnJza19vcHMtPmZhbWlseSA9PSBBRl9JTkVUNikgeworCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IGlwdjZfaGRyKHN5bik7CisJCXN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llIHRtcDsKKworCQlpZiAoX190Y3BfZmFzdG9wZW5fY29va2llX2dlbigmaXA2aC0+c2FkZHIsICZ0bXApKSB7CisJCQlzdHJ1Y3QgaW42X2FkZHIgKmJ1ZiA9IChzdHJ1Y3QgaW42X2FkZHIgKikgdG1wLnZhbDsKKwkJCWludCBpID0gNDsKKworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCQlidWYtPnM2X2FkZHIzMltpXSBePSBpcDZoLT5kYWRkci5zNl9hZGRyMzJbaV07CisJCQlyZXR1cm4gX190Y3BfZmFzdG9wZW5fY29va2llX2dlbihidWYsIGZvYyk7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHRjcF9mYXN0b3Blbl9jcmVhdGVfY2hpbGQoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSA9ICZpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlOworCXN0cnVjdCBzb2NrICpjaGlsZDsKKworCXJlcS0+bnVtX3JldHJhbnMgPSAwOworCXJlcS0+bnVtX3RpbWVvdXQgPSAwOworCXJlcS0+c2sgPSBOVUxMOworCisJY2hpbGQgPSBpbmV0X2NzayhzayktPmljc2tfYWZfb3BzLT5zeW5fcmVjdl9zb2NrKHNrLCBza2IsIHJlcSwgTlVMTCk7CisJaWYgKGNoaWxkID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9jaygmcXVldWUtPmZhc3RvcGVucS0+bG9jayk7CisJcXVldWUtPmZhc3RvcGVucS0+cWxlbisrOworCXNwaW5fdW5sb2NrKCZxdWV1ZS0+ZmFzdG9wZW5xLT5sb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaWxkIHNvY2tldC4gSGF2ZSB0byBmaXggc29tZSB2YWx1ZXMgdG8gdGFrZQorCSAqIGludG8gYWNjb3VudCB0aGUgY2hpbGQgaXMgYSBGYXN0IE9wZW4gc29ja2V0IGFuZCBpcyBjcmVhdGVkCisJICogb25seSBvdXQgb2YgdGhlIGJpdHMgY2FycmllZCBpbiB0aGUgU1lOIHBhY2tldC4KKwkgKi8KKwl0cCA9IHRjcF9zayhjaGlsZCk7CisKKwl0cC0+ZmFzdG9wZW5fcnNrID0gcmVxOworCS8qIERvIGEgaG9sZCBvbiB0aGUgbGlzdG5lciBzayBzbyB0aGF0IGlmIHRoZSBsaXN0ZW5lciBpcyBiZWluZworCSAqIGNsb3NlZCwgdGhlIGNoaWxkIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQgY2FuIGxpdmUgb24gYW5kIHN0aWxsCisJICogYWNjZXNzIGxpc3Rlbl9sb2NrLgorCSAqLworCXNvY2tfaG9sZChzayk7CisJdGNwX3JzayhyZXEpLT5saXN0ZW5lciA9IHNrOworCisJLyogUkZDMTMyMzogVGhlIHdpbmRvdyBpbiBTWU4gJiBTWU4vQUNLIHNlZ21lbnRzIGlzIG5ldmVyCisJICogc2NhbGVkLiBTbyBjb3JyZWN0IGl0IGFwcHJvcHJpYXRlbHkuCisJICovCisJdHAtPnNuZF93bmQgPSBudG9ocyh0Y3BfaGRyKHNrYiktPndpbmRvdyk7CisKKwkvKiBBY3RpdmF0ZSB0aGUgcmV0cmFucyB0aW1lciBzbyB0aGF0IFNZTkFDSyBjYW4gYmUgcmV0cmFuc21pdHRlZC4KKwkgKiBUaGUgcmVxdWVzdCBzb2NrZXQgaXMgbm90IGFkZGVkIHRvIHRoZSBTWU4gdGFibGUgb2YgdGhlIHBhcmVudAorCSAqIGJlY2F1c2UgaXQncyBiZWVuIGFkZGVkIHRvIHRoZSBhY2NlcHQgcXVldWUgZGlyZWN0bHkuCisJICovCisJaW5ldF9jc2tfcmVzZXRfeG1pdF90aW1lcihjaGlsZCwgSUNTS19USU1FX1JFVFJBTlMsCisJCQkJICBUQ1BfVElNRU9VVF9JTklULCBUQ1BfUlRPX01BWCk7CisKKwkvKiBBZGQgdGhlIGNoaWxkIHNvY2tldCBkaXJlY3RseSBpbnRvIHRoZSBhY2NlcHQgcXVldWUgKi8KKwlpbmV0X2Nza19yZXFza19xdWV1ZV9hZGQoc2ssIHJlcSwgY2hpbGQpOworCisJLyogTm93IGZpbmlzaCBwcm9jZXNzaW5nIHRoZSBmYXN0b3BlbiBjaGlsZCBzb2NrZXQuICovCisJaW5ldF9jc2soY2hpbGQpLT5pY3NrX2FmX29wcy0+cmVidWlsZF9oZWFkZXIoY2hpbGQpOworCXRjcF9pbml0X2Nvbmdlc3Rpb25fY29udHJvbChjaGlsZCk7CisJdGNwX210dXBfaW5pdChjaGlsZCk7CisJdGNwX2luaXRfbWV0cmljcyhjaGlsZCk7CisJdGNwX2luaXRfYnVmZmVyX3NwYWNlKGNoaWxkKTsKKworCS8qIFF1ZXVlIHRoZSBkYXRhIGNhcnJpZWQgaW4gdGhlIFNZTiBwYWNrZXQuIFdlIG5lZWQgdG8gZmlyc3QKKwkgKiBidW1wIHNrYidzIHJlZmNudCBiZWNhdXNlIHRoZSBjYWxsZXIgd2lsbCBhdHRlbXB0IHRvIGZyZWUgaXQuCisJICoKKwkgKiBYWFggKFRGTykgLSB3ZSBob25vciBhIHplcm8tcGF5bG9hZCBURk8gcmVxdWVzdCBmb3Igbm93LAorCSAqIChhbnkgcmVhc29uIG5vdCB0bz8pIGJ1dCBubyBuZWVkIHRvIHF1ZXVlIHRoZSBza2Igc2luY2UKKwkgKiB0aGVyZSBpcyBubyBkYXRhLiBIb3cgYWJvdXQgU1lOK0ZJTj8KKwkgKi8KKwlpZiAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMSkgeworCQlza2IgPSBza2JfZ2V0KHNrYik7CisJCXNrYl9kc3RfZHJvcChza2IpOworCQlfX3NrYl9wdWxsKHNrYiwgdGNwX2hkcihza2IpLT5kb2ZmICogNCk7CisJCXNrYl9zZXRfb3duZXJfcihza2IsIGNoaWxkKTsKKwkJX19za2JfcXVldWVfdGFpbCgmY2hpbGQtPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCXRwLT5zeW5fZGF0YV9hY2tlZCA9IDE7CisJfQorCXRjcF9yc2socmVxKS0+cmN2X254dCA9IHRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKKwliaF91bmxvY2tfc29jayhjaGlsZCk7CisJc29ja19wdXQoY2hpbGQpOworCVdBUk5fT04ocmVxLT5zayA9PSBOVUxMKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0wodGNwX2Zhc3RvcGVuX2NyZWF0ZV9jaGlsZCk7CisKK3N0YXRpYyBib29sIHRjcF9mYXN0b3Blbl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGZhc3RvcGVuX3F1ZXVlICpmYXN0b3BlbnE7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGxpc3RlbmVyIGhhcyBlbmFibGVkIGZhc3RvcGVuLCBhbmQgd2UgZG9uJ3QKKwkgKiBleGNlZWQgdGhlIG1heCAjIG9mIHBlbmRpbmcgVEZPIHJlcXVlc3RzIGFsbG93ZWQgYmVmb3JlIHRyeWluZworCSAqIHRvIHZhbGlkYXRpbmcgdGhlIGNvb2tpZSBpbiBvcmRlciB0byBhdm9pZCBidXJuaW5nIENQVSBjeWNsZXMKKwkgKiB1bm5lY2Vzc2FyaWx5LgorCSAqCisJICogWFhYIChURk8pIC0gVGhlIGltcGxpY2F0aW9uIG9mIGNoZWNraW5nIHRoZSBtYXhfcWxlbiBiZWZvcmUKKwkgKiBwcm9jZXNzaW5nIGEgY29va2llIHJlcXVlc3QgaXMgdGhhdCBjbGllbnRzIGNhbid0IGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIHFsZW4gb3ZlcmZsb3cgY2F1c2luZyBGYXN0IE9wZW4gdG8gYmUgZGlzYWJsZWQKKwkgKiB0ZW1wb3JhcmlseSB2cyBhIHNlcnZlciBub3Qgc3VwcG9ydGluZyBGYXN0IE9wZW4gYXQgYWxsLgorCSAqLworCWZhc3RvcGVucSA9IGluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUuZmFzdG9wZW5xOworCWlmIChmYXN0b3BlbnEgPT0gTlVMTCB8fCBmYXN0b3BlbnEtPm1heF9xbGVuID09IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmIChmYXN0b3BlbnEtPnFsZW4gPj0gZmFzdG9wZW5xLT5tYXhfcWxlbikgeworCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXExOworCQlzcGluX2xvY2soJmZhc3RvcGVucS0+bG9jayk7CisJCXJlcTEgPSBmYXN0b3BlbnEtPnJza3FfcnN0X2hlYWQ7CisJCWlmICgocmVxMSA9PSBOVUxMKSB8fCB0aW1lX2FmdGVyKHJlcTEtPmV4cGlyZXMsIGppZmZpZXMpKSB7CisJCQlzcGluX3VubG9jaygmZmFzdG9wZW5xLT5sb2NrKTsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAorCQkJCQkgTElOVVhfTUlCX1RDUEZBU1RPUEVOTElTVEVOT1ZFUkZMT1cpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZhc3RvcGVucS0+cnNrcV9yc3RfaGVhZCA9IHJlcTEtPmRsX25leHQ7CisJCWZhc3RvcGVucS0+cWxlbi0tOworCQlzcGluX3VubG9jaygmZmFzdG9wZW5xLT5sb2NrKTsKKwkJcmVxc2tfZnJlZShyZXExKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgcGVyZm9ybSBGYXN0IE9wZW4gb24gdGhlIFNZTi4gVGhlIGNvb2tpZSAoZm9jKQorICogbWF5IGJlIHVwZGF0ZWQgYW5kIHJldHVybiB0aGUgY2xpZW50IGluIHRoZSBTWU4tQUNLIGxhdGVyLiBFLmcuLCBGYXN0IE9wZW4KKyAqIGNvb2tpZSByZXF1ZXN0IChmb2MtPmxlbiA9PSAwKS4KKyAqLworYm9vbCB0Y3BfdHJ5X2Zhc3RvcGVuKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkgICAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jLAorCQkgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgdmFsaWRfZm9jID0geyAubGVuID0gLTEgfTsKKwlib29sIHN5bl9kYXRhID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKKworCWlmICghKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9FTkFCTEUpICYmCisJICAgICAgKHN5bl9kYXRhIHx8IGZvYy0+bGVuID49IDApICYmCisJICAgICAgdGNwX2Zhc3RvcGVuX3F1ZXVlX2NoZWNrKHNrKSkpIHsKKwkJZm9jLT5sZW4gPSAtMTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChzeW5fZGF0YSAmJiAoc3lzY3RsX3RjcF9mYXN0b3BlbiAmIFRGT19TRVJWRVJfQ09PS0lFX05PVF9SRVFEKSkKKwkJZ290byBmYXN0b3BlbjsKKworCWlmICh0Y3BfZmFzdG9wZW5fY29va2llX2dlbihyZXEsIHNrYiwgJnZhbGlkX2ZvYykgJiYKKwkgICAgZm9jLT5sZW4gPT0gVENQX0ZBU1RPUEVOX0NPT0tJRV9TSVpFICYmCisJICAgIGZvYy0+bGVuID09IHZhbGlkX2ZvYy5sZW4gJiYKKwkgICAgIW1lbWNtcChmb2MtPnZhbCwgdmFsaWRfZm9jLnZhbCwgZm9jLT5sZW4pKSB7CisJCS8qIENvb2tpZSBpcyB2YWxpZC4gQ3JlYXRlIGEgKGZ1bGwpIGNoaWxkIHNvY2tldCB0byBhY2NlcHQKKwkJICogdGhlIGRhdGEgaW4gU1lOIGJlZm9yZSByZXR1cm5pbmcgYSBTWU4tQUNLIHRvIGFjayB0aGUKKwkJICogZGF0YS4gSWYgd2UgZmFpbCB0byBjcmVhdGUgdGhlIHNvY2tldCwgZmFsbCBiYWNrIGFuZAorCQkgKiBhY2sgdGhlIElTTiBvbmx5IGJ1dCBpbmNsdWRlcyB0aGUgc2FtZSBjb29raWUuCisJCSAqCisJCSAqIE5vdGU6IERhdGEtbGVzcyBTWU4gd2l0aCB2YWxpZCBjb29raWUgaXMgYWxsb3dlZCB0byBzZW5kCisJCSAqIGRhdGEgaW4gU1lOX1JFQ1Ygc3RhdGUuCisJCSAqLworZmFzdG9wZW46CisJCWlmICh0Y3BfZmFzdG9wZW5fY3JlYXRlX2NoaWxkKHNrLCBza2IsIGRzdCwgcmVxKSkgeworCQkJZm9jLT5sZW4gPSAtMTsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAorCQkJCQkgTElOVVhfTUlCX1RDUEZBU1RPUEVOUEFTU0lWRSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBmb2MtPmxlbiA/CisJCQkgTElOVVhfTUlCX1RDUEZBU1RPUEVOUEFTU0lWRUZBSUwgOgorCQkJIExJTlVYX01JQl9UQ1BGQVNUT1BFTkNPT0tJRVJFUUQpOworCSpmb2MgPSB2YWxpZF9mb2M7CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfdHJ5X2Zhc3RvcGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9oaWdoc3BlZWQuYyBiL25ldC9pcHY0L3RjcF9oaWdoc3BlZWQuYwppbmRleCA4YjllN2JhLi4xYzQ5MDgyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaGlnaHNwZWVkLmMKKysrIGIvbmV0L2lwdjQvdGNwX2hpZ2hzcGVlZC5jCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogCXRwLT5zbmRfY3duZF9jbGFtcCA9IG1pbl90KHUzMiwgdHAtPnNuZF9jd25kX2NsYW1wLCAweGZmZmZmZmZmLzEyOCk7CiB9CiAKLXN0YXRpYyB2b2lkIGhzdGNwX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQsIHUzMiBpbl9mbGlnaHQpCitzdGF0aWMgdm9pZCBoc3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBoc3RjcCAqY2EgPSBpbmV0X2Nza19jYShzayk7CiAKLQlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2ssIGluX2ZsaWdodCkpCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h0Y3AuYyBiL25ldC9pcHY0L3RjcF9odGNwLmMKaW5kZXggNGExOTRhYy4uMDMxMzYxMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2h0Y3AuYworKysgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCkBAIC0yMjcsMTIgKzIyNywxMiBAQAogCXJldHVybiBtYXgoKHRwLT5zbmRfY3duZCAqIGNhLT5iZXRhKSA+PiA3LCAyVSk7CiB9CiAKLXN0YXRpYyB2b2lkIGh0Y3BfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCwgdTMyIGluX2ZsaWdodCkKK3N0YXRpYyB2b2lkIGh0Y3BfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgaHRjcCAqY2EgPSBpbmV0X2Nza19jYShzayk7CiAKLQlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2ssIGluX2ZsaWdodCkpCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h5YmxhLmMgYi9uZXQvaXB2NC90Y3BfaHlibGEuYwppbmRleCBhMTVhNzk5Li5kOGY4ZjA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaHlibGEuYworKysgYi9uZXQvaXB2NC90Y3BfaHlibGEuYwpAQCAtODcsOCArODcsNyBAQAogICogICAgIG8gR2l2ZSBjd25kIGEgbmV3IHZhbHVlIGJhc2VkIG9uIHRoZSBtb2RlbCBwcm9wb3NlZAogICogICAgIG8gcmVtZW1iZXIgaW5jcmVtZW50cyA8MQogICovCi1zdGF0aWMgdm9pZCBoeWJsYV9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJICAgICB1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgaHlibGFfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgaHlibGEgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwpAQCAtMTAxLDExICsxMDAsMTEgQEAKIAkJY2EtPm1pbnJ0dF91cyA9IHRwLT5zcnR0X3VzOwogCX0KIAotCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaywgaW5fZmxpZ2h0KSkKKwlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2spKQogCQlyZXR1cm47CiAKIAlpZiAoIWNhLT5oeWJsYV9lbikgewotCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkLCBpbl9mbGlnaHQpOworCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lsbGlub2lzLmMgYi9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYwppbmRleCA4NjNkMTA1Li41OTk5YjM5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYworKysgYi9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYwpAQCAtMjU1LDggKzI1NSw3IEBACiAvKgogICogSW5jcmVhc2Ugd2luZG93IGluIHJlc3BvbnNlIHRvIHN1Y2Nlc3NmdWwgYWNrbm93bGVkZ21lbnQuCiAgKi8KLXN0YXRpYyB2b2lkIHRjcF9pbGxpbm9pc19jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJCSAgICB1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKQEAgLTI2NSw3ICsyNjQsNyBAQAogCQl1cGRhdGVfcGFyYW1zKHNrKTsKIAogCS8qIFJGQzI4NjEgb25seSBpbmNyZWFzZSBjd25kIGlmIGZ1bGx5IHV0aWxpemVkICovCi0JaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAogCS8qIEluIHNsb3cgc3RhcnQgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggM2EyNmIzYi4uNDA2NjFmYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTExNjcsNyArMTE2Nyw3IEBACiAJCQl9CiAJCQlwa3RfbGVuID0gbmV3X2xlbjsKIAkJfQotCQllcnIgPSB0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgcGt0X2xlbiwgbXNzKTsKKwkJZXJyID0gdGNwX2ZyYWdtZW50KHNrLCBza2IsIHBrdF9sZW4sIG1zcywgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMjQxLDcgKzIyNDEsOCBAQAogCQkJCWJyZWFrOwogCiAJCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwotCQkJZXJyID0gdGNwX2ZyYWdtZW50KHNrLCBza2IsIChwYWNrZXRzIC0gb2xkY250KSAqIG1zcywgbXNzKTsKKwkJCWVyciA9IHRjcF9mcmFnbWVudChzaywgc2tiLCAocGFja2V0cyAtIG9sZGNudCkgKiBtc3MsCisJCQkJCSAgIG1zcywgR0ZQX0FUT01JQyk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlicmVhazsKIAkJCWNudCA9IHBhY2tldHM7CkBAIC0yOTM3LDEwICsyOTM4LDExIEBACiAJCXRjcF9hY2tfdXBkYXRlX3J0dChzaywgRkxBR19TWU5fQUNLRUQsIHNlcV9ydHRfdXMsIC0xTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLCB1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgdGNwX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCWljc2stPmljc2tfY2Ffb3BzLT5jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkLCBpbl9mbGlnaHQpOworCisJaWNzay0+aWNza19jYV9vcHMtPmNvbmdfYXZvaWQoc2ssIGFjaywgYWNrZWQpOwogCXRjcF9zayhzayktPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiB9CiAKQEAgLTMzNjMsNyArMzM2NSw2IEBACiAJdTMyIGFja19zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAl1MzIgYWNrID0gVENQX1NLQl9DQihza2IpLT5hY2tfc2VxOwogCWJvb2wgaXNfZHVwYWNrID0gZmFsc2U7Ci0JdTMyIHByaW9yX2luX2ZsaWdodDsKIAl1MzIgcHJpb3JfZmFja2V0czsKIAlpbnQgcHJpb3JfcGFja2V0cyA9IHRwLT5wYWNrZXRzX291dDsKIAljb25zdCBpbnQgcHJpb3JfdW5zYWNrZWQgPSB0cC0+cGFja2V0c19vdXQgLSB0cC0+c2Fja2VkX291dDsKQEAgLTMzOTYsNyArMzM5Nyw2IEBACiAJCWZsYWcgfD0gRkxBR19TTkRfVU5BX0FEVkFOQ0VEOwogCiAJcHJpb3JfZmFja2V0cyA9IHRwLT5mYWNrZXRzX291dDsKLQlwcmlvcl9pbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOwogCiAJLyogdHNfcmVjZW50IHVwZGF0ZSBtdXN0IGJlIG1hZGUgYWZ0ZXIgd2UgYXJlIHN1cmUgdGhhdCB0aGUgcGFja2V0CiAJICogaXMgaW4gd2luZG93LgpAQCAtMzQ1MSw3ICszNDUxLDcgQEAKIAogCS8qIEFkdmFuY2UgY3duZCBpZiBzdGF0ZSBhbGxvd3MgKi8KIAlpZiAodGNwX21heV9yYWlzZV9jd25kKHNrLCBmbGFnKSkKLQkJdGNwX2NvbmdfYXZvaWQoc2ssIGFjaywgYWNrZWQsIHByaW9yX2luX2ZsaWdodCk7CisJCXRjcF9jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkKTsKIAogCWlmICh0Y3BfYWNrX2lzX2R1YmlvdXMoc2ssIGZsYWcpKSB7CiAJCWlzX2R1cGFjayA9ICEoZmxhZyAmIChGTEFHX1NORF9VTkFfQURWQU5DRUQgfCBGTEFHX05PVF9EVVApKTsKQEAgLTQ3MDIsMjggKzQ3MDIsNiBAQAogCXJldHVybiAtMTsKIH0KIAotLyogUkZDMjg2MSwgc2xvdyBwYXJ0LiBBZGp1c3QgY3duZCwgYWZ0ZXIgaXQgd2FzIG5vdCBmdWxsIGR1cmluZyBvbmUgcnRvLgotICogQXMgYWRkaXRpb25hbCBwcm90ZWN0aW9ucywgd2UgZG8gbm90IHRvdWNoIGN3bmQgaW4gcmV0cmFuc21pc3Npb24gcGhhc2VzLAotICogYW5kIGlmIGFwcGxpY2F0aW9uIGhpdCBpdHMgc25kYnVmIGxpbWl0IHJlY2VudGx5LgotICovCi12b2lkIHRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCi0JaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbiAmJgotCSAgICBzay0+c2tfc29ja2V0ICYmICF0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncykpIHsKLQkJLyogTGltaXRlZCBieSBhcHBsaWNhdGlvbiBvciByZWNlaXZlciB3aW5kb3cuICovCi0JCXUzMiBpbml0X3dpbiA9IHRjcF9pbml0X2N3bmQodHAsIF9fc2tfZHN0X2dldChzaykpOwotCQl1MzIgd2luX3VzZWQgPSBtYXgodHAtPnNuZF9jd25kX3VzZWQsIGluaXRfd2luKTsKLQkJaWYgKHdpbl91c2VkIDwgdHAtPnNuZF9jd25kKSB7Ci0JCQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2goc2spOwotCQkJdHAtPnNuZF9jd25kID0gKHRwLT5zbmRfY3duZCArIHdpbl91c2VkKSA+PiAxOwotCQl9Ci0JCXRwLT5zbmRfY3duZF91c2VkID0gMDsKLQl9Ci0JdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Ci19Ci0KIHN0YXRpYyBib29sIHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1Zihjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCA0MzhmM2I5Li43N2NjY2RhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTMzNiw4ICszMzYsOCBAQAogCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoaWNtcF9za2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKLQlfX3UzMiBzZXE7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqZmFzdG9wZW47CisJX191MzIgc2VxLCBzbmRfdW5hOwogCV9fdTMyIHJlbWFpbmluZzsKIAlpbnQgZXJyOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaWNtcF9za2ItPmRldik7CkBAIC0zNzgsMTIgKzM3OCwxMiBAQAogCiAJaWNzayA9IGluZXRfY3NrKHNrKTsKIAl0cCA9IHRjcF9zayhzayk7Ci0JcmVxID0gdHAtPmZhc3RvcGVuX3JzazsKIAlzZXEgPSBudG9obCh0aC0+c2VxKTsKKwkvKiBYWFggKFRGTykgLSB0cC0+c25kX3VuYSBzaG91bGQgYmUgSVNOICh0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoKSAqLworCWZhc3RvcGVuID0gdHAtPmZhc3RvcGVuX3JzazsKKwlzbmRfdW5hID0gZmFzdG9wZW4gPyB0Y3BfcnNrKGZhc3RvcGVuKS0+c250X2lzbiA6IHRwLT5zbmRfdW5hOwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgotCSAgICAhYmV0d2VlbihzZXEsIHRwLT5zbmRfdW5hLCB0cC0+c25kX254dCkgJiYKLQkgICAgKHJlcSA9PSBOVUxMIHx8IHNlcSAhPSB0Y3BfcnNrKHJlcSktPnNudF9pc24pKSB7Ci0JCS8qIEZvciBhIEZhc3QgT3BlbiBzb2NrZXQsIGFsbG93IHNlcSB0byBiZSBzbnRfaXNuLiAqLworCSAgICAhYmV0d2VlbihzZXEsIHNuZF91bmEsIHRwLT5zbmRfbnh0KSkgewogCQlORVRfSU5DX1NUQVRTX0JIKG5ldCwgTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MjYsMTEgKzQyNiw5IEBACiAJCWlmIChjb2RlICE9IElDTVBfTkVUX1VOUkVBQ0ggJiYgY29kZSAhPSBJQ01QX0hPU1RfVU5SRUFDSCkKIAkJCWJyZWFrOwogCQlpZiAoc2VxICE9IHRwLT5zbmRfdW5hICB8fCAhaWNzay0+aWNza19yZXRyYW5zbWl0cyB8fAotCQkgICAgIWljc2stPmljc2tfYmFja29mZikKKwkJICAgICFpY3NrLT5pY3NrX2JhY2tvZmYgfHwgZmFzdG9wZW4pCiAJCQlicmVhazsKIAotCQkvKiBYWFggKFRGTykgLSByZXZpc2l0IHRoZSBmb2xsb3dpbmcgbG9naWMgZm9yIFRGTyAqLwotCiAJCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQogCQkJYnJlYWs7CiAKQEAgLTQ2MiwxNCArNDYwLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JLyogWFhYIChURk8pIC0gaWYgaXQncyBhIFRGTyBzb2NrZXQgYW5kIGhhcyBiZWVuIGFjY2VwdGVkLCByYXRoZXIKLQkgKiB0aGFuIGZvbGxvd2luZyB0aGUgVENQX1NZTl9SRUNWIGNhc2UgYW5kIGNsb3NpbmcgdGhlIHNvY2tldCwKLQkgKiB3ZSBpZ25vcmUgdGhlIElDTVAgZXJyb3IgYW5kIGtlZXAgdHJ5aW5nIGxpa2UgYSBmdWxseSBlc3RhYmxpc2hlZAotCSAqIHNvY2tldC4gSXMgdGhpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8/Ci0JICovCi0JaWYgKHJlcSAmJiByZXEtPnNrID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCiAJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKIAkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCAqKnByZXY7CiAJY2FzZSBUQ1BfTElTVEVOOgpAQCAtNTAyLDEwICs0OTIsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAljYXNlIFRDUF9TWU5fU0VOVDoKLQljYXNlIFRDUF9TWU5fUkVDVjogIC8qIENhbm5vdCBoYXBwZW4uCi0JCQkgICAgICAgSXQgY2FuIGYuZS4gaWYgU1lOcyBjcm9zc2VkLAotCQkJICAgICAgIG9yIEZhc3QgT3Blbi4KLQkJCSAgICAgKi8KKwljYXNlIFRDUF9TWU5fUkVDVjoKKwkJLyogT25seSBpbiBmYXN0IG9yIHNpbXVsdGFuZW91cyBvcGVuLiBJZiBhIGZhc3Qgb3BlbiBzb2NrZXQgaXMKKwkJICogaXMgYWxyZWFkeSBhY2NlcHRlZCBpdCBpcyB0cmVhdGVkIGFzIGEgY29ubmVjdGVkIG9uZSBiZWxvdy4KKwkJICovCisJCWlmIChmYXN0b3BlbiAmJiBmYXN0b3Blbi0+c2sgPT0gTlVMTCkKKwkJCWJyZWFrOworCiAJCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQkJc2stPnNrX2VyciA9IGVycjsKIApAQCAtODIyLDcgKzgxNSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgdGNwX3Y0X3NlbmRfc3luYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAogCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJICAgICAgdTE2IHF1ZXVlX21hcHBpbmcpCisJCQkgICAgICB1MTYgcXVldWVfbWFwcGluZywKKwkJCSAgICAgIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICpmb2MpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKQEAgLTgzMyw3ICs4MjcsNyBAQAogCWlmICghZHN0ICYmIChkc3QgPSBpbmV0X2Nza19yb3V0ZV9yZXEoc2ssICZmbDQsIHJlcSkpID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCXNrYiA9IHRjcF9tYWtlX3N5bmFjayhzaywgZHN0LCByZXEsIE5VTEwpOworCXNrYiA9IHRjcF9tYWtlX3N5bmFjayhzaywgZHN0LCByZXEsIGZvYyk7CiAKIAlpZiAoc2tiKSB7CiAJCV9fdGNwX3Y0X3NlbmRfY2hlY2soc2tiLCBpcmVxLT5pcl9sb2NfYWRkciwgaXJlcS0+aXJfcm10X2FkZHIpOwpAQCAtODUyLDcgKzg0Niw3IEBACiAKIHN0YXRpYyBpbnQgdGNwX3Y0X3J0eF9zeW5hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7Ci0JaW50IHJlcyA9IHRjcF92NF9zZW5kX3N5bmFjayhzaywgTlVMTCwgcmVxLCAwKTsKKwlpbnQgcmVzID0gdGNwX3Y0X3NlbmRfc3luYWNrKHNrLCBOVUxMLCByZXEsIDAsIE5VTEwpOwogCiAJaWYgKCFyZXMpIHsKIAkJVENQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIFRDUF9NSUJfUkVUUkFOU1NFR1MpOwpAQCAtMTI2MCwxODcgKzEyNTQsNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgYm9vbCB0Y3BfZmFzdG9wZW5fY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCSAgICAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jLAotCQkJICAgICAgIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICp2YWxpZF9mb2MpCi17Ci0JYm9vbCBza2lwX2Nvb2tpZSA9IGZhbHNlOwotCXN0cnVjdCBmYXN0b3Blbl9xdWV1ZSAqZmFzdG9wZW5xOwotCi0JaWYgKGxpa2VseSghZmFzdG9wZW5fY29va2llX3ByZXNlbnQoZm9jKSkpIHsKLQkJLyogU2VlIGluY2x1ZGUvbmV0L3RjcC5oIGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBrbm9icyAqLwotCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0FMV0FZUykgfHwKLQkJICAgICgoc3lzY3RsX3RjcF9mYXN0b3BlbiAmIFRGT19TRVJWRVJfQ09PS0lFX05PVF9SRVFEKSAmJgotCQkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIDEpKSkKLQkJCXNraXBfY29va2llID0gdHJ1ZTsgLyogbm8gY29va2llIHRvIHZhbGlkYXRlICovCi0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JZmFzdG9wZW5xID0gaW5ldF9jc2soc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnE7Ci0JLyogQSBGTyBvcHRpb24gaXMgcHJlc2VudDsgYnVtcCB0aGUgY291bnRlci4gKi8KLQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUEZBU1RPUEVOUEFTU0lWRSk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIGxpc3RlbmVyIGhhcyBlbmFibGVkIGZhc3RvcGVuLCBhbmQgd2UgZG9uJ3QKLQkgKiBleGNlZWQgdGhlIG1heCAjIG9mIHBlbmRpbmcgVEZPIHJlcXVlc3RzIGFsbG93ZWQgYmVmb3JlIHRyeWluZwotCSAqIHRvIHZhbGlkYXRpbmcgdGhlIGNvb2tpZSBpbiBvcmRlciB0byBhdm9pZCBidXJuaW5nIENQVSBjeWNsZXMKLQkgKiB1bm5lY2Vzc2FyaWx5LgotCSAqCi0JICogWFhYIChURk8pIC0gVGhlIGltcGxpY2F0aW9uIG9mIGNoZWNraW5nIHRoZSBtYXhfcWxlbiBiZWZvcmUKLQkgKiBwcm9jZXNzaW5nIGEgY29va2llIHJlcXVlc3QgaXMgdGhhdCBjbGllbnRzIGNhbid0IGRpZmZlcmVudGlhdGUKLQkgKiBiZXR3ZWVuIHFsZW4gb3ZlcmZsb3cgY2F1c2luZyBGYXN0IE9wZW4gdG8gYmUgZGlzYWJsZWQKLQkgKiB0ZW1wb3JhcmlseSB2cyBhIHNlcnZlciBub3Qgc3VwcG9ydGluZyBGYXN0IE9wZW4gYXQgYWxsLgotCSAqLwotCWlmICgoc3lzY3RsX3RjcF9mYXN0b3BlbiAmIFRGT19TRVJWRVJfRU5BQkxFKSA9PSAwIHx8Ci0JICAgIGZhc3RvcGVucSA9PSBOVUxMIHx8IGZhc3RvcGVucS0+bWF4X3FsZW4gPT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGZhc3RvcGVucS0+cWxlbiA+PSBmYXN0b3BlbnEtPm1heF9xbGVuKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTE7Ci0JCXNwaW5fbG9jaygmZmFzdG9wZW5xLT5sb2NrKTsKLQkJcmVxMSA9IGZhc3RvcGVucS0+cnNrcV9yc3RfaGVhZDsKLQkJaWYgKChyZXExID09IE5VTEwpIHx8IHRpbWVfYWZ0ZXIocmVxMS0+ZXhwaXJlcywgamlmZmllcykpIHsKLQkJCXNwaW5fdW5sb2NrKCZmYXN0b3BlbnEtPmxvY2spOwotCQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCi0JCQkgICAgTElOVVhfTUlCX1RDUEZBU1RPUEVOTElTVEVOT1ZFUkZMT1cpOwotCQkJLyogQXZvaWQgYnVtcGluZyBMSU5VWF9NSUJfVENQRkFTVE9QRU5QQVNTSVZFRkFJTCovCi0JCQlmb2MtPmxlbiA9IC0xOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZhc3RvcGVucS0+cnNrcV9yc3RfaGVhZCA9IHJlcTEtPmRsX25leHQ7Ci0JCWZhc3RvcGVucS0+cWxlbi0tOwotCQlzcGluX3VubG9jaygmZmFzdG9wZW5xLT5sb2NrKTsKLQkJcmVxc2tfZnJlZShyZXExKTsKLQl9Ci0JaWYgKHNraXBfY29va2llKSB7Ci0JCXRjcF9yc2socmVxKS0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JaWYgKGZvYy0+bGVuID09IFRDUF9GQVNUT1BFTl9DT09LSUVfU0laRSkgewotCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0NPT0tJRV9OT1RfQ0hLRUQpID09IDApIHsKLQkJCXRjcF9mYXN0b3Blbl9jb29raWVfZ2VuKGlwX2hkcihza2IpLT5zYWRkciwKLQkJCQkJCWlwX2hkcihza2IpLT5kYWRkciwgdmFsaWRfZm9jKTsKLQkJCWlmICgodmFsaWRfZm9jLT5sZW4gIT0gVENQX0ZBU1RPUEVOX0NPT0tJRV9TSVpFKSB8fAotCQkJICAgIG1lbWNtcCgmZm9jLT52YWxbMF0sICZ2YWxpZF9mb2MtPnZhbFswXSwKLQkJCSAgICBUQ1BfRkFTVE9QRU5fQ09PS0lFX1NJWkUpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJdmFsaWRfZm9jLT5sZW4gPSAtMTsKLQkJfQotCQkvKiBBY2tub3dsZWRnZSB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLiAqLwotCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSBpZiAoZm9jLT5sZW4gPT0gMCkgeyAvKiBDbGllbnQgcmVxdWVzdGluZyBhIGNvb2tpZSAqLwotCQl0Y3BfZmFzdG9wZW5fY29va2llX2dlbihpcF9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJCWlwX2hkcihza2IpLT5kYWRkciwgdmFsaWRfZm9jKTsKLQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCi0JCSAgICBMSU5VWF9NSUJfVENQRkFTVE9QRU5DT09LSUVSRVFEKTsKLQl9IGVsc2UgewotCQkvKiBDbGllbnQgc2VudCBhIGNvb2tpZSB3aXRoIHdyb25nIHNpemUuIFRyZWF0IGl0Ci0JCSAqIHRoZSBzYW1lIGFzIGludmFsaWQgYW5kIHJldHVybiBhIHZhbGlkIG9uZS4KLQkJICovCi0JCXRjcF9mYXN0b3Blbl9jb29raWVfZ2VuKGlwX2hkcihza2IpLT5zYWRkciwKLQkJCQkJaXBfaGRyKHNrYiktPmRhZGRyLCB2YWxpZF9mb2MpOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgdGNwX3Y0X2Nvbm5fcmVxX2Zhc3RvcGVuKHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9zeW5hY2ssCi0JCQkJICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSA9ICZpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlOwotCWNvbnN0IHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7Ci0Jc3RydWN0IHNvY2sgKmNoaWxkOwotCWludCBlcnI7Ci0KLQlyZXEtPm51bV9yZXRyYW5zID0gMDsKLQlyZXEtPm51bV90aW1lb3V0ID0gMDsKLQlyZXEtPnNrID0gTlVMTDsKLQotCWNoaWxkID0gaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+c3luX3JlY3Zfc29jayhzaywgc2tiLCByZXEsIE5VTEwpOwotCWlmIChjaGlsZCA9PSBOVUxMKSB7Ci0JCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAotCQkJCSBMSU5VWF9NSUJfVENQRkFTVE9QRU5QQVNTSVZFRkFJTCk7Ci0JCWtmcmVlX3NrYihza2Jfc3luYWNrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiX3N5bmFjaywgc2ssIGlyZXEtPmlyX2xvY19hZGRyLAotCQkJCSAgICBpcmVxLT5pcl9ybXRfYWRkciwgaXJlcS0+b3B0KTsKLQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7Ci0JaWYgKCFlcnIpCi0JCXRjcF9yc2socmVxKS0+c250X3N5bmFjayA9IHRjcF90aW1lX3N0YW1wOwotCS8qIFhYWCAoVEZPKSAtIGlzIGl0IG9rIHRvIGlnbm9yZSBlcnJvciBhbmQgY29udGludWU/ICovCi0KLQlzcGluX2xvY2soJnF1ZXVlLT5mYXN0b3BlbnEtPmxvY2spOwotCXF1ZXVlLT5mYXN0b3BlbnEtPnFsZW4rKzsKLQlzcGluX3VubG9jaygmcXVldWUtPmZhc3RvcGVucS0+bG9jayk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBjaGlsZCBzb2NrZXQuIEhhdmUgdG8gZml4IHNvbWUgdmFsdWVzIHRvIHRha2UKLQkgKiBpbnRvIGFjY291bnQgdGhlIGNoaWxkIGlzIGEgRmFzdCBPcGVuIHNvY2tldCBhbmQgaXMgY3JlYXRlZAotCSAqIG9ubHkgb3V0IG9mIHRoZSBiaXRzIGNhcnJpZWQgaW4gdGhlIFNZTiBwYWNrZXQuCi0JICovCi0JdHAgPSB0Y3Bfc2soY2hpbGQpOwotCi0JdHAtPmZhc3RvcGVuX3JzayA9IHJlcTsKLQkvKiBEbyBhIGhvbGQgb24gdGhlIGxpc3RuZXIgc2sgc28gdGhhdCBpZiB0aGUgbGlzdGVuZXIgaXMgYmVpbmcKLQkgKiBjbG9zZWQsIHRoZSBjaGlsZCB0aGF0IGhhcyBiZWVuIGFjY2VwdGVkIGNhbiBsaXZlIG9uIGFuZCBzdGlsbAotCSAqIGFjY2VzcyBsaXN0ZW5fbG9jay4KLQkgKi8KLQlzb2NrX2hvbGQoc2spOwotCXRjcF9yc2socmVxKS0+bGlzdGVuZXIgPSBzazsKLQotCS8qIFJGQzEzMjM6IFRoZSB3aW5kb3cgaW4gU1lOICYgU1lOL0FDSyBzZWdtZW50cyBpcyBuZXZlcgotCSAqIHNjYWxlZC4gU28gY29ycmVjdCBpdCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXRwLT5zbmRfd25kID0gbnRvaHModGNwX2hkcihza2IpLT53aW5kb3cpOwotCi0JLyogQWN0aXZhdGUgdGhlIHJldHJhbnMgdGltZXIgc28gdGhhdCBTWU5BQ0sgY2FuIGJlIHJldHJhbnNtaXR0ZWQuCi0JICogVGhlIHJlcXVlc3Qgc29ja2V0IGlzIG5vdCBhZGRlZCB0byB0aGUgU1lOIHRhYmxlIG9mIHRoZSBwYXJlbnQKLQkgKiBiZWNhdXNlIGl0J3MgYmVlbiBhZGRlZCB0byB0aGUgYWNjZXB0IHF1ZXVlIGRpcmVjdGx5LgotCSAqLwotCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoY2hpbGQsIElDU0tfVElNRV9SRVRSQU5TLAotCSAgICBUQ1BfVElNRU9VVF9JTklULCBUQ1BfUlRPX01BWCk7Ci0KLQkvKiBBZGQgdGhlIGNoaWxkIHNvY2tldCBkaXJlY3RseSBpbnRvIHRoZSBhY2NlcHQgcXVldWUgKi8KLQlpbmV0X2Nza19yZXFza19xdWV1ZV9hZGQoc2ssIHJlcSwgY2hpbGQpOwotCi0JLyogTm93IGZpbmlzaCBwcm9jZXNzaW5nIHRoZSBmYXN0b3BlbiBjaGlsZCBzb2NrZXQuICovCi0JaW5ldF9jc2soY2hpbGQpLT5pY3NrX2FmX29wcy0+cmVidWlsZF9oZWFkZXIoY2hpbGQpOwotCXRjcF9pbml0X2Nvbmdlc3Rpb25fY29udHJvbChjaGlsZCk7Ci0JdGNwX210dXBfaW5pdChjaGlsZCk7Ci0JdGNwX2luaXRfbWV0cmljcyhjaGlsZCk7Ci0JdGNwX2luaXRfYnVmZmVyX3NwYWNlKGNoaWxkKTsKLQotCS8qIFF1ZXVlIHRoZSBkYXRhIGNhcnJpZWQgaW4gdGhlIFNZTiBwYWNrZXQuIFdlIG5lZWQgdG8gZmlyc3QKLQkgKiBidW1wIHNrYidzIHJlZmNudCBiZWNhdXNlIHRoZSBjYWxsZXIgd2lsbCBhdHRlbXB0IHRvIGZyZWUgaXQuCi0JICoKLQkgKiBYWFggKFRGTykgLSB3ZSBob25vciBhIHplcm8tcGF5bG9hZCBURk8gcmVxdWVzdCBmb3Igbm93LgotCSAqIChBbnkgcmVhc29uIG5vdCB0bz8pCi0JICovCi0JaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9PSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIDEpIHsKLQkJLyogRG9uJ3QgcXVldWUgdGhlIHNrYiBpZiB0aGVyZSBpcyBubyBwYXlsb2FkIGluIFNZTi4KLQkJICogWFhYIChURk8pIC0gSG93IGFib3V0IFNZTitGSU4/Ci0JCSAqLwotCQl0cC0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQl9IGVsc2UgewotCQlza2IgPSBza2JfZ2V0KHNrYik7Ci0JCXNrYl9kc3RfZHJvcChza2IpOwotCQlfX3NrYl9wdWxsKHNrYiwgdGNwX2hkcihza2IpLT5kb2ZmICogNCk7Ci0JCXNrYl9zZXRfb3duZXJfcihza2IsIGNoaWxkKTsKLQkJX19za2JfcXVldWVfdGFpbCgmY2hpbGQtPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7Ci0JCXRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCQl0cC0+c3luX2RhdGFfYWNrZWQgPSAxOwotCX0KLQlzay0+c2tfZGF0YV9yZWFkeShzayk7Ci0JYmhfdW5sb2NrX3NvY2soY2hpbGQpOwotCXNvY2tfcHV0KGNoaWxkKTsKLQlXQVJOX09OKHJlcS0+c2sgPT0gTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCB0Y3BfdjRfY29ubl9yZXF1ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgdG1wX29wdDsKQEAgLTE0NTEsMTIgKzEyNjQsMTAgQEAKIAlfX2JlMzIgc2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJX19iZTMyIGRhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCV9fdTMyIGlzbiA9IFRDUF9TS0JfQ0Ioc2tiKS0+d2hlbjsKLQlib29sIHdhbnRfY29va2llID0gZmFsc2U7CisJYm9vbCB3YW50X2Nvb2tpZSA9IGZhbHNlLCBmYXN0b3BlbjsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKIAlzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSBmb2MgPSB7IC5sZW4gPSAtMSB9OwotCXN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llIHZhbGlkX2ZvYyA9IHsgLmxlbiA9IC0xIH07Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl9zeW5hY2s7Ci0JaW50IGRvX2Zhc3RvcGVuOworCWludCBlcnI7CiAKIAkvKiBOZXZlciBhbnN3ZXIgdG8gU1lOcyBzZW5kIHRvIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgKi8KIAlpZiAoc2tiX3J0YWJsZShza2IpLT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVCB8IFJUQ0ZfTVVMVElDQVNUKSkKQEAgLTE1MDcsNiArMTMxOCw3IEBACiAJaXJlcS0+aXJfcm10X2FkZHIgPSBzYWRkcjsKIAlpcmVxLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2spLT50cmFuc3BhcmVudDsKIAlpcmVxLT5vcHQgPSB0Y3BfdjRfc2F2ZV9vcHRpb25zKHNrYik7CisJaXJlcS0+aXJfbWFyayA9IGluZXRfcmVxdWVzdF9tYXJrKHNrLCBza2IpOwogCiAJaWYgKHNlY3VyaXR5X2luZXRfY29ubl9yZXF1ZXN0KHNrLCBza2IsIHJlcSkpCiAJCWdvdG8gZHJvcF9hbmRfZnJlZTsKQEAgLTE1NTUsNTIgKzEzNjcsMjQgQEAKIAogCQlpc24gPSB0Y3BfdjRfaW5pdF9zZXF1ZW5jZShza2IpOwogCX0KLQl0Y3BfcnNrKHJlcSktPnNudF9pc24gPSBpc247Ci0KLQlpZiAoZHN0ID09IE5VTEwpIHsKLQkJZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCAmZmw0LCByZXEpOwotCQlpZiAoZHN0ID09IE5VTEwpCi0JCQlnb3RvIGRyb3BfYW5kX2ZyZWU7Ci0JfQotCWRvX2Zhc3RvcGVuID0gdGNwX2Zhc3RvcGVuX2NoZWNrKHNrLCBza2IsIHJlcSwgJmZvYywgJnZhbGlkX2ZvYyk7Ci0KLQkvKiBXZSBkb24ndCBjYWxsIHRjcF92NF9zZW5kX3N5bmFjaygpIGRpcmVjdGx5IGJlY2F1c2Ugd2UgbmVlZAotCSAqIHRvIG1ha2Ugc3VyZSBhIGNoaWxkIHNvY2tldCBjYW4gYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlCi0JICogc2VuZGluZyBiYWNrIHN5bmFjayEKLQkgKgotCSAqIFhYWCAoVEZPKSAtIElkZWFsbHkgb25lIHdvdWxkIHNpbXBseSBjYWxsIHRjcF92NF9zZW5kX3N5bmFjaygpCi0JICogKG9yIGJldHRlciB5ZXQsIGNhbGwgdGNwX3NlbmRfc3luYWNrKCkgaW4gdGhlIGNoaWxkIGNvbnRleHQKLQkgKiBkaXJlY3RseSwgYnV0IHdpbGwgaGF2ZSB0byBmaXggYnVuY2ggb2Ygb3RoZXIgY29kZSBmaXJzdCkKLQkgKiBhZnRlciBzeW5fcmVjdl9zb2NrKCkgZXhjZXB0IG9uZSB3aWxsIG5lZWQgdG8gZmlyc3QgZml4IHRoZQotCSAqIGxhdHRlciB0byByZW1vdmUgaXRzIGRlcGVuZGVuY3kgb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLQkgKiBvZiB0Y3BfdjRfc2VuZF9zeW5hY2soKS0+dGNwX3NlbGVjdF9pbml0aWFsX3dpbmRvdygpLgotCSAqLwotCXNrYl9zeW5hY2sgPSB0Y3BfbWFrZV9zeW5hY2soc2ssIGRzdCwgcmVxLAotCSAgICBmYXN0b3Blbl9jb29raWVfcHJlc2VudCgmdmFsaWRfZm9jKSA/ICZ2YWxpZF9mb2MgOiBOVUxMKTsKLQotCWlmIChza2Jfc3luYWNrKSB7Ci0JCV9fdGNwX3Y0X3NlbmRfY2hlY2soc2tiX3N5bmFjaywgaXJlcS0+aXJfbG9jX2FkZHIsIGlyZXEtPmlyX3JtdF9hZGRyKTsKLQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYl9zeW5hY2ssIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQl9IGVsc2UKKwlpZiAoIWRzdCAmJiAoZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCAmZmw0LCByZXEpKSA9PSBOVUxMKQogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAKLQlpZiAobGlrZWx5KCFkb19mYXN0b3BlbikpIHsKLQkJaW50IGVycjsKLQkJZXJyID0gaXBfYnVpbGRfYW5kX3NlbmRfcGt0KHNrYl9zeW5hY2ssIHNrLCBpcmVxLT5pcl9sb2NfYWRkciwKLQkJICAgICBpcmVxLT5pcl9ybXRfYWRkciwgaXJlcS0+b3B0KTsKLQkJZXJyID0gbmV0X3htaXRfZXZhbChlcnIpOworCXRjcF9yc2socmVxKS0+c250X2lzbiA9IGlzbjsKKwl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSB0Y3BfdGltZV9zdGFtcDsKKwl0Y3Bfb3BlbnJlcV9pbml0X3J3aW4ocmVxLCBzaywgZHN0KTsKKwlmYXN0b3BlbiA9ICF3YW50X2Nvb2tpZSAmJgorCQkgICB0Y3BfdHJ5X2Zhc3RvcGVuKHNrLCBza2IsIHJlcSwgJmZvYywgZHN0KTsKKwllcnIgPSB0Y3BfdjRfc2VuZF9zeW5hY2soc2ssIGRzdCwgcmVxLAorCQkJCSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSwgJmZvYyk7CisJaWYgKCFmYXN0b3BlbikgewogCQlpZiAoZXJyIHx8IHdhbnRfY29va2llKQogCQkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJCXRjcF9yc2socmVxKS0+c250X3N5bmFjayA9IHRjcF90aW1lX3N0YW1wOwogCQl0Y3BfcnNrKHJlcSktPmxpc3RlbmVyID0gTlVMTDsKLQkJLyogQWRkIHRoZSByZXF1ZXN0X3NvY2sgdG8gdGhlIFNZTiB0YWJsZSAqLwogCQlpbmV0X2Nza19yZXFza19xdWV1ZV9oYXNoX2FkZChzaywgcmVxLCBUQ1BfVElNRU9VVF9JTklUKTsKLQkJaWYgKGZhc3RvcGVuX2Nvb2tpZV9wcmVzZW50KCZmb2MpICYmIGZvYy5sZW4gIT0gMCkKLQkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAotCQkJICAgIExJTlVYX01JQl9UQ1BGQVNUT1BFTlBBU1NJVkVGQUlMKTsKLQl9IGVsc2UgaWYgKHRjcF92NF9jb25uX3JlcV9mYXN0b3Blbihzaywgc2tiLCBza2Jfc3luYWNrLCByZXEpKQotCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CisJfQogCiAJcmV0dXJuIDA7CiAKQEAgLTE3NDQsMjggKzE1MjgsNiBAQAogCXJldHVybiBzazsKIH0KIAotc3RhdGljIF9fc3VtMTYgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7Ci0JCWlmICghdGNwX3Y0X2NoZWNrKHNrYi0+bGVuLCBpcGgtPnNhZGRyLAotCQkJCSAgaXBoLT5kYWRkciwgc2tiLT5jc3VtKSkgewotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCi0JCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1RDUCwgMCk7Ci0KLQlpZiAoc2tiLT5sZW4gPD0gNzYpIHsKLQkJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KIC8qIFRoZSBzb2NrZXQgbXVzdCBoYXZlIGl0J3Mgc3BpbmxvY2sgaGVsZCB3aGVuIHdlIGdldAogICogaGVyZS4KICAqCkBAIC0xOTYwLDcgKzE3MjIsOCBAQAogCSAqIFBhY2tldCBsZW5ndGggYW5kIGRvZmYgYXJlIHZhbGlkYXRlZCBieSBoZWFkZXIgcHJlZGljdGlvbiwKIAkgKiBwcm92aWRlZCBjYXNlIG9mIHRoLT5kb2ZmPT0wIGlzIGVsaW1pbmF0ZWQuCiAJICogU28sIHdlIGRlZmVyIHRoZSBjaGVja3MuICovCi0JaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIHRjcF92NF9jaGVja3N1bV9pbml0KHNrYikpCisKKwlpZiAoc2tiX2NoZWNrc3VtX2luaXQoc2tiLCBJUFBST1RPX1RDUCwgaW5ldF9jb21wdXRlX3BzZXVkbykpCiAJCWdvdG8gY3N1bV9lcnJvcjsKIAogCXRoID0gdGNwX2hkcihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2xwLmMgYi9uZXQvaXB2NC90Y3BfbHAuYwppbmRleCBjOWFlY2FlLi4xZTcwZmE4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbHAuYworKysgYi9uZXQvaXB2NC90Y3BfbHAuYwpAQCAtMTE1LDEzICsxMTUsMTIgQEAKICAqIFdpbGwgb25seSBjYWxsIG5ld1Jlbm8gQ0Egd2hlbiBhd2F5IGZyb20gaW5mZXJlbmNlLgogICogRnJvbSBUQ1AtTFAncyBwYXBlciwgdGhpcyB3aWxsIGJlIGhhbmRsZWQgaW4gYWRkaXRpdmUgaW5jcmVhc2VtZW50LgogICovCi1zdGF0aWMgdm9pZCB0Y3BfbHBfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCwKLQkJCSAgICAgIHUzMiBpbl9mbGlnaHQpCitzdGF0aWMgdm9pZCB0Y3BfbHBfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCkKIHsKIAlzdHJ1Y3QgbHAgKmxwID0gaW5ldF9jc2tfY2Eoc2spOwogCiAJaWYgKCEobHAtPmZsYWcgJiBMUF9XSVRISU5fSU5GKSkKLQkJdGNwX3Jlbm9fY29uZ19hdm9pZChzaywgYWNrLCBhY2tlZCwgaW5fZmxpZ2h0KTsKKwkJdGNwX3Jlbm9fY29uZ19hdm9pZChzaywgYWNrLCBhY2tlZCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21ldHJpY3MuYyBiL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMKaW5kZXggZGNhZjcyZi4uNGZlMDQxOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21ldHJpY3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWV0cmljcy5jCkBAIC0xMTU5LDEwICsxMTU5LDcgQEAKIAkJCXRtID0gbmV4dDsKIAkJfQogCX0KLQlpZiAoaXNfdm1hbGxvY19hZGRyKG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoKSkKLQkJdmZyZWUobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2gpOwotCWVsc2UKLQkJa2ZyZWUobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2gpOworCWt2ZnJlZShuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCk7CiB9CiAKIHN0YXRpYyBfX25ldF9pbml0ZGF0YSBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgdGNwX25ldF9tZXRyaWNzX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwppbmRleCAwNWMxYjE1Li5lNjhlMGQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCkBAIC0zNjIsNiArMzYyLDM3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfdHdza19kZXN0cnVjdG9yKTsKIAordm9pZCB0Y3Bfb3BlbnJlcV9pbml0X3J3aW4oc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJICAgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlfX3U4IHJjdl93c2NhbGU7CisJaW50IG1zcyA9IGRzdF9tZXRyaWNfYWR2bXNzKGRzdCk7CisKKwlpZiAodHAtPnJ4X29wdC51c2VyX21zcyAmJiB0cC0+cnhfb3B0LnVzZXJfbXNzIDwgbXNzKQorCQltc3MgPSB0cC0+cnhfb3B0LnVzZXJfbXNzOworCisJLyogU2V0IHRoaXMgdXAgb24gdGhlIGZpcnN0IGNhbGwgb25seSAqLworCXJlcS0+d2luZG93X2NsYW1wID0gdHAtPndpbmRvd19jbGFtcCA/IDogZHN0X21ldHJpYyhkc3QsIFJUQVhfV0lORE9XKTsKKworCS8qIGxpbWl0IHRoZSB3aW5kb3cgc2VsZWN0aW9uIGlmIHRoZSB1c2VyIGVuZm9yY2UgYSBzbWFsbGVyIHJ4IGJ1ZmZlciAqLworCWlmIChzay0+c2tfdXNlcmxvY2tzICYgU09DS19SQ1ZCVUZfTE9DSyAmJgorCSAgICAocmVxLT53aW5kb3dfY2xhbXAgPiB0Y3BfZnVsbF9zcGFjZShzaykgfHwgcmVxLT53aW5kb3dfY2xhbXAgPT0gMCkpCisJCXJlcS0+d2luZG93X2NsYW1wID0gdGNwX2Z1bGxfc3BhY2Uoc2spOworCisJLyogdGNwX2Z1bGxfc3BhY2UgYmVjYXVzZSBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBmaXJzdCBwYWNrZXQgKi8KKwl0Y3Bfc2VsZWN0X2luaXRpYWxfd2luZG93KHRjcF9mdWxsX3NwYWNlKHNrKSwKKwkJbXNzIC0gKGlyZXEtPnRzdGFtcF9vayA/IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgOiAwKSwKKwkJJnJlcS0+cmN2X3duZCwKKwkJJnJlcS0+d2luZG93X2NsYW1wLAorCQlpcmVxLT53c2NhbGVfb2ssCisJCSZyY3Zfd3NjYWxlLAorCQlkc3RfbWV0cmljKGRzdCwgUlRBWF9JTklUUldORCkpOworCWlyZXEtPnJjdl93c2NhbGUgPSByY3Zfd3NjYWxlOworfQorRVhQT1JUX1NZTUJPTCh0Y3Bfb3BlbnJlcV9pbml0X3J3aW4pOworCiBzdGF0aWMgaW5saW5lIHZvaWQgVENQX0VDTl9vcGVucmVxX2NoaWxkKHN0cnVjdCB0Y3Bfc29jayAqdHAsCiAJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvdGNwX29mZmxvYWQuYwppbmRleCBiOTJiODE3Li40ZTg2YzU5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMKQEAgLTU3LDEwICs1NywxMiBAQAogCQkJICAgICAgIFNLQl9HU09fVENQX0VDTiB8CiAJCQkgICAgICAgU0tCX0dTT19UQ1BWNiB8CiAJCQkgICAgICAgU0tCX0dTT19HUkUgfAorCQkJICAgICAgIFNLQl9HU09fR1JFX0NTVU0gfAogCQkJICAgICAgIFNLQl9HU09fSVBJUCB8CiAJCQkgICAgICAgU0tCX0dTT19TSVQgfAogCQkJICAgICAgIFNLQl9HU09fTVBMUyB8CiAJCQkgICAgICAgU0tCX0dTT19VRFBfVFVOTkVMIHwKKwkJCSAgICAgICBTS0JfR1NPX1VEUF9UVU5ORUxfQ1NVTSB8CiAJCQkgICAgICAgMCkgfHwKIAkJCSAgICAgISh0eXBlICYgKFNLQl9HU09fVENQVjQgfCBTS0JfR1NPX1RDUFY2KSkpKQogCQkJZ290byBvdXQ7CkBAIC05Nyw5ICs5OSw3IEBACiAJCXRoLT5jaGVjayA9IG5ld2NoZWNrOwogCiAJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQotCQkJdGgtPmNoZWNrID0KLQkJCSAgICAgY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAotCQkJCQkJICAgIHRobGVuLCBza2ItPmNzdW0pKTsKKwkJCXRoLT5jaGVjayA9IGdzb19tYWtlX2NoZWNrc3VtKHNrYiwgfnRoLT5jaGVjayk7CiAKIAkJc2VxICs9IG1zczsKIAkJaWYgKGNvcHlfZGVzdHJ1Y3RvcikgewpAQCAtMTMzLDggKzEzMyw3IEBACiAJdGgtPmNoZWNrID0gfmNzdW1fZm9sZCgoX19mb3JjZSBfX3dzdW0pKChfX2ZvcmNlIHUzMil0aC0+Y2hlY2sgKwogCQkJCShfX2ZvcmNlIHUzMilkZWx0YSkpOwogCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQotCQl0aC0+Y2hlY2sgPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCi0JCQkJCQkgICB0aGxlbiwgc2tiLT5jc3VtKSk7CisJCXRoLT5jaGVjayA9IGdzb19tYWtlX2NoZWNrc3VtKHNrYiwgfnRoLT5jaGVjayk7CiBvdXQ6CiAJcmV0dXJuIHNlZ3M7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggMmQzNDBiZC4uZDkyYmNlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAJCWlmICh1bmxpa2VseSghaXJlcS0+dHN0YW1wX29rKSkKIAkJCXJlbWFpbmluZyAtPSBUQ1BPTEVOX1NBQ0tQRVJNX0FMSUdORUQ7CiAJfQotCWlmIChmb2MgIT0gTlVMTCkgeworCWlmIChmb2MgIT0gTlVMTCAmJiBmb2MtPmxlbiA+PSAwKSB7CiAJCXUzMiBuZWVkID0gVENQT0xFTl9FWFBfRkFTVE9QRU5fQkFTRSArIGZvYy0+bGVuOwogCQluZWVkID0gKG5lZWQgKyAzKSAmIH4zVTsgIC8qIEFsaWduIHRvIDMyIGJpdHMgKi8KIAkJaWYgKHJlbWFpbmluZyA+PSBuZWVkKSB7CkBAIC04NzgsMTUgKzg3OCw4IEBACiAJQlVHX09OKCFza2IgfHwgIXRjcF9za2JfcGNvdW50KHNrYikpOwogCiAJaWYgKGNsb25lX2l0KSB7Ci0JCWNvbnN0IHN0cnVjdCBza19idWZmICpmY2xvbmUgPSBza2IgKyAxOwotCiAJCXNrYl9tc3RhbXBfZ2V0KCZza2ItPnNrYl9tc3RhbXApOwogCi0JCWlmICh1bmxpa2VseShza2ItPmZjbG9uZSA9PSBTS0JfRkNMT05FX09SSUcgJiYKLQkJCSAgICAgZmNsb25lLT5mY2xvbmUgPT0gU0tCX0ZDTE9ORV9DTE9ORSkpCi0JCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwKLQkJCQkgICAgICBMSU5VWF9NSUJfVENQU1BVUklPVVNfUlRYX0hPU1RRVUVVRVMpOwotCiAJCWlmICh1bmxpa2VseShza2JfY2xvbmVkKHNrYikpKQogCQkJc2tiID0gcHNrYl9jb3B5KHNrYiwgZ2ZwX21hc2spOwogCQllbHNlCkBAIC0xMDgxLDcgKzEwNzQsNyBAQAogICogUmVtZW1iZXIsIHRoZXNlIGFyZSBzdGlsbCBoZWFkZXJsZXNzIFNLQnMgYXQgdGhpcyBwb2ludC4KICAqLwogaW50IHRjcF9mcmFnbWVudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sCi0JCSB1bnNpZ25lZCBpbnQgbXNzX25vdykKKwkJIHVuc2lnbmVkIGludCBtc3Nfbm93LCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CkBAIC0xMDk2LDExICsxMDg5LDExIEBACiAJaWYgKG5zaXplIDwgMCkKIAkJbnNpemUgPSAwOwogCi0JaWYgKHNrYl91bmNsb25lKHNrYiwgR0ZQX0FUT01JQykpCisJaWYgKHNrYl91bmNsb25lKHNrYiwgZ2ZwKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBHZXQgYSBuZXcgc2tiLi4uIGZvcmNlIGZsYWcgb24uICovCi0JYnVmZiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssIG5zaXplLCBHRlBfQVRPTUlDKTsKKwlidWZmID0gc2tfc3RyZWFtX2FsbG9jX3NrYihzaywgbnNpemUsIGdmcCk7CiAJaWYgKGJ1ZmYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07IC8qIFdlJ2xsIGp1c3QgdHJ5IGFnYWluIGxhdGVyLiAqLwogCkBAIC0xMzg3LDEyICsxMzgwLDQzIEBACiAJcmV0dXJuIG1zc19ub3c7CiB9CiAKLS8qIENvbmdlc3Rpb24gd2luZG93IHZhbGlkYXRpb24uIChSRkMyODYxKSAqLwotc3RhdGljIHZvaWQgdGNwX2N3bmRfdmFsaWRhdGUoc3RydWN0IHNvY2sgKnNrKQorLyogUkZDMjg2MSwgc2xvdyBwYXJ0LiBBZGp1c3QgY3duZCwgYWZ0ZXIgaXQgd2FzIG5vdCBmdWxsIGR1cmluZyBvbmUgcnRvLgorICogQXMgYWRkaXRpb25hbCBwcm90ZWN0aW9ucywgd2UgZG8gbm90IHRvdWNoIGN3bmQgaW4gcmV0cmFuc21pc3Npb24gcGhhc2VzLAorICogYW5kIGlmIGFwcGxpY2F0aW9uIGhpdCBpdHMgc25kYnVmIGxpbWl0IHJlY2VudGx5LgorICovCitzdGF0aWMgdm9pZCB0Y3BfY3duZF9hcHBsaWNhdGlvbl9saW1pdGVkKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCWlmICh0cC0+cGFja2V0c19vdXQgPj0gdHAtPnNuZF9jd25kKSB7CisJaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbiAmJgorCSAgICBzay0+c2tfc29ja2V0ICYmICF0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncykpIHsKKwkJLyogTGltaXRlZCBieSBhcHBsaWNhdGlvbiBvciByZWNlaXZlciB3aW5kb3cuICovCisJCXUzMiBpbml0X3dpbiA9IHRjcF9pbml0X2N3bmQodHAsIF9fc2tfZHN0X2dldChzaykpOworCQl1MzIgd2luX3VzZWQgPSBtYXgodHAtPnNuZF9jd25kX3VzZWQsIGluaXRfd2luKTsKKwkJaWYgKHdpbl91c2VkIDwgdHAtPnNuZF9jd25kKSB7CisJCQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2goc2spOworCQkJdHAtPnNuZF9jd25kID0gKHRwLT5zbmRfY3duZCArIHdpbl91c2VkKSA+PiAxOworCQl9CisJCXRwLT5zbmRfY3duZF91c2VkID0gMDsKKwl9CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9jd25kX3ZhbGlkYXRlKHN0cnVjdCBzb2NrICpzaywgYm9vbCBpc19jd25kX2xpbWl0ZWQpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBUcmFjayB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcGFja2V0cyBpbiBlYWNoCisJICogd2luZG93LCBhbmQgcmVtZW1iZXIgd2hldGhlciB3ZSB3ZXJlIGN3bmQtbGltaXRlZCB0aGVuLgorCSAqLworCWlmICghYmVmb3JlKHRwLT5zbmRfdW5hLCB0cC0+bWF4X3BhY2tldHNfc2VxKSB8fAorCSAgICB0cC0+cGFja2V0c19vdXQgPiB0cC0+bWF4X3BhY2tldHNfb3V0KSB7CisJCXRwLT5tYXhfcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CisJCXRwLT5tYXhfcGFja2V0c19zZXEgPSB0cC0+c25kX254dDsKKwkJdHAtPmlzX2N3bmRfbGltaXRlZCA9IGlzX2N3bmRfbGltaXRlZDsKKwl9CisKKwlpZiAodGNwX2lzX2N3bmRfbGltaXRlZChzaykpIHsKIAkJLyogTmV0d29yayBpcyBmZWVkIGZ1bGx5LiAqLwogCQl0cC0+c25kX2N3bmRfdXNlZCA9IDA7CiAJCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwpAQCAtMTYwMSw3ICsxNjI1LDcgQEAKIAogCS8qIEFsbCBvZiBhIFRTTyBmcmFtZSBtdXN0IGJlIGNvbXBvc2VkIG9mIHBhZ2VkIGRhdGEuICAqLwogCWlmIChza2ItPmxlbiAhPSBza2ItPmRhdGFfbGVuKQotCQlyZXR1cm4gdGNwX2ZyYWdtZW50KHNrLCBza2IsIGxlbiwgbXNzX25vdyk7CisJCXJldHVybiB0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgbGVuLCBtc3Nfbm93LCBnZnApOwogCiAJYnVmZiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssIDAsIGdmcCk7CiAJaWYgKHVubGlrZWx5KGJ1ZmYgPT0gTlVMTCkpCkBAIC0xNjQ0LDcgKzE2NjgsOCBAQAogICoKICAqIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gSm9obiBIZWZmbmVyLgogICovCi1zdGF0aWMgYm9vbCB0Y3BfdHNvX3Nob3VsZF9kZWZlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgYm9vbCB0Y3BfdHNvX3Nob3VsZF9kZWZlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIGJvb2wgKmlzX2N3bmRfbGltaXRlZCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CkBAIC0xNzA4LDYgKzE3MzMsOSBAQAogCWlmICghdHAtPnRzb19kZWZlcnJlZCkKIAkJdHAtPnRzb19kZWZlcnJlZCA9IDEgfCAoamlmZmllcyA8PCAxKTsKIAorCWlmIChjb25nX3dpbiA8IHNlbmRfd2luICYmIGNvbmdfd2luIDwgc2tiLT5sZW4pCisJCSppc19jd25kX2xpbWl0ZWQgPSB0cnVlOworCiAJcmV0dXJuIHRydWU7CiAKIHNlbmRfbm93OgpAQCAtMTg2OCw2ICsxODk2LDcgQEAKIAl1bnNpZ25lZCBpbnQgdHNvX3NlZ3MsIHNlbnRfcGt0czsKIAlpbnQgY3duZF9xdW90YTsKIAlpbnQgcmVzdWx0OworCWJvb2wgaXNfY3duZF9saW1pdGVkID0gZmFsc2U7CiAKIAlzZW50X3BrdHMgPSAwOwogCkBAIC0xODkyLDYgKzE5MjEsNyBAQAogCiAJCWN3bmRfcXVvdGEgPSB0Y3BfY3duZF90ZXN0KHRwLCBza2IpOwogCQlpZiAoIWN3bmRfcXVvdGEpIHsKKwkJCWlzX2N3bmRfbGltaXRlZCA9IHRydWU7CiAJCQlpZiAocHVzaF9vbmUgPT0gMikKIAkJCQkvKiBGb3JjZSBvdXQgYSBsb3NzIHByb2JlIHBrdC4gKi8KIAkJCQljd25kX3F1b3RhID0gMTsKQEAgLTE5MDgsNyArMTkzOCw4IEBACiAJCQkJCQkgICAgICBub25hZ2xlIDogVENQX05BR0xFX1BVU0gpKSkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIXB1c2hfb25lICYmIHRjcF90c29fc2hvdWxkX2RlZmVyKHNrLCBza2IpKQorCQkJaWYgKCFwdXNoX29uZSAmJgorCQkJICAgIHRjcF90c29fc2hvdWxkX2RlZmVyKHNrLCBza2IsICZpc19jd25kX2xpbWl0ZWQpKQogCQkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NzMsNyArMjAwNCw3IEBACiAJCS8qIFNlbmQgb25lIGxvc3MgcHJvYmUgcGVyIHRhaWwgbG9zcyBlcGlzb2RlLiAqLwogCQlpZiAocHVzaF9vbmUgIT0gMikKIAkJCXRjcF9zY2hlZHVsZV9sb3NzX3Byb2JlKHNrKTsKLQkJdGNwX2N3bmRfdmFsaWRhdGUoc2spOworCQl0Y3BfY3duZF92YWxpZGF0ZShzaywgaXNfY3duZF9saW1pdGVkKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gKHB1c2hfb25lID09IDIpIHx8ICghdHAtPnBhY2tldHNfb3V0ICYmIHRjcF9zZW5kX2hlYWQoc2spKTsKQEAgLTIwMzcsNiArMjA2OCwyNSBAQAogCXJldHVybiB0cnVlOwogfQogCisvKiBUaGFua3MgdG8gc2tiIGZhc3QgY2xvbmVzLCB3ZSBjYW4gZGV0ZWN0IGlmIGEgcHJpb3IgdHJhbnNtaXQgb2YKKyAqIGEgcGFja2V0IGlzIHN0aWxsIGluIGEgcWRpc2Mgb3IgZHJpdmVyIHF1ZXVlLgorICogSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSBwb2ludCBkb2luZyBhIHJldHJhbnNtaXQgIQorICogTm90ZTogVGhpcyBpcyBjYWxsZWQgZnJvbSBCSCBjb250ZXh0IG9ubHkuCisgKi8KK3N0YXRpYyBib29sIHNrYl9zdGlsbF9pbl9ob3N0X3F1ZXVlKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZmNsb25lID0gc2tiICsgMTsKKworCWlmICh1bmxpa2VseShza2ItPmZjbG9uZSA9PSBTS0JfRkNMT05FX09SSUcgJiYKKwkJICAgICBmY2xvbmUtPmZjbG9uZSA9PSBTS0JfRkNMT05FX0NMT05FKSkgeworCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwKKwkJCQkgTElOVVhfTUlCX1RDUFNQVVJJT1VTX1JUWF9IT1NUUVVFVUVTKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogLyogV2hlbiBwcm9iZSB0aW1lb3V0IChQVE8pIGZpcmVzLCBzZW5kIGEgbmV3IHNlZ21lbnQgaWYgb25lIGV4aXN0cywgZWxzZQogICogcmV0cmFuc21pdCB0aGUgbGFzdCBzZWdtZW50LgogICovCkBAIC0yMDYyLDEyICsyMTEyLDE2IEBACiAJaWYgKFdBUk5fT04oIXNrYikpCiAJCWdvdG8gcmVhcm1fdGltZXI7CiAKKwlpZiAoc2tiX3N0aWxsX2luX2hvc3RfcXVldWUoc2ssIHNrYikpCisJCWdvdG8gcmVhcm1fdGltZXI7CisKIAlwY291bnQgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCWlmIChXQVJOX09OKCFwY291bnQpKQogCQlnb3RvIHJlYXJtX3RpbWVyOwogCiAJaWYgKChwY291bnQgPiAxKSAmJiAoc2tiLT5sZW4gPiAocGNvdW50IC0gMSkgKiBtc3MpKSB7Ci0JCWlmICh1bmxpa2VseSh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgKHBjb3VudCAtIDEpICogbXNzLCBtc3MpKSkKKwkJaWYgKHVubGlrZWx5KHRjcF9mcmFnbWVudChzaywgc2tiLCAocGNvdW50IC0gMSkgKiBtc3MsIG1zcywKKwkJCQkJICBHRlBfQVRPTUlDKSkpCiAJCQlnb3RvIHJlYXJtX3RpbWVyOwogCQlza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAJfQpAQCAtMjA3NSw5ICsyMTI5LDcgQEAKIAlpZiAoV0FSTl9PTighc2tiIHx8ICF0Y3Bfc2tiX3Bjb3VudChza2IpKSkKIAkJZ290byByZWFybV90aW1lcjsKIAotCS8qIFByb2JlIHdpdGggemVybyBkYXRhIGRvZXNuJ3QgdHJpZ2dlciBmYXN0IHJlY292ZXJ5LiAqLwotCWlmIChza2ItPmxlbiA+IDApCi0JCWVyciA9IF9fdGNwX3JldHJhbnNtaXRfc2tiKHNrLCBza2IpOworCWVyciA9IF9fdGNwX3JldHJhbnNtaXRfc2tiKHNrLCBza2IpOwogCiAJLyogUmVjb3JkIHNuZF9ueHQgZm9yIGxvc3MgZGV0ZWN0aW9uLiAqLwogCWlmIChsaWtlbHkoIWVycikpCkBAIC0yMzgzLDYgKzI0MzUsOSBAQAogCSAgICBtaW4oc2stPnNrX3dtZW1fcXVldWVkICsgKHNrLT5za193bWVtX3F1ZXVlZCA+PiAyKSwgc2stPnNrX3NuZGJ1ZikpCiAJCXJldHVybiAtRUFHQUlOOwogCisJaWYgKHNrYl9zdGlsbF9pbl9ob3N0X3F1ZXVlKHNrLCBza2IpKQorCQlyZXR1cm4gLUVCVVNZOworCiAJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnNuZF91bmEpKSB7CiAJCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+c25kX3VuYSkpCiAJCQlCVUcoKTsKQEAgLTI0MDUsNyArMjQ2MCw3IEBACiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKHNrYi0+bGVuID4gY3VyX21zcykgewotCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIGN1cl9tc3MsIGN1cl9tc3MpKQorCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIGN1cl9tc3MsIGN1cl9tc3MsIEdGUF9BVE9NSUMpKQogCQkJcmV0dXJuIC1FTk9NRU07IC8qIFdlJ2xsIHRyeSBhZ2FpbiBsYXRlci4gKi8KIAl9IGVsc2UgewogCQlpbnQgb2xkcGNvdW50ID0gdGNwX3NrYl9wY291bnQoc2tiKTsKQEAgLTI0NzYsNyArMjUzMSw3IEBACiAJCSAqIHNlZSB0Y3BfaW5wdXQuYyB0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZSgpLgogCQkgKi8KIAkJVENQX1NLQl9DQihza2IpLT5hY2tfc2VxID0gdHAtPnNuZF9ueHQ7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKGVyciAhPSAtRUJVU1kpIHsKIAkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BSRVRSQU5TRkFJTCk7CiAJfQogCXJldHVybiBlcnI7CkBAIC0yNzU0LDI3ICsyODA5LDYgQEAKIAlpZiAodHAtPnJ4X29wdC51c2VyX21zcyAmJiB0cC0+cnhfb3B0LnVzZXJfbXNzIDwgbXNzKQogCQltc3MgPSB0cC0+cnhfb3B0LnVzZXJfbXNzOwogCi0JaWYgKHJlcS0+cmN2X3duZCA9PSAwKSB7IC8qIGlnbm9yZWQgZm9yIHJldHJhbnNtaXR0ZWQgc3lucyAqLwotCQlfX3U4IHJjdl93c2NhbGU7Ci0JCS8qIFNldCB0aGlzIHVwIG9uIHRoZSBmaXJzdCBjYWxsIG9ubHkgKi8KLQkJcmVxLT53aW5kb3dfY2xhbXAgPSB0cC0+d2luZG93X2NsYW1wID8gOiBkc3RfbWV0cmljKGRzdCwgUlRBWF9XSU5ET1cpOwotCi0JCS8qIGxpbWl0IHRoZSB3aW5kb3cgc2VsZWN0aW9uIGlmIHRoZSB1c2VyIGVuZm9yY2UgYSBzbWFsbGVyIHJ4IGJ1ZmZlciAqLwotCQlpZiAoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfUkNWQlVGX0xPQ0sgJiYKLQkJICAgIChyZXEtPndpbmRvd19jbGFtcCA+IHRjcF9mdWxsX3NwYWNlKHNrKSB8fCByZXEtPndpbmRvd19jbGFtcCA9PSAwKSkKLQkJCXJlcS0+d2luZG93X2NsYW1wID0gdGNwX2Z1bGxfc3BhY2Uoc2spOwotCi0JCS8qIHRjcF9mdWxsX3NwYWNlIGJlY2F1c2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgZmlyc3QgcGFja2V0ICovCi0JCXRjcF9zZWxlY3RfaW5pdGlhbF93aW5kb3codGNwX2Z1bGxfc3BhY2Uoc2spLAotCQkJbXNzIC0gKGlyZXEtPnRzdGFtcF9vayA/IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgOiAwKSwKLQkJCSZyZXEtPnJjdl93bmQsCi0JCQkmcmVxLT53aW5kb3dfY2xhbXAsCi0JCQlpcmVxLT53c2NhbGVfb2ssCi0JCQkmcmN2X3dzY2FsZSwKLQkJCWRzdF9tZXRyaWMoZHN0LCBSVEFYX0lOSVRSV05EKSk7Ci0JCWlyZXEtPnJjdl93c2NhbGUgPSByY3Zfd3NjYWxlOwotCX0KLQogCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKIAlpZiAodW5saWtlbHkocmVxLT5jb29raWVfdHMpKQpAQCAtMzIwNyw3ICszMjQxLDcgQEAKIAkJICAgIHNrYi0+bGVuID4gbXNzKSB7CiAJCQlzZWdfc2l6ZSA9IG1pbihzZWdfc2l6ZSwgbXNzKTsKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzIHw9IFRDUEhEUl9QU0g7Ci0JCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIHNlZ19zaXplLCBtc3MpKQorCQkJaWYgKHRjcF9mcmFnbWVudChzaywgc2tiLCBzZWdfc2l6ZSwgbXNzLCBHRlBfQVRPTUlDKSkKIAkJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSBpZiAoIXRjcF9za2JfcGNvdW50KHNrYikpCiAJCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiLCBtc3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3NjYWxhYmxlLmMgYi9uZXQvaXB2NC90Y3Bfc2NhbGFibGUuYwppbmRleCAwYWM1MDgzLi44MjUwOTQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfc2NhbGFibGUuYworKysgYi9uZXQvaXB2NC90Y3Bfc2NhbGFibGUuYwpAQCAtMTUsMTIgKzE1LDExIEBACiAjZGVmaW5lIFRDUF9TQ0FMQUJMRV9BSV9DTlQJNTBVCiAjZGVmaW5lIFRDUF9TQ0FMQUJMRV9NRF9TQ0FMRQkzCiAKLXN0YXRpYyB2b2lkIHRjcF9zY2FsYWJsZV9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJCSAgICB1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgdGNwX3NjYWxhYmxlX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2ssIGluX2ZsaWdodCkpCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwppbmRleCA0ODUzOWZmLi45YTVlMDVmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdmVnYXMuYworKysgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwpAQCAtMTYzLDE0ICsxNjMsMTMgQEAKIAlyZXR1cm4gIG1pbih0cC0+c25kX3NzdGhyZXNoLCB0cC0+c25kX2N3bmQtMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF92ZWdhc19jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJCSB1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgYWNrZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHZlZ2FzICp2ZWdhcyA9IGluZXRfY3NrX2NhKHNrKTsKIAogCWlmICghdmVnYXMtPmRvaW5nX3ZlZ2FzX25vdykgewotCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkLCBpbl9mbGlnaHQpOworCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTk1LDcgKzE5NCw3IEBACiAJCQkvKiBXZSBkb24ndCBoYXZlIGVub3VnaCBSVFQgc2FtcGxlcyB0byBkbyB0aGUgVmVnYXMKIAkJCSAqIGNhbGN1bGF0aW9uLCBzbyB3ZSdsbCBiZWhhdmUgbGlrZSBSZW5vLgogCQkJICovCi0JCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkLCBpbl9mbGlnaHQpOworCQkJdGNwX3Jlbm9fY29uZ19hdm9pZChzaywgYWNrLCBhY2tlZCk7CiAJCX0gZWxzZSB7CiAJCQl1MzIgcnR0LCBkaWZmOwogCQkJdTY0IHRhcmdldF9jd25kOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3Zlbm8uYyBiL25ldC9pcHY0L3RjcF92ZW5vLmMKaW5kZXggMWI4ZTI4Zi4uMjdiOTgyNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3Zlbm8uYworKysgYi9uZXQvaXB2NC90Y3BfdmVuby5jCkBAIC0xMTQsMTkgKzExNCwxOCBAQAogCQl0Y3BfdmVub19pbml0KHNrKTsKIH0KIAotc3RhdGljIHZvaWQgdGNwX3Zlbm9fY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCwKLQkJCQl1MzIgaW5fZmxpZ2h0KQorc3RhdGljIHZvaWQgdGNwX3Zlbm9fY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgdmVubyAqdmVubyA9IGluZXRfY3NrX2NhKHNrKTsKIAogCWlmICghdmVuby0+ZG9pbmdfdmVub19ub3cpIHsKLQkJdGNwX3Jlbm9fY29uZ19hdm9pZChzaywgYWNrLCBhY2tlZCwgaW5fZmxpZ2h0KTsKKwkJdGNwX3Jlbm9fY29uZ19hdm9pZChzaywgYWNrLCBhY2tlZCk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBsaW1pdGVkIGJ5IGFwcGxpY2F0aW9ucyAqLwotCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaywgaW5fZmxpZ2h0KSkKKwlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2spKQogCQlyZXR1cm47CiAKIAkvKiBXZSBkbyB0aGUgVmVubyBjYWxjdWxhdGlvbnMgb25seSBpZiB3ZSBnb3QgZW5vdWdoIHJ0dCBzYW1wbGVzICovCkBAIC0xMzQsNyArMTMzLDcgQEAKIAkJLyogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggcnR0IHNhbXBsZXMgdG8gZG8gdGhlIFZlbm8KIAkJICogY2FsY3VsYXRpb24sIHNvIHdlJ2xsIGJlaGF2ZSBsaWtlIFJlbm8uCiAJCSAqLwotCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkLCBpbl9mbGlnaHQpOworCQl0Y3BfcmVub19jb25nX2F2b2lkKHNrLCBhY2ssIGFja2VkKTsKIAl9IGVsc2UgewogCQl1NjQgdGFyZ2V0X2N3bmQ7CiAJCXUzMiBydHQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfeWVhaC5jIGIvbmV0L2lwdjQvdGNwX3llYWguYwppbmRleCA1ZWRlMGU3Li41OTliNzliIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfeWVhaC5jCisrKyBiL25ldC9pcHY0L3RjcF95ZWFoLmMKQEAgLTY5LDEzICs2OSwxMiBAQAogCXRjcF92ZWdhc19wa3RzX2Fja2VkKHNrLCBwa3RzX2Fja2VkLCBydHRfdXMpOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfeWVhaF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkLAotCQkJCXUzMiBpbl9mbGlnaHQpCitzdGF0aWMgdm9pZCB0Y3BfeWVhaF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCB5ZWFoICp5ZWFoID0gaW5ldF9jc2tfY2Eoc2spOwogCi0JaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAogCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggNDQ2OGUxYS4uMTg1ZWQzZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkJZG8gewogCQkJCWlmIChsb3cgPD0gc251bSAmJiBzbnVtIDw9IGhpZ2ggJiYKIAkJCQkgICAgIXRlc3RfYml0KHNudW0gPj4gdWRwdGFibGUtPmxvZywgYml0bWFwKSAmJgotCQkJCSAgICAhaW5ldF9pc19yZXNlcnZlZF9sb2NhbF9wb3J0KHNudW0pKQorCQkJCSAgICAhaW5ldF9pc19sb2NhbF9yZXNlcnZlZF9wb3J0KG5ldCwgc251bSkpCiAJCQkJCWdvdG8gZm91bmQ7CiAJCQkJc251bSArPSByYW5kOwogCQkJfSB3aGlsZSAoc251bSAhPSBmaXJzdCk7CkBAIC03MjcsMTMgKzcyNywxMiBAQAogdm9pZCB1ZHA0X2h3Y3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0KQogewogCXN0cnVjdCB1ZHBoZHIgKnVoID0gdWRwX2hkcihza2IpOwotCXN0cnVjdCBza19idWZmICpmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OwogCWludCBvZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCWludCBsZW4gPSBza2ItPmxlbiAtIG9mZnNldDsKIAlpbnQgaGxlbiA9IGxlbjsKIAlfX3dzdW0gY3N1bSA9IDA7CiAKLQlpZiAoIWZyYWdzKSB7CisJaWYgKCFza2JfaGFzX2ZyYWdfbGlzdChza2IpKSB7CiAJCS8qCiAJCSAqIE9ubHkgb25lIGZyYWdtZW50IG9uIHRoZSBzb2NrZXQuCiAJCSAqLwpAQCAtNzQyLDE1ICs3NDEsMTcgQEAKIAkJdWgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNyYywgZHN0LCBsZW4sCiAJCQkJCSAgICAgICBJUFBST1RPX1VEUCwgMCk7CiAJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmZyYWdzOworCiAJCS8qCiAJCSAqIEhXLWNoZWNrc3VtIHdvbid0IHdvcmsgYXMgdGhlcmUgYXJlIHR3byBvciBtb3JlCiAJCSAqIGZyYWdtZW50cyBvbiB0aGUgc29ja2V0IHNvIHRoYXQgYWxsIGNzdW1zIG9mIHNrX2J1ZmZzCiAJCSAqIHNob3VsZCBiZSB0b2dldGhlcgogCQkgKi8KLQkJZG8geworCQlza2Jfd2Fsa19mcmFncyhza2IsIGZyYWdzKSB7CiAJCQljc3VtID0gY3N1bV9hZGQoY3N1bSwgZnJhZ3MtPmNzdW0pOwogCQkJaGxlbiAtPSBmcmFncy0+bGVuOwotCQl9IHdoaWxlICgoZnJhZ3MgPSBmcmFncy0+bmV4dCkpOworCQl9CiAKIAkJY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZnNldCwgaGxlbiwgY3N1bSk7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKQEAgLTc2Miw2ICs3NjMsNDMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVkcDRfaHdjc3VtKTsKIAorLyogRnVuY3Rpb24gdG8gc2V0IFVEUCBjaGVja3N1bSBmb3IgYW4gSVB2NCBVRFAgcGFja2V0LiBUaGlzIGlzIGludGVuZGVkCisgKiBmb3IgdGhlIHNpbXBsZSBjYXNlIGxpa2Ugd2hlbiBzZXR0aW5nIHRoZSBjaGVja3N1bSBmb3IgYSBVRFAgdHVubmVsLgorICovCit2b2lkIHVkcF9zZXRfY3N1bShib29sIG5vY2hlY2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CisKKwlpZiAobm9jaGVjaykKKwkJdWgtPmNoZWNrID0gMDsKKwllbHNlIGlmIChza2JfaXNfZ3NvKHNrYikpCisJCXVoLT5jaGVjayA9IH51ZHBfdjRfY2hlY2sobGVuLCBzYWRkciwgZGFkZHIsIDApOworCWVsc2UgaWYgKHNrYl9kc3Qoc2tiKSAmJiBza2JfZHN0KHNrYiktPmRldiAmJgorCQkgKHNrYl9kc3Qoc2tiKS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSkpIHsKKworCQlCVUdfT04oc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCk7CisKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOworCQlza2ItPmNzdW1fc3RhcnQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5oZWFkOworCQlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOworCQl1aC0+Y2hlY2sgPSB+dWRwX3Y0X2NoZWNrKGxlbiwgc2FkZHIsIGRhZGRyLCAwKTsKKwl9IGVsc2UgeworCQlfX3dzdW0gY3N1bTsKKworCQlCVUdfT04oc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCk7CisKKwkJdWgtPmNoZWNrID0gMDsKKwkJY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIDAsIGxlbiwgMCk7CisJCXVoLT5jaGVjayA9IHVkcF92NF9jaGVjayhsZW4sIHNhZGRyLCBkYWRkciwgY3N1bSk7CisJCWlmICh1aC0+Y2hlY2sgPT0gMCkKKwkJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh1ZHBfc2V0X2NzdW0pOworCiBzdGF0aWMgaW50IHVkcF9zZW5kX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKQEAgLTc4NSw3ICs4MjMsNyBAQAogCWlmIChpc191ZHBsaXRlKSAgCQkJCSAvKiAgICAgVURQLUxpdGUgICAgICAqLwogCQljc3VtID0gdWRwbGl0ZV9jc3VtKHNrYik7CiAKLQllbHNlIGlmIChzay0+c2tfbm9fY2hlY2sgPT0gVURQX0NTVU1fTk9YTUlUKSB7ICAgLyogVURQIGNzdW0gZGlzYWJsZWQgKi8KKwllbHNlIGlmIChzay0+c2tfbm9fY2hlY2tfdHgpIHsgICAvKiBVRFAgY3N1bSBkaXNhYmxlZCAqLwogCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJZ290byBzZW5kOwpAQCAtMTQ5NSw2ICsxNTMzLDEwIEBACiAJCWlmIChza2ItPmxlbiA+IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAmJiBlbmNhcF9yY3YgIT0gTlVMTCkgewogCQkJaW50IHJldDsKIAorCQkJLyogVmVyaWZ5IGNoZWNrc3VtIGJlZm9yZSBnaXZpbmcgdG8gZW5jYXAgKi8KKwkJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCQkJZ290byBjc3VtX2Vycm9yOworCiAJCQlyZXQgPSBlbmNhcF9yY3Yoc2ssIHNrYik7CiAJCQlpZiAocmV0IDw9IDApIHsKIAkJCQlVRFBfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwKQEAgLTE2NzIsNyArMTcxNCw2IEBACiBzdGF0aWMgaW5saW5lIGludCB1ZHA0X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKIAkJCQkgaW50IHByb3RvKQogewotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwogCWludCBlcnI7CiAKIAlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKQEAgLTE2ODQsMjIgKzE3MjUsOCBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpcGggPSBpcF9oZHIoc2tiKTsKLQlpZiAodWgtPmNoZWNrID09IDApIHsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7Ci0JCWlmICghY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgc2tiLT5sZW4sCi0JCQkJICAgICAgcHJvdG8sIHNrYi0+Y3N1bSkpCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCX0KLQlpZiAoIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikpCi0JCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJCQkgICAgICAgc2tiLT5sZW4sIHByb3RvLCAwKTsKLQkvKiBQcm9iYWJseSwgd2Ugc2hvdWxkIGNoZWNrc3VtIHVkcCBoZWFkZXIgKGl0IHNob3VsZCBiZSBpbiBjYWNoZQotCSAqIGluIGFueSBjYXNlKSBhbmQgZGF0YSBpbiB0aW55IHBhY2tldHMgKDwgcnggY29weWJyZWFrKS4KLQkgKi8KLQotCXJldHVybiAwOworCXJldHVybiBza2JfY2hlY2tzdW1faW5pdF96ZXJvX2NoZWNrKHNrYiwgcHJvdG8sIHVoLT5jaGVjaywKKwkJCQkJICAgIGluZXRfY29tcHV0ZV9wc2V1ZG8pOwogfQogCiAvKgpAQCAtMTg4Niw3ICsxOTEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgaGFzaDIgPSB1ZHA0X3BvcnRhZGRyX2hhc2gobmV0LCBsb2NfYWRkciwgaG51bSk7CiAJdW5zaWduZWQgaW50IHNsb3QyID0gaGFzaDIgJiB1ZHBfdGFibGUubWFzazsKIAlzdHJ1Y3QgdWRwX2hzbG90ICpoc2xvdDIgPSAmdWRwX3RhYmxlLmhhc2gyW3Nsb3QyXTsKLQlJTkVUX0FERFJfQ09PS0lFKGFjb29raWUsIHJtdF9hZGRyLCBsb2NfYWRkcikKKwlJTkVUX0FERFJfQ09PS0lFKGFjb29raWUsIHJtdF9hZGRyLCBsb2NfYWRkcik7CiAJY29uc3QgX19wb3J0cGFpciBwb3J0cyA9IElORVRfQ09NQklORURfUE9SVFMocm10X3BvcnQsIGhudW0pOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMTk3OSw3ICsyMDA2LDcgQEAKIAkJICAgICAgIGludCAoKnB1c2hfcGVuZGluZ19mcmFtZXMpKHN0cnVjdCBzb2NrICopKQogewogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwotCWludCB2YWw7CisJaW50IHZhbCwgdmFsYm9vbDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaXNfdWRwbGl0ZSA9IElTX1VEUExJVEUoc2spOwogCkBAIC0xOTg5LDYgKzIwMTYsOCBAQAogCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwl2YWxib29sID0gdmFsID8gMSA6IDA7CisKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIFVEUF9DT1JLOgogCQlpZiAodmFsICE9IDApIHsKQEAgLTIwMTgsNiArMjA0NywxNCBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBVRFBfTk9fQ0hFQ0s2X1RYOgorCQl1cC0+bm9fY2hlY2s2X3R4ID0gdmFsYm9vbDsKKwkJYnJlYWs7CisKKwljYXNlIFVEUF9OT19DSEVDSzZfUlg6CisJCXVwLT5ub19jaGVjazZfcnggPSB2YWxib29sOworCQlicmVhazsKKwogCS8qCiAJICogCVVEUC1MaXRlJ3MgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAoUkZDIDM4MjgpLgogCSAqLwpAQCAtMjEwMCw2ICsyMTM3LDE0IEBACiAJCXZhbCA9IHVwLT5lbmNhcF90eXBlOwogCQlicmVhazsKIAorCWNhc2UgVURQX05PX0NIRUNLNl9UWDoKKwkJdmFsID0gdXAtPm5vX2NoZWNrNl90eDsKKwkJYnJlYWs7CisKKwljYXNlIFVEUF9OT19DSEVDSzZfUlg6CisJCXZhbCA9IHVwLT5ub19jaGVjazZfcng7CisJCWJyZWFrOworCiAJLyogVGhlIGZvbGxvd2luZyB0d28gY2Fubm90IGJlIGNoYW5nZWQgb24gVURQIHNvY2tldHMsIHRoZSByZXR1cm4gaXMKIAkgKiBhbHdheXMgMCAod2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGZ1bGwgY2hlY2tzdW0gY292ZXJhZ2Ugb2YgVURQKS4gKi8KIAljYXNlIFVEUExJVEVfU0VORF9DU0NPVjoKQEAgLTI0ODQsNyArMjUyOSwxMSBAQAogCWludCB0bmxfaGxlbiA9IHNrYl9pbm5lcl9tYWNfaGVhZGVyKHNrYikgLSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CiAJbmV0ZGV2X2ZlYXR1cmVzX3QgZW5jX2ZlYXR1cmVzOwotCWludCBvdXRlcl9obGVuOworCWludCB1ZHBfb2Zmc2V0LCBvdXRlcl9obGVuOworCXVuc2lnbmVkIGludCBvbGRsZW47CisJYm9vbCBuZWVkX2NzdW07CisKKwlvbGRsZW4gPSAodTE2KX5za2ItPmxlbjsKIAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHRubF9obGVuKSkpCiAJCWdvdG8gb3V0OwpAQCAtMjQ5Niw2ICsyNTQ1LDEwIEBACiAJc2tiLT5tYWNfbGVuID0gc2tiX2lubmVyX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1RFQik7CiAKKwluZWVkX2NzdW0gPSAhIShza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19VRFBfVFVOTkVMX0NTVU0pOworCWlmIChuZWVkX2NzdW0pCisJCXNrYi0+ZW5jYXBfaGRyX2NzdW0gPSAxOworCiAJLyogc2VnbWVudCBpbm5lciBwYWNrZXQuICovCiAJZW5jX2ZlYXR1cmVzID0gc2tiLT5kZXYtPmh3X2VuY19mZWF0dXJlcyAmIG5ldGlmX3NrYl9mZWF0dXJlcyhza2IpOwogCXNlZ3MgPSBza2JfbWFjX2dzb19zZWdtZW50KHNrYiwgZW5jX2ZlYXR1cmVzKTsKQEAgLTI1MDYsMTAgKzI1NTksMTEgQEAKIAl9CiAKIAlvdXRlcl9obGVuID0gc2tiX3RubF9oZWFkZXJfbGVuKHNrYik7CisJdWRwX29mZnNldCA9IG91dGVyX2hsZW4gLSB0bmxfaGxlbjsKIAlza2IgPSBzZWdzOwogCWRvIHsKIAkJc3RydWN0IHVkcGhkciAqdWg7Ci0JCWludCB1ZHBfb2Zmc2V0ID0gb3V0ZXJfaGxlbiAtIHRubF9obGVuOworCQlpbnQgbGVuOwogCiAJCXNrYl9yZXNldF9pbm5lcl9oZWFkZXJzKHNrYik7CiAJCXNrYi0+ZW5jYXBzdWxhdGlvbiA9IDE7CkBAIC0yNTIwLDMxICsyNTc0LDIwIEBACiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBtYWNfbGVuKTsKIAkJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgdWRwX29mZnNldCk7CisJCWxlbiA9IHNrYi0+bGVuIC0gdWRwX29mZnNldDsKIAkJdWggPSB1ZHBfaGRyKHNrYik7Ci0JCXVoLT5sZW4gPSBodG9ucyhza2ItPmxlbiAtIHVkcF9vZmZzZXQpOworCQl1aC0+bGVuID0gaHRvbnMobGVuKTsKIAotCQkvKiBjc3VtIHNlZ21lbnQgaWYgdHVubmVsIHNldHMgc2tiIHdpdGggY3N1bS4gKi8KLQkJaWYgKHByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSAmJiB1bmxpa2VseSh1aC0+Y2hlY2spKSB7Ci0JCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCQlpZiAobmVlZF9jc3VtKSB7CisJCQlfX2JlMzIgZGVsdGEgPSBodG9ubChvbGRsZW4gKyBsZW4pOwogCi0JCQl1aC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkJCSAgICAgICBza2ItPmxlbiAtIHVkcF9vZmZzZXQsCi0JCQkJCQkgICAgICAgSVBQUk9UT19VRFAsIDApOwotCQkJdWgtPmNoZWNrID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIHVkcF9vZmZzZXQsCi0JCQkJCQkJICAgc2tiLT5sZW4gLSB1ZHBfb2Zmc2V0LCAwKSk7CisJCQl1aC0+Y2hlY2sgPSB+Y3N1bV9mb2xkKChfX2ZvcmNlIF9fd3N1bSkKKwkJCQkJICAgICAgICgoX19mb3JjZSB1MzIpdWgtPmNoZWNrICsKKwkJCQkJCShfX2ZvcmNlIHUzMilkZWx0YSkpOworCQkJdWgtPmNoZWNrID0gZ3NvX21ha2VfY2hlY2tzdW0oc2tiLCB+dWgtPmNoZWNrKTsKKwogCQkJaWYgKHVoLT5jaGVjayA9PSAwKQogCQkJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwotCi0JCX0gZWxzZSBpZiAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7Ci0JCQl1MzIgbGVuID0gc2tiLT5sZW4gLSB1ZHBfb2Zmc2V0OwotCi0JCQl1aC0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIsCi0JCQkJCQkgICAgIGxlbiwgSVBQUk9UT19VRFAsIDApOwotCQkJdWgtPmNoZWNrID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIHVkcF9vZmZzZXQsIGxlbiwgMCkpOwotCQkJaWYgKHVoLT5jaGVjayA9PSAwKQotCQkJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCQl9CiAKIAkJc2tiLT5wcm90b2NvbCA9IHByb3RvY29sOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX29mZmxvYWQuYyBiL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKaW5kZXggODhiNDAyMy4uNTQ2ZDJkNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwX29mZmxvYWQuYworKysgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCkBAIC01Niw3ICs1Niw4IEBACiAJX193c3VtIGNzdW07CiAKIAlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uICYmCi0JICAgIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1VEUF9UVU5ORUwpIHsKKwkgICAgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJgorCSAgICAgKFNLQl9HU09fVURQX1RVTk5FTHxTS0JfR1NPX1VEUF9UVU5ORUxfQ1NVTSkpKSB7CiAJCXNlZ3MgPSBza2JfdWRwX3R1bm5lbF9zZWdtZW50KHNrYiwgZmVhdHVyZXMpOwogCQlnb3RvIG91dDsKIAl9CkBAIC03MSw4ICs3MiwxMCBAQAogCiAJCWlmICh1bmxpa2VseSh0eXBlICYgfihTS0JfR1NPX1VEUCB8IFNLQl9HU09fRE9ER1kgfAogCQkJCSAgICAgIFNLQl9HU09fVURQX1RVTk5FTCB8CisJCQkJICAgICAgU0tCX0dTT19VRFBfVFVOTkVMX0NTVU0gfAogCQkJCSAgICAgIFNLQl9HU09fSVBJUCB8Ci0JCQkJICAgICAgU0tCX0dTT19HUkUgfCBTS0JfR1NPX01QTFMpIHx8CisJCQkJICAgICAgU0tCX0dTT19HUkUgfCBTS0JfR1NPX0dSRV9DU1VNIHwKKwkJCQkgICAgICBTS0JfR1NPX01QTFMpIHx8CiAJCQkgICAgICEodHlwZSAmIChTS0JfR1NPX1VEUCkpKSkKIAkJCWdvdG8gb3V0OwogCkBAIC0xOTcsNiArMjAwLDcgQEAKIAl9CiAKIAlza2JfZ3JvX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOyAvKiBwdWxsIGVuY2Fwc3VsYXRpbmcgdWRwIGhlYWRlciAqLworCXNrYl9ncm9fcG9zdHB1bGxfcmNzdW0oc2tiLCB1aCwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKIAlwcCA9IHVvX3ByaXYtPm9mZmxvYWQtPmNhbGxiYWNrcy5ncm9fcmVjZWl2ZShoZWFkLCBza2IpOwogCiBvdXRfdW5sb2NrOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwbGl0ZS5jIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCmluZGV4IDJjNDZhY2QuLjNiM2VmYmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcGxpdGUuYworKysgYi9uZXQvaXB2NC91ZHBsaXRlLmMKQEAgLTcwLDcgKzcwLDYgQEAKIAkucHJvdG9jb2wJPSAgSVBQUk9UT19VRFBMSVRFLAogCS5wcm90CQk9ICAmdWRwbGl0ZV9wcm90LAogCS5vcHMJCT0gICZpbmV0X2RncmFtX29wcywKLQkubm9fY2hlY2sJPSAgMCwJCS8qIG11c3QgY2hlY2tzdW0gKFJGQyAzODI4KSAqLwogCS5mbGFncwkJPSAgSU5FVF9QUk9UT1NXX1BFUk1BTkVOVCwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCmluZGV4IDA1ZjJiNDguLjkxNzcxYTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYwpAQCAtNTgsMTIgKzU4LDEyIEBACiAKIAl0b3BfaXBoLT5mcmFnX29mZiA9IChmbGFncyAmIFhGUk1fU1RBVEVfTk9QTVRVRElTQykgPwogCQkwIDogKFhGUk1fTU9ERV9TS0JfQ0Ioc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpOwotCWlwX3NlbGVjdF9pZGVudChza2IsIGRzdC0+Y2hpbGQsIE5VTEwpOwogCiAJdG9wX2lwaC0+dHRsID0gaXA0X2RzdF9ob3BsaW1pdChkc3QtPmNoaWxkKTsKIAogCXRvcF9pcGgtPnNhZGRyID0geC0+cHJvcHMuc2FkZHIuYTQ7CiAJdG9wX2lwaC0+ZGFkZHIgPSB4LT5pZC5kYWRkci5hNDsKKwlpcF9zZWxlY3RfaWRlbnQoc2tiLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwppbmRleCAxODZhOGVjZi4uZDVmNmJkOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKQEAgLTI1LDcgKzI1LDcgQEAKIAlpZiAoSVBDQihza2IpLT5mbGFncyAmIElQU0tCX1hGUk1fVFVOTkVMX1NJWkUpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCEoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSB8fCBza2ItPmxvY2FsX2RmKQorCWlmICghKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgfHwgc2tiLT5pZ25vcmVfZGYpCiAJCWdvdG8gb3V0OwogCiAJbXR1ID0gZHN0X210dShza2JfZHN0KHNrYikpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggNmM3ZmEwOC4uNTY2N2IzMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0yNzUsMTkgKzI3NSwxNCBAQAogewogCWludCBpOwogCi0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopaWRldi0+c3RhdHMuaXB2NiwKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwlpZGV2LT5zdGF0cy5pcHY2ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBpcHN0YXRzX21pYik7CisJaWYgKCFpZGV2LT5zdGF0cy5pcHY2KQogCQlnb3RvIGVycl9pcDsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBpcHN0YXRzX21pYiAqYWRkcmNvbmZfc3RhdHM7Ci0JCWFkZHJjb25mX3N0YXRzID0gcGVyX2NwdV9wdHIoaWRldi0+c3RhdHMuaXB2NlswXSwgaSk7CisJCWFkZHJjb25mX3N0YXRzID0gcGVyX2NwdV9wdHIoaWRldi0+c3RhdHMuaXB2NiwgaSk7CiAJCXU2NF9zdGF0c19pbml0KCZhZGRyY29uZl9zdGF0cy0+c3luY3ApOwotI2lmIFNOTVBfQVJSQVlfU1ogPT0gMgotCQlhZGRyY29uZl9zdGF0cyA9IHBlcl9jcHVfcHRyKGlkZXYtPnN0YXRzLmlwdjZbMV0sIGkpOwotCQl1NjRfc3RhdHNfaW5pdCgmYWRkcmNvbmZfc3RhdHMtPnN5bmNwKTsKLSNlbmRpZgogCX0KIAogCkBAIC0zMDUsNyArMzAwLDcgQEAKIGVycl9pY21wbXNnOgogCWtmcmVlKGlkZXYtPnN0YXRzLmljbXB2NmRldik7CiBlcnJfaWNtcDoKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKWlkZXYtPnN0YXRzLmlwdjYpOworCWZyZWVfcGVyY3B1KGlkZXYtPnN0YXRzLmlwdjYpOwogZXJyX2lwOgogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMjUwNCw4ICsyNDk5LDggQEAKIAlyZXR1cm4gUFRSX0VSUihpZnApOwogfQogCi1zdGF0aWMgaW50IGluZXQ2X2FkZHJfZGVsKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqcGZ4LAotCQkJICB1bnNpZ25lZCBpbnQgcGxlbikKK3N0YXRpYyBpbnQgaW5ldDZfYWRkcl9kZWwoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCwgdTMyIGlmYV9mbGFncywKKwkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpwZngsIHVuc2lnbmVkIGludCBwbGVuKQogewogCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwpAQCAtMjUyOCw3ICsyNTIzLDEyIEBACiAJCQlpbjZfaWZhX2hvbGQoaWZwKTsKIAkJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAorCQkJaWYgKCEoaWZwLT5mbGFncyAmIElGQV9GX1RFTVBPUkFSWSkgJiYKKwkJCSAgICAoaWZhX2ZsYWdzICYgSUZBX0ZfTUFOQUdFVEVNUEFERFIpKQorCQkJCW1hbmFnZV90ZW1wYWRkcnMoaWRldiwgaWZwLCAwLCAwLCBmYWxzZSwKKwkJCQkJCSBqaWZmaWVzKTsKIAkJCWlwdjZfZGVsX2FkZHIoaWZwKTsKKwkJCWFkZHJjb25mX3ZlcmlmeV9ydG5sKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTI1NjgsNyArMjU2OCw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJcnRubF9sb2NrKCk7Ci0JZXJyID0gaW5ldDZfYWRkcl9kZWwobmV0LCBpcmVxLmlmcjZfaWZpbmRleCwgJmlyZXEuaWZyNl9hZGRyLAorCWVyciA9IGluZXQ2X2FkZHJfZGVsKG5ldCwgaXJlcS5pZnI2X2lmaW5kZXgsIDAsICZpcmVxLmlmcjZfYWRkciwKIAkJCSAgICAgaXJlcS5pZnI2X3ByZWZpeGxlbik7CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjgxMywxOCArMjgxMyw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQKLWlwdjZfaW5oZXJpdF9saW5rbG9jYWwoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmxpbmtfZGV2KQotewotCXN0cnVjdCBpbjZfYWRkciBsbGFkZHI7Ci0KLQlpZiAoIWlwdjZfZ2V0X2xsYWRkcihsaW5rX2RldiwgJmxsYWRkciwgSUZBX0ZfVEVOVEFUSVZFKSkgewotCQlhZGRyY29uZl9hZGRfbGlua2xvY2FsKGlkZXYsICZsbGFkZHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCiBzdGF0aWMgaW50IGFkZHJjb25mX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCiAJCQkgICB2b2lkICpwdHIpCiB7CkBAIC0zNzQzLDYgKzM3MzEsNyBAQAogCXN0cnVjdCBpZmFkZHJtc2cgKmlmbTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltJRkFfTUFYKzFdOwogCXN0cnVjdCBpbjZfYWRkciAqcGZ4LCAqcGVlcl9wZng7CisJdTMyIGlmYV9mbGFnczsKIAlpbnQgZXJyOwogCiAJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKmlmbSksIHRiLCBJRkFfTUFYLCBpZmFfaXB2Nl9wb2xpY3kpOwpAQCAtMzc1NCw3ICszNzQzLDEzIEBACiAJaWYgKHBmeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBpbmV0Nl9hZGRyX2RlbChuZXQsIGlmbS0+aWZhX2luZGV4LCBwZngsIGlmbS0+aWZhX3ByZWZpeGxlbik7CisJaWZhX2ZsYWdzID0gdGJbSUZBX0ZMQUdTXSA/IG5sYV9nZXRfdTMyKHRiW0lGQV9GTEFHU10pIDogaWZtLT5pZmFfZmxhZ3M7CisKKwkvKiBXZSBpZ25vcmUgb3RoZXIgZmxhZ3Mgc28gZmFyLiAqLworCWlmYV9mbGFncyAmPSBJRkFfRl9NQU5BR0VURU1QQUREUjsKKworCXJldHVybiBpbmV0Nl9hZGRyX2RlbChuZXQsIGlmbS0+aWZhX2luZGV4LCBpZmFfZmxhZ3MsIHBmeCwKKwkJCSAgICAgIGlmbS0+aWZhX3ByZWZpeGxlbik7CiB9CiAKIHN0YXRpYyBpbnQgaW5ldDZfYWRkcl9tb2RpZnkoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwLCB1MzIgaWZhX2ZsYWdzLApAQCAtNDM2Myw3ICs0MzU4LDcgQEAKIAltZW1zZXQoJnN0YXRzW2l0ZW1zXSwgMCwgcGFkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fc25tcDZfZmlsbF9zdGF0czY0KHU2NCAqc3RhdHMsIHZvaWQgX19wZXJjcHUgKiptaWIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19zbm1wNl9maWxsX3N0YXRzNjQodTY0ICpzdGF0cywgdm9pZCBfX3BlcmNwdSAqbWliLAogCQkJCSAgICAgIGludCBpdGVtcywgaW50IGJ5dGVzLCBzaXplX3Qgc3luY3BvZmYpCiB7CiAJaW50IGk7CkBAIC00MzgzLDcgKzQzNzgsNyBAQAogewogCXN3aXRjaCAoYXR0cnR5cGUpIHsKIAljYXNlIElGTEFfSU5FVDZfU1RBVFM6Ci0JCV9fc25tcDZfZmlsbF9zdGF0czY0KHN0YXRzLCAodm9pZCBfX3BlcmNwdSAqKilpZGV2LT5zdGF0cy5pcHY2LAorCQlfX3NubXA2X2ZpbGxfc3RhdHM2NChzdGF0cywgaWRldi0+c3RhdHMuaXB2NiwKIAkJCQkgICAgIElQU1RBVFNfTUlCX01BWCwgYnl0ZXMsIG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgc3luY3ApKTsKIAkJYnJlYWs7CiAJY2FzZSBJRkxBX0lORVQ2X0lDTVA2U1RBVFM6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMgYi9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMKaW5kZXggNGMxMWNiYy4uZTY5NjA0NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmZfY29yZS5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mX2NvcmUuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiB7CiAJa2ZyZWUoaWRldi0+c3RhdHMuaWNtcHY2bXNnZGV2KTsKIAlrZnJlZShpZGV2LT5zdGF0cy5pY21wdjZkZXYpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopaWRldi0+c3RhdHMuaXB2Nik7CisJZnJlZV9wZXJjcHUoaWRldi0+c3RhdHMuaXB2Nik7CiB9CiAKIC8qIE5vYm9keSByZWZlcnMgdG8gdGhpcyBkZXZpY2UsIHdlIG1heSBkZXN0cm95IGl0LiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggZDkzNTg4OS4uN2NiNDM5MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0xMDYsNyArMTA2LDYgQEAKIAlzdHJ1Y3QgaW5ldF9wcm90b3N3ICphbnN3ZXI7CiAJc3RydWN0IHByb3RvICphbnN3ZXJfcHJvdDsKIAl1bnNpZ25lZCBjaGFyIGFuc3dlcl9mbGFnczsKLQljaGFyIGFuc3dlcl9ub19jaGVjazsKIAlpbnQgdHJ5X2xvYWRpbmdfbW9kdWxlID0gMDsKIAlpbnQgZXJyOwogCkBAIC0xNjIsNyArMTYxLDYgQEAKIAogCXNvY2stPm9wcyA9IGFuc3dlci0+b3BzOwogCWFuc3dlcl9wcm90ID0gYW5zd2VyLT5wcm90OwotCWFuc3dlcl9ub19jaGVjayA9IGFuc3dlci0+bm9fY2hlY2s7CiAJYW5zd2VyX2ZsYWdzID0gYW5zd2VyLT5mbGFnczsKIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtMTc2LDcgKzE3NCw2IEBACiAJc29ja19pbml0X2RhdGEoc29jaywgc2spOwogCiAJZXJyID0gMDsKLQlzay0+c2tfbm9fY2hlY2sgPSBhbnN3ZXJfbm9fY2hlY2s7CiAJaWYgKElORVRfUFJPVE9TV19SRVVTRSAmIGFuc3dlcl9mbGFncykKIAkJc2stPnNrX3JldXNlID0gU0tfQ0FOX1JFVVNFOwogCkBAIC03MTUsMzMgKzcxMiwyNSBAQAogewogCWludCBpOwogCi0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNiwKLQkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJbmV0LT5taWIudWRwX3N0YXRzX2luNiA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7CisJaWYgKCFuZXQtPm1pYi51ZHBfc3RhdHNfaW42KQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNiwKLQkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYgPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOworCWlmICghbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYpCiAJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwluZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwc3RhdHNfbWliKTsKKwlpZiAoIW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcykKIAkJZ290byBlcnJfaXBfbWliOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJc3RydWN0IGlwc3RhdHNfbWliICphZl9pbmV0Nl9zdGF0czsKLQkJYWZfaW5ldDZfc3RhdHMgPSBwZXJfY3B1X3B0cihuZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3NbMF0sIGkpOworCQlhZl9pbmV0Nl9zdGF0cyA9IHBlcl9jcHVfcHRyKG5ldC0+bWliLmlwdjZfc3RhdGlzdGljcywgaSk7CiAJCXU2NF9zdGF0c19pbml0KCZhZl9pbmV0Nl9zdGF0cy0+c3luY3ApOwotI2lmIFNOTVBfQVJSQVlfU1ogPT0gMgotCQlhZl9pbmV0Nl9zdGF0cyA9IHBlcl9jcHVfcHRyKG5ldC0+bWliLmlwdjZfc3RhdGlzdGljc1sxXSwgaSk7Ci0JCXU2NF9zdGF0c19pbml0KCZhZl9pbmV0Nl9zdGF0cy0+c3luY3ApOwotI2VuZGlmCiAJfQogCiAKLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pY21wdjZfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wdjZfbWliKSwKLQkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCisJbmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MgPSBhbGxvY19wZXJjcHUoc3RydWN0IGljbXB2Nl9taWIpOworCWlmICghbmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MpCiAJCWdvdG8gZXJyX2ljbXBfbWliOwogCW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGljbXB2Nm1zZ19taWIpLAogCQkJCQkJR0ZQX0tFUk5FTCk7CkBAIC03NTAsMjIgKzczOSwyMiBAQAogCXJldHVybiAwOwogCiBlcnJfaWNtcG1zZ19taWI6Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pY21wdjZfc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MpOwogZXJyX2ljbXBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXB2Nl9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MpOwogZXJyX2lwX21pYjoKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnVkcGxpdGVfc3RhdHNfaW42KTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNik7CiBlcnJfdWRwbGl0ZV9taWI6Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBfc3RhdHNfaW42KTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi51ZHBfc3RhdHNfaW42KTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgaXB2Nl9jbGVhbnVwX21pYnMoc3RydWN0IG5ldCAqbmV0KQogewotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNik7Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNik7Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLnVkcF9zdGF0c19pbjYpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLnVkcGxpdGVfc3RhdHNfaW42KTsKKwlmcmVlX3BlcmNwdShuZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MpOworCWZyZWVfcGVyY3B1KG5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzKTsKIAlrZnJlZShuZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcyk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCA3YjMyNjUyLi5mNmM4NGE2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC00MDAsNiArNDAwLDcgQEAKIAlpbnQgbGVuOwogCWludCBobGltaXQ7CiAJaW50IGVyciA9IDA7CisJdTMyIG1hcmsgPSBJUDZfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CiAKIAlpZiAoKHU4ICopaGRyIDwgc2tiLT5oZWFkIHx8CiAJICAgIChza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHNpemVvZigqaGRyKSkgPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCkBAIC00NjYsNiArNDY3LDcgQEAKIAlmbDYuZGFkZHIgPSBoZHItPnNhZGRyOwogCWlmIChzYWRkcikKIAkJZmw2LnNhZGRyID0gKnNhZGRyOworCWZsNi5mbG93aTZfbWFyayA9IG1hcms7CiAJZmw2LmZsb3dpNl9vaWYgPSBpaWY7CiAJZmw2LmZsNl9pY21wX3R5cGUgPSB0eXBlOwogCWZsNi5mbDZfaWNtcF9jb2RlID0gY29kZTsKQEAgLTQ3NCw2ICs0NzYsNyBAQAogCXNrID0gaWNtcHY2X3htaXRfbG9jayhuZXQpOwogCWlmIChzayA9PSBOVUxMKQogCQlyZXR1cm47CisJc2stPnNrX21hcmsgPSBtYXJrOwogCW5wID0gaW5ldDZfc2soc2spOwogCiAJaWYgKCFpY21wdjZfeHJsaW1fYWxsb3coc2ssIHR5cGUsICZmbDYpKQpAQCAtNDkzLDEyICs0OTYsNyBAQAogCWlmIChJU19FUlIoZHN0KSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKLQkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7Ci0JZWxzZQotCQlobGltaXQgPSBucC0+aG9wX2xpbWl0OwotCWlmIChobGltaXQgPCAwKQotCQlobGltaXQgPSBpcDZfZHN0X2hvcGxpbWl0KGRzdCk7CisJaGxpbWl0ID0gaXA2X3NrX2RzdF9ob3BsaW1pdChucCwgJmZsNiwgZHN0KTsKIAogCW1zZy5za2IgPSBza2I7CiAJbXNnLm9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwpAQCAtNTU2LDYgKzU1NCw3IEBACiAJaW50IGVyciA9IDA7CiAJaW50IGhsaW1pdDsKIAl1OCB0Y2xhc3M7CisJdTMyIG1hcmsgPSBJUDZfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CiAKIAlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIApAQCAtNTc0LDExICs1NzMsMTMgQEAKIAkJZmw2LnNhZGRyID0gKnNhZGRyOwogCWZsNi5mbG93aTZfb2lmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJZmw2LmZsNl9pY21wX3R5cGUgPSBJQ01QVjZfRUNIT19SRVBMWTsKKwlmbDYuZmxvd2k2X21hcmsgPSBtYXJrOwogCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKIAogCXNrID0gaWNtcHY2X3htaXRfbG9jayhuZXQpOwogCWlmIChzayA9PSBOVUxMKQogCQlyZXR1cm47CisJc2stPnNrX21hcmsgPSBtYXJrOwogCW5wID0gaW5ldDZfc2soc2spOwogCiAJaWYgKCFmbDYuZmxvd2k2X29pZiAmJiBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbDYuZGFkZHIpKQpAQCAtNTkzLDEyICs1OTQsNyBAQAogCWlmIChJU19FUlIoZHN0KSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKLQkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7Ci0JZWxzZQotCQlobGltaXQgPSBucC0+aG9wX2xpbWl0OwotCWlmIChobGltaXQgPCAwKQotCQlobGltaXQgPSBpcDZfZHN0X2hvcGxpbWl0KGRzdCk7CisJaGxpbWl0ID0gaXA2X3NrX2RzdF9ob3BsaW1pdChucCwgJmZsNiwgZHN0KTsKIAogCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIApAQCAtNzAyLDIyICs2OTgsMTEgQEAKIAlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKIAlkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAotCS8qIFBlcmZvcm0gY2hlY2tzdW0uICovCi0Jc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewotCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCWlmICghY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgc2tiLT5sZW4sIElQUFJPVE9fSUNNUFY2LAotCQkJCSAgICAgc2tiLT5jc3VtKSkKLQkJCWJyZWFrOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIENIRUNLU1VNX05PTkU6Ci0JCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBza2ItPmxlbiwKLQkJCQkJICAgICBJUFBST1RPX0lDTVBWNiwgMCkpOwotCQlpZiAoX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRwotCQkJCSAgICAgICAiSUNNUHY2IGNoZWNrc3VtIGZhaWxlZCBbJXBJNmMgPiAlcEk2Y11cbiIsCi0JCQkJICAgICAgIHNhZGRyLCBkYWRkcik7Ci0JCQlnb3RvIGNzdW1fZXJyb3I7Ci0JCX0KKwlpZiAoc2tiX2NoZWNrc3VtX3ZhbGlkYXRlKHNrYiwgSVBQUk9UT19JQ01QVjYsIGlwNl9jb21wdXRlX3BzZXVkbykpIHsKKwkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRworCQkJICAgICAgICJJQ01QdjYgY2hlY2tzdW0gZmFpbGVkIFslcEk2YyA+ICVwSTZjXVxuIiwKKwkJCSAgICAgICBzYWRkciwgZGFkZHIpOworCQlnb3RvIGNzdW1fZXJyb3I7CiAJfQogCiAJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMgYi9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYwppbmRleCBkNGFkZTM0Li5hMjQ1ZTVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYworKysgYi9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYwpAQCAtODEsNyArODEsNyBAQAogCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdChmbDYsIG5wLT5vcHQsICZmaW5hbCk7CiAJZmw2LT5zYWRkciA9IGlyZXEtPmlyX3Y2X2xvY19hZGRyOwogCWZsNi0+Zmxvd2k2X29pZiA9IGlyZXEtPmlyX2lpZjsKLQlmbDYtPmZsb3dpNl9tYXJrID0gc2stPnNrX21hcms7CisJZmw2LT5mbG93aTZfbWFyayA9IGlyZXEtPmlyX21hcms7CiAJZmw2LT5mbDZfZHBvcnQgPSBpcmVxLT5pcl9ybXRfcG9ydDsKIAlmbDYtPmZsNl9zcG9ydCA9IGh0b25zKGlyZXEtPmlyX251bSk7CiAJc2VjdXJpdHlfcmVxX2NsYXNzaWZ5X2Zsb3cocmVxLCBmbG93aTZfdG9fZmxvd2koZmw2KSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfY2hlY2tzdW0uYyBiL25ldC9pcHY2L2lwNl9jaGVja3N1bS5jCmluZGV4IGVlN2E5N2YuLjlhNGQ3MzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9jaGVja3N1bS5jCisrKyBiL25ldC9pcHY2L2lwNl9jaGVja3N1bS5jCkBAIC03NSwyNSArNzUsNTAgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHVoLT5jaGVjayA9PSAwKSB7Ci0JCS8qIFJGQyAyNDYwIHNlY3Rpb24gOC4xIHNheXMgdGhhdCB3ZSBTSE9VTEQgbG9nCi0JCSAgIHRoaXMgZXJyb3IuIFdlbGwsIGl0IGlzIHJlYXNvbmFibGUuCi0JCSAqLwotCQlMSU1JVF9ORVRERUJVRyhLRVJOX0lORk8gIklQdjY6IHVkcCBjaGVja3N1bSBpcyAwIGZvciBbJXBJNmNdOiV1LT5bJXBJNmNdOiV1XG4iLAotCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkciwgbnRvaHModWgtPnNvdXJjZSksCi0JCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBudG9ocyh1aC0+ZGVzdCkpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCi0JICAgICFjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkgICAgIHNrYi0+bGVuLCBwcm90bywgc2tiLT5jc3VtKSkKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQotCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKLQkJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJCQkJICZpcHY2X2hkcihza2IpLT5kYWRkciwKLQkJCQkJCQkgc2tiLT5sZW4sIHByb3RvLCAwKSk7Ci0KLQlyZXR1cm4gMDsKKwkvKiBUbyBzdXBwb3J0IFJGQyA2OTM2IChhbGxvdyB6ZXJvIGNoZWNrc3VtIGluIFVEUC9JUFY2IGZvciB0dW5uZWxzKQorCSAqIHdlIGFjY2VwdCBhIGNoZWNrc3VtIG9mIHplcm8gaGVyZS4gV2hlbiB3ZSBmaW5kIHRoZSBzb2NrZXQKKwkgKiBmb3IgdGhlIFVEUCBwYWNrZXQgd2UnbGwgY2hlY2sgaWYgdGhhdCBzb2NrZXQgYWxsb3dzIHplcm8gY2hlY2tzdW0KKwkgKiBmb3IgSVB2NiAoc2V0IGJ5IHNvY2tldCBvcHRpb24pLgorCSAqLworCXJldHVybiBza2JfY2hlY2tzdW1faW5pdF96ZXJvX2NoZWNrKHNrYiwgcHJvdG8sIHVoLT5jaGVjaywKKwkJCQkJICAgaXA2X2NvbXB1dGVfcHNldWRvKTsKIH0KIEVYUE9SVF9TWU1CT0wodWRwNl9jc3VtX2luaXQpOworCisvKiBGdW5jdGlvbiB0byBzZXQgVURQIGNoZWNrc3VtIGZvciBhbiBJUHY2IFVEUCBwYWNrZXQuIFRoaXMgaXMgaW50ZW5kZWQKKyAqIGZvciB0aGUgc2ltcGxlIGNhc2UgbGlrZSB3aGVuIHNldHRpbmcgdGhlIGNoZWNrc3VtIGZvciBhIFVEUCB0dW5uZWwuCisgKi8KK3ZvaWQgdWRwNl9zZXRfY3N1bShib29sIG5vY2hlY2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CisKKwlpZiAobm9jaGVjaykKKwkJdWgtPmNoZWNrID0gMDsKKwllbHNlIGlmIChza2JfaXNfZ3NvKHNrYikpCisJCXVoLT5jaGVjayA9IH51ZHBfdjZfY2hlY2sobGVuLCBzYWRkciwgZGFkZHIsIDApOworCWVsc2UgaWYgKHNrYl9kc3Qoc2tiKSAmJiBza2JfZHN0KHNrYiktPmRldiAmJgorCQkgKHNrYl9kc3Qoc2tiKS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBWNl9DU1VNKSkgeworCisJCUJVR19PTihza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKTsKKworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CisJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CisJCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdWRwaGRyLCBjaGVjayk7CisJCXVoLT5jaGVjayA9IH51ZHBfdjZfY2hlY2sobGVuLCBzYWRkciwgZGFkZHIsIDApOworCX0gZWxzZSB7CisJCV9fd3N1bSBjc3VtOworCisJCUJVR19PTihza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKTsKKworCQl1aC0+Y2hlY2sgPSAwOworCQljc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgMCwgbGVuLCAwKTsKKwkJdWgtPmNoZWNrID0gdWRwX3Y2X2NoZWNrKGxlbiwgc2FkZHIsIGRhZGRyLCBjc3VtKTsKKwkJaWYgKHVoLT5jaGVjayA9PSAwKQorCQkJdWgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CisKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHVkcDZfc2V0X2NzdW0pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2ZpYi5jIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCmluZGV4IDg3ODkxZjUuLmNiNDQ1OWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9maWIuYworKysgYi9uZXQvaXB2Ni9pcDZfZmliLmMKQEAgLTcxLDggKzcxLDcgQEAKICNkZWZpbmUgRldTX0lOSVQgRldTX0wKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBmaWI2X3BydW5lX2Nsb25lcyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X25vZGUgKmZuLAotCQkJICAgICAgc3RydWN0IHJ0Nl9pbmZvICpydCk7CitzdGF0aWMgdm9pZCBmaWI2X3BydW5lX2Nsb25lcyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X25vZGUgKmZuKTsKIHN0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKmZpYjZfZmluZF9wcmVmaXgoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliNl9ub2RlICpmbik7CiBzdGF0aWMgc3RydWN0IGZpYjZfbm9kZSAqZmliNl9yZXBhaXJfdHJlZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X25vZGUgKmZuKTsKIHN0YXRpYyBpbnQgZmliNl93YWxrKHN0cnVjdCBmaWI2X3dhbGtlcl90ICp3KTsKQEAgLTk0MSw3ICs5NDAsNyBAQAogCWlmICghZXJyKSB7CiAJCWZpYjZfc3RhcnRfZ2MoaW5mby0+bmxfbmV0LCBydCk7CiAJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKSkKLQkJCWZpYjZfcHJ1bmVfY2xvbmVzKGluZm8tPm5sX25ldCwgcG4sIHJ0KTsKKwkJCWZpYjZfcHJ1bmVfY2xvbmVzKGluZm8tPm5sX25ldCwgcG4pOwogCX0KIAogb3V0OgpAQCAtMTM3NSw3ICsxMzc0LDcgQEAKIAkJCXBuID0gcG4tPnBhcmVudDsKIAkJfQogI2VuZGlmCi0JCWZpYjZfcHJ1bmVfY2xvbmVzKGluZm8tPm5sX25ldCwgcG4sIHJ0KTsKKwkJZmliNl9wcnVuZV9jbG9uZXMoaW5mby0+bmxfbmV0LCBwbik7CiAJfQogCiAJLyoKQEAgLTE2MDEsMTAgKzE2MDAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmaWI2X3BydW5lX2Nsb25lcyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X25vZGUgKmZuLAotCQkJICAgICAgc3RydWN0IHJ0Nl9pbmZvICpydCkKK3N0YXRpYyB2b2lkIGZpYjZfcHJ1bmVfY2xvbmVzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYjZfbm9kZSAqZm4pCiB7Ci0JZmliNl9jbGVhbl90cmVlKG5ldCwgZm4sIGZpYjZfcHJ1bmVfY2xvbmUsIDEsIHJ0KTsKKwlmaWI2X2NsZWFuX3RyZWUobmV0LCBmbiwgZmliNl9wcnVuZV9jbG9uZSwgMSwgTlVMTCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKaW5kZXggMDk2MWI1ZS4uNDA1MjY5NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2dyZS5jIGIvbmV0L2lwdjYvaXA2X2dyZS5jCmluZGV4IDlkOTIxNDYuLjM4NzMxODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9ncmUuYworKysgYi9uZXQvaXB2Ni9pcDZfZ3JlLmMKQEAgLTcyLDYgKzcyLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBpcDZncmVfbGlua19vcHMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBpcDZncmVfdGFwX29wcyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGludCBpcDZncmVfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBpcDZncmVfdHVubmVsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgaXA2Z3JlX3R1bm5lbF9saW5rKHN0cnVjdCBpcDZncmVfbmV0ICppZ24sIHN0cnVjdCBpcDZfdG5sICp0KTsKQEAgLTM1MywxMCArMzU0LDEwIEBACiAKIHN0YXRpYyB2b2lkIGlwNmdyZV90dW5uZWxfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwotCXN0cnVjdCBpcDZncmVfbmV0ICppZ24gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwNmdyZV9uZXRfaWQpOworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXA2Z3JlX25ldCAqaWduID0gbmV0X2dlbmVyaWModC0+bmV0LCBpcDZncmVfbmV0X2lkKTsKIAotCWlwNmdyZV90dW5uZWxfdW5saW5rKGlnbiwgbmV0ZGV2X3ByaXYoZGV2KSk7CisJaXA2Z3JlX3R1bm5lbF91bmxpbmsoaWduLCB0KTsKIAlkZXZfcHV0KGRldik7CiB9CiAKQEAgLTQ2NywxNyArNDY4LDcgQEAKIAkJCWdvdG8gZHJvcDsKIAogCQlpZiAoZmxhZ3MmR1JFX0NTVU0pIHsKLQkJCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKLQkJCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCQkJY3N1bSA9IGNzdW1fZm9sZChza2ItPmNzdW0pOwotCQkJCWlmICghY3N1bSkKLQkJCQkJYnJlYWs7Ci0JCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCQljYXNlIENIRUNLU1VNX05PTkU6Ci0JCQkJc2tiLT5jc3VtID0gMDsKLQkJCQljc3VtID0gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwotCQkJfQorCQkJY3N1bSA9IHNrYl9jaGVja3N1bV9zaW1wbGVfdmFsaWRhdGUoc2tiKTsKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJCWlmIChmbGFncyZHUkVfS0VZKSB7CkBAIC02MTEsOCArNjAyLDggQEAKIAkJCSBpbnQgZW5jYXBfbGltaXQsCiAJCQkgX191MzIgKnBtdHUpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwogCXN0cnVjdCBpcDZfdG5sICp0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IHR1bm5lbC0+bmV0OwogCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OyAgICAvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLwogCXN0cnVjdCBpcHY2aGRyICAqaXB2Nmg7ICAgICAvKiBPdXIgbmV3IElQIGhlYWRlciAqLwogCXVuc2lnbmVkIGludCBtYXhfaGVhZHJvb20gPSAwOyAvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLwpAQCAtOTc5LDcgKzk3MCw3IEBACiAJCWludCBzdHJpY3QgPSAoaXB2Nl9hZGRyX3R5cGUoJnAtPnJhZGRyKSAmCiAJCQkgICAgICAoSVBWNl9BRERSX01VTFRJQ0FTVHxJUFY2X0FERFJfTElOS0xPQ0FMKSk7CiAKLQkJc3RydWN0IHJ0Nl9pbmZvICpydCA9IHJ0Nl9sb29rdXAoZGV2X25ldChkZXYpLAorCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gcnQ2X2xvb2t1cCh0LT5uZXQsCiAJCQkJCQkgJnAtPnJhZGRyLCAmcC0+bGFkZHIsCiAJCQkJCQkgcC0+bGluaywgc3RyaWN0KTsKIApAQCAtMTA2MywxMyArMTA1NCwxMiBAQAogCWludCBlcnIgPSAwOwogCXN0cnVjdCBpcDZfdG5sX3Bhcm0yIHA7CiAJc3RydWN0IF9faXA2X3RubF9wYXJtIHAxOwotCXN0cnVjdCBpcDZfdG5sICp0OwotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gdC0+bmV0OwogCXN0cnVjdCBpcDZncmVfbmV0ICppZ24gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwNmdyZV9uZXRfaWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRUVU5ORUw6Ci0JCXQgPSBOVUxMOwogCQlpZiAoZGV2ID09IGlnbi0+ZmJfdHVubmVsX2RldikgewogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mKHApKSkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDc3LDkgKzEwNjcsOSBAQAogCQkJfQogCQkJaXA2Z3JlX3RubF9wYXJtX2Zyb21fdXNlcigmcDEsICZwKTsKIAkJCXQgPSBpcDZncmVfdHVubmVsX2xvY2F0ZShuZXQsICZwMSwgMCk7CisJCQlpZiAodCA9PSBOVUxMKQorCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl9Ci0JCWlmICh0ID09IE5VTEwpCi0JCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwogCQlpcDZncmVfdG5sX3Bhcm1fdG9fdXNlcigmcCwgJnQtPnBhcm1zKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgJnAsIHNpemVvZihwKSkpCkBAIC0xMjQyLDcgKzEyMzIsNiBAQAogCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOwogCWRldi0+aWZsaW5rID0gMDsKIAlkZXYtPmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX05FVE5TX0xPQ0FMOwogCWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX1hNSVRfRFNUX1JFTEVBU0U7CiB9CiAKQEAgLTEyOTcsMTEgKzEyODYsMTcgQEAKIAkuZmxhZ3MgICAgICAgPSBJTkVUNl9QUk9UT19OT1BPTElDWXxJTkVUNl9QUk9UT19GSU5BTCwKIH07CiAKLXN0YXRpYyB2b2lkIGlwNmdyZV9kZXN0cm95X3R1bm5lbHMoc3RydWN0IGlwNmdyZV9uZXQgKmlnbiwKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQgaXA2Z3JlX2Rlc3Ryb3lfdHVubmVscyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0IGlwNmdyZV9uZXQgKmlnbiA9IG5ldF9nZW5lcmljKG5ldCwgaXA2Z3JlX25ldF9pZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgKmF1eDsKIAlpbnQgcHJpbzsKIAorCWZvcl9lYWNoX25ldGRldl9zYWZlKG5ldCwgZGV2LCBhdXgpCisJCWlmIChkZXYtPnJ0bmxfbGlua19vcHMgPT0gJmlwNmdyZV9saW5rX29wcyB8fAorCQkgICAgZGV2LT5ydG5sX2xpbmtfb3BzID09ICZpcDZncmVfdGFwX29wcykKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgaGVhZCk7CisKIAlmb3IgKHByaW8gPSAwOyBwcmlvIDwgNDsgcHJpbysrKSB7CiAJCWludCBoOwogCQlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKQEAgLTEzMTAsNyArMTMwNSwxMiBAQAogCQkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaWduLT50dW5uZWxzW3ByaW9dW2hdKTsKIAogCQkJd2hpbGUgKHQgIT0gTlVMTCkgewotCQkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKHQtPmRldiwgaGVhZCk7CisJCQkJLyogSWYgZGV2IGlzIGluIHRoZSBzYW1lIG5ldG5zLCBpdCBoYXMgYWxyZWFkeQorCQkJCSAqIGJlZW4gYWRkZWQgdG8gdGhlIGxpc3QgYnkgdGhlIHByZXZpb3VzIGxvb3AuCisJCQkJICovCisJCQkJaWYgKCFuZXRfZXEoZGV2X25ldCh0LT5kZXYpLCBuZXQpKQorCQkJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZSh0LT5kZXYsCisJCQkJCQkJCSAgIGhlYWQpOwogCQkJCXQgPSBydG5sX2RlcmVmZXJlbmNlKHQtPm5leHQpOwogCQkJfQogCQl9CkBAIC0xMzI5LDYgKzEzMjksMTEgQEAKIAkJZ290byBlcnJfYWxsb2NfZGV2OwogCX0KIAlkZXZfbmV0X3NldChpZ24tPmZiX3R1bm5lbF9kZXYsIG5ldCk7CisJLyogRkIgbmV0ZGV2aWNlIGlzIHNwZWNpYWw6IHdlIGhhdmUgb25lLCBhbmQgb25seSBvbmUgcGVyIG5ldG5zLgorCSAqIEFsbG93aW5nIHRvIG1vdmUgaXQgdG8gYW5vdGhlciBuZXRucyBpcyBjbGVhcmx5IHVuc2FmZS4KKwkgKi8KKwlpZ24tPmZiX3R1bm5lbF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTkVUTlNfTE9DQUw7CisKIAogCWlwNmdyZV9mYl90dW5uZWxfaW5pdChpZ24tPmZiX3R1bm5lbF9kZXYpOwogCWlnbi0+ZmJfdHVubmVsX2Rldi0+cnRubF9saW5rX29wcyA9ICZpcDZncmVfbGlua19vcHM7CkBAIC0xMzQ5LDEyICsxMzU0LDEwIEBACiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgaXA2Z3JlX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlzdHJ1Y3QgaXA2Z3JlX25ldCAqaWduOwogCUxJU1RfSEVBRChsaXN0KTsKIAotCWlnbiA9IG5ldF9nZW5lcmljKG5ldCwgaXA2Z3JlX25ldF9pZCk7CiAJcnRubF9sb2NrKCk7Ci0JaXA2Z3JlX2Rlc3Ryb3lfdHVubmVscyhpZ24sICZsaXN0KTsKKwlpcDZncmVfZGVzdHJveV90dW5uZWxzKG5ldCwgJmxpc3QpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoJmxpc3QpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CkBAIC0xNTMxLDE1ICsxNTM0LDE0IEBACiBzdGF0aWMgaW50IGlwNmdyZV9jaGFuZ2VsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBubGF0dHIgKnRiW10sCiAJCQkgICAgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewotCXN0cnVjdCBpcDZfdG5sICp0LCAqbnQ7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCXN0cnVjdCBpcDZfdG5sICp0LCAqbnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IG50LT5uZXQ7CiAJc3RydWN0IGlwNmdyZV9uZXQgKmlnbiA9IG5ldF9nZW5lcmljKG5ldCwgaXA2Z3JlX25ldF9pZCk7CiAJc3RydWN0IF9faXA2X3RubF9wYXJtIHA7CiAKIAlpZiAoZGV2ID09IGlnbi0+ZmJfdHVubmVsX2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQludCA9IG5ldGRldl9wcml2KGRldik7CiAJaXA2Z3JlX25ldGxpbmtfcGFybXMoZGF0YSwgJnApOwogCiAJdCA9IGlwNmdyZV90dW5uZWxfbG9jYXRlKG5ldCwgJnAsIDApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X29mZmxvYWQuYyBiL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMKaW5kZXggYjJmMDkxNS4uNjVlZGEyYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X29mZmxvYWQuYworKysgYi9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jCkBAIC05Nyw5ICs5NywxMSBAQAogCQkgICAgICAgU0tCX0dTT19ET0RHWSB8CiAJCSAgICAgICBTS0JfR1NPX1RDUF9FQ04gfAogCQkgICAgICAgU0tCX0dTT19HUkUgfAorCQkgICAgICAgU0tCX0dTT19HUkVfQ1NVTSB8CiAJCSAgICAgICBTS0JfR1NPX0lQSVAgfAogCQkgICAgICAgU0tCX0dTT19TSVQgfAogCQkgICAgICAgU0tCX0dTT19VRFBfVFVOTkVMIHwKKwkJICAgICAgIFNLQl9HU09fVURQX1RVTk5FTF9DU1VNIHwKIAkJICAgICAgIFNLQl9HU09fTVBMUyB8CiAJCSAgICAgICBTS0JfR1NPX1RDUFY2IHwKIAkJICAgICAgIDApKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCBmYmYxMTU2Li5jYjlkZjBlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC0yMTksNyArMjE5LDcgQEAKIAlza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKIAogCW10dSA9IGRzdF9tdHUoZHN0KTsKLQlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgc2tiLT5sb2NhbF9kZiB8fCBza2JfaXNfZ3NvKHNrYikpIHsKKwlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgc2tiLT5pZ25vcmVfZGYgfHwgc2tiX2lzX2dzbyhza2IpKSB7CiAJCUlQNl9VUERfUE9fU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKSwKIAkJCSAgICAgIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOwogCQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsCkBAIC0zNDcsMTEgKzM0NywxMSBAQAogCWlmIChza2ItPmxlbiA8PSBtdHUpCiAJCXJldHVybiBmYWxzZTsKIAotCS8qIGlwdjYgY29ubnRyYWNrIGRlZnJhZyBzZXRzIG1heF9mcmFnX3NpemUgKyBsb2NhbF9kZiAqLworCS8qIGlwdjYgY29ubnRyYWNrIGRlZnJhZyBzZXRzIG1heF9mcmFnX3NpemUgKyBpZ25vcmVfZGYgKi8KIAlpZiAoSVA2Q0Ioc2tiKS0+ZnJhZ19tYXhfc2l6ZSAmJiBJUDZDQihza2IpLT5mcmFnX21heF9zaXplID4gbXR1KQogCQlyZXR1cm4gdHJ1ZTsKIAotCWlmIChza2ItPmxvY2FsX2RmKQorCWlmIChza2ItPmlnbm9yZV9kZikKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHNrYl9pc19nc28oc2tiKSAmJiBza2JfZ3NvX25ldHdvcmtfc2VnbGVuKHNrYikgPD0gbXR1KQpAQCAtNTM3LDYgKzUzNywxOCBAQAogCXNrYl9jb3B5X3NlY21hcmsodG8sIGZyb20pOwogfQogCitzdGF0aWMgdm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIsIHN0cnVjdCBydDZfaW5mbyAqcnQpCit7CisJc3RhdGljIHUzMiBpcDZfaWRlbnRzX2hhc2hybmQgX19yZWFkX21vc3RseTsKKwl1MzIgaGFzaCwgaWQ7CisKKwluZXRfZ2V0X3JhbmRvbV9vbmNlKCZpcDZfaWRlbnRzX2hhc2hybmQsIHNpemVvZihpcDZfaWRlbnRzX2hhc2hybmQpKTsKKworCWhhc2ggPSBfX2lwdjZfYWRkcl9qaGFzaCgmcnQtPnJ0NmlfZHN0LmFkZHIsIGlwNl9pZGVudHNfaGFzaHJuZCk7CisJaWQgPSBpcF9pZGVudHNfcmVzZXJ2ZShoYXNoLCAxKTsKKwlmaGRyLT5pZGVudGlmaWNhdGlvbiA9IGh0b25sKGlkKTsKK30KKwogaW50IGlwNl9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmICopKQogewogCXN0cnVjdCBza19idWZmICpmcmFnOwpAQCAtNTU5LDcgKzU3MSw3IEBACiAJLyogV2UgbXVzdCBub3QgZnJhZ21lbnQgaWYgdGhlIHNvY2tldCBpcyBzZXQgdG8gZm9yY2UgTVRVIGRpc2NvdmVyeQogCSAqIG9yIGlmIHRoZSBza2IgaXQgbm90IGdlbmVyYXRlZCBieSBhIGxvY2FsIHNvY2tldC4KIAkgKi8KLQlpZiAodW5saWtlbHkoIXNrYi0+bG9jYWxfZGYgJiYgc2tiLT5sZW4gPiBtdHUpIHx8CisJaWYgKHVubGlrZWx5KCFza2ItPmlnbm9yZV9kZiAmJiBza2ItPmxlbiA+IG10dSkgfHwKIAkJICAgICAoSVA2Q0Ioc2tiKS0+ZnJhZ19tYXhfc2l6ZSAmJgogCQkgICAgICBJUDZDQihza2IpLT5mcmFnX21heF9zaXplID4gbXR1KSkgewogCQlpZiAoc2tiLT5zayAmJiBkc3RfYWxsZnJhZyhza2JfZHN0KHNrYikpKQpAQCAtMTIzNCw3ICsxMjQ2LDcgQEAKIAkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpIDogMCkgKwogCQkJICAgICBydC0+cnQ2aV9uZmhlYWRlcl9sZW47CiAKLQkJaWYgKGlwNl9za19sb2NhbF9kZihzaykpCisJCWlmIChpcDZfc2tfaWdub3JlX2RmKHNrKSkKIAkJCW1heG5vbmZyYWdzaXplID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIElQVjZfTUFYUExFTjsKIAkJZWxzZQogCQkJbWF4bm9uZnJhZ3NpemUgPSBtdHU7CkBAIC0xNTQ0LDcgKzE1NTYsNyBAQAogCX0KIAogCS8qIEFsbG93IGxvY2FsIGZyYWdtZW50YXRpb24uICovCi0Jc2tiLT5sb2NhbF9kZiA9IGlwNl9za19sb2NhbF9kZihzayk7CisJc2tiLT5pZ25vcmVfZGYgPSBpcDZfc2tfaWdub3JlX2RmKHNrKTsKIAogCSpmaW5hbF9kc3QgPSBmbDYtPmRhZGRyOwogCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IGY2YTY2YmIuLmFmYTA4MjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTYxLDYgKzYxLDcgQEAKIE1PRFVMRV9BVVRIT1IoIlZpbGxlIE51b3J2YWxhIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgdHVubmVsaW5nIGRldmljZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiaXA2dG5sIik7CiBNT0RVTEVfQUxJQVNfTkVUREVWKCJpcDZ0bmwwIik7CiAKICNpZmRlZiBJUDZfVE5MX0RFQlVHCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdnRpLmMgYi9uZXQvaXB2Ni9pcDZfdnRpLmMKaW5kZXggNmNjOWY5My4uOWFhYTZiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3Z0aS5jCisrKyBiL25ldC9pcHY2L2lwNl92dGkuYwpAQCAtNzk1LDE1ICs3OTUsMTIgQEAKICAqKi8KIHN0YXRpYyB2b2lkIHZ0aTZfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGlwNl90bmwgKnQ7Ci0KIAlkZXYtPm5ldGRldl9vcHMgPSAmdnRpNl9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvciA9IHZ0aTZfZGV2X2ZyZWU7CiAKIAlkZXYtPnR5cGUgPSBBUlBIUkRfVFVOTkVMNjsKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IExMX01BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCWRldi0+bXR1ID0gRVRIX0RBVEFfTEVOOwotCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOwogCWRldi0+YWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKIAlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9YTUlUX0RTVF9SRUxFQVNFOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX25hdC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX25hdC5jCmluZGV4IDg0YzdmMzMuLjM4N2Q4YjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9uYXQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbmF0LmMKQEAgLTkwLDE3ICs5MCw5IEBACiAJaWYgKG5mX2N0X2lzX3VudHJhY2tlZChjdCkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQluYXQgPSBuZmN0X25hdChjdCk7Ci0JaWYgKCFuYXQpIHsKLQkJLyogTkFUIG1vZHVsZSB3YXMgbG9hZGVkIGxhdGUuICovCi0JCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpKQotCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkJbmF0ID0gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX05BVCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChuYXQgPT0gTlVMTCkgewotCQkJcHJfZGVidWcoImZhaWxlZCB0byBhZGQgTkFUIGV4dGVuc2lvblxuIik7Ci0JCQlyZXR1cm4gTkZfQUNDRVBUOwotCQl9Ci0JfQorCW5hdCA9IG5mX2N0X25hdF9leHRfYWRkKGN0KTsKKwlpZiAobmF0ID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlzd2l0Y2ggKGN0aW5mbykgewogCWNhc2UgSVBfQ1RfUkVMQVRFRDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCA3NjdhYjhkLi4wZDUyNzlmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC00NTEsNyArNDUxLDcgQEAKIAl9CiAJc3ViX2ZyYWdfbWVtX2xpbWl0KCZmcS0+cSwgaGVhZC0+dHJ1ZXNpemUpOwogCi0JaGVhZC0+bG9jYWxfZGYgPSAxOworCWhlYWQtPmlnbm9yZV9kZiA9IDE7CiAJaGVhZC0+bmV4dCA9IE5VTEw7CiAJaGVhZC0+ZGV2ID0gZGV2OwogCWhlYWQtPnRzdGFtcCA9IGZxLT5xLnN0YW1wOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9uYXRfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9uYXRfaXB2Ni5jCmluZGV4IDljMzI5N2EuLmQxODlmY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY2LmMKQEAgLTQ3LDE1ICs0Nyw5IEBACiAJaWYgKGN0ID09IE5VTEwgfHwgbmZfY3RfaXNfdW50cmFja2VkKGN0KSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCW5hdCA9IG5mY3RfbmF0KGN0KTsKLQlpZiAobmF0ID09IE5VTEwpIHsKLQkJLyogQ29ubnRyYWNrIG1vZHVsZSB3YXMgbG9hZGVkIGxhdGUsIGNhbid0IGFkZCBleHRlbnNpb24uICovCi0JCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpKQotCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkJbmF0ID0gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX05BVCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChuYXQgPT0gTlVMTCkKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQorCW5hdCA9IG5mX2N0X25hdF9leHRfYWRkKGN0KTsKKwlpZiAobmF0ID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlzd2l0Y2ggKGN0aW5mbykgewogCWNhc2UgSVBfQ1RfUkVMQVRFRDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMgYi9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jCmluZGV4IDU2NTk2Y2UuLjVlYzg2N2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMKKysrIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwpAQCAtOCwzMiArOCw2IEBACiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAjaW5jbHVkZSA8bmV0L3NlY3VyZV9zZXEuaD4KIAotdm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIsIHN0cnVjdCBydDZfaW5mbyAqcnQpCi17Ci0Jc3RhdGljIGF0b21pY190IGlwdjZfZnJhZ21lbnRhdGlvbl9pZDsKLQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKLQlpbnQgaWRlbnQ7Ci0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXI7Ci0Jc3RydWN0IG5ldCAqbmV0OwotCi0JbmV0ID0gZGV2X25ldChydC0+ZHN0LmRldik7Ci0JcGVlciA9IGluZXRfZ2V0cGVlcl92NihuZXQtPmlwdjYucGVlcnMsICZydC0+cnQ2aV9kc3QuYWRkciwgMSk7Ci0JaWYgKHBlZXIpIHsKLQkJZmhkci0+aWRlbnRpZmljYXRpb24gPSBodG9ubChpbmV0X2dldGlkKHBlZXIsIDApKTsKLQkJaW5ldF9wdXRwZWVyKHBlZXIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JaWRlbnQgPSBhdG9taWNfaW5jX3JldHVybigmaXB2Nl9mcmFnbWVudGF0aW9uX2lkKTsKLQotCWFkZHIgPSBydC0+cnQ2aV9kc3QuYWRkcjsKLQlhZGRyLnM2X2FkZHIzMlswXSBePSAoX19mb3JjZSBfX2JlMzIpaWRlbnQ7Ci0JZmhkci0+aWRlbnRpZmljYXRpb24gPSBodG9ubChzZWN1cmVfaXB2Nl9pZChhZGRyLnM2X2FkZHIzMikpOwotfQotRVhQT1JUX1NZTUJPTChpcHY2X3NlbGVjdF9pZGVudCk7Ci0KIGludCBpcDZfZmluZF8xc3RmcmFnb3B0KHN0cnVjdCBza19idWZmICpza2IsIHU4ICoqbmV4dGhkcikKIHsKIAl1MTYgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKQEAgLTEwNCw2ICs3OCw3IEBACiAJaWYgKGxlbiA+IElQVjZfTUFYUExFTikKIAkJbGVuID0gMDsKIAlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IGh0b25zKGxlbik7CisJSVA2Q0Ioc2tiKS0+bmhvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsCiAJCSAgICAgICBza2JfZHN0KHNrYiktPmRldiwgZHN0X291dHB1dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9waW5nLmMgYi9uZXQvaXB2Ni9waW5nLmMKaW5kZXggYmRhNzQyOS4uNWI3YTFlZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcGluZy5jCisrKyBiL25ldC9pcHY2L3BpbmcuYwpAQCAtNTEsNyArNTEsNiBAQAogCS5wcm90b2NvbCA9ICBJUFBST1RPX0lDTVBWNiwKIAkucHJvdCA9ICAgICAgJnBpbmd2Nl9wcm90LAogCS5vcHMgPSAgICAgICAmaW5ldDZfZGdyYW1fb3BzLAotCS5ub19jaGVjayA9ICBVRFBfQ1NVTV9ERUZBVUxULAogCS5mbGFncyA9ICAgICBJTkVUX1BST1RPU1dfUkVVU0UsCiB9OwogCkBAIC0xNjgsMTIgKzE2Nyw3IEBACiAJcGZoLndjaGVjayA9IDA7CiAJcGZoLmZhbWlseSA9IEFGX0lORVQ2OwogCi0JaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsNi5kYWRkcikpCi0JCWhsaW1pdCA9IG5wLT5tY2FzdF9ob3BzOwotCWVsc2UKLQkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKLQlpZiAoaGxpbWl0IDwgMCkKLQkJaGxpbWl0ID0gaXA2X2RzdF9ob3BsaW1pdChkc3QpOworCWhsaW1pdCA9IGlwNl9za19kc3RfaG9wbGltaXQobnAsICZmbDYsIGRzdCk7CiAKIAlsb2NrX3NvY2soc2spOwogCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgcGluZ19nZXRmcmFnLCAmcGZoLCBsZW4sCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9wcm9jLmMgYi9uZXQvaXB2Ni9wcm9jLmMKaW5kZXggMDkxZDA2Ni4uMzMxNzQ0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcHJvYy5jCisrKyBiL25ldC9pcHY2L3Byb2MuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAvKiBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIHBlcmNwdSBtaWIgKHBjcHVtaWIgIT0gTlVMTCksCiAgKiBvciBzaGFyZWQgb25lIChzbWliICE9IE5VTEwpCiAgKi8KLXN0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2l0ZW0oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgX19wZXJjcHUgKipwY3B1bWliLAorc3RhdGljIHZvaWQgc25tcDZfc2VxX3Nob3dfaXRlbShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCBfX3BlcmNwdSAqcGNwdW1pYiwKIAkJCQlhdG9taWNfbG9uZ190ICpzbWliLAogCQkJCWNvbnN0IHN0cnVjdCBzbm1wX21pYiAqaXRlbWxpc3QpCiB7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2l0ZW02NChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCBfX3BlcmNwdSAqKm1pYiwKK3N0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2l0ZW02NChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCBfX3BlcmNwdSAqbWliLAogCQkJCSAgY29uc3Qgc3RydWN0IHNubXBfbWliICppdGVtbGlzdCwgc2l6ZV90IHN5bmNwb2ZmKQogewogCWludCBpOwpAQCAtMjE1LDE0ICsyMTUsMTQgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSAoc3RydWN0IG5ldCAqKXNlcS0+cHJpdmF0ZTsKIAotCXNubXA2X3NlcV9zaG93X2l0ZW02NChzZXEsICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcywKKwlzbm1wNl9zZXFfc2hvd19pdGVtNjQoc2VxLCBuZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MsCiAJCQkgICAgc25tcDZfaXBzdGF0c19saXN0LCBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSk7Ci0Jc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzLAorCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCBuZXQtPm1pYi5pY21wdjZfc3RhdGlzdGljcywKIAkJCSAgICBOVUxMLCBzbm1wNl9pY21wNl9saXN0KTsKIAlzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc2VxLCBuZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcy0+bWlicyk7Ci0Jc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnVkcF9zdGF0c19pbjYsCisJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsIG5ldC0+bWliLnVkcF9zdGF0c19pbjYsCiAJCQkgICAgTlVMTCwgc25tcDZfdWRwNl9saXN0KTsKLQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYsCisJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsIG5ldC0+bWliLnVkcGxpdGVfc3RhdHNfaW42LAogCQkJICAgIE5VTEwsIHNubXA2X3VkcGxpdGU2X2xpc3QpOwogCXJldHVybiAwOwogfQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IChzdHJ1Y3QgaW5ldDZfZGV2ICopc2VxLT5wcml2YXRlOwogCiAJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JXVcbiIsICJpZkluZGV4IiwgaWRldi0+ZGV2LT5pZmluZGV4KTsKLQlzbm1wNl9zZXFfc2hvd19pdGVtNjQoc2VxLCAodm9pZCBfX3BlcmNwdSAqKilpZGV2LT5zdGF0cy5pcHY2LAorCXNubXA2X3NlcV9zaG93X2l0ZW02NChzZXEsIGlkZXYtPnN0YXRzLmlwdjYsCiAJCQkgICAgc25tcDZfaXBzdGF0c19saXN0LCBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSk7CiAJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsIE5VTEwsIGlkZXYtPnN0YXRzLmljbXB2NmRldi0+bWlicywKIAkJCSAgICBzbm1wNl9pY21wNl9saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKaW5kZXggMWYyOTk5Ni4uYjJkYzYwYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmF3LmMKKysrIGIvbmV0L2lwdjYvcmF3LmMKQEAgLTg3MywxNCArODczLDggQEAKIAkJZXJyID0gUFRSX0VSUihkc3QpOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKGhsaW1pdCA8IDApIHsKLQkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsNi5kYWRkcikpCi0JCQlobGltaXQgPSBucC0+bWNhc3RfaG9wczsKLQkJZWxzZQotCQkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKLQkJaWYgKGhsaW1pdCA8IDApCi0JCQlobGltaXQgPSBpcDZfZHN0X2hvcGxpbWl0KGRzdCk7Ci0JfQorCWlmIChobGltaXQgPCAwKQorCQlobGltaXQgPSBpcDZfc2tfZHN0X2hvcGxpbWl0KG5wLCAmZmw2LCBkc3QpOwogCiAJaWYgKHRjbGFzcyA8IDApCiAJCXRjbGFzcyA9IG5wLT50Y2xhc3M7CkBAIC0xMzI4LDcgKzEzMjIsNiBAQAogCS5wcm90b2NvbAk9IElQUFJPVE9fSVAsCS8qIHdpbGQgY2FyZCAqLwogCS5wcm90CQk9ICZyYXd2Nl9wcm90LAogCS5vcHMJCT0gJmluZXQ2X3NvY2tyYXdfb3BzLAotCS5ub19jaGVjawk9IFVEUF9DU1VNX0RFRkFVTFQsCiAJLmZsYWdzCQk9IElORVRfUFJPVE9TV19SRVVTRSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IDZlYmRiN2I2Li5mMjNmYmQyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTExNzYsNyArMTE3Niw3IEBACiAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwogCWZsNi5mbG93aTZfb2lmID0gb2lmOwotCWZsNi5mbG93aTZfbWFyayA9IG1hcms7CisJZmw2LmZsb3dpNl9tYXJrID0gbWFyayA/IG1hcmsgOiBJUDZfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CiAJZmw2LmRhZGRyID0gaXBoLT5kYWRkcjsKIAlmbDYuc2FkZHIgPSBpcGgtPnNhZGRyOwogCWZsNi5mbG93bGFiZWwgPSBpcDZfZmxvd2luZm8oaXBoKTsKQEAgLTE0NTUsNyArMTQ1NSw3IEBACiAJCWdvdG8gb3V0OwogCiAJbmV0LT5pcHY2LmlwNl9ydF9nY19leHBpcmUrKzsKLQlmaWI2X3J1bl9nYyhuZXQtPmlwdjYuaXA2X3J0X2djX2V4cGlyZSwgbmV0LCBlbnRyaWVzID4gcnRfbWF4X3NpemUpOworCWZpYjZfcnVuX2djKG5ldC0+aXB2Ni5pcDZfcnRfZ2NfZXhwaXJlLCBuZXQsIHRydWUpOwogCWVudHJpZXMgPSBkc3RfZW50cmllc19nZXRfc2xvdyhvcHMpOwogCWlmIChlbnRyaWVzIDwgb3BzLT5nY190aHJlc2gpCiAJCW5ldC0+aXB2Ni5pcDZfcnRfZ2NfZXhwaXJlID0gcnRfZ2NfdGltZW91dD4+MTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggZTVhNDUzYy4uNGY0MDgxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTU2MCwxMiArNTYwLDEyIEBACiAKIAlpZiAodHlwZSA9PSBJQ01QX0RFU1RfVU5SRUFDSCAmJiBjb2RlID09IElDTVBfRlJBR19ORUVERUQpIHsKIAkJaXB2NF91cGRhdGVfcG10dShza2IsIGRldl9uZXQoc2tiLT5kZXYpLCBpbmZvLAotCQkJCSB0LT5kZXYtPmlmaW5kZXgsIDAsIElQUFJPVE9fSVBWNiwgMCk7CisJCQkJIHQtPnBhcm1zLmxpbmssIDAsIElQUFJPVE9fSVBWNiwgMCk7CiAJCWVyciA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAodHlwZSA9PSBJQ01QX1JFRElSRUNUKSB7Ci0JCWlwdjRfcmVkaXJlY3Qoc2tiLCBkZXZfbmV0KHNrYi0+ZGV2KSwgdC0+ZGV2LT5pZmluZGV4LCAwLAorCQlpcHY0X3JlZGlyZWN0KHNrYiwgZGV2X25ldChza2ItPmRldiksIHQtPnBhcm1zLmxpbmssIDAsCiAJCQkgICAgICBJUFBST1RPX0lQVjYsIDApOwogCQllcnIgPSAwOwogCQlnb3RvIG91dDsKQEAgLTE4MjgsNCArMTgyOCw1IEBACiBtb2R1bGVfaW5pdChzaXRfaW5pdCk7CiBtb2R1bGVfZXhpdChzaXRfY2xlYW51cCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfUlROTF9MSU5LKCJzaXQiKTsKIE1PRFVMRV9BTElBU19ORVRERVYoInNpdDAiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwppbmRleCBiYjUzYTVlNy4uYTgyMmI4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwpAQCAtMjE2LDYgKzIxNiw4IEBACiAJICAgIGlwdjZfYWRkcl90eXBlKCZpcmVxLT5pcl92Nl9ybXRfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQogCQlpcmVxLT5pcl9paWYgPSBpbmV0Nl9paWYoc2tiKTsKIAorCWlyZXEtPmlyX21hcmsgPSBpbmV0X3JlcXVlc3RfbWFyayhzaywgc2tiKTsKKwogCXJlcS0+ZXhwaXJlcyA9IDBVTDsKIAlyZXEtPm51bV9yZXRyYW5zID0gMDsKIAlpcmVxLT5lY25fb2sJCT0gZWNuX29rOwpAQCAtMjQyLDcgKzI0NCw3IEBACiAJCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmw2LCBucC0+b3B0LCAmZmluYWwpOwogCQlmbDYuc2FkZHIgPSBpcmVxLT5pcl92Nl9sb2NfYWRkcjsKIAkJZmw2LmZsb3dpNl9vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwotCQlmbDYuZmxvd2k2X21hcmsgPSBzay0+c2tfbWFyazsKKwkJZmw2LmZsb3dpNl9tYXJrID0gaXJlcS0+aXJfbWFyazsKIAkJZmw2LmZsNl9kcG9ydCA9IGlyZXEtPmlyX3JtdF9wb3J0OwogCQlmbDYuZmw2X3Nwb3J0ID0gaW5ldF9zayhzayktPmluZXRfc3BvcnQ7CiAJCXNlY3VyaXR5X3JlcV9jbGFzc2lmeV9mbG93KHJlcSwgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jIGIvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMKaW5kZXggN2Y0MDVhMS4uMDU4ZjNlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMKQEAgLTM4LDYgKzM4LDEzIEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJmd21hcmtfcmVmbGVjdCIsCisJCS5kYXRhCQk9ICZpbml0X25ldC5pcHY2LnN5c2N0bC5md21hcmtfcmVmbGVjdCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggZTI4OTgzMC4uMjI5MjM5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0zNDAsNyArMzQwLDggQEAKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVycjsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwOwotCV9fdTMyIHNlcTsKKwlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpmYXN0b3BlbjsKKwlfX3UzMiBzZXEsIHNuZF91bmE7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAKIAlzayA9IGluZXQ2X2xvb2t1cChuZXQsICZ0Y3BfaGFzaGluZm8sICZoZHItPmRhZGRyLApAQCAtMzcxLDggKzM3MiwxMSBAQAogCiAJdHAgPSB0Y3Bfc2soc2spOwogCXNlcSA9IG50b2hsKHRoLT5zZXEpOworCS8qIFhYWCAoVEZPKSAtIHRwLT5zbmRfdW5hIHNob3VsZCBiZSBJU04gKHRjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZCgpICovCisJZmFzdG9wZW4gPSB0cC0+ZmFzdG9wZW5fcnNrOworCXNuZF91bmEgPSBmYXN0b3BlbiA/IHRjcF9yc2soZmFzdG9wZW4pLT5zbnRfaXNuIDogdHAtPnNuZF91bmE7CiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOICYmCi0JICAgICFiZXR3ZWVuKHNlcSwgdHAtPnNuZF91bmEsIHRwLT5zbmRfbnh0KSkgeworCSAgICAhYmV0d2VlbihzZXEsIHNuZF91bmEsIHRwLT5zbmRfbnh0KSkgewogCQlORVRfSU5DX1NUQVRTX0JIKG5ldCwgTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MzYsOCArNDQwLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJY2FzZSBUQ1BfU1lOX1NFTlQ6Ci0JY2FzZSBUQ1BfU1lOX1JFQ1Y6ICAvKiBDYW5ub3QgaGFwcGVuLgotCQkJICAgICAgIEl0IGNhbiwgaXQgU1lOcyBhcmUgY3Jvc3NlZC4gLS1BTksgKi8KKwljYXNlIFRDUF9TWU5fUkVDVjoKKwkJLyogT25seSBpbiBmYXN0IG9yIHNpbXVsdGFuZW91cyBvcGVuLiBJZiBhIGZhc3Qgb3BlbiBzb2NrZXQgaXMKKwkJICogaXMgYWxyZWFkeSBhY2NlcHRlZCBpdCBpcyB0cmVhdGVkIGFzIGEgY29ubmVjdGVkIG9uZSBiZWxvdy4KKwkJICovCisJCWlmIChmYXN0b3BlbiAmJiBmYXN0b3Blbi0+c2sgPT0gTlVMTCkKKwkJCWJyZWFrOworCiAJCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQkJc2stPnNrX2VyciA9IGVycjsKIAkJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOwkJLyogV2FrZSBwZW9wbGUgdXAgdG8gc2VlIHRoZSBlcnJvciAoc2VlIGNvbm5lY3QgaW4gc29jay5jKSAqLwpAQCAtNDYzLDcgKzQ3Miw4IEBACiBzdGF0aWMgaW50IHRjcF92Nl9zZW5kX3N5bmFjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKIAkJCSAgICAgIHN0cnVjdCBmbG93aTYgKmZsNiwKIAkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCSAgICAgIHUxNiBxdWV1ZV9tYXBwaW5nKQorCQkJICAgICAgdTE2IHF1ZXVlX21hcHBpbmcsCisJCQkgICAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jKQogewogCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwpAQCAtNDc0LDcgKzQ4NCw3IEBACiAJaWYgKCFkc3QgJiYgKGRzdCA9IGluZXQ2X2Nza19yb3V0ZV9yZXEoc2ssIGZsNiwgcmVxKSkgPT0gTlVMTCkKIAkJZ290byBkb25lOwogCi0Jc2tiID0gdGNwX21ha2Vfc3luYWNrKHNrLCBkc3QsIHJlcSwgTlVMTCk7CisJc2tiID0gdGNwX21ha2Vfc3luYWNrKHNrLCBkc3QsIHJlcSwgZm9jKTsKIAogCWlmIChza2IpIHsKIAkJX190Y3BfdjZfc2VuZF9jaGVjayhza2IsICZpcmVxLT5pcl92Nl9sb2NfYWRkciwKQEAgLTQ5OCw3ICs1MDgsNyBAQAogCXN0cnVjdCBmbG93aTYgZmw2OwogCWludCByZXM7CiAKLQlyZXMgPSB0Y3BfdjZfc2VuZF9zeW5hY2soc2ssIE5VTEwsICZmbDYsIHJlcSwgMCk7CisJcmVzID0gdGNwX3Y2X3NlbmRfc3luYWNrKHNrLCBOVUxMLCAmZmw2LCByZXEsIDAsIE5VTEwpOwogCWlmICghcmVzKSB7CiAJCVRDUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBUQ1BfTUlCX1JFVFJBTlNTRUdTKTsKIAkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BTWU5SRVRSQU5TKTsKQEAgLTgwMiw2ICs4MTIsNyBAQAogCQlmbDYuZmxvd2k2X29pZiA9IGluZXQ2X2lpZihza2IpOwogCWVsc2UKIAkJZmw2LmZsb3dpNl9vaWYgPSBvaWY7CisJZmw2LmZsb3dpNl9tYXJrID0gSVA2X1JFUExZX01BUksobmV0LCBza2ItPm1hcmspOwogCWZsNi5mbDZfZHBvcnQgPSB0MS0+ZGVzdDsKIAlmbDYuZmw2X3Nwb3J0ID0gdDEtPnNvdXJjZTsKIAlzZWN1cml0eV9za2JfY2xhc3NpZnlfZmxvdyhza2IsIGZsb3dpNl90b19mbG93aSgmZmw2KSk7CkBAIC05MTcsNyArOTI4LDEyIEBACiBzdGF0aWMgdm9pZCB0Y3BfdjZfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewotCXRjcF92Nl9zZW5kX2Fjayhza2IsIHRjcF9yc2socmVxKS0+c250X2lzbiArIDEsIHRjcF9yc2socmVxKS0+cmN2X2lzbiArIDEsCisJLyogc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4gLT4gZm9yIHJlZ3VsYXIgVENQX1NZTl9SRUNWCisJICogc2stPnNrX3N0YXRlID09IFRDUF9TWU5fUkVDViAtPiBmb3IgRmFzdCBPcGVuLgorCSAqLworCXRjcF92Nl9zZW5kX2Fjayhza2IsIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgPworCQkJdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSA6IHRjcF9zayhzayktPnNuZF9ueHQsCisJCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsCiAJCQlyZXEtPnJjdl93bmQsIHRjcF90aW1lX3N0YW1wLCByZXEtPnRzX3JlY2VudCwgc2stPnNrX2JvdW5kX2Rldl9pZiwKIAkJCXRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpLAogCQkJMCwgMCk7CkBAIC05NjksOCArOTg1LDEwIEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJX191MzIgaXNuID0gVENQX1NLQl9DQihza2IpLT53aGVuOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CisJc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgZm9jID0geyAubGVuID0gLTEgfTsKKwlib29sIHdhbnRfY29va2llID0gZmFsc2UsIGZhc3RvcGVuOwogCXN0cnVjdCBmbG93aTYgZmw2OwotCWJvb2wgd2FudF9jb29raWUgPSBmYWxzZTsKKwlpbnQgZXJyOwogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQogCQlyZXR1cm4gdGNwX3Y0X2Nvbm5fcmVxdWVzdChzaywgc2tiKTsKQEAgLTEwMDEsNyArMTAxOSw3IEBACiAJdGNwX2NsZWFyX29wdGlvbnMoJnRtcF9vcHQpOwogCXRtcF9vcHQubXNzX2NsYW1wID0gSVBWNl9NSU5fTVRVIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAl0bXBfb3B0LnVzZXJfbXNzID0gdHAtPnJ4X29wdC51c2VyX21zczsKLQl0Y3BfcGFyc2Vfb3B0aW9ucyhza2IsICZ0bXBfb3B0LCAwLCBOVUxMKTsKKwl0Y3BfcGFyc2Vfb3B0aW9ucyhza2IsICZ0bXBfb3B0LCAwLCB3YW50X2Nvb2tpZSA/IE5VTEwgOiAmZm9jKTsKIAogCWlmICh3YW50X2Nvb2tpZSAmJiAhdG1wX29wdC5zYXdfdHN0YW1wKQogCQl0Y3BfY2xlYXJfb3B0aW9ucygmdG1wX29wdCk7CkBAIC0xMDE2LDYgKzEwMzQsNyBAQAogCQlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLCBzb2NrX25ldChzaykpOwogCiAJaXJlcS0+aXJfaWlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlpcmVxLT5pcl9tYXJrID0gaW5ldF9yZXF1ZXN0X21hcmsoc2ssIHNrYik7CiAKIAkvKiBTbyB0aGF0IGxpbmsgbG9jYWxzIGhhdmUgbWVhbmluZyAqLwogCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZiAmJgpAQCAtMTA3NCwxOSArMTA5MywyNyBAQAogCQlpc24gPSB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShza2IpOwogCX0KIGhhdmVfaXNuOgotCXRjcF9yc2socmVxKS0+c250X2lzbiA9IGlzbjsKIAogCWlmIChzZWN1cml0eV9pbmV0X2Nvbm5fcmVxdWVzdChzaywgc2tiLCByZXEpKQogCQlnb3RvIGRyb3BfYW5kX3JlbGVhc2U7CiAKLQlpZiAodGNwX3Y2X3NlbmRfc3luYWNrKHNrLCBkc3QsICZmbDYsIHJlcSwKLQkJCSAgICAgICBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSkgfHwKLQkgICAgd2FudF9jb29raWUpCisJaWYgKCFkc3QgJiYgKGRzdCA9IGluZXQ2X2Nza19yb3V0ZV9yZXEoc2ssICZmbDYsIHJlcSkpID09IE5VTEwpCiAJCWdvdG8gZHJvcF9hbmRfZnJlZTsKIAorCXRjcF9yc2socmVxKS0+c250X2lzbiA9IGlzbjsKIAl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSB0Y3BfdGltZV9zdGFtcDsKLQl0Y3BfcnNrKHJlcSktPmxpc3RlbmVyID0gTlVMTDsKLQlpbmV0Nl9jc2tfcmVxc2tfcXVldWVfaGFzaF9hZGQoc2ssIHJlcSwgVENQX1RJTUVPVVRfSU5JVCk7CisJdGNwX29wZW5yZXFfaW5pdF9yd2luKHJlcSwgc2ssIGRzdCk7CisJZmFzdG9wZW4gPSAhd2FudF9jb29raWUgJiYKKwkJICAgdGNwX3RyeV9mYXN0b3Blbihzaywgc2tiLCByZXEsICZmb2MsIGRzdCk7CisJZXJyID0gdGNwX3Y2X3NlbmRfc3luYWNrKHNrLCBkc3QsICZmbDYsIHJlcSwKKwkJCQkgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYiksICZmb2MpOworCWlmICghZmFzdG9wZW4pIHsKKwkJaWYgKGVyciB8fCB3YW50X2Nvb2tpZSkKKwkJCWdvdG8gZHJvcF9hbmRfZnJlZTsKKworCQl0Y3BfcnNrKHJlcSktPmxpc3RlbmVyID0gTlVMTDsKKwkJaW5ldDZfY3NrX3JlcXNrX3F1ZXVlX2hhc2hfYWRkKHNrLCByZXEsIFRDUF9USU1FT1VUX0lOSVQpOworCX0KIAlyZXR1cm4gMDsKIAogZHJvcF9hbmRfcmVsZWFzZToKQEAgLTEyOTQsMjUgKzEzMjEsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgX19zdW0xNiB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlpZiAoIXRjcF92Nl9jaGVjayhza2ItPmxlbiwgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkJCSAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBza2ItPmNzdW0pKSB7Ci0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQodGNwX3Y2X2NoZWNrKHNrYi0+bGVuLAotCQkJCQkgICAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMCkpOwotCi0JaWYgKHNrYi0+bGVuIDw9IDc2KQotCQlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLQlyZXR1cm4gMDsKLX0KLQogLyogVGhlIHNvY2tldCBtdXN0IGhhdmUgaXQncyBzcGlubG9jayBoZWxkIHdoZW4gd2UgZ2V0CiAgKiBoZXJlLgogICoKQEAgLTE0ODYsNyArMTQ5NCw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgdGgtPmRvZmYqNCkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiB0Y3BfdjZfY2hlY2tzdW1faW5pdChza2IpKQorCWlmIChza2JfY2hlY2tzdW1faW5pdChza2IsIElQUFJPVE9fVENQLCBpcDZfY29tcHV0ZV9wc2V1ZG8pKQogCQlnb3RvIGNzdW1fZXJyb3I7CiAKIAl0aCA9IHRjcF9oZHIoc2tiKTsKQEAgLTE3NzksNiArMTc4Nyw3IEBACiAJY29uc3Qgc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc3ApOwogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc3ApOwogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNwKTsKKwlzdHJ1Y3QgZmFzdG9wZW5fcXVldWUgKmZhc3RvcGVucSA9IGljc2stPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucTsKIAogCWRlc3QgID0gJnNwLT5za192Nl9kYWRkcjsKIAlzcmMgICA9ICZzcC0+c2tfdjZfcmN2X3NhZGRyOwpAQCAtMTgyMSw3ICsxODMwLDkgQEAKIAkJICAgamlmZmllc190b19jbG9ja190KGljc2stPmljc2tfYWNrLmF0byksCiAJCSAgIChpY3NrLT5pY3NrX2Fjay5xdWljayA8PCAxKSB8IGljc2stPmljc2tfYWNrLnBpbmdwb25nLAogCQkgICB0cC0+c25kX2N3bmQsCi0JCSAgIHRjcF9pbl9pbml0aWFsX3Nsb3dzdGFydCh0cCkgPyAtMSA6IHRwLT5zbmRfc3N0aHJlc2gKKwkJICAgc3AtPnNrX3N0YXRlID09IFRDUF9MSVNURU4gPworCQkJKGZhc3RvcGVucSA/IGZhc3RvcGVucS0+bWF4X3FsZW4gOiAwKSA6CisJCQkodGNwX2luX2luaXRpYWxfc2xvd3N0YXJ0KHRwKSA/IC0xIDogdHAtPnNuZF9zc3RocmVzaCkKIAkJICAgKTsKIH0KIApAQCAtMTk4MSw3ICsxOTkyLDYgQEAKIAkucHJvdG9jb2wJPQlJUFBST1RPX1RDUCwKIAkucHJvdAkJPQkmdGNwdjZfcHJvdCwKIAkub3BzCQk9CSZpbmV0Nl9zdHJlYW1fb3BzLAotCS5ub19jaGVjawk9CTAsCiAJLmZsYWdzCQk9CUlORVRfUFJPVE9TV19QRVJNQU5FTlQgfAogCQkJCUlORVRfUFJPVE9TV19JQ1NLLAogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggMWU1ODZkOS4uOTVjODM0NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTYzNCw2ICs2MzQsMTAgQEAKIAkJaWYgKHNrYi0+bGVuID4gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICYmIGVuY2FwX3JjdiAhPSBOVUxMKSB7CiAJCQlpbnQgcmV0OwogCisJCQkvKiBWZXJpZnkgY2hlY2tzdW0gYmVmb3JlIGdpdmluZyB0byBlbmNhcCAqLworCQkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkJCQlnb3RvIGNzdW1fZXJyb3I7CisKIAkJCXJldCA9IGVuY2FwX3Jjdihzaywgc2tiKTsKIAkJCWlmIChyZXQgPD0gMCkgewogCQkJCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLApAQCAtNzAxLDE3ICs3MDUsMTYgQEAKIAkJCQkgICAgICBpbnQgZGlmKQogewogCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpub2RlOwotCXN0cnVjdCBzb2NrICpzID0gc2s7CiAJdW5zaWduZWQgc2hvcnQgbnVtID0gbnRvaHMobG9jX3BvcnQpOwogCi0Jc2tfbnVsbHNfZm9yX2VhY2hfZnJvbShzLCBub2RlKSB7Ci0JCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHMpOworCXNrX251bGxzX2Zvcl9lYWNoX2Zyb20oc2ssIG5vZGUpIHsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCi0JCWlmICghbmV0X2VxKHNvY2tfbmV0KHMpLCBuZXQpKQorCQlpZiAoIW5ldF9lcShzb2NrX25ldChzayksIG5ldCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAodWRwX3NrKHMpLT51ZHBfcG9ydF9oYXNoID09IG51bSAmJgotCQkgICAgcy0+c2tfZmFtaWx5ID09IFBGX0lORVQ2KSB7CisJCWlmICh1ZHBfc2soc2spLT51ZHBfcG9ydF9oYXNoID09IG51bSAmJgorCQkgICAgc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUNikgewogCQkJaWYgKGluZXQtPmluZXRfZHBvcnQpIHsKIAkJCQlpZiAoaW5ldC0+aW5ldF9kcG9ydCAhPSBybXRfcG9ydCkKIAkJCQkJY29udGludWU7CkBAIC03MjAsMTYgKzcyMywxNiBAQAogCQkJICAgICFpcHY2X2FkZHJfZXF1YWwoJnNrLT5za192Nl9kYWRkciwgcm10X2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAocy0+c2tfYm91bmRfZGV2X2lmICYmIHMtPnNrX2JvdW5kX2Rldl9pZiAhPSBkaWYpCisJCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBzay0+c2tfYm91bmRfZGV2X2lmICE9IGRpZikKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKCFpcHY2X2FkZHJfYW55KCZzay0+c2tfdjZfcmN2X3NhZGRyKSkgewogCQkJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZzay0+c2tfdjZfcmN2X3NhZGRyLCBsb2NfYWRkcikpCiAJCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQorCQkJaWYgKCFpbmV0Nl9tY19jaGVjayhzaywgbG9jX2FkZHIsIHJtdF9hZGRyKSkKIAkJCQljb250aW51ZTsKLQkJCXJldHVybiBzOworCQkJcmV0dXJuIHNrOwogCQl9CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNzYwLDYgKzc2MywxNyBAQAogCWlmICh1bmxpa2VseShza2IxKSkKIAkJa2ZyZWVfc2tiKHNrYjEpOwogfQorCitzdGF0aWMgdm9pZCB1ZHA2X2NzdW1femVyb19lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFJGQyAyNDYwIHNlY3Rpb24gOC4xIHNheXMgdGhhdCB3ZSBTSE9VTEQgbG9nCisJICogdGhpcyBlcnJvci4gV2VsbCwgaXQgaXMgcmVhc29uYWJsZS4KKwkgKi8KKwlMSU1JVF9ORVRERUJVRyhLRVJOX0lORk8gIklQdjY6IHVkcCBjaGVja3N1bSBpcyAwIGZvciBbJXBJNmNdOiV1LT5bJXBJNmNdOiV1XG4iLAorCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLCBudG9ocyh1ZHBfaGRyKHNrYiktPnNvdXJjZSksCisJCSAgICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIG50b2hzKHVkcF9oZHIoc2tiKS0+ZGVzdCkpOworfQorCiAvKgogICogTm90ZTogY2FsbGVkIG9ubHkgZnJvbSB0aGUgQkggaGFuZGxlciBjb250ZXh0LAogICogc28gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBoYXNoZXMuCkBAIC03NzksNyArNzkzLDEyIEBACiAJZGlmID0gaW5ldDZfaWlmKHNrYik7CiAJc2sgPSB1ZHBfdjZfbWNhc3RfbmV4dChuZXQsIHNrLCB1aC0+ZGVzdCwgZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwogCXdoaWxlIChzaykgewotCQlzdGFja1tjb3VudCsrXSA9IHNrOworCQkvKiBJZiB6ZXJvIGNoZWNrc3VtIGFuZCBub19jaGVjayBpcyBub3Qgb24gZm9yCisJCSAqIHRoZSBzb2NrZXQgdGhlbiBza2lwIGl0LgorCQkgKi8KKwkJaWYgKHVoLT5jaGVjayB8fCB1ZHBfc2soc2spLT5ub19jaGVjazZfcngpCisJCQlzdGFja1tjb3VudCsrXSA9IHNrOworCiAJCXNrID0gdWRwX3Y2X21jYXN0X25leHQobmV0LCBza19udWxsc19uZXh0KHNrKSwgdWgtPmRlc3QsIGRhZGRyLAogCQkJCSAgICAgICB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKIAkJaWYgKHVubGlrZWx5KGNvdW50ID09IEFSUkFZX1NJWkUoc3RhY2spKSkgewpAQCAtODY3LDYgKzg4NiwxMiBAQAogCWlmIChzayAhPSBOVUxMKSB7CiAJCWludCByZXQ7CiAKKwkJaWYgKCF1aC0+Y2hlY2sgJiYgIXVkcF9zayhzayktPm5vX2NoZWNrNl9yeCkgeworCQkJc29ja19wdXQoc2spOworCQkJdWRwNl9jc3VtX3plcm9fZXJyb3Ioc2tiKTsKKwkJCWdvdG8gY3N1bV9lcnJvcjsKKwkJfQorCiAJCXJldCA9IHVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJCXNvY2tfcHV0KHNrKTsKIApAQCAtODc5LDYgKzkwNCwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoIXVoLT5jaGVjaykgeworCQl1ZHA2X2NzdW1femVyb19lcnJvcihza2IpOworCQlnb3RvIGNzdW1fZXJyb3I7CisJfQorCiAJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCiAJCWdvdG8gZGlzY2FyZDsKIApAQCAtMTAwNiw3ICsxMDM2LDEwIEBACiAKIAlpZiAoaXNfdWRwbGl0ZSkKIAkJY3N1bSA9IHVkcGxpdGVfY3N1bV9vdXRnb2luZyhzaywgc2tiKTsKLQllbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7IC8qIFVEUCBoYXJkd2FyZSBjc3VtICovCisJZWxzZSBpZiAodXAtPm5vX2NoZWNrNl90eCkgeyAgIC8qIFVEUCBjc3VtIGRpc2FibGVkICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJZ290byBzZW5kOworCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeyAvKiBVRFAgaGFyZHdhcmUgY3N1bSAqLwogCQl1ZHA2X2h3Y3N1bV9vdXRnb2luZyhzaywgc2tiLCAmZmw2LT5zYWRkciwgJmZsNi0+ZGFkZHIsCiAJCQkJICAgICB1cC0+bGVuKTsKIAkJZ290byBzZW5kOwpAQCAtMTIzMiwxNCArMTI2NSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChobGltaXQgPCAwKSB7Ci0JCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbDYuZGFkZHIpKQotCQkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7Ci0JCWVsc2UKLQkJCWhsaW1pdCA9IG5wLT5ob3BfbGltaXQ7Ci0JCWlmIChobGltaXQgPCAwKQotCQkJaGxpbWl0ID0gaXA2X2RzdF9ob3BsaW1pdChkc3QpOwotCX0KKwlpZiAoaGxpbWl0IDwgMCkKKwkJaGxpbWl0ID0gaXA2X3NrX2RzdF9ob3BsaW1pdChucCwgJmZsNiwgZHN0KTsKIAogCWlmICh0Y2xhc3MgPCAwKQogCQl0Y2xhc3MgPSBucC0+dGNsYXNzOwpAQCAtMTQ3OSw3ICsxNTA2LDYgQEAKIAkucHJvdG9jb2wgPSAgSVBQUk9UT19VRFAsCiAJLnByb3QgPSAgICAgICZ1ZHB2Nl9wcm90LAogCS5vcHMgPSAgICAgICAmaW5ldDZfZGdyYW1fb3BzLAotCS5ub19jaGVjayA9ICBVRFBfQ1NVTV9ERUZBVUxULAogCS5mbGFncyA9ICAgICBJTkVUX1BST1RPU1dfUEVSTUFORU5ULAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwX29mZmxvYWQuYyBiL25ldC9pcHY2L3VkcF9vZmZsb2FkLmMKaW5kZXggYjI2MWVlOC4uMGFlM2Q5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwX29mZmxvYWQuYworKysgYi9uZXQvaXB2Ni91ZHBfb2ZmbG9hZC5jCkBAIC02Myw3ICs2Myw5IEBACiAJCWlmICh1bmxpa2VseSh0eXBlICYgfihTS0JfR1NPX1VEUCB8CiAJCQkJICAgICAgU0tCX0dTT19ET0RHWSB8CiAJCQkJICAgICAgU0tCX0dTT19VRFBfVFVOTkVMIHwKKwkJCQkgICAgICBTS0JfR1NPX1VEUF9UVU5ORUxfQ1NVTSB8CiAJCQkJICAgICAgU0tCX0dTT19HUkUgfAorCQkJCSAgICAgIFNLQl9HU09fR1JFX0NTVU0gfAogCQkJCSAgICAgIFNLQl9HU09fSVBJUCB8CiAJCQkJICAgICAgU0tCX0dTT19TSVQgfAogCQkJCSAgICAgIFNLQl9HU09fTVBMUykgfHwKQEAgLTc2LDcgKzc4LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHNrYi0+ZW5jYXBzdWxhdGlvbiAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19VRFBfVFVOTkVMKQorCWlmIChza2ItPmVuY2Fwc3VsYXRpb24gJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmCisJICAgIChTS0JfR1NPX1VEUF9UVU5ORUx8U0tCX0dTT19VRFBfVFVOTkVMX0NTVU0pKQogCQlzZWdzID0gc2tiX3VkcF90dW5uZWxfc2VnbWVudChza2IsIGZlYXR1cmVzKTsKIAllbHNlIHsKIAkJLyogRG8gc29mdHdhcmUgVUZPLiBDb21wbGV0ZSBhbmQgZmlsbCBpbiB0aGUgVURQIGNoZWNrc3VtIGFzIEhXIGNhbm5vdApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCmluZGV4IGRmY2M0YmUuLjljZjA5N2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcGxpdGUuYworKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTY0LDcgKzY0LDYgQEAKIAkucHJvdG9jb2wJPSBJUFBST1RPX1VEUExJVEUsCiAJLnByb3QJCT0gJnVkcGxpdGV2Nl9wcm90LAogCS5vcHMJCT0gJmluZXQ2X2RncmFtX29wcywKLQkubm9fY2hlY2sJPSAwLAogCS5mbGFncwkJPSBJTkVUX1BST1RPU1dfUEVSTUFORU5ULAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwppbmRleCBiOTMwZDA4Li40MzM2NzJkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwpAQCAtNzgsNyArNzgsNyBAQAogCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCiAJCW10dSA9IElQVjZfTUlOX01UVTsKIAotCWlmICghc2tiLT5sb2NhbF9kZiAmJiBza2ItPmxlbiA+IG10dSkgeworCWlmICghc2tiLT5pZ25vcmVfZGYgJiYgc2tiLT5sZW4gPiBtdHUpIHsKIAkJc2tiLT5kZXYgPSBkc3QtPmRldjsKIAogCQlpZiAoeGZybTZfbG9jYWxfZG9udGZyYWcoc2tiKSkKQEAgLTExNCw3ICsxMTQsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAKIAlyZXR1cm4geC0+b3V0ZXJfbW9kZS0+b3V0cHV0Mih4LCBza2IpOwogfQpAQCAtMTUzLDcgKzE1Myw3IEBACiAJaWYgKHNrYi0+bGVuID4gbXR1ICYmIHhmcm02X2xvY2FsX2RvbnRmcmFnKHNrYikpIHsKIAkJeGZybTZfbG9jYWxfcnhwbXR1KHNrYiwgbXR1KTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQl9IGVsc2UgaWYgKCFza2ItPmxvY2FsX2RmICYmIHNrYi0+bGVuID4gbXR1ICYmIHNrYi0+c2spIHsKKwl9IGVsc2UgaWYgKCFza2ItPmlnbm9yZV9kZiAmJiBza2ItPmxlbiA+IG10dSAmJiBza2ItPnNrKSB7CiAJCXhmcm1fbG9jYWxfZXJyb3Ioc2tiLCBtdHUpOwogCQlyZXR1cm4gLUVNU0dTSVpFOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHgvYWZfaXB4LmMgYi9uZXQvaXB4L2FmX2lweC5jCmluZGV4IDQxZTRlOTMuLjkxNzI5YjggMTAwNjQ0Ci0tLSBhL25ldC9pcHgvYWZfaXB4LmMKKysrIGIvbmV0L2lweC9hZl9pcHguYwpAQCAtMTM1Myw3ICsxMzUzLDcgQEAKIAogCXNrX3JlZmNudF9kZWJ1Z19pbmMoc2spOwogCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKLQlzay0+c2tfbm9fY2hlY2sgPSAxOwkJLyogQ2hlY2tzdW0gb2ZmIGJ5IGRlZmF1bHQgKi8KKwlzay0+c2tfbm9fY2hlY2tfdHggPSAxOwkJLyogQ2hlY2tzdW0gb2ZmIGJ5IGRlZmF1bHQgKi8KIAlzb2NrLT5vcHMgPSAmaXB4X2RncmFtX29wczsKIAlyYyA9IDA7CiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvaXB4L2lweF9yb3V0ZS5jIGIvbmV0L2lweC9pcHhfcm91dGUuYwppbmRleCBjMWYwMzE4Li42N2U3YWQzIDEwMDY0NAotLS0gYS9uZXQvaXB4L2lweF9yb3V0ZS5jCisrKyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKQEAgLTIzNiw3ICsyMzYsOCBAQAogCX0KIAogCS8qIEFwcGx5IGNoZWNrc3VtLiBOb3QgYWxsb3dlZCBvbiA4MDIuMyBsaW5rcy4gKi8KLQlpZiAoc2stPnNrX25vX2NoZWNrIHx8IGludHJmYy0+aWZfZGxpbmtfdHlwZSA9PSBodG9ucyhJUFhfRlJBTUVfODAyMykpCisJaWYgKHNrLT5za19ub19jaGVja190eCB8fAorCSAgICBpbnRyZmMtPmlmX2RsaW5rX3R5cGUgPT0gaHRvbnMoSVBYX0ZSQU1FXzgwMjMpKQogCQlpcHgtPmlweF9jaGVja3N1bSA9IGh0b25zKDB4RkZGRik7CiAJZWxzZQogCQlpcHgtPmlweF9jaGVja3N1bSA9IGlweF9ja3N1bShpcHgsIGxlbiArIHNpemVvZihzdHJ1Y3QgaXB4aGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggOGM5ZDczMC4uN2E5NWZhNCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtNjgyLDYgKzY4MiwxOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBfX2l1Y3ZfYXV0b19uYW1lKHN0cnVjdCBpdWN2X3NvY2sgKml1Y3YpCit7CisJY2hhciBuYW1lWzEyXTsKKworCXNwcmludGYobmFtZSwgIiUwOHgiLCBhdG9taWNfaW5jX3JldHVybigmaXVjdl9za19saXN0LmF1dG9iaW5kX25hbWUpKTsKKwl3aGlsZSAoX19pdWN2X2dldF9zb2NrX2J5X25hbWUobmFtZSkpIHsKKwkJc3ByaW50ZihuYW1lLCAiJTA4eCIsCisJCQlhdG9taWNfaW5jX3JldHVybigmaXVjdl9za19saXN0LmF1dG9iaW5kX25hbWUpKTsKKwl9CisJbWVtY3B5KGl1Y3YtPnNyY19uYW1lLCBuYW1lLCA4KTsKK30KKwogLyogQmluZCBhbiB1bmJvdW5kIHNvY2tldCAqLwogc3RhdGljIGludCBpdWN2X3NvY2tfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCiAJCQkgIGludCBhZGRyX2xlbikKQEAgLTcyNCw4ICs3MzYsMTIgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfbmV0ZGV2X3JjdSgmaW5pdF9uZXQsIGRldikgewogCQlpZiAoIW1lbWNtcChkZXYtPnBlcm1fYWRkciwgdWlkLCA4KSkgewotCQkJbWVtY3B5KGl1Y3YtPnNyY19uYW1lLCBzYS0+c2l1Y3ZfbmFtZSwgOCk7CiAJCQltZW1jcHkoaXVjdi0+c3JjX3VzZXJfaWQsIHNhLT5zaXVjdl91c2VyX2lkLCA4KTsKKwkJCS8qIENoZWNrIGZvciB1bml0aWFsaXplZCBzaXVjdl9uYW1lICovCisJCQlpZiAoc3RybmNtcChzYS0+c2l1Y3ZfbmFtZSwgIiAgICAgICAgIiwgOCkgPT0gMCkKKwkJCQlfX2l1Y3ZfYXV0b19uYW1lKGl1Y3YpOworCQkJZWxzZQorCQkJCW1lbWNweShpdWN2LT5zcmNfbmFtZSwgc2EtPnNpdWN2X25hbWUsIDgpOwogCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IGRldi0+aWZpbmRleDsKIAkJCWl1Y3YtPmhzX2RldiA9IGRldjsKIAkJCWRldl9ob2xkKGRldik7CkBAIC03NjMsNyArNzc5LDYgQEAKIHN0YXRpYyBpbnQgaXVjdl9zb2NrX2F1dG9iaW5kKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7Ci0JY2hhciBuYW1lWzEyXTsKIAlpbnQgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseSghcHJfaXVjdikpCkBAIC03NzIsMTcgKzc4Nyw5IEBACiAJbWVtY3B5KGl1Y3YtPnNyY191c2VyX2lkLCBpdWN2X3VzZXJpZCwgOCk7CiAKIAl3cml0ZV9sb2NrX2JoKCZpdWN2X3NrX2xpc3QubG9jayk7Ci0KLQlzcHJpbnRmKG5hbWUsICIlMDh4IiwgYXRvbWljX2luY19yZXR1cm4oJml1Y3Zfc2tfbGlzdC5hdXRvYmluZF9uYW1lKSk7Ci0Jd2hpbGUgKF9faXVjdl9nZXRfc29ja19ieV9uYW1lKG5hbWUpKSB7Ci0JCXNwcmludGYobmFtZSwgIiUwOHgiLAotCQkJYXRvbWljX2luY19yZXR1cm4oJml1Y3Zfc2tfbGlzdC5hdXRvYmluZF9uYW1lKSk7Ci0JfQotCisJX19pdWN2X2F1dG9fbmFtZShpdWN2KTsKIAl3cml0ZV91bmxvY2tfYmgoJml1Y3Zfc2tfbGlzdC5sb2NrKTsKIAotCW1lbWNweSgmaXVjdi0+c3JjX25hbWUsIG5hbWUsIDgpOwotCiAJaWYgKCFpdWN2LT5tc2dsaW1pdCkKIAkJaXVjdi0+bXNnbGltaXQgPSBJVUNWX1FVRVVFTEVOX0RFRkFVTFQ7CiAKQEAgLTE5MzYsMTEgKzE5NDMsMTAgQEAKIAkgICAgc2tfYWNjZXB0cV9pc19mdWxsKHNrKSB8fAogCSAgICAhbnNrKSB7CiAJCS8qIGVycm9yIG9uIHNlcnZlciBzb2NrZXQgLSBjb25uZWN0aW9uIHJlZnVzZWQgKi8KLQkJaWYgKG5zaykKLQkJCXNrX2ZyZWUobnNrKTsKIAkJYWZpdWN2X3N3YXBfc3JjX2Rlc3Qoc2tiKTsKIAkJdHJhbnNfaGRyLT5mbGFncyA9IEFGX0lVQ1ZfRkxBR19TWU4gfCBBRl9JVUNWX0ZMQUdfRklOOwogCQllcnIgPSBkZXZfcXVldWVfeG1pdChza2IpOworCQlpdWN2X3NvY2tfa2lsbChuc2spOwogCQliaF91bmxvY2tfc29jayhzayk7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IGYzYzgzMDcuLmJhMmEyZjkgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtMTQ3Niw5ICsxNDc2LDcgQEAKIAllbHNlCiAJCWVyciA9IHhmcm1fc3RhdGVfdXBkYXRlKHgpOwogCi0JeGZybV9hdWRpdF9zdGF0ZV9hZGQoeCwgZXJyID8gMCA6IDEsCi0JCQkgICAgIGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KSwKLQkJCSAgICAgYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KSwgMCk7CisJeGZybV9hdWRpdF9zdGF0ZV9hZGQoeCwgZXJyID8gMCA6IDEsIHRydWUpOwogCiAJaWYgKGVyciA8IDApIHsKIAkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CkBAIC0xNTMyLDkgKzE1MzAsNyBAQAogCWMuZXZlbnQgPSBYRlJNX01TR19ERUxTQTsKIAlrbV9zdGF0ZV9ub3RpZnkoeCwgJmMpOwogb3V0OgotCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIGVyciA/IDAgOiAxLAotCQkJCWF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KSwKLQkJCQlhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpLCAwKTsKKwl4ZnJtX2F1ZGl0X3N0YXRlX2RlbGV0ZSh4LCBlcnIgPyAwIDogMSwgdHJ1ZSk7CiAJeGZybV9zdGF0ZV9wdXQoeCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTcyNiwxNyArMTcyMiwxMyBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAl1bnNpZ25lZCBpbnQgcHJvdG87CiAJc3RydWN0IGttX2V2ZW50IGM7Ci0Jc3RydWN0IHhmcm1fYXVkaXQgYXVkaXRfaW5mbzsKIAlpbnQgZXJyLCBlcnIyOwogCiAJcHJvdG8gPSBwZmtleV9zYXR5cGUycHJvdG8oaGRyLT5zYWRiX21zZ19zYXR5cGUpOwogCWlmIChwcm90byA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWF1ZGl0X2luZm8ubG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2VjaWQgPSAwOwotCWVyciA9IHhmcm1fc3RhdGVfZmx1c2gobmV0LCBwcm90bywgJmF1ZGl0X2luZm8pOworCWVyciA9IHhmcm1fc3RhdGVfZmx1c2gobmV0LCBwcm90bywgdHJ1ZSk7CiAJZXJyMiA9IHVuaWNhc3RfZmx1c2hfcmVzcChzaywgaGRyKTsKIAlpZiAoZXJyIHx8IGVycjIpIHsKIAkJaWYgKGVyciA9PSAtRVNSQ0gpIC8qIGVtcHR5IHRhYmxlIC0gZ28gcXVpZXRseSAqLwpAQCAtMjI4OCw5ICsyMjgwLDcgQEAKIAllcnIgPSB4ZnJtX3BvbGljeV9pbnNlcnQocG9sLT5zYWRiX3hfcG9saWN5X2Rpci0xLCB4cCwKIAkJCQkgaGRyLT5zYWRiX21zZ190eXBlICE9IFNBREJfWF9TUERVUERBVEUpOwogCi0JeGZybV9hdWRpdF9wb2xpY3lfYWRkKHhwLCBlcnIgPyAwIDogMSwKLQkJCSAgICAgIGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KSwKLQkJCSAgICAgIGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCksIDApOworCXhmcm1fYXVkaXRfcG9saWN5X2FkZCh4cCwgZXJyID8gMCA6IDEsIHRydWUpOwogCiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yMzcyLDkgKzIzNjIsNyBAQAogCWlmICh4cCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZSh4cCwgZXJyID8gMCA6IDEsCi0JCQkJIGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KSwKLQkJCQkgYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KSwgMCk7CisJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHhwLCBlcnIgPyAwIDogMSwgdHJ1ZSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTI1NTMsNyArMjU0MSw3IEBACiAJCXNlbC5zcG9ydF9tYXNrID0gaHRvbnMoMHhmZmZmKTsKIAogCS8qIHNldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGluZm8gb2Ygc2VsZWN0b3IgKi8KLQlzYSA9IGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNUIC0gMV0sCisJc2EgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVCAtIDFdOwogCXBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc2EsICZzZWwuZGFkZHIpOwogCXNlbC5wcmVmaXhsZW5fZCA9IHNhLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuOwogCXNlbC5wcm90byA9IHBma2V5X3Byb3RvX3RvX3hmcm0oc2EtPnNhZGJfYWRkcmVzc19wcm90byk7CkBAIC0yNjIyLDkgKzI2MTAsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmIChkZWxldGUpIHsKLQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHhwLCBlcnIgPyAwIDogMSwKLQkJCQlhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCksCi0JCQkJYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KSwgMCk7CisJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZSh4cCwgZXJyID8gMCA6IDEsIHRydWUpOwogCiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTI3MzMsMTMgKzI3MTksOSBAQAogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAlzdHJ1Y3Qga21fZXZlbnQgYzsKLQlzdHJ1Y3QgeGZybV9hdWRpdCBhdWRpdF9pbmZvOwogCWludCBlcnIsIGVycjI7CiAKLQlhdWRpdF9pbmZvLmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlY2lkID0gMDsKLQllcnIgPSB4ZnJtX3BvbGljeV9mbHVzaChuZXQsIFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgJmF1ZGl0X2luZm8pOworCWVyciA9IHhmcm1fcG9saWN5X2ZsdXNoKG5ldCwgWEZSTV9QT0xJQ1lfVFlQRV9NQUlOLCB0cnVlKTsKIAllcnIyID0gdW5pY2FzdF9mbHVzaF9yZXNwKHNrLCBoZHIpOwogCWlmIChlcnIgfHwgZXJyMikgewogCQlpZiAoZXJyID09IC1FU1JDSCkgLyogZW1wdHkgdGFibGUgLSBvbGQgc2lsZW50IGJlaGF2aW9yICovCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYyBiL25ldC9sMnRwL2wydHBfY29yZS5jCmluZGV4IGE0ZTM3ZDcuLmJlYTI1OTAgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5jCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5jCkBAIC00OTUsNTIgKzQ5NSw2IEBACiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPnJlb3JkZXJfcS5sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbDJ0cF92ZXJpZnlfdWRwX2NoZWNrc3VtKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgdWRwaGRyICp1aCA9IHVkcF9oZHIoc2tiKTsKLQl1MTYgdWxlbiA9IG50b2hzKHVoLT5sZW4pOwotCV9fd3N1bSBwc3VtOwotCi0JaWYgKHNrLT5za19ub19jaGVjayB8fCBza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQotCQlyZXR1cm4gMDsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVDYgJiYgIWwydHBfdHVubmVsKHNrKS0+djRtYXBwZWQpIHsKLQkJaWYgKCF1aC0+Y2hlY2spIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiTDJUUDogSVB2NjogY2hlY2tzdW0gaXMgMFxuIik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSAmJgotCQkgICAgIWNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIHVsZW4sCi0JCQkJICAgICBJUFBST1RPX1VEUCwgc2tiLT5jc3VtKSkgewotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkJCQkJCSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkJCQkJIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwKLQkJCQkJCQkgMCkpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0OwotCQlpZiAoIXVoLT5jaGVjaykKLQkJCXJldHVybiAwOwotCQlpbmV0ID0gaW5ldF9zayhzayk7Ci0JCXBzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaW5ldC0+aW5ldF9zYWRkciwgaW5ldC0+aW5ldF9kYWRkciwKLQkJCQkJICB1bGVuLCBJUFBST1RPX1VEUCwgMCk7Ci0KLQkJaWYgKChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgJiYKLQkJICAgICFjc3VtX2ZvbGQoY3N1bV9hZGQocHN1bSwgc2tiLT5jc3VtKSkpCi0JCQlyZXR1cm4gMDsKLQkJc2tiLT5jc3VtID0gcHN1bTsKLQl9Ci0KLQlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLX0KLQogc3RhdGljIGludCBsMnRwX3NlcV9jaGVja19yeF93aW5kb3coc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbiwgdTMyIG5yKQogewogCXUzMiBud3M7CkBAIC04OTUsOCArODQ5LDcgQEAKIAl1MTYgdmVyc2lvbjsKIAlpbnQgbGVuZ3RoOwogCi0JaWYgKHR1bm5lbC0+c29jayAmJiBsMnRwX3ZlcmlmeV91ZHBfY2hlY2tzdW0odHVubmVsLT5zb2NrLCBza2IpKQotCQlnb3RvIGRpc2NhcmRfYmFkX2NzdW07CisJLyogVURQIGhhcyB2ZXJpZmVkIGNoZWNrc3VtICovCiAKIAkvKiBVRFAgYWx3YXlzIHZlcmlmaWVzIHRoZSBwYWNrZXQgbGVuZ3RoLiAqLwogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwpAQCAtOTc5LDE0ICs5MzIsNiBAQAogCiAJcmV0dXJuIDA7CiAKLWRpc2NhcmRfYmFkX2NzdW06Ci0JTElNSVRfTkVUREVCVUcoIiVzOiBVRFA6IGJhZCBjaGVja3N1bVxuIiwgdHVubmVsLT5uYW1lKTsKLQlVRFBfSU5DX1NUQVRTX1VTRVIodHVubmVsLT5sMnRwX25ldCwgVURQX01JQl9JTkVSUk9SUywgMCk7Ci0JYXRvbWljX2xvbmdfaW5jKCZ0dW5uZWwtPnN0YXRzLnJ4X2Vycm9ycyk7Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLQogZXJyb3I6CiAJLyogUHV0IFVEUCBoZWFkZXIgYmFjayAqLwogCV9fc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwpAQCAtMTEyOCw3ICsxMDczLDcgQEAKIAl9CiAKIAkvKiBRdWV1ZSB0aGUgcGFja2V0IHRvIElQIGZvciBvdXRwdXQgKi8KLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAodHVubmVsLT5zb2NrLT5za19mYW1pbHkgPT0gUEZfSU5FVDYgJiYgIXR1bm5lbC0+djRtYXBwZWQpCiAJCWVycm9yID0gaW5ldDZfY3NrX3htaXQodHVubmVsLT5zb2NrLCBza2IsIE5VTEwpOwpAQCAtMTE1MCwzMSArMTA5NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotc3RhdGljIHZvaWQgbDJ0cF94bWl0X2lwdjZfY3N1bShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJaW50IHVkcF9sZW4pCi17Ci0Jc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCB1ZHBoZHIgKnVoID0gdWRwX2hkcihza2IpOwotCi0JaWYgKCFza2JfZHN0KHNrYikgfHwgIXNrYl9kc3Qoc2tiKS0+ZGV2IHx8Ci0JICAgICEoc2tiX2RzdChza2IpLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUFY2X0NTVU0pKSB7Ci0JCV9fd3N1bSBjc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgMCwgdWRwX2xlbiwgMCk7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCXVoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmbnAtPnNhZGRyLCAmc2stPnNrX3Y2X2RhZGRyLCB1ZHBfbGVuLAotCQkJCQkgICAgSVBQUk9UT19VRFAsIGNzdW0pOwotCQlpZiAodWgtPmNoZWNrID09IDApCi0JCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKLQl9IGVsc2UgewotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7Ci0JCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7Ci0JCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdWRwaGRyLCBjaGVjayk7Ci0JCXVoLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJm5wLT5zYWRkciwgJnNrLT5za192Nl9kYWRkciwKLQkJCQkJICAgICB1ZHBfbGVuLCBJUFBST1RPX1VEUCwgMCk7Ci0JfQotfQotI2VuZGlmCi0KIC8qIElmIGNhbGxlciByZXF1aXJlcyB0aGUgc2tiIHRvIGhhdmUgYSBwcHAgaGVhZGVyLCB0aGUgaGVhZGVyIG11c3QgYmUKICAqIGluc2VydGVkIGluIHRoZSBza2IgZGF0YSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCkBAIC0xMTg2LDcgKzExMDYsNiBAQAogCXN0cnVjdCBmbG93aSAqZmw7CiAJc3RydWN0IHVkcGhkciAqdWg7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKLQlfX3dzdW0gY3N1bTsKIAlpbnQgaGVhZHJvb207CiAJaW50IHVobGVuID0gKHR1bm5lbC0+ZW5jYXAgPT0gTDJUUF9FTkNBUFRZUEVfVURQKSA/IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSA6IDA7CiAJaW50IHVkcF9sZW47CkBAIC0xMjM1LDMzICsxMTU0LDE3IEBACiAJCXVoLT5kZXN0ID0gaW5ldC0+aW5ldF9kcG9ydDsKIAkJdWRwX2xlbiA9IHVobGVuICsgaGRyX2xlbiArIGRhdGFfbGVuOwogCQl1aC0+bGVuID0gaHRvbnModWRwX2xlbik7Ci0JCXVoLT5jaGVjayA9IDA7CiAKIAkJLyogQ2FsY3VsYXRlIFVEUCBjaGVja3N1bSBpZiBjb25maWd1cmVkIHRvIGRvIHNvICovCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVDYgJiYgIXR1bm5lbC0+djRtYXBwZWQpCi0JCQlsMnRwX3htaXRfaXB2Nl9jc3VtKHNrLCBza2IsIHVkcF9sZW4pOworCQkJdWRwNl9zZXRfY3N1bSh1ZHBfZ2V0X25vX2NoZWNrNl90eChzayksCisJCQkJICAgICAgc2tiLCAmaW5ldDZfc2soc2spLT5zYWRkciwKKwkJCQkgICAgICAmc2stPnNrX3Y2X2RhZGRyLCB1ZHBfbGVuKTsKIAkJZWxzZQogI2VuZGlmCi0JCWlmIChzay0+c2tfbm9fY2hlY2sgPT0gVURQX0NTVU1fTk9YTUlUKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCQllbHNlIGlmICgoc2tiX2RzdChza2IpICYmIHNrYl9kc3Qoc2tiKS0+ZGV2KSAmJgotCQkJICghKHNrYl9kc3Qoc2tiKS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSkpKSB7Ci0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwotCQkJY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIDAsIHVkcF9sZW4sIDApOwotCQkJdWgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoaW5ldC0+aW5ldF9zYWRkciwKLQkJCQkJCSAgICAgIGluZXQtPmluZXRfZGFkZHIsCi0JCQkJCQkgICAgICB1ZHBfbGVuLCBJUFBST1RPX1VEUCwgY3N1bSk7Ci0JCQlpZiAodWgtPmNoZWNrID09IDApCi0JCQkJdWgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7Ci0JCX0gZWxzZSB7Ci0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7Ci0JCQlza2ItPmNzdW1fc3RhcnQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5oZWFkOwotCQkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKLQkJCXVoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpbmV0LT5pbmV0X3NhZGRyLAotCQkJCQkJICAgICAgIGluZXQtPmluZXRfZGFkZHIsCi0JCQkJCQkgICAgICAgdWRwX2xlbiwgSVBQUk9UT19VRFAsIDApOwotCQl9CisJCXVkcF9zZXRfY3N1bShzay0+c2tfbm9fY2hlY2tfdHgsIHNrYiwgaW5ldC0+aW5ldF9zYWRkciwKKwkJCSAgICAgaW5ldC0+aW5ldF9kYWRkciwgdWRwX2xlbik7CiAJCWJyZWFrOwogCiAJY2FzZSBMMlRQX0VOQ0FQVFlQRV9JUDoKQEAgLTE0OTAsNiArMTM5MywxMSBAQAogCQkJCQkgICAgIHNpemVvZih1ZHA2X2FkZHIpLCAwKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWdvdG8gb3V0OworCisJCQlpZiAoY2ZnLT51ZHA2X3plcm9fdHhfY2hlY2tzdW1zKQorCQkJCXVkcF9zZXRfbm9fY2hlY2s2X3R4KHNvY2stPnNrLCB0cnVlKTsKKwkJCWlmIChjZmctPnVkcDZfemVyb19yeF9jaGVja3N1bXMpCisJCQkJdWRwX3NldF9ub19jaGVjazZfcngoc29jay0+c2ssIHRydWUpOwogCQl9IGVsc2UKICNlbmRpZgogCQl7CkBAIC0xNTE4LDcgKzE0MjYsNyBAQAogCQl9CiAKIAkJaWYgKCFjZmctPnVzZV91ZHBfY2hlY2tzdW1zKQotCQkJc29jay0+c2stPnNrX25vX2NoZWNrID0gVURQX0NTVU1fTk9YTUlUOworCQkJc29jay0+c2stPnNrX25vX2NoZWNrX3R4ID0gMTsKIAogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9jb3JlLmggYi9uZXQvbDJ0cC9sMnRwX2NvcmUuaAppbmRleCAzZjkzY2NkLi42OGFhOWZmIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2NvcmUuaAorKysgYi9uZXQvbDJ0cC9sMnRwX2NvcmUuaApAQCAtMTYyLDcgKzE2Miw5IEBACiAjZW5kaWYKIAl1MTYJCQlsb2NhbF91ZHBfcG9ydDsKIAl1MTYJCQlwZWVyX3VkcF9wb3J0OwotCXVuc2lnbmVkIGludAkJdXNlX3VkcF9jaGVja3N1bXM6MTsKKwl1bnNpZ25lZCBpbnQJCXVzZV91ZHBfY2hlY2tzdW1zOjEsCisJCQkJdWRwNl96ZXJvX3R4X2NoZWNrc3VtczoxLAorCQkJCXVkcDZfemVyb19yeF9jaGVja3N1bXM6MTsKIH07CiAKIHN0cnVjdCBsMnRwX3R1bm5lbCB7CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2lwLmMgYi9uZXQvbDJ0cC9sMnRwX2lwLmMKaW5kZXggMzM5N2ZlNi4uMzY5YTk4MiAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9pcC5jCisrKyBiL25ldC9sMnRwL2wydHBfaXAuYwpAQCAtNjA2LDcgKzYwNiw2IEBACiAJLnByb3RvY29sCT0gSVBQUk9UT19MMlRQLAogCS5wcm90CQk9ICZsMnRwX2lwX3Byb3QsCiAJLm9wcwkJPSAmbDJ0cF9pcF9vcHMsCi0JLm5vX2NoZWNrCT0gMCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIGwydHBfaXBfcHJvdG9jb2wgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfaXA2LmMgYi9uZXQvbDJ0cC9sMnRwX2lwNi5jCmluZGV4IDc3MDRlYTkuLmYzZjk4YTEgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfaXA2LmMKKysrIGIvbmV0L2wydHAvbDJ0cF9pcDYuYwpAQCAtNjA1LDE0ICs2MDUsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoaGxpbWl0IDwgMCkgewotCQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKLQkJCWhsaW1pdCA9IG5wLT5tY2FzdF9ob3BzOwotCQllbHNlCi0JCQlobGltaXQgPSBucC0+aG9wX2xpbWl0OwotCQlpZiAoaGxpbWl0IDwgMCkKLQkJCWhsaW1pdCA9IGlwNl9kc3RfaG9wbGltaXQoZHN0KTsKLQl9CisJaWYgKGhsaW1pdCA8IDApCisJCWhsaW1pdCA9IGlwNl9za19kc3RfaG9wbGltaXQobnAsICZmbDYsIGRzdCk7CiAKIAlpZiAodGNsYXNzIDwgMCkKIAkJdGNsYXNzID0gbnAtPnRjbGFzczsKQEAgLTc2MSw3ICs3NTUsNiBAQAogCS5wcm90b2NvbAk9IElQUFJPVE9fTDJUUCwKIAkucHJvdAkJPSAmbDJ0cF9pcDZfcHJvdCwKIAkub3BzCQk9ICZsMnRwX2lwNl9vcHMsCi0JLm5vX2NoZWNrCT0gMCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgbDJ0cF9pcDZfcHJvdG9jb2wgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfbmV0bGluay5jIGIvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKaW5kZXggYmQ3Mzg3YS4uMGFjOTA3YSAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKQEAgLTE2MSw2ICsxNjEsMTMgQEAKIAkJCWNmZy5wZWVyX3VkcF9wb3J0ID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTDJUUF9BVFRSX1VEUF9EUE9SVF0pOwogCQlpZiAoaW5mby0+YXR0cnNbTDJUUF9BVFRSX1VEUF9DU1VNXSkKIAkJCWNmZy51c2VfdWRwX2NoZWNrc3VtcyA9IG5sYV9nZXRfZmxhZyhpbmZvLT5hdHRyc1tMMlRQX0FUVFJfVURQX0NTVU1dKTsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJCWlmIChpbmZvLT5hdHRyc1tMMlRQX0FUVFJfVURQX1pFUk9fQ1NVTTZfVFhdKQorCQkJY2ZnLnVkcDZfemVyb190eF9jaGVja3N1bXMgPSBubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTDJUUF9BVFRSX1VEUF9aRVJPX0NTVU02X1RYXSk7CisJCWlmIChpbmZvLT5hdHRyc1tMMlRQX0FUVFJfVURQX1pFUk9fQ1NVTTZfUlhdKQorCQkJY2ZnLnVkcDZfemVyb19yeF9jaGVja3N1bXMgPSBubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTDJUUF9BVFRSX1VEUF9aRVJPX0NTVU02X1JYXSk7CisjZW5kaWYKIAl9CiAKIAlpZiAoaW5mby0+YXR0cnNbTDJUUF9BVFRSX0RFQlVHXSkKQEAgLTI5Nyw4ICszMDQsNyBAQAogCWNhc2UgTDJUUF9FTkNBUFRZUEVfVURQOgogCQlpZiAobmxhX3B1dF91MTYoc2tiLCBMMlRQX0FUVFJfVURQX1NQT1JULCBudG9ocyhpbmV0LT5pbmV0X3Nwb3J0KSkgfHwKIAkJICAgIG5sYV9wdXRfdTE2KHNrYiwgTDJUUF9BVFRSX1VEUF9EUE9SVCwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCkpIHx8Ci0JCSAgICBubGFfcHV0X3U4KHNrYiwgTDJUUF9BVFRSX1VEUF9DU1VNLAotCQkJICAgICAgIChzay0+c2tfbm9fY2hlY2sgIT0gVURQX0NTVU1fTk9YTUlUKSkpCisJCSAgICBubGFfcHV0X3U4KHNrYiwgTDJUUF9BVFRSX1VEUF9DU1VNLCAhc2stPnNrX25vX2NoZWNrX3R4KSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkvKiBOT0JSRUFLICovCiAJY2FzZSBMMlRQX0VOQ0FQVFlQRV9JUDoKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9NYWtlZmlsZSBiL25ldC9tYWM4MDIxMS9NYWtlZmlsZQppbmRleCA5ZDdkODQwLi4xZTQ2ZmZhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvTWFrZWZpbGUKKysrIGIvbmV0L21hYzgwMjExL01ha2VmaWxlCkBAIC0yNSw3ICsyNSw4IEBACiAJd21lLm8gXAogCWV2ZW50Lm8gXAogCWNoYW4ubyBcCi0JdHJhY2UubyBtbG1lLm8KKwl0cmFjZS5vIG1sbWUubyBcCisJdGRscy5vCiAKIG1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0xFRFMpICs9IGxlZC5vCiBtYWM4MDIxMS0kKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSArPSBcCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWVzX2NjbS5jIGIvbmV0L21hYzgwMjExL2Flc19jY20uYwppbmRleCA3YzdkZjQ3Li5lYzI0Mzc4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWVzX2NjbS5jCisrKyBiL25ldC9tYWM4MDIxMS9hZXNfY2NtLmMKQEAgLTIzLDEyICsyMywxMyBAQAogCQkJICAgICAgIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptaWMpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IGFzc29jLCBwdCwgY3RbMl07Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGFlYWRfcmVxdWVzdAlyZXE7Ci0JCXU4CQkJcHJpdltjcnlwdG9fYWVhZF9yZXFzaXplKHRmbSldOwotCX0gYWVhZF9yZXE7CiAKLQltZW1zZXQoJmFlYWRfcmVxLCAwLCBzaXplb2YoYWVhZF9yZXEpKTsKKwljaGFyIGFlYWRfcmVxX2RhdGFbc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICsKKwkJCSAgIGNyeXB0b19hZWFkX3JlcXNpemUodGZtKV0KKwkJX19hbGlnbmVkKF9fYWxpZ25vZl9fKHN0cnVjdCBhZWFkX3JlcXVlc3QpKTsKKwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcSA9ICh2b2lkICopIGFlYWRfcmVxX2RhdGE7CisKKwltZW1zZXQoYWVhZF9yZXEsIDAsIHNpemVvZihhZWFkX3JlcV9kYXRhKSk7CiAKIAlzZ19pbml0X29uZSgmcHQsIGRhdGEsIGRhdGFfbGVuKTsKIAlzZ19pbml0X29uZSgmYXNzb2MsICZhYWRbMl0sIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopYWFkKSk7CkBAIC0zNiwyMyArMzcsMjMgQEAKIAlzZ19zZXRfYnVmKCZjdFswXSwgZGF0YSwgZGF0YV9sZW4pOwogCXNnX3NldF9idWYoJmN0WzFdLCBtaWMsIElFRUU4MDIxMV9DQ01QX01JQ19MRU4pOwogCi0JYWVhZF9yZXF1ZXN0X3NldF90Zm0oJmFlYWRfcmVxLnJlcSwgdGZtKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKCZhZWFkX3JlcS5yZXEsICZhc3NvYywgYXNzb2MubGVuZ3RoKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KCZhZWFkX3JlcS5yZXEsICZwdCwgY3QsIGRhdGFfbGVuLCBiXzApOworCWFlYWRfcmVxdWVzdF9zZXRfdGZtKGFlYWRfcmVxLCB0Zm0pOworCWFlYWRfcmVxdWVzdF9zZXRfYXNzb2MoYWVhZF9yZXEsICZhc3NvYywgYXNzb2MubGVuZ3RoKTsKKwlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGFlYWRfcmVxLCAmcHQsIGN0LCBkYXRhX2xlbiwgYl8wKTsKIAotCWNyeXB0b19hZWFkX2VuY3J5cHQoJmFlYWRfcmVxLnJlcSk7CisJY3J5cHRvX2FlYWRfZW5jcnlwdChhZWFkX3JlcSk7CiB9CiAKIGludCBpZWVlODAyMTFfYWVzX2NjbV9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtLCB1OCAqYl8wLCB1OCAqYWFkLAogCQkJICAgICAgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1pYykKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgYXNzb2MsIHB0LCBjdFsyXTsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0CXJlcTsKLQkJdTgJCQlwcml2W2NyeXB0b19hZWFkX3JlcXNpemUodGZtKV07Ci0JfSBhZWFkX3JlcTsKKwljaGFyIGFlYWRfcmVxX2RhdGFbc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICsKKwkJCSAgIGNyeXB0b19hZWFkX3JlcXNpemUodGZtKV0KKwkJX19hbGlnbmVkKF9fYWxpZ25vZl9fKHN0cnVjdCBhZWFkX3JlcXVlc3QpKTsKKwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcSA9ICh2b2lkICopIGFlYWRfcmVxX2RhdGE7CiAKLQltZW1zZXQoJmFlYWRfcmVxLCAwLCBzaXplb2YoYWVhZF9yZXEpKTsKKwltZW1zZXQoYWVhZF9yZXEsIDAsIHNpemVvZihhZWFkX3JlcV9kYXRhKSk7CiAKIAlzZ19pbml0X29uZSgmcHQsIGRhdGEsIGRhdGFfbGVuKTsKIAlzZ19pbml0X29uZSgmYXNzb2MsICZhYWRbMl0sIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopYWFkKSk7CkBAIC02MCwxMiArNjEsMTIgQEAKIAlzZ19zZXRfYnVmKCZjdFswXSwgZGF0YSwgZGF0YV9sZW4pOwogCXNnX3NldF9idWYoJmN0WzFdLCBtaWMsIElFRUU4MDIxMV9DQ01QX01JQ19MRU4pOwogCi0JYWVhZF9yZXF1ZXN0X3NldF90Zm0oJmFlYWRfcmVxLnJlcSwgdGZtKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKCZhZWFkX3JlcS5yZXEsICZhc3NvYywgYXNzb2MubGVuZ3RoKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KCZhZWFkX3JlcS5yZXEsIGN0LCAmcHQsCisJYWVhZF9yZXF1ZXN0X3NldF90Zm0oYWVhZF9yZXEsIHRmbSk7CisJYWVhZF9yZXF1ZXN0X3NldF9hc3NvYyhhZWFkX3JlcSwgJmFzc29jLCBhc3NvYy5sZW5ndGgpOworCWFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoYWVhZF9yZXEsIGN0LCAmcHQsCiAJCQkgICAgICAgZGF0YV9sZW4gKyBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOLCBiXzApOwogCi0JcmV0dXJuIGNyeXB0b19hZWFkX2RlY3J5cHQoJmFlYWRfcmVxLnJlcSk7CisJcmV0dXJuIGNyeXB0b19hZWFkX2RlY3J5cHQoYWVhZF9yZXEpOwogfQogCiBzdHJ1Y3QgY3J5cHRvX2FlYWQgKmllZWU4MDIxMV9hZXNfa2V5X3NldHVwX2VuY3J5cHQoY29uc3QgdTgga2V5W10pCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggYWFhNTlkNy4uZDc1MTNhNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NmZy5jCisrKyBiL25ldC9tYWM4MDIxMS9jZmcuYwpAQCAtMTA5LDYgKzEwOSwxNSBAQAogc3RhdGljIGludCBpZWVlODAyMTFfc3RhcnRfcDJwX2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+Y2hhbmN0eF9tdHgpOworCXJldCA9IGllZWU4MDIxMV9jaGVja19jb21iaW5hdGlvbnMoc2RhdGEsIE5VTEwsIDAsIDApOworCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5jaGFuY3R4X210eCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gaWVlZTgwMjExX2RvX29wZW4od2RldiwgdHJ1ZSk7CiB9CiAKQEAgLTQ2Myw4ICs0NzIsMTAgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZiA9IGxvY2FsLT5yYXRlX2N0cmw7CiAJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKIAl1NjQgcGFja2V0cyA9IDA7CisJdTMyIHRociA9IDA7CiAJaW50IGksIGFjOwogCiAJc2luZm8tPmdlbmVyYXRpb24gPSBzZGF0YS0+bG9jYWwtPnN0YV9nZW5lcmF0aW9uOwpAQCAtNTc4LDYgKzU4OSwxNyBAQAogCQlzaW5mby0+c3RhX2ZsYWdzLnNldCB8PSBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKTsKIAlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpCiAJCXNpbmZvLT5zdGFfZmxhZ3Muc2V0IHw9IEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CisKKwkvKiBjaGVjayBpZiB0aGUgZHJpdmVyIGhhcyBhIFNXIFJDIGltcGxlbWVudGF0aW9uICovCisJaWYgKHJlZiAmJiByZWYtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQpCisJCXRociA9IHJlZi0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEtPnJhdGVfY3RybF9wcml2KTsKKwllbHNlCisJCXRociA9IGRydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChsb2NhbCwgJnN0YS0+c3RhKTsKKworCWlmICh0aHIgIT0gMCkgeworCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19FWFBFQ1RFRF9USFJPVUdIUFVUOworCQlzaW5mby0+ZXhwZWN0ZWRfdGhyb3VnaHB1dCA9IHRocjsKKwl9CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyIGllZWU4MDIxMV9nc3RyaW5nc19zdGFfc3RhdHNbXVtFVEhfR1NUUklOR19MRU5dID0gewpAQCAtNzY4LDcgKzc5MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2R1bXBfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBpbnQgaWR4LCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKKwkJCQkgIGludCBpZHgsIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKQEAgLTc5OCw3ICs4MjAsNyBAQAogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKKwkJCQkgY29uc3QgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwpAQCAtOTcyLDEzICs5OTQsMTMgQEAKIAlzZGF0YS0+bmVlZGVkX3J4X2NoYWlucyA9IHNkYXRhLT5sb2NhbC0+cnhfY2hhaW5zOwogCiAJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7Ci0Jc2RhdGEtPnJhZGFyX3JlcXVpcmVkID0gcGFyYW1zLT5yYWRhcl9yZXF1aXJlZDsKIAllcnIgPSBpZWVlODAyMTFfdmlmX3VzZV9jaGFubmVsKHNkYXRhLCAmcGFyYW1zLT5jaGFuZGVmLAogCQkJCQlJRUVFODAyMTFfQ0hBTkNUWF9TSEFSRUQpOworCWlmICghZXJyKQorCQlpZWVlODAyMTFfdmlmX2NvcHlfY2hhbmN0eF90b192bGFucyhzZGF0YSwgZmFsc2UpOwogCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlpZWVlODAyMTFfdmlmX2NvcHlfY2hhbmN0eF90b192bGFucyhzZGF0YSwgZmFsc2UpOwogCiAJLyoKIAkgKiBBcHBseSBjb250cm9sIHBvcnQgcHJvdG9jb2wsIHRoaXMgYWxsb3dzIHVzIHRvCkBAIC0xMDc1LDYgKzEwOTcsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorYm9vbCBpZWVlODAyMTFfY3NhX25lZWRzX2Jsb2NrX3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgeworCQlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc2RhdGEtPnZpZi5jc2FfYWN0aXZlKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzZGF0YS0+Y3NhX2Jsb2NrX3R4KQorCQkJY29udGludWU7CisKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiB0cnVlOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGludCBpZWVlODAyMTFfc3RvcF9hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKQEAgLTEwOTIsNyArMTEzOSwxNCBAQAogCW9sZF9wcm9iZV9yZXNwID0gc2RhdGFfZGVyZWZlcmVuY2Uoc2RhdGEtPnUuYXAucHJvYmVfcmVzcCwgc2RhdGEpOwogCiAJLyogYWJvcnQgYW55IHJ1bm5pbmcgY2hhbm5lbCBzd2l0Y2ggKi8KKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAlzZGF0YS0+dmlmLmNzYV9hY3RpdmUgPSBmYWxzZTsKKwlpZiAoIWllZWU4MDIxMV9jc2FfbmVlZHNfYmxvY2tfdHgobG9jYWwpKQorCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXNfYnlfcmVhc29uKCZsb2NhbC0+aHcsCisJCQkJCUlFRUU4MDIxMV9NQVhfUVVFVUVfTUFQLAorCQkJCQlJRUVFODAyMTFfUVVFVUVfU1RPUF9SRUFTT05fQ1NBKTsKKwltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOworCiAJa2ZyZWUoc2RhdGEtPnUuYXAubmV4dF9iZWFjb24pOwogCXNkYXRhLT51LmFwLm5leHRfYmVhY29uID0gTlVMTDsKIApAQCAtMTEzMSw4ICsxMTg1LDggQEAKIAlsb2NhbC0+dG90YWxfcHNfYnVmZmVyZWQgLT0gc2tiX3F1ZXVlX2xlbigmc2RhdGEtPnUuYXAucHMuYmNfYnVmKTsKIAlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT51LmFwLnBzLmJjX2J1Zik7CiAKLQlpZWVlODAyMTFfdmlmX2NvcHlfY2hhbmN0eF90b192bGFucyhzZGF0YSwgdHJ1ZSk7CiAJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisJaWVlZTgwMjExX3ZpZl9jb3B5X2NoYW5jdHhfdG9fdmxhbnMoc2RhdGEsIHRydWUpOwogCWllZWU4MDIxMV92aWZfcmVsZWFzZV9jaGFubmVsKHNkYXRhKTsKIAltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCkBAIC0xNDE2LDcgKzE0NzAsOCBAQAogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9hZGRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCisJCQkJIGNvbnN0IHU4ICptYWMsCisJCQkJIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwpAQCAtMTQ1MCw2ICsxNTA1LDggQEAKIAlpZiAoIShwYXJhbXMtPnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSkgewogCQlzdGFfaW5mb19wcmVfbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSCk7CiAJCXN0YV9pbmZvX3ByZV9tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BU1NPQyk7CisJfSBlbHNlIHsKKwkJc3RhLT5zdGEudGRscyA9IHRydWU7CiAJfQogCiAJZXJyID0gc3RhX2FwcGx5X3BhcmFtZXRlcnMobG9jYWwsIHN0YSwgcGFyYW1zKTsKQEAgLTE0ODMsNyArMTU0MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHU4ICptYWMpCisJCQkJIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAKQEAgLTE0OTcsNyArMTU1NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWMsCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICptYWMsCiAJCQkJICAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CkBAIC0xNTY2LDcgKzE2MjMsNyBAQAogCiAJCWlmIChzdGEtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCiAJCSAgICBzdGEtPnNkYXRhLT51LnZsYW4uc3RhKSB7Ci0JCQlyY3VfYXNzaWduX3BvaW50ZXIoc3RhLT5zZGF0YS0+dS52bGFuLnN0YSwgTlVMTCk7CisJCQlSQ1VfSU5JVF9QT0lOVEVSKHN0YS0+c2RhdGEtPnUudmxhbi5zdGEsIE5VTEwpOwogCQkJcHJldl80YWRkciA9IHRydWU7CiAJCX0KIApAQCAtMTYyMiw3ICsxNjc5LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiBzdGF0aWMgaW50IGllZWU4MDIxMV9hZGRfbXBhdGgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgdTggKmRzdCwgdTggKm5leHRfaG9wKQorCQkJICAgICAgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpuZXh0X2hvcCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKQEAgLTE2NTAsNyArMTcwNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2RlbF9tcGF0aChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHU4ICpkc3QpCisJCQkgICAgICAgY29uc3QgdTggKmRzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKQEAgLTE2NjEsOSArMTcxOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX2NoYW5nZV9tcGF0aChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICB1OCAqZHN0LCB1OCAqbmV4dF9ob3ApCitzdGF0aWMgaW50IGllZWU4MDIxMV9jaGFuZ2VfbXBhdGgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpuZXh0X2hvcCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKQEAgLTE3NTUsOCArMTgxMSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2R1bXBfbXBhdGgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgaW50IGlkeCwgdTggKmRzdCwgdTggKm5leHRfaG9wLAotCQkJCSBzdHJ1Y3QgbXBhdGhfaW5mbyAqcGluZm8pCisJCQkJaW50IGlkeCwgdTggKmRzdCwgdTggKm5leHRfaG9wLAorCQkJCXN0cnVjdCBtcGF0aF9pbmZvICpwaW5mbykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKQEAgLTI5MzAsNyArMjk4Niw2IEBACiAJLyogd2hhdGV2ZXIsIGJ1dCBjaGFubmVsIGNvbnRleHRzIHNob3VsZCBub3QgY29tcGxhaW4gYWJvdXQgdGhhdCBvbmUgKi8KIAlzZGF0YS0+c21wc19tb2RlID0gSUVFRTgwMjExX1NNUFNfT0ZGOwogCXNkYXRhLT5uZWVkZWRfcnhfY2hhaW5zID0gbG9jYWwtPnJ4X2NoYWluczsKLQlzZGF0YS0+cmFkYXJfcmVxdWlyZWQgPSB0cnVlOwogCiAJZXJyID0gaWVlZTgwMjExX3ZpZl91c2VfY2hhbm5lbChzZGF0YSwgY2hhbmRlZiwKIAkJCQkJSUVFRTgwMjExX0NIQU5DVFhfU0hBUkVEKTsKQEAgLTMwMTEsMjYgKzMwNjYsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NzYV9maW5pc2gpOwogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfY3NhX2ZpbmFsaXplKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQorc3RhdGljIGludCBpZWVlODAyMTFfc2V0X2FmdGVyX2NzYV9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCSAgdTMyICpjaGFuZ2VkKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCWludCBlcnIsIGNoYW5nZWQgPSAwOworCWludCBlcnI7CiAKLQlzZGF0YV9hc3NlcnRfbG9jayhzZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKLQlzZGF0YS0+cmFkYXJfcmVxdWlyZWQgPSBzZGF0YS0+Y3NhX3JhZGFyX3JlcXVpcmVkOwotCWVyciA9IGllZWU4MDIxMV92aWZfY2hhbmdlX2NoYW5uZWwoc2RhdGEsICZjaGFuZ2VkKTsKLQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwotCWlmIChXQVJOX09OKGVyciA8IDApKQotCQlyZXR1cm47Ci0KLQlpZiAoIWxvY2FsLT51c2VfY2hhbmN0eCkgewotCQlsb2NhbC0+X29wZXJfY2hhbmRlZiA9IHNkYXRhLT5jc2FfY2hhbmRlZjsKLQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7Ci0JfQotCi0Jc2RhdGEtPnZpZi5jc2FfYWN0aXZlID0gZmFsc2U7CiAJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQllcnIgPSBpZWVlODAyMTFfYXNzaWduX2JlYWNvbihzZGF0YSwgc2RhdGEtPnUuYXAubmV4dF9iZWFjb24pOwpAQCAtMzAzOCwzNSArMzA3OCw3NCBAQAogCQlzZGF0YS0+dS5hcC5uZXh0X2JlYWNvbiA9IE5VTEw7CiAKIAkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm47Ci0JCWNoYW5nZWQgfD0gZXJyOworCQkJcmV0dXJuIGVycjsKKwkJKmNoYW5nZWQgfD0gZXJyOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQllcnIgPSBpZWVlODAyMTFfaWJzc19maW5pc2hfY3NhKHNkYXRhKTsKIAkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm47Ci0JCWNoYW5nZWQgfD0gZXJyOworCQkJcmV0dXJuIGVycjsKKwkJKmNoYW5nZWQgfD0gZXJyOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJZXJyID0gaWVlZTgwMjExX21lc2hfZmluaXNoX2NzYShzZGF0YSk7CiAJCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuOwotCQljaGFuZ2VkIHw9IGVycjsKKwkJCXJldHVybiBlcnI7CisJCSpjaGFuZ2VkIHw9IGVycjsKIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgogCQlXQVJOX09OKDEpOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKwlyZXR1cm4gMDsKK30KIAotCWllZWU4MDIxMV93YWtlX3F1ZXVlc19ieV9yZWFzb24oJnNkYXRhLT5sb2NhbC0+aHcsCitzdGF0aWMgaW50IF9faWVlZTgwMjExX2NzYV9maW5hbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwl1MzIgY2hhbmdlZCA9IDA7CisJaW50IGVycjsKKworCXNkYXRhX2Fzc2VydF9sb2NrKHNkYXRhKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+bXR4KTsKKworCXNkYXRhLT5yYWRhcl9yZXF1aXJlZCA9IHNkYXRhLT5jc2FfcmFkYXJfcmVxdWlyZWQ7CisJZXJyID0gaWVlZTgwMjExX3ZpZl9jaGFuZ2VfY2hhbm5lbChzZGF0YSwgJmNoYW5nZWQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFsb2NhbC0+dXNlX2NoYW5jdHgpIHsKKwkJbG9jYWwtPl9vcGVyX2NoYW5kZWYgPSBzZGF0YS0+Y3NhX2NoYW5kZWY7CisJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOworCX0KKworCXNkYXRhLT52aWYuY3NhX2FjdGl2ZSA9IGZhbHNlOworCisJZXJyID0gaWVlZTgwMjExX3NldF9hZnRlcl9jc2FfYmVhY29uKHNkYXRhLCAmY2hhbmdlZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKwljZmc4MDIxMV9jaF9zd2l0Y2hfbm90aWZ5KHNkYXRhLT5kZXYsICZzZGF0YS0+Y3NhX2NoYW5kZWYpOworCisJaWYgKCFpZWVlODAyMTFfY3NhX25lZWRzX2Jsb2NrX3R4KGxvY2FsKSkKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzX2J5X3JlYXNvbigmbG9jYWwtPmh3LAogCQkJCQlJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKIAkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0NTQSk7CiAKLQljZmc4MDIxMV9jaF9zd2l0Y2hfbm90aWZ5KHNkYXRhLT5kZXYsICZzZGF0YS0+Y3NhX2NoYW5kZWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY3NhX2ZpbmFsaXplKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCWlmIChfX2llZWU4MDIxMV9jc2FfZmluYWxpemUoc2RhdGEpKSB7CisJCXNkYXRhX2luZm8oc2RhdGEsICJmYWlsZWQgdG8gZmluYWxpemUgQ1NBLCBkaXNjb25uZWN0aW5nXG4iKTsKKwkJY2ZnODAyMTFfc3RvcF9pZmFjZShzZGF0YS0+bG9jYWwtPmh3LndpcGh5LCAmc2RhdGEtPndkZXYsCisJCQkJICAgIEdGUF9LRVJORUwpOworCX0KIH0KIAogdm9pZCBpZWVlODAyMTFfY3NhX2ZpbmFsaXplX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMzA3NCw4ICszMTUzLDExIEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwKIAkJCSAgICAgY3NhX2ZpbmFsaXplX3dvcmspOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCiAJc2RhdGFfbG9jayhzZGF0YSk7CisJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisKIAkvKiBBUCBtaWdodCBoYXZlIGJlZW4gc3RvcHBlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jay4gKi8KIAlpZiAoIXNkYXRhLT52aWYuY3NhX2FjdGl2ZSkKIAkJZ290byB1bmxvY2s7CkBAIC0zMDg2LDYgKzMxNjgsNyBAQAogCWllZWU4MDIxMV9jc2FfZmluYWxpemUoc2RhdGEpOwogCiB1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAlzZGF0YV91bmxvY2soc2RhdGEpOwogfQogCkBAIC0zMTIxLDkgKzMyMDQsMjUgQEAKIAkJaWYgKHBhcmFtcy0+Y291bnQgPD0gMSkKIAkJCWJyZWFrOwogCi0JCXNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfYmVhY29uID0KLQkJCXBhcmFtcy0+Y291bnRlcl9vZmZzZXRfYmVhY29uOwotCQlzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X3ByZXNwID0gcGFyYW1zLT5jb3VudGVyX29mZnNldF9wcmVzcDsKKwkJaWYgKChwYXJhbXMtPm5fY291bnRlcl9vZmZzZXRzX2JlYWNvbiA+CisJCSAgICAgSUVFRTgwMjExX01BWF9DU0FfQ09VTlRFUlNfTlVNKSB8fAorCQkgICAgKHBhcmFtcy0+bl9jb3VudGVyX29mZnNldHNfcHJlc3AgPgorCQkgICAgIElFRUU4MDIxMV9NQVhfQ1NBX0NPVU5URVJTX05VTSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBnYXJiYWdlIGluIG90aGVyIGNvdW50ZXJzICovCisJCW1lbXNldChzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X2JlYWNvbiwgMCwKKwkJICAgICAgIHNpemVvZihzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X2JlYWNvbikpOworCQltZW1zZXQoc2RhdGEtPmNzYV9jb3VudGVyX29mZnNldF9wcmVzcCwgMCwKKwkJICAgICAgIHNpemVvZihzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X3ByZXNwKSk7CisKKwkJbWVtY3B5KHNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfYmVhY29uLAorCQkgICAgICAgcGFyYW1zLT5jb3VudGVyX29mZnNldHNfYmVhY29uLAorCQkgICAgICAgcGFyYW1zLT5uX2NvdW50ZXJfb2Zmc2V0c19iZWFjb24gKiBzaXplb2YodTE2KSk7CisJCW1lbWNweShzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X3ByZXNwLAorCQkgICAgICAgcGFyYW1zLT5jb3VudGVyX29mZnNldHNfcHJlc3AsCisJCSAgICAgICBwYXJhbXMtPm5fY291bnRlcl9vZmZzZXRzX3ByZXNwICogc2l6ZW9mKHUxNikpOworCiAJCWVyciA9IGllZWU4MDIxMV9hc3NpZ25fYmVhY29uKHNkYXRhLCAmcGFyYW1zLT5iZWFjb25fY3NhKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWtmcmVlKHNkYXRhLT51LmFwLm5leHRfYmVhY29uKTsKQEAgLTMyMTIsMTYgKzMzMTEsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfY3NhX3NldHRpbmdzICpwYXJhbXMpCitzdGF0aWMgaW50CitfX2llZWU4MDIxMV9jaGFubmVsX3N3aXRjaChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNmZzgwMjExX2NzYV9zZXR0aW5ncyAqcGFyYW1zKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpjb25mOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY2hhbmN0eDsKIAlpbnQgZXJyLCBudW1fY2hhbmN0eCwgY2hhbmdlZCA9IDA7CiAKIAlzZGF0YV9hc3NlcnRfbG9jayhzZGF0YSk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmxvY2FsLT5yb2NfbGlzdCkgfHwgbG9jYWwtPnNjYW5uaW5nKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMzIzMywyMyArMzMzNCwyNCBAQAogCQkJCSAgICAgICAmc2RhdGEtPnZpZi5ic3NfY29uZi5jaGFuZGVmKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY2hhbmN0eF9jb25mID0gcmN1X2RlcmVmZXJlbmNlKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mKTsKLQlpZiAoIWNoYW5jdHhfY29uZikgewotCQlyY3VfcmVhZF91bmxvY2soKTsKKwltdXRleF9sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCWNvbmYgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLAorCQkJCQkgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpKTsKKwlpZiAoIWNvbmYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIGRvbid0IGhhbmRsZSBmb3IgbXVsdGktVklGIGNhc2VzICovCi0JY2hhbmN0eCA9IGNvbnRhaW5lcl9vZihjaGFuY3R4X2NvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7Ci0JaWYgKGNoYW5jdHgtPnJlZmNvdW50ID4gMSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKKwljaGFuY3R4ID0gY29udGFpbmVyX29mKGNvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7CisJaWYgKGllZWU4MDIxMV9jaGFuY3R4X3JlZmNvdW50KGxvY2FsLCBjaGFuY3R4KSA+IDEpIHsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAludW1fY2hhbmN0eCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hhbmN0eCwgJmxvY2FsLT5jaGFuY3R4X2xpc3QsIGxpc3QpCiAJCW51bV9jaGFuY3R4Kys7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCiAJaWYgKG51bV9jaGFuY3R4ID4gMSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTMyNjMsMTUgKzMzNjUsMTYgQEAKIAkJcmV0dXJuIGVycjsKIAogCXNkYXRhLT5jc2FfcmFkYXJfcmVxdWlyZWQgPSBwYXJhbXMtPnJhZGFyX3JlcXVpcmVkOwotCi0JaWYgKHBhcmFtcy0+YmxvY2tfdHgpCi0JCWllZWU4MDIxMV9zdG9wX3F1ZXVlc19ieV9yZWFzb24oJmxvY2FsLT5odywKLQkJCQlJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKLQkJCQlJRUVFODAyMTFfUVVFVUVfU1RPUF9SRUFTT05fQ1NBKTsKLQogCXNkYXRhLT5jc2FfY2hhbmRlZiA9IHBhcmFtcy0+Y2hhbmRlZjsKKwlzZGF0YS0+Y3NhX2Jsb2NrX3R4ID0gcGFyYW1zLT5ibG9ja190eDsKKwlzZGF0YS0+Y3NhX2N1cnJlbnRfY291bnRlciA9IHBhcmFtcy0+Y291bnQ7CiAJc2RhdGEtPnZpZi5jc2FfYWN0aXZlID0gdHJ1ZTsKIAorCWlmIChzZGF0YS0+Y3NhX2Jsb2NrX3R4KQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXNfYnlfcmVhc29uKCZsb2NhbC0+aHcsCisJCQkJCUlFRUU4MDIxMV9NQVhfUVVFVUVfTUFQLAorCQkJCQlJRUVFODAyMTFfUVVFVUVfU1RPUF9SRUFTT05fQ1NBKTsKKwogCWlmIChjaGFuZ2VkKSB7CiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIAkJZHJ2X2NoYW5uZWxfc3dpdGNoX2JlYWNvbihzZGF0YSwgJnBhcmFtcy0+Y2hhbmRlZik7CkBAIC0zMjgzLDYgKzMzODYsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfY3NhX3NldHRpbmdzICpwYXJhbXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKKwllcnIgPSBfX2llZWU4MDIxMV9jaGFubmVsX3N3aXRjaCh3aXBoeSwgZGV2LCBwYXJhbXMpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IGllZWU4MDIxMV9tZ210X3R4KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCiAJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9tZ210X3R4X3BhcmFtcyAqcGFyYW1zLAogCQkJICAgICB1NjQgKmNvb2tpZSkKQEAgLTMyOTUsNiArMzQxMiw3IEBACiAJYm9vbCBuZWVkX29mZmNoYW4gPSBmYWxzZTsKIAl1MzIgZmxhZ3M7CiAJaW50IHJldDsKKwl1OCAqZGF0YTsKIAogCWlmIChwYXJhbXMtPmRvbnRfd2FpdF9mb3JfYWNrKQogCQlmbGFncyA9IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLOwpAQCAtMzM4OCw3ICszNTA2LDIwIEBACiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKIAotCW1lbWNweShza2JfcHV0KHNrYiwgcGFyYW1zLT5sZW4pLCBwYXJhbXMtPmJ1ZiwgcGFyYW1zLT5sZW4pOworCWRhdGEgPSBza2JfcHV0KHNrYiwgcGFyYW1zLT5sZW4pOworCW1lbWNweShkYXRhLCBwYXJhbXMtPmJ1ZiwgcGFyYW1zLT5sZW4pOworCisJLyogVXBkYXRlIENTQSBjb3VudGVycyAqLworCWlmIChzZGF0YS0+dmlmLmNzYV9hY3RpdmUgJiYKKwkgICAgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCSAgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJgorCSAgICBwYXJhbXMtPm5fY3NhX29mZnNldHMpIHsKKwkJaW50IGk7CisJCXU4IGMgPSBzZGF0YS0+Y3NhX2N1cnJlbnRfY291bnRlcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5uX2NzYV9vZmZzZXRzOyBpKyspCisJCQlkYXRhW3BhcmFtcy0+Y3NhX29mZnNldHNbaV1dID0gYzsKKwl9CiAKIAlJRUVFODAyMTFfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3M7CiAKQEAgLTM0OTcsMzIwICszNjI4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3RkbHNfYWRkX2V4dF9jYXBhYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXU4ICpwb3MgPSAodm9pZCAqKXNrYl9wdXQoc2tiLCA3KTsKLQotCSpwb3MrKyA9IFdMQU5fRUlEX0VYVF9DQVBBQklMSVRZOwotCSpwb3MrKyA9IDU7IC8qIGxlbiAqLwotCSpwb3MrKyA9IDB4MDsKLQkqcG9zKysgPSAweDA7Ci0JKnBvcysrID0gMHgwOwotCSpwb3MrKyA9IDB4MDsKLQkqcG9zKysgPSBXTEFOX0VYVF9DQVBBNV9URExTX0VOQUJMRUQ7Ci19Ci0KLXN0YXRpYyB1MTYgaWVlZTgwMjExX2dldF90ZGxzX3N0YV9jYXBhYihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQl1MTYgY2FwYWI7Ci0KLQljYXBhYiA9IDA7Ci0JaWYgKGllZWU4MDIxMV9nZXRfc2RhdGFfYmFuZChzZGF0YSkgIT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJcmV0dXJuIGNhcGFiOwotCi0JaWYgKCEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXXzJHSFpfU0hPUlRfU0xPVF9JTkNBUEFCTEUpKQotCQljYXBhYiB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FOwotCWlmICghKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV18yR0haX1NIT1JUX1BSRUFNQkxFX0lOQ0FQQUJMRSkpCi0JCWNhcGFiIHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQotCXJldHVybiBjYXBhYjsKLX0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3RkbHNfYWRkX2xpbmtfaWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnNyY19hZGRyLAotCQkJCSAgICAgICB1OCAqcGVlciwgdTggKmJzc2lkKQotewotCXN0cnVjdCBpZWVlODAyMTFfdGRsc19sbmtpZSAqbG5raWQ7Ci0KLQlsbmtpZCA9ICh2b2lkICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfbG5raWUpKTsKLQotCWxua2lkLT5pZV90eXBlID0gV0xBTl9FSURfTElOS19JRDsKLQlsbmtpZC0+aWVfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGRsc19sbmtpZSkgLSAyOwotCi0JbWVtY3B5KGxua2lkLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkobG5raWQtPmluaXRfc3RhLCBzcmNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShsbmtpZC0+cmVzcF9zdGEsIHBlZXIsIEVUSF9BTEVOKTsKLX0KLQotc3RhdGljIGludAotaWVlZTgwMjExX3ByZXBfdGRsc19lbmNhcF9kYXRhKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCi0JCQkgICAgICAgdTE2IHN0YXR1c19jb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpOwotCXN0cnVjdCBpZWVlODAyMTFfdGRsc19kYXRhICp0ZjsKLQotCXRmID0gKHZvaWQgKilza2JfcHV0KHNrYiwgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV90ZGxzX2RhdGEsIHUpKTsKLQotCW1lbWNweSh0Zi0+ZGEsIHBlZXIsIEVUSF9BTEVOKTsKLQltZW1jcHkodGYtPnNhLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKLQl0Zi0+ZXRoZXJfdHlwZSA9IGNwdV90b19iZTE2KEVUSF9QX1RETFMpOwotCXRmLT5wYXlsb2FkX3R5cGUgPSBXTEFOX1RETFNfU05BUF9SRlRZUEU7Ci0KLQlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7Ci0JY2FzZSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDoKLQkJdGYtPmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9URExTOwotCQl0Zi0+YWN0aW9uX2NvZGUgPSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDsKLQotCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHRmLT51LnNldHVwX3JlcSkpOwotCQl0Zi0+dS5zZXR1cF9yZXEuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOwotCQl0Zi0+dS5zZXR1cF9yZXEuY2FwYWJpbGl0eSA9Ci0JCQljcHVfdG9fbGUxNihpZWVlODAyMTFfZ2V0X3RkbHNfc3RhX2NhcGFiKHNkYXRhKSk7Ci0KLQkJaWVlZTgwMjExX2FkZF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfYWRkX2V4dF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfdGRsc19hZGRfZXh0X2NhcGFiKHNrYik7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFU1BPTlNFOgotCQl0Zi0+Y2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX1RETFM7Ci0JCXRmLT5hY3Rpb25fY29kZSA9IFdMQU5fVERMU19TRVRVUF9SRVNQT05TRTsKLQotCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHRmLT51LnNldHVwX3Jlc3ApKTsKLQkJdGYtPnUuc2V0dXBfcmVzcC5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KHN0YXR1c19jb2RlKTsKLQkJdGYtPnUuc2V0dXBfcmVzcC5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47Ci0JCXRmLT51LnNldHVwX3Jlc3AuY2FwYWJpbGl0eSA9Ci0JCQljcHVfdG9fbGUxNihpZWVlODAyMTFfZ2V0X3RkbHNfc3RhX2NhcGFiKHNkYXRhKSk7Ci0KLQkJaWVlZTgwMjExX2FkZF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfYWRkX2V4dF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfdGRsc19hZGRfZXh0X2NhcGFiKHNrYik7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9URExTX1NFVFVQX0NPTkZJUk06Ci0JCXRmLT5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfVERMUzsKLQkJdGYtPmFjdGlvbl9jb2RlID0gV0xBTl9URExTX1NFVFVQX0NPTkZJUk07Ci0KLQkJc2tiX3B1dChza2IsIHNpemVvZih0Zi0+dS5zZXR1cF9jZm0pKTsKLQkJdGYtPnUuc2V0dXBfY2ZtLnN0YXR1c19jb2RlID0gY3B1X3RvX2xlMTYoc3RhdHVzX2NvZGUpOwotCQl0Zi0+dS5zZXR1cF9jZm0uZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOwotCQlicmVhazsKLQljYXNlIFdMQU5fVERMU19URUFSRE9XTjoKLQkJdGYtPmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9URExTOwotCQl0Zi0+YWN0aW9uX2NvZGUgPSBXTEFOX1RETFNfVEVBUkRPV047Ci0KLQkJc2tiX3B1dChza2IsIHNpemVvZih0Zi0+dS50ZWFyZG93bikpOwotCQl0Zi0+dS50ZWFyZG93bi5yZWFzb25fY29kZSA9IGNwdV90b19sZTE2KHN0YXR1c19jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX1RETFNfRElTQ09WRVJZX1JFUVVFU1Q6Ci0JCXRmLT5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfVERMUzsKLQkJdGYtPmFjdGlvbl9jb2RlID0gV0xBTl9URExTX0RJU0NPVkVSWV9SRVFVRVNUOwotCi0JCXNrYl9wdXQoc2tiLCBzaXplb2YodGYtPnUuZGlzY292ZXJfcmVxKSk7Ci0JCXRmLT51LmRpc2NvdmVyX3JlcS5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pZWVlODAyMTFfcHJlcF90ZGxzX2RpcmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCi0JCQkgICB1MTYgc3RhdHVzX2NvZGUsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGllZWU4MDIxMV9nZXRfc2RhdGFfYmFuZChzZGF0YSk7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCi0JbWdtdCA9ICh2b2lkICopc2tiX3B1dChza2IsIDI0KTsKLQltZW1zZXQobWdtdCwgMCwgMjQpOwotCW1lbWNweShtZ210LT5kYSwgcGVlciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5tZ2QuYnNzaWQsIEVUSF9BTEVOKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8Ci0JCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7Ci0JY2FzZSBXTEFOX1BVQl9BQ1RJT05fVERMU19ESVNDT1ZFUl9SRVM6Ci0JCXNrYl9wdXQoc2tiLCAxICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUudGRsc19kaXNjb3Zlcl9yZXNwKSk7Ci0JCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9QVUJMSUM7Ci0JCW1nbXQtPnUuYWN0aW9uLnUudGRsc19kaXNjb3Zlcl9yZXNwLmFjdGlvbl9jb2RlID0KLQkJCVdMQU5fUFVCX0FDVElPTl9URExTX0RJU0NPVkVSX1JFUzsKLQkJbWdtdC0+dS5hY3Rpb24udS50ZGxzX2Rpc2NvdmVyX3Jlc3AuZGlhbG9nX3Rva2VuID0KLQkJCWRpYWxvZ190b2tlbjsKLQkJbWdtdC0+dS5hY3Rpb24udS50ZGxzX2Rpc2NvdmVyX3Jlc3AuY2FwYWJpbGl0eSA9Ci0JCQljcHVfdG9fbGUxNihpZWVlODAyMTFfZ2V0X3RkbHNfc3RhX2NhcGFiKHNkYXRhKSk7Ci0KLQkJaWVlZTgwMjExX2FkZF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfYWRkX2V4dF9zcmF0ZXNfaWUoc2RhdGEsIHNrYiwgZmFsc2UsIGJhbmQpOwotCQlpZWVlODAyMTFfdGRsc19hZGRfZXh0X2NhcGFiKHNrYik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGllZWU4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1OCAqcGVlciwgdTggYWN0aW9uX2NvZGUsIHU4IGRpYWxvZ190b2tlbiwKLQkJCSAgICAgICB1MTYgc3RhdHVzX2NvZGUsIHUzMiBwZWVyX2NhcGFiaWxpdHksCi0JCQkgICAgICAgY29uc3QgdTggKmV4dHJhX2llcywgc2l6ZV90IGV4dHJhX2llc19sZW4pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCWJvb2wgc2VuZF9kaXJlY3Q7Ci0JaW50IHJldDsKLQotCWlmICghKHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykpCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQkvKiBtYWtlIHN1cmUgd2UgYXJlIGluIG1hbmFnZWQgbW9kZSwgYW5kIGFzc29jaWF0ZWQgKi8KLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKLQkgICAgIXNkYXRhLT51Lm1nZC5hc3NvY2lhdGVkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRkbHNfZGJnKHNkYXRhLCAiVERMUyBtZ210IGFjdGlvbiAlZCBwZWVyICVwTVxuIiwKLQkJIGFjdGlvbl9jb2RlLCBwZWVyKTsKLQotCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsKLQkJCSAgICBtYXgoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCksCi0JCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGRsc19kYXRhKSkgKwotCQkJICAgIDUwICsgLyogc3VwcG9ydGVkIHJhdGVzICovCi0JCQkgICAgNyArIC8qIGV4dCBjYXBhYiAqLwotCQkJICAgIGV4dHJhX2llc19sZW4gKwotCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfbG5raWUpKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0KLQlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7Ci0JY2FzZSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDoKLQljYXNlIFdMQU5fVERMU19TRVRVUF9SRVNQT05TRToKLQljYXNlIFdMQU5fVERMU19TRVRVUF9DT05GSVJNOgotCWNhc2UgV0xBTl9URExTX1RFQVJET1dOOgotCWNhc2UgV0xBTl9URExTX0RJU0NPVkVSWV9SRVFVRVNUOgotCQlyZXQgPSBpZWVlODAyMTFfcHJlcF90ZGxzX2VuY2FwX2RhdGEod2lwaHksIGRldiwgcGVlciwKLQkJCQkJCSAgICAgYWN0aW9uX2NvZGUsIGRpYWxvZ190b2tlbiwKLQkJCQkJCSAgICAgc3RhdHVzX2NvZGUsIHNrYik7Ci0JCXNlbmRfZGlyZWN0ID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTOgotCQlyZXQgPSBpZWVlODAyMTFfcHJlcF90ZGxzX2RpcmVjdCh3aXBoeSwgZGV2LCBwZWVyLCBhY3Rpb25fY29kZSwKLQkJCQkJCSBkaWFsb2dfdG9rZW4sIHN0YXR1c19jb2RlLAotCQkJCQkJIHNrYik7Ci0JCXNlbmRfZGlyZWN0ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1RTVVBQOwotCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsOwotCi0JaWYgKGV4dHJhX2llc19sZW4pCi0JCW1lbWNweShza2JfcHV0KHNrYiwgZXh0cmFfaWVzX2xlbiksIGV4dHJhX2llcywgZXh0cmFfaWVzX2xlbik7Ci0KLQkvKiB0aGUgVERMUyBsaW5rIElFIGlzIGFsd2F5cyBhZGRlZCBsYXN0ICovCi0Jc3dpdGNoIChhY3Rpb25fY29kZSkgewotCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFUVVFU1Q6Ci0JY2FzZSBXTEFOX1RETFNfU0VUVVBfQ09ORklSTToKLQljYXNlIFdMQU5fVERMU19URUFSRE9XTjoKLQljYXNlIFdMQU5fVERMU19ESVNDT1ZFUllfUkVRVUVTVDoKLQkJLyogd2UgYXJlIHRoZSBpbml0aWF0b3IgKi8KLQkJaWVlZTgwMjExX3RkbHNfYWRkX2xpbmtfaWUoc2tiLCBzZGF0YS0+dmlmLmFkZHIsIHBlZXIsCi0JCQkJCSAgIHNkYXRhLT51Lm1nZC5ic3NpZCk7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFU1BPTlNFOgotCWNhc2UgV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTOgotCQkvKiB3ZSBhcmUgdGhlIHJlc3BvbmRlciAqLwotCQlpZWVlODAyMTFfdGRsc19hZGRfbGlua19pZShza2IsIHBlZXIsIHNkYXRhLT52aWYuYWRkciwKLQkJCQkJICAgc2RhdGEtPnUubWdkLmJzc2lkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1RTVVBQOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHNlbmRfZGlyZWN0KSB7Ci0JCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQWNjb3JkaW5nIHRvIDgwMi4xMXo6IFNldHVwIHJlcS9yZXNwIGFyZSBzZW50IGluIEFDX0JLLCBvdGhlcndpc2UKLQkgKiB3ZSBzaG91bGQgZGVmYXVsdCB0byBBQ19WSS4KLQkgKi8KLQlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7Ci0JY2FzZSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDoKLQljYXNlIFdMQU5fVERMU19TRVRVUF9SRVNQT05TRToKLQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgSUVFRTgwMjExX0FDX0JLKTsKLQkJc2tiLT5wcmlvcml0eSA9IDI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIElFRUU4MDIxMV9BQ19WSSk7Ci0JCXNrYi0+cHJpb3JpdHkgPSA1OwotCQlicmVhazsKLQl9Ci0KLQkvKiBkaXNhYmxlIGJvdHRvbSBoYWx2ZXMgd2hlbiBlbnRlcmluZyB0aGUgVHggcGF0aCAqLwotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlyZXQgPSBpZWVlODAyMTFfc3ViaWZfc3RhcnRfeG1pdChza2IsIGRldik7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7Ci0KLQlyZXR1cm4gcmV0OwotCi1mYWlsOgotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGllZWU4MDIxMV90ZGxzX29wZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1OCAqcGVlciwgZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIG9wZXIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCi0JaWYgKCEod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSkKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0ZGxzX2RiZyhzZGF0YSwgIlRETFMgb3BlciAlZCBwZWVyICVwTVxuIiwgb3BlciwgcGVlcik7Ci0KLQlzd2l0Y2ggKG9wZXIpIHsKLQljYXNlIE5MODAyMTFfVERMU19FTkFCTEVfTElOSzoKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHBlZXIpOwotCQlpZiAoIXN0YSkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gLUVOT0xJTks7Ci0JCX0KLQotCQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVJfQVVUSCk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfVERMU19ESVNBQkxFX0xJTks6Ci0JCXJldHVybiBzdGFfaW5mb19kZXN0cm95X2FkZHIoc2RhdGEsIHBlZXIpOwotCWNhc2UgTkw4MDIxMV9URExTX1RFQVJET1dOOgotCWNhc2UgTkw4MDIxMV9URExTX1NFVFVQOgotCWNhc2UgTkw4MDIxMV9URExTX0RJU0NPVkVSWV9SRVE6Ci0JCS8qIFdlIGRvbid0IHN1cHBvcnQgaW4tZHJpdmVyIHNldHVwL3RlYXJkb3duL2Rpc2NvdmVyeSAqLwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaWVlZTgwMjExX3Byb2JlX2NsaWVudChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgY29uc3QgdTggKnBlZXIsIHU2NCAqY29va2llKQogewpAQCAtMzk0OSw2ICszNzY2LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9hcF9jaGFud2lkdGgoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJaW50IHJldDsKKwl1MzIgY2hhbmdlZCA9IDA7CisKKwlyZXQgPSBpZWVlODAyMTFfdmlmX2NoYW5nZV9iYW5kd2lkdGgoc2RhdGEsIGNoYW5kZWYsICZjaGFuZ2VkKTsKKwlpZiAocmV0ID09IDApCisJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKworCXJldHVybiByZXQ7Cit9CisKIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKIAkuYWRkX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9hZGRfaWZhY2UsCiAJLmRlbF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfZGVsX2lmYWNlLApAQCAtNDAyOSw0ICszODYxLDUgQEAKIAkuc3RhcnRfcmFkYXJfZGV0ZWN0aW9uID0gaWVlZTgwMjExX3N0YXJ0X3JhZGFyX2RldGVjdGlvbiwKIAkuY2hhbm5lbF9zd2l0Y2ggPSBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2gsCiAJLnNldF9xb3NfbWFwID0gaWVlZTgwMjExX3NldF9xb3NfbWFwLAorCS5zZXRfYXBfY2hhbndpZHRoID0gaWVlZTgwMjExX3NldF9hcF9jaGFud2lkdGgsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NoYW4uYyBiL25ldC9tYWM4MDIxMS9jaGFuLmMKaW5kZXggNzViNWRkMi4uYTMxMGUzMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NoYW4uYworKysgYi9uZXQvbWFjODAyMTEvY2hhbi5jCkBAIC05LDYgKzksMTcwIEBACiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJkcml2ZXItb3BzLmgiCiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NoYW5jdHhfbnVtX2Fzc2lnbmVkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCWludCBudW0gPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZjdHgtPmFzc2lnbmVkX3ZpZnMsIGFzc2lnbmVkX2NoYW5jdHhfbGlzdCkKKwkJbnVtKys7CisKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV9jaGFuY3R4X251bV9yZXNlcnZlZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKwlpbnQgbnVtID0gMDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmY3R4LT5yZXNlcnZlZF92aWZzLCByZXNlcnZlZF9jaGFuY3R4X2xpc3QpCisJCW51bSsrOworCisJcmV0dXJuIG51bTsKK30KKworaW50IGllZWU4MDIxMV9jaGFuY3R4X3JlZmNvdW50KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4KQoreworCXJldHVybiBpZWVlODAyMTFfY2hhbmN0eF9udW1fYXNzaWduZWQobG9jYWwsIGN0eCkgKworCSAgICAgICBpZWVlODAyMTFfY2hhbmN0eF9udW1fcmVzZXJ2ZWQobG9jYWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX251bV9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4OworCWludCBudW0gPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmbG9jYWwtPmNoYW5jdHhfbGlzdCwgbGlzdCkKKwkJbnVtKys7CisKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgYm9vbCBpZWVlODAyMTFfY2FuX2NyZWF0ZV9uZXdfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCXJldHVybiBpZWVlODAyMTFfbnVtX2NoYW5jdHgobG9jYWwpIDwgaWVlZTgwMjExX21heF9udW1fY2hhbm5lbHMobG9jYWwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICoKK2llZWU4MDIxMV9jaGFuY3R4X3Jlc2VydmVkX2NoYW5kZWYoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHgsCisJCQkJICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjb21wYXQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmN0eC0+cmVzZXJ2ZWRfdmlmcywKKwkJCSAgICByZXNlcnZlZF9jaGFuY3R4X2xpc3QpIHsKKwkJaWYgKCFjb21wYXQpCisJCQljb21wYXQgPSAmc2RhdGEtPnJlc2VydmVkX2NoYW5kZWY7CisKKwkJY29tcGF0ID0gY2ZnODAyMTFfY2hhbmRlZl9jb21wYXRpYmxlKCZzZGF0YS0+cmVzZXJ2ZWRfY2hhbmRlZiwKKwkJCQkJCSAgICAgY29tcGF0KTsKKwkJaWYgKCFjb21wYXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY29tcGF0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICoKK2llZWU4MDIxMV9jaGFuY3R4X25vbl9yZXNlcnZlZF9jaGFuZGVmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjb21wYXQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmN0eC0+YXNzaWduZWRfdmlmcywKKwkJCSAgICBhc3NpZ25lZF9jaGFuY3R4X2xpc3QpIHsKKwkJaWYgKHNkYXRhLT5yZXNlcnZlZF9jaGFuY3R4ICE9IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpZiAoIWNvbXBhdCkKKwkJCWNvbXBhdCA9ICZzZGF0YS0+dmlmLmJzc19jb25mLmNoYW5kZWY7CisKKwkJY29tcGF0ID0gY2ZnODAyMTFfY2hhbmRlZl9jb21wYXRpYmxlKAorCQkJCSZzZGF0YS0+dmlmLmJzc19jb25mLmNoYW5kZWYsIGNvbXBhdCk7CisJCWlmICghY29tcGF0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNvbXBhdDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqCitpZWVlODAyMTFfY2hhbmN0eF9jb21iaW5lZF9jaGFuZGVmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY29tcGF0KQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCk7CisKKwljb21wYXQgPSBpZWVlODAyMTFfY2hhbmN0eF9yZXNlcnZlZF9jaGFuZGVmKGxvY2FsLCBjdHgsIGNvbXBhdCk7CisJaWYgKCFjb21wYXQpCisJCXJldHVybiBOVUxMOworCisJY29tcGF0ID0gaWVlZTgwMjExX2NoYW5jdHhfbm9uX3Jlc2VydmVkX2NoYW5kZWYobG9jYWwsIGN0eCwgY29tcGF0KTsKKwlpZiAoIWNvbXBhdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gY29tcGF0OworfQorCitzdGF0aWMgYm9vbAoraWVlZTgwMjExX2NoYW5jdHhfY2FuX3Jlc2VydmVfY2hhbmRlZihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmRlZikKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCisJaWYgKGllZWU4MDIxMV9jaGFuY3R4X2NvbWJpbmVkX2NoYW5kZWYobG9jYWwsIGN0eCwgZGVmKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cmVzZXJ2ZWRfdmlmcykgJiYKKwkgICAgaWVlZTgwMjExX2NoYW5jdHhfcmVzZXJ2ZWRfY2hhbmRlZihsb2NhbCwgY3R4LCBkZWYpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqCitpZWVlODAyMTFfZmluZF9yZXNlcnZhdGlvbl9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkgICBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCk7CisKKwlpZiAobW9kZSA9PSBJRUVFODAyMTFfQ0hBTkNUWF9FWENMVVNJVkUpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZsb2NhbC0+Y2hhbmN0eF9saXN0LCBsaXN0KSB7CisJCWlmIChjdHgtPm1vZGUgPT0gSUVFRTgwMjExX0NIQU5DVFhfRVhDTFVTSVZFKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpZWVlODAyMTFfY2hhbmN0eF9jYW5fcmVzZXJ2ZV9jaGFuZGVmKGxvY2FsLCBjdHgsCisJCQkJCQkJICAgY2hhbmRlZikpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gY3R4OworCX0KKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgZW51bSBubDgwMjExX2NoYW5fd2lkdGggaWVlZTgwMjExX2dldF9zdGFfYncoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzd2l0Y2ggKHN0YS0+YmFuZHdpZHRoKSB7CkBAIC0xOTAsNiArMzU0LDExIEBACiAJCWlmICghY29tcGF0KQogCQkJY29udGludWU7CiAKKwkJY29tcGF0ID0gaWVlZTgwMjExX2NoYW5jdHhfcmVzZXJ2ZWRfY2hhbmRlZihsb2NhbCwgY3R4LAorCQkJCQkJCSAgICBjb21wYXQpOworCQlpZiAoIWNvbXBhdCkKKwkJCWNvbnRpbnVlOworCiAJCWllZWU4MDIxMV9jaGFuZ2VfY2hhbmN0eChsb2NhbCwgY3R4LCBjb21wYXQpOwogCiAJCXJldHVybiBjdHg7CkBAIC0yMTcsNjIgKzM4Niw5MSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICoKLWllZWU4MDIxMV9uZXdfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAotCQkgICAgICBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgbW9kZSkKK2llZWU4MDIxMV9hbGxvY19jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJZW51bSBpZWVlODAyMTFfY2hhbmN0eF9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7Ci0JdTMyIGNoYW5nZWQ7Ci0JaW50IGVycjsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCk7CiAKIAljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSArIGxvY2FsLT5ody5jaGFuY3R4X2RhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjdHgpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gTlVMTDsKIAorCUlOSVRfTElTVF9IRUFEKCZjdHgtPmFzc2lnbmVkX3ZpZnMpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJlc2VydmVkX3ZpZnMpOwogCWN0eC0+Y29uZi5kZWYgPSAqY2hhbmRlZjsKIAljdHgtPmNvbmYucnhfY2hhaW5zX3N0YXRpYyA9IDE7CiAJY3R4LT5jb25mLnJ4X2NoYWluc19keW5hbWljID0gMTsKIAljdHgtPm1vZGUgPSBtb2RlOwogCWN0eC0+Y29uZi5yYWRhcl9lbmFibGVkID0gaWVlZTgwMjExX2lzX3JhZGFyX3JlcXVpcmVkKGxvY2FsKTsKIAlpZWVlODAyMTFfcmVjYWxjX2NoYW5jdHhfbWluX2RlZihsb2NhbCwgY3R4KTsKKworCXJldHVybiBjdHg7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2FkZF9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCkKK3sKKwl1MzIgY2hhbmdlZDsKKwlpbnQgZXJyOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKwogCWlmICghbG9jYWwtPnVzZV9jaGFuY3R4KQogCQlsb2NhbC0+aHcuY29uZi5yYWRhcl9lbmFibGVkID0gY3R4LT5jb25mLnJhZGFyX2VuYWJsZWQ7CiAKLQkvKiB3ZSBob2xkIHRoZSBtdXRleCB0byBwcmV2ZW50IGlkbGUgZnJvbSBjaGFuZ2luZyAqLwotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOwogCS8qIHR1cm4gaWRsZSBvZmYgKmJlZm9yZSogc2V0dGluZyBjaGFubmVsIC0tIHNvbWUgZHJpdmVycyBuZWVkIHRoYXQgKi8KIAljaGFuZ2VkID0gaWVlZTgwMjExX2lkbGVfb2ZmKGxvY2FsKTsKIAlpZiAoY2hhbmdlZCkKIAkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgY2hhbmdlZCk7CiAKIAlpZiAoIWxvY2FsLT51c2VfY2hhbmN0eCkgewotCQlsb2NhbC0+X29wZXJfY2hhbmRlZiA9ICpjaGFuZGVmOworCQlsb2NhbC0+X29wZXJfY2hhbmRlZiA9IGN0eC0+Y29uZi5kZWY7CiAJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKIAl9IGVsc2UgewogCQllcnIgPSBkcnZfYWRkX2NoYW5jdHgobG9jYWwsIGN0eCk7CiAJCWlmIChlcnIpIHsKLQkJCWtmcmVlKGN0eCk7CiAJCQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwotCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJCXJldHVybiBlcnI7CiAJCX0KIAl9CiAKLQkvKiBhbmQga2VlcCB0aGUgbXV0ZXggaGVsZCB1bnRpbCB0aGUgbmV3IGNoYW5jdHggaXMgb24gdGhlIGxpc3QgKi8KLQlsaXN0X2FkZF9yY3UoJmN0eC0+bGlzdCwgJmxvY2FsLT5jaGFuY3R4X2xpc3QpOworCXJldHVybiAwOworfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICoKK2llZWU4MDIxMV9uZXdfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkgICAgICBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eDsKKwlpbnQgZXJyOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWN0eCA9IGllZWU4MDIxMV9hbGxvY19jaGFuY3R4KGxvY2FsLCBjaGFuZGVmLCBtb2RlKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBpZWVlODAyMTFfYWRkX2NoYW5jdHgobG9jYWwsIGN0eCk7CisJaWYgKGVycikgeworCQlrZnJlZShjdHgpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCWxpc3RfYWRkX3JjdSgmY3R4LT5saXN0LCAmbG9jYWwtPmNoYW5jdHhfbGlzdCk7CiAJcmV0dXJuIGN0eDsKIH0KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX2ZyZWVfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9kZWxfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4KQogewotCWJvb2wgY2hlY2tfc2luZ2xlX2NoYW5uZWwgPSBmYWxzZTsKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCi0JV0FSTl9PTl9PTkNFKGN0eC0+cmVmY291bnQgIT0gMCk7Ci0KIAlpZiAoIWxvY2FsLT51c2VfY2hhbmN0eCkgewogCQlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYgPSAmbG9jYWwtPl9vcGVyX2NoYW5kZWY7CiAJCWNoYW5kZWYtPndpZHRoID0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQ7CkBAIC0yODIsOCArNDgwLDkgQEAKIAkJLyogTk9URTogRGlzYWJsaW5nIHJhZGFyIGlzIG9ubHkgdmFsaWQgaGVyZSBmb3IKIAkJICogc2luZ2xlIGNoYW5uZWwgY29udGV4dC4gVG8gYmUgc3VyZSwgY2hlY2sgaXQgLi4uCiAJCSAqLwotCQlpZiAobG9jYWwtPmh3LmNvbmYucmFkYXJfZW5hYmxlZCkKLQkJCWNoZWNrX3NpbmdsZV9jaGFubmVsID0gdHJ1ZTsKKwkJV0FSTl9PTihsb2NhbC0+aHcuY29uZi5yYWRhcl9lbmFibGVkICYmCisJCQkhbGlzdF9lbXB0eSgmbG9jYWwtPmNoYW5jdHhfbGlzdCkpOworCiAJCWxvY2FsLT5ody5jb25mLnJhZGFyX2VuYWJsZWQgPSBmYWxzZTsKIAogCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCk7CkBAIC0yOTEsMzkgKzQ5MCwxOSBAQAogCQlkcnZfcmVtb3ZlX2NoYW5jdHgobG9jYWwsIGN0eCk7CiAJfQogCi0JbGlzdF9kZWxfcmN1KCZjdHgtPmxpc3QpOwotCWtmcmVlX3JjdShjdHgsIHJjdV9oZWFkKTsKLQotCS8qIHRocm93IGEgd2FybmluZyBpZiB0aGlzIHdhc24ndCB0aGUgb25seSBjaGFubmVsIGNvbnRleHQuICovCi0JV0FSTl9PTihjaGVja19zaW5nbGVfY2hhbm5lbCAmJiAhbGlzdF9lbXB0eSgmbG9jYWwtPmNoYW5jdHhfbGlzdCkpOwotCiAJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKIH0KIAotc3RhdGljIGludCBpZWVlODAyMTFfYXNzaWduX3ZpZl9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9mcmVlX2NoYW5jdHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0JaW50IHJldDsKLQogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCk7CiAKLQlyZXQgPSBkcnZfYXNzaWduX3ZpZl9jaGFuY3R4KGxvY2FsLCBzZGF0YSwgY3R4KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCVdBUk5fT05fT05DRShpZWVlODAyMTFfY2hhbmN0eF9yZWZjb3VudChsb2NhbCwgY3R4KSAhPSAwKTsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcihzZGF0YS0+dmlmLmNoYW5jdHhfY29uZiwgJmN0eC0+Y29uZik7Ci0JY3R4LT5yZWZjb3VudCsrOwotCi0JaWVlZTgwMjExX3JlY2FsY190eHBvd2VyKHNkYXRhKTsKLQlpZWVlODAyMTFfcmVjYWxjX2NoYW5jdHhfbWluX2RlZihsb2NhbCwgY3R4KTsKLQlzZGF0YS0+dmlmLmJzc19jb25mLmlkbGUgPSBmYWxzZTsKLQotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgotCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKLQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0lETEUpOwotCi0JcmV0dXJuIDA7CisJbGlzdF9kZWxfcmN1KCZjdHgtPmxpc3QpOworCWllZWU4MDIxMV9kZWxfY2hhbmN0eChsb2NhbCwgY3R4KTsKKwlrZnJlZV9yY3UoY3R4LCByY3VfaGVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yZWNhbGNfY2hhbmN0eF9jaGFudHlwZShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKQEAgLTM4NCwzMCArNTYzLDU4IEBACiAJZHJ2X2NoYW5nZV9jaGFuY3R4KGxvY2FsLCBjaGFuY3R4LCBJRUVFODAyMTFfQ0hBTkNUWF9DSEFOR0VfUkFEQVIpOwogfQogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfdW5hc3NpZ25fdmlmX2NoYW5jdHgoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4KQorc3RhdGljIGludCBpZWVlODAyMTFfYXNzaWduX3ZpZl9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKm5ld19jdHgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNvbmY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdXJyX2N0eCA9IE5VTEw7CisJaW50IHJldCA9IDA7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCWNvbmYgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLAorCQkJCQkgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpKTsKIAotCWN0eC0+cmVmY291bnQtLTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsIE5VTEwpOworCWlmIChjb25mKSB7CisJCWN1cnJfY3R4ID0gY29udGFpbmVyX29mKGNvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7CiAKLQlzZGF0YS0+dmlmLmJzc19jb25mLmlkbGUgPSB0cnVlOworCQlkcnZfdW5hc3NpZ25fdmlmX2NoYW5jdHgobG9jYWwsIHNkYXRhLCBjdXJyX2N0eCk7CisJCWNvbmYgPSBOVUxMOworCQlsaXN0X2RlbCgmc2RhdGEtPmFzc2lnbmVkX2NoYW5jdHhfbGlzdCk7CisJfQorCisJaWYgKG5ld19jdHgpIHsKKwkJcmV0ID0gZHJ2X2Fzc2lnbl92aWZfY2hhbmN0eChsb2NhbCwgc2RhdGEsIG5ld19jdHgpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJY29uZiA9ICZuZXdfY3R4LT5jb25mOworCQlsaXN0X2FkZCgmc2RhdGEtPmFzc2lnbmVkX2NoYW5jdHhfbGlzdCwKKwkJCSAmbmV3X2N0eC0+YXNzaWduZWRfdmlmcyk7CisJfQorCitvdXQ6CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLCBjb25mKTsKKworCXNkYXRhLT52aWYuYnNzX2NvbmYuaWRsZSA9ICFjb25mOworCisJaWYgKGN1cnJfY3R4ICYmIGllZWU4MDIxMV9jaGFuY3R4X251bV9hc3NpZ25lZChsb2NhbCwgY3Vycl9jdHgpID4gMCkgeworCQlpZWVlODAyMTFfcmVjYWxjX2NoYW5jdHhfY2hhbnR5cGUobG9jYWwsIGN1cnJfY3R4KTsKKwkJaWVlZTgwMjExX3JlY2FsY19zbXBzX2NoYW5jdHgobG9jYWwsIGN1cnJfY3R4KTsKKwkJaWVlZTgwMjExX3JlY2FsY19yYWRhcl9jaGFuY3R4KGxvY2FsLCBjdXJyX2N0eCk7CisJCWllZWU4MDIxMV9yZWNhbGNfY2hhbmN0eF9taW5fZGVmKGxvY2FsLCBjdXJyX2N0eCk7CisJfQorCisJaWYgKG5ld19jdHggJiYgaWVlZTgwMjExX2NoYW5jdHhfbnVtX2Fzc2lnbmVkKGxvY2FsLCBuZXdfY3R4KSA+IDApIHsKKwkJaWVlZTgwMjExX3JlY2FsY190eHBvd2VyKHNkYXRhKTsKKwkJaWVlZTgwMjExX3JlY2FsY19jaGFuY3R4X21pbl9kZWYobG9jYWwsIG5ld19jdHgpOworCX0KIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgogCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKLQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0lETEUpOworCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwKKwkJCQkJCSBCU1NfQ0hBTkdFRF9JRExFKTsKIAotCWRydl91bmFzc2lnbl92aWZfY2hhbmN0eChsb2NhbCwgc2RhdGEsIGN0eCk7Ci0KLQlpZiAoY3R4LT5yZWZjb3VudCA+IDApIHsKLQkJaWVlZTgwMjExX3JlY2FsY19jaGFuY3R4X2NoYW50eXBlKHNkYXRhLT5sb2NhbCwgY3R4KTsKLQkJaWVlZTgwMjExX3JlY2FsY19zbXBzX2NoYW5jdHgobG9jYWwsIGN0eCk7Ci0JCWllZWU4MDIxMV9yZWNhbGNfcmFkYXJfY2hhbmN0eChsb2NhbCwgY3R4KTsKLQkJaWVlZTgwMjExX3JlY2FsY19jaGFuY3R4X21pbl9kZWYobG9jYWwsIGN0eCk7Ci0JfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3ZpZl9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCkBAIC00MjUsOCArNjMyLDExIEBACiAKIAljdHggPSBjb250YWluZXJfb2YoY29uZiwgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4LCBjb25mKTsKIAotCWllZWU4MDIxMV91bmFzc2lnbl92aWZfY2hhbmN0eChzZGF0YSwgY3R4KTsKLQlpZiAoY3R4LT5yZWZjb3VudCA9PSAwKQorCWlmIChzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eCkKKwkJaWVlZTgwMjExX3ZpZl91bnJlc2VydmVfY2hhbmN0eChzZGF0YSk7CisKKwlpZWVlODAyMTFfYXNzaWduX3ZpZl9jaGFuY3R4KHNkYXRhLCBOVUxMKTsKKwlpZiAoaWVlZTgwMjExX2NoYW5jdHhfcmVmY291bnQobG9jYWwsIGN0eCkgPT0gMCkKIAkJaWVlZTgwMjExX2ZyZWVfY2hhbmN0eChsb2NhbCwgY3R4KTsKIH0KIApAQCAtNTI2LDYgKzczNiw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7CisJdTggcmFkYXJfZGV0ZWN0X3dpZHRoID0gMDsKIAlpbnQgcmV0OwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CkBAIC01MzMsNiArNzQ0LDIyIEBACiAJV0FSTl9PTihzZGF0YS0+ZGV2ICYmIG5ldGlmX2NhcnJpZXJfb2soc2RhdGEtPmRldikpOwogCiAJbXV0ZXhfbG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCXJldCA9IGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKGxvY2FsLT5ody53aXBoeSwKKwkJCQkJICAgIGNoYW5kZWYsCisJCQkJCSAgICBzZGF0YS0+d2Rldi5pZnR5cGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmV0ID4gMCkKKwkJcmFkYXJfZGV0ZWN0X3dpZHRoID0gQklUKGNoYW5kZWYtPndpZHRoKTsKKworCXNkYXRhLT5yYWRhcl9yZXF1aXJlZCA9IHJldDsKKworCXJldCA9IGllZWU4MDIxMV9jaGVja19jb21iaW5hdGlvbnMoc2RhdGEsIGNoYW5kZWYsIG1vZGUsCisJCQkJCSAgIHJhZGFyX2RldGVjdF93aWR0aCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCiAJX19pZWVlODAyMTFfdmlmX3JlbGVhc2VfY2hhbm5lbChzZGF0YSk7CiAKIAljdHggPSBpZWVlODAyMTFfZmluZF9jaGFuY3R4KGxvY2FsLCBjaGFuZGVmLCBtb2RlKTsKQEAgLTU0OCw3ICs3NzUsNyBAQAogCXJldCA9IGllZWU4MDIxMV9hc3NpZ25fdmlmX2NoYW5jdHgoc2RhdGEsIGN0eCk7CiAJaWYgKHJldCkgewogCQkvKiBpZiBhc3NpZ24gZmFpbHMgcmVmY291bnQgc3RheXMgdGhlIHNhbWUgKi8KLQkJaWYgKGN0eC0+cmVmY291bnQgPT0gMCkKKwkJaWYgKGllZWU4MDIxMV9jaGFuY3R4X3JlZmNvdW50KGxvY2FsLCBjdHgpID09IDApCiAJCQlpZWVlODAyMTFfZnJlZV9jaGFuY3R4KGxvY2FsLCBjdHgpOwogCQlnb3RvIG91dDsKIAl9CkBAIC01NjAsMzkgKzc4NywyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpZWVlODAyMTFfdmlmX2NoYW5nZV9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCSB1MzIgKmNoYW5nZWQpCitzdGF0aWMgaW50IF9faWVlZTgwMjExX3ZpZl9jaGFuZ2VfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eCwKKwkJCQkJICB1MzIgKmNoYW5nZWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7CiAJY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmID0gJnNkYXRhLT5jc2FfY2hhbmRlZjsKLQlpbnQgcmV0OwogCXUzMiBjaGFuY3R4X2NoYW5nZWQgPSAwOwogCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7Ci0KLQkvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGlmIG5vdCBwZXJmb3JtaW5nIGEgY2hhbm5lbCBzd2l0Y2guICovCi0JaWYgKFdBUk5fT04oIXNkYXRhLT52aWYuY3NhX2FjdGl2ZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKCFjZmc4MDIxMV9jaGFuZGVmX3VzYWJsZShzZGF0YS0+bG9jYWwtPmh3LndpcGh5LCBjaGFuZGVmLAogCQkJCSAgICAgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7Ci0JY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCi0JCQkJCSBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCkpOwotCWlmICghY29uZikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQljdHggPSBjb250YWluZXJfb2YoY29uZiwgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4LCBjb25mKTsKLQlpZiAoY3R4LT5yZWZjb3VudCAhPSAxKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoaWVlZTgwMjExX2NoYW5jdHhfcmVmY291bnQobG9jYWwsIGN0eCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc2RhdGEtPnZpZi5ic3NfY29uZi5jaGFuZGVmLndpZHRoICE9IGNoYW5kZWYtPndpZHRoKSB7CiAJCWNoYW5jdHhfY2hhbmdlZCA9IElFRUU4MDIxMV9DSEFOQ1RYX0NIQU5HRV9XSURUSDsKQEAgLTYxMCwxMiArODE4LDIyNCBAQAogCWllZWU4MDIxMV9yZWNhbGNfcmFkYXJfY2hhbmN0eChsb2NhbCwgY3R4KTsKIAlpZWVlODAyMTFfcmVjYWxjX2NoYW5jdHhfbWluX2RlZihsb2NhbCwgY3R4KTsKIAotCXJldCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdmlmX2NoYW5nZV9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSB1MzIgKmNoYW5nZWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNvbmY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOworCisJLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpZiBub3QgcGVyZm9ybWluZyBhIGNoYW5uZWwgc3dpdGNoLiAqLworCWlmIChXQVJOX09OKCFzZGF0YS0+dmlmLmNzYV9hY3RpdmUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCisJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCkpOworCWlmICghY29uZikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwljdHggPSBjb250YWluZXJfb2YoY29uZiwgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4LCBjb25mKTsKKworCXJldCA9IF9faWVlZTgwMjExX3ZpZl9jaGFuZ2VfY2hhbm5lbChzZGF0YSwgY3R4LCBjaGFuZ2VkKTsKICBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkCitfX2llZWU4MDIxMV92aWZfY29weV9jaGFuY3R4X3RvX3ZsYW5zKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgIGJvb2wgY2xlYXIpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgX19tYXliZV91bnVzZWQgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqdmxhbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY29uZjsKKworCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkpCisJCXJldHVybjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOworCisJLyogQ2hlY2sgdGhhdCBjb25mIGV4aXN0cywgZXZlbiB3aGVuIGNsZWFyaW5nIHRoaXMgZnVuY3Rpb24KKwkgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBBUCdzIGNoYW5uZWwgY29udGV4dCBzdGlsbCB0aGVyZQorCSAqIGFzIGl0IHdvdWxkIG90aGVyd2lzZSBjYXVzZSBWTEFOcyB0byBoYXZlIGFuIGludmFsaWQKKwkgKiBjaGFubmVsIGNvbnRleHQgcG9pbnRlciBmb3IgYSB3aGlsZSwgcG9zc2libHkgcG9pbnRpbmcKKwkgKiB0byBhIGNoYW5uZWwgY29udGV4dCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuCisJICovCisJY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCisJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCkpOworCVdBUk5fT04oIWNvbmYpOworCisJaWYgKGNsZWFyKQorCQljb25mID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJnNkYXRhLT51LmFwLnZsYW5zLCB1LnZsYW4ubGlzdCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHZsYW4tPnZpZi5jaGFuY3R4X2NvbmYsIGNvbmYpOworfQorCit2b2lkIGllZWU4MDIxMV92aWZfY29weV9jaGFuY3R4X3RvX3ZsYW5zKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQkgYm9vbCBjbGVhcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKworCW11dGV4X2xvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisKKwlfX2llZWU4MDIxMV92aWZfY29weV9jaGFuY3R4X3RvX3ZsYW5zKHNkYXRhLCBjbGVhcik7CisKKwltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7Cit9CisKK2ludCBpZWVlODAyMTFfdmlmX3VucmVzZXJ2ZV9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4ID0gc2RhdGEtPnJlc2VydmVkX2NoYW5jdHg7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzZGF0YS0+bG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWlmIChXQVJOX09OKCFjdHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZGVsKCZzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eF9saXN0KTsKKwlzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eCA9IE5VTEw7CisKKwlpZiAoaWVlZTgwMjExX2NoYW5jdHhfcmVmY291bnQoc2RhdGEtPmxvY2FsLCBjdHgpID09IDApCisJCWllZWU4MDIxMV9mcmVlX2NoYW5jdHgoc2RhdGEtPmxvY2FsLCBjdHgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdmlmX3Jlc2VydmVfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkgIGVudW0gaWVlZTgwMjExX2NoYW5jdHhfbW9kZSBtb2RlLAorCQkJCSAgYm9vbCByYWRhcl9yZXF1aXJlZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKm5ld19jdHgsICpjdXJyX2N0eDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisKKwljb25mID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzZGF0YS0+dmlmLmNoYW5jdHhfY29uZiwKKwkJCQkJIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KSk7CisJaWYgKCFjb25mKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWN1cnJfY3R4ID0gY29udGFpbmVyX29mKGNvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7CisKKwluZXdfY3R4ID0gaWVlZTgwMjExX2ZpbmRfcmVzZXJ2YXRpb25fY2hhbmN0eChsb2NhbCwgY2hhbmRlZiwgbW9kZSk7CisJaWYgKCFuZXdfY3R4KSB7CisJCWlmIChpZWVlODAyMTFfY2hhbmN0eF9yZWZjb3VudChsb2NhbCwgY3Vycl9jdHgpID09IDEgJiYKKwkJICAgIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfQ0hBTkdFX1JVTk5JTkdfQ0hBTkNUWCkpIHsKKwkJCS8qIGlmIHdlJ3JlIHRoZSBvbmx5IHVzZXJzIG9mIHRoZSBjaGFuY3R4IGFuZAorCQkJICogdGhlIGRyaXZlciBzdXBwb3J0cyBjaGFuZ2luZyBhIHJ1bm5pbmcKKwkJCSAqIGNvbnRleHQsIHJlc2VydmUgb3VyIGN1cnJlbnQgY29udGV4dAorCQkJICovCisJCQluZXdfY3R4ID0gY3Vycl9jdHg7CisJCX0gZWxzZSBpZiAoaWVlZTgwMjExX2Nhbl9jcmVhdGVfbmV3X2NoYW5jdHgobG9jYWwpKSB7CisJCQkvKiBjcmVhdGUgYSBuZXcgY29udGV4dCBhbmQgcmVzZXJ2ZSBpdCAqLworCQkJbmV3X2N0eCA9IGllZWU4MDIxMV9uZXdfY2hhbmN0eChsb2NhbCwgY2hhbmRlZiwgbW9kZSk7CisJCQlpZiAoSVNfRVJSKG5ld19jdHgpKSB7CisJCQkJcmV0ID0gUFRSX0VSUihuZXdfY3R4KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbGlzdF9hZGQoJnNkYXRhLT5yZXNlcnZlZF9jaGFuY3R4X2xpc3QsICZuZXdfY3R4LT5yZXNlcnZlZF92aWZzKTsKKwlzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eCA9IG5ld19jdHg7CisJc2RhdGEtPnJlc2VydmVkX2NoYW5kZWYgPSAqY2hhbmRlZjsKKwlzZGF0YS0+cmVzZXJ2ZWRfcmFkYXJfcmVxdWlyZWQgPSByYWRhcl9yZXF1aXJlZDsKK291dDoKKwltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV92aWZfdXNlX3Jlc2VydmVkX2NvbnRleHQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHUzMiAqY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN0eDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKm9sZF9jdHg7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNvbmY7CisJaW50IHJldDsKKwl1MzIgdG1wX2NoYW5nZWQgPSAqY2hhbmdlZDsKKworCS8qIFRPRE86IG5lZWQgdG8gcmVjaGVjayBpZiB0aGUgY2hhbmRlZiBpcyB1c2FibGUgZXRjLj8gKi8KKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWN0eCA9IHNkYXRhLT5yZXNlcnZlZF9jaGFuY3R4OworCWlmIChXQVJOX09OKCFjdHgpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWNvbmYgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLAorCQkJCQkgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpKTsKKwlpZiAoIWNvbmYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJb2xkX2N0eCA9IGNvbnRhaW5lcl9vZihjb25mLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHgsIGNvbmYpOworCisJaWYgKHNkYXRhLT52aWYuYnNzX2NvbmYuY2hhbmRlZi53aWR0aCAhPSBzZGF0YS0+cmVzZXJ2ZWRfY2hhbmRlZi53aWR0aCkKKwkJdG1wX2NoYW5nZWQgfD0gQlNTX0NIQU5HRURfQkFORFdJRFRIOworCisJc2RhdGEtPnZpZi5ic3NfY29uZi5jaGFuZGVmID0gc2RhdGEtPnJlc2VydmVkX2NoYW5kZWY7CisKKwkvKiB1bnJlZiBvdXIgcmVzZXJ2YXRpb24gKi8KKwlzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eCA9IE5VTEw7CisJc2RhdGEtPnJhZGFyX3JlcXVpcmVkID0gc2RhdGEtPnJlc2VydmVkX3JhZGFyX3JlcXVpcmVkOworCWxpc3RfZGVsKCZzZGF0YS0+cmVzZXJ2ZWRfY2hhbmN0eF9saXN0KTsKKworCWlmIChvbGRfY3R4ID09IGN0eCkgeworCQkvKiBUaGlzIGlzIG91ciBvd24gY29udGV4dCwganVzdCBjaGFuZ2UgaXQgKi8KKwkJcmV0ID0gX19pZWVlODAyMTFfdmlmX2NoYW5nZV9jaGFubmVsKHNkYXRhLCBvbGRfY3R4LAorCQkJCQkJICAgICAmdG1wX2NoYW5nZWQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gaWVlZTgwMjExX2Fzc2lnbl92aWZfY2hhbmN0eChzZGF0YSwgY3R4KTsKKwkJaWYgKGllZWU4MDIxMV9jaGFuY3R4X3JlZmNvdW50KGxvY2FsLCBvbGRfY3R4KSA9PSAwKQorCQkJaWVlZTgwMjExX2ZyZWVfY2hhbmN0eChsb2NhbCwgb2xkX2N0eCk7CisJCWlmIChyZXQpIHsKKwkJCS8qIGlmIGFzc2lnbiBmYWlscyByZWZjb3VudCBzdGF5cyB0aGUgc2FtZSAqLworCQkJaWYgKGllZWU4MDIxMV9jaGFuY3R4X3JlZmNvdW50KGxvY2FsLCBjdHgpID09IDApCisJCQkJaWVlZTgwMjExX2ZyZWVfY2hhbmN0eChsb2NhbCwgY3R4KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKKwkJCV9faWVlZTgwMjExX3ZpZl9jb3B5X2NoYW5jdHhfdG9fdmxhbnMoc2RhdGEsIGZhbHNlKTsKKwl9CisKKwkqY2hhbmdlZCA9IHRtcF9jaGFuZ2VkOworCisJaWVlZTgwMjExX3JlY2FsY19jaGFuY3R4X2NoYW50eXBlKGxvY2FsLCBjdHgpOworCWllZWU4MDIxMV9yZWNhbGNfc21wc19jaGFuY3R4KGxvY2FsLCBjdHgpOworCWllZWU4MDIxMV9yZWNhbGNfcmFkYXJfY2hhbmN0eChsb2NhbCwgY3R4KTsKKwlpZWVlODAyMTFfcmVjYWxjX2NoYW5jdHhfbWluX2RlZihsb2NhbCwgY3R4KTsKK291dDoKKwltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJcmV0dXJuIHJldDsKK30KKwogaW50IGllZWU4MDIxMV92aWZfY2hhbmdlX2JhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYsCiAJCQkJICAgdTMyICpjaGFuZ2VkKQpAQCAtNjk1LDQwICsxMTE1LDYgQEAKIAltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX3ZpZl9jb3B5X2NoYW5jdHhfdG9fdmxhbnMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSBib29sIGNsZWFyKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnZsYW47Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNvbmY7Ci0KLQlBU1NFUlRfUlROTCgpOwotCi0JaWYgKFdBUk5fT04oc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKLQotCS8qCi0JICogQ2hlY2sgdGhhdCBjb25mIGV4aXN0cywgZXZlbiB3aGVuIGNsZWFyaW5nIHRoaXMgZnVuY3Rpb24KLQkgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBBUCdzIGNoYW5uZWwgY29udGV4dCBzdGlsbCB0aGVyZQotCSAqIGFzIGl0IHdvdWxkIG90aGVyd2lzZSBjYXVzZSBWTEFOcyB0byBoYXZlIGFuIGludmFsaWQKLQkgKiBjaGFubmVsIGNvbnRleHQgcG9pbnRlciBmb3IgYSB3aGlsZSwgcG9zc2libHkgcG9pbnRpbmcKLQkgKiB0byBhIGNoYW5uZWwgY29udGV4dCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuCi0JICovCi0JY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCi0JCQkJbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpKTsKLQlXQVJOX09OKCFjb25mKTsKLQotCWlmIChjbGVhcikKLQkJY29uZiA9IE5VTEw7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZzZGF0YS0+dS5hcC52bGFucywgdS52bGFuLmxpc3QpCi0JCXJjdV9hc3NpZ25fcG9pbnRlcih2bGFuLT52aWYuY2hhbmN0eF9jb25mLCBjb25mKTsKLQotCW11dGV4X3VubG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKLX0KLQogdm9pZCBpZWVlODAyMTFfaXRlcl9jaGFuX2NvbnRleHRzX2F0b21pYygKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAl2b2lkICgqaXRlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwppbmRleCBmYTE2ZTU0Li4wZTk2M2JjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCWlmICghc3RyY21wKGJ1ZiwgVFhfTEFURU5DWV9ESVNBQkxFRCkpIHsKIAkJaWYgKCF0eF9sYXRlbmN5KQogCQkJZ290byB1bmxvY2s7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+dHhfbGF0ZW5jeSwgTlVMTCk7CisJCVJDVV9JTklUX1BPSU5URVIobG9jYWwtPnR4X2xhdGVuY3ksIE5VTEwpOwogCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJa2ZyZWUodHhfbGF0ZW5jeSk7CiAJCWdvdG8gdW5sb2NrOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnMuaCBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmgKaW5kZXggMjE0ZWQ0ZS4uNjBjMzVhZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnMuaAorKysgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX01BQzgwMjExX0RFQlVHRlNfSAogI2RlZmluZSBfX01BQzgwMjExX0RFQlVHRlNfSAogCisjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKKwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiB2b2lkIGRlYnVnZnNfaHdfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKIGludCBfX3ByaW50Zig0LCA1KSBtYWM4MDIxMV9mb3JtYXRfYnVmZmVyKGNoYXIgX191c2VyICp1c2VyYnVmLCBzaXplX3QgY291bnQsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jCmluZGV4IDQwYTY0ODkuLmUyMDVlYmEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jCkBAIC0zNCw4ICszNCw3IEBACiAJc3NpemVfdCByZXQgPSAtRUlOVkFMOwogCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKLQlpZiAoc2RhdGEtPmRldi0+cmVnX3N0YXRlID09IE5FVFJFR19SRUdJU1RFUkVEKQotCQlyZXQgPSAoKmZvcm1hdCkoc2RhdGEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldCA9ICgqZm9ybWF0KShzZGF0YSwgYnVmLCBzaXplb2YoYnVmKSk7CiAJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwogCiAJaWYgKHJldCA+PSAwKQpAQCAtNjIsOCArNjEsNyBAQAogCiAJcmV0ID0gLUVOT0RFVjsKIAlydG5sX2xvY2soKTsKLQlpZiAoc2RhdGEtPmRldi0+cmVnX3N0YXRlID09IE5FVFJFR19SRUdJU1RFUkVEKQotCQlyZXQgPSAoKndyaXRlKShzZGF0YSwgYnVmLCBjb3VudCk7CisJcmV0ID0gKCp3cml0ZSkoc2RhdGEsIGJ1ZiwgY291bnQpOwogCXJ0bmxfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmggYi9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuaAppbmRleCA3OTAyNWU3OS4uOWY1NTAxYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmgKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmgKQEAgLTMsNiArMyw4IEBACiAjaWZuZGVmIF9fSUVFRTgwMjExX0RFQlVHRlNfTkVUREVWX0gKICNkZWZpbmUgX19JRUVFODAyMTFfREVCVUdGU19ORVRERVZfSAogCisjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKKwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiB2b2lkIGllZWU4MDIxMV9kZWJ1Z2ZzX2FkZF9uZXRkZXYoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfZGVidWdmc19yZW1vdmVfbmV0ZGV2KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCmluZGV4IGZjNjg5ZjUuLmJkNzgyZGMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaApAQCAtNSwxMSArNSwxMSBAQAogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAidHJhY2UuaCIKIAotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NkYXRhX2luX2RyaXZlcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19zZGF0YV9pbl9kcml2ZXIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0JV0FSTighKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9JTl9EUklWRVIpLAotCSAgICAgIiVzOiAgRmFpbGVkIGNoZWNrLXNkYXRhLWluLWRyaXZlciBjaGVjaywgZmxhZ3M6IDB4JXhcbiIsCi0JICAgICBzZGF0YS0+ZGV2ID8gc2RhdGEtPmRldi0+bmFtZSA6IHNkYXRhLT5uYW1lLCBzZGF0YS0+ZmxhZ3MpOworCXJldHVybiAhV0FSTighKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9JTl9EUklWRVIpLAorCQkgICAgICIlczogIEZhaWxlZCBjaGVjay1zZGF0YS1pbi1kcml2ZXIgY2hlY2ssIGZsYWdzOiAweCV4XG4iLAorCQkgICAgIHNkYXRhLT5kZXYgPyBzZGF0YS0+ZGV2LT5uYW1lIDogc2RhdGEtPm5hbWUsIHNkYXRhLT5mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqCkBAIC0xNjgsNyArMTY4LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfY2hhbmdlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEsIHR5cGUsIHAycCk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+Y2hhbmdlX2ludGVyZmFjZSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgdHlwZSwgcDJwKTsKQEAgLTE4MSw3ICsxODIsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKIAlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmKTsKQEAgLTIxOSw3ICsyMjEsOCBAQAogCQkJIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSkKIAkJcmV0dXJuOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKIAogCXRyYWNlX2Rydl9ic3NfaW5mb19jaGFuZ2VkKGxvY2FsLCBzZGF0YSwgaW5mbywgY2hhbmdlZCk7CiAJaWYgKGxvY2FsLT5vcHMtPmJzc19pbmZvX2NoYW5nZWQpCkBAIC0yNzgsNyArMjgxLDggQEAKIAltaWdodF9zbGVlcCgpOwogCiAJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfc2V0X2tleShsb2NhbCwgY21kLCBzZGF0YSwgc3RhLCBrZXkpOwogCXJldCA9IGxvY2FsLT5vcHMtPnNldF9rZXkoJmxvY2FsLT5odywgY21kLCAmc2RhdGEtPnZpZiwgc3RhLCBrZXkpOwpAQCAtMjk4LDcgKzMwMiw4IEBACiAJCWlzdGEgPSAmc3RhLT5zdGE7CiAKIAlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOwotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CiAKIAl0cmFjZV9kcnZfdXBkYXRlX3RraXBfa2V5KGxvY2FsLCBzZGF0YSwgY29uZiwgaXN0YSwgaXYzMik7CiAJaWYgKGxvY2FsLT5vcHMtPnVwZGF0ZV90a2lwX2tleSkKQEAgLTMxNSw3ICszMjAsOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm4gLUVJTzsKIAogCXRyYWNlX2Rydl9od19zY2FuKGxvY2FsLCBzZGF0YSk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+aHdfc2NhbigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgcmVxKTsKQEAgLTMyOCw3ICszMzQsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X2NhbmNlbF9od19zY2FuKGxvY2FsLCBzZGF0YSk7CiAJbG9jYWwtPm9wcy0+Y2FuY2VsX2h3X3NjYW4oJmxvY2FsLT5odywgJnNkYXRhLT52aWYpOwpAQCAtMzQ1LDcgKzM1Miw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybiAtRUlPOwogCiAJdHJhY2VfZHJ2X3NjaGVkX3NjYW5fc3RhcnQobG9jYWwsIHNkYXRhKTsKIAlyZXQgPSBsb2NhbC0+b3BzLT5zY2hlZF9zY2FuX3N0YXJ0KCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLApAQCAtMzYxLDcgKzM2OSw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybiAtRUlPOwogCiAJdHJhY2VfZHJ2X3NjaGVkX3NjYW5fc3RvcChsb2NhbCwgc2RhdGEpOwogCXJldCA9IGxvY2FsLT5vcHMtPnNjaGVkX3NjYW5fc3RvcCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CkBAIC00NjIsNyArNDcxLDggQEAKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X3N0YV9ub3RpZnkobG9jYWwsIHNkYXRhLCBjbWQsIHN0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpCkBAIC00NzksNyArNDg5LDggQEAKIAltaWdodF9zbGVlcCgpOwogCiAJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsIHN0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9hZGQpCkBAIC00OTcsNyArNTA4LDggQEAKIAltaWdodF9zbGVlcCgpOwogCiAJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X3N0YV9yZW1vdmUobG9jYWwsIHNkYXRhLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKQpAQCAtNTE1LDcgKzUyNyw4IEBACiAJbWlnaHRfc2xlZXAoKTsKIAogCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7Ci0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKIAogCWlmIChsb2NhbC0+b3BzLT5zdGFfYWRkX2RlYnVnZnMpCiAJCWxvY2FsLT5vcHMtPnN0YV9hZGRfZGVidWdmcygmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwKQEAgLTU0NSw3ICs1NTgsOCBAQAogCW1pZ2h0X3NsZWVwKCk7CiAKIAlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOwotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CiAKIAl0cmFjZV9kcnZfc3RhX3ByZV9yY3VfcmVtb3ZlKGxvY2FsLCBzZGF0YSwgJnN0YS0+c3RhKTsKIAlpZiAobG9jYWwtPm9wcy0+c3RhX3ByZV9yY3VfcmVtb3ZlKQpAQCAtNTY2LDcgKzU4MCw4IEBACiAJbWlnaHRfc2xlZXAoKTsKIAogCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7Ci0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybiAtRUlPOwogCiAJdHJhY2VfZHJ2X3N0YV9zdGF0ZShsb2NhbCwgc2RhdGEsICZzdGEtPnN0YSwgb2xkX3N0YXRlLCBuZXdfc3RhdGUpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfc3RhdGUpIHsKQEAgLTU5MCw3ICs2MDUsOCBAQAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGNoYW5nZWQpCiB7CiAJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJV0FSTl9PTihjaGFuZ2VkICYgSUVFRTgwMjExX1JDX1NVUFBfUkFURVNfQ0hBTkdFRCAmJgogCQkoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCkBAIC02MTIsNyArNjI4LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfY29uZl90eChsb2NhbCwgc2RhdGEsIGFjLCBwYXJhbXMpOwogCWlmIChsb2NhbC0+b3BzLT5jb25mX3R4KQpAQCAtNjI5LDcgKzY0Niw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybiByZXQ7CiAKIAl0cmFjZV9kcnZfZ2V0X3RzZihsb2NhbCwgc2RhdGEpOwogCWlmIChsb2NhbC0+b3BzLT5nZXRfdHNmKQpAQCAtNjQ0LDcgKzY2Miw4IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CiAKIAl0cmFjZV9kcnZfc2V0X3RzZihsb2NhbCwgc2RhdGEsIHRzZik7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF90c2YpCkBAIC02NTcsNyArNjc2LDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKIAogCXRyYWNlX2Rydl9yZXNldF90c2YobG9jYWwsIHNkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+cmVzZXRfdHNmKQpAQCAtNjg5LDcgKzcwOSw4IEBACiAJbWlnaHRfc2xlZXAoKTsKIAogCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7Ci0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybiAtRUlPOwogCiAJdHJhY2VfZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc2RhdGEsIGFjdGlvbiwgc3RhLCB0aWQsIHNzbiwgYnVmX3NpemUpOwogCkBAIC03MjYsMTMgKzc0NywxOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgICAgdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBzZGF0YSA/ICZzZGF0YS0+dmlmIDogTlVMTDsKKwogCW1pZ2h0X3NsZWVwKCk7CiAKKwlpZiAoc2RhdGEgJiYgIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKKwogCXRyYWNlX2Rydl9mbHVzaChsb2NhbCwgcXVldWVzLCBkcm9wKTsKIAlpZiAobG9jYWwtPm9wcy0+Zmx1c2gpCi0JCWxvY2FsLT5vcHMtPmZsdXNoKCZsb2NhbC0+aHcsIHF1ZXVlcywgZHJvcCk7CisJCWxvY2FsLT5vcHMtPmZsdXNoKCZsb2NhbC0+aHcsIHZpZiwgcXVldWVzLCBkcm9wKTsKIAl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCkBAIC04NDgsNyArODc1LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfc2V0X2JpdHJhdGVfbWFzayhsb2NhbCwgc2RhdGEsIG1hc2spOwogCWlmIChsb2NhbC0+b3BzLT5zZXRfYml0cmF0ZV9tYXNrKQpAQCAtODYzLDcgKzg5MSw4IEBACiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgICAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKQogewotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CiAKIAl0cmFjZV9kcnZfc2V0X3Jla2V5X2RhdGEobG9jYWwsIHNkYXRhLCBkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+c2V0X3Jla2V5X2RhdGEpCkBAIC05MzEsNyArOTYwLDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKIAlXQVJOX09OX09OQ0Uoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwogCiAJdHJhY2VfZHJ2X21nZF9wcmVwYXJlX3R4KGxvY2FsLCBzZGF0YSk7CkBAIC05NTgsNiArOTg4LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkcnZfcmVtb3ZlX2NoYW5jdHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHgpCiB7CisJaWYgKFdBUk5fT04oIWN0eC0+ZHJpdmVyX3ByZXNlbnQpKQorCQlyZXR1cm47CisKIAl0cmFjZV9kcnZfcmVtb3ZlX2NoYW5jdHgobG9jYWwsIGN0eCk7CiAJaWYgKGxvY2FsLT5vcHMtPnJlbW92ZV9jaGFuY3R4KQogCQlsb2NhbC0+b3BzLT5yZW1vdmVfY2hhbmN0eCgmbG9jYWwtPmh3LCAmY3R4LT5jb25mKTsKQEAgLTk4Myw3ICsxMDE2LDggQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm4gLUVJTzsKIAogCXRyYWNlX2Rydl9hc3NpZ25fdmlmX2NoYW5jdHgobG9jYWwsIHNkYXRhLCBjdHgpOwogCWlmIChsb2NhbC0+b3BzLT5hc3NpZ25fdmlmX2NoYW5jdHgpIHsKQEAgLTEwMDEsNyArMTAzNSw4IEBACiAJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4KQogewotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CiAKIAl0cmFjZV9kcnZfdW5hc3NpZ25fdmlmX2NoYW5jdHgobG9jYWwsIHNkYXRhLCBjdHgpOwogCWlmIChsb2NhbC0+b3BzLT51bmFzc2lnbl92aWZfY2hhbmN0eCkgewpAQCAtMTAxMywxMiArMTA0OCw2NiBAQAogCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitkcnZfc3dpdGNoX3ZpZl9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWZfY2hhbmN0eF9zd2l0Y2ggKnZpZnMsCisJCSAgICAgICBpbnQgbl92aWZzLAorCQkgICAgICAgZW51bSBpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hfbW9kZSBtb2RlKQoreworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKCFsb2NhbC0+b3BzLT5zd2l0Y2hfdmlmX2NoYW5jdHgpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWZvciAoaSA9IDA7IGkgPCBuX3ZpZnM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKm5ld19jdHggPQorCQkJY29udGFpbmVyX29mKHZpZnNbaV0ubmV3X2N0eCwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwKKwkJCQkgICAgIGNvbmYpOworCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKm9sZF9jdHggPQorCQkJY29udGFpbmVyX29mKHZpZnNbaV0ub2xkX2N0eCwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwKKwkJCQkgICAgIGNvbmYpOworCisJCVdBUk5fT05fT05DRSghb2xkX2N0eC0+ZHJpdmVyX3ByZXNlbnQpOworCQlXQVJOX09OX09OQ0UoKG1vZGUgPT0gQ0hBTkNUWF9TV01PREVfU1dBUF9DT05URVhUUyAmJgorCQkJICAgICAgbmV3X2N0eC0+ZHJpdmVyX3ByZXNlbnQpIHx8CisJCQkgICAgIChtb2RlID09IENIQU5DVFhfU1dNT0RFX1JFQVNTSUdOX1ZJRiAmJgorCQkJICAgICAgIW5ld19jdHgtPmRyaXZlcl9wcmVzZW50KSk7CisJfQorCisJdHJhY2VfZHJ2X3N3aXRjaF92aWZfY2hhbmN0eChsb2NhbCwgdmlmcywgbl92aWZzLCBtb2RlKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5zd2l0Y2hfdmlmX2NoYW5jdHgoJmxvY2FsLT5odywKKwkJCQkJICAgICB2aWZzLCBuX3ZpZnMsIG1vZGUpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOworCisJaWYgKCFyZXQgJiYgbW9kZSA9PSBDSEFOQ1RYX1NXTU9ERV9TV0FQX0NPTlRFWFRTKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuX3ZpZnM7IGkrKykgeworCQkJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpuZXdfY3R4ID0KKwkJCQljb250YWluZXJfb2Yodmlmc1tpXS5uZXdfY3R4LAorCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwKKwkJCQkJICAgICBjb25mKTsKKwkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqb2xkX2N0eCA9CisJCQkJY29udGFpbmVyX29mKHZpZnNbaV0ub2xkX2N0eCwKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHgsCisJCQkJCSAgICAgY29uZik7CisKKwkJCW5ld19jdHgtPmRyaXZlcl9wcmVzZW50ID0gdHJ1ZTsKKwkJCW9sZF9jdHgtPmRyaXZlcl9wcmVzZW50ID0gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIGludCBkcnZfc3RhcnRfYXAoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJaW50IHJldCA9IDA7CiAKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfc3RhcnRfYXAobG9jYWwsIHNkYXRhLCAmc2RhdGEtPnZpZi5ic3NfY29uZik7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YXJ0X2FwKQpAQCAtMTAzMCw3ICsxMTE5LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc3RvcF9hcChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X3N0b3BfYXAobG9jYWwsIHNkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+c3RvcF9hcCkKQEAgLTEwNTMsNyArMTE0Myw4IEBACiAJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkgICAgaW50IGtleV9pZHgpCiB7Ci0JY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKIAogCVdBUk5fT05fT05DRShrZXlfaWR4IDwgLTEgfHwga2V5X2lkeCA+IDMpOwogCkBAIC0xMDk1LDcgKzExODYsOCBAQAogCWludCByZXQgPSAwOwogCiAJbWlnaHRfc2xlZXAoKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuIC1FSU87CiAKIAl0cmFjZV9kcnZfam9pbl9pYnNzKGxvY2FsLCBzZGF0YSwgJnNkYXRhLT52aWYuYnNzX2NvbmYpOwogCWlmIChsb2NhbC0+b3BzLT5qb2luX2lic3MpCkBAIC0xMTA4LDcgKzEyMDAsOCBAQAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKKwkJcmV0dXJuOwogCiAJdHJhY2VfZHJ2X2xlYXZlX2lic3MobG9jYWwsIHNkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+bGVhdmVfaWJzcykKQEAgLTExMTYsNCArMTIwOSwxNyBAQAogCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIGRydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwl1MzIgcmV0ID0gMDsKKworCXRyYWNlX2Rydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpOworCWlmIChsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKKwkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3UzMihsb2NhbCwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKICNlbmRpZiAvKiBfX01BQzgwMjExX0RSSVZFUl9PUFMgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggYzE1MGI2OC4uMTU3MDJmZjYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9odC5jCkBAIC0zMSw2ICszMSwxOCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19jaGVja19odGNhcF9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCisJCQkJICB1MTYgZmxhZykKK3sKKwlfX2xlMTYgbGVfZmxhZyA9IGNwdV90b19sZTE2KGZsYWcpOworCisJaWYgKChodF9jYXBhX21hc2stPmNhcF9pbmZvICYgbGVfZmxhZykgJiYKKwkgICAgKGh0X2NhcGEtPmNhcF9pbmZvICYgbGVfZmxhZykpCisJCWh0X2NhcC0+Y2FwIHw9IGZsYWc7Cit9CisKIHZvaWQgaWVlZTgwMjExX2FwcGx5X2h0Y2FwX292ZXJyaWRlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKQogewpAQCAtNTksNyArNzEsNyBAQAogCXNtYXNrID0gKHU4ICopKCZodF9jYXBhX21hc2stPm1jcy5yeF9tYXNrKTsKIAogCS8qIE5PVEU6ICBJZiB5b3UgYWRkIG1vcmUgb3Zlci1yaWRlcyBoZXJlLCB1cGRhdGUgcmVnaXN0ZXJfaHcKLQkgKiBodF9jYXBhX21vZF9tc2sgbG9naWMgaW4gbWFpbi5jIGFzIHdlbGwuCisJICogaHRfY2FwYV9tb2RfbWFzayBsb2dpYyBpbiBtYWluLmMgYXMgd2VsbC4KIAkgKiBBbmQsIGlmIHRoaXMgbWV0aG9kIGNhbiBldmVyIGNoYW5nZSBodF9jYXAuaHRfc3VwcG9ydGVkLCBmaXgKIAkgKiB0aGUgY2hlY2sgaW4gaWVlZTgwMjExX2FkZF9odF9pZS4KIAkgKi8KQEAgLTg2LDYgKzk4LDE0IEBACiAJX19jaGVja19odGNhcF9kaXNhYmxlKGh0X2NhcGEsIGh0X2NhcGFfbWFzaywgaHRfY2FwLAogCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUpOwogCisJLyogQWxsb3cgdXNlciB0byBkaXNhYmxlIExEUEMgKi8KKwlfX2NoZWNrX2h0Y2FwX2Rpc2FibGUoaHRfY2FwYSwgaHRfY2FwYV9tYXNrLCBodF9jYXAsCisJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5HKTsKKworCS8qIEFsbG93IHVzZXIgdG8gZW5hYmxlIDQwIE1IeiBpbnRvbGVyYW50IGJpdC4gKi8KKwlfX2NoZWNrX2h0Y2FwX2VuYWJsZShodF9jYXBhLCBodF9jYXBhX21hc2ssIGh0X2NhcCwKKwkJCSAgICAgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5UKTsKKwogCS8qIEFsbG93IHVzZXIgdG8gZGVjcmVhc2UgQU1QRFUgZmFjdG9yICovCiAJaWYgKGh0X2NhcGFfbWFzay0+YW1wZHVfcGFyYW1zX2luZm8gJgogCSAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IDA2ZDI4NzguLjE4ZWUwYTIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJCSpwb3MrKyA9IGNzYV9zZXR0aW5ncy0+YmxvY2tfdHggPyAxIDogMDsKIAkJKnBvcysrID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAogCQkJCWNzYV9zZXR0aW5ncy0+Y2hhbmRlZi5jaGFuLT5jZW50ZXJfZnJlcSk7Ci0JCXNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfYmVhY29uID0gKHBvcyAtIHByZXNwLT5oZWFkKTsKKwkJc2RhdGEtPmNzYV9jb3VudGVyX29mZnNldF9iZWFjb25bMF0gPSAocG9zIC0gcHJlc3AtPmhlYWQpOwogCQkqcG9zKysgPSBjc2Ffc2V0dGluZ3MtPmNvdW50OwogCX0KIApAQCAtMjI4LDcgKzIyOCw3IEBACiAJc3RydWN0IGJlYWNvbl9kYXRhICpwcmVzcDsKIAllbnVtIG5sODAyMTFfYnNzX3NjYW5fd2lkdGggc2Nhbl93aWR0aDsKIAlib29sIGhhdmVfaGlnaGVyX3RoYW5fMTFtYml0OwotCWJvb2wgcmFkYXJfcmVxdWlyZWQgPSBmYWxzZTsKKwlib29sIHJhZGFyX3JlcXVpcmVkOwogCWludCBlcnI7CiAKIAlzZGF0YV9hc3NlcnRfbG9jayhzZGF0YSk7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAogCXByZXNwID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChpZmlic3MtPnByZXNwLAogCQkJCQkgIGxvY2tkZXBfaXNfaGVsZCgmc2RhdGEtPndkZXYubXR4KSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlmaWJzcy0+cHJlc3AsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIoaWZpYnNzLT5wcmVzcCwgTlVMTCk7CiAJaWYgKHByZXNwKQogCQlrZnJlZV9yY3UocHJlc3AsIHJjdV9oZWFkKTsKIApAQCAtMjYyLDcgKzI2Miw4IEBACiAJLyogbWFrZSBhIGNvcHkgb2YgdGhlIGNoYW5kZWYsIGl0IGNvdWxkIGJlIG1vZGlmaWVkIGJlbG93LiAqLwogCWNoYW5kZWYgPSAqcmVxX2NoYW5kZWY7CiAJY2hhbiA9IGNoYW5kZWYuY2hhbjsKLQlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKGxvY2FsLT5ody53aXBoeSwgJmNoYW5kZWYpKSB7CisJaWYgKCFjZmc4MDIxMV9yZWdfY2FuX2JlYWNvbihsb2NhbC0+aHcud2lwaHksICZjaGFuZGVmLAorCQkJCSAgICAgTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7CiAJCWlmIChjaGFuZGVmLndpZHRoID09IE5MODAyMTFfQ0hBTl9XSURUSF81IHx8CiAJCSAgICBjaGFuZGVmLndpZHRoID09IE5MODAyMTFfQ0hBTl9XSURUSF8xMCB8fAogCQkgICAgY2hhbmRlZi53aWR0aCA9PSBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVCB8fApAQCAtMjc0LDcgKzI3NSw4IEBACiAJCWNoYW5kZWYud2lkdGggPSBOTDgwMjExX0NIQU5fV0lEVEhfMjA7CiAJCWNoYW5kZWYuY2VudGVyX2ZyZXExID0gY2hhbi0+Y2VudGVyX2ZyZXE7CiAJCS8qIGNoZWNrIGFnYWluIGZvciBkb3duZ3JhZGVkIGNoYW5kZWYgKi8KLQkJaWYgKCFjZmc4MDIxMV9yZWdfY2FuX2JlYWNvbihsb2NhbC0+aHcud2lwaHksICZjaGFuZGVmKSkgeworCQlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKGxvY2FsLT5ody53aXBoeSwgJmNoYW5kZWYsCisJCQkJCSAgICAgTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7CiAJCQlzZGF0YV9pbmZvKHNkYXRhLAogCQkJCSAgICJGYWlsZWQgdG8gam9pbiBJQlNTLCBiZWFjb25zIGZvcmJpZGRlblxuIik7CiAJCQlyZXR1cm47CkBAIC0yODIsMjEgKzI4NCwyMCBAQAogCX0KIAogCWVyciA9IGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHNkYXRhLT5sb2NhbC0+aHcud2lwaHksCi0JCQkJCSAgICAmY2hhbmRlZik7CisJCQkJCSAgICAmY2hhbmRlZiwgTkw4MDIxMV9JRlRZUEVfQURIT0MpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNkYXRhX2luZm8oc2RhdGEsCiAJCQkgICAiRmFpbGVkIHRvIGpvaW4gSUJTUywgaW52YWxpZCBjaGFuZGVmXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoZXJyID4gMCkgewotCQlpZiAoIWlmaWJzcy0+dXNlcnNwYWNlX2hhbmRsZXNfZGZzKSB7Ci0JCQlzZGF0YV9pbmZvKHNkYXRhLAotCQkJCSAgICJGYWlsZWQgdG8gam9pbiBJQlNTLCBERlMgY2hhbm5lbCB3aXRob3V0IGNvbnRyb2wgcHJvZ3JhbVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmFkYXJfcmVxdWlyZWQgPSB0cnVlOworCWlmIChlcnIgPiAwICYmICFpZmlic3MtPnVzZXJzcGFjZV9oYW5kbGVzX2RmcykgeworCQlzZGF0YV9pbmZvKHNkYXRhLAorCQkJICAgIkZhaWxlZCB0byBqb2luIElCU1MsIERGUyBjaGFubmVsIHdpdGhvdXQgY29udHJvbCBwcm9ncmFtXG4iKTsKKwkJcmV0dXJuOwogCX0KIAorCXJhZGFyX3JlcXVpcmVkID0gZXJyOworCiAJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CiAJaWYgKGllZWU4MDIxMV92aWZfdXNlX2NoYW5uZWwoc2RhdGEsICZjaGFuZGVmLAogCQkJCSAgICAgIGlmaWJzcy0+Zml4ZWRfY2hhbm5lbCA/CkBAIC03NzUsNyArNzc2LDggQEAKIAkgKiB1bmF2YWlsYWJsZS4KIAkgKi8KIAllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LAotCQkJCQkgICAgJmlmaWJzcy0+Y2hhbmRlZik7CisJCQkJCSAgICAmaWZpYnNzLT5jaGFuZGVmLAorCQkJCQkgICAgTkw4MDIxMV9JRlRZUEVfQURIT0MpOwogCWlmIChlcnIgPiAwKQogCQljZmc4MDIxMV9yYWRhcl9ldmVudChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LCAmaWZpYnNzLT5jaGFuZGVmLAogCQkJCSAgICAgR0ZQX0FUT01JQyk7CkBAIC04NjEsNyArODYzLDggQEAKIAkJZ290byBkaXNjb25uZWN0OwogCX0KIAotCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oc2RhdGEtPmxvY2FsLT5ody53aXBoeSwgJnBhcmFtcy5jaGFuZGVmKSkgeworCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oc2RhdGEtPmxvY2FsLT5ody53aXBoeSwgJnBhcmFtcy5jaGFuZGVmLAorCQkJCSAgICAgTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7CiAJCXNkYXRhX2luZm8oc2RhdGEsCiAJCQkgICAiSUJTUyAlcE0gc3dpdGNoZXMgdG8gdW5zdXBwb3J0ZWQgY2hhbm5lbCAoJWQgTUh6LCB3aWR0aDolZCwgQ0YxLzI6ICVkLyVkIE1IeiksIGRpc2Nvbm5lY3RpbmdcbiIsCiAJCQkgICBpZmlic3MtPmJzc2lkLApAQCAtODczLDE3ICs4NzYsMTcgQEAKIAl9CiAKIAllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LAotCQkJCQkgICAgJnBhcmFtcy5jaGFuZGVmKTsKKwkJCQkJICAgICZwYXJhbXMuY2hhbmRlZiwKKwkJCQkJICAgIE5MODAyMTFfSUZUWVBFX0FESE9DKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBkaXNjb25uZWN0OwotCWlmIChlcnIpIHsKKwlpZiAoZXJyID4gMCAmJiAhaWZpYnNzLT51c2Vyc3BhY2VfaGFuZGxlc19kZnMpIHsKIAkJLyogSUJTUy1ERlMgb25seSBhbGxvd2VkIHdpdGggYSBjb250cm9sIHByb2dyYW0gKi8KLQkJaWYgKCFpZmlic3MtPnVzZXJzcGFjZV9oYW5kbGVzX2RmcykKLQkJCWdvdG8gZGlzY29ubmVjdDsKLQotCQlwYXJhbXMucmFkYXJfcmVxdWlyZWQgPSB0cnVlOworCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJfQogCisJcGFyYW1zLnJhZGFyX3JlcXVpcmVkID0gZXJyOworCiAJaWYgKGNmZzgwMjExX2NoYW5kZWZfaWRlbnRpY2FsKCZwYXJhbXMuY2hhbmRlZiwKIAkJCQkgICAgICAgJnNkYXRhLT52aWYuYnNzX2NvbmYuY2hhbmRlZikpIHsKIAkJaWJzc19kYmcoc2RhdGEsCkBAIC0xNjM2LDcgKzE2MzksMzMgQEAKIAl1MzIgY2hhbmdlZCA9IDA7CiAJdTMyIHJhdGVfZmxhZ3M7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJZW51bSBpZWVlODAyMTFfY2hhbmN0eF9tb2RlIGNoYW5tb2RlOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCWludCByYWRhcl9kZXRlY3Rfd2lkdGggPSAwOwogCWludCBpOworCWludCByZXQ7CisKKwlyZXQgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZChsb2NhbC0+aHcud2lwaHksCisJCQkJCSAgICAmcGFyYW1zLT5jaGFuZGVmLAorCQkJCQkgICAgc2RhdGEtPndkZXYuaWZ0eXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZXQgPiAwKSB7CisJCWlmICghcGFyYW1zLT51c2Vyc3BhY2VfaGFuZGxlc19kZnMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmFkYXJfZGV0ZWN0X3dpZHRoID0gQklUKHBhcmFtcy0+Y2hhbmRlZi53aWR0aCk7CisJfQorCisJY2hhbm1vZGUgPSAocGFyYW1zLT5jaGFubmVsX2ZpeGVkICYmICFyZXQpID8KKwkJSUVFRTgwMjExX0NIQU5DVFhfU0hBUkVEIDogSUVFRTgwMjExX0NIQU5DVFhfRVhDTFVTSVZFOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKwlyZXQgPSBpZWVlODAyMTFfY2hlY2tfY29tYmluYXRpb25zKHNkYXRhLCAmcGFyYW1zLT5jaGFuZGVmLCBjaGFubW9kZSwKKwkJCQkJICAgcmFkYXJfZGV0ZWN0X3dpZHRoKTsKKwltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpZiAocGFyYW1zLT5ic3NpZCkgewogCQltZW1jcHkoc2RhdGEtPnUuaWJzcy5ic3NpZCwgcGFyYW1zLT5ic3NpZCwgRVRIX0FMRU4pOwpAQCAtMTY0OCwxMCArMTY3NywxMSBAQAogCXNkYXRhLT51Lmlic3MuY29udHJvbF9wb3J0ID0gcGFyYW1zLT5jb250cm9sX3BvcnQ7CiAJc2RhdGEtPnUuaWJzcy51c2Vyc3BhY2VfaGFuZGxlc19kZnMgPSBwYXJhbXMtPnVzZXJzcGFjZV9oYW5kbGVzX2RmczsKIAlzZGF0YS0+dS5pYnNzLmJhc2ljX3JhdGVzID0gcGFyYW1zLT5iYXNpY19yYXRlczsKKwlzZGF0YS0+dS5pYnNzLmxhc3Rfc2Nhbl9jb21wbGV0ZWQgPSBqaWZmaWVzOwogCiAJLyogZml4IGJhc2ljX3JhdGVzIGlmIGNoYW5uZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGVzZSByYXRlcyAqLwogCXJhdGVfZmxhZ3MgPSBpZWVlODAyMTFfY2hhbmRlZl9yYXRlX2ZsYWdzKCZwYXJhbXMtPmNoYW5kZWYpOwotCXNiYW5kID0gc2RhdGEtPmxvY2FsLT5ody53aXBoeS0+YmFuZHNbcGFyYW1zLT5jaGFuZGVmLmNoYW4tPmJhbmRdOworCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1twYXJhbXMtPmNoYW5kZWYuY2hhbi0+YmFuZF07CiAJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspIHsKIAkJaWYgKChyYXRlX2ZsYWdzICYgc2JhbmQtPmJpdHJhdGVzW2ldLmZsYWdzKSAhPSByYXRlX2ZsYWdzKQogCQkJc2RhdGEtPnUuaWJzcy5iYXNpY19yYXRlcyAmPSB+QklUKGkpOwpAQCAtMTcwMCw5ICsxNzMwLDkgQEAKIAlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAKIAlzZGF0YS0+c21wc19tb2RlID0gSUVFRTgwMjExX1NNUFNfT0ZGOwotCXNkYXRhLT5uZWVkZWRfcnhfY2hhaW5zID0gc2RhdGEtPmxvY2FsLT5yeF9jaGFpbnM7CisJc2RhdGEtPm5lZWRlZF9yeF9jaGFpbnMgPSBsb2NhbC0+cnhfY2hhaW5zOwogCi0JaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnNkYXRhLT5sb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmggYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAppbmRleCBmMTY5YjZlLi5hYzk4MzZlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAorKysgYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaApAQCAtMjYwLDcgKzI2MCw3IEBACiAKIAkvKiB0byBiZSB1c2VkIGFmdGVyIGNoYW5uZWwgc3dpdGNoLiAqLwogCXN0cnVjdCBjZmc4MDIxMV9iZWFjb25fZGF0YSAqbmV4dF9iZWFjb247Ci0Jc3RydWN0IGxpc3RfaGVhZCB2bGFuczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZsYW5zOyAvKiB3cml0ZS1wcm90ZWN0ZWQgd2l0aCBSVE5MIGFuZCBsb2NhbC0+bXR4ICovCiAKIAlzdHJ1Y3QgcHNfZGF0YSBwczsKIAlhdG9taWNfdCBudW1fbWNhc3Rfc3RhOyAvKiBudW1iZXIgb2Ygc3RhdGlvbnMgcmVjZWl2aW5nIG11bHRpY2FzdCAqLwpAQCAtMjc2LDcgKzI3Niw3IEBACiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2lmX3ZsYW4gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIHdyaXRlLXByb3RlY3RlZCB3aXRoIFJUTkwgYW5kIGxvY2FsLT5tdHggKi8KIAogCS8qIHVzZWQgZm9yIGFsbCB0eCBpZiB0aGUgVkxBTiBpcyBjb25maWd1cmVkIHRvIDQtYWRkciBtb2RlICovCiAJc3RydWN0IHN0YV9pbmZvIF9fcmN1ICpzdGE7CkBAIC02OTIsOCArNjkyLDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKIAorCXN0cnVjdCBsaXN0X2hlYWQgYXNzaWduZWRfdmlmczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc2VydmVkX3ZpZnM7CisKIAllbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgbW9kZTsKLQlpbnQgcmVmY291bnQ7CiAJYm9vbCBkcml2ZXJfcHJlc2VudDsKIAogCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mIGNvbmY7CkBAIC03NTIsMTEgKzc1NCwyMSBAQAogCXN0cnVjdCBtYWM4MDIxMV9xb3NfbWFwIF9fcmN1ICpxb3NfbWFwOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IGNzYV9maW5hbGl6ZV93b3JrOwotCWludCBjc2FfY291bnRlcl9vZmZzZXRfYmVhY29uOwotCWludCBjc2FfY291bnRlcl9vZmZzZXRfcHJlc3A7CisJdTE2IGNzYV9jb3VudGVyX29mZnNldF9iZWFjb25bSUVFRTgwMjExX01BWF9DU0FfQ09VTlRFUlNfTlVNXTsKKwl1MTYgY3NhX2NvdW50ZXJfb2Zmc2V0X3ByZXNwW0lFRUU4MDIxMV9NQVhfQ1NBX0NPVU5URVJTX05VTV07CiAJYm9vbCBjc2FfcmFkYXJfcmVxdWlyZWQ7CisJYm9vbCBjc2FfYmxvY2tfdHg7IC8qIHdyaXRlLXByb3RlY3RlZCBieSBzZGF0YV9sb2NrIGFuZCBsb2NhbC0+bXR4ICovCiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNzYV9jaGFuZGVmOwogCisJc3RydWN0IGxpc3RfaGVhZCBhc3NpZ25lZF9jaGFuY3R4X2xpc3Q7IC8qIHByb3RlY3RlZCBieSBjaGFuY3R4X210eCAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVzZXJ2ZWRfY2hhbmN0eF9saXN0OyAvKiBwcm90ZWN0ZWQgYnkgY2hhbmN0eF9tdHggKi8KKworCS8qIGNvbnRleHQgcmVzZXJ2YXRpb24gLS0gcHJvdGVjdGVkIHdpdGggY2hhbmN0eF9tdHggKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKnJlc2VydmVkX2NoYW5jdHg7CisJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHJlc2VydmVkX2NoYW5kZWY7CisJYm9vbCByZXNlcnZlZF9yYWRhcl9yZXF1aXJlZDsKKwl1OCBjc2FfY3VycmVudF9jb3VudGVyOworCiAJLyogdXNlZCB0byByZWNvbmZpZ3VyZSBoYXJkd2FyZSBTTSBQUyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZWNhbGNfc21wczsKIApAQCAtMTQ0OSw2ICsxNDYxLDcgQEAKIGludCBpZWVlODAyMTFfcmVxdWVzdF9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogaW50IGllZWU4MDIxMV9yZXF1ZXN0X3NjaGVkX3NjYW5fc3RvcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9zY2hlZF9zY2FuX2VuZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CiB2b2lkIGllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiBvZmYtY2hhbm5lbCBoZWxwZXJzICovCkBAIC0xNDYzLDYgKzE0NzYsNyBAQAogdm9pZCBpZWVlODAyMTFfaGFuZGxlX3JvY19zdGFydGVkKHN0cnVjdCBpZWVlODAyMTFfcm9jX3dvcmsgKnJvYyk7CiAKIC8qIGNoYW5uZWwgc3dpdGNoIGhhbmRsaW5nICovCitib29sIGllZWU4MDIxMV9jc2FfbmVlZHNfYmxvY2tfdHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfY3NhX2ZpbmFsaXplX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGludCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2goc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNmZzgwMjExX2NzYV9zZXR0aW5ncyAqcGFyYW1zKTsKQEAgLTE3NzIsNiArMTc4NiwxNiBAQAogCQkJICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYsCiAJCQkgIGVudW0gaWVlZTgwMjExX2NoYW5jdHhfbW9kZSBtb2RlKTsKIGludCBfX211c3RfY2hlY2sKK2llZWU4MDIxMV92aWZfcmVzZXJ2ZV9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJICAgICAgZW51bSBpZWVlODAyMTFfY2hhbmN0eF9tb2RlIG1vZGUsCisJCQkgICAgICBib29sIHJhZGFyX3JlcXVpcmVkKTsKK2ludCBfX211c3RfY2hlY2sKK2llZWU4MDIxMV92aWZfdXNlX3Jlc2VydmVkX2NvbnRleHQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgdTMyICpjaGFuZ2VkKTsKK2ludCBpZWVlODAyMTFfdmlmX3VucmVzZXJ2ZV9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKKworaW50IF9fbXVzdF9jaGVjawogaWVlZTgwMjExX3ZpZl9jaGFuZ2VfYmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKIAkJCSAgICAgICB1MzIgKmNoYW5nZWQpOwpAQCAtMTc4Myw2ICsxODA3LDggQEAKIHZvaWQgaWVlZTgwMjExX3ZpZl92bGFuX2NvcHlfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMV92aWZfY29weV9jaGFuY3R4X3RvX3ZsYW5zKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCQkgYm9vbCBjbGVhcik7CitpbnQgaWVlZTgwMjExX2NoYW5jdHhfcmVmY291bnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHgpOwogCiB2b2lkIGllZWU4MDIxMV9yZWNhbGNfc21wc19jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY2hhbmN0eCk7CkBAIC0xODA2LDYgKzE4MzIsMjAgQEAKIAkJCSAgZW51bSBubDgwMjExX2lmdHlwZSBpZnR5cGUpOwogdm9pZCBpZWVlODAyMTFfcmVjYWxjX2R0aW0oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CitpbnQgaWVlZTgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJCSBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgY2hhbm1vZGUsCisJCQkJIHU4IHJhZGFyX2RldGVjdCk7CitpbnQgaWVlZTgwMjExX21heF9udW1fY2hhbm5lbHMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOworCisvKiBURExTICovCitpbnQgaWVlZTgwMjExX3RkbHNfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJY29uc3QgdTggKnBlZXIsIHU4IGFjdGlvbl9jb2RlLCB1OCBkaWFsb2dfdG9rZW4sCisJCQl1MTYgc3RhdHVzX2NvZGUsIHUzMiBwZWVyX2NhcGFiaWxpdHksCisJCQljb25zdCB1OCAqZXh0cmFfaWVzLCBzaXplX3QgZXh0cmFfaWVzX2xlbik7CitpbnQgaWVlZTgwMjExX3RkbHNfb3BlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJY29uc3QgdTggKnBlZXIsIGVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKTsKKwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX05PSU5MSU5FCiAjZGVmaW5lIGRlYnVnX25vaW5saW5lIG5vaW5saW5lCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWZhY2UuYyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCmluZGV4IGI4ZDMzMWUuLjM4OGI4NjNlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWZhY2UuYworKysgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqbnNkYXRhOworCWludCByZXQ7CiAKIAlBU1NFUlRfUlROTCgpOwogCkBAIC0zMDAsNyArMzAxLDEwIEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwltdXRleF9sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCXJldCA9IGllZWU4MDIxMV9jaGVja19jb21iaW5hdGlvbnMoc2RhdGEsIE5VTEwsIDAsIDApOworCW11dGV4X3VubG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9jaGVja19xdWV1ZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC0zOTUsNiArMzk5LDcgQEAKIAlzZGF0YS0+dmlmLnR5cGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwogCXNucHJpbnRmKHNkYXRhLT5uYW1lLCBJRk5BTVNJWiwgIiVzLW1vbml0b3IiLAogCQkgd2lwaHlfbmFtZShsb2NhbC0+aHcud2lwaHkpKTsKKwlzZGF0YS0+d2Rldi5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwogCiAJc2RhdGEtPmVuY3J5cHRfaGVhZHJvb20gPSBJRUVFODAyMTFfRU5DUllQVF9IRUFEUk9PTTsKIApAQCAtNDIzLDcgKzQyOCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAlpZiAocmV0KSB7CiAJCW11dGV4X2xvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5tb25pdG9yX3NkYXRhLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsb2NhbC0+bW9uaXRvcl9zZGF0YSwgTlVMTCk7CiAJCW11dGV4X3VubG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwogCQlzeW5jaHJvbml6ZV9uZXQoKTsKIAkJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKQEAgLTQ1Miw3ICs0NTcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5tb25pdG9yX3NkYXRhLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT5tb25pdG9yX3NkYXRhLCBOVUxMKTsKIAltdXRleF91bmxvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKIAogCXN5bmNocm9uaXplX25ldCgpOwpAQCAtNDkyLDcgKzQ5Nyw5IEBACiAJCWlmICghc2RhdGEtPmJzcykKIAkJCXJldHVybiAtRU5PTElOSzsKIAorCQltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAkJbGlzdF9hZGQoJnNkYXRhLT51LnZsYW4ubGlzdCwgJnNkYXRhLT5ic3MtPnZsYW5zKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAogCQltYXN0ZXIgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1LmFwKTsKQEAgLTcyMiw4ICs3MjksMTEgQEAKIAkJZHJ2X3N0b3AobG9jYWwpOwogIGVycl9kZWxfYnNzOgogCXNkYXRhLT5ic3MgPSBOVUxMOwotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pIHsKKwkJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CiAJCWxpc3RfZGVsKCZzZGF0YS0+dS52bGFuLmxpc3QpOworCQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOworCX0KIAkvKiBtaWdodCBhbHJlYWR5IGJlIGNsZWFyIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyICovCiAJY2xlYXJfYml0KFNEQVRBX1NUQVRFX1JVTk5JTkcsICZzZGF0YS0+c3RhdGUpOwogCXJldHVybiByZXM7CkBAIC04MjksOCArODM5LDE1IEBACiAKIAljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+cmVjYWxjX3NtcHMpOwogCXNkYXRhX2xvY2soc2RhdGEpOworCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwogCXNkYXRhLT52aWYuY3NhX2FjdGl2ZSA9IGZhbHNlOworCWlmICghaWVlZTgwMjExX2NzYV9uZWVkc19ibG9ja190eChsb2NhbCkpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlc19ieV9yZWFzb24oJmxvY2FsLT5odywKKwkJCQkJSUVFRTgwMjExX01BWF9RVUVVRV9NQVAsCisJCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9DU0EpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAJc2RhdGFfdW5sb2NrKHNkYXRhKTsKKwogCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT5jc2FfZmluYWxpemVfd29yayk7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnNkYXRhLT5kZnNfY2FjX3RpbWVyX3dvcmspOwpAQCAtODc1LDggKzg5MiwxMCBAQAogCiAJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CisJCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwogCQlsaXN0X2RlbCgmc2RhdGEtPnUudmxhbi5saXN0KTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLCBOVUxMKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKKwkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dmlmLmNoYW5jdHhfY29uZiwgTlVMTCk7CiAJCS8qIG5vIG5lZWQgdG8gdGVsbCBkcml2ZXIgKi8KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgpAQCAtODk1LDcgKzkxNCw3IEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJLyogcmVsaWVzIG9uIHN5bmNocm9uaXplX3JjdSgpIGJlbG93ICovCi0JCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+cDJwX3NkYXRhLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsb2NhbC0+cDJwX3NkYXRhLCBOVUxMKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJY2FuY2VsX3dvcmtfc3luYygmc2RhdGEtPndvcmspOwpAQCAtMTI2Nyw2ICsxMjg2LDcgQEAKIAlzZGF0YS0+Y29udHJvbF9wb3J0X3Byb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfUEFFKTsKIAlzZGF0YS0+Y29udHJvbF9wb3J0X25vX2VuY3J5cHQgPSBmYWxzZTsKIAlzZGF0YS0+ZW5jcnlwdF9oZWFkcm9vbSA9IElFRUU4MDIxMV9FTkNSWVBUX0hFQURST09NOworCXNkYXRhLT52aWYuYnNzX2NvbmYuaWRsZSA9IHRydWU7CiAKIAlzZGF0YS0+bm9hY2tfbWFwID0gMDsKIApAQCAtMTI4MCw2ICsxMzAwLDggQEAKIAlJTklUX1dPUksoJnNkYXRhLT53b3JrLCBpZWVlODAyMTFfaWZhY2Vfd29yayk7CiAJSU5JVF9XT1JLKCZzZGF0YS0+cmVjYWxjX3NtcHMsIGllZWU4MDIxMV9yZWNhbGNfc21wc193b3JrKTsKIAlJTklUX1dPUksoJnNkYXRhLT5jc2FfZmluYWxpemVfd29yaywgaWVlZTgwMjExX2NzYV9maW5hbGl6ZV93b3JrKTsKKwlJTklUX0xJU1RfSEVBRCgmc2RhdGEtPmFzc2lnbmVkX2NoYW5jdHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNkYXRhLT5yZXNlcnZlZF9jaGFuY3R4X2xpc3QpOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CkBAIC0xNzU4LDcgKzE3ODAsNiBAQAogCX0KIAltdXRleF91bmxvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZ1bnJlZ19saXN0KTsKLQlsaXN0X2RlbCgmdW5yZWdfbGlzdCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2RhdGEsIHRtcCwgJndkZXZfbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbCgmc2RhdGEtPmxpc3QpOwpAQCAtMTc3NCwyMCArMTc5NSwxOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCiAJaWYgKHN0YXRlICE9IE5FVERFVl9DSEFOR0VOQU1FKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJaWYgKCFkZXYtPmllZWU4MDIxMV9wdHIgfHwgIWRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAlpZiAoZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeS0+cHJpdmlkICE9IG1hYzgwMjExX3dpcGh5X3ByaXZpZCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQogCW1lbWNweShzZGF0YS0+bmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWik7Ci0KIAlpZWVlODAyMTFfZGVidWdmc19yZW5hbWVfbmV0ZGV2KHNkYXRhKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBOT1RJRllfT0s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWFjODAyMTFfbmV0ZGV2X25vdGlmaWVyID0gewpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2tleS5jIGIvbmV0L21hYzgwMjExL2tleS5jCmluZGV4IDZmZjY1YTEuLjE2ZDk3ZjAgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9rZXkuYworKysgYi9uZXQvbWFjODAyMTEva2V5LmMKQEAgLTMyNSw3ICszMjUsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CiAJaW50IGksIGosIGVycjsKIAotCUJVR19PTihpZHggPCAwIHx8IGlkeCA+PSBOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTKTsKKwlpZiAoV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlrZXkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2tleSkgKyBrZXlfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWtleSkKQEAgLTQ4MSw4ICs0ODIsOCBAQAogCWludCBpZHgsIHJldDsKIAlib29sIHBhaXJ3aXNlOwogCi0JQlVHX09OKCFzZGF0YSk7Ci0JQlVHX09OKCFrZXkpOworCWlmIChXQVJOX09OKCFzZGF0YSB8fCAha2V5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWlyd2lzZSA9IGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRTsKIAlpZHggPSBrZXktPmNvbmYua2V5aWR4OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21haW4uYyBiL25ldC9tYWM4MDIxMS9tYWluLmMKaW5kZXggNGMxYmY2MS4uZDE3YzI2ZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21haW4uYworKysgYi9uZXQvbWFjODAyMTEvbWFpbi5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAogCXNkYXRhX3VubG9jayhzZGF0YSk7CiAKLQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9PSzsKIH0KICNlbmRpZgogCkBAIC0zNzEsNyArMzcxLDcgQEAKIAogCWRydl9pcHY2X2FkZHJfY2hhbmdlKGxvY2FsLCBzZGF0YSwgaWRldik7CiAKLQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9PSzsKIH0KICNlbmRpZgogCkBAIC00NDYsNyArNDQ2LDkgQEAKIAkuY2FwX2luZm8gPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8CiAJCQkJSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUgfAogCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCksCisJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAorCQkJCUlFRUU4MDIxMV9IVF9DQVBfTERQQ19DT0RJTkcgfAorCQkJCUlFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCksCiAJLm1jcyA9IHsKIAkJLnJ4X21hc2sgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCiAJCQkgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIH0sCkBAIC05NTQsNiArOTU2LDggQEAKIAlpZiAobG9jYWwtPmh3LndpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykKIAkJbG9jYWwtPmh3LndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1RETFNfRVhURVJOQUxfU0VUVVA7CiAKKwlsb2NhbC0+aHcud2lwaHktPm1heF9udW1fY3NhX2NvdW50ZXJzID0gSUVFRTgwMjExX01BWF9DU0FfQ09VTlRFUlNfTlVNOworCiAJcmVzdWx0ID0gd2lwaHlfcmVnaXN0ZXIobG9jYWwtPmh3LndpcGh5KTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBmYWlsX3dpcGh5X3JlZ2lzdGVyOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2guYyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKaW5kZXggZjcwZTljZC4uNjQ5NWEzZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2guYworKysgYi9uZXQvbWFjODAyMTEvbWVzaC5jCkBAIC0zNjYsMjAgKzM2NiwxNSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGZpbmQgUlNOIElFICovCi0JZGF0YSA9IGlmbXNoLT5pZTsKLQl3aGlsZSAoZGF0YSA8IGlmbXNoLT5pZSArIGlmbXNoLT5pZV9sZW4pIHsKLQkJaWYgKCpkYXRhID09IFdMQU5fRUlEX1JTTikgewotCQkJbGVuID0gZGF0YVsxXSArIDI7Ci0JCQlicmVhazsKLQkJfQotCQlkYXRhKys7Ci0JfQorCWRhdGEgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1JTTiwgaWZtc2gtPmllLCBpZm1zaC0+aWVfbGVuKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOwogCi0JaWYgKGxlbikgewotCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBsZW4pCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBkYXRhLCBsZW4pOwotCX0KKwlsZW4gPSBkYXRhWzFdICsgMjsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IGxlbikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBkYXRhLCBsZW4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODQsNyArNjc5LDcgQEAKIAkJKnBvcysrID0gMHgwOwogCQkqcG9zKysgPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCiAJCQkJY3NhLT5zZXR0aW5ncy5jaGFuZGVmLmNoYW4tPmNlbnRlcl9mcmVxKTsKLQkJc2RhdGEtPmNzYV9jb3VudGVyX29mZnNldF9iZWFjb24gPSBoZHJfbGVuICsgNjsKKwkJc2RhdGEtPmNzYV9jb3VudGVyX29mZnNldF9iZWFjb25bMF0gPSBoZHJfbGVuICsgNjsKIAkJKnBvcysrID0gY3NhLT5zZXR0aW5ncy5jb3VudDsKIAkJKnBvcysrID0gV0xBTl9FSURfQ0hBTl9TV0lUQ0hfUEFSQU07CiAJCSpwb3MrKyA9IDY7CkBAIC04MjksNyArODI0LDcgQEAKIAlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpOwogCWJjbiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoaWZtc2gtPmJlYWNvbiwKIAkJCQkJbG9ja2RlcF9pc19oZWxkKCZzZGF0YS0+d2Rldi5tdHgpKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaWZtc2gtPmJlYWNvbiwgTlVMTCk7CisJUkNVX0lOSVRfUE9JTlRFUihpZm1zaC0+YmVhY29uLCBOVUxMKTsKIAlrZnJlZV9yY3UoYmNuLCByY3VfaGVhZCk7CiAKIAkvKiBmbHVzaCBTVEFzIGFuZCBtcGF0aHMgb24gdGhpcyBpZmFjZSAqLwpAQCAtOTAzLDE0ICs4OTgsMTUgQEAKIAl9CiAKIAllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LAotCQkJCQkgICAgJnBhcmFtcy5jaGFuZGVmKTsKKwkJCQkJICAgICZwYXJhbXMuY2hhbmRlZiwKKwkJCQkJICAgIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGVycikgewotCQlwYXJhbXMucmFkYXJfcmVxdWlyZWQgPSB0cnVlOworCWlmIChlcnIgPiAwKQogCQkvKiBUT0RPOiBERlMgbm90ICh5ZXQpIHN1cHBvcnRlZCAqLwogCQlyZXR1cm4gZmFsc2U7Ci0JfQorCisJcGFyYW1zLnJhZGFyX3JlcXVpcmVkID0gZXJyOwogCiAJaWYgKGNmZzgwMjExX2NoYW5kZWZfaWRlbnRpY2FsKCZwYXJhbXMuY2hhbmRlZiwKIAkJCQkgICAgICAgJnNkYXRhLT52aWYuYnNzX2NvbmYuY2hhbmRlZikpIHsKQEAgLTEwNjgsNyArMTA2NCw3IEBACiAKIAkvKiBSZW1vdmUgdGhlIENTQSBhbmQgTUNTUCBlbGVtZW50cyBmcm9tIHRoZSBiZWFjb24gKi8KIAl0bXBfY3NhX3NldHRpbmdzID0gcmN1X2RlcmVmZXJlbmNlKGlmbXNoLT5jc2EpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpZm1zaC0+Y3NhLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGlmbXNoLT5jc2EsIE5VTEwpOwogCWlmICh0bXBfY3NhX3NldHRpbmdzKQogCQlrZnJlZV9yY3UodG1wX2NzYV9zZXR0aW5ncywgcmN1X2hlYWQpOwogCXJldCA9IGllZWU4MDIxMV9tZXNoX3JlYnVpbGRfYmVhY29uKHNkYXRhKTsKQEAgLTExMDIsNyArMTA5OCw3IEBACiAJcmV0ID0gaWVlZTgwMjExX21lc2hfcmVidWlsZF9iZWFjb24oc2RhdGEpOwogCWlmIChyZXQpIHsKIAkJdG1wX2NzYV9zZXR0aW5ncyA9IHJjdV9kZXJlZmVyZW5jZShpZm1zaC0+Y3NhKTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGlmbXNoLT5jc2EsIE5VTEwpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGlmbXNoLT5jc2EsIE5VTEwpOwogCQlrZnJlZV9yY3UodG1wX2NzYV9zZXR0aW5ncywgcmN1X2hlYWQpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwppbmRleCBmOTUxNDY4Li45NDc1OGI5IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCkBAIC0zNyw3ICszNyw3IEBACiAJcmV0dXJuIGdldF91bmFsaWduZWRfbGUzMihwcmVxX2VsZW0gKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiB1MTZfZmllbGRfZ2V0KGNvbnN0IHU4ICpwcmVxX2VsZW0sIGludCBvZmZzZXQsIGJvb2wgYWUpCitzdGF0aWMgaW5saW5lIHUxNiB1MTZfZmllbGRfZ2V0KGNvbnN0IHU4ICpwcmVxX2VsZW0sIGludCBvZmZzZXQsIGJvb2wgYWUpCiB7CiAJaWYgKGFlKQogCQlvZmZzZXQgKz0gNjsKQEAgLTU0NCw5ICs1NDQsMTAgQEAKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgaWZtc2gtPmxhc3Rfc25fdXBkYXRlICsKIAkJCQkJbmV0X3RyYXZlcnNhbF9qaWZmaWVzKHNkYXRhKSkgfHwKIAkJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGlmbXNoLT5sYXN0X3NuX3VwZGF0ZSkpIHsKLQkJCXRhcmdldF9zbiA9ICsraWZtc2gtPnNuOworCQkJKytpZm1zaC0+c247CiAJCQlpZm1zaC0+bGFzdF9zbl91cGRhdGUgPSBqaWZmaWVzOwogCQl9CisJCXRhcmdldF9zbiA9IGlmbXNoLT5zbjsKIAl9IGVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHRhcmdldF9hZGRyKSAmJgogCQkgICAodGFyZ2V0X2ZsYWdzICYgSUVFRTgwMjExX1BSRVFfVE9fRkxBRykpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCmluZGV4IDdkMDUwZWQuLmNmMDMyYTggMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKQEAgLTI4Nyw4ICsyODcsMTAgQEAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZhaWxxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlCVUdfT04oZ2F0ZV9tcGF0aCA9PSBmcm9tX21wYXRoKTsKLQlCVUdfT04oIWdhdGVfbXBhdGgtPm5leHRfaG9wKTsKKwlpZiAoV0FSTl9PTihnYXRlX21wYXRoID09IGZyb21fbXBhdGgpKQorCQlyZXR1cm47CisJaWYgKFdBUk5fT04oIWdhdGVfbXBhdGgtPm5leHRfaG9wKSkKKwkJcmV0dXJuOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZmYWlscSk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3N5bmMuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3N5bmMuYwppbmRleCAyYmM1ZGMyLi4wOTYyNWQ2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9zeW5jLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfc3luYy5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAl1OCBjYXA7CiAKIAlXQVJOX09OKGlmbXNoLT5tZXNoX3NwX2lkICE9IElFRUU4MDIxMV9TWU5DX01FVEhPRF9ORUlHSEJPUl9PRkZTRVQpOwotCUJVR19PTighcmN1X3JlYWRfbG9ja19oZWxkKCkpOworCVdBUk5fT04oIXJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKIAljYXAgPSBiZWFjb24tPm1lc2hjb25mLT5tZXNoY29uZl9jYXA7CiAKIAlzcGluX2xvY2tfYmgoJmlmbXNoLT5zeW5jX29mZnNldF9sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9taWNoYWVsLmggYi9uZXQvbWFjODAyMTEvbWljaGFlbC5oCmluZGV4IDNiODQ4ZGEuLjBlNDg4NmYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9taWNoYWVsLmgKKysrIGIvbmV0L21hYzgwMjExL21pY2hhZWwuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBNSUNIQUVMX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAKICNkZWZpbmUgTUlDSEFFTF9NSUNfTEVOIDgKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggMjc2MDBhOS4uMzM0NTQwMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC05NzUsMTYgKzk3NSwyMyBAQAogCS8qIFhYWDogc2hvdWxkbid0IHJlYWxseSBtb2RpZnkgY2ZnODAyMTEtb3duZWQgZGF0YSEgKi8KIAlpZm1nZC0+YXNzb2NpYXRlZC0+Y2hhbm5lbCA9IHNkYXRhLT5jc2FfY2hhbmRlZi5jaGFuOwogCi0JLyogWFhYOiB3YWl0IGZvciBhIGJlYWNvbiBmaXJzdD8gKi8KLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXNfYnlfcmVhc29uKCZsb2NhbC0+aHcsCi0JCQkJCUlFRUU4MDIxMV9NQVhfUVVFVUVfTUFQLAotCQkJCQlJRUVFODAyMTFfUVVFVUVfU1RPUF9SRUFTT05fQ1NBKTsKLQogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIAotIG91dDoKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAlzZGF0YS0+dmlmLmNzYV9hY3RpdmUgPSBmYWxzZTsKKwkvKiBYWFg6IHdhaXQgZm9yIGEgYmVhY29uIGZpcnN0PyAqLworCWlmICghaWVlZTgwMjExX2NzYV9uZWVkc19ibG9ja190eChsb2NhbCkpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlc19ieV9yZWFzb24oJmxvY2FsLT5odywKKwkJCQkJSUVFRTgwMjExX01BWF9RVUVVRV9NQVAsCisJCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9DU0EpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CisKIAlpZm1nZC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9TVEFfQ1NBX1JFQ0VJVkVEOworCisJaWVlZTgwMjExX3N0YV9yZXNldF9iZWFjb25fbW9uaXRvcihzZGF0YSk7CisJaWVlZTgwMjExX3N0YV9yZXNldF9jb25uX21vbml0b3Ioc2RhdGEpOworCitvdXQ6CiAJc2RhdGFfdW5sb2NrKHNkYXRhKTsKIH0KIApAQCAtMTA4OSw3ICsxMDk2LDcgQEAKIAl9CiAJY2hhbmN0eCA9IGNvbnRhaW5lcl9vZihyY3VfYWNjZXNzX3BvaW50ZXIoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYpLAogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7Ci0JaWYgKGNoYW5jdHgtPnJlZmNvdW50ID4gMSkgeworCWlmIChpZWVlODAyMTFfY2hhbmN0eF9yZWZjb3VudChsb2NhbCwgY2hhbmN0eCkgPiAxKSB7CiAJCXNkYXRhX2luZm8oc2RhdGEsCiAJCQkgICAiY2hhbm5lbCBzd2l0Y2ggd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2VzIG9uIHRoZSBzYW1lIGNoYW5uZWwsIGRpc2Nvbm5lY3RpbmdcbiIpOwogCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LApAQCAtMTEwMCwxMiArMTEwNywxNiBAQAogCW11dGV4X3VubG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKIAogCXNkYXRhLT5jc2FfY2hhbmRlZiA9IGNzYV9pZS5jaGFuZGVmOwotCXNkYXRhLT52aWYuY3NhX2FjdGl2ZSA9IHRydWU7CiAKLQlpZiAoY3NhX2llLm1vZGUpCisJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisJc2RhdGEtPnZpZi5jc2FfYWN0aXZlID0gdHJ1ZTsKKwlzZGF0YS0+Y3NhX2Jsb2NrX3R4ID0gY3NhX2llLm1vZGU7CisKKwlpZiAoc2RhdGEtPmNzYV9ibG9ja190eCkKIAkJaWVlZTgwMjExX3N0b3BfcXVldWVzX2J5X3JlYXNvbigmbG9jYWwtPmh3LAotCQkJCUlFRUU4MDIxMV9NQVhfUVVFVUVfTUFQLAotCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9DU0EpOworCQkJCQlJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKKwkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0NTQSk7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAogCWlmIChsb2NhbC0+b3BzLT5jaGFubmVsX3N3aXRjaCkgewogCQkvKiB1c2UgZHJpdmVyJ3MgY2hhbm5lbCBzd2l0Y2ggY2FsbGJhY2sgKi8KQEAgLTE4MTcsNiArMTgyOCwxMiBAQAogCWlmbWdkLT5mbGFncyA9IDA7CiAJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CiAJaWVlZTgwMjExX3ZpZl9yZWxlYXNlX2NoYW5uZWwoc2RhdGEpOworCisJc2RhdGEtPnZpZi5jc2FfYWN0aXZlID0gZmFsc2U7CisJaWYgKCFpZWVlODAyMTFfY3NhX25lZWRzX2Jsb2NrX3R4KGxvY2FsKSkKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzX2J5X3JlYXNvbigmbG9jYWwtPmh3LAorCQkJCQlJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKKwkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0NTQSk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAogCXNkYXRhLT5lbmNyeXB0X2hlYWRyb29tID0gSUVFRTgwMjExX0VOQ1JZUFRfSEVBRFJPT007CkBAIC0yMDQ1LDYgKzIwNjIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2llZWU4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogeworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwogCXU4IGZyYW1lX2J1ZltJRUVFODAyMTFfREVBVVRIX0ZSQU1FX0xFTl07CiAKQEAgLTIwNTgsMTAgKzIwNzYsMTQgQEAKIAkJCSAgICAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSwKIAkJCSAgICAgICB0cnVlLCBmcmFtZV9idWYpOwogCWlmbWdkLT5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9DU0FfUkVDRUlWRUQ7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAlzZGF0YS0+dmlmLmNzYV9hY3RpdmUgPSBmYWxzZTsKLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXNfYnlfcmVhc29uKCZzZGF0YS0+bG9jYWwtPmh3LAorCWlmICghaWVlZTgwMjExX2NzYV9uZWVkc19ibG9ja190eChsb2NhbCkpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlc19ieV9yZWFzb24oJmxvY2FsLT5odywKIAkJCQkJSUVFRTgwMjExX01BWF9RVUVVRV9NQVAsCiAJCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9DU0EpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAKIAljZmc4MDIxMV90eF9tbG1lX21nbXQoc2RhdGEtPmRldiwgZnJhbWVfYnVmLAogCQkJICAgICAgSUVFRTgwMjExX0RFQVVUSF9GUkFNRV9MRU4pOwpAQCAtMzU0Niw2ICszNTY4LDkgQEAKIAlpZiAobG9jYWwtPnF1aWVzY2luZykKIAkJcmV0dXJuOwogCisJaWYgKHNkYXRhLT52aWYuY3NhX2FjdGl2ZSkKKwkJcmV0dXJuOworCiAJc2RhdGEtPnUubWdkLmNvbm5lY3Rpb25fbG9zcyA9IGZhbHNlOwogCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZzZGF0YS0+bG9jYWwtPmh3LAogCQkJICAgICAmc2RhdGEtPnUubWdkLmJlYWNvbl9jb25uZWN0aW9uX2xvc3Nfd29yayk7CkBAIC0zNTYxLDYgKzM1ODYsOSBAQAogCWlmIChsb2NhbC0+cXVpZXNjaW5nKQogCQlyZXR1cm47CiAKKwlpZiAoc2RhdGEtPnZpZi5jc2FfYWN0aXZlKQorCQlyZXR1cm47CisKIAlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmaWZtZ2QtPm1vbml0b3Jfd29yayk7CiB9CiAKQEAgLTM3MDcsNyArMzczNSw3IEBACiAJaWVlZTgwMjExX3JlY2FsY19wcyhsb2NhbCwgbGF0ZW5jeV91c2VjKTsKIAltdXRleF91bmxvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKIAotCXJldHVybiAwOworCXJldHVybiBOT1RJRllfT0s7CiB9CiAKIHN0YXRpYyB1OCBpZWVlODAyMTFfaHRfdmh0X3J4X2NoYWlucyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCmluZGV4IDI2ZmQ5NGYuLjFjMTQ2OWMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwpAQCAtNjU3LDYgKzY1NywxNyBAQAogCWtmcmVlKHByaXYpOwogfQogCitzdGF0aWMgdTMyIG1pbnN0cmVsX2dldF9leHBlY3RlZF90aHJvdWdocHV0KHZvaWQgKnByaXZfc3RhKQoreworCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBwcml2X3N0YTsKKwlpbnQgaWR4ID0gbWktPm1heF90cF9yYXRlWzBdOworCisJLyogY29udmVydCBwa3QgcGVyIHNlYyBpbiBrYnBzICgxMjAwIGlzIHRoZSBhdmVyYWdlIHBrdCBzaXplIHVzZWQgZm9yCisJICogY29tcHV0aW5nIGN1cl90cAorCSAqLworCXJldHVybiBNSU5TVFJFTF9UUlVOQyhtaS0+cltpZHhdLmN1cl90cCkgKiAxMjAwICogOCAvIDEwMjQ7Cit9CisKIGNvbnN0IHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIG1hYzgwMjExX21pbnN0cmVsID0gewogCS5uYW1lID0gIm1pbnN0cmVsIiwKIAkudHhfc3RhdHVzID0gbWluc3RyZWxfdHhfc3RhdHVzLApAQCAtNjcwLDYgKzY4MSw3IEBACiAJLmFkZF9zdGFfZGVidWdmcyA9IG1pbnN0cmVsX2FkZF9zdGFfZGVidWdmcywKIAkucmVtb3ZlX3N0YV9kZWJ1Z2ZzID0gbWluc3RyZWxfcmVtb3ZlX3N0YV9kZWJ1Z2ZzLAogI2VuZGlmCisJLmdldF9leHBlY3RlZF90aHJvdWdocHV0ID0gbWluc3RyZWxfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQsCiB9OwogCiBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCBiY2NhZjg1Li44NWMxZTc0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgTUNTX05CSVRTIChBVkdfUEtUX1NJWkUgPDwgMykKIAogLyogTnVtYmVyIG9mIHN5bWJvbHMgZm9yIGEgcGFja2V0IHdpdGggKGJwcykgYml0cyBwZXIgc3ltYm9sICovCi0jZGVmaW5lIE1DU19OU1lNUyhicHMpICgoTUNTX05CSVRTICsgKGJwcykgLSAxKSAvIChicHMpKQorI2RlZmluZSBNQ1NfTlNZTVMoYnBzKSBESVZfUk9VTkRfVVAoTUNTX05CSVRTLCAoYnBzKSkKIAogLyogVHJhbnNtaXNzaW9uIHRpbWUgKG5hbm9zZWNvbmRzKSBmb3IgYSBwYWNrZXQgY29udGFpbmluZyAoc3ltcykgc3ltYm9scyAqLwogI2RlZmluZSBNQ1NfU1lNQk9MX1RJTUUoc2dpLCBzeW1zKQkJCQkJXApAQCAtMjI2LDggKzIyNiw5IEBACiAJCW5zZWNzID0gMTAwMCAqIG1pLT5vdmVyaGVhZCAvIE1JTlNUUkVMX1RSVU5DKG1pLT5hdmdfYW1wZHVfbGVuKTsKIAogCW5zZWNzICs9IG1pbnN0cmVsX21jc19ncm91cHNbZ3JvdXBdLmR1cmF0aW9uW3JhdGVdOwotCXRwID0gMTAwMDAwMCAqICgocHJvYiAqIDEwMDApIC8gbnNlY3MpOwogCisJLyogcHJvYiBpcyBzY2FsZWQgLSBzZWUgTUlOU1RSRUxfRlJBQyBhYm92ZSAqLworCXRwID0gMTAwMDAwMCAqICgocHJvYiAqIDEwMDApIC8gbnNlY3MpOwogCW1yLT5jdXJfdHAgPSBNSU5TVFJFTF9UUlVOQyh0cCk7CiB9CiAKQEAgLTEwMzEsNiArMTAzMiwyMiBAQAogCW1hYzgwMjExX21pbnN0cmVsLmZyZWUocHJpdik7CiB9CiAKK3N0YXRpYyB1MzIgbWluc3RyZWxfaHRfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQodm9pZCAqcHJpdl9zdGEpCit7CisJc3RydWN0IG1pbnN0cmVsX2h0X3N0YV9wcml2ICptc3AgPSBwcml2X3N0YTsKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSA9ICZtc3AtPmh0OworCWludCBpLCBqOworCisJaWYgKCFtc3AtPmlzX2h0KQorCQlyZXR1cm4gbWFjODAyMTFfbWluc3RyZWwuZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQocHJpdl9zdGEpOworCisJaSA9IG1pLT5tYXhfdHBfcmF0ZSAvIE1DU19HUk9VUF9SQVRFUzsKKwlqID0gbWktPm1heF90cF9yYXRlICUgTUNTX0dST1VQX1JBVEVTOworCisJLyogY29udmVydCBjdXJfdHAgZnJvbSBwa3QgcGVyIHNlY29uZCBpbiBrYnBzICovCisJcmV0dXJuIG1pLT5ncm91cHNbaV0ucmF0ZXNbal0uY3VyX3RwICogQVZHX1BLVF9TSVpFICogOCAvIDEwMjQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyBtYWM4MDIxMV9taW5zdHJlbF9odCA9IHsKIAkubmFtZSA9ICJtaW5zdHJlbF9odCIsCiAJLnR4X3N0YXR1cyA9IG1pbnN0cmVsX2h0X3R4X3N0YXR1cywKQEAgLTEwNDUsNiArMTA2Miw3IEBACiAJLmFkZF9zdGFfZGVidWdmcyA9IG1pbnN0cmVsX2h0X2FkZF9zdGFfZGVidWdmcywKIAkucmVtb3ZlX3N0YV9kZWJ1Z2ZzID0gbWluc3RyZWxfaHRfcmVtb3ZlX3N0YV9kZWJ1Z2ZzLAogI2VuZGlmCisJLmdldF9leHBlY3RlZF90aHJvdWdocHV0ID0gbWluc3RyZWxfaHRfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQsCiB9OwogCiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yeC5jIGIvbmV0L21hYzgwMjExL3J4LmMKaW5kZXggMmI2MDhiMi4uMzk0ZTIwMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3J4LmMKKysrIGIvbmV0L21hYzgwMjExL3J4LmMKQEAgLTU0LDI0ICs1NCwyNSBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNob3VsZF9kcm9wX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmVzZW50X2Zjc19sZW4pCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2Ryb3BfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByZXNlbnRfZmNzX2xlbikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQotCWhkciA9ICh2b2lkICopKHNrYi0+ZGF0YSk7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOwogCiAJaWYgKHN0YXR1cy0+ZmxhZyAmIChSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDIHwKIAkJCSAgICBSWF9GTEFHX0ZBSUxFRF9QTENQX0NSQyB8CiAJCQkgICAgUlhfRkxBR19BTVBEVV9JU19aRVJPTEVOKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOworCiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgMTYgKyBwcmVzZW50X2Zjc19sZW4pKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CisKIAlpZiAoaWVlZTgwMjExX2lzX2N0bChoZHItPmZyYW1lX2NvbnRyb2wpICYmCiAJICAgICFpZWVlODAyMTFfaXNfcHNwb2xsKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkgICAgIWllZWU4MDIxMV9pc19iYWNrX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTMxOTEsNyArMzE5Miw3IEBACiB9CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBhY3R1YWwgUnggZnJhbWVzIGhhbmRsZXIuIGFzIGl0IGJsb25ncyB0byBSeCBwYXRoIGl0IG11c3QKKyAqIFRoaXMgaXMgdGhlIGFjdHVhbCBSeCBmcmFtZXMgaGFuZGxlci4gYXMgaXQgYmVsb25ncyB0byBSeCBwYXRoIGl0IG11c3QKICAqIGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgcHJvdGVjdGlvbi4KICAqLwogc3RhdGljIHZvaWQgX19pZWVlODAyMTFfcnhfaGFuZGxlX3BhY2tldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zY2FuLmMgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCmluZGV4IDNjZTdmMmMuLmY0MDY2MWUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zY2FuLmMKKysrIGIvbmV0L21hYzgwMjExL3NjYW4uYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJaWYgKGxvY2FsLT5zY2FuX3JlcSAhPSBsb2NhbC0+aW50X3NjYW5fcmVxKQogCQljZmc4MDIxMV9zY2FuX2RvbmUobG9jYWwtPnNjYW5fcmVxLCBhYm9ydGVkKTsKIAlsb2NhbC0+c2Nhbl9yZXEgPSBOVUxMOwotCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c2Nhbl9zZGF0YSwgTlVMTCk7CisJUkNVX0lOSVRfUE9JTlRFUihsb2NhbC0+c2Nhbl9zZGF0YSwgTlVMTCk7CiAKIAlsb2NhbC0+c2Nhbm5pbmcgPSAwOwogCWxvY2FsLT5zY2FuX2NoYW5kZWYuY2hhbiA9IE5VTEw7CkBAIC01NTksNyArNTU5LDcgQEAKIAkJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKIAogCQlsb2NhbC0+c2Nhbl9yZXEgPSBOVUxMOwotCQlyY3VfYXNzaWduX3BvaW50ZXIobG9jYWwtPnNjYW5fc2RhdGEsIE5VTEwpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT5zY2FuX3NkYXRhLCBOVUxMKTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC03NzMsNyArNzczLDcgQEAKIAkJaW50IHJjOwogCiAJCWxvY2FsLT5zY2FuX3JlcSA9IE5VTEw7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c2Nhbl9zZGF0YSwgTlVMTCk7CisJCVJDVV9JTklUX1BPSU5URVIobG9jYWwtPnNjYW5fc2RhdGEsIE5VTEwpOwogCiAJCXJjID0gX19pZWVlODAyMTFfc3RhcnRfc2NhbihzZGF0YSwgcmVxKTsKIAkJaWYgKHJjKSB7CkBAIC0xMDE0LDcgKzEwMTQsNyBAQAogCiAJaWYgKHJldCkgewogCQkvKiBDbGVhbiBpbiBjYXNlIG9mIGZhaWx1cmUgYWZ0ZXIgSFcgcmVzdGFydCBvciB1cG9uIHJlc3VtZS4gKi8KLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zY2hlZF9zY2FuX3NkYXRhLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsb2NhbC0+c2NoZWRfc2Nhbl9zZGF0YSwgTlVMTCk7CiAJCWxvY2FsLT5zY2hlZF9zY2FuX3JlcSA9IE5VTEw7CiAJfQogCkBAIC0xMDc2LDEyICsxMDc2LDggQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NjaGVkX3NjYW5fcmVzdWx0cyk7CiAKLXZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fZW5kKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsCi0JCQkgICAgIHNjaGVkX3NjYW5fc3RvcHBlZF93b3JrKTsKLQogCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwogCiAJaWYgKCFyY3VfYWNjZXNzX3BvaW50ZXIobG9jYWwtPnNjaGVkX3NjYW5fc2RhdGEpKSB7CkBAIC0xMDg5LDcgKzEwODUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zY2hlZF9zY2FuX3NkYXRhLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT5zY2hlZF9zY2FuX3NkYXRhLCBOVUxMKTsKIAogCS8qIElmIHNjaGVkIHNjYW4gd2FzIGFib3J0ZWQgYnkgdGhlIGRyaXZlci4gKi8KIAlsb2NhbC0+c2NoZWRfc2Nhbl9yZXEgPSBOVUxMOwpAQCAtMTA5OSw2ICsxMDk1LDE1IEBACiAJY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkKGxvY2FsLT5ody53aXBoeSk7CiB9CiAKK3ZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsLAorCQkJICAgICBzY2hlZF9zY2FuX3N0b3BwZWRfd29yayk7CisKKwlpZWVlODAyMTFfc2NoZWRfc2Nhbl9lbmQobG9jYWwpOworfQorCiB2b2lkIGllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCmluZGV4IDg0N2Q5MmYuLmE5YjQ2ZDhlYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKQEAgLTI0MCw2ICsyNDAsNyBAQAogCiAJc3RhX2RiZyhzdGEtPnNkYXRhLCAiRGVzdHJveWVkIFNUQSAlcE1cbiIsIHN0YS0+c3RhLmFkZHIpOwogCisJa2ZyZWUocmN1X2RlcmVmZXJlbmNlX3JhdyhzdGEtPnN0YS5yYXRlcykpOwogCWtmcmVlKHN0YSk7CiB9CiAKQEAgLTU1Miw3ICs1NTMsNyBAQAogaW50IHN0YV9pbmZvX2luc2VydF9yY3Uoc3RydWN0IHN0YV9pbmZvICpzdGEpIF9fYWNxdWlyZXMoUkNVKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc3RhLT5sb2NhbDsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJbWlnaHRfc2xlZXAoKTsKIApAQCAtNTcwLDcgKzU3MSw2IEBACiAKIAlyZXR1cm4gMDsKICBvdXRfZnJlZToKLQlCVUdfT04oIWVycik7CiAJc3RhX2luZm9fZnJlZShsb2NhbCwgc3RhKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YXR1cy5jIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCmluZGV4IDYwY2I3YTYuLmJhMjllYmMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYworKysgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKQEAgLTU0MSw2ICs1NDEsMjMgQEAKICAqLwogI2RlZmluZSBTVEFfTE9TVF9QS1RfVEhSRVNIT0xECTUwCiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9sb3N0X3BhY2tldChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwkvKiBUaGlzIHBhY2tldCB3YXMgYWdncmVnYXRlZCBidXQgZG9lc24ndCBjYXJyeSBzdGF0dXMgaW5mbyAqLworCWlmICgoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgorCSAgICAhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUpKQorCQlyZXR1cm47CisKKwlpZiAoKytzdGEtPmxvc3RfcGFja2V0cyA8IFNUQV9MT1NUX1BLVF9USFJFU0hPTEQpCisJCXJldHVybjsKKworCWNmZzgwMjExX2NxbV9wa3Rsb3NzX25vdGlmeShzdGEtPnNkYXRhLT5kZXYsIHN0YS0+c3RhLmFkZHIsCisJCQkJICAgIHN0YS0+bG9zdF9wYWNrZXRzLCBHRlBfQVRPTUlDKTsKKwlzdGEtPmxvc3RfcGFja2V0cyA9IDA7Cit9CisKIHZvaWQgaWVlZTgwMjExX3R4X3N0YXR1cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKQEAgLTY4MCwxMiArNjk3LDggQEAKIAkJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSykgewogCQkJCWlmIChzdGEtPmxvc3RfcGFja2V0cykKIAkJCQkJc3RhLT5sb3N0X3BhY2tldHMgPSAwOwotCQkJfSBlbHNlIGlmICgrK3N0YS0+bG9zdF9wYWNrZXRzID49IFNUQV9MT1NUX1BLVF9USFJFU0hPTEQpIHsKLQkJCQljZmc4MDIxMV9jcW1fcGt0bG9zc19ub3RpZnkoc3RhLT5zZGF0YS0+ZGV2LAotCQkJCQkJCSAgICBzdGEtPnN0YS5hZGRyLAotCQkJCQkJCSAgICBzdGEtPmxvc3RfcGFja2V0cywKLQkJCQkJCQkgICAgR0ZQX0FUT01JQyk7Ci0JCQkJc3RhLT5sb3N0X3BhY2tldHMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZWVlODAyMTFfbG9zdF9wYWNrZXQoc3RhLCBza2IpOwogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90ZGxzLmMgYi9uZXQvbWFjODAyMTEvdGRscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjgxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbWFjODAyMTEvdGRscy5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogbWFjODAyMTEgVERMUyBoYW5kbGluZyBjb2RlCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICogQ29weXJpZ2h0IDIwMTQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIEdQTHYyIGFzIGZvdW5kIGluIENPUFlJTkcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90ZGxzX2FkZF9leHRfY2FwYWIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCAqcG9zID0gKHZvaWQgKilza2JfcHV0KHNrYiwgNyk7CisKKwkqcG9zKysgPSBXTEFOX0VJRF9FWFRfQ0FQQUJJTElUWTsKKwkqcG9zKysgPSA1OyAvKiBsZW4gKi8KKwkqcG9zKysgPSAweDA7CisJKnBvcysrID0gMHgwOworCSpwb3MrKyA9IDB4MDsKKwkqcG9zKysgPSAweDA7CisJKnBvcysrID0gV0xBTl9FWFRfQ0FQQTVfVERMU19FTkFCTEVEOworfQorCitzdGF0aWMgdTE2IGllZWU4MDIxMV9nZXRfdGRsc19zdGFfY2FwYWIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJdTE2IGNhcGFiOworCisJY2FwYWIgPSAwOworCWlmIChpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpICE9IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCXJldHVybiBjYXBhYjsKKworCWlmICghKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV18yR0haX1NIT1JUX1NMT1RfSU5DQVBBQkxFKSkKKwkJY2FwYWIgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRTsKKwlpZiAoIShsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfMkdIWl9TSE9SVF9QUkVBTUJMRV9JTkNBUEFCTEUpKQorCQljYXBhYiB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7CisKKwlyZXR1cm4gY2FwYWI7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90ZGxzX2FkZF9saW5rX2llKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHU4ICpzcmNfYWRkciwKKwkJCQkgICAgICAgY29uc3QgdTggKnBlZXIsIGNvbnN0IHU4ICpic3NpZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfbG5raWUgKmxua2lkOworCisJbG5raWQgPSAodm9pZCAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90ZGxzX2xua2llKSk7CisKKwlsbmtpZC0+aWVfdHlwZSA9IFdMQU5fRUlEX0xJTktfSUQ7CisJbG5raWQtPmllX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfbG5raWUpIC0gMjsKKworCW1lbWNweShsbmtpZC0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGxua2lkLT5pbml0X3N0YSwgc3JjX2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobG5raWQtPnJlc3Bfc3RhLCBwZWVyLCBFVEhfQUxFTik7Cit9CisKK3N0YXRpYyBpbnQKK2llZWU4MDIxMV9wcmVwX3RkbHNfZW5jYXBfZGF0YShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIGNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJICAgICAgIHUxNiBzdGF0dXNfY29kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gaWVlZTgwMjExX2dldF9zZGF0YV9iYW5kKHNkYXRhKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfZGF0YSAqdGY7CisKKwl0ZiA9ICh2b2lkICopc2tiX3B1dChza2IsIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfdGRsc19kYXRhLCB1KSk7CisKKwltZW1jcHkodGYtPmRhLCBwZWVyLCBFVEhfQUxFTik7CisJbWVtY3B5KHRmLT5zYSwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CisJdGYtPmV0aGVyX3R5cGUgPSBjcHVfdG9fYmUxNihFVEhfUF9URExTKTsKKwl0Zi0+cGF5bG9hZF90eXBlID0gV0xBTl9URExTX1NOQVBfUkZUWVBFOworCisJc3dpdGNoIChhY3Rpb25fY29kZSkgeworCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFUVVFU1Q6CisJCXRmLT5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfVERMUzsKKwkJdGYtPmFjdGlvbl9jb2RlID0gV0xBTl9URExTX1NFVFVQX1JFUVVFU1Q7CisKKwkJc2tiX3B1dChza2IsIHNpemVvZih0Zi0+dS5zZXR1cF9yZXEpKTsKKwkJdGYtPnUuc2V0dXBfcmVxLmRpYWxvZ190b2tlbiA9IGRpYWxvZ190b2tlbjsKKwkJdGYtPnUuc2V0dXBfcmVxLmNhcGFiaWxpdHkgPQorCQkJY3B1X3RvX2xlMTYoaWVlZTgwMjExX2dldF90ZGxzX3N0YV9jYXBhYihzZGF0YSkpOworCisJCWllZWU4MDIxMV9hZGRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX2FkZF9leHRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX3RkbHNfYWRkX2V4dF9jYXBhYihza2IpOworCQlicmVhazsKKwljYXNlIFdMQU5fVERMU19TRVRVUF9SRVNQT05TRToKKwkJdGYtPmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9URExTOworCQl0Zi0+YWN0aW9uX2NvZGUgPSBXTEFOX1RETFNfU0VUVVBfUkVTUE9OU0U7CisKKwkJc2tiX3B1dChza2IsIHNpemVvZih0Zi0+dS5zZXR1cF9yZXNwKSk7CisJCXRmLT51LnNldHVwX3Jlc3Auc3RhdHVzX2NvZGUgPSBjcHVfdG9fbGUxNihzdGF0dXNfY29kZSk7CisJCXRmLT51LnNldHVwX3Jlc3AuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOworCQl0Zi0+dS5zZXR1cF9yZXNwLmNhcGFiaWxpdHkgPQorCQkJY3B1X3RvX2xlMTYoaWVlZTgwMjExX2dldF90ZGxzX3N0YV9jYXBhYihzZGF0YSkpOworCisJCWllZWU4MDIxMV9hZGRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX2FkZF9leHRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX3RkbHNfYWRkX2V4dF9jYXBhYihza2IpOworCQlicmVhazsKKwljYXNlIFdMQU5fVERMU19TRVRVUF9DT05GSVJNOgorCQl0Zi0+Y2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX1RETFM7CisJCXRmLT5hY3Rpb25fY29kZSA9IFdMQU5fVERMU19TRVRVUF9DT05GSVJNOworCisJCXNrYl9wdXQoc2tiLCBzaXplb2YodGYtPnUuc2V0dXBfY2ZtKSk7CisJCXRmLT51LnNldHVwX2NmbS5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KHN0YXR1c19jb2RlKTsKKwkJdGYtPnUuc2V0dXBfY2ZtLmRpYWxvZ190b2tlbiA9IGRpYWxvZ190b2tlbjsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX1RETFNfVEVBUkRPV046CisJCXRmLT5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfVERMUzsKKwkJdGYtPmFjdGlvbl9jb2RlID0gV0xBTl9URExTX1RFQVJET1dOOworCisJCXNrYl9wdXQoc2tiLCBzaXplb2YodGYtPnUudGVhcmRvd24pKTsKKwkJdGYtPnUudGVhcmRvd24ucmVhc29uX2NvZGUgPSBjcHVfdG9fbGUxNihzdGF0dXNfY29kZSk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9URExTX0RJU0NPVkVSWV9SRVFVRVNUOgorCQl0Zi0+Y2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX1RETFM7CisJCXRmLT5hY3Rpb25fY29kZSA9IFdMQU5fVERMU19ESVNDT1ZFUllfUkVRVUVTVDsKKworCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHRmLT51LmRpc2NvdmVyX3JlcSkpOworCQl0Zi0+dS5kaXNjb3Zlcl9yZXEuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWVlZTgwMjExX3ByZXBfdGRsc19kaXJlY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIGNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJICAgdTE2IHN0YXR1c19jb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKworCW1nbXQgPSAodm9pZCAqKXNrYl9wdXQoc2tiLCAyNCk7CisJbWVtc2V0KG1nbXQsIDAsIDI0KTsKKwltZW1jcHkobWdtdC0+ZGEsIHBlZXIsIEVUSF9BTEVOKTsKKwltZW1jcHkobWdtdC0+c2EsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUubWdkLmJzc2lkLCBFVEhfQUxFTik7CisKKwltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOworCisJc3dpdGNoIChhY3Rpb25fY29kZSkgeworCWNhc2UgV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTOgorCQlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LnRkbHNfZGlzY292ZXJfcmVzcCkpOworCQltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfUFVCTElDOworCQltZ210LT51LmFjdGlvbi51LnRkbHNfZGlzY292ZXJfcmVzcC5hY3Rpb25fY29kZSA9CisJCQlXTEFOX1BVQl9BQ1RJT05fVERMU19ESVNDT1ZFUl9SRVM7CisJCW1nbXQtPnUuYWN0aW9uLnUudGRsc19kaXNjb3Zlcl9yZXNwLmRpYWxvZ190b2tlbiA9CisJCQlkaWFsb2dfdG9rZW47CisJCW1nbXQtPnUuYWN0aW9uLnUudGRsc19kaXNjb3Zlcl9yZXNwLmNhcGFiaWxpdHkgPQorCQkJY3B1X3RvX2xlMTYoaWVlZTgwMjExX2dldF90ZGxzX3N0YV9jYXBhYihzZGF0YSkpOworCisJCWllZWU4MDIxMV9hZGRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX2FkZF9leHRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKKwkJaWVlZTgwMjExX3RkbHNfYWRkX2V4dF9jYXBhYihza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV90ZGxzX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCWNvbnN0IHU4ICpwZWVyLCB1OCBhY3Rpb25fY29kZSwgdTggZGlhbG9nX3Rva2VuLAorCQkJdTE2IHN0YXR1c19jb2RlLCB1MzIgcGVlcl9jYXBhYmlsaXR5LAorCQkJY29uc3QgdTggKmV4dHJhX2llcywgc2l6ZV90IGV4dHJhX2llc19sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWJvb2wgc2VuZF9kaXJlY3Q7CisJaW50IHJldDsKKworCWlmICghKHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwkvKiBtYWtlIHN1cmUgd2UgYXJlIGluIG1hbmFnZWQgbW9kZSwgYW5kIGFzc29jaWF0ZWQgKi8KKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkgICAgIXNkYXRhLT51Lm1nZC5hc3NvY2lhdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRkbHNfZGJnKHNkYXRhLCAiVERMUyBtZ210IGFjdGlvbiAlZCBwZWVyICVwTVxuIiwKKwkJIGFjdGlvbl9jb2RlLCBwZWVyKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsKKwkJCSAgICBtYXgoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCksCisJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGRsc19kYXRhKSkgKworCQkJICAgIDUwICsgLyogc3VwcG9ydGVkIHJhdGVzICovCisJCQkgICAgNyArIC8qIGV4dCBjYXBhYiAqLworCQkJICAgIGV4dHJhX2llc19sZW4gKworCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RkbHNfbG5raWUpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisKKwlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7CisJY2FzZSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDoKKwljYXNlIFdMQU5fVERMU19TRVRVUF9SRVNQT05TRToKKwljYXNlIFdMQU5fVERMU19TRVRVUF9DT05GSVJNOgorCWNhc2UgV0xBTl9URExTX1RFQVJET1dOOgorCWNhc2UgV0xBTl9URExTX0RJU0NPVkVSWV9SRVFVRVNUOgorCQlyZXQgPSBpZWVlODAyMTFfcHJlcF90ZGxzX2VuY2FwX2RhdGEod2lwaHksIGRldiwgcGVlciwKKwkJCQkJCSAgICAgYWN0aW9uX2NvZGUsIGRpYWxvZ190b2tlbiwKKwkJCQkJCSAgICAgc3RhdHVzX2NvZGUsIHNrYik7CisJCXNlbmRfZGlyZWN0ID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTOgorCQlyZXQgPSBpZWVlODAyMTFfcHJlcF90ZGxzX2RpcmVjdCh3aXBoeSwgZGV2LCBwZWVyLCBhY3Rpb25fY29kZSwKKwkJCQkJCSBkaWFsb2dfdG9rZW4sIHN0YXR1c19jb2RlLAorCQkJCQkJIHNrYik7CisJCXNlbmRfZGlyZWN0ID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJaWYgKGV4dHJhX2llc19sZW4pCisJCW1lbWNweShza2JfcHV0KHNrYiwgZXh0cmFfaWVzX2xlbiksIGV4dHJhX2llcywgZXh0cmFfaWVzX2xlbik7CisKKwkvKiB0aGUgVERMUyBsaW5rIElFIGlzIGFsd2F5cyBhZGRlZCBsYXN0ICovCisJc3dpdGNoIChhY3Rpb25fY29kZSkgeworCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFUVVFU1Q6CisJY2FzZSBXTEFOX1RETFNfU0VUVVBfQ09ORklSTToKKwljYXNlIFdMQU5fVERMU19URUFSRE9XTjoKKwljYXNlIFdMQU5fVERMU19ESVNDT1ZFUllfUkVRVUVTVDoKKwkJLyogd2UgYXJlIHRoZSBpbml0aWF0b3IgKi8KKwkJaWVlZTgwMjExX3RkbHNfYWRkX2xpbmtfaWUoc2tiLCBzZGF0YS0+dmlmLmFkZHIsIHBlZXIsCisJCQkJCSAgIHNkYXRhLT51Lm1nZC5ic3NpZCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9URExTX1NFVFVQX1JFU1BPTlNFOgorCWNhc2UgV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTOgorCQkvKiB3ZSBhcmUgdGhlIHJlc3BvbmRlciAqLworCQlpZWVlODAyMTFfdGRsc19hZGRfbGlua19pZShza2IsIHBlZXIsIHNkYXRhLT52aWYuYWRkciwKKwkJCQkJICAgc2RhdGEtPnUubWdkLmJzc2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RTVVBQOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHNlbmRfZGlyZWN0KSB7CisJCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWNjb3JkaW5nIHRvIDgwMi4xMXo6IFNldHVwIHJlcS9yZXNwIGFyZSBzZW50IGluIEFDX0JLLCBvdGhlcndpc2UKKwkgKiB3ZSBzaG91bGQgZGVmYXVsdCB0byBBQ19WSS4KKwkgKi8KKwlzd2l0Y2ggKGFjdGlvbl9jb2RlKSB7CisJY2FzZSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVDoKKwljYXNlIFdMQU5fVERMU19TRVRVUF9SRVNQT05TRToKKwkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgSUVFRTgwMjExX0FDX0JLKTsKKwkJc2tiLT5wcmlvcml0eSA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIElFRUU4MDIxMV9BQ19WSSk7CisJCXNrYi0+cHJpb3JpdHkgPSA1OworCQlicmVhazsKKwl9CisKKwkvKiBkaXNhYmxlIGJvdHRvbSBoYWx2ZXMgd2hlbiBlbnRlcmluZyB0aGUgVHggcGF0aCAqLworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlyZXQgPSBpZWVlODAyMTFfc3ViaWZfc3RhcnRfeG1pdChza2IsIGRldik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworCitmYWlsOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3RkbHNfb3BlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJY29uc3QgdTggKnBlZXIsIGVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiBvcGVyKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKworCWlmICghKHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybiAtRUlOVkFMOworCisJdGRsc19kYmcoc2RhdGEsICJURExTIG9wZXIgJWQgcGVlciAlcE1cbiIsIG9wZXIsIHBlZXIpOworCisJc3dpdGNoIChvcGVyKSB7CisJY2FzZSBOTDgwMjExX1RETFNfRU5BQkxFX0xJTks6CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBwZWVyKTsKKwkJaWYgKCFzdGEpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuIC1FTk9MSU5LOworCQl9CisKKwkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX1RETFNfRElTQUJMRV9MSU5LOgorCQlyZXR1cm4gc3RhX2luZm9fZGVzdHJveV9hZGRyKHNkYXRhLCBwZWVyKTsKKwljYXNlIE5MODAyMTFfVERMU19URUFSRE9XTjoKKwljYXNlIE5MODAyMTFfVERMU19TRVRVUDoKKwljYXNlIE5MODAyMTFfVERMU19ESVNDT1ZFUllfUkVROgorCQkvKiBXZSBkb24ndCBzdXBwb3J0IGluLWRyaXZlciBzZXR1cC90ZWFyZG93bi9kaXNjb3ZlcnkgKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RyYWNlLmggYi9uZXQvbWFjODAyMTEvdHJhY2UuaAppbmRleCBjZWM1YjYwLi5jZmUxYTA2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHJhY2UuaAorKysgYi9uZXQvbWFjODAyMTEvdHJhY2UuaApAQCAtMTg0LDYgKzE4NCwyMCBAQAogCQkgICJ0cnVlIiA6ICJmYWxzZSIpCiApOwogCitUUkFDRV9FVkVOVChkcnZfcmV0dXJuX3UzMiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTMyIHJldCksCisJVFBfQVJHUyhsb2NhbCwgcmV0KSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlfX2ZpZWxkKHUzMiwgcmV0KQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJX19lbnRyeS0+cmV0ID0gcmV0OworCSksCisJVFBfcHJpbnRrKExPQ0FMX1BSX0ZNVCAiIC0gJXUiLCBMT0NBTF9QUl9BUkcsIF9fZW50cnktPnJldCkKKyk7CisKIFRSQUNFX0VWRU5UKGRydl9yZXR1cm5fdTY0LAogCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1NjQgcmV0KSwKIAlUUF9BUkdTKGxvY2FsLCByZXQpLApAQCAtMTM3NSw2ICsxMzg5LDkxIEBACiAJKQogKTsKIAorI2lmICFkZWZpbmVkKF9fVFJBQ0VfVklGX0VOVFJZKQorI2RlZmluZSBfX1RSQUNFX1ZJRl9FTlRSWQorc3RydWN0IHRyYWNlX3ZpZl9lbnRyeSB7CisJZW51bSBubDgwMjExX2lmdHlwZSB2aWZfdHlwZTsKKwlib29sIHAycDsKKwljaGFyIHZpZl9uYW1lW0lGTkFNU0laXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB0cmFjZV9jaGFuZGVmX2VudHJ5IHsKKwl1MzIgY29udHJvbF9mcmVxOworCXUzMiBjaGFuX3dpZHRoOworCXUzMiBjZW50ZXJfZnJlcTE7CisJdTMyIGNlbnRlcl9mcmVxMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB0cmFjZV9zd2l0Y2hfZW50cnkgeworCXN0cnVjdCB0cmFjZV92aWZfZW50cnkgdmlmOworCXN0cnVjdCB0cmFjZV9jaGFuZGVmX2VudHJ5IG9sZF9jaGFuZGVmOworCXN0cnVjdCB0cmFjZV9jaGFuZGVmX2VudHJ5IG5ld19jaGFuZGVmOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBTV0lUQ0hfRU5UUllfQVNTSUdOKHRvLCBmcm9tKSBsb2NhbF92aWZzW2ldLnRvID0gdmlmc1tpXS5mcm9tCisjZW5kaWYKKworVFJBQ0VfRVZFTlQoZHJ2X3N3aXRjaF92aWZfY2hhbmN0eCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfdmlmX2NoYW5jdHhfc3dpdGNoICp2aWZzLAorCQkgaW50IG5fdmlmcywgZW51bSBpZWVlODAyMTFfY2hhbmN0eF9zd2l0Y2hfbW9kZSBtb2RlKSwKKwkgICAgVFBfQVJHUyhsb2NhbCwgdmlmcywgbl92aWZzLCBtb2RlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCV9fZmllbGQoaW50LCBuX3ZpZnMpCisJCV9fZmllbGQodTMyLCBtb2RlKQorCQlfX2R5bmFtaWNfYXJyYXkodTgsIHZpZnMsCisJCQkJc2l6ZW9mKHN0cnVjdCB0cmFjZV9zd2l0Y2hfZW50cnkpICogbl92aWZzKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlfX2VudHJ5LT5uX3ZpZnMgPSBuX3ZpZnM7CisJCV9fZW50cnktPm1vZGUgPSBtb2RlOworCQl7CisJCQlzdHJ1Y3QgdHJhY2Vfc3dpdGNoX2VudHJ5ICpsb2NhbF92aWZzID0KKwkJCQlfX2dldF9keW5hbWljX2FycmF5KHZpZnMpOworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBuX3ZpZnM7IGkrKykgeworCQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCisJCQkJc2RhdGEgPSBjb250YWluZXJfb2Yodmlmc1tpXS52aWYsCisJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAorCQkJCQkJdmlmKTsKKworCQkJCVNXSVRDSF9FTlRSWV9BU1NJR04odmlmLnZpZl90eXBlLCB2aWYtPnR5cGUpOworCQkJCVNXSVRDSF9FTlRSWV9BU1NJR04odmlmLnAycCwgdmlmLT5wMnApOworCQkJCXN0cm5jcHkobG9jYWxfdmlmc1tpXS52aWYudmlmX25hbWUsCisJCQkJCXNkYXRhLT5uYW1lLAorCQkJCQlzaXplb2YobG9jYWxfdmlmc1tpXS52aWYudmlmX25hbWUpKTsKKwkJCQlTV0lUQ0hfRU5UUllfQVNTSUdOKG9sZF9jaGFuZGVmLmNvbnRyb2xfZnJlcSwKKwkJCQkJCW9sZF9jdHgtPmRlZi5jaGFuLT5jZW50ZXJfZnJlcSk7CisJCQkJU1dJVENIX0VOVFJZX0FTU0lHTihvbGRfY2hhbmRlZi5jaGFuX3dpZHRoLAorCQkJCQkJICAgIG9sZF9jdHgtPmRlZi53aWR0aCk7CisJCQkJU1dJVENIX0VOVFJZX0FTU0lHTihvbGRfY2hhbmRlZi5jZW50ZXJfZnJlcTEsCisJCQkJCQkgICAgb2xkX2N0eC0+ZGVmLmNlbnRlcl9mcmVxMSk7CisJCQkJU1dJVENIX0VOVFJZX0FTU0lHTihvbGRfY2hhbmRlZi5jZW50ZXJfZnJlcTIsCisJCQkJCQkgICAgb2xkX2N0eC0+ZGVmLmNlbnRlcl9mcmVxMik7CisJCQkJU1dJVENIX0VOVFJZX0FTU0lHTihuZXdfY2hhbmRlZi5jb250cm9sX2ZyZXEsCisJCQkJCQluZXdfY3R4LT5kZWYuY2hhbi0+Y2VudGVyX2ZyZXEpOworCQkJCVNXSVRDSF9FTlRSWV9BU1NJR04obmV3X2NoYW5kZWYuY2hhbl93aWR0aCwKKwkJCQkJCSAgICBuZXdfY3R4LT5kZWYud2lkdGgpOworCQkJCVNXSVRDSF9FTlRSWV9BU1NJR04obmV3X2NoYW5kZWYuY2VudGVyX2ZyZXExLAorCQkJCQkJICAgIG5ld19jdHgtPmRlZi5jZW50ZXJfZnJlcTEpOworCQkJCVNXSVRDSF9FTlRSWV9BU1NJR04obmV3X2NoYW5kZWYuY2VudGVyX2ZyZXEyLAorCQkJCQkJICAgIG5ld19jdHgtPmRlZi5jZW50ZXJfZnJlcTIpOworCQkJfQorCQl9CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICIgbl92aWZzOiVkIG1vZGU6JWQiLAorCQlMT0NBTF9QUl9BUkcsIF9fZW50cnktPm5fdmlmcywgX19lbnRyeS0+bW9kZQorCSkKKyk7CisKIERFQ0xBUkVfRVZFTlRfQ0xBU1MobG9jYWxfc2RhdGFfY2hhbmN0eCwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMTQ5OSw2ICsxNTk4LDI0IEBACiAJVFBfQVJHUyhsb2NhbCwgc2RhdGEpCiApOwogCitUUkFDRV9FVkVOVChkcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSksCisKKwlUUF9BUkdTKHN0YSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlTVEFfRU5UUlkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCVNUQV9BU1NJR047CisJKSwKKworCVRQX3ByaW50aygKKwkJU1RBX1BSX0ZNVCwgU1RBX1BSX0FSRworCSkKKyk7CisKIC8qCiAgKiBUcmFjaW5nIGZvciBBUEkgY2FsbHMgdGhhdCBkcml2ZXJzIGNhbGwuCiAgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKaW5kZXggMTlkMzZkNC4uNTIxNDY4NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgwMjExL3R4LmMKQEAgLTIzMjgsNyArMjMyOCw4IEBACiAvKiBmdW5jdGlvbnMgZm9yIGRyaXZlcnMgdG8gZ2V0IGNlcnRhaW4gZnJhbWVzICovCiAKIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX2JlYWNvbl9hZGRfdGltKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCSAgICAgICBzdHJ1Y3QgcHNfZGF0YSAqcHMsIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJICAgICAgIHN0cnVjdCBwc19kYXRhICpwcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgYm9vbCBpc190ZW1wbGF0ZSkKIHsKIAl1OCAqcG9zLCAqdGltOwogCWludCBhaWQwID0gMDsKQEAgLTIzNDEsMTEgKzIzNDIsMTIgQEAKIAkJICogY2hlY2tpbmcgYnl0ZS1mb3ItYnl0ZSAqLwogCQloYXZlX2JpdHMgPSAhYml0bWFwX2VtcHR5KCh1bnNpZ25lZCBsb25nICopcHMtPnRpbSwKIAkJCQkJICBJRUVFODAyMTFfTUFYX0FJRCsxKTsKLQotCWlmIChwcy0+ZHRpbV9jb3VudCA9PSAwKQotCQlwcy0+ZHRpbV9jb3VudCA9IHNkYXRhLT52aWYuYnNzX2NvbmYuZHRpbV9wZXJpb2QgLSAxOwotCWVsc2UKLQkJcHMtPmR0aW1fY291bnQtLTsKKwlpZiAoIWlzX3RlbXBsYXRlKSB7CisJCWlmIChwcy0+ZHRpbV9jb3VudCA9PSAwKQorCQkJcHMtPmR0aW1fY291bnQgPSBzZGF0YS0+dmlmLmJzc19jb25mLmR0aW1fcGVyaW9kIC0gMTsKKwkJZWxzZQorCQkJcHMtPmR0aW1fY291bnQtLTsKKwl9CiAKIAl0aW0gPSBwb3MgPSAodTggKikgc2tiX3B1dChza2IsIDYpOwogCSpwb3MrKyA9IFdMQU5fRUlEX1RJTTsKQEAgLTIzOTEsNyArMjM5Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2JlYWNvbl9hZGRfdGltKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCSAgICBzdHJ1Y3QgcHNfZGF0YSAqcHMsIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJICAgIHN0cnVjdCBwc19kYXRhICpwcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgYm9vbCBpc190ZW1wbGF0ZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIApAQCAtMjQwMywyNCArMjQwNiwyNCBAQAogCSAqIG9mIHRoZSB0aW0gYml0bWFwIGluIG1hYzgwMjExIGFuZCB0aGUgZHJpdmVyLgogCSAqLwogCWlmIChsb2NhbC0+dGltX2luX2xvY2tlZF9zZWN0aW9uKSB7Ci0JCV9faWVlZTgwMjExX2JlYWNvbl9hZGRfdGltKHNkYXRhLCBwcywgc2tiKTsKKwkJX19pZWVlODAyMTFfYmVhY29uX2FkZF90aW0oc2RhdGEsIHBzLCBza2IsIGlzX3RlbXBsYXRlKTsKIAl9IGVsc2UgewogCQlzcGluX2xvY2tfYmgoJmxvY2FsLT50aW1fbG9jayk7Ci0JCV9faWVlZTgwMjExX2JlYWNvbl9hZGRfdGltKHNkYXRhLCBwcywgc2tiKTsKKwkJX19pZWVlODAyMTFfYmVhY29uX2FkZF90aW0oc2RhdGEsIHBzLCBza2IsIGlzX3RlbXBsYXRlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT50aW1fbG9jayk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV91cGRhdGVfY3NhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCSBzdHJ1Y3QgYmVhY29uX2RhdGEgKmJlYWNvbikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZXRfY3NhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgICAgc3RydWN0IGJlYWNvbl9kYXRhICpiZWFjb24pCiB7CiAJc3RydWN0IHByb2JlX3Jlc3AgKnJlc3A7Ci0JaW50IGNvdW50ZXJfb2Zmc2V0X2JlYWNvbiA9IHNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfYmVhY29uOwotCWludCBjb3VudGVyX29mZnNldF9wcmVzcCA9IHNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfcHJlc3A7CiAJdTggKmJlYWNvbl9kYXRhOwogCXNpemVfdCBiZWFjb25fZGF0YV9sZW47CisJaW50IGk7CisJdTggY291bnQgPSBzZGF0YS0+Y3NhX2N1cnJlbnRfY291bnRlcjsKIAogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKQEAgLTI0MzgsNDAgKzI0NDEsNTcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm47CiAJfQotCWlmIChXQVJOX09OKGNvdW50ZXJfb2Zmc2V0X2JlYWNvbiA+PSBiZWFjb25fZGF0YV9sZW4pKQotCQlyZXR1cm47CiAKLQkvKiBXYXJuIGlmIHRoZSBkcml2ZXIgZGlkIG5vdCBjaGVjayBmb3IvcmVhY3QgdG8gY3NhCi0JICogY29tcGxldGVuZXNzLiAgQSBiZWFjb24gd2l0aCBDU0EgY291bnRlciBzZXQgdG8gMCBzaG91bGQKLQkgKiBuZXZlciBvY2N1ciwgYmVjYXVzZSBhIGNvdW50ZXIgb2YgMSBtZWFucyBzd2l0Y2gganVzdAotCSAqIGJlZm9yZSB0aGUgbmV4dCBiZWFjb24uCi0JICovCi0JaWYgKFdBUk5fT04oYmVhY29uX2RhdGFbY291bnRlcl9vZmZzZXRfYmVhY29uXSA9PSAxKSkKLQkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTUFYX0NTQV9DT1VOVEVSU19OVU07ICsraSkgeworCQl1MTYgY291bnRlcl9vZmZzZXRfYmVhY29uID0KKwkJCXNkYXRhLT5jc2FfY291bnRlcl9vZmZzZXRfYmVhY29uW2ldOworCQl1MTYgY291bnRlcl9vZmZzZXRfcHJlc3AgPSBzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X3ByZXNwW2ldOwogCi0JYmVhY29uX2RhdGFbY291bnRlcl9vZmZzZXRfYmVhY29uXS0tOworCQlpZiAoY291bnRlcl9vZmZzZXRfYmVhY29uKSB7CisJCQlpZiAoV0FSTl9PTihjb3VudGVyX29mZnNldF9iZWFjb24gPj0gYmVhY29uX2RhdGFfbGVuKSkKKwkJCQlyZXR1cm47CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmIGNvdW50ZXJfb2Zmc2V0X3ByZXNwKSB7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJcmVzcCA9IHJjdV9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5wcm9iZV9yZXNwKTsKLQotCQkvKiBpZiBubDgwMjExIGFjY2VwdGVkIHRoZSBvZmZzZXQsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICovCi0JCWlmIChXQVJOX09OKCFyZXNwKSkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm47CisJCQliZWFjb25fZGF0YVtjb3VudGVyX29mZnNldF9iZWFjb25dID0gY291bnQ7CiAJCX0KLQkJcmVzcC0+ZGF0YVtjb3VudGVyX29mZnNldF9wcmVzcF0tLTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCQkgICAgY291bnRlcl9vZmZzZXRfcHJlc3ApIHsKKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJCXJlc3AgPSByY3VfZGVyZWZlcmVuY2Uoc2RhdGEtPnUuYXAucHJvYmVfcmVzcCk7CisKKwkJCS8qIElmIG5sODAyMTEgYWNjZXB0ZWQgdGhlIG9mZnNldCwgdGhpcyBzaG91bGQKKwkJCSAqIG5vdCBoYXBwZW4uCisJCQkgKi8KKwkJCWlmIChXQVJOX09OKCFyZXNwKSkgeworCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXJlc3AtPmRhdGFbY291bnRlcl9vZmZzZXRfcHJlc3BdID0gY291bnQ7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJfQogCX0KIH0KIAordTggaWVlZTgwMjExX2NzYV91cGRhdGVfY291bnRlcihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisKKwlzZGF0YS0+Y3NhX2N1cnJlbnRfY291bnRlci0tOworCisJLyogdGhlIGNvdW50ZXIgc2hvdWxkIG5ldmVyIHJlYWNoIDAgKi8KKwlXQVJOX09OKCFzZGF0YS0+Y3NhX2N1cnJlbnRfY291bnRlcik7CisKKwlyZXR1cm4gc2RhdGEtPmNzYV9jdXJyZW50X2NvdW50ZXI7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jc2FfdXBkYXRlX2NvdW50ZXIpOworCiBib29sIGllZWU4MDIxMV9jc2FfaXNfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOwogCXN0cnVjdCBiZWFjb25fZGF0YSAqYmVhY29uID0gTlVMTDsKIAl1OCAqYmVhY29uX2RhdGE7CiAJc2l6ZV90IGJlYWNvbl9kYXRhX2xlbjsKLQlpbnQgY291bnRlcl9iZWFjb24gPSBzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X2JlYWNvbjsKKwlpbnQgY291bnRlcl9iZWFjb24gPSBzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X2JlYWNvblswXTsKIAlpbnQgcmV0ID0gZmFsc2U7CiAKIAlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKQEAgLTI1MjEsOSArMjU0MSwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3NhX2lzX2NvbXBsZXRlKTsKIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9iZWFjb25fZ2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJCSB1MTYgKnRpbV9vZmZzZXQsIHUxNiAqdGltX2xlbmd0aCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitfX2llZWU4MDIxMV9iZWFjb25fZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbXV0YWJsZV9vZmZzZXRzICpvZmZzLAorCQkgICAgICAgYm9vbCBpc190ZW1wbGF0ZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKQEAgLTI1MzIsNiArMjU1NCw3IEBACiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sIHR4cmM7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZjsKKwlpbnQgY3NhX29mZl9iYXNlID0gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIApAQCAtMjU0MSwxOCArMjU2NCwyMCBAQAogCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpIHx8ICFjaGFuY3R4X2NvbmYpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRpbV9vZmZzZXQpCi0JCSp0aW1fb2Zmc2V0ID0gMDsKLQlpZiAodGltX2xlbmd0aCkKLQkJKnRpbV9sZW5ndGggPSAwOworCWlmIChvZmZzKQorCQltZW1zZXQob2ZmcywgMCwgc2l6ZW9mKCpvZmZzKSk7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfYXAgKmFwID0gJnNkYXRhLT51LmFwOwogCQlzdHJ1Y3QgYmVhY29uX2RhdGEgKmJlYWNvbiA9IHJjdV9kZXJlZmVyZW5jZShhcC0+YmVhY29uKTsKIAogCQlpZiAoYmVhY29uKSB7Ci0JCQlpZiAoc2RhdGEtPnZpZi5jc2FfYWN0aXZlKQotCQkJCWllZWU4MDIxMV91cGRhdGVfY3NhKHNkYXRhLCBiZWFjb24pOworCQkJaWYgKHNkYXRhLT52aWYuY3NhX2FjdGl2ZSkgeworCQkJCWlmICghaXNfdGVtcGxhdGUpCisJCQkJCWllZWU4MDIxMV9jc2FfdXBkYXRlX2NvdW50ZXIodmlmKTsKKworCQkJCWllZWU4MDIxMV9zZXRfY3NhKHNkYXRhLCBiZWFjb24pOworCQkJfQogCiAJCQkvKgogCQkJICogaGVhZHJvb20sIGhlYWQgbGVuZ3RoLApAQCAtMjU2OSwxMiArMjU5NCwxNiBAQAogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBiZWFjb24tPmhlYWRfbGVuKSwgYmVhY29uLT5oZWFkLAogCQkJICAgICAgIGJlYWNvbi0+aGVhZF9sZW4pOwogCi0JCQlpZWVlODAyMTFfYmVhY29uX2FkZF90aW0oc2RhdGEsICZhcC0+cHMsIHNrYik7CisJCQlpZWVlODAyMTFfYmVhY29uX2FkZF90aW0oc2RhdGEsICZhcC0+cHMsIHNrYiwKKwkJCQkJCSBpc190ZW1wbGF0ZSk7CiAKLQkJCWlmICh0aW1fb2Zmc2V0KQotCQkJCSp0aW1fb2Zmc2V0ID0gYmVhY29uLT5oZWFkX2xlbjsKLQkJCWlmICh0aW1fbGVuZ3RoKQotCQkJCSp0aW1fbGVuZ3RoID0gc2tiLT5sZW4gLSBiZWFjb24tPmhlYWRfbGVuOworCQkJaWYgKG9mZnMpIHsKKwkJCQlvZmZzLT50aW1fb2Zmc2V0ID0gYmVhY29uLT5oZWFkX2xlbjsKKwkJCQlvZmZzLT50aW1fbGVuZ3RoID0gc2tiLT5sZW4gLSBiZWFjb24tPmhlYWRfbGVuOworCisJCQkJLyogZm9yIEFQIHRoZSBjc2Egb2Zmc2V0cyBhcmUgZnJvbSB0YWlsICovCisJCQkJY3NhX29mZl9iYXNlID0gc2tiLT5sZW47CisJCQl9CiAKIAkJCWlmIChiZWFjb24tPnRhaWwpCiAJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBiZWFjb24tPnRhaWxfbGVuKSwKQEAgLTI1ODksOSArMjYxOCwxMiBAQAogCQlpZiAoIXByZXNwKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHNkYXRhLT52aWYuY3NhX2FjdGl2ZSkKLQkJCWllZWU4MDIxMV91cGRhdGVfY3NhKHNkYXRhLCBwcmVzcCk7CisJCWlmIChzZGF0YS0+dmlmLmNzYV9hY3RpdmUpIHsKKwkJCWlmICghaXNfdGVtcGxhdGUpCisJCQkJaWVlZTgwMjExX2NzYV91cGRhdGVfY291bnRlcih2aWYpOwogCisJCQlpZWVlODAyMTFfc2V0X2NzYShzZGF0YSwgcHJlc3ApOworCQl9CiAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+dHhfaGVhZHJvb20gKyBwcmVzcC0+aGVhZF9sZW4gKwogCQkJCSAgICBsb2NhbC0+aHcuZXh0cmFfYmVhY29uX3RhaWxyb29tKTsKQEAgLTI2MTEsOCArMjY0MywxNyBAQAogCQlpZiAoIWJjbikKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChzZGF0YS0+dmlmLmNzYV9hY3RpdmUpCi0JCQlpZWVlODAyMTFfdXBkYXRlX2NzYShzZGF0YSwgYmNuKTsKKwkJaWYgKHNkYXRhLT52aWYuY3NhX2FjdGl2ZSkgeworCQkJaWYgKCFpc190ZW1wbGF0ZSkKKwkJCQkvKiBUT0RPOiBGb3IgbWVzaCBjc2FfY291bnRlciBpcyBpbiBUVSwgc28KKwkJCQkgKiBkZWNyZW1lbnRpbmcgaXQgYnkgb25lIGlzbid0IGNvcnJlY3QsIGJ1dAorCQkJCSAqIGZvciBub3cgd2UgbGVhdmUgaXQgY29uc2lzdGVudCB3aXRoIG92ZXJhbGwKKwkJCQkgKiBtYWM4MDIxMSdzIGJlaGF2aW9yLgorCQkJCSAqLworCQkJCWllZWU4MDIxMV9jc2FfdXBkYXRlX2NvdW50ZXIodmlmKTsKKworCQkJaWVlZTgwMjExX3NldF9jc2Eoc2RhdGEsIGJjbik7CisJCX0KIAogCQlpZiAoaWZtc2gtPnN5bmNfb3BzKQogCQkJaWZtc2gtPnN5bmNfb3BzLT5hZGp1c3RfdGJ0dChzZGF0YSwgYmNuKTsKQEAgLTI2MjYsMTMgKzI2NjcsMzMgQEAKIAkJCWdvdG8gb3V0OwogCQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT50eF9oZWFkcm9vbSk7CiAJCW1lbWNweShza2JfcHV0KHNrYiwgYmNuLT5oZWFkX2xlbiksIGJjbi0+aGVhZCwgYmNuLT5oZWFkX2xlbik7Ci0JCWllZWU4MDIxMV9iZWFjb25fYWRkX3RpbShzZGF0YSwgJmlmbXNoLT5wcywgc2tiKTsKKwkJaWVlZTgwMjExX2JlYWNvbl9hZGRfdGltKHNkYXRhLCAmaWZtc2gtPnBzLCBza2IsIGlzX3RlbXBsYXRlKTsKKworCQlpZiAob2ZmcykgeworCQkJb2Zmcy0+dGltX29mZnNldCA9IGJjbi0+aGVhZF9sZW47CisJCQlvZmZzLT50aW1fbGVuZ3RoID0gc2tiLT5sZW4gLSBiY24tPmhlYWRfbGVuOworCQl9CisKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLCBiY24tPnRhaWxfbGVuKSwgYmNuLT50YWlsLCBiY24tPnRhaWxfbGVuKTsKIAl9IGVsc2UgewogCQlXQVJOX09OKDEpOwogCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBDU0Egb2Zmc2V0cyAqLworCWlmIChvZmZzKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTUFYX0NTQV9DT1VOVEVSU19OVU07IGkrKykgeworCQkJdTE2IGNzYV9vZmYgPSBzZGF0YS0+Y3NhX2NvdW50ZXJfb2Zmc2V0X2JlYWNvbltpXTsKKworCQkJaWYgKCFjc2Ffb2ZmKQorCQkJCWNvbnRpbnVlOworCisJCQlvZmZzLT5jc2FfY291bnRlcl9vZmZzW2ldID0gY3NhX29mZl9iYXNlICsgY3NhX29mZjsKKwkJfQorCX0KKwogCWJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOwogCiAJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKQEAgLTI2NjMsNiArMjcyNCwzMiBAQAogIG91dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gc2tiOworCit9CisKK3N0cnVjdCBza19idWZmICoKK2llZWU4MDIxMV9iZWFjb25fZ2V0X3RlbXBsYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfbXV0YWJsZV9vZmZzZXRzICpvZmZzKQoreworCXJldHVybiBfX2llZWU4MDIxMV9iZWFjb25fZ2V0KGh3LCB2aWYsIG9mZnMsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfYmVhY29uX2dldF90ZW1wbGF0ZSk7CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfYmVhY29uX2dldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQkgdTE2ICp0aW1fb2Zmc2V0LCB1MTYgKnRpbV9sZW5ndGgpCit7CisJc3RydWN0IGllZWU4MDIxMV9tdXRhYmxlX29mZnNldHMgb2ZmcyA9IHt9OworCXN0cnVjdCBza19idWZmICpiY24gPSBfX2llZWU4MDIxMV9iZWFjb25fZ2V0KGh3LCB2aWYsICZvZmZzLCBmYWxzZSk7CisKKwlpZiAodGltX29mZnNldCkKKwkJKnRpbV9vZmZzZXQgPSBvZmZzLnRpbV9vZmZzZXQ7CisKKwlpZiAodGltX2xlbmd0aCkKKwkJKnRpbV9sZW5ndGggPSBvZmZzLnRpbV9sZW5ndGg7CisKKwlyZXR1cm4gYmNuOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfYmVhY29uX2dldF90aW0pOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCAzYzM2NTgzLi42ODg2NjAxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCWllZWU4MDIxMV9zdG9wX3F1ZXVlc19ieV9yZWFzb24oJmxvY2FsLT5odywgSUVFRTgwMjExX01BWF9RVUVVRV9NQVAsCiAJCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9GTFVTSCk7CiAKLQlkcnZfZmx1c2gobG9jYWwsIHF1ZXVlcywgZmFsc2UpOworCWRydl9mbHVzaChsb2NhbCwgc2RhdGEsIHF1ZXVlcywgZmFsc2UpOwogCiAJaWVlZTgwMjExX3dha2VfcXVldWVzX2J5X3JlYXNvbigmbG9jYWwtPmh3LCBJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKIAkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0ZMVVNIKTsKQEAgLTE0NTcsNiArMTQ1Nyw0NCBAQAogCWRydl9zdG9wKGxvY2FsKTsKIH0KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2hhbmRsZV9yZWNvbmZpZ19mYWlsdXJlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3R4OworCisJLyoKKwkgKiBXZSBnZXQgaGVyZSBpZiBkdXJpbmcgcmVzdW1lIHRoZSBkZXZpY2UgY2FuJ3QgYmUgcmVzdGFydGVkIHByb3Blcmx5LgorCSAqIFdlIG1pZ2h0IGFsc28gZ2V0IGhlcmUgaWYgdGhpcyBoYXBwZW5zIGR1cmluZyBIVyByZXNldCwgd2hpY2ggaXMgYQorCSAqIHNsaWdodGx5IGRpZmZlcmVudCBzaXR1YXRpb24gYW5kIHdlIG5lZWQgdG8gZHJvcCBhbGwgY29ubmVjdGlvbnMgaW4KKwkgKiB0aGUgbGF0dGVyIGNhc2UuCisJICoKKwkgKiBBc2sgY2ZnODAyMTEgdG8gdHVybiBvZmYgYWxsIGludGVyZmFjZXMsIHRoaXMgd2lsbCByZXN1bHQgaW4gbW9yZQorCSAqIHdhcm5pbmdzIGJ1dCBhdCBsZWFzdCB3ZSdsbCB0aGVuIGdldCBpbnRvIGEgY2xlYW4gc3RvcHBlZCBzdGF0ZS4KKwkgKi8KKworCWxvY2FsLT5yZXN1bWluZyA9IGZhbHNlOworCWxvY2FsLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlsb2NhbC0+c3RhcnRlZCA9IGZhbHNlOworCisJLyogc2NoZWR1bGVkIHNjYW4gY2xlYXJseSBjYW4ndCBiZSBydW5uaW5nIGFueSBtb3JlLCBidXQgdGVsbAorCSAqIGNmZzgwMjExIGFuZCBjbGVhciBsb2NhbCBzdGF0ZQorCSAqLworCWllZWU4MDIxMV9zY2hlZF9zY2FuX2VuZChsb2NhbCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpCisJCXNkYXRhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NEQVRBX0lOX0RSSVZFUjsKKworCS8qIE1hcmsgY2hhbm5lbCBjb250ZXh0cyBhcyBub3QgYmVpbmcgaW4gdGhlIGRyaXZlciBhbnkgbW9yZSB0byBhdm9pZAorCSAqIHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgZHJpdmVyIGR1cmluZyB0aGUgc2h1dGRvd24gcHJvY2Vzcy4uLgorCSAqLworCW11dGV4X2xvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZsb2NhbC0+Y2hhbmN0eF9saXN0LCBsaXN0KQorCQljdHgtPmRyaXZlcl9wcmVzZW50ID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCisJY2ZnODAyMTFfc2h1dGRvd25fYWxsX2ludGVyZmFjZXMobG9jYWwtPmh3LndpcGh5KTsKK30KKwogc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc2lnbl9jaGFuY3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CkBAIC0xNTIwLDkgKzE1NTgsMTEgQEAKIAkgKi8KIAlyZXMgPSBkcnZfc3RhcnQobG9jYWwpOwogCWlmIChyZXMpIHsKLQkJV0FSTihsb2NhbC0+c3VzcGVuZGVkLCAiSGFyZHdhcmUgYmVjYW1lIHVuYXZhaWxhYmxlICIKLQkJICAgICAidXBvbiByZXN1bWUuIFRoaXMgY291bGQgYmUgYSBzb2Z0d2FyZSBpc3N1ZSAiCi0JCSAgICAgInByaW9yIHRvIHN1c3BlbmQgb3IgYSBoYXJkd2FyZSBpc3N1ZS5cbiIpOworCQlpZiAobG9jYWwtPnN1c3BlbmRlZCkKKwkJCVdBUk4oMSwgIkhhcmR3YXJlIGJlY2FtZSB1bmF2YWlsYWJsZSB1cG9uIHJlc3VtZS4gVGhpcyBjb3VsZCBiZSBhIHNvZnR3YXJlIGlzc3VlIHByaW9yIHRvIHN1c3BlbmQgb3IgYSBoYXJkd2FyZSBpc3N1ZS5cbiIpOworCQllbHNlCisJCQlXQVJOKDEsICJIYXJkd2FyZSBiZWNhbWUgdW5hdmFpbGFibGUgZHVyaW5nIHJlc3RhcnQuXG4iKTsKKwkJaWVlZTgwMjExX2hhbmRsZV9yZWNvbmZpZ19mYWlsdXJlKGxvY2FsKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKQEAgLTE1NDYsNyArMTU4Niw3IEBACiAJCVdBUk5fT04obG9jYWwtPnJlc3VtaW5nKTsKIAkJcmVzID0gZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKIAkJaWYgKFdBUk5fT04ocmVzKSkgewotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5tb25pdG9yX3NkYXRhLCBOVUxMKTsKKwkJCVJDVV9JTklUX1BPSU5URVIobG9jYWwtPm1vbml0b3Jfc2RhdGEsIE5VTEwpOwogCQkJc3luY2hyb25pemVfbmV0KCk7CiAJCQlrZnJlZShzZGF0YSk7CiAJCX0KQEAgLTE1NjUsMTcgKzE2MDUsMTcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZsb2NhbC0+Y2hhbmN0eF9saXN0LCBsaXN0KQogCQkJV0FSTl9PTihkcnZfYWRkX2NoYW5jdHgobG9jYWwsIGN0eCkpOwogCQltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7Ci0JfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7Ci0JCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQkJY29udGludWU7Ci0JCWllZWU4MDIxMV9hc3NpZ25fY2hhbmN0eChsb2NhbCwgc2RhdGEpOwotCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CisJCQlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKKwkJCQljb250aW51ZTsKKwkJCWllZWU4MDIxMV9hc3NpZ25fY2hhbmN0eChsb2NhbCwgc2RhdGEpOworCQl9CiAKLQlzZGF0YSA9IHJ0bmxfZGVyZWZlcmVuY2UobG9jYWwtPm1vbml0b3Jfc2RhdGEpOwotCWlmIChzZGF0YSAmJiBpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCi0JCWllZWU4MDIxMV9hc3NpZ25fY2hhbmN0eChsb2NhbCwgc2RhdGEpOworCQlzZGF0YSA9IHJ0bmxfZGVyZWZlcmVuY2UobG9jYWwtPm1vbml0b3Jfc2RhdGEpOworCQlpZiAoc2RhdGEgJiYgaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQkJaWVlZTgwMjExX2Fzc2lnbl9jaGFuY3R4KGxvY2FsLCBzZGF0YSk7CisJfQogCiAJLyogYWRkIFNUQXMgYmFjayAqLwogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKQEAgLTE2NzEsMTMgKzE3MTEsMTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJCS8qIGlnbm9yZSB2aXJ0dWFsICovCi0JCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgotCQkJY2hhbmdlZCA9IEJTU19DSEFOR0VEX0lETEU7CisJCQkvKiBub3RoaW5nIHRvIGRvICovCiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKIAkJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgpAQCAtMjc5NywzICsyODM0LDEyMSBAQAogCiAJcHMtPmR0aW1fY291bnQgPSBkdGltX2NvdW50OwogfQorCitpbnQgaWVlZTgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAorCQkJCSBlbnVtIGllZWU4MDIxMV9jaGFuY3R4X21vZGUgY2hhbm1vZGUsCisJCQkJIHU4IHJhZGFyX2RldGVjdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YV9pdGVyOworCWVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlID0gc2RhdGEtPndkZXYuaWZ0eXBlOworCWludCBudW1bTlVNX05MODAyMTFfSUZUWVBFU107CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7CisJaW50IG51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAwOworCWludCB0b3RhbCA9IDE7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOworCisJaWYgKFdBUk5fT04oaHdlaWdodDMyKHJhZGFyX2RldGVjdCkgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTihjaGFuZGVmICYmIGNoYW5tb2RlID09IElFRUU4MDIxMV9DSEFOQ1RYX1NIQVJFRCAmJgorCQkgICAgIWNoYW5kZWYtPmNoYW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaGFuZGVmKQorCQludW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMTsKKworCWlmIChXQVJOX09OKGlmdHlwZSA+PSBOVU1fTkw4MDIxMV9JRlRZUEVTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbHdheXMgYWxsb3cgc29mdHdhcmUgaWZ0eXBlcyAqLworCWlmIChsb2NhbC0+aHcud2lwaHktPnNvZnR3YXJlX2lmdHlwZXMgJiBCSVQoaWZ0eXBlKSkgeworCQlpZiAocmFkYXJfZGV0ZWN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChudW0sIDAsIHNpemVvZihudW0pKTsKKworCWlmIChpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpCisJCW51bVtpZnR5cGVdID0gMTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmbG9jYWwtPmNoYW5jdHhfbGlzdCwgbGlzdCkgeworCQlpZiAoY3R4LT5jb25mLnJhZGFyX2VuYWJsZWQpCisJCQlyYWRhcl9kZXRlY3QgfD0gQklUKGN0eC0+Y29uZi5kZWYud2lkdGgpOworCQlpZiAoY3R4LT5tb2RlID09IElFRUU4MDIxMV9DSEFOQ1RYX0VYQ0xVU0lWRSkgeworCQkJbnVtX2RpZmZlcmVudF9jaGFubmVscysrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoYW5kZWYgJiYgY2hhbm1vZGUgPT0gSUVFRTgwMjExX0NIQU5DVFhfU0hBUkVEICYmCisJCSAgICBjZmc4MDIxMV9jaGFuZGVmX2NvbXBhdGlibGUoY2hhbmRlZiwKKwkJCQkJCSZjdHgtPmNvbmYuZGVmKSkKKwkJCWNvbnRpbnVlOworCQludW1fZGlmZmVyZW50X2NoYW5uZWxzKys7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGFfaXRlciwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXZfaXRlcjsKKworCQl3ZGV2X2l0ZXIgPSAmc2RhdGFfaXRlci0+d2RldjsKKworCQlpZiAoc2RhdGFfaXRlciA9PSBzZGF0YSB8fAorCQkgICAgcmN1X2FjY2Vzc19wb2ludGVyKHNkYXRhX2l0ZXItPnZpZi5jaGFuY3R4X2NvbmYpID09IE5VTEwgfHwKKwkJICAgIGxvY2FsLT5ody53aXBoeS0+c29mdHdhcmVfaWZ0eXBlcyAmIEJJVCh3ZGV2X2l0ZXItPmlmdHlwZSkpCisJCQljb250aW51ZTsKKworCQludW1bd2Rldl9pdGVyLT5pZnR5cGVdKys7CisJCXRvdGFsKys7CisJfQorCisJaWYgKHRvdGFsID09IDEgJiYgIXJhZGFyX2RldGVjdCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2ZnODAyMTFfY2hlY2tfY29tYmluYXRpb25zKGxvY2FsLT5ody53aXBoeSwKKwkJCQkJICAgbnVtX2RpZmZlcmVudF9jaGFubmVscywKKwkJCQkJICAgcmFkYXJfZGV0ZWN0LCBudW0pOworfQorCitzdGF0aWMgdm9pZAoraWVlZTgwMjExX2l0ZXJfbWF4X2NoYW5zKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24gKmMsCisJCQkgdm9pZCAqZGF0YSkKK3sKKwl1MzIgKm1heF9udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gZGF0YTsKKworCSptYXhfbnVtX2RpZmZlcmVudF9jaGFubmVscyA9IG1heCgqbWF4X251bV9kaWZmZXJlbnRfY2hhbm5lbHMsCisJCQkJCSAgYy0+bnVtX2RpZmZlcmVudF9jaGFubmVscyk7Cit9CisKK2ludCBpZWVlODAyMTFfbWF4X251bV9jaGFubmVscyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKwlpbnQgbnVtW05VTV9OTDgwMjExX0lGVFlQRVNdID0ge307CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4ICpjdHg7CisJaW50IG51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAwOworCXU4IHJhZGFyX2RldGVjdCA9IDA7CisJdTMyIG1heF9udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMTsKKwlpbnQgZXJyOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmbG9jYWwtPmNoYW5jdHhfbGlzdCwgbGlzdCkgeworCQludW1fZGlmZmVyZW50X2NoYW5uZWxzKys7CisKKwkJaWYgKGN0eC0+Y29uZi5yYWRhcl9lbmFibGVkKQorCQkJcmFkYXJfZGV0ZWN0IHw9IEJJVChjdHgtPmNvbmYuZGVmLndpZHRoKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KQorCQludW1bc2RhdGEtPndkZXYuaWZ0eXBlXSsrOworCisJZXJyID0gY2ZnODAyMTFfaXRlcl9jb21iaW5hdGlvbnMobG9jYWwtPmh3LndpcGh5LAorCQkJCQkgbnVtX2RpZmZlcmVudF9jaGFubmVscywgcmFkYXJfZGV0ZWN0LAorCQkJCQkgbnVtLCBpZWVlODAyMTFfaXRlcl9tYXhfY2hhbnMsCisJCQkJCSAmbWF4X251bV9kaWZmZXJlbnRfY2hhbm5lbHMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG1heF9udW1fZGlmZmVyZW50X2NoYW5uZWxzOworfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dwYS5jIGIvbmV0L21hYzgwMjExL3dwYS5jCmluZGV4IGI4NjAwZTMuLjliM2RjYzIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93cGEuYworKysgYi9uZXQvbWFjODAyMTEvd3BhLmMKQEAgLTQwNiw3ICs0MDYsMTAgQEAKIAogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgogCSAgICAhKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikgJiYKLQkgICAgIShpbmZvLT5jb250cm9sLmh3X2tleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFKSkgeworCSAgICAhKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0UpICYmCisJICAgICEoKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmCisJICAgICAgIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVl9NR01UKSAmJgorCSAgICAgIGllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpKSB7CiAJCS8qCiAJCSAqIGh3YWNjZWwgaGFzIG5vIG5lZWQgZm9yIHByZWFsbG9jYXRlZCByb29tIGZvciBDQ01QCiAJCSAqIGhlYWRlciBvciBNSUMgZmllbGRzCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L0tjb25maWcgYi9uZXQvbWFjODAyMTU0L0tjb25maWcKaW5kZXggYjMzZGQ3Ni4uMTgxOGE5OSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9LY29uZmlnCisrKyBiL25ldC9tYWM4MDIxNTQvS2NvbmZpZwpAQCAtMiw2ICsyLDEwIEBACiAJdHJpc3RhdGUgIkdlbmVyaWMgSUVFRSA4MDIuMTUuNCBTb2Z0IE5ldHdvcmtpbmcgU3RhY2sgKG1hYzgwMjE1NCkiCiAJZGVwZW5kcyBvbiBJRUVFODAyMTU0CiAJc2VsZWN0IENSQ19DQ0lUVAorCXNlbGVjdCBDUllQVE9fQVVUSEVOQworCXNlbGVjdCBDUllQVE9fQ0NNCisJc2VsZWN0IENSWVBUT19DVFIKKwlzZWxlY3QgQ1JZUFRPX0FFUwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGhhcmR3YXJlIGluZGVwZW5kZW50IElFRUUgODAyLjE1LjQKIAkgIG5ldHdvcmtpbmcgc3RhY2sgZm9yIFNvZnRNQUMgZGV2aWNlcyAodGhlIG9uZXMgaW1wbGVtZW50aW5nCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L01ha2VmaWxlIGIvbmV0L21hYzgwMjE1NC9NYWtlZmlsZQppbmRleCAxNWQ2MmRmNS4uOTcyM2Q2ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9NYWtlZmlsZQorKysgYi9uZXQvbWFjODAyMTU0L01ha2VmaWxlCkBAIC0xLDQgKzEsNSBAQAogb2JqLSQoQ09ORklHX01BQzgwMjE1NCkJKz0gbWFjODAyMTU0Lm8KLW1hYzgwMjE1NC1vYmpzCQk6PSBpZWVlODAyMTU0X2Rldi5vIHJ4Lm8gdHgubyBtYWNfY21kLm8gbWliLm8gbW9uaXRvci5vIHdwYW4ubworbWFjODAyMTU0LW9ianMJCTo9IGllZWU4MDIxNTRfZGV2Lm8gcngubyB0eC5vIG1hY19jbWQubyBtaWIubyBcCisJCQkgICBtb25pdG9yLm8gd3Bhbi5vIGxsc2VjLm8KIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9sbHNlYy5jIGIvbmV0L21hYzgwMjE1NC9sbHNlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTZmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbWFjODAyMTU0L2xsc2VjLmMKQEAgLTAsMCArMSwxMDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyYXVuaG9mZXIgSVRXTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBXcml0dGVuIGJ5OgorICogUGhvZWJlIEJ1Y2toZWlzdGVyIDxwaG9lYmUuYnVja2hlaXN0ZXJAaXR3bS5mcmF1bmhvZmVyLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxNTQuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisKKyNpbmNsdWRlICJtYWM4MDIxNTQuaCIKKyNpbmNsdWRlICJsbHNlYy5oIgorCitzdGF0aWMgdm9pZCBsbHNlY19rZXlfcHV0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICprZXkpOworc3RhdGljIGJvb2wgbGxzZWNfa2V5X2lkX2VxdWFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqYSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmIpOworCitzdGF0aWMgdm9pZCBsbHNlY19kZXZfZnJlZShzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqZGV2KTsKKwordm9pZCBtYWM4MDIxNTRfbGxzZWNfaW5pdChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMpCit7CisJbWVtc2V0KHNlYywgMCwgc2l6ZW9mKCpzZWMpKTsKKworCW1lbXNldCgmc2VjLT5wYXJhbXMuZGVmYXVsdF9rZXlfc291cmNlLCAweEZGLCBJRUVFODAyMTU0X0FERFJfTEVOKTsKKworCUlOSVRfTElTVF9IRUFEKCZzZWMtPnRhYmxlLnNlY3VyaXR5X2xldmVscyk7CisJSU5JVF9MSVNUX0hFQUQoJnNlYy0+dGFibGUuZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNlYy0+dGFibGUua2V5cyk7CisJaGFzaF9pbml0KHNlYy0+ZGV2aWNlc19zaG9ydCk7CisJaGFzaF9pbml0KHNlYy0+ZGV2aWNlc19odyk7CisJcndsb2NrX2luaXQoJnNlYy0+bG9jayk7Cit9CisKK3ZvaWQgbWFjODAyMTU0X2xsc2VjX2Rlc3Ryb3koc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjKQoreworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsICpzbCwgKnNuOworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZSAqZGV2LCAqZG47CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2VudHJ5ICprZXksICprbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc24sICZzZWMtPnRhYmxlLnNlY3VyaXR5X2xldmVscywgbGlzdCkgeworCQlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsICptc2w7CisKKwkJbXNsID0gY29udGFpbmVyX29mKHNsLCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsLCBsZXZlbCk7CisJCWxpc3RfZGVsKCZzbC0+bGlzdCk7CisJCWtmcmVlKG1zbCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgZG4sICZzZWMtPnRhYmxlLmRldmljZXMsIGxpc3QpIHsKKwkJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UgKm1kZXY7CisKKwkJbWRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlLCBkZXYpOworCQlsaXN0X2RlbCgmZGV2LT5saXN0KTsKKwkJbGxzZWNfZGV2X2ZyZWUobWRldik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtleSwga24sICZzZWMtPnRhYmxlLmtleXMsIGxpc3QpIHsKKwkJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKm1rZXk7CisKKwkJbWtleSA9IGNvbnRhaW5lcl9vZihrZXktPmtleSwgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXksIGtleSk7CisJCWxpc3RfZGVsKCZrZXktPmxpc3QpOworCQlsbHNlY19rZXlfcHV0KG1rZXkpOworCQlrZnJlZShrZXkpOworCX0KK30KKworCisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZ2V0X3BhcmFtcyhzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zICpwYXJhbXMpCit7CisJcmVhZF9sb2NrX2JoKCZzZWMtPmxvY2spOworCSpwYXJhbXMgPSBzZWMtPnBhcmFtczsKKwlyZWFkX3VubG9ja19iaCgmc2VjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFjODAyMTU0X2xsc2VjX3NldF9wYXJhbXMoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgIGludCBjaGFuZ2VkKQoreworCXdyaXRlX2xvY2tfYmgoJnNlYy0+bG9jayk7CisKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxNTRfTExTRUNfUEFSQU1fRU5BQkxFRCkKKwkJc2VjLT5wYXJhbXMuZW5hYmxlZCA9IHBhcmFtcy0+ZW5hYmxlZDsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxNTRfTExTRUNfUEFSQU1fRlJBTUVfQ09VTlRFUikKKwkJc2VjLT5wYXJhbXMuZnJhbWVfY291bnRlciA9IHBhcmFtcy0+ZnJhbWVfY291bnRlcjsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxNTRfTExTRUNfUEFSQU1fT1VUX0xFVkVMKQorCQlzZWMtPnBhcmFtcy5vdXRfbGV2ZWwgPSBwYXJhbXMtPm91dF9sZXZlbDsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxNTRfTExTRUNfUEFSQU1fT1VUX0tFWSkKKwkJc2VjLT5wYXJhbXMub3V0X2tleSA9IHBhcmFtcy0+b3V0X2tleTsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxNTRfTExTRUNfUEFSQU1fS0VZX1NPVVJDRSkKKwkJc2VjLT5wYXJhbXMuZGVmYXVsdF9rZXlfc291cmNlID0gcGFyYW1zLT5kZWZhdWx0X2tleV9zb3VyY2U7CisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX1BBTl9JRCkKKwkJc2VjLT5wYXJhbXMucGFuX2lkID0gcGFyYW1zLT5wYW5faWQ7CisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX0hXQUREUikKKwkJc2VjLT5wYXJhbXMuaHdhZGRyID0gcGFyYW1zLT5od2FkZHI7CisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX0NPT1JEX0hXQUREUikKKwkJc2VjLT5wYXJhbXMuY29vcmRfaHdhZGRyID0gcGFyYW1zLT5jb29yZF9od2FkZHI7CisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX0NPT1JEX1NIT1JUQUREUikKKwkJc2VjLT5wYXJhbXMuY29vcmRfc2hvcnRhZGRyID0gcGFyYW1zLT5jb29yZF9zaG9ydGFkZHI7CisKKwl3cml0ZV91bmxvY2tfYmgoJnNlYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSoKK2xsc2VjX2tleV9hbGxvYyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkgKnRlbXBsYXRlKQoreworCWNvbnN0IGludCBhdXRoc2l6ZXNbM10gPSB7IDQsIDgsIDE2IH07CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleTsKKwlpbnQgaTsKKworCWtleSA9IGt6YWxsb2Moc2l6ZW9mKCprZXkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleSkKKwkJcmV0dXJuIE5VTEw7CisKKwlrcmVmX2luaXQoJmtleS0+cmVmKTsKKwlrZXktPmtleSA9ICp0ZW1wbGF0ZTsKKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGF1dGhzaXplcykgIT0gQVJSQVlfU0laRShrZXktPnRmbSkpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5LT50Zm0pOyBpKyspIHsKKwkJa2V5LT50Zm1baV0gPSBjcnlwdG9fYWxsb2NfYWVhZCgiY2NtKGFlcykiLCAwLAorCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJCWlmICgha2V5LT50Zm1baV0pCisJCQlnb3RvIGVycl90Zm07CisJCWlmIChjcnlwdG9fYWVhZF9zZXRrZXkoa2V5LT50Zm1baV0sIHRlbXBsYXRlLT5rZXksCisJCQkJICAgICAgIElFRUU4MDIxNTRfTExTRUNfS0VZX1NJWkUpKQorCQkJZ290byBlcnJfdGZtOworCQlpZiAoY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUoa2V5LT50Zm1baV0sIGF1dGhzaXplc1tpXSkpCisJCQlnb3RvIGVycl90Zm07CisJfQorCisJa2V5LT50Zm0wID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiY3RyKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoIWtleS0+dGZtMCkKKwkJZ290byBlcnJfdGZtOworCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGtleS0+dGZtMCwgdGVtcGxhdGUtPmtleSwKKwkJCQkgICAgSUVFRTgwMjE1NF9MTFNFQ19LRVlfU0laRSkpCisJCWdvdG8gZXJyX3RmbTA7CisKKwlyZXR1cm4ga2V5OworCitlcnJfdGZtMDoKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIoa2V5LT50Zm0wKTsKK2Vycl90Zm06CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5LT50Zm0pOyBpKyspCisJCWlmIChrZXktPnRmbVtpXSkKKwkJCWNyeXB0b19mcmVlX2FlYWQoa2V5LT50Zm1baV0pOworCisJa2ZyZWUoa2V5KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbGxzZWNfa2V5X3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSAqa2V5OworCWludCBpOworCisJa2V5ID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXksIHJlZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXktPnRmbSk7IGkrKykKKwkJY3J5cHRvX2ZyZWVfYWVhZChrZXktPnRmbVtpXSk7CisKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIoa2V5LT50Zm0wKTsKKwlrZnJlZShrZXkpOworfQorCitzdGF0aWMgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkqCitsbHNlY19rZXlfZ2V0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICprZXkpCit7CisJa3JlZl9nZXQoJmtleS0+cmVmKTsKKwlyZXR1cm4ga2V5OworfQorCitzdGF0aWMgdm9pZCBsbHNlY19rZXlfcHV0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICprZXkpCit7CisJa3JlZl9wdXQoJmtleS0+cmVmLCBsbHNlY19rZXlfcmVsZWFzZSk7Cit9CisKK3N0YXRpYyBib29sIGxsc2VjX2tleV9pZF9lcXVhbChjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkICpiKQoreworCWlmIChhLT5tb2RlICE9IGItPm1vZGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChhLT5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9JTVBMSUNJVCkKKwkJcmV0dXJuIGllZWU4MDIxNTRfYWRkcl9lcXVhbCgmYS0+ZGV2aWNlX2FkZHIsICZiLT5kZXZpY2VfYWRkcik7CisKKwlpZiAoYS0+aWQgIT0gYi0+aWQpCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoYS0+bW9kZSkgeworCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfS0VZX0lOREVYOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9TSE9SVF9JTkRFWDoKKwkJcmV0dXJuIGEtPnNob3J0X3NvdXJjZSA9PSBiLT5zaG9ydF9zb3VyY2U7CisJY2FzZSBJRUVFODAyMTU0X1NDRl9LRVlfSFdfSU5ERVg6CisJCXJldHVybiBhLT5leHRlbmRlZF9zb3VyY2UgPT0gYi0+ZXh0ZW5kZWRfc291cmNlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworaW50IG1hYzgwMjE1NF9sbHNlY19rZXlfYWRkKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmlkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleSAqa2V5KQoreworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICpta2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfZW50cnkgKnBvcywgKm5ldzsKKworCWlmICghKGtleS0+ZnJhbWVfdHlwZXMgJiAoMSA8PCBJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRCkpICYmCisJICAgIGtleS0+Y21kX2ZyYW1lX2lkcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNlYy0+dGFibGUua2V5cywgbGlzdCkgeworCQlpZiAobGxzZWNfa2V5X2lkX2VxdWFsKCZwb3MtPmlkLCBpZCkpCisJCQlyZXR1cm4gLUVFWElTVDsKKworCQlpZiAobWVtY21wKHBvcy0+a2V5LT5rZXksIGtleS0+a2V5LAorCQkJICAgSUVFRTgwMjE1NF9MTFNFQ19LRVlfU0laRSkpCisJCQljb250aW51ZTsKKworCQlta2V5ID0gY29udGFpbmVyX29mKHBvcy0+a2V5LCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSwga2V5KTsKKworCQkvKiBEb24ndCBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgQUVTIGtleSB0byBoYXZlCisJCSAqIGRpZmZlcmVudCBhbGxvd2VkIGZyYW1lIHR5cGVzL2NvbW1hbmQgZnJhbWUgaWRzLCBhcyB0aGlzIGlzCisJCSAqIG5vdCBwb3NzaWJsZSBpbiB0aGUgODAyLjE1LjQgUElCLgorCQkgKi8KKwkJaWYgKHBvcy0+a2V5LT5mcmFtZV90eXBlcyAhPSBrZXktPmZyYW1lX3R5cGVzIHx8CisJCSAgICBwb3MtPmtleS0+Y21kX2ZyYW1lX2lkcyAhPSBrZXktPmNtZF9mcmFtZV9pZHMpCisJCQlyZXR1cm4gLUVFWElTVDsKKworCQlicmVhazsKKwl9CisKKwluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFta2V5KQorCQlta2V5ID0gbGxzZWNfa2V5X2FsbG9jKGtleSk7CisJZWxzZQorCQlta2V5ID0gbGxzZWNfa2V5X2dldChta2V5KTsKKworCWlmICghbWtleSkKKwkJZ290byBmYWlsOworCisJbmV3LT5pZCA9ICppZDsKKwluZXctPmtleSA9ICZta2V5LT5rZXk7CisKKwlsaXN0X2FkZF9yY3UoJm5ldy0+bGlzdCwgJnNlYy0+dGFibGUua2V5cyk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZShuZXcpOworCXJldHVybiAtRU5PTUVNOworfQorCitpbnQgbWFjODAyMTU0X2xsc2VjX2tleV9kZWwoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqa2V5KQoreworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9lbnRyeSAqcG9zOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzZWMtPnRhYmxlLmtleXMsIGxpc3QpIHsKKwkJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKm1rZXk7CisKKwkJbWtleSA9IGNvbnRhaW5lcl9vZihwb3MtPmtleSwgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXksIGtleSk7CisKKwkJaWYgKGxsc2VjX2tleV9pZF9lcXVhbCgmcG9zLT5pZCwga2V5KSkgeworCQkJbGlzdF9kZWxfcmN1KCZwb3MtPmxpc3QpOworCQkJbGxzZWNfa2V5X3B1dChta2V5KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKworCitzdGF0aWMgYm9vbCBsbHNlY19kZXZfdXNlX3Nob3J0YWRkcihfX2xlMTYgc2hvcnRfYWRkcikKK3sKKwlyZXR1cm4gc2hvcnRfYWRkciAhPSBjcHVfdG9fbGUxNihJRUVFODAyMTU0X0FERFJfVU5ERUYpICYmCisJCXNob3J0X2FkZHIgIT0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKK30KKworc3RhdGljIHUzMiBsbHNlY19kZXZfaGFzaF9zaG9ydChfX2xlMTYgc2hvcnRfYWRkciwgX19sZTE2IHBhbl9pZCkKK3sKKwlyZXR1cm4gKChfX2ZvcmNlIHUxNikgc2hvcnRfYWRkcikgPDwgMTYgfCAoX19mb3JjZSB1MTYpIHBhbl9pZDsKK30KKworc3RhdGljIHU2NCBsbHNlY19kZXZfaGFzaF9sb25nKF9fbGU2NCBod2FkZHIpCit7CisJcmV0dXJuIChfX2ZvcmNlIHU2NCkgaHdhZGRyOworfQorCitzdGF0aWMgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UqCitsbHNlY19kZXZfZmluZF9zaG9ydChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsIF9fbGUxNiBzaG9ydF9hZGRyLAorCQkgICAgIF9fbGUxNiBwYW5faWQpCit7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UgKmRldjsKKwl1MzIga2V5ID0gbGxzZWNfZGV2X2hhc2hfc2hvcnQoc2hvcnRfYWRkciwgcGFuX2lkKTsKKworCWhhc2hfZm9yX2VhY2hfcG9zc2libGVfcmN1KHNlYy0+ZGV2aWNlc19zaG9ydCwgZGV2LCBidWNrZXRfcywga2V5KSB7CisJCWlmIChkZXYtPmRldi5zaG9ydF9hZGRyID09IHNob3J0X2FkZHIgJiYKKwkJICAgIGRldi0+ZGV2LnBhbl9pZCA9PSBwYW5faWQpCisJCQlyZXR1cm4gZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UqCitsbHNlY19kZXZfZmluZF9sb25nKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywgX19sZTY0IGh3YWRkcikKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqZGV2OworCXU2NCBrZXkgPSBsbHNlY19kZXZfaGFzaF9sb25nKGh3YWRkcik7CisKKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlX3JjdShzZWMtPmRldmljZXNfaHcsIGRldiwgYnVja2V0X2h3LCBrZXkpIHsKKwkJaWYgKGRldi0+ZGV2Lmh3YWRkciA9PSBod2FkZHIpCisJCQlyZXR1cm4gZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBsbHNlY19kZXZfZnJlZShzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKnBvcywgKnBuOworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqZGV2a2V5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgcG4sICZkZXYtPmRldi5rZXlzLCBsaXN0KSB7CisJCWRldmtleSA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSwKKwkJCQkgICAgICBkZXZrZXkpOworCisJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOworCQlrZnJlZShkZXZrZXkpOworCX0KKworCWtmcmVlKGRldik7Cit9CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZGV2X2FkZChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UgKmVudHJ5OworCXUzMiBza2V5ID0gbGxzZWNfZGV2X2hhc2hfc2hvcnQoZGV2LT5zaG9ydF9hZGRyLCBkZXYtPnBhbl9pZCk7CisJdTY0IGh3a2V5ID0gbGxzZWNfZGV2X2hhc2hfbG9uZyhkZXYtPmh3YWRkcik7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKGh3a2V5KSAhPSBJRUVFODAyMTU0X0FERFJfTEVOKTsKKworCWlmICgobGxzZWNfZGV2X3VzZV9zaG9ydGFkZHIoZGV2LT5zaG9ydF9hZGRyKSAmJgorCSAgICAgbGxzZWNfZGV2X2ZpbmRfc2hvcnQoc2VjLCBkZXYtPnNob3J0X2FkZHIsIGRldi0+cGFuX2lkKSkgfHwKKwkgICAgIGxsc2VjX2Rldl9maW5kX2xvbmcoc2VjLCBkZXYtPmh3YWRkcikpCisJCXJldHVybiAtRUVYSVNUOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5LT5kZXYgPSAqZGV2OworCXNwaW5fbG9ja19pbml0KCZlbnRyeS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5kZXYua2V5cyk7CisKKwlpZiAobGxzZWNfZGV2X3VzZV9zaG9ydGFkZHIoZGV2LT5zaG9ydF9hZGRyKSkKKwkJaGFzaF9hZGRfcmN1KHNlYy0+ZGV2aWNlc19zaG9ydCwgJmVudHJ5LT5idWNrZXRfcywgc2tleSk7CisJZWxzZQorCQlJTklUX0hMSVNUX05PREUoJmVudHJ5LT5idWNrZXRfcyk7CisKKwloYXNoX2FkZF9yY3Uoc2VjLT5kZXZpY2VzX2h3LCAmZW50cnktPmJ1Y2tldF9odywgaHdrZXkpOworCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+ZGV2Lmxpc3QsICZzZWMtPnRhYmxlLmRldmljZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxsc2VjX2Rldl9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlsbHNlY19kZXZfZnJlZShjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSwgcmN1KSk7Cit9CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZGV2X2RlbChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsIF9fbGU2NCBkZXZpY2VfYWRkcikKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqcG9zOworCisJcG9zID0gbGxzZWNfZGV2X2ZpbmRfbG9uZyhzZWMsIGRldmljZV9hZGRyKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwloYXNoX2RlbF9yY3UoJnBvcy0+YnVja2V0X3MpOworCWhhc2hfZGVsX3JjdSgmcG9zLT5idWNrZXRfaHcpOworCWNhbGxfcmN1KCZwb3MtPnJjdSwgbGxzZWNfZGV2X2ZyZWVfcmN1KTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSoKK2xsc2VjX2RldmtleV9maW5kKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXYsCisJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkICprZXkpCit7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqZGV2a2V5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGV2a2V5LCAmZGV2LT5kZXYua2V5cywgbGlzdCkgeworCQlpZiAoIWxsc2VjX2tleV9pZF9lcXVhbChrZXksICZkZXZrZXktPmtleV9pZCkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gY29udGFpbmVyX29mKGRldmtleSwgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5LAorCQkJCSAgICBkZXZrZXkpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgbWFjODAyMTU0X2xsc2VjX2RldmtleV9hZGQoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgICAgIF9fbGU2NCBkZXZfYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICprZXkpCit7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKmRldmtleTsKKworCWRldiA9IGxsc2VjX2Rldl9maW5kX2xvbmcoc2VjLCBkZXZfYWRkcik7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAobGxzZWNfZGV2a2V5X2ZpbmQoZGV2LCAma2V5LT5rZXlfaWQpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWRldmtleSA9IGttYWxsb2Moc2l6ZW9mKCpkZXZrZXkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldmtleSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZrZXktPmRldmtleSA9ICprZXk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJmRldmtleS0+ZGV2a2V5Lmxpc3QsICZkZXYtPmRldi5rZXlzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1hYzgwMjE1NF9sbHNlY19kZXZrZXlfZGVsKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJCSAgICAgICBfX2xlNjQgZGV2X2FkZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqa2V5KQoreworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXY7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICpkZXZrZXk7CisKKwlkZXYgPSBsbHNlY19kZXZfZmluZF9sb25nKHNlYywgZGV2X2FkZHIpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PRU5UOworCisJZGV2a2V5ID0gbGxzZWNfZGV2a2V5X2ZpbmQoZGV2LCAma2V5LT5rZXlfaWQpOworCWlmICghZGV2a2V5KQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWxpc3RfZGVsX3JjdSgmZGV2a2V5LT5kZXZrZXkubGlzdCk7CisJa2ZyZWVfcmN1KGRldmtleSwgcmN1KTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsKgorbGxzZWNfZmluZF9zZWNsZXZlbChjb25zdCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpCit7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgKnBvczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmc2VjLT50YWJsZS5zZWN1cml0eV9sZXZlbHMsIGxpc3QpIHsKKwkJaWYgKHBvcy0+ZnJhbWVfdHlwZSAhPSBzbC0+ZnJhbWVfdHlwZSB8fAorCQkgICAgKHBvcy0+ZnJhbWVfdHlwZSA9PSBJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRCAmJgorCQkgICAgIHBvcy0+Y21kX2ZyYW1lX2lkICE9IHNsLT5jbWRfZnJhbWVfaWQpIHx8CisJCSAgICBwb3MtPmRldmljZV9vdmVycmlkZSAhPSBzbC0+ZGV2aWNlX292ZXJyaWRlIHx8CisJCSAgICBwb3MtPnNlY19sZXZlbHMgIT0gc2wtPnNlY19sZXZlbHMpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gY29udGFpbmVyX29mKHBvcywgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19zZWNsZXZlbCwKKwkJCQkgICAgbGV2ZWwpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsX2FkZChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsICpzbCkKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsICplbnRyeTsKKworCWlmIChsbHNlY19maW5kX3NlY2xldmVsKHNlYywgc2wpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRyeS0+bGV2ZWwgPSAqc2w7CisKKwlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxldmVsLmxpc3QsICZzZWMtPnRhYmxlLnNlY3VyaXR5X2xldmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1hYzgwMjE1NF9sbHNlY19zZWNsZXZlbF9kZWwoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpCit7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19zZWNsZXZlbCAqcG9zOworCisJcG9zID0gbGxzZWNfZmluZF9zZWNsZXZlbChzZWMsIHNsKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlsaXN0X2RlbF9yY3UoJnBvcy0+bGV2ZWwubGlzdCk7CisJa2ZyZWVfcmN1KHBvcywgcmN1KTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBsbHNlY19yZWNvdmVyX2FkZHIoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxNTRfYWRkciAqYWRkcikKK3sKKwlfX2xlMTYgY2FkZHIgPSBzZWMtPnBhcmFtcy5jb29yZF9zaG9ydGFkZHI7CisJYWRkci0+cGFuX2lkID0gc2VjLT5wYXJhbXMucGFuX2lkOworCisJaWYgKGNhZGRyID09IGNwdV90b19sZTE2KElFRUU4MDIxNTRfQUREUl9CUk9BRENBU1QpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoY2FkZHIgPT0gY3B1X3RvX2xlMTYoSUVFRTgwMjE1NF9BRERSX1VOREVGKSkgeworCQlhZGRyLT5leHRlbmRlZF9hZGRyID0gc2VjLT5wYXJhbXMuY29vcmRfaHdhZGRyOworCQlhZGRyLT5tb2RlID0gSUVFRTgwMjE1NF9BRERSX0xPTkc7CisJfSBlbHNlIHsKKwkJYWRkci0+c2hvcnRfYWRkciA9IHNlYy0+cGFyYW1zLmNvb3JkX3Nob3J0YWRkcjsKKwkJYWRkci0+bW9kZSA9IElFRUU4MDIxNTRfQUREUl9TSE9SVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5KgorbGxzZWNfbG9va3VwX2tleShzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkciwKKwkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2FkZHIgKmFkZHIsCisJCSBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmtleV9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9hZGRyIGRldmFkZHIgPSAqYWRkcjsKKwl1OCBrZXlfaWRfbW9kZSA9IGhkci0+c2VjLmtleV9pZF9tb2RlOworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9lbnRyeSAqa2V5X2VudHJ5OworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICprZXk7CisKKwlpZiAoa2V5X2lkX21vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX0lNUExJQ0lUICYmCisJICAgIGRldmFkZHIubW9kZSA9PSBJRUVFODAyMTU0X0FERFJfTk9ORSkgeworCQlpZiAoaGRyLT5mYy50eXBlID09IElFRUU4MDIxNTRfRkNfVFlQRV9CRUFDT04pIHsKKwkJCWRldmFkZHIuZXh0ZW5kZWRfYWRkciA9IHNlYy0+cGFyYW1zLmNvb3JkX2h3YWRkcjsKKwkJCWRldmFkZHIubW9kZSA9IElFRUU4MDIxNTRfQUREUl9MT05HOworCQl9IGVsc2UgaWYgKGxsc2VjX3JlY292ZXJfYWRkcihzZWMsICZkZXZhZGRyKSA8IDApIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa2V5X2VudHJ5LCAmc2VjLT50YWJsZS5rZXlzLCBsaXN0KSB7CisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqaWQgPSAma2V5X2VudHJ5LT5pZDsKKworCQlpZiAoIShrZXlfZW50cnktPmtleS0+ZnJhbWVfdHlwZXMgJiBCSVQoaGRyLT5mYy50eXBlKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoaWQtPm1vZGUgIT0ga2V5X2lkX21vZGUpCisJCQljb250aW51ZTsKKworCQlpZiAoa2V5X2lkX21vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX0lNUExJQ0lUKSB7CisJCQlpZiAoaWVlZTgwMjE1NF9hZGRyX2VxdWFsKCZkZXZhZGRyLCAmaWQtPmRldmljZV9hZGRyKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9IGVsc2UgeworCQkJaWYgKGlkLT5pZCAhPSBoZHItPnNlYy5rZXlfaWQpCisJCQkJY29udGludWU7CisKKwkJCWlmICgoa2V5X2lkX21vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX0lOREVYKSB8fAorCQkJICAgIChrZXlfaWRfbW9kZSA9PSBJRUVFODAyMTU0X1NDRl9LRVlfU0hPUlRfSU5ERVggJiYKKwkJCSAgICAgaWQtPnNob3J0X3NvdXJjZSA9PSBoZHItPnNlYy5zaG9ydF9zcmMpIHx8CisJCQkgICAgKGtleV9pZF9tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWCAmJgorCQkJICAgICBpZC0+ZXh0ZW5kZWRfc291cmNlID09IGhkci0+c2VjLmV4dGVuZGVkX3NyYykpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworCitmb3VuZDoKKwlrZXkgPSBjb250YWluZXJfb2Yoa2V5X2VudHJ5LT5rZXksIHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5LCBrZXkpOworCWlmIChrZXlfaWQpCisJCSprZXlfaWQgPSBrZXlfZW50cnktPmlkOworCXJldHVybiBsbHNlY19rZXlfZ2V0KGtleSk7Cit9CisKKworc3RhdGljIHZvaWQgbGxzZWNfZ2VuaXYodTggaXZbMTZdLCBfX2xlNjQgYWRkciwKKwkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X3NlY2hkciAqc2VjKQoreworCV9fYmU2NCBhZGRyX2J5dGVzID0gKF9fZm9yY2UgX19iZTY0KSBzd2FiNjQoKF9fZm9yY2UgdTY0KSBhZGRyKTsKKwlfX2JlMzIgZnJhbWVfY291bnRlciA9IChfX2ZvcmNlIF9fYmUzMikgc3dhYjMyKChfX2ZvcmNlIHUzMikgc2VjLT5mcmFtZV9jb3VudGVyKTsKKworCWl2WzBdID0gMTsgLyogTCcgPSBMIC0gMSA9IDEgKi8KKwltZW1jcHkoaXYgKyAxLCAmYWRkcl9ieXRlcywgc2l6ZW9mKGFkZHJfYnl0ZXMpKTsKKwltZW1jcHkoaXYgKyA5LCAmZnJhbWVfY291bnRlciwgc2l6ZW9mKGZyYW1lX2NvdW50ZXIpKTsKKwlpdlsxM10gPSBzZWMtPmxldmVsOworCWl2WzE0XSA9IDA7CisJaXZbMTVdID0gMTsKK30KKworc3RhdGljIGludAorbGxzZWNfZG9fZW5jcnlwdF91bmF1dGgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfaGRyICpoZHIsCisJCQlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSAqa2V5KQoreworCXU4IGl2WzE2XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyByZXEgPSB7CisJCS50Zm0gPSBrZXktPnRmbTAsCisJCS5pbmZvID0gaXYsCisJCS5mbGFncyA9IDAsCisJfTsKKworCWxsc2VjX2dlbml2KGl2LCBzZWMtPnBhcmFtcy5od2FkZHIsICZoZHItPnNlYyk7CisJc2dfaW5pdF9vbmUoJnNyYywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmcmVxLCAmc3JjLCAmc3JjLCBza2ItPmxlbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FlYWQqCitsbHNlY190Zm1fYnlfbGVuKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfa2V5ICprZXksIGludCBhdXRobGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5LT50Zm0pOyBpKyspCisJCWlmIChjcnlwdG9fYWVhZF9hdXRoc2l6ZShrZXktPnRmbVtpXSkgPT0gYXV0aGxlbikKKwkJCXJldHVybiBrZXktPnRmbVtpXTsKKworCUJVRygpOworfQorCitzdGF0aWMgaW50CitsbHNlY19kb19lbmNyeXB0X2F1dGgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkciwKKwkJICAgICAgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleSkKK3sKKwl1OCBpdlsxNl07CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgYXV0aGxlbiwgYXNzb2NsZW4sIGRhdGFsZW4sIHJjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzcmMsIGFzc29jWzJdLCBkc3RbMl07CisJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxOworCisJYXV0aGxlbiA9IGllZWU4MDIxNTRfc2VjaGRyX2F1dGh0YWdfbGVuKCZoZHItPnNlYyk7CisJbGxzZWNfZ2VuaXYoaXYsIHNlYy0+cGFyYW1zLmh3YWRkciwgJmhkci0+c2VjKTsKKworCXJlcSA9IGFlYWRfcmVxdWVzdF9hbGxvYyhsbHNlY190Zm1fYnlfbGVuKGtleSwgYXV0aGxlbiksIEdGUF9BVE9NSUMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNnX2luaXRfdGFibGUoYXNzb2MsIDIpOworCXNnX3NldF9idWYoJmFzc29jWzBdLCBza2JfbWFjX2hlYWRlcihza2IpLCBza2ItPm1hY19sZW4pOworCWFzc29jbGVuID0gc2tiLT5tYWNfbGVuOworCisJZGF0YSA9IHNrYl9tYWNfaGVhZGVyKHNrYikgKyBza2ItPm1hY19sZW47CisJZGF0YWxlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGRhdGE7CisKKwlpZiAoaGRyLT5zZWMubGV2ZWwgJiBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkMpIHsKKwkJc2dfc2V0X2J1ZigmYXNzb2NbMV0sIGRhdGEsIDApOworCX0gZWxzZSB7CisJCXNnX3NldF9idWYoJmFzc29jWzFdLCBkYXRhLCBkYXRhbGVuKTsKKwkJYXNzb2NsZW4gKz0gZGF0YWxlbjsKKwkJZGF0YWxlbiA9IDA7CisJfQorCisJc2dfaW5pdF9vbmUoJnNyYywgZGF0YSwgZGF0YWxlbik7CisKKwlzZ19pbml0X3RhYmxlKGRzdCwgMik7CisJc2dfc2V0X2J1ZigmZHN0WzBdLCBkYXRhLCBkYXRhbGVuKTsKKwlzZ19zZXRfYnVmKCZkc3RbMV0sIHNrYl9wdXQoc2tiLCBhdXRobGVuKSwgYXV0aGxlbik7CisKKwlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgMCwgTlVMTCwgTlVMTCk7CisJYWVhZF9yZXF1ZXN0X3NldF9hc3NvYyhyZXEsIGFzc29jLCBhc3NvY2xlbik7CisJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsICZzcmMsIGRzdCwgZGF0YWxlbiwgaXYpOworCisJcmMgPSBjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSk7CisKKwlrZnJlZShyZXEpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxsc2VjX2RvX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfaGRyICpoZHIsCisJCQkgICAgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleSkKK3sKKwlpZiAoaGRyLT5zZWMubGV2ZWwgPT0gSUVFRTgwMjE1NF9TQ0ZfU0VDTEVWRUxfRU5DKQorCQlyZXR1cm4gbGxzZWNfZG9fZW5jcnlwdF91bmF1dGgoc2tiLCBzZWMsIGhkciwga2V5KTsKKwllbHNlCisJCXJldHVybiBsbHNlY19kb19lbmNyeXB0X2F1dGgoc2tiLCBzZWMsIGhkciwga2V5KTsKK30KKworaW50IG1hYzgwMjE1NF9sbHNlY19lbmNyeXB0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgaGRyOworCWludCByYywgYXV0aGxlbiwgaGxlbjsKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSAqa2V5OworCXUzMiBmcmFtZV9jdHI7CisKKwlobGVuID0gaWVlZTgwMjE1NF9oZHJfcHVsbChza2IsICZoZHIpOworCisJaWYgKGhsZW4gPCAwIHx8IGhkci5mYy50eXBlICE9IElFRUU4MDIxNTRfRkNfVFlQRV9EQVRBKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaGRyLmZjLnNlY3VyaXR5X2VuYWJsZWQgfHwgaGRyLnNlYy5sZXZlbCA9PSAwKSB7CisJCXNrYl9wdXNoKHNrYiwgaGxlbik7CisJCXJldHVybiAwOworCX0KKworCWF1dGhsZW4gPSBpZWVlODAyMTU0X3NlY2hkcl9hdXRodGFnX2xlbigmaGRyLnNlYyk7CisKKwlpZiAoc2tiLT5sZW4gKyBobGVuICsgYXV0aGxlbiArIElFRUU4MDIxNTRfTUZSX1NJWkUgPiBJRUVFODAyMTU0X01UVSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXJlYWRfbG9ja19iaCgmc2VjLT5sb2NrKTsKKworCWlmICghc2VjLT5wYXJhbXMuZW5hYmxlZCkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9yZWFkOworCX0KKworCWtleSA9IGxsc2VjX2xvb2t1cF9rZXkoc2VjLCAmaGRyLCAmaGRyLmRlc3QsIE5VTEwpOworCWlmICgha2V5KSB7CisJCXJjID0gLUVOT0tFWTsKKwkJZ290byBmYWlsX3JlYWQ7CisJfQorCisJcmVhZF91bmxvY2tfYmgoJnNlYy0+bG9jayk7CisKKwl3cml0ZV9sb2NrX2JoKCZzZWMtPmxvY2spOworCisJZnJhbWVfY3RyID0gYmUzMl90b19jcHUoc2VjLT5wYXJhbXMuZnJhbWVfY291bnRlcik7CisJaGRyLnNlYy5mcmFtZV9jb3VudGVyID0gY3B1X3RvX2xlMzIoZnJhbWVfY3RyKTsKKwlpZiAoZnJhbWVfY3RyID09IDB4RkZGRkZGRkYpIHsKKwkJd3JpdGVfdW5sb2NrX2JoKCZzZWMtPmxvY2spOworCQlsbHNlY19rZXlfcHV0KGtleSk7CisJCXJjID0gLUVPVkVSRkxPVzsKKwkJZ290byBmYWlsOworCX0KKworCXNlYy0+cGFyYW1zLmZyYW1lX2NvdW50ZXIgPSBjcHVfdG9fYmUzMihmcmFtZV9jdHIgKyAxKTsKKworCXdyaXRlX3VubG9ja19iaCgmc2VjLT5sb2NrKTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJc2tiLT5tYWNfbGVuID0gaWVlZTgwMjE1NF9oZHJfcHVzaChza2IsICZoZHIpOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisKKwlyYyA9IGxsc2VjX2RvX2VuY3J5cHQoc2tiLCBzZWMsICZoZHIsIGtleSk7CisJbGxzZWNfa2V5X3B1dChrZXkpOworCisJcmV0dXJuIHJjOworCitmYWlsX3JlYWQ6CisJcmVhZF91bmxvY2tfYmgoJnNlYy0+bG9jayk7CitmYWlsOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByYzsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSoKK2xsc2VjX2xvb2t1cF9kZXYoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9hZGRyIGRldmFkZHIgPSAqYWRkcjsKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqZGV2ID0gTlVMTDsKKworCWlmIChkZXZhZGRyLm1vZGUgPT0gSUVFRTgwMjE1NF9BRERSX05PTkUgJiYKKwkgICAgbGxzZWNfcmVjb3Zlcl9hZGRyKHNlYywgJmRldmFkZHIpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGV2YWRkci5tb2RlID09IElFRUU4MDIxNTRfQUREUl9TSE9SVCkgeworCQl1MzIga2V5ID0gbGxzZWNfZGV2X2hhc2hfc2hvcnQoZGV2YWRkci5zaG9ydF9hZGRyLAorCQkJCQkgICAgICAgZGV2YWRkci5wYW5faWQpOworCisJCWhhc2hfZm9yX2VhY2hfcG9zc2libGVfcmN1KHNlYy0+ZGV2aWNlc19zaG9ydCwgZGV2LAorCQkJCQkgICBidWNrZXRfcywga2V5KSB7CisJCQlpZiAoZGV2LT5kZXYucGFuX2lkID09IGRldmFkZHIucGFuX2lkICYmCisJCQkgICAgZGV2LT5kZXYuc2hvcnRfYWRkciA9PSBkZXZhZGRyLnNob3J0X2FkZHIpCisJCQkJcmV0dXJuIGRldjsKKwkJfQorCX0gZWxzZSB7CisJCXU2NCBrZXkgPSBsbHNlY19kZXZfaGFzaF9sb25nKGRldmFkZHIuZXh0ZW5kZWRfYWRkcik7CisKKwkJaGFzaF9mb3JfZWFjaF9wb3NzaWJsZV9yY3Uoc2VjLT5kZXZpY2VzX2h3LCBkZXYsCisJCQkJCSAgIGJ1Y2tldF9odywga2V5KSB7CisJCQlpZiAoZGV2LT5kZXYuaHdhZGRyID09IGRldmFkZHIuZXh0ZW5kZWRfYWRkcikKKwkJCQlyZXR1cm4gZGV2OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2xsc2VjX2xvb2t1cF9zZWNsZXZlbChjb25zdCBzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCSAgICAgIHU4IGZyYW1lX3R5cGUsIHU4IGNtZF9mcmFtZV9pZCwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgKnJsZXZlbCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqbGV2ZWw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsZXZlbCwgJnNlYy0+dGFibGUuc2VjdXJpdHlfbGV2ZWxzLCBsaXN0KSB7CisJCWlmIChsZXZlbC0+ZnJhbWVfdHlwZSA9PSBmcmFtZV90eXBlICYmCisJCSAgICAoZnJhbWVfdHlwZSAhPSBJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRCB8fAorCQkgICAgIGxldmVsLT5jbWRfZnJhbWVfaWQgPT0gY21kX2ZyYW1lX2lkKSkgeworCQkJKnJsZXZlbCA9ICpsZXZlbDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2xsc2VjX2RvX2RlY3J5cHRfdW5hdXRoKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2hkciAqaGRyLAorCQkJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleSwgX19sZTY0IGRldl9hZGRyKQoreworCXU4IGl2WzE2XTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBkYXRhbGVuOworCXN0cnVjdCBzY2F0dGVybGlzdCBzcmM7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIHJlcSA9IHsKKwkJLnRmbSA9IGtleS0+dGZtMCwKKwkJLmluZm8gPSBpdiwKKwkJLmZsYWdzID0gMCwKKwl9OworCisJbGxzZWNfZ2VuaXYoaXYsIGRldl9hZGRyLCAmaGRyLT5zZWMpOworCWRhdGEgPSBza2JfbWFjX2hlYWRlcihza2IpICsgc2tiLT5tYWNfbGVuOworCWRhdGFsZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBkYXRhOworCisJc2dfaW5pdF9vbmUoJnNyYywgZGF0YSwgZGF0YWxlbik7CisKKwlyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZyZXEsICZzcmMsICZzcmMsIGRhdGFsZW4pOworfQorCitzdGF0aWMgaW50CitsbHNlY19kb19kZWNyeXB0X2F1dGgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkciwKKwkJICAgICAgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleSwgX19sZTY0IGRldl9hZGRyKQoreworCXU4IGl2WzE2XTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBhdXRobGVuLCBkYXRhbGVuLCBhc3NvY2xlbiwgcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyYywgYXNzb2NbMl07CisJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxOworCisJYXV0aGxlbiA9IGllZWU4MDIxNTRfc2VjaGRyX2F1dGh0YWdfbGVuKCZoZHItPnNlYyk7CisJbGxzZWNfZ2VuaXYoaXYsIGRldl9hZGRyLCAmaGRyLT5zZWMpOworCisJcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKGxsc2VjX3RmbV9ieV9sZW4oa2V5LCBhdXRobGVuKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJc2dfaW5pdF90YWJsZShhc3NvYywgMik7CisJc2dfc2V0X2J1ZigmYXNzb2NbMF0sIHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrYi0+bWFjX2xlbik7CisJYXNzb2NsZW4gPSBza2ItPm1hY19sZW47CisKKwlkYXRhID0gc2tiX21hY19oZWFkZXIoc2tiKSArIHNrYi0+bWFjX2xlbjsKKwlkYXRhbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gZGF0YTsKKworCWlmIChoZHItPnNlYy5sZXZlbCAmIElFRUU4MDIxNTRfU0NGX1NFQ0xFVkVMX0VOQykgeworCQlzZ19zZXRfYnVmKCZhc3NvY1sxXSwgZGF0YSwgMCk7CisJfSBlbHNlIHsKKwkJc2dfc2V0X2J1ZigmYXNzb2NbMV0sIGRhdGEsIGRhdGFsZW4gLSBhdXRobGVuKTsKKwkJYXNzb2NsZW4gKz0gZGF0YWxlbiAtIGF1dGhsZW47CisJCWRhdGEgKz0gZGF0YWxlbiAtIGF1dGhsZW47CisJCWRhdGFsZW4gPSBhdXRobGVuOworCX0KKworCXNnX2luaXRfb25lKCZzcmMsIGRhdGEsIGRhdGFsZW4pOworCisJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIE5VTEwsIE5VTEwpOworCWFlYWRfcmVxdWVzdF9zZXRfYXNzb2MocmVxLCBhc3NvYywgYXNzb2NsZW4pOworCWFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCAmc3JjLCAmc3JjLCBkYXRhbGVuLCBpdik7CisKKwlyYyA9IGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKTsKKworCWtmcmVlKHJlcSk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIGF1dGhsZW4pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitsbHNlY19kb19kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2hkciAqaGRyLAorCQkgc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleSwgX19sZTY0IGRldl9hZGRyKQoreworCWlmIChoZHItPnNlYy5sZXZlbCA9PSBJRUVFODAyMTU0X1NDRl9TRUNMRVZFTF9FTkMpCisJCXJldHVybiBsbHNlY19kb19kZWNyeXB0X3VuYXV0aChza2IsIHNlYywgaGRyLCBrZXksIGRldl9hZGRyKTsKKwllbHNlCisJCXJldHVybiBsbHNlY19kb19kZWNyeXB0X2F1dGgoc2tiLCBzZWMsIGhkciwga2V5LCBkZXZfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQKK2xsc2VjX3VwZGF0ZV9kZXZrZXlfcmVjb3JkKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmluX2tleSkKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKmRldmtleTsKKworCWRldmtleSA9IGxsc2VjX2RldmtleV9maW5kKGRldiwgaW5fa2V5KTsKKworCWlmICghZGV2a2V5KSB7CisJCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqbmV4dDsKKworCQluZXh0ID0ga3phbGxvYyhzaXplb2YoKmRldmtleSksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5leHQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQluZXh0LT5kZXZrZXkua2V5X2lkID0gKmluX2tleTsKKworCQlzcGluX2xvY2tfYmgoJmRldi0+bG9jayk7CisKKwkJZGV2a2V5ID0gbGxzZWNfZGV2a2V5X2ZpbmQoZGV2LCBpbl9rZXkpOworCQlpZiAoIWRldmtleSkKKwkJCWxpc3RfYWRkX3JjdSgmbmV4dC0+ZGV2a2V5Lmxpc3QsICZkZXYtPmRldi5rZXlzKTsKKwkJZWxzZQorCQkJa2ZyZWUobmV4dCk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmRldi0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xsc2VjX3VwZGF0ZV9kZXZrZXlfaW5mbyhzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2RldmljZSAqZGV2LAorCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqaW5fa2V5LAorCQkJIHUzMiBmcmFtZV9jb3VudGVyKQoreworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqZGV2a2V5ID0gTlVMTDsKKworCWlmIChkZXYtPmRldi5rZXlfbW9kZSA9PSBJRUVFODAyMTU0X0xMU0VDX0RFVktFWV9SRVNUUklDVCkgeworCQlkZXZrZXkgPSBsbHNlY19kZXZrZXlfZmluZChkZXYsIGluX2tleSk7CisJCWlmICghZGV2a2V5KQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKGRldi0+ZGV2LmtleV9tb2RlID09IElFRUU4MDIxNTRfTExTRUNfREVWS0VZX1JFQ09SRCkgeworCQlpbnQgcmMgPSBsbHNlY191cGRhdGVfZGV2a2V5X3JlY29yZChkZXYsIGluX2tleSk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmRldi0+bG9jayk7CisKKwlpZiAoKCFkZXZrZXkgJiYgZnJhbWVfY291bnRlciA8IGRldi0+ZGV2LmZyYW1lX2NvdW50ZXIpIHx8CisJICAgIChkZXZrZXkgJiYgZnJhbWVfY291bnRlciA8IGRldmtleS0+ZGV2a2V5LmZyYW1lX2NvdW50ZXIpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGV2a2V5KQorCQlkZXZrZXktPmRldmtleS5mcmFtZV9jb3VudGVyID0gZnJhbWVfY291bnRlciArIDE7CisJZWxzZQorCQlkZXYtPmRldi5mcmFtZV9jb3VudGVyID0gZnJhbWVfY291bnRlciArIDE7CisKKwlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFjODAyMTU0X2xsc2VjX2RlY3J5cHQoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTU0X2hkciBoZHI7CisJc3RydWN0IG1hYzgwMjE1NF9sbHNlY19rZXkgKmtleTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQga2V5X2lkOworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlICpkZXY7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgc2VjbGV2ZWw7CisJaW50IGVycjsKKwlfX2xlNjQgZGV2X2FkZHI7CisJdTMyIGZyYW1lX2N0cjsKKworCWlmIChpZWVlODAyMTU0X2hkcl9wZWVrKHNrYiwgJmhkcikgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWhkci5mYy5zZWN1cml0eV9lbmFibGVkKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRyLmZjLnZlcnNpb24gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWFkX2xvY2tfYmgoJnNlYy0+bG9jayk7CisJaWYgKCFzZWMtPnBhcmFtcy5lbmFibGVkKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZzZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnNlYy0+bG9jayk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlrZXkgPSBsbHNlY19sb29rdXBfa2V5KHNlYywgJmhkciwgJmhkci5zb3VyY2UsICZrZXlfaWQpOworCWlmICgha2V5KSB7CisJCWVyciA9IC1FTk9LRVk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZXYgPSBsbHNlY19sb29rdXBfZGV2KHNlYywgJmhkci5zb3VyY2UpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9kZXY7CisJfQorCisJaWYgKGxsc2VjX2xvb2t1cF9zZWNsZXZlbChzZWMsIGhkci5mYy50eXBlLCAwLCAmc2VjbGV2ZWwpIDwgMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfZGV2OworCX0KKworCWlmICghKHNlY2xldmVsLnNlY19sZXZlbHMgJiBCSVQoaGRyLnNlYy5sZXZlbCkpICYmCisJICAgIChoZHIuc2VjLmxldmVsID09IDAgJiYgc2VjbGV2ZWwuZGV2aWNlX292ZXJyaWRlICYmCisJICAgICAhZGV2LT5kZXYuc2VjbGV2ZWxfZXhlbXB0KSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfZGV2OworCX0KKworCWZyYW1lX2N0ciA9IGxlMzJfdG9fY3B1KGhkci5zZWMuZnJhbWVfY291bnRlcik7CisKKwlpZiAoZnJhbWVfY3RyID09IDB4ZmZmZmZmZmYpIHsKKwkJZXJyID0gLUVPVkVSRkxPVzsKKwkJZ290byBmYWlsX2RldjsKKwl9CisKKwllcnIgPSBsbHNlY191cGRhdGVfZGV2a2V5X2luZm8oZGV2LCAma2V5X2lkLCBmcmFtZV9jdHIpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9kZXY7CisKKwlkZXZfYWRkciA9IGRldi0+ZGV2Lmh3YWRkcjsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJZXJyID0gbGxzZWNfZG9fZGVjcnlwdChza2IsIHNlYywgJmhkciwga2V5LCBkZXZfYWRkcik7CisJbGxzZWNfa2V5X3B1dChrZXkpOworCXJldHVybiBlcnI7CisKK2ZhaWxfZGV2OgorCWxsc2VjX2tleV9wdXQoa2V5KTsKK2ZhaWw6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxNTQvbGxzZWMuaCBiL25ldC9tYWM4MDIxNTQvbGxzZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1NzhlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21hYzgwMjE1NC9sbHNlYy5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyYXVuaG9mZXIgSVRXTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBXcml0dGVuIGJ5OgorICogUGhvZWJlIEJ1Y2toZWlzdGVyIDxwaG9lYmUuYnVja2hlaXN0ZXJAaXR3bS5mcmF1bmhvZmVyLmRlPgorICovCisKKyNpZm5kZWYgTUFDODAyMTU0X0xMU0VDX0gKKyNkZWZpbmUgTUFDODAyMTU0X0xMU0VDX0gKKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfaWVlZTgwMjE1NC5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTU0X25ldGRldi5oPgorCitzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjX2tleSB7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5IGtleTsKKworCS8qIG9uZSB0Zm0gZm9yIGVhY2ggYXV0aHNpemUgKDQvOC8xNikgKi8KKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbVszXTsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtMDsKKworCXN0cnVjdCBrcmVmIHJlZjsKK307CisKK3N0cnVjdCBtYWM4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSB7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSBkZXZrZXk7CisKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworfTsKKworc3RydWN0IG1hYzgwMjE1NF9sbHNlY19kZXZpY2UgeworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZSBkZXY7CisKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBidWNrZXRfczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBidWNrZXRfaHc7CisKKwkvKiBwcm90ZWN0cyBkZXYuZnJhbWVfY291bnRlciBhbmQgdGhlIGVsZW1lbnRzIG9mIGRldi5rZXlzICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKK307CisKK3N0cnVjdCBtYWM4MDIxNTRfbGxzZWNfc2VjbGV2ZWwgeworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsIGxldmVsOworCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKK307CisKK3N0cnVjdCBtYWM4MDIxNTRfbGxzZWMgeworCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3BhcmFtcyBwYXJhbXM7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfdGFibGUgdGFibGU7CisKKwlERUNMQVJFX0hBU0hUQUJMRShkZXZpY2VzX3Nob3J0LCA2KTsKKwlERUNMQVJFX0hBU0hUQUJMRShkZXZpY2VzX2h3LCA2KTsKKworCS8qIHByb3RlY3RzIHBhcmFtcywgYWxsIG90aGVyIGZpZWxkcyBhcmUgZmluZSB3aXRoIFJDVSAqLworCXJ3bG9ja190IGxvY2s7Cit9OworCit2b2lkIG1hYzgwMjE1NF9sbHNlY19pbml0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYyk7Cit2b2lkIG1hYzgwMjE1NF9sbHNlY19kZXN0cm95KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYyk7CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZ2V0X3BhcmFtcyhzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zICpwYXJhbXMpOworaW50IG1hYzgwMjE1NF9sbHNlY19zZXRfcGFyYW1zKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgICBpbnQgY2hhbmdlZCk7CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfa2V5X2FkZChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkICppZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkgKmtleSk7CitpbnQgbWFjODAyMTU0X2xsc2VjX2tleV9kZWwoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqa2V5KTsKKworaW50IG1hYzgwMjE1NF9sbHNlY19kZXZfYWRkKHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2UgKmRldik7CitpbnQgbWFjODAyMTU0X2xsc2VjX2Rldl9kZWwoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgIF9fbGU2NCBkZXZpY2VfYWRkcik7CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZGV2a2V5X2FkZChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkgICAgICAgX19sZTY0IGRldl9hZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKmtleSk7CitpbnQgbWFjODAyMTU0X2xsc2VjX2RldmtleV9kZWwoc3RydWN0IG1hYzgwMjE1NF9sbHNlYyAqc2VjLAorCQkJICAgICAgIF9fbGU2NCBkZXZfYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICprZXkpOworCitpbnQgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsX2FkZChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsICpzbCk7CitpbnQgbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsX2RlbChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsCisJCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsICpzbCk7CisKK2ludCBtYWM4MDIxNTRfbGxzZWNfZW5jcnlwdChzdHJ1Y3QgbWFjODAyMTU0X2xsc2VjICpzZWMsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IG1hYzgwMjE1NF9sbHNlY19kZWNyeXB0KHN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgKnNlYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyNlbmRpZiAvKiBNQUM4MDIxNTRfTExTRUNfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9tYWM4MDIxNTQuaCBiL25ldC9tYWM4MDIxNTQvbWFjODAyMTU0LmgKaW5kZXggMjhlZjU5Yy4uNzYyYTZmOCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9tYWM4MDIxNTQuaAorKysgYi9uZXQvbWFjODAyMTU0L21hYzgwMjE1NC5oCkBAIC0yMyw4ICsyMywxMiBAQAogI2lmbmRlZiBNQUM4MDIxNTRfSAogI2RlZmluZSBNQUM4MDIxNTRfSAogCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTU0Lmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxNTRfbmV0ZGV2Lmg+CiAKKyNpbmNsdWRlICJsbHNlYy5oIgorCiAvKiBtYWM4MDIxNTQgZGV2aWNlIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IG1hYzgwMjE1NF9wcml2IHsKIAlzdHJ1Y3QgaWVlZTgwMjE1NF9kZXYgaHc7CkBAIC05MCw2ICs5NCwxMyBAQAogCXU4IGJzbjsKIAkvKiBNQUMgRFNOIGZpZWxkICovCiAJdTggZHNuOworCisJLyogcHJvdGVjdHMgc2VjIGZyb20gY29uY3VycmVudCBhY2Nlc3MgYnkgbmV0bGluay4gYWNjZXNzIGJ5CisJICogZW5jcnlwdC9kZWNyeXB0L2hlYWRlcl9jcmVhdGUgc2FmZSB3aXRob3V0IGFkZGl0aW9uYWwgcHJvdGVjdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgbXV0ZXggc2VjX210eDsKKworCXN0cnVjdCBtYWM4MDIxNTRfbGxzZWMgc2VjOwogfTsKIAogI2RlZmluZSBtYWM4MDIxNTRfdG9fcHJpdihfaHcpCWNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBtYWM4MDIxNTRfcHJpdiwgaHcpCkBAIC0xMjUsNCArMTM2LDM3IEBACiB2b2lkIG1hYzgwMjE1NF9nZXRfbWFjX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxNTRfbWFjX3BhcmFtcyAqcGFyYW1zKTsKIAoraW50IG1hYzgwMjE1NF9nZXRfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zICpwYXJhbXMpOworaW50IG1hYzgwMjE1NF9zZXRfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zICpwYXJhbXMsCisJCQkgaW50IGNoYW5nZWQpOworCitpbnQgbWFjODAyMTU0X2FkZF9rZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5X2lkICppZCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfa2V5ICprZXkpOworaW50IG1hYzgwMjE1NF9kZWxfa2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqaWQpOworCitpbnQgbWFjODAyMTU0X2FkZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlICpsbHNlY19kZXYpOworaW50IG1hYzgwMjE1NF9kZWxfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fbGU2NCBkZXZfYWRkcik7CisKK2ludCBtYWM4MDIxNTRfYWRkX2RldmtleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIF9fbGU2NCBkZXZpY2VfYWRkciwKKwkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2Vfa2V5ICprZXkpOworaW50IG1hYzgwMjE1NF9kZWxfZGV2a2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgX19sZTY0IGRldmljZV9hZGRyLAorCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2RldmljZV9rZXkgKmtleSk7CisKK2ludCBtYWM4MDIxNTRfYWRkX3NlY2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpOworaW50IG1hYzgwMjE1NF9kZWxfc2VjbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3NlY2xldmVsICpzbCk7CisKK3ZvaWQgbWFjODAyMTU0X2xvY2tfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIG1hYzgwMjE1NF9nZXRfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY190YWJsZSAqKnQpOwordm9pZCBtYWM4MDIxNTRfdW5sb2NrX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCiAjZW5kaWYgLyogTUFDODAyMTU0X0ggKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxNTQvbWFjX2NtZC5jIGIvbmV0L21hYzgwMjE1NC9tYWNfY21kLmMKaW5kZXggZDQwYzA5Mi4uYmY4MDkxMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9tYWNfY21kLmMKKysrIGIvbmV0L21hYzgwMjE1NC9tYWNfY21kLmMKQEAgLTQwLDYgKzQwLDkgQEAKIAkJCQkgICAgdTggcGFuX2Nvb3JkLCB1OCBibHgsCiAJCQkJICAgIHU4IGNvb3JkX3JlYWxpZ24pCiB7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlpbnQgcmMgPSAwOworCiAJQlVHX09OKGFkZHItPm1vZGUgIT0gSUVFRTgwMjE1NF9BRERSX1NIT1JUKTsKIAogCW1hYzgwMjE1NF9kZXZfc2V0X3Bhbl9pZChkZXYsIGFkZHItPnBhbl9pZCk7CkBAIC00NywxMiArNTAsMzEgQEAKIAltYWM4MDIxNTRfZGV2X3NldF9pZWVlX2FkZHIoZGV2KTsKIAltYWM4MDIxNTRfZGV2X3NldF9wYWdlX2NoYW5uZWwoZGV2LCBwYWdlLCBjaGFubmVsKTsKIAorCWlmIChvcHMtPmxsc2VjKSB7CisJCXN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX3BhcmFtcyBwYXJhbXM7CisJCWludCBjaGFuZ2VkID0gMDsKKworCQlwYXJhbXMuY29vcmRfc2hvcnRhZGRyID0gYWRkci0+c2hvcnRfYWRkcjsKKwkJY2hhbmdlZCB8PSBJRUVFODAyMTU0X0xMU0VDX1BBUkFNX0NPT1JEX1NIT1JUQUREUjsKKworCQlwYXJhbXMucGFuX2lkID0gYWRkci0+cGFuX2lkOworCQljaGFuZ2VkIHw9IElFRUU4MDIxNTRfTExTRUNfUEFSQU1fUEFOX0lEOworCisJCXBhcmFtcy5od2FkZHIgPSBpZWVlODAyMTU0X2RldmFkZHJfZnJvbV9yYXcoZGV2LT5kZXZfYWRkcik7CisJCWNoYW5nZWQgfD0gSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9IV0FERFI7CisKKwkJcGFyYW1zLmNvb3JkX2h3YWRkciA9IHBhcmFtcy5od2FkZHI7CisJCWNoYW5nZWQgfD0gSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9DT09SRF9IV0FERFI7CisKKwkJcmMgPSBvcHMtPmxsc2VjLT5zZXRfcGFyYW1zKGRldiwgJnBhcmFtcywgY2hhbmdlZCk7CisJfQorCiAJLyogRklYTUU6IGFkZCB2YWxpZGF0aW9uIGZvciB1bnVzZWQgcGFyYW1ldGVycyB0byBiZSBzYW5lCiAJICogZm9yIFNvZnRNQUMKIAkgKi8KIAlpZWVlODAyMTU0X25sX3N0YXJ0X2NvbmZpcm0oZGV2LCBJRUVFODAyMTU0X1NVQ0NFU1MpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgc3RydWN0IHdwYW5fcGh5ICptYWM4MDIxNTRfZ2V0X3BoeShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjQsNiArODYsMjIgQEAKIAlyZXR1cm4gdG9fcGh5KGdldF9kZXZpY2UoJnByaXYtPmh3LT5waHktPmRldikpOwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfb3BzIG1hYzgwMjE1NF9sbHNlY19vcHMgPSB7CisJLmdldF9wYXJhbXMgPSBtYWM4MDIxNTRfZ2V0X3BhcmFtcywKKwkuc2V0X3BhcmFtcyA9IG1hYzgwMjE1NF9zZXRfcGFyYW1zLAorCS5hZGRfa2V5ID0gbWFjODAyMTU0X2FkZF9rZXksCisJLmRlbF9rZXkgPSBtYWM4MDIxNTRfZGVsX2tleSwKKwkuYWRkX2RldiA9IG1hYzgwMjE1NF9hZGRfZGV2LAorCS5kZWxfZGV2ID0gbWFjODAyMTU0X2RlbF9kZXYsCisJLmFkZF9kZXZrZXkgPSBtYWM4MDIxNTRfYWRkX2RldmtleSwKKwkuZGVsX2RldmtleSA9IG1hYzgwMjE1NF9kZWxfZGV2a2V5LAorCS5hZGRfc2VjbGV2ZWwgPSBtYWM4MDIxNTRfYWRkX3NlY2xldmVsLAorCS5kZWxfc2VjbGV2ZWwgPSBtYWM4MDIxNTRfZGVsX3NlY2xldmVsLAorCS5sb2NrX3RhYmxlID0gbWFjODAyMTU0X2xvY2tfdGFibGUsCisJLmdldF90YWJsZSA9IG1hYzgwMjE1NF9nZXRfdGFibGUsCisJLnVubG9ja190YWJsZSA9IG1hYzgwMjE1NF91bmxvY2tfdGFibGUsCit9OworCiBzdHJ1Y3QgaWVlZTgwMjE1NF9yZWR1Y2VkX21sbWVfb3BzIG1hYzgwMjE1NF9tbG1lX3JlZHVjZWQgPSB7CiAJLmdldF9waHkgPSBtYWM4MDIxNTRfZ2V0X3BoeSwKIH07CkBAIC03NSw2ICsxMTMsOCBAQAogCS5nZXRfc2hvcnRfYWRkciA9IG1hYzgwMjE1NF9kZXZfZ2V0X3Nob3J0X2FkZHIsCiAJLmdldF9kc24gPSBtYWM4MDIxNTRfZGV2X2dldF9kc24sCiAKKwkubGxzZWMgPSAmbWFjODAyMTU0X2xsc2VjX29wcywKKwogCS5zZXRfbWFjX3BhcmFtcyA9IG1hYzgwMjE1NF9zZXRfbWFjX3BhcmFtcywKIAkuZ2V0X21hY19wYXJhbXMgPSBtYWM4MDIxNTRfZ2V0X21hY19wYXJhbXMsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9taWIuYyBiL25ldC9tYWM4MDIxNTQvbWliLmMKaW5kZXggZjA5OTFmMi4uMTVhYTJmMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9taWIuYworKysgYi9uZXQvbWFjODAyMTU0L21pYi5jCkBAIC0yMTMsMyArMjEzLDE5MCBAQAogCX0gZWxzZQogCQltdXRleF91bmxvY2soJnByaXYtPmh3LT5waHktPnBpYl9sb2NrKTsKIH0KKworCitpbnQgbWFjODAyMTU0X2dldF9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zZWNfbXR4KTsKKwlyZXMgPSBtYWM4MDIxNTRfbGxzZWNfZ2V0X3BhcmFtcygmcHJpdi0+c2VjLCBwYXJhbXMpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgbWFjODAyMTU0X3NldF9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19wYXJhbXMgKnBhcmFtcywKKwkJCSBpbnQgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zZWNfbXR4KTsKKwlyZXMgPSBtYWM4MDIxNTRfbGxzZWNfc2V0X3BhcmFtcygmcHJpdi0+c2VjLCBwYXJhbXMsIGNoYW5nZWQpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCisKK2ludCBtYWM4MDIxNTRfYWRkX2tleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXlfaWQgKmlkLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19rZXkgKmtleSkKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zZWNfbXR4KTsKKwlyZXMgPSBtYWM4MDIxNTRfbGxzZWNfa2V5X2FkZCgmcHJpdi0+c2VjLCBpZCwga2V5KTsKKwltdXRleF91bmxvY2soJnByaXYtPnNlY19tdHgpOworCisJcmV0dXJuIHJlczsKK30KKworaW50IG1hYzgwMjE1NF9kZWxfa2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X2xsc2VjX2tleV9pZCAqaWQpCit7CisJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKworCUJVR19PTihkZXYtPnR5cGUgIT0gQVJQSFJEX0lFRUU4MDIxNTQpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2VjX210eCk7CisJcmVzID0gbWFjODAyMTU0X2xsc2VjX2tleV9kZWwoJnByaXYtPnNlYywgaWQpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCisKK2ludCBtYWM4MDIxNTRfYWRkX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19kZXZpY2UgKmxsc2VjX2RldikKK3sKKwlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zZWNfbXR4KTsKKwlyZXMgPSBtYWM4MDIxNTRfbGxzZWNfZGV2X2FkZCgmcHJpdi0+c2VjLCBsbHNlY19kZXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgbWFjODAyMTU0X2RlbF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19sZTY0IGRldl9hZGRyKQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisKKwlCVUdfT04oZGV2LT50eXBlICE9IEFSUEhSRF9JRUVFODAyMTU0KTsKKworCW11dGV4X2xvY2soJnByaXYtPnNlY19tdHgpOworCXJlcyA9IG1hYzgwMjE1NF9sbHNlY19kZXZfZGVsKCZwcml2LT5zZWMsIGRldl9hZGRyKTsKKwltdXRleF91bmxvY2soJnByaXYtPnNlY19tdHgpOworCisJcmV0dXJuIHJlczsKK30KKworCitpbnQgbWFjODAyMTU0X2FkZF9kZXZrZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBfX2xlNjQgZGV2aWNlX2FkZHIsCisJCQkgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqa2V5KQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisKKwlCVUdfT04oZGV2LT50eXBlICE9IEFSUEhSRF9JRUVFODAyMTU0KTsKKworCW11dGV4X2xvY2soJnByaXYtPnNlY19tdHgpOworCXJlcyA9IG1hYzgwMjE1NF9sbHNlY19kZXZrZXlfYWRkKCZwcml2LT5zZWMsIGRldmljZV9hZGRyLCBrZXkpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgbWFjODAyMTU0X2RlbF9kZXZrZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBfX2xlNjQgZGV2aWNlX2FkZHIsCisJCQkgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfZGV2aWNlX2tleSAqa2V5KQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisKKwlCVUdfT04oZGV2LT50eXBlICE9IEFSUEhSRF9JRUVFODAyMTU0KTsKKworCW11dGV4X2xvY2soJnByaXYtPnNlY19tdHgpOworCXJlcyA9IG1hYzgwMjE1NF9sbHNlY19kZXZrZXlfZGVsKCZwcml2LT5zZWMsIGRldmljZV9hZGRyLCBrZXkpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2VjX210eCk7CisKKwlyZXR1cm4gcmVzOworfQorCisKK2ludCBtYWM4MDIxNTRfYWRkX3NlY2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpCit7CisJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKworCUJVR19PTihkZXYtPnR5cGUgIT0gQVJQSFJEX0lFRUU4MDIxNTQpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2VjX210eCk7CisJcmVzID0gbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsX2FkZCgmcHJpdi0+c2VjLCBzbCk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zZWNfbXR4KTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBtYWM4MDIxNTRfZGVsX3NlY2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9sbHNlY19zZWNsZXZlbCAqc2wpCit7CisJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKworCUJVR19PTihkZXYtPnR5cGUgIT0gQVJQSFJEX0lFRUU4MDIxNTQpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2VjX210eCk7CisJcmVzID0gbWFjODAyMTU0X2xsc2VjX3NlY2xldmVsX2RlbCgmcHJpdi0+c2VjLCBzbCk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zZWNfbXR4KTsKKworCXJldHVybiByZXM7Cit9CisKKwordm9pZCBtYWM4MDIxNTRfbG9ja190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zZWNfbXR4KTsKK30KKwordm9pZCBtYWM4MDIxNTRfZ2V0X3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfdGFibGUgKip0KQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwkqdCA9ICZwcml2LT5zZWMudGFibGU7Cit9CisKK3ZvaWQgbWFjODAyMTU0X3VubG9ja190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQlVHX09OKGRldi0+dHlwZSAhPSBBUlBIUkRfSUVFRTgwMjE1NCk7CisKKwltdXRleF91bmxvY2soJnByaXYtPnNlY19tdHgpOworfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9tb25pdG9yLmMgYi9uZXQvbWFjODAyMTU0L21vbml0b3IuYwppbmRleCA0MzRhMjZmLi5hNjgyMzBlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTU0L21vbml0b3IuYworKysgYi9uZXQvbWFjODAyMTU0L21vbml0b3IuYwpAQCAtNzAsNyArNzAsOCBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmcHJpdi0+c2xhdmVzLCBsaXN0KSB7Ci0JCWlmIChzZGF0YS0+dHlwZSAhPSBJRUVFODAyMTU0X0RFVl9NT05JVE9SKQorCQlpZiAoc2RhdGEtPnR5cGUgIT0gSUVFRTgwMjE1NF9ERVZfTU9OSVRPUiB8fAorCQkgICAgIW5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCiAJCQljb250aW51ZTsKIAogCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L3J4LmMgYi9uZXQvbWFjODAyMTU0L3J4LmMKaW5kZXggMDM4NTViMC4uN2Y4MjBhMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9yeC5jCisrKyBiL25ldC9tYWM4MDIxNTQvcnguYwpAQCAtNTksMjcgKzU5LDI4IEBACiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lFRUU4MDIxNTQpOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTU0X21hY19jYikgPiBzaXplb2Yoc2tiLT5jYikpOwotCiAJaWYgKCEocHJpdi0+aHcuZmxhZ3MgJiBJRUVFODAyMTU0X0hXX09NSVRfQ0tTVU0pKSB7CiAJCXUxNiBjcmM7CiAKIAkJaWYgKHNrYi0+bGVuIDwgMikgewogCQkJcHJfZGVidWcoImdvdCBpbnZhbGlkIGZyYW1lXG4iKTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBmYWlsOwogCQl9CiAJCWNyYyA9IGNyY19jY2l0dCgwLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJaWYgKGNyYykgewogCQkJcHJfZGVidWcoIkNSQyBtaXNtYXRjaFxuIik7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZmFpbDsKIAkJfQogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gMik7IC8qIENSQyAqLwogCX0KIAogCW1hYzgwMjE1NF9tb25pdG9yc19yeChwcml2LCBza2IpOwogCW1hYzgwMjE1NF93cGFuc19yeChwcml2LCBza2IpOwotb3V0OgotCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybjsKKworZmFpbDoKKwlrZnJlZV9za2Ioc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgbWFjODAyMTU0X3J4X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L3dwYW4uYyBiL25ldC9tYWM4MDIxNTQvd3Bhbi5jCmluZGV4IDFkZjdhNmEuLjNjMzA2OWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxNTQvd3Bhbi5jCisrKyBiL25ldC9tYWM4MDIxNTQvd3Bhbi5jCkBAIC0zNSw2ICszNSwyOCBAQAogCiAjaW5jbHVkZSAibWFjODAyMTU0LmgiCiAKK3N0YXRpYyBpbnQgbWFjODAyMTU0X3dwYW5fdXBkYXRlX2xsc2VjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxNTRfbWxtZV9vcHMgKm9wcyA9IGllZWU4MDIxNTRfbWxtZV9vcHMoZGV2KTsKKwlpbnQgcmMgPSAwOworCisJaWYgKG9wcy0+bGxzZWMpIHsKKwkJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zIHBhcmFtczsKKwkJaW50IGNoYW5nZWQgPSAwOworCisJCXBhcmFtcy5wYW5faWQgPSBwcml2LT5wYW5faWQ7CisJCWNoYW5nZWQgfD0gSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9QQU5fSUQ7CisKKwkJcGFyYW1zLmh3YWRkciA9IHByaXYtPmV4dGVuZGVkX2FkZHI7CisJCWNoYW5nZWQgfD0gSUVFRTgwMjE1NF9MTFNFQ19QQVJBTV9IV0FERFI7CisKKwkJcmMgPSBvcHMtPmxsc2VjLT5zZXRfcGFyYW1zKGRldiwgJnBhcmFtcywgY2hhbmdlZCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50CiBtYWM4MDIxNTRfd3Bhbl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKQEAgLTgxLDcgKzEwMyw3IEBACiAJCXByaXYtPnBhbl9pZCA9IGNwdV90b19sZTE2KHNhLT5hZGRyLnBhbl9pZCk7CiAJCXByaXYtPnNob3J0X2FkZHIgPSBjcHVfdG9fbGUxNihzYS0+YWRkci5zaG9ydF9hZGRyKTsKIAotCQllcnIgPSAwOworCQllcnIgPSBtYWM4MDIxNTRfd3Bhbl91cGRhdGVfbGxzZWMoZGV2KTsKIAkJYnJlYWs7CiAJfQogCkBAIC05OSw3ICsxMjEsNyBAQAogCS8qIEZJWE1FOiB2YWxpZGF0ZSBhZGRyICovCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwogCW1hYzgwMjE1NF9kZXZfc2V0X2llZWVfYWRkcihkZXYpOwotCXJldHVybiAwOworCXJldHVybiBtYWM4MDIxNTRfd3Bhbl91cGRhdGVfbGxzZWMoZGV2KTsKIH0KIAogaW50IG1hYzgwMjE1NF9zZXRfbWFjX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTI0LDcgKzE0Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5ody0+c2xhdmVzX210eCk7CiB9CiAKLWludCBtYWM4MDIxNTRfd3Bhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG1hYzgwMjE1NF93cGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmM7CiAJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xODMsNiArMjA1LDM4IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IG1hYzgwMjE1NF9zZXRfaGVhZGVyX3NlY3VyaXR5KHN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXYsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkciwKKwkJCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTU0X21hY19jYiAqY2IpCit7CisJc3RydWN0IGllZWU4MDIxNTRfbGxzZWNfcGFyYW1zIHBhcmFtczsKKwl1OCBsZXZlbDsKKworCW1hYzgwMjE1NF9sbHNlY19nZXRfcGFyYW1zKCZwcml2LT5zZWMsICZwYXJhbXMpOworCisJaWYgKCFwYXJhbXMuZW5hYmxlZCAmJiBjYi0+c2VjZW5fb3ZlcnJpZGUgJiYgY2ItPnNlY2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXBhcmFtcy5lbmFibGVkIHx8CisJICAgIChjYi0+c2VjZW5fb3ZlcnJpZGUgJiYgIWNiLT5zZWNlbikgfHwKKwkgICAgIXBhcmFtcy5vdXRfbGV2ZWwpCisJCXJldHVybiAwOworCWlmIChjYi0+c2VjbGV2ZWxfb3ZlcnJpZGUgJiYgIWNiLT5zZWNsZXZlbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZXZlbCA9IGNiLT5zZWNsZXZlbF9vdmVycmlkZSA/IGNiLT5zZWNsZXZlbCA6IHBhcmFtcy5vdXRfbGV2ZWw7CisKKwloZHItPmZjLnNlY3VyaXR5X2VuYWJsZWQgPSAxOworCWhkci0+c2VjLmxldmVsID0gbGV2ZWw7CisJaGRyLT5zZWMua2V5X2lkX21vZGUgPSBwYXJhbXMub3V0X2tleS5tb2RlOworCWlmIChwYXJhbXMub3V0X2tleS5tb2RlID09IElFRUU4MDIxNTRfU0NGX0tFWV9TSE9SVF9JTkRFWCkKKwkJaGRyLT5zZWMuc2hvcnRfc3JjID0gcGFyYW1zLm91dF9rZXkuc2hvcnRfc291cmNlOworCWVsc2UgaWYgKHBhcmFtcy5vdXRfa2V5Lm1vZGUgPT0gSUVFRTgwMjE1NF9TQ0ZfS0VZX0hXX0lOREVYKQorCQloZHItPnNlYy5leHRlbmRlZF9zcmMgPSBwYXJhbXMub3V0X2tleS5leHRlbmRlZF9zb3VyY2U7CisJaGRyLT5zZWMua2V5X2lkID0gcGFyYW1zLm91dF9rZXkuaWQ7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtYWM4MDIxNTRfaGVhZGVyX2NyZWF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKQEAgLTE5MiwxNSArMjQ2LDIwIEBACiB7CiAJc3RydWN0IGllZWU4MDIxNTRfaGRyIGhkcjsKIAlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjE1NF9tYWNfY2IgKmNiID0gbWFjX2NiKHNrYik7CiAJaW50IGhsZW47CiAKIAlpZiAoIWRhZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbXNldCgmaGRyLmZjLCAwLCBzaXplb2YoaGRyLmZjKSk7Ci0JaGRyLmZjLnR5cGUgPSBtYWNfY2JfdHlwZShza2IpOwotCWhkci5mYy5zZWN1cml0eV9lbmFibGVkID0gbWFjX2NiX2lzX3NlY2VuKHNrYik7Ci0JaGRyLmZjLmFja19yZXF1ZXN0ID0gbWFjX2NiX2lzX2Fja3JlcShza2IpOworCWhkci5mYy50eXBlID0gY2ItPnR5cGU7CisJaGRyLmZjLnNlY3VyaXR5X2VuYWJsZWQgPSBjYi0+c2VjZW47CisJaGRyLmZjLmFja19yZXF1ZXN0ID0gY2ItPmFja3JlcTsKKwloZHIuc2VxID0gaWVlZTgwMjE1NF9tbG1lX29wcyhkZXYpLT5nZXRfZHNuKGRldik7CisKKwlpZiAobWFjODAyMTU0X3NldF9oZWFkZXJfc2VjdXJpdHkocHJpdiwgJmhkciwgY2IpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXNhZGRyKSB7CiAJCXNwaW5fbG9ja19iaCgmcHJpdi0+bWliX2xvY2spOwpAQCAtMjMxLDcgKzI5MCw3IEBACiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPm1hY19sZW4gPSBobGVuOwogCi0JaWYgKGhsZW4gKyBsZW4gKyAyID4gZGV2LT5tdHUpCisJaWYgKGxlbiA+IGllZWU4MDIxNTRfbWF4X3BheWxvYWQoJmhkcikpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlyZXR1cm4gaGxlbjsKQEAgLTI1Nyw2ICszMTYsNyBAQAogewogCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnByaXY7CiAJdTggY2hhbiwgcGFnZTsKKwlpbnQgcmM7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMjcyLDYgKzMzMiwxMyBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAorCXJjID0gbWFjODAyMTU0X2xsc2VjX2VuY3J5cHQoJnByaXYtPnNlYywgc2tiKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybigiZW5jcnlwdGlvbiBmYWlsZWQ6ICVpXG4iLCByYyk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKwogCXNrYi0+c2tiX2lpZiA9IGRldi0+aWZpbmRleDsKIAlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtMjkyLDYgKzM1OSwxNSBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbWFjODAyMTU0X3dwYW5fbWFjX2FkZHIsCiB9OwogCitzdGF0aWMgdm9pZCBtYWM4MDIxNTRfd3Bhbl9mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hYzgwMjE1NF9zdWJfaWZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwltYWM4MDIxNTRfbGxzZWNfZGVzdHJveSgmcHJpdi0+c2VjKTsKKworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKIHZvaWQgbWFjODAyMTU0X3dwYW5fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpwcml2OwpAQCAtMzAxLDE0ICszNzcsMTQgQEAKIAogCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gTUFDODAyMTU0X0ZSQU1FX0hBUkRfSEVBREVSX0xFTjsKIAlkZXYtPmhlYWRlcl9vcHMJCT0gJm1hYzgwMjE1NF9oZWFkZXJfb3BzOwotCWRldi0+bmVlZGVkX3RhaWxyb29tCT0gMjsgLyogRkNTICovCisJZGV2LT5uZWVkZWRfdGFpbHJvb20JPSAyICsgMTY7IC8qIEZDUyArIE1JQyAqLwogCWRldi0+bXR1CQk9IElFRUU4MDIxNTRfTVRVOwogCWRldi0+dHhfcXVldWVfbGVuCT0gMzAwOwogCWRldi0+dHlwZQkJPSBBUlBIUkRfSUVFRTgwMjE1NDsKIAlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUCB8IElGRl9CUk9BRENBU1Q7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IDA7CiAKLQlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CisJZGV2LT5kZXN0cnVjdG9yCQk9IG1hYzgwMjE1NF93cGFuX2ZyZWU7CiAJZGV2LT5uZXRkZXZfb3BzCQk9ICZtYWM4MDIxNTRfd3Bhbl9vcHM7CiAJZGV2LT5tbF9wcml2CQk9ICZtYWM4MDIxNTRfbWxtZV93cGFuOwogCkBAIC0zMTksNiArMzk1LDcgQEAKIAlwcml2LT5wYWdlID0gMDsKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5taWJfbG9jayk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+c2VjX210eCk7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZwcml2LT5ic24sIDEpOwogCWdldF9yYW5kb21fYnl0ZXMoJnByaXYtPmRzbiwgMSk7CkBAIC0zMzEsNiArNDA4LDggQEAKIAogCXByaXYtPnBhbl9pZCA9IGNwdV90b19sZTE2KElFRUU4MDIxNTRfUEFOSURfQlJPQURDQVNUKTsKIAlwcml2LT5zaG9ydF9hZGRyID0gY3B1X3RvX2xlMTYoSUVFRTgwMjE1NF9BRERSX0JST0FEQ0FTVCk7CisKKwltYWM4MDIxNTRfbGxzZWNfaW5pdCgmcHJpdi0+c2VjKTsKIH0KIAogc3RhdGljIGludCBtYWM4MDIxNTRfcHJvY2Vzc19kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0zMzksOSArNDE4LDExIEBACiB9CiAKIHN0YXRpYyBpbnQKLW1hYzgwMjE1NF9zdWJpZl9mcmFtZShzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK21hYzgwMjE1NF9zdWJpZl9mcmFtZShzdHJ1Y3QgbWFjODAyMTU0X3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxNTRfaGRyICpoZHIpCiB7CiAJX19sZTE2IHNwYW4sIHNzaG9ydDsKKwlpbnQgcmM7CiAKIAlwcl9kZWJ1ZygiZ2V0dGluZyBwYWNrZXQgdmlhIHNsYXZlIGludGVyZmFjZSAlc1xuIiwgc2RhdGEtPmRldi0+bmFtZSk7CiAKQEAgLTM4OCwxNSArNDY5LDIyIEBACiAKIAlza2ItPmRldiA9IHNkYXRhLT5kZXY7CiAKKwlyYyA9IG1hYzgwMjE1NF9sbHNlY19kZWNyeXB0KCZzZGF0YS0+c2VjLCBza2IpOworCWlmIChyYykgeworCQlwcl9kZWJ1ZygiZGVjcnlwdGlvbiBmYWlsZWQ6ICVpXG4iLCByYyk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCiAJc2RhdGEtPmRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCXNkYXRhLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCi0Jc3dpdGNoIChtYWNfY2JfdHlwZShza2IpKSB7CisJc3dpdGNoIChtYWNfY2Ioc2tiKS0+dHlwZSkgewogCWNhc2UgSUVFRTgwMjE1NF9GQ19UWVBFX0RBVEE6CiAJCXJldHVybiBtYWM4MDIxNTRfcHJvY2Vzc19kYXRhKHNkYXRhLT5kZXYsIHNrYik7CiAJZGVmYXVsdDoKIAkJcHJfd2FybigiaWVlZTgwMjE1NDogYmFkIGZyYW1lIHJlY2VpdmVkICh0eXBlID0gJWQpXG4iLAotCQkJbWFjX2NiX3R5cGUoc2tiKSk7CisJCQltYWNfY2Ioc2tiKS0+dHlwZSk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAJfQpAQCAtNDE5LDYyICs1MDcsNTggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbWFjODAyMTU0X3BhcnNlX2ZyYW1lX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IG1hYzgwMjE1NF9wYXJzZV9mcmFtZV9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgKmhkcikKIHsKIAlpbnQgaGxlbjsKLQlzdHJ1Y3QgaWVlZTgwMjE1NF9oZHIgaGRyOworCXN0cnVjdCBpZWVlODAyMTU0X21hY19jYiAqY2IgPSBtYWNfY2JfaW5pdChza2IpOwogCi0JaGxlbiA9IGllZWU4MDIxNTRfaGRyX3B1bGwoc2tiLCAmaGRyKTsKKwlobGVuID0gaWVlZTgwMjE1NF9oZHJfcHVsbChza2IsIGhkcik7CiAJaWYgKGhsZW4gPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNrYi0+bWFjX2xlbiA9IGhsZW47CiAKLQlwcl9kZWJ1ZygiZmM6ICUwNHggZHNuOiAlMDJ4XG4iLCBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZoZHIuZmMpLAotCQkgaGRyLnNlcSk7CisJcHJfZGVidWcoImZjOiAlMDR4IGRzbjogJTAyeFxuIiwgbGUxNl90b19jcHVwKChfX2xlMTYgKikmaGRyLT5mYyksCisJCSBoZHItPnNlcSk7CiAKLQltYWNfY2Ioc2tiKS0+ZmxhZ3MgPSBoZHIuZmMudHlwZTsKKwljYi0+dHlwZSA9IGhkci0+ZmMudHlwZTsKKwljYi0+YWNrcmVxID0gaGRyLT5mYy5hY2tfcmVxdWVzdDsKKwljYi0+c2VjZW4gPSBoZHItPmZjLnNlY3VyaXR5X2VuYWJsZWQ7CiAKLQlpZiAoaGRyLmZjLmFja19yZXF1ZXN0KQotCQltYWNfY2Ioc2tiKS0+ZmxhZ3MgfD0gTUFDX0NCX0ZMQUdfQUNLUkVROwotCWlmIChoZHIuZmMuc2VjdXJpdHlfZW5hYmxlZCkKLQkJbWFjX2NiKHNrYiktPmZsYWdzIHw9IE1BQ19DQl9GTEFHX1NFQ0VOOworCW1hYzgwMjE1NF9wcmludF9hZGRyKCJkZXN0aW5hdGlvbiIsICZoZHItPmRlc3QpOworCW1hYzgwMjE1NF9wcmludF9hZGRyKCJzb3VyY2UiLCAmaGRyLT5zb3VyY2UpOwogCi0JbWFjODAyMTU0X3ByaW50X2FkZHIoImRlc3RpbmF0aW9uIiwgJmhkci5kZXN0KTsKLQltYWM4MDIxNTRfcHJpbnRfYWRkcigic291cmNlIiwgJmhkci5zb3VyY2UpOworCWNiLT5zb3VyY2UgPSBoZHItPnNvdXJjZTsKKwljYi0+ZGVzdCA9IGhkci0+ZGVzdDsKIAotCW1hY19jYihza2IpLT5zb3VyY2UgPSBoZHIuc291cmNlOwotCW1hY19jYihza2IpLT5kZXN0ID0gaGRyLmRlc3Q7Ci0KLQlpZiAoaGRyLmZjLnNlY3VyaXR5X2VuYWJsZWQpIHsKKwlpZiAoaGRyLT5mYy5zZWN1cml0eV9lbmFibGVkKSB7CiAJCXU2NCBrZXk7CiAKLQkJcHJfZGVidWcoInNlY2xldmVsICVpXG4iLCBoZHIuc2VjLmxldmVsKTsKKwkJcHJfZGVidWcoInNlY2xldmVsICVpXG4iLCBoZHItPnNlYy5sZXZlbCk7CiAKLQkJc3dpdGNoIChoZHIuc2VjLmtleV9pZF9tb2RlKSB7CisJCXN3aXRjaCAoaGRyLT5zZWMua2V5X2lkX21vZGUpIHsKIAkJY2FzZSBJRUVFODAyMTU0X1NDRl9LRVlfSU1QTElDSVQ6CiAJCQlwcl9kZWJ1ZygiaW1wbGljaXQga2V5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgSUVFRTgwMjE1NF9TQ0ZfS0VZX0lOREVYOgotCQkJcHJfZGVidWcoImtleSAlMDJ4XG4iLCBoZHIuc2VjLmtleV9pZCk7CisJCQlwcl9kZWJ1Zygia2V5ICUwMnhcbiIsIGhkci0+c2VjLmtleV9pZCk7CiAJCQlicmVhazsKIAogCQljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9TSE9SVF9JTkRFWDoKIAkJCXByX2RlYnVnKCJrZXkgJTA0eDolMDR4ICUwMnhcbiIsCi0JCQkJIGxlMzJfdG9fY3B1KGhkci5zZWMuc2hvcnRfc3JjKSA+PiAxNiwKLQkJCQkgbGUzMl90b19jcHUoaGRyLnNlYy5zaG9ydF9zcmMpICYgMHhmZmZmLAotCQkJCSBoZHIuc2VjLmtleV9pZCk7CisJCQkJIGxlMzJfdG9fY3B1KGhkci0+c2VjLnNob3J0X3NyYykgPj4gMTYsCisJCQkJIGxlMzJfdG9fY3B1KGhkci0+c2VjLnNob3J0X3NyYykgJiAweGZmZmYsCisJCQkJIGhkci0+c2VjLmtleV9pZCk7CiAJCQlicmVhazsKIAogCQljYXNlIElFRUU4MDIxNTRfU0NGX0tFWV9IV19JTkRFWDoKLQkJCWtleSA9IHN3YWI2NCgoX19mb3JjZSB1NjQpIGhkci5zZWMuZXh0ZW5kZWRfc3JjKTsKKwkJCWtleSA9IHN3YWI2NCgoX19mb3JjZSB1NjQpIGhkci0+c2VjLmV4dGVuZGVkX3NyYyk7CiAJCQlwcl9kZWJ1Zygia2V5IHNvdXJjZSAlOHBoQyAlMDJ4XG4iLCAma2V5LAotCQkJCSBoZHIuc2VjLmtleV9pZCk7CisJCQkJIGhkci0+c2VjLmtleV9pZCk7CiAJCQlicmVhazsKIAkJfQotCi0JCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDgzLDEwICs1NjcsMTAgQEAKIHZvaWQgbWFjODAyMTU0X3dwYW5zX3J4KHN0cnVjdCBtYWM4MDIxNTRfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBza19idWZmICpzc2tiOwogCXN0cnVjdCBtYWM4MDIxNTRfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTU0X2hkciBoZHI7CiAKLQlyZXQgPSBtYWM4MDIxNTRfcGFyc2VfZnJhbWVfc3RhcnQoc2tiKTsKKwlyZXQgPSBtYWM4MDIxNTRfcGFyc2VfZnJhbWVfc3RhcnQoc2tiLCAmaGRyKTsKIAlpZiAocmV0KSB7CiAJCXByX2RlYnVnKCJnb3QgaW52YWxpZCBmcmFtZVxuIik7CiAJCXJldHVybjsKQEAgLTQ5NCwxMiArNTc4LDE2IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZwcml2LT5zbGF2ZXMsIGxpc3QpIHsKLQkJaWYgKHNkYXRhLT50eXBlICE9IElFRUU4MDIxNTRfREVWX1dQQU4pCisJCWlmIChzZGF0YS0+dHlwZSAhPSBJRUVFODAyMTU0X0RFVl9XUEFOIHx8CisJCSAgICAhbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCXNza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNza2IpCi0JCQltYWM4MDIxNTRfc3ViaWZfZnJhbWUoc2RhdGEsIHNza2IpOworCQltYWM4MDIxNTRfc3ViaWZfZnJhbWUoc2RhdGEsIHNrYiwgJmhkcik7CisJCXNrYiA9IE5VTEw7CisJCWJyZWFrOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChza2IpCisJCWtmcmVlX3NrYihza2IpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21wbHMvbXBsc19nc28uYyBiL25ldC9tcGxzL21wbHNfZ3NvLmMKaW5kZXggODUxY2Q4OC4uNmIzOGQwOCAxMDA2NDQKLS0tIGEvbmV0L21wbHMvbXBsc19nc28uYworKysgYi9uZXQvbXBscy9tcGxzX2dzby5jCkBAIC0zMyw2ICszMyw3IEBACiAJCQkJICBTS0JfR1NPX0RPREdZIHwKIAkJCQkgIFNLQl9HU09fVENQX0VDTiB8CiAJCQkJICBTS0JfR1NPX0dSRSB8CisJCQkJICBTS0JfR1NPX0dSRV9DU1VNIHwKIAkJCQkgIFNLQl9HU09fSVBJUCB8CiAJCQkJICBTS0JfR1NPX01QTFMpKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKaW5kZXggMTE3MjA4My4uZWM4MTE0ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYwpAQCAtMjcxLDEwICsyNzEsNyBAQAogewogCXByX2RlYnVnKCIlcDogZnJlZSB3aXRoICVzXG4iLCBtZW1iZXJzLAogCQkgaXNfdm1hbGxvY19hZGRyKG1lbWJlcnMpID8gInZmcmVlIiA6ICJrZnJlZSIpOwotCWlmIChpc192bWFsbG9jX2FkZHIobWVtYmVycykpCi0JCXZmcmVlKG1lbWJlcnMpOwotCWVsc2UKLQkJa2ZyZWUobWVtYmVycyk7CisJa3ZmcmVlKG1lbWJlcnMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXBfc2V0X2ZyZWUpOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCAzZDJkMmM4Li5lNjgzNjc1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkJcmV0dXJuICJJQ01QdjYiOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJc3ByaW50ZihidWYsICJJUF8lZCIsIHByb3RvKTsKKwkJc3ByaW50ZihidWYsICJJUF8ldSIsIHByb3RvKTsKIAkJcmV0dXJuIGJ1ZjsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBjNDc0NDRlLi43M2JhMWNjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKQEAgLTU2Miw3ICs1NjIsNyBAQAogCWlwX3NlbmRfY2hlY2soaXBoKTsKIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJaXBfdnNfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNCwgc2tiLCBjcCwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC01OTAsNyArNTkwLDcgQEAKIAkJZ290byB0eF9lcnJvcjsKIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJaXBfdnNfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNiwgc2tiLCBjcCwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC02ODQsNyArNjg0LDcgQEAKIAkgICBNVFUgcHJvYmxlbS4gKi8KIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJcmMgPSBpcF92c19uYXRfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNCwgc2tiLCBjcCwgbG9jYWwpOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNzc0LDcgKzc3NCw3IEBACiAJICAgTVRVIHByb2JsZW0uICovCiAKIAkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwotCXNrYi0+bG9jYWxfZGYgPSAxOworCXNrYi0+aWdub3JlX2RmID0gMTsKIAogCXJjID0gaXBfdnNfbmF0X3NlbmRfb3JfY29udChORlBST1RPX0lQVjYsIHNrYiwgY3AsIGxvY2FsKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTg4MywxMCArODgzLDEwIEBACiAJaXBoLT5kYWRkcgkJPQljcC0+ZGFkZHIuaXA7CiAJaXBoLT5zYWRkcgkJPQlzYWRkcjsKIAlpcGgtPnR0bAkJPQlvbGRfaXBoLT50dGw7Ci0JaXBfc2VsZWN0X2lkZW50KHNrYiwgJnJ0LT5kc3QsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOwogCiAJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAKIAlyZXQgPSBpcF92c190dW5uZWxfeG1pdF9wcmVwYXJlKHNrYiwgY3ApOwogCWlmIChyZXQgPT0gTkZfQUNDRVBUKQpAQCAtOTc0LDcgKzk3NCw3IEBACiAJaXBoLT5ob3BfbGltaXQJCT0Jb2xkX2lwaC0+aG9wX2xpbWl0OwogCiAJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAKIAlyZXQgPSBpcF92c190dW5uZWxfeG1pdF9wcmVwYXJlKHNrYiwgY3ApOwogCWlmIChyZXQgPT0gTkZfQUNDRVBUKQpAQCAtMTAyMyw3ICsxMDIzLDcgQEAKIAlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJaXBfdnNfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNCwgc2tiLCBjcCwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogCX0KIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJaXBfdnNfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNiwgc2tiLCBjcCwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xMTU3LDcgKzExNTcsNyBAQAogCWlwX3ZzX25hdF9pY21wKHNrYiwgcHAsIGNwLCAwKTsKIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7CisJc2tiLT5pZ25vcmVfZGYgPSAxOwogCiAJcmMgPSBpcF92c19uYXRfc2VuZF9vcl9jb250KE5GUFJPVE9fSVBWNCwgc2tiLCBjcCwgbG9jYWwpOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTI0OSw3ICsxMjQ5LDcgQEAKIAlpcF92c19uYXRfaWNtcF92Nihza2IsIHBwLCBjcCwgMCk7CiAKIAkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwotCXNrYi0+bG9jYWxfZGYgPSAxOworCXNrYi0+aWdub3JlX2RmID0gMTsKIAogCXJjID0gaXBfdnNfbmF0X3NlbmRfb3JfY29udChORlBST1RPX0lQVjYsIHNrYiwgY3AsIGxvY2FsKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwppbmRleCA1MmNhOTUyLi4wOTA5NmE2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC0zNTgsNiArMzU4LDE5IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKK3N0cnVjdCBuZl9jb25uX25hdCAqbmZfY3RfbmF0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoY3QpOworCWlmIChuYXQpCisJCXJldHVybiBuYXQ7CisKKwlpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpCisJCW5hdCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpOworCisJcmV0dXJuIG5hdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X25hdF9leHRfYWRkKTsKKwogdW5zaWduZWQgaW50CiBuZl9uYXRfc2V0dXBfaW5mbyhzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCSAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCkBAIC0zNjgsMTQgKzM4MSw5IEBACiAJc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQ7CiAKIAkvKiBuYXQgaGVscGVyIG9yIG5mY3RuZXRsaW5rIGFsc28gc2V0dXAgYmluZGluZyAqLwotCW5hdCA9IG5mY3RfbmF0KGN0KTsKLQlpZiAoIW5hdCkgewotCQluYXQgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTkFULCBHRlBfQVRPTUlDKTsKLQkJaWYgKG5hdCA9PSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGFkZCBOQVQgZXh0ZW5zaW9uXG4iKTsKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCX0KLQl9CisJbmF0ID0gbmZfY3RfbmF0X2V4dF9hZGQoY3QpOworCWlmIChuYXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCU5GX0NUX0FTU0VSVChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQyB8fAogCQkgICAgIG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfRFNUKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKaW5kZXggM2ZkMTU5ZC4uNjI0ZTA4MyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKQEAgLTg4LDYgKzg4LDQ1IEBACiAJcmV0dXJuIEVSUl9QVFIoLUVBRk5PU1VQUE9SVCk7CiB9CiAKK3N0YXRpYyB2b2lkIG5mdF9jdHhfaW5pdChzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgc3RydWN0IG5mdF9hZl9pbmZvICphZmksCisJCQkgc3RydWN0IG5mdF90YWJsZSAqdGFibGUsCisJCQkgc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4sCisJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0ICpubGEpCit7CisJY3R4LT5uZXQJPSBzb2NrX25ldChza2ItPnNrKTsKKwljdHgtPmFmaQk9IGFmaTsKKwljdHgtPnRhYmxlCT0gdGFibGU7CisJY3R4LT5jaGFpbgk9IGNoYWluOworCWN0eC0+bmxhICAgCT0gbmxhOworCWN0eC0+cG9ydGlkCT0gTkVUTElOS19DQihza2IpLnBvcnRpZDsKKwljdHgtPnJlcG9ydAk9IG5sbXNnX3JlcG9ydChubGgpOworCWN0eC0+c2VxCT0gbmxoLT5ubG1zZ19zZXE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X3RyYW5zICpuZnRfdHJhbnNfYWxsb2Moc3RydWN0IG5mdF9jdHggKmN0eCwgaW50IG1zZ190eXBlLAorCQkJCQkgdTMyIHNpemUpCit7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnM7CisKKwl0cmFucyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnRfdHJhbnMpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRyYW5zID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdHJhbnMtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJdHJhbnMtPmN0eAk9ICpjdHg7CisKKwlyZXR1cm4gdHJhbnM7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF90cmFuc19kZXN0cm95KHN0cnVjdCBuZnRfdHJhbnMgKnRyYW5zKQoreworCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7CisJa2ZyZWUodHJhbnMpOworfQorCiAvKgogICogVGFibGVzCiAgKi8KQEAgLTE5NywyMCArMjM2LDEzIEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IG5mX3RhYmxlc190YWJsZV9ub3RpZnkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKm9za2IsCi0JCQkJICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBuZnRfdGFibGUgKnRhYmxlLAotCQkJCSAgaW50IGV2ZW50LCBpbnQgZmFtaWx5KQorc3RhdGljIGludCBuZl90YWJsZXNfdGFibGVfbm90aWZ5KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGludCBldmVudCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXUzMiBwb3J0aWQgPSBvc2tiID8gTkVUTElOS19DQihvc2tiKS5wb3J0aWQgOiAwOwotCXUzMiBzZXEgPSBubGggPyBubGgtPm5sbXNnX3NlcSA6IDA7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gb3NrYiA/IHNvY2tfbmV0KG9za2ItPnNrKSA6ICZpbml0X25ldDsKLQlib29sIHJlcG9ydDsKIAlpbnQgZXJyOwogCi0JcmVwb3J0ID0gbmxoID8gbmxtc2dfcmVwb3J0KG5saCkgOiBmYWxzZTsKLQlpZiAoIXJlcG9ydCAmJiAhbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMobmV0LCBORk5MR1JQX05GVEFCTEVTKSkKKwlpZiAoIWN0eC0+cmVwb3J0ICYmCisJICAgICFuZm5ldGxpbmtfaGFzX2xpc3RlbmVycyhjdHgtPm5ldCwgTkZOTEdSUF9ORlRBQkxFUykpCiAJCXJldHVybiAwOwogCiAJZXJyID0gLUVOT0JVRlM7CkBAIC0yMTgsMTggKzI1MCwyMCBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnI7CiAKLQllcnIgPSBuZl90YWJsZXNfZmlsbF90YWJsZV9pbmZvKHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCAwLAotCQkJCQlmYW1pbHksIHRhYmxlKTsKKwllcnIgPSBuZl90YWJsZXNfZmlsbF90YWJsZV9pbmZvKHNrYiwgY3R4LT5wb3J0aWQsIGN0eC0+c2VxLCBldmVudCwgMCwKKwkJCQkJY3R4LT5hZmktPmZhbWlseSwgY3R4LT50YWJsZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWdvdG8gZXJyOwogCX0KIAotCWVyciA9IG5mbmV0bGlua19zZW5kKHNrYiwgbmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIHJlcG9ydCwKLQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJZXJyID0gbmZuZXRsaW5rX3NlbmQoc2tiLCBjdHgtPm5ldCwgY3R4LT5wb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsCisJCQkgICAgIGN0eC0+cmVwb3J0LCBHRlBfS0VSTkVMKTsKIGVycjoKLQlpZiAoZXJyIDwgMCkKLQkJbmZuZXRsaW5rX3NldF9lcnIobmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIGVycik7CisJaWYgKGVyciA8IDApIHsKKwkJbmZuZXRsaW5rX3NldF9lcnIoY3R4LT5uZXQsIGN0eC0+cG9ydGlkLCBORk5MR1JQX05GVEFCTEVTLAorCQkJCSAgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjY5LDYgKzMwMyw5IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCisvKiBJbnRlcm5hbCB0YWJsZSBmbGFncyAqLworI2RlZmluZSBORlRfVEFCTEVfSU5BQ1RJVkUJKDEgPDwgMTUpCisKIHN0YXRpYyBpbnQgbmZfdGFibGVzX2dldHRhYmxlKHN0cnVjdCBzb2NrICpubHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCkBAIC0yOTUsNiArMzMyLDggQEAKIAl0YWJsZSA9IG5mX3RhYmxlc190YWJsZV9sb29rdXAoYWZpLCBubGFbTkZUQV9UQUJMRV9OQU1FXSk7CiAJaWYgKElTX0VSUih0YWJsZSkpCiAJCXJldHVybiBQVFJfRVJSKHRhYmxlKTsKKwlpZiAodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCXNrYjIgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwogCWlmICghc2tiMikKQEAgLTM0Myw3ICszODIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbmZfdGFibGVzX3RhYmxlX2Rpc2FibGUoY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmksCitzdGF0aWMgdm9pZCBuZl90YWJsZXNfdGFibGVfZGlzYWJsZShjb25zdCBzdHJ1Y3QgbmZ0X2FmX2luZm8gKmFmaSwKIAkJCQkgICBzdHJ1Y3QgbmZ0X3RhYmxlICp0YWJsZSkKIHsKIAlzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbjsKQEAgLTM1Myw0NSArMzkyLDYzIEBACiAJCQluZl91bnJlZ2lzdGVyX2hvb2tzKG5mdF9iYXNlX2NoYWluKGNoYWluKS0+b3BzLAogCQkJCQkgICAgYWZpLT5ub3BzKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuZl90YWJsZXNfdXBkdGFibGUoc3RydWN0IHNvY2sgKm5sc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSwKLQkJCSAgICAgIHN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpLCBzdHJ1Y3QgbmZ0X3RhYmxlICp0YWJsZSkKK3N0YXRpYyBpbnQgbmZfdGFibGVzX3VwZHRhYmxlKHN0cnVjdCBuZnRfY3R4ICpjdHgpCiB7Ci0JY29uc3Qgc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IG5sbXNnX2RhdGEobmxoKTsKLQlpbnQgZmFtaWx5ID0gbmZtc2ctPm5mZ2VuX2ZhbWlseSwgcmV0ID0gMDsKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFuczsKKwl1MzIgZmxhZ3M7CisJaW50IHJldCA9IDA7CiAKLQlpZiAobmxhW05GVEFfVEFCTEVfRkxBR1NdKSB7Ci0JCXUzMiBmbGFnczsKKwlpZiAoIWN0eC0+bmxhW05GVEFfVEFCTEVfRkxBR1NdKQorCQlyZXR1cm4gMDsKIAotCQlmbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMihubGFbTkZUQV9UQUJMRV9GTEFHU10pKTsKLQkJaWYgKGZsYWdzICYgfk5GVF9UQUJMRV9GX0RPUk1BTlQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwlmbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMihjdHgtPm5sYVtORlRBX1RBQkxFX0ZMQUdTXSkpOworCWlmIChmbGFncyAmIH5ORlRfVEFCTEVfRl9ET1JNQU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoKGZsYWdzICYgTkZUX1RBQkxFX0ZfRE9STUFOVCkgJiYKLQkJICAgICEodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0ZfRE9STUFOVCkpIHsKLQkJCXJldCA9IG5mX3RhYmxlc190YWJsZV9kaXNhYmxlKGFmaSwgdGFibGUpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJCXRhYmxlLT5mbGFncyB8PSBORlRfVEFCTEVfRl9ET1JNQU5UOwotCQl9IGVsc2UgaWYgKCEoZmxhZ3MgJiBORlRfVEFCTEVfRl9ET1JNQU5UKSAmJgotCQkJICAgdGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0ZfRE9STUFOVCkgewotCQkJcmV0ID0gbmZfdGFibGVzX3RhYmxlX2VuYWJsZShhZmksIHRhYmxlKTsKLQkJCWlmIChyZXQgPj0gMCkKLQkJCQl0YWJsZS0+ZmxhZ3MgJj0gfk5GVF9UQUJMRV9GX0RPUk1BTlQ7CisJdHJhbnMgPSBuZnRfdHJhbnNfYWxsb2MoY3R4LCBORlRfTVNHX05FV1RBQkxFLAorCQkJCXNpemVvZihzdHJ1Y3QgbmZ0X3RyYW5zX3RhYmxlKSk7CisJaWYgKHRyYW5zID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChmbGFncyAmIE5GVF9UQUJMRV9GX0RPUk1BTlQpICYmCisJICAgICEoY3R4LT50YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfRl9ET1JNQU5UKSkgeworCQluZnRfdHJhbnNfdGFibGVfZW5hYmxlKHRyYW5zKSA9IGZhbHNlOworCX0gZWxzZSBpZiAoIShmbGFncyAmIE5GVF9UQUJMRV9GX0RPUk1BTlQpICYmCisJCSAgIGN0eC0+dGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0ZfRE9STUFOVCkgeworCQlyZXQgPSBuZl90YWJsZXNfdGFibGVfZW5hYmxlKGN0eC0+YWZpLCBjdHgtPnRhYmxlKTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQljdHgtPnRhYmxlLT5mbGFncyAmPSB+TkZUX1RBQkxFX0ZfRE9STUFOVDsKKwkJCW5mdF90cmFuc190YWJsZV9lbmFibGUodHJhbnMpID0gdHJ1ZTsKIAkJfQotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwogCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CiAKLQluZl90YWJsZXNfdGFibGVfbm90aWZ5KHNrYiwgbmxoLCB0YWJsZSwgTkZUX01TR19ORVdUQUJMRSwgZmFtaWx5KTsKKwluZnRfdHJhbnNfdGFibGVfdXBkYXRlKHRyYW5zKSA9IHRydWU7CisJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmxpc3QsICZjdHgtPm5ldC0+bmZ0LmNvbW1pdF9saXN0KTsKKwlyZXR1cm4gMDsKIGVycjoKKwluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBuZnRfdHJhbnNfdGFibGVfYWRkKHN0cnVjdCBuZnRfY3R4ICpjdHgsIGludCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFuczsKKworCXRyYW5zID0gbmZ0X3RyYW5zX2FsbG9jKGN0eCwgbXNnX3R5cGUsIHNpemVvZihzdHJ1Y3QgbmZ0X3RyYW5zX3RhYmxlKSk7CisJaWYgKHRyYW5zID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG1zZ190eXBlID09IE5GVF9NU0dfTkVXVEFCTEUpCisJCWN0eC0+dGFibGUtPmZsYWdzIHw9IE5GVF9UQUJMRV9JTkFDVElWRTsKKworCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5saXN0LCAmY3R4LT5uZXQtPm5mdC5jb21taXRfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmZfdGFibGVzX25ld3RhYmxlKHN0cnVjdCBzb2NrICpubHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCkBAIC00MDMsNiArNDYwLDggQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAlpbnQgZmFtaWx5ID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAl1MzIgZmxhZ3MgPSAwOworCXN0cnVjdCBuZnRfY3R4IGN0eDsKKwlpbnQgZXJyOwogCiAJYWZpID0gbmZfdGFibGVzX2FmaW5mb19sb29rdXAobmV0LCBmYW1pbHksIHRydWUpOwogCWlmIChJU19FUlIoYWZpKSkKQEAgLTQxNywxMSArNDc2LDE1IEBACiAJfQogCiAJaWYgKHRhYmxlICE9IE5VTEwpIHsKKwkJaWYgKHRhYmxlLT5mbGFncyAmIE5GVF9UQUJMRV9JTkFDVElWRSkKKwkJCXJldHVybiAtRU5PRU5UOwogCQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpCiAJCQlyZXR1cm4gLUVFWElTVDsKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQlyZXR1cm4gbmZfdGFibGVzX3VwZHRhYmxlKG5sc2ssIHNrYiwgbmxoLCBubGEsIGFmaSwgdGFibGUpOworCisJCW5mdF9jdHhfaW5pdCgmY3R4LCBza2IsIG5saCwgYWZpLCB0YWJsZSwgTlVMTCwgbmxhKTsKKwkJcmV0dXJuIG5mX3RhYmxlc191cGR0YWJsZSgmY3R4KTsKIAl9CiAKIAlpZiAobmxhW05GVEFfVEFCTEVfRkxBR1NdKSB7CkBAIC00NDQsOCArNTA3LDE0IEBACiAJSU5JVF9MSVNUX0hFQUQoJnRhYmxlLT5zZXRzKTsKIAl0YWJsZS0+ZmxhZ3MgPSBmbGFnczsKIAorCW5mdF9jdHhfaW5pdCgmY3R4LCBza2IsIG5saCwgYWZpLCB0YWJsZSwgTlVMTCwgbmxhKTsKKwllcnIgPSBuZnRfdHJhbnNfdGFibGVfYWRkKCZjdHgsIE5GVF9NU0dfTkVXVEFCTEUpOworCWlmIChlcnIgPCAwKSB7CisJCWtmcmVlKHRhYmxlKTsKKwkJbW9kdWxlX3B1dChhZmktPm93bmVyKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAJbGlzdF9hZGRfdGFpbCgmdGFibGUtPmxpc3QsICZhZmktPnRhYmxlcyk7Ci0JbmZfdGFibGVzX3RhYmxlX25vdGlmeShza2IsIG5saCwgdGFibGUsIE5GVF9NU0dfTkVXVEFCTEUsIGZhbWlseSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1Nyw3ICs1MjYsOCBAQAogCXN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpOwogCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwotCWludCBmYW1pbHkgPSBuZm1zZy0+bmZnZW5fZmFtaWx5OworCWludCBmYW1pbHkgPSBuZm1zZy0+bmZnZW5fZmFtaWx5LCBlcnI7CisJc3RydWN0IG5mdF9jdHggY3R4OwogCiAJYWZpID0gbmZfdGFibGVzX2FmaW5mb19sb29rdXAobmV0LCBmYW1pbHksIGZhbHNlKTsKIAlpZiAoSVNfRVJSKGFmaSkpCkBAIC00NjYsMTcgKzUzNiwyOCBAQAogCXRhYmxlID0gbmZfdGFibGVzX3RhYmxlX2xvb2t1cChhZmksIG5sYVtORlRBX1RBQkxFX05BTUVdKTsKIAlpZiAoSVNfRVJSKHRhYmxlKSkKIAkJcmV0dXJuIFBUUl9FUlIodGFibGUpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZ0YWJsZS0+Y2hhaW5zKSB8fCAhbGlzdF9lbXB0eSgmdGFibGUtPnNldHMpKQorCWlmICh0YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOworCWlmICh0YWJsZS0+dXNlID4gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCW5mdF9jdHhfaW5pdCgmY3R4LCBza2IsIG5saCwgYWZpLCB0YWJsZSwgTlVMTCwgbmxhKTsKKwllcnIgPSBuZnRfdHJhbnNfdGFibGVfYWRkKCZjdHgsIE5GVF9NU0dfREVMVEFCTEUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJbGlzdF9kZWwoJnRhYmxlLT5saXN0KTsKLQluZl90YWJsZXNfdGFibGVfbm90aWZ5KHNrYiwgbmxoLCB0YWJsZSwgTkZUX01TR19ERUxUQUJMRSwgZmFtaWx5KTsKLQlrZnJlZSh0YWJsZSk7Ci0JbW9kdWxlX3B1dChhZmktPm93bmVyKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbmZfdGFibGVzX3RhYmxlX2Rlc3Ryb3koc3RydWN0IG5mdF9jdHggKmN0eCkKK3sKKwlCVUdfT04oY3R4LT50YWJsZS0+dXNlID4gMCk7CisKKwlrZnJlZShjdHgtPnRhYmxlKTsKKwltb2R1bGVfcHV0KGN0eC0+YWZpLT5vd25lcik7Cit9CisKIGludCBuZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZShjb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZSAqY3R5cGUpCiB7CiAJaW50IGVyciA9IDA7CkBAIC01NDEsNyArNjIyLDcgQEAKIAkJCQkgICAgLmxlbiA9IE5GVF9DSEFJTl9NQVhOQU1FTEVOIC0gMSB9LAogCVtORlRBX0NIQUlOX0hPT0tdCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKIAlbTkZUQV9DSEFJTl9QT0xJQ1ldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbTkZUQV9DSEFJTl9UWVBFXQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORyB9LAorCVtORlRBX0NIQUlOX1RZUEVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcgfSwKIAlbTkZUQV9DSEFJTl9DT1VOVEVSU10JPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIApAQCAtNjM3LDIxICs3MTgsMTMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgbmZfdGFibGVzX2NoYWluX25vdGlmeShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAotCQkJCSAgY29uc3Qgc3RydWN0IG5mdF90YWJsZSAqdGFibGUsCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbiwKLQkJCQkgIGludCBldmVudCwgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgbmZfdGFibGVzX2NoYWluX25vdGlmeShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1MzIgcG9ydGlkID0gb3NrYiA/IE5FVExJTktfQ0Iob3NrYikucG9ydGlkIDogMDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBvc2tiID8gc29ja19uZXQob3NrYi0+c2spIDogJmluaXRfbmV0OwotCXUzMiBzZXEgPSBubGggPyBubGgtPm5sbXNnX3NlcSA6IDA7Ci0JYm9vbCByZXBvcnQ7CiAJaW50IGVycjsKIAotCXJlcG9ydCA9IG5saCA/IG5sbXNnX3JlcG9ydChubGgpIDogZmFsc2U7Ci0JaWYgKCFyZXBvcnQgJiYgIW5mbmV0bGlua19oYXNfbGlzdGVuZXJzKG5ldCwgTkZOTEdSUF9ORlRBQkxFUykpCisJaWYgKCFjdHgtPnJlcG9ydCAmJgorCSAgICAhbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMoY3R4LT5uZXQsIE5GTkxHUlBfTkZUQUJMRVMpKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IC1FTk9CVUZTOwpAQCAtNjU5LDE4ICs3MzIsMjEgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyOwogCi0JZXJyID0gbmZfdGFibGVzX2ZpbGxfY2hhaW5faW5mbyhza2IsIHBvcnRpZCwgc2VxLCBldmVudCwgMCwgZmFtaWx5LAotCQkJCQl0YWJsZSwgY2hhaW4pOworCWVyciA9IG5mX3RhYmxlc19maWxsX2NoYWluX2luZm8oc2tiLCBjdHgtPnBvcnRpZCwgY3R4LT5zZXEsIGV2ZW50LCAwLAorCQkJCQljdHgtPmFmaS0+ZmFtaWx5LCBjdHgtPnRhYmxlLAorCQkJCQljdHgtPmNoYWluKTsKIAlpZiAoZXJyIDwgMCkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJZ290byBlcnI7CiAJfQogCi0JZXJyID0gbmZuZXRsaW5rX3NlbmQoc2tiLCBuZXQsIHBvcnRpZCwgTkZOTEdSUF9ORlRBQkxFUywgcmVwb3J0LAotCQkJICAgICBHRlBfS0VSTkVMKTsKKwllcnIgPSBuZm5ldGxpbmtfc2VuZChza2IsIGN0eC0+bmV0LCBjdHgtPnBvcnRpZCwgTkZOTEdSUF9ORlRBQkxFUywKKwkJCSAgICAgY3R4LT5yZXBvcnQsIEdGUF9LRVJORUwpOwogZXJyOgotCWlmIChlcnIgPCAwKQotCQluZm5ldGxpbmtfc2V0X2VycihuZXQsIHBvcnRpZCwgTkZOTEdSUF9ORlRBQkxFUywgZXJyKTsKKwlpZiAoZXJyIDwgMCkgeworCQluZm5ldGxpbmtfc2V0X2VycihjdHgtPm5ldCwgY3R4LT5wb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsCisJCQkJICBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCkBAIC03NDAsMTAgKzgxNiwxNCBAQAogCXRhYmxlID0gbmZfdGFibGVzX3RhYmxlX2xvb2t1cChhZmksIG5sYVtORlRBX0NIQUlOX1RBQkxFXSk7CiAJaWYgKElTX0VSUih0YWJsZSkpCiAJCXJldHVybiBQVFJfRVJSKHRhYmxlKTsKKwlpZiAodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWNoYWluID0gbmZfdGFibGVzX2NoYWluX2xvb2t1cCh0YWJsZSwgbmxhW05GVEFfQ0hBSU5fTkFNRV0pOwogCWlmIChJU19FUlIoY2hhaW4pKQogCQlyZXR1cm4gUFRSX0VSUihjaGFpbik7CisJaWYgKGNoYWluLT5mbGFncyAmIE5GVF9DSEFJTl9JTkFDVElWRSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlza2IyID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYjIpCkBAIC03NjcsOCArODQ3LDcgQEAKIAlbTkZUQV9DT1VOVEVSX0JZVEVTXQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCiB9OwogCi1zdGF0aWMgaW50Ci1uZl90YWJsZXNfY291bnRlcnMoc3RydWN0IG5mdF9iYXNlX2NoYWluICpjaGFpbiwgY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cikKK3N0YXRpYyBzdHJ1Y3QgbmZ0X3N0YXRzIF9fcGVyY3B1ICpuZnRfc3RhdHNfYWxsb2MoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltORlRBX0NPVU5URVJfTUFYKzFdOwogCXN0cnVjdCBuZnRfc3RhdHMgX19wZXJjcHUgKm5ld3N0YXRzOwpAQCAtNzc3LDE0ICs4NTYsMTQgQEAKIAogCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GVEFfQ09VTlRFUl9NQVgsIGF0dHIsIG5mdF9jb3VudGVyX3BvbGljeSk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCXJldHVybiBFUlJfUFRSKGVycik7CiAKIAlpZiAoIXRiW05GVEFfQ09VTlRFUl9CWVRFU10gfHwgIXRiW05GVEFfQ09VTlRFUl9QQUNLRVRTXSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJbmV3c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IG5mdF9zdGF0cyk7CiAJaWYgKG5ld3N0YXRzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCS8qIFJlc3RvcmUgb2xkIGNvdW50ZXJzIG9uIHRoaXMgY3B1LCBubyBwcm9ibGVtLiBQZXItY3B1IHN0YXRpc3RpY3MKIAkgKiBhcmUgbm90IGV4cG9zZWQgdG8gdXNlcnNwYWNlLgpAQCAtNzkzLDYgKzg3MiwxMiBAQAogCXN0YXRzLT5ieXRlcyA9IGJlNjRfdG9fY3B1KG5sYV9nZXRfYmU2NCh0YltORlRBX0NPVU5URVJfQllURVNdKSk7CiAJc3RhdHMtPnBrdHMgPSBiZTY0X3RvX2NwdShubGFfZ2V0X2JlNjQodGJbTkZUQV9DT1VOVEVSX1BBQ0tFVFNdKSk7CiAKKwlyZXR1cm4gbmV3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9jaGFpbl9zdGF0c19yZXBsYWNlKHN0cnVjdCBuZnRfYmFzZV9jaGFpbiAqY2hhaW4sCisJCQkJICAgIHN0cnVjdCBuZnRfc3RhdHMgX19wZXJjcHUgKm5ld3N0YXRzKQorewogCWlmIChjaGFpbi0+c3RhdHMpIHsKIAkJc3RydWN0IG5mdF9zdGF0cyBfX3BlcmNwdSAqb2xkc3RhdHMgPQogCQkJCW5mdF9kZXJlZmVyZW5jZShjaGFpbi0+c3RhdHMpOwpAQCAtODAyLDE3ICs4ODcsNDMgQEAKIAkJZnJlZV9wZXJjcHUob2xkc3RhdHMpOwogCX0gZWxzZQogCQlyY3VfYXNzaWduX3BvaW50ZXIoY2hhaW4tPnN0YXRzLCBuZXdzdGF0cyk7Cit9CiAKK3N0YXRpYyBpbnQgbmZ0X3RyYW5zX2NoYWluX2FkZChzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBpbnQgbXNnX3R5cGUpCit7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnM7CisKKwl0cmFucyA9IG5mdF90cmFuc19hbGxvYyhjdHgsIG1zZ190eXBlLCBzaXplb2Yoc3RydWN0IG5mdF90cmFuc19jaGFpbikpOworCWlmICh0cmFucyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtc2dfdHlwZSA9PSBORlRfTVNHX05FV0NIQUlOKQorCQljdHgtPmNoYWluLT5mbGFncyB8PSBORlRfQ0hBSU5fSU5BQ1RJVkU7CisKKwlsaXN0X2FkZF90YWlsKCZ0cmFucy0+bGlzdCwgJmN0eC0+bmV0LT5uZnQuY29tbWl0X2xpc3QpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBuZl90YWJsZXNfY2hhaW5fZGVzdHJveShzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbikKK3sKKwlCVUdfT04oY2hhaW4tPnVzZSA+IDApOworCisJaWYgKGNoYWluLT5mbGFncyAmIE5GVF9CQVNFX0NIQUlOKSB7CisJCW1vZHVsZV9wdXQobmZ0X2Jhc2VfY2hhaW4oY2hhaW4pLT50eXBlLT5vd25lcik7CisJCWZyZWVfcGVyY3B1KG5mdF9iYXNlX2NoYWluKGNoYWluKS0+c3RhdHMpOworCQlrZnJlZShuZnRfYmFzZV9jaGFpbihjaGFpbikpOworCX0gZWxzZSB7CisJCWtmcmVlKGNoYWluKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgbmZfdGFibGVzX25ld2NoYWluKHN0cnVjdCBzb2NrICpubHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCiB7CiAJY29uc3Qgc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIAljb25zdCBzdHJ1Y3QgbmxhdHRyICogdW5pbml0aWFsaXplZF92YXIobmFtZSk7Ci0JY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CiAJc3RydWN0IG5mdF90YWJsZSAqdGFibGU7CiAJc3RydWN0IG5mdF9jaGFpbiAqY2hhaW47CiAJc3RydWN0IG5mdF9iYXNlX2NoYWluICpiYXNlY2hhaW4gPSBOVUxMOwpAQCAtODIyLDggKzkzMywxMCBAQAogCXU4IHBvbGljeSA9IE5GX0FDQ0VQVDsKIAl1NjQgaGFuZGxlID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgbmZ0X3N0YXRzIF9fcGVyY3B1ICpzdGF0czsKIAlpbnQgZXJyOwogCWJvb2wgY3JlYXRlOworCXN0cnVjdCBuZnRfY3R4IGN0eDsKIAogCWNyZWF0ZSA9IG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUgPyB0cnVlIDogZmFsc2U7CiAKQEAgLTg2OSw2ICs5ODIsMTEgQEAKIAl9CiAKIAlpZiAoY2hhaW4gIT0gTlVMTCkgeworCQlzdHJ1Y3QgbmZ0X3N0YXRzICpzdGF0cyA9IE5VTEw7CisJCXN0cnVjdCBuZnRfdHJhbnMgKnRyYW5zOworCisJCWlmIChjaGFpbi0+ZmxhZ3MgJiBORlRfQ0hBSU5fSU5BQ1RJVkUpCisJCQlyZXR1cm4gLUVOT0VOVDsKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVQTEFDRSkKQEAgLTg4MiwxOSArMTAwMCwzMSBAQAogCQkJaWYgKCEoY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pKQogCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQkJZXJyID0gbmZfdGFibGVzX2NvdW50ZXJzKG5mdF9iYXNlX2NoYWluKGNoYWluKSwKLQkJCQkJCSBubGFbTkZUQV9DSEFJTl9DT1VOVEVSU10pOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKKwkJCXN0YXRzID0gbmZ0X3N0YXRzX2FsbG9jKG5sYVtORlRBX0NIQUlOX0NPVU5URVJTXSk7CisJCQlpZiAoSVNfRVJSKHN0YXRzKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihzdGF0cyk7CiAJCX0KIAorCQluZnRfY3R4X2luaXQoJmN0eCwgc2tiLCBubGgsIGFmaSwgdGFibGUsIGNoYWluLCBubGEpOworCQl0cmFucyA9IG5mdF90cmFuc19hbGxvYygmY3R4LCBORlRfTVNHX05FV0NIQUlOLAorCQkJCQlzaXplb2Yoc3RydWN0IG5mdF90cmFuc19jaGFpbikpOworCQlpZiAodHJhbnMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW5mdF90cmFuc19jaGFpbl9zdGF0cyh0cmFucykgPSBzdGF0czsKKwkJbmZ0X3RyYW5zX2NoYWluX3VwZGF0ZSh0cmFucykgPSB0cnVlOworCiAJCWlmIChubGFbTkZUQV9DSEFJTl9QT0xJQ1ldKQotCQkJbmZ0X2Jhc2VfY2hhaW4oY2hhaW4pLT5wb2xpY3kgPSBwb2xpY3k7CisJCQluZnRfdHJhbnNfY2hhaW5fcG9saWN5KHRyYW5zKSA9IHBvbGljeTsKKwkJZWxzZQorCQkJbmZ0X3RyYW5zX2NoYWluX3BvbGljeSh0cmFucykgPSAtMTsKIAotCQlpZiAobmxhW05GVEFfQ0hBSU5fSEFORExFXSAmJiBuYW1lKQotCQkJbmxhX3N0cmxjcHkoY2hhaW4tPm5hbWUsIG5hbWUsIE5GVF9DSEFJTl9NQVhOQU1FTEVOKTsKLQotCQlnb3RvIG5vdGlmeTsKKwkJaWYgKG5sYVtORlRBX0NIQUlOX0hBTkRMRV0gJiYgbmFtZSkgeworCQkJbmxhX3N0cmxjcHkobmZ0X3RyYW5zX2NoYWluX25hbWUodHJhbnMpLCBuYW1lLAorCQkJCSAgICBORlRfQ0hBSU5fTUFYTkFNRUxFTik7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmxpc3QsICZuZXQtPm5mdC5jb21taXRfbGlzdCk7CisJCXJldHVybiAwOwogCX0KIAogCWlmICh0YWJsZS0+dXNlID09IFVJTlRfTUFYKQpAQCAtOTM5LDIzICsxMDY5LDIxIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlpZiAobmxhW05GVEFfQ0hBSU5fQ09VTlRFUlNdKSB7Ci0JCQllcnIgPSBuZl90YWJsZXNfY291bnRlcnMoYmFzZWNoYWluLAotCQkJCQkJIG5sYVtORlRBX0NIQUlOX0NPVU5URVJTXSk7Ci0JCQlpZiAoZXJyIDwgMCkgeworCQkJc3RhdHMgPSBuZnRfc3RhdHNfYWxsb2MobmxhW05GVEFfQ0hBSU5fQ09VTlRFUlNdKTsKKwkJCWlmIChJU19FUlIoc3RhdHMpKSB7CiAJCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CiAJCQkJa2ZyZWUoYmFzZWNoYWluKTsKLQkJCQlyZXR1cm4gZXJyOworCQkJCXJldHVybiBQVFJfRVJSKHN0YXRzKTsKIAkJCX0KKwkJCWJhc2VjaGFpbi0+c3RhdHMgPSBzdGF0czsKIAkJfSBlbHNlIHsKLQkJCXN0cnVjdCBuZnRfc3RhdHMgX19wZXJjcHUgKm5ld3N0YXRzOwotCi0JCQluZXdzdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbmZ0X3N0YXRzKTsKLQkJCWlmIChuZXdzdGF0cyA9PSBOVUxMKSB7CisJCQlzdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbmZ0X3N0YXRzKTsKKwkJCWlmIChJU19FUlIoc3RhdHMpKSB7CiAJCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CiAJCQkJa2ZyZWUoYmFzZWNoYWluKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlyZXR1cm4gUFRSX0VSUihzdGF0cyk7CiAJCQl9Ci0JCQlyY3VfYXNzaWduX3BvaW50ZXIoYmFzZWNoYWluLT5zdGF0cywgbmV3c3RhdHMpOworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGJhc2VjaGFpbi0+c3RhdHMsIHN0YXRzKTsKIAkJfQogCiAJCWJhc2VjaGFpbi0+dHlwZSA9IHR5cGU7CkBAIC05OTIsMzEgKzExMjAsMjcgQEAKIAlpZiAoISh0YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfRl9ET1JNQU5UKSAmJgogCSAgICBjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikgewogCQllcnIgPSBuZl9yZWdpc3Rlcl9ob29rcyhuZnRfYmFzZV9jaGFpbihjaGFpbiktPm9wcywgYWZpLT5ub3BzKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCW1vZHVsZV9wdXQoYmFzZWNoYWluLT50eXBlLT5vd25lcik7Ci0JCQlmcmVlX3BlcmNwdShiYXNlY2hhaW4tPnN0YXRzKTsKLQkJCWtmcmVlKGJhc2VjaGFpbik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnIxOwogCX0KLQlsaXN0X2FkZF90YWlsKCZjaGFpbi0+bGlzdCwgJnRhYmxlLT5jaGFpbnMpOworCisJbmZ0X2N0eF9pbml0KCZjdHgsIHNrYiwgbmxoLCBhZmksIHRhYmxlLCBjaGFpbiwgbmxhKTsKKwllcnIgPSBuZnRfdHJhbnNfY2hhaW5fYWRkKCZjdHgsIE5GVF9NU0dfTkVXQ0hBSU4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKIAl0YWJsZS0+dXNlKys7Ci1ub3RpZnk6Ci0JbmZfdGFibGVzX2NoYWluX25vdGlmeShza2IsIG5saCwgdGFibGUsIGNoYWluLCBORlRfTVNHX05FV0NIQUlOLAotCQkJICAgICAgIGZhbWlseSk7CisJbGlzdF9hZGRfdGFpbCgmY2hhaW4tPmxpc3QsICZ0YWJsZS0+Y2hhaW5zKTsKIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbmZfdGFibGVzX2NoYWluX2Rlc3Ryb3koc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4pCi17Ci0JQlVHX09OKGNoYWluLT51c2UgPiAwKTsKLQotCWlmIChjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikgewotCQltb2R1bGVfcHV0KG5mdF9iYXNlX2NoYWluKGNoYWluKS0+dHlwZS0+b3duZXIpOwotCQlmcmVlX3BlcmNwdShuZnRfYmFzZV9jaGFpbihjaGFpbiktPnN0YXRzKTsKLQkJa2ZyZWUobmZ0X2Jhc2VfY2hhaW4oY2hhaW4pKTsKLQl9IGVsc2UKLQkJa2ZyZWUoY2hhaW4pOworZXJyMjoKKwlpZiAoISh0YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfRl9ET1JNQU5UKSAmJgorCSAgICBjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikgeworCQluZl91bnJlZ2lzdGVyX2hvb2tzKG5mdF9iYXNlX2NoYWluKGNoYWluKS0+b3BzLAorCQkJCSAgICBhZmktPm5vcHMpOworCX0KK2VycjE6CisJbmZfdGFibGVzX2NoYWluX2Rlc3Ryb3koY2hhaW4pOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbmZfdGFibGVzX2RlbGNoYWluKHN0cnVjdCBzb2NrICpubHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTAyNCwxMSArMTE0OCwxMyBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQogewogCWNvbnN0IHN0cnVjdCBuZmdlbm1zZyAqbmZtc2cgPSBubG1zZ19kYXRhKG5saCk7Ci0JY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CiAJc3RydWN0IG5mdF90YWJsZSAqdGFibGU7CiAJc3RydWN0IG5mdF9jaGFpbiAqY2hhaW47CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJaW50IGZhbWlseSA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CisJc3RydWN0IG5mdF9jdHggY3R4OworCWludCBlcnI7CiAKIAlhZmkgPSBuZl90YWJsZXNfYWZpbmZvX2xvb2t1cChuZXQsIGZhbWlseSwgZmFsc2UpOwogCWlmIChJU19FUlIoYWZpKSkKQEAgLTEwMzcsNDggKzExNjMsMjcgQEAKIAl0YWJsZSA9IG5mX3RhYmxlc190YWJsZV9sb29rdXAoYWZpLCBubGFbTkZUQV9DSEFJTl9UQUJMRV0pOwogCWlmIChJU19FUlIodGFibGUpKQogCQlyZXR1cm4gUFRSX0VSUih0YWJsZSk7CisJaWYgKHRhYmxlLT5mbGFncyAmIE5GVF9UQUJMRV9JTkFDVElWRSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAljaGFpbiA9IG5mX3RhYmxlc19jaGFpbl9sb29rdXAodGFibGUsIG5sYVtORlRBX0NIQUlOX05BTUVdKTsKIAlpZiAoSVNfRVJSKGNoYWluKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2hhaW4pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZjaGFpbi0+cnVsZXMpIHx8IGNoYWluLT51c2UgPiAwKQorCWlmIChjaGFpbi0+ZmxhZ3MgJiBORlRfQ0hBSU5fSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOworCWlmIChjaGFpbi0+dXNlID4gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWxpc3RfZGVsKCZjaGFpbi0+bGlzdCk7CisJbmZ0X2N0eF9pbml0KCZjdHgsIHNrYiwgbmxoLCBhZmksIHRhYmxlLCBjaGFpbiwgbmxhKTsKKwllcnIgPSBuZnRfdHJhbnNfY2hhaW5fYWRkKCZjdHgsIE5GVF9NU0dfREVMQ0hBSU4pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJdGFibGUtPnVzZS0tOwotCi0JaWYgKCEodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0ZfRE9STUFOVCkgJiYKLQkgICAgY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pCi0JCW5mX3VucmVnaXN0ZXJfaG9va3MobmZ0X2Jhc2VfY2hhaW4oY2hhaW4pLT5vcHMsIGFmaS0+bm9wcyk7Ci0KLQluZl90YWJsZXNfY2hhaW5fbm90aWZ5KHNrYiwgbmxoLCB0YWJsZSwgY2hhaW4sIE5GVF9NU0dfREVMQ0hBSU4sCi0JCQkgICAgICAgZmFtaWx5KTsKLQotCS8qIE1ha2Ugc3VyZSBhbGwgcnVsZSByZWZlcmVuY2VzIGFyZSBnb25lIGJlZm9yZSB0aGlzIGlzIHJlbGVhc2VkICovCi0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQluZl90YWJsZXNfY2hhaW5fZGVzdHJveShjaGFpbik7CisJbGlzdF9kZWwoJmNoYWluLT5saXN0KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbmZ0X2N0eF9pbml0KHN0cnVjdCBuZnRfY3R4ICpjdHgsCi0JCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2FmX2luZm8gKmFmaSwKLQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3RhYmxlICp0YWJsZSwKLQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbiwKLQkJCSBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgKm5sYSkKLXsKLQljdHgtPm5ldCAgID0gc29ja19uZXQoc2tiLT5zayk7Ci0JY3R4LT5za2IgICA9IHNrYjsKLQljdHgtPm5saCAgID0gbmxoOwotCWN0eC0+YWZpICAgPSBhZmk7Ci0JY3R4LT50YWJsZSA9IHRhYmxlOwotCWN0eC0+Y2hhaW4gPSBjaGFpbjsKLQljdHgtPm5sYSAgID0gbmxhOwotfQotCiAvKgogICogRXhwcmVzc2lvbnMKICAqLwpAQCAtMTA5Myw3ICsxMTk4LDEwIEBACiBpbnQgbmZ0X3JlZ2lzdGVyX2V4cHIoc3RydWN0IG5mdF9leHByX3R5cGUgKnR5cGUpCiB7CiAJbmZubF9sb2NrKE5GTkxfU1VCU1lTX05GVEFCTEVTKTsKLQlsaXN0X2FkZF90YWlsKCZ0eXBlLT5saXN0LCAmbmZfdGFibGVzX2V4cHJlc3Npb25zKTsKKwlpZiAodHlwZS0+ZmFtaWx5ID09IE5GUFJPVE9fVU5TUEVDKQorCQlsaXN0X2FkZF90YWlsKCZ0eXBlLT5saXN0LCAmbmZfdGFibGVzX2V4cHJlc3Npb25zKTsKKwllbHNlCisJCWxpc3RfYWRkKCZ0eXBlLT5saXN0LCAmbmZfdGFibGVzX2V4cHJlc3Npb25zKTsKIAluZm5sX3VubG9jayhORk5MX1NVQlNZU19ORlRBQkxFUyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzYxLDIyICsxNDY5LDE1IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IG5mX3RhYmxlc19ydWxlX25vdGlmeShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwKLQkJCQkgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkJIGNvbnN0IHN0cnVjdCBuZnRfdGFibGUgKnRhYmxlLAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbiwKK3N0YXRpYyBpbnQgbmZfdGFibGVzX3J1bGVfbm90aWZ5KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZnRfcnVsZSAqcnVsZSwKLQkJCQkgaW50IGV2ZW50LCB1MzIgZmxhZ3MsIGludCBmYW1pbHkpCisJCQkJIGludCBldmVudCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXUzMiBwb3J0aWQgPSBORVRMSU5LX0NCKG9za2IpLnBvcnRpZDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBvc2tiID8gc29ja19uZXQob3NrYi0+c2spIDogJmluaXRfbmV0OwotCXUzMiBzZXEgPSBubGgtPm5sbXNnX3NlcTsKLQlib29sIHJlcG9ydDsKIAlpbnQgZXJyOwogCi0JcmVwb3J0ID0gbmxtc2dfcmVwb3J0KG5saCk7Ci0JaWYgKCFyZXBvcnQgJiYgIW5mbmV0bGlua19oYXNfbGlzdGVuZXJzKG5ldCwgTkZOTEdSUF9ORlRBQkxFUykpCisJaWYgKCFjdHgtPnJlcG9ydCAmJgorCSAgICAhbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMoY3R4LT5uZXQsIE5GTkxHUlBfTkZUQUJMRVMpKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IC1FTk9CVUZTOwpAQCAtMTM4NCwxOCArMTQ4NSwyMSBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnI7CiAKLQllcnIgPSBuZl90YWJsZXNfZmlsbF9ydWxlX2luZm8oc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIGZsYWdzLAotCQkJCSAgICAgICBmYW1pbHksIHRhYmxlLCBjaGFpbiwgcnVsZSk7CisJZXJyID0gbmZfdGFibGVzX2ZpbGxfcnVsZV9pbmZvKHNrYiwgY3R4LT5wb3J0aWQsIGN0eC0+c2VxLCBldmVudCwgMCwKKwkJCQkgICAgICAgY3R4LT5hZmktPmZhbWlseSwgY3R4LT50YWJsZSwKKwkJCQkgICAgICAgY3R4LT5jaGFpbiwgcnVsZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWdvdG8gZXJyOwogCX0KIAotCWVyciA9IG5mbmV0bGlua19zZW5kKHNrYiwgbmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIHJlcG9ydCwKLQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJZXJyID0gbmZuZXRsaW5rX3NlbmQoc2tiLCBjdHgtPm5ldCwgY3R4LT5wb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsCisJCQkgICAgIGN0eC0+cmVwb3J0LCBHRlBfS0VSTkVMKTsKIGVycjoKLQlpZiAoZXJyIDwgMCkKLQkJbmZuZXRsaW5rX3NldF9lcnIobmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIGVycik7CisJaWYgKGVyciA8IDApIHsKKwkJbmZuZXRsaW5rX3NldF9lcnIoY3R4LT5uZXQsIGN0eC0+cG9ydGlkLCBORk5MR1JQX05GVEFCTEVTLAorCQkJCSAgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTUxMSwxMCArMTYxNSwxNCBAQAogCXRhYmxlID0gbmZfdGFibGVzX3RhYmxlX2xvb2t1cChhZmksIG5sYVtORlRBX1JVTEVfVEFCTEVdKTsKIAlpZiAoSVNfRVJSKHRhYmxlKSkKIAkJcmV0dXJuIFBUUl9FUlIodGFibGUpOworCWlmICh0YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOwogCiAJY2hhaW4gPSBuZl90YWJsZXNfY2hhaW5fbG9va3VwKHRhYmxlLCBubGFbTkZUQV9SVUxFX0NIQUlOXSk7CiAJaWYgKElTX0VSUihjaGFpbikpCiAJCXJldHVybiBQVFJfRVJSKGNoYWluKTsKKwlpZiAoY2hhaW4tPmZsYWdzICYgTkZUX0NIQUlOX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCXJ1bGUgPSBuZl90YWJsZXNfcnVsZV9sb29rdXAoY2hhaW4sIG5sYVtORlRBX1JVTEVfSEFORExFXSk7CiAJaWYgKElTX0VSUihydWxlKSkKQEAgLTE1NTQsMzcgKzE2NjIsMzYgQEAKIAlrZnJlZShydWxlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBuZnRfdHJhbnMgKm5mdF90cmFuc19ydWxlX2FkZChzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBpbnQgbXNnX3R5cGUsCisJCQkJCSAgICBzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCit7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnM7CisKKwl0cmFucyA9IG5mdF90cmFuc19hbGxvYyhjdHgsIG1zZ190eXBlLCBzaXplb2Yoc3RydWN0IG5mdF90cmFuc19ydWxlKSk7CisJaWYgKHRyYW5zID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbmZ0X3RyYW5zX3J1bGUodHJhbnMpID0gcnVsZTsKKwlsaXN0X2FkZF90YWlsKCZ0cmFucy0+bGlzdCwgJmN0eC0+bmV0LT5uZnQuY29tbWl0X2xpc3QpOworCisJcmV0dXJuIHRyYW5zOworfQorCiAjZGVmaW5lIE5GVF9SVUxFX01BWEVYUFJTCTEyOAogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX2luZm8gKmluZm87CiAKLXN0YXRpYyBzdHJ1Y3QgbmZ0X3J1bGVfdHJhbnMgKgotbmZfdGFibGVzX3RyYW5zX2FkZChzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCi17Ci0Jc3RydWN0IG5mdF9ydWxlX3RyYW5zICpydXBkOwotCi0JcnVwZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnRfcnVsZV90cmFucyksIEdGUF9LRVJORUwpOwotCWlmIChydXBkID09IE5VTEwpCi0JICAgICAgIHJldHVybiBOVUxMOwotCi0JcnVwZC0+Y3R4ID0gKmN0eDsKLQlydXBkLT5ydWxlID0gcnVsZTsKLQlsaXN0X2FkZF90YWlsKCZydXBkLT5saXN0LCAmY3R4LT5uZXQtPm5mdC5jb21taXRfbGlzdCk7Ci0KLQlyZXR1cm4gcnVwZDsKLX0KLQogc3RhdGljIGludCBuZl90YWJsZXNfbmV3cnVsZShzdHJ1Y3Qgc29jayAqbmxzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gbmxtc2dfZGF0YShubGgpOwotCWNvbnN0IHN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpOworCXN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBuZnRfY2hhaW4gKmNoYWluOwogCXN0cnVjdCBuZnRfcnVsZSAqcnVsZSwgKm9sZF9ydWxlID0gTlVMTDsKLQlzdHJ1Y3QgbmZ0X3J1bGVfdHJhbnMgKnJlcGwgPSBOVUxMOworCXN0cnVjdCBuZnRfdHJhbnMgKnRyYW5zID0gTlVMTDsKIAlzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHI7CiAJc3RydWN0IG5mdF9jdHggY3R4OwogCXN0cnVjdCBubGF0dHIgKnRtcDsKQEAgLTE2ODIsOCArMTc4OSw5IEBACiAKIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUExBQ0UpIHsKIAkJaWYgKG5mdF9ydWxlX2lzX2FjdGl2ZV9uZXh0KG5ldCwgb2xkX3J1bGUpKSB7Ci0JCQlyZXBsID0gbmZfdGFibGVzX3RyYW5zX2FkZCgmY3R4LCBvbGRfcnVsZSk7Ci0JCQlpZiAocmVwbCA9PSBOVUxMKSB7CisJCQl0cmFucyA9IG5mdF90cmFuc19ydWxlX2FkZCgmY3R4LCBORlRfTVNHX05FV1JVTEUsCisJCQkJCQkgICBvbGRfcnVsZSk7CisJCQlpZiAodHJhbnMgPT0gTlVMTCkgewogCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJZ290byBlcnIyOwogCQkJfQpAQCAtMTcwNSwxOSArMTgxMywxOSBAQAogCQkJbGlzdF9hZGRfcmN1KCZydWxlLT5saXN0LCAmY2hhaW4tPnJ1bGVzKTsKIAl9CiAKLQlpZiAobmZfdGFibGVzX3RyYW5zX2FkZCgmY3R4LCBydWxlKSA9PSBOVUxMKSB7CisJaWYgKG5mdF90cmFuc19ydWxlX2FkZCgmY3R4LCBORlRfTVNHX05FV1JVTEUsIHJ1bGUpID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnIzOwogCX0KKwljaGFpbi0+dXNlKys7CiAJcmV0dXJuIDA7CiAKIGVycjM6CiAJbGlzdF9kZWxfcmN1KCZydWxlLT5saXN0KTsKLQlpZiAocmVwbCkgewotCQlsaXN0X2RlbF9yY3UoJnJlcGwtPnJ1bGUtPmxpc3QpOwotCQlsaXN0X2RlbCgmcmVwbC0+bGlzdCk7Ci0JCW5mdF9ydWxlX2NsZWFyKG5ldCwgcmVwbC0+cnVsZSk7Ci0JCWtmcmVlKHJlcGwpOworCWlmICh0cmFucykgeworCQlsaXN0X2RlbF9yY3UoJm5mdF90cmFuc19ydWxlKHRyYW5zKS0+bGlzdCk7CisJCW5mdF9ydWxlX2NsZWFyKG5ldCwgbmZ0X3RyYW5zX3J1bGUodHJhbnMpKTsKKwkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOwogCX0KIGVycjI6CiAJbmZfdGFibGVzX3J1bGVfZGVzdHJveSgmY3R4LCBydWxlKTsKQEAgLTE3MzQsOSArMTg0MiwxMCBAQAogewogCS8qIFlvdSBjYW5ub3QgZGVsZXRlIHRoZSBzYW1lIHJ1bGUgdHdpY2UgKi8KIAlpZiAobmZ0X3J1bGVfaXNfYWN0aXZlX25leHQoY3R4LT5uZXQsIHJ1bGUpKSB7Ci0JCWlmIChuZl90YWJsZXNfdHJhbnNfYWRkKGN0eCwgcnVsZSkgPT0gTlVMTCkKKwkJaWYgKG5mdF90cmFuc19ydWxlX2FkZChjdHgsIE5GVF9NU0dfREVMUlVMRSwgcnVsZSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQluZnRfcnVsZV9kaXNhY3RpdmF0ZV9uZXh0KGN0eC0+bmV0LCBydWxlKTsKKwkJY3R4LT5jaGFpbi0+dXNlLS07CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT0VOVDsKQEAgLTE3NjAsOSArMTg2OSw5IEBACiAJCQkgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gbmxtc2dfZGF0YShubGgpOwotCWNvbnN0IHN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpOworCXN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwotCWNvbnN0IHN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOworCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBuZnRfY2hhaW4gKmNoYWluID0gTlVMTDsKIAlzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGU7CiAJaW50IGZhbWlseSA9IG5mbXNnLT5uZmdlbl9mYW1pbHksIGVyciA9IDA7CkBAIC0xNzc1LDYgKzE4ODQsOCBAQAogCXRhYmxlID0gbmZfdGFibGVzX3RhYmxlX2xvb2t1cChhZmksIG5sYVtORlRBX1JVTEVfVEFCTEVdKTsKIAlpZiAoSVNfRVJSKHRhYmxlKSkKIAkJcmV0dXJuIFBUUl9FUlIodGFibGUpOworCWlmICh0YWJsZS0+ZmxhZ3MgJiBORlRfVEFCTEVfSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKG5sYVtORlRBX1JVTEVfQ0hBSU5dKSB7CiAJCWNoYWluID0gbmZfdGFibGVzX2NoYWluX2xvb2t1cCh0YWJsZSwgbmxhW05GVEFfUlVMRV9DSEFJTl0pOwpAQCAtMTgwNyw4OCArMTkxOCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBuZl90YWJsZXNfY29tbWl0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7Ci0Jc3RydWN0IG5mdF9ydWxlX3RyYW5zICpydXBkLCAqdG1wOwotCi0JLyogQnVtcCBnZW5lcmF0aW9uIGNvdW50ZXIsIGludmFsaWRhdGUgYW55IGR1bXAgaW4gcHJvZ3Jlc3MgKi8KLQluZXQtPm5mdC5nZW5jdHIrKzsKLQotCS8qIEEgbmV3IGdlbmVyYXRpb24gaGFzIGp1c3Qgc3RhcnRlZCAqLwotCW5ldC0+bmZ0LmdlbmN1cnNvciA9IGdlbmN1cnNvcl9uZXh0KG5ldCk7Ci0KLQkvKiBNYWtlIHN1cmUgYWxsIHBhY2tldHMgaGF2ZSBsZWZ0IHRoZSBwcmV2aW91cyBnZW5lcmF0aW9uIGJlZm9yZQotCSAqIHB1cmdpbmcgb2xkIHJ1bGVzLgotCSAqLwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1cGQsIHRtcCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7Ci0JCS8qIFRoaXMgcnVsZSB3YXMgaW5hY3RpdmUgaW4gdGhlIHBhc3QgYW5kIGp1c3QgYmVjYW1lIGFjdGl2ZS4KLQkJICogQ2xlYXIgdGhlIG5leHQgYml0IG9mIHRoZSBnZW5tYXNrIHNpbmNlIGl0cyBtZWFuaW5nIGhhcwotCQkgKiBjaGFuZ2VkLCBub3cgaXQgaXMgdGhlIGZ1dHVyZS4KLQkJICovCi0JCWlmIChuZnRfcnVsZV9pc19hY3RpdmUobmV0LCBydXBkLT5ydWxlKSkgewotCQkJbmZ0X3J1bGVfY2xlYXIobmV0LCBydXBkLT5ydWxlKTsKLQkJCW5mX3RhYmxlc19ydWxlX25vdGlmeShza2IsIHJ1cGQtPmN0eC5ubGgsCi0JCQkJCSAgICAgIHJ1cGQtPmN0eC50YWJsZSwgcnVwZC0+Y3R4LmNoYWluLAotCQkJCQkgICAgICBydXBkLT5ydWxlLCBORlRfTVNHX05FV1JVTEUsIDAsCi0JCQkJCSAgICAgIHJ1cGQtPmN0eC5hZmktPmZhbWlseSk7Ci0JCQlsaXN0X2RlbCgmcnVwZC0+bGlzdCk7Ci0JCQlrZnJlZShydXBkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogVGhpcyBydWxlIGlzIGluIHRoZSBwYXN0LCBnZXQgcmlkIG9mIGl0ICovCi0JCWxpc3RfZGVsX3JjdSgmcnVwZC0+cnVsZS0+bGlzdCk7Ci0JCW5mX3RhYmxlc19ydWxlX25vdGlmeShza2IsIHJ1cGQtPmN0eC5ubGgsCi0JCQkJICAgICAgcnVwZC0+Y3R4LnRhYmxlLCBydXBkLT5jdHguY2hhaW4sCi0JCQkJICAgICAgcnVwZC0+cnVsZSwgTkZUX01TR19ERUxSVUxFLCAwLAotCQkJCSAgICAgIHJ1cGQtPmN0eC5hZmktPmZhbWlseSk7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHdlIGRvbid0IHNlZSBhbnkgcGFja2V0IHRyYXZlcnNpbmcgb2xkIHJ1bGVzICovCi0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQkvKiBOb3cgd2UgY2FuIHNhZmVseSByZWxlYXNlIHVudXNlZCBvbGQgcnVsZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVwZCwgdG1wLCAmbmV0LT5uZnQuY29tbWl0X2xpc3QsIGxpc3QpIHsKLQkJbmZfdGFibGVzX3J1bGVfZGVzdHJveSgmcnVwZC0+Y3R4LCBydXBkLT5ydWxlKTsKLQkJbGlzdF9kZWwoJnJ1cGQtPmxpc3QpOwotCQlrZnJlZShydXBkKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZl90YWJsZXNfYWJvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKLQlzdHJ1Y3QgbmZ0X3J1bGVfdHJhbnMgKnJ1cGQsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVwZCwgdG1wLCAmbmV0LT5uZnQuY29tbWl0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFuZnRfcnVsZV9pc19hY3RpdmVfbmV4dChuZXQsIHJ1cGQtPnJ1bGUpKSB7Ci0JCQluZnRfcnVsZV9jbGVhcihuZXQsIHJ1cGQtPnJ1bGUpOwotCQkJbGlzdF9kZWwoJnJ1cGQtPmxpc3QpOwotCQkJa2ZyZWUocnVwZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFRoaXMgcnVsZSBpcyBpbmFjdGl2ZSwgZ2V0IHJpZCBvZiBpdCAqLwotCQlsaXN0X2RlbF9yY3UoJnJ1cGQtPnJ1bGUtPmxpc3QpOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgYW55IHBhY2tldCBhY2Nlc3NpbmcgYWJvcnRlZCBydWxlcyAqLwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1cGQsIHRtcCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7Ci0JCW5mX3RhYmxlc19ydWxlX2Rlc3Ryb3koJnJ1cGQtPmN0eCwgcnVwZC0+cnVsZSk7Ci0JCWxpc3RfZGVsKCZydXBkLT5saXN0KTsKLQkJa2ZyZWUocnVwZCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBTZXRzCiAgKi8KQEAgLTE5MTIsOSArMTk0MSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3VucmVnaXN0ZXJfc2V0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfc2V0X29wcyAqbmZ0X3NlbGVjdF9zZXRfb3BzKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKKy8qCisgKiBTZWxlY3QgYSBzZXQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIGRhdGEgY2hhcmFjdGVyaXN0aWNzIGFuZCB0aGUKKyAqIGdpdmVuIHBvbGljeS4gVGhlIHRvdGFsIG1lbW9yeSB1c2UgbWlnaHQgbm90IGJlIGtub3duIGlmIG5vIHNpemUgaXMKKyAqIGdpdmVuLCBpbiB0aGF0IGNhc2UgdGhlIGFtb3VudCBvZiBtZW1vcnkgcGVyIGVsZW1lbnQgaXMgdXNlZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfc2V0X29wcyAqCituZnRfc2VsZWN0X3NldF9vcHMoY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdLAorCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAorCQkgICBlbnVtIG5mdF9zZXRfcG9saWNpZXMgcG9saWN5KQogewotCWNvbnN0IHN0cnVjdCBuZnRfc2V0X29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBuZnRfc2V0X29wcyAqb3BzLCAqYm9wczsKKwlzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSBlc3QsIGJlc3Q7CiAJdTMyIGZlYXR1cmVzOwogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKQEAgLTE5MzIsMTUgKzE5NzAsNDUgQEAKIAkJZmVhdHVyZXMgJj0gTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfTUFQOwogCX0KIAotCS8vIEZJWE1FOiBpbXBsZW1lbnQgc2VsZWN0aW9uIHByb3Blcmx5CisJYm9wcwkgICA9IE5VTEw7CisJYmVzdC5zaXplICA9IH4wOworCWJlc3QuY2xhc3MgPSB+MDsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmbmZfdGFibGVzX3NldF9vcHMsIGxpc3QpIHsKIAkJaWYgKChvcHMtPmZlYXR1cmVzICYgZmVhdHVyZXMpICE9IGZlYXR1cmVzKQogCQkJY29udGludWU7CisJCWlmICghb3BzLT5lc3RpbWF0ZShkZXNjLCBmZWF0dXJlcywgJmVzdCkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKHBvbGljeSkgeworCQljYXNlIE5GVF9TRVRfUE9MX1BFUkZPUk1BTkNFOgorCQkJaWYgKGVzdC5jbGFzcyA8IGJlc3QuY2xhc3MpCisJCQkJYnJlYWs7CisJCQlpZiAoZXN0LmNsYXNzID09IGJlc3QuY2xhc3MgJiYgZXN0LnNpemUgPCBiZXN0LnNpemUpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSBORlRfU0VUX1BPTF9NRU1PUlk6CisJCQlpZiAoZXN0LnNpemUgPCBiZXN0LnNpemUpCisJCQkJYnJlYWs7CisJCQlpZiAoZXN0LnNpemUgPT0gYmVzdC5zaXplICYmIGVzdC5jbGFzcyA8IGJlc3QuY2xhc3MpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKIAkJaWYgKCF0cnlfbW9kdWxlX2dldChvcHMtPm93bmVyKSkKIAkJCWNvbnRpbnVlOwotCQlyZXR1cm4gb3BzOworCQlpZiAoYm9wcyAhPSBOVUxMKQorCQkJbW9kdWxlX3B1dChib3BzLT5vd25lcik7CisKKwkJYm9wcyA9IG9wczsKKwkJYmVzdCA9IGVzdDsKIAl9CiAKKwlpZiAoYm9wcyAhPSBOVUxMKQorCQlyZXR1cm4gYm9wczsKKwogCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIH0KIApAQCAtMTk1Myw2ICsyMDIxLDEzIEBACiAJW05GVEFfU0VUX0tFWV9MRU5dCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05GVEFfU0VUX0RBVEFfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkZUQV9TRVRfREFUQV9MRU5dCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfU0VUX1BPTElDWV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZUQV9TRVRfREVTQ10JCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW05GVEFfU0VUX0lEXQkJCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfc2V0X2Rlc2NfcG9saWN5W05GVEFfU0VUX0RFU0NfTUFYICsgMV0gPSB7CisJW05GVEFfU0VUX0RFU0NfU0laRV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIH07CiAKIHN0YXRpYyBpbnQgbmZ0X2N0eF9pbml0X2Zyb21fc2V0YXR0cihzdHJ1Y3QgbmZ0X2N0eCAqY3R4LApAQCAtMTk2Miw4ICsyMDM3LDggQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAljb25zdCBzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gbmxtc2dfZGF0YShubGgpOwotCWNvbnN0IHN0cnVjdCBuZnRfYWZfaW5mbyAqYWZpID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgbmZ0X3RhYmxlICp0YWJsZSA9IE5VTEw7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmkgPSBOVUxMOworCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlID0gTlVMTDsKIAogCWlmIChuZm1zZy0+bmZnZW5fZmFtaWx5ICE9IE5GUFJPVE9fVU5TUEVDKSB7CiAJCWFmaSA9IG5mX3RhYmxlc19hZmluZm9fbG9va3VwKG5ldCwgbmZtc2ctPm5mZ2VuX2ZhbWlseSwgZmFsc2UpOwpAQCAtMTk3OCw2ICsyMDUzLDggQEAKIAkJdGFibGUgPSBuZl90YWJsZXNfdGFibGVfbG9va3VwKGFmaSwgbmxhW05GVEFfU0VUX1RBQkxFXSk7CiAJCWlmIChJU19FUlIodGFibGUpKQogCQkJcmV0dXJuIFBUUl9FUlIodGFibGUpOworCQlpZiAodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0lOQUNUSVZFKQorCQkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJbmZ0X2N0eF9pbml0KGN0eCwgc2tiLCBubGgsIGFmaSwgdGFibGUsIE5VTEwsIG5sYSk7CkBAIC0xOTk5LDEzICsyMDc2LDI3IEBACiAJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiB9CiAKK3N0cnVjdCBuZnRfc2V0ICpuZl90YWJsZXNfc2V0X2xvb2t1cF9ieWlkKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnM7CisJdTMyIGlkID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYSkpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7CisJCWlmICh0cmFucy0+bXNnX3R5cGUgPT0gTkZUX01TR19ORVdTRVQgJiYKKwkJICAgIGlkID09IG5mdF90cmFuc19zZXRfaWQodHJhbnMpKQorCQkJcmV0dXJuIG5mdF90cmFuc19zZXQodHJhbnMpOworCX0KKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKwogc3RhdGljIGludCBuZl90YWJsZXNfc2V0X2FsbG9jX25hbWUoc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3NldCAqaTsKIAljb25zdCBjaGFyICpwOwogCXVuc2lnbmVkIGxvbmcgKmludXNlOwotCXVuc2lnbmVkIGludCBuID0gMDsKKwl1bnNpZ25lZCBpbnQgbiA9IDAsIG1pbiA9IDA7CiAKIAlwID0gc3RybmNocihuYW1lLCBJRk5BTVNJWiwgJyUnKTsKIAlpZiAocCAhPSBOVUxMKSB7CkBAIC0yMDE1LDIzICsyMTA2LDI4IEBACiAJCWludXNlID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmIChpbnVzZSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0KK2NvbnQ6CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmN0eC0+dGFibGUtPnNldHMsIGxpc3QpIHsKIAkJCWludCB0bXA7CiAKIAkJCWlmICghc3NjYW5mKGktPm5hbWUsIG5hbWUsICZ0bXApKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRtcCA8IDAgfHwgdG1wID49IEJJVFNfUEVSX0JZVEUgKiBQQUdFX1NJWkUpCisJCQlpZiAodG1wIDwgbWluIHx8IHRtcCA+PSBtaW4gKyBCSVRTX1BFUl9CWVRFICogUEFHRV9TSVpFKQogCQkJCWNvbnRpbnVlOwogCi0JCQlzZXRfYml0KHRtcCwgaW51c2UpOworCQkJc2V0X2JpdCh0bXAgLSBtaW4sIGludXNlKTsKIAkJfQogCiAJCW4gPSBmaW5kX2ZpcnN0X3plcm9fYml0KGludXNlLCBCSVRTX1BFUl9CWVRFICogUEFHRV9TSVpFKTsKKwkJaWYgKG4gPj0gQklUU19QRVJfQllURSAqIFBBR0VfU0laRSkgeworCQkJbWluICs9IEJJVFNfUEVSX0JZVEUgKiBQQUdFX1NJWkU7CisJCQltZW1zZXQoaW51c2UsIDAsIFBBR0VfU0laRSk7CisJCQlnb3RvIGNvbnQ7CisJCX0KIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWludXNlKTsKIAl9CiAKLQlzbnByaW50ZihzZXQtPm5hbWUsIHNpemVvZihzZXQtPm5hbWUpLCBuYW1lLCBuKTsKKwlzbnByaW50ZihzZXQtPm5hbWUsIHNpemVvZihzZXQtPm5hbWUpLCBuYW1lLCBtaW4gKyBuKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZjdHgtPnRhYmxlLT5zZXRzLCBsaXN0KSB7CiAJCWlmICghc3RyY21wKHNldC0+bmFtZSwgaS0+bmFtZSkpCiAJCQlyZXR1cm4gLUVORklMRTsKQEAgLTIwNDQsOCArMjE0MCw5IEBACiB7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1MzIgcG9ydGlkID0gTkVUTElOS19DQihjdHgtPnNrYikucG9ydGlkOwotCXUzMiBzZXEgPSBjdHgtPm5saC0+bmxtc2dfc2VxOworCXN0cnVjdCBubGF0dHIgKmRlc2M7CisJdTMyIHBvcnRpZCA9IGN0eC0+cG9ydGlkOworCXUzMiBzZXEgPSBjdHgtPnNlcTsKIAogCWV2ZW50IHw9IE5GTkxfU1VCU1lTX05GVEFCTEVTIDw8IDg7CiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSwKQEAgLTIwNzcsNiArMjE3NCwxNCBAQAogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCisJZGVzYyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgTkZUQV9TRVRfREVTQyk7CisJaWYgKGRlc2MgPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHNldC0+c2l6ZSAmJgorCSAgICBubGFfcHV0X2JlMzIoc2tiLCBORlRBX1NFVF9ERVNDX1NJWkUsIGh0b25sKHNldC0+c2l6ZSkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlubGFfbmVzdF9lbmQoc2tiLCBkZXNjKTsKKwogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6CkBAIC0yMDg2LDE5ICsyMTkxLDE4IEBACiAKIHN0YXRpYyBpbnQgbmZfdGFibGVzX3NldF9ub3RpZnkoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCWludCBldmVudCkKKwkJCQlpbnQgZXZlbnQsIGdmcF90IGdmcF9mbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXUzMiBwb3J0aWQgPSBORVRMSU5LX0NCKGN0eC0+c2tiKS5wb3J0aWQ7Ci0JYm9vbCByZXBvcnQ7CisJdTMyIHBvcnRpZCA9IGN0eC0+cG9ydGlkOwogCWludCBlcnI7CiAKLQlyZXBvcnQgPSBubG1zZ19yZXBvcnQoY3R4LT5ubGgpOwotCWlmICghcmVwb3J0ICYmICFuZm5ldGxpbmtfaGFzX2xpc3RlbmVycyhjdHgtPm5ldCwgTkZOTEdSUF9ORlRBQkxFUykpCisJaWYgKCFjdHgtPnJlcG9ydCAmJgorCSAgICAhbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMoY3R4LT5uZXQsIE5GTkxHUlBfTkZUQUJMRVMpKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IC1FTk9CVUZTOwotCXNrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBnZnBfZmxhZ3MpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnI7CiAKQEAgLTIxMDgsOCArMjIxMiw4IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWVyciA9IG5mbmV0bGlua19zZW5kKHNrYiwgY3R4LT5uZXQsIHBvcnRpZCwgTkZOTEdSUF9ORlRBQkxFUywgcmVwb3J0LAotCQkJICAgICBHRlBfS0VSTkVMKTsKKwllcnIgPSBuZm5ldGxpbmtfc2VuZChza2IsIGN0eC0+bmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsCisJCQkgICAgIGN0eC0+cmVwb3J0LCBnZnBfZmxhZ3MpOwogZXJyOgogCWlmIChlcnIgPCAwKQogCQluZm5ldGxpbmtfc2V0X2VycihjdHgtPm5ldCwgcG9ydGlkLCBORk5MR1JQX05GVEFCTEVTLCBlcnIpOwpAQCAtMjE4Myw3ICsyMjg3LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0OwogCXVuc2lnbmVkIGludCBpZHgsIHNfaWR4ID0gY2ItPmFyZ3NbMF07Ci0JY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CiAJc3RydWN0IG5mdF90YWJsZSAqdGFibGUsICpjdXJfdGFibGUgPSAoc3RydWN0IG5mdF90YWJsZSAqKWNiLT5hcmdzWzJdOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCWludCBjdXJfZmFtaWx5ID0gY2ItPmFyZ3NbM107CkBAIC0yMjYwLDYgKzIzNjQsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgTkZUX1NFVF9JTkFDVElWRQkoMSA8PCAxNSkJLyogSW50ZXJuYWwgc2V0IGZsYWcgKi8KKwogc3RhdGljIGludCBuZl90YWJsZXNfZ2V0c2V0KHN0cnVjdCBzb2NrICpubHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAogCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKQEAgLTIyODksNiArMjM5NSw4IEBACiAJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXAoY3R4LnRhYmxlLCBubGFbTkZUQV9TRVRfTkFNRV0pOwogCWlmIChJU19FUlIoc2V0KSkKIAkJcmV0dXJuIFBUUl9FUlIoc2V0KTsKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOwogCiAJc2tiMiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNrYjIgPT0gTlVMTCkKQEAgLTIzMDUsMTMgKzI0MTMsNTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG5mX3RhYmxlc19zZXRfZGVzY19wYXJzZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJCSAgICBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJc3RydWN0IG5sYXR0ciAqZGFbTkZUQV9TRVRfREVTQ19NQVggKyAxXTsKKwlpbnQgZXJyOworCisJZXJyID0gbmxhX3BhcnNlX25lc3RlZChkYSwgTkZUQV9TRVRfREVTQ19NQVgsIG5sYSwgbmZ0X3NldF9kZXNjX3BvbGljeSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoZGFbTkZUQV9TRVRfREVTQ19TSVpFXSAhPSBOVUxMKQorCQlkZXNjLT5zaXplID0gbnRvaGwobmxhX2dldF9iZTMyKGRhW05GVEFfU0VUX0RFU0NfU0laRV0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5mdF90cmFuc19zZXRfYWRkKHN0cnVjdCBuZnRfY3R4ICpjdHgsIGludCBtc2dfdHlwZSwKKwkJCSAgICAgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFuczsKKworCXRyYW5zID0gbmZ0X3RyYW5zX2FsbG9jKGN0eCwgbXNnX3R5cGUsIHNpemVvZihzdHJ1Y3QgbmZ0X3RyYW5zX3NldCkpOworCWlmICh0cmFucyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtc2dfdHlwZSA9PSBORlRfTVNHX05FV1NFVCAmJiBjdHgtPm5sYVtORlRBX1NFVF9JRF0gIT0gTlVMTCkgeworCQluZnRfdHJhbnNfc2V0X2lkKHRyYW5zKSA9CisJCQludG9obChubGFfZ2V0X2JlMzIoY3R4LT5ubGFbTkZUQV9TRVRfSURdKSk7CisJCXNldC0+ZmxhZ3MgfD0gTkZUX1NFVF9JTkFDVElWRTsKKwl9CisJbmZ0X3RyYW5zX3NldCh0cmFucykgPSBzZXQ7CisJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmxpc3QsICZjdHgtPm5ldC0+bmZ0LmNvbW1pdF9saXN0KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG5mX3RhYmxlc19uZXdzZXQoc3RydWN0IHNvY2sgKm5sc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQogewogCWNvbnN0IHN0cnVjdCBuZmdlbm1zZyAqbmZtc2cgPSBubG1zZ19kYXRhKG5saCk7CiAJY29uc3Qgc3RydWN0IG5mdF9zZXRfb3BzICpvcHM7Ci0JY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJc3RydWN0IG5mdF90YWJsZSAqdGFibGU7CiAJc3RydWN0IG5mdF9zZXQgKnNldDsKQEAgLTIzMTksMTQgKzI0NjQsMTggQEAKIAljaGFyIG5hbWVbSUZOQU1TSVpdOwogCXVuc2lnbmVkIGludCBzaXplOwogCWJvb2wgY3JlYXRlOwotCXUzMiBrdHlwZSwga2xlbiwgZGxlbiwgZHR5cGUsIGZsYWdzOworCXUzMiBrdHlwZSwgZHR5cGUsIGZsYWdzLCBwb2xpY3k7CisJc3RydWN0IG5mdF9zZXRfZGVzYyBkZXNjOwogCWludCBlcnI7CiAKIAlpZiAobmxhW05GVEFfU0VUX1RBQkxFXSA9PSBOVUxMIHx8CiAJICAgIG5sYVtORlRBX1NFVF9OQU1FXSA9PSBOVUxMIHx8Ci0JICAgIG5sYVtORlRBX1NFVF9LRVlfTEVOXSA9PSBOVUxMKQorCSAgICBubGFbTkZUQV9TRVRfS0VZX0xFTl0gPT0gTlVMTCB8fAorCSAgICBubGFbTkZUQV9TRVRfSURdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCiAJa3R5cGUgPSBORlRfREFUQV9WQUxVRTsKIAlpZiAobmxhW05GVEFfU0VUX0tFWV9UWVBFXSAhPSBOVUxMKSB7CiAJCWt0eXBlID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9LRVlfVFlQRV0pKTsKQEAgLTIzMzQsOCArMjQ4Myw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlrbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9LRVlfTEVOXSkpOwotCWlmIChrbGVuID09IDAgfHwga2xlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQorCWRlc2Mua2xlbiA9IG50b2hsKG5sYV9nZXRfYmUzMihubGFbTkZUQV9TRVRfS0VZX0xFTl0pKTsKKwlpZiAoZGVzYy5rbGVuID09IDAgfHwgZGVzYy5rbGVuID4gRklFTERfU0laRU9GKHN0cnVjdCBuZnRfZGF0YSwgZGF0YSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZmxhZ3MgPSAwOwpAQCAtMjM0Nyw3ICsyNDk2LDYgQEAKIAl9CiAKIAlkdHlwZSA9IDA7Ci0JZGxlbiAgPSAwOwogCWlmIChubGFbTkZUQV9TRVRfREFUQV9UWVBFXSAhPSBOVUxMKSB7CiAJCWlmICghKGZsYWdzICYgTkZUX1NFVF9NQVApKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzYwLDE1ICsyNTA4LDI1IEBACiAJCWlmIChkdHlwZSAhPSBORlRfREFUQV9WRVJESUNUKSB7CiAJCQlpZiAobmxhW05GVEFfU0VUX0RBVEFfTEVOXSA9PSBOVUxMKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJZGxlbiA9IG50b2hsKG5sYV9nZXRfYmUzMihubGFbTkZUQV9TRVRfREFUQV9MRU5dKSk7Ci0JCQlpZiAoZGxlbiA9PSAwIHx8Ci0JCQkgICAgZGxlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQorCQkJZGVzYy5kbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9EQVRBX0xFTl0pKTsKKwkJCWlmIChkZXNjLmRsZW4gPT0gMCB8fAorCQkJICAgIGRlc2MuZGxlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UKLQkJCWRsZW4gPSBzaXplb2Yoc3RydWN0IG5mdF9kYXRhKTsKKwkJCWRlc2MuZGxlbiA9IHNpemVvZihzdHJ1Y3QgbmZ0X2RhdGEpOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBORlRfU0VUX01BUCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlwb2xpY3kgPSBORlRfU0VUX1BPTF9QRVJGT1JNQU5DRTsKKwlpZiAobmxhW05GVEFfU0VUX1BPTElDWV0gIT0gTlVMTCkKKwkJcG9saWN5ID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9QT0xJQ1ldKSk7CisKKwlpZiAobmxhW05GVEFfU0VUX0RFU0NdICE9IE5VTEwpIHsKKwkJZXJyID0gbmZfdGFibGVzX3NldF9kZXNjX3BhcnNlKCZjdHgsICZkZXNjLCBubGFbTkZUQV9TRVRfREVTQ10pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCiAJY3JlYXRlID0gbmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0NSRUFURSA/IHRydWUgOiBmYWxzZTsKIAogCWFmaSA9IG5mX3RhYmxlc19hZmluZm9fbG9va3VwKG5ldCwgbmZtc2ctPm5mZ2VuX2ZhbWlseSwgY3JlYXRlKTsKQEAgLTIzOTksNyArMjU1Nyw3IEBACiAJaWYgKCEobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0NSRUFURSkpCiAJCXJldHVybiAtRU5PRU5UOwogCi0Jb3BzID0gbmZ0X3NlbGVjdF9zZXRfb3BzKG5sYSk7CisJb3BzID0gbmZ0X3NlbGVjdF9zZXRfb3BzKG5sYSwgJmRlc2MsIHBvbGljeSk7CiAJaWYgKElTX0VSUihvcHMpKQogCQlyZXR1cm4gUFRSX0VSUihvcHMpOwogCkBAIC0yNDIwLDE3ICsyNTc4LDIyIEBACiAJSU5JVF9MSVNUX0hFQUQoJnNldC0+YmluZGluZ3MpOwogCXNldC0+b3BzICAgPSBvcHM7CiAJc2V0LT5rdHlwZSA9IGt0eXBlOwotCXNldC0+a2xlbiAgPSBrbGVuOworCXNldC0+a2xlbiAgPSBkZXNjLmtsZW47CiAJc2V0LT5kdHlwZSA9IGR0eXBlOwotCXNldC0+ZGxlbiAgPSBkbGVuOworCXNldC0+ZGxlbiAgPSBkZXNjLmRsZW47CiAJc2V0LT5mbGFncyA9IGZsYWdzOworCXNldC0+c2l6ZSAgPSBkZXNjLnNpemU7CiAKLQllcnIgPSBvcHMtPmluaXQoc2V0LCBubGEpOworCWVyciA9IG9wcy0+aW5pdChzZXQsICZkZXNjLCBubGEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKKwllcnIgPSBuZnRfdHJhbnNfc2V0X2FkZCgmY3R4LCBORlRfTVNHX05FV1NFVCwgc2V0KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnIyOwogCiAJbGlzdF9hZGRfdGFpbCgmc2V0LT5saXN0LCAmdGFibGUtPnNldHMpOwotCW5mX3RhYmxlc19zZXRfbm90aWZ5KCZjdHgsIHNldCwgTkZUX01TR19ORVdTRVQpOworCXRhYmxlLT51c2UrKzsKIAlyZXR1cm4gMDsKIAogZXJyMjoKQEAgLTI0NDAsMTYgKzI2MDMsMjAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBuZl90YWJsZXNfc2V0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCkKK3N0YXRpYyB2b2lkIG5mdF9zZXRfZGVzdHJveShzdHJ1Y3QgbmZ0X3NldCAqc2V0KQogewotCWxpc3RfZGVsKCZzZXQtPmxpc3QpOwotCW5mX3RhYmxlc19zZXRfbm90aWZ5KGN0eCwgc2V0LCBORlRfTVNHX0RFTFNFVCk7Ci0KIAlzZXQtPm9wcy0+ZGVzdHJveShzZXQpOwogCW1vZHVsZV9wdXQoc2V0LT5vcHMtPm93bmVyKTsKIAlrZnJlZShzZXQpOwogfQogCitzdGF0aWMgdm9pZCBuZl90YWJsZXNfc2V0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlsaXN0X2RlbCgmc2V0LT5saXN0KTsKKwluZl90YWJsZXNfc2V0X25vdGlmeShjdHgsIHNldCwgTkZUX01TR19ERUxTRVQsIEdGUF9BVE9NSUMpOworCW5mdF9zZXRfZGVzdHJveShzZXQpOworfQorCiBzdGF0aWMgaW50IG5mX3RhYmxlc19kZWxzZXQoc3RydWN0IHNvY2sgKm5sc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQpAQCAtMjQ3MSwxMCArMjYzOCwxNyBAQAogCXNldCA9IG5mX3RhYmxlc19zZXRfbG9va3VwKGN0eC50YWJsZSwgbmxhW05GVEFfU0VUX05BTUVdKTsKIAlpZiAoSVNfRVJSKHNldCkpCiAJCXJldHVybiBQVFJfRVJSKHNldCk7CisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVOT0VOVDsKIAlpZiAoIWxpc3RfZW1wdHkoJnNldC0+YmluZGluZ3MpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbmZfdGFibGVzX3NldF9kZXN0cm95KCZjdHgsIHNldCk7CisJZXJyID0gbmZ0X3RyYW5zX3NldF9hZGQoJmN0eCwgTkZUX01TR19ERUxTRVQsIHNldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlsaXN0X2RlbCgmc2V0LT5saXN0KTsKKwljdHgudGFibGUtPnVzZS0tOwogCXJldHVybiAwOwogfQogCkBAIC0yNTM0LDcgKzI3MDgsOCBAQAogewogCWxpc3RfZGVsKCZiaW5kaW5nLT5saXN0KTsKIAotCWlmIChsaXN0X2VtcHR5KCZzZXQtPmJpbmRpbmdzKSAmJiBzZXQtPmZsYWdzICYgTkZUX1NFVF9BTk9OWU1PVVMpCisJaWYgKGxpc3RfZW1wdHkoJnNldC0+YmluZGluZ3MpICYmIHNldC0+ZmxhZ3MgJiBORlRfU0VUX0FOT05ZTU9VUyAmJgorCSAgICAhKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0lOQUNUSVZFKSkKIAkJbmZfdGFibGVzX3NldF9kZXN0cm95KGN0eCwgc2V0KTsKIH0KIApAQCAtMjU1MiwxNiArMjcyNywxOCBAQAogCVtORlRBX1NFVF9FTEVNX0xJU1RfVEFCTEVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcgfSwKIAlbTkZUQV9TRVRfRUxFTV9MSVNUX1NFVF0JPSB7IC50eXBlID0gTkxBX1NUUklORyB9LAogCVtORlRBX1NFVF9FTEVNX0xJU1RfRUxFTUVOVFNdCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbTkZUQV9TRVRfRUxFTV9MSVNUX1NFVF9JRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBuZnRfY3R4X2luaXRfZnJvbV9lbGVtYXR0cihzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSwKKwkJCQkgICAgICBib29sIHRyYW5zKQogewogCWNvbnN0IHN0cnVjdCBuZmdlbm1zZyAqbmZtc2cgPSBubG1zZ19kYXRhKG5saCk7Ci0JY29uc3Qgc3RydWN0IG5mdF9hZl9pbmZvICphZmk7Ci0JY29uc3Qgc3RydWN0IG5mdF90YWJsZSAqdGFibGU7CisJc3RydWN0IG5mdF9hZl9pbmZvICphZmk7CisJc3RydWN0IG5mdF90YWJsZSAqdGFibGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAKIAlhZmkgPSBuZl90YWJsZXNfYWZpbmZvX2xvb2t1cChuZXQsIG5mbXNnLT5uZmdlbl9mYW1pbHksIGZhbHNlKTsKQEAgLTI1NzEsNiArMjc0OCw4IEBACiAJdGFibGUgPSBuZl90YWJsZXNfdGFibGVfbG9va3VwKGFmaSwgbmxhW05GVEFfU0VUX0VMRU1fTElTVF9UQUJMRV0pOwogCWlmIChJU19FUlIodGFibGUpKQogCQlyZXR1cm4gUFRSX0VSUih0YWJsZSk7CisJaWYgKCF0cmFucyAmJiAodGFibGUtPmZsYWdzICYgTkZUX1RBQkxFX0lOQUNUSVZFKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAluZnRfY3R4X2luaXQoY3R4LCBza2IsIG5saCwgYWZpLCB0YWJsZSwgTlVMTCwgbmxhKTsKIAlyZXR1cm4gMDsKQEAgLTI2NDQsMTMgKzI4MjMsMTYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG5mdF9jdHhfaW5pdF9mcm9tX2VsZW1hdHRyKCZjdHgsIGNiLT5za2IsIGNiLT5ubGgsICh2b2lkICopbmxhKTsKKwllcnIgPSBuZnRfY3R4X2luaXRfZnJvbV9lbGVtYXR0cigmY3R4LCBjYi0+c2tiLCBjYi0+bmxoLCAodm9pZCAqKW5sYSwKKwkJCQkJIGZhbHNlKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNldCA9IG5mX3RhYmxlc19zZXRfbG9va3VwKGN0eC50YWJsZSwgbmxhW05GVEFfU0VUX0VMRU1fTElTVF9TRVRdKTsKIAlpZiAoSVNfRVJSKHNldCkpCiAJCXJldHVybiBQVFJfRVJSKHNldCk7CisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWV2ZW50ICA9IE5GVF9NU0dfTkVXU0VURUxFTTsKIAlldmVudCB8PSBORk5MX1NVQlNZU19ORlRBQkxFUyA8PCA4OwpAQCAtMjcwNywxMyArMjg4OSwxNSBAQAogCXN0cnVjdCBuZnRfY3R4IGN0eDsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSk7CisJZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSwgZmFsc2UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXAoY3R4LnRhYmxlLCBubGFbTkZUQV9TRVRfRUxFTV9MSVNUX1NFVF0pOwogCWlmIChJU19FUlIoc2V0KSkKIAkJcmV0dXJuIFBUUl9FUlIoc2V0KTsKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfSU5BQ1RJVkUpCisJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CiAJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewpAQCAtMjcyNCw3ICsyOTA4LDk4IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCi1zdGF0aWMgaW50IG5mdF9hZGRfc2V0X2VsZW0oY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKK3N0YXRpYyBpbnQgbmZfdGFibGVzX2ZpbGxfc2V0ZWxlbV9pbmZvKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHUzMiBzZXEsCisJCQkJICAgICAgIHUzMiBwb3J0aWQsIGludCBldmVudCwgdTE2IGZsYWdzLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKwlpbnQgZXJyOworCisJZXZlbnQgfD0gTkZOTF9TVUJTWVNfTkZUQUJMRVMgPDwgODsKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpLAorCQkJZmxhZ3MpOworCWlmIChubGggPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwluZm1zZyA9IG5sbXNnX2RhdGEobmxoKTsKKwluZm1zZy0+bmZnZW5fZmFtaWx5CT0gY3R4LT5hZmktPmZhbWlseTsKKwluZm1zZy0+dmVyc2lvbgkJPSBORk5FVExJTktfVjA7CisJbmZtc2ctPnJlc19pZAkJPSAwOworCisJaWYgKG5sYV9wdXRfc3RyaW5nKHNrYiwgTkZUQV9TRVRfVEFCTEUsIGN0eC0+dGFibGUtPm5hbWUpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9zdHJpbmcoc2tiLCBORlRBX1NFVF9OQU1FLCBzZXQtPm5hbWUpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIE5GVEFfU0VUX0VMRU1fTElTVF9FTEVNRU5UUyk7CisJaWYgKG5lc3QgPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwllcnIgPSBuZl90YWJsZXNfZmlsbF9zZXRlbGVtKHNrYiwgc2V0LCBlbGVtKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKKworCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfdHJpbShza2IsIG5saCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG5mX3RhYmxlc19zZXRlbGVtX25vdGlmeShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtLAorCQkJCSAgICBpbnQgZXZlbnQsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBjdHgtPm5ldDsKKwl1MzIgcG9ydGlkID0gY3R4LT5wb3J0aWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJaWYgKCFjdHgtPnJlcG9ydCAmJiAhbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMobmV0LCBORk5MR1JQX05GVEFCTEVTKSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwllcnIgPSBuZl90YWJsZXNfZmlsbF9zZXRlbGVtX2luZm8oc2tiLCBjdHgsIDAsIHBvcnRpZCwgZXZlbnQsIGZsYWdzLAorCQkJCQkgIHNldCwgZWxlbSk7CisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyOworCX0KKworCWVyciA9IG5mbmV0bGlua19zZW5kKHNrYiwgbmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIGN0eC0+cmVwb3J0LAorCQkJICAgICBHRlBfS0VSTkVMKTsKK2VycjoKKwlpZiAoZXJyIDwgMCkKKwkJbmZuZXRsaW5rX3NldF9lcnIobmV0LCBwb3J0aWQsIE5GTkxHUlBfTkZUQUJMRVMsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfdHJhbnMgKm5mdF90cmFuc19lbGVtX2FsbG9jKHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkJCSAgICAgIGludCBtc2dfdHlwZSwKKwkJCQkJICAgICAgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFuczsKKworCXRyYW5zID0gbmZ0X3RyYW5zX2FsbG9jKGN0eCwgbXNnX3R5cGUsIHNpemVvZihzdHJ1Y3QgbmZ0X3RyYW5zX2VsZW0pKTsKKwlpZiAodHJhbnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZnRfdHJhbnNfZWxlbV9zZXQodHJhbnMpID0gc2V0OworCXJldHVybiB0cmFuczsKK30KKworc3RhdGljIGludCBuZnRfYWRkX3NldF9lbGVtKHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfc2V0ICpzZXQsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbmxhdHRyICpubGFbTkZUQV9TRVRfRUxFTV9NQVggKyAxXTsKQEAgLTI3MzIsOCArMzAwNywxMiBAQAogCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKIAlzdHJ1Y3QgbmZ0X3NldF9iaW5kaW5nICpiaW5kaW5nOwogCWVudW0gbmZ0X3JlZ2lzdGVycyBkcmVnOworCXN0cnVjdCBuZnRfdHJhbnMgKnRyYW5zOwogCWludCBlcnI7CiAKKwlpZiAoc2V0LT5zaXplICYmIHNldC0+bmVsZW1zID09IHNldC0+c2l6ZSkKKwkJcmV0dXJuIC1FTkZJTEU7CisKIAllcnIgPSBubGFfcGFyc2VfbmVzdGVkKG5sYSwgTkZUQV9TRVRfRUxFTV9NQVgsIGF0dHIsCiAJCQkgICAgICAgbmZ0X3NldF9lbGVtX3BvbGljeSk7CiAJaWYgKGVyciA8IDApCkBAIC0yNzg2LDcgKzMwNjUsNyBAQAogCQkJc3RydWN0IG5mdF9jdHggYmluZF9jdHggPSB7CiAJCQkJLmFmaQk9IGN0eC0+YWZpLAogCQkJCS50YWJsZQk9IGN0eC0+dGFibGUsCi0JCQkJLmNoYWluCT0gYmluZGluZy0+Y2hhaW4sCisJCQkJLmNoYWluCT0gKHN0cnVjdCBuZnRfY2hhaW4gKiliaW5kaW5nLT5jaGFpbiwKIAkJCX07CiAKIAkJCWVyciA9IG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoJmJpbmRfY3R4LCBkcmVnLApAQCAtMjc5NiwxMiArMzA3NSwyMCBAQAogCQl9CiAJfQogCi0JZXJyID0gc2V0LT5vcHMtPmluc2VydChzZXQsICZlbGVtKTsKLQlpZiAoZXJyIDwgMCkKKwl0cmFucyA9IG5mdF90cmFuc19lbGVtX2FsbG9jKGN0eCwgTkZUX01TR19ORVdTRVRFTEVNLCBzZXQpOworCWlmICh0cmFucyA9PSBOVUxMKQogCQlnb3RvIGVycjM7CiAKKwllcnIgPSBzZXQtPm9wcy0+aW5zZXJ0KHNldCwgJmVsZW0pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjQ7CisKKwluZnRfdHJhbnNfZWxlbSh0cmFucykgPSBlbGVtOworCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5saXN0LCAmY3R4LT5uZXQtPm5mdC5jb21taXRfbGlzdCk7CiAJcmV0dXJuIDA7CiAKK2VycjQ6CisJa2ZyZWUodHJhbnMpOwogZXJyMzoKIAlpZiAobmxhW05GVEFfU0VUX0VMRU1fREFUQV0gIT0gTlVMTCkKIAkJbmZ0X2RhdGFfdW5pbml0KCZlbGVtLmRhdGEsIGQyLnR5cGUpOwpAQCAtMjgxNSwzNSArMzEwMiw0NiBAQAogCQkJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAogCQkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAljb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyOwogCXN0cnVjdCBuZnRfc2V0ICpzZXQ7CiAJc3RydWN0IG5mdF9jdHggY3R4OwotCWludCByZW0sIGVycjsKKwlpbnQgcmVtLCBlcnIgPSAwOwogCi0JZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSk7CisJZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSwgdHJ1ZSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlzZXQgPSBuZl90YWJsZXNfc2V0X2xvb2t1cChjdHgudGFibGUsIG5sYVtORlRBX1NFVF9FTEVNX0xJU1RfU0VUXSk7Ci0JaWYgKElTX0VSUihzZXQpKQotCQlyZXR1cm4gUFRSX0VSUihzZXQpOworCWlmIChJU19FUlIoc2V0KSkgeworCQlpZiAobmxhW05GVEFfU0VUX0VMRU1fTElTVF9TRVRfSURdKSB7CisJCQlzZXQgPSBuZl90YWJsZXNfc2V0X2xvb2t1cF9ieWlkKG5ldCwKKwkJCQkJbmxhW05GVEFfU0VUX0VMRU1fTElTVF9TRVRfSURdKTsKKwkJfQorCQlpZiAoSVNfRVJSKHNldCkpCisJCQlyZXR1cm4gUFRSX0VSUihzZXQpOworCX0KKwogCWlmICghbGlzdF9lbXB0eSgmc2V0LT5iaW5kaW5ncykgJiYgc2V0LT5mbGFncyAmIE5GVF9TRVRfQ09OU1RBTlQpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIG5sYVtORlRBX1NFVF9FTEVNX0xJU1RfRUxFTUVOVFNdLCByZW0pIHsKIAkJZXJyID0gbmZ0X2FkZF9zZXRfZWxlbSgmY3R4LCBzZXQsIGF0dHIpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKKworCQlzZXQtPm5lbGVtcysrOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG5mdF9kZWxfc2V0ZWxlbShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorc3RhdGljIGludCBuZnRfZGVsX3NldGVsZW0oc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCiB7CiAJc3RydWN0IG5sYXR0ciAqbmxhW05GVEFfU0VUX0VMRU1fTUFYICsgMV07CiAJc3RydWN0IG5mdF9kYXRhX2Rlc2MgZGVzYzsKIAlzdHJ1Y3QgbmZ0X3NldF9lbGVtIGVsZW07CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnM7CiAJaW50IGVycjsKIAogCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQobmxhLCBORlRBX1NFVF9FTEVNX01BWCwgYXR0ciwKQEAgLTI4NjcsNyArMzE2NSwxMiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjI7CiAKLQlzZXQtPm9wcy0+cmVtb3ZlKHNldCwgJmVsZW0pOworCXRyYW5zID0gbmZ0X3RyYW5zX2VsZW1fYWxsb2MoY3R4LCBORlRfTVNHX0RFTFNFVEVMRU0sIHNldCk7CisJaWYgKHRyYW5zID09IE5VTEwpCisJCWdvdG8gZXJyMjsKKworCW5mdF90cmFuc19lbGVtKHRyYW5zKSA9IGVsZW07CisJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmxpc3QsICZjdHgtPm5ldC0+bmZ0LmNvbW1pdF9saXN0KTsKIAogCW5mdF9kYXRhX3VuaW5pdCgmZWxlbS5rZXksIE5GVF9EQVRBX1ZBTFVFKTsKIAlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQpAQCAtMjg4Niw5ICszMTg5LDkgQEAKIAljb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyOwogCXN0cnVjdCBuZnRfc2V0ICpzZXQ7CiAJc3RydWN0IG5mdF9jdHggY3R4OwotCWludCByZW0sIGVycjsKKwlpbnQgcmVtLCBlcnIgPSAwOwogCi0JZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSk7CisJZXJyID0gbmZ0X2N0eF9pbml0X2Zyb21fZWxlbWF0dHIoJmN0eCwgc2tiLCBubGgsIG5sYSwgZmFsc2UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yOTAxLDE0ICszMjA0LDE2IEBACiAJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBubGFbTkZUQV9TRVRfRUxFTV9MSVNUX0VMRU1FTlRTXSwgcmVtKSB7CiAJCWVyciA9IG5mdF9kZWxfc2V0ZWxlbSgmY3R4LCBzZXQsIGF0dHIpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKKworCQlzZXQtPm5lbGVtcy0tOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mbmxfY2FsbGJhY2sgbmZfdGFibGVzX2NiW05GVF9NU0dfTUFYXSA9IHsKIAlbTkZUX01TR19ORVdUQUJMRV0gPSB7Ci0JCS5jYWxsCQk9IG5mX3RhYmxlc19uZXd0YWJsZSwKKwkJLmNhbGxfYmF0Y2gJPSBuZl90YWJsZXNfbmV3dGFibGUsCiAJCS5hdHRyX2NvdW50CT0gTkZUQV9UQUJMRV9NQVgsCiAJCS5wb2xpY3kJCT0gbmZ0X3RhYmxlX3BvbGljeSwKIAl9LApAQCAtMjkxOCwxMiArMzIyMywxMiBAQAogCQkucG9saWN5CQk9IG5mdF90YWJsZV9wb2xpY3ksCiAJfSwKIAlbTkZUX01TR19ERUxUQUJMRV0gPSB7Ci0JCS5jYWxsCQk9IG5mX3RhYmxlc19kZWx0YWJsZSwKKwkJLmNhbGxfYmF0Y2gJPSBuZl90YWJsZXNfZGVsdGFibGUsCiAJCS5hdHRyX2NvdW50CT0gTkZUQV9UQUJMRV9NQVgsCiAJCS5wb2xpY3kJCT0gbmZ0X3RhYmxlX3BvbGljeSwKIAl9LAogCVtORlRfTVNHX05FV0NIQUlOXSA9IHsKLQkJLmNhbGwJCT0gbmZfdGFibGVzX25ld2NoYWluLAorCQkuY2FsbF9iYXRjaAk9IG5mX3RhYmxlc19uZXdjaGFpbiwKIAkJLmF0dHJfY291bnQJPSBORlRBX0NIQUlOX01BWCwKIAkJLnBvbGljeQkJPSBuZnRfY2hhaW5fcG9saWN5LAogCX0sCkBAIC0yOTMzLDcgKzMyMzgsNyBAQAogCQkucG9saWN5CQk9IG5mdF9jaGFpbl9wb2xpY3ksCiAJfSwKIAlbTkZUX01TR19ERUxDSEFJTl0gPSB7Ci0JCS5jYWxsCQk9IG5mX3RhYmxlc19kZWxjaGFpbiwKKwkJLmNhbGxfYmF0Y2gJPSBuZl90YWJsZXNfZGVsY2hhaW4sCiAJCS5hdHRyX2NvdW50CT0gTkZUQV9DSEFJTl9NQVgsCiAJCS5wb2xpY3kJCT0gbmZ0X2NoYWluX3BvbGljeSwKIAl9LApAQCAtMjk1Myw3ICszMjU4LDcgQEAKIAkJLnBvbGljeQkJPSBuZnRfcnVsZV9wb2xpY3ksCiAJfSwKIAlbTkZUX01TR19ORVdTRVRdID0gewotCQkuY2FsbAkJPSBuZl90YWJsZXNfbmV3c2V0LAorCQkuY2FsbF9iYXRjaAk9IG5mX3RhYmxlc19uZXdzZXQsCiAJCS5hdHRyX2NvdW50CT0gTkZUQV9TRVRfTUFYLAogCQkucG9saWN5CQk9IG5mdF9zZXRfcG9saWN5LAogCX0sCkBAIC0yOTYzLDEyICszMjY4LDEyIEBACiAJCS5wb2xpY3kJCT0gbmZ0X3NldF9wb2xpY3ksCiAJfSwKIAlbTkZUX01TR19ERUxTRVRdID0gewotCQkuY2FsbAkJPSBuZl90YWJsZXNfZGVsc2V0LAorCQkuY2FsbF9iYXRjaAk9IG5mX3RhYmxlc19kZWxzZXQsCiAJCS5hdHRyX2NvdW50CT0gTkZUQV9TRVRfTUFYLAogCQkucG9saWN5CQk9IG5mdF9zZXRfcG9saWN5LAogCX0sCiAJW05GVF9NU0dfTkVXU0VURUxFTV0gPSB7Ci0JCS5jYWxsCQk9IG5mX3RhYmxlc19uZXdzZXRlbGVtLAorCQkuY2FsbF9iYXRjaAk9IG5mX3RhYmxlc19uZXdzZXRlbGVtLAogCQkuYXR0cl9jb3VudAk9IE5GVEFfU0VUX0VMRU1fTElTVF9NQVgsCiAJCS5wb2xpY3kJCT0gbmZ0X3NldF9lbGVtX2xpc3RfcG9saWN5LAogCX0sCkBAIC0yOTc4LDEyICszMjgzLDI4MiBAQAogCQkucG9saWN5CQk9IG5mdF9zZXRfZWxlbV9saXN0X3BvbGljeSwKIAl9LAogCVtORlRfTVNHX0RFTFNFVEVMRU1dID0gewotCQkuY2FsbAkJPSBuZl90YWJsZXNfZGVsc2V0ZWxlbSwKKwkJLmNhbGxfYmF0Y2gJPSBuZl90YWJsZXNfZGVsc2V0ZWxlbSwKIAkJLmF0dHJfY291bnQJPSBORlRBX1NFVF9FTEVNX0xJU1RfTUFYLAogCQkucG9saWN5CQk9IG5mdF9zZXRfZWxlbV9saXN0X3BvbGljeSwKIAl9LAogfTsKIAorc3RhdGljIHZvaWQgbmZ0X2NoYWluX2NvbW1pdF91cGRhdGUoc3RydWN0IG5mdF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IG5mdF9iYXNlX2NoYWluICpiYXNlY2hhaW47CisKKwlpZiAobmZ0X3RyYW5zX2NoYWluX25hbWUodHJhbnMpWzBdKQorCQlzdHJjcHkodHJhbnMtPmN0eC5jaGFpbi0+bmFtZSwgbmZ0X3RyYW5zX2NoYWluX25hbWUodHJhbnMpKTsKKworCWlmICghKHRyYW5zLT5jdHguY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pKQorCQlyZXR1cm47CisKKwliYXNlY2hhaW4gPSBuZnRfYmFzZV9jaGFpbih0cmFucy0+Y3R4LmNoYWluKTsKKwluZnRfY2hhaW5fc3RhdHNfcmVwbGFjZShiYXNlY2hhaW4sIG5mdF90cmFuc19jaGFpbl9zdGF0cyh0cmFucykpOworCisJc3dpdGNoIChuZnRfdHJhbnNfY2hhaW5fcG9saWN5KHRyYW5zKSkgeworCWNhc2UgTkZfRFJPUDoKKwljYXNlIE5GX0FDQ0VQVDoKKwkJYmFzZWNoYWluLT5wb2xpY3kgPSBuZnRfdHJhbnNfY2hhaW5fcG9saWN5KHRyYW5zKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBTY2hlZHVsZSBvYmplY3RzIGZvciByZWxlYXNlIHZpYSByY3UgdG8gbWFrZSBzdXJlIG5vIHBhY2tldHMgYXJlIGFjY2VzaW5nCisgKiByZW1vdmVkIHJ1bGVzLgorICovCitzdGF0aWMgdm9pZCBuZl90YWJsZXNfY29tbWl0X3JlbGVhc2VfcmN1KHN0cnVjdCByY3VfaGVhZCAqcnQpCit7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnMgPSBjb250YWluZXJfb2YocnQsIHN0cnVjdCBuZnRfdHJhbnMsIHJjdV9oZWFkKTsKKworCXN3aXRjaCAodHJhbnMtPm1zZ190eXBlKSB7CisJY2FzZSBORlRfTVNHX0RFTFRBQkxFOgorCQluZl90YWJsZXNfdGFibGVfZGVzdHJveSgmdHJhbnMtPmN0eCk7CisJCWJyZWFrOworCWNhc2UgTkZUX01TR19ERUxDSEFJTjoKKwkJbmZfdGFibGVzX2NoYWluX2Rlc3Ryb3kodHJhbnMtPmN0eC5jaGFpbik7CisJCWJyZWFrOworCWNhc2UgTkZUX01TR19ERUxSVUxFOgorCQluZl90YWJsZXNfcnVsZV9kZXN0cm95KCZ0cmFucy0+Y3R4LCBuZnRfdHJhbnNfcnVsZSh0cmFucykpOworCQlicmVhazsKKwljYXNlIE5GVF9NU0dfREVMU0VUOgorCQluZnRfc2V0X2Rlc3Ryb3kobmZ0X3RyYW5zX3NldCh0cmFucykpOworCQlicmVhazsKKwl9CisJa2ZyZWUodHJhbnMpOworfQorCitzdGF0aWMgaW50IG5mX3RhYmxlc19jb21taXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFucywgKm5leHQ7CisJc3RydWN0IG5mdF9zZXQgKnNldDsKKworCS8qIEJ1bXAgZ2VuZXJhdGlvbiBjb3VudGVyLCBpbnZhbGlkYXRlIGFueSBkdW1wIGluIHByb2dyZXNzICovCisJbmV0LT5uZnQuZ2VuY3RyKys7CisKKwkvKiBBIG5ldyBnZW5lcmF0aW9uIGhhcyBqdXN0IHN0YXJ0ZWQgKi8KKwluZXQtPm5mdC5nZW5jdXJzb3IgPSBnZW5jdXJzb3JfbmV4dChuZXQpOworCisJLyogTWFrZSBzdXJlIGFsbCBwYWNrZXRzIGhhdmUgbGVmdCB0aGUgcHJldmlvdXMgZ2VuZXJhdGlvbiBiZWZvcmUKKwkgKiBwdXJnaW5nIG9sZCBydWxlcy4KKwkgKi8KKwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgbmV4dCwgJm5ldC0+bmZ0LmNvbW1pdF9saXN0LCBsaXN0KSB7CisJCXN3aXRjaCAodHJhbnMtPm1zZ190eXBlKSB7CisJCWNhc2UgTkZUX01TR19ORVdUQUJMRToKKwkJCWlmIChuZnRfdHJhbnNfdGFibGVfdXBkYXRlKHRyYW5zKSkgeworCQkJCWlmICghbmZ0X3RyYW5zX3RhYmxlX2VuYWJsZSh0cmFucykpIHsKKwkJCQkJbmZfdGFibGVzX3RhYmxlX2Rpc2FibGUodHJhbnMtPmN0eC5hZmksCisJCQkJCQkJCXRyYW5zLT5jdHgudGFibGUpOworCQkJCQl0cmFucy0+Y3R4LnRhYmxlLT5mbGFncyB8PSBORlRfVEFCTEVfRl9ET1JNQU5UOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdHJhbnMtPmN0eC50YWJsZS0+ZmxhZ3MgJj0gfk5GVF9UQUJMRV9JTkFDVElWRTsKKwkJCX0KKwkJCW5mX3RhYmxlc190YWJsZV9ub3RpZnkoJnRyYW5zLT5jdHgsIE5GVF9NU0dfTkVXVEFCTEUpOworCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ERUxUQUJMRToKKwkJCW5mX3RhYmxlc190YWJsZV9ub3RpZnkoJnRyYW5zLT5jdHgsIE5GVF9NU0dfREVMVEFCTEUpOworCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ORVdDSEFJTjoKKwkJCWlmIChuZnRfdHJhbnNfY2hhaW5fdXBkYXRlKHRyYW5zKSkKKwkJCQluZnRfY2hhaW5fY29tbWl0X3VwZGF0ZSh0cmFucyk7CisJCQllbHNlCisJCQkJdHJhbnMtPmN0eC5jaGFpbi0+ZmxhZ3MgJj0gfk5GVF9DSEFJTl9JTkFDVElWRTsKKworCQkJbmZfdGFibGVzX2NoYWluX25vdGlmeSgmdHJhbnMtPmN0eCwgTkZUX01TR19ORVdDSEFJTik7CisJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX0RFTENIQUlOOgorCQkJbmZfdGFibGVzX2NoYWluX25vdGlmeSgmdHJhbnMtPmN0eCwgTkZUX01TR19ERUxDSEFJTik7CisJCQlpZiAoISh0cmFucy0+Y3R4LnRhYmxlLT5mbGFncyAmIE5GVF9UQUJMRV9GX0RPUk1BTlQpICYmCisJCQkgICAgdHJhbnMtPmN0eC5jaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikgeworCQkJCW5mX3VucmVnaXN0ZXJfaG9va3MobmZ0X2Jhc2VfY2hhaW4odHJhbnMtPmN0eC5jaGFpbiktPm9wcywKKwkJCQkJCSAgICB0cmFucy0+Y3R4LmFmaS0+bm9wcyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX05FV1JVTEU6CisJCQluZnRfcnVsZV9jbGVhcih0cmFucy0+Y3R4Lm5ldCwgbmZ0X3RyYW5zX3J1bGUodHJhbnMpKTsKKwkJCW5mX3RhYmxlc19ydWxlX25vdGlmeSgmdHJhbnMtPmN0eCwKKwkJCQkJICAgICAgbmZ0X3RyYW5zX3J1bGUodHJhbnMpLAorCQkJCQkgICAgICBORlRfTVNHX05FV1JVTEUpOworCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ERUxSVUxFOgorCQkJbGlzdF9kZWxfcmN1KCZuZnRfdHJhbnNfcnVsZSh0cmFucyktPmxpc3QpOworCQkJbmZfdGFibGVzX3J1bGVfbm90aWZ5KCZ0cmFucy0+Y3R4LAorCQkJCQkgICAgICBuZnRfdHJhbnNfcnVsZSh0cmFucyksCisJCQkJCSAgICAgIE5GVF9NU0dfREVMUlVMRSk7CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX05FV1NFVDoKKwkJCW5mdF90cmFuc19zZXQodHJhbnMpLT5mbGFncyAmPSB+TkZUX1NFVF9JTkFDVElWRTsKKwkJCS8qIFRoaXMgYXZvaWRzIGhpdHRpbmcgLUVCVVNZIHdoZW4gZGVsZXRpbmcgdGhlIHRhYmxlCisJCQkgKiBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KKwkJCSAqLworCQkJaWYgKG5mdF90cmFuc19zZXQodHJhbnMpLT5mbGFncyAmIE5GVF9TRVRfQU5PTllNT1VTICYmCisJCQkgICAgIWxpc3RfZW1wdHkoJm5mdF90cmFuc19zZXQodHJhbnMpLT5iaW5kaW5ncykpCisJCQkJdHJhbnMtPmN0eC50YWJsZS0+dXNlLS07CisKKwkJCW5mX3RhYmxlc19zZXRfbm90aWZ5KCZ0cmFucy0+Y3R4LCBuZnRfdHJhbnNfc2V0KHRyYW5zKSwKKwkJCQkJICAgICBORlRfTVNHX05FV1NFVCwgR0ZQX0tFUk5FTCk7CisJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX0RFTFNFVDoKKwkJCW5mX3RhYmxlc19zZXRfbm90aWZ5KCZ0cmFucy0+Y3R4LCBuZnRfdHJhbnNfc2V0KHRyYW5zKSwKKwkJCQkJICAgICBORlRfTVNHX0RFTFNFVCwgR0ZQX0tFUk5FTCk7CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX05FV1NFVEVMRU06CisJCQluZl90YWJsZXNfc2V0ZWxlbV9ub3RpZnkoJnRyYW5zLT5jdHgsCisJCQkJCQkgbmZ0X3RyYW5zX2VsZW1fc2V0KHRyYW5zKSwKKwkJCQkJCSAmbmZ0X3RyYW5zX2VsZW0odHJhbnMpLAorCQkJCQkJIE5GVF9NU0dfTkVXU0VURUxFTSwgMCk7CisJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CisJCQlicmVhazsKKwkJY2FzZSBORlRfTVNHX0RFTFNFVEVMRU06CisJCQluZl90YWJsZXNfc2V0ZWxlbV9ub3RpZnkoJnRyYW5zLT5jdHgsCisJCQkJCQkgbmZ0X3RyYW5zX2VsZW1fc2V0KHRyYW5zKSwKKwkJCQkJCSAmbmZ0X3RyYW5zX2VsZW0odHJhbnMpLAorCQkJCQkJIE5GVF9NU0dfREVMU0VURUxFTSwgMCk7CisJCQlzZXQgPSBuZnRfdHJhbnNfZWxlbV9zZXQodHJhbnMpOworCQkJc2V0LT5vcHMtPmdldChzZXQsICZuZnRfdHJhbnNfZWxlbSh0cmFucykpOworCQkJc2V0LT5vcHMtPnJlbW92ZShzZXQsICZuZnRfdHJhbnNfZWxlbSh0cmFucykpOworCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIG5leHQsICZuZXQtPm5mdC5jb21taXRfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdHJhbnMtPmxpc3QpOworCQl0cmFucy0+Y3R4Lm5sYSA9IE5VTEw7CisJCWNhbGxfcmN1KCZ0cmFucy0+cmN1X2hlYWQsIG5mX3RhYmxlc19jb21taXRfcmVsZWFzZV9yY3UpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBTY2hlZHVsZSBvYmplY3RzIGZvciByZWxlYXNlIHZpYSByY3UgdG8gbWFrZSBzdXJlIG5vIHBhY2tldHMgYXJlIGFjY2VzaW5nCisgKiBhYm9ydGVkIHJ1bGVzLgorICovCitzdGF0aWMgdm9pZCBuZl90YWJsZXNfYWJvcnRfcmVsZWFzZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpydCkKK3sKKwlzdHJ1Y3QgbmZ0X3RyYW5zICp0cmFucyA9IGNvbnRhaW5lcl9vZihydCwgc3RydWN0IG5mdF90cmFucywgcmN1X2hlYWQpOworCisJc3dpdGNoICh0cmFucy0+bXNnX3R5cGUpIHsKKwljYXNlIE5GVF9NU0dfTkVXVEFCTEU6CisJCW5mX3RhYmxlc190YWJsZV9kZXN0cm95KCZ0cmFucy0+Y3R4KTsKKwkJYnJlYWs7CisJY2FzZSBORlRfTVNHX05FV0NIQUlOOgorCQluZl90YWJsZXNfY2hhaW5fZGVzdHJveSh0cmFucy0+Y3R4LmNoYWluKTsKKwkJYnJlYWs7CisJY2FzZSBORlRfTVNHX05FV1JVTEU6CisJCW5mX3RhYmxlc19ydWxlX2Rlc3Ryb3koJnRyYW5zLT5jdHgsIG5mdF90cmFuc19ydWxlKHRyYW5zKSk7CisJCWJyZWFrOworCWNhc2UgTkZUX01TR19ORVdTRVQ6CisJCW5mdF9zZXRfZGVzdHJveShuZnRfdHJhbnNfc2V0KHRyYW5zKSk7CisJCWJyZWFrOworCX0KKwlrZnJlZSh0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgbmZfdGFibGVzX2Fib3J0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJc3RydWN0IG5mdF90cmFucyAqdHJhbnMsICpuZXh0OworCXN0cnVjdCBuZnRfc2V0ICpzZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIG5leHQsICZuZXQtPm5mdC5jb21taXRfbGlzdCwgbGlzdCkgeworCQlzd2l0Y2ggKHRyYW5zLT5tc2dfdHlwZSkgeworCQljYXNlIE5GVF9NU0dfTkVXVEFCTEU6CisJCQlpZiAobmZ0X3RyYW5zX3RhYmxlX3VwZGF0ZSh0cmFucykpIHsKKwkJCQlpZiAobmZ0X3RyYW5zX3RhYmxlX2VuYWJsZSh0cmFucykpIHsKKwkJCQkJbmZfdGFibGVzX3RhYmxlX2Rpc2FibGUodHJhbnMtPmN0eC5hZmksCisJCQkJCQkJCXRyYW5zLT5jdHgudGFibGUpOworCQkJCQl0cmFucy0+Y3R4LnRhYmxlLT5mbGFncyB8PSBORlRfVEFCTEVfRl9ET1JNQU5UOworCQkJCX0KKwkJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CisJCQl9IGVsc2UgeworCQkJCWxpc3RfZGVsKCZ0cmFucy0+Y3R4LnRhYmxlLT5saXN0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfREVMVEFCTEU6CisJCQlsaXN0X2FkZF90YWlsKCZ0cmFucy0+Y3R4LnRhYmxlLT5saXN0LAorCQkJCSAgICAgICZ0cmFucy0+Y3R4LmFmaS0+dGFibGVzKTsKKwkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfTkVXQ0hBSU46CisJCQlpZiAobmZ0X3RyYW5zX2NoYWluX3VwZGF0ZSh0cmFucykpIHsKKwkJCQlpZiAobmZ0X3RyYW5zX2NoYWluX3N0YXRzKHRyYW5zKSkKKwkJCQkJZnJlZV9wZXJjcHUobmZ0X3RyYW5zX2NoYWluX3N0YXRzKHRyYW5zKSk7CisKKwkJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CisJCQl9IGVsc2UgeworCQkJCXRyYW5zLT5jdHgudGFibGUtPnVzZS0tOworCQkJCWxpc3RfZGVsKCZ0cmFucy0+Y3R4LmNoYWluLT5saXN0KTsKKwkJCQlpZiAoISh0cmFucy0+Y3R4LnRhYmxlLT5mbGFncyAmIE5GVF9UQUJMRV9GX0RPUk1BTlQpICYmCisJCQkJICAgIHRyYW5zLT5jdHguY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pIHsKKwkJCQkJbmZfdW5yZWdpc3Rlcl9ob29rcyhuZnRfYmFzZV9jaGFpbih0cmFucy0+Y3R4LmNoYWluKS0+b3BzLAorCQkJCQkJCSAgICB0cmFucy0+Y3R4LmFmaS0+bm9wcyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ERUxDSEFJTjoKKwkJCXRyYW5zLT5jdHgudGFibGUtPnVzZSsrOworCQkJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmN0eC5jaGFpbi0+bGlzdCwKKwkJCQkgICAgICAmdHJhbnMtPmN0eC50YWJsZS0+Y2hhaW5zKTsKKwkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfTkVXUlVMRToKKwkJCXRyYW5zLT5jdHguY2hhaW4tPnVzZS0tOworCQkJbGlzdF9kZWxfcmN1KCZuZnRfdHJhbnNfcnVsZSh0cmFucyktPmxpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ERUxSVUxFOgorCQkJdHJhbnMtPmN0eC5jaGFpbi0+dXNlKys7CisJCQluZnRfcnVsZV9jbGVhcih0cmFucy0+Y3R4Lm5ldCwgbmZ0X3RyYW5zX3J1bGUodHJhbnMpKTsKKwkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfTkVXU0VUOgorCQkJdHJhbnMtPmN0eC50YWJsZS0+dXNlLS07CisJCQlsaXN0X2RlbCgmbmZ0X3RyYW5zX3NldCh0cmFucyktPmxpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgTkZUX01TR19ERUxTRVQ6CisJCQl0cmFucy0+Y3R4LnRhYmxlLT51c2UrKzsKKwkJCWxpc3RfYWRkX3RhaWwoJm5mdF90cmFuc19zZXQodHJhbnMpLT5saXN0LAorCQkJCSAgICAgICZ0cmFucy0+Y3R4LnRhYmxlLT5zZXRzKTsKKwkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfTkVXU0VURUxFTToKKwkJCW5mdF90cmFuc19lbGVtX3NldCh0cmFucyktPm5lbGVtcy0tOworCQkJc2V0ID0gbmZ0X3RyYW5zX2VsZW1fc2V0KHRyYW5zKTsKKwkJCXNldC0+b3BzLT5nZXQoc2V0LCAmbmZ0X3RyYW5zX2VsZW0odHJhbnMpKTsKKwkJCXNldC0+b3BzLT5yZW1vdmUoc2V0LCAmbmZ0X3RyYW5zX2VsZW0odHJhbnMpKTsKKwkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKKwkJCWJyZWFrOworCQljYXNlIE5GVF9NU0dfREVMU0VURUxFTToKKwkJCW5mdF90cmFuc19lbGVtX3NldCh0cmFucyktPm5lbGVtcysrOworCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZSh0cmFucywgbmV4dCwKKwkJCQkJICZuZXQtPm5mdC5jb21taXRfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdHJhbnMtPmxpc3QpOworCQl0cmFucy0+Y3R4Lm5sYSA9IE5VTEw7CisJCWNhbGxfcmN1KCZ0cmFucy0+cmN1X2hlYWQsIG5mX3RhYmxlc19hYm9ydF9yZWxlYXNlX3JjdSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSBuZl90YWJsZXNfc3Vic3lzID0gewogCS5uYW1lCQk9ICJuZl90YWJsZXMiLAogCS5zdWJzeXNfaWQJPSBORk5MX1NVQlNZU19ORlRBQkxFUywKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCmluZGV4IDIzZWY3N2MuLmMxMzhiOGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYwpAQCAtMzk5LDE5ICszOTksMTcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCi1zdGF0aWMgdm9pZCBuZm5ldGxpbmtfYmluZChpbnQgZ3JvdXApCitzdGF0aWMgaW50IG5mbmV0bGlua19iaW5kKGludCBncm91cCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqc3M7CiAJaW50IHR5cGUgPSBuZm5sX2dyb3VwMnR5cGVbZ3JvdXBdOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXNzID0gbmZuZXRsaW5rX2dldF9zdWJzeXModHlwZSk7Ci0JaWYgKCFzcykgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmVxdWVzdF9tb2R1bGUoIm5mbmV0bGluay1zdWJzeXMtJWQiLCB0eXBlKTsKLQkJcmV0dXJuOwotCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoIXNzKQorCQlyZXF1ZXN0X21vZHVsZSgibmZuZXRsaW5rLXN1YnN5cy0lZCIsIHR5cGUpOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuYwppbmRleCBjN2I2ZDQ2Li4yYmFhMTI1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5jCkBAIC0zMiwxOCArMzIsMjQgQEAKIHN0cnVjdCBuZl9hY2N0IHsKIAlhdG9taWM2NF90CQlwa3RzOwogCWF0b21pYzY0X3QJCWJ5dGVzOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQJaGVhZDsKIAlhdG9taWNfdAkJcmVmY250OwogCWNoYXIJCQluYW1lW05GQUNDVF9OQU1FX01BWF07CiAJc3RydWN0IHJjdV9oZWFkCQlyY3VfaGVhZDsKKwljaGFyCQkJZGF0YVswXTsKIH07CiAKKyNkZWZpbmUgTkZBQ0NUX0ZfUVVPVEEgKE5GQUNDVF9GX1FVT1RBX1BLVFMgfCBORkFDQ1RfRl9RVU9UQV9CWVRFUykKKwogc3RhdGljIGludAogbmZubF9hY2N0X25ldyhzdHJ1Y3Qgc29jayAqbmZubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0LCAqbWF0Y2hpbmcgPSBOVUxMOwogCWNoYXIgKmFjY3RfbmFtZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJdTMyIGZsYWdzID0gMDsKIAogCWlmICghdGJbTkZBQ0NUX05BTUVdKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY4LDE1ICs3NCwzOCBAQAogCQkJLyogcmVzZXQgY291bnRlcnMgaWYgeW91IHJlcXVlc3QgYSByZXBsYWNlbWVudC4gKi8KIAkJCWF0b21pYzY0X3NldCgmbWF0Y2hpbmctPnBrdHMsIDApOwogCQkJYXRvbWljNjRfc2V0KCZtYXRjaGluZy0+Ynl0ZXMsIDApOworCQkJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJCQkvKiByZXNldCBvdmVycXVvdGEgZmxhZyBpZiBxdW90YSBpcyBlbmFibGVkLiAqLworCQkJaWYgKChtYXRjaGluZy0+ZmxhZ3MgJiBORkFDQ1RfRl9RVU9UQSkpCisJCQkJY2xlYXJfYml0KE5GQUNDVF9GX09WRVJRVU9UQSwgJm1hdGNoaW5nLT5mbGFncyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCW5mYWNjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZl9hY2N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRiW05GQUNDVF9GTEFHU10pIHsKKwkJZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZBQ0NUX0ZMQUdTXSkpOworCQlpZiAoZmxhZ3MgJiB+TkZBQ0NUX0ZfUVVPVEEpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmICgoZmxhZ3MgJiBORkFDQ1RfRl9RVU9UQSkgPT0gTkZBQ0NUX0ZfUVVPVEEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZsYWdzICYgTkZBQ0NUX0ZfT1ZFUlFVT1RBKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc2l6ZSArPSBzaXplb2YodTY0KTsKKwl9CisKKwluZmFjY3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmZfYWNjdCkgKyBzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAobmZhY2N0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGZsYWdzICYgTkZBQ0NUX0ZfUVVPVEEpIHsKKwkJdTY0ICpxdW90YSA9ICh1NjQgKiluZmFjY3QtPmRhdGE7CisKKwkJKnF1b3RhID0gYmU2NF90b19jcHUobmxhX2dldF9iZTY0KHRiW05GQUNDVF9RVU9UQV0pKTsKKwkJbmZhY2N0LT5mbGFncyA9IGZsYWdzOworCX0KKwogCXN0cm5jcHkobmZhY2N0LT5uYW1lLCBubGFfZGF0YSh0YltORkFDQ1RfTkFNRV0pLCBORkFDQ1RfTkFNRV9NQVgpOwogCiAJaWYgKHRiW05GQUNDVF9CWVRFU10pIHsKQEAgLTExNyw2ICsxNDYsOSBAQAogCWlmICh0eXBlID09IE5GTkxfTVNHX0FDQ1RfR0VUX0NUUlpFUk8pIHsKIAkJcGt0cyA9IGF0b21pYzY0X3hjaGcoJmFjY3QtPnBrdHMsIDApOwogCQlieXRlcyA9IGF0b21pYzY0X3hjaGcoJmFjY3QtPmJ5dGVzLCAwKTsKKwkJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJCWlmIChhY2N0LT5mbGFncyAmIE5GQUNDVF9GX1FVT1RBKQorCQkJY2xlYXJfYml0KE5GQUNDVF9GX09WRVJRVU9UQSwgJmFjY3QtPmZsYWdzKTsKIAl9IGVsc2UgewogCQlwa3RzID0gYXRvbWljNjRfcmVhZCgmYWNjdC0+cGt0cyk7CiAJCWJ5dGVzID0gYXRvbWljNjRfcmVhZCgmYWNjdC0+Ynl0ZXMpOwpAQCAtMTI1LDcgKzE1NywxMyBAQAogCSAgICBubGFfcHV0X2JlNjQoc2tiLCBORkFDQ1RfQllURVMsIGNwdV90b19iZTY0KGJ5dGVzKSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgTkZBQ0NUX1VTRSwgaHRvbmwoYXRvbWljX3JlYWQoJmFjY3QtPnJlZmNudCkpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKGFjY3QtPmZsYWdzICYgTkZBQ0NUX0ZfUVVPVEEpIHsKKwkJdTY0ICpxdW90YSA9ICh1NjQgKilhY2N0LT5kYXRhOwogCisJCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORkFDQ1RfRkxBR1MsIGh0b25sKGFjY3QtPmZsYWdzKSkgfHwKKwkJICAgIG5sYV9wdXRfYmU2NChza2IsIE5GQUNDVF9RVU9UQSwgY3B1X3RvX2JlNjQoKnF1b3RhKSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CiAJbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKQEAgLTI3MCw2ICszMDgsOCBAQAogCVtORkFDQ1RfTkFNRV0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIC5sZW4gPSBORkFDQ1RfTkFNRV9NQVgtMSB9LAogCVtORkFDQ1RfQllURVNdID0geyAudHlwZSA9IE5MQV9VNjQgfSwKIAlbTkZBQ0NUX1BLVFNdID0geyAudHlwZSA9IE5MQV9VNjQgfSwKKwlbTkZBQ0NUX0ZMQUdTXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GQUNDVF9RVU9UQV0gPSB7IC50eXBlID0gTkxBX1U2NCB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZm5sX2NhbGxiYWNrIG5mbmxfYWNjdF9jYltORk5MX01TR19BQ0NUX01BWF0gPSB7CkBAIC0zMzYsNiArMzc2LDUwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZm5sX2FjY3RfdXBkYXRlKTsKIAorc3RhdGljIHZvaWQgbmZubF9vdmVycXVvdGFfcmVwb3J0KHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlyZXQgPSBuZm5sX2FjY3RfZmlsbF9pbmZvKHNrYiwgMCwgMCwgTkZOTF9NU0dfQUNDVF9PVkVSUVVPVEEsIDAsCisJCQkJICBuZmFjY3QpOworCWlmIChyZXQgPD0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwluZXRsaW5rX2Jyb2FkY2FzdChpbml0X25ldC5uZm5sLCBza2IsIDAsIE5GTkxHUlBfQUNDVF9RVU9UQSwKKwkJCSAgR0ZQX0FUT01JQyk7Cit9CisKK2ludCBuZm5sX2FjY3Rfb3ZlcnF1b3RhKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpCit7CisJdTY0IG5vdzsKKwl1NjQgKnF1b3RhOworCWludCByZXQgPSBORkFDQ1RfVU5ERVJRVU9UQTsKKworCS8qIG5vIHBsYWNlIGhlcmUgaWYgd2UgZG9uJ3QgaGF2ZSBhIHF1b3RhICovCisJaWYgKCEobmZhY2N0LT5mbGFncyAmIE5GQUNDVF9GX1FVT1RBKSkKKwkJcmV0dXJuIE5GQUNDVF9OT19RVU9UQTsKKworCXF1b3RhID0gKHU2NCAqKW5mYWNjdC0+ZGF0YTsKKwlub3cgPSAobmZhY2N0LT5mbGFncyAmIE5GQUNDVF9GX1FVT1RBX1BLVFMpID8KKwkgICAgICAgYXRvbWljNjRfcmVhZCgmbmZhY2N0LT5wa3RzKSA6IGF0b21pYzY0X3JlYWQoJm5mYWNjdC0+Ynl0ZXMpOworCisJcmV0ID0gbm93ID4gKnF1b3RhOworCisJaWYgKG5vdyA+PSAqcXVvdGEgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoTkZBQ0NUX0ZfT1ZFUlFVT1RBLCAmbmZhY2N0LT5mbGFncykpIHsKKwkJbmZubF9vdmVycXVvdGFfcmVwb3J0KG5mYWNjdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mbmxfYWNjdF9vdmVycXVvdGEpOworCiBzdGF0aWMgaW50IF9faW5pdCBuZm5sX2FjY3RfaW5pdCh2b2lkKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jIGIvbmV0L25ldGZpbHRlci9uZnRfY3QuYwppbmRleCBiZDBkNDFlLi5jYzU2MDMwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKQEAgLTIxNSwyMiArMjE1LDE0IEBACiAJCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChmYW1pbHkpOwogfQogCi1zdGF0aWMgaW50IG5mdF9jdF9pbml0X3ZhbGlkYXRlX2dldChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQorc3RhdGljIGludCBuZnRfY3RfZ2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWludCBlcnI7CiAKLQlpZiAodGJbTkZUQV9DVF9ESVJFQ1RJT05dICE9IE5VTEwpIHsKLQkJcHJpdi0+ZGlyID0gbmxhX2dldF91OCh0YltORlRBX0NUX0RJUkVDVElPTl0pOwotCQlzd2l0Y2ggKHByaXYtPmRpcikgewotCQljYXNlIElQX0NUX0RJUl9PUklHSU5BTDoKLQkJY2FzZSBJUF9DVF9ESVJfUkVQTFk6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCisJcHJpdi0+a2V5ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ1RfS0VZXSkpOwogCXN3aXRjaCAocHJpdi0+a2V5KSB7CiAJY2FzZSBORlRfQ1RfU1RBVEU6CiAJY2FzZSBORlRfQ1RfRElSRUNUSU9OOgpAQCAtMjYyLDU1ICsyNTQsNTUgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5mdF9jdF9pbml0X3ZhbGlkYXRlX3NldCh1aW50MzJfdCBrZXkpCi17Ci0Jc3dpdGNoIChrZXkpIHsKLQljYXNlIE5GVF9DVF9NQVJLOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSAhPSBOVUxMKSB7CisJCXByaXYtPmRpciA9IG5sYV9nZXRfdTgodGJbTkZUQV9DVF9ESVJFQ1RJT05dKTsKKwkJc3dpdGNoIChwcml2LT5kaXIpIHsKKwkJY2FzZSBJUF9DVF9ESVJfT1JJR0lOQUw6CisJCWNhc2UgSVBfQ1RfRElSX1JFUExZOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAorCXByaXYtPmRyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9DVF9EUkVHXSkpOworCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGN0eCwgcHJpdi0+ZHJlZywgTlVMTCwgTkZUX0RBVEFfVkFMVUUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbmZ0X2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQoY3R4LT5hZmktPmZhbWlseSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuZnRfY3RfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAotCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkgICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCitzdGF0aWMgaW50IG5mdF9jdF9zZXRfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9jdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJaW50IGVycjsKIAogCXByaXYtPmtleSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NUX0tFWV0pKTsKLQotCWlmICh0YltORlRBX0NUX0RSRUddKSB7Ci0JCWVyciA9IG5mdF9jdF9pbml0X3ZhbGlkYXRlX2dldChleHByLCB0Yik7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQotCQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ1RfRFJFR10pKTsKLQkJZXJyID0gbmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3Rlcihwcml2LT5kcmVnKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCWVyciA9IG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAotCQkJCQkgICAgIE5GVF9EQVRBX1ZBTFVFKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0gZWxzZSB7Ci0JCWVyciA9IG5mdF9jdF9pbml0X3ZhbGlkYXRlX3NldChwcml2LT5rZXkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0KLQkJcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NUX1NSRUddKSk7Ci0JCWVyciA9IG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3Rlcihwcml2LT5zcmVnKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOworCXN3aXRjaCAocHJpdi0+a2V5KSB7CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCisJY2FzZSBORlRfQ1RfTUFSSzoKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCisJcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NUX1NSRUddKSk7CisJZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gbmZ0X2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQoY3R4LT5hZmktPmZhbWlseSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0zNzAsNyArMzYyLDcgQEAKIAkudHlwZQkJPSAmbmZ0X2N0X3R5cGUsCiAJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9jdCkpLAogCS5ldmFsCQk9IG5mdF9jdF9nZXRfZXZhbCwKLQkuaW5pdAkJPSBuZnRfY3RfaW5pdCwKKwkuaW5pdAkJPSBuZnRfY3RfZ2V0X2luaXQsCiAJLmRlc3Ryb3kJPSBuZnRfY3RfZGVzdHJveSwKIAkuZHVtcAkJPSBuZnRfY3RfZ2V0X2R1bXAsCiB9OwpAQCAtMzc5LDcgKzM3MSw3IEBACiAJLnR5cGUJCT0gJm5mdF9jdF90eXBlLAogCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfY3QpKSwKIAkuZXZhbAkJPSBuZnRfY3Rfc2V0X2V2YWwsCi0JLmluaXQJCT0gbmZ0X2N0X2luaXQsCisJLmluaXQJCT0gbmZ0X2N0X3NldF9pbml0LAogCS5kZXN0cm95CT0gbmZ0X2N0X2Rlc3Ryb3ksCiAJLmR1bXAJCT0gbmZ0X2N0X3NldF9kdW1wLAogfTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYwppbmRleCAzYjFhZDg3Li40MDgwZWQ2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfaGFzaC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpAQCAtMTksNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgogCi0jZGVmaW5lIE5GVF9IQVNIX01JTl9TSVpFCTQKKyNkZWZpbmUgTkZUX0hBU0hfTUlOX1NJWkUJNFVMCiAKIHN0cnVjdCBuZnRfaGFzaCB7CiAJc3RydWN0IG5mdF9oYXNoX3RhYmxlIF9fcmN1CSp0Ymw7CkBAIC0yNyw3ICsyOCw2IEBACiAKIHN0cnVjdCBuZnRfaGFzaF90YWJsZSB7CiAJdW5zaWduZWQgaW50CQkJc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCQllbGVtZW50czsKIAlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSBfX3JjdQkqYnVja2V0c1tdOwogfTsKIApAQCAtNzYsMTAgKzc2LDEyIEBACiAKIHN0YXRpYyB2b2lkIG5mdF9oYXNoX3RibF9mcmVlKGNvbnN0IHN0cnVjdCBuZnRfaGFzaF90YWJsZSAqdGJsKQogewotCWlmIChpc192bWFsbG9jX2FkZHIodGJsKSkKLQkJdmZyZWUodGJsKTsKLQllbHNlCi0JCWtmcmVlKHRibCk7CisJa3ZmcmVlKHRibCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X2hhc2hfdGJsX3NpemUodW5zaWduZWQgaW50IG5lbGVtKQoreworCXJldHVybiBtYXgocm91bmR1cF9wb3dfb2ZfdHdvKG5lbGVtICogNCAvIDMpLCBORlRfSEFTSF9NSU5fU0laRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2hhc2hfdGFibGUgKm5mdF9oYXNoX3RibF9hbGxvYyh1bnNpZ25lZCBpbnQgbmJ1Y2tldHMpCkBAIC0xNjEsNyArMTYzLDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCW50YmwtPmVsZW1lbnRzID0gdGJsLT5lbGVtZW50czsKIAogCS8qIFB1Ymxpc2ggbmV3IHRhYmxlICovCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHByaXYtPnRibCwgbnRibCk7CkBAIC0yMDEsNyArMjAyLDYgQEAKIAkJCTsKIAkJUkNVX0lOSVRfUE9JTlRFUigqcHByZXYsIHRibC0+YnVja2V0c1tpICsgbnRibC0+c2l6ZV0pOwogCX0KLQludGJsLT5lbGVtZW50cyA9IHRibC0+ZWxlbWVudHM7CiAKIAkvKiBQdWJsaXNoIG5ldyB0YWJsZSAqLwogCXJjdV9hc3NpZ25fcG9pbnRlcihwcml2LT50YmwsIG50YmwpOwpAQCAtMjM3LDEwICsyMzcsOSBAQAogCWggPSBuZnRfaGFzaF9kYXRhKCZoZS0+a2V5LCB0YmwtPnNpemUsIHNldC0+a2xlbik7CiAJUkNVX0lOSVRfUE9JTlRFUihoZS0+bmV4dCwgdGJsLT5idWNrZXRzW2hdKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIodGJsLT5idWNrZXRzW2hdLCBoZSk7Ci0JdGJsLT5lbGVtZW50cysrOwogCiAJLyogRXhwYW5kIHRhYmxlIHdoZW4gZXhjZWVkaW5nIDc1JSBsb2FkICovCi0JaWYgKHRibC0+ZWxlbWVudHMgPiB0YmwtPnNpemUgLyA0ICogMykKKwlpZiAoc2V0LT5uZWxlbXMgKyAxID4gdGJsLT5zaXplIC8gNCAqIDMpCiAJCW5mdF9oYXNoX3RibF9leHBhbmQoc2V0LCBwcml2KTsKIAogCXJldHVybiAwOwpAQCAtMjY4LDEwICsyNjcsOSBAQAogCVJDVV9JTklUX1BPSU5URVIoKnBwcmV2LCBoZS0+bmV4dCk7CiAJc3luY2hyb25pemVfcmN1KCk7CiAJa2ZyZWUoaGUpOwotCXRibC0+ZWxlbWVudHMtLTsKIAogCS8qIFNocmluayB0YWJsZSBiZW5lYXRoIDMwJSBsb2FkICovCi0JaWYgKHRibC0+ZWxlbWVudHMgPCB0YmwtPnNpemUgKiAzIC8gMTAgJiYKKwlpZiAoc2V0LT5uZWxlbXMgLSAxIDwgdGJsLT5zaXplICogMyAvIDEwICYmCiAJICAgIHRibC0+c2l6ZSA+IE5GVF9IQVNIX01JTl9TSVpFKQogCQluZnRfaGFzaF90Ymxfc2hyaW5rKHNldCwgcHJpdik7CiB9CkBAIC0zMzUsMTcgKzMzMywyMyBAQAogfQogCiBzdGF0aWMgaW50IG5mdF9oYXNoX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAogCQkJIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwogCXN0cnVjdCBuZnRfaGFzaF90YWJsZSAqdGJsOworCXVuc2lnbmVkIGludCBzaXplOwogCiAJaWYgKHVubGlrZWx5KCFuZnRfaGFzaF9ybmRfaW5pdHRlZCkpIHsKIAkJZ2V0X3JhbmRvbV9ieXRlcygmbmZ0X2hhc2hfcm5kLCA0KTsKIAkJbmZ0X2hhc2hfcm5kX2luaXR0ZWQgPSB0cnVlOwogCX0KIAotCXRibCA9IG5mdF9oYXNoX3RibF9hbGxvYyhORlRfSEFTSF9NSU5fU0laRSk7CisJc2l6ZSA9IE5GVF9IQVNIX01JTl9TSVpFOworCWlmIChkZXNjLT5zaXplKQorCQlzaXplID0gbmZ0X2hhc2hfdGJsX3NpemUoZGVzYy0+c2l6ZSk7CisKKwl0YmwgPSBuZnRfaGFzaF90YmxfYWxsb2Moc2l6ZSk7CiAJaWYgKHRibCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlSQ1VfSU5JVF9QT0lOVEVSKHByaXYtPnRibCwgdGJsKTsKQEAgLTM2OSw4ICszNzMsMzcgQEAKIAlrZnJlZSh0YmwpOwogfQogCitzdGF0aWMgYm9vbCBuZnRfaGFzaF9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCisJCQkgICAgICBzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQoreworCXVuc2lnbmVkIGludCBlc2l6ZTsKKworCWVzaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtKTsKKwlpZiAoZmVhdHVyZXMgJiBORlRfU0VUX01BUCkKKwkJZXNpemUgKz0gRklFTERfU0laRU9GKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBkYXRhWzBdKTsKKworCWlmIChkZXNjLT5zaXplKSB7CisJCWVzdC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpICsKKwkJCSAgICBuZnRfaGFzaF90Ymxfc2l6ZShkZXNjLT5zaXplKSAqCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtICopICsKKwkJCSAgICBkZXNjLT5zaXplICogZXNpemU7CisJfSBlbHNlIHsKKwkJLyogUmVzaXppbmcgaGFwcGVucyB3aGVuIHRoZSBsb2FkIGRyb3BzIGJlbG93IDMwJSBvciBnb2VzCisJCSAqIGFib3ZlIDc1JS4gVGhlIGF2ZXJhZ2Ugb2YgNTIuNSUgbG9hZCAoYXBwcm94aW1hdGVkIGJ5IDUwJSkKKwkJICogaXMgdXNlZCBmb3IgdGhlIHNpemUgZXN0aW1hdGlvbiBvZiB0aGUgaGFzaCBidWNrZXRzLAorCQkgKiBtZWFuaW5nIHdlIGNhbGN1bGF0ZSB0d28gYnVja2V0cyBwZXIgZWxlbWVudC4KKwkJICovCisJCWVzdC0+c2l6ZSA9IGVzaXplICsgMiAqIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqKTsKKwl9CisKKwllc3QtPmNsYXNzID0gTkZUX1NFVF9DTEFTU19PXzE7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIHN0cnVjdCBuZnRfc2V0X29wcyBuZnRfaGFzaF9vcHMgX19yZWFkX21vc3RseSA9IHsKIAkucHJpdnNpemUgICAgICAgPSBuZnRfaGFzaF9wcml2c2l6ZSwKKwkuZXN0aW1hdGUJPSBuZnRfaGFzaF9lc3RpbWF0ZSwKIAkuaW5pdAkJPSBuZnRfaGFzaF9pbml0LAogCS5kZXN0cm95CT0gbmZ0X2hhc2hfZGVzdHJveSwKIAkuZ2V0CQk9IG5mdF9oYXNoX2dldCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvb2t1cC5jIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKaW5kZXggN2ZkMmJlYS4uNjQwNGE3MiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKQEAgLTU2LDggKzU2LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXAoY3R4LT50YWJsZSwgdGJbTkZUQV9MT09LVVBfU0VUXSk7Ci0JaWYgKElTX0VSUihzZXQpKQotCQlyZXR1cm4gUFRSX0VSUihzZXQpOworCWlmIChJU19FUlIoc2V0KSkgeworCQlpZiAodGJbTkZUQV9MT09LVVBfU0VUX0lEXSkgeworCQkJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXBfYnlpZChjdHgtPm5ldCwKKwkJCQkJCQl0YltORlRBX0xPT0tVUF9TRVRfSURdKTsKKwkJfQorCQlpZiAoSVNfRVJSKHNldCkpCisJCQlyZXR1cm4gUFRSX0VSUihzZXQpOworCX0KIAogCXByaXYtPnNyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9MT09LVVBfU1JFR10pKTsKIAllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIocHJpdi0+c3JlZyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMKaW5kZXggNDI1Y2YzOS4uODUyYjE3OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuYwpAQCAtMTgsMTggKzE4LDExIEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPiAvKiBmb3IgVENQX1RJTUVfV0FJVCAqLwogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZnRfbWV0YS5oPgogCi1zdHJ1Y3QgbmZ0X21ldGEgewotCWVudW0gbmZ0X21ldGFfa2V5cwlrZXk6ODsKLQl1bmlvbiB7Ci0JCWVudW0gbmZ0X3JlZ2lzdGVycwlkcmVnOjg7Ci0JCWVudW0gbmZ0X3JlZ2lzdGVycwlzcmVnOjg7Ci0JfTsKLX07Ci0KLXN0YXRpYyB2b2lkIG5mdF9tZXRhX2dldF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3ZvaWQgbmZ0X21ldGFfZ2V0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkgICAgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCWNvbnN0IHN0cnVjdCBuZnRfbWV0YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdC0+c2tiOwpAQCAtMTQwLDEwICsxMzMsMTEgQEAKIGVycjoKIAlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9ldmFsKTsKIAotc3RhdGljIHZvaWQgbmZ0X21ldGFfc2V0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQordm9pZCBuZnRfbWV0YV9zZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9tZXRhICptZXRhID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7CkBAIC0xNjMsMjggKzE1NywyNCBAQAogCQlXQVJOX09OKDEpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX3NldF9ldmFsKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9tZXRhX3BvbGljeVtORlRBX01FVEFfTUFYICsgMV0gPSB7Citjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfbWV0YV9wb2xpY3lbTkZUQV9NRVRBX01BWCArIDFdID0gewogCVtORlRBX01FVEFfRFJFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtORlRBX01FVEFfS0VZXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtORlRBX01FVEFfU1JFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX3BvbGljeSk7CiAKLXN0YXRpYyBpbnQgbmZ0X21ldGFfaW5pdF92YWxpZGF0ZV9zZXQodWludDMyX3Qga2V5KQoraW50IG5mdF9tZXRhX2dldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7Ci0Jc3dpdGNoIChrZXkpIHsKLQljYXNlIE5GVF9NRVRBX01BUks6Ci0JY2FzZSBORlRfTUVUQV9QUklPUklUWToKLQljYXNlIE5GVF9NRVRBX05GVFJBQ0U6Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci19CisJc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlpbnQgZXJyOwogCi1zdGF0aWMgaW50IG5mdF9tZXRhX2luaXRfdmFsaWRhdGVfZ2V0KHVpbnQzMl90IGtleSkKLXsKLQlzd2l0Y2ggKGtleSkgeworCXByaXYtPmtleSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX01FVEFfS0VZXSkpOworCXN3aXRjaCAocHJpdi0+a2V5KSB7CiAJY2FzZSBORlRfTUVUQV9MRU46CiAJY2FzZSBORlRfTUVUQV9QUk9UT0NPTDoKIAljYXNlIE5GVF9NRVRBX05GUFJPVE86CkBAIC0yMDUsMzkgKzE5NSw0MSBAQAogI2lmZGVmIENPTkZJR19ORVRXT1JLX1NFQ01BUksKIAljYXNlIE5GVF9NRVRBX1NFQ01BUks6CiAjZW5kaWYKLQkJcmV0dXJuIDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLX0KKwlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTUVUQV9EUkVHXSkpOworCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKLXN0YXRpYyBpbnQgbmZ0X21ldGFfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCisJZXJyID0gbmZ0X3ZhbGlkYXRlX2RhdGFfbG9hZChjdHgsIHByaXYtPmRyZWcsIE5VTEwsIE5GVF9EQVRBX1ZBTFVFKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfZ2V0X2luaXQpOworCitpbnQgbmZ0X21ldGFfc2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X21ldGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCWludCBlcnI7CiAKIAlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0tFWV0pKTsKLQotCWlmICh0YltORlRBX01FVEFfRFJFR10pIHsKLQkJZXJyID0gbmZ0X21ldGFfaW5pdF92YWxpZGF0ZV9nZXQocHJpdi0+a2V5KTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCXByaXYtPmRyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0RSRUddKSk7Ci0JCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQotCQlyZXR1cm4gbmZ0X3ZhbGlkYXRlX2RhdGFfbG9hZChjdHgsIHByaXYtPmRyZWcsIE5VTEwsCi0JCQkJCSAgICAgIE5GVF9EQVRBX1ZBTFVFKTsKKwlzd2l0Y2ggKHByaXYtPmtleSkgeworCWNhc2UgTkZUX01FVEFfTUFSSzoKKwljYXNlIE5GVF9NRVRBX1BSSU9SSVRZOgorCWNhc2UgTkZUX01FVEFfTkZUUkFDRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCWVyciA9IG5mdF9tZXRhX2luaXRfdmFsaWRhdGVfc2V0KHByaXYtPmtleSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KIAlwcml2LT5zcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTUVUQV9TUkVHXSkpOwogCWVyciA9IG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3Rlcihwcml2LT5zcmVnKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTI0NSw5ICsyMzcsMTAgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfc2V0X2luaXQpOwogCi1zdGF0aWMgaW50IG5mdF9tZXRhX2dldF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK2ludCBuZnRfbWV0YV9nZXRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIApAQCAtMjYwLDkgKzI1MywxMCBAQAogbmxhX3B1dF9mYWlsdXJlOgogCXJldHVybiAtMTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9kdW1wKTsKIAotc3RhdGljIGludCBuZnRfbWV0YV9zZXRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCitpbnQgbmZ0X21ldGFfc2V0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQogewogCWNvbnN0IHN0cnVjdCBuZnRfbWV0YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKQEAgLTI3NiwxMyArMjcwLDE0IEBACiBubGFfcHV0X2ZhaWx1cmU6CiAJcmV0dXJuIC0xOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfc2V0X2R1bXApOwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X21ldGFfdHlwZTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9tZXRhX2dldF9vcHMgPSB7CiAJLnR5cGUJCT0gJm5mdF9tZXRhX3R5cGUsCiAJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9tZXRhKSksCiAJLmV2YWwJCT0gbmZ0X21ldGFfZ2V0X2V2YWwsCi0JLmluaXQJCT0gbmZ0X21ldGFfaW5pdCwKKwkuaW5pdAkJPSBuZnRfbWV0YV9nZXRfaW5pdCwKIAkuZHVtcAkJPSBuZnRfbWV0YV9nZXRfZHVtcCwKIH07CiAKQEAgLTI5MCw3ICsyODUsNyBAQAogCS50eXBlCQk9ICZuZnRfbWV0YV90eXBlLAogCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfbWV0YSkpLAogCS5ldmFsCQk9IG5mdF9tZXRhX3NldF9ldmFsLAotCS5pbml0CQk9IG5mdF9tZXRhX2luaXQsCisJLmluaXQJCT0gbmZ0X21ldGFfc2V0X2luaXQsCiAJLmR1bXAJCT0gbmZ0X21ldGFfc2V0X2R1bXAsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCmluZGV4IGUyMWQ2OWQuLmUxODM2ZmYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZ0X3JidHJlZV9sb2NrKTsKKwogc3RydWN0IG5mdF9yYnRyZWUgewogCXN0cnVjdCByYl9yb290CQlyb290OwogfTsKQEAgLTM4LDYgKzQwLDcgQEAKIAljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gcHJpdi0+cm9vdC5yYl9ub2RlOwogCWludCBkOwogCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewogCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwogCkBAIC01Myw2ICs1Niw4IEBACiAJCQkJZ290byBvdXQ7CiAJCQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQogCQkJCW5mdF9kYXRhX2NvcHkoZGF0YSwgcmJlLT5kYXRhKTsKKworCQkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KQEAgLTYyLDYgKzY3LDcgQEAKIAkJZ290byBmb3VuZDsKIAl9CiBvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMjQsOSArMTMwLDEyIEBACiAJICAgICEocmJlLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQogCQluZnRfZGF0YV9jb3B5KHJiZS0+ZGF0YSwgJmVsZW0tPmRhdGEpOwogCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCWVyciA9IF9fbmZ0X3JidHJlZV9pbnNlcnQoc2V0LCByYmUpOwogCWlmIChlcnIgPCAwKQogCQlrZnJlZShyYmUpOworCisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTM2LDcgKzE0NSw5IEBACiAJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKIAlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5jb29raWU7CiAKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJcmJfZXJhc2UoJnJiZS0+bm9kZSwgJnByaXYtPnJvb3QpOworCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCWtmcmVlKHJiZSk7CiB9CiAKQEAgLTE0Nyw2ICsxNTgsNyBAQAogCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZTsKIAlpbnQgZDsKIAorCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKIAl3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKIAkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKIApAQCAtMTYxLDkgKzE3MywxMSBAQAogCQkJICAgICEocmJlLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQogCQkJCW5mdF9kYXRhX2NvcHkoJmVsZW0tPmRhdGEsIHJiZS0+ZGF0YSk7CiAJCQllbGVtLT5mbGFncyA9IHJiZS0+ZmxhZ3M7CisJCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCXJldHVybiAtRU5PRU5UOwogfQogCkBAIC0xNzYsNiArMTkwLDcgQEAKIAlzdHJ1Y3QgbmZ0X3NldF9lbGVtIGVsZW07CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJZm9yIChub2RlID0gcmJfZmlyc3QoJnByaXYtPnJvb3QpOyBub2RlICE9IE5VTEw7IG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CiAJCWlmIChpdGVyLT5jb3VudCA8IGl0ZXItPnNraXApCiAJCQlnb3RvIGNvbnQ7CkBAIC0xODgsMTEgKzIwMywxNCBAQAogCQllbGVtLmZsYWdzID0gcmJlLT5mbGFnczsKIAogCQlpdGVyLT5lcnIgPSBpdGVyLT5mbihjdHgsIHNldCwgaXRlciwgJmVsZW0pOwotCQlpZiAoaXRlci0+ZXJyIDwgMCkKKwkJaWYgKGl0ZXItPmVyciA8IDApIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCQkJcmV0dXJuOworCQl9CiBjb250OgogCQlpdGVyLT5jb3VudCsrOwogCX0KKwlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfcmJ0cmVlX3ByaXZzaXplKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKQEAgLTIwMSw2ICsyMTksNyBAQAogfQogCiBzdGF0aWMgaW50IG5mdF9yYnRyZWVfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywKIAkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKIHsKIAlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwpAQCAtMjE1LDE1ICsyMzQsMzcgQEAKIAlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJd2hpbGUgKChub2RlID0gcHJpdi0+cm9vdC5yYl9ub2RlKSAhPSBOVUxMKSB7CiAJCXJiX2VyYXNlKG5vZGUsICZwcml2LT5yb290KTsKIAkJcmJlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7CiAJCW5mdF9yYnRyZWVfZWxlbV9kZXN0cm95KHNldCwgcmJlKTsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Cit9CisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfZXN0aW1hdGUoY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywgdTMyIGZlYXR1cmVzLAorCQkJCXN0cnVjdCBuZnRfc2V0X2VzdGltYXRlICplc3QpCit7CisJdW5zaWduZWQgaW50IG5zaXplOworCisJbnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9yYnRyZWVfZWxlbSk7CisJaWYgKGZlYXR1cmVzICYgTkZUX1NFVF9NQVApCisJCW5zaXplICs9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBkYXRhWzBdKTsKKworCWlmIChkZXNjLT5zaXplKQorCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9yYnRyZWUpICsgZGVzYy0+c2l6ZSAqIG5zaXplOworCWVsc2UKKwkJZXN0LT5zaXplID0gbnNpemU7CisKKwllc3QtPmNsYXNzID0gTkZUX1NFVF9DTEFTU19PX0xPR19OOworCisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X3JidHJlZV9vcHMgX19yZWFkX21vc3RseSA9IHsKIAkucHJpdnNpemUJPSBuZnRfcmJ0cmVlX3ByaXZzaXplLAorCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCiAJLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAogCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAogCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2JwZi5jIGIvbmV0L25ldGZpbHRlci94dF9icGYuYwppbmRleCAxMmQ0ZGE4Li5iYmZmZGJkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2JwZi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfYnBmLmMKQEAgLTIzLDEwICsyMywxMSBAQAogc3RhdGljIGludCBicGZfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IHh0X2JwZl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87Ci0Jc3RydWN0IHNvY2tfZnByb2cgcHJvZ3JhbTsKKwlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuIHByb2dyYW07CiAKIAlwcm9ncmFtLmxlbiA9IGluZm8tPmJwZl9wcm9ncmFtX251bV9lbGVtOwotCXByb2dyYW0uZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciBfX3VzZXIgKikgaW5mby0+YnBmX3Byb2dyYW07CisJcHJvZ3JhbS5maWx0ZXIgPSBpbmZvLT5icGZfcHJvZ3JhbTsKKwogCWlmIChza191bmF0dGFjaGVkX2ZpbHRlcl9jcmVhdGUoJmluZm8tPmZpbHRlciwgJnByb2dyYW0pKSB7CiAJCXByX2luZm8oImJwZjogY2hlY2sgZmFpbGVkOiBwYXJzZSBlcnJvclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYyBiL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMKaW5kZXggYjNiZTBlZi4uOGM2NDZlZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYwpAQCAtMjEsMTEgKzIxLDE0IEBACiAKIHN0YXRpYyBib29sIG5mYWNjdF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7CisJaW50IG92ZXJxdW90YTsKIAljb25zdCBzdHJ1Y3QgeHRfbmZhY2N0X21hdGNoX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJbmZubF9hY2N0X3VwZGF0ZShza2IsIGluZm8tPm5mYWNjdCk7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlvdmVycXVvdGEgPSBuZm5sX2FjY3Rfb3ZlcnF1b3RhKHNrYiwgaW5mby0+bmZhY2N0KTsKKworCXJldHVybiBvdmVycXVvdGEgPT0gTkZBQ0NUX1VOREVSUVVPVEEgPyBmYWxzZSA6IHRydWU7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcmVjZW50LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jCmluZGV4IDFlNjU3Y2YuLmE5ZmFhZTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcmVjZW50LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYwpAQCAtMzEzLDEwICszMTMsNyBAQAogCiBzdGF0aWMgdm9pZCByZWNlbnRfdGFibGVfZnJlZSh2b2lkICphZGRyKQogewotCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCi0JCXZmcmVlKGFkZHIpOwotCWVsc2UKLQkJa2ZyZWUoYWRkcik7CisJa3ZmcmVlKGFkZHIpOwogfQogCiBzdGF0aWMgaW50IHJlY2VudF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhciwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCBmMjI3NTdhLi4xNWM3MzFmIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0xMjA2LDcgKzEyMDYsOCBAQAogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7CiAJc3RydWN0IG11dGV4ICpjYl9tdXRleDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7Ci0Jdm9pZCAoKmJpbmQpKGludCBncm91cCk7CisJaW50ICgqYmluZCkoaW50IGdyb3VwKTsKKwl2b2lkICgqdW5iaW5kKShpbnQgZ3JvdXApOwogCWludCBlcnIgPSAwOwogCiAJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKQEAgLTEyMzIsNiArMTIzMyw3IEBACiAJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiAJY2JfbXV0ZXggPSBubF90YWJsZVtwcm90b2NvbF0uY2JfbXV0ZXg7CiAJYmluZCA9IG5sX3RhYmxlW3Byb3RvY29sXS5iaW5kOworCXVuYmluZCA9IG5sX3RhYmxlW3Byb3RvY29sXS51bmJpbmQ7CiAJbmV0bGlua191bmxvY2tfdGFibGUoKTsKIAogCWlmIChlcnIgPCAwKQpAQCAtMTI0OCw2ICsxMjUwLDcgQEAKIAlubGsgPSBubGtfc2soc29jay0+c2spOwogCW5say0+bW9kdWxlID0gbW9kdWxlOwogCW5say0+bmV0bGlua19iaW5kID0gYmluZDsKKwlubGstPm5ldGxpbmtfdW5iaW5kID0gdW5iaW5kOwogb3V0OgogCXJldHVybiBlcnI7CiAKQEAgLTEzMDEsNiArMTMwNCw3IEBACiAJCQlrZnJlZV9yY3Uob2xkLCByY3UpOwogCQkJbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5tb2R1bGUgPSBOVUxMOwogCQkJbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5iaW5kID0gTlVMTDsKKwkJCW5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0udW5iaW5kID0gTlVMTDsKIAkJCW5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0uZmxhZ3MgPSAwOwogCQkJbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5yZWdpc3RlcmVkID0gMDsKIAkJfQpAQCAtMTQ3OCw2ICsxNDgyLDE5IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgbmV0bGlua191bmJpbmQoaW50IGdyb3VwLCBsb25nIHVuc2lnbmVkIGludCBncm91cHMsCisJCQkgICBzdHJ1Y3QgbmV0bGlua19zb2NrICpubGspCit7CisJaW50IHVuZG87CisKKwlpZiAoIW5say0+bmV0bGlua191bmJpbmQpCisJCXJldHVybjsKKworCWZvciAodW5kbyA9IDA7IHVuZG8gPCBncm91cDsgdW5kbysrKQorCQlpZiAodGVzdF9iaXQoZ3JvdXAsICZncm91cHMpKQorCQkJbmxrLT5uZXRsaW5rX3VuYmluZCh1bmRvKTsKK30KKwogc3RhdGljIGludCBuZXRsaW5rX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAogCQkJaW50IGFkZHJfbGVuKQogewpAQCAtMTQ4Niw2ICsxNTAzLDcgQEAKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl9ubCAqbmxhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9ubCAqKWFkZHI7CiAJaW50IGVycjsKKwlsb25nIHVuc2lnbmVkIGludCBncm91cHMgPSBubGFkZHItPm5sX2dyb3VwczsKIAogCWlmIChhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0OTQsNyArMTUxMiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogT25seSBzdXBlcnVzZXIgaXMgYWxsb3dlZCB0byBsaXN0ZW4gbXVsdGljYXN0cyAqLwotCWlmIChubGFkZHItPm5sX2dyb3VwcykgeworCWlmIChncm91cHMpIHsKIAkJaWYgKCFuZXRsaW5rX2FsbG93ZWQoc29jaywgTkxfQ0ZHX0ZfTk9OUk9PVF9SRUNWKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCWVyciA9IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc2spOwpAQCAtMTUwMiwzNyArMTUyMCw0NSBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAobmxrLT5wb3J0aWQpIHsKKwlpZiAobmxrLT5wb3J0aWQpCiAJCWlmIChubGFkZHItPm5sX3BpZCAhPSBubGstPnBvcnRpZCkKIAkJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7CisKKwlpZiAobmxrLT5uZXRsaW5rX2JpbmQgJiYgZ3JvdXBzKSB7CisJCWludCBncm91cDsKKworCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBubGstPm5ncm91cHM7IGdyb3VwKyspIHsKKwkJCWlmICghdGVzdF9iaXQoZ3JvdXAsICZncm91cHMpKQorCQkJCWNvbnRpbnVlOworCQkJZXJyID0gbmxrLT5uZXRsaW5rX2JpbmQoZ3JvdXApOworCQkJaWYgKCFlcnIpCisJCQkJY29udGludWU7CisJCQluZXRsaW5rX3VuYmluZChncm91cCwgZ3JvdXBzLCBubGspOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWlmICghbmxrLT5wb3J0aWQpIHsKIAkJZXJyID0gbmxhZGRyLT5ubF9waWQgPwogCQkJbmV0bGlua19pbnNlcnQoc2ssIG5ldCwgbmxhZGRyLT5ubF9waWQpIDoKIAkJCW5ldGxpbmtfYXV0b2JpbmQoc29jayk7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCW5ldGxpbmtfdW5iaW5kKG5say0+bmdyb3VwcyAtIDEsIGdyb3VwcywgbmxrKTsKIAkJCXJldHVybiBlcnI7CisJCX0KIAl9CiAKLQlpZiAoIW5sYWRkci0+bmxfZ3JvdXBzICYmIChubGstPmdyb3VwcyA9PSBOVUxMIHx8ICEodTMyKW5say0+Z3JvdXBzWzBdKSkKKwlpZiAoIWdyb3VwcyAmJiAobmxrLT5ncm91cHMgPT0gTlVMTCB8fCAhKHUzMilubGstPmdyb3Vwc1swXSkpCiAJCXJldHVybiAwOwogCiAJbmV0bGlua190YWJsZV9ncmFiKCk7CiAJbmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhzaywgbmxrLT5zdWJzY3JpcHRpb25zICsKLQkJCQkJIGh3ZWlnaHQzMihubGFkZHItPm5sX2dyb3VwcykgLQorCQkJCQkgaHdlaWdodDMyKGdyb3VwcykgLQogCQkJCQkgaHdlaWdodDMyKG5say0+Z3JvdXBzWzBdKSk7Ci0JbmxrLT5ncm91cHNbMF0gPSAobmxrLT5ncm91cHNbMF0gJiB+MHhmZmZmZmZmZlVMKSB8IG5sYWRkci0+bmxfZ3JvdXBzOworCW5say0+Z3JvdXBzWzBdID0gKG5say0+Z3JvdXBzWzBdICYgfjB4ZmZmZmZmZmZVTCkgfCBncm91cHM7CiAJbmV0bGlua191cGRhdGVfbGlzdGVuZXJzKHNrKTsKIAluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOwogCi0JaWYgKG5say0+bmV0bGlua19iaW5kICYmIG5say0+Z3JvdXBzWzBdKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBubGstPm5ncm91cHM7IGkrKykgewotCQkJaWYgKHRlc3RfYml0KGksIG5say0+Z3JvdXBzKSkKLQkJCQlubGstPm5ldGxpbmtfYmluZChpKTsKLQkJfQotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0yMTcwLDEzICsyMTk2LDE3IEBACiAJCQlyZXR1cm4gZXJyOwogCQlpZiAoIXZhbCB8fCB2YWwgLSAxID49IG5say0+bmdyb3VwcykKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAob3B0bmFtZSA9PSBORVRMSU5LX0FERF9NRU1CRVJTSElQICYmIG5say0+bmV0bGlua19iaW5kKSB7CisJCQllcnIgPSBubGstPm5ldGxpbmtfYmluZCh2YWwpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCW5ldGxpbmtfdGFibGVfZ3JhYigpOwogCQluZXRsaW5rX3VwZGF0ZV9zb2NrZXRfbWMobmxrLCB2YWwsCiAJCQkJCSBvcHRuYW1lID09IE5FVExJTktfQUREX01FTUJFUlNISVApOwogCQluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOwotCi0JCWlmIChubGstPm5ldGxpbmtfYmluZCkKLQkJCW5say0+bmV0bGlua19iaW5kKHZhbCk7CisJCWlmIChvcHRuYW1lID09IE5FVExJTktfRFJPUF9NRU1CRVJTSElQICYmIG5say0+bmV0bGlua191bmJpbmQpCisJCQlubGstPm5ldGxpbmtfdW5iaW5kKHZhbCk7CiAKIAkJZXJyID0gMDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmggYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmgKaW5kZXggZWQxM2E3OS4uMGI1OWQ0NCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5oCisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuaApAQCAtMzgsNyArMzgsOCBAQAogCXN0cnVjdCBtdXRleAkJKmNiX211dGV4OwogCXN0cnVjdCBtdXRleAkJY2JfZGVmX211dGV4OwogCXZvaWQJCQkoKm5ldGxpbmtfcmN2KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQl2b2lkCQkJKCpuZXRsaW5rX2JpbmQpKGludCBncm91cCk7CisJaW50CQkJKCpuZXRsaW5rX2JpbmQpKGludCBncm91cCk7CisJdm9pZAkJCSgqbmV0bGlua191bmJpbmQpKGludCBncm91cCk7CiAJc3RydWN0IG1vZHVsZQkJKm1vZHVsZTsKICNpZmRlZiBDT05GSUdfTkVUTElOS19NTUFQCiAJc3RydWN0IG11dGV4CQlwZ192ZWNfbG9jazsKQEAgLTc0LDcgKzc1LDggQEAKIAl1bnNpZ25lZCBpbnQJCWdyb3VwczsKIAlzdHJ1Y3QgbXV0ZXgJCSpjYl9tdXRleDsKIAlzdHJ1Y3QgbW9kdWxlCQkqbW9kdWxlOwotCXZvaWQJCQkoKmJpbmQpKGludCBncm91cCk7CisJaW50CQkJKCpiaW5kKShpbnQgZ3JvdXApOworCXZvaWQJCQkoKnVuYmluZCkoaW50IGdyb3VwKTsKIAlib29sCQkJKCpjb21wYXJlKShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzb2NrKTsKIAlpbnQJCQlyZWdpc3RlcmVkOwogfTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKaW5kZXggYTNiYTNjYS4uNzYzOTNmMiAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBnZW5sX3ZhbGlkYXRlX29wcyhzdHJ1Y3QgZ2VubF9mYW1pbHkgKmZhbWlseSkKK3N0YXRpYyBpbnQgZ2VubF92YWxpZGF0ZV9vcHMoY29uc3Qgc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHkpCiB7CiAJY29uc3Qgc3RydWN0IGdlbmxfb3BzICpvcHMgPSBmYW1pbHktPm9wczsKIAl1bnNpZ25lZCBpbnQgbl9vcHMgPSBmYW1pbHktPm5fb3BzOwpAQCAtMzM3LDEwICszMzcsNiBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIGZhbWlseSBpcyBub3QgcmVnaXN0ZXJlZCB5ZXQsIHNvIG5vIGxvY2tpbmcgbmVlZGVkICovCi0JZmFtaWx5LT5vcHMgPSBvcHM7Ci0JZmFtaWx5LT5uX29wcyA9IG5fb3BzOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvZGlnaXRhbC5oIGIvbmV0L25mYy9kaWdpdGFsLmgKaW5kZXggMzc1OWFkZC4uNzFhZDdlZSAxMDA2NDQKLS0tIGEvbmV0L25mYy9kaWdpdGFsLmgKKysrIGIvbmV0L25mYy9kaWdpdGFsLmgKQEAgLTcxLDYgKzcxLDcgQEAKIHZvaWQgZGlnaXRhbF9wb2xsX25leHRfdGVjaChzdHJ1Y3QgbmZjX2RpZ2l0YWxfZGV2ICpkZGV2KTsKIAogaW50IGRpZ2l0YWxfaW5fc2VuZF9zZW5zX3JlcShzdHJ1Y3QgbmZjX2RpZ2l0YWxfZGV2ICpkZGV2LCB1OCByZl90ZWNoKTsKK2ludCBkaWdpdGFsX2luX3NlbmRfc2Vuc2JfcmVxKHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsIHU4IHJmX3RlY2gpOwogaW50IGRpZ2l0YWxfaW5fc2VuZF9zZW5zZl9yZXEoc3RydWN0IG5mY19kaWdpdGFsX2RldiAqZGRldiwgdTggcmZfdGVjaCk7CiBpbnQgZGlnaXRhbF9pbl9zZW5kX2lzbzE1NjkzX2ludl9yZXEoc3RydWN0IG5mY19kaWdpdGFsX2RldiAqZGRldiwgdTggcmZfdGVjaCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvZGlnaXRhbF9jb3JlLmMgYi9uZXQvbmZjL2RpZ2l0YWxfY29yZS5jCmluZGV4IGUwMWUxNWQuLmE2Y2UzYzYgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvZGlnaXRhbF9jb3JlLmMKKysrIGIvbmV0L25mYy9kaWdpdGFsX2NvcmUuYwpAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBESUdJVEFMX1BST1RPX05GQ0FfUkZfVEVDSCBcCiAJKE5GQ19QUk9UT19KRVdFTF9NQVNLIHwgTkZDX1BST1RPX01JRkFSRV9NQVNLIHwgTkZDX1BST1RPX05GQ19ERVBfTUFTSykKIAorI2RlZmluZSBESUdJVEFMX1BST1RPX05GQ0JfUkZfVEVDSAlORkNfUFJPVE9fSVNPMTQ0NDNfQl9NQVNLCisKICNkZWZpbmUgRElHSVRBTF9QUk9UT19ORkNGX1JGX1RFQ0ggXAogCShORkNfUFJPVE9fRkVMSUNBX01BU0sgfCBORkNfUFJPVE9fTkZDX0RFUF9NQVNLKQogCkBAIC0zNDUsNiArMzQ3LDEyIEBACiAJCWFkZF9jcmMgPSBkaWdpdGFsX3NrYl9hZGRfY3JjX2E7CiAJCWJyZWFrOwogCisJY2FzZSBORkNfUFJPVE9fSVNPMTQ0NDNfQjoKKwkJZnJhbWluZyA9IE5GQ19ESUdJVEFMX0ZSQU1JTkdfTkZDQl9UNFQ7CisJCWNoZWNrX2NyYyA9IGRpZ2l0YWxfc2tiX2NoZWNrX2NyY19iOworCQlhZGRfY3JjID0gZGlnaXRhbF9za2JfYWRkX2NyY19iOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXByX2VycigiSW52YWxpZCBwcm90b2NvbCAlZFxuIiwgcHJvdG9jb2wpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3OCw2ICszODYsOCBAQAogCiB2b2lkIGRpZ2l0YWxfcG9sbF9uZXh0X3RlY2goc3RydWN0IG5mY19kaWdpdGFsX2RldiAqZGRldikKIHsKKwl1OCByYW5kX21vZDsKKwogCWRpZ2l0YWxfc3dpdGNoX3JmKGRkZXYsIDApOwogCiAJbXV0ZXhfbG9jaygmZGRldi0+cG9sbF9sb2NrKTsKQEAgLTM4Nyw4ICszOTcsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JZGRldi0+cG9sbF90ZWNoX2luZGV4ID0gKGRkZXYtPnBvbGxfdGVjaF9pbmRleCArIDEpICUKLQkJCQlkZGV2LT5wb2xsX3RlY2hfY291bnQ7CisJZ2V0X3JhbmRvbV9ieXRlcygmcmFuZF9tb2QsIHNpemVvZihyYW5kX21vZCkpOworCWRkZXYtPnBvbGxfdGVjaF9pbmRleCA9IHJhbmRfbW9kICUgZGRldi0+cG9sbF90ZWNoX2NvdW50OwogCiAJbXV0ZXhfdW5sb2NrKCZkZGV2LT5wb2xsX2xvY2spOwogCkBAIC00NzUsNiArNDg1LDEwIEBACiAJCWRpZ2l0YWxfYWRkX3BvbGxfdGVjaChkZGV2LCBORkNfRElHSVRBTF9SRl9URUNIXzEwNkEsCiAJCQkJICAgICAgZGlnaXRhbF9pbl9zZW5kX3NlbnNfcmVxKTsKIAorCWlmIChtYXRjaGluZ19pbV9wcm90b2NvbHMgJiBESUdJVEFMX1BST1RPX05GQ0JfUkZfVEVDSCkKKwkJZGlnaXRhbF9hZGRfcG9sbF90ZWNoKGRkZXYsIE5GQ19ESUdJVEFMX1JGX1RFQ0hfMTA2QiwKKwkJCQkgICAgICBkaWdpdGFsX2luX3NlbmRfc2Vuc2JfcmVxKTsKKwogCWlmIChtYXRjaGluZ19pbV9wcm90b2NvbHMgJiBESUdJVEFMX1BST1RPX05GQ0ZfUkZfVEVDSCkgewogCQlkaWdpdGFsX2FkZF9wb2xsX3RlY2goZGRldiwgTkZDX0RJR0lUQUxfUkZfVEVDSF8yMTJGLAogCQkJCSAgICAgIGRpZ2l0YWxfaW5fc2VuZF9zZW5zZl9yZXEpOwpAQCAtNjM1LDcgKzY0OSw4IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoZGRldi0+Y3Vycl9wcm90b2NvbCA9PSBORkNfUFJPVE9fSVNPMTQ0NDMpIHsKKwlpZiAoKGRkZXYtPmN1cnJfcHJvdG9jb2wgPT0gTkZDX1BST1RPX0lTTzE0NDQzKSB8fAorCSAgICAoZGRldi0+Y3Vycl9wcm90b2NvbCA9PSBORkNfUFJPVE9fSVNPMTQ0NDNfQikpIHsKIAkJcmMgPSBkaWdpdGFsX2luX2lzb19kZXBfcHVsbF9zb2QoZGRldiwgcmVzcCk7CiAJCWlmIChyYykKIAkJCWdvdG8gZG9uZTsKQEAgLTY3Niw3ICs2OTEsOCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKGRkZXYtPmN1cnJfcHJvdG9jb2wgPT0gTkZDX1BST1RPX0lTTzE0NDQzKSB7CisJaWYgKChkZGV2LT5jdXJyX3Byb3RvY29sID09IE5GQ19QUk9UT19JU08xNDQ0MykgfHwKKwkgICAgKGRkZXYtPmN1cnJfcHJvdG9jb2wgPT0gTkZDX1BST1RPX0lTTzE0NDQzX0IpKSB7CiAJCXJjID0gZGlnaXRhbF9pbl9pc29fZGVwX3B1c2hfc29kKGRkZXYsIHNrYik7CiAJCWlmIChyYykKIAkJCWdvdG8gZXhpdDsKQEAgLTc0Nyw2ICs3NjMsOCBAQAogCQlkZGV2LT5wcm90b2NvbHMgfD0gTkZDX1BST1RPX0lTTzE1NjkzX01BU0s7CiAJaWYgKHN1cHBvcnRlZF9wcm90b2NvbHMgJiBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSykKIAkJZGRldi0+cHJvdG9jb2xzIHw9IE5GQ19QUk9UT19JU08xNDQ0M19NQVNLOworCWlmIChzdXBwb3J0ZWRfcHJvdG9jb2xzICYgTkZDX1BST1RPX0lTTzE0NDQzX0JfTUFTSykKKwkJZGRldi0+cHJvdG9jb2xzIHw9IE5GQ19QUk9UT19JU08xNDQ0M19CX01BU0s7CiAKIAlkZGV2LT50eF9oZWFkcm9vbSA9IHR4X2hlYWRyb29tICsgRElHSVRBTF9NQVhfSEVBREVSX0xFTjsKIAlkZGV2LT50eF90YWlscm9vbSA9IHR4X3RhaWxyb29tICsgRElHSVRBTF9DUkNfTEVOOwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9kaWdpdGFsX2RlcC5jIGIvbmV0L25mYy9kaWdpdGFsX2RlcC5jCmluZGV4IGQ0ZWQyNWYuLjE3MWNiOTkgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvZGlnaXRhbF9kZXAuYworKysgYi9uZXQvbmZjL2RpZ2l0YWxfZGVwLmMKQEAgLTIyNCw5ICsyMjQsOCBAQAogCiAJZGRldi0+c2tiX2FkZF9jcmMoc2tiKTsKIAotCWRpZ2l0YWxfaW5fc2VuZF9jbWQoZGRldiwgc2tiLCA1MDAsIGRpZ2l0YWxfaW5fcmVjdl9hdHJfcmVzLCB0YXJnZXQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRpZ2l0YWxfaW5fc2VuZF9jbWQoZGRldiwgc2tiLCA1MDAsIGRpZ2l0YWxfaW5fcmVjdl9hdHJfcmVzLAorCQkJCSAgIHRhcmdldCk7CiB9CiAKIHN0YXRpYyBpbnQgZGlnaXRhbF9pbl9zZW5kX3J0b3goc3RydWN0IG5mY19kaWdpdGFsX2RldiAqZGRldiwKZGlmZiAtLWdpdCBhL25ldC9uZmMvZGlnaXRhbF90ZWNobm9sb2d5LmMgYi9uZXQvbmZjL2RpZ2l0YWxfdGVjaG5vbG9neS5jCmluZGV4IDI3OGMzZmUuLmMyYzFjMDE4IDEwMDY0NAotLS0gYS9uZXQvbmZjL2RpZ2l0YWxfdGVjaG5vbG9neS5jCisrKyBiL25ldC9uZmMvZGlnaXRhbF90ZWNobm9sb2d5LmMKQEAgLTQxLDYgKzQxLDI0IEBACiAjZGVmaW5lIERJR0lUQUxfTUlGQVJFX1JFQURfUkVTX0xFTiAxNgogI2RlZmluZSBESUdJVEFMX01JRkFSRV9BQ0tfUkVTCTB4MEEKIAorI2RlZmluZSBESUdJVEFMX0NNRF9TRU5TQl9SRVEJCQkweDA1CisjZGVmaW5lIERJR0lUQUxfU0VOU0JfQURWQU5DRUQJCQlCSVQoNSkKKyNkZWZpbmUgRElHSVRBTF9TRU5TQl9FWFRFTkRFRAkJCUJJVCg0KQorI2RlZmluZSBESUdJVEFMX1NFTlNCX0FMTEJfUkVRCQkJQklUKDMpCisjZGVmaW5lIERJR0lUQUxfU0VOU0JfTihuKQkJCSgobikgJiAweDcpCisKKyNkZWZpbmUgRElHSVRBTF9DTURfU0VOU0JfUkVTCQkJMHg1MAorCisjZGVmaW5lIERJR0lUQUxfQ01EX0FUVFJJQl9SRVEJCQkweDFECisjZGVmaW5lIERJR0lUQUxfQVRUUklCX1AxX1RSMF9ERUZBVUxUCQkoMHgwIDw8IDYpCisjZGVmaW5lIERJR0lUQUxfQVRUUklCX1AxX1RSMV9ERUZBVUxUCQkoMHgwIDw8IDQpCisjZGVmaW5lIERJR0lUQUxfQVRUUklCX1AxX1NVUFJFU1NfRU9TCQlCSVQoMykKKyNkZWZpbmUgRElHSVRBTF9BVFRSSUJfUDFfU1VQUkVTU19TT1MJCUJJVCgyKQorI2RlZmluZSBESUdJVEFMX0FUVFJJQl9QMl9MSVNURU5fUE9MTF8xCQkoMHgwIDw8IDYpCisjZGVmaW5lIERJR0lUQUxfQVRUUklCX1AyX1BPTExfTElTVEVOXzEJCSgweDAgPDwgNCkKKyNkZWZpbmUgRElHSVRBTF9BVFRSSUJfUDJfTUFYX0ZSQU1FXzI1NgkJMHg4CisjZGVmaW5lIERJR0lUQUxfQVRUUklCX1A0X0RJRChuKQkJKChuKSAmIDB4ZikKKwogI2RlZmluZSBESUdJVEFMX0NNRF9TRU5TRl9SRVEJMHgwMAogI2RlZmluZSBESUdJVEFMX0NNRF9TRU5TRl9SRVMJMHgwMQogCkBAIC03NSw2ICs5Myw3IEBACiB9OwogCiAjZGVmaW5lIERJR0lUQUxfQVRTX0ZTQ0kodDApICgodDApICYgMHgwRikKKyNkZWZpbmUgRElHSVRBTF9TRU5TQl9GU0NJKHBpMikgKCgocGkyKSAmIDB4RjApID4+IDQpCiAjZGVmaW5lIERJR0lUQUxfQVRTX01BWF9GU0MgIDI1NgogCiAjZGVmaW5lIERJR0lUQUxfUkFUU19CWVRFMSAweEUwCkBAIC05Miw2ICsxMTEsMzIgQEAKIAl1OCBiY2M7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgZGlnaXRhbF9zZW5zYl9yZXEgeworCXU4IGNtZDsKKwl1OCBhZmk7CisJdTggcGFyYW07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZGlnaXRhbF9zZW5zYl9yZXMgeworCXU4IGNtZDsKKwl1OCBuZmNpZDBbNF07CisJdTggYXBwX2RhdGFbNF07CisJdTggcHJvdG9faW5mb1szXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkaWdpdGFsX2F0dHJpYl9yZXEgeworCXU4IGNtZDsKKwl1OCBuZmNpZDBbNF07CisJdTggcGFyYW0xOworCXU4IHBhcmFtMjsKKwl1OCBwYXJhbTM7CisJdTggcGFyYW00OworfSBfX3BhY2tlZDsKKworc3RydWN0IGRpZ2l0YWxfYXR0cmliX3JlcyB7CisJdTggbWJsaV9kaWQ7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgZGlnaXRhbF9zZW5zZl9yZXEgewogCXU4IGNtZDsKIAl1OCBzYzE7CkBAIC01MzEsNiArNTc2LDE3NSBAQAogCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgdm9pZCBkaWdpdGFsX2luX3JlY3ZfYXR0cmliX3JlcyhzdHJ1Y3QgbmZjX2RpZ2l0YWxfZGV2ICpkZGV2LCB2b2lkICphcmcsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpyZXNwKQoreworCXN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXQgPSBhcmc7CisJc3RydWN0IGRpZ2l0YWxfYXR0cmliX3JlcyAqYXR0cmliX3JlczsKKwlpbnQgcmM7CisKKwlpZiAoSVNfRVJSKHJlc3ApKSB7CisJCXJjID0gUFRSX0VSUihyZXNwKTsKKwkJcmVzcCA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAocmVzcC0+bGVuIDwgc2l6ZW9mKCphdHRyaWJfcmVzKSkgeworCQlQUk9UT0NPTF9FUlIoIjEyLjYuMiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhdHRyaWJfcmVzID0gKHN0cnVjdCBkaWdpdGFsX2F0dHJpYl9yZXMgKilyZXNwLT5kYXRhOworCisJaWYgKGF0dHJpYl9yZXMtPm1ibGlfZGlkICYgMHgwZikgeworCQlQUk9UT0NPTF9FUlIoIjEyLjYuMi4xIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKworCXJjID0gZGlnaXRhbF90YXJnZXRfZm91bmQoZGRldiwgdGFyZ2V0LCBORkNfUFJPVE9fSVNPMTQ0NDNfQik7CisKK2V4aXQ6CisJZGV2X2tmcmVlX3NrYihyZXNwKTsKKwlrZnJlZSh0YXJnZXQpOworCisJaWYgKHJjKQorCQlkaWdpdGFsX3BvbGxfbmV4dF90ZWNoKGRkZXYpOworfQorCitzdGF0aWMgaW50IGRpZ2l0YWxfaW5fc2VuZF9hdHRyaWJfcmVxKHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsCisJCQkgICAgICAgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldCwKKwkJCSAgICAgICBzdHJ1Y3QgZGlnaXRhbF9zZW5zYl9yZXMgKnNlbnNiX3JlcykKK3sKKwlzdHJ1Y3QgZGlnaXRhbF9hdHRyaWJfcmVxICphdHRyaWJfcmVxOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjOworCisJc2tiID0gZGlnaXRhbF9za2JfYWxsb2MoZGRldiwgc2l6ZW9mKCphdHRyaWJfcmVxKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJYXR0cmliX3JlcSA9IChzdHJ1Y3QgZGlnaXRhbF9hdHRyaWJfcmVxICopc2tiX3B1dChza2IsCisJCQkJCQkJICBzaXplb2YoKmF0dHJpYl9yZXEpKTsKKworCWF0dHJpYl9yZXEtPmNtZCA9IERJR0lUQUxfQ01EX0FUVFJJQl9SRVE7CisJbWVtY3B5KGF0dHJpYl9yZXEtPm5mY2lkMCwgc2Vuc2JfcmVzLT5uZmNpZDAsCisJICAgICAgIHNpemVvZihhdHRyaWJfcmVxLT5uZmNpZDApKTsKKwlhdHRyaWJfcmVxLT5wYXJhbTEgPSBESUdJVEFMX0FUVFJJQl9QMV9UUjBfREVGQVVMVCB8CisJCQkgICAgIERJR0lUQUxfQVRUUklCX1AxX1RSMV9ERUZBVUxUOworCWF0dHJpYl9yZXEtPnBhcmFtMiA9IERJR0lUQUxfQVRUUklCX1AyX0xJU1RFTl9QT0xMXzEgfAorCQkJICAgICBESUdJVEFMX0FUVFJJQl9QMl9QT0xMX0xJU1RFTl8xIHwKKwkJCSAgICAgRElHSVRBTF9BVFRSSUJfUDJfTUFYX0ZSQU1FXzI1NjsKKwlhdHRyaWJfcmVxLT5wYXJhbTMgPSBzZW5zYl9yZXMtPnByb3RvX2luZm9bMV0gJiAweDA3OworCWF0dHJpYl9yZXEtPnBhcmFtNCA9IERJR0lUQUxfQVRUUklCX1A0X0RJRCgwKTsKKworCXJjID0gZGlnaXRhbF9pbl9zZW5kX2NtZChkZGV2LCBza2IsIDMwLCBkaWdpdGFsX2luX3JlY3ZfYXR0cmliX3JlcywKKwkJCQkgdGFyZ2V0KTsKKwlpZiAocmMpCisJCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkaWdpdGFsX2luX3JlY3Zfc2Vuc2JfcmVzKHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsIHZvaWQgKmFyZywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmZjX3RhcmdldCAqdGFyZ2V0ID0gTlVMTDsKKwlzdHJ1Y3QgZGlnaXRhbF9zZW5zYl9yZXMgKnNlbnNiX3JlczsKKwl1OCBmc2NpOworCWludCByYzsKKworCWlmIChJU19FUlIocmVzcCkpIHsKKwkJcmMgPSBQVFJfRVJSKHJlc3ApOworCQlyZXNwID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChyZXNwLT5sZW4gIT0gc2l6ZW9mKCpzZW5zYl9yZXMpKSB7CisJCVBST1RPQ09MX0VSUigiNS42LjIuMSIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzZW5zYl9yZXMgPSAoc3RydWN0IGRpZ2l0YWxfc2Vuc2JfcmVzICopcmVzcC0+ZGF0YTsKKworCWlmIChzZW5zYl9yZXMtPmNtZCAhPSBESUdJVEFMX0NNRF9TRU5TQl9SRVMpIHsKKwkJUFJPVE9DT0xfRVJSKCI1LjYuMiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIShzZW5zYl9yZXMtPnByb3RvX2luZm9bMV0gJiBCSVQoMCkpKSB7CisJCVBST1RPQ09MX0VSUigiNS42LjIuMTIiKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHNlbnNiX3Jlcy0+cHJvdG9faW5mb1sxXSAmIEJJVCgzKSkgeworCQlQUk9UT0NPTF9FUlIoIjUuNi4yLjE2Iik7CisJCXJjID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKworCWZzY2kgPSBESUdJVEFMX1NFTlNCX0ZTQ0koc2Vuc2JfcmVzLT5wcm90b19pbmZvWzFdKTsKKwlpZiAoZnNjaSA+PSA4KQorCQlkZGV2LT50YXJnZXRfZnNjID0gRElHSVRBTF9BVFNfTUFYX0ZTQzsKKwllbHNlCisJCWRkZXYtPnRhcmdldF9mc2MgPSBkaWdpdGFsX2F0c19mc2NbZnNjaV07CisKKwl0YXJnZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmZjX3RhcmdldCksIEdGUF9LRVJORUwpOworCWlmICghdGFyZ2V0KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXJjID0gZGlnaXRhbF9pbl9zZW5kX2F0dHJpYl9yZXEoZGRldiwgdGFyZ2V0LCBzZW5zYl9yZXMpOworCitleGl0OgorCWRldl9rZnJlZV9za2IocmVzcCk7CisKKwlpZiAocmMpIHsKKwkJa2ZyZWUodGFyZ2V0KTsKKwkJZGlnaXRhbF9wb2xsX25leHRfdGVjaChkZGV2KTsKKwl9Cit9CisKK2ludCBkaWdpdGFsX2luX3NlbmRfc2Vuc2JfcmVxKHN0cnVjdCBuZmNfZGlnaXRhbF9kZXYgKmRkZXYsIHU4IHJmX3RlY2gpCit7CisJc3RydWN0IGRpZ2l0YWxfc2Vuc2JfcmVxICpzZW5zYl9yZXE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmM7CisKKwlyYyA9IGRpZ2l0YWxfaW5fY29uZmlndXJlX2h3KGRkZXYsIE5GQ19ESUdJVEFMX0NPTkZJR19SRl9URUNILAorCQkJCSAgICAgTkZDX0RJR0lUQUxfUkZfVEVDSF8xMDZCKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZGlnaXRhbF9pbl9jb25maWd1cmVfaHcoZGRldiwgTkZDX0RJR0lUQUxfQ09ORklHX0ZSQU1JTkcsCisJCQkJICAgICBORkNfRElHSVRBTF9GUkFNSU5HX05GQ0IpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2tiID0gZGlnaXRhbF9za2JfYWxsb2MoZGRldiwgc2l6ZW9mKCpzZW5zYl9yZXEpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZW5zYl9yZXEgPSAoc3RydWN0IGRpZ2l0YWxfc2Vuc2JfcmVxICopc2tiX3B1dChza2IsCisJCQkJCQkJc2l6ZW9mKCpzZW5zYl9yZXEpKTsKKworCXNlbnNiX3JlcS0+Y21kID0gRElHSVRBTF9DTURfU0VOU0JfUkVROworCXNlbnNiX3JlcS0+YWZpID0gMHgwMDsgLyogQWxsIGZhbWlsaWVzIGFuZCBzdWItZmFtaWxpZXMgKi8KKwlzZW5zYl9yZXEtPnBhcmFtID0gRElHSVRBTF9TRU5TQl9OKDApOworCisJcmMgPSBkaWdpdGFsX2luX3NlbmRfY21kKGRkZXYsIHNrYiwgMzAsIGRpZ2l0YWxfaW5fcmVjdl9zZW5zYl9yZXMsCisJCQkJIE5VTEwpOworCWlmIChyYykKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyB2b2lkIGRpZ2l0YWxfaW5fcmVjdl9zZW5zZl9yZXMoc3RydWN0IG5mY19kaWdpdGFsX2RldiAqZGRldiwgdm9pZCAqYXJnLAogCQkJCSAgIHN0cnVjdCBza19idWZmICpyZXNwKQogewpAQCAtODc3LDYgKzEwOTEsMTggQEAKIAlkZXZfa2ZyZWVfc2tiKHJlc3ApOwogfQogCitzdGF0aWMgdm9pZCBkaWdpdGFsX3RnX3JlY3ZfYXRyX29yX3NlbnNmX3JlcShzdHJ1Y3QgbmZjX2RpZ2l0YWxfZGV2ICpkZGV2LAorCQl2b2lkICphcmcsIHN0cnVjdCBza19idWZmICpyZXNwKQoreworCWlmICghSVNfRVJSKHJlc3ApICYmIChyZXNwLT5sZW4gPj0gMikgJiYKKwkJCShyZXNwLT5kYXRhWzFdID09IERJR0lUQUxfQ01EX1NFTlNGX1JFUSkpCisJCWRpZ2l0YWxfdGdfcmVjdl9zZW5zZl9yZXEoZGRldiwgYXJnLCByZXNwKTsKKwllbHNlCisJCWRpZ2l0YWxfdGdfcmVjdl9hdHJfcmVxKGRkZXYsIGFyZywgcmVzcCk7CisKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBpbnQgZGlnaXRhbF90Z19zZW5kX3NlbnNmX3JlcyhzdHJ1Y3QgbmZjX2RpZ2l0YWxfZGV2ICpkZGV2LAogCQkJICAgICAgc3RydWN0IGRpZ2l0YWxfc2Vuc2ZfcmVxICpzZW5zZl9yZXEpCiB7CkBAIC04ODcsNyArMTExMyw3IEBACiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBkaWdpdGFsX3NlbnNmX3Jlcyk7CiAKLQlpZiAoc2Vuc2ZfcmVxLT5yYyAhPSBESUdJVEFMX1NFTlNGX1JFUV9SQ19OT05FKQorCWlmIChzZW5zZl9yZXEtPnJjID09IERJR0lUQUxfU0VOU0ZfUkVRX1JDX05PTkUpCiAJCXNpemUgLT0gc2l6ZW9mKHNlbnNmX3Jlcy0+cmQpOwogCiAJc2tiID0gZGlnaXRhbF9za2JfYWxsb2MoZGRldiwgc2l6ZSk7CkBAIC05MjIsNyArMTE0OCw3IEBACiAJCWRpZ2l0YWxfc2tiX2FkZF9jcmNfZihza2IpOwogCiAJcmMgPSBkaWdpdGFsX3RnX3NlbmRfY21kKGRkZXYsIHNrYiwgMzAwLAotCQkJCSBkaWdpdGFsX3RnX3JlY3ZfYXRyX3JlcSwgTlVMTCk7CisJCQkJIGRpZ2l0YWxfdGdfcmVjdl9hdHJfb3Jfc2Vuc2ZfcmVxLCBOVUxMKTsKIAlpZiAocmMpCiAJCWtmcmVlX3NrYihza2IpOwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL2hjaS9jb21tYW5kLmMgYi9uZXQvbmZjL2hjaS9jb21tYW5kLmMKaW5kZXggYTlmNGQyZS4uNjc3ZDI0YiAxMDA2NDQKLS0tIGEvbmV0L25mYy9oY2kvY29tbWFuZC5jCisrKyBiL25ldC9uZmMvaGNpL2NvbW1hbmQuYwpAQCAtMjYsNiArMjYsOCBAQAogCiAjaW5jbHVkZSAiaGNpLmgiCiAKKyNkZWZpbmUgTUFYX0ZXSSA0OTQ5CisKIHN0YXRpYyBpbnQgbmZjX2hjaV9leGVjdXRlX2NtZF9hc3luYyhzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsIHU4IHBpcGUsIHU4IGNtZCwKIAkJCSAgICAgICBjb25zdCB1OCAqcGFyYW0sIHNpemVfdCBwYXJhbV9sZW4sCiAJCQkgICAgICAgZGF0YV9leGNoYW5nZV9jYl90IGNiLCB2b2lkICpjYl9jb250ZXh0KQpAQCAtMzcsNyArMzksNyBAQAogCSAqIGZvciBhbGwgY29tbWFuZHM/CiAJICovCiAJcmV0dXJuIG5mY19oY2lfaGNwX21lc3NhZ2VfdHgoaGRldiwgcGlwZSwgTkZDX0hDSV9IQ1BfQ09NTUFORCwgY21kLAotCQkJCSAgICAgIHBhcmFtLCBwYXJhbV9sZW4sIGNiLCBjYl9jb250ZXh0LCAzMDAwKTsKKwkJCQkgICAgICBwYXJhbSwgcGFyYW1fbGVuLCBjYiwgY2JfY29udGV4dCwgTUFYX0ZXSSk7CiB9CiAKIC8qCkBAIC04Miw3ICs4NCw3IEBACiAJCQkJCQkgICAgTkZDX0hDSV9IQ1BfQ09NTUFORCwgY21kLAogCQkJCQkJICAgIHBhcmFtLCBwYXJhbV9sZW4sCiAJCQkJCQkgICAgbmZjX2hjaV9leGVjdXRlX2NiLCAmaGNwX2V3LAotCQkJCQkJICAgIDMwMDApOworCQkJCQkJICAgIE1BWF9GV0kpOwogCWlmIChoY3BfZXcuZXhlY19yZXN1bHQgPCAwKQogCQlyZXR1cm4gaGNwX2V3LmV4ZWNfcmVzdWx0OwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL2hjaS9jb3JlLmMgYi9uZXQvbmZjL2hjaS9jb3JlLmMKaW5kZXggZDQ1YjYzOC4uNDc0MDM3MCAxMDA2NDQKLS0tIGEvbmV0L25mYy9oY2kvY29yZS5jCisrKyBiL25ldC9uZmMvaGNpL2NvcmUuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAotCQl0YXJnZXRzLT5zZW5zX3JlcyA9IGJlMTZfdG9fY3B1KCoodTE2ICopYXRxYV9za2ItPmRhdGEpOworCQl0YXJnZXRzLT5zZW5zX3JlcyA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopYXRxYV9za2ItPmRhdGEpOwogCQl0YXJnZXRzLT5zZWxfcmVzID0gc2FrX3NrYi0+ZGF0YVswXTsKIAogCQlyID0gbmZjX2hjaV9nZXRfcGFyYW0oaGRldiwgTkZDX0hDSV9SRl9SRUFERVJfQV9HQVRFLApAQCAtMzgwLDM0ICszODAsMzEgQEAKIAlpZiAociA8IDApCiAJCWdvdG8gZGlzY29ubmVjdF9hbGw7CiAKLQlpZiAoc2tiLT5sZW4gJiYgc2tiLT5sZW4gPT0gc3RybGVuKGhkZXYtPmluaXRfZGF0YS5zZXNzaW9uX2lkKSkKLQkJaWYgKG1lbWNtcChoZGV2LT5pbml0X2RhdGEuc2Vzc2lvbl9pZCwgc2tiLT5kYXRhLAotCQkJICAgc2tiLT5sZW4pID09IDApIHsKLQkJCS8qIFRPRE8gRUxhOiByZXN0b3JlIGdhdGU8LT5waXBlIHRhYmxlIGZyb20KLQkJCSAqIHNvbWUgVEJEIGxvY2F0aW9uLgotCQkJICogbm90ZTogaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGdldCB0aGUgY2hpcAotCQkJICogY3VycmVudGx5IG9wZW4gZ2F0ZS9waXBlIHRhYmxlLgotCQkJICogSXQgaXMgb25seSBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIHN1cHBvcnRlZAotCQkJICogZ2F0ZSBsaXN0LgotCQkJICovCisJaWYgKHNrYi0+bGVuICYmIHNrYi0+bGVuID09IHN0cmxlbihoZGV2LT5pbml0X2RhdGEuc2Vzc2lvbl9pZCkgJiYKKwkJKG1lbWNtcChoZGV2LT5pbml0X2RhdGEuc2Vzc2lvbl9pZCwgc2tiLT5kYXRhLAorCQkJICAgc2tiLT5sZW4pID09IDApICYmIGhkZXYtPm9wcy0+bG9hZF9zZXNzaW9uKSB7CisJCS8qIFJlc3RvcmUgZ2F0ZTwtPnBpcGUgdGFibGUgZnJvbSBzb21lIHByb3ByaWV0YXJ5IGxvY2F0aW9uLiAqLwogCi0JCQkvKiBnb3RvIGV4aXQKLQkJCSAqIEZvciBub3csIGFsd2F5cyBkbyBhIGZ1bGwgaW5pdGlhbGl6YXRpb24gKi8KLQkJfQorCQlyID0gaGRldi0+b3BzLT5sb2FkX3Nlc3Npb24oaGRldik7CiAKLQlyID0gbmZjX2hjaV9kaXNjb25uZWN0X2FsbF9nYXRlcyhoZGV2KTsKLQlpZiAociA8IDApCi0JCWdvdG8gZXhpdDsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBkaXNjb25uZWN0X2FsbDsKKwl9IGVsc2UgewogCi0JciA9IGhjaV9kZXZfY29ubmVjdF9nYXRlcyhoZGV2LCBoZGV2LT5pbml0X2RhdGEuZ2F0ZV9jb3VudCwKLQkJCQkgIGhkZXYtPmluaXRfZGF0YS5nYXRlcyk7Ci0JaWYgKHIgPCAwKQotCQlnb3RvIGRpc2Nvbm5lY3RfYWxsOworCQlyID0gbmZjX2hjaV9kaXNjb25uZWN0X2FsbF9nYXRlcyhoZGV2KTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBleGl0OwogCi0JciA9IG5mY19oY2lfc2V0X3BhcmFtKGhkZXYsIE5GQ19IQ0lfQURNSU5fR0FURSwKLQkJCSAgICAgIE5GQ19IQ0lfQURNSU5fU0VTU0lPTl9JREVOVElUWSwKLQkJCSAgICAgIGhkZXYtPmluaXRfZGF0YS5zZXNzaW9uX2lkLAotCQkJICAgICAgc3RybGVuKGhkZXYtPmluaXRfZGF0YS5zZXNzaW9uX2lkKSk7CisJCXIgPSBoY2lfZGV2X2Nvbm5lY3RfZ2F0ZXMoaGRldiwgaGRldi0+aW5pdF9kYXRhLmdhdGVfY291bnQsCisJCQkJCSAgaGRldi0+aW5pdF9kYXRhLmdhdGVzKTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBkaXNjb25uZWN0X2FsbDsKKworCQlyID0gbmZjX2hjaV9zZXRfcGFyYW0oaGRldiwgTkZDX0hDSV9BRE1JTl9HQVRFLAorCQkJCU5GQ19IQ0lfQURNSU5fU0VTU0lPTl9JREVOVElUWSwKKwkJCQloZGV2LT5pbml0X2RhdGEuc2Vzc2lvbl9pZCwKKwkJCQlzdHJsZW4oaGRldi0+aW5pdF9kYXRhLnNlc3Npb25faWQpKTsKKwl9CiAJaWYgKHIgPT0gMCkKIAkJZ290byBleGl0OwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3BfY29tbWFuZHMuYyBiL25ldC9uZmMvbGxjcF9jb21tYW5kcy5jCmluZGV4IGJlYzZlZDEuLmEzYWQ2OWEgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbGxjcF9jb21tYW5kcy5jCisrKyBiL25ldC9uZmMvbGxjcF9jb21tYW5kcy5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAogCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCi0JbmZjX2xsY3Bfc2VuZF90b19yYXdfc29jayhsb2NhbCwgc2tiLCBORkNfTExDUF9ESVJFQ1RJT05fVFgpOworCW5mY19sbGNwX3NlbmRfdG9fcmF3X3NvY2sobG9jYWwsIHNrYiwgTkZDX0RJUkVDVElPTl9UWCk7CiAKIAlyZXR1cm4gbmZjX2RhdGFfZXhjaGFuZ2UoZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwgc2tiLAogCQkJCSBuZmNfbGxjcF9yZWN2LCBsb2NhbCk7CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3BfY29yZS5jIGIvbmV0L25mYy9sbGNwX2NvcmUuYwppbmRleCBiNDY3MTk1Li41MWU3ODg3IDEwMDY0NAotLS0gYS9uZXQvbmZjL2xsY3BfY29yZS5jCisrKyBiL25ldC9uZmMvbGxjcF9jb3JlLmMKQEAgLTY4MCwxNiArNjgwLDE3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoc2tiX2NvcHkgPT0gTlVMTCkgewotCQkJc2tiX2NvcHkgPSBfX3Bza2JfY29weShza2IsIE5GQ19MTENQX1JBV19IRUFERVJfU0laRSwKLQkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCQkJc2tiX2NvcHkgPSBfX3Bza2JfY29weV9mY2xvbmUoc2tiLCBORkNfUkFXX0hFQURFUl9TSVpFLAorCQkJCQkJICAgICAgR0ZQX0FUT01JQywgdHJ1ZSk7CiAKIAkJCWlmIChza2JfY29weSA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCi0JCQlkYXRhID0gc2tiX3B1c2goc2tiX2NvcHksIE5GQ19MTENQX1JBV19IRUFERVJfU0laRSk7CisJCQlkYXRhID0gc2tiX3B1c2goc2tiX2NvcHksIE5GQ19SQVdfSEVBREVSX1NJWkUpOwogCiAJCQlkYXRhWzBdID0gbG9jYWwtPmRldiA/IGxvY2FsLT5kZXYtPmlkeCA6IDB4RkY7Ci0JCQlkYXRhWzFdID0gZGlyZWN0aW9uOworCQkJZGF0YVsxXSA9IGRpcmVjdGlvbiAmIDB4MDE7CisJCQlkYXRhWzFdIHw9IChSQVdfUEFZTE9BRF9MTENQIDw8IDEpOwogCQl9CiAKIAkJbnNrYiA9IHNrYl9jbG9uZShza2JfY29weSwgR0ZQX0FUT01JQyk7CkBAIC03NDcsNyArNzQ4LDcgQEAKIAkJCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCiAJCQluZmNfbGxjcF9zZW5kX3RvX3Jhd19zb2NrKGxvY2FsLCBza2IsCi0JCQkJCQkgIE5GQ19MTENQX0RJUkVDVElPTl9UWCk7CisJCQkJCQkgIE5GQ19ESVJFQ1RJT05fVFgpOwogCiAJCQlyZXQgPSBuZmNfZGF0YV9leGNoYW5nZShsb2NhbC0+ZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwKIAkJCQkJCXNrYiwgbmZjX2xsY3BfcmVjdiwgbG9jYWwpOwpAQCAtMTQ3Niw3ICsxNDc3LDcgQEAKIAogCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCi0JbmZjX2xsY3Bfc2VuZF90b19yYXdfc29jayhsb2NhbCwgc2tiLCBORkNfTExDUF9ESVJFQ1RJT05fUlgpOworCW5mY19sbGNwX3NlbmRfdG9fcmF3X3NvY2sobG9jYWwsIHNrYiwgTkZDX0RJUkVDVElPTl9SWCk7CiAKIAluZmNfbGxjcF9yeF9za2IobG9jYWwsIHNrYik7CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL2NvcmUuYyBiL25ldC9uZmMvbmNpL2NvcmUuYwppbmRleCA2YzM0YWM5Ny4uMmI0MDBlMSAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvY29yZS5jCisrKyBiL25ldC9uZmMvbmNpL2NvcmUuYwpAQCAtODYxLDYgKzg2MSwxMCBAQAogCS8qIEdldCByaWQgb2Ygc2tiIG93bmVyLCBwcmlvciB0byBzZW5kaW5nIHRvIHRoZSBkcml2ZXIuICovCiAJc2tiX29ycGhhbihza2IpOwogCisJLyogU2VuZCBjb3B5IHRvIHNuaWZmZXIgKi8KKwluZmNfc2VuZF90b19yYXdfc29jayhuZGV2LT5uZmNfZGV2LCBza2IsCisJCQkgICAgIFJBV19QQVlMT0FEX05DSSwgTkZDX0RJUkVDVElPTl9UWCk7CisKIAlyZXR1cm4gbmRldi0+b3BzLT5zZW5kKG5kZXYsIHNrYik7CiB9CiAKQEAgLTkzNSw2ICs5MzksMTEgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbmRldi0+cnhfcSkpKSB7CisKKwkJLyogU2VuZCBjb3B5IHRvIHNuaWZmZXIgKi8KKwkJbmZjX3NlbmRfdG9fcmF3X3NvY2sobmRldi0+bmZjX2Rldiwgc2tiLAorCQkJCSAgICAgUkFXX1BBWUxPQURfTkNJLCBORkNfRElSRUNUSU9OX1JYKTsKKwogCQkvKiBQcm9jZXNzIGZyYW1lICovCiAJCXN3aXRjaCAobmNpX210KHNrYi0+ZGF0YSkpIHsKIAkJY2FzZSBOQ0lfTVRfUlNQX1BLVDoKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL250Zi5jIGIvbmV0L25mYy9uY2kvbnRmLmMKaW5kZXggMWU5MDUwOS4uZjhmNmFmMiAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvbnRmLmMKKysrIGIvbmV0L25mYy9uY2kvbnRmLmMKQEAgLTM2Niw3ICszNjYsNiBAQAogCQkJc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgKm50ZiwgX191OCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWN0aXZhdGlvbl9wYXJhbXNfcG9sbF9uZmNfZGVwICpwb2xsOwotCWludCBpOwogCiAJc3dpdGNoIChudGYtPmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSkgewogCWNhc2UgTkNJX05GQ19BX1BBU1NJVkVfUE9MTF9NT0RFOgpAQCAtMzc0LDEwICszNzMsOCBAQAogCQlwb2xsID0gJm50Zi0+YWN0aXZhdGlvbl9wYXJhbXMucG9sbF9uZmNfZGVwOwogCQlwb2xsLT5hdHJfcmVzX2xlbiA9IG1pbl90KF9fdTgsICpkYXRhKyssIDYzKTsKIAkJcHJfZGVidWcoImF0cl9yZXNfbGVuICVkXG4iLCBwb2xsLT5hdHJfcmVzX2xlbik7Ci0JCWlmIChwb2xsLT5hdHJfcmVzX2xlbiA+IDApIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBwb2xsLT5hdHJfcmVzX2xlbjsgaSsrKQotCQkJCXBvbGwtPmF0cl9yZXNbcG9sbC0+YXRyX3Jlc19sZW4tMS1pXSA9IGRhdGFbaV07Ci0JCX0KKwkJaWYgKHBvbGwtPmF0cl9yZXNfbGVuID4gMCkKKwkJCW1lbWNweShwb2xsLT5hdHJfcmVzLCBkYXRhLCBwb2xsLT5hdHJfcmVzX2xlbik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmZjLmggYi9uZXQvbmZjL25mYy5oCmluZGV4IDlkNmU3NGYuLjg4ZDYwMDYgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmZjLmgKKysrIGIvbmV0L25mYy9uZmMuaApAQCAtNDAsNiArNDAsMTIgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKIAlib29sIHR4X3dvcmtfc2NoZWR1bGVkOwogfTsKKworc3RydWN0IG5mY19zb2NrX2xpc3QgeworCXN0cnVjdCBobGlzdF9oZWFkIGhlYWQ7CisJcndsb2NrX3QgICAgICAgICAgbG9jazsKK307CisKICNkZWZpbmUgbmZjX3Jhd3NvY2soc2spICgoc3RydWN0IG5mY19yYXdzb2NrICopIHNrKQogI2RlZmluZSB0b19yYXdzb2NrX3NrKF90eF93b3JrKSBcCiAJKChzdHJ1Y3Qgc29jayAqKSBjb250YWluZXJfb2YoX3R4X3dvcmssIHN0cnVjdCBuZmNfcmF3c29jaywgdHhfd29yaykpCmRpZmYgLS1naXQgYS9uZXQvbmZjL3Jhd3NvY2suYyBiL25ldC9uZmMvcmF3c29jay5jCmluZGV4IGMyN2E2ZTguLjExYzM1NDQgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvcmF3c29jay5jCisrKyBiL25ldC9uZmMvcmF3c29jay5jCkBAIC0yNyw2ICsyNywyNCBAQAogCiAjaW5jbHVkZSAibmZjLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgbmZjX3NvY2tfbGlzdCByYXdfc2tfbGlzdCA9IHsKKwkubG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChyYXdfc2tfbGlzdC5sb2NrKQorfTsKKworc3RhdGljIHZvaWQgbmZjX3NvY2tfbGluayhzdHJ1Y3QgbmZjX3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2soJmwtPmxvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmbC0+aGVhZCk7CisJd3JpdGVfdW5sb2NrKCZsLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX3NvY2tfdW5saW5rKHN0cnVjdCBuZmNfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9jaygmbC0+bG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrKCZsLT5sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgcmF3c29ja193cml0ZV9xdWV1ZV9wdXJnZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcHJfZGVidWcoInNrPSVwXG4iLCBzayk7CkBAIC01Nyw2ICs3NSw5IEBACiAJaWYgKCFzaykKIAkJcmV0dXJuIDA7CiAKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1JBVykKKwkJbmZjX3NvY2tfdW5saW5rKCZyYXdfc2tfbGlzdCwgc2spOworCiAJc29ja19vcnBoYW4oc2spOwogCXNvY2tfcHV0KHNrKTsKIApAQCAtMjc1LDYgKzI5NiwyNiBAQAogCS5tbWFwICAgICAgICAgICA9IHNvY2tfbm9fbW1hcCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHJhd3NvY2tfcmF3X29wcyA9IHsKKwkuZmFtaWx5ICAgICAgICAgPSBQRl9ORkMsCisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgICAgICAgID0gcmF3c29ja19yZWxlYXNlLAorCS5iaW5kICAgICAgICAgICA9IHNvY2tfbm9fYmluZCwKKwkuY29ubmVjdCAgICAgICAgPSBzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgICAgID0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgICAgICAgICA9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lICAgICAgICA9IHNvY2tfbm9fZ2V0bmFtZSwKKwkucG9sbCAgICAgICAgICAgPSBkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCAgICAgICAgICA9IHNvY2tfbm9faW9jdGwsCisJLmxpc3RlbiAgICAgICAgID0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duICAgICAgID0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdCAgICAgPSBzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgICAgID0gc29ja19ub19nZXRzb2Nrb3B0LAorCS5zZW5kbXNnICAgICAgICA9IHNvY2tfbm9fc2VuZG1zZywKKwkucmVjdm1zZyAgICAgICAgPSByYXdzb2NrX3JlY3Ztc2csCisJLm1tYXAgICAgICAgICAgID0gc29ja19ub19tbWFwLAorfTsKKwogc3RhdGljIHZvaWQgcmF3c29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcHJfZGVidWcoInNrPSVwXG4iLCBzayk7CkBAIC0zMDAsMTAgKzM0MSwxMyBAQAogCiAJcHJfZGVidWcoInNvY2s9JXBcbiIsIHNvY2spOwogCi0JaWYgKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpCisJaWYgKChzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSAmJiAoc29jay0+dHlwZSAhPSBTT0NLX1JBVykpCiAJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOwogCi0Jc29jay0+b3BzID0gJnJhd3NvY2tfb3BzOworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfUkFXKQorCQlzb2NrLT5vcHMgPSAmcmF3c29ja19yYXdfb3BzOworCWVsc2UKKwkJc29jay0+b3BzID0gJnJhd3NvY2tfb3BzOwogCiAJc2sgPSBza19hbGxvYyhuZXQsIFBGX05GQywgR0ZQX0FUT01JQywgbmZjX3Byb3RvLT5wcm90byk7CiAJaWYgKCFzaykKQEAgLTMxMywxMyArMzU3LDUzIEBACiAJc2stPnNrX3Byb3RvY29sID0gbmZjX3Byb3RvLT5pZDsKIAlzay0+c2tfZGVzdHJ1Y3QgPSByYXdzb2NrX2Rlc3RydWN0OwogCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7Ci0KLQlJTklUX1dPUksoJm5mY19yYXdzb2NrKHNrKS0+dHhfd29yaywgcmF3c29ja190eF93b3JrKTsKLQluZmNfcmF3c29jayhzayktPnR4X3dvcmtfc2NoZWR1bGVkID0gZmFsc2U7CisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19SQVcpCisJCW5mY19zb2NrX2xpbmsoJnJhd19za19saXN0LCBzayk7CisJZWxzZSB7CisJCUlOSVRfV09SSygmbmZjX3Jhd3NvY2soc2spLT50eF93b3JrLCByYXdzb2NrX3R4X3dvcmspOworCQluZmNfcmF3c29jayhzayktPnR4X3dvcmtfc2NoZWR1bGVkID0gZmFsc2U7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgbmZjX3NlbmRfdG9fcmF3X3NvY2soc3RydWN0IG5mY19kZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgdTggcGF5bG9hZF90eXBlLCB1OCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5ID0gTlVMTCwgKm5za2I7CisJc3RydWN0IHNvY2sgKnNrOworCXU4ICpkYXRhOworCisJcmVhZF9sb2NrKCZyYXdfc2tfbGlzdC5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrLCAmcmF3X3NrX2xpc3QuaGVhZCkgeworCQlpZiAoIXNrYl9jb3B5KSB7CisJCQlza2JfY29weSA9IF9fcHNrYl9jb3B5X2ZjbG9uZShza2IsIE5GQ19SQVdfSEVBREVSX1NJWkUsCisJCQkJCQkgICAgICBHRlBfQVRPTUlDLCB0cnVlKTsKKwkJCWlmICghc2tiX2NvcHkpCisJCQkJY29udGludWU7CisKKwkJCWRhdGEgPSBza2JfcHVzaChza2JfY29weSwgTkZDX1JBV19IRUFERVJfU0laRSk7CisKKwkJCWRhdGFbMF0gPSBkZXYgPyBkZXYtPmlkeCA6IDB4RkY7CisJCQlkYXRhWzFdID0gZGlyZWN0aW9uICYgMHgwMTsKKwkJCWRhdGFbMV0gfD0gKHBheWxvYWRfdHlwZSA8PCAxKTsKKwkJfQorCisJCW5za2IgPSBza2JfY2xvbmUoc2tiX2NvcHksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5za2IpCisJCQljb250aW51ZTsKKworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBuc2tiKSkKKwkJCWtmcmVlX3NrYihuc2tiKTsKKwl9CisKKwlyZWFkX3VubG9jaygmcmF3X3NrX2xpc3QubG9jayk7CisKKwlrZnJlZV9za2Ioc2tiX2NvcHkpOworfQorRVhQT1JUX1NZTUJPTChuZmNfc2VuZF90b19yYXdfc29jayk7CisKIHN0YXRpYyBzdHJ1Y3QgcHJvdG8gcmF3c29ja19wcm90byA9IHsKIAkubmFtZSAgICAgPSAiTkZDX1JBVyIsCiAJLm93bmVyICAgID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jIGIvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYwppbmRleCAyYzc3ZTdiLi5jMzY4NTZhIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKQEAgLTEzNCw4ICsxMzQsOCBAQAogCiAJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgZXRoX2hkcihza2IpLCBFVEhfQUxFTiAqIDIpOwogCi0JbWVtY3B5KGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGV0aF9rZXktPmV0aF9zcmMsIEVUSF9BTEVOKTsKLQltZW1jcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGV0aF9rZXktPmV0aF9kc3QsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgZXRoX2tleS0+ZXRoX3NyYyk7CisJZXRoZXJfYWRkcl9jb3B5KGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBldGhfa2V5LT5ldGhfZHN0KTsKIAogCW92c19za2JfcG9zdHB1c2hfcmNzdW0oc2tiLCBldGhfaGRyKHNrYiksIEVUSF9BTEVOICogMik7CiAKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKaW5kZXggYTMyNzZlMy4uMGQ0MDdiYyAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKQEAgLTQ0LDExICs0NCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvb3BlbnZzd2l0Y2guaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CkBAIC02Miw2ICs2MiwzMSBAQAogCiBpbnQgb3ZzX25ldF9pZCBfX3JlYWRfbW9zdGx5OwogCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGRwX3BhY2tldF9nZW5sX2ZhbWlseTsKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfZmxvd19nZW5sX2ZhbWlseTsKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgb3ZzX2RwX2Zsb3dfbXVsdGljYXN0X2dyb3VwID0geworCS5uYW1lID0gT1ZTX0ZMT1dfTUNHUk9VUAorfTsKKworc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBvdnNfZHBfZGF0YXBhdGhfbXVsdGljYXN0X2dyb3VwID0geworCS5uYW1lID0gT1ZTX0RBVEFQQVRIX01DR1JPVVAKK307CisKK3N0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBvdnNfZHBfdnBvcnRfbXVsdGljYXN0X2dyb3VwID0geworCS5uYW1lID0gT1ZTX1ZQT1JUX01DR1JPVVAKK307CisKKy8qIENoZWNrIGlmIG5lZWQgdG8gYnVpbGQgYSByZXBseSBtZXNzYWdlLgorICogT1ZTIHVzZXJzcGFjZSBzZXRzIHRoZSBOTE1fRl9FQ0hPIGZsYWcgaWYgaXQgbmVlZHMgdGhlIHJlcGx5LiAqLworc3RhdGljIGJvb2wgb3ZzX211c3Rfbm90aWZ5KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkgICAgY29uc3Qgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwICpncnApCit7CisJcmV0dXJuIGluZm8tPm5saGRyLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VDSE8gfHwKKwkJbmV0bGlua19oYXNfbGlzdGVuZXJzKGdlbmxfaW5mb19uZXQoaW5mbyktPmdlbmxfc29jaywgMCk7Cit9CisKIHN0YXRpYyB2b2lkIG92c19ub3RpZnkoc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHksCiAJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewpAQCAtMTczLDYgKzE5OCw3IEBACiAJcmV0dXJuICZkcC0+cG9ydHNbcG9ydF9ubyAmIChEUF9WUE9SVF9IQVNIX0JVQ0tFVFMgLSAxKV07CiB9CiAKKy8qIENhbGxlZCB3aXRoIG92c19tdXRleCBvciBSQ1UgcmVhZCBsb2NrLiAqLwogc3RydWN0IHZwb3J0ICpvdnNfbG9va3VwX3Zwb3J0KGNvbnN0IHN0cnVjdCBkYXRhcGF0aCAqZHAsIHUxNiBwb3J0X25vKQogewogCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CkBAIC0yNjIsMTYgKzI4OCw2IEBACiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jcCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfcGFja2V0X2dlbmxfZmFtaWx5ID0gewotCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCi0JLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAotCS5uYW1lID0gT1ZTX1BBQ0tFVF9GQU1JTFksCi0JLnZlcnNpb24gPSBPVlNfUEFDS0VUX1ZFUlNJT04sCi0JLm1heGF0dHIgPSBPVlNfUEFDS0VUX0FUVFJfTUFYLAotCS5uZXRuc29rID0gdHJ1ZSwKLQkucGFyYWxsZWxfb3BzID0gdHJ1ZSwKLX07Ci0KIGludCBvdnNfZHBfdXBjYWxsKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgY29uc3Qgc3RydWN0IGRwX3VwY2FsbF9pbmZvICp1cGNhbGxfaW5mbykKIHsKQEAgLTUyNCw3ICs1NDAsNyBAQAogCQlwYWNrZXQtPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwogCiAJLyogQnVpbGQgYW4gc3dfZmxvdyBmb3Igc2VuZGluZyB0aGlzIHBhY2tldC4gKi8KLQlmbG93ID0gb3ZzX2Zsb3dfYWxsb2MoZmFsc2UpOworCWZsb3cgPSBvdnNfZmxvd19hbGxvYygpOwogCWVyciA9IFBUUl9FUlIoZmxvdyk7CiAJaWYgKElTX0VSUihmbG93KSkKIAkJZ290byBlcnJfa2ZyZWVfc2tiOwpAQCAtNTkwLDYgKzYwNiwxOCBAQAogCX0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfcGFja2V0X2dlbmxfZmFtaWx5ID0geworCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCisJLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAorCS5uYW1lID0gT1ZTX1BBQ0tFVF9GQU1JTFksCisJLnZlcnNpb24gPSBPVlNfUEFDS0VUX1ZFUlNJT04sCisJLm1heGF0dHIgPSBPVlNfUEFDS0VUX0FUVFJfTUFYLAorCS5uZXRuc29rID0gdHJ1ZSwKKwkucGFyYWxsZWxfb3BzID0gdHJ1ZSwKKwkub3BzID0gZHBfcGFja2V0X2dlbmxfb3BzLAorCS5uX29wcyA9IEFSUkFZX1NJWkUoZHBfcGFja2V0X2dlbmxfb3BzKSwKK307CisKIHN0YXRpYyB2b2lkIGdldF9kcF9zdGF0cyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgb3ZzX2RwX3N0YXRzICpzdGF0cywKIAkJCSBzdHJ1Y3Qgb3ZzX2RwX21lZ2FmbG93X3N0YXRzICptZWdhX3N0YXRzKQogewpAQCAtNjIxLDI2ICs2NDksNiBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGZsb3dfcG9saWN5W09WU19GTE9XX0FUVFJfTUFYICsgMV0gPSB7Ci0JW09WU19GTE9XX0FUVFJfS0VZXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCi0JW09WU19GTE9XX0FUVFJfQUNUSU9OU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAotCVtPVlNfRkxPV19BVFRSX0NMRUFSXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBkcF9mbG93X2dlbmxfZmFtaWx5ID0gewotCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCi0JLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAotCS5uYW1lID0gT1ZTX0ZMT1dfRkFNSUxZLAotCS52ZXJzaW9uID0gT1ZTX0ZMT1dfVkVSU0lPTiwKLQkubWF4YXR0ciA9IE9WU19GTE9XX0FUVFJfTUFYLAotCS5uZXRuc29rID0gdHJ1ZSwKLQkucGFyYWxsZWxfb3BzID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgb3ZzX2RwX2Zsb3dfbXVsdGljYXN0X2dyb3VwID0gewotCS5uYW1lID0gT1ZTX0ZMT1dfTUNHUk9VUAotfTsKLQogc3RhdGljIHNpemVfdCBvdnNfZmxvd19jbWRfbXNnX3NpemUoY29uc3Qgc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0cykKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBvdnNfaGVhZGVyKSkKQEAgLTY1Miw4ICs2NjAsOCBAQAogCQkrIG5sYV90b3RhbF9zaXplKGFjdHMtPmFjdGlvbnNfbGVuKTsgLyogT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TICovCiB9CiAKLS8qIENhbGxlZCB3aXRoIG92c19tdXRleC4gKi8KLXN0YXRpYyBpbnQgb3ZzX2Zsb3dfY21kX2ZpbGxfaW5mbyhzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywgc3RydWN0IGRhdGFwYXRoICpkcCwKKy8qIENhbGxlZCB3aXRoIG92c19tdXRleCBvciBSQ1UgcmVhZCBsb2NrLiAqLworc3RhdGljIGludCBvdnNfZmxvd19jbWRfZmlsbF9pbmZvKGNvbnN0IHN0cnVjdCBzd19mbG93ICpmbG93LCBpbnQgZHBfaWZpbmRleCwKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwb3J0aWQsCiAJCQkJICB1MzIgc2VxLCB1MzIgZmxhZ3MsIHU4IGNtZCkKIHsKQEAgLTY3MCw3ICs2NzgsNyBAQAogCWlmICghb3ZzX2hlYWRlcikKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCW92c19oZWFkZXItPmRwX2lmaW5kZXggPSBnZXRfZHBpZmluZGV4KGRwKTsKKwlvdnNfaGVhZGVyLT5kcF9pZmluZGV4ID0gZHBfaWZpbmRleDsKIAogCS8qIEZpbGwgZmxvdyBrZXkuICovCiAJbmxhID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfRkxPV19BVFRSX0tFWSk7CkBAIC02OTMsNiArNzAxLDcgQEAKIAlubGFfbmVzdF9lbmQoc2tiLCBubGEpOwogCiAJb3ZzX2Zsb3dfc3RhdHNfZ2V0KGZsb3csICZzdGF0cywgJnVzZWQsICZ0Y3BfZmxhZ3MpOworCiAJaWYgKHVzZWQgJiYKIAkgICAgbmxhX3B1dF91NjQoc2tiLCBPVlNfRkxPV19BVFRSX1VTRUQsIG92c19mbG93X3VzZWRfdGltZSh1c2VkKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNzIwLDkgKzcyOSw5IEBACiAJCWNvbnN0IHN0cnVjdCBzd19mbG93X2FjdGlvbnMgKnNmX2FjdHM7CiAKIAkJc2ZfYWN0cyA9IHJjdV9kZXJlZmVyZW5jZV9vdnNsKGZsb3ctPnNmX2FjdHMpOwotCiAJCWVyciA9IG92c19ubGFfcHV0X2FjdGlvbnMoc2ZfYWN0cy0+YWN0aW9ucywKIAkJCQkJICBzZl9hY3RzLT5hY3Rpb25zX2xlbiwgc2tiKTsKKwogCQlpZiAoIWVycikKIAkJCW5sYV9uZXN0X2VuZChza2IsIHN0YXJ0KTsKIAkJZWxzZSB7CkBAIC03NDMsNDYgKzc1MiwxOTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm92c19mbG93X2NtZF9hbGxvY19pbmZvKHN0cnVjdCBzd19mbG93ICpmbG93LAotCQkJCQkgICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKKy8qIE1heSBub3QgYmUgY2FsbGVkIHdpdGggUkNVIHJlYWQgbG9jay4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8oY29uc3Qgc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0cywKKwkJCQkJICAgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJCSAgICAgICBib29sIGFsd2F5cykKIHsKLQlzaXplX3QgbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlsZW4gPSBvdnNfZmxvd19jbWRfbXNnX3NpemUob3ZzbF9kZXJlZmVyZW5jZShmbG93LT5zZl9hY3RzKSk7CisJaWYgKCFhbHdheXMgJiYgIW92c19tdXN0X25vdGlmeShpbmZvLCAmb3ZzX2RwX2Zsb3dfbXVsdGljYXN0X2dyb3VwKSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZ2VubG1zZ19uZXdfdW5pY2FzdChsZW4sIGluZm8sIEdGUF9LRVJORUwpOworCXNrYiA9IGdlbmxtc2dfbmV3X3VuaWNhc3Qob3ZzX2Zsb3dfY21kX21zZ19zaXplKGFjdHMpLCBpbmZvLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm92c19mbG93X2NtZF9idWlsZF9pbmZvKHN0cnVjdCBzd19mbG93ICpmbG93LAotCQkJCQkgICAgICAgc3RydWN0IGRhdGFwYXRoICpkcCwKLQkJCQkJICAgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCi0JCQkJCSAgICAgICB1OCBjbWQpCisvKiBDYWxsZWQgd2l0aCBvdnNfbXV0ZXguICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm92c19mbG93X2NtZF9idWlsZF9pbmZvKGNvbnN0IHN0cnVjdCBzd19mbG93ICpmbG93LAorCQkJCQkgICAgICAgaW50IGRwX2lmaW5kZXgsCisJCQkJCSAgICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLCB1OCBjbWQsCisJCQkJCSAgICAgICBib29sIGFsd2F5cykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXR2YWw7CiAKLQlza2IgPSBvdnNfZmxvd19jbWRfYWxsb2NfaW5mbyhmbG93LCBpbmZvKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc2tiID0gb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8ob3ZzbF9kZXJlZmVyZW5jZShmbG93LT5zZl9hY3RzKSwgaW5mbywKKwkJCQkgICAgICBhbHdheXMpOworCWlmICghc2tiIHx8IElTX0VSUihza2IpKQorCQlyZXR1cm4gc2tiOwogCi0JcmV0dmFsID0gb3ZzX2Zsb3dfY21kX2ZpbGxfaW5mbyhmbG93LCBkcCwgc2tiLCBpbmZvLT5zbmRfcG9ydGlkLAotCQkJCQlpbmZvLT5zbmRfc2VxLCAwLCBjbWQpOworCXJldHZhbCA9IG92c19mbG93X2NtZF9maWxsX2luZm8oZmxvdywgZHBfaWZpbmRleCwgc2tiLAorCQkJCQlpbmZvLT5zbmRfcG9ydGlkLCBpbmZvLT5zbmRfc2VxLCAwLAorCQkJCQljbWQpOwogCUJVR19PTihyZXR2YWwgPCAwKTsKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgaW50IG92c19mbG93X2NtZF9uZXdfb3Jfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitzdGF0aWMgaW50IG92c19mbG93X2NtZF9uZXcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmxhdHRyICoqYSA9IGluZm8tPmF0dHJzOworCXN0cnVjdCBvdnNfaGVhZGVyICpvdnNfaGVhZGVyID0gaW5mby0+dXNlcmhkcjsKKwlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywgKm5ld19mbG93OworCXN0cnVjdCBzd19mbG93X21hc2sgbWFzazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKwlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICphY3RzOworCXN0cnVjdCBzd19mbG93X21hdGNoIG1hdGNoOworCWludCBlcnJvcjsKKworCS8qIE11c3QgaGF2ZSBrZXkgYW5kIGFjdGlvbnMuICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghYVtPVlNfRkxPV19BVFRSX0tFWV0pCisJCWdvdG8gZXJyb3I7CisJaWYgKCFhW09WU19GTE9XX0FUVFJfQUNUSU9OU10pCisJCWdvdG8gZXJyb3I7CisKKwkvKiBNb3N0IG9mIHRoZSB0aW1lIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgZmxvdywgZG8gaXQgYmVmb3JlCisJICogbG9ja2luZy4KKwkgKi8KKwluZXdfZmxvdyA9IG92c19mbG93X2FsbG9jKCk7CisJaWYgKElTX0VSUihuZXdfZmxvdykpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKG5ld19mbG93KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBFeHRyYWN0IGtleS4gKi8KKwlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZuZXdfZmxvdy0+dW5tYXNrZWRfa2V5LCAmbWFzayk7CisJZXJyb3IgPSBvdnNfbmxhX2dldF9tYXRjaCgmbWF0Y2gsCisJCQkJICBhW09WU19GTE9XX0FUVFJfS0VZXSwgYVtPVlNfRkxPV19BVFRSX01BU0tdKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2tmcmVlX2Zsb3c7CisKKwlvdnNfZmxvd19tYXNrX2tleSgmbmV3X2Zsb3ctPmtleSwgJm5ld19mbG93LT51bm1hc2tlZF9rZXksICZtYXNrKTsKKworCS8qIFZhbGlkYXRlIGFjdGlvbnMuICovCisJYWN0cyA9IG92c19ubGFfYWxsb2NfZmxvd19hY3Rpb25zKG5sYV9sZW4oYVtPVlNfRkxPV19BVFRSX0FDVElPTlNdKSk7CisJZXJyb3IgPSBQVFJfRVJSKGFjdHMpOworCWlmIChJU19FUlIoYWN0cykpCisJCWdvdG8gZXJyX2tmcmVlX2Zsb3c7CisKKwllcnJvciA9IG92c19ubGFfY29weV9hY3Rpb25zKGFbT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TXSwgJm5ld19mbG93LT5rZXksCisJCQkJICAgICAwLCAmYWN0cyk7CisJaWYgKGVycm9yKSB7CisJCU9WU19OTEVSUigiRmxvdyBhY3Rpb25zIG1heSBub3QgYmUgc2FmZSBvbiBhbGwgbWF0Y2hpbmcgcGFja2V0cy5cbiIpOworCQlnb3RvIGVycl9rZnJlZV9hY3RzOworCX0KKworCXJlcGx5ID0gb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8oYWN0cywgaW5mbywgZmFsc2UpOworCWlmIChJU19FUlIocmVwbHkpKSB7CisJCWVycm9yID0gUFRSX0VSUihyZXBseSk7CisJCWdvdG8gZXJyX2tmcmVlX2FjdHM7CisJfQorCisJb3ZzX2xvY2soKTsKKwlkcCA9IGdldF9kcChzb2NrX25ldChza2ItPnNrKSwgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJaWYgKHVubGlrZWx5KCFkcCkpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVycl91bmxvY2tfb3ZzOworCX0KKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgZHVwbGljYXRlIGZsb3cgKi8KKwlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cCgmZHAtPnRhYmxlLCAmbmV3X2Zsb3ctPnVubWFza2VkX2tleSk7CisJaWYgKGxpa2VseSghZmxvdykpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ld19mbG93LT5zZl9hY3RzLCBhY3RzKTsKKworCQkvKiBQdXQgZmxvdyBpbiBidWNrZXQuICovCisJCWVycm9yID0gb3ZzX2Zsb3dfdGJsX2luc2VydCgmZHAtPnRhYmxlLCBuZXdfZmxvdywgJm1hc2spOworCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQlhY3RzID0gTlVMTDsKKwkJCWdvdG8gZXJyX3VubG9ja19vdnM7CisJCX0KKworCQlpZiAodW5saWtlbHkocmVwbHkpKSB7CisJCQllcnJvciA9IG92c19mbG93X2NtZF9maWxsX2luZm8obmV3X2Zsb3csCisJCQkJCQkgICAgICAgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCwKKwkJCQkJCSAgICAgICByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkJCSAgICAgICBpbmZvLT5zbmRfc2VxLCAwLAorCQkJCQkJICAgICAgIE9WU19GTE9XX0NNRF9ORVcpOworCQkJQlVHX09OKGVycm9yIDwgMCk7CisJCX0KKwkJb3ZzX3VubG9jaygpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKm9sZF9hY3RzOworCisJCS8qIEJhaWwgb3V0IGlmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSBhbiBleGlzdGluZyBmbG93LgorCQkgKiBXZSBhY2NlcHQgTkxNX0ZfQ1JFQVRFIGluIHBsYWNlIG9mIHRoZSBpbnRlbmRlZCBOTE1fRl9FWENMCisJCSAqIGJlY2F1c2UgR2VuZXJpYyBOZXRsaW5rIHRyZWF0cyB0aGUgbGF0dGVyIGFzIGEgZHVtcAorCQkgKiByZXF1ZXN0LiAgV2UgYWxzbyBhY2NlcHQgTkxNX0ZfRVhDTCBpbiBjYXNlIHRoYXQgYnVnIGV2ZXIKKwkJICogZ2V0cyBmaXhlZC4KKwkJICovCisJCWlmICh1bmxpa2VseShpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiAoTkxNX0ZfQ1JFQVRFCisJCQkJCQkJIHwgTkxNX0ZfRVhDTCkpKSB7CisJCQllcnJvciA9IC1FRVhJU1Q7CisJCQlnb3RvIGVycl91bmxvY2tfb3ZzOworCQl9CisJCS8qIFRoZSB1bm1hc2tlZCBrZXkgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBmbG93IHVwZGF0ZXMuICovCisJCWlmICh1bmxpa2VseSghb3ZzX2Zsb3dfY21wX3VubWFza2VkX2tleShmbG93LCAmbWF0Y2gpKSkgeworCQkJZXJyb3IgPSAtRUVYSVNUOworCQkJZ290byBlcnJfdW5sb2NrX292czsKKwkJfQorCQkvKiBVcGRhdGUgYWN0aW9ucy4gKi8KKwkJb2xkX2FjdHMgPSBvdnNsX2RlcmVmZXJlbmNlKGZsb3ctPnNmX2FjdHMpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgYWN0cyk7CisKKwkJaWYgKHVubGlrZWx5KHJlcGx5KSkgeworCQkJZXJyb3IgPSBvdnNfZmxvd19jbWRfZmlsbF9pbmZvKGZsb3csCisJCQkJCQkgICAgICAgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCwKKwkJCQkJCSAgICAgICByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkJCSAgICAgICBpbmZvLT5zbmRfc2VxLCAwLAorCQkJCQkJICAgICAgIE9WU19GTE9XX0NNRF9ORVcpOworCQkJQlVHX09OKGVycm9yIDwgMCk7CisJCX0KKwkJb3ZzX3VubG9jaygpOworCisJCW92c19ubGFfZnJlZV9mbG93X2FjdGlvbnMob2xkX2FjdHMpOworCQlvdnNfZmxvd19mcmVlKG5ld19mbG93LCBmYWxzZSk7CisJfQorCisJaWYgKHJlcGx5KQorCQlvdnNfbm90aWZ5KCZkcF9mbG93X2dlbmxfZmFtaWx5LCByZXBseSwgaW5mbyk7CisJcmV0dXJuIDA7CisKK2Vycl91bmxvY2tfb3ZzOgorCW92c191bmxvY2soKTsKKwlrZnJlZV9za2IocmVwbHkpOworZXJyX2tmcmVlX2FjdHM6CisJa2ZyZWUoYWN0cyk7CitlcnJfa2ZyZWVfZmxvdzoKKwlvdnNfZmxvd19mcmVlKG5ld19mbG93LCBmYWxzZSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgb3ZzX2Zsb3dfY21kX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCXN0cnVjdCBubGF0dHIgKiphID0gaW5mby0+YXR0cnM7CiAJc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXIgPSBpbmZvLT51c2VyaGRyOwogCXN0cnVjdCBzd19mbG93X2tleSBrZXksIG1hc2tlZF9rZXk7Ci0Jc3RydWN0IHN3X2Zsb3cgKmZsb3cgPSBOVUxMOworCXN0cnVjdCBzd19mbG93ICpmbG93OwogCXN0cnVjdCBzd19mbG93X21hc2sgbWFzazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5ID0gTlVMTDsKIAlzdHJ1Y3QgZGF0YXBhdGggKmRwOwotCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKmFjdHMgPSBOVUxMOworCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKm9sZF9hY3RzID0gTlVMTCwgKmFjdHMgPSBOVUxMOwogCXN0cnVjdCBzd19mbG93X21hdGNoIG1hdGNoOwotCWJvb2wgZXhhY3RfNXR1cGxlOwogCWludCBlcnJvcjsKIAogCS8qIEV4dHJhY3Qga2V5LiAqLwpAQCAtNzkxLDcgKzk0NCw3IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksICZtYXNrKTsKLQllcnJvciA9IG92c19ubGFfZ2V0X21hdGNoKCZtYXRjaCwgJmV4YWN0XzV0dXBsZSwKKwllcnJvciA9IG92c19ubGFfZ2V0X21hdGNoKCZtYXRjaCwKIAkJCQkgIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLCBhW09WU19GTE9XX0FUVFJfTUFTS10pOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjsKQEAgLTgwOCw5MCArOTYxLDc1IEBACiAJCQkJCSAgICAgJm1hc2tlZF9rZXksIDAsICZhY3RzKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlPVlNfTkxFUlIoIkZsb3cgYWN0aW9ucyBtYXkgbm90IGJlIHNhZmUgb24gYWxsIG1hdGNoaW5nIHBhY2tldHMuXG4iKTsKLQkJCWdvdG8gZXJyX2tmcmVlOworCQkJZ290byBlcnJfa2ZyZWVfYWN0czsKIAkJfQotCX0gZWxzZSBpZiAoaW5mby0+Z2VubGhkci0+Y21kID09IE9WU19GTE9XX0NNRF9ORVcpIHsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOworCX0KKworCS8qIENhbiBhbGxvY2F0ZSBiZWZvcmUgbG9ja2luZyBpZiBoYXZlIGFjdHMuICovCisJaWYgKGFjdHMpIHsKKwkJcmVwbHkgPSBvdnNfZmxvd19jbWRfYWxsb2NfaW5mbyhhY3RzLCBpbmZvLCBmYWxzZSk7CisJCWlmIChJU19FUlIocmVwbHkpKSB7CisJCQllcnJvciA9IFBUUl9FUlIocmVwbHkpOworCQkJZ290byBlcnJfa2ZyZWVfYWN0czsKKwkJfQogCX0KIAogCW92c19sb2NrKCk7CiAJZHAgPSBnZXRfZHAoc29ja19uZXQoc2tiLT5zayksIG92c19oZWFkZXItPmRwX2lmaW5kZXgpOwotCWVycm9yID0gLUVOT0RFVjsKLQlpZiAoIWRwKQorCWlmICh1bmxpa2VseSghZHApKSB7CisJCWVycm9yID0gLUVOT0RFVjsKIAkJZ290byBlcnJfdW5sb2NrX292czsKLQotCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBkdXBsaWNhdGUgZmxvdyAqLworCX0KKwkvKiBDaGVjayB0aGF0IHRoZSBmbG93IGV4aXN0cy4gKi8KIAlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cCgmZHAtPnRhYmxlLCAma2V5KTsKLQlpZiAoIWZsb3cpIHsKLQkJLyogQmFpbCBvdXQgaWYgd2UncmUgbm90IGFsbG93ZWQgdG8gY3JlYXRlIGEgbmV3IGZsb3cuICovCisJaWYgKHVubGlrZWx5KCFmbG93KSkgewogCQllcnJvciA9IC1FTk9FTlQ7Ci0JCWlmIChpbmZvLT5nZW5saGRyLT5jbWQgPT0gT1ZTX0ZMT1dfQ01EX1NFVCkKLQkJCWdvdG8gZXJyX3VubG9ja19vdnM7Ci0KLQkJLyogQWxsb2NhdGUgZmxvdy4gKi8KLQkJZmxvdyA9IG92c19mbG93X2FsbG9jKCFleGFjdF81dHVwbGUpOwotCQlpZiAoSVNfRVJSKGZsb3cpKSB7Ci0JCQllcnJvciA9IFBUUl9FUlIoZmxvdyk7Ci0JCQlnb3RvIGVycl91bmxvY2tfb3ZzOwotCQl9Ci0KLQkJZmxvdy0+a2V5ID0gbWFza2VkX2tleTsKLQkJZmxvdy0+dW5tYXNrZWRfa2V5ID0ga2V5OwotCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgYWN0cyk7Ci0KLQkJLyogUHV0IGZsb3cgaW4gYnVja2V0LiAqLwotCQllcnJvciA9IG92c19mbG93X3RibF9pbnNlcnQoJmRwLT50YWJsZSwgZmxvdywgJm1hc2spOwotCQlpZiAoZXJyb3IpIHsKLQkJCWFjdHMgPSBOVUxMOwotCQkJZ290byBlcnJfZmxvd19mcmVlOwotCQl9Ci0KLQkJcmVwbHkgPSBvdnNfZmxvd19jbWRfYnVpbGRfaW5mbyhmbG93LCBkcCwgaW5mbywgT1ZTX0ZMT1dfQ01EX05FVyk7Ci0JfSBlbHNlIHsKLQkJLyogV2UgZm91bmQgYSBtYXRjaGluZyBmbG93LiAqLwotCQlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICpvbGRfYWN0czsKLQotCQkvKiBCYWlsIG91dCBpZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBtb2RpZnkgYW4gZXhpc3RpbmcgZmxvdy4KLQkJICogV2UgYWNjZXB0IE5MTV9GX0NSRUFURSBpbiBwbGFjZSBvZiB0aGUgaW50ZW5kZWQgTkxNX0ZfRVhDTAotCQkgKiBiZWNhdXNlIEdlbmVyaWMgTmV0bGluayB0cmVhdHMgdGhlIGxhdHRlciBhcyBhIGR1bXAKLQkJICogcmVxdWVzdC4gIFdlIGFsc28gYWNjZXB0IE5MTV9GX0VYQ0wgaW4gY2FzZSB0aGF0IGJ1ZyBldmVyCi0JCSAqIGdldHMgZml4ZWQuCi0JCSAqLworCQlnb3RvIGVycl91bmxvY2tfb3ZzOworCX0KKwkvKiBUaGUgdW5tYXNrZWQga2V5IGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgZmxvdyB1cGRhdGVzLiAqLworCWlmICh1bmxpa2VseSghb3ZzX2Zsb3dfY21wX3VubWFza2VkX2tleShmbG93LCAmbWF0Y2gpKSkgewogCQllcnJvciA9IC1FRVhJU1Q7Ci0JCWlmIChpbmZvLT5nZW5saGRyLT5jbWQgPT0gT1ZTX0ZMT1dfQ01EX05FVyAmJgotCQkgICAgaW5mby0+bmxoZHItPm5sbXNnX2ZsYWdzICYgKE5MTV9GX0NSRUFURSB8IE5MTV9GX0VYQ0wpKQotCQkJZ290byBlcnJfdW5sb2NrX292czsKLQotCQkvKiBUaGUgdW5tYXNrZWQga2V5IGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgZmxvdyB1cGRhdGVzLiAqLwotCQlpZiAoIW92c19mbG93X2NtcF91bm1hc2tlZF9rZXkoZmxvdywgJm1hdGNoKSkKLQkJCWdvdG8gZXJyX3VubG9ja19vdnM7Ci0KLQkJLyogVXBkYXRlIGFjdGlvbnMuICovCisJCWdvdG8gZXJyX3VubG9ja19vdnM7CisJfQorCS8qIFVwZGF0ZSBhY3Rpb25zLCBpZiBwcmVzZW50LiAqLworCWlmIChsaWtlbHkoYWN0cykpIHsKIAkJb2xkX2FjdHMgPSBvdnNsX2RlcmVmZXJlbmNlKGZsb3ctPnNmX2FjdHMpOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgYWN0cyk7CisKKwkJaWYgKHVubGlrZWx5KHJlcGx5KSkgeworCQkJZXJyb3IgPSBvdnNfZmxvd19jbWRfZmlsbF9pbmZvKGZsb3csCisJCQkJCQkgICAgICAgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCwKKwkJCQkJCSAgICAgICByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkJCSAgICAgICBpbmZvLT5zbmRfc2VxLCAwLAorCQkJCQkJICAgICAgIE9WU19GTE9XX0NNRF9ORVcpOworCQkJQlVHX09OKGVycm9yIDwgMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDb3VsZCBub3QgYWxsb2Mgd2l0aG91dCBhY3RzIGJlZm9yZSBsb2NraW5nLiAqLworCQlyZXBseSA9IG92c19mbG93X2NtZF9idWlsZF9pbmZvKGZsb3csIG92c19oZWFkZXItPmRwX2lmaW5kZXgsCisJCQkJCQlpbmZvLCBPVlNfRkxPV19DTURfTkVXLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShJU19FUlIocmVwbHkpKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKHJlcGx5KTsKKwkJCWdvdG8gZXJyX3VubG9ja19vdnM7CisJCX0KKwl9CisKKwkvKiBDbGVhciBzdGF0cy4gKi8KKwlpZiAoYVtPVlNfRkxPV19BVFRSX0NMRUFSXSkKKwkJb3ZzX2Zsb3dfc3RhdHNfY2xlYXIoZmxvdyk7CisJb3ZzX3VubG9jaygpOworCisJaWYgKHJlcGx5KQorCQlvdnNfbm90aWZ5KCZkcF9mbG93X2dlbmxfZmFtaWx5LCByZXBseSwgaW5mbyk7CisJaWYgKG9sZF9hY3RzKQogCQlvdnNfbmxhX2ZyZWVfZmxvd19hY3Rpb25zKG9sZF9hY3RzKTsKIAotCQlyZXBseSA9IG92c19mbG93X2NtZF9idWlsZF9pbmZvKGZsb3csIGRwLCBpbmZvLCBPVlNfRkxPV19DTURfTkVXKTsKLQotCQkvKiBDbGVhciBzdGF0cy4gKi8KLQkJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9DTEVBUl0pCi0JCQlvdnNfZmxvd19zdGF0c19jbGVhcihmbG93KTsKLQl9Ci0Jb3ZzX3VubG9jaygpOwotCi0JaWYgKCFJU19FUlIocmVwbHkpKQotCQlvdnNfbm90aWZ5KCZkcF9mbG93X2dlbmxfZmFtaWx5LCByZXBseSwgaW5mbyk7Ci0JZWxzZQotCQlnZW5sX3NldF9lcnIoJmRwX2Zsb3dfZ2VubF9mYW1pbHksIHNvY2tfbmV0KHNrYi0+c2spLCAwLAotCQkJICAgICAwLCBQVFJfRVJSKHJlcGx5KSk7CiAJcmV0dXJuIDA7CiAKLWVycl9mbG93X2ZyZWU6Ci0Jb3ZzX2Zsb3dfZnJlZShmbG93LCBmYWxzZSk7CiBlcnJfdW5sb2NrX292czoKIAlvdnNfdW5sb2NrKCk7Ci1lcnJfa2ZyZWU6CisJa2ZyZWVfc2tiKHJlcGx5KTsKK2Vycl9rZnJlZV9hY3RzOgogCWtmcmVlKGFjdHMpOwogZXJyb3I6CiAJcmV0dXJuIGVycm9yOwpAQCAtOTE0LDcgKzEwNTIsNyBAQAogCX0KIAogCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgTlVMTCk7Ci0JZXJyID0gb3ZzX25sYV9nZXRfbWF0Y2goJm1hdGNoLCBOVUxMLCBhW09WU19GTE9XX0FUVFJfS0VZXSwgTlVMTCk7CisJZXJyID0gb3ZzX25sYV9nZXRfbWF0Y2goJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwgTlVMTCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtOTMxLDcgKzEwNjksOCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlyZXBseSA9IG92c19mbG93X2NtZF9idWlsZF9pbmZvKGZsb3csIGRwLCBpbmZvLCBPVlNfRkxPV19DTURfTkVXKTsKKwlyZXBseSA9IG92c19mbG93X2NtZF9idWlsZF9pbmZvKGZsb3csIG92c19oZWFkZXItPmRwX2lmaW5kZXgsIGluZm8sCisJCQkJCU9WU19GTE9XX0NNRF9ORVcsIHRydWUpOwogCWlmIChJU19FUlIocmVwbHkpKSB7CiAJCWVyciA9IFBUUl9FUlIocmVwbHkpOwogCQlnb3RvIHVubG9jazsKQEAgLTk1NSw0NSArMTA5NCw1MyBAQAogCXN0cnVjdCBzd19mbG93X21hdGNoIG1hdGNoOwogCWludCBlcnI7CiAKKwlpZiAobGlrZWx5KGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSkgeworCQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIE5VTEwpOworCQllcnIgPSBvdnNfbmxhX2dldF9tYXRjaCgmbWF0Y2gsIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLCBOVUxMKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCW92c19sb2NrKCk7CiAJZHAgPSBnZXRfZHAoc29ja19uZXQoc2tiLT5zayksIG92c19oZWFkZXItPmRwX2lmaW5kZXgpOwotCWlmICghZHApIHsKKwlpZiAodW5saWtlbHkoIWRwKSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAoIWFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7CisJaWYgKHVubGlrZWx5KCFhW09WU19GTE9XX0FUVFJfS0VZXSkpIHsKIAkJZXJyID0gb3ZzX2Zsb3dfdGJsX2ZsdXNoKCZkcC0+dGFibGUpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIE5VTEwpOwotCWVyciA9IG92c19ubGFfZ2V0X21hdGNoKCZtYXRjaCwgTlVMTCwgYVtPVlNfRkxPV19BVFRSX0tFWV0sIE5VTEwpOwotCWlmIChlcnIpCi0JCWdvdG8gdW5sb2NrOwotCiAJZmxvdyA9IG92c19mbG93X3RibF9sb29rdXAoJmRwLT50YWJsZSwgJmtleSk7Ci0JaWYgKCFmbG93IHx8ICFvdnNfZmxvd19jbXBfdW5tYXNrZWRfa2V5KGZsb3csICZtYXRjaCkpIHsKKwlpZiAodW5saWtlbHkoIWZsb3cgfHwgIW92c19mbG93X2NtcF91bm1hc2tlZF9rZXkoZmxvdywgJm1hdGNoKSkpIHsKIAkJZXJyID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JcmVwbHkgPSBvdnNfZmxvd19jbWRfYWxsb2NfaW5mbyhmbG93LCBpbmZvKTsKLQlpZiAoIXJlcGx5KSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQogCW92c19mbG93X3RibF9yZW1vdmUoJmRwLT50YWJsZSwgZmxvdyk7Ci0KLQllcnIgPSBvdnNfZmxvd19jbWRfZmlsbF9pbmZvKGZsb3csIGRwLCByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKLQkJCQkgICAgIGluZm8tPnNuZF9zZXEsIDAsIE9WU19GTE9XX0NNRF9ERUwpOwotCUJVR19PTihlcnIgPCAwKTsKLQotCW92c19mbG93X2ZyZWUoZmxvdywgdHJ1ZSk7CiAJb3ZzX3VubG9jaygpOwogCi0Jb3ZzX25vdGlmeSgmZHBfZmxvd19nZW5sX2ZhbWlseSwgcmVwbHksIGluZm8pOworCXJlcGx5ID0gb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8oKGNvbnN0IHN0cnVjdCBzd19mbG93X2FjdGlvbnMgX19mb3JjZSAqKSBmbG93LT5zZl9hY3RzLAorCQkJCQlpbmZvLCBmYWxzZSk7CisJaWYgKGxpa2VseShyZXBseSkpIHsKKwkJaWYgKGxpa2VseSghSVNfRVJSKHJlcGx5KSkpIHsKKwkJCXJjdV9yZWFkX2xvY2soKTsJLypUbyBrZWVwIFJDVSBjaGVja2VyIGhhcHB5LiAqLworCQkJZXJyID0gb3ZzX2Zsb3dfY21kX2ZpbGxfaW5mbyhmbG93LCBvdnNfaGVhZGVyLT5kcF9pZmluZGV4LAorCQkJCQkJICAgICByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkJCSAgICAgaW5mby0+c25kX3NlcSwgMCwKKwkJCQkJCSAgICAgT1ZTX0ZMT1dfQ01EX0RFTCk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCUJVR19PTihlcnIgPCAwKTsKKworCQkJb3ZzX25vdGlmeSgmZHBfZmxvd19nZW5sX2ZhbWlseSwgcmVwbHksIGluZm8pOworCQl9IGVsc2UgeworCQkJbmV0bGlua19zZXRfZXJyKHNvY2tfbmV0KHNrYi0+c2spLT5nZW5sX3NvY2ssIDAsIDAsIFBUUl9FUlIocmVwbHkpKTsKKwkJfQorCX0KKworCW92c19mbG93X2ZyZWUoZmxvdywgdHJ1ZSk7CiAJcmV0dXJuIDA7CiB1bmxvY2s6CiAJb3ZzX3VubG9jaygpOwpAQCAtMTAyNCw3ICsxMTcxLDcgQEAKIAkJaWYgKCFmbG93KQogCQkJYnJlYWs7CiAKLQkJaWYgKG92c19mbG93X2NtZF9maWxsX2luZm8oZmxvdywgZHAsIHNrYiwKKwkJaWYgKG92c19mbG93X2NtZF9maWxsX2luZm8oZmxvdywgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCwgc2tiLAogCQkJCQkgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKIAkJCQkJICAgT1ZTX0ZMT1dfQ01EX05FVykgPCAwKQpAQCAtMTAzNywxMSArMTE4NCwxNyBAQAogCXJldHVybiBza2ItPmxlbjsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX29wcyBkcF9mbG93X2dlbmxfb3BzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgZmxvd19wb2xpY3lbT1ZTX0ZMT1dfQVRUUl9NQVggKyAxXSA9IHsKKwlbT1ZTX0ZMT1dfQVRUUl9LRVldID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW09WU19GTE9XX0FUVFJfQ0xFQVJdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCit9OworCitzdGF0aWMgc3RydWN0IGdlbmxfb3BzIGRwX2Zsb3dfZ2VubF9vcHNbXSA9IHsKIAl7IC5jbWQgPSBPVlNfRkxPV19DTURfTkVXLAogCSAgLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLCAvKiBSZXF1aXJlcyBDQVBfTkVUX0FETUlOIHByaXZpbGVnZS4gKi8KIAkgIC5wb2xpY3kgPSBmbG93X3BvbGljeSwKLQkgIC5kb2l0ID0gb3ZzX2Zsb3dfY21kX25ld19vcl9zZXQKKwkgIC5kb2l0ID0gb3ZzX2Zsb3dfY21kX25ldwogCX0sCiAJeyAuY21kID0gT1ZTX0ZMT1dfQ01EX0RFTCwKIAkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCkBAIC0xMDU3LDI4ICsxMjEwLDIyIEBACiAJeyAuY21kID0gT1ZTX0ZMT1dfQ01EX1NFVCwKIAkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCiAJICAucG9saWN5ID0gZmxvd19wb2xpY3ksCi0JICAuZG9pdCA9IG92c19mbG93X2NtZF9uZXdfb3Jfc2V0LAorCSAgLmRvaXQgPSBvdnNfZmxvd19jbWRfc2V0LAogCX0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgZGF0YXBhdGhfcG9saWN5W09WU19EUF9BVFRSX01BWCArIDFdID0gewotCVtPVlNfRFBfQVRUUl9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IElGTkFNU0laIC0gMSB9LAotCVtPVlNfRFBfQVRUUl9VUENBTExfUElEXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW09WU19EUF9BVFRSX1VTRVJfRkVBVFVSRVNdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHkgPSB7CitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGRwX2Zsb3dfZ2VubF9mYW1pbHkgPSB7CiAJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKIAkuaGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb3ZzX2hlYWRlciksCi0JLm5hbWUgPSBPVlNfREFUQVBBVEhfRkFNSUxZLAotCS52ZXJzaW9uID0gT1ZTX0RBVEFQQVRIX1ZFUlNJT04sCi0JLm1heGF0dHIgPSBPVlNfRFBfQVRUUl9NQVgsCisJLm5hbWUgPSBPVlNfRkxPV19GQU1JTFksCisJLnZlcnNpb24gPSBPVlNfRkxPV19WRVJTSU9OLAorCS5tYXhhdHRyID0gT1ZTX0ZMT1dfQVRUUl9NQVgsCiAJLm5ldG5zb2sgPSB0cnVlLAogCS5wYXJhbGxlbF9vcHMgPSB0cnVlLAotfTsKLQotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBvdnNfZHBfZGF0YXBhdGhfbXVsdGljYXN0X2dyb3VwID0gewotCS5uYW1lID0gT1ZTX0RBVEFQQVRIX01DR1JPVVAKKwkub3BzID0gZHBfZmxvd19nZW5sX29wcywKKwkubl9vcHMgPSBBUlJBWV9TSVpFKGRwX2Zsb3dfZ2VubF9vcHMpLAorCS5tY2dycHMgPSAmb3ZzX2RwX2Zsb3dfbXVsdGljYXN0X2dyb3VwLAorCS5uX21jZ3JwcyA9IDEsCiB9OwogCiBzdGF0aWMgc2l6ZV90IG92c19kcF9jbWRfbXNnX3NpemUodm9pZCkKQEAgLTEwOTMsNiArMTI0MCw3IEBACiAJcmV0dXJuIG1zZ3NpemU7CiB9CiAKKy8qIENhbGxlZCB3aXRoIG92c19tdXRleCBvciBSQ1UgcmVhZCBsb2NrLiAqLwogc3RhdGljIGludCBvdnNfZHBfY21kX2ZpbGxfaW5mbyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXUzMiBwb3J0aWQsIHUzMiBzZXEsIHUzMiBmbGFncywgdTggY21kKQogewpAQCAtMTEwOCw5ICsxMjU2LDcgQEAKIAogCW92c19oZWFkZXItPmRwX2lmaW5kZXggPSBnZXRfZHBpZmluZGV4KGRwKTsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAllcnIgPSBubGFfcHV0X3N0cmluZyhza2IsIE9WU19EUF9BVFRSX05BTUUsIG92c19kcF9uYW1lKGRwKSk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKGVycikKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTExMzUsMjUgKzEyODEsMTIgQEAKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm92c19kcF9jbWRfYnVpbGRfaW5mbyhzdHJ1Y3QgZGF0YXBhdGggKmRwLAotCQkJCQkgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIHU4IGNtZCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqb3ZzX2RwX2NtZF9hbGxvY19pbmZvKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcmV0dmFsOwotCi0Jc2tiID0gZ2VubG1zZ19uZXdfdW5pY2FzdChvdnNfZHBfY21kX21zZ19zaXplKCksIGluZm8sIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXJldHZhbCA9IG92c19kcF9jbWRfZmlsbF9pbmZvKGRwLCBza2IsIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsIDAsIGNtZCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiBFUlJfUFRSKHJldHZhbCk7Ci0JfQotCXJldHVybiBza2I7CisJcmV0dXJuIGdlbmxtc2dfbmV3X3VuaWNhc3Qob3ZzX2RwX2NtZF9tc2dfc2l6ZSgpLCBpbmZvLCBHRlBfS0VSTkVMKTsKIH0KIAotLyogQ2FsbGVkIHdpdGggb3ZzX211dGV4LiAqLworLyogQ2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayBvciBvdnNfbXV0ZXguICovCiBzdGF0aWMgc3RydWN0IGRhdGFwYXRoICpsb29rdXBfZGF0YXBhdGgoc3RydWN0IG5ldCAqbmV0LAogCQkJCQlzdHJ1Y3Qgb3ZzX2hlYWRlciAqb3ZzX2hlYWRlciwKIAkJCQkJc3RydWN0IG5sYXR0ciAqYVtPVlNfRFBfQVRUUl9NQVggKyAxXSkKQEAgLTExNjUsMTAgKzEyOTgsOCBAQAogCWVsc2UgewogCQlzdHJ1Y3QgdnBvcnQgKnZwb3J0OwogCi0JCXJjdV9yZWFkX2xvY2soKTsKIAkJdnBvcnQgPSBvdnNfdnBvcnRfbG9jYXRlKG5ldCwgbmxhX2RhdGEoYVtPVlNfRFBfQVRUUl9OQU1FXSkpOwogCQlkcCA9IHZwb3J0ICYmIHZwb3J0LT5wb3J0X25vID09IE9WU1BfTE9DQUwgPyB2cG9ydC0+ZHAgOiBOVUxMOwotCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAJcmV0dXJuIGRwID8gZHAgOiBFUlJfUFRSKC1FTk9ERVYpOwogfQpAQCAtMTIwNSwxMiArMTMzNiwxNCBAQAogCWlmICghYVtPVlNfRFBfQVRUUl9OQU1FXSB8fCAhYVtPVlNfRFBfQVRUUl9VUENBTExfUElEXSkKIAkJZ290byBlcnI7CiAKLQlvdnNfbG9jaygpOworCXJlcGx5ID0gb3ZzX2RwX2NtZF9hbGxvY19pbmZvKGluZm8pOworCWlmICghcmVwbHkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJZXJyID0gLUVOT01FTTsKIAlkcCA9IGt6YWxsb2Moc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOwogCWlmIChkcCA9PSBOVUxMKQotCQlnb3RvIGVycl91bmxvY2tfb3ZzOworCQlnb3RvIGVycl9mcmVlX3JlcGx5OwogCiAJb3ZzX2RwX3NldF9uZXQoZHAsIGhvbGRfbmV0KHNvY2tfbmV0KHNrYi0+c2spKSk7CiAKQEAgLTEyNDUsNiArMTM3OCw5IEBACiAKIAlvdnNfZHBfY2hhbmdlKGRwLCBhKTsKIAorCS8qIFNvIGZhciBvbmx5IGxvY2FsIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIG5vdyBuZWVkIHRoZSBsb2NrLiAqLworCW92c19sb2NrKCk7CisKIAl2cG9ydCA9IG5ld192cG9ydCgmcGFybXMpOwogCWlmIChJU19FUlIodnBvcnQpKSB7CiAJCWVyciA9IFBUUl9FUlIodnBvcnQpOwpAQCAtMTI2MywxMCArMTM5OSw5IEBACiAJCWdvdG8gZXJyX2Rlc3Ryb3lfcG9ydHNfYXJyYXk7CiAJfQogCi0JcmVwbHkgPSBvdnNfZHBfY21kX2J1aWxkX2luZm8oZHAsIGluZm8sIE9WU19EUF9DTURfTkVXKTsKLQllcnIgPSBQVFJfRVJSKHJlcGx5KTsKLQlpZiAoSVNfRVJSKHJlcGx5KSkKLQkJZ290byBlcnJfZGVzdHJveV9sb2NhbF9wb3J0OworCWVyciA9IG92c19kcF9jbWRfZmlsbF9pbmZvKGRwLCByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkgICBpbmZvLT5zbmRfc2VxLCAwLCBPVlNfRFBfQ01EX05FVyk7CisJQlVHX09OKGVyciA8IDApOwogCiAJb3ZzX25ldCA9IG5ldF9nZW5lcmljKG92c19kcF9nZXRfbmV0KGRwKSwgb3ZzX25ldF9pZCk7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJmRwLT5saXN0X25vZGUsICZvdnNfbmV0LT5kcHMpOwpAQCAtMTI3Niw5ICsxNDExLDggQEAKIAlvdnNfbm90aWZ5KCZkcF9kYXRhcGF0aF9nZW5sX2ZhbWlseSwgcmVwbHksIGluZm8pOwogCXJldHVybiAwOwogCi1lcnJfZGVzdHJveV9sb2NhbF9wb3J0OgotCW92c19kcF9kZXRhY2hfcG9ydChvdnNfdnBvcnRfb3ZzbChkcCwgT1ZTUF9MT0NBTCkpOwogZXJyX2Rlc3Ryb3lfcG9ydHNfYXJyYXk6CisJb3ZzX3VubG9jaygpOwogCWtmcmVlKGRwLT5wb3J0cyk7CiBlcnJfZGVzdHJveV9wZXJjcHU6CiAJZnJlZV9wZXJjcHUoZHAtPnN0YXRzX3BlcmNwdSk7CkBAIC0xMjg3LDggKzE0MjEsOCBAQAogZXJyX2ZyZWVfZHA6CiAJcmVsZWFzZV9uZXQob3ZzX2RwX2dldF9uZXQoZHApKTsKIAlrZnJlZShkcCk7Ci1lcnJfdW5sb2NrX292czoKLQlvdnNfdW5sb2NrKCk7CitlcnJfZnJlZV9yZXBseToKKwlrZnJlZV9za2IocmVwbHkpOwogZXJyOgogCXJldHVybiBlcnI7CiB9CkBAIC0xMzI2LDE2ICsxNDYwLDE5IEBACiAJc3RydWN0IGRhdGFwYXRoICpkcDsKIAlpbnQgZXJyOwogCisJcmVwbHkgPSBvdnNfZHBfY21kX2FsbG9jX2luZm8oaW5mbyk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvdnNfbG9jaygpOwogCWRwID0gbG9va3VwX2RhdGFwYXRoKHNvY2tfbmV0KHNrYi0+c2spLCBpbmZvLT51c2VyaGRyLCBpbmZvLT5hdHRycyk7CiAJZXJyID0gUFRSX0VSUihkcCk7CiAJaWYgKElTX0VSUihkcCkpCi0JCWdvdG8gdW5sb2NrOworCQlnb3RvIGVycl91bmxvY2tfZnJlZTsKIAotCXJlcGx5ID0gb3ZzX2RwX2NtZF9idWlsZF9pbmZvKGRwLCBpbmZvLCBPVlNfRFBfQ01EX0RFTCk7Ci0JZXJyID0gUFRSX0VSUihyZXBseSk7Ci0JaWYgKElTX0VSUihyZXBseSkpCi0JCWdvdG8gdW5sb2NrOworCWVyciA9IG92c19kcF9jbWRfZmlsbF9pbmZvKGRwLCByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkgICBpbmZvLT5zbmRfc2VxLCAwLCBPVlNfRFBfQ01EX0RFTCk7CisJQlVHX09OKGVyciA8IDApOwogCiAJX19kcF9kZXN0cm95KGRwKTsKIAlvdnNfdW5sb2NrKCk7CkBAIC0xMzQzLDggKzE0ODAsMTAgQEAKIAlvdnNfbm90aWZ5KCZkcF9kYXRhcGF0aF9nZW5sX2ZhbWlseSwgcmVwbHksIGluZm8pOwogCiAJcmV0dXJuIDA7Ci11bmxvY2s6CisKK2Vycl91bmxvY2tfZnJlZToKIAlvdnNfdW5sb2NrKCk7CisJa2ZyZWVfc2tiKHJlcGx5KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzU0LDI5ICsxNDkzLDMwIEBACiAJc3RydWN0IGRhdGFwYXRoICpkcDsKIAlpbnQgZXJyOwogCisJcmVwbHkgPSBvdnNfZHBfY21kX2FsbG9jX2luZm8oaW5mbyk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvdnNfbG9jaygpOwogCWRwID0gbG9va3VwX2RhdGFwYXRoKHNvY2tfbmV0KHNrYi0+c2spLCBpbmZvLT51c2VyaGRyLCBpbmZvLT5hdHRycyk7CiAJZXJyID0gUFRSX0VSUihkcCk7CiAJaWYgKElTX0VSUihkcCkpCi0JCWdvdG8gdW5sb2NrOworCQlnb3RvIGVycl91bmxvY2tfZnJlZTsKIAogCW92c19kcF9jaGFuZ2UoZHAsIGluZm8tPmF0dHJzKTsKIAotCXJlcGx5ID0gb3ZzX2RwX2NtZF9idWlsZF9pbmZvKGRwLCBpbmZvLCBPVlNfRFBfQ01EX05FVyk7Ci0JaWYgKElTX0VSUihyZXBseSkpIHsKLQkJZXJyID0gUFRSX0VSUihyZXBseSk7Ci0JCWdlbmxfc2V0X2VycigmZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHksIHNvY2tfbmV0KHNrYi0+c2spLCAwLAotCQkJICAgICAwLCBlcnIpOwotCQllcnIgPSAwOwotCQlnb3RvIHVubG9jazsKLQl9CisJZXJyID0gb3ZzX2RwX2NtZF9maWxsX2luZm8oZHAsIHJlcGx5LCBpbmZvLT5zbmRfcG9ydGlkLAorCQkJCSAgIGluZm8tPnNuZF9zZXEsIDAsIE9WU19EUF9DTURfTkVXKTsKKwlCVUdfT04oZXJyIDwgMCk7CiAKIAlvdnNfdW5sb2NrKCk7CiAJb3ZzX25vdGlmeSgmZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHksIHJlcGx5LCBpbmZvKTsKIAogCXJldHVybiAwOwotdW5sb2NrOgorCitlcnJfdW5sb2NrX2ZyZWU6CiAJb3ZzX3VubG9jaygpOworCWtmcmVlX3NrYihyZXBseSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTM4NiwyNCArMTUyNiwyNiBAQAogCXN0cnVjdCBkYXRhcGF0aCAqZHA7CiAJaW50IGVycjsKIAotCW92c19sb2NrKCk7CisJcmVwbHkgPSBvdnNfZHBfY21kX2FsbG9jX2luZm8oaW5mbyk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZHAgPSBsb29rdXBfZGF0YXBhdGgoc29ja19uZXQoc2tiLT5zayksIGluZm8tPnVzZXJoZHIsIGluZm8tPmF0dHJzKTsKIAlpZiAoSVNfRVJSKGRwKSkgewogCQllcnIgPSBQVFJfRVJSKGRwKTsKLQkJZ290byB1bmxvY2s7CisJCWdvdG8gZXJyX3VubG9ja19mcmVlOwogCX0KKwllcnIgPSBvdnNfZHBfY21kX2ZpbGxfaW5mbyhkcCwgcmVwbHksIGluZm8tPnNuZF9wb3J0aWQsCisJCQkJICAgaW5mby0+c25kX3NlcSwgMCwgT1ZTX0RQX0NNRF9ORVcpOworCUJVR19PTihlcnIgPCAwKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJlcGx5ID0gb3ZzX2RwX2NtZF9idWlsZF9pbmZvKGRwLCBpbmZvLCBPVlNfRFBfQ01EX05FVyk7Ci0JaWYgKElTX0VSUihyZXBseSkpIHsKLQkJZXJyID0gUFRSX0VSUihyZXBseSk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCW92c191bmxvY2soKTsKIAlyZXR1cm4gZ2VubG1zZ19yZXBseShyZXBseSwgaW5mbyk7CiAKLXVubG9jazoKLQlvdnNfdW5sb2NrKCk7CitlcnJfdW5sb2NrX2ZyZWU6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJa2ZyZWVfc2tiKHJlcGx5KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNDMwLDcgKzE1NzIsMTMgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9vcHMgZHBfZGF0YXBhdGhfZ2VubF9vcHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBkYXRhcGF0aF9wb2xpY3lbT1ZTX0RQX0FUVFJfTUFYICsgMV0gPSB7CisJW09WU19EUF9BVFRSX05BTUVdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gSUZOQU1TSVogLSAxIH0sCisJW09WU19EUF9BVFRSX1VQQ0FMTF9QSURdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbT1ZTX0RQX0FUVFJfVVNFUl9GRUFUVVJFU10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBnZW5sX29wcyBkcF9kYXRhcGF0aF9nZW5sX29wc1tdID0gewogCXsgLmNtZCA9IE9WU19EUF9DTURfTkVXLAogCSAgLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLCAvKiBSZXF1aXJlcyBDQVBfTkVUX0FETUlOIHByaXZpbGVnZS4gKi8KIAkgIC5wb2xpY3kgPSBkYXRhcGF0aF9wb2xpY3ksCkBAIC0xNDU0LDI3ICsxNjAyLDE4IEBACiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB2cG9ydF9wb2xpY3lbT1ZTX1ZQT1JUX0FUVFJfTUFYICsgMV0gPSB7Ci0JW09WU19WUE9SVF9BVFRSX05BTUVdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gSUZOQU1TSVogLSAxIH0sCi0JW09WU19WUE9SVF9BVFRSX1NUQVRTXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgb3ZzX3Zwb3J0X3N0YXRzKSB9LAotCVtPVlNfVlBPUlRfQVRUUl9QT1JUX05PXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW09WU19WUE9SVF9BVFRSX1RZUEVdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbT1ZTX1ZQT1JUX0FUVFJfVVBDQUxMX1BJRF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtPVlNfVlBPUlRfQVRUUl9PUFRJT05TXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCi19OwotCi1zdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfdnBvcnRfZ2VubF9mYW1pbHkgPSB7CitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGRwX2RhdGFwYXRoX2dlbmxfZmFtaWx5ID0gewogCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCiAJLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAotCS5uYW1lID0gT1ZTX1ZQT1JUX0ZBTUlMWSwKLQkudmVyc2lvbiA9IE9WU19WUE9SVF9WRVJTSU9OLAotCS5tYXhhdHRyID0gT1ZTX1ZQT1JUX0FUVFJfTUFYLAorCS5uYW1lID0gT1ZTX0RBVEFQQVRIX0ZBTUlMWSwKKwkudmVyc2lvbiA9IE9WU19EQVRBUEFUSF9WRVJTSU9OLAorCS5tYXhhdHRyID0gT1ZTX0RQX0FUVFJfTUFYLAogCS5uZXRuc29rID0gdHJ1ZSwKIAkucGFyYWxsZWxfb3BzID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgb3ZzX2RwX3Zwb3J0X211bHRpY2FzdF9ncm91cCA9IHsKLQkubmFtZSA9IE9WU19WUE9SVF9NQ0dST1VQCisJLm9wcyA9IGRwX2RhdGFwYXRoX2dlbmxfb3BzLAorCS5uX29wcyA9IEFSUkFZX1NJWkUoZHBfZGF0YXBhdGhfZ2VubF9vcHMpLAorCS5tY2dycHMgPSAmb3ZzX2RwX2RhdGFwYXRoX211bHRpY2FzdF9ncm91cCwKKwkubl9tY2dycHMgPSAxLAogfTsKIAogLyogQ2FsbGVkIHdpdGggb3ZzX211dGV4IG9yIFJDVSByZWFkIGxvY2suICovCkBAIC0xNTE2LDcgKzE2NTUsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBDYWxsZWQgd2l0aCBvdnNfbXV0ZXggb3IgUkNVIHJlYWQgbG9jay4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqb3ZzX3Zwb3J0X2NtZF9hbGxvY19pbmZvKHZvaWQpCit7CisJcmV0dXJuIG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworfQorCisvKiBDYWxsZWQgd2l0aCBvdnNfbXV0ZXgsIG9ubHkgdmlhIG92c19kcF9ub3RpZnlfd3EoKS4gKi8KIHN0cnVjdCBza19idWZmICpvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8oc3RydWN0IHZwb3J0ICp2cG9ydCwgdTMyIHBvcnRpZCwKIAkJCQkJIHUzMiBzZXEsIHU4IGNtZCkKIHsKQEAgLTE1NzgsMzMgKzE3MjIsMzUgQEAKIAl1MzIgcG9ydF9ubzsKIAlpbnQgZXJyOwogCi0JZXJyID0gLUVJTlZBTDsKIAlpZiAoIWFbT1ZTX1ZQT1JUX0FUVFJfTkFNRV0gfHwgIWFbT1ZTX1ZQT1JUX0FUVFJfVFlQRV0gfHwKIAkgICAgIWFbT1ZTX1ZQT1JUX0FUVFJfVVBDQUxMX1BJRF0pCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3J0X25vID0gYVtPVlNfVlBPUlRfQVRUUl9QT1JUX05PXQorCQk/IG5sYV9nZXRfdTMyKGFbT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OT10pIDogMDsKKwlpZiAocG9ydF9ubyA+PSBEUF9NQVhfUE9SVFMpCisJCXJldHVybiAtRUZCSUc7CisKKwlyZXBseSA9IG92c192cG9ydF9jbWRfYWxsb2NfaW5mbygpOworCWlmICghcmVwbHkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJb3ZzX2xvY2soKTsKIAlkcCA9IGdldF9kcChzb2NrX25ldChza2ItPnNrKSwgb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CiAJZXJyID0gLUVOT0RFVjsKIAlpZiAoIWRwKQotCQlnb3RvIGV4aXRfdW5sb2NrOworCQlnb3RvIGV4aXRfdW5sb2NrX2ZyZWU7CiAKLQlpZiAoYVtPVlNfVlBPUlRfQVRUUl9QT1JUX05PXSkgewotCQlwb3J0X25vID0gbmxhX2dldF91MzIoYVtPVlNfVlBPUlRfQVRUUl9QT1JUX05PXSk7Ci0KLQkJZXJyID0gLUVGQklHOwotCQlpZiAocG9ydF9ubyA+PSBEUF9NQVhfUE9SVFMpCi0JCQlnb3RvIGV4aXRfdW5sb2NrOwotCisJaWYgKHBvcnRfbm8pIHsKIAkJdnBvcnQgPSBvdnNfdnBvcnRfb3ZzbChkcCwgcG9ydF9ubyk7CiAJCWVyciA9IC1FQlVTWTsKIAkJaWYgKHZwb3J0KQotCQkJZ290byBleGl0X3VubG9jazsKKwkJCWdvdG8gZXhpdF91bmxvY2tfZnJlZTsKIAl9IGVsc2UgewogCQlmb3IgKHBvcnRfbm8gPSAxOyA7IHBvcnRfbm8rKykgewogCQkJaWYgKHBvcnRfbm8gPj0gRFBfTUFYX1BPUlRTKSB7CiAJCQkJZXJyID0gLUVGQklHOwotCQkJCWdvdG8gZXhpdF91bmxvY2s7CisJCQkJZ290byBleGl0X3VubG9ja19mcmVlOwogCQkJfQogCQkJdnBvcnQgPSBvdnNfdnBvcnRfb3ZzbChkcCwgcG9ydF9ubyk7CiAJCQlpZiAoIXZwb3J0KQpAQCAtMTYyMiwyMiArMTc2OCwxOSBAQAogCXZwb3J0ID0gbmV3X3Zwb3J0KCZwYXJtcyk7CiAJZXJyID0gUFRSX0VSUih2cG9ydCk7CiAJaWYgKElTX0VSUih2cG9ydCkpCi0JCWdvdG8gZXhpdF91bmxvY2s7CisJCWdvdG8gZXhpdF91bmxvY2tfZnJlZTsKIAotCWVyciA9IDA7Ci0JcmVwbHkgPSBvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8odnBvcnQsIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsCi0JCQkJCSBPVlNfVlBPUlRfQ01EX05FVyk7Ci0JaWYgKElTX0VSUihyZXBseSkpIHsKLQkJZXJyID0gUFRSX0VSUihyZXBseSk7Ci0JCW92c19kcF9kZXRhY2hfcG9ydCh2cG9ydCk7Ci0JCWdvdG8gZXhpdF91bmxvY2s7Ci0JfQorCWVyciA9IG92c192cG9ydF9jbWRfZmlsbF9pbmZvKHZwb3J0LCByZXBseSwgaW5mby0+c25kX3BvcnRpZCwKKwkJCQkgICAgICBpbmZvLT5zbmRfc2VxLCAwLCBPVlNfVlBPUlRfQ01EX05FVyk7CisJQlVHX09OKGVyciA8IDApOworCW92c191bmxvY2soKTsKIAogCW92c19ub3RpZnkoJmRwX3Zwb3J0X2dlbmxfZmFtaWx5LCByZXBseSwgaW5mbyk7CisJcmV0dXJuIDA7CiAKLWV4aXRfdW5sb2NrOgorZXhpdF91bmxvY2tfZnJlZToKIAlvdnNfdW5sb2NrKCk7Ci1leGl0OgorCWtmcmVlX3NrYihyZXBseSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTY0OCwyOCArMTc5MSwyNiBAQAogCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CiAJaW50IGVycjsKIAorCXJlcGx5ID0gb3ZzX3Zwb3J0X2NtZF9hbGxvY19pbmZvKCk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvdnNfbG9jaygpOwogCXZwb3J0ID0gbG9va3VwX3Zwb3J0KHNvY2tfbmV0KHNrYi0+c2spLCBpbmZvLT51c2VyaGRyLCBhKTsKIAllcnIgPSBQVFJfRVJSKHZwb3J0KTsKIAlpZiAoSVNfRVJSKHZwb3J0KSkKLQkJZ290byBleGl0X3VubG9jazsKKwkJZ290byBleGl0X3VubG9ja19mcmVlOwogCiAJaWYgKGFbT1ZTX1ZQT1JUX0FUVFJfVFlQRV0gJiYKIAkgICAgbmxhX2dldF91MzIoYVtPVlNfVlBPUlRfQVRUUl9UWVBFXSkgIT0gdnBvcnQtPm9wcy0+dHlwZSkgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXRfdW5sb2NrOwotCX0KLQotCXJlcGx5ID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXBseSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfdW5sb2NrOworCQlnb3RvIGV4aXRfdW5sb2NrX2ZyZWU7CiAJfQogCiAJaWYgKGFbT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OU10pIHsKIAkJZXJyID0gb3ZzX3Zwb3J0X3NldF9vcHRpb25zKHZwb3J0LCBhW09WU19WUE9SVF9BVFRSX09QVElPTlNdKTsKIAkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9mcmVlOworCQkJZ290byBleGl0X3VubG9ja19mcmVlOwogCX0KIAogCWlmIChhW09WU19WUE9SVF9BVFRSX1VQQ0FMTF9QSURdKQpAQCAtMTY4MywxMCArMTgyNCw5IEBACiAJb3ZzX25vdGlmeSgmZHBfdnBvcnRfZ2VubF9mYW1pbHksIHJlcGx5LCBpbmZvKTsKIAlyZXR1cm4gMDsKIAotZXhpdF9mcmVlOgotCWtmcmVlX3NrYihyZXBseSk7Ci1leGl0X3VubG9jazoKK2V4aXRfdW5sb2NrX2ZyZWU6CiAJb3ZzX3VubG9jaygpOworCWtmcmVlX3NrYihyZXBseSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTY5NywzMCArMTgzNywzMyBAQAogCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CiAJaW50IGVycjsKIAorCXJlcGx5ID0gb3ZzX3Zwb3J0X2NtZF9hbGxvY19pbmZvKCk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvdnNfbG9jaygpOwogCXZwb3J0ID0gbG9va3VwX3Zwb3J0KHNvY2tfbmV0KHNrYi0+c2spLCBpbmZvLT51c2VyaGRyLCBhKTsKIAllcnIgPSBQVFJfRVJSKHZwb3J0KTsKIAlpZiAoSVNfRVJSKHZwb3J0KSkKLQkJZ290byBleGl0X3VubG9jazsKKwkJZ290byBleGl0X3VubG9ja19mcmVlOwogCiAJaWYgKHZwb3J0LT5wb3J0X25vID09IE9WU1BfTE9DQUwpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBleGl0X3VubG9jazsKKwkJZ290byBleGl0X3VubG9ja19mcmVlOwogCX0KIAotCXJlcGx5ID0gb3ZzX3Zwb3J0X2NtZF9idWlsZF9pbmZvKHZwb3J0LCBpbmZvLT5zbmRfcG9ydGlkLAotCQkJCQkgaW5mby0+c25kX3NlcSwgT1ZTX1ZQT1JUX0NNRF9ERUwpOwotCWVyciA9IFBUUl9FUlIocmVwbHkpOwotCWlmIChJU19FUlIocmVwbHkpKQotCQlnb3RvIGV4aXRfdW5sb2NrOwotCi0JZXJyID0gMDsKKwllcnIgPSBvdnNfdnBvcnRfY21kX2ZpbGxfaW5mbyh2cG9ydCwgcmVwbHksIGluZm8tPnNuZF9wb3J0aWQsCisJCQkJICAgICAgaW5mby0+c25kX3NlcSwgMCwgT1ZTX1ZQT1JUX0NNRF9ERUwpOworCUJVR19PTihlcnIgPCAwKTsKIAlvdnNfZHBfZGV0YWNoX3BvcnQodnBvcnQpOworCW92c191bmxvY2soKTsKIAogCW92c19ub3RpZnkoJmRwX3Zwb3J0X2dlbmxfZmFtaWx5LCByZXBseSwgaW5mbyk7CisJcmV0dXJuIDA7CiAKLWV4aXRfdW5sb2NrOgorZXhpdF91bmxvY2tfZnJlZToKIAlvdnNfdW5sb2NrKCk7CisJa2ZyZWVfc2tiKHJlcGx5KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNzMyLDI0ICsxODc1LDI1IEBACiAJc3RydWN0IHZwb3J0ICp2cG9ydDsKIAlpbnQgZXJyOwogCisJcmVwbHkgPSBvdnNfdnBvcnRfY21kX2FsbG9jX2luZm8oKTsKKwlpZiAoIXJlcGx5KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAl2cG9ydCA9IGxvb2t1cF92cG9ydChzb2NrX25ldChza2ItPnNrKSwgb3ZzX2hlYWRlciwgYSk7CiAJZXJyID0gUFRSX0VSUih2cG9ydCk7CiAJaWYgKElTX0VSUih2cG9ydCkpCi0JCWdvdG8gZXhpdF91bmxvY2s7Ci0KLQlyZXBseSA9IG92c192cG9ydF9jbWRfYnVpbGRfaW5mbyh2cG9ydCwgaW5mby0+c25kX3BvcnRpZCwKLQkJCQkJIGluZm8tPnNuZF9zZXEsIE9WU19WUE9SVF9DTURfTkVXKTsKLQllcnIgPSBQVFJfRVJSKHJlcGx5KTsKLQlpZiAoSVNfRVJSKHJlcGx5KSkKLQkJZ290byBleGl0X3VubG9jazsKLQorCQlnb3RvIGV4aXRfdW5sb2NrX2ZyZWU7CisJZXJyID0gb3ZzX3Zwb3J0X2NtZF9maWxsX2luZm8odnBvcnQsIHJlcGx5LCBpbmZvLT5zbmRfcG9ydGlkLAorCQkJCSAgICAgIGluZm8tPnNuZF9zZXEsIDAsIE9WU19WUE9SVF9DTURfTkVXKTsKKwlCVUdfT04oZXJyIDwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gZ2VubG1zZ19yZXBseShyZXBseSwgaW5mbyk7CiAKLWV4aXRfdW5sb2NrOgorZXhpdF91bmxvY2tfZnJlZToKIAlyY3VfcmVhZF91bmxvY2soKTsKKwlrZnJlZV9za2IocmVwbHkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3OTIsNyArMTkzNiwxNiBAQAogCXJldHVybiBza2ItPmxlbjsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX29wcyBkcF92cG9ydF9nZW5sX29wc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHZwb3J0X3BvbGljeVtPVlNfVlBPUlRfQVRUUl9NQVggKyAxXSA9IHsKKwlbT1ZTX1ZQT1JUX0FUVFJfTkFNRV0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIC5sZW4gPSBJRk5BTVNJWiAtIDEgfSwKKwlbT1ZTX1ZQT1JUX0FUVFJfU1RBVFNdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBvdnNfdnBvcnRfc3RhdHMpIH0sCisJW09WU19WUE9SVF9BVFRSX1BPUlRfTk9dID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbT1ZTX1ZQT1JUX0FUVFJfVFlQRV0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtPVlNfVlBPUlRfQVRUUl9VUENBTExfUElEXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW09WU19WUE9SVF9BVFRSX09QVElPTlNdID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgZHBfdnBvcnRfZ2VubF9vcHNbXSA9IHsKIAl7IC5jbWQgPSBPVlNfVlBPUlRfQ01EX05FVywKIAkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCiAJICAucG9saWN5ID0gdnBvcnRfcG9saWN5LApAQCAtMTgxNiwyNiArMTk2OSwyNSBAQAogCX0sCiB9OwogCi1zdHJ1Y3QgZ2VubF9mYW1pbHlfYW5kX29wcyB7Ci0Jc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHk7Ci0JY29uc3Qgc3RydWN0IGdlbmxfb3BzICpvcHM7Ci0JaW50IG5fb3BzOwotCWNvbnN0IHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCAqZ3JvdXA7CitzdHJ1Y3QgZ2VubF9mYW1pbHkgZHBfdnBvcnRfZ2VubF9mYW1pbHkgPSB7CisJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKKwkuaGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb3ZzX2hlYWRlciksCisJLm5hbWUgPSBPVlNfVlBPUlRfRkFNSUxZLAorCS52ZXJzaW9uID0gT1ZTX1ZQT1JUX1ZFUlNJT04sCisJLm1heGF0dHIgPSBPVlNfVlBPUlRfQVRUUl9NQVgsCisJLm5ldG5zb2sgPSB0cnVlLAorCS5wYXJhbGxlbF9vcHMgPSB0cnVlLAorCS5vcHMgPSBkcF92cG9ydF9nZW5sX29wcywKKwkubl9vcHMgPSBBUlJBWV9TSVpFKGRwX3Zwb3J0X2dlbmxfb3BzKSwKKwkubWNncnBzID0gJm92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAsCisJLm5fbWNncnBzID0gMSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9mYW1pbHlfYW5kX29wcyBkcF9nZW5sX2ZhbWlsaWVzW10gPSB7Ci0JeyAmZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHksCi0JICBkcF9kYXRhcGF0aF9nZW5sX29wcywgQVJSQVlfU0laRShkcF9kYXRhcGF0aF9nZW5sX29wcyksCi0JICAmb3ZzX2RwX2RhdGFwYXRoX211bHRpY2FzdF9ncm91cCB9LAotCXsgJmRwX3Zwb3J0X2dlbmxfZmFtaWx5LAotCSAgZHBfdnBvcnRfZ2VubF9vcHMsIEFSUkFZX1NJWkUoZHBfdnBvcnRfZ2VubF9vcHMpLAotCSAgJm92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAgfSwKLQl7ICZkcF9mbG93X2dlbmxfZmFtaWx5LAotCSAgZHBfZmxvd19nZW5sX29wcywgQVJSQVlfU0laRShkcF9mbG93X2dlbmxfb3BzKSwKLQkgICZvdnNfZHBfZmxvd19tdWx0aWNhc3RfZ3JvdXAgfSwKLQl7ICZkcF9wYWNrZXRfZ2VubF9mYW1pbHksCi0JICBkcF9wYWNrZXRfZ2VubF9vcHMsIEFSUkFZX1NJWkUoZHBfcGFja2V0X2dlbmxfb3BzKSwKLQkgIE5VTEwgfSwKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgKiBjb25zdCBkcF9nZW5sX2ZhbWlsaWVzW10gPSB7CisJJmRwX2RhdGFwYXRoX2dlbmxfZmFtaWx5LAorCSZkcF92cG9ydF9nZW5sX2ZhbWlseSwKKwkmZHBfZmxvd19nZW5sX2ZhbWlseSwKKwkmZHBfcGFja2V0X2dlbmxfZmFtaWx5LAogfTsKIAogc3RhdGljIHZvaWQgZHBfdW5yZWdpc3Rlcl9nZW5sKGludCBuX2ZhbWlsaWVzKQpAQCAtMTg0MywzMyArMTk5NSwyNSBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5fZmFtaWxpZXM7IGkrKykKLQkJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseShkcF9nZW5sX2ZhbWlsaWVzW2ldLmZhbWlseSk7CisJCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoZHBfZ2VubF9mYW1pbGllc1tpXSk7CiB9CiAKIHN0YXRpYyBpbnQgZHBfcmVnaXN0ZXJfZ2VubCh2b2lkKQogewotCWludCBuX3JlZ2lzdGVyZWQ7CiAJaW50IGVycjsKIAlpbnQgaTsKIAotCW5fcmVnaXN0ZXJlZCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHBfZ2VubF9mYW1pbGllcyk7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgZ2VubF9mYW1pbHlfYW5kX29wcyAqZiA9ICZkcF9nZW5sX2ZhbWlsaWVzW2ldOwogCi0JCWYtPmZhbWlseS0+b3BzID0gZi0+b3BzOwotCQlmLT5mYW1pbHktPm5fb3BzID0gZi0+bl9vcHM7Ci0JCWYtPmZhbWlseS0+bWNncnBzID0gZi0+Z3JvdXA7Ci0JCWYtPmZhbWlseS0+bl9tY2dycHMgPSBmLT5ncm91cCA/IDEgOiAwOwotCQllcnIgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseShmLT5mYW1pbHkpOworCQllcnIgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseShkcF9nZW5sX2ZhbWlsaWVzW2ldKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyb3I7Ci0JCW5fcmVnaXN0ZXJlZCsrOwogCX0KIAogCXJldHVybiAwOwogCiBlcnJvcjoKLQlkcF91bnJlZ2lzdGVyX2dlbmwobl9yZWdpc3RlcmVkKTsKKwlkcF91bnJlZ2lzdGVyX2dlbmwoaSk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmggYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguaAppbmRleCAwNTMxNzM4Li43ZWRlNTA3IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguaAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguaApAQCAtMTk0LDcgKzE5NCw5IEBACiBpbnQgb3ZzX2V4ZWN1dGVfYWN0aW9ucyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgb3ZzX2RwX25vdGlmeV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi0jZGVmaW5lIE9WU19OTEVSUihmbXQsIC4uLikgXAotCXByX2luZm9fb25jZSgibmV0bGluazogIiBmbXQsICMjX19WQV9BUkdTX18pCi0KKyNkZWZpbmUgT1ZTX05MRVJSKGZtdCwgLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCQkJCQlcCisJCXByX2luZm8oIm5ldGxpbms6ICIgZm10LCAjI19fVkFfQVJHU19fKTsJXAorfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBkYXRhcGF0aC5oICovCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuYwppbmRleCAyOTk4OTg5Li4zMzQ3NTFjIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmMKQEAgLTY0LDg4ICs2NCwxMTAgQEAKIHZvaWQgb3ZzX2Zsb3dfc3RhdHNfdXBkYXRlKHN0cnVjdCBzd19mbG93ICpmbG93LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0czsKLQlfX2JlMTYgdGNwX2ZsYWdzID0gMDsKKwlfX2JlMTYgdGNwX2ZsYWdzID0gZmxvdy0+a2V5LnRwLmZsYWdzOworCWludCBub2RlID0gbnVtYV9ub2RlX2lkKCk7CiAKLQlpZiAoIWZsb3ctPnN0YXRzLmlzX3BlcmNwdSkKLQkJc3RhdHMgPSBmbG93LT5zdGF0cy5zdGF0OwotCWVsc2UKLQkJc3RhdHMgPSB0aGlzX2NwdV9wdHIoZmxvdy0+c3RhdHMuY3B1X3N0YXRzKTsKKwlzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tub2RlXSk7CiAKLQlpZiAoKGZsb3ctPmtleS5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkgfHwKLQkgICAgIGZsb3ctPmtleS5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUFY2KSkgJiYKLQkgICAgZmxvdy0+a2V5LmlwLmZyYWcgIT0gT1ZTX0ZSQUdfVFlQRV9MQVRFUiAmJgotCSAgICBmbG93LT5rZXkuaXAucHJvdG8gPT0gSVBQUk9UT19UQ1AgJiYKLQkgICAgbGlrZWx5KHNrYi0+bGVuID49IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpKSB7Ci0JCXRjcF9mbGFncyA9IFRDUF9GTEFHU19CRTE2KHRjcF9oZHIoc2tiKSk7CisJLyogQ2hlY2sgaWYgYWxyZWFkeSBoYXZlIG5vZGUtc3BlY2lmaWMgc3RhdHMuICovCisJaWYgKGxpa2VseShzdGF0cykpIHsKKwkJc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CisJCS8qIE1hcmsgaWYgd2Ugd3JpdGUgb24gdGhlIHByZS1hbGxvY2F0ZWQgc3RhdHMuICovCisJCWlmIChub2RlID09IDAgJiYgdW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gbm9kZSkpCisJCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IG5vZGU7CisJfSBlbHNlIHsKKwkJc3RhdHMgPSByY3VfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbMF0pOyAvKiBQcmUtYWxsb2NhdGVkLiAqLworCQlzcGluX2xvY2soJnN0YXRzLT5sb2NrKTsKKworCQkvKiBJZiB0aGUgY3VycmVudCBOVU1BLW5vZGUgaXMgdGhlIG9ubHkgd3JpdGVyIG9uIHRoZQorCQkgKiBwcmUtYWxsb2NhdGVkIHN0YXRzIGtlZXAgdXNpbmcgdGhlbS4KKwkJICovCisJCWlmICh1bmxpa2VseShmbG93LT5zdGF0c19sYXN0X3dyaXRlciAhPSBub2RlKSkgeworCQkJLyogQSBwcmV2aW91cyBsb2NrZXIgbWF5IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdGhlCisJCQkgKiBzdGF0cywgc28gd2UgbmVlZCB0byBjaGVjayBhZ2Fpbi4gIElmIG5vZGUtc3BlY2lmaWMKKwkJCSAqIHN0YXRzIHdlcmUgYWxyZWFkeSBhbGxvY2F0ZWQsIHdlIHVwZGF0ZSB0aGUgcHJlLQorCQkJICogYWxsb2NhdGVkIHN0YXRzIGFzIHdlIGhhdmUgYWxyZWFkeSBsb2NrZWQgdGhlbS4KKwkJCSAqLworCQkJaWYgKGxpa2VseShmbG93LT5zdGF0c19sYXN0X3dyaXRlciAhPSBOVU1BX05PX05PREUpCisJCQkgICAgJiYgbGlrZWx5KCFyY3VfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbbm9kZV0pKSkgeworCQkJCS8qIFRyeSB0byBhbGxvY2F0ZSBub2RlLXNwZWNpZmljIHN0YXRzLiAqLworCQkJCXN0cnVjdCBmbG93X3N0YXRzICpuZXdfc3RhdHM7CisKKwkJCQluZXdfc3RhdHMgPQorCQkJCQlrbWVtX2NhY2hlX2FsbG9jX25vZGUoZmxvd19zdGF0c19jYWNoZSwKKwkJCQkJCQkgICAgICBHRlBfVEhJU05PREUgfAorCQkJCQkJCSAgICAgIF9fR0ZQX05PTUVNQUxMT0MsCisJCQkJCQkJICAgICAgbm9kZSk7CisJCQkJaWYgKGxpa2VseShuZXdfc3RhdHMpKSB7CisJCQkJCW5ld19zdGF0cy0+dXNlZCA9IGppZmZpZXM7CisJCQkJCW5ld19zdGF0cy0+cGFja2V0X2NvdW50ID0gMTsKKwkJCQkJbmV3X3N0YXRzLT5ieXRlX2NvdW50ID0gc2tiLT5sZW47CisJCQkJCW5ld19zdGF0cy0+dGNwX2ZsYWdzID0gdGNwX2ZsYWdzOworCQkJCQlzcGluX2xvY2tfaW5pdCgmbmV3X3N0YXRzLT5sb2NrKTsKKworCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c3RhdHNbbm9kZV0sCisJCQkJCQkJICAgbmV3X3N0YXRzKTsKKwkJCQkJZ290byB1bmxvY2s7CisJCQkJfQorCQkJfQorCQkJZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgPSBub2RlOworCQl9CiAJfQogCi0Jc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CiAJc3RhdHMtPnVzZWQgPSBqaWZmaWVzOwogCXN0YXRzLT5wYWNrZXRfY291bnQrKzsKIAlzdGF0cy0+Ynl0ZV9jb3VudCArPSBza2ItPmxlbjsKIAlzdGF0cy0+dGNwX2ZsYWdzIHw9IHRjcF9mbGFnczsKK3VubG9jazoKIAlzcGluX3VubG9jaygmc3RhdHMtPmxvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzdGF0c19yZWFkKHN0cnVjdCBmbG93X3N0YXRzICpzdGF0cywKLQkJICAgICAgIHN0cnVjdCBvdnNfZmxvd19zdGF0cyAqb3ZzX3N0YXRzLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpCi17Ci0Jc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7Ci0JaWYgKCEqdXNlZCB8fCB0aW1lX2FmdGVyKHN0YXRzLT51c2VkLCAqdXNlZCkpCi0JCSp1c2VkID0gc3RhdHMtPnVzZWQ7Ci0JKnRjcF9mbGFncyB8PSBzdGF0cy0+dGNwX2ZsYWdzOwotCW92c19zdGF0cy0+bl9wYWNrZXRzICs9IHN0YXRzLT5wYWNrZXRfY291bnQ7Ci0Jb3ZzX3N0YXRzLT5uX2J5dGVzICs9IHN0YXRzLT5ieXRlX2NvdW50OwotCXNwaW5fdW5sb2NrKCZzdGF0cy0+bG9jayk7Ci19Ci0KLXZvaWQgb3ZzX2Zsb3dfc3RhdHNfZ2V0KHN0cnVjdCBzd19mbG93ICpmbG93LCBzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMgKm92c19zdGF0cywKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayBvciBvdnNfbXV0ZXguICovCit2b2lkIG92c19mbG93X3N0YXRzX2dldChjb25zdCBzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywKKwkJCXN0cnVjdCBvdnNfZmxvd19zdGF0cyAqb3ZzX3N0YXRzLAogCQkJdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpCiB7Ci0JaW50IGNwdTsKKwlpbnQgbm9kZTsKIAogCSp1c2VkID0gMDsKIAkqdGNwX2ZsYWdzID0gMDsKIAltZW1zZXQob3ZzX3N0YXRzLCAwLCBzaXplb2YoKm92c19zdGF0cykpOwogCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWlmICghZmxvdy0+c3RhdHMuaXNfcGVyY3B1KSB7Ci0JCXN0YXRzX3JlYWQoZmxvdy0+c3RhdHMuc3RhdCwgb3ZzX3N0YXRzLCB1c2VkLCB0Y3BfZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0czsKKwlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKKwkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzID0gcmN1X2RlcmVmZXJlbmNlX292c2woZmxvdy0+c3RhdHNbbm9kZV0pOwogCi0JCQlzdGF0cyA9IHBlcl9jcHVfcHRyKGZsb3ctPnN0YXRzLmNwdV9zdGF0cywgY3B1KTsKLQkJCXN0YXRzX3JlYWQoc3RhdHMsIG92c19zdGF0cywgdXNlZCwgdGNwX2ZsYWdzKTsKKwkJaWYgKHN0YXRzKSB7CisJCQkvKiBMb2NhbCBDUFUgbWF5IHdyaXRlIG9uIG5vbi1sb2NhbCBzdGF0cywgc28gd2UgbXVzdAorCQkJICogYmxvY2sgYm90dG9tLWhhbHZlcyBoZXJlLgorCQkJICovCisJCQlzcGluX2xvY2tfYmgoJnN0YXRzLT5sb2NrKTsKKwkJCWlmICghKnVzZWQgfHwgdGltZV9hZnRlcihzdGF0cy0+dXNlZCwgKnVzZWQpKQorCQkJCSp1c2VkID0gc3RhdHMtPnVzZWQ7CisJCQkqdGNwX2ZsYWdzIHw9IHN0YXRzLT50Y3BfZmxhZ3M7CisJCQlvdnNfc3RhdHMtPm5fcGFja2V0cyArPSBzdGF0cy0+cGFja2V0X2NvdW50OworCQkJb3ZzX3N0YXRzLT5uX2J5dGVzICs9IHN0YXRzLT5ieXRlX2NvdW50OworCQkJc3Bpbl91bmxvY2tfYmgoJnN0YXRzLT5sb2NrKTsKIAkJfQogCX0KLQlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAotc3RhdGljIHZvaWQgc3RhdHNfcmVzZXQoc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzKQotewotCXNwaW5fbG9jaygmc3RhdHMtPmxvY2spOwotCXN0YXRzLT51c2VkID0gMDsKLQlzdGF0cy0+cGFja2V0X2NvdW50ID0gMDsKLQlzdGF0cy0+Ynl0ZV9jb3VudCA9IDA7Ci0Jc3RhdHMtPnRjcF9mbGFncyA9IDA7Ci0Jc3Bpbl91bmxvY2soJnN0YXRzLT5sb2NrKTsKLX0KLQorLyogQ2FsbGVkIHdpdGggb3ZzX211dGV4LiAqLwogdm9pZCBvdnNfZmxvd19zdGF0c19jbGVhcihzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKIHsKLQlpbnQgY3B1OworCWludCBub2RlOwogCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWlmICghZmxvdy0+c3RhdHMuaXNfcGVyY3B1KSB7Ci0JCXN0YXRzX3Jlc2V0KGZsb3ctPnN0YXRzLnN0YXQpOwotCX0gZWxzZSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJCXN0YXRzX3Jlc2V0KHBlcl9jcHVfcHRyKGZsb3ctPnN0YXRzLmNwdV9zdGF0cywgY3B1KSk7CisJZm9yX2VhY2hfbm9kZShub2RlKSB7CisJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IG92c2xfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbbm9kZV0pOworCisJCWlmIChzdGF0cykgeworCQkJc3Bpbl9sb2NrX2JoKCZzdGF0cy0+bG9jayk7CisJCQlzdGF0cy0+dXNlZCA9IDA7CisJCQlzdGF0cy0+cGFja2V0X2NvdW50ID0gMDsKKwkJCXN0YXRzLT5ieXRlX2NvdW50ID0gMDsKKwkJCXN0YXRzLT50Y3BfZmxhZ3MgPSAwOworCQkJc3Bpbl91bmxvY2tfYmgoJnN0YXRzLT5sb2NrKTsKIAkJfQogCX0KLQlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAogc3RhdGljIGludCBjaGVja19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKQEAgLTMzMiw4ICszNTQsOCBAQAogCS8qIFRoZSBJQ01QdjYgdHlwZSBhbmQgY29kZSBmaWVsZHMgdXNlIHRoZSAxNi1iaXQgdHJhbnNwb3J0IHBvcnQKIAkgKiBmaWVsZHMsIHNvIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBpbiAxNi1iaXQgbmV0d29yayBieXRlIG9yZGVyLgogCSAqLwotCWtleS0+aXB2Ni50cC5zcmMgPSBodG9ucyhpY21wLT5pY21wNl90eXBlKTsKLQlrZXktPmlwdjYudHAuZHN0ID0gaHRvbnMoaWNtcC0+aWNtcDZfY29kZSk7CisJa2V5LT50cC5zcmMgPSBodG9ucyhpY21wLT5pY21wNl90eXBlKTsKKwlrZXktPnRwLmRzdCA9IGh0b25zKGljbXAtPmljbXA2X2NvZGUpOwogCiAJaWYgKGljbXAtPmljbXA2X2NvZGUgPT0gMCAmJgogCSAgICAoaWNtcC0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OIHx8CkBAIC0zNzIsMTQgKzM5NCwxNCBAQAogCQkJICAgICYmIG9wdF9sZW4gPT0gOCkgewogCQkJCWlmICh1bmxpa2VseSghaXNfemVyb19ldGhlcl9hZGRyKGtleS0+aXB2Ni5uZC5zbGwpKSkKIAkJCQkJZ290byBpbnZhbGlkOwotCQkJCW1lbWNweShrZXktPmlwdjYubmQuc2xsLAotCQkJCSAgICAmbmQtPm9wdFtvZmZzZXQrc2l6ZW9mKCpuZF9vcHQpXSwgRVRIX0FMRU4pOworCQkJCWV0aGVyX2FkZHJfY29weShrZXktPmlwdjYubmQuc2xsLAorCQkJCQkJJm5kLT5vcHRbb2Zmc2V0K3NpemVvZigqbmRfb3B0KV0pOwogCQkJfSBlbHNlIGlmIChuZF9vcHQtPm5kX29wdF90eXBlID09IE5EX09QVF9UQVJHRVRfTExfQUREUgogCQkJCSAgICYmIG9wdF9sZW4gPT0gOCkgewogCQkJCWlmICh1bmxpa2VseSghaXNfemVyb19ldGhlcl9hZGRyKGtleS0+aXB2Ni5uZC50bGwpKSkKIAkJCQkJZ290byBpbnZhbGlkOwotCQkJCW1lbWNweShrZXktPmlwdjYubmQudGxsLAotCQkJCSAgICAmbmQtPm9wdFtvZmZzZXQrc2l6ZW9mKCpuZF9vcHQpXSwgRVRIX0FMRU4pOworCQkJCWV0aGVyX2FkZHJfY29weShrZXktPmlwdjYubmQudGxsLAorCQkJCQkJJm5kLT5vcHRbb2Zmc2V0K3NpemVvZigqbmRfb3B0KV0pOwogCQkJfQogCiAJCQlpY21wX2xlbiAtPSBvcHRfbGVuOwpAQCAtNDM5LDggKzQ2MSw4IEBACiAJICogaGVhZGVyIGluIHRoZSBsaW5lYXIgZGF0YSBhcmVhLgogCSAqLwogCWV0aCA9IGV0aF9oZHIoc2tiKTsKLQltZW1jcHkoa2V5LT5ldGguc3JjLCBldGgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGtleS0+ZXRoLmRzdCwgZXRoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoa2V5LT5ldGguc3JjLCBldGgtPmhfc291cmNlKTsKKwlldGhlcl9hZGRyX2NvcHkoa2V5LT5ldGguZHN0LCBldGgtPmhfZGVzdCk7CiAKIAlfX3NrYl9wdWxsKHNrYiwgMiAqIEVUSF9BTEVOKTsKIAkvKiBXZSBhcmUgZ29pbmcgdG8gcHVzaCBhbGwgaGVhZGVycyB0aGF0IHdlIHB1bGwsIHNvIG5vIG5lZWQgdG8KQEAgLTQ5NSwyMSArNTE3LDIxIEBACiAJCWlmIChrZXktPmlwLnByb3RvID09IElQUFJPVE9fVENQKSB7CiAJCQlpZiAodGNwaGRyX29rKHNrYikpIHsKIAkJCQlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSB0Y3BfaGRyKHNrYik7Ci0JCQkJa2V5LT5pcHY0LnRwLnNyYyA9IHRjcC0+c291cmNlOwotCQkJCWtleS0+aXB2NC50cC5kc3QgPSB0Y3AtPmRlc3Q7Ci0JCQkJa2V5LT5pcHY0LnRwLmZsYWdzID0gVENQX0ZMQUdTX0JFMTYodGNwKTsKKwkJCQlrZXktPnRwLnNyYyA9IHRjcC0+c291cmNlOworCQkJCWtleS0+dHAuZHN0ID0gdGNwLT5kZXN0OworCQkJCWtleS0+dHAuZmxhZ3MgPSBUQ1BfRkxBR1NfQkUxNih0Y3ApOwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gSVBQUk9UT19VRFApIHsKIAkJCWlmICh1ZHBoZHJfb2soc2tiKSkgewogCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IHVkcF9oZHIoc2tiKTsKLQkJCQlrZXktPmlwdjQudHAuc3JjID0gdWRwLT5zb3VyY2U7Ci0JCQkJa2V5LT5pcHY0LnRwLmRzdCA9IHVkcC0+ZGVzdDsKKwkJCQlrZXktPnRwLnNyYyA9IHVkcC0+c291cmNlOworCQkJCWtleS0+dHAuZHN0ID0gdWRwLT5kZXN0OwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gSVBQUk9UT19TQ1RQKSB7CiAJCQlpZiAoc2N0cGhkcl9vayhza2IpKSB7CiAJCQkJc3RydWN0IHNjdHBoZHIgKnNjdHAgPSBzY3RwX2hkcihza2IpOwotCQkJCWtleS0+aXB2NC50cC5zcmMgPSBzY3RwLT5zb3VyY2U7Ci0JCQkJa2V5LT5pcHY0LnRwLmRzdCA9IHNjdHAtPmRlc3Q7CisJCQkJa2V5LT50cC5zcmMgPSBzY3RwLT5zb3VyY2U7CisJCQkJa2V5LT50cC5kc3QgPSBzY3RwLT5kZXN0OwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gSVBQUk9UT19JQ01QKSB7CiAJCQlpZiAoaWNtcGhkcl9vayhza2IpKSB7CkBAIC01MTcsOCArNTM5LDggQEAKIAkJCQkvKiBUaGUgSUNNUCB0eXBlIGFuZCBjb2RlIGZpZWxkcyB1c2UgdGhlIDE2LWJpdAogCQkJCSAqIHRyYW5zcG9ydCBwb3J0IGZpZWxkcywgc28gd2UgbmVlZCB0byBzdG9yZQogCQkJCSAqIHRoZW0gaW4gMTYtYml0IG5ldHdvcmsgYnl0ZSBvcmRlci4gKi8KLQkJCQlrZXktPmlwdjQudHAuc3JjID0gaHRvbnMoaWNtcC0+dHlwZSk7Ci0JCQkJa2V5LT5pcHY0LnRwLmRzdCA9IGh0b25zKGljbXAtPmNvZGUpOworCQkJCWtleS0+dHAuc3JjID0gaHRvbnMoaWNtcC0+dHlwZSk7CisJCQkJa2V5LT50cC5kc3QgPSBodG9ucyhpY21wLT5jb2RlKTsKIAkJCX0KIAkJfQogCkBAIC01MzgsOCArNTYwLDggQEAKIAkJCQlrZXktPmlwLnByb3RvID0gbnRvaHMoYXJwLT5hcl9vcCk7CiAJCQltZW1jcHkoJmtleS0+aXB2NC5hZGRyLnNyYywgYXJwLT5hcl9zaXAsIHNpemVvZihrZXktPmlwdjQuYWRkci5zcmMpKTsKIAkJCW1lbWNweSgma2V5LT5pcHY0LmFkZHIuZHN0LCBhcnAtPmFyX3RpcCwgc2l6ZW9mKGtleS0+aXB2NC5hZGRyLmRzdCkpOwotCQkJbWVtY3B5KGtleS0+aXB2NC5hcnAuc2hhLCBhcnAtPmFyX3NoYSwgRVRIX0FMRU4pOwotCQkJbWVtY3B5KGtleS0+aXB2NC5hcnAudGhhLCBhcnAtPmFyX3RoYSwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KGtleS0+aXB2NC5hcnAuc2hhLCBhcnAtPmFyX3NoYSk7CisJCQlldGhlcl9hZGRyX2NvcHkoa2V5LT5pcHY0LmFycC50aGEsIGFycC0+YXJfdGhhKTsKIAkJfQogCX0gZWxzZSBpZiAoa2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewogCQlpbnQgbmhfbGVuOyAgICAgICAgICAgICAvKiBJUHY2IEhlYWRlciArIEV4dGVuc2lvbnMgKi8KQEAgLTU2NCwyMSArNTg2LDIxIEBACiAJCWlmIChrZXktPmlwLnByb3RvID09IE5FWFRIRFJfVENQKSB7CiAJCQlpZiAodGNwaGRyX29rKHNrYikpIHsKIAkJCQlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSB0Y3BfaGRyKHNrYik7Ci0JCQkJa2V5LT5pcHY2LnRwLnNyYyA9IHRjcC0+c291cmNlOwotCQkJCWtleS0+aXB2Ni50cC5kc3QgPSB0Y3AtPmRlc3Q7Ci0JCQkJa2V5LT5pcHY2LnRwLmZsYWdzID0gVENQX0ZMQUdTX0JFMTYodGNwKTsKKwkJCQlrZXktPnRwLnNyYyA9IHRjcC0+c291cmNlOworCQkJCWtleS0+dHAuZHN0ID0gdGNwLT5kZXN0OworCQkJCWtleS0+dHAuZmxhZ3MgPSBUQ1BfRkxBR1NfQkUxNih0Y3ApOwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gTkVYVEhEUl9VRFApIHsKIAkJCWlmICh1ZHBoZHJfb2soc2tiKSkgewogCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IHVkcF9oZHIoc2tiKTsKLQkJCQlrZXktPmlwdjYudHAuc3JjID0gdWRwLT5zb3VyY2U7Ci0JCQkJa2V5LT5pcHY2LnRwLmRzdCA9IHVkcC0+ZGVzdDsKKwkJCQlrZXktPnRwLnNyYyA9IHVkcC0+c291cmNlOworCQkJCWtleS0+dHAuZHN0ID0gdWRwLT5kZXN0OwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gTkVYVEhEUl9TQ1RQKSB7CiAJCQlpZiAoc2N0cGhkcl9vayhza2IpKSB7CiAJCQkJc3RydWN0IHNjdHBoZHIgKnNjdHAgPSBzY3RwX2hkcihza2IpOwotCQkJCWtleS0+aXB2Ni50cC5zcmMgPSBzY3RwLT5zb3VyY2U7Ci0JCQkJa2V5LT5pcHY2LnRwLmRzdCA9IHNjdHAtPmRlc3Q7CisJCQkJa2V5LT50cC5zcmMgPSBzY3RwLT5zb3VyY2U7CisJCQkJa2V5LT50cC5kc3QgPSBzY3RwLT5kZXN0OwogCQkJfQogCQl9IGVsc2UgaWYgKGtleS0+aXAucHJvdG8gPT0gTkVYVEhEUl9JQ01QKSB7CiAJCQlpZiAoaWNtcDZoZHJfb2soc2tiKSkgewpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuaCBiL25ldC9vcGVudnN3aXRjaC9mbG93LmgKaW5kZXggMmQ3NzBlMi4uYWMzOTVkMiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuaAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCkBAIC00Nyw3ICs0Nyw3IEBACiAJX19iZTE2IHR1bl9mbGFnczsKIAl1OCAgIGlwdjRfdG9zOwogCXU4ICAgaXB2NF90dGw7Ci19OworfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7IC8qIE1pbmltaXplIHBhZGRpbmcuICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvdnNfZmxvd190dW5fa2V5X2luaXQoc3RydWN0IG92c19rZXlfaXB2NF90dW5uZWwgKnR1bl9rZXksCiAJCQkJCSBjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwgX19iZTY0IHR1bl9pZCwKQEAgLTcxLDcgKzcxLDcgQEAKIAkJdTMyCXByaW9yaXR5OwkvKiBQYWNrZXQgUW9TIHByaW9yaXR5LiAqLwogCQl1MzIJc2tiX21hcms7CS8qIFNLQiBtYXJrLiAqLwogCQl1MTYJaW5fcG9ydDsJLyogSW5wdXQgc3dpdGNoIHBvcnQgKG9yIERQX01BWF9QT1JUUykuICovCi0JfSBwaHk7CisJfSBfX3BhY2tlZCBwaHk7IC8qIFNhZmUgd2hlbiByaWdodCBhZnRlciAndHVuX2tleScuICovCiAJc3RydWN0IHsKIAkJdTggICAgIHNyY1tFVEhfQUxFTl07CS8qIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzLiAqLwogCQl1OCAgICAgZHN0W0VUSF9BTEVOXTsJLyogRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcy4gKi8KQEAgLTg0LDIzICs4NCwyMSBAQAogCQl1OCAgICAgdHRsOwkJLyogSVAgVFRML2hvcCBsaW1pdC4gKi8KIAkJdTggICAgIGZyYWc7CQkvKiBPbmUgb2YgT1ZTX0ZSQUdfVFlQRV8qLiAqLwogCX0gaXA7CisJc3RydWN0IHsKKwkJX19iZTE2IHNyYzsJCS8qIFRDUC9VRFAvU0NUUCBzb3VyY2UgcG9ydC4gKi8KKwkJX19iZTE2IGRzdDsJCS8qIFRDUC9VRFAvU0NUUCBkZXN0aW5hdGlvbiBwb3J0LiAqLworCQlfX2JlMTYgZmxhZ3M7CQkvKiBUQ1AgZmxhZ3MuICovCisJfSB0cDsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgewogCQkJCV9fYmUzMiBzcmM7CS8qIElQIHNvdXJjZSBhZGRyZXNzLiAqLwogCQkJCV9fYmUzMiBkc3Q7CS8qIElQIGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCiAJCQl9IGFkZHI7Ci0JCQl1bmlvbiB7Ci0JCQkJc3RydWN0IHsKLQkJCQkJX19iZTE2IHNyYzsJCS8qIFRDUC9VRFAvU0NUUCBzb3VyY2UgcG9ydC4gKi8KLQkJCQkJX19iZTE2IGRzdDsJCS8qIFRDUC9VRFAvU0NUUCBkZXN0aW5hdGlvbiBwb3J0LiAqLwotCQkJCQlfX2JlMTYgZmxhZ3M7CQkvKiBUQ1AgZmxhZ3MuICovCi0JCQkJfSB0cDsKLQkJCQlzdHJ1Y3QgewotCQkJCQl1OCBzaGFbRVRIX0FMRU5dOwkvKiBBUlAgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuICovCi0JCQkJCXU4IHRoYVtFVEhfQUxFTl07CS8qIEFSUCB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KLQkJCQl9IGFycDsKLQkJCX07CisJCQlzdHJ1Y3QgeworCQkJCXU4IHNoYVtFVEhfQUxFTl07CS8qIEFSUCBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwkJCQl1OCB0aGFbRVRIX0FMRU5dOwkvKiBBUlAgdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJCQl9IGFycDsKIAkJfSBpcHY0OwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IHsKQEAgLTEwOSwxMSArMTA3LDYgQEAKIAkJCX0gYWRkcjsKIAkJCV9fYmUzMiBsYWJlbDsJCQkvKiBJUHY2IGZsb3cgbGFiZWwuICovCiAJCQlzdHJ1Y3QgewotCQkJCV9fYmUxNiBzcmM7CQkvKiBUQ1AvVURQL1NDVFAgc291cmNlIHBvcnQuICovCi0JCQkJX19iZTE2IGRzdDsJCS8qIFRDUC9VRFAvU0NUUCBkZXN0aW5hdGlvbiBwb3J0LiAqLwotCQkJCV9fYmUxNiBmbGFnczsJCS8qIFRDUCBmbGFncy4gKi8KLQkJCX0gdHA7Ci0JCQlzdHJ1Y3QgewogCQkJCXN0cnVjdCBpbjZfYWRkciB0YXJnZXQ7CS8qIE5EIHRhcmdldCBhZGRyZXNzLiAqLwogCQkJCXU4IHNsbFtFVEhfQUxFTl07CS8qIE5EIHNvdXJjZSBsaW5rIGxheWVyIGFkZHJlc3MuICovCiAJCQkJdTggdGxsW0VUSF9BTEVOXTsJLyogTkQgdGFyZ2V0IGxpbmsgbGF5ZXIgYWRkcmVzcy4gKi8KQEAgLTE1NSwyNCArMTQ4LDIyIEBACiAJX19iZTE2IHRjcF9mbGFnczsJCS8qIFVuaW9uIG9mIHNlZW4gVENQIGZsYWdzLiAqLwogfTsKIAotc3RydWN0IHN3X2Zsb3dfc3RhdHMgewotCWJvb2wgaXNfcGVyY3B1OwotCXVuaW9uIHsKLQkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXQ7Ci0JCXN0cnVjdCBmbG93X3N0YXRzIF9fcGVyY3B1ICpjcHVfc3RhdHM7Ci0JfTsKLX07Ci0KIHN0cnVjdCBzd19mbG93IHsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfbm9kZVsyXTsKIAl1MzIgaGFzaDsKLQorCWludCBzdGF0c19sYXN0X3dyaXRlcjsJCS8qIE5VTUEtbm9kZSBpZCBvZiB0aGUgbGFzdCB3cml0ZXIgb24KKwkJCQkJICogJ3N0YXRzWzBdJy4KKwkJCQkJICovCiAJc3RydWN0IHN3X2Zsb3dfa2V5IGtleTsKIAlzdHJ1Y3Qgc3dfZmxvd19rZXkgdW5tYXNrZWRfa2V5OwogCXN0cnVjdCBzd19mbG93X21hc2sgKm1hc2s7CiAJc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyBfX3JjdSAqc2ZfYWN0czsKLQlzdHJ1Y3Qgc3dfZmxvd19zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgZmxvd19zdGF0cyBfX3JjdSAqc3RhdHNbXTsgLyogT25lIGZvciBlYWNoIE5VTUEgbm9kZS4gIEZpcnN0IG9uZQorCQkJCQkgICAqIGlzIGFsbG9jYXRlZCBhdCBmbG93IGNyZWF0aW9uIHRpbWUsCisJCQkJCSAgICogdGhlIHJlc3QgYXJlIGFsbG9jYXRlZCBvbiBkZW1hbmQKKwkJCQkJICAgKiB3aGlsZSBob2xkaW5nIHRoZSAnc3RhdHNbMF0ubG9jaycuCisJCQkJCSAgICovCiB9OwogCiBzdHJ1Y3QgYXJwX2V0aF9oZWFkZXIgewpAQCAtMTg5LDEwICsxODAsMTAgQEAKIAl1bnNpZ25lZCBjaGFyICAgICAgIGFyX3RpcFs0XTsJCS8qIHRhcmdldCBJUCBhZGRyZXNzICAgICAgICAqLwogfSBfX3BhY2tlZDsKIAotdm9pZCBvdnNfZmxvd19zdGF0c191cGRhdGUoc3RydWN0IHN3X2Zsb3cgKmZsb3csIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBvdnNfZmxvd19zdGF0c19nZXQoc3RydWN0IHN3X2Zsb3cgKmZsb3csIHN0cnVjdCBvdnNfZmxvd19zdGF0cyAqc3RhdHMsCit2b2lkIG92c19mbG93X3N0YXRzX3VwZGF0ZShzdHJ1Y3Qgc3dfZmxvdyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3ZvaWQgb3ZzX2Zsb3dfc3RhdHNfZ2V0KGNvbnN0IHN0cnVjdCBzd19mbG93ICosIHN0cnVjdCBvdnNfZmxvd19zdGF0cyAqLAogCQkJdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpOwotdm9pZCBvdnNfZmxvd19zdGF0c19jbGVhcihzdHJ1Y3Qgc3dfZmxvdyAqZmxvdyk7Cit2b2lkIG92c19mbG93X3N0YXRzX2NsZWFyKHN0cnVjdCBzd19mbG93ICopOwogdTY0IG92c19mbG93X3VzZWRfdGltZSh1bnNpZ25lZCBsb25nIGZsb3dfamlmZmllcyk7CiAKIGludCBvdnNfZmxvd19leHRyYWN0KHN0cnVjdCBza19idWZmICosIHUxNiBpbl9wb3J0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKik7CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKaW5kZXggNGQwMDBhYy4uZDc1Nzg0OCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYwpAQCAtMTYsNiArMTYsOCBAQAogICogMDIxMTAtMTMwMSwgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAiZmxvdy5oIgogI2luY2x1ZGUgImRhdGFwYXRoLmgiCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtMjAyLDExICsyMDQsMTEgQEAKIAkJCQlpZiAobWF0Y2gtPm1hc2sgJiYgKG1hdGNoLT5tYXNrLT5rZXkuaXAucHJvdG8gPT0gMHhmZikpCiAJCQkJCW1hc2tfYWxsb3dlZCB8PSAxIDw8IE9WU19LRVlfQVRUUl9JQ01QVjY7CiAKLQkJCQlpZiAobWF0Y2gtPmtleS0+aXB2Ni50cC5zcmMgPT0KKwkJCQlpZiAobWF0Y2gtPmtleS0+dHAuc3JjID09CiAJCQkJCQlodG9ucyhORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKSB8fAotCQkJCSAgICBtYXRjaC0+a2V5LT5pcHY2LnRwLnNyYyA9PSBodG9ucyhORElTQ19ORUlHSEJPVVJfQURWRVJUSVNFTUVOVCkpIHsKKwkJCQkgICAgbWF0Y2gtPmtleS0+dHAuc3JjID09IGh0b25zKE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UKSkgewogCQkJCQlrZXlfZXhwZWN0ZWQgfD0gMSA8PCBPVlNfS0VZX0FUVFJfTkQ7Ci0JCQkJCWlmIChtYXRjaC0+bWFzayAmJiAobWF0Y2gtPm1hc2stPmtleS5pcHY2LnRwLnNyYyA9PSBodG9ucygweGZmZmYpKSkKKwkJCQkJaWYgKG1hdGNoLT5tYXNrICYmIChtYXRjaC0+bWFzay0+a2V5LnRwLnNyYyA9PSBodG9ucygweGZmZmYpKSkKIAkJCQkJCW1hc2tfYWxsb3dlZCB8PSAxIDw8IE9WU19LRVlfQVRUUl9ORDsKIAkJCQl9CiAJCQl9CkBAIC0yMTYsMTQgKzIxOCwxNCBAQAogCWlmICgoa2V5X2F0dHJzICYga2V5X2V4cGVjdGVkKSAhPSBrZXlfZXhwZWN0ZWQpIHsKIAkJLyogS2V5IGF0dHJpYnV0ZXMgY2hlY2sgZmFpbGVkLiAqLwogCQlPVlNfTkxFUlIoIk1pc3NpbmcgZXhwZWN0ZWQga2V5IGF0dHJpYnV0ZXMgKGtleV9hdHRycz0lbGx4LCBleHBlY3RlZD0lbGx4KS5cbiIsCi0JCQkJa2V5X2F0dHJzLCBrZXlfZXhwZWN0ZWQpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpa2V5X2F0dHJzLCAodW5zaWduZWQgbG9uZyBsb25nKWtleV9leHBlY3RlZCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlpZiAoKG1hc2tfYXR0cnMgJiBtYXNrX2FsbG93ZWQpICE9IG1hc2tfYXR0cnMpIHsKIAkJLyogTWFzayBhdHRyaWJ1dGVzIGNoZWNrIGZhaWxlZC4gKi8KIAkJT1ZTX05MRVJSKCJDb250YWluIG1vcmUgdGhhbiBhbGxvd2VkIG1hc2sgZmllbGRzIChtYXNrX2F0dHJzPSVsbHgsIG1hc2tfYWxsb3dlZD0lbGx4KS5cbiIsCi0JCQkJbWFza19hdHRycywgbWFza19hbGxvd2VkKTsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1hc2tfYXR0cnMsICh1bnNpZ25lZCBsb25nIGxvbmcpbWFza19hbGxvd2VkKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMjY2LDIwICsyNjgsNiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBpc19hbGxfc2V0KGNvbnN0IHU4ICpmcCwgc2l6ZV90IHNpemUpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIWZwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlpZiAoZnBbaV0gIT0gMHhmZikKLQkJCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCiBzdGF0aWMgaW50IF9fcGFyc2VfZmxvd19ubGF0dHJzKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsCiAJCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtdLAogCQkJCXU2NCAqYXR0cnNwLCBib29sIG56KQpAQCAtNTAxLDkgKzQ4OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3ZzX2tleV9mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLCAgYm9vbCAqZXhhY3RfNXR1cGxlLAotCQkJCXU2NCBhdHRycywgY29uc3Qgc3RydWN0IG5sYXR0ciAqKmEsCi0JCQkJYm9vbCBpc19tYXNrKQorc3RhdGljIGludCBvdnNfa2V5X2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsIHU2NCBhdHRycywKKwkJCQljb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwgYm9vbCBpc19tYXNrKQogewogCWludCBlcnI7CiAJdTY0IG9yaWdfYXR0cnMgPSBhdHRyczsKQEAgLTU2MCwxMSArNTQ3LDYgQEAKIAkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBldGgudHlwZSwgaHRvbnMoRVRIX1BfODAyXzIpLCBpc19tYXNrKTsKIAl9CiAKLQlpZiAoaXNfbWFzayAmJiBleGFjdF81dHVwbGUpIHsKLQkJaWYgKG1hdGNoLT5tYXNrLT5rZXkuZXRoLnR5cGUgIT0gaHRvbnMoMHhmZmZmKSkKLQkJCSpleGFjdF81dHVwbGUgPSBmYWxzZTsKLQl9Ci0KIAlpZiAoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfSVBWNCkpIHsKIAkJY29uc3Qgc3RydWN0IG92c19rZXlfaXB2NCAqaXB2NF9rZXk7CiAKQEAgLTU4NywxMyArNTY5LDYgQEAKIAkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY0LmFkZHIuZHN0LAogCQkJCWlwdjRfa2V5LT5pcHY0X2RzdCwgaXNfbWFzayk7CiAJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfSVBWNCk7Ci0KLQkJaWYgKGlzX21hc2sgJiYgZXhhY3RfNXR1cGxlICYmICpleGFjdF81dHVwbGUpIHsKLQkJCWlmIChpcHY0X2tleS0+aXB2NF9wcm90byAhPSAweGZmIHx8Ci0JCQkgICAgaXB2NF9rZXktPmlwdjRfc3JjICE9IGh0b25sKDB4ZmZmZmZmZmYpIHx8Ci0JCQkgICAgaXB2NF9rZXktPmlwdjRfZHN0ICE9IGh0b25sKDB4ZmZmZmZmZmYpKQotCQkJCSpleGFjdF81dHVwbGUgPSBmYWxzZTsKLQkJfQogCX0KIAogCWlmIChhdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9JUFY2KSkgewpAQCAtNjI1LDEzICs2MDAsNiBAQAogCQkJCWlzX21hc2spOwogCiAJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfSVBWNik7Ci0KLQkJaWYgKGlzX21hc2sgJiYgZXhhY3RfNXR1cGxlICYmICpleGFjdF81dHVwbGUpIHsKLQkJCWlmIChpcHY2X2tleS0+aXB2Nl9wcm90byAhPSAweGZmIHx8Ci0JCQkgICAgIWlzX2FsbF9zZXQoKHU4ICopaXB2Nl9rZXktPmlwdjZfc3JjLCBzaXplb2YobWF0Y2gtPmtleS0+aXB2Ni5hZGRyLnNyYykpIHx8Ci0JCQkgICAgIWlzX2FsbF9zZXQoKHU4ICopaXB2Nl9rZXktPmlwdjZfZHN0LCBzaXplb2YobWF0Y2gtPmtleS0+aXB2Ni5hZGRyLmRzdCkpKQotCQkJCSpleGFjdF81dHVwbGUgPSBmYWxzZTsKLQkJfQogCX0KIAogCWlmIChhdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9BUlApKSB7CkBAIC02NjIsMzIgKzYzMCwxOCBAQAogCQljb25zdCBzdHJ1Y3Qgb3ZzX2tleV90Y3AgKnRjcF9rZXk7CiAKIAkJdGNwX2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX1RDUF0pOwotCQlpZiAob3JpZ19hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9JUFY0KSkgewotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY0LnRwLnNyYywKLQkJCQkJdGNwX2tleS0+dGNwX3NyYywgaXNfbWFzayk7Ci0JCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjQudHAuZHN0LAotCQkJCQl0Y3Bfa2V5LT50Y3BfZHN0LCBpc19tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgaXB2Ni50cC5zcmMsCi0JCQkJCXRjcF9rZXktPnRjcF9zcmMsIGlzX21hc2spOwotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY2LnRwLmRzdCwKLQkJCQkJdGNwX2tleS0+dGNwX2RzdCwgaXNfbWFzayk7Ci0JCX0KKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0cC5zcmMsIHRjcF9rZXktPnRjcF9zcmMsIGlzX21hc2spOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLmRzdCwgdGNwX2tleS0+dGNwX2RzdCwgaXNfbWFzayk7CiAJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfVENQKTsKLQotCQlpZiAoaXNfbWFzayAmJiBleGFjdF81dHVwbGUgJiYgKmV4YWN0XzV0dXBsZSAmJgotCQkgICAgKHRjcF9rZXktPnRjcF9zcmMgIT0gaHRvbnMoMHhmZmZmKSB8fAotCQkgICAgIHRjcF9rZXktPnRjcF9kc3QgIT0gaHRvbnMoMHhmZmZmKSkpCi0JCQkqZXhhY3RfNXR1cGxlID0gZmFsc2U7CiAJfQogCiAJaWYgKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1RDUF9GTEFHUykpIHsKIAkJaWYgKG9yaWdfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfSVBWNCkpIHsKLQkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgaXB2NC50cC5mbGFncywKKwkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgdHAuZmxhZ3MsCiAJCQkJCW5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9UQ1BfRkxBR1NdKSwKIAkJCQkJaXNfbWFzayk7CiAJCX0gZWxzZSB7Ci0JCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjYudHAuZmxhZ3MsCisJCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLmZsYWdzLAogCQkJCQlubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVENQX0ZMQUdTXSksCiAJCQkJCWlzX21hc2spOwogCQl9CkBAIC02OTgsNDAgKzY1MiwxNyBAQAogCQljb25zdCBzdHJ1Y3Qgb3ZzX2tleV91ZHAgKnVkcF9rZXk7CiAKIAkJdWRwX2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX1VEUF0pOwotCQlpZiAob3JpZ19hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9JUFY0KSkgewotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY0LnRwLnNyYywKLQkJCQkJdWRwX2tleS0+dWRwX3NyYywgaXNfbWFzayk7Ci0JCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjQudHAuZHN0LAotCQkJCQl1ZHBfa2V5LT51ZHBfZHN0LCBpc19tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgaXB2Ni50cC5zcmMsCi0JCQkJCXVkcF9rZXktPnVkcF9zcmMsIGlzX21hc2spOwotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY2LnRwLmRzdCwKLQkJCQkJdWRwX2tleS0+dWRwX2RzdCwgaXNfbWFzayk7Ci0JCX0KKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0cC5zcmMsIHVkcF9rZXktPnVkcF9zcmMsIGlzX21hc2spOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLmRzdCwgdWRwX2tleS0+dWRwX2RzdCwgaXNfbWFzayk7CiAJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfVURQKTsKLQotCQlpZiAoaXNfbWFzayAmJiBleGFjdF81dHVwbGUgJiYgKmV4YWN0XzV0dXBsZSAmJgotCQkgICAgKHVkcF9rZXktPnVkcF9zcmMgIT0gaHRvbnMoMHhmZmZmKSB8fAotCQkgICAgIHVkcF9rZXktPnVkcF9kc3QgIT0gaHRvbnMoMHhmZmZmKSkpCi0JCQkqZXhhY3RfNXR1cGxlID0gZmFsc2U7CiAJfQogCiAJaWYgKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1NDVFApKSB7CiAJCWNvbnN0IHN0cnVjdCBvdnNfa2V5X3NjdHAgKnNjdHBfa2V5OwogCiAJCXNjdHBfa2V5ID0gbmxhX2RhdGEoYVtPVlNfS0VZX0FUVFJfU0NUUF0pOwotCQlpZiAob3JpZ19hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9JUFY0KSkgewotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY0LnRwLnNyYywKLQkJCQkJc2N0cF9rZXktPnNjdHBfc3JjLCBpc19tYXNrKTsKLQkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgaXB2NC50cC5kc3QsCi0JCQkJCXNjdHBfa2V5LT5zY3RwX2RzdCwgaXNfbWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjYudHAuc3JjLAotCQkJCQlzY3RwX2tleS0+c2N0cF9zcmMsIGlzX21hc2spOwotCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY2LnRwLmRzdCwKLQkJCQkJc2N0cF9rZXktPnNjdHBfZHN0LCBpc19tYXNrKTsKLQkJfQorCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLnNyYywgc2N0cF9rZXktPnNjdHBfc3JjLCBpc19tYXNrKTsKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0cC5kc3QsIHNjdHBfa2V5LT5zY3RwX2RzdCwgaXNfbWFzayk7CiAJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfU0NUUCk7CiAJfQogCkBAIC03MzksOSArNjcwLDkgQEAKIAkJY29uc3Qgc3RydWN0IG92c19rZXlfaWNtcCAqaWNtcF9rZXk7CiAKIAkJaWNtcF9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9JQ01QXSk7Ci0JCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgaXB2NC50cC5zcmMsCisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgdHAuc3JjLAogCQkJCWh0b25zKGljbXBfa2V5LT5pY21wX3R5cGUpLCBpc19tYXNrKTsKLQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBpcHY0LnRwLmRzdCwKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0cC5kc3QsCiAJCQkJaHRvbnMoaWNtcF9rZXktPmljbXBfY29kZSksIGlzX21hc2spOwogCQlhdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0lDTVApOwogCX0KQEAgLTc1MCw5ICs2ODEsOSBAQAogCQljb25zdCBzdHJ1Y3Qgb3ZzX2tleV9pY21wdjYgKmljbXB2Nl9rZXk7CiAKIAkJaWNtcHY2X2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX0lDTVBWNl0pOwotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjYudHAuc3JjLAorCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLnNyYywKIAkJCQlodG9ucyhpY21wdjZfa2V5LT5pY21wdjZfdHlwZSksIGlzX21hc2spOwotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGlwdjYudHAuZHN0LAorCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIHRwLmRzdCwKIAkJCQlodG9ucyhpY21wdjZfa2V5LT5pY21wdjZfY29kZSksIGlzX21hc2spOwogCQlhdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0lDTVBWNik7CiAJfQpAQCAtODAwLDcgKzczMSw2IEBACiAgKiBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBtYXNrIGZpZWxkIG9mIHRoZSB3aWxkY2FyZGVkIGZsb3cuCiAgKi8KIGludCBvdnNfbmxhX2dldF9tYXRjaChzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCi0JCSAgICAgIGJvb2wgKmV4YWN0XzV0dXBsZSwKIAkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqa2V5LAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICptYXNrKQogewpAQCAtODQ4LDEzICs3NzgsMTAgQEAKIAkJfQogCX0KIAotCWVyciA9IG92c19rZXlfZnJvbV9ubGF0dHJzKG1hdGNoLCBOVUxMLCBrZXlfYXR0cnMsIGEsIGZhbHNlKTsKKwllcnIgPSBvdnNfa2V5X2Zyb21fbmxhdHRycyhtYXRjaCwga2V5X2F0dHJzLCBhLCBmYWxzZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChleGFjdF81dHVwbGUpCi0JCSpleGFjdF81dHVwbGUgPSB0cnVlOwotCiAJaWYgKG1hc2spIHsKIAkJZXJyID0gcGFyc2VfZmxvd19tYXNrX25sYXR0cnMobWFzaywgYSwgJm1hc2tfYXR0cnMpOwogCQlpZiAoZXJyKQpAQCAtODkyLDcgKzgxOSw3IEBACiAJCQl9CiAJCX0KIAotCQllcnIgPSBvdnNfa2V5X2Zyb21fbmxhdHRycyhtYXRjaCwgZXhhY3RfNXR1cGxlLCBtYXNrX2F0dHJzLCBhLCB0cnVlKTsKKwkJZXJyID0gb3ZzX2tleV9mcm9tX25sYXR0cnMobWF0Y2gsIG1hc2tfYXR0cnMsIGEsIHRydWUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgewpAQCAtOTgyLDggKzkwOSw4IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJZXRoX2tleSA9IG5sYV9kYXRhKG5sYSk7Ci0JbWVtY3B5KGV0aF9rZXktPmV0aF9zcmMsIG91dHB1dC0+ZXRoLnNyYywgRVRIX0FMRU4pOwotCW1lbWNweShldGhfa2V5LT5ldGhfZHN0LCBvdXRwdXQtPmV0aC5kc3QsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoZXRoX2tleS0+ZXRoX3NyYywgb3V0cHV0LT5ldGguc3JjKTsKKwlldGhlcl9hZGRyX2NvcHkoZXRoX2tleS0+ZXRoX2RzdCwgb3V0cHV0LT5ldGguZHN0KTsKIAogCWlmIChzd2tleS0+ZXRoLnRjaSB8fCBzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCV9fYmUxNiBldGhfdHlwZTsKQEAgLTEwNTUsOCArOTgyLDggQEAKIAkJYXJwX2tleS0+YXJwX3NpcCA9IG91dHB1dC0+aXB2NC5hZGRyLnNyYzsKIAkJYXJwX2tleS0+YXJwX3RpcCA9IG91dHB1dC0+aXB2NC5hZGRyLmRzdDsKIAkJYXJwX2tleS0+YXJwX29wID0gaHRvbnMob3V0cHV0LT5pcC5wcm90byk7Ci0JCW1lbWNweShhcnBfa2V5LT5hcnBfc2hhLCBvdXRwdXQtPmlwdjQuYXJwLnNoYSwgRVRIX0FMRU4pOwotCQltZW1jcHkoYXJwX2tleS0+YXJwX3RoYSwgb3V0cHV0LT5pcHY0LmFycC50aGEsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGFycF9rZXktPmFycF9zaGEsIG91dHB1dC0+aXB2NC5hcnAuc2hhKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGFycF9rZXktPmFycF90aGEsIG91dHB1dC0+aXB2NC5hcnAudGhhKTsKIAl9CiAKIAlpZiAoKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkgfHwKQEAgLTEwNzAsMTkgKzk5NywxMSBAQAogCQkJaWYgKCFubGEpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCQl0Y3Bfa2V5ID0gbmxhX2RhdGEobmxhKTsKLQkJCWlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCQkJdGNwX2tleS0+dGNwX3NyYyA9IG91dHB1dC0+aXB2NC50cC5zcmM7Ci0JCQkJdGNwX2tleS0+dGNwX2RzdCA9IG91dHB1dC0+aXB2NC50cC5kc3Q7Ci0JCQkJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9UQ1BfRkxBR1MsCi0JCQkJCQkgb3V0cHV0LT5pcHY0LnRwLmZsYWdzKSkKLQkJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCQl9IGVsc2UgaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQkJCXRjcF9rZXktPnRjcF9zcmMgPSBvdXRwdXQtPmlwdjYudHAuc3JjOwotCQkJCXRjcF9rZXktPnRjcF9kc3QgPSBvdXRwdXQtPmlwdjYudHAuZHN0OwotCQkJCWlmIChubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfVENQX0ZMQUdTLAotCQkJCQkJIG91dHB1dC0+aXB2Ni50cC5mbGFncykpCi0JCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCQkJfQorCQkJdGNwX2tleS0+dGNwX3NyYyA9IG91dHB1dC0+dHAuc3JjOworCQkJdGNwX2tleS0+dGNwX2RzdCA9IG91dHB1dC0+dHAuZHN0OworCQkJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9UQ1BfRkxBR1MsCisJCQkJCSBvdXRwdXQtPnRwLmZsYWdzKSkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJfSBlbHNlIGlmIChzd2tleS0+aXAucHJvdG8gPT0gSVBQUk9UT19VRFApIHsKIAkJCXN0cnVjdCBvdnNfa2V5X3VkcCAqdWRwX2tleTsKIApAQCAtMTA5MCwxMyArMTAwOSw4IEBACiAJCQlpZiAoIW5sYSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJCXVkcF9rZXkgPSBubGFfZGF0YShubGEpOwotCQkJaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJCQl1ZHBfa2V5LT51ZHBfc3JjID0gb3V0cHV0LT5pcHY0LnRwLnNyYzsKLQkJCQl1ZHBfa2V5LT51ZHBfZHN0ID0gb3V0cHV0LT5pcHY0LnRwLmRzdDsKLQkJCX0gZWxzZSBpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpKSB7Ci0JCQkJdWRwX2tleS0+dWRwX3NyYyA9IG91dHB1dC0+aXB2Ni50cC5zcmM7Ci0JCQkJdWRwX2tleS0+dWRwX2RzdCA9IG91dHB1dC0+aXB2Ni50cC5kc3Q7Ci0JCQl9CisJCQl1ZHBfa2V5LT51ZHBfc3JjID0gb3V0cHV0LT50cC5zcmM7CisJCQl1ZHBfa2V5LT51ZHBfZHN0ID0gb3V0cHV0LT50cC5kc3Q7CiAJCX0gZWxzZSBpZiAoc3drZXktPmlwLnByb3RvID09IElQUFJPVE9fU0NUUCkgewogCQkJc3RydWN0IG92c19rZXlfc2N0cCAqc2N0cF9rZXk7CiAKQEAgLTExMDQsMTMgKzEwMTgsOCBAQAogCQkJaWYgKCFubGEpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCQlzY3RwX2tleSA9IG5sYV9kYXRhKG5sYSk7Ci0JCQlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSkgewotCQkJCXNjdHBfa2V5LT5zY3RwX3NyYyA9IHN3a2V5LT5pcHY0LnRwLnNyYzsKLQkJCQlzY3RwX2tleS0+c2N0cF9kc3QgPSBzd2tleS0+aXB2NC50cC5kc3Q7Ci0JCQl9IGVsc2UgaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQkJCXNjdHBfa2V5LT5zY3RwX3NyYyA9IHN3a2V5LT5pcHY2LnRwLnNyYzsKLQkJCQlzY3RwX2tleS0+c2N0cF9kc3QgPSBzd2tleS0+aXB2Ni50cC5kc3Q7Ci0JCQl9CisJCQlzY3RwX2tleS0+c2N0cF9zcmMgPSBvdXRwdXQtPnRwLnNyYzsKKwkJCXNjdHBfa2V5LT5zY3RwX2RzdCA9IG91dHB1dC0+dHAuZHN0OwogCQl9IGVsc2UgaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkgJiYKIAkJCSAgIHN3a2V5LT5pcC5wcm90byA9PSBJUFBST1RPX0lDTVApIHsKIAkJCXN0cnVjdCBvdnNfa2V5X2ljbXAgKmljbXBfa2V5OwpAQCAtMTExOSw4ICsxMDI4LDggQEAKIAkJCWlmICghbmxhKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkJaWNtcF9rZXkgPSBubGFfZGF0YShubGEpOwotCQkJaWNtcF9rZXktPmljbXBfdHlwZSA9IG50b2hzKG91dHB1dC0+aXB2NC50cC5zcmMpOwotCQkJaWNtcF9rZXktPmljbXBfY29kZSA9IG50b2hzKG91dHB1dC0+aXB2NC50cC5kc3QpOworCQkJaWNtcF9rZXktPmljbXBfdHlwZSA9IG50b2hzKG91dHB1dC0+dHAuc3JjKTsKKwkJCWljbXBfa2V5LT5pY21wX2NvZGUgPSBudG9ocyhvdXRwdXQtPnRwLmRzdCk7CiAJCX0gZWxzZSBpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpICYmCiAJCQkgICBzd2tleS0+aXAucHJvdG8gPT0gSVBQUk9UT19JQ01QVjYpIHsKIAkJCXN0cnVjdCBvdnNfa2V5X2ljbXB2NiAqaWNtcHY2X2tleTsKQEAgLTExMzAsOCArMTAzOSw4IEBACiAJCQlpZiAoIW5sYSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJCWljbXB2Nl9rZXkgPSBubGFfZGF0YShubGEpOwotCQkJaWNtcHY2X2tleS0+aWNtcHY2X3R5cGUgPSBudG9ocyhvdXRwdXQtPmlwdjYudHAuc3JjKTsKLQkJCWljbXB2Nl9rZXktPmljbXB2Nl9jb2RlID0gbnRvaHMob3V0cHV0LT5pcHY2LnRwLmRzdCk7CisJCQlpY21wdjZfa2V5LT5pY21wdjZfdHlwZSA9IG50b2hzKG91dHB1dC0+dHAuc3JjKTsKKwkJCWljbXB2Nl9rZXktPmljbXB2Nl9jb2RlID0gbnRvaHMob3V0cHV0LT50cC5kc3QpOwogCiAJCQlpZiAoaWNtcHY2X2tleS0+aWNtcHY2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTiB8fAogCQkJICAgIGljbXB2Nl9rZXktPmljbXB2Nl90eXBlID09IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UKSB7CkBAIC0xMTQzLDggKzEwNTIsOCBAQAogCQkJCW5kX2tleSA9IG5sYV9kYXRhKG5sYSk7CiAJCQkJbWVtY3B5KG5kX2tleS0+bmRfdGFyZ2V0LCAmb3V0cHV0LT5pcHY2Lm5kLnRhcmdldCwKIAkJCQkJCQlzaXplb2YobmRfa2V5LT5uZF90YXJnZXQpKTsKLQkJCQltZW1jcHkobmRfa2V5LT5uZF9zbGwsIG91dHB1dC0+aXB2Ni5uZC5zbGwsIEVUSF9BTEVOKTsKLQkJCQltZW1jcHkobmRfa2V5LT5uZF90bGwsIG91dHB1dC0+aXB2Ni5uZC50bGwsIEVUSF9BTEVOKTsKKwkJCQlldGhlcl9hZGRyX2NvcHkobmRfa2V5LT5uZF9zbGwsIG91dHB1dC0+aXB2Ni5uZC5zbGwpOworCQkJCWV0aGVyX2FkZHJfY29weShuZF9rZXktPm5kX3RsbCwgb3V0cHV0LT5pcHY2Lm5kLnRsbCk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMzA5LDEzICsxMjE4LDEwIEBACiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfdHBfcG9ydChjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmZsb3dfa2V5KQogewotCWlmIChmbG93X2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCWlmIChmbG93X2tleS0+aXB2NC50cC5zcmMgfHwgZmxvd19rZXktPmlwdjQudHAuZHN0KQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChmbG93X2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJaWYgKGZsb3dfa2V5LT5pcHY2LnRwLnNyYyB8fCBmbG93X2tleS0+aXB2Ni50cC5kc3QpCi0JCQlyZXR1cm4gMDsKLQl9CisJaWYgKChmbG93X2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApIHx8CisJICAgICBmbG93X2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpICYmCisJICAgIChmbG93X2tleS0+dHAuc3JjIHx8IGZsb3dfa2V5LT50cC5kc3QpKQorCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oCmluZGV4IGIzMWZiZTIuLjQ0MDE1MTAgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmgKQEAgLTQ1LDcgKzQ1LDYgQEAKIGludCBvdnNfbmxhX2dldF9mbG93X21ldGFkYXRhKHN0cnVjdCBzd19mbG93ICpmbG93LAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cik7CiBpbnQgb3ZzX25sYV9nZXRfbWF0Y2goc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAotCQkgICAgICBib29sICpleGFjdF81dHVwbGUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiwKIAkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqKTsKIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYyBiL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMKaW5kZXggM2MyNjhiMy4uNTc0YzNhYiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jCkBAIC00OCw2ICs0OCw3IEBACiAjZGVmaW5lIFJFSEFTSF9JTlRFUlZBTAkJKDEwICogNjAgKiBIWikKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmbG93X2NhY2hlOworc3RydWN0IGttZW1fY2FjaGUgKmZsb3dfc3RhdHNfY2FjaGUgX19yZWFkX21vc3RseTsKIAogc3RhdGljIHUxNiByYW5nZV9uX2J5dGVzKGNvbnN0IHN0cnVjdCBzd19mbG93X2tleV9yYW5nZSAqcmFuZ2UpCiB7CkBAIC01Nyw4ICs1OCwxMCBAQAogdm9pZCBvdnNfZmxvd19tYXNrX2tleShzdHJ1Y3Qgc3dfZmxvd19rZXkgKmRzdCwgY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICpzcmMsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrKQogewotCWNvbnN0IGxvbmcgKm0gPSAobG9uZyAqKSgodTggKikmbWFzay0+a2V5ICsgbWFzay0+cmFuZ2Uuc3RhcnQpOwotCWNvbnN0IGxvbmcgKnMgPSAobG9uZyAqKSgodTggKilzcmMgKyBtYXNrLT5yYW5nZS5zdGFydCk7CisJY29uc3QgbG9uZyAqbSA9IChjb25zdCBsb25nICopKChjb25zdCB1OCAqKSZtYXNrLT5rZXkgKworCQkJCW1hc2stPnJhbmdlLnN0YXJ0KTsKKwljb25zdCBsb25nICpzID0gKGNvbnN0IGxvbmcgKikoKGNvbnN0IHU4ICopc3JjICsKKwkJCQltYXNrLT5yYW5nZS5zdGFydCk7CiAJbG9uZyAqZCA9IChsb25nICopKCh1OCAqKWRzdCArIG1hc2stPnJhbmdlLnN0YXJ0KTsKIAlpbnQgaTsKIApAQCAtNzAsMTAgKzczLDExIEBACiAJCSpkKysgPSAqcysrICYgKm0rKzsKIH0KIAotc3RydWN0IHN3X2Zsb3cgKm92c19mbG93X2FsbG9jKGJvb2wgcGVyY3B1X3N0YXRzKQorc3RydWN0IHN3X2Zsb3cgKm92c19mbG93X2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IHN3X2Zsb3cgKmZsb3c7Ci0JaW50IGNwdTsKKwlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHM7CisJaW50IG5vZGU7CiAKIAlmbG93ID0ga21lbV9jYWNoZV9hbGxvYyhmbG93X2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZsb3cpCkBAIC04MSwyNyArODUsMjIgQEAKIAogCWZsb3ctPnNmX2FjdHMgPSBOVUxMOwogCWZsb3ctPm1hc2sgPSBOVUxMOworCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gTlVNQV9OT19OT0RFOwogCi0JZmxvdy0+c3RhdHMuaXNfcGVyY3B1ID0gcGVyY3B1X3N0YXRzOworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgc3RhdCBub2RlLiAqLworCXN0YXRzID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGZsb3dfc3RhdHNfY2FjaGUsCisJCQkJICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIDApOworCWlmICghc3RhdHMpCisJCWdvdG8gZXJyOwogCi0JaWYgKCFwZXJjcHVfc3RhdHMpIHsKLQkJZmxvdy0+c3RhdHMuc3RhdCA9IGt6YWxsb2Moc2l6ZW9mKCpmbG93LT5zdGF0cy5zdGF0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZmxvdy0+c3RhdHMuc3RhdCkKLQkJCWdvdG8gZXJyOworCXNwaW5fbG9ja19pbml0KCZzdGF0cy0+bG9jayk7CiAKLQkJc3Bpbl9sb2NrX2luaXQoJmZsb3ctPnN0YXRzLnN0YXQtPmxvY2spOwotCX0gZWxzZSB7Ci0JCWZsb3ctPnN0YXRzLmNwdV9zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZmxvd19zdGF0cyk7Ci0JCWlmICghZmxvdy0+c3RhdHMuY3B1X3N0YXRzKQotCQkJZ290byBlcnI7CisJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1swXSwgc3RhdHMpOwogCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBmbG93X3N0YXRzICpjcHVfc3RhdHM7CisJZm9yX2VhY2hfbm9kZShub2RlKQorCQlpZiAobm9kZSAhPSAwKQorCQkJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1tub2RlXSwgTlVMTCk7CiAKLQkJCWNwdV9zdGF0cyA9IHBlcl9jcHVfcHRyKGZsb3ctPnN0YXRzLmNwdV9zdGF0cywgY3B1KTsKLQkJCXNwaW5fbG9ja19pbml0KCZjcHVfc3RhdHMtPmxvY2spOwotCQl9Ci0JfQogCXJldHVybiBmbG93OwogZXJyOgogCWttZW1fY2FjaGVfZnJlZShmbG93X2NhY2hlLCBmbG93KTsKQEAgLTEzOCwxMSArMTM3LDEzIEBACiAKIHN0YXRpYyB2b2lkIGZsb3dfZnJlZShzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKIHsKLQlrZnJlZSgoc3RydWN0IHNmX2Zsb3dfYWN0cyBfX2ZvcmNlICopZmxvdy0+c2ZfYWN0cyk7Ci0JaWYgKGZsb3ctPnN0YXRzLmlzX3BlcmNwdSkKLQkJZnJlZV9wZXJjcHUoZmxvdy0+c3RhdHMuY3B1X3N0YXRzKTsKLQllbHNlCi0JCWtmcmVlKGZsb3ctPnN0YXRzLnN0YXQpOworCWludCBub2RlOworCisJa2ZyZWUoKHN0cnVjdCBzd19mbG93X2FjdGlvbnMgX19mb3JjZSAqKWZsb3ctPnNmX2FjdHMpOworCWZvcl9lYWNoX25vZGUobm9kZSkKKwkJaWYgKGZsb3ctPnN0YXRzW25vZGVdKQorCQkJa21lbV9jYWNoZV9mcmVlKGZsb3dfc3RhdHNfY2FjaGUsCisJCQkJCShzdHJ1Y3QgZmxvd19zdGF0cyBfX2ZvcmNlICopZmxvdy0+c3RhdHNbbm9kZV0pOwogCWttZW1fY2FjaGVfZnJlZShmbG93X2NhY2hlLCBmbG93KTsKIH0KIApAQCAtMTU4LDI1ICsxNTksNiBAQAogCWlmICghZmxvdykKIAkJcmV0dXJuOwogCi0JaWYgKGZsb3ctPm1hc2spIHsKLQkJc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzayA9IGZsb3ctPm1hc2s7Ci0KLQkJLyogb3ZzLWxvY2sgaXMgcmVxdWlyZWQgdG8gcHJvdGVjdCBtYXNrLXJlZmNvdW50IGFuZAotCQkgKiBtYXNrIGxpc3QuCi0JCSAqLwotCQlBU1NFUlRfT1ZTTCgpOwotCQlCVUdfT04oIW1hc2stPnJlZl9jb3VudCk7Ci0JCW1hc2stPnJlZl9jb3VudC0tOwotCi0JCWlmICghbWFzay0+cmVmX2NvdW50KSB7Ci0JCQlsaXN0X2RlbF9yY3UoJm1hc2stPmxpc3QpOwotCQkJaWYgKGRlZmVycmVkKQotCQkJCWtmcmVlX3JjdShtYXNrLCByY3UpOwotCQkJZWxzZQotCQkJCWtmcmVlKG1hc2spOwotCQl9Ci0JfQotCiAJaWYgKGRlZmVycmVkKQogCQljYWxsX3JjdSgmZmxvdy0+cmN1LCByY3VfZnJlZV9mbG93X2NhbGxiYWNrKTsKIAllbHNlCkBAIC0zNzUsNyArMzU3LDcgQEAKIHN0YXRpYyB1MzIgZmxvd19oYXNoKGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqa2V5LCBpbnQga2V5X3N0YXJ0LAogCQkgICAgIGludCBrZXlfZW5kKQogewotCXUzMiAqaGFzaF9rZXkgPSAodTMyICopKCh1OCAqKWtleSArIGtleV9zdGFydCk7CisJY29uc3QgdTMyICpoYXNoX2tleSA9IChjb25zdCB1MzIgKikoKGNvbnN0IHU4ICopa2V5ICsga2V5X3N0YXJ0KTsKIAlpbnQgaGFzaF91MzJzID0gKGtleV9lbmQgLSBrZXlfc3RhcnQpID4+IDI7CiAKIAkvKiBNYWtlIHN1cmUgbnVtYmVyIG9mIGhhc2ggYnl0ZXMgYXJlIG11bHRpcGxlIG9mIHUzMi4gKi8KQEAgLTM5Nyw4ICszNzksOCBAQAogCQkgICAgY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXkyLAogCQkgICAgaW50IGtleV9zdGFydCwgaW50IGtleV9lbmQpCiB7Ci0JY29uc3QgbG9uZyAqY3AxID0gKGxvbmcgKikoKHU4ICopa2V5MSArIGtleV9zdGFydCk7Ci0JY29uc3QgbG9uZyAqY3AyID0gKGxvbmcgKikoKHU4ICopa2V5MiArIGtleV9zdGFydCk7CisJY29uc3QgbG9uZyAqY3AxID0gKGNvbnN0IGxvbmcgKikoKGNvbnN0IHU4ICopa2V5MSArIGtleV9zdGFydCk7CisJY29uc3QgbG9uZyAqY3AyID0gKGNvbnN0IGxvbmcgKikoKGNvbnN0IHU4ICopa2V5MiArIGtleV9zdGFydCk7CiAJbG9uZyBkaWZmcyA9IDA7CiAJaW50IGk7CiAKQEAgLTQ5MCw2ICs0NzIsMjUgQEAKIAlyZXR1cm4gdGFibGVfaW5zdGFuY2VfcmVoYXNoKHRpLCB0aS0+bl9idWNrZXRzICogMik7CiB9CiAKKy8qIFJlbW92ZSAnbWFzaycgZnJvbSB0aGUgbWFzayBsaXN0LCBpZiBpdCBpcyBub3QgbmVlZGVkIGFueSBtb3JlLiAqLworc3RhdGljIHZvaWQgZmxvd19tYXNrX3JlbW92ZShzdHJ1Y3QgZmxvd190YWJsZSAqdGJsLCBzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrKQoreworCWlmIChtYXNrKSB7CisJCS8qIG92cy1sb2NrIGlzIHJlcXVpcmVkIHRvIHByb3RlY3QgbWFzay1yZWZjb3VudCBhbmQKKwkJICogbWFzayBsaXN0LgorCQkgKi8KKwkJQVNTRVJUX09WU0woKTsKKwkJQlVHX09OKCFtYXNrLT5yZWZfY291bnQpOworCQltYXNrLT5yZWZfY291bnQtLTsKKworCQlpZiAoIW1hc2stPnJlZl9jb3VudCkgeworCQkJbGlzdF9kZWxfcmN1KCZtYXNrLT5saXN0KTsKKwkJCWtmcmVlX3JjdShtYXNrLCByY3UpOworCQl9CisJfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIE9WUyBtdXRleCBoZWxkLiAqLwogdm9pZCBvdnNfZmxvd190YmxfcmVtb3ZlKHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwgc3RydWN0IHN3X2Zsb3cgKmZsb3cpCiB7CiAJc3RydWN0IHRhYmxlX2luc3RhbmNlICp0aSA9IG92c2xfZGVyZWZlcmVuY2UodGFibGUtPnRpKTsKQEAgLTQ5Nyw2ICs0OTgsMTEgQEAKIAlCVUdfT04odGFibGUtPmNvdW50ID09IDApOwogCWhsaXN0X2RlbF9yY3UoJmZsb3ctPmhhc2hfbm9kZVt0aS0+bm9kZV92ZXJdKTsKIAl0YWJsZS0+Y291bnQtLTsKKworCS8qIFJDVSBkZWxldGUgdGhlIG1hc2suICdmbG93LT5tYXNrJyBpcyBub3QgTlVMTGVkLCBhcyBpdCBzaG91bGQgYmUKKwkgKiBhY2Nlc3NpYmxlIGFzIGxvbmcgYXMgdGhlIFJDVSByZWFkIGxvY2sgaXMgaGVsZC4KKwkgKi8KKwlmbG93X21hc2tfcmVtb3ZlKHRhYmxlLCBmbG93LT5tYXNrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2tfYWxsb2Modm9pZCkKQEAgLTUxMyw4ICs1MTksOCBAQAogc3RhdGljIGJvb2wgbWFza19lcXVhbChjb25zdCBzdHJ1Y3Qgc3dfZmxvd19tYXNrICphLAogCQkgICAgICAgY29uc3Qgc3RydWN0IHN3X2Zsb3dfbWFzayAqYikKIHsKLQl1OCAqYV8gPSAodTggKikmYS0+a2V5ICsgYS0+cmFuZ2Uuc3RhcnQ7Ci0JdTggKmJfID0gKHU4ICopJmItPmtleSArIGItPnJhbmdlLnN0YXJ0OworCWNvbnN0IHU4ICphXyA9IChjb25zdCB1OCAqKSZhLT5rZXkgKyBhLT5yYW5nZS5zdGFydDsKKwljb25zdCB1OCAqYl8gPSAoY29uc3QgdTggKikmYi0+a2V5ICsgYi0+cmFuZ2Uuc3RhcnQ7CiAKIAlyZXR1cm4gIChhLT5yYW5nZS5lbmQgPT0gYi0+cmFuZ2UuZW5kKQogCQkmJiAoYS0+cmFuZ2Uuc3RhcnQgPT0gYi0+cmFuZ2Uuc3RhcnQpCkBAIC01NTksNiArNTY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBPVlMgbXV0ZXggaGVsZC4gKi8KIGludCBvdnNfZmxvd190YmxfaW5zZXJ0KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwgc3RydWN0IHN3X2Zsb3cgKmZsb3csCiAJCQlzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrKQogewpAQCAtNTk3LDE2ICs2MDQsMjggQEAKIAlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IHN3X2Zsb3dfa2V5KSAlIF9fYWxpZ25vZl9fKGxvbmcpKTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBzd19mbG93X2tleSkgJSBzaXplb2YobG9uZykpOwogCi0JZmxvd19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzd19mbG93Iiwgc2l6ZW9mKHN0cnVjdCBzd19mbG93KSwgMCwKLQkJCQkJMCwgTlVMTCk7CisJZmxvd19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzd19mbG93Iiwgc2l6ZW9mKHN0cnVjdCBzd19mbG93KQorCQkJCSAgICAgICArIChudW1fcG9zc2libGVfbm9kZXMoKQorCQkJCQkgICogc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRzICopKSwKKwkJCQkgICAgICAgMCwgMCwgTlVMTCk7CiAJaWYgKGZsb3dfY2FjaGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlmbG93X3N0YXRzX2NhY2hlCisJCT0ga21lbV9jYWNoZV9jcmVhdGUoInN3X2Zsb3dfc3RhdHMiLCBzaXplb2Yoc3RydWN0IGZsb3dfc3RhdHMpLAorCQkJCSAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmIChmbG93X3N0YXRzX2NhY2hlID09IE5VTEwpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGZsb3dfY2FjaGUpOworCQlmbG93X2NhY2hlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFVuaW5pdGlhbGl6ZXMgdGhlIGZsb3cgbW9kdWxlLiAqLwogdm9pZCBvdnNfZmxvd19leGl0KHZvaWQpCiB7CisJa21lbV9jYWNoZV9kZXN0cm95KGZsb3dfc3RhdHNfY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShmbG93X2NhY2hlKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmggYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5oCmluZGV4IGJhYWViMTAuLmNhOGE1ODIgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuaApAQCAtNTIsMTAgKzUyLDEyIEBACiAJdW5zaWduZWQgaW50IGNvdW50OwogfTsKIAorZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpmbG93X3N0YXRzX2NhY2hlOworCiBpbnQgb3ZzX2Zsb3dfaW5pdCh2b2lkKTsKIHZvaWQgb3ZzX2Zsb3dfZXhpdCh2b2lkKTsKIAotc3RydWN0IHN3X2Zsb3cgKm92c19mbG93X2FsbG9jKGJvb2wgcGVyY3B1X3N0YXRzKTsKK3N0cnVjdCBzd19mbG93ICpvdnNfZmxvd19hbGxvYyh2b2lkKTsKIHZvaWQgb3ZzX2Zsb3dfZnJlZShzdHJ1Y3Qgc3dfZmxvdyAqLCBib29sIGRlZmVycmVkKTsKIAogaW50IG92c19mbG93X3RibF9pbml0KHN0cnVjdCBmbG93X3RhYmxlICopOwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdyZS5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdyZS5jCmluZGV4IGViYjZlMjQ0Li4zNWVjNGZlIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ3JlLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdyZS5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlkZiA9IE9WU19DQihza2IpLT50dW5fa2V5LT50dW5fZmxhZ3MgJiBUVU5ORUxfRE9OVF9GUkFHTUVOVCA/CiAJCWh0b25zKElQX0RGKSA6IDA7CiAKLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAKIAlyZXR1cm4gaXB0dW5uZWxfeG1pdChza2ItPnNrLCBydCwgc2tiLCBmbC5zYWRkciwKIAkJCSAgICAgT1ZTX0NCKHNrYiktPnR1bl9rZXktPmlwdjRfZHN0LCBJUFBST1RPX0dSRSwKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiAJb3ZzX25ldCA9IG5ldF9nZW5lcmljKG5ldCwgb3ZzX25ldF9pZCk7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIob3ZzX25ldC0+dnBvcnRfbmV0LmdyZV92cG9ydCwgTlVMTCk7CisJUkNVX0lOSVRfUE9JTlRFUihvdnNfbmV0LT52cG9ydF9uZXQuZ3JlX3Zwb3J0LCBOVUxMKTsKIAlvdnNfdnBvcnRfZGVmZXJyZWRfZnJlZSh2cG9ydCk7CiAJZ3JlX2V4aXQoKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1pbnRlcm5hbF9kZXYuYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1pbnRlcm5hbF9kZXYuYwppbmRleCA3MjljNjg3Li43ODlhZjkyIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAluZXRkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9UWF9TS0JfU0hBUklORzsKIAluZXRkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX0xJVkVfQUREUl9DSEFOR0U7CiAJbmV0ZGV2LT5kZXN0cnVjdG9yID0gaW50ZXJuYWxfZGV2X2Rlc3RydWN0b3I7Ci0JU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmludGVybmFsX2Rldl9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZpbnRlcm5hbF9kZXZfZXRodG9vbF9vcHM7CiAJbmV0ZGV2LT50eF9xdWV1ZV9sZW4gPSAwOwogCiAJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfTExUWCB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC12eGxhbi5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LXZ4bGFuLmMKaW5kZXggZTc5N2E1MC4uMGVkYmQ5NSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LXZ4bGFuLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LXZ4bGFuLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXZ4bGFuX3BvcnQgPSB2eGxhbl92cG9ydCh2cG9ydCk7CiAJc3RybmNweSh2eGxhbl9wb3J0LT5uYW1lLCBwYXJtcy0+bmFtZSwgSUZOQU1TSVopOwogCi0JdnMgPSB2eGxhbl9zb2NrX2FkZChuZXQsIGh0b25zKGRzdF9wb3J0KSwgdnhsYW5fcmN2LCB2cG9ydCwgdHJ1ZSwgZmFsc2UpOworCXZzID0gdnhsYW5fc29ja19hZGQobmV0LCBodG9ucyhkc3RfcG9ydCksIHZ4bGFuX3JjdiwgdnBvcnQsIHRydWUsIDApOwogCWlmIChJU19FUlIodnMpKSB7CiAJCW92c192cG9ydF9mcmVlKHZwb3J0KTsKIAkJcmV0dXJuICh2b2lkICopdnM7CkBAIC0xNzAsNyArMTcwLDcgQEAKIAlkZiA9IE9WU19DQihza2IpLT50dW5fa2V5LT50dW5fZmxhZ3MgJiBUVU5ORUxfRE9OVF9GUkFHTUVOVCA/CiAJCWh0b25zKElQX0RGKSA6IDA7CiAKLQlza2ItPmxvY2FsX2RmID0gMTsKKwlza2ItPmlnbm9yZV9kZiA9IDE7CiAKIAlpbmV0X2dldF9sb2NhbF9wb3J0X3JhbmdlKG5ldCwgJnBvcnRfbWluLCAmcG9ydF9tYXgpOwogCXNyY19wb3J0ID0gdnhsYW5fc3JjX3BvcnQocG9ydF9taW4sIHBvcnRfbWF4LCBza2IpOwpAQCAtMTgwLDcgKzE4MCw4IEBACiAJCQkgICAgIE9WU19DQihza2IpLT50dW5fa2V5LT5pcHY0X3RvcywKIAkJCSAgICAgT1ZTX0NCKHNrYiktPnR1bl9rZXktPmlwdjRfdHRsLCBkZiwKIAkJCSAgICAgc3JjX3BvcnQsIGRzdF9wb3J0LAotCQkJICAgICBodG9ubChiZTY0X3RvX2NwdShPVlNfQ0Ioc2tiKS0+dHVuX2tleS0+dHVuX2lkKSA8PCA4KSk7CisJCQkgICAgIGh0b25sKGJlNjRfdG9fY3B1KE9WU19DQihza2IpLT50dW5fa2V5LT50dW5faWQpIDw8IDgpLAorCQkJICAgICBmYWxzZSk7CiAJaWYgKGVyciA8IDApCiAJCWlwX3J0X3B1dChydCk7CiBlcnJvcjoKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5oIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmgKaW5kZXggZDdlNTBhMS4uOGQ3MjFlNiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmgKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmgKQEAgLTE3Miw3ICsxNzIsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKnZwb3J0X3ByaXYoY29uc3Qgc3RydWN0IHZwb3J0ICp2cG9ydCkKIHsKLQlyZXR1cm4gKHU4ICopdnBvcnQgKyBBTElHTihzaXplb2Yoc3RydWN0IHZwb3J0KSwgVlBPUlRfQUxJR04pOworCXJldHVybiAodTggKikodWludHB0cl90KXZwb3J0ICsgQUxJR04oc2l6ZW9mKHN0cnVjdCB2cG9ydCksIFZQT1JUX0FMSUdOKTsKIH0KIAogLyoqCkBAIC0xODUsOSArMTg1LDkgQEAKICAqIHRoZSByZXN1bHQgb2YgYSBoYXNoIHRhYmxlIGxvb2t1cC4gIEBwcml2IG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQogICogcHJpdmF0ZSBkYXRhIGFyZWEuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZwb3J0ICp2cG9ydF9mcm9tX3ByaXYoY29uc3Qgdm9pZCAqcHJpdikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZwb3J0ICp2cG9ydF9mcm9tX3ByaXYodm9pZCAqcHJpdikKIHsKLQlyZXR1cm4gKHN0cnVjdCB2cG9ydCAqKShwcml2IC0gQUxJR04oc2l6ZW9mKHN0cnVjdCB2cG9ydCksIFZQT1JUX0FMSUdOKSk7CisJcmV0dXJuIChzdHJ1Y3QgdnBvcnQgKikoKHU4ICopcHJpdiAtIEFMSUdOKHNpemVvZihzdHJ1Y3QgdnBvcnQpLCBWUE9SVF9BTElHTikpOwogfQogCiB2b2lkIG92c192cG9ydF9yZWNlaXZlKHN0cnVjdCB2cG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLApkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pYl9zZW5kLmMgYi9uZXQvcmRzL2liX3NlbmQuYwppbmRleCAzN2JlNmUyLi4xZGRlOTFlIDEwMDY0NAotLS0gYS9uZXQvcmRzL2liX3NlbmQuYworKysgYi9uZXQvcmRzL2liX3NlbmQuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCXJkc19pYl9zdGF0c19pbmMoc19pYl90eF9jcV9ldmVudCk7CiAKIAkJaWYgKHdjLndyX2lkID09IFJEU19JQl9BQ0tfV1JfSUQpIHsKLQkJCWlmIChpYy0+aV9hY2tfcXVldWVkICsgSFovMiA8IGppZmZpZXMpCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBpYy0+aV9hY2tfcXVldWVkICsgSFovMikpCiAJCQkJcmRzX2liX3N0YXRzX2luYyhzX2liX3R4X3N0YWxsZWQpOwogCQkJcmRzX2liX2Fja19zZW5kX2NvbXBsZXRlKGljKTsKIAkJCWNvbnRpbnVlOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAKIAkJCXJtID0gcmRzX2liX3NlbmRfdW5tYXBfb3AoaWMsIHNlbmQsIHdjLnN0YXR1cyk7CiAKLQkJCWlmIChzZW5kLT5zX3F1ZXVlZCArIEhaLzIgPCBqaWZmaWVzKQorCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc2VuZC0+c19xdWV1ZWQgKyBIWi8yKSkKIAkJCQlyZHNfaWJfc3RhdHNfaW5jKHNfaWJfdHhfc3RhbGxlZCk7CiAKIAkJCWlmIChzZW5kLT5zX29wKSB7CmRpZmYgLS1naXQgYS9uZXQvcmRzL2l3X3NlbmQuYyBiL25ldC9yZHMvaXdfc2VuZC5jCmluZGV4IGU0MGMzYzUuLjkxMDVlYTAgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvaXdfc2VuZC5jCisrKyBiL25ldC9yZHMvaXdfc2VuZC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJfQogCiAJCWlmICh3Yy53cl9pZCA9PSBSRFNfSVdfQUNLX1dSX0lEKSB7Ci0JCQlpZiAoaWMtPmlfYWNrX3F1ZXVlZCArIEhaLzIgPCBqaWZmaWVzKQorCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgaWMtPmlfYWNrX3F1ZXVlZCArIEhaLzIpKQogCQkJCXJkc19pd19zdGF0c19pbmMoc19pd190eF9zdGFsbGVkKTsKIAkJCXJkc19pd19hY2tfc2VuZF9jb21wbGV0ZShpYyk7CiAJCQljb250aW51ZTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAJCQlzZW5kLT5zX3dyLm9wY29kZSA9IDB4ZGVhZDsKIAkJCXNlbmQtPnNfd3IubnVtX3NnZSA9IDE7Ci0JCQlpZiAoc2VuZC0+c19xdWV1ZWQgKyBIWi8yIDwgamlmZmllcykKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHNlbmQtPnNfcXVldWVkICsgSFovMikpCiAJCQkJcmRzX2l3X3N0YXRzX2luYyhzX2l3X3R4X3N0YWxsZWQpOwogCiAJCQkvKiBJZiBhIFJETUEgb3BlcmF0aW9uIHByb2R1Y2VkIGFuIGVycm9yLCBzaWduYWwgdGhpcyByaWdodApkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pd19zeXNjdGwuYyBiL25ldC9yZHMvaXdfc3lzY3RsLmMKaW5kZXggODljOTE1MS4uMTM5MjM5ZCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pd19zeXNjdGwuYworKysgYi9uZXQvcmRzL2l3X3N5c2N0bC5jCkBAIC0xMTEsOCArMTExLDcgQEAKIAogdm9pZCByZHNfaXdfc3lzY3RsX2V4aXQodm9pZCkKIHsKLQlpZiAocmRzX2l3X3N5c2N0bF9oZHIpCi0JCXVucmVnaXN0ZXJfbmV0X3N5c2N0bF90YWJsZShyZHNfaXdfc3lzY3RsX2hkcik7CisJdW5yZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKHJkc19pd19zeXNjdGxfaGRyKTsKIH0KIAogaW50IHJkc19pd19zeXNjdGxfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9yZG1hX3RyYW5zcG9ydC5jIGIvbmV0L3Jkcy9yZG1hX3RyYW5zcG9ydC5jCmluZGV4IGMyYmU5MDEuLjZjZDlkMWQgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvcmRtYV90cmFuc3BvcnQuYworKysgYi9uZXQvcmRzL3JkbWFfdHJhbnNwb3J0LmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAJc2luLnNpbl9hZGRyLnNfYWRkciA9IChfX2ZvcmNlIHUzMilodG9ubChJTkFERFJfQU5ZKTsKIAlzaW4uc2luX3BvcnQgPSAoX19mb3JjZSB1MTYpaHRvbnMoUkRTX1BPUlQpOwogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3N5c2N0bC5jIGIvbmV0L3Jkcy9zeXNjdGwuYwppbmRleCBiNWNiMmFhLi5jM2IwY2Q0MyAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9zeXNjdGwuYworKysgYi9uZXQvcmRzL3N5c2N0bC5jCkBAIC05NCw4ICs5NCw3IEBACiAKIHZvaWQgcmRzX3N5c2N0bF9leGl0KHZvaWQpCiB7Ci0JaWYgKHJkc19zeXNjdGxfcmVnX3RhYmxlKQotCQl1bnJlZ2lzdGVyX25ldF9zeXNjdGxfdGFibGUocmRzX3N5c2N0bF9yZWdfdGFibGUpOworCXVucmVnaXN0ZXJfbmV0X3N5c2N0bF90YWJsZShyZHNfc3lzY3RsX3JlZ190YWJsZSk7CiB9CiAKIGludCByZHNfc3lzY3RsX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9yZHMvdGNwX2xpc3Rlbi5jIGIvbmV0L3Jkcy90Y3BfbGlzdGVuLmMKaW5kZXggNGU2MzhmOC4uMjNhYjRkY2QgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvdGNwX2xpc3Rlbi5jCisrKyBiL25ldC9yZHMvdGNwX2xpc3Rlbi5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlzb2NrLT5zay0+c2tfZGF0YV9yZWFkeSA9IHJkc190Y3BfbGlzdGVuX2RhdGFfcmVhZHk7CiAJd3JpdGVfdW5sb2NrX2JoKCZzb2NrLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKLQlzaW4uc2luX2ZhbWlseSA9IFBGX0lORVQsCisJc2luLnNpbl9mYW1pbHkgPSBQRl9JTkVUOwogCXNpbi5zaW5fYWRkci5zX2FkZHIgPSAoX19mb3JjZSB1MzIpaHRvbmwoSU5BRERSX0FOWSk7CiAJc2luLnNpbl9wb3J0ID0gKF9fZm9yY2UgdTE2KWh0b25zKFJEU19UQ1BfUE9SVCk7CiAKZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYyBiL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYwppbmRleCBiZDJhNWI5Li4xNGM5OGU0IDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1ncGlvLmMKKysrIGIvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jCkBAIC0zNiw4ICszNiw2IEBACiAJc3RydWN0IGdwaW9fZGVzYwkqc2h1dGRvd25fZ3BpbzsKIAogCXN0cnVjdCByZmtpbGwJCSpyZmtpbGxfZGV2OwotCWNoYXIJCQkqcmVzZXRfbmFtZTsKLQljaGFyCQkJKnNodXRkb3duX25hbWU7CiAJc3RydWN0IGNsawkJKmNsazsKIAogCWJvb2wJCQljbGtfZW5hYmxlZDsKQEAgLTQ3LDE3ICs0NSwxNCBAQAogewogCXN0cnVjdCByZmtpbGxfZ3Bpb19kYXRhICpyZmtpbGwgPSBkYXRhOwogCi0JaWYgKGJsb2NrZWQpIHsKLQkJZ3Bpb2Rfc2V0X3ZhbHVlKHJma2lsbC0+c2h1dGRvd25fZ3BpbywgMCk7Ci0JCWdwaW9kX3NldF92YWx1ZShyZmtpbGwtPnJlc2V0X2dwaW8sIDApOwotCQlpZiAoIUlTX0VSUihyZmtpbGwtPmNsaykgJiYgcmZraWxsLT5jbGtfZW5hYmxlZCkKLQkJCWNsa19kaXNhYmxlKHJma2lsbC0+Y2xrKTsKLQl9IGVsc2UgewotCQlpZiAoIUlTX0VSUihyZmtpbGwtPmNsaykgJiYgIXJma2lsbC0+Y2xrX2VuYWJsZWQpCi0JCQljbGtfZW5hYmxlKHJma2lsbC0+Y2xrKTsKLQkJZ3Bpb2Rfc2V0X3ZhbHVlKHJma2lsbC0+cmVzZXRfZ3BpbywgMSk7Ci0JCWdwaW9kX3NldF92YWx1ZShyZmtpbGwtPnNodXRkb3duX2dwaW8sIDEpOwotCX0KKwlpZiAoIWJsb2NrZWQgJiYgIUlTX0VSUihyZmtpbGwtPmNsaykgJiYgIXJma2lsbC0+Y2xrX2VuYWJsZWQpCisJCWNsa19lbmFibGUocmZraWxsLT5jbGspOworCisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHJma2lsbC0+c2h1dGRvd25fZ3BpbywgIWJsb2NrZWQpOworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChyZmtpbGwtPnJlc2V0X2dwaW8sICFibG9ja2VkKTsKKworCWlmIChibG9ja2VkICYmICFJU19FUlIocmZraWxsLT5jbGspICYmIHJma2lsbC0+Y2xrX2VuYWJsZWQpCisJCWNsa19kaXNhYmxlKHJma2lsbC0+Y2xrKTsKIAogCXJma2lsbC0+Y2xrX2VuYWJsZWQgPSBibG9ja2VkOwogCkBAIC04NywxMCArODIsOCBAQAogewogCXN0cnVjdCByZmtpbGxfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCByZmtpbGxfZ3Bpb19kYXRhICpyZmtpbGw7Ci0JY29uc3QgY2hhciAqY2xrX25hbWUgPSBOVUxMOwogCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW87CiAJaW50IHJldDsKLQlpbnQgbGVuOwogCiAJcmZraWxsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcmZraWxsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZmtpbGwpCkBAIC0xMDEsMjggKzk0LDE1IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAocGRhdGEpIHsKLQkJY2xrX25hbWUgPSBwZGF0YS0+cG93ZXJfY2xrX25hbWU7CiAJCXJma2lsbC0+bmFtZSA9IHBkYXRhLT5uYW1lOwogCQlyZmtpbGwtPnR5cGUgPSBwZGF0YS0+dHlwZTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlsZW4gPSBzdHJsZW4ocmZraWxsLT5uYW1lKTsKLQlyZmtpbGwtPnJlc2V0X25hbWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgbGVuICsgNywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZmtpbGwtPnJlc2V0X25hbWUpCi0JCXJldHVybiAtRU5PTUVNOworCXJma2lsbC0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCi0JcmZraWxsLT5zaHV0ZG93bl9uYW1lID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGxlbiArIDEwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJma2lsbC0+c2h1dGRvd25fbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzbnByaW50ZihyZmtpbGwtPnJlc2V0X25hbWUsIGxlbiArIDYgLCAiJXNfcmVzZXQiLCByZmtpbGwtPm5hbWUpOwotCXNucHJpbnRmKHJma2lsbC0+c2h1dGRvd25fbmFtZSwgbGVuICsgOSwgIiVzX3NodXRkb3duIiwgcmZraWxsLT5uYW1lKTsKLQotCXJma2lsbC0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIGNsa19uYW1lKTsKLQotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleCgmcGRldi0+ZGV2LCByZmtpbGwtPnJlc2V0X25hbWUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleCgmcGRldi0+ZGV2LCAicmVzZXQiLCAwKTsKIAlpZiAoIUlTX0VSUihncGlvKSkgewogCQlyZXQgPSBncGlvZF9kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDApOwogCQlpZiAocmV0KQpAQCAtMTMwLDcgKzExMCw3IEBACiAJCXJma2lsbC0+cmVzZXRfZ3BpbyA9IGdwaW87CiAJfQogCi0JZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KCZwZGV2LT5kZXYsIHJma2lsbC0+c2h1dGRvd25fbmFtZSwgMSk7CisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KCZwZGV2LT5kZXYsICJzaHV0ZG93biIsIDEpOwogCWlmICghSVNfRVJSKGdwaW8pKSB7CiAJCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMCk7CiAJCWlmIChyZXQpCkBAIC0xNDYsMTQgKzEyNiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19ydW50aW1lX3NldHVwKSB7Ci0JCXJldCA9IHBkYXRhLT5ncGlvX3J1bnRpbWVfc2V0dXAocGRldik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHNldCB1cCBncGlvXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KIAlyZmtpbGwtPnJma2lsbF9kZXYgPSByZmtpbGxfYWxsb2MocmZraWxsLT5uYW1lLCAmcGRldi0+ZGV2LAogCQkJCQkgIHJma2lsbC0+dHlwZSwgJnJma2lsbF9ncGlvX29wcywKIAkJCQkJICByZmtpbGwpOwpAQCAtMTc0LDIwICsxNDYsMjMgQEAKIHN0YXRpYyBpbnQgcmZraWxsX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJma2lsbF9ncGlvX2RhdGEgKnJma2lsbCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCByZmtpbGxfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5ncGlvX3J1bnRpbWVfY2xvc2UpCi0JCXBkYXRhLT5ncGlvX3J1bnRpbWVfY2xvc2UocGRldik7CiAJcmZraWxsX3VucmVnaXN0ZXIocmZraWxsLT5yZmtpbGxfZGV2KTsKIAlyZmtpbGxfZGVzdHJveShyZmtpbGwtPnJma2lsbF9kZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQUNQSQogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCByZmtpbGxfYWNwaV9tYXRjaFtdID0geworCXsgIkJDTTJFMUEiLCBSRktJTExfVFlQRV9CTFVFVE9PVEggfSwKKwl7ICJCQ00yRTM5IiwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIIH0sCisJeyAiQkNNMkUzRCIsIFJGS0lMTF9UWVBFX0JMVUVUT09USCB9LAogCXsgIkJDTTQ3NTIiLCBSRktJTExfVFlQRV9HUFMgfSwKKwl7ICJMTlY0NzUyIiwgUkZLSUxMX1RZUEVfR1BTIH0sCiAJeyB9LAogfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByZmtpbGxfZ3Bpb19kcml2ZXIgPSB7CiAJLnByb2JlID0gcmZraWxsX2dwaW9fcHJvYmUsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2FwaS5jIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwppbmRleCBiZGJkYjFhLi40NTUyN2U2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2FwaS5jCisrKyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKQEAgLTEzNCw3ICsxMzQsOCBAQAogCWludCBlcnI7CiAJaW50IHRwX2NyZWF0ZWQgPSAwOwogCi0JaWYgKChuLT5ubG1zZ190eXBlICE9IFJUTV9HRVRURklMVEVSKSAmJiAhbmV0bGlua19jYXBhYmxlKHNrYiwgQ0FQX05FVF9BRE1JTikpCisJaWYgKChuLT5ubG1zZ190eXBlICE9IFJUTV9HRVRURklMVEVSKSAmJgorCSAgICAhbmV0bGlua19uc19jYXBhYmxlKHNrYiwgbmV0LT51c2VyX25zLCBDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogcmVwbGF5OgpAQCAtMzE3LDcgKzMxOCw4IEBACiAJCX0KIAl9CiAKLQllcnIgPSB0cC0+b3BzLT5jaGFuZ2UobmV0LCBza2IsIHRwLCBjbCwgdC0+dGNtX2hhbmRsZSwgdGNhLCAmZmgpOworCWVyciA9IHRwLT5vcHMtPmNoYW5nZShuZXQsIHNrYiwgdHAsIGNsLCB0LT50Y21faGFuZGxlLCB0Y2EsICZmaCwKKwkJCSAgICAgIG4tPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFID8gVENBX0FDVF9OT1JFUExBQ0UgOiBUQ0FfQUNUX1JFUExBQ0UpOwogCWlmIChlcnIgPT0gMCkgewogCQlpZiAodHBfY3JlYXRlZCkgewogCQkJc3Bpbl9sb2NrX2JoKHJvb3RfbG9jayk7CkBAIC01MDQsNyArNTA2LDcgQEAKIEVYUE9SVF9TWU1CT0wodGNmX2V4dHNfZGVzdHJveSk7CiAKIGludCB0Y2ZfZXh0c192YWxpZGF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCi0JCSAgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cykKKwkJICBzdHJ1Y3QgbmxhdHRyICpyYXRlX3Rsdiwgc3RydWN0IHRjZl9leHRzICpleHRzLCBib29sIG92cikKIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAl7CkBAIC01MTMsNyArNTE1LDcgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJmV4dHMtPmFjdGlvbnMpOwogCQlpZiAoZXh0cy0+cG9saWNlICYmIHRiW2V4dHMtPnBvbGljZV0pIHsKIAkJCWFjdCA9IHRjZl9hY3Rpb25faW5pdF8xKG5ldCwgdGJbZXh0cy0+cG9saWNlXSwgcmF0ZV90bHYsCi0JCQkJCQkicG9saWNlIiwgVENBX0FDVF9OT1JFUExBQ0UsCisJCQkJCQkicG9saWNlIiwgb3ZyLAogCQkJCQkJVENBX0FDVF9CSU5EKTsKIAkJCWlmIChJU19FUlIoYWN0KSkKIAkJCQlyZXR1cm4gUFRSX0VSUihhY3QpOwpAQCAtNTIzLDcgKzUyNSw3IEBACiAJCX0gZWxzZSBpZiAoZXh0cy0+YWN0aW9uICYmIHRiW2V4dHMtPmFjdGlvbl0pIHsKIAkJCWludCBlcnI7CiAJCQllcnIgPSB0Y2ZfYWN0aW9uX2luaXQobmV0LCB0YltleHRzLT5hY3Rpb25dLCByYXRlX3RsdiwKLQkJCQkJICAgICAgTlVMTCwgVENBX0FDVF9OT1JFUExBQ0UsCisJCQkJCSAgICAgIE5VTEwsIG92ciwKIAkJCQkJICAgICAgVENBX0FDVF9CSU5ELCAmZXh0cy0+YWN0aW9ucyk7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CkBAIC01NDMsMTQgKzU0NSwxMiBAQAogCQkgICAgIHN0cnVjdCB0Y2ZfZXh0cyAqc3JjKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCWlmICghbGlzdF9lbXB0eSgmc3JjLT5hY3Rpb25zKSkgewotCQlMSVNUX0hFQUQodG1wKTsKLQkJdGNmX3RyZWVfbG9jayh0cCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmRzdC0+YWN0aW9ucywgJnRtcCk7Ci0JCWxpc3Rfc3BsaWNlKCZzcmMtPmFjdGlvbnMsICZkc3QtPmFjdGlvbnMpOwotCQl0Y2ZfdHJlZV91bmxvY2sodHApOwotCQl0Y2ZfYWN0aW9uX2Rlc3Ryb3koJnRtcCwgVENBX0FDVF9VTkJJTkQpOwotCX0KKwlMSVNUX0hFQUQodG1wKTsKKwl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwlsaXN0X3NwbGljZV9pbml0KCZkc3QtPmFjdGlvbnMsICZ0bXApOworCWxpc3Rfc3BsaWNlKCZzcmMtPmFjdGlvbnMsICZkc3QtPmFjdGlvbnMpOworCXRjZl90cmVlX3VubG9jayh0cCk7CisJdGNmX2FjdGlvbl9kZXN0cm95KCZ0bXAsIFRDQV9BQ1RfVU5CSU5EKTsKICNlbmRpZgogfQogRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c19jaGFuZ2UpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jIGIvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCmluZGV4IGU5OGNhOTkuLjBhZTE4MTMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYmFzaWMuYworKysgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKQEAgLTEzMCwxNCArMTMwLDE0IEBACiBzdGF0aWMgaW50IGJhc2ljX3NldF9wYXJtcyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAogCQkJICAgc3RydWN0IGJhc2ljX2ZpbHRlciAqZiwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkJICAgc3RydWN0IG5sYXR0ciAqKnRiLAotCQkJICAgc3RydWN0IG5sYXR0ciAqZXN0KQorCQkJICAgc3RydWN0IG5sYXR0ciAqZXN0LCBib29sIG92cikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCXN0cnVjdCB0Y2ZfZW1hdGNoX3RyZWUgdDsKIAogCXRjZl9leHRzX2luaXQoJmUsIFRDQV9CQVNJQ19BQ1QsIFRDQV9CQVNJQ19QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlKTsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTYxLDcgKzE2MSw3IEBACiAKIHN0YXRpYyBpbnQgYmFzaWNfY2hhbmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKIAkJCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBoYW5kbGUsCi0JCQlzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcpCisJCQlzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQogewogCWludCBlcnI7CiAJc3RydWN0IGJhc2ljX2hlYWQgKmhlYWQgPSB0cC0+cm9vdDsKQEAgLTE3OSw3ICsxNzksNyBAQAogCWlmIChmICE9IE5VTEwpIHsKIAkJaWYgKGhhbmRsZSAmJiBmLT5oYW5kbGUgIT0gaGFuZGxlKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiBiYXNpY19zZXRfcGFybXMobmV0LCB0cCwgZiwgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0pOworCQlyZXR1cm4gYmFzaWNfc2V0X3Bhcm1zKG5ldCwgdHAsIGYsIGJhc2UsIHRiLCB0Y2FbVENBX1JBVEVdLCBvdnIpOwogCX0KIAogCWVyciA9IC1FTk9CVUZTOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJCWYtPmhhbmRsZSA9IGhlYWQtPmhnZW5lcmF0b3I7CiAJfQogCi0JZXJyID0gYmFzaWNfc2V0X3Bhcm1zKG5ldCwgdHAsIGYsIGJhc2UsIHRiLCB0Y2FbVENBX1JBVEVdKTsKKwllcnIgPSBiYXNpY19zZXRfcGFybXMobmV0LCB0cCwgZiwgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sIG92cik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2JwZi5jIGIvbmV0L3NjaGVkL2Nsc19icGYuYwppbmRleCA4ZTNjZjQ5Li4xM2Y2NGRmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2JwZi5jCisrKyBiL25ldC9zY2hlZC9jbHNfYnBmLmMKQEAgLTE1NiwxMSArMTU2LDExIEBACiBzdGF0aWMgaW50IGNsc19icGZfbW9kaWZ5X2V4aXN0aW5nKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCQkJICAgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywKIAkJCQkgICB1bnNpZ25lZCBsb25nIGJhc2UsIHN0cnVjdCBubGF0dHIgKip0YiwKLQkJCQkgICBzdHJ1Y3QgbmxhdHRyICplc3QpCisJCQkJICAgc3RydWN0IG5sYXR0ciAqZXN0LCBib29sIG92cikKIHsKIAlzdHJ1Y3Qgc29ja19maWx0ZXIgKmJwZl9vcHMsICpicGZfb2xkOwogCXN0cnVjdCB0Y2ZfZXh0cyBleHRzOwotCXN0cnVjdCBzb2NrX2Zwcm9nIHRtcDsKKwlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuIHRtcDsKIAlzdHJ1Y3Qgc2tfZmlsdGVyICpmcCwgKmZwX29sZDsKIAl1MTYgYnBmX3NpemUsIGJwZl9sZW47CiAJdTMyIGNsYXNzaWQ7CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0Y2ZfZXh0c19pbml0KCZleHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOwotCXJldCA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZleHRzKTsKKwlyZXQgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZXh0cywgb3ZyKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTkxLDcgKzE5MSw3IEBACiAJbWVtY3B5KGJwZl9vcHMsIG5sYV9kYXRhKHRiW1RDQV9CUEZfT1BTXSksIGJwZl9zaXplKTsKIAogCXRtcC5sZW4gPSBicGZfbGVuOwotCXRtcC5maWx0ZXIgPSAoc3RydWN0IHNvY2tfZmlsdGVyIF9fdXNlciAqKSBicGZfb3BzOworCXRtcC5maWx0ZXIgPSBicGZfb3BzOwogCiAJcmV0ID0gc2tfdW5hdHRhY2hlZF9maWx0ZXJfY3JlYXRlKCZmcCwgJnRtcCk7CiAJaWYgKHJldCkKQEAgLTI0Miw3ICsyNDIsNyBAQAogc3RhdGljIGludCBjbHNfYnBmX2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICppbl9za2IsCiAJCQkgIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsCiAJCQkgIHUzMiBoYW5kbGUsIHN0cnVjdCBubGF0dHIgKip0Y2EsCi0JCQkgIHVuc2lnbmVkIGxvbmcgKmFyZykKKwkJCSAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3QgY2xzX2JwZl9oZWFkICpoZWFkID0gdHAtPnJvb3Q7CiAJc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZyA9IChzdHJ1Y3QgY2xzX2JwZl9wcm9nICopICphcmc7CkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJaWYgKGhhbmRsZSAmJiBwcm9nLT5oYW5kbGUgIT0gaGFuZGxlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBjbHNfYnBmX21vZGlmeV9leGlzdGluZyhuZXQsIHRwLCBwcm9nLCBiYXNlLCB0YiwKLQkJCQkJICAgICAgIHRjYVtUQ0FfUkFURV0pOworCQkJCQkgICAgICAgdGNhW1RDQV9SQVRFXSwgb3ZyKTsKIAl9CiAKIAlwcm9nID0ga3phbGxvYyhzaXplb2YoKnByb2cpLCBHRlBfS0VSTkVMKTsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCQlnb3RvIGVycm91dDsKIAl9CiAKLQlyZXQgPSBjbHNfYnBmX21vZGlmeV9leGlzdGluZyhuZXQsIHRwLCBwcm9nLCBiYXNlLCB0YiwgdGNhW1RDQV9SQVRFXSk7CisJcmV0ID0gY2xzX2JwZl9tb2RpZnlfZXhpc3RpbmcobmV0LCB0cCwgcHJvZywgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sIG92cik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Nncm91cC5jIGIvbmV0L3NjaGVkL2Nsc19jZ3JvdXAuYwppbmRleCA4ZTIxNThhLi5jYWNmMDFiIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0YXRpYyBpbnQgY2xzX2Nncm91cF9jaGFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAogCQkJICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkJICAgICB1MzIgaGFuZGxlLCBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkJICAgICB1bnNpZ25lZCBsb25nICphcmcpCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCiB7CiAJc3RydWN0IG5sYXR0ciAqdGJbVENBX0NHUk9VUF9NQVggKyAxXTsKIAlzdHJ1Y3QgY2xzX2Nncm91cF9oZWFkICpoZWFkID0gdHAtPnJvb3Q7CkBAIC0xMTksNyArMTE5LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCXRjZl9leHRzX2luaXQoJmUsIFRDQV9DR1JPVVBfQUNULCBUQ0FfQ0dST1VQX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlKTsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZmxvdy5jIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKaW5kZXggMjU3MDI5Yy4uMzViZTE2ZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKQEAgLTM0OSw3ICszNDksNyBAQAogc3RhdGljIGludCBmbG93X2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICppbl9za2IsCiAJCSAgICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkgICAgICAgdTMyIGhhbmRsZSwgc3RydWN0IG5sYXR0ciAqKnRjYSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZykKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCiB7CiAJc3RydWN0IGZsb3dfaGVhZCAqaGVhZCA9IHRwLT5yb290OwogCXN0cnVjdCBmbG93X2ZpbHRlciAqZjsKQEAgLTM5Myw3ICszOTMsNyBAQAogCX0KIAogCXRjZl9leHRzX2luaXQoJmUsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUpOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mdy5jIGIvbmV0L3NjaGVkL2Nsc19mdy5jCmluZGV4IDYzYTNjZTcuLjg2MWIwM2MgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZncuYworKysgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiBzdGF0aWMgaW50CiBmd19jaGFuZ2VfYXR0cnMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IGZ3X2ZpbHRlciAqZiwKLQlzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgYmFzZSkKKwlzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgYmFzZSwgYm9vbCBvdnIpCiB7CiAJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSB0cC0+cm9vdDsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCWludCBlcnI7CiAKIAl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfRldfQUNULCBUQ0FfRldfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUpOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJCSAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKIAkJICAgICB1MzIgaGFuZGxlLAogCQkgICAgIHN0cnVjdCBubGF0dHIgKip0Y2EsCi0JCSAgICAgdW5zaWduZWQgbG9uZyAqYXJnKQorCQkgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCiB7CiAJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSB0cC0+cm9vdDsKIAlzdHJ1Y3QgZndfZmlsdGVyICpmID0gKHN0cnVjdCBmd19maWx0ZXIgKikgKmFyZzsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCWlmIChmICE9IE5VTEwpIHsKIAkJaWYgKGYtPmlkICE9IGhhbmRsZSAmJiBoYW5kbGUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIGZ3X2NoYW5nZV9hdHRycyhuZXQsIHRwLCBmLCB0YiwgdGNhLCBiYXNlKTsKKwkJcmV0dXJuIGZ3X2NoYW5nZV9hdHRycyhuZXQsIHRwLCBmLCB0YiwgdGNhLCBiYXNlLCBvdnIpOwogCX0KIAogCWlmICghaGFuZGxlKQpAQCAtMjY0LDcgKzI2NCw3IEBACiAJdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX0ZXX0FDVCwgVENBX0ZXX1BPTElDRSk7CiAJZi0+aWQgPSBoYW5kbGU7CiAKLQllcnIgPSBmd19jaGFuZ2VfYXR0cnMobmV0LCB0cCwgZiwgdGIsIHRjYSwgYmFzZSk7CisJZXJyID0gZndfY2hhbmdlX2F0dHJzKG5ldCwgdHAsIGYsIHRiLCB0Y2EsIGJhc2UsIG92cik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKaW5kZXggMWFkMzA2OC4uZGQ5ZmMyNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCisrKyBiL25ldC9zY2hlZC9jbHNfcm91dGUuYwpAQCAtMzMzLDcgKzMzMyw4IEBACiBzdGF0aWMgaW50IHJvdXRlNF9zZXRfcGFybXMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHN0cnVjdCByb3V0ZTRfZmlsdGVyICpmLAogCQkJICAgIHUzMiBoYW5kbGUsIHN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCwKLQkJCSAgICBzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKmVzdCwgaW50IG5ldykKKwkJCSAgICBzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKmVzdCwgaW50IG5ldywKKwkJCSAgICBib29sIG92cikKIHsKIAlpbnQgZXJyOwogCXUzMiBpZCA9IDAsIHRvID0gMCwgbmhhbmRsZSA9IDB4ODAwMDsKQEAgLTM0Myw3ICszNDQsNyBAQAogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCiAJdGNmX2V4dHNfaW5pdCgmZSwgVENBX1JPVVRFNF9BQ1QsIFRDQV9ST1VURTRfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSk7CisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTQyOCw3ICs0MjksNyBAQAogCQkgICAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKIAkJICAgICAgIHUzMiBoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqYXJnKQorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQgPSB0cC0+cm9vdDsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZiwgKmYxLCAqKmZwOwpAQCAtNDU1LDcgKzQ1Niw3IEBACiAJCQlvbGRfaGFuZGxlID0gZi0+aGFuZGxlOwogCiAJCWVyciA9IHJvdXRlNF9zZXRfcGFybXMobmV0LCB0cCwgYmFzZSwgZiwgaGFuZGxlLCBoZWFkLCB0YiwKLQkJCXRjYVtUQ0FfUkFURV0sIDApOworCQkJdGNhW1RDQV9SQVRFXSwgMCwgb3ZyKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCkBAIC00NzksNyArNDgwLDcgQEAKIAogCXRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9ST1VURTRfQUNULCBUQ0FfUk9VVEU0X1BPTElDRSk7CiAJZXJyID0gcm91dGU0X3NldF9wYXJtcyhuZXQsIHRwLCBiYXNlLCBmLCBoYW5kbGUsIGhlYWQsIHRiLAotCQl0Y2FbVENBX1JBVEVdLCAxKTsKKwkJdGNhW1RDQV9SQVRFXSwgMSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cC5oIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKaW5kZXggMTlmOGU1ZC4uMTAyMGUyMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKKysrIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQkgICAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKIAkJICAgICAgIHUzMiBoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqYXJnKQorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3QgcnN2cF9oZWFkICpkYXRhID0gdHAtPnJvb3Q7CiAJc3RydWN0IHJzdnBfZmlsdGVyICpmLCAqKmZwOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJCXJldHVybiBlcnI7CiAKIAl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlKTsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggZjQzNWE4OC4uYzcyMWNkNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogdGNpbmRleF9zZXRfcGFybXMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkgIHUzMiBoYW5kbGUsIHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsCiAJCSAgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqciwgc3RydWN0IG5sYXR0ciAqKnRiLAotCQkgc3RydWN0IG5sYXR0ciAqZXN0KQorCQkgIHN0cnVjdCBubGF0dHIgKmVzdCwgYm9vbCBvdnIpCiB7CiAJaW50IGVyciwgYmFsbG9jID0gMDsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0IG5ld19maWx0ZXJfcmVzdWx0LCAqb2xkX3IgPSByOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJc3RydWN0IHRjZl9leHRzIGU7CiAKIAl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUpOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zNDEsNyArMzQxLDcgQEAKIHN0YXRpYyBpbnQKIHRjaW5kZXhfY2hhbmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKIAkgICAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdTMyIGhhbmRsZSwKLQkgICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnKQorCSAgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQogewogCXN0cnVjdCBubGF0dHIgKm9wdCA9IHRjYVtUQ0FfT1BUSU9OU107CiAJc3RydWN0IG5sYXR0ciAqdGJbVENBX1RDSU5ERVhfTUFYICsgMV07CkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCXJldHVybiB0Y2luZGV4X3NldF9wYXJtcyhuZXQsIHRwLCBiYXNlLCBoYW5kbGUsIHAsIHIsIHRiLAotCQkJCSB0Y2FbVENBX1JBVEVdKTsKKwkJCQkgdGNhW1RDQV9SQVRFXSwgb3ZyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3UzMi5jIGIvbmV0L3NjaGVkL2Nsc191MzIuYwppbmRleCA4NGMyOGRhLi5jMzliNTgzIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3UzMi5jCisrKyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiBzdGF0aWMgaW50IHUzMl9zZXRfcGFybXMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSB1bnNpZ25lZCBsb25nIGJhc2UsIHN0cnVjdCB0Y191X2hub2RlICpodCwKIAkJCSBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwgc3RydWN0IG5sYXR0ciAqKnRiLAotCQkJIHN0cnVjdCBubGF0dHIgKmVzdCkKKwkJCSBzdHJ1Y3QgbmxhdHRyICplc3QsIGJvb2wgb3ZyKQogewogCWludCBlcnI7CiAJc3RydWN0IHRjZl9leHRzIGU7CiAKIAl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlKTsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTQ1LDcgKzU0NSw3IEBACiBzdGF0aWMgaW50IHUzMl9jaGFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAogCQkgICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1MzIgaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgICB1bnNpZ25lZCBsb25nICphcmcpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCiB7CiAJc3RydWN0IHRjX3VfY29tbW9uICp0cF9jID0gdHAtPmRhdGE7CiAJc3RydWN0IHRjX3VfaG5vZGUgKmh0OwpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlyZXR1cm4gdTMyX3NldF9wYXJtcyhuZXQsIHRwLCBiYXNlLCBuLT5odF91cCwgbiwgdGIsCi0JCQkJICAgICB0Y2FbVENBX1JBVEVdKTsKKwkJCQkgICAgIHRjYVtUQ0FfUkFURV0sIG92cik7CiAJfQogCiAJaWYgKHRiW1RDQV9VMzJfRElWSVNPUl0pIHsKQEAgLTY1Niw3ICs2NTYsNyBAQAogCX0KICNlbmRpZgogCi0JZXJyID0gdTMyX3NldF9wYXJtcyhuZXQsIHRwLCBiYXNlLCBodCwgbiwgdGIsIHRjYVtUQ0FfUkFURV0pOworCWVyciA9IHUzMl9zZXRfcGFybXMobmV0LCB0cCwgYmFzZSwgaHQsIG4sIHRiLCB0Y2FbVENBX1JBVEVdLCBvdnIpOwogCWlmIChlcnIgPT0gMCkgewogCQlzdHJ1Y3QgdGNfdV9rbm9kZSAqKmluczsKIAkJZm9yIChpbnMgPSAmaHQtPmh0W1RDX1UzMl9IQVNIKGhhbmRsZSldOyAqaW5zOyBpbnMgPSAmKCppbnMpLT5uZXh0KQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggNDAwNzY5MC4uNThiZWQ3NSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC01NjMsNyArNTYzLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19xZGlzY19jYWxjdWxhdGVfcGt0X2xlbik7CiAKLXZvaWQgcWRpc2Nfd2Fybl9ub253YyhjaGFyICp0eHQsIHN0cnVjdCBRZGlzYyAqcWRpc2MpCit2b2lkIHFkaXNjX3dhcm5fbm9ud2MoY29uc3QgY2hhciAqdHh0LCBzdHJ1Y3QgUWRpc2MgKnFkaXNjKQogewogCWlmICghKHFkaXNjLT5mbGFncyAmIFRDUV9GX1dBUk5fTk9OV0MpKSB7CiAJCXByX3dhcm4oIiVzOiAlcyBxZGlzYyAlWDogaXMgbm9uLXdvcmstY29uc2VydmluZz9cbiIsCkBAIC0xMDg0LDcgKzEwODQsOCBAQAogCXN0cnVjdCBRZGlzYyAqcCA9IE5VTEw7CiAJaW50IGVycjsKIAotCWlmICgobi0+bmxtc2dfdHlwZSAhPSBSVE1fR0VUUURJU0MpICYmICFuZXRsaW5rX2NhcGFibGUoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwlpZiAoKG4tPm5sbXNnX3R5cGUgIT0gUlRNX0dFVFFESVNDKSAmJgorCSAgICAhbmV0bGlua19uc19jYXBhYmxlKHNrYiwgbmV0LT51c2VyX25zLCBDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWVyciA9IG5sbXNnX3BhcnNlKG4sIHNpemVvZigqdGNtKSwgdGNhLCBUQ0FfTUFYLCBOVUxMKTsKQEAgLTExNTEsNyArMTE1Miw3IEBACiAJc3RydWN0IFFkaXNjICpxLCAqcDsKIAlpbnQgZXJyOwogCi0JaWYgKCFuZXRsaW5rX2NhcGFibGUoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwlpZiAoIW5ldGxpbmtfbnNfY2FwYWJsZShza2IsIG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIHJlcGxheToKQEAgLTE0OTAsNyArMTQ5MSw4IEBACiAJdTMyIHFpZDsKIAlpbnQgZXJyOwogCi0JaWYgKChuLT5ubG1zZ190eXBlICE9IFJUTV9HRVRUQ0xBU1MpICYmICFuZXRsaW5rX2NhcGFibGUoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwlpZiAoKG4tPm5sbXNnX3R5cGUgIT0gUlRNX0dFVFRDTEFTUykgJiYKKwkgICAgIW5ldGxpbmtfbnNfY2FwYWJsZShza2IsIG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIAllcnIgPSBubG1zZ19wYXJzZShuLCBzaXplb2YoKnRjbSksIHRjYSwgVENBX01BWCwgTlVMTCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2Nob2tlLmMgYi9uZXQvc2NoZWQvc2NoX2Nob2tlLmMKaW5kZXggMmFlZTAyOC4uZWQzMGU0MyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9jaG9rZS5jCisrKyBiL25ldC9zY2hlZC9zY2hfY2hva2UuYwpAQCAtMzkxLDEyICszOTEsNyBAQAogCiBzdGF0aWMgdm9pZCBjaG9rZV9mcmVlKHZvaWQgKmFkZHIpCiB7Ci0JaWYgKGFkZHIpIHsKLQkJaWYgKGlzX3ZtYWxsb2NfYWRkcihhZGRyKSkKLQkJCXZmcmVlKGFkZHIpOwotCQllbHNlCi0JCQlrZnJlZShhZGRyKTsKLQl9CisJa3ZmcmVlKGFkZHIpOwogfQogCiBzdGF0aWMgaW50IGNob2tlX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9kcnIuYyBiL25ldC9zY2hlZC9zY2hfZHJyLmMKaW5kZXggODMwMjcxNy4uN2JiYmZlMSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9kcnIuYworKysgYi9uZXQvc2NoZWQvc2NoX2Ryci5jCkBAIC0zOTEsOCArMzkxLDEwIEBACiAJd2hpbGUgKDEpIHsKIAkJY2wgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxLT5hY3RpdmUsIHN0cnVjdCBkcnJfY2xhc3MsIGFsaXN0KTsKIAkJc2tiID0gY2wtPnFkaXNjLT5vcHMtPnBlZWsoY2wtPnFkaXNjKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQorCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCXFkaXNjX3dhcm5fbm9ud2MoX19mdW5jX18sIGNsLT5xZGlzYyk7CiAJCQlnb3RvIG91dDsKKwkJfQogCiAJCWxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKIAkJaWYgKGxlbiA8PSBjbC0+ZGVmaWNpdCkgewpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9mcS5jIGIvbmV0L3NjaGVkL3NjaF9mcS5jCmluZGV4IDIzYzY4MmIuLmJhMzJjMmIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX2ZxLmMKQEAgLTU5MSwxMCArNTkxLDcgQEAKIAogc3RhdGljIHZvaWQgZnFfZnJlZSh2b2lkICphZGRyKQogewotCWlmIChhZGRyICYmIGlzX3ZtYWxsb2NfYWRkcihhZGRyKSkKLQkJdmZyZWUoYWRkcik7Ci0JZWxzZQotCQlrZnJlZShhZGRyKTsKKwlrdmZyZWUoYWRkcik7CiB9CiAKIHN0YXRpYyBpbnQgZnFfcmVzaXplKHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgbG9nKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9mcV9jb2RlbC5jIGIvbmV0L3NjaGVkL3NjaF9mcV9jb2RlbC5jCmluZGV4IDBiZjQzMmMuLjA2M2I3MjYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZnFfY29kZWwuYworKysgYi9uZXQvc2NoZWQvc2NoX2ZxX2NvZGVsLmMKQEAgLTM2NSwxMiArMzY1LDcgQEAKIAogc3RhdGljIHZvaWQgZnFfY29kZWxfZnJlZSh2b2lkICphZGRyKQogewotCWlmIChhZGRyKSB7Ci0JCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCi0JCQl2ZnJlZShhZGRyKTsKLQkJZWxzZQotCQkJa2ZyZWUoYWRkcik7Ci0JfQorCWt2ZnJlZShhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZnFfY29kZWxfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaGhmLmMgYi9uZXQvc2NoZWQvc2NoX2hoZi5jCmluZGV4IDZlOTU3YzMuLmQ4NWI2ODEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaGhmLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9oaGYuYwpAQCAtNDE0LDcgKzQxNCw3IEBACiAJCX0KIAkJYnVja2V0LT5kZWZpY2l0ID0gd2VpZ2h0ICogcS0+cXVhbnR1bTsKIAl9Ci0JaWYgKCsrc2NoLT5xLnFsZW4gPCBzY2gtPmxpbWl0KQorCWlmICgrK3NjaC0+cS5xbGVuIDw9IHNjaC0+bGltaXQpCiAJCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOwogCiAJcS0+ZHJvcF9vdmVybGltaXQrKzsKQEAgLTQ5NCwxMiArNDk0LDcgQEAKIAogc3RhdGljIHZvaWQgaGhmX2ZyZWUodm9pZCAqYWRkcikKIHsKLQlpZiAoYWRkcikgewotCQlpZiAoaXNfdm1hbGxvY19hZGRyKGFkZHIpKQotCQkJdmZyZWUoYWRkcik7Ci0JCWVsc2UKLQkJCWtmcmVlKGFkZHIpOwotCX0KKwlrdmZyZWUoYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGhoZl9kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCmluZGV4IGYxNjY5YTAwLi4xMTFkNzBmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC02NDgsMTIgKzY0OCw3IEBACiAKIHN0YXRpYyB2b2lkIGRpc3RfZnJlZShzdHJ1Y3QgZGlzdHRhYmxlICpkKQogewotCWlmIChkKSB7Ci0JCWlmIChpc192bWFsbG9jX2FkZHIoZCkpCi0JCQl2ZnJlZShkKTsKLQkJZWxzZQotCQkJa2ZyZWUoZCk7Ci0JfQorCWt2ZnJlZShkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfc2ZxLmMgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCmluZGV4IDg3MzE3ZmYuLjFhZjJmNzMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfc2ZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwpAQCAtNzE2LDEyICs3MTYsNyBAQAogCiBzdGF0aWMgdm9pZCBzZnFfZnJlZSh2b2lkICphZGRyKQogewotCWlmIChhZGRyKSB7Ci0JCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCi0JCQl2ZnJlZShhZGRyKTsKLQkJZWxzZQotCQkJa2ZyZWUoYWRkcik7Ci0JfQorCWt2ZnJlZShhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgc2ZxX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpzY2gpCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDM5NTc5YzMuLjlkZTIzYTIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfc2VsZWN0X2FjdGl2ZV9hbmRfcmV0cmFuX3BhdGgoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpOwogc3RhdGljIHZvaWQgc2N0cF9hc3NvY19iaF9yY3Yoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIHNjdHBfYXNzb2NfZnJlZV9hc2NvbmZfYWNrcyhzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyk7CiBzdGF0aWMgdm9pZCBzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX3F1ZXVlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKTsKQEAgLTMzMCw3ICszMzEsNyBAQAogCS8qIE9ubHkgcmVhbCBhc3NvY2lhdGlvbnMgY291bnQgYWdhaW5zdCB0aGUgZW5kcG9pbnQsIHNvCiAJICogZG9uJ3QgYm90aGVyIGZvciBpZiB0aGlzIGlzIGEgdGVtcG9yYXJ5IGFzc29jaWF0aW9uLgogCSAqLwotCWlmICghYXNvYy0+dGVtcCkgeworCWlmICghbGlzdF9lbXB0eSgmYXNvYy0+YXNvY3MpKSB7CiAJCWxpc3RfZGVsKCZhc29jLT5hc29jcyk7CiAKIAkJLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcKQEAgLTc3NCw5ICs3NzUsNiBAQAogCQkJCSAgc2N0cF90cmFuc3BvcnRfY21kX3QgY29tbWFuZCwKIAkJCQkgIHNjdHBfc25fZXJyb3JfdCBlcnJvcikKIHsKLQlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQgPSBOVUxMOwotCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqZmlyc3Q7Ci0Jc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzZWNvbmQ7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAJaW50IHNwY19zdGF0ZSA9IDA7CkBAIC04MjksMTMgKzgyNywxNCBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogR2VuZXJhdGUgYW5kIHNlbmQgYSBTQ1RQX1BFRVJfQUREUl9DSEFOR0Ugbm90aWZpY2F0aW9uIHRvIHRoZQotCSAqIHVzZXIuCisJLyogR2VuZXJhdGUgYW5kIHNlbmQgYSBTQ1RQX1BFRVJfQUREUl9DSEFOR0Ugbm90aWZpY2F0aW9uCisJICogdG8gdGhlIHVzZXIuCiAJICovCiAJaWYgKHVscF9ub3RpZnkpIHsKIAkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKIAkJbWVtY3B5KCZhZGRyLCAmdHJhbnNwb3J0LT5pcGFkZHIsCiAJCSAgICAgICB0cmFuc3BvcnQtPmFmX3NwZWNpZmljLT5zb2NrYWRkcl9sZW4pOworCiAJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX3BlZXJfYWRkcl9jaGFuZ2UoYXNvYywgJmFkZHIsCiAJCQkJCTAsIHNwY19zdGF0ZSwgZXJyb3IsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXZlbnQpCkBAIC04NDMsNjAgKzg0Miw3IEBACiAJfQogCiAJLyogU2VsZWN0IG5ldyBhY3RpdmUgYW5kIHJldHJhbiBwYXRocy4gKi8KLQotCS8qIExvb2sgZm9yIHRoZSB0d28gbW9zdCByZWNlbnRseSB1c2VkIGFjdGl2ZSB0cmFuc3BvcnRzLgotCSAqCi0JICogVGhpcyBjb2RlIHByb2R1Y2VzIHRoZSB3cm9uZyBvcmRlcmluZyB3aGVuZXZlciBqaWZmaWVzCi0JICogcm9sbHMgb3ZlciwgYnV0IHdlIHN0aWxsIGdldCB1c2FibGUgdHJhbnNwb3J0cywgc28gd2UgZG9uJ3QKLQkgKiB3b3JyeSBhYm91dCBpdC4KLQkgKi8KLQlmaXJzdCA9IE5VTEw7IHNlY29uZCA9IE5VTEw7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QsCi0JCQl0cmFuc3BvcnRzKSB7Ci0KLQkJaWYgKCh0LT5zdGF0ZSA9PSBTQ1RQX0lOQUNUSVZFKSB8fAotCQkgICAgKHQtPnN0YXRlID09IFNDVFBfVU5DT05GSVJNRUQpIHx8Ci0JCSAgICAodC0+c3RhdGUgPT0gU0NUUF9QRikpCi0JCQljb250aW51ZTsKLQkJaWYgKCFmaXJzdCB8fCB0LT5sYXN0X3RpbWVfaGVhcmQgPiBmaXJzdC0+bGFzdF90aW1lX2hlYXJkKSB7Ci0JCQlzZWNvbmQgPSBmaXJzdDsKLQkJCWZpcnN0ID0gdDsKLQkJfSBlbHNlIGlmICghc2Vjb25kIHx8Ci0JCQkgICB0LT5sYXN0X3RpbWVfaGVhcmQgPiBzZWNvbmQtPmxhc3RfdGltZV9oZWFyZCkKLQkJCXNlY29uZCA9IHQ7Ci0JfQotCi0JLyogUkZDIDI5NjAgNi40IE11bHRpLUhvbWVkIFNDVFAgRW5kcG9pbnRzCi0JICoKLQkgKiBCeSBkZWZhdWx0LCBhbiBlbmRwb2ludCBzaG91bGQgYWx3YXlzIHRyYW5zbWl0IHRvIHRoZQotCSAqIHByaW1hcnkgcGF0aCwgdW5sZXNzIHRoZSBTQ1RQIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlCi0JICogZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgKGFuZCBwb3NzaWJseSBzb3VyY2UKLQkgKiB0cmFuc3BvcnQgYWRkcmVzcykgdG8gdXNlLgotCSAqCi0JICogW0lmIHRoZSBwcmltYXJ5IGlzIGFjdGl2ZSBidXQgbm90IG1vc3QgcmVjZW50LCBidW1wIHRoZSBtb3N0Ci0JICogcmVjZW50bHkgdXNlZCB0cmFuc3BvcnQuXQotCSAqLwotCWlmICgoKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5zdGF0ZSA9PSBTQ1RQX0FDVElWRSkgfHwKLQkgICAgIChhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+c3RhdGUgPT0gU0NUUF9VTktOT1dOKSkgJiYKLQkgICAgZmlyc3QgIT0gYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgpIHsKLQkJc2Vjb25kID0gZmlyc3Q7Ci0JCWZpcnN0ID0gYXNvYy0+cGVlci5wcmltYXJ5X3BhdGg7Ci0JfQotCi0JaWYgKCFzZWNvbmQpCi0JCXNlY29uZCA9IGZpcnN0OwotCS8qIElmIHdlIGZhaWxlZCB0byBmaW5kIGEgdXNhYmxlIHRyYW5zcG9ydCwganVzdCBjYW1wIG9uIHRoZQotCSAqIHByaW1hcnksIGV2ZW4gaWYgaXQgaXMgaW5hY3RpdmUuCi0JICovCi0JaWYgKCFmaXJzdCkgewotCQlmaXJzdCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOwotCQlzZWNvbmQgPSBhc29jLT5wZWVyLnByaW1hcnlfcGF0aDsKLQl9Ci0KLQkvKiBTZXQgdGhlIGFjdGl2ZSBhbmQgcmV0cmFuIHRyYW5zcG9ydHMuICAqLwotCWFzb2MtPnBlZXIuYWN0aXZlX3BhdGggPSBmaXJzdDsKLQlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gc2Vjb25kOworCXNjdHBfc2VsZWN0X2FjdGl2ZV9hbmRfcmV0cmFuX3BhdGgoYXNvYyk7CiB9CiAKIC8qIEhvbGQgYSByZWZlcmVuY2UgdG8gYW4gYXNzb2NpYXRpb24uICovCkBAIC0xMDkwLDcgKzEwMzYsNyBAQAogCQl9CiAKIAkJaWYgKGNodW5rLT50cmFuc3BvcnQpCi0JCQljaHVuay0+dHJhbnNwb3J0LT5sYXN0X3RpbWVfaGVhcmQgPSBqaWZmaWVzOworCQkJY2h1bmstPnRyYW5zcG9ydC0+bGFzdF90aW1lX2hlYXJkID0ga3RpbWVfZ2V0KCk7CiAKIAkJLyogUnVuIHRocm91Z2ggdGhlIHN0YXRlIG1hY2hpbmUuICovCiAJCWVycm9yID0gc2N0cF9kb19zbShuZXQsIFNDVFBfRVZFTlRfVF9DSFVOSywgc3VidHlwZSwKQEAgLTEyNzgsMTMgKzEyMjQsNDEgQEAKIAlyZXR1cm4gc2N0cF90cmFuc19zdGF0ZV90b19wcmlvX21hcFt0cmFucy0+c3RhdGVdOwogfQogCitzdGF0aWMgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zX2VsZWN0X3RpZShzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zMSwKKwkJCQkJCSAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnMyKQoreworCWlmICh0cmFuczEtPmVycm9yX2NvdW50ID4gdHJhbnMyLT5lcnJvcl9jb3VudCkgeworCQlyZXR1cm4gdHJhbnMyOworCX0gZWxzZSBpZiAodHJhbnMxLT5lcnJvcl9jb3VudCA9PSB0cmFuczItPmVycm9yX2NvdW50ICYmCisJCSAgIGt0aW1lX2FmdGVyKHRyYW5zMi0+bGFzdF90aW1lX2hlYXJkLAorCQkJICAgICAgIHRyYW5zMS0+bGFzdF90aW1lX2hlYXJkKSkgeworCQlyZXR1cm4gdHJhbnMyOworCX0gZWxzZSB7CisJCXJldHVybiB0cmFuczE7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zX2VsZWN0X2Jlc3Qoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpjdXJyLAogCQkJCQkJICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqYmVzdCkKIHsKKwl1OCBzY29yZV9jdXJyLCBzY29yZV9iZXN0OworCiAJaWYgKGJlc3QgPT0gTlVMTCkKIAkJcmV0dXJuIGN1cnI7CiAKLQlyZXR1cm4gc2N0cF90cmFuc19zY29yZShjdXJyKSA+IHNjdHBfdHJhbnNfc2NvcmUoYmVzdCkgPyBjdXJyIDogYmVzdDsKKwlzY29yZV9jdXJyID0gc2N0cF90cmFuc19zY29yZShjdXJyKTsKKwlzY29yZV9iZXN0ID0gc2N0cF90cmFuc19zY29yZShiZXN0KTsKKworCS8qIEZpcnN0LCB0cnkgYSBzY29yZS1iYXNlZCBzZWxlY3Rpb24gaWYgYm90aCB0cmFuc3BvcnQgc3RhdGVzCisJICogZGlmZmVyLiBJZiB3ZSdyZSBpbiBhIHRpZSwgbGV0cyB0cnkgdG8gbWFrZSBhIG1vcmUgY2xldmVyCisJICogZGVjaXNpb24gaGVyZSBiYXNlZCBvbiBlcnJvciBjb3VudHMgYW5kIGxhc3QgdGltZSBoZWFyZC4KKwkgKi8KKwlpZiAoc2NvcmVfY3VyciA+IHNjb3JlX2Jlc3QpCisJCXJldHVybiBjdXJyOworCWVsc2UgaWYgKHNjb3JlX2N1cnIgPT0gc2NvcmVfYmVzdCkKKwkJcmV0dXJuIHNjdHBfdHJhbnNfZWxlY3RfdGllKGN1cnIsIGJlc3QpOworCWVsc2UKKwkJcmV0dXJuIGJlc3Q7CiB9CiAKIHZvaWQgc2N0cF9hc3NvY191cGRhdGVfcmV0cmFuX3BhdGgoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCkBAIC0xMzI1LDYgKzEyOTksNzYgQEAKIAkJIF9fZnVuY19fLCBhc29jLCAmYXNvYy0+cGVlci5yZXRyYW5fcGF0aC0+aXBhZGRyLnNhKTsKIH0KIAorc3RhdGljIHZvaWQgc2N0cF9zZWxlY3RfYWN0aXZlX2FuZF9yZXRyYW5fcGF0aChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zLCAqdHJhbnNfcHJpID0gTlVMTCwgKnRyYW5zX3NlYyA9IE5VTEw7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc19wZiA9IE5VTEw7CisKKwkvKiBMb29rIGZvciB0aGUgdHdvIG1vc3QgcmVjZW50bHkgdXNlZCBhY3RpdmUgdHJhbnNwb3J0cy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0LAorCQkJICAgIHRyYW5zcG9ydHMpIHsKKwkJLyogU2tpcCB1bmludGVyZXN0aW5nIHRyYW5zcG9ydHMuICovCisJCWlmICh0cmFucy0+c3RhdGUgPT0gU0NUUF9JTkFDVElWRSB8fAorCQkgICAgdHJhbnMtPnN0YXRlID09IFNDVFBfVU5DT05GSVJNRUQpCisJCQljb250aW51ZTsKKwkJLyogS2VlcCB0cmFjayBvZiB0aGUgYmVzdCBQRiB0cmFuc3BvcnQgZnJvbSBvdXIKKwkJICogbGlzdCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYW4gYWN0aXZlIG9uZS4KKwkJICovCisJCWlmICh0cmFucy0+c3RhdGUgPT0gU0NUUF9QRikgeworCQkJdHJhbnNfcGYgPSBzY3RwX3RyYW5zX2VsZWN0X2Jlc3QodHJhbnMsIHRyYW5zX3BmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEZvciBhY3RpdmUgdHJhbnNwb3J0cywgcGljayB0aGUgbW9zdCByZWNlbnQgb25lcy4gKi8KKwkJaWYgKHRyYW5zX3ByaSA9PSBOVUxMIHx8CisJCSAgICBrdGltZV9hZnRlcih0cmFucy0+bGFzdF90aW1lX2hlYXJkLAorCQkJCXRyYW5zX3ByaS0+bGFzdF90aW1lX2hlYXJkKSkgeworCQkJdHJhbnNfc2VjID0gdHJhbnNfcHJpOworCQkJdHJhbnNfcHJpID0gdHJhbnM7CisJCX0gZWxzZSBpZiAodHJhbnNfc2VjID09IE5VTEwgfHwKKwkJCSAgIGt0aW1lX2FmdGVyKHRyYW5zLT5sYXN0X3RpbWVfaGVhcmQsCisJCQkJICAgICAgIHRyYW5zX3NlYy0+bGFzdF90aW1lX2hlYXJkKSkgeworCQkJdHJhbnNfc2VjID0gdHJhbnM7CisJCX0KKwl9CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktSG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEJ5IGRlZmF1bHQsIGFuIGVuZHBvaW50IHNob3VsZCBhbHdheXMgdHJhbnNtaXQgdG8gdGhlIHByaW1hcnkKKwkgKiBwYXRoLCB1bmxlc3MgdGhlIFNDVFAgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUKKwkgKiBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyAoYW5kIHBvc3NpYmx5IHNvdXJjZSB0cmFuc3BvcnQKKwkgKiBhZGRyZXNzKSB0byB1c2UuIFtJZiB0aGUgcHJpbWFyeSBpcyBhY3RpdmUgYnV0IG5vdCBtb3N0IHJlY2VudCwKKwkgKiBidW1wIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgdHJhbnNwb3J0Ll0KKwkgKi8KKwlpZiAoKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5zdGF0ZSA9PSBTQ1RQX0FDVElWRSB8fAorCSAgICAgYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPnN0YXRlID09IFNDVFBfVU5LTk9XTikgJiYKKwkgICAgIGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoICE9IHRyYW5zX3ByaSkgeworCQl0cmFuc19zZWMgPSB0cmFuc19wcmk7CisJCXRyYW5zX3ByaSA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOworCX0KKworCS8qIFdlIGRpZCBub3QgZmluZCBhbnl0aGluZyB1c2VmdWwgZm9yIGEgcG9zc2libGUgcmV0cmFuc21pc3Npb24KKwkgKiBwYXRoOyBlaXRoZXIgcHJpbWFyeSBwYXRoIHRoYXQgd2UgZm91bmQgaXMgdGhlIHRoZSBzYW1lIGFzCisJICogdGhlIGN1cnJlbnQgb25lLCBvciB3ZSBkaWRuJ3QgZ2VuZXJhbGx5IGZpbmQgYW4gYWN0aXZlIG9uZS4KKwkgKi8KKwlpZiAodHJhbnNfc2VjID09IE5VTEwpCisJCXRyYW5zX3NlYyA9IHRyYW5zX3ByaTsKKworCS8qIElmIHdlIGZhaWxlZCB0byBmaW5kIGEgdXNhYmxlIHRyYW5zcG9ydCwganVzdCBjYW1wIG9uIHRoZQorCSAqIHByaW1hcnkgb3IgcmV0cmFuLCBldmVuIGlmIHRoZXkgYXJlIGluYWN0aXZlLCBpZiBwb3NzaWJsZQorCSAqIHBpY2sgYSBQRiBpZmYgaXQncyB0aGUgYmV0dGVyIGNob2ljZS4KKwkgKi8KKwlpZiAodHJhbnNfcHJpID09IE5VTEwpIHsKKwkJdHJhbnNfcHJpID0gc2N0cF90cmFuc19lbGVjdF9iZXN0KGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLAorCQkJCQkJICBhc29jLT5wZWVyLnJldHJhbl9wYXRoKTsKKwkJdHJhbnNfcHJpID0gc2N0cF90cmFuc19lbGVjdF9iZXN0KHRyYW5zX3ByaSwgdHJhbnNfcGYpOworCQl0cmFuc19zZWMgPSBhc29jLT5wZWVyLnByaW1hcnlfcGF0aDsKKwl9CisKKwkvKiBTZXQgdGhlIGFjdGl2ZSBhbmQgcmV0cmFuIHRyYW5zcG9ydHMuICovCisJYXNvYy0+cGVlci5hY3RpdmVfcGF0aCA9IHRyYW5zX3ByaTsKKwlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gdHJhbnNfc2VjOworfQorCiBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKgogc2N0cF9hc3NvY19jaG9vc2VfYWx0ZXJfdHJhbnNwb3J0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCSAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpsYXN0X3NlbnRfdG8pCkBAIC0xNTQ3LDcgKzE1OTEsNyBAQAogLyogU2V0IGFuIGFzc29jaWF0aW9uIGlkIGZvciBhIGdpdmVuIGFzc29jaWF0aW9uICovCiBpbnQgc2N0cF9hc3NvY19zZXRfaWQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGdmcF90IGdmcCkKIHsKLQlib29sIHByZWxvYWQgPSBnZnAgJiBfX0dGUF9XQUlUOworCWJvb2wgcHJlbG9hZCA9ICEhKGdmcCAmIF9fR0ZQX1dBSVQpOwogCWludCByZXQ7CiAKIAkvKiBJZiB0aGUgaWQgaXMgYWxyZWFkeSBhc3NpZ25lZCwga2VlcCBpdC4gKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCmluZGV4IDNkOWY0MjkuLjlkYTc2YmEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKKysrIGIvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJCX0KIAogCQlpZiAoY2h1bmstPnRyYW5zcG9ydCkKLQkJCWNodW5rLT50cmFuc3BvcnQtPmxhc3RfdGltZV9oZWFyZCA9IGppZmZpZXM7CisJCQljaHVuay0+dHJhbnNwb3J0LT5sYXN0X3RpbWVfaGVhcmQgPSBrdGltZV9nZXQoKTsKIAogCQllcnJvciA9IHNjdHBfZG9fc20obmV0LCBTQ1RQX0VWRU5UX1RfQ0hVTkssIHN1YnR5cGUsIHN0YXRlLAogCQkJCSAgIGVwLCBhc29jLCBjaHVuaywgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMmIxNzM4ZS4uMTk5OTU5MiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJSVA2X0VDTl9mbG93X3htaXQoc2ssIGZsNi0+Zmxvd2xhYmVsKTsKIAogCWlmICghKHRyYW5zcG9ydC0+cGFyYW1fZmxhZ3MgJiBTUFBfUE1UVURfRU5BQkxFKSkKLQkJc2tiLT5sb2NhbF9kZiA9IDE7CisJCXNrYi0+aWdub3JlX2RmID0gMTsKIAogCVNDVFBfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgU0NUUF9NSUJfT1VUU0NUUFBBQ0tTKTsKIApAQCAtOTQzLDcgKzk0Myw2IEBACiAJLnByb3RvY29sICAgICAgPSBJUFBST1RPX1NDVFAsCiAJLnByb3QgCSAgICAgICA9ICZzY3RwdjZfcHJvdCwKIAkub3BzICAgICAgICAgICA9ICZpbmV0Nl9zZXFwYWNrZXRfb3BzLAotCS5ub19jaGVjayAgICAgID0gMCwKIAkuZmxhZ3MgICAgICAgICA9IFNDVFBfUFJPVE9TV19GTEFHCiB9Owogc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgc2N0cHY2X3N0cmVhbV9wcm90b3N3ID0gewpAQCAtOTUxLDcgKzk1MCw2IEBACiAJLnByb3RvY29sICAgICAgPSBJUFBST1RPX1NDVFAsCiAJLnByb3QgCSAgICAgICA9ICZzY3RwdjZfcHJvdCwKIAkub3BzICAgICAgICAgICA9ICZpbmV0Nl9zZXFwYWNrZXRfb3BzLAotCS5ub19jaGVjayAgICAgID0gMCwKIAkuZmxhZ3MgICAgICAgICA9IFNDVFBfUFJPVE9TV19GTEFHLAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwppbmRleCAwZjRkMTVmLi4wMWFiOGUwIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRwdXQuYworKysgYi9uZXQvc2N0cC9vdXRwdXQuYwpAQCAtNTkxLDcgKzU5MSw3IEBACiAKIAlwcl9kZWJ1ZygiKioqc2N0cF90cmFuc21pdF9wYWNrZXQqKiogc2tiLT5sZW46JWRcbiIsIG5za2ItPmxlbik7CiAKLQluc2tiLT5sb2NhbF9kZiA9IHBhY2tldC0+aXBmcmFnb2s7CisJbnNrYi0+aWdub3JlX2RmID0gcGFja2V0LT5pcGZyYWdvazsKIAl0cC0+YWZfc3BlY2lmaWMtPnNjdHBfeG1pdChuc2tiLCB0cCk7CiAKIG91dDoKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb2MuYyBiL25ldC9zY3RwL3Byb2MuYwppbmRleCAwOTQ3ZjFlLi4zNDIyOWVlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm9jLmMKKysrIGIvbmV0L3NjdHAvcHJvYy5jCkBAIC03OCw3ICs3OCw3IEBACiAKIAlmb3IgKGkgPSAwOyBzY3RwX3NubXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWxkXG4iLCBzY3RwX3NubXBfbGlzdFtpXS5uYW1lLAotCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+c2N0cC5zY3RwX3N0YXRpc3RpY3MsCisJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcywKIAkJCQkgICAgICBzY3RwX3NubXBfbGlzdFtpXS5lbnRyeSkpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm90b2NvbC5jIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwppbmRleCA0NGNiYjU0Li42Nzg5ZDc4NSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0xMDE3LDcgKzEwMTcsNiBAQAogCS5wcm90b2NvbCAgID0gSVBQUk9UT19TQ1RQLAogCS5wcm90ICAgICAgID0gJnNjdHBfcHJvdCwKIAkub3BzICAgICAgICA9ICZpbmV0X3NlcXBhY2tldF9vcHMsCi0JLm5vX2NoZWNrICAgPSAwLAogCS5mbGFncyAgICAgID0gU0NUUF9QUk9UT1NXX0ZMQUcKIH07CiBzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyBzY3RwX3N0cmVhbV9wcm90b3N3ID0gewpAQCAtMTAyNSw3ICsxMDI0LDYgQEAKIAkucHJvdG9jb2wgICA9IElQUFJPVE9fU0NUUCwKIAkucHJvdCAgICAgICA9ICZzY3RwX3Byb3QsCiAJLm9wcyAgICAgICAgPSAmaW5ldF9zZXFwYWNrZXRfb3BzLAotCS5ub19jaGVjayAgID0gMCwKIAkuZmxhZ3MgICAgICA9IFNDVFBfUFJPVE9TV19GTEFHCiB9OwogCkBAIC0xMTA1LDE0ICsxMTAzLDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGluaXRfc2N0cF9taWJzKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlyZXR1cm4gc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPnNjdHAuc2N0cF9zdGF0aXN0aWNzLAotCQkJICAgICBzaXplb2Yoc3RydWN0IHNjdHBfbWliKSwKLQkJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IHNjdHBfbWliKSk7CisJbmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2N0cF9taWIpOworCWlmICghbmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX3NjdHBfbWlicyhzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0Jc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPnNjdHAuc2N0cF9zdGF0aXN0aWNzKTsKKwlmcmVlX3BlcmNwdShuZXQtPnNjdHAuc2N0cF9zdGF0aXN0aWNzKTsKIH0KIAogc3RhdGljIHZvaWQgc2N0cF92NF9wZl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKaW5kZXggZmVlNTU1Mi4uYWUwZTYxNiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtMTc4Miw3ICsxNzgyLDcgQEAKIAllbHNlCiAJCWt0ID0ga3RpbWVfZ2V0KCk7CiAKLQlpZiAoIWFzb2MgJiYga3RpbWVfY29tcGFyZShiZWFyX2Nvb2tpZS0+ZXhwaXJhdGlvbiwga3QpIDwgMCkgeworCWlmICghYXNvYyAmJiBrdGltZV9iZWZvcmUoYmVhcl9jb29raWUtPmV4cGlyYXRpb24sIGt0KSkgewogCQkvKgogCQkgKiBTZWN0aW9uIDMuMy4xMC4zIFN0YWxlIENvb2tpZSBFcnJvciAoMykKIAkJICoKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggZmVlMDZiOS4uNDI5ODk5NiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTcxLDYgKzcxLDcgQEAKICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9idXN5X3BvbGwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBmb3Igc2FfZmFtaWx5X3QgKi8KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KQEAgLTU5NDUsOCArNTk0Niw5IEBACiAJCS8qIFNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIHBvcnQuICovCiAJCWludCBsb3csIGhpZ2gsIHJlbWFpbmluZywgaW5kZXg7CiAJCXVuc2lnbmVkIGludCByb3ZlcjsKKwkJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCi0JCWluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2Uoc29ja19uZXQoc2spLCAmbG93LCAmaGlnaCk7CisJCWluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2UobmV0LCAmbG93LCAmaGlnaCk7CiAJCXJlbWFpbmluZyA9IChoaWdoIC0gbG93KSArIDE7CiAJCXJvdmVyID0gcHJhbmRvbV91MzIoKSAlIHJlbWFpbmluZyArIGxvdzsKIApAQCAtNTk1NCw3ICs1OTU2LDcgQEAKIAkJCXJvdmVyKys7CiAJCQlpZiAoKHJvdmVyIDwgbG93KSB8fCAocm92ZXIgPiBoaWdoKSkKIAkJCQlyb3ZlciA9IGxvdzsKLQkJCWlmIChpbmV0X2lzX3Jlc2VydmVkX2xvY2FsX3BvcnQocm92ZXIpKQorCQkJaWYgKGluZXRfaXNfbG9jYWxfcmVzZXJ2ZWRfcG9ydChuZXQsIHJvdmVyKSkKIAkJCQljb250aW51ZTsKIAkJCWluZGV4ID0gc2N0cF9waGFzaGZuKHNvY2tfbmV0KHNrKSwgcm92ZXIpOwogCQkJaGVhZCA9ICZzY3RwX3BvcnRfaGFzaHRhYmxlW2luZGV4XTsKQEAgLTY1NTcsNiArNjU1OSwxMCBAQAogCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQogCQkJYnJlYWs7CiAKKwkJaWYgKHNrX2Nhbl9idXN5X2xvb3Aoc2spICYmCisJCSAgICBza19idXN5X2xvb3Aoc2ssIG5vYmxvY2spKQorCQkJY29udGludWU7CisKIAkJLyogVXNlciBkb2Vzbid0IHdhbnQgdG8gd2FpdC4gICovCiAJCWVycm9yID0gLUVBR0FJTjsKIAkJaWYgKCF0aW1lbykKQEAgLTY5NDAsNyArNjk0Niw4IEBACiAJbmV3c2stPnNrX3R5cGUgPSBzay0+c2tfdHlwZTsKIAluZXdzay0+c2tfYm91bmRfZGV2X2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAluZXdzay0+c2tfZmxhZ3MgPSBzay0+c2tfZmxhZ3M7Ci0JbmV3c2stPnNrX25vX2NoZWNrID0gc2stPnNrX25vX2NoZWNrOworCW5ld3NrLT5za19ub19jaGVja190eCA9IHNrLT5za19ub19jaGVja190eDsKKwluZXdzay0+c2tfbm9fY2hlY2tfcnggPSBzay0+c2tfbm9fY2hlY2tfcng7CiAJbmV3c2stPnNrX3JldXNlID0gc2stPnNrX3JldXNlOwogCiAJbmV3c2stPnNrX3NodXRkb3duID0gc2stPnNrX3NodXRkb3duOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc3lzY3RsLmMgYi9uZXQvc2N0cC9zeXNjdGwuYwppbmRleCBjODJmZGMxLi43ZTVlYjc1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zeXNjdGwuYworKysgYi9uZXQvc2N0cC9zeXNjdGwuYwpAQCAtNDM2LDIwICs0MzYsMjEgQEAKIAogaW50IHNjdHBfc3lzY3RsX25ldF9yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0Jc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBzY3RwX25ldF90YWJsZTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKKwlpbnQgaTsKIAotCWlmICghbmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgewotCQlpbnQgaTsKKwl0YWJsZSA9IGttZW1kdXAoc2N0cF9uZXRfdGFibGUsIHNpemVvZihzY3RwX25ldF90YWJsZSksIEdGUF9LRVJORUwpOworCWlmICghdGFibGUpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCXRhYmxlID0ga21lbWR1cChzY3RwX25ldF90YWJsZSwgc2l6ZW9mKHNjdHBfbmV0X3RhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGFibGUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlmb3IgKGkgPSAwOyB0YWJsZVtpXS5kYXRhOyBpKyspCi0JCQl0YWJsZVtpXS5kYXRhICs9IChjaGFyICopKCZuZXQtPnNjdHApIC0gKGNoYXIgKikmaW5pdF9uZXQuc2N0cDsKLQl9CisJZm9yIChpID0gMDsgdGFibGVbaV0uZGF0YTsgaSsrKQorCQl0YWJsZVtpXS5kYXRhICs9IChjaGFyICopKCZuZXQtPnNjdHApIC0gKGNoYXIgKikmaW5pdF9uZXQuc2N0cDsKIAogCW5ldC0+c2N0cC5zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bChuZXQsICJuZXQvc2N0cCIsIHRhYmxlKTsKKwlpZiAobmV0LT5zY3RwLnN5c2N0bF9oZWFkZXIgPT0gTlVMTCkgeworCQlrZnJlZSh0YWJsZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwppbmRleCAxZDM0OGQxLi43ZGQ2NzJmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC90cmFuc3BvcnQuYworKysgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwpAQCAtNzIsNyArNzIsNyBAQAogCSAqLwogCXBlZXItPnJ0byA9IG1zZWNzX3RvX2ppZmZpZXMobmV0LT5zY3RwLnJ0b19pbml0aWFsKTsKIAotCXBlZXItPmxhc3RfdGltZV9oZWFyZCA9IGppZmZpZXM7CisJcGVlci0+bGFzdF90aW1lX2hlYXJkID0ga3RpbWVfZ2V0KCk7CiAJcGVlci0+bGFzdF90aW1lX2VjbmVfcmVkdWNlZCA9IGppZmZpZXM7CiAKIAlwZWVyLT5wYXJhbV9mbGFncyA9IFNQUF9IQl9ESVNBQkxFIHwKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IDcxNDRlYjZhLi5kNDlkYzJlZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwcXVldWUuYworKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9idXN5X3BvbGwuaD4KICNpbmNsdWRlIDxuZXQvc2N0cC9zdHJ1Y3RzLmg+CiAjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CkBAIC0yMDQsNiArMjA1LDkgQEAKIAlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpIHx8IChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pKQogCQlnb3RvIG91dF9mcmVlOwogCisJaWYgKCFzY3RwX3VscGV2ZW50X2lzX25vdGlmaWNhdGlvbihldmVudCkpCisJCXNrX21hcmtfbmFwaV9pZChzaywgc2tiKTsKKwogCS8qIENoZWNrIGlmIHRoZSB1c2VyIHdpc2hlcyB0byByZWNlaXZlIHRoaXMgZXZlbnQuICAqLwogCWlmICghc2N0cF91bHBldmVudF9pc19lbmFibGVkKGV2ZW50LCAmc2N0cF9zayhzayktPnN1YnNjcmliZSkpCiAJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3NvY2tsaWIuYyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCmluZGV4IDBhNjQ4YzUuLjJkZjg3ZjcgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc29ja2xpYi5jCisrKyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCkBAIC0xNzMsNyArMTczLDggQEAKIAkJcmV0dXJuIC0xOwogCWlmIChjc3VtX2ZvbGQoZGVzYy5jc3VtKSkKIAkJcmV0dXJuIC0xOwotCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkpCisJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSAmJgorCSAgICAhc2tiLT5jc3VtX2NvbXBsZXRlX3N3KQogCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7CiAJcmV0dXJuIDA7CiBub19jaGVja3N1bToKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCA0MDJhN2U5Li5iZThiYmQ1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC04NjYsOCArODY2LDYgQEAKIAl4c19yZXN0b3JlX29sZF9jYWxsYmFja3ModHJhbnNwb3J0LCBzayk7CiAJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKLQlzay0+c2tfbm9fY2hlY2sgPSAwOwotCiAJdHJhY2VfcnBjX3NvY2tldF9jbG9zZSgmdHJhbnNwb3J0LT54cHJ0LCBzb2NrKTsKIAlzb2NrX3JlbGVhc2Uoc29jayk7CiB9CkBAIC0yMDQ2LDcgKzIwNDQsNiBAQAogCQlzay0+c2tfdXNlcl9kYXRhID0geHBydDsKIAkJc2stPnNrX2RhdGFfcmVhZHkgPSB4c191ZHBfZGF0YV9yZWFkeTsKIAkJc2stPnNrX3dyaXRlX3NwYWNlID0geHNfdWRwX3dyaXRlX3NwYWNlOwotCQlzay0+c2tfbm9fY2hlY2sgPSBVRFBfQ1NVTV9OT1JDVjsKIAkJc2stPnNrX2FsbG9jYXRpb24gPSBHRlBfQVRPTUlDOwogCiAJCXhwcnRfc2V0X2Nvbm5lY3RlZCh4cHJ0KTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL01ha2VmaWxlIGIvbmV0L3RpcGMvTWFrZWZpbGUKaW5kZXggYjI4MmY3MS4uYTA4MGM2NiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvTWFrZWZpbGUKKysrIGIvbmV0L3RpcGMvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiBvYmotJChDT05GSUdfVElQQykgOj0gdGlwYy5vCiAKIHRpcGMteQkrPSBhZGRyLm8gYmNhc3QubyBiZWFyZXIubyBjb25maWcubyBcCi0JICAgY29yZS5vIGhhbmRsZXIubyBsaW5rLm8gZGlzY292ZXIubyBtc2cubyAgXAorCSAgIGNvcmUubyBsaW5rLm8gZGlzY292ZXIubyBtc2cubyAgXAogCSAgIG5hbWVfZGlzdHIubyAgc3Vic2NyLm8gbmFtZV90YWJsZS5vIG5ldC5vICBcCiAJICAgbmV0bGluay5vIG5vZGUubyBub2RlX3N1YnNjci5vIHBvcnQubyByZWYubyAgXAogCSAgIHNvY2tldC5vIGxvZy5vIGV0aF9tZWRpYS5vIHNlcnZlci5vCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCA5NWFiNWVmLi4yNjYzMTY3IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTcxLDcgKzcxLDcgQEAKICAqIE5vdGU6IFRoZSBmaWVsZHMgbGFiZWxsZWQgInRlbXBvcmFyeSIgYXJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBiZWFyZXIKICAqIHRvIGF2b2lkIGNvbnN1bWluZyBwb3RlbnRpYWxseSBsaW1pdGVkIHN0YWNrIHNwYWNlIHRocm91Z2ggdGhlIHVzZSBvZgogICogbGFyZ2UgbG9jYWwgdmFyaWFibGVzIHdpdGhpbiBtdWx0aWNhc3Qgcm91dGluZXMuICBDb25jdXJyZW50IGFjY2VzcyBpcwotICogcHJldmVudGVkIHRocm91Z2ggdXNlIG9mIHRoZSBzcGlubG9jayAiYmNfbG9jayIuCisgKiBwcmV2ZW50ZWQgdGhyb3VnaCB1c2Ugb2YgdGhlIHNwaW5sb2NrICJiY2xpbmtfbG9jayIuCiAgKi8KIHN0cnVjdCB0aXBjX2JjYmVhcmVyIHsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgYmVhcmVyOwpAQCAtODQsMzQgKzg0LDY0IEBACiAKIC8qKgogICogc3RydWN0IHRpcGNfYmNsaW5rIC0gbGluayB1c2VkIGZvciBicm9hZGNhc3QgbWVzc2FnZXMKKyAqIEBsb2NrOiBzcGlubG9jayBnb3Zlcm5pbmcgYWNjZXNzIHRvIHN0cnVjdHVyZQogICogQGxpbms6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBsaW5rIHN0cnVjdHVyZQogICogQG5vZGU6IChub24tc3RhbmRhcmQpIG5vZGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyBiJ2Nhc3QgbGluaydzIHBlZXIgbm9kZQorICogQGZsYWdzOiByZXByZXNlbnQgYmNsaW5rIHN0YXRlcwogICogQGJjYXN0X25vZGVzOiBtYXAgb2YgYnJvYWRjYXN0LWNhcGFibGUgbm9kZXMKICAqIEByZXRyYW5zbWl0X3RvOiBub2RlIHRoYXQgbW9zdCByZWNlbnRseSByZXF1ZXN0ZWQgYSByZXRyYW5zbWl0CiAgKgogICogSGFuZGxlcyBzZXF1ZW5jZSBudW1iZXJpbmcsIGZyYWdtZW50YXRpb24sIGJ1bmRsaW5nLCBldGMuCiAgKi8KIHN0cnVjdCB0aXBjX2JjbGluayB7CisJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCB0aXBjX2xpbmsgbGluazsKIAlzdHJ1Y3QgdGlwY19ub2RlIG5vZGU7CisJdW5zaWduZWQgaW50IGZsYWdzOwogCXN0cnVjdCB0aXBjX25vZGVfbWFwIGJjYXN0X25vZGVzOwogCXN0cnVjdCB0aXBjX25vZGUgKnJldHJhbnNtaXRfdG87CiB9OwogCi1zdGF0aWMgc3RydWN0IHRpcGNfYmNiZWFyZXIgYmNhc3RfYmVhcmVyOwotc3RhdGljIHN0cnVjdCB0aXBjX2JjbGluayBiY2FzdF9saW5rOwotCi1zdGF0aWMgc3RydWN0IHRpcGNfYmNiZWFyZXIgKmJjYmVhcmVyID0gJmJjYXN0X2JlYXJlcjsKLXN0YXRpYyBzdHJ1Y3QgdGlwY19iY2xpbmsgKmJjbGluayA9ICZiY2FzdF9saW5rOwotc3RhdGljIHN0cnVjdCB0aXBjX2xpbmsgKmJjbCA9ICZiY2FzdF9saW5rLmxpbms7Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmNfbG9jayk7CitzdGF0aWMgc3RydWN0IHRpcGNfYmNiZWFyZXIgKmJjYmVhcmVyOworc3RhdGljIHN0cnVjdCB0aXBjX2JjbGluayAqYmNsaW5rOworc3RhdGljIHN0cnVjdCB0aXBjX2xpbmsgKmJjbDsKIAogY29uc3QgY2hhciB0aXBjX2JjbGlua19uYW1lW10gPSAiYnJvYWRjYXN0LWxpbmsiOwogCiBzdGF0aWMgdm9pZCB0aXBjX25tYXBfZGlmZihzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fYSwKIAkJCSAgIHN0cnVjdCB0aXBjX25vZGVfbWFwICpubV9iLAogCQkJICAgc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX2RpZmYpOworc3RhdGljIHZvaWQgdGlwY19ubWFwX2FkZChzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSk7CitzdGF0aWMgdm9pZCB0aXBjX25tYXBfcmVtb3ZlKHN0cnVjdCB0aXBjX25vZGVfbWFwICpubV9wdHIsIHUzMiBub2RlKTsKKworc3RhdGljIHZvaWQgdGlwY19iY2xpbmtfbG9jayh2b2lkKQoreworCXNwaW5fbG9ja19iaCgmYmNsaW5rLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdGlwY19iY2xpbmtfdW5sb2NrKHZvaWQpCit7CisJc3RydWN0IHRpcGNfbm9kZSAqbm9kZSA9IE5VTEw7CisKKwlpZiAobGlrZWx5KCFiY2xpbmstPmZsYWdzKSkgeworCQlzcGluX3VubG9ja19iaCgmYmNsaW5rLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiY2xpbmstPmZsYWdzICYgVElQQ19CQ0xJTktfUkVTRVQpIHsKKwkJYmNsaW5rLT5mbGFncyAmPSB+VElQQ19CQ0xJTktfUkVTRVQ7CisJCW5vZGUgPSB0aXBjX2JjbGlua19yZXRyYW5zbWl0X3RvKCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiY2xpbmstPmxvY2spOworCisJaWYgKG5vZGUpCisJCXRpcGNfbGlua19yZXNldF9hbGwobm9kZSk7Cit9CisKK3ZvaWQgdGlwY19iY2xpbmtfc2V0X2ZsYWdzKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwliY2xpbmstPmZsYWdzIHw9IGZsYWdzOworfQogCiBzdGF0aWMgdTMyIGJjYnVmX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKQEAgLTEzMCwxNiArMTYwLDE2IEBACiAKIHZvaWQgdGlwY19iY2xpbmtfYWRkX25vZGUodTMyIGFkZHIpCiB7Ci0Jc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua19sb2NrKCk7CiAJdGlwY19ubWFwX2FkZCgmYmNsaW5rLT5iY2FzdF9ub2RlcywgYWRkcik7Ci0Jc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX3VubG9jaygpOwogfQogCiB2b2lkIHRpcGNfYmNsaW5rX3JlbW92ZV9ub2RlKHUzMiBhZGRyKQogewotCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJdGlwY19iY2xpbmtfbG9jaygpOwogCXRpcGNfbm1hcF9yZW1vdmUoJmJjbGluay0+YmNhc3Rfbm9kZXMsIGFkZHIpOwotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIH0KIAogc3RhdGljIHZvaWQgYmNsaW5rX3NldF9sYXN0X3NlbnQodm9pZCkKQEAgLTE2NSw3ICsxOTUsNyBAQAogLyoqCiAgKiB0aXBjX2JjbGlua19yZXRyYW5zbWl0X3RvIC0gZ2V0IG1vc3QgcmVjZW50IG5vZGUgdG8gcmVxdWVzdCByZXRyYW5zbWlzc2lvbgogICoKLSAqIENhbGxlZCB3aXRoIGJjX2xvY2sgbG9ja2VkCisgKiBDYWxsZWQgd2l0aCBiY2xpbmtfbG9jayBsb2NrZWQKICAqLwogc3RydWN0IHRpcGNfbm9kZSAqdGlwY19iY2xpbmtfcmV0cmFuc21pdF90byh2b2lkKQogewpAQCAtMTc3LDcgKzIwNyw3IEBACiAgKiBAYWZ0ZXI6IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byAqbm90KiByZXRyYW5zbWl0CiAgKiBAdG86IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byByZXRyYW5zbWl0CiAgKgotICogQ2FsbGVkIHdpdGggYmNfbG9jayBsb2NrZWQKKyAqIENhbGxlZCB3aXRoIGJjbGlua19sb2NrIGxvY2tlZAogICovCiBzdGF0aWMgdm9pZCBiY2xpbmtfcmV0cmFuc21pdF9wa3QodTMyIGFmdGVyLCB1MzIgdG8pCiB7CkBAIC0xOTQsNyArMjI0LDcgQEAKICAqIEBuX3B0cjogbm9kZSB0aGF0IHNlbnQgYWNrbm93bGVkZ2VtZW50IGluZm8KICAqIEBhY2tlZDogYnJvYWRjYXN0IHNlcXVlbmNlICMgdGhhdCBoYXMgYmVlbiBhY2tub3dsZWRnZWQKICAqCi0gKiBOb2RlIGlzIGxvY2tlZCwgYmNfbG9jayB1bmxvY2tlZC4KKyAqIE5vZGUgaXMgbG9ja2VkLCBiY2xpbmtfbG9jayB1bmxvY2tlZC4KICAqLwogdm9pZCB0aXBjX2JjbGlua19hY2tub3dsZWRnZShzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgdTMyIGFja2VkKQogewpAQCAtMjAyLDggKzIzMiw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKm5leHQ7CiAJdW5zaWduZWQgaW50IHJlbGVhc2VkID0gMDsKIAotCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7Ci0KKwl0aXBjX2JjbGlua19sb2NrKCk7CiAJLyogQmFpbCBvdXQgaWYgdHggcXVldWUgaXMgZW1wdHkgKG5vIGNsZWFuIHVwIGlzIHJlcXVpcmVkKSAqLwogCWNycyA9IGJjbC0+Zmlyc3Rfb3V0OwogCWlmICghY3JzKQpAQCAtMjY3LDEzICsyOTYsMTMgQEAKIAlpZiAodW5saWtlbHkocmVsZWFzZWQgJiYgIWxpc3RfZW1wdHkoJmJjbC0+d2FpdGluZ19wb3J0cykpKQogCQl0aXBjX2xpbmtfd2FrZXVwX3BvcnRzKGJjbCwgMCk7CiBleGl0OgotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIH0KIAogLyoqCiAgKiB0aXBjX2JjbGlua191cGRhdGVfbGlua19zdGF0ZSAtIHVwZGF0ZSBicm9hZGNhc3QgbGluayBzdGF0ZQogICoKLSAqIHRpcGNfbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqIFJDVSBhbmQgbm9kZSBsb2NrIHNldAogICovCiB2b2lkIHRpcGNfYmNsaW5rX3VwZGF0ZV9saW5rX3N0YXRlKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCB1MzIgbGFzdF9zZW50KQogewpAQCAtMzIwLDEwICszNDksMTAgQEAKIAkJCQkgPyBidWZfc2Vxbm8obl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkKSAtIDEKIAkJCQkgOiBuX3B0ci0+YmNsaW5rLmxhc3Rfc2VudCk7CiAKLQkJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKLQkJdGlwY19iZWFyZXJfc2VuZCgmYmNiZWFyZXItPmJlYXJlciwgYnVmLCBOVUxMKTsKKwkJdGlwY19iY2xpbmtfbG9jaygpOworCQl0aXBjX2JlYXJlcl9zZW5kKE1BWF9CRUFSRVJTLCBidWYsIE5VTEwpOwogCQliY2wtPnN0YXRzLnNlbnRfbmFja3MrKzsKLQkJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCQl0aXBjX2JjbGlua191bmxvY2soKTsKIAkJa2ZyZWVfc2tiKGJ1Zik7CiAKIAkJbl9wdHItPmJjbGluay5vb3Nfc3RhdGUrKzsKQEAgLTMzNSw4ICszNjQsNiBAQAogICoKICAqIERlbGF5IGFueSB1cGNvbWluZyBOQUNLIGJ5IHRoaXMgbm9kZSBpZiBhbm90aGVyIG5vZGUgaGFzIGFscmVhZHkKICAqIHJlcXVlc3RlZCB0aGUgZmlyc3QgbWVzc2FnZSB0aGlzIG5vZGUgaXMgZ29pbmcgdG8gYXNrIGZvci4KLSAqCi0gKiBPbmx5IHRpcGNfbmV0X2xvY2sgc2V0LgogICovCiBzdGF0aWMgdm9pZCBiY2xpbmtfcGVla19uYWNrKHN0cnVjdCB0aXBjX21zZyAqbXNnKQogewpAQCAtMzYyLDcgKzM4OSw3IEBACiB7CiAJaW50IHJlczsKIAotCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJdGlwY19iY2xpbmtfbG9jaygpOwogCiAJaWYgKCFiY2xpbmstPmJjYXN0X25vZGVzLmNvdW50KSB7CiAJCXJlcyA9IG1zZ19kYXRhX3N6KGJ1Zl9tc2coYnVmKSk7CkBAIC0zNzcsMTQgKzQwNCwxNCBAQAogCQliY2wtPnN0YXRzLmFjY3VfcXVldWVfc3ogKz0gYmNsLT5vdXRfcXVldWVfc2l6ZTsKIAl9CiBleGl0OgotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIAlyZXR1cm4gcmVzOwogfQogCiAvKioKICAqIGJjbGlua19hY2NlcHRfcGt0IC0gYWNjZXB0IGFuIGluY29taW5nLCBpbi1zZXF1ZW5jZSBicm9hZGNhc3QgcGFja2V0CiAgKgotICogQ2FsbGVkIHdpdGggYm90aCBzZW5kaW5nIG5vZGUncyBsb2NrIGFuZCBiY19sb2NrIHRha2VuLgorICogQ2FsbGVkIHdpdGggYm90aCBzZW5kaW5nIG5vZGUncyBsb2NrIGFuZCBiY2xpbmtfbG9jayB0YWtlbi4KICAqLwogc3RhdGljIHZvaWQgYmNsaW5rX2FjY2VwdF9wa3Qoc3RydWN0IHRpcGNfbm9kZSAqbm9kZSwgdTMyIHNlcW5vKQogewpAQCAtNDA4LDcgKzQzNSw3IEBACiAvKioKICAqIHRpcGNfYmNsaW5rX3JjdiAtIHJlY2VpdmUgYSBicm9hZGNhc3QgcGFja2V0LCBhbmQgZGVsaXZlciB1cHdhcmRzCiAgKgotICogdGlwY19uZXRfbG9jayBpcyByZWFkX2xvY2tlZCwgbm8gb3RoZXIgbG9ja3Mgc2V0CisgKiBSQ1UgaXMgbG9ja2VkLCBubyBvdGhlciBsb2NrcyBzZXQKICAqLwogdm9pZCB0aXBjX2JjbGlua19yY3Yoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKQEAgLTQzOSwxMiArNDY2LDEyIEBACiAJCWlmIChtc2dfZGVzdG5vZGUobXNnKSA9PSB0aXBjX293bl9hZGRyKSB7CiAJCQl0aXBjX2JjbGlua19hY2tub3dsZWRnZShub2RlLCBtc2dfYmNhc3RfYWNrKG1zZykpOwogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKLQkJCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJCQl0aXBjX2JjbGlua19sb2NrKCk7CiAJCQliY2wtPnN0YXRzLnJlY3ZfbmFja3MrKzsKIAkJCWJjbGluay0+cmV0cmFuc21pdF90byA9IG5vZGU7CiAJCQliY2xpbmtfcmV0cmFuc21pdF9wa3QobXNnX2JjZ2FwX2FmdGVyKG1zZyksCiAJCQkJCSAgICAgIG1zZ19iY2dhcF90byhtc2cpKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQl9IGVsc2UgewogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJCWJjbGlua19wZWVrX25hY2sobXNnKTsKQEAgLTQ2Miw1MSArNDg5LDQ3IEBACiAJCS8qIERlbGl2ZXIgbWVzc2FnZSB0byBkZXN0aW5hdGlvbiAqLwogCiAJCWlmIChsaWtlbHkobXNnX2lzZGF0YShtc2cpKSkgewotCQkJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX2xvY2soKTsKIAkJCWJjbGlua19hY2NlcHRfcGt0KG5vZGUsIHNlcW5vKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJCWlmIChsaWtlbHkobXNnX21jYXN0KG1zZykpKQogCQkJCXRpcGNfcG9ydF9tY2FzdF9yY3YoYnVmLCBOVUxMKTsKIAkJCWVsc2UKIAkJCQlrZnJlZV9za2IoYnVmKTsKIAkJfSBlbHNlIGlmIChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKSB7Ci0JCQlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCQkJdGlwY19iY2xpbmtfbG9jaygpOwogCQkJYmNsaW5rX2FjY2VwdF9wa3Qobm9kZSwgc2Vxbm8pOwogCQkJYmNsLT5zdGF0cy5yZWN2X2J1bmRsZXMrKzsKIAkJCWJjbC0+c3RhdHMucmVjdl9idW5kbGVkICs9IG1zZ19tc2djbnQobXNnKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJCXRpcGNfbGlua19idW5kbGVfcmN2KGJ1Zik7CiAJCX0gZWxzZSBpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfRlJBR01FTlRFUikgewotCQkJaW50IHJldDsKLQkJCXJldCA9IHRpcGNfbGlua19mcmFnX3Jjdigmbm9kZS0+YmNsaW5rLnJlYXNtX2hlYWQsCi0JCQkJCQkgJm5vZGUtPmJjbGluay5yZWFzbV90YWlsLAotCQkJCQkJICZidWYpOwotCQkJaWYgKHJldCA9PSBMSU5LX1JFQVNNX0VSUk9SKQorCQkJdGlwY19idWZfYXBwZW5kKCZub2RlLT5iY2xpbmsucmVhc21fYnVmLCAmYnVmKTsKKwkJCWlmICh1bmxpa2VseSghYnVmICYmICFub2RlLT5iY2xpbmsucmVhc21fYnVmKSkKIAkJCQlnb3RvIHVubG9jazsKLQkJCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJCQl0aXBjX2JjbGlua19sb2NrKCk7CiAJCQliY2xpbmtfYWNjZXB0X3BrdChub2RlLCBzZXFubyk7CiAJCQliY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRzKys7Ci0JCQlpZiAocmV0ID09IExJTktfUkVBU01fQ09NUExFVEUpIHsKKwkJCWlmIChidWYpIHsKIAkJCQliY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRlZCsrOwotCQkJCS8qIFBvaW50IG1zZyB0byBpbm5lciBoZWFkZXIgKi8KIAkJCQltc2cgPSBidWZfbXNnKGJ1Zik7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCQkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQkJCWdvdG8gcmVjZWl2ZTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJfSBlbHNlIGlmIChtc2dfdXNlcihtc2cpID09IE5BTUVfRElTVFJJQlVUT1IpIHsKLQkJCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJCQl0aXBjX2JjbGlua19sb2NrKCk7CiAJCQliY2xpbmtfYWNjZXB0X3BrdChub2RlLCBzZXFubyk7Ci0JCQlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJCQl0aXBjX2JjbGlua191bmxvY2soKTsKIAkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CiAJCQl0aXBjX25hbWVkX3JjdihidWYpOwogCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX2xvY2soKTsKIAkJCWJjbGlua19hY2NlcHRfcGt0KG5vZGUsIHNlcW5vKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwkJCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJCWtmcmVlX3NrYihidWYpOwogCQl9CkBAIC01NTIsMTQgKzU3NSwxNCBAQAogCX0gZWxzZQogCQlkZWZlcnJlZCA9IDA7CiAKLQlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX2xvY2soKTsKIAogCWlmIChkZWZlcnJlZCkKIAkJYmNsLT5zdGF0cy5kZWZlcnJlZF9yZWN2Kys7CiAJZWxzZQogCQliY2wtPnN0YXRzLmR1cGxpY2F0ZXMrKzsKIAotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIAogdW5sb2NrOgogCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CkBAIC02MjcsMTMgKzY1MCwxMyBAQAogCiAJCWlmIChicF9pbmRleCA9PSAwKSB7CiAJCQkvKiBVc2Ugb3JpZ2luYWwgYnVmZmVyIGZvciBmaXJzdCBiZWFyZXIgKi8KLQkJCXRpcGNfYmVhcmVyX3NlbmQoYiwgYnVmLCAmYi0+YmNhc3RfYWRkcik7CisJCQl0aXBjX2JlYXJlcl9zZW5kKGItPmlkZW50aXR5LCBidWYsICZiLT5iY2FzdF9hZGRyKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEF2b2lkIGNvbmN1cnJlbnQgYnVmZmVyIGFjY2VzcyAqLwotCQkJdGJ1ZiA9IHBza2JfY29weShidWYsIEdGUF9BVE9NSUMpOworCQkJdGJ1ZiA9IHBza2JfY29weV9mb3JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghdGJ1ZikKIAkJCQlicmVhazsKLQkJCXRpcGNfYmVhcmVyX3NlbmQoYiwgdGJ1ZiwgJmItPmJjYXN0X2FkZHIpOworCQkJdGlwY19iZWFyZXJfc2VuZChiLT5pZGVudGl0eSwgdGJ1ZiwgJmItPmJjYXN0X2FkZHIpOwogCQkJa2ZyZWVfc2tiKHRidWYpOyAvKiBCZWFyZXIga2VlcHMgYSBjbG9uZSAqLwogCQl9CiAKQEAgLTY1NSwyMCArNjc4LDI3IEBACiAvKioKICAqIHRpcGNfYmNiZWFyZXJfc29ydCAtIGNyZWF0ZSBzZXRzIG9mIGJlYXJlciBwYWlycyB1c2VkIGJ5IGJyb2FkY2FzdCBiZWFyZXIKICAqLwotdm9pZCB0aXBjX2JjYmVhcmVyX3NvcnQodm9pZCkKK3ZvaWQgdGlwY19iY2JlYXJlcl9zb3J0KHN0cnVjdCB0aXBjX25vZGVfbWFwICpubV9wdHIsIHUzMiBub2RlLCBib29sIGFjdGlvbikKIHsKIAlzdHJ1Y3QgdGlwY19iY2JlYXJlcl9wYWlyICpicF90ZW1wID0gYmNiZWFyZXItPmJwYWlyc190ZW1wOwogCXN0cnVjdCB0aXBjX2JjYmVhcmVyX3BhaXIgKmJwX2N1cnI7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCWludCBiX2luZGV4OwogCWludCBwcmk7CiAKLQlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX2xvY2soKTsKKworCWlmIChhY3Rpb24pCisJCXRpcGNfbm1hcF9hZGQobm1fcHRyLCBub2RlKTsKKwllbHNlCisJCXRpcGNfbm1hcF9yZW1vdmUobm1fcHRyLCBub2RlKTsKIAogCS8qIEdyb3VwIGJlYXJlcnMgYnkgcHJpb3JpdHkgKGNhbiBhc3N1bWUgbWF4IG9mIHR3byBwZXIgcHJpb3JpdHkpICovCiAJbWVtc2V0KGJwX3RlbXAsIDAsIHNpemVvZihiY2JlYXJlci0+YnBhaXJzX3RlbXApKTsKIAorCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGJfaW5kZXggPSAwOyBiX2luZGV4IDwgTUFYX0JFQVJFUlM7IGJfaW5kZXgrKykgewotCQlzdHJ1Y3QgdGlwY19iZWFyZXIgKmIgPSBiZWFyZXJfbGlzdFtiX2luZGV4XTsKKwkJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGJlYXJlcl9saXN0W2JfaW5kZXhdKTsKIAkJaWYgKCFiIHx8ICFiLT5ub2Rlcy5jb3VudCkKIAkJCWNvbnRpbnVlOwogCkBAIC02NzcsNiArNzA3LDcgQEAKIAkJZWxzZQogCQkJYnBfdGVtcFtiLT5wcmlvcml0eV0uc2Vjb25kYXJ5ID0gYjsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBDcmVhdGUgYXJyYXkgb2YgYmVhcmVyIHBhaXJzIGZvciBicm9hZGNhc3RpbmcgKi8KIAlicF9jdXJyID0gYmNiZWFyZXItPmJwYWlyczsKQEAgLTcwMiw3ICs3MzMsNyBAQAogCQlicF9jdXJyKys7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX3VubG9jaygpOwogfQogCiAKQEAgLTcxNCw3ICs3NDUsNyBAQAogCWlmICghYmNsKQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJdGlwY19iY2xpbmtfbG9jaygpOwogCiAJcyA9ICZiY2wtPnN0YXRzOwogCkBAIC03NDMsNyArNzc0LDcgQEAKIAkJCSAgICAgcy0+cXVldWVfc3pfY291bnRzID8KIAkJCSAgICAgKHMtPmFjY3VfcXVldWVfc3ogLyBzLT5xdWV1ZV9zel9jb3VudHMpIDogMCk7CiAKLQlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJdGlwY19iY2xpbmtfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzUyLDkgKzc4Myw5IEBACiAJaWYgKCFiY2wpCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKLQlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX2xvY2soKTsKIAltZW1zZXQoJmJjbC0+c3RhdHMsIDAsIHNpemVvZihiY2wtPnN0YXRzKSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfYmNsaW5rX3VubG9jaygpOwogCXJldHVybiAwOwogfQogCkBAIC03NjUsNDYgKzc5Niw1OSBAQAogCWlmICgobGltaXQgPCBUSVBDX01JTl9MSU5LX1dJTikgfHwgKGxpbWl0ID4gVElQQ19NQVhfTElOS19XSU4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJdGlwY19iY2xpbmtfbG9jaygpOwogCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGJjbCwgbGltaXQpOwotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB0aXBjX2JjbGlua19pbml0KHZvaWQpCitpbnQgdGlwY19iY2xpbmtfaW5pdCh2b2lkKQogeworCWJjYmVhcmVyID0ga3phbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFiY2JlYXJlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliY2xpbmsgPSBremFsbG9jKHNpemVvZigqYmNsaW5rKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFiY2xpbmspIHsKKwkJa2ZyZWUoYmNiZWFyZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliY2wgPSAmYmNsaW5rLT5saW5rOwogCWJjYmVhcmVyLT5iZWFyZXIubWVkaWEgPSAmYmNiZWFyZXItPm1lZGlhOwogCWJjYmVhcmVyLT5tZWRpYS5zZW5kX21zZyA9IHRpcGNfYmNiZWFyZXJfc2VuZDsKIAlzcHJpbnRmKGJjYmVhcmVyLT5tZWRpYS5uYW1lLCAidGlwYy1icm9hZGNhc3QiKTsKIAorCXNwaW5fbG9ja19pbml0KCZiY2xpbmstPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZiY2wtPndhaXRpbmdfcG9ydHMpOwogCWJjbC0+bmV4dF9vdXRfbm8gPSAxOwogCXNwaW5fbG9ja19pbml0KCZiY2xpbmstPm5vZGUubG9jayk7CiAJYmNsLT5vd25lciA9ICZiY2xpbmstPm5vZGU7CiAJYmNsLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUX01DQVNUOwogCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGJjbCwgQkNMSU5LX1dJTl9ERUZBVUxUKTsKLQliY2wtPmJfcHRyID0gJmJjYmVhcmVyLT5iZWFyZXI7Ci0JYmVhcmVyX2xpc3RbQkNCRUFSRVJdID0gJmJjYmVhcmVyLT5iZWFyZXI7CisJYmNsLT5iZWFyZXJfaWQgPSBNQVhfQkVBUkVSUzsKKwlyY3VfYXNzaWduX3BvaW50ZXIoYmVhcmVyX2xpc3RbTUFYX0JFQVJFUlNdLCAmYmNiZWFyZXItPmJlYXJlcik7CiAJYmNsLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKIAlzdHJsY3B5KGJjbC0+bmFtZSwgdGlwY19iY2xpbmtfbmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCB0aXBjX2JjbGlua19zdG9wKHZvaWQpCiB7Ci0Jc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua19sb2NrKCk7CiAJdGlwY19saW5rX3B1cmdlX3F1ZXVlcyhiY2wpOwotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwl0aXBjX2JjbGlua191bmxvY2soKTsKIAotCWJlYXJlcl9saXN0W0JDQkVBUkVSXSA9IE5VTEw7Ci0JbWVtc2V0KGJjbGluaywgMCwgc2l6ZW9mKCpiY2xpbmspKTsKLQltZW1zZXQoYmNiZWFyZXIsIDAsIHNpemVvZigqYmNiZWFyZXIpKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGJlYXJlcl9saXN0W0JDQkVBUkVSXSwgTlVMTCk7CisJc3luY2hyb25pemVfbmV0KCk7CisJa2ZyZWUoYmNiZWFyZXIpOworCWtmcmVlKGJjbGluayk7CiB9CiAKLQogLyoqCiAgKiB0aXBjX25tYXBfYWRkIC0gYWRkIGEgbm9kZSB0byBhIG5vZGUgbWFwCiAgKi8KLXZvaWQgdGlwY19ubWFwX2FkZChzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSkKK3N0YXRpYyB2b2lkIHRpcGNfbm1hcF9hZGQoc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCiB7CiAJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CiAJaW50IHcgPSBuIC8gV1NJWkU7CkBAIC04MTksNyArODYzLDcgQEAKIC8qKgogICogdGlwY19ubWFwX3JlbW92ZSAtIHJlbW92ZSBhIG5vZGUgZnJvbSBhIG5vZGUgbWFwCiAgKi8KLXZvaWQgdGlwY19ubWFwX3JlbW92ZShzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSkKK3N0YXRpYyB2b2lkIHRpcGNfbm1hcF9yZW1vdmUoc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCiB7CiAJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CiAJaW50IHcgPSBuIC8gV1NJWkU7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5oIGIvbmV0L3RpcGMvYmNhc3QuaAppbmRleCBhODBlZjU0Li4wMDMzMGM0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5oCisrKyBiL25ldC90aXBjL2JjYXN0LmgKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2RlZmluZSBNQVhfTk9ERVMgNDA5NgogI2RlZmluZSBXU0laRSAzMgorI2RlZmluZSBUSVBDX0JDTElOS19SRVNFVCAxCiAKIC8qKgogICogc3RydWN0IHRpcGNfbm9kZV9tYXAgLSBzZXQgb2Ygbm9kZSBpZGVudGlmaWVycwpAQCAtNjksOSArNzAsNiBAQAogCiBleHRlcm4gY29uc3QgY2hhciB0aXBjX2JjbGlua19uYW1lW107CiAKLXZvaWQgdGlwY19ubWFwX2FkZChzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSk7Ci12b2lkIHRpcGNfbm1hcF9yZW1vdmUoc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpOwotCiAvKioKICAqIHRpcGNfbm1hcF9lcXVhbCAtIHRlc3QgZm9yIGVxdWFsaXR5IG9mIG5vZGUgbWFwcwogICovCkBAIC04NCw4ICs4Miw5IEBACiB2b2lkIHRpcGNfcG9ydF9saXN0X2FkZChzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKnBsX3B0ciwgdTMyIHBvcnQpOwogdm9pZCB0aXBjX3BvcnRfbGlzdF9mcmVlKHN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqcGxfcHRyKTsKIAotdm9pZCB0aXBjX2JjbGlua19pbml0KHZvaWQpOworaW50IHRpcGNfYmNsaW5rX2luaXQodm9pZCk7CiB2b2lkIHRpcGNfYmNsaW5rX3N0b3Aodm9pZCk7Cit2b2lkIHRpcGNfYmNsaW5rX3NldF9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpOwogdm9pZCB0aXBjX2JjbGlua19hZGRfbm9kZSh1MzIgYWRkcik7CiB2b2lkIHRpcGNfYmNsaW5rX3JlbW92ZV9ub2RlKHUzMiBhZGRyKTsKIHN0cnVjdCB0aXBjX25vZGUgKnRpcGNfYmNsaW5rX3JldHJhbnNtaXRfdG8odm9pZCk7CkBAIC05OCw2ICs5Nyw2IEBACiBpbnQgIHRpcGNfYmNsaW5rX3N0YXRzKGNoYXIgKnN0YXRzX2J1ZiwgY29uc3QgdTMyIGJ1Zl9zaXplKTsKIGludCAgdGlwY19iY2xpbmtfcmVzZXRfc3RhdHModm9pZCk7CiBpbnQgIHRpcGNfYmNsaW5rX3NldF9xdWV1ZV9saW1pdHModTMyIGxpbWl0KTsKLXZvaWQgdGlwY19iY2JlYXJlcl9zb3J0KHZvaWQpOwordm9pZCB0aXBjX2JjYmVhcmVyX3NvcnQoc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUsIGJvb2wgYWN0aW9uKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IDNmZWY3ZWIuLjI2NDQ3NDMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC00OSw3ICs0OSw3IEBACiAJTlVMTAogfTsKIAotc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXJfbGlzdFtNQVhfQkVBUkVSUyArIDFdOworc3RydWN0IHRpcGNfYmVhcmVyIF9fcmN1ICpiZWFyZXJfbGlzdFtNQVhfQkVBUkVSUyArIDFdOwogCiBzdGF0aWMgdm9pZCBiZWFyZXJfZGlzYWJsZShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBib29sIHNodXR0aW5nX2Rvd24pOwogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAl1MzIgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7Ci0JCWJfcHRyID0gYmVhcmVyX2xpc3RbaV07CisJCWJfcHRyID0gcnRubF9kZXJlZmVyZW5jZShiZWFyZXJfbGlzdFtpXSk7CiAJCWlmIChiX3B0ciAmJiAoIXN0cmNtcChiX3B0ci0+bmFtZSwgbmFtZSkpKQogCQkJcmV0dXJuIGJfcHRyOwogCX0KQEAgLTE5OCwxMCArMTk4LDkgQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCWZvciAoaSA9IDA7IG1lZGlhX2luZm9fYXJyYXlbaV0gIT0gTlVMTDsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBNQVhfQkVBUkVSUzsgaisrKSB7Ci0JCQliID0gYmVhcmVyX2xpc3Rbal07CisJCQliID0gcnRubF9kZXJlZmVyZW5jZShiZWFyZXJfbGlzdFtqXSk7CiAJCQlpZiAoIWIpCiAJCQkJY29udGludWU7CiAJCQlpZiAoYi0+bWVkaWEgPT0gbWVkaWFfaW5mb19hcnJheVtpXSkgewpAQCAtMjExLDIyICsyMTAsMzMgQEAKIAkJCX0KIAkJfQogCX0KLQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJcmV0dXJuIGJ1ZjsKIH0KIAotdm9pZCB0aXBjX2JlYXJlcl9hZGRfZGVzdChzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCkKK3ZvaWQgdGlwY19iZWFyZXJfYWRkX2Rlc3QodTMyIGJlYXJlcl9pZCwgdTMyIGRlc3QpCiB7Ci0JdGlwY19ubWFwX2FkZCgmYl9wdHItPm5vZGVzLCBkZXN0KTsKLQl0aXBjX2JjYmVhcmVyX3NvcnQoKTsKLQl0aXBjX2Rpc2NfYWRkX2Rlc3QoYl9wdHItPmxpbmtfcmVxKTsKKwlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyOworCisJcmN1X3JlYWRfbG9jaygpOworCWJfcHRyID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYmVhcmVyX2xpc3RbYmVhcmVyX2lkXSk7CisJaWYgKGJfcHRyKSB7CisJCXRpcGNfYmNiZWFyZXJfc29ydCgmYl9wdHItPm5vZGVzLCBkZXN0LCB0cnVlKTsKKwkJdGlwY19kaXNjX2FkZF9kZXN0KGJfcHRyLT5saW5rX3JlcSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi12b2lkIHRpcGNfYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHUzMiBkZXN0KQordm9pZCB0aXBjX2JlYXJlcl9yZW1vdmVfZGVzdCh1MzIgYmVhcmVyX2lkLCB1MzIgZGVzdCkKIHsKLQl0aXBjX25tYXBfcmVtb3ZlKCZiX3B0ci0+bm9kZXMsIGRlc3QpOwotCXRpcGNfYmNiZWFyZXJfc29ydCgpOwotCXRpcGNfZGlzY19yZW1vdmVfZGVzdChiX3B0ci0+bGlua19yZXEpOworCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJYl9wdHIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiZWFyZXJfbGlzdFtiZWFyZXJfaWRdKTsKKwlpZiAoYl9wdHIpIHsKKwkJdGlwY19iY2JlYXJlcl9zb3J0KCZiX3B0ci0+bm9kZXMsIGRlc3QsIGZhbHNlKTsKKwkJdGlwY19kaXNjX3JlbW92ZV9kZXN0KGJfcHRyLT5saW5rX3JlcSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKioKQEAgLTI3MSwxMyArMjgxLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXdyaXRlX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCiAJbV9wdHIgPSB0aXBjX21lZGlhX2ZpbmQoYl9uYW1lcy5tZWRpYV9uYW1lKTsKIAlpZiAoIW1fcHRyKSB7CiAJCXByX3dhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBtZWRpYSA8JXM+IG5vdCByZWdpc3RlcmVkXG4iLAogCQkJbmFtZSwgYl9uYW1lcy5tZWRpYV9uYW1lKTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocHJpb3JpdHkgPT0gVElQQ19NRURJQV9MSU5LX1BSSSkKQEAgLTI4Nyw3ICsyOTUsNyBAQAogCWJlYXJlcl9pZCA9IE1BWF9CRUFSRVJTOwogCXdpdGhfdGhpc19wcmlvID0gMTsKIAlmb3IgKGkgPSBNQVhfQkVBUkVSUzsgaS0tICE9IDA7ICkgewotCQliX3B0ciA9IGJlYXJlcl9saXN0W2ldOworCQliX3B0ciA9IHJ0bmxfZGVyZWZlcmVuY2UoYmVhcmVyX2xpc3RbaV0pOwogCQlpZiAoIWJfcHRyKSB7CiAJCQliZWFyZXJfaWQgPSBpOwogCQkJY29udGludWU7CkBAIC0yOTUsMTQgKzMwMywxNCBAQAogCQlpZiAoIXN0cmNtcChuYW1lLCBiX3B0ci0+bmFtZSkpIHsKIAkJCXByX3dhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBhbHJlYWR5IGVuYWJsZWRcbiIsCiAJCQkJbmFtZSk7Ci0JCQlnb3RvIGV4aXQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoKGJfcHRyLT5wcmlvcml0eSA9PSBwcmlvcml0eSkgJiYKIAkJICAgICgrK3dpdGhfdGhpc19wcmlvID4gMikpIHsKIAkJCWlmIChwcmlvcml0eS0tID09IDApIHsKIAkJCQlwcl93YXJuKCJCZWFyZXIgPCVzPiByZWplY3RlZCwgZHVwbGljYXRlIHByaW9yaXR5XG4iLAogCQkJCQluYW1lKTsKLQkJCQlnb3RvIGV4aXQ7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlwcl93YXJuKCJCZWFyZXIgPCVzPiBwcmlvcml0eSBhZGp1c3RtZW50IHJlcXVpcmVkICV1LT4ldVxuIiwKIAkJCQluYW1lLCBwcmlvcml0eSArIDEsIHByaW9yaXR5KTsKQEAgLTMxMiwyMSArMzIwLDIwIEBACiAJaWYgKGJlYXJlcl9pZCA+PSBNQVhfQkVBUkVSUykgewogCQlwcl93YXJuKCJCZWFyZXIgPCVzPiByZWplY3RlZCwgYmVhcmVyIGxpbWl0IHJlYWNoZWQgKCV1KVxuIiwKIAkJCW5hbWUsIE1BWF9CRUFSRVJTKTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAliX3B0ciA9IGt6YWxsb2Moc2l6ZW9mKCpiX3B0ciksIEdGUF9BVE9NSUMpOwotCWlmICghYl9wdHIpIHsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KKwlpZiAoIWJfcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXN0cmNweShiX3B0ci0+bmFtZSwgbmFtZSk7CiAJYl9wdHItPm1lZGlhID0gbV9wdHI7CiAJcmVzID0gbV9wdHItPmVuYWJsZV9tZWRpYShiX3B0cik7CiAJaWYgKHJlcykgewogCQlwcl93YXJuKCJCZWFyZXIgPCVzPiByZWplY3RlZCwgZW5hYmxlIGZhaWx1cmUgKCVkKVxuIiwKIAkJCW5hbWUsIC1yZXMpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWJfcHRyLT5pZGVudGl0eSA9IGJlYXJlcl9pZDsKQEAgLTM0MSwxNiArMzQ4LDE0IEBACiAJCWJlYXJlcl9kaXNhYmxlKGJfcHRyLCBmYWxzZSk7CiAJCXByX3dhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBkaXNjb3Zlcnkgb2JqZWN0IGNyZWF0aW9uIGZhaWxlZFxuIiwKIAkJCW5hbWUpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWJlYXJlcl9saXN0W2JlYXJlcl9pZF0gPSBiX3B0cjsKKwlyY3VfYXNzaWduX3BvaW50ZXIoYmVhcmVyX2xpc3RbYmVhcmVyX2lkXSwgYl9wdHIpOwogCiAJcHJfaW5mbygiRW5hYmxlZCBiZWFyZXIgPCVzPiwgZGlzY292ZXJ5IGRvbWFpbiAlcywgcHJpb3JpdHkgJXVcbiIsCiAJCW5hbWUsCiAJCXRpcGNfYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgZGlzY19kb21haW4pLCBwcmlvcml0eSk7Ci1leGl0OgotCXdyaXRlX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMzU5LDE5ICszNjQsMTYgQEAKICAqLwogc3RhdGljIGludCB0aXBjX3Jlc2V0X2JlYXJlcihzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKQogewotCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJcHJfaW5mbygiUmVzZXR0aW5nIGJlYXJlciA8JXM+XG4iLCBiX3B0ci0+bmFtZSk7Ci0JdGlwY19kaXNjX2RlbGV0ZShiX3B0ci0+bGlua19yZXEpOwogCXRpcGNfbGlua19yZXNldF9saXN0KGJfcHRyLT5pZGVudGl0eSk7Ci0JdGlwY19kaXNjX2NyZWF0ZShiX3B0ciwgJmJfcHRyLT5iY2FzdF9hZGRyKTsKLQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJdGlwY19kaXNjX3Jlc2V0KGJfcHRyKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBiZWFyZXJfZGlzYWJsZQogICoKLSAqIE5vdGU6IFRoaXMgcm91dGluZSBhc3N1bWVzIGNhbGxlciBob2xkcyB0aXBjX25ldF9sb2NrLgorICogTm90ZTogVGhpcyByb3V0aW5lIGFzc3VtZXMgY2FsbGVyIGhvbGRzIFJUTkwgbG9jay4KICAqLwogc3RhdGljIHZvaWQgYmVhcmVyX2Rpc2FibGUoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwgYm9vbCBzaHV0dGluZ19kb3duKQogewpAQCAtMzg1LDEyICszODcsMTIgQEAKIAkJdGlwY19kaXNjX2RlbGV0ZShiX3B0ci0+bGlua19yZXEpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJaWYgKGJfcHRyID09IGJlYXJlcl9saXN0W2ldKSB7Ci0JCQliZWFyZXJfbGlzdFtpXSA9IE5VTEw7CisJCWlmIChiX3B0ciA9PSBydG5sX2RlcmVmZXJlbmNlKGJlYXJlcl9saXN0W2ldKSkgeworCQkJUkNVX0lOSVRfUE9JTlRFUihiZWFyZXJfbGlzdFtpXSwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQogCX0KLQlrZnJlZShiX3B0cik7CisJa2ZyZWVfcmN1KGJfcHRyLCByY3UpOwogfQogCiBpbnQgdGlwY19kaXNhYmxlX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKQpAQCAtMzk4LDcgKzQwMCw2IEBACiAJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKIAlpbnQgcmVzOwogCi0Jd3JpdGVfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJYl9wdHIgPSB0aXBjX2JlYXJlcl9maW5kKG5hbWUpOwogCWlmIChiX3B0ciA9PSBOVUxMKSB7CiAJCXByX3dhcm4oIkF0dGVtcHQgdG8gZGlzYWJsZSB1bmtub3duIGJlYXJlciA8JXM+XG4iLCBuYW1lKTsKQEAgLTQwNywzMiArNDA4LDkgQEAKIAkJYmVhcmVyX2Rpc2FibGUoYl9wdHIsIGZhbHNlKTsKIAkJcmVzID0gMDsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAlyZXR1cm4gcmVzOwogfQogCi0KLS8qIHRpcGNfbDJfbWVkaWFfYWRkcl9zZXQgLSBpbml0aWFsaXplIEV0aGVybmV0IG1lZGlhIGFkZHJlc3Mgc3RydWN0dXJlCi0gKgotICogTWVkaWEtZGVwZW5kZW50ICJ2YWx1ZSIgZmllbGQgc3RvcmVzIE1BQyBhZGRyZXNzIGluIGZpcnN0IDYgYnl0ZXMKLSAqIGFuZCB6ZXJvZXMgb3V0IHRoZSByZW1haW5pbmcgYnl0ZXMuCi0gKi8KLXZvaWQgdGlwY19sMl9tZWRpYV9hZGRyX3NldChjb25zdCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCi0JCQkgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqbWFjKQotewotCWludCBsZW4gPSBiLT5tZWRpYS0+aHdhZGRyX2xlbjsKLQotCWlmICh1bmxpa2VseShzaXplb2YoYS0+dmFsdWUpIDwgbGVuKSkgewotCQlXQVJOX09OQ0UoMSwgIk1lZGlhIGxlbmd0aCBpbnZhbGlkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbWNweShhLT52YWx1ZSwgbWFjLCBsZW4pOwotCW1lbXNldChhLT52YWx1ZSArIGxlbiwgMCwgc2l6ZW9mKGEtPnZhbHVlKSAtIGxlbik7Ci0JYS0+bWVkaWFfaWQgPSBiLT5tZWRpYS0+dHlwZV9pZDsKLQlhLT5icm9hZGNhc3QgPSAhbWVtY21wKG1hYywgYi0+YmNhc3RfYWRkci52YWx1ZSwgbGVuKTsKLX0KLQogaW50IHRpcGNfZW5hYmxlX2wyX21lZGlhKHN0cnVjdCB0aXBjX2JlYXJlciAqYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNDQzLDMzICs0MjEsMzcgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBBc3NvY2lhdGUgVElQQyBiZWFyZXIgd2l0aCBFdGhlcm5ldCBiZWFyZXIgKi8KLQliLT5tZWRpYV9wdHIgPSBkZXY7Ci0JbWVtc2V0KGItPmJjYXN0X2FkZHIudmFsdWUsIDAsIHNpemVvZihiLT5iY2FzdF9hZGRyLnZhbHVlKSk7CisJLyogQXNzb2NpYXRlIFRJUEMgYmVhcmVyIHdpdGggTDIgYmVhcmVyICovCisJcmN1X2Fzc2lnbl9wb2ludGVyKGItPm1lZGlhX3B0ciwgZGV2KTsKKwltZW1zZXQoJmItPmJjYXN0X2FkZHIsIDAsIHNpemVvZihiLT5iY2FzdF9hZGRyKSk7CiAJbWVtY3B5KGItPmJjYXN0X2FkZHIudmFsdWUsIGRldi0+YnJvYWRjYXN0LCBiLT5tZWRpYS0+aHdhZGRyX2xlbik7CiAJYi0+YmNhc3RfYWRkci5tZWRpYV9pZCA9IGItPm1lZGlhLT50eXBlX2lkOwogCWItPmJjYXN0X2FkZHIuYnJvYWRjYXN0ID0gMTsKIAliLT5tdHUgPSBkZXYtPm10dTsKLQl0aXBjX2wyX21lZGlhX2FkZHJfc2V0KGIsICZiLT5hZGRyLCAoY2hhciAqKWRldi0+ZGV2X2FkZHIpOworCWItPm1lZGlhLT5yYXcyYWRkcihiLCAmYi0+YWRkciwgKGNoYXIgKilkZXYtPmRldl9hZGRyKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT50aXBjX3B0ciwgYik7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIHRpcGNfZGlzYWJsZV9sMl9tZWRpYSAtIGRldGFjaCBUSVBDIGJlYXJlciBmcm9tIGFuIEV0aGVybmV0IGludGVyZmFjZQorLyogdGlwY19kaXNhYmxlX2wyX21lZGlhIC0gZGV0YWNoIFRJUEMgYmVhcmVyIGZyb20gYW4gTDIgaW50ZXJmYWNlCiAgKgotICogTWFyayBFdGhlcm5ldCBiZWFyZXIgYXMgaW5hY3RpdmUgc28gdGhhdCBpbmNvbWluZyBidWZmZXJzIGFyZSB0aHJvd24gYXdheSwKKyAqIE1hcmsgTDIgYmVhcmVyIGFzIGluYWN0aXZlIHNvIHRoYXQgaW5jb21pbmcgYnVmZmVycyBhcmUgdGhyb3duIGF3YXksCiAgKiB0aGVuIGdldCB3b3JrZXIgdGhyZWFkIHRvIGNvbXBsZXRlIGJlYXJlciBjbGVhbnVwLiAgKENhbid0IGRvIGNsZWFudXAKICAqIGhlcmUgYmVjYXVzZSBjbGVhbnVwIGNvZGUgbmVlZHMgdG8gc2xlZXAgYW5kIGNhbGxlciBob2xkcyBzcGlubG9ja3MuKQogICovCiB2b2lkIHRpcGNfZGlzYWJsZV9sMl9tZWRpYShzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWItPm1lZGlhX3B0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcnRubF9kZXJlZmVyZW5jZShiLT5tZWRpYV9wdHIpOworCVJDVV9JTklUX1BPSU5URVIoYi0+bWVkaWFfcHRyLCBOVUxMKTsKIAlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+dGlwY19wdHIsIE5VTEwpOworCXN5bmNocm9uaXplX25ldCgpOwogCWRldl9wdXQoZGV2KTsKIH0KIAogLyoqCi0gKiB0aXBjX2wyX3NlbmRfbXNnIC0gc2VuZCBhIFRJUEMgcGFja2V0IG91dCBvdmVyIGFuIEV0aGVybmV0IGludGVyZmFjZQorICogdGlwY19sMl9zZW5kX21zZyAtIHNlbmQgYSBUSVBDIHBhY2tldCBvdXQgb3ZlciBhbiBMMiBpbnRlcmZhY2UKICAqIEBidWY6IHRoZSBwYWNrZXQgdG8gYmUgc2VudAogICogQGJfcHRyOiB0aGUgYmVhcmVyIHRocm91Z2ggd2hpY2ggdGhlIHBhY2tldCBpcyB0byBiZSBzZW50CiAgKiBAZGVzdDogcGVlciBkZXN0aW5hdGlvbiBhZGRyZXNzCkBAIC00NzgsOCArNDYwLDEyIEBACiAJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgZGVsdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWItPm1lZGlhX3B0cjsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOwogCiAJY2xvbmUgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNsb25lKQpAQCAtNTA3LDEwICs0OTMsMTYgQEAKICAqIFRoZSBtZWRpYSBzZW5kIHJvdXRpbmUgbXVzdCBub3QgYWx0ZXIgdGhlIGJ1ZmZlciBiZWluZyBwYXNzZWQgaW4KICAqIGFzIGl0IG1heSBiZSBuZWVkZWQgZm9yIGxhdGVyIHJldHJhbnNtaXNzaW9uIQogICovCi12b2lkIHRpcGNfYmVhcmVyX3NlbmQoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAordm9pZCB0aXBjX2JlYXJlcl9zZW5kKHUzMiBiZWFyZXJfaWQsIHN0cnVjdCBza19idWZmICpidWYsCiAJCSAgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpCiB7Ci0JYi0+bWVkaWEtPnNlbmRfbXNnKGJ1ZiwgYiwgZGVzdCk7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOworCWlmIChsaWtlbHkoYl9wdHIpKQorCQliX3B0ci0+bWVkaWEtPnNlbmRfbXNnKGJ1ZiwgYl9wdHIsIGRlc3QpOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKioKQEAgLTUzNSw3ICs1MjcsNyBAQAogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKLQliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPnRpcGNfcHRyKTsKKwliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGRldi0+dGlwY19wdHIpOwogCWlmIChsaWtlbHkoYl9wdHIpKSB7CiAJCWlmIChsaWtlbHkoYnVmLT5wa3RfdHlwZSA8PSBQQUNLRVRfQlJPQURDQVNUKSkgewogCQkJYnVmLT5uZXh0ID0gTlVMTDsKQEAgLTU2OCwxMiArNTYwLDkgQEAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPnRpcGNfcHRyKTsKLQlpZiAoIWJfcHRyKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCWJfcHRyID0gcnRubF9kZXJlZmVyZW5jZShkZXYtPnRpcGNfcHRyKTsKKwlpZiAoIWJfcHRyKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQogCiAJYl9wdHItPm10dSA9IGRldi0+bXR1OwogCkBAIC01ODYsMTcgKzU3NSwxNSBAQAogCQl0aXBjX3Jlc2V0X2JlYXJlcihiX3B0cik7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6Ci0JCXRpcGNfbDJfbWVkaWFfYWRkcl9zZXQoYl9wdHIsICZiX3B0ci0+YWRkciwKKwkJYl9wdHItPm1lZGlhLT5yYXcyYWRkcihiX3B0ciwgJmJfcHRyLT5hZGRyLAogCQkJCSAgICAgICAoY2hhciAqKWRldi0+ZGV2X2FkZHIpOwogCQl0aXBjX3Jlc2V0X2JlYXJlcihiX3B0cik7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKLQkJdGlwY19kaXNhYmxlX2JlYXJlcihiX3B0ci0+bmFtZSk7CisJCWJlYXJlcl9kaXNhYmxlKGJfcHRyLCBmYWxzZSk7CiAJCWJyZWFrOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKQEAgLTYzMyw3ICs2MjAsNyBAQAogCXUzMiBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJYl9wdHIgPSBiZWFyZXJfbGlzdFtpXTsKKwkJYl9wdHIgPSBydG5sX2RlcmVmZXJlbmNlKGJlYXJlcl9saXN0W2ldKTsKIAkJaWYgKGJfcHRyKSB7CiAJCQliZWFyZXJfZGlzYWJsZShiX3B0ciwgdHJ1ZSk7CiAJCQliZWFyZXJfbGlzdFtpXSA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuaCBiL25ldC90aXBjL2JlYXJlci5oCmluZGV4IGJhNDgxNDUuLjc4ZmNjYzQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5oCisrKyBiL25ldC90aXBjL2JlYXJlci5oCkBAIC00MiwxNCArNDIsMTIgQEAKICNkZWZpbmUgTUFYX0JFQVJFUlMJMgogI2RlZmluZSBNQVhfTUVESUEJMgogCi0vKgotICogSWRlbnRpZmllcnMgYXNzb2NpYXRlZCB3aXRoIFRJUEMgbWVzc2FnZSBoZWFkZXIgbWVkaWEgYWRkcmVzcyBpbmZvCi0gKgotICogLSBhZGRyZXNzIGluZm8gZmllbGQgaXMgMjAgYnl0ZXMgbG9uZwotICogLSBtZWRpYSB0eXBlIGlkZW50aWZpZXIgbG9jYXRlZCBhdCBvZmZzZXQgMwotICogLSByZW1haW5pbmcgYnl0ZXMgdmFyeSBhY2NvcmRpbmcgdG8gbWVkaWEgdHlwZQorLyogSWRlbnRpZmllcnMgYXNzb2NpYXRlZCB3aXRoIFRJUEMgbWVzc2FnZSBoZWFkZXIgbWVkaWEgYWRkcmVzcyBpbmZvCisgKiAtIGFkZHJlc3MgaW5mbyBmaWVsZCBpcyAzMiBieXRlcyBsb25nCisgKiAtIHRoZSBmaWVsZCdzIGFjdHVhbCBjb250ZW50IGFuZCBsZW5ndGggaXMgZGVmaW5lZCBwZXIgbWVkaWEKKyAqIC0gcmVtYWluaW5nIHVudXNlZCBieXRlcyBpbiB0aGUgZmllbGQgYXJlIHNldCB0byB6ZXJvCiAgKi8KLSNkZWZpbmUgVElQQ19NRURJQV9BRERSX1NJWkUJMjAKKyNkZWZpbmUgVElQQ19NRURJQV9BRERSX1NJWkUJMzIKICNkZWZpbmUgVElQQ19NRURJQV9UWVBFX09GRlNFVAkzCiAKIC8qCkBAIC03Nyw5ICs3NSwxMCBAQAogICogQHNlbmRfbXNnOiByb3V0aW5lIHdoaWNoIGhhbmRsZXMgYnVmZmVyIHRyYW5zbWlzc2lvbgogICogQGVuYWJsZV9tZWRpYTogcm91dGluZSB3aGljaCBlbmFibGVzIGEgbWVkaWEKICAqIEBkaXNhYmxlX21lZGlhOiByb3V0aW5lIHdoaWNoIGRpc2FibGVzIGEgbWVkaWEKLSAqIEBhZGRyMnN0cjogcm91dGluZSB3aGljaCBjb252ZXJ0cyBtZWRpYSBhZGRyZXNzIHRvIHN0cmluZwotICogQGFkZHIybXNnOiByb3V0aW5lIHdoaWNoIGNvbnZlcnRzIG1lZGlhIGFkZHJlc3MgdG8gcHJvdG9jb2wgbWVzc2FnZSBhcmVhCi0gKiBAbXNnMmFkZHI6IHJvdXRpbmUgd2hpY2ggY29udmVydHMgbWVkaWEgYWRkcmVzcyBmcm9tIHByb3RvY29sIG1lc3NhZ2UgYXJlYQorICogQGFkZHIyc3RyOiBjb252ZXJ0IG1lZGlhIGFkZHJlc3MgZm9ybWF0IHRvIHN0cmluZworICogQGFkZHIybXNnOiBjb252ZXJ0IGZyb20gbWVkaWEgYWRkciBmb3JtYXQgdG8gZGlzY292ZXJ5IG1zZyBhZGRyIGZvcm1hdAorICogQG1zZzJhZGRyOiBjb252ZXJ0IGZyb20gZGlzY292ZXJ5IG1zZyBhZGRyIGZvcm1hdCB0byBtZWRpYSBhZGRyIGZvcm1hdAorICogQHJhdzJhZGRyOiBjb252ZXJ0IGZyb20gcmF3IGFkZHIgZm9ybWF0IHRvIG1lZGlhIGFkZHIgZm9ybWF0CiAgKiBAcHJpb3JpdHk6IGRlZmF1bHQgbGluayAoYW5kIGJlYXJlcikgcHJpb3JpdHkKICAqIEB0b2xlcmFuY2U6IGRlZmF1bHQgdGltZSAoaW4gbXMpIGJlZm9yZSBkZWNsYXJpbmcgbGluayBmYWlsdXJlCiAgKiBAd2luZG93OiBkZWZhdWx0IHdpbmRvdyAoaW4gcGFja2V0cykgYmVmb3JlIGRlY2xhcmluZyBsaW5rIGNvbmdlc3Rpb24KQEAgLTkzLDEwICs5MiwxNiBAQAogCQkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCk7CiAJaW50ICgqZW5hYmxlX21lZGlhKShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTsKIAl2b2lkICgqZGlzYWJsZV9tZWRpYSkoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7Ci0JaW50ICgqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKnN0cl9idWYsIGludCBzdHJfc2l6ZSk7Ci0JaW50ICgqYWRkcjJtc2cpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKm1zZ19hcmVhKTsKLQlpbnQgKCptc2cyYWRkcikoY29uc3Qgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwKLQkJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKm1zZ19hcmVhKTsKKwlpbnQgKCphZGRyMnN0cikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkciwKKwkJCWNoYXIgKnN0cmJ1ZiwKKwkJCWludCBidWZzeik7CisJaW50ICgqYWRkcjJtc2cpKGNoYXIgKm1zZywgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkcik7CisJaW50ICgqbXNnMmFkZHIpKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCisJCQljaGFyICptc2cpOworCWludCAoKnJhdzJhZGRyKShzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyLAorCQkJY2hhciAqcmF3KTsKIAl1MzIgcHJpb3JpdHk7CiAJdTMyIHRvbGVyYW5jZTsKIAl1MzIgd2luZG93OwpAQCAtMTEzLDYgKzExOCw3IEBACiAgKiBAbmFtZTogYmVhcmVyIG5hbWUgKGZvcm1hdCA9IG1lZGlhOmludGVyZmFjZSkKICAqIEBtZWRpYTogcHRyIHRvIG1lZGlhIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCiAgKiBAYmNhc3RfYWRkcjogbWVkaWEgYWRkcmVzcyB1c2VkIGluIGJyb2FkY2FzdGluZworICogQHJjdTogcmN1IHN0cnVjdCBmb3IgdGlwY19iZWFyZXIKICAqIEBwcmlvcml0eTogZGVmYXVsdCBsaW5rIHByaW9yaXR5IGZvciBiZWFyZXIKICAqIEB3aW5kb3c6IGRlZmF1bHQgd2luZG93IHNpemUgZm9yIGJlYXJlcgogICogQHRvbGVyYW5jZTogZGVmYXVsdCBsaW5rIHRvbGVyYW5jZSBmb3IgYmVhcmVyCkBAIC0xMjcsMTIgKzEzMywxMyBAQAogICogY2FyZSBvZiBpbml0aWFsaXppbmcgYWxsIG90aGVyIGZpZWxkcy4KICAqLwogc3RydWN0IHRpcGNfYmVhcmVyIHsKLQl2b2lkICptZWRpYV9wdHI7CQkJLyogaW5pdGFsaXplZCBieSBtZWRpYSAqLworCXZvaWQgX19yY3UgKm1lZGlhX3B0cjsJCQkvKiBpbml0YWxpemVkIGJ5IG1lZGlhICovCiAJdTMyIG10dTsJCQkJLyogaW5pdGFsaXplZCBieSBtZWRpYSAqLwogCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgYWRkcjsJCS8qIGluaXRhbGl6ZWQgYnkgbWVkaWEgKi8KIAljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOwogCXN0cnVjdCB0aXBjX21lZGlhICptZWRpYTsKIAlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGJjYXN0X2FkZHI7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKIAl1MzIgcHJpb3JpdHk7CiAJdTMyIHdpbmRvdzsKIAl1MzIgdG9sZXJhbmNlOwpAQCAtMTUwLDcgKzE1Nyw3IEBACiAKIHN0cnVjdCB0aXBjX2xpbms7CiAKLWV4dGVybiBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJlYXJlcl9saXN0W107CitleHRlcm4gc3RydWN0IHRpcGNfYmVhcmVyIF9fcmN1ICpiZWFyZXJfbGlzdFtdOwogCiAvKgogICogVElQQyByb3V0aW5lcyBhdmFpbGFibGUgdG8gc3VwcG9ydGVkIG1lZGlhIHR5cGVzCkBAIC0xNzMsMjIgKzE4MCwyMCBAQAogaW50IHRpcGNfbWVkaWFfc2V0X3dpbmRvdyhjb25zdCBjaGFyICpuYW1lLCB1MzIgbmV3X3ZhbHVlKTsKIHZvaWQgdGlwY19tZWRpYV9hZGRyX3ByaW50ZihjaGFyICpidWYsIGludCBsZW4sIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpOwogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbWVkaWFfZ2V0X25hbWVzKHZvaWQpOwotdm9pZCB0aXBjX2wyX21lZGlhX2FkZHJfc2V0KGNvbnN0IHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKLQkJCSAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICptYWMpOwogaW50IHRpcGNfZW5hYmxlX2wyX21lZGlhKHN0cnVjdCB0aXBjX2JlYXJlciAqYik7CiB2b2lkIHRpcGNfZGlzYWJsZV9sMl9tZWRpYShzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpOwogaW50IHRpcGNfbDJfc2VuZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICpiLAogCQkgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpOwogCiBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19iZWFyZXJfZ2V0X25hbWVzKHZvaWQpOwotdm9pZCB0aXBjX2JlYXJlcl9hZGRfZGVzdChzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCk7Ci12b2lkIHRpcGNfYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHUzMiBkZXN0KTsKK3ZvaWQgdGlwY19iZWFyZXJfYWRkX2Rlc3QodTMyIGJlYXJlcl9pZCwgdTMyIGRlc3QpOwordm9pZCB0aXBjX2JlYXJlcl9yZW1vdmVfZGVzdCh1MzIgYmVhcmVyX2lkLCB1MzIgZGVzdCk7CiBzdHJ1Y3QgdGlwY19iZWFyZXIgKnRpcGNfYmVhcmVyX2ZpbmQoY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgdGlwY19tZWRpYSAqdGlwY19tZWRpYV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpOwogaW50IHRpcGNfYmVhcmVyX3NldHVwKHZvaWQpOwogdm9pZCB0aXBjX2JlYXJlcl9jbGVhbnVwKHZvaWQpOwogdm9pZCB0aXBjX2JlYXJlcl9zdG9wKHZvaWQpOwotdm9pZCB0aXBjX2JlYXJlcl9zZW5kKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKK3ZvaWQgdGlwY19iZWFyZXJfc2VuZCh1MzIgYmVhcmVyX2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAogCQkgICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KTsKIAogI2VuZGlmCS8qIF9USVBDX0JFQVJFUl9IICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb25maWcuYyBiL25ldC90aXBjL2NvbmZpZy5jCmluZGV4IDRiOTgxYzAuLjJiNDI0MDMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvbmZpZy5jCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC00Miw4ICs0Miw2IEBACiAKICNkZWZpbmUgUkVQTFlfVFJVTkNBVEVEICI8dHJ1bmNhdGVkPlxuIgogCi1zdGF0aWMgREVGSU5FX01VVEVYKGNvbmZpZ19tdXRleCk7Ci0KIHN0YXRpYyBjb25zdCB2b2lkICpyZXFfdGx2X2FyZWE7CS8qIHJlcXVlc3QgbWVzc2FnZSBUTFYgYXJlYSAqLwogc3RhdGljIGludCByZXFfdGx2X3NwYWNlOwkJLyogcmVxdWVzdCBtZXNzYWdlIFRMViBhcmVhIHNpemUgKi8KIHN0YXRpYyBpbnQgcmVwX2hlYWRyb29tOwkJLyogcmVwbHkgbWVzc2FnZSBoZWFkcm9vbSB0byB1c2UgKi8KQEAgLTE3OSw4ICsxNzcsMTAgQEAKIAlpZiAodGlwY19vd25fYWRkcikKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECiAJCQkJCQkgICAiIChjYW5ub3QgY2hhbmdlIG5vZGUgYWRkcmVzcyBvbmNlIGFzc2lnbmVkKSIpOwotCXRpcGNfbmV0X3N0YXJ0KGFkZHIpOwotCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CisJaWYgKCF0aXBjX25ldF9zdGFydChhZGRyKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKKworCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoImNhbm5vdCBjaGFuZ2UgdG8gbmV0d29yayBtb2RlIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfcG9ydHModm9pZCkKQEAgLTIyMyw3ICsyMjMsNyBAQAogewogCXN0cnVjdCBza19idWZmICpyZXBfdGx2X2J1ZjsKIAotCW11dGV4X2xvY2soJmNvbmZpZ19tdXRleCk7CisJcnRubF9sb2NrKCk7CiAKIAkvKiBTYXZlIHJlcXVlc3QgYW5kIHJlcGx5IGRldGFpbHMgaW4gYSB3ZWxsLWtub3duIGxvY2F0aW9uICovCiAJcmVxX3Rsdl9hcmVhID0gcmVxdWVzdF9hcmVhOwpAQCAtMzM3LDYgKzMzNyw2IEBACiAKIAkvKiBSZXR1cm4gcmVwbHkgYnVmZmVyICovCiBleGl0OgotCW11dGV4X3VubG9jaygmY29uZmlnX211dGV4KTsKKwlydG5sX3VubG9jaygpOwogCXJldHVybiByZXBfdGx2X2J1ZjsKIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuYyBiL25ldC90aXBjL2NvcmUuYwppbmRleCA1MGQ1NzQyLi42NzZkMTgwIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmMKKysrIGIvbmV0L3RpcGMvY29yZS5jCkBAIC04MCw3ICs4MCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRpcGNfY29yZV9zdG9wKHZvaWQpCiB7Ci0JdGlwY19oYW5kbGVyX3N0b3AoKTsKIAl0aXBjX25ldF9zdG9wKCk7CiAJdGlwY19iZWFyZXJfY2xlYW51cCgpOwogCXRpcGNfbmV0bGlua19zdG9wKCk7CkBAIC0xMDAsMTAgKzk5LDYgQEAKIAogCWdldF9yYW5kb21fYnl0ZXMoJnRpcGNfcmFuZG9tLCBzaXplb2YodGlwY19yYW5kb20pKTsKIAotCWVyciA9IHRpcGNfaGFuZGxlcl9zdGFydCgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2hhbmRsZXI7Ci0KIAllcnIgPSB0aXBjX3JlZl90YWJsZV9pbml0KHRpcGNfbWF4X3BvcnRzLCB0aXBjX3JhbmRvbSk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfcmVmdGJsOwpAQCAtMTQ2LDggKzE0MSw2IEBACiBvdXRfbmFtZXRibDoKIAl0aXBjX3JlZl90YWJsZV9zdG9wKCk7CiBvdXRfcmVmdGJsOgotCXRpcGNfaGFuZGxlcl9zdG9wKCk7Ci1vdXRfaGFuZGxlcjoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNjEsMTAgKzE1NCwxMSBAQAogCXRpcGNfbWF4X3BvcnRzID0gQ09ORklHX1RJUENfUE9SVFM7CiAJdGlwY19uZXRfaWQgPSA0NzExOwogCi0Jc3lzY3RsX3RpcGNfcm1lbVswXSA9IENPTk5fT1ZFUkxPQURfTElNSVQgPj4gNCA8PCBUSVBDX0xPV19JTVBPUlRBTkNFOwotCXN5c2N0bF90aXBjX3JtZW1bMV0gPSBDT05OX09WRVJMT0FEX0xJTUlUID4+IDQgPDwKKwlzeXNjdGxfdGlwY19ybWVtWzBdID0gVElQQ19DT05OX09WRVJMT0FEX0xJTUlUID4+IDQgPDwKKwkJCSAgICAgIFRJUENfTE9XX0lNUE9SVEFOQ0U7CisJc3lzY3RsX3RpcGNfcm1lbVsxXSA9IFRJUENfQ09OTl9PVkVSTE9BRF9MSU1JVCA+PiA0IDw8CiAJCQkgICAgICBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0U7Ci0Jc3lzY3RsX3RpcGNfcm1lbVsyXSA9IENPTk5fT1ZFUkxPQURfTElNSVQ7CisJc3lzY3RsX3RpcGNfcm1lbVsyXSA9IFRJUENfQ09OTl9PVkVSTE9BRF9MSU1JVDsKIAogCXJlcyA9IHRpcGNfY29yZV9zdGFydCgpOwogCWlmIChyZXMpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmggYi9uZXQvdGlwYy9jb3JlLmgKaW5kZXggODk4NWJiYy4uYmIyNmVkMSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29yZS5oCisrKyBiL25ldC90aXBjL2NvcmUuaApAQCAtNTYsNyArNTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2RlZmluZSBUSVBDX01PRF9WRVIgIjIuMC4wIgogCkBAIC04OSw4ICs5MCw2IEBACiAvKgogICogUm91dGluZXMgYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgc3Vic3lzdGVtcwogICovCi1pbnQgdGlwY19oYW5kbGVyX3N0YXJ0KHZvaWQpOwotdm9pZCB0aXBjX2hhbmRsZXJfc3RvcCh2b2lkKTsKIGludCB0aXBjX25ldGxpbmtfc3RhcnQodm9pZCk7CiB2b2lkIHRpcGNfbmV0bGlua19zdG9wKHZvaWQpOwogaW50IHRpcGNfc29ja2V0X2luaXQodm9pZCk7CkBAIC0xMDksMTIgKzEwOCwxMCBAQAogI2VuZGlmCiAKIC8qCi0gKiBUSVBDIHRpbWVyIGFuZCBzaWduYWwgY29kZQorICogVElQQyB0aW1lciBjb2RlCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkhhbmRsZXIpICh1bnNpZ25lZCBsb25nKTsKIAotdTMyIHRpcGNfa19zaWduYWwoSGFuZGxlciByb3V0aW5lLCB1bnNpZ25lZCBsb25nIGFyZ3VtZW50KTsKLQogLyoqCiAgKiBrX2luaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIKICAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKQEAgLTE5MSw2ICsxODgsNyBAQAogc3RydWN0IHRpcGNfc2tiX2NiIHsKIAl2b2lkICpoYW5kbGU7CiAJYm9vbCBkZWZlcnJlZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbDsKIH07CiAKICNkZWZpbmUgVElQQ19TS0JfQ0IoX19za2IpICgoc3RydWN0IHRpcGNfc2tiX2NiICopJigoX19za2IpLT5jYlswXSkpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCA1NDJmZTM0Li5hYTcyMmE0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbmV0L3RpcGMvZGlzY292ZXIuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIDIwMTQsIEVyaWNzc29uIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNDYsOCArNDYsOSBAQAogCiAvKioKICAqIHN0cnVjdCB0aXBjX2xpbmtfcmVxIC0gaW5mb3JtYXRpb24gYWJvdXQgYW4gb25nb2luZyBsaW5rIHNldHVwIHJlcXVlc3QKLSAqIEBiZWFyZXI6IGJlYXJlciBpc3N1aW5nIHJlcXVlc3RzCisgKiBAYmVhcmVyX2lkOiBpZGVudGl0eSBvZiBiZWFyZXIgaXNzdWluZyByZXF1ZXN0cwogICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHJlcXVlc3QgbWVzc2FnZXMKKyAqIEBkb21haW46IG5ldHdvcmsgZG9tYWluIHRvIHdoaWNoIGxpbmtzIGNhbiBiZSBlc3RhYmxpc2hlZAogICogQG51bV9ub2RlczogbnVtYmVyIG9mIG5vZGVzIGN1cnJlbnRseSBkaXNjb3ZlcmVkIChpLmUuIHdpdGggYW4gYWN0aXZlIGxpbmspCiAgKiBAbG9jazogc3BpbmxvY2sgZm9yIGNvbnRyb2xsaW5nIGFjY2VzcyB0byByZXF1ZXN0cwogICogQGJ1ZjogcmVxdWVzdCBtZXNzYWdlIHRvIGJlIChyZXBlYXRlZGx5KSBzZW50CkBAIC01NSw4ICs1Niw5IEBACiAgKiBAdGltZXJfaW50djogY3VycmVudCBpbnRlcnZhbCBiZXR3ZWVuIHJlcXVlc3RzIChpbiBtcykKICAqLwogc3RydWN0IHRpcGNfbGlua19yZXEgewotCXN0cnVjdCB0aXBjX2JlYXJlciAqYmVhcmVyOworCXUzMiBiZWFyZXJfaWQ7CiAJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBkZXN0OworCXUzMiBkb21haW47CiAJaW50IG51bV9ub2RlczsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKQEAgLTY5LDIyICs3MSwxOSBAQAogICogQHR5cGU6IG1lc3NhZ2UgdHlwZSAocmVxdWVzdCBvciByZXNwb25zZSkKICAqIEBiX3B0cjogcHRyIHRvIGJlYXJlciBpc3N1aW5nIG1lc3NhZ2UKICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICp0aXBjX2Rpc2NfaW5pdF9tc2codTMyIHR5cGUsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpCitzdGF0aWMgdm9pZCB0aXBjX2Rpc2NfaW5pdF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIHR5cGUsCisJCQkgICAgICAgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gdGlwY19idWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKIAl1MzIgZGVzdF9kb21haW4gPSBiX3B0ci0+ZG9tYWluOwogCi0JaWYgKGJ1ZikgewotCQltc2cgPSBidWZfbXNnKGJ1Zik7Ci0JCXRpcGNfbXNnX2luaXQobXNnLCBMSU5LX0NPTkZJRywgdHlwZSwgSU5UX0hfU0laRSwgZGVzdF9kb21haW4pOwotCQltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKLQkJbXNnX3NldF9ub2RlX3NpZyhtc2csIHRpcGNfcmFuZG9tKTsKLQkJbXNnX3NldF9kZXN0X2RvbWFpbihtc2csIGRlc3RfZG9tYWluKTsKLQkJbXNnX3NldF9iY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKLQkJYl9wdHItPm1lZGlhLT5hZGRyMm1zZygmYl9wdHItPmFkZHIsIG1zZ19tZWRpYV9hZGRyKG1zZykpOwotCX0KLQlyZXR1cm4gYnVmOworCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl0aXBjX21zZ19pbml0KG1zZywgTElOS19DT05GSUcsIHR5cGUsIElOVF9IX1NJWkUsIGRlc3RfZG9tYWluKTsKKwltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKKwltc2dfc2V0X25vZGVfc2lnKG1zZywgdGlwY19yYW5kb20pOworCW1zZ19zZXRfZGVzdF9kb21haW4obXNnLCBkZXN0X2RvbWFpbik7CisJbXNnX3NldF9iY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKKwliX3B0ci0+bWVkaWEtPmFkZHIybXNnKG1zZ19tZWRpYV9hZGRyKG1zZyksICZiX3B0ci0+YWRkcik7CiB9CiAKIC8qKgpAQCAtMTA3LDE0NiArMTA2LDE1MCBAQAogfQogCiAvKioKLSAqIHRpcGNfZGlzY19yY3YgLSBoYW5kbGUgaW5jb21pbmcgbGluayBzZXR1cCBtZXNzYWdlIChyZXF1ZXN0IG9yIHJlc3BvbnNlKQorICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSkKICAqIEBidWY6IGJ1ZmZlciBjb250YWluaW5nIG1lc3NhZ2UKLSAqIEBiX3B0cjogYmVhcmVyIHRoYXQgbWVzc2FnZSBhcnJpdmVkIG9uCisgKiBAYmVhcmVyOiBiZWFyZXIgdGhhdCBtZXNzYWdlIGFycml2ZWQgb24KICAqLwotdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpCit2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXIpCiB7Ci0Jc3RydWN0IHRpcGNfbm9kZSAqbl9wdHI7CisJc3RydWN0IHRpcGNfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgdGlwY19saW5rICpsaW5rOwotCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWVkaWFfYWRkcjsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyOwogCXN0cnVjdCBza19idWZmICpyYnVmOwogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOwotCXUzMiBkZXN0ID0gbXNnX2Rlc3RfZG9tYWluKG1zZyk7Ci0JdTMyIG9yaWcgPSBtc2dfcHJldm5vZGUobXNnKTsKKwl1MzIgZGRvbSA9IG1zZ19kZXN0X2RvbWFpbihtc2cpOworCXUzMiBvbm9kZSA9IG1zZ19wcmV2bm9kZShtc2cpOwogCXUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQobXNnKTsKLQl1MzIgdHlwZSA9IG1zZ190eXBlKG1zZyk7CisJdTMyIG10eXAgPSBtc2dfdHlwZShtc2cpOwogCXUzMiBzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcobXNnKTsKLQlpbnQgYWRkcl9taXNtYXRjaDsKLQlpbnQgbGlua19mdWxseV91cDsKKwlib29sIGFkZHJfbWF0Y2ggPSBmYWxzZTsKKwlib29sIHNpZ25fbWF0Y2ggPSBmYWxzZTsKKwlib29sIGxpbmtfdXAgPSBmYWxzZTsKKwlib29sIGFjY2VwdF9hZGRyID0gZmFsc2U7CisJYm9vbCBhY2NlcHRfc2lnbiA9IGZhbHNlOworCWJvb2wgcmVzcG9uZCA9IGZhbHNlOwogCi0JbWVkaWFfYWRkci5icm9hZGNhc3QgPSAxOwotCWJfcHRyLT5tZWRpYS0+bXNnMmFkZHIoYl9wdHIsICZtZWRpYV9hZGRyLCBtc2dfbWVkaWFfYWRkcihtc2cpKTsKKwliZWFyZXItPm1lZGlhLT5tc2cyYWRkcihiZWFyZXIsICZtYWRkciwgbXNnX21lZGlhX2FkZHIobXNnKSk7CiAJa2ZyZWVfc2tiKGJ1Zik7CiAKIAkvKiBFbnN1cmUgbWVzc2FnZSBmcm9tIG5vZGUgaXMgdmFsaWQgYW5kIGNvbW11bmljYXRpb24gaXMgcGVybWl0dGVkICovCiAJaWYgKG5ldF9pZCAhPSB0aXBjX25ldF9pZCkKIAkJcmV0dXJuOwotCWlmIChtZWRpYV9hZGRyLmJyb2FkY2FzdCkKKwlpZiAobWFkZHIuYnJvYWRjYXN0KQogCQlyZXR1cm47Ci0JaWYgKCF0aXBjX2FkZHJfZG9tYWluX3ZhbGlkKGRlc3QpKQorCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChkZG9tKSkKIAkJcmV0dXJuOwotCWlmICghdGlwY19hZGRyX25vZGVfdmFsaWQob3JpZykpCi0JCXJldHVybjsKLQlpZiAob3JpZyA9PSB0aXBjX293bl9hZGRyKSB7Ci0JCWlmIChtZW1jbXAoJm1lZGlhX2FkZHIsICZiX3B0ci0+YWRkciwgc2l6ZW9mKG1lZGlhX2FkZHIpKSkKLQkJCWRpc2NfZHVwbF9hbGVydChiX3B0ciwgdGlwY19vd25fYWRkciwgJm1lZGlhX2FkZHIpOwotCQlyZXR1cm47Ci0JfQotCWlmICghdGlwY19pbl9zY29wZShkZXN0LCB0aXBjX293bl9hZGRyKSkKLQkJcmV0dXJuOwotCWlmICghdGlwY19pbl9zY29wZShiX3B0ci0+ZG9tYWluLCBvcmlnKSkKKwlpZiAoIXRpcGNfYWRkcl9ub2RlX3ZhbGlkKG9ub2RlKSkKIAkJcmV0dXJuOwogCi0JLyogTG9jYXRlIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3Rpbmcgbm9kZSAqLwotCW5fcHRyID0gdGlwY19ub2RlX2ZpbmQob3JpZyk7Ci0JaWYgKCFuX3B0cikgewotCQluX3B0ciA9IHRpcGNfbm9kZV9jcmVhdGUob3JpZyk7Ci0JCWlmICghbl9wdHIpCi0JCQlyZXR1cm47CisJaWYgKGluX293bl9ub2RlKG9ub2RlKSkgeworCQlpZiAobWVtY21wKCZtYWRkciwgJmJlYXJlci0+YWRkciwgc2l6ZW9mKG1hZGRyKSkpCisJCQlkaXNjX2R1cGxfYWxlcnQoYmVhcmVyLCB0aXBjX293bl9hZGRyLCAmbWFkZHIpOworCQlyZXR1cm47CiAJfQotCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKKwlpZiAoIXRpcGNfaW5fc2NvcGUoZGRvbSwgdGlwY19vd25fYWRkcikpCisJCXJldHVybjsKKwlpZiAoIXRpcGNfaW5fc2NvcGUoYmVhcmVyLT5kb21haW4sIG9ub2RlKSkKKwkJcmV0dXJuOworCisJLyogTG9jYXRlLCBvciBpZiBuZWNlc3NhcnksIGNyZWF0ZSwgbm9kZTogKi8KKwlub2RlID0gdGlwY19ub2RlX2ZpbmQob25vZGUpOworCWlmICghbm9kZSkKKwkJbm9kZSA9IHRpcGNfbm9kZV9jcmVhdGUob25vZGUpOworCWlmICghbm9kZSkKKwkJcmV0dXJuOworCisJdGlwY19ub2RlX2xvY2sobm9kZSk7CisJbGluayA9IG5vZGUtPmxpbmtzW2JlYXJlci0+aWRlbnRpdHldOwogCiAJLyogUHJlcGFyZSB0byB2YWxpZGF0ZSByZXF1ZXN0aW5nIG5vZGUncyBzaWduYXR1cmUgYW5kIG1lZGlhIGFkZHJlc3MgKi8KLQlsaW5rID0gbl9wdHItPmxpbmtzW2JfcHRyLT5pZGVudGl0eV07Ci0JYWRkcl9taXNtYXRjaCA9IChsaW5rICE9IE5VTEwpICYmCi0JCW1lbWNtcCgmbGluay0+bWVkaWFfYWRkciwgJm1lZGlhX2FkZHIsIHNpemVvZihtZWRpYV9hZGRyKSk7CisJc2lnbl9tYXRjaCA9IChzaWduYXR1cmUgPT0gbm9kZS0+c2lnbmF0dXJlKTsKKwlhZGRyX21hdGNoID0gbGluayAmJiAhbWVtY21wKCZsaW5rLT5tZWRpYV9hZGRyLCAmbWFkZHIsIHNpemVvZihtYWRkcikpOworCWxpbmtfdXAgPSBsaW5rICYmIHRpcGNfbGlua19pc191cChsaW5rKTsKIAotCS8qCi0JICogRW5zdXJlIGRpc2NvdmVyeSBtZXNzYWdlJ3Mgc2lnbmF0dXJlIGlzIGNvcnJlY3QKLQkgKgotCSAqIElmIHNpZ25hdHVyZSBpcyBpbmNvcnJlY3QgYW5kIHRoZXJlIGlzIG5vIHdvcmtpbmcgbGluayB0byB0aGUgbm9kZSwKLQkgKiBhY2NlcHQgdGhlIG5ldyBzaWduYXR1cmUgYnV0IGludmFsaWRhdGUgYWxsIGV4aXN0aW5nIGxpbmtzIHRvIHRoZQotCSAqIG5vZGUgc28gdGhleSB3b24ndCByZS1hY3RpdmF0ZSB3aXRob3V0IGEgbmV3IGRpc2NvdmVyeSBtZXNzYWdlLgotCSAqCi0JICogSWYgc2lnbmF0dXJlIGlzIGluY29ycmVjdCBhbmQgdGhlIHJlcXVlc3RlZCBsaW5rIHRvIHRoZSBub2RlIGlzCi0JICogd29ya2luZywgYWNjZXB0IHRoZSBuZXcgc2lnbmF0dXJlLiAoVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBkZWxheWVkCi0JICogcmVkaXNjb3ZlcnksIHdoZXJlIGEgbGluayBlbmRwb2ludCB3YXMgYWJsZSB0byByZS1lc3RhYmxpc2ggY29udGFjdAotCSAqIHdpdGggaXRzIHBlZXIgZW5kcG9pbnQgb24gYSBub2RlIHRoYXQgcmVib290ZWQgYmVmb3JlIHJlY2VpdmluZyBhCi0JICogZGlzY292ZXJ5IG1lc3NhZ2UgZnJvbSB0aGF0IG5vZGUuKQotCSAqCi0JICogSWYgc2lnbmF0dXJlIGlzIGluY29ycmVjdCBhbmQgdGhlcmUgaXMgYSB3b3JraW5nIGxpbmsgdG8gdGhlIG5vZGUKLQkgKiB0aGF0IGlzIG5vdCB0aGUgcmVxdWVzdGVkIGxpbmssIHJlamVjdCB0aGUgcmVxdWVzdCAobXVzdCBiZSBmcm9tCi0JICogYSBkdXBsaWNhdGUgbm9kZSkuCi0JICovCi0JaWYgKHNpZ25hdHVyZSAhPSBuX3B0ci0+c2lnbmF0dXJlKSB7Ci0JCWlmIChuX3B0ci0+d29ya2luZ19saW5rcyA9PSAwKSB7Ci0JCQlzdHJ1Y3QgdGlwY19saW5rICpjdXJyX2xpbms7Ci0JCQlpbnQgaTsKIAotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJCQljdXJyX2xpbmsgPSBuX3B0ci0+bGlua3NbaV07Ci0JCQkJaWYgKGN1cnJfbGluaykgewotCQkJCQltZW1zZXQoJmN1cnJfbGluay0+bWVkaWFfYWRkciwgMCwKLQkJCQkJICAgICAgIHNpemVvZihtZWRpYV9hZGRyKSk7Ci0JCQkJCXRpcGNfbGlua19yZXNldChjdXJyX2xpbmspOwotCQkJCX0KLQkJCX0KLQkJCWFkZHJfbWlzbWF0Y2ggPSAobGluayAhPSBOVUxMKTsKLQkJfSBlbHNlIGlmICh0aXBjX2xpbmtfaXNfdXAobGluaykgJiYgIWFkZHJfbWlzbWF0Y2gpIHsKLQkJCS8qIGRlbGF5ZWQgcmVkaXNjb3ZlcnkgKi8KLQkJfSBlbHNlIHsKLQkJCWRpc2NfZHVwbF9hbGVydChiX3B0ciwgb3JpZywgJm1lZGlhX2FkZHIpOwotCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbl9wdHItPnNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKKwkvKiBUaGVzZSB0aHJlZSBmbGFncyBnaXZlIHVzIGVpZ2h0IHBlcm11dGF0aW9uczogKi8KKworCWlmIChzaWduX21hdGNoICYmIGFkZHJfbWF0Y2ggJiYgbGlua191cCkgeworCQkvKiBBbGwgaXMgZmluZS4gRG8gbm90aGluZy4gKi8KKwl9IGVsc2UgaWYgKHNpZ25fbWF0Y2ggJiYgYWRkcl9tYXRjaCAmJiAhbGlua191cCkgeworCQkvKiBSZXNwb25kLiBUaGUgbGluayB3aWxsIGNvbWUgdXAgaW4gZHVlIHRpbWUgKi8KKwkJcmVzcG9uZCA9IHRydWU7CisJfSBlbHNlIGlmIChzaWduX21hdGNoICYmICFhZGRyX21hdGNoICYmIGxpbmtfdXApIHsKKwkJLyogUGVlciBoYXMgY2hhbmdlZCBpL2YgYWRkcmVzcyB3aXRob3V0IHJlYm9vdGluZy4KKwkJICogSWYgc28sIHRoZSBsaW5rIHdpbGwgcmVzZXQgc29vbiwgYW5kIHRoZSBuZXh0CisJCSAqIGRpc2NvdmVyeSB3aWxsIGJlIGFjY2VwdGVkLiBTbyB3ZSBjYW4gaWdub3JlIGl0LgorCQkgKiBJdCBtYXkgYWxzbyBiZSBhbiBjbG9uZWQgb3IgbWFsaWNpb3VzIHBlZXIgaGF2aW5nCisJCSAqIGNob3NlbiB0aGUgc2FtZSBub2RlIGFkZHJlc3MgYW5kIHNpZ25hdHVyZSBhcyBhbgorCQkgKiBleGlzdGluZyBvbmUuCisJCSAqIElnbm9yZSByZXF1ZXN0cyB1bnRpbCB0aGUgbGluayBnb2VzIGRvd24sIGlmIGV2ZXIuCisJCSAqLworCQlkaXNjX2R1cGxfYWxlcnQoYmVhcmVyLCBvbm9kZSwgJm1hZGRyKTsKKwl9IGVsc2UgaWYgKHNpZ25fbWF0Y2ggJiYgIWFkZHJfbWF0Y2ggJiYgIWxpbmtfdXApIHsKKwkJLyogUGVlciBsaW5rIGhhcyBjaGFuZ2VkIGkvZiBhZGRyZXNzIHdpdGhvdXQgcmVib290aW5nLgorCQkgKiBJdCBtYXkgYWxzbyBiZSBhIGNsb25lZCBvciBtYWxpY2lvdXMgcGVlcjsgd2UgY2FuJ3QKKwkJICogZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLgorCQkgKiBUaGUgc2lnbmF0dXJlIGlzIGNvcnJlY3QsIHNvIHdlIG11c3QgYWNjZXB0LgorCQkgKi8KKwkJYWNjZXB0X2FkZHIgPSB0cnVlOworCQlyZXNwb25kID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzaWduX21hdGNoICYmIGFkZHJfbWF0Y2ggJiYgbGlua191cCkgeworCQkvKiBQZWVyIG5vZGUgcmVib290ZWQuIFR3byBwb3NzaWJpbGl0aWVzOgorCQkgKiAgLSBEZWxheWVkIHJlLWRpc2NvdmVyeTsgdGhpcyBsaW5rIGVuZHBvaW50IGhhcyBhbHJlYWR5CisJCSAqICAgIHJlc2V0IGFuZCByZS1lc3RhYmxpc2hlZCBjb250YWN0IHdpdGggdGhlIHBlZXIsIGJlZm9yZQorCQkgKiAgICByZWNlaXZpbmcgYSBkaXNjb3ZlcnkgbWVzc2FnZSBmcm9tIHRoYXQgbm9kZS4KKwkJICogICAgKFRoZSBwZWVyIGhhcHBlbmVkIHRvIHJlY2VpdmUgb25lIGZyb20gdGhpcyBub2RlIGZpcnN0KS4KKwkJICogIC0gVGhlIHBlZXIgY2FtZSBiYWNrIHNvIGZhc3QgdGhhdCBvdXIgc2lkZSBoYXMgbm90CisJCSAqICAgIGRpc2NvdmVyZWQgaXQgeWV0LiBQcm9iaW5nIGZyb20gdGhpcyBzaWRlIHdpbGwgc29vbgorCQkgKiAgICByZXNldCB0aGUgbGluaywgc2luY2UgdGhlcmUgY2FuIGJlIG5vIHdvcmtpbmcgbGluaworCQkgKiAgICBlbmRwb2ludCBhdCB0aGUgcGVlciBlbmQsIGFuZCB0aGUgbGluayB3aWxsIHJlLWVzdGFibGlzaC4KKwkJICogIEFjY2VwdCB0aGUgc2lnbmF0dXJlLCBzaW5jZSBpdCBjb21lcyBmcm9tIGEga25vd24gcGVlci4KKwkJICovCisJCWFjY2VwdF9zaWduID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzaWduX21hdGNoICYmIGFkZHJfbWF0Y2ggJiYgIWxpbmtfdXApIHsKKwkJLyogIFRoZSBwZWVyIG5vZGUgaGFzIHJlYm9vdGVkLgorCQkgKiAgQWNjZXB0IHNpZ25hdHVyZSwgc2luY2UgaXQgaXMgYSBrbm93biBwZWVyLgorCQkgKi8KKwkJYWNjZXB0X3NpZ24gPSB0cnVlOworCQlyZXNwb25kID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzaWduX21hdGNoICYmICFhZGRyX21hdGNoICYmIGxpbmtfdXApIHsKKwkJLyogUGVlciByZWJvb3RlZCB3aXRoIG5ldyBhZGRyZXNzLCBvciBhIG5ldy9kdXBsaWNhdGUgcGVlci4KKwkJICogSWdub3JlIHVudGlsIHRoZSBsaW5rIGdvZXMgZG93biwgaWYgZXZlci4KKwkJICovCisJCWRpc2NfZHVwbF9hbGVydChiZWFyZXIsIG9ub2RlLCAmbWFkZHIpOworCX0gZWxzZSBpZiAoIXNpZ25fbWF0Y2ggJiYgIWFkZHJfbWF0Y2ggJiYgIWxpbmtfdXApIHsKKwkJLyogUGVlciByZWJvb3RlZCB3aXRoIG5ldyBhZGRyZXNzLCBvciBpdCBpcyBhIG5ldyBwZWVyLgorCQkgKiBBY2NlcHQgc2lnbmF0dXJlIGFuZCBhZGRyZXNzLgorCQkqLworCQlhY2NlcHRfc2lnbiA9IHRydWU7CisJCWFjY2VwdF9hZGRyID0gdHJ1ZTsKKwkJcmVzcG9uZCA9IHRydWU7CiAJfQogCi0JLyoKLQkgKiBFbnN1cmUgcmVxdWVzdGluZyBub2RlJ3MgbWVkaWEgYWRkcmVzcyBpcyBjb3JyZWN0Ci0JICoKLQkgKiBJZiBtZWRpYSBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggYW5kIHRoZSBsaW5rIGlzIHdvcmtpbmcsIHJlamVjdCB0aGUKLQkgKiByZXF1ZXN0IChtdXN0IGJlIGZyb20gYSBkdXBsaWNhdGUgbm9kZSkuCi0JICoKLQkgKiBJZiBtZWRpYSBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggYW5kIHRoZSBsaW5rIGlzIG5vdCB3b3JraW5nLCBhY2NlcHQKLQkgKiB0aGUgbmV3IG1lZGlhIGFkZHJlc3MgYW5kIHJlc2V0IHRoZSBsaW5rIHRvIGVuc3VyZSBpdCBzdGFydHMgdXAKLQkgKiBjbGVhbmx5LgotCSAqLwotCWlmIChhZGRyX21pc21hdGNoKSB7Ci0JCWlmICh0aXBjX2xpbmtfaXNfdXAobGluaykpIHsKLQkJCWRpc2NfZHVwbF9hbGVydChiX3B0ciwgb3JpZywgJm1lZGlhX2FkZHIpOwotCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoJmxpbmstPm1lZGlhX2FkZHIsICZtZWRpYV9hZGRyLAotCQkJICAgICAgIHNpemVvZihtZWRpYV9hZGRyKSk7CisJaWYgKGFjY2VwdF9zaWduKQorCQlub2RlLT5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisKKwlpZiAoYWNjZXB0X2FkZHIpIHsKKwkJaWYgKCFsaW5rKQorCQkJbGluayA9IHRpcGNfbGlua19jcmVhdGUobm9kZSwgYmVhcmVyLCAmbWFkZHIpOworCQlpZiAobGluaykgeworCQkJbWVtY3B5KCZsaW5rLT5tZWRpYV9hZGRyLCAmbWFkZHIsIHNpemVvZihtYWRkcikpOwogCQkJdGlwY19saW5rX3Jlc2V0KGxpbmspOworCQl9IGVsc2UgeworCQkJcmVzcG9uZCA9IGZhbHNlOwogCQl9CiAJfQogCi0JLyogQ3JlYXRlIGEgbGluayBlbmRwb2ludCBmb3IgdGhpcyBiZWFyZXIsIGlmIG5lY2Vzc2FyeSAqLwotCWlmICghbGluaykgewotCQlsaW5rID0gdGlwY19saW5rX2NyZWF0ZShuX3B0ciwgYl9wdHIsICZtZWRpYV9hZGRyKTsKLQkJaWYgKCFsaW5rKSB7Ci0JCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qIEFjY2VwdCBkaXNjb3ZlcnkgbWVzc2FnZSAmIHNlbmQgcmVzcG9uc2UsIGlmIG5lY2Vzc2FyeSAqLwotCWxpbmtfZnVsbHlfdXAgPSBsaW5rX3dvcmtpbmdfd29ya2luZyhsaW5rKTsKLQotCWlmICgodHlwZSA9PSBEU0NfUkVRX01TRykgJiYgIWxpbmtfZnVsbHlfdXApIHsKLQkJcmJ1ZiA9IHRpcGNfZGlzY19pbml0X21zZyhEU0NfUkVTUF9NU0csIGJfcHRyKTsKKwkvKiBTZW5kIHJlc3BvbnNlLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAocmVzcG9uZCAmJiAobXR5cCA9PSBEU0NfUkVRX01TRykpIHsKKwkJcmJ1ZiA9IHRpcGNfYnVmX2FjcXVpcmUoSU5UX0hfU0laRSk7CiAJCWlmIChyYnVmKSB7Ci0JCQl0aXBjX2JlYXJlcl9zZW5kKGJfcHRyLCByYnVmLCAmbWVkaWFfYWRkcik7CisJCQl0aXBjX2Rpc2NfaW5pdF9tc2cocmJ1ZiwgRFNDX1JFU1BfTVNHLCBiZWFyZXIpOworCQkJdGlwY19iZWFyZXJfc2VuZChiZWFyZXItPmlkZW50aXR5LCByYnVmLCAmbWFkZHIpOwogCQkJa2ZyZWVfc2tiKHJidWYpOwogCQl9CiAJfQotCi0JdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIH0KIAogLyoqCkBAIC0zMDMsNyArMzA2LDcgQEAKIAlzcGluX2xvY2tfYmgoJnJlcS0+bG9jayk7CiAKIAkvKiBTdG9wIHNlYXJjaGluZyBpZiBvbmx5IGRlc2lyZWQgbm9kZSBoYXMgYmVlbiBmb3VuZCAqLwotCWlmICh0aXBjX25vZGUocmVxLT5iZWFyZXItPmRvbWFpbikgJiYgcmVxLT5udW1fbm9kZXMpIHsKKwlpZiAodGlwY19ub2RlKHJlcS0+ZG9tYWluKSAmJiByZXEtPm51bV9ub2RlcykgewogCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX0lOQUNUSVZFOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzE1LDcgKzMxOCw3IEBACiAJICogaG9sZCBhdCBmYXN0IHBvbGxpbmcgcmF0ZSBpZiBkb24ndCBoYXZlIGFueSBhc3NvY2lhdGVkIG5vZGVzLAogCSAqIG90aGVyd2lzZSBob2xkIGF0IHNsb3cgcG9sbGluZyByYXRlCiAJICovCi0JdGlwY19iZWFyZXJfc2VuZChyZXEtPmJlYXJlciwgcmVxLT5idWYsICZyZXEtPmRlc3QpOworCXRpcGNfYmVhcmVyX3NlbmQocmVxLT5iZWFyZXJfaWQsIHJlcS0+YnVmLCAmcmVxLT5kZXN0KTsKIAogCiAJcmVxLT50aW1lcl9pbnR2ICo9IDI7CkBAIC0zNDcsMjEgKzM1MCwyMyBAQAogCWlmICghcmVxKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcS0+YnVmID0gdGlwY19kaXNjX2luaXRfbXNnKERTQ19SRVFfTVNHLCBiX3B0cik7CisJcmVxLT5idWYgPSB0aXBjX2J1Zl9hY3F1aXJlKElOVF9IX1NJWkUpOwogCWlmICghcmVxLT5idWYpIHsKIAkJa2ZyZWUocmVxKTsKLQkJcmV0dXJuIC1FTk9NU0c7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXRpcGNfZGlzY19pbml0X21zZyhyZXEtPmJ1ZiwgRFNDX1JFUV9NU0csIGJfcHRyKTsKIAltZW1jcHkoJnJlcS0+ZGVzdCwgZGVzdCwgc2l6ZW9mKCpkZXN0KSk7Ci0JcmVxLT5iZWFyZXIgPSBiX3B0cjsKKwlyZXEtPmJlYXJlcl9pZCA9IGJfcHRyLT5pZGVudGl0eTsKKwlyZXEtPmRvbWFpbiA9IGJfcHRyLT5kb21haW47CiAJcmVxLT5udW1fbm9kZXMgPSAwOwogCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfSU5JVDsKIAlzcGluX2xvY2tfaW5pdCgmcmVxLT5sb2NrKTsKIAlrX2luaXRfdGltZXIoJnJlcS0+dGltZXIsIChIYW5kbGVyKWRpc2NfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpcmVxKTsKIAlrX3N0YXJ0X3RpbWVyKCZyZXEtPnRpbWVyLCByZXEtPnRpbWVyX2ludHYpOwogCWJfcHRyLT5saW5rX3JlcSA9IHJlcTsKLQl0aXBjX2JlYXJlcl9zZW5kKHJlcS0+YmVhcmVyLCByZXEtPmJ1ZiwgJnJlcS0+ZGVzdCk7CisJdGlwY19iZWFyZXJfc2VuZChyZXEtPmJlYXJlcl9pZCwgcmVxLT5idWYsICZyZXEtPmRlc3QpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzYsMyArMzgxLDIzIEBACiAJa2ZyZWVfc2tiKHJlcS0+YnVmKTsKIAlrZnJlZShyZXEpOwogfQorCisvKioKKyAqIHRpcGNfZGlzY19yZXNldCAtIHJlc2V0IG9iamVjdCB0byBzZW5kIHBlcmlvZGljIGxpbmsgc2V0dXAgcmVxdWVzdHMKKyAqIEBiX3B0cjogcHRyIHRvIGJlYXJlciBpc3N1aW5nIHJlcXVlc3RzCisgKiBAZGVzdF9kb21haW46IG5ldHdvcmsgZG9tYWluIHRvIHdoaWNoIGxpbmtzIGNhbiBiZSBlc3RhYmxpc2hlZAorICovCit2b2lkIHRpcGNfZGlzY19yZXNldChzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKQoreworCXN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEgPSBiX3B0ci0+bGlua19yZXE7CisKKwlzcGluX2xvY2tfYmgoJnJlcS0+bG9jayk7CisJdGlwY19kaXNjX2luaXRfbXNnKHJlcS0+YnVmLCBEU0NfUkVRX01TRywgYl9wdHIpOworCXJlcS0+YmVhcmVyX2lkID0gYl9wdHItPmlkZW50aXR5OworCXJlcS0+ZG9tYWluID0gYl9wdHItPmRvbWFpbjsKKwlyZXEtPm51bV9ub2RlcyA9IDA7CisJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9JTklUOworCWtfc3RhcnRfdGltZXIoJnJlcS0+dGltZXIsIHJlcS0+dGltZXJfaW50dik7CisJdGlwY19iZWFyZXJfc2VuZChyZXEtPmJlYXJlcl9pZCwgcmVxLT5idWYsICZyZXEtPmRlc3QpOworCXNwaW5fdW5sb2NrX2JoKCZyZXEtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuaCBiL25ldC90aXBjL2Rpc2NvdmVyLmgKaW5kZXggMDdmMzQ3Mi4uNTE1YjU3MyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGlzY292ZXIuaAorKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5oCkBAIC00MSw2ICs0MSw3IEBACiAKIGludCB0aXBjX2Rpc2NfY3JlYXRlKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpOwogdm9pZCB0aXBjX2Rpc2NfZGVsZXRlKHN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEpOwordm9pZCB0aXBjX2Rpc2NfcmVzZXQoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CiB2b2lkIHRpcGNfZGlzY19hZGRfZGVzdChzdHJ1Y3QgdGlwY19saW5rX3JlcSAqcmVxKTsKIHZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEpOwogdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZXRoX21lZGlhLmMgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwppbmRleCA2N2NmM2Y5Li41ZTE0MjZmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ldGhfbWVkaWEuYworKysgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9ldGhfbWVkaWEuYzogRXRoZXJuZXQgYmVhcmVyIHN1cHBvcnQgZm9yIFRJUEMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNywgMjAxMywgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA3LCAyMDEzLTIwMTQsIEVyaWNzc29uIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgMjAxMS0yMDEzLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMzcsMzkgKzM3LDUyIEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImJlYXJlci5oIgogCi0jZGVmaW5lIEVUSF9BRERSX09GRlNFVAk0CS8qIG1lc3NhZ2UgaGVhZGVyIG9mZnNldCBvZiBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBFVEhfQUREUl9PRkZTRVQgIDQgIC8qIE1BQyBhZGRyIHBvc2l0aW9uIGluc2lkZSBhZGRyZXNzIGZpZWxkICovCiAKLS8qIGNvbnZlcnQgRXRoZXJuZXQgYWRkcmVzcyB0byBzdHJpbmcgKi8KLXN0YXRpYyBpbnQgdGlwY19ldGhfYWRkcjJzdHIoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqc3RyX2J1ZiwKLQkJCSAgICAgaW50IHN0cl9zaXplKQorLyogQ29udmVydCBFdGhlcm5ldCBhZGRyZXNzIChtZWRpYSBhZGRyZXNzIGZvcm1hdCkgdG8gc3RyaW5nICovCitzdGF0aWMgaW50IHRpcGNfZXRoX2FkZHIyc3RyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCisJCQkgICAgIGNoYXIgKnN0cmJ1ZiwgaW50IGJ1ZnN6KQogewotCWlmIChzdHJfc2l6ZSA8IDE4KQkvKiAxOCA9IHN0cmxlbigiYWE6YmI6Y2M6ZGQ6ZWU6ZmZcMCIpICovCisJaWYgKGJ1ZnN6IDwgMTgpCS8qIDE4ID0gc3RybGVuKCJhYTpiYjpjYzpkZDplZTpmZlwwIikgKi8KIAkJcmV0dXJuIDE7CiAKLQlzcHJpbnRmKHN0cl9idWYsICIlcE0iLCBhLT52YWx1ZSk7CisJc3ByaW50ZihzdHJidWYsICIlcE0iLCBhZGRyLT52YWx1ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNvbnZlcnQgRXRoZXJuZXQgYWRkcmVzcyBmb3JtYXQgdG8gbWVzc2FnZSBoZWFkZXIgZm9ybWF0ICovCi1zdGF0aWMgaW50IHRpcGNfZXRoX2FkZHIybXNnKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKm1zZ19hcmVhKQorLyogQ29udmVydCBmcm9tIG1lZGlhIGFkZHJlc3MgZm9ybWF0IHRvIGRpc2NvdmVyeSBtZXNzYWdlIGFkZHIgZm9ybWF0ICovCitzdGF0aWMgaW50IHRpcGNfZXRoX2FkZHIybXNnKGNoYXIgKm1zZywgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkcikKIHsKLQltZW1zZXQobXNnX2FyZWEsIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKLQltc2dfYXJlYVtUSVBDX01FRElBX1RZUEVfT0ZGU0VUXSA9IFRJUENfTUVESUFfVFlQRV9FVEg7Ci0JbWVtY3B5KG1zZ19hcmVhICsgRVRIX0FERFJfT0ZGU0VULCBhLT52YWx1ZSwgRVRIX0FMRU4pOworCW1lbXNldChtc2csIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKKwltc2dbVElQQ19NRURJQV9UWVBFX09GRlNFVF0gPSBUSVBDX01FRElBX1RZUEVfRVRIOworCW1lbWNweShtc2cgKyBFVEhfQUREUl9PRkZTRVQsIGFkZHItPnZhbHVlLCBFVEhfQUxFTik7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNvbnZlcnQgbWVzc2FnZSBoZWFkZXIgYWRkcmVzcyBmb3JtYXQgdG8gRXRoZXJuZXQgZm9ybWF0ICovCi1zdGF0aWMgaW50IHRpcGNfZXRoX21zZzJhZGRyKGNvbnN0IHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyLAotCQkJICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICptc2dfYXJlYSkKKy8qIENvbnZlcnQgcmF3IG1hYyBhZGRyZXNzIGZvcm1hdCB0byBtZWRpYSBhZGRyIGZvcm1hdCAqLworc3RhdGljIGludCB0aXBjX2V0aF9yYXcyYWRkcihzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCisJCQkgICAgIGNoYXIgKm1zZykKIHsKLQlpZiAobXNnX2FyZWFbVElQQ19NRURJQV9UWVBFX09GRlNFVF0gIT0gVElQQ19NRURJQV9UWVBFX0VUSCkKLQkJcmV0dXJuIDE7CisJY2hhciBiY2FzdF9tYWNbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCi0JdGlwY19sMl9tZWRpYV9hZGRyX3NldCh0Yl9wdHIsIGEsIG1zZ19hcmVhICsgRVRIX0FERFJfT0ZGU0VUKTsKKwltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CisJZXRoZXJfYWRkcl9jb3B5KGFkZHItPnZhbHVlLCBtc2cpOworCWFkZHItPm1lZGlhX2lkID0gVElQQ19NRURJQV9UWVBFX0VUSDsKKwlhZGRyLT5icm9hZGNhc3QgPSAhbWVtY21wKGFkZHItPnZhbHVlLCBiY2FzdF9tYWMsIEVUSF9BTEVOKTsKIAlyZXR1cm4gMDsKIH0KIAorLyogQ29udmVydCBkaXNjb3ZlcnkgbXNnIGFkZHIgZm9ybWF0IHRvIEV0aGVybmV0IG1lZGlhIGFkZHIgZm9ybWF0ICovCitzdGF0aWMgaW50IHRpcGNfZXRoX21zZzJhZGRyKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkciwKKwkJCSAgICAgY2hhciAqbXNnKQoreworCS8qIFNraXAgcGFzdCBwcmVhbWJsZTogKi8KKwltc2cgKz0gRVRIX0FERFJfT0ZGU0VUOworCXJldHVybiB0aXBjX2V0aF9yYXcyYWRkcihiLCBhZGRyLCBtc2cpOworfQorCiAvKiBFdGhlcm5ldCBtZWRpYSByZWdpc3RyYXRpb24gaW5mbyAqLwogc3RydWN0IHRpcGNfbWVkaWEgZXRoX21lZGlhX2luZm8gPSB7CiAJLnNlbmRfbXNnCT0gdGlwY19sMl9zZW5kX21zZywKQEAgLTc4LDYgKzkxLDcgQEAKIAkuYWRkcjJzdHIJPSB0aXBjX2V0aF9hZGRyMnN0ciwKIAkuYWRkcjJtc2cJPSB0aXBjX2V0aF9hZGRyMm1zZywKIAkubXNnMmFkZHIJPSB0aXBjX2V0aF9tc2cyYWRkciwKKwkucmF3MmFkZHIJPSB0aXBjX2V0aF9yYXcyYWRkciwKIAkucHJpb3JpdHkJPSBUSVBDX0RFRl9MSU5LX1BSSSwKIAkudG9sZXJhbmNlCT0gVElQQ19ERUZfTElOS19UT0wsCiAJLndpbmRvdwkJPSBUSVBDX0RFRl9MSU5LX1dJTiwKQEAgLTg1LDQgKzk5LDMgQEAKIAkuaHdhZGRyX2xlbgk9IEVUSF9BTEVOLAogCS5uYW1lCQk9ICJldGgiCiB9OwotCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9oYW5kbGVyLmMgYi9uZXQvdGlwYy9oYW5kbGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYWJmMTYuLjAwMDAwMDAKLS0tIGEvbmV0L3RpcGMvaGFuZGxlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBuZXQvdGlwYy9oYW5kbGVyLmM6IFRJUEMgc2lnbmFsIGhhbmRsaW5nCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvcmUuaCIKLQotc3RydWN0IHF1ZXVlX2l0ZW0gewotCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9zaWduYWw7Ci0Jdm9pZCAoKmhhbmRsZXIpICh1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci19OwotCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRpcGNfcXVldWVfaXRlbV9jYWNoZTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNpZ25hbF9xdWV1ZV9oZWFkOwotc3RhdGljIERFRklORV9TUElOTE9DSyhxaXRlbV9sb2NrKTsKLXN0YXRpYyBpbnQgaGFuZGxlcl9lbmFibGVkIF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc2lnbmFsX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwotCi1zdGF0aWMgREVDTEFSRV9UQVNLTEVUX0RJU0FCTEVEKHRpcGNfdGFza2xldCwgcHJvY2Vzc19zaWduYWxfcXVldWUsIDApOwotCi0KLXVuc2lnbmVkIGludCB0aXBjX2tfc2lnbmFsKEhhbmRsZXIgcm91dGluZSwgdW5zaWduZWQgbG9uZyBhcmd1bWVudCkKLXsKLQlzdHJ1Y3QgcXVldWVfaXRlbSAqaXRlbTsKLQotCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7Ci0JaWYgKCFoYW5kbGVyX2VuYWJsZWQpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOwotCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX0KLQotCWl0ZW0gPSBrbWVtX2NhY2hlX2FsbG9jKHRpcGNfcXVldWVfaXRlbV9jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpdGVtKSB7Ci0JCXByX2VycigiU2lnbmFsIHF1ZXVlIG91dCBvZiBtZW1vcnlcbiIpOwotCQlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlpdGVtLT5oYW5kbGVyID0gcm91dGluZTsKLQlpdGVtLT5kYXRhID0gYXJndW1lbnQ7Ci0JbGlzdF9hZGRfdGFpbCgmaXRlbS0+bmV4dF9zaWduYWwsICZzaWduYWxfcXVldWVfaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOwotCXRhc2tsZXRfc2NoZWR1bGUoJnRpcGNfdGFza2xldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc2lnbmFsX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCi17Ci0Jc3RydWN0IHF1ZXVlX2l0ZW0gKl9fdm9sYXRpbGVfXyBpdGVtOwotCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpuOwotCi0Jc3Bpbl9sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJnNpZ25hbF9xdWV1ZV9oZWFkKSB7Ci0JCWl0ZW0gPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBxdWV1ZV9pdGVtLCBuZXh0X3NpZ25hbCk7Ci0JCWxpc3RfZGVsKCZpdGVtLT5uZXh0X3NpZ25hbCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLQkJaXRlbS0+aGFuZGxlcihpdGVtLT5kYXRhKTsKLQkJc3Bpbl9sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLQkJa21lbV9jYWNoZV9mcmVlKHRpcGNfcXVldWVfaXRlbV9jYWNoZSwgaXRlbSk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLX0KLQotaW50IHRpcGNfaGFuZGxlcl9zdGFydCh2b2lkKQotewotCXRpcGNfcXVldWVfaXRlbV9jYWNoZSA9Ci0JCWttZW1fY2FjaGVfY3JlYXRlKCJ0aXBjX3F1ZXVlX2l0ZW1zIiwgc2l6ZW9mKHN0cnVjdCBxdWV1ZV9pdGVtKSwKLQkJCQkgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCF0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JSU5JVF9MSVNUX0hFQUQoJnNpZ25hbF9xdWV1ZV9oZWFkKTsKLQl0YXNrbGV0X2VuYWJsZSgmdGlwY190YXNrbGV0KTsKLQloYW5kbGVyX2VuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi12b2lkIHRpcGNfaGFuZGxlcl9zdG9wKHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47Ci0Jc3RydWN0IHF1ZXVlX2l0ZW0gKml0ZW07Ci0KLQlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOwotCWlmICghaGFuZGxlcl9lbmFibGVkKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQloYW5kbGVyX2VuYWJsZWQgPSAwOwotCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKLQotCXRhc2tsZXRfa2lsbCgmdGlwY190YXNrbGV0KTsKLQotCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZzaWduYWxfcXVldWVfaGVhZCkgewotCQlpdGVtID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcXVldWVfaXRlbSwgbmV4dF9zaWduYWwpOwotCQlsaXN0X2RlbCgmaXRlbS0+bmV4dF9zaWduYWwpOwotCQlrbWVtX2NhY2hlX2ZyZWUodGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBpdGVtKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOwotCi0Ja21lbV9jYWNoZV9kZXN0cm95KHRpcGNfcXVldWVfaXRlbV9jYWNoZSk7Ci19CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9pYl9tZWRpYS5jIGIvbmV0L3RpcGMvaWJfbWVkaWEuYwppbmRleCA4NDRhNzdlLi44NTIyZWVmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9pYl9tZWRpYS5jCisrKyBiL25ldC90aXBjL2liX21lZGlhLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAiYmVhcmVyLmgiCiAKLS8qIGNvbnZlcnQgSW5maW5pQmFuZCBhZGRyZXNzIHRvIHN0cmluZyAqLworLyogY29udmVydCBJbmZpbmlCYW5kIGFkZHJlc3MgKG1lZGlhIGFkZHJlc3MgZm9ybWF0KSBtZWRpYSBhZGRyZXNzIHRvIHN0cmluZyAqLwogc3RhdGljIGludCB0aXBjX2liX2FkZHIyc3RyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKnN0cl9idWYsCiAJCQkgICAgaW50IHN0cl9zaXplKQogewpAQCAtNTQsMjMgKzU0LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNvbnZlcnQgSW5maW5pQmFuZCBhZGRyZXNzIGZvcm1hdCB0byBtZXNzYWdlIGhlYWRlciBmb3JtYXQgKi8KLXN0YXRpYyBpbnQgdGlwY19pYl9hZGRyMm1zZyhzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICptc2dfYXJlYSkKKy8qIENvbnZlcnQgZnJvbSBtZWRpYSBhZGRyZXNzIGZvcm1hdCB0byBkaXNjb3ZlcnkgbWVzc2FnZSBhZGRyIGZvcm1hdCAqLworc3RhdGljIGludCB0aXBjX2liX2FkZHIybXNnKGNoYXIgKm1zZywgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkcikKIHsKLQltZW1zZXQobXNnX2FyZWEsIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKLQltc2dfYXJlYVtUSVBDX01FRElBX1RZUEVfT0ZGU0VUXSA9IFRJUENfTUVESUFfVFlQRV9JQjsKLQltZW1jcHkobXNnX2FyZWEsIGEtPnZhbHVlLCBJTkZJTklCQU5EX0FMRU4pOworCW1lbXNldChtc2csIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKKwltZW1jcHkobXNnLCBhZGRyLT52YWx1ZSwgSU5GSU5JQkFORF9BTEVOKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogY29udmVydCBtZXNzYWdlIGhlYWRlciBhZGRyZXNzIGZvcm1hdCB0byBJbmZpbmlCYW5kIGZvcm1hdCAqLwotc3RhdGljIGludCB0aXBjX2liX21zZzJhZGRyKGNvbnN0IHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyLAotCQkJICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKm1zZ19hcmVhKQorLyogQ29udmVydCByYXcgSW5maW5pQmFuZCBhZGRyZXNzIGZvcm1hdCB0byBtZWRpYSBhZGRyIGZvcm1hdCAqLworc3RhdGljIGludCB0aXBjX2liX3JhdzJhZGRyKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyLAorCQkJICAgIGNoYXIgKm1zZykKIHsKLQl0aXBjX2wyX21lZGlhX2FkZHJfc2V0KHRiX3B0ciwgYSwgbXNnX2FyZWEpOworCW1lbXNldChhZGRyLCAwLCBzaXplb2YoKmFkZHIpKTsKKwltZW1jcHkoYWRkci0+dmFsdWUsIG1zZywgSU5GSU5JQkFORF9BTEVOKTsKKwlhZGRyLT5tZWRpYV9pZCA9IFRJUENfTUVESUFfVFlQRV9JQjsKKwlhZGRyLT5icm9hZGNhc3QgPSAhbWVtY21wKG1zZywgYi0+YmNhc3RfYWRkci52YWx1ZSwKKwkJCQkgIElORklOSUJBTkRfQUxFTik7CiAJcmV0dXJuIDA7CiB9CiAKKy8qIENvbnZlcnQgZGlzY292ZXJ5IG1zZyBhZGRyIGZvcm1hdCB0byBJbmZpbmlCYW5kIG1lZGlhIGFkZHIgZm9ybWF0ICovCitzdGF0aWMgaW50IHRpcGNfaWJfbXNnMmFkZHIoc3RydWN0IHRpcGNfYmVhcmVyICpiLAorCQkJICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCisJCQkgICAgY2hhciAqbXNnKQoreworCXJldHVybiB0aXBjX2liX3JhdzJhZGRyKGIsIGFkZHIsIG1zZyk7Cit9CisKIC8qIEluZmluaUJhbmQgbWVkaWEgcmVnaXN0cmF0aW9uIGluZm8gKi8KIHN0cnVjdCB0aXBjX21lZGlhIGliX21lZGlhX2luZm8gPSB7CiAJLnNlbmRfbXNnCT0gdGlwY19sMl9zZW5kX21zZywKQEAgLTc5LDYgKzkxLDcgQEAKIAkuYWRkcjJzdHIJPSB0aXBjX2liX2FkZHIyc3RyLAogCS5hZGRyMm1zZwk9IHRpcGNfaWJfYWRkcjJtc2csCiAJLm1zZzJhZGRyCT0gdGlwY19pYl9tc2cyYWRkciwKKwkucmF3MmFkZHIJPSB0aXBjX2liX3JhdzJhZGRyLAogCS5wcmlvcml0eQk9IFRJUENfREVGX0xJTktfUFJJLAogCS50b2xlcmFuY2UJPSBUSVBDX0RFRl9MSU5LX1RPTCwKIAkud2luZG93CQk9IFRJUENfREVGX0xJTktfV0lOLApAQCAtODYsNCArOTksMyBAQAogCS5od2FkZHJfbGVuCT0gSU5GSU5JQkFORF9BTEVOLAogCS5uYW1lCQk9ICJpYiIKIH07Ci0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwppbmRleCBjNTE5MGFiLi5hZDJjNTdmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9saW5rLmMKKysrIGIvbmV0L3RpcGMvbGluay5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImxpbmsuaCIKICNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAic29ja2V0LmgiCiAjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgogI2luY2x1ZGUgImRpc2NvdmVyLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCkBAIC0xMDEsOSArMTAyLDE4IEBACiAKIHN0YXRpYyB2b2lkIGxpbmtfaW5pdF9tYXhfcGt0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogeworCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHI7CiAJdTMyIG1heF9wa3Q7CiAKLQltYXhfcGt0ID0gKGxfcHRyLT5iX3B0ci0+bXR1ICYgfjMpOworCXJjdV9yZWFkX2xvY2soKTsKKwliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGJlYXJlcl9saXN0W2xfcHRyLT5iZWFyZXJfaWRdKTsKKwlpZiAoIWJfcHRyKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCW1heF9wa3QgPSAoYl9wdHItPm10dSAmIH4zKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCWlmIChtYXhfcGt0ID4gTUFYX01TR19TSVpFKQogCQltYXhfcGt0ID0gTUFYX01TR19TSVpFOwogCkBAIC0yNDgsNyArMjU4LDcgQEAKIAlsX3B0ci0+b3duZXIgPSBuX3B0cjsKIAlsX3B0ci0+Y2hlY2twb2ludCA9IDE7CiAJbF9wdHItPnBlZXJfc2Vzc2lvbiA9IElOVkFMSURfU0VTU0lPTjsKLQlsX3B0ci0+Yl9wdHIgPSBiX3B0cjsKKwlsX3B0ci0+YmVhcmVyX2lkID0gYl9wdHItPmlkZW50aXR5OwogCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxfcHRyLCBiX3B0ci0+dG9sZXJhbmNlKTsKIAlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOwogCkBAIC0yNjMsNiArMjczLDcgQEAKIAlsX3B0ci0+cHJpb3JpdHkgPSBiX3B0ci0+cHJpb3JpdHk7CiAJdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMobF9wdHIsIGJfcHRyLT53aW5kb3cpOwogCisJbF9wdHItPm5ldF9wbGFuZSA9IGJfcHRyLT5uZXRfcGxhbmU7CiAJbGlua19pbml0X21heF9wa3QobF9wdHIpOwogCiAJbF9wdHItPm5leHRfb3V0X25vID0gMTsKQEAgLTI4NywxNCArMjk4LDE0IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uobl9wdHIsICZ0aXBjX25vZGVfbGlzdCwgbGlzdCkgewotCQlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJdGlwY19ub2RlX2xvY2sobl9wdHIpOwogCQlsX3B0ciA9IG5fcHRyLT5saW5rc1tiZWFyZXJfaWRdOwogCQlpZiAobF9wdHIpIHsKIAkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CiAJCQlpZiAoc2h1dHRpbmdfZG93biB8fCAhdGlwY19ub2RlX2lzX3VwKG5fcHRyKSkgewogCQkJCXRpcGNfbm9kZV9kZXRhY2hfbGluayhsX3B0ci0+b3duZXIsIGxfcHRyKTsKIAkJCQl0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKGxfcHRyKTsKLQkJCQlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOworCQkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCiAJCQkJLyogTm9ib2R5IGVsc2UgY2FuIGFjY2VzcyB0aGlzIGxpbmsgbm93OiAqLwogCQkJCWRlbF90aW1lcl9zeW5jKCZsX3B0ci0+dGltZXIpOwpAQCAtMzAyLDEyICszMTMsMTIgQEAKIAkJCX0gZWxzZSB7CiAJCQkJLyogRGV0YWNoL2RlbGV0ZSB3aGVuIGZhaWxvdmVyIGlzIGZpbmlzaGVkOiAqLwogCQkJCWxfcHRyLT5mbGFncyB8PSBMSU5LX1NUT1BQRUQ7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKIAkJCQlkZWxfdGltZXJfc3luYygmbF9wdHItPnRpbWVyKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7CisJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTM4OCw5ICszOTksOCBAQAogICovCiB2b2lkIHRpcGNfbGlua19yZXNldF9mcmFnbWVudHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7Ci0Ja2ZyZWVfc2tiKGxfcHRyLT5yZWFzbV9oZWFkKTsKLQlsX3B0ci0+cmVhc21faGVhZCA9IE5VTEw7Ci0JbF9wdHItPnJlYXNtX3RhaWwgPSBOVUxMOworCWtmcmVlX3NrYihsX3B0ci0+cmVhc21fYnVmKTsKKwlsX3B0ci0+cmVhc21fYnVmID0gTlVMTDsKIH0KIAogLyoqCkBAIC00MjYsNyArNDM2LDcgQEAKIAkJcmV0dXJuOwogCiAJdGlwY19ub2RlX2xpbmtfZG93bihsX3B0ci0+b3duZXIsIGxfcHRyKTsKLQl0aXBjX2JlYXJlcl9yZW1vdmVfZGVzdChsX3B0ci0+Yl9wdHIsIGxfcHRyLT5hZGRyKTsKKwl0aXBjX2JlYXJlcl9yZW1vdmVfZGVzdChsX3B0ci0+YmVhcmVyX2lkLCBsX3B0ci0+YWRkcik7CiAKIAlpZiAod2FzX2FjdGl2ZV9saW5rICYmIHRpcGNfbm9kZV9hY3RpdmVfbGlua3MobF9wdHItPm93bmVyKSkgewogCQlsX3B0ci0+cmVzZXRfY2hlY2twb2ludCA9IGNoZWNrcG9pbnQ7CkBAIC00NjQsMTEgKzQ3NCwxMSBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5fcHRyLCAmdGlwY19ub2RlX2xpc3QsIGxpc3QpIHsKLQkJc3Bpbl9sb2NrX2JoKCZuX3B0ci0+bG9jayk7CisJCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKIAkJbF9wdHIgPSBuX3B0ci0+bGlua3NbYmVhcmVyX2lkXTsKIAkJaWYgKGxfcHRyKQogCQkJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKLQkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtNDc3LDcgKzQ4Nyw3IEBACiB7CiAJbF9wdHItPm5leHRfaW5fbm8gPSBsX3B0ci0+c3RhdHMucmVjdl9pbmZvID0gMTsKIAl0aXBjX25vZGVfbGlua191cChsX3B0ci0+b3duZXIsIGxfcHRyKTsKLQl0aXBjX2JlYXJlcl9hZGRfZGVzdChsX3B0ci0+Yl9wdHIsIGxfcHRyLT5hZGRyKTsKKwl0aXBjX2JlYXJlcl9hZGRfZGVzdChsX3B0ci0+YmVhcmVyX2lkLCBsX3B0ci0+YWRkcik7CiB9CiAKIC8qKgpAQCAtNzc3LDcgKzc4Nyw3IEBACiAJaWYgKGxpa2VseSghbGlua19jb25nZXN0ZWQobF9wdHIpKSkgewogCQlsaW5rX2FkZF90b19vdXRxdWV1ZShsX3B0ciwgYnVmLCBtc2cpOwogCi0JCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcik7CisJCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJlYXJlcl9pZCwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpOwogCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOwogCQlyZXR1cm4gZHN6OwogCX0KQEAgLTgyNSw3ICs4MzUsNiBAQAogCXN0cnVjdCB0aXBjX25vZGUgKm5fcHRyOwogCWludCByZXMgPSAtRUxJTktDT05HOwogCi0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAluX3B0ciA9IHRpcGNfbm9kZV9maW5kKGRlc3QpOwogCWlmIChuX3B0cikgewogCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CkBAIC04MzgsNyArODQ3LDYgQEAKIAl9IGVsc2UgewogCQlrZnJlZV9za2IoYnVmKTsKIAl9Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTkwMiw3ICs5MTAsNiBAQAogCWlmIChsaXN0X2VtcHR5KG1lc3NhZ2VfbGlzdCkpCiAJCXJldHVybjsKIAotCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJbl9wdHIgPSB0aXBjX25vZGVfZmluZChkZXN0KTsKIAlpZiAobl9wdHIpIHsKIAkJdGlwY19ub2RlX2xvY2sobl9wdHIpOwpAQCAtOTE3LDcgKzkyNCw2IEBACiAJCX0KIAkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CiAJfQotCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAogCS8qIGRpc2NhcmQgdGhlIG1lc3NhZ2VzIGlmIHRoZXkgY291bGRuJ3QgYmUgc2VudCAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShidWYsIHRlbXBfYnVmLCAoKHN0cnVjdCBza19idWZmICopbWVzc2FnZV9saXN0KSkgewpAQCAtOTQxLDcgKzk0Nyw3IEBACiAJaWYgKGxpa2VseSghbGlua19jb25nZXN0ZWQobF9wdHIpKSkgewogCQlpZiAobGlrZWx5KG1zZ19zaXplKG1zZykgPD0gbF9wdHItPm1heF9wa3QpKSB7CiAJCQlsaW5rX2FkZF90b19vdXRxdWV1ZShsX3B0ciwgYnVmLCBtc2cpOwotCQkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwKKwkJCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJlYXJlcl9pZCwgYnVmLAogCQkJCQkgJmxfcHRyLT5tZWRpYV9hZGRyKTsKIAkJCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CiAJCQlyZXR1cm4gcmVzOwpAQCAtOTc5LDcgKzk4NSw2IEBACiAJaWYgKHVubGlrZWx5KHJlcyA8IDApKQogCQlyZXR1cm4gcmVzOwogCi0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAlub2RlID0gdGlwY19ub2RlX2ZpbmQoZGVzdGFkZHIpOwogCWlmIChsaWtlbHkobm9kZSkpIHsKIAkJdGlwY19ub2RlX2xvY2sobm9kZSk7CkBAIC05OTAsNyArOTk1LDYgQEAKIAkJCQkJCQkgICZzZW5kZXItPm1heF9wa3QpOwogZXhpdDoKIAkJCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwotCQkJCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAkJCQlyZXR1cm4gcmVzOwogCQkJfQogCkBAIC0xMDA3LDcgKzEwMTEsNiBAQAogCQkJICovCiAJCQlzZW5kZXItPm1heF9wa3QgPSBsX3B0ci0+bWF4X3BrdDsKIAkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0JCQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAKIAogCQkJaWYgKChtc2dfaGRyX3N6KGhkcikgKyByZXMpIDw9IHNlbmRlci0+bWF4X3BrdCkKQEAgLTEwMTgsNyArMTAyMSw2IEBACiAJCX0KIAkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAl9Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCiAJLyogQ291bGRuJ3QgZmluZCBhIGxpbmsgdG8gdGhlIGRlc3RpbmF0aW9uIG5vZGUgKi8KIAlrZnJlZV9za2IoYnVmKTsKQEAgLTEyMDQsNyArMTIwNiw3IEBACiAJaWYgKHJfcV9zaXplICYmIGJ1ZikgewogCQltc2dfc2V0X2FjayhidWZfbXNnKGJ1ZiksIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKIAkJbXNnX3NldF9iY2FzdF9hY2soYnVmX21zZyhidWYpLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKLQkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKTsKKwkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+YmVhcmVyX2lkLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcik7CiAJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gbW9kKCsrcl9xX2hlYWQpOwogCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IC0tcl9xX3NpemU7CiAJCWxfcHRyLT5zdGF0cy5yZXRyYW5zbWl0dGVkKys7CkBAIC0xMjE2LDcgKzEyMTgsNyBAQAogCWlmIChidWYpIHsKIAkJbXNnX3NldF9hY2soYnVmX21zZyhidWYpLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CiAJCW1zZ19zZXRfYmNhc3RfYWNrKGJ1Zl9tc2coYnVmKSwgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7Ci0JCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcik7CisJCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJlYXJlcl9pZCwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpOwogCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOwogCQlrZnJlZV9za2IoYnVmKTsKIAkJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IE5VTEw7CkBAIC0xMjMzLDcgKzEyMzUsOCBAQAogCQlpZiAobW9kKG5leHQgLSBmaXJzdCkgPCBsX3B0ci0+cXVldWVfbGltaXRbMF0pIHsKIAkJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOwogCQkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKLQkJCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcik7CisJCQl0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iZWFyZXJfaWQsIGJ1ZiwKKwkJCQkJICZsX3B0ci0+bWVkaWFfYWRkcik7CiAJCQlpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikKIAkJCQltc2dfc2V0X3R5cGUobXNnLCBDTE9TRURfTVNHKTsKIAkJCWxfcHRyLT5uZXh0X291dCA9IGJ1Zi0+bmV4dDsKQEAgLTEyNTYsMzMgKzEyNTksMjQgQEAKIAl9IHdoaWxlICghcmVzKTsKIH0KIAotc3RhdGljIHZvaWQgbGlua19yZXNldF9hbGwodW5zaWduZWQgbG9uZyBhZGRyKQordm9pZCB0aXBjX2xpbmtfcmVzZXRfYWxsKHN0cnVjdCB0aXBjX25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IHRpcGNfbm9kZSAqbl9wdHI7CiAJY2hhciBhZGRyX3N0cmluZ1sxNl07CiAJdTMyIGk7CiAKLQlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCW5fcHRyID0gdGlwY19ub2RlX2ZpbmQoKHUzMilhZGRyKTsKLQlpZiAoIW5fcHRyKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQkJcmV0dXJuOwkvKiBub2RlIG5vIGxvbmdlciBleGlzdHMgKi8KLQl9Ci0KLQl0aXBjX25vZGVfbG9jayhuX3B0cik7CisJdGlwY19ub2RlX2xvY2sobm9kZSk7CiAKIAlwcl93YXJuKCJSZXNldHRpbmcgYWxsIGxpbmtzIHRvICVzXG4iLAotCQl0aXBjX2FkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIG5fcHRyLT5hZGRyKSk7CisJCXRpcGNfYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbm9kZS0+YWRkcikpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJaWYgKG5fcHRyLT5saW5rc1tpXSkgewotCQkJbGlua19wcmludChuX3B0ci0+bGlua3NbaV0sICJSZXNldHRpbmcgbGlua1xuIik7Ci0JCQl0aXBjX2xpbmtfcmVzZXQobl9wdHItPmxpbmtzW2ldKTsKKwkJaWYgKG5vZGUtPmxpbmtzW2ldKSB7CisJCQlsaW5rX3ByaW50KG5vZGUtPmxpbmtzW2ldLCAiUmVzZXR0aW5nIGxpbmtcbiIpOworCQkJdGlwY19saW5rX3Jlc2V0KG5vZGUtPmxpbmtzW2ldKTsKIAkJfQogCX0KIAotCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwotCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBsaW5rX3JldHJhbnNtaXRfZmFpbHVyZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKQEAgLTEzMTksMTAgKzEzMTMsOSBAQAogCQkJbl9wdHItPmJjbGluay5vb3Nfc3RhdGUsCiAJCQluX3B0ci0+YmNsaW5rLmxhc3Rfc2VudCk7CiAKLQkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcilsaW5rX3Jlc2V0X2FsbCwgKHVuc2lnbmVkIGxvbmcpbl9wdHItPmFkZHIpOwotCiAJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCisJCXRpcGNfYmNsaW5rX3NldF9mbGFncyhUSVBDX0JDTElOS19SRVNFVCk7CiAJCWxfcHRyLT5zdGFsZV9jb3VudCA9IDA7CiAJfQogfQpAQCAtMTM1Miw3ICsxMzQ1LDcgQEAKIAkJbXNnID0gYnVmX21zZyhidWYpOwogCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKIAkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKLQkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKTsKKwkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+YmVhcmVyX2lkLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcik7CiAJCWJ1ZiA9IGJ1Zi0+bmV4dDsKIAkJcmV0cmFuc21pdHMtLTsKIAkJbF9wdHItPnN0YXRzLnJldHJhbnNtaXR0ZWQrKzsKQEAgLTE0NDAsMTQgKzE0MzMsMTMgQEAKIC8qKgogICogdGlwY19yY3YgLSBwcm9jZXNzIFRJUEMgcGFja2V0cy9tZXNzYWdlcyBhcnJpdmluZyBmcm9tIG9mZi1ub2RlCiAgKiBAaGVhZDogcG9pbnRlciB0byBtZXNzYWdlIGJ1ZmZlciBjaGFpbgotICogQHRiX3B0cjogcG9pbnRlciB0byBiZWFyZXIgbWVzc2FnZSBhcnJpdmVkIG9uCisgKiBAYl9wdHI6IHBvaW50ZXIgdG8gYmVhcmVyIG1lc3NhZ2UgYXJyaXZlZCBvbgogICoKICAqIEludm9rZWQgd2l0aCBubyBsb2NrcyBoZWxkLiAgQmVhcmVyIHBvaW50ZXIgbXVzdCBwb2ludCB0byBhIHZhbGlkIGJlYXJlcgogICogc3RydWN0dXJlIChpLmUuIGNhbm5vdCBiZSBOVUxMKSwgYnV0IGJlYXJlciBjYW4gYmUgaW5hY3RpdmUuCiAgKi8KIHZvaWQgdGlwY19yY3Yoc3RydWN0IHNrX2J1ZmYgKmhlYWQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpCiB7Ci0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAl3aGlsZSAoaGVhZCkgewogCQlzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cjsKIAkJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CkBAIC0xNDk3LDE0ICsxNDg5LDE0IEBACiAJCQlnb3RvIHVubG9ja19kaXNjYXJkOwogCiAJCS8qIFZlcmlmeSB0aGF0IGNvbW11bmljYXRpb24gd2l0aCBub2RlIGlzIGN1cnJlbnRseSBhbGxvd2VkICovCi0JCWlmICgobl9wdHItPmJsb2NrX3NldHVwICYgV0FJVF9QRUVSX0RPV04pICYmCi0JCQltc2dfdXNlcihtc2cpID09IExJTktfUFJPVE9DT0wgJiYKLQkJCShtc2dfdHlwZShtc2cpID09IFJFU0VUX01TRyB8fAotCQkJIG1zZ190eXBlKG1zZykgPT0gQUNUSVZBVEVfTVNHKSAmJgotCQkJIW1zZ19yZWR1bmRhbnRfbGluayhtc2cpKQotCQkJbl9wdHItPmJsb2NrX3NldHVwICY9IH5XQUlUX1BFRVJfRE9XTjsKKwkJaWYgKChuX3B0ci0+YWN0aW9uX2ZsYWdzICYgVElQQ19XQUlUX1BFRVJfTElOS1NfRE9XTikgJiYKKwkJICAgIG1zZ191c2VyKG1zZykgPT0gTElOS19QUk9UT0NPTCAmJgorCQkgICAgKG1zZ190eXBlKG1zZykgPT0gUkVTRVRfTVNHIHx8CisJCSAgICBtc2dfdHlwZShtc2cpID09IEFDVElWQVRFX01TRykgJiYKKwkJICAgICFtc2dfcmVkdW5kYW50X2xpbmsobXNnKSkKKwkJCW5fcHRyLT5hY3Rpb25fZmxhZ3MgJj0gflRJUENfV0FJVF9QRUVSX0xJTktTX0RPV047CiAKLQkJaWYgKG5fcHRyLT5ibG9ja19zZXR1cCkKKwkJaWYgKHRpcGNfbm9kZV9ibG9ja2VkKG5fcHRyKSkKIAkJCWdvdG8gdW5sb2NrX2Rpc2NhcmQ7CiAKIAkJLyogVmFsaWRhdGUgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgaW5mbyAqLwpAQCAtMTU4MSwxNyArMTU3MywxMiBAQAogCQkJfQogCQkJbXNnID0gYnVmX21zZyhidWYpOwogCQl9IGVsc2UgaWYgKG1zZ191c2VyKG1zZykgPT0gTVNHX0ZSQUdNRU5URVIpIHsKLQkJCWludCByYzsKLQogCQkJbF9wdHItPnN0YXRzLnJlY3ZfZnJhZ21lbnRzKys7Ci0JCQlyYyA9IHRpcGNfbGlua19mcmFnX3JjdigmbF9wdHItPnJlYXNtX2hlYWQsCi0JCQkJCQkmbF9wdHItPnJlYXNtX3RhaWwsCi0JCQkJCQkmYnVmKTsKLQkJCWlmIChyYyA9PSBMSU5LX1JFQVNNX0NPTVBMRVRFKSB7CisJCQlpZiAodGlwY19idWZfYXBwZW5kKCZsX3B0ci0+cmVhc21fYnVmLCAmYnVmKSkgewogCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQrKzsKIAkJCQltc2cgPSBidWZfbXNnKGJ1Zik7CiAJCQl9IGVsc2UgewotCQkJCWlmIChyYyA9PSBMSU5LX1JFQVNNX0VSUk9SKQorCQkJCWlmICghbF9wdHItPnJlYXNtX2J1ZikKIAkJCQkJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKIAkJCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKIAkJCQljb250aW51ZTsKQEAgLTE2MDQsNyArMTU5MSw3IEBACiAJCWNhc2UgVElQQ19ISUdIX0lNUE9SVEFOQ0U6CiAJCWNhc2UgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFOgogCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7Ci0JCQl0aXBjX3BvcnRfcmN2KGJ1Zik7CisJCQl0aXBjX3NrX3JjdihidWYpOwogCQkJY29udGludWU7CiAJCWNhc2UgTVNHX0JVTkRMRVI6CiAJCQlsX3B0ci0+c3RhdHMucmVjdl9idW5kbGVzKys7CkBAIC0xNjM1LDcgKzE2MjIsNiBAQAogZGlzY2FyZDoKIAkJa2ZyZWVfc2tiKGJ1Zik7CiAJfQotCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIH0KIAogLyoqCkBAIC0xNzQ3LDEyICsxNzMzLDEyIEBACiAJCXJldHVybjsKIAogCS8qIEFib3J0IG5vbi1SRVNFVCBzZW5kIGlmIGNvbW11bmljYXRpb24gd2l0aCBub2RlIGlzIHByb2hpYml0ZWQgKi8KLQlpZiAoKGxfcHRyLT5vd25lci0+YmxvY2tfc2V0dXApICYmIChtc2dfdHlwICE9IFJFU0VUX01TRykpCisJaWYgKCh0aXBjX25vZGVfYmxvY2tlZChsX3B0ci0+b3duZXIpKSAmJiAobXNnX3R5cCAhPSBSRVNFVF9NU0cpKQogCQlyZXR1cm47CiAKIAkvKiBDcmVhdGUgcHJvdG9jb2wgbWVzc2FnZSB3aXRoICJvdXQtb2Ytc2VxdWVuY2UiIHNlcXVlbmNlIG51bWJlciAqLwogCW1zZ19zZXRfdHlwZShtc2csIG1zZ190eXApOwotCW1zZ19zZXRfbmV0X3BsYW5lKG1zZywgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOworCW1zZ19zZXRfbmV0X3BsYW5lKG1zZywgbF9wdHItPm5ldF9wbGFuZSk7CiAJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKIAltc2dfc2V0X2xhc3RfYmNhc3QobXNnLCB0aXBjX2JjbGlua19nZXRfbGFzdF9zZW50KCkpOwogCkBAIC0xODE4LDcgKzE4MDQsNyBAQAogCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCWJ1Zi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAKLQl0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpOworCXRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJlYXJlcl9pZCwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpOwogCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CiAJa2ZyZWVfc2tiKGJ1Zik7CiB9CkBAIC0xODQwLDEyICsxODI2LDkgQEAKIAlpZiAobF9wdHItPmV4cF9tc2dfY291bnQpCiAJCWdvdG8gZXhpdDsKIAotCS8qIHJlY29yZCB1bm51bWJlcmVkIHBhY2tldCBhcnJpdmFsIChmb3JjZSBtaXNtYXRjaCBvbiBuZXh0IHRpbWVvdXQpICovCi0JbF9wdHItPmNoZWNrcG9pbnQtLTsKLQotCWlmIChsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSAhPSBtc2dfbmV0X3BsYW5lKG1zZykpCisJaWYgKGxfcHRyLT5uZXRfcGxhbmUgIT0gbXNnX25ldF9wbGFuZShtc2cpKQogCQlpZiAodGlwY19vd25fYWRkciA+IG1zZ19wcmV2bm9kZShtc2cpKQotCQkJbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUgPSBtc2dfbmV0X3BsYW5lKG1zZyk7CisJCQlsX3B0ci0+bmV0X3BsYW5lID0gbXNnX25ldF9wbGFuZShtc2cpOwogCiAJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CiAKQEAgLTE4NjIsNyArMTg0NSw3IEBACiAJCQkgKiBwZWVyIGhhcyBsb3N0IGNvbnRhY3QgLS0gZG9uJ3QgYWxsb3cgcGVlcidzIGxpbmtzCiAJCQkgKiB0byByZWFjdGl2YXRlIGJlZm9yZSB3ZSByZWNvZ25pemUgbG9zcyAmIGNsZWFuIHVwCiAJCQkgKi8KLQkJCWxfcHRyLT5vd25lci0+YmxvY2tfc2V0dXAgPSBXQUlUX05PREVfRE9XTjsKKwkJCWxfcHRyLT5vd25lci0+YWN0aW9uX2ZsYWdzIHw9IFRJUENfV0FJVF9PV05fTElOS1NfRE9XTjsKIAkJfQogCiAJCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFJFU0VUX01TRyk7CkBAIC0xOTE4LDYgKzE5MDEsMTAgQEAKIAkJCXRpcGNfbGlua19yZXNldChsX3B0cik7IC8qIEVuZm9yY2UgY2hhbmdlIHRvIHRha2UgZWZmZWN0ICovCiAJCQlicmVhazsKIAkJfQorCisJCS8qIFJlY29yZCByZWNlcHRpb247IGZvcmNlIG1pc21hdGNoIGF0IG5leHQgdGltZW91dDogKi8KKwkJbF9wdHItPmNoZWNrcG9pbnQtLTsKKwogCQlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBUUkFGRklDX01TR19FVlQpOwogCQlsX3B0ci0+c3RhdHMucmVjdl9zdGF0ZXMrKzsKIAkJaWYgKGxpbmtfcmVzZXRfdW5rbm93bihsX3B0cikpCkBAIC0yMTc3LDkgKzIxNjQsNyBAQAogCQl9CiAJCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19GUkFHTUVOVEVSKSB7CiAJCQlsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKLQkJCXRpcGNfbGlua19mcmFnX3JjdigmbF9wdHItPnJlYXNtX2hlYWQsCi0JCQkJCSAgICZsX3B0ci0+cmVhc21fdGFpbCwKLQkJCQkJICAgJmJ1Zik7CisJCQl0aXBjX2J1Zl9hcHBlbmQoJmxfcHRyLT5yZWFzbV9idWYsICZidWYpOwogCQl9CiAJfQogZXhpdDoKQEAgLTIzMTcsNTMgKzIzMDIsNiBAQAogCXJldHVybiBkc3o7CiB9CiAKLS8qIHRpcGNfbGlua19mcmFnX3JjdigpOiBDYWxsZWQgd2l0aCBub2RlIGxvY2sgb24uIFJldHVybnMKLSAqIHRoZSByZWFzc2VtYmxlZCBidWZmZXIgaWYgbWVzc2FnZSBpcyBjb21wbGV0ZS4KLSAqLwotaW50IHRpcGNfbGlua19mcmFnX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsIHN0cnVjdCBza19idWZmICoqdGFpbCwKLQkJICAgICAgIHN0cnVjdCBza19idWZmICoqZmJ1ZikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZyA9ICpmYnVmOwotCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhmcmFnKTsKLQl1MzIgZnJhZ2lkID0gbXNnX3R5cGUobXNnKTsKLQlib29sIGhlYWRzdG9sZW47Ci0JaW50IGRlbHRhOwotCi0Jc2tiX3B1bGwoZnJhZywgbXNnX2hkcl9zeihtc2cpKTsKLQlpZiAoZnJhZ2lkID09IEZJUlNUX0ZSQUdNRU5UKSB7Ci0JCWlmICgqaGVhZCB8fCBza2JfdW5jbG9uZShmcmFnLCBHRlBfQVRPTUlDKSkKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCSpoZWFkID0gZnJhZzsKLQkJc2tiX2ZyYWdfbGlzdF9pbml0KCpoZWFkKTsKLQkJKmZidWYgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKCpoZWFkICYmCi0JCSAgIHNrYl90cnlfY29hbGVzY2UoKmhlYWQsIGZyYWcsICZoZWFkc3RvbGVuLCAmZGVsdGEpKSB7Ci0JCWtmcmVlX3NrYl9wYXJ0aWFsKGZyYWcsIGhlYWRzdG9sZW4pOwotCX0gZWxzZSB7Ci0JCWlmICghKmhlYWQpCi0JCQlnb3RvIG91dF9mcmVlOwotCQlpZiAoIXNrYl9oYXNfZnJhZ19saXN0KCpoZWFkKSkKLQkJCXNrYl9zaGluZm8oKmhlYWQpLT5mcmFnX2xpc3QgPSBmcmFnOwotCQllbHNlCi0JCQkoKnRhaWwpLT5uZXh0ID0gZnJhZzsKLQkJKnRhaWwgPSBmcmFnOwotCQkoKmhlYWQpLT50cnVlc2l6ZSArPSBmcmFnLT50cnVlc2l6ZTsKLQl9Ci0JaWYgKGZyYWdpZCA9PSBMQVNUX0ZSQUdNRU5UKSB7Ci0JCSpmYnVmID0gKmhlYWQ7Ci0JCSp0YWlsID0gKmhlYWQgPSBOVUxMOwotCQlyZXR1cm4gTElOS19SRUFTTV9DT01QTEVURTsKLQl9Ci0JKmZidWYgPSBOVUxMOwotCXJldHVybiAwOwotb3V0X2ZyZWU6Ci0JcHJfd2Fybl9yYXRlbGltaXRlZCgiTGluayB1bmFibGUgdG8gcmVhc3NlbWJsZSBmcmFnbWVudGVkIG1lc3NhZ2VcbiIpOwotCWtmcmVlX3NrYigqZmJ1Zik7Ci0JKmZidWYgPSBOVUxMOwotCXJldHVybiBMSU5LX1JFQVNNX0VSUk9SOwotfQotCiBzdGF0aWMgdm9pZCBsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdTMyIHRvbGVyYW5jZSkKIHsKIAlpZiAoKHRvbGVyYW5jZSA8IFRJUENfTUlOX0xJTktfVE9MKSB8fCAodG9sZXJhbmNlID4gVElQQ19NQVhfTElOS19UT0wpKQpAQCAtMjM5Nyw4ICsyMzM1LDYgQEAKIC8qIHRpcGNfbGlua19maW5kX293bmVyIC0gbG9jYXRlIG93bmVyIG5vZGUgb2YgbGluayBieSBsaW5rJ3MgbmFtZQogICogQG5hbWU6IHBvaW50ZXIgdG8gbGluayBuYW1lIHN0cmluZwogICogQGJlYXJlcl9pZDogcG9pbnRlciB0byBpbmRleCBpbiAnbm9kZS0+bGlua3MnIGFycmF5IHdoZXJlIHRoZSBsaW5rIHdhcyBmb3VuZC4KLSAqIENhbGxlciBtdXN0IGhvbGQgJ3RpcGNfbmV0X2xvY2snIHRvIGVuc3VyZSBub2RlIGFuZCBiZWFyZXIgYXJlIG5vdCBkZWxldGVkOwotICogdGhpcyBhbHNvIHByZXZlbnRzIGxpbmsgZGVsZXRpb24uCiAgKgogICogUmV0dXJucyBwb2ludGVyIHRvIG5vZGUgb3duaW5nIHRoZSBsaW5rLCBvciAwIGlmIG5vIG1hdGNoaW5nIGxpbmsgaXMgZm91bmQuCiAgKi8KQEAgLTI0NjAsNyArMjM5Niw3IEBACiAgKiBAbmV3X3ZhbHVlOiBuZXcgdmFsdWUgb2YgbGluaywgYmVhcmVyLCBvciBtZWRpYSBzZXR0aW5nCiAgKiBAY21kOiB3aGljaCBsaW5rLCBiZWFyZXIsIG9yIG1lZGlhIGF0dHJpYnV0ZSB0byBzZXQgKFRJUENfQ01EX1NFVF9MSU5LXyopCiAgKgotICogQ2FsbGVyIG11c3QgaG9sZCAndGlwY19uZXRfbG9jaycgdG8gZW5zdXJlIGxpbmsvYmVhcmVyL21lZGlhIGlzIG5vdCBkZWxldGVkLgorICogQ2FsbGVyIG11c3QgaG9sZCBSVE5MIGxvY2sgdG8gZW5zdXJlIGxpbmsvYmVhcmVyL21lZGlhIGlzIG5vdCBkZWxldGVkLgogICoKICAqIFJldHVybnMgMCBpZiB2YWx1ZSB1cGRhdGVkIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KICAqLwpAQCAtMjU2Niw5ICsyNTAyLDcgQEAKIAkJCQkJCSAgICIgKGNhbm5vdCBjaGFuZ2Ugc2V0dGluZyBvbiBicm9hZGNhc3QgbGluaykiKTsKIAl9CiAKLQlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCXJlcyA9IGxpbmtfY21kX3NldF92YWx1ZShhcmdzLT5uYW1lLCBuZXdfdmFsdWUsIGNtZCk7Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCWlmIChyZXMpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoImNhbm5vdCBjaGFuZ2UgbGluayBzZXR0aW5nIik7CiAKQEAgLTI2MDIsMjIgKzI1MzYsMTggQEAKIAkJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7CiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiAJfQotCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJbm9kZSA9IHRpcGNfbGlua19maW5kX293bmVyKGxpbmtfbmFtZSwgJmJlYXJlcl9pZCk7Ci0JaWYgKCFub2RlKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlpZiAoIW5vZGUpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7Ci0JfQorCiAJdGlwY19ub2RlX2xvY2sobm9kZSk7CiAJbF9wdHIgPSBub2RlLT5saW5rc1tiZWFyZXJfaWRdOwogCWlmICghbF9wdHIpIHsKIAkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKLQkJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJsaW5rIG5vdCBmb3VuZCIpOwogCX0KIAlsaW5rX3Jlc2V0X3N0YXRpc3RpY3MobF9wdHIpOwogCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiB9CiAKQEAgLTI2NTAsMTggKzI1ODAsMTUgQEAKIAlpZiAoIXN0cmNtcChuYW1lLCB0aXBjX2JjbGlua19uYW1lKSkKIAkJcmV0dXJuIHRpcGNfYmNsaW5rX3N0YXRzKGJ1ZiwgYnVmX3NpemUpOwogCi0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAlub2RlID0gdGlwY19saW5rX2ZpbmRfb3duZXIobmFtZSwgJmJlYXJlcl9pZCk7Ci0JaWYgKCFub2RlKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlpZiAoIW5vZGUpCiAJCXJldHVybiAwOwotCX0KKwogCXRpcGNfbm9kZV9sb2NrKG5vZGUpOwogCiAJbCA9IG5vZGUtPmxpbmtzW2JlYXJlcl9pZF07CiAJaWYgKCFsKSB7CiAJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzI3LDcgKzI2NTQsNiBAQAogCQkJICAgICAocy0+YWNjdV9xdWV1ZV9zeiAvIHMtPnF1ZXVlX3N6X2NvdW50cykgOiAwKTsKIAogCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3NzgsNyArMjcwNCw2IEBACiAJaWYgKGRlc3QgPT0gdGlwY19vd25fYWRkcikKIAkJcmV0dXJuIE1BWF9NU0dfU0laRTsKIAotCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJbl9wdHIgPSB0aXBjX25vZGVfZmluZChkZXN0KTsKIAlpZiAobl9wdHIpIHsKIAkJdGlwY19ub2RlX2xvY2sobl9wdHIpOwpAQCAtMjc4NywxMyArMjcxMiwxOCBAQAogCQkJcmVzID0gbF9wdHItPm1heF9wa3Q7CiAJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCX0KLQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHZvaWQgbGlua19wcmludChzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgY29uc3QgY2hhciAqc3RyKQogewotCXByX2luZm8oIiVzIExpbmsgJXg8JXM+OiIsIHN0ciwgbF9wdHItPmFkZHIsIGxfcHRyLT5iX3B0ci0+bmFtZSk7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGJlYXJlcl9saXN0W2xfcHRyLT5iZWFyZXJfaWRdKTsKKwlpZiAoYl9wdHIpCisJCXByX2luZm8oIiVzIExpbmsgJXg8JXM+OiIsIHN0ciwgbF9wdHItPmFkZHIsIGJfcHRyLT5uYW1lKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChsaW5rX3dvcmtpbmdfdW5rbm93bihsX3B0cikpCiAJCXByX2NvbnQoIjpXVVxuIik7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmggYi9uZXQvdGlwYy9saW5rLmgKaW5kZXggOGMwYjQ5Yi4uMjAwZDUxOCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5oCisrKyBiL25ldC90aXBjL2xpbmsuaApAQCAtNDAsMTEgKzQwLDYgQEAKICNpbmNsdWRlICJtc2cuaCIKICNpbmNsdWRlICJub2RlLmgiCiAKLS8qIExpbmsgcmVhc3NlbWJseSBzdGF0dXMgY29kZXMKLSAqLwotI2RlZmluZSBMSU5LX1JFQVNNX0VSUk9SCS0xCi0jZGVmaW5lIExJTktfUkVBU01fQ09NUExFVEUJMQotCiAvKiBPdXQtb2YtcmFuZ2UgdmFsdWUgZm9yIGxpbmsgc2VxdWVuY2UgbnVtYmVycwogICovCiAjZGVmaW5lIElOVkFMSURfTElOS19TRVEgMHgxMDAwMApAQCAtMTA3LDcgKzEwMiw3IEBACiAgKiBAY2hlY2twb2ludDogcmVmZXJlbmNlIHBvaW50IGZvciB0cmlnZ2VyaW5nIGxpbmsgY29udGludWl0eSBjaGVja2luZwogICogQHBlZXJfc2Vzc2lvbjogbGluayBzZXNzaW9uICMgYmVpbmcgdXNlZCBieSBwZWVyIGVuZCBvZiBsaW5rCiAgKiBAcGVlcl9iZWFyZXJfaWQ6IGJlYXJlciBpZCB1c2VkIGJ5IGxpbmsncyBwZWVyIGVuZHBvaW50Ci0gKiBAYl9wdHI6IHBvaW50ZXIgdG8gYmVhcmVyIHVzZWQgYnkgbGluaworICogQGJlYXJlcl9pZDogbG9jYWwgYmVhcmVyIGlkIHVzZWQgYnkgbGluawogICogQHRvbGVyYW5jZTogbWluaW11bSBsaW5rIGNvbnRpbnVpdHkgbG9zcyBuZWVkZWQgdG8gcmVzZXQgbGluayBbaW4gbXNdCiAgKiBAY29udGludWl0eV9pbnRlcnZhbDogbGluayBjb250aW51aXR5IHRlc3RpbmcgaW50ZXJ2YWwgW2luIG1zXQogICogQGFib3J0X2xpbWl0OiAjIG9mIHVuYWNrbm93bGVkZ2VkIGNvbnRpbnVpdHkgcHJvYmVzIG5lZWRlZCB0byByZXNldCBsaW5rCkBAIC0xMTYsNiArMTExLDcgQEAKICAqIEBwcm90b19tc2c6IHRlbXBsYXRlIGZvciBjb250cm9sIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBsaW5rCiAgKiBAcG1zZzogY29udmVuaWVuY2UgcG9pbnRlciB0byAicHJvdG9fbXNnIiBmaWVsZAogICogQHByaW9yaXR5OiBjdXJyZW50IGxpbmsgcHJpb3JpdHkKKyAqIEBuZXRfcGxhbmU6IGN1cnJlbnQgbGluayBuZXR3b3JrIHBsYW5lICgnQScgdGhyb3VnaCAnSCcpCiAgKiBAcXVldWVfbGltaXQ6IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUgY29uZ2VzdGlvbiB0aHJlc2hvbGRzIChpbmRleGVkIGJ5IHVzZXIpCiAgKiBAZXhwX21zZ19jb3VudDogIyBvZiB0dW5uZWxsZWQgbWVzc2FnZXMgZXhwZWN0ZWQgZHVyaW5nIGxpbmsgY2hhbmdlb3ZlcgogICogQHJlc2V0X2NoZWNrcG9pbnQ6IHNlcSAjIG9mIGxhc3QgYWNrbm93bGVkZ2VkIG1lc3NhZ2UgYXQgdGltZSBvZiBsaW5rIHJlc2V0CkBAIC0xMzksOCArMTM1LDcgQEAKICAqIEBuZXh0X291dDogcHRyIHRvIGZpcnN0IHVuc2VudCBvdXRib3VuZCBtZXNzYWdlIGluIHF1ZXVlCiAgKiBAd2FpdGluZ19wb3J0czogbGlua2VkIGxpc3Qgb2YgcG9ydHMgd2FpdGluZyBmb3IgbGluayBjb25nZXN0aW9uIHRvIGFiYXRlCiAgKiBAbG9uZ19tc2dfc2VxX25vOiBuZXh0IGlkZW50aWZpZXIgdG8gdXNlIGZvciBvdXRib3VuZCBmcmFnbWVudGVkIG1lc3NhZ2VzCi0gKiBAcmVhc21faGVhZDogbGlzdCBoZWFkIG9mIHBhcnRpYWxseSByZWFzc2VtYmxlZCBpbmJvdW5kIG1lc3NhZ2UgZnJhZ21lbnRzCi0gKiBAcmVhc21fdGFpbDogbGFzdCBmcmFnbWVudCByZWNlaXZlZAorICogQHJlYXNtX2J1ZjogaGVhZCBvZiBwYXJ0aWFsbHkgcmVhc3NlbWJsZWQgaW5ib3VuZCBtZXNzYWdlIGZyYWdtZW50cwogICogQHN0YXRzOiBjb2xsZWN0cyBzdGF0aXN0aWNzIHJlZ2FyZGluZyBsaW5rIGFjdGl2aXR5CiAgKi8KIHN0cnVjdCB0aXBjX2xpbmsgewpAQCAtMTU1LDcgKzE1MCw3IEBACiAJdTMyIGNoZWNrcG9pbnQ7CiAJdTMyIHBlZXJfc2Vzc2lvbjsKIAl1MzIgcGVlcl9iZWFyZXJfaWQ7Ci0Jc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKKwl1MzIgYmVhcmVyX2lkOwogCXUzMiB0b2xlcmFuY2U7CiAJdTMyIGNvbnRpbnVpdHlfaW50ZXJ2YWw7CiAJdTMyIGFib3J0X2xpbWl0OwpAQCAtMTY3LDYgKzE2Miw3IEBACiAJfSBwcm90b19tc2c7CiAJc3RydWN0IHRpcGNfbXNnICpwbXNnOwogCXUzMiBwcmlvcml0eTsKKwljaGFyIG5ldF9wbGFuZTsKIAl1MzIgcXVldWVfbGltaXRbMTVdOwkvKiBxdWV1ZV9saW1pdFswXT09d2luZG93IGxpbWl0ICovCiAKIAkvKiBDaGFuZ2VvdmVyICovCkBAIC0yMDIsOCArMTk4LDcgQEAKIAogCS8qIEZyYWdtZW50YXRpb24vcmVhc3NlbWJseSAqLwogCXUzMiBsb25nX21zZ19zZXFfbm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnJlYXNtX2hlYWQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnJlYXNtX3RhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnJlYXNtX2J1ZjsKIAogCS8qIFN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgdGlwY19zdGF0cyBzdGF0czsKQEAgLTIyOCw2ICsyMjMsNyBAQAogCQkJCQkgaW50IHJlcV90bHZfc3BhY2UpOwogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbGlua19jbWRfcmVzZXRfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLAogCQkJCQkgIGludCByZXFfdGx2X3NwYWNlKTsKK3ZvaWQgdGlwY19saW5rX3Jlc2V0X2FsbChzdHJ1Y3QgdGlwY19ub2RlICpub2RlKTsKIHZvaWQgdGlwY19saW5rX3Jlc2V0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKIHZvaWQgdGlwY19saW5rX3Jlc2V0X2xpc3QodW5zaWduZWQgaW50IGJlYXJlcl9pZCk7CiBpbnQgdGlwY19saW5rX3htaXQoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIGRlc3QsIHUzMiBzZWxlY3Rvcik7CkBAIC0yMzksOSArMjM1LDYgQEAKIAkJCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1MzIgZGVzdG5vZGUpOwogdm9pZCB0aXBjX2xpbmtfYnVuZGxlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKLWludCB0aXBjX2xpbmtfZnJhZ19yY3Yoc3RydWN0IHNrX2J1ZmYgKipyZWFzbV9oZWFkLAotCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipyZWFzbV90YWlsLAotCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipmYnVmKTsKIHZvaWQgdGlwY19saW5rX3Byb3RvX3htaXQoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiBtc2dfdHlwLCBpbnQgcHJvYiwKIAkJCSAgdTMyIGdhcCwgdTMyIHRvbGVyYW5jZSwgdTMyIHByaW9yaXR5LCB1MzIgYWNrZWRfbXR1KTsKIHZvaWQgdGlwY19saW5rX3B1c2hfcXVldWUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmMgYi9uZXQvdGlwYy9tc2cuYwppbmRleCBlNTI1ZjhjLi44YmU2ZTk0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9tc2cuYworKysgYi9uZXQvdGlwYy9tc2cuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9tc2cuYzogVElQQyBtZXNzYWdlIGhlYWRlciByb3V0aW5lcwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIDIwMTQsIEVyaWNzc29uIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAtMjAxMSwgV2luZCBSaXZlciBTeXN0ZW1zCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTk5LDMgKzk5LDU2IEBACiAJfQogCXJldHVybiBkc3o7CiB9CisKKy8qIHRpcGNfYnVmX2FwcGVuZCgpOiBBcHBlbmQgYSBidWZmZXIgdG8gdGhlIGZyYWdtZW50IGxpc3Qgb2YgYW5vdGhlciBidWZmZXIKKyAqIExldCBmaXJzdCBidWZmZXIgYmVjb21lIGhlYWQgYnVmZmVyCisgKiBSZXR1cm5zIDEgYW5kIHNldHMgKmJ1ZiB0byBoZWFkYnVmIGlmIGNoYWluIGlzIGNvbXBsZXRlLCBvdGhlcndpc2UgMAorICogTGVhdmVzIGhlYWRidWYgcG9pbnRlciBhdCBOVUxMIGlmIGZhaWx1cmUKKyAqLworaW50IHRpcGNfYnVmX2FwcGVuZChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWRidWYsIHN0cnVjdCBza19idWZmICoqYnVmKQoreworCXN0cnVjdCBza19idWZmICpoZWFkID0gKmhlYWRidWY7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWcgPSAqYnVmOworCXN0cnVjdCBza19idWZmICp0YWlsOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhmcmFnKTsKKwl1MzIgZnJhZ2lkID0gbXNnX3R5cGUobXNnKTsKKwlib29sIGhlYWRzdG9sZW47CisJaW50IGRlbHRhOworCisJc2tiX3B1bGwoZnJhZywgbXNnX2hkcl9zeihtc2cpKTsKKworCWlmIChmcmFnaWQgPT0gRklSU1RfRlJBR01FTlQpIHsKKwkJaWYgKGhlYWQgfHwgc2tiX3VuY2xvbmUoZnJhZywgR0ZQX0FUT01JQykpCisJCQlnb3RvIG91dF9mcmVlOworCQloZWFkID0gKmhlYWRidWYgPSBmcmFnOworCQlza2JfZnJhZ19saXN0X2luaXQoaGVhZCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIWhlYWQpCisJCWdvdG8gb3V0X2ZyZWU7CisJdGFpbCA9IFRJUENfU0tCX0NCKGhlYWQpLT50YWlsOworCWlmIChza2JfdHJ5X2NvYWxlc2NlKGhlYWQsIGZyYWcsICZoZWFkc3RvbGVuLCAmZGVsdGEpKSB7CisJCWtmcmVlX3NrYl9wYXJ0aWFsKGZyYWcsIGhlYWRzdG9sZW4pOworCX0gZWxzZSB7CisJCWlmICghc2tiX2hhc19mcmFnX2xpc3QoaGVhZCkpCisJCQlza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QgPSBmcmFnOworCQllbHNlCisJCQl0YWlsLT5uZXh0ID0gZnJhZzsKKwkJaGVhZC0+dHJ1ZXNpemUgKz0gZnJhZy0+dHJ1ZXNpemU7CisJCWhlYWQtPmRhdGFfbGVuICs9IGZyYWctPmxlbjsKKwkJaGVhZC0+bGVuICs9IGZyYWctPmxlbjsKKwkJVElQQ19TS0JfQ0IoaGVhZCktPnRhaWwgPSBmcmFnOworCX0KKwlpZiAoZnJhZ2lkID09IExBU1RfRlJBR01FTlQpIHsKKwkJKmJ1ZiA9IGhlYWQ7CisJCVRJUENfU0tCX0NCKGhlYWQpLT50YWlsID0gTlVMTDsKKwkJKmhlYWRidWYgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisJKmJ1ZiA9IE5VTEw7CisJcmV0dXJuIDA7CitvdXRfZnJlZToKKwlwcl93YXJuX3JhdGVsaW1pdGVkKCJVbmFibGUgdG8gYnVpbGQgZnJhZ21lbnQgbGlzdFxuIik7CisJa2ZyZWVfc2tiKCpidWYpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmggYi9uZXQvdGlwYy9tc2cuaAppbmRleCA3NmQxMjY5Li41MDM1MTE5IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9tc2cuaAorKysgYi9uZXQvdGlwYy9tc2cuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9tc2cuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG1lc3NhZ2UgaGVhZGVyIHJvdXRpbmVzCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDcsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNywgMjAxNCwgRXJpY3Nzb24gQUIKICAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCAyMDEwLTIwMTEsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC03MTEsNCArNzExLDcgQEAKIAkJICAgdTMyIGRlc3Rub2RlKTsKIGludCB0aXBjX21zZ19idWlsZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKIAkJICAgdW5zaWduZWQgaW50IGxlbiwgaW50IG1heF9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1Zik7CisKK2ludCB0aXBjX2J1Zl9hcHBlbmQoc3RydWN0IHNrX2J1ZmYgKipoZWFkYnVmLCBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1Zik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCmluZGV4IGFmZjgwNDEuLjhjZTczMDkgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25hbWVfZGlzdHIuYworKysgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKQEAgLTM4LDM0ICszOCw2IEBACiAjaW5jbHVkZSAibGluay5oIgogI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKIAotI2RlZmluZSBJVEVNX1NJWkUgc2l6ZW9mKHN0cnVjdCBkaXN0cl9pdGVtKQotCi0vKioKLSAqIHN0cnVjdCBkaXN0cl9pdGVtIC0gcHVibGljYXRpb24gaW5mbyBkaXN0cmlidXRlZCB0byBvdGhlciBub2RlcwotICogQHR5cGU6IG5hbWUgc2VxdWVuY2UgdHlwZQotICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCi0gKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKLSAqIEByZWY6IHB1Ymxpc2hpbmcgcG9ydCByZWZlcmVuY2UKLSAqIEBrZXk6IHB1YmxpY2F0aW9uIGtleQotICoKLSAqID09PT4gQWxsIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gPD09PQotICoKLSAqIEZpcnN0IDMgZmllbGRzIGlkZW50aWZ5IChuYW1lIG9yKSBuYW1lIHNlcXVlbmNlIGJlaW5nIHB1Ymxpc2hlZC4KLSAqIFJlZmVyZW5jZSBmaWVsZCB1bmlxdWVseSBpZGVudGlmaWVzIHBvcnQgdGhhdCBwdWJsaXNoZWQgbmFtZSBzZXF1ZW5jZS4KLSAqIEtleSBmaWVsZCB1bmlxdWVseSBpZGVudGlmaWVzIHB1YmxpY2F0aW9uLCBpbiB0aGUgZXZlbnQgYSBwb3J0IGhhcwotICogbXVsdGlwbGUgcHVibGljYXRpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2VxdWVuY2UuCi0gKgotICogTm90ZTogVGhlcmUgaXMgbm8gZmllbGQgdGhhdCBpZGVudGlmaWVzIHRoZSBwdWJsaXNoaW5nIG5vZGUgYmVjYXVzZSBpdCBpcwotICogdGhlIHNhbWUgZm9yIGFsbCBpdGVtcyBjb250YWluZWQgd2l0aGluIGEgcHVibGljYXRpb24gbWVzc2FnZS4KLSAqLwotc3RydWN0IGRpc3RyX2l0ZW0gewotCV9fYmUzMiB0eXBlOwotCV9fYmUzMiBsb3dlcjsKLQlfX2JlMzIgdXBwZXI7Ci0JX19iZTMyIHJlZjsKLQlfX2JlMzIga2V5OwotfTsKLQogLyoqCiAgKiBzdHJ1Y3QgcHVibF9saXN0IC0gbGlzdCBvZiBwdWJsaWNhdGlvbnMgbWFkZSBieSB0aGlzIG5vZGUKICAqIEBsaXN0OiBjaXJjdWxhciBsaXN0IG9mIHB1YmxpY2F0aW9ucwpAQCAtMTI3LDcgKzk5LDcgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgdm9pZCBuYW1lZF9jbHVzdGVyX2Rpc3RyaWJ1dGUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3ZvaWQgbmFtZWRfY2x1c3Rlcl9kaXN0cmlidXRlKHN0cnVjdCBza19idWZmICpidWYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1Zl9jb3B5OwogCXN0cnVjdCB0aXBjX25vZGUgKm5fcHRyOwpAQCAtMTM1LDE4ICsxMDcsMTggQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShuX3B0ciwgJnRpcGNfbm9kZV9saXN0LCBsaXN0KSB7Ci0JCXNwaW5fbG9ja19iaCgmbl9wdHItPmxvY2spOworCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CiAJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tuX3B0ci0+YWRkciAmIDFdOwogCQlpZiAobF9wdHIpIHsKIAkJCWJ1Zl9jb3B5ID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghYnVmX2NvcHkpIHsKLQkJCQlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOworCQkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJbXNnX3NldF9kZXN0bm9kZShidWZfbXNnKGJ1Zl9jb3B5KSwgbl9wdHItPmFkZHIpOwogCQkJX190aXBjX2xpbmtfeG1pdChsX3B0ciwgYnVmX2NvcHkpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7CisJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtMTU2LDcgKzEyOCw3IEBACiAvKioKICAqIHRpcGNfbmFtZWRfcHVibGlzaCAtIHRlbGwgb3RoZXIgbm9kZXMgYWJvdXQgYSBuZXcgcHVibGljYXRpb24gYnkgdGhpcyBub2RlCiAgKi8KLXZvaWQgdGlwY19uYW1lZF9wdWJsaXNoKHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCkKK3N0cnVjdCBza19idWZmICp0aXBjX25hbWVkX3B1Ymxpc2goc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQogewogCXN0cnVjdCBza19idWZmICpidWY7CiAJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW07CkBAIC0xNjUsMjMgKzEzNywyMyBAQAogCXB1YmxfbGlzdHNbcHVibC0+c2NvcGVdLT5zaXplKys7CiAKIAlpZiAocHVibC0+c2NvcGUgPT0gVElQQ19OT0RFX1NDT1BFKQotCQlyZXR1cm47CisJCXJldHVybiBOVUxMOwogCiAJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoUFVCTElDQVRJT04sIElURU1fU0laRSwgMCk7CiAJaWYgKCFidWYpIHsKIAkJcHJfd2FybigiUHVibGljYXRpb24gZGlzdHJpYnV0aW9uIGZhaWx1cmVcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiBOVUxMOwogCX0KIAogCWl0ZW0gPSAoc3RydWN0IGRpc3RyX2l0ZW0gKiltc2dfZGF0YShidWZfbXNnKGJ1ZikpOwogCXB1YmxfdG9faXRlbShpdGVtLCBwdWJsKTsKLQluYW1lZF9jbHVzdGVyX2Rpc3RyaWJ1dGUoYnVmKTsKKwlyZXR1cm4gYnVmOwogfQogCiAvKioKICAqIHRpcGNfbmFtZWRfd2l0aGRyYXcgLSB0ZWxsIG90aGVyIG5vZGVzIGFib3V0IGEgd2l0aGRyYXduIHB1YmxpY2F0aW9uIGJ5IHRoaXMgbm9kZQogICovCi12b2lkIHRpcGNfbmFtZWRfd2l0aGRyYXcoc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQorc3RydWN0IHNrX2J1ZmYgKnRpcGNfbmFtZWRfd2l0aGRyYXcoc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQogewogCXN0cnVjdCBza19idWZmICpidWY7CiAJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW07CkBAIC0xOTAsMTcgKzE2MiwxNyBAQAogCXB1YmxfbGlzdHNbcHVibC0+c2NvcGVdLT5zaXplLS07CiAKIAlpZiAocHVibC0+c2NvcGUgPT0gVElQQ19OT0RFX1NDT1BFKQotCQlyZXR1cm47CisJCXJldHVybiBOVUxMOwogCiAJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoV0lUSERSQVdBTCwgSVRFTV9TSVpFLCAwKTsKIAlpZiAoIWJ1ZikgewogCQlwcl93YXJuKCJXaXRoZHJhd2FsIGRpc3RyaWJ1dGlvbiBmYWlsdXJlXG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlpdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEoYnVmX21zZyhidWYpKTsKIAlwdWJsX3RvX2l0ZW0oaXRlbSwgcHVibCk7Ci0JbmFtZWRfY2x1c3Rlcl9kaXN0cmlidXRlKGJ1Zik7CisJcmV0dXJuIGJ1ZjsKIH0KIAogLyoKQEAgLTIzOSwzMSArMjExLDkgQEAKIC8qKgogICogdGlwY19uYW1lZF9ub2RlX3VwIC0gdGVsbCBzcGVjaWZpZWQgbm9kZSBhYm91dCBhbGwgcHVibGljYXRpb25zIGJ5IHRoaXMgbm9kZQogICovCi12b2lkIHRpcGNfbmFtZWRfbm9kZV91cCh1bnNpZ25lZCBsb25nIG5vZGVhcmcpCit2b2lkIHRpcGNfbmFtZWRfbm9kZV91cCh1MzIgbWF4X2l0ZW1fYnVmLCB1MzIgbm9kZSkKIHsKLQlzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cjsKLQlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG1lc3NhZ2VfbGlzdDsKLQl1MzIgbm9kZSA9ICh1MzIpbm9kZWFyZzsKLQl1MzIgbWF4X2l0ZW1fYnVmID0gMDsKLQotCS8qIGNvbXB1dGUgbWF4aW11bSBhbW91bnQgb2YgcHVibGljYXRpb24gZGF0YSB0byBzZW5kIHBlciBtZXNzYWdlICovCi0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQluX3B0ciA9IHRpcGNfbm9kZV9maW5kKG5vZGUpOwotCWlmIChuX3B0cikgewotCQl0aXBjX25vZGVfbG9jayhuX3B0cik7Ci0JCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKLQkJaWYgKGxfcHRyKQotCQkJbWF4X2l0ZW1fYnVmID0gKChsX3B0ci0+bWF4X3BrdCAtIElOVF9IX1NJWkUpIC8KLQkJCQlJVEVNX1NJWkUpICogSVRFTV9TSVpFOwotCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCWlmICghbWF4X2l0ZW1fYnVmKQotCQlyZXR1cm47Ci0KLQkvKiBjcmVhdGUgbGlzdCBvZiBwdWJsaWNhdGlvbiBtZXNzYWdlcywgdGhlbiBzZW5kIHRoZW0gYXMgYSB1bml0ICovCi0JSU5JVF9MSVNUX0hFQUQoJm1lc3NhZ2VfbGlzdCk7CisJTElTVF9IRUFEKG1lc3NhZ2VfbGlzdCk7CiAKIAlyZWFkX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKIAluYW1lZF9kaXN0cmlidXRlKCZtZXNzYWdlX2xpc3QsIG5vZGUsICZwdWJsX2NsdXN0ZXIsIG1heF9pdGVtX2J1Zik7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmggYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmgKaW5kZXggOWIzMTJjYy4uYjJlZWQ0ZSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5oCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuaApAQCAtMzksOSArMzksMzggQEAKIAogI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKIAotdm9pZCB0aXBjX25hbWVkX3B1Ymxpc2goc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKTsKLXZvaWQgdGlwY19uYW1lZF93aXRoZHJhdyhzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpOwotdm9pZCB0aXBjX25hbWVkX25vZGVfdXAodW5zaWduZWQgbG9uZyBub2RlKTsKKyNkZWZpbmUgSVRFTV9TSVpFIHNpemVvZihzdHJ1Y3QgZGlzdHJfaXRlbSkKKworLyoqCisgKiBzdHJ1Y3QgZGlzdHJfaXRlbSAtIHB1YmxpY2F0aW9uIGluZm8gZGlzdHJpYnV0ZWQgdG8gb3RoZXIgbm9kZXMKKyAqIEB0eXBlOiBuYW1lIHNlcXVlbmNlIHR5cGUKKyAqIEBsb3dlcjogbmFtZSBzZXF1ZW5jZSBsb3dlciBib3VuZAorICogQHVwcGVyOiBuYW1lIHNlcXVlbmNlIHVwcGVyIGJvdW5kCisgKiBAcmVmOiBwdWJsaXNoaW5nIHBvcnQgcmVmZXJlbmNlCisgKiBAa2V5OiBwdWJsaWNhdGlvbiBrZXkKKyAqCisgKiA9PT0+IEFsbCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuIDw9PT0KKyAqCisgKiBGaXJzdCAzIGZpZWxkcyBpZGVudGlmeSAobmFtZSBvcikgbmFtZSBzZXF1ZW5jZSBiZWluZyBwdWJsaXNoZWQuCisgKiBSZWZlcmVuY2UgZmllbGQgdW5pcXVlbHkgaWRlbnRpZmllcyBwb3J0IHRoYXQgcHVibGlzaGVkIG5hbWUgc2VxdWVuY2UuCisgKiBLZXkgZmllbGQgdW5pcXVlbHkgaWRlbnRpZmllcyBwdWJsaWNhdGlvbiwgaW4gdGhlIGV2ZW50IGEgcG9ydCBoYXMKKyAqIG11bHRpcGxlIHB1YmxpY2F0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNlcXVlbmNlLgorICoKKyAqIE5vdGU6IFRoZXJlIGlzIG5vIGZpZWxkIHRoYXQgaWRlbnRpZmllcyB0aGUgcHVibGlzaGluZyBub2RlIGJlY2F1c2UgaXQgaXMKKyAqIHRoZSBzYW1lIGZvciBhbGwgaXRlbXMgY29udGFpbmVkIHdpdGhpbiBhIHB1YmxpY2F0aW9uIG1lc3NhZ2UuCisgKi8KK3N0cnVjdCBkaXN0cl9pdGVtIHsKKwlfX2JlMzIgdHlwZTsKKwlfX2JlMzIgbG93ZXI7CisJX19iZTMyIHVwcGVyOworCV9fYmUzMiByZWY7CisJX19iZTMyIGtleTsKK307CisKK3N0cnVjdCBza19idWZmICp0aXBjX25hbWVkX3B1Ymxpc2goc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKTsKK3N0cnVjdCBza19idWZmICp0aXBjX25hbWVkX3dpdGhkcmF3KHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCk7Cit2b2lkIG5hbWVkX2NsdXN0ZXJfZGlzdHJpYnV0ZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgdGlwY19uYW1lZF9ub2RlX3VwKHUzMiBtYXhfaXRlbV9idWYsIHUzMiBub2RlKTsKIHZvaWQgdGlwY19uYW1lZF9yY3Yoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CiB2b2lkIHRpcGNfbmFtZWRfcmVpbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmMgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKaW5kZXggMDQyZThlMy4uOWQ3ZDM3ZCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV90YWJsZS5jCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpAQCAtNjY0LDYgKzY2NCw3IEBACiAJCQkJCSB1MzIgc2NvcGUsIHUzMiBwb3J0X3JlZiwgdTMyIGtleSkKIHsKIAlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IE5VTEw7CiAKIAlpZiAodGFibGUubG9jYWxfcHVibF9jb3VudCA+PSBUSVBDX01BWF9QVUJMSUNBVElPTlMpIHsKIAkJcHJfd2FybigiUHVibGljYXRpb24gZmFpbGVkLCBsb2NhbCBwdWJsaWNhdGlvbiBsaW1pdCByZWFjaGVkICgldSlcbiIsCkBAIC02NzYsOSArNjc3LDEyIEBACiAJCQkJICAgdGlwY19vd25fYWRkciwgcG9ydF9yZWYsIGtleSk7CiAJaWYgKGxpa2VseShwdWJsKSkgewogCQl0YWJsZS5sb2NhbF9wdWJsX2NvdW50Kys7Ci0JCXRpcGNfbmFtZWRfcHVibGlzaChwdWJsKTsKKwkJYnVmID0gdGlwY19uYW1lZF9wdWJsaXNoKHB1YmwpOwogCX0KIAl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKworCWlmIChidWYpCisJCW5hbWVkX2NsdXN0ZXJfZGlzdHJpYnV0ZShidWYpOwogCXJldHVybiBwdWJsOwogfQogCkBAIC02ODgsMTUgKzY5MiwxOSBAQAogaW50IHRpcGNfbmFtZXRibF93aXRoZHJhdyh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgcmVmLCB1MzIga2V5KQogewogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCiAJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwogCXB1YmwgPSB0aXBjX25hbWV0YmxfcmVtb3ZlX3B1YmwodHlwZSwgbG93ZXIsIHRpcGNfb3duX2FkZHIsIHJlZiwga2V5KTsKIAlpZiAobGlrZWx5KHB1YmwpKSB7CiAJCXRhYmxlLmxvY2FsX3B1YmxfY291bnQtLTsKLQkJdGlwY19uYW1lZF93aXRoZHJhdyhwdWJsKTsKKwkJYnVmID0gdGlwY19uYW1lZF93aXRoZHJhdyhwdWJsKTsKIAkJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CiAJCWxpc3RfZGVsX2luaXQoJnB1YmwtPnBwb3J0X2xpc3QpOwogCQlrZnJlZShwdWJsKTsKKworCQlpZiAoYnVmKQorCQkJbmFtZWRfY2x1c3Rlcl9kaXN0cmlidXRlKGJ1Zik7CiAJCXJldHVybiAxOwogCX0KIAl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKQEAgLTk2MSw2ICs5NjksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdWJsLCBzYWZlLCAmaW5mby0+em9uZV9saXN0LCB6b25lX2xpc3QpIHsKIAkJdGlwY19uYW1ldGJsX3JlbW92ZV9wdWJsKHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCBwdWJsLT5ub2RlLAogCQkJCQkgcHVibC0+cmVmLCBwdWJsLT5rZXkpOworCQlrZnJlZShwdWJsKTsKIAl9CiB9CiAKQEAgLTk4Miw3ICs5OTEsNiBAQAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlcSwgc2FmZSwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKIAkJCXRpcGNfcHVyZ2VfcHVibGljYXRpb25zKHNlcSk7CiAJCX0KLQkJY29udGludWU7CiAJfQogCWtmcmVlKHRhYmxlLnR5cGVzKTsKIAl0YWJsZS50eXBlcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuYyBiL25ldC90aXBjL25ldC5jCmluZGV4IDRjNTY0ZWIuLmY2NDM3NWUgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldC5jCisrKyBiL25ldC90aXBjL25ldC5jCkBAIC0zOSw0NSArMzksNDEgQEAKICNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCiAjaW5jbHVkZSAic3Vic2NyLmgiCiAjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInNvY2tldC5oIgogI2luY2x1ZGUgIm5vZGUuaCIKICNpbmNsdWRlICJjb25maWcuaCIKIAogLyoKICAqIFRoZSBUSVBDIGxvY2tpbmcgcG9saWN5IGlzIGRlc2lnbmVkIHRvIGVuc3VyZSBhIHZlcnkgZmluZSBsb2NraW5nCiAgKiBncmFudWxhcml0eSwgcGVybWl0dGluZyBjb21wbGV0ZSBwYXJhbGxlbCBhY2Nlc3MgdG8gaW5kaXZpZHVhbAotICogcG9ydCBhbmQgbm9kZS9saW5rIGluc3RhbmNlcy4gVGhlIGNvZGUgY29uc2lzdHMgb2YgdGhyZWUgbWFqb3IKKyAqIHBvcnQgYW5kIG5vZGUvbGluayBpbnN0YW5jZXMuIFRoZSBjb2RlIGNvbnNpc3RzIG9mIGZvdXIgbWFqb3IKICAqIGxvY2tpbmcgZG9tYWlucywgZWFjaCBwcm90ZWN0ZWQgd2l0aCB0aGVpciBvd24gZGlzanVuY3Qgc2V0IG9mIGxvY2tzLgogICoKLSAqIDE6IFRoZSByb3V0aW5nIGhpZXJhcmNoeS4KLSAqICAgIENvbXByaXNlcyB0aGUgc3RydWN0dXJlcyAnem9uZScsICdjbHVzdGVyJywgJ25vZGUnLCAnbGluaycKLSAqICAgIGFuZCAnYmVhcmVyJy4gVGhlIHdob2xlIGhpZXJhcmNoeSBpcyBwcm90ZWN0ZWQgYnkgYSBiaWcKLSAqICAgIHJlYWQvd3JpdGUgbG9jaywgdGlwY19uZXRfbG9jaywgdG8gZW5zc3VyZSB0aGF0IG5vdGhpbmcgaXMgYWRkZWQKLSAqICAgIG9yIHJlbW92ZWQgd2hpbGUgY29kZSBpcyBhY2Nlc3NpbmcgYW55IG9mIHRoZXNlIHN0cnVjdHVyZXMuCi0gKiAgICBUaGlzIGxheWVyIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSB0d28gb3RoZXJzIHdoaWxlIHRoZXkKLSAqICAgIGhvbGQgYW55IG9mIHRoZWlyIG93biBsb2Nrcy4KLSAqICAgIE5laXRoZXIgbXVzdCBpdCBpdHNlbGYgZG8gYW55IHVwY2FsbHMgdG8gdGhlIG90aGVyIHR3byBiZWZvcmUKLSAqICAgIGl0IGhhcyByZWxlYXNlZCB0aXBjX25ldF9sb2NrIGFuZCBvdGhlciBwcm90ZWN0aXZlIGxvY2tzLgorICogMTogVGhlIGJlYXJlciBsZXZlbC4KKyAqICAgIFJUTkwgbG9jayBpcyB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUgcHJvY2VzcyBvZiBjb25maWd1cmluZyBiZWFyZXIKKyAqICAgIG9uIHVwZGF0ZSBzaWRlLCBhbmQgUkNVIGxvY2sgaXMgYXBwbGllZCBvbiByZWFkIHNpZGUgdG8gbWFrZQorICogICAgYmVhcmVyIGluc3RhbmNlIHZhbGlkIG9uIGJvdGggcGF0aHMgb2YgbWVzc2FnZSB0cmFuc21pc3Npb24gYW5kCisgKiAgICByZWNlcHRpb24uCiAgKgotICogICBXaXRoaW4gdGhlIHRpcGNfbmV0X2xvY2sgZG9tYWluIHRoZXJlIGFyZSB0d28gc3ViLWRvbWFpbnM7J25vZGUnIGFuZAotICogICAnYmVhcmVyJywgd2hlcmUgbG9jYWwgd3JpdGUgb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLAotICogICBwcm92aWRlZCB0aGF0IHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBzcGluX2xvY2tzCi0gKiAgIHBlciBpbnN0YW5jZS4gQ29kZSBob2xkaW5nIHRpcGNfbmV0X2xvY2socmVhZCkgYW5kIGEgbm9kZSBzcGluX2xvY2sKLSAqICAgaXMgcGVybWl0dGVkIHRvIHBva2UgYXJvdW5kIGluIGJvdGggdGhlIG5vZGUgaXRzZWxmIGFuZCBpdHMKLSAqICAgc3Vib3JkaW5hdGUgbGlua3MuIEkuZSwgaXQgY2FuIHVwZGF0ZSBsaW5rIGNvdW50ZXJzIGFuZCBxdWV1ZXMsCi0gKiAgIGNoYW5nZSBsaW5rIHN0YXRlLCBzZW5kIHByb3RvY29sIG1lc3NhZ2VzLCBhbmQgYWx0ZXIgdGhlCi0gKiAgICJhY3RpdmVfbGlua3MiIGFycmF5IGluIHRoZSBub2RlOyBidXQgaXQgY2FuIF9ub3RfIHJlbW92ZSBhIGxpbmsKLSAqICAgb3IgYSBub2RlIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlLgotICogICBDb3JyZXNwb25kaW5nbHksIGluZGl2aWR1YWwgYmVhcmVycyBtYXkgY2hhbmdlIHN0YXR1cyB3aXRoaW4gYQotICogICB0aXBjX25ldF9sb2NrKHJlYWQpLCBwcm90ZWN0ZWQgYnkgYW4gaW5kaXZpZHVhbCBzcGluX2xvY2sgYmVyIGJlYXJlcgotICogICBpbnN0YW5jZSwgYnV0IGl0IG5lZWRzIHRpcGNfbmV0X2xvY2sod3JpdGUpIHRvIHJlbW92ZS9hZGQgYW55IGJlYXJlcnMuCisgKiAyOiBUaGUgbm9kZSBhbmQgbGluayBsZXZlbC4KKyAqICAgIEFsbCBub2RlIGluc3RhbmNlcyBhcmUgc2F2ZWQgaW50byB0d28gdGlwY19ub2RlX2xpc3QgYW5kIG5vZGVfaHRhYmxlCisgKiAgICBsaXN0cy4gVGhlIHR3byBsaXN0cyBhcmUgcHJvdGVjdGVkIGJ5IG5vZGVfbGlzdF9sb2NrIG9uIHdyaXRlIHNpZGUsCisgKiAgICBhbmQgdGhleSBhcmUgZ3VhcmRlZCB3aXRoIFJDVSBsb2NrIG9uIHJlYWQgc2lkZS4gRXNwZWNpYWxseSBub2RlCisgKiAgICBpbnN0YW5jZSBpcyBkZXN0cm95ZWQgb25seSB3aGVuIFRJUEMgbW9kdWxlIGlzIHJlbW92ZWQsIGFuZCB3ZSBjYW4KKyAqICAgIGNvbmZpcm0gdGhhdCB0aGVyZSBoYXMgbm8gYW55IHVzZXIgd2hvIGlzIGFjY2Vzc2luZyB0aGUgbm9kZSBhdCB0aGUKKyAqICAgIG1vbWVudC4gVGhlcmVmb3JlLCBFeGNlcHQgZm9yIGl0ZXJhdGluZyB0aGUgdHdvIGxpc3RzIHdpdGhpbiBSQ1UKKyAqICAgIHByb3RlY3Rpb24sIGl0J3Mgbm8gbmVlZGVkIHRvIGhvbGQgUkNVIHRoYXQgd2UgYWNjZXNzIG5vZGUgaW5zdGFuY2UKKyAqICAgIGluIG90aGVyIHBsYWNlcy4KICAqCisgKiAgICBJbiBhZGRpdGlvbiwgYWxsIG1lbWJlcnMgaW4gbm9kZSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGxpbmsgaW5zdGFuY2VzCisgKiAgICBhcmUgcHJvdGVjdGVkIGJ5IG5vZGUgc3BpbiBsb2NrLgogICoKLSAqICAyOiBUaGUgdHJhbnNwb3J0IGxldmVsIG9mIHRoZSBwcm90b2NvbC4KLSAqICAgICBUaGlzIGNvbnNpc3RzIG9mIHRoZSBzdHJ1Y3R1cmVzIHBvcnQsIChhbmQgaXRzIHVzZXIgbGV2ZWwKLSAqICAgICByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdXNlcl9wb3J0IGFuZCB0aXBjX3NvY2spLCByZWZlcmVuY2UgYW5kCi0gKiAgICAgdGlwY191c2VyIChwb3J0LmMsIHJlZy5jLCBzb2NrZXQuYykuCisgKiAzOiBUaGUgdHJhbnNwb3J0IGxldmVsIG9mIHRoZSBwcm90b2NvbC4KKyAqICAgIFRoaXMgY29uc2lzdHMgb2YgdGhlIHN0cnVjdHVyZXMgcG9ydCwgKGFuZCBpdHMgdXNlciBsZXZlbAorICogICAgcmVwcmVzZW50YXRpb25zLCBzdWNoIGFzIHVzZXJfcG9ydCBhbmQgdGlwY19zb2NrKSwgcmVmZXJlbmNlIGFuZAorICogICAgdGlwY191c2VyIChwb3J0LmMsIHJlZy5jLCBzb2NrZXQuYykuCiAgKgotICogICAgIFRoaXMgbGF5ZXIgaGFzIGZvdXIgZGlmZmVyZW50IGxvY2tzOgorICogICAgVGhpcyBsYXllciBoYXMgZm91ciBkaWZmZXJlbnQgbG9ja3M6CiAgKiAgICAgLSBUaGUgdGlwY19wb3J0IHNwaW5fbG9jay4gVGhpcyBpcyBwcm90ZWN0aW5nIGVhY2ggcG9ydCBpbnN0YW5jZQogICogICAgICAgZnJvbSBwYXJhbGxlbCBkYXRhIGFjY2VzcyBhbmQgcmVtb3ZhbC4gU2luY2Ugd2UgY2FuIG5vdCBwbGFjZQogICogICAgICAgdGhpcyBsb2NrIGluIHRoZSBwb3J0IGl0c2VsZiwgaXQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZQpAQCAtOTYsNyArOTIsNyBAQAogICogICAgICAgVGhlcmUgYXJlIHR3byBzdWNoIGxpc3RzOyAncG9ydF9saXN0Jywgd2hpY2ggaXMgdXNlZCBmb3IgbWFuYWdlbWVudCwKICAqICAgICAgIGFuZCAnd2FpdF9saXN0Jywgd2hpY2ggaXMgdXNlZCB0byBxdWV1ZSBwb3J0cyBkdXJpbmcgY29uZ2VzdGlvbi4KICAqCi0gKiAgMzogVGhlIG5hbWUgdGFibGUgKG5hbWVfdGFibGUuYywgbmFtZV9kaXN0ci5jLCBzdWJzY3JpcHRpb24uYykKKyAqICA0OiBUaGUgbmFtZSB0YWJsZSAobmFtZV90YWJsZS5jLCBuYW1lX2Rpc3RyLmMsIHN1YnNjcmlwdGlvbi5jKQogICogICAgIC0gVGhlcmUgaXMgb25lIGJpZyByZWFkL3dyaXRlLWxvY2sgKHRpcGNfbmFtZXRibF9sb2NrKSBwcm90ZWN0aW5nIHRoZQogICogICAgICAgb3ZlcmFsbCBuYW1lIHRhYmxlIHN0cnVjdHVyZS4gTm90aGluZyBtdXN0IGJlIGFkZGVkL3JlbW92ZWQgdG8KICAqICAgICAgIHRoaXMgc3RydWN0dXJlIHdpdGhvdXQgaG9sZGluZyB3cml0ZSBhY2Nlc3MgdG8gaXQuCkBAIC0xMDgsOCArMTA0LDYgQEAKICAqICAgICAtIEEgbG9jYWwgc3Bpbl9sb2NrIHByb3RlY3RpbmcgdGhlIHF1ZXVlIG9mIHN1YnNjcmliZXIgZXZlbnRzLgogKi8KIAotREVGSU5FX1JXTE9DSyh0aXBjX25ldF9sb2NrKTsKLQogc3RhdGljIHZvaWQgbmV0X3JvdXRlX25hbWVkX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOwpAQCAtMTQ4LDcgKzE0Miw3IEBACiAJCQlpZiAobXNnX21jYXN0KG1zZykpCiAJCQkJdGlwY19wb3J0X21jYXN0X3JjdihidWYsIE5VTEwpOwogCQkJZWxzZSBpZiAobXNnX2Rlc3Rwb3J0KG1zZykpCi0JCQkJdGlwY19wb3J0X3JjdihidWYpOworCQkJCXRpcGNfc2tfcmN2KGJ1Zik7CiAJCQllbHNlCiAJCQkJbmV0X3JvdXRlX25hbWVkX21zZyhidWYpOwogCQkJcmV0dXJuOwpAQCAtMTcxLDIyICsxNjUsMjUgQEAKIAl0aXBjX2xpbmtfeG1pdChidWYsIGRub2RlLCBtc2dfbGlua19zZWxlY3Rvcihtc2cpKTsKIH0KIAotdm9pZCB0aXBjX25ldF9zdGFydCh1MzIgYWRkcikKK2ludCB0aXBjX25ldF9zdGFydCh1MzIgYWRkcikKIHsKIAljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKwlpbnQgcmVzOwogCi0Jd3JpdGVfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJdGlwY19vd25fYWRkciA9IGFkZHI7CiAJdGlwY19uYW1lZF9yZWluaXQoKTsKIAl0aXBjX3BvcnRfcmVpbml0KCk7Ci0JdGlwY19iY2xpbmtfaW5pdCgpOwotCXdyaXRlX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJcmVzID0gdGlwY19iY2xpbmtfaW5pdCgpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CiAKIAl0aXBjX25hbWV0YmxfcHVibGlzaChUSVBDX0NGR19TUlYsIHRpcGNfb3duX2FkZHIsIHRpcGNfb3duX2FkZHIsCiAJCQkgICAgIFRJUENfWk9ORV9TQ09QRSwgMCwgdGlwY19vd25fYWRkcik7CisKIAlwcl9pbmZvKCJTdGFydGVkIGluIG5ldHdvcmsgbW9kZVxuIik7CiAJcHJfaW5mbygiT3duIG5vZGUgYWRkcmVzcyAlcywgbmV0d29yayBpZGVudGl0eSAldVxuIiwKIAkJdGlwY19hZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCB0aXBjX293bl9hZGRyKSwgdGlwY19uZXRfaWQpOworCXJldHVybiAwOwogfQogCiB2b2lkIHRpcGNfbmV0X3N0b3Aodm9pZCkKQEAgLTE5NSwxMSArMTkyLDExIEBACiAJCXJldHVybjsKIAogCXRpcGNfbmFtZXRibF93aXRoZHJhdyhUSVBDX0NGR19TUlYsIHRpcGNfb3duX2FkZHIsIDAsIHRpcGNfb3duX2FkZHIpOwotCXdyaXRlX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJ0bmxfbG9jaygpOwogCXRpcGNfYmVhcmVyX3N0b3AoKTsKIAl0aXBjX2JjbGlua19zdG9wKCk7CiAJdGlwY19ub2RlX3N0b3AoKTsKLQl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJ0bmxfdW5sb2NrKCk7CiAKIAlwcl9pbmZvKCJMZWZ0IG5ldHdvcmsgbW9kZVxuIik7CiB9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuaCBiL25ldC90aXBjL25ldC5oCmluZGV4IDA3OWRhYWQuLmM2YzJiNDYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldC5oCisrKyBiL25ldC90aXBjL25ldC5oCkBAIC0zNywxMSArMzcsOSBAQAogI2lmbmRlZiBfVElQQ19ORVRfSAogI2RlZmluZSBfVElQQ19ORVRfSAogCi1leHRlcm4gcndsb2NrX3QgdGlwY19uZXRfbG9jazsKLQogdm9pZCB0aXBjX25ldF9yb3V0ZV9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CiAKLXZvaWQgdGlwY19uZXRfc3RhcnQodTMyIGFkZHIpOworaW50IHRpcGNfbmV0X3N0YXJ0KHUzMiBhZGRyKTsKIHZvaWQgdGlwY19uZXRfc3RvcCh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmMgYi9uZXQvdGlwYy9ub2RlLmMKaW5kZXggMWQzYTQ5OS4uNWI0NGMzMCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5jCisrKyBiL25ldC90aXBjL25vZGUuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQlicmVhazsKIAl9CiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5fcHRyLT5saXN0LCAmdGVtcF9ub2RlLT5saXN0KTsKLQluX3B0ci0+YmxvY2tfc2V0dXAgPSBXQUlUX1BFRVJfRE9XTjsKKwluX3B0ci0+YWN0aW9uX2ZsYWdzID0gVElQQ19XQUlUX1BFRVJfTElOS1NfRE9XTjsKIAluX3B0ci0+c2lnbmF0dXJlID0gSU5WQUxJRF9OT0RFX1NJRzsKIAogCXRpcGNfbnVtX25vZGVzKys7CkBAIC0xNDQsMTEgKzE0NCwxMyBAQAogdm9pZCB0aXBjX25vZGVfbGlua191cChzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJc3RydWN0IHRpcGNfbGluayAqKmFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCXUzMiBhZGRyID0gbl9wdHItPmFkZHI7CiAKIAluX3B0ci0+d29ya2luZ19saW5rcysrOwotCisJdGlwY19uYW1ldGJsX3B1Ymxpc2goVElQQ19MSU5LX1NUQVRFLCBhZGRyLCBhZGRyLCBUSVBDX05PREVfU0NPUEUsCisJCQkgICAgIGxfcHRyLT5iZWFyZXJfaWQsIGFkZHIpOwogCXByX2luZm8oIkVzdGFibGlzaGVkIGxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjXG4iLAotCQlsX3B0ci0+bmFtZSwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOworCQlsX3B0ci0+bmFtZSwgbF9wdHItPm5ldF9wbGFuZSk7CiAKIAlpZiAoIWFjdGl2ZVswXSkgewogCQlhY3RpdmVbMF0gPSBhY3RpdmVbMV0gPSBsX3B0cjsKQEAgLTIwMywxNiArMjA1LDE4IEBACiB2b2lkIHRpcGNfbm9kZV9saW5rX2Rvd24oc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXN0cnVjdCB0aXBjX2xpbmsgKiphY3RpdmU7CisJdTMyIGFkZHIgPSBuX3B0ci0+YWRkcjsKIAogCW5fcHRyLT53b3JraW5nX2xpbmtzLS07CisJdGlwY19uYW1ldGJsX3dpdGhkcmF3KFRJUENfTElOS19TVEFURSwgYWRkciwgbF9wdHItPmJlYXJlcl9pZCwgYWRkcik7CiAKIAlpZiAoIXRpcGNfbGlua19pc19hY3RpdmUobF9wdHIpKSB7CiAJCXByX2luZm8oIkxvc3Qgc3RhbmRieSBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKLQkJCWxfcHRyLT5uYW1lLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisJCQlsX3B0ci0+bmFtZSwgbF9wdHItPm5ldF9wbGFuZSk7CiAJCXJldHVybjsKIAl9CiAJcHJfaW5mbygiTG9zdCBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKLQkJbF9wdHItPm5hbWUsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkJbF9wdHItPm5hbWUsIGxfcHRyLT5uZXRfcGxhbmUpOwogCiAJYWN0aXZlID0gJm5fcHRyLT5hY3RpdmVfbGlua3NbMF07CiAJaWYgKGFjdGl2ZVswXSA9PSBsX3B0cikKQEAgLTIzOSw3ICsyNDMsNyBAQAogCiB2b2lkIHRpcGNfbm9kZV9hdHRhY2hfbGluayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7Ci0Jbl9wdHItPmxpbmtzW2xfcHRyLT5iX3B0ci0+aWRlbnRpdHldID0gbF9wdHI7CisJbl9wdHItPmxpbmtzW2xfcHRyLT5iZWFyZXJfaWRdID0gbF9wdHI7CiAJc3Bpbl9sb2NrX2JoKCZub2RlX2xpc3RfbG9jayk7CiAJdGlwY19udW1fbGlua3MrKzsKIAlzcGluX3VubG9ja19iaCgmbm9kZV9saXN0X2xvY2spOwpAQCAtMjYzLDI2ICsyNjcsMTIgQEAKIAogc3RhdGljIHZvaWQgbm9kZV9lc3RhYmxpc2hlZF9jb250YWN0KHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKQogewotCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpdGlwY19uYW1lZF9ub2RlX3VwLCBuX3B0ci0+YWRkcik7CisJbl9wdHItPmFjdGlvbl9mbGFncyB8PSBUSVBDX05PVElGWV9OT0RFX1VQOwogCW5fcHRyLT5iY2xpbmsub29zX3N0YXRlID0gMDsKIAluX3B0ci0+YmNsaW5rLmFja2VkID0gdGlwY19iY2xpbmtfZ2V0X2xhc3Rfc2VudCgpOwogCXRpcGNfYmNsaW5rX2FkZF9ub2RlKG5fcHRyLT5hZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgbm9kZV9uYW1lX3B1cmdlX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgbm9kZV9hZGRyKQotewotCXN0cnVjdCB0aXBjX25vZGUgKm5fcHRyOwotCi0JcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQluX3B0ciA9IHRpcGNfbm9kZV9maW5kKG5vZGVfYWRkcik7Ci0JaWYgKG5fcHRyKSB7Ci0JCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKLQkJbl9wdHItPmJsb2NrX3NldHVwICY9IH5XQUlUX05BTUVTX0dPTkU7Ci0JCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwotCX0KLQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7Ci19Ci0KIHN0YXRpYyB2b2lkIG5vZGVfbG9zdF9jb250YWN0KHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKQogewogCWNoYXIgYWRkcl9zdHJpbmdbMTZdOwpAQCAtMjk2LDEwICsyODYsOSBAQAogCQlrZnJlZV9za2JfbGlzdChuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQpOwogCQluX3B0ci0+YmNsaW5rLmRlZmVycmVkX3NpemUgPSAwOwogCi0JCWlmIChuX3B0ci0+YmNsaW5rLnJlYXNtX2hlYWQpIHsKLQkJCWtmcmVlX3NrYihuX3B0ci0+YmNsaW5rLnJlYXNtX2hlYWQpOwotCQkJbl9wdHItPmJjbGluay5yZWFzbV9oZWFkID0gTlVMTDsKLQkJCW5fcHRyLT5iY2xpbmsucmVhc21fdGFpbCA9IE5VTEw7CisJCWlmIChuX3B0ci0+YmNsaW5rLnJlYXNtX2J1ZikgeworCQkJa2ZyZWVfc2tiKG5fcHRyLT5iY2xpbmsucmVhc21fYnVmKTsKKwkJCW5fcHRyLT5iY2xpbmsucmVhc21fYnVmID0gTlVMTDsKIAkJfQogCiAJCXRpcGNfYmNsaW5rX3JlbW92ZV9ub2RlKG5fcHRyLT5hZGRyKTsKQEAgLTMxOCwxMiArMzA3LDEzIEBACiAJCXRpcGNfbGlua19yZXNldF9mcmFnbWVudHMobF9wdHIpOwogCX0KIAotCS8qIE5vdGlmeSBzdWJzY3JpYmVycyAqLwotCXRpcGNfbm9kZXN1Yl9ub3RpZnkobl9wdHIpOworCW5fcHRyLT5hY3Rpb25fZmxhZ3MgJj0gflRJUENfV0FJVF9PV05fTElOS1NfRE9XTjsKIAotCS8qIFByZXZlbnQgcmUtY29udGFjdCB3aXRoIG5vZGUgdW50aWwgY2xlYW51cCBpcyBkb25lICovCi0Jbl9wdHItPmJsb2NrX3NldHVwID0gV0FJVF9QRUVSX0RPV04gfCBXQUlUX05BTUVTX0dPTkU7Ci0JdGlwY19rX3NpZ25hbCgoSGFuZGxlcilub2RlX25hbWVfcHVyZ2VfY29tcGxldGUsIG5fcHRyLT5hZGRyKTsKKwkvKiBOb3RpZnkgc3Vic2NyaWJlcnMgYW5kIHByZXZlbnQgcmUtY29udGFjdCB3aXRoIG5vZGUgdW50aWwKKwkgKiBjbGVhbnVwIGlzIGRvbmUuCisJICovCisJbl9wdHItPmFjdGlvbl9mbGFncyB8PSBUSVBDX1dBSVRfUEVFUl9MSU5LU19ET1dOIHwKKwkJCSAgICAgICBUSVBDX05PVElGWV9OT0RFX0RPV047CiB9CiAKIHN0cnVjdCBza19idWZmICp0aXBjX25vZGVfZ2V0X25vZGVzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCkBAIC00MzYsMyArNDI2LDYzIEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIGJ1ZjsKIH0KKworLyoqCisgKiB0aXBjX25vZGVfZ2V0X2xpbmtuYW1lIC0gZ2V0IHRoZSBuYW1lIG9mIGEgbGluaworICoKKyAqIEBiZWFyZXJfaWQ6IGlkIG9mIHRoZSBiZWFyZXIKKyAqIEBub2RlOiBwZWVyIG5vZGUgYWRkcmVzcworICogQGxpbmtuYW1lOiBsaW5rIG5hbWUgb3V0cHV0IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KK2ludCB0aXBjX25vZGVfZ2V0X2xpbmtuYW1lKHUzMiBiZWFyZXJfaWQsIHUzMiBhZGRyLCBjaGFyICpsaW5rbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdGlwY19saW5rICpsaW5rOworCXN0cnVjdCB0aXBjX25vZGUgKm5vZGUgPSB0aXBjX25vZGVfZmluZChhZGRyKTsKKworCWlmICgoYmVhcmVyX2lkID49IE1BWF9CRUFSRVJTKSB8fCAhbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGlwY19ub2RlX2xvY2sobm9kZSk7CisJbGluayA9IG5vZGUtPmxpbmtzW2JlYXJlcl9pZF07CisJaWYgKGxpbmspIHsKKwkJc3RybmNweShsaW5rbmFtZSwgbGluay0+bmFtZSwgbGVuKTsKKwkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgdGlwY19ub2RlX3VubG9jayhzdHJ1Y3QgdGlwY19ub2RlICpub2RlKQoreworCUxJU1RfSEVBRChuc3ViX2xpc3QpOworCXN0cnVjdCB0aXBjX2xpbmsgKmxpbms7CisJaW50IHBrdF9zeiA9IDA7CisJdTMyIGFkZHIgPSAwOworCisJaWYgKGxpa2VseSghbm9kZS0+YWN0aW9uX2ZsYWdzKSkgeworCQlzcGluX3VubG9ja19iaCgmbm9kZS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobm9kZS0+YWN0aW9uX2ZsYWdzICYgVElQQ19OT1RJRllfTk9ERV9ET1dOKSB7CisJCWxpc3RfcmVwbGFjZV9pbml0KCZub2RlLT5uc3ViLCAmbnN1Yl9saXN0KTsKKwkJbm9kZS0+YWN0aW9uX2ZsYWdzICY9IH5USVBDX05PVElGWV9OT0RFX0RPV047CisJfQorCWlmIChub2RlLT5hY3Rpb25fZmxhZ3MgJiBUSVBDX05PVElGWV9OT0RFX1VQKSB7CisJCWxpbmsgPSBub2RlLT5hY3RpdmVfbGlua3NbMF07CisJCW5vZGUtPmFjdGlvbl9mbGFncyAmPSB+VElQQ19OT1RJRllfTk9ERV9VUDsKKwkJaWYgKGxpbmspIHsKKwkJCXBrdF9zeiA9ICgobGluay0+bWF4X3BrdCAtIElOVF9IX1NJWkUpIC8gSVRFTV9TSVpFKSAqCisJCQkJICBJVEVNX1NJWkU7CisJCQlhZGRyID0gbm9kZS0+YWRkcjsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmbm9kZS0+bG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJm5zdWJfbGlzdCkpCisJCXRpcGNfbm9kZXN1Yl9ub3RpZnkoJm5zdWJfbGlzdCk7CisJaWYgKHBrdF9zeikKKwkJdGlwY19uYW1lZF9ub2RlX3VwKHBrdF9zeiwgYWRkcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKaW5kZXggN2NiYjhjZS4uOTA4NzA2MyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5oCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtNDcsNjIgKzQ3LDczIEBACiAgKi8KICNkZWZpbmUgSU5WQUxJRF9OT0RFX1NJRyAweDEwMDAwCiAKLS8qIEZsYWdzIHVzZWQgdG8gYmxvY2sgKHJlKWVzdGFibGlzaG1lbnQgb2YgY29udGFjdCB3aXRoIGEgbmVpZ2hib3Jpbmcgbm9kZSAqLwotI2RlZmluZSBXQUlUX1BFRVJfRE9XTgkweDAwMDEJLyogd2FpdCB0byBzZWUgdGhhdCBwZWVyJ3MgbGlua3MgYXJlIGRvd24gKi8KLSNkZWZpbmUgV0FJVF9OQU1FU19HT05FCTB4MDAwMgkvKiB3YWl0IGZvciBwZWVyJ3MgcHVibGljYXRpb25zIHRvIGJlIHB1cmdlZCAqLwotI2RlZmluZSBXQUlUX05PREVfRE9XTgkweDAwMDQJLyogd2FpdCB1bnRpbCBwZWVyIG5vZGUgaXMgZGVjbGFyZWQgZG93biAqLworLyogRmxhZ3MgdXNlZCB0byB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGFjY29yZGluZyB0byBmbGFnIHR5cGUKKyAqIFRJUENfV0FJVF9QRUVSX0xJTktTX0RPV046IHdhaXQgdG8gc2VlIHRoYXQgcGVlcidzIGxpbmtzIGFyZSBkb3duCisgKiBUSVBDX1dBSVRfT1dOX0xJTktTX0RPV046IHdhaXQgdW50aWwgcGVlciBub2RlIGlzIGRlY2xhcmVkIGRvd24KKyAqIFRJUENfTk9USUZZX05PREVfRE9XTjogbm90aWZ5IG5vZGUgaXMgZG93bgorICogVElQQ19OT1RJRllfTk9ERV9VUDogbm90aWZ5IG5vZGUgaXMgdXAKKyAqLworZW51bSB7CisJVElQQ19XQUlUX1BFRVJfTElOS1NfRE9XTgk9ICgxIDw8IDEpLAorCVRJUENfV0FJVF9PV05fTElOS1NfRE9XTgk9ICgxIDw8IDIpLAorCVRJUENfTk9USUZZX05PREVfRE9XTgkJPSAoMSA8PCAzKSwKKwlUSVBDX05PVElGWV9OT0RFX1VQCQk9ICgxIDw8IDQpCit9OworCisvKioKKyAqIHN0cnVjdCB0aXBjX25vZGVfYmNsaW5rIC0gVElQQyBub2RlIGJjbGluayBzdHJ1Y3R1cmUKKyAqIEBhY2tlZDogc2VxdWVuY2UgIyBvZiBsYXN0IG91dGJvdW5kIGInY2FzdCBtZXNzYWdlIGFja25vd2xlZGdlZCBieSBub2RlCisgKiBAbGFzdF9pbjogc2VxdWVuY2UgIyBvZiBsYXN0IGluLXNlcXVlbmNlIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQorICogQGxhc3Rfc2VudDogc2VxdWVuY2UgIyBvZiBsYXN0IGInY2FzdCBtZXNzYWdlIHNlbnQgYnkgbm9kZQorICogQG9vc19zdGF0ZTogc3RhdGUgdHJhY2tlciBmb3IgaGFuZGxpbmcgT09TIGInY2FzdCBtZXNzYWdlcworICogQGRlZmVycmVkX3NpemU6IG51bWJlciBvZiBPT1MgYidjYXN0IG1lc3NhZ2VzIGluIGRlZmVycmVkIHF1ZXVlCisgKiBAZGVmZXJyZWRfaGVhZDogb2xkZXN0IE9PUyBiJ2Nhc3QgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG5vZGUKKyAqIEBkZWZlcnJlZF90YWlsOiBuZXdlc3QgT09TIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQorICogQHJlYXNtX2J1ZjogYnJvYWRjYXN0IHJlYXNzZW1ibHkgcXVldWUgaGVhZCBmcm9tIG5vZGUKKyAqIEByZWN2X3Blcm1pdHRlZDogdHJ1ZSBpZiBub2RlIGlzIGFsbG93ZWQgdG8gcmVjZWl2ZSBiJ2Nhc3QgbWVzc2FnZXMKKyAqLworc3RydWN0IHRpcGNfbm9kZV9iY2xpbmsgeworCXUzMiBhY2tlZDsKKwl1MzIgbGFzdF9pbjsKKwl1MzIgbGFzdF9zZW50OworCXUzMiBvb3Nfc3RhdGU7CisJdTMyIGRlZmVycmVkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmRlZmVycmVkX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKmRlZmVycmVkX3RhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnJlYXNtX2J1ZjsKKwlib29sIHJlY3ZfcGVybWl0dGVkOworfTsKIAogLyoqCiAgKiBzdHJ1Y3QgdGlwY19ub2RlIC0gVElQQyBub2RlIHN0cnVjdHVyZQogICogQGFkZHI6IG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlCiAgKiBAbG9jazogc3BpbmxvY2sgZ292ZXJuaW5nIGFjY2VzcyB0byBzdHJ1Y3R1cmUKICAqIEBoYXNoOiBsaW5rcyB0byBhZGphY2VudCBub2RlcyBpbiB1bnNvcnRlZCBoYXNoIGNoYWluCi0gKiBAbGlzdDogbGlua3MgdG8gYWRqYWNlbnQgbm9kZXMgaW4gc29ydGVkIGxpc3Qgb2YgY2x1c3RlcidzIG5vZGVzCi0gKiBAbnN1YjogbGlzdCBvZiAibm9kZSBkb3duIiBzdWJzY3JpcHRpb25zIG1vbml0b3Jpbmcgbm9kZQogICogQGFjdGl2ZV9saW5rczogcG9pbnRlcnMgdG8gYWN0aXZlIGxpbmtzIHRvIG5vZGUKICAqIEBsaW5rczogcG9pbnRlcnMgdG8gYWxsIGxpbmtzIHRvIG5vZGUKKyAqIEBhY3Rpb25fZmxhZ3M6IGJpdCBtYXNrIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBub2RlIGFjdGlvbnMKKyAqIEBiY2xpbms6IGJyb2FkY2FzdC1yZWxhdGVkIGluZm8KKyAqIEBsaXN0OiBsaW5rcyB0byBhZGphY2VudCBub2RlcyBpbiBzb3J0ZWQgbGlzdCBvZiBjbHVzdGVyJ3Mgbm9kZXMKICAqIEB3b3JraW5nX2xpbmtzOiBudW1iZXIgb2Ygd29ya2luZyBsaW5rcyB0byBub2RlIChib3RoIGFjdGl2ZSBhbmQgc3RhbmRieSkKLSAqIEBibG9ja19zZXR1cDogYml0IG1hc2sgb2YgY29uZGl0aW9ucyBwcmV2ZW50aW5nIGxpbmsgZXN0YWJsaXNobWVudCB0byBub2RlCiAgKiBAbGlua19jbnQ6IG51bWJlciBvZiBsaW5rcyB0byBub2RlCiAgKiBAc2lnbmF0dXJlOiBub2RlIGluc3RhbmNlIGlkZW50aWZpZXIKLSAqIEBiY2xpbms6IGJyb2FkY2FzdC1yZWxhdGVkIGluZm8KKyAqIEBuc3ViOiBsaXN0IG9mICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbnMgbW9uaXRvcmluZyBub2RlCiAgKiBAcmN1OiByY3Ugc3RydWN0IGZvciB0aXBjX25vZGUKLSAqICAgIEBhY2tlZDogc2VxdWVuY2UgIyBvZiBsYXN0IG91dGJvdW5kIGInY2FzdCBtZXNzYWdlIGFja25vd2xlZGdlZCBieSBub2RlCi0gKiAgICBAbGFzdF9pbjogc2VxdWVuY2UgIyBvZiBsYXN0IGluLXNlcXVlbmNlIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQotICogICAgQGxhc3Rfc2VudDogc2VxdWVuY2UgIyBvZiBsYXN0IGInY2FzdCBtZXNzYWdlIHNlbnQgYnkgbm9kZQotICogICAgQG9vc19zdGF0ZTogc3RhdGUgdHJhY2tlciBmb3IgaGFuZGxpbmcgT09TIGInY2FzdCBtZXNzYWdlcwotICogICAgQGRlZmVycmVkX3NpemU6IG51bWJlciBvZiBPT1MgYidjYXN0IG1lc3NhZ2VzIGluIGRlZmVycmVkIHF1ZXVlCi0gKiAgICBAZGVmZXJyZWRfaGVhZDogb2xkZXN0IE9PUyBiJ2Nhc3QgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG5vZGUKLSAqICAgIEBkZWZlcnJlZF90YWlsOiBuZXdlc3QgT09TIGInY2FzdCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbm9kZQotICogICAgQHJlYXNtX2hlYWQ6IGJyb2FkY2FzdCByZWFzc2VtYmx5IHF1ZXVlIGhlYWQgZnJvbSBub2RlCi0gKiAgICBAcmVhc21fdGFpbDogbGFzdCBicm9hZGNhc3QgZnJhZ21lbnQgcmVjZWl2ZWQgZnJvbSBub2RlCi0gKiAgICBAcmVjdl9wZXJtaXR0ZWQ6IHRydWUgaWYgbm9kZSBpcyBhbGxvd2VkIHRvIHJlY2VpdmUgYidjYXN0IG1lc3NhZ2VzCiAgKi8KIHN0cnVjdCB0aXBjX25vZGUgewogCXUzMiBhZGRyOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5zdWI7CiAJc3RydWN0IHRpcGNfbGluayAqYWN0aXZlX2xpbmtzWzJdOwogCXN0cnVjdCB0aXBjX2xpbmsgKmxpbmtzW01BWF9CRUFSRVJTXTsKKwl1bnNpZ25lZCBpbnQgYWN0aW9uX2ZsYWdzOworCXN0cnVjdCB0aXBjX25vZGVfYmNsaW5rIGJjbGluazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGxpbmtfY250OwogCWludCB3b3JraW5nX2xpbmtzOwotCWludCBibG9ja19zZXR1cDsKIAl1MzIgc2lnbmF0dXJlOworCXN0cnVjdCBsaXN0X2hlYWQgbnN1YjsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCXN0cnVjdCB7Ci0JCXUzMiBhY2tlZDsKLQkJdTMyIGxhc3RfaW47Ci0JCXUzMiBsYXN0X3NlbnQ7Ci0JCXUzMiBvb3Nfc3RhdGU7Ci0JCXUzMiBkZWZlcnJlZF9zaXplOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqZGVmZXJyZWRfaGVhZDsKLQkJc3RydWN0IHNrX2J1ZmYgKmRlZmVycmVkX3RhaWw7Ci0JCXN0cnVjdCBza19idWZmICpyZWFzbV9oZWFkOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqcmVhc21fdGFpbDsKLQkJYm9vbCByZWN2X3Blcm1pdHRlZDsKLQl9IGJjbGluazsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRpcGNfbm9kZV9saXN0OwpAQCAtMTE4LDE1ICsxMjksMTggQEAKIGludCB0aXBjX25vZGVfaXNfdXAoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIpOwogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbm9kZV9nZXRfbGlua3MoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7CiBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19ub2RlX2dldF9ub2Rlcyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK2ludCB0aXBjX25vZGVfZ2V0X2xpbmtuYW1lKHUzMiBiZWFyZXJfaWQsIHUzMiBub2RlLCBjaGFyICpsaW5rbmFtZSwgc2l6ZV90IGxlbik7Cit2b2lkIHRpcGNfbm9kZV91bmxvY2soc3RydWN0IHRpcGNfbm9kZSAqbm9kZSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aXBjX25vZGVfbG9jayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cikKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aXBjX25vZGVfbG9jayhzdHJ1Y3QgdGlwY19ub2RlICpub2RlKQogewotCXNwaW5fbG9ja19iaCgmbl9wdHItPmxvY2spOworCXNwaW5fbG9ja19iaCgmbm9kZS0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aXBjX25vZGVfdW5sb2NrKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKQorc3RhdGljIGlubGluZSBib29sIHRpcGNfbm9kZV9ibG9ja2VkKHN0cnVjdCB0aXBjX25vZGUgKm5vZGUpCiB7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwlyZXR1cm4gKG5vZGUtPmFjdGlvbl9mbGFncyAmIChUSVBDX1dBSVRfUEVFUl9MSU5LU19ET1dOIHwKKwkJVElQQ19OT1RJRllfTk9ERV9ET1dOIHwgVElQQ19XQUlUX09XTl9MSU5LU19ET1dOKSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYyBiL25ldC90aXBjL25vZGVfc3Vic2NyLmMKaW5kZXggOGE3Mzg0Yy4uN2M1OWFiMSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYworKysgYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5jCkBAIC04MSwxNCArODEsMTMgQEAKICAqCiAgKiBOb3RlOiBub2RlIGlzIGxvY2tlZCBieSBjYWxsZXIKICAqLwotdm9pZCB0aXBjX25vZGVzdWJfbm90aWZ5KHN0cnVjdCB0aXBjX25vZGUgKm5vZGUpCit2b2lkIHRpcGNfbm9kZXN1Yl9ub3RpZnkoc3RydWN0IGxpc3RfaGVhZCAqbnN1Yl9saXN0KQogewotCXN0cnVjdCB0aXBjX25vZGVfc3Vic2NyICpuczsKKwlzdHJ1Y3QgdGlwY19ub2RlX3N1YnNjciAqbnMsICpzYWZlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShucywgJm5vZGUtPm5zdWIsIG5vZGVzdWJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShucywgc2FmZSwgbnN1Yl9saXN0LCBub2Rlc3ViX2xpc3QpIHsKIAkJaWYgKG5zLT5oYW5kbGVfbm9kZV9kb3duKSB7Ci0JCQl0aXBjX2tfc2lnbmFsKChIYW5kbGVyKW5zLT5oYW5kbGVfbm9kZV9kb3duLAotCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKW5zLT51c3JfaGFuZGxlKTsKKwkJCW5zLT5oYW5kbGVfbm9kZV9kb3duKG5zLT51c3JfaGFuZGxlKTsKIAkJCW5zLT5oYW5kbGVfbm9kZV9kb3duID0gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGVfc3Vic2NyLmggYi9uZXQvdGlwYy9ub2RlX3N1YnNjci5oCmluZGV4IGM5NWQyMDcuLmQ5MWI4Y2MgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25vZGVfc3Vic2NyLmgKKysrIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuaApAQCAtNTgsNiArNTgsNiBAQAogdm9pZCB0aXBjX25vZGVzdWJfc3Vic2NyaWJlKHN0cnVjdCB0aXBjX25vZGVfc3Vic2NyICpub2RlX3N1YiwgdTMyIGFkZHIsCiAJCQkgICAgdm9pZCAqdXNyX2hhbmRsZSwgbmV0X2V2X2hhbmRsZXIgaGFuZGxlX2Rvd24pOwogdm9pZCB0aXBjX25vZGVzdWJfdW5zdWJzY3JpYmUoc3RydWN0IHRpcGNfbm9kZV9zdWJzY3IgKm5vZGVfc3ViKTsKLXZvaWQgdGlwY19ub2Rlc3ViX25vdGlmeShzdHJ1Y3QgdGlwY19ub2RlICpub2RlKTsKK3ZvaWQgdGlwY19ub2Rlc3ViX25vdGlmeShzdHJ1Y3QgbGlzdF9oZWFkICpuc3ViX2xpc3QpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuYyBiL25ldC90aXBjL3BvcnQuYwppbmRleCA1YzE0Yzc4Li41ZmQ3YWNjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmMKKysrIGIvbmV0L3RpcGMvcG9ydC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJbXNnX3NldF9kZXN0bm9kZShtc2csIHRpcGNfb3duX2FkZHIpOwogCQlpZiAoZHAtPmNvdW50ID09IDEpIHsKIAkJCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkcC0+cG9ydHNbMF0pOwotCQkJdGlwY19wb3J0X3JjdihidWYpOworCQkJdGlwY19za19yY3YoYnVmKTsKIAkJCXRpcGNfcG9ydF9saXN0X2ZyZWUoZHApOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xODAsNyArMTgwLDcgQEAKIAkJCWlmICgoaW5kZXggPT0gMCkgJiYgKGNudCAhPSAwKSkKIAkJCQlpdGVtID0gaXRlbS0+bmV4dDsKIAkJCW1zZ19zZXRfZGVzdHBvcnQoYnVmX21zZyhiKSwgaXRlbS0+cG9ydHNbaW5kZXhdKTsKLQkJCXRpcGNfcG9ydF9yY3YoYik7CisJCQl0aXBjX3NrX3JjdihiKTsKIAkJfQogCX0KIGV4aXQ6CkBAIC0zNDMsNyArMzQzLDcgQEAKIAkvKiBzZW5kIHJldHVybmVkIG1lc3NhZ2UgJiBkaXNwb3NlIG9mIHJlamVjdGVkIG1lc3NhZ2UgKi8KIAlzcmNfbm9kZSA9IG1zZ19wcmV2bm9kZShtc2cpOwogCWlmIChpbl9vd25fbm9kZShzcmNfbm9kZSkpCi0JCXRpcGNfcG9ydF9yY3YocmJ1Zik7CisJCXRpcGNfc2tfcmN2KHJidWYpOwogCWVsc2UKIAkJdGlwY19saW5rX3htaXQocmJ1Ziwgc3JjX25vZGUsIG1zZ19saW5rX3NlbGVjdG9yKHJtc2cpKTsKIGV4aXQ6CkBAIC03NTQsMzcgKzc1NCw2IEBACiAJcmV0dXJuIHRpcGNfcG9ydF9kaXNjb25uZWN0KHJlZik7CiB9CiAKLS8qKgotICogdGlwY19wb3J0X3JjdiAtIHJlY2VpdmUgbWVzc2FnZSBmcm9tIGxvd2VyIGxheWVyIGFuZCBkZWxpdmVyIHRvIHBvcnQgdXNlcgotICovCi1pbnQgdGlwY19wb3J0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQotewotCXN0cnVjdCB0aXBjX3BvcnQgKnBfcHRyOwotCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOwotCXUzMiBkZXN0cG9ydCA9IG1zZ19kZXN0cG9ydChtc2cpOwotCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihtc2cpOwotCXUzMiBlcnI7Ci0KLQkvKiBmb3J3YXJkIHVucmVzb2x2ZWQgbmFtZWQgbWVzc2FnZSAqLwotCWlmICh1bmxpa2VseSghZGVzdHBvcnQpKSB7Ci0JCXRpcGNfbmV0X3JvdXRlX21zZyhidWYpOwotCQlyZXR1cm4gZHN6OwotCX0KLQotCS8qIHZhbGlkYXRlIGRlc3RpbmF0aW9uICYgcGFzcyB0byBwb3J0LCBvdGhlcndpc2UgcmVqZWN0IG1lc3NhZ2UgKi8KLQlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKGRlc3Rwb3J0KTsKLQlpZiAobGlrZWx5KHBfcHRyKSkgewotCQllcnIgPSB0aXBjX3NrX3JjdigmdGlwY19wb3J0X3RvX3NvY2socF9wdHIpLT5zaywgYnVmKTsKLQkJdGlwY19wb3J0X3VubG9jayhwX3B0cik7Ci0JCWlmIChsaWtlbHkoIWVycikpCi0JCQlyZXR1cm4gZHN6OwotCX0gZWxzZSB7Ci0JCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7Ci0JfQotCi0JcmV0dXJuIHRpcGNfcmVqZWN0X21zZyhidWYsIGVycik7Ci19Ci0KIC8qCiAgKiAgdGlwY19wb3J0X2lvdmVjX3JjdjogQ29uY2F0ZW5hdGUgYW5kIGRlbGl2ZXIgc2VjdGlvbmVkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBmb3IgdGhpcyBub2RlLgpAQCAtNzk4LDcgKzc2Nyw3IEBACiAKIAlyZXMgPSB0aXBjX21zZ19idWlsZCgmc2VuZGVyLT5waGRyLCBtc2dfc2VjdCwgbGVuLCBNQVhfTVNHX1NJWkUsICZidWYpOwogCWlmIChsaWtlbHkoYnVmKSkKLQkJdGlwY19wb3J0X3JjdihidWYpOworCQl0aXBjX3NrX3JjdihidWYpOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuaCBiL25ldC90aXBjL3BvcnQuaAppbmRleCBhMDAzOTczLi5jZjRjYTViIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmgKKysrIGIvbmV0L3RpcGMvcG9ydC5oCkBAIC00Miw5ICs0MiwxMCBAQAogI2luY2x1ZGUgIm1zZy5oIgogI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCiAKLSNkZWZpbmUgVElQQ19GTE9XX0NPTlRST0xfV0lOIDUxMgotI2RlZmluZSBDT05OX09WRVJMT0FEX0xJTUlUCSgoVElQQ19GTE9XX0NPTlRST0xfV0lOICogMiArIDEpICogXAotCQkJCVNLQl9UUlVFU0laRShUSVBDX01BWF9VU0VSX01TR19TSVpFKSkKKyNkZWZpbmUgVElQQ19DT05OQUNLX0lOVFYgICAgICAgICAyNTYKKyNkZWZpbmUgVElQQ19GTE9XQ1RSTF9XSU4gICAgICAgIChUSVBDX0NPTk5BQ0tfSU5UViAqIDIpCisjZGVmaW5lIFRJUENfQ09OTl9PVkVSTE9BRF9MSU1JVCAoKFRJUENfRkxPV0NUUkxfV0lOICogMiArIDEpICogXAorCQkJCSAgU0tCX1RSVUVTSVpFKFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKQogCiAvKioKICAqIHN0cnVjdCB0aXBjX3BvcnQgLSBUSVBDIHBvcnQgc3RydWN0dXJlCkBAIC0xMzQsNyArMTM1LDYgQEAKIC8qCiAgKiBUSVBDIG1lc3NhZ2luZyByb3V0aW5lcwogICovCi1pbnQgdGlwY19wb3J0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKIAogaW50IHRpcGNfc2VuZChzdHJ1Y3QgdGlwY19wb3J0ICpwb3J0LAogCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCkBAIC0xODcsNyArMTg3LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgdGlwY19wb3J0X2Nvbmdlc3RlZChzdHJ1Y3QgdGlwY19wb3J0ICpwX3B0cikKIHsKLQlyZXR1cm4gKHBfcHRyLT5zZW50IC0gcF9wdHItPmFja2VkKSA+PSAoVElQQ19GTE9XX0NPTlRST0xfV0lOICogMik7CisJcmV0dXJuICgocF9wdHItPnNlbnQgLSBwX3B0ci0+YWNrZWQpID49IFRJUENfRkxPV0NUUkxfV0lOKTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IDNjMDI1NjkuLmVmMDQ3NTUgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgIm5vZGUuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCkBAIC00NCw3ICs0NSw3IEBACiAKICNkZWZpbmUgQ09OTl9USU1FT1VUX0RFRkFVTFQJODAwMAkvKiBkZWZhdWx0IGNvbm5lY3QgdGltZW91dCA9IDhzICovCiAKLXN0YXRpYyBpbnQgYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgdGlwY19iYWNrbG9nX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgdGlwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzayk7CiBzdGF0aWMgdm9pZCB0aXBjX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzayk7CiBzdGF0aWMgaW50IHRpcGNfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKQEAgLTE5NSwxMSArMTk2LDEyIEBACiAJc29jay0+c3RhdGUgPSBzdGF0ZTsKIAogCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKLQlzay0+c2tfYmFja2xvZ19yY3YgPSBiYWNrbG9nX3JjdjsKKwlzay0+c2tfYmFja2xvZ19yY3YgPSB0aXBjX2JhY2tsb2dfcmN2OwogCXNrLT5za19yY3ZidWYgPSBzeXNjdGxfdGlwY19ybWVtWzFdOwogCXNrLT5za19kYXRhX3JlYWR5ID0gdGlwY19kYXRhX3JlYWR5OwogCXNrLT5za193cml0ZV9zcGFjZSA9IHRpcGNfd3JpdGVfc3BhY2U7Ci0JdGlwY19zayhzayktPmNvbm5fdGltZW91dCA9IENPTk5fVElNRU9VVF9ERUZBVUxUOworCXRzay0+Y29ubl90aW1lb3V0ID0gQ09OTl9USU1FT1VUX0RFRkFVTFQ7CisJYXRvbWljX3NldCgmdHNrLT5kdXBsX3JjdmNudCwgMCk7CiAJdGlwY19wb3J0X3VubG9jayhwb3J0KTsKIAogCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkgewpAQCAtOTgzLDEwICs5ODUsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0aXBjX3dhaXRfZm9yX3Jjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBsb25nIHRpbWVvKQorc3RhdGljIGludCB0aXBjX3dhaXRfZm9yX3Jjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBsb25nICp0aW1lb3ApCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJREVGSU5FX1dBSVQod2FpdCk7CisJbG9uZyB0aW1lbyA9ICp0aW1lb3A7CiAJaW50IGVycjsKIAogCWZvciAoOzspIHsKQEAgLTEwMTEsNiArMTAxNCw3IEBACiAJCQlicmVhazsKIAl9CiAJZmluaXNoX3dhaXQoc2tfc2xlZXAoc2spLCAmd2FpdCk7CisJKnRpbWVvcCA9IHRpbWVvOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwNTQsNyArMTA1OCw3IEBACiByZXN0YXJ0OgogCiAJLyogTG9vayBmb3IgYSBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWU7IHdhaXQgaWYgbmVjZXNzYXJ5ICovCi0JcmVzID0gdGlwY193YWl0X2Zvcl9yY3Ztc2coc29jaywgdGltZW8pOworCXJlcyA9IHRpcGNfd2FpdF9mb3JfcmN2bXNnKHNvY2ssICZ0aW1lbyk7CiAJaWYgKHJlcykKIAkJZ290byBleGl0OwogCkBAIC0xMTAwLDcgKzExMDQsNyBAQAogCS8qIENvbnN1bWUgcmVjZWl2ZWQgbWVzc2FnZSAob3B0aW9uYWwpICovCiAJaWYgKGxpa2VseSghKGZsYWdzICYgTVNHX1BFRUspKSkgewogCQlpZiAoKHNvY2stPnN0YXRlICE9IFNTX1JFQURZKSAmJgotCQkgICAgKCsrcG9ydC0+Y29ubl91bmFja2VkID49IFRJUENfRkxPV19DT05UUk9MX1dJTikpCisJCSAgICAoKytwb3J0LT5jb25uX3VuYWNrZWQgPj0gVElQQ19DT05OQUNLX0lOVFYpKQogCQkJdGlwY19hY2tub3dsZWRnZShwb3J0LT5yZWYsIHBvcnQtPmNvbm5fdW5hY2tlZCk7CiAJCWFkdmFuY2VfcnhfcXVldWUoc2spOwogCX0KQEAgLTExNTIsNyArMTE1Niw3IEBACiAKIHJlc3RhcnQ6CiAJLyogTG9vayBmb3IgYSBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWU7IHdhaXQgaWYgbmVjZXNzYXJ5ICovCi0JcmVzID0gdGlwY193YWl0X2Zvcl9yY3Ztc2coc29jaywgdGltZW8pOworCXJlcyA9IHRpcGNfd2FpdF9mb3JfcmN2bXNnKHNvY2ssICZ0aW1lbyk7CiAJaWYgKHJlcykKIAkJZ290byBleGl0OwogCkBAIC0xMjA5LDcgKzEyMTMsNyBAQAogCiAJLyogQ29uc3VtZSByZWNlaXZlZCBtZXNzYWdlIChvcHRpb25hbCkgKi8KIAlpZiAobGlrZWx5KCEoZmxhZ3MgJiBNU0dfUEVFSykpKSB7Ci0JCWlmICh1bmxpa2VseSgrK3BvcnQtPmNvbm5fdW5hY2tlZCA+PSBUSVBDX0ZMT1dfQ09OVFJPTF9XSU4pKQorCQlpZiAodW5saWtlbHkoKytwb3J0LT5jb25uX3VuYWNrZWQgPj0gVElQQ19DT05OQUNLX0lOVFYpKQogCQkJdGlwY19hY2tub3dsZWRnZShwb3J0LT5yZWYsIHBvcnQtPmNvbm5fdW5hY2tlZCk7CiAJCWFkdmFuY2VfcnhfcXVldWUoc2spOwogCX0KQEAgLTE0MTUsNyArMTQxOSw3IEBACiB9CiAKIC8qKgotICogYmFja2xvZ19yY3YgLSBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZSBmcm9tIGJhY2tsb2cgcXVldWUKKyAqIHRpcGNfYmFja2xvZ19yY3YgLSBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZSBmcm9tIGJhY2tsb2cgcXVldWUKICAqIEBzazogc29ja2V0CiAgKiBAYnVmOiBtZXNzYWdlCiAgKgpAQCAtMTQyMyw0NyArMTQyNyw3NCBAQAogICoKICAqIFJldHVybnMgMAogICovCi1zdGF0aWMgaW50IGJhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3N0YXRpYyBpbnQgdGlwY19iYWNrbG9nX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpidWYpCiB7CiAJdTMyIHJlczsKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c2sgPSB0aXBjX3NrKHNrKTsKKwl1aW50IHRydWVzaXplID0gYnVmLT50cnVlc2l6ZTsKIAogCXJlcyA9IGZpbHRlcl9yY3Yoc2ssIGJ1Zik7Ci0JaWYgKHJlcykKKwlpZiAodW5saWtlbHkocmVzKSkKIAkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgcmVzKTsKKworCWlmIChhdG9taWNfcmVhZCgmdHNrLT5kdXBsX3JjdmNudCkgPCBUSVBDX0NPTk5fT1ZFUkxPQURfTElNSVQpCisJCWF0b21pY19hZGQodHJ1ZXNpemUsICZ0c2stPmR1cGxfcmN2Y250KTsKKwogCXJldHVybiAwOwogfQogCiAvKioKICAqIHRpcGNfc2tfcmN2IC0gaGFuZGxlIGluY29taW5nIG1lc3NhZ2UKLSAqIEBzazogIHNvY2tldCByZWNlaXZpbmcgbWVzc2FnZQotICogQGJ1ZjogbWVzc2FnZQotICoKLSAqIENhbGxlZCB3aXRoIHBvcnQgbG9jayBhbHJlYWR5IHRha2VuLgotICoKLSAqIFJldHVybnMgVElQQyBlcnJvciBzdGF0dXMgY29kZSAoVElQQ19PSyBpZiBtZXNzYWdlIGlzIG5vdCB0byBiZSByZWplY3RlZCkKKyAqIEBidWY6IGJ1ZmZlciBjb250YWluaW5nIGFycml2aW5nIG1lc3NhZ2UKKyAqIENvbnN1bWVzIGJ1ZmZlcgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG9yIGVycm5vOiAtRUhPU1RVTlJFQUNICiAgKi8KLXUzMiB0aXBjX3NrX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpidWYpCitpbnQgdGlwY19za19yY3Yoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKLQl1MzIgcmVzOworCXN0cnVjdCB0aXBjX3NvY2sgKnRzazsKKwlzdHJ1Y3QgdGlwY19wb3J0ICpwb3J0OworCXN0cnVjdCBzb2NrICpzazsKKwl1MzIgZHBvcnQgPSBtc2dfZGVzdHBvcnQoYnVmX21zZyhidWYpKTsKKwlpbnQgZXJyID0gVElQQ19PSzsKKwl1aW50IGxpbWl0OwogCi0JLyoKLQkgKiBQcm9jZXNzIG1lc3NhZ2UgaWYgc29ja2V0IGlzIHVubG9ja2VkOyBvdGhlcndpc2UgYWRkIHRvIGJhY2tsb2cgcXVldWUKLQkgKgotCSAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBza19yZWNlaXZlX3NrYigpLCBidXQgbXVzdCBiZSBkaXN0aW5jdCBmcm9tIGl0Ci0JICogc2luY2UgYSBUSVBDLXNwZWNpZmljIGZpbHRlci9yZWplY3QgbWVjaGFuaXNtIGlzIHV0aWxpemVkCi0JICovCi0JYmhfbG9ja19zb2NrKHNrKTsKLQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJcmVzID0gZmlsdGVyX3JjdihzaywgYnVmKTsKLQl9IGVsc2UgewotCQlpZiAoc2tfYWRkX2JhY2tsb2coc2ssIGJ1ZiwgcmN2YnVmX2xpbWl0KHNrLCBidWYpKSkKLQkJCXJlcyA9IFRJUENfRVJSX09WRVJMT0FEOwotCQllbHNlCi0JCQlyZXMgPSBUSVBDX09LOworCS8qIEZvcndhcmQgdW5yZXNvbHZlZCBuYW1lZCBtZXNzYWdlICovCisJaWYgKHVubGlrZWx5KCFkcG9ydCkpIHsKKwkJdGlwY19uZXRfcm91dGVfbXNnKGJ1Zik7CisJCXJldHVybiAwOwogCX0KLQliaF91bmxvY2tfc29jayhzayk7CiAKLQlyZXR1cm4gcmVzOworCS8qIFZhbGlkYXRlIGRlc3RpbmF0aW9uICovCisJcG9ydCA9IHRpcGNfcG9ydF9sb2NrKGRwb3J0KTsKKwlpZiAodW5saWtlbHkoIXBvcnQpKSB7CisJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl0c2sgPSB0aXBjX3BvcnRfdG9fc29jayhwb3J0KTsKKwlzayA9ICZ0c2stPnNrOworCisJLyogUXVldWUgbWVzc2FnZSAqLworCWJoX2xvY2tfc29jayhzayk7CisKKwlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJZXJyID0gZmlsdGVyX3JjdihzaywgYnVmKTsKKwl9IGVsc2UgeworCQlpZiAoc2stPnNrX2JhY2tsb2cubGVuID09IDApCisJCQlhdG9taWNfc2V0KCZ0c2stPmR1cGxfcmN2Y250LCAwKTsKKwkJbGltaXQgPSByY3ZidWZfbGltaXQoc2ssIGJ1ZikgKyBhdG9taWNfcmVhZCgmdHNrLT5kdXBsX3JjdmNudCk7CisJCWlmIChza19hZGRfYmFja2xvZyhzaywgYnVmLCBsaW1pdCkpCisJCQllcnIgPSBUSVBDX0VSUl9PVkVSTE9BRDsKKwl9CisKKwliaF91bmxvY2tfc29jayhzayk7CisJdGlwY19wb3J0X3VubG9jayhwb3J0KTsKKworCWlmIChsaWtlbHkoIWVycikpCisJCXJldHVybiAwOworZXhpdDoKKwl0aXBjX3JlamVjdF9tc2coYnVmLCBlcnIpOworCXJldHVybiAtRUhPU1RVTlJFQUNIOwogfQogCiBzdGF0aWMgaW50IHRpcGNfd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBsb25nICp0aW1lb19wKQpAQCAtMTkwNSw2ICsxOTM2LDI4IEBACiAJcmV0dXJuIHB1dF91c2VyKHNpemVvZih2YWx1ZSksIG9sKTsKIH0KIAoraW50IHRpcGNfaW9jdGwoc3RydWN0IHNvY2tldCAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0aXBjX3Npb2NfbG5fcmVxIGxucjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0VUTElOS05BTUU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbG5yLCBhcmdwLCBzaXplb2YobG5yKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCF0aXBjX25vZGVfZ2V0X2xpbmtuYW1lKGxuci5iZWFyZXJfaWQsIGxuci5wZWVyLAorCQkJCQkgICAgbG5yLmxpbmtuYW1lLCBUSVBDX01BWF9MSU5LX05BTUUpKSB7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsbnIsIHNpemVvZihsbnIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKIC8qIFByb3RvY29sIHN3aXRjaGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBUSVBDIHNvY2tldHMgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgbXNnX29wcyA9IHsKQEAgLTE5MTcsNyArMTk3MCw3IEBACiAJLmFjY2VwdAkJPSBzb2NrX25vX2FjY2VwdCwKIAkuZ2V0bmFtZQk9IHRpcGNfZ2V0bmFtZSwKIAkucG9sbAkJPSB0aXBjX3BvbGwsCi0JLmlvY3RsCQk9IHNvY2tfbm9faW9jdGwsCisJLmlvY3RsCQk9IHRpcGNfaW9jdGwsCiAJLmxpc3RlbgkJPSBzb2NrX25vX2xpc3RlbiwKIAkuc2h1dGRvd24JPSB0aXBjX3NodXRkb3duLAogCS5zZXRzb2Nrb3B0CT0gdGlwY19zZXRzb2Nrb3B0LApAQCAtMTkzOCw3ICsxOTkxLDcgQEAKIAkuYWNjZXB0CQk9IHRpcGNfYWNjZXB0LAogCS5nZXRuYW1lCT0gdGlwY19nZXRuYW1lLAogCS5wb2xsCQk9IHRpcGNfcG9sbCwKLQkuaW9jdGwJCT0gc29ja19ub19pb2N0bCwKKwkuaW9jdGwJCT0gdGlwY19pb2N0bCwKIAkubGlzdGVuCQk9IHRpcGNfbGlzdGVuLAogCS5zaHV0ZG93bgk9IHRpcGNfc2h1dGRvd24sCiAJLnNldHNvY2tvcHQJPSB0aXBjX3NldHNvY2tvcHQsCkBAIC0xOTU5LDcgKzIwMTIsNyBAQAogCS5hY2NlcHQJCT0gdGlwY19hY2NlcHQsCiAJLmdldG5hbWUJPSB0aXBjX2dldG5hbWUsCiAJLnBvbGwJCT0gdGlwY19wb2xsLAotCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAorCS5pb2N0bAkJPSB0aXBjX2lvY3RsLAogCS5saXN0ZW4JCT0gdGlwY19saXN0ZW4sCiAJLnNodXRkb3duCT0gdGlwY19zaHV0ZG93biwKIAkuc2V0c29ja29wdAk9IHRpcGNfc2V0c29ja29wdCwKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5oIGIvbmV0L3RpcGMvc29ja2V0LmgKaW5kZXggNzRlNWM3Zi4uM2FmY2QyYSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmgKKysrIGIvbmV0L3RpcGMvc29ja2V0LmgKQEAgLTQ0LDEyICs0NCwxNCBAQAogICogQHBvcnQ6IHBvcnQgLSBpbnRlcmFjdHMgd2l0aCAnc2snIGFuZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBUSVBDIHN0YWNrCiAgKiBAcGVlcl9uYW1lOiB0aGUgcGVlciBvZiB0aGUgY29ubmVjdGlvbiwgaWYgYW55CiAgKiBAY29ubl90aW1lb3V0OiB0aGUgdGltZSB3ZSBjYW4gd2FpdCBmb3IgYW4gdW5yZXNwb25kZWQgc2V0dXAgcmVxdWVzdAorICogQGR1cGxfcmN2Y250OiBudW1iZXIgb2YgYnl0ZXMgY291bnRlZCB0d2ljZSwgaW4gYm90aCBiYWNrbG9nIGFuZCByY3YgcXVldWUKICAqLwogCiBzdHJ1Y3QgdGlwY19zb2NrIHsKIAlzdHJ1Y3Qgc29jayBzazsKIAlzdHJ1Y3QgdGlwY19wb3J0IHBvcnQ7CiAJdW5zaWduZWQgaW50IGNvbm5fdGltZW91dDsKKwlhdG9taWNfdCBkdXBsX3JjdmNudDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRpcGNfc29jayAqdGlwY19zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCkBAIC02Nyw2ICs2OSw2IEBACiAJdHNrLT5zay5za193cml0ZV9zcGFjZSgmdHNrLT5zayk7CiB9CiAKLXUzMiB0aXBjX3NrX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpidWYpOworaW50IHRpcGNfc2tfcmN2KHN0cnVjdCBza19idWZmICpidWYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCA3NDlmODBjLi5lOTY4ODQzIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC0xNDkyLDEwICsxNDkyLDE0IEBACiAJaWYgKGxlbiA+IHNrLT5za19zbmRidWYgLSAzMikKIAkJZ290byBvdXQ7CiAKLQlpZiAobGVuID4gU0tCX01BWF9BTExPQykKKwlpZiAobGVuID4gU0tCX01BWF9BTExPQykgewogCQlkYXRhX2xlbiA9IG1pbl90KHNpemVfdCwKIAkJCQkgbGVuIC0gU0tCX01BWF9BTExPQywKIAkJCQkgTUFYX1NLQl9GUkFHUyAqIFBBR0VfU0laRSk7CisJCWRhdGFfbGVuID0gUEFHRV9BTElHTihkYXRhX2xlbik7CisKKwkJQlVJTERfQlVHX09OKFNLQl9NQVhfQUxMT0MgPCBQQUdFX1NJWkUpOworCX0KIAogCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9wc2tiKHNrLCBsZW4gLSBkYXRhX2xlbiwgZGF0YV9sZW4sCiAJCQkJICAgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIsCkBAIC0xNjcwLDYgKzE2NzQsOCBAQAogCiAJCWRhdGFfbGVuID0gbWF4X3QoaW50LCAwLCBzaXplIC0gU0tCX01BWF9IRUFEKDApKTsKIAorCQlkYXRhX2xlbiA9IG1pbl90KHNpemVfdCwgc2l6ZSwgUEFHRV9BTElHTihkYXRhX2xlbikpOworCiAJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9wc2tiKHNrLCBzaXplIC0gZGF0YV9sZW4sIGRhdGFfbGVuLAogCQkJCQkgICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVyciwKIAkJCQkJICAgZ2V0X29yZGVyKFVOSVhfU0tCX0ZSQUdTX1NaKSk7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL25ldC93aXJlbGVzcy9LY29uZmlnCmluZGV4IDE2ZDA4YjMuLjQwNWYzYzQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9LY29uZmlnCisrKyBiL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC05NSw2ICs5NSw0MyBAQAogCSAgeW91IGFyZSBhIHdpcmVsZXNzIHJlc2VhcmNoZXIgYW5kIGFyZSB3b3JraW5nIGluIGEgY29udHJvbGxlZAogCSAgYW5kIGFwcHJvdmVkIGVudmlyb25tZW50IGJ5IHlvdXIgbG9jYWwgcmVndWxhdG9yeSBhZ2VuY3kuCiAKK2NvbmZpZyBDRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFMKKwlib29sICJjZmc4MDIxMSByZWd1bGF0b3J5IHN1cHBvcnQgZm9yIGNlbGx1bGFyIGJhc2Ugc3RhdGlvbiBoaW50cyIKKwlkZXBlbmRzIG9uIENGRzgwMjExX0NFUlRJRklDQVRJT05fT05VUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgcGFyc2luZyByZWd1bGF0b3J5IGhpbnRzCisJICBmcm9tIGNlbGx1bGFyIGJhc2Ugc3RhdGlvbnMuIElmIGVuYWJsZWQgYW5kIGF0IGxlYXN0IG9uZSBkcml2ZXIKKwkgIGNsYWltcyBzdXBwb3J0IGZvciBwYXJzaW5nIGNlbGx1bGFyIGJhc2Ugc3RhdGlvbiBoaW50cyB0aGUKKwkgIHJlZ3VsYXRvcnkgY29yZSB3aWxsIGFsbG93IGFuZCBwYXJzZSB0aGVzZSByZWd1bGF0b3J5IGhpbnRzLgorCSAgVGhlIHJlZ3VsYXRvcnkgY29yZSB3aWxsIG9ubHkgYXBwbHkgdGhlc2UgcmVndWxhdG9yeSBoaW50cyBvbgorCSAgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBZb3Ugc2hvdWxkIG9ubHkgZW5hYmxlIHRoaXMKKwkgIGZlYXR1cmUgaWYgeW91IGhhdmUgdGVzdGVkIGFuZCB2YWxpZGF0ZWQgdGhpcyBmZWF0dXJlIG9uIHlvdXIKKwkgIHN5c3RlbXMuCisKK2NvbmZpZyBDRkc4MDIxMV9SRUdfUkVMQVhfTk9fSVIKKwlib29sICJjZmc4MDIxMSBzdXBwb3J0IGZvciBOT19JUiByZWxheGF0aW9uIgorCWRlcGVuZHMgb24gQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTCisJLS0taGVscC0tLQorCSBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHJlbGF4YXRpb24gb2YgdGhlIE5PX0lSIGZsYWcgZm9yCisJIHNpdHVhdGlvbnMgdGhhdCBjZXJ0YWluIHJlZ3VsYXRvcnkgYm9kaWVzIGhhdmUgcHJvdmlkZWQgY2xhcmlmaWNhdGlvbnMKKwkgb24gaG93IHJlbGF4YXRpb24gY2FuIG9jY3VyLiBUaGlzIGZlYXR1cmUgaGFzIGFuIGluaGVyZW50IGRlcGVuZGVuY3kgb24KKwkgdXNlcnNwYWNlIGZlYXR1cmVzIHdoaWNoIG11c3QgaGF2ZSBiZWVuIHByb3Blcmx5IHRlc3RlZCBhbmQgYXMgc3VjaCBpcworCSBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJIEEgcmVsYXhhdGlvbiBmZWF0dXJlIGV4YW1wbGUgaXMgYWxsb3dpbmcgdGhlIG9wZXJhdGlvbiBvZiBhIFAyUCBncm91cAorCSBvd25lciAoR08pIG9uIGNoYW5uZWxzIG1hcmtlZCB3aXRoIE5PX0lSIGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgQlNTCisJIGludGVyZmFjZSB3aGljaCBhc3NvY2lhdGVkIHRvIGFuIEFQIHdoaWNoIHVzZXJzcGFjZSBhc3N1bWVzIG9yIGNvbmZpcm1zCisJIHRvIGJlIGFuIGF1dGhvcml6ZWQgbWFzdGVyLCBpLmUuLCB3aXRoIHJhZGFyIGRldGVjdGlvbiBzdXBwb3J0IGFuZCBERlMKKwkgY2FwYWJpbGl0aWVzLiBIb3dldmVyLCBub3RlIHRoYXQgaW4gb3JkZXIgdG8gbm90IGNyZWF0ZSBkYWlzeSBjaGFpbgorCSBzY2VuYXJpb3MsIHRoaXMgcmVsYXhhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBjYXNlcyB0aGF0IHRoZSBCU1MgY2xpZW50CisJIGlzIGFzc29jaWF0ZWQgdG8gUDJQIEdPIGFuZCBpbiBhZGRpdGlvbiB0aGUgUDJQIEdPIGluc3RhbnRpYXRlZCBvbgorCSBhIGNoYW5uZWwgZHVlIHRvIHRoaXMgcmVsYXhhdGlvbiBzaG91bGQgbm90IGFsbG93IGNvbm5lY3Rpb24gZnJvbQorCSBub24gUDJQIGNsaWVudHMuCisKKwkgVGhlIHJlZ3VsYXRvcnkgY29yZSB3aWxsIGFwcGx5IHRoZXNlIHJlbGF4YXRpb25zIG9ubHkgZm9yIGRyaXZlcnMgdGhhdAorCSBzdXBwb3J0IHRoaXMgZmVhdHVyZSBieSBkZWNsYXJpbmcgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgZmxhZ3MgYW5kCisJIGNhcGFiaWxpdGllcyBpbiB0aGVpciByZWdpc3RyYXRpb24gZmxvdy4KKwogY29uZmlnIENGRzgwMjExX0RFRkFVTFRfUFMKIAlib29sICJlbmFibGUgcG93ZXJzYXZlIGJ5IGRlZmF1bHQiCiAJZGVwZW5kcyBvbiBDRkc4MDIxMQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2FwLmMgYi9uZXQvd2lyZWxlc3MvYXAuYwppbmRleCAzZTAyYWRlLi5iZGFkMWY5IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvYXAuYworKysgYi9uZXQvd2lyZWxlc3MvYXAuYwpAQCAtNiw4ICs2LDggQEAKICNpbmNsdWRlICJyZGV2LW9wcy5oIgogCiAKLXN0YXRpYyBpbnQgX19jZmc4MDIxMV9zdG9wX2FwKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgbm90aWZ5KQoraW50IF9fY2ZnODAyMTFfc3RvcF9hcChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIG5vdGlmeSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCWludCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY2hhbi5jIGIvbmV0L3dpcmVsZXNzL2NoYW4uYwppbmRleCA5Yzk1MDFhLi45OTJiMzQwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY2hhbi5jCisrKyBiL25ldC93aXJlbGVzcy9jaGFuLmMKQEAgLTMyNiwyOCArMzI2LDU3IEBACiAKIAogaW50IGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCisJCQkJICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYsCisJCQkJICBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZSkKIHsKIAlpbnQgd2lkdGg7Ci0JaW50IHI7CisJaW50IHJldDsKIAogCWlmIChXQVJOX09OKCFjZmc4MDIxMV9jaGFuZGVmX3ZhbGlkKGNoYW5kZWYpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl3aWR0aCA9IGNmZzgwMjExX2NoYW5kZWZfZ2V0X3dpZHRoKGNoYW5kZWYpOwotCWlmICh3aWR0aCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoaWZ0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJd2lkdGggPSBjZmc4MDIxMV9jaGFuZGVmX2dldF93aWR0aChjaGFuZGVmKTsKKwkJaWYgKHdpZHRoIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JciA9IGNmZzgwMjExX2dldF9jaGFuc19kZnNfcmVxdWlyZWQod2lwaHksIGNoYW5kZWYtPmNlbnRlcl9mcmVxMSwKLQkJCQkJICAgIHdpZHRoKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7CisJCXJldCA9IGNmZzgwMjExX2dldF9jaGFuc19kZnNfcmVxdWlyZWQod2lwaHksCisJCQkJCQkgICAgICBjaGFuZGVmLT5jZW50ZXJfZnJlcTEsCisJCQkJCQkgICAgICB3aWR0aCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJZWxzZSBpZiAocmV0ID4gMCkKKwkJCXJldHVybiBCSVQoY2hhbmRlZi0+d2lkdGgpOwogCi0JaWYgKCFjaGFuZGVmLT5jZW50ZXJfZnJlcTIpCi0JCXJldHVybiAwOworCQlpZiAoIWNoYW5kZWYtPmNlbnRlcl9mcmVxMikKKwkJCXJldHVybiAwOwogCi0JcmV0dXJuIGNmZzgwMjExX2dldF9jaGFuc19kZnNfcmVxdWlyZWQod2lwaHksIGNoYW5kZWYtPmNlbnRlcl9mcmVxMiwKLQkJCQkJICAgICAgIHdpZHRoKTsKKwkJcmV0ID0gY2ZnODAyMTFfZ2V0X2NoYW5zX2Rmc19yZXF1aXJlZCh3aXBoeSwKKwkJCQkJCSAgICAgIGNoYW5kZWYtPmNlbnRlcl9mcmVxMiwKKwkJCQkJCSAgICAgIHdpZHRoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQllbHNlIGlmIChyZXQgPiAwKQorCQkJcmV0dXJuIEJJVChjaGFuZGVmLT53aWR0aCk7CisKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKKwljYXNlIE5VTV9OTDgwMjExX0lGVFlQRVM6CisJCVdBUk5fT04oMSk7CisJfQorCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKTsKIApAQCAtNTg3LDEyICs2MTYsMTQgQEAKIAkJd2lkdGggPSA1OwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8xMDoKKwkJcHJvaGliaXRlZF9mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT18xME1IWjsKIAkJd2lkdGggPSAxMDsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjA6CiAJCWlmICghaHRfY2FwLT5odF9zdXBwb3J0ZWQpCiAJCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVDoKKwkJcHJvaGliaXRlZF9mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT18yME1IWjsKIAkJd2lkdGggPSAyMDsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfNDA6CkBAIC02NjEsMTcgKzY5MiwxMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfY2hhbmRlZl91c2FibGUpOwogCi1ib29sIGNmZzgwMjExX3JlZ19jYW5fYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZikKKy8qCisgKiBGb3IgR08gb25seSwgY2hlY2sgaWYgdGhlIGNoYW5uZWwgY2FuIGJlIHVzZWQgdW5kZXIgcGVybWlzc2l2ZSBjb25kaXRpb25zCisgKiBtYW5kYXRlZCBieSB0aGUgc29tZSByZWd1bGF0b3J5IGJvZGllcywgaS5lLiwgdGhlIGNoYW5uZWwgaXMgbWFya2VkIHdpdGgKKyAqIElFRUU4MDIxMV9DSEFOX0dPX0NPTkNVUlJFTlQgYW5kIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgc3RhdGlvbiBpbnRlcmZhY2UKKyAqIGFzc29jaWF0ZWQgdG8gYW4gQVAgb24gdGhlIHNhbWUgY2hhbm5lbCBvciBvbiB0aGUgc2FtZSBVTklJIGJhbmQKKyAqIChhc3N1bWluZyB0aGF0IHRoZSBBUCBpcyBhbiBhdXRob3JpemVkIG1hc3RlcikuCisgKiBJbiBhZGRpdGlvbiBhbGxvdyB0aGUgR08gdG8gb3BlcmF0ZSBvbiBhIGNoYW5uZWwgb24gd2hpY2ggaW5kb29yIG9wZXJhdGlvbiBpcworICogYWxsb3dlZCwgaWZmIHdlIGFyZSBjdXJyZW50bHkgb3BlcmF0aW5nIGluIGFuIGluZG9vciBlbnZpcm9ubWVudC4KKyAqLworc3RhdGljIGJvb2wgY2ZnODAyMTFfZ29fcGVybWlzc2l2ZV9jaGFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXZfaXRlcjsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2lwaHlfaWR4X3RvX3dpcGh5KHJkZXYtPndpcGh5X2lkeCk7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKCFjb25maWdfZW5hYmxlZChDT05GSUdfQ0ZHODAyMTFfUkVHX1JFTEFYX05PX0lSKSB8fAorCSAgICAhKHdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzICYgUkVHVUxBVE9SWV9FTkFCTEVfUkVMQVhfTk9fSVIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAocmVndWxhdG9yeV9pbmRvb3JfYWxsb3dlZCgpICYmCisJICAgIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0lORE9PUl9PTkxZKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIShjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0dPX0NPTkNVUlJFTlQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIEdlbmVyYWxseSwgaXQgaXMgcG9zc2libGUgdG8gcmVseSBvbiBhbm90aGVyIGRldmljZS9kcml2ZXIgdG8gYWxsb3cKKwkgKiB0aGUgR08gY29uY3VycmVudCByZWxheGF0aW9uLCBob3dldmVyLCBzaW5jZSB0aGUgZGV2aWNlIGNhbiBmdXJ0aGVyCisJICogZW5mb3JjZSB0aGUgcmVsYXhhdGlvbiAoYnkgZG9pbmcgYSBzaW1pbGFyIHZlcmlmaWNhdGlvbnMgYXMgdGhpcyksCisJICogYW5kIHRodXMgZmFpbCB0aGUgR08gaW5zdGFudGlhdGlvbiwgY29uc2lkZXIgb25seSB0aGUgaW50ZXJmYWNlcyBvZgorCSAqIHRoZSBjdXJyZW50IHJlZ2lzdGVyZWQgZGV2aWNlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkod2Rldl9pdGVyLCAmcmRldi0+d2Rldl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqb3RoZXJfY2hhbiA9IE5VTEw7CisJCWludCByMSwgcjI7CisKKwkJaWYgKHdkZXZfaXRlci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJICAgICFuZXRpZl9ydW5uaW5nKHdkZXZfaXRlci0+bmV0ZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXdkZXZfbG9jayh3ZGV2X2l0ZXIpOworCQlpZiAod2Rldl9pdGVyLT5jdXJyZW50X2JzcykKKwkJCW90aGVyX2NoYW4gPSB3ZGV2X2l0ZXItPmN1cnJlbnRfYnNzLT5wdWIuY2hhbm5lbDsKKwkJd2Rldl91bmxvY2sod2Rldl9pdGVyKTsKKworCQlpZiAoIW90aGVyX2NoYW4pCisJCQljb250aW51ZTsKKworCQlpZiAoY2hhbiA9PSBvdGhlcl9jaGFuKQorCQkJcmV0dXJuIHRydWU7CisKKwkJaWYgKGNoYW4tPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCWNvbnRpbnVlOworCisJCXIxID0gY2ZnODAyMTFfZ2V0X3VuaWkoY2hhbi0+Y2VudGVyX2ZyZXEpOworCQlyMiA9IGNmZzgwMjExX2dldF91bmlpKG90aGVyX2NoYW4tPmNlbnRlcl9mcmVxKTsKKworCQlpZiAocjEgIT0gLUVJTlZBTCAmJiByMSA9PSByMikgeworCQkJLyoKKwkJCSAqIEF0IHNvbWUgbG9jYXRpb25zIGNoYW5uZWxzIDE0OS0xNjUgYXJlIGNvbnNpZGVyZWQgYQorCQkJICogYnVuZGxlLCBidXQgYXQgb3RoZXIgbG9jYXRpb25zLCBlLmcuLCBJbmRvbmVzaWEsCisJCQkgKiBjaGFubmVscyAxNDktMTYxIGFyZSBjb25zaWRlcmVkIGEgYnVuZGxlIHdoaWxlCisJCQkgKiBjaGFubmVsIDE2NSBpcyBsZWZ0IG91dCBhbmQgY29uc2lkZXJlZCB0byBiZSBpbiBhCisJCQkgKiBkaWZmZXJlbnQgYnVuZGxlLiBUaHVzLCBpbiBjYXNlIHRoYXQgdGhlcmUgaXMgYQorCQkJICogc3RhdGlvbiBpbnRlcmZhY2UgY29ubmVjdGVkIHRvIGFuIEFQIG9uIGNoYW5uZWwgMTY1LAorCQkJICogaXQgaXMgYXNzdW1lZCB0aGF0IGNoYW5uZWxzIDE0OS0xNjEgYXJlIGFsbG93ZWQgZm9yCisJCQkgKiBHTyBvcGVyYXRpb25zLiBIb3dldmVyLCBoYXZpbmcgYSBzdGF0aW9uIGludGVyZmFjZQorCQkJICogY29ubmVjdGVkIHRvIGFuIEFQIG9uIGNoYW5uZWxzIDE0OS0xNjEsIGRvZXMgbm90CisJCQkgKiBhbGxvdyBHTyBvcGVyYXRpb24gb24gY2hhbm5lbCAxNjUuCisJCQkgKi8KKwkJCWlmIChjaGFuLT5jZW50ZXJfZnJlcSA9PSA1ODI1ICYmCisJCQkgICAgb3RoZXJfY2hhbi0+Y2VudGVyX2ZyZXEgIT0gNTgyNSkKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitib29sIGNmZzgwMjExX3JlZ19jYW5fYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSBpZnR5cGUpCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJYm9vbCByZXM7CiAJdTMyIHByb2hpYml0ZWRfZmxhZ3MgPSBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCB8Ci0JCQkgICAgICAgSUVFRTgwMjExX0NIQU5fTk9fSVIgfAogCQkJICAgICAgIElFRUU4MDIxMV9DSEFOX1JBREFSOwogCi0JdHJhY2VfY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24od2lwaHksIGNoYW5kZWYpOworCXRyYWNlX2NmZzgwMjExX3JlZ19jYW5fYmVhY29uKHdpcGh5LCBjaGFuZGVmLCBpZnR5cGUpOwogCi0JaWYgKGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdpcGh5LCBjaGFuZGVmKSA+IDAgJiYKKwkvKgorCSAqIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyBzdWdnZXN0ZWQgYnkgdGhlIHNvbWUgcmVndWxhdG9yeSBib2RpZXMKKwkgKiBhIEdPIGNhbiBvcGVyYXRlIG9uIGNoYW5uZWxzIG1hcmtlZCB3aXRoIElFRUU4MDIxMV9OT19JUgorCSAqIHNvIHNldCB0aGlzIGZsYWcgb25seSBpZiBzdWNoIHJlbGF4YXRpb25zIGFyZSBub3QgZW5hYmxlZCBhbmQKKwkgKiB0aGUgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4KKwkgKi8KKwlpZiAoaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9HTyB8fAorCSAgICAhY2ZnODAyMTFfZ29fcGVybWlzc2l2ZV9jaGFuKHJkZXYsIGNoYW5kZWYtPmNoYW4pKQorCQlwcm9oaWJpdGVkX2ZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PX0lSOworCisJaWYgKGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdpcGh5LCBjaGFuZGVmLCBpZnR5cGUpID4gMCAmJgogCSAgICBjZmc4MDIxMV9jaGFuZGVmX2Rmc19hdmFpbGFibGUod2lwaHksIGNoYW5kZWYpKSB7CiAJCS8qIFdlIGNhbiBza2lwIElFRUU4MDIxMV9DSEFOX05PX0lSIGlmIGNoYW5kZWYgZGZzIGF2YWlsYWJsZSAqLwogCQlwcm9oaWJpdGVkX2ZsYWdzID0gSUVFRTgwMjExX0NIQU5fRElTQUJMRUQ7CkBAIC03MDEsNiArODI2LDggQEAKIAkJICAgICAgICBlbnVtIGNmZzgwMjExX2NoYW5fbW9kZSAqY2hhbm1vZGUsCiAJCSAgICAgICAgdTggKnJhZGFyX2RldGVjdCkKIHsKKwlpbnQgcmV0OworCiAJKmNoYW4gPSBOVUxMOwogCSpjaGFubW9kZSA9IENIQU5fTU9ERV9VTkRFRklORUQ7CiAKQEAgLTc0Myw4ICs4NzAsMTEgQEAKIAkJCSpjaGFuID0gd2Rldi0+Y2hhbmRlZi5jaGFuOwogCQkJKmNoYW5tb2RlID0gQ0hBTl9NT0RFX1NIQVJFRDsKIAotCQkJaWYgKGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdkZXYtPndpcGh5LAotCQkJCQkJCSAgJndkZXYtPmNoYW5kZWYpKQorCQkJcmV0ID0gY2ZnODAyMTFfY2hhbmRlZl9kZnNfcmVxdWlyZWQod2Rldi0+d2lwaHksCisJCQkJCQkJICAgICZ3ZGV2LT5jaGFuZGVmLAorCQkJCQkJCSAgICB3ZGV2LT5pZnR5cGUpOworCQkJV0FSTl9PTihyZXQgPCAwKTsKKwkJCWlmIChyZXQgPiAwKQogCQkJCSpyYWRhcl9kZXRlY3QgfD0gQklUKHdkZXYtPmNoYW5kZWYud2lkdGgpOwogCQl9CiAJCXJldHVybjsKQEAgLTc1Myw4ICs4ODMsMTEgQEAKIAkJCSpjaGFuID0gd2Rldi0+Y2hhbmRlZi5jaGFuOwogCQkJKmNoYW5tb2RlID0gQ0hBTl9NT0RFX1NIQVJFRDsKIAotCQkJaWYgKGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdkZXYtPndpcGh5LAotCQkJCQkJCSAgJndkZXYtPmNoYW5kZWYpKQorCQkJcmV0ID0gY2ZnODAyMTFfY2hhbmRlZl9kZnNfcmVxdWlyZWQod2Rldi0+d2lwaHksCisJCQkJCQkJICAgICZ3ZGV2LT5jaGFuZGVmLAorCQkJCQkJCSAgICB3ZGV2LT5pZnR5cGUpOworCQkJV0FSTl9PTihyZXQgPCAwKTsKKwkJCWlmIChyZXQgPiAwKQogCQkJCSpyYWRhcl9kZXRlY3QgfD0gQklUKHdkZXYtPmNoYW5kZWYud2lkdGgpOwogCQl9CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IDA4NmNkZGQuLmExYzQwNjUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtNjksNyArNjksNyBAQAogCiBpbnQgZ2V0X3dpcGh5X2lkeChzdHJ1Y3Qgd2lwaHkgKndpcGh5KQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAKIAlyZXR1cm4gcmRldi0+d2lwaHlfaWR4OwogfQpAQCAtMTMwLDcgKzEzMCw3IEBACiAJCQkgICAgbmV3bmFtZSkpCiAJCXByX2VycigiZmFpbGVkIHRvIHJlbmFtZSBkZWJ1Z2ZzIGRpciB0byAlcyFcbiIsIG5ld25hbWUpOwogCi0Jbmw4MDIxMV9ub3RpZnlfZGV2X3JlbmFtZShyZGV2KTsKKwlubDgwMjExX25vdGlmeV93aXBoeShyZGV2LCBOTDgwMjExX0NNRF9ORVdfV0lQSFkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTAsMTUgKzIxMCwxMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjZmc4MDIxMV9yZmtpbGxfc2V0X2Jsb2NrKHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKK3ZvaWQgY2ZnODAyMTFfc2h1dGRvd25fYWxsX2ludGVyZmFjZXMoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBkYXRhOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKLQlpZiAoIWJsb2NrZWQpCi0JCXJldHVybiAwOwotCi0JcnRubF9sb2NrKCk7CisJQVNTRVJUX1JUTkwoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkod2RldiwgJnJkZXYtPndkZXZfbGlzdCwgbGlzdCkgewogCQlpZiAod2Rldi0+bmV0ZGV2KSB7CkBAIC0yMzQsNyArMjMxLDE4IEBACiAJCQlicmVhazsKIAkJfQogCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3NodXRkb3duX2FsbF9pbnRlcmZhY2VzKTsKIAorc3RhdGljIGludCBjZmc4MDIxMV9yZmtpbGxfc2V0X2Jsb2NrKHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBkYXRhOworCisJaWYgKCFibG9ja2VkKQorCQlyZXR1cm4gMDsKKworCXJ0bmxfbG9jaygpOworCWNmZzgwMjExX3NodXRkb3duX2FsbF9pbnRlcmZhY2VzKCZyZGV2LT53aXBoeSk7CiAJcnRubF91bmxvY2soKTsKIAogCXJldHVybiAwOwpAQCAtMjYwLDYgKzI2OCw0NSBAQAogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKK3ZvaWQgY2ZnODAyMTFfZGVzdHJveV9pZmFjZXMoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBjZmc4MDIxMV9pZmFjZV9kZXN0cm95ICppdGVtOworCisJQVNTRVJUX1JUTkwoKTsKKworCXNwaW5fbG9ja19pcnEoJnJkZXYtPmRlc3Ryb3lfbGlzdF9sb2NrKTsKKwl3aGlsZSAoKGl0ZW0gPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnJkZXYtPmRlc3Ryb3lfbGlzdCwKKwkJCQkJCXN0cnVjdCBjZmc4MDIxMV9pZmFjZV9kZXN0cm95LAorCQkJCQkJbGlzdCkpKSB7CisJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsICp0bXA7CisJCXUzMiBubHBvcnRpZCA9IGl0ZW0tPm5scG9ydGlkOworCisJCWxpc3RfZGVsKCZpdGVtLT5saXN0KTsKKwkJa2ZyZWUoaXRlbSk7CisJCXNwaW5fdW5sb2NrX2lycSgmcmRldi0+ZGVzdHJveV9saXN0X2xvY2spOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3ZGV2LCB0bXAsICZyZGV2LT53ZGV2X2xpc3QsIGxpc3QpIHsKKwkJCWlmIChubHBvcnRpZCA9PSB3ZGV2LT5vd25lcl9ubHBvcnRpZCkKKwkJCQlyZGV2X2RlbF92aXJ0dWFsX2ludGYocmRldiwgd2Rldik7CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZyZGV2LT5kZXN0cm95X2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcmRldi0+ZGVzdHJveV9saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjZmc4MDIxMV9kZXN0cm95X2lmYWNlX3drKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CisKKwlyZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSwKKwkJCSAgICBkZXN0cm95X3dvcmspOworCisJcnRubF9sb2NrKCk7CisJY2ZnODAyMTFfZGVzdHJveV9pZmFjZXMocmRldik7CisJcnRubF91bmxvY2soKTsKK30KKwogLyogZXhwb3J0ZWQgZnVuY3Rpb25zICovCiAKIHN0cnVjdCB3aXBoeSAqd2lwaHlfbmV3KGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgKm9wcywgaW50IHNpemVvZl9wcml2KQpAQCAtMzE4LDYgKzM2NSwxMCBAQAogCXJkZXYtPndpcGh5LmRldi5jbGFzcyA9ICZpZWVlODAyMTFfY2xhc3M7CiAJcmRldi0+d2lwaHkuZGV2LnBsYXRmb3JtX2RhdGEgPSByZGV2OwogCisJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmRlc3Ryb3lfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnJkZXYtPmRlc3Ryb3lfbGlzdF9sb2NrKTsKKwlJTklUX1dPUksoJnJkZXYtPmRlc3Ryb3lfd29yaywgY2ZnODAyMTFfZGVzdHJveV9pZmFjZV93ayk7CisKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QUwogCXJkZXYtPndpcGh5LmZsYWdzIHw9IFdJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKICNlbmRpZgpAQCAtMzUxLDYgKzQwMiw4IEBACiAJcmRldi0+d2lwaHkucnRzX3RocmVzaG9sZCA9ICh1MzIpIC0xOwogCXJkZXYtPndpcGh5LmNvdmVyYWdlX2NsYXNzID0gMDsKIAorCXJkZXYtPndpcGh5Lm1heF9udW1fY3NhX2NvdW50ZXJzID0gMTsKKwogCXJldHVybiAmcmRldi0+d2lwaHk7CiB9CiBFWFBPUlRfU1lNQk9MKHdpcGh5X25ldyk7CkBAIC0zOTYsMTAgKzQ0OSw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBjLT5uX2xpbWl0czsgaisrKSB7CiAJCQl1MTYgdHlwZXMgPSBjLT5saW1pdHNbal0udHlwZXM7CiAKLQkJCS8qCi0JCQkgKiBpbnRlcmZhY2UgdHlwZXMgc2hvdWxkbid0IG92ZXJsYXAsIHRoaXMgaXMKLQkJCSAqIHVzZWQgaW4gY2ZnODAyMTFfY2FuX2NoYW5nZV9pbnRlcmZhY2UoKQotCQkJICovCisJCQkvKiBpbnRlcmZhY2UgdHlwZXMgc2hvdWxkbid0IG92ZXJsYXAgKi8KIAkJCWlmIChXQVJOX09OKHR5cGVzICYgYWxsX2lmdHlwZXMpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYWxsX2lmdHlwZXMgfD0gdHlwZXM7CkBAIC00MzUsNyArNDg1LDcgQEAKIAogaW50IHdpcGh5X3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAlpbnQgcmVzOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKQEAgLTYxMCwxMyArNjYwLDE1IEBACiAJCXJldHVybiByZXM7CiAJfQogCisJbmw4MDIxMV9ub3RpZnlfd2lwaHkocmRldiwgTkw4MDIxMV9DTURfTkVXX1dJUEhZKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh3aXBoeV9yZWdpc3Rlcik7CiAKIHZvaWQgd2lwaHlfcmZraWxsX3N0YXJ0X3BvbGxpbmcoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJaWYgKCFyZGV2LT5vcHMtPnJma2lsbF9wb2xsKQogCQlyZXR1cm47CkBAIC02MjcsNyArNjc5LDcgQEAKIAogdm9pZCB3aXBoeV9yZmtpbGxfc3RvcF9wb2xsaW5nKHN0cnVjdCB3aXBoeSAqd2lwaHkpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAogCXJma2lsbF9wYXVzZV9wb2xsaW5nKHJkZXYtPnJma2lsbCk7CiB9CkBAIC02MzUsNyArNjg3LDcgQEAKIAogdm9pZCB3aXBoeV91bnJlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAogCXdhaXRfZXZlbnQocmRldi0+ZGV2X3dhaXQsICh7CiAJCWludCBfX2NvdW50OwpAQCAtNjQ4LDkgKzcwMCwxMCBAQAogCQlyZmtpbGxfdW5yZWdpc3RlcihyZGV2LT5yZmtpbGwpOwogCiAJcnRubF9sb2NrKCk7CisJbmw4MDIxMV9ub3RpZnlfd2lwaHkocmRldiwgTkw4MDIxMV9DTURfREVMX1dJUEhZKTsKIAlyZGV2LT53aXBoeS5yZWdpc3RlcmVkID0gZmFsc2U7CiAKLQlCVUdfT04oIWxpc3RfZW1wdHkoJnJkZXYtPndkZXZfbGlzdCkpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJkZXYtPndkZXZfbGlzdCkpOwogCiAJLyoKIAkgKiBGaXJzdCByZW1vdmUgdGhlIGhhcmR3YXJlIGZyb20gZXZlcnl3aGVyZSwgdGhpcyBtYWtlcwpAQCAtNjc1LDYgKzcyOCw3IEBACiAJY2FuY2VsX3dvcmtfc3luYygmcmRldi0+Y29ubl93b3JrKTsKIAlmbHVzaF93b3JrKCZyZGV2LT5ldmVudF93b3JrKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkZXYtPmRmc191cGRhdGVfY2hhbm5lbHNfd2spOworCWZsdXNoX3dvcmsoJnJkZXYtPmRlc3Ryb3lfd29yayk7CiAKICNpZmRlZiBDT05GSUdfUE0KIAlpZiAocmRldi0+d2lwaHkud293bGFuX2NvbmZpZyAmJiByZGV2LT5vcHMtPnNldF93YWtldXApCkBAIC03MDcsNyArNzYxLDcgQEAKIAogdm9pZCB3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHN0cnVjdCB3aXBoeSAqd2lwaHksIGJvb2wgYmxvY2tlZCkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJaWYgKHJma2lsbF9zZXRfaHdfc3RhdGUocmRldi0+cmZraWxsLCBibG9ja2VkKSkKIAkJc2NoZWR1bGVfd29yaygmcmRldi0+cmZraWxsX3N5bmMpOwpAQCAtNzE2LDcgKzc3MCw3IEBACiAKIHZvaWQgY2ZnODAyMTFfdW5yZWdpc3Rlcl93ZGV2KHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAogCUFTU0VSVF9SVE5MKCk7CiAKQEAgLTc1MSwyMyArODA1LDIzIEBACiAJCXJkZXYtPm51bV9ydW5uaW5nX21vbml0b3JfaWZhY2VzICs9IG51bTsKIH0KIAotdm9pZCBjZmc4MDIxMV9sZWF2ZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQordm9pZCBfX2NmZzgwMjExX2xlYXZlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OwogCiAJQVNTRVJUX1JUTkwoKTsKKwlBU1NFUlRfV0RFVl9MT0NLKHdkZXYpOwogCiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQljZmc4MDIxMV9sZWF2ZV9pYnNzKHJkZXYsIGRldiwgdHJ1ZSk7CisJCV9fY2ZnODAyMTFfbGVhdmVfaWJzcyhyZGV2LCBkZXYsIHRydWUpOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlpZiAocmRldi0+c2NoZWRfc2Nhbl9yZXEgJiYgZGV2ID09IHJkZXYtPnNjaGVkX3NjYW5fcmVxLT5kZXYpCiAJCQlfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCBmYWxzZSk7CiAKLQkJd2Rldl9sb2NrKHdkZXYpOwogI2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUCiAJCWtmcmVlKHdkZXYtPndleHQuaWUpOwogCQl3ZGV2LT53ZXh0LmllID0gTlVMTDsKQEAgLTc3NiwzMiArODMwLDYwIEBACiAjZW5kaWYKIAkJY2ZnODAyMTFfZGlzY29ubmVjdChyZGV2LCBkZXYsCiAJCQkJICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HLCB0cnVlKTsKLQkJd2Rldl91bmxvY2sod2Rldik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKLQkJY2ZnODAyMTFfbGVhdmVfbWVzaChyZGV2LCBkZXYpOworCQlfX2NmZzgwMjExX2xlYXZlX21lc2gocmRldiwgZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQkJY2ZnODAyMTFfc3RvcF9hcChyZGV2LCBkZXYsIHRydWUpOworCQlfX2NmZzgwMjExX3N0b3BfYXAocmRldiwgZGV2LCB0cnVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogfQogCit2b2lkIGNmZzgwMjExX2xlYXZlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCit7CisJd2Rldl9sb2NrKHdkZXYpOworCV9fY2ZnODAyMTFfbGVhdmUocmRldiwgd2Rldik7CisJd2Rldl91bmxvY2sod2Rldik7Cit9CisKK3ZvaWQgY2ZnODAyMTFfc3RvcF9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfZXZlbnQgKmV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZV9jZmc4MDIxMV9zdG9wX2lmYWNlKHdpcGh5LCB3ZGV2KTsKKworCWV2ID0ga3phbGxvYyhzaXplb2YoKmV2KSwgZ2ZwKTsKKwlpZiAoIWV2KQorCQlyZXR1cm47CisKKwlldi0+dHlwZSA9IEVWRU5UX1NUT1BQRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2Rldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmV2LT5saXN0LCAmd2Rldi0+ZXZlbnRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2Rldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCXF1ZXVlX3dvcmsoY2ZnODAyMTFfd3EsICZyZGV2LT5ldmVudF93b3JrKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfc3RvcF9pZmFjZSk7CisKIHN0YXRpYyBpbnQgY2ZnODAyMTFfbmV0ZGV2X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgc3RhdGUsIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7Ci0JaW50IHJldDsKIAogCWlmICghd2RldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCiAJV0FSTl9PTih3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpOwogCkBAIC05NTksMTMgKzEwNDEsMTQgQEAKIAljYXNlIE5FVERFVl9QUkVfVVA6CiAJCWlmICghKHdkZXYtPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQod2Rldi0+aWZ0eXBlKSkpCiAJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygtRU9QTk9UU1VQUCk7Ci0JCXJldCA9IGNmZzgwMjExX2Nhbl9hZGRfaW50ZXJmYWNlKHJkZXYsIHdkZXYtPmlmdHlwZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOworCQlpZiAocmZraWxsX2Jsb2NrZWQocmRldi0+cmZraWxsKSkKKwkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FUkZLSUxMKTsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOwogCX0KIAotCXJldHVybiBOT1RJRllfRE9ORTsKKwlyZXR1cm4gTk9USUZZX09LOwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNmZzgwMjExX25ldGRldl9ub3RpZmllciA9IHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IDViMWZkY2EuLmU5YWZiZjEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtODAsMTMgKzgwLDE3IEBACiAKIAlzdHJ1Y3QgY2ZnODAyMTFfY29hbGVzY2UgKmNvYWxlc2NlOwogCisJc3BpbmxvY2tfdCBkZXN0cm95X2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlc3Ryb3lfbGlzdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVzdHJveV93b3JrOworCiAJLyogbXVzdCBiZSBsYXN0IGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyB3aXBoeV9wcml2KCksCiAJICogYW5kIGl0IHNob3VsZCBhdCBsZWFzdCBiZSBhbGlnbmVkIHRvIE5FVERFVl9BTElHTiAqLwogCXN0cnVjdCB3aXBoeSB3aXBoeSBfX2FsaWduZWQoTkVUREVWX0FMSUdOKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUKLXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqd2lwaHlfdG9fZGV2KHN0cnVjdCB3aXBoeSAqd2lwaHkpCitzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKndpcGh5X3RvX3JkZXYoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlCVUdfT04oIXdpcGh5KTsKIAlyZXR1cm4gY29udGFpbmVyX29mKHdpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UsIHdpcGh5KTsKQEAgLTE4MSw2ICsxODUsNyBAQAogCUVWRU5UX1JPQU1FRCwKIAlFVkVOVF9ESVNDT05ORUNURUQsCiAJRVZFTlRfSUJTU19KT0lORUQsCisJRVZFTlRfU1RPUFBFRCwKIH07CiAKIHN0cnVjdCBjZmc4MDIxMV9ldmVudCB7CkBAIC0yMzIsNiArMjM3LDEzIEBACiAJdTMyIG5scG9ydGlkOwogfTsKIAorc3RydWN0IGNmZzgwMjExX2lmYWNlX2Rlc3Ryb3kgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MzIgbmxwb3J0aWQ7Cit9OworCit2b2lkIGNmZzgwMjExX2Rlc3Ryb3lfaWZhY2VzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldik7CisKIC8qIGZyZWUgb2JqZWN0ICovCiB2b2lkIGNmZzgwMjExX2Rldl9mcmVlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldik7CiAKQEAgLTI0MCw4ICsyNTIsOCBAQAogCiB2b2lkIGllZWU4MDIxMV9zZXRfYml0cmF0ZV9mbGFncyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKIAotdm9pZCBjZmc4MDIxMV9ic3NfZXhwaXJlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2KTsKLXZvaWQgY2ZnODAyMTFfYnNzX2FnZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKK3ZvaWQgY2ZnODAyMTFfYnNzX2V4cGlyZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpOwordm9pZCBjZmc4MDIxMV9ic3NfYWdlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFnZV9zZWNzKTsKIAogLyogSUJTUyAqLwpAQCAtMjcwLDYgKzI4Miw4IEBACiAJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgICAgc3RydWN0IG1lc2hfc2V0dXAgKnNldHVwLAogCQkgICAgICAgY29uc3Qgc3RydWN0IG1lc2hfY29uZmlnICpjb25mKTsKK2ludCBfX2NmZzgwMjExX2xlYXZlX21lc2goc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBjZmc4MDIxMV9sZWF2ZV9tZXNoKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGNmZzgwMjExX3NldF9tZXNoX2NoYW5uZWwoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApAQCAtMjc3LDYgKzI5MSw4IEBACiAJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpOwogCiAvKiBBUCAqLworaW50IF9fY2ZnODAyMTFfc3RvcF9hcChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIG5vdGlmeSk7CiBpbnQgY2ZnODAyMTFfc3RvcF9hcChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBub3RpZnkpOwogCkBAIC00MDEsMzUgKzQxNyw2IEBACiBjZmc4MDIxMV9jaGFuZGVmX2Rmc19jYWNfdGltZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKTsKIAotc3RhdGljIGlubGluZSBpbnQKLWNmZzgwMjExX2Nhbl9jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCQkgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZSkKLXsKLQlyZXR1cm4gY2ZnODAyMTFfY2FuX3VzZV9pZnR5cGVfY2hhbihyZGV2LCB3ZGV2LCBpZnR5cGUsIE5VTEwsCi0JCQkJCSAgICBDSEFOX01PREVfVU5ERUZJTkVELCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWNmZzgwMjExX2Nhbl9hZGRfaW50ZXJmYWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJCSAgIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlKQotewotCWlmIChyZmtpbGxfYmxvY2tlZChyZGV2LT5yZmtpbGwpKQotCQlyZXR1cm4gLUVSRktJTEw7Ci0KLQlyZXR1cm4gY2ZnODAyMTFfY2FuX2NoYW5nZV9pbnRlcmZhY2UocmRldiwgTlVMTCwgaWZ0eXBlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWNmZzgwMjExX2Nhbl91c2VfY2hhbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKLQkJICAgICAgZW51bSBjZmc4MDIxMV9jaGFuX21vZGUgY2hhbm1vZGUpCi17Ci0JcmV0dXJuIGNmZzgwMjExX2Nhbl91c2VfaWZ0eXBlX2NoYW4ocmRldiwgd2Rldiwgd2Rldi0+aWZ0eXBlLAotCQkJCQkgICAgY2hhbiwgY2hhbm1vZGUsIDApOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlbGFwc2VkX2ppZmZpZXNfbXNlY3ModW5zaWduZWQgbG9uZyBzdGFydCkKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IGppZmZpZXM7CkBAIC00NTksNiArNDQ2LDggQEAKIHZvaWQgY2ZnODAyMTFfdXBkYXRlX2lmYWNlX251bShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSBpZnR5cGUsIGludCBudW0pOwogCit2b2lkIF9fY2ZnODAyMTFfbGVhdmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIHZvaWQgY2ZnODAyMTFfbGVhdmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ldGh0b29sLmMgYi9uZXQvd2lyZWxlc3MvZXRodG9vbC5jCmluZGV4IGUzNzg2MmYuLmQ0ODYwYmYgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ldGh0b29sLmMKKysrIGIvbmV0L3dpcmVsZXNzL2V0aHRvb2wuYwpAQCAtNDMsNyArNDMsNyBAQAogCQkJCSAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCiAJbWVtc2V0KHJwLCAwLCBzaXplb2YoKnJwKSk7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIAkJCQkgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCiAJaWYgKHJwLT5yeF9taW5pX3BlbmRpbmcgIT0gMCB8fCBycC0+cnhfanVtYm9fcGVuZGluZyAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTcwLDcgKzcwLDcgQEAKIHN0YXRpYyBpbnQgY2ZnODAyMTFfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCWlmIChyZGV2LT5vcHMtPmdldF9ldF9zc2V0X2NvdW50KQogCQlyZXR1cm4gcmRldl9nZXRfZXRfc3NldF9jb3VudChyZGV2LCBkZXYsIHNzZXQpOwogCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTgwLDcgKzgwLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJaWYgKHJkZXYtPm9wcy0+Z2V0X2V0X3N0YXRzKQogCQlyZGV2X2dldF9ldF9zdGF0cyhyZGV2LCBkZXYsIHN0YXRzLCBkYXRhKTsKIH0KQEAgLTg4LDcgKzg4LDcgQEAKIHN0YXRpYyB2b2lkIGNmZzgwMjExX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzc2V0LCB1OCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJaWYgKHJkZXYtPm9wcy0+Z2V0X2V0X3N0cmluZ3MpCiAJCXJkZXZfZ2V0X2V0X3N0cmluZ3MocmRldiwgZGV2LCBzc2V0LCBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9nZW5yZWdkYi5hd2sgYi9uZXQvd2lyZWxlc3MvZ2VucmVnZGIuYXdrCmluZGV4IGIzNWRhOGQuLjQwYzM3ZmMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9nZW5yZWdkYi5hd2sKKysrIGIvbmV0L3dpcmVsZXNzL2dlbnJlZ2RiLmF3awpAQCAtNjgsMTcgKzY4LDcgQEAKIAlzdWIoLywvLCAiIiwgdW5pdHMpCiAJZGZzX2NhYyA9ICQ5CiAJaWYgKHVuaXRzID09ICJtVyIpIHsKLQkJaWYgKHBvd2VyID09IDEwMCkgewotCQkJcG93ZXIgPSAyMAotCQl9IGVsc2UgaWYgKHBvd2VyID09IDIwMCkgewotCQkJcG93ZXIgPSAyMwotCQl9IGVsc2UgaWYgKHBvd2VyID09IDUwMCkgewotCQkJcG93ZXIgPSAyNwotCQl9IGVsc2UgaWYgKHBvd2VyID09IDEwMDApIHsKLQkJCXBvd2VyID0gMzAKLQkJfSBlbHNlIHsKLQkJCXByaW50ICJVbmtub3duIHBvd2VyIHZhbHVlIGluIGRhdGFiYXNlISIKLQkJfQorCQlwb3dlciA9IDEwICogbG9nKHBvd2VyKS9sb2coMTApCiAJfSBlbHNlIHsKIAkJZGZzX2NhYyA9ICQ4CiAJfQpAQCAtMTE3LDcgKzEwNyw3IEBACiAKIAl9CiAJZmxhZ3MgPSBmbGFncyAiMCIKLQlwcmludGYgIlx0XHRSRUdfUlVMRV9FWFQoJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJXMpLFxuIiwgc3RhcnQsIGVuZCwgYncsIGdhaW4sIHBvd2VyLCBkZnNfY2FjLCBmbGFncworCXByaW50ZiAiXHRcdFJFR19SVUxFX0VYVCglZCwgJWQsICVkLCAlZCwgJS4wZiwgJWQsICVzKSxcbiIsIHN0YXJ0LCBlbmQsIGJ3LCBnYWluLCBwb3dlciwgZGZzX2NhYywgZmxhZ3MKIAlydWxlcysrCiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9pYnNzLmMgYi9uZXQvd2lyZWxlc3MvaWJzcy5jCmluZGV4IGE2YjViZGEuLjhmMzQ1ZGEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9pYnNzLmMKKysrIGIvbmV0L3dpcmVsZXNzL2lic3MuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAJY2ZnODAyMTFfdXBsb2FkX2Nvbm5lY3Rfa2V5cyh3ZGV2KTsKIAotCW5sODAyMTFfc2VuZF9pYnNzX2Jzc2lkKHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSksIGRldiwgYnNzaWQsCisJbmw4MDIxMV9zZW5kX2lic3NfYnNzaWQod2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSksIGRldiwgYnNzaWQsCiAJCQkJR0ZQX0tFUk5FTCk7CiAjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFQKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CkBAIC01OCw3ICs1OCw3IEBACiAJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfZXZlbnQgKmV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTg4LDggKzg4LDYgQEAKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmNvbm5rZXlzKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGVja19jaGFuOwotCXU4IHJhZGFyX2RldGVjdF93aWR0aCA9IDA7CiAJaW50IGVycjsKIAogCUFTU0VSVF9XREVWX0xPQ0sod2Rldik7CkBAIC0xMjYsMjggKzEyNCw2IEBACiAjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFQKIAl3ZGV2LT53ZXh0Lmlic3MuY2hhbmRlZiA9IHBhcmFtcy0+Y2hhbmRlZjsKICNlbmRpZgotCWNoZWNrX2NoYW4gPSBwYXJhbXMtPmNoYW5kZWYuY2hhbjsKLQlpZiAocGFyYW1zLT51c2Vyc3BhY2VfaGFuZGxlc19kZnMpIHsKLQkJLyogQ2hlY2sgZm9yIHJhZGFyIGV2ZW4gaWYgdGhlIGN1cnJlbnQgY2hhbm5lbCBpcyBub3QKLQkJICogYSByYWRhciBjaGFubmVsIC0gaXQgbWlnaHQgZGVjaWRlIHRvIGNoYW5nZSB0byBERlMKLQkJICogY2hhbm5lbCBsYXRlci4KLQkJICovCi0JCXJhZGFyX2RldGVjdF93aWR0aCA9IEJJVChwYXJhbXMtPmNoYW5kZWYud2lkdGgpOwotCX0KLQotCWVyciA9IGNmZzgwMjExX2Nhbl91c2VfaWZ0eXBlX2NoYW4ocmRldiwgd2Rldiwgd2Rldi0+aWZ0eXBlLAotCQkJCQkgICBjaGVja19jaGFuLAotCQkJCQkgICAocGFyYW1zLT5jaGFubmVsX2ZpeGVkICYmCi0JCQkJCSAgICAhcmFkYXJfZGV0ZWN0X3dpZHRoKQotCQkJCQkgICA/IENIQU5fTU9ERV9TSEFSRUQKLQkJCQkJICAgOiBDSEFOX01PREVfRVhDTFVTSVZFLAotCQkJCQkgICByYWRhcl9kZXRlY3Rfd2lkdGgpOwotCi0JaWYgKGVycikgewotCQl3ZGV2LT5jb25uZWN0X2tleXMgPSBOVUxMOwotCQlyZXR1cm4gZXJyOwotCX0KLQogCWVyciA9IHJkZXZfam9pbl9pYnNzKHJkZXYsIGRldiwgcGFyYW1zKTsKIAlpZiAoZXJyKSB7CiAJCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IE5VTEw7CkBAIC0xODAsNyArMTU2LDcgQEAKIHN0YXRpYyB2b2lkIF9fY2ZnODAyMTFfY2xlYXJfaWJzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIG5vd2V4dCkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJaW50IGk7CiAKIAlBU1NFUlRfV0RFVl9MT0NLKHdkZXYpOwpAQCAtMzM1LDcgKzMxMSw3IEBACiAJCQkgICAgICAgc3RydWN0IGl3X2ZyZXEgKndleHRmcmVxLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gTlVMTDsKIAlpbnQgZXJyLCBmcmVxOwogCkBAIC0zNDYsNyArMzIyLDcgQEAKIAlpZiAoIXJkZXYtPm9wcy0+am9pbl9pYnNzKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlmcmVxID0gY2ZnODAyMTFfd2V4dF9mcmVxKHdkZXYtPndpcGh5LCB3ZXh0ZnJlcSk7CisJZnJlcSA9IGNmZzgwMjExX3dleHRfZnJlcSh3ZXh0ZnJlcSk7CiAJaWYgKGZyZXEgPCAwKQogCQlyZXR1cm4gZnJlcTsKIApAQCAtNDIwLDcgKzM5Niw3IEBACiAJCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpzc2lkKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzaXplX3QgbGVuID0gZGF0YS0+bGVuZ3RoOwogCWludCBlcnI7CiAKQEAgLTQ0NCw4ICs0MjAsOCBAQAogCWlmIChsZW4gPiAwICYmIHNzaWRbbGVuIC0gMV0gPT0gJ1wwJykKIAkJbGVuLS07CiAKKwltZW1jcHkod2Rldi0+c3NpZCwgc3NpZCwgbGVuKTsKIAl3ZGV2LT53ZXh0Lmlic3Muc3NpZCA9IHdkZXYtPnNzaWQ7Ci0JbWVtY3B5KHdkZXYtPndleHQuaWJzcy5zc2lkLCBzc2lkLCBsZW4pOwogCXdkZXYtPndleHQuaWJzcy5zc2lkX2xlbiA9IGxlbjsKIAogCXdkZXZfbG9jayh3ZGV2KTsKQEAgLTQ4Nyw3ICs0NjMsNyBAQAogCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAl1OCAqYnNzaWQgPSBhcF9hZGRyLT5zYV9kYXRhOwogCWludCBlcnI7CiAKQEAgLTUwNSw2ICs0ODEsOSBAQAogCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYnNzaWQpIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGJzc2lkKSkKIAkJYnNzaWQgPSBOVUxMOwogCisJaWYgKGJzc2lkICYmICFpc192YWxpZF9ldGhlcl9hZGRyKGJzc2lkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBib3RoIGF1dG9tYXRpYyAqLwogCWlmICghYnNzaWQgJiYgIXdkZXYtPndleHQuaWJzcy5ic3NpZCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvbWVzaC5jIGIvbmV0L3dpcmVsZXNzL21lc2guYwppbmRleCA1YWY1Y2M2Li4wOTIzMDBiIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvbWVzaC5jCisrKyBiL25ldC93aXJlbGVzcy9tZXNoLmMKQEAgLTk5LDcgKzk5LDYgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgbWVzaF9jb25maWcgKmNvbmYpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQl1OCByYWRhcl9kZXRlY3Rfd2lkdGggPSAwOwogCWludCBlcnI7CiAKIAlCVUlMRF9CVUdfT04oSUVFRTgwMjExX01BWF9TU0lEX0xFTiAhPSBJRUVFODAyMTFfTUFYX01FU0hfSURfTEVOKTsKQEAgLTE3NSwyMiArMTc0LDEwIEBACiAJCQkJCQkJICAgICAgIHNjYW5fd2lkdGgpOwogCX0KIAotCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmc2V0dXAtPmNoYW5kZWYpKQorCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmc2V0dXAtPmNoYW5kZWYsCisJCQkJICAgICBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZCh3ZGV2LT53aXBoeSwgJnNldHVwLT5jaGFuZGVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoZXJyKQotCQlyYWRhcl9kZXRlY3Rfd2lkdGggPSBCSVQoc2V0dXAtPmNoYW5kZWYud2lkdGgpOwotCi0JZXJyID0gY2ZnODAyMTFfY2FuX3VzZV9pZnR5cGVfY2hhbihyZGV2LCB3ZGV2LCB3ZGV2LT5pZnR5cGUsCi0JCQkJCSAgIHNldHVwLT5jaGFuZGVmLmNoYW4sCi0JCQkJCSAgIENIQU5fTU9ERV9TSEFSRUQsCi0JCQkJCSAgIHJhZGFyX2RldGVjdF93aWR0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWVyciA9IHJkZXZfam9pbl9tZXNoKHJkZXYsIGRldiwgY29uZiwgc2V0dXApOwogCWlmICghZXJyKSB7CiAJCW1lbWNweSh3ZGV2LT5zc2lkLCBzZXR1cC0+bWVzaF9pZCwgc2V0dXAtPm1lc2hfaWRfbGVuKTsKQEAgLTIzNiwxNyArMjIzLDYgQEAKIAkJaWYgKCFuZXRpZl9ydW5uaW5nKHdkZXYtPm5ldGRldikpCiAJCQlyZXR1cm4gLUVORVRET1dOOwogCi0JCS8qIGNmZzgwMjExX2Nhbl91c2VfY2hhbigpIGNhbGxzCi0JCSAqIGNmZzgwMjExX2Nhbl91c2VfaWZ0eXBlX2NoYW4oKSB3aXRoIG5vIHJhZGFyCi0JCSAqIGRldGVjdGlvbiwgc28gaWYgd2UncmUgdHJ5aW5nIHRvIHVzZSBhIHJhZGFyCi0JCSAqIGNoYW5uZWwgaGVyZSwgc29tZXRoaW5nIGlzIHdyb25nLgotCQkgKi8KLQkJV0FSTl9PTl9PTkNFKGNoYW5kZWYtPmNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpOwotCQllcnIgPSBjZmc4MDIxMV9jYW5fdXNlX2NoYW4ocmRldiwgd2RldiwgY2hhbmRlZi0+Y2hhbiwKLQkJCQkJICAgIENIQU5fTU9ERV9TSEFSRUQpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQogCQllcnIgPSByZGV2X2xpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwocmRldiwgd2Rldi0+bmV0ZGV2LAogCQkJCQkJICAgICBjaGFuZGVmLT5jaGFuKTsKIAkJaWYgKCFlcnIpCkBAIC0yNjIsOCArMjM4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2NmZzgwMjExX2xlYXZlX21lc2goc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAotCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IF9fY2ZnODAyMTFfbGVhdmVfbWVzaChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggYzUyZmY1OS4uMjY2NzY2YiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC0yMyw3ICsyMyw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopYnVmOwogCXU4ICppZSA9IG1nbXQtPnUuYXNzb2NfcmVzcC52YXJpYWJsZTsKIAlpbnQgaWVvZmZzID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3Jlc3AudmFyaWFibGUpOwpAQCAtNTQsNyArNTQsNyBAQAogc3RhdGljIHZvaWQgY2ZnODAyMTFfcHJvY2Vzc19hdXRoKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCiAJCQkJICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAKIAlubDgwMjExX3NlbmRfcnhfYXV0aChyZGV2LCB3ZGV2LT5uZXRkZXYsIGJ1ZiwgbGVuLCBHRlBfS0VSTkVMKTsKIAljZmc4MDIxMV9zbWVfcnhfYXV0aCh3ZGV2LCBidWYsIGxlbik7CkBAIC02Myw3ICs2Myw3IEBACiBzdGF0aWMgdm9pZCBjZmc4MDIxMV9wcm9jZXNzX2RlYXV0aChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAogCQkJCSAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJ1ZjsKIAljb25zdCB1OCAqYnNzaWQgPSBtZ210LT5ic3NpZDsKIAl1MTYgcmVhc29uX2NvZGUgPSBsZTE2X3RvX2NwdShtZ210LT51LmRlYXV0aC5yZWFzb25fY29kZSk7CkBAIC04Miw3ICs4Miw3IEBACiBzdGF0aWMgdm9pZCBjZmc4MDIxMV9wcm9jZXNzX2Rpc2Fzc29jKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCiAJCQkJICAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilidWY7CiAJY29uc3QgdTggKmJzc2lkID0gbWdtdC0+YnNzaWQ7CiAJdTE2IHJlYXNvbl9jb2RlID0gbGUxNl90b19jcHUobWdtdC0+dS5kaXNhc3NvYy5yZWFzb25fY29kZSk7CkBAIC0xMjMsNyArMTIzLDcgQEAKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJdHJhY2VfY2ZnODAyMTFfc2VuZF9hdXRoX3RpbWVvdXQoZGV2LCBhZGRyKTsKIApAQCAtMTM2LDcgKzEzNiw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAogCXRyYWNlX2NmZzgwMjExX3NlbmRfYXNzb2NfdGltZW91dChkZXYsIGJzcy0+YnNzaWQpOwogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAkJCQkgIGNvbnN0IHU4ICp0c2MsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogI2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUCiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCWNoYXIgKmJ1ZiA9IGttYWxsb2MoMTI4LCBnZnApOwpAQCAtMjMzLDE0ICsyMzMsOCBAQAogCWlmICghcmVxLmJzcykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQllcnIgPSBjZmc4MDIxMV9jYW5fdXNlX2NoYW4ocmRldiwgd2RldiwgcmVxLmJzcy0+Y2hhbm5lbCwKLQkJCQkgICAgQ0hBTl9NT0RFX1NIQVJFRCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KIAllcnIgPSByZGV2X2F1dGgocmRldiwgZGV2LCAmcmVxKTsKIAotb3V0OgogCWNmZzgwMjExX3B1dF9ic3MoJnJkZXYtPndpcGh5LCByZXEuYnNzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzA2LDE2ICszMDAsMTAgQEAKIAlpZiAoIXJlcS0+YnNzKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWVyciA9IGNmZzgwMjExX2Nhbl91c2VfY2hhbihyZGV2LCB3ZGV2LCBjaGFuLCBDSEFOX01PREVfU0hBUkVEKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQogCWVyciA9IHJkZXZfYXNzb2MocmRldiwgZGV2LCByZXEpOwogCWlmICghZXJyKQogCQljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIocmVxLT5ic3MpKTsKLQotb3V0OgotCWlmIChlcnIpCisJZWxzZQogCQljZmc4MDIxMV9wdXRfYnNzKCZyZGV2LT53aXBoeSwgcmVxLT5ic3MpOwogCiAJcmV0dXJuIGVycjsKQEAgLTQxNCw3ICs0MDIsNyBAQAogCQkJCWludCBtYXRjaF9sZW4pCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX21nbXRfcmVnaXN0cmF0aW9uICpyZWcsICpucmVnOwogCWludCBlcnIgPSAwOwogCXUxNiBtZ210X3R5cGU7CkBAIC00NzMsNyArNDYxLDcgQEAKIHZvaWQgY2ZnODAyMTFfbWxtZV91bnJlZ2lzdGVyX3NvY2tldChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1MzIgbmxwb3J0aWQpCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX21nbXRfcmVnaXN0cmF0aW9uICpyZWcsICp0bXA7CiAKIAlzcGluX2xvY2tfYmgoJndkZXYtPm1nbXRfcmVnaXN0cmF0aW9uc19sb2NrKTsKQEAgLTYyMCw3ICs2MDgsNyBAQAogCQkgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1MzIgZmxhZ3MsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfbWdtdF9yZWdpc3RyYXRpb24gKnJlZzsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cnhfc3R5cGVzICpzdHlwZXMgPQogCQkmd2lwaHktPm1nbXRfc3R5cGVzW3dkZXYtPmlmdHlwZV07CkBAIC03MzksNyArNzI3LDcgQEAKIAkJCSAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmLAogCQkJICBnZnBfdCBnZnApCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAl0cmFjZV9jZmc4MDIxMV9yYWRhcl9ldmVudCh3aXBoeSwgY2hhbmRlZik7CkBAIC03NjQsNyArNzUyLDcgQEAKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gbmV0ZGV2LT5pZWVlODAyMTFfcHRyOwogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCXRyYWNlX2NmZzgwMjExX2NhY19ldmVudChuZXRkZXYsIGV2ZW50KTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IDA1MmMxYmYuLmJhNGYxNzIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtMTY4LDggKzE2OCw4IEBACiAJCW5ldGRldiA9IF9fZGV2X2dldF9ieV9pbmRleChuZXRucywgaWZpbmRleCk7CiAJCWlmIChuZXRkZXYpIHsKIAkJCWlmIChuZXRkZXYtPmllZWU4MDIxMV9wdHIpCi0JCQkJdG1wID0gd2lwaHlfdG9fZGV2KAotCQkJCQkJbmV0ZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeSk7CisJCQkJdG1wID0gd2lwaHlfdG9fcmRldigKKwkJCQkJbmV0ZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeSk7CiAJCQllbHNlCiAJCQkJdG1wID0gTlVMTDsKIApAQCAtMzcxLDggKzM3MSw4IEBACiAJW05MODAyMTFfQVRUUl9DSF9TV0lUQ0hfQ09VTlRdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkw4MDIxMV9BVFRSX0NIX1NXSVRDSF9CTE9DS19UWF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9BVFRSX0NTQV9JRVNdID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKLQlbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9CRUFDT05dID0geyAudHlwZSA9IE5MQV9VMTYgfSwKLQlbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9QUkVTUF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtOTDgwMjExX0FUVFJfQ1NBX0NfT0ZGX0JFQUNPTl0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSB9LAorCVtOTDgwMjExX0FUVFJfQ1NBX0NfT0ZGX1BSRVNQXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZIH0sCiAJW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX0NIQU5ORUxTXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZIH0sCiAJW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX09QRVJfQ0xBU1NFU10gPSB7IC50eXBlID0gTkxBX0JJTkFSWSB9LAogCVtOTDgwMjExX0FUVFJfSEFORExFX0RGU10gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKQEAgLTM4NSw2ICszODUsOCBAQAogCVtOTDgwMjExX0FUVFJfTUFDX0hJTlRdID0geyAubGVuID0gRVRIX0FMRU4gfSwKIAlbTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVFfSElOVF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtOTDgwMjExX0FUVFJfVERMU19QRUVSX0NBUEFCSUxJVFldID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX0lGQUNFX1NPQ0tFVF9PV05FUl0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9BVFRSX0NTQV9DX09GRlNFVFNfVFhdID0geyAudHlwZSA9IE5MQV9CSU5BUlkgfSwKIH07CiAKIC8qIHBvbGljeSBmb3IgdGhlIGtleSBhdHRyaWJ1dGVzICovCkBAIC00ODQsNyArNDg2LDcgQEAKIAkJCWVyciA9IFBUUl9FUlIoKndkZXYpOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9Ci0JCSpyZGV2ID0gd2lwaHlfdG9fZGV2KCgqd2RldiktPndpcGh5KTsKKwkJKnJkZXYgPSB3aXBoeV90b19yZGV2KCgqd2RldiktPndpcGh5KTsKIAkJLyogMCBpcyB0aGUgZmlyc3QgaW5kZXggLSBhZGQgMSB0byBwYXJzZSBvbmx5IG9uY2UgKi8KIAkJY2ItPmFyZ3NbMF0gPSAoKnJkZXYpLT53aXBoeV9pZHggKyAxOwogCQljYi0+YXJnc1sxXSA9ICgqd2RldiktPmlkZW50aWZpZXI7CkBAIC00OTcsNyArNDk5LDcgQEAKIAkJCWVyciA9IC1FTk9ERVY7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KLQkJKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCQkqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCQkqd2RldiA9IE5VTEw7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICYoKnJkZXYpLT53ZGV2X2xpc3QsIGxpc3QpIHsKQEAgLTU2Niw2ICs1NjgsMTMgQEAKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkJICAgYm9vbCBsYXJnZSkKIHsKKwkvKiBTb21lIGNoYW5uZWxzIG11c3QgYmUgY29tcGxldGVseSBleGNsdWRlZCBmcm9tIHRoZQorCSAqIGxpc3QgdG8gcHJvdGVjdCBvbGQgdXNlci1zcGFjZSB0b29scyBmcm9tIGJyZWFraW5nCisJICovCisJaWYgKCFsYXJnZSAmJiBjaGFuLT5mbGFncyAmCisJICAgIChJRUVFODAyMTFfQ0hBTl9OT18xME1IWiB8IElFRUU4MDIxMV9DSEFOX05PXzIwTUhaKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0ZSRVEsCiAJCQljaGFuLT5jZW50ZXJfZnJlcSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNjEzLDYgKzYyMiwxOCBAQAogCQlpZiAoKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fMTYwTUhaKSAmJgogCQkgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT18xNjBNSFopKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCWlmICgoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWSkgJiYKKwkJICAgIG5sYV9wdXRfZmxhZyhtc2csIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfSU5ET09SX09OTFkpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCWlmICgoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9HT19DT05DVVJSRU5UKSAmJgorCQkgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9HT19DT05DVVJSRU5UKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQlpZiAoKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fMjBNSFopICYmCisJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzIwTUhaKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQlpZiAoKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fMTBNSFopICYmCisJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX05PXzEwTUhaKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIAogCWlmIChubGFfcHV0X3UzMihtc2csIE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTUFYX1RYX1BPV0VSLApAQCAtOTUwLDggKzk3MSwxMCBAQAogCQkJCWMtPm1heF9pbnRlcmZhY2VzKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlpZiAobGFyZ2UgJiYKLQkJICAgIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9JRkFDRV9DT01CX1JBREFSX0RFVEVDVF9XSURUSFMsCi0JCQkJYy0+cmFkYXJfZGV0ZWN0X3dpZHRocykpCisJCSAgICAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0lGQUNFX0NPTUJfUkFEQVJfREVURUNUX1dJRFRIUywKKwkJCQljLT5yYWRhcl9kZXRlY3Rfd2lkdGhzKSB8fAorCQkgICAgIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9JRkFDRV9DT01CX1JBREFSX0RFVEVDVF9SRUdJT05TLAorCQkJCWMtPnJhZGFyX2RldGVjdF9yZWdpb25zKSkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCQlubGFfbmVzdF9lbmQobXNnLCBubF9jb21iaSk7CkBAIC0xMDA2LDQyICsxMDI5LDQyIEBACiB9CiAKIHN0YXRpYyBpbnQgbmw4MDIxMV9zZW5kX3dvd2xhbihzdHJ1Y3Qgc2tfYnVmZiAqbXNnLAotCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgICBib29sIGxhcmdlKQogewogCXN0cnVjdCBubGF0dHIgKm5sX3dvd2xhbjsKIAotCWlmICghZGV2LT53aXBoeS53b3dsYW4pCisJaWYgKCFyZGV2LT53aXBoeS53b3dsYW4pCiAJCXJldHVybiAwOwogCiAJbmxfd293bGFuID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTX1NVUFBPUlRFRCk7CiAJaWYgKCFubF93b3dsYW4pCiAJCXJldHVybiAtRU5PQlVGUzsKIAotCWlmICgoKGRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9BTlkpICYmCisJaWYgKCgocmRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9BTlkpICYmCiAJICAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX0FOWSkpIHx8Ci0JICAgICgoZGV2LT53aXBoeS53b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QpICYmCisJICAgICgocmRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9ESVNDT05ORUNUKSAmJgogCSAgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNUKSkgfHwKLQkgICAgKChkZXYtPndpcGh5Lndvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fTUFHSUNfUEtUKSAmJgorCSAgICAoKHJkZXYtPndpcGh5Lndvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fTUFHSUNfUEtUKSAmJgogCSAgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1QpKSB8fAotCSAgICAoKGRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkpICYmCisJICAgICgocmRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkpICYmCiAJICAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQpKSB8fAotCSAgICAoKGRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9HVEtfUkVLRVlfRkFJTFVSRSkgJiYKKwkgICAgKChyZGV2LT53aXBoeS53b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFKSAmJgogCSAgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfRkFJTFVSRSkpIHx8Ci0JICAgICgoZGV2LT53aXBoeS53b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEpICYmCisJICAgICgocmRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRKSAmJgogCSAgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVCkpIHx8Ci0JICAgICgoZGV2LT53aXBoeS53b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFKSAmJgorCSAgICAoKHJkZXYtPndpcGh5Lndvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fNFdBWV9IQU5EU0hBS0UpICYmCiAJICAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFKSkgfHwKLQkgICAgKChkZXYtPndpcGh5Lndvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0UpICYmCisJICAgICgocmRldi0+d2lwaHkud293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRSkgJiYKIAkgICAgIG5sYV9wdXRfZmxhZyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0UpKSkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JaWYgKGRldi0+d2lwaHkud293bGFuLT5uX3BhdHRlcm5zKSB7CisJaWYgKHJkZXYtPndpcGh5Lndvd2xhbi0+bl9wYXR0ZXJucykgewogCQlzdHJ1Y3Qgbmw4MDIxMV9wYXR0ZXJuX3N1cHBvcnQgcGF0ID0gewotCQkJLm1heF9wYXR0ZXJucyA9IGRldi0+d2lwaHkud293bGFuLT5uX3BhdHRlcm5zLAotCQkJLm1pbl9wYXR0ZXJuX2xlbiA9IGRldi0+d2lwaHkud293bGFuLT5wYXR0ZXJuX21pbl9sZW4sCi0JCQkubWF4X3BhdHRlcm5fbGVuID0gZGV2LT53aXBoeS53b3dsYW4tPnBhdHRlcm5fbWF4X2xlbiwKLQkJCS5tYXhfcGt0X29mZnNldCA9IGRldi0+d2lwaHkud293bGFuLT5tYXhfcGt0X29mZnNldCwKKwkJCS5tYXhfcGF0dGVybnMgPSByZGV2LT53aXBoeS53b3dsYW4tPm5fcGF0dGVybnMsCisJCQkubWluX3BhdHRlcm5fbGVuID0gcmRldi0+d2lwaHkud293bGFuLT5wYXR0ZXJuX21pbl9sZW4sCisJCQkubWF4X3BhdHRlcm5fbGVuID0gcmRldi0+d2lwaHkud293bGFuLT5wYXR0ZXJuX21heF9sZW4sCisJCQkubWF4X3BrdF9vZmZzZXQgPSByZGV2LT53aXBoeS53b3dsYW4tPm1heF9wa3Rfb2Zmc2V0LAogCQl9OwogCiAJCWlmIChubGFfcHV0KG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTiwKQEAgLTEwNDksNyArMTA3Miw3IEBACiAJCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCi0JaWYgKGxhcmdlICYmIG5sODAyMTFfc2VuZF93b3dsYW5fdGNwX2NhcHMoZGV2LCBtc2cpKQorCWlmIChsYXJnZSAmJiBubDgwMjExX3NlbmRfd293bGFuX3RjcF9jYXBzKHJkZXYsIG1zZykpCiAJCXJldHVybiAtRU5PQlVGUzsKIAogCW5sYV9uZXN0X2VuZChtc2csIG5sX3dvd2xhbik7CkBAIC0xMDU5LDE5ICsxMDgyLDE5IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBubDgwMjExX3NlbmRfY29hbGVzY2Uoc3RydWN0IHNrX2J1ZmYgKm1zZywKLQkJCQkgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYpCisJCQkJIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3Qgbmw4MDIxMV9jb2FsZXNjZV9ydWxlX3N1cHBvcnQgcnVsZTsKIAotCWlmICghZGV2LT53aXBoeS5jb2FsZXNjZSkKKwlpZiAoIXJkZXYtPndpcGh5LmNvYWxlc2NlKQogCQlyZXR1cm4gMDsKIAotCXJ1bGUubWF4X3J1bGVzID0gZGV2LT53aXBoeS5jb2FsZXNjZS0+bl9ydWxlczsKLQlydWxlLm1heF9kZWxheSA9IGRldi0+d2lwaHkuY29hbGVzY2UtPm1heF9kZWxheTsKLQlydWxlLnBhdC5tYXhfcGF0dGVybnMgPSBkZXYtPndpcGh5LmNvYWxlc2NlLT5uX3BhdHRlcm5zOwotCXJ1bGUucGF0Lm1pbl9wYXR0ZXJuX2xlbiA9IGRldi0+d2lwaHkuY29hbGVzY2UtPnBhdHRlcm5fbWluX2xlbjsKLQlydWxlLnBhdC5tYXhfcGF0dGVybl9sZW4gPSBkZXYtPndpcGh5LmNvYWxlc2NlLT5wYXR0ZXJuX21heF9sZW47Ci0JcnVsZS5wYXQubWF4X3BrdF9vZmZzZXQgPSBkZXYtPndpcGh5LmNvYWxlc2NlLT5tYXhfcGt0X29mZnNldDsKKwlydWxlLm1heF9ydWxlcyA9IHJkZXYtPndpcGh5LmNvYWxlc2NlLT5uX3J1bGVzOworCXJ1bGUubWF4X2RlbGF5ID0gcmRldi0+d2lwaHkuY29hbGVzY2UtPm1heF9kZWxheTsKKwlydWxlLnBhdC5tYXhfcGF0dGVybnMgPSByZGV2LT53aXBoeS5jb2FsZXNjZS0+bl9wYXR0ZXJuczsKKwlydWxlLnBhdC5taW5fcGF0dGVybl9sZW4gPSByZGV2LT53aXBoeS5jb2FsZXNjZS0+cGF0dGVybl9taW5fbGVuOworCXJ1bGUucGF0Lm1heF9wYXR0ZXJuX2xlbiA9IHJkZXYtPndpcGh5LmNvYWxlc2NlLT5wYXR0ZXJuX21heF9sZW47CisJcnVsZS5wYXQubWF4X3BrdF9vZmZzZXQgPSByZGV2LT53aXBoeS5jb2FsZXNjZS0+bWF4X3BrdF9vZmZzZXQ7CiAKIAlpZiAobmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9DT0FMRVNDRV9SVUxFLCBzaXplb2YocnVsZSksICZydWxlKSkKIAkJcmV0dXJuIC1FTk9CVUZTOwpAQCAtMTIwMiw3ICsxMjI1LDggQEAKIAlib29sIHNwbGl0OwogfTsKIAotc3RhdGljIGludCBubDgwMjExX3NlbmRfd2lwaHkoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IG5sODAyMTFfc2VuZF93aXBoeShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgICAgICBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kLAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKIAkJCSAgICAgIGludCBmbGFncywgc3RydWN0IG5sODAyMTFfZHVtcF93aXBoeV9zdGF0ZSAqc3RhdGUpCiB7CkBAIC0xMjE0LDYzICsxMjM4LDY2IEBACiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCWludCBpOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhyeF9zdHlwZXMgKm1nbXRfc3R5cGVzID0KLQkJCQlkZXYtPndpcGh5Lm1nbXRfc3R5cGVzOworCQkJCXJkZXYtPndpcGh5Lm1nbXRfc3R5cGVzOwogCXUzMiBmZWF0dXJlczsKIAotCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgcG9ydGlkLCBzZXEsIGZsYWdzLCBOTDgwMjExX0NNRF9ORVdfV0lQSFkpOworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgcG9ydGlkLCBzZXEsIGZsYWdzLCBjbWQpOwogCWlmICghaGRyKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAlpZiAoV0FSTl9PTighc3RhdGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgZGV2LT53aXBoeV9pZHgpIHx8CisJaWYgKG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZLCByZGV2LT53aXBoeV9pZHgpIHx8CiAJICAgIG5sYV9wdXRfc3RyaW5nKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCi0JCQkgICB3aXBoeV9uYW1lKCZkZXYtPndpcGh5KSkgfHwKKwkJCSAgIHdpcGh5X25hbWUoJnJkZXYtPndpcGh5KSkgfHwKIAkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfR0VORVJBVElPTiwKIAkJCWNmZzgwMjExX3JkZXZfbGlzdF9nZW5lcmF0aW9uKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwlpZiAoY21kICE9IE5MODAyMTFfQ01EX05FV19XSVBIWSkKKwkJZ290byBmaW5pc2g7CisKIAlzd2l0Y2ggKHN0YXRlLT5zcGxpdF9zdGFydCkgewogCWNhc2UgMDoKIAkJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQsCi0JCQkgICAgICAgZGV2LT53aXBoeS5yZXRyeV9zaG9ydCkgfHwKKwkJCSAgICAgICByZGV2LT53aXBoeS5yZXRyeV9zaG9ydCkgfHwKIAkJICAgIG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywKLQkJCSAgICAgICBkZXYtPndpcGh5LnJldHJ5X2xvbmcpIHx8CisJCQkgICAgICAgcmRldi0+d2lwaHkucmV0cnlfbG9uZykgfHwKIAkJICAgIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xELAotCQkJCWRldi0+d2lwaHkuZnJhZ190aHJlc2hvbGQpIHx8CisJCQkJcmRldi0+d2lwaHkuZnJhZ190aHJlc2hvbGQpIHx8CiAJCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELAotCQkJCWRldi0+d2lwaHkucnRzX3RocmVzaG9sZCkgfHwKKwkJCQlyZGV2LT53aXBoeS5ydHNfdGhyZXNob2xkKSB8fAogCQkgICAgbmxhX3B1dF91OChtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9DT1ZFUkFHRV9DTEFTUywKLQkJCSAgICAgICBkZXYtPndpcGh5LmNvdmVyYWdlX2NsYXNzKSB8fAorCQkJICAgICAgIHJkZXYtPndpcGh5LmNvdmVyYWdlX2NsYXNzKSB8fAogCQkgICAgbmxhX3B1dF91OChtc2csIE5MODAyMTFfQVRUUl9NQVhfTlVNX1NDQU5fU1NJRFMsCi0JCQkgICAgICAgZGV2LT53aXBoeS5tYXhfc2Nhbl9zc2lkcykgfHwKKwkJCSAgICAgICByZGV2LT53aXBoeS5tYXhfc2Nhbl9zc2lkcykgfHwKIAkJICAgIG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0hFRF9TQ0FOX1NTSURTLAotCQkJICAgICAgIGRldi0+d2lwaHkubWF4X3NjaGVkX3NjYW5fc3NpZHMpIHx8CisJCQkgICAgICAgcmRldi0+d2lwaHkubWF4X3NjaGVkX3NjYW5fc3NpZHMpIHx8CiAJCSAgICBubGFfcHV0X3UxNihtc2csIE5MODAyMTFfQVRUUl9NQVhfU0NBTl9JRV9MRU4sCi0JCQkJZGV2LT53aXBoeS5tYXhfc2Nhbl9pZV9sZW4pIHx8CisJCQkJcmRldi0+d2lwaHkubWF4X3NjYW5faWVfbGVuKSB8fAogCQkgICAgbmxhX3B1dF91MTYobXNnLCBOTDgwMjExX0FUVFJfTUFYX1NDSEVEX1NDQU5fSUVfTEVOLAotCQkJCWRldi0+d2lwaHkubWF4X3NjaGVkX3NjYW5faWVfbGVuKSB8fAorCQkJCXJkZXYtPndpcGh5Lm1heF9zY2hlZF9zY2FuX2llX2xlbikgfHwKIAkJICAgIG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX0FUVFJfTUFYX01BVENIX1NFVFMsCi0JCQkgICAgICAgZGV2LT53aXBoeS5tYXhfbWF0Y2hfc2V0cykpCisJCQkgICAgICAgcmRldi0+d2lwaHkubWF4X21hdGNoX3NldHMpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19JQlNTX1JTTikgJiYKKwkJaWYgKChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSUJTU19SU04pICYmCiAJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfU1VQUE9SVF9JQlNTX1JTTikpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19NRVNIX0FVVEgpICYmCisJCWlmICgocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX01FU0hfQVVUSCkgJiYKIAkJICAgIG5sYV9wdXRfZmxhZyhtc2csIE5MODAyMTFfQVRUUl9TVVBQT1JUX01FU0hfQVVUSCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19BUF9VQVBTRCkgJiYKKwkJaWYgKChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQVBfVUFQU0QpICYmCiAJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfU1VQUE9SVF9BUF9VQVBTRCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19GV19ST0FNKSAmJgorCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19GV19ST0FNKSAmJgogCQkgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9BVFRSX1JPQU1fU1VQUE9SVCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSAmJgorCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSAmJgogCQkgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9BVFRSX1RETFNfU1VQUE9SVCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQKSAmJgorCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQKSAmJgogCQkgICAgbmxhX3B1dF9mbGFnKG1zZywgTkw4MDIxMV9BVFRSX1RETFNfRVhURVJOQUxfU0VUVVApKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCXN0YXRlLT5zcGxpdF9zdGFydCsrOwpAQCAtMTI3OCwzNSArMTMwNSwzNSBAQAogCQkJYnJlYWs7CiAJY2FzZSAxOgogCQlpZiAobmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTLAotCQkJICAgIHNpemVvZih1MzIpICogZGV2LT53aXBoeS5uX2NpcGhlcl9zdWl0ZXMsCi0JCQkgICAgZGV2LT53aXBoeS5jaXBoZXJfc3VpdGVzKSkKKwkJCSAgICBzaXplb2YodTMyKSAqIHJkZXYtPndpcGh5Lm5fY2lwaGVyX3N1aXRlcywKKwkJCSAgICByZGV2LT53aXBoeS5jaXBoZXJfc3VpdGVzKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJCWlmIChubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9BVFRSX01BWF9OVU1fUE1LSURTLAotCQkJICAgICAgIGRldi0+d2lwaHkubWF4X251bV9wbWtpZHMpKQorCQkJICAgICAgIHJkZXYtPndpcGh5Lm1heF9udW1fcG1raWRzKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWlmICgoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQ09OVFJPTF9QT1JUX1BST1RPQ09MKSAmJgorCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19DT05UUk9MX1BPUlRfUFJPVE9DT0wpICYmCiAJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCQlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9BVkFJTF9UWCwKLQkJCQlkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc190eCkgfHwKKwkJCQlyZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfdHgpIHx8CiAJCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX0FWQUlMX1JYLAotCQkJCWRldi0+d2lwaHkuYXZhaWxhYmxlX2FudGVubmFzX3J4KSkKKwkJCQlyZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfcngpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQpICYmCisJCWlmICgocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRCkgJiYKIAkJICAgIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BfT0ZGTE9BRCwKLQkJCQlkZXYtPndpcGh5LnByb2JlX3Jlc3Bfb2ZmbG9hZCkpCisJCQkJcmRldi0+d2lwaHkucHJvYmVfcmVzcF9vZmZsb2FkKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWlmICgoZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfdHggfHwKLQkJICAgICBkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc19yeCkgJiYKLQkJICAgIGRldi0+b3BzLT5nZXRfYW50ZW5uYSkgeworCQlpZiAoKHJkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc190eCB8fAorCQkgICAgIHJkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc19yeCkgJiYKKwkJICAgIHJkZXYtPm9wcy0+Z2V0X2FudGVubmEpIHsKIAkJCXUzMiB0eF9hbnQgPSAwLCByeF9hbnQgPSAwOwogCQkJaW50IHJlczsKLQkJCXJlcyA9IHJkZXZfZ2V0X2FudGVubmEoZGV2LCAmdHhfYW50LCAmcnhfYW50KTsKKwkJCXJlcyA9IHJkZXZfZ2V0X2FudGVubmEocmRldiwgJnR4X2FudCwgJnJ4X2FudCk7CiAJCQlpZiAoIXJlcykgewogCQkJCWlmIChubGFfcHV0X3UzMihtc2csCiAJCQkJCQlOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9UWCwKQEAgLTEzMjMsNyArMTM1MCw3IEBACiAJCQlicmVhazsKIAljYXNlIDI6CiAJCWlmIChubDgwMjExX3B1dF9pZnR5cGVzKG1zZywgTkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9JRlRZUEVTLAotCQkJCQlkZXYtPndpcGh5LmludGVyZmFjZV9tb2RlcykpCisJCQkJCXJkZXYtPndpcGh5LmludGVyZmFjZV9tb2RlcykpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCXN0YXRlLT5zcGxpdF9zdGFydCsrOwogCQlpZiAoc3RhdGUtPnNwbGl0KQpAQCAtMTMzNyw3ICsxMzY0LDcgQEAKIAkJICAgICBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAotCQkJc2JhbmQgPSBkZXYtPndpcGh5LmJhbmRzW2JhbmRdOworCQkJc2JhbmQgPSByZGV2LT53aXBoeS5iYW5kc1tiYW5kXTsKIAogCQkJaWYgKCFzYmFuZCkKIAkJCQljb250aW51ZTsKQEAgLTE0MTQsNyArMTQ0MSw3IEBACiAJCWkgPSAwOwogI2RlZmluZSBDTUQob3AsIG4pCQkJCQkJCVwKIAkJIGRvIHsJCQkJCQkJXAotCQkJaWYgKGRldi0+b3BzLT5vcCkgewkJCQlcCisJCQlpZiAocmRldi0+b3BzLT5vcCkgewkJCQlcCiAJCQkJaSsrOwkJCQkJXAogCQkJCWlmIChubGFfcHV0X3UzMihtc2csIGksIE5MODAyMTFfQ01EXyAjIyBuKSkgXAogCQkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsJCVwKQEAgLTE0MzgsMzIgKzE0NjUsMzIgQEAKIAkJQ01EKHNldF9wbWtzYSwgU0VUX1BNS1NBKTsKIAkJQ01EKGRlbF9wbWtzYSwgREVMX1BNS1NBKTsKIAkJQ01EKGZsdXNoX3Bta3NhLCBGTFVTSF9QTUtTQSk7Ci0JCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwpCisJCWlmIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMKQogCQkJQ01EKHJlbWFpbl9vbl9jaGFubmVsLCBSRU1BSU5fT05fQ0hBTk5FTCk7CiAJCUNNRChzZXRfYml0cmF0ZV9tYXNrLCBTRVRfVFhfQklUUkFURV9NQVNLKTsKIAkJQ01EKG1nbXRfdHgsIEZSQU1FKTsKIAkJQ01EKG1nbXRfdHhfY2FuY2VsX3dhaXQsIEZSQU1FX1dBSVRfQ0FOQ0VMKTsKLQkJaWYgKGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX05FVE5TX09LKSB7CisJCWlmIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfTkVUTlNfT0spIHsKIAkJCWkrKzsKIAkJCWlmIChubGFfcHV0X3UzMihtc2csIGksIE5MODAyMTFfQ01EX1NFVF9XSVBIWV9ORVROUykpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KLQkJaWYgKGRldi0+b3BzLT5zZXRfbW9uaXRvcl9jaGFubmVsIHx8IGRldi0+b3BzLT5zdGFydF9hcCB8fAotCQkgICAgZGV2LT5vcHMtPmpvaW5fbWVzaCkgeworCQlpZiAocmRldi0+b3BzLT5zZXRfbW9uaXRvcl9jaGFubmVsIHx8IHJkZXYtPm9wcy0+c3RhcnRfYXAgfHwKKwkJICAgIHJkZXYtPm9wcy0+am9pbl9tZXNoKSB7CiAJCQlpKys7CiAJCQlpZiAobmxhX3B1dF91MzIobXNnLCBpLCBOTDgwMjExX0NNRF9TRVRfQ0hBTk5FTCkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KIAkJQ01EKHNldF93ZHNfcGVlciwgU0VUX1dEU19QRUVSKTsKLQkJaWYgKGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpIHsKKwkJaWYgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSB7CiAJCQlDTUQodGRsc19tZ210LCBURExTX01HTVQpOwogCQkJQ01EKHRkbHNfb3BlciwgVERMU19PUEVSKTsKIAkJfQotCQlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTikKKwkJaWYgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19TQ0hFRF9TQ0FOKQogCQkJQ01EKHNjaGVkX3NjYW5fc3RhcnQsIFNUQVJUX1NDSEVEX1NDQU4pOwogCQlDTUQocHJvYmVfY2xpZW50LCBQUk9CRV9DTElFTlQpOwogCQlDTUQoc2V0X25vYWNrX21hcCwgU0VUX05PQUNLX01BUCk7Ci0JCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpIHsKKwkJaWYgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpIHsKIAkJCWkrKzsKIAkJCWlmIChubGFfcHV0X3UzMihtc2csIGksIE5MODAyMTFfQ01EX1JFR0lTVEVSX0JFQUNPTlMpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtMTQ3Myw3ICsxNTAwLDcgQEAKIAkJaWYgKHN0YXRlLT5zcGxpdCkgewogCQkJQ01EKGNyaXRfcHJvdG9fc3RhcnQsIENSSVRfUFJPVE9DT0xfU1RBUlQpOwogCQkJQ01EKGNyaXRfcHJvdG9fc3RvcCwgQ1JJVF9QUk9UT0NPTF9TVE9QKTsKLQkJCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVNfQ0hBTk5FTF9TV0lUQ0gpCisJCQlpZiAocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSCkKIAkJCQlDTUQoY2hhbm5lbF9zd2l0Y2gsIENIQU5ORUxfU1dJVENIKTsKIAkJfQogCQlDTUQoc2V0X3Fvc19tYXAsIFNFVF9RT1NfTUFQKTsKQEAgLTE0ODQsMTMgKzE1MTEsMTMgQEAKIAogI3VuZGVmIENNRAogCi0JCWlmIChkZXYtPm9wcy0+Y29ubmVjdCB8fCBkZXYtPm9wcy0+YXV0aCkgeworCQlpZiAocmRldi0+b3BzLT5jb25uZWN0IHx8IHJkZXYtPm9wcy0+YXV0aCkgewogCQkJaSsrOwogCQkJaWYgKG5sYV9wdXRfdTMyKG1zZywgaSwgTkw4MDIxMV9DTURfQ09OTkVDVCkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KIAotCQlpZiAoZGV2LT5vcHMtPmRpc2Nvbm5lY3QgfHwgZGV2LT5vcHMtPmRlYXV0aCkgeworCQlpZiAocmRldi0+b3BzLT5kaXNjb25uZWN0IHx8IHJkZXYtPm9wcy0+ZGVhdXRoKSB7CiAJCQlpKys7CiAJCQlpZiAobmxhX3B1dF91MzIobXNnLCBpLCBOTDgwMjExX0NNRF9ESVNDT05ORUNUKSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTE1MDEsMTQgKzE1MjgsMTQgQEAKIAkJaWYgKHN0YXRlLT5zcGxpdCkKIAkJCWJyZWFrOwogCWNhc2UgNToKLQkJaWYgKGRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCAmJgotCQkgICAgKGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCkgJiYKKwkJaWYgKHJkZXYtPm9wcy0+cmVtYWluX29uX2NoYW5uZWwgJiYKKwkJICAgIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMKSAmJgogCQkgICAgbmxhX3B1dF91MzIobXNnLAogCQkJCU5MODAyMTFfQVRUUl9NQVhfUkVNQUlOX09OX0NIQU5ORUxfRFVSQVRJT04sCi0JCQkJZGV2LT53aXBoeS5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24pKQorCQkJCXJkZXYtPndpcGh5Lm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbikpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAoKGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX09GRkNIQU5fVFgpICYmCisJCWlmICgocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX09GRkNIQU5fVFgpICYmCiAJCSAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfT0ZGQ0hBTk5FTF9UWF9PSykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIApAQCAtMTUxOSw3ICsxNTQ2LDcgQEAKIAkJCWJyZWFrOwogCWNhc2UgNjoKICNpZmRlZiBDT05GSUdfUE0KLQkJaWYgKG5sODAyMTFfc2VuZF93b3dsYW4obXNnLCBkZXYsIHN0YXRlLT5zcGxpdCkpCisJCWlmIChubDgwMjExX3NlbmRfd293bGFuKG1zZywgcmRldiwgc3RhdGUtPnNwbGl0KSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlzdGF0ZS0+c3BsaXRfc3RhcnQrKzsKIAkJaWYgKHN0YXRlLT5zcGxpdCkKQEAgLTE1MjksMTAgKzE1NTYsMTAgQEAKICNlbmRpZgogCWNhc2UgNzoKIAkJaWYgKG5sODAyMTFfcHV0X2lmdHlwZXMobXNnLCBOTDgwMjExX0FUVFJfU09GVFdBUkVfSUZUWVBFUywKLQkJCQkJZGV2LT53aXBoeS5zb2Z0d2FyZV9pZnR5cGVzKSkKKwkJCQkJcmRldi0+d2lwaHkuc29mdHdhcmVfaWZ0eXBlcykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAobmw4MDIxMV9wdXRfaWZhY2VfY29tYmluYXRpb25zKCZkZXYtPndpcGh5LCBtc2csCisJCWlmIChubDgwMjExX3B1dF9pZmFjZV9jb21iaW5hdGlvbnMoJnJkZXYtPndpcGh5LCBtc2csCiAJCQkJCQkgICBzdGF0ZS0+c3BsaXQpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTE1NDAsMTIgKzE1NjcsMTIgQEAKIAkJaWYgKHN0YXRlLT5zcGxpdCkKIAkJCWJyZWFrOwogCWNhc2UgODoKLQkJaWYgKChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSkgJiYKKwkJaWYgKChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUUpICYmCiAJCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9ERVZJQ0VfQVBfU01FLAotCQkJCWRldi0+d2lwaHkuYXBfc21lX2NhcGEpKQorCQkJCXJkZXYtPndpcGh5LmFwX3NtZV9jYXBhKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWZlYXR1cmVzID0gZGV2LT53aXBoeS5mZWF0dXJlczsKKwkJZmVhdHVyZXMgPSByZGV2LT53aXBoeS5mZWF0dXJlczsKIAkJLyoKIAkJICogV2UgY2FuIG9ubHkgYWRkIHRoZSBwZXItY2hhbm5lbCBsaW1pdCBpbmZvcm1hdGlvbiBpZiB0aGUKIAkJICogZHVtcCBpcyBzcGxpdCwgb3RoZXJ3aXNlIGl0IG1ha2VzIGl0IHRvbyBiaWcuIFRoZXJlZm9yZQpAQCAtMTU1NiwxNiArMTU4MywxNiBAQAogCQlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfRkVBVFVSRV9GTEFHUywgZmVhdHVyZXMpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJaWYgKGRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayAmJgorCQlpZiAocmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayAmJgogCQkgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCi0JCQkgICAgc2l6ZW9mKCpkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spLAotCQkJICAgIGRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzaykpCisJCQkgICAgc2l6ZW9mKCpyZGV2LT53aXBoeS5odF9jYXBhX21vZF9tYXNrKSwKKwkJCSAgICByZGV2LT53aXBoeS5odF9jYXBhX21vZF9tYXNrKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSAmJgotCQkgICAgZGV2LT53aXBoeS5tYXhfYWNsX21hY19hZGRycyAmJgorCQlpZiAocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBVkVfQVBfU01FICYmCisJCSAgICByZGV2LT53aXBoeS5tYXhfYWNsX21hY19hZGRycyAmJgogCQkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfTUFDX0FDTF9NQVgsCi0JCQkJZGV2LT53aXBoeS5tYXhfYWNsX21hY19hZGRycykpCisJCQkJcmRldi0+d2lwaHkubWF4X2FjbF9tYWNfYWRkcnMpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAkJLyoKQEAgLTE1ODEsNDEgKzE2MDgsNDEgQEAKIAkJc3RhdGUtPnNwbGl0X3N0YXJ0Kys7CiAJCWJyZWFrOwogCWNhc2UgOToKLQkJaWYgKGRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzICYmCisJCWlmIChyZGV2LT53aXBoeS5leHRlbmRlZF9jYXBhYmlsaXRpZXMgJiYKIAkJICAgIChubGFfcHV0KG1zZywgTkw4MDIxMV9BVFRSX0VYVF9DQVBBLAotCQkJICAgICBkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4sCi0JCQkgICAgIGRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzKSB8fAorCQkJICAgICByZGV2LT53aXBoeS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbGVuLAorCQkJICAgICByZGV2LT53aXBoeS5leHRlbmRlZF9jYXBhYmlsaXRpZXMpIHx8CiAJCSAgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9FWFRfQ0FQQV9NQVNLLAotCQkJICAgICBkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4sCi0JCQkgICAgIGRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzX21hc2spKSkKKwkJCSAgICAgcmRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzX2xlbiwKKwkJCSAgICAgcmRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzX21hc2spKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWlmIChkZXYtPndpcGh5LnZodF9jYXBhX21vZF9tYXNrICYmCisJCWlmIChyZGV2LT53aXBoeS52aHRfY2FwYV9tb2RfbWFzayAmJgogCQkgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9WSFRfQ0FQQUJJTElUWV9NQVNLLAotCQkJICAgIHNpemVvZigqZGV2LT53aXBoeS52aHRfY2FwYV9tb2RfbWFzayksCi0JCQkgICAgZGV2LT53aXBoeS52aHRfY2FwYV9tb2RfbWFzaykpCisJCQkgICAgc2l6ZW9mKCpyZGV2LT53aXBoeS52aHRfY2FwYV9tb2RfbWFzayksCisJCQkgICAgcmRldi0+d2lwaHkudmh0X2NhcGFfbW9kX21hc2spKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAkJc3RhdGUtPnNwbGl0X3N0YXJ0Kys7CiAJCWJyZWFrOwogCWNhc2UgMTA6Ci0JCWlmIChubDgwMjExX3NlbmRfY29hbGVzY2UobXNnLCBkZXYpKQorCQlpZiAobmw4MDIxMV9zZW5kX2NvYWxlc2NlKG1zZywgcmRldikpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAoKGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTXzVfMTBfTUhaKSAmJgorCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU181XzEwX01IWikgJiYKIAkJICAgIChubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfU1VQUE9SVF81X01IWikgfHwKIAkJICAgICBubGFfcHV0X2ZsYWcobXNnLCBOTDgwMjExX0FUVFJfU1VQUE9SVF8xMF9NSFopKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCWlmIChkZXYtPndpcGh5Lm1heF9hcF9hc3NvY19zdGEgJiYKKwkJaWYgKHJkZXYtPndpcGh5Lm1heF9hcF9hc3NvY19zdGEgJiYKIAkJICAgIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX01BWF9BUF9BU1NPQ19TVEEsCi0JCQkJZGV2LT53aXBoeS5tYXhfYXBfYXNzb2Nfc3RhKSkKKwkJCQlyZGV2LT53aXBoeS5tYXhfYXBfYXNzb2Nfc3RhKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJCXN0YXRlLT5zcGxpdF9zdGFydCsrOwogCQlicmVhazsKIAljYXNlIDExOgotCQlpZiAoZGV2LT53aXBoeS5uX3ZlbmRvcl9jb21tYW5kcykgeworCQlpZiAocmRldi0+d2lwaHkubl92ZW5kb3JfY29tbWFuZHMpIHsKIAkJCWNvbnN0IHN0cnVjdCBubDgwMjExX3ZlbmRvcl9jbWRfaW5mbyAqaW5mbzsKIAkJCXN0cnVjdCBubGF0dHIgKm5lc3RlZDsKIApAQCAtMTYyMywxNSArMTY1MCwxNSBAQAogCQkJaWYgKCFuZXN0ZWQpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPndpcGh5Lm5fdmVuZG9yX2NvbW1hbmRzOyBpKyspIHsKLQkJCQlpbmZvID0gJmRldi0+d2lwaHkudmVuZG9yX2NvbW1hbmRzW2ldLmluZm87CisJCQlmb3IgKGkgPSAwOyBpIDwgcmRldi0+d2lwaHkubl92ZW5kb3JfY29tbWFuZHM7IGkrKykgeworCQkJCWluZm8gPSAmcmRldi0+d2lwaHkudmVuZG9yX2NvbW1hbmRzW2ldLmluZm87CiAJCQkJaWYgKG5sYV9wdXQobXNnLCBpICsgMSwgc2l6ZW9mKCppbmZvKSwgaW5mbykpCiAJCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkJfQogCQkJbmxhX25lc3RfZW5kKG1zZywgbmVzdGVkKTsKIAkJfQogCi0JCWlmIChkZXYtPndpcGh5Lm5fdmVuZG9yX2V2ZW50cykgeworCQlpZiAocmRldi0+d2lwaHkubl92ZW5kb3JfZXZlbnRzKSB7CiAJCQljb25zdCBzdHJ1Y3Qgbmw4MDIxMV92ZW5kb3JfY21kX2luZm8gKmluZm87CiAJCQlzdHJ1Y3QgbmxhdHRyICpuZXN0ZWQ7CiAKQEAgLTE2NDAsMTggKzE2NjcsMjYgQEAKIAkJCWlmICghbmVzdGVkKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT53aXBoeS5uX3ZlbmRvcl9ldmVudHM7IGkrKykgewotCQkJCWluZm8gPSAmZGV2LT53aXBoeS52ZW5kb3JfZXZlbnRzW2ldOworCQkJZm9yIChpID0gMDsgaSA8IHJkZXYtPndpcGh5Lm5fdmVuZG9yX2V2ZW50czsgaSsrKSB7CisJCQkJaW5mbyA9ICZyZGV2LT53aXBoeS52ZW5kb3JfZXZlbnRzW2ldOwogCQkJCWlmIChubGFfcHV0KG1zZywgaSArIDEsIHNpemVvZigqaW5mbyksIGluZm8pKQogCQkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJCX0KIAkJCW5sYV9uZXN0X2VuZChtc2csIG5lc3RlZCk7CiAJCX0KKwkJc3RhdGUtPnNwbGl0X3N0YXJ0Kys7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWlmIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX0NIQU5ORUxfU1dJVENIICYmCisJCSAgICBubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9BVFRSX01BWF9DU0FfQ09VTlRFUlMsCisJCQkgICAgICAgcmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAkJLyogZG9uZSAqLwogCQlzdGF0ZS0+c3BsaXRfc3RhcnQgPSAwOwogCQlicmVhazsKIAl9CisgZmluaXNoOgogCXJldHVybiBnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKICBubGFfcHV0X2ZhaWx1cmU6CkBAIC0xNjg0LDcgKzE3MTksNyBAQAogCQlpZiAoIW5ldGRldikKIAkJCXJldHVybiAtRU5PREVWOwogCQlpZiAobmV0ZGV2LT5pZWVlODAyMTFfcHRyKSB7Ci0JCQlyZGV2ID0gd2lwaHlfdG9fZGV2KAorCQkJcmRldiA9IHdpcGh5X3RvX3JkZXYoCiAJCQkJbmV0ZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeSk7CiAJCQlzdGF0ZS0+ZmlsdGVyX3dpcGh5ID0gcmRldi0+d2lwaHlfaWR4OwogCQl9CkBAIC0xNjk3LDcgKzE3MzIsNyBAQAogewogCWludCBpZHggPSAwLCByZXQ7CiAJc3RydWN0IG5sODAyMTFfZHVtcF93aXBoeV9zdGF0ZSAqc3RhdGUgPSAodm9pZCAqKWNiLT5hcmdzWzBdOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2OworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKIAogCXJ0bmxfbG9jaygpOwogCWlmICghc3RhdGUpIHsKQEAgLTE3MTYsMTcgKzE3NTEsMTggQEAKIAkJY2ItPmFyZ3NbMF0gPSAobG9uZylzdGF0ZTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNmZzgwMjExX3JkZXZfbGlzdCwgbGlzdCkgewotCQlpZiAoIW5ldF9lcSh3aXBoeV9uZXQoJmRldi0+d2lwaHkpLCBzb2NrX25ldChza2ItPnNrKSkpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KSB7CisJCWlmICghbmV0X2VxKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBzb2NrX25ldChza2ItPnNrKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKCsraWR4IDw9IHN0YXRlLT5zdGFydCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3RhdGUtPmZpbHRlcl93aXBoeSAhPSAtMSAmJgotCQkgICAgc3RhdGUtPmZpbHRlcl93aXBoeSAhPSBkZXYtPndpcGh5X2lkeCkKKwkJICAgIHN0YXRlLT5maWx0ZXJfd2lwaHkgIT0gcmRldi0+d2lwaHlfaWR4KQogCQkJY29udGludWU7CiAJCS8qIGF0dGVtcHQgdG8gZml0IG11bHRpcGxlIHdpcGh5IGRhdGEgY2h1bmtzIGludG8gdGhlIHNrYiAqLwogCQlkbyB7Ci0JCQlyZXQgPSBubDgwMjExX3NlbmRfd2lwaHkoZGV2LCBza2IsCisJCQlyZXQgPSBubDgwMjExX3NlbmRfd2lwaHkocmRldiwgTkw4MDIxMV9DTURfTkVXX1dJUEhZLAorCQkJCQkJIHNrYiwKIAkJCQkJCSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsCiAJCQkJCQkgTkxNX0ZfTVVMVEksIHN0YXRlKTsKQEAgLTE3NzQsMTQgKzE4MTAsMTUgQEAKIHN0YXRpYyBpbnQgbmw4MDIxMV9nZXRfd2lwaHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CiAJc3RydWN0IG5sODAyMTFfZHVtcF93aXBoeV9zdGF0ZSBzdGF0ZSA9IHt9OwogCiAJbXNnID0gbmxtc2dfbmV3KDQwOTYsIEdGUF9LRVJORUwpOwogCWlmICghbXNnKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChubDgwMjExX3NlbmRfd2lwaHkoZGV2LCBtc2csIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsIDAsCisJaWYgKG5sODAyMTFfc2VuZF93aXBoeShyZGV2LCBOTDgwMjExX0NNRF9ORVdfV0lQSFksIG1zZywKKwkJCSAgICAgICBpbmZvLT5zbmRfcG9ydGlkLCBpbmZvLT5zbmRfc2VxLCAwLAogCQkJICAgICAgICZzdGF0ZSkgPCAwKSB7CiAJCW5sbXNnX2ZyZWUobXNnKTsKIAkJcmV0dXJuIC1FTk9CVUZTOwpAQCAtMTkwOCwxOCArMTk0NSwyMCBAQAogfQogCiBzdGF0aWMgaW50IF9fbmw4MDIxMV9zZXRfY2hhbm5lbChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAJaW50IHJlc3VsdDsKIAllbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IE5VTEw7CiAKLQlpZiAod2RldikKLQkJaWZ0eXBlID0gd2Rldi0+aWZ0eXBlOwotCisJaWYgKGRldikKKwkJd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlpZiAoIW5sODAyMTFfY2FuX3NldF9kZXZfY2hhbm5lbCh3ZGV2KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICh3ZGV2KQorCQlpZnR5cGUgPSB3ZGV2LT5pZnR5cGU7CiAKIAlyZXN1bHQgPSBubDgwMjExX3BhcnNlX2NoYW5kZWYocmRldiwgaW5mbywgJmNoYW5kZWYpOwogCWlmIChyZXN1bHQpCkBAIC0xOTI4LDE0ICsxOTY3LDI3IEBACiAJc3dpdGNoIChpZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCQlpZiAod2Rldi0+YmVhY29uX2ludGVydmFsKSB7Ci0JCQlyZXN1bHQgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKCZyZGV2LT53aXBoeSwgJmNoYW5kZWYpKSB7CisJCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmY2hhbmRlZiwgaWZ0eXBlKSkgewogCQkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CisJCWlmICh3ZGV2LT5iZWFjb25faW50ZXJ2YWwpIHsKKwkJCWlmICghZGV2IHx8ICFyZGV2LT5vcHMtPnNldF9hcF9jaGFud2lkdGggfHwKKwkJCSAgICAhKHJkZXYtPndpcGh5LmZlYXR1cmVzICYKKwkJCSAgICAgIE5MODAyMTFfRkVBVFVSRV9BUF9NT0RFX0NIQU5fV0lEVEhfQ0hBTkdFKSkgeworCQkJCXJlc3VsdCA9IC1FQlVTWTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogT25seSBhbGxvdyBkeW5hbWljIGNoYW5uZWwgd2lkdGggY2hhbmdlcyAqLworCQkJaWYgKGNoYW5kZWYuY2hhbiAhPSB3ZGV2LT5wcmVzZXRfY2hhbmRlZi5jaGFuKSB7CisJCQkJcmVzdWx0ID0gLUVCVVNZOworCQkJCWJyZWFrOworCQkJfQorCQkJcmVzdWx0ID0gcmRldl9zZXRfYXBfY2hhbndpZHRoKHJkZXYsIGRldiwgJmNoYW5kZWYpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlicmVhazsKKwkJfQogCQl3ZGV2LT5wcmVzZXRfY2hhbmRlZiA9IGNoYW5kZWY7CiAJCXJlc3VsdCA9IDA7CiAJCWJyZWFrOwpAQCAtMTk1Nyw3ICsyMDA5LDcgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CiAKLQlyZXR1cm4gX19ubDgwMjExX3NldF9jaGFubmVsKHJkZXYsIG5ldGRldi0+aWVlZTgwMjExX3B0ciwgaW5mbyk7CisJcmV0dXJuIF9fbmw4MDIxMV9zZXRfY2hhbm5lbChyZGV2LCBuZXRkZXYsIGluZm8pOwogfQogCiBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3dkc19wZWVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0yMDEzLDcgKzIwNjUsNyBAQAogCiAJCW5ldGRldiA9IF9fZGV2X2dldF9ieV9pbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBpZmluZGV4KTsKIAkJaWYgKG5ldGRldiAmJiBuZXRkZXYtPmllZWU4MDIxMV9wdHIpCi0JCQlyZGV2ID0gd2lwaHlfdG9fZGV2KG5ldGRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHkpOworCQkJcmRldiA9IHdpcGh5X3RvX3JkZXYobmV0ZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeSk7CiAJCWVsc2UKIAkJCW5ldGRldiA9IE5VTEw7CiAJfQpAQCAtMjA3OSw5ICsyMTMxLDEwIEBACiAJfQogCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9GUkVRXSkgewotCQlyZXN1bHQgPSBfX25sODAyMTFfc2V0X2NoYW5uZWwocmRldiwKLQkJCQlubDgwMjExX2Nhbl9zZXRfZGV2X2NoYW5uZWwod2RldikgPyB3ZGV2IDogTlVMTCwKLQkJCQlpbmZvKTsKKwkJcmVzdWx0ID0gX19ubDgwMjExX3NldF9jaGFubmVsKAorCQkJcmRldiwKKwkJCW5sODAyMTFfY2FuX3NldF9kZXZfY2hhbm5lbCh3ZGV2KSA/IG5ldGRldiA6IE5VTEwsCisJCQlpbmZvKTsKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMjIyOSw3ICsyMjgyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdTY0IHdkZXZfaWQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKIHsKIAlyZXR1cm4gKHU2NCl3ZGV2LT5pZGVudGlmaWVyIHwKLQkgICAgICAgKCh1NjQpd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KS0+d2lwaHlfaWR4IDw8IDMyKTsKKwkgICAgICAgKCh1NjQpd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSktPndpcGh5X2lkeCA8PCAzMik7CiB9CiAKIHN0YXRpYyBpbnQgbmw4MDIxMV9zZW5kX2NoYW5kZWYoc3RydWN0IHNrX2J1ZmYgKm1zZywKQEAgLTIzNTUsNyArMjQwOCw3IEBACiBzdGF0aWMgaW50IG5sODAyMTFfZ2V0X2ludGVyZmFjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCXN0cnVjdCBza19idWZmICptc2c7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CiAKIAltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKQEAgLTIzNjMsNyArMjQxNiw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKG5sODAyMTFfc2VuZF9pZmFjZShtc2csIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsIDAsCi0JCQkgICAgICAgZGV2LCB3ZGV2KSA8IDApIHsKKwkJCSAgICAgICByZGV2LCB3ZGV2KSA8IDApIHsKIAkJbmxtc2dfZnJlZShtc2cpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMjUxNCw2ICsyNTY3LDkgQEAKIAllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKIAl1MzIgZmxhZ3M7CiAKKwkvKiB0byBhdm9pZCBmYWlsaW5nIGEgbmV3IGludGVyZmFjZSBjcmVhdGlvbiBkdWUgdG8gcGVuZGluZyByZW1vdmFsICovCisJY2ZnODAyMTFfZGVzdHJveV9pZmFjZXMocmRldik7CisKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUZOQU1FXSkKQEAgLTI1NjMsNiArMjYxOSw5IEBACiAJCXJldHVybiBQVFJfRVJSKHdkZXYpOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUZBQ0VfU09DS0VUX09XTkVSXSkKKwkJd2Rldi0+b3duZXJfbmxwb3J0aWQgPSBpbmZvLT5zbmRfcG9ydGlkOworCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX0lEXSkKQEAgLTMxNDIsNyArMzIwMSw2IEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgcGFyYW1zOwogCWludCBlcnI7Ci0JdTggcmFkYXJfZGV0ZWN0X3dpZHRoID0gMDsKIAogCWlmIChkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgogCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08pCkBAIC0zMjU4LDI0ICszMzE2LDEwIEBACiAJfSBlbHNlIGlmICghbmw4MDIxMV9nZXRfYXBfY2hhbm5lbChyZGV2LCAmcGFyYW1zKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKCZyZGV2LT53aXBoeSwgJnBhcmFtcy5jaGFuZGVmKSkKKwlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKCZyZGV2LT53aXBoeSwgJnBhcmFtcy5jaGFuZGVmLAorCQkJCSAgICAgd2Rldi0+aWZ0eXBlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZCh3ZGV2LT53aXBoeSwgJnBhcmFtcy5jaGFuZGVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoZXJyKSB7Ci0JCXJhZGFyX2RldGVjdF93aWR0aCA9IEJJVChwYXJhbXMuY2hhbmRlZi53aWR0aCk7Ci0JCXBhcmFtcy5yYWRhcl9yZXF1aXJlZCA9IHRydWU7Ci0JfQotCi0JZXJyID0gY2ZnODAyMTFfY2FuX3VzZV9pZnR5cGVfY2hhbihyZGV2LCB3ZGV2LCB3ZGV2LT5pZnR5cGUsCi0JCQkJCSAgIHBhcmFtcy5jaGFuZGVmLmNoYW4sCi0JCQkJCSAgIENIQU5fTU9ERV9TSEFSRUQsCi0JCQkJCSAgIHJhZGFyX2RldGVjdF93aWR0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQUNMX1BPTElDWV0pIHsKIAkJcGFyYW1zLmFjbCA9IHBhcnNlX2FjbF9kYXRhKCZyZGV2LT53aXBoeSwgaW5mbyk7CiAJCWlmIChJU19FUlIocGFyYW1zLmFjbCkpCkBAIC0zNjEzLDYgKzM2NTcsMTAgQEAKIAkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX1NUQV9JTkZPX1RYX0ZBSUxFRCwKIAkJCXNpbmZvLT50eF9mYWlsZWQpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHNpbmZvLT5maWxsZWQgJiBTVEFUSU9OX0lORk9fRVhQRUNURURfVEhST1VHSFBVVCkgJiYKKwkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX1NUQV9JTkZPX0VYUEVDVEVEX1RIUk9VR0hQVVQsCisJCQlzaW5mby0+ZXhwZWN0ZWRfdGhyb3VnaHB1dCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlmICgoc2luZm8tPmZpbGxlZCAmIFNUQVRJT05fSU5GT19CRUFDT05fTE9TU19DT1VOVCkgJiYKIAkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX1NUQV9JTkZPX0JFQUNPTl9MT1NTLAogCQkJc2luZm8tPmJlYWNvbl9sb3NzX2NvdW50KSkKQEAgLTM2NzUsMTMgKzM3MjMsMTMgQEAKIAkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CiAJaW50IHN0YV9pZHggPSBjYi0+YXJnc1syXTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmZGV2LCAmd2Rldik7CisJZXJyID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmcmRldiwgJndkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTM2OTAsMTQgKzM3MzgsMTQgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAotCWlmICghZGV2LT5vcHMtPmR1bXBfc3RhdGlvbikgeworCWlmICghcmRldi0+b3BzLT5kdW1wX3N0YXRpb24pIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAl3aGlsZSAoMSkgewogCQltZW1zZXQoJnNpbmZvLCAwLCBzaXplb2Yoc2luZm8pKTsKLQkJZXJyID0gcmRldl9kdW1wX3N0YXRpb24oZGV2LCB3ZGV2LT5uZXRkZXYsIHN0YV9pZHgsCisJCWVyciA9IHJkZXZfZHVtcF9zdGF0aW9uKHJkZXYsIHdkZXYtPm5ldGRldiwgc3RhX2lkeCwKIAkJCQkJbWFjX2FkZHIsICZzaW5mbyk7CiAJCWlmIChlcnIgPT0gLUVOT0VOVCkKIAkJCWJyZWFrOwpAQCAtMzcwNyw3ICszNzU1LDcgQEAKIAkJaWYgKG5sODAyMTFfc2VuZF9zdGF0aW9uKHNrYiwKIAkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAotCQkJCWRldiwgd2Rldi0+bmV0ZGV2LCBtYWNfYWRkciwKKwkJCQlyZGV2LCB3ZGV2LT5uZXRkZXYsIG1hY19hZGRyLAogCQkJCSZzaW5mbykgPCAwKQogCQkJZ290byBvdXQ7CiAKQEAgLTM3MTksNyArMzc2Nyw3IEBACiAJY2ItPmFyZ3NbMl0gPSBzdGFfaWR4OwogCWVyciA9IHNrYi0+bGVuOwogIG91dF9lcnI6Ci0Jbmw4MDIxMV9maW5pc2hfd2Rldl9kdW1wKGRldik7CisJbmw4MDIxMV9maW5pc2hfd2Rldl9kdW1wKHJkZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTQzODAsMTggKzQ0MjgsMTggQEAKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbXBhdGhfaW5mbyBwaW5mbzsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAl1OCBkc3RbRVRIX0FMRU5dOwogCXU4IG5leHRfaG9wW0VUSF9BTEVOXTsKIAlpbnQgcGF0aF9pZHggPSBjYi0+YXJnc1syXTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmZGV2LCAmd2Rldik7CisJZXJyID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmcmRldiwgJndkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoIWRldi0+b3BzLT5kdW1wX21wYXRoKSB7CisJaWYgKCFyZGV2LT5vcHMtPmR1bXBfbXBhdGgpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC00NDAyLDcgKzQ0NTAsNyBAQAogCX0KIAogCXdoaWxlICgxKSB7Ci0JCWVyciA9IHJkZXZfZHVtcF9tcGF0aChkZXYsIHdkZXYtPm5ldGRldiwgcGF0aF9pZHgsIGRzdCwKKwkJZXJyID0gcmRldl9kdW1wX21wYXRoKHJkZXYsIHdkZXYtPm5ldGRldiwgcGF0aF9pZHgsIGRzdCwKIAkJCQkgICAgICBuZXh0X2hvcCwgJnBpbmZvKTsKIAkJaWYgKGVyciA9PSAtRU5PRU5UKQogCQkJYnJlYWs7CkBAIC00NDIzLDcgKzQ0NzEsNyBAQAogCWNiLT5hcmdzWzJdID0gcGF0aF9pZHg7CiAJZXJyID0gc2tiLT5sZW47CiAgb3V0X2VycjoKLQlubDgwMjExX2ZpbmlzaF93ZGV2X2R1bXAoZGV2KTsKKwlubDgwMjExX2ZpbmlzaF93ZGV2X2R1bXAocmRldik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDY2Myw3ICs0NzExLDYgQEAKIAogc3RhdGljIGludCBubDgwMjExX3JlcV9zZXRfcmVnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0JaW50IHI7CiAJY2hhciAqZGF0YSA9IE5VTEw7CiAJZW51bSBubDgwMjExX3VzZXJfcmVnX2hpbnRfdHlwZSB1c2VyX3JlZ19oaW50X3R5cGU7CiAKQEAgLTQ2NzYsMTEgKzQ3MjMsNiBAQAogCWlmICh1bmxpa2VseSghcmN1X2FjY2Vzc19wb2ludGVyKGNmZzgwMjExX3JlZ2RvbWFpbikpKQogCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCi0JaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX0FMUEhBMl0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGF0YSA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfQUxQSEEyXSk7Ci0KIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1VTRVJfUkVHX0hJTlRfVFlQRV0pCiAJCXVzZXJfcmVnX2hpbnRfdHlwZSA9CiAJCSAgbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1VTRVJfUkVHX0hJTlRfVFlQRV0pOwpAQCAtNDY5MCwxNCArNDczMiwxNiBAQAogCXN3aXRjaCAodXNlcl9yZWdfaGludF90eXBlKSB7CiAJY2FzZSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfVVNFUjoKIAljYXNlIE5MODAyMTFfVVNFUl9SRUdfSElOVF9DRUxMX0JBU0U6Ci0JCWJyZWFrOworCQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfQUxQSEEyXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRhdGEgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX0FMUEhBMl0pOworCQlyZXR1cm4gcmVndWxhdG9yeV9oaW50X3VzZXIoZGF0YSwgdXNlcl9yZWdfaGludF90eXBlKTsKKwljYXNlIE5MODAyMTFfVVNFUl9SRUdfSElOVF9JTkRPT1I6CisJCXJldHVybiByZWd1bGF0b3J5X2hpbnRfaW5kb29yX3VzZXIoKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KLQlyID0gcmVndWxhdG9yeV9oaW50X3VzZXIoZGF0YSwgdXNlcl9yZWdfaGludF90eXBlKTsKLQotCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IG5sODAyMTFfZ2V0X21lc2hfY29uZmlnKHN0cnVjdCBza19idWZmICpza2IsCkBAIC01Nzk2LDcgKzU4NDAsOCBAQAogCWlmICh3ZGV2LT5jYWNfc3RhcnRlZCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWVyciA9IGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdkZXYtPndpcGh5LCAmY2hhbmRlZik7CisJZXJyID0gY2ZnODAyMTFfY2hhbmRlZl9kZnNfcmVxdWlyZWQod2Rldi0+d2lwaHksICZjaGFuZGVmLAorCQkJCQkgICAgd2Rldi0+aWZ0eXBlKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTgwOSwxMiArNTg1NCw2IEBACiAJaWYgKCFyZGV2LT5vcHMtPnN0YXJ0X3JhZGFyX2RldGVjdGlvbikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JZXJyID0gY2ZnODAyMTFfY2FuX3VzZV9pZnR5cGVfY2hhbihyZGV2LCB3ZGV2LCB3ZGV2LT5pZnR5cGUsCi0JCQkJCSAgIGNoYW5kZWYuY2hhbiwgQ0hBTl9NT0RFX1NIQVJFRCwKLQkJCQkJICAgQklUKGNoYW5kZWYud2lkdGgpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJY2FjX3RpbWVfbXMgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19jYWNfdGltZSgmcmRldi0+d2lwaHksICZjaGFuZGVmKTsKIAlpZiAoV0FSTl9PTighY2FjX3RpbWVfbXMpKQogCQljYWNfdGltZV9tcyA9IElFRUU4MDIxMV9ERlNfTUlOX0NBQ19USU1FX01TOwpAQCAtNTg0Myw2ICs1ODgyLDcgQEAKIAl1OCByYWRhcl9kZXRlY3Rfd2lkdGggPSAwOwogCWludCBlcnI7CiAJYm9vbCBuZWVkX25ld19iZWFjb24gPSBmYWxzZTsKKwlpbnQgbGVuLCBpOwogCiAJaWYgKCFyZGV2LT5vcHMtPmNoYW5uZWxfc3dpdGNoIHx8CiAJICAgICEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSCkpCkBAIC01OTAxLDI2ICs1OTQxLDU1IEBACiAJaWYgKCFjc2FfYXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9CRUFDT05dKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhcmFtcy5jb3VudGVyX29mZnNldF9iZWFjb24gPQotCQlubGFfZ2V0X3UxNihjc2FfYXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9CRUFDT05dKTsKLQlpZiAocGFyYW1zLmNvdW50ZXJfb2Zmc2V0X2JlYWNvbiA+PSBwYXJhbXMuYmVhY29uX2NzYS50YWlsX2xlbikKKwlsZW4gPSBubGFfbGVuKGNzYV9hdHRyc1tOTDgwMjExX0FUVFJfQ1NBX0NfT0ZGX0JFQUNPTl0pOworCWlmICghbGVuIHx8IChsZW4gJSBzaXplb2YodTE2KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogc2FuaXR5IGNoZWNrIC0gY291bnRlcnMgc2hvdWxkIGJlIHRoZSBzYW1lICovCi0JaWYgKHBhcmFtcy5iZWFjb25fY3NhLnRhaWxbcGFyYW1zLmNvdW50ZXJfb2Zmc2V0X2JlYWNvbl0gIT0KLQkgICAgcGFyYW1zLmNvdW50KQorCXBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19iZWFjb24gPSBsZW4gLyBzaXplb2YodTE2KTsKKwlpZiAocmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMgJiYKKwkgICAgKHBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19iZWFjb24gPgorCSAgICAgcmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXBhcmFtcy5jb3VudGVyX29mZnNldHNfYmVhY29uID0KKwkJbmxhX2RhdGEoY3NhX2F0dHJzW05MODAyMTFfQVRUUl9DU0FfQ19PRkZfQkVBQ09OXSk7CisKKwkvKiBzYW5pdHkgY2hlY2tzIC0gY291bnRlcnMgc2hvdWxkIGZpdCBhbmQgYmUgdGhlIHNhbWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLm5fY291bnRlcl9vZmZzZXRzX2JlYWNvbjsgaSsrKSB7CisJCXUxNiBvZmZzZXQgPSBwYXJhbXMuY291bnRlcl9vZmZzZXRzX2JlYWNvbltpXTsKKworCQlpZiAob2Zmc2V0ID49IHBhcmFtcy5iZWFjb25fY3NhLnRhaWxfbGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHBhcmFtcy5iZWFjb25fY3NhLnRhaWxbb2Zmc2V0XSAhPSBwYXJhbXMuY291bnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoY3NhX2F0dHJzW05MODAyMTFfQVRUUl9DU0FfQ19PRkZfUFJFU1BdKSB7Ci0JCXBhcmFtcy5jb3VudGVyX29mZnNldF9wcmVzcCA9Ci0JCQlubGFfZ2V0X3UxNihjc2FfYXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9QUkVTUF0pOwotCQlpZiAocGFyYW1zLmNvdW50ZXJfb2Zmc2V0X3ByZXNwID49Ci0JCSAgICBwYXJhbXMuYmVhY29uX2NzYS5wcm9iZV9yZXNwX2xlbikKKwkJbGVuID0gbmxhX2xlbihjc2FfYXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9QUkVTUF0pOworCQlpZiAoIWxlbiB8fCAobGVuICUgc2l6ZW9mKHUxNikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKHBhcmFtcy5iZWFjb25fY3NhLnByb2JlX3Jlc3BbcGFyYW1zLmNvdW50ZXJfb2Zmc2V0X3ByZXNwXSAhPQotCQkgICAgcGFyYW1zLmNvdW50KQorCQlwYXJhbXMubl9jb3VudGVyX29mZnNldHNfcHJlc3AgPSBsZW4gLyBzaXplb2YodTE2KTsKKwkJaWYgKHJkZXYtPndpcGh5Lm1heF9udW1fY3NhX2NvdW50ZXJzICYmCisJCSAgICAocGFyYW1zLm5fY291bnRlcl9vZmZzZXRzX2JlYWNvbiA+CisJCSAgICAgcmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcGFyYW1zLmNvdW50ZXJfb2Zmc2V0c19wcmVzcCA9CisJCQlubGFfZGF0YShjc2FfYXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRl9QUkVTUF0pOworCisJCS8qIHNhbml0eSBjaGVja3MgLSBjb3VudGVycyBzaG91bGQgZml0IGFuZCBiZSB0aGUgc2FtZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLm5fY291bnRlcl9vZmZzZXRzX3ByZXNwOyBpKyspIHsKKwkJCXUxNiBvZmZzZXQgPSBwYXJhbXMuY291bnRlcl9vZmZzZXRzX3ByZXNwW2ldOworCisJCQlpZiAob2Zmc2V0ID49IHBhcmFtcy5iZWFjb25fY3NhLnByb2JlX3Jlc3BfbGVuKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAocGFyYW1zLmJlYWNvbl9jc2EucHJvYmVfcmVzcFtvZmZzZXRdICE9CisJCQkgICAgcGFyYW1zLmNvdW50KQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiBza2lwX2JlYWNvbnM6CkBAIC01OTI4LDI3ICs1OTk3LDI1IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmcGFyYW1zLmNoYW5kZWYpKQorCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmcGFyYW1zLmNoYW5kZWYsCisJCQkJICAgICB3ZGV2LT5pZnR5cGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaCAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQllcnIgPSBjZmc4MDIxMV9jaGFuZGVmX2Rmc19yZXF1aXJlZCh3ZGV2LT53aXBoeSwKLQkJCQkJCSAgICAmcGFyYW1zLmNoYW5kZWYpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWlmIChlcnIpIHsKLQkJCXJhZGFyX2RldGVjdF93aWR0aCA9IEJJVChwYXJhbXMuY2hhbmRlZi53aWR0aCk7Ci0JCQlwYXJhbXMucmFkYXJfcmVxdWlyZWQgPSB0cnVlOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCWVyciA9IGNmZzgwMjExX2NoYW5kZWZfZGZzX3JlcXVpcmVkKHdkZXYtPndpcGh5LAorCQkJCQkgICAgJnBhcmFtcy5jaGFuZGVmLAorCQkJCQkgICAgd2Rldi0+aWZ0eXBlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChlcnIgPiAwKSB7CisJCXJhZGFyX2RldGVjdF93aWR0aCA9IEJJVChwYXJhbXMuY2hhbmRlZi53aWR0aCk7CisJCXBhcmFtcy5yYWRhcl9yZXF1aXJlZCA9IHRydWU7CiAJfQogCisJLyogVE9ETzogSSBsZWZ0IHRoaXMgaGVyZSBmb3Igbm93LiAgV2l0aCBjaGFubmVsIHN3aXRjaCwgdGhlCisJICogdmVyaWZpY2F0aW9uIGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQsIGJlY2F1c2Ugd2Ugb25seSBkbworCSAqIGl0IGxhdGVyIHdoZW4gdGhlIGNoYW5uZWwgc3dpdGNoIHJlYWxseSBoYXBwZW5zLgorCSAqLwogCWVyciA9IGNmZzgwMjExX2Nhbl91c2VfaWZ0eXBlX2NoYW4ocmRldiwgd2Rldiwgd2Rldi0+aWZ0eXBlLAogCQkJCQkgICBwYXJhbXMuY2hhbmRlZi5jaGFuLAogCQkJCQkgICBDSEFOX01PREVfU0hBUkVELApAQCAtNjE3NSwxMiArNjI0MiwxMiBAQAogCQkJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXN0cnVjdCBzdXJ2ZXlfaW5mbyBzdXJ2ZXk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2OwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAJaW50IHN1cnZleV9pZHggPSBjYi0+YXJnc1syXTsKIAlpbnQgcmVzOwogCi0JcmVzID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmZGV2LCAmd2Rldik7CisJcmVzID0gbmw4MDIxMV9wcmVwYXJlX3dkZXZfZHVtcChza2IsIGNiLCAmcmRldiwgJndkZXYpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKQEAgLTYxODksNyArNjI1Niw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlpZiAoIWRldi0+b3BzLT5kdW1wX3N1cnZleSkgeworCWlmICghcmRldi0+b3BzLT5kdW1wX3N1cnZleSkgewogCQlyZXMgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXRfZXJyOwogCX0KQEAgLTYxOTcsNyArNjI2NCw3IEBACiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCi0JCXJlcyA9IHJkZXZfZHVtcF9zdXJ2ZXkoZGV2LCB3ZGV2LT5uZXRkZXYsIHN1cnZleV9pZHgsICZzdXJ2ZXkpOworCQlyZXMgPSByZGV2X2R1bXBfc3VydmV5KHJkZXYsIHdkZXYtPm5ldGRldiwgc3VydmV5X2lkeCwgJnN1cnZleSk7CiAJCWlmIChyZXMgPT0gLUVOT0VOVCkKIAkJCWJyZWFrOwogCQlpZiAocmVzKQpAQCAtNjIwOSw3ICs2Mjc2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCgmZGV2LT53aXBoeSwKKwkJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCgmcmRldi0+d2lwaHksCiAJCQkJCSAgICAgc3VydmV5LmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKIAkJaWYgKCFjaGFuIHx8IGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpIHsKIAkJCXN1cnZleV9pZHgrKzsKQEAgLTYyMjgsNyArNjI5NSw3IEBACiAJY2ItPmFyZ3NbMl0gPSBzdXJ2ZXlfaWR4OwogCXJlcyA9IHNrYi0+bGVuOwogIG91dF9lcnI6Ci0Jbmw4MDIxMV9maW5pc2hfd2Rldl9kdW1wKGRldik7CisJbmw4MDIxMV9maW5pc2hfd2Rldl9kdW1wKHJkZXYpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTY3MDQsNyArNjc3MSw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICghY2ZnODAyMTFfcmVnX2Nhbl9iZWFjb24oJnJkZXYtPndpcGh5LCAmaWJzcy5jaGFuZGVmKSkKKwlpZiAoIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uKCZyZGV2LT53aXBoeSwgJmlic3MuY2hhbmRlZiwKKwkJCQkgICAgIE5MODAyMTFfSUZUWVBFX0FESE9DKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzd2l0Y2ggKGlic3MuY2hhbmRlZi53aWR0aCkgewpAQCAtNjg3OSw3ICs2OTQ3LDcgQEAKIAkJCQkJICAgaW50IHZlbmRvcl9ldmVudF9pZHgsCiAJCQkJCSAgIGludCBhcHByb3hsZW4sIGdmcF90IGdmcCkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCWNvbnN0IHN0cnVjdCBubDgwMjExX3ZlbmRvcl9jbWRfaW5mbyAqaW5mbzsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC03NzY3LDYgKzc4MzUsMjcgQEAKIAlpZiAoIWNoYW5kZWYuY2hhbiAmJiBwYXJhbXMub2ZmY2hhbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlwYXJhbXMuYnVmID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSk7CisJcGFyYW1zLmxlbiA9IG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSk7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0NTQV9DX09GRlNFVFNfVFhdKSB7CisJCWludCBsZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9DU0FfQ19PRkZTRVRTX1RYXSk7CisJCWludCBpOworCisJCWlmIChsZW4gJSBzaXplb2YodTE2KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXBhcmFtcy5uX2NzYV9vZmZzZXRzID0gbGVuIC8gc2l6ZW9mKHUxNik7CisJCXBhcmFtcy5jc2Ffb2Zmc2V0cyA9CisJCQlubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQ1NBX0NfT0ZGU0VUU19UWF0pOworCisJCS8qIGNoZWNrIHRoYXQgYWxsIHRoZSBvZmZzZXRzIGZpdCB0aGUgZnJhbWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBhcmFtcy5uX2NzYV9vZmZzZXRzOyBpKyspIHsKKwkJCWlmIChwYXJhbXMuY3NhX29mZnNldHNbaV0gPj0gcGFyYW1zLmxlbikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwogCWlmICghcGFyYW1zLmRvbnRfd2FpdF9mb3JfYWNrKSB7CiAJCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwogCQlpZiAoIW1zZykKQEAgLTc3ODAsOCArNzg2OSw2IEBACiAJCX0KIAl9CiAKLQlwYXJhbXMuYnVmID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSk7Ci0JcGFyYW1zLmxlbiA9IG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSk7CiAJcGFyYW1zLmNoYW4gPSBjaGFuZGVmLmNoYW47CiAJZXJyID0gY2ZnODAyMTFfbWxtZV9tZ210X3R4KHJkZXYsIHdkZXYsICZwYXJhbXMsICZjb29raWUpOwogCWlmIChlcnIpCkBAIC04NDc4LDYgKzg1NjUsOCBAQAogCiAJCW5sYV9mb3JfZWFjaF9uZXN0ZWQocGF0LCB0YltOTDgwMjExX1dPV0xBTl9UUklHX1BLVF9QQVRURVJOXSwKIAkJCQkgICAgcmVtKSB7CisJCQl1OCAqbWFza19wYXQ7CisKIAkJCW5sYV9wYXJzZShwYXRfdGIsIE1BWF9OTDgwMjExX1BLVFBBVCwgbmxhX2RhdGEocGF0KSwKIAkJCQkgIG5sYV9sZW4ocGF0KSwgTlVMTCk7CiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtODUwMSwxOSArODU5MCwxOCBAQAogCQkJCWdvdG8gZXJyb3I7CiAJCQluZXdfdHJpZ2dlcnMucGF0dGVybnNbaV0ucGt0X29mZnNldCA9IHBrdF9vZmZzZXQ7CiAKLQkJCW5ld190cmlnZ2Vycy5wYXR0ZXJuc1tpXS5tYXNrID0KLQkJCQlrbWFsbG9jKG1hc2tfbGVuICsgcGF0X2xlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIW5ld190cmlnZ2Vycy5wYXR0ZXJuc1tpXS5tYXNrKSB7CisJCQltYXNrX3BhdCA9IGttYWxsb2MobWFza19sZW4gKyBwYXRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghbWFza19wYXQpIHsKIAkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9Ci0JCQluZXdfdHJpZ2dlcnMucGF0dGVybnNbaV0ucGF0dGVybiA9Ci0JCQkJbmV3X3RyaWdnZXJzLnBhdHRlcm5zW2ldLm1hc2sgKyBtYXNrX2xlbjsKLQkJCW1lbWNweShuZXdfdHJpZ2dlcnMucGF0dGVybnNbaV0ubWFzaywKLQkJCSAgICAgICBubGFfZGF0YShwYXRfdGJbTkw4MDIxMV9QS1RQQVRfTUFTS10pLAorCQkJbmV3X3RyaWdnZXJzLnBhdHRlcm5zW2ldLm1hc2sgPSBtYXNrX3BhdDsKKwkJCW1lbWNweShtYXNrX3BhdCwgbmxhX2RhdGEocGF0X3RiW05MODAyMTFfUEtUUEFUX01BU0tdKSwKIAkJCSAgICAgICBtYXNrX2xlbik7CisJCQltYXNrX3BhdCArPSBtYXNrX2xlbjsKKwkJCW5ld190cmlnZ2Vycy5wYXR0ZXJuc1tpXS5wYXR0ZXJuID0gbWFza19wYXQ7CiAJCQluZXdfdHJpZ2dlcnMucGF0dGVybnNbaV0ucGF0dGVybl9sZW4gPSBwYXRfbGVuOwotCQkJbWVtY3B5KG5ld190cmlnZ2Vycy5wYXR0ZXJuc1tpXS5wYXR0ZXJuLAorCQkJbWVtY3B5KG1hc2tfcGF0LAogCQkJICAgICAgIG5sYV9kYXRhKHBhdF90YltOTDgwMjExX1BLVFBBVF9QQVRURVJOXSksCiAJCQkgICAgICAgcGF0X2xlbik7CiAJCQlpKys7CkBAIC04NzA1LDYgKzg3OTMsOCBAQAogCiAJbmxhX2Zvcl9lYWNoX25lc3RlZChwYXQsIHRiW05MODAyMTFfQVRUUl9DT0FMRVNDRV9SVUxFX1BLVF9QQVRURVJOXSwKIAkJCSAgICByZW0pIHsKKwkJdTggKm1hc2tfcGF0OworCiAJCW5sYV9wYXJzZShwYXRfdGIsIE1BWF9OTDgwMjExX1BLVFBBVCwgbmxhX2RhdGEocGF0KSwKIAkJCSAgbmxhX2xlbihwYXQpLCBOVUxMKTsKIAkJaWYgKCFwYXRfdGJbTkw4MDIxMV9QS1RQQVRfTUFTS10gfHwKQEAgLTg3MjYsMTcgKzg4MTYsMTkgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXdfcnVsZS0+cGF0dGVybnNbaV0ucGt0X29mZnNldCA9IHBrdF9vZmZzZXQ7CiAKLQkJbmV3X3J1bGUtPnBhdHRlcm5zW2ldLm1hc2sgPQotCQkJa21hbGxvYyhtYXNrX2xlbiArIHBhdF9sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIW5ld19ydWxlLT5wYXR0ZXJuc1tpXS5tYXNrKQorCQltYXNrX3BhdCA9IGttYWxsb2MobWFza19sZW4gKyBwYXRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtYXNrX3BhdCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQluZXdfcnVsZS0+cGF0dGVybnNbaV0ucGF0dGVybiA9Ci0JCQluZXdfcnVsZS0+cGF0dGVybnNbaV0ubWFzayArIG1hc2tfbGVuOwotCQltZW1jcHkobmV3X3J1bGUtPnBhdHRlcm5zW2ldLm1hc2ssCi0JCSAgICAgICBubGFfZGF0YShwYXRfdGJbTkw4MDIxMV9QS1RQQVRfTUFTS10pLCBtYXNrX2xlbik7CisKKwkJbmV3X3J1bGUtPnBhdHRlcm5zW2ldLm1hc2sgPSBtYXNrX3BhdDsKKwkJbWVtY3B5KG1hc2tfcGF0LCBubGFfZGF0YShwYXRfdGJbTkw4MDIxMV9QS1RQQVRfTUFTS10pLAorCQkgICAgICAgbWFza19sZW4pOworCisJCW1hc2tfcGF0ICs9IG1hc2tfbGVuOworCQluZXdfcnVsZS0+cGF0dGVybnNbaV0ucGF0dGVybiA9IG1hc2tfcGF0OwogCQluZXdfcnVsZS0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4gPSBwYXRfbGVuOwotCQltZW1jcHkobmV3X3J1bGUtPnBhdHRlcm5zW2ldLnBhdHRlcm4sCi0JCSAgICAgICBubGFfZGF0YShwYXRfdGJbTkw4MDIxMV9QS1RQQVRfUEFUVEVSTl0pLCBwYXRfbGVuKTsKKwkJbWVtY3B5KG1hc2tfcGF0LCBubGFfZGF0YShwYXRfdGJbTkw4MDIxMV9QS1RQQVRfUEFUVEVSTl0pLAorCQkgICAgICAgcGF0X2xlbik7CiAJCWkrKzsKIAl9CiAKQEAgLTg5ODEsOSArOTA3Myw4IEBACiAJaWYgKHdkZXYtPnAycF9zdGFydGVkKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IGNmZzgwMjExX2Nhbl9hZGRfaW50ZXJmYWNlKHJkZXYsIHdkZXYtPmlmdHlwZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlpZiAocmZraWxsX2Jsb2NrZWQocmRldi0+cmZraWxsKSkKKwkJcmV0dXJuIC1FUkZLSUxMOwogCiAJZXJyID0gcmRldl9zdGFydF9wMnBfZGV2aWNlKHJkZXYsIHdkZXYpOwogCWlmIChlcnIpCkBAIC05MTkyLDcgKzkyODMsNyBAQAogCQkJCQkgICBlbnVtIG5sODAyMTFfYXR0cnMgYXR0ciwKIAkJCQkJICAgaW50IGFwcHJveGxlbikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJaWYgKFdBUk5fT04oIXJkZXYtPmN1cl9jbWRfaW5mbykpCiAJCXJldHVybiBOVUxMOwpAQCAtOTMxNiw3ICs5NDA3LDcgQEAKIAkJfQogCiAJCWRldiA9IHdkZXYtPm5ldGRldjsKLQkJcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJCXJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAogCQlpZiAob3BzLT5pbnRlcm5hbF9mbGFncyAmIE5MODAyMTFfRkxBR19ORUVEX05FVERFVikgewogCQkJaWYgKCFkZXYpIHsKQEAgLTEwMDE3LDE2ICsxMDEwOCwyMCBAQAogCiAvKiBub3RpZmljYXRpb24gZnVuY3Rpb25zICovCiAKLXZvaWQgbmw4MDIxMV9ub3RpZnlfZGV2X3JlbmFtZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpCit2b2lkIG5sODAyMTFfbm90aWZ5X3dpcGh5KHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCSAgZW51bSBubDgwMjExX2NvbW1hbmRzIGNtZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXN0cnVjdCBubDgwMjExX2R1bXBfd2lwaHlfc3RhdGUgc3RhdGUgPSB7fTsKIAorCVdBUk5fT04oY21kICE9IE5MODAyMTFfQ01EX05FV19XSVBIWSAmJgorCQljbWQgIT0gTkw4MDIxMV9DTURfREVMX1dJUEhZKTsKKwogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghbXNnKQogCQlyZXR1cm47CiAKLQlpZiAobmw4MDIxMV9zZW5kX3dpcGh5KHJkZXYsIG1zZywgMCwgMCwgMCwgJnN0YXRlKSA8IDApIHsKKwlpZiAobmw4MDIxMV9zZW5kX3dpcGh5KHJkZXYsIGNtZCwgbXNnLCAwLCAwLCAwLCAmc3RhdGUpIDwgMCkgewogCQlubG1zZ19mcmVlKG1zZyk7CiAJCXJldHVybjsKIAl9CkBAIC0xMDM0NSw3ICsxMDQ0MCw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKWJ1ZjsKIAl1MzIgY21kOwogCkBAIC0xMDU2Nyw3ICsxMDY2Miw3IEBACiAJCQkJCWNvbnN0IHU4KiBpZSwgdTggaWVfbGVuLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCkBAIC0xMDc0Nyw3ICsxMDg0Miw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IGR1cmF0aW9uLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAKIAl0cmFjZV9jZmc4MDIxMV9yZWFkeV9vbl9jaGFubmVsKHdkZXYsIGNvb2tpZSwgY2hhbiwgZHVyYXRpb24pOwogCW5sODAyMTFfc2VuZF9yZW1haW5fb25fY2hhbl9ldmVudChOTDgwMjExX0NNRF9SRU1BSU5fT05fQ0hBTk5FTCwKQEAgLTEwNzYxLDcgKzEwODU2LDcgQEAKIAkJCQkJZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJdHJhY2VfY2ZnODAyMTFfcmVhZHlfb25fY2hhbm5lbF9leHBpcmVkKHdkZXYsIGNvb2tpZSwgY2hhbik7CiAJbmw4MDIxMV9zZW5kX3JlbWFpbl9vbl9jaGFuX2V2ZW50KE5MODAyMTFfQ01EX0NBTkNFTF9SRU1BSU5fT05fQ0hBTk5FTCwKQEAgLTEwNzczLDcgKzEwODY4LDcgQEAKIAkJICAgICAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8sIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAKIAl0cmFjZV9jZmc4MDIxMV9uZXdfc3RhKGRldiwgbWFjX2FkZHIsIHNpbmZvKTsKQEAgLTEwNzk2LDcgKzEwODkxLDcgQEAKIHZvaWQgY2ZnODAyMTFfZGVsX3N0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqbWFjX2FkZHIsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCkBAIC0xMDgzMyw3ICsxMDkyOCw3IEBACiAJCQkgIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCkBAIC0xMDg2OCw3ICsxMDk2Myw3IEBACiAJCQkJICAgICAgIGNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCXUzMiBubHBvcnRpZCA9IEFDQ0VTU19PTkNFKHdkZXYtPmFwX3VuZXhwZWN0ZWRfbmxwb3J0aWQpOwpAQCAtMTA5ODgsNyArMTEwODMsNyBAQAogCQkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIGFjaywgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB3ZGV2LT5uZXRkZXY7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CkBAIC0xMTAzMiw3ICsxMTEyNyw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXN0cnVjdCBubGF0dHIgKnBpbmZvYXR0cjsKIAl2b2lkICpoZHI7CkBAIC0xMTEyNCw3ICsxMTIxOSw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAogCXRyYWNlX2NmZzgwMjExX2d0a19yZWtleV9ub3RpZnkoZGV2LCBic3NpZCk7CiAJbmw4MDIxMV9ndGtfcmVrZXlfbm90aWZ5KHJkZXYsIGRldiwgYnNzaWQsIHJlcGxheV9jdHIsIGdmcCk7CkBAIC0xMTE4Miw3ICsxMTI3Nyw3IEBACiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAogCXRyYWNlX2NmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkoZGV2LCBpbmRleCwgYnNzaWQsIHByZWF1dGgpOwogCW5sODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeShyZGV2LCBkZXYsIGluZGV4LCBic3NpZCwgcHJlYXV0aCwgZ2ZwKTsKQEAgLTExMjI5LDcgKzExMzI0LDcgQEAKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIApAQCAtMTEyNTMsNyArMTEzNDgsNyBAQAogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAlzdHJ1Y3QgbmxhdHRyICpwaW5mb2F0dHI7CiAJdm9pZCAqaGRyOwpAQCAtMTEzNTMsNyArMTE0NDgsNyBAQAogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAlzdHJ1Y3QgbmxhdHRyICpwaW5mb2F0dHI7CiAJdm9pZCAqaGRyOwpAQCAtMTE0MDAsNyArMTE0OTUsNyBAQAogCQkJICAgdTY0IGNvb2tpZSwgYm9vbCBhY2tlZCwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXZvaWQgKmhkcjsKIApAQCAtMTE0NDAsNyArMTE1MzUsNyBAQAogCQkJCSBjb25zdCB1OCAqZnJhbWUsIHNpemVfdCBsZW4sCiAJCQkJIGludCBmcmVxLCBpbnQgc2lnX2RibSkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCXN0cnVjdCBjZmc4MDIxMV9iZWFjb25fcmVnaXN0cmF0aW9uICpyZWc7CkBAIC0xMTQ4Nyw3ICsxMTU4Miw3IEBACiAJCQkJICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbl93YWtldXAgKndha2V1cCwKIAkJCQkgICBnZnBfdCBnZnApCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXZvaWQgKmhkcjsKIAlpbnQgc2l6ZSA9IDIwMDsKQEAgLTExNTk3LDcgKzExNjkyLDcgQEAKIAkJCQl1MTYgcmVhc29uX2NvZGUsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CiAKQEAgLTExNjQ5LDkgKzExNzQ0LDE1IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmRldiwgJmNmZzgwMjExX3JkZXZfbGlzdCwgbGlzdCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3ZGV2LCAmcmRldi0+d2Rldl9saXN0LCBsaXN0KQorCQlib29sIHNjaGVkdWxlX2Rlc3Ryb3lfd29yayA9IGZhbHNlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHdkZXYsICZyZGV2LT53ZGV2X2xpc3QsIGxpc3QpIHsKIAkJCWNmZzgwMjExX21sbWVfdW5yZWdpc3Rlcl9zb2NrZXQod2Rldiwgbm90aWZ5LT5wb3J0aWQpOwogCisJCQlpZiAod2Rldi0+b3duZXJfbmxwb3J0aWQgPT0gbm90aWZ5LT5wb3J0aWQpCisJCQkJc2NoZWR1bGVfZGVzdHJveV93b3JrID0gdHJ1ZTsKKwkJfQorCiAJCXNwaW5fbG9ja19iaCgmcmRldi0+YmVhY29uX3JlZ2lzdHJhdGlvbnNfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWcsIHRtcCwgJnJkZXYtPmJlYWNvbl9yZWdpc3RyYXRpb25zLAogCQkJCQkgbGlzdCkgewpAQCAtMTE2NjIsMTEgKzExNzYzLDI0IEBACiAJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJlYWNvbl9yZWdpc3RyYXRpb25zX2xvY2spOworCisJCWlmIChzY2hlZHVsZV9kZXN0cm95X3dvcmspIHsKKwkJCXN0cnVjdCBjZmc4MDIxMV9pZmFjZV9kZXN0cm95ICpkZXN0cm95OworCisJCQlkZXN0cm95ID0ga3phbGxvYyhzaXplb2YoKmRlc3Ryb3kpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChkZXN0cm95KSB7CisJCQkJZGVzdHJveS0+bmxwb3J0aWQgPSBub3RpZnktPnBvcnRpZDsKKwkJCQlzcGluX2xvY2soJnJkZXYtPmRlc3Ryb3lfbGlzdF9sb2NrKTsKKwkJCQlsaXN0X2FkZCgmZGVzdHJveS0+bGlzdCwgJnJkZXYtPmRlc3Ryb3lfbGlzdCk7CisJCQkJc3Bpbl91bmxvY2soJnJkZXYtPmRlc3Ryb3lfbGlzdF9sb2NrKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZyZGV2LT5kZXN0cm95X3dvcmspOworCQkJfQorCQl9CiAJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBubDgwMjExX25ldGxpbmtfbm90aWZpZXIgPSB7CkBAIC0xMTY3Nyw3ICsxMTc5MSw3IEBACiAJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfZnRfZXZlbnRfcGFyYW1zICpmdF9ldmVudCkKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gbmV0ZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCkBAIC0xMTcyNCw3ICsxMTgzOCw3IEBACiAJdm9pZCAqaGRyOwogCXUzMiBubHBvcnRpZDsKIAotCXJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlpZiAoIXJkZXYtPmNyaXRfcHJvdG9fbmxwb3J0aWQpCiAJCXJldHVybjsKIApAQCAtMTE3NTksNyArMTE4NzMsNyBAQAogdm9pZCBubDgwMjExX3NlbmRfYXBfc3RvcHBlZChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCAxZTZkZjk2Li40OWM5YTQ4IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTUsNyArNSw4IEBACiAKIGludCBubDgwMjExX2luaXQodm9pZCk7CiB2b2lkIG5sODAyMTFfZXhpdCh2b2lkKTsKLXZvaWQgbmw4MDIxMV9ub3RpZnlfZGV2X3JlbmFtZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpOwordm9pZCBubDgwMjExX25vdGlmeV93aXBoeShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgIGVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpOwogdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9zdGFydChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogc3RydWN0IHNrX2J1ZmYgKm5sODAyMTFfYnVpbGRfc2Nhbl9tc2coc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmggYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAppbmRleCA3NGQ5N2QzLi5kOTViYmUzIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAorKysgYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaApAQCAtMTk5LDcgKzE5OSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJkZXZfZ2V0X3N0YXRpb24oc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAotCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWMsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hYywKIAkJCQkgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKIAlpbnQgcmV0OwpAQCAtOTUwLDQgKzk1MCwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CityZGV2X3NldF9hcF9jaGFud2lkdGgoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfc2V0X2FwX2NoYW53aWR0aCgmcmRldi0+d2lwaHksIGRldiwgY2hhbmRlZik7CisJcmV0ID0gcmRldi0+b3BzLT5zZXRfYXBfY2hhbndpZHRoKCZyZGV2LT53aXBoeSwgZGV2LCBjaGFuZGVmKTsKKwl0cmFjZV9yZGV2X3JldHVybl9pbnQoJnJkZXYtPndpcGh5LCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwogI2VuZGlmIC8qIF9fQ0ZHODAyMTFfUkRFVl9PUFMgKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWcuYyBiL25ldC93aXJlbGVzcy9yZWcuYwppbmRleCBmNTlhYWFjNS4uNTU4YjBlMyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtNjUsMTEgKzY1LDI2IEBACiAjZGVmaW5lIFJFR19EQkdfUFJJTlQoYXJncy4uLikKICNlbmRpZgogCisvKioKKyAqIGVudW0gcmVnX3JlcXVlc3RfdHJlYXRtZW50IC0gcmVndWxhdG9yeSByZXF1ZXN0IHRyZWF0bWVudAorICoKKyAqIEBSRUdfUkVRX09LOiBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSByZWd1bGF0b3J5IHJlcXVlc3QKKyAqIEBSRUdfUkVRX0lHTk9SRTogaWdub3JlIHRoZSByZWd1bGF0b3J5IHJlcXVlc3QKKyAqIEBSRUdfUkVRX0lOVEVSU0VDVDogdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHJlc3VsdGluZyBmcm9tIHRoaXMgcmVxdWVzdCBzaG91bGQKKyAqCWJlIGludGVyc2VjdGVkIHdpdGggdGhlIGN1cnJlbnQgb25lLgorICogQFJFR19SRVFfQUxSRUFEWV9TRVQ6IHRoZSByZWd1bGF0b3J5IHJlcXVlc3Qgd2lsbCBub3QgY2hhbmdlIHRoZSBjdXJyZW50CisgKglyZWd1bGF0b3J5IHNldHRpbmdzLCBhbmQgbm8gZnVydGhlciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLgorICogQFJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQ6IGEgbm9uIGFscGhhMiAgdXNlciBoaW50IHdhcyBoYW5kbGVkIGFuZCBubworICoJZnVydGhlciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLCBpLmUuLCBub3QgbmVlZCB0byB1cGRhdGUgbGFzdF9yZXF1ZXN0CisgKglldGMuIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIHVzZXIgaGludHMgdGhhdCBkbyBub3QgcHJvdmlkZSBhbiBhbHBoYTIKKyAqCWJ1dCBzb21lIG90aGVyIHR5cGUgb2YgcmVndWxhdG9yeSBoaW50LCBpLmUuLCBpbmRvb3Igb3BlcmF0aW9uLgorICovCiBlbnVtIHJlZ19yZXF1ZXN0X3RyZWF0bWVudCB7CiAJUkVHX1JFUV9PSywKIAlSRUdfUkVRX0lHTk9SRSwKIAlSRUdfUkVRX0lOVEVSU0VDVCwKIAlSRUdfUkVRX0FMUkVBRFlfU0VULAorCVJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCBjb3JlX3JlcXVlc3Rfd29ybGQgPSB7CkBAIC0xMDYsNiArMTIxLDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgcmVnX251bV9kZXZzX3N1cHBvcnRfYmFzZWhpbnQ7CiAKKy8qCisgKiBTdGF0ZSB2YXJpYWJsZSBpbmRpY2F0aW5nIGlmIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgZGV2aWNlcworICogYXJlIGF0dGFjaGVkIGlzIG9wZXJhdGluZyBpbiBhbiBpbmRvb3IgZW52aXJvbm1lbnQuIFRoZSBzdGF0ZSB2YXJpYWJsZQorICogaXMgcmVsZXZhbnQgZm9yIGFsbCByZWdpc3RlcmVkIGRldmljZXMuCisgKiAocHJvdGVjdGVkIGJ5IFJUTkwpCisgKi8KK3N0YXRpYyBib29sIHJlZ19pc19pbmRvb3I7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqZ2V0X2NmZzgwMjExX3JlZ2RvbSh2b2lkKQogewogCXJldHVybiBydG5sX2RlcmVmZXJlbmNlKGNmZzgwMjExX3JlZ2RvbWFpbik7CkBAIC0yNDAsOCArMjYzLDE2IEBACiBtb2R1bGVfcGFyYW0oaWVlZTgwMjExX3JlZ2RvbSwgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpZWVlODAyMTFfcmVnZG9tLCAiSUVFRSA4MDIuMTEgcmVndWxhdG9yeSBkb21haW4gY29kZSIpOwogCi1zdGF0aWMgdm9pZCByZWdfZnJlZV9yZXF1ZXN0KHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKmxyKQorc3RhdGljIHZvaWQgcmVnX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KQogeworCWlmIChyZXF1ZXN0ICE9IGdldF9sYXN0X3JlcXVlc3QoKSkKKwkJa2ZyZWUocmVxdWVzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ19mcmVlX2xhc3RfcmVxdWVzdCh2b2lkKQoreworCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKmxyID0gZ2V0X2xhc3RfcmVxdWVzdCgpOworCiAJaWYgKGxyICE9ICZjb3JlX3JlcXVlc3Rfd29ybGQgJiYgbHIpCiAJCWtmcmVlX3JjdShsciwgcmN1X2hlYWQpOwogfQpAQCAtMjU0LDcgKzI4NSw3IEBACiAJaWYgKGxyID09IHJlcXVlc3QpCiAJCXJldHVybjsKIAotCXJlZ19mcmVlX3JlcXVlc3QobHIpOworCXJlZ19mcmVlX2xhc3RfcmVxdWVzdCgpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihsYXN0X3JlcXVlc3QsIHJlcXVlc3QpOwogfQogCkBAIC04NzMsNiArOTA0LDggQEAKIAkJY2hhbm5lbF9mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUjsKIAlpZiAocmRfZmxhZ3MgJiBOTDgwMjExX1JSRl9OT19PRkRNKQogCQljaGFubmVsX2ZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PX09GRE07CisJaWYgKHJkX2ZsYWdzICYgTkw4MDIxMV9SUkZfTk9fT1VURE9PUikKKwkJY2hhbm5lbF9mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWTsKIAlyZXR1cm4gY2hhbm5lbF9mbGFnczsKIH0KIApAQCAtOTAyLDcgKzkzNSw3IEBACiAJCWlmICghYmFuZF9ydWxlX2ZvdW5kKQogCQkJYmFuZF9ydWxlX2ZvdW5kID0gZnJlcV9pbl9ydWxlX2JhbmQoZnIsIGNlbnRlcl9mcmVxKTsKIAotCQlid19maXRzID0gcmVnX2RvZXNfYndfZml0KGZyLCBjZW50ZXJfZnJlcSwgTUhaX1RPX0tIWigyMCkpOworCQlid19maXRzID0gcmVnX2RvZXNfYndfZml0KGZyLCBjZW50ZXJfZnJlcSwgTUhaX1RPX0tIWig1KSk7CiAKIAkJaWYgKGJhbmRfcnVsZV9mb3VuZCAmJiBid19maXRzKQogCQkJcmV0dXJuIHJyOwpAQCAtOTg2LDEwICsxMDE5LDEwIEBACiB9CiAjZW5kaWYKIAotLyoKLSAqIE5vdGUgdGhhdCByaWdodCBub3cgd2UgYXNzdW1lIHRoZSBkZXNpcmVkIGNoYW5uZWwgYmFuZHdpZHRoCi0gKiBpcyBhbHdheXMgMjAgTUh6IGZvciBlYWNoIGluZGl2aWR1YWwgY2hhbm5lbCAoSFQ0MCB1c2VzIDIwIE1IegotICogcGVyIGNoYW5uZWwsIHRoZSBwcmltYXJ5IGFuZCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwpLgorLyogRmluZCBhbiBpZWVlODAyMTFfcmVnX3J1bGUgc3VjaCB0aGF0IGEgNU1IeiBjaGFubmVsIHdpdGggZnJlcXVlbmN5CisgKiBjaGFuLT5jZW50ZXJfZnJlcSBmaXRzIHRoZXJlLgorICogSWYgdGhlcmUgaXMgbm8gc3VjaCByZWdfcnVsZSwgZGlzYWJsZSB0aGUgY2hhbm5lbCwgb3RoZXJ3aXNlIHNldCB0aGUKKyAqIGZsYWdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJhbmR3aWR0aHMgYWxsb3dlZCBpbiB0aGUgcGFydGljdWxhciByZWdfcnVsZQogICovCiBzdGF0aWMgdm9pZCBoYW5kbGVfY2hhbm5lbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJICAgZW51bSBubDgwMjExX3JlZ19pbml0aWF0b3IgaW5pdGlhdG9yLApAQCAtMTA1MCw4ICsxMDgzLDEyIEBACiAJaWYgKHJlZ19ydWxlLT5mbGFncyAmIE5MODAyMTFfUlJGX0FVVE9fQlcpCiAJCW1heF9iYW5kd2lkdGhfa2h6ID0gcmVnX2dldF9tYXhfYmFuZHdpZHRoKHJlZ2QsIHJlZ19ydWxlKTsKIAorCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooMTApKQorCQlid19mbGFncyA9IElFRUU4MDIxMV9DSEFOX05PXzEwTUhaOworCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooMjApKQorCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT18yME1IWjsKIAlpZiAobWF4X2JhbmR3aWR0aF9raHogPCBNSFpfVE9fS0haKDQwKSkKLQkJYndfZmxhZ3MgPSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOworCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOwogCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooODApKQogCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT184ME1IWjsKIAlpZiAobWF4X2JhbmR3aWR0aF9raHogPCBNSFpfVE9fS0haKDE2MCkpCkBAIC0xMDcxLDYgKzExMDgsMTMgQEAKIAkJCShpbnQpIE1CSV9UT19EQkkocG93ZXJfcnVsZS0+bWF4X2FudGVubmFfZ2Fpbik7CiAJCWNoYW4tPm1heF9yZWdfcG93ZXIgPSBjaGFuLT5tYXhfcG93ZXIgPSBjaGFuLT5vcmlnX21wd3IgPQogCQkJKGludCkgTUJNX1RPX0RCTShwb3dlcl9ydWxlLT5tYXhfZWlycCk7CisKKwkJaWYgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpIHsKKwkJCWNoYW4tPmRmc19jYWNfbXMgPSBJRUVFODAyMTFfREZTX01JTl9DQUNfVElNRV9NUzsKKwkJCWlmIChyZWdfcnVsZS0+ZGZzX2NhY19tcykKKwkJCQljaGFuLT5kZnNfY2FjX21zID0gcmVnX3J1bGUtPmRmc19jYWNfbXM7CisJCX0KKwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTI2LDEyICsxMTcwLDE5IEBACiAJcmV0dXJuIHJlcXVlc3QtPnVzZXJfcmVnX2hpbnRfdHlwZSA9PSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfQ0VMTF9CQVNFOwogfQogCitzdGF0aWMgYm9vbCByZWdfcmVxdWVzdF9pbmRvb3Ioc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlpZiAocmVxdWVzdC0+aW5pdGlhdG9yICE9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHJlcXVlc3QtPnVzZXJfcmVnX2hpbnRfdHlwZSA9PSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfSU5ET09SOworfQorCiBib29sIHJlZ19sYXN0X3JlcXVlc3RfY2VsbF9iYXNlKHZvaWQpCiB7CiAJcmV0dXJuIHJlZ19yZXF1ZXN0X2NlbGxfYmFzZShnZXRfbGFzdF9yZXF1ZXN0KCkpOwogfQogCi0jaWZkZWYgQ09ORklHX0NGRzgwMjExX0NFUlRJRklDQVRJT05fT05VUworI2lmZGVmIENPTkZJR19DRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFMKIC8qIENvcmUgc3BlY2lmaWMgY2hlY2sgKi8KIHN0YXRpYyBlbnVtIHJlZ19yZXF1ZXN0X3RyZWF0bWVudAogcmVnX2lnbm9yZV9jZWxsX2hpbnQoc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcGVuZGluZ19yZXF1ZXN0KQpAQCAtMTQ3MSw4ICsxNTIyLDEyIEBACiAJaWYgKHJlZ19ydWxlLT5mbGFncyAmIE5MODAyMTFfUlJGX0FVVE9fQlcpCiAJCW1heF9iYW5kd2lkdGhfa2h6ID0gcmVnX2dldF9tYXhfYmFuZHdpZHRoKHJlZ2QsIHJlZ19ydWxlKTsKIAorCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooMTApKQorCQlid19mbGFncyA9IElFRUU4MDIxMV9DSEFOX05PXzEwTUhaOworCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooMjApKQorCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT18yME1IWjsKIAlpZiAobWF4X2JhbmR3aWR0aF9raHogPCBNSFpfVE9fS0haKDQwKSkKLQkJYndfZmxhZ3MgPSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOworCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOwogCWlmIChtYXhfYmFuZHdpZHRoX2toeiA8IE1IWl9UT19LSFooODApKQogCQlid19mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT184ME1IWjsKIAlpZiAobWF4X2JhbmR3aWR0aF9raHogPCBNSFpfVE9fS0haKDE2MCkpCkBAIC0xNTY4LDYgKzE2MjMsMTEgQEAKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpsciA9IGdldF9sYXN0X3JlcXVlc3QoKTsKIAorCWlmIChyZWdfcmVxdWVzdF9pbmRvb3IodXNlcl9yZXF1ZXN0KSkgeworCQlyZWdfaXNfaW5kb29yID0gdHJ1ZTsKKwkJcmV0dXJuIFJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQ7CisJfQorCiAJaWYgKHJlZ19yZXF1ZXN0X2NlbGxfYmFzZSh1c2VyX3JlcXVlc3QpKQogCQlyZXR1cm4gcmVnX2lnbm9yZV9jZWxsX2hpbnQodXNlcl9yZXF1ZXN0KTsKIApAQCAtMTYxNSw4ICsxNjc1LDkgQEAKIAogCXRyZWF0bWVudCA9IF9fcmVnX3Byb2Nlc3NfaGludF91c2VyKHVzZXJfcmVxdWVzdCk7CiAJaWYgKHRyZWF0bWVudCA9PSBSRUdfUkVRX0lHTk9SRSB8fAotCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9BTFJFQURZX1NFVCkgewotCQlrZnJlZSh1c2VyX3JlcXVlc3QpOworCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9BTFJFQURZX1NFVCB8fAorCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRCkgeworCQlyZWdfZnJlZV9yZXF1ZXN0KHVzZXJfcmVxdWVzdCk7CiAJCXJldHVybiB0cmVhdG1lbnQ7CiAJfQogCkBAIC0xNjc2LDE0ICsxNzM3LDE1IEBACiAJY2FzZSBSRUdfUkVRX09LOgogCQlicmVhazsKIAljYXNlIFJFR19SRVFfSUdOT1JFOgotCQlrZnJlZShkcml2ZXJfcmVxdWVzdCk7CisJY2FzZSBSRUdfUkVRX1VTRVJfSElOVF9IQU5ETEVEOgorCQlyZWdfZnJlZV9yZXF1ZXN0KGRyaXZlcl9yZXF1ZXN0KTsKIAkJcmV0dXJuIHRyZWF0bWVudDsKIAljYXNlIFJFR19SRVFfSU5URVJTRUNUOgogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFJFR19SRVFfQUxSRUFEWV9TRVQ6CiAJCXJlZ2QgPSByZWdfY29weV9yZWdkKGdldF9jZmc4MDIxMV9yZWdkb20oKSk7CiAJCWlmIChJU19FUlIocmVnZCkpIHsKLQkJCWtmcmVlKGRyaXZlcl9yZXF1ZXN0KTsKKwkJCXJlZ19mcmVlX3JlcXVlc3QoZHJpdmVyX3JlcXVlc3QpOwogCQkJcmV0dXJuIFJFR19SRVFfSUdOT1JFOwogCQl9CiAJCXJjdV9hc3NpZ25fcG9pbnRlcih3aXBoeS0+cmVnZCwgcmVnZCk7CkBAIC0xNzc1LDEyICsxODM3LDEzIEBACiAJY2FzZSBSRUdfUkVRX09LOgogCQlicmVhazsKIAljYXNlIFJFR19SRVFfSUdOT1JFOgorCWNhc2UgUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRDoKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBSRUdfUkVRX0FMUkVBRFlfU0VUOgotCQlrZnJlZShjb3VudHJ5X2llX3JlcXVlc3QpOworCQlyZWdfZnJlZV9yZXF1ZXN0KGNvdW50cnlfaWVfcmVxdWVzdCk7CiAJCXJldHVybiB0cmVhdG1lbnQ7CiAJY2FzZSBSRUdfUkVRX0lOVEVSU0VDVDoKLQkJa2ZyZWUoY291bnRyeV9pZV9yZXF1ZXN0KTsKKwkJcmVnX2ZyZWVfcmVxdWVzdChjb3VudHJ5X2llX3JlcXVlc3QpOwogCQkvKgogCQkgKiBUaGlzIGRvZXNuJ3QgaGFwcGVuIHlldCwgbm90IHN1cmUgd2UKIAkJICogZXZlciB3YW50IHRvIHN1cHBvcnQgaXQgZm9yIHRoaXMgY2FzZS4KQEAgLTE4MTMsNyArMTg3Niw4IEBACiAJY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUjoKIAkJdHJlYXRtZW50ID0gcmVnX3Byb2Nlc3NfaGludF91c2VyKHJlZ19yZXF1ZXN0KTsKIAkJaWYgKHRyZWF0bWVudCA9PSBSRUdfUkVRX0lHTk9SRSB8fAotCQkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfQUxSRUFEWV9TRVQpCisJCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9BTFJFQURZX1NFVCB8fAorCQkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQpCiAJCQlyZXR1cm47CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAogCQkJCSAgICZyZWdfdGltZW91dCwgbXNlY3NfdG9famlmZmllcygzMTQyKSk7CkBAIC0xODQxLDcgKzE5MDUsNyBAQAogCXJldHVybjsKIAogb3V0X2ZyZWU6Ci0Ja2ZyZWUocmVnX3JlcXVlc3QpOworCXJlZ19mcmVlX3JlcXVlc3QocmVnX3JlcXVlc3QpOwogfQogCiAvKgpAQCAtMTg1Nyw3ICsxOTIxLDcgQEAKIAogCS8qIFdoZW4gbGFzdF9yZXF1ZXN0LT5wcm9jZXNzZWQgYmVjb21lcyB0cnVlIHRoaXMgd2lsbCBiZSByZXNjaGVkdWxlZCAqLwogCWlmIChsciAmJiAhbHItPnByb2Nlc3NlZCkgewotCQlSRUdfREJHX1BSSU5UKCJQZW5kaW5nIHJlZ3VsYXRvcnkgcmVxdWVzdCwgd2FpdGluZyBmb3IgaXQgdG8gYmUgcHJvY2Vzc2VkLi4uXG4iKTsKKwkJcmVnX3Byb2Nlc3NfaGludChscik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE5NjcsNiArMjAzMSwyMiBAQAogCXJldHVybiAwOwogfQogCitpbnQgcmVndWxhdG9yeV9oaW50X2luZG9vcl91c2VyKHZvaWQpCit7CisJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdDsKKworCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QtPndpcGh5X2lkeCA9IFdJUEhZX0lEWF9JTlZBTElEOworCXJlcXVlc3QtPmluaXRpYXRvciA9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSOworCXJlcXVlc3QtPnVzZXJfcmVnX2hpbnRfdHlwZSA9IE5MODAyMTFfVVNFUl9SRUdfSElOVF9JTkRPT1I7CisJcXVldWVfcmVndWxhdG9yeV9yZXF1ZXN0KHJlcXVlc3QpOworCisJcmV0dXJuIDA7Cit9CisKIC8qIERyaXZlciBoaW50cyAqLwogaW50IHJlZ3VsYXRvcnlfaGludChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICphbHBoYTIpCiB7CkBAIC0yMTM0LDYgKzIyMTQsOCBAQAogCiAJQVNTRVJUX1JUTkwoKTsKIAorCXJlZ19pc19pbmRvb3IgPSBmYWxzZTsKKwogCXJlc2V0X3JlZ2RvbWFpbnModHJ1ZSwgJndvcmxkX3JlZ2RvbSk7CiAJcmVzdG9yZV9hbHBoYTIoYWxwaGEyLCByZXNldF91c2VyKTsKIApAQCAtMjU5NCw3ICsyNjc2LDcgQEAKIAkJcmVnX251bV9kZXZzX3N1cHBvcnRfYmFzZWhpbnQtLTsKIAogCXJjdV9mcmVlX3JlZ2RvbShnZXRfd2lwaHlfcmVnZG9tKHdpcGh5KSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHdpcGh5LT5yZWdkLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKHdpcGh5LT5yZWdkLCBOVUxMKTsKIAogCWlmIChscikKIAkJcmVxdWVzdF93aXBoeSA9IHdpcGh5X2lkeF90b193aXBoeShsci0+d2lwaHlfaWR4KTsKQEAgLTI2MTQsNiArMjY5Niw0MCBAQAogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKKy8qCisgKiBTZWUgaHR0cDovL3d3dy5mY2MuZ292L2RvY3VtZW50LzUtZ2h6LXVubGljZW5zZWQtc3BlY3RydW0tdW5paSwgZm9yCisgKiBVTklJIGJhbmQgZGVmaW5pdGlvbnMKKyAqLworaW50IGNmZzgwMjExX2dldF91bmlpKGludCBmcmVxKQoreworCS8qIFVOSUktMSAqLworCWlmIChmcmVxID49IDUxNTAgJiYgZnJlcSA8PSA1MjUwKQorCQlyZXR1cm4gMDsKKworCS8qIFVOSUktMkEgKi8KKwlpZiAoZnJlcSA+IDUyNTAgJiYgZnJlcSA8PSA1MzUwKQorCQlyZXR1cm4gMTsKKworCS8qIFVOSUktMkIgKi8KKwlpZiAoZnJlcSA+IDUzNTAgJiYgZnJlcSA8PSA1NDcwKQorCQlyZXR1cm4gMjsKKworCS8qIFVOSUktMkMgKi8KKwlpZiAoZnJlcSA+IDU0NzAgJiYgZnJlcSA8PSA1NzI1KQorCQlyZXR1cm4gMzsKKworCS8qIFVOSUktMyAqLworCWlmIChmcmVxID4gNTcyNSAmJiBmcmVxIDw9IDU4MjUpCisJCXJldHVybiA0OworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2Jvb2wgcmVndWxhdG9yeV9pbmRvb3JfYWxsb3dlZCh2b2lkKQoreworCXJldHVybiByZWdfaXNfaW5kb29yOworfQorCiBpbnQgX19pbml0IHJlZ3VsYXRvcnlfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5oIGIvbmV0L3dpcmVsZXNzL3JlZy5oCmluZGV4IDM3YzE4MGQuLjVlNDgwMzFjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmVnLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JlZy5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGludCByZWd1bGF0b3J5X2hpbnRfdXNlcihjb25zdCBjaGFyICphbHBoYTIsCiAJCQkgZW51bSBubDgwMjExX3VzZXJfcmVnX2hpbnRfdHlwZSB1c2VyX3JlZ19oaW50X3R5cGUpOworaW50IHJlZ3VsYXRvcnlfaGludF9pbmRvb3JfdXNlcih2b2lkKTsKIAogdm9pZCB3aXBoeV9yZWd1bGF0b3J5X3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwogdm9pZCB3aXBoeV9yZWd1bGF0b3J5X2RlcmVnaXN0ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSk7CkBAIC0xMDQsNCArMTA1LDIxIEBACiAgKi8KIHZvaWQgcmVndWxhdG9yeV9oaW50X2Rpc2Nvbm5lY3Qodm9pZCk7CiAKKy8qKgorICogY2ZnODAyMTFfZ2V0X3VuaWkgLSBnZXQgdGhlIFUtTklJIGJhbmQgZm9yIHRoZSBmcmVxdWVuY3kKKyAqIEBmcmVxOiB0aGUgZnJlcXVlbmN5IGZvciB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgVU5JSSBiYW5kLgorCisgKiBHZXQgYSB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBVLU5JSSBiYW5kIGZyZXF1ZW5jeSBiZWxvbmdzIHRvLgorICogVS1OSUkgYmFuZHMgYXJlIGRlZmluZWQgYnkgdGhlIEZDQyBpbiBDLkYuUiA0NyBwYXJ0IDE1LgorICoKKyAqIFJldHVybnMgLUVJTlZBTCBpZiBmcmVxIGlzIGludmFsaWQsIDAgZm9yIFVOSUktMSwgMSBmb3IgVU5JSS0yQSwKKyAqIDIgZm9yIFVOSUktMkIsIDMgZm9yIFVOSUktMkMgYW5kIDQgZm9yIFVOSUktMy4KKyAqLworaW50IGNmZzgwMjExX2dldF91bmlpKGludCBmcmVxKTsKKworLyoqCisgKiByZWd1bGF0b3J5X2luZG9vcl9hbGxvd2VkIC0gaXMgaW5kb29yIG9wZXJhdGlvbiBhbGxvd2VkCisgKi8KK2Jvb2wgcmVndWxhdG9yeV9pbmRvb3JfYWxsb3dlZCh2b2lkKTsKKwogI2VuZGlmICAvKiBfX05FVF9XSVJFTEVTU19SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NjYW4uYyBiL25ldC93aXJlbGVzcy9zY2FuLmMKaW5kZXggODhmMTA4ZS4uMDc5OGM2MiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NjYW4uYworKysgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCkBAIC04MSwxMCArODEsMTAgQEAKIAlrZnJlZShic3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnNzX3JlZl9nZXQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW5saW5lIHZvaWQgYnNzX3JlZl9nZXQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzcykKIHsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkZXYtPmJzc19sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZyZGV2LT5ic3NfbG9jayk7CiAKIAlic3MtPnJlZmNvdW50Kys7CiAJaWYgKGJzcy0+cHViLmhpZGRlbl9iZWFjb25fYnNzKSB7CkBAIC05NSwxMCArOTUsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBic3NfcmVmX3B1dChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBic3NfcmVmX3B1dChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzKQogewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmRldi0+YnNzX2xvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJkZXYtPmJzc19sb2NrKTsKIAogCWlmIChic3MtPnB1Yi5oaWRkZW5fYmVhY29uX2JzcykgewogCQlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpoYnNzOwpAQCAtMTE0LDEwICsxMTQsMTAgQEAKIAkJYnNzX2ZyZWUoYnNzKTsKIH0KIAotc3RhdGljIGJvb2wgX19jZmc4MDIxMV91bmxpbmtfYnNzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2LAorc3RhdGljIGJvb2wgX19jZmc4MDIxMV91bmxpbmtfYnNzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCQkgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzcykKIHsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkZXYtPmJzc19sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZyZGV2LT5ic3NfbG9jayk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmJzcy0+aGlkZGVuX2xpc3QpKSB7CiAJCS8qCkBAIC0xMzQsMzEgKzEzNCwzMSBAQAogCX0KIAogCWxpc3RfZGVsX2luaXQoJmJzcy0+bGlzdCk7Ci0JcmJfZXJhc2UoJmJzcy0+cmJuLCAmZGV2LT5ic3NfdHJlZSk7Ci0JYnNzX3JlZl9wdXQoZGV2LCBic3MpOworCXJiX2VyYXNlKCZic3MtPnJibiwgJnJkZXYtPmJzc190cmVlKTsKKwlic3NfcmVmX3B1dChyZGV2LCBic3MpOwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBfX2NmZzgwMjExX2Jzc19leHBpcmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBfX2NmZzgwMjExX2Jzc19leHBpcmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJCSAgdW5zaWduZWQgbG9uZyBleHBpcmVfdGltZSkKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpic3MsICp0bXA7CiAJYm9vbCBleHBpcmVkID0gZmFsc2U7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkZXYtPmJzc19sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZyZGV2LT5ic3NfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnNzLCB0bXAsICZkZXYtPmJzc19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJzcywgdG1wLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZic3MtPmhvbGQpKQogCQkJY29udGludWU7CiAJCWlmICghdGltZV9hZnRlcihleHBpcmVfdGltZSwgYnNzLT50cykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoX19jZmc4MDIxMV91bmxpbmtfYnNzKGRldiwgYnNzKSkKKwkJaWYgKF9fY2ZnODAyMTFfdW5saW5rX2JzcyhyZGV2LCBic3MpKQogCQkJZXhwaXJlZCA9IHRydWU7CiAJfQogCiAJaWYgKGV4cGlyZWQpCi0JCWRldi0+YnNzX2dlbmVyYXRpb24rKzsKKwkJcmRldi0+YnNzX2dlbmVyYXRpb24rKzsKIH0KIAogdm9pZCBfX19jZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApAQCAtMjM4LDExICsyMzgsMTEgQEAKIHZvaWQgY2ZnODAyMTFfc2Nhbl9kb25lKHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYWJvcnRlZCkKIHsKIAl0cmFjZV9jZmc4MDIxMV9zY2FuX2RvbmUocmVxdWVzdCwgYWJvcnRlZCk7Ci0JV0FSTl9PTihyZXF1ZXN0ICE9IHdpcGh5X3RvX2RldihyZXF1ZXN0LT53aXBoeSktPnNjYW5fcmVxKTsKKwlXQVJOX09OKHJlcXVlc3QgIT0gd2lwaHlfdG9fcmRldihyZXF1ZXN0LT53aXBoeSktPnNjYW5fcmVxKTsKIAogCXJlcXVlc3QtPmFib3J0ZWQgPSBhYm9ydGVkOwogCXJlcXVlc3QtPm5vdGlmaWVkID0gdHJ1ZTsKLQlxdWV1ZV93b3JrKGNmZzgwMjExX3dxLCAmd2lwaHlfdG9fZGV2KHJlcXVlc3QtPndpcGh5KS0+c2Nhbl9kb25lX3drKTsKKwlxdWV1ZV93b3JrKGNmZzgwMjExX3dxLCAmd2lwaHlfdG9fcmRldihyZXF1ZXN0LT53aXBoeSktPnNjYW5fZG9uZV93ayk7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3NjYW5fZG9uZSk7CiAKQEAgLTI3OCwxNSArMjc4LDE1IEBACiB7CiAJdHJhY2VfY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKHdpcGh5KTsKIAkvKiBpZ25vcmUgaWYgd2UncmUgbm90IHNjYW5uaW5nICovCi0JaWYgKHdpcGh5X3RvX2Rldih3aXBoeSktPnNjaGVkX3NjYW5fcmVxKQorCWlmICh3aXBoeV90b19yZGV2KHdpcGh5KS0+c2NoZWRfc2Nhbl9yZXEpCiAJCXF1ZXVlX3dvcmsoY2ZnODAyMTFfd3EsCi0JCQkgICAmd2lwaHlfdG9fZGV2KHdpcGh5KS0+c2NoZWRfc2Nhbl9yZXN1bHRzX3drKTsKKwkJCSAgICZ3aXBoeV90b19yZGV2KHdpcGh5KS0+c2NoZWRfc2Nhbl9yZXN1bHRzX3drKTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKTsKIAogdm9pZCBjZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWRfcnRubChzdHJ1Y3Qgd2lwaHkgKndpcGh5KQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAKIAlBU1NFUlRfUlROTCgpOwogCkBAIC0zMzAsMjEgKzMzMCwyMSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGNmZzgwMjExX2Jzc19hZ2Uoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCit2b2lkIGNmZzgwMjExX2Jzc19hZ2Uoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWdlX3NlY3MpCiB7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzOwogCXVuc2lnbmVkIGxvbmcgYWdlX2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKGFnZV9zZWNzICogTVNFQ19QRVJfU0VDKTsKIAotCXNwaW5fbG9ja19iaCgmZGV2LT5ic3NfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShic3MsICZkZXYtPmJzc19saXN0LCBsaXN0KQorCXNwaW5fbG9ja19iaCgmcmRldi0+YnNzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpCiAJCWJzcy0+dHMgLT0gYWdlX2ppZmZpZXM7Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiB9CiAKLXZvaWQgY2ZnODAyMTFfYnNzX2V4cGlyZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldikKK3ZvaWQgY2ZnODAyMTFfYnNzX2V4cGlyZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpCiB7Ci0JX19jZmc4MDIxMV9ic3NfZXhwaXJlKGRldiwgamlmZmllcyAtIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUpOworCV9fY2ZnODAyMTFfYnNzX2V4cGlyZShyZGV2LCBqaWZmaWVzIC0gSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSk7CiB9CiAKIGNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbikKQEAgLTUzNCwzMiArNTM0LDM0IEBACiAJCQkJICAgICAgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJCQkgICAgICB1MTYgY2FwYV9tYXNrLCB1MTYgY2FwYV92YWwpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzcywgKnJlcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCiAJdHJhY2VfY2ZnODAyMTFfZ2V0X2Jzcyh3aXBoeSwgY2hhbm5lbCwgYnNzaWQsIHNzaWQsIHNzaWRfbGVuLCBjYXBhX21hc2ssCiAJCQkgICAgICAgY2FwYV92YWwpOwogCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmZGV2LT5ic3NfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpIHsKIAkJaWYgKChic3MtPnB1Yi5jYXBhYmlsaXR5ICYgY2FwYV9tYXNrKSAhPSBjYXBhX3ZhbCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoY2hhbm5lbCAmJiBic3MtPnB1Yi5jaGFubmVsICE9IGNoYW5uZWwpCiAJCQljb250aW51ZTsKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGJzcy0+cHViLmJzc2lkKSkKKwkJCWNvbnRpbnVlOwogCQkvKiBEb24ndCBnZXQgZXhwaXJlZCBCU1Mgc3RydWN0cyAqLwogCQlpZiAodGltZV9hZnRlcihub3csIGJzcy0+dHMgKyBJRUVFODAyMTFfU0NBTl9SRVNVTFRfRVhQSVJFKSAmJgogCQkgICAgIWF0b21pY19yZWFkKCZic3MtPmhvbGQpKQogCQkJY29udGludWU7CiAJCWlmIChpc19ic3MoJmJzcy0+cHViLCBic3NpZCwgc3NpZCwgc3NpZF9sZW4pKSB7CiAJCQlyZXMgPSBic3M7Ci0JCQlic3NfcmVmX2dldChkZXYsIHJlcyk7CisJCQlic3NfcmVmX2dldChyZGV2LCByZXMpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19iaCgmZGV2LT5ic3NfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIE5VTEw7CiAJdHJhY2VfY2ZnODAyMTFfcmV0dXJuX2JzcygmcmVzLT5wdWIpOwpAQCAtNTY3LDEwICs1NjksMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfZ2V0X2Jzcyk7CiAKLXN0YXRpYyB2b2lkIHJiX2luc2VydF9ic3Moc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCByYl9pbnNlcnRfYnNzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzKQogewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZkZXYtPmJzc190cmVlLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJkZXYtPmJzc190cmVlLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqdGJzczsKIAlpbnQgY21wOwpAQCAtNTkzLDE1ICs1OTUsMTUgQEAKIAl9CiAKIAlyYl9saW5rX25vZGUoJmJzcy0+cmJuLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmYnNzLT5yYm4sICZkZXYtPmJzc190cmVlKTsKKwlyYl9pbnNlcnRfY29sb3IoJmJzcy0+cmJuLCAmcmRldi0+YnNzX3RyZWUpOwogfQogCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqCi1yYl9maW5kX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKK3JiX2ZpbmRfYnNzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkgICAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqcmVzLAogCSAgICBlbnVtIGJzc19jb21wYXJlX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IGRldi0+YnNzX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJkZXYtPmJzc190cmVlLnJiX25vZGU7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzOwogCWludCByOwogCkBAIC02MjAsNyArNjIyLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgY2ZnODAyMTFfY29tYmluZV9ic3NlcyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKK3N0YXRpYyBib29sIGNmZzgwMjExX2NvbWJpbmVfYnNzZXMoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKm5ldykKIHsKIAljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYnNzX2llcyAqaWVzOwpAQCAtNjUwLDcgKzY1Miw3IEBACiAKIAkvKiBUaGlzIGlzIHRoZSBiYWQgcGFydCAuLi4gKi8KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmZGV2LT5ic3NfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGJzcy0+cHViLmJzc2lkLCBuZXctPnB1Yi5ic3NpZCkpCiAJCQljb250aW51ZTsKIAkJaWYgKGJzcy0+cHViLmNoYW5uZWwgIT0gbmV3LT5wdWIuY2hhbm5lbCkKQEAgLTY4NCw3ICs2ODYsNyBAQAogCiAvKiBSZXR1cm5lZCBic3MgaXMgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIG11c3QgYmUgY2xlYW5lZCB1cCBhcHByb3ByaWF0ZWx5LiAqLwogc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKgotY2ZnODAyMTFfYnNzX3VwZGF0ZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKK2NmZzgwMjExX2Jzc191cGRhdGUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkgICAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqdG1wLAogCQkgICAgYm9vbCBzaWduYWxfdmFsaWQpCiB7CkBAIC02OTUsMTQgKzY5NywxNCBAQAogCiAJdG1wLT50cyA9IGppZmZpZXM7CiAKLQlzcGluX2xvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fbG9ja19iaCgmcmRldi0+YnNzX2xvY2spOwogCiAJaWYgKFdBUk5fT04oIXJjdV9hY2Nlc3NfcG9pbnRlcih0bXAtPnB1Yi5pZXMpKSkgewotCQlzcGluX3VubG9ja19iaCgmZGV2LT5ic3NfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWZvdW5kID0gcmJfZmluZF9ic3MoZGV2LCB0bXAsIEJTU19DTVBfUkVHVUxBUik7CisJZm91bmQgPSByYl9maW5kX2JzcyhyZGV2LCB0bXAsIEJTU19DTVBfUkVHVUxBUik7CiAKIAlpZiAoZm91bmQpIHsKIAkJLyogVXBkYXRlIElFcyAqLwpAQCAtNzg5LDcgKzc5MSw3IEBACiAJCSAqIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgc2luY2UgaXQncyBub3QgbmVlZGVkIGluIHRoZQogCQkgKiBtb3JlIGNvbW1vbiBjYXNlIG9mIGFuIHVwZGF0ZQogCQkgKi8KLQkJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgKyBkZXYtPndpcGh5LmJzc19wcml2X3NpemUsCisJCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpICsgcmRldi0+d2lwaHkuYnNzX3ByaXZfc2l6ZSwKIAkJCSAgICAgIEdGUF9BVE9NSUMpOwogCQlpZiAoIW5ldykgewogCQkJaWVzID0gKHZvaWQgKilyY3VfZGVyZWZlcmVuY2UodG1wLT5wdWIuYmVhY29uX2llcyk7CkBAIC04MDUsOSArODA3LDkgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJm5ldy0+aGlkZGVuX2xpc3QpOwogCiAJCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIodG1wLT5wdWIucHJvYmVyZXNwX2llcykpIHsKLQkJCWhpZGRlbiA9IHJiX2ZpbmRfYnNzKGRldiwgdG1wLCBCU1NfQ01QX0hJREVfWkxFTik7CisJCQloaWRkZW4gPSByYl9maW5kX2JzcyhyZGV2LCB0bXAsIEJTU19DTVBfSElERV9aTEVOKTsKIAkJCWlmICghaGlkZGVuKQotCQkJCWhpZGRlbiA9IHJiX2ZpbmRfYnNzKGRldiwgdG1wLAorCQkJCWhpZGRlbiA9IHJiX2ZpbmRfYnNzKHJkZXYsIHRtcCwKIAkJCQkJCSAgICAgQlNTX0NNUF9ISURFX05VTCk7CiAJCQlpZiAoaGlkZGVuKSB7CiAJCQkJbmV3LT5wdWIuaGlkZGVuX2JlYWNvbl9ic3MgPSAmaGlkZGVuLT5wdWI7CkBAIC04MjQsMjQgKzgyNiwyNCBAQAogCQkJICogZXhwZW5zaXZlIHNlYXJjaCBmb3IgYW55IHByb2JlIHJlc3BvbnNlcyB0aGF0IHNob3VsZAogCQkJICogYmUgZ3JvdXBlZCB3aXRoIHRoaXMgYmVhY29uIGZvciB1cGRhdGVzIC4uLgogCQkJICovCi0JCQlpZiAoIWNmZzgwMjExX2NvbWJpbmVfYnNzZXMoZGV2LCBuZXcpKSB7CisJCQlpZiAoIWNmZzgwMjExX2NvbWJpbmVfYnNzZXMocmRldiwgbmV3KSkgewogCQkJCWtmcmVlKG5ldyk7CiAJCQkJZ290byBkcm9wOwogCQkJfQogCQl9CiAKLQkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmZGV2LT5ic3NfbGlzdCk7Ci0JCXJiX2luc2VydF9ic3MoZGV2LCBuZXcpOworCQlsaXN0X2FkZF90YWlsKCZuZXctPmxpc3QsICZyZGV2LT5ic3NfbGlzdCk7CisJCXJiX2luc2VydF9ic3MocmRldiwgbmV3KTsKIAkJZm91bmQgPSBuZXc7CiAJfQogCi0JZGV2LT5ic3NfZ2VuZXJhdGlvbisrOwotCWJzc19yZWZfZ2V0KGRldiwgZm91bmQpOwotCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKKwlyZGV2LT5ic3NfZ2VuZXJhdGlvbisrOworCWJzc19yZWZfZ2V0KHJkZXYsIGZvdW5kKTsKKwlzcGluX3VubG9ja19iaCgmcmRldi0+YnNzX2xvY2spOwogCiAJcmV0dXJuIGZvdW5kOwogIGRyb3A6Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTg4OSw2ICs4OTEsNyBAQAogCXN0cnVjdCBjZmc4MDIxMV9ic3NfaWVzICppZXM7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwogCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgdG1wID0ge30sICpyZXM7CisJYm9vbCBzaWduYWxfdmFsaWQ7CiAKIAlpZiAoV0FSTl9PTighd2lwaHkpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTkyNSw4ICs5MjgsOSBAQAogCXJjdV9hc3NpZ25fcG9pbnRlcih0bXAucHViLmJlYWNvbl9pZXMsIGllcyk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKHRtcC5wdWIuaWVzLCBpZXMpOwogCi0JcmVzID0gY2ZnODAyMTFfYnNzX3VwZGF0ZSh3aXBoeV90b19kZXYod2lwaHkpLCAmdG1wLAotCQkJCSAgcnhfY2hhbm5lbCA9PSBjaGFubmVsKTsKKwlzaWduYWxfdmFsaWQgPSBhYnMocnhfY2hhbm5lbC0+Y2VudGVyX2ZyZXEgLSBjaGFubmVsLT5jZW50ZXJfZnJlcSkgPD0KKwkJd2lwaHktPm1heF9hZGpfY2hhbm5lbF9yc3NpX2NvbXA7CisJcmVzID0gY2ZnODAyMTFfYnNzX3VwZGF0ZSh3aXBoeV90b19yZGV2KHdpcGh5KSwgJnRtcCwgc2lnbmFsX3ZhbGlkKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTk1MCw2ICs5NTQsNyBAQAogCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgdG1wID0ge30sICpyZXM7CiAJc3RydWN0IGNmZzgwMjExX2Jzc19pZXMgKmllczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJYm9vbCBzaWduYWxfdmFsaWQ7CiAJc2l6ZV90IGllbGVuID0gbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAogCQkJCSAgICAgIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7CiAKQEAgLTk5Nyw4ICsxMDAyLDkgQEAKIAl0bXAucHViLmJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KG1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50KTsKIAl0bXAucHViLmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7CiAKLQlyZXMgPSBjZmc4MDIxMV9ic3NfdXBkYXRlKHdpcGh5X3RvX2Rldih3aXBoeSksICZ0bXAsCi0JCQkJICByeF9jaGFubmVsID09IGNoYW5uZWwpOworCXNpZ25hbF92YWxpZCA9IGFicyhyeF9jaGFubmVsLT5jZW50ZXJfZnJlcSAtIGNoYW5uZWwtPmNlbnRlcl9mcmVxKSA8PQorCQl3aXBoeS0+bWF4X2Fkal9jaGFubmVsX3Jzc2lfY29tcDsKKwlyZXMgPSBjZmc4MDIxMV9ic3NfdXBkYXRlKHdpcGh5X3RvX3JkZXYod2lwaHkpLCAmdG1wLCBzaWduYWxfdmFsaWQpOwogCWlmICghcmVzKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTAxMyw3ICsxMDE5LDcgQEAKIAogdm9pZCBjZmc4MDIxMV9yZWZfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBjZmc4MDIxMV9ic3MgKnB1YikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzOwogCiAJaWYgKCFwdWIpCkBAIC0xMDIxLDE1ICsxMDI3LDE1IEBACiAKIAlic3MgPSBjb250YWluZXJfb2YocHViLCBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzLCBwdWIpOwogCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKLQlic3NfcmVmX2dldChkZXYsIGJzcyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fbG9ja19iaCgmcmRldi0+YnNzX2xvY2spOworCWJzc19yZWZfZ2V0KHJkZXYsIGJzcyk7CisJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfcmVmX2Jzcyk7CiAKIHZvaWQgY2ZnODAyMTFfcHV0X2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpwdWIpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzczsKIAogCWlmICghcHViKQpAQCAtMTAzNywxNSArMTA0MywxNSBAQAogCiAJYnNzID0gY29udGFpbmVyX29mKHB1Yiwgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcywgcHViKTsKIAotCXNwaW5fbG9ja19iaCgmZGV2LT5ic3NfbG9jayk7Ci0JYnNzX3JlZl9wdXQoZGV2LCBic3MpOwotCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKKwlic3NfcmVmX3B1dChyZGV2LCBic3MpOworCXNwaW5fdW5sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3B1dF9ic3MpOwogCiB2b2lkIGNmZzgwMjExX3VubGlua19ic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGNmZzgwMjExX2JzcyAqcHViKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpic3M7CiAKIAlpZiAoV0FSTl9PTighcHViKSkKQEAgLTEwNTMsMTIgKzEwNTksMTIgQEAKIAogCWJzcyA9IGNvbnRhaW5lcl9vZihwdWIsIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MsIHB1Yik7CiAKLQlzcGluX2xvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fbG9ja19iaCgmcmRldi0+YnNzX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmYnNzLT5saXN0KSkgewotCQlpZiAoX19jZmc4MDIxMV91bmxpbmtfYnNzKGRldiwgYnNzKSkKLQkJCWRldi0+YnNzX2dlbmVyYXRpb24rKzsKKwkJaWYgKF9fY2ZnODAyMTFfdW5saW5rX2JzcyhyZGV2LCBic3MpKQorCQkJcmRldi0+YnNzX2dlbmVyYXRpb24rKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3VubGlua19ic3MpOwogCkBAIC0xMDc1LDcgKzEwODEsNyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAlpZiAoZGV2LT5pZWVlODAyMTFfcHRyKQotCQlyZGV2ID0gd2lwaHlfdG9fZGV2KGRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHkpOworCQlyZGV2ID0gd2lwaHlfdG9fcmRldihkZXYtPmllZWU4MDIxMV9wdHItPndpcGh5KTsKIAllbHNlCiAJCXJkZXYgPSBFUlJfUFRSKC1FTk9ERVYpOwogCWRldl9wdXQoZGV2KTsKQEAgLTExNTUsNyArMTE2MSwxMSBAQAogCQkJCWludCBrOwogCQkJCWludCB3aXBoeV9mcmVxID0gd2lwaHktPmJhbmRzW2JhbmRdLT5jaGFubmVsc1tqXS5jZW50ZXJfZnJlcTsKIAkJCQlmb3IgKGsgPSAwOyBrIDwgd3JlcS0+bnVtX2NoYW5uZWxzOyBrKyspIHsKLQkJCQkJaW50IHdleHRfZnJlcSA9IGNmZzgwMjExX3dleHRfZnJlcSh3aXBoeSwgJndyZXEtPmNoYW5uZWxfbGlzdFtrXSk7CisJCQkJCXN0cnVjdCBpd19mcmVxICpmcmVxID0KKwkJCQkJCSZ3cmVxLT5jaGFubmVsX2xpc3Rba107CisJCQkJCWludCB3ZXh0X2ZyZXEgPQorCQkJCQkJY2ZnODAyMTFfd2V4dF9mcmVxKGZyZXEpOworCiAJCQkJCWlmICh3ZXh0X2ZyZXEgPT0gd2lwaHlfZnJlcSkKIAkJCQkJCWdvdG8gd2V4dF9mcmVxX2ZvdW5kOwogCQkJCX0KQEAgLTE0NjcsNyArMTQ3Nyw3IEBACiB9CiAKIAotc3RhdGljIGludCBpZWVlODAyMTFfc2Nhbl9yZXN1bHRzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2LAorc3RhdGljIGludCBpZWVlODAyMTFfc2Nhbl9yZXN1bHRzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJICBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CkBAIC0xNDc1LDE4ICsxNDg1LDE4IEBACiAJY2hhciAqZW5kX2J1ZiA9IGJ1ZiArIGxlbjsKIAlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpic3M7CiAKLQlzcGluX2xvY2tfYmgoJmRldi0+YnNzX2xvY2spOwotCWNmZzgwMjExX2Jzc19leHBpcmUoZGV2KTsKKwlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKKwljZmc4MDIxMV9ic3NfZXhwaXJlKHJkZXYpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShic3MsICZkZXYtPmJzc19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShic3MsICZyZGV2LT5ic3NfbGlzdCwgbGlzdCkgewogCQlpZiAoYnVmICsgbGVuIC0gY3VycmVudF9ldiA8PSBJV19FVl9BRERSX0xFTikgewotCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+YnNzX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAkJCXJldHVybiAtRTJCSUc7CiAJCX0KLQkJY3VycmVudF9ldiA9IGllZWU4MDIxMV9ic3MoJmRldi0+d2lwaHksIGluZm8sIGJzcywKKwkJY3VycmVudF9ldiA9IGllZWU4MDIxMV9ic3MoJnJkZXYtPndpcGh5LCBpbmZvLCBic3MsCiAJCQkJCSAgIGN1cnJlbnRfZXYsIGVuZF9idWYpOwogCX0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5ic3NfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAlyZXR1cm4gY3VycmVudF9ldiAtIGJ1ZjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IDM1NDZhNzcuLjhiYmVlYjMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogc3RhdGljIGludCBjZmc4MDIxMV9jb25uX3NjYW4oc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3Q7CiAJaW50IG5fY2hhbm5lbHMsIGVycjsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAKIHN0YXRpYyBpbnQgY2ZnODAyMTFfY29ubl9kb193b3JrKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnBhcmFtczsKIAlzdHJ1Y3QgY2ZnODAyMTFfYXNzb2NfcmVxdWVzdCByZXEgPSB7fTsKIAlpbnQgZXJyOwpAQCAtMTQ5LDcgKzE0OSw4IEBACiAJY2FzZSBDRkc4MDIxMV9DT05OX1NDQU5fQUdBSU46CiAJCXJldHVybiBjZmc4MDIxMV9jb25uX3NjYW4od2Rldik7CiAJY2FzZSBDRkc4MDIxMV9DT05OX0FVVEhFTlRJQ0FURV9ORVhUOgotCQlCVUdfT04oIXJkZXYtPm9wcy0+YXV0aCk7CisJCWlmIChXQVJOX09OKCFyZGV2LT5vcHMtPmF1dGgpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQl3ZGV2LT5jb25uLT5zdGF0ZSA9IENGRzgwMjExX0NPTk5fQVVUSEVOVElDQVRJTkc7CiAJCXJldHVybiBjZmc4MDIxMV9tbG1lX2F1dGgocmRldiwgd2Rldi0+bmV0ZGV2LAogCQkJCQkgIHBhcmFtcy0+Y2hhbm5lbCwgcGFyYW1zLT5hdXRoX3R5cGUsCkBAIC0xNjEsNyArMTYyLDggQEAKIAljYXNlIENGRzgwMjExX0NPTk5fQVVUSF9GQUlMRUQ6CiAJCXJldHVybiAtRU5PVENPTk47CiAJY2FzZSBDRkc4MDIxMV9DT05OX0FTU09DSUFURV9ORVhUOgotCQlCVUdfT04oIXJkZXYtPm9wcy0+YXNzb2MpOworCQlpZiAoV0FSTl9PTighcmRldi0+b3BzLT5hc3NvYykpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCXdkZXYtPmNvbm4tPnN0YXRlID0gQ0ZHODAyMTFfQ09OTl9BU1NPQ0lBVElORzsKIAkJaWYgKHdkZXYtPmNvbm4tPnByZXZfYnNzaWRfdmFsaWQpCiAJCQlyZXEucHJldl9ic3NpZCA9IHdkZXYtPmNvbm4tPnByZXZfYnNzaWQ7CkBAIC0yNDQsNyArMjQ2LDcgQEAKIC8qIFJldHVybmVkIGJzcyBpcyByZWZlcmVuY2UgY291bnRlZCBhbmQgbXVzdCBiZSBjbGVhbmVkIHVwIGFwcHJvcHJpYXRlbHkuICovCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX2JzcyAqY2ZnODAyMTFfZ2V0X2Nvbm5fYnNzKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJdTE2IGNhcGEgPSBXTEFOX0NBUEFCSUxJVFlfRVNTOwogCkBAIC0yNzQsNyArMjc2LDcgQEAKIHN0YXRpYyB2b2lkIF9fY2ZnODAyMTFfc21lX3NjYW5fZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAKIAlBU1NFUlRfV0RFVl9MT0NLKHdkZXYpOwpAQCAtMzA1LDcgKzMwNyw3IEBACiB2b2lkIGNmZzgwMjExX3NtZV9yeF9hdXRoKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJ1ZjsKIAl1MTYgc3RhdHVzX2NvZGUgPSBsZTE2X3RvX2NwdShtZ210LT51LmF1dGguc3RhdHVzX2NvZGUpOwogCkBAIC0zNTEsNyArMzUzLDcgQEAKIAogYm9vbCBjZmc4MDIxMV9zbWVfcnhfYXNzb2NfcmVzcChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1MTYgc3RhdHVzKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAKIAlpZiAoIXdkZXYtPmNvbm4pCiAJCXJldHVybiBmYWxzZTsKQEAgLTM4NSw3ICszODcsNyBAQAogCiB2b2lkIGNmZzgwMjExX3NtZV9hdXRoX3RpbWVvdXQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCiAJaWYgKCF3ZGV2LT5jb25uKQogCQlyZXR1cm47CkBAIC0zOTYsNyArMzk4LDcgQEAKIAogdm9pZCBjZmc4MDIxMV9zbWVfZGlzYXNzb2Moc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCiAJaWYgKCF3ZGV2LT5jb25uKQogCQlyZXR1cm47CkBAIC00MDcsNyArNDA5LDcgQEAKIAogdm9pZCBjZmc4MDIxMV9zbWVfYXNzb2NfdGltZW91dChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAKIAlpZiAoIXdkZXYtPmNvbm4pCiAJCXJldHVybjsKQEAgLTQyMCw3ICs0MjIsNyBAQAogCQkJCXN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqY29ubmVjdCwKIAkJCQljb25zdCB1OCAqcHJldl9ic3NpZCkKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAlpbnQgZXJyOwogCkBAIC00NjcsNyArNDY5LDcgQEAKIAl9CiAKIAl3ZGV2LT5jb25uLT5wYXJhbXMuc3NpZCA9IHdkZXYtPnNzaWQ7Ci0Jd2Rldi0+Y29ubi0+cGFyYW1zLnNzaWRfbGVuID0gY29ubmVjdC0+c3NpZF9sZW47CisJd2Rldi0+Y29ubi0+cGFyYW1zLnNzaWRfbGVuID0gd2Rldi0+c3NpZF9sZW47CiAKIAkvKiBzZWUgaWYgd2UgaGF2ZSB0aGUgYnNzIGFscmVhZHkgKi8KIAlic3MgPSBjZmc4MDIxMV9nZXRfY29ubl9ic3Mod2Rldik7CkBAIC00NzksNyArNDgxLDYgQEAKIAogCS8qIHdlJ3JlIGdvb2QgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIGJzcyBzdHJ1Y3QgKi8KIAlpZiAoYnNzKSB7Ci0JCXdkZXYtPmNvbm4tPnN0YXRlID0gQ0ZHODAyMTFfQ09OTl9BVVRIRU5USUNBVEVfTkVYVDsKIAkJZXJyID0gY2ZnODAyMTFfY29ubl9kb193b3JrKHdkZXYpOwogCQljZmc4MDIxMV9wdXRfYnNzKHdkZXYtPndpcGh5LCBic3MpOwogCX0gZWxzZSB7CkBAIC01MDUsNyArNTA2LDcgQEAKIAogc3RhdGljIGludCBjZmc4MDIxMV9zbWVfZGlzY29ubmVjdChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1MTYgcmVhc29uKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJaW50IGVycjsKIAogCWlmICghd2Rldi0+Y29ubikKQEAgLTU5Myw3ICs1OTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jbmw4MDIxMV9zZW5kX2Nvbm5lY3RfcmVzdWx0KHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSksIGRldiwKKwlubDgwMjExX3NlbmRfY29ubmVjdF9yZXN1bHQod2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSksIGRldiwKIAkJCQkgICAgYnNzaWQsIHJlcV9pZSwgcmVxX2llX2xlbiwKIAkJCQkgICAgcmVzcF9pZSwgcmVzcF9pZV9sZW4sCiAJCQkJICAgIHN0YXR1cywgR0ZQX0tFUk5FTCk7CkBAIC02MjQsNyArNjI1LDcgQEAKICNlbmRpZgogCiAJaWYgKCFic3MgJiYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSkgewotCQlXQVJOX09OX09OQ0UoIXdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSktPm9wcy0+Y29ubmVjdCk7CisJCVdBUk5fT05fT05DRSghd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSktPm9wcy0+Y29ubmVjdCk7CiAJCWJzcyA9IGNmZzgwMjExX2dldF9ic3Mod2Rldi0+d2lwaHksIE5VTEwsIGJzc2lkLAogCQkJCSAgICAgICB3ZGV2LT5zc2lkLCB3ZGV2LT5zc2lkX2xlbiwKIAkJCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0VTUywKQEAgLTY4Nyw3ICs2ODgsNyBAQAogCQkJICAgICB1MTYgc3RhdHVzLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9ldmVudCAqZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNzQyLDcgKzc0Myw4IEBACiAJY2ZnODAyMTFfaG9sZF9ic3MoYnNzX2Zyb21fcHViKGJzcykpOwogCXdkZXYtPmN1cnJlbnRfYnNzID0gYnNzX2Zyb21fcHViKGJzcyk7CiAKLQlubDgwMjExX3NlbmRfcm9hbWVkKHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSksIHdkZXYtPm5ldGRldiwgYnNzLT5ic3NpZCwKKwlubDgwMjExX3NlbmRfcm9hbWVkKHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpLAorCQkJICAgIHdkZXYtPm5ldGRldiwgYnNzLT5ic3NpZCwKIAkJCSAgICByZXFfaWUsIHJlcV9pZV9sZW4sIHJlc3BfaWUsIHJlc3BfaWVfbGVuLAogCQkJICAgIEdGUF9LRVJORUwpOwogCkBAIC04MDEsNyArODAzLDcgQEAKIAkJCSBzaXplX3QgcmVzcF9pZV9sZW4sIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2V2ZW50ICpldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC04MzQsNyArODM2LDcgQEAKIAkJCSAgICAgc2l6ZV90IGllX2xlbiwgdTE2IHJlYXNvbiwgYm9vbCBmcm9tX2FwKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlpbnQgaTsKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKQEAgLTg3NywxMCArODc5LDEwIEBACiB9CiAKIHZvaWQgY2ZnODAyMTFfZGlzY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWFzb24sCi0JCQkgICB1OCAqaWUsIHNpemVfdCBpZV9sZW4sIGdmcF90IGdmcCkKKwkJCSAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfZXZlbnQgKmV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy90cmFjZS5oIGIvbmV0L3dpcmVsZXNzL3RyYWNlLmgKaW5kZXggYWFiY2NmMS4uNTYwZWQ3NyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3RyYWNlLmgKKysrIGIvbmV0L3dpcmVsZXNzL3RyYWNlLmgKQEAgLTE4NzYsMjkgKzE4NzYsMzMgQEAKIAkJV0lQSFlfRU5UUlkKIAkJTkVUREVWX0VOVFJZCiAJCUNIQU5fREVGX0VOVFJZCi0JCV9fZmllbGQodTE2LCBjb3VudGVyX29mZnNldF9iZWFjb24pCi0JCV9fZmllbGQodTE2LCBjb3VudGVyX29mZnNldF9wcmVzcCkKIAkJX19maWVsZChib29sLCByYWRhcl9yZXF1aXJlZCkKIAkJX19maWVsZChib29sLCBibG9ja190eCkKIAkJX19maWVsZCh1OCwgY291bnQpCisJCV9fZHluYW1pY19hcnJheSh1MTYsIGJjbl9vZnMsIHBhcmFtcy0+bl9jb3VudGVyX29mZnNldHNfYmVhY29uKQorCQlfX2R5bmFtaWNfYXJyYXkodTE2LCBwcmVzX29mcywgcGFyYW1zLT5uX2NvdW50ZXJfb2Zmc2V0c19wcmVzcCkKIAkpLAogCVRQX2Zhc3RfYXNzaWduKAogCQlXSVBIWV9BU1NJR047CiAJCU5FVERFVl9BU1NJR047CiAJCUNIQU5fREVGX0FTU0lHTigmcGFyYW1zLT5jaGFuZGVmKTsKLQkJX19lbnRyeS0+Y291bnRlcl9vZmZzZXRfYmVhY29uID0gcGFyYW1zLT5jb3VudGVyX29mZnNldF9iZWFjb247Ci0JCV9fZW50cnktPmNvdW50ZXJfb2Zmc2V0X3ByZXNwID0gcGFyYW1zLT5jb3VudGVyX29mZnNldF9wcmVzcDsKIAkJX19lbnRyeS0+cmFkYXJfcmVxdWlyZWQgPSBwYXJhbXMtPnJhZGFyX3JlcXVpcmVkOwogCQlfX2VudHJ5LT5ibG9ja190eCA9IHBhcmFtcy0+YmxvY2tfdHg7CiAJCV9fZW50cnktPmNvdW50ID0gcGFyYW1zLT5jb3VudDsKKwkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYmNuX29mcyksCisJCSAgICAgICBwYXJhbXMtPmNvdW50ZXJfb2Zmc2V0c19iZWFjb24sCisJCSAgICAgICBwYXJhbXMtPm5fY291bnRlcl9vZmZzZXRzX2JlYWNvbiAqIHNpemVvZih1MTYpKTsKKworCQkvKiBwcm9iZSByZXNwb25zZSBvZmZzZXRzIGFyZSBvcHRpb25hbCAqLworCQlpZiAocGFyYW1zLT5uX2NvdW50ZXJfb2Zmc2V0c19wcmVzcCkKKwkJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHByZXNfb2ZzKSwKKwkJCSAgICAgICBwYXJhbXMtPmNvdW50ZXJfb2Zmc2V0c19wcmVzcCwKKwkJCSAgICAgICBwYXJhbXMtPm5fY291bnRlcl9vZmZzZXRzX3ByZXNwICogc2l6ZW9mKHUxNikpOwogCSksCiAJVFBfcHJpbnRrKFdJUEhZX1BSX0ZNVCAiLCAiIE5FVERFVl9QUl9GTVQgIiwgIiBDSEFOX0RFRl9QUl9GTVQKLQkJICAiLCBibG9ja190eDogJWQsIGNvdW50OiAldSwgcmFkYXJfcmVxdWlyZWQ6ICVkIgotCQkgICIsIGNvdW50ZXIgb2Zmc2V0cyAoYmVhY29uL3ByZXNwKTogJXUvJXUiLAorCQkgICIsIGJsb2NrX3R4OiAlZCwgY291bnQ6ICV1LCByYWRhcl9yZXF1aXJlZDogJWQiLAogCQkgIFdJUEhZX1BSX0FSRywgTkVUREVWX1BSX0FSRywgQ0hBTl9ERUZfUFJfQVJHLAotCQkgIF9fZW50cnktPmJsb2NrX3R4LCBfX2VudHJ5LT5jb3VudCwgX19lbnRyeS0+cmFkYXJfcmVxdWlyZWQsCi0JCSAgX19lbnRyeS0+Y291bnRlcl9vZmZzZXRfYmVhY29uLAotCQkgIF9fZW50cnktPmNvdW50ZXJfb2Zmc2V0X3ByZXNwKQorCQkgIF9fZW50cnktPmJsb2NrX3R4LCBfX2VudHJ5LT5jb3VudCwgX19lbnRyeS0+cmFkYXJfcmVxdWlyZWQpCiApOwogCiBUUkFDRV9FVkVOVChyZGV2X3NldF9xb3NfbWFwLApAQCAtMTkxOSw2ICsxOTIzLDI0IEBACiAJCSAgV0lQSFlfUFJfQVJHLCBORVRERVZfUFJfQVJHLCBfX2VudHJ5LT5udW1fZGVzKQogKTsKIAorVFJBQ0VfRVZFTlQocmRldl9zZXRfYXBfY2hhbndpZHRoLAorCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpLAorCVRQX0FSR1Mod2lwaHksIG5ldGRldiwgY2hhbmRlZiksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJTkVUREVWX0VOVFJZCisJCUNIQU5fREVGX0VOVFJZCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlORVRERVZfQVNTSUdOOworCQlDSEFOX0RFRl9BU1NJR04oY2hhbmRlZik7CisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgTkVUREVWX1BSX0ZNVCAiLCAiIENIQU5fREVGX1BSX0ZNVCwKKwkJICBXSVBIWV9QUl9BUkcsIE5FVERFVl9QUl9BUkcsIENIQU5fREVGX1BSX0FSRykKKyk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIGNmZzgwMjExIGV4cG9ydGVkIGZ1bmN0aW9ucyB0cmFjZXMJCSAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTkzLDE4ICsyMjE1LDIxIEBACiApOwogCiBUUkFDRV9FVkVOVChjZmc4MDIxMV9yZWdfY2FuX2JlYWNvbiwKLQlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpLAotCVRQX0FSR1Mod2lwaHksIGNoYW5kZWYpLAorCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlKSwKKwlUUF9BUkdTKHdpcGh5LCBjaGFuZGVmLCBpZnR5cGUpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVdJUEhZX0VOVFJZCiAJCUNIQU5fREVGX0VOVFJZCisJCV9fZmllbGQoZW51bSBubDgwMjExX2lmdHlwZSwgaWZ0eXBlKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCiAJCVdJUEhZX0FTU0lHTjsKIAkJQ0hBTl9ERUZfQVNTSUdOKGNoYW5kZWYpOworCQlfX2VudHJ5LT5pZnR5cGUgPSBpZnR5cGU7CiAJKSwKLQlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgQ0hBTl9ERUZfUFJfRk1ULAotCQkgIFdJUEhZX1BSX0FSRywgQ0hBTl9ERUZfUFJfQVJHKQorCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBDSEFOX0RFRl9QUl9GTVQgIiwgaWZ0eXBlPSVkIiwKKwkJICBXSVBIWV9QUl9BUkcsIENIQU5fREVGX1BSX0FSRywgX19lbnRyeS0+aWZ0eXBlKQogKTsKIAogVFJBQ0VfRVZFTlQoY2ZnODAyMTFfY2hhbmRlZl9kZnNfcmVxdWlyZWQsCkBAIC0yNjE1LDYgKzI2NDAsMjEgQEAKIAkJICBXSVBIWV9QUl9BUkcsIE5FVERFVl9QUl9BUkcsIE1BQ19QUl9BUkcodGFyZ2V0X2FwKSkKICk7CiAKK1RSQUNFX0VWRU5UKGNmZzgwMjExX3N0b3BfaWZhY2UsCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiksCisJVFBfQVJHUyh3aXBoeSwgd2RldiksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCVdJUEhZX0FTU0lHTjsKKwkJV0RFVl9BU1NJR047CisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQsCisJCSAgV0lQSFlfUFJfQVJHLCBXREVWX1BSX0FSRykKKyk7CisKICNlbmRpZiAvKiAhX19SREVWX09QU19UUkFDRSB8fCBUUkFDRV9IRUFERVJfTVVMVElfUkVBRCAqLwogCiAjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCBlNTg3MmZmLi43MjhmMWMwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTQ3Niw3ICs0NzYsOCBAQAogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZGF0YV90b184MDIzKTsKIAogaW50IGllZWU4MDIxMV9kYXRhX2Zyb21fODAyMyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1OCAqYWRkciwKLQkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSBpZnR5cGUsIHU4ICpic3NpZCwgYm9vbCBxb3MpCisJCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlLAorCQkJICAgICBjb25zdCB1OCAqYnNzaWQsIGJvb2wgcW9zKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhkcjsKIAl1MTYgaGRybGVuLCBldGhlcnR5cGU7CkBAIC03NzAsNyArNzcxLDcgQEAKIAogdm9pZCBjZmc4MDIxMV91cGxvYWRfY29ubmVjdF9rZXlzKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi0+bmV0ZGV2OwogCWludCBpOwogCkBAIC04MzksNiArODQwLDkgQEAKIAkJCV9fY2ZnODAyMTFfaWJzc19qb2luZWQod2Rldi0+bmV0ZGV2LCBldi0+aWouYnNzaWQsCiAJCQkJCSAgICAgICBldi0+aWouY2hhbm5lbCk7CiAJCQlicmVhazsKKwkJY2FzZSBFVkVOVF9TVE9QUEVEOgorCQkJX19jZmc4MDIxMV9sZWF2ZSh3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KSwgd2Rldik7CisJCQlicmVhazsKIAkJfQogCQl3ZGV2X3VubG9jayh3ZGV2KTsKIApAQCAtODg4LDExICs4OTIsNiBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKG50eXBlICE9IG90eXBlICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQllcnIgPSBjZmc4MDIxMV9jYW5fY2hhbmdlX2ludGVyZmFjZShyZGV2LCBkZXYtPmllZWU4MDIxMV9wdHIsCi0JCQkJCQkgICAgbnR5cGUpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQogCQlkZXYtPmllZWU4MDIxMV9wdHItPnVzZV80YWRkciA9IGZhbHNlOwogCQlkZXYtPmllZWU4MDIxMV9wdHItPm1lc2hfaWRfdXBfbGVuID0gMDsKIAkJd2Rldl9sb2NrKGRldi0+aWVlZTgwMjExX3B0cik7CkBAIC0xMjY4LDYgKzEyNjcsMTIwIEBACiAJcmV0dXJuIHJlczsKIH0KIAoraW50IGNmZzgwMjExX2l0ZXJfY29tYmluYXRpb25zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICAgY29uc3QgaW50IG51bV9kaWZmZXJlbnRfY2hhbm5lbHMsCisJCQkgICAgICAgY29uc3QgdTggcmFkYXJfZGV0ZWN0LAorCQkJICAgICAgIGNvbnN0IGludCBpZnR5cGVfbnVtW05VTV9OTDgwMjExX0lGVFlQRVNdLAorCQkJICAgICAgIHZvaWQgKCppdGVyKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uICpjLAorCQkJCQkgICAgdm9pZCAqZGF0YSksCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnZG9tOworCWVudW0gbmw4MDIxMV9kZnNfcmVnaW9ucyByZWdpb24gPSAwOworCWludCBpLCBqLCBpZnR5cGU7CisJaW50IG51bV9pbnRlcmZhY2VzID0gMDsKKwl1MzIgdXNlZF9pZnR5cGVzID0gMDsKKworCWlmIChyYWRhcl9kZXRlY3QpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZWdkb20gPSByY3VfZGVyZWZlcmVuY2UoY2ZnODAyMTFfcmVnZG9tYWluKTsKKwkJaWYgKHJlZ2RvbSkKKwkJCXJlZ2lvbiA9IHJlZ2RvbS0+ZGZzX3JlZ2lvbjsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisJZm9yIChpZnR5cGUgPSAwOyBpZnR5cGUgPCBOVU1fTkw4MDIxMV9JRlRZUEVTOyBpZnR5cGUrKykgeworCQludW1faW50ZXJmYWNlcyArPSBpZnR5cGVfbnVtW2lmdHlwZV07CisJCWlmIChpZnR5cGVfbnVtW2lmdHlwZV0gPiAwICYmCisJCSAgICAhKHdpcGh5LT5zb2Z0d2FyZV9pZnR5cGVzICYgQklUKGlmdHlwZSkpKQorCQkJdXNlZF9pZnR5cGVzIHw9IEJJVChpZnR5cGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB3aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uICpjOworCQlzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0ICpsaW1pdHM7CisJCXUzMiBhbGxfaWZ0eXBlcyA9IDA7CisKKwkJYyA9ICZ3aXBoeS0+aWZhY2VfY29tYmluYXRpb25zW2ldOworCisJCWlmIChudW1faW50ZXJmYWNlcyA+IGMtPm1heF9pbnRlcmZhY2VzKQorCQkJY29udGludWU7CisJCWlmIChudW1fZGlmZmVyZW50X2NoYW5uZWxzID4gYy0+bnVtX2RpZmZlcmVudF9jaGFubmVscykKKwkJCWNvbnRpbnVlOworCisJCWxpbWl0cyA9IGttZW1kdXAoYy0+bGltaXRzLCBzaXplb2YobGltaXRzWzBdKSAqIGMtPm5fbGltaXRzLAorCQkJCSBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsaW1pdHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmb3IgKGlmdHlwZSA9IDA7IGlmdHlwZSA8IE5VTV9OTDgwMjExX0lGVFlQRVM7IGlmdHlwZSsrKSB7CisJCQlpZiAod2lwaHktPnNvZnR3YXJlX2lmdHlwZXMgJiBCSVQoaWZ0eXBlKSkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IDA7IGogPCBjLT5uX2xpbWl0czsgaisrKSB7CisJCQkJYWxsX2lmdHlwZXMgfD0gbGltaXRzW2pdLnR5cGVzOworCQkJCWlmICghKGxpbWl0c1tqXS50eXBlcyAmIEJJVChpZnR5cGUpKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGxpbWl0c1tqXS5tYXggPCBpZnR5cGVfbnVtW2lmdHlwZV0pCisJCQkJCWdvdG8gY29udDsKKwkJCQlsaW1pdHNbal0ubWF4IC09IGlmdHlwZV9udW1baWZ0eXBlXTsKKwkJCX0KKwkJfQorCisJCWlmIChyYWRhcl9kZXRlY3QgIT0gKGMtPnJhZGFyX2RldGVjdF93aWR0aHMgJiByYWRhcl9kZXRlY3QpKQorCQkJZ290byBjb250OworCisJCWlmIChyYWRhcl9kZXRlY3QgJiYgYy0+cmFkYXJfZGV0ZWN0X3JlZ2lvbnMgJiYKKwkJICAgICEoYy0+cmFkYXJfZGV0ZWN0X3JlZ2lvbnMgJiBCSVQocmVnaW9uKSkpCisJCQlnb3RvIGNvbnQ7CisKKwkJLyogRmluYWxseSBjaGVjayB0aGF0IGFsbCBpZnR5cGVzIHRoYXQgd2UncmUgY3VycmVudGx5CisJCSAqIHVzaW5nIGFyZSBhY3R1YWxseSBwYXJ0IG9mIHRoaXMgY29tYmluYXRpb24uIElmIHRoZXkKKwkJICogYXJlbid0IHRoZW4gd2UgY2FuJ3QgdXNlIHRoaXMgY29tYmluYXRpb24gYW5kIGhhdmUKKwkJICogdG8gY29udGludWUgdG8gdGhlIG5leHQuCisJCSAqLworCQlpZiAoKGFsbF9pZnR5cGVzICYgdXNlZF9pZnR5cGVzKSAhPSB1c2VkX2lmdHlwZXMpCisJCQlnb3RvIGNvbnQ7CisKKwkJLyogVGhpcyBjb21iaW5hdGlvbiBjb3ZlcmVkIGFsbCBpbnRlcmZhY2UgdHlwZXMgYW5kCisJCSAqIHN1cHBvcnRlZCB0aGUgcmVxdWVzdGVkIG51bWJlcnMsIHNvIHdlJ3JlIGdvb2QuCisJCSAqLworCisJCSgqaXRlcikoYywgZGF0YSk7CisgY29udDoKKwkJa2ZyZWUobGltaXRzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfaXRlcl9jb21iaW5hdGlvbnMpOworCitzdGF0aWMgdm9pZAorY2ZnODAyMTFfaXRlcl9zdW1faWZjb21icyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uICpjLAorCQkJICB2b2lkICpkYXRhKQoreworCWludCAqbnVtID0gZGF0YTsKKwkoKm51bSkrKzsKK30KKworaW50IGNmZzgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCWNvbnN0IGludCBudW1fZGlmZmVyZW50X2NoYW5uZWxzLAorCQkJCWNvbnN0IHU4IHJhZGFyX2RldGVjdCwKKwkJCQljb25zdCBpbnQgaWZ0eXBlX251bVtOVU1fTkw4MDIxMV9JRlRZUEVTXSkKK3sKKwlpbnQgZXJyLCBudW0gPSAwOworCisJZXJyID0gY2ZnODAyMTFfaXRlcl9jb21iaW5hdGlvbnMod2lwaHksIG51bV9kaWZmZXJlbnRfY2hhbm5lbHMsCisJCQkJCSByYWRhcl9kZXRlY3QsIGlmdHlwZV9udW0sCisJCQkJCSBjZmc4MDIxMV9pdGVyX3N1bV9pZmNvbWJzLCAmbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChudW0gPT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9jaGVja19jb21iaW5hdGlvbnMpOworCiBpbnQgY2ZnODAyMTFfY2FuX3VzZV9pZnR5cGVfY2hhbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCiAJCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlLApAQCAtMTI3Niw3ICsxMzg5LDYgQEAKIAkJCQkgdTggcmFkYXJfZGV0ZWN0KQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXZfaXRlcjsKLQl1MzIgdXNlZF9pZnR5cGVzID0gQklUKGlmdHlwZSk7CiAJaW50IG51bVtOVU1fTkw4MDIxMV9JRlRZUEVTXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKIAkJCSp1c2VkX2NoYW5uZWxzW0NGRzgwMjExX01BWF9OVU1fRElGRkVSRU5UX0NIQU5ORUxTXTsKQEAgLTEyODQsNyArMTM5Niw3IEBACiAJZW51bSBjZmc4MDIxMV9jaGFuX21vZGUgY2htb2RlOwogCWludCBudW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMDsKIAlpbnQgdG90YWwgPSAxOwotCWludCBpLCBqOworCWludCBpOwogCiAJQVNTRVJUX1JUTkwoKTsKIApAQCAtMTMwNiw2ICsxNDE4LDExIEBACiAKIAludW1baWZ0eXBlXSA9IDE7CiAKKwkvKiBUT0RPOiBXZSdsbCBwcm9iYWJseSBub3QgbmVlZCB0aGlzIGFueW1vcmUsIHNpbmNlIHRoaXMKKwkgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBDSEFOX01PREVfVU5ERUZJTkVELiBUaGVyZSBhcmUKKwkgKiBzdGlsbCBhIGNvdXBsZSBvZiBwZW5kaW5nIGNhbGxzIHdoZXJlIG90aGVyIGNoYW5tb2RlcyBhcmUKKwkgKiB1c2VkLCBidXQgd2Ugc2hvdWxkIGdldCByaWQgb2YgdGhlbS4KKwkgKi8KIAlzd2l0Y2ggKGNoYW5tb2RlKSB7CiAJY2FzZSBDSEFOX01PREVfVU5ERUZJTkVEOgogCQlicmVhazsKQEAgLTEzNjksNjUgKzE0ODYsMTMgQEAKIAogCQludW1bd2Rldl9pdGVyLT5pZnR5cGVdKys7CiAJCXRvdGFsKys7Ci0JCXVzZWRfaWZ0eXBlcyB8PSBCSVQod2Rldl9pdGVyLT5pZnR5cGUpOwogCX0KIAogCWlmICh0b3RhbCA9PSAxICYmICFyYWRhcl9kZXRlY3QpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IHJkZXYtPndpcGh5Lm5faWZhY2VfY29tYmluYXRpb25zOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbiAqYzsKLQkJc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCAqbGltaXRzOwotCQl1MzIgYWxsX2lmdHlwZXMgPSAwOwotCi0JCWMgPSAmcmRldi0+d2lwaHkuaWZhY2VfY29tYmluYXRpb25zW2ldOwotCi0JCWlmICh0b3RhbCA+IGMtPm1heF9pbnRlcmZhY2VzKQotCQkJY29udGludWU7Ci0JCWlmIChudW1fZGlmZmVyZW50X2NoYW5uZWxzID4gYy0+bnVtX2RpZmZlcmVudF9jaGFubmVscykKLQkJCWNvbnRpbnVlOwotCi0JCWxpbWl0cyA9IGttZW1kdXAoYy0+bGltaXRzLCBzaXplb2YobGltaXRzWzBdKSAqIGMtPm5fbGltaXRzLAotCQkJCSBHRlBfS0VSTkVMKTsKLQkJaWYgKCFsaW1pdHMpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlmb3IgKGlmdHlwZSA9IDA7IGlmdHlwZSA8IE5VTV9OTDgwMjExX0lGVFlQRVM7IGlmdHlwZSsrKSB7Ci0JCQlpZiAocmRldi0+d2lwaHkuc29mdHdhcmVfaWZ0eXBlcyAmIEJJVChpZnR5cGUpKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChqID0gMDsgaiA8IGMtPm5fbGltaXRzOyBqKyspIHsKLQkJCQlhbGxfaWZ0eXBlcyB8PSBsaW1pdHNbal0udHlwZXM7Ci0JCQkJaWYgKCEobGltaXRzW2pdLnR5cGVzICYgQklUKGlmdHlwZSkpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobGltaXRzW2pdLm1heCA8IG51bVtpZnR5cGVdKQotCQkJCQlnb3RvIGNvbnQ7Ci0JCQkJbGltaXRzW2pdLm1heCAtPSBudW1baWZ0eXBlXTsKLQkJCX0KLQkJfQotCi0JCWlmIChyYWRhcl9kZXRlY3QgJiYgIShjLT5yYWRhcl9kZXRlY3Rfd2lkdGhzICYgcmFkYXJfZGV0ZWN0KSkKLQkJCWdvdG8gY29udDsKLQotCQkvKgotCQkgKiBGaW5hbGx5IGNoZWNrIHRoYXQgYWxsIGlmdHlwZXMgdGhhdCB3ZSdyZSBjdXJyZW50bHkKLQkJICogdXNpbmcgYXJlIGFjdHVhbGx5IHBhcnQgb2YgdGhpcyBjb21iaW5hdGlvbi4gSWYgdGhleQotCQkgKiBhcmVuJ3QgdGhlbiB3ZSBjYW4ndCB1c2UgdGhpcyBjb21iaW5hdGlvbiBhbmQgaGF2ZQotCQkgKiB0byBjb250aW51ZSB0byB0aGUgbmV4dC4KLQkJICovCi0JCWlmICgoYWxsX2lmdHlwZXMgJiB1c2VkX2lmdHlwZXMpICE9IHVzZWRfaWZ0eXBlcykKLQkJCWdvdG8gY29udDsKLQotCQkvKgotCQkgKiBUaGlzIGNvbWJpbmF0aW9uIGNvdmVyZWQgYWxsIGludGVyZmFjZSB0eXBlcyBhbmQKLQkJICogc3VwcG9ydGVkIHRoZSByZXF1ZXN0ZWQgbnVtYmVycywgc28gd2UncmUgZ29vZC4KLQkJICovCi0JCWtmcmVlKGxpbWl0cyk7Ci0JCXJldHVybiAwOwotIGNvbnQ6Ci0JCWtmcmVlKGxpbWl0cyk7Ci0JfQotCi0JcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gY2ZnODAyMTFfY2hlY2tfY29tYmluYXRpb25zKCZyZGV2LT53aXBoeSwgbnVtX2RpZmZlcmVudF9jaGFubmVscywKKwkJCQkJICAgcmFkYXJfZGV0ZWN0LCBudW0pOwogfQogCiBpbnQgaWVlZTgwMjExX2dldF9yYXRlbWFzayhzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKQEAgLTE0ODEsNiArMTU0NiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X251bV9zdXBwb3J0ZWRfY2hhbm5lbHMpOwogCitpbnQgY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLAorCQkJIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OworCisJd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKwlpZiAoIXdkZXYpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKKwlpZiAoIXJkZXYtPm9wcy0+Z2V0X3N0YXRpb24pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZGV2X2dldF9zdGF0aW9uKHJkZXYsIGRldiwgbWFjX2FkZHIsIHNpbmZvKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfZ2V0X3N0YXRpb24pOworCiAvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLwogLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYwppbmRleCA1NjYxYTU0Li4xMTEyMGJiIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYwpAQCAtNzMsNyArNzMsNyBAQAogCXN0cnVjdCB2aWZfcGFyYW1zIHZpZnBhcmFtczsKIAllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGU7CiAKLQlyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAKIAlzd2l0Y2ggKCptb2RlKSB7CiAJY2FzZSBJV19NT0RFX0lORlJBOgpAQCAtMjUzLDEyICsyNTMsMTIgQEAKIAogLyoqCiAgKiBjZmc4MDIxMV93ZXh0X2ZyZXEgLSBnZXQgd2V4dCBmcmVxdWVuY3kgZm9yIG5vbi0iYXV0byIKLSAqIEB3aXBoeTogdGhlIHdpcGh5CisgKiBAZGV2OiB0aGUgbmV0IGRldmljZQogICogQGZyZXE6IHRoZSB3ZXh0IGZyZXEgZW5jb2RpbmcKICAqCiAgKiBSZXR1cm5zIGEgZnJlcXVlbmN5LCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUsIG9yIDAgZm9yIGF1dG8uCiAgKi8KLWludCBjZmc4MDIxMV93ZXh0X2ZyZXEoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGl3X2ZyZXEgKmZyZXEpCitpbnQgY2ZnODAyMTFfd2V4dF9mcmVxKHN0cnVjdCBpd19mcmVxICpmcmVxKQogewogCS8qCiAJICogUGFyc2UgZnJlcXVlbmN5IC0gcmV0dXJuIDAgZm9yIGF1dG8gYW5kCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXUzMiBvcnRzID0gd2Rldi0+d2lwaHktPnJ0c190aHJlc2hvbGQ7CiAJaW50IGVycjsKIApAQCAtMzI0LDcgKzMyNCw3IEBACiAJCQkgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXUzMiBvZnJhZyA9IHdkZXYtPndpcGh5LT5mcmFnX3RocmVzaG9sZDsKIAlpbnQgZXJyOwogCkBAIC0zNjQsNyArMzY0LDcgQEAKIAkJCQkgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAl1MzIgY2hhbmdlZCA9IDA7CiAJdTggb2xvbmcgPSB3ZGV2LT53aXBoeS0+cmV0cnlfbG9uZzsKIAl1OCBvc2hvcnQgPSB3ZGV2LT53aXBoeS0+cmV0cnlfc2hvcnQ7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5YnVmKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlpbnQgaWR4LCBlcnI7CiAJYm9vbCByZW1vdmUgPSBmYWxzZTsKIAlzdHJ1Y3Qga2V5X3BhcmFtcyBwYXJhbXM7CkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKikgZXh0cmE7CiAJY29uc3QgdTggKmFkZHI7CiAJaW50IGlkeDsKQEAgLTc3NSw3ICs3NzUsNyBAQAogCQkJCSBzdHJ1Y3QgaXdfZnJlcSAqd2V4dGZyZXEsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZiA9IHsKIAkJLndpZHRoID0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQsCiAJfTsKQEAgLTc4Nyw3ICs3ODcsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJCXJldHVybiBjZmc4MDIxMV9pYnNzX3dleHRfc2l3ZnJlcShkZXYsIGluZm8sIHdleHRmcmVxLCBleHRyYSk7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlmcmVxID0gY2ZnODAyMTFfd2V4dF9mcmVxKHdkZXYtPndpcGh5LCB3ZXh0ZnJlcSk7CisJCWZyZXEgPSBjZmc4MDIxMV93ZXh0X2ZyZXEod2V4dGZyZXEpOwogCQlpZiAoZnJlcSA8IDApCiAJCQlyZXR1cm4gZnJlcTsKIAkJaWYgKGZyZXEgPT0gMCkKQEAgLTc5OCw3ICs3OTgsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBjZmc4MDIxMV9zZXRfbW9uaXRvcl9jaGFubmVsKHJkZXYsICZjaGFuZGVmKTsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6Ci0JCWZyZXEgPSBjZmc4MDIxMV93ZXh0X2ZyZXEod2Rldi0+d2lwaHksIHdleHRmcmVxKTsKKwkJZnJlcSA9IGNmZzgwMjExX3dleHRfZnJlcSh3ZXh0ZnJlcSk7CiAJCWlmIChmcmVxIDwgMCkKIAkJCXJldHVybiBmcmVxOwogCQlpZiAoZnJlcSA9PSAwKQpAQCAtODE4LDcgKzgxOCw3IEBACiAJCQkJIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAJaW50IHJldDsKIApAQCAtODQ3LDcgKzg0Nyw3IEBACiAJCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKmRhdGEsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAllbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlOwogCWludCBkYm0gPSAwOwogCkBAIC04OTksNyArODk5LDcgQEAKIAkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCWludCBlcnIsIHZhbDsKIAogCWlmICgoZGF0YS0+dHhwb3dlci5mbGFncyAmIElXX1RYUE9XX1RZUEUpICE9IElXX1RYUE9XX0RCTSkKQEAgLTExMTksNyArMTExOSw3IEBACiAJCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKndycSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCWJvb2wgcHMgPSB3ZGV2LT5wczsKIAlpbnQgdGltZW91dCA9IHdkZXYtPnBzX3RpbWVvdXQ7CiAJaW50IGVycjsKQEAgLTExNzcsNyArMTE3Nyw3IEBACiAJCQkJICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJaW50IGVycjsKIAogCWlmIChXQVJOX09OKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9XRFMpKQpAQCAtMTIyMSw3ICsxMjIxLDcgQEAKIAkJCQkgc3RydWN0IGl3X3BhcmFtICpyYXRlLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayBtYXNrOwogCXUzMiBmaXhlZCwgbWF4cmF0ZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKQEAgLTEyNzIsNyArMTI3Miw3IEBACiAJCQkJIHN0cnVjdCBpd19wYXJhbSAqcmF0ZSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCS8qIHdlIGFyZSB1bmRlciBSVE5MIC0gZ2xvYmFsbHkgbG9ja2VkIC0gc28gY2FuIHVzZSBhIHN0YXRpYyBzdHJ1Y3QgKi8KIAlzdGF0aWMgc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKIAl1OCBhZGRyW0VUSF9BTEVOXTsKQEAgLTEzMTAsNyArMTMxMCw3IEBACiBzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKmNmZzgwMjExX3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCS8qIHdlIGFyZSB1bmRlciBSVE5MIC0gZ2xvYmFsbHkgbG9ja2VkIC0gc28gY2FuIHVzZSBzdGF0aWMgc3RydWN0cyAqLwogCXN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CiAJc3RhdGljIHN0cnVjdCBzdGF0aW9uX2luZm8gc2luZm87CkBAIC0xNDQ5LDcgKzE0NDksNyBAQAogCQkJCSAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX3Bta3NhIGNmZ19wbWtzYTsKIAlzdHJ1Y3QgaXdfcG1rc2EgKnBta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKWV4dHJhOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuaCBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5oCmluZGV4IDVkNzY2YjAuLmViY2FjY2EgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5oCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5oCkBAIC01MCw3ICs1MCw3IEBACiAJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKIAogCi1pbnQgY2ZnODAyMTFfd2V4dF9mcmVxKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBpd19mcmVxICpmcmVxKTsKK2ludCBjZmc4MDIxMV93ZXh0X2ZyZXEoc3RydWN0IGl3X2ZyZXEgKmZyZXEpOwogCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgY2ZnODAyMTFfd2V4dF9oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwppbmRleCA4NmMzMzFhLi5jN2U1YzhlIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwpAQCAtNjcsNyArNjcsNyBAQAogCQkJICAgICAgc3RydWN0IGl3X2ZyZXEgKndleHRmcmVxLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gTlVMTDsKIAlpbnQgZXJyLCBmcmVxOwogCkBAIC03NSw3ICs3NSw3IEBACiAJaWYgKFdBUk5fT04od2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZyZXEgPSBjZmc4MDIxMV93ZXh0X2ZyZXEod2Rldi0+d2lwaHksIHdleHRmcmVxKTsKKwlmcmVxID0gY2ZnODAyMTFfd2V4dF9mcmVxKHdleHRmcmVxKTsKIAlpZiAoZnJlcSA8IDApCiAJCXJldHVybiBmcmVxOwogCkBAIC0xNjksNyArMTY5LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKnNzaWQpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXNpemVfdCBsZW4gPSBkYXRhLT5sZW5ndGg7CiAJaW50IGVycjsKIApAQCAtMjYwLDcgKzI2MCw3IEBACiAJCQkgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJdTggKmJzc2lkID0gYXBfYWRkci0+c2FfZGF0YTsKIAlpbnQgZXJyOwogCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpOwogCXU4ICppZSA9IGV4dHJhOwogCWludCBpZV9sZW4gPSBkYXRhLT5sZW5ndGgsIGVycjsKIApAQCAtMzkwLDcgKzM5MCw3IEBACiAJaWYgKCF3ZGV2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAKIAlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9vdXRwdXQuYyBiL25ldC94ZnJtL3hmcm1fb3V0cHV0LmMKaW5kZXggM2JiMmNkYy4uYzUxZThmN2IgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fb3V0cHV0LmMKKysrIGIvbmV0L3hmcm0veGZybV9vdXRwdXQuYwpAQCAtMTk5LDYgKzE5OSw3IEBACiAKIAlyZXR1cm4geGZybV9vdXRwdXQyKHNrYik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX291dHB1dCk7CiAKIGludCB4ZnJtX2lubmVyX2V4dHJhY3Rfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMjEzLDYgKzIxNCw3IEBACiAJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCXJldHVybiBpbm5lcl9tb2RlLT5hZmluZm8tPmV4dHJhY3Rfb3V0cHV0KHgsIHNrYik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX2lubmVyX2V4dHJhY3Rfb3V0cHV0KTsKIAogdm9pZCB4ZnJtX2xvY2FsX2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsIGludCBtdHUpCiB7CkBAIC0yMzMsNyArMjM1LDQgQEAKIAlhZmluZm8tPmxvY2FsX2Vycm9yKHNrYiwgbXR1KTsKIAl4ZnJtX3N0YXRlX3B1dF9hZmluZm8oYWZpbmZvKTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9vdXRwdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9pbm5lcl9leHRyYWN0X291dHB1dCk7CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX2xvY2FsX2Vycm9yKTsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IGMwOGZiZDEuLmE4ZWY1MTA4IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTc2OSw3ICs3NjksNyBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogc3RhdGljIGlubGluZSBpbnQKLXhmcm1fcG9saWN5X2ZsdXNoX3NlY2N0eF9jaGVjayhzdHJ1Y3QgbmV0ICpuZXQsIHU4IHR5cGUsIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKQoreGZybV9wb2xpY3lfZmx1c2hfc2VjY3R4X2NoZWNrKHN0cnVjdCBuZXQgKm5ldCwgdTggdHlwZSwgYm9vbCB0YXNrX3ZhbGlkKQogewogCWludCBkaXIsIGVyciA9IDA7CiAKQEAgLTc4MywxMCArNzgzLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2RlbGV0ZShwb2wtPnNlY3VyaXR5KTsKIAkJCWlmIChlcnIpIHsKLQkJCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUocG9sLCAwLAotCQkJCQkJCSBhdWRpdF9pbmZvLT5sb2dpbnVpZCwKLQkJCQkJCQkgYXVkaXRfaW5mby0+c2Vzc2lvbmlkLAotCQkJCQkJCSBhdWRpdF9pbmZvLT5zZWNpZCk7CisJCQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHBvbCwgMCwgdGFza192YWxpZCk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtODAwLDkgKzc5Nyw3IEBACiAJCQkJCQkJCXBvbC0+c2VjdXJpdHkpOwogCQkJCWlmIChlcnIpIHsKIAkJCQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHBvbCwgMCwKLQkJCQkJCQlhdWRpdF9pbmZvLT5sb2dpbnVpZCwKLQkJCQkJCQlhdWRpdF9pbmZvLT5zZXNzaW9uaWQsCi0JCQkJCQkJYXVkaXRfaW5mby0+c2VjaWQpOworCQkJCQkJCQkgdGFza192YWxpZCk7CiAJCQkJCXJldHVybiBlcnI7CiAJCQkJfQogCQkJfQpAQCAtODEyLDE5ICs4MDcsMTkgQEAKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludAoteGZybV9wb2xpY3lfZmx1c2hfc2VjY3R4X2NoZWNrKHN0cnVjdCBuZXQgKm5ldCwgdTggdHlwZSwgc3RydWN0IHhmcm1fYXVkaXQgKmF1ZGl0X2luZm8pCit4ZnJtX3BvbGljeV9mbHVzaF9zZWNjdHhfY2hlY2soc3RydWN0IG5ldCAqbmV0LCB1OCB0eXBlLCBib29sIHRhc2tfdmFsaWQpCiB7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIAotaW50IHhmcm1fcG9saWN5X2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgdTggdHlwZSwgc3RydWN0IHhmcm1fYXVkaXQgKmF1ZGl0X2luZm8pCitpbnQgeGZybV9wb2xpY3lfZmx1c2goc3RydWN0IG5ldCAqbmV0LCB1OCB0eXBlLCBib29sIHRhc2tfdmFsaWQpCiB7CiAJaW50IGRpciwgZXJyID0gMCwgY250ID0gMDsKIAogCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAotCWVyciA9IHhmcm1fcG9saWN5X2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHR5cGUsIGF1ZGl0X2luZm8pOworCWVyciA9IHhmcm1fcG9saWN5X2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHR5cGUsIHRhc2tfdmFsaWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC04NDEsOSArODM2LDcgQEAKIAkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJY250Kys7CiAKLQkJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShwb2wsIDEsIGF1ZGl0X2luZm8tPmxvZ2ludWlkLAotCQkJCQkJIGF1ZGl0X2luZm8tPnNlc3Npb25pZCwKLQkJCQkJCSBhdWRpdF9pbmZvLT5zZWNpZCk7CisJCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUocG9sLCAxLCB0YXNrX3ZhbGlkKTsKIAogCQkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCkBAIC04NjIsMTAgKzg1NSw3IEBACiAJCQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCQkJY250Kys7CiAKLQkJCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUocG9sLCAxLAotCQkJCQkJCSBhdWRpdF9pbmZvLT5sb2dpbnVpZCwKLQkJCQkJCQkgYXVkaXRfaW5mby0+c2Vzc2lvbmlkLAotCQkJCQkJCSBhdWRpdF9pbmZvLT5zZWNpZCk7CisJCQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHBvbCwgMSwgdGFza192YWxpZCk7CiAJCQkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCiAJCQkJd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwpAQCAtMjc4MywyMSArMjc3MywxOSBAQAogc3RhdGljIGludCBfX25ldF9pbml0IHhmcm1fc3RhdGlzdGljc19pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlpbnQgcnY7Ci0KLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MsCi0JCQkgIHNpemVvZihzdHJ1Y3QgbGludXhfeGZybV9taWIpLAotCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgbGludXhfeGZybV9taWIpKSA8IDApCisJbmV0LT5taWIueGZybV9zdGF0aXN0aWNzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBsaW51eF94ZnJtX21pYik7CisJaWYgKCFuZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MpCiAJCXJldHVybiAtRU5PTUVNOwogCXJ2ID0geGZybV9wcm9jX2luaXQobmV0KTsKIAlpZiAocnYgPCAwKQotCQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnhmcm1fc3RhdGlzdGljcyk7CisJCWZyZWVfcGVyY3B1KG5ldC0+bWliLnhmcm1fc3RhdGlzdGljcyk7CiAJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZCB4ZnJtX3N0YXRpc3RpY3NfZmluaShzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJeGZybV9wcm9jX2ZpbmkobmV0KTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnhmcm1fc3RhdGlzdGljcyk7CisJZnJlZV9wZXJjcHUobmV0LT5taWIueGZybV9zdGF0aXN0aWNzKTsKIH0KICNlbHNlCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgeGZybV9zdGF0aXN0aWNzX2luaXQoc3RydWN0IG5ldCAqbmV0KQpAQCAtMjg2MiwyMSArMjg1MCwxNCBAQAogCiBzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9maW5pKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlzdHJ1Y3QgeGZybV9hdWRpdCBhdWRpdF9pbmZvOwogCXVuc2lnbmVkIGludCBzejsKIAlpbnQgZGlyOwogCiAJZmx1c2hfd29yaygmbmV0LT54ZnJtLnBvbGljeV9oYXNoX3dvcmspOwogI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKLQlhdWRpdF9pbmZvLmxvZ2ludWlkID0gSU5WQUxJRF9VSUQ7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSAodW5zaWduZWQgaW50KS0xOwotCWF1ZGl0X2luZm8uc2VjaWQgPSAwOwotCXhmcm1fcG9saWN5X2ZsdXNoKG5ldCwgWEZSTV9QT0xJQ1lfVFlQRV9TVUIsICZhdWRpdF9pbmZvKTsKKwl4ZnJtX3BvbGljeV9mbHVzaChuZXQsIFhGUk1fUE9MSUNZX1RZUEVfU1VCLCBmYWxzZSk7CiAjZW5kaWYKLQlhdWRpdF9pbmZvLmxvZ2ludWlkID0gSU5WQUxJRF9VSUQ7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSAodW5zaWduZWQgaW50KS0xOwotCWF1ZGl0X2luZm8uc2VjaWQgPSAwOwotCXhmcm1fcG9saWN5X2ZsdXNoKG5ldCwgWEZSTV9QT0xJQ1lfVFlQRV9NQUlOLCAmYXVkaXRfaW5mbyk7CisJeGZybV9wb2xpY3lfZmx1c2gobmV0LCBYRlJNX1BPTElDWV9UWVBFX01BSU4sIGZhbHNlKTsKIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm5ldC0+eGZybS5wb2xpY3lfYWxsKSk7CiAKQEAgLTI5OTEsMTUgKzI5NzIsMTQgQEAKIAl9CiB9CiAKLXZvaWQgeGZybV9hdWRpdF9wb2xpY3lfYWRkKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCByZXN1bHQsCi0JCQkgICBrdWlkX3QgYXVpZCwgdW5zaWduZWQgaW50IHNlc3Npb25pZCwgdTMyIHNlY2lkKQordm9pZCB4ZnJtX2F1ZGl0X3BvbGljeV9hZGQoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgaW50IHJlc3VsdCwgYm9vbCB0YXNrX3ZhbGlkKQogewogCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAogCWF1ZGl0X2J1ZiA9IHhmcm1fYXVkaXRfc3RhcnQoIlNQRC1hZGQiKTsKIAlpZiAoYXVkaXRfYnVmID09IE5VTEwpCiAJCXJldHVybjsKLQl4ZnJtX2F1ZGl0X2hlbHBlcl91c3JpbmZvKGF1aWQsIHNlc3Npb25pZCwgc2VjaWQsIGF1ZGl0X2J1Zik7CisJeGZybV9hdWRpdF9oZWxwZXJfdXNyaW5mbyh0YXNrX3ZhbGlkLCBhdWRpdF9idWYpOwogCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIHJlcz0ldSIsIHJlc3VsdCk7CiAJeGZybV9hdWRpdF9jb21tb25fcG9saWN5aW5mbyh4cCwgYXVkaXRfYnVmKTsKIAlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CkBAIC0zMDA3LDE0ICsyOTg3LDE0IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX2F1ZGl0X3BvbGljeV9hZGQpOwogCiB2b2lkIHhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgcmVzdWx0LAotCQkJICAgICAga3VpZF90IGF1aWQsIHVuc2lnbmVkIGludCBzZXNzaW9uaWQsIHUzMiBzZWNpZCkKKwkJCSAgICAgIGJvb2wgdGFza192YWxpZCkKIHsKIAlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAKIAlhdWRpdF9idWYgPSB4ZnJtX2F1ZGl0X3N0YXJ0KCJTUEQtZGVsZXRlIik7CiAJaWYgKGF1ZGl0X2J1ZiA9PSBOVUxMKQogCQlyZXR1cm47Ci0JeGZybV9hdWRpdF9oZWxwZXJfdXNyaW5mbyhhdWlkLCBzZXNzaW9uaWQsIHNlY2lkLCBhdWRpdF9idWYpOworCXhmcm1fYXVkaXRfaGVscGVyX3VzcmluZm8odGFza192YWxpZCwgYXVkaXRfYnVmKTsKIAlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiByZXM9JXUiLCByZXN1bHQpOwogCXhmcm1fYXVkaXRfY29tbW9uX3BvbGljeWluZm8oeHAsIGF1ZGl0X2J1Zik7CiAJYXVkaXRfbG9nX2VuZChhdWRpdF9idWYpOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wcm9jLmMgYi9uZXQveGZybS94ZnJtX3Byb2MuYwppbmRleCBmYzVhYmQwLi45YzRmYmQ4IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3Byb2MuYworKysgYi9uZXQveGZybS94ZnJtX3Byb2MuYwpAQCAtNTQsOCArNTQsNyBAQAogCWludCBpOwogCWZvciAoaSA9IDA7IHhmcm1fbWliX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjRzXHQlbHVcbiIsIHhmcm1fbWliX2xpc3RbaV0ubmFtZSwKLQkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKikKLQkJCQkJICAgbmV0LT5taWIueGZybV9zdGF0aXN0aWNzLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLnhmcm1fc3RhdGlzdGljcywKIAkJCQkJICAgeGZybV9taWJfbGlzdFtpXS5lbnRyeSkpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IDhlOWM3ODEuLjBhYjU0MTMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTQ2Myw5ICs0NjMsNyBAQAogCWlmICghZXJyKQogCQlrbV9zdGF0ZV9leHBpcmVkKHgsIDEsIDApOwogCi0JeGZybV9hdWRpdF9zdGF0ZV9kZWxldGUoeCwgZXJyID8gMCA6IDEsCi0JCQkJYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpLAotCQkJCWF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCksIDApOworCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIGVyciA/IDAgOiAxLCB0cnVlKTsKIAogb3V0OgogCXNwaW5fdW5sb2NrKCZ4LT5sb2NrKTsKQEAgLTU2Miw3ICs1NjAsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogc3RhdGljIGlubGluZSBpbnQKLXhmcm1fc3RhdGVfZmx1c2hfc2VjY3R4X2NoZWNrKHN0cnVjdCBuZXQgKm5ldCwgdTggcHJvdG8sIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKQoreGZybV9zdGF0ZV9mbHVzaF9zZWNjdHhfY2hlY2soc3RydWN0IG5ldCAqbmV0LCB1OCBwcm90bywgYm9vbCB0YXNrX3ZhbGlkKQogewogCWludCBpLCBlcnIgPSAwOwogCkBAIC01NzIsMTAgKzU3MCw3IEBACiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtpLCBieWRzdCkgewogCQkJaWYgKHhmcm1faWRfcHJvdG9fbWF0Y2goeC0+aWQucHJvdG8sIHByb3RvKSAmJgogCQkJICAgKGVyciA9IHNlY3VyaXR5X3hmcm1fc3RhdGVfZGVsZXRlKHgpKSAhPSAwKSB7Ci0JCQkJeGZybV9hdWRpdF9zdGF0ZV9kZWxldGUoeCwgMCwKLQkJCQkJCQlhdWRpdF9pbmZvLT5sb2dpbnVpZCwKLQkJCQkJCQlhdWRpdF9pbmZvLT5zZXNzaW9uaWQsCi0JCQkJCQkJYXVkaXRfaW5mby0+c2VjaWQpOworCQkJCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIDAsIHRhc2tfdmFsaWQpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0KQEAgLTU4NSwxOCArNTgwLDE4IEBACiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQKLXhmcm1fc3RhdGVfZmx1c2hfc2VjY3R4X2NoZWNrKHN0cnVjdCBuZXQgKm5ldCwgdTggcHJvdG8sIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKQoreGZybV9zdGF0ZV9mbHVzaF9zZWNjdHhfY2hlY2soc3RydWN0IG5ldCAqbmV0LCB1OCBwcm90bywgYm9vbCB0YXNrX3ZhbGlkKQogewogCXJldHVybiAwOwogfQogI2VuZGlmCiAKLWludCB4ZnJtX3N0YXRlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgdTggcHJvdG8sIHN0cnVjdCB4ZnJtX2F1ZGl0ICphdWRpdF9pbmZvKQoraW50IHhmcm1fc3RhdGVfZmx1c2goc3RydWN0IG5ldCAqbmV0LCB1OCBwcm90bywgYm9vbCB0YXNrX3ZhbGlkKQogewogCWludCBpLCBlcnIgPSAwLCBjbnQgPSAwOwogCiAJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKLQllcnIgPSB4ZnJtX3N0YXRlX2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHByb3RvLCBhdWRpdF9pbmZvKTsKKwllcnIgPSB4ZnJtX3N0YXRlX2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHByb3RvLCB0YXNrX3ZhbGlkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtNjEyLDkgKzYwNyw3IEBACiAKIAkJCQllcnIgPSB4ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKIAkJCQl4ZnJtX2F1ZGl0X3N0YXRlX2RlbGV0ZSh4LCBlcnIgPyAwIDogMSwKLQkJCQkJCQlhdWRpdF9pbmZvLT5sb2dpbnVpZCwKLQkJCQkJCQlhdWRpdF9pbmZvLT5zZXNzaW9uaWQsCi0JCQkJCQkJYXVkaXRfaW5mby0+c2VjaWQpOworCQkJCQkJCXRhc2tfdmFsaWQpOwogCQkJCXhmcm1fc3RhdGVfcHV0KHgpOwogCQkJCWlmICghZXJyKQogCQkJCQljbnQrKzsKQEAgLTIxMjgsMTQgKzIxMjEsMTAgQEAKIAogdm9pZCB4ZnJtX3N0YXRlX2Zpbmkoc3RydWN0IG5ldCAqbmV0KQogewotCXN0cnVjdCB4ZnJtX2F1ZGl0IGF1ZGl0X2luZm87CiAJdW5zaWduZWQgaW50IHN6OwogCiAJZmx1c2hfd29yaygmbmV0LT54ZnJtLnN0YXRlX2hhc2hfd29yayk7Ci0JYXVkaXRfaW5mby5sb2dpbnVpZCA9IElOVkFMSURfVUlEOwotCWF1ZGl0X2luZm8uc2Vzc2lvbmlkID0gKHVuc2lnbmVkIGludCktMTsKLQlhdWRpdF9pbmZvLnNlY2lkID0gMDsKLQl4ZnJtX3N0YXRlX2ZsdXNoKG5ldCwgSVBTRUNfUFJPVE9fQU5ZLCAmYXVkaXRfaW5mbyk7CisJeGZybV9zdGF0ZV9mbHVzaChuZXQsIElQU0VDX1BST1RPX0FOWSwgZmFsc2UpOwogCWZsdXNoX3dvcmsoJm5ldC0+eGZybS5zdGF0ZV9nY193b3JrKTsKIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm5ldC0+eGZybS5zdGF0ZV9hbGwpKTsKQEAgLTIxOTgsMzAgKzIxODcsMjggQEAKIAl9CiB9CiAKLXZvaWQgeGZybV9hdWRpdF9zdGF0ZV9hZGQoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCByZXN1bHQsCi0JCQkgIGt1aWRfdCBhdWlkLCB1bnNpZ25lZCBpbnQgc2Vzc2lvbmlkLCB1MzIgc2VjaWQpCit2b2lkIHhmcm1fYXVkaXRfc3RhdGVfYWRkKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgcmVzdWx0LCBib29sIHRhc2tfdmFsaWQpCiB7CiAJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwogCiAJYXVkaXRfYnVmID0geGZybV9hdWRpdF9zdGFydCgiU0FELWFkZCIpOwogCWlmIChhdWRpdF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXhmcm1fYXVkaXRfaGVscGVyX3VzcmluZm8oYXVpZCwgc2Vzc2lvbmlkLCBzZWNpZCwgYXVkaXRfYnVmKTsKKwl4ZnJtX2F1ZGl0X2hlbHBlcl91c3JpbmZvKHRhc2tfdmFsaWQsIGF1ZGl0X2J1Zik7CiAJeGZybV9hdWRpdF9oZWxwZXJfc2FpbmZvKHgsIGF1ZGl0X2J1Zik7CiAJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmVzdWx0KTsKIAlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX2F1ZGl0X3N0YXRlX2FkZCk7CiAKLXZvaWQgeGZybV9hdWRpdF9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCByZXN1bHQsCi0JCQkgICAgIGt1aWRfdCBhdWlkLCB1bnNpZ25lZCBpbnQgc2Vzc2lvbmlkLCB1MzIgc2VjaWQpCit2b2lkIHhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgcmVzdWx0LCBib29sIHRhc2tfdmFsaWQpCiB7CiAJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwogCiAJYXVkaXRfYnVmID0geGZybV9hdWRpdF9zdGFydCgiU0FELWRlbGV0ZSIpOwogCWlmIChhdWRpdF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXhmcm1fYXVkaXRfaGVscGVyX3VzcmluZm8oYXVpZCwgc2Vzc2lvbmlkLCBzZWNpZCwgYXVkaXRfYnVmKTsKKwl4ZnJtX2F1ZGl0X2hlbHBlcl91c3JpbmZvKHRhc2tfdmFsaWQsIGF1ZGl0X2J1Zik7CiAJeGZybV9hdWRpdF9oZWxwZXJfc2FpbmZvKHgsIGF1ZGl0X2J1Zik7CiAJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmVzdWx0KTsKIAlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IDUxMzk4YWUuLjQxMmQ5ZGMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC01OTcsOSArNTk3LDYgQEAKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAlpbnQgZXJyOwogCXN0cnVjdCBrbV9ldmVudCBjOwotCWt1aWRfdCBsb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQl1bnNpZ25lZCBpbnQgc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQl1MzIgc2lkOwogCiAJZXJyID0gdmVyaWZ5X25ld3NhX2luZm8ocCwgYXR0cnMpOwogCWlmIChlcnIpCkBAIC02MTUsOCArNjEyLDcgQEAKIAllbHNlCiAJCWVyciA9IHhmcm1fc3RhdGVfdXBkYXRlKHgpOwogCi0Jc2VjdXJpdHlfdGFza19nZXRzZWNpZChjdXJyZW50LCAmc2lkKTsKLQl4ZnJtX2F1ZGl0X3N0YXRlX2FkZCh4LCBlcnIgPyAwIDogMSwgbG9naW51aWQsIHNlc3Npb25pZCwgc2lkKTsKKwl4ZnJtX2F1ZGl0X3N0YXRlX2FkZCh4LCBlcnIgPyAwIDogMSwgdHJ1ZSk7CiAKIAlpZiAoZXJyIDwgMCkgewogCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfREVBRDsKQEAgLTY3Niw5ICs2NzIsNiBAQAogCWludCBlcnIgPSAtRVNSQ0g7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAJc3RydWN0IHhmcm1fdXNlcnNhX2lkICpwID0gbmxtc2dfZGF0YShubGgpOwotCWt1aWRfdCBsb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQl1bnNpZ25lZCBpbnQgc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQl1MzIgc2lkOwogCiAJeCA9IHhmcm1fdXNlcl9zdGF0ZV9sb29rdXAobmV0LCBwLCBhdHRycywgJmVycik7CiAJaWYgKHggPT0gTlVMTCkKQEAgLTcwMyw4ICs2OTYsNyBAQAogCWttX3N0YXRlX25vdGlmeSh4LCAmYyk7CiAKIG91dDoKLQlzZWN1cml0eV90YXNrX2dldHNlY2lkKGN1cnJlbnQsICZzaWQpOwotCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIGVyciA/IDAgOiAxLCBsb2dpbnVpZCwgc2Vzc2lvbmlkLCBzaWQpOworCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIGVyciA/IDAgOiAxLCB0cnVlKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtOTU1LDYgKzk0NywyMCBAQAogCXJldHVybiBza2I7CiB9CiAKKy8qIEEgd3JhcHBlciBmb3Igbmxtc2dfbXVsdGljYXN0KCkgY2hlY2tpbmcgdGhhdCBubHNrIGlzIHN0aWxsIGF2YWlsYWJsZS4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggUkNVIHJlYWQgbG9jay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgeGZybV9ubG1zZ19tdWx0aWNhc3Qoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICB1MzIgcGlkLCB1bnNpZ25lZCBpbnQgZ3JvdXApCit7CisJc3RydWN0IHNvY2sgKm5sc2sgPSByY3VfZGVyZWZlcmVuY2UobmV0LT54ZnJtLm5sc2spOworCisJaWYgKG5sc2spCisJCXJldHVybiBubG1zZ19tdWx0aWNhc3Qobmxzaywgc2tiLCBwaWQsIGdyb3VwLCBHRlBfQVRPTUlDKTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKwogc3RhdGljIGlubGluZSBzaXplX3QgeGZybV9zcGRpbmZvX21zZ3NpemUodm9pZCkKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oNCkKQEAgLTE0MTQsOSArMTQyMCw2IEBACiAJc3RydWN0IGttX2V2ZW50IGM7CiAJaW50IGVycjsKIAlpbnQgZXhjbDsKLQlrdWlkX3QgbG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JdW5zaWduZWQgaW50IHNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JdTMyIHNpZDsKIAogCWVyciA9IHZlcmlmeV9uZXdwb2xpY3lfaW5mbyhwKTsKIAlpZiAoZXJyKQpAQCAtMTQzNSw4ICsxNDM4LDcgQEAKIAkgKiBhIHR5cGUgWEZSTV9NU0dfVVBEUE9MSUNZIC0gSkhTICovCiAJZXhjbCA9IG5saC0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ORVdQT0xJQ1k7CiAJZXJyID0geGZybV9wb2xpY3lfaW5zZXJ0KHAtPmRpciwgeHAsIGV4Y2wpOwotCXNlY3VyaXR5X3Rhc2tfZ2V0c2VjaWQoY3VycmVudCwgJnNpZCk7Ci0JeGZybV9hdWRpdF9wb2xpY3lfYWRkKHhwLCBlcnIgPyAwIDogMSwgbG9naW51aWQsIHNlc3Npb25pZCwgc2lkKTsKKwl4ZnJtX2F1ZGl0X3BvbGljeV9hZGQoeHAsIGVyciA/IDAgOiAxLCB0cnVlKTsKIAogCWlmIChlcnIpIHsKIAkJc2VjdXJpdHlfeGZybV9wb2xpY3lfZnJlZSh4cC0+c2VjdXJpdHkpOwpAQCAtMTY3MywxMyArMTY3NSw3IEBACiAJCQkJCSAgICBORVRMSU5LX0NCKHNrYikucG9ydGlkKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWt1aWRfdCBsb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQkJdW5zaWduZWQgaW50IHNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JCXUzMiBzaWQ7Ci0KLQkJc2VjdXJpdHlfdGFza19nZXRzZWNpZChjdXJyZW50LCAmc2lkKTsKLQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHhwLCBlcnIgPyAwIDogMSwgbG9naW51aWQsIHNlc3Npb25pZCwKLQkJCQkJIHNpZCk7CisJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZSh4cCwgZXJyID8gMCA6IDEsIHRydWUpOwogCiAJCWlmIChlcnIgIT0gMCkKIAkJCWdvdG8gb3V0OwpAQCAtMTcwNCwxMyArMTcwMCw5IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAJc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoICpwID0gbmxtc2dfZGF0YShubGgpOwotCXN0cnVjdCB4ZnJtX2F1ZGl0IGF1ZGl0X2luZm87CiAJaW50IGVycjsKIAotCWF1ZGl0X2luZm8ubG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOwotCXNlY3VyaXR5X3Rhc2tfZ2V0c2VjaWQoY3VycmVudCwgJmF1ZGl0X2luZm8uc2VjaWQpOwotCWVyciA9IHhmcm1fc3RhdGVfZmx1c2gobmV0LCBwLT5wcm90bywgJmF1ZGl0X2luZm8pOworCWVyciA9IHhmcm1fc3RhdGVfZmx1c2gobmV0LCBwLT5wcm90bywgdHJ1ZSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FU1JDSCkgLyogZW1wdHkgdGFibGUgKi8KIAkJCXJldHVybiAwOwpAQCAtMTg5NCwxNiArMTg4NiwxMiBAQAogCXN0cnVjdCBrbV9ldmVudCBjOwogCXU4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CiAJaW50IGVycjsKLQlzdHJ1Y3QgeGZybV9hdWRpdCBhdWRpdF9pbmZvOwogCiAJZXJyID0gY29weV9mcm9tX3VzZXJfcG9saWN5X3R5cGUoJnR5cGUsIGF0dHJzKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JYXVkaXRfaW5mby5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0Jc2VjdXJpdHlfdGFza19nZXRzZWNpZChjdXJyZW50LCAmYXVkaXRfaW5mby5zZWNpZCk7Ci0JZXJyID0geGZybV9wb2xpY3lfZmx1c2gobmV0LCB0eXBlLCAmYXVkaXRfaW5mbyk7CisJZXJyID0geGZybV9wb2xpY3lfZmx1c2gobmV0LCB0eXBlLCB0cnVlKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVTUkNIKSAvKiBlbXB0eSB0YWJsZSAqLwogCQkJcmV0dXJuIDA7CkBAIC0xOTY5LDE0ICsxOTU3LDggQEAKIAogCWVyciA9IDA7CiAJaWYgKHVwLT5oYXJkKSB7Ci0JCWt1aWRfdCBsb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQkJdW5zaWduZWQgaW50IHNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JCXUzMiBzaWQ7Ci0KLQkJc2VjdXJpdHlfdGFza19nZXRzZWNpZChjdXJyZW50LCAmc2lkKTsKIAkJeGZybV9wb2xpY3lfZGVsZXRlKHhwLCBwLT5kaXIpOwotCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUoeHAsIDEsIGxvZ2ludWlkLCBzZXNzaW9uaWQsIHNpZCk7Ci0KKwkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHhwLCAxLCB0cnVlKTsKIAl9IGVsc2UgewogCQkvLyByZXNldCB0aGUgdGltZXJzIGhlcmU/CiAJCVdBUk4oMSwgIkRvbnQga25vdyB3aGF0IHRvIGRvIHdpdGggc29mdCBwb2xpY3kgZXhwaXJlXG4iKTsKQEAgLTIwMTIsMTMgKzE5OTQsOCBAQAogCWttX3N0YXRlX2V4cGlyZWQoeCwgdWUtPmhhcmQsIG5saC0+bmxtc2dfcGlkKTsKIAogCWlmICh1ZS0+aGFyZCkgewotCQlrdWlkX3QgbG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JCXVuc2lnbmVkIGludCBzZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOwotCQl1MzIgc2lkOwotCi0JCXNlY3VyaXR5X3Rhc2tfZ2V0c2VjaWQoY3VycmVudCwgJnNpZCk7CiAJCV9feGZybV9zdGF0ZV9kZWxldGUoeCk7Ci0JCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIDEsIGxvZ2ludWlkLCBzZXNzaW9uaWQsIHNpZCk7CisJCXhmcm1fYXVkaXRfc3RhdGVfZGVsZXRlKHgsIDEsIHRydWUpOwogCX0KIAllcnIgPSAwOwogb3V0OgpAQCAtMjI2NSw3ICsyMjQyLDcgQEAKIAlpZiAoYnVpbGRfbWlncmF0ZShza2IsIG0sIG51bV9taWdyYXRlLCBrLCBzZWwsIGRpciwgdHlwZSkgPCAwKQogCQlCVUcoKTsKIAotCXJldHVybiBubG1zZ19tdWx0aWNhc3QobmV0LT54ZnJtLm5sc2ssIHNrYiwgMCwgWEZSTU5MR1JQX01JR1JBVEUsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX01JR1JBVEUpOwogfQogI2Vsc2UKIHN0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoY29uc3Qgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLApAQCAtMjQ1Niw3ICsyNDMzLDcgQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKLQlyZXR1cm4gbmxtc2dfbXVsdGljYXN0KG5ldC0+eGZybS5ubHNrLCBza2IsIDAsIFhGUk1OTEdSUF9FWFBJUkUsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX0VYUElSRSk7CiB9CiAKIHN0YXRpYyBpbnQgeGZybV9hZXZlbnRfc3RhdGVfbm90aWZ5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpCkBAIC0yNDcxLDcgKzI0NDgsNyBAQAogCWlmIChidWlsZF9hZXZlbnQoc2tiLCB4LCBjKSA8IDApCiAJCUJVRygpOwogCi0JcmV0dXJuIG5sbXNnX211bHRpY2FzdChuZXQtPnhmcm0ubmxzaywgc2tiLCAwLCBYRlJNTkxHUlBfQUVWRU5UUywgR0ZQX0FUT01JQyk7CisJcmV0dXJuIHhmcm1fbmxtc2dfbXVsdGljYXN0KG5ldCwgc2tiLCAwLCBYRlJNTkxHUlBfQUVWRU5UUyk7CiB9CiAKIHN0YXRpYyBpbnQgeGZybV9ub3RpZnlfc2FfZmx1c2goY29uc3Qgc3RydWN0IGttX2V2ZW50ICpjKQpAQCAtMjQ5Nyw3ICsyNDc0LDcgQEAKIAogCW5sbXNnX2VuZChza2IsIG5saCk7CiAKLQlyZXR1cm4gbmxtc2dfbXVsdGljYXN0KG5ldC0+eGZybS5ubHNrLCBza2IsIDAsIFhGUk1OTEdSUF9TQSwgR0ZQX0FUT01JQyk7CisJcmV0dXJuIHhmcm1fbmxtc2dfbXVsdGljYXN0KG5ldCwgc2tiLCAwLCBYRlJNTkxHUlBfU0EpOwogfQogCiBzdGF0aWMgaW5saW5lIHNpemVfdCB4ZnJtX3NhX2xlbihzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKQEAgLTI1ODQsNyArMjU2MSw3IEBACiAKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCi0JcmV0dXJuIG5sbXNnX211bHRpY2FzdChuZXQtPnhmcm0ubmxzaywgc2tiLCAwLCBYRlJNTkxHUlBfU0EsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX1NBKTsKIAogb3V0X2ZyZWVfc2tiOgogCWtmcmVlX3NrYihza2IpOwpAQCAtMjY3NSw3ICsyNjUyLDcgQEAKIAlpZiAoYnVpbGRfYWNxdWlyZShza2IsIHgsIHh0LCB4cCkgPCAwKQogCQlCVUcoKTsKIAotCXJldHVybiBubG1zZ19tdWx0aWNhc3QobmV0LT54ZnJtLm5sc2ssIHNrYiwgMCwgWEZSTU5MR1JQX0FDUVVJUkUsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX0FDUVVJUkUpOwogfQogCiAvKiBVc2VyIGdpdmVzIHVzIHhmcm1fdXNlcl9wb2xpY3lfaW5mbyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZiAwCkBAIC0yNzg5LDcgKzI3NjYsNyBAQAogCWlmIChidWlsZF9wb2xleHBpcmUoc2tiLCB4cCwgZGlyLCBjKSA8IDApCiAJCUJVRygpOwogCi0JcmV0dXJuIG5sbXNnX211bHRpY2FzdChuZXQtPnhmcm0ubmxzaywgc2tiLCAwLCBYRlJNTkxHUlBfRVhQSVJFLCBHRlBfQVRPTUlDKTsKKwlyZXR1cm4geGZybV9ubG1zZ19tdWx0aWNhc3QobmV0LCBza2IsIDAsIFhGUk1OTEdSUF9FWFBJUkUpOwogfQogCiBzdGF0aWMgaW50IHhmcm1fbm90aWZ5X3BvbGljeShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyLCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpCkBAIC0yODUxLDcgKzI4MjgsNyBAQAogCiAJbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAotCXJldHVybiBubG1zZ19tdWx0aWNhc3QobmV0LT54ZnJtLm5sc2ssIHNrYiwgMCwgWEZSTU5MR1JQX1BPTElDWSwgR0ZQX0FUT01JQyk7CisJcmV0dXJuIHhmcm1fbmxtc2dfbXVsdGljYXN0KG5ldCwgc2tiLCAwLCBYRlJNTkxHUlBfUE9MSUNZKTsKIAogb3V0X2ZyZWVfc2tiOgogCWtmcmVlX3NrYihza2IpOwpAQCAtMjg3OSw3ICsyODU2LDcgQEAKIAogCW5sbXNnX2VuZChza2IsIG5saCk7CiAKLQlyZXR1cm4gbmxtc2dfbXVsdGljYXN0KG5ldC0+eGZybS5ubHNrLCBza2IsIDAsIFhGUk1OTEdSUF9QT0xJQ1ksIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX1BPTElDWSk7CiAKIG91dF9mcmVlX3NrYjoKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTI5NDgsNyArMjkyNSw3IEBACiAJaWYgKGJ1aWxkX3JlcG9ydChza2IsIHByb3RvLCBzZWwsIGFkZHIpIDwgMCkKIAkJQlVHKCk7CiAKLQlyZXR1cm4gbmxtc2dfbXVsdGljYXN0KG5ldC0+eGZybS5ubHNrLCBza2IsIDAsIFhGUk1OTEdSUF9SRVBPUlQsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX1JFUE9SVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90IHhmcm1fbWFwcGluZ19tc2dzaXplKHZvaWQpCkBAIC0zMDAwLDcgKzI5NzcsNyBAQAogCWlmIChidWlsZF9tYXBwaW5nKHNrYiwgeCwgaXBhZGRyLCBzcG9ydCkgPCAwKQogCQlCVUcoKTsKIAotCXJldHVybiBubG1zZ19tdWx0aWNhc3QobmV0LT54ZnJtLm5sc2ssIHNrYiwgMCwgWEZSTU5MR1JQX01BUFBJTkcsIEdGUF9BVE9NSUMpOworCXJldHVybiB4ZnJtX25sbXNnX211bHRpY2FzdChuZXQsIHNrYiwgMCwgWEZSTU5MR1JQX01BUFBJTkcpOwogfQogCiBzdGF0aWMgYm9vbCB4ZnJtX2lzX2FsaXZlKGNvbnN0IHN0cnVjdCBrbV9ldmVudCAqYykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUgYi9zY3JpcHRzL01ha2VmaWxlCmluZGV4IDFkMDc4NjAuLjg5MGRmNWMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9NYWtlZmlsZQpAQCAtMzksNCArMzksNCBAQAogc3ViZGlyLSQoQ09ORklHX0RUQykgICAgICAgICArPSBkdGMKIAogIyBMZXQgY2xlYW4gZGVzY2VuZCBpbnRvIHN1YmRpcnMKLXN1YmRpci0JKz0gYmFzaWMga2NvbmZpZyBwYWNrYWdlIHNlbGludXgKK3N1YmRpci0JKz0gYmFzaWMga2NvbmZpZyBwYWNrYWdlCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljIGIvc2NyaXB0cy9NYWtlZmlsZS5hc20tZ2VuZXJpYwppbmRleCBkMTdlMGVhLi4wNDVlMDA5OCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5hc20tZ2VuZXJpYworKysgYi9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljCkBAIC0yMSw0ICsyMSwzIEBACiAKICQob2JqKS8lLmg6CiAJJChjYWxsIGNtZCx3cmFwKQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAppbmRleCAwMDNiYzI2Li5iZjNlNjc3IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTUwLDY3ICs1MCw2IEBACiAgICAgICAgIGVuZGlmCiBlbmRpZgogCi0jCi0jIG1ha2UgVz0uLi4gc2V0dGluZ3MKLSMKLSMgVz0xIC0gd2FybmluZ3MgdGhhdCBtYXkgYmUgcmVsZXZhbnQgYW5kIGRvZXMgbm90IG9jY3VyIHRvbyBvZnRlbgotIyBXPTIgLSB3YXJuaW5ncyB0aGF0IG9jY3VyIHF1aXRlIG9mdGVuIGJ1dCBtYXkgc3RpbGwgYmUgcmVsZXZhbnQKLSMgVz0zIC0gdGhlIG1vcmUgb2JzY3VyZSB3YXJuaW5ncywgY2FuIG1vc3QgbGlrZWx5IGJlIGlnbm9yZWQKLSMKLSMgJChjYWxsIGNjLW9wdGlvbiwgLVcuLi4pIGhhbmRsZXMgZ2NjIC1XLi4gb3B0aW9ucyB3aGljaAotIyBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyCi1pZmRlZiBLQlVJTERfRU5BQkxFX0VYVFJBX0dDQ19DSEVDS1MKLXdhcm5pbmctICA6PSAkKGVtcHR5KQotCi13YXJuaW5nLTEgOj0gLVdleHRyYSAtV3VudXNlZCAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLXdhcm5pbmctMSArPSAtV21pc3NpbmctZGVjbGFyYXRpb25zCi13YXJuaW5nLTEgKz0gLVdtaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGUKLXdhcm5pbmctMSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV21pc3NpbmctcHJvdG90eXBlcykKLXdhcm5pbmctMSArPSAtV29sZC1zdHlsZS1kZWZpbml0aW9uCi13YXJuaW5nLTEgKz0gJChjYWxsIGNjLW9wdGlvbiwgLVdtaXNzaW5nLWluY2x1ZGUtZGlycykKLXdhcm5pbmctMSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlKQotd2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIG1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzKQotCi0jIENsYW5nCi13YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgaW5pdGlhbGl6ZXItb3ZlcnJpZGVzKQotd2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIHVudXNlZC12YWx1ZSkKLXdhcm5pbmctMSArPSAkKGNhbGwgY2MtZGlzYWJsZS13YXJuaW5nLCBmb3JtYXQpCi13YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgdW5rbm93bi13YXJuaW5nLW9wdGlvbikKLXdhcm5pbmctMSArPSAkKGNhbGwgY2MtZGlzYWJsZS13YXJuaW5nLCBzaWduLWNvbXBhcmUpCi13YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgZm9ybWF0LXplcm8tbGVuZ3RoKQotd2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIHVuaW5pdGlhbGl6ZWQpCi13YXJuaW5nLTEgKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IpCi0KLXdhcm5pbmctMiA6PSAtV2FnZ3JlZ2F0ZS1yZXR1cm4KLXdhcm5pbmctMiArPSAtV2Nhc3QtYWxpZ24KLXdhcm5pbmctMiArPSAtV2Rpc2FibGVkLW9wdGltaXphdGlvbgotd2FybmluZy0yICs9IC1XbmVzdGVkLWV4dGVybnMKLXdhcm5pbmctMiArPSAtV3NoYWRvdwotd2FybmluZy0yICs9ICQoY2FsbCBjYy1vcHRpb24sIC1XbG9naWNhbC1vcCkKLXdhcm5pbmctMiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzKQotCi13YXJuaW5nLTMgOj0gLVdiYWQtZnVuY3Rpb24tY2FzdAotd2FybmluZy0zICs9IC1XY2FzdC1xdWFsCi13YXJuaW5nLTMgKz0gLVdjb252ZXJzaW9uCi13YXJuaW5nLTMgKz0gLVdwYWNrZWQKLXdhcm5pbmctMyArPSAtV3BhZGRlZAotd2FybmluZy0zICs9IC1XcG9pbnRlci1hcml0aAotd2FybmluZy0zICs9IC1XcmVkdW5kYW50LWRlY2xzCi13YXJuaW5nLTMgKz0gLVdzd2l0Y2gtZGVmYXVsdAotd2FybmluZy0zICs9ICQoY2FsbCBjYy1vcHRpb24sIC1XcGFja2VkLWJpdGZpZWxkLWNvbXBhdCkKLXdhcm5pbmctMyArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV3ZsYSkKLQotd2FybmluZyA6PSAkKHdhcm5pbmctJChmaW5kc3RyaW5nIDEsICQoS0JVSUxEX0VOQUJMRV9FWFRSQV9HQ0NfQ0hFQ0tTKSkpCi13YXJuaW5nICs9ICQod2FybmluZy0kKGZpbmRzdHJpbmcgMiwgJChLQlVJTERfRU5BQkxFX0VYVFJBX0dDQ19DSEVDS1MpKSkKLXdhcm5pbmcgKz0gJCh3YXJuaW5nLSQoZmluZHN0cmluZyAzLCAkKEtCVUlMRF9FTkFCTEVfRVhUUkFfR0NDX0NIRUNLUykpKQotCi1pZmVxICgiJChzdHJpcCAkKHdhcm5pbmcpKSIsIiIpCi0gICAgICAgICQoZXJyb3IgVz0kKEtCVUlMRF9FTkFCTEVfRVhUUkFfR0NDX0NIRUNLUykgaXMgdW5rbm93bikKLWVuZGlmCi0KLUtCVUlMRF9DRkxBR1MgKz0gJCh3YXJuaW5nKQotZW5kaWYKLQogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgogCiBpZmRlZiBob3N0LXByb2dzCkBAIC0zNDIsNyArMjgxLDcgQEAKICQocmVhbC1vYmpzLW06Lm89LnMpOiBtb2RrZXJuX2FmbGFncyA6PSAkKEtCVUlMRF9BRkxBR1NfTU9EVUxFKSAkKEFGTEFHU19NT0RVTEUpCiAKIHF1aWV0X2NtZF9hc19zX1MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACi1jbWRfYXNfc19TICAgICAgID0gJChDUFApICQoYV9mbGFncykgICAtbyAkQCAkPCAKK2NtZF9hc19zX1MgICAgICAgPSAkKENQUCkgJChhX2ZsYWdzKSAgIC1vICRAICQ8CiAKICQob2JqKS8lLnM6ICQoc3JjKS8lLlMgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfc19TKQpAQCAtNDM2LDcgKzM3NSw3IEBACiAkKGZpbHRlciAkKGFkZHByZWZpeCAkKG9iaikvLCAgICAgICAgIFwKICQoJChzdWJzdCAkKG9iaikvLCwkKEA6Lm89LW9ianMpKSkgICAgXAogJCgkKHN1YnN0ICQob2JqKS8sLCQoQDoubz0teSkpKSksICReKQotIAorCiBxdWlldF9jbWRfbGlua19tdWx0aS15ID0gTEQgICAgICAkQAogY21kX2xpbmtfbXVsdGkteSA9ICQoTEQpICQobGRfZmxhZ3MpIC1yIC1vICRAICQobGlua19tdWx0aV9kZXBzKSAkKGNtZF9zZWNhbmFseXNpcykKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5leHRyYXdhcm4gYi9zY3JpcHRzL01ha2VmaWxlLmV4dHJhd2FybgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTY0MzUwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5leHRyYXdhcm4KQEAgLTAsMCArMSw2NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBtYWtlIFc9Li4uIHNldHRpbmdzCisjCisjIFc9MSAtIHdhcm5pbmdzIHRoYXQgbWF5IGJlIHJlbGV2YW50IGFuZCBkb2VzIG5vdCBvY2N1ciB0b28gb2Z0ZW4KKyMgVz0yIC0gd2FybmluZ3MgdGhhdCBvY2N1ciBxdWl0ZSBvZnRlbiBidXQgbWF5IHN0aWxsIGJlIHJlbGV2YW50CisjIFc9MyAtIHRoZSBtb3JlIG9ic2N1cmUgd2FybmluZ3MsIGNhbiBtb3N0IGxpa2VseSBiZSBpZ25vcmVkCisjCisjICQoY2FsbCBjYy1vcHRpb24sIC1XLi4uKSBoYW5kbGVzIGdjYyAtVy4uIG9wdGlvbnMgd2hpY2gKKyMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHZlcnNpb25zIG9mIHRoZSBjb21waWxlcgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZmVxICgiJChvcmlnaW4gVykiLCAiY29tbWFuZCBsaW5lIikKKyAgZXhwb3J0IEtCVUlMRF9FTkFCTEVfRVhUUkFfR0NDX0NIRUNLUyA6PSAkKFcpCitlbmRpZgorCitpZmRlZiBLQlVJTERfRU5BQkxFX0VYVFJBX0dDQ19DSEVDS1MKK3dhcm5pbmctICA6PSAkKGVtcHR5KQorCit3YXJuaW5nLTEgOj0gLVdleHRyYSAtV3VudXNlZCAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK3dhcm5pbmctMSArPSAtV21pc3NpbmctZGVjbGFyYXRpb25zCit3YXJuaW5nLTEgKz0gLVdtaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGUKK3dhcm5pbmctMSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV21pc3NpbmctcHJvdG90eXBlcykKK3dhcm5pbmctMSArPSAtV29sZC1zdHlsZS1kZWZpbml0aW9uCit3YXJuaW5nLTEgKz0gJChjYWxsIGNjLW9wdGlvbiwgLVdtaXNzaW5nLWluY2x1ZGUtZGlycykKK3dhcm5pbmctMSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlKQord2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIG1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzKQorCisjIENsYW5nCit3YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgaW5pdGlhbGl6ZXItb3ZlcnJpZGVzKQord2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIHVudXNlZC12YWx1ZSkKK3dhcm5pbmctMSArPSAkKGNhbGwgY2MtZGlzYWJsZS13YXJuaW5nLCBmb3JtYXQpCit3YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgdW5rbm93bi13YXJuaW5nLW9wdGlvbikKK3dhcm5pbmctMSArPSAkKGNhbGwgY2MtZGlzYWJsZS13YXJuaW5nLCBzaWduLWNvbXBhcmUpCit3YXJuaW5nLTEgKz0gJChjYWxsIGNjLWRpc2FibGUtd2FybmluZywgZm9ybWF0LXplcm8tbGVuZ3RoKQord2FybmluZy0xICs9ICQoY2FsbCBjYy1kaXNhYmxlLXdhcm5pbmcsIHVuaW5pdGlhbGl6ZWQpCit3YXJuaW5nLTEgKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IpCisKK3dhcm5pbmctMiA6PSAtV2FnZ3JlZ2F0ZS1yZXR1cm4KK3dhcm5pbmctMiArPSAtV2Nhc3QtYWxpZ24KK3dhcm5pbmctMiArPSAtV2Rpc2FibGVkLW9wdGltaXphdGlvbgord2FybmluZy0yICs9IC1XbmVzdGVkLWV4dGVybnMKK3dhcm5pbmctMiArPSAtV3NoYWRvdword2FybmluZy0yICs9ICQoY2FsbCBjYy1vcHRpb24sIC1XbG9naWNhbC1vcCkKK3dhcm5pbmctMiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzKQorCit3YXJuaW5nLTMgOj0gLVdiYWQtZnVuY3Rpb24tY2FzdAord2FybmluZy0zICs9IC1XY2FzdC1xdWFsCit3YXJuaW5nLTMgKz0gLVdjb252ZXJzaW9uCit3YXJuaW5nLTMgKz0gLVdwYWNrZWQKK3dhcm5pbmctMyArPSAtV3BhZGRlZAord2FybmluZy0zICs9IC1XcG9pbnRlci1hcml0aAord2FybmluZy0zICs9IC1XcmVkdW5kYW50LWRlY2xzCit3YXJuaW5nLTMgKz0gLVdzd2l0Y2gtZGVmYXVsdAord2FybmluZy0zICs9ICQoY2FsbCBjYy1vcHRpb24sIC1XcGFja2VkLWJpdGZpZWxkLWNvbXBhdCkKK3dhcm5pbmctMyArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtV3ZsYSkKKword2FybmluZyA6PSAkKHdhcm5pbmctJChmaW5kc3RyaW5nIDEsICQoS0JVSUxEX0VOQUJMRV9FWFRSQV9HQ0NfQ0hFQ0tTKSkpCit3YXJuaW5nICs9ICQod2FybmluZy0kKGZpbmRzdHJpbmcgMiwgJChLQlVJTERfRU5BQkxFX0VYVFJBX0dDQ19DSEVDS1MpKSkKK3dhcm5pbmcgKz0gJCh3YXJuaW5nLSQoZmluZHN0cmluZyAzLCAkKEtCVUlMRF9FTkFCTEVfRVhUUkFfR0NDX0NIRUNLUykpKQorCitpZmVxICgiJChzdHJpcCAkKHdhcm5pbmcpKSIsIiIpCisgICAgICAgICQoZXJyb3IgVz0kKEtCVUlMRF9FTkFCTEVfRVhUUkFfR0NDX0NIRUNLUykgaXMgdW5rbm93bikKK2VuZGlmCisKK0tCVUlMRF9DRkxBR1MgKz0gJCh3YXJuaW5nKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuZndpbnN0IGIvc2NyaXB0cy9NYWtlZmlsZS5md2luc3QKaW5kZXggNGQ5MDhkMS4uZDhlMzM1ZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5md2luc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5md2luc3QKQEAgLTE4LDMxICsxOCwyOSBAQAogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmhvc3QKIAogbW9kLWZ3IDo9ICQoZnctc2hpcHBlZC1tKQotIyBJZiBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzbid0IHNldCwgdGhlbiBpbnN0YWxsIHRoZSAKKyMgSWYgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpc24ndCBzZXQsIHRoZW4gaW5zdGFsbCB0aGUKICMgZmlybXdhcmUgZm9yIGluLWtlcm5lbCBkcml2ZXJzIHRvby4KIGlmbmRlZiBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMCiBtb2QtZncgKz0gJChmdy1zaGlwcGVkLXkpCiBlbmRpZgogCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisjIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKK19kdW1teSA6PSAkKHNoZWxsIFsgLWQgJChvYmopIF0gfHwgbWtkaXIgLXAgJChvYmopKQorCitmaXJtd2FyZS1kaXJzIDo9ICQoc29ydCAkKGFkZHByZWZpeCAkKG9ianRyZWUpLyQob2JqKS8sJChkaXIgJChmdy1leHRlcm5hbC15KSAkKGZ3LXNoaXBwZWQtYWxsKSkpKQorIyBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIGZpcm13YXJlIGluIHN1YmRpcmVjdG9yaWVzCitfZHVtbXkgOj0gJChmb3JlYWNoIGQsJChmaXJtd2FyZS1kaXJzKSwgJChzaGVsbCBbIC1kICQoZCkgXSB8fCBta2RpciAtcCAkKGQpKSkKK2VuZGlmCisKIGluc3RhbGxlZC1tb2QtZncgOj0gJChhZGRwcmVmaXggJChJTlNUQUxMX0ZXX1BBVEgpLywkKG1vZC1mdykpCiAKIGluc3RhbGxlZC1mdyA6PSAkKGFkZHByZWZpeCAkKElOU1RBTExfRldfUEFUSCkvLCQoZnctc2hpcHBlZC1hbGwpKQotaW5zdGFsbGVkLWZ3LWRpcnMgOj0gJChzb3J0ICQoZGlyICQoaW5zdGFsbGVkLWZ3KSkpICQoSU5TVEFMTF9GV19QQVRIKS8uLwotCi0jIFdvcmthcm91bmQgZm9yIG1ha2UgPCAzLjgxLCB3aGVyZSAuU0VDT05ERVhQQU5TSU9OIGRvZXNuJ3Qgd29yay4KLVBIT05ZICs9ICQoSU5TVEFMTF9GV19QQVRIKS8kJCglKSBpbnN0YWxsLWFsbC1kaXJzCi0kKElOU1RBTExfRldfUEFUSCkvJCQoJSk6IGluc3RhbGwtYWxsLWRpcnMKLQlAdHJ1ZQotaW5zdGFsbC1hbGwtZGlyczogJChpbnN0YWxsZWQtZnctZGlycykKLQlAdHJ1ZQogCiBxdWlldF9jbWRfaW5zdGFsbCA9IElOU1RBTEwgJChzdWJzdCAkKHNyY3RyZWUpLywsJEApCi0gICAgICBjbWRfaW5zdGFsbCA9ICQoSU5TVEFMTCkgLW0wNjQ0ICQ8ICRACisgICAgICBjbWRfaW5zdGFsbCA9IG1rZGlyIC1wICQoQEQpOyAkKElOU1RBTEwpIC1tMDY0NCAkPCAkQAogCi0kKGluc3RhbGxlZC1mdy1kaXJzKToKLQkkKGNhbGwgY21kLG1rZGlyKQotCi0kKGluc3RhbGxlZC1mdyk6ICQoSU5TVEFMTF9GV19QQVRIKS8lOiAkKG9iaikvJSB8ICQoSU5TVEFMTF9GV19QQVRIKS8kJChkaXIgJSkKKyQoaW5zdGFsbGVkLWZ3KTogJChJTlNUQUxMX0ZXX1BBVEgpLyU6ICQob2JqKS8lCiAJJChjYWxsIGNtZCxpbnN0YWxsKQogCiBQSE9OWSArPSAgX19md19pbnN0YWxsIF9fZndfbW9kaW5zdCBGT1JDRQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5ob3N0IGIvc2NyaXB0cy9NYWtlZmlsZS5ob3N0CmluZGV4IDFhYzQxNGYuLjY2ODkzNjQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuaG9zdAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKQEAgLTE2Niw1ICsxNjYsNCBAQAogCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY3NobGliKQogCiB0YXJnZXRzICs9ICQoaG9zdC1jc2luZ2xlKSAgJChob3N0LWNtdWx0aSkgJChob3N0LWNvYmpzKVwKLQkgICAkKGhvc3QtY3h4bXVsdGkpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSAkKGhvc3QtY3Nob2JqcykgCi0KKwkgICAkKGhvc3QtY3h4bXVsdGkpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSAkKGhvc3QtY3Nob2JqcykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggNmE1YjBkZS4uMjYwYmY4YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTI3LDcgKzI3LDcgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmoteSksIHJlcGxhY2UgaXQgYnkgZm9vL2J1aWx0LWluLm8KICMgICBhbmQgYWRkIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlycyB0byBkZXNjZW5kIGludG86ICQoc3ViZGlyLXkpCi0jIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmotbSksIHJlbW92ZSBpdCBmcm9tICQob2JqLW0pIAorIyBvIGlmIHdlIGVuY291bnRlciBmb28vIGluICQob2JqLW0pLCByZW1vdmUgaXQgZnJvbSAkKG9iai1tKQogIyAgIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJzIHRvIGRlc2NlbmQgaW50bzogJChzdWJkaXItbSkKIAogIyBEZXRlcm1pbmUgbW9kb3JkZXIuCkBAIC00Niw3ICs0Niw3IEBACiAKIHN1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCiAKLSMgaWYgJChmb28tb2JqcykgZXhpc3RzLCBmb28ubyBpcyBhIGNvbXBvc2l0ZSBvYmplY3QgCisjIGlmICQoZm9vLW9ianMpIGV4aXN0cywgZm9vLm8gaXMgYSBjb21wb3NpdGUgb2JqZWN0CiBtdWx0aS11c2VkLXkgOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQob2JqLXkpLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwgJChtKSkpKQogbXVsdGktdXNlZC1tIDo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKG9iai1tKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksICQobSkpKSkKIG11bHRpLXVzZWQgICA6PSAkKG11bHRpLXVzZWQteSkgJChtdWx0aS11c2VkLW0pCkBAIC05MSw3ICs5MSw3IEBACiAKICMgVGhlc2UgZmxhZ3MgYXJlIG5lZWRlZCBmb3IgbW9kdmVyc2lvbnMgYW5kIGNvbXBpbGluZywgc28gd2UgZGVmaW5lIHRoZW0gaGVyZQogIyBhbHJlYWR5Ci0jICQobW9kbmFtZV9mbGFncykgI2RlZmluZXMgS0JVSUxEX01PRE5BTUUgYXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpdCB3aWxsIAorIyAkKG1vZG5hbWVfZmxhZ3MpICNkZWZpbmVzIEtCVUlMRF9NT0ROQU1FIGFzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXQgd2lsbAogIyBlbmQgdXAgaW4gKG9yIHdvdWxkLCBpZiBpdCBnZXRzIGNvbXBpbGVkIGluKQogIyBOb3RlOiBGaWxlcyB0aGF0IGVuZCB1cCBpbiB0d28gb3IgbW9yZSBtb2R1bGVzIGFyZSBjb21waWxlZCB3aXRob3V0IHRoZQogIyAgICAgICBLQlVJTERfTU9ETkFNRSBkZWZpbml0aW9uLiBUaGUgcmVhc29uIGlzIHRoYXQgYW55IG1hZGUtdXAgbmFtZSB3b3VsZApAQCAtMjEyLDcgKzIxMiw3IEBACiAKICMgQ29tbWFuZHMgdXNlZnVsIGZvciBidWlsZGluZyBhIGJvb3QgaW1hZ2UKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIAorIwogIwlVc2UgYXMgZm9sbG93aW5nOgogIwogIwl0YXJnZXQ6IHNvdXJjZShzKSBGT1JDRQpAQCAtMjI2LDcgKzIyNiw3IEBACiAKIHF1aWV0X2NtZF9sZCA9IExEICAgICAgJEAKIGNtZF9sZCA9ICQoTEQpICQoTERGTEFHUykgJChsZGZsYWdzLXkpICQoTERGTEFHU18kKEBGKSkgXAotCSAgICAgICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIC1vICRAIAorCSAgICAgICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIC1vICRACiAKICMgT2JqY29weQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCmluZGV4IDA3OGZlMWQuLmIzMDQwNjggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKKysrIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwpAQCAtNDA5LDEwICs0MDksMTAgQEAKIAkJZXhpdCgyKTsKIAl9CiAJaWYgKGZzdGF0KGZkLCAmc3QpIDwgMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBmc3RhdCdpbmcgZGVwZmlsZTogIik7Ci0gICAgICAgICAgICAgICAgcGVycm9yKGRlcGZpbGUpOwotICAgICAgICAgICAgICAgIGV4aXQoMik7Ci0gICAgICAgIH0KKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IGVycm9yIGZzdGF0J2luZyBkZXBmaWxlOiAiKTsKKwkJcGVycm9yKGRlcGZpbGUpOworCQlleGl0KDIpOworCX0KIAlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCJmaXhkZXA6ICVzIGlzIGVtcHR5XG4iLGRlcGZpbGUpOwogCQljbG9zZShmZCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrc3RhY2sucGwgYi9zY3JpcHRzL2NoZWNrc3RhY2sucGwKaW5kZXggNTQ0YWE1Ni4uYzA1ZDU4NiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3N0YWNrLnBsCisrKyBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApAQCAtMTczLDQgKzE3MywzIEBACiAKICMgU29ydCBvdXRwdXQgYnkgc2l6ZSAobGFzdCBmaWVsZCkKIHByaW50IHNvcnQgeyAoJGIgPX4gLzpcdCooXGQrKSQvKVswXSA8PT4gKCRhID1+IC86XHQqKFxkKykkLylbMF0gfSBAc3RhY2s7Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL29mX3RhYmxlLmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2Mvb2ZfdGFibGUuY29jY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5MzQwNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL29mX3RhYmxlLmNvY2NpCkBAIC0wLDAgKzEsNjIgQEAKKy8vLyBNYWtlIHN1cmUgb2ZfZGV2aWNlX2lkIHRhYmxlcyBhcmUgTlVMTCB0ZXJtaW5hdGVkCisvLworLy8gS2V5d29yZHM6IG9mX3RhYmxlCisvLyBDb25maWRlbmNlOiBNZWRpdW0KKy8vIE9wdGlvbnM6IC0taW5jbHVkZS1oZWFkZXJzCisKK3ZpcnR1YWwgcGF0Y2gKK3ZpcnR1YWwgY29udGV4dAordmlydHVhbCBvcmcKK3ZpcnR1YWwgcmVwb3J0CisKK0BkZXBlbmRzIG9uIGNvbnRleHRACitpZGVudGlmaWVyIHZhciwgYXJyOworZXhwcmVzc2lvbiBFOworQEAKK3N0cnVjdCBvZl9kZXZpY2VfaWQgYXJyW10gPSB7CisJLi4uLAorCXsKKwkudmFyID0gRSwKKyoJfQorfTsKKworQGRlcGVuZHMgb24gcGF0Y2hACitpZGVudGlmaWVyIHZhciwgYXJyOworZXhwcmVzc2lvbiBFOworQEAKK3N0cnVjdCBvZl9kZXZpY2VfaWQgYXJyW10gPSB7CisJLi4uLAorCXsKKwkudmFyID0gRSwKKy0JfQorKwl9LAorKwl7IH0KK307CisKK0ByIGRlcGVuZHMgb24gb3JnIHx8IHJlcG9ydEAKK3Bvc2l0aW9uIHAxOworaWRlbnRpZmllciB2YXIsIGFycjsKK2V4cHJlc3Npb24gRTsKK0BACitzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFycltdID0geworCS4uLiwKKwl7CisJLnZhciA9IEUsCisJfQorCUBwMQorfTsKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACitwMSA8PCByLnAxOworYXJyIDw8IHIuYXJyOworQEAKKworY29jY2kucHJpbnRfbWFpbihhcnIscDEpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcDEgPDwgci5wMTsKK2FyciA8PCByLmFycjsKK0BACisKK21zZyA9ICIlcyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkIGF0IGxpbmUgJXMiICUgKGFyciwgcDFbMF0ubGluZSkKK2NvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocDFbMF0sbXNnKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvcmV0dXJudmFyLmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvcmV0dXJudmFyLmNvY2NpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTk1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9yZXR1cm52YXIuY29jY2kKQEAgLTAsMCArMSw2NiBAQAorLy8vCisvLy8gUmVtb3ZlcyB1bm5lZWRlZCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHJldHVybiB2YWx1ZS4KKy8vLworLy8gQ29uZmlkZW5jZTogTW9kZXJhdGUKKy8vIENvcHlyaWdodDogKEMpIDIwMTIgUGV0ZXIgU2VubmEgVHNjaHVkaW4sIElOUklBL0xJUDYuICBHUEx2Mi4KKy8vIFVSTDogaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KKy8vIENvbW1lbnRzOiBDb21tZW50cyBvbiBjb2RlIGNhbiBiZSBkZWxldGVkIGlmIG5lYXIgY29kZSB0aGF0IGlzIHJlbW92ZWQuCisvLyAgICAgICAgICAgIndoZW4gc3RyaWN0IiBjYW4gYmUgcmVtb3ZlZCB0byBnZXQgbW9yZSBoaXRzLCBidXQgYWRkcyBmYWxzZQorLy8gICAgICAgICAgIHBvc2l0aXZlcworLy8gT3B0aW9uczogLS1uby1pbmNsdWRlcyAtLWluY2x1ZGUtaGVhZGVycworCit2aXJ0dWFsIHBhdGNoCit2aXJ0dWFsIHJlcG9ydAordmlydHVhbCBjb250ZXh0Cit2aXJ0dWFsIG9yZworCitAZGVwZW5kcyBvbiBwYXRjaEAKK3R5cGUgVDsKK2NvbnN0YW50IEM7CitpZGVudGlmaWVyIHJldDsKK0BACistIFQgcmV0ID0gQzsKKy4uLiB3aGVuICE9IHJldAorICAgIHdoZW4gc3RyaWN0CityZXR1cm4KKy0gcmV0CisrIEMKKzsKKworQGRlcGVuZHMgb24gY29udGV4dEAKK3R5cGUgVDsKK2NvbnN0YW50IEM7CitpZGVudGlmaWVyIHJldDsKK0BACisqIFQgcmV0ID0gQzsKKy4uLiB3aGVuICE9IHJldAorICAgIHdoZW4gc3RyaWN0CisqIHJldHVybiByZXQ7CisKK0ByMSBkZXBlbmRzIG9uIHJlcG9ydCB8fCBvcmdACit0eXBlIFQ7Citjb25zdGFudCBDOworaWRlbnRpZmllciByZXQ7Citwb3NpdGlvbiBwMSwgcDI7CitAQAorVCByZXRAcDEgPSBDOworLi4uIHdoZW4gIT0gcmV0CisgICAgd2hlbiBzdHJpY3QKK3JldHVybiByZXRAcDI7CisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcDEgPDwgcjEucDE7CitwMiA8PCByMS5wMjsKK0MgPDwgcjEuQzsKK3JldCA8PCByMS5yZXQ7CitAQAorY29jY2lsaWIucmVwb3J0LnByaW50X3JlcG9ydChwMVswXSwgIlVubmVlZGVkIHZhcmlhYmxlOiBcIiIgKyByZXQgKyAiXCIuIFJldHVybiBcIiIgKyBDICsgIlwiIG9uIGxpbmUgIiArIHAyWzBdLmxpbmUpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAorcDEgPDwgcjEucDE7CitwMiA8PCByMS5wMjsKK0MgPDwgcjEuQzsKK3JldCA8PCByMS5yZXQ7CitAQAorY29jY2kucHJpbnRfbWFpbigidW5uZWVkZWQgXCIiICsgcmV0ICsgIlwiIHZhcmlhYmxlIiwgcDEpCitjb2NjaS5wcmludF9zZWMoInJldHVybiAiICsgQyArICIgaGVyZSIsIHAyKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25maWcgYi9zY3JpcHRzL2NvbmZpZwppbmRleCA2ODA0MTc5Li4wMjZhZWI0IDEwMDc1NQotLS0gYS9zY3JpcHRzL2NvbmZpZworKysgYi9zY3JpcHRzL2NvbmZpZwpAQCAtMjIzLDQgKzIyMywzIEBACiAJCTs7CiAJZXNhYwogZG9uZQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm1ha2VoYXNoLmMgYi9zY3JpcHRzL2Nvbm1ha2VoYXNoLmMKaW5kZXggMjYzYTQ0ZC4uNjFiYmRhNSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9jb25tYWtlaGFzaC5jCisrKyBiL3NjcmlwdHMvY29ubWFrZWhhc2guYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJfQogICAgIH0KIAotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgZGVmYXVsdCBmb250IGlzIGFsd2F5cyAyNTYgY2hhcmFjdGVycy4gKi8gICAgCisgIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IGZvbnQgaXMgYWx3YXlzIDI1NiBjaGFyYWN0ZXJzLiAqLwogICBmb250bGVuID0gMjU2OwogCiAgIC8qIEluaXRpYWxpemUgdGFibGUgKi8KQEAgLTIzNiwxNSArMjM2LDE1IEBACiAgICAgfQogCiAgIC8qIE9rYXksIHdlIGhpdCBFT0YsIG5vdyBvdXRwdXQgaGFzaCB0YWJsZSAqLwotICAKKwogICBmY2xvc2UoY3RibCk7Ci0gIAorCiAKICAgLyogQ29tcHV0ZSB0b3RhbCBzaXplIG9mIFVuaWNvZGUgbGlzdCAqLwogICBudW5pID0gMDsKICAgZm9yICggaSA9IDAgOyBpIDwgZm9udGxlbiA7IGkrKyApCiAgICAgbnVuaSArPSB1bmljb3VudFtpXTsKLSAgCisKICAgcHJpbnRmKCJcCiAvKlxuXAogICogRG8gbm90IGVkaXQgdGhpcyBmaWxlOyBpdCB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnlcblwKQEAgLTI2OCw5ICsyNjgsOSBAQAogICAgICAgZWxzZQogICAgICAgICBwcmludGYoIiwgIik7CiAgICAgfQotICAKKwogICBwcmludGYoIlxudTE2IGRmb250X3VuaXRhYmxlWyVkXSA9IFxue1xuXHQiLCBudW5pKTsKLSAgCisKICAgZnAwID0gMDsKICAgbmVudCA9IDA7CiAgIGZvciAoIGkgPSAwIDsgaSA8IG51bmkgOyBpKysgKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kb2Nwcm9jLmMgYi9zY3JpcHRzL2RvY3Byb2MuYwppbmRleCAyYjY5ZWFmLi5lMjY3ZTYyMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kb2Nwcm9jLmMKKysrIGIvc2NyaXB0cy9kb2Nwcm9jLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogc3RhdGljIHZvaWQgYWRkX25ld19zeW1ib2woc3RydWN0IHN5bWZpbGUgKnN5bSwgY2hhciAqIHN5bW5hbWUpCiB7CiAJc3ltLT5zeW1ib2xsaXN0ID0KLSAgICAgICAgICByZWFsbG9jKHN5bS0+c3ltYm9sbGlzdCwgKHN5bS0+c3ltYm9sY250ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisJICByZWFsbG9jKHN5bS0+c3ltYm9sbGlzdCwgKHN5bS0+c3ltYm9sY250ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CiAJc3ltLT5zeW1ib2xsaXN0W3N5bS0+c3ltYm9sY250KytdLm5hbWUgPSBzdHJkdXAoc3ltbmFtZSk7CiB9CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCQkJY2hhciAqcDsKIAkJCWNoYXIgKmU7CiAJCQlpZiAoKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MX0dQTCIpKSAhPSBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSBOVUxMKSkgeworCQkJICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSBOVUxMKSkgewogCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLwogCQkJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCiAJCQkJCXArKzsKQEAgLTI5MSwyOCArMjkxLDI4IEBACiBzdGF0aWMgdm9pZCBzaW5nZnVuYyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiBsaW5lKQogewogCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLwotICAgICAgICBpbnQgaSwgaWR4ID0gMDsKLSAgICAgICAgaW50IHN0YXJ0b2ZzeW0gPSAxOworCWludCBpLCBpZHggPSAwOworCWludCBzdGFydG9mc3ltID0gMTsKIAl2ZWNbaWR4KytdID0gS0VSTkVMRE9DOwogCXZlY1tpZHgrK10gPSBET0NCT09LOwogCXZlY1tpZHgrK10gPSBTSE9XTk9URk9VTkQ7CiAKLSAgICAgICAgLyogU3BsaXQgbGluZSB1cCBpbiBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgcHJlY2VkZWQgYnkgRlVOQ1RJT04gKi8KLSAgICAgICAgZm9yIChpPTA7IGxpbmVbaV07IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpc3NwYWNlKGxpbmVbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lW2ldID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0b2ZzeW0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydG9mc3ltKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydG9mc3ltID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY1tpZHgrK10gPSBGVU5DVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY1tpZHgrK10gPSAmbGluZVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkvKiBTcGxpdCBsaW5lIHVwIGluIGluZGl2aWR1YWwgcGFyYW1ldGVycyBwcmVjZWRlZCBieSBGVU5DVElPTiAqLworCWZvciAoaT0wOyBsaW5lW2ldOyBpKyspIHsKKwkJaWYgKGlzc3BhY2UobGluZVtpXSkpIHsKKwkJCWxpbmVbaV0gPSAnXDAnOworCQkJc3RhcnRvZnN5bSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhcnRvZnN5bSkgeworCQkJc3RhcnRvZnN5bSA9IDA7CisJCQl2ZWNbaWR4KytdID0gRlVOQ1RJT047CisJCQl2ZWNbaWR4KytdID0gJmxpbmVbaV07CisJCX0KKwl9CiAJZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKSB7Ci0gICAgICAgIAlpZiAoc3RyY21wKHZlY1tpXSwgRlVOQ1RJT04pKQotICAgICAgICAJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKHZlY1tpXSwgRlVOQ1RJT04pKQorCQkJY29udGludWU7CiAJCWNvbnN1bWVfc3ltYm9sKHZlY1tpICsgMV0pOwogCX0KIAl2ZWNbaWR4KytdID0gZmlsZW5hbWU7CkBAIC00NjAsMTQgKzQ2MCwxNCBAQAogCQkJCQlicmVhazsKIAkJCQljYXNlICdEJzoKIAkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzb25seShsaW5lKzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCXN5bWJvbHNvbmx5KGxpbmUrMik7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgJ0YnOgogCQkJCQkvKiBmaWxlbmFtZSAqLwogCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CiAJCQkJCSpzKysgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bmN0aW9uIG5hbWVzICovCisJCQkJCS8qIGZ1bmN0aW9uIG5hbWVzICovCiAJCQkJCXdoaWxlIChpc3NwYWNlKCpzKSkKIAkJCQkJCXMrKzsKIAkJCQkJc2luZ2xlZnVuY3Rpb25zKGxpbmUgKzIsIHMpOwpAQCAtNTE1LDExICs1MTUsMTEgQEAKIAl9CiAJLyogT3BlbiBmaWxlLCBleGl0IG9uIGVycm9yICovCiAJaW5maWxlID0gZm9wZW4oYXJndlsyXSwgInIiKTsKLSAgICAgICAgaWYgKGluZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkb2Nwcm9jOiAiKTsKLSAgICAgICAgICAgICAgICBwZXJyb3IoYXJndlsyXSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQorCWlmIChpbmZpbGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworCQlwZXJyb3IoYXJndlsyXSk7CisJCWV4aXQoMik7CisJfQogCiAJaWYgKHN0cmNtcCgiZG9jIiwgYXJndlsxXSkgPT0gMCkgewogCQkvKiBOZWVkIHRvIGRvIHRoaXMgaW4gdHdvIHBhc3Nlcy4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjLy5naXRpZ25vcmUgYi9zY3JpcHRzL2R0Yy8uZ2l0aWdub3JlCmluZGV4IDA5NWFjYjQuLmNkYWJkYzkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy9kdGMvLmdpdGlnbm9yZQpAQCAtMiw0ICsyLDMgQEAKIGR0Yy1sZXhlci5sZXguYwogZHRjLXBhcnNlci50YWIuYwogZHRjLXBhcnNlci50YWIuaAotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9mc3RyZWUuYyBiL3NjcmlwdHMvZHRjL2ZzdHJlZS5jCmluZGV4IGYzNzc0NTMuLmU0NjQ3MjdjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9mc3RyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9mc3RyZWUuYwpAQCAtODgsNCArODgsMyBAQAogCiAJcmV0dXJuIGJ1aWxkX2Jvb3RfaW5mbyhOVUxMLCB0cmVlLCBndWVzc19ib290X2NwdWlkKHRyZWUpKTsKIH0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvbGliZmR0L2ZkdF9lbXB0eV90cmVlLmMgYi9zY3JpcHRzL2R0Yy9saWJmZHQvZmR0X2VtcHR5X3RyZWUuYwppbmRleCBmNzJkMTNiMS4uZjJhZTliNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvbGliZmR0L2ZkdF9lbXB0eV90cmVlLmMKKysrIGIvc2NyaXB0cy9kdGMvbGliZmR0L2ZkdF9lbXB0eV90cmVlLmMKQEAgLTgxLDQgKzgxLDMgQEAKIAogCXJldHVybiBmZHRfb3Blbl9pbnRvKGJ1ZiwgYnVmLCBidWZzaXplKTsKIH0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jIGIvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jCmluZGV4IDMzZWViYTUuLjU3NDBlNjkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3RyZWVzb3VyY2UuYworKysgYi9zY3JpcHRzL2R0Yy90cmVlc291cmNlLmMKQEAgLTI4MSw0ICsyODEsMyBAQAogCiAJd3JpdGVfdHJlZV9zb3VyY2Vfbm9kZShmLCBiaS0+ZHQsIDApOwogfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2hlYWRlcnMuc2ggYi9zY3JpcHRzL2hlYWRlcnMuc2gKaW5kZXggOTc4YjQyYi4uOTVlY2UwNiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9oZWFkZXJzLnNoCisrKyBiL3NjcmlwdHMvaGVhZGVycy5zaApAQCAtMjgsNSArMjgsMyBAQAogCQk7OwogCWVzYWMKIGRvbmUKLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2thbGxzeW1zLmMgYi9zY3JpcHRzL2thbGxzeW1zLmMKaW5kZXggMTIzN2RkNy4uZGM3YWE0NSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rYWxsc3ltcy5jCisrKyBiL3NjcmlwdHMva2FsbHN5bXMuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJfQogCWlmIChzdHJsZW4oc3RyKSA+IEtTWU1fTkFNRV9MRU4pIHsKIAkJZnByaW50ZihzdGRlcnIsICJTeW1ib2wgJXMgdG9vIGxvbmcgZm9yIGthbGxzeW1zICglenUgdnMgJWQpLlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGluY3JlYXNlIEtTWU1fTkFNRV9MRU4gYm90aCBpbiBrZXJuZWwgYW5kIGthbGxzeW1zLmNcbiIsCisJCQkJIlBsZWFzZSBpbmNyZWFzZSBLU1lNX05BTUVfTEVOIGJvdGggaW4ga2VybmVsIGFuZCBrYWxsc3ltcy5jXG4iLAogCQkJc3RyLCBzdHJsZW4oc3RyKSwgS1NZTV9OQU1FX0xFTik7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKaW5kZXggODQ0YmM5ZC4uOWM0ZDI0MSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCisrKyBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQpAQCAtMzMsMTEgKzMzLDExIEBACiAJJDwgLS0kQCAkKEtjb25maWcpCiAKIHNpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKLQkkKFEpbWtkaXIgLXAgaW5jbHVkZS9nZW5lcmF0ZWQKKwkkKFEpbWtkaXIgLXAgaW5jbHVkZS9jb25maWcgaW5jbHVkZS9nZW5lcmF0ZWQKIAkkPCAtLSRAICQoS2NvbmZpZykKIAogbG9jYWx5ZXNjb25maWcgbG9jYWxtb2Rjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgotCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAorCSQoUSlta2RpciAtcCBpbmNsdWRlL2NvbmZpZyBpbmNsdWRlL2dlbmVyYXRlZAogCSQoUSlwZXJsICQ8IC0tJEAgJChzcmN0cmVlKSAkKEtjb25maWcpID4gLnRtcC5jb25maWcKIAkkKFEpaWYgWyAtZiAuY29uZmlnIF07IHRoZW4gCQkJCQlcCiAJCQljbXAgLXMgLnRtcC5jb25maWcgLmNvbmZpZyB8fAkJCVwKQEAgLTMxOSw0ICszMTksMyBAQAogJChvYmopL2djb25mLmdsYWRlLmg6ICQob2JqKS9nY29uZi5nbGFkZQogCSQoUSlpbnRsdG9vbC1leHRyYWN0IC0tdHlwZT1nZXR0ZXh0L2dsYWRlIC0tc3JjZGlyPSQoc3JjdHJlZSkgXAogCSQob2JqKS9nY29uZi5nbGFkZQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY2hlY2suc2ggYi9zY3JpcHRzL2tjb25maWcvY2hlY2suc2gKaW5kZXggODU0ZDljNy4uNTViNzliYSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NoZWNrLnNoCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaApAQCAtMTEsNCArMTEsMyBAQAogaWYgWyAhICIkPyIgLWVxICIwIiAgXTsgdGhlbgogCWVjaG8gLURLQlVJTERfTk9fTkxTOwogZmkKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggZDE5OTQ0Zi4uZmVmNzVmYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC02OTYsNyArNjk2LDcgQEAKIAl9IGVsc2UgaWYgKGlucHV0X21vZGUgPT0gc2F2ZWRlZmNvbmZpZykgewogCQlpZiAoY29uZl93cml0ZV9kZWZjb25maWcoZGVmY29uZmlnX2ZpbGUpKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgXygibioqKiBFcnJvciB3aGlsZSBzYXZpbmcgZGVmY29uZmlnIHRvOiAlc1xuXG4iKSwKLQkJCSAgICAgICAgZGVmY29uZmlnX2ZpbGUpOworCQkJCWRlZmNvbmZpZ19maWxlKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfSBlbHNlIGlmIChpbnB1dF9tb2RlICE9IGxpc3RuZXdjb25maWcpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggZjJiZWU3MC4uZDBhMzViMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTE0MDQsNyArMTQwNCw3IEBACiAJCSAgICAmJiAodHJlZSA9PSB0cmVlMikpCiAJCQljb250aW51ZTsKIC8qCi0gICAgICAgICAgICAgICAgaWYgKCgobWVudSAhPSAmcm9vdG1lbnUpICYmICEobWVudS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQlpZiAoKChtZW51ICE9ICZyb290bWVudSkgJiYgIShtZW51LT5mbGFncyAmIE1FTlVfUk9PVCkpCiAJCSAgICB8fCAodmlld19tb2RlID09IEZVTExfVklFVykKIAkJICAgIHx8ICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykpKi8KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCmluZGV4IDNiMTVjMDguLjhkMDE2ZmEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYworKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2tsaXN0LmMKQEAgLTE2OCwxMyArMTY4LDEzIEBACiAKIAkvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIGxpc3QgKi8KIAlsaXN0ID0gc3Vid2luKGRpYWxvZywgbGlzdF9oZWlnaHQsIGxpc3Rfd2lkdGgsIHkgKyBib3hfeSArIDEsCi0JICAgICAgICAgICAgICB4ICsgYm94X3ggKyAxKTsKKwkJICAgICAgeCArIGJveF94ICsgMSk7CiAKIAlrZXlwYWQobGlzdCwgVFJVRSk7CiAKIAkvKiBkcmF3IGEgYm94IGFyb3VuZCB0aGUgbGlzdCBpdGVtcyAqLwogCWRyYXdfYm94KGRpYWxvZywgYm94X3ksIGJveF94LCBsaXN0X2hlaWdodCArIDIsIGxpc3Rfd2lkdGggKyAyLAotCSAgICAgICAgIGRsZy5tZW51Ym94X2JvcmRlci5hdHIsIGRsZy5tZW51Ym94LmF0cik7CisJCSBkbGcubWVudWJveF9ib3JkZXIuYXRyLCBkbGcubWVudWJveC5hdHIpOwogCiAJLyogRmluZCBsZW5ndGggb2YgbG9uZ2VzdCBpdGVtIGluIG9yZGVyIHRvIGNlbnRlciBjaGVja2xpc3QgKi8KIAljaGVja194ID0gMDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9pbnB1dGJveC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMKaW5kZXggNDQ3YTU4Mi4uZDU4ZGUxZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqIERpc3BsYXkgYSBkaWFsb2cgYm94IGZvciBpbnB1dGluZyBhIHN0cmluZwogICovCiBpbnQgZGlhbG9nX2lucHV0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdCkKKwkJICAgIGNvbnN0IGNoYXIgKmluaXQpCiB7CiAJaW50IGksIHgsIHksIGJveF95LCBib3hfeCwgYm94X3dpZHRoOwogCWludCBpbnB1dF94ID0gMCwga2V5ID0gMCwgYnV0dG9uID0gLTE7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbWVudWJveC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYwppbmRleCBjOTNkZTBiMi4uMTFhZTlhZDcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYwpAQCAtNjQsNyArNjQsNyBAQAogICogUHJpbnQgbWVudSBpdGVtCiAgKi8KIHN0YXRpYyB2b2lkIGRvX3ByaW50X2l0ZW0oV0lORE9XICogd2luLCBjb25zdCBjaGFyICppdGVtLCBpbnQgbGluZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWQsIGludCBob3RrZXkpCisJCQkgIGludCBzZWxlY3RlZCwgaW50IGhvdGtleSkKIHsKIAlpbnQgajsKIAljaGFyICptZW51X2l0ZW0gPSBtYWxsb2MobWVudV93aWR0aCArIDEpOwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgKiBEaXNwbGF5IGEgbWVudSBmb3IgY2hvb3NpbmcgYW1vbmcgYSBudW1iZXIgb2Ygb3B0aW9ucwogICovCiBpbnQgZGlhbG9nX21lbnUoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwKLSAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZWxlY3RlZCwgaW50ICpzX3Njcm9sbCkKKwkJY29uc3Qgdm9pZCAqc2VsZWN0ZWQsIGludCAqc19zY3JvbGwpCiB7CiAJaW50IGksIGosIHgsIHksIGJveF94LCBib3hfeTsKIAlpbnQgaGVpZ2h0LCB3aWR0aCwgbWVudV9oZWlnaHQ7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYwppbmRleCA1OGE4Mjg5Li5mN2FiZGViIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogdm9pZCBpdGVtX2FkZF9zdHIoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcDsKLSAgICAgICAgc2l6ZV90IGF2YWlsOworCXNpemVfdCBhdmFpbDsKIAogCWF2YWlsID0gc2l6ZW9mKGl0ZW1fY3VyLT5ub2RlLnN0cikgLSBzdHJsZW4oaXRlbV9jdXItPm5vZGUuc3RyKTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwppbmRleCA1OTE4NGJiLi4xNGNlYTc0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJaW50IHNpemU7CiAKIAlzaXplID0gc25wcmludGYobWVudV9iYWNrdGl0bGUsIHNpemVvZihtZW51X2JhY2t0aXRsZSksCi0JICAgICAgICAgICAgICAgICIlcyAtICVzIiwgY29uZmlnX2ZpbGVuYW1lLCByb290bWVudS5wcm9tcHQtPnRleHQpOworCQkJIiVzIC0gJXMiLCBjb25maWdfZmlsZW5hbWUsIHJvb3RtZW51LnByb21wdC0+dGV4dCk7CiAJaWYgKHNpemUgPj0gc2l6ZW9mKG1lbnVfYmFja3RpdGxlKSkKIAkJbWVudV9iYWNrdGl0bGVbc2l6ZW9mKG1lbnVfYmFja3RpdGxlKS0xXSA9ICdcMCc7CiAJc2V0X2RpYWxvZ19iYWNrdGl0bGUobWVudV9iYWNrdGl0bGUpOwpAQCAtMTAzNCw0ICsxMDM0LDMgQEAKIAogCXJldHVybiByZXM7CiB9Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IDNhYzJjOWMuLmEyNmNjNWQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMjU4LDggKzI1OCw4IEBACiAJCQkJICAgICJjb25maWcgc3ltYm9sICclcycgdXNlcyBzZWxlY3QsIGJ1dCBpcyAiCiAJCQkJICAgICJub3QgYm9vbGVhbiBvciB0cmlzdGF0ZSIsIHN5bS0+bmFtZSk7CiAJCQllbHNlIGlmIChzeW0yLT50eXBlICE9IFNfVU5LTk9XTiAmJgotCQkJICAgICAgICAgc3ltMi0+dHlwZSAhPSBTX0JPT0xFQU4gJiYKLQkJCSAgICAgICAgIHN5bTItPnR5cGUgIT0gU19UUklTVEFURSkKKwkJCQkgc3ltMi0+dHlwZSAhPSBTX0JPT0xFQU4gJiYKKwkJCQkgc3ltMi0+dHlwZSAhPSBTX1RSSVNUQVRFKQogCQkJCXByb3Bfd2Fybihwcm9wLAogCQkJCSAgICAiJyVzJyBoYXMgd3JvbmcgdHlwZS4gJ3NlbGVjdCcgb25seSAiCiAJCQkJICAgICJhY2NlcHQgYXJndW1lbnRzIG9mIGJvb2xlYW4gYW5kICIKQEAgLTI2OCw3ICsyNjgsNyBAQAogCQljYXNlIFBfUkFOR0U6CiAJCQlpZiAoc3ltLT50eXBlICE9IFNfSU5UICYmIHN5bS0+dHlwZSAhPSBTX0hFWCkKIAkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIG9ubHkgYWxsb3dlZCAiCi0JCQkJICAgICAgICAgICAgICAgICJmb3IgaW50IG9yIGhleCBzeW1ib2xzIik7CisJCQkJCQkiZm9yIGludCBvciBoZXggc3ltYm9scyIpOwogCQkJaWYgKCFtZW51X3ZhbGlkYXRlX251bWJlcihzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltKSB8fAogCQkJICAgICFtZW51X3ZhbGlkYXRlX251bWJlcihzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bSkpCiAJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBpbnZhbGlkIik7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCmluZGV4IDRmYmVjZDIuLjk4NDQ4OWUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCkBAIC0xNTU0LDQgKzE1NTQsMyBAQAogCWVuZHdpbigpOwogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwgYi9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwKaW5kZXggMzEzMzE3Mi4uOWNiODUyMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N0cmVhbWxpbmVfY29uZmlnLnBsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zdHJlYW1saW5lX2NvbmZpZy5wbApAQCAtNTg5LDcgKzU4OSw3IEBACiAKICAgICAjIE5vdyB3ZSBuZWVkIHRvIHNlZSBpZiB3ZSBoYXZlIHRvIGNoZWNrIHNlbGVjdHM7CiAgICAgbG9vcF9zZWxlY3Q7Ci19CSAgICAKK30KIAogbXkgJXNldGNvbmZpZ3M7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMgYi9zY3JpcHRzL2tjb25maWcvdXRpbC5jCmluZGV4IDZlN2ZiZjEuLjk0ZjljODMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtMTU1LDUgKzE1NSwzIEBACiAJZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5LlxuIik7CiAJZXhpdCgxKTsKIH0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYubCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCmluZGV4IDFhOWY1M2UuLjZjNjJkOTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCkBAIC0yNyw4ICsyNyw4IEBACiBzdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKIAogc3RydWN0IGJ1ZmZlciB7Ci0gICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKLSAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKwlZWV9CVUZGRVJfU1RBVEUgc3RhdGU7CiB9OwogCiBzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQKaW5kZXggYTA1MjFhYTUuLjM0OWE3ZjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkCkBAIC03ODksOCArNzg5LDggQEAKIHN0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOwogCiBzdHJ1Y3QgYnVmZmVyIHsKLSAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OwotICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7CisJc3RydWN0IGJ1ZmZlciAqcGFyZW50OworCVlZX0JVRkZFUl9TVEFURSBzdGF0ZTsKIH07CiAKIHN0cnVjdCBidWZmZXIgKmN1cnJlbnRfYnVmOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAppbmRleCAyNWFlMTZhLi5kZTVlODRlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApAQCAtMjMxNCw3ICsyMzE0LDcgQEAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CiAJCWlmIChzeW1fY2hlY2tfZGVwcyhzeW0pKQogCQkJemNvbmZuZXJycysrOwotICAgICAgICB9CisJfQogCWlmICh6Y29uZm5lcnJzKQogCQlleGl0KDEpOwogCXN5bV9zZXRfY2hhbmdlX2NvdW50KDEpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQppbmRleCAwNjUzODg2Li4wZjY4M2NmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYueQorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtNTEwLDcgKzUxMCw3IEBACiAJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgewogCQlpZiAoc3ltX2NoZWNrX2RlcHMoc3ltKSkKIAkJCXpjb25mbmVycnMrKzsKLSAgICAgICAgfQorCX0KIAlpZiAoemNvbmZuZXJycykKIAkJZXhpdCgxKTsKIAlzeW1fc2V0X2NoYW5nZV9jb3VudCgxKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFya3VwX29vcHMucGwgYi9zY3JpcHRzL21hcmt1cF9vb3BzLnBsCmluZGV4IDgyNzg5NmYuLmMyMWQxNjMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbWFya3VwX29vcHMucGwKKysrIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApAQCAtMzY3LDQgKzM2NywzIEBACiBFT1QKIAlleGl0OwogfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rY29tcGlsZV9oIGIvc2NyaXB0cy9ta2NvbXBpbGVfaAppbmRleCBjZmI4NDQwLi42ZmRjOTdlIDEwMDc1NQotLS0gYS9zY3JpcHRzL21rY29tcGlsZV9oCisrKyBiL3NjcmlwdHMvbWtjb21waWxlX2gKQEAgLTY4LDcgKzY4LDcgQEAKIAogKCBlY2hvIC9cKiBUaGlzIGZpbGUgaXMgYXV0byBnZW5lcmF0ZWQsIHZlcnNpb24gJFZFUlNJT04gXCovCiAgIGlmIFsgLW4gIiRDT05GSUdfRkxBR1MiIF0gOyB0aGVuIGVjaG8gIi8qICRDT05GSUdfRkxBR1MgKi8iOyBmaQotICAKKwogICBlY2hvIFwjZGVmaW5lIFVUU19NQUNISU5FIFwiJEFSQ0hcIgogCiAgIGVjaG8gXCNkZWZpbmUgVVRTX1ZFUlNJT04gXCJgZWNobyAkVVRTX1ZFUlNJT04gfCAkVVRTX1RSVU5DQVRFYFwiCkBAIC04NCw3ICs4NCw3IEBACiAjIHJlY29tcGlsYXRpb25zLgogIyBXZSBkb24ndCBjb25zaWRlciB0aGUgZmlsZSBjaGFuZ2VkIGlmIG9ubHkgdGhlIGRhdGUvdGltZSBjaGFuZ2VkLgogIyBBIGtlcm5lbCBjb25maWcgY2hhbmdlIHdpbGwgaW5jcmVhc2UgdGhlIGdlbmVyYXRpb24gbnVtYmVyLCB0aHVzCi0jIGNhdXNpbmcgY29tcGlsZS5oIHRvIGJlIHVwZGF0ZWQgKGluY2x1ZGluZyBkYXRlL3RpbWUpIGR1ZSB0byB0aGUgCisjIGNhdXNpbmcgY29tcGlsZS5oIHRvIGJlIHVwZGF0ZWQgKGluY2x1ZGluZyBkYXRlL3RpbWUpIGR1ZSB0byB0aGUKICMgY2hhbmdlZCBjb21tZW50IGluIHRoZQogIyBmaXJzdCBsaW5lLgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rbWFrZWZpbGUgYi9zY3JpcHRzL21rbWFrZWZpbGUKaW5kZXggMGNjMDQ0Mi4uODRhZjI3YiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9ta21ha2VmaWxlCisrKyBiL3NjcmlwdHMvbWttYWtlZmlsZQpAQCAtNDIsMTggKzQyLDExIEBACiAKIE1BS0VGTEFHUyArPSAtLW5vLXByaW50LWRpcmVjdG9yeQogCi0uUEhPTlk6IGFsbCBcJChNQUtFQ01ER09BTFMpCisuUEhPTlk6IF9fc3ViLW1ha2UgXCQoTUFLRUNNREdPQUxTKQogCi1hbGwJOj0gXCQoZmlsdGVyLW91dCBhbGwgTWFrZWZpbGUsXCQoTUFLRUNNREdPQUxTKSkKK19fc3ViLW1ha2U6CisJXCQoUSlcJChNQUtFKSBcJChNQUtFQVJHUykgXCQoTUFLRUNNREdPQUxTKQogCi1hbGw6Ci0JXCQoUSlcJChNQUtFKSBcJChNQUtFQVJHUykgXCQoYWxsKQotCi1NYWtlZmlsZTo7Ci0KLVwkKGFsbCk6IGFsbAotCUA6Ci0KLSUvOiBhbGwKK1wkKGZpbHRlci1vdXQgX19zdWItbWFrZSwgXCQoTUFLRUNNREdPQUxTKSk6IF9fc3ViLW1ha2UKIAlAOgogRU9GCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rc3lzbWFwIGIvc2NyaXB0cy9ta3N5c21hcAppbmRleCBjMWI2MTkxLi43YWRhMzVhIDEwMDY0NAotLS0gYS9zY3JpcHRzL21rc3lzbWFwCisrKyBiL3NjcmlwdHMvbWtzeXNtYXAKQEAgLTQyLDQgKzQyLDMgQEAKICMgKEF0IGxlYXN0IHNwYXJjNjQgaGFzIF9fY3JjXyBpbiB0aGUgbWlkZGxlKS4KIAogJE5NIC1uICQxIHwgZ3JlcCAtdiAnXCggW2FOVXddIFwpXHxcKF9fY3JjX1wpXHxcKCBcJFthZHRdXCknID4gJDIKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvLmdpdGlnbm9yZSBiL3NjcmlwdHMvbW9kLy5naXRpZ25vcmUKaW5kZXggMzNiYWUwZC4uM2JkMTFiNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvLmdpdGlnbm9yZQorKysgYi9zY3JpcHRzL21vZC8uZ2l0aWdub3JlCkBAIC0yLDQgKzIsMyBAQAogbWtfZWxmY29uZmlnCiBtb2Rwb3N0CiBkZXZpY2V0YWJsZS1vZmZzZXRzLmgKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCmluZGV4IDE5MjQ5OTAuLmU2MTRlZjYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYworKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTY0NCwyOCArNjQ0LDI2IEBACiAKIHN0YXRpYyBpbnQgZG9fb2ZfZW50cnkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpzeW12YWwsIGNoYXIgKmFsaWFzKQogewotICAgIGludCBsZW47Ci0gICAgY2hhciAqdG1wOwotICAgIERFRl9GSUVMRF9BRERSKHN5bXZhbCwgb2ZfZGV2aWNlX2lkLCBuYW1lKTsKLSAgICBERUZfRklFTERfQUREUihzeW12YWwsIG9mX2RldmljZV9pZCwgdHlwZSk7Ci0gICAgREVGX0ZJRUxEX0FERFIoc3ltdmFsLCBvZl9kZXZpY2VfaWQsIGNvbXBhdGlibGUpOworCWludCBsZW47CisJY2hhciAqdG1wOworCURFRl9GSUVMRF9BRERSKHN5bXZhbCwgb2ZfZGV2aWNlX2lkLCBuYW1lKTsKKwlERUZfRklFTERfQUREUihzeW12YWwsIG9mX2RldmljZV9pZCwgdHlwZSk7CisJREVGX0ZJRUxEX0FERFIoc3ltdmFsLCBvZl9kZXZpY2VfaWQsIGNvbXBhdGlibGUpOwogCi0gICAgbGVuID0gc3ByaW50ZiAoYWxpYXMsICJvZjpOJXNUJXMiLAotICAgICAgICAgICAgICAgICAgICAoKm5hbWUpWzBdID8gKm5hbWUgOiAiKiIsCi0gICAgICAgICAgICAgICAgICAgICgqdHlwZSlbMF0gPyAqdHlwZSA6ICIqIik7CisJbGVuID0gc3ByaW50ZihhbGlhcywgIm9mOk4lc1QlcyIsICgqbmFtZSlbMF0gPyAqbmFtZSA6ICIqIiwKKwkJICAgICAgKCp0eXBlKVswXSA/ICp0eXBlIDogIioiKTsKIAotICAgIGlmIChjb21wYXRpYmxlWzBdKQotICAgICAgICBzcHJpbnRmICgmYWxpYXNbbGVuXSwgIiVzQyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICgqdHlwZSlbMF0gPyAiKiIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICpjb21wYXRpYmxlKTsKKwlpZiAoY29tcGF0aWJsZVswXSkKKwkJc3ByaW50ZigmYWxpYXNbbGVuXSwgIiVzQyVzIiwgKCp0eXBlKVswXSA/ICIqIiA6ICIiLAorCQkJKmNvbXBhdGlibGUpOwogCi0gICAgLyogUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSB3aXRoIHVuZGVyc2NvcmVzICovCi0gICAgZm9yICh0bXAgPSBhbGlhczsgdG1wICYmICp0bXA7IHRtcCsrKQotICAgICAgICBpZiAoaXNzcGFjZSAoKnRtcCkpCi0gICAgICAgICAgICAqdG1wID0gJ18nOworCS8qIFJlcGxhY2UgYWxsIHdoaXRlc3BhY2Ugd2l0aCB1bmRlcnNjb3JlcyAqLworCWZvciAodG1wID0gYWxpYXM7IHRtcCAmJiAqdG1wOyB0bXArKykKKwkJaWYgKGlzc3BhY2UgKCp0bXApKQorCQkJKnRtcCA9ICdfJzsKIAotICAgIGFkZF93aWxkY2FyZChhbGlhcyk7Ci0gICAgcmV0dXJuIDE7CisJYWRkX3dpbGRjYXJkKGFsaWFzKTsKKwlyZXR1cm4gMTsKIH0KIEFERF9UT19ERVZUQUJMRSgib2YiLCBvZl9kZXZpY2VfaWQsIGRvX29mX2VudHJ5KTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMgYi9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYwppbmRleCA2MzliY2E3Li5hNGZkNzFkIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYworKysgYi9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYwpAQCAtNTQsNCArNTQsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCAwMjY1NDNiLi45ZDljNWI5IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC04NjIsNyArODYyLDcgQEAKICAqIHdpdGhvdXQgImF4IiAvICJhdyIuCiAgKi8KIHN0YXRpYyB2b2lkIGNoZWNrX3NlY3Rpb24oY29uc3QgY2hhciAqbW9kbmFtZSwgc3RydWN0IGVsZl9pbmZvICplbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TaGRyICpzZWNoZHIpCisJCQkgIEVsZl9TaGRyICpzZWNoZHIpCiB7CiAJY29uc3QgY2hhciAqc2VjID0gc2VjaF9uYW1lKGVsZiwgc2VjaGRyKTsKIApAQCAtMTI5NiwxMiArMTI5NiwxMiBAQAogICovCiBzdGF0aWMgdm9pZCByZXBvcnRfc2VjX21pc21hdGNoKGNvbnN0IGNoYXIgKm1vZG5hbWUsCiAJCQkJY29uc3Qgc3RydWN0IHNlY3Rpb25jaGVjayAqbWlzbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBmcm9tYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbXN5bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb21faXNfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9zZWMsIGNvbnN0IGNoYXIgKnRvc3ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9faXNfZnVuYykKKwkJCQljb25zdCBjaGFyICpmcm9tc2VjLAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBmcm9tYWRkciwKKwkJCQljb25zdCBjaGFyICpmcm9tc3ltLAorCQkJCWludCBmcm9tX2lzX2Z1bmMsCisJCQkJY29uc3QgY2hhciAqdG9zZWMsIGNvbnN0IGNoYXIgKnRvc3ltLAorCQkJCWludCB0b19pc19mdW5jKQogewogCWNvbnN0IGNoYXIgKmZyb20sICpmcm9tX3A7CiAJY29uc3QgY2hhciAqdG8sICp0b19wOwpAQCAtMTQ0MSw3ICsxNDQxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbl9taXNtYXRjaChjb25zdCBjaGFyICptb2RuYW1lLCBzdHJ1Y3QgZWxmX2luZm8gKmVsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxmX1JlbGEgKnIsIEVsZl9TeW0gKnN5bSwgY29uc3QgY2hhciAqZnJvbXNlYykKKwkJCQkgICBFbGZfUmVsYSAqciwgRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpmcm9tc2VjKQogewogCWNvbnN0IGNoYXIgKnRvc2VjOwogCWNvbnN0IHN0cnVjdCBzZWN0aW9uY2hlY2sgKm1pc21hdGNoOwpAQCAtMTUyOCw3ICsxNTI4LDcgQEAKIAljYXNlIFJfQVJNX0FCUzMyOgogCQkvKiBGcm9tIEFSTSBBQkk6IChTICsgQSkgfCBUICovCiAJCXItPnJfYWRkZW5kID0gKGludCkobG9uZykKLQkJICAgICAgICAgICAgICAoZWxmLT5zeW10YWJfc3RhcnQgKyBFTEZfUl9TWU0oci0+cl9pbmZvKSk7CisJCQkgICAgICAoZWxmLT5zeW10YWJfc3RhcnQgKyBFTEZfUl9TWU0oci0+cl9pbmZvKSk7CiAJCWJyZWFrOwogCWNhc2UgUl9BUk1fUEMyNDoKIAljYXNlIFJfQVJNX0NBTEw6CkBAIC0xNTM4LDggKzE1MzgsOCBAQAogCWNhc2UgUl9BUk1fVEhNX0pVTVAxOToKIAkJLyogRnJvbSBBUk0gQUJJOiAoKFMgKyBBKSB8IFQpIC0gUCAqLwogCQlyLT5yX2FkZGVuZCA9IChpbnQpKGxvbmcpKGVsZi0+aGRyICsKLQkJICAgICAgICAgICAgICBzZWNoZHItPnNoX29mZnNldCArCi0JCSAgICAgICAgICAgICAgKHItPnJfb2Zmc2V0IC0gc2VjaGRyLT5zaF9hZGRyKSk7CisJCQkgICAgICBzZWNoZHItPnNoX29mZnNldCArCisJCQkgICAgICAoci0+cl9vZmZzZXQgLSBzZWNoZHItPnNoX2FkZHIpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDE7CkBAIC0xNTcxLDcgKzE1NzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZWN0aW9uX3JlbGEoY29uc3QgY2hhciAqbW9kbmFtZSwgc3RydWN0IGVsZl9pbmZvICplbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRWxmX1NoZHIgKnNlY2hkcikKKwkJCSBFbGZfU2hkciAqc2VjaGRyKQogewogCUVsZl9TeW0gICpzeW07CiAJRWxmX1JlbGEgKnJlbGE7CkBAIC0xNjE1LDcgKzE2MTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZWN0aW9uX3JlbChjb25zdCBjaGFyICptb2RuYW1lLCBzdHJ1Y3QgZWxmX2luZm8gKmVsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TaGRyICpzZWNoZHIpCisJCQlFbGZfU2hkciAqc2VjaGRyKQogewogCUVsZl9TeW0gKnN5bTsKIAlFbGZfUmVsICpyZWw7CkBAIC0xNjg1LDcgKzE2ODUsNyBAQAogICogYmUgZGlzY2FyZGVkIGFuZCB3YXJucyBhYm91dCBpdC4KICAqKi8KIHN0YXRpYyB2b2lkIGNoZWNrX3NlY19yZWYoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBjaGFyICptb2RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZWxmX2luZm8gKmVsZikKKwkJCSAgc3RydWN0IGVsZl9pbmZvICplbGYpCiB7CiAJaW50IGk7CiAJRWxmX1NoZHIgKnNlY2hkcnMgPSBlbGYtPnNlY2hkcnM7CkBAIC0xOTQ1LDcgKzE5NDUsNyBAQAogCQkJCQkgICAgIHMtPm5hbWUsIG1vZC0+bmFtZSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJbWVycm9yKCJcIiVzXCIgWyVzLmtvXSB1bmRlZmluZWQhXG4iLAotCQkJCQkgICAgICAgICAgcy0+bmFtZSwgbW9kLT5uYW1lKTsKKwkJCQkJICAgICAgIHMtPm5hbWUsIG1vZC0+bmFtZSk7CiAJCQkJCWVyciA9IDE7CiAJCQkJfQogCQkJfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2Qvc3VtdmVyc2lvbi5jIGIvc2NyaXB0cy9tb2Qvc3VtdmVyc2lvbi5jCmluZGV4IGRlYjI5OTQuLjk0NDQxOGQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL3N1bXZlcnNpb24uYworKysgYi9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCW1jdHgtPmJsb2NrWzE0XSA9IG1jdHgtPmJ5dGVfY291bnQgPDwgMzsKIAltY3R4LT5ibG9ja1sxNV0gPSBtY3R4LT5ieXRlX2NvdW50ID4+IDI5OwogCWxlMzJfdG9fY3B1X2FycmF5KG1jdHgtPmJsb2NrLCAoc2l6ZW9mKG1jdHgtPmJsb2NrKSAtCi0JICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ2NF90KSkgLyBzaXplb2YodWludDMyX3QpKTsKKwkJCSAgc2l6ZW9mKHVpbnQ2NF90KSkgLyBzaXplb2YodWludDMyX3QpKTsKIAltZDRfdHJhbnNmb3JtKG1jdHgtPmhhc2gsIG1jdHgtPmJsb2NrKTsKIAljcHVfdG9fbGUzMl9hcnJheShtY3R4LT5oYXNoLCBzaXplb2YobWN0eC0+aGFzaCkgLyBzaXplb2YodWludDMyX3QpKTsKIApAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCQlicmVhazsKIAkJLyogVGVybWluYXRlIGxpbmUgYXQgZmlyc3Qgc3BhY2UsIHRvIGdldCByaWQgb2YgZmluYWwgJyBcJyAqLwogCQl3aGlsZSAoKnApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc3BhY2UoKnApKSB7CisJCQlpZiAoaXNzcGFjZSgqcCkpIHsKIAkJCQkqcCA9ICdcMCc7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL29iamRpZmYgYi9zY3JpcHRzL29iamRpZmYKaW5kZXggYjNlNGYxMC4uNjJlNTFkYSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9vYmpkaWZmCisrKyBiL3NjcmlwdHMvb2JqZGlmZgpAQCAtMjUsMjUgKzI1LDQ3IEBACiAjCiAjIE5vdGU6ICdtYWtlIG1ycHJvcGVyJyB3aWxsIGFsc28gcmVtb3ZlIC50bXBfb2JqZGlmZgogCi1HSVRfRElSPSJgZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXJgIgorU1JDVFJFRT0kKGNkICQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwgMj4vZGV2L251bGwpOyBwd2QpCiAKLWlmIFsgLWQgIiRHSVRfRElSIiBdOyB0aGVuCi0JVE1QRD0iJHtHSVRfRElSJWdpdH10bXBfb2JqZGlmZiIKLQotCVsgLWQgIiRUTVBEIiBdIHx8IG1rZGlyICIkVE1QRCIKLWVsc2UKLQllY2hvICJFUlJPUjogZ2l0IGRpcmVjdG9yeSBub3QgZm91bmQuIgoraWYgWyAteiAiJFNSQ1RSRUUiIF07IHRoZW4KKwllY2hvID4mMiAiRVJST1I6IE5vdCBhIGdpdCByZXBvc2l0b3J5LiIKIAlleGl0IDEKIGZpCiAKK1RNUEQ9JFNSQ1RSRUUvLnRtcF9vYmpkaWZmCisKIHVzYWdlKCkgewotCWVjaG8gIlVzYWdlOiAkMCA8Y29tbWFuZD4gPGFyZ3M+IgotCWVjaG8gIiAgcmVjb3JkICAgIDxsaXN0IG9mIG9iamVjdCBmaWxlcz4iCi0JZWNobyAiICBkaWZmICAgICAgPGNvbW1pdEE+IDxjb21taXRCPiIKLQllY2hvICIgIGNsZWFuICAgICBhbGwgfCA8Y29tbWl0PiIKKwllY2hvID4mMiAiVXNhZ2U6ICQwIDxjb21tYW5kPiA8YXJncz4iCisJZWNobyA+JjIgIiAgcmVjb3JkICAgIDxsaXN0IG9mIG9iamVjdCBmaWxlcyBvciBkaXJlY3Rvcmllcz4iCisJZWNobyA+JjIgIiAgZGlmZiAgICAgIDxjb21taXRBPiA8Y29tbWl0Qj4iCisJZWNobyA+JjIgIiAgY2xlYW4gICAgIGFsbCB8IDxjb21taXQ+IgogCWV4aXQgMQogfQogCitnZXRfb3V0cHV0X2RpcigpIHsKKwlkaXI9JHsxJS8qfQorCisJaWYgWyAiJGRpciIgPSAiJDEiIF07IHRoZW4KKwkJZGlyPS4KKwlmaQorCisJZGlyPSQoY2QgJGRpcjsgcHdkKQorCisJZWNobyAkVE1QRC8kQ01UJHtkaXIjJFNSQ1RSRUV9Cit9CisKK2RvX29iamR1bXAoKSB7CisJZGlyPSQoZ2V0X291dHB1dF9kaXIgJDEpCisJYmFzZT0kezEjIyovfQorCWRpcz0kZGlyLyR7YmFzZSUub30uZGlzCisKKwlbICEgLWQgIiRkaXIiIF0gJiYgbWtkaXIgLXAgJGRpcgorCisJIyByZW1vdmUgYWRkcmVzc2VzIGZvciBhIGNsZWFuZXIgZGlmZgorCSMgaHR0cDovL2R1bW1kaWRhLnR1bWJsci5jb20vcG9zdC82MDkyNDA2MDQ1MS9iaW5hcnktZGlmZi1iZXR3ZWVuLWxpYmMtZnJvbS1zY2llbnRpZmljbGludXgtYW5kCisJJE9CSkRVTVAgLUQgJDEgfCBzZWQgInMvXltbOnNwYWNlOl1dXCtbMC05YS1mXVwrLy8iID4gJGRpcworfQorCiBkb3JlY29yZCgpIHsKIAlbICQjIC1lcSAwIF0gJiYgdXNhZ2UKIApAQCAtNTIsMjAgKzc0LDE2IEBACiAJQ01UPSJgZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQURgIgogCiAJT0JKRFVNUD0iJHtDUk9TU19DT01QSUxFfW9iamR1bXAiCi0JT0JKRElGRkQ9IiRUTVBELyRDTVQiCiAKLQlbICEgLWQgIiRPQkpESUZGRCIgXSAmJiBta2RpciAtcCAiJE9CSkRJRkZEIgotCi0JZm9yIGYgaW4gJEZJTEVTOyBkbwotCQlkbj0iJHtmJS8qfSIKLQkJYm49IiR7ZiMjKi99IgotCi0JCVsgISAtZCAiJE9CSkRJRkZELyRkbiIgXSAmJiBta2RpciAtcCAiJE9CSkRJRkZELyRkbiIKLQotCQkjIHJlbW92ZSBhZGRyZXNzZXMgZm9yIGEgbW9yZSBjbGVhciBkaWZmCi0JCSMgaHR0cDovL2R1bW1kaWRhLnR1bWJsci5jb20vcG9zdC82MDkyNDA2MDQ1MS9iaW5hcnktZGlmZi1iZXR3ZWVuLWxpYmMtZnJvbS1zY2llbnRpZmljbGludXgtYW5kCi0JCSRPQkpEVU1QIC1EICIkZiIgfCBzZWQgInMvXltbOnNwYWNlOl1dXCtbMC05YS1mXVwrLy8iIFwKLQkJCT4iJE9CSkRJRkZELyRkbi8kYm4iCisJZm9yIGQgaW4gJEZJTEVTOyBkbworCQlpZiBbIC1kICIkZCIgXTsgdGhlbgorCQkJZm9yIGYgaW4gJChmaW5kICRkIC1uYW1lICcqLm8nKQorCQkJZG8KKwkJCQlkb19vYmpkdW1wICRmCisJCQlkb25lCisJCWVsc2UKKwkJCWRvX29iamR1bXAgJGQKKwkJZmkKIAlkb25lCiB9CiAKQEAgLTkwLDEyICsxMDgsMTIgQEAKIAlEU1REPSIkVE1QRC8kRFNUIgogCiAJaWYgWyAhIC1kICIkU1JDRCIgXTsgdGhlbgotCQllY2hvICJFUlJPUjogJFNSQ0QgZG9lc24ndCBleGlzdCIKKwkJZWNobyA+JjIgIkVSUk9SOiAkU1JDRCBkb2Vzbid0IGV4aXN0IgogCQlleGl0IDEKIAlmaQogCiAJaWYgWyAhIC1kICIkRFNURCIgXTsgdGhlbgotCQllY2hvICJFUlJPUjogJERTVEQgZG9lc24ndCBleGlzdCIKKwkJZWNobyA+JjIgIkVSUk9SOiAkRFNURCBkb2Vzbid0IGV4aXN0IgogCQlleGl0IDEKIAlmaQogCkBAIC0xMTQsNyArMTMyLDcgQEAKIAkJaWYgWyAtZCAiJFRNUEQvJENNVCIgXTsgdGhlbgogCQkJcm0gLXJmICRUTVBELyRDTVQKIAkJZWxzZQotCQkJZWNobyAiJENNVCBub3QgZm91bmQiCisJCQllY2hvID4mMiAiJENNVCBub3QgZm91bmQiCiAJCWZpCiAJZmkKIH0KQEAgLTEzNSw3ICsxNTMsNyBAQAogCQlkb2NsZWFuICQqCiAJCTs7CiAJKikKLQkJZWNobyAiVW5yZWNvZ25pemVkIGNvbW1hbmQgJyQxJyIKKwkJZWNobyA+JjIgIlVucmVjb2duaXplZCBjb21tYW5kICckMSciCiAJCWV4aXQgMQogCQk7OwogZXNhYwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlIGIvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCmluZGV4IGM1ZDQ3MzMuLjk5Y2E2ZTcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQorKysgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKQEAgLTE0Myw0ICsxNDMsMyBAQAogCUBlY2hvICcgIHBlcmYtdGFyZ3otc3JjLXBrZyAgLSBCdWlsZCAkKHBlcmYtdGFyKS50YXIuZ3ogc291cmNlIHRhcmJhbGwnCiAJQGVjaG8gJyAgcGVyZi10YXJiejItc3JjLXBrZyAtIEJ1aWxkICQocGVyZi10YXIpLnRhci5iejIgc291cmNlIHRhcmJhbGwnCiAJQGVjaG8gJyAgcGVyZi10YXJ4ei1zcmMtcGtnICAtIEJ1aWxkICQocGVyZi10YXIpLnRhci54eiBzb3VyY2UgdGFyYmFsbCcKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCmluZGV4IGY0NmU0ZGQuLmI1ZjA4ZjcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKQEAgLTM1LDEzICszNSwxNSBAQAogCXNwYXJjKikKIAkJZGViYXJjaD1zcGFyYyA7OwogCXMzOTAqKQotCQlkZWJhcmNoPXMzOTAgOzsKKwkJZGViYXJjaD1zMzkwJChncmVwIC1xIENPTkZJR182NEJJVD15ICRLQ09ORklHX0NPTkZJRyAmJiBlY2hvIHggfHwgdHJ1ZSkgOzsKIAlwcGMqKQogCQlkZWJhcmNoPXBvd2VycGMgOzsKIAlwYXJpc2MqKQogCQlkZWJhcmNoPWhwcGEgOzsKIAltaXBzKikKIAkJZGViYXJjaD1taXBzJChncmVwIC1xIENQVV9MSVRUTEVfRU5ESUFOPXkgJEtDT05GSUdfQ09ORklHICYmIGVjaG8gZWwgfHwgdHJ1ZSkgOzsKKwlhcm02NCkKKwkJZGViYXJjaD1hcm02NCA7OwogCWFybSopCiAJCWRlYmFyY2g9YXJtJChncmVwIC1xIENPTkZJR19BRUFCST15ICRLQ09ORklHX0NPTkZJRyAmJiBlY2hvIGVsIHx8IHRydWUpIDs7CiAJKikKQEAgLTEzMCw3ICsxMzIsNyBAQAogCWNwIFN5c3RlbS5tYXAgIiR0bXBkaXIvdXNyL2xpYi91bWwvbW9kdWxlcy8kdmVyc2lvbi9TeXN0ZW0ubWFwIgogCWNwICRLQ09ORklHX0NPTkZJRyAiJHRtcGRpci91c3Ivc2hhcmUvZG9jLyRwYWNrYWdlbmFtZS9jb25maWciCiAJZ3ppcCAiJHRtcGRpci91c3Ivc2hhcmUvZG9jLyRwYWNrYWdlbmFtZS9jb25maWciCi1lbHNlIAorZWxzZQogCWNwIFN5c3RlbS5tYXAgIiR0bXBkaXIvYm9vdC9TeXN0ZW0ubWFwLSR2ZXJzaW9uIgogCWNwICRLQ09ORklHX0NPTkZJRyAiJHRtcGRpci9ib290L2NvbmZpZy0kdmVyc2lvbiIKIGZpCkBAIC0xNTUsMTEgKzE1NywxMSBAQAogCQkJZm9yIG1vZHVsZSBpbiAkKGZpbmQgbGliL21vZHVsZXMvIC1uYW1lICoua28pOyBkbwogCQkJCW1rZGlyIC1wICQoZGlybmFtZSAkZGJnX2Rpci91c3IvbGliL2RlYnVnLyRtb2R1bGUpCiAJCQkJIyBvbmx5IGtlZXAgZGVidWcgc3ltYm9scyBpbiB0aGUgZGVidWcgZmlsZQotCQkJCW9iamNvcHkgLS1vbmx5LWtlZXAtZGVidWcgJG1vZHVsZSAkZGJnX2Rpci91c3IvbGliL2RlYnVnLyRtb2R1bGUKKwkJCQkkT0JKQ09QWSAtLW9ubHkta2VlcC1kZWJ1ZyAkbW9kdWxlICRkYmdfZGlyL3Vzci9saWIvZGVidWcvJG1vZHVsZQogCQkJCSMgc3RyaXAgb3JpZ2luYWwgbW9kdWxlIGZyb20gZGVidWcgc3ltYm9scwotCQkJCW9iamNvcHkgLS1zdHJpcC1kZWJ1ZyAkbW9kdWxlCisJCQkJJE9CSkNPUFkgLS1zdHJpcC1kZWJ1ZyAkbW9kdWxlCiAJCQkJIyB0aGVuIGFkZCBhIGxpbmsgdG8gdGhvc2UKLQkJCQlvYmpjb3B5IC0tYWRkLWdudS1kZWJ1Z2xpbms9JGRiZ19kaXIvdXNyL2xpYi9kZWJ1Zy8kbW9kdWxlICRtb2R1bGUKKwkJCQkkT0JKQ09QWSAtLWFkZC1nbnUtZGVidWdsaW5rPSRkYmdfZGlyL3Vzci9saWIvZGVidWcvJG1vZHVsZSAkbW9kdWxlCiAJCQlkb25lCiAJCSkKIAlmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkdGFyIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkdGFyCmluZGV4IGFhMjJmOTQuLjk5NWMxZWEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZHRhcgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGR0YXIKQEAgLTEzNiw0ICsxMzYsMyBAQAogZWNobyAiVGFyYmFsbCBzdWNjZXNzZnVsbHkgY3JlYXRlZCBpbiAke3RhcmJhbGx9JHtmaWxlX2V4dH0iCiAKIGV4aXQgMAotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhdGNoLWtlcm5lbCBiL3NjcmlwdHMvcGF0Y2gta2VybmVsCmluZGV4IGQwMDBlYTMuLjQ5YjQyNDFlIDEwMDc1NQotLS0gYS9zY3JpcHRzL3BhdGNoLWtlcm5lbAorKysgYi9zY3JpcHRzL3BhdGNoLWtlcm5lbApAQCAtMjcsNyArMjcsNyBAQAogIyAgICAgICBOaWNrIEhvbGxvd2F5IDxOaWNrLkhvbGxvd2F5QGFsZmllLmRlbW9uLmNvLnVrPiwgMm5kIEphbnVhcnkgMTk5NS4KICMKICMgQWRkZWQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgdHlwZXMgb2YgY29tcHJlc3Npb24uIFdoYXQgaW5jbHVkZXMKLSMgZ3ppcCwgYnppcCwgYnppcDIsIHppcCwgY29tcHJlc3MsIGFuZCBwbGFpbnRleHQuIAorIyBnemlwLCBiemlwLCBiemlwMiwgemlwLCBjb21wcmVzcywgYW5kIHBsYWludGV4dC4KICMKICMgICAgICAgQWRhbSBTdWxtaWNraSA8YWRhbUBjZmFyLnVtZC5lZHU+LCAxc3QgSmFudWFyeSAxOTk3LgogIwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgIGZpCiAgICMgUmVtb3ZlIGJhY2t1cCBmaWxlcwogICBmaW5kICRzb3VyY2VkaXIvICcoJyAtbmFtZSAnKi5vcmlnJyAtbyAtbmFtZSAnLioub3JpZycgJyknIC1leGVjIHJtIC1mIHt9IFw7Ci0gCisKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcG5tdG9sb2dvLmMgYi9zY3JpcHRzL3BubXRvbG9nby5jCmluZGV4IDY4YmI0ZWYuLjQ3MThkNzggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcG5tdG9sb2dvLmMKKysrIGIvc2NyaXB0cy9wbm10b2xvZ28uYwpAQCAtNTEyLDQgKzUxMiwzIEBACiAgICAgfQogICAgIGV4aXQoMCk7CiB9Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5jCmluZGV4IGUxMWFhNGEuLjY1MGVjYzgzIDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5jCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMKQEAgLTQ4Nyw1ICs0ODcsMyBAQAogCX0KIAlyZXR1cm4gISFuX2Vycm9yOwogfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcnQtdGVzdGVyL2NoZWNrLWFsbC5zaCBiL3NjcmlwdHMvcnQtdGVzdGVyL2NoZWNrLWFsbC5zaAppbmRleCA0MzA5OGFmLi42YjVjODNiIDEwMDY0NAotLS0gYS9zY3JpcHRzL3J0LXRlc3Rlci9jaGVjay1hbGwuc2gKKysrIGIvc2NyaXB0cy9ydC10ZXN0ZXIvY2hlY2stYWxsLnNoCkBAIC0xOSw0ICsxOSwzIEBACiB0ZXN0aXQgdDQtbDItcGktZGVib29zdC50c3QKIHRlc3RpdCB0NS1sNC1waS1ib29zdC1kZWJvb3N0LnRzdAogdGVzdGl0IHQ1LWw0LXBpLWJvb3N0LWRlYm9vc3Qtc2V0c2NoZWQudHN0Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcnQtdGVzdGVyL3J0LXRlc3Rlci5weSBiL3NjcmlwdHMvcnQtdGVzdGVyL3J0LXRlc3Rlci5weQppbmRleCAzNDE4NmNhLi42ZDkxNmMyIDEwMDY0NAotLS0gYS9zY3JpcHRzL3J0LXRlc3Rlci9ydC10ZXN0ZXIucHkKKysrIGIvc2NyaXB0cy9ydC10ZXN0ZXIvcnQtdGVzdGVyLnB5CkBAIC0yMTYsNSArMjE2LDMgQEAKICMgTm9ybWFsIGV4aXQgcGFzcwogcHJpbnQgIlBhc3MiCiBzeXMuZXhpdCgwKQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2VsaW51eC9pbnN0YWxsX3BvbGljeS5zaCBiL3NjcmlwdHMvc2VsaW51eC9pbnN0YWxsX3BvbGljeS5zaAppbmRleCA3YjljY2Y2Li5mNmEwY2U3IDEwMDY0NAotLS0gYS9zY3JpcHRzL3NlbGludXgvaW5zdGFsbF9wb2xpY3kuc2gKKysrIGIvc2NyaXB0cy9zZWxpbnV4L2luc3RhbGxfcG9saWN5LnNoCkBAIC02Niw0ICs2NiwzIEBACiAJJFNGIGZpbGVfY29udGV4dHMgL2RldgogCW1vdW50IC0tbW92ZSAvbW50IC9kZXYKIGZpCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2hvd19kZWx0YSBiL3NjcmlwdHMvc2hvd19kZWx0YQppbmRleCBlMjU3MzJiLi41YjM2NTAwIDEwMDc1NQotLS0gYS9zY3JpcHRzL3Nob3dfZGVsdGEKKysrIGIvc2NyaXB0cy9zaG93X2RlbHRhCkBAIC0xMjYsNCArMTI2LDMgQEAKIAkJcHJpbnQgKGNvbnZlcnRfbGluZShsaW5lLCBiYXNlX3RpbWUpLCkKIAogbWFpbigpCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGFncy5zaCBiL3NjcmlwdHMvdGFncy5zaAppbmRleCBmMmM1YjAwLi5lNmIwMTFmIDEwMDc1NQotLS0gYS9zY3JpcHRzL3RhZ3Muc2gKKysrIGIvc2NyaXB0cy90YWdzLnNoCkBAIC0yNSw2ICsyNSw5IEBACiAJdHJlZT0ke3NyY3RyZWV9LwogZmkKIAorIyBpZ25vcmUgdXNlcnNwYWNlIHRvb2xzCitpZ25vcmU9IiRpZ25vcmUgKCAtcGF0aCAke3RyZWV9dG9vbHMgKSAtcHJ1bmUgLW8iCisKICMgRmluZCBhbGwgYXZhaWxhYmxlIGFyY2hzCiBmaW5kX2FsbF9hcmNocygpCiB7CkBAIC00Nyw3ICs1MCw4IEBACiAJZm9yIGkgaW4gJGFyY2hpbmNsdWRlZGlyOyBkbwogCQlwcnVuZT0iJHBydW5lIC13aG9sZW5hbWUgJGkgLXBydW5lIC1vIgogCWRvbmUKLQlmaW5kICR7dHJlZX1hcmNoLyQxICRpZ25vcmUgJHN1YmFyY2hwcnVuZSAkcHJ1bmUgLW5hbWUgIiQyIiAtcHJpbnQ7CisJZmluZCAke3RyZWV9YXJjaC8kMSAkaWdub3JlICRzdWJhcmNocHJ1bmUgJHBydW5lIC1uYW1lICIkMiIgXAorCQktbm90IC10eXBlIGwgLXByaW50OwogfQogCiAjIGZpbmQgc291cmNlcyBpbiBhcmNoLyQxL2luY2x1ZGUKQEAgLTU3LDE0ICs2MSwxNSBAQAogCQkJCQktbmFtZSBpbmNsdWRlIC10eXBlIGQgLXByaW50KTsKIAlpZiBbIC1uICIkaW5jbHVkZSIgXTsgdGhlbgogCQlhcmNoaW5jbHVkZWRpcj0iJGFyY2hpbmNsdWRlZGlyICRpbmNsdWRlIgotCQlmaW5kICRpbmNsdWRlICRpZ25vcmUgLW5hbWUgIiQyIiAtcHJpbnQ7CisJCWZpbmQgJGluY2x1ZGUgJGlnbm9yZSAtbmFtZSAiJDIiIC1ub3QgLXR5cGUgbCAtcHJpbnQ7CiAJZmkKIH0KIAogIyBmaW5kIHNvdXJjZXMgaW4gaW5jbHVkZS8KIGZpbmRfaW5jbHVkZV9zb3VyY2VzKCkKIHsKLQlmaW5kICR7dHJlZX1pbmNsdWRlICRpZ25vcmUgLW5hbWUgY29uZmlnIC1wcnVuZSAtbyAtbmFtZSAiJDEiIC1wcmludDsKKwlmaW5kICR7dHJlZX1pbmNsdWRlICRpZ25vcmUgLW5hbWUgY29uZmlnIC1wcnVuZSAtbyAtbmFtZSAiJDEiIFwKKwkJLW5vdCAtdHlwZSBsIC1wcmludDsKIH0KIAogIyBmaW5kIHNvdXJjZXMgaW4gcmVzdCBvZiB0cmVlCkBAIC03Myw3ICs3OCw3IEBACiB7CiAJZmluZCAke3RyZWV9KiAkaWdub3JlIFwKIAkgICAgIFwoIC1uYW1lIGluY2x1ZGUgLW8gLW5hbWUgYXJjaCAtbyAtbmFtZSAnLnRtcF8qJyBcKSAtcHJ1bmUgLW8gXAotCSAgICAgICAtbmFtZSAiJDEiIC1wcmludDsKKwkgICAgICAgLW5hbWUgIiQxIiAtbm90IC10eXBlIGwgLXByaW50OwogfQogCiBmaW5kX3NvdXJjZXMoKQpAQCAtMTg3LDYgKzE5MiwxMCBAQAogCS0tcmVnZXgtYysrPScvVEVTVENMRUFSRkxBR19GQUxTRVwoKFteLCldKikuKi9UZXN0Q2xlYXJQYWdlXDEvJyBcCiAJLS1yZWdleC1jKys9Jy9fX1RFU1RDTEVBUkZMQUdfRkFMU0VcKChbXiwpXSopLiovX19UZXN0Q2xlYXJQYWdlXDEvJyBcCiAJLS1yZWdleC1jKys9Jy9fUEVcKChbXiwpXSopLiovUEVWRU5UX0VSUk5PX19cMS8nCQlcCisJLS1yZWdleC1jKys9Jy9URVNUUENHRkxBR1woKFteLCldKikuKi9QYWdlQ2dyb3VwXDEvJwkJXAorCS0tcmVnZXgtYysrPScvU0VUUENHRkxBR1woKFteLCldKikuKi9TZXRQYWdlQ2dyb3VwXDEvJwkJXAorCS0tcmVnZXgtYysrPScvQ0xFQVJQQ0dGTEFHXCgoW14sKV0qKS4qL0NsZWFyUGFnZUNncm91cFwxLycJXAorCS0tcmVnZXgtYysrPScvVEVTVENMRUFSUENHRkxBR1woKFteLCldKikuKi9UZXN0Q2xlYXJQYWdlQ2dyb3VwXDEvJyBcCiAJLS1yZWdleC1jPScvUENJX09QX1JFQURcKChcdyopLipbMS00XVwpL3BjaV9idXNfcmVhZF9jb25maWdfXDEvJyBcCiAJLS1yZWdleC1jPScvUENJX09QX1dSSVRFXCgoXHcqKS4qWzEtNF1cKS9wY2lfYnVzX3dyaXRlX2NvbmZpZ19cMS8nIFwKIAktLXJlZ2V4LWM9Jy9ERUZJTkVfKE1VVEVYfFNFTUFQSE9SRXxTUElOTE9DSylcKChcdyopL1wyL3YvJwlcCkBAIC0yMDEsNyArMjEwLDggQEAKIAktLXJlZ2V4LWM9Jy9ERUNMQVJFXyhUQVNLTEVUfFdPUkt8REVMQVlFRF9XT1JLKVwoKFx3KikvXDIvdi8nCVwKIAktLXJlZ2V4LWM9Jy9ERUZJTkVfUENJX0RFVklDRV9UQUJMRVwoKFx3KikvXDEvdi8nCQlcCiAJLS1yZWdleC1jPScvKF5ccylPRkZTRVRcKChcdyopL1wyL3YvJwkJCQlcCi0JLS1yZWdleC1jPScvKF5ccylERUZJTkVcKChcdyopL1wyL3YvJworCS0tcmVnZXgtYz0nLyheXHMpREVGSU5FXCgoXHcqKS9cMi92LycJCQkJXAorCS0tcmVnZXgtYz0nL0RFRklORV9IQVNIVEFCTEVcKChcdyopL1wxL3YvJwogCiAJYWxsX2tjb25maWdzIHwgeGFyZ3MgJDEgLWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJLS1sYW5nZGVmPWtjb25maWcgLS1sYW5ndWFnZS1mb3JjZT1rY29uZmlnICAgICAgICAgICAgICBcCkBAIC0yNDQsOSArMjU0LDE0IEBACiAJLS1yZWdleD0nL19fQ0xFQVJQQUdFRkxBR19OT09QKFwoW14sKV0qXCkuKi9fX0NsZWFyUGFnZVwxLycgXAogCS0tcmVnZXg9Jy9URVNUQ0xFQVJGTEFHX0ZBTFNFKFwoW14sKV0qXCkuKi9UZXN0Q2xlYXJQYWdlXDEvJyBcCiAJLS1yZWdleD0nL19fVEVTVENMRUFSRkxBR19GQUxTRShcKFteLCldKlwpLiovX19UZXN0Q2xlYXJQYWdlXDEvJyBcCisJLS1yZWdleD0nL1RFU1RQQ0dGTEFHXCgoW14sKV0qKS4qL1BhZ2VDZ3JvdXBcMS8nCVwKKwktLXJlZ2V4PScvU0VUUENHRkxBR1woKFteLCldKikuKi9TZXRQYWdlQ2dyb3VwXDEvJwlcCisJLS1yZWdleD0nL0NMRUFSUENHRkxBR1woKFteLCldKikuKi9DbGVhclBhZ2VDZ3JvdXBcMS8nCVwKKwktLXJlZ2V4PScvVEVTVENMRUFSUENHRkxBR1woKFteLCldKikuKi9UZXN0Q2xlYXJQYWdlQ2dyb3VwXDEvJyBcCiAJLS1yZWdleD0nL19QRShcKFteLCldKlwpLiovUEVWRU5UX0VSUk5PX19cMS8nCQlcCiAJLS1yZWdleD0nL1BDSV9PUF9SRUFEKFwoW2Etel0qW2Etel1cKS4qWzEtNF0pL3BjaV9idXNfcmVhZF9jb25maWdfXDEvJyBcCi0JLS1yZWdleD0nL1BDSV9PUF9XUklURShcKFthLXpdKlthLXpdXCkuKlsxLTRdKS9wY2lfYnVzX3dyaXRlX2NvbmZpZ19cMS8nCisJLS1yZWdleD0nL1BDSV9PUF9XUklURShcKFthLXpdKlthLXpdXCkuKlsxLTRdKS9wY2lfYnVzX3dyaXRlX2NvbmZpZ19cMS8nXAorCS0tcmVnZXg9Jy9ERUZJTkVfSEFTSFRBQkxFXCgoXHcqKS9cMS92LycKIAogCWFsbF9rY29uZmlncyB8IHhhcmdzICQxIC1hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCS0tcmVnZXg9Jy9eWyBcdF0qXChcKG1lbnVcKSpjb25maWdcKVsgXHRdK1woW2EtekEtWjAtOV9dK1wpL1wzLycKQEAgLTI2Niw3ICsyODEsNyBAQAogCQllbWFjcyAkMQogCWVsc2UKIAkJYWxsX3RhcmdldF9zb3VyY2VzIHwgeGFyZ3MgJDEgLWEKLSAgICAgICAgZmkKKwlmaQogfQogCiAjIFN1cHBvcnQgdW0gKHdoaWNoIHVzZXMgU1VCQVJDSCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZyBiL3NlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZwppbmRleCBkMzViNDkxNS4uZDYwNmYzZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZwpAQCAtMTIsMTUgKzEyLDQxIEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCiAKLWNvbmZpZyBFVk1fSE1BQ19WRVJTSU9OCi0JaW50ICJFVk0gSE1BQyB2ZXJzaW9uIgotCWRlcGVuZHMgb24gRVZNCi0JZGVmYXVsdCAyCi0JaGVscAotCSAgVGhpcyBvcHRpb25zIGFkZHMgRVZNIEhNQUMgdmVyc2lvbiBzdXBwb3J0LgotCSAgMSAtIG9yaWdpbmFsIHZlcnNpb24KLQkgIDIgLSBhZGQgcGVyIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpIChkZWZhdWx0KQoraWYgRVZNCiAKLQkgIFdBUk5JTkc6IGNoYW5naW5nIHRoZSBITUFDIGNhbGN1bGF0aW9uIG1ldGhvZCBvciBhZGRpbmcgCittZW51ICJFVk0gb3B0aW9ucyIKKworY29uZmlnIEVWTV9BVFRSX0ZTVVVJRAorCWJvb2wgIkZTVVVJRCAodmVyc2lvbiAyKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEVWTQorCWhlbHAKKwkgIEluY2x1ZGUgZmlsZXN5c3RlbSBVVUlEIGZvciBITUFDIGNhbGN1bGF0aW9uLgorCisJICBEZWZhdWx0IHZhbHVlIGlzICdzZWxlY3RlZCcsIHdoaWNoIGlzIGZvcm1lciB2ZXJzaW9uIDIuCisJICBpZiAnbm90IHNlbGVjdGVkJywgaXQgaXMgZm9ybWVyIHZlcnNpb24gMQorCisJICBXQVJOSU5HOiBjaGFuZ2luZyB0aGUgSE1BQyBjYWxjdWxhdGlvbiBtZXRob2Qgb3IgYWRkaW5nCiAJICBhZGRpdGlvbmFsIGluZm8gdG8gdGhlIGNhbGN1bGF0aW9uLCByZXF1aXJlcyBleGlzdGluZyBFVk0KLQkgIGxhYmVsZWQgZmlsZSBzeXN0ZW1zIHRvIGJlIHJlbGFiZWxlZC4gIAorCSAgbGFiZWxlZCBmaWxlIHN5c3RlbXMgdG8gYmUgcmVsYWJlbGVkLgorCitjb25maWcgRVZNX0VYVFJBX1NNQUNLX1hBVFRSUworCWJvb2wgIkFkZGl0aW9uYWwgU01BQ0sgeGF0dHJzIgorCWRlcGVuZHMgb24gRVZNICYmIFNFQ1VSSVRZX1NNQUNLCisJZGVmYXVsdCBuCisJaGVscAorCSAgSW5jbHVkZSBhZGRpdGlvbmFsIFNNQUNLIHhhdHRycyBmb3IgSE1BQyBjYWxjdWxhdGlvbi4KKworCSAgSW4gYWRkaXRpb24gdG8gdGhlIG9yaWdpbmFsIHNlY3VyaXR5IHhhdHRycyAoZWcuIHNlY3VyaXR5LnNlbGludXgsCisJICBzZWN1cml0eS5TTUFDSzY0LCBzZWN1cml0eS5jYXBhYmlsaXR5LCBhbmQgc2VjdXJpdHkuaW1hKSBpbmNsdWRlZAorCSAgaW4gdGhlIEhNQUMgY2FsY3VsYXRpb24sIGVuYWJsaW5nIHRoaXMgb3B0aW9uIGluY2x1ZGVzIG5ld2x5IGRlZmluZWQKKwkgIFNtYWNrIHhhdHRyczogc2VjdXJpdHkuU01BQ0s2NEVYRUMsIHNlY3VyaXR5LlNNQUNLNjRUUkFOU01VVEUgYW5kCisJICBzZWN1cml0eS5TTUFDSzY0TU1BUC4KKworCSAgV0FSTklORzogY2hhbmdpbmcgdGhlIEhNQUMgY2FsY3VsYXRpb24gbWV0aG9kIG9yIGFkZGluZworCSAgYWRkaXRpb25hbCBpbmZvIHRvIHRoZSBjYWxjdWxhdGlvbiwgcmVxdWlyZXMgZXhpc3RpbmcgRVZNCisJICBsYWJlbGVkIGZpbGUgc3lzdGVtcyB0byBiZSByZWxhYmVsZWQuCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9ldm0vZXZtLmggYi9zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL2V2bS5oCmluZGV4IDM3Yzg4ZGQuLjg4YmZlNzcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2ludGVncml0eS9ldm0vZXZtLmgKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm0uaApAQCAtMjQsNyArMjQsMTAgQEAKIGV4dGVybiBpbnQgZXZtX2luaXRpYWxpemVkOwogZXh0ZXJuIGNoYXIgKmV2bV9obWFjOwogZXh0ZXJuIGNoYXIgKmV2bV9oYXNoOwotZXh0ZXJuIGludCBldm1faG1hY192ZXJzaW9uOworCisjZGVmaW5lIEVWTV9BVFRSX0ZTVVVJRAkJMHgwMDAxCisKK2V4dGVybiBpbnQgZXZtX2htYWNfYXR0cnM7CiAKIGV4dGVybiBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpobWFjX3RmbTsKIGV4dGVybiBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpoYXNoX3RmbTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9ldm0vZXZtX2NyeXB0by5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fY3J5cHRvLmMKaW5kZXggNmI1NDBmMS4uNWU5Njg3ZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fY3J5cHRvLmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fY3J5cHRvLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCWhtYWNfbWlzYy5naWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgaW5vZGUtPmlfZ2lkKTsKIAlobWFjX21pc2MubW9kZSA9IGlub2RlLT5pX21vZGU7CiAJY3J5cHRvX3NoYXNoX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmaG1hY19taXNjLCBzaXplb2YoaG1hY19taXNjKSk7Ci0JaWYgKGV2bV9obWFjX3ZlcnNpb24gPiAxKQorCWlmIChldm1faG1hY19hdHRycyAmIEVWTV9BVFRSX0ZTVVVJRCkKIAkJY3J5cHRvX3NoYXNoX3VwZGF0ZShkZXNjLCBpbm9kZS0+aV9zYi0+c191dWlkLAogCQkJCSAgICBzaXplb2YoaW5vZGUtPmlfc2ItPnNfdXVpZCkpOwogCWNyeXB0b19zaGFzaF9maW5hbChkZXNjLCBkaWdlc3QpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fbWFpbi5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fbWFpbi5jCmluZGV4IDZlMGJkOTMuLjNiY2I4MGRmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL2V2bV9tYWluLmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2V2bS9ldm1fbWFpbi5jCkBAIC0zMiw3ICszMiw3IEBACiB9OwogY2hhciAqZXZtX2htYWMgPSAiaG1hYyhzaGExKSI7CiBjaGFyICpldm1faGFzaCA9ICJzaGExIjsKLWludCBldm1faG1hY192ZXJzaW9uID0gQ09ORklHX0VWTV9ITUFDX1ZFUlNJT047CitpbnQgZXZtX2htYWNfYXR0cnM7CiAKIGNoYXIgKmV2bV9jb25maWdfeGF0dHJuYW1lc1tdID0gewogI2lmZGVmIENPTkZJR19TRUNVUklUWV9TRUxJTlVYCkBAIC00MCw2ICs0MCwxMSBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NNQUNLCiAJWEFUVFJfTkFNRV9TTUFDSywKKyNpZmRlZiBDT05GSUdfRVZNX0VYVFJBX1NNQUNLX1hBVFRSUworCVhBVFRSX05BTUVfU01BQ0tFWEVDLAorCVhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUsCisJWEFUVFJfTkFNRV9TTUFDS01NQVAsCisjZW5kaWYKICNlbmRpZgogI2lmZGVmIENPTkZJR19JTUFfQVBQUkFJU0UKIAlYQVRUUl9OQU1FX0lNQSwKQEAgLTU3LDYgKzYyLDE0IEBACiB9CiBfX3NldHVwKCJldm09IiwgZXZtX3NldF9maXhtb2RlKTsKIAorc3RhdGljIHZvaWQgX19pbml0IGV2bV9pbml0X2NvbmZpZyh2b2lkKQoreworI2lmZGVmIENPTkZJR19FVk1fQVRUUl9GU1VVSUQKKwlldm1faG1hY19hdHRycyB8PSBFVk1fQVRUUl9GU1VVSUQ7CisjZW5kaWYKKwlwcl9pbmZvKCJITUFDIGF0dHJzOiAweCV4XG4iLCBldm1faG1hY19hdHRycyk7Cit9CisKIHN0YXRpYyBpbnQgZXZtX2ZpbmRfcHJvdGVjdGVkX3hhdHRycyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTI4NywxMiArMzAwLDIwIEBACiAgKiBAeGF0dHJfdmFsdWU6IHBvaW50ZXIgdG8gdGhlIG5ldyBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAqIEB4YXR0cl92YWx1ZV9sZW46IHBvaW50ZXIgdG8gdGhlIG5ldyBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoCiAgKgotICogVXBkYXRpbmcgJ3NlY3VyaXR5LmV2bScgcmVxdWlyZXMgQ0FQX1NZU19BRE1JTiBwcml2aWxlZ2VzIGFuZCB0aGF0Ci0gKiB0aGUgY3VycmVudCB2YWx1ZSBpcyB2YWxpZC4KKyAqIEJlZm9yZSBhbGxvd2luZyB0aGUgJ3NlY3VyaXR5LmV2bScgcHJvdGVjdGVkIHhhdHRyIHRvIGJlIHVwZGF0ZWQsCisgKiB2ZXJpZnkgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHZhbGlkLiAgQXMgb25seSB0aGUga2VybmVsIHNob3VsZCBoYXZlCisgKiBhY2Nlc3MgdG8gdGhlIEVWTSBlbmNyeXB0ZWQga2V5IG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIEhNQUMsIHByZXZlbnQKKyAqIHVzZXJzcGFjZSBmcm9tIHdyaXRpbmcgSE1BQyB2YWx1ZS4gIFdyaXRpbmcgJ3NlY3VyaXR5LmV2bScgcmVxdWlyZXMKKyAqIHJlcXVpcmVzIENBUF9TWVNfQURNSU4gcHJpdmlsZWdlcy4KICAqLwogaW50IGV2bV9pbm9kZV9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnhhdHRyX25hbWUsCiAJCSAgICAgICBjb25zdCB2b2lkICp4YXR0cl92YWx1ZSwgc2l6ZV90IHhhdHRyX3ZhbHVlX2xlbikKIHsKKwljb25zdCBzdHJ1Y3QgZXZtX2ltYV94YXR0cl9kYXRhICp4YXR0cl9kYXRhID0geGF0dHJfdmFsdWU7CisKKwlpZiAoKHN0cmNtcCh4YXR0cl9uYW1lLCBYQVRUUl9OQU1FX0VWTSkgPT0gMCkKKwkgICAgJiYgKHhhdHRyX2RhdGEtPnR5cGUgPT0gRVZNX1hBVFRSX0hNQUMpKQorCQlyZXR1cm4gLUVQRVJNOwogCXJldHVybiBldm1fcHJvdGVjdF94YXR0cihkZW50cnksIHhhdHRyX25hbWUsIHhhdHRyX3ZhbHVlLAogCQkJCSB4YXR0cl92YWx1ZV9sZW4pOwogfQpAQCAtNDMyLDYgKzQ1Myw4IEBACiB7CiAJaW50IGVycm9yOwogCisJZXZtX2luaXRfY29uZmlnKCk7CisKIAllcnJvciA9IGV2bV9pbml0X3NlY2ZzKCk7CiAJaWYgKGVycm9yIDwgMCkgewogCQlwcl9pbmZvKCJFcnJvciByZWdpc3RlcmluZyBzZWNmc1xuIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9hcHByYWlzZS5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfYXBwcmFpc2UuYwppbmRleCAyOTFiZjBmLi5kMzExM2Q0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9hcHByYWlzZS5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2FwcHJhaXNlLmMKQEAgLTM0MSw3ICszNDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpbWFfcmVzZXRfYXBwcmFpc2VfZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyB2b2lkIGltYV9yZXNldF9hcHByYWlzZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGlnc2lnKQogewogCXN0cnVjdCBpbnRlZ3JpdHlfaWludF9jYWNoZSAqaWludDsKIApAQCAtMzUzLDE4ICszNTMsMjIgQEAKIAkJcmV0dXJuOwogCiAJaWludC0+ZmxhZ3MgJj0gfklNQV9ET05FX01BU0s7CisJaWYgKGRpZ3NpZykKKwkJaWludC0+ZmxhZ3MgfD0gSU1BX0RJR1NJRzsKIAlyZXR1cm47CiB9CiAKIGludCBpbWFfaW5vZGVfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICp4YXR0cl9uYW1lLAogCQkgICAgICAgY29uc3Qgdm9pZCAqeGF0dHJfdmFsdWUsIHNpemVfdCB4YXR0cl92YWx1ZV9sZW4pCiB7CisJY29uc3Qgc3RydWN0IGV2bV9pbWFfeGF0dHJfZGF0YSAqeHZhbHVlID0geGF0dHJfdmFsdWU7CiAJaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IGltYV9wcm90ZWN0X3hhdHRyKGRlbnRyeSwgeGF0dHJfbmFtZSwgeGF0dHJfdmFsdWUsCiAJCQkJICAgeGF0dHJfdmFsdWVfbGVuKTsKIAlpZiAocmVzdWx0ID09IDEpIHsKLQkJaW1hX3Jlc2V0X2FwcHJhaXNlX2ZsYWdzKGRlbnRyeS0+ZF9pbm9kZSk7CisJCWltYV9yZXNldF9hcHByYWlzZV9mbGFncyhkZW50cnktPmRfaW5vZGUsCisJCQkgKHh2YWx1ZS0+dHlwZSA9PSBFVk1fSU1BX1hBVFRSX0RJR1NJRykgPyAxIDogMCk7CiAJCXJlc3VsdCA9IDA7CiAJfQogCXJldHVybiByZXN1bHQ7CkBAIC0zNzYsNyArMzgwLDcgQEAKIAogCXJlc3VsdCA9IGltYV9wcm90ZWN0X3hhdHRyKGRlbnRyeSwgeGF0dHJfbmFtZSwgTlVMTCwgMCk7CiAJaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCWltYV9yZXNldF9hcHByYWlzZV9mbGFncyhkZW50cnktPmRfaW5vZGUpOworCQlpbWFfcmVzZXRfYXBwcmFpc2VfZmxhZ3MoZGVudHJ5LT5kX2lub2RlLCAwKTsKIAkJcmVzdWx0ID0gMDsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2NyeXB0by5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKaW5kZXggMWJkZThlNi4uY2NkMGFjOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKQEAgLTI3LDYgKzI3LDM2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICppbWFfc2hhc2hfdGZtOwogCisvKioKKyAqIGltYV9rZXJuZWxfcmVhZCAtIHJlYWQgZmlsZSBjb250ZW50CisgKgorICogVGhpcyBpcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIGZpbGUgY29udGVudCBpbnN0ZWFkIG9mIGtlcm5lbF9yZWFkKCkuCisgKiBJdCBkb2VzIG5vdCBwZXJmb3JtIGxvY2tpbmcgY2hlY2tzIHRvIGVuc3VyZSBpdCBjYW5ub3QgYmUgYmxvY2tlZC4KKyAqIEl0IGRvZXMgbm90IHBlcmZvcm0gc2VjdXJpdHkgY2hlY2tzIGJlY2F1c2UgaXQgaXMgaXJyZWxldmFudCBmb3IgSU1BLgorICoKKyAqLworc3RhdGljIGludCBpbWFfa2VybmVsX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsCisJCQkgICBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJY2hhciBfX3VzZXIgKmJ1ZiA9IGFkZHI7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWZpbGUtPmZfb3AtPnJlYWQgJiYgIWZpbGUtPmZfb3AtPmFpb19yZWFkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJaWYgKGZpbGUtPmZfb3AtPnJlYWQpCisJCXJldCA9IGZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgYnVmLCBjb3VudCwgJm9mZnNldCk7CisJZWxzZQorCQlyZXQgPSBkb19zeW5jX3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgJm9mZnNldCk7CisJc2V0X2ZzKG9sZF9mcyk7CisJcmV0dXJuIHJldDsKK30KKwogaW50IGltYV9pbml0X2NyeXB0byh2b2lkKQogewogCWxvbmcgcmM7CkBAIC0xMDQsNyArMTM0LDcgQEAKIAl3aGlsZSAob2Zmc2V0IDwgaV9zaXplKSB7CiAJCWludCByYnVmX2xlbjsKIAotCQlyYnVmX2xlbiA9IGtlcm5lbF9yZWFkKGZpbGUsIG9mZnNldCwgcmJ1ZiwgUEFHRV9TSVpFKTsKKwkJcmJ1Zl9sZW4gPSBpbWFfa2VybmVsX3JlYWQoZmlsZSwgb2Zmc2V0LCByYnVmLCBQQUdFX1NJWkUpOwogCQlpZiAocmJ1Zl9sZW4gPCAwKSB7CiAJCQlyYyA9IHJidWZfbGVuOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9tYWluLmMgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9tYWluLmMKaW5kZXggZGNjOThjZi4uMDliYWEzMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfbWFpbi5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX21haW4uYwpAQCAtODEsNyArODEsNiBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOwogCWZtb2RlX3QgbW9kZSA9IGZpbGUtPmZfbW9kZTsKLQlpbnQgbXVzdF9tZWFzdXJlOwogCWJvb2wgc2VuZF90b210b3UgPSBmYWxzZSwgc2VuZF93cml0ZXJzID0gZmFsc2U7CiAJY2hhciAqcGF0aGJ1ZiA9IE5VTEw7CiAJY29uc3QgY2hhciAqcGF0aG5hbWU7CkBAIC05MiwxOCArOTEsMTkgQEAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CS8qIGZpbGUgbWV0YWRhdGE6IHBlcm1pc3Npb25zLCB4YXR0ciAqLwogCiAJaWYgKG1vZGUgJiBGTU9ERV9XUklURSkgewotCQlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3JlYWRjb3VudCkgJiYgSVNfSU1BKGlub2RlKSkKLQkJCXNlbmRfdG9tdG91ID0gdHJ1ZTsKLQkJZ290byBvdXQ7CisJCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfcmVhZGNvdW50KSAmJiBJU19JTUEoaW5vZGUpKSB7CisJCQlzdHJ1Y3QgaW50ZWdyaXR5X2lpbnRfY2FjaGUgKmlpbnQ7CisJCQlpaW50ID0gaW50ZWdyaXR5X2lpbnRfZmluZChpbm9kZSk7CisJCQkvKiBJTUFfTUVBU1VSRSBpcyBzZXQgZnJvbSByZWFkZXIgc2lkZSAqLworCQkJaWYgKGlpbnQgJiYgKGlpbnQtPmZsYWdzICYgSU1BX01FQVNVUkUpKQorCQkJCXNlbmRfdG9tdG91ID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkgJiYKKwkJICAgIGltYV9tdXN0X21lYXN1cmUoaW5vZGUsIE1BWV9SRUFELCBGSUxFX0NIRUNLKSkKKwkJCXNlbmRfd3JpdGVycyA9IHRydWU7CiAJfQogCi0JbXVzdF9tZWFzdXJlID0gaW1hX211c3RfbWVhc3VyZShpbm9kZSwgTUFZX1JFQUQsIEZJTEVfQ0hFQ0spOwotCWlmICghbXVzdF9tZWFzdXJlKQotCQlnb3RvIG91dDsKLQotCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPiAwKQotCQlzZW5kX3dyaXRlcnMgPSB0cnVlOwotb3V0OgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYgKCFzZW5kX3RvbXRvdSAmJiAhc2VuZF93cml0ZXJzKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NtYXAuaAppbmRleCAxNGQwNGU2Li5iZTQ5MWE3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NtYXAuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NtYXAuaApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJeyAicGVlciIsIHsgInJlY3YiLCBOVUxMIH0gfSwKIAl7ICJjYXBhYmlsaXR5MiIsCiAJICB7ICJtYWNfb3ZlcnJpZGUiLCAibWFjX2FkbWluIiwgInN5c2xvZyIsICJ3YWtlX2FsYXJtIiwgImJsb2NrX3N1c3BlbmQiLAotCSAgICBOVUxMIH0gfSwKKwkgICAgImF1ZGl0X3JlYWQiLCBOVUxMIH0gfSwKIAl7ICJrZXJuZWxfc2VydmljZSIsIHsgInVzZV9hc19vdmVycmlkZSIsICJjcmVhdGVfZmlsZXNfYXMiLCBOVUxMIH0gfSwKIAl7ICJ0dW5fc29ja2V0IiwKIAkgIHsgQ09NTU9OX1NPQ0tfUEVSTVMsICJhdHRhY2hfcXVldWUiLCBOVUxMIH0gfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYwppbmRleCA1YjVlYjc4Li5jMWI0OWMzIDEwMDY0NAotLS0gYS90b29scy9saWIvYXBpL2ZzL2ZzLmMKKysrIGIvdG9vbHMvbGliL2FwaS9mcy9mcy5jCkBAIC0xLDggKzEsMTAgQEAKIC8qIFRPRE8gbWVyZ2UvZmFjdG9yIGluIGRlYnVnZnMuYyBoZXJlICovCiAKKyNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3Zmcy5oPgogCkBAIC05NiwxMiArOTgsNTEgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIG1lbV90b3VwcGVyKGNoYXIgKmYsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQkqZiA9IHRvdXBwZXIoKmYpOworCQlmKys7CisJCWxlbi0tOworCX0KK30KKworLyoKKyAqIENoZWNrIGZvciAiTkFNRV9QQVRIIiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycmlkZSBmcyBsb2NhdGlvbiAoZm9yCisgKiB0ZXN0aW5nKS4gVGhpcyBtYXRjaGVzIHRoZSByZWNvbW1lbmRhdGlvbiBpbiBEb2N1bWVudGF0aW9uL3N5c2ZzLXJ1bGVzLnR4dAorICogZm9yIFNZU0ZTX1BBVEguCisgKi8KK3N0YXRpYyBib29sIGZzX19lbnZfb3ZlcnJpZGUoc3RydWN0IGZzICpmcykKK3sKKwljaGFyICpvdmVycmlkZV9wYXRoOworCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbihmcy0+bmFtZSk7CisJLyogbmFtZSArICJfUEFUSCIgKyAnXDAnICovCisJY2hhciB1cHBlcl9uYW1lW25hbWVfbGVuICsgNSArIDFdOworCW1lbWNweSh1cHBlcl9uYW1lLCBmcy0+bmFtZSwgbmFtZV9sZW4pOworCW1lbV90b3VwcGVyKHVwcGVyX25hbWUsIG5hbWVfbGVuKTsKKwlzdHJjcHkoJnVwcGVyX25hbWVbbmFtZV9sZW5dLCAiX1BBVEgiKTsKKworCW92ZXJyaWRlX3BhdGggPSBnZXRlbnYodXBwZXJfbmFtZSk7CisJaWYgKCFvdmVycmlkZV9wYXRoKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmcy0+Zm91bmQgPSB0cnVlOworCXN0cm5jcHkoZnMtPnBhdGgsIG92ZXJyaWRlX3BhdGgsIHNpemVvZihmcy0+cGF0aCkpOworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqZnNfX2dldF9tb3VudHBvaW50KHN0cnVjdCBmcyAqZnMpCiB7CisJaWYgKGZzX19lbnZfb3ZlcnJpZGUoZnMpKQorCQlyZXR1cm4gZnMtPnBhdGg7CisKIAlpZiAoZnNfX2NoZWNrX21vdW50cyhmcykpCiAJCXJldHVybiBmcy0+cGF0aDsKIAotCXJldHVybiBmc19fcmVhZF9tb3VudHMoZnMpID8gZnMtPnBhdGggOiBOVUxMOworCWlmIChmc19fcmVhZF9tb3VudHMoZnMpKQorCQlyZXR1cm4gZnMtPnBhdGg7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmZzX19tb3VudHBvaW50KGludCBpZHgpCmRpZmYgLS1naXQgYS90b29scy9uZXQvYnBmX2V4cC5sIGIvdG9vbHMvbmV0L2JwZl9leHAubAppbmRleCBiZjdiZTc3Li44MzNhOTY2IDEwMDY0NAotLS0gYS90b29scy9uZXQvYnBmX2V4cC5sCisrKyBiL3Rvb2xzL25ldC9icGZfZXhwLmwKQEAgLTkyLDYgKzkyLDcgQEAKICIjIj8oImNwdSIpCXsgcmV0dXJuIEtfQ1BVOyB9CiAiIyI/KCJ2bGFuX3RjaSIpIHsgcmV0dXJuIEtfVkxBTlQ7IH0KICIjIj8oInZsYW5fcHIiKQl7IHJldHVybiBLX1ZMQU5QOyB9CisiIyI/KCJyYW5kIikJeyByZXR1cm4gS19SQU5EOyB9CiAKICI6IgkJeyByZXR1cm4gJzonOyB9CiAiLCIJCXsgcmV0dXJuICcsJzsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbmV0L2JwZl9leHAueSBiL3Rvb2xzL25ldC9icGZfZXhwLnkKaW5kZXggZDE1ZWZjOS4uZTYzMDZjNSAxMDA2NDQKLS0tIGEvdG9vbHMvbmV0L2JwZl9leHAueQorKysgYi90b29scy9uZXQvYnBmX2V4cC55CkBAIC01Niw3ICs1Niw3IEBACiAldG9rZW4gT1BfTERYSQogCiAldG9rZW4gS19QS1RfTEVOIEtfUFJPVE8gS19UWVBFIEtfTkxBVFRSIEtfTkxBVFRSX05FU1QgS19NQVJLIEtfUVVFVUUgS19IQVRZUEUKLSV0b2tlbiBLX1JYSEFTSCBLX0NQVSBLX0lGSURYIEtfVkxBTlQgS19WTEFOUCBLX1BPRkYKKyV0b2tlbiBLX1JYSEFTSCBLX0NQVSBLX0lGSURYIEtfVkxBTlQgS19WTEFOUCBLX1BPRkYgS19SQU5ECiAKICV0b2tlbiAnOicgJywnICdbJyAnXScgJygnICcpJyAneCcgJ2EnICcrJyAnTScgJyonICcmJyAnIycgJyUnCiAKQEAgLTE2NCw2ICsxNjQsOSBAQAogCXwgT1BfTERCIEtfUE9GRiB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKTsgfQorCXwgT1BfTERCIEtfUkFORCB7CisJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDAsIDAsCisJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET00pOyB9CiAJOwogCiBsZGgKQEAgLTIxMiw2ICsyMTUsOSBAQAogCXwgT1BfTERIIEtfUE9GRiB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKTsgfQorCXwgT1BfTERIIEtfUkFORCB7CisJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDAsIDAsCisJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET00pOyB9CiAJOwogCiBsZGkKQEAgLTI2NSw2ICsyNzEsOSBAQAogCXwgT1BfTEQgS19QT0ZGIHsKIAkJYnBmX3NldF9jdXJyX2luc3RyKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywgMCwgMCwKIAkJCQkgICBTS0ZfQURfT0ZGICsgU0tGX0FEX1BBWV9PRkZTRVQpOyB9CisJfCBPUF9MRCBLX1JBTkQgeworCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLCAwLCAwLAorCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfUkFORE9NKTsgfQogCXwgT1BfTEQgJ00nICdbJyBudW1iZXIgJ10nIHsKIAkJYnBmX3NldF9jdXJyX2luc3RyKEJQRl9MRCB8IEJQRl9NRU0sIDAsIDAsICQ0KTsgfQogCXwgT1BfTEQgJ1snICd4JyAnKycgbnVtYmVyICddJyB7CmRpZmYgLS1naXQgYS90b29scy9uZXQvYnBmX2ppdF9kaXNhc20uYyBiL3Rvb2xzL25ldC9icGZfaml0X2Rpc2FzbS5jCmluZGV4IGNmZTBjZGMuLmM1YmFmOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL25ldC9icGZfaml0X2Rpc2FzbS5jCisrKyBiL3Rvb2xzL25ldC9icGZfaml0X2Rpc2FzbS5jCkBAIC00Myw4ICs0Myw3IEBACiAJZnJlZShwYXRoKTsKIH0KIAotc3RhdGljIHZvaWQgZ2V0X2FzbV9pbnNucyh1aW50OF90ICppbWFnZSwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBiYXNlLAotCQkJICBpbnQgb3Bjb2RlcykKK3N0YXRpYyB2b2lkIGdldF9hc21faW5zbnModWludDhfdCAqaW1hZ2UsIHNpemVfdCBsZW4sIGludCBvcGNvZGVzKQogewogCWludCBjb3VudCwgaSwgcGMgPSAwOwogCWNoYXIgdHBhdGhbMjU2XTsKQEAgLTEwNywxMyArMTA2LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2xhc3Rfaml0X2ltYWdlKGNoYXIgKmhheXN0YWNrLCBzaXplX3QgaGxlbiwKLQkJCSAgICAgIHVpbnQ4X3QgKmltYWdlLCBzaXplX3QgaWxlbiwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmJhc2UpCisJCQkgICAgICB1aW50OF90ICppbWFnZSwgc2l6ZV90IGlsZW4pCiB7CiAJY2hhciAqcHRyLCAqcHB0ciwgKnRtcDsKIAlvZmZfdCBvZmYgPSAwOwogCWludCByZXQsIGZsZW4sIHByb2dsZW4sIHBhc3MsIHVsZW4gPSAwOwogCXJlZ21hdGNoX3QgcG1hdGNoWzFdOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAlyZWdleF90IHJlZ2V4OwogCiAJaWYgKGhsZW4gPT0gMCkKQEAgLTEzNiw3ICsxMzUsNyBAQAogCiAJcHRyID0gaGF5c3RhY2sgKyBvZmYgLSAocG1hdGNoWzBdLnJtX2VvIC0gcG1hdGNoWzBdLnJtX3NvKTsKIAlyZXQgPSBzc2NhbmYocHRyLCAiZmxlbj0lZCBwcm9nbGVuPSVkIHBhc3M9JWQgaW1hZ2U9JWx4IiwKLQkJICAgICAmZmxlbiwgJnByb2dsZW4sICZwYXNzLCBiYXNlKTsKKwkJICAgICAmZmxlbiwgJnByb2dsZW4sICZwYXNzLCAmYmFzZSk7CiAJaWYgKHJldCAhPSA0KQogCQlyZXR1cm4gMDsKIApAQCAtMTYyLDcgKzE2MSw3IEBACiAJYXNzZXJ0KHVsZW4gPT0gcHJvZ2xlbik7CiAJcHJpbnRmKCIlZCBieXRlcyBlbWl0dGVkIGZyb20gSklUIGNvbXBpbGVyIChwYXNzOiVkLCBmbGVuOiVkKVxuIiwKIAkgICAgICAgcHJvZ2xlbiwgcGFzcywgZmxlbik7Ci0JcHJpbnRmKCIlbHggKyA8eD46XG4iLCAqYmFzZSk7CisJcHJpbnRmKCIlbHggKyA8eD46XG4iLCBiYXNlKTsKIAogCXJlZ2ZyZWUoJnJlZ2V4KTsKIAlyZXR1cm4gdWxlbjsKQEAgLTE3Miw4ICsxNzEsNyBAQAogewogCWludCBsZW4sIGtsZW4sIG9wY29kZXMgPSAwOwogCWNoYXIgKmtidWZmOwotCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQl1aW50OF90IGltYWdlWzQwOTZdOworCXN0YXRpYyB1aW50OF90IGltYWdlWzMyNzY4XTsKIAogCWlmIChhcmdjID4gMSkgewogCQlpZiAoIXN0cm5jbXAoIi1vIiwgYXJndlthcmdjIC0gMV0sIDIpKSB7CkBAIC0xODksOSArMTg3LDkgQEAKIAogCWtidWZmID0gZ2V0X2tsb2dfYnVmZigma2xlbik7CiAKLQlsZW4gPSBnZXRfbGFzdF9qaXRfaW1hZ2Uoa2J1ZmYsIGtsZW4sIGltYWdlLCBzaXplb2YoaW1hZ2UpLCAmYmFzZSk7Ci0JaWYgKGxlbiA+IDAgJiYgYmFzZSA+IDApCi0JCWdldF9hc21faW5zbnMoaW1hZ2UsIGxlbiwgYmFzZSwgb3Bjb2Rlcyk7CisJbGVuID0gZ2V0X2xhc3Rfaml0X2ltYWdlKGtidWZmLCBrbGVuLCBpbWFnZSwgc2l6ZW9mKGltYWdlKSk7CisJaWYgKGxlbiA+IDApCisJCWdldF9hc21faW5zbnMoaW1hZ2UsIGxlbiwgb3Bjb2Rlcyk7CiAKIAlwdXRfa2xvZ19idWZmKGtidWZmKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKaW5kZXggYzcxYjBmMy4uZDQ2MDA0OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CkBAIC0xODQsOSArMTg0LDEwIEBACiAJLSBpbl90eDogb25seSB3aGVuIHRoZSB0YXJnZXQgaXMgaW4gYSBoYXJkd2FyZSB0cmFuc2FjdGlvbgogCS0gbm9fdHg6IG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBpbiBhIGhhcmR3YXJlIHRyYW5zYWN0aW9uCiAJLSBhYm9ydF90eDogb25seSB3aGVuIHRoZSB0YXJnZXQgaXMgYSBoYXJkd2FyZSB0cmFuc2FjdGlvbiBhYm9ydAorCS0gY29uZDogY29uZGl0aW9uYWwgYnJhbmNoZXMKIAogKwotVGhlIG9wdGlvbiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnJhbmNoIHR5cGUgYW1vbmcgYW55LCBhbnlfY2FsbCwgYW55X3JldCwgaW5kX2NhbGwuCitUaGUgb3B0aW9uIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBicmFuY2ggdHlwZSBhbW9uZyBhbnksIGFueV9jYWxsLCBhbnlfcmV0LCBpbmRfY2FsbCwgY29uZC4KIFRoZSBwcml2aWxlZ2UgbGV2ZWxzIG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlLCB0aGUgcHJpdmlsZWdlIGxldmVscyBvZiB0aGUgYXNzb2NpYXRlZAogZXZlbnQgYXJlIGFwcGxpZWQgdG8gdGhlIGJyYW5jaCBmaWx0ZXIuIEJvdGgga2VybmVsIChrKSBhbmQgaHlwZXJ2aXNvciAoaHYpIHByaXZpbGVnZQogbGV2ZWxzIGFyZSBzdWJqZWN0IHRvIHBlcm1pc3Npb25zLiAgV2hlbiBzYW1wbGluZyBvbiBtdWx0aXBsZSBldmVudHMsIGJyYW5jaCBzdGFjayBzYW1wbGluZwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKaW5kZXggYTFiNTE4NS4uY2VmZGY0MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0CkBAIC0xMTEsNyArMTExLDcgQEAKIC0tZmllbGRzPTo6CiAJU3BlY2lmeSBvdXRwdXQgZmllbGQgLSBtdWx0aXBsZSBrZXlzIGNhbiBiZSBzcGVjaWZpZWQgaW4gQ1NWIGZvcm1hdC4KIAlGb2xsb3dpbmcgZmllbGRzIGFyZSBhdmFpbGFibGU6Ci0Jb3ZlcmhlYWQsIG92ZXJoZWFkX3N5cywgb3ZlcmhlYWRfdXMsIHNhbXBsZSBhbmQgcGVyaW9kLgorCW92ZXJoZWFkLCBvdmVyaGVhZF9zeXMsIG92ZXJoZWFkX3VzLCBvdmVyaGVhZF9jaGlsZHJlbiwgc2FtcGxlIGFuZCBwZXJpb2QuCiAJQWxzbyBpdCBjYW4gY29udGFpbiBhbnkgc29ydCBrZXkocykuCiAKIAlCeSBkZWZhdWx0LCBldmVyeSBzb3J0IGtleXMgbm90IHNwZWNpZmllZCBpbiAtRiB3aWxsIGJlIGFwcGVuZGVkCkBAIC0xNjMsNiArMTYzLDExIEBACiAKIAlEZWZhdWx0OiBmcmFjdGFsLDAuNSxjYWxsZWUsZnVuY3Rpb24uCiAKKy0tY2hpbGRyZW46OgorCUFjY3VtdWxhdGUgY2FsbGNoYWluIG9mIGNoaWxkcmVuIHRvIHBhcmVudCBlbnRyeSBzbyB0aGF0IHRoZW4gY2FuCisJc2hvdyB1cCBpbiB0aGUgb3V0cHV0LiAgVGhlIG91dHB1dCB3aWxsIGhhdmUgYSBuZXcgIkNoaWxkcmVuIiBjb2x1bW4KKwlhbmQgd2lsbCBiZSBzb3J0ZWQgb24gdGhlIGRhdGEuICBJdCByZXF1aXJlcyBjYWxsY2hhaW5zIGFyZSByZWNvcmRlZC4KKwogLS1tYXgtc3RhY2s6OgogCVNldCB0aGUgc3RhY2sgZGVwdGggbGltaXQgd2hlbiBwYXJzaW5nIHRoZSBjYWxsY2hhaW4sIGFueXRoaW5nCiAJYmV5b25kIHRoZSBzcGVjaWZpZWQgZGVwdGggd2lsbCBiZSBpZ25vcmVkLiBUaGlzIGlzIGEgdHJhZGUtb2ZmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10b3AudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdG9wLnR4dAppbmRleCBkY2ZhNTRjLi4xODBhZTAyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10b3AudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRvcC50eHQKQEAgLTExOSw3ICsxMTksNyBAQAogLS1maWVsZHM9OjoKIAlTcGVjaWZ5IG91dHB1dCBmaWVsZCAtIG11bHRpcGxlIGtleXMgY2FuIGJlIHNwZWNpZmllZCBpbiBDU1YgZm9ybWF0LgogCUZvbGxvd2luZyBmaWVsZHMgYXJlIGF2YWlsYWJsZToKLQlvdmVyaGVhZCwgb3ZlcmhlYWRfc3lzLCBvdmVyaGVhZF91cywgc2FtcGxlIGFuZCBwZXJpb2QuCisJb3ZlcmhlYWQsIG92ZXJoZWFkX3N5cywgb3ZlcmhlYWRfdXMsIG92ZXJoZWFkX2NoaWxkcmVuLCBzYW1wbGUgYW5kIHBlcmlvZC4KIAlBbHNvIGl0IGNhbiBjb250YWluIGFueSBzb3J0IGtleShzKS4KIAogCUJ5IGRlZmF1bHQsIGV2ZXJ5IHNvcnQga2V5cyBub3Qgc3BlY2lmaWVkIGluIC0tZmllbGQgd2lsbCBiZSBhcHBlbmRlZApAQCAtMTYxLDYgKzE2MSwxMiBAQAogCVNldHVwIGFuZCBlbmFibGUgY2FsbC1ncmFwaCAoc3RhY2sgY2hhaW4vYmFja3RyYWNlKSByZWNvcmRpbmcsCiAJaW1wbGllcyAtZy4KIAorLS1jaGlsZHJlbjo6CisJQWNjdW11bGF0ZSBjYWxsY2hhaW4gb2YgY2hpbGRyZW4gdG8gcGFyZW50IGVudHJ5IHNvIHRoYXQgdGhlbiBjYW4KKwlzaG93IHVwIGluIHRoZSBvdXRwdXQuICBUaGUgb3V0cHV0IHdpbGwgaGF2ZSBhIG5ldyAiQ2hpbGRyZW4iIGNvbHVtbgorCWFuZCB3aWxsIGJlIHNvcnRlZCBvbiB0aGUgZGF0YS4gIEl0IHJlcXVpcmVzIC1nLy0tY2FsbC1ncmFwaCBvcHRpb24KKwllbmFibGVkLgorCiAtLW1heC1zdGFjazo6CiAJU2V0IHRoZSBzdGFjayBkZXB0aCBsaW1pdCB3aGVuIHBhcnNpbmcgdGhlIGNhbGxjaGFpbiwgYW55dGhpbmcKIAliZXlvbmQgdGhlIHNwZWNpZmllZCBkZXB0aCB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgaXMgYSB0cmFkZS1vZmYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZiBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgppbmRleCAwMmYwYTRkLi5hZTIwZWRmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCkBAIC00MDAsNiArNDAwLDcgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2hpc3RzX2xpbmsubwogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvaGlzdHNfZmlsdGVyLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2hpc3RzX291dHB1dC5vCitMSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9oaXN0c19jdW11bGF0ZS5vCiBMSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9weXRob24tdXNlLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2JwX3NpZ25hbC5vCiBMSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9icF9zaWduYWxfb3ZlcmZsb3cubwpAQCAtNzg4LDggKzc4OSw4IEBACiAJQGVjaG8gJycKIAlAZWNobyAnUGVyZiBpbnN0YWxsIHRhcmdldHM6JwogCUBlY2hvICcgIE5PVEU6IGRvY3VtZW50YXRpb24gYnVpbGQgcmVxdWlyZXMgYXNjaWlkb2MsIHhtbHRvIHBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZCcKLQlAZWNobyAnICBISU5UOiB1c2UgIm1ha2UgcHJlZml4PTxwYXRoPiA8aW5zdGFsbCB0YXJnZXQ+IiB0byBpbnN0YWxsIHRvIGEgcGFydGljdWxhcicKLQlAZWNobyAnICAgICAgICBwYXRoIGxpa2UgbWFrZSBwcmVmaXg9L3Vzci9sb2NhbCBpbnN0YWxsIGluc3RhbGwtZG9jJworCUBlY2hvICcgIEhJTlQ6IHVzZSAicHJlZml4IiBvciAiREVTVERJUiIgdG8gaW5zdGFsbCB0byBhIHBhcnRpY3VsYXInCisJQGVjaG8gJyAgICAgICAgcGF0aCBsaWtlICJtYWtlIHByZWZpeD0vdXNyL2xvY2FsIGluc3RhbGwgaW5zdGFsbC1kb2MiJwogCUBlY2hvICcgIGluc3RhbGwJLSBpbnN0YWxsIGNvbXBpbGVkIGJpbmFyaWVzJwogCUBlY2hvICcgIGluc3RhbGwtZG9jCS0gaW5zdGFsbCAqYWxsKiBkb2N1bWVudGF0aW9uJwogCUBlY2hvICcgIGluc3RhbGwtbWFuCS0gaW5zdGFsbCBtYW5wYWdlIGRvY3VtZW50YXRpb24nCkBAIC04MTQsMTcgKzgxNSwyMCBAQAogJChET0NfVEFSR0VUUyk6CiAJJChRVUlFVF9TVUJESVIwKURvY3VtZW50YXRpb24gJChRVUlFVF9TVUJESVIxKSAkKEA6ZG9jPWFsbCkKIAorVEFHX0ZPTERFUlM9IC4gLi4vbGliL3RyYWNlZXZlbnQgLi4vbGliL2FwaSAuLi9saWIvc3ltYm9sCitUQUdfRklMRVM9IC4uLy4uL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmgKKwogVEFHUzoKIAkkKFJNKSBUQUdTCi0JJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBldGFncyAtYQorCSQoRklORCkgJChUQUdfRk9MREVSUykgLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGV0YWdzIC1hICQoVEFHX0ZJTEVTKQogCiB0YWdzOgogCSQoUk0pIHRhZ3MKLQkkKEZJTkQpIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGN0YWdzIC1hCisJJChGSU5EKSAkKFRBR19GT0xERVJTKSAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgY3RhZ3MgLWEgJChUQUdfRklMRVMpCiAKIGNzY29wZToKIAkkKFJNKSBjc2NvcGUqCi0JJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBjc2NvcGUgLWIKKwkkKEZJTkQpICQoVEFHX0ZPTERFUlMpIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBjc2NvcGUgLWIgJChUQUdfRklMRVMpCiAKICMjIyBEZXRlY3QgcHJlZml4IGNoYW5nZXMKIFRSQUNLX0NGTEFHUyA9ICQoc3Vic3QgJywnXCcnLCQoQ0ZMQUdTKSk6XApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwppbmRleCBkMzBkMmMyLi4xZWM0MjlmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtNjUsMTIgKzY1LDEzIEBACiAJCXJldHVybiAwOwogCX0KIAotCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBOVUxMLCBOVUxMLCBOVUxMLCAxLCAxLCAwKTsKKwloZSA9IF9faGlzdHNfX2FkZF9lbnRyeSgmZXZzZWwtPmhpc3RzLCBhbCwgTlVMTCwgTlVMTCwgTlVMTCwgMSwgMSwgMCwKKwkJCQl0cnVlKTsKIAlpZiAoaGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBoaXN0X2VudHJ5X19pbmNfYWRkcl9zYW1wbGVzKGhlLCBldnNlbC0+aWR4LCBhbC0+YWRkcik7Ci0JaGlzdHNfX2luY19ucl9ldmVudHMoJmV2c2VsLT5oaXN0cywgUEVSRl9SRUNPUkRfU0FNUExFKTsKKwloaXN0c19faW5jX25yX3NhbXBsZXMoJmV2c2VsLT5oaXN0cywgdHJ1ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKaW5kZXggOGJmZjU0My4uOWE1YTAzNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJCSAgICB1NjQgd2VpZ2h0LCB1NjQgdHJhbnNhY3Rpb24pCiB7CiAJaWYgKF9faGlzdHNfX2FkZF9lbnRyeShoaXN0cywgYWwsIE5VTEwsIE5VTEwsIE5VTEwsIHBlcmlvZCwgd2VpZ2h0LAotCQkJICAgICAgIHRyYW5zYWN0aW9uKSAhPSBOVUxMKQorCQkJICAgICAgIHRyYW5zYWN0aW9uLCB0cnVlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCBlNGM4NWI4Li4zNzhiODViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC00NTQsNyArNDU0LDExIEBACiAJCQlpZiAoZG9uZSkKIAkJCQlicmVhazsKIAkJCWVyciA9IHBvbGwocmVjLT5ldmxpc3QtPnBvbGxmZCwgcmVjLT5ldmxpc3QtPm5yX2ZkcywgLTEpOwotCQkJaWYgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisJCQkvKgorCQkJICogUHJvcGFnYXRlIGVycm9yLCBvbmx5IGlmIHRoZXJlJ3MgYW55LiBJZ25vcmUgcG9zaXRpdmUKKwkJCSAqIG51bWJlciBvZiByZXR1cm5lZCBldmVudHMgYW5kIGludGVycnVwdCBlcnJvci4KKwkJCSAqLworCQkJaWYgKGVyciA+IDAgfHwgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpKQogCQkJCWVyciA9IDA7CiAJCQl3YWtpbmcrKzsKIAkJfQpAQCAtNTQ0LDYgKzU0OCw3IEBACiAJQlJBTkNIX09QVCgiYWJvcnRfdHgiLCBQRVJGX1NBTVBMRV9CUkFOQ0hfQUJPUlRfVFgpLAogCUJSQU5DSF9PUFQoImluX3R4IiwgUEVSRl9TQU1QTEVfQlJBTkNIX0lOX1RYKSwKIAlCUkFOQ0hfT1BUKCJub190eCIsIFBFUkZfU0FNUExFX0JSQU5DSF9OT19UWCksCisJQlJBTkNIX09QVCgiY29uZCIsIFBFUkZfU0FNUExFX0JSQU5DSF9DT05EKSwKIAlCUkFOQ0hfRU5ECiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKaW5kZXggYmMwZWVjMS4uMjFkODMwYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwpAQCAtNzIsNiArNzIsMTAgQEAKIAkJcmVwLT5taW5fcGVyY2VudCA9IHN0cnRvZih2YWx1ZSwgTlVMTCk7CiAJCXJldHVybiAwOwogCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJyZXBvcnQuY2hpbGRyZW4iKSkgeworCQlzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4gPSBwZXJmX2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlyZXR1cm4gcGVyZl9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlLCBjYik7CiB9CkBAIC04NSwxNTYgKzg5LDUyIEBACiAJICovCiAJaWYgKGhlLT5zdGF0Lm5yX2V2ZW50cyA9PSAxKQogCQlyZXAtPm5yX2VudHJpZXMrKzsKLQotCS8qCi0JICogT25seSBjb3VudHMgbnVtYmVyIG9mIHNhbXBsZXMgYXQgdGhpcyBzdGFnZSBhcyBpdCdzIG1vcmUKLQkgKiBuYXR1cmFsIHRvIGRvIGl0IGhlcmUgYW5kIG5vbi1zYW1wbGUgZXZlbnRzIGFyZSBhbHNvCi0JICogY291bnRlZCBpbiBwZXJmX3Nlc3Npb25fZGVsaXZlcl9ldmVudCgpLiAgVGhlIGR1bXBfdHJhY2UKLQkgKiByZXF1aXJlcyB0aGlzIGluZm8gaXMgcmVhZHkgYmVmb3JlIGdvaW5nIHRvIHRoZSBvdXRwdXQgdHJlZS4KLQkgKi8KLQloaXN0c19faW5jX25yX2V2ZW50cyhoZS0+aGlzdHMsIFBFUkZfUkVDT1JEX1NBTVBMRSk7Ci0JaWYgKCFoZS0+ZmlsdGVyZWQpCi0JCWhlLT5oaXN0cy0+c3RhdHMubnJfbm9uX2ZpbHRlcmVkX3NhbXBsZXMrKzsKIH0KIAotc3RhdGljIGludCByZXBvcnRfX2FkZF9tZW1faGlzdF9lbnRyeShzdHJ1Y3QgcmVwb3J0ICpyZXAsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKLQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQorc3RhdGljIGludCBoaXN0X2l0ZXJfX3JlcG9ydF9jYWxsYmFjayhzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAorCQkJCSAgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwgYm9vbCBzaW5nbGUsCisJCQkJICAgICAgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzeW1ib2wgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGhpc3RfZW50cnkgKmhlOwotCXN0cnVjdCBtZW1faW5mbyAqbWksICpteDsKLQl1aW50NjRfdCBjb3N0OwotCWludCBlcnIgPSBzYW1wbGVfX3Jlc29sdmVfY2FsbGNoYWluKHNhbXBsZSwgJnBhcmVudCwgZXZzZWwsIGFsLCByZXAtPm1heF9zdGFjayk7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJlcG9ydCAqcmVwID0gYXJnOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSA9IGl0ZXItPmhlOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGl0ZXItPmV2c2VsOworCXN0cnVjdCBtZW1faW5mbyAqbWk7CisJc3RydWN0IGJyYW5jaF9pbmZvICpiaTsKIAotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJcmVwb3J0X19pbmNfc3RhdHMocmVwLCBoZSk7CiAKLQltaSA9IHNhbXBsZV9fcmVzb2x2ZV9tZW0oc2FtcGxlLCBhbCk7Ci0JaWYgKCFtaSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocmVwLT5oaWRlX3VucmVzb2x2ZWQgJiYgIWFsLT5zeW0pCisJaWYgKCF1aV9faGFzX2Fubm90YXRpb24oKSkKIAkJcmV0dXJuIDA7CiAKLQljb3N0ID0gc2FtcGxlLT53ZWlnaHQ7Ci0JaWYgKCFjb3N0KQotCQljb3N0ID0gMTsKLQotCS8qCi0JICogbXVzdCBwYXNzIHBlcmlvZD13ZWlnaHQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0JICogc29ydGluZyBmcm9tIGhpc3RzX19jb2xsYXBzZV9yZXNvcnQoKSB3aGljaCBpcyBzb2xlbHkKLQkgKiBiYXNlZCBvbiBwZXJpb2RzLiBXZSB3YW50IHNvcnRpbmcgYmUgZG9uZSBvbiBucl9ldmVudHMgKiB3ZWlnaHQKLQkgKiBhbmQgdGhpcyBpcyBpbmRpcmVjdGx5IGFjaGlldmVkIGJ5IHBhc3NpbmcgcGVyaW9kPXdlaWdodCBoZXJlCi0JICogYW5kIHRoZSBoZV9zdGF0X19hZGRfcGVyaW9kKCkgZnVuY3Rpb24uCi0JICovCi0JaGUgPSBfX2hpc3RzX19hZGRfZW50cnkoJmV2c2VsLT5oaXN0cywgYWwsIHBhcmVudCwgTlVMTCwgbWksCi0JCQkJY29zdCwgY29zdCwgMCk7Ci0JaWYgKCFoZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAodWlfX2hhc19hbm5vdGF0aW9uKCkpIHsKLQkJZXJyID0gaGlzdF9lbnRyeV9faW5jX2FkZHJfc2FtcGxlcyhoZSwgZXZzZWwtPmlkeCwgYWwtPmFkZHIpOworCWlmIChzb3J0X19tb2RlID09IFNPUlRfTU9ERV9fQlJBTkNIKSB7CisJCWJpID0gaGUtPmJyYW5jaF9pbmZvOworCQllcnIgPSBhZGRyX21hcF9zeW1ib2xfX2luY19zYW1wbGVzKCZiaS0+ZnJvbSwgZXZzZWwtPmlkeCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQlteCA9IGhlLT5tZW1faW5mbzsKLQkJZXJyID0gYWRkcl9tYXBfc3ltYm9sX19pbmNfc2FtcGxlcygmbXgtPmRhZGRyLCBldnNlbC0+aWR4KTsKKwkJZXJyID0gYWRkcl9tYXBfc3ltYm9sX19pbmNfc2FtcGxlcygmYmktPnRvLCBldnNlbC0+aWR4KTsKKworCX0gZWxzZSBpZiAocmVwLT5tZW1fbW9kZSkgeworCQltaSA9IGhlLT5tZW1faW5mbzsKKwkJZXJyID0gYWRkcl9tYXBfc3ltYm9sX19pbmNfc2FtcGxlcygmbWktPmRhZGRyLCBldnNlbC0+aWR4KTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwotCX0KIAotCXJlcG9ydF9faW5jX3N0YXRzKHJlcCwgaGUpOwotCi0JZXJyID0gaGlzdF9lbnRyeV9fYXBwZW5kX2NhbGxjaGFpbihoZSwgc2FtcGxlKTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHJlcG9ydF9fYWRkX2JyYW5jaF9oaXN0X2VudHJ5KHN0cnVjdCByZXBvcnQgKnJlcCwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAotCQkJCQkgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKLXsKLQlzdHJ1Y3Qgc3ltYm9sICpwYXJlbnQgPSBOVUxMOwotCXVuc2lnbmVkIGk7Ci0Jc3RydWN0IGhpc3RfZW50cnkgKmhlOwotCXN0cnVjdCBicmFuY2hfaW5mbyAqYmksICpieDsKLQlpbnQgZXJyID0gc2FtcGxlX19yZXNvbHZlX2NhbGxjaGFpbihzYW1wbGUsICZwYXJlbnQsIGV2c2VsLCBhbCwgcmVwLT5tYXhfc3RhY2spOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWJpID0gc2FtcGxlX19yZXNvbHZlX2JzdGFjayhzYW1wbGUsIGFsKTsKLQlpZiAoIWJpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBzYW1wbGUtPmJyYW5jaF9zdGFjay0+bnI7IGkrKykgewotCQlpZiAocmVwLT5oaWRlX3VucmVzb2x2ZWQgJiYgIShiaVtpXS5mcm9tLnN5bSAmJiBiaVtpXS50by5zeW0pKQotCQkJY29udGludWU7Ci0KLQkJZXJyID0gLUVOT01FTTsKLQotCQkvKiBvdmVyd3JpdGUgdGhlICdhbCcgdG8gYnJhbmNoLXRvIGluZm8gKi8KLQkJYWwtPm1hcCA9IGJpW2ldLnRvLm1hcDsKLQkJYWwtPnN5bSA9IGJpW2ldLnRvLnN5bTsKLQkJYWwtPmFkZHIgPSBiaVtpXS50by5hZGRyOwotCQkvKgotCQkgKiBUaGUgcmVwb3J0IHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIHRvdGFsIGJyYW5jaGVzIGNhcHR1cmVkCi0JCSAqIGFuZCBub3QgZXZlbnRzIHNhbXBsZWQuIFRodXMgd2UgdXNlIGEgcHNldWRvIHBlcmlvZCBvZiAxLgotCQkgKi8KLQkJaGUgPSBfX2hpc3RzX19hZGRfZW50cnkoJmV2c2VsLT5oaXN0cywgYWwsIHBhcmVudCwgJmJpW2ldLCBOVUxMLAotCQkJCQkxLCAxLCAwKTsKLQkJaWYgKGhlKSB7Ci0JCQlpZiAodWlfX2hhc19hbm5vdGF0aW9uKCkpIHsKLQkJCQlieCA9IGhlLT5icmFuY2hfaW5mbzsKLQkJCQllcnIgPSBhZGRyX21hcF9zeW1ib2xfX2luY19zYW1wbGVzKCZieC0+ZnJvbSwKLQkJCQkJCQkJICAgZXZzZWwtPmlkeCk7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCQllcnIgPSBhZGRyX21hcF9zeW1ib2xfX2luY19zYW1wbGVzKCZieC0+dG8sCi0JCQkJCQkJCSAgIGV2c2VsLT5pZHgpOwotCQkJCWlmIChlcnIpCi0JCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJcmVwb3J0X19pbmNfc3RhdHMocmVwLCBoZSk7Ci0JCX0gZWxzZQotCQkJZ290byBvdXQ7Ci0JfQotCWVyciA9IDA7Ci1vdXQ6Ci0JZnJlZShiaSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCByZXBvcnQgKnJlcCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKLXsKLQlzdHJ1Y3Qgc3ltYm9sICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKLQlpbnQgZXJyID0gc2FtcGxlX19yZXNvbHZlX2NhbGxjaGFpbihzYW1wbGUsICZwYXJlbnQsIGV2c2VsLCBhbCwgcmVwLT5tYXhfc3RhY2spOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBwYXJlbnQsIE5VTEwsIE5VTEwsCi0JCQkJc2FtcGxlLT5wZXJpb2QsIHNhbXBsZS0+d2VpZ2h0LAotCQkJCXNhbXBsZS0+dHJhbnNhY3Rpb24pOwotCWlmIChoZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IGhpc3RfZW50cnlfX2FwcGVuZF9jYWxsY2hhaW4oaGUsIHNhbXBsZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQlpZiAodWlfX2hhc19hbm5vdGF0aW9uKCkpCiAJCWVyciA9IGhpc3RfZW50cnlfX2luY19hZGRyX3NhbXBsZXMoaGUsIGV2c2VsLT5pZHgsIGFsLT5hZGRyKTsKIAotCXJlcG9ydF9faW5jX3N0YXRzKHJlcCwgaGUpOworCX0gZWxzZSBpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCWlmIChzaW5nbGUpCisJCQllcnIgPSBoaXN0X2VudHJ5X19pbmNfYWRkcl9zYW1wbGVzKGhlLCBldnNlbC0+aWR4LAorCQkJCQkJCSAgIGFsLT5hZGRyKTsKKwl9IGVsc2UgeworCQllcnIgPSBoaXN0X2VudHJ5X19pbmNfYWRkcl9zYW1wbGVzKGhlLCBldnNlbC0+aWR4LCBhbC0+YWRkcik7CisJfQogCiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCkBAIC0yNDMsNiArMTQzLDEwIEBACiB7CiAJc3RydWN0IHJlcG9ydCAqcmVwID0gY29udGFpbmVyX29mKHRvb2wsIHN0cnVjdCByZXBvcnQsIHRvb2wpOwogCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgaXRlciA9IHsKKwkJLmhpZGVfdW5yZXNvbHZlZCA9IHJlcC0+aGlkZV91bnJlc29sdmVkLAorCQkuYWRkX2VudHJ5X2NiID0gaGlzdF9pdGVyX19yZXBvcnRfY2FsbGJhY2ssCisJfTsKIAlpbnQgcmV0OwogCiAJaWYgKHBlcmZfZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGV2ZW50LCBtYWNoaW5lLCAmYWwsIHNhbXBsZSkgPCAwKSB7CkBAIC0yNTcsMjIgKzE2MSwyMyBAQAogCWlmIChyZXAtPmNwdV9saXN0ICYmICF0ZXN0X2JpdChzYW1wbGUtPmNwdSwgcmVwLT5jcHVfYml0bWFwKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc29ydF9fbW9kZSA9PSBTT1JUX01PREVfX0JSQU5DSCkgewotCQlyZXQgPSByZXBvcnRfX2FkZF9icmFuY2hfaGlzdF9lbnRyeShyZXAsICZhbCwgc2FtcGxlLCBldnNlbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZGVidWcoInByb2JsZW0gYWRkaW5nIGxiciBlbnRyeSwgc2tpcHBpbmcgZXZlbnRcbiIpOwotCX0gZWxzZSBpZiAocmVwLT5tZW1fbW9kZSA9PSAxKSB7Ci0JCXJldCA9IHJlcG9ydF9fYWRkX21lbV9oaXN0X2VudHJ5KHJlcCwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9kZWJ1ZygicHJvYmxlbSBhZGRpbmcgbWVtIGVudHJ5LCBza2lwcGluZyBldmVudFxuIik7Ci0JfSBlbHNlIHsKLQkJaWYgKGFsLm1hcCAhPSBOVUxMKQotCQkJYWwubWFwLT5kc28tPmhpdCA9IDE7CisJaWYgKHNvcnRfX21vZGUgPT0gU09SVF9NT0RFX19CUkFOQ0gpCisJCWl0ZXIub3BzID0gJmhpc3RfaXRlcl9icmFuY2g7CisJZWxzZSBpZiAocmVwLT5tZW1fbW9kZSkKKwkJaXRlci5vcHMgPSAmaGlzdF9pdGVyX21lbTsKKwllbHNlIGlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4pCisJCWl0ZXIub3BzID0gJmhpc3RfaXRlcl9jdW11bGF0aXZlOworCWVsc2UKKwkJaXRlci5vcHMgPSAmaGlzdF9pdGVyX25vcm1hbDsKIAotCQlyZXQgPSByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHJlcCwgZXZzZWwsICZhbCwgc2FtcGxlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9kZWJ1ZygicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwotCX0KKwlpZiAoYWwubWFwICE9IE5VTEwpCisJCWFsLm1hcC0+ZHNvLT5oaXQgPSAxOworCisJcmV0ID0gaGlzdF9lbnRyeV9pdGVyX19hZGQoJml0ZXIsICZhbCwgZXZzZWwsIHNhbXBsZSwgcmVwLT5tYXhfc3RhY2ssCisJCQkJICAgcmVwKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZGVidWcoInByb2JsZW0gYWRkaW5nIGhpc3QgZW50cnksIHNraXBwaW5nIGV2ZW50XG4iKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMyOSw2ICsyMzQsMTQgQEAKIAkJCX0KIAl9CiAKKwlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCS8qIFNpbGVudGx5IGlnbm9yZSBpZiBjYWxsY2hhaW4gaXMgbWlzc2luZyAqLworCQlpZiAoIShzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NBTExDSEFJTikpIHsKKwkJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IGZhbHNlOworCQkJcGVyZl9ocHBfX2NhbmNlbF9jdW11bGF0ZSgpOworCQl9CisJfQorCiAJaWYgKHNvcnRfX21vZGUgPT0gU09SVF9NT0RFX19CUkFOQ0gpIHsKIAkJaWYgKCFpc19waXBlICYmCiAJCSAgICAhKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQlJBTkNIX1NUQUNLKSkgewpAQCAtNzEyLDYgKzYyNSw4IEBACiAJT1BUX0NBTExCQUNLX0RFRkFVTFQoJ2cnLCAiY2FsbC1ncmFwaCIsICZyZXBvcnQsICJvdXRwdXRfdHlwZSxtaW5fcGVyY2VudFsscHJpbnRfbGltaXRdLGNhbGxfb3JkZXIiLAogCQkgICAgICJEaXNwbGF5IGNhbGxjaGFpbnMgdXNpbmcgb3V0cHV0X3R5cGUgKGdyYXBoLCBmbGF0LCBmcmFjdGFsLCBvciBub25lKSAsIG1pbiBwZXJjZW50IHRocmVzaG9sZCwgb3B0aW9uYWwgcHJpbnQgbGltaXQsIGNhbGxjaGFpbiBvcmRlciwga2V5IChmdW5jdGlvbiBvciBhZGRyZXNzKS4gIgogCQkgICAgICJEZWZhdWx0OiBmcmFjdGFsLDAuNSxjYWxsZWUsZnVuY3Rpb24iLCAmcmVwb3J0X3BhcnNlX2NhbGxjaGFpbl9vcHQsIGNhbGxjaGFpbl9kZWZhdWx0X29wdCksCisJT1BUX0JPT0xFQU4oMCwgImNoaWxkcmVuIiwgJnN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiwKKwkJICAgICJBY2N1bXVsYXRlIGNhbGxjaGFpbnMgb2YgY2hpbGRyZW4gYW5kIHNob3cgdG90YWwgb3ZlcmhlYWQgYXMgd2VsbCIpLAogCU9QVF9JTlRFR0VSKDAsICJtYXgtc3RhY2siLCAmcmVwb3J0Lm1heF9zdGFjaywKIAkJICAgICJTZXQgdGhlIG1heGltdW0gc3RhY2sgZGVwdGggd2hlbiBwYXJzaW5nIHRoZSBjYWxsY2hhaW4sICIKIAkJICAgICJhbnl0aGluZyBiZXlvbmQgdGhlIHNwZWNpZmllZCBkZXB0aCB3aWxsIGJlIGlnbm9yZWQuICIKQEAgLTgwNCw4ICs3MTksMTAgQEAKIAloYXNfYnJfc3RhY2sgPSBwZXJmX2hlYWRlcl9faGFzX2ZlYXQoJnNlc3Npb24tPmhlYWRlciwKIAkJCQkJICAgICBIRUFERVJfQlJBTkNIX1NUQUNLKTsKIAotCWlmIChicmFuY2hfbW9kZSA9PSAtMSAmJiBoYXNfYnJfc3RhY2spCisJaWYgKGJyYW5jaF9tb2RlID09IC0xICYmIGhhc19icl9zdGFjaykgewogCQlzb3J0X19tb2RlID0gU09SVF9NT0RFX19CUkFOQ0g7CisJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IGZhbHNlOworCX0KIAogCWlmIChyZXBvcnQubWVtX21vZGUpIHsKIAkJaWYgKHNvcnRfX21vZGUgPT0gU09SVF9NT0RFX19CUkFOQ0gpIHsKQEAgLTgxMyw2ICs3MzAsNyBAQAogCQkJZ290byBlcnJvcjsKIAkJfQogCQlzb3J0X19tb2RlID0gU09SVF9NT0RFX19NRU1PUlk7CisJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IGZhbHNlOwogCX0KIAogCWlmIChzZXR1cF9zb3J0aW5nKCkgPCAwKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCmluZGV4IGQ3MTc2ODMuLmMzOGQwNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCkBAIC0xNDI4LDcgKzE0MjgsNyBAQAogCWludCBlcnIgPSAwOwogCiAJZXZzZWwtPmhpc3RzLnN0YXRzLnRvdGFsX3BlcmlvZCArPSBzYW1wbGUtPnBlcmlvZDsKLQloaXN0c19faW5jX25yX2V2ZW50cygmZXZzZWwtPmhpc3RzLCBQRVJGX1JFQ09SRF9TQU1QTEUpOworCWhpc3RzX19pbmNfbnJfc2FtcGxlcygmZXZzZWwtPmhpc3RzLCB0cnVlKTsKIAogCWlmIChldnNlbC0+aGFuZGxlciAhPSBOVUxMKSB7CiAJCXRyYWNlcG9pbnRfaGFuZGxlciBmID0gZXZzZWwtPmhhbmRsZXI7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKaW5kZXggNWIzODljZS4uMzc3OTcxZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwpAQCAtMTk2LDYgKzE5NiwxMiBAQAogCiAJcHRocmVhZF9tdXRleF91bmxvY2soJm5vdGVzLT5sb2NrKTsKIAorCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBub3cgY2FsbGVkIHdpdGggaGUtPmhpc3RzLT5sb2NrIGhlbGQuCisJICogUmVsZWFzZSBpdCBiZWZvcmUgZ29pbmcgdG8gc2xlZXAuCisJICovCisJcHRocmVhZF9tdXRleF91bmxvY2soJmhlLT5oaXN0cy0+bG9jayk7CisKIAlpZiAoZXJyID09IC1FUkFOR0UgJiYgIWhlLT5tcy5tYXAtPmVyYW5nZV93YXJuZWQpCiAJCXVpX193YXJuX21hcF9lcmFuZ2UoaGUtPm1zLm1hcCwgc3ltLCBpcCk7CiAJZWxzZSBpZiAoZXJyID09IC1FTk9NRU0pIHsKQEAgLTIwMyw2ICsyMDksOCBAQAogCQkgICAgICAgc3ltLT5uYW1lKTsKIAkJc2xlZXAoMSk7CiAJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZoZS0+aGlzdHMtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBwZXJmX3RvcF9fc2hvd19kZXRhaWxzKHN0cnVjdCBwZXJmX3RvcCAqdG9wKQpAQCAtMjM4LDI3ICsyNDYsNiBAQAogCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZub3Rlcy0+bG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGlzdF9lbnRyeSAqcGVyZl9ldnNlbF9fYWRkX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCQkJICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCi0JCQkJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQotewotCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKLQotCXB0aHJlYWRfbXV0ZXhfbG9jaygmZXZzZWwtPmhpc3RzLmxvY2spOwotCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCXNhbXBsZS0+cGVyaW9kLCBzYW1wbGUtPndlaWdodCwKLQkJCQlzYW1wbGUtPnRyYW5zYWN0aW9uKTsKLQlwdGhyZWFkX211dGV4X3VubG9jaygmZXZzZWwtPmhpc3RzLmxvY2spOwotCWlmIChoZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWhpc3RzX19pbmNfbnJfZXZlbnRzKCZldnNlbC0+aGlzdHMsIFBFUkZfUkVDT1JEX1NBTVBMRSk7Ci0JaWYgKCFoZS0+ZmlsdGVyZWQpCi0JCWV2c2VsLT5oaXN0cy5zdGF0cy5ucl9ub25fZmlsdGVyZWRfc2FtcGxlcysrOwotCi0JcmV0dXJuIGhlOwotfQotCiBzdGF0aWMgdm9pZCBwZXJmX3RvcF9fcHJpbnRfc3ltX3RhYmxlKHN0cnVjdCBwZXJmX3RvcCAqdG9wKQogewogCWNoYXIgYmZbMTYwXTsKQEAgLTY2Miw2ICs2NDksMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBoaXN0X2l0ZXJfX3RvcF9jYWxsYmFjayhzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAorCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwgYm9vbCBzaW5nbGUsCisJCQkJICAgdm9pZCAqYXJnKQoreworCXN0cnVjdCBwZXJmX3RvcCAqdG9wID0gYXJnOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSA9IGl0ZXItPmhlOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGl0ZXItPmV2c2VsOworCisJaWYgKHNvcnRfX2hhc19zeW0gJiYgc2luZ2xlKSB7CisJCXU2NCBpcCA9IGFsLT5hZGRyOworCisJCWlmIChhbC0+bWFwKQorCQkJaXAgPSBhbC0+bWFwLT51bm1hcF9pcChhbC0+bWFwLCBpcCk7CisKKwkJcGVyZl90b3BfX3JlY29yZF9wcmVjaXNlX2lwKHRvcCwgaGUsIGV2c2VsLT5pZHgsIGlwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcGVyZl9ldmVudF9fcHJvY2Vzc19zYW1wbGUoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgICAgY29uc3QgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKQEAgLTY2OSw4ICs2NzYsNiBAQAogCQkJCSAgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3QgcGVyZl90b3AgKnRvcCA9IGNvbnRhaW5lcl9vZih0b29sLCBzdHJ1Y3QgcGVyZl90b3AsIHRvb2wpOwotCXN0cnVjdCBzeW1ib2wgKnBhcmVudCA9IE5VTEw7Ci0JdTY0IGlwID0gc2FtcGxlLT5pcDsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAlpbnQgZXJyOwogCkBAIC03NDUsMjUgKzc1MCwyMyBAQAogCX0KIAogCWlmIChhbC5zeW0gPT0gTlVMTCB8fCAhYWwuc3ltLT5pZ25vcmUpIHsKLQkJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCQlzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyIGl0ZXIgPSB7CisJCQkuYWRkX2VudHJ5X2NiID0gaGlzdF9pdGVyX190b3BfY2FsbGJhY2ssCisJCX07CiAKLQkJZXJyID0gc2FtcGxlX19yZXNvbHZlX2NhbGxjaGFpbihzYW1wbGUsICZwYXJlbnQsIGV2c2VsLCAmYWwsCi0JCQkJCQl0b3AtPm1heF9zdGFjayk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm47CisJCWlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4pCisJCQlpdGVyLm9wcyA9ICZoaXN0X2l0ZXJfY3VtdWxhdGl2ZTsKKwkJZWxzZQorCQkJaXRlci5vcHMgPSAmaGlzdF9pdGVyX25vcm1hbDsKIAotCQloZSA9IHBlcmZfZXZzZWxfX2FkZF9oaXN0X2VudHJ5KGV2c2VsLCAmYWwsIHNhbXBsZSk7Ci0JCWlmIChoZSA9PSBOVUxMKSB7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmZXZzZWwtPmhpc3RzLmxvY2spOworCisJCWVyciA9IGhpc3RfZW50cnlfaXRlcl9fYWRkKCZpdGVyLCAmYWwsIGV2c2VsLCBzYW1wbGUsCisJCQkJCSAgIHRvcC0+bWF4X3N0YWNrLCB0b3ApOworCQlpZiAoZXJyIDwgMCkKIAkJCXByX2VycigiUHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwotCQkJcmV0dXJuOwotCQl9CiAKLQkJZXJyID0gaGlzdF9lbnRyeV9fYXBwZW5kX2NhbGxjaGFpbihoZSwgc2FtcGxlKTsKLQkJaWYgKGVycikKLQkJCXJldHVybjsKLQotCQlpZiAoc29ydF9faGFzX3N5bSkKLQkJCXBlcmZfdG9wX19yZWNvcmRfcHJlY2lzZV9pcCh0b3AsIGhlLCBldnNlbC0+aWR4LCBpcCk7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZldnNlbC0+aGlzdHMubG9jayk7CiAJfQogCiAJcmV0dXJuOwpAQCAtMTAwMSw2ICsxMDA0LDEwIEBACiAKIAlpZiAoIXN0cmNtcCh2YXIsICJ0b3AuY2FsbC1ncmFwaCIpKQogCQlyZXR1cm4gcmVjb3JkX3BhcnNlX2NhbGxjaGFpbih2YWx1ZSwgJnRvcC0+cmVjb3JkX29wdHMpOworCWlmICghc3RyY21wKHZhciwgInRvcC5jaGlsZHJlbiIpKSB7CisJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IHBlcmZfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KIAogCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKIH0KQEAgLTEwOTUsNiArMTEwMiw4IEBACiAJT1BUX0NBTExCQUNLKDAsICJjYWxsLWdyYXBoIiwgJnRvcC5yZWNvcmRfb3B0cywKIAkJICAgICAibW9kZVssZHVtcF9zaXplXSIsIHJlY29yZF9jYWxsY2hhaW5faGVscCwKIAkJICAgICAmcGFyc2VfY2FsbGNoYWluX29wdCksCisJT1BUX0JPT0xFQU4oMCwgImNoaWxkcmVuIiwgJnN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiwKKwkJICAgICJBY2N1bXVsYXRlIGNhbGxjaGFpbnMgb2YgY2hpbGRyZW4gYW5kIHNob3cgdG90YWwgb3ZlcmhlYWQgYXMgd2VsbCIpLAogCU9QVF9JTlRFR0VSKDAsICJtYXgtc3RhY2siLCAmdG9wLm1heF9zdGFjaywKIAkJICAgICJTZXQgdGhlIG1heGltdW0gc3RhY2sgZGVwdGggd2hlbiBwYXJzaW5nIHRoZSBjYWxsY2hhaW4uICIKIAkJICAgICJEZWZhdWx0OiAiIF9fc3RyaW5naWZ5KFBFUkZfTUFYX1NUQUNLX0RFUFRIKSksCkBAIC0xMjAwLDYgKzEyMDksMTEgQEAKIAogCXRvcC5zeW1fZXZzZWwgPSBwZXJmX2V2bGlzdF9fZmlyc3QodG9wLmV2bGlzdCk7CiAKKwlpZiAoIXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pIHsKKwkJc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluID0gZmFsc2U7CisJCXBlcmZfaHBwX19jYW5jZWxfY3VtdWxhdGUoKTsKKwl9CisKIAlzeW1ib2xfY29uZi5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOwogCiAJc3ltYm9sX2NvbmYudHJ5X3ZtbGludXhfcGF0aCA9IChzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgPT0gTlVMTCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCmluZGV4IDcyOWJiZGYuLjRmMTAwYjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCkBAIC00NDcsNiArNDQ3LDcgQEAKICAgaWZuZXEgKCQoZmVhdHVyZS1saWJwZXJsKSwgMSkKICAgICBDRkxBR1MgKz0gLUROT19MSUJQRVJMCiAgICAgTk9fTElCUEVSTCA6PSAxCisgICAgbXNnIDo9ICQod2FybmluZyBNaXNzaW5nIHBlcmwgZGV2ZWwgZmlsZXMuIERpc2FibGluZyBwZXJsIHNjcmlwdGluZyBzdXBwb3J0LCBjb25zaWRlciBpbnN0YWxsaW5nIHBlcmwtRXh0VXRpbHMtRW1iZWQpOwogICBlbHNlCiAgICAgTERGTEFHUyArPSAkKFBFUkxfRU1CRURfTERGTEFHUykKICAgICBFWFRMSUJTICs9ICQoUEVSTF9FTUJFRF9MSUJBREQpCkBAIC01OTksNyArNjAwLDcgQEAKIAogIyBNYWtlIHRoZSBwYXRoIHJlbGF0aXZlIHRvIERFU1RESVIsIG5vdCB0byBwcmVmaXgKIGlmbmRlZiBERVNURElSCi1wcmVmaXggPSAkKEhPTUUpCitwcmVmaXggPz0gJChIT01FKQogZW5kaWYKIGJpbmRpcl9yZWxhdGl2ZSA9IGJpbgogYmluZGlyID0gJChwcmVmaXgpLyQoYmluZGlyX3JlbGF0aXZlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLmMgYi90b29scy9wZXJmL3BlcmYuYwppbmRleCA0MzE3OThhLi43OGY3YjkyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3BlcmYuYworKysgYi90b29scy9wZXJmL3BlcmYuYwpAQCAtNDgxLDE0ICs0ODEsMTggQEAKIAkJZnByaW50ZihzdGRlcnIsICJjYW5ub3QgaGFuZGxlICVzIGludGVybmFsbHkiLCBjbWQpOwogCQlnb3RvIG91dDsKIAl9Ci0jaWZkZWYgSEFWRV9MSUJBVURJVF9TVVBQT1JUCiAJaWYgKCFwcmVmaXhjbXAoY21kLCAidHJhY2UiKSkgeworI2lmZGVmIEhBVkVfTElCQVVESVRfU1VQUE9SVAogCQlzZXRfYnVpbGRpZF9kaXIoKTsKIAkJc2V0dXBfcGF0aCgpOwogCQlhcmd2WzBdID0gInRyYWNlIjsKIAkJcmV0dXJuIGNtZF90cmFjZShhcmdjLCBhcmd2LCBOVUxMKTsKLQl9CisjZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJ0cmFjZSBjb21tYW5kIG5vdCBhdmFpbGFibGU6IG1pc3NpbmcgYXVkaXQtbGlicyBkZXZlbCBwYWNrYWdlIGF0IGJ1aWxkIHRpbWUuXG4iKTsKKwkJZ290byBvdXQ7CiAjZW5kaWYKKwl9CiAJLyogTG9vayBmb3IgZmxhZ3MuLiAqLwogCWFyZ3YrKzsKIAlhcmdjLS07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9idWlsdGluLXRlc3QuYwppbmRleCA4MzFmNTJjLi44MDJlM2NkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYnVpbHRpbi10ZXN0LmMKQEAgLTE0MCw2ICsxNDAsMTAgQEAKIAkJLmZ1bmMgPSB0ZXN0X19oaXN0c19vdXRwdXQsCiAJfSwKIAl7CisJCS5kZXNjID0gIlRlc3QgY3VtdWxhdGlvbiBvZiBjaGlsZCBoaXN0IGVudHJpZXMiLAorCQkuZnVuYyA9IHRlc3RfX2hpc3RzX2N1bXVsYXRlLAorCX0sCisJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKIH07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2NvbW1vbi5jIGIvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19jb21tb24uYwppbmRleCBlNGUwMWFhZC4uYTYyYzA5MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19jb21tb24uYworKysgYi90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2NvbW1vbi5jCkBAIC0xMiw5ICsxMiw5IEBACiAJdTMyIHBpZDsKIAljb25zdCBjaGFyICpjb21tOwogfSBmYWtlX3RocmVhZHNbXSA9IHsKLQl7IDEwMCwgInBlcmYiIH0sCi0JeyAyMDAsICJwZXJmIiB9LAotCXsgMzAwLCAiYmFzaCIgfSwKKwl7IEZBS0VfUElEX1BFUkYxLCAicGVyZiIgfSwKKwl7IEZBS0VfUElEX1BFUkYyLCAicGVyZiIgfSwKKwl7IEZBS0VfUElEX0JBU0gsICAiYmFzaCIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMjIsMTUgKzIyLDE1IEBACiAJdTY0IHN0YXJ0OwogCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwogfSBmYWtlX21tYXBfaW5mb1tdID0gewotCXsgMTAwLCAweDQwMDAwLCAicGVyZiIgfSwKLQl7IDEwMCwgMHg1MDAwMCwgImxpYmMiIH0sCi0JeyAxMDAsIDB4ZjAwMDAsICJba2VybmVsXSIgfSwKLQl7IDIwMCwgMHg0MDAwMCwgInBlcmYiIH0sCi0JeyAyMDAsIDB4NTAwMDAsICJsaWJjIiB9LAotCXsgMjAwLCAweGYwMDAwLCAiW2tlcm5lbF0iIH0sCi0JeyAzMDAsIDB4NDAwMDAsICJiYXNoIiB9LAotCXsgMzAwLCAweDUwMDAwLCAibGliYyIgfSwKLQl7IDMwMCwgMHhmMDAwMCwgIltrZXJuZWxdIiB9LAorCXsgRkFLRV9QSURfUEVSRjEsIEZBS0VfTUFQX1BFUkYsICAgInBlcmYiIH0sCisJeyBGQUtFX1BJRF9QRVJGMSwgRkFLRV9NQVBfTElCQywgICAibGliYyIgfSwKKwl7IEZBS0VfUElEX1BFUkYxLCBGQUtFX01BUF9LRVJORUwsICJba2VybmVsXSIgfSwKKwl7IEZBS0VfUElEX1BFUkYyLCBGQUtFX01BUF9QRVJGLCAgICJwZXJmIiB9LAorCXsgRkFLRV9QSURfUEVSRjIsIEZBS0VfTUFQX0xJQkMsICAgImxpYmMiIH0sCisJeyBGQUtFX1BJRF9QRVJGMiwgRkFLRV9NQVBfS0VSTkVMLCAiW2tlcm5lbF0iIH0sCisJeyBGQUtFX1BJRF9CQVNILCAgRkFLRV9NQVBfQkFTSCwgICAiYmFzaCIgfSwKKwl7IEZBS0VfUElEX0JBU0gsICBGQUtFX01BUF9MSUJDLCAgICJsaWJjIiB9LAorCXsgRkFLRV9QSURfQkFTSCwgIEZBS0VfTUFQX0tFUk5FTCwgIltrZXJuZWxdIiB9LAogfTsKIAogc3RydWN0IGZha2Vfc3ltIHsKQEAgLTQwLDI3ICs0MCwzMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmYWtlX3N5bSBwZXJmX3N5bXNbXSA9IHsKLQl7IDcwMCwgMTAwLCAibWFpbiIgfSwKLQl7IDgwMCwgMTAwLCAicnVuX2NvbW1hbmQiIH0sCi0JeyA5MDAsIDEwMCwgImNtZF9yZWNvcmQiIH0sCisJeyBGQUtFX1NZTV9PRkZTRVQxLCBGQUtFX1NZTV9MRU5HVEgsICJtYWluIiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMiwgRkFLRV9TWU1fTEVOR1RILCAicnVuX2NvbW1hbmQiIH0sCisJeyBGQUtFX1NZTV9PRkZTRVQzLCBGQUtFX1NZTV9MRU5HVEgsICJjbWRfcmVjb3JkIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBmYWtlX3N5bSBiYXNoX3N5bXNbXSA9IHsKLQl7IDcwMCwgMTAwLCAibWFpbiIgfSwKLQl7IDgwMCwgMTAwLCAieG1hbGxvYyIgfSwKLQl7IDkwMCwgMTAwLCAieGZyZWUiIH0sCisJeyBGQUtFX1NZTV9PRkZTRVQxLCBGQUtFX1NZTV9MRU5HVEgsICJtYWluIiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMiwgRkFLRV9TWU1fTEVOR1RILCAieG1hbGxvYyIgfSwKKwl7IEZBS0VfU1lNX09GRlNFVDMsIEZBS0VfU1lNX0xFTkdUSCwgInhmcmVlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBmYWtlX3N5bSBsaWJjX3N5bXNbXSA9IHsKIAl7IDcwMCwgMTAwLCAibWFsbG9jIiB9LAogCXsgODAwLCAxMDAsICJmcmVlIiB9LAogCXsgOTAwLCAxMDAsICJyZWFsbG9jIiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMSwgRkFLRV9TWU1fTEVOR1RILCAibWFsbG9jIiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMiwgRkFLRV9TWU1fTEVOR1RILCAiZnJlZSIgfSwKKwl7IEZBS0VfU1lNX09GRlNFVDMsIEZBS0VfU1lNX0xFTkdUSCwgInJlYWxsb2MiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGZha2Vfc3ltIGtlcm5lbF9zeW1zW10gPSB7Ci0JeyA3MDAsIDEwMCwgInNjaGVkdWxlIiB9LAotCXsgODAwLCAxMDAsICJwYWdlX2ZhdWx0IiB9LAotCXsgOTAwLCAxMDAsICJzeXNfcGVyZl9ldmVudF9vcGVuIiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMSwgRkFLRV9TWU1fTEVOR1RILCAic2NoZWR1bGUiIH0sCisJeyBGQUtFX1NZTV9PRkZTRVQyLCBGQUtFX1NZTV9MRU5HVEgsICJwYWdlX2ZhdWx0IiB9LAorCXsgRkFLRV9TWU1fT0ZGU0VUMywgRkFLRV9TWU1fTEVOR1RILCAic3lzX3BlcmZfZXZlbnRfb3BlbiIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMTAyLDcgKzEwNSw3IEBACiAJCQkJLnBpZCA9IGZha2VfbW1hcF9pbmZvW2ldLnBpZCwKIAkJCQkudGlkID0gZmFrZV9tbWFwX2luZm9baV0ucGlkLAogCQkJCS5zdGFydCA9IGZha2VfbW1hcF9pbmZvW2ldLnN0YXJ0LAotCQkJCS5sZW4gPSAweDEwMDBVTEwsCisJCQkJLmxlbiA9IEZBS0VfTUFQX0xFTkdUSCwKIAkJCQkucGdvZmYgPSAwVUxMLAogCQkJfSwKIAkJfTsKQEAgLTE5MywxMCArMTk2LDExIEBACiAJCWhlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOwogCiAJCWlmICghaGUtPmZpbHRlcmVkKSB7Ci0JCQlwcl9pbmZvKCIlMmQ6IGVudHJ5OiAlOHM6JTVkIFslLThzXSAlMjBzOiBwZXJpb2QgPSAlIlBSSXU2NCJcbiIsCisJCQlwcl9pbmZvKCIlMmQ6IGVudHJ5OiAlOHM6JTVkIFslLThzXSAlMjBzOiBwZXJpb2QgPSAlIlBSSXU2NCIvJSJQUkl1NjQiXG4iLAogCQkJCWksIHRocmVhZF9fY29tbV9zdHIoaGUtPnRocmVhZCksIGhlLT50aHJlYWQtPnRpZCwKIAkJCQloZS0+bXMubWFwLT5kc28tPnNob3J0X25hbWUsCi0JCQkJaGUtPm1zLnN5bS0+bmFtZSwgaGUtPnN0YXQucGVyaW9kKTsKKwkJCQloZS0+bXMuc3ltLT5uYW1lLCBoZS0+c3RhdC5wZXJpb2QsCisJCQkJaGUtPnN0YXRfYWNjID8gaGUtPnN0YXRfYWNjLT5wZXJpb2QgOiAwKTsKIAkJfQogCiAJCWkrKzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfY29tbW9uLmggYi90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2NvbW1vbi5oCmluZGV4IDE0MTVhZTYuLjg4ODI1NGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfY29tbW9uLmgKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19jb21tb24uaApAQCAtNCw2ICs0LDM0IEBACiBzdHJ1Y3QgbWFjaGluZTsKIHN0cnVjdCBtYWNoaW5lczsKIAorI2RlZmluZSBGQUtFX1BJRF9QRVJGMSAgMTAwCisjZGVmaW5lIEZBS0VfUElEX1BFUkYyICAyMDAKKyNkZWZpbmUgRkFLRV9QSURfQkFTSCAgIDMwMAorCisjZGVmaW5lIEZBS0VfTUFQX1BFUkYgICAgMHg0MDAwMDAKKyNkZWZpbmUgRkFLRV9NQVBfQkFTSCAgICAweDQwMDAwMAorI2RlZmluZSBGQUtFX01BUF9MSUJDICAgIDB4NTAwMDAwCisjZGVmaW5lIEZBS0VfTUFQX0tFUk5FTCAgMHhmMDAwMDAKKyNkZWZpbmUgRkFLRV9NQVBfTEVOR1RIICAweDEwMDAwMAorCisjZGVmaW5lIEZBS0VfU1lNX09GRlNFVDEgIDcwMAorI2RlZmluZSBGQUtFX1NZTV9PRkZTRVQyICA4MDAKKyNkZWZpbmUgRkFLRV9TWU1fT0ZGU0VUMyAgOTAwCisjZGVmaW5lIEZBS0VfU1lNX0xFTkdUSCAgIDEwMAorCisjZGVmaW5lIEZBS0VfSVBfUEVSRl9NQUlOICBGQUtFX01BUF9QRVJGICsgRkFLRV9TWU1fT0ZGU0VUMQorI2RlZmluZSBGQUtFX0lQX1BFUkZfUlVOX0NPTU1BTkQgIEZBS0VfTUFQX1BFUkYgKyBGQUtFX1NZTV9PRkZTRVQyCisjZGVmaW5lIEZBS0VfSVBfUEVSRl9DTURfUkVDT1JEICBGQUtFX01BUF9QRVJGICsgRkFLRV9TWU1fT0ZGU0VUMworI2RlZmluZSBGQUtFX0lQX0JBU0hfTUFJTiAgRkFLRV9NQVBfQkFTSCArIEZBS0VfU1lNX09GRlNFVDEKKyNkZWZpbmUgRkFLRV9JUF9CQVNIX1hNQUxMT0MgIEZBS0VfTUFQX0JBU0ggKyBGQUtFX1NZTV9PRkZTRVQyCisjZGVmaW5lIEZBS0VfSVBfQkFTSF9YRlJFRSAgRkFLRV9NQVBfQkFTSCArIEZBS0VfU1lNX09GRlNFVDMKKyNkZWZpbmUgRkFLRV9JUF9MSUJDX01BTExPQyAgRkFLRV9NQVBfTElCQyArIEZBS0VfU1lNX09GRlNFVDEKKyNkZWZpbmUgRkFLRV9JUF9MSUJDX0ZSRUUgIEZBS0VfTUFQX0xJQkMgKyBGQUtFX1NZTV9PRkZTRVQyCisjZGVmaW5lIEZBS0VfSVBfTElCQ19SRUFMTE9DICBGQUtFX01BUF9MSUJDICsgRkFLRV9TWU1fT0ZGU0VUMworI2RlZmluZSBGQUtFX0lQX0tFUk5FTF9TQ0hFRFVMRSAgRkFLRV9NQVBfS0VSTkVMICsgRkFLRV9TWU1fT0ZGU0VUMQorI2RlZmluZSBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxUICBGQUtFX01BUF9LRVJORUwgKyBGQUtFX1NZTV9PRkZTRVQyCisjZGVmaW5lIEZBS0VfSVBfS0VSTkVMX1NZU19QRVJGX0VWRU5UX09QRU4gIEZBS0VfTUFQX0tFUk5FTCArIEZBS0VfU1lNX09GRlNFVDMKKwogLyoKICAqIFRoZSBzZXR1cF9mYWtlX21hY2hpbmUoKSBwcm92aWRlcyBhIHRlc3QgZW52aXJvbm1lbnQgd2hpY2ggY29uc2lzdHMKICAqIG9mIDMgcHJvY2Vzc2VzIHRoYXQgaGF2ZSAzIG1hcHBpbmdzIGFuZCBpbiB0dXJuLCBoYXZlIDMgc3ltYm9scwpAQCAtMTMsNyArNDEsNyBAQAogICogLi4uLi4uLi4uLi4uLiAgLi4uLi4uLi4uLi4uLiAgLi4uLi4uLi4uLi4uLi4uLi4uLgogICogICAgcGVyZjogIDEwMCAgICAgICAgICAgcGVyZiAgbWFpbgogICogICAgcGVyZjogIDEwMCAgICAgICAgICAgcGVyZiAgcnVuX2NvbW1hbmQKLSAqICAgIHBlcmY6ICAxMDAgICAgICAgICAgIHBlcmYgIGNvbWRfcmVjb3JkCisgKiAgICBwZXJmOiAgMTAwICAgICAgICAgICBwZXJmICBjbWRfcmVjb3JkCiAgKiAgICBwZXJmOiAgMTAwICAgICAgICAgICBsaWJjICBtYWxsb2MKICAqICAgIHBlcmY6ICAxMDAgICAgICAgICAgIGxpYmMgIGZyZWUKICAqICAgIHBlcmY6ICAxMDAgICAgICAgICAgIGxpYmMgIHJlYWxsb2MKQEAgLTIyLDcgKzUwLDcgQEAKICAqICAgIHBlcmY6ICAxMDAgICAgICAgW2tlcm5lbF0gIHN5c19wZXJmX2V2ZW50X29wZW4KICAqICAgIHBlcmY6ICAyMDAgICAgICAgICAgIHBlcmYgIG1haW4KICAqICAgIHBlcmY6ICAyMDAgICAgICAgICAgIHBlcmYgIHJ1bl9jb21tYW5kCi0gKiAgICBwZXJmOiAgMjAwICAgICAgICAgICBwZXJmICBjb21kX3JlY29yZAorICogICAgcGVyZjogIDIwMCAgICAgICAgICAgcGVyZiAgY21kX3JlY29yZAogICogICAgcGVyZjogIDIwMCAgICAgICAgICAgbGliYyAgbWFsbG9jCiAgKiAgICBwZXJmOiAgMjAwICAgICAgICAgICBsaWJjICBmcmVlCiAgKiAgICBwZXJmOiAgMjAwICAgICAgICAgICBsaWJjICByZWFsbG9jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2N1bXVsYXRlLmMgYi90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2N1bXVsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjMjQwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfY3VtdWxhdGUuYwpAQCAtMCwwICsxLDcyNiBAQAorI2luY2x1ZGUgInBlcmYuaCIKKyNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCisjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKKyNpbmNsdWRlICJ1dGlsL3NvcnQuaCIKKyNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCisjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKKyNpbmNsdWRlICJ1dGlsL21hY2hpbmUuaCIKKyNpbmNsdWRlICJ1dGlsL3RocmVhZC5oIgorI2luY2x1ZGUgInV0aWwvcGFyc2UtZXZlbnRzLmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKyNpbmNsdWRlICJ0ZXN0cy9oaXN0c19jb21tb24uaCIKKworc3RydWN0IHNhbXBsZSB7CisJdTMyIHBpZDsKKwl1NjQgaXA7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkOworCXN0cnVjdCBtYXAgKm1hcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07Cit9OworCisvKiBGb3IgdGhlIG51bWJlcnMsIHNlZSBoaXN0c19jb21tb24uYyAqLworc3RhdGljIHN0cnVjdCBzYW1wbGUgZmFrZV9zYW1wbGVzW10gPSB7CisJLyogcGVyZiBba2VybmVsXSBzY2hlZHVsZSgpICovCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1NDSEVEVUxFLCB9LAorCS8qIHBlcmYgW3BlcmZdICAgbWFpbigpICovCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfUEVSRl9NQUlOLCB9LAorCS8qIHBlcmYgW3BlcmZdICAgY21kX3JlY29yZCgpICovCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfUEVSRl9DTURfUkVDT1JELCB9LAorCS8qIHBlcmYgW2xpYmNdICAgbWFsbG9jKCkgKi8KKwl7IC5waWQgPSBGQUtFX1BJRF9QRVJGMSwgLmlwID0gRkFLRV9JUF9MSUJDX01BTExPQywgfSwKKwkvKiBwZXJmIFtsaWJjXSAgIGZyZWUoKSAqLworCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYxLCAuaXAgPSBGQUtFX0lQX0xJQkNfRlJFRSwgfSwKKwkvKiBwZXJmIFtwZXJmXSAgIG1haW4oKSAqLworCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX1BFUkZfTUFJTiwgfSwKKwkvKiBwZXJmIFtrZXJuZWxdIHBhZ2VfZmF1bHQoKSAqLworCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCB9LAorCS8qIGJhc2ggW2Jhc2hdICAgbWFpbigpICovCisJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfQkFTSF9NQUlOLCB9LAorCS8qIGJhc2ggW2Jhc2hdICAgeG1hbGxvYygpICovCisJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfQkFTSF9YTUFMTE9DLCB9LAorCS8qIGJhc2ggW2tlcm5lbF0gcGFnZV9mYXVsdCgpICovCisJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1BBR0VfRkFVTFQsIH0sCit9OworCisvKgorICogV2lsbCBiZSBjYXN0ZWQgdG8gc3RydWN0IGlwX2NhbGxjaGFpbiB3aGljaCBoYXMgYWxsIDY0IGJpdCBlbnRyaWVzCisgKiBvZiBuciBhbmQgaXBzW10uCisgKi8KK3N0YXRpYyB1NjQgZmFrZV9jYWxsY2hhaW5zW11bMTBdID0geworCS8qICAgc2NoZWR1bGUgPT4gcnVuX2NvbW1hbmQgPT4gbWFpbiAqLworCXsgMywgRkFLRV9JUF9LRVJORUxfU0NIRURVTEUsIEZBS0VfSVBfUEVSRl9SVU5fQ09NTUFORCwgRkFLRV9JUF9QRVJGX01BSU4sIH0sCisJLyogICBtYWluICAqLworCXsgMSwgRkFLRV9JUF9QRVJGX01BSU4sIH0sCisJLyogICBjbWRfcmVjb3JkID0+IHJ1bl9jb21tYW5kID0+IG1haW4gKi8KKwl7IDMsIEZBS0VfSVBfUEVSRl9DTURfUkVDT1JELCBGQUtFX0lQX1BFUkZfUlVOX0NPTU1BTkQsIEZBS0VfSVBfUEVSRl9NQUlOLCB9LAorCS8qICAgbWFsbG9jID0+IGNtZF9yZWNvcmQgPT4gcnVuX2NvbW1hbmQgPT4gbWFpbiAqLworCXsgNCwgRkFLRV9JUF9MSUJDX01BTExPQywgRkFLRV9JUF9QRVJGX0NNRF9SRUNPUkQsIEZBS0VfSVBfUEVSRl9SVU5fQ09NTUFORCwKKwkgICAgIEZBS0VfSVBfUEVSRl9NQUlOLCB9LAorCS8qICAgZnJlZSA9PiBjbWRfcmVjb3JkID0+IHJ1bl9jb21tYW5kID0+IG1haW4gKi8KKwl7IDQsIEZBS0VfSVBfTElCQ19GUkVFLCBGQUtFX0lQX1BFUkZfQ01EX1JFQ09SRCwgRkFLRV9JUF9QRVJGX1JVTl9DT01NQU5ELAorCSAgICAgRkFLRV9JUF9QRVJGX01BSU4sIH0sCisJLyogICBtYWluICovCisJeyAxLCBGQUtFX0lQX1BFUkZfTUFJTiwgfSwKKwkvKiAgIHBhZ2VfZmF1bHQgPT4gc3lzX3BlcmZfZXZlbnRfb3BlbiA9PiBydW5fY29tbWFuZCA9PiBtYWluICovCisJeyA0LCBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCBGQUtFX0lQX0tFUk5FTF9TWVNfUEVSRl9FVkVOVF9PUEVOLAorCSAgICAgRkFLRV9JUF9QRVJGX1JVTl9DT01NQU5ELCBGQUtFX0lQX1BFUkZfTUFJTiwgfSwKKwkvKiAgIG1haW4gKi8KKwl7IDEsIEZBS0VfSVBfQkFTSF9NQUlOLCB9LAorCS8qICAgeG1hbGxvYyA9PiBtYWxsb2MgPT4geG1hbGxvYyA9PiBtYWxsb2MgPT4geG1hbGxvYyA9PiBtYWluICovCisJeyA2LCBGQUtFX0lQX0JBU0hfWE1BTExPQywgRkFLRV9JUF9MSUJDX01BTExPQywgRkFLRV9JUF9CQVNIX1hNQUxMT0MsCisJICAgICBGQUtFX0lQX0xJQkNfTUFMTE9DLCBGQUtFX0lQX0JBU0hfWE1BTExPQywgRkFLRV9JUF9CQVNIX01BSU4sIH0sCisJLyogICBwYWdlX2ZhdWx0ID0+IG1hbGxvYyA9PiBtYWluICovCisJeyAzLCBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCBGQUtFX0lQX0xJQkNfTUFMTE9DLCBGQUtFX0lQX0JBU0hfTUFJTiwgfSwKK307CisKK3N0YXRpYyBpbnQgYWRkX2hpc3RfZW50cmllcyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBoaXN0c190b19ldnNlbChoaXN0cyk7CisJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZSA9IHsgLnBlcmlvZCA9IDEwMDAsIH07CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmYWtlX3NhbXBsZXMpOyBpKyspIHsKKwkJY29uc3QgdW5pb24gcGVyZl9ldmVudCBldmVudCA9IHsKKwkJCS5oZWFkZXIgPSB7CisJCQkJLm1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCisJCQl9LAorCQl9OworCQlzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyIGl0ZXIgPSB7CisJCQkuaGlkZV91bnJlc29sdmVkID0gZmFsc2UsCisJCX07CisKKwkJaWYgKHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbikKKwkJCWl0ZXIub3BzID0gJmhpc3RfaXRlcl9jdW11bGF0aXZlOworCQllbHNlCisJCQlpdGVyLm9wcyA9ICZoaXN0X2l0ZXJfbm9ybWFsOworCisJCXNhbXBsZS5waWQgPSBmYWtlX3NhbXBsZXNbaV0ucGlkOworCQlzYW1wbGUudGlkID0gZmFrZV9zYW1wbGVzW2ldLnBpZDsKKwkJc2FtcGxlLmlwID0gZmFrZV9zYW1wbGVzW2ldLmlwOworCQlzYW1wbGUuY2FsbGNoYWluID0gKHN0cnVjdCBpcF9jYWxsY2hhaW4gKilmYWtlX2NhbGxjaGFpbnNbaV07CisKKwkJaWYgKHBlcmZfZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKCZldmVudCwgbWFjaGluZSwgJmFsLAorCQkJCQkJICAmc2FtcGxlKSA8IDApCisJCQlnb3RvIG91dDsKKworCQlpZiAoaGlzdF9lbnRyeV9pdGVyX19hZGQoJml0ZXIsICZhbCwgZXZzZWwsICZzYW1wbGUsCisJCQkJCSBQRVJGX01BWF9TVEFDS19ERVBUSCwgTlVMTCkgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJZmFrZV9zYW1wbGVzW2ldLnRocmVhZCA9IGFsLnRocmVhZDsKKwkJZmFrZV9zYW1wbGVzW2ldLm1hcCA9IGFsLm1hcDsKKwkJZmFrZV9zYW1wbGVzW2ldLnN5bSA9IGFsLnN5bTsKKwl9CisKKwlyZXR1cm4gVEVTVF9PSzsKKworb3V0OgorCXByX2RlYnVnKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYWRkaW5nIGEgaGlzdCBlbnRyeVxuIik7CisJcmV0dXJuIFRFU1RfRkFJTDsKK30KKworc3RhdGljIHZvaWQgZGVsX2hpc3RfZW50cmllcyhzdHJ1Y3QgaGlzdHMgKmhpc3RzKQoreworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKwlzdHJ1Y3QgcmJfcm9vdCAqcm9vdF9pbjsKKwlzdHJ1Y3QgcmJfcm9vdCAqcm9vdF9vdXQ7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlpZiAoc29ydF9fbmVlZF9jb2xsYXBzZSkKKwkJcm9vdF9pbiA9ICZoaXN0cy0+ZW50cmllc19jb2xsYXBzZWQ7CisJZWxzZQorCQlyb290X2luID0gaGlzdHMtPmVudHJpZXNfaW47CisKKwlyb290X291dCA9ICZoaXN0cy0+ZW50cmllczsKKworCXdoaWxlICghUkJfRU1QVFlfUk9PVChyb290X291dCkpIHsKKwkJbm9kZSA9IHJiX2ZpcnN0KHJvb3Rfb3V0KTsKKworCQloZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJcmJfZXJhc2Uobm9kZSwgcm9vdF9vdXQpOworCQlyYl9lcmFzZSgmaGUtPnJiX25vZGVfaW4sIHJvb3RfaW4pOworCQloaXN0X2VudHJ5X19mcmVlKGhlKTsKKwl9Cit9CisKK3R5cGVkZWYgaW50ICgqdGVzdF9mbl90KShzdHJ1Y3QgcGVyZl9ldnNlbCAqLCBzdHJ1Y3QgbWFjaGluZSAqKTsKKworI2RlZmluZSBDT01NKGhlKSAgKHRocmVhZF9fY29tbV9zdHIoaGUtPnRocmVhZCkpCisjZGVmaW5lIERTTyhoZSkgICAoaGUtPm1zLm1hcC0+ZHNvLT5zaG9ydF9uYW1lKQorI2RlZmluZSBTWU0oaGUpICAgKGhlLT5tcy5zeW0tPm5hbWUpCisjZGVmaW5lIENQVShoZSkgICAoaGUtPmNwdSkKKyNkZWZpbmUgUElEKGhlKSAgIChoZS0+dGhyZWFkLT50aWQpCisjZGVmaW5lIERFUFRIKGhlKSAoaGUtPmNhbGxjaGFpbi0+bWF4X2RlcHRoKQorI2RlZmluZSBDRFNPKGNsKSAgKGNsLT5tcy5tYXAtPmRzby0+c2hvcnRfbmFtZSkKKyNkZWZpbmUgQ1NZTShjbCkgIChjbC0+bXMuc3ltLT5uYW1lKQorCitzdHJ1Y3QgcmVzdWx0IHsKKwl1NjQgY2hpbGRyZW47CisJdTY0IHNlbGY7CisJY29uc3QgY2hhciAqY29tbTsKKwljb25zdCBjaGFyICpkc287CisJY29uc3QgY2hhciAqc3ltOworfTsKKworc3RydWN0IGNhbGxjaGFpbl9yZXN1bHQgeworCXU2NCBucjsKKwlzdHJ1Y3QgeworCQljb25zdCBjaGFyICpkc287CisJCWNvbnN0IGNoYXIgKnN5bTsKKwl9IG5vZGVbMTBdOworfTsKKworc3RhdGljIGludCBkb190ZXN0KHN0cnVjdCBoaXN0cyAqaGlzdHMsIHN0cnVjdCByZXN1bHQgKmV4cGVjdGVkLCBzaXplX3QgbnJfZXhwZWN0ZWQsCisJCSAgIHN0cnVjdCBjYWxsY2hhaW5fcmVzdWx0ICpleHBlY3RlZF9jYWxsY2hhaW4sIHNpemVfdCBucl9jYWxsY2hhaW4pCit7CisJY2hhciBidWZbMzJdOworCXNpemVfdCBpLCBjOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKwlzdHJ1Y3QgcmJfcm9vdCAqcm9vdDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKmNub2RlOworCXN0cnVjdCBjYWxsY2hhaW5fbGlzdCAqY2xpc3Q7CisKKwkvKgorCSAqIGFkZGluZyBhbmQgZGVsZXRpbmcgaGlzdCBlbnRyaWVzIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIHRoaXMKKwkgKiBmdW5jdGlvbiBzaW5jZSBURVNUX0FTU0VSVF9WQUwoKSByZXR1cm5zIGluIGNhc2Ugb2YgZmFpbHVyZS4KKwkgKi8KKwloaXN0c19fY29sbGFwc2VfcmVzb3J0KGhpc3RzLCBOVUxMKTsKKwloaXN0c19fb3V0cHV0X3Jlc29ydChoaXN0cyk7CisKKwlpZiAodmVyYm9zZSA+IDIpIHsKKwkJcHJfaW5mbygidXNlIGNhbGxjaGFpbjogJWQsIGN1bXVsYXRlIGNhbGxjaGFpbjogJWRcbiIsCisJCQlzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluLAorCQkJc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKTsKKwkJcHJpbnRfaGlzdHNfb3V0KGhpc3RzKTsKKwl9CisKKwlyb290ID0gJmhpc3RzLT5lbnRyaWVzOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KHJvb3QpLCBpID0gMDsKKwkgICAgIG5vZGUgJiYgKGhlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpKTsKKwkgICAgIG5vZGUgPSByYl9uZXh0KG5vZGUpLCBpKyspIHsKKwkJc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGhpc3QgZW50cnkgIyV6ZCIsIGkpOworCisJCVRFU1RfQVNTRVJUX1ZBTCgiSW5jb3JyZWN0IG51bWJlciBvZiBoaXN0IGVudHJ5IiwKKwkJCQlpIDwgbnJfZXhwZWN0ZWQpOworCQlURVNUX0FTU0VSVF9WQUwoYnVmLCBoZS0+c3RhdC5wZXJpb2QgPT0gZXhwZWN0ZWRbaV0uc2VsZiAmJgorCQkJCSFzdHJjbXAoQ09NTShoZSksIGV4cGVjdGVkW2ldLmNvbW0pICYmCisJCQkJIXN0cmNtcChEU08oaGUpLCBleHBlY3RlZFtpXS5kc28pICYmCisJCQkJIXN0cmNtcChTWU0oaGUpLCBleHBlY3RlZFtpXS5zeW0pKTsKKworCQlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKQorCQkJVEVTVF9BU1NFUlRfVkFMKGJ1ZiwgaGUtPnN0YXRfYWNjLT5wZXJpb2QgPT0gZXhwZWN0ZWRbaV0uY2hpbGRyZW4pOworCisJCWlmICghc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKKwkJCWNvbnRpbnVlOworCisJCS8qIGNoZWNrIGNhbGxjaGFpbiBlbnRyaWVzICovCisJCXJvb3QgPSAmaGUtPmNhbGxjaGFpbi0+bm9kZS5yYl9yb290OworCQljbm9kZSA9IHJiX2VudHJ5KHJiX2ZpcnN0KHJvb3QpLCBzdHJ1Y3QgY2FsbGNoYWluX25vZGUsIHJiX25vZGUpOworCisJCWMgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsaXN0LCAmY25vZGUtPnZhbCwgbGlzdCkgeworCQkJc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGNhbGxjaGFpbiBlbnRyeSAjJXpkLyV6ZCIsIGksIGMpOworCisJCQlURVNUX0FTU0VSVF9WQUwoIkluY29ycmVjdCBudW1iZXIgb2YgY2FsbGNoYWluIGVudHJ5IiwKKwkJCQkJYyA8IGV4cGVjdGVkX2NhbGxjaGFpbltpXS5ucik7CisJCQlURVNUX0FTU0VSVF9WQUwoYnVmLAorCQkJCSFzdHJjbXAoQ0RTTyhjbGlzdCksIGV4cGVjdGVkX2NhbGxjaGFpbltpXS5ub2RlW2NdLmRzbykgJiYKKwkJCQkhc3RyY21wKENTWU0oY2xpc3QpLCBleHBlY3RlZF9jYWxsY2hhaW5baV0ubm9kZVtjXS5zeW0pKTsKKwkJCWMrKzsKKwkJfQorCQkvKiBUT0RPOiBoYW5kbGUgbXVsdGlwbGUgY2hpbGQgbm9kZXMgcHJvcGVybHkgKi8KKwkJVEVTVF9BU1NFUlRfVkFMKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGNhbGxjaGFpbiBlbnRyeSIsCisJCQkJYyA8PSBleHBlY3RlZF9jYWxsY2hhaW5baV0ubnIpOworCX0KKwlURVNUX0FTU0VSVF9WQUwoIkluY29ycmVjdCBudW1iZXIgb2YgaGlzdCBlbnRyeSIsCisJCQlpID09IG5yX2V4cGVjdGVkKTsKKwlURVNUX0FTU0VSVF9WQUwoIkluY29ycmVjdCBudW1iZXIgb2YgY2FsbGNoYWluIGVudHJ5IiwKKwkJCSFzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluIHx8IG5yX2V4cGVjdGVkID09IG5yX2NhbGxjaGFpbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5PIGNhbGxjaGFpbiArIE5PIGNoaWxkcmVuICovCitzdGF0aWMgaW50IHRlc3QxKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gJmV2c2VsLT5oaXN0czsKKwkvKgorCSAqIGV4cGVjdGVkIG91dHB1dDoKKwkgKgorCSAqIE92ZXJoZWFkICBDb21tYW5kICBTaGFyZWQgT2JqZWN0ICAgICAgICAgIFN5bWJvbAorCSAqID09PT09PT09ICA9PT09PT09ICA9PT09PT09PT09PT09ICA9PT09PT09PT09PT09PQorCSAqICAgMjAuMDAlICAgICBwZXJmICBwZXJmICAgICAgICAgICBbLl0gbWFpbgorCSAqICAgMTAuMDAlICAgICBiYXNoICBba2VybmVsXSAgICAgICBba10gcGFnZV9mYXVsdAorCSAqICAgMTAuMDAlICAgICBiYXNoICBiYXNoICAgICAgICAgICBbLl0gbWFpbgorCSAqICAgMTAuMDAlICAgICBiYXNoICBiYXNoICAgICAgICAgICBbLl0geG1hbGxvYworCSAqICAgMTAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gcGFnZV9mYXVsdAorCSAqICAgMTAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gc2NoZWR1bGUKKwkgKiAgIDEwLjAwJSAgICAgcGVyZiAgbGliYyAgICAgICAgICAgWy5dIGZyZWUKKwkgKiAgIDEwLjAwJSAgICAgcGVyZiAgbGliYyAgICAgICAgICAgWy5dIG1hbGxvYworCSAqICAgMTAuMDAlICAgICBwZXJmICBwZXJmICAgICAgICAgICBbLl0gY21kX3JlY29yZAorCSAqLworCXN0cnVjdCByZXN1bHQgZXhwZWN0ZWRbXSA9IHsKKwkJeyAwLCAyMDAwLCAicGVyZiIsICJwZXJmIiwgICAgICJtYWluIiB9LAorCQl7IDAsIDEwMDAsICJiYXNoIiwgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCXsgMCwgMTAwMCwgImJhc2giLCAiYmFzaCIsICAgICAibWFpbiIgfSwKKwkJeyAwLCAxMDAwLCAiYmFzaCIsICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCQl7IDAsIDEwMDAsICJwZXJmIiwgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAiW2tlcm5lbF0iLCAic2NoZWR1bGUiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAibGliYyIsICAgICAiZnJlZSIgfSwKKwkJeyAwLCAxMDAwLCAicGVyZiIsICJsaWJjIiwgICAgICJtYWxsb2MiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAicGVyZiIsICAgICAiY21kX3JlY29yZCIgfSwKKwl9OworCisJc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbiA9IGZhbHNlOworCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IGZhbHNlOworCisJc2V0dXBfc29ydGluZygpOworCWNhbGxjaGFpbl9yZWdpc3Rlcl9wYXJhbSgmY2FsbGNoYWluX3BhcmFtKTsKKworCWVyciA9IGFkZF9oaXN0X2VudHJpZXMoaGlzdHMsIG1hY2hpbmUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IGRvX3Rlc3QoaGlzdHMsIGV4cGVjdGVkLCBBUlJBWV9TSVpFKGV4cGVjdGVkKSwgTlVMTCwgMCk7CisKK291dDoKKwlkZWxfaGlzdF9lbnRyaWVzKGhpc3RzKTsKKwlyZXNldF9vdXRwdXRfZmllbGQoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBjYWxsY2FpbiArIE5PIGNoaWxkcmVuICovCitzdGF0aWMgaW50IHRlc3QyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gJmV2c2VsLT5oaXN0czsKKwkvKgorCSAqIGV4cGVjdGVkIG91dHB1dDoKKwkgKgorCSAqIE92ZXJoZWFkICBDb21tYW5kICBTaGFyZWQgT2JqZWN0ICAgICAgICAgIFN5bWJvbAorCSAqID09PT09PT09ICA9PT09PT09ICA9PT09PT09PT09PT09ICA9PT09PT09PT09PT09PQorCSAqICAgMjAuMDAlICAgICBwZXJmICBwZXJmICAgICAgICAgICBbLl0gbWFpbgorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBtYWluCisJICoKKwkgKiAgIDEwLjAwJSAgICAgYmFzaCAgW2tlcm5lbF0gICAgICAgW2tdIHBhZ2VfZmF1bHQKKwkgKiAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAtLS0gcGFnZV9mYXVsdAorCSAqICAgICAgICAgICAgICAgICAgbWFsbG9jCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKiAgIDEwLjAwJSAgICAgYmFzaCAgYmFzaCAgICAgICAgICAgWy5dIG1haW4KKwkgKiAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAtLS0gbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgIGJhc2ggIGJhc2ggICAgICAgICAgIFsuXSB4bWFsbG9jCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIHhtYWxsb2MKKwkgKiAgICAgICAgICAgICAgICAgIG1hbGxvYworCSAqICAgICAgICAgICAgICAgICAgeG1hbGxvYyAgICAgPC0tLSBOT1RFOiB0aGVyZSdzIGEgY3ljbGUKKwkgKiAgICAgICAgICAgICAgICAgIG1hbGxvYworCSAqICAgICAgICAgICAgICAgICAgeG1hbGxvYworCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgIHBlcmYgIFtrZXJuZWxdICAgICAgIFtrXSBwYWdlX2ZhdWx0CisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIHBhZ2VfZmF1bHQKKwkgKiAgICAgICAgICAgICAgICAgIHN5c19wZXJmX2V2ZW50X29wZW4KKwkgKiAgICAgICAgICAgICAgICAgIHJ1bl9jb21tYW5kCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKiAgIDEwLjAwJSAgICAgcGVyZiAgW2tlcm5lbF0gICAgICAgW2tdIHNjaGVkdWxlCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIHNjaGVkdWxlCisJICogICAgICAgICAgICAgICAgICBydW5fY29tbWFuZAorCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgIHBlcmYgIGxpYmMgICAgICAgICAgIFsuXSBmcmVlCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIGZyZWUKKwkgKiAgICAgICAgICAgICAgICAgIGNtZF9yZWNvcmQKKwkgKiAgICAgICAgICAgICAgICAgIHJ1bl9jb21tYW5kCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKiAgIDEwLjAwJSAgICAgcGVyZiAgbGliYyAgICAgICAgICAgWy5dIG1hbGxvYworCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBtYWxsb2MKKwkgKiAgICAgICAgICAgICAgICAgIGNtZF9yZWNvcmQKKwkgKiAgICAgICAgICAgICAgICAgIHJ1bl9jb21tYW5kCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKiAgIDEwLjAwJSAgICAgcGVyZiAgcGVyZiAgICAgICAgICAgWy5dIGNtZF9yZWNvcmQKKwkgKiAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAtLS0gY21kX3JlY29yZAorCSAqICAgICAgICAgICAgICAgICAgcnVuX2NvbW1hbmQKKwkgKiAgICAgICAgICAgICAgICAgIG1haW4KKwkgKgorCSAqLworCXN0cnVjdCByZXN1bHQgZXhwZWN0ZWRbXSA9IHsKKwkJeyAwLCAyMDAwLCAicGVyZiIsICJwZXJmIiwgICAgICJtYWluIiB9LAorCQl7IDAsIDEwMDAsICJiYXNoIiwgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCXsgMCwgMTAwMCwgImJhc2giLCAiYmFzaCIsICAgICAibWFpbiIgfSwKKwkJeyAwLCAxMDAwLCAiYmFzaCIsICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCQl7IDAsIDEwMDAsICJwZXJmIiwgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAiW2tlcm5lbF0iLCAic2NoZWR1bGUiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAibGliYyIsICAgICAiZnJlZSIgfSwKKwkJeyAwLCAxMDAwLCAicGVyZiIsICJsaWJjIiwgICAgICJtYWxsb2MiIH0sCisJCXsgMCwgMTAwMCwgInBlcmYiLCAicGVyZiIsICAgICAiY21kX3JlY29yZCIgfSwKKwl9OworCXN0cnVjdCBjYWxsY2hhaW5fcmVzdWx0IGV4cGVjdGVkX2NhbGxjaGFpbltdID0geworCQl7CisJCQkxLCB7CXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTMsIHsJeyAiW2tlcm5lbF0iLCAicGFnZV9mYXVsdCIgfSwKKwkJCQl7ICJsaWJjIiwgICAgICJtYWxsb2MiIH0sCisJCQkJeyAiYmFzaCIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJMSwgewl7ICJiYXNoIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCQl7CisJCQk2LCB7CXsgImJhc2giLCAgICAgInhtYWxsb2MiIH0sCisJCQkJeyAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQkJCXsgImJhc2giLCAgICAgInhtYWxsb2MiIH0sCisJCQkJeyAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQkJCXsgImJhc2giLCAgICAgInhtYWxsb2MiIH0sCisJCQkJeyAiYmFzaCIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJNCwgewl7ICJba2VybmVsXSIsICJwYWdlX2ZhdWx0IiB9LAorCQkJCXsgIltrZXJuZWxdIiwgInN5c19wZXJmX2V2ZW50X29wZW4iIH0sCisJCQkJeyAicGVyZiIsICAgICAicnVuX2NvbW1hbmQiIH0sCisJCQkJeyAicGVyZiIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJMywgewl7ICJba2VybmVsXSIsICJzY2hlZHVsZSIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJydW5fY29tbWFuZCIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCQl7CisJCQk0LCB7CXsgImxpYmMiLCAgICAgImZyZWUiIH0sCisJCQkJeyAicGVyZiIsICAgICAiY21kX3JlY29yZCIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJydW5fY29tbWFuZCIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCQl7CisJCQk0LCB7CXsgImxpYmMiLCAgICAgIm1hbGxvYyIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJjbWRfcmVjb3JkIiB9LAorCQkJCXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTMsIHsJeyAicGVyZiIsICAgICAiY21kX3JlY29yZCIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJydW5fY29tbWFuZCIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCX07CisKKwlzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluID0gdHJ1ZTsKKwlzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4gPSBmYWxzZTsKKworCXNldHVwX3NvcnRpbmcoKTsKKwljYWxsY2hhaW5fcmVnaXN0ZXJfcGFyYW0oJmNhbGxjaGFpbl9wYXJhbSk7CisKKwllcnIgPSBhZGRfaGlzdF9lbnRyaWVzKGhpc3RzLCBtYWNoaW5lKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBkb190ZXN0KGhpc3RzLCBleHBlY3RlZCwgQVJSQVlfU0laRShleHBlY3RlZCksCisJCSAgICAgIGV4cGVjdGVkX2NhbGxjaGFpbiwgQVJSQVlfU0laRShleHBlY3RlZF9jYWxsY2hhaW4pKTsKKworb3V0OgorCWRlbF9oaXN0X2VudHJpZXMoaGlzdHMpOworCXJlc2V0X291dHB1dF9maWVsZCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qIE5PIGNhbGxjaGFpbiArIGNoaWxkcmVuICovCitzdGF0aWMgaW50IHRlc3QzKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gJmV2c2VsLT5oaXN0czsKKwkvKgorCSAqIGV4cGVjdGVkIG91dHB1dDoKKwkgKgorCSAqIENoaWxkcmVuICAgICAgU2VsZiAgQ29tbWFuZCAgU2hhcmVkIE9iamVjdCAgICAgICAgICAgICAgICAgICBTeW1ib2wKKwkgKiA9PT09PT09PSAgPT09PT09PT0gID09PT09PT0gID09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09CisJICogICA3MC4wMCUgICAgMjAuMDAlICAgICBwZXJmICBwZXJmICAgICAgICAgICBbLl0gbWFpbgorCSAqICAgNTAuMDAlICAgICAwLjAwJSAgICAgcGVyZiAgcGVyZiAgICAgICAgICAgWy5dIHJ1bl9jb21tYW5kCisJICogICAzMC4wMCUgICAgMTAuMDAlICAgICBiYXNoICBiYXNoICAgICAgICAgICBbLl0gbWFpbgorCSAqICAgMzAuMDAlICAgIDEwLjAwJSAgICAgcGVyZiAgcGVyZiAgICAgICAgICAgWy5dIGNtZF9yZWNvcmQKKwkgKiAgIDIwLjAwJSAgICAgMC4wMCUgICAgIGJhc2ggIGxpYmMgICAgICAgICAgIFsuXSBtYWxsb2MKKwkgKiAgIDEwLjAwJSAgICAxMC4wMCUgICAgIGJhc2ggIFtrZXJuZWxdICAgICAgIFtrXSBwYWdlX2ZhdWx0CisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gc2NoZWR1bGUKKwkgKiAgIDEwLjAwJSAgICAgMC4wMCUgICAgIHBlcmYgIFtrZXJuZWxdICAgICAgIFtrXSBzeXNfcGVyZl9ldmVudF9vcGVuCisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gcGFnZV9mYXVsdAorCSAqICAgMTAuMDAlICAgIDEwLjAwJSAgICAgcGVyZiAgbGliYyAgICAgICAgICAgWy5dIGZyZWUKKwkgKiAgIDEwLjAwJSAgICAxMC4wMCUgICAgIHBlcmYgIGxpYmMgICAgICAgICAgIFsuXSBtYWxsb2MKKwkgKiAgIDEwLjAwJSAgICAxMC4wMCUgICAgIGJhc2ggIGJhc2ggICAgICAgICAgIFsuXSB4bWFsbG9jCisJICovCisJc3RydWN0IHJlc3VsdCBleHBlY3RlZFtdID0geworCQl7IDcwMDAsIDIwMDAsICJwZXJmIiwgInBlcmYiLCAgICAgIm1haW4iIH0sCisJCXsgNTAwMCwgICAgMCwgInBlcmYiLCAicGVyZiIsICAgICAicnVuX2NvbW1hbmQiIH0sCisJCXsgMzAwMCwgMTAwMCwgImJhc2giLCAiYmFzaCIsICAgICAibWFpbiIgfSwKKwkJeyAzMDAwLCAxMDAwLCAicGVyZiIsICJwZXJmIiwgICAgICJjbWRfcmVjb3JkIiB9LAorCQl7IDIwMDAsICAgIDAsICJiYXNoIiwgImxpYmMiLCAgICAgIm1hbGxvYyIgfSwKKwkJeyAxMDAwLCAxMDAwLCAiYmFzaCIsICJba2VybmVsXSIsICJwYWdlX2ZhdWx0IiB9LAorCQl7IDEwMDAsIDEwMDAsICJwZXJmIiwgIltrZXJuZWxdIiwgInNjaGVkdWxlIiB9LAorCQl7IDEwMDAsICAgIDAsICJwZXJmIiwgIltrZXJuZWxdIiwgInN5c19wZXJmX2V2ZW50X29wZW4iIH0sCisJCXsgMTAwMCwgMTAwMCwgInBlcmYiLCAiW2tlcm5lbF0iLCAicGFnZV9mYXVsdCIgfSwKKwkJeyAxMDAwLCAxMDAwLCAicGVyZiIsICJsaWJjIiwgICAgICJmcmVlIiB9LAorCQl7IDEwMDAsIDEwMDAsICJwZXJmIiwgImxpYmMiLCAgICAgIm1hbGxvYyIgfSwKKwkJeyAxMDAwLCAxMDAwLCAiYmFzaCIsICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCX07CisKKwlzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluID0gZmFsc2U7CisJc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluID0gdHJ1ZTsKKworCXNldHVwX3NvcnRpbmcoKTsKKwljYWxsY2hhaW5fcmVnaXN0ZXJfcGFyYW0oJmNhbGxjaGFpbl9wYXJhbSk7CisKKwllcnIgPSBhZGRfaGlzdF9lbnRyaWVzKGhpc3RzLCBtYWNoaW5lKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBkb190ZXN0KGhpc3RzLCBleHBlY3RlZCwgQVJSQVlfU0laRShleHBlY3RlZCksIE5VTEwsIDApOworCitvdXQ6CisJZGVsX2hpc3RfZW50cmllcyhoaXN0cyk7CisJcmVzZXRfb3V0cHV0X2ZpZWxkKCk7CisJcmV0dXJuIGVycjsKK30KKworLyogY2FsbGNoYWluICsgY2hpbGRyZW4gKi8KK3N0YXRpYyBpbnQgdGVzdDQoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBoaXN0cyAqaGlzdHMgPSAmZXZzZWwtPmhpc3RzOworCS8qCisJICogZXhwZWN0ZWQgb3V0cHV0OgorCSAqCisJICogQ2hpbGRyZW4gICAgICBTZWxmICBDb21tYW5kICBTaGFyZWQgT2JqZWN0ICAgICAgICAgICAgICAgICAgIFN5bWJvbAorCSAqID09PT09PT09ICA9PT09PT09PSAgPT09PT09PSAgPT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT0KKwkgKiAgIDcwLjAwJSAgICAyMC4wMCUgICAgIHBlcmYgIHBlcmYgICAgICAgICAgIFsuXSBtYWluCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIG1haW4KKwkgKgorCSAqICAgNTAuMDAlICAgICAwLjAwJSAgICAgcGVyZiAgcGVyZiAgICAgICAgICAgWy5dIHJ1bl9jb21tYW5kCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIHJ1bl9jb21tYW5kCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKiAgIDMwLjAwJSAgICAxMC4wMCUgICAgIGJhc2ggIGJhc2ggICAgICAgICAgIFsuXSBtYWluCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIG1haW4KKwkgKgorCSAqICAgMzAuMDAlICAgIDEwLjAwJSAgICAgcGVyZiAgcGVyZiAgICAgICAgICAgWy5dIGNtZF9yZWNvcmQKKwkgKiAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAtLS0gY21kX3JlY29yZAorCSAqICAgICAgICAgICAgICAgICAgcnVuX2NvbW1hbmQKKwkgKiAgICAgICAgICAgICAgICAgIG1haW4KKwkgKgorCSAqICAgMjAuMDAlICAgICAwLjAwJSAgICAgYmFzaCAgbGliYyAgICAgICAgICAgWy5dIG1hbGxvYworCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBtYWxsb2MKKwkgKiAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICB8LS01MC4wMCUtLSB4bWFsbG9jCisJICogICAgICAgICAgICAgICAgIHwgICAgICAgICAgIG1haW4KKwkgKiAgICAgICAgICAgICAgICAgIC0tNTAuMDAlLS0gbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBiYXNoICBba2VybmVsXSAgICAgICBba10gcGFnZV9mYXVsdAorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBwYWdlX2ZhdWx0CisJICogICAgICAgICAgICAgICAgICBtYWxsb2MKKwkgKiAgICAgICAgICAgICAgICAgIG1haW4KKwkgKgorCSAqICAgMTAuMDAlICAgIDEwLjAwJSAgICAgcGVyZiAgW2tlcm5lbF0gICAgICAgW2tdIHNjaGVkdWxlCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIHNjaGVkdWxlCisJICogICAgICAgICAgICAgICAgICBydW5fY29tbWFuZAorCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgIDAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gc3lzX3BlcmZfZXZlbnRfb3BlbgorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBzeXNfcGVyZl9ldmVudF9vcGVuCisJICogICAgICAgICAgICAgICAgICBydW5fY29tbWFuZAorCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBwZXJmICBba2VybmVsXSAgICAgICBba10gcGFnZV9mYXVsdAorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBwYWdlX2ZhdWx0CisJICogICAgICAgICAgICAgICAgICBzeXNfcGVyZl9ldmVudF9vcGVuCisJICogICAgICAgICAgICAgICAgICBydW5fY29tbWFuZAorCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBwZXJmICBsaWJjICAgICAgICAgICBbLl0gZnJlZQorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIC0tLSBmcmVlCisJICogICAgICAgICAgICAgICAgICBjbWRfcmVjb3JkCisJICogICAgICAgICAgICAgICAgICBydW5fY29tbWFuZAorCSAqICAgICAgICAgICAgICAgICAgbWFpbgorCSAqCisJICogICAxMC4wMCUgICAgMTAuMDAlICAgICBwZXJmICBsaWJjICAgICAgICAgICBbLl0gbWFsbG9jCisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgLS0tIG1hbGxvYworCSAqICAgICAgICAgICAgICAgICAgY21kX3JlY29yZAorCSAqICAgICAgICAgICAgICAgICAgcnVuX2NvbW1hbmQKKwkgKiAgICAgICAgICAgICAgICAgIG1haW4KKwkgKgorCSAqICAgMTAuMDAlICAgIDEwLjAwJSAgICAgYmFzaCAgYmFzaCAgICAgICAgICAgWy5dIHhtYWxsb2MKKwkgKiAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAtLS0geG1hbGxvYworCSAqICAgICAgICAgICAgICAgICAgbWFsbG9jCisJICogICAgICAgICAgICAgICAgICB4bWFsbG9jICAgICA8LS0tIE5PVEU6IHRoZXJlJ3MgYSBjeWNsZQorCSAqICAgICAgICAgICAgICAgICAgbWFsbG9jCisJICogICAgICAgICAgICAgICAgICB4bWFsbG9jCisJICogICAgICAgICAgICAgICAgICBtYWluCisJICoKKwkgKi8KKwlzdHJ1Y3QgcmVzdWx0IGV4cGVjdGVkW10gPSB7CisJCXsgNzAwMCwgMjAwMCwgInBlcmYiLCAicGVyZiIsICAgICAibWFpbiIgfSwKKwkJeyA1MDAwLCAgICAwLCAicGVyZiIsICJwZXJmIiwgICAgICJydW5fY29tbWFuZCIgfSwKKwkJeyAzMDAwLCAxMDAwLCAiYmFzaCIsICJiYXNoIiwgICAgICJtYWluIiB9LAorCQl7IDMwMDAsIDEwMDAsICJwZXJmIiwgInBlcmYiLCAgICAgImNtZF9yZWNvcmQiIH0sCisJCXsgMjAwMCwgICAgMCwgImJhc2giLCAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQl7IDEwMDAsIDEwMDAsICJiYXNoIiwgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCXsgMTAwMCwgMTAwMCwgInBlcmYiLCAiW2tlcm5lbF0iLCAic2NoZWR1bGUiIH0sCisJCXsgMTAwMCwgICAgMCwgInBlcmYiLCAiW2tlcm5lbF0iLCAic3lzX3BlcmZfZXZlbnRfb3BlbiIgfSwKKwkJeyAxMDAwLCAxMDAwLCAicGVyZiIsICJba2VybmVsXSIsICJwYWdlX2ZhdWx0IiB9LAorCQl7IDEwMDAsIDEwMDAsICJwZXJmIiwgImxpYmMiLCAgICAgImZyZWUiIH0sCisJCXsgMTAwMCwgMTAwMCwgInBlcmYiLCAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQl7IDEwMDAsIDEwMDAsICJiYXNoIiwgImJhc2giLCAgICAgInhtYWxsb2MiIH0sCisJfTsKKwlzdHJ1Y3QgY2FsbGNoYWluX3Jlc3VsdCBleHBlY3RlZF9jYWxsY2hhaW5bXSA9IHsKKwkJeworCQkJMSwgewl7ICJwZXJmIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCQl7CisJCQkyLCB7CXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTEsIHsJeyAiYmFzaCIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJMywgewl7ICJwZXJmIiwgICAgICJjbWRfcmVjb3JkIiB9LAorCQkJCXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTQsIHsJeyAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQkJCXsgImJhc2giLCAgICAgInhtYWxsb2MiIH0sCisJCQkJeyAiYmFzaCIsICAgICAibWFpbiIgfSwKKwkJCQl7ICJiYXNoIiwgICAgICJtYWluIiB9LCB9LAorCQl9LAorCQl7CisJCQkzLCB7CXsgIltrZXJuZWxdIiwgInBhZ2VfZmF1bHQiIH0sCisJCQkJeyAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQkJCXsgImJhc2giLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTMsIHsJeyAiW2tlcm5lbF0iLCAic2NoZWR1bGUiIH0sCisJCQkJeyAicGVyZiIsICAgICAicnVuX2NvbW1hbmQiIH0sCisJCQkJeyAicGVyZiIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJMywgewl7ICJba2VybmVsXSIsICJzeXNfcGVyZl9ldmVudF9vcGVuIiB9LAorCQkJCXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTQsIHsJeyAiW2tlcm5lbF0iLCAicGFnZV9mYXVsdCIgfSwKKwkJCQl7ICJba2VybmVsXSIsICJzeXNfcGVyZl9ldmVudF9vcGVuIiB9LAorCQkJCXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTQsIHsJeyAibGliYyIsICAgICAiZnJlZSIgfSwKKwkJCQl7ICJwZXJmIiwgICAgICJjbWRfcmVjb3JkIiB9LAorCQkJCXsgInBlcmYiLCAgICAgInJ1bl9jb21tYW5kIiB9LAorCQkJCXsgInBlcmYiLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJCXsKKwkJCTQsIHsJeyAibGliYyIsICAgICAibWFsbG9jIiB9LAorCQkJCXsgInBlcmYiLCAgICAgImNtZF9yZWNvcmQiIH0sCisJCQkJeyAicGVyZiIsICAgICAicnVuX2NvbW1hbmQiIH0sCisJCQkJeyAicGVyZiIsICAgICAibWFpbiIgfSwgfSwKKwkJfSwKKwkJeworCQkJNiwgewl7ICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCQkJCXsgImxpYmMiLCAgICAgIm1hbGxvYyIgfSwKKwkJCQl7ICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCQkJCXsgImxpYmMiLCAgICAgIm1hbGxvYyIgfSwKKwkJCQl7ICJiYXNoIiwgICAgICJ4bWFsbG9jIiB9LAorCQkJCXsgImJhc2giLCAgICAgIm1haW4iIH0sIH0sCisJCX0sCisJfTsKKworCXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4gPSB0cnVlOworCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IHRydWU7CisKKwlzZXR1cF9zb3J0aW5nKCk7CisJY2FsbGNoYWluX3JlZ2lzdGVyX3BhcmFtKCZjYWxsY2hhaW5fcGFyYW0pOworCisJZXJyID0gYWRkX2hpc3RfZW50cmllcyhoaXN0cywgbWFjaGluZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gZG9fdGVzdChoaXN0cywgZXhwZWN0ZWQsIEFSUkFZX1NJWkUoZXhwZWN0ZWQpLAorCQkgICAgICBleHBlY3RlZF9jYWxsY2hhaW4sIEFSUkFZX1NJWkUoZXhwZWN0ZWRfY2FsbGNoYWluKSk7CisKK291dDoKKwlkZWxfaGlzdF9lbnRyaWVzKGhpc3RzKTsKKwlyZXNldF9vdXRwdXRfZmllbGQoKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgdGVzdF9faGlzdHNfY3VtdWxhdGUodm9pZCkKK3sKKwlpbnQgZXJyID0gVEVTVF9GQUlMOworCXN0cnVjdCBtYWNoaW5lcyBtYWNoaW5lczsKKwlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSBwZXJmX2V2bGlzdF9fbmV3KCk7CisJc2l6ZV90IGk7CisJdGVzdF9mbl90IHRlc3RjYXNlc1tdID0geworCQl0ZXN0MSwKKwkJdGVzdDIsCisJCXRlc3QzLAorCQl0ZXN0NCwKKwl9OworCisJVEVTVF9BU1NFUlRfVkFMKCJObyBtZW1vcnkiLCBldmxpc3QpOworCisJZXJyID0gcGFyc2VfZXZlbnRzKGV2bGlzdCwgImNwdS1jbG9jayIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJbWFjaGluZXNfX2luaXQoJm1hY2hpbmVzKTsKKworCS8qIHNldHVwIHRocmVhZHMvZHNvL21hcC9zeW1ib2xzIGFsc28gKi8KKwltYWNoaW5lID0gc2V0dXBfZmFrZV9tYWNoaW5lKCZtYWNoaW5lcyk7CisJaWYgKCFtYWNoaW5lKQorCQlnb3RvIG91dDsKKworCWlmICh2ZXJib3NlID4gMSkKKwkJbWFjaGluZV9fZnByaW50ZihtYWNoaW5lLCBzdGRlcnIpOworCisJZXZzZWwgPSBwZXJmX2V2bGlzdF9fZmlyc3QoZXZsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3RjYXNlcyk7IGkrKykgeworCQllcnIgPSB0ZXN0Y2FzZXNbaV0oZXZzZWwsIG1hY2hpbmUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCX0KKworb3V0OgorCS8qIHRlYXIgZG93biBldmVyeXRoaW5nICovCisJcGVyZl9ldmxpc3RfX2RlbGV0ZShldmxpc3QpOworCW1hY2hpbmVzX19leGl0KCZtYWNoaW5lcyk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19maWx0ZXIuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfZmlsdGVyLmMKaW5kZXggYzViYTkyNC4uODIxZjU4MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19maWx0ZXIuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2ZpbHRlci5jCkBAIC0yMSwzMyArMjEsMzMgQEAKIC8qIEZvciB0aGUgbnVtYmVycywgc2VlIGhpc3RzX2NvbW1vbi5jICovCiBzdGF0aWMgc3RydWN0IHNhbXBsZSBmYWtlX3NhbXBsZXNbXSA9IHsKIAkvKiBwZXJmIFtrZXJuZWxdIHNjaGVkdWxlKCkgKi8KLQl7IC5waWQgPSAxMDAsIC5pcCA9IDB4ZjAwMDAgKyA3MDAsIH0sCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1NDSEVEVUxFLCB9LAogCS8qIHBlcmYgW3BlcmZdICAgbWFpbigpICovCi0JeyAucGlkID0gMTAwLCAuaXAgPSAweDQwMDAwICsgNzAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYxLCAuaXAgPSBGQUtFX0lQX1BFUkZfTUFJTiwgfSwKIAkvKiBwZXJmIFtsaWJjXSAgIG1hbGxvYygpICovCi0JeyAucGlkID0gMTAwLCAuaXAgPSAweDUwMDAwICsgNzAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYxLCAuaXAgPSBGQUtFX0lQX0xJQkNfTUFMTE9DLCB9LAogCS8qIHBlcmYgW3BlcmZdICAgbWFpbigpICovCi0JeyAucGlkID0gMjAwLCAuaXAgPSAweDQwMDAwICsgNzAwLCB9LCAvKiB3aWxsIGJlIG1lcmdlZCAqLworCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX1BFUkZfTUFJTiwgfSwgLyogd2lsbCBiZSBtZXJnZWQgKi8KIAkvKiBwZXJmIFtwZXJmXSAgIGNtZF9yZWNvcmQoKSAqLwotCXsgLnBpZCA9IDIwMCwgLmlwID0gMHg0MDAwMCArIDkwMCwgfSwKKwl7IC5waWQgPSBGQUtFX1BJRF9QRVJGMiwgLmlwID0gRkFLRV9JUF9QRVJGX0NNRF9SRUNPUkQsIH0sCiAJLyogcGVyZiBba2VybmVsXSBwYWdlX2ZhdWx0KCkgKi8KLQl7IC5waWQgPSAyMDAsIC5pcCA9IDB4ZjAwMDAgKyA4MDAsIH0sCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjIsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1BBR0VfRkFVTFQsIH0sCiAJLyogYmFzaCBbYmFzaF0gICBtYWluKCkgKi8KLQl7IC5waWQgPSAzMDAsIC5pcCA9IDB4NDAwMDAgKyA3MDAsIH0sCisJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfQkFTSF9NQUlOLCB9LAogCS8qIGJhc2ggW2Jhc2hdICAgeG1hbGxvYygpICovCi0JeyAucGlkID0gMzAwLCAuaXAgPSAweDQwMDAwICsgODAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0JBU0hfWE1BTExPQywgfSwKIAkvKiBiYXNoIFtsaWJjXSAgIG1hbGxvYygpICovCi0JeyAucGlkID0gMzAwLCAuaXAgPSAweDUwMDAwICsgNzAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0xJQkNfTUFMTE9DLCB9LAogCS8qIGJhc2ggW2tlcm5lbF0gcGFnZV9mYXVsdCgpICovCi0JeyAucGlkID0gMzAwLCAuaXAgPSAweGYwMDAwICsgODAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCB9LAogfTsKIAotc3RhdGljIGludCBhZGRfaGlzdF9lbnRyaWVzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3N0YXRpYyBpbnQgYWRkX2hpc3RfZW50cmllcyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX21heWJlX3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7Ci0Jc3RydWN0IGhpc3RfZW50cnkgKmhlOwotCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGUgPSB7IC5jcHUgPSAwLCB9OworCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGUgPSB7IC5wZXJpb2QgPSAxMDAsIH07CiAJc2l6ZV90IGk7CiAKIAkvKgpAQCAtNjIsNiArNjIsMTAgQEAKIAkJCQkJLm1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCiAJCQkJfSwKIAkJCX07CisJCQlzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyIGl0ZXIgPSB7CisJCQkJLm9wcyA9ICZoaXN0X2l0ZXJfbm9ybWFsLAorCQkJCS5oaWRlX3VucmVzb2x2ZWQgPSBmYWxzZSwKKwkJCX07CiAKIAkJCS8qIG1ha2Ugc3VyZSBpdCBoYXMgbm8gZmlsdGVyIGF0IGZpcnN0ICovCiAJCQlldnNlbC0+aGlzdHMudGhyZWFkX2ZpbHRlciA9IE5VTEw7CkBAIC03NiwxOCArODAsMTMgQEAKIAkJCQkJCQkgICZzYW1wbGUpIDwgMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJaGUgPSBfX2hpc3RzX19hZGRfZW50cnkoJmV2c2VsLT5oaXN0cywgJmFsLCBOVUxMLAotCQkJCQkJTlVMTCwgTlVMTCwgMTAwLCAxLCAwKTsKLQkJCWlmIChoZSA9PSBOVUxMKQorCQkJaWYgKGhpc3RfZW50cnlfaXRlcl9fYWRkKCZpdGVyLCAmYWwsIGV2c2VsLCAmc2FtcGxlLAorCQkJCQkJIFBFUkZfTUFYX1NUQUNLX0RFUFRILCBOVUxMKSA8IDApCiAJCQkJZ290byBvdXQ7CiAKIAkJCWZha2Vfc2FtcGxlc1tpXS50aHJlYWQgPSBhbC50aHJlYWQ7CiAJCQlmYWtlX3NhbXBsZXNbaV0ubWFwID0gYWwubWFwOwogCQkJZmFrZV9zYW1wbGVzW2ldLnN5bSA9IGFsLnN5bTsKLQotCQkJaGlzdHNfX2luY19ucl9ldmVudHMoaGUtPmhpc3RzLCBQRVJGX1JFQ09SRF9TQU1QTEUpOwotCQkJaWYgKCFoZS0+ZmlsdGVyZWQpCi0JCQkJaGUtPmhpc3RzLT5zdGF0cy5ucl9ub25fZmlsdGVyZWRfc2FtcGxlcysrOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2xpbmsuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCmluZGV4IDVmZmEyYzMuLmQ0YjM0YjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCkBAIC0yMSw0MSArMjEsNDEgQEAKIC8qIEZvciB0aGUgbnVtYmVycywgc2VlIGhpc3RzX2NvbW1vbi5jICovCiBzdGF0aWMgc3RydWN0IHNhbXBsZSBmYWtlX2NvbW1vbl9zYW1wbGVzW10gPSB7CiAJLyogcGVyZiBba2VybmVsXSBzY2hlZHVsZSgpICovCi0JeyAucGlkID0gMTAwLCAuaXAgPSAweGYwMDAwICsgNzAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYxLCAuaXAgPSBGQUtFX0lQX0tFUk5FTF9TQ0hFRFVMRSwgfSwKIAkvKiBwZXJmIFtwZXJmXSAgIG1haW4oKSAqLwotCXsgLnBpZCA9IDIwMCwgLmlwID0gMHg0MDAwMCArIDcwMCwgfSwKKwl7IC5waWQgPSBGQUtFX1BJRF9QRVJGMiwgLmlwID0gRkFLRV9JUF9QRVJGX01BSU4sIH0sCiAJLyogcGVyZiBbcGVyZl0gICBjbWRfcmVjb3JkKCkgKi8KLQl7IC5waWQgPSAyMDAsIC5pcCA9IDB4NDAwMDAgKyA5MDAsIH0sCisJeyAucGlkID0gRkFLRV9QSURfUEVSRjIsIC5pcCA9IEZBS0VfSVBfUEVSRl9DTURfUkVDT1JELCB9LAogCS8qIGJhc2ggW2Jhc2hdICAgeG1hbGxvYygpICovCi0JeyAucGlkID0gMzAwLCAuaXAgPSAweDQwMDAwICsgODAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0JBU0hfWE1BTExPQywgfSwKIAkvKiBiYXNoIFtsaWJjXSAgIG1hbGxvYygpICovCi0JeyAucGlkID0gMzAwLCAuaXAgPSAweDUwMDAwICsgNzAwLCB9LAorCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0xJQkNfTUFMTE9DLCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW1wbGUgZmFrZV9zYW1wbGVzW11bNV0gPSB7CiAJewogCQkvKiBwZXJmIFtwZXJmXSAgIHJ1bl9jb21tYW5kKCkgKi8KLQkJeyAucGlkID0gMTAwLCAuaXAgPSAweDQwMDAwICsgODAwLCB9LAorCQl7IC5waWQgPSBGQUtFX1BJRF9QRVJGMSwgLmlwID0gRkFLRV9JUF9QRVJGX1JVTl9DT01NQU5ELCB9LAogCQkvKiBwZXJmIFtsaWJjXSAgIG1hbGxvYygpICovCi0JCXsgLnBpZCA9IDEwMCwgLmlwID0gMHg1MDAwMCArIDcwMCwgfSwKKwkJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfTElCQ19NQUxMT0MsIH0sCiAJCS8qIHBlcmYgW2tlcm5lbF0gcGFnZV9mYXVsdCgpICovCi0JCXsgLnBpZCA9IDEwMCwgLmlwID0gMHhmMDAwMCArIDgwMCwgfSwKKwkJeyAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1BBR0VfRkFVTFQsIH0sCiAJCS8qIHBlcmYgW2tlcm5lbF0gc3lzX3BlcmZfZXZlbnRfb3BlbigpICovCi0JCXsgLnBpZCA9IDIwMCwgLmlwID0gMHhmMDAwMCArIDkwMCwgfSwKKwkJeyAucGlkID0gRkFLRV9QSURfUEVSRjIsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1NZU19QRVJGX0VWRU5UX09QRU4sIH0sCiAJCS8qIGJhc2ggW2xpYmNdICAgZnJlZSgpICovCi0JCXsgLnBpZCA9IDMwMCwgLmlwID0gMHg1MDAwMCArIDgwMCwgfSwKKwkJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfTElCQ19GUkVFLCB9LAogCX0sCiAJewogCQkvKiBwZXJmIFtsaWJjXSAgIGZyZWUoKSAqLwotCQl7IC5waWQgPSAyMDAsIC5pcCA9IDB4NTAwMDAgKyA4MDAsIH0sCisJCXsgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX0xJQkNfRlJFRSwgfSwKIAkJLyogYmFzaCBbbGliY10gICBtYWxsb2MoKSAqLwotCQl7IC5waWQgPSAzMDAsIC5pcCA9IDB4NTAwMDAgKyA3MDAsIH0sIC8qIHdpbGwgYmUgbWVyZ2VkICovCisJCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0xJQkNfTUFMTE9DLCB9LCAvKiB3aWxsIGJlIG1lcmdlZCAqLwogCQkvKiBiYXNoIFtiYXNoXSAgIHhmZWUoKSAqLwotCQl7IC5waWQgPSAzMDAsIC5pcCA9IDB4NDAwMDAgKyA5MDAsIH0sCisJCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0JBU0hfWEZSRUUsIH0sCiAJCS8qIGJhc2ggW2xpYmNdICAgcmVhbGxvYygpICovCi0JCXsgLnBpZCA9IDMwMCwgLmlwID0gMHg1MDAwMCArIDkwMCwgfSwKKwkJeyAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfTElCQ19SRUFMTE9DLCB9LAogCQkvKiBiYXNoIFtrZXJuZWxdIHBhZ2VfZmF1bHQoKSAqLwotCQl7IC5waWQgPSAzMDAsIC5pcCA9IDB4ZjAwMDAgKyA4MDAsIH0sCisJCXsgLnBpZCA9IEZBS0VfUElEX0JBU0gsICAuaXAgPSBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCB9LAogCX0sCiB9OwogCkBAIC02NCw3ICs2NCw3IEBACiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKLQlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlID0geyAuY3B1ID0gMCwgfTsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlID0geyAucGVyaW9kID0gMSwgfTsKIAlzaXplX3QgaSA9IDAsIGs7CiAKIAkvKgpAQCAtODgsNyArODgsNyBAQAogCQkJCWdvdG8gb3V0OwogCiAJCQloZSA9IF9faGlzdHNfX2FkZF9lbnRyeSgmZXZzZWwtPmhpc3RzLCAmYWwsIE5VTEwsCi0JCQkJCQlOVUxMLCBOVUxMLCAxLCAxLCAwKTsKKwkJCQkJCU5VTEwsIE5VTEwsIDEsIDEsIDAsIHRydWUpOwogCQkJaWYgKGhlID09IE5VTEwpCiAJCQkJZ290byBvdXQ7CiAKQEAgLTExMiw3ICsxMTIsNyBAQAogCQkJCWdvdG8gb3V0OwogCiAJCQloZSA9IF9faGlzdHNfX2FkZF9lbnRyeSgmZXZzZWwtPmhpc3RzLCAmYWwsIE5VTEwsCi0JCQkJCQlOVUxMLCBOVUxMLCAxLCAxLCAwKTsKKwkJCQkJCU5VTEwsIE5VTEwsIDEsIDEsIDAsIHRydWUpOwogCQkJaWYgKGhlID09IE5VTEwpCiAJCQkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfb3V0cHV0LmMgYi90b29scy9wZXJmL3Rlc3RzL2hpc3RzX291dHB1dC5jCmluZGV4IGExNjg1MDUuLmUzYmJkNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfb3V0cHV0LmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9oaXN0c19vdXRwdXQuYwpAQCAtMjIsMzEgKzIyLDMxIEBACiAvKiBGb3IgdGhlIG51bWJlcnMsIHNlZSBoaXN0c19jb21tb24uYyAqLwogc3RhdGljIHN0cnVjdCBzYW1wbGUgZmFrZV9zYW1wbGVzW10gPSB7CiAJLyogcGVyZiBba2VybmVsXSBzY2hlZHVsZSgpICovCi0JeyAuY3B1ID0gMCwgLnBpZCA9IDEwMCwgLmlwID0gMHhmMDAwMCArIDcwMCwgfSwKKwl7IC5jcHUgPSAwLCAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1NDSEVEVUxFLCB9LAogCS8qIHBlcmYgW3BlcmZdICAgbWFpbigpICovCi0JeyAuY3B1ID0gMSwgLnBpZCA9IDEwMCwgLmlwID0gMHg0MDAwMCArIDcwMCwgfSwKKwl7IC5jcHUgPSAxLCAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfUEVSRl9NQUlOLCB9LAogCS8qIHBlcmYgW3BlcmZdICAgY21kX3JlY29yZCgpICovCi0JeyAuY3B1ID0gMSwgLnBpZCA9IDEwMCwgLmlwID0gMHg0MDAwMCArIDkwMCwgfSwKKwl7IC5jcHUgPSAxLCAucGlkID0gRkFLRV9QSURfUEVSRjEsIC5pcCA9IEZBS0VfSVBfUEVSRl9DTURfUkVDT1JELCB9LAogCS8qIHBlcmYgW2xpYmNdICAgbWFsbG9jKCkgKi8KLQl7IC5jcHUgPSAxLCAucGlkID0gMTAwLCAuaXAgPSAweDUwMDAwICsgNzAwLCB9LAorCXsgLmNwdSA9IDEsIC5waWQgPSBGQUtFX1BJRF9QRVJGMSwgLmlwID0gRkFLRV9JUF9MSUJDX01BTExPQywgfSwKIAkvKiBwZXJmIFtsaWJjXSAgIGZyZWUoKSAqLwotCXsgLmNwdSA9IDIsIC5waWQgPSAxMDAsIC5pcCA9IDB4NTAwMDAgKyA4MDAsIH0sCisJeyAuY3B1ID0gMiwgLnBpZCA9IEZBS0VfUElEX1BFUkYxLCAuaXAgPSBGQUtFX0lQX0xJQkNfRlJFRSwgfSwKIAkvKiBwZXJmIFtwZXJmXSAgIG1haW4oKSAqLwotCXsgLmNwdSA9IDIsIC5waWQgPSAyMDAsIC5pcCA9IDB4NDAwMDAgKyA3MDAsIH0sCisJeyAuY3B1ID0gMiwgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX1BFUkZfTUFJTiwgfSwKIAkvKiBwZXJmIFtrZXJuZWxdIHBhZ2VfZmF1bHQoKSAqLwotCXsgLmNwdSA9IDIsIC5waWQgPSAyMDAsIC5pcCA9IDB4ZjAwMDAgKyA4MDAsIH0sCisJeyAuY3B1ID0gMiwgLnBpZCA9IEZBS0VfUElEX1BFUkYyLCAuaXAgPSBGQUtFX0lQX0tFUk5FTF9QQUdFX0ZBVUxULCB9LAogCS8qIGJhc2ggW2Jhc2hdICAgbWFpbigpICovCi0JeyAuY3B1ID0gMywgLnBpZCA9IDMwMCwgLmlwID0gMHg0MDAwMCArIDcwMCwgfSwKKwl7IC5jcHUgPSAzLCAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfQkFTSF9NQUlOLCB9LAogCS8qIGJhc2ggW2Jhc2hdICAgeG1hbGxvYygpICovCi0JeyAuY3B1ID0gMCwgLnBpZCA9IDMwMCwgLmlwID0gMHg0MDAwMCArIDgwMCwgfSwKKwl7IC5jcHUgPSAwLCAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfQkFTSF9YTUFMTE9DLCB9LAogCS8qIGJhc2ggW2tlcm5lbF0gcGFnZV9mYXVsdCgpICovCi0JeyAuY3B1ID0gMSwgLnBpZCA9IDMwMCwgLmlwID0gMHhmMDAwMCArIDgwMCwgfSwKKwl7IC5jcHUgPSAxLCAucGlkID0gRkFLRV9QSURfQkFTSCwgIC5pcCA9IEZBS0VfSVBfS0VSTkVMX1BBR0VfRkFVTFQsIH0sCiB9OwogCiBzdGF0aWMgaW50IGFkZF9oaXN0X2VudHJpZXMoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7Ci0Jc3RydWN0IGhpc3RfZW50cnkgKmhlOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKTsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlID0geyAucGVyaW9kID0gMTAwLCB9OwogCXNpemVfdCBpOwogCkBAIC01Niw2ICs1NiwxMCBAQAogCQkJCS5taXNjID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAogCQkJfSwKIAkJfTsKKwkJc3RydWN0IGhpc3RfZW50cnlfaXRlciBpdGVyID0geworCQkJLm9wcyA9ICZoaXN0X2l0ZXJfbm9ybWFsLAorCQkJLmhpZGVfdW5yZXNvbHZlZCA9IGZhbHNlLAorCQl9OwogCiAJCXNhbXBsZS5jcHUgPSBmYWtlX3NhbXBsZXNbaV0uY3B1OwogCQlzYW1wbGUucGlkID0gZmFrZV9zYW1wbGVzW2ldLnBpZDsKQEAgLTY2LDkgKzcwLDggQEAKIAkJCQkJCSAgJnNhbXBsZSkgPCAwKQogCQkJZ290byBvdXQ7CiAKLQkJaGUgPSBfX2hpc3RzX19hZGRfZW50cnkoaGlzdHMsICZhbCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkJc2FtcGxlLnBlcmlvZCwgMSwgMCk7Ci0JCWlmIChoZSA9PSBOVUxMKQorCQlpZiAoaGlzdF9lbnRyeV9pdGVyX19hZGQoJml0ZXIsICZhbCwgZXZzZWwsICZzYW1wbGUsCisJCQkJCSBQRVJGX01BWF9TVEFDS19ERVBUSCwgTlVMTCkgPCAwKQogCQkJZ290byBvdXQ7CiAKIAkJZmFrZV9zYW1wbGVzW2ldLnRocmVhZCA9IGFsLnRocmVhZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaCBiL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaAppbmRleCBkNzZjMGUyLi4wMjJiYjY4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3Rlc3RzLmgKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oCkBAIC00NSw2ICs0NSw3IEBACiBpbnQgdGVzdF9fbW1hcF90aHJlYWRfbG9va3VwKHZvaWQpOwogaW50IHRlc3RfX3RocmVhZF9tZ19zaGFyZSh2b2lkKTsKIGludCB0ZXN0X19oaXN0c19vdXRwdXQodm9pZCk7CitpbnQgdGVzdF9faGlzdHNfY3VtdWxhdGUodm9pZCk7CiAKICNpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hcm1fXykKICNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXIuYyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3Nlci5jCmluZGV4IGQxMTU0MWQuLjNjY2Y2ZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3Nlci5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3Nlci5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJdWlfaGVscGxpbmVfX3ZwdXNoKGZvcm1hdCwgYXJncyk7CiAJCXZhX2VuZChhcmdzKTsKIAl9IGVsc2UgewotCQl3aGlsZSAoKGtleSA9PSB1aV9fcXVlc3Rpb25fd2luZG93KCJXYXJuaW5nISIsIHRleHQsCisJCXdoaWxlICgoa2V5ID0gdWlfX3F1ZXN0aW9uX3dpbmRvdygiV2FybmluZyEiLCB0ZXh0LAogCQkJCQkJICAgIlByZXNzIGFueSBrZXkuLi4iLAogCQkJCQkJICAgdGltZW91dCkpID09IEtfUkVTSVpFKQogCQkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShicm93c2VyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYwppbmRleCAxYzMzMWI5Li41MmMwM2ZiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKKysrIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCkBAIC0zNyw3ICszNyw2IEBACiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3VwZGF0ZV9ucl9lbnRyaWVzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmhiKTsKIAogc3RhdGljIHN0cnVjdCByYl9ub2RlICpoaXN0c19fZmlsdGVyX2VudHJpZXMoc3RydWN0IHJiX25vZGUgKm5kLAotCQkJCQkgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMsCiAJCQkJCSAgICAgZmxvYXQgbWluX3BjbnQpOwogCiBzdGF0aWMgYm9vbCBoaXN0X2Jyb3dzZXJfX2hhc19maWx0ZXIoc3RydWN0IGhpc3RfYnJvd3NlciAqaGIpCkBAIC0zMTksNyArMzE4LDcgQEAKIAlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gYnJvd3Nlci0+aGlzdHM7CiAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJmhpc3RzLT5lbnRyaWVzKTsKLQkgICAgIChuZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhuZCwgaGlzdHMsIGJyb3dzZXItPm1pbl9wY250KSkgIT0gTlVMTDsKKwkgICAgIChuZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhuZCwgYnJvd3Nlci0+bWluX3BjbnQpKSAhPSBOVUxMOwogCSAgICAgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUgPSByYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOwogCQloaXN0X2VudHJ5X19zZXRfZm9sZGluZyhoZSwgdW5mb2xkKTsKQEAgLTY1MSwxMyArNjUwLDM2IEBACiAJCQkgIF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYsIHRydWUpOwkJXAogfQogCisjZGVmaW5lIF9fSFBQX0NPTE9SX0FDQ19QRVJDRU5UX0ZOKF90eXBlLCBfZmllbGQpCQkJXAorc3RhdGljIHU2NCBfX2hwcF9nZXRfYWNjXyMjX2ZpZWxkKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGhlLT5zdGF0X2FjYy0+X2ZpZWxkOwkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBpbnQJCQkJCQkJCVwKK2hpc3RfYnJvd3Nlcl9faHBwX2NvbG9yXyMjX3R5cGUoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10IF9fbWF5YmVfdW51c2VkLFwKKwkJCQlzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwJCQlcCisJCQkJc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCVwKK3sJCQkJCQkJCQlcCisJaWYgKCFzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4pIHsJCQkJXAorCQlpbnQgcmV0ID0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsICIlOHMiLCAiTi9BIik7CVwKKwkJc2xzbWdfcHJpbnRmKCIlcyIsIGhwcC0+YnVmKTsJCQkJXAorCQkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgX19ocHBfZ2V0X2FjY18jI19maWVsZCwgIiAlNi4yZiUlIiwJXAorCQkJICBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmLCB0cnVlKTsJCVwKK30KKwogX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZCwgcGVyaW9kKQogX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9zeXMsIHBlcmlvZF9zeXMpCiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3VzLCBwZXJpb2RfdXMpCiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX2d1ZXN0X3N5cywgcGVyaW9kX2d1ZXN0X3N5cykKIF9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfZ3Vlc3RfdXMsIHBlcmlvZF9ndWVzdF91cykKK19fSFBQX0NPTE9SX0FDQ19QRVJDRU5UX0ZOKG92ZXJoZWFkX2FjYywgcGVyaW9kKQogCiAjdW5kZWYgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTgorI3VuZGVmIF9fSFBQX0NPTE9SX0FDQ19QRVJDRU5UX0ZOCiAKIHZvaWQgaGlzdF9icm93c2VyX19pbml0X2hwcCh2b2lkKQogewpAQCAtNjcxLDYgKzY5Myw4IEBACiAJCQkJaGlzdF9icm93c2VyX19ocHBfY29sb3Jfb3ZlcmhlYWRfZ3Vlc3Rfc3lzOwogCXBlcmZfaHBwX19mb3JtYXRbUEVSRl9IUFBfX09WRVJIRUFEX0dVRVNUX1VTXS5jb2xvciA9CiAJCQkJaGlzdF9icm93c2VyX19ocHBfY29sb3Jfb3ZlcmhlYWRfZ3Vlc3RfdXM7CisJcGVyZl9ocHBfX2Zvcm1hdFtQRVJGX0hQUF9fT1ZFUkhFQURfQUNDXS5jb2xvciA9CisJCQkJaGlzdF9icm93c2VyX19ocHBfY29sb3Jfb3ZlcmhlYWRfYWNjOwogfQogCiBzdGF0aWMgaW50IGhpc3RfYnJvd3Nlcl9fc2hvd19lbnRyeShzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLApAQCAtNzgzLDE1ICs4MDcsMTIgQEAKIAogCWZvciAobmQgPSBicm93c2VyLT50b3A7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKLQkJdTY0IHRvdGFsID0gaGlzdHNfX3RvdGFsX3BlcmlvZChoLT5oaXN0cyk7Ci0JCWZsb2F0IHBlcmNlbnQgPSAwLjA7CisJCWZsb2F0IHBlcmNlbnQ7CiAKIAkJaWYgKGgtPmZpbHRlcmVkKQogCQkJY29udGludWU7CiAKLQkJaWYgKHRvdGFsKQotCQkJcGVyY2VudCA9IGgtPnN0YXQucGVyaW9kICogMTAwLjAgLyB0b3RhbDsKLQorCQlwZXJjZW50ID0gaGlzdF9lbnRyeV9fZ2V0X3BlcmNlbnRfbGltaXQoaCk7CiAJCWlmIChwZXJjZW50IDwgaGItPm1pbl9wY250KQogCQkJY29udGludWU7CiAKQEAgLTgwNCwxNiArODI1LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqaGlzdHNfX2ZpbHRlcl9lbnRyaWVzKHN0cnVjdCByYl9ub2RlICpuZCwKLQkJCQkJICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzLAogCQkJCQkgICAgIGZsb2F0IG1pbl9wY250KQogewogCXdoaWxlIChuZCAhPSBOVUxMKSB7CiAJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKLQkJdTY0IHRvdGFsID0gaGlzdHNfX3RvdGFsX3BlcmlvZChoaXN0cyk7Ci0JCWZsb2F0IHBlcmNlbnQgPSAwLjA7Ci0KLQkJaWYgKHRvdGFsKQotCQkJcGVyY2VudCA9IGgtPnN0YXQucGVyaW9kICogMTAwLjAgLyB0b3RhbDsKKwkJZmxvYXQgcGVyY2VudCA9IGhpc3RfZW50cnlfX2dldF9wZXJjZW50X2xpbWl0KGgpOwogCiAJCWlmICghaC0+ZmlsdGVyZWQgJiYgcGVyY2VudCA+PSBtaW5fcGNudCkKIAkJCXJldHVybiBuZDsKQEAgLTgyNSwxNiArODQxLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqaGlzdHNfX2ZpbHRlcl9wcmV2X2VudHJpZXMoc3RydWN0IHJiX25vZGUgKm5kLAotCQkJCQkJICBzdHJ1Y3QgaGlzdHMgKmhpc3RzLAogCQkJCQkJICBmbG9hdCBtaW5fcGNudCkKIHsKIAl3aGlsZSAobmQgIT0gTlVMTCkgewogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7Ci0JCXU2NCB0b3RhbCA9IGhpc3RzX190b3RhbF9wZXJpb2QoaGlzdHMpOwotCQlmbG9hdCBwZXJjZW50ID0gMC4wOwotCi0JCWlmICh0b3RhbCkKLQkJCXBlcmNlbnQgPSBoLT5zdGF0LnBlcmlvZCAqIDEwMC4wIC8gdG90YWw7CisJCWZsb2F0IHBlcmNlbnQgPSBoaXN0X2VudHJ5X19nZXRfcGVyY2VudF9saW1pdChoKTsKIAogCQlpZiAoIWgtPmZpbHRlcmVkICYmIHBlcmNlbnQgPj0gbWluX3BjbnQpCiAJCQlyZXR1cm4gbmQ7CkBAIC04NjMsMTQgKzg3NCwxNCBAQAogCXN3aXRjaCAod2hlbmNlKSB7CiAJY2FzZSBTRUVLX1NFVDoKIAkJbmQgPSBoaXN0c19fZmlsdGVyX2VudHJpZXMocmJfZmlyc3QoYnJvd3Nlci0+ZW50cmllcyksCi0JCQkJCSAgIGhiLT5oaXN0cywgaGItPm1pbl9wY250KTsKKwkJCQkJICAgaGItPm1pbl9wY250KTsKIAkJYnJlYWs7CiAJY2FzZSBTRUVLX0NVUjoKIAkJbmQgPSBicm93c2VyLT50b3A7CiAJCWdvdG8gZG9fb2Zmc2V0OwogCWNhc2UgU0VFS19FTkQ6CiAJCW5kID0gaGlzdHNfX2ZpbHRlcl9wcmV2X2VudHJpZXMocmJfbGFzdChicm93c2VyLT5lbnRyaWVzKSwKLQkJCQkJCWhiLT5oaXN0cywgaGItPm1pbl9wY250KTsKKwkJCQkJCWhiLT5taW5fcGNudCk7CiAJCWZpcnN0ID0gZmFsc2U7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC05MTMsOCArOTI0LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJbmQgPSBoaXN0c19fZmlsdGVyX2VudHJpZXMocmJfbmV4dChuZCksIGhiLT5oaXN0cywKLQkJCQkJCSAgIGhiLT5taW5fcGNudCk7CisJCQluZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhyYl9uZXh0KG5kKSwgaGItPm1pbl9wY250KTsKIAkJCWlmIChuZCA9PSBOVUxMKQogCQkJCWJyZWFrOwogCQkJLS1vZmZzZXQ7CkBAIC05NDcsNyArOTU3LDcgQEAKIAkJCQl9CiAJCQl9CiAKLQkJCW5kID0gaGlzdHNfX2ZpbHRlcl9wcmV2X2VudHJpZXMocmJfcHJldihuZCksIGhiLT5oaXN0cywKKwkJCW5kID0gaGlzdHNfX2ZpbHRlcl9wcmV2X2VudHJpZXMocmJfcHJldihuZCksCiAJCQkJCQkJaGItPm1pbl9wY250KTsKIAkJCWlmIChuZCA9PSBOVUxMKQogCQkJCWJyZWFrOwpAQCAtMTEyNiw3ICsxMTM2LDYgQEAKIHN0YXRpYyBpbnQgaGlzdF9icm93c2VyX19mcHJpbnRmKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmJyb3dzZXIsIEZJTEUgKmZwKQogewogCXN0cnVjdCByYl9ub2RlICpuZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhyYl9maXJzdChicm93c2VyLT5iLmVudHJpZXMpLAotCQkJCQkJICAgYnJvd3Nlci0+aGlzdHMsCiAJCQkJCQkgICBicm93c2VyLT5taW5fcGNudCk7CiAJaW50IHByaW50ZWQgPSAwOwogCkBAIC0xMTM0LDggKzExNDMsNyBAQAogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CiAKIAkJcHJpbnRlZCArPSBoaXN0X2Jyb3dzZXJfX2ZwcmludGZfZW50cnkoYnJvd3NlciwgaCwgZnApOwotCQluZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhyYl9uZXh0KG5kKSwgYnJvd3Nlci0+aGlzdHMsCi0JCQkJCSAgIGJyb3dzZXItPm1pbl9wY250KTsKKwkJbmQgPSBoaXN0c19fZmlsdGVyX2VudHJpZXMocmJfbmV4dChuZCksIGJyb3dzZXItPm1pbl9wY250KTsKIAl9CiAKIAlyZXR1cm4gcHJpbnRlZDsKQEAgLTEzNzIsOCArMTM4MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl3aGlsZSAoKG5kID0gaGlzdHNfX2ZpbHRlcl9lbnRyaWVzKG5kLCBoYi0+aGlzdHMsCi0JCQkJCSAgIGhiLT5taW5fcGNudCkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKG5kID0gaGlzdHNfX2ZpbHRlcl9lbnRyaWVzKG5kLCBoYi0+bWluX3BjbnQpKSAhPSBOVUxMKSB7CiAJCW5yX2VudHJpZXMrKzsKIAkJbmQgPSByYl9uZXh0KG5kKTsKIAl9CkBAIC0xNjk5LDE0ICsxNzA2LDE0IEBACiB6b29tX291dF9kc286CiAJCQkJdWlfaGVscGxpbmVfX3BvcCgpOwogCQkJCWJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyID0gTlVMTDsKLQkJCQlzb3J0X2Rzby5lbGlkZSA9IGZhbHNlOworCQkJCXBlcmZfaHBwX19zZXRfZWxpZGUoSElTVENfRFNPLCBmYWxzZSk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChkc28gPT0gTlVMTCkKIAkJCQkJY29udGludWU7CiAJCQkJdWlfaGVscGxpbmVfX2ZwdXNoKCJUbyB6b29tIG91dCBwcmVzcyA8LSBvciAtPiArIFwiWm9vbSBvdXQgb2YgJXMgRFNPXCIiLAogCQkJCQkJICAgZHNvLT5rZXJuZWwgPyAidGhlIEtlcm5lbCIgOiBkc28tPnNob3J0X25hbWUpOwogCQkJCWJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyID0gZHNvOwotCQkJCXNvcnRfZHNvLmVsaWRlID0gdHJ1ZTsKKwkJCQlwZXJmX2hwcF9fc2V0X2VsaWRlKEhJU1RDX0RTTywgdHJ1ZSk7CiAJCQkJcHN0YWNrX19wdXNoKGZzdGFjaywgJmJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyKTsKIAkJCX0KIAkJCWhpc3RzX19maWx0ZXJfYnlfZHNvKGhpc3RzKTsKQEAgLTE3MTgsMTMgKzE3MjUsMTMgQEAKIHpvb21fb3V0X3RocmVhZDoKIAkJCQl1aV9oZWxwbGluZV9fcG9wKCk7CiAJCQkJYnJvd3Nlci0+aGlzdHMtPnRocmVhZF9maWx0ZXIgPSBOVUxMOwotCQkJCXNvcnRfdGhyZWFkLmVsaWRlID0gZmFsc2U7CisJCQkJcGVyZl9ocHBfX3NldF9lbGlkZShISVNUQ19USFJFQUQsIGZhbHNlKTsKIAkJCX0gZWxzZSB7CiAJCQkJdWlfaGVscGxpbmVfX2ZwdXNoKCJUbyB6b29tIG91dCBwcmVzcyA8LSBvciAtPiArIFwiWm9vbSBvdXQgb2YgJXMoJWQpIHRocmVhZFwiIiwKIAkJCQkJCSAgIHRocmVhZC0+Y29tbV9zZXQgPyB0aHJlYWRfX2NvbW1fc3RyKHRocmVhZCkgOiAiIiwKIAkJCQkJCSAgIHRocmVhZC0+dGlkKTsKIAkJCQlicm93c2VyLT5oaXN0cy0+dGhyZWFkX2ZpbHRlciA9IHRocmVhZDsKLQkJCQlzb3J0X3RocmVhZC5lbGlkZSA9IHRydWU7CisJCQkJcGVyZl9ocHBfX3NldF9lbGlkZShISVNUQ19USFJFQUQsIGZhbHNlKTsKIAkJCQlwc3RhY2tfX3B1c2goZnN0YWNrLCAmYnJvd3Nlci0+aGlzdHMtPnRocmVhZF9maWx0ZXIpOwogCQkJfQogCQkJaGlzdHNfX2ZpbHRlcl9ieV90aHJlYWQoaGlzdHMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYyBiL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKaW5kZXggOWQ5MDY4My4uNmNhNjBlNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCkBAIC00NywxMSArNDcsMjYgQEAKIAkJCSAgX19wZXJjZW50X2NvbG9yX3NucHJpbnRmLCB0cnVlKTsJCQlcCiB9CiAKKyNkZWZpbmUgX19IUFBfQ09MT1JfQUNDX1BFUkNFTlRfRk4oX3R5cGUsIF9maWVsZCkJCQkJXAorc3RhdGljIHU2NCBoZV9nZXRfYWNjXyMjX2ZpZWxkKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCQkJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIGhlLT5zdGF0X2FjYy0+X2ZpZWxkOwkJCQkJCVwKK30JCQkJCQkJCQkJXAorCQkJCQkJCQkJCVwKK3N0YXRpYyBpbnQgcGVyZl9ndGtfX2hwcF9jb2xvcl8jI190eXBlKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCBfX21heWJlX3VudXNlZCwJXAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwJCQlcCisJCQkJICAgICAgIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gX19ocHBfX2ZtdF9hY2MoaHBwLCBoZSwgaGVfZ2V0X2FjY18jI19maWVsZCwgIiAlNi4yZiUlIiwJCVwKKwkJCSAgICAgIF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZiwgdHJ1ZSk7CQkJXAorfQorCiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkLCBwZXJpb2QpCiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3N5cywgcGVyaW9kX3N5cykKIF9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfdXMsIHBlcmlvZF91cykKIF9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfZ3Vlc3Rfc3lzLCBwZXJpb2RfZ3Vlc3Rfc3lzKQogX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9ndWVzdF91cywgcGVyaW9kX2d1ZXN0X3VzKQorX19IUFBfQ09MT1JfQUNDX1BFUkNFTlRfRk4ob3ZlcmhlYWRfYWNjLCBwZXJpb2QpCiAKICN1bmRlZiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOCiAKQEAgLTY4LDYgKzgzLDggQEAKIAkJCQlwZXJmX2d0a19faHBwX2NvbG9yX292ZXJoZWFkX2d1ZXN0X3N5czsKIAlwZXJmX2hwcF9fZm9ybWF0W1BFUkZfSFBQX19PVkVSSEVBRF9HVUVTVF9VU10uY29sb3IgPQogCQkJCXBlcmZfZ3RrX19ocHBfY29sb3Jfb3ZlcmhlYWRfZ3Vlc3RfdXM7CisJcGVyZl9ocHBfX2Zvcm1hdFtQRVJGX0hQUF9fT1ZFUkhFQURfQUNDXS5jb2xvciA9CisJCQkJcGVyZl9ndGtfX2hwcF9jb2xvcl9vdmVyaGVhZF9hY2M7CiB9CiAKIHN0YXRpYyB2b2lkIGNhbGxjaGFpbl9saXN0X19zeW1fbmFtZShzdHJ1Y3QgY2FsbGNoYWluX2xpc3QgKmNsLApAQCAtMTgxLDYgKzE5OCwxMyBAQAogCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCkpCiAJCQljb250aW51ZTsKIAorCQkvKgorCQkgKiBYWFggbm8gd2F5IHRvIGRldGVybWluZSB3aGVyZSBzeW1jb2wgY29sdW1uIGlzLi4KKwkJICogICAgIEp1c3QgdXNlIGxhc3QgY29sdW1uIGZvciBub3cuCisJCSAqLworCQlpZiAocGVyZl9ocHBfX2lzX3NvcnRfZW50cnkoZm10KSkKKwkJCXN5bV9jb2wgPSBjb2xfaWR4OworCiAJCWZtdC0+aGVhZGVyKGZtdCwgJmhwcCwgaGlzdHNfdG9fZXZzZWwoaGlzdHMpKTsKIAogCQlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVcodmlldyksCkBAIC0yMDksMTQgKzIzMywxMiBAQAogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CiAJCUd0a1RyZWVJdGVyIGl0ZXI7CiAJCXU2NCB0b3RhbCA9IGhpc3RzX190b3RhbF9wZXJpb2QoaC0+aGlzdHMpOwotCQlmbG9hdCBwZXJjZW50ID0gMC4wOworCQlmbG9hdCBwZXJjZW50OwogCiAJCWlmIChoLT5maWx0ZXJlZCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh0b3RhbCkKLQkJCXBlcmNlbnQgPSBoLT5zdGF0LnBlcmlvZCAqIDEwMC4wIC8gdG90YWw7Ci0KKwkJcGVyY2VudCA9IGhpc3RfZW50cnlfX2dldF9wZXJjZW50X2xpbWl0KGgpOwogCQlpZiAocGVyY2VudCA8IG1pbl9wY250KQogCQkJY29udGludWU7CiAKQEAgLTIzOCw3ICsyNjAsOCBAQAogCiAJCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluICYmIHNvcnRfX2hhc19zeW0pIHsKIAkJCWlmIChjYWxsY2hhaW5fcGFyYW0ubW9kZSA9PSBDSEFJTl9HUkFQSF9SRUwpCi0JCQkJdG90YWwgPSBoLT5zdGF0LnBlcmlvZDsKKwkJCQl0b3RhbCA9IHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA/CisJCQkJCWgtPnN0YXRfYWNjLT5wZXJpb2QgOiBoLT5zdGF0LnBlcmlvZDsKIAogCQkJcGVyZl9ndGtfX2FkZF9jYWxsY2hhaW4oJmgtPnNvcnRlZF9jaGFpbiwgc3RvcmUsICZpdGVyLAogCQkJCQkJc3ltX2NvbCwgdG90YWwpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9oaXN0LmMgYi90b29scy9wZXJmL3VpL2hpc3QuYwppbmRleCA0NDg0ZjViLi40OThhZGIyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL2hpc3QuYwpAQCAtMTA0LDYgKzEwNCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBfX2hwcF9fZm10X2FjYyhzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAorCQkgICBocHBfZmllbGRfZm4gZ2V0X2ZpZWxkLCBjb25zdCBjaGFyICpmbXQsCisJCSAgIGhwcF9zbnByaW50X2ZuIHByaW50X2ZuLCBib29sIGZtdF9wZXJjZW50KQoreworCWlmICghc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCXJldHVybiBzbnByaW50ZihocHAtPmJ1ZiwgaHBwLT5zaXplLCAiJSpzIiwKKwkJCQlmbXRfcGVyY2VudCA/IDggOiAxMiwgIk4vQSIpOworCX0KKworCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIGdldF9maWVsZCwgZm10LCBwcmludF9mbiwgZm10X3BlcmNlbnQpOworfQorCiBzdGF0aWMgaW50IGZpZWxkX2NtcCh1NjQgZmllbGRfYSwgdTY0IGZpZWxkX2IpCiB7CiAJaWYgKGZpZWxkX2EgPiBmaWVsZF9iKQpAQCAtMTYwLDYgKzE3MiwyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgX19ocHBfX3NvcnRfYWNjKHN0cnVjdCBoaXN0X2VudHJ5ICphLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqYiwKKwkJCSAgIGhwcF9maWVsZF9mbiBnZXRfZmllbGQpCit7CisJczY0IHJldCA9IDA7CisKKwlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCS8qCisJCSAqIFB1dCBjYWxsZXIgYWJvdmUgY2FsbGVlIHdoZW4gdGhleSBoYXZlIGVxdWFsIHBlcmlvZC4KKwkJICovCisJCXJldCA9IGZpZWxkX2NtcChnZXRfZmllbGQoYSksIGdldF9maWVsZChiKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGItPmNhbGxjaGFpbi0+bWF4X2RlcHRoIC0gYS0+Y2FsbGNoYWluLT5tYXhfZGVwdGg7CisJfQorCXJldHVybiByZXQ7Cit9CisKICNkZWZpbmUgX19IUFBfSEVBREVSX0ZOKF90eXBlLCBfc3RyLCBfbWluX3dpZHRoLCBfdW5pdF93aWR0aCkgCQlcCiBzdGF0aWMgaW50IGhwcF9faGVhZGVyXyMjX3R5cGUoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10IF9fbWF5YmVfdW51c2VkLAlcCiAJCQkgICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXApAQCAtMjQyLDYgKzI3MiwzNCBAQAogCXJldHVybiBfX2hwcF9fc29ydChhLCBiLCBoZV9nZXRfIyNfZmllbGQpOwkJCQlcCiB9CiAKKyNkZWZpbmUgX19IUFBfQ09MT1JfQUNDX1BFUkNFTlRfRk4oX3R5cGUsIF9maWVsZCkJCQkJXAorc3RhdGljIHU2NCBoZV9nZXRfYWNjXyMjX2ZpZWxkKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCQkJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIGhlLT5zdGF0X2FjYy0+X2ZpZWxkOwkJCQkJCVwKK30JCQkJCQkJCQkJXAorCQkJCQkJCQkJCVwKK3N0YXRpYyBpbnQgaHBwX19jb2xvcl8jI190eXBlKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCBfX21heWJlX3VudXNlZCwJCVwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpIAlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gX19ocHBfX2ZtdF9hY2MoaHBwLCBoZSwgaGVfZ2V0X2FjY18jI19maWVsZCwgIiAlNi4yZiUlIiwJCVwKKwkJCSAgICAgIGhwcF9jb2xvcl9zY25wcmludGYsIHRydWUpOwkJCVwKK30KKworI2RlZmluZSBfX0hQUF9FTlRSWV9BQ0NfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQlcCitzdGF0aWMgaW50IGhwcF9fZW50cnlfIyNfdHlwZShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpfZm10IF9fbWF5YmVfdW51c2VkLAkJXAorCQkJICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkgCVwKK3sJCQkJCQkJCQkJXAorCWNvbnN0IGNoYXIgKmZtdCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcCA/ICIgJS4yZiIgOiAiICU2LjJmJSUiOwkJXAorCXJldHVybiBfX2hwcF9fZm10X2FjYyhocHAsIGhlLCBoZV9nZXRfYWNjXyMjX2ZpZWxkLCBmbXQsCQlcCisJCQkgICAgICBocHBfZW50cnlfc2NucHJpbnRmLCB0cnVlKTsJCQlcCit9CisKKyNkZWZpbmUgX19IUFBfU09SVF9BQ0NfRk4oX3R5cGUsIF9maWVsZCkJCQkJCVwKK3N0YXRpYyBpbnQ2NF90IGhwcF9fc29ydF8jI190eXBlKHN0cnVjdCBoaXN0X2VudHJ5ICphLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqYikJXAorewkJCQkJCQkJCQlcCisJcmV0dXJuIF9faHBwX19zb3J0X2FjYyhhLCBiLCBoZV9nZXRfYWNjXyMjX2ZpZWxkKTsJCQlcCit9CisKICNkZWZpbmUgX19IUFBfRU5UUllfUkFXX0ZOKF90eXBlLCBfZmllbGQpCQkJCQlcCiBzdGF0aWMgdTY0IGhlX2dldF9yYXdfIyNfZmllbGQoc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTI3MCwxOCArMzI4LDI3IEBACiBfX0hQUF9FTlRSWV9QRVJDRU5UX0ZOKF90eXBlLCBfZmllbGQpCQkJCQlcCiBfX0hQUF9TT1JUX0ZOKF90eXBlLCBfZmllbGQpCiAKKyNkZWZpbmUgSFBQX1BFUkNFTlRfQUNDX0ZOUyhfdHlwZSwgX3N0ciwgX2ZpZWxkLCBfbWluX3dpZHRoLCBfdW5pdF93aWR0aClcCitfX0hQUF9IRUFERVJfRk4oX3R5cGUsIF9zdHIsIF9taW5fd2lkdGgsIF91bml0X3dpZHRoKQkJCVwKK19fSFBQX1dJRFRIX0ZOKF90eXBlLCBfbWluX3dpZHRoLCBfdW5pdF93aWR0aCkJCQkJXAorX19IUFBfQ09MT1JfQUNDX1BFUkNFTlRfRk4oX3R5cGUsIF9maWVsZCkJCQkJXAorX19IUFBfRU5UUllfQUNDX1BFUkNFTlRfRk4oX3R5cGUsIF9maWVsZCkJCQkJXAorX19IUFBfU09SVF9BQ0NfRk4oX3R5cGUsIF9maWVsZCkKKwogI2RlZmluZSBIUFBfUkFXX0ZOUyhfdHlwZSwgX3N0ciwgX2ZpZWxkLCBfbWluX3dpZHRoLCBfdW5pdF93aWR0aCkJXAogX19IUFBfSEVBREVSX0ZOKF90eXBlLCBfc3RyLCBfbWluX3dpZHRoLCBfdW5pdF93aWR0aCkJCQlcCiBfX0hQUF9XSURUSF9GTihfdHlwZSwgX21pbl93aWR0aCwgX3VuaXRfd2lkdGgpCQkJCVwKIF9fSFBQX0VOVFJZX1JBV19GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXAogX19IUFBfU09SVF9SQVdfRk4oX3R5cGUsIF9maWVsZCkKIAorX19IUFBfSEVBREVSX0ZOKG92ZXJoZWFkX3NlbGYsICJTZWxmIiwgOCwgOCkKIAogSFBQX1BFUkNFTlRfRk5TKG92ZXJoZWFkLCAiT3ZlcmhlYWQiLCBwZXJpb2QsIDgsIDgpCiBIUFBfUEVSQ0VOVF9GTlMob3ZlcmhlYWRfc3lzLCAic3lzIiwgcGVyaW9kX3N5cywgOCwgOCkKIEhQUF9QRVJDRU5UX0ZOUyhvdmVyaGVhZF91cywgInVzciIsIHBlcmlvZF91cywgOCwgOCkKIEhQUF9QRVJDRU5UX0ZOUyhvdmVyaGVhZF9ndWVzdF9zeXMsICJndWVzdCBzeXMiLCBwZXJpb2RfZ3Vlc3Rfc3lzLCA5LCA4KQogSFBQX1BFUkNFTlRfRk5TKG92ZXJoZWFkX2d1ZXN0X3VzLCAiZ3Vlc3QgdXNyIiwgcGVyaW9kX2d1ZXN0X3VzLCA5LCA4KQorSFBQX1BFUkNFTlRfQUNDX0ZOUyhvdmVyaGVhZF9hY2MsICJDaGlsZHJlbiIsIHBlcmlvZCwgOCwgOCkKIAogSFBQX1JBV19GTlMoc2FtcGxlcywgIlNhbXBsZXMiLCBucl9ldmVudHMsIDEyLCAxMikKIEhQUF9SQVdfRk5TKHBlcmlvZCwgIlBlcmlvZCIsIHBlcmlvZCwgMTIsIDEyKQpAQCAtMzAzLDYgKzM3MCwxNyBAQAogCQkuc29ydAk9IGhwcF9fc29ydF8gIyMgX25hbWUsCQlcCiAJfQogCisjZGVmaW5lIEhQUF9fQ09MT1JfQUNDX1BSSU5UX0ZOUyhfbmFtZSkJCQlcCisJewkJCQkJCVwKKwkJLmhlYWRlcgk9IGhwcF9faGVhZGVyXyAjIyBfbmFtZSwJXAorCQkud2lkdGgJPSBocHBfX3dpZHRoXyAjIyBfbmFtZSwJCVwKKwkJLmNvbG9yCT0gaHBwX19jb2xvcl8gIyMgX25hbWUsCQlcCisJCS5lbnRyeQk9IGhwcF9fZW50cnlfICMjIF9uYW1lLAkJXAorCQkuY21wCT0gaHBwX19ub3BfY21wLAkJCVwKKwkJLmNvbGxhcHNlID0gaHBwX19ub3BfY21wLAkJXAorCQkuc29ydAk9IGhwcF9fc29ydF8gIyMgX25hbWUsCQlcCisJfQorCiAjZGVmaW5lIEhQUF9fUFJJTlRfRk5TKF9uYW1lKQkJCQlcCiAJewkJCQkJCVwKIAkJLmhlYWRlcgk9IGhwcF9faGVhZGVyXyAjIyBfbmFtZSwJXApAQCAtMzE5LDYgKzM5Nyw3IEBACiAJSFBQX19DT0xPUl9QUklOVF9GTlMob3ZlcmhlYWRfdXMpLAogCUhQUF9fQ09MT1JfUFJJTlRfRk5TKG92ZXJoZWFkX2d1ZXN0X3N5cyksCiAJSFBQX19DT0xPUl9QUklOVF9GTlMob3ZlcmhlYWRfZ3Vlc3RfdXMpLAorCUhQUF9fQ09MT1JfQUNDX1BSSU5UX0ZOUyhvdmVyaGVhZF9hY2MpLAogCUhQUF9fUFJJTlRfRk5TKHNhbXBsZXMpLAogCUhQUF9fUFJJTlRfRk5TKHBlcmlvZCkKIH07CkBAIC0zMjgsMTYgKzQwNywyMyBAQAogCiAKICN1bmRlZiBIUFBfX0NPTE9SX1BSSU5UX0ZOUworI3VuZGVmIEhQUF9fQ09MT1JfQUNDX1BSSU5UX0ZOUwogI3VuZGVmIEhQUF9fUFJJTlRfRk5TCiAKICN1bmRlZiBIUFBfUEVSQ0VOVF9GTlMKKyN1bmRlZiBIUFBfUEVSQ0VOVF9BQ0NfRk5TCiAjdW5kZWYgSFBQX1JBV19GTlMKIAogI3VuZGVmIF9fSFBQX0hFQURFUl9GTgogI3VuZGVmIF9fSFBQX1dJRFRIX0ZOCiAjdW5kZWYgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTgogI3VuZGVmIF9fSFBQX0VOVFJZX1BFUkNFTlRfRk4KKyN1bmRlZiBfX0hQUF9DT0xPUl9BQ0NfUEVSQ0VOVF9GTgorI3VuZGVmIF9fSFBQX0VOVFJZX0FDQ19QRVJDRU5UX0ZOCiAjdW5kZWYgX19IUFBfRU5UUllfUkFXX0ZOCisjdW5kZWYgX19IUFBfU09SVF9GTgorI3VuZGVmIF9fSFBQX1NPUlRfQUNDX0ZOCisjdW5kZWYgX19IUFBfU09SVF9SQVdfRk4KIAogCiB2b2lkIHBlcmZfaHBwX19pbml0KHZvaWQpCkBAIC0zNjEsNiArNDQ3LDEzIEBACiAJaWYgKGZpZWxkX29yZGVyKQogCQlyZXR1cm47CiAKKwlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCXBlcmZfaHBwX19jb2x1bW5fZW5hYmxlKFBFUkZfSFBQX19PVkVSSEVBRF9BQ0MpOworCisJCXBlcmZfaHBwX19mb3JtYXRbUEVSRl9IUFBfX09WRVJIRUFEXS5oZWFkZXIgPQorCQkJCQkJaHBwX19oZWFkZXJfb3ZlcmhlYWRfc2VsZjsKKwl9CisKIAlwZXJmX2hwcF9fY29sdW1uX2VuYWJsZShQRVJGX0hQUF9fT1ZFUkhFQUQpOwogCiAJaWYgKHN5bWJvbF9jb25mLnNob3dfY3B1X3V0aWxpemF0aW9uKSB7CkBAIC0zODMsNiArNDc2LDEyIEBACiAJbGlzdCA9ICZwZXJmX2hwcF9fZm9ybWF0W1BFUkZfSFBQX19PVkVSSEVBRF0uc29ydF9saXN0OwogCWlmIChsaXN0X2VtcHR5KGxpc3QpKQogCQlsaXN0X2FkZChsaXN0LCAmcGVyZl9ocHBfX3NvcnRfbGlzdCk7CisKKwlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKSB7CisJCWxpc3QgPSAmcGVyZl9ocHBfX2Zvcm1hdFtQRVJGX0hQUF9fT1ZFUkhFQURfQUNDXS5zb3J0X2xpc3Q7CisJCWlmIChsaXN0X2VtcHR5KGxpc3QpKQorCQkJbGlzdF9hZGQobGlzdCwgJnBlcmZfaHBwX19zb3J0X2xpc3QpOworCX0KIH0KIAogdm9pZCBwZXJmX2hwcF9fY29sdW1uX3JlZ2lzdGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCkKQEAgLTM5MCw2ICs0ODksMTEgQEAKIAlsaXN0X2FkZF90YWlsKCZmb3JtYXQtPmxpc3QsICZwZXJmX2hwcF9fbGlzdCk7CiB9CiAKK3ZvaWQgcGVyZl9ocHBfX2NvbHVtbl91bnJlZ2lzdGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCkKK3sKKwlsaXN0X2RlbCgmZm9ybWF0LT5saXN0KTsKK30KKwogdm9pZCBwZXJmX2hwcF9fcmVnaXN0ZXJfc29ydF9maWVsZChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpCiB7CiAJbGlzdF9hZGRfdGFpbCgmZm9ybWF0LT5zb3J0X2xpc3QsICZwZXJmX2hwcF9fc29ydF9saXN0KTsKQEAgLTQwMSw2ICs1MDUsMjEgQEAKIAlwZXJmX2hwcF9fY29sdW1uX3JlZ2lzdGVyKCZwZXJmX2hwcF9fZm9ybWF0W2NvbF0pOwogfQogCit2b2lkIHBlcmZfaHBwX19jb2x1bW5fZGlzYWJsZSh1bnNpZ25lZCBjb2wpCit7CisJQlVHX09OKGNvbCA+PSBQRVJGX0hQUF9fTUFYX0lOREVYKTsKKwlwZXJmX2hwcF9fY29sdW1uX3VucmVnaXN0ZXIoJnBlcmZfaHBwX19mb3JtYXRbY29sXSk7Cit9CisKK3ZvaWQgcGVyZl9ocHBfX2NhbmNlbF9jdW11bGF0ZSh2b2lkKQoreworCWlmIChmaWVsZF9vcmRlcikKKwkJcmV0dXJuOworCisJcGVyZl9ocHBfX2NvbHVtbl9kaXNhYmxlKFBFUkZfSFBQX19PVkVSSEVBRF9BQ0MpOworCXBlcmZfaHBwX19mb3JtYXRbUEVSRl9IUFBfX09WRVJIRUFEXS5oZWFkZXIgPSBocHBfX2hlYWRlcl9vdmVyaGVhZDsKK30KKwogdm9pZCBwZXJmX2hwcF9fc2V0dXBfb3V0cHV0X2ZpZWxkKHZvaWQpCiB7CiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwppbmRleCA5ZjU3OTkxLi45MDEyMmFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwpAQCAtMjcxLDcgKzI3MSw5IEBACiB7CiAJc3dpdGNoIChjYWxsY2hhaW5fcGFyYW0ubW9kZSkgewogCWNhc2UgQ0hBSU5fR1JBUEhfUkVMOgotCQlyZXR1cm4gY2FsbGNoYWluX19mcHJpbnRmX2dyYXBoKGZwLCAmaGUtPnNvcnRlZF9jaGFpbiwgaGUtPnN0YXQucGVyaW9kLAorCQlyZXR1cm4gY2FsbGNoYWluX19mcHJpbnRmX2dyYXBoKGZwLCAmaGUtPnNvcnRlZF9jaGFpbiwKKwkJCQkJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA/CisJCQkJCQloZS0+c3RhdF9hY2MtPnBlcmlvZCA6IGhlLT5zdGF0LnBlcmlvZCwKIAkJCQkJCWxlZnRfbWFyZ2luKTsKIAkJYnJlYWs7CiAJY2FzZSBDSEFJTl9HUkFQSF9BQlM6CkBAIC00NjEsMTIgKzQ2MywxMiBAQAogCiAJZm9yIChuZCA9IHJiX2ZpcnN0KCZoaXN0cy0+ZW50cmllcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKLQkJZmxvYXQgcGVyY2VudCA9IGgtPnN0YXQucGVyaW9kICogMTAwLjAgLwotCQkJCQloaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOworCQlmbG9hdCBwZXJjZW50OwogCiAJCWlmIChoLT5maWx0ZXJlZCkKIAkJCWNvbnRpbnVlOwogCisJCXBlcmNlbnQgPSBoaXN0X2VudHJ5X19nZXRfcGVyY2VudF9saW1pdChoKTsKIAkJaWYgKHBlcmNlbnQgPCBtaW5fcGNudCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmMgYi90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmMKaW5kZXggOWE0MjM4Mi4uNDhiNmQzZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uYwpAQCAtNjE2LDcgKzYxNiw4IEBACiAJaWYgKHNhbXBsZS0+Y2FsbGNoYWluID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4gfHwgc29ydF9faGFzX3BhcmVudCkgeworCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluIHx8IHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiB8fAorCSAgICBzb3J0X19oYXNfcGFyZW50KSB7CiAJCXJldHVybiBtYWNoaW5lX19yZXNvbHZlX2NhbGxjaGFpbihhbC0+bWFjaGluZSwgZXZzZWwsIGFsLT50aHJlYWQsCiAJCQkJCQkgIHNhbXBsZSwgcGFyZW50LCBhbCwgbWF4X3N0YWNrKTsKIAl9CkBAIC02MjksMyArNjMwLDQ1IEBACiAJCXJldHVybiAwOwogCXJldHVybiBjYWxsY2hhaW5fYXBwZW5kKGhlLT5jYWxsY2hhaW4sICZjYWxsY2hhaW5fY3Vyc29yLCBzYW1wbGUtPnBlcmlvZCk7CiB9CisKK2ludCBmaWxsX2NhbGxjaGFpbl9pbmZvKHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwgc3RydWN0IGNhbGxjaGFpbl9jdXJzb3Jfbm9kZSAqbm9kZSwKKwkJCWJvb2wgaGlkZV91bnJlc29sdmVkKQoreworCWFsLT5tYXAgPSBub2RlLT5tYXA7CisJYWwtPnN5bSA9IG5vZGUtPnN5bTsKKwlpZiAobm9kZS0+bWFwKQorCQlhbC0+YWRkciA9IG5vZGUtPm1hcC0+bWFwX2lwKG5vZGUtPm1hcCwgbm9kZS0+aXApOworCWVsc2UKKwkJYWwtPmFkZHIgPSBub2RlLT5pcDsKKworCWlmIChhbC0+c3ltID09IE5VTEwpIHsKKwkJaWYgKGhpZGVfdW5yZXNvbHZlZCkKKwkJCXJldHVybiAwOworCQlpZiAoYWwtPm1hcCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGFsLT5tYXAtPmdyb3VwcyA9PSAmYWwtPm1hY2hpbmUtPmttYXBzKSB7CisJCWlmIChtYWNoaW5lX19pc19ob3N0KGFsLT5tYWNoaW5lKSkgeworCQkJYWwtPmNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTDsKKwkJCWFsLT5sZXZlbCA9ICdrJzsKKwkJfSBlbHNlIHsKKwkJCWFsLT5jcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUw7CisJCQlhbC0+bGV2ZWwgPSAnZyc7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWFjaGluZV9faXNfaG9zdChhbC0+bWFjaGluZSkpIHsKKwkJCWFsLT5jcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSOworCQkJYWwtPmxldmVsID0gJy4nOworCQl9IGVsc2UgaWYgKHBlcmZfZ3Vlc3QpIHsKKwkJCWFsLT5jcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSOworCQkJYWwtPmxldmVsID0gJ3UnOworCQl9IGVsc2UgeworCQkJYWwtPmNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX0hZUEVSVklTT1I7CisJCQlhbC0+bGV2ZWwgPSAnSCc7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaAppbmRleCBiZGUyYjBjLi44Zjg0NDIzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oCkBAIC0xNjIsNyArMTYyLDE4IEBACiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCSAgICAgIGludCBtYXhfc3RhY2spOwogaW50IGhpc3RfZW50cnlfX2FwcGVuZF9jYWxsY2hhaW4oc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSk7CitpbnQgZmlsbF9jYWxsY2hhaW5faW5mbyhzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHN0cnVjdCBjYWxsY2hhaW5fY3Vyc29yX25vZGUgKm5vZGUsCisJCQlib29sIGhpZGVfdW5yZXNvbHZlZCk7CiAKIGV4dGVybiBjb25zdCBjaGFyIHJlY29yZF9jYWxsY2hhaW5faGVscFtdOwogaW50IHBhcnNlX2NhbGxjaGFpbl9yZXBvcnRfb3B0KGNvbnN0IGNoYXIgKmFyZyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxsY2hhaW5fY3Vyc29yX3NuYXBzaG90KHN0cnVjdCBjYWxsY2hhaW5fY3Vyc29yICpkZXN0LAorCQkJCQkgICAgIHN0cnVjdCBjYWxsY2hhaW5fY3Vyc29yICpzcmMpCit7CisJKmRlc3QgPSAqc3JjOworCisJZGVzdC0+Zmlyc3QgPSBzcmMtPmN1cnI7CisJZGVzdC0+bnIgLT0gc3JjLT5wb3M7Cit9CiAjZW5kaWYJLyogX19QRVJGX0NBTExDSEFJTl9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwppbmRleCBiMjYyYjQ0Li41YTBhNGIyYyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgInNlc3Npb24uaCIKICNpbmNsdWRlICJzb3J0LmgiCiAjaW5jbHVkZSAiZXZzZWwuaCIKKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgogI2luY2x1ZGUgPG1hdGguaD4KIAogc3RhdGljIGJvb2wgaGlzdHNfX2ZpbHRlcl9lbnRyeV9ieV9kc28oc3RydWN0IGhpc3RzICpoaXN0cywKQEAgLTIzMSw2ICsyMzIsOCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWhlX3N0YXRfX2RlY2F5KCZoZS0+c3RhdCk7CisJaWYgKHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbikKKwkJaGVfc3RhdF9fZGVjYXkoaGUtPnN0YXRfYWNjKTsKIAogCWRpZmYgPSBwcmV2X3BlcmlvZCAtIGhlLT5zdGF0LnBlcmlvZDsKIApAQCAtMjc2LDE0ICsyNzksMzEgQEAKICAqIGhpc3RvZ3JhbSwgc29ydGVkIG9uIGl0ZW0sIGNvbGxlY3RzIHBlcmlvZHMKICAqLwogCi1zdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmhpc3RfZW50cnlfX25ldyhzdHJ1Y3QgaGlzdF9lbnRyeSAqdGVtcGxhdGUpCitzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmhpc3RfZW50cnlfX25ldyhzdHJ1Y3QgaGlzdF9lbnRyeSAqdGVtcGxhdGUsCisJCQkJCSAgYm9vbCBzYW1wbGVfc2VsZikKIHsKLQlzaXplX3QgY2FsbGNoYWluX3NpemUgPSBzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluID8gc2l6ZW9mKHN0cnVjdCBjYWxsY2hhaW5fcm9vdCkgOiAwOwotCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSA9IHphbGxvYyhzaXplb2YoKmhlKSArIGNhbGxjaGFpbl9zaXplKTsKKwlzaXplX3QgY2FsbGNoYWluX3NpemUgPSAwOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKworCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluIHx8IHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbikKKwkJY2FsbGNoYWluX3NpemUgPSBzaXplb2Yoc3RydWN0IGNhbGxjaGFpbl9yb290KTsKKworCWhlID0gemFsbG9jKHNpemVvZigqaGUpICsgY2FsbGNoYWluX3NpemUpOwogCiAJaWYgKGhlICE9IE5VTEwpIHsKIAkJKmhlID0gKnRlbXBsYXRlOwogCisJCWlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4pIHsKKwkJCWhlLT5zdGF0X2FjYyA9IG1hbGxvYyhzaXplb2YoaGUtPnN0YXQpKTsKKwkJCWlmIChoZS0+c3RhdF9hY2MgPT0gTlVMTCkgeworCQkJCWZyZWUoaGUpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJbWVtY3B5KGhlLT5zdGF0X2FjYywgJmhlLT5zdGF0LCBzaXplb2YoaGUtPnN0YXQpKTsKKwkJCWlmICghc2FtcGxlX3NlbGYpCisJCQkJbWVtc2V0KCZoZS0+c3RhdCwgMCwgc2l6ZW9mKGhlLT5zdGF0KSk7CisJCX0KKwogCQlpZiAoaGUtPm1zLm1hcCkKIAkJCWhlLT5tcy5tYXAtPnJlZmVyZW5jZWQgPSB0cnVlOwogCkBAIC0yOTUsNiArMzE1LDcgQEAKIAkJCSAqLwogCQkJaGUtPmJyYW5jaF9pbmZvID0gbWFsbG9jKHNpemVvZigqaGUtPmJyYW5jaF9pbmZvKSk7CiAJCQlpZiAoaGUtPmJyYW5jaF9pbmZvID09IE5VTEwpIHsKKwkJCQlmcmVlKGhlLT5zdGF0X2FjYyk7CiAJCQkJZnJlZShoZSk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CkBAIC0zMzMsNyArMzU0LDggQEAKIAogc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICphZGRfaGlzdF9lbnRyeShzdHJ1Y3QgaGlzdHMgKmhpc3RzLAogCQkJCQkgc3RydWN0IGhpc3RfZW50cnkgKmVudHJ5LAotCQkJCQkgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQorCQkJCQkgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorCQkJCQkgYm9vbCBzYW1wbGVfc2VsZikKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnA7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC0zNTcsNyArMzc5LDEwIEBACiAJCWNtcCA9IGhpc3RfZW50cnlfX2NtcChoZSwgZW50cnkpOwogCiAJCWlmICghY21wKSB7Ci0JCQloZV9zdGF0X19hZGRfcGVyaW9kKCZoZS0+c3RhdCwgcGVyaW9kLCB3ZWlnaHQpOworCQkJaWYgKHNhbXBsZV9zZWxmKQorCQkJCWhlX3N0YXRfX2FkZF9wZXJpb2QoJmhlLT5zdGF0LCBwZXJpb2QsIHdlaWdodCk7CisJCQlpZiAoc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluKQorCQkJCWhlX3N0YXRfX2FkZF9wZXJpb2QoaGUtPnN0YXRfYWNjLCBwZXJpb2QsIHdlaWdodCk7CiAKIAkJCS8qCiAJCQkgKiBUaGlzIG1lbSBpbmZvIHdhcyBhbGxvY2F0ZWQgZnJvbSBzYW1wbGVfX3Jlc29sdmVfbWVtCkBAIC0zODUsMTQgKzQxMCwxNyBAQAogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAl9CiAKLQloZSA9IGhpc3RfZW50cnlfX25ldyhlbnRyeSk7CisJaGUgPSBoaXN0X2VudHJ5X19uZXcoZW50cnksIHNhbXBsZV9zZWxmKTsKIAlpZiAoIWhlKQogCQlyZXR1cm4gTlVMTDsKIAogCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGVfaW4sIHBhcmVudCwgcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZV9pbiwgaGlzdHMtPmVudHJpZXNfaW4pOwogb3V0OgotCWhlX3N0YXRfX2FkZF9jcHVtb2RlX3BlcmlvZCgmaGUtPnN0YXQsIGFsLT5jcHVtb2RlLCBwZXJpb2QpOworCWlmIChzYW1wbGVfc2VsZikKKwkJaGVfc3RhdF9fYWRkX2NwdW1vZGVfcGVyaW9kKCZoZS0+c3RhdCwgYWwtPmNwdW1vZGUsIHBlcmlvZCk7CisJaWYgKHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbikKKwkJaGVfc3RhdF9fYWRkX2NwdW1vZGVfcGVyaW9kKGhlLT5zdGF0X2FjYywgYWwtPmNwdW1vZGUsIHBlcmlvZCk7CiAJcmV0dXJuIGhlOwogfQogCkBAIC00MDEsNyArNDI5LDggQEAKIAkJCQkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW1fcGFyZW50LAogCQkJCSAgICAgIHN0cnVjdCBicmFuY2hfaW5mbyAqYmksCiAJCQkJICAgICAgc3RydWN0IG1lbV9pbmZvICptaSwKLQkJCQkgICAgICB1NjQgcGVyaW9kLCB1NjQgd2VpZ2h0LCB1NjQgdHJhbnNhY3Rpb24pCisJCQkJICAgICAgdTY0IHBlcmlvZCwgdTY0IHdlaWdodCwgdTY0IHRyYW5zYWN0aW9uLAorCQkJCSAgICAgIGJvb2wgc2FtcGxlX3NlbGYpCiB7CiAJc3RydWN0IGhpc3RfZW50cnkgZW50cnkgPSB7CiAJCS50aHJlYWQJPSBhbC0+dGhyZWFkLApAQCAtNDI2LDcgKzQ1NSw0MjkgQEAKIAkJLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24sCiAJfTsKIAotCXJldHVybiBhZGRfaGlzdF9lbnRyeShoaXN0cywgJmVudHJ5LCBhbCk7CisJcmV0dXJuIGFkZF9oaXN0X2VudHJ5KGhpc3RzLCAmZW50cnksIGFsLCBzYW1wbGVfc2VsZik7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfbmV4dF9ub3BfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciBfX21heWJlX3VudXNlZCwKKwkJICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCBfX21heWJlX3VudXNlZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXRlcl9hZGRfbmV4dF9ub3BfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciBfX21heWJlX3VudXNlZCwKKwkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCBfX21heWJlX3VudXNlZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXRlcl9wcmVwYXJlX21lbV9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgPSBpdGVyLT5zYW1wbGU7CisJc3RydWN0IG1lbV9pbmZvICptaTsKKworCW1pID0gc2FtcGxlX19yZXNvbHZlX21lbShzYW1wbGUsIGFsKTsKKwlpZiAobWkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5wcml2ID0gbWk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfYWRkX3NpbmdsZV9tZW1fZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQoreworCXU2NCBjb3N0OworCXN0cnVjdCBtZW1faW5mbyAqbWkgPSBpdGVyLT5wcml2OworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKworCWlmIChtaSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvc3QgPSBpdGVyLT5zYW1wbGUtPndlaWdodDsKKwlpZiAoIWNvc3QpCisJCWNvc3QgPSAxOworCisJLyoKKwkgKiBtdXN0IHBhc3MgcGVyaW9kPXdlaWdodCBpbiBvcmRlciB0byBnZXQgdGhlIGNvcnJlY3QKKwkgKiBzb3J0aW5nIGZyb20gaGlzdHNfX2NvbGxhcHNlX3Jlc29ydCgpIHdoaWNoIGlzIHNvbGVseQorCSAqIGJhc2VkIG9uIHBlcmlvZHMuIFdlIHdhbnQgc29ydGluZyBiZSBkb25lIG9uIG5yX2V2ZW50cyAqIHdlaWdodAorCSAqIGFuZCB0aGlzIGlzIGluZGlyZWN0bHkgYWNoaWV2ZWQgYnkgcGFzc2luZyBwZXJpb2Q9d2VpZ2h0IGhlcmUKKwkgKiBhbmQgdGhlIGhlX3N0YXRfX2FkZF9wZXJpb2QoKSBmdW5jdGlvbi4KKwkgKi8KKwloZSA9IF9faGlzdHNfX2FkZF9lbnRyeSgmaXRlci0+ZXZzZWwtPmhpc3RzLCBhbCwgaXRlci0+cGFyZW50LCBOVUxMLCBtaSwKKwkJCQljb3N0LCBjb3N0LCAwLCB0cnVlKTsKKwlpZiAoIWhlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0ZXItPmhlID0gaGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfZmluaXNoX21lbV9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAorCQkgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwgX19tYXliZV91bnVzZWQpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gaXRlci0+ZXZzZWw7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlID0gaXRlci0+aGU7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoaGUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwloaXN0c19faW5jX25yX3NhbXBsZXMoJmV2c2VsLT5oaXN0cywgaGUtPmZpbHRlcmVkKTsKKworCWVyciA9IGhpc3RfZW50cnlfX2FwcGVuZF9jYWxsY2hhaW4oaGUsIGl0ZXItPnNhbXBsZSk7CisKK291dDoKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gZnJlZSBpdGVyLT5wcml2IChtZW1faW5mbykgaGVyZSBzaW5jZQorCSAqIHRoZSBtZW0gaW5mbyB3YXMgZWl0aGVyIGFscmVhZHkgZnJlZWQgaW4gYWRkX2hpc3RfZW50cnkoKSBvcgorCSAqIHBhc3NlZCB0byBhIG5ldyBoaXN0IGVudHJ5IGJ5IGhpc3RfZW50cnlfX25ldygpLgorCSAqLworCWl0ZXItPnByaXYgPSBOVUxMOworCisJaXRlci0+aGUgPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfcHJlcGFyZV9icmFuY2hfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQoreworCXN0cnVjdCBicmFuY2hfaW5mbyAqYmk7CisJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgPSBpdGVyLT5zYW1wbGU7CisKKwliaSA9IHNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc2FtcGxlLCBhbCk7CisJaWYgKCFiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5jdXJyID0gMDsKKwlpdGVyLT50b3RhbCA9IHNhbXBsZS0+YnJhbmNoX3N0YWNrLT5ucjsKKworCWl0ZXItPnByaXYgPSBiaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXRlcl9hZGRfc2luZ2xlX2JyYW5jaF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwgX19tYXliZV91bnVzZWQpCit7CisJLyogdG8gYXZvaWQgY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiAqLworCWl0ZXItPmhlID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpdGVyX25leHRfYnJhbmNoX2VudHJ5KHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKml0ZXIsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKK3sKKwlzdHJ1Y3QgYnJhbmNoX2luZm8gKmJpID0gaXRlci0+cHJpdjsKKwlpbnQgaSA9IGl0ZXItPmN1cnI7CisKKwlpZiAoYmkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaXRlci0+Y3VyciA+PSBpdGVyLT50b3RhbCkKKwkJcmV0dXJuIDA7CisKKwlhbC0+bWFwID0gYmlbaV0udG8ubWFwOworCWFsLT5zeW0gPSBiaVtpXS50by5zeW07CisJYWwtPmFkZHIgPSBiaVtpXS50by5hZGRyOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitpdGVyX2FkZF9uZXh0X2JyYW5jaF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCit7CisJc3RydWN0IGJyYW5jaF9pbmZvICpiaTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBpdGVyLT5ldnNlbDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUgPSBOVUxMOworCWludCBpID0gaXRlci0+Y3VycjsKKwlpbnQgZXJyID0gMDsKKworCWJpID0gaXRlci0+cHJpdjsKKworCWlmIChpdGVyLT5oaWRlX3VucmVzb2x2ZWQgJiYgIShiaVtpXS5mcm9tLnN5bSAmJiBiaVtpXS50by5zeW0pKQorCQlnb3RvIG91dDsKKworCS8qCisJICogVGhlIHJlcG9ydCBzaG93cyB0aGUgcGVyY2VudGFnZSBvZiB0b3RhbCBicmFuY2hlcyBjYXB0dXJlZAorCSAqIGFuZCBub3QgZXZlbnRzIHNhbXBsZWQuIFRodXMgd2UgdXNlIGEgcHNldWRvIHBlcmlvZCBvZiAxLgorCSAqLworCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBpdGVyLT5wYXJlbnQsICZiaVtpXSwgTlVMTCwKKwkJCQkxLCAxLCAwLCB0cnVlKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaXN0c19faW5jX25yX3NhbXBsZXMoJmV2c2VsLT5oaXN0cywgaGUtPmZpbHRlcmVkKTsKKworb3V0OgorCWl0ZXItPmhlID0gaGU7CisJaXRlci0+Y3VycisrOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfZmluaXNoX2JyYW5jaF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAorCQkJIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCBfX21heWJlX3VudXNlZCkKK3sKKwl6ZnJlZSgmaXRlci0+cHJpdik7CisJaXRlci0+aGUgPSBOVUxMOworCisJcmV0dXJuIGl0ZXItPmN1cnIgPj0gaXRlci0+dG90YWwgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfcHJlcGFyZV9ub3JtYWxfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciBfX21heWJlX3VudXNlZCwKKwkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsIF9fbWF5YmVfdW51c2VkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpdGVyX2FkZF9zaW5nbGVfbm9ybWFsX2VudHJ5KHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKml0ZXIsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBpdGVyLT5ldnNlbDsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSA9IGl0ZXItPnNhbXBsZTsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CisKKwloZSA9IF9faGlzdHNfX2FkZF9lbnRyeSgmZXZzZWwtPmhpc3RzLCBhbCwgaXRlci0+cGFyZW50LCBOVUxMLCBOVUxMLAorCQkJCXNhbXBsZS0+cGVyaW9kLCBzYW1wbGUtPndlaWdodCwKKwkJCQlzYW1wbGUtPnRyYW5zYWN0aW9uLCB0cnVlKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5oZSA9IGhlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpdGVyX2ZpbmlzaF9ub3JtYWxfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwKKwkJCSBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwgX19tYXliZV91bnVzZWQpCit7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlID0gaXRlci0+aGU7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gaXRlci0+ZXZzZWw7CisJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgPSBpdGVyLT5zYW1wbGU7CisKKwlpZiAoaGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpdGVyLT5oZSA9IE5VTEw7CisKKwloaXN0c19faW5jX25yX3NhbXBsZXMoJmV2c2VsLT5oaXN0cywgaGUtPmZpbHRlcmVkKTsKKworCXJldHVybiBoaXN0X2VudHJ5X19hcHBlbmRfY2FsbGNoYWluKGhlLCBzYW1wbGUpOworfQorCitzdGF0aWMgaW50CitpdGVyX3ByZXBhcmVfY3VtdWxhdGl2ZV9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsIF9fbWF5YmVfdW51c2VkKQoreworCXN0cnVjdCBoaXN0X2VudHJ5ICoqaGVfY2FjaGU7CisKKwljYWxsY2hhaW5fY3Vyc29yX2NvbW1pdCgmY2FsbGNoYWluX2N1cnNvcik7CisKKwkvKgorCSAqIFRoaXMgaXMgZm9yIGRldGVjdGluZyBjeWNsZXMgb3IgcmVjdXJzaW9ucyBzbyB0aGF0IHRoZXkncmUKKwkgKiBjdW11bGF0ZWQgb25seSBvbmUgdGltZSB0byBwcmV2ZW50IGVudHJpZXMgbW9yZSB0aGFuIDEwMCUKKwkgKiBvdmVyaGVhZC4KKwkgKi8KKwloZV9jYWNoZSA9IG1hbGxvYyhzaXplb2YoKmhlX2NhY2hlKSAqIChQRVJGX01BWF9TVEFDS19ERVBUSCArIDEpKTsKKwlpZiAoaGVfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5wcml2ID0gaGVfY2FjaGU7CisJaXRlci0+Y3VyciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXRlcl9hZGRfc2luZ2xlX2N1bXVsYXRpdmVfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwKKwkJCQkgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGl0ZXItPmV2c2VsOworCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlID0gaXRlci0+c2FtcGxlOworCXN0cnVjdCBoaXN0X2VudHJ5ICoqaGVfY2FjaGUgPSBpdGVyLT5wcml2OworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKwlpbnQgZXJyID0gMDsKKworCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBpdGVyLT5wYXJlbnQsIE5VTEwsIE5VTEwsCisJCQkJc2FtcGxlLT5wZXJpb2QsIHNhbXBsZS0+d2VpZ2h0LAorCQkJCXNhbXBsZS0+dHJhbnNhY3Rpb24sIHRydWUpOworCWlmIChoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0ZXItPmhlID0gaGU7CisJaGVfY2FjaGVbaXRlci0+Y3VycisrXSA9IGhlOworCisJY2FsbGNoYWluX2FwcGVuZChoZS0+Y2FsbGNoYWluLCAmY2FsbGNoYWluX2N1cnNvciwgc2FtcGxlLT5wZXJpb2QpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHJlLWluaXRpYWxpemUgdGhlIGN1cnNvciBzaW5jZSBjYWxsY2hhaW5fYXBwZW5kKCkKKwkgKiBhZHZhbmNlZCB0aGUgY3Vyc29yIHRvIHRoZSBlbmQuCisJICovCisJY2FsbGNoYWluX2N1cnNvcl9jb21taXQoJmNhbGxjaGFpbl9jdXJzb3IpOworCisJaGlzdHNfX2luY19ucl9zYW1wbGVzKCZldnNlbC0+aGlzdHMsIGhlLT5maWx0ZXJlZCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitpdGVyX25leHRfY3VtdWxhdGl2ZV9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAorCQkJICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQoreworCXN0cnVjdCBjYWxsY2hhaW5fY3Vyc29yX25vZGUgKm5vZGU7CisKKwlub2RlID0gY2FsbGNoYWluX2N1cnNvcl9jdXJyZW50KCZjYWxsY2hhaW5fY3Vyc29yKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmaWxsX2NhbGxjaGFpbl9pbmZvKGFsLCBub2RlLCBpdGVyLT5oaWRlX3VucmVzb2x2ZWQpOworfQorCitzdGF0aWMgaW50CitpdGVyX2FkZF9uZXh0X2N1bXVsYXRpdmVfZW50cnkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwKKwkJCSAgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gaXRlci0+ZXZzZWw7CisJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgPSBpdGVyLT5zYW1wbGU7CisJc3RydWN0IGhpc3RfZW50cnkgKipoZV9jYWNoZSA9IGl0ZXItPnByaXY7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCXN0cnVjdCBoaXN0X2VudHJ5IGhlX3RtcCA9IHsKKwkJLmNwdSA9IGFsLT5jcHUsCisJCS50aHJlYWQgPSBhbC0+dGhyZWFkLAorCQkuY29tbSA9IHRocmVhZF9fY29tbShhbC0+dGhyZWFkKSwKKwkJLmlwID0gYWwtPmFkZHIsCisJCS5tcyA9IHsKKwkJCS5tYXAgPSBhbC0+bWFwLAorCQkJLnN5bSA9IGFsLT5zeW0sCisJCX0sCisJCS5wYXJlbnQgPSBpdGVyLT5wYXJlbnQsCisJfTsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FsbGNoYWluX2N1cnNvciBjdXJzb3I7CisKKwljYWxsY2hhaW5fY3Vyc29yX3NuYXBzaG90KCZjdXJzb3IsICZjYWxsY2hhaW5fY3Vyc29yKTsKKworCWNhbGxjaGFpbl9jdXJzb3JfYWR2YW5jZSgmY2FsbGNoYWluX2N1cnNvcik7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlJ3MgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIGNhbGxjaGFpbi4KKwkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgaXQgaGFzIGN5Y2xlcyBvciByZWN1cnNpdmUgY2FsbHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGl0ZXItPmN1cnI7IGkrKykgeworCQlpZiAoaGlzdF9lbnRyeV9fY21wKGhlX2NhY2hlW2ldLCAmaGVfdG1wKSA9PSAwKSB7CisJCQkvKiB0byBhdm9pZCBjYWxsaW5nIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJCQlpdGVyLT5oZSA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWhlID0gX19oaXN0c19fYWRkX2VudHJ5KCZldnNlbC0+aGlzdHMsIGFsLCBpdGVyLT5wYXJlbnQsIE5VTEwsIE5VTEwsCisJCQkJc2FtcGxlLT5wZXJpb2QsIHNhbXBsZS0+d2VpZ2h0LAorCQkJCXNhbXBsZS0+dHJhbnNhY3Rpb24sIGZhbHNlKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdGVyLT5oZSA9IGhlOworCWhlX2NhY2hlW2l0ZXItPmN1cnIrK10gPSBoZTsKKworCWNhbGxjaGFpbl9hcHBlbmQoaGUtPmNhbGxjaGFpbiwgJmN1cnNvciwgc2FtcGxlLT5wZXJpb2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpdGVyX2ZpbmlzaF9jdW11bGF0aXZlX2VudHJ5KHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKml0ZXIsCisJCQkgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCBfX21heWJlX3VudXNlZCkKK3sKKwl6ZnJlZSgmaXRlci0+cHJpdik7CisJaXRlci0+aGUgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBoaXN0X2l0ZXJfb3BzIGhpc3RfaXRlcl9tZW0gPSB7CisJLnByZXBhcmVfZW50cnkgCQk9IGl0ZXJfcHJlcGFyZV9tZW1fZW50cnksCisJLmFkZF9zaW5nbGVfZW50cnkgCT0gaXRlcl9hZGRfc2luZ2xlX21lbV9lbnRyeSwKKwkubmV4dF9lbnRyeSAJCT0gaXRlcl9uZXh0X25vcF9lbnRyeSwKKwkuYWRkX25leHRfZW50cnkgCT0gaXRlcl9hZGRfbmV4dF9ub3BfZW50cnksCisJLmZpbmlzaF9lbnRyeSAJCT0gaXRlcl9maW5pc2hfbWVtX2VudHJ5LAorfTsKKworY29uc3Qgc3RydWN0IGhpc3RfaXRlcl9vcHMgaGlzdF9pdGVyX2JyYW5jaCA9IHsKKwkucHJlcGFyZV9lbnRyeSAJCT0gaXRlcl9wcmVwYXJlX2JyYW5jaF9lbnRyeSwKKwkuYWRkX3NpbmdsZV9lbnRyeSAJPSBpdGVyX2FkZF9zaW5nbGVfYnJhbmNoX2VudHJ5LAorCS5uZXh0X2VudHJ5IAkJPSBpdGVyX25leHRfYnJhbmNoX2VudHJ5LAorCS5hZGRfbmV4dF9lbnRyeSAJPSBpdGVyX2FkZF9uZXh0X2JyYW5jaF9lbnRyeSwKKwkuZmluaXNoX2VudHJ5IAkJPSBpdGVyX2ZpbmlzaF9icmFuY2hfZW50cnksCit9OworCitjb25zdCBzdHJ1Y3QgaGlzdF9pdGVyX29wcyBoaXN0X2l0ZXJfbm9ybWFsID0geworCS5wcmVwYXJlX2VudHJ5IAkJPSBpdGVyX3ByZXBhcmVfbm9ybWFsX2VudHJ5LAorCS5hZGRfc2luZ2xlX2VudHJ5IAk9IGl0ZXJfYWRkX3NpbmdsZV9ub3JtYWxfZW50cnksCisJLm5leHRfZW50cnkgCQk9IGl0ZXJfbmV4dF9ub3BfZW50cnksCisJLmFkZF9uZXh0X2VudHJ5IAk9IGl0ZXJfYWRkX25leHRfbm9wX2VudHJ5LAorCS5maW5pc2hfZW50cnkgCQk9IGl0ZXJfZmluaXNoX25vcm1hbF9lbnRyeSwKK307CisKK2NvbnN0IHN0cnVjdCBoaXN0X2l0ZXJfb3BzIGhpc3RfaXRlcl9jdW11bGF0aXZlID0geworCS5wcmVwYXJlX2VudHJ5IAkJPSBpdGVyX3ByZXBhcmVfY3VtdWxhdGl2ZV9lbnRyeSwKKwkuYWRkX3NpbmdsZV9lbnRyeSAJPSBpdGVyX2FkZF9zaW5nbGVfY3VtdWxhdGl2ZV9lbnRyeSwKKwkubmV4dF9lbnRyeSAJCT0gaXRlcl9uZXh0X2N1bXVsYXRpdmVfZW50cnksCisJLmFkZF9uZXh0X2VudHJ5IAk9IGl0ZXJfYWRkX25leHRfY3VtdWxhdGl2ZV9lbnRyeSwKKwkuZmluaXNoX2VudHJ5IAkJPSBpdGVyX2ZpbmlzaF9jdW11bGF0aXZlX2VudHJ5LAorfTsKKworaW50IGhpc3RfZW50cnlfaXRlcl9fYWRkKHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKml0ZXIsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKKwkJCSBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJIGludCBtYXhfc3RhY2tfZGVwdGgsIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyLCBlcnIyOworCisJZXJyID0gc2FtcGxlX19yZXNvbHZlX2NhbGxjaGFpbihzYW1wbGUsICZpdGVyLT5wYXJlbnQsIGV2c2VsLCBhbCwKKwkJCQkJbWF4X3N0YWNrX2RlcHRoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaXRlci0+ZXZzZWwgPSBldnNlbDsKKwlpdGVyLT5zYW1wbGUgPSBzYW1wbGU7CisKKwllcnIgPSBpdGVyLT5vcHMtPnByZXBhcmVfZW50cnkoaXRlciwgYWwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaXRlci0+b3BzLT5hZGRfc2luZ2xlX2VudHJ5KGl0ZXIsIGFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmIChpdGVyLT5oZSAmJiBpdGVyLT5hZGRfZW50cnlfY2IpIHsKKwkJZXJyID0gaXRlci0+YWRkX2VudHJ5X2NiKGl0ZXIsIGFsLCB0cnVlLCBhcmcpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKGl0ZXItPm9wcy0+bmV4dF9lbnRyeShpdGVyLCBhbCkpIHsKKwkJZXJyID0gaXRlci0+b3BzLT5hZGRfbmV4dF9lbnRyeShpdGVyLCBhbCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQlpZiAoaXRlci0+aGUgJiYgaXRlci0+YWRkX2VudHJ5X2NiKSB7CisJCQllcnIgPSBpdGVyLT5hZGRfZW50cnlfY2IoaXRlciwgYWwsIGZhbHNlLCBhcmcpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCWVycjIgPSBpdGVyLT5vcHMtPmZpbmlzaF9lbnRyeShpdGVyLCBhbCk7CisJaWYgKCFlcnIpCisJCWVyciA9IGVycjI7CisKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQ2NF90CkBAIC00NjksNiArOTIwLDcgQEAKIHsKIAl6ZnJlZSgmaGUtPmJyYW5jaF9pbmZvKTsKIAl6ZnJlZSgmaGUtPm1lbV9pbmZvKTsKKwl6ZnJlZSgmaGUtPnN0YXRfYWNjKTsKIAlmcmVlX3NyY2xpbmUoaGUtPnNyY2xpbmUpOwogCWZyZWUoaGUpOwogfQpAQCAtNDk0LDYgKzk0Niw4IEBACiAKIAkJaWYgKCFjbXApIHsKIAkJCWhlX3N0YXRfX2FkZF9zdGF0KCZpdGVyLT5zdGF0LCAmaGUtPnN0YXQpOworCQkJaWYgKHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbikKKwkJCQloZV9zdGF0X19hZGRfc3RhdChpdGVyLT5zdGF0X2FjYywgaGUtPnN0YXRfYWNjKTsKIAogCQkJaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pIHsKIAkJCQljYWxsY2hhaW5fY3Vyc29yX3Jlc2V0KCZjYWxsY2hhaW5fY3Vyc29yKTsKQEAgLTgwMCw2ICsxMjU0LDEzIEBACiAJZXZlbnRzX3N0YXRzX19pbmMoJmhpc3RzLT5zdGF0cywgdHlwZSk7CiB9CiAKK3ZvaWQgaGlzdHNfX2luY19ucl9zYW1wbGVzKHN0cnVjdCBoaXN0cyAqaGlzdHMsIGJvb2wgZmlsdGVyZWQpCit7CisJZXZlbnRzX3N0YXRzX19pbmMoJmhpc3RzLT5zdGF0cywgUEVSRl9SRUNPUkRfU0FNUExFKTsKKwlpZiAoIWZpbHRlcmVkKQorCQloaXN0cy0+c3RhdHMubnJfbm9uX2ZpbHRlcmVkX3NhbXBsZXMrKzsKK30KKwogc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICpoaXN0c19fYWRkX2R1bW15X2VudHJ5KHN0cnVjdCBoaXN0cyAqaGlzdHMsCiAJCQkJCQkgc3RydWN0IGhpc3RfZW50cnkgKnBhaXIpCiB7CkBAIC04MzEsNyArMTI5Miw3IEBACiAJCQlwID0gJigqcCktPnJiX3JpZ2h0OwogCX0KIAotCWhlID0gaGlzdF9lbnRyeV9fbmV3KHBhaXIpOworCWhlID0gaGlzdF9lbnRyeV9fbmV3KHBhaXIsIHRydWUpOwogCWlmIChoZSkgewogCQltZW1zZXQoJmhlLT5zdGF0LCAwLCBzaXplb2YoaGUtPnN0YXQpKTsKIAkJaGUtPmhpc3RzID0gaGlzdHM7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCBhODQxOGQxLi5kMmJmMDM1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTk2LDEyICs5Niw1MCBAQAogCXUxNgkJCWNvbF9sZW5bSElTVENfTlJfQ09MU107CiB9OwogCitzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyOworCitzdHJ1Y3QgaGlzdF9pdGVyX29wcyB7CisJaW50ICgqcHJlcGFyZV9lbnRyeSkoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqKTsKKwlpbnQgKCphZGRfc2luZ2xlX2VudHJ5KShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICosIHN0cnVjdCBhZGRyX2xvY2F0aW9uICopOworCWludCAoKm5leHRfZW50cnkpKHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKiwgc3RydWN0IGFkZHJfbG9jYXRpb24gKik7CisJaW50ICgqYWRkX25leHRfZW50cnkpKHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKiwgc3RydWN0IGFkZHJfbG9jYXRpb24gKik7CisJaW50ICgqZmluaXNoX2VudHJ5KShzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICosIHN0cnVjdCBhZGRyX2xvY2F0aW9uICopOworfTsKKworc3RydWN0IGhpc3RfZW50cnlfaXRlciB7CisJaW50IHRvdGFsOworCWludCBjdXJyOworCisJYm9vbCBoaWRlX3VucmVzb2x2ZWQ7CisKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGU7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCXN0cnVjdCBzeW1ib2wgKnBhcmVudDsKKwl2b2lkICpwcml2OworCisJY29uc3Qgc3RydWN0IGhpc3RfaXRlcl9vcHMgKm9wczsKKwkvKiB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gKG9wdGlvbmFsKSAqLworCWludCAoKmFkZF9lbnRyeV9jYikoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwKKwkJCSAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIGJvb2wgc2luZ2xlLCB2b2lkICphcmcpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBoaXN0X2l0ZXJfb3BzIGhpc3RfaXRlcl9ub3JtYWw7CitleHRlcm4gY29uc3Qgc3RydWN0IGhpc3RfaXRlcl9vcHMgaGlzdF9pdGVyX2JyYW5jaDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaGlzdF9pdGVyX29wcyBoaXN0X2l0ZXJfbWVtOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBoaXN0X2l0ZXJfb3BzIGhpc3RfaXRlcl9jdW11bGF0aXZlOworCiBzdHJ1Y3QgaGlzdF9lbnRyeSAqX19oaXN0c19fYWRkX2VudHJ5KHN0cnVjdCBoaXN0cyAqaGlzdHMsCiAJCQkJICAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAogCQkJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnBhcmVudCwKIAkJCQkgICAgICBzdHJ1Y3QgYnJhbmNoX2luZm8gKmJpLAogCQkJCSAgICAgIHN0cnVjdCBtZW1faW5mbyAqbWksIHU2NCBwZXJpb2QsCi0JCQkJICAgICAgdTY0IHdlaWdodCwgdTY0IHRyYW5zYWN0aW9uKTsKKwkJCQkgICAgICB1NjQgd2VpZ2h0LCB1NjQgdHJhbnNhY3Rpb24sCisJCQkJICAgICAgYm9vbCBzYW1wbGVfc2VsZik7CitpbnQgaGlzdF9lbnRyeV9pdGVyX19hZGQoc3RydWN0IGhpc3RfZW50cnlfaXRlciAqaXRlciwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorCQkJIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgaW50IG1heF9zdGFja19kZXB0aCwgdm9pZCAqYXJnKTsKKwogaW50NjRfdCBoaXN0X2VudHJ5X19jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCk7CiBpbnQ2NF90IGhpc3RfZW50cnlfX2NvbGxhcHNlKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpOwogaW50IGhpc3RfZW50cnlfX3RyYW5zYWN0aW9uX2xlbih2b2lkKTsKQEAgLTExOSw2ICsxNTcsNyBAQAogdm9pZCBoaXN0c19fcmVzZXRfc3RhdHMoc3RydWN0IGhpc3RzICpoaXN0cyk7CiB2b2lkIGhpc3RzX19pbmNfc3RhdHMoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IGhpc3RfZW50cnkgKmgpOwogdm9pZCBoaXN0c19faW5jX25yX2V2ZW50cyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCB1MzIgdHlwZSk7Cit2b2lkIGhpc3RzX19pbmNfbnJfc2FtcGxlcyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBib29sIGZpbHRlcmVkKTsKIHZvaWQgZXZlbnRzX3N0YXRzX19pbmMoc3RydWN0IGV2ZW50c19zdGF0cyAqc3RhdHMsIHUzMiB0eXBlKTsKIHNpemVfdCBldmVudHNfc3RhdHNfX2ZwcmludGYoc3RydWN0IGV2ZW50c19zdGF0cyAqc3RhdHMsIEZJTEUgKmZwKTsKIApAQCAtMTY2LDYgKzIwNSw3IEBACiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBzb3J0X2xpc3Q7CisJYm9vbCBlbGlkZTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBlcmZfaHBwX19saXN0OwpAQCAtMTkyLDYgKzIzMiw3IEBACiAJUEVSRl9IUFBfX09WRVJIRUFEX1VTLAogCVBFUkZfSFBQX19PVkVSSEVBRF9HVUVTVF9TWVMsCiAJUEVSRl9IUFBfX09WRVJIRUFEX0dVRVNUX1VTLAorCVBFUkZfSFBQX19PVkVSSEVBRF9BQ0MsCiAJUEVSRl9IUFBfX1NBTVBMRVMsCiAJUEVSRl9IUFBfX1BFUklPRCwKIApAQCAtMjAwLDcgKzI0MSwxMSBAQAogCiB2b2lkIHBlcmZfaHBwX19pbml0KHZvaWQpOwogdm9pZCBwZXJmX2hwcF9fY29sdW1uX3JlZ2lzdGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCk7Cit2b2lkIHBlcmZfaHBwX19jb2x1bW5fdW5yZWdpc3RlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpOwogdm9pZCBwZXJmX2hwcF9fY29sdW1uX2VuYWJsZSh1bnNpZ25lZCBjb2wpOwordm9pZCBwZXJmX2hwcF9fY29sdW1uX2Rpc2FibGUodW5zaWduZWQgY29sKTsKK3ZvaWQgcGVyZl9ocHBfX2NhbmNlbF9jdW11bGF0ZSh2b2lkKTsKKwogdm9pZCBwZXJmX2hwcF9fcmVnaXN0ZXJfc29ydF9maWVsZChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpOwogdm9pZCBwZXJmX2hwcF9fc2V0dXBfb3V0cHV0X2ZpZWxkKHZvaWQpOwogdm9pZCBwZXJmX2hwcF9fcmVzZXRfb3V0cHV0X2ZpZWxkKHZvaWQpOwpAQCAtMjA4LDcgKzI1MywxMiBAQAogCiBib29sIHBlcmZfaHBwX19pc19zb3J0X2VudHJ5KHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCk7CiBib29sIHBlcmZfaHBwX19zYW1lX3NvcnRfZW50cnkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqYSwgc3RydWN0IHBlcmZfaHBwX2ZtdCAqYik7Ci1ib29sIHBlcmZfaHBwX19zaG91bGRfc2tpcChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpOworCitzdGF0aWMgaW5saW5lIGJvb2wgcGVyZl9ocHBfX3Nob3VsZF9za2lwKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCkKK3sKKwlyZXR1cm4gZm9ybWF0LT5lbGlkZTsKK30KKwogdm9pZCBwZXJmX2hwcF9fcmVzZXRfd2lkdGgoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIAogdHlwZWRlZiB1NjQgKCpocHBfZmllbGRfZm4pKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSk7CkBAIC0yMTgsNiArMjY4LDkgQEAKIGludCBfX2hwcF9fZm10KHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCiAJICAgICAgIGhwcF9maWVsZF9mbiBnZXRfZmllbGQsIGNvbnN0IGNoYXIgKmZtdCwKIAkgICAgICAgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpOworaW50IF9faHBwX19mbXRfYWNjKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCisJCSAgIGhwcF9maWVsZF9mbiBnZXRfZmllbGQsIGNvbnN0IGNoYXIgKmZtdCwKKwkJICAgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9ocHAoc3RydWN0IHBlcmZfaHBwICpocHAsIGludCBpbmMpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc29ydC5jIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwppbmRleCA5MDFiOWJlLi40NTUxMmJhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc29ydC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKQEAgLTEwNjEsNiArMTA2MSw3IEBACiAJRElNKFBFUkZfSFBQX19PVkVSSEVBRF9VUywgIm92ZXJoZWFkX3VzIiksCiAJRElNKFBFUkZfSFBQX19PVkVSSEVBRF9HVUVTVF9TWVMsICJvdmVyaGVhZF9ndWVzdF9zeXMiKSwKIAlESU0oUEVSRl9IUFBfX09WRVJIRUFEX0dVRVNUX1VTLCAib3ZlcmhlYWRfZ3Vlc3RfdXMiKSwKKwlESU0oUEVSRl9IUFBfX09WRVJIRUFEX0FDQywgIm92ZXJoZWFkX2NoaWxkcmVuIiksCiAJRElNKFBFUkZfSFBQX19TQU1QTEVTLCAic2FtcGxlIiksCiAJRElNKFBFUkZfSFBQX19QRVJJT0QsICJwZXJpb2QiKSwKIH07CkBAIC0xMTU2LDYgKzExNTcsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmhzZS0+aHBwLmxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoc2UtPmhwcC5zb3J0X2xpc3QpOworCWhzZS0+aHBwLmVsaWRlID0gZmFsc2U7CiAKIAlyZXR1cm4gaHNlOwogfQpAQCAtMTM2MywyNyArMTM2NSw2NCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWJvb2wgcGVyZl9ocHBfX3Nob3VsZF9za2lwKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZvcm1hdCkKK3ZvaWQgcGVyZl9ocHBfX3NldF9lbGlkZShpbnQgaWR4LCBib29sIGVsaWRlKQogewotCWlmIChwZXJmX2hwcF9faXNfc29ydF9lbnRyeShmb3JtYXQpKSB7Ci0JCXN0cnVjdCBocHBfc29ydF9lbnRyeSAqaHNlOworCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwlzdHJ1Y3QgaHBwX3NvcnRfZW50cnkgKmhzZTsKIAotCQloc2UgPSBjb250YWluZXJfb2YoZm9ybWF0LCBzdHJ1Y3QgaHBwX3NvcnRfZW50cnksIGhwcCk7Ci0JCXJldHVybiBoc2UtPnNlLT5lbGlkZTsKKwlwZXJmX2hwcF9fZm9yX2VhY2hfZm9ybWF0KGZtdCkgeworCQlpZiAoIXBlcmZfaHBwX19pc19zb3J0X2VudHJ5KGZtdCkpCisJCQljb250aW51ZTsKKworCQloc2UgPSBjb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgaHBwX3NvcnRfZW50cnksIGhwcCk7CisJCWlmIChoc2UtPnNlLT5zZV93aWR0aF9pZHggPT0gaWR4KSB7CisJCQlmbXQtPmVsaWRlID0gZWxpZGU7CisJCQlicmVhazsKKwkJfQogCX0KLQlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIHNvcnRfZW50cnlfX3NldHVwX2VsaWRlKHN0cnVjdCBzb3J0X2VudHJ5ICpzZSwKLQkJCQkgICAgc3RydWN0IHN0cmxpc3QgKmxpc3QsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSwgRklMRSAqZnApCitzdGF0aWMgYm9vbCBfX2dldF9lbGlkZShzdHJ1Y3Qgc3RybGlzdCAqbGlzdCwgY29uc3QgY2hhciAqbGlzdF9uYW1lLCBGSUxFICpmcCkKIHsKIAlpZiAobGlzdCAmJiBzdHJsaXN0X19ucl9lbnRyaWVzKGxpc3QpID09IDEpIHsKIAkJaWYgKGZwICE9IE5VTEwpCiAJCQlmcHJpbnRmKGZwLCAiIyAlczogJXNcbiIsIGxpc3RfbmFtZSwKIAkJCQlzdHJsaXN0X19lbnRyeShsaXN0LCAwKS0+cyk7Ci0JCXNlLT5lbGlkZSA9IHRydWU7CisJCXJldHVybiB0cnVlOwogCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGdldF9lbGlkZShpbnQgaWR4LCBGSUxFICpvdXRwdXQpCit7CisJc3dpdGNoIChpZHgpIHsKKwljYXNlIEhJU1RDX1NZTUJPTDoKKwkJcmV0dXJuIF9fZ2V0X2VsaWRlKHN5bWJvbF9jb25mLnN5bV9saXN0LCAic3ltYm9sIiwgb3V0cHV0KTsKKwljYXNlIEhJU1RDX0RTTzoKKwkJcmV0dXJuIF9fZ2V0X2VsaWRlKHN5bWJvbF9jb25mLmRzb19saXN0LCAiZHNvIiwgb3V0cHV0KTsKKwljYXNlIEhJU1RDX0NPTU06CisJCXJldHVybiBfX2dldF9lbGlkZShzeW1ib2xfY29uZi5jb21tX2xpc3QsICJjb21tIiwgb3V0cHV0KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoc29ydF9fbW9kZSAhPSBTT1JUX01PREVfX0JSQU5DSCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIEhJU1RDX1NZTUJPTF9GUk9NOgorCQlyZXR1cm4gX19nZXRfZWxpZGUoc3ltYm9sX2NvbmYuc3ltX2Zyb21fbGlzdCwgInN5bV9mcm9tIiwgb3V0cHV0KTsKKwljYXNlIEhJU1RDX1NZTUJPTF9UTzoKKwkJcmV0dXJuIF9fZ2V0X2VsaWRlKHN5bWJvbF9jb25mLnN5bV90b19saXN0LCAic3ltX3RvIiwgb3V0cHV0KTsKKwljYXNlIEhJU1RDX0RTT19GUk9NOgorCQlyZXR1cm4gX19nZXRfZWxpZGUoc3ltYm9sX2NvbmYuZHNvX2Zyb21fbGlzdCwgImRzb19mcm9tIiwgb3V0cHV0KTsKKwljYXNlIEhJU1RDX0RTT19UTzoKKwkJcmV0dXJuIF9fZ2V0X2VsaWRlKHN5bWJvbF9jb25mLmRzb190b19saXN0LCAiZHNvX3RvIiwgb3V0cHV0KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgc29ydF9fc2V0dXBfZWxpZGUoRklMRSAqb3V0cHV0KQpAQCAtMTM5MSwzOSArMTQzMCwxMiBAQAogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAlzdHJ1Y3QgaHBwX3NvcnRfZW50cnkgKmhzZTsKIAotCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X2Rzbywgc3ltYm9sX2NvbmYuZHNvX2xpc3QsCi0JCQkJImRzbyIsIG91dHB1dCk7Ci0Jc29ydF9lbnRyeV9fc2V0dXBfZWxpZGUoJnNvcnRfY29tbSwgc3ltYm9sX2NvbmYuY29tbV9saXN0LAotCQkJCSJjb21tIiwgb3V0cHV0KTsKLQlzb3J0X2VudHJ5X19zZXR1cF9lbGlkZSgmc29ydF9zeW0sIHN5bWJvbF9jb25mLnN5bV9saXN0LAotCQkJCSJzeW1ib2wiLCBvdXRwdXQpOworCXBlcmZfaHBwX19mb3JfZWFjaF9mb3JtYXQoZm10KSB7CisJCWlmICghcGVyZl9ocHBfX2lzX3NvcnRfZW50cnkoZm10KSkKKwkJCWNvbnRpbnVlOwogCi0JaWYgKHNvcnRfX21vZGUgPT0gU09SVF9NT0RFX19CUkFOQ0gpIHsKLQkJc29ydF9lbnRyeV9fc2V0dXBfZWxpZGUoJnNvcnRfZHNvX2Zyb20sCi0JCQkJCXN5bWJvbF9jb25mLmRzb19mcm9tX2xpc3QsCi0JCQkJCSJkc29fZnJvbSIsIG91dHB1dCk7Ci0JCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X2Rzb190bywKLQkJCQkJc3ltYm9sX2NvbmYuZHNvX3RvX2xpc3QsCi0JCQkJCSJkc29fdG8iLCBvdXRwdXQpOwotCQlzb3J0X2VudHJ5X19zZXR1cF9lbGlkZSgmc29ydF9zeW1fZnJvbSwKLQkJCQkJc3ltYm9sX2NvbmYuc3ltX2Zyb21fbGlzdCwKLQkJCQkJInN5bV9mcm9tIiwgb3V0cHV0KTsKLQkJc29ydF9lbnRyeV9fc2V0dXBfZWxpZGUoJnNvcnRfc3ltX3RvLAotCQkJCQlzeW1ib2xfY29uZi5zeW1fdG9fbGlzdCwKLQkJCQkJInN5bV90byIsIG91dHB1dCk7Ci0JfSBlbHNlIGlmIChzb3J0X19tb2RlID09IFNPUlRfTU9ERV9fTUVNT1JZKSB7Ci0JCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X2Rzbywgc3ltYm9sX2NvbmYuZHNvX2xpc3QsCi0JCQkJCSJzeW1ib2xfZGFkZHIiLCBvdXRwdXQpOwotCQlzb3J0X2VudHJ5X19zZXR1cF9lbGlkZSgmc29ydF9kc28sIHN5bWJvbF9jb25mLmRzb19saXN0LAotCQkJCQkiZHNvX2RhZGRyIiwgb3V0cHV0KTsKLQkJc29ydF9lbnRyeV9fc2V0dXBfZWxpZGUoJnNvcnRfZHNvLCBzeW1ib2xfY29uZi5kc29fbGlzdCwKLQkJCQkJIm1lbSIsIG91dHB1dCk7Ci0JCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X2Rzbywgc3ltYm9sX2NvbmYuZHNvX2xpc3QsCi0JCQkJCSJsb2NhbF93ZWlnaHQiLCBvdXRwdXQpOwotCQlzb3J0X2VudHJ5X19zZXR1cF9lbGlkZSgmc29ydF9kc28sIHN5bWJvbF9jb25mLmRzb19saXN0LAotCQkJCQkidGxiIiwgb3V0cHV0KTsKLQkJc29ydF9lbnRyeV9fc2V0dXBfZWxpZGUoJnNvcnRfZHNvLCBzeW1ib2xfY29uZi5kc29fbGlzdCwKLQkJCQkJInNub29wIiwgb3V0cHV0KTsKKwkJaHNlID0gY29udGFpbmVyX29mKGZtdCwgc3RydWN0IGhwcF9zb3J0X2VudHJ5LCBocHApOworCQlmbXQtPmVsaWRlID0gZ2V0X2VsaWRlKGhzZS0+c2UtPnNlX3dpZHRoX2lkeCwgb3V0cHV0KTsKIAl9CiAKIAkvKgpAQCAtMTQzNCw4ICsxNDQ2LDcgQEAKIAkJaWYgKCFwZXJmX2hwcF9faXNfc29ydF9lbnRyeShmbXQpKQogCQkJY29udGludWU7CiAKLQkJaHNlID0gY29udGFpbmVyX29mKGZtdCwgc3RydWN0IGhwcF9zb3J0X2VudHJ5LCBocHApOwotCQlpZiAoIWhzZS0+c2UtPmVsaWRlKQorCQlpZiAoIWZtdC0+ZWxpZGUpCiAJCQlyZXR1cm47CiAJfQogCkBAIC0xNDQzLDggKzE0NTQsNyBAQAogCQlpZiAoIXBlcmZfaHBwX19pc19zb3J0X2VudHJ5KGZtdCkpCiAJCQljb250aW51ZTsKIAotCQloc2UgPSBjb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgaHBwX3NvcnRfZW50cnksIGhwcCk7Ci0JCWhzZS0+c2UtPmVsaWRlID0gZmFsc2U7CisJCWZtdC0+ZWxpZGUgPSBmYWxzZTsKIAl9CiB9CiAKQEAgLTE1ODEsNiArMTU5MSw5IEBACiAJc29ydF9faGFzX3N5bSA9IDA7CiAJc29ydF9faGFzX2RzbyA9IDA7CiAKKwlmaWVsZF9vcmRlciA9IE5VTEw7CisJc29ydF9vcmRlciA9IE5VTEw7CisKIAlyZXNldF9kaW1lbnNpb25zKCk7CiAJcGVyZl9ocHBfX3Jlc2V0X291dHB1dF9maWVsZCgpOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKaW5kZXggNWYzOGQ5Mi4uNWJmMDA5OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvc29ydC5oCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCiAjaW5jbHVkZSAicGFyc2UtZXZlbnRzLmgiCi0KKyNpbmNsdWRlICJoaXN0LmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAKIGV4dGVybiByZWdleF90IHBhcmVudF9yZWdleDsKQEAgLTgyLDYgKzgyLDcgQEAKIAkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCX0gcGFpcnM7CiAJc3RydWN0IGhlX3N0YXQJCXN0YXQ7CisJc3RydWN0IGhlX3N0YXQJCSpzdGF0X2FjYzsKIAlzdHJ1Y3QgbWFwX3N5bWJvbAltczsKIAlzdHJ1Y3QgdGhyZWFkCQkqdGhyZWFkOwogCXN0cnVjdCBjb21tCQkqY29tbTsKQEAgLTEzMCw2ICsxMzEsMjEgQEAKIAlsaXN0X2FkZF90YWlsKCZwYWlyLT5wYWlycy5ub2RlLCAmaGUtPnBhaXJzLmhlYWQpOwogfQogCitzdGF0aWMgaW5saW5lIGZsb2F0IGhpc3RfZW50cnlfX2dldF9wZXJjZW50X2xpbWl0KHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3sKKwl1NjQgcGVyaW9kID0gaGUtPnN0YXQucGVyaW9kOworCXU2NCB0b3RhbF9wZXJpb2QgPSBoaXN0c19fdG90YWxfcGVyaW9kKGhlLT5oaXN0cyk7CisKKwlpZiAodW5saWtlbHkodG90YWxfcGVyaW9kID09IDApKQorCQlyZXR1cm4gMDsKKworCWlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4pCisJCXBlcmlvZCA9IGhlLT5zdGF0X2FjYy0+cGVyaW9kOworCisJcmV0dXJuIHBlcmlvZCAqIDEwMC4wIC8gdG90YWxfcGVyaW9kOworfQorCisKIGVudW0gc29ydF9tb2RlIHsKIAlTT1JUX01PREVfX05PUk1BTCwKIAlTT1JUX01PREVfX0JSQU5DSCwKQEAgLTE4Niw3ICsyMDIsNiBAQAogCWludAkoKnNlX3NucHJpbnRmKShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgpOwogCXU4CXNlX3dpZHRoX2lkeDsKLQlib29sCWVsaWRlOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfdGhyZWFkOwpAQCAtMTk3LDYgKzIxMiw3IEBACiB2b2lkIHJlc2V0X291dHB1dF9maWVsZCh2b2lkKTsKIGV4dGVybiBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjb25zdCBjaGFyICopOwogdm9pZCBzb3J0X19zZXR1cF9lbGlkZShGSUxFICpmcCk7Cit2b2lkIHBlcmZfaHBwX19zZXRfZWxpZGUoaW50IGlkeCwgYm9vbCBlbGlkZSk7CiAKIGludCByZXBvcnRfcGFyc2VfaWdub3JlX2NhbGxlZXNfb3B0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgdW5zZXQpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKaW5kZXggOTVlMjQ5Ny4uN2I5MDk2ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwpAQCAtMjksMTEgKzI5LDEyIEBACiBjaGFyICoqdm1saW51eF9wYXRoOwogCiBzdHJ1Y3Qgc3ltYm9sX2NvbmYgc3ltYm9sX2NvbmYgPSB7Ci0JLnVzZV9tb2R1bGVzCSAgPSB0cnVlLAotCS50cnlfdm1saW51eF9wYXRoID0gdHJ1ZSwKLQkuYW5ub3RhdGVfc3JjCSAgPSB0cnVlLAotCS5kZW1hbmdsZQkgID0gdHJ1ZSwKLQkuc3ltZnMgICAgICAgICAgICA9ICIiLAorCS51c2VfbW9kdWxlcwkJPSB0cnVlLAorCS50cnlfdm1saW51eF9wYXRoCT0gdHJ1ZSwKKwkuYW5ub3RhdGVfc3JjCQk9IHRydWUsCisJLmRlbWFuZ2xlCQk9IHRydWUsCisJLmN1bXVsYXRlX2NhbGxjaGFpbgk9IHRydWUsCisJLnN5bWZzCQkJPSAiIiwKIH07CiAKIHN0YXRpYyBlbnVtIGRzb19iaW5hcnlfdHlwZSBiaW5hcnlfdHlwZV9zeW10YWJbXSA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAppbmRleCAzM2VkZTUzLi42MTVjNzUyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCkBAIC0xMDksNiArMTA5LDcgQEAKIAkJCXNob3dfbnJfc2FtcGxlcywKIAkJCXNob3dfdG90YWxfcGVyaW9kLAogCQkJdXNlX2NhbGxjaGFpbiwKKwkJCWN1bXVsYXRlX2NhbGxjaGFpbiwKIAkJCWV4Y2x1ZGVfb3RoZXIsCiAJCQlzaG93X2NwdV91dGlsaXphdGlvbiwKIAkJCWluaXRpYWxpemVkLApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L01ha2VmaWxlCmluZGV4IDc1MDUxMmIuLmM3NDkzYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDEyIEBACiBydW5fdGVzdHM6IGFsbAogCUAvYmluL3NoIC4vcnVuX25ldHNvY2t0ZXN0cyB8fCBlY2hvICJzb2NrZXR0ZXN0czogW0ZBSUxdIgogCUAvYmluL3NoIC4vcnVuX2FmcGFja2V0dGVzdHMgfHwgZWNobyAiYWZwYWNrZXR0ZXN0czogW0ZBSUxdIgotCisJQGlmIC9zYmluL21vZHByb2JlIHRlc3RfYnBmIDsgdGhlbiBcCisJCS9zYmluL3JtbW9kIHRlc3RfYnBmOyBcCisJCWVjaG8gInRlc3RfYnBmOiBvayI7IFwKKwllbHNlIFwKKwkJZWNobyAidGVzdF9icGY6IFtGQUlMXSI7IFwKKwkJZXhpdCAxOyBcCisJZmkKIGNsZWFuOgogCSQoUk0pICQoTkVUX1BST0dTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggYjNkYmU5ZS4uNTQ4MzNhNyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw3IEBACiAKIGV4cG9ydCBDQyBDRkxBR1MKIAotVEFSR0VUUyA9IHBtdSBjb3B5bG9vcHMgbW0KK1RBUkdFVFMgPSBwbXUgY29weWxvb3BzIG1tIHRtCiAKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvaGFybmVzcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKaW5kZXggZTgwYzQyYS4uOGViYzU4YSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKQEAgLTMwLDEyICszMCwxNSBAQAogCiAJcGlkID0gZm9yaygpOwogCWlmIChwaWQgPT0gMCkgeworCQlzZXRwZ2lkKDAsIDApOwogCQlleGl0KHRlc3RfZnVuY3Rpb24oKSk7CiAJfSBlbHNlIGlmIChwaWQgPT0gLTEpIHsKIAkJcGVycm9yKCJmb3JrIik7CiAJCXJldHVybiAxOwogCX0KIAorCXNldHBnaWQocGlkLCBwaWQpOworCiAJLyogV2FrZSB1cyB1cCBpbiB0aW1lb3V0IHNlY29uZHMgKi8KIAlhbGFybShUSU1FT1VUKTsKIAl0ZXJtaW5hdGVkID0gZmFsc2U7CkBAIC01MCwxNyArNTMsMjAgQEAKIAogCQlpZiAodGVybWluYXRlZCkgewogCQkJcHJpbnRmKCIhISBmb3JjZSBraWxsaW5nICVzXG4iLCBuYW1lKTsKLQkJCWtpbGwocGlkLCBTSUdLSUxMKTsKKwkJCWtpbGwoLXBpZCwgU0lHS0lMTCk7CiAJCQlyZXR1cm4gMTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ZigiISEga2lsbGluZyAlc1xuIiwgbmFtZSk7Ci0JCQlraWxsKHBpZCwgU0lHVEVSTSk7CisJCQlraWxsKC1waWQsIFNJR1RFUk0pOwogCQkJdGVybWluYXRlZCA9IHRydWU7CiAJCQlhbGFybShLSUxMX1RJTUVPVVQpOwogCQkJZ290byB3YWl0OwogCQl9CiAJfQogCisJLyogS2lsbCBhbnl0aGluZyBlbHNlIGluIHRoZSBwcm9jZXNzIGdyb3VwIHRoYXQgaXMgc3RpbGwgcnVubmluZyAqLworCWtpbGwoLXBpZCwgU0lHVEVSTSk7CisKIAlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCiAJCXN0YXR1cyA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CiAJZWxzZSB7CkBAIC05OSw3ICsxMDUsMTAgQEAKIAogCXJjID0gcnVuX3Rlc3QodGVzdF9mdW5jdGlvbiwgbmFtZSk7CiAKLQl0ZXN0X2ZpbmlzaChuYW1lLCByYyk7CisJaWYgKHJjID09IE1BR0lDX1NLSVBfUkVUVVJOX1ZBTFVFKQorCQl0ZXN0X3NraXAobmFtZSk7CisJZWxzZQorCQl0ZXN0X2ZpbmlzaChuYW1lLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCmluZGV4IDcyMTZmMDAuLmI5ZmYwZGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogUFJPR1MgOj0gY291bnRfaW5zdHJ1Y3Rpb25zCiBFWFRSQV9TT1VSQ0VTIDo9IC4uL2hhcm5lc3MuYyBldmVudC5jCiAKLWFsbDogJChQUk9HUykKK2FsbDogJChQUk9HUykgc3ViX2FsbAogCiAkKFBST0dTKTogJChFWFRSQV9TT1VSQ0VTKQogCkBAIC0xMiwxMiArMTIsMzAgQEAKIGNvdW50X2luc3RydWN0aW9uczogbG9vcC5TIGNvdW50X2luc3RydWN0aW9ucy5jICQoRVhUUkFfU09VUkNFUykKIAkkKENDKSAkKENGTEFHUykgLW02NCAtbyAkQCAkXgogCi1ydW5fdGVzdHM6IGFsbAorcnVuX3Rlc3RzOiBhbGwgc3ViX3J1bl90ZXN0cwogCUAtZm9yIFBST0cgaW4gJChQUk9HUyk7IGRvIFwKIAkJLi8kJFBST0c7IFwKIAlkb25lOwogCi1jbGVhbjoKK2NsZWFuOiBzdWJfY2xlYW4KIAlybSAtZiAkKFBST0dTKSBsb29wLm8KIAotLlBIT05ZOiBhbGwgcnVuX3Rlc3RzIGNsZWFuCisKK1NVQl9UQVJHRVRTID0gZWJiCisKK3N1Yl9hbGw6CisJQGZvciBUQVJHRVQgaW4gJChTVUJfVEFSR0VUUyk7IGRvIFwKKwkJJChNQUtFKSAtQyAkJFRBUkdFVCBhbGw7IFwKKwlkb25lOworCitzdWJfcnVuX3Rlc3RzOiBhbGwKKwlAZm9yIFRBUkdFVCBpbiAkKFNVQl9UQVJHRVRTKTsgZG8gXAorCQkkKE1BS0UpIC1DICQkVEFSR0VUIHJ1bl90ZXN0czsgXAorCWRvbmU7CisKK3N1Yl9jbGVhbjoKKwlAZm9yIFRBUkdFVCBpbiAkKFNVQl9UQVJHRVRTKTsgZG8gXAorCQkkKE1BS0UpIC1DICQkVEFSR0VUIGNsZWFuOyBcCisJZG9uZTsKKworLlBIT05ZOiBhbGwgcnVuX3Rlc3RzIGNsZWFuIHN1Yl9hbGwgc3ViX3J1bl90ZXN0cyBzdWJfY2xlYW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJiYTJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL01ha2VmaWxlCkBAIC0wLDAgKzEsMzIgQEAKK25vYXJnOgorCSQoTUFLRSkgLUMgLi4vLi4vCisKKyMgVGhlIEVCQiBoYW5kbGVyIGlzIDY0LWJpdCBjb2RlIGFuZCBldmVyeXRoaW5nIGxpbmtzIGFnYWluc3QgaXQKK0NGTEFHUyArPSAtbTY0CisKK1BST0dTIDo9IHJlZ19hY2Nlc3NfdGVzdCBldmVudF9hdHRyaWJ1dGVzX3Rlc3QgY3ljbGVzX3Rlc3QJXAorCSBjeWNsZXNfd2l0aF9mcmVlemVfdGVzdCBwbWM1Nl9vdmVyZmxvd190ZXN0CQlcCisJIGViYl92c19jcHVfZXZlbnRfdGVzdCBjcHVfZXZlbnRfdnNfZWJiX3Rlc3QJCVwKKwkgY3B1X2V2ZW50X3Bpbm5lZF92c19lYmJfdGVzdCB0YXNrX2V2ZW50X3ZzX2ViYl90ZXN0CVwKKwkgdGFza19ldmVudF9waW5uZWRfdnNfZWJiX3Rlc3QgbXVsdGlfZWJiX3Byb2NzX3Rlc3QJXAorCSBtdWx0aV9jb3VudGVyX3Rlc3QgcG1hZV9oYW5kbGluZ190ZXN0CQkJXAorCSBjbG9zZV9jbGVhcnNfcG1jY190ZXN0IGluc3RydWN0aW9uX2NvdW50X3Rlc3QJCVwKKwkgZm9ya19jbGVhbnVwX3Rlc3QgZWJiX29uX2NoaWxkX3Rlc3QJCQlcCisJIGViYl9vbl93aWxsaW5nX2NoaWxkX3Rlc3QgYmFja190b19iYWNrX2ViYnNfdGVzdAlcCisJIGxvc3RfZXhjZXB0aW9uX3Rlc3Qgbm9faGFuZGxlcl90ZXN0CisKK2FsbDogJChQUk9HUykKKworJChQUk9HUyk6IC4uLy4uL2hhcm5lc3MuYyAuLi9ldmVudC5jIC4uL2xpYi5jIGViYi5jIGViYl9oYW5kbGVyLlMgdHJhY2UuYworCitpbnN0cnVjdGlvbl9jb3VudF90ZXN0OiAuLi9sb29wLlMKKworbG9zdF9leGNlcHRpb25fdGVzdDogLi4vbGliLmMKKworcnVuX3Rlc3RzOiBhbGwKKwlALWZvciBQUk9HIGluICQoUFJPR1MpOyBkbyBcCisJCS4vJCRQUk9HOyBcCisJZG9uZTsKKworY2xlYW46CisJcm0gLWYgJChQUk9HUykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9iYWNrX3RvX2JhY2tfZWJic190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvYmFja190b19iYWNrX2ViYnNfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWE3NjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvYmFja190b19iYWNrX2ViYnNfdGVzdC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworI2RlZmluZSBOVU1CRVJfT0ZfRUJCUwk1MAorCisvKgorICogVGVzdCB0aGF0IGlmIHdlIG92ZXJmbG93IHRoZSBjb3VudGVyIHdoaWxlIGluIHRoZSBFQkIgaGFuZGxlciwgd2UgdGFrZQorICogYW5vdGhlciBFQkIgb24gZXhpdGluZyBmcm9tIHRoZSBoYW5kbGVyLgorICoKKyAqIFdlIGRvIHRoaXMgYnkgY291bnRpbmcgd2l0aCBhIHN0dXBpZGx5IGxvdyBzYW1wbGUgcGVyaW9kLCBjYXVzaW5nIHVzIHRvCisgKiBvdmVyZmxvdyB0aGUgUE1VIHdoaWxlIHdlJ3JlIHN0aWxsIGluIHRoZSBFQkIgaGFuZGxlciwgbGVhZGluZyB0byBhbm90aGVyCisgKiBFQkIuCisgKgorICogV2UgZ2V0IG91dCBvZiB3aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhbiBpbmZpbml0ZSBsb29wIGJ5IGxlYXZpbmcgdGhlCisgKiBjb3VudGVyIGZyb3plbiBvbmNlIHdlJ3ZlIHRha2VuIGVub3VnaCBFQkJzLgorICovCisKK3N0YXRpYyB2b2lkIGViYl9jYWxsZWUodm9pZCkKK3sKKwl1aW50NjRfdCBzaWFyLCB2YWw7CisKKwl2YWwgPSBtZnNwcihTUFJOX0JFU0NSKTsKKwlpZiAoISh2YWwgJiBCRVNDUl9QTUVPKSkgeworCQllYmJfc3RhdGUuc3RhdHMuc3B1cmlvdXMrKzsKKwkJZ290byBvdXQ7CisJfQorCisJZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCsrOworCXRyYWNlX2xvZ19jb3VudGVyKGViYl9zdGF0ZS50cmFjZSwgZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCk7CisKKwkvKiBSZXNldHMgdGhlIFBNQyAqLworCWNvdW50X3BtYygxLCBzYW1wbGVfcGVyaW9kKTsKKworb3V0OgorCWlmIChlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50ID09IE5VTUJFUl9PRl9FQkJTKQorCQkvKiBSZXNldCBidXQgbGVhdmUgY291bnRlcnMgZnJvemVuICovCisJCXJlc2V0X2ViYl93aXRoX2NsZWFyX21hc2soTU1DUjBfUE1BTyk7CisJZWxzZQorCQkvKiBVbmZyZWV6ZXMgKi8KKwkJcmVzZXRfZWJiKCk7CisKKwkvKiBEbyBzb21lIHN0dWZmIHRvIGNoZXcgc29tZSBjeWNsZXMgYW5kIHBvcCB0aGUgY291bnRlciAqLworCXNpYXIgPSBtZnNwcihTUFJOX1NJQVIpOworCXRyYWNlX2xvZ19yZWcoZWJiX3N0YXRlLnRyYWNlLCBTUFJOX1NJQVIsIHNpYXIpOworCisJdmFsID0gbWZzcHIoU1BSTl9QTUMxKTsKKwl0cmFjZV9sb2dfcmVnKGViYl9zdGF0ZS50cmFjZSwgU1BSTl9QTUMxLCB2YWwpOworCisJdmFsID0gbWZzcHIoU1BSTl9NTUNSMCk7CisJdHJhY2VfbG9nX3JlZyhlYmJfc3RhdGUudHJhY2UsIFNQUk5fTU1DUjAsIHZhbCk7Cit9CisKK2ludCBiYWNrX3RvX2JhY2tfZWJicyh2b2lkKQoreworCXN0cnVjdCBldmVudCBldmVudDsKKworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50LCAweDEwMDFlLCAiY3ljbGVzIik7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKworCXNldHVwX2ViYl9oYW5kbGVyKGViYl9jYWxsZWUpOworCisJRkFJTF9JRihlYmJfZXZlbnRfZW5hYmxlKCZldmVudCkpOworCisJc2FtcGxlX3BlcmlvZCA9IDU7CisKKwllYmJfZnJlZXplX3BtY3MoKTsKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKwllYmJfZ2xvYmFsX2VuYWJsZSgpOworCWViYl91bmZyZWV6ZV9wbWNzKCk7CisKKwl3aGlsZSAoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA8IE5VTUJFUl9PRl9FQkJTKQorCQlGQUlMX0lGKGNvcmVfYnVzeV9sb29wKCkpOworCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisKKwljb3VudF9wbWMoMSwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX2ViYl9zdGF0ZSgpOworCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCUZBSUxfSUYoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCAhPSBOVU1CRVJfT0ZfRUJCUyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKGJhY2tfdG9fYmFja19lYmJzLCAiYmFja190b19iYWNrX2ViYnMiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jbG9zZV9jbGVhcnNfcG1jY190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvY2xvc2VfY2xlYXJzX3BtY2NfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvY2xvc2VfY2xlYXJzX3BtY2NfdGVzdC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImViYi5oIgorCisKKy8qCisgKiBUZXN0IHRoYXQgY2xvc2luZyB0aGUgRUJCIGV2ZW50IGNsZWFycyBNTUNSMF9QTUNDLCBwcmV2ZW50aW5nIGZ1cnRoZXIgYWNjZXNzCisgKiBieSB1c2Vyc3BhY2UgdG8gdGhlIFBNVSBoYXJkd2FyZS4KKyAqLworCitpbnQgY2xvc2VfY2xlYXJzX3BtY2Modm9pZCkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHgxMDAxZSwgImN5Y2xlcyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJRkFJTF9JRihldmVudF9vcGVuKCZldmVudCkpOworCisJZWJiX2VuYWJsZV9wbWNfY291bnRpbmcoMSk7CisJc2V0dXBfZWJiX2hhbmRsZXIoc3RhbmRhcmRfZWJiX2NhbGxlZSk7CisJZWJiX2dsb2JhbF9lbmFibGUoKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKworCXdoaWxlIChlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50IDwgMSkKKwkJRkFJTF9JRihjb3JlX2J1c3lfbG9vcCgpKTsKKworCWViYl9nbG9iYWxfZGlzYWJsZSgpOworCWV2ZW50X2Nsb3NlKCZldmVudCk7CisKKwlGQUlMX0lGKGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQgPT0gMCk7CisKKwkvKiBUaGUgcmVhbCB0ZXN0IGlzIGhlcmUsIGRvIHdlIHRha2UgYSBTSUdJTEwgd2hlbiB3cml0aW5nIFBNVSByZWdzIG5vdworCSAqIHRoYXQgd2UgaGF2ZSBjbG9zZWQgdGhlIGV2ZW50LiBXZSBleHBlY3QgdGhhdCB3ZSB3aWxsLiAqLworCisJRkFJTF9JRihjYXRjaF9zaWdpbGwod3JpdGVfcG1jMSkpOworCisJLyogV2Ugc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCBFQkIgcmVncyB0aG91Z2ggKi8KKwltZnNwcihTUFJOX0VCQkhSKTsKKwltZnNwcihTUFJOX0VCQlJSKTsKKwltZnNwcihTUFJOX0JFU0NSKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3MoY2xvc2VfY2xlYXJzX3BtY2MsICJjbG9zZV9jbGVhcnNfcG1jYyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2NwdV9ldmVudF9waW5uZWRfdnNfZWJiX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jcHVfZXZlbnRfcGlubmVkX3ZzX2ViYl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlZDY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jcHVfZXZlbnRfcGlubmVkX3ZzX2ViYl90ZXN0LmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3RzIGEgcGlubmVkIGNwdSBldmVudCB2cyBhbiBFQkIgLSBpbiB0aGF0IG9yZGVyLiBUaGUgcGlubmVkIGNwdSBldmVudAorICogc2hvdWxkIHJlbWFpbiBhbmQgdGhlIEVCQiBldmVudCBzaG91bGQgZmFpbCB0byBlbmFibGUuCisgKi8KKworc3RhdGljIGludCBzZXR1cF9jcHVfZXZlbnQoc3RydWN0IGV2ZW50ICpldmVudCwgaW50IGNwdSkKK3sKKwlldmVudF9pbml0X25hbWVkKGV2ZW50LCAweDQwMEZBLCAiUE1fUlVOX0lOU1RfQ01QTCIpOworCisJZXZlbnQtPmF0dHIucGlubmVkID0gMTsKKworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC0+YXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgPSAxOworCisJU0tJUF9JRihyZXF1aXJlX3BhcmFub2lhX2JlbG93KDEpKTsKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9jcHUoZXZlbnQsIGNwdSkpOworCUZBSUxfSUYoZXZlbnRfZW5hYmxlKGV2ZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNwdV9ldmVudF9waW5uZWRfdnNfZWJiKHZvaWQpCit7CisJdW5pb24gcGlwZSByZWFkX3BpcGUsIHdyaXRlX3BpcGU7CisJc3RydWN0IGV2ZW50IGV2ZW50OworCWludCBjcHUsIHJjOworCXBpZF90IHBpZDsKKworCWNwdSA9IHBpY2tfb25saW5lX2NwdSgpOworCUZBSUxfSUYoY3B1IDwgMCk7CisJRkFJTF9JRihiaW5kX3RvX2NwdShjcHUpKTsKKworCUZBSUxfSUYocGlwZShyZWFkX3BpcGUuZmRzKSA9PSAtMSk7CisJRkFJTF9JRihwaXBlKHdyaXRlX3BpcGUuZmRzKSA9PSAtMSk7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIE5CIG9yZGVyIG9mIHBpcGVzIGxvb2tzIHJldmVyc2VkICovCisJCWV4aXQoZWJiX2NoaWxkKHdyaXRlX3BpcGUsIHJlYWRfcGlwZSkpOworCX0KKworCS8qIFdlIHNldHVwIHRoZSBjcHUgZXZlbnQgZmlyc3QgKi8KKwlyYyA9IHNldHVwX2NwdV9ldmVudCgmZXZlbnQsIGNwdSk7CisJaWYgKHJjKSB7CisJCWtpbGxfY2hpbGRfYW5kX3dhaXQocGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFNpZ25hbCB0aGUgY2hpbGQgdG8gaW5zdGFsbCBpdHMgRUJCIGV2ZW50IGFuZCB3YWl0ICovCisJaWYgKHN5bmNfd2l0aF9jaGlsZChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpKQorCQkvKiBJZiBpdCBmYWlscywgd2FpdCBmb3IgaXQgdG8gZXhpdCAqLworCQlnb3RvIHdhaXQ7CisKKwkvKiBTaWduYWwgdGhlIGNoaWxkIHRvIHJ1biAqLworCUZBSUxfSUYoc3luY193aXRoX2NoaWxkKHJlYWRfcGlwZSwgd3JpdGVfcGlwZSkpOworCit3YWl0OgorCS8qIFdlIGV4cGVjdCBpdCB0byBmYWlsIHRvIHJlYWQgdGhlIGV2ZW50ICovCisJRkFJTF9JRih3YWl0X2Zvcl9jaGlsZChwaWQpICE9IDIpOworCisJRkFJTF9JRihldmVudF9kaXNhYmxlKCZldmVudCkpOworCUZBSUxfSUYoZXZlbnRfcmVhZCgmZXZlbnQpKTsKKworCWV2ZW50X3JlcG9ydCgmZXZlbnQpOworCisJLyogVGhlIGNwdSBldmVudCBzaG91bGQgaGF2ZSBydW4gKi8KKwlGQUlMX0lGKGV2ZW50LnJlc3VsdC52YWx1ZSA9PSAwKTsKKwlGQUlMX0lGKGV2ZW50LnJlc3VsdC5lbmFibGVkICE9IGV2ZW50LnJlc3VsdC5ydW5uaW5nKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3MoY3B1X2V2ZW50X3Bpbm5lZF92c19lYmIsICJjcHVfZXZlbnRfcGlubmVkX3ZzX2ViYiIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2NwdV9ldmVudF92c19lYmJfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2NwdV9ldmVudF92c19lYmJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTcyYzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvY3B1X2V2ZW50X3ZzX2ViYl90ZXN0LmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3RzIGEgY3B1IGV2ZW50IHZzIGFuIEVCQiAtIGluIHRoYXQgb3JkZXIuIFRoZSBFQkIgc2hvdWxkIGZvcmNlIHRoZSBjcHUKKyAqIGV2ZW50IG9mZiB0aGUgUE1VLgorICovCisKK3N0YXRpYyBpbnQgc2V0dXBfY3B1X2V2ZW50KHN0cnVjdCBldmVudCAqZXZlbnQsIGludCBjcHUpCit7CisJZXZlbnRfaW5pdF9uYW1lZChldmVudCwgMHg0MDBGQSwgIlBNX1JVTl9JTlNUX0NNUEwiKTsKKworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC0+YXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgPSAxOworCisJU0tJUF9JRihyZXF1aXJlX3BhcmFub2lhX2JlbG93KDEpKTsKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9jcHUoZXZlbnQsIGNwdSkpOworCUZBSUxfSUYoZXZlbnRfZW5hYmxlKGV2ZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNwdV9ldmVudF92c19lYmIodm9pZCkKK3sKKwl1bmlvbiBwaXBlIHJlYWRfcGlwZSwgd3JpdGVfcGlwZTsKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisJaW50IGNwdSwgcmM7CisJcGlkX3QgcGlkOworCisJY3B1ID0gcGlja19vbmxpbmVfY3B1KCk7CisJRkFJTF9JRihjcHUgPCAwKTsKKwlGQUlMX0lGKGJpbmRfdG9fY3B1KGNwdSkpOworCisJRkFJTF9JRihwaXBlKHJlYWRfcGlwZS5mZHMpID09IC0xKTsKKwlGQUlMX0lGKHBpcGUod3JpdGVfcGlwZS5mZHMpID09IC0xKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogTkIgb3JkZXIgb2YgcGlwZXMgbG9va3MgcmV2ZXJzZWQgKi8KKwkJZXhpdChlYmJfY2hpbGQod3JpdGVfcGlwZSwgcmVhZF9waXBlKSk7CisJfQorCisJLyogV2Ugc2V0dXAgdGhlIGNwdSBldmVudCBmaXJzdCAqLworCXJjID0gc2V0dXBfY3B1X2V2ZW50KCZldmVudCwgY3B1KTsKKwlpZiAocmMpIHsKKwkJa2lsbF9jaGlsZF9hbmRfd2FpdChwaWQpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogU2lnbmFsIHRoZSBjaGlsZCB0byBpbnN0YWxsIGl0cyBFQkIgZXZlbnQgYW5kIHdhaXQgKi8KKwlpZiAoc3luY193aXRoX2NoaWxkKHJlYWRfcGlwZSwgd3JpdGVfcGlwZSkpCisJCS8qIElmIGl0IGZhaWxzLCB3YWl0IGZvciBpdCB0byBleGl0ICovCisJCWdvdG8gd2FpdDsKKworCS8qIFNpZ25hbCB0aGUgY2hpbGQgdG8gcnVuICovCisJRkFJTF9JRihzeW5jX3dpdGhfY2hpbGQocmVhZF9waXBlLCB3cml0ZV9waXBlKSk7CisKK3dhaXQ6CisJLyogV2UgZXhwZWN0IHRoZSBjaGlsZCB0byBzdWNjZWVkICovCisJRkFJTF9JRih3YWl0X2Zvcl9jaGlsZChwaWQpKTsKKworCUZBSUxfSUYoZXZlbnRfZGlzYWJsZSgmZXZlbnQpKTsKKwlGQUlMX0lGKGV2ZW50X3JlYWQoJmV2ZW50KSk7CisKKwlldmVudF9yZXBvcnQoJmV2ZW50KTsKKworCS8qIFRoZSBjcHUgZXZlbnQgbWF5IGhhdmUgcnVuICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKGNwdV9ldmVudF92c19lYmIsICJjcHVfZXZlbnRfdnNfZWJiIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvY3ljbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jeWNsZXNfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTBmYzEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvY3ljbGVzX3Rlc3QuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJlYmIuaCIKKworCisvKgorICogQmFzaWMgdGVzdCB0aGF0IGNvdW50cyB1c2VyIGN5Y2xlcyBhbmQgdGFrZXMgRUJCcy4KKyAqLworaW50IGN5Y2xlcyh2b2lkKQoreworCXN0cnVjdCBldmVudCBldmVudDsKKworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50LCAweDEwMDFlLCAiY3ljbGVzIik7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDEpOworCXNldHVwX2ViYl9oYW5kbGVyKHN0YW5kYXJkX2ViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisJRkFJTF9JRihlYmJfZXZlbnRfZW5hYmxlKCZldmVudCkpOworCisJbXRzcHIoU1BSTl9QTUMxLCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisKKwl3aGlsZSAoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA8IDEwKSB7CisJCUZBSUxfSUYoY29yZV9idXN5X2xvb3AoKSk7CisJCUZBSUxfSUYoZWJiX2NoZWNrX21tY3IwKCkpOworCX0KKworCWViYl9nbG9iYWxfZGlzYWJsZSgpOworCWViYl9mcmVlemVfcG1jcygpOworCisJY291bnRfcG1jKDEsIHNhbXBsZV9wZXJpb2QpOworCisJZHVtcF9lYmJfc3RhdGUoKTsKKworCWV2ZW50X2Nsb3NlKCZldmVudCk7CisKKwlGQUlMX0lGKGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQgPT0gMCk7CisJRkFJTF9JRighZWJiX2NoZWNrX2NvdW50KDEsIHNhbXBsZV9wZXJpb2QsIDEwMCkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhjeWNsZXMsICJjeWNsZXMiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jeWNsZXNfd2l0aF9mcmVlemVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2N5Y2xlc193aXRoX2ZyZWV6ZV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0YjNmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9jeWNsZXNfd2l0aF9mcmVlemVfdGVzdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3Qgb2YgY291bnRpbmcgY3ljbGVzIHdoaWxlIHVzaW5nIE1NQ1IwX0ZDIChmcmVlemUgY291bnRlcnMpIHRvIG9ubHkgY291bnQKKyAqIHBhcnRzIG9mIHRoZSBjb2RlLiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgRkMgaXMgc2V0IGJ5IHRoZQorICogaGFyZHdhcmUgd2hlbiB0aGUgZXZlbnQgb3ZlcmZsb3dzLiBXZSBtYXkgdGFrZSB0aGUgRUJCIGFmdGVyIHdlIGhhdmUgc2V0IEZDLAorICogc28gd2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IHdoZXRoZXIgd2UgY2xlYXIgRkMgYXQgdGhlIGVuZCBvZiB0aGUgRUJCCisgKiBoYW5kbGVyIG9yIG5vdC4KKyAqLworCitzdGF0aWMgYm9vbCBjb3VudGVyc19mcm96ZW4gPSBmYWxzZTsKK3N0YXRpYyBpbnQgZWJic193aGlsZV9mcm96ZW4gPSAwOworCitzdGF0aWMgdm9pZCBlYmJfY2FsbGVlKHZvaWQpCit7CisJdWludDY0X3QgbWFzaywgdmFsOworCisJbWFzayA9IE1NQ1IwX1BNQU8gfCBNTUNSMF9GQzsKKworCXZhbCA9IG1mc3ByKFNQUk5fQkVTQ1IpOworCWlmICghKHZhbCAmIEJFU0NSX1BNRU8pKSB7CisJCWViYl9zdGF0ZS5zdGF0cy5zcHVyaW91cysrOworCQlnb3RvIG91dDsKKwl9CisKKwllYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50Kys7CisJdHJhY2VfbG9nX2NvdW50ZXIoZWJiX3N0YXRlLnRyYWNlLCBlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50KTsKKworCXZhbCA9IG1mc3ByKFNQUk5fTU1DUjApOworCXRyYWNlX2xvZ19yZWcoZWJiX3N0YXRlLnRyYWNlLCBTUFJOX01NQ1IwLCB2YWwpOworCisJaWYgKGNvdW50ZXJzX2Zyb3plbikgeworCQl0cmFjZV9sb2dfc3RyaW5nKGViYl9zdGF0ZS50cmFjZSwgImZyb3plbiIpOworCQllYmJzX3doaWxlX2Zyb3plbisrOworCQltYXNrICY9IH5NTUNSMF9GQzsKKwl9CisKKwljb3VudF9wbWMoMSwgc2FtcGxlX3BlcmlvZCk7CitvdXQ6CisJcmVzZXRfZWJiX3dpdGhfY2xlYXJfbWFzayhtYXNrKTsKK30KKworaW50IGN5Y2xlc193aXRoX2ZyZWV6ZSh2b2lkKQoreworCXN0cnVjdCBldmVudCBldmVudDsKKwl1aW50NjRfdCB2YWw7CisJYm9vbCBmY19jbGVhcmVkOworCisJZXZlbnRfaW5pdF9uYW1lZCgmZXZlbnQsIDB4MTAwMWUsICJjeWNsZXMiKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKworCWV2ZW50LmF0dHIuZXhjbHVkZV9rZXJuZWwgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9odiA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2lkbGUgPSAxOworCisJRkFJTF9JRihldmVudF9vcGVuKCZldmVudCkpOworCisJc2V0dXBfZWJiX2hhbmRsZXIoZWJiX2NhbGxlZSk7CisJZWJiX2dsb2JhbF9lbmFibGUoKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKworCWZjX2NsZWFyZWQgPSBmYWxzZTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBsb29wIHVudGlsIHdlIHRha2UgYXQgbGVhc3Qgb25lIEVCQiAqLworCXdoaWxlICgoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA8IDIwICYmICFmY19jbGVhcmVkKSB8fAorCQllYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50IDwgMSkKKwl7CisJCWNvdW50ZXJzX2Zyb3plbiA9IGZhbHNlOworCQltYigpOworCQltdHNwcihTUFJOX01NQ1IwLCBtZnNwcihTUFJOX01NQ1IwKSAmIH5NTUNSMF9GQyk7CisKKwkJRkFJTF9JRihjb3JlX2J1c3lfbG9vcCgpKTsKKworCQljb3VudGVyc19mcm96ZW4gPSB0cnVlOworCQltYigpOworCQltdHNwcihTUFJOX01NQ1IwLCBtZnNwcihTUFJOX01NQ1IwKSB8ICBNTUNSMF9GQyk7CisKKwkJdmFsID0gbWZzcHIoU1BSTl9NTUNSMCk7CisJCWlmICghICh2YWwgJiBNTUNSMF9GQykpIHsKKwkJCXByaW50ZigiT3V0c2lkZSBvZiBsb29wLCBGQyBOT1Qgc2V0IE1NQ1IwIDB4JWx4XG4iLCB2YWwpOworCQkJZmNfY2xlYXJlZCA9IHRydWU7CisJCX0KKwl9CisKKwllYmJfZ2xvYmFsX2Rpc2FibGUoKTsKKwllYmJfZnJlZXplX3BtY3MoKTsKKworCWNvdW50X3BtYygxLCBzYW1wbGVfcGVyaW9kKTsKKworCWR1bXBfZWJiX3N0YXRlKCk7CisKKwlwcmludGYoIkVCQnMgd2hpbGUgZnJvemVuICVkXG4iLCBlYmJzX3doaWxlX2Zyb3plbik7CisKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisJRkFJTF9JRihlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50ID09IDApOworCUZBSUxfSUYoZmNfY2xlYXJlZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKGN5Y2xlc193aXRoX2ZyZWV6ZSwgImN5Y2xlc193aXRoX2ZyZWV6ZSIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2ViYi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2ViYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDZiZTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFCS8qIEZvciBDUFVfWkVSTyBldGMuICovCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgInRyYWNlLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZWJiLmgiCisKKwordm9pZCAoKmViYl91c2VyX2Z1bmMpKHZvaWQpOworCit2b2lkIGViYl9ob29rKHZvaWQpCit7CisJaWYgKGViYl91c2VyX2Z1bmMpCisJCWViYl91c2VyX2Z1bmMoKTsKK30KKworc3RydWN0IGViYl9zdGF0ZSBlYmJfc3RhdGU7CisKK3U2NCBzYW1wbGVfcGVyaW9kID0gMHg0MDAwMDAwMHVsbDsKKwordm9pZCByZXNldF9lYmJfd2l0aF9jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbW1jcjBfY2xlYXJfbWFzaykKK3sKKwl1NjQgdmFsOworCisJLyogMikgY2xlYXIgTU1DUjBbUE1BT10gLSBkb2NzIHNheSBCRVNDUltQTUVPXSBzaG91bGQgZG8gdGhpcyAqLworCS8qIDMpIHNldCBNTUNSMFtQTUFFXQktIGRvY3Mgc2F5IEJFU0NSW1BNRV0gc2hvdWxkIGRvIHRoaXMgKi8KKwl2YWwgPSBtZnNwcihTUFJOX01NQ1IwKTsKKwltdHNwcihTUFJOX01NQ1IwLCAodmFsICYgfm1tY3IwX2NsZWFyX21hc2spIHwgTU1DUjBfUE1BRSk7CisKKwkvKiA0KSBjbGVhciBCRVNDUltQTUVPXSAqLworCW10c3ByKFNQUk5fQkVTQ1JSLCBCRVNDUl9QTUVPKTsKKworCS8qIDUpIHNldCBCRVNDUltQTUVdICovCisJbXRzcHIoU1BSTl9CRVNDUlMsIEJFU0NSX1BNRSk7CisKKwkvKiA2KSByZmViYiAxIC0gZG9uZSBpbiBvdXIgY2FsbGVyICovCit9CisKK3ZvaWQgcmVzZXRfZWJiKHZvaWQpCit7CisJcmVzZXRfZWJiX3dpdGhfY2xlYXJfbWFzayhNTUNSMF9QTUFPIHwgTU1DUjBfRkMpOworfQorCisvKiBDYWxsZWQgb3V0c2lkZSBvZiB0aGUgRUJCIGhhbmRsZXIgdG8gY2hlY2sgTU1DUjAgaXMgc2FuZSAqLworaW50IGViYl9jaGVja19tbWNyMCh2b2lkKQoreworCXU2NCB2YWw7CisKKwl2YWwgPSBtZnNwcihTUFJOX01NQ1IwKTsKKwlpZiAoKHZhbCAmIChNTUNSMF9GQyB8IE1NQ1IwX1BNQU8pKSA9PSBNTUNSMF9GQykgeworCQkvKiBJdCdzIE9LIGlmIHdlIHNlZSBGQyAmIFBNQU8sIGJ1dCBub3QgRkMgYnkgaXRzZWxmICovCisJCXByaW50ZigiT3V0c2lkZSBvZiBsb29wLCBvbmx5IEZDIHNldCAweCVsbHhcbiIsIHZhbCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitib29sIGViYl9jaGVja19jb3VudChpbnQgcG1jLCB1NjQgc2FtcGxlX3BlcmlvZCwgaW50IGZ1ZGdlKQoreworCXU2NCBjb3VudCwgdXBwZXIsIGxvd2VyOworCisJY291bnQgPSBlYmJfc3RhdGUuc3RhdHMucG1jX2NvdW50W1BNQ19JTkRFWChwbWMpXTsKKworCWxvd2VyID0gZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCAqIChzYW1wbGVfcGVyaW9kIC0gZnVkZ2UpOworCisJaWYgKGNvdW50IDwgbG93ZXIpIHsKKwkJcHJpbnRmKCJQTUMlZCBjb3VudCAoMHglbGx4KSBiZWxvdyBsb3dlciBsaW1pdCAweCVsbHggKC0weCVsbHgpXG4iLAorCQkJcG1jLCBjb3VudCwgbG93ZXIsIGxvd2VyIC0gY291bnQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdXBwZXIgPSBlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50ICogKHNhbXBsZV9wZXJpb2QgKyBmdWRnZSk7CisKKwlpZiAoY291bnQgPiB1cHBlcikgeworCQlwcmludGYoIlBNQyVkIGNvdW50ICgweCVsbHgpIGFib3ZlIHVwcGVyIGxpbWl0IDB4JWxseCAoKzB4JWxseClcbiIsCisJCQlwbWMsIGNvdW50LCB1cHBlciwgY291bnQgLSB1cHBlcik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcmludGYoIlBNQyVkIGNvdW50ICgweCVsbHgpIGlzIGJldHdlZW4gMHglbGx4IGFuZCAweCVsbHggZGVsdGEgKzB4JWxseC8tMHglbGx4XG4iLAorCQlwbWMsIGNvdW50LCBsb3dlciwgdXBwZXIsIGNvdW50IC0gbG93ZXIsIHVwcGVyIC0gY291bnQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgc3RhbmRhcmRfZWJiX2NhbGxlZSh2b2lkKQoreworCWludCBmb3VuZCwgaTsKKwl1NjQgdmFsOworCisJdmFsID0gbWZzcHIoU1BSTl9CRVNDUik7CisJaWYgKCEodmFsICYgQkVTQ1JfUE1FTykpIHsKKwkJZWJiX3N0YXRlLnN0YXRzLnNwdXJpb3VzKys7CisJCWdvdG8gb3V0OworCX0KKworCWViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQrKzsKKwl0cmFjZV9sb2dfY291bnRlcihlYmJfc3RhdGUudHJhY2UsIGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQpOworCisJdmFsID0gbWZzcHIoU1BSTl9NTUNSMCk7CisJdHJhY2VfbG9nX3JlZyhlYmJfc3RhdGUudHJhY2UsIFNQUk5fTU1DUjAsIHZhbCk7CisKKwlmb3VuZCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSA2OyBpKyspIHsKKwkJaWYgKGViYl9zdGF0ZS5wbWNfZW5hYmxlW1BNQ19JTkRFWChpKV0pCisJCQlmb3VuZCArPSBjb3VudF9wbWMoaSwgc2FtcGxlX3BlcmlvZCk7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJZWJiX3N0YXRlLnN0YXRzLm5vX292ZXJmbG93Kys7CisKK291dDoKKwlyZXNldF9lYmIoKTsKK30KKworZXh0ZXJuIHZvaWQgZWJiX2hhbmRsZXIodm9pZCk7CisKK3ZvaWQgc2V0dXBfZWJiX2hhbmRsZXIodm9pZCAoKmNhbGxlZSkodm9pZCkpCit7CisJdTY0IGVudHJ5OworCisjaWYgZGVmaW5lZChfQ0FMTF9FTEYpICYmIF9DQUxMX0VMRiA9PSAyCisJZW50cnkgPSAodTY0KWViYl9oYW5kbGVyOworI2Vsc2UKKwlzdHJ1Y3Qgb3BkCisJeworCSAgICB1NjQgZW50cnk7CisJICAgIHU2NCB0b2M7CisJfSAqb3BkOworCisJb3BkID0gKHN0cnVjdCBvcGQgKillYmJfaGFuZGxlcjsKKwllbnRyeSA9IG9wZC0+ZW50cnk7CisjZW5kaWYKKwlwcmludGYoIkVCQiBIYW5kbGVyIGlzIGF0ICUjbGx4XG4iLCBlbnRyeSk7CisKKwllYmJfdXNlcl9mdW5jID0gY2FsbGVlOworCisJLyogRW5zdXJlIGViYl91c2VyX2Z1bmMgaXMgc2V0IGJlZm9yZSB3ZSBzZXQgdGhlIGhhbmRsZXIgKi8KKwltYigpOworCW10c3ByKFNQUk5fRUJCSFIsIGVudHJ5KTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBpcyBzZXQgYmVmb3JlIHdlIHJldHVybiAqLworCW1iKCk7Cit9CisKK3ZvaWQgY2xlYXJfZWJiX3N0YXRzKHZvaWQpCit7CisJbWVtc2V0KCZlYmJfc3RhdGUuc3RhdHMsIDAsIHNpemVvZihlYmJfc3RhdGUuc3RhdHMpKTsKK30KKwordm9pZCBkdW1wX3N1bW1hcnlfZWJiX3N0YXRlKHZvaWQpCit7CisJcHJpbnRmKCJlYmJfc3RhdGU6XG4iCQkJXAorCSAgICAgICAiICBlYmJfY291bnQgICAgPSAlZFxuIgkJXAorCSAgICAgICAiICBzcHVyaW91cyAgICAgPSAlZFxuIgkJXAorCSAgICAgICAiICBuZWdhdGl2ZSAgICAgPSAlZFxuIgkJXAorCSAgICAgICAiICBub19vdmVyZmxvdyAgPSAlZFxuIgkJXAorCSAgICAgICAiICBwbWNbMV0gY291bnQgPSAweCVsbHhcbiIJXAorCSAgICAgICAiICBwbWNbMl0gY291bnQgPSAweCVsbHhcbiIJXAorCSAgICAgICAiICBwbWNbM10gY291bnQgPSAweCVsbHhcbiIJXAorCSAgICAgICAiICBwbWNbNF0gY291bnQgPSAweCVsbHhcbiIJXAorCSAgICAgICAiICBwbWNbNV0gY291bnQgPSAweCVsbHhcbiIJXAorCSAgICAgICAiICBwbWNbNl0gY291bnQgPSAweCVsbHhcbiIsCisJCWViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQsIGViYl9zdGF0ZS5zdGF0cy5zcHVyaW91cywKKwkJZWJiX3N0YXRlLnN0YXRzLm5lZ2F0aXZlLCBlYmJfc3RhdGUuc3RhdHMubm9fb3ZlcmZsb3csCisJCWViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbMF0sIGViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbMV0sCisJCWViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbMl0sIGViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbM10sCisJCWViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbNF0sIGViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbNV0pOworfQorCitzdGF0aWMgY2hhciAqZGVjb2RlX21tY3IwKHUzMiB2YWx1ZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTZdOworCisJYnVmWzBdID0gJ1wwJzsKKworCWlmICh2YWx1ZSAmICgxIDw8IDMxKSkKKwkJc3RyY2F0KGJ1ZiwgIkZDICIpOworCWlmICh2YWx1ZSAmICgxIDw8IDI2KSkKKwkJc3RyY2F0KGJ1ZiwgIlBNQUUgIik7CisJaWYgKHZhbHVlICYgKDEgPDwgNykpCisJCXN0cmNhdChidWYsICJQTUFPICIpOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKmRlY29kZV9iZXNjcih1NjQgdmFsdWUpCit7CisJc3RhdGljIGNoYXIgYnVmWzE2XTsKKworCWJ1ZlswXSA9ICdcMCc7CisKKwlpZiAodmFsdWUgJiAoMXVsbCA8PCA2MykpCisJCXN0cmNhdChidWYsICJHRSAiKTsKKwlpZiAodmFsdWUgJiAoMXVsbCA8PCAzMikpCisJCXN0cmNhdChidWYsICJQTUFFICIpOworCWlmICh2YWx1ZSAmIDEpCisJCXN0cmNhdChidWYsICJQTUFPICIpOworCisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBkdW1wX2ViYl9od19zdGF0ZSh2b2lkKQoreworCXU2NCBiZXNjcjsKKwl1MzIgbW1jcjA7CisKKwltbWNyMCA9IG1mc3ByKFNQUk5fTU1DUjApOworCWJlc2NyID0gbWZzcHIoU1BSTl9CRVNDUik7CisKKwlwcmludGYoIkhXIHN0YXRlOlxuIgkJXAorCSAgICAgICAiTU1DUjAgMHglMDE2eCAlc1xuIglcCisJICAgICAgICJFQkJIUiAweCUwMTZseFxuIglcCisJICAgICAgICJCRVNDUiAweCUwMTZsbHggJXNcbiIJXAorCSAgICAgICAiUE1DMSAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiUE1DMiAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiUE1DMyAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiUE1DNCAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiUE1DNSAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiUE1DNiAgMHglMDE2bHhcbiIJXAorCSAgICAgICAiU0lBUiAgMHglMDE2bHhcbiIsCisJICAgICAgIG1tY3IwLCBkZWNvZGVfbW1jcjAobW1jcjApLCBtZnNwcihTUFJOX0VCQkhSKSwgYmVzY3IsCisJICAgICAgIGRlY29kZV9iZXNjcihiZXNjciksIG1mc3ByKFNQUk5fUE1DMSksIG1mc3ByKFNQUk5fUE1DMiksCisJICAgICAgIG1mc3ByKFNQUk5fUE1DMyksIG1mc3ByKFNQUk5fUE1DNCksIG1mc3ByKFNQUk5fUE1DNSksCisJICAgICAgIG1mc3ByKFNQUk5fUE1DNiksIG1mc3ByKFNQUk5fU0lBUikpOworfQorCit2b2lkIGR1bXBfZWJiX3N0YXRlKHZvaWQpCit7CisJZHVtcF9zdW1tYXJ5X2ViYl9zdGF0ZSgpOworCisJZHVtcF9lYmJfaHdfc3RhdGUoKTsKKworCXRyYWNlX2J1ZmZlcl9wcmludChlYmJfc3RhdGUudHJhY2UpOworfQorCitpbnQgY291bnRfcG1jKGludCBwbWMsIHVpbnQzMl90IHNhbXBsZV9wZXJpb2QpCit7CisJdWludDMyX3Qgc3RhcnRfdmFsdWU7CisJdTY0IHZhbDsKKworCS8qIDApIFJlYWQgUE1DICovCisJc3RhcnRfdmFsdWUgPSBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKTsKKworCXZhbCA9IHJlYWRfcG1jKHBtYyk7CisJaWYgKHZhbCA8IHN0YXJ0X3ZhbHVlKQorCQllYmJfc3RhdGUuc3RhdHMubmVnYXRpdmUrKzsKKwllbHNlCisJCWViYl9zdGF0ZS5zdGF0cy5wbWNfY291bnRbUE1DX0lOREVYKHBtYyldICs9IHZhbCAtIHN0YXJ0X3ZhbHVlOworCisJdHJhY2VfbG9nX3JlZyhlYmJfc3RhdGUudHJhY2UsIFNQUk5fUE1DMSArIHBtYyAtIDEsIHZhbCk7CisKKwkvKiAxKSBSZXNldCBQTUMgKi8KKwl3cml0ZV9wbWMocG1jLCBzdGFydF92YWx1ZSk7CisKKwkvKiBSZXBvcnQgaWYgd2Ugb3ZlcmZsb3dlZCAqLworCXJldHVybiB2YWwgPj0gQ09VTlRFUl9PVkVSRkxPVzsKK30KKworaW50IGViYl9ldmVudF9lbmFibGUoc3RydWN0IGV2ZW50ICplKQoreworCWludCByYzsKKworCS8qIEVuc3VyZSBhbnkgU1BSIHdyaXRlcyBhcmUgb3JkZXJlZCB2cyB1cyAqLworCW1iKCk7CisKKwlyYyA9IGlvY3RsKGUtPmZkLCBQRVJGX0VWRU5UX0lPQ19FTkFCTEUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBldmVudF9yZWFkKGUpOworCisJLyogRGl0dG8gKi8KKwltYigpOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIGViYl9mcmVlemVfcG1jcyh2b2lkKQoreworCW10c3ByKFNQUk5fTU1DUjAsIG1mc3ByKFNQUk5fTU1DUjApIHwgTU1DUjBfRkMpOworCW1iKCk7Cit9CisKK3ZvaWQgZWJiX3VuZnJlZXplX3BtY3Modm9pZCkKK3sKKwkvKiBVbmZyZWV6ZSBjb3VudGVycyAqLworCW10c3ByKFNQUk5fTU1DUjAsIG1mc3ByKFNQUk5fTU1DUjApICYgfk1NQ1IwX0ZDKTsKKwltYigpOworfQorCit2b2lkIGViYl9nbG9iYWxfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEVCQnMgZ2xvYmFsbHkgYW5kIFBNVSBFQkJzICovCisJbXRzcHIoU1BSTl9CRVNDUiwgMHg4MDAwMDAwMTAwMDAwMDAwdWxsKTsKKwltYigpOworfQorCit2b2lkIGViYl9nbG9iYWxfZGlzYWJsZSh2b2lkKQoreworCS8qIERpc2FibGUgRUJCcyAmIGZyZWV6ZSBjb3VudGVycywgZXZlbnRzIGFyZSBzdGlsbCBzY2hlZHVsZWQgKi8KKwltdHNwcihTUFJOX0JFU0NSUiwgQkVTQ1JfUE1FKTsKKwltYigpOworfQorCit2b2lkIGV2ZW50X2ViYl9pbml0KHN0cnVjdCBldmVudCAqZSkKK3sKKwllLT5hdHRyLmNvbmZpZyB8PSAoMXVsbCA8PCA2Myk7Cit9CisKK3ZvaWQgZXZlbnRfYmhyYl9pbml0KHN0cnVjdCBldmVudCAqZSwgdW5zaWduZWQgaWZtKQoreworCWUtPmF0dHIuY29uZmlnIHw9ICgxdWxsIDw8IDYyKSB8ICgodTY0KWlmbSA8PCA2MCk7Cit9CisKK3ZvaWQgZXZlbnRfbGVhZGVyX2ViYl9pbml0KHN0cnVjdCBldmVudCAqZSkKK3sKKwlldmVudF9lYmJfaW5pdChlKTsKKworCWUtPmF0dHIuZXhjbHVzaXZlID0gMTsKKwllLT5hdHRyLnBpbm5lZCA9IDE7Cit9CisKK2ludCBjb3JlX2J1c3lfbG9vcCh2b2lkKQoreworCWludCByYzsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJsaSAgMywgIDB4MzAzMFxuIgorCQkic3RkIDMsICAtOTYoMSlcbiIKKwkJImxpICA0LCAgMHg0MDQwXG4iCisJCSJzdGQgNCwgIC0xMDQoMSlcbiIKKwkJImxpICA1LCAgMHg1MDUwXG4iCisJCSJzdGQgNSwgIC0xMTIoMSlcbiIKKwkJImxpICA2LCAgMHg2MDYwXG4iCisJCSJzdGQgNiwgIC0xMjAoMSlcbiIKKwkJImxpICA3LCAgMHg3MDcwXG4iCisJCSJzdGQgNywgIC0xMjgoMSlcbiIKKwkJImxpICA4LCAgMHgwODA4XG4iCisJCSJzdGQgOCwgIC0xMzYoMSlcbiIKKwkJImxpICA5LCAgMHgwOTA5XG4iCisJCSJzdGQgOSwgIC0xNDQoMSlcbiIKKwkJImxpICAxMCwgMHgxMDEwXG4iCisJCSJzdGQgMTAsIC0xNTIoMSlcbiIKKwkJImxpICAxMSwgMHgxMTExXG4iCisJCSJzdGQgMTEsIC0xNjAoMSlcbiIKKwkJImxpICAxNCwgMHgxNDE0XG4iCisJCSJzdGQgMTQsIC0xNjgoMSlcbiIKKwkJImxpICAxNSwgMHgxNTE1XG4iCisJCSJzdGQgMTUsIC0xNzYoMSlcbiIKKwkJImxpICAxNiwgMHgxNjE2XG4iCisJCSJzdGQgMTYsIC0xODQoMSlcbiIKKwkJImxpICAxNywgMHgxNzE3XG4iCisJCSJzdGQgMTcsIC0xOTIoMSlcbiIKKwkJImxpICAxOCwgMHgxODE4XG4iCisJCSJzdGQgMTgsIC0yMDAoMSlcbiIKKwkJImxpICAxOSwgMHgxOTE5XG4iCisJCSJzdGQgMTksIC0yMDgoMSlcbiIKKwkJImxpICAyMCwgMHgyMDIwXG4iCisJCSJzdGQgMjAsIC0yMTYoMSlcbiIKKwkJImxpICAyMSwgMHgyMTIxXG4iCisJCSJzdGQgMjEsIC0yMjQoMSlcbiIKKwkJImxpICAyMiwgMHgyMjIyXG4iCisJCSJzdGQgMjIsIC0yMzIoMSlcbiIKKwkJImxpICAyMywgMHgyMzIzXG4iCisJCSJzdGQgMjMsIC0yNDAoMSlcbiIKKwkJImxpICAyNCwgMHgyNDI0XG4iCisJCSJzdGQgMjQsIC0yNDgoMSlcbiIKKwkJImxpICAyNSwgMHgyNTI1XG4iCisJCSJzdGQgMjUsIC0yNTYoMSlcbiIKKwkJImxpICAyNiwgMHgyNjI2XG4iCisJCSJzdGQgMjYsIC0yNjQoMSlcbiIKKwkJImxpICAyNywgMHgyNzI3XG4iCisJCSJzdGQgMjcsIC0yNzIoMSlcbiIKKwkJImxpICAyOCwgMHgyODI4XG4iCisJCSJzdGQgMjgsIC0yODAoMSlcbiIKKwkJImxpICAyOSwgMHgyOTI5XG4iCisJCSJzdGQgMjksIC0yODgoMSlcbiIKKwkJImxpICAzMCwgMHgzMDMwXG4iCisJCSJsaSAgMzEsIDB4MzEzMVxuIgorCisJCSJsaSAgICAzLCAgMFxuIgorCQkiMDogIgorCQkiYWRkaSAgMywgMywgMVxuIgorCQkiY21wd2kgMywgMTAwXG4iCisJCSJibHQgICAwYlxuIgorCisJCS8qIFJldHVybiAxIChmYWlsKSB1bmxlc3Mgd2UgZ2V0IHRocm91Z2ggYWxsIHRoZSBjaGVja3MgKi8KKwkJImxpCTAsIDFcbiIKKworCQkvKiBDaGVjayBub25lIG9mIG91ciByZWdpc3RlcnMgaGF2ZSBiZWVuIGNvcnJ1cHRlZCAqLworCQkiY21wd2kgIDQsICAweDQwNDBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDUsICAweDUwNTBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDYsICAweDYwNjBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDcsICAweDcwNzBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDgsICAweDA4MDhcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDksICAweDA5MDlcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDEwLCAweDEwMTBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDExLCAweDExMTFcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE0LCAweDE0MTRcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE1LCAweDE1MTVcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE2LCAweDE2MTZcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE3LCAweDE3MTdcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE4LCAweDE4MThcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDE5LCAweDE5MTlcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDIwLCAweDIwMjBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDIxLCAweDIxMjFcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDIyLCAweDIyMjJcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDIzLCAweDIzMjNcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI0LCAweDI0MjRcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI1LCAweDI1MjVcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI2LCAweDI2MjZcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI3LCAweDI3MjdcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI4LCAweDI4MjhcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDI5LCAweDI5MjlcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDMwLCAweDMwMzBcbiIKKwkJImJuZQkxZlxuIgorCQkiY21wd2kgIDMxLCAweDMxMzFcbiIKKwkJImJuZQkxZlxuIgorCisJCS8qIExvYWQganVuayBpbnRvIGFsbCBvdXIgcmVnaXN0ZXJzIGJlZm9yZSB3ZSByZWxvYWQgdGhlbSBmcm9tIHRoZSBzdGFjay4gKi8KKwkJImxpICAzLCAgMHhkZVxuIgorCQkibGkgIDQsICAweGFkXG4iCisJCSJsaSAgNSwgIDB4YmVcbiIKKwkJImxpICA2LCAgMHhlZlxuIgorCQkibGkgIDcsICAweGRlXG4iCisJCSJsaSAgOCwgIDB4YWRcbiIKKwkJImxpICA5LCAgMHhiZVxuIgorCQkibGkgIDEwLCAweGVmXG4iCisJCSJsaSAgMTEsIDB4ZGVcbiIKKwkJImxpICAxNCwgMHhhZFxuIgorCQkibGkgIDE1LCAweGJlXG4iCisJCSJsaSAgMTYsIDB4ZWZcbiIKKwkJImxpICAxNywgMHhkZVxuIgorCQkibGkgIDE4LCAweGFkXG4iCisJCSJsaSAgMTksIDB4YmVcbiIKKwkJImxpICAyMCwgMHhlZlxuIgorCQkibGkgIDIxLCAweGRlXG4iCisJCSJsaSAgMjIsIDB4YWRcbiIKKwkJImxpICAyMywgMHhiZVxuIgorCQkibGkgIDI0LCAweGVmXG4iCisJCSJsaSAgMjUsIDB4ZGVcbiIKKwkJImxpICAyNiwgMHhhZFxuIgorCQkibGkgIDI3LCAweGJlXG4iCisJCSJsaSAgMjgsIDB4ZWZcbiIKKwkJImxpICAyOSwgMHhkZFxuIgorCisJCSJsZCAgICAgMywgIC05NigxKVxuIgorCQkiY21wd2kgIDMsICAweDMwMzBcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDQsICAtMTA0KDEpXG4iCisJCSJjbXB3aSAgNCwgIDB4NDA0MFxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgNSwgIC0xMTIoMSlcbiIKKwkJImNtcHdpICA1LCAgMHg1MDUwXG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICA2LCAgLTEyMCgxKVxuIgorCQkiY21wd2kgIDYsICAweDYwNjBcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDcsICAtMTI4KDEpXG4iCisJCSJjbXB3aSAgNywgIDB4NzA3MFxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgOCwgIC0xMzYoMSlcbiIKKwkJImNtcHdpICA4LCAgMHgwODA4XG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICA5LCAgLTE0NCgxKVxuIgorCQkiY21wd2kgIDksICAweDA5MDlcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDEwLCAtMTUyKDEpXG4iCisJCSJjbXB3aSAgMTAsIDB4MTAxMFxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMTEsIC0xNjAoMSlcbiIKKwkJImNtcHdpICAxMSwgMHgxMTExXG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAxNCwgLTE2OCgxKVxuIgorCQkiY21wd2kgIDE0LCAweDE0MTRcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDE1LCAtMTc2KDEpXG4iCisJCSJjbXB3aSAgMTUsIDB4MTUxNVxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMTYsIC0xODQoMSlcbiIKKwkJImNtcHdpICAxNiwgMHgxNjE2XG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAxNywgLTE5MigxKVxuIgorCQkiY21wd2kgIDE3LCAweDE3MTdcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDE4LCAtMjAwKDEpXG4iCisJCSJjbXB3aSAgMTgsIDB4MTgxOFxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMTksIC0yMDgoMSlcbiIKKwkJImNtcHdpICAxOSwgMHgxOTE5XG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAyMCwgLTIxNigxKVxuIgorCQkiY21wd2kgIDIwLCAweDIwMjBcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDIxLCAtMjI0KDEpXG4iCisJCSJjbXB3aSAgMjEsIDB4MjEyMVxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMjIsIC0yMzIoMSlcbiIKKwkJImNtcHdpICAyMiwgMHgyMjIyXG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAyMywgLTI0MCgxKVxuIgorCQkiY21wd2kgIDIzLCAweDIzMjNcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDI0LCAtMjQ4KDEpXG4iCisJCSJjbXB3aSAgMjQsIDB4MjQyNFxuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMjUsIC0yNTYoMSlcbiIKKwkJImNtcHdpICAyNSwgMHgyNTI1XG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAyNiwgLTI2NCgxKVxuIgorCQkiY21wd2kgIDI2LCAweDI2MjZcbiIKKwkJImJuZQkxZlxuIgorCQkibGQgICAgIDI3LCAtMjcyKDEpXG4iCisJCSJjbXB3aSAgMjcsIDB4MjcyN1xuIgorCQkiYm5lCTFmXG4iCisJCSJsZCAgICAgMjgsIC0yODAoMSlcbiIKKwkJImNtcHdpICAyOCwgMHgyODI4XG4iCisJCSJibmUJMWZcbiIKKwkJImxkICAgICAyOSwgLTI4OCgxKVxuIgorCQkiY21wd2kgIDI5LCAweDI5MjlcbiIKKwkJImJuZQkxZlxuIgorCisJCS8qIExvYWQgMCAoc3VjY2VzcykgdG8gcmV0dXJuICovCisJCSJsaQkwLCAwXG4iCisKKwkJIjE6IAltciAlMCwgMFxuIgorCisJCTogIj1yIiAocmMpCisJCTogLyogbm8gaW5wdXRzICovCisJCTogIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAiMTEiLCAiMTQiLAorCQkgICIxNSIsICIxNiIsICIxNyIsICIxOCIsICIxOSIsICIyMCIsICIyMSIsICIyMiIsICIyMyIsCisJCSAgICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsICIzMSIsCisJCSAgICJtZW1vcnkiCisJKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNvcmVfYnVzeV9sb29wX3dpdGhfZnJlZXplKHZvaWQpCit7CisJaW50IHJjOworCisJbXRzcHIoU1BSTl9NTUNSMCwgbWZzcHIoU1BSTl9NTUNSMCkgJiB+TU1DUjBfRkMpOworCXJjID0gY29yZV9idXN5X2xvb3AoKTsKKwltdHNwcihTUFJOX01NQ1IwLCBtZnNwcihTUFJOX01NQ1IwKSB8ICBNTUNSMF9GQyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlYmJfY2hpbGQodW5pb24gcGlwZSByZWFkX3BpcGUsIHVuaW9uIHBpcGUgd3JpdGVfcGlwZSkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisJdWludDY0X3QgdmFsOworCisJRkFJTF9JRih3YWl0X2Zvcl9wYXJlbnQocmVhZF9waXBlKSk7CisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHgxMDAxZSwgImN5Y2xlcyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJZXZlbnQuYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW4oJmV2ZW50KSk7CisKKwllYmJfZW5hYmxlX3BtY19jb3VudGluZygxKTsKKwlzZXR1cF9lYmJfaGFuZGxlcihzdGFuZGFyZF9lYmJfY2FsbGVlKTsKKwllYmJfZ2xvYmFsX2VuYWJsZSgpOworCisJRkFJTF9JRihldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwlpZiAoZXZlbnRfcmVhZCgmZXZlbnQpKSB7CisJCS8qCisJCSAqIFNvbWUgdGVzdHMgZXhwZWN0IHRvIGZhaWwgaGVyZSwgc28gZG9uJ3QgcmVwb3J0IGFuIGVycm9yIG9uCisJCSAqIHRoaXMgbGluZSwgYW5kIHJldHVybiBhIGRpc3Rpbmd1aXNhYmxlIGVycm9yIGNvZGUuIFRlbGwgdGhlCisJCSAqIHBhcmVudCBhbiBlcnJvciBoYXBwZW5lZC4KKwkJICovCisJCW5vdGlmeV9wYXJlbnRfb2ZfZXJyb3Iod3JpdGVfcGlwZSk7CisJCXJldHVybiAyOworCX0KKworCW10c3ByKFNQUk5fUE1DMSwgcG1jX3NhbXBsZV9wZXJpb2Qoc2FtcGxlX3BlcmlvZCkpOworCisJRkFJTF9JRihub3RpZnlfcGFyZW50KHdyaXRlX3BpcGUpKTsKKwlGQUlMX0lGKHdhaXRfZm9yX3BhcmVudChyZWFkX3BpcGUpKTsKKwlGQUlMX0lGKG5vdGlmeV9wYXJlbnQod3JpdGVfcGlwZSkpOworCisJd2hpbGUgKGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQgPCAyMCkgeworCQlGQUlMX0lGKGNvcmVfYnVzeV9sb29wKCkpOworCisJCS8qIFRvIHRyeSBhbmQgaGl0IFNJR0lMTCBjYXNlICovCisJCXZhbCAgPSBtZnNwcihTUFJOX01NQ1JBKTsKKwkJdmFsIHw9IG1mc3ByKFNQUk5fTU1DUjIpOworCQl2YWwgfD0gbWZzcHIoU1BSTl9NTUNSMCk7CisJfQorCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisKKwljb3VudF9wbWMoMSwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX2ViYl9zdGF0ZSgpOworCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCUZBSUxfSUYoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA9PSAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgam1wX2J1ZiBzZXRqbXBfZW52OworCitzdGF0aWMgdm9pZCBzaWdpbGxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCXByaW50ZigiVG9vayBzaWdpbGxcbiIpOworCWxvbmdqbXAoc2V0am1wX2VudiwgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2lsbF9hY3Rpb24gPSB7CisJLnNhX2hhbmRsZXIgPSBzaWdpbGxfaGFuZGxlciwKK307CisKK2ludCBjYXRjaF9zaWdpbGwodm9pZCAoKmZ1bmMpKHZvaWQpKQoreworCWlmIChzaWdhY3Rpb24oU0lHSUxMLCAmc2lnaWxsX2FjdGlvbiwgTlVMTCkpIHsKKwkJcGVycm9yKCJzaWdhY3Rpb24iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNldGptcChzZXRqbXBfZW52KSA9PSAwKSB7CisJCWZ1bmMoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd3JpdGVfcG1jMSh2b2lkKQoreworCW10c3ByKFNQUk5fUE1DMSwgMCk7Cit9CisKK3ZvaWQgd3JpdGVfcG1jKGludCBwbWMsIHU2NCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHBtYykgeworCQljYXNlIDE6IG10c3ByKFNQUk5fUE1DMSwgdmFsdWUpOyBicmVhazsKKwkJY2FzZSAyOiBtdHNwcihTUFJOX1BNQzIsIHZhbHVlKTsgYnJlYWs7CisJCWNhc2UgMzogbXRzcHIoU1BSTl9QTUMzLCB2YWx1ZSk7IGJyZWFrOworCQljYXNlIDQ6IG10c3ByKFNQUk5fUE1DNCwgdmFsdWUpOyBicmVhazsKKwkJY2FzZSA1OiBtdHNwcihTUFJOX1BNQzUsIHZhbHVlKTsgYnJlYWs7CisJCWNhc2UgNjogbXRzcHIoU1BSTl9QTUM2LCB2YWx1ZSk7IGJyZWFrOworCX0KK30KKwordTY0IHJlYWRfcG1jKGludCBwbWMpCit7CisJc3dpdGNoIChwbWMpIHsKKwkJY2FzZSAxOiByZXR1cm4gbWZzcHIoU1BSTl9QTUMxKTsKKwkJY2FzZSAyOiByZXR1cm4gbWZzcHIoU1BSTl9QTUMyKTsKKwkJY2FzZSAzOiByZXR1cm4gbWZzcHIoU1BSTl9QTUMzKTsKKwkJY2FzZSA0OiByZXR1cm4gbWZzcHIoU1BSTl9QTUM0KTsKKwkJY2FzZSA1OiByZXR1cm4gbWZzcHIoU1BSTl9QTUM1KTsKKwkJY2FzZSA2OiByZXR1cm4gbWZzcHIoU1BSTl9QTUM2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVybV9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZHVtcF9zdW1tYXJ5X2ViYl9zdGF0ZSgpOworCWR1bXBfZWJiX2h3X3N0YXRlKCk7CisJYWJvcnQoKTsKK30KKworc3RydWN0IHNpZ2FjdGlvbiB0ZXJtX2FjdGlvbiA9IHsKKwkuc2FfaGFuZGxlciA9IHRlcm1faGFuZGxlciwKK307CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgZWJiX2luaXQodm9pZCkKK3sKKwljbGVhcl9lYmJfc3RhdHMoKTsKKworCWlmIChzaWdhY3Rpb24oU0lHVEVSTSwgJnRlcm1fYWN0aW9uLCBOVUxMKSkKKwkJcGVycm9yKCJzaWdhY3Rpb24iKTsKKworCWViYl9zdGF0ZS50cmFjZSA9IHRyYWNlX2J1ZmZlcl9hbGxvY2F0ZSgxICogMTAyNCAqIDEwMjQpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2ViYi5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2ViYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MmJkZTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpZm5kZWYgX1NFTEZURVNUU19QT1dFUlBDX1BNVV9FQkJfRUJCX0gKKyNkZWZpbmUgX1NFTEZURVNUU19QT1dFUlBDX1BNVV9FQkJfRUJCX0gKKworI2luY2x1ZGUgIi4uL2V2ZW50LmgiCisjaW5jbHVkZSAiLi4vbGliLmgiCisjaW5jbHVkZSAidHJhY2UuaCIKKyNpbmNsdWRlICJyZWcuaCIKKworI2RlZmluZSBQTUNfSU5ERVgocG1jKQkoKHBtYyktMSkKKworI2RlZmluZSBOVU1fUE1DX1ZBTFVFUwkxMjgKKworc3RydWN0IGViYl9zdGF0ZQoreworCXN0cnVjdCB7CisJCXU2NCBwbWNfY291bnRbNl07CisJCXZvbGF0aWxlIGludCBlYmJfY291bnQ7CisJCWludCBzcHVyaW91czsKKwkJaW50IG5lZ2F0aXZlOworCQlpbnQgbm9fb3ZlcmZsb3c7CisJfSBzdGF0czsKKworCWJvb2wgcG1jX2VuYWJsZVs2XTsKKwlzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0cmFjZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZWJiX3N0YXRlIGViYl9zdGF0ZTsKKworI2RlZmluZSBDT1VOVEVSX09WRVJGTE9XIDB4ODAwMDAwMDB1bGwKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBwbWNfc2FtcGxlX3BlcmlvZCh1aW50MzJfdCB2YWx1ZSkKK3sKKwlyZXR1cm4gQ09VTlRFUl9PVkVSRkxPVyAtIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWJiX2VuYWJsZV9wbWNfY291bnRpbmcoaW50IHBtYykKK3sKKwllYmJfc3RhdGUucG1jX2VuYWJsZVtQTUNfSU5ERVgocG1jKV0gPSB0cnVlOworfQorCitib29sIGViYl9jaGVja19jb3VudChpbnQgcG1jLCB1NjQgc2FtcGxlX3BlcmlvZCwgaW50IGZ1ZGdlKTsKK3ZvaWQgZXZlbnRfbGVhZGVyX2ViYl9pbml0KHN0cnVjdCBldmVudCAqZSk7Cit2b2lkIGV2ZW50X2ViYl9pbml0KHN0cnVjdCBldmVudCAqZSk7Cit2b2lkIGV2ZW50X2JocmJfaW5pdChzdHJ1Y3QgZXZlbnQgKmUsIHVuc2lnbmVkIGlmbSk7Cit2b2lkIHNldHVwX2ViYl9oYW5kbGVyKHZvaWQgKCpjYWxsZWUpKHZvaWQpKTsKK3ZvaWQgc3RhbmRhcmRfZWJiX2NhbGxlZSh2b2lkKTsKK2ludCBlYmJfZXZlbnRfZW5hYmxlKHN0cnVjdCBldmVudCAqZSk7Cit2b2lkIGViYl9nbG9iYWxfZW5hYmxlKHZvaWQpOwordm9pZCBlYmJfZ2xvYmFsX2Rpc2FibGUodm9pZCk7Cit2b2lkIGViYl9mcmVlemVfcG1jcyh2b2lkKTsKK3ZvaWQgZWJiX3VuZnJlZXplX3BtY3Modm9pZCk7Cit2b2lkIGV2ZW50X2ViYl9pbml0KHN0cnVjdCBldmVudCAqZSk7Cit2b2lkIGV2ZW50X2xlYWRlcl9lYmJfaW5pdChzdHJ1Y3QgZXZlbnQgKmUpOworaW50IGNvdW50X3BtYyhpbnQgcG1jLCB1aW50MzJfdCBzYW1wbGVfcGVyaW9kKTsKK3ZvaWQgZHVtcF9lYmJfc3RhdGUodm9pZCk7Cit2b2lkIGR1bXBfc3VtbWFyeV9lYmJfc3RhdGUodm9pZCk7Cit2b2lkIGR1bXBfZWJiX2h3X3N0YXRlKHZvaWQpOwordm9pZCBjbGVhcl9lYmJfc3RhdHModm9pZCk7Cit2b2lkIHdyaXRlX3BtYyhpbnQgcG1jLCB1NjQgdmFsdWUpOwordTY0IHJlYWRfcG1jKGludCBwbWMpOwordm9pZCByZXNldF9lYmJfd2l0aF9jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbW1jcjBfY2xlYXJfbWFzayk7Cit2b2lkIHJlc2V0X2ViYih2b2lkKTsKK2ludCBlYmJfY2hlY2tfbW1jcjAodm9pZCk7CisKK2V4dGVybiB1NjQgc2FtcGxlX3BlcmlvZDsKKworaW50IGNvcmVfYnVzeV9sb29wKHZvaWQpOworaW50IGNvcmVfYnVzeV9sb29wX3dpdGhfZnJlZXplKHZvaWQpOworaW50IGViYl9jaGlsZCh1bmlvbiBwaXBlIHJlYWRfcGlwZSwgdW5pb24gcGlwZSB3cml0ZV9waXBlKTsKK2ludCBjYXRjaF9zaWdpbGwodm9pZCAoKmZ1bmMpKHZvaWQpKTsKK3ZvaWQgd3JpdGVfcG1jMSh2b2lkKTsKKworI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19QTVVfRUJCX0VCQl9IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX2hhbmRsZXIuUyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9lYmJfaGFuZGxlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Mjc0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX2hhbmRsZXIuUwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxwcGMtYXNtLmg+CisjaW5jbHVkZSAicmVnLmgiCisKKworLyogcHBjLWFzbS5oIGRlZmluZXMgbW9zdCBvZiB0aGUgcmVnIGFsaWFzZXMsIGJ1dCBub3QgcjEvcjIuICovCisjZGVmaW5lIHIxIDEKKyNkZWZpbmUgcjIgMgorCisjZGVmaW5lIFJGRUJCICAgLmxvbmcgMHg0YzAwMDkyNAorCisvKiBTdGFjayBsYXlvdXQ6CisgKgorICogICAgICAgICAgICAgICAgICAgXgorICogIFVzZXIgc3RhY2sgICAgICAgfAorICogIEJhY2sgY2hhaW4gLS0tLS0tKwk8LSByMQkJPC0tLS0tLS0rCisgKiAgLi4uCQkJCQkJfAorICogIFJlZCB6b25lIC8gQUJJIEdhcAkJCQl8CisgKiAgLi4uCQkJCQkJfAorICogIHZyNjMJPCsJCQkJfAorICogIHZyMAkJIHwJCQkJfAorICogIFZTQ1IJIHwJCQkJfAorICogIEZTQ1IJIHwJCQkJfAorICogIHIzMQkJIHwgU2F2ZSBhcmVhCQkJfAorICogIHIwCQkgfAkJCQl8CisgKiAgWEVSCQkgfAkJCQl8CisgKiAgQ1RSCQkgfAkJCQl8CisgKiAgTFIJCSB8CQkJCXwKKyAqICBDQ1IJCTwrCQkJCXwKKyAqICAuLi4JCTwrCQkJCXwKKyAqICBMUgkJIHwgQ2FsbGVyIGZyYW1lCQkJfAorICogIENDUgkJIHwJCQkJfAorICogIEJhY2sgY2hhaW4JPCsJPC0gdXBkYXRlZCByMQktLS0tLS0tLSsKKyAqCisgKi8KKworI2lmIGRlZmluZWQoX0NBTExfRUxGKSAmJiBfQ0FMTF9FTEYgPT0gMgorI2RlZmluZSBBQklHQVAJCTUxMgorI2Vsc2UKKyNkZWZpbmUgQUJJR0FQCQkyODgKKyNlbmRpZgorCisjZGVmaW5lIE5SX0dQUgkJMzIKKyNkZWZpbmUgTlJfU1BSCQk2CisjZGVmaW5lIE5SX1ZTUgkJNjQKKworI2RlZmluZSBTQVZFX0FSRUEJKChOUl9HUFIgKyBOUl9TUFIpICogOCArIChOUl9WU1IgKiAxNikpCisjZGVmaW5lIENBTExFUl9GUkFNRQkxMTIKKworI2RlZmluZSBTVEFDS19GUkFNRQkoQUJJR0FQICsgU0FWRV9BUkVBICsgQ0FMTEVSX0ZSQU1FKQorCisjZGVmaW5lIENDUl9TQVZFCShDQUxMRVJfRlJBTUUpCisjZGVmaW5lIExSX1NBVkUJCShDQ1JfU0FWRSArIDgpCisjZGVmaW5lIENUUl9TQVZFCShMUl9TQVZFICArIDgpCisjZGVmaW5lIFhFUl9TQVZFCShDVFJfU0FWRSArIDgpCisjZGVmaW5lIEdQUl9TQVZFKG4pCShYRVJfU0FWRSArIDggKyAoOCAqIG4pKQorI2RlZmluZSBGU0NSX1NBVkUJKEdQUl9TQVZFKDMxKSArIDgpCisjZGVmaW5lIFZTQ1JfU0FWRQkoRlNDUl9TQVZFICsgOCkKKyNkZWZpbmUgVlNSX1NBVkUobikJKFZTQ1JfU0FWRSArIDggKyAoMTYgKiBuKSkKKworI2RlZmluZSBTQVZFX0dQUihuKQlzdGQgbixHUFJfU0FWRShuKShyMSkKKyNkZWZpbmUgUkVTVF9HUFIobikJbGQgIG4sR1BSX1NBVkUobikocjEpCisjZGVmaW5lIFRSQVNIX0dQUihuKQlsaXMgbiwweGFhYWEKKworI2RlZmluZSBTQVZFX1ZTUihuLCBiKQlsaSBiLCBWU1JfU0FWRShuKTsgc3R4dmQyeCBuLGIscjEKKyNkZWZpbmUgTE9BRF9WU1IobiwgYikJbGkgYiwgVlNSX1NBVkUobik7IGx4dmQyeCAgbixiLHIxCisKKyNkZWZpbmUgTE9BRF9SRUdfSU1NRURJQVRFKHJlZyxleHByKQlcCisJbGlzICAgICByZWcsKGV4cHIpQGhpZ2hlc3Q7CVwKKwlvcmkgICAgIHJlZyxyZWcsKGV4cHIpQGhpZ2hlcjsJXAorCXJsZGljciAgcmVnLHJlZywzMiwzMTsJCVwKKwlvcmlzICAgIHJlZyxyZWcsKGV4cHIpQGg7CVwKKwlvcmkgICAgIHJlZyxyZWcsKGV4cHIpQGw7CisKKworI2lmIGRlZmluZWQoX0NBTExfRUxGKSAmJiBfQ0FMTF9FTEYgPT0gMgorI2RlZmluZSBFTlRSWV9QT0lOVChuYW1lKSBcCisJLnR5cGUgRlVOQ19OQU1FKG5hbWUpLEBmdW5jdGlvbjsgXAorCS5nbG9ibCBGVU5DX05BTUUobmFtZSk7IFwKKwlGVU5DX05BTUUobmFtZSk6CisKKyNkZWZpbmUgUkVTVE9SRV9UT0MobmFtZSkJXAorCS8qIFJlc3RvcmUgb3VyIFRPQyBwb2ludGVyIHVzaW5nIG91ciBlbnRyeSBwb2ludCAqLwlcCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMiwgbmFtZSkJCQkJXAorMDoJYWRkaXMJcjIscjEyLCguVE9DLi0wYilAaGE7CQkJCVwKKwlhZGRpCXIyLHIyLCguVE9DLi0wYilAbDsKKworI2Vsc2UKKyNkZWZpbmUgRU5UUllfUE9JTlQobmFtZSkgRlVOQ19TVEFSVChuYW1lKQorI2RlZmluZSBSRVNUT1JFX1RPQyhuYW1lKQlcCisJLyogUmVzdG9yZSBvdXIgVE9DIHBvaW50ZXIgdmlhIG91ciBvcGQgZW50cnkgKi8JXAorCUxPQURfUkVHX0lNTUVESUFURShyMiwgbmFtZSkJCQlcCisJbGQgICAgICByMiw4KHIyKTsKKyNlbmRpZgorCisgICAgLnRleHQKKworRU5UUllfUE9JTlQoZWJiX2hhbmRsZXIpCisgICAgc3RkdSAgICByMSwtU1RBQ0tfRlJBTUUocjEpCisgICAgU0FWRV9HUFIoMCkKKyAgICBtZmxyICAgIHIwCisgICAgc3RkICAgICByMCxMUl9TQVZFKHIxKQorICAgIG1mY3IgICAgcjAKKyAgICBzdGQgICAgIHIwLENDUl9TQVZFKHIxKQorICAgIG1mY3RyICAgcjAKKyAgICBzdGQgICAgIHIwLENUUl9TQVZFKHIxKQorICAgIG1meGVyICAgcjAKKyAgICBzdGQgICAgIHIwLFhFUl9TQVZFKHIxKQorICAgIFNBVkVfR1BSKDIpCisgICAgU0FWRV9HUFIoMykKKyAgICBTQVZFX0dQUig0KQorICAgIFNBVkVfR1BSKDUpCisgICAgU0FWRV9HUFIoNikKKyAgICBTQVZFX0dQUig3KQorICAgIFNBVkVfR1BSKDgpCisgICAgU0FWRV9HUFIoOSkKKyAgICBTQVZFX0dQUigxMCkKKyAgICBTQVZFX0dQUigxMSkKKyAgICBTQVZFX0dQUigxMikKKyAgICBTQVZFX0dQUigxMykKKyAgICBTQVZFX0dQUigxNCkKKyAgICBTQVZFX0dQUigxNSkKKyAgICBTQVZFX0dQUigxNikKKyAgICBTQVZFX0dQUigxNykKKyAgICBTQVZFX0dQUigxOCkKKyAgICBTQVZFX0dQUigxOSkKKyAgICBTQVZFX0dQUigyMCkKKyAgICBTQVZFX0dQUigyMSkKKyAgICBTQVZFX0dQUigyMikKKyAgICBTQVZFX0dQUigyMykKKyAgICBTQVZFX0dQUigyNCkKKyAgICBTQVZFX0dQUigyNSkKKyAgICBTQVZFX0dQUigyNikKKyAgICBTQVZFX0dQUigyNykKKyAgICBTQVZFX0dQUigyOCkKKyAgICBTQVZFX0dQUigyOSkKKyAgICBTQVZFX0dQUigzMCkKKyAgICBTQVZFX0dQUigzMSkKKyAgICBTQVZFX1ZTUigwLCByMykKKyAgICBtZmZzICAgICBmMAorICAgIHN0ZmQgICAgIGYwLCBGU0NSX1NBVkUocjEpCisgICAgbWZ2c2NyICAgZjAKKyAgICBzdGZkICAgICBmMCwgVlNDUl9TQVZFKHIxKQorICAgIFNBVkVfVlNSKDEsICByMykKKyAgICBTQVZFX1ZTUigyLCAgcjMpCisgICAgU0FWRV9WU1IoMywgIHIzKQorICAgIFNBVkVfVlNSKDQsICByMykKKyAgICBTQVZFX1ZTUig1LCAgcjMpCisgICAgU0FWRV9WU1IoNiwgIHIzKQorICAgIFNBVkVfVlNSKDcsICByMykKKyAgICBTQVZFX1ZTUig4LCAgcjMpCisgICAgU0FWRV9WU1IoOSwgIHIzKQorICAgIFNBVkVfVlNSKDEwLCByMykKKyAgICBTQVZFX1ZTUigxMSwgcjMpCisgICAgU0FWRV9WU1IoMTIsIHIzKQorICAgIFNBVkVfVlNSKDEzLCByMykKKyAgICBTQVZFX1ZTUigxNCwgcjMpCisgICAgU0FWRV9WU1IoMTUsIHIzKQorICAgIFNBVkVfVlNSKDE2LCByMykKKyAgICBTQVZFX1ZTUigxNywgcjMpCisgICAgU0FWRV9WU1IoMTgsIHIzKQorICAgIFNBVkVfVlNSKDE5LCByMykKKyAgICBTQVZFX1ZTUigyMCwgcjMpCisgICAgU0FWRV9WU1IoMjEsIHIzKQorICAgIFNBVkVfVlNSKDIyLCByMykKKyAgICBTQVZFX1ZTUigyMywgcjMpCisgICAgU0FWRV9WU1IoMjQsIHIzKQorICAgIFNBVkVfVlNSKDI1LCByMykKKyAgICBTQVZFX1ZTUigyNiwgcjMpCisgICAgU0FWRV9WU1IoMjcsIHIzKQorICAgIFNBVkVfVlNSKDI4LCByMykKKyAgICBTQVZFX1ZTUigyOSwgcjMpCisgICAgU0FWRV9WU1IoMzAsIHIzKQorICAgIFNBVkVfVlNSKDMxLCByMykKKyAgICBTQVZFX1ZTUigzMiwgcjMpCisgICAgU0FWRV9WU1IoMzMsIHIzKQorICAgIFNBVkVfVlNSKDM0LCByMykKKyAgICBTQVZFX1ZTUigzNSwgcjMpCisgICAgU0FWRV9WU1IoMzYsIHIzKQorICAgIFNBVkVfVlNSKDM3LCByMykKKyAgICBTQVZFX1ZTUigzOCwgcjMpCisgICAgU0FWRV9WU1IoMzksIHIzKQorICAgIFNBVkVfVlNSKDQwLCByMykKKyAgICBTQVZFX1ZTUig0MSwgcjMpCisgICAgU0FWRV9WU1IoNDIsIHIzKQorICAgIFNBVkVfVlNSKDQzLCByMykKKyAgICBTQVZFX1ZTUig0NCwgcjMpCisgICAgU0FWRV9WU1IoNDUsIHIzKQorICAgIFNBVkVfVlNSKDQ2LCByMykKKyAgICBTQVZFX1ZTUig0NywgcjMpCisgICAgU0FWRV9WU1IoNDgsIHIzKQorICAgIFNBVkVfVlNSKDQ5LCByMykKKyAgICBTQVZFX1ZTUig1MCwgcjMpCisgICAgU0FWRV9WU1IoNTEsIHIzKQorICAgIFNBVkVfVlNSKDUyLCByMykKKyAgICBTQVZFX1ZTUig1MywgcjMpCisgICAgU0FWRV9WU1IoNTQsIHIzKQorICAgIFNBVkVfVlNSKDU1LCByMykKKyAgICBTQVZFX1ZTUig1NiwgcjMpCisgICAgU0FWRV9WU1IoNTcsIHIzKQorICAgIFNBVkVfVlNSKDU4LCByMykKKyAgICBTQVZFX1ZTUig1OSwgcjMpCisgICAgU0FWRV9WU1IoNjAsIHIzKQorICAgIFNBVkVfVlNSKDYxLCByMykKKyAgICBTQVZFX1ZTUig2MiwgcjMpCisgICAgU0FWRV9WU1IoNjMsIHIzKQorCisgICAgVFJBU0hfR1BSKDIpCisgICAgVFJBU0hfR1BSKDMpCisgICAgVFJBU0hfR1BSKDQpCisgICAgVFJBU0hfR1BSKDUpCisgICAgVFJBU0hfR1BSKDYpCisgICAgVFJBU0hfR1BSKDcpCisgICAgVFJBU0hfR1BSKDgpCisgICAgVFJBU0hfR1BSKDkpCisgICAgVFJBU0hfR1BSKDEwKQorICAgIFRSQVNIX0dQUigxMSkKKyAgICBUUkFTSF9HUFIoMTIpCisgICAgVFJBU0hfR1BSKDE0KQorICAgIFRSQVNIX0dQUigxNSkKKyAgICBUUkFTSF9HUFIoMTYpCisgICAgVFJBU0hfR1BSKDE3KQorICAgIFRSQVNIX0dQUigxOCkKKyAgICBUUkFTSF9HUFIoMTkpCisgICAgVFJBU0hfR1BSKDIwKQorICAgIFRSQVNIX0dQUigyMSkKKyAgICBUUkFTSF9HUFIoMjIpCisgICAgVFJBU0hfR1BSKDIzKQorICAgIFRSQVNIX0dQUigyNCkKKyAgICBUUkFTSF9HUFIoMjUpCisgICAgVFJBU0hfR1BSKDI2KQorICAgIFRSQVNIX0dQUigyNykKKyAgICBUUkFTSF9HUFIoMjgpCisgICAgVFJBU0hfR1BSKDI5KQorICAgIFRSQVNIX0dQUigzMCkKKyAgICBUUkFTSF9HUFIoMzEpCisKKyAgICBSRVNUT1JFX1RPQyhlYmJfaGFuZGxlcikKKworICAgIC8qCisgICAgICogcjEzIGlzIG91ciBUTFMgcG9pbnRlci4gV2UgbGVhdmUgd2hhdGV2ZXIgdmFsdWUgd2FzIGluIHRoZXJlIHdoZW4gdGhlCisgICAgICogRUJCIGZpcmVkLiBUaGF0IHNlZW1zIHRvIGJlIE9LIGJlY2F1c2Ugb25jZSBzZXQgdGhlIFRMUyBwb2ludGVyIGlzIG5vdAorICAgICAqIGNoYW5nZWQgLSBidXQgcHJlc3VtYWJseSB0aGF0IGNvdWxkIGNoYW5nZSBpbiBmdXR1cmUuCisgICAgICovCisKKyAgICBibCAgICAgIGViYl9ob29rCisgICAgbm9wCisKKyAgICAvKiByMiBtYXkgYmUgY2hhbmdlZCBoZXJlIGJ1dCB3ZSBkb24ndCBjYXJlICovCisKKyAgICBsZmQgICAgICBmMCwgRlNDUl9TQVZFKHIxKQorICAgIG10ZnNmICAgIDB4ZmYsZjAKKyAgICBsZmQgICAgICBmMCwgVlNDUl9TQVZFKHIxKQorICAgIG10dnNjciAgIGYwCisgICAgTE9BRF9WU1IoMCwgcjMpCisgICAgTE9BRF9WU1IoMSwgIHIzKQorICAgIExPQURfVlNSKDIsICByMykKKyAgICBMT0FEX1ZTUigzLCAgcjMpCisgICAgTE9BRF9WU1IoNCwgIHIzKQorICAgIExPQURfVlNSKDUsICByMykKKyAgICBMT0FEX1ZTUig2LCAgcjMpCisgICAgTE9BRF9WU1IoNywgIHIzKQorICAgIExPQURfVlNSKDgsICByMykKKyAgICBMT0FEX1ZTUig5LCAgcjMpCisgICAgTE9BRF9WU1IoMTAsIHIzKQorICAgIExPQURfVlNSKDExLCByMykKKyAgICBMT0FEX1ZTUigxMiwgcjMpCisgICAgTE9BRF9WU1IoMTMsIHIzKQorICAgIExPQURfVlNSKDE0LCByMykKKyAgICBMT0FEX1ZTUigxNSwgcjMpCisgICAgTE9BRF9WU1IoMTYsIHIzKQorICAgIExPQURfVlNSKDE3LCByMykKKyAgICBMT0FEX1ZTUigxOCwgcjMpCisgICAgTE9BRF9WU1IoMTksIHIzKQorICAgIExPQURfVlNSKDIwLCByMykKKyAgICBMT0FEX1ZTUigyMSwgcjMpCisgICAgTE9BRF9WU1IoMjIsIHIzKQorICAgIExPQURfVlNSKDIzLCByMykKKyAgICBMT0FEX1ZTUigyNCwgcjMpCisgICAgTE9BRF9WU1IoMjUsIHIzKQorICAgIExPQURfVlNSKDI2LCByMykKKyAgICBMT0FEX1ZTUigyNywgcjMpCisgICAgTE9BRF9WU1IoMjgsIHIzKQorICAgIExPQURfVlNSKDI5LCByMykKKyAgICBMT0FEX1ZTUigzMCwgcjMpCisgICAgTE9BRF9WU1IoMzEsIHIzKQorICAgIExPQURfVlNSKDMyLCByMykKKyAgICBMT0FEX1ZTUigzMywgcjMpCisgICAgTE9BRF9WU1IoMzQsIHIzKQorICAgIExPQURfVlNSKDM1LCByMykKKyAgICBMT0FEX1ZTUigzNiwgcjMpCisgICAgTE9BRF9WU1IoMzcsIHIzKQorICAgIExPQURfVlNSKDM4LCByMykKKyAgICBMT0FEX1ZTUigzOSwgcjMpCisgICAgTE9BRF9WU1IoNDAsIHIzKQorICAgIExPQURfVlNSKDQxLCByMykKKyAgICBMT0FEX1ZTUig0MiwgcjMpCisgICAgTE9BRF9WU1IoNDMsIHIzKQorICAgIExPQURfVlNSKDQ0LCByMykKKyAgICBMT0FEX1ZTUig0NSwgcjMpCisgICAgTE9BRF9WU1IoNDYsIHIzKQorICAgIExPQURfVlNSKDQ3LCByMykKKyAgICBMT0FEX1ZTUig0OCwgcjMpCisgICAgTE9BRF9WU1IoNDksIHIzKQorICAgIExPQURfVlNSKDUwLCByMykKKyAgICBMT0FEX1ZTUig1MSwgcjMpCisgICAgTE9BRF9WU1IoNTIsIHIzKQorICAgIExPQURfVlNSKDUzLCByMykKKyAgICBMT0FEX1ZTUig1NCwgcjMpCisgICAgTE9BRF9WU1IoNTUsIHIzKQorICAgIExPQURfVlNSKDU2LCByMykKKyAgICBMT0FEX1ZTUig1NywgcjMpCisgICAgTE9BRF9WU1IoNTgsIHIzKQorICAgIExPQURfVlNSKDU5LCByMykKKyAgICBMT0FEX1ZTUig2MCwgcjMpCisgICAgTE9BRF9WU1IoNjEsIHIzKQorICAgIExPQURfVlNSKDYyLCByMykKKyAgICBMT0FEX1ZTUig2MywgcjMpCisKKyAgICBsZCAgICAgIHIwLFhFUl9TQVZFKHIxKQorICAgIG10eGVyICAgcjAKKyAgICBsZCAgICAgIHIwLENUUl9TQVZFKHIxKQorICAgIG10Y3RyICAgcjAKKyAgICBsZCAgICAgIHIwLExSX1NBVkUocjEpCisgICAgbXRsciAgICByMAorICAgIGxkICAgICAgcjAsQ0NSX1NBVkUocjEpCisgICAgbXRjciAgICByMAorICAgIFJFU1RfR1BSKDApCisgICAgUkVTVF9HUFIoMikKKyAgICBSRVNUX0dQUigzKQorICAgIFJFU1RfR1BSKDQpCisgICAgUkVTVF9HUFIoNSkKKyAgICBSRVNUX0dQUig2KQorICAgIFJFU1RfR1BSKDcpCisgICAgUkVTVF9HUFIoOCkKKyAgICBSRVNUX0dQUig5KQorICAgIFJFU1RfR1BSKDEwKQorICAgIFJFU1RfR1BSKDExKQorICAgIFJFU1RfR1BSKDEyKQorICAgIFJFU1RfR1BSKDEzKQorICAgIFJFU1RfR1BSKDE0KQorICAgIFJFU1RfR1BSKDE1KQorICAgIFJFU1RfR1BSKDE2KQorICAgIFJFU1RfR1BSKDE3KQorICAgIFJFU1RfR1BSKDE4KQorICAgIFJFU1RfR1BSKDE5KQorICAgIFJFU1RfR1BSKDIwKQorICAgIFJFU1RfR1BSKDIxKQorICAgIFJFU1RfR1BSKDIyKQorICAgIFJFU1RfR1BSKDIzKQorICAgIFJFU1RfR1BSKDI0KQorICAgIFJFU1RfR1BSKDI1KQorICAgIFJFU1RfR1BSKDI2KQorICAgIFJFU1RfR1BSKDI3KQorICAgIFJFU1RfR1BSKDI4KQorICAgIFJFU1RfR1BSKDI5KQorICAgIFJFU1RfR1BSKDMwKQorICAgIFJFU1RfR1BSKDMxKQorICAgIGFkZGkgICAgcjEscjEsU1RBQ0tfRlJBTUUKKyAgICBSRkVCQgorRlVOQ19FTkQoZWJiX2hhbmRsZXIpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX29uX2NoaWxkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9lYmJfb25fY2hpbGRfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWY5NDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX29uX2NoaWxkX3Rlc3QuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJlYmIuaCIKKworCisvKgorICogVGVzdHMgd2UgY2FuIHNldHVwIGFuIEVCQiBvbiBvdXIgY2hpbGQuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucywgYmVjYXVzZQorICogZXZlbiB0aG91Z2ggdGhlIGV2ZW50IGlzIGVuYWJsZWQgYW5kIHJ1bm5pbmcgdGhlIGNoaWxkIGhhc24ndCBlbmFibGVkIHRoZQorICogYWN0dWFsIGRlbGl2ZXJ5IG9mIHRoZSBFQkJzLgorICovCisKK3N0YXRpYyBpbnQgdmljdGltX2NoaWxkKHVuaW9uIHBpcGUgcmVhZF9waXBlLCB1bmlvbiBwaXBlIHdyaXRlX3BpcGUpCit7CisJaW50IGk7CisKKwlGQUlMX0lGKHdhaXRfZm9yX3BhcmVudChyZWFkX3BpcGUpKTsKKwlGQUlMX0lGKG5vdGlmeV9wYXJlbnQod3JpdGVfcGlwZSkpOworCisJLyogUGFyZW50IGNyZWF0ZXMgRUJCIGV2ZW50ICovCisKKwlGQUlMX0lGKHdhaXRfZm9yX3BhcmVudChyZWFkX3BpcGUpKTsKKwlGQUlMX0lGKG5vdGlmeV9wYXJlbnQod3JpdGVfcGlwZSkpOworCisJLyogQ2hlY2sgdGhlIEVCQiBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgUE1DMSAqLworCXdyaXRlX3BtYzEoKTsKKworCS8qIEVCQiBldmVudCBpcyBlbmFibGVkIGhlcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwMDsgaSsrKSA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGViYl9vbl9jaGlsZCh2b2lkKQoreworCXVuaW9uIHBpcGUgcmVhZF9waXBlLCB3cml0ZV9waXBlOworCXN0cnVjdCBldmVudCBldmVudDsKKwlwaWRfdCBwaWQ7CisKKwlGQUlMX0lGKHBpcGUocmVhZF9waXBlLmZkcykgPT0gLTEpOworCUZBSUxfSUYocGlwZSh3cml0ZV9waXBlLmZkcykgPT0gLTEpOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBOQiBvcmRlciBvZiBwaXBlcyBsb29rcyByZXZlcnNlZCAqLworCQlleGl0KHZpY3RpbV9jaGlsZCh3cml0ZV9waXBlLCByZWFkX3BpcGUpKTsKKwl9CisKKwlGQUlMX0lGKHN5bmNfd2l0aF9jaGlsZChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpKTsKKworCS8qIENoaWxkIGlzIHJ1bm5pbmcgbm93ICovCisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHgxMDAxZSwgImN5Y2xlcyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJZXZlbnQuYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9waWQoJmV2ZW50LCBwaWQpKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwlGQUlMX0lGKHN5bmNfd2l0aF9jaGlsZChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpKTsKKworCS8qIENoaWxkIHNob3VsZCBqdXN0IGV4aXQgaGFwcGlseSAqLworCUZBSUxfSUYod2FpdF9mb3JfY2hpbGQocGlkKSk7CisKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhlYmJfb25fY2hpbGQsICJlYmJfb25fY2hpbGQiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9lYmJfb25fd2lsbGluZ19jaGlsZF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX29uX3dpbGxpbmdfY2hpbGRfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWNmMWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX29uX3dpbGxpbmdfY2hpbGRfdGVzdC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImViYi5oIgorCisKKy8qCisgKiBUZXN0cyB3ZSBjYW4gc2V0dXAgYW4gRUJCIG9uIG91ciBjaGlsZC4gVGhlIGNoaWxkIGV4cGVjdHMgdGhpcyBhbmQgZW5hYmxlcworICogRUJCcywgd2hpY2ggYXJlIHRoZW4gZGVsaXZlcmVkIHRvIHRoZSBjaGlsZCwgZXZlbiB0aG91Z2ggdGhlIGV2ZW50IGlzCisgKiBjcmVhdGVkIGJ5IHRoZSBwYXJlbnQuCisgKi8KKworc3RhdGljIGludCB2aWN0aW1fY2hpbGQodW5pb24gcGlwZSByZWFkX3BpcGUsIHVuaW9uIHBpcGUgd3JpdGVfcGlwZSkKK3sKKwlGQUlMX0lGKHdhaXRfZm9yX3BhcmVudChyZWFkX3BpcGUpKTsKKworCS8qIFNldHVwIG91ciBFQkIgaGFuZGxlciwgYmVmb3JlIHRoZSBFQkIgZXZlbnQgaXMgY3JlYXRlZCAqLworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDEpOworCXNldHVwX2ViYl9oYW5kbGVyKHN0YW5kYXJkX2ViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlGQUlMX0lGKG5vdGlmeV9wYXJlbnQod3JpdGVfcGlwZSkpOworCisJd2hpbGUgKGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQgPCAyMCkgeworCQlGQUlMX0lGKGNvcmVfYnVzeV9sb29wKCkpOworCX0KKworCWViYl9nbG9iYWxfZGlzYWJsZSgpOworCWViYl9mcmVlemVfcG1jcygpOworCisJY291bnRfcG1jKDEsIHNhbXBsZV9wZXJpb2QpOworCisJZHVtcF9lYmJfc3RhdGUoKTsKKworCUZBSUxfSUYoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA9PSAwKTsKKworCXJldHVybiAwOworfQorCisvKiBUZXN0cyB3ZSBjYW4gc2V0dXAgYW4gRUJCIG9uIG91ciBjaGlsZCAtIGlmIGl0J3MgZXhwZWN0aW5nIGl0ICovCitpbnQgZWJiX29uX3dpbGxpbmdfY2hpbGQodm9pZCkKK3sKKwl1bmlvbiBwaXBlIHJlYWRfcGlwZSwgd3JpdGVfcGlwZTsKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisJcGlkX3QgcGlkOworCisJRkFJTF9JRihwaXBlKHJlYWRfcGlwZS5mZHMpID09IC0xKTsKKwlGQUlMX0lGKHBpcGUod3JpdGVfcGlwZS5mZHMpID09IC0xKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogTkIgb3JkZXIgb2YgcGlwZXMgbG9va3MgcmV2ZXJzZWQgKi8KKwkJZXhpdCh2aWN0aW1fY2hpbGQod3JpdGVfcGlwZSwgcmVhZF9waXBlKSk7CisJfQorCisJLyogU2lnbmFsIHRoZSBjaGlsZCB0byBzZXR1cCBpdHMgRUJCIGhhbmRsZXIgKi8KKwlGQUlMX0lGKHN5bmNfd2l0aF9jaGlsZChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpKTsKKworCS8qIENoaWxkIGlzIHJ1bm5pbmcgbm93ICovCisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHgxMDAxZSwgImN5Y2xlcyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJZXZlbnQuYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9waWQoJmV2ZW50LCBwaWQpKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwkvKiBDaGlsZCBzaG93IG5vdyB0YWtlIEVCQnMgYW5kIHRoZW4gZXhpdCAqLworCUZBSUxfSUYod2FpdF9mb3JfY2hpbGQocGlkKSk7CisKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhlYmJfb25fd2lsbGluZ19jaGlsZCwgImViYl9vbl93aWxsaW5nX2NoaWxkIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX3ZzX2NwdV9ldmVudF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZWJiX3ZzX2NwdV9ldmVudF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0ZGQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9lYmJfdnNfY3B1X2V2ZW50X3Rlc3QuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJlYmIuaCIKKworCisvKgorICogVGVzdHMgYW4gRUJCIHZzIGEgY3B1IGV2ZW50IC0gaW4gdGhhdCBvcmRlci4gVGhlIEVCQiBzaG91bGQgZm9yY2UgdGhlIGNwdQorICogZXZlbnQgb2ZmIHRoZSBQTVUuCisgKi8KKworc3RhdGljIGludCBzZXR1cF9jcHVfZXZlbnQoc3RydWN0IGV2ZW50ICpldmVudCwgaW50IGNwdSkKK3sKKwlldmVudF9pbml0X25hbWVkKGV2ZW50LCAweDQwMEZBLCAiUE1fUlVOX0lOU1RfQ01QTCIpOworCisJZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlTS0lQX0lGKHJlcXVpcmVfcGFyYW5vaWFfYmVsb3coMSkpOworCUZBSUxfSUYoZXZlbnRfb3Blbl93aXRoX2NwdShldmVudCwgY3B1KSk7CisJRkFJTF9JRihldmVudF9lbmFibGUoZXZlbnQpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZWJiX3ZzX2NwdV9ldmVudCh2b2lkKQoreworCXVuaW9uIHBpcGUgcmVhZF9waXBlLCB3cml0ZV9waXBlOworCXN0cnVjdCBldmVudCBldmVudDsKKwlpbnQgY3B1LCByYzsKKwlwaWRfdCBwaWQ7CisKKwljcHUgPSBwaWNrX29ubGluZV9jcHUoKTsKKwlGQUlMX0lGKGNwdSA8IDApOworCUZBSUxfSUYoYmluZF90b19jcHUoY3B1KSk7CisKKwlGQUlMX0lGKHBpcGUocmVhZF9waXBlLmZkcykgPT0gLTEpOworCUZBSUxfSUYocGlwZSh3cml0ZV9waXBlLmZkcykgPT0gLTEpOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBOQiBvcmRlciBvZiBwaXBlcyBsb29rcyByZXZlcnNlZCAqLworCQlleGl0KGViYl9jaGlsZCh3cml0ZV9waXBlLCByZWFkX3BpcGUpKTsKKwl9CisKKwkvKiBTaWduYWwgdGhlIGNoaWxkIHRvIGluc3RhbGwgaXRzIEVCQiBldmVudCBhbmQgd2FpdCAqLworCUZBSUxfSUYoc3luY193aXRoX2NoaWxkKHJlYWRfcGlwZSwgd3JpdGVfcGlwZSkpOworCisJLyogTm93IHRyeSB0byBpbnN0YWxsIG91ciBDUFUgZXZlbnQgKi8KKwlyYyA9IHNldHVwX2NwdV9ldmVudCgmZXZlbnQsIGNwdSk7CisJaWYgKHJjKSB7CisJCWtpbGxfY2hpbGRfYW5kX3dhaXQocGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFNpZ25hbCB0aGUgY2hpbGQgdG8gcnVuICovCisJRkFJTF9JRihzeW5jX3dpdGhfY2hpbGQocmVhZF9waXBlLCB3cml0ZV9waXBlKSk7CisKKwkvKiAuLiBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlGQUlMX0lGKHdhaXRfZm9yX2NoaWxkKHBpZCkpOworCUZBSUxfSUYoZXZlbnRfZGlzYWJsZSgmZXZlbnQpKTsKKwlGQUlMX0lGKGV2ZW50X3JlYWQoJmV2ZW50KSk7CisKKwlldmVudF9yZXBvcnQoJmV2ZW50KTsKKworCS8qIFRoZSBjcHUgZXZlbnQgbWF5IGhhdmUgcnVuLCBidXQgd2UgZG9uJ3QgZXhwZWN0IDEwMCUgKi8KKwlGQUlMX0lGKGV2ZW50LnJlc3VsdC5lbmFibGVkID49IGV2ZW50LnJlc3VsdC5ydW5uaW5nKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3MoZWJiX3ZzX2NwdV9ldmVudCwgImViYl92c19jcHVfZXZlbnQiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9ldmVudF9hdHRyaWJ1dGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9ldmVudF9hdHRyaWJ1dGVzX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc4MTUzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9ldmVudF9hdHRyaWJ1dGVzX3Rlc3QuYwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3QgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIHRoZSBFQkIgZXZlbnQgYXJlIGVuZm9yY2VkLgorICovCitpbnQgZXZlbnRfYXR0cmlidXRlcyh2b2lkKQoreworCXN0cnVjdCBldmVudCBldmVudCwgbGVhZGVyOworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4MTAwMWUpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCS8qIEV4cGVjdGVkIHRvIHN1Y2NlZWQgKi8KKwlGQUlMX0lGKGV2ZW50X29wZW4oJmV2ZW50KSk7CisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4MDAxZSk7IC8qIENZQ0xFUyAtIG5vIFBNQyBzcGVjaWZpZWQgKi8KKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKwkvKiBFeHBlY3RlZCB0byBmYWlsLCBubyBQTUMgc3BlY2lmaWVkICovCisJRkFJTF9JRihldmVudF9vcGVuKCZldmVudCkgPT0gMCk7CisKKworCWV2ZW50X2luaXQoJmV2ZW50LCAweDIwMDFlKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKwlldmVudC5hdHRyLmV4Y2x1c2l2ZSA9IDA7CisJLyogRXhwZWN0ZWQgdG8gZmFpbCwgbm90IGV4Y2x1c2l2ZSAqLworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpID09IDApOworCisKKwlldmVudF9pbml0KCZldmVudCwgMHgzMDAxZSk7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisJZXZlbnQuYXR0ci5mcmVxID0gMTsKKwkvKiBFeHBlY3RlZCB0byBmYWlsLCBzZXRzIGZyZXEgKi8KKwlGQUlMX0lGKGV2ZW50X29wZW4oJmV2ZW50KSA9PSAwKTsKKworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4NDAwMWUpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCWV2ZW50LmF0dHIuc2FtcGxlX3BlcmlvZCA9IDE7CisJLyogRXhwZWN0ZWQgdG8gZmFpbCwgc2V0cyBzYW1wbGVfcGVyaW9kICovCisJRkFJTF9JRihldmVudF9vcGVuKCZldmVudCkgPT0gMCk7CisKKworCWV2ZW50X2luaXQoJmV2ZW50LCAweDEwMDFlKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKwlldmVudC5hdHRyLmVuYWJsZV9vbl9leGVjID0gMTsKKwkvKiBFeHBlY3RlZCB0byBmYWlsLCBzZXRzIGVuYWJsZV9vbl9leGVjICovCisJRkFJTF9JRihldmVudF9vcGVuKCZldmVudCkgPT0gMCk7CisKKworCWV2ZW50X2luaXQoJmV2ZW50LCAweDEwMDFlKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKwlldmVudC5hdHRyLmluaGVyaXQgPSAxOworCS8qIEV4cGVjdGVkIHRvIGZhaWwsIHNldHMgaW5oZXJpdCAqLworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpID09IDApOworCisKKwlldmVudF9pbml0KCZsZWFkZXIsIDB4MTAwMWUpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmbGVhZGVyKTsKKwlGQUlMX0lGKGV2ZW50X29wZW4oJmxlYWRlcikpOworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4MjAwMDIpOworCWV2ZW50X2ViYl9pbml0KCZldmVudCk7CisKKwkvKiBFeHBlY3RlZCB0byBzdWNjZWVkICovCisJRkFJTF9JRihldmVudF9vcGVuX3dpdGhfZ3JvdXAoJmV2ZW50LCBsZWFkZXIuZmQpKTsKKwlldmVudF9jbG9zZSgmbGVhZGVyKTsKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisKKwlldmVudF9pbml0KCZsZWFkZXIsIDB4MTAwMWUpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmbGVhZGVyKTsKKwlGQUlMX0lGKGV2ZW50X29wZW4oJmxlYWRlcikpOworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4MjAwMDIpOworCisJLyogRXhwZWN0ZWQgdG8gZmFpbCwgZXZlbnQgZG9lc24ndCByZXF1ZXN0IEVCQiwgbGVhZGVyIGRvZXMgKi8KKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9ncm91cCgmZXZlbnQsIGxlYWRlci5mZCkgPT0gMCk7CisJZXZlbnRfY2xvc2UoJmxlYWRlcik7CisKKworCWV2ZW50X2luaXQoJmxlYWRlciwgMHgxMDAxZSk7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZsZWFkZXIpOworCS8qIENsZWFyIHRoZSBFQkIgZmxhZyAqLworCWxlYWRlci5hdHRyLmNvbmZpZyAmPSB+KDF1bGwgPDwgNjMpOworCisJRkFJTF9JRihldmVudF9vcGVuKCZsZWFkZXIpKTsKKworCWV2ZW50X2luaXQoJmV2ZW50LCAweDIwMDAyKTsKKwlldmVudF9lYmJfaW5pdCgmZXZlbnQpOworCisJLyogRXhwZWN0ZWQgdG8gZmFpbCwgbGVhZGVyIGRvZXNuJ3QgcmVxdWVzdCBFQkIgKi8KKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9ncm91cCgmZXZlbnQsIGxlYWRlci5mZCkgPT0gMCk7CisJZXZlbnRfY2xvc2UoJmxlYWRlcik7CisKKworCWV2ZW50X2luaXQoJmxlYWRlciwgMHgxMDAxZSk7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZsZWFkZXIpOworCWxlYWRlci5hdHRyLmV4Y2x1c2l2ZSA9IDA7CisJLyogRXhwZWN0ZWQgdG8gZmFpbCwgbGVhZGVyIGlzbid0IGV4Y2x1c2l2ZSAqLworCUZBSUxfSUYoZXZlbnRfb3BlbigmbGVhZGVyKSA9PSAwKTsKKworCisJZXZlbnRfaW5pdCgmbGVhZGVyLCAweDEwMDFlKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmxlYWRlcik7CisJbGVhZGVyLmF0dHIucGlubmVkID0gMDsKKwkvKiBFeHBlY3RlZCB0byBmYWlsLCBsZWFkZXIgaXNuJ3QgcGlubmVkICovCisJRkFJTF9JRihldmVudF9vcGVuKCZsZWFkZXIpID09IDApOworCisJZXZlbnRfaW5pdCgmZXZlbnQsIDB4MTAwMWUpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCS8qIEV4cGVjdGVkIHRvIGZhaWwsIG5vdCBhIHRhc2sgZXZlbnQgKi8KKwlTS0lQX0lGKHJlcXVpcmVfcGFyYW5vaWFfYmVsb3coMSkpOworCUZBSUxfSUYoZXZlbnRfb3Blbl93aXRoX2NwdSgmZXZlbnQsIDApID09IDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhldmVudF9hdHRyaWJ1dGVzLCAiZXZlbnRfYXR0cmlidXRlcyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2ZpeGVkX2luc3RydWN0aW9uX2xvb3AuUyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9maXhlZF9pbnN0cnVjdGlvbl9sb29wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NmEwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9maXhlZF9pbnN0cnVjdGlvbl9sb29wLlMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxwcGMtYXNtLmg+CisKKwkudGV4dAorCitGVU5DX1NUQVJUKHRoaXJ0eV90d29faW5zdHJ1Y3Rpb25fbG9vcCkKKwljbXB3aQlyMywwCisJYmVxbHIKKwlhZGRpCXI0LHIzLDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEJIyAyOCBhZGRpJ3MKKwlzdWJpCXIzLHIzLDEKKwliCUZVTkNfTkFNRSh0aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3ApCitGVU5DX0VORCh0aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3ApCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZm9ya19jbGVhbnVwX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9mb3JrX2NsZWFudXBfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllN2FmNmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvZm9ya19jbGVhbnVwX3Rlc3QuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJlYmIuaCIKKworCisvKgorICogVGVzdCB0aGF0IGEgZm9yayBjbGVhcnMgdGhlIFBNVSBzdGF0ZSBvZiB0aGUgY2hpbGQuIGVnLiBCRVNDUi9FQkJIUi9FQkJSUgorICogYXJlIGNsZWFyZWQsIGFuZCBNTUNSMF9QTUNDIGlzIHJlc2V0LCBwcmV2ZW50aW5nIHRoZSBjaGlsZCBmcm9tIGFjY2Vzc2luZworICogdGhlIFBNVS4KKyAqLworCitzdGF0aWMgc3RydWN0IGV2ZW50IGV2ZW50OworCitzdGF0aWMgaW50IGNoaWxkKHZvaWQpCit7CisJLyogRXZlbiB0aG91Z2ggd2UgaGF2ZSBFQkU9MCB3ZSBjYW4gc3RpbGwgc2VlIHRoZSBFQkIgcmVncyAqLworCUZBSUxfSUYobWZzcHIoU1BSTl9CRVNDUikgIT0gMCk7CisJRkFJTF9JRihtZnNwcihTUFJOX0VCQkhSKSAhPSAwKTsKKwlGQUlMX0lGKG1mc3ByKFNQUk5fRUJCUlIpICE9IDApOworCisJRkFJTF9JRihjYXRjaF9zaWdpbGwod3JpdGVfcG1jMSkpOworCisJLyogV2UgY2FuIHN0aWxsIHJlYWQgZnJvbSB0aGUgZXZlbnQsIHRob3VnaCBpdCBpcyBvbiBvdXIgcGFyZW50ICovCisJRkFJTF9JRihldmVudF9yZWFkKCZldmVudCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRlc3RzIHRoYXQgZm9yayBjbGVhcnMgRUJCIHN0YXRlICovCitpbnQgZm9ya19jbGVhbnVwKHZvaWQpCit7CisJcGlkX3QgcGlkOworCisJZXZlbnRfaW5pdF9uYW1lZCgmZXZlbnQsIDB4MTAwMWUsICJjeWNsZXMiKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDEpOworCXNldHVwX2ViYl9oYW5kbGVyKHN0YW5kYXJkX2ViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX01NQ1IwLCBNTUNSMF9GQyk7CisJbXRzcHIoU1BSTl9QTUMxLCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisKKwkvKiBEb24ndCBuZWVkIHRvIGFjdHVhbGx5IHRha2UgYW55IEVCQnMgKi8KKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApCisJCWV4aXQoY2hpbGQoKSk7CisKKwkvKiBDaGlsZCBkb2VzIHRoZSBhY3R1YWwgdGVzdGluZyAqLworCUZBSUxfSUYod2FpdF9mb3JfY2hpbGQocGlkKSk7CisKKwkvKiBBZnRlciBmb3JrICovCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3MoZm9ya19jbGVhbnVwLCAiZm9ya19jbGVhbnVwIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvaW5zdHJ1Y3Rpb25fY291bnRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2luc3RydWN0aW9uX2NvdW50X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODE5MGZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2luc3RydWN0aW9uX2NvdW50X3Rlc3QuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFJ1biBhIGNhbGlicmF0ZWQgaW5zdHJ1Y3Rpb24gbG9vcCBhbmQgY291bnQgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkIHVzaW5nCisgKiBFQkJzLiBNYWtlIHN1cmUgdGhlIGNvdW50cyBsb29rIHJpZ2h0LgorICovCisKK2V4dGVybiB2b2lkIHRoaXJ0eV90d29faW5zdHJ1Y3Rpb25fbG9vcCh1aW50NjRfdCBsb29wcyk7CisKK3N0YXRpYyBib29sIGNvdW50ZXJzX2Zyb3plbiA9IHRydWU7CisKK3N0YXRpYyBpbnQgZG9fY291bnRfbG9vcChzdHJ1Y3QgZXZlbnQgKmV2ZW50LCB1aW50NjRfdCBpbnN0cnVjdGlvbnMsCisJCQkgdWludDY0X3Qgb3ZlcmhlYWQsIGJvb2wgcmVwb3J0KQoreworCWludDY0X3QgZGlmZmVyZW5jZSwgZXhwZWN0ZWQ7CisJZG91YmxlIHBlcmNlbnRhZ2U7CisKKwljbGVhcl9lYmJfc3RhdHMoKTsKKworCWNvdW50ZXJzX2Zyb3plbiA9IGZhbHNlOworCW1iKCk7CisJbXRzcHIoU1BSTl9NTUNSMCwgbWZzcHIoU1BSTl9NTUNSMCkgJiB+TU1DUjBfRkMpOworCisJdGhpcnR5X3R3b19pbnN0cnVjdGlvbl9sb29wKGluc3RydWN0aW9ucyA+PiA1KTsKKworCWNvdW50ZXJzX2Zyb3plbiA9IHRydWU7CisJbWIoKTsKKwltdHNwcihTUFJOX01NQ1IwLCBtZnNwcihTUFJOX01NQ1IwKSB8IE1NQ1IwX0ZDKTsKKworCWNvdW50X3BtYyg0LCBzYW1wbGVfcGVyaW9kKTsKKworCWV2ZW50LT5yZXN1bHQudmFsdWUgPSBlYmJfc3RhdGUuc3RhdHMucG1jX2NvdW50WzQtMV07CisJZXhwZWN0ZWQgPSBpbnN0cnVjdGlvbnMgKyBvdmVyaGVhZDsKKwlkaWZmZXJlbmNlID0gZXZlbnQtPnJlc3VsdC52YWx1ZSAtIGV4cGVjdGVkOworCXBlcmNlbnRhZ2UgPSAoZG91YmxlKWRpZmZlcmVuY2UgLyBldmVudC0+cmVzdWx0LnZhbHVlICogMTAwOworCisJaWYgKHJlcG9ydCkgeworCQlwcmludGYoIkxvb3BlZCBmb3IgJWx1IGluc3RydWN0aW9ucywgb3ZlcmhlYWQgJWx1XG4iLCBpbnN0cnVjdGlvbnMsIG92ZXJoZWFkKTsKKwkJcHJpbnRmKCJFeHBlY3RlZCAlbHVcbiIsIGV4cGVjdGVkKTsKKwkJcHJpbnRmKCJBY3R1YWwgICAlbGx1XG4iLCBldmVudC0+cmVzdWx0LnZhbHVlKTsKKwkJcHJpbnRmKCJFcnJvciAgICAlbGQsICVmJSVcbiIsIGRpZmZlcmVuY2UsIHBlcmNlbnRhZ2UpOworCQlwcmludGYoIlRvb2sgJWQgRUJCc1xuIiwgZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCk7CisJfQorCisJaWYgKGRpZmZlcmVuY2UgPCAwKQorCQlkaWZmZXJlbmNlID0gLWRpZmZlcmVuY2U7CisKKwkvKiBUb2xlcmF0ZSBhIGRpZmZlcmVuY2Ugb2YgdXAgdG8gMC4wMDAxICUgKi8KKwlkaWZmZXJlbmNlICo9IDEwMDAwICogMTAwOworCWlmIChkaWZmZXJlbmNlIC8gZXZlbnQtPnJlc3VsdC52YWx1ZSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENvdW50IGhvdyBtYW55IGluc3RydWN0aW9ucyBpdCB0YWtlcyB0byBkbyBhIG51bGwgbG9vcCAqLworc3RhdGljIHVpbnQ2NF90IGRldGVybWluZV9vdmVyaGVhZChzdHJ1Y3QgZXZlbnQgKmV2ZW50KQoreworCXVpbnQ2NF90IGN1cnJlbnQsIG92ZXJoZWFkOworCWludCBpOworCisJZG9fY291bnRfbG9vcChldmVudCwgMCwgMCwgZmFsc2UpOworCW92ZXJoZWFkID0gZXZlbnQtPnJlc3VsdC52YWx1ZTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlkb19jb3VudF9sb29wKGV2ZW50LCAwLCAwLCBmYWxzZSk7CisJCWN1cnJlbnQgPSBldmVudC0+cmVzdWx0LnZhbHVlOworCQlpZiAoY3VycmVudCA8IG92ZXJoZWFkKSB7CisJCQlwcmludGYoIlJlcGxhY2luZyBvdmVyaGVhZCAlbHUgd2l0aCAlbHVcbiIsIG92ZXJoZWFkLCBjdXJyZW50KTsKKwkJCW92ZXJoZWFkID0gY3VycmVudDsKKwkJfQorCX0KKworCXJldHVybiBvdmVyaGVhZDsKK30KKworc3RhdGljIHZvaWQgcG1jNF9lYmJfY2FsbGVlKHZvaWQpCit7CisJdWludDY0X3QgdmFsOworCisJdmFsID0gbWZzcHIoU1BSTl9CRVNDUik7CisJaWYgKCEodmFsICYgQkVTQ1JfUE1FTykpIHsKKwkJZWJiX3N0YXRlLnN0YXRzLnNwdXJpb3VzKys7CisJCWdvdG8gb3V0OworCX0KKworCWViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQrKzsKKwljb3VudF9wbWMoNCwgc2FtcGxlX3BlcmlvZCk7CitvdXQ6CisJaWYgKGNvdW50ZXJzX2Zyb3plbikKKwkJcmVzZXRfZWJiX3dpdGhfY2xlYXJfbWFzayhNTUNSMF9QTUFPKTsKKwllbHNlCisJCXJlc2V0X2ViYigpOworfQorCitpbnQgaW5zdHJ1Y3Rpb25fY291bnQodm9pZCkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisJdWludDY0X3Qgb3ZlcmhlYWQ7CisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHg0MDBGQSwgIlBNX1JVTl9JTlNUX0NNUEwiKTsKKwlldmVudF9sZWFkZXJfZWJiX2luaXQoJmV2ZW50KTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwlzYW1wbGVfcGVyaW9kID0gQ09VTlRFUl9PVkVSRkxPVzsKKworCXNldHVwX2ViYl9oYW5kbGVyKHBtYzRfZWJiX2NhbGxlZSk7CisJbXRzcHIoU1BSTl9NTUNSMCwgbWZzcHIoU1BSTl9NTUNSMCkgJiB+TU1DUjBfRkMpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlvdmVyaGVhZCA9IGRldGVybWluZV9vdmVyaGVhZCgmZXZlbnQpOworCXByaW50ZigiT3ZlcmhlYWQgb2YgbnVsbCBsb29wOiAlbHUgaW5zdHJ1Y3Rpb25zXG4iLCBvdmVyaGVhZCk7CisKKwkvKiBSdW4gZm9yIDFNIGluc3RydWN0aW9ucyAqLworCUZBSUxfSUYoZG9fY291bnRfbG9vcCgmZXZlbnQsIDB4MTAwMDAwLCBvdmVyaGVhZCwgdHJ1ZSkpOworCisJLyogUnVuIGZvciAxME0gaW5zdHJ1Y3Rpb25zICovCisJRkFJTF9JRihkb19jb3VudF9sb29wKCZldmVudCwgMHhhMDAwMDAsIG92ZXJoZWFkLCB0cnVlKSk7CisKKwkvKiBSdW4gZm9yIDEwME0gaW5zdHJ1Y3Rpb25zICovCisJRkFJTF9JRihkb19jb3VudF9sb29wKCZldmVudCwgMHg2NDAwMDAwLCBvdmVyaGVhZCwgdHJ1ZSkpOworCisJLyogUnVuIGZvciAxRyBpbnN0cnVjdGlvbnMgKi8KKwlGQUlMX0lGKGRvX2NvdW50X2xvb3AoJmV2ZW50LCAweDQwMDAwMDAwLCBvdmVyaGVhZCwgdHJ1ZSkpOworCisJLyogUnVuIGZvciAxNkcgaW5zdHJ1Y3Rpb25zICovCisJRkFJTF9JRihkb19jb3VudF9sb29wKCZldmVudCwgMHg0MDAwMDAwMDAsIG92ZXJoZWFkLCB0cnVlKSk7CisKKwkvKiBSdW4gZm9yIDY0RyBpbnN0cnVjdGlvbnMgKi8KKwlGQUlMX0lGKGRvX2NvdW50X2xvb3AoJmV2ZW50LCAweDEwMDAwMDAwMDAsIG92ZXJoZWFkLCB0cnVlKSk7CisKKwkvKiBSdW4gZm9yIDEyOEcgaW5zdHJ1Y3Rpb25zICovCisJRkFJTF9JRihkb19jb3VudF9sb29wKCZldmVudCwgMHgyMDAwMDAwMDAwLCBvdmVyaGVhZCwgdHJ1ZSkpOworCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCXByaW50ZigiRmluaXNoZWQgT0tcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhpbnN0cnVjdGlvbl9jb3VudCwgImluc3RydWN0aW9uX2NvdW50Iik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvbG9zdF9leGNlcHRpb25fdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2xvc3RfZXhjZXB0aW9uX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzlkZDliCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL2xvc3RfZXhjZXB0aW9uX3Rlc3QuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgImViYi5oIgorCisKKy8qCisgKiBUZXN0IHRoYXQgdHJpZXMgdG8gdHJpZ2dlciBDUFVfRlRSX1BNQU9fQlVHLiBXaGljaCBpcyBhIGhhcmR3YXJlIGRlZmVjdAorICogd2hlcmUgYW4gZXhjZXB0aW9uIHRyaWdnZXJzIGJ1dCB3ZSBjb250ZXh0IHN3aXRjaCBiZWZvcmUgaXQgaXMgZGVsaXZlcmVkIGFuZAorICogbG9zZSB0aGUgZXhjZXB0aW9uLgorICovCisKK3N0YXRpYyBpbnQgdGVzdF9ib2R5KHZvaWQpCit7CisJaW50IGksIG9yaWdfcGVyaW9kLCBtYXhfcGVyaW9kOworCXN0cnVjdCBldmVudCBldmVudDsKKworCS8qIFdlIHVzZSBQTUM0IHRvIG1ha2Ugc3VyZSB0aGUga2VybmVsIHN3aXRjaGVzIGFsbCBjb3VudGVycyBjb3JyZWN0bHkgKi8KKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHg0MDAwMiwgImluc3RydWN0aW9ucyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJZXZlbnQuYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW4oJmV2ZW50KSk7CisKKwllYmJfZW5hYmxlX3BtY19jb3VudGluZyg0KTsKKwlzZXR1cF9lYmJfaGFuZGxlcihzdGFuZGFyZF9lYmJfY2FsbGVlKTsKKwllYmJfZ2xvYmFsX2VuYWJsZSgpOworCUZBSUxfSUYoZWJiX2V2ZW50X2VuYWJsZSgmZXZlbnQpKTsKKworCS8qCisJICogV2Ugd2FudCBhIGxvdyBzYW1wbGUgcGVyaW9kLCBidXQgd2UgYWxzbyB3YW50IHRvIGdldCBvdXQgb2YgdGhlIEVCQgorCSAqIGhhbmRsZXIgd2l0aG91dCB0cmlwcGluZyB1cCBhZ2Fpbi4KKwkgKgorCSAqIFRoaXMgdmFsdWUgcGlja2VkIGFmdGVyIG11Y2ggZXhwZXJpbWVudGF0aW9uLgorCSAqLworCW9yaWdfcGVyaW9kID0gbWF4X3BlcmlvZCA9IHNhbXBsZV9wZXJpb2QgPSA0MDA7CisKKwltdHNwcihTUFJOX1BNQzQsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKworCXdoaWxlIChlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50IDwgMTAwMDAwMCkgeworCQkvKgorCQkgKiBXZSBhcmUgdHJ5aW5nIHRvIGdldCB0aGUgRUJCIGV4Y2VwdGlvbiB0byByYWNlIGV4YWN0bHkgd2l0aAorCQkgKiB1cyBlbnRlcmluZyB0aGUga2VybmVsIHRvIGRvIHRoZSBzeXNjYWxsLiBXZSB0aGVuIG5lZWQgdGhlCisJCSAqIGtlcm5lbCB0byBkZWNpZGUgb3VyIHRpbWVzbGljZSBpcyB1cCBhbmQgY29udGV4dCBzd2l0Y2ggdG8KKwkJICogdGhlIG90aGVyIHRocmVhZC4gV2hlbiB3ZSBjb21lIGJhY2sgb3VyIEVCQiB3aWxsIGhhdmUgYmVlbgorCQkgKiBsb3N0IGFuZCB3ZSdsbCBzcGluIGluIHRoaXMgd2hpbGUgbG9vcCBmb3JldmVyLgorCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspCisJCQlzY2hlZF95aWVsZCgpOworCisJCS8qIENoYW5nZSB0aGUgc2FtcGxlIHBlcmlvZCBzbGlnaHRseSB0byB0cnkgYW5kIGhpdCB0aGUgcmFjZSAqLworCQlpZiAoc2FtcGxlX3BlcmlvZCA+PSAob3JpZ19wZXJpb2QgKyAyMDApKQorCQkJc2FtcGxlX3BlcmlvZCA9IG9yaWdfcGVyaW9kOworCQllbHNlCisJCQlzYW1wbGVfcGVyaW9kKys7CisKKwkJaWYgKHNhbXBsZV9wZXJpb2QgPiBtYXhfcGVyaW9kKQorCQkJbWF4X3BlcmlvZCA9IHNhbXBsZV9wZXJpb2Q7CisJfQorCisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisKKwljb3VudF9wbWMoNCwgc2FtcGxlX3BlcmlvZCk7CisJbXRzcHIoU1BSTl9QTUM0LCAweGRlYWQpOworCisJZHVtcF9zdW1tYXJ5X2ViYl9zdGF0ZSgpOworCWR1bXBfZWJiX2h3X3N0YXRlKCk7CisKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisJRkFJTF9JRihlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50ID09IDApOworCisJLyogV2UgdmFyeSBvdXIgc2FtcGxlIHBlcmlvZCBzbyB3ZSBuZWVkIGV4dHJhIGZ1ZGdlIGhlcmUgKi8KKwlGQUlMX0lGKCFlYmJfY2hlY2tfY291bnQoNCwgb3JpZ19wZXJpb2QsIDIgKiAobWF4X3BlcmlvZCAtIG9yaWdfcGVyaW9kKSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9zdF9leGNlcHRpb24odm9pZCkKK3sKKwlyZXR1cm4gZWF0X2NwdSh0ZXN0X2JvZHkpOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3MobG9zdF9leGNlcHRpb24sICJsb3N0X2V4Y2VwdGlvbiIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL211bHRpX2NvdW50ZXJfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL211bHRpX2NvdW50ZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDc4YWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvbXVsdGlfY291bnRlcl90ZXN0LmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3QgY291bnRpbmcgbXVsdGlwbGUgZXZlbnRzIHVzaW5nIEVCQnMuCisgKi8KK2ludCBtdWx0aV9jb3VudGVyKHZvaWQpCit7CisJc3RydWN0IGV2ZW50IGV2ZW50c1s2XTsKKwlpbnQgaSwgZ3JvdXBfZmQ7CisKKwlldmVudF9pbml0X25hbWVkKCZldmVudHNbMF0sIDB4MTAwMUMsICJQTV9DTVBMVV9TVEFMTF9USFJEIik7CisJZXZlbnRfaW5pdF9uYW1lZCgmZXZlbnRzWzFdLCAweDJEMDE2LCAiUE1fQ01QTFVfU1RBTExfRlhVIik7CisJZXZlbnRfaW5pdF9uYW1lZCgmZXZlbnRzWzJdLCAweDMwMDA2LCAiUE1fQ01QTFVfU1RBTExfT1RIRVJfQ01QTCIpOworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50c1szXSwgMHg0MDAwQSwgIlBNX0NNUExVX1NUQUxMIik7CisJZXZlbnRfaW5pdF9uYW1lZCgmZXZlbnRzWzRdLCAweDYwMGY0LCAiUE1fUlVOX0NZQyIpOworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50c1s1XSwgMHg1MDBmYSwgIlBNX1JVTl9JTlNUX0NNUEwiKTsKKworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgNjsgaSsrKQorCQlldmVudF9lYmJfaW5pdCgmZXZlbnRzW2ldKTsKKworCWdyb3VwX2ZkID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlldmVudHNbaV0uYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJCWV2ZW50c1tpXS5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCQlldmVudHNbaV0uYXR0ci5leGNsdWRlX2lkbGUgPSAxOworCisJCUZBSUxfSUYoZXZlbnRfb3Blbl93aXRoX2dyb3VwKCZldmVudHNbaV0sIGdyb3VwX2ZkKSk7CisJCWlmIChncm91cF9mZCA9PSAtMSkKKwkJCWdyb3VwX2ZkID0gZXZlbnRzWzBdLmZkOworCX0KKworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDEpOworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDIpOworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDMpOworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDQpOworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDUpOworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDYpOworCXNldHVwX2ViYl9oYW5kbGVyKHN0YW5kYXJkX2ViYl9jYWxsZWUpOworCisJRkFJTF9JRihpb2N0bChldmVudHNbMF0uZmQsIFBFUkZfRVZFTlRfSU9DX0VOQUJMRSwgUEVSRl9JT0NfRkxBR19HUk9VUCkpOworCUZBSUxfSUYoZXZlbnRfcmVhZCgmZXZlbnRzWzBdKSk7CisKKwllYmJfZ2xvYmFsX2VuYWJsZSgpOworCisJbXRzcHIoU1BSTl9QTUMxLCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisJbXRzcHIoU1BSTl9QTUMyLCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisJbXRzcHIoU1BSTl9QTUMzLCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisJbXRzcHIoU1BSTl9QTUM0LCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisJbXRzcHIoU1BSTl9QTUM1LCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisJbXRzcHIoU1BSTl9QTUM2LCBwbWNfc2FtcGxlX3BlcmlvZChzYW1wbGVfcGVyaW9kKSk7CisKKwl3aGlsZSAoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA8IDUwKSB7CisJCUZBSUxfSUYoY29yZV9idXN5X2xvb3AoKSk7CisJCUZBSUxfSUYoZWJiX2NoZWNrX21tY3IwKCkpOworCX0KKworCWViYl9nbG9iYWxfZGlzYWJsZSgpOworCWViYl9mcmVlemVfcG1jcygpOworCisJY291bnRfcG1jKDEsIHNhbXBsZV9wZXJpb2QpOworCWNvdW50X3BtYygyLCBzYW1wbGVfcGVyaW9kKTsKKwljb3VudF9wbWMoMywgc2FtcGxlX3BlcmlvZCk7CisJY291bnRfcG1jKDQsIHNhbXBsZV9wZXJpb2QpOworCWNvdW50X3BtYyg1LCBzYW1wbGVfcGVyaW9kKTsKKwljb3VudF9wbWMoNiwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX2ViYl9zdGF0ZSgpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZXZlbnRfY2xvc2UoJmV2ZW50c1tpXSk7CisKKwlGQUlMX0lGKGViYl9zdGF0ZS5zdGF0cy5lYmJfY291bnQgPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKG11bHRpX2NvdW50ZXIsICJtdWx0aV9jb3VudGVyIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvbXVsdGlfZWJiX3Byb2NzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9tdWx0aV9lYmJfcHJvY3NfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZGMzNzEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvbXVsdGlfZWJiX3Byb2NzX3Rlc3QuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImViYi5oIgorCisKKy8qCisgKiBUZXN0IHJ1bm5pbmcgbXVsdGlwbGUgRUJCIHVzaW5nIHByb2Nlc3NlcyBhdCBvbmNlIG9uIGEgc2luZ2xlIENQVS4gVGhleQorICogc2hvdWxkIGFsbCBydW4gaGFwcGlseSB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlci4KKyAqLworCitzdGF0aWMgYm9vbCBjaGlsZF9zaG91bGRfZXhpdDsKKworc3RhdGljIHZvaWQgc2lnaW50X2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwljaGlsZF9zaG91bGRfZXhpdCA9IHRydWU7Cit9CisKK3N0cnVjdCBzaWdhY3Rpb24gc2lnaW50X2FjdGlvbiA9IHsKKwkuc2FfaGFuZGxlciA9IHNpZ2ludF9oYW5kbGVyLAorfTsKKworc3RhdGljIGludCBjeWNsZXNfY2hpbGQodm9pZCkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisKKwlpZiAoc2lnYWN0aW9uKFNJR0lOVCwgJnNpZ2ludF9hY3Rpb24sIE5VTEwpKSB7CisJCXBlcnJvcigic2lnYWN0aW9uIik7CisJCXJldHVybiAxOworCX0KKworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50LCAweDEwMDFlLCAiY3ljbGVzIik7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKworCWViYl9lbmFibGVfcG1jX2NvdW50aW5nKDEpOworCXNldHVwX2ViYl9oYW5kbGVyKHN0YW5kYXJkX2ViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKworCXdoaWxlICghY2hpbGRfc2hvdWxkX2V4aXQpIHsKKwkJRkFJTF9JRihjb3JlX2J1c3lfbG9vcCgpKTsKKwkJRkFJTF9JRihlYmJfY2hlY2tfbW1jcjAoKSk7CisJfQorCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisKKwljb3VudF9wbWMoMSwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX3N1bW1hcnlfZWJiX3N0YXRlKCk7CisKKwlldmVudF9jbG9zZSgmZXZlbnQpOworCisJRkFJTF9JRihlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50ID09IDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTlJfQ0hJTERSRU4JNAorCitpbnQgbXVsdGlfZWJiX3Byb2NzKHZvaWQpCit7CisJcGlkX3QgcGlkc1tOUl9DSElMRFJFTl07CisJaW50IGNwdSwgcmMsIGk7CisKKwljcHUgPSBwaWNrX29ubGluZV9jcHUoKTsKKwlGQUlMX0lGKGNwdSA8IDApOworCUZBSUxfSUYoYmluZF90b19jcHUoY3B1KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ0hJTERSRU47IGkrKykgeworCQlwaWRzW2ldID0gZm9yaygpOworCQlpZiAocGlkc1tpXSA9PSAwKQorCQkJZXhpdChjeWNsZXNfY2hpbGQoKSk7CisJfQorCisJLyogSGF2ZSB0aGVtIGFsbCBydW4gZm9yICJhIHdoaWxlIiAqLworCXNsZWVwKDEwKTsKKworCXJjID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ0hJTERSRU47IGkrKykgeworCQkvKiBUZWxsIHRoZW0gdG8gc3RvcCAqLworCQlraWxsKHBpZHNbaV0sIFNJR0lOVCk7CisJCS8qIEFuZCB3YWl0ICovCisJCXJjIHw9IHdhaXRfZm9yX2NoaWxkKHBpZHNbaV0pOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKG11bHRpX2ViYl9wcm9jcywgIm11bHRpX2ViYl9wcm9jcyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL25vX2hhbmRsZXJfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL25vX2hhbmRsZXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvbm9faGFuZGxlcl90ZXN0LmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyogVGVzdCB0aGF0IHRoaW5ncyB3b3JrIHNhbmVseSBpZiB3ZSBoYXZlIG5vIGhhbmRsZXIgKi8KKworc3RhdGljIGludCBub19oYW5kbGVyX3Rlc3Qodm9pZCkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisJdTY0IHZhbDsKKwlpbnQgaTsKKworCWV2ZW50X2luaXRfbmFtZWQoJmV2ZW50LCAweDEwMDFlLCAiY3ljbGVzIik7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwl2YWwgPSBtZnNwcihTUFJOX0VCQkhSKTsKKwlGQUlMX0lGKHZhbCAhPSAwKTsKKworCS8qIE1ha2Ugc3VyZSBpdCBvdmVyZmxvd3MgcXVpY2tseSAqLworCXNhbXBsZV9wZXJpb2QgPSAxMDAwOworCW10c3ByKFNQUk5fUE1DMSwgcG1jX3NhbXBsZV9wZXJpb2Qoc2FtcGxlX3BlcmlvZCkpOworCisJLyogU3BpbiB0byBtYWtlIHN1cmUgdGhlIGV2ZW50IGhhcyB0aW1lIHRvIG92ZXJmbG93ICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkJbWIoKTsKKworCWR1bXBfZWJiX3N0YXRlKCk7CisKKwkvKiBXZSBleHBlY3QgdG8gc2VlIHRoZSBQTVUgZnJvemVuICYgUE1BTyBzZXQgKi8KKwl2YWwgPSBtZnNwcihTUFJOX01NQ1IwKTsKKwlGQUlMX0lGKHZhbCAhPSAweDAwMDAwMDAwODAwMDAwODApOworCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCWR1bXBfZWJiX3N0YXRlKCk7CisKKwkvKiBUaGUgcmVhbCB0ZXN0IGlzIHRoYXQgd2UgbmV2ZXIgdG9vayBhbiBFQkIgYXQgMHgwICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKG5vX2hhbmRsZXJfdGVzdCwibm9faGFuZGxlcl90ZXN0Iik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvcG1hZV9oYW5kbGluZ190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvcG1hZV9oYW5kbGluZ190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2NTAwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9wbWFlX2hhbmRsaW5nX3Rlc3QuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3QgdGhhdCB0aGUga2VybmVsIHByb3Blcmx5IGhhbmRsZXMgUE1BRSBhY3Jvc3MgY29udGV4dCBzd2l0Y2hlcy4KKyAqCisgKiBXZSB0ZXN0IHRoaXMgYnkgY2FsbGluZyBpbnRvIHRoZSBrZXJuZWwgaW5zaWRlIG91ciBFQkIgaGFuZGxlciwgd2hlcmUgUE1BRQorICogaXMgY2xlYXIuIEEgY3B1IGVhdGVyIGNvbXBhbmlvbiB0aHJlYWQgaXMgcnVubmluZyBvbiB0aGUgc2FtZSBDUFUgYXMgdXMgdG8KKyAqIGVuY291cmFnZSB0aGUgc2NoZWR1bGVyIHRvIHN3aXRjaCB1cy4KKyAqCisgKiBUaGUga2VybmVsIG11c3QgbWFrZSBzdXJlIHRoYXQgd2hlbiBpdCBjb250ZXh0IHN3aXRjaGVzIHVzIGJhY2sgaW4sIGl0CisgKiBob25vdXJzIHRoZSBmYWN0IHRoYXQgd2UgaGFkIFBNQUUgY2xlYXIuCisgKgorICogT2JzZXJ2ZWQgdG8gaGl0IHRoZSBmYWlsaW5nIGNhc2Ugb24gdGhlIGZpcnN0IEVCQiB3aXRoIGEgYnJva2VuIGtlcm5lbC4KKyAqLworCitzdGF0aWMgYm9vbCBtbWNyMF9taXNtYXRjaDsKK3N0YXRpYyB1aW50NjRfdCBiZWZvcmUsIGFmdGVyOworCitzdGF0aWMgdm9pZCBzeXNjYWxsX2ViYl9jYWxsZWUodm9pZCkKK3sKKwl1aW50NjRfdCB2YWw7CisKKwl2YWwgPSBtZnNwcihTUFJOX0JFU0NSKTsKKwlpZiAoISh2YWwgJiBCRVNDUl9QTUVPKSkgeworCQllYmJfc3RhdGUuc3RhdHMuc3B1cmlvdXMrKzsKKwkJZ290byBvdXQ7CisJfQorCisJZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCsrOworCWNvdW50X3BtYygxLCBzYW1wbGVfcGVyaW9kKTsKKworCWJlZm9yZSA9IG1mc3ByKFNQUk5fTU1DUjApOworCisJLyogVHJ5IGFuZCBnZXQgb3Vyc2VsdmVzIHNjaGVkdWxlZCwgdG8gZm9yY2UgYSBQTVUgY29udGV4dCBzd2l0Y2ggKi8KKwlzY2hlZF95aWVsZCgpOworCisJYWZ0ZXIgPSBtZnNwcihTUFJOX01NQ1IwKTsKKwlpZiAoYmVmb3JlICE9IGFmdGVyKQorCQltbWNyMF9taXNtYXRjaCA9IHRydWU7CisKK291dDoKKwlyZXNldF9lYmIoKTsKK30KKworc3RhdGljIGludCB0ZXN0X2JvZHkodm9pZCkKK3sKKwlzdHJ1Y3QgZXZlbnQgZXZlbnQ7CisKKwlldmVudF9pbml0X25hbWVkKCZldmVudCwgMHgxMDAxZSwgImN5Y2xlcyIpOworCWV2ZW50X2xlYWRlcl9lYmJfaW5pdCgmZXZlbnQpOworCisJZXZlbnQuYXR0ci5leGNsdWRlX2tlcm5lbCA9IDE7CisJZXZlbnQuYXR0ci5leGNsdWRlX2h2ID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW4oJmV2ZW50KSk7CisKKwlzZXR1cF9lYmJfaGFuZGxlcihzeXNjYWxsX2ViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKworCXdoaWxlIChlYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50IDwgMjAgJiYgIW1tY3IwX21pc21hdGNoKQorCQlGQUlMX0lGKGNvcmVfYnVzeV9sb29wKCkpOworCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisKKwljb3VudF9wbWMoMSwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX2ViYl9zdGF0ZSgpOworCisJaWYgKG1tY3IwX21pc21hdGNoKQorCQlwcmludGYoIlNhdyBNTUNSMCBiZWZvcmUgMHglbHggYWZ0ZXIgMHglbHhcbiIsIGJlZm9yZSwgYWZ0ZXIpOworCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCUZBSUxfSUYoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA9PSAwKTsKKwlGQUlMX0lGKG1tY3IwX21pc21hdGNoKTsKKworCXJldHVybiAwOworfQorCitpbnQgcG1hZV9oYW5kbGluZyh2b2lkKQoreworCXJldHVybiBlYXRfY3B1KHRlc3RfYm9keSk7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhwbWFlX2hhbmRsaW5nLCAicG1hZV9oYW5kbGluZyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3BtYzU2X292ZXJmbG93X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9wbWM1Nl9vdmVyZmxvd190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwM2ZhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9wbWM1Nl9vdmVyZmxvd190ZXN0LmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3QgdGhhdCBQTUM1ICYgNiBhcmUgZnJvemVuIChpZS4gZG9uJ3Qgb3ZlcmZsb3cpIHdoZW4gdGhleSBhcmUgbm90IGJlaW5nCisgKiB1c2VkLiBUZXN0cyB0aGUgTU1DUjBfRkM1NiBsb2dpYyBpbiB0aGUga2VybmVsLgorICovCisKK3N0YXRpYyBpbnQgcG1jNTZfb3ZlcmZsb3dlZDsKKworc3RhdGljIHZvaWQgZWJiX2NhbGxlZSh2b2lkKQoreworCXVpbnQ2NF90IHZhbDsKKworCXZhbCA9IG1mc3ByKFNQUk5fQkVTQ1IpOworCWlmICghKHZhbCAmIEJFU0NSX1BNRU8pKSB7CisJCWViYl9zdGF0ZS5zdGF0cy5zcHVyaW91cysrOworCQlnb3RvIG91dDsKKwl9CisKKwllYmJfc3RhdGUuc3RhdHMuZWJiX2NvdW50Kys7CisJY291bnRfcG1jKDIsIHNhbXBsZV9wZXJpb2QpOworCisJdmFsID0gbWZzcHIoU1BSTl9QTUM1KTsKKwlpZiAodmFsID49IENPVU5URVJfT1ZFUkZMT1cpCisJCXBtYzU2X292ZXJmbG93ZWQrKzsKKworCWNvdW50X3BtYyg1LCBDT1VOVEVSX09WRVJGTE9XKTsKKworCXZhbCA9IG1mc3ByKFNQUk5fUE1DNik7CisJaWYgKHZhbCA+PSBDT1VOVEVSX09WRVJGTE9XKQorCQlwbWM1Nl9vdmVyZmxvd2VkKys7CisKKwljb3VudF9wbWMoNiwgQ09VTlRFUl9PVkVSRkxPVyk7CisKK291dDoKKwlyZXNldF9lYmIoKTsKK30KKworaW50IHBtYzU2X292ZXJmbG93KHZvaWQpCit7CisJc3RydWN0IGV2ZW50IGV2ZW50OworCisJLyogVXNlIFBNQzIgc28gd2Ugc2V0IFBNQ2pDRSwgd2hpY2ggZW5hYmxlcyBQTUM1LzYgKi8KKwlldmVudF9pbml0KCZldmVudCwgMHgyMDAxZSk7CisJZXZlbnRfbGVhZGVyX2ViYl9pbml0KCZldmVudCk7CisKKwlldmVudC5hdHRyLmV4Y2x1ZGVfa2VybmVsID0gMTsKKwlldmVudC5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LmF0dHIuZXhjbHVkZV9pZGxlID0gMTsKKworCUZBSUxfSUYoZXZlbnRfb3BlbigmZXZlbnQpKTsKKworCXNldHVwX2ViYl9oYW5kbGVyKGViYl9jYWxsZWUpOworCWViYl9nbG9iYWxfZW5hYmxlKCk7CisKKwlGQUlMX0lGKGViYl9ldmVudF9lbmFibGUoJmV2ZW50KSk7CisKKwltdHNwcihTUFJOX1BNQzEsIHBtY19zYW1wbGVfcGVyaW9kKHNhbXBsZV9wZXJpb2QpKTsKKwltdHNwcihTUFJOX1BNQzUsIDApOworCW10c3ByKFNQUk5fUE1DNiwgMCk7CisKKwl3aGlsZSAoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA8IDEwKQorCQlGQUlMX0lGKGNvcmVfYnVzeV9sb29wKCkpOworCisJZWJiX2dsb2JhbF9kaXNhYmxlKCk7CisJZWJiX2ZyZWV6ZV9wbWNzKCk7CisKKwljb3VudF9wbWMoMiwgc2FtcGxlX3BlcmlvZCk7CisKKwlkdW1wX2ViYl9zdGF0ZSgpOworCisJcHJpbnRmKCJQTUM1LzYgb3ZlcmZsb3cgJWRcbiIsIHBtYzU2X292ZXJmbG93ZWQpOworCisJZXZlbnRfY2xvc2UoJmV2ZW50KTsKKworCUZBSUxfSUYoZWJiX3N0YXRlLnN0YXRzLmViYl9jb3VudCA9PSAwIHx8IHBtYzU2X292ZXJmbG93ZWQgIT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKHBtYzU2X292ZXJmbG93LCAicG1jNTZfb3ZlcmZsb3ciKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9yZWcuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTIxYjBkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3JlZy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjaWZuZGVmIF9TRUxGVEVTVFNfUE9XRVJQQ19SRUdfSAorI2RlZmluZSBfU0VMRlRFU1RTX1BPV0VSUENfUkVHX0gKKworI2RlZmluZSBfX3N0cmluZ2lmeV8xKHgpICAgICAgICAjeAorI2RlZmluZSBfX3N0cmluZ2lmeSh4KSAgICAgICAgICBfX3N0cmluZ2lmeV8xKHgpCisKKyNkZWZpbmUgbWZzcHIocm4pICAgICAgICh7dW5zaWduZWQgbG9uZyBydmFsOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlKCJtZnNwciAlMCwiIF9fc3RyaW5naWZ5KHJuKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKHJ2YWwpKTsgcnZhbDsgfSkKKyNkZWZpbmUgbXRzcHIocm4sIHYpICAgIGFzbSB2b2xhdGlsZSgibXRzcHIgIiBfX3N0cmluZ2lmeShybikgIiwlMCIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAoKHVuc2lnbmVkIGxvbmcpKHYpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKQorCisjZGVmaW5lIG1iKCkJCWFzbSB2b2xhdGlsZSgic3luYyIgOiA6IDogIm1lbW9yeSIpOworCisjZGVmaW5lIFNQUk5fTU1DUjIgICAgIDc2OQorI2RlZmluZSBTUFJOX01NQ1JBICAgICA3NzAKKyNkZWZpbmUgU1BSTl9NTUNSMCAgICAgNzc5CisjZGVmaW5lICAgTU1DUjBfUE1BTyAgIDB4MDAwMDAwODAKKyNkZWZpbmUgICBNTUNSMF9QTUFFICAgMHgwNDAwMDAwMAorI2RlZmluZSAgIE1NQ1IwX0ZDICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNQUk5fRUJCSFIgICAgIDgwNAorI2RlZmluZSBTUFJOX0VCQlJSICAgICA4MDUKKyNkZWZpbmUgU1BSTl9CRVNDUiAgICAgODA2ICAgICAvKiBCcmFuY2ggZXZlbnQgc3RhdHVzICYgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTUFJOX0JFU0NSUyAgICA4MDAgICAgIC8qIEJyYW5jaCBldmVudCBzdGF0dXMgJiBjb250cm9sIHNldCAoMSBiaXRzIHNldCB0byAxKSAqLworI2RlZmluZSBTUFJOX0JFU0NSU1UgICA4MDEgICAgIC8qIEJyYW5jaCBldmVudCBzdGF0dXMgJiBjb250cm9sIHNldCB1cHBlciAqLworI2RlZmluZSBTUFJOX0JFU0NSUiAgICA4MDIgICAgIC8qIEJyYW5jaCBldmVudCBzdGF0dXMgJiBjb250cm9sIFJFc2V0ICgxIGJpdHMgc2V0IHRvIDApICovCisjZGVmaW5lIFNQUk5fQkVTQ1JSVSAgIDgwMyAgICAgLyogQnJhbmNoIGV2ZW50IHN0YXR1cyAmIGNvbnRyb2wgUkVzZXQgdXBwZXIgKi8KKworI2RlZmluZSBCRVNDUl9QTUVPICAgICAweDEgICAgIC8qIFBNVSBFdmVudC1iYXNlZCBleGNlcHRpb24gT2NjdXJyZWQgKi8KKyNkZWZpbmUgQkVTQ1JfUE1FICAgICAgKDB4MXVsIDw8IDMyKSAvKiBQTVUgRXZlbnQtYmFzZWQgZXhjZXB0aW9uIEVuYWJsZSAqLworCisjZGVmaW5lIFNQUk5fUE1DMSAgICAgIDc3MQorI2RlZmluZSBTUFJOX1BNQzIgICAgICA3NzIKKyNkZWZpbmUgU1BSTl9QTUMzICAgICAgNzczCisjZGVmaW5lIFNQUk5fUE1DNCAgICAgIDc3NAorI2RlZmluZSBTUFJOX1BNQzUgICAgICA3NzUKKyNkZWZpbmUgU1BSTl9QTUM2ICAgICAgNzc2CisKKyNkZWZpbmUgU1BSTl9TSUFSICAgICAgNzgwCisjZGVmaW5lIFNQUk5fU0RBUiAgICAgIDc4MQorI2RlZmluZSBTUFJOX1NJRVIgICAgICA3NjgKKworI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3JlZ19hY2Nlc3NfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3JlZ19hY2Nlc3NfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWU2NmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvcmVnX2FjY2Vzc190ZXN0LmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisjaW5jbHVkZSAicmVnLmgiCisKKworLyoKKyAqIFRlc3QgYmFzaWMgYWNjZXNzIHRvIHRoZSBFQkIgcmVncywgdGhleSBzaG91bGQgYmUgdXNlciBhY2Nlc3NpYmxlIHdpdGggbm8KKyAqIGtlcm5lbCBpbnRlcmFjdGlvbiByZXF1aXJlZC4KKyAqLworaW50IHJlZ19hY2Nlc3Modm9pZCkKK3sKKwl1aW50NjRfdCB2YWwsIGV4cGVjdGVkOworCisJZXhwZWN0ZWQgPSAweDgwMDAwMDAxMDAwMDAwMDB1bGw7CisJbXRzcHIoU1BSTl9CRVNDUiwgZXhwZWN0ZWQpOworCXZhbCA9IG1mc3ByKFNQUk5fQkVTQ1IpOworCisJRkFJTF9JRih2YWwgIT0gZXhwZWN0ZWQpOworCisJZXhwZWN0ZWQgPSAweDAwMDAwMDAwMDEwMDAwMDB1bGw7CisJbXRzcHIoU1BSTl9FQkJIUiwgZXhwZWN0ZWQpOworCXZhbCA9IG1mc3ByKFNQUk5fRUJCSFIpOworCisJRkFJTF9JRih2YWwgIT0gZXhwZWN0ZWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyhyZWdfYWNjZXNzLCAicmVnX2FjY2VzcyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3Rhc2tfZXZlbnRfcGlubmVkX3ZzX2ViYl90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdGFza19ldmVudF9waW5uZWRfdnNfZWJiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY2MDdlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL3Rhc2tfZXZlbnRfcGlubmVkX3ZzX2ViYl90ZXN0LmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZWJiLmgiCisKKworLyoKKyAqIFRlc3RzIGEgcGlubmVkIHBlci10YXNrIGV2ZW50IHZzIGFuIEVCQiAtIGluIHRoYXQgb3JkZXIuIFRoZSBwaW5uZWQgcGVyLXRhc2sKKyAqIGV2ZW50IHNob3VsZCBwcmV2ZW50IHRoZSBFQkIgZXZlbnQgZnJvbSBiZWluZyBlbmFibGVkLgorICovCisKK3N0YXRpYyBpbnQgc2V0dXBfY2hpbGRfZXZlbnQoc3RydWN0IGV2ZW50ICpldmVudCwgcGlkX3QgY2hpbGRfcGlkKQoreworCWV2ZW50X2luaXRfbmFtZWQoZXZlbnQsIDB4NDAwRkEsICJQTV9SVU5fSU5TVF9DTVBMIik7CisKKwlldmVudC0+YXR0ci5waW5uZWQgPSAxOworCisJZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9waWQoZXZlbnQsIGNoaWxkX3BpZCkpOworCUZBSUxfSUYoZXZlbnRfZW5hYmxlKGV2ZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRhc2tfZXZlbnRfcGlubmVkX3ZzX2ViYih2b2lkKQoreworCXVuaW9uIHBpcGUgcmVhZF9waXBlLCB3cml0ZV9waXBlOworCXN0cnVjdCBldmVudCBldmVudDsKKwlwaWRfdCBwaWQ7CisJaW50IHJjOworCisJRkFJTF9JRihwaXBlKHJlYWRfcGlwZS5mZHMpID09IC0xKTsKKwlGQUlMX0lGKHBpcGUod3JpdGVfcGlwZS5mZHMpID09IC0xKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogTkIgb3JkZXIgb2YgcGlwZXMgbG9va3MgcmV2ZXJzZWQgKi8KKwkJZXhpdChlYmJfY2hpbGQod3JpdGVfcGlwZSwgcmVhZF9waXBlKSk7CisJfQorCisJLyogV2Ugc2V0dXAgdGhlIHRhc2sgZXZlbnQgZmlyc3QgKi8KKwlyYyA9IHNldHVwX2NoaWxkX2V2ZW50KCZldmVudCwgcGlkKTsKKwlpZiAocmMpIHsKKwkJa2lsbF9jaGlsZF9hbmRfd2FpdChwaWQpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogU2lnbmFsIHRoZSBjaGlsZCB0byBpbnN0YWxsIGl0cyBFQkIgZXZlbnQgYW5kIHdhaXQgKi8KKwlpZiAoc3luY193aXRoX2NoaWxkKHJlYWRfcGlwZSwgd3JpdGVfcGlwZSkpCisJCS8qIElmIGl0IGZhaWxzLCB3YWl0IGZvciBpdCB0byBleGl0ICovCisJCWdvdG8gd2FpdDsKKworCS8qIFNpZ25hbCB0aGUgY2hpbGQgdG8gcnVuICovCisJRkFJTF9JRihzeW5jX3dpdGhfY2hpbGQocmVhZF9waXBlLCB3cml0ZV9waXBlKSk7CisKK3dhaXQ6CisJLyogV2UgZXhwZWN0IGl0IHRvIGZhaWwgdG8gcmVhZCB0aGUgZXZlbnQgKi8KKwlGQUlMX0lGKHdhaXRfZm9yX2NoaWxkKHBpZCkgIT0gMik7CisJRkFJTF9JRihldmVudF9kaXNhYmxlKCZldmVudCkpOworCUZBSUxfSUYoZXZlbnRfcmVhZCgmZXZlbnQpKTsKKworCWV2ZW50X3JlcG9ydCgmZXZlbnQpOworCisJRkFJTF9JRihldmVudC5yZXN1bHQudmFsdWUgPT0gMCk7CisJLyoKKwkgKiBGb3IgcmVhc29ucyBJIGRvbid0IHVuZGVyc3RhbmQgZW5hYmxlZCBpcyB1c3VhbGx5IGp1c3Qgc2xpZ2h0bHkKKwkgKiBsb3dlciB0aGFuIHJ1bm5pbmcuIFdvdWxkIGJlIGdvb2QgdG8gY29uZmlybSB3aHkuCisJICovCisJRkFJTF9JRihldmVudC5yZXN1bHQuZW5hYmxlZCA9PSAwKTsKKwlGQUlMX0lGKGV2ZW50LnJlc3VsdC5ydW5uaW5nID09IDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyh0YXNrX2V2ZW50X3Bpbm5lZF92c19lYmIsICJ0YXNrX2V2ZW50X3Bpbm5lZF92c19lYmIiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi90YXNrX2V2ZW50X3ZzX2ViYl90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdGFza19ldmVudF92c19lYmJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTMyMTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdGFza19ldmVudF92c19lYmJfdGVzdC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImViYi5oIgorCisKKy8qCisgKiBUZXN0cyBhIHBlci10YXNrIGV2ZW50IHZzIGFuIEVCQiAtIGluIHRoYXQgb3JkZXIuIFRoZSBFQkIgc2hvdWxkIHB1c2ggdGhlCisgKiBwZXItdGFzayBldmVudCBvZmYgdGhlIFBNVS4KKyAqLworCitzdGF0aWMgaW50IHNldHVwX2NoaWxkX2V2ZW50KHN0cnVjdCBldmVudCAqZXZlbnQsIHBpZF90IGNoaWxkX3BpZCkKK3sKKwlldmVudF9pbml0X25hbWVkKGV2ZW50LCAweDQwMEZBLCAiUE1fUlVOX0lOU1RfQ01QTCIpOworCisJZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgPSAxOworCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSA9IDE7CisKKwlGQUlMX0lGKGV2ZW50X29wZW5fd2l0aF9waWQoZXZlbnQsIGNoaWxkX3BpZCkpOworCUZBSUxfSUYoZXZlbnRfZW5hYmxlKGV2ZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRhc2tfZXZlbnRfdnNfZWJiKHZvaWQpCit7CisJdW5pb24gcGlwZSByZWFkX3BpcGUsIHdyaXRlX3BpcGU7CisJc3RydWN0IGV2ZW50IGV2ZW50OworCXBpZF90IHBpZDsKKwlpbnQgcmM7CisKKwlGQUlMX0lGKHBpcGUocmVhZF9waXBlLmZkcykgPT0gLTEpOworCUZBSUxfSUYocGlwZSh3cml0ZV9waXBlLmZkcykgPT0gLTEpOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBOQiBvcmRlciBvZiBwaXBlcyBsb29rcyByZXZlcnNlZCAqLworCQlleGl0KGViYl9jaGlsZCh3cml0ZV9waXBlLCByZWFkX3BpcGUpKTsKKwl9CisKKwkvKiBXZSBzZXR1cCB0aGUgdGFzayBldmVudCBmaXJzdCAqLworCXJjID0gc2V0dXBfY2hpbGRfZXZlbnQoJmV2ZW50LCBwaWQpOworCWlmIChyYykgeworCQlraWxsX2NoaWxkX2FuZF93YWl0KHBpZCk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBTaWduYWwgdGhlIGNoaWxkIHRvIGluc3RhbGwgaXRzIEVCQiBldmVudCBhbmQgd2FpdCAqLworCWlmIChzeW5jX3dpdGhfY2hpbGQocmVhZF9waXBlLCB3cml0ZV9waXBlKSkKKwkJLyogSWYgaXQgZmFpbHMsIHdhaXQgZm9yIGl0IHRvIGV4aXQgKi8KKwkJZ290byB3YWl0OworCisJLyogU2lnbmFsIHRoZSBjaGlsZCB0byBydW4gKi8KKwlGQUlMX0lGKHN5bmNfd2l0aF9jaGlsZChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpKTsKKword2FpdDoKKwkvKiBUaGUgRUJCIGV2ZW50IHNob3VsZCBwdXNoIHRoZSB0YXNrIGV2ZW50IG9mZiBzbyB0aGUgY2hpbGQgc2hvdWxkIHN1Y2NlZWQgKi8KKwlGQUlMX0lGKHdhaXRfZm9yX2NoaWxkKHBpZCkpOworCUZBSUxfSUYoZXZlbnRfZGlzYWJsZSgmZXZlbnQpKTsKKwlGQUlMX0lGKGV2ZW50X3JlYWQoJmV2ZW50KSk7CisKKwlldmVudF9yZXBvcnQoJmV2ZW50KTsKKworCS8qIFRoZSB0YXNrIGV2ZW50IG1heSBoYXZlIHJ1biwgb3Igbm90IHNvIHdlIGNhbid0IGFzc2VydCBhbnl0aGluZyBhYm91dCBpdCAqLworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyh0YXNrX2V2ZW50X3ZzX2ViYiwgInRhc2tfZXZlbnRfdnNfZWJiIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdHJhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MWU2NmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdHJhY2UuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgInRyYWNlLmgiCisKKworc3RydWN0IHRyYWNlX2J1ZmZlciAqdHJhY2VfYnVmZmVyX2FsbG9jYXRlKHU2NCBzaXplKQoreworCXN0cnVjdCB0cmFjZV9idWZmZXIgKnRiOworCisJaWYgKHNpemUgPCBzaXplb2YoKnRiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB0cmFjZSBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisJaWYgKHRiID09IE1BUF9GQUlMRUQpIHsKKwkJcGVycm9yKCJtbWFwIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXRiLT5zaXplID0gc2l6ZTsKKwl0Yi0+dGFpbCA9IHRiLT5kYXRhOworCXRiLT5vdmVyZmxvdyA9IGZhbHNlOworCisJcmV0dXJuIHRiOworfQorCitzdGF0aWMgYm9vbCB0cmFjZV9jaGVja19ib3VuZHMoc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIsIHZvaWQgKnApCit7CisJcmV0dXJuIHAgPCAoKHZvaWQgKil0YiArIHRiLT5zaXplKTsKK30KKworc3RhdGljIGJvb2wgdHJhY2VfY2hlY2tfYWxsb2Moc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIsIHZvaWQgKnApCit7CisJLyoKKwkgKiBJZiB3ZSBldmVyIG92ZXJmbG93ZWQgZG9uJ3QgYWxsb3cgYW55IG1vcmUgaW5wdXQuIFRoaXMgcHJldmVudHMgdXMKKwkgKiBmcm9tIGRyb3BwaW5nIGEgbGFyZ2UgaXRlbSBhbmQgdGhlbiBsYXRlciBsb2dnaW5nIGEgc21hbGwgb25lLiBUaGUKKwkgKiBidWZmZXIgc2hvdWxkIGp1c3Qgc3RvcCB3aGVuIG92ZXJmbG93IGhhcHBlbmVkLCBub3QgYmUgcGF0Y2h5LiBJZgorCSAqIHlvdSdyZSBvdmVyZmxvd2luZywgbWFrZSB5b3VyIGJ1ZmZlciBiaWdnZXIuCisJICovCisJaWYgKHRiLT5vdmVyZmxvdykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCF0cmFjZV9jaGVja19ib3VuZHModGIsIHApKSB7CisJCXRiLT5vdmVyZmxvdyA9IHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgKnRyYWNlX2FsbG9jKHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiLCBpbnQgYnl0ZXMpCit7CisJdm9pZCAqcCwgKm5ld3RhaWw7CisKKwlwID0gdGItPnRhaWw7CisJbmV3dGFpbCA9IHRiLT50YWlsICsgYnl0ZXM7CisJaWYgKCF0cmFjZV9jaGVja19hbGxvYyh0YiwgbmV3dGFpbCkpCisJCXJldHVybiBOVUxMOworCisJdGItPnRhaWwgPSBuZXd0YWlsOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJhY2VfZW50cnkgKnRyYWNlX2FsbG9jX2VudHJ5KHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiLCBpbnQgcGF5bG9hZF9zaXplKQoreworCXN0cnVjdCB0cmFjZV9lbnRyeSAqZTsKKworCWUgPSB0cmFjZV9hbGxvYyh0Yiwgc2l6ZW9mKCplKSArIHBheWxvYWRfc2l6ZSk7CisJaWYgKGUpCisJCWUtPmxlbmd0aCA9IHBheWxvYWRfc2l6ZTsKKworCXJldHVybiBlOworfQorCitpbnQgdHJhY2VfbG9nX3JlZyhzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0YiwgdTY0IHJlZywgdTY0IHZhbHVlKQoreworCXN0cnVjdCB0cmFjZV9lbnRyeSAqZTsKKwl1NjQgKnA7CisKKwllID0gdHJhY2VfYWxsb2NfZW50cnkodGIsIHNpemVvZihyZWcpICsgc2l6ZW9mKHZhbHVlKSk7CisJaWYgKCFlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWUtPnR5cGUgPSBUUkFDRV9UWVBFX1JFRzsKKwlwID0gKHU2NCAqKWUtPmRhdGE7CisJKnArKyA9IHJlZzsKKwkqcCsrID0gdmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYWNlX2xvZ19jb3VudGVyKHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiLCB1NjQgdmFsdWUpCit7CisJc3RydWN0IHRyYWNlX2VudHJ5ICplOworCXU2NCAqcDsKKworCWUgPSB0cmFjZV9hbGxvY19lbnRyeSh0Yiwgc2l6ZW9mKHZhbHVlKSk7CisJaWYgKCFlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWUtPnR5cGUgPSBUUkFDRV9UWVBFX0NPVU5URVI7CisJcCA9ICh1NjQgKillLT5kYXRhOworCSpwKysgPSB2YWx1ZTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhY2VfbG9nX3N0cmluZyhzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0YiwgY2hhciAqc3RyKQoreworCXN0cnVjdCB0cmFjZV9lbnRyeSAqZTsKKwljaGFyICpwOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4oc3RyKTsKKworCS8qIFdlIE5VTEwgdGVybWluYXRlIHRvIG1ha2UgcHJpbnRpbmcgZWFzaWVyICovCisJZSA9IHRyYWNlX2FsbG9jX2VudHJ5KHRiLCBsZW4gKyAxKTsKKwlpZiAoIWUpCisJCXJldHVybiAtRU5PU1BDOworCisJZS0+dHlwZSA9IFRSQUNFX1RZUEVfU1RSSU5HOworCXAgPSAoY2hhciAqKWUtPmRhdGE7CisJbWVtY3B5KHAsIHN0ciwgbGVuKTsKKwlwICs9IGxlbjsKKwkqcCA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYWNlX2xvZ19pbmRlbnQoc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIpCit7CisJc3RydWN0IHRyYWNlX2VudHJ5ICplOworCisJZSA9IHRyYWNlX2FsbG9jX2VudHJ5KHRiLCAwKTsKKwlpZiAoIWUpCisJCXJldHVybiAtRU5PU1BDOworCisJZS0+dHlwZSA9IFRSQUNFX1RZUEVfSU5ERU5UOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmFjZV9sb2dfb3V0ZGVudChzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0YikKK3sKKwlzdHJ1Y3QgdHJhY2VfZW50cnkgKmU7CisKKwllID0gdHJhY2VfYWxsb2NfZW50cnkodGIsIDApOworCWlmICghZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwllLT50eXBlID0gVFJBQ0VfVFlQRV9PVVRERU5UOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50X2hlYWRlcihpbnQgc2VxLCBpbnQgcHJlZml4KQoreworCXByaW50ZigiJSpzWyVkXTogIiwgcHJlZml4LCAiIiwgc2VxKTsKK30KKworc3RhdGljIGNoYXIgKnRyYWNlX2RlY29kZV9yZWcoaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCQljYXNlIDc2OTogcmV0dXJuICJTUFJOX01NQ1IyIjsgYnJlYWs7CisJCWNhc2UgNzcwOiByZXR1cm4gIlNQUk5fTU1DUkEiOyBicmVhazsKKwkJY2FzZSA3Nzk6IHJldHVybiAiU1BSTl9NTUNSMCI7IGJyZWFrOworCQljYXNlIDgwNDogcmV0dXJuICJTUFJOX0VCQkhSIjsgYnJlYWs7CisJCWNhc2UgODA1OiByZXR1cm4gIlNQUk5fRUJCUlIiOyBicmVhazsKKwkJY2FzZSA4MDY6IHJldHVybiAiU1BSTl9CRVNDUiI7IGJyZWFrOworCQljYXNlIDgwMDogcmV0dXJuICJTUFJOX0JFU0NSUyI7IGJyZWFrOworCQljYXNlIDgwMTogcmV0dXJuICJTUFJOX0JFU0NSU1UiOyBicmVhazsKKwkJY2FzZSA4MDI6IHJldHVybiAiU1BSTl9CRVNDUlIiOyBicmVhazsKKwkJY2FzZSA4MDM6IHJldHVybiAiU1BSTl9CRVNDUlJVIjsgYnJlYWs7CisJCWNhc2UgNzcxOiByZXR1cm4gIlNQUk5fUE1DMSI7IGJyZWFrOworCQljYXNlIDc3MjogcmV0dXJuICJTUFJOX1BNQzIiOyBicmVhazsKKwkJY2FzZSA3NzM6IHJldHVybiAiU1BSTl9QTUMzIjsgYnJlYWs7CisJCWNhc2UgNzc0OiByZXR1cm4gIlNQUk5fUE1DNCI7IGJyZWFrOworCQljYXNlIDc3NTogcmV0dXJuICJTUFJOX1BNQzUiOyBicmVhazsKKwkJY2FzZSA3NzY6IHJldHVybiAiU1BSTl9QTUM2IjsgYnJlYWs7CisJCWNhc2UgNzgwOiByZXR1cm4gIlNQUk5fU0lBUiI7IGJyZWFrOworCQljYXNlIDc4MTogcmV0dXJuICJTUFJOX1NEQVIiOyBicmVhazsKKwkJY2FzZSA3Njg6IHJldHVybiAiU1BSTl9TSUVSIjsgYnJlYWs7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50X3JlZyhzdHJ1Y3QgdHJhY2VfZW50cnkgKmUpCit7CisJdTY0ICpwLCAqcmVnLCAqdmFsdWU7CisJY2hhciAqbmFtZTsKKworCXAgPSAodTY0ICopZS0+ZGF0YTsKKwlyZWcgPSBwKys7CisJdmFsdWUgPSBwOworCisJbmFtZSA9IHRyYWNlX2RlY29kZV9yZWcoKnJlZyk7CisJaWYgKG5hbWUpCisJCXByaW50ZigicmVnaXN0ZXIgJS0xMHMgPSAweCUwMTZsbHhcbiIsIG5hbWUsICp2YWx1ZSk7CisJZWxzZQorCQlwcmludGYoInJlZ2lzdGVyICVsbGQgPSAweCUwMTZsbHhcbiIsICpyZWcsICp2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50X2NvdW50ZXIoc3RydWN0IHRyYWNlX2VudHJ5ICplKQoreworCXU2NCAqdmFsdWU7CisKKwl2YWx1ZSA9ICh1NjQgKillLT5kYXRhOworCXByaW50ZigiY291bnRlciA9ICVsbGRcbiIsICp2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50X3N0cmluZyhzdHJ1Y3QgdHJhY2VfZW50cnkgKmUpCit7CisJY2hhciAqc3RyOworCisJc3RyID0gKGNoYXIgKillLT5kYXRhOworCXB1dHMoc3RyKTsKK30KKworI2RlZmluZSBCQVNFX1BSRUZJWAkyCisjZGVmaW5lIFBSRUZJWF9ERUxUQQk4CisKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50X2VudHJ5KHN0cnVjdCB0cmFjZV9lbnRyeSAqZSwgaW50IHNlcSwgaW50ICpwcmVmaXgpCit7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBUUkFDRV9UWVBFX1JFRzoKKwkJdHJhY2VfcHJpbnRfaGVhZGVyKHNlcSwgKnByZWZpeCk7CisJCXRyYWNlX3ByaW50X3JlZyhlKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFDRV9UWVBFX0NPVU5URVI6CisJCXRyYWNlX3ByaW50X2hlYWRlcihzZXEsICpwcmVmaXgpOworCQl0cmFjZV9wcmludF9jb3VudGVyKGUpOworCQlicmVhazsKKwljYXNlIFRSQUNFX1RZUEVfU1RSSU5HOgorCQl0cmFjZV9wcmludF9oZWFkZXIoc2VxLCAqcHJlZml4KTsKKwkJdHJhY2VfcHJpbnRfc3RyaW5nKGUpOworCQlicmVhazsKKwljYXNlIFRSQUNFX1RZUEVfSU5ERU5UOgorCQl0cmFjZV9wcmludF9oZWFkZXIoc2VxLCAqcHJlZml4KTsKKwkJcHV0cygieyIpOworCQkqcHJlZml4ICs9IFBSRUZJWF9ERUxUQTsKKwkJYnJlYWs7CisJY2FzZSBUUkFDRV9UWVBFX09VVERFTlQ6CisJCSpwcmVmaXggLT0gUFJFRklYX0RFTFRBOworCQlpZiAoKnByZWZpeCA8IEJBU0VfUFJFRklYKQorCQkJKnByZWZpeCA9IEJBU0VfUFJFRklYOworCQl0cmFjZV9wcmludF9oZWFkZXIoc2VxLCAqcHJlZml4KTsKKwkJcHV0cygifSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0cmFjZV9wcmludF9oZWFkZXIoc2VxLCAqcHJlZml4KTsKKwkJcHJpbnRmKCJlbnRyeSBAICVwIHR5cGUgJWRcbiIsIGUsIGUtPnR5cGUpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgdHJhY2VfYnVmZmVyX3ByaW50KHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiKQoreworCXN0cnVjdCB0cmFjZV9lbnRyeSAqZTsKKwlpbnQgaSwgcHJlZml4OworCXZvaWQgKnA7CisKKwlwcmludGYoIlRyYWNlIGJ1ZmZlciBkdW1wOlxuIik7CisJcHJpbnRmKCIgIGFkZHJlc3MgICVwIFxuIiwgdGIpOworCXByaW50ZigiICB0YWlsICAgICAlcFxuIiwgdGItPnRhaWwpOworCXByaW50ZigiICBzaXplICAgICAlbGx1XG4iLCB0Yi0+c2l6ZSk7CisJcHJpbnRmKCIgIG92ZXJmbG93ICVzXG4iLCB0Yi0+b3ZlcmZsb3cgPyAiVFJVRSIgOiAiZmFsc2UiKTsKKwlwcmludGYoIiAgQ29udGVudDpcbiIpOworCisJcCA9IHRiLT5kYXRhOworCisJaSA9IDA7CisJcHJlZml4ID0gQkFTRV9QUkVGSVg7CisKKwl3aGlsZSAodHJhY2VfY2hlY2tfYm91bmRzKHRiLCBwKSAmJiBwIDwgdGItPnRhaWwpIHsKKwkJZSA9IHA7CisKKwkJdHJhY2VfcHJpbnRfZW50cnkoZSwgaSwgJnByZWZpeCk7CisKKwkJaSsrOworCQlwID0gKHZvaWQgKillICsgc2l6ZW9mKCplKSArIGUtPmxlbmd0aDsKKwl9Cit9CisKK3ZvaWQgdHJhY2VfcHJpbnRfbG9jYXRpb24oc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIpCit7CisJcHJpbnRmKCJUcmFjZSBidWZmZXIgMHglbGx4IGJ5dGVzIEAgJXBcbiIsIHRiLT5zaXplLCB0Yik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdHJhY2UuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvdHJhY2UuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIuCisgKi8KKworI2lmbmRlZiBfU0VMRlRFU1RTX1BPV0VSUENfUE1VX0VCQl9UUkFDRV9ICisjZGVmaW5lIF9TRUxGVEVTVFNfUE9XRVJQQ19QTVVfRUJCX1RSQUNFX0gKKworI2luY2x1ZGUgInV0aWxzLmgiCisKKyNkZWZpbmUgVFJBQ0VfVFlQRV9SRUcJCTEKKyNkZWZpbmUgVFJBQ0VfVFlQRV9DT1VOVEVSCTIKKyNkZWZpbmUgVFJBQ0VfVFlQRV9TVFJJTkcJMworI2RlZmluZSBUUkFDRV9UWVBFX0lOREVOVAk0CisjZGVmaW5lIFRSQUNFX1RZUEVfT1VUREVOVAk1CisKK3N0cnVjdCB0cmFjZV9lbnRyeQoreworCXU4IHR5cGU7CisJdTggbGVuZ3RoOworCXU4IGRhdGFbMF07Cit9OworCitzdHJ1Y3QgdHJhY2VfYnVmZmVyCit7CisJdTY0ICBzaXplOworCWJvb2wgb3ZlcmZsb3c7CisJdm9pZCAqdGFpbDsKKwl1OCAgIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0cmFjZV9idWZmZXJfYWxsb2NhdGUodTY0IHNpemUpOworaW50IHRyYWNlX2xvZ19yZWcoc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIsIHU2NCByZWcsIHU2NCB2YWx1ZSk7CitpbnQgdHJhY2VfbG9nX2NvdW50ZXIoc3RydWN0IHRyYWNlX2J1ZmZlciAqdGIsIHU2NCB2YWx1ZSk7CitpbnQgdHJhY2VfbG9nX3N0cmluZyhzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0YiwgY2hhciAqc3RyKTsKK2ludCB0cmFjZV9sb2dfaW5kZW50KHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiKTsKK2ludCB0cmFjZV9sb2dfb3V0ZGVudChzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0Yik7Cit2b2lkIHRyYWNlX2J1ZmZlcl9wcmludChzdHJ1Y3QgdHJhY2VfYnVmZmVyICp0Yik7Cit2b2lkIHRyYWNlX3ByaW50X2xvY2F0aW9uKHN0cnVjdCB0cmFjZV9idWZmZXIgKnRiKTsKKworI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19QTVVfRUJCX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2V2ZW50LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9ldmVudC5jCmluZGV4IDJiMmQxMWQuLjE4NGIzNjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2V2ZW50LmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZXZlbnQuYwpAQCAtMzksNyArMzksMTMgQEAKIAlldmVudF9pbml0X29wdHMoZSwgY29uZmlnLCBQRVJGX1RZUEVfUkFXLCBuYW1lKTsKIH0KIAordm9pZCBldmVudF9pbml0KHN0cnVjdCBldmVudCAqZSwgdTY0IGNvbmZpZykKK3sKKwlldmVudF9pbml0X29wdHMoZSwgY29uZmlnLCBQRVJGX1RZUEVfUkFXLCAiZXZlbnQiKTsKK30KKwogI2RlZmluZSBQRVJGX0NVUlJFTlRfUElECTAKKyNkZWZpbmUgUEVSRl9OT19QSUQJCS0xCiAjZGVmaW5lIFBFUkZfTk9fQ1BVCQktMQogI2RlZmluZSBQRVJGX05PX0dST1VQCQktMQogCkBAIC01OSw2ICs2NSwxNiBAQAogCXJldHVybiBldmVudF9vcGVuX3dpdGhfb3B0aW9ucyhlLCBQRVJGX0NVUlJFTlRfUElELCBQRVJGX05PX0NQVSwgZ3JvdXBfZmQpOwogfQogCitpbnQgZXZlbnRfb3Blbl93aXRoX3BpZChzdHJ1Y3QgZXZlbnQgKmUsIHBpZF90IHBpZCkKK3sKKwlyZXR1cm4gZXZlbnRfb3Blbl93aXRoX29wdGlvbnMoZSwgcGlkLCBQRVJGX05PX0NQVSwgUEVSRl9OT19HUk9VUCk7Cit9CisKK2ludCBldmVudF9vcGVuX3dpdGhfY3B1KHN0cnVjdCBldmVudCAqZSwgaW50IGNwdSkKK3sKKwlyZXR1cm4gZXZlbnRfb3Blbl93aXRoX29wdGlvbnMoZSwgUEVSRl9OT19QSUQsIGNwdSwgUEVSRl9OT19HUk9VUCk7Cit9CisKIGludCBldmVudF9vcGVuKHN0cnVjdCBldmVudCAqZSkKIHsKIAlyZXR1cm4gZXZlbnRfb3Blbl93aXRoX29wdGlvbnMoZSwgUEVSRl9DVVJSRU5UX1BJRCwgUEVSRl9OT19DUFUsIFBFUkZfTk9fR1JPVVApOwpAQCAtNjksNiArODUsMTYgQEAKIAljbG9zZShlLT5mZCk7CiB9CiAKK2ludCBldmVudF9lbmFibGUoc3RydWN0IGV2ZW50ICplKQoreworCXJldHVybiBpb2N0bChlLT5mZCwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFKTsKK30KKworaW50IGV2ZW50X2Rpc2FibGUoc3RydWN0IGV2ZW50ICplKQoreworCXJldHVybiBpb2N0bChlLT5mZCwgUEVSRl9FVkVOVF9JT0NfRElTQUJMRSk7Cit9CisKIGludCBldmVudF9yZXNldChzdHJ1Y3QgZXZlbnQgKmUpCiB7CiAJcmV0dXJuIGlvY3RsKGUtPmZkLCBQRVJGX0VWRU5UX0lPQ19SRVNFVCk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9ldmVudC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZXZlbnQuaAppbmRleCBlNjk5MzE5Li5hMGVhNmIxIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9ldmVudC5oCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2V2ZW50LmgKQEAgLTI5LDggKzI5LDEyIEBACiB2b2lkIGV2ZW50X2luaXRfb3B0cyhzdHJ1Y3QgZXZlbnQgKmUsIHU2NCBjb25maWcsIGludCB0eXBlLCBjaGFyICpuYW1lKTsKIGludCBldmVudF9vcGVuX3dpdGhfb3B0aW9ucyhzdHJ1Y3QgZXZlbnQgKmUsIHBpZF90IHBpZCwgaW50IGNwdSwgaW50IGdyb3VwX2ZkKTsKIGludCBldmVudF9vcGVuX3dpdGhfZ3JvdXAoc3RydWN0IGV2ZW50ICplLCBpbnQgZ3JvdXBfZmQpOworaW50IGV2ZW50X29wZW5fd2l0aF9waWQoc3RydWN0IGV2ZW50ICplLCBwaWRfdCBwaWQpOworaW50IGV2ZW50X29wZW5fd2l0aF9jcHUoc3RydWN0IGV2ZW50ICplLCBpbnQgY3B1KTsKIGludCBldmVudF9vcGVuKHN0cnVjdCBldmVudCAqZSk7CiB2b2lkIGV2ZW50X2Nsb3NlKHN0cnVjdCBldmVudCAqZSk7CitpbnQgZXZlbnRfZW5hYmxlKHN0cnVjdCBldmVudCAqZSk7CitpbnQgZXZlbnRfZGlzYWJsZShzdHJ1Y3QgZXZlbnQgKmUpOwogaW50IGV2ZW50X3Jlc2V0KHN0cnVjdCBldmVudCAqZSk7CiBpbnQgZXZlbnRfcmVhZChzdHJ1Y3QgZXZlbnQgKmUpOwogdm9pZCBldmVudF9yZXBvcnRfanVzdGlmaWVkKHN0cnVjdCBldmVudCAqZSwgaW50IG5hbWVfd2lkdGgsIGludCByZXN1bHRfd2lkdGgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbGliLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZhNDczCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbGliLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFCS8qIEZvciBDUFVfWkVSTyBldGMuICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAibGliLmgiCisKKworaW50IHBpY2tfb25saW5lX2NwdSh2b2lkKQoreworCWNwdV9zZXRfdCBtYXNrOworCWludCBjcHU7CisKKwlDUFVfWkVSTygmbWFzayk7CisKKwlpZiAoc2NoZWRfZ2V0YWZmaW5pdHkoMCwgc2l6ZW9mKG1hc2spLCAmbWFzaykpIHsKKwkJcGVycm9yKCJzY2hlZF9nZXRhZmZpbml0eSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogV2UgcHJlZmVyIGEgcHJpbWFyeSB0aHJlYWQsIGJ1dCBza2lwIDAgKi8KKwlmb3IgKGNwdSA9IDg7IGNwdSA8IENQVV9TRVRTSVpFOyBjcHUgKz0gOCkKKwkJaWYgKENQVV9JU1NFVChjcHUsICZtYXNrKSkKKwkJCXJldHVybiBjcHU7CisKKwkvKiBTZWFyY2ggZm9yIGFueXRoaW5nLCBidXQgaW4gcmV2ZXJzZSAqLworCWZvciAoY3B1ID0gQ1BVX1NFVFNJWkUgLSAxOyBjcHUgPj0gMDsgY3B1LS0pCisJCWlmIChDUFVfSVNTRVQoY3B1LCAmbWFzaykpCisJCQlyZXR1cm4gY3B1OworCisJcHJpbnRmKCJObyBjcHVzIGluIGFmZmluaXR5IG1hc2s/IVxuIik7CisJcmV0dXJuIC0xOworfQorCitpbnQgYmluZF90b19jcHUoaW50IGNwdSkKK3sKKwljcHVfc2V0X3QgbWFzazsKKworCXByaW50ZigiQmluZGluZyB0byBjcHUgJWRcbiIsIGNwdSk7CisKKwlDUFVfWkVSTygmbWFzayk7CisJQ1BVX1NFVChjcHUsICZtYXNrKTsKKworCXJldHVybiBzY2hlZF9zZXRhZmZpbml0eSgwLCBzaXplb2YobWFzayksICZtYXNrKTsKK30KKworI2RlZmluZSBQQVJFTlRfVE9LRU4JMHhBQQorI2RlZmluZSBDSElMRF9UT0tFTgkweDU1CisKK2ludCBzeW5jX3dpdGhfY2hpbGQodW5pb24gcGlwZSByZWFkX3BpcGUsIHVuaW9uIHBpcGUgd3JpdGVfcGlwZSkKK3sKKwljaGFyIGMgPSBQQVJFTlRfVE9LRU47CisKKwlGQUlMX0lGKHdyaXRlKHdyaXRlX3BpcGUud3JpdGVfZmQsICZjLCAxKSAhPSAxKTsKKwlGQUlMX0lGKHJlYWQocmVhZF9waXBlLnJlYWRfZmQsICZjLCAxKSAhPSAxKTsKKwlpZiAoYyAhPSBDSElMRF9UT0tFTikgLyogc29tZXRpbWVzIGV4cGVjdGVkICovCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3YWl0X2Zvcl9wYXJlbnQodW5pb24gcGlwZSByZWFkX3BpcGUpCit7CisJY2hhciBjOworCisJRkFJTF9JRihyZWFkKHJlYWRfcGlwZS5yZWFkX2ZkLCAmYywgMSkgIT0gMSk7CisJRkFJTF9JRihjICE9IFBBUkVOVF9UT0tFTik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5vdGlmeV9wYXJlbnQodW5pb24gcGlwZSB3cml0ZV9waXBlKQoreworCWNoYXIgYyA9IENISUxEX1RPS0VOOworCisJRkFJTF9JRih3cml0ZSh3cml0ZV9waXBlLndyaXRlX2ZkLCAmYywgMSkgIT0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5vdGlmeV9wYXJlbnRfb2ZfZXJyb3IodW5pb24gcGlwZSB3cml0ZV9waXBlKQoreworCWNoYXIgYyA9IH5DSElMRF9UT0tFTjsKKworCUZBSUxfSUYod3JpdGUod3JpdGVfcGlwZS53cml0ZV9mZCwgJmMsIDEpICE9IDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3YWl0X2Zvcl9jaGlsZChwaWRfdCBjaGlsZF9waWQpCit7CisJaW50IHJjOworCisJaWYgKHdhaXRwaWQoY2hpbGRfcGlkLCAmcmMsIDApID09IC0xKSB7CisJCXBlcnJvcigid2FpdHBpZCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoV0lGRVhJVEVEKHJjKSkKKwkJcmMgPSBXRVhJVFNUQVRVUyhyYyk7CisJZWxzZQorCQlyYyA9IDE7IC8qIFNpZ25hbCBvciBvdGhlciAqLworCisJcmV0dXJuIHJjOworfQorCitpbnQga2lsbF9jaGlsZF9hbmRfd2FpdChwaWRfdCBjaGlsZF9waWQpCit7CisJa2lsbChjaGlsZF9waWQsIFNJR1RFUk0pOworCisJcmV0dXJuIHdhaXRfZm9yX2NoaWxkKGNoaWxkX3BpZCk7Cit9CisKK3N0YXRpYyBpbnQgZWF0X2NwdV9jaGlsZCh1bmlvbiBwaXBlIHJlYWRfcGlwZSwgdW5pb24gcGlwZSB3cml0ZV9waXBlKQoreworCXZvbGF0aWxlIGludCBpID0gMDsKKworCS8qCisJICogV2UgYXJlIGp1c3QgaGVyZSB0byBlYXQgY3B1IGFuZCBkaWUuIFNvIG1ha2Ugc3VyZSB3ZSBjYW4gYmUga2lsbGVkLAorCSAqIGFuZCBhbHNvIGRvbid0IGRvIGFueSBjdXN0b20gU0lHVEVSTSBoYW5kbGluZy4KKwkgKi8KKwlzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7CisKKwlub3RpZnlfcGFyZW50KHdyaXRlX3BpcGUpOworCXdhaXRfZm9yX3BhcmVudChyZWFkX3BpcGUpOworCisJLyogU29hayB1cCBjcHUgZm9yZXZlciAqLworCXdoaWxlICgxKSBpKys7CisKKwlyZXR1cm4gMDsKK30KKworcGlkX3QgZWF0X2NwdShpbnQgKHRlc3RfZnVuY3Rpb24pKHZvaWQpKQoreworCXVuaW9uIHBpcGUgcmVhZF9waXBlLCB3cml0ZV9waXBlOworCWludCBjcHUsIHJjOworCXBpZF90IHBpZDsKKworCWNwdSA9IHBpY2tfb25saW5lX2NwdSgpOworCUZBSUxfSUYoY3B1IDwgMCk7CisJRkFJTF9JRihiaW5kX3RvX2NwdShjcHUpKTsKKworCWlmIChwaXBlKHJlYWRfcGlwZS5mZHMpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocGlwZSh3cml0ZV9waXBlLmZkcykgPT0gLTEpCisJCXJldHVybiAtMTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApCisJCWV4aXQoZWF0X2NwdV9jaGlsZCh3cml0ZV9waXBlLCByZWFkX3BpcGUpKTsKKworCWlmIChzeW5jX3dpdGhfY2hpbGQocmVhZF9waXBlLCB3cml0ZV9waXBlKSkgeworCQlyYyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGYoIm1haW4gdGVzdCBydW5uaW5nIGFzIHBpZCAlZFxuIiwgZ2V0cGlkKCkpOworCisJcmMgPSB0ZXN0X2Z1bmN0aW9uKCk7CitvdXQ6CisJa2lsbChwaWQsIFNJR0tJTEwpOworCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgYWRkcl9yYW5nZSBsaWJjLCB2ZHNvOworCitpbnQgcGFyc2VfcHJvY19tYXBzKHZvaWQpCit7CisJY2hhciBleGVjdXRlLCBuYW1lWzEyOF07CisJdWludDY0X3Qgc3RhcnQsIGVuZDsKKwlGSUxFICpmOworCWludCByYzsKKworCWYgPSBmb3BlbigiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKKwlpZiAoIWYpIHsKKwkJcGVycm9yKCJmb3BlbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZG8geworCQkvKiBUaGlzIHNraXBzIGxpbmUgd2l0aCBubyBleGVjdXRhYmxlIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCAqLworCQlyYyA9IGZzY2FuZihmLCAiJWx4LSVseCAlKmMlKmMlYyUqYyAlKnggJSpkOiUqZCAlKmQgJTEyN3NcbiIsCisJCQkgICAgJnN0YXJ0LCAmZW5kLCAmZXhlY3V0ZSwgbmFtZSk7CisJCWlmIChyYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGV4ZWN1dGUgIT0gJ3gnKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cnN0cihuYW1lLCAibGliYyIpKSB7CisJCQlsaWJjLmZpcnN0ID0gc3RhcnQ7CisJCQlsaWJjLmxhc3QgPSBlbmQgLSAxOworCQl9IGVsc2UgaWYgKHN0cnN0cihuYW1lLCAiW3Zkc29dIikpIHsKKwkJCXZkc28uZmlyc3QgPSBzdGFydDsKKwkJCXZkc28ubGFzdCA9IGVuZCAtIDE7CisJCX0KKwl9IHdoaWxlKDEpOworCisJZmNsb3NlKGYpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUEFSQU5PSURfUEFUSAkiL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkIgorCitib29sIHJlcXVpcmVfcGFyYW5vaWFfYmVsb3coaW50IGxldmVsKQoreworCXVuc2lnbmVkIGxvbmcgY3VycmVudDsKKwljaGFyICplbmQsIGJ1ZlsxNl07CisJRklMRSAqZjsKKwlpbnQgcmM7CisKKwlyYyA9IC0xOworCisJZiA9IGZvcGVuKFBBUkFOT0lEX1BBVEgsICJyIik7CisJaWYgKCFmKSB7CisJCXBlcnJvcigiZm9wZW4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQlwcmludGYoIkNvdWxkbid0IHJlYWQgIiBQQVJBTk9JRF9QQVRIICI/XG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJY3VycmVudCA9IHN0cnRvdWwoYnVmLCAmZW5kLCAxMCk7CisKKwlpZiAoZW5kID09IGJ1ZikgeworCQlwcmludGYoIkNvdWxkbid0IHBhcnNlICIgUEFSQU5PSURfUEFUSCAiP1xuIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmIChjdXJyZW50ID49IGxldmVsKQorCQlnb3RvIG91dDsKKworCXJjID0gMDsKK291dF9jbG9zZToKKwlmY2xvc2UoZik7CitvdXQ6CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbGliLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVkNzJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbGliLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycC4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICovCisKKyNpZm5kZWYgX19TRUxGVEVTVFNfUE9XRVJQQ19QTVVfTElCX0gKKyNkZWZpbmUgX19TRUxGVEVTVFNfUE9XRVJQQ19QTVVfTElCX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VuaW9uIHBpcGUgeworCXN0cnVjdCB7CisJCWludCByZWFkX2ZkOworCQlpbnQgd3JpdGVfZmQ7CisJfTsKKwlpbnQgZmRzWzJdOworfTsKKworZXh0ZXJuIGludCBwaWNrX29ubGluZV9jcHUodm9pZCk7CitleHRlcm4gaW50IGJpbmRfdG9fY3B1KGludCBjcHUpOworZXh0ZXJuIGludCBraWxsX2NoaWxkX2FuZF93YWl0KHBpZF90IGNoaWxkX3BpZCk7CitleHRlcm4gaW50IHdhaXRfZm9yX2NoaWxkKHBpZF90IGNoaWxkX3BpZCk7CitleHRlcm4gaW50IHN5bmNfd2l0aF9jaGlsZCh1bmlvbiBwaXBlIHJlYWRfcGlwZSwgdW5pb24gcGlwZSB3cml0ZV9waXBlKTsKK2V4dGVybiBpbnQgd2FpdF9mb3JfcGFyZW50KHVuaW9uIHBpcGUgcmVhZF9waXBlKTsKK2V4dGVybiBpbnQgbm90aWZ5X3BhcmVudCh1bmlvbiBwaXBlIHdyaXRlX3BpcGUpOworZXh0ZXJuIGludCBub3RpZnlfcGFyZW50X29mX2Vycm9yKHVuaW9uIHBpcGUgd3JpdGVfcGlwZSk7CitleHRlcm4gcGlkX3QgZWF0X2NwdShpbnQgKHRlc3RfZnVuY3Rpb24pKHZvaWQpKTsKK2V4dGVybiBib29sIHJlcXVpcmVfcGFyYW5vaWFfYmVsb3coaW50IGxldmVsKTsKKworc3RydWN0IGFkZHJfcmFuZ2UgeworCXVpbnQ2NF90IGZpcnN0LCBsYXN0OworfTsKKworZXh0ZXJuIHN0cnVjdCBhZGRyX3JhbmdlIGxpYmMsIHZkc287CisKK2ludCBwYXJzZV9wcm9jX21hcHModm9pZCk7CisKKyNlbmRpZiAvKiBfX1NFTEZURVNUU19QT1dFUlBDX1BNVV9MSUJfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbG9vcC5TIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvbG9vcC5TCmluZGV4IDg4MjBlM2QuLjIwYzFmMDggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2xvb3AuUworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9sb29wLlMKQEAgLTMsNDQgKzMsNDEgQEAKICAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLgogICovCiAKKyNpbmNsdWRlIDxwcGMtYXNtLmg+CisKIAkudGV4dAogCi0JLmdsb2JhbCB0aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3AKLQkudHlwZSAudGhpcnR5X3R3b19pbnN0cnVjdGlvbl9sb29wLEBmdW5jdGlvbgotCS5zZWN0aW9uICIub3BkIiwiYXciLEBwcm9nYml0cwotdGhpcnR5X3R3b19pbnN0cnVjdGlvbl9sb29wOgotCS5xdWFkIC50aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3AsIC5UT0MuQHRvY2Jhc2UsIDAKLQkucHJldmlvdXMKLS50aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3A6Ci0JY21wd2kJJXIzLDAKK0ZVTkNfU1RBUlQodGhpcnR5X3R3b19pbnN0cnVjdGlvbl9sb29wKQorCWNtcGRpCXIzLDAKIAliZXFscgotCWFkZGkJJXI0LCVyMywxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCi0JYWRkaQklcjQsJXI0LDEKLQlhZGRpCSVyNCwlcjQsMQotCWFkZGkJJXI0LCVyNCwxCSMgMjggYWRkaSdzCi0Jc3ViaQklcjMsJXIzLDEKLQliCS50aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3AKKwlhZGRpCXI0LHIzLDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEKKwlhZGRpCXI0LHI0LDEJIyAyOCBhZGRpJ3MKKwlzdWJpCXIzLHIzLDEKKwliCUZVTkNfTkFNRSh0aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3ApCitGVU5DX0VORCh0aGlydHlfdHdvX2luc3RydWN0aW9uX2xvb3ApCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3N1YnVuaXQuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc3VidW5pdC5oCmluZGV4IDk4YTIyOTIuLjljNmM0ZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc3VidW5pdC5oCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc3VidW5pdC5oCkBAIC0yNiw2ICsyNiwxMSBAQAogCXByaW50ZigiZXJyb3I6ICVzXG4iLCBuYW1lKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHRlc3Rfc2tpcChjaGFyICpuYW1lKQoreworCXByaW50Zigic2tpcDogJXNcbiIsIG5hbWUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9zdWNjZXNzKGNoYXIgKm5hbWUpCiB7CiAJcHJpbnRmKCJzdWNjZXNzOiAlc1xuIiwgbmFtZSk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI2N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACitQUk9HUyA6PSB0bS1yZXNjaGVkLWRzY3IKKworYWxsOiAkKFBST0dTKQorCiskKFBST0dTKToKKworcnVuX3Rlc3RzOiBhbGwKKwlALWZvciBQUk9HIGluICQoUFJPR1MpOyBkbyBcCisJCS4vJCRQUk9HOyBcCisJZG9uZTsKKworY2xlYW46CisJcm0gLWYgJChQUk9HUykgKi5vCisKKy5QSE9OWTogYWxsIHJ1bl90ZXN0cyBjbGVhbgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS90bS1yZXNjaGVkLWRzY3IuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tcmVzY2hlZC1kc2NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5OGUzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tcmVzY2hlZC1kc2NyLmMKQEAgLTAsMCArMSw5MCBAQAorLyogVGVzdCBjb250ZXh0IHN3aXRjaGluZyB0byBzZWUgaWYgdGhlIERTQ1IgU1BSIGlzIGNvcnJlY3RseSBwcmVzZXJ2ZWQKKyAqIHdoZW4gd2l0aGluIGEgdHJhbnNhY3Rpb24uCisgKgorICogTm90ZTogV2UgYXNzdW1lIHRoYXQgdGhlIERTQ1IgaGFzIGJlZW4gbGVmdCBhdCB0aGUgZGVmYXVsdCB2YWx1ZSAoMCkKKyAqIGZvciBhbGwgQ1BVcy4KKyAqCisgKiBNZXRob2Q6CisgKgorICogU2V0IGEgdmFsdWUgaW50byB0aGUgRFNDUi4KKyAqCisgKiBTdGFydCBhIHRyYW5zYWN0aW9uLCBhbmQgc3VzcGVuZCBpdCAoKikuCisgKgorICogSGFyZCBsb29wIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGJlY29tZSBkb29tZWQuCisgKgorICogTm93IHRoYXQgd2UgKm1heSogaGF2ZSBiZWVuIHByZWVtcHRlZCwgcmVjb3JkIHRoZSBEU0NSIGFuZCBURVhBU1IgU1BSUy4KKyAqCisgKiBJZiB0aGUgYWJvcnQgd2FzIGJlY2F1c2Ugb2YgYSBjb250ZXh0IHN3aXRjaCwgY2hlY2sgdGhlIERTQ1IgdmFsdWUuCisgKiBPdGhlcndpc2UsIHRyeSBhZ2Fpbi4KKyAqCisgKiAoKikgSWYgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBzdXNwZW5kZWQgd2UgY2FuJ3Qgc2VlIHRoZSBwcm9ibGVtIGJlY2F1c2UKKyAqIHRoZSB0cmFuc2FjdGlvbiBhYm9ydCBoYW5kbGVyIHdpbGwgcmVzdG9yZSB0aGUgRFNDUiB0byBpdCdzIGNoZWNrcG9pbnRlZAorICogdmFsdWUgYmVmb3JlIHdlIHJlZ2FpbiBjb250cm9sLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8YXNtL3RtLmg+CisKKyNkZWZpbmUgVEJFR0lOICAgICAgICAgICIubG9uZyAweDdDMDAwNTFEIDsiCisjZGVmaW5lIFRFTkQgICAgICAgICAgICAiLmxvbmcgMHg3QzAwMDU1RCA7IgorI2RlZmluZSBUQ0hFQ0sgICAgICAgICAgIi5sb25nIDB4N0MwMDA1OUMgOyIKKyNkZWZpbmUgVFNVU1BFTkQgICAgICAgICIubG9uZyAweDdDMDAwNUREIDsiCisjZGVmaW5lIFRSRVNVTUUgICAgICAgICAiLmxvbmcgMHg3QzIwMDVERCA7IgorI2RlZmluZSBTUFJOX1RFWEFTUiAgICAgMHg4MgorI2RlZmluZSBTUFJOX0RTQ1IgICAgICAgMHgwMworCitpbnQgbWFpbih2b2lkKSB7CisJdWludDY0X3QgcnYsIGRzY3IxID0gMSwgZHNjcjIsIHRleGFzcjsKKworCXByaW50ZigiQ2hlY2sgRFNDUiBUTSBjb250ZXh0IHN3aXRjaDogIik7CisJZmZsdXNoKHN0ZG91dCk7CisJZm9yICg7OykgeworCQlydiA9IDE7CisJCWFzbSBfX3ZvbGF0aWxlX18gKAorCQkJLyogc2V0IGEga25vd24gdmFsdWUgaW50byB0aGUgRFNDUiAqLworCQkJImxkICAgICAgMywgJVtkc2NyMV07IgorCQkJIm10c3ByICAgJVtzcHJuX2RzY3JdLCAzOyIKKworCQkJLyogc3RhcnQgYW5kIHN1c3BlbmQgYSB0cmFuc2FjdGlvbiAqLworCQkJVEJFR0lOCisJCQkiYmVxICAgICAxZjsiCisJCQlUU1VTUEVORAorCisJCQkvKiBoYXJkIGxvb3AgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGJlY29tZXMgZG9vbWVkICovCisJCQkiMjogOyIKKwkJCVRDSEVDSworCQkJImJjICAgICAgNCwgMCwgMmI7IgorCisJCQkvKiByZWNvcmQgRFNDUiBhbmQgVEVYQVNSICovCisJCQkibWZzcHIgICAzLCAlW3Nwcm5fZHNjcl07IgorCQkJInN0ZCAgICAgMywgJVtkc2NyMl07IgorCQkJIm1mc3ByICAgMywgJVtzcHJuX3RleGFzcl07IgorCQkJInN0ZCAgICAgMywgJVt0ZXhhc3JdOyIKKworCQkJVFJFU1VNRQorCQkJVEVORAorCQkJImxpICAgICAgJVtydl0sIDA7IgorCQkJIjE6IDsiCisJCQk6IFtydl0iPXIiKHJ2KSwgW2RzY3IyXSI9bSIoZHNjcjIpLCBbdGV4YXNyXSI9bSIodGV4YXNyKQorCQkJOiBbZHNjcjFdIm0iKGRzY3IxKQorCQkJLCBbc3Bybl9kc2NyXSJpIihTUFJOX0RTQ1IpLCBbc3Bybl90ZXhhc3JdImkiKFNQUk5fVEVYQVNSKQorCQkJOiAibWVtb3J5IiwgInIzIgorCQkpOworCQlhc3NlcnQocnYpOyAvKiBtYWtlIHN1cmUgdGhlIHRyYW5zYWN0aW9uIGFib3J0ZWQgKi8KKwkJaWYgKCh0ZXhhc3IgPj4gNTYpICE9IFRNX0NBVVNFX1JFU0NIRUQpIHsKKwkJCXB1dGNoYXIoJy4nKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGRzY3IyICE9IGRzY3IxKSB7CisJCQlwcmludGYoIiBGQUlMXG4iKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIE9LXG4iKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaAppbmRleCAwZGUwNjQ0Li5hOTM3NzdhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3V0aWxzLmgKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy91dGlscy5oCkBAIC0zMSw2ICszMSwxOCBAQAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorLyogVGhlIHRlc3QgaGFybmVzcyB1c2VzIHRoaXMsIHllcyBpdCdzIGdyb3NzICovCisjZGVmaW5lIE1BR0lDX1NLSVBfUkVUVVJOX1ZBTFVFCTk5CisKKyNkZWZpbmUgU0tJUF9JRih4KQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoKHgpKSB7CQkJCQkJXAorCQlmcHJpbnRmKHN0ZGVyciwJCQkJCVwKKwkJIltTS0lQXSBUZXN0IHNraXBwZWQgb24gbGluZSAlZFxuIiwgX19MSU5FX18pOwlcCisJCXJldHVybiBNQUdJQ19TS0lQX1JFVFVSTl9WQUxVRTsJCQlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIF9zdHIocykgI3MKICNkZWZpbmUgc3RyKHMpIF9zdHIocykKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggYzg2YmUwZi4uNGI2YzAxYiAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xNzE0LDExICsxNzE0LDExIEBACiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fdmNwdV9raWNrKTsKICNlbmRpZiAvKiAhQ09ORklHX1MzOTAgKi8KIAotYm9vbCBrdm1fdmNwdV95aWVsZF90byhzdHJ1Y3Qga3ZtX3ZjcHUgKnRhcmdldCkKK2ludCBrdm1fdmNwdV95aWVsZF90byhzdHJ1Y3Qga3ZtX3ZjcHUgKnRhcmdldCkKIHsKIAlzdHJ1Y3QgcGlkICpwaWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gTlVMTDsKLQlib29sIHJldCA9IGZhbHNlOworCWludCByZXQgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXBpZCA9IHJjdV9kZXJlZmVyZW5jZSh0YXJnZXQtPnBpZCk7Cg==